ZGlmZiAtLWdpdCBhL2F1dG8vY2MvZ2NjIGIvYXV0by9jYy9nY2MKaW5kZXggNWM1ZjYxYy4uMjFhNzM0MCAxMDA2NDQKLS0tIGEvYXV0by9jYy9nY2MKKysrIGIvYXV0by9jYy9nY2MKQEAgLTE3MiwzICsxNzIsNSBAQAogaWYgWyAiLiRDUFAiID0gIi4iIF07IHRoZW4KICAgICBDUFA9IiRDQyAtRSIKIGZpCisKK05HWF9QRVJMX0NGTEFHUz0iJENGTEFHUyIKZGlmZiAtLWdpdCBhL2F1dG8vaW5zdGFsbCBiL2F1dG8vaW5zdGFsbAppbmRleCA1NWY4NjhhLi4wNzUzNWI3IDEwMDY0NAotLS0gYS9hdXRvL2luc3RhbGwKKysrIGIvYXV0by9pbnN0YWxsCkBAIC0yLDkgKzIsMjMgQEAKICMgQ29weXJpZ2h0IChDKSBJZ29yIFN5c29ldgogCiAKK2lmIFsgJFVTRV9QRVJMID0gWUVTIF07IHRoZW4KKworICAgIGNhdCA8PCBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAkTkdYX01BS0VGSUxFCisKK2luc3RhbGxfcGVybF9tb2R1bGVzOgorCWNkICROR1hfT0JKUy9zcmMvaHR0cC9tb2R1bGVzL3BlcmwgJiYgbWFrZSBpbnN0YWxsCitFTkQKKworICAgIE5HWF9JTlNUQUxMX1BFUkxfTU9EVUxFUz1pbnN0YWxsX3BlcmxfbW9kdWxlcworCitmaQorCisKIGNhdCA8PCBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJE5HWF9NQUtFRklMRQogCi1pbnN0YWxsOgkkTkdYX09CSlMke25neF9kaXJzZXB9bmdpbngke25neF9iaW5leHR9CitpbnN0YWxsOgkkTkdYX09CSlMke25neF9kaXJzZXB9bmdpbngke25neF9iaW5leHR9CVwKKwkJJE5HWF9JTlNUQUxMX1BFUkxfTU9EVUxFUwogCXRlc3QgLWQgJyROR1hfUFJFRklYJyB8fCBta2RpciAtcCAnJE5HWF9QUkVGSVgnCiAKIAl0ZXN0IC1kICdgZGlybmFtZSAiJE5HWF9TQklOX1BBVEgiYCcgXApkaWZmIC0tZ2l0IGEvYXV0by9saWIvY29uZiBiL2F1dG8vbGliL2NvbmYKaW5kZXggNzAwNTNiNS4uNjJkNjAyOSAxMDA2NDQKLS0tIGEvYXV0by9saWIvY29uZgorKysgYi9hdXRvL2xpYi9jb25mCkBAIC0yNiwzICsyNiw3IEBACiBpZiBbICRVU0VfWkxJQiA9IFlFUyBdOyB0aGVuCiAgICAgLiBhdXRvL2xpYi96bGliL2NvbmYKIGZpCisKK2lmIFsgJFVTRV9QRVJMID0gWUVTIF07IHRoZW4KKyAgICAuIGF1dG8vbGliL3BlcmwvY29uZgorZmkKZGlmZiAtLWdpdCBhL2F1dG8vbGliL21ha2UgYi9hdXRvL2xpYi9tYWtlCmluZGV4IGVmNTcxYzUuLjYwY2Q3YmMgMTAwNjQ0Ci0tLSBhL2F1dG8vbGliL21ha2UKKysrIGIvYXV0by9saWIvbWFrZQpAQCAtMTcsMyArMTcsNyBAQAogaWYgWyAkWkxJQiAhPSBOT05FIC1hICRaTElCICE9IE5PIC1hICRaTElCICE9IFlFUyBdOyB0aGVuCiAgICAgLiBhdXRvL2xpYi96bGliL21ha2UKIGZpCisKK2lmIFsgJFVTRV9QRVJMID0gWUVTIF07IHRoZW4KKyAgICAuIGF1dG8vbGliL3BlcmwvbWFrZQorZmkKZGlmZiAtLWdpdCBhL2F1dG8vbGliL3BlcmwvY29uZiBiL2F1dG8vbGliL3BlcmwvY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDdmZTNiCi0tLSAvZGV2L251bGwKKysrIGIvYXV0by9saWIvcGVybC9jb25mCkBAIC0wLDAgKzEsNTMgQEAKKworIyBDb3B5cmlnaHQgKEMpIElnb3IgU3lzb2V2CisKKworZWNobyAiY2hlY2tpbmcgZm9yIHBlcmwiCisKKworTkdYX1BFUkxfVkVSPWAkTkdYX1BFUkwgLXYgMj4mMSB8IGdyZXAgJ15UaGlzIGlzIHBlcmwnIDI+JjEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNlZCAtZSAncy9eVGhpcyBpcyBwZXJsLCBcKC4qXCkvXDEvJ2AKKworaWYgdGVzdCAtbiAiJE5HWF9QRVJMX1ZFUiI7IHRoZW4KKyAgICBlY2hvICIgKyBwZXJsIHZlcnNpb246ICROR1hfUEVSTF9WRVIiCisKKyAgICBpZiBbICJgZWNobyAndXNlIDUuMDA2MDAxOyBwcmludCAiT0siJyB8ICROR1hfUEVSTCAyPiYxYCIgIT0gT0sgXTsgdGhlbgorICAgICAgICBlY2hvCisgICAgICAgIGVjaG8gIiQwOiBlcnJvcjogcGVybCA1LjYuMSBvciBoaWdoZXIgaXMgcmVxdWlyZWQiCisgICAgICAgIGVjaG8KKworICAgICAgICBleGl0IDE7CisgICAgZmkKKworICAgIENGTEFHUz0iJENGTEFHUyBgJE5HWF9QRVJMIC1NRXh0VXRpbHM6OkVtYmVkIC1lIGNjb3B0c2AiCisgICAgbmd4X3BlcmxfbGRvcHRzPWAkTkdYX1BFUkwgLU1FeHRVdGlsczo6RW1iZWQgLWUgbGRvcHRzYAorCisgICAgaWYgJE5HWF9QRVJMIC1WOnVzZW11bHRpcGxpY2l0eSB8IGdyZXAgZGVmaW5lID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIGhhdmU9TkdYX0hBVkVfUEVSTF9NVUxUSVBMSUNJVFkgLiBhdXRvL2hhdmUKKyAgICAgICAgZWNobyAiICsgcGVybCBpbnRlcnByZXRlciBtdWx0aXBsaWNpdHkgZm91bmQiCisgICAgZmkKKworICAgIGlmICROR1hfUEVSTCAtVjp1c2VpdGhyZWFkcyB8IGdyZXAgZGVmaW5lID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIGhhdmU9TkdYX0hBVkVfUEVSTF9DTE9ORSAuIGF1dG8vaGF2ZQorICAgICAgICBlY2hvICIgKyBwZXJsX2Nsb25lKCkgZm91bmQiCisKKyAgICBlbHNlCisgICAgICAgICMgRnJlZUJTRCBwb3J0IHdhbnRzIHRvIGxpbmsgd2l0aCAtcHRocmVhZCBub24tdGhyZWFkZWQgcGVybAorICAgICAgICBuZ3hfcGVybF9sZG9wdHM9YGVjaG8gJG5neF9wZXJsX2xkb3B0cyB8IHNlZCAncy8gLXB0aHJlYWQvLydgCisgICAgZmkKKworICAgIENPUkVfTElOSz0iJENPUkVfTElOSyAkbmd4X3BlcmxfbGRvcHRzIgorICAgIExJTktfREVQUz0iJExJTktfREVQUyAkTkdYX09CSlMvc3JjL2h0dHAvbW9kdWxlcy9wZXJsL2JsaWIvYXJjaC9hdXRvL25naW54L25naW54LnNvIgorCisgICAgaWYgdGVzdCAtbiAiJE5HWF9QRVJMX01PRFVMRVMiOyB0aGVuCisgICAgICAgIGhhdmU9TkdYX1BFUkxfTU9EVUxFUyB2YWx1ZT0iKHVfY2hhciAqKSBcIiROR1hfUEVSTF9NT0RVTEVTXCIiCisgICAgICAgIC4gYXV0by9kZWZpbmUKKyAgICBmaQorCitlbHNlCisgICAgZWNobworICAgIGVjaG8gIiQwOiBlcnJvcjogcGVybCA1LjYuMSBvciBoaWdoZXIgaXMgcmVxdWlyZWQiCisgICAgZWNobworCisgICAgZXhpdCAxOworZmkKZGlmZiAtLWdpdCBhL2F1dG8vbGliL3BlcmwvbWFrZSBiL2F1dG8vbGliL3BlcmwvbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjU0NDIyCi0tLSAvZGV2L251bGwKKysrIGIvYXV0by9saWIvcGVybC9tYWtlCkBAIC0wLDAgKzEsMzMgQEAKKworIyBDb3B5cmlnaHQgKEMpIElnb3IgU3lzb2V2CisKKworY2F0IDw8IEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAkTkdYX01BS0VGSUxFCisKKyROR1hfT0JKUy9zcmMvaHR0cC9tb2R1bGVzL3BlcmwvYmxpYi9hcmNoL2F1dG8vbmdpbngvbmdpbnguc286CQlcCisJCXNyYy9odHRwL21vZHVsZXMvcGVybC9uZ2lueC5wbQkJCQlcCisJCXNyYy9odHRwL21vZHVsZXMvcGVybC9uZ2lueC54cwkJCQlcCisJCXNyYy9odHRwL21vZHVsZXMvcGVybC9uZ3hfaHR0cF9wZXJsX21vZHVsZS5oCQlcCisJCSROR1hfT0JKUy9zcmMvaHR0cC9tb2R1bGVzL3BlcmwvTWFrZWZpbGUKKworCWNwIC1wIHNyYy9odHRwL21vZHVsZXMvcGVybC9uZ2lueC4qICROR1hfT0JKUy9zcmMvaHR0cC9tb2R1bGVzL3BlcmwvCisKKwljZCAkTkdYX09CSlMvc3JjL2h0dHAvbW9kdWxlcy9wZXJsICYmIG1ha2UKKworCiskTkdYX09CSlMvc3JjL2h0dHAvbW9kdWxlcy9wZXJsL01ha2VmaWxlOiBzcmMvaHR0cC9tb2R1bGVzL3BlcmwvTWFrZWZpbGUuUEwKKworCWNwIC1wIHNyYy9odHRwL21vZHVsZXMvcGVybC9uZ2lueC4qICROR1hfT0JKUy9zcmMvaHR0cC9tb2R1bGVzL3BlcmwvCisJY3AgLXAgc3JjL2h0dHAvbW9kdWxlcy9wZXJsL3R5cGVtYXAgJE5HWF9PQkpTL3NyYy9odHRwL21vZHVsZXMvcGVybC8KKwljcCAtcCBzcmMvaHR0cC9tb2R1bGVzL3BlcmwvTWFrZWZpbGUuUEwgJE5HWF9PQkpTL3NyYy9odHRwL21vZHVsZXMvcGVybC8KKworCWNkICROR1hfT0JKUy9zcmMvaHR0cC9tb2R1bGVzL3BlcmwJCQkJXAorCQkmJiBOR1hfUEVSTF9DRkxBR1M9IiROR1hfUEVSTF9DRkxBR1MiCQkJXAorCQkJTkdYX1BDUkU9JFBDUkUJCQkJCVwKKwkJCU5HWF9aTElCPSRaTElCCQkJCQlcCisJCQlOR1hfT0JKUz0kTkdYX09CSlMJCQkJXAorCQkkTkdYX1BFUkwgTWFrZWZpbGUuUEwJCQkJCVwKKwkJCUxJQj0kTkdYX1BFUkxfTU9EVUxFUworCisKK0VORApkaWZmIC0tZ2l0IGEvYXV0by9tYWtlIGIvYXV0by9tYWtlCmluZGV4IGU1YzVlZmIuLjMwMzE2NTMgMTAwNjQ0Ci0tLSBhL2F1dG8vbWFrZQorKysgYi9hdXRvL21ha2UKQEAgLTUsNyArNSw3IEBACiBta2RpciAtcCAkTkdYX09CSlMvc3JjL2NvcmUgJE5HWF9PQkpTL3NyYy9ldmVudCAkTkdYX09CSlMvc3JjL2V2ZW50L21vZHVsZXMgXAogICAgICAgICAgJE5HWF9PQkpTL3NyYy9vcy91bml4ICROR1hfT0JKUy9zcmMvb3Mvd2luMzIgXAogICAgICAgICAgJE5HWF9PQkpTL3NyYy9odHRwICROR1hfT0JKUy9zcmMvaHR0cC9tb2R1bGVzIFwKLQkgJE5HWF9PQkpTL3NyYy9odHRwL21vZHVsZXMvcHJveHkgXAorCSAkTkdYX09CSlMvc3JjL2h0dHAvbW9kdWxlcy9wZXJsIFwKICAgICAgICAgICROR1hfT0JKUy9zcmMvaW1hcAogCiAKZGlmZiAtLWdpdCBhL2F1dG8vbW9kdWxlcyBiL2F1dG8vbW9kdWxlcwppbmRleCA4YTY3NDE0Li5lZjNhMzVkIDEwMDY0NAotLS0gYS9hdXRvL21vZHVsZXMKKysrIGIvYXV0by9tb2R1bGVzCkBAIC0xOTEsNyArMTkxLDYgQEAKICAgICBoYXZlPU5HWF9IVFRQX1BST1hZIC4gYXV0by9oYXZlCiAgICAgI1VTRV9NRDU9WUVTCiAgICAgSFRUUF9NT0RVTEVTPSIkSFRUUF9NT0RVTEVTICRIVFRQX1BST1hZX01PRFVMRSIKLSAgICBIVFRQX0lOQ1M9IiRIVFRQX0lOQ1MgJEhUVFBfUFJPWFlfSU5DUyIKICAgICBIVFRQX0RFUFM9IiRIVFRQX0RFUFMgJEhUVFBfUFJPWFlfREVQUyIKICAgICBIVFRQX1NSQ1M9IiRIVFRQX1NSQ1MgJEhUVFBfUFJPWFlfU1JDUyIKIGZpCkBAIC0yMDEsNiArMjAwLDE1IEBACiAgICAgSFRUUF9TUkNTPSIkSFRUUF9TUkNTICRIVFRQX0ZBU1RDR0lfU1JDUyIKIGZpCiAKK2lmIFsgJEhUVFBfUEVSTCA9IFlFUyBdOyB0aGVuCisgICAgVVNFX1BFUkw9WUVTCisgICAgaGF2ZT1OR1hfSFRUUF9QRVJMIC4gYXV0by9oYXZlCisgICAgSFRUUF9NT0RVTEVTPSIkSFRUUF9NT0RVTEVTICRIVFRQX1BFUkxfTU9EVUxFIgorICAgIEhUVFBfSU5DUz0iJEhUVFBfSU5DUyAkSFRUUF9QRVJMX0lOQ1MiCisgICAgSFRUUF9ERVBTPSIkSFRUUF9ERVBTICRIVFRQX1BFUkxfREVQUyIKKyAgICBIVFRQX1NSQ1M9IiRIVFRQX1NSQ1MgJEhUVFBfUEVSTF9TUkNTIgorZmkKKwogaWYgWyAkSFRUUF9NRU1DQUNIRUQgPSBZRVMgXTsgdGhlbgogICAgIEhUVFBfTU9EVUxFUz0iJEhUVFBfTU9EVUxFUyAkSFRUUF9NRU1DQUNIRURfTU9EVUxFIgogICAgIEhUVFBfU1JDUz0iJEhUVFBfU1JDUyAkSFRUUF9NRU1DQUNIRURfU1JDUyIKZGlmZiAtLWdpdCBhL2F1dG8vb3B0aW9ucyBiL2F1dG8vb3B0aW9ucwppbmRleCBkYTAwZWRmLi42Yjk5MWE5IDEwMDY0NAotLS0gYS9hdXRvL29wdGlvbnMKKysrIGIvYXV0by9vcHRpb25zCkBAIC02Miw2ICs2Miw3IEBACiBIVFRQX1JFV1JJVEU9WUVTCiBIVFRQX1BST1hZPVlFUwogSFRUUF9GQVNUQ0dJPVlFUworSFRUUF9QRVJMPU5PCiBIVFRQX01FTUNBQ0hFRD1ZRVMKIEhUVFBfRU1QVFlfR0lGPVlFUwogCkBAIC05MCw2ICs5MSw5IEBACiBaTElCX09QVD0KIFpMSUJfQVNNPU5PCiAKK1VTRV9QRVJMPU5PCitOR1hfUEVSTD1wZXJsCisKIE5HWF9DUFVfQ0FDSEVfTElORT0KIAogCkBAIC0xNTAsNiArMTU0LDEwIEBACiAgICAgICAgIC0td2l0aG91dC1odHRwX21lbWNhY2hlZF9tb2R1bGUpIEhUVFBfTUVNQ0FDSEVEPU5PICAgICAgICAgIDs7CiAgICAgICAgIC0td2l0aG91dC1odHRwX2VtcHR5X2dpZl9tb2R1bGUpIEhUVFBfRU1QVFlfR0lGPU5PICAgICAgICAgIDs7CiAKKyAgICAgICAgLS13aXRoLWh0dHBfcGVybF9tb2R1bGUpICAgICAgICAgSFRUUF9QRVJMPVlFUyAgICAgICAgICAgICAgOzsKKyAgICAgICAgLS13aXRoLXBlcmxfbW9kdWxlc19wYXRoPSopICAgICAgTkdYX1BFUkxfTU9EVUxFUz0iJHZhbHVlIiAgOzsKKyAgICAgICAgLS13aXRoLXBlcmw9KikgICAgICAgICAgICAgICAgICAgTkdYX1BFUkw9IiR2YWx1ZSIgICAgICAgICAgOzsKKwogICAgICAgICAjIFNUVUIKICAgICAgICAgLS13aXRoLWh0dHBfc3R1Yl9zdGF0dXNfbW9kdWxlKSAgSFRUUF9TVFVCX1NUQVRVUz1ZRVMgICAgICAgOzsKIApAQCAtMjM1LDYgKzI0MywxMCBAQAogICAtLXdpdGhvdXQtaHR0cF9tZW1jYWNoZWRfbW9kdWxlICAgIGRpc2FibGUgbmd4X2h0dHBfbWVtY2FjaGVkX21vZHVsZQogICAtLXdpdGhvdXQtaHR0cF9lbXB0eV9naWZfbW9kdWxlICAgIGRpc2FibGUgbmd4X2h0dHBfZW1wdHlfZ2lmX21vZHVsZQogCisgIC0td2l0aC1odHRwX3BlcmxfbW9kdWxlICAgICAgICAgICAgZW5hYmxlIG5neF9odHRwX3BlcmxfbW9kdWxlCisgIC0td2l0aC1wZXJsX21vZHVsZXNfcGF0aD1QQVRIICAgICAgc2V0IHBhdGggdG8gdGhlIHBlcmwgbW9kdWxlcworICAtLXdpdGgtcGVybD1QQVRIICAgICAgICAgICAgICAgICAgIHNldCBwYXRoIHRvIHRoZSBwZXJsIGJpbmFyeQorCiAgIC0taHR0cC1sb2ctcGF0aD1QQVRIICAgICAgICAgICAgICAgc2V0IHBhdGggdG8gdGhlIGh0dHAgYWNjZXNzIGxvZwogICAtLWh0dHAtY2xpZW50LWJvZHktdGVtcC1wYXRoPVBBVEggIHNldCBwYXRoIHRvIHRoZSBodHRwIGNsaWVudCByZXF1ZXN0IGJvZHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnkgZmlsZXMgcGF0aApAQCAtNDE0LDMgKzQyNiwxNiBAQAogICAgICAgICBOR1hfSFRUUF9GQVNUQ0dJX1RFTVBfUEFUSD0kTkdYX1BSRUZJWC8kTkdYX0hUVFBfRkFTVENHSV9URU1QX1BBVEgKICAgICA7OwogZXNhYworCisKK2Nhc2UgIi4kTkdYX1BFUkxfTU9EVUxFUyIgaW4KKyAgICAuLyopCisgICAgOzsKKworICAgIC4pCisgICAgOzsKKworICAgICopCisgICAgICAgIE5HWF9QRVJMX01PRFVMRVM9JE5HWF9QUkVGSVgvJE5HWF9QRVJMX01PRFVMRVMKKyAgICA7OworZXNhYwpkaWZmIC0tZ2l0IGEvYXV0by9zb3VyY2VzIGIvYXV0by9zb3VyY2VzCmluZGV4IGMzNTJkYTMuLjVmZmJjNmMgMTAwNjQ0Ci0tLSBhL2F1dG8vc291cmNlcworKysgYi9hdXRvL3NvdXJjZXMKQEAgLTM2MCw2ICszNjAsMTIgQEAKIEhUVFBfRkFTVENHSV9TUkNTPXNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGUuYwogCiAKK0hUVFBfUEVSTF9NT0RVTEU9bmd4X2h0dHBfcGVybF9tb2R1bGUKK0hUVFBfUEVSTF9JTkNTPXNyYy9odHRwL21vZHVsZXMvcGVybAorSFRUUF9QRVJMX0RFUFM9c3JjL2h0dHAvbW9kdWxlcy9wZXJsL25neF9odHRwX3BlcmxfbW9kdWxlLmgKK0hUVFBfUEVSTF9TUkNTPXNyYy9odHRwL21vZHVsZXMvcGVybC9uZ3hfaHR0cF9wZXJsX21vZHVsZS5jCisKKwogSFRUUF9NRU1DQUNIRURfTU9EVUxFPW5neF9odHRwX21lbWNhY2hlZF9tb2R1bGUKIEhUVFBfTUVNQ0FDSEVEX1NSQ1M9c3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9tZW1jYWNoZWRfbW9kdWxlLmMKIApkaWZmIC0tZ2l0IGEvZG9jcy94bWwvbmdpbngvY2hhbmdlcy54bWwgYi9kb2NzL3htbC9uZ2lueC9jaGFuZ2VzLnhtbAppbmRleCBjMzBiMWEyLi5lNDg0NWY2IDEwMDY0NAotLS0gYS9kb2NzL3htbC9uZ2lueC9jaGFuZ2VzLnhtbAorKysgYi9kb2NzL3htbC9uZ2lueC9jaGFuZ2VzLnhtbApAQCAtOSw2ICs5LDI5IEBACiA8dGl0bGUgbGFuZz0iZW4iPm5naW54IGNoYW5nZWxvZzwvdGl0bGU+CiAKIAorPGNoYW5nZXMgdmVyPSIwLjMuMjEiIGRhdGU9IjE2LjAxLjIwMDYiPgorCis8Y2hhbmdlIHR5cGU9ImZlYXR1cmUiPgorPHBhcmEgbGFuZz0icnUiPgorzc/E1czYIG5neF9odHRwX3BlcmxfbW9kdWxlLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlIG5neF9odHRwX3BlcmxfbW9kdWxlLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iY2hhbmdlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK8TJ0sXL1MnXwSB2YWxpZF9yZWZlcmVycyDSwdrSxdvBxdQgydPQz8zY2s/XwdTYINLFxsXSxdLZIGPP19PFzSDCxdogVVJJLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICJ2YWxpZF9yZWZlcmVycyIgZGlyZWN0aXZlIGFsbG93cyB0aGUgcmVmZXJyZXJlcyB3aXRob3V0IFVSSSBwYXJ0LgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzwvY2hhbmdlcz4KKworCiA8Y2hhbmdlcyB2ZXI9IjAuMy4yMCIgZGF0ZT0iMTEuMDEuMjAwNiI+CiAKIDxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25naW54LmggYi9zcmMvY29yZS9uZ2lueC5oCmluZGV4IGNiYTRkYmIuLmVjMTI1ZDYgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25naW54LmgKKysrIGIvc3JjL2NvcmUvbmdpbnguaApAQCAtOCw3ICs4LDcgQEAKICNkZWZpbmUgX05HSU5YX0hfSU5DTFVERURfCiAKIAotI2RlZmluZSBOR0lOWF9WRVIgICAgICAgICAgIm5naW54LzAuMy4yMCIKKyNkZWZpbmUgTkdJTlhfVkVSICAgICAgICAgICJuZ2lueC8wLjMuMjEiCiAKICNkZWZpbmUgTkdJTlhfVkFSICAgICAgICAgICJOR0lOWCIKICNkZWZpbmUgTkdYX09MRFBJRF9FWFQgICAgICIub2xkYmluIgpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yZWZlcmVyX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yZWZlcmVyX21vZHVsZS5jCmluZGV4IGQ1YmI4YWEuLjBkM2VlNmYgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmVmZXJlcl9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3JlZmVyZXJfbW9kdWxlLmMKQEAgLTE2OCwxMCArMTY4LDYgQEAKIAogICAgIGxlbiA9IGxhc3QgLSBwOwogCi0gICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgIGdvdG8gaW52YWxpZDsKLSAgICB9Ci0KICAgICBpZiAodXJpID09IE5HWF9IVFRQX1JFRkVSRVJfTk9fVVJJX1BBUlQpIHsKICAgICAgICAgZ290byB2YWxpZDsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlLmMKaW5kZXggMThlODcyOS4uNjZiMmI5NiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUuYwpAQCAtMzUwLDcgKzM1MCw3IEBACiAgICAgbmd4X2h0dHBfc3NpX2NvbW1hbmRfdCAgICAqY21kOwogICAgIG5neF9odHRwX3NzaV9sb2NfY29uZl90ICAgKnNsY2Y7CiAgICAgbmd4X2h0dHBfc3NpX21haW5fY29uZl90ICAqc21jZjsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICpwYXJhbXNbTkdYX0hUVFBfU1NJX01BWF9QQVJBTVNdOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgKnBhcmFtc1tOR1hfSFRUUF9TU0lfTUFYX1BBUkFNUyArIDFdOwogCiAgICAgY3R4ID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9jdHgociwgbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUpOwogCkBAIC01MzQsNyArNTM0LDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBuZ3hfbWVtemVybyhwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfU1NJX01BWF9QQVJBTVMgKiBzaXplb2Yobmd4X3N0cl90ICopKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChOR1hfSFRUUF9TU0lfTUFYX1BBUkFNUyArIDEpICogc2l6ZW9mKG5neF9zdHJfdCAqKSk7CiAKICAgICAgICAgICAgICAgICBwYXJhbSA9IGN0eC0+cGFyYW1zLmVsdHM7CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NsX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmMKaW5kZXggZDc1YjllNi4uNTVmN2I0OCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmMKQEAgLTQwLDIxICs0MCwyMSBAQAogc3RhdGljIG5neF9jb21tYW5kX3QgIG5neF9odHRwX3NzbF9jb21tYW5kc1tdID0gewogCiAgICAgeyBuZ3hfc3RyaW5nKCJzc2wiKSwKLSAgICAgIE5HWF9IVFRQX1NSVl9DT05GfE5HWF9DT05GX0ZMQUcsCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0NPTkZfRkxBRywKICAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCiAgICAgICBOR1hfSFRUUF9TUlZfQ09ORl9PRkZTRVQsCiAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9zc2xfc3J2X2NvbmZfdCwgZW5hYmxlKSwKICAgICAgIE5VTEwgfSwKIAogICAgIHsgbmd4X3N0cmluZygic3NsX2NlcnRpZmljYXRlIiksCi0gICAgICBOR1hfSFRUUF9TUlZfQ09ORnxOR1hfQ09ORl9UQUtFMSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfQ09ORl9UQUtFMSwKICAgICAgIG5neF9jb25mX3NldF9zdHJfc2xvdCwKICAgICAgIE5HWF9IVFRQX1NSVl9DT05GX09GRlNFVCwKICAgICAgIG9mZnNldG9mKG5neF9odHRwX3NzbF9zcnZfY29uZl90LCBjZXJ0aWZpY2F0ZSksCiAgICAgICBOVUxMIH0sCiAKICAgICB7IG5neF9zdHJpbmcoInNzbF9jZXJ0aWZpY2F0ZV9rZXkiKSwKLSAgICAgIE5HWF9IVFRQX1NSVl9DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9DT05GX1RBS0UxLAogICAgICAgbmd4X2NvbmZfc2V0X3N0cl9zbG90LAogICAgICAgTkdYX0hUVFBfU1JWX0NPTkZfT0ZGU0VULAogICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfc3NsX3Nydl9jb25mX3QsIGNlcnRpZmljYXRlX2tleSksCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL3BlcmwvTWFrZWZpbGUuUEwgYi9zcmMvaHR0cC9tb2R1bGVzL3BlcmwvTWFrZWZpbGUuUEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhM2RmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9odHRwL21vZHVsZXMvcGVybC9NYWtlZmlsZS5QTApAQCAtMCwwICsxLDM1IEBACisKKyMgQ29weXJpZ2h0IChDKSBJZ29yIFN5c29ldgorCit1c2UgNS4wMDYwMDE7Cit1c2UgRXh0VXRpbHM6Ok1ha2VNYWtlcjsKKworV3JpdGVNYWtlZmlsZSgKKyAgICBOQU1FICAgICAgICAgICAgICA9PiAnbmdpbngnLAorICAgIFZFUlNJT05fRlJPTSAgICAgID0+ICduZ2lueC5wbScsICAgICAjIGZpbmRzICRWRVJTSU9OCisgICAgUFJFUkVRX1BNICAgICAgICAgPT4ge30sICAgICAgICAgICAgICMgZS5nLiwgTW9kdWxlOjpOYW1lID0+IDEuMQorCisgICAgQUJTVFJBQ1RfRlJPTSAgICAgPT4gJ25naW54LnBtJywgICAgICMgcmV0cmlldmUgYWJzdHJhY3QgZnJvbSBtb2R1bGUKKyAgICBBVVRIT1IgICAgICAgICAgICA9PiAnSWdvciBTeXNvZXYnLAorCisgICAgQ0NGTEFHUyAgICAgICAgICAgPT4gIiRFTlZ7TkdYX1BFUkxfQ0ZMQUdTfSIsCisKKyAgICBJTkMgICAgICAgICAgICAgICA9PiAiLUkgLi4vLi4vLi4vLi4vLi4vc3JjL2NvcmUgIiAuCisgICAgICAgICAgICAgICAgICAgICAgICAgIi1JIC4uLy4uLy4uLy4uLy4uL3NyYy9ldmVudCAiIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAiLUkgLi4vLi4vLi4vLi4vLi4vc3JjL29zL3VuaXggIiAuCisgICAgICAgICAgICAgICAgICAgICAgICAgIi1JIC4uLy4uLy4uLy4uLy4uL3NyYy9odHRwICIgLgorICAgICAgICAgICAgICAgICAgICAgICAgICItSSAuLi8uLi8uLi8uLi8uLi9zcmMvaHR0cC9tb2R1bGVzICIgLgorICAgICAgICAgICAgICAgICAgICAgICAgICItSSAuLi8uLi8uLi8uLi8uLi9zcmMvaHR0cC9tb2R1bGVzL3BlcmwgIiAuCisgICAgICAgICAgICAgICAgICAgICAgICAgIi1JIC4uLy4uLy4uLy4uLy4uLyRFTlZ7TkdYX09CSlN9ICIgLgorICAgICAgICAgICAgICAgICAgICAgICAgICItSSAuLi8uLi8uLi8uLi8uLi8kRU5We05HWF9QQ1JFfSAiIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAiLUkgLi4vLi4vLi4vLi4vLi4vJEVOVntOR1hfWkxJQn0gIiwKKworICAgIGRlcGVuZCA9PiB7CisgICAgICAgICduZ2lueC5jJyAgICAgPT4KKyAgICAgICAgICAgICAgICAgICIuLi8uLi8uLi8uLi8uLi9zcmMvaHR0cC9tb2R1bGVzL3Blcmwvbmd4X2h0dHBfcGVybF9tb2R1bGUuaCIKKyAgICB9LAorCisgICAgUE0gPT4geworICAgICAgICAnbmdpbngucG0nICAgID0+ICckKElOU1RfTElCRElSKS9uZ2lueC5wbScKKyAgICB9CispOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9wZXJsL25naW54LnBtIGIvc3JjL2h0dHAvbW9kdWxlcy9wZXJsL25naW54LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZmY2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaHR0cC9tb2R1bGVzL3BlcmwvbmdpbngucG0KQEAgLTAsMCArMSw3MCBAQAorcGFja2FnZSBuZ2lueDsKKwordXNlIDUuMDA2MDAxOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworcmVxdWlyZSBFeHBvcnRlcjsKKworb3VyIEBJU0EgPSBxdyhFeHBvcnRlcik7CisKK291ciBARVhQT1JUID0gcXcoCisgICAgT0sKKyAgICBERUNMSU5FRAorICAgIEhUVFBfT0sKKyAgICBIVFRQX1JFRElSRUNUCisgICAgSFRUUF9OT1RfRk9VTkQKKyAgICBIVFRQX1NFUlZFUl9FUlJPUgorKTsKKworb3VyICRWRVJTSU9OID0gJzAuMy4yMSc7CisKK3JlcXVpcmUgWFNMb2FkZXI7CitYU0xvYWRlcjo6bG9hZCgnbmdpbngnLCAkVkVSU0lPTik7CisKKyMgUHJlbG9hZGVkIG1ldGhvZHMgZ28gaGVyZS4KKwordXNlIGNvbnN0YW50IE9LICAgICAgICAgICAgICAgICAgID0+IDA7Cit1c2UgY29uc3RhbnQgREVDTElORUQgICAgICAgICAgICAgPT4gLTU7CisKK3VzZSBjb25zdGFudCBIVFRQX09LICAgICAgICAgICAgICA9PiAyMDA7Cit1c2UgY29uc3RhbnQgSFRUUF9SRURJUkVDVCAgICAgICAgPT4gMzAyOwordXNlIGNvbnN0YW50IEhUVFBfTk9UX0ZPVU5EICAgICAgID0+IDQwNDsKK3VzZSBjb25zdGFudCBIVFRQX1NFUlZFUl9FUlJPUiAgICA9PiA1MDA7CisKKworMTsKK19fRU5EX18KKworPWhlYWQxIE5BTUUKKworbmdpbnggLSBQZXJsIGludGVyZmFjZSB0byB0aGUgbmdpbnggSFRUUCBzZXJ2ZXIgQVBJCisKKz1oZWFkMSBTWU5PUFNJUworCisgIHVzZSBuZ2lueDsKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIGEgUGVybCBpbnRlcmZhY2UgdG8gdGhlIG5naW54IEhUVFAgc2VydmVyIEFQSS4KKworPWhlYWQyIEVYUE9SVAorCitOb25lIGJ5IGRlZmF1bHQuCisKKworCis9aGVhZDEgU0VFIEFMU08KKworaHR0cDovL3N5c29ldi5ydS9uZ2lueC9kb2NzL2h0dHAvbmd4X2h0dHBfcGVybF9tb2R1bGUuaHRtbAorCis9aGVhZDEgQVVUSE9SCisKK0lnb3IgU3lzb2V2CisKKz1oZWFkMSBDT1BZUklHSFQgQU5EIExJQ0VOU0UKKworQ29weXJpZ2h0IChDKSBJZ29yIFN5c29ldgorCisKKz1jdXQKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvcGVybC9uZ2lueC54cyBiL3NyYy9odHRwL21vZHVsZXMvcGVybC9uZ2lueC54cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQyZGViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9wZXJsL25naW54LnhzCkBAIC0wLDAgKzEsNTUxIEBACisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIElnb3IgU3lzb2V2CisgKi8KKworCisjZGVmaW5lIFBFUkxfTk9fR0VUX0NPTlRFWFQKKworI2luY2x1ZGUgIkVYVEVSTi5oIgorI2luY2x1ZGUgInBlcmwuaCIKKyNpbmNsdWRlICJYU1VCLmgiCisKKyNpbmNsdWRlIDxuZ3hfY29uZmlnLmg+CisjaW5jbHVkZSA8bmd4X2NvcmUuaD4KKyNpbmNsdWRlIDxuZ3hfaHR0cC5oPgorI2luY2x1ZGUgPG5neF9odHRwX3BlcmxfbW9kdWxlLmg+CisKKworc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfcGVybF9zdjJzdHIocFRIWF8gbmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfc3RyX3QgKnMsIFNWICpzdikKK3sKKyAgICB1X2NoYXIgICpwOworICAgIFNUUkxFTiAgIGxlbjsKKworICAgIGlmIChTdlJPSyhzdikgJiYgU3ZUWVBFKFN2UlYoc3YpKSA9PSBTVnRfUFYpIHsKKyAgICAgICAgc3YgPSBTdlJWKHN2KTsKKyAgICB9CisKKyAgICBwID0gKHVfY2hhciAqKSBTdlBWKHN2LCBsZW4pOworCisgICAgcy0+bGVuID0gbGVuOworCisgICAgaWYgKFN2UkVBRE9OTFkoc3YpKSB7CisgICAgICAgIHMtPmRhdGEgPSBwOworICAgICAgICByZXR1cm4gTkdYX09LOworICAgIH0KKworICAgIHMtPmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIGxlbik7CisgICAgaWYgKHMtPmRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIG5neF9tZW1jcHkocy0+ZGF0YSwgcCwgbGVuKTsKKworICAgIHJldHVybiBOR1hfT0s7Cit9CisKKworc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfcGVybF9vdXRwdXQobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfYnVmX3QgKmIpCit7CisgICAgbmd4X2NoYWluX3QgICAgICAgICAgKmNsLCBvdXQ7CisgICAgbmd4X2h0dHBfcGVybF9jdHhfdCAgKmN0eDsKKworICAgIGN0eCA9IG5neF9odHRwX2dldF9tb2R1bGVfY3R4KHIsIG5neF9odHRwX3BlcmxfbW9kdWxlKTsKKworICAgIGlmIChjdHgtPnNzaSkgeworICAgICAgICBjbCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpOworICAgICAgICBpZiAoY2wgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNsLT5idWYgPSBiOworICAgICAgICBjbC0+bmV4dCA9IE5VTEw7CisgICAgICAgICpjdHgtPnNzaS0+bGFzdF9vdXQgPSBjbDsKKyAgICAgICAgY3R4LT5zc2ktPmxhc3Rfb3V0ID0gJmNsLT5uZXh0OworCisgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgfQorCisgICAgb3V0LmJ1ZiA9IGI7CisgICAgb3V0Lm5leHQgPSBOVUxMOworCisgICAgcmV0dXJuIG5neF9odHRwX291dHB1dF9maWx0ZXIociwgJm91dCk7Cit9CisKKworTU9EVUxFID0gbmdpbnggICAgUEFDS0FHRSA9IG5naW54CisKKworaW50CitzZW5kX2h0dHBfaGVhZGVyKHIsIC4uLikKKyAgICBuZ2lueCAgIHIKKworICAgIFBSRUlOSVQ6CisKKyAgICBTViAgICAgKnN2OworCisgICAgQ09ERToKKworICAgIGlmIChyLT5oZWFkZXJzX291dC5zdGF0dXMgPT0gMCkgeworICAgICAgICByLT5oZWFkZXJzX291dC5zdGF0dXMgPSBOR1hfSFRUUF9PSzsKKyAgICB9CisKKyAgICBpZiAoaXRlbXMgIT0gMSkgeworICAgICAgICBzdiA9IFNUKDEpOworCisgICAgICAgIGlmIChuZ3hfaHR0cF9wZXJsX3N2MnN0cihhVEhYXyByLCAmci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLCBzdikKKyAgICAgICAgICAgICE9IE5HWF9PSykKKyAgICAgICAgeworICAgICAgICAgICAgUkVUVkFMID0gTkdYX0VSUk9SOworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmxlbiA9PSAwKSB7CisgICAgICAgICAgICBpZiAobmd4X2h0dHBfc2V0X2NvbnRlbnRfdHlwZShyKSAhPSBOR1hfT0spIHsKKyAgICAgICAgICAgICAgICBSRVRWQUwgPSBOR1hfRVJST1I7CisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgUkVUVkFMID0gbmd4X2h0dHBfc2VuZF9oZWFkZXIocik7CisKKyAgICBkb25lOgorCisgICAgT1VUUFVUOgorICAgIFJFVFZBTAorCisKK2ludAoraGVhZGVyX29ubHkocikKKyAgICBuZ2lueCAgcgorCisgICAgQ09ERToKKyAgICBSRVRWQUwgPSByLT5oZWFkZXJfb25seTsKKworICAgIE9VVFBVVDoKKyAgICBSRVRWQUwKKworCisjIFRoZSByZXR1cm5pbmcgImNoYXIgKiIgaXMgbW9yZSBxdWlja2x5IHRoYW4gY3JlYXRpbmcgU1YsIGJlY2F1c2UgU1YgcmV0dXJuZWQKKyMgZnJvbSBYUyBpcyBuZXZlciB1c2VkIGFzIHBlcm1hbmVudCBzdG9yYWdlLiBFdmVuIGluIHNpbXBsZSBjYXNlOgorIyAiJHVyaSA9ICRyLT51cmkiIHRoZSBTViByZXR1cm5lZCBieSAkci0+dXJpIGlzIGNvcGllZCB0byAkdXJpJ3MgU1YuCisKK2NoYXIgKgordXJpKHIsIC4uLikKKyAgICBuZ2lueCAgcgorCisgICAgQ09ERToKKworICAgIGlmIChpdGVtcyAhPSAxKSB7CisgICAgICAgIGNyb2FrKCIkci0+dXJpKHRleHQpIGlzIG5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIFJFVFZBTCA9IG5neF9wYWxsb2Moci0+cG9vbCwgci0+dXJpLmxlbiArIDEpOworICAgIGlmIChSRVRWQUwgPT0gTlVMTCkgeworICAgICAgICBYU1JFVFVSTl9VTkRFRjsKKyAgICB9CisKKyAgICBuZ3hfY3B5c3RybigodV9jaGFyICopIFJFVFZBTCwgci0+dXJpLmRhdGEsIHItPnVyaS5sZW4gKyAxKTsKKworICAgIE9VVFBVVDoKKyAgICBSRVRWQUwKKworCitjaGFyICoKK3F1ZXJ5X3N0cmluZyhyLCAuLi4pCisgICAgbmdpbnggIHIKKworICAgIENPREU6CisKKyAgICBpZiAoaXRlbXMgIT0gMSkgeworICAgICAgICBjcm9haygiJHItPnF1ZXJ5X3N0cmluZyh0ZXh0KSBpcyBub3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBSRVRWQUwgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHItPmFyZ3MubGVuICsgMSk7CisgICAgaWYgKFJFVFZBTCA9PSBOVUxMKSB7CisgICAgICAgIFhTUkVUVVJOX1VOREVGOworICAgIH0KKworICAgIG5neF9jcHlzdHJuKCh1X2NoYXIgKikgUkVUVkFMLCByLT5hcmdzLmRhdGEsIHItPmFyZ3MubGVuICsgMSk7CisKKyAgICBPVVRQVVQ6CisgICAgUkVUVkFMCisKKworY2hhciAqCitoZWFkZXJfaW4ociwga2V5KQorICAgIG5naW54ICAgICAgICAgICAgIHIKKyAgICBTViAgICAgICAgICAgICAgICprZXkKKworICAgIFBSRUlOSVQ6CisKKyAgICB1X2NoYXIgICAgICAgICAgICpwOworICAgIFNUUkxFTiAgICAgICAgICAgIGxlbjsKKyAgICBuZ3hfdWludF90ICAgICAgICBpOworICAgIG5neF9saXN0X3BhcnRfdCAgKnBhcnQ7CisgICAgbmd4X3RhYmxlX2VsdF90ICAqaGVhZGVyOworCisgICAgQ09ERToKKworICAgIGlmIChTdlJPSyhrZXkpICYmIFN2VFlQRShTdlJWKGtleSkpID09IFNWdF9QVikgeworICAgICAgICBrZXkgPSBTdlJWKGtleSk7CisgICAgfQorCisgICAgcCA9ICh1X2NoYXIgKikgU3ZQVihrZXksIGxlbik7CisKKyAgICBwYXJ0ID0gJnItPmhlYWRlcnNfaW4uaGVhZGVycy5wYXJ0OworICAgIGhlYWRlciA9IHBhcnQtPmVsdHM7CisKKyAgICBmb3IgKGkgPSAwOyAvKiB2b2lkICovIDsgaSsrKSB7CisKKyAgICAgICAgaWYgKGkgPj0gcGFydC0+bmVsdHMpIHsKKyAgICAgICAgICAgIGlmIChwYXJ0LT5uZXh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFydCA9IHBhcnQtPm5leHQ7CisgICAgICAgICAgICBoZWFkZXIgPSBwYXJ0LT5lbHRzOworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGVuICE9IGhlYWRlcltpXS5rZXkubGVuCisgICAgICAgICAgICB8fCBuZ3hfc3RyY2FzZWNtcChwLCBoZWFkZXJbaV0ua2V5LmRhdGEpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgUkVUVkFMID0gKGNoYXIgKikgaGVhZGVyW2ldLnZhbHVlLmRhdGE7CisKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIFhTUkVUVVJOX1VOREVGOworCisgICAgZG9uZToKKworICAgIE9VVFBVVDoKKyAgICBSRVRWQUwKKworCitpbnQKK2hlYWRlcl9vdXQociwga2V5LCB2YWx1ZSkKKyAgICBuZ2lueCAgICAgICAgICAgICByCisgICAgU1YgICAgICAgICAgICAgICAqa2V5CisgICAgU1YgICAgICAgICAgICAgICAqdmFsdWUKKworICAgIFBSRUlOSVQ6CisKKyAgICBuZ3hfdGFibGVfZWx0X3QgICpoZWFkZXI7CisKKyAgICBDT0RFOgorCisgICAgaGVhZGVyID0gbmd4X2xpc3RfcHVzaCgmci0+aGVhZGVyc19vdXQuaGVhZGVycyk7CisgICAgaWYgKGhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIFJFVFZBTCA9IE5HWF9FUlJPUjsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGhlYWRlci0+aGFzaCA9IDE7CisKKyAgICBpZiAobmd4X2h0dHBfcGVybF9zdjJzdHIoYVRIWF8gciwgJmhlYWRlci0+a2V5LCBrZXkpICE9IE5HWF9PSykgeworICAgICAgICBSRVRWQUwgPSBOR1hfRVJST1I7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBpZiAobmd4X2h0dHBfcGVybF9zdjJzdHIoYVRIWF8gciwgJmhlYWRlci0+dmFsdWUsIHZhbHVlKSAhPSBOR1hfT0spIHsKKyAgICAgICAgUkVUVkFMID0gTkdYX0VSUk9SOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKGhlYWRlci0+a2V5LmxlbiA9PSBzaXplb2YoIkNvbnRlbnQtTGVuZ3RoIikgLSAxCisgICAgICAgICYmIG5neF9zdHJuY2FzZWNtcChoZWFkZXItPmtleS5kYXRhLCAiQ29udGVudC1MZW5ndGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCJDb250ZW50LUxlbmd0aCIpIC0gMSkgPT0gMAorICAgICAgICAmJiBTdklPSyh2YWx1ZSkpCisgICAgeworICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aF9uID0gKHNzaXplX3QpIFN2SVYodmFsdWUpOzsKKyAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGggPSBoZWFkZXI7CisgICAgfQorCisgICAgUkVUVkFMID0gTkdYX09LOworCisgICAgZG9uZToKKworICAgIE9VVFBVVDoKKyAgICBSRVRWQUwKKworCitjaGFyICoKK2ZpbGVuYW1lKHIpCisgICAgbmdpbnggICAgICAgICAgICAgICAgIHIKKworICAgIFBSRUlOSVQ6CisKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgcGF0aDsKKyAgICBuZ3hfaHR0cF9wZXJsX2N0eF90ICAqY3R4OworCisgICAgQ09ERToKKworICAgIGN0eCA9IG5neF9odHRwX2dldF9tb2R1bGVfY3R4KHIsIG5neF9odHRwX3BlcmxfbW9kdWxlKTsKKyAgICBpZiAoY3R4LT5maWxlbmFtZSkgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKG5neF9odHRwX21hcF91cmlfdG9fcGF0aChyLCAmcGF0aCwgMCkgPT0gTlVMTCkgeworICAgICAgICBYU1JFVFVSTl9VTkRFRjsKKyAgICB9CisKKyAgICBjdHgtPmZpbGVuYW1lID0gKGNoYXIgKikgcGF0aC5kYXRhOworCisgICAgc3Zfc2V0cHYoUExfc3RhdG5hbWUsIGN0eC0+ZmlsZW5hbWUpOworCisgICAgZG9uZToKKworICAgIFJFVFZBTCA9IGN0eC0+ZmlsZW5hbWU7CisKKyAgICBPVVRQVVQ6CisgICAgUkVUVkFMCisKKworaW50CitwcmludChyLCAuLi4pCisgICAgbmdpbnggICAgICAgcgorCisgICAgUFJFSU5JVDoKKworICAgIFNWICAgICAgICAgKnN2OworICAgIGludCAgICAgICAgIGk7CisgICAgdV9jaGFyICAgICAqcDsKKyAgICBzaXplX3QgICAgICBzaXplOworICAgIFNUUkxFTiAgICAgIGxlbjsKKyAgICBuZ3hfYnVmX3QgICpiOworCisgICAgQ09ERToKKworICAgIFJFVFZBTCA9IE5HWF9PSzsKKworICAgIGlmIChpdGVtcyA9PSAyKSB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogZG8gemVybyBjb3B5IGZvciBwcm9sYXRlIHNpbmdsZSByZWFkLW9ubHkgU1Y6CisgICAgICAgICAqICAgICAkci0+cHJpbnQoInNvbWUgdGV4dFxuIik7CisgICAgICAgICAqLworCisgICAgICAgIHN2ID0gU1QoMSk7CisKKyAgICAgICAgaWYgKFN2Uk9LKHN2KSAmJiBTdlRZUEUoU3ZSVihzdikpID09IFNWdF9QVikgeworICAgICAgICAgICAgc3YgPSBTdlJWKHN2KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChTdlJFQURPTkxZKHN2KSkgeworCisgICAgICAgICAgICBwID0gKHVfY2hhciAqKSBTdlBWKHN2LCBsZW4pOworCisgICAgICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGIgPSBuZ3hfY2FsbG9jX2J1ZihyLT5wb29sKTsKKyAgICAgICAgICAgIGlmIChiID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBSRVRWQUwgPSBOR1hfRVJST1I7CisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiLT5tZW1vcnkgPSAxOworICAgICAgICAgICAgYi0+cG9zID0gcDsKKyAgICAgICAgICAgIGItPmxhc3QgPSBwICsgbGVuOworICAgICAgICAgICAgYi0+c3RhcnQgPSBwOworICAgICAgICAgICAgYi0+ZW5kID0gYi0+bGFzdDsKKworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzaXplID0gMDsKKworICAgIGZvciAoaSA9IDE7IGkgPCBpdGVtczsgaSsrKSB7CisKKyAgICAgICAgc3YgPSBTVChpKTsKKworICAgICAgICBpZiAoU3ZST0soc3YpICYmIFN2VFlQRShTdlJWKHN2KSkgPT0gU1Z0X1BWKSB7CisgICAgICAgICAgICBzdiA9IFN2UlYoc3YpOworICAgICAgICB9CisKKyAgICAgICAgbmd4X2xvZ19kZWJ1ZzMoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJTVjogJXAgJWQgJVhkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3YsIFN2UkVGQ05UKHN2KSwgU3ZSRUFET05MWShzdikpOworCisgICAgICAgICh2b2lkKSBTdlBWKHN2LCBsZW4pOworCisgICAgICAgIHNpemUgKz0gbGVuOworICAgIH0KKworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGIgPSBuZ3hfY3JlYXRlX3RlbXBfYnVmKHItPnBvb2wsIHNpemUpOworICAgIGlmIChiID09IE5VTEwpIHsKKyAgICAgICAgUkVUVkFMID0gTkdYX0VSUk9SOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgZm9yIChpID0gMTsgaSA8IGl0ZW1zOyBpKyspIHsKKyAgICAgICAgc3YgPSBTVChpKTsKKworICAgICAgICBpZiAoU3ZST0soc3YpICYmIFN2VFlQRShTdlJWKHN2KSkgPT0gU1Z0X1BWKSB7CisgICAgICAgICAgICBzdiA9IFN2UlYoc3YpOworICAgICAgICB9CisKKyAgICAgICAgcCA9ICh1X2NoYXIgKikgU3ZQVihzdiwgbGVuKTsKKyAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgcCwgbGVuKTsKKyAgICB9CisKKyAgICBvdXQ6CisKKyAgICBSRVRWQUwgPSBuZ3hfaHR0cF9wZXJsX291dHB1dChyLCBiKTsKKworICAgIGRvbmU6CisKKyAgICBPVVRQVVQ6CisgICAgUkVUVkFMCisKKworaW50CitzZW5kZmlsZShyLCBmaWxlbmFtZSkKKyAgICBuZ2lueCAgICAgICAgICAgICAgICAgICAgIHIKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgKmZpbGVuYW1lCisKKyAgICBQUkVJTklUOgorCisgICAgbmd4X2ZkX3QgICAgICAgICAgICAgICAgICBmZDsKKyAgICBuZ3hfYnVmX3QgICAgICAgICAgICAgICAgKmI7CisgICAgbmd4X2ZpbGVfaW5mb190ICAgICAgICAgICBmaTsKKyAgICBuZ3hfcG9vbF9jbGVhbnVwX3QgICAgICAgKmNsbjsKKyAgICBuZ3hfcG9vbF9jbGVhbnVwX2ZpbGVfdCAgKmNsbmY7CisKKyAgICBDT0RFOgorCisgICAgaWYgKGZpbGVuYW1lID09IE5VTEwpIHsKKyAgICAgICAgY3JvYWsoInNlbmRmaWxlKCk6IE5VTEwgZmlsZW5hbWUiKTsKKyAgICB9CisKKyAgICBiID0gbmd4X2NhbGxvY19idWYoci0+cG9vbCk7CisgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgICBSRVRWQUwgPSBOR1hfRVJST1I7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBiLT5maWxlID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9maWxlX3QpKTsKKyAgICBpZiAoYi0+ZmlsZSA9PSBOVUxMKSB7CisgICAgICAgIFJFVFZBTCA9IE5HWF9FUlJPUjsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGNsbiA9IG5neF9wb29sX2NsZWFudXBfYWRkKHItPnBvb2wsIHNpemVvZihuZ3hfcG9vbF9jbGVhbnVwX2ZpbGVfdCkpOworICAgIGlmIChjbG4gPT0gTlVMTCkgeworICAgICAgICBSRVRWQUwgPSBOR1hfRVJST1I7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBmZCA9IG5neF9vcGVuX2ZpbGUoKHVfY2hhciAqKSBmaWxlbmFtZSwgTkdYX0ZJTEVfUkRPTkxZLCBOR1hfRklMRV9PUEVOKTsKKworICAgIGlmIChmZCA9PSBOR1hfSU5WQUxJRF9GSUxFKSB7CisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19DUklULCByLT5jb25uZWN0aW9uLT5sb2csIG5neF9lcnJubywKKyAgICAgICAgICAgICAgICAgICAgICBuZ3hfb3Blbl9maWxlX24gIiBcIiVzXCIgZmFpbGVkIiwgZmlsZW5hbWUpOworICAgICAgICBSRVRWQUwgPSBOR1hfRVJST1I7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBpZiAobmd4X2ZkX2luZm8oZmQsICZmaSkgPT0gTkdYX0ZJTEVfRVJST1IpIHsKKyAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0NSSVQsIHItPmNvbm5lY3Rpb24tPmxvZywgbmd4X2Vycm5vLAorICAgICAgICAgICAgICAgICAgICAgIG5neF9mZF9pbmZvX24gIiBcIiVzXCIgZmFpbGVkIiwgZmlsZW5hbWUpOworCisgICAgICAgIGlmIChuZ3hfY2xvc2VfZmlsZShmZCkgPT0gTkdYX0ZJTEVfRVJST1IpIHsKKyAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19BTEVSVCwgci0+Y29ubmVjdGlvbi0+bG9nLCBuZ3hfZXJybm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9jbG9zZV9maWxlX24gIiBcIiVzXCIgZmFpbGVkIiwgZmlsZW5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgUkVUVkFMID0gTkdYX0VSUk9SOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgY2xuLT5oYW5kbGVyID0gbmd4X3Bvb2xfY2xlYW51cF9maWxlOworICAgIGNsbmYgPSBjbG4tPmRhdGE7CisKKyAgICBjbG5mLT5mZCA9IGZkOworICAgIGNsbmYtPm5hbWUgPSAodV9jaGFyICopICIiOworICAgIGNsbmYtPmxvZyA9IHItPnBvb2wtPmxvZzsKKworICAgIGItPmluX2ZpbGUgPSAxOworICAgIGItPmZpbGVfcG9zID0gMDsKKyAgICBiLT5maWxlX2xhc3QgPSBuZ3hfZmlsZV9zaXplKCZmaSk7CisKKyAgICBiLT5maWxlLT5mZCA9IGZkOworICAgIGItPmZpbGUtPmxvZyA9IHItPmNvbm5lY3Rpb24tPmxvZzsKKworICAgIFJFVFZBTCA9IG5neF9odHRwX3Blcmxfb3V0cHV0KHIsIGIpOworCisgICAgZG9uZToKKworICAgIE9VVFBVVDoKKyAgICBSRVRWQUwKKworCitpbnQKK3JmbHVzaChyKQorICAgIG5naW54ICAgICAgIHIKKworICAgIFBSRUlOSVQ6CisKKyAgICBuZ3hfYnVmX3QgICpiOworCisgICAgQ09ERToKKworICAgIGIgPSBuZ3hfY2FsbG9jX2J1ZihyLT5wb29sKTsKKyAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgIFJFVFZBTCA9IE5HWF9FUlJPUjsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGItPmZsdXNoID0gMTsKKworICAgIFJFVFZBTCA9IG5neF9odHRwX3Blcmxfb3V0cHV0KHIsIGIpOworCisgICAgZG9uZToKKworICAgIE9VVFBVVDoKKyAgICBSRVRWQUwKKworCit2b2lkCitpbnRlcm5hbF9yZWRpcmVjdChyLCB1cmkpCisgICAgbmdpbnggICAgICAgICAgICAgICAgIHIKKyAgICBTViAgICAgICAgICAgICAgICAgICAqdXJpCisKKyAgICBQUkVJTklUOgorCisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgIGk7CisgICAgbmd4X2h0dHBfcGVybF9jdHhfdCAgKmN0eDsKKworICAgIENPREU6CisKKyAgICBjdHggPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2N0eChyLCBuZ3hfaHR0cF9wZXJsX21vZHVsZSk7CisKKyAgICBpZiAobmd4X2h0dHBfcGVybF9zdjJzdHIoYVRIWF8gciwgJmN0eC0+cmVkaXJlY3RfdXJpLCB1cmkpICE9IE5HWF9PSykgeworICAgICAgICBYU1JFVFVSTl9FTVBUWTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5yZWRpcmVjdF91cmkubGVuOyBpKyspIHsKKyAgICAgICAgaWYgKGN0eC0+cmVkaXJlY3RfdXJpLmRhdGFbaV0gPT0gJz8nKSB7CisKKyAgICAgICAgICAgIGN0eC0+cmVkaXJlY3RfYXJncy5sZW4gPSBjdHgtPnJlZGlyZWN0X3VyaS5sZW4gLSAoaSArIDEpOworICAgICAgICAgICAgY3R4LT5yZWRpcmVjdF9hcmdzLmRhdGEgPSAmY3R4LT5yZWRpcmVjdF91cmkuZGF0YVtpICsgMV07CisgICAgICAgICAgICBjdHgtPnJlZGlyZWN0X3VyaS5sZW4gPSBpOworCisgICAgICAgICAgICBYU1JFVFVSTl9FTVBUWTsKKyAgICAgICAgfQorICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvcGVybC9uZ3hfaHR0cF9wZXJsX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9wZXJsL25neF9odHRwX3BlcmxfbW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmNzc4NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9odHRwL21vZHVsZXMvcGVybC9uZ3hfaHR0cF9wZXJsX21vZHVsZS5jCkBAIC0wLDAgKzEsOTgwIEBACisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIElnb3IgU3lzb2V2CisgKi8KKworCisjaW5jbHVkZSA8bmd4X2NvbmZpZy5oPgorI2luY2x1ZGUgPG5neF9jb3JlLmg+CisjaW5jbHVkZSA8bmd4X2h0dHAuaD4KKyNpbmNsdWRlIDxuZ3hfaHR0cF9wZXJsX21vZHVsZS5oPgorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQZXJsSW50ZXJwcmV0ZXIgICoqZnJlZV9wZXJsczsKKyAgICBuZ3hfdWludF90ICAgICAgICAgaW50ZXJwOworICAgIG5neF91aW50X3QgICAgICAgICBuYWxsb2M7CisgICAgbmd4X3VpbnRfdCAgICAgICAgIGludGVycF9tYXg7CisKKyAgICBQZXJsSW50ZXJwcmV0ZXIgICAqcGVybDsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgbW9kdWxlczsKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgcmVxdWlyZXM7Cit9IG5neF9odHRwX3BlcmxfbWFpbl9jb25mX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFNWICAgICAgICAgICAgICAgICpzdWI7CisgICAgbmd4X3N0cl90ICAgICAgICAgIGhhbmRsZXI7Cit9IG5neF9odHRwX3BlcmxfbG9jX2NvbmZfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgU1YgICAgICAgICAgICAgICAgKnN1YjsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgaGFuZGxlcjsKK30gbmd4X2h0dHBfcGVybF92YXJpYWJsZV90OworCisKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcGVybF9zc2kobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9odHRwX3NzaV9jdHhfdCAqc3NpX2N0eCwgbmd4X3N0cl90ICoqcGFyYW1zKTsKK3N0YXRpYyBuZ3hfaW50X3QKKyAgICBuZ3hfaHR0cF9wZXJsX2dldF9pbnRlcnByZXRlcihuZ3hfaHR0cF9wZXJsX21haW5fY29uZl90ICpwbWNmLAorICAgIFBlcmxJbnRlcnByZXRlciAqKnBlcmwsIG5neF9sb2dfdCAqbG9nKTsKK3N0YXRpYyBuZ3hfaW5saW5lIHZvaWQKKyAgICBuZ3hfaHR0cF9wZXJsX2ZyZWVfaW50ZXJwcmV0ZXIobmd4X2h0dHBfcGVybF9tYWluX2NvbmZfdCAqcG1jZiwKKyAgICBQZXJsSW50ZXJwcmV0ZXIgKnBlcmwpOworc3RhdGljIGNoYXIgKm5neF9odHRwX3BlcmxfaW5pdF9pbnRlcnByZXRlcihuZ3hfY29uZl90ICpjZiwKKyAgICBuZ3hfaHR0cF9wZXJsX21haW5fY29uZl90ICpwbWNmKTsKK3N0YXRpYyBQZXJsSW50ZXJwcmV0ZXIgKgorICAgIG5neF9odHRwX3BlcmxfY3JlYXRlX2ludGVycHJldGVyKG5neF9odHRwX3BlcmxfbWFpbl9jb25mX3QgKnBtY2YsCisgICAgbmd4X2xvZ190ICpsb2cpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9wZXJsX2NhbGxfaGFuZGxlcihwVEhYXyBuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgU1YgKnN1Yiwgbmd4X3N0cl90ICoqYXJncywgbmd4X3N0cl90ICpoYW5kbGVyLCBuZ3hfc3RyX3QgKnJ2KTsKK3N0YXRpYyB2b2lkIG5neF9odHRwX3BlcmxfZXZhbF9hbm9uX3N1YihwVEhYXyBuZ3hfc3RyX3QgKmhhbmRsZXIsIFNWICoqc3YpOworCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3BlcmxfcHJlY29uZmlndXJhdGlvbihuZ3hfY29uZl90ICpjZik7CitzdGF0aWMgdm9pZCAqbmd4X2h0dHBfcGVybF9jcmVhdGVfbWFpbl9jb25mKG5neF9jb25mX3QgKmNmKTsKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9wZXJsX2luaXRfbWFpbl9jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpjb25mKTsKK3N0YXRpYyB2b2lkICpuZ3hfaHR0cF9wZXJsX2NyZWF0ZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZik7CitzdGF0aWMgY2hhciAqbmd4X2h0dHBfcGVybF9tZXJnZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZiwgdm9pZCAqcGFyZW50LAorICAgIHZvaWQgKmNoaWxkKTsKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9wZXJsX3JlcXVpcmUobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKKyAgICB2b2lkICpjb25mKTsKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9wZXJsKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpOworc3RhdGljIGNoYXIgKm5neF9odHRwX3Blcmxfc2V0KG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpOworc3RhdGljIGNoYXIgKm5neF9odHRwX3BlcmxfaW50ZXJwX21heF91bnN1cHBvcnRlZChuZ3hfY29uZl90ICpjZiwgdm9pZCAqcG9zdCwKKyAgICB2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIG5neF9odHRwX3BlcmxfY2xlYW51cF9wZXJsKHZvaWQgKmRhdGEpOworCisKK3N0YXRpYyBuZ3hfY29uZl9wb3N0X2hhbmRsZXJfcHQgIG5neF9odHRwX3BlcmxfaW50ZXJwX21heF9wID0KKyAgICBuZ3hfaHR0cF9wZXJsX2ludGVycF9tYXhfdW5zdXBwb3J0ZWQ7CisKKworc3RhdGljIG5neF9jb21tYW5kX3QgIG5neF9odHRwX3BlcmxfY29tbWFuZHNbXSA9IHsKKworICAgIHsgbmd4X3N0cmluZygicGVybF9tb2R1bGVzIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfc3RyX3Nsb3QsCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcGVybF9tYWluX2NvbmZfdCwgbW9kdWxlcyksCisgICAgICBOVUxMIH0sCisKKyAgICB7IG5neF9zdHJpbmcoInBlcmxfcmVxdWlyZSIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgbmd4X2h0dHBfcGVybF9yZXF1aXJlLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GX09GRlNFVCwKKyAgICAgIDAsCisgICAgICBOVUxMIH0sCisKKyAgICB7IG5neF9zdHJpbmcoInBlcmxfaW50ZXJwX21heCIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgbmd4X2NvbmZfc2V0X251bV9zbG90LAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GX09GRlNFVCwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX3BlcmxfbWFpbl9jb25mX3QsIGludGVycF9tYXgpLAorICAgICAgJm5neF9odHRwX3BlcmxfaW50ZXJwX21heF9wIH0sCisKKyAgICB7IG5neF9zdHJpbmcoInBlcmwiKSwKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgbmd4X2h0dHBfcGVybCwKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKKyAgICAgIDAsCisgICAgICBOVUxMIH0sCisKKyAgICB7IG5neF9zdHJpbmcoInBlcmxfc2V0IiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0NPTkZfVEFLRTIsCisgICAgICBuZ3hfaHR0cF9wZXJsX3NldCwKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKKyAgICAgIDAsCisgICAgICBOVUxMIH0sCisKKyAgICAgIG5neF9udWxsX2NvbW1hbmQKK307CisKKworc3RhdGljIG5neF9odHRwX21vZHVsZV90ICBuZ3hfaHR0cF9wZXJsX21vZHVsZV9jdHggPSB7CisgICAgbmd4X2h0dHBfcGVybF9wcmVjb25maWd1cmF0aW9uLCAgICAgICAgLyogcHJlY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3Rjb25maWd1cmF0aW9uICovCisKKyAgICBuZ3hfaHR0cF9wZXJsX2NyZWF0ZV9tYWluX2NvbmYsICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCisgICAgbmd4X2h0dHBfcGVybF9pbml0X21haW5fY29uZiwgICAgICAgICAgLyogaW5pdCBtYWluIGNvbmZpZ3VyYXRpb24gKi8KKworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIHNlcnZlciBjb25maWd1cmF0aW9uICovCisKKyAgICBuZ3hfaHR0cF9wZXJsX2NyZWF0ZV9sb2NfY29uZiwgICAgICAgICAvKiBjcmVhdGUgbG9jYXRpb24gY29uZmlndXJhdGlvbiAqLworICAgIG5neF9odHRwX3BlcmxfbWVyZ2VfbG9jX2NvbmYgICAgICAgICAgIC8qIG1lcmdlIGxvY2F0aW9uIGNvbmZpZ3VyYXRpb24gKi8KK307CisKKworbmd4X21vZHVsZV90ICBuZ3hfaHR0cF9wZXJsX21vZHVsZSA9IHsKKyAgICBOR1hfTU9EVUxFX1YxLAorICAgICZuZ3hfaHR0cF9wZXJsX21vZHVsZV9jdHgsICAgICAgICAgICAgIC8qIG1vZHVsZSBjb250ZXh0ICovCisgICAgbmd4X2h0dHBfcGVybF9jb21tYW5kcywgICAgICAgICAgICAgICAgLyogbW9kdWxlIGRpcmVjdGl2ZXMgKi8KKyAgICBOR1hfSFRUUF9NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgdHlwZSAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgbWFzdGVyICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtb2R1bGUgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IHByb2Nlc3MgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IHRocmVhZCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4aXQgdGhyZWFkICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXhpdCBwcm9jZXNzICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXhpdCBtYXN0ZXIgKi8KKyAgICBOR1hfTU9EVUxFX1YxX1BBRERJTkcKK307CisKKworI2RlZmluZSBOR1hfSFRUUF9QRVJMX1NTSV9TVUIgIDAKKyNkZWZpbmUgTkdYX0hUVFBfUEVSTF9TU0lfQVJHICAxCisKKworc3RhdGljIG5neF9odHRwX3NzaV9wYXJhbV90ICBuZ3hfaHR0cF9wZXJsX3NzaV9wYXJhbXNbXSA9IHsKKyAgICB7IG5neF9zdHJpbmcoInN1YiIpLCBOR1hfSFRUUF9QRVJMX1NTSV9TVUIsIDEsIDAgfSwKKyAgICB7IG5neF9zdHJpbmcoImFyZyIpLCBOR1hfSFRUUF9QRVJMX1NTSV9BUkcsIDAsIDEgfSwKKyAgICB7IG5neF9udWxsX3N0cmluZywgMCwgMCwgMCB9Cit9OworCisKK3N0YXRpYyBuZ3hfaHR0cF9zc2lfY29tbWFuZF90ICBuZ3hfaHR0cF9wZXJsX3NzaV9jb21tYW5kID0geworICAgIG5neF9zdHJpbmcoInBlcmwiKSwgbmd4X2h0dHBfcGVybF9zc2ksIG5neF9odHRwX3Blcmxfc3NpX3BhcmFtcywgMCwgMQorfTsKKworCitzdGF0aWMgdm9pZAorbmd4X2h0dHBfcGVybF94c19pbml0KHBUSFgpCit7CisgICAgbmV3WFMoIkR5bmFMb2FkZXI6OmJvb3RfRHluYUxvYWRlciIsIGJvb3RfRHluYUxvYWRlciwgX19GSUxFX18pOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3BlcmxfaGFuZGxlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCit7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgIHJjOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICB1cmksIGFyZ3M7CisgICAgbmd4X2h0dHBfcGVybF9jdHhfdCAgICAgICAgKmN0eDsKKyAgICBuZ3hfaHR0cF9wZXJsX2xvY19jb25mX3QgICAqcGxjZjsKKyAgICBuZ3hfaHR0cF9wZXJsX21haW5fY29uZl90ICAqcG1jZjsKKworICAgIC8qIFRPRE86IFdpbjMyICovCisgICAgaWYgKHItPnplcm9faW5fdXJpKSB7CisgICAgICAgIHJldHVybiBOR1hfSFRUUF9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsICJwZXJsIGhhbmRsZXIiKTsKKworICAgIC8qIG1vZF9wZXJsJ3MgY29udGVudCBoYW5kbGVyIGFzc3VtZXMgdGhhdCBjb250ZW50IHR5cGUgd2FzIGFscmVhZHkgc2V0ICovCisKKyAgICBpZiAobmd4X2h0dHBfc2V0X2NvbnRlbnRfdHlwZShyKSAhPSBOR1hfT0spIHsKKyAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICB9CisKKyAgICBjdHggPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2N0eChyLCBuZ3hfaHR0cF9wZXJsX21vZHVsZSk7CisKKyAgICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICAgICAgY3R4ID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3BlcmxfY3R4X3QpKTsKKyAgICAgICAgaWYgKGN0eCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgbmd4X2h0dHBfc2V0X2N0eChyLCBjdHgsIG5neF9odHRwX3BlcmxfbW9kdWxlKTsKKyAgICB9CisKKyAgICBwbWNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9tYWluX2NvbmYociwgbmd4X2h0dHBfcGVybF9tb2R1bGUpOworCisgICAgcmMgPSBuZ3hfaHR0cF9wZXJsX2dldF9pbnRlcnByZXRlcihwbWNmLCAmY3R4LT5wZXJsLCByLT5jb25uZWN0aW9uLT5sb2cpOworCisgICAgaWYgKHJjICE9IE5HWF9PSykgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgeworCisgICAgZFRIWGEoY3R4LT5wZXJsKTsKKworICAgIHBsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX3BlcmxfbW9kdWxlKTsKKworICAgIHJjID0gbmd4X2h0dHBfcGVybF9jYWxsX2hhbmRsZXIoYVRIWF8gciwgcGxjZi0+c3ViLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBsY2YtPmhhbmRsZXIsIE5VTEwpOworCisgICAgfQorCisgICAgbmd4X2h0dHBfcGVybF9mcmVlX2ludGVycHJldGVyKHBtY2YsIGN0eC0+cGVybCk7CisKKyAgICBpZiAocmMgPiA2MDApIHsKKyAgICAgICAgcmMgPSBOR1hfT0s7CisgICAgfQorCisgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgInBlcmwgaGFuZGxlciBkb25lOiAlaSIsIHJjKTsKKworICAgIGlmIChjdHgtPnJlZGlyZWN0X3VyaS5sZW4pIHsKKyAgICAgICAgdXJpID0gY3R4LT5yZWRpcmVjdF91cmk7CisgICAgICAgIGFyZ3MgPSBjdHgtPnJlZGlyZWN0X2FyZ3M7CisgICAgfQorCisgICAgY3R4LT5maWxlbmFtZSA9IE5VTEw7CisgICAgY3R4LT5yZWRpcmVjdF91cmkubGVuID0gMDsKKworICAgIGlmICh1cmkubGVuKSB7CisgICAgICAgIHJldHVybiBuZ3hfaHR0cF9pbnRlcm5hbF9yZWRpcmVjdChyLCAmdXJpLCAmYXJncyk7CisgICAgfQorCisgICAgaWYgKHJjID09IE5HWF9PSyB8fCByYyA9PSBOR1hfSFRUUF9PSykgeworICAgICAgICByZXR1cm4gbmd4X2h0dHBfc2VuZF9zcGVjaWFsKHIsIE5HWF9IVFRQX0xBU1QpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9wZXJsX3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwKKyAgICB1aW50cHRyX3QgZGF0YSkKK3sKKyAgICBuZ3hfaHR0cF9wZXJsX3ZhcmlhYmxlX3QgKnB2ID0gKG5neF9odHRwX3BlcmxfdmFyaWFibGVfdCAqKSBkYXRhOworCisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgIHJjOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICB2YWx1ZTsKKyAgICBuZ3hfaHR0cF9wZXJsX2N0eF90ICAgICAgICAqY3R4OworICAgIG5neF9odHRwX3BlcmxfbWFpbl9jb25mX3QgICpwbWNmOworCisgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgInBlcmwgdmFyaWFibGUgaGFuZGxlciIpOworCisgICAgY3R4ID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9jdHgociwgbmd4X2h0dHBfcGVybF9tb2R1bGUpOworCisgICAgaWYgKGN0eCA9PSBOVUxMKSB7CisgICAgICAgIGN0eCA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9wZXJsX2N0eF90KSk7CisgICAgICAgIGlmIChjdHggPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIG5neF9odHRwX3NldF9jdHgociwgY3R4LCBuZ3hfaHR0cF9wZXJsX21vZHVsZSk7CisgICAgfQorCisgICAgcG1jZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbWFpbl9jb25mKHIsIG5neF9odHRwX3BlcmxfbW9kdWxlKTsKKworICAgIHJjID0gbmd4X2h0dHBfcGVybF9nZXRfaW50ZXJwcmV0ZXIocG1jZiwgJmN0eC0+cGVybCwgci0+Y29ubmVjdGlvbi0+bG9nKTsKKworICAgIGlmIChyYyAhPSBOR1hfT0spIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHZhbHVlLmRhdGEgPSBOVUxMOworCisgICAgeworCisgICAgZFRIWGEoY3R4LT5wZXJsKTsKKworICAgIHJjID0gbmd4X2h0dHBfcGVybF9jYWxsX2hhbmRsZXIoYVRIWF8gciwgcHYtPnN1YiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdi0+aGFuZGxlciwgJnZhbHVlKTsKKworICAgIH0KKworICAgIG5neF9odHRwX3BlcmxfZnJlZV9pbnRlcnByZXRlcihwbWNmLCBjdHgtPnBlcmwpOworCisgICAgaWYgKHZhbHVlLmRhdGEpIHsKKyAgICAgICAgdi0+bGVuID0gdmFsdWUubGVuOworICAgICAgICB2LT52YWxpZCA9IDE7CisgICAgICAgIHYtPm5vX2NhY2hhYmxlID0gMDsKKyAgICAgICAgdi0+bm90X2ZvdW5kID0gMDsKKyAgICAgICAgdi0+ZGF0YSA9IHZhbHVlLmRhdGE7CisKKyAgICB9IGVsc2UgeworICAgICAgICB2LT5ub3RfZm91bmQgPSAxOworICAgIH0KKworICAgIGN0eC0+ZmlsZW5hbWUgPSBOVUxMOworICAgIGN0eC0+cmVkaXJlY3RfdXJpLmxlbiA9IDA7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfcGVybF9zc2kobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfaHR0cF9zc2lfY3R4X3QgKnNzaV9jdHgsCisgICAgbmd4X3N0cl90ICoqcGFyYW1zKQoreworICAgIFNWICAgICAgICAgICAgICAgICAgICAgICAgICpzdjsKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgcmM7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgKmhhbmRsZXI7CisgICAgbmd4X2h0dHBfcGVybF9jdHhfdCAgICAgICAgKmN0eDsKKyAgICBuZ3hfaHR0cF9wZXJsX21haW5fY29uZl90ICAqcG1jZjsKKworICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJwZXJsIHNzaSBoYW5kbGVyIik7CisKKyAgICBwbWNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9tYWluX2NvbmYociwgbmd4X2h0dHBfcGVybF9tb2R1bGUpOworCisgICAgY3R4ID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9jdHgociwgbmd4X2h0dHBfcGVybF9tb2R1bGUpOworCisgICAgaWYgKGN0eCA9PSBOVUxMKSB7CisgICAgICAgIGN0eCA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9wZXJsX2N0eF90KSk7CisgICAgICAgIGlmIChjdHggPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIG5neF9odHRwX3NldF9jdHgociwgY3R4LCBuZ3hfaHR0cF9wZXJsX21vZHVsZSk7CisgICAgfQorCisgICAgcmMgPSBuZ3hfaHR0cF9wZXJsX2dldF9pbnRlcnByZXRlcihwbWNmLCAmY3R4LT5wZXJsLCByLT5jb25uZWN0aW9uLT5sb2cpOworCisgICAgaWYgKHJjICE9IE5HWF9PSykgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgY3R4LT5zc2kgPSBzc2lfY3R4OworCisgICAgaGFuZGxlciA9IHBhcmFtc1tOR1hfSFRUUF9QRVJMX1NTSV9TVUJdOworICAgIGhhbmRsZXItPmRhdGFbaGFuZGxlci0+bGVuXSA9ICdcMCc7CisKKyAgICB7CisKKyAgICBkVEhYYShjdHgtPnBlcmwpOworCisjaWYgMAorCisgICAgbmd4X2h0dHBfcGVybF9ldmFsX2Fub25fc3ViKGFUSFhfIGhhbmRsZXIsICZzdik7CisKKyAgICBpZiAoc3YgPT0gJlBMX3N2X3VuZGVmKSB7CisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAiZXZhbF9wdihcIiVWXCIpIGZhaWxlZCIsIGhhbmRsZXIpOworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIGlmIChzdiA9PSBOVUxMKSB7CisgICAgICAgIHN2ID0gbmV3U1Zwdm4oKGNoYXIgKikgaGFuZGxlci0+ZGF0YSwgaGFuZGxlci0+bGVuKTsKKyAgICB9CisKKyNlbmRpZgorCisgICAgc3YgPSBuZXdTVnB2bigoY2hhciAqKSBoYW5kbGVyLT5kYXRhLCBoYW5kbGVyLT5sZW4pOworCisgICAgcmMgPSBuZ3hfaHR0cF9wZXJsX2NhbGxfaGFuZGxlcihhVEhYXyByLCBzdiwgJnBhcmFtc1tOR1hfSFRUUF9QRVJMX1NTSV9BUkddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciwgTlVMTCk7CisKKyAgICBTdlJFRkNOVF9kZWMoc3YpOworCisgICAgfQorCisgICAgbmd4X2h0dHBfcGVybF9mcmVlX2ludGVycHJldGVyKHBtY2YsIGN0eC0+cGVybCk7CisKKyAgICBjdHgtPmZpbGVuYW1lID0gTlVMTDsKKyAgICBjdHgtPnJlZGlyZWN0X3VyaS5sZW4gPSAwOworICAgIGN0eC0+c3NpID0gTlVMTDsKKworICAgIHJldHVybiByYzsKK30KKworCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9wZXJsX2dldF9pbnRlcnByZXRlcihuZ3hfaHR0cF9wZXJsX21haW5fY29uZl90ICpwbWNmLAorICAgIFBlcmxJbnRlcnByZXRlciAqKnBlcmwsIG5neF9sb2dfdCAqbG9nKQoreworICAgIGlmIChwbWNmLT5pbnRlcnApIHsKKyAgICAgICAgcG1jZi0+aW50ZXJwLS07CisKKyAgICAgICAgKnBlcmwgPSBwbWNmLT5mcmVlX3BlcmxzW3BtY2YtPmludGVycF07CisKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKKyAgICB9CisKKyAgICBpZiAocG1jZi0+bmFsbG9jIDwgcG1jZi0+aW50ZXJwX21heCkgeworICAgICAgICAqcGVybCA9IG5neF9odHRwX3BlcmxfY3JlYXRlX2ludGVycHJldGVyKHBtY2YsIGxvZyk7CisKKyAgICAgICAgaWYgKCpwZXJsKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX09LOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICB9CisKKyAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIGxvZywgMCwgIm5vIGZyZWUgcGVybCBpbnRlcnByZXRlciIpOworCisgICAgcmV0dXJuIE5HWF9IVFRQX1NFUlZJQ0VfVU5BVkFJTEFCTEU7Cit9CisKKworc3RhdGljIG5neF9pbmxpbmUgdm9pZAorbmd4X2h0dHBfcGVybF9mcmVlX2ludGVycHJldGVyKG5neF9odHRwX3BlcmxfbWFpbl9jb25mX3QgKnBtY2YsCisgICAgUGVybEludGVycHJldGVyICpwZXJsKQoreworICAgIHBtY2YtPmZyZWVfcGVybHNbcG1jZi0+aW50ZXJwKytdID0gcGVybDsKK30KKworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9wZXJsX2luaXRfaW50ZXJwcmV0ZXIobmd4X2NvbmZfdCAqY2YsIG5neF9odHRwX3BlcmxfbWFpbl9jb25mX3QgKnBtY2YpCit7CisgICAgbmd4X3Bvb2xfY2xlYW51cF90ICAgICAgICAgKmNsbjsKKworICAgIGNsbiA9IG5neF9wb29sX2NsZWFudXBfYWRkKGNmLT5wb29sLCAwKTsKKyAgICBpZiAoY2xuID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworI2lmZGVmIE5HWF9QRVJMX01PRFVMRVMKKyAgICBpZiAocG1jZi0+bW9kdWxlcy5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgcG1jZi0+bW9kdWxlcy5kYXRhID0gTkdYX1BFUkxfTU9EVUxFUzsKKyAgICB9CisjZW5kaWYKKworICAgIFBFUkxfU1lTX0lOSVQoJm5neF9hcmdjLCAmbmd4X2FyZ3YpOworCisgICAgcG1jZi0+cGVybCA9IG5neF9odHRwX3BlcmxfY3JlYXRlX2ludGVycHJldGVyKHBtY2YsIGNmLT5sb2cpOworCisgICAgaWYgKHBtY2YtPnBlcmwgPT0gTlVMTCkgeworICAgICAgICBQRVJMX1NZU19URVJNKCk7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBjbG4tPmhhbmRsZXIgPSBuZ3hfaHR0cF9wZXJsX2NsZWFudXBfcGVybDsKKyAgICBjbG4tPmRhdGEgPSBwbWNmLT5wZXJsOworCisgICAgcmV0dXJuIE5HWF9DT05GX09LOworfQorCisKK3N0YXRpYyBQZXJsSW50ZXJwcmV0ZXIgKgorbmd4X2h0dHBfcGVybF9jcmVhdGVfaW50ZXJwcmV0ZXIobmd4X2h0dHBfcGVybF9tYWluX2NvbmZfdCAqcG1jZiwKKyAgICBuZ3hfbG9nX3QgKmxvZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgbjsKKyAgICBjaGFyICAgICAgICAgICAgICAqZW1iZWRkaW5nWzZdOworICAgIGNoYXIgICAgICAgICAgICAgKipzY3JpcHQ7CisgICAgU1RSTEVOICAgICAgICAgICAgIGxlbjsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgZXJyOworICAgIG5neF91aW50X3QgICAgICAgICBpOworICAgIFBlcmxJbnRlcnByZXRlciAgICpwZXJsOworCisgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCBsb2csIDAsICJjcmVhdGUgcGVybCBpbnRlcnByZXRlciIpOworCisjaWYgKE5HWF9IQVZFX1BFUkxfQ0xPTkUpCisKKyAgICBpZiAocG1jZi0+cGVybCkgeworCisgICAgICAgIHBlcmwgPSBwZXJsX2Nsb25lKHBtY2YtPnBlcmwsIENMT05FZl9LRUVQX1BUUl9UQUJMRSk7CisgICAgICAgIGlmIChwZXJsID09IE5VTEwpIHsKKyAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19BTEVSVCwgbG9nLCAwLCAicGVybF9jbG9uZSgpIGZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICB7CisKKyAgICAgICAgZFRIWGEocGVybCk7CisKKyAgICAgICAgcHRyX3RhYmxlX2ZyZWUoUExfcHRyX3RhYmxlKTsKKyAgICAgICAgUExfcHRyX3RhYmxlID0gTlVMTDsKKworICAgICAgICB9CisKKyAgICAgICAgcG1jZi0+bmFsbG9jKys7CisKKyAgICAgICAgcmV0dXJuIHBlcmw7CisgICAgfQorCisjZW5kaWYKKworICAgIHBlcmwgPSBwZXJsX2FsbG9jKCk7CisgICAgaWYgKHBlcmwgPT0gTlVMTCkgeworICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIGxvZywgMCwgInBlcmxfYWxsb2MoKSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcGVybF9jb25zdHJ1Y3QocGVybCk7CisKKyAgICB7CisKKyAgICBkVEhYYShwZXJsKTsKKworI2lmZGVmIFBFUkxfRVhJVF9ERVNUUlVDVF9FTkQKKyAgICBQTF9leGl0X2ZsYWdzIHw9IFBFUkxfRVhJVF9ERVNUUlVDVF9FTkQ7CisjZW5kaWYKKworICAgIGVtYmVkZGluZ1swXSA9ICIiOworCisgICAgaWYgKHBtY2YtPm1vZHVsZXMuZGF0YSkgeworICAgICAgICBlbWJlZGRpbmdbMV0gPSAiLUkiOworICAgICAgICBlbWJlZGRpbmdbMl0gPSAoY2hhciAqKSBwbWNmLT5tb2R1bGVzLmRhdGE7CisgICAgICAgIG4gPSAzOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgbiA9IDE7CisgICAgfQorCisgICAgZW1iZWRkaW5nW24rK10gPSAiLU1uZ2lueCI7CisgICAgZW1iZWRkaW5nW24rK10gPSAiLWUiOworICAgIGVtYmVkZGluZ1tuKytdID0gIjAiOworCisgICAgbiA9IHBlcmxfcGFyc2UocGVybCwgbmd4X2h0dHBfcGVybF94c19pbml0LCBuLCBlbWJlZGRpbmcsIE5VTEwpOworCisgICAgaWYgKG4gIT0gMCkgeworICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIGxvZywgMCwgInBlcmxfcGFyc2UoKSBmYWlsZWQ6ICVkIiwgbik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBzY3JpcHQgPSBwbWNmLT5yZXF1aXJlcy5lbHRzOworICAgIGZvciAoaSA9IDA7IGkgPCBwbWNmLT5yZXF1aXJlcy5uZWx0czsgaSsrKSB7CisgICAgICAgIHJlcXVpcmVfcHYoc2NyaXB0W2ldKTsKKworICAgICAgICBpZiAoU3ZUUlVFKEVSUlNWKSkgeworCisgICAgICAgICAgICBlcnIuZGF0YSA9ICh1X2NoYXIgKikgU3ZQVihFUlJTViwgbGVuKTsKKyAgICAgICAgICAgIGZvciAobGVuLS07IGVyci5kYXRhW2xlbl0gPT0gTEYgfHwgZXJyLmRhdGFbbGVuXSA9PSBDUjsgbGVuLS0pIHsKKyAgICAgICAgICAgICAgICAvKiB2b2lkICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIubGVuID0gbGVuICsgMTsKKworICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBsb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlX3B2KFwiJXNcIikgZmFpbGVkOiBcIiVWXCIiLCBzY3JpcHRbaV0sICZlcnIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgfQorCisgICAgcG1jZi0+bmFsbG9jKys7CisKKyAgICByZXR1cm4gcGVybDsKKworZmFpbDoKKworICAgICh2b2lkKSBwZXJsX2Rlc3RydWN0KHBlcmwpOworCisgICAgcGVybF9mcmVlKHBlcmwpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworI2lmIChfX0lOVEVMX0NPTVBJTEVSKQorLyoKKyAqIGRpc2FibGUgJ2RlY2xhcmF0aW9uIGhpZGVzIHBhcmFtZXRlciAibXlfcGVybCInIHdhcm5pbmcgZm9yIEVOVEVSIGFuZCBMRUFWRQorICovCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZToxNTk5KQorI2VuZGlmCisKKworc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfcGVybF9jYWxsX2hhbmRsZXIocFRIWF8gbmd4X2h0dHBfcmVxdWVzdF90ICpyLCBTViAqc3ViLAorICAgIG5neF9zdHJfdCAqKmFyZ3MsIG5neF9zdHJfdCAqaGFuZGxlciwgbmd4X3N0cl90ICpydikKK3sKKyAgICBTViAgICAgICAgICAqc3Y7CisgICAgaW50ICAgICAgICAgIG4sIHN0YXR1czsKKyAgICBjaGFyICAgICAgICAqbGluZTsKKyAgICBTVFJMRU4gICAgICAgbGVuLCBuX2E7CisgICAgbmd4X3N0cl90ICAgIGVycjsKKyAgICBuZ3hfdWludF90ICAgaTsKKworICAgIGRTUDsKKworICAgIHN0YXR1cyA9IDA7CisKKyAgICBFTlRFUjsKKyAgICBTQVZFVE1QUzsKKworICAgIFBVU0hNQVJLKHNwKTsKKworICAgIHN2ID0gc3ZfbmV3bW9ydGFsKCk7CisgICAgc3Zfc2V0cmVmX3B2KHN2LCAibmdpbngiLCByKTsKKyAgICBYUFVTSHMoc3YpOworCisgICAgaWYgKGFyZ3MpIHsKKyAgICAgICAgZm9yIChpID0gMDsgYXJnc1tpXTsgaSsrKSB7IC8qIHZvaWQgKi8gfQorCisgICAgICAgIEVYVEVORChzcCwgKGludCkgaSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgYXJnc1tpXTsgaSsrKSB7CisgICAgICAgICAgICBQVVNIcyhzdl8ybW9ydGFsKG5ld1NWcHZuKChjaGFyICopIGFyZ3NbaV0tPmRhdGEsIGFyZ3NbaV0tPmxlbikpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFBVVEJBQ0s7CisKKyAgICBuID0gY2FsbF9zdihzdWIsIEdfRVZBTCk7CisKKyAgICBTUEFHQUlOOworCisgICAgaWYgKG4pIHsKKyAgICAgICAgaWYgKHJ2ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBPUGk7CisKKyAgICAgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbGxfc3Y6ICVkIiwgc3RhdHVzKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGluZSA9IFBPUHB4OworICAgICAgICAgICAgcnYtPmxlbiA9IG5fYTsKKworICAgICAgICAgICAgcnYtPmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIG5fYSk7CisgICAgICAgICAgICBpZiAocnYtPmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5neF9tZW1jcHkocnYtPmRhdGEsIGxpbmUsIG5fYSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQVVRCQUNLOworCisgICAgRlJFRVRNUFM7CisgICAgTEVBVkU7CisKKyAgICAvKiBjaGVjayAkQCAqLworCisgICAgaWYgKFN2VFJVRShFUlJTVikpIHsKKworICAgICAgICBlcnIuZGF0YSA9ICh1X2NoYXIgKikgU3ZQVihFUlJTViwgbGVuKTsKKyAgICAgICAgZm9yIChsZW4tLTsgZXJyLmRhdGFbbGVuXSA9PSBMRiB8fCBlcnIuZGF0YVtsZW5dID09IENSOyBsZW4tLSkgeworICAgICAgICAgICAgLyogdm9pZCAqLworICAgICAgICB9CisgICAgICAgIGVyci5sZW4gPSBsZW4gKyAxOworCisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAiY2FsbF9zdihcIiVWXCIpIGZhaWxlZDogXCIlVlwiIiwKKyAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLCAmZXJyKTsKKworICAgICAgICBpZiAocnYpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgIH0KKworICAgIGlmIChuICE9IDEpIHsKKyAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgImNhbGxfc3YoXCIlVlwiKSByZXR1cm5lZCAlZCByZXN1bHRzIiwgaGFuZGxlciwgbik7CisgICAgICAgIHN0YXR1cyA9IE5HWF9PSzsKKyAgICB9CisKKyAgICBpZiAocnYpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKKyAgICB9CisKKyAgICByZXR1cm4gKG5neF9pbnRfdCkgc3RhdHVzOworfQorCisKKyNpZiAoX19JTlRFTF9DT01QSUxFUikKKyNwcmFnbWEgd2FybmluZyhkZWZhdWx0OjE1OTkpCisjZW5kaWYKKworCitzdGF0aWMgdm9pZAorbmd4X2h0dHBfcGVybF9ldmFsX2Fub25fc3ViKHBUSFhfIG5neF9zdHJfdCAqaGFuZGxlciwgU1YgKipzdikKK3sKKyAgICBpZiAobmd4X3N0cm5jbXAoaGFuZGxlci0+ZGF0YSwgInN1YiAiLCA0KSA9PSAwCisgICAgICAgIHx8IG5neF9zdHJuY21wKGhhbmRsZXItPmRhdGEsICJ1c2UgIiwgNCkgPT0gMCkKKyAgICB7CisgICAgICAgICpzdiA9IGV2YWxfcHYoKGNoYXIgKikgaGFuZGxlci0+ZGF0YSwgRkFMU0UpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAqc3YgPSBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkICoKK25neF9odHRwX3BlcmxfY3JlYXRlX21haW5fY29uZihuZ3hfY29uZl90ICpjZikKK3sKKyAgICBuZ3hfaHR0cF9wZXJsX21haW5fY29uZl90ICAqcG1jZjsKKworICAgIHBtY2YgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3BlcmxfbWFpbl9jb25mX3QpKTsKKyAgICBpZiAocG1jZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBwbWNmLT5pbnRlcnBfbWF4ID0gTkdYX0NPTkZfVU5TRVRfVUlOVDsKKworICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmcG1jZi0+cmVxdWlyZXMsIGNmLT5wb29sLCAxLCBzaXplb2YodV9jaGFyICopKQorICAgICAgICAhPSBOR1hfT0spCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcG1jZjsKK30KKworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9wZXJsX2luaXRfbWFpbl9jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpjb25mKQoreworICAgIG5neF9odHRwX3BlcmxfbWFpbl9jb25mX3QgKnBtY2YgPSBjb25mOworCisjaWYgKE5HWF9IQVZFX1BFUkxfQ0xPTkUgfHwgTkdYX0hBVkVfUEVSTF9NVUxUSVBMSUNJVFkpCisgICAgbmd4X2NvbmZfaW5pdF91bnNpZ25lZF92YWx1ZShwbWNmLT5pbnRlcnBfbWF4LCAxMCk7CisjZWxzZQorICAgIG5neF9jb25mX2luaXRfdW5zaWduZWRfdmFsdWUocG1jZi0+aW50ZXJwX21heCwgMSk7CisjZW5kaWYKKworICAgIHBtY2YtPmZyZWVfcGVybHMgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWNmLT5pbnRlcnBfbWF4ICogc2l6ZW9mKFBlcmxJbnRlcnByZXRlciAqKSk7CisgICAgaWYgKHBtY2YtPmZyZWVfcGVybHMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgaWYgKHBtY2YtPnBlcmwgPT0gTlVMTCkgeworICAgICAgICBpZiAobmd4X2h0dHBfcGVybF9pbml0X2ludGVycHJldGVyKGNmLCBwbWNmKSAhPSBOR1hfQ09ORl9PSykgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisjaWYgIShOR1hfSEFWRV9QRVJMX0NMT05FKQorICAgIG5neF9odHRwX3BlcmxfZnJlZV9pbnRlcnByZXRlcihwbWNmLCBwbWNmLT5wZXJsKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIE5HWF9DT05GX09LOworfQorCisKK3N0YXRpYyB2b2lkCituZ3hfaHR0cF9wZXJsX2NsZWFudXBfcGVybCh2b2lkICpkYXRhKQoreworICAgIFBlcmxJbnRlcnByZXRlciAqcGVybCA9IGRhdGE7CisKKyAgICAodm9pZCkgcGVybF9kZXN0cnVjdChwZXJsKTsKKworICAgIHBlcmxfZnJlZShwZXJsKTsKKworICAgIFBFUkxfU1lTX1RFUk0oKTsKK30KKworCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9wZXJsX3ByZWNvbmZpZ3VyYXRpb24obmd4X2NvbmZfdCAqY2YpCit7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgcmM7CisgICAgbmd4X2h0dHBfc3NpX21haW5fY29uZl90ICAqc21jZjsKKworICAgIHNtY2YgPSBuZ3hfaHR0cF9jb25mX2dldF9tb2R1bGVfbWFpbl9jb25mKGNmLCBuZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZSk7CisKKyAgICByYyA9IG5neF9oYXNoX2FkZF9rZXkoJnNtY2YtPmNvbW1hbmRzLCAmbmd4X2h0dHBfcGVybF9zc2lfY29tbWFuZC5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmd4X2h0dHBfcGVybF9zc2lfY29tbWFuZCwgTkdYX0hBU0hfUkVBRE9OTFlfS0VZKTsKKworICAgIGlmIChyYyAhPSBOR1hfT0spIHsKKyAgICAgICAgaWYgKHJjID09IE5HWF9CVVNZKSB7CisgICAgICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZsaWN0aW5nIFNTSSBjb21tYW5kIFwiJVZcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5neF9odHRwX3Blcmxfc3NpX2NvbW1hbmQubmFtZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBOR1hfT0s7Cit9CisKKworc3RhdGljIHZvaWQgKgorbmd4X2h0dHBfcGVybF9jcmVhdGVfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YpCit7CisgICAgbmd4X2h0dHBfcGVybF9sb2NfY29uZl90ICpwbGNmOworCisgICAgcGxjZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfcGVybF9sb2NfY29uZl90KSk7CisgICAgaWYgKHBsY2YgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBzZXQgYnkgbmd4X3BjYWxsb2MoKToKKyAgICAgKgorICAgICAqICAgICBwbGNmLT5oYW5kbGVyID0geyAwLCBOVUxMIH07CisgICAgICovCisKKyAgICByZXR1cm4gcGxjZjsKK30KKworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9wZXJsX21lcmdlX2xvY19jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKQoreworICAgIG5neF9odHRwX3BlcmxfbG9jX2NvbmZfdCAqcHJldiA9IHBhcmVudDsKKyAgICBuZ3hfaHR0cF9wZXJsX2xvY19jb25mX3QgKmNvbmYgPSBjaGlsZDsKKworICAgIGlmIChjb25mLT5zdWIgPT0gTlVMTCkgeworICAgICAgICBjb25mLT5zdWIgPSBwcmV2LT5zdWI7CisgICAgICAgIGNvbmYtPmhhbmRsZXIgPSBwcmV2LT5oYW5kbGVyOworICAgIH0KKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KKworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9wZXJsX3JlcXVpcmUobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKK3sKKyAgICBuZ3hfaHR0cF9wZXJsX21haW5fY29uZl90ICpwbWNmID0gY29uZjsKKworICAgIHVfY2hhciAgICAgKipwOworICAgIG5neF9zdHJfdCAgICp2YWx1ZTsKKworICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7CisKKyAgICBwID0gbmd4X2FycmF5X3B1c2goJnBtY2YtPnJlcXVpcmVzKTsKKworICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgICpwID0gdmFsdWVbMV0uZGF0YTsKKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KKworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9wZXJsKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpCit7CisgICAgbmd4X2h0dHBfcGVybF9sb2NfY29uZl90ICpwbGNmID0gY29uZjsKKworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICp2YWx1ZTsKKyAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICAqY2xjZjsKKyAgICBuZ3hfaHR0cF9wZXJsX21haW5fY29uZl90ICAqcG1jZjsKKworICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7CisKKyAgICBpZiAocGxjZi0+aGFuZGxlci5kYXRhKSB7CisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdXBsaWNhdGUgcGVybCBoYW5kbGVyIFwiJVZcIiIsICZ2YWx1ZVsxXSk7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBwbWNmID0gbmd4X2h0dHBfY29uZl9nZXRfbW9kdWxlX21haW5fY29uZihjZiwgbmd4X2h0dHBfcGVybF9tb2R1bGUpOworCisgICAgaWYgKHBtY2YtPnBlcmwgPT0gTlVMTCkgeworICAgICAgICBpZiAobmd4X2h0dHBfcGVybF9pbml0X2ludGVycHJldGVyKGNmLCBwbWNmKSAhPSBOR1hfQ09ORl9PSykgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgcGxjZi0+aGFuZGxlciA9IHZhbHVlWzFdOworCisgICAgeworCisgICAgZFRIWGEocG1jZi0+cGVybCk7CisKKyAgICBuZ3hfaHR0cF9wZXJsX2V2YWxfYW5vbl9zdWIoYVRIWF8gJnZhbHVlWzFdLCAmcGxjZi0+c3ViKTsKKworICAgIGlmIChwbGNmLT5zdWIgPT0gJlBMX3N2X3VuZGVmKSB7CisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZhbF9wdihcIiVWXCIpIGZhaWxlZCIsICZ2YWx1ZVsxXSk7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAocGxjZi0+c3ViID09IE5VTEwpIHsKKyAgICAgICAgcGxjZi0+c3ViID0gbmV3U1Zwdm4oKGNoYXIgKikgdmFsdWVbMV0uZGF0YSwgdmFsdWVbMV0ubGVuKTsKKyAgICB9CisKKyAgICB9CisKKyAgICBjbGNmID0gbmd4X2h0dHBfY29uZl9nZXRfbW9kdWxlX2xvY19jb25mKGNmLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CisgICAgY2xjZi0+aGFuZGxlciA9IG5neF9odHRwX3BlcmxfaGFuZGxlcjsKKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KKworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9wZXJsX3NldChuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQoreworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICBpbmRleDsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAqdmFsdWU7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgICAgICAgKnY7CisgICAgbmd4X2h0dHBfcGVybF92YXJpYWJsZV90ICAgKnB2OworICAgIG5neF9odHRwX3BlcmxfbWFpbl9jb25mX3QgICpwbWNmOworCisgICAgdmFsdWUgPSBjZi0+YXJncy0+ZWx0czsKKworICAgIGlmICh2YWx1ZVsxXS5kYXRhWzBdICE9ICckJykgeworICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCB2YXJpYWJsZSBuYW1lIFwiJVZcIiIsICZ2YWx1ZVsxXSk7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICB2YWx1ZVsxXS5sZW4tLTsKKyAgICB2YWx1ZVsxXS5kYXRhKys7CisKKyAgICB2ID0gbmd4X2h0dHBfYWRkX3ZhcmlhYmxlKGNmLCAmdmFsdWVbMV0sIE5HWF9IVFRQX1ZBUl9DSEFOR0FCTEUpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIHB2ID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3BlcmxfdmFyaWFibGVfdCkpOworICAgIGlmIChwdiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBpbmRleCA9IG5neF9odHRwX2dldF92YXJpYWJsZV9pbmRleChjZiwgJnZhbHVlWzFdKTsKKyAgICBpZiAoaW5kZXggPT0gTkdYX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBwbWNmID0gbmd4X2h0dHBfY29uZl9nZXRfbW9kdWxlX21haW5fY29uZihjZiwgbmd4X2h0dHBfcGVybF9tb2R1bGUpOworCisgICAgaWYgKHBtY2YtPnBlcmwgPT0gTlVMTCkgeworICAgICAgICBpZiAobmd4X2h0dHBfcGVybF9pbml0X2ludGVycHJldGVyKGNmLCBwbWNmKSAhPSBOR1hfQ09ORl9PSykgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgcHYtPmhhbmRsZXIgPSB2YWx1ZVsyXTsKKworICAgIHsKKworICAgIGRUSFhhKHBtY2YtPnBlcmwpOworCisgICAgbmd4X2h0dHBfcGVybF9ldmFsX2Fub25fc3ViKGFUSFhfICZ2YWx1ZVsyXSwgJnB2LT5zdWIpOworCisgICAgaWYgKHB2LT5zdWIgPT0gJlBMX3N2X3VuZGVmKSB7CisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZhbF9wdihcIiVWXCIpIGZhaWxlZCIsICZ2YWx1ZVsyXSk7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAocHYtPnN1YiA9PSBOVUxMKSB7CisgICAgICAgIHB2LT5zdWIgPSBuZXdTVnB2bigoY2hhciAqKSB2YWx1ZVsyXS5kYXRhLCB2YWx1ZVsyXS5sZW4pOworICAgIH0KKworICAgIH0KKworICAgIHYtPmhhbmRsZXIgPSBuZ3hfaHR0cF9wZXJsX3ZhcmlhYmxlOworICAgIHYtPmRhdGEgPSAodWludHB0cl90KSBwdjsKKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KKworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9wZXJsX2ludGVycF9tYXhfdW5zdXBwb3J0ZWQobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBvc3QsIHZvaWQgKmRhdGEpCit7CisjaWYgKE5HWF9IQVZFX1BFUkxfQ0xPTkUgfHwgTkdYX0hBVkVfUEVSTF9NVUxUSVBMSUNJVFkpCisKKyAgICByZXR1cm4gTkdYX0NPTkZfT0s7CisKKyNlbHNlCisKKyAgICByZXR1cm4gInRvIHVzZSBwZXJsX2ludGVycF9tYXggeW91IGhhdmUgdG8gYnVpbGQgcGVybCB3aXRoICIKKyAgICAgICAgICAgIi1EdXNlbXVsdGlwbGljaXR5IG9yIC1EdXNldGhyZWFkcyBvcHRpb25zIjsKKworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL3Blcmwvbmd4X2h0dHBfcGVybF9tb2R1bGUuaCBiL3NyYy9odHRwL21vZHVsZXMvcGVybC9uZ3hfaHR0cF9wZXJsX21vZHVsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMTkxN2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaHR0cC9tb2R1bGVzL3Blcmwvbmd4X2h0dHBfcGVybF9tb2R1bGUuaApAQCAtMCwwICsxLDQ5IEBACisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIElnb3IgU3lzb2V2CisgKi8KKworCisjaWZuZGVmIF9OR1hfSFRUUF9QRVJMX01PRFVMRV9IX0lOQ0xVREVEXworI2RlZmluZSBfTkdYX0hUVFBfUEVSTF9NT0RVTEVfSF9JTkNMVURFRF8KKworCisjaW5jbHVkZSA8bmd4X2NvbmZpZy5oPgorI2luY2x1ZGUgPG5neF9jb3JlLmg+CisjaW5jbHVkZSA8bmd4X2h0dHAuaD4KKworI2luY2x1ZGUgPEVYVEVSTi5oPgorI2luY2x1ZGUgPHBlcmwuaD4KKworCit0eXBlZGVmIG5neF9odHRwX3JlcXVlc3RfdCAgICpuZ2lueDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFBlcmxJbnRlcnByZXRlciAgICAgICAgICAqcGVybDsKKworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAqZmlsZW5hbWU7CisKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgIHJlZGlyZWN0X3VyaTsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgIHJlZGlyZWN0X2FyZ3M7CisKKyAgICBuZ3hfaHR0cF9zc2lfY3R4X3QgICAgICAgKnNzaTsKK30gbmd4X2h0dHBfcGVybF9jdHhfdDsKKworCitleHRlcm4gbmd4X21vZHVsZV90ICBuZ3hfaHR0cF9wZXJsX21vZHVsZTsKKworCisvKgorICogd29ya2Fyb3VuZCBmb3IgInVudXNlZCB2YXJpYWJsZSBgUGVybF9fX25vdHVzZWQnIiB3YXJuaW5nCisgKiB3aGVuIGJ1aWxkaW5nIHdpdGggcGVybCA1LjYuMQorICovCisjaWZuZGVmIFBFUkxfSU1QTElDSVRfQ09OVEVYVAorI3VuZGVmICBkVEhYYQorI2RlZmluZSBkVEhYYShhKQorI2VuZGlmCisKKworZXh0ZXJuIHZvaWQgYm9vdF9EeW5hTG9hZGVyIChwVEhYXyBDViogY3YpOworCisKKyNlbmRpZiAvKiBfTkdYX0hUVFBfUEVSTF9NT0RVTEVfSF9JTkNMVURFRF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvcGVybC90eXBlbWFwIGIvc3JjL2h0dHAvbW9kdWxlcy9wZXJsL3R5cGVtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJmMWE0YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9odHRwL21vZHVsZXMvcGVybC90eXBlbWFwCkBAIC0wLDAgKzEsMyBAQAorVFlQRU1BUAorCituZ2lueAlUX1BUUk9CSgo=