ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDMzOWY0OTkuLjY2ZjYwMzMgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMTMsMTAgKzEzLDE0IEBACiBMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKS9zcmMvaW5jbHVkZQogTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChMT0NBTF9QQVRIKS9BbmRyb2lkLm1rICQoTE9DQUxfUEFUSCkvY3J5cHRvLXNvdXJjZXMubWsKIExPQ0FMX1NES19WRVJTSU9OIDo9IDkKLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuIC1EQk9SSU5HU1NMX1NIQVJFRF9MSUJSQVJZIC1EQk9SSU5HU1NMX0lNUExFTUVOVEFUSU9OIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorTE9DQUxfQ0ZMQUdTID0gLVduby11bnVzZWQtcGFyYW1ldGVyCiAjIHNoYTI1Ni1hcm12NC5TIGRvZXMgbm90IGNvbXBpbGUgd2l0aCBjbGFuZy4KIExPQ0FMX0NMQU5HX0FTRkxBR1NfYXJtICs9IC1uby1pbnRlZ3JhdGVkLWFzCi1MT0NBTF9DTEFOR19BU0ZMQUdTX2FybTY0ICs9IC1tYXJjaD1hcm12OC1hK2NyeXB0bworaWZlcSAoJChUQVJHRVRfQVJDSCksYXJtNjQpCitpZmVxICgkKFVTRV9DTEFOR19QTEFURk9STV9CVUlMRCksdHJ1ZSkKK0xPQ0FMX0FTRkxBR1MgKz0gLW1hcmNoPWFybXY4LWErY3J5cHRvCitlbmRpZgorZW5kaWYKIGluY2x1ZGUgJChMT0NBTF9QQVRIKS9jcnlwdG8tc291cmNlcy5tawogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQogCkBAIC0zMCw3ICszNCwxMSBAQAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gOQogIyBzaGEyNTYtYXJtdjQuUyBkb2VzIG5vdCBjb21waWxlIHdpdGggY2xhbmcuCiBMT0NBTF9DTEFOR19BU0ZMQUdTX2FybSArPSAtbm8taW50ZWdyYXRlZC1hcwotTE9DQUxfQ0xBTkdfQVNGTEFHU19hcm02NCArPSAtbWFyY2g9YXJtdjgtYStjcnlwdG8KK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybTY0KQoraWZlcSAoJChVU0VfQ0xBTkdfUExBVEZPUk1fQlVJTEQpLHRydWUpCitMT0NBTF9BU0ZMQUdTICs9IC1tYXJjaD1hcm12OC1hK2NyeXB0bworZW5kaWYKK2VuZGlmCiBpbmNsdWRlICQoTE9DQUxfUEFUSCkvY3J5cHRvLXNvdXJjZXMubWsKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIApAQCAtNDEsNyArNDksNyBAQAogTE9DQUxfTU9EVUxFIDo9IGJzc2wKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiBMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKExPQ0FMX1BBVEgpL0FuZHJvaWQubWsgJChMT0NBTF9QQVRIKS9zb3VyY2VzLm1rCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtREJPUklOR1NTTF9TSEFSRURfTElCUkFSWSAtREJPUklOR1NTTF9JTVBMRU1FTlRBVElPTiAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyA9IC1Xbm8tdW51c2VkLXBhcmFtZXRlcgogTE9DQUxfU0hBUkVEX0xJQlJBUklFUz1saWJjcnlwdG8gbGlic3NsCiBpbmNsdWRlICQoTE9DQUxfUEFUSCkvc291cmNlcy5tawogTE9DQUxfU1JDX0ZJTEVTID0gJCh0b29sX3NvdXJjZXMpCkBAIC01Myw3ICs2MSw3IEBACiBMT0NBTF9NT0RVTEUgOj0gbGliY3J5cHRvX3N0YXRpYwogTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkvc3JjL2luY2x1ZGUKIExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoTE9DQUxfUEFUSCkvQW5kcm9pZC5tayAkKExPQ0FMX1BBVEgpL2NyeXB0by1zb3VyY2VzLm1rCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtREJPUklOR1NTTF9TSEFSRURfTElCUkFSWSAtREJPUklOR1NTTF9JTVBMRU1FTlRBVElPTiAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyA9IC1Xbm8tdW51c2VkLXBhcmFtZXRlcgogIyBXaW5kb3dzIGFuZCBNYWNzIGJvdGggaGF2ZSBwcm9ibGVtcyB3aXRoIGFzc2VtYmx5IGZpbGVzCiBpZm5lcSAoJChIT1NUX09TKSxsaW51eCkKIExPQ0FMX0NGTEFHUyArPSAtRE9QRU5TU0xfTk9fQVNNCkBAIC04Niw3ICs5NCw3IEBACiBMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKS9zcmMvaW5jbHVkZQogTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChMT0NBTF9QQVRIKS9BbmRyb2lkLm1rICQoTE9DQUxfUEFUSCkvc3NsLXNvdXJjZXMubWsKIExPQ0FMX1NES19WRVJTSU9OIDo9IDkKLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuIC1EQk9SSU5HU1NMX1NIQVJFRF9MSUJSQVJZIC1EQk9SSU5HU1NMX0lNUExFTUVOVEFUSU9OIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorTE9DQUxfQ0ZMQUdTID0gLVduby11bnVzZWQtcGFyYW1ldGVyCiBpbmNsdWRlICQoTE9DQUxfUEFUSCkvc3NsLXNvdXJjZXMubWsKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKIApAQCAtMTA4LDI3ICsxMTYsMTAgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJzc2xfc3RhdGljLWhvc3QKIExPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpL3NyYy9pbmNsdWRlCiBMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKExPQ0FMX1BBVEgpL0FuZHJvaWQubWsgJChMT0NBTF9QQVRIKS9zc2wtc291cmNlcy5tawotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gLURCT1JJTkdTU0xfU0hBUkVEX0xJQlJBUlkgLURCT1JJTkdTU0xfSU1QTEVNRU5UQVRJT04gLVduby11bnVzZWQtcGFyYW1ldGVyCitMT0NBTF9DRkxBR1MgPSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKIGluY2x1ZGUgJChMT0NBTF9QQVRIKS9zc2wtc291cmNlcy5tawogaW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCiAKLSMgSG9zdCBzdGF0aWMgdG9vbCAoZm9yIGxpbnV4IG9ubHkpLgotaWZlcSAoJChIT1NUX09TKSwgbGludXgpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yIC1zdGQ9YysrMHgKLUxPQ0FMX0NQUF9FWFRFTlNJT04gOj0gY2MKLUxPQ0FMX01PRFVMRSA6PSBic3NsCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChMT0NBTF9QQVRIKS9BbmRyb2lkLm1rICQoTE9DQUxfUEFUSCkvc291cmNlcy5tawotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gLURCT1JJTkdTU0xfU0hBUkVEX0xJQlJBUlkgLURCT1JJTkdTU0xfSU1QTEVNRU5UQVRJT04gLVduby11bnVzZWQtcGFyYW1ldGVyCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTPWxpYmNyeXB0by1ob3N0IGxpYnNzbC1ob3N0Ci0jIE5lZWRlZCBmb3IgY2xvY2tfZ2V0dGltZS4KLUxPQ0FMX0xERkxBR1MgOj0gLWxydAotaW5jbHVkZSAkKExPQ0FMX1BBVEgpL3NvdXJjZXMubWsKLUxPQ0FMX1NSQ19GSUxFUyA9ICQodG9vbF9zb3VyY2VzKQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKLWVuZGlmICAjIEhPU1RfT1MgPT0gbGludXgKLQogIyBIb3N0IHNoYXJlZCBsaWJyYXJ5CiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCmRpZmYgLS1naXQgYS9CT1JJTkdTU0xfUkVWSVNJT04gYi9CT1JJTkdTU0xfUkVWSVNJT04KaW5kZXggZjNkZDMyMy4uZDYzZmM4NiAxMDA2NDQKLS0tIGEvQk9SSU5HU1NMX1JFVklTSU9OCisrKyBiL0JPUklOR1NTTF9SRVZJU0lPTgpAQCAtMSArMSBAQAotZDk4ZGMxMzExZTIwMTkzYWMxODhlMzU5ZTkxYWVhYWY1Y2MzYTdlMgorYWYwZTMyY2I4NGYwYzljYzY1YjkyMzNhMzQxNGQyNTYyNjQyYjM0MgpkaWZmIC0tZ2l0IGEvVVBEQVRJTkcgYi9VUERBVElORwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhZjY2ZC4uMDAwMDAwMAotLS0gYS9VUERBVElORworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcm0gLVJmIHNyYwotZ2l0IGNsb25lIGh0dHBzOi8vYm9yaW5nc3NsLmdvb2dsZXNvdXJjZS5jb20vYm9yaW5nc3NsIHNyYwotY2Qgc3JjCi1naXQgc2hvdyAtcyAtLXByZXR0eT0lSCA+IC4uL0JPUklOR1NTTF9SRVZJU0lPTgotY2QgLi4KLXJtIC1SZiBzcmMvLmdpdAotcm0gLVJmIGxpbnV4LWFhcmNoNjQvIGxpbnV4LWFybS8gbGludXgteDg2LyBsaW51eC14ODZfNjQvIG1hYy14ODYvIG1hYy14ODZfNjQvIHdpbi14ODZfNjQvIHdpbi14ODYvCi1weXRob24gc3JjL3V0aWwvZ2VuZXJhdGVfYnVpbGRfZmlsZXMucHkgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY3J5cHRvLXNvdXJjZXMubWsgYi9jcnlwdG8tc291cmNlcy5tawppbmRleCBkOTBkMTA5Li43ODE5NGYyIDEwMDY0NAotLS0gYS9jcnlwdG8tc291cmNlcy5taworKysgYi9jcnlwdG8tc291cmNlcy5tawpAQCAtMSw4ICsxLDcgQEAKIExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTICs9ICQoTE9DQUxfUEFUSCkvc291cmNlcy5tawogaW5jbHVkZSAkKExPQ0FMX1BBVEgpL3NvdXJjZXMubWsKIAotTE9DQUxfQ0ZMQUdTICs9IC1JJChMT0NBTF9QQVRIKS9zcmMvaW5jbHVkZSAtSSQoTE9DQUxfUEFUSCkvc3JjL2NyeXB0byAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLURCT1JJTkdTU0xfQU5EUk9JRF9TWVNURU0KLUxPQ0FMX0FTRkxBR1MgKz0gLUkkKExPQ0FMX1BBVEgpL3NyYy9pbmNsdWRlIC1JJChMT0NBTF9QQVRIKS9zcmMvY3J5cHRvIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorTE9DQUxfQ0ZMQUdTICs9IC1JJChMT0NBTF9QQVRIKS9zcmMvaW5jbHVkZSAtSSQoTE9DQUxfUEFUSCkvc3JjL2NyeXB0byAtV25vLXVudXNlZC1wYXJhbWV0ZXIKICMgRG8gbm90IGFkZCBpbiB0aGUgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGZpbGVzIGlmIHdlIGRvbid0IHdhbnQgdG8gYnVpbGQgYXNzZW1ibHkKIGlmZXEgKCwkKGZpbHRlciAtRE9QRU5TU0xfTk9fQVNNLCQoTE9DQUxfQ0ZMQUdTKSkpCiBMT0NBTF9TUkNfRklMRVNfeDg2ID0gJChsaW51eF94ODZfc291cmNlcykKZGlmZiAtLWdpdCBhL2Vycl9kYXRhLmMgYi9lcnJfZGF0YS5jCmluZGV4IDI1OGE1YzMuLjVhNzkxMzcgMTAwNjQ0Ci0tLSBhL2Vycl9kYXRhLmMKKysrIGIvZXJyX2RhdGEuYwpAQCAtNDksMTgzICs0OSwxNTM2IEBACiBPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfSE1BQyA9PSAyOCwgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8yOCk7CiBPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfRElHRVNUID09IDI5LCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzI5KTsKIE9QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9DSVBIRVIgPT0gMzAsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMzApOwotT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX0hLREYgPT0gMzEsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMzEpOwotT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX1VTRVIgPT0gMzIsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMzIpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX1VTRVIgPT0gMzEsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMzEpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX0hLREYgPT0gMzIsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMzIpOwogT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTlVNX0xJQlMgPT0gMzMsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfbnVtKTsKIAorY29uc3QgdWludDMyX3Qga09wZW5TU0xGdW5jdGlvblZhbHVlc1tdID0geworICAgIDB4YzMyMDU0YiwKKyAgICAweGMzMjg1NTYsCisgICAgMHhjMzMwNTYxLAorICAgIDB4YzMzODU2ZSwKKyAgICAweGMzNDA1NzgsCisgICAgMHhjMzQ4NTgyLAorICAgIDB4YzM1MDU4OSwKKyAgICAweGMzNTg1OTUsCisgICAgMHhjMzYwNTljLAorICAgIDB4YzM2ODViMiwKKyAgICAweGMzNzA1ZDEsCisgICAgMHhjMzc4NWUyLAorICAgIDB4YzM4MDVmMiwKKyAgICAweGMzODg2MGMsCisgICAgMHhjMzkwNjIxLAorICAgIDB4YzM5ODYzMCwKKyAgICAweGMzYTA2NDksCisgICAgMHhjM2E4NjVkLAorICAgIDB4YzNiMDY2OSwKKyAgICAweGMzYjg2NzAsCisgICAgMHhjM2MwNjc4LAorICAgIDB4YzNjODY5MCwKKyAgICAweGMzZDA2OTgsCisgICAgMHhjM2Q4NmEwLAorICAgIDB4YzNlMDZhYiwKKyAgICAweGMzZTg1YzcsCisgICAgMHhjM2YwNjg2LAorICAgIDB4MTAzMjE5M2QsCisgICAgMHgxMDMyOTk1NCwKKyAgICAweDEwMzMxOTZkLAorICAgIDB4MTAzMzk5ODMsCisgICAgMHgxMDM0MTk5MywKKyAgICAweDEwMzQ5OWE2LAorICAgIDB4MTAzNTE5YjQsCisgICAgMHgxMDM1OTljMywKKyAgICAweDEwMzYxOWUzLAorICAgIDB4MTAzNjlhMDIsCisgICAgMHgxMDM3MWExZiwKKyAgICAweDEwMzc5YTNjLAorICAgIDB4MTAzODFhNTEsCisgICAgMHgxMDM4OWE3MywKKyAgICAweDEwMzkxYTkyLAorICAgIDB4MTAzOTlhYjEsCisgICAgMHgxMDNhMWFjOCwKKyAgICAweDEwM2E5YWRmLAorICAgIDB4MTAzYjFhZTgsCisgICAgMHgxMDNiOWFmMywKKyAgICAweDEwM2MxYjBkLAorICAgIDB4MTAzYzliMTUsCisgICAgMHgxMDNkMWIxZCwKKyAgICAweDEwM2Q5YjI0LAorICAgIDB4MTAzZTFiMzcsCisgICAgMHgxMDNlOWI0OSwKKyAgICAweDEwM2YxYjVjLAorICAgIDB4MTAzZjliNjUsCisgICAgMHgxNDMyMGE0ZSwKKyAgICAweDE0MzI4YTVjLAorICAgIDB4MTQzMzBhNjgsCisgICAgMHgxNDMzOGE3NSwKKyAgICAweDE4MzYxMjI0LAorICAgIDB4MTgzNzEyNTIsCisgICAgMHgxODM3OTI2MywKKyAgICAweDE4MzgxMjc5LAorICAgIDB4MTgzOTEyOWMsCisgICAgMHgxODM5OTJiMSwKKyAgICAweDE4M2ExMmMzLAorICAgIDB4MTgzYzEzMDcsCisgICAgMHgxODNjOTMxNSwKKyAgICAweDE4M2QxMzI4LAorICAgIDB4MTgzZDkzMzgsCisgICAgMHgxODNlOTM1ZSwKKyAgICAweDE4M2YxMzcxLAorICAgIDB4MTgzZjkzODAsCisgICAgMHgxODQwOTNhYSwKKyAgICAweDE4NDExNDE2LAorICAgIDB4MTg0MTk0MjcsCisgICAgMHgxODQyMTQzYSwKKyAgICAweDE4NDI5NDRjLAorICAgIDB4MTg0MzE0NWUsCisgICAgMHgxODQzOTQ2ZiwKKyAgICAweDE4NDQxNDgwLAorICAgIDB4MTg0NDk0OTEsCisgICAgMHgxODQ1MTRhMiwKKyAgICAweDE4NDU5NGFmLAorICAgIDB4MTg0NjE0ZDEsCisgICAgMHgxODQ2OTRlNCwKKyAgICAweDE4NDcxNGY4LAorICAgIDB4MTg0Nzk1MDUsCisgICAgMHgxODQ4MTUxNCwKKyAgICAweDE4NDg5NTIzLAorICAgIDB4MTg0OTE1MzQsCisgICAgMHgxODQ5OTU1MCwKKyAgICAweDE4NGExNTVlLAorICAgIDB4MTg0YTk1NmYsCisgICAgMHgxODRiMTU4MCwKKyAgICAweDE4NGI5NThlLAorICAgIDB4MTg0YzE1OWUsCisgICAgMHgxODRjOTVjNCwKKyAgICAweDE4NGQxNWQzLAorICAgIDB4MTg0ZDk1ZTMsCisgICAgMHgxODRlMTVmMywKKyAgICAweDE4NGU5NjAyLAorICAgIDB4MTg0ZjE1NDEsCisgICAgMHgxODRmOTFiMywKKyAgICAweDE4NTAxMTU2LAorICAgIDB4MTg1MDkxNmUsCisgICAgMHgxODUxMTE5MCwKKyAgICAweDE4NTE5MWEyLAorICAgIDB4MTg1MjExZDQsCisgICAgMHgxODUyOTFlZCwKKyAgICAweDE4NTMxMWZlLAorICAgIDB4MTg1MzkyMTQsCisgICAgMHgxODU0MTIzOSwKKyAgICAweDE4NTQ5MjhhLAorICAgIDB4MTg1NTEyZDMsCisgICAgMHgxODU1OTJlOCwKKyAgICAweDE4NTYxMmY1LAorICAgIDB4MTg1NjkzNGQsCisgICAgMHgxODU3MTM5MCwKKyAgICAweDE4NTc5MzlkLAorICAgIDB4MTg1ODEzYjksCisgICAgMHgxODU4OTNjYSwKKyAgICAweDE4NTkxM2RhLAorICAgIDB4MTg1OTkzZWEsCisgICAgMHgxODVhMTNmOSwKKyAgICAweDE4NWE5NDA4LAorICAgIDB4MTg1YjE0YmQsCisgICAgMHgxYzMyMDZiOCwKKyAgICAweDFjMzI4NmM0LAorICAgIDB4MWMzMzA2Y2YsCisgICAgMHgxYzMzODZkYiwKKyAgICAweDIwMzIxNjE2LAorICAgIDB4MjAzMjk2MjEsCisgICAgMHgyMDMzMTYyOSwKKyAgICAweDIwMzM5NjM1LAorICAgIDB4MjQzMjE2NDEsCisgICAgMHgyNDMyOTY0ZiwKKyAgICAweDI0MzMxNjYxLAorICAgIDB4MjQzMzk2NzAsCisgICAgMHgyNDM0MTY4MywKKyAgICAweDI0MzQ5Njk2LAorICAgIDB4MjQzNTE2YWQsCisgICAgMHgyNDM1OTZjNSwKKyAgICAweDI0MzYxNmQzLAorICAgIDB4MjQzNjk2ZWIsCisgICAgMHgyNDM3MTZmNCwKKyAgICAweDI0Mzc5NzA2LAorICAgIDB4MjQzODE3MWEsCisgICAgMHgyNDM4OTcyNywKKyAgICAweDI0MzkxNzNkLAorICAgIDB4MjQzOTk3NTUsCisgICAgMHgyNDNhMTc2ZCwKKyAgICAweDI0M2E5Nzc3LAorICAgIDB4MjQzYjE3OGMsCisgICAgMHgyNDNiOTc5YSwKKyAgICAweDI0M2MxN2IyLAorICAgIDB4MjQzYzk3YzksCisgICAgMHgyNDNkMTdkNCwKKyAgICAweDI0M2Q5N2UyLAorICAgIDB4MjgzMjBhYWUsCisgICAgMHgyODMyOGFiZCwKKyAgICAweDI4MzMwYWM4LAorICAgIDB4MjgzMzhhY2QsCisgICAgMHgyODM0MGFkOCwKKyAgICAweDJjMzIyYjAwLAorICAgIDB4MmMzMmFiMGMsCisgICAgMHgyYzMzMmIxZiwKKyAgICAweDJjMzNhYjMwLAorICAgIDB4MmMzNDJiNDksCisgICAgMHgyYzM0YWI3MSwKKyAgICAweDJjMzUyYjg4LAorICAgIDB4MmMzNWFiYTUsCisgICAgMHgyYzM2MmJjMiwKKyAgICAweDJjMzZhYmRmLAorICAgIDB4MmMzNzJiZjgsCisgICAgMHgyYzM3YWMxMSwKKyAgICAweDJjMzgyYzI3LAorICAgIDB4MmMzOGFjMzUsCisgICAgMHgyYzM5MmM0NywKKyAgICAweDJjMzlhYzY0LAorICAgIDB4MmMzYTJjODEsCisgICAgMHgyYzNhYWM4ZiwKKyAgICAweDJjM2IyY2FkLAorICAgIDB4MmMzYmFjY2IsCisgICAgMHgyYzNjMmNlNiwKKyAgICAweDJjM2NhY2ZhLAorICAgIDB4MmMzZDJkMGMsCisgICAgMHgyYzNkYWQxYywKKyAgICAweDJjM2UyZDJhLAorICAgIDB4MmMzZWFkM2EsCisgICAgMHgyYzNmMmQ0YSwKKyAgICAweDJjM2ZhZDY1LAorICAgIDB4MmM0MDJkNzYsCisgICAgMHgyYzQwYWQ5MSwKKyAgICAweDJjNDEyZGE1LAorICAgIDB4MmM0MWFkYjgsCisgICAgMHgyYzQyMmRkNywKKyAgICAweDJjNDJhZGViLAorICAgIDB4MmM0MzJkZmUsCisgICAgMHgyYzQzYWUwZCwKKyAgICAweDJjNDQyZTFjLAorICAgIDB4MmM0NGFlMzMsCisgICAgMHgyYzQ1MmU0ZSwKKyAgICAweDJjNDVhZTY2LAorICAgIDB4MmM0NjJlN2EsCisgICAgMHgyYzQ2YWU4ZCwKKyAgICAweDJjNDcyZTllLAorICAgIDB4MmM0N2FlYWYsCisgICAgMHgyYzQ4MmVjMCwKKyAgICAweDJjNDhhZWQxLAorICAgIDB4MmM0OTJlZTAsCisgICAgMHgyYzQ5YWVlZCwKKyAgICAweDJjNGEyZWZhLAorICAgIDB4MmM0YWFmMDcsCisgICAgMHgyYzRiMmYxMCwKKyAgICAweDJjNGJhZjI0LAorICAgIDB4MmM0YzJmMzMsCisgICAgMHgyYzRjYWY0MSwKKyAgICAweDJjNGQyZjYzLAorICAgIDB4MmM0ZGFmNzQsCisgICAgMHgyYzRlMmY4NSwKKyAgICAweDJjNGVhZjUwLAorICAgIDB4MmM0ZjJiNjIsCisgICAgMHgzMDMyMDAwMCwKKyAgICAweDMwMzI4MDE4LAorICAgIDB4MzAzMzAwMmMsCisgICAgMHgzMDMzODA0MiwKKyAgICAweDMwMzQwMDViLAorICAgIDB4MzAzNDgwNmMsCisgICAgMHgzMDM1MDA3ZiwKKyAgICAweDMwMzU4MDhmLAorICAgIDB4MzAzNjAwOWQsCisgICAgMHgzMDM2ODBiMywKKyAgICAweDMwMzcwMGMzLAorICAgIDB4MzAzNzgwZDgsCisgICAgMHgzMDM4MDBlNiwKKyAgICAweDMwMzg4MGY3LAorICAgIDB4MzAzOTAxMDMsCisgICAgMHgzMDM5ODEwYywKKyAgICAweDMwM2EwMTFkLAorICAgIDB4MzAzYTgxMmQsCisgICAgMHgzMDNiMDEzYSwKKyAgICAweDMwM2I4MTQ2LAorICAgIDB4MzAzYzAxNTcsCisgICAgMHgzMDNjODE2NSwKKyAgICAweDMwM2QwMTc2LAorICAgIDB4MzAzZDgxODgsCisgICAgMHgzMDNlMDE5OSwKKyAgICAweDMwM2U4MWE4LAorICAgIDB4MzAzZjAxYjksCisgICAgMHgzMDNmODFjZCwKKyAgICAweDMwNDAwMWRmLAorICAgIDB4MzA0MDgxZWMsCisgICAgMHgzMDQxMDIwMiwKKyAgICAweDMwNDE4MjE1LAorICAgIDB4MzA0MjAyMjUsCisgICAgMHgzMDQyODIzOSwKKyAgICAweDMwNDMwMjRhLAorICAgIDB4MzA0MzgyNWEsCisgICAgMHgzMDQ0MDI2NSwKKyAgICAweDMwNDQ4MjZkLAorICAgIDB4MzA0NTAyN2QsCisgICAgMHgzMDQ1ODI5NCwKKyAgICAweDMwNDYwMmExLAorICAgIDB4MzA0NjgyYjcsCisgICAgMHgzMDQ3MDJjOSwKKyAgICAweDMwNDc4MmQ1LAorICAgIDB4MzA0ODAyZTEsCisgICAgMHgzMDQ4ODJlZiwKKyAgICAweDMwNDkwMzA4LAorICAgIDB4MzA0OTgzMTYsCisgICAgMHgzMDRhMDMyYiwKKyAgICAweDMwNGE4MzQzLAorICAgIDB4MzA0YjAzNGQsCisgICAgMHgzMDRiODM2MSwKKyAgICAweDMwNGMwMzcyLAorICAgIDB4MzA0YzgzODIsCisgICAgMHgzMDRkMDM4ZiwKKyAgICAweDMwNGQ4M2EwLAorICAgIDB4MzA0ZTAzYjAsCisgICAgMHgzMDRlODNjMiwKKyAgICAweDMwNGYwM2QzLAorICAgIDB4MzA0ZjgzZTIsCisgICAgMHgzMDUwMDNmNiwKKyAgICAweDMwNTA4NDA0LAorICAgIDB4MzA1MTA0MTMsCisgICAgMHgzMDUxODQxYywKKyAgICAweDM0MzIwOWQ2LAorICAgIDB4MzQzMjg5ZTYsCisgICAgMHgzNDMzMDlmMSwKKyAgICAweDM0MzM4OWZlLAorICAgIDB4MzgzMjBhMDcsCisgICAgMHgzODMyOGExZiwKKyAgICAweDM4MzMwYTMyLAorICAgIDB4MzgzMzhhM2MsCisgICAgMHgzYzMyMGFlYiwKKyAgICAweDNjMzI4YWY5LAorICAgIDB4M2MzMzBiMTAsCisgICAgMHgzYzMzOGIyNCwKKyAgICAweDNjMzQwYjU2LAorICAgIDB4M2MzNDhiNjcsCisgICAgMHgzYzM1MGI3MywKKyAgICAweDNjMzU4YmEwLAorICAgIDB4M2MzNjBiYjIsCisgICAgMHgzYzM2OGJkYiwKKyAgICAweDNjMzcwYmU4LAorICAgIDB4M2MzNzhiZjUsCisgICAgMHgzYzM4MGMwMywKKyAgICAweDNjMzg4YzEwLAorICAgIDB4M2MzOTBjMWQsCisgICAgMHgzYzM5OGM0MSwKKyAgICAweDNjM2EwYzUxLAorICAgIDB4M2MzYThjNjksCisgICAgMHgzYzNiMGM3ZSwKKyAgICAweDNjM2I4YzkzLAorICAgIDB4M2MzYzBjYTAsCisgICAgMHgzYzNjOGNiMywKKyAgICAweDNjM2QwY2M2LAorICAgIDB4M2MzZDhjZWEsCisgICAgMHgzYzNlMGQxMiwKKyAgICAweDNjM2U4ZDJiLAorICAgIDB4M2MzZjBkNDEsCisgICAgMHgzYzNmOGQ0ZSwKKyAgICAweDNjNDAwZDYxLAorICAgIDB4M2M0MDhkNzIsCisgICAgMHgzYzQxMGQ4MywKKyAgICAweDNjNDE4ZDljLAorICAgIDB4M2M0MjBkYjUsCisgICAgMHgzYzQyOGRjYiwKKyAgICAweDNjNDMwZGU4LAorICAgIDB4M2M0MzhkZmUsCisgICAgMHgzYzQ0MGU4MiwKKyAgICAweDNjNDQ4ZWE5LAorICAgIDB4M2M0NTBlYzcsCisgICAgMHgzYzQ1OGVlMSwKKyAgICAweDNjNDYwZWY5LAorICAgIDB4M2M0NjhmMTEsCisgICAgMHgzYzQ3MGYzYywKKyAgICAweDNjNDc4ZjY3LAorICAgIDB4M2M0ODBmODgsCisgICAgMHgzYzQ4OGZiMSwKKyAgICAweDNjNDkwZmNjLAorICAgIDB4M2M0OThmZjUsCisgICAgMHgzYzRhMTAwMiwKKyAgICAweDNjNGE5MDE5LAorICAgIDB4M2M0YjEwMzAsCisgICAgMHgzYzRiOTA1OSwKKyAgICAweDNjNGMxMDY5LAorICAgIDB4M2M0YzkwNzUsCisgICAgMHgzYzRkMTA4ZCwKKyAgICAweDNjNGQ5MGEwLAorICAgIDB4M2M0ZTEwYjEsCisgICAgMHgzYzRlOTBjMiwKKyAgICAweDNjNGYxMGU4LAorICAgIDB4M2M0ZjhhZGYsCisgICAgMHgzYzUwMGUxYSwKKyAgICAweDNjNTA4ZTNhLAorICAgIDB4M2M1MTBlNjcsCisgICAgMHgzYzUxOGZlNywKKyAgICAweDNjNTIxMGQyLAorICAgIDB4M2M1MjhiODcsCisgICAgMHgzYzUzMGIzZiwKKyAgICAweDQwMzIxYmE1LAorICAgIDB4NDAzMjliYmYsCisgICAgMHg0MDMzMWJlNywKKyAgICAweDQwMzM5YmZmLAorICAgIDB4NDAzNDFjMWQsCisgICAgMHg0MDM0OWM2NCwKKyAgICAweDQwMzUxYzdiLAorICAgIDB4NDAzNTljOTcsCisgICAgMHg0MDM2MWNiMywKKyAgICAweDQwMzY5Y2NkLAorICAgIDB4NDAzNzFjZWMsCisgICAgMHg0MDM3OWQwYiwKKyAgICAweDQwMzgxZDIzLAorICAgIDB4NDAzODlkNDAsCisgICAgMHg0MDM5MWQ2MywKKyAgICAweDQwMzk5ZDgwLAorICAgIDB4NDAzYTFkOWUsCisgICAgMHg0MDNhOWRhZSwKKyAgICAweDQwM2IxZGMzLAorICAgIDB4NDAzYjlkZGYsCisgICAgMHg0MDNjMWRmOSwKKyAgICAweDQwM2M5ZTA0LAorICAgIDB4NDAzZDFlMjcsCisgICAgMHg0MDNkOWU0YiwKKyAgICAweDQwM2UxZTYxLAorICAgIDB4NDAzZTllNmIsCisgICAgMHg0MDNmMWU3NywKKyAgICAweDQwM2Y5ZTg4LAorICAgIDB4NDA0MDFlYTAsCisgICAgMHg0MDQwOWVhOCwKKyAgICAweDQwNDExZWIxLAorICAgIDB4NDA0MTllYmEsCisgICAgMHg0MDQyMWVlMiwKKyAgICAweDQwNDI5ZWY2LAorICAgIDB4NDA0MzFmMDEsCisgICAgMHg0MDQzOWYwZCwKKyAgICAweDQwNDQxZjYxLAorICAgIDB4NDA0NDlmNmQsCisgICAgMHg0MDQ1MWY3YSwKKyAgICAweDQwNDU5ZjhkLAorICAgIDB4NDA0NjFmYTUsCisgICAgMHg0MDQ2OWZiZCwKKyAgICAweDQwNDcxZmQzLAorICAgIDB4NDA0NzlmZWUsCisgICAgMHg0MDQ4MjAwOSwKKyAgICAweDQwNDhhMDFkLAorICAgIDB4NDA0OTIwMzYsCisgICAgMHg0MDQ5YTA0ZiwKKyAgICAweDQwNGEyMDY5LAorICAgIDB4NDA0YWEwNzMsCisgICAgMHg0MDRiMjA4MywKKyAgICAweDQwNGJhMGE0LAorICAgIDB4NDA0YzIwYmYsCisgICAgMHg0MDRjYTBjZCwKKyAgICAweDQwNGQyMGRhLAorICAgIDB4NDA0ZGEwZWUsCisgICAgMHg0MDRlMjEwNiwKKyAgICAweDQwNGVhMTE0LAorICAgIDB4NDA0ZjIxM2UsCisgICAgMHg0MDRmYTE1NSwKKyAgICAweDQwNTAyMTY3LAorICAgIDB4NDA1MGExOTgsCisgICAgMHg0MDUxMjFjOSwKKyAgICAweDQwNTFhMWRlLAorICAgIDB4NDA1MjIyMDEsCisgICAgMHg0MDUyYTIyMSwKKyAgICAweDQwNTMyMjM2LAorICAgIDB4NDA1M2EyNDYsCisgICAgMHg0MDU0YTI1MiwKKyAgICAweDQwNTUyMjY4LAorICAgIDB4NDA1NWEyODYsCisgICAgMHg0MDU2MjI5MywKKyAgICAweDQwNTZhMjlkLAorICAgIDB4NDA1NzIyYWIsCisgICAgMHg0MDU3YTJjNiwKKyAgICAweDQwNTgyMmUxLAorICAgIDB4NDA1OGEzMDAsCisgICAgMHg0MDU5MjMxNSwKKyAgICAweDQwNTlhMzJhLAorICAgIDB4NDA1YTIzNDcsCisgICAgMHg0MDVhYTM1YiwKKyAgICAweDQwNWIyMzc3LAorICAgIDB4NDA1YmEzOGQsCisgICAgMHg0MDVjMjNhYSwKKyAgICAweDQwNWNhM2JjLAorICAgIDB4NDA1ZDIzZDMsCisgICAgMHg0MDVkYTNlNCwKKyAgICAweDQwNWUyNDAwLAorICAgIDB4NDA1ZWE0MTQsCisgICAgMHg0MDVmMjQyNCwKKyAgICAweDQwNWZhNDQwLAorICAgIDB4NDA2MDI0NTUsCisgICAgMHg0MDYwYTQ2YiwKKyAgICAweDQwNjEyNDg4LAorICAgIDB4NDA2MWE0YTEsCisgICAgMHg0MDYyMjRjYiwKKyAgICAweDQwNjJhNGQ0LAorICAgIDB4NDA2MzI0ZTQsCisgICAgMHg0MDYzYTUxZCwKKyAgICAweDQwNjQyNTMzLAorICAgIDB4NDA2NGE1NTEsCisgICAgMHg0MDY1MjU2NiwKKyAgICAweDQwNjVhNTgzLAorICAgIDB4NDA2NjI1OWEsCisgICAgMHg0MDY2YTViOCwKKyAgICAweDQwNjcyNWQ1LAorICAgIDB4NDA2N2E1ZWMsCisgICAgMHg0MDY4MjYwYSwKKyAgICAweDQwNjhhNjIxLAorICAgIDB4NDA2OTI2MzksCisgICAgMHg0MDY5YTY0YSwKKyAgICAweDQwNmEyNjVkLAorICAgIDB4NDA2YWE2NzAsCisgICAgMHg0MDZiMjY4NCwKKyAgICAweDQwNmJhNmE4LAorICAgIDB4NDA2YzI2YzMsCisgICAgMHg0MDZjYTZlNCwKKyAgICAweDQwNmQyNzA4LAorICAgIDB4NDA2ZGE3MjMsCisgICAgMHg0MDZlMjc0NCwKKyAgICAweDQwNmVhNzU5LAorICAgIDB4NDA2ZjI3NzIsCisgICAgMHg0MDZmYTc3ZiwKKyAgICAweDQwNzAyNzhkLAorICAgIDB4NDA3MGE3OWEsCisgICAgMHg0MDcxMjdiNywKKyAgICAweDQwNzFhN2Q3LAorICAgIDB4NDA3MjI3ZjIsCisgICAgMHg0MDcyYTgwYiwKKyAgICAweDQwNzMyODIyLAorICAgIDB4NDA3M2E4M2MsCisgICAgMHg0MDc0Mjg2MCwKKyAgICAweDQwNzRhODc2LAorICAgIDB4NDA3NTI4OGEsCisgICAgMHg0MDc1YTg5ZiwKKyAgICAweDQwNzYyOGI5LAorICAgIDB4NDA3NmE4Y2IsCisgICAgMHg0MDc3MjhlMCwKKyAgICAweDQwNzdhOTA2LAorICAgIDB4NDA3ODI5MjMsCisgICAgMHg0MDc4YTk0NiwKKyAgICAweDQwNzkyOTZjLAorICAgIDB4NDA3OWE5ODksCisgICAgMHg0MDdhMjlhYywKKyAgICAweDQwN2FhOWM4LAorICAgIDB4NDA3YjI5ZTQsCisgICAgMHg0MDdiYTlmNiwKKyAgICAweDQwN2MyYTAzLAorICAgIDB4NDA3ZTJhMTAsCisgICAgMHg0MDdlYWEyNiwKKyAgICAweDQwN2YyYTNlLAorICAgIDB4NDA3ZmFhNTEsCisgICAgMHg0MDgwMmE2NiwKKyAgICAweDQwODBhYTdmLAorICAgIDB4NDA4MTJhOWQsCisgICAgMHg0MDgxYWFiZCwKKyAgICAweDQwODIyYWM2LAorICAgIDB4NDA4MmFhZTIsCisgICAgMHg0MDgzMmFlYiwKKyAgICAweDQwODNhMTIzLAorICAgIDB4NDA4NDIxYjIsCisgICAgMHg0MDg0YTE4MiwKKyAgICAweDQwODUyNTBjLAorICAgIDB4NDA4NWE0ZjAsCisgICAgMHg0MDg2MWMzYywKKyAgICAweDQwODY5YzRmLAorICAgIDB4NDA4NzFmNDEsCisgICAgMHg0MDg3OWY1MCwKKyAgICAweDQwODgxYmNiLAorICAgIDB4NDA4ODllY2EsCisgICAgMHg0MDg5MWYyOCwKKyAgICAweDQwODlhNGI0LAorICAgIDB4NDA4YTFiNzAsCisgICAgMHg0MDhhOWI4MSwKKyAgICAweDQwOGIxYjkzLAorICAgIDB4NDA4YmExZWYsCisgICAgMHg0NDMyMDQyYSwKKyAgICAweDQ0MzI4NDNjLAorICAgIDB4NDQzMzA0NDUsCisgICAgMHg0NDMzODQ0ZCwKKyAgICAweDQ0MzQwNDVhLAorICAgIDB4NDQzNDg0NzUsCisgICAgMHg0NDM1MDQ5MCwKKyAgICAweDQ0MzU4NGIwLAorICAgIDB4NDQzNjA0Y2MsCisgICAgMHg0NDM2ODRlZCwKKyAgICAweDQ0MzcwNGY0LAorICAgIDB4NDQzNzg1MDIsCisgICAgMHg0NDM4MDUwYywKKyAgICAweDQ0Mzg4NTE4LAorICAgIDB4NDQzOTA1MjIsCisgICAgMHg0NDM5ODUyZCwKKyAgICAweDQ0M2EwNTM3LAorICAgIDB4NDQzYTg1NDEsCisgICAgMHg0NDNiMDQ2YSwKKyAgICAweDRjMzIxN2VhLAorICAgIDB4NGMzMjk3ZjksCisgICAgMHg0YzMzMTgwOCwKKyAgICAweDRjMzM5ODIxLAorICAgIDB4NGMzNDE4M2MsCisgICAgMHg0YzM0OTg1OCwKKyAgICAweDRjMzUxODZhLAorICAgIDB4NGMzNTk4NzgsCisgICAgMHg0YzM2MTg4ZCwKKyAgICAweDRjMzY5ODllLAorICAgIDB4NGMzNzE4YWMsCisgICAgMHg0YzM3OThiYSwKKyAgICAweDRjMzgxOGNjLAorICAgIDB4NGMzODk4ZGMsCisgICAgMHg0YzM5MThlNiwKKyAgICAweDRjMzk5OGZlLAorICAgIDB4NGMzYTE5MTYsCisgICAgMHg0YzNhOTkyOSwKKyAgICAweDUwMzIyZjk2LAorICAgIDB4NTAzMmFmYWIsCisgICAgMHg1MDMzMmZiYywKKyAgICAweDUwMzNhZmNmLAorICAgIDB4NTAzNDJmZTAsCisgICAgMHg1MDM0YWZmMywKKyAgICAweDUwMzUzMDAyLAorICAgIDB4NTAzNWIwMTcsCisgICAgMHg1MDM2MzAyNywKKyAgICAweDUwMzZiMDM2LAorICAgIDB4NTAzNzMwNDcsCisgICAgMHg1MDM3YjA1NywKKyAgICAweDUwMzgzMDY4LAorICAgIDB4NTAzOGIwN2IsCisgICAgMHg1MDM5MzA4ZCwKKyAgICAweDUwMzliMGEzLAorICAgIDB4NTAzYTMwYjUsCisgICAgMHg1MDNhYjBjNiwKKyAgICAweDUwM2IzMGQ3LAorICAgIDB4NTAzYmIwZTgsCisgICAgMHg1MDNjMzBmMywKKyAgICAweDUwM2NiMGZmLAorICAgIDB4NTAzZDMxMGEsCisgICAgMHg1MDNkYjExNSwKKyAgICAweDUwM2UzMTIyLAorICAgIDB4NTAzZWIxMzcsCisgICAgMHg1MDNmMzE0NSwKKyAgICAweDUwM2ZiMTU5LAorICAgIDB4NTA0MDMxNmMsCisgICAgMHg1MDQwYjE3ZCwKKyAgICAweDUwNDEzMTk3LAorICAgIDB4NTA0MWIxYTYsCisgICAgMHg1MDQyMzFhZiwKKyAgICAweDUwNDJiMWJlLAorICAgIDB4NTA0MzMxZDAsCisgICAgMHg1MDQzYjFkYywKKyAgICAweDUwNDQzMWU0LAorICAgIDB4NTA0NGIxZjcsCisgICAgMHg1MDQ1MzIwOCwKKyAgICAweDUwNDViMjFlLAorICAgIDB4NTA0NjMyMmEsCisgICAgMHg1MDQ2YjIzZSwKKyAgICAweDUwNDczMjRjLAorICAgIDB4NTA0N2IyNjAsCisgICAgMHg1MDQ4MzI3YSwKKyAgICAweDUwNDhiMjhlLAorICAgIDB4NTA0OTMyYTQsCisgICAgMHg1MDQ5YjJiYiwKKyAgICAweDUwNGEzMmNkLAorICAgIDB4NTA0YWIyZTEsCisgICAgMHg1MDRiMzJmNiwKKyAgICAweDUwNGJiMzBkLAorICAgIDB4NTA0YzMzMjEsCisgICAgMHg1MDRjYjMyYSwKKyAgICAweDUwNGQzMzMyLAorICAgIDB4NTA0ZGIzNDEsCisgICAgMHg1MDRlMzM1MSwKKyAgICAweDY4MzIxMTA5LAorICAgIDB4NjgzMjkxMWEsCisgICAgMHg2ODMzMTEyYSwKKyAgICAweDY4MzM5MTM4LAorICAgIDB4NjgzNDExNDUsCisgICAgMHg2YzMyMTBmOCwKKyAgICAweDc0MzIwYTg5LAorICAgIDB4NzQzMjhhOWIsCisgICAgMHg3ODMyMDZlOCwKKyAgICAweDc4MzI4NzFiLAorICAgIDB4NzgzMzA3MmQsCisgICAgMHg3ODMzODczZiwKKyAgICAweDc4MzQwNzUzLAorICAgIDB4NzgzNDg3NjcsCisgICAgMHg3ODM1MDc4NSwKKyAgICAweDc4MzU4Nzk3LAorICAgIDB4NzgzNjA3YWIsCisgICAgMHg3ODM2ODgxOSwKKyAgICAweDc4MzcwODJiLAorICAgIDB4NzgzNzg4M2QsCisgICAgMHg3ODM4MDg0ZiwKKyAgICAweDc4Mzg4ODY2LAorICAgIDB4NzgzOTA4N2QsCisgICAgMHg3ODM5ODg5NCwKKyAgICAweDc4M2EwOGIwLAorICAgIDB4NzgzYTg4Y2MsCisgICAgMHg3ODNiMDhlOCwKKyAgICAweDc4M2I4OGZlLAorICAgIDB4NzgzYzA5MTQsCisgICAgMHg3ODNjODkyYSwKKyAgICAweDc4M2QwOTQ3LAorICAgIDB4NzgzZDg5NTYsCisgICAgMHg3ODNlMDk2NSwKKyAgICAweDc4M2U4OTc0LAorICAgIDB4NzgzZjA5OTAsCisgICAgMHg3ODNmODk5ZSwKKyAgICAweDc4NDAwOWFjLAorICAgIDB4Nzg0MDg5YmEsCisgICAgMHg3ODQxMDljNywKKyAgICAweDc4NDE4NmZhLAorICAgIDB4Nzg0MjA3YmYsCisgICAgMHg3ODQyODdkZCwKKyAgICAweDc4NDMwN2ZiLAorICAgIDB4ODAzMjE2MTEsCit9OworCitjb25zdCBzaXplX3Qga09wZW5TU0xGdW5jdGlvblZhbHVlc0xlbiA9IHNpemVvZihrT3BlblNTTEZ1bmN0aW9uVmFsdWVzKSAvIHNpemVvZihrT3BlblNTTEZ1bmN0aW9uVmFsdWVzWzBdKTsKKworY29uc3QgY2hhciBrT3BlblNTTEZ1bmN0aW9uU3RyaW5nRGF0YVtdID0KKyAgICAiQVNOMV9CSVRfU1RSSU5HX3NldF9iaXRcMCIKKyAgICAiQVNOMV9FTlVNRVJBVEVEX3NldFwwIgorICAgICJBU04xX0VOVU1FUkFURURfdG9fQk5cMCIKKyAgICAiQVNOMV9HRU5FUkFMSVpFRFRJTUVfYWRqXDAiCisgICAgIkFTTjFfSU5URUdFUl9zZXRcMCIKKyAgICAiQVNOMV9JTlRFR0VSX3RvX0JOXDAiCisgICAgIkFTTjFfT0JKRUNUX25ld1wwIgorICAgICJBU04xX1BDVFhfbmV3XDAiCisgICAgIkFTTjFfU1RSSU5HX1RBQkxFX2FkZFwwIgorICAgICJBU04xX1NUUklOR19zZXRcMCIKKyAgICAiQVNOMV9TVFJJTkdfdHlwZV9uZXdcMCIKKyAgICAiQVNOMV9USU1FX2FkalwwIgorICAgICJBU04xX1VUQ1RJTUVfYWRqXDAiCisgICAgIkFTTjFfZDJpX2ZwXDAiCisgICAgIkFTTjFfZHVwXDAiCisgICAgIkFTTjFfZ2VuZXJhdGVfdjNcMCIKKyAgICAiQVNOMV9nZXRfb2JqZWN0XDAiCisgICAgIkFTTjFfaTJkX2Jpb1wwIgorICAgICJBU04xX2kyZF9mcFwwIgorICAgICJBU04xX2l0ZW1fZDJpX2ZwXDAiCisgICAgIkFTTjFfaXRlbV9kdXBcMCIKKyAgICAiQVNOMV9pdGVtX2V4X2QyaVwwIgorICAgICJBU04xX2l0ZW1faTJkX2Jpb1wwIgorICAgICJBU04xX2l0ZW1faTJkX2ZwXDAiCisgICAgIkFTTjFfaXRlbV9wYWNrXDAiCisgICAgIkFTTjFfaXRlbV91bnBhY2tcMCIKKyAgICAiQVNOMV9tYnN0cmluZ19uY29weVwwIgorICAgICJBU04xX3RlbXBsYXRlX25ld1wwIgorICAgICJCSU9fbmV3X05ERUZcMCIKKyAgICAiQk5fdG9fQVNOMV9FTlVNRVJBVEVEXDAiCisgICAgIkJOX3RvX0FTTjFfSU5URUdFUlwwIgorICAgICJhMmRfQVNOMV9PQkpFQ1RcMCIKKyAgICAiYTJpX0FTTjFfRU5VTUVSQVRFRFwwIgorICAgICJhMmlfQVNOMV9JTlRFR0VSXDAiCisgICAgImEyaV9BU04xX1NUUklOR1wwIgorICAgICJhcHBlbmRfZXhwXDAiCisgICAgImFzbjFfY2JcMCIKKyAgICAiYXNuMV9jaGVja190bGVuXDAiCisgICAgImFzbjFfY29sbGF0ZV9wcmltaXRpdmVcMCIKKyAgICAiYXNuMV9jb2xsZWN0XDAiCisgICAgImFzbjFfZDJpX2V4X3ByaW1pdGl2ZVwwIgorICAgICJhc24xX2QyaV9yZWFkX2Jpb1wwIgorICAgICJhc24xX2RvX2FkYlwwIgorICAgICJhc24xX2V4X2MyaVwwIgorICAgICJhc24xX2ZpbmRfZW5kXDAiCisgICAgImFzbjFfaXRlbV9leF9jb21iaW5lX25ld1wwIgorICAgICJhc24xX3N0cjJ0eXBlXDAiCisgICAgImFzbjFfdGVtcGxhdGVfZXhfZDJpXDAiCisgICAgImFzbjFfdGVtcGxhdGVfbm9leHBfZDJpXDAiCisgICAgImJpdHN0cl9jYlwwIgorICAgICJjMmlfQVNOMV9CSVRfU1RSSU5HXDAiCisgICAgImMyaV9BU04xX0lOVEVHRVJcMCIKKyAgICAiYzJpX0FTTjFfT0JKRUNUXDAiCisgICAgImNvbGxlY3RfZGF0YVwwIgorICAgICJkMmlfQVNOMV9CT09MRUFOXDAiCisgICAgImQyaV9BU04xX09CSkVDVFwwIgorICAgICJkMmlfQVNOMV9VSU5URUdFUlwwIgorICAgICJkMmlfQVNOMV9VVENUSU1FXDAiCisgICAgImQyaV9BU04xX2J5dGVzXDAiCisgICAgImQyaV9BU04xX3R5cGVfYnl0ZXNcMCIKKyAgICAiaTJkX0FTTjFfVElNRVwwIgorICAgICJpMmRfUHJpdmF0ZUtleVwwIgorICAgICJsb25nX2MyaVwwIgorICAgICJwYXJzZV90YWdnaW5nXDAiCisgICAgIkJJT19jYWxsYmFja19jdHJsXDAiCisgICAgIkJJT19jdHJsXDAiCisgICAgIkJJT19uZXdcMCIKKyAgICAiQklPX25ld19maWxlXDAiCisgICAgIkJJT19uZXdfbWVtX2J1ZlwwIgorICAgICJCSU9fcHJpbnRmXDAiCisgICAgIkJJT196ZXJvX2NvcHlfZ2V0X3JlYWRfYnVmXDAiCisgICAgIkJJT196ZXJvX2NvcHlfZ2V0X3JlYWRfYnVmX2RvbmVcMCIKKyAgICAiQklPX3plcm9fY29weV9nZXRfd3JpdGVfYnVmXDAiCisgICAgIkJJT196ZXJvX2NvcHlfZ2V0X3dyaXRlX2J1Zl9kb25lXDAiCisgICAgImJpb19pb1wwIgorICAgICJiaW9fbWFrZV9wYWlyXDAiCisgICAgImJpb193cml0ZVwwIgorICAgICJidWZmZXJfY3RybFwwIgorICAgICJjb25uX2N0cmxcMCIKKyAgICAiY29ubl9zdGF0ZVwwIgorICAgICJmaWxlX2N0cmxcMCIKKyAgICAiZmlsZV9yZWFkXDAiCisgICAgIm1lbV93cml0ZVwwIgorICAgICJCTl9DVFhfZ2V0XDAiCisgICAgIkJOX0NUWF9uZXdcMCIKKyAgICAiQk5fQ1RYX3N0YXJ0XDAiCisgICAgIkJOX2JuMmRlY1wwIgorICAgICJCTl9ibjJoZXhcMCIKKyAgICAiQk5fZGl2XDAiCisgICAgIkJOX2Rpdl9yZWNwXDAiCisgICAgIkJOX2V4cFwwIgorICAgICJCTl9nZW5lcmF0ZV9kc2Ffbm9uY2VcMCIKKyAgICAiQk5fZ2VuZXJhdGVfcHJpbWVfZXhcMCIKKyAgICAiQk5fbHNoaWZ0XDAiCisgICAgIkJOX21vZF9leHAyX21vbnRcMCIKKyAgICAiQk5fbW9kX2V4cF9tb250XDAiCisgICAgIkJOX21vZF9leHBfbW9udF9jb25zdHRpbWVcMCIKKyAgICAiQk5fbW9kX2V4cF9tb250X3dvcmRcMCIKKyAgICAiQk5fbW9kX2ludmVyc2VcMCIKKyAgICAiQk5fbW9kX2ludmVyc2Vfbm9fYnJhbmNoXDAiCisgICAgIkJOX21vZF9sc2hpZnRfcXVpY2tcMCIKKyAgICAiQk5fbW9kX3NxcnRcMCIKKyAgICAiQk5fbmV3XDAiCisgICAgIkJOX3JhbmRcMCIKKyAgICAiQk5fcmFuZF9yYW5nZVwwIgorICAgICJCTl9yc2hpZnRcMCIKKyAgICAiQk5fc3FydFwwIgorICAgICJCTl91c3ViXDAiCisgICAgImJuX3dleHBhbmRcMCIKKyAgICAibW9kX2V4cF9yZWNwXDAiCisgICAgIkJVRl9NRU1fbmV3XDAiCisgICAgIkJVRl9tZW1kdXBcMCIKKyAgICAiQlVGX3N0cm5kdXBcMCIKKyAgICAiYnVmX21lbV9ncm93XDAiCisgICAgIkVWUF9BRUFEX0NUWF9pbml0XDAiCisgICAgIkVWUF9BRUFEX0NUWF9pbml0X3dpdGhfZGlyZWN0aW9uXDAiCisgICAgIkVWUF9BRUFEX0NUWF9vcGVuXDAiCisgICAgIkVWUF9BRUFEX0NUWF9zZWFsXDAiCisgICAgIkVWUF9DSVBIRVJfQ1RYX2NvcHlcMCIKKyAgICAiRVZQX0NJUEhFUl9DVFhfY3RybFwwIgorICAgICJFVlBfQ0lQSEVSX0NUWF9zZXRfa2V5X2xlbmd0aFwwIgorICAgICJFVlBfQ2lwaGVySW5pdF9leFwwIgorICAgICJFVlBfRGVjcnlwdEZpbmFsX2V4XDAiCisgICAgIkVWUF9FbmNyeXB0RmluYWxfZXhcMCIKKyAgICAiYWVhZF9hZXNfY3RyX2htYWNfc2hhMjU2X2luaXRcMCIKKyAgICAiYWVhZF9hZXNfY3RyX2htYWNfc2hhMjU2X29wZW5cMCIKKyAgICAiYWVhZF9hZXNfY3RyX2htYWNfc2hhMjU2X3NlYWxcMCIKKyAgICAiYWVhZF9hZXNfZ2NtX2luaXRcMCIKKyAgICAiYWVhZF9hZXNfZ2NtX29wZW5cMCIKKyAgICAiYWVhZF9hZXNfZ2NtX3NlYWxcMCIKKyAgICAiYWVhZF9hZXNfa2V5X3dyYXBfaW5pdFwwIgorICAgICJhZWFkX2Flc19rZXlfd3JhcF9vcGVuXDAiCisgICAgImFlYWRfYWVzX2tleV93cmFwX3NlYWxcMCIKKyAgICAiYWVhZF9jaGFjaGEyMF9wb2x5MTMwNV9pbml0XDAiCisgICAgImFlYWRfY2hhY2hhMjBfcG9seTEzMDVfb3BlblwwIgorICAgICJhZWFkX2NoYWNoYTIwX3BvbHkxMzA1X3NlYWxcMCIKKyAgICAiYWVhZF9yYzRfbWQ1X3Rsc19pbml0XDAiCisgICAgImFlYWRfcmM0X21kNV90bHNfb3BlblwwIgorICAgICJhZWFkX3JjNF9tZDVfdGxzX3NlYWxcMCIKKyAgICAiYWVhZF9zc2wzX2Vuc3VyZV9jaXBoZXJfaW5pdFwwIgorICAgICJhZWFkX3NzbDNfaW5pdFwwIgorICAgICJhZWFkX3NzbDNfb3BlblwwIgorICAgICJhZWFkX3NzbDNfc2VhbFwwIgorICAgICJhZWFkX3Rsc19lbnN1cmVfY2lwaGVyX2luaXRcMCIKKyAgICAiYWVhZF90bHNfaW5pdFwwIgorICAgICJhZWFkX3Rsc19vcGVuXDAiCisgICAgImFlYWRfdGxzX3NlYWxcMCIKKyAgICAiYWVzX2luaXRfa2V5XDAiCisgICAgImFlc25pX2luaXRfa2V5XDAiCisgICAgIkNPTkZfcGFyc2VfbGlzdFwwIgorICAgICJOQ09ORl9sb2FkXDAiCisgICAgImRlZl9sb2FkX2Jpb1wwIgorICAgICJzdHJfY29weVwwIgorICAgICJDUllQVE9fZ2V0X2V4X25ld19pbmRleFwwIgorICAgICJDUllQVE9fc2V0X2V4X2RhdGFcMCIKKyAgICAiZ2V0X2NsYXNzXDAiCisgICAgImdldF9mdW5jX3BvaW50ZXJzXDAiCisgICAgIkRIX25ld19tZXRob2RcMCIKKyAgICAiY29tcHV0ZV9rZXlcMCIKKyAgICAiZ2VuZXJhdGVfa2V5XDAiCisgICAgImdlbmVyYXRlX3BhcmFtZXRlcnNcMCIKKyAgICAiRVZQX0RpZ2VzdEluaXRfZXhcMCIKKyAgICAiRVZQX01EX0NUWF9jb3B5X2V4XDAiCisgICAgIkRTQV9uZXdfbWV0aG9kXDAiCisgICAgImRzYV9zaWdfY2JcMCIKKyAgICAic2lnblwwIgorICAgICJzaWduX3NldHVwXDAiCisgICAgInZlcmlmeVwwIgorICAgICJCTl90b19mZWxlbVwwIgorICAgICJFQ19HUk9VUF9jb3B5XDAiCisgICAgIkVDX0dST1VQX2dldF9jdXJ2ZV9HRnBcMCIKKyAgICAiRUNfR1JPVVBfZ2V0X2RlZ3JlZVwwIgorICAgICJFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZVwwIgorICAgICJFQ19HUk9VUF9uZXdfY3VydmVfR0ZwXDAiCisgICAgIkVDX0tFWV9jaGVja19rZXlcMCIKKyAgICAiRUNfS0VZX2NvcHlcMCIKKyAgICAiRUNfS0VZX2dlbmVyYXRlX2tleVwwIgorICAgICJFQ19LRVlfbmV3X2J5X2N1cnZlX25hbWVcMCIKKyAgICAiRUNfS0VZX25ld19tZXRob2RcMCIKKyAgICAiRUNfS0VZX3NldF9wdWJsaWNfa2V5X2FmZmluZV9jb29yZGluYXRlc1wwIgorICAgICJFQ19QT0lOVF9hZGRcMCIKKyAgICAiRUNfUE9JTlRfY21wXDAiCisgICAgIkVDX1BPSU5UX2NvcHlcMCIKKyAgICAiRUNfUE9JTlRfZGJsXDAiCisgICAgIkVDX1BPSU5UX2R1cFwwIgorICAgICJFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcFwwIgorICAgICJFQ19QT0lOVF9pbnZlcnRcMCIKKyAgICAiRUNfUE9JTlRfaXNfYXRfaW5maW5pdHlcMCIKKyAgICAiRUNfUE9JTlRfaXNfb25fY3VydmVcMCIKKyAgICAiRUNfUE9JTlRfbWFrZV9hZmZpbmVcMCIKKyAgICAiRUNfUE9JTlRfbmV3XDAiCisgICAgIkVDX1BPSU5UX29jdDJwb2ludFwwIgorICAgICJFQ19QT0lOVF9wb2ludDJvY3RcMCIKKyAgICAiRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRnBcMCIKKyAgICAiRUNfUE9JTlRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0ZwXDAiCisgICAgIkVDX1BPSU5UX3NldF90b19pbmZpbml0eVwwIgorICAgICJFQ19QT0lOVHNfbWFrZV9hZmZpbmVcMCIKKyAgICAiY29tcHV0ZV93TkFGXDAiCisgICAgImQyaV9FQ1BLUGFyYW1ldGVyc1wwIgorICAgICJkMmlfRUNQYXJhbWV0ZXJzXDAiCisgICAgImQyaV9FQ1ByaXZhdGVLZXlcMCIKKyAgICAiZWNfR0ZwX21vbnRfZmllbGRfZGVjb2RlXDAiCisgICAgImVjX0dGcF9tb250X2ZpZWxkX2VuY29kZVwwIgorICAgICJlY19HRnBfbW9udF9maWVsZF9tdWxcMCIKKyAgICAiZWNfR0ZwX21vbnRfZmllbGRfc2V0X3RvX29uZVwwIgorICAgICJlY19HRnBfbW9udF9maWVsZF9zcXJcMCIKKyAgICAiZWNfR0ZwX21vbnRfZ3JvdXBfc2V0X2N1cnZlXDAiCisgICAgImVjX0dGcF9uaXN0cDI1Nl9ncm91cF9zZXRfY3VydmVcMCIKKyAgICAiZWNfR0ZwX25pc3RwMjU2X3BvaW50X2dldF9hZmZpbmVfY29vcmRpbmF0ZXNcMCIKKyAgICAiZWNfR0ZwX25pc3RwMjU2X3BvaW50c19tdWxcMCIKKyAgICAiZWNfR0ZwX3NpbXBsZV9ncm91cF9jaGVja19kaXNjcmltaW5hbnRcMCIKKyAgICAiZWNfR0ZwX3NpbXBsZV9ncm91cF9zZXRfY3VydmVcMCIKKyAgICAiZWNfR0ZwX3NpbXBsZV9tYWtlX2FmZmluZVwwIgorICAgICJlY19HRnBfc2ltcGxlX29jdDJwb2ludFwwIgorICAgICJlY19HRnBfc2ltcGxlX3BvaW50Mm9jdFwwIgorICAgICJlY19HRnBfc2ltcGxlX3BvaW50X2dldF9hZmZpbmVfY29vcmRpbmF0ZXNcMCIKKyAgICAiZWNfR0ZwX3NpbXBsZV9wb2ludF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzXDAiCisgICAgImVjX0dGcF9zaW1wbGVfcG9pbnRzX21ha2VfYWZmaW5lXDAiCisgICAgImVjX0dGcF9zaW1wbGVfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNcMCIKKyAgICAiZWNfYXNuMV9ncm91cDJwa3BhcmFtZXRlcnNcMCIKKyAgICAiZWNfYXNuMV9wa3BhcmFtZXRlcnMyZ3JvdXBcMCIKKyAgICAiZWNfZ3JvdXBfY29weVwwIgorICAgICJlY19ncm91cF9uZXdcMCIKKyAgICAiZWNfZ3JvdXBfbmV3X2N1cnZlX0dGcFwwIgorICAgICJlY19ncm91cF9uZXdfZnJvbV9kYXRhXDAiCisgICAgImVjX3BvaW50X3NldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnBcMCIKKyAgICAiZWNfcHJlX2NvbXBfbmV3XDAiCisgICAgImVjX3dOQUZfbXVsXDAiCisgICAgImVjX3dOQUZfcHJlY29tcHV0ZV9tdWx0XDAiCisgICAgImkyZF9FQ1BLUGFyYW1ldGVyc1wwIgorICAgICJpMmRfRUNQYXJhbWV0ZXJzXDAiCisgICAgImkyZF9FQ1ByaXZhdGVLZXlcMCIKKyAgICAiaTJvX0VDUHVibGljS2V5XDAiCisgICAgIm5pc3RwMjU2X3ByZV9jb21wX25ld1wwIgorICAgICJvMmlfRUNQdWJsaWNLZXlcMCIKKyAgICAiRUNESF9jb21wdXRlX2tleVwwIgorICAgICJFQ0RTQV9kb19zaWduX2V4XDAiCisgICAgIkVDRFNBX2RvX3ZlcmlmeVwwIgorICAgICJFQ0RTQV9zaWduX2V4XDAiCisgICAgImRpZ2VzdF90b19iblwwIgorICAgICJlY2RzYV9zaWduX3NldHVwXDAiCisgICAgIkVWUF9EaWdlc3RTaWduQWxnb3JpdGhtXDAiCisgICAgIkVWUF9EaWdlc3RWZXJpZnlJbml0RnJvbUFsZ29yaXRobVwwIgorICAgICJFVlBfUEtFWV9DVFhfY3RybFwwIgorICAgICJFVlBfUEtFWV9DVFhfZHVwXDAiCisgICAgIkVWUF9QS0VZX0NUWF9nZXQwX3JzYV9vYWVwX2xhYmVsXDAiCisgICAgIkVWUF9QS0VZX2NvcHlfcGFyYW1ldGVyc1wwIgorICAgICJFVlBfUEtFWV9kZWNyeXB0XDAiCisgICAgIkVWUF9QS0VZX2RlY3J5cHRfaW5pdFwwIgorICAgICJFVlBfUEtFWV9kZXJpdmVcMCIKKyAgICAiRVZQX1BLRVlfZGVyaXZlX2luaXRcMCIKKyAgICAiRVZQX1BLRVlfZGVyaXZlX3NldF9wZWVyXDAiCisgICAgIkVWUF9QS0VZX2VuY3J5cHRcMCIKKyAgICAiRVZQX1BLRVlfZW5jcnlwdF9pbml0XDAiCisgICAgIkVWUF9QS0VZX2dldDFfREhcMCIKKyAgICAiRVZQX1BLRVlfZ2V0MV9EU0FcMCIKKyAgICAiRVZQX1BLRVlfZ2V0MV9FQ19LRVlcMCIKKyAgICAiRVZQX1BLRVlfZ2V0MV9SU0FcMCIKKyAgICAiRVZQX1BLRVlfa2V5Z2VuXDAiCisgICAgIkVWUF9QS0VZX2tleWdlbl9pbml0XDAiCisgICAgIkVWUF9QS0VZX25ld1wwIgorICAgICJFVlBfUEtFWV9zZXRfdHlwZVwwIgorICAgICJFVlBfUEtFWV9zaWduXDAiCisgICAgIkVWUF9QS0VZX3NpZ25faW5pdFwwIgorICAgICJFVlBfUEtFWV92ZXJpZnlcMCIKKyAgICAiRVZQX1BLRVlfdmVyaWZ5X2luaXRcMCIKKyAgICAiY2hlY2tfcGFkZGluZ19tZFwwIgorICAgICJkMmlfQXV0b1ByaXZhdGVLZXlcMCIKKyAgICAiZDJpX1ByaXZhdGVLZXlcMCIKKyAgICAiZG9fRUNfS0VZX3ByaW50XDAiCisgICAgImRvX2RzYV9wcmludFwwIgorICAgICJkb19yc2FfcHJpbnRcMCIKKyAgICAiZG9fc2lndmVyX2luaXRcMCIKKyAgICAiZHNhX3BhcmFtX2RlY29kZVwwIgorICAgICJkc2FfcHJpdl9kZWNvZGVcMCIKKyAgICAiZHNhX3ByaXZfZW5jb2RlXDAiCisgICAgImRzYV9wdWJfZGVjb2RlXDAiCisgICAgImRzYV9wdWJfZW5jb2RlXDAiCisgICAgImRzYV9zaWdfcHJpbnRcMCIKKyAgICAiZWNrZXlfcGFyYW0ydHlwZVwwIgorICAgICJlY2tleV9wYXJhbV9kZWNvZGVcMCIKKyAgICAiZWNrZXlfcHJpdl9kZWNvZGVcMCIKKyAgICAiZWNrZXlfcHJpdl9lbmNvZGVcMCIKKyAgICAiZWNrZXlfcHViX2RlY29kZVwwIgorICAgICJlY2tleV9wdWJfZW5jb2RlXDAiCisgICAgImVja2V5X3R5cGUycGFyYW1cMCIKKyAgICAiZXZwX3BrZXlfY3R4X25ld1wwIgorICAgICJobWFjX3NpZ25jdHhcMCIKKyAgICAiaTJkX1B1YmxpY0tleVwwIgorICAgICJvbGRfZHNhX3ByaXZfZGVjb2RlXDAiCisgICAgIm9sZF9lY19wcml2X2RlY29kZVwwIgorICAgICJvbGRfcnNhX3ByaXZfZGVjb2RlXDAiCisgICAgInBrZXlfZWNfY3RybFwwIgorICAgICJwa2V5X2VjX2Rlcml2ZVwwIgorICAgICJwa2V5X2VjX2tleWdlblwwIgorICAgICJwa2V5X2VjX3BhcmFtZ2VuXDAiCisgICAgInBrZXlfZWNfc2lnblwwIgorICAgICJwa2V5X2htYWNfY3RybFwwIgorICAgICJwa2V5X3JzYV9jdHJsXDAiCisgICAgInBrZXlfcnNhX2RlY3J5cHRcMCIKKyAgICAicGtleV9yc2FfZW5jcnlwdFwwIgorICAgICJwa2V5X3JzYV9zaWduXDAiCisgICAgInJzYV9hbGdvcl90b19tZFwwIgorICAgICJyc2FfZGlnZXN0X3ZlcmlmeV9pbml0X2Zyb21fYWxnb3JpdGhtXDAiCisgICAgInJzYV9tZ2YxX3RvX21kXDAiCisgICAgInJzYV9wcml2X2RlY29kZVwwIgorICAgICJyc2FfcHJpdl9lbmNvZGVcMCIKKyAgICAicnNhX3Bzc190b19jdHhcMCIKKyAgICAicnNhX3B1Yl9kZWNvZGVcMCIKKyAgICAiSEtERlwwIgorICAgICJPQkpfY3JlYXRlXDAiCisgICAgIk9CSl9kdXBcMCIKKyAgICAiT0JKX25pZDJvYmpcMCIKKyAgICAiT0JKX3R4dDJvYmpcMCIKKyAgICAiUEVNX0FTTjFfcmVhZFwwIgorICAgICJQRU1fQVNOMV9yZWFkX2Jpb1wwIgorICAgICJQRU1fQVNOMV93cml0ZVwwIgorICAgICJQRU1fQVNOMV93cml0ZV9iaW9cMCIKKyAgICAiUEVNX1g1MDlfSU5GT19yZWFkXDAiCisgICAgIlBFTV9YNTA5X0lORk9fcmVhZF9iaW9cMCIKKyAgICAiUEVNX1g1MDlfSU5GT193cml0ZV9iaW9cMCIKKyAgICAiUEVNX2RvX2hlYWRlclwwIgorICAgICJQRU1fZ2V0X0VWUF9DSVBIRVJfSU5GT1wwIgorICAgICJQRU1fcmVhZFwwIgorICAgICJQRU1fcmVhZF9ESHBhcmFtc1wwIgorICAgICJQRU1fcmVhZF9Qcml2YXRlS2V5XDAiCisgICAgIlBFTV9yZWFkX2Jpb1wwIgorICAgICJQRU1fcmVhZF9iaW9fREhwYXJhbXNcMCIKKyAgICAiUEVNX3JlYWRfYmlvX1BhcmFtZXRlcnNcMCIKKyAgICAiUEVNX3JlYWRfYmlvX1ByaXZhdGVLZXlcMCIKKyAgICAiUEVNX3dyaXRlXDAiCisgICAgIlBFTV93cml0ZV9Qcml2YXRlS2V5XDAiCisgICAgIlBFTV93cml0ZV9iaW9cMCIKKyAgICAiZDJpX1BLQ1M4UHJpdmF0ZUtleV9iaW9cMCIKKyAgICAiZDJpX1BLQ1M4UHJpdmF0ZUtleV9mcFwwIgorICAgICJkb19wazhwa2V5XDAiCisgICAgImRvX3BrOHBrZXlfZnBcMCIKKyAgICAibG9hZF9pdlwwIgorICAgICJFVlBfUEtDUzgyUEtFWVwwIgorICAgICJFVlBfUEtFWTJQS0NTOFwwIgorICAgICJQS0NTMTJfZ2V0X2tleV9hbmRfY2VydHNcMCIKKyAgICAiUEtDUzEyX2hhbmRsZV9jb250ZW50X2luZm9cMCIKKyAgICAiUEtDUzEyX2hhbmRsZV9jb250ZW50X2luZm9zXDAiCisgICAgIlBLQ1M1X3BiZTJfc2V0X2l2XDAiCisgICAgIlBLQ1M1X3BiZV9zZXRcMCIKKyAgICAiUEtDUzVfcGJlX3NldDBfYWxnb3JcMCIKKyAgICAiUEtDUzVfcGJrZGYyX3NldFwwIgorICAgICJQS0NTOF9kZWNyeXB0XDAiCisgICAgIlBLQ1M4X2VuY3J5cHRcMCIKKyAgICAiUEtDUzhfZW5jcnlwdF9wYmVcMCIKKyAgICAicGJlX2NpcGhlcl9pbml0XDAiCisgICAgInBiZV9jcnlwdFwwIgorICAgICJwa2NzMTJfaXRlbV9kZWNyeXB0X2QyaVwwIgorICAgICJwa2NzMTJfaXRlbV9pMmRfZW5jcnlwdFwwIgorICAgICJwa2NzMTJfa2V5X2dlbl9yYXdcMCIKKyAgICAicGtjczEyX3BiZV9rZXlpdmdlblwwIgorICAgICJCTl9CTElORElOR19jb252ZXJ0X2V4XDAiCisgICAgIkJOX0JMSU5ESU5HX2NyZWF0ZV9wYXJhbVwwIgorICAgICJCTl9CTElORElOR19pbnZlcnRfZXhcMCIKKyAgICAiQk5fQkxJTkRJTkdfbmV3XDAiCisgICAgIkJOX0JMSU5ESU5HX3VwZGF0ZVwwIgorICAgICJSU0FfY2hlY2tfa2V5XDAiCisgICAgIlJTQV9uZXdfbWV0aG9kXDAiCisgICAgIlJTQV9wYWRkaW5nX2FkZF9QS0NTMV9PQUVQX21nZjFcMCIKKyAgICAiUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX1BTU19tZ2YxXDAiCisgICAgIlJTQV9wYWRkaW5nX2FkZF9QS0NTMV90eXBlXzFcMCIKKyAgICAiUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX3R5cGVfMlwwIgorICAgICJSU0FfcGFkZGluZ19hZGRfbm9uZVwwIgorICAgICJSU0FfcGFkZGluZ19jaGVja19QS0NTMV9PQUVQX21nZjFcMCIKKyAgICAiUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8xXDAiCisgICAgIlJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMlwwIgorICAgICJSU0FfcGFkZGluZ19jaGVja19ub25lXDAiCisgICAgIlJTQV9yZWNvdmVyX2NydF9wYXJhbXNcMCIKKyAgICAiUlNBX3NpZ25cMCIKKyAgICAiUlNBX3ZlcmlmeVwwIgorICAgICJSU0FfdmVyaWZ5X1BLQ1MxX1BTU19tZ2YxXDAiCisgICAgImRlY3J5cHRcMCIKKyAgICAiZW5jcnlwdFwwIgorICAgICJrZXlnZW5cMCIKKyAgICAicGtjczFfcHJlZml4ZWRfbXNnXDAiCisgICAgInByaXZhdGVfdHJhbnNmb3JtXDAiCisgICAgInJzYV9zZXR1cF9ibGluZGluZ1wwIgorICAgICJzaWduX3Jhd1wwIgorICAgICJ2ZXJpZnlfcmF3XDAiCisgICAgIlNTTF9BRUFEX0NUWF9uZXdcMCIKKyAgICAiU1NMX0FFQURfQ1RYX29wZW5cMCIKKyAgICAiU1NMX0FFQURfQ1RYX3NlYWxcMCIKKyAgICAiU1NMX0NUWF9jaGVja19wcml2YXRlX2tleVwwIgorICAgICJTU0xfQ1RYX25ld1wwIgorICAgICJTU0xfQ1RYX3NldDFfdGxzX2NoYW5uZWxfaWRcMCIKKyAgICAiU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3RcMCIKKyAgICAiU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3RfdGxzMTFcMCIKKyAgICAiU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0XDAiCisgICAgIlNTTF9DVFhfc2V0X3RtcF9kaFwwIgorICAgICJTU0xfQ1RYX3NldF90bXBfZWNkaFwwIgorICAgICJTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5XDAiCisgICAgIlNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfQVNOMVwwIgorICAgICJTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGVcMCIKKyAgICAiU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleVwwIgorICAgICJTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5X0FTTjFcMCIKKyAgICAiU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleV9maWxlXDAiCisgICAgIlNTTF9DVFhfdXNlX2NlcnRpZmljYXRlXDAiCisgICAgIlNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX0FTTjFcMCIKKyAgICAiU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZVwwIgorICAgICJTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9maWxlXDAiCisgICAgIlNTTF9DVFhfdXNlX3Bza19pZGVudGl0eV9oaW50XDAiCisgICAgIlNTTF9TRVNTSU9OX25ld1wwIgorICAgICJTU0xfU0VTU0lPTl9wcmludF9mcFwwIgorICAgICJTU0xfU0VTU0lPTl9zZXQxX2lkX2NvbnRleHRcMCIKKyAgICAiU1NMX1NFU1NJT05fdG9fYnl0ZXNfZnVsbFwwIgorICAgICJTU0xfYWNjZXB0XDAiCisgICAgIlNTTF9hZGRfZGlyX2NlcnRfc3ViamVjdHNfdG9fc3RhY2tcMCIKKyAgICAiU1NMX2FkZF9maWxlX2NlcnRfc3ViamVjdHNfdG9fc3RhY2tcMCIKKyAgICAiU1NMX2NoZWNrX3ByaXZhdGVfa2V5XDAiCisgICAgIlNTTF9jbGVhclwwIgorICAgICJTU0xfY29ubmVjdFwwIgorICAgICJTU0xfZG9faGFuZHNoYWtlXDAiCisgICAgIlNTTF9sb2FkX2NsaWVudF9DQV9maWxlXDAiCisgICAgIlNTTF9uZXdcMCIKKyAgICAiU1NMX3BlZWtcMCIKKyAgICAiU1NMX3JlYWRcMCIKKyAgICAiU1NMX3JlbmVnb3RpYXRlXDAiCisgICAgIlNTTF9zZXQxX3Rsc19jaGFubmVsX2lkXDAiCisgICAgIlNTTF9zZXRfY2lwaGVyX2xpc3RcMCIKKyAgICAiU1NMX3NldF9mZFwwIgorICAgICJTU0xfc2V0X3JmZFwwIgorICAgICJTU0xfc2V0X3Nlc3Npb25faWRfY29udGV4dFwwIgorICAgICJTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWVcMCIKKyAgICAiU1NMX3NldF90bXBfZGhcMCIKKyAgICAiU1NMX3NldF90bXBfZWNkaFwwIgorICAgICJTU0xfc2V0X3dmZFwwIgorICAgICJTU0xfc2h1dGRvd25cMCIKKyAgICAiU1NMX3VzZV9Qcml2YXRlS2V5XDAiCisgICAgIlNTTF91c2VfUHJpdmF0ZUtleV9BU04xXDAiCisgICAgIlNTTF91c2VfUHJpdmF0ZUtleV9maWxlXDAiCisgICAgIlNTTF91c2VfUlNBUHJpdmF0ZUtleVwwIgorICAgICJTU0xfdXNlX1JTQVByaXZhdGVLZXlfQVNOMVwwIgorICAgICJTU0xfdXNlX1JTQVByaXZhdGVLZXlfZmlsZVwwIgorICAgICJTU0xfdXNlX2NlcnRpZmljYXRlXDAiCisgICAgIlNTTF91c2VfY2VydGlmaWNhdGVfQVNOMVwwIgorICAgICJTU0xfdXNlX2NlcnRpZmljYXRlX2ZpbGVcMCIKKyAgICAiU1NMX3VzZV9wc2tfaWRlbnRpdHlfaGludFwwIgorICAgICJTU0xfd3JpdGVcMCIKKyAgICAiZDJpX1NTTF9TRVNTSU9OXDAiCisgICAgImQyaV9TU0xfU0VTU0lPTl9nZXRfb2N0ZXRfc3RyaW5nXDAiCisgICAgImQyaV9TU0xfU0VTU0lPTl9nZXRfc3RyaW5nXDAiCisgICAgImRvX3NzbDNfd3JpdGVcMCIKKyAgICAiZHRsczFfYWNjZXB0XDAiCisgICAgImR0bHMxX2J1ZmZlcl9yZWNvcmRcMCIKKyAgICAiZHRsczFfY2hlY2tfdGltZW91dF9udW1cMCIKKyAgICAiZHRsczFfY29ubmVjdFwwIgorICAgICJkdGxzMV9kb193cml0ZVwwIgorICAgICJkdGxzMV9nZXRfYnVmZmVyZWRfbWVzc2FnZVwwIgorICAgICJkdGxzMV9nZXRfaGVsbG9fdmVyaWZ5XDAiCisgICAgImR0bHMxX2dldF9tZXNzYWdlXDAiCisgICAgImR0bHMxX2dldF9tZXNzYWdlX2ZyYWdtZW50XDAiCisgICAgImR0bHMxX2htX2ZyYWdtZW50X25ld1wwIgorICAgICJkdGxzMV9wcmVwcm9jZXNzX2ZyYWdtZW50XDAiCisgICAgImR0bHMxX3Byb2Nlc3NfZnJhZ21lbnRcMCIKKyAgICAiZHRsczFfcHJvY2Vzc19yZWNvcmRcMCIKKyAgICAiZHRsczFfcmVhZF9ieXRlc1wwIgorICAgICJkdGxzMV9zZWFsX3JlY29yZFwwIgorICAgICJkdGxzMV9zZW5kX2hlbGxvX3ZlcmlmeV9yZXF1ZXN0XDAiCisgICAgImR0bHMxX3dyaXRlX2FwcF9kYXRhXDAiCisgICAgImkyZF9TU0xfU0VTU0lPTlwwIgorICAgICJzc2wzX2FjY2VwdFwwIgorICAgICJzc2wzX2NlcnRfdmVyaWZ5X2hhc2hcMCIKKyAgICAic3NsM19jaGVja19jZXJ0X2FuZF9hbGdvcml0aG1cMCIKKyAgICAic3NsM19jb25uZWN0XDAiCisgICAgInNzbDNfY3RybFwwIgorICAgICJzc2wzX2N0eF9jdHJsXDAiCisgICAgInNzbDNfZGlnZXN0X2NhY2hlZF9yZWNvcmRzXDAiCisgICAgInNzbDNfZG9fY2hhbmdlX2NpcGhlcl9zcGVjXDAiCisgICAgInNzbDNfZXhwZWN0X2NoYW5nZV9jaXBoZXJfc3BlY1wwIgorICAgICJzc2wzX2dldF9jZXJ0X3N0YXR1c1wwIgorICAgICJzc2wzX2dldF9jZXJ0X3ZlcmlmeVwwIgorICAgICJzc2wzX2dldF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0XDAiCisgICAgInNzbDNfZ2V0X2NoYW5uZWxfaWRcMCIKKyAgICAic3NsM19nZXRfY2xpZW50X2NlcnRpZmljYXRlXDAiCisgICAgInNzbDNfZ2V0X2NsaWVudF9oZWxsb1wwIgorICAgICJzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlXDAiCisgICAgInNzbDNfZ2V0X2ZpbmlzaGVkXDAiCisgICAgInNzbDNfZ2V0X2luaXRpYWxfYnl0ZXNcMCIKKyAgICAic3NsM19nZXRfbWVzc2FnZVwwIgorICAgICJzc2wzX2dldF9uZXdfc2Vzc2lvbl90aWNrZXRcMCIKKyAgICAic3NsM19nZXRfbmV4dF9wcm90b1wwIgorICAgICJzc2wzX2dldF9yZWNvcmRcMCIKKyAgICAic3NsM19nZXRfc2VydmVyX2NlcnRpZmljYXRlXDAiCisgICAgInNzbDNfZ2V0X3NlcnZlcl9kb25lXDAiCisgICAgInNzbDNfZ2V0X3NlcnZlcl9oZWxsb1wwIgorICAgICJzc2wzX2dldF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlXDAiCisgICAgInNzbDNfZ2V0X3YyX2NsaWVudF9oZWxsb1wwIgorICAgICJzc2wzX2hhbmRzaGFrZV9tYWNcMCIKKyAgICAic3NsM19vdXRwdXRfY2VydF9jaGFpblwwIgorICAgICJzc2wzX3ByZlwwIgorICAgICJzc2wzX3JlYWRfYnl0ZXNcMCIKKyAgICAic3NsM19yZWFkX25cMCIKKyAgICAic3NsM19yZWNvcmRfc2VxdWVuY2VfdXBkYXRlXDAiCisgICAgInNzbDNfc2VhbF9yZWNvcmRcMCIKKyAgICAic3NsM19zZW5kX2NlcnRfdmVyaWZ5XDAiCisgICAgInNzbDNfc2VuZF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0XDAiCisgICAgInNzbDNfc2VuZF9jaGFubmVsX2lkXDAiCisgICAgInNzbDNfc2VuZF9jbGllbnRfY2VydGlmaWNhdGVcMCIKKyAgICAic3NsM19zZW5kX2NsaWVudF9oZWxsb1wwIgorICAgICJzc2wzX3NlbmRfY2xpZW50X2tleV9leGNoYW5nZVwwIgorICAgICJzc2wzX3NlbmRfc2VydmVyX2NlcnRpZmljYXRlXDAiCisgICAgInNzbDNfc2VuZF9zZXJ2ZXJfaGVsbG9cMCIKKyAgICAic3NsM19zZW5kX3NlcnZlcl9rZXlfZXhjaGFuZ2VcMCIKKyAgICAic3NsM19zZXR1cF9yZWFkX2J1ZmZlclwwIgorICAgICJzc2wzX3NldHVwX3dyaXRlX2J1ZmZlclwwIgorICAgICJzc2wzX3dyaXRlX2J5dGVzXDAiCisgICAgInNzbDNfd3JpdGVfcGVuZGluZ1wwIgorICAgICJzc2xfYWRkX2NlcnRfY2hhaW5cMCIKKyAgICAic3NsX2FkZF9jZXJ0X3RvX2J1ZlwwIgorICAgICJzc2xfYWRkX2NsaWVudGhlbGxvX3JlbmVnb3RpYXRlX2V4dFwwIgorICAgICJzc2xfYWRkX2NsaWVudGhlbGxvX3Rsc2V4dFwwIgorICAgICJzc2xfYWRkX2NsaWVudGhlbGxvX3VzZV9zcnRwX2V4dFwwIgorICAgICJzc2xfYWRkX3NlcnZlcmhlbGxvX3JlbmVnb3RpYXRlX2V4dFwwIgorICAgICJzc2xfYWRkX3NlcnZlcmhlbGxvX3Rsc2V4dFwwIgorICAgICJzc2xfYWRkX3NlcnZlcmhlbGxvX3VzZV9zcnRwX2V4dFwwIgorICAgICJzc2xfYnVpbGRfY2VydF9jaGFpblwwIgorICAgICJzc2xfYnl0ZXNfdG9fY2lwaGVyX2xpc3RcMCIKKyAgICAic3NsX2NlcnRfZHVwXDAiCisgICAgInNzbF9jZXJ0X2luc3RcMCIKKyAgICAic3NsX2NlcnRfbmV3XDAiCisgICAgInNzbF9jaGVja19zZXJ2ZXJoZWxsb190bHNleHRcMCIKKyAgICAic3NsX2NoZWNrX3NydnJfZWNjX2NlcnRfYW5kX2FsZ1wwIgorICAgICJzc2xfY2lwaGVyX3Byb2Nlc3NfcnVsZXN0clwwIgorICAgICJzc2xfY2lwaGVyX3N0cmVuZ3RoX3NvcnRcMCIKKyAgICAic3NsX2NyZWF0ZV9jaXBoZXJfbGlzdFwwIgorICAgICJzc2xfY3R4X2xvZ19tYXN0ZXJfc2VjcmV0XDAiCisgICAgInNzbF9jdHhfbG9nX3JzYV9jbGllbnRfa2V5X2V4Y2hhbmdlXDAiCisgICAgInNzbF9jdHhfbWFrZV9wcm9maWxlc1wwIgorICAgICJzc2xfZ2V0X25ld19zZXNzaW9uXDAiCisgICAgInNzbF9nZXRfcHJldl9zZXNzaW9uXDAiCisgICAgInNzbF9nZXRfc2VydmVyX2NlcnRfaW5kZXhcMCIKKyAgICAic3NsX2dldF9zaWduX3BrZXlcMCIKKyAgICAic3NsX2luaXRfd2Jpb19idWZmZXJcMCIKKyAgICAic3NsX3BhcnNlX2NsaWVudGhlbGxvX3JlbmVnb3RpYXRlX2V4dFwwIgorICAgICJzc2xfcGFyc2VfY2xpZW50aGVsbG9fdGxzZXh0XDAiCisgICAgInNzbF9wYXJzZV9jbGllbnRoZWxsb191c2Vfc3J0cF9leHRcMCIKKyAgICAic3NsX3BhcnNlX3NlcnZlcmhlbGxvX3JlbmVnb3RpYXRlX2V4dFwwIgorICAgICJzc2xfcGFyc2Vfc2VydmVyaGVsbG9fdGxzZXh0XDAiCisgICAgInNzbF9wYXJzZV9zZXJ2ZXJoZWxsb191c2Vfc3J0cF9leHRcMCIKKyAgICAic3NsX3NjYW5fY2xpZW50aGVsbG9fdGxzZXh0XDAiCisgICAgInNzbF9zY2FuX3NlcnZlcmhlbGxvX3Rsc2V4dFwwIgorICAgICJzc2xfc2Vzc19jZXJ0X25ld1wwIgorICAgICJzc2xfc2V0X2NlcnRcMCIKKyAgICAic3NsX3NldF9wa2V5XDAiCisgICAgInNzbF92ZXJpZnlfY2VydF9jaGFpblwwIgorICAgICJ0bHMxMl9jaGVja19wZWVyX3NpZ2FsZ1wwIgorICAgICJ0bHMxX2FlYWRfY3R4X2luaXRcMCIKKyAgICAidGxzMV9jZXJ0X3ZlcmlmeV9tYWNcMCIKKyAgICAidGxzMV9jaGFuZ2VfY2lwaGVyX3N0YXRlXDAiCisgICAgInRsczFfY2hhbmdlX2NpcGhlcl9zdGF0ZV9hZWFkXDAiCisgICAgInRsczFfY2hlY2tfZHVwbGljYXRlX2V4dGVuc2lvbnNcMCIKKyAgICAidGxzMV9lbmNcMCIKKyAgICAidGxzMV9leHBvcnRfa2V5aW5nX21hdGVyaWFsXDAiCisgICAgInRsczFfcHJmXDAiCisgICAgInRsczFfc2V0dXBfa2V5X2Jsb2NrXDAiCisgICAgIkFTTjFfZGlnZXN0XDAiCisgICAgIkFTTjFfaXRlbV9zaWduX2N0eFwwIgorICAgICJBU04xX2l0ZW1fdmVyaWZ5XDAiCisgICAgIk5FVFNDQVBFX1NQS0lfYjY0X2RlY29kZVwwIgorICAgICJORVRTQ0FQRV9TUEtJX2I2NF9lbmNvZGVcMCIKKyAgICAiUEtDUzdfZ2V0X0NSTHNcMCIKKyAgICAiUEtDUzdfZ2V0X2NlcnRpZmljYXRlc1wwIgorICAgICJYNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfTklEXDAiCisgICAgIlg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV9PQkpcMCIKKyAgICAiWDUwOV9BVFRSSUJVVEVfY3JlYXRlX2J5X3R4dFwwIgorICAgICJYNTA5X0FUVFJJQlVURV9nZXQwX2RhdGFcMCIKKyAgICAiWDUwOV9BVFRSSUJVVEVfc2V0MV9kYXRhXDAiCisgICAgIlg1MDlfQ1JMX2FkZDBfcmV2b2tlZFwwIgorICAgICJYNTA5X0NSTF9kaWZmXDAiCisgICAgIlg1MDlfQ1JMX3ByaW50X2ZwXDAiCisgICAgIlg1MDlfRVhURU5TSU9OX2NyZWF0ZV9ieV9OSURcMCIKKyAgICAiWDUwOV9FWFRFTlNJT05fY3JlYXRlX2J5X09CSlwwIgorICAgICJYNTA5X0lORk9fbmV3XDAiCisgICAgIlg1MDlfTkFNRV9FTlRSWV9jcmVhdGVfYnlfTklEXDAiCisgICAgIlg1MDlfTkFNRV9FTlRSWV9jcmVhdGVfYnlfdHh0XDAiCisgICAgIlg1MDlfTkFNRV9FTlRSWV9zZXRfb2JqZWN0XDAiCisgICAgIlg1MDlfTkFNRV9hZGRfZW50cnlcMCIKKyAgICAiWDUwOV9OQU1FX29uZWxpbmVcMCIKKyAgICAiWDUwOV9OQU1FX3ByaW50XDAiCisgICAgIlg1MDlfUEtFWV9uZXdcMCIKKyAgICAiWDUwOV9QVUJLRVlfZ2V0XDAiCisgICAgIlg1MDlfUFVCS0VZX3NldFwwIgorICAgICJYNTA5X1JFUV9jaGVja19wcml2YXRlX2tleVwwIgorICAgICJYNTA5X1JFUV90b19YNTA5XDAiCisgICAgIlg1MDlfU1RPUkVfQ1RYX2dldDFfaXNzdWVyXDAiCisgICAgIlg1MDlfU1RPUkVfQ1RYX2luaXRcMCIKKyAgICAiWDUwOV9TVE9SRV9DVFhfbmV3XDAiCisgICAgIlg1MDlfU1RPUkVfQ1RYX3B1cnBvc2VfaW5oZXJpdFwwIgorICAgICJYNTA5X1NUT1JFX2FkZF9jZXJ0XDAiCisgICAgIlg1MDlfU1RPUkVfYWRkX2NybFwwIgorICAgICJYNTA5X1RSVVNUX2FkZFwwIgorICAgICJYNTA5X1RSVVNUX3NldFwwIgorICAgICJYNTA5X2NoZWNrX3ByaXZhdGVfa2V5XDAiCisgICAgIlg1MDlfZ2V0X3B1YmtleV9wYXJhbWV0ZXJzXDAiCisgICAgIlg1MDlfbG9hZF9jZXJ0X2NybF9maWxlXDAiCisgICAgIlg1MDlfbG9hZF9jZXJ0X2ZpbGVcMCIKKyAgICAiWDUwOV9sb2FkX2NybF9maWxlXDAiCisgICAgIlg1MDlfcHJpbnRfZXhfZnBcMCIKKyAgICAiWDUwOV90b19YNTA5X1JFUVwwIgorICAgICJYNTA5X3ZlcmlmeV9jZXJ0XDAiCisgICAgIlg1MDlhdF9hZGQxX2F0dHJcMCIKKyAgICAiWDUwOXYzX2FkZF9leHRcMCIKKyAgICAiYWRkX2NlcnRfZGlyXDAiCisgICAgImJ5X2ZpbGVfY3RybFwwIgorICAgICJjaGVja19wb2xpY3lcMCIKKyAgICAiZGlyX2N0cmxcMCIKKyAgICAiZ2V0X2NlcnRfYnlfc3ViamVjdFwwIgorICAgICJpMmRfRFNBX1BVQktFWVwwIgorICAgICJpMmRfRUNfUFVCS0VZXDAiCisgICAgImkyZF9SU0FfUFVCS0VZXDAiCisgICAgInBrY3M3X3BhcnNlX2hlYWRlclwwIgorICAgICJ4NTA5X25hbWVfZW5jb2RlXDAiCisgICAgIng1MDlfbmFtZV9leF9kMmlcMCIKKyAgICAieDUwOV9uYW1lX2V4X25ld1wwIgorICAgICJTWE5FVF9hZGRfaWRfSU5URUdFUlwwIgorICAgICJTWE5FVF9hZGRfaWRfYXNjXDAiCisgICAgIlNYTkVUX2FkZF9pZF91bG9uZ1wwIgorICAgICJTWE5FVF9nZXRfaWRfYXNjXDAiCisgICAgIlNYTkVUX2dldF9pZF91bG9uZ1wwIgorICAgICJYNTA5VjNfRVhUX2FkZFwwIgorICAgICJYNTA5VjNfRVhUX2FkZF9hbGlhc1wwIgorICAgICJYNTA5VjNfRVhUX2ZyZWVcMCIKKyAgICAiWDUwOVYzX0VYVF9pMmRcMCIKKyAgICAiWDUwOVYzX0VYVF9uY29uZlwwIgorICAgICJYNTA5VjNfYWRkMV9pMmRcMCIKKyAgICAiWDUwOVYzX2FkZF92YWx1ZVwwIgorICAgICJYNTA5VjNfZ2V0X3NlY3Rpb25cMCIKKyAgICAiWDUwOVYzX2dldF9zdHJpbmdcMCIKKyAgICAiWDUwOVYzX2dldF92YWx1ZV9ib29sXDAiCisgICAgIlg1MDlWM19wYXJzZV9saXN0XDAiCisgICAgIlg1MDlfUFVSUE9TRV9hZGRcMCIKKyAgICAiWDUwOV9QVVJQT1NFX3NldFwwIgorICAgICJhMmlfR0VORVJBTF9OQU1FXDAiCisgICAgImNvcHlfZW1haWxcMCIKKyAgICAiY29weV9pc3N1ZXJcMCIKKyAgICAiZG9fZGlybmFtZVwwIgorICAgICJkb19leHRfaTJkXDAiCisgICAgImRvX2V4dF9uY29uZlwwIgorICAgICJnbmFtZXNfZnJvbV9zZWN0bmFtZVwwIgorICAgICJoZXhfdG9fc3RyaW5nXDAiCisgICAgImkyc19BU04xX0VOVU1FUkFURURcMCIKKyAgICAiaTJzX0FTTjFfSUE1U1RSSU5HXDAiCisgICAgImkyc19BU04xX0lOVEVHRVJcMCIKKyAgICAiaTJ2X0FVVEhPUklUWV9JTkZPX0FDQ0VTU1wwIgorICAgICJub3RpY2Vfc2VjdGlvblwwIgorICAgICJucmVmX25vc1wwIgorICAgICJwb2xpY3lfc2VjdGlvblwwIgorICAgICJwcm9jZXNzX3BjaV92YWx1ZVwwIgorICAgICJyMmlfY2VydHBvbFwwIgorICAgICJyMmlfcGNpXDAiCisgICAgInMyaV9BU04xX0lBNVNUUklOR1wwIgorICAgICJzMmlfQVNOMV9JTlRFR0VSXDAiCisgICAgInMyaV9BU04xX09DVEVUX1NUUklOR1wwIgorICAgICJzMmlfc2tleV9pZFwwIgorICAgICJzZXRfZGlzdF9wb2ludF9uYW1lXDAiCisgICAgInN0cmluZ190b19oZXhcMCIKKyAgICAidjJpX0FTTjFfQklUX1NUUklOR1wwIgorICAgICJ2MmlfQVVUSE9SSVRZX0lORk9fQUNDRVNTXDAiCisgICAgInYyaV9BVVRIT1JJVFlfS0VZSURcMCIKKyAgICAidjJpX0JBU0lDX0NPTlNUUkFJTlRTXDAiCisgICAgInYyaV9FWFRFTkRFRF9LRVlfVVNBR0VcMCIKKyAgICAidjJpX0dFTkVSQUxfTkFNRVNcMCIKKyAgICAidjJpX0dFTkVSQUxfTkFNRV9leFwwIgorICAgICJ2MmlfTkFNRV9DT05TVFJBSU5UU1wwIgorICAgICJ2MmlfUE9MSUNZX0NPTlNUUkFJTlRTXDAiCisgICAgInYyaV9QT0xJQ1lfTUFQUElOR1NcMCIKKyAgICAidjJpX2NybGRcMCIKKyAgICAidjJpX2lkcFwwIgorICAgICJ2MmlfaXNzdWVyX2FsdFwwIgorICAgICJ2Mmlfc3ViamVjdF9hbHRcMCIKKyAgICAidjNfZ2VuZXJpY19leHRlbnNpb25cMCIKKyAgICAiIjsKKwogY29uc3QgdWludDMyX3Qga09wZW5TU0xSZWFzb25WYWx1ZXNbXSA9IHsKICAgICAweGMzMjA3YmEsCi0gICAgMHhjMzI4N2Q0LAotICAgIDB4YzMzMDdlMywKLSAgICAweGMzMzg3ZjMsCi0gICAgMHhjMzQwODAyLAotICAgIDB4YzM0ODgxYiwKLSAgICAweGMzNTA4MjcsCi0gICAgMHhjMzU4ODQ0LAotICAgIDB4YzM2MDg1NiwKLSAgICAweGMzNjg4NjQsCi0gICAgMHhjMzcwODc0LAotICAgIDB4YzM3ODg4MSwKLSAgICAweGMzODA4OTEsCi0gICAgMHhjMzg4ODljLAotICAgIDB4YzM5MDhiMiwKLSAgICAweGMzOTg4YzEsCi0gICAgMHhjM2EwOGQ1LAotICAgIDB4YzNhODdjNywKLSAgICAweGMzYjAwYjAsCi0gICAgMHgxMDMyMTQ3OCwKLSAgICAweDEwMzI5NDg0LAotICAgIDB4MTAzMzE0OWQsCi0gICAgMHgxMDMzOTRiMCwKLSAgICAweDEwMzQwZGUxLAotICAgIDB4MTAzNDk0Y2YsCi0gICAgMHgxMDM1MTRlNCwKLSAgICAweDEwMzU5NTE2LAotICAgIDB4MTAzNjE1MmYsCi0gICAgMHgxMDM2OTU0NCwKLSAgICAweDEwMzcxNTYyLAotICAgIDB4MTAzNzk1NzEsCi0gICAgMHgxMDM4MTU4ZCwKLSAgICAweDEwMzg5NWE4LAotICAgIDB4MTAzOTE1YjcsCi0gICAgMHgxMDM5OTVkMywKLSAgICAweDEwM2ExNWVlLAotICAgIDB4MTAzYTk2MDUsCi0gICAgMHgxMDNiMTYxNiwKLSAgICAweDEwM2I5NjJhLAotICAgIDB4MTAzYzE2NDksCi0gICAgMHgxMDNjOTY1OCwKLSAgICAweDEwM2QxNjZmLAotICAgIDB4MTAzZDk2ODIsCi0gICAgMHgxMDNlMGI2YywKLSAgICAweDEwM2U5NmIzLAotICAgIDB4MTAzZjE2YzYsCi0gICAgMHgxMDNmOTZlMCwKLSAgICAweDEwNDAxNmYwLAotICAgIDB4MTA0MDk3MDQsCi0gICAgMHgxMDQxMTcxYSwKLSAgICAweDEwNDE5NzMyLAotICAgIDB4MTA0MjE3NDcsCi0gICAgMHgxMDQyOTc1YiwKLSAgICAweDEwNDMxNzZkLAorICAgIDB4YzMyODdjNywKKyAgICAweGMzMzA3ZDYsCisgICAgMHhjMzM4N2U2LAorICAgIDB4YzM0MDdmNSwKKyAgICAweGMzNDg4MGUsCisgICAgMHhjMzUwODFhLAorICAgIDB4YzM1ODgzNywKKyAgICAweGMzNjA4NDksCisgICAgMHhjMzY4ODU3LAorICAgIDB4YzM3MDg2NywKKyAgICAweGMzNzg4NzQsCisgICAgMHhjMzgwODg0LAorICAgIDB4YzM4ODg4ZiwKKyAgICAweGMzOTA4YTUsCisgICAgMHhjMzk4OGI0LAorICAgIDB4YzNhMDhjOCwKKyAgICAweDEwMzIxNDZiLAorICAgIDB4MTAzMjk0NzcsCisgICAgMHgxMDMzMTQ5MCwKKyAgICAweDEwMzM5NGEzLAorICAgIDB4MTAzNDBkZDQsCisgICAgMHgxMDM0OTRiNiwKKyAgICAweDEwMzUxNGNiLAorICAgIDB4MTAzNTk0ZGUsCisgICAgMHgxMDM2MTRmNywKKyAgICAweDEwMzY5NTBjLAorICAgIDB4MTAzNzE1MmEsCisgICAgMHgxMDM3OTUzOSwKKyAgICAweDEwMzgxNTU1LAorICAgIDB4MTAzODk1NzAsCisgICAgMHgxMDM5MTU3ZiwKKyAgICAweDEwMzk5NTliLAorICAgIDB4MTAzYTE1YjYsCisgICAgMHgxMDNhOTVjZCwKKyAgICAweDEwM2IxNWRlLAorICAgIDB4MTAzYjk1ZjIsCisgICAgMHgxMDNjMTYxMSwKKyAgICAweDEwM2M5NjIwLAorICAgIDB4MTAzZDE2MzcsCisgICAgMHgxMDNkOTY0YSwKKyAgICAweDEwM2UwYjVmLAorICAgIDB4MTAzZTk2NWQsCisgICAgMHgxMDNmMTY3MCwKKyAgICAweDEwM2Y5NjhhLAorICAgIDB4MTA0MDE2OWEsCisgICAgMHgxMDQwOTZhZSwKKyAgICAweDEwNDExNmM0LAorICAgIDB4MTA0MTk2ZGMsCisgICAgMHgxMDQyMTZmMSwKKyAgICAweDEwNDI5NzA1LAorICAgIDB4MTA0MzE3MTcsCiAgICAgMHgxMDQzODVkMCwKLSAgICAweDEwNDQwOGMxLAotICAgIDB4MTA0NDk3ODIsCi0gICAgMHgxMDQ1MTc5OSwKLSAgICAweDEwNDU5N2FlLAotICAgIDB4MTA0NjE3YmMsCi0gICAgMHgxMDQ2OTY5NSwKLSAgICAweDEwNDcxNGY3LAotICAgIDB4MTA0Nzg3YzcsCi0gICAgMHgxMDQ4MDBiMCwKLSAgICAweDEwNDg5NGMzLAotICAgIDB4MTQzMjBiNGYsCi0gICAgMHgxNDMyOGI1ZCwKLSAgICAweDE0MzMwYjZjLAotICAgIDB4MTQzMzhiN2UsCisgICAgMHgxMDQ0MDhiNCwKKyAgICAweDEwNDQ5NzJjLAorICAgIDB4MTA0NTE3NDMsCisgICAgMHgxMDQ1OTc1OCwKKyAgICAweDEwNDYxNzY2LAorICAgIDB4MTQzMjBiNDIsCisgICAgMHgxNDMyOGI1MCwKKyAgICAweDE0MzMwYjVmLAorICAgIDB4MTQzMzhiNzEsCiAgICAgMHgxODMyMDA4MywKLSAgICAweDE4MzI4ZTQ3LAotICAgIDB4MTgzNDBlNzUsCi0gICAgMHgxODM0OGU4OSwKLSAgICAweDE4MzU4ZWMwLAotICAgIDB4MTgzNjhlZWQsCi0gICAgMHgxODM3MGYwMCwKLSAgICAweDE4Mzc4ZjE0LAotICAgIDB4MTgzODBmMzgsCi0gICAgMHgxODM4OGY0NiwKLSAgICAweDE4MzkwZjVjLAotICAgIDB4MTgzOThmNzAsCi0gICAgMHgxODNhMGY4MCwKLSAgICAweDE4M2IwZjkwLAotICAgIDB4MTgzYjhmYTUsCi0gICAgMHgxODNjOGZkMCwKLSAgICAweDE4M2QwZmU0LAotICAgIDB4MTgzZDhmZjQsCi0gICAgMHgxODNlMGI5YiwKLSAgICAweDE4M2U5MDAxLAotICAgIDB4MTgzZjEwMTMsCi0gICAgMHgxODNmOTAxZSwKLSAgICAweDE4NDAxMDJlLAotICAgIDB4MTg0MDkwM2YsCi0gICAgMHgxODQxMTA1MCwKLSAgICAweDE4NDE5MDYyLAotICAgIDB4MTg0MjEwOGIsCi0gICAgMHgxODQyOTBiZCwKLSAgICAweDE4NDMxMGNjLAotICAgIDB4MTg0NTExMzUsCi0gICAgMHgxODQ1OTE0YiwKLSAgICAweDE4NDYxMTY2LAotICAgIDB4MTg0NjhlZDgsCi0gICAgMHgxODQ3MDlkOSwKKyAgICAweDE4MzI4ZTNhLAorICAgIDB4MTgzNDBlNjgsCisgICAgMHgxODM0OGU3YywKKyAgICAweDE4MzU4ZWIzLAorICAgIDB4MTgzNjhlZTAsCisgICAgMHgxODM3MGVmMywKKyAgICAweDE4Mzc4ZjA3LAorICAgIDB4MTgzODBmMmIsCisgICAgMHgxODM4OGYzOSwKKyAgICAweDE4MzkwZjRmLAorICAgIDB4MTgzOThmNjMsCisgICAgMHgxODNhMGY3MywKKyAgICAweDE4M2IwZjgzLAorICAgIDB4MTgzYjhmOTgsCisgICAgMHgxODNjOGZjMywKKyAgICAweDE4M2QwZmQ3LAorICAgIDB4MTgzZDhmZTcsCisgICAgMHgxODNlMGI4ZSwKKyAgICAweDE4M2U4ZmY0LAorICAgIDB4MTgzZjEwMDYsCisgICAgMHgxODNmOTAxMSwKKyAgICAweDE4NDAxMDIxLAorICAgIDB4MTg0MDkwMzIsCisgICAgMHgxODQxMTA0MywKKyAgICAweDE4NDE5MDU1LAorICAgIDB4MTg0MjEwN2UsCisgICAgMHgxODQyOTBiMCwKKyAgICAweDE4NDMxMGJmLAorICAgIDB4MTg0NTExMjgsCisgICAgMHgxODQ1OTEzZSwKKyAgICAweDE4NDYxMTU5LAorICAgIDB4MTg0NjhlY2IsCisgICAgMHgxODQ3MDljYywKICAgICAweDE4NDc4MDk0LAotICAgIDB4MTg0ODBmYmMsCi0gICAgMHgxODQ4OTEwMSwKLSAgICAweDE4NDkwZTVkLAotICAgIDB4MTg0OThlOWUsCi0gICAgMHgxODRhMTE5YywKLSAgICAweDE4NGE5MTE5LAotICAgIDB4MTg0YjEwZTAsCi0gICAgMHgxODRiOGUzNywKLSAgICAweDE4NGMxMGE0LAorICAgIDB4MTg0ODBmYWYsCisgICAgMHgxODQ4OTBmNCwKKyAgICAweDE4NDkwZTUwLAorICAgIDB4MTg0OThlOTEsCisgICAgMHgxODRhMTE4ZiwKKyAgICAweDE4NGE5MTBjLAorICAgIDB4MTg0YjEwZDMsCisgICAgMHgxODRiOGUyYSwKKyAgICAweDE4NGMxMDk3LAogICAgIDB4MTg0Yzg2NmIsCi0gICAgMHgxODRkMTE4MSwKLSAgICAweDIwMzIxMWMzLAotICAgIDB4MjQzMjExY2YsCi0gICAgMHgyNDMyODkwNywKLSAgICAweDI0MzMxMWUxLAotICAgIDB4MjQzMzkxZWUsCi0gICAgMHgyNDM0MTFmYiwKLSAgICAweDI0MzQ5MjBkLAotICAgIDB4MjQzNTEyMWMsCi0gICAgMHgyNDM1OTIzOSwKLSAgICAweDI0MzYxMjQ2LAotICAgIDB4MjQzNjkyNTQsCi0gICAgMHgyNDM3MTI2MiwKLSAgICAweDI0Mzc5MjcwLAotICAgIDB4MjQzODEyNzksCi0gICAgMHgyNDM4OTI4NiwKLSAgICAweDI0MzkxMjk5LAotICAgIDB4MjgzMjBiOGYsCi0gICAgMHgyODMyOGI5YiwKLSAgICAweDI4MzMwYjZjLAotICAgIDB4MjgzMzhiYWUsCi0gICAgMHgyYzMyMmJmZCwKLSAgICAweDJjMzJhYzBiLAotICAgIDB4MmMzMzJjMWQsCi0gICAgMHgyYzMzYWMyZiwKLSAgICAweDJjMzQyYzQzLAotICAgIDB4MmMzNGFjNTUsCi0gICAgMHgyYzM1MmM3MCwKLSAgICAweDJjMzVhYzgyLAotICAgIDB4MmMzNjJjOTUsCisgICAgMHgxODRkMTE3NCwKKyAgICAweDIwMzIxMWI2LAorICAgIDB4MjQzMjExYzIsCisgICAgMHgyNDMyODhmYSwKKyAgICAweDI0MzMxMWQ0LAorICAgIDB4MjQzMzkxZTEsCisgICAgMHgyNDM0MTFlZSwKKyAgICAweDI0MzQ5MjAwLAorICAgIDB4MjQzNTEyMGYsCisgICAgMHgyNDM1OTIyYywKKyAgICAweDI0MzYxMjM5LAorICAgIDB4MjQzNjkyNDcsCisgICAgMHgyNDM3MTI1NSwKKyAgICAweDI0Mzc5MjYzLAorICAgIDB4MjQzODEyNmMsCisgICAgMHgyNDM4OTI3OSwKKyAgICAweDI0MzkxMjhjLAorICAgIDB4MjgzMjBiODIsCisgICAgMHgyODMyOGI4ZSwKKyAgICAweDI4MzMwYjVmLAorICAgIDB4MjgzMzhiYTEsCisgICAgMHgyYzMyMmFiMywKKyAgICAweDJjMzJhYWMxLAorICAgIDB4MmMzMzJhZDMsCisgICAgMHgyYzMzYWFlNSwKKyAgICAweDJjMzQyYWY5LAorICAgIDB4MmMzNGFiMGIsCisgICAgMHgyYzM1MmIyNiwKKyAgICAweDJjMzVhYjM4LAorICAgIDB4MmMzNjJiNGIsCiAgICAgMHgyYzM2ODJmMywKLSAgICAweDJjMzcyY2EyLAotICAgIDB4MmMzN2FjYjQsCi0gICAgMHgyYzM4MmNjNywKLSAgICAweDJjMzhhY2Q1LAotICAgIDB4MmMzOTJjZTUsCi0gICAgMHgyYzM5YWNmNywKLSAgICAweDJjM2EyZDBiLAotICAgIDB4MmMzYWFkMWMsCi0gICAgMHgyYzNiMTM1OSwKLSAgICAweDJjM2JhZDJkLAotICAgIDB4MmMzYzJkNDEsCi0gICAgMHgyYzNjYWQ1NywKLSAgICAweDJjM2QyZDcwLAotICAgIDB4MmMzZGFkOWUsCi0gICAgMHgyYzNlMmRhYywKLSAgICAweDJjM2VhZGM0LAotICAgIDB4MmMzZjJkZGMsCi0gICAgMHgyYzNmYWRlOSwKLSAgICAweDJjNDAyZTBjLAotICAgIDB4MmM0MGFlMmIsCi0gICAgMHgyYzQxMTFjMywKLSAgICAweDJjNDFhZTNjLAotICAgIDB4MmM0MjJlNGYsCi0gICAgMHgyYzQyOTEzNSwKLSAgICAweDJjNDMyZTYwLAorICAgIDB4MmMzNzJiNTgsCisgICAgMHgyYzM3YWI2YSwKKyAgICAweDJjMzgyYjdkLAorICAgIDB4MmMzOGFiOGIsCisgICAgMHgyYzM5MmI5YiwKKyAgICAweDJjMzlhYmFkLAorICAgIDB4MmMzYTJiYzEsCisgICAgMHgyYzNhYWJkMiwKKyAgICAweDJjM2IxMzRjLAorICAgIDB4MmMzYmFiZTMsCisgICAgMHgyYzNjMmJmNywKKyAgICAweDJjM2NhYzBkLAorICAgIDB4MmMzZDJjMjYsCisgICAgMHgyYzNkYWM1NCwKKyAgICAweDJjM2UyYzYyLAorICAgIDB4MmMzZWFjN2EsCisgICAgMHgyYzNmMmM5MiwKKyAgICAweDJjM2ZhYzlmLAorICAgIDB4MmM0MDJjYzIsCisgICAgMHgyYzQwYWNlMSwKKyAgICAweDJjNDExMWI2LAorICAgIDB4MmM0MWFjZjIsCisgICAgMHgyYzQyMmQwNSwKKyAgICAweDJjNDI5MTI4LAorICAgIDB4MmM0MzJkMTYsCiAgICAgMHgyYzQzODZhMiwKLSAgICAweDJjNDQyZDhkLAorICAgIDB4MmM0NDJjNDMsCiAgICAgMHgzMDMyMDAwMCwKICAgICAweDMwMzI4MDE1LAogICAgIDB4MzAzMzAwMWYsCkBAIC0zMTQsMjU3ICsxNjY3LDI0OCBAQAogICAgIDB4MzA1Yzg2ODcsCiAgICAgMHgzMDVkMDY5OCwKICAgICAweDMwNWQ4NmEyLAotICAgIDB4MzQzMjBhYzksCi0gICAgMHgzNDMyOGFkZCwKLSAgICAweDM0MzMwYWZhLAotICAgIDB4MzQzMzhiMGQsCi0gICAgMHgzNDM0MGIxYywKLSAgICAweDM0MzQ4YjM5LAorICAgIDB4MzQzMjBhYmMsCisgICAgMHgzNDMyOGFkMCwKKyAgICAweDM0MzMwYWVkLAorICAgIDB4MzQzMzhiMDAsCisgICAgMHgzNDM0MGIwZiwKKyAgICAweDM0MzQ4YjJjLAogICAgIDB4M2MzMjAwODMsCi0gICAgMHgzYzMyOGJkOCwKLSAgICAweDNjMzMwYmYxLAotICAgIDB4M2MzMzhjMGMsCi0gICAgMHgzYzM0MGMyOSwKLSAgICAweDNjMzQ4YzQ0LAotICAgIDB4M2MzNTBjNWYsCi0gICAgMHgzYzM1OGM3NCwKLSAgICAweDNjMzYwYzhkLAotICAgIDB4M2MzNjhjYTUsCi0gICAgMHgzYzM3MGNiNiwKLSAgICAweDNjMzc4Y2M0LAotICAgIDB4M2MzODBjZDEsCi0gICAgMHgzYzM4OGNlNSwKLSAgICAweDNjMzkwYjliLAotICAgIDB4M2MzOThjZjksCi0gICAgMHgzYzNhMGQwZCwKLSAgICAweDNjM2E4ODgxLAotICAgIDB4M2MzYjBkMWQsCi0gICAgMHgzYzNiOGQzOCwKLSAgICAweDNjM2MwZDRhLAotICAgIDB4M2MzYzhkNjAsCi0gICAgMHgzYzNkMGQ2YSwKLSAgICAweDNjM2Q4ZDdlLAotICAgIDB4M2MzZTBkOGMsCi0gICAgMHgzYzNlOGRiMSwKLSAgICAweDNjM2YwYmM0LAotICAgIDB4M2MzZjhkOWEsCi0gICAgMHg0MDMyMTdkMywKLSAgICAweDQwMzI5N2U5LAotICAgIDB4NDAzMzE4MTcsCi0gICAgMHg0MDMzOTgyMSwKLSAgICAweDQwMzQxODM4LAotICAgIDB4NDAzNDk4NTYsCi0gICAgMHg0MDM1MTg2NiwKLSAgICAweDQwMzU5ODc4LAotICAgIDB4NDAzNjE4ODUsCi0gICAgMHg0MDM2OTg5MSwKLSAgICAweDQwMzcxOGE2LAotICAgIDB4NDAzNzk4YmIsCi0gICAgMHg0MDM4MThjZCwKLSAgICAweDQwMzg5OGQ4LAotICAgIDB4NDAzOTE4ZWEsCi0gICAgMHg0MDM5OGRlMSwKLSAgICAweDQwM2ExOGZhLAotICAgIDB4NDAzYTk5MGQsCi0gICAgMHg0MDNiMTkyZSwKLSAgICAweDQwM2I5OTNmLAotICAgIDB4NDAzYzE5NGYsCisgICAgMHgzYzMyOGJjYiwKKyAgICAweDNjMzMwYmU0LAorICAgIDB4M2MzMzhiZmYsCisgICAgMHgzYzM0MGMxYywKKyAgICAweDNjMzQ4YzM3LAorICAgIDB4M2MzNTBjNTIsCisgICAgMHgzYzM1OGM2NywKKyAgICAweDNjMzYwYzgwLAorICAgIDB4M2MzNjhjOTgsCisgICAgMHgzYzM3MGNhOSwKKyAgICAweDNjMzc4Y2I3LAorICAgIDB4M2MzODBjYzQsCisgICAgMHgzYzM4OGNkOCwKKyAgICAweDNjMzkwYjhlLAorICAgIDB4M2MzOThjZWMsCisgICAgMHgzYzNhMGQwMCwKKyAgICAweDNjM2E4ODc0LAorICAgIDB4M2MzYjBkMTAsCisgICAgMHgzYzNiOGQyYiwKKyAgICAweDNjM2MwZDNkLAorICAgIDB4M2MzYzhkNTMsCisgICAgMHgzYzNkMGQ1ZCwKKyAgICAweDNjM2Q4ZDcxLAorICAgIDB4M2MzZTBkN2YsCisgICAgMHgzYzNlOGRhNCwKKyAgICAweDNjM2YwYmI3LAorICAgIDB4M2MzZjhkOGQsCisgICAgMHg0MDMyMTc3ZCwKKyAgICAweDQwMzI5NzkzLAorICAgIDB4NDAzMzE3YzEsCisgICAgMHg0MDMzOTdjYiwKKyAgICAweDQwMzQxN2UyLAorICAgIDB4NDAzNDk4MDAsCisgICAgMHg0MDM1MTgxMCwKKyAgICAweDQwMzU5ODIyLAorICAgIDB4NDAzNjE4MmYsCisgICAgMHg0MDM2OTgzYiwKKyAgICAweDQwMzcxODUwLAorICAgIDB4NDAzNzk4NjUsCisgICAgMHg0MDM4MTg3NywKKyAgICAweDQwMzg5ODgyLAorICAgIDB4NDAzOTE4OTQsCisgICAgMHg0MDM5OGRkNCwKKyAgICAweDQwM2ExOGE0LAorICAgIDB4NDAzYTk4YjcsCisgICAgMHg0MDNiMThkOCwKKyAgICAweDQwM2I5OGU5LAorICAgIDB4NDAzYzE4ZjksCiAgICAgMHg0MDNjODA2NCwKLSAgICAweDQwM2QxOTViLAotICAgIDB4NDAzZDk5NzcsCi0gICAgMHg0MDNlMTk4ZCwKLSAgICAweDQwM2U5OTljLAotICAgIDB4NDAzZjE5YWYsCi0gICAgMHg0MDNmOTljOSwKLSAgICAweDQwNDAxOWQ3LAotICAgIDB4NDA0MDk5ZWMsCi0gICAgMHg0MDQxMWEwMCwKLSAgICAweDQwNDE5YTFkLAotICAgIDB4NDA0MjFhMzYsCi0gICAgMHg0MDQyOWE1MSwKLSAgICAweDQwNDMxYTZhLAotICAgIDB4NDA0MzlhN2QsCi0gICAgMHg0MDQ0MWE5MSwKLSAgICAweDQwNDQ5YWE5LAotICAgIDB4NDA0NTFhZjQsCi0gICAgMHg0MDQ1OWIwMiwKLSAgICAweDQwNDYxYjIwLAorICAgIDB4NDAzZDE5MDUsCisgICAgMHg0MDNkOTkyMSwKKyAgICAweDQwM2UxOTM3LAorICAgIDB4NDAzZTk5NDYsCisgICAgMHg0MDNmMTk1OSwKKyAgICAweDQwM2Y5OTczLAorICAgIDB4NDA0MDE5ODEsCisgICAgMHg0MDQwOTk5NiwKKyAgICAweDQwNDExOWFhLAorICAgIDB4NDA0MTk5YzcsCisgICAgMHg0MDQyMTllMCwKKyAgICAweDQwNDI5OWZiLAorICAgIDB4NDA0MzFhMTQsCisgICAgMHg0MDQzOWEyNywKKyAgICAweDQwNDQxYTNiLAorICAgIDB4NDA0NDlhNTMsCisgICAgMHg0MDQ1MWE2MywKKyAgICAweDQwNDU5YTcxLAorICAgIDB4NDA0NjFhOGYsCiAgICAgMHg0MDQ2ODA5NCwKLSAgICAweDQwNDcxYjM1LAotICAgIDB4NDA0NzliNDcsCi0gICAgMHg0MDQ4MWI2YiwKLSAgICAweDQwNDg5YjhiLAotICAgIDB4NDA0OTFiOWYsCi0gICAgMHg0MDQ5OWJiNCwKLSAgICAweDQwNGExYmNkLAotICAgIDB4NDA0YTljMDcsCi0gICAgMHg0MDRiMWMzOCwKLSAgICAweDQwNGI5YzZlLAotICAgIDB4NDA0YzFjODksCi0gICAgMHg0MDRjOWNhMywKLSAgICAweDQwNGQxY2JhLAotICAgIDB4NDA0ZDljZTIsCi0gICAgMHg0MDRlMWNmOSwKLSAgICAweDQwNGU5ZDE1LAotICAgIDB4NDA0ZjFkMzEsCi0gICAgMHg0MDRmOWQ1MiwKLSAgICAweDQwNTAxZDc0LAotICAgIDB4NDA1MDlkOTAsCi0gICAgMHg0MDUxMWRhNCwKLSAgICAweDQwNTE5ZGIxLAotICAgIDB4NDA1MjFkYzgsCi0gICAgMHg0MDUyOWRkOCwKLSAgICAweDQwNTMxZGU4LAotICAgIDB4NDA1MzlkZmMsCi0gICAgMHg0MDU0MWUxNywKLSAgICAweDQwNTQ5ZTI3LAotICAgIDB4NDA1NTFlM2UsCi0gICAgMHg0MDU1OWU0ZCwKLSAgICAweDQwNTYxZTdhLAotICAgIDB4NDA1NjllOTIsCi0gICAgMHg0MDU3MWVhZSwKLSAgICAweDQwNTc5ZWM3LAotICAgIDB4NDA1ODFlZGEsCi0gICAgMHg0MDU4OWVlZiwKLSAgICAweDQwNTkxZjEyLAotICAgIDB4NDA1OTlmM2QsCi0gICAgMHg0MDVhMWY0YSwKLSAgICAweDQwNWE5ZjYzLAotICAgIDB4NDA1YjFmN2IsCi0gICAgMHg0MDViOWY4ZSwKLSAgICAweDQwNWMxZmEzLAotICAgIDB4NDA1YzlmYjUsCi0gICAgMHg0MDVkMWZjYSwKLSAgICAweDQwNWQ5ZmRhLAotICAgIDB4NDA1ZTFmZjMsCi0gICAgMHg0MDVlYTAwNywKLSAgICAweDQwNWYyMDE3LAotICAgIDB4NDA1ZmEwMmYsCi0gICAgMHg0MDYwMjA0MCwKLSAgICAweDQwNjBhMDUzLAotICAgIDB4NDA2MTIwNjQsCi0gICAgMHg0MDYxYTA4MiwKLSAgICAweDQwNjIyMDkzLAotICAgIDB4NDA2MmEwYTAsCi0gICAgMHg0MDYzMjBiNywKLSAgICAweDQwNjNhMGY4LAotICAgIDB4NDA2NDIxMGYsCi0gICAgMHg0MDY0YTExYywKLSAgICAweDQwNjUyMTJhLAotICAgIDB4NDA2NWExNGMsCi0gICAgMHg0MDY2MjE3NCwKLSAgICAweDQwNjZhMTg5LAotICAgIDB4NDA2NzIxYTAsCi0gICAgMHg0MDY3YTFiMSwKLSAgICAweDQwNjgyMWMyLAotICAgIDB4NDA2OGExZDMsCi0gICAgMHg0MDY5MjFlOCwKLSAgICAweDQwNjlhMWZmLAotICAgIDB4NDA2YTIyMTAsCi0gICAgMHg0MDZhYTIyOSwKLSAgICAweDQwNmIyMjQ0LAotICAgIDB4NDA2YmEyNWIsCi0gICAgMHg0MDZjMjJjOCwKLSAgICAweDQwNmNhMmU5LAotICAgIDB4NDA2ZDIyZmMsCi0gICAgMHg0MDZkYTMxZCwKLSAgICAweDQwNmUyMzM4LAotICAgIDB4NDA2ZWEzODEsCi0gICAgMHg0MDZmMjNhMiwKLSAgICAweDQwNmZhM2M4LAotICAgIDB4NDA3MDIzZTgsCi0gICAgMHg0MDcwYTQwNCwKLSAgICAweDQwNzEyNTkxLAotICAgIDB4NDA3MWE1YjQsCi0gICAgMHg0MDcyMjVjYSwKLSAgICAweDQwNzJhNWU5LAotICAgIDB4NDA3MzI2MDEsCi0gICAgMHg0MDczYTYyMSwKLSAgICAweDQwNzQyODRiLAotICAgIDB4NDA3NGE4NzAsCi0gICAgMHg0MDc1Mjg4YiwKLSAgICAweDQwNzVhOGFhLAotICAgIDB4NDA3NjI4ZDksCi0gICAgMHg0MDc2YTkwMSwKLSAgICAweDQwNzcyOTMyLAotICAgIDB4NDA3N2E5NTEsCi0gICAgMHg0MDc4Mjk4YiwKLSAgICAweDQwNzhhOWEyLAotICAgIDB4NDA3OTI5YjUsCi0gICAgMHg0MDc5YTlkMiwKKyAgICAweDQwNDcxYWE0LAorICAgIDB4NDA0NzlhYjYsCisgICAgMHg0MDQ4MWFkYSwKKyAgICAweDQwNDg5YWZhLAorICAgIDB4NDA0OTFiMGUsCisgICAgMHg0MDQ5OWIyMywKKyAgICAweDQwNGExYjNjLAorICAgIDB4NDA0YTliNzYsCisgICAgMHg0MDRiMWI5MCwKKyAgICAweDQwNGI5YmFlLAorICAgIDB4NDA0YzFiYzksCisgICAgMHg0MDRjOWJlMywKKyAgICAweDQwNGQxYmZhLAorICAgIDB4NDA0ZDljMjIsCisgICAgMHg0MDRlMWMzOSwKKyAgICAweDQwNGU5YzU1LAorICAgIDB4NDA0ZjFjNzEsCisgICAgMHg0MDRmOWM5MiwKKyAgICAweDQwNTAxY2I0LAorICAgIDB4NDA1MDljZDAsCisgICAgMHg0MDUxMWNlNCwKKyAgICAweDQwNTE5Y2YxLAorICAgIDB4NDA1MjFkMDgsCisgICAgMHg0MDUyOWQxOCwKKyAgICAweDQwNTMxZDI4LAorICAgIDB4NDA1MzlkM2MsCisgICAgMHg0MDU0MWQ1NywKKyAgICAweDQwNTQ5ZDY3LAorICAgIDB4NDA1NTFkN2UsCisgICAgMHg0MDU1OWQ4ZCwKKyAgICAweDQwNTYxZGE4LAorICAgIDB4NDA1NjlkYzAsCisgICAgMHg0MDU3MWRkYywKKyAgICAweDQwNTc5ZGY1LAorICAgIDB4NDA1ODFlMDgsCisgICAgMHg0MDU4OWUxZCwKKyAgICAweDQwNTkxZTQwLAorICAgIDB4NDA1OTllNGUsCisgICAgMHg0MDVhMWU1YiwKKyAgICAweDQwNWE5ZTc0LAorICAgIDB4NDA1YjFlOGMsCisgICAgMHg0MDViOWU5ZiwKKyAgICAweDQwNWMxZWI0LAorICAgIDB4NDA1YzllYzYsCisgICAgMHg0MDVkMWVkYiwKKyAgICAweDQwNWQ5ZWViLAorICAgIDB4NDA1ZTFmMDQsCisgICAgMHg0MDVlOWYxOCwKKyAgICAweDQwNWYxZjI4LAorICAgIDB4NDA1ZjlmNDAsCisgICAgMHg0MDYwMWY1MSwKKyAgICAweDQwNjA5ZjY0LAorICAgIDB4NDA2MTFmNzUsCisgICAgMHg0MDYxOWY5MywKKyAgICAweDQwNjIxZmE0LAorICAgIDB4NDA2MjlmYjEsCisgICAgMHg0MDYzMWZjOCwKKyAgICAweDQwNjNhMDA5LAorICAgIDB4NDA2NDIwMjAsCisgICAgMHg0MDY0YTAyZCwKKyAgICAweDQwNjUyMDNiLAorICAgIDB4NDA2NWEwNWQsCisgICAgMHg0MDY2MjA4NSwKKyAgICAweDQwNjZhMDlhLAorICAgIDB4NDA2NzIwYjEsCisgICAgMHg0MDY3YTBjMiwKKyAgICAweDQwNjgyMGQzLAorICAgIDB4NDA2OGEwZTQsCisgICAgMHg0MDY5MjBmOSwKKyAgICAweDQwNjlhMTEwLAorICAgIDB4NDA2YTIxMjEsCisgICAgMHg0MDZhYTEzYSwKKyAgICAweDQwNmIyMTU1LAorICAgIDB4NDA2YmExNmMsCisgICAgMHg0MDZjMjFkOSwKKyAgICAweDQwNmNhMWZhLAorICAgIDB4NDA2ZDIyMGQsCisgICAgMHg0MDZkYTIyZSwKKyAgICAweDQwNmUyMjQ5LAorICAgIDB4NDA2ZWEyNjQsCisgICAgMHg0MDZmMjI4NSwKKyAgICAweDQwNmZhMmFiLAorICAgIDB4NDA3MDIyY2IsCisgICAgMHg0MDcwYTJlNywKKyAgICAweDQwNzEyNDc0LAorICAgIDB4NDA3MWE0OTcsCisgICAgMHg0MDcyMjRhZCwKKyAgICAweDQwNzJhNGNjLAorICAgIDB4NDA3MzI0ZTQsCisgICAgMHg0MDczYTUwNCwKKyAgICAweDQwNzQyNzJlLAorICAgIDB4NDA3NGE3NTMsCisgICAgMHg0MDc1Mjc2ZSwKKyAgICAweDQwNzVhNzhkLAorICAgIDB4NDA3NjI3YmMsCisgICAgMHg0MDc2YTdlNCwKKyAgICAweDQwNzcyN2ZkLAorICAgIDB4NDA3N2E4MWMsCisgICAgMHg0MDc4Mjg0MSwKKyAgICAweDQwNzhhODU4LAorICAgIDB4NDA3OTI4NmIsCisgICAgMHg0MDc5YTg4OCwKICAgICAweDQwN2EwNzgyLAotICAgIDB4NDA3YWE5ZTQsCi0gICAgMHg0MDdiMjlmNywKLSAgICAweDQwN2JhYTEwLAotICAgIDB4NDA3YzJhMjgsCi0gICAgMHg0MDdjOTBiZCwKLSAgICAweDQwN2QyYTNjLAotICAgIDB4NDA3ZGFhNTYsCi0gICAgMHg0MDdlMmE2NywKLSAgICAweDQwN2VhYTdiLAotICAgIDB4NDA3ZjJhODksCi0gICAgMHg0MDdmYWFhNCwKLSAgICAweDQwODAxMjg2LAotICAgIDB4NDA4MGFhYzksCi0gICAgMHg0MDgxMmFlYiwKLSAgICAweDQwODFhYjA2LAotICAgIDB4NDA4MjJiMWIsCi0gICAgMHg0MDgyYWIzMywKLSAgICAweDQwODMyYjRiLAotICAgIDB4NDA4M2FiNjIsCi0gICAgMHg0MDg0MmI3OCwKLSAgICAweDQwODRhYjg0LAotICAgIDB4NDA4NTJiOTcsCi0gICAgMHg0MDg1YWJhYywKLSAgICAweDQwODYyYmJlLAotICAgIDB4NDA4NmFiZDMsCi0gICAgMHg0MDg3MmJkYywKLSAgICAweDQwODc5Y2QwLAorICAgIDB4NDA3YWE4OWEsCisgICAgMHg0MDdiMjhhZCwKKyAgICAweDQwN2JhOGM2LAorICAgIDB4NDA3YzI4ZGUsCisgICAgMHg0MDdjOTBiMCwKKyAgICAweDQwN2QyOGYyLAorICAgIDB4NDA3ZGE5MGMsCisgICAgMHg0MDdlMjkxZCwKKyAgICAweDQwN2VhOTMxLAorICAgIDB4NDA3ZjI5M2YsCisgICAgMHg0MDdmYTk1YSwKKyAgICAweDQwODAxMjc5LAorICAgIDB4NDA4MGE5N2YsCisgICAgMHg0MDgxMjlhMSwKKyAgICAweDQwODFhOWJjLAorICAgIDB4NDA4MjI5ZDEsCisgICAgMHg0MDgyYTllOSwKKyAgICAweDQwODMyYTAxLAorICAgIDB4NDA4M2FhMTgsCisgICAgMHg0MDg0MmEyZSwKKyAgICAweDQwODRhYTNhLAorICAgIDB4NDA4NTJhNGQsCisgICAgMHg0MDg1YWE2MiwKKyAgICAweDQwODYyYTc0LAorICAgIDB4NDA4NmFhODksCisgICAgMHg0MDg3MmE5MiwKKyAgICAweDQwODc5YzEwLAogICAgIDB4NDA4ODAwODMsCi0gICAgMHg0MDg4YTBkNywKLSAgICAweDQwODkwYTE3LAotICAgIDB4NDA4OWEyNzMsCi0gICAgMHg0MDhhMWJmMCwKLSAgICAweDQwOGFhMjlkLAotICAgIDB4NDA4YjI5MWEsCi0gICAgMHg0MDhiYTk3NiwKLSAgICAweDQwOGMyMzUzLAotICAgIDB4NDA4YzljMjEsCi0gICAgMHg0MDhkMWM1NiwKLSAgICAweDQwOGQ5ZTY4LAotICAgIDB4NDA4ZTFhYjksCi0gICAgMHg0MDhlOWFkZCwKLSAgICAweDQwOGYxZjIwLAotICAgIDB4NDFmNDI0YmMsCi0gICAgMHg0MWY5MjU0ZSwKLSAgICAweDQxZmUyNDQxLAotICAgIDB4NDFmZWE2NzIsCi0gICAgMHg0MWZmMjc2MywKLSAgICAweDQyMDMyNGQ1LAotICAgIDB4NDIwODI0ZjcsCi0gICAgMHg0MjA4YTUzMywKLSAgICAweDQyMDkyNDI1LAotICAgIDB4NDIwOWE1NmQsCi0gICAgMHg0MjBhMjQ3YywKLSAgICAweDQyMGFhNDVjLAotICAgIDB4NDIwYjI0OWMsCi0gICAgMHg0MjBiYTUxNSwKLSAgICAweDQyMGMyNzdmLAotICAgIDB4NDIwY2E2M2YsCi0gICAgMHg0MjBkMjY1OSwKLSAgICAweDQyMGRhNjkwLAotICAgIDB4NDIxMjI2YWEsCi0gICAgMHg0MjE3Mjc0NiwKLSAgICAweDQyMTdhNmVjLAotICAgIDB4NDIxYzI3MGUsCi0gICAgMHg0MjFmMjZjOSwKLSAgICAweDQyMjEyNzk2LAotICAgIDB4NDIyNjI3MjksCi0gICAgMHg0MjJiMjgyZiwKLSAgICAweDQyMmJhN2Y4LAotICAgIDB4NDIyYzI4MTcsCi0gICAgMHg0MjJjYTdkMiwKLSAgICAweDQyMmQyN2IxLAorICAgIDB4NDA4ODlmZTgsCisgICAgMHg0MDg5MGEwYSwKKyAgICAweDQwODlhMTg0LAorICAgIDB4NDA4YTFiNWYsCisgICAgMHg0MDhhYTFhZSwKKyAgICAweDQxZjQyMzlmLAorICAgIDB4NDFmOTI0MzEsCisgICAgMHg0MWZlMjMyNCwKKyAgICAweDQxZmVhNTU1LAorICAgIDB4NDFmZjI2NDYsCisgICAgMHg0MjAzMjNiOCwKKyAgICAweDQyMDgyM2RhLAorICAgIDB4NDIwOGE0MTYsCisgICAgMHg0MjA5MjMwOCwKKyAgICAweDQyMDlhNDUwLAorICAgIDB4NDIwYTIzNWYsCisgICAgMHg0MjBhYTMzZiwKKyAgICAweDQyMGIyMzdmLAorICAgIDB4NDIwYmEzZjgsCisgICAgMHg0MjBjMjY2MiwKKyAgICAweDQyMGNhNTIyLAorICAgIDB4NDIwZDI1M2MsCisgICAgMHg0MjBkYTU3MywKKyAgICAweDQyMTIyNThkLAorICAgIDB4NDIxNzI2MjksCisgICAgMHg0MjE3YTVjZiwKKyAgICAweDQyMWMyNWYxLAorICAgIDB4NDIxZjI1YWMsCisgICAgMHg0MjIxMjY3OSwKKyAgICAweDQyMjYyNjBjLAorICAgIDB4NDIyYjI3MTIsCisgICAgMHg0MjJiYTZkYiwKKyAgICAweDQyMmMyNmZhLAorICAgIDB4NDIyY2E2YjUsCisgICAgMHg0MjJkMjY5NCwKICAgICAweDQ0MzIwNmFkLAogICAgIDB4NDQzMjg2YmMsCiAgICAgMHg0NDMzMDZjOCwKQEAgLTU4MiwxMzEgKzE5MjYsMTMwIEBACiAgICAgMHg0NDM5MDc4MiwKICAgICAweDQ0Mzk4NzkwLAogICAgIDB4NDQzYTA3YTMsCi0gICAgMHg0YzMyMTJiMCwKLSAgICAweDRjMzI5MmMwLAotICAgIDB4NGMzMzEyZDMsCi0gICAgMHg0YzMzOTJmMywKKyAgICAweDRjMzIxMmEzLAorICAgIDB4NGMzMjkyYjMsCisgICAgMHg0YzMzMTJjNiwKKyAgICAweDRjMzM5MmU2LAogICAgIDB4NGMzNDAwOTQsCiAgICAgMHg0YzM0ODBiMCwKLSAgICAweDRjMzUxMmZmLAotICAgIDB4NGMzNTkzMGQsCi0gICAgMHg0YzM2MTMyOSwKLSAgICAweDRjMzY5MzNjLAotICAgIDB4NGMzNzEzNGIsCi0gICAgMHg0YzM3OTM1OSwKLSAgICAweDRjMzgxMzZlLAotICAgIDB4NGMzODkzN2EsCi0gICAgMHg0YzM5MTM5YSwKLSAgICAweDRjMzk5M2M0LAotICAgIDB4NGMzYTEzZGQsCi0gICAgMHg0YzNhOTNmNiwKKyAgICAweDRjMzUxMmYyLAorICAgIDB4NGMzNTkzMDAsCisgICAgMHg0YzM2MTMxYywKKyAgICAweDRjMzY5MzJmLAorICAgIDB4NGMzNzEzM2UsCisgICAgMHg0YzM3OTM0YywKKyAgICAweDRjMzgxMzYxLAorICAgIDB4NGMzODkzNmQsCisgICAgMHg0YzM5MTM4ZCwKKyAgICAweDRjMzk5M2I3LAorICAgIDB4NGMzYTEzZDAsCisgICAgMHg0YzNhOTNlOSwKICAgICAweDRjM2IwNWQwLAotICAgIDB4NGMzYjk0MGYsCi0gICAgMHg0YzNjMTQyMSwKLSAgICAweDRjM2M5NDMwLAotICAgIDB4NGMzZDEwYmQsCi0gICAgMHg0YzNkOTQ0OSwKLSAgICAweDRjM2UxNDU2LAotICAgIDB4NTAzMjJlNzIsCi0gICAgMHg1MDMyYWU4MSwKLSAgICAweDUwMzMyZThjLAotICAgIDB4NTAzM2FlOWMsCi0gICAgMHg1MDM0MmViNSwKLSAgICAweDUwMzRhZWNmLAotICAgIDB4NTAzNTJlZGQsCi0gICAgMHg1MDM1YWVmMywKLSAgICAweDUwMzYyZjA1LAotICAgIDB4NTAzNmFmMWIsCi0gICAgMHg1MDM3MmYzNCwKLSAgICAweDUwMzdhZjQ3LAotICAgIDB4NTAzODJmNWYsCi0gICAgMHg1MDM4YWY3MCwKLSAgICAweDUwMzkyZjg1LAotICAgIDB4NTAzOWFmOTksCi0gICAgMHg1MDNhMmZiOSwKLSAgICAweDUwM2FhZmNmLAotICAgIDB4NTAzYjJmZTcsCi0gICAgMHg1MDNiYWZmOSwKLSAgICAweDUwM2MzMDE1LAotICAgIDB4NTAzY2IwMmMsCi0gICAgMHg1MDNkMzA0NSwKLSAgICAweDUwM2RiMDViLAotICAgIDB4NTAzZTMwNjgsCi0gICAgMHg1MDNlYjA3ZSwKLSAgICAweDUwM2YzMDkwLAorICAgIDB4NGMzYjk0MDIsCisgICAgMHg0YzNjMTQxNCwKKyAgICAweDRjM2M5NDIzLAorICAgIDB4NGMzZDEwYjAsCisgICAgMHg0YzNkOTQzYywKKyAgICAweDRjM2UxNDQ5LAorICAgIDB4NTAzMjJkMjgsCisgICAgMHg1MDMyYWQzNywKKyAgICAweDUwMzMyZDQyLAorICAgIDB4NTAzM2FkNTIsCisgICAgMHg1MDM0MmQ2YiwKKyAgICAweDUwMzRhZDg1LAorICAgIDB4NTAzNTJkOTMsCisgICAgMHg1MDM1YWRhOSwKKyAgICAweDUwMzYyZGJiLAorICAgIDB4NTAzNmFkZDEsCisgICAgMHg1MDM3MmRlYSwKKyAgICAweDUwMzdhZGZkLAorICAgIDB4NTAzODJlMTUsCisgICAgMHg1MDM4YWUyNiwKKyAgICAweDUwMzkyZTNiLAorICAgIDB4NTAzOWFlNGYsCisgICAgMHg1MDNhMmU2ZiwKKyAgICAweDUwM2FhZTg1LAorICAgIDB4NTAzYjJlOWQsCisgICAgMHg1MDNiYWVhZiwKKyAgICAweDUwM2MyZWNiLAorICAgIDB4NTAzY2FlZTIsCisgICAgMHg1MDNkMmVmYiwKKyAgICAweDUwM2RhZjExLAorICAgIDB4NTAzZTJmMWUsCisgICAgMHg1MDNlYWYzNCwKKyAgICAweDUwM2YyZjQ2LAogICAgIDB4NTAzZjgzNDgsCi0gICAgMHg1MDQwMzBhMywKLSAgICAweDUwNDBiMGIzLAotICAgIDB4NTA0MTMwY2QsCi0gICAgMHg1MDQxYjBkYywKLSAgICAweDUwNDIzMGY2LAotICAgIDB4NTA0MmIxMTMsCi0gICAgMHg1MDQzMzEyMywKLSAgICAweDUwNDNiMTMzLAotICAgIDB4NTA0NDMxNDIsCisgICAgMHg1MDQwMmY1OSwKKyAgICAweDUwNDBhZjY5LAorICAgIDB4NTA0MTJmODMsCisgICAgMHg1MDQxYWY5MiwKKyAgICAweDUwNDIyZmFjLAorICAgIDB4NTA0MmFmYzksCisgICAgMHg1MDQzMmZkOSwKKyAgICAweDUwNDNhZmU5LAorICAgIDB4NTA0NDJmZjgsCiAgICAgMHg1MDQ0ODQxNCwKLSAgICAweDUwNDUzMTU2LAotICAgIDB4NTA0NWIxNzQsCi0gICAgMHg1MDQ2MzE4NywKLSAgICAweDUwNDZiMTlkLAotICAgIDB4NTA0NzMxYWYsCi0gICAgMHg1MDQ3YjFjNCwKLSAgICAweDUwNDgzMWVhLAotICAgIDB4NTA0OGIxZjgsCi0gICAgMHg1MDQ5MzIwYiwKLSAgICAweDUwNDliMjIwLAotICAgIDB4NTA0YTMyMzYsCi0gICAgMHg1MDRhYjI0NiwKLSAgICAweDUwNGIzMjY2LAotICAgIDB4NTA0YmIyNzksCi0gICAgMHg1MDRjMzI5YywKLSAgICAweDUwNGNiMmNhLAotICAgIDB4NTA0ZDMyZGMsCi0gICAgMHg1MDRkYjJmOSwKLSAgICAweDUwNGUzMzE0LAotICAgIDB4NTA0ZWIzMzAsCi0gICAgMHg1MDRmMzM0MiwKLSAgICAweDUwNGZiMzU5LAotICAgIDB4NTA1MDMzNjgsCisgICAgMHg1MDQ1MzAwYywKKyAgICAweDUwNDViMDJhLAorICAgIDB4NTA0NjMwM2QsCisgICAgMHg1MDQ2YjA1MywKKyAgICAweDUwNDczMDY1LAorICAgIDB4NTA0N2IwN2EsCisgICAgMHg1MDQ4MzBhMCwKKyAgICAweDUwNDhiMGFlLAorICAgIDB4NTA0OTMwYzEsCisgICAgMHg1MDQ5YjBkNiwKKyAgICAweDUwNGEzMGVjLAorICAgIDB4NTA0YWIwZmMsCisgICAgMHg1MDRiMzExYywKKyAgICAweDUwNGJiMTJmLAorICAgIDB4NTA0YzMxNTIsCisgICAgMHg1MDRjYjE4MCwKKyAgICAweDUwNGQzMTkyLAorICAgIDB4NTA0ZGIxYWYsCisgICAgMHg1MDRlMzFjYSwKKyAgICAweDUwNGViMWU2LAorICAgIDB4NTA0ZjMxZjgsCisgICAgMHg1MDRmYjIwZiwKKyAgICAweDUwNTAzMjFlLAogICAgIDB4NTA1MDg2ODcsCi0gICAgMHg1MDUxMzM3YiwKLSAgICAweDU4MzIwZTFmLAotICAgIDB4NjgzMjBkZTEsCi0gICAgMHg2ODMyOGI5YiwKLSAgICAweDY4MzMwYmFlLAotICAgIDB4NjgzMzhkZWYsCi0gICAgMHg2ODM0MGRmZiwKLSAgICAweDY4MzQ4MGIwLAotICAgIDB4NmMzMjBkYmQsCi0gICAgMHg2YzMyOGI3ZSwKLSAgICAweDZjMzMwZGM4LAotICAgIDB4NzQzMjA5OGQsCi0gICAgMHg3ODMyMDhmMiwKLSAgICAweDc4MzI4OTA3LAotICAgIDB4NzgzMzA5MTMsCisgICAgMHg1MDUxMzIzMSwKKyAgICAweDU4MzIwZTEyLAorICAgIDB4NjgzMjBkZDQsCisgICAgMHg2ODMyOGI4ZSwKKyAgICAweDY4MzMwYmExLAorICAgIDB4NjgzMzhkZTIsCisgICAgMHg2ODM0MGRmMiwKKyAgICAweDZjMzIwZGIwLAorICAgIDB4NmMzMjhiNzEsCisgICAgMHg2YzMzMGRiYiwKKyAgICAweDc0MzIwOTgwLAorICAgIDB4NzgzMjA4ZTUsCisgICAgMHg3ODMyODhmYSwKKyAgICAweDc4MzMwOTA2LAogICAgIDB4NzgzMzgwODMsCi0gICAgMHg3ODM0MDkyMiwKLSAgICAweDc4MzQ4OTM3LAotICAgIDB4NzgzNTA5NTYsCi0gICAgMHg3ODM1ODk3OCwKLSAgICAweDc4MzYwOThkLAotICAgIDB4NzgzNjg5YTMsCi0gICAgMHg3ODM3MDliMywKLSAgICAweDc4Mzc4OWM2LAotICAgIDB4NzgzODA5ZDksCi0gICAgMHg3ODM4ODllYiwKLSAgICAweDc4MzkwOWY4LAotICAgIDB4NzgzOThhMTcsCi0gICAgMHg3ODNhMGEyYywKLSAgICAweDc4M2E4YTNhLAotICAgIDB4NzgzYjBhNDQsCi0gICAgMHg3ODNiOGE1OCwKLSAgICAweDc4M2MwYTZmLAotICAgIDB4NzgzYzhhODQsCi0gICAgMHg3ODNkMGE5YiwKLSAgICAweDc4M2Q4YWIwLAotICAgIDB4NzgzZTBhMDYsCi0gICAgMHg3YzMyMTFiMiwKKyAgICAweDc4MzQwOTE1LAorICAgIDB4NzgzNDg5MmEsCisgICAgMHg3ODM1MDk0OSwKKyAgICAweDc4MzU4OTZiLAorICAgIDB4NzgzNjA5ODAsCisgICAgMHg3ODM2ODk5NiwKKyAgICAweDc4MzcwOWE2LAorICAgIDB4NzgzNzg5YjksCisgICAgMHg3ODM4MDljYywKKyAgICAweDc4Mzg4OWRlLAorICAgIDB4NzgzOTA5ZWIsCisgICAgMHg3ODM5OGEwYSwKKyAgICAweDc4M2EwYTFmLAorICAgIDB4NzgzYThhMmQsCisgICAgMHg3ODNiMGEzNywKKyAgICAweDc4M2I4YTRiLAorICAgIDB4NzgzYzBhNjIsCisgICAgMHg3ODNjOGE3NywKKyAgICAweDc4M2QwYThlLAorICAgIDB4NzgzZDhhYTMsCisgICAgMHg3ODNlMDlmOSwKKyAgICAweDgwMzIxMWE1LAogfTsKIAogY29uc3Qgc2l6ZV90IGtPcGVuU1NMUmVhc29uVmFsdWVzTGVuID0gc2l6ZW9mKGtPcGVuU1NMUmVhc29uVmFsdWVzKSAvIHNpemVvZihrT3BlblNTTFJlYXNvblZhbHVlc1swXSk7CkBAIC04MTgsNyArMjE2MSw2IEBACiAgICAgIlVOU1VQUE9SVEVEX01FVEhPRFwwIgogICAgICJXUklURV9UT19SRUFEX09OTFlfQklPXDAiCiAgICAgIkFSRzJfTFRfQVJHM1wwIgotICAgICJCQURfRU5DT0RJTkdcMCIKICAgICAiQkFEX1JFQ0lQUk9DQUxcMCIKICAgICAiQklHTlVNX1RPT19MT05HXDAiCiAgICAgIkJJVFNfVE9PX1NNQUxMXDAiCkBAIC05ODUsMTAgKzIzMjcsOCBAQAogICAgICJCQURfRklYRURfSEVBREVSX0RFQ1JZUFRcMCIKICAgICAiQkFEX1BBRF9CWVRFX0NPVU5UXDAiCiAgICAgIkJBRF9SU0FfUEFSQU1FVEVSU1wwIgotICAgICJCQURfVkVSU0lPTlwwIgogICAgICJCTE9DS19UWVBFX0lTX05PVF8wMVwwIgogICAgICJCTl9OT1RfSU5JVElBTElaRURcMCIKLSAgICAiQ0FOTk9UX1JFQ09WRVJfTVVMVElfUFJJTUVfS0VZXDAiCiAgICAgIkNSVF9QQVJBTVNfQUxSRUFEWV9HSVZFTlwwIgogICAgICJDUlRfVkFMVUVTX0lOQ09SUkVDVFwwIgogICAgICJEQVRBX0xFTl9OT1RfRVFVQUxfVE9fTU9EX0xFTlwwIgpAQCAtMTAwNiw3ICsyMzQ2LDYgQEAKICAgICAiSU5WQUxJRF9NRVNTQUdFX0xFTkdUSFwwIgogICAgICJLRVlfU0laRV9UT09fU01BTExcMCIKICAgICAiTEFTVF9PQ1RFVF9JTlZBTElEXDAiCi0gICAgIk1VU1RfSEFWRV9BVF9MRUFTVF9UV09fUFJJTUVTXDAiCiAgICAgIk5PX1BVQkxJQ19FWFBPTkVOVFwwIgogICAgICJOVUxMX0JFRk9SRV9CTE9DS19NSVNTSU5HXDAiCiAgICAgIk5fTk9UX0VRVUFMX1BfUVwwIgpAQCAtMTA1Nyw4ICsyMzk2LDYgQEAKICAgICAiQ09OTkVDVElPTl9SRUpFQ1RFRFwwIgogICAgICJDT05ORUNUSU9OX1RZUEVfTk9UX1NFVFwwIgogICAgICJDT09LSUVfTUlTTUFUQ0hcMCIKLSAgICAiQ1VTVE9NX0VYVEVOU0lPTl9DT05URU5UU19UT09fTEFSR0VcMCIKLSAgICAiQ1VTVE9NX0VYVEVOU0lPTl9FUlJPUlwwIgogICAgICJEMklfRUNEU0FfU0lHXDAiCiAgICAgIkRBVEFfQkVUV0VFTl9DQ1NfQU5EX0ZJTklTSEVEXDAiCiAgICAgIkRBVEFfTEVOR1RIX1RPT19MT05HXDAiCkBAIC0xMDcxLDkgKzI0MDgsNyBAQAogICAgICJFTVBUWV9TUlRQX1BST1RFQ1RJT05fUFJPRklMRV9MSVNUXDAiCiAgICAgIkVNU19TVEFURV9JTkNPTlNJU1RFTlRcMCIKICAgICAiRU5DUllQVEVEX0xFTkdUSF9UT09fTE9OR1wwIgotICAgICJFUlJPUl9BRERJTkdfRVhURU5TSU9OXDAiCiAgICAgIkVSUk9SX0lOX1JFQ0VJVkVEX0NJUEhFUl9MSVNUXDAiCi0gICAgIkVSUk9SX1BBUlNJTkdfRVhURU5TSU9OXDAiCiAgICAgIkVWUF9ESUdFU1RTSUdORklOQUxfRkFJTEVEXDAiCiAgICAgIkVWUF9ESUdFU1RTSUdOSU5JVF9GQUlMRURcMCIKICAgICAiRVhDRVNTSVZFX01FU1NBR0VfU0laRVwwIgpAQCAtMTA5Niw3ICsyNDMxLDYgQEAKICAgICAiTElCUkFSWV9IQVNfTk9fQ0lQSEVSU1wwIgogICAgICJNSVNTSU5HX0RIX0tFWVwwIgogICAgICJNSVNTSU5HX0VDRFNBX1NJR05JTkdfQ0VSVFwwIgotICAgICJNSVNTSU5HX0VYVEVOU0lPTlwwIgogICAgICJNSVNTSU5HX1JTQV9DRVJUSUZJQ0FURVwwIgogICAgICJNSVNTSU5HX1JTQV9FTkNSWVBUSU5HX0NFUlRcMCIKICAgICAiTUlTU0lOR19SU0FfU0lHTklOR19DRVJUXDAiCkBAIC0xMTA0LDcgKzI0MzgsNiBAQAogICAgICJNSVNTSU5HX1RNUF9FQ0RIX0tFWVwwIgogICAgICJNSVhFRF9TUEVDSUFMX09QRVJBVE9SX1dJVEhfR1JPVVBTXDAiCiAgICAgIk1UVV9UT09fU01BTExcMCIKLSAgICAiTkVHT1RJQVRFRF9CT1RIX05QTl9BTkRfQUxQTlwwIgogICAgICJORVNURURfR1JPVVBcMCIKICAgICAiTk9fQ0VSVElGSUNBVEVTX1JFVFVSTkVEXDAiCiAgICAgIk5PX0NFUlRJRklDQVRFX0FTU0lHTkVEXDAiCkBAIC0xMTUwLDcgKzI0ODMsNiBAQAogICAgICJTRVNTSU9OX0lEX0NPTlRFWFRfVU5JTklUSUFMSVpFRFwwIgogICAgICJTRVNTSU9OX01BWV9OT1RfQkVfQ1JFQVRFRFwwIgogICAgICJTSUdOQVRVUkVfQUxHT1JJVEhNU19FUlJPUlwwIgotICAgICJTSUdOQVRVUkVfQUxHT1JJVEhNU19FWFRFTlNJT05fU0VOVF9CWV9TRVJWRVJcMCIKICAgICAiU1JUUF9DT1VMRF9OT1RfQUxMT0NBVEVfUFJPRklMRVNcMCIKICAgICAiU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfTElTVF9UT09fTE9OR1wwIgogICAgICJTUlRQX1VOS05PV05fUFJPVEVDVElPTl9QUk9GSUxFXDAiCkBAIC0xMTk4LDEwICsyNTMwLDggQEAKICAgICAiVExTX1BFRVJfRElEX05PVF9SRVNQT05EX1dJVEhfQ0VSVElGSUNBVEVfTElTVFwwIgogICAgICJUTFNfUlNBX0VOQ1JZUFRFRF9WQUxVRV9MRU5HVEhfSVNfV1JPTkdcMCIKICAgICAiVE9PX01BTllfRU1QVFlfRlJBR01FTlRTXDAiCi0gICAgIlRPT19NQU5ZX1dBUk5JTkdfQUxFUlRTXDAiCiAgICAgIlVOQUJMRV9UT19GSU5EX0VDREhfUEFSQU1FVEVSU1wwIgogICAgICJVTkFCTEVfVE9fRklORF9QVUJMSUNfS0VZX1BBUkFNRVRFUlNcMCIKLSAgICAiVU5FWFBFQ1RFRF9FWFRFTlNJT05cMCIKICAgICAiVU5FWFBFQ1RFRF9HUk9VUF9DTE9TRVwwIgogICAgICJVTkVYUEVDVEVEX01FU1NBR0VcMCIKICAgICAiVU5FWFBFQ1RFRF9PUEVSQVRPUl9JTl9HUk9VUFwwIgpkaWZmIC0tZ2l0IGEvbGludXgtYWFyY2g2NC9jcnlwdG8vYWVzL2Flc3Y4LWFybXg2NC5TIGIvbGludXgtYWFyY2g2NC9jcnlwdG8vYWVzL2Flc3Y4LWFybXguUwpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBsaW51eC1hYXJjaDY0L2NyeXB0by9hZXMvYWVzdjgtYXJteDY0LlMKcmVuYW1lIHRvIGxpbnV4LWFhcmNoNjQvY3J5cHRvL2Flcy9hZXN2OC1hcm14LlMKaW5kZXggZmEyYWJiYy4uOWM2MzI5MSAxMDA2NDQKLS0tIGEvbGludXgtYWFyY2g2NC9jcnlwdG8vYWVzL2Flc3Y4LWFybXg2NC5TCisrKyBiL2xpbnV4LWFhcmNoNjQvY3J5cHRvL2Flcy9hZXN2OC1hcm14LlMKQEAgLTEsNSArMSw0IEBACi0jaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKLSNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisjaW5jbHVkZSAiYXJtX2FyY2guaCIKIAogI2lmIF9fQVJNX01BWF9BUkNIX18+PTcKIC50ZXh0CkBAIC03NDgsNCArNzQ3LDMgQEAKIAlyZXQKIC5zaXplCWFlc192OF9jdHIzMl9lbmNyeXB0X2Jsb2NrcywuLWFlc192OF9jdHIzMl9lbmNyeXB0X2Jsb2NrcwogI2VuZGlmCi0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saW51eC1hYXJjaDY0L2NyeXB0by9tb2Rlcy9naGFzaHY4LWFybXg2NC5TIGIvbGludXgtYWFyY2g2NC9jcnlwdG8vbW9kZXMvZ2hhc2h2OC1hcm14LlMKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gbGludXgtYWFyY2g2NC9jcnlwdG8vbW9kZXMvZ2hhc2h2OC1hcm14NjQuUwpyZW5hbWUgdG8gbGludXgtYWFyY2g2NC9jcnlwdG8vbW9kZXMvZ2hhc2h2OC1hcm14LlMKaW5kZXggOGQ0NDY2Ny4uYWQxOTA3NCAxMDA2NDQKLS0tIGEvbGludXgtYWFyY2g2NC9jcnlwdG8vbW9kZXMvZ2hhc2h2OC1hcm14NjQuUworKysgYi9saW51eC1hYXJjaDY0L2NyeXB0by9tb2Rlcy9naGFzaHY4LWFybXguUwpAQCAtMSw1ICsxLDQgQEAKLSNpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQotI2luY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKyNpbmNsdWRlICJhcm1fYXJjaC5oIgogCiAudGV4dAogI2lmICFkZWZpbmVkKF9fY2xhbmdfXykKQEAgLTY4LDEwICs2NywxMCBAQAogI2VuZGlmCiAJZXh0CXYzLjE2Yix2MTcuMTZiLHYxNy4xNmIsIzgKIAotCXBtdWxsCXYwLjFxLHYyMC4xZCx2My4xZAkJLy9ILmxvwrdYaS5sbworCXBtdWxsCXYwLjFxLHYyMC4xZCx2My4xZAkJLy9ILmxvt1hpLmxvCiAJZW9yCXYxNy4xNmIsdjE3LjE2Yix2My4xNmIJCS8vS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCi0JcG11bGwyCXYyLjFxLHYyMC4yZCx2My4yZAkJLy9ILmhpwrdYaS5oaQotCXBtdWxsCXYxLjFxLHYyMS4xZCx2MTcuMWQJCS8vKEgubG8rSC5oaSnCtyhYaS5sbytYaS5oaSkKKwlwbXVsbDIJdjIuMXEsdjIwLjJkLHYzLjJkCQkvL0guaGm3WGkuaGkKKwlwbXVsbAl2MS4xcSx2MjEuMWQsdjE3LjFkCQkvLyhILmxvK0guaGkptyhYaS5sbytYaS5oaSkKIAogCWV4dAl2MTcuMTZiLHYwLjE2Yix2Mi4xNmIsIzgJCS8vS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZwogCWVvcgl2MTguMTZiLHYwLjE2Yix2Mi4xNmIKQEAgLTEzNSw3ICsxMzQsNyBAQAogI2VuZGlmCiAJZXh0CXY3LjE2Yix2MTcuMTZiLHYxNy4xNmIsIzgKIAllb3IJdjMuMTZiLHYzLjE2Yix2MC4xNmIJCS8vSVtpXV49WGkKLQlwbXVsbAl2NC4xcSx2MjAuMWQsdjcuMWQJCS8vSMK3SWkrMQorCXBtdWxsCXY0LjFxLHYyMC4xZCx2Ny4xZAkJLy9It0lpKzEKIAllb3IJdjE3LjE2Yix2MTcuMTZiLHY3LjE2YgkJLy9LYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKIAlwbXVsbDIJdjYuMXEsdjIwLjJkLHY3LjJkCiAJYgkuTG9vcF9tb2QyeF92OApAQCAtMTQ0LDE0ICsxNDMsMTQgQEAKIC5Mb29wX21vZDJ4X3Y4OgogCWV4dAl2MTguMTZiLHYzLjE2Yix2My4xNmIsIzgKIAlzdWJzCXgzLHgzLCMzMgkJLy9pcyB0aGVyZSBtb3JlIGRhdGE/Ci0JcG11bGwJdjAuMXEsdjIyLjFkLHYzLjFkCQkvL0heMi5sb8K3WGkubG8KKwlwbXVsbAl2MC4xcSx2MjIuMWQsdjMuMWQJCS8vSF4yLmxvt1hpLmxvCiAJY3NlbAl4MTIseHpyLHgxMixsbwkJCS8vaXMgaXQgdGltZSB0byB6ZXJvIHgxMj8KIAogCXBtdWxsCXY1LjFxLHYyMS4xZCx2MTcuMWQKIAllb3IJdjE4LjE2Yix2MTguMTZiLHYzLjE2YgkJLy9LYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKLQlwbXVsbDIJdjIuMXEsdjIyLjJkLHYzLjJkCQkvL0heMi5oacK3WGkuaGkKKwlwbXVsbDIJdjIuMXEsdjIyLjJkLHYzLjJkCQkvL0heMi5oabdYaS5oaQogCWVvcgl2MC4xNmIsdjAuMTZiLHY0LjE2YgkJLy9hY2N1bXVsYXRlCi0JcG11bGwyCXYxLjFxLHYyMS4yZCx2MTguMmQJCS8vKEheMi5sbytIXjIuaGkpwrcoWGkubG8rWGkuaGkpCisJcG11bGwyCXYxLjFxLHYyMS4yZCx2MTguMmQJCS8vKEheMi5sbytIXjIuaGkptyhYaS5sbytYaS5oaSkKIAlsZDEJe3YxNi4yZH0sW3gyXSx4MTIJLy9sb2FkIFtyb3RhdGVkXSBJW2krMl0KIAogCWVvcgl2Mi4xNmIsdjIuMTZiLHY2LjE2YgpAQCAtMTc2LDcgKzE3NSw3IEBACiAJZXh0CXY3LjE2Yix2MTcuMTZiLHYxNy4xNmIsIzgKIAlleHQJdjMuMTZiLHYxNi4xNmIsdjE2LjE2YiwjOAogCWVvcgl2MC4xNmIsdjEuMTZiLHYxOC4xNmIKLQlwbXVsbAl2NC4xcSx2MjAuMWQsdjcuMWQJCS8vSMK3SWkrMQorCXBtdWxsCXY0LjFxLHYyMC4xZCx2Ny4xZAkJLy9It0lpKzEKIAllb3IJdjMuMTZiLHYzLjE2Yix2Mi4xNmIJCS8vYWNjdW11bGF0ZSB2My4xNmIgZWFybHkKIAogCWV4dAl2MTguMTZiLHYwLjE2Yix2MC4xNmIsIzgJCS8vMm5kIHBoYXNlIG9mIHJlZHVjdGlvbgpAQCAtMTk3LDEwICsxOTYsMTAgQEAKIAllb3IJdjMuMTZiLHYzLjE2Yix2MC4xNmIJCS8vaW5wXj1YaQogCWVvcgl2MTcuMTZiLHYxNi4xNmIsdjE4LjE2YgkJLy92MTcuMTZiIGlzIHJvdGF0ZWQgaW5wXlhpCiAKLQlwbXVsbAl2MC4xcSx2MjAuMWQsdjMuMWQJCS8vSC5sb8K3WGkubG8KKwlwbXVsbAl2MC4xcSx2MjAuMWQsdjMuMWQJCS8vSC5sb7dYaS5sbwogCWVvcgl2MTcuMTZiLHYxNy4xNmIsdjMuMTZiCQkvL0thcmF0c3ViYSBwcmUtcHJvY2Vzc2luZwotCXBtdWxsMgl2Mi4xcSx2MjAuMmQsdjMuMmQJCS8vSC5oacK3WGkuaGkKLQlwbXVsbAl2MS4xcSx2MjEuMWQsdjE3LjFkCQkvLyhILmxvK0guaGkpwrcoWGkubG8rWGkuaGkpCisJcG11bGwyCXYyLjFxLHYyMC4yZCx2My4yZAkJLy9ILmhpt1hpLmhpCisJcG11bGwJdjEuMXEsdjIxLjFkLHYxNy4xZAkJLy8oSC5sbytILmhpKbcoWGkubG8rWGkuaGkpCiAKIAlleHQJdjE3LjE2Yix2MC4xNmIsdjIuMTZiLCM4CQkvL0thcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKIAllb3IJdjE4LjE2Yix2MC4xNmIsdjIuMTZiCkBAIC0yMjksNCArMjI4LDMgQEAKIC5ieXRlCTcxLDcyLDY1LDgzLDcyLDMyLDEwMiwxMTEsMTE0LDMyLDY1LDgyLDc3LDExOCw1Niw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCiAuYWxpZ24JMgogLmFsaWduCTIKLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpbnV4LWFhcmNoNjQvY3J5cHRvL3NoYS9zaGExLWFybXY4LlMgYi9saW51eC1hYXJjaDY0L2NyeXB0by9zaGEvc2hhMS1hcm12OC5TCmluZGV4IDZjZjk4NzcuLmFiNmFhOTggMTAwNjQ0Ci0tLSBhL2xpbnV4LWFhcmNoNjQvY3J5cHRvL3NoYS9zaGExLWFybXY4LlMKKysrIGIvbGludXgtYWFyY2g2NC9jcnlwdG8vc2hhL3NoYTEtYXJtdjguUwpAQCAtMSw1ICsxLDQgQEAKLSNpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQotI2luY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKyNpbmNsdWRlICJhcm1fYXJjaC5oIgogCiAudGV4dAogCkBAIC0xMjEyLDQgKzEyMTEsMyBAQAogLmFsaWduCTIKIC5hbGlnbgkyCiAuY29tbQlPUEVOU1NMX2FybWNhcF9QLDQsNAotI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGludXgtYWFyY2g2NC9jcnlwdG8vc2hhL3NoYTI1Ni1hcm12OC5TIGIvbGludXgtYWFyY2g2NC9jcnlwdG8vc2hhL3NoYTI1Ni1hcm12OC5TCmluZGV4IDBmYWQwMDkuLmVjNTcyZTkgMTAwNjQ0Ci0tLSBhL2xpbnV4LWFhcmNoNjQvY3J5cHRvL3NoYS9zaGEyNTYtYXJtdjguUworKysgYi9saW51eC1hYXJjaDY0L2NyeXB0by9zaGEvc2hhMjU2LWFybXY4LlMKQEAgLTEsNSArMSw0IEBACi0jaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKLSNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisjaW5jbHVkZSAiYXJtX2FyY2guaCIKIAogLnRleHQKIApAQCAtMTE0Miw0ICsxMTQxLDMgQEAKIAlyZXQKIC5zaXplCXNoYTI1Nl9ibG9ja19hcm12OCwuLXNoYTI1Nl9ibG9ja19hcm12OAogLmNvbW0JT1BFTlNTTF9hcm1jYXBfUCw0LDQKLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpbnV4LWFhcmNoNjQvY3J5cHRvL3NoYS9zaGE1MTItYXJtdjguUyBiL2xpbnV4LWFhcmNoNjQvY3J5cHRvL3NoYS9zaGE1MTItYXJtdjguUwppbmRleCA1MTdjMDMzLi44ZmMzNDJhIDEwMDY0NAotLS0gYS9saW51eC1hYXJjaDY0L2NyeXB0by9zaGEvc2hhNTEyLWFybXY4LlMKKysrIGIvbGludXgtYWFyY2g2NC9jcnlwdG8vc2hhL3NoYTUxMi1hcm12OC5TCkBAIC0xLDUgKzEsNCBAQAotI2lmIGRlZmluZWQoX19hYXJjaDY0X18pCi0jaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorI2luY2x1ZGUgImFybV9hcmNoLmgiCiAKIC50ZXh0CiAKQEAgLTEwMjIsNCArMTAyMSwzIEBACiAuYWxpZ24JMgogLmFsaWduCTIKIC5jb21tCU9QRU5TU0xfYXJtY2FwX1AsNCw0Ci0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saW51eC1hcm0vY3J5cHRvL2Flcy9hZXMtYXJtdjQuUyBiL2xpbnV4LWFybS9jcnlwdG8vYWVzL2Flcy1hcm12NC5TCmluZGV4IGM0ZDcwNjUuLjExMzUwMjAgMTAwNjQ0Ci0tLSBhL2xpbnV4LWFybS9jcnlwdG8vYWVzL2Flcy1hcm12NC5TCisrKyBiL2xpbnV4LWFybS9jcnlwdG8vYWVzL2Flcy1hcm12NC5TCkBAIC0xLDQgKzEsMyBAQAotI2lmIGRlZmluZWQoX19hcm1fXykKIAogQCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogQCBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQG9wZW5zc2wub3JnPiBmb3IgdGhlIE9wZW5TU0wKQEAgLTM0LDcgKzMzLDcgQEAKIAogI2lmIGRlZmluZWQoX19hcm1fXykKICNpZm5kZWYgX19LRVJORUxfXwotIyBpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisjIGluY2x1ZGUgImFybV9hcmNoLmgiCiAjZWxzZQogIyBkZWZpbmUgX19BUk1fQVJDSF9fIF9fTElOVVhfQVJNX0FSQ0hfXwogI2VuZGlmCkBAIC0xMTk3LDQgKzExOTYsMyBAQAogLmFsaWduCTIKIAogI2VuZGlmCi0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saW51eC1hcm0vY3J5cHRvL2Flcy9hZXN2OC1hcm14MzIuUyBiL2xpbnV4LWFybS9jcnlwdG8vYWVzL2Flc3Y4LWFybXguUwpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBsaW51eC1hcm0vY3J5cHRvL2Flcy9hZXN2OC1hcm14MzIuUwpyZW5hbWUgdG8gbGludXgtYXJtL2NyeXB0by9hZXMvYWVzdjgtYXJteC5TCmluZGV4IDYwMTJiMGMuLjAwNjMwMGMgMTAwNjQ0Ci0tLSBhL2xpbnV4LWFybS9jcnlwdG8vYWVzL2Flc3Y4LWFybXgzMi5TCisrKyBiL2xpbnV4LWFybS9jcnlwdG8vYWVzL2Flc3Y4LWFybXguUwpAQCAtMSw1ICsxLDQgQEAKLSNpZiBkZWZpbmVkKF9fYXJtX18pCi0jaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorI2luY2x1ZGUgImFybV9hcmNoLmgiCiAKICNpZiBfX0FSTV9NQVhfQVJDSF9fPj03CiAudGV4dApAQCAtNzUzLDQgKzc1MiwzIEBACiAJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscGN9CiAuc2l6ZQlhZXNfdjhfY3RyMzJfZW5jcnlwdF9ibG9ja3MsLi1hZXNfdjhfY3RyMzJfZW5jcnlwdF9ibG9ja3MKICNlbmRpZgotI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGludXgtYXJtL2NyeXB0by9hZXMvYnNhZXMtYXJtdjcuUyBiL2xpbnV4LWFybS9jcnlwdG8vYWVzL2JzYWVzLWFybXY3LlMKaW5kZXggODUyNjJkNS4uMjA0ZWUzZSAxMDA2NDQKLS0tIGEvbGludXgtYXJtL2NyeXB0by9hZXMvYnNhZXMtYXJtdjcuUworKysgYi9saW51eC1hcm0vY3J5cHRvL2Flcy9ic2Flcy1hcm12Ny5TCkBAIC0xLDQgKzEsMyBAQAotI2lmIGRlZmluZWQoX19hcm1fXykKIAogQCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogQCBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQG9wZW5zc2wub3JnPiBmb3IgdGhlIE9wZW5TU0wKQEAgLTQ5LDcgKzQ4LDcgQEAKIAogI2lmIGRlZmluZWQoX19hcm1fXykKICNpZm5kZWYgX19LRVJORUxfXwotIyBpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisjIGluY2x1ZGUgImFybV9hcmNoLmgiCiAKICMgZGVmaW5lIFZGUF9BQklfUFVTSAl2c3RtZGIJc3AhLHtkOC1kMTV9CiAjIGRlZmluZSBWRlBfQUJJX1BPUAl2bGRtaWEJc3AhLHtkOC1kMTV9CkBAIC0yNTc2LDQgKzI1NzUsMyBAQAogLnNpemUJYnNhZXNfeHRzX2RlY3J5cHQsLi1ic2Flc194dHNfZGVjcnlwdAogI2VuZGlmCiAjZW5kaWYKLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpbnV4LWFybS9jcnlwdG8vYm4vYXJtdjQtbW9udC5TIGIvbGludXgtYXJtL2NyeXB0by9ibi9hcm12NC1tb250LlMKaW5kZXggZmM2NzFlOC4uODFkY2JlYiAxMDA2NDQKLS0tIGEvbGludXgtYXJtL2NyeXB0by9ibi9hcm12NC1tb250LlMKKysrIGIvbGludXgtYXJtL2NyeXB0by9ibi9hcm12NC1tb250LlMKQEAgLTEsNSArMSw0IEBACi0jaWYgZGVmaW5lZChfX2FybV9fKQotI2luY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKyNpbmNsdWRlICJhcm1fYXJjaC5oIgogCiAudGV4dAogLmNvZGUJMzIKQEAgLTU4Niw0ICs1ODUsMyBAQAogLmNvbW0JT1BFTlNTTF9hcm1jYXBfUCw0LDQKIC5oaWRkZW4JT1BFTlNTTF9hcm1jYXBfUAogI2VuZGlmCi0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saW51eC1hcm0vY3J5cHRvL21vZGVzL2doYXNoLWFybXY0LlMgYi9saW51eC1hcm0vY3J5cHRvL21vZGVzL2doYXNoLWFybXY0LlMKaW5kZXggZjg2OGMyZC4uYjZjN2U5YiAxMDA2NDQKLS0tIGEvbGludXgtYXJtL2NyeXB0by9tb2Rlcy9naGFzaC1hcm12NC5TCisrKyBiL2xpbnV4LWFybS9jcnlwdG8vbW9kZXMvZ2hhc2gtYXJtdjQuUwpAQCAtMSw2ICsxLDUgQEAKICNpZiBkZWZpbmVkKF9fYXJtX18pCi0jaWYgZGVmaW5lZChfX2FybV9fKQotI2luY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKyNpbmNsdWRlICJhcm1fYXJjaC5oIgogCiAuc3ludGF4CXVuaWZpZWQKIApAQCAtNTM4LDQgKzUzNywzIEBACiAuYWxpZ24JMgogCiAjZW5kaWYKLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpbnV4LWFybS9jcnlwdG8vbW9kZXMvZ2hhc2h2OC1hcm14MzIuUyBiL2xpbnV4LWFybS9jcnlwdG8vbW9kZXMvZ2hhc2h2OC1hcm14LlMKc2ltaWxhcml0eSBpbmRleCA4OCUKcmVuYW1lIGZyb20gbGludXgtYXJtL2NyeXB0by9tb2Rlcy9naGFzaHY4LWFybXgzMi5TCnJlbmFtZSB0byBsaW51eC1hcm0vY3J5cHRvL21vZGVzL2doYXNodjgtYXJteC5TCmluZGV4IDlhMzhkZWQuLjcxOTEzZmIgMTAwNjQ0Ci0tLSBhL2xpbnV4LWFybS9jcnlwdG8vbW9kZXMvZ2hhc2h2OC1hcm14MzIuUworKysgYi9saW51eC1hcm0vY3J5cHRvL21vZGVzL2doYXNodjgtYXJteC5TCkBAIC0xLDUgKzEsNCBAQAotI2lmIGRlZmluZWQoX19hcm1fXykKLSNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisjaW5jbHVkZSAiYXJtX2FyY2guaCIKIAogLnRleHQKIC5mcHUJbmVvbgpAQCAtNjcsMTAgKzY2LDEwIEBACiAjZW5kaWYKIAl2ZXh0LjgJcTMscTkscTksIzgKIAotLmJ5dGUJMHg4NiwweDBlLDB4YTgsMHhmMglAIHBtdWxsIHEwLHExMixxMwkJQCBILmxvwrdYaS5sbworLmJ5dGUJMHg4NiwweDBlLDB4YTgsMHhmMglAIHBtdWxsIHEwLHExMixxMwkJQCBILmxvt1hpLmxvCiAJdmVvcglxOSxxOSxxMwkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKLS5ieXRlCTB4ODcsMHg0ZSwweGE5LDB4ZjIJQCBwbXVsbDIgcTIscTEyLHEzCQlAIEguaGnCt1hpLmhpCi0uYnl0ZQkweGEyLDB4MmUsMHhhYSwweGYyCUAgcG11bGwgcTEscTEzLHE5CQlAIChILmxvK0guaGkpwrcoWGkubG8rWGkuaGkpCisuYnl0ZQkweDg3LDB4NGUsMHhhOSwweGYyCUAgcG11bGwyIHEyLHExMixxMwkJQCBILmhpt1hpLmhpCisuYnl0ZQkweGEyLDB4MmUsMHhhYSwweGYyCUAgcG11bGwgcTEscTEzLHE5CQlAIChILmxvK0guaGkptyhYaS5sbytYaS5oaSkKIAogCXZleHQuOAlxOSxxMCxxMiwjOAkJQCBLYXJhdHN1YmEgcG9zdC1wcm9jZXNzaW5nCiAJdmVvcglxMTAscTAscTIKQEAgLTEzNSw3ICsxMzQsNyBAQAogI2VuZGlmCiAJdmV4dC44CXE3LHE5LHE5LCM4CiAJdmVvcglxMyxxMyxxMAkJQCBJW2ldXj1YaQotLmJ5dGUJMHg4ZSwweDhlLDB4YTgsMHhmMglAIHBtdWxsIHE0LHExMixxNwkJQCBIwrdJaSsxCisuYnl0ZQkweDhlLDB4OGUsMHhhOCwweGYyCUAgcG11bGwgcTQscTEyLHE3CQlAIEi3SWkrMQogCXZlb3IJcTkscTkscTcJCUAgS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCiAuYnl0ZQkweDhmLDB4Y2UsMHhhOSwweGYyCUAgcG11bGwyIHE2LHExMixxNwogCWIJLkxvb3BfbW9kMnhfdjgKQEAgLTE0NCwxNCArMTQzLDE0IEBACiAuTG9vcF9tb2QyeF92ODoKIAl2ZXh0LjgJcTEwLHEzLHEzLCM4CiAJc3VicwlyMyxyMywjMzIJCUAgaXMgdGhlcmUgbW9yZSBkYXRhPwotLmJ5dGUJMHg4NiwweDBlLDB4YWMsMHhmMglAIHBtdWxsIHEwLHExNCxxMwkJQCBIXjIubG/Ct1hpLmxvCisuYnl0ZQkweDg2LDB4MGUsMHhhYywweGYyCUAgcG11bGwgcTAscTE0LHEzCQlAIEheMi5sb7dYaS5sbwogCW1vdmxvCXIxMiwjMAkJCUAgaXMgaXQgdGltZSB0byB6ZXJvIHIxMj8KIAogLmJ5dGUJMHhhMiwweGFlLDB4YWEsMHhmMglAIHBtdWxsIHE1LHExMyxxOQogCXZlb3IJcTEwLHExMCxxMwkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKLS5ieXRlCTB4ODcsMHg0ZSwweGFkLDB4ZjIJQCBwbXVsbDIgcTIscTE0LHEzCQlAIEheMi5oacK3WGkuaGkKKy5ieXRlCTB4ODcsMHg0ZSwweGFkLDB4ZjIJQCBwbXVsbDIgcTIscTE0LHEzCQlAIEheMi5oabdYaS5oaQogCXZlb3IJcTAscTAscTQJCUAgYWNjdW11bGF0ZQotLmJ5dGUJMHhhNSwweDJlLDB4YWIsMHhmMglAIHBtdWxsMiBxMSxxMTMscTEwCQlAIChIXjIubG8rSF4yLmhpKcK3KFhpLmxvK1hpLmhpKQorLmJ5dGUJMHhhNSwweDJlLDB4YWIsMHhmMglAIHBtdWxsMiBxMSxxMTMscTEwCQlAIChIXjIubG8rSF4yLmhpKbcoWGkubG8rWGkuaGkpCiAJdmxkMS42NAl7cTh9LFtyMl0scjEyCUAgbG9hZCBbcm90YXRlZF0gSVtpKzJdCiAKIAl2ZW9yCXEyLHEyLHE2CkBAIC0xNzYsNyArMTc1LDcgQEAKIAl2ZXh0LjgJcTcscTkscTksIzgKIAl2ZXh0LjgJcTMscTgscTgsIzgKIAl2ZW9yCXEwLHExLHExMAotLmJ5dGUJMHg4ZSwweDhlLDB4YTgsMHhmMglAIHBtdWxsIHE0LHExMixxNwkJQCBIwrdJaSsxCisuYnl0ZQkweDhlLDB4OGUsMHhhOCwweGYyCUAgcG11bGwgcTQscTEyLHE3CQlAIEi3SWkrMQogCXZlb3IJcTMscTMscTIJCUAgYWNjdW11bGF0ZSBxMyBlYXJseQogCiAJdmV4dC44CXExMCxxMCxxMCwjOAkJQCAybmQgcGhhc2Ugb2YgcmVkdWN0aW9uCkBAIC0xOTcsMTAgKzE5NiwxMCBAQAogCXZlb3IJcTMscTMscTAJCUAgaW5wXj1YaQogCXZlb3IJcTkscTgscTEwCQlAIHE5IGlzIHJvdGF0ZWQgaW5wXlhpCiAKLS5ieXRlCTB4ODYsMHgwZSwweGE4LDB4ZjIJQCBwbXVsbCBxMCxxMTIscTMJCUAgSC5sb8K3WGkubG8KKy5ieXRlCTB4ODYsMHgwZSwweGE4LDB4ZjIJQCBwbXVsbCBxMCxxMTIscTMJCUAgSC5sb7dYaS5sbwogCXZlb3IJcTkscTkscTMJCUAgS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCi0uYnl0ZQkweDg3LDB4NGUsMHhhOSwweGYyCUAgcG11bGwyIHEyLHExMixxMwkJQCBILmhpwrdYaS5oaQotLmJ5dGUJMHhhMiwweDJlLDB4YWEsMHhmMglAIHBtdWxsIHExLHExMyxxOQkJQCAoSC5sbytILmhpKcK3KFhpLmxvK1hpLmhpKQorLmJ5dGUJMHg4NywweDRlLDB4YTksMHhmMglAIHBtdWxsMiBxMixxMTIscTMJCUAgSC5oabdYaS5oaQorLmJ5dGUJMHhhMiwweDJlLDB4YWEsMHhmMglAIHBtdWxsIHExLHExMyxxOQkJQCAoSC5sbytILmhpKbcoWGkubG8rWGkuaGkpCiAKIAl2ZXh0LjgJcTkscTAscTIsIzgJCUAgS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZwogCXZlb3IJcTEwLHEwLHEyCkBAIC0yMzAsNCArMjI5LDMgQEAKIC5ieXRlCTcxLDcyLDY1LDgzLDcyLDMyLDEwMiwxMTEsMTE0LDMyLDY1LDgyLDc3LDExOCw1Niw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCiAuYWxpZ24JMgogLmFsaWduCTIKLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpbnV4LWFybS9jcnlwdG8vc2hhL3NoYTEtYXJtdjQtbGFyZ2UuUyBiL2xpbnV4LWFybS9jcnlwdG8vc2hhL3NoYTEtYXJtdjQtbGFyZ2UuUwppbmRleCA2NmQwZWYzLi41MmM5OWJmIDEwMDY0NAotLS0gYS9saW51eC1hcm0vY3J5cHRvL3NoYS9zaGExLWFybXY0LWxhcmdlLlMKKysrIGIvbGludXgtYXJtL2NyeXB0by9zaGEvc2hhMS1hcm12NC1sYXJnZS5TCkBAIC0xLDUgKzEsNCBAQAotI2lmIGRlZmluZWQoX19hcm1fXykKLSNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisjaW5jbHVkZSAiYXJtX2FyY2guaCIKIAogLnRleHQKIC5jb2RlCTMyCkBAIC0xNDU5LDQgKzE0NTgsMyBAQAogLmNvbW0JT1BFTlNTTF9hcm1jYXBfUCw0LDQKIC5oaWRkZW4JT1BFTlNTTF9hcm1jYXBfUAogI2VuZGlmCi0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saW51eC1hcm0vY3J5cHRvL3NoYS9zaGEyNTYtYXJtdjQuUyBiL2xpbnV4LWFybS9jcnlwdG8vc2hhL3NoYTI1Ni1hcm12NC5TCmluZGV4IDlmYzNlMGIuLjExNGFhNDMgMTAwNjQ0Ci0tLSBhL2xpbnV4LWFybS9jcnlwdG8vc2hhL3NoYTI1Ni1hcm12NC5TCisrKyBiL2xpbnV4LWFybS9jcnlwdG8vc2hhL3NoYTI1Ni1hcm12NC5TCkBAIC0xLDQgKzEsMyBAQAotI2lmIGRlZmluZWQoX19hcm1fXykKIAogQCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogQCBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQG9wZW5zc2wub3JnPiBmb3IgdGhlIE9wZW5TU0wKQEAgLTM4LDcgKzM3LDcgQEAKIEAgQWRkIEFSTXY4IGNvZGUgcGF0aCBwZXJmb3JtaW5nIGF0IDIuMCBjcGIgb24gQXBwbGUgQTcuCiAKICNpZm5kZWYgX19LRVJORUxfXwotIyBpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisjIGluY2x1ZGUgImFybV9hcmNoLmgiCiAjZWxzZQogIyBkZWZpbmUgX19BUk1fQVJDSF9fIF9fTElOVVhfQVJNX0FSQ0hfXwogIyBkZWZpbmUgX19BUk1fTUFYX0FSQ0hfXyA3CkBAIC0yODE1LDQgKzI4MTQsMyBAQAogLmNvbW0JT1BFTlNTTF9hcm1jYXBfUCw0LDQKIC5oaWRkZW4JT1BFTlNTTF9hcm1jYXBfUAogI2VuZGlmCi0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saW51eC1hcm0vY3J5cHRvL3NoYS9zaGE1MTItYXJtdjQuUyBiL2xpbnV4LWFybS9jcnlwdG8vc2hhL3NoYTUxMi1hcm12NC5TCmluZGV4IDgzNGVkZTkuLjFhM2Q0NjcgMTAwNjQ0Ci0tLSBhL2xpbnV4LWFybS9jcnlwdG8vc2hhL3NoYTUxMi1hcm12NC5TCisrKyBiL2xpbnV4LWFybS9jcnlwdG8vc2hhL3NoYTUxMi1hcm12NC5TCkBAIC0xLDQgKzEsMyBAQAotI2lmIGRlZmluZWQoX19hcm1fXykKIAogQCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogQCBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQG9wZW5zc2wub3JnPiBmb3IgdGhlIE9wZW5TU0wKQEAgLTQ3LDcgKzQ2LDcgQEAKIEAgd2FzIHJlZmxlY3RlZCBpbiBiZWxvdyB0d28gcGFyYW1ldGVycyBhcyAwIGFuZCA0LiBOb3cgY2FsbGVyIGlzCiBAIGV4cGVjdGVkIHRvIG1haW50YWluIG5hdGl2ZSBieXRlIG9yZGVyIGZvciB3aG9sZSA2NC1iaXQgdmFsdWVzLgogI2lmbmRlZiBfX0tFUk5FTF9fCi0jIGluY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKyMgaW5jbHVkZSAiYXJtX2FyY2guaCIKICMgZGVmaW5lIFZGUF9BQklfUFVTSAl2c3RtZGIJc3AhLHtkOC1kMTV9CiAjIGRlZmluZSBWRlBfQUJJX1BPUAl2bGRtaWEJc3AhLHtkOC1kMTV9CiAjZWxzZQpAQCAtMTg2Niw0ICsxODY1LDMgQEAKIC5jb21tCU9QRU5TU0xfYXJtY2FwX1AsNCw0CiAuaGlkZGVuCU9QRU5TU0xfYXJtY2FwX1AKICNlbmRpZgotI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGludXgteDg2L2NyeXB0by9jcHUteDg2LWFzbS5TIGIvbGludXgteDg2L2NyeXB0by9jcHUteDg2LWFzbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YThkZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14ODYvY3J5cHRvL2NwdS14ODYtYXNtLlMKQEAgLTAsMCArMSwzMjIgQEAKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorLmZpbGUJImNyeXB0by9jcHUteDg2LWFzbS5TIgorLnRleHQKKy5nbG9ibAlPUEVOU1NMX2lhMzJfY3B1aWQKKy5oaWRkZW4JT1BFTlNTTF9pYTMyX2NwdWlkCisudHlwZQlPUEVOU1NMX2lhMzJfY3B1aWQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK09QRU5TU0xfaWEzMl9jcHVpZDoKKy5MX09QRU5TU0xfaWEzMl9jcHVpZF9iZWdpbjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJeG9ybAklZWR4LCVlZHgKKwlwdXNoZmwKKwlwb3BsCSVlYXgKKwltb3ZsCSVlYXgsJWVjeAorCXhvcmwJJDIwOTcxNTIsJWVheAorCXB1c2hsCSVlYXgKKwlwb3BmbAorCXB1c2hmbAorCXBvcGwJJWVheAorCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWF4LCVlYXgKKwlidGwJJDIxLCVlY3gKKwlqbmMJLkwwMDBub2NwdWlkCisJbW92bAkyMCglZXNwKSwlZXNpCisJbW92bAklZWF4LDgoJWVzaSkKKwkuYnl0ZQkweDBmLDB4YTIKKwltb3ZsCSVlYXgsJWVkaQorCXhvcmwJJWVheCwlZWF4CisJY21wbAkkMTk3MDE2OTE1OSwlZWJ4CisJc2V0bmUJJWFsCisJbW92bAklZWF4LCVlYnAKKwljbXBsCSQxMjMxMzg0MTY5LCVlZHgKKwlzZXRuZQklYWwKKwlvcmwJJWVheCwlZWJwCisJY21wbAkkMTgxODU4ODI3MCwlZWN4CisJc2V0bmUJJWFsCisJb3JsCSVlYXgsJWVicAorCWp6CS5MMDAxaW50ZWwKKwljbXBsCSQxNzUyNDYyNjU3LCVlYngKKwlzZXRuZQklYWwKKwltb3ZsCSVlYXgsJWVzaQorCWNtcGwJJDE3NjkyMzgxMTcsJWVkeAorCXNldG5lCSVhbAorCW9ybAklZWF4LCVlc2kKKwljbXBsCSQxMTQ1OTEzNjk5LCVlY3gKKwlzZXRuZQklYWwKKwlvcmwJJWVheCwlZXNpCisJam56CS5MMDAxaW50ZWwKKwltb3ZsCSQyMTQ3NDgzNjQ4LCVlYXgKKwkuYnl0ZQkweDBmLDB4YTIKKwljbXBsCSQyMTQ3NDgzNjQ5LCVlYXgKKwlqYgkuTDAwMWludGVsCisJbW92bAklZWF4LCVlc2kKKwltb3ZsCSQyMTQ3NDgzNjQ5LCVlYXgKKwkuYnl0ZQkweDBmLDB4YTIKKwlvcmwJJWVjeCwlZWJwCisJYW5kbAkkMjA0OSwlZWJwCisJY21wbAkkMjE0NzQ4MzY1NiwlZXNpCisJamIJLkwwMDFpbnRlbAorCW1vdmwJJDIxNDc0ODM2NTYsJWVheAorCS5ieXRlCTB4MGYsMHhhMgorCW1vdnpibAklY2wsJWVzaQorCWluY2wJJWVzaQorCW1vdmwJJDEsJWVheAorCXhvcmwJJWVjeCwlZWN4CisJLmJ5dGUJMHgwZiwweGEyCisJYnRsCSQyOCwlZWR4CisJam5jCS5MMDAyZ2VuZXJpYworCXNocmwJJDE2LCVlYngKKwlhbmRsCSQyNTUsJWVieAorCWNtcGwJJWVzaSwlZWJ4CisJamEJLkwwMDJnZW5lcmljCisJYW5kbAkkNDAyNjUzMTgzOSwlZWR4CisJam1wCS5MMDAyZ2VuZXJpYworLkwwMDFpbnRlbDoKKwljbXBsCSQ3LCVlZGkKKwlqYgkuTDAwM2NhY2hlaW5mbworCW1vdmwJMjAoJWVzcCksJWVzaQorCW1vdmwJJDcsJWVheAorCXhvcmwJJWVjeCwlZWN4CisJLmJ5dGUJMHgwZiwweGEyCisJbW92bAklZWJ4LDgoJWVzaSkKKy5MMDAzY2FjaGVpbmZvOgorCWNtcGwJJDQsJWVkaQorCW1vdmwJJC0xLCVlZGkKKwlqYgkuTDAwNG5vY2FjaGVpbmZvCisJbW92bAkkNCwlZWF4CisJbW92bAkkMCwlZWN4CisJLmJ5dGUJMHgwZiwweGEyCisJbW92bAklZWF4LCVlZGkKKwlzaHJsCSQxNCwlZWRpCisJYW5kbAkkNDA5NSwlZWRpCisuTDAwNG5vY2FjaGVpbmZvOgorCW1vdmwJJDEsJWVheAorCXhvcmwJJWVjeCwlZWN4CisJLmJ5dGUJMHgwZiwweGEyCisJYW5kbAkkMzIyMDE3Njg5NSwlZWR4CisJY21wbAkkMCwlZWJwCisJam5lCS5MMDA1bm90aW50ZWwKKwlvcmwJJDEwNzM3NDE4MjQsJWVkeAorLkwwMDVub3RpbnRlbDoKKwlidGwJJDI4LCVlZHgKKwlqbmMJLkwwMDJnZW5lcmljCisJYW5kbAkkNDAyNjUzMTgzOSwlZWR4CisJY21wbAkkMCwlZWRpCisJamUJLkwwMDJnZW5lcmljCisJb3JsCSQyNjg0MzU0NTYsJWVkeAorCXNocmwJJDE2LCVlYngKKwljbXBiCSQxLCVibAorCWphCS5MMDAyZ2VuZXJpYworCWFuZGwJJDQwMjY1MzE4MzksJWVkeAorLkwwMDJnZW5lcmljOgorCWFuZGwJJDIwNDgsJWVicAorCWFuZGwJJDQyOTQ5NjUyNDcsJWVjeAorCW1vdmwJJWVkeCwlZXNpCisJb3JsCSVlY3gsJWVicAorCWJ0bAkkMjcsJWVjeAorCWpuYwkuTDAwNmNsZWFyX2F2eAorCXhvcmwJJWVjeCwlZWN4CisuYnl0ZQkxNSwxLDIwOAorCWFuZGwJJDYsJWVheAorCWNtcGwJJDYsJWVheAorCWplCS5MMDA3ZG9uZQorCWNtcGwJJDIsJWVheAorCWplCS5MMDA2Y2xlYXJfYXZ4CisuTDAwOGNsZWFyX3htbToKKwlhbmRsCSQ0MjYxNDEyODYxLCVlYnAKKwlhbmRsCSQ0Mjc4MTkwMDc5LCVlc2kKKy5MMDA2Y2xlYXJfYXZ4OgorCWFuZGwJJDQwMjY1MjU2OTUsJWVicAorCW1vdmwJMjAoJWVzcCksJWVkaQorCWFuZGwJJDQyOTQ5NjcyNjMsOCglZWRpKQorLkwwMDdkb25lOgorCW1vdmwJJWVzaSwlZWF4CisJbW92bAklZWJwLCVlZHgKKy5MMDAwbm9jcHVpZDoKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5zaXplCU9QRU5TU0xfaWEzMl9jcHVpZCwuLS5MX09QRU5TU0xfaWEzMl9jcHVpZF9iZWdpbgorLmdsb2JsCU9QRU5TU0xfcmR0c2MKKy5oaWRkZW4JT1BFTlNTTF9yZHRzYworLnR5cGUJT1BFTlNTTF9yZHRzYyxAZnVuY3Rpb24KKy5hbGlnbgkxNgorT1BFTlNTTF9yZHRzYzoKKy5MX09QRU5TU0xfcmR0c2NfYmVnaW46CisJeG9ybAklZWF4LCVlYXgKKwl4b3JsCSVlZHgsJWVkeAorCWNhbGwJLkwwMDlQSUNfbWVfdXAKKy5MMDA5UElDX21lX3VwOgorCXBvcGwJJWVjeAorCWxlYWwJT1BFTlNTTF9pYTMyY2FwX1AtLkwwMDlQSUNfbWVfdXAoJWVjeCksJWVjeAorCWJ0bAkkNCwoJWVjeCkKKwlqbmMJLkwwMTBub3RzYworCS5ieXRlCTB4MGYsMHgzMQorLkwwMTBub3RzYzoKKwlyZXQKKy5zaXplCU9QRU5TU0xfcmR0c2MsLi0uTF9PUEVOU1NMX3JkdHNjX2JlZ2luCisuZ2xvYmwJT1BFTlNTTF9pbnN0cnVtZW50X2hhbHQKKy5oaWRkZW4JT1BFTlNTTF9pbnN0cnVtZW50X2hhbHQKKy50eXBlCU9QRU5TU0xfaW5zdHJ1bWVudF9oYWx0LEBmdW5jdGlvbgorLmFsaWduCTE2CitPUEVOU1NMX2luc3RydW1lbnRfaGFsdDoKKy5MX09QRU5TU0xfaW5zdHJ1bWVudF9oYWx0X2JlZ2luOgorCWNhbGwJLkwwMTFQSUNfbWVfdXAKKy5MMDExUElDX21lX3VwOgorCXBvcGwJJWVjeAorCWxlYWwJT1BFTlNTTF9pYTMyY2FwX1AtLkwwMTFQSUNfbWVfdXAoJWVjeCksJWVjeAorCWJ0bAkkNCwoJWVjeCkKKwlqbmMJLkwwMTJub2hhbHQKKy5sb25nCTI0MjE3MjMxNTAKKwlhbmRsCSQzLCVlYXgKKwlqbnoJLkwwMTJub2hhbHQKKwlwdXNoZmwKKwlwb3BsCSVlYXgKKwlidGwJJDksJWVheAorCWpuYwkuTDAxMm5vaGFsdAorCS5ieXRlCTB4MGYsMHgzMQorCXB1c2hsCSVlZHgKKwlwdXNobAklZWF4CisJaGx0CisJLmJ5dGUJMHgwZiwweDMxCisJc3VibAkoJWVzcCksJWVheAorCXNiYmwJNCglZXNwKSwlZWR4CisJYWRkbAkkOCwlZXNwCisJcmV0CisuTDAxMm5vaGFsdDoKKwl4b3JsCSVlYXgsJWVheAorCXhvcmwJJWVkeCwlZWR4CisJcmV0Cisuc2l6ZQlPUEVOU1NMX2luc3RydW1lbnRfaGFsdCwuLS5MX09QRU5TU0xfaW5zdHJ1bWVudF9oYWx0X2JlZ2luCisuZ2xvYmwJT1BFTlNTTF9mYXJfc3BpbgorLmhpZGRlbglPUEVOU1NMX2Zhcl9zcGluCisudHlwZQlPUEVOU1NMX2Zhcl9zcGluLEBmdW5jdGlvbgorLmFsaWduCTE2CitPUEVOU1NMX2Zhcl9zcGluOgorLkxfT1BFTlNTTF9mYXJfc3Bpbl9iZWdpbjoKKwlwdXNoZmwKKwlwb3BsCSVlYXgKKwlidGwJJDksJWVheAorCWpuYwkuTDAxM25vc3BpbgorCW1vdmwJNCglZXNwKSwlZWF4CisJbW92bAk4KCVlc3ApLCVlY3gKKy5sb25nCTI0MzAxMTEyNjIKKwl4b3JsCSVlYXgsJWVheAorCW1vdmwJKCVlY3gpLCVlZHgKKwlqbXAJLkwwMTRzcGluCisuYWxpZ24JMTYKKy5MMDE0c3BpbjoKKwlpbmNsCSVlYXgKKwljbXBsCSglZWN4KSwlZWR4CisJamUJLkwwMTRzcGluCisubG9uZwk1Mjk1Njc4ODgKKwlyZXQKKy5MMDEzbm9zcGluOgorCXhvcmwJJWVheCwlZWF4CisJeG9ybAklZWR4LCVlZHgKKwlyZXQKKy5zaXplCU9QRU5TU0xfZmFyX3NwaW4sLi0uTF9PUEVOU1NMX2Zhcl9zcGluX2JlZ2luCisuZ2xvYmwJT1BFTlNTTF93aXBlX2NwdQorLmhpZGRlbglPUEVOU1NMX3dpcGVfY3B1CisudHlwZQlPUEVOU1NMX3dpcGVfY3B1LEBmdW5jdGlvbgorLmFsaWduCTE2CitPUEVOU1NMX3dpcGVfY3B1OgorLkxfT1BFTlNTTF93aXBlX2NwdV9iZWdpbjoKKwl4b3JsCSVlYXgsJWVheAorCXhvcmwJJWVkeCwlZWR4CisJY2FsbAkuTDAxNVBJQ19tZV91cAorLkwwMTVQSUNfbWVfdXA6CisJcG9wbAklZWN4CisJbGVhbAlPUEVOU1NMX2lhMzJjYXBfUC0uTDAxNVBJQ19tZV91cCglZWN4KSwlZWN4CisJbW92bAkoJWVjeCksJWVjeAorCWJ0bAkkMSwoJWVjeCkKKwlqbmMJLkwwMTZub194ODcKKwlhbmRsCSQ4Mzg4NjA4MCwlZWN4CisJY21wbAkkODM4ODYwODAsJWVjeAorCWpuZQkuTDAxN25vX3NzZTIKKwlweG9yCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTIKKwlweG9yCSV4bW0zLCV4bW0zCisJcHhvcgkleG1tNCwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTUKKwlweG9yCSV4bW02LCV4bW02CisJcHhvcgkleG1tNywleG1tNworLkwwMTdub19zc2UyOgorLmxvbmcJNDAwNzI1OTg2NSw0MDA3MjU5ODY1LDQwMDcyNTk4NjUsNDAwNzI1OTg2NSwyNDMwODUxOTk1CisuTDAxNm5vX3g4NzoKKwlsZWFsCTQoJWVzcCksJWVheAorCXJldAorLnNpemUJT1BFTlNTTF93aXBlX2NwdSwuLS5MX09QRU5TU0xfd2lwZV9jcHVfYmVnaW4KKy5nbG9ibAlPUEVOU1NMX2F0b21pY19hZGQKKy5oaWRkZW4JT1BFTlNTTF9hdG9taWNfYWRkCisudHlwZQlPUEVOU1NMX2F0b21pY19hZGQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK09QRU5TU0xfYXRvbWljX2FkZDoKKy5MX09QRU5TU0xfYXRvbWljX2FkZF9iZWdpbjoKKwltb3ZsCTQoJWVzcCksJWVkeAorCW1vdmwJOCglZXNwKSwlZWN4CisJcHVzaGwJJWVieAorCW5vcAorCW1vdmwJKCVlZHgpLCVlYXgKKy5MMDE4c3BpbjoKKwlsZWFsCSglZWF4LCVlY3gsMSksJWVieAorCW5vcAorLmxvbmcJNDQ3ODExNTY4CisJam5lCS5MMDE4c3BpbgorCW1vdmwJJWVieCwlZWF4CisJcG9wbAklZWJ4CisJcmV0Cisuc2l6ZQlPUEVOU1NMX2F0b21pY19hZGQsLi0uTF9PUEVOU1NMX2F0b21pY19hZGRfYmVnaW4KKy5nbG9ibAlPUEVOU1NMX2luZGlyZWN0X2NhbGwKKy5oaWRkZW4JT1BFTlNTTF9pbmRpcmVjdF9jYWxsCisudHlwZQlPUEVOU1NMX2luZGlyZWN0X2NhbGwsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK09QRU5TU0xfaW5kaXJlY3RfY2FsbDoKKy5MX09QRU5TU0xfaW5kaXJlY3RfY2FsbF9iZWdpbjoKKwlwdXNobAklZWJwCisJbW92bAklZXNwLCVlYnAKKwlzdWJsCSQyOCwlZXNwCisJbW92bAkxMiglZWJwKSwlZWN4CisJbW92bAklZWN4LCglZXNwKQorCW1vdmwJMTYoJWVicCksJWVkeAorCW1vdmwJJWVkeCw0KCVlc3ApCisJbW92bAkyMCglZWJwKSwlZWF4CisJbW92bAklZWF4LDgoJWVzcCkKKwltb3ZsCTI0KCVlYnApLCVlYXgKKwltb3ZsCSVlYXgsMTIoJWVzcCkKKwltb3ZsCTI4KCVlYnApLCVlYXgKKwltb3ZsCSVlYXgsMTYoJWVzcCkKKwltb3ZsCTMyKCVlYnApLCVlYXgKKwltb3ZsCSVlYXgsMjAoJWVzcCkKKwltb3ZsCTM2KCVlYnApLCVlYXgKKwltb3ZsCSVlYXgsMjQoJWVzcCkKKwljYWxsCSo4KCVlYnApCisJbW92bAklZWJwLCVlc3AKKwlwb3BsCSVlYnAKKwlyZXQKKy5zaXplCU9QRU5TU0xfaW5kaXJlY3RfY2FsbCwuLS5MX09QRU5TU0xfaW5kaXJlY3RfY2FsbF9iZWdpbgorLmdsb2JsCU9QRU5TU0xfaWEzMl9yZHJhbmQKKy5oaWRkZW4JT1BFTlNTTF9pYTMyX3JkcmFuZAorLnR5cGUJT1BFTlNTTF9pYTMyX3JkcmFuZCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorT1BFTlNTTF9pYTMyX3JkcmFuZDoKKy5MX09QRU5TU0xfaWEzMl9yZHJhbmRfYmVnaW46CisJbW92bAkkOCwlZWN4CisuTDAxOWxvb3A6CisuYnl0ZQkxNSwxOTksMjQwCisJamMJLkwwMjBicmVhaworCWxvb3AJLkwwMTlsb29wCisuTDAyMGJyZWFrOgorCWNtcGwJJDAsJWVheAorCWNtb3ZlbAklZWN4LCVlYXgKKwlyZXQKKy5zaXplCU9QRU5TU0xfaWEzMl9yZHJhbmQsLi0uTF9PUEVOU1NMX2lhMzJfcmRyYW5kX2JlZ2luCisuaGlkZGVuCU9QRU5TU0xfaWEzMmNhcF9QCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg4Nl82NC9jcnlwdG8vYm4vbW9kZXhwNTEyLXg4Nl82NC5TIGIvbGludXgteDg2XzY0L2NyeXB0by9ibi9tb2RleHA1MTIteDg2XzY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5YTJjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg4Nl82NC9jcnlwdG8vYm4vbW9kZXhwNTEyLXg4Nl82NC5TCkBAIC0wLDAgKzEsMTc3NiBAQAorI2lmIGRlZmluZWQoX194ODZfNjRfXykKKy50ZXh0CQorCisudHlwZQlNVUxBRERfMTI4eDUxMixAZnVuY3Rpb24KKy5hbGlnbgkxNgorTVVMQUREXzEyOHg1MTI6CisJbW92cQkwKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcjgsMCglcmN4KQorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTgoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjkKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXI5CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMTYoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEwCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkyNCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTMyKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMgorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEyCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDAoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk0OCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTU2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjE1CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyOAorCW1vdnEJOCglcmRpKSwlcmJwCisJbW92cQkwKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI5CisJYWRjcQkkMCwlcmR4CisJbW92cQklcjksOCglcmN4KQorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTgoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEwCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkxNiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTI0KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMgorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEyCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMzIoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk0MCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTQ4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjE1CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNTYoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXI4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyOQorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJTVVMQUREXzEyOHg1MTIsLi1NVUxBRERfMTI4eDUxMgorLnR5cGUJbW9udF9yZWR1Y2UsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK21vbnRfcmVkdWNlOgorCWxlYXEJMTkyKCVyc3ApLCVyZGkKKwltb3ZxCTMyKCVyc3ApLCVyc2kKKwlhZGRxCSQ1NzYsJXJzaQorCWxlYXEJNTIwKCVyc3ApLCVyY3gKKworCW1vdnEJOTYoJXJjeCksJXJicAorCW1vdnEJMCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJbW92cQkoJXJjeCksJXI4CisJYWRkcQklcmF4LCVyOAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXI4LDAoJXJkaSkKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwltb3ZxCTgoJXJjeCksJXI5CisJYWRkcQklcmF4LCVyOQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjkKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkxNiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJbW92cQkxNiglcmN4KSwlcjEwCisJYWRkcQklcmF4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTI0KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwltb3ZxCTI0KCVyY3gpLCVyMTEKKwlhZGRxCSVyYXgsJXIxMQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMzIoJXJzaSksJXJheAorCW11bHEJJXJicAorCW1vdnEJMzIoJXJjeCksJXIxMgorCWFkZHEJJXJheCwlcjEyCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk0MCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJbW92cQk0MCglcmN4KSwlcjEzCisJYWRkcQklcmF4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMworCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTQ4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwltb3ZxCTQ4KCVyY3gpLCVyMTQKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNTYoJXJzaSksJXJheAorCW11bHEJJXJicAorCW1vdnEJNTYoJXJjeCksJXIxNQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXI4CisJbW92cQkxMDQoJXJjeCksJXJicAorCW1vdnEJMCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyOQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXI5LDgoJXJkaSkKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMTYoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjExCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkyNCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMgorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTMyKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDAoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk0OCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxNQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTU2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyOAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjkKKwltb3ZxCTExMiglcmN4KSwlcmJwCisJbW92cQkwKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxMCwxNiglcmRpKQorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTgoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjExCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkxNiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMgorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTI0KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMzIoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk0MCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxNQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTQ4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyOAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTU2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI5CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyOQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQkxMjAoJXJjeCksJXJicAorCW1vdnEJMCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTEsMjQoJXJkaSkKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMgorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEyCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMTYoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkyNCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTMyKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjE1CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDAoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXI4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDgoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjkKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXI5CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNTYoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEwCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMQorCXhvcnEJJXJheCwlcmF4CisKKwlhZGRxCTY0KCVyY3gpLCVyOAorCWFkY3EJNzIoJXJjeCksJXI5CisJYWRjcQk4MCglcmN4KSwlcjEwCisJYWRjcQk4OCglcmN4KSwlcjExCisJYWRjcQkkMCwlcmF4CisKKworCisKKwltb3ZxCSVyOCw2NCglcmRpKQorCW1vdnEJJXI5LDcyKCVyZGkpCisJbW92cQklcjEwLCVyYnAKKwltb3ZxCSVyMTEsODgoJXJkaSkKKworCW1vdnEJJXJheCwzODQoJXJzcCkKKworCW1vdnEJMCglcmRpKSwlcjgKKwltb3ZxCTgoJXJkaSksJXI5CisJbW92cQkxNiglcmRpKSwlcjEwCisJbW92cQkyNCglcmRpKSwlcjExCisKKworCisKKworCisKKworCWFkZHEJJDgwLCVyZGkKKworCWFkZHEJJDY0LCVyc2kKKwlsZWFxCTI5NiglcnNwKSwlcmN4CisKKwljYWxsCU1VTEFERF8xMjh4NTEyCisKKwltb3ZxCTM4NCglcnNwKSwlcmF4CisKKworCWFkZHEJLTE2KCVyZGkpLCVyOAorCWFkY3EJLTgoJXJkaSksJXI5CisJbW92cQklcjgsNjQoJXJjeCkKKwltb3ZxCSVyOSw3MiglcmN4KQorCisJYWRjcQklcmF4LCVyYXgKKwltb3ZxCSVyYXgsMzg0KCVyc3ApCisKKwlsZWFxCTE5MiglcnNwKSwlcmRpCisJYWRkcQkkNjQsJXJzaQorCisKKworCisKKwltb3ZxCSglcnNpKSwlcjgKKwltb3ZxCTgoJXJzaSksJXJieAorCisJbW92cQkoJXJjeCksJXJheAorCW11bHEJJXI4CisJbW92cQklcmF4LCVyYnAKKwltb3ZxCSVyZHgsJXI5CisKKwltb3ZxCTgoJXJjeCksJXJheAorCW11bHEJJXI4CisJYWRkcQklcmF4LCVyOQorCisJbW92cQkoJXJjeCksJXJheAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjkKKworCW1vdnEJJXI5LDgoJXJkaSkKKworCisJc3VicQkkMTkyLCVyc2kKKworCW1vdnEJKCVyY3gpLCVyOAorCW1vdnEJOCglcmN4KSwlcjkKKworCWNhbGwJTVVMQUREXzEyOHg1MTIKKworCisKKworCW1vdnEJMCglcnNpKSwlcmF4CisJbW92cQk4KCVyc2kpLCVyYngKKwltb3ZxCTE2KCVyc2kpLCVyZGkKKwltb3ZxCTI0KCVyc2kpLCVyZHgKKworCisJbW92cQkzODQoJXJzcCksJXJicAorCisJYWRkcQk2NCglcmN4KSwlcjgKKwlhZGNxCTcyKCVyY3gpLCVyOQorCisKKwlhZGNxCSVyYnAsJXJicAorCisKKworCXNobHEJJDMsJXJicAorCW1vdnEJMzIoJXJzcCksJXJjeAorCWFkZHEJJXJjeCwlcmJwCisKKworCXhvcnEJJXJzaSwlcnNpCisKKwlhZGRxCTAoJXJicCksJXIxMAorCWFkY3EJNjQoJXJicCksJXIxMQorCWFkY3EJMTI4KCVyYnApLCVyMTIKKwlhZGNxCTE5MiglcmJwKSwlcjEzCisJYWRjcQkyNTYoJXJicCksJXIxNAorCWFkY3EJMzIwKCVyYnApLCVyMTUKKwlhZGNxCTM4NCglcmJwKSwlcjgKKwlhZGNxCTQ0OCglcmJwKSwlcjkKKworCisKKwlzYmJxCSQwLCVyc2kKKworCisJYW5kcQklcnNpLCVyYXgKKwlhbmRxCSVyc2ksJXJieAorCWFuZHEJJXJzaSwlcmRpCisJYW5kcQklcnNpLCVyZHgKKworCW1vdnEJJDEsJXJicAorCXN1YnEJJXJheCwlcjEwCisJc2JicQklcmJ4LCVyMTEKKwlzYmJxCSVyZGksJXIxMgorCXNiYnEJJXJkeCwlcjEzCisKKworCisKKwlzYmJxCSQwLCVyYnAKKworCisKKwlhZGRxCSQ1MTIsJXJjeAorCW1vdnEJMzIoJXJjeCksJXJheAorCW1vdnEJNDAoJXJjeCksJXJieAorCW1vdnEJNDgoJXJjeCksJXJkaQorCW1vdnEJNTYoJXJjeCksJXJkeAorCisKKworCWFuZHEJJXJzaSwlcmF4CisJYW5kcQklcnNpLCVyYngKKwlhbmRxCSVyc2ksJXJkaQorCWFuZHEJJXJzaSwlcmR4CisKKworCisJc3VicQkkMSwlcmJwCisKKwlzYmJxCSVyYXgsJXIxNAorCXNiYnEJJXJieCwlcjE1CisJc2JicQklcmRpLCVyOAorCXNiYnEJJXJkeCwlcjkKKworCisKKwltb3ZxCTE0NCglcnNwKSwlcnNpCisJbW92cQklcjEwLDAoJXJzaSkKKwltb3ZxCSVyMTEsOCglcnNpKQorCW1vdnEJJXIxMiwxNiglcnNpKQorCW1vdnEJJXIxMywyNCglcnNpKQorCW1vdnEJJXIxNCwzMiglcnNpKQorCW1vdnEJJXIxNSw0MCglcnNpKQorCW1vdnEJJXI4LDQ4KCVyc2kpCisJbW92cQklcjksNTYoJXJzaSkKKworCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJbW9udF9yZWR1Y2UsLi1tb250X3JlZHVjZQorLnR5cGUJbW9udF9tdWxfYTNiLEBmdW5jdGlvbgorLmFsaWduCTE2Cittb250X211bF9hM2I6CisKKworCisKKwltb3ZxCTAoJXJkaSksJXJicAorCisJbW92cQklcjEwLCVyYXgKKwltdWxxCSVyYnAKKwltb3ZxCSVyYXgsNTIwKCVyc3ApCisJbW92cQklcmR4LCVyMTAKKwltb3ZxCSVyMTEsJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTEKKwltb3ZxCSVyMTIsJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTIKKwltb3ZxCSVyMTMsJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEyCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTMKKwltb3ZxCSVyMTQsJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTQKKwltb3ZxCSVyMTUsJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTUKKwltb3ZxCSVyOCwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXI4CisJbW92cQklcjksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXI5CisJbW92cQk4KCVyZGkpLCVyYnAKKwltb3ZxCTAoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEwLDUyOCglcnNwKQorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTgoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjExCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkxNiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMgorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTI0KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMzIoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk0MCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxNQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTQ4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyOAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTU2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI5CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyOQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQkxNiglcmRpKSwlcmJwCisJbW92cQkwKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxMSw1MzYoJXJzcCkKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMgorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEyCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMTYoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkyNCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTMyKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjE1CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDAoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXI4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDgoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjkKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXI5CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNTYoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEwCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMQorCW1vdnEJMjQoJXJkaSksJXJicAorCW1vdnEJMCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTIsNTQ0KCVyc3ApCisJbW92cQklcmR4LCVyYngKKworCW1vdnEJOCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMworCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTE2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMjQoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkzMiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyOAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk0MCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyOQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjkKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk0OCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTU2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTIKKwltb3ZxCTMyKCVyZGkpLCVyYnAKKwltb3ZxCTAoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLDU1MiglcnNwKQorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTgoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkxNiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxNQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTI0KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyOAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTMyKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI5CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyOQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTQwKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDgoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjExCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk1NiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMgorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEzCisJbW92cQk0MCglcmRpKSwlcmJwCisJbW92cQkwKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxNCw1NjAoJXJzcCkKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjE1CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMTYoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXI4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMjQoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjkKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXI5CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMzIoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEwCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk0MCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTQ4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMgorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEyCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNTYoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJNDgoJXJkaSksJXJicAorCW1vdnEJMCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTUsNTY4KCVyc3ApCisJbW92cQklcmR4LCVyYngKKworCW1vdnEJOCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyOAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkxNiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyOQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjkKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkyNCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTMyKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDAoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEyCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk0OCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMworCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTU2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTUKKwltb3ZxCTU2KCVyZGkpLCVyYnAKKwltb3ZxCTAoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyOCw1NzYoJXJzcCkKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI5CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyOQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTE2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMjQoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjExCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkzMiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMgorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTQwKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDgoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk1NiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxNQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjgKKwltb3ZxCSVyOSw1ODQoJXJzcCkKKwltb3ZxCSVyMTAsNTkyKCVyc3ApCisJbW92cQklcjExLDYwMCglcnNwKQorCW1vdnEJJXIxMiw2MDgoJXJzcCkKKwltb3ZxCSVyMTMsNjE2KCVyc3ApCisJbW92cQklcjE0LDYyNCglcnNwKQorCW1vdnEJJXIxNSw2MzIoJXJzcCkKKwltb3ZxCSVyOCw2NDAoJXJzcCkKKworCisKKworCisJam1wCW1vbnRfcmVkdWNlCisKKworLnNpemUJbW9udF9tdWxfYTNiLC4tbW9udF9tdWxfYTNiCisudHlwZQlzcXJfcmVkdWNlLEBmdW5jdGlvbgorLmFsaWduCTE2CitzcXJfcmVkdWNlOgorCW1vdnEJMTYoJXJzcCksJXJjeAorCisKKworCW1vdnEJJXIxMCwlcmJ4CisKKwltb3ZxCSVyMTEsJXJheAorCW11bHEJJXJieAorCW1vdnEJJXJheCw1MjgoJXJzcCkKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJJXIxMiwlcmF4CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMQorCW1vdnEJJXIxMywlcmF4CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMgorCW1vdnEJJXIxNCwlcmF4CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMworCW1vdnEJJXIxNSwlcmF4CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJJXI4LCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjE1CisJbW92cQklcjksJXJheAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyc2kKKworCW1vdnEJJXIxMCw1MzYoJXJzcCkKKworCisKKworCisJbW92cQk4KCVyY3gpLCVyYngKKworCW1vdnEJMTYoJXJjeCksJXJheAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjExLDU0NCglcnNwKQorCisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTI0KCVyY3gpLCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMgorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEyCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEyLDU1MiglcnNwKQorCisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTMyKCVyY3gpLCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEzCisJYWRjcQkkMCwlcmR4CisKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJNDAoJXJjeCksJXJheAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyMTQKKwlhZGNxCSQwLCVyZHgKKworCW1vdnEJJXJkeCwlcjEwCisJbW92cQklcjgsJXJheAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSQwLCVyZHgKKworCW1vdnEJJXJkeCwlcjEwCisJbW92cQklcjksJXJheAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcnNpCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyc2kKKwlhZGNxCSQwLCVyZHgKKworCW1vdnEJJXJkeCwlcjExCisKKworCisKKwltb3ZxCTE2KCVyY3gpLCVyYngKKworCW1vdnEJMjQoJXJjeCksJXJheAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLDU2MCglcnNwKQorCisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTMyKCVyY3gpLCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcjE0LDU2OCglcnNwKQorCisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTQwKCVyY3gpLCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQkkMCwlcmR4CisKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJJXI4LCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXJzaQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcnNpCisJYWRjcQkkMCwlcmR4CisKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJJXI5LCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjExCisJYWRjcQkkMCwlcmR4CisKKwltb3ZxCSVyZHgsJXIxMgorCisKKworCisKKwltb3ZxCTI0KCVyY3gpLCVyYngKKworCW1vdnEJMzIoJXJjeCksJXJheAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJbW92cQklcjE1LDU3NiglcnNwKQorCisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTQwKCVyY3gpLCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXJzaQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcnNpCisJYWRjcQkkMCwlcmR4CisJbW92cQklcnNpLDU4NCglcnNwKQorCisJbW92cQklcmR4LCVyMTAKKwltb3ZxCSVyOCwlcmF4CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxMQorCWFkY3EJJDAsJXJkeAorCisJbW92cQklcmR4LCVyMTAKKwltb3ZxCSVyOSwlcmF4CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxMgorCWFkY3EJJDAsJXJkeAorCisJbW92cQklcmR4LCVyMTUKKworCisKKworCW1vdnEJMzIoJXJjeCksJXJieAorCisJbW92cQk0MCglcmN4KSwlcmF4CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTEsNTkyKCVyc3ApCisKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJJXI4LCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMgorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEyCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEyLDYwMCglcnNwKQorCisJbW92cQklcmR4LCVyMTAKKwltb3ZxCSVyOSwlcmF4CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJDAsJXJkeAorCisJbW92cQklcmR4LCVyMTEKKworCisKKworCW1vdnEJNDAoJXJjeCksJXJieAorCisJbW92cQklcjgsJXJheAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJbW92cQklcjE1LDYwOCglcnNwKQorCisJbW92cQklcmR4LCVyMTAKKwltb3ZxCSVyOSwlcmF4CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxMQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxMSw2MTYoJXJzcCkKKworCW1vdnEJJXJkeCwlcjEyCisKKworCisKKwltb3ZxCSVyOCwlcmJ4CisKKwltb3ZxCSVyOSwlcmF4CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTIsNjI0KCVyc3ApCisKKwltb3ZxCSVyZHgsNjMyKCVyc3ApCisKKworCW1vdnEJNTI4KCVyc3ApLCVyMTAKKwltb3ZxCTUzNiglcnNwKSwlcjExCisJbW92cQk1NDQoJXJzcCksJXIxMgorCW1vdnEJNTUyKCVyc3ApLCVyMTMKKwltb3ZxCTU2MCglcnNwKSwlcjE0CisJbW92cQk1NjgoJXJzcCksJXIxNQorCisJbW92cQkyNCglcmN4KSwlcmF4CisJbXVscQklcmF4CisJbW92cQklcmF4LCVyZGkKKwltb3ZxCSVyZHgsJXI4CisKKwlhZGRxCSVyMTAsJXIxMAorCWFkY3EJJXIxMSwlcjExCisJYWRjcQklcjEyLCVyMTIKKwlhZGNxCSVyMTMsJXIxMworCWFkY3EJJXIxNCwlcjE0CisJYWRjcQklcjE1LCVyMTUKKwlhZGNxCSQwLCVyOAorCisJbW92cQkwKCVyY3gpLCVyYXgKKwltdWxxCSVyYXgKKwltb3ZxCSVyYXgsNTIwKCVyc3ApCisJbW92cQklcmR4LCVyYngKKworCW1vdnEJOCglcmN4KSwlcmF4CisJbXVscQklcmF4CisKKwlhZGRxCSVyYngsJXIxMAorCWFkY3EJJXJheCwlcjExCisJYWRjcQkkMCwlcmR4CisKKwltb3ZxCSVyZHgsJXJieAorCW1vdnEJJXIxMCw1MjgoJXJzcCkKKwltb3ZxCSVyMTEsNTM2KCVyc3ApCisKKwltb3ZxCTE2KCVyY3gpLCVyYXgKKwltdWxxCSVyYXgKKworCWFkZHEJJXJieCwlcjEyCisJYWRjcQklcmF4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKworCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCSVyMTIsNTQ0KCVyc3ApCisJbW92cQklcjEzLDU1MiglcnNwKQorCisJeG9ycQklcmJwLCVyYnAKKwlhZGRxCSVyYngsJXIxNAorCWFkY3EJJXJkaSwlcjE1CisJYWRjcQkkMCwlcmJwCisKKwltb3ZxCSVyMTQsNTYwKCVyc3ApCisJbW92cQklcjE1LDU2OCglcnNwKQorCisKKworCisJbW92cQk1NzYoJXJzcCksJXIxMAorCW1vdnEJNTg0KCVyc3ApLCVyMTEKKwltb3ZxCTU5MiglcnNwKSwlcjEyCisJbW92cQk2MDAoJXJzcCksJXIxMworCW1vdnEJNjA4KCVyc3ApLCVyMTQKKwltb3ZxCTYxNiglcnNwKSwlcjE1CisJbW92cQk2MjQoJXJzcCksJXJkaQorCW1vdnEJNjMyKCVyc3ApLCVyc2kKKworCW1vdnEJJXI5LCVyYXgKKwltdWxxCSVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbW92cQklcmR4LCVyYngKKworCWFkZHEJJXIxMCwlcjEwCisJYWRjcQklcjExLCVyMTEKKwlhZGNxCSVyMTIsJXIxMgorCWFkY3EJJXIxMywlcjEzCisJYWRjcQklcjE0LCVyMTQKKwlhZGNxCSVyMTUsJXIxNQorCWFkY3EJJXJkaSwlcmRpCisJYWRjcQklcnNpLCVyc2kKKwlhZGNxCSQwLCVyYngKKworCWFkZHEJJXJicCwlcjEwCisKKwltb3ZxCTMyKCVyY3gpLCVyYXgKKwltdWxxCSVyYXgKKworCWFkZHEJJXI4LCVyMTAKKwlhZGNxCSVyYXgsJXIxMQorCWFkY3EJJDAsJXJkeAorCisJbW92cQklcmR4LCVyYnAKKworCW1vdnEJJXIxMCw1NzYoJXJzcCkKKwltb3ZxCSVyMTEsNTg0KCVyc3ApCisKKwltb3ZxCTQwKCVyY3gpLCVyYXgKKwltdWxxCSVyYXgKKworCWFkZHEJJXJicCwlcjEyCisJYWRjcQklcmF4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKworCW1vdnEJJXJkeCwlcmJwCisKKwltb3ZxCSVyMTIsNTkyKCVyc3ApCisJbW92cQklcjEzLDYwMCglcnNwKQorCisJbW92cQk0OCglcmN4KSwlcmF4CisJbXVscQklcmF4CisKKwlhZGRxCSVyYnAsJXIxNAorCWFkY3EJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisKKwltb3ZxCSVyMTQsNjA4KCVyc3ApCisJbW92cQklcjE1LDYxNiglcnNwKQorCisJYWRkcQklcmR4LCVyZGkKKwlhZGNxCSVyOSwlcnNpCisJYWRjcQkkMCwlcmJ4CisKKwltb3ZxCSVyZGksNjI0KCVyc3ApCisJbW92cQklcnNpLDYzMiglcnNwKQorCW1vdnEJJXJieCw2NDAoJXJzcCkKKworCWptcAltb250X3JlZHVjZQorCisKKy5zaXplCXNxcl9yZWR1Y2UsLi1zcXJfcmVkdWNlCisuZ2xvYmwJbW9kX2V4cF81MTIKKy5oaWRkZW4gbW9kX2V4cF81MTIKKy50eXBlCW1vZF9leHBfNTEyLEBmdW5jdGlvbgorbW9kX2V4cF81MTI6CisJcHVzaHEJJXJicAorCXB1c2hxCSVyYngKKwlwdXNocQklcjEyCisJcHVzaHEJJXIxMworCXB1c2hxCSVyMTQKKwlwdXNocQklcjE1CisKKworCW1vdnEJJXJzcCwlcjgKKwlzdWJxCSQyNjg4LCVyc3AKKwlhbmRxCSQtNjQsJXJzcAorCisKKwltb3ZxCSVyOCwwKCVyc3ApCisJbW92cQklcmRpLDgoJXJzcCkKKwltb3ZxCSVyc2ksMTYoJXJzcCkKKwltb3ZxCSVyY3gsMjQoJXJzcCkKKy5MYm9keToKKworCisKKwlweG9yCSV4bW00LCV4bW00CisJbW92ZHF1CTAoJXJzaSksJXhtbTAKKwltb3ZkcXUJMTYoJXJzaSksJXhtbTEKKwltb3ZkcXUJMzIoJXJzaSksJXhtbTIKKwltb3ZkcXUJNDgoJXJzaSksJXhtbTMKKwltb3ZkcWEJJXhtbTQsNTEyKCVyc3ApCisJbW92ZHFhCSV4bW00LDUyOCglcnNwKQorCW1vdmRxYQkleG1tNCw2MDgoJXJzcCkKKwltb3ZkcWEJJXhtbTQsNjI0KCVyc3ApCisJbW92ZHFhCSV4bW0wLDU0NCglcnNwKQorCW1vdmRxYQkleG1tMSw1NjAoJXJzcCkKKwltb3ZkcWEJJXhtbTIsNTc2KCVyc3ApCisJbW92ZHFhCSV4bW0zLDU5MiglcnNwKQorCisKKwltb3ZkcXUJMCglcmR4KSwleG1tMAorCW1vdmRxdQkxNiglcmR4KSwleG1tMQorCW1vdmRxdQkzMiglcmR4KSwleG1tMgorCW1vdmRxdQk0OCglcmR4KSwleG1tMworCisJbGVhcQkzODQoJXJzcCksJXJieAorCW1vdnEJJXJieCwxMzYoJXJzcCkKKwljYWxsCW1vbnRfcmVkdWNlCisKKworCWxlYXEJNDQ4KCVyc3ApLCVyY3gKKwl4b3JxCSVyYXgsJXJheAorCW1vdnEJJXJheCwwKCVyY3gpCisJbW92cQklcmF4LDgoJXJjeCkKKwltb3ZxCSVyYXgsMjQoJXJjeCkKKwltb3ZxCSVyYXgsMzIoJXJjeCkKKwltb3ZxCSVyYXgsNDAoJXJjeCkKKwltb3ZxCSVyYXgsNDgoJXJjeCkKKwltb3ZxCSVyYXgsNTYoJXJjeCkKKwltb3ZxCSVyYXgsMTI4KCVyc3ApCisJbW92cQkkMSwxNiglcmN4KQorCisJbGVhcQk2NDAoJXJzcCksJXJicAorCW1vdnEJJXJjeCwlcnNpCisJbW92cQklcmJwLCVyZGkKKwltb3ZxCSQ4LCVyYXgKK2xvb3BfMDoKKwltb3ZxCSglcmN4KSwlcmJ4CisJbW92dwklYngsKCVyZGkpCisJc2hycQkkMTYsJXJieAorCW1vdncJJWJ4LDY0KCVyZGkpCisJc2hycQkkMTYsJXJieAorCW1vdncJJWJ4LDEyOCglcmRpKQorCXNocnEJJDE2LCVyYngKKwltb3Z3CSVieCwxOTIoJXJkaSkKKwlsZWFxCTgoJXJjeCksJXJjeAorCWxlYXEJMjU2KCVyZGkpLCVyZGkKKwlkZWNxCSVyYXgKKwlqbnoJbG9vcF8wCisJbW92cQkkMzEsJXJheAorCW1vdnEJJXJheCwzMiglcnNwKQorCW1vdnEJJXJicCw0MCglcnNwKQorCisJbW92cQklcnNpLDEzNiglcnNwKQorCW1vdnEJMCglcnNpKSwlcjEwCisJbW92cQk4KCVyc2kpLCVyMTEKKwltb3ZxCTE2KCVyc2kpLCVyMTIKKwltb3ZxCTI0KCVyc2kpLCVyMTMKKwltb3ZxCTMyKCVyc2kpLCVyMTQKKwltb3ZxCTQwKCVyc2kpLCVyMTUKKwltb3ZxCTQ4KCVyc2kpLCVyOAorCW1vdnEJNTYoJXJzaSksJXI5Citpbml0X2xvb3A6CisJbGVhcQkzODQoJXJzcCksJXJkaQorCWNhbGwJbW9udF9tdWxfYTNiCisJbGVhcQk0NDgoJXJzcCksJXJzaQorCW1vdnEJNDAoJXJzcCksJXJicAorCWFkZHEJJDIsJXJicAorCW1vdnEJJXJicCw0MCglcnNwKQorCW1vdnEJJXJzaSwlcmN4CisJbW92cQkkOCwlcmF4Citsb29wXzE6CisJbW92cQkoJXJjeCksJXJieAorCW1vdncJJWJ4LCglcmJwKQorCXNocnEJJDE2LCVyYngKKwltb3Z3CSVieCw2NCglcmJwKQorCXNocnEJJDE2LCVyYngKKwltb3Z3CSVieCwxMjgoJXJicCkKKwlzaHJxCSQxNiwlcmJ4CisJbW92dwklYngsMTkyKCVyYnApCisJbGVhcQk4KCVyY3gpLCVyY3gKKwlsZWFxCTI1NiglcmJwKSwlcmJwCisJZGVjcQklcmF4CisJam56CWxvb3BfMQorCW1vdnEJMzIoJXJzcCksJXJheAorCXN1YnEJJDEsJXJheAorCW1vdnEJJXJheCwzMiglcnNwKQorCWpuZQlpbml0X2xvb3AKKworCisKKwltb3ZkcWEJJXhtbTAsNjQoJXJzcCkKKwltb3ZkcWEJJXhtbTEsODAoJXJzcCkKKwltb3ZkcWEJJXhtbTIsOTYoJXJzcCkKKwltb3ZkcWEJJXhtbTMsMTEyKCVyc3ApCisKKworCisKKworCW1vdmwJMTI2KCVyc3ApLCVlYXgKKwltb3ZxCSVyYXgsJXJkeAorCXNocnEJJDExLCVyYXgKKwlhbmRsCSQyMDQ3LCVlZHgKKwltb3ZsCSVlZHgsMTI2KCVyc3ApCisJbGVhcQk2NDAoJXJzcCwlcmF4LDIpLCVyc2kKKwltb3ZxCTgoJXJzcCksJXJkeAorCW1vdnEJJDQsJXJicAorbG9vcF8yOgorCW1vdnp3cQkxOTIoJXJzaSksJXJieAorCW1vdnp3cQk0NDgoJXJzaSksJXJheAorCXNobHEJJDE2LCVyYngKKwlzaGxxCSQxNiwlcmF4CisJbW92dwkxMjgoJXJzaSksJWJ4CisJbW92dwkzODQoJXJzaSksJWF4CisJc2hscQkkMTYsJXJieAorCXNobHEJJDE2LCVyYXgKKwltb3Z3CTY0KCVyc2kpLCVieAorCW1vdncJMzIwKCVyc2kpLCVheAorCXNobHEJJDE2LCVyYngKKwlzaGxxCSQxNiwlcmF4CisJbW92dwkwKCVyc2kpLCVieAorCW1vdncJMjU2KCVyc2kpLCVheAorCW1vdnEJJXJieCwwKCVyZHgpCisJbW92cQklcmF4LDgoJXJkeCkKKwlsZWFxCTUxMiglcnNpKSwlcnNpCisJbGVhcQkxNiglcmR4KSwlcmR4CisJc3VicQkkMSwlcmJwCisJam56CWxvb3BfMgorCW1vdnEJJDUwNSw0OCglcnNwKQorCisJbW92cQk4KCVyc3ApLCVyY3gKKwltb3ZxCSVyY3gsMTM2KCVyc3ApCisJbW92cQkwKCVyY3gpLCVyMTAKKwltb3ZxCTgoJXJjeCksJXIxMQorCW1vdnEJMTYoJXJjeCksJXIxMgorCW1vdnEJMjQoJXJjeCksJXIxMworCW1vdnEJMzIoJXJjeCksJXIxNAorCW1vdnEJNDAoJXJjeCksJXIxNQorCW1vdnEJNDgoJXJjeCksJXI4CisJbW92cQk1NiglcmN4KSwlcjkKKwlqbXAJc3FyXzIKKworbWFpbl9sb29wX2EzYjoKKwljYWxsCXNxcl9yZWR1Y2UKKwljYWxsCXNxcl9yZWR1Y2UKKwljYWxsCXNxcl9yZWR1Y2UKK3Nxcl8yOgorCWNhbGwJc3FyX3JlZHVjZQorCWNhbGwJc3FyX3JlZHVjZQorCisKKworCW1vdnEJNDgoJXJzcCksJXJjeAorCW1vdnEJJXJjeCwlcmF4CisJc2hycQkkNCwlcmF4CisJbW92bAk2NCglcnNwLCVyYXgsMiksJWVkeAorCWFuZHEJJDE1LCVyY3gKKwlzaHJxCSVjbCwlcmR4CisJYW5kcQkkMzEsJXJkeAorCisJbGVhcQk2NDAoJXJzcCwlcmR4LDIpLCVyc2kKKwlsZWFxCTQ0OCglcnNwKSwlcmR4CisJbW92cQklcmR4LCVyZGkKKwltb3ZxCSQ0LCVyYnAKK2xvb3BfMzoKKwltb3Z6d3EJMTkyKCVyc2kpLCVyYngKKwltb3Z6d3EJNDQ4KCVyc2kpLCVyYXgKKwlzaGxxCSQxNiwlcmJ4CisJc2hscQkkMTYsJXJheAorCW1vdncJMTI4KCVyc2kpLCVieAorCW1vdncJMzg0KCVyc2kpLCVheAorCXNobHEJJDE2LCVyYngKKwlzaGxxCSQxNiwlcmF4CisJbW92dwk2NCglcnNpKSwlYngKKwltb3Z3CTMyMCglcnNpKSwlYXgKKwlzaGxxCSQxNiwlcmJ4CisJc2hscQkkMTYsJXJheAorCW1vdncJMCglcnNpKSwlYngKKwltb3Z3CTI1NiglcnNpKSwlYXgKKwltb3ZxCSVyYngsMCglcmR4KQorCW1vdnEJJXJheCw4KCVyZHgpCisJbGVhcQk1MTIoJXJzaSksJXJzaQorCWxlYXEJMTYoJXJkeCksJXJkeAorCXN1YnEJJDEsJXJicAorCWpueglsb29wXzMKKwltb3ZxCTgoJXJzcCksJXJzaQorCWNhbGwJbW9udF9tdWxfYTNiCisKKworCisJbW92cQk0OCglcnNwKSwlcmN4CisJc3VicQkkNSwlcmN4CisJbW92cQklcmN4LDQ4KCVyc3ApCisJamdlCW1haW5fbG9vcF9hM2IKKworCisKK2VuZF9tYWluX2xvb3BfYTNiOgorCisKKwltb3ZxCTgoJXJzcCksJXJkeAorCXB4b3IJJXhtbTQsJXhtbTQKKwltb3ZkcXUJMCglcmR4KSwleG1tMAorCW1vdmRxdQkxNiglcmR4KSwleG1tMQorCW1vdmRxdQkzMiglcmR4KSwleG1tMgorCW1vdmRxdQk0OCglcmR4KSwleG1tMworCW1vdmRxYQkleG1tNCw1NzYoJXJzcCkKKwltb3ZkcWEJJXhtbTQsNTkyKCVyc3ApCisJbW92ZHFhCSV4bW00LDYwOCglcnNwKQorCW1vdmRxYQkleG1tNCw2MjQoJXJzcCkKKwltb3ZkcWEJJXhtbTAsNTEyKCVyc3ApCisJbW92ZHFhCSV4bW0xLDUyOCglcnNwKQorCW1vdmRxYQkleG1tMiw1NDQoJXJzcCkKKwltb3ZkcWEJJXhtbTMsNTYwKCVyc3ApCisJY2FsbAltb250X3JlZHVjZQorCisKKworCW1vdnEJOCglcnNwKSwlcmF4CisJbW92cQkwKCVyYXgpLCVyOAorCW1vdnEJOCglcmF4KSwlcjkKKwltb3ZxCTE2KCVyYXgpLCVyMTAKKwltb3ZxCTI0KCVyYXgpLCVyMTEKKwltb3ZxCTMyKCVyYXgpLCVyMTIKKwltb3ZxCTQwKCVyYXgpLCVyMTMKKwltb3ZxCTQ4KCVyYXgpLCVyMTQKKwltb3ZxCTU2KCVyYXgpLCVyMTUKKworCisJbW92cQkyNCglcnNwKSwlcmJ4CisJYWRkcQkkNTEyLCVyYngKKworCXN1YnEJMCglcmJ4KSwlcjgKKwlzYmJxCTgoJXJieCksJXI5CisJc2JicQkxNiglcmJ4KSwlcjEwCisJc2JicQkyNCglcmJ4KSwlcjExCisJc2JicQkzMiglcmJ4KSwlcjEyCisJc2JicQk0MCglcmJ4KSwlcjEzCisJc2JicQk0OCglcmJ4KSwlcjE0CisJc2JicQk1NiglcmJ4KSwlcjE1CisKKworCW1vdnEJMCglcmF4KSwlcnNpCisJbW92cQk4KCVyYXgpLCVyZGkKKwltb3ZxCTE2KCVyYXgpLCVyY3gKKwltb3ZxCTI0KCVyYXgpLCVyZHgKKwljbW92bmNxCSVyOCwlcnNpCisJY21vdm5jcQklcjksJXJkaQorCWNtb3ZuY3EJJXIxMCwlcmN4CisJY21vdm5jcQklcjExLCVyZHgKKwltb3ZxCSVyc2ksMCglcmF4KQorCW1vdnEJJXJkaSw4KCVyYXgpCisJbW92cQklcmN4LDE2KCVyYXgpCisJbW92cQklcmR4LDI0KCVyYXgpCisKKwltb3ZxCTMyKCVyYXgpLCVyc2kKKwltb3ZxCTQwKCVyYXgpLCVyZGkKKwltb3ZxCTQ4KCVyYXgpLCVyY3gKKwltb3ZxCTU2KCVyYXgpLCVyZHgKKwljbW92bmNxCSVyMTIsJXJzaQorCWNtb3ZuY3EJJXIxMywlcmRpCisJY21vdm5jcQklcjE0LCVyY3gKKwljbW92bmNxCSVyMTUsJXJkeAorCW1vdnEJJXJzaSwzMiglcmF4KQorCW1vdnEJJXJkaSw0MCglcmF4KQorCW1vdnEJJXJjeCw0OCglcmF4KQorCW1vdnEJJXJkeCw1NiglcmF4KQorCisJbW92cQkwKCVyc3ApLCVyc2kKKwltb3ZxCTAoJXJzaSksJXIxNQorCW1vdnEJOCglcnNpKSwlcjE0CisJbW92cQkxNiglcnNpKSwlcjEzCisJbW92cQkyNCglcnNpKSwlcjEyCisJbW92cQkzMiglcnNpKSwlcmJ4CisJbW92cQk0MCglcnNpKSwlcmJwCisJbGVhcQk0OCglcnNpKSwlcnNwCisuTGVwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJbW9kX2V4cF81MTIsIC4gLSBtb2RfZXhwXzUxMgorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14ODZfNjQvY3J5cHRvL2NwdS14ODZfNjQtYXNtLlMgYi9saW51eC14ODZfNjQvY3J5cHRvL2NwdS14ODZfNjQtYXNtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlZjE1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg4Nl82NC9jcnlwdG8vY3B1LXg4Nl82NC1hc20uUwpAQCAtMCwwICsxLDE0MyBAQAorI2lmIGRlZmluZWQoX194ODZfNjRfXykKKy50ZXh0CQorCisuZ2xvYmwJT1BFTlNTTF9pYTMyX2NwdWlkCisuaGlkZGVuIE9QRU5TU0xfaWEzMl9jcHVpZAorLnR5cGUJT1BFTlNTTF9pYTMyX2NwdWlkLEBmdW5jdGlvbgorLmFsaWduCTE2CitPUEVOU1NMX2lhMzJfY3B1aWQ6CisKKworCW1vdnEJJXJkaSwlcmRpCisJbW92cQklcmJ4LCVyOAorCisJeG9ybAklZWF4LCVlYXgKKwltb3ZsCSVlYXgsOCglcmRpKQorCWNwdWlkCisJbW92bAklZWF4LCVyMTFkCisKKwl4b3JsCSVlYXgsJWVheAorCWNtcGwJJDE5NzAxNjkxNTksJWVieAorCXNldG5lCSVhbAorCW1vdmwJJWVheCwlcjlkCisJY21wbAkkMTIzMTM4NDE2OSwlZWR4CisJc2V0bmUJJWFsCisJb3JsCSVlYXgsJXI5ZAorCWNtcGwJJDE4MTg1ODgyNzAsJWVjeAorCXNldG5lCSVhbAorCW9ybAklZWF4LCVyOWQKKwlqegkuTGludGVsCisKKwljbXBsCSQxNzUyNDYyNjU3LCVlYngKKwlzZXRuZQklYWwKKwltb3ZsCSVlYXgsJXIxMGQKKwljbXBsCSQxNzY5MjM4MTE3LCVlZHgKKwlzZXRuZQklYWwKKwlvcmwJJWVheCwlcjEwZAorCWNtcGwJJDExNDU5MTM2OTksJWVjeAorCXNldG5lCSVhbAorCW9ybAklZWF4LCVyMTBkCisJam56CS5MaW50ZWwKKworCisKKworCW1vdmwJJDIxNDc0ODM2NDgsJWVheAorCWNwdWlkCisKKworCWNtcGwJJDIxNDc0ODM2NDksJWVheAorCWpiCS5MaW50ZWwKKwltb3ZsCSVlYXgsJXIxMGQKKwltb3ZsCSQyMTQ3NDgzNjQ5LCVlYXgKKwljcHVpZAorCisKKwlvcmwJJWVjeCwlcjlkCisJYW5kbAkkMjA0OSwlcjlkCisKKwljbXBsCSQyMTQ3NDgzNjU2LCVyMTBkCisJamIJLkxpbnRlbAorCisJbW92bAkkMjE0NzQ4MzY1NiwlZWF4CisJY3B1aWQKKworCW1vdnpicQklY2wsJXIxMAorCWluY3EJJXIxMAorCisJbW92bAkkMSwlZWF4CisJY3B1aWQKKworCWJ0bAkkMjgsJWVkeAorCWpuYwkuTGdlbmVyaWMKKwlzaHJsCSQxNiwlZWJ4CisJY21wYgklcjEwYiwlYmwKKwlqYQkuTGdlbmVyaWMKKwlhbmRsCSQ0MDI2NTMxODM5LCVlZHgKKwlqbXAJLkxnZW5lcmljCisKKy5MaW50ZWw6CisJY21wbAkkNCwlcjExZAorCW1vdmwJJC0xLCVyMTBkCisJamIJLkxub2NhY2hlaW5mbworCisJbW92bAkkNCwlZWF4CisJbW92bAkkMCwlZWN4CisJY3B1aWQKKwltb3ZsCSVlYXgsJXIxMGQKKwlzaHJsCSQxNCwlcjEwZAorCWFuZGwJJDQwOTUsJXIxMGQKKworCWNtcGwJJDcsJXIxMWQKKwlqYgkuTG5vY2FjaGVpbmZvCisKKwltb3ZsCSQ3LCVlYXgKKwl4b3JsCSVlY3gsJWVjeAorCWNwdWlkCisJbW92bAklZWJ4LDgoJXJkaSkKKworLkxub2NhY2hlaW5mbzoKKwltb3ZsCSQxLCVlYXgKKwljcHVpZAorCisJYW5kbAkkMzIyMDE3Njg5NSwlZWR4CisJY21wbAkkMCwlcjlkCisJam5lCS5Mbm90aW50ZWwKKwlvcmwJJDEwNzM3NDE4MjQsJWVkeAorLkxub3RpbnRlbDoKKwlidGwJJDI4LCVlZHgKKwlqbmMJLkxnZW5lcmljCisJYW5kbAkkNDAyNjUzMTgzOSwlZWR4CisJY21wbAkkMCwlcjEwZAorCWplCS5MZ2VuZXJpYworCisJb3JsCSQyNjg0MzU0NTYsJWVkeAorCXNocmwJJDE2LCVlYngKKwljbXBiCSQxLCVibAorCWphCS5MZ2VuZXJpYworCWFuZGwJJDQwMjY1MzE4MzksJWVkeAorLkxnZW5lcmljOgorCWFuZGwJJDIwNDgsJXI5ZAorCWFuZGwJJDQyOTQ5NjUyNDcsJWVjeAorCW9ybAklZWN4LCVyOWQKKworCW1vdmwJJWVkeCwlcjEwZAorCWJ0bAkkMjcsJXI5ZAorCWpuYwkuTGNsZWFyX2F2eAorCXhvcmwJJWVjeCwlZWN4CisuYnl0ZQkweDBmLDB4MDEsMHhkMAorCWFuZGwJJDYsJWVheAorCWNtcGwJJDYsJWVheAorCWplCS5MZG9uZQorLkxjbGVhcl9hdng6CisJbW92bAkkNDAyNjUyNTY5NSwlZWF4CisJYW5kbAklZWF4LCVyOWQKKwlhbmRsCSQ0Mjk0OTY3MjYzLDgoJXJkaSkKKy5MZG9uZToKKwltb3ZsCSVyOWQsNCglcmRpKQorCW1vdmwJJXIxMGQsMCglcmRpKQorCW1vdnEJJXI4LCVyYngKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCU9QRU5TU0xfaWEzMl9jcHVpZCwuLU9QRU5TU0xfaWEzMl9jcHVpZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg4Nl82NC9jcnlwdG8vcmFuZC9yZHJhbmQteDg2XzY0LlMgYi9saW51eC14ODZfNjQvY3J5cHRvL3JhbmQvcmRyYW5kLXg4Nl82NC5TCmluZGV4IDk0YWFiOWMuLjYyMmFlNTUgMTAwNjQ0Ci0tLSBhL2xpbnV4LXg4Nl82NC9jcnlwdG8vcmFuZC9yZHJhbmQteDg2XzY0LlMKKysrIGIvbGludXgteDg2XzY0L2NyeXB0by9yYW5kL3JkcmFuZC14ODZfNjQuUwpAQCAtMSw0OCArMSwxMSBAQAogI2lmIGRlZmluZWQoX194ODZfNjRfXykKIC50ZXh0CQogCi0KLQotCiAuZ2xvYmwJQ1JZUFRPX3JkcmFuZAogLmhpZGRlbiBDUllQVE9fcmRyYW5kCiAudHlwZQlDUllQVE9fcmRyYW5kLEBmdW5jdGlvbgogLmFsaWduCTE2CiBDUllQVE9fcmRyYW5kOgotCXhvcnEJJXJheCwlcmF4Ci0KLQotLmJ5dGUJMHg0OCwgMHgwZiwgMHhjNywgMHhmMQotCi0JYWRjcQklcmF4LCVyYXgKLQltb3ZxCSVyY3gsMCglcmRpKQotCS5ieXRlCTB4ZjMsMHhjMwotCi0KLQotCi0KLS5nbG9ibAlDUllQVE9fcmRyYW5kX211bHRpcGxlOF9idWYKLS5oaWRkZW4gQ1JZUFRPX3JkcmFuZF9tdWx0aXBsZThfYnVmCi0udHlwZQlDUllQVE9fcmRyYW5kX211bHRpcGxlOF9idWYsQGZ1bmN0aW9uCi0uYWxpZ24JMTYKLUNSWVBUT19yZHJhbmRfbXVsdGlwbGU4X2J1ZjoKLQl0ZXN0cQklcnNpLCVyc2kKLQlqegkuTG91dAotCW1vdnEJJDgsJXJkeAotLkxsb29wOgotCi0KLS5ieXRlCTB4NDgsIDB4MGYsIDB4YzcsIDB4ZjEKLQlqbmMJLkxlcnIKLQltb3ZxCSVyY3gsMCglcmRpKQotCWFkZHEJJXJkeCwlcmRpCi0Jc3VicQklcmR4LCVyc2kKLQlqbnoJLkxsb29wCi0uTG91dDoKLQltb3ZxCSQxLCVyYXgKLQkuYnl0ZQkweGYzLDB4YzMKLS5MZXJyOgotCXhvcnEJJXJheCwlcmF4CisuYnl0ZQkweDQ4LCAweDBmLCAweGM3LCAweGYwCiAJLmJ5dGUJMHhmMywweGMzCiAjZW5kaWYKZGlmZiAtLWdpdCBhL21hYy14ODYvY3J5cHRvL2NwdS14ODYtYXNtLlMgYi9tYWMteDg2L2NyeXB0by9jcHUteDg2LWFzbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYjI5MmMKLS0tIC9kZXYvbnVsbAorKysgYi9tYWMteDg2L2NyeXB0by9jcHUteDg2LWFzbS5TCkBAIC0wLDAgKzEsMzA5IEBACisjaWYgZGVmaW5lZChfX2kzODZfXykKKy5maWxlCSJjcnlwdG8vY3B1LXg4Ni1hc20uUyIKKy50ZXh0CisuZ2xvYmwJX09QRU5TU0xfaWEzMl9jcHVpZAorLnByaXZhdGVfZXh0ZXJuCV9PUEVOU1NMX2lhMzJfY3B1aWQKKy5hbGlnbgk0CitfT1BFTlNTTF9pYTMyX2NwdWlkOgorTF9PUEVOU1NMX2lhMzJfY3B1aWRfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCXhvcmwJJWVkeCwlZWR4CisJcHVzaGZsCisJcG9wbAklZWF4CisJbW92bAklZWF4LCVlY3gKKwl4b3JsCSQyMDk3MTUyLCVlYXgKKwlwdXNobAklZWF4CisJcG9wZmwKKwlwdXNoZmwKKwlwb3BsCSVlYXgKKwl4b3JsCSVlYXgsJWVjeAorCXhvcmwJJWVheCwlZWF4CisJYnRsCSQyMSwlZWN4CisJam5jCUwwMDBub2NwdWlkCisJbW92bAkyMCglZXNwKSwlZXNpCisJbW92bAklZWF4LDgoJWVzaSkKKwkuYnl0ZQkweDBmLDB4YTIKKwltb3ZsCSVlYXgsJWVkaQorCXhvcmwJJWVheCwlZWF4CisJY21wbAkkMTk3MDE2OTE1OSwlZWJ4CisJc2V0bmUJJWFsCisJbW92bAklZWF4LCVlYnAKKwljbXBsCSQxMjMxMzg0MTY5LCVlZHgKKwlzZXRuZQklYWwKKwlvcmwJJWVheCwlZWJwCisJY21wbAkkMTgxODU4ODI3MCwlZWN4CisJc2V0bmUJJWFsCisJb3JsCSVlYXgsJWVicAorCWp6CUwwMDFpbnRlbAorCWNtcGwJJDE3NTI0NjI2NTcsJWVieAorCXNldG5lCSVhbAorCW1vdmwJJWVheCwlZXNpCisJY21wbAkkMTc2OTIzODExNywlZWR4CisJc2V0bmUJJWFsCisJb3JsCSVlYXgsJWVzaQorCWNtcGwJJDExNDU5MTM2OTksJWVjeAorCXNldG5lCSVhbAorCW9ybAklZWF4LCVlc2kKKwlqbnoJTDAwMWludGVsCisJbW92bAkkMjE0NzQ4MzY0OCwlZWF4CisJLmJ5dGUJMHgwZiwweGEyCisJY21wbAkkMjE0NzQ4MzY0OSwlZWF4CisJamIJTDAwMWludGVsCisJbW92bAklZWF4LCVlc2kKKwltb3ZsCSQyMTQ3NDgzNjQ5LCVlYXgKKwkuYnl0ZQkweDBmLDB4YTIKKwlvcmwJJWVjeCwlZWJwCisJYW5kbAkkMjA0OSwlZWJwCisJY21wbAkkMjE0NzQ4MzY1NiwlZXNpCisJamIJTDAwMWludGVsCisJbW92bAkkMjE0NzQ4MzY1NiwlZWF4CisJLmJ5dGUJMHgwZiwweGEyCisJbW92emJsCSVjbCwlZXNpCisJaW5jbAklZXNpCisJbW92bAkkMSwlZWF4CisJeG9ybAklZWN4LCVlY3gKKwkuYnl0ZQkweDBmLDB4YTIKKwlidGwJJDI4LCVlZHgKKwlqbmMJTDAwMmdlbmVyaWMKKwlzaHJsCSQxNiwlZWJ4CisJYW5kbAkkMjU1LCVlYngKKwljbXBsCSVlc2ksJWVieAorCWphCUwwMDJnZW5lcmljCisJYW5kbAkkNDAyNjUzMTgzOSwlZWR4CisJam1wCUwwMDJnZW5lcmljCitMMDAxaW50ZWw6CisJY21wbAkkNywlZWRpCisJamIJTDAwM2NhY2hlaW5mbworCW1vdmwJMjAoJWVzcCksJWVzaQorCW1vdmwJJDcsJWVheAorCXhvcmwJJWVjeCwlZWN4CisJLmJ5dGUJMHgwZiwweGEyCisJbW92bAklZWJ4LDgoJWVzaSkKK0wwMDNjYWNoZWluZm86CisJY21wbAkkNCwlZWRpCisJbW92bAkkLTEsJWVkaQorCWpiCUwwMDRub2NhY2hlaW5mbworCW1vdmwJJDQsJWVheAorCW1vdmwJJDAsJWVjeAorCS5ieXRlCTB4MGYsMHhhMgorCW1vdmwJJWVheCwlZWRpCisJc2hybAkkMTQsJWVkaQorCWFuZGwJJDQwOTUsJWVkaQorTDAwNG5vY2FjaGVpbmZvOgorCW1vdmwJJDEsJWVheAorCXhvcmwJJWVjeCwlZWN4CisJLmJ5dGUJMHgwZiwweGEyCisJYW5kbAkkMzIyMDE3Njg5NSwlZWR4CisJY21wbAkkMCwlZWJwCisJam5lCUwwMDVub3RpbnRlbAorCW9ybAkkMTA3Mzc0MTgyNCwlZWR4CitMMDA1bm90aW50ZWw6CisJYnRsCSQyOCwlZWR4CisJam5jCUwwMDJnZW5lcmljCisJYW5kbAkkNDAyNjUzMTgzOSwlZWR4CisJY21wbAkkMCwlZWRpCisJamUJTDAwMmdlbmVyaWMKKwlvcmwJJDI2ODQzNTQ1NiwlZWR4CisJc2hybAkkMTYsJWVieAorCWNtcGIJJDEsJWJsCisJamEJTDAwMmdlbmVyaWMKKwlhbmRsCSQ0MDI2NTMxODM5LCVlZHgKK0wwMDJnZW5lcmljOgorCWFuZGwJJDIwNDgsJWVicAorCWFuZGwJJDQyOTQ5NjUyNDcsJWVjeAorCW1vdmwJJWVkeCwlZXNpCisJb3JsCSVlY3gsJWVicAorCWJ0bAkkMjcsJWVjeAorCWpuYwlMMDA2Y2xlYXJfYXZ4CisJeG9ybAklZWN4LCVlY3gKKy5ieXRlCTE1LDEsMjA4CisJYW5kbAkkNiwlZWF4CisJY21wbAkkNiwlZWF4CisJamUJTDAwN2RvbmUKKwljbXBsCSQyLCVlYXgKKwlqZQlMMDA2Y2xlYXJfYXZ4CitMMDA4Y2xlYXJfeG1tOgorCWFuZGwJJDQyNjE0MTI4NjEsJWVicAorCWFuZGwJJDQyNzgxOTAwNzksJWVzaQorTDAwNmNsZWFyX2F2eDoKKwlhbmRsCSQ0MDI2NTI1Njk1LCVlYnAKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwlhbmRsCSQ0Mjk0OTY3MjYzLDgoJWVkaSkKK0wwMDdkb25lOgorCW1vdmwJJWVzaSwlZWF4CisJbW92bAklZWJwLCVlZHgKK0wwMDBub2NwdWlkOgorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLmdsb2JsCV9PUEVOU1NMX3JkdHNjCisucHJpdmF0ZV9leHRlcm4JX09QRU5TU0xfcmR0c2MKKy5hbGlnbgk0CitfT1BFTlNTTF9yZHRzYzoKK0xfT1BFTlNTTF9yZHRzY19iZWdpbjoKKwl4b3JsCSVlYXgsJWVheAorCXhvcmwJJWVkeCwlZWR4CisJY2FsbAlMMDA5UElDX21lX3VwCitMMDA5UElDX21lX3VwOgorCXBvcGwJJWVjeAorCW1vdmwJTF9PUEVOU1NMX2lhMzJjYXBfUCRub25fbGF6eV9wdHItTDAwOVBJQ19tZV91cCglZWN4KSwlZWN4CisJYnRsCSQ0LCglZWN4KQorCWpuYwlMMDEwbm90c2MKKwkuYnl0ZQkweDBmLDB4MzEKK0wwMTBub3RzYzoKKwlyZXQKKy5nbG9ibAlfT1BFTlNTTF9pbnN0cnVtZW50X2hhbHQKKy5wcml2YXRlX2V4dGVybglfT1BFTlNTTF9pbnN0cnVtZW50X2hhbHQKKy5hbGlnbgk0CitfT1BFTlNTTF9pbnN0cnVtZW50X2hhbHQ6CitMX09QRU5TU0xfaW5zdHJ1bWVudF9oYWx0X2JlZ2luOgorCWNhbGwJTDAxMVBJQ19tZV91cAorTDAxMVBJQ19tZV91cDoKKwlwb3BsCSVlY3gKKwltb3ZsCUxfT1BFTlNTTF9pYTMyY2FwX1Akbm9uX2xhenlfcHRyLUwwMTFQSUNfbWVfdXAoJWVjeCksJWVjeAorCWJ0bAkkNCwoJWVjeCkKKwlqbmMJTDAxMm5vaGFsdAorLmxvbmcJMjQyMTcyMzE1MAorCWFuZGwJJDMsJWVheAorCWpueglMMDEybm9oYWx0CisJcHVzaGZsCisJcG9wbAklZWF4CisJYnRsCSQ5LCVlYXgKKwlqbmMJTDAxMm5vaGFsdAorCS5ieXRlCTB4MGYsMHgzMQorCXB1c2hsCSVlZHgKKwlwdXNobAklZWF4CisJaGx0CisJLmJ5dGUJMHgwZiwweDMxCisJc3VibAkoJWVzcCksJWVheAorCXNiYmwJNCglZXNwKSwlZWR4CisJYWRkbAkkOCwlZXNwCisJcmV0CitMMDEybm9oYWx0OgorCXhvcmwJJWVheCwlZWF4CisJeG9ybAklZWR4LCVlZHgKKwlyZXQKKy5nbG9ibAlfT1BFTlNTTF9mYXJfc3BpbgorLnByaXZhdGVfZXh0ZXJuCV9PUEVOU1NMX2Zhcl9zcGluCisuYWxpZ24JNAorX09QRU5TU0xfZmFyX3NwaW46CitMX09QRU5TU0xfZmFyX3NwaW5fYmVnaW46CisJcHVzaGZsCisJcG9wbAklZWF4CisJYnRsCSQ5LCVlYXgKKwlqbmMJTDAxM25vc3BpbgorCW1vdmwJNCglZXNwKSwlZWF4CisJbW92bAk4KCVlc3ApLCVlY3gKKy5sb25nCTI0MzAxMTEyNjIKKwl4b3JsCSVlYXgsJWVheAorCW1vdmwJKCVlY3gpLCVlZHgKKwlqbXAJTDAxNHNwaW4KKy5hbGlnbgk0LDB4OTAKK0wwMTRzcGluOgorCWluY2wJJWVheAorCWNtcGwJKCVlY3gpLCVlZHgKKwlqZQlMMDE0c3BpbgorLmxvbmcJNTI5NTY3ODg4CisJcmV0CitMMDEzbm9zcGluOgorCXhvcmwJJWVheCwlZWF4CisJeG9ybAklZWR4LCVlZHgKKwlyZXQKKy5nbG9ibAlfT1BFTlNTTF93aXBlX2NwdQorLnByaXZhdGVfZXh0ZXJuCV9PUEVOU1NMX3dpcGVfY3B1CisuYWxpZ24JNAorX09QRU5TU0xfd2lwZV9jcHU6CitMX09QRU5TU0xfd2lwZV9jcHVfYmVnaW46CisJeG9ybAklZWF4LCVlYXgKKwl4b3JsCSVlZHgsJWVkeAorCWNhbGwJTDAxNVBJQ19tZV91cAorTDAxNVBJQ19tZV91cDoKKwlwb3BsCSVlY3gKKwltb3ZsCUxfT1BFTlNTTF9pYTMyY2FwX1Akbm9uX2xhenlfcHRyLUwwMTVQSUNfbWVfdXAoJWVjeCksJWVjeAorCW1vdmwJKCVlY3gpLCVlY3gKKwlidGwJJDEsKCVlY3gpCisJam5jCUwwMTZub194ODcKKwlhbmRsCSQ4Mzg4NjA4MCwlZWN4CisJY21wbAkkODM4ODYwODAsJWVjeAorCWpuZQlMMDE3bm9fc3NlMgorCXB4b3IJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJcHhvcgkleG1tMiwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTYKKwlweG9yCSV4bW03LCV4bW03CitMMDE3bm9fc3NlMjoKKy5sb25nCTQwMDcyNTk4NjUsNDAwNzI1OTg2NSw0MDA3MjU5ODY1LDQwMDcyNTk4NjUsMjQzMDg1MTk5NQorTDAxNm5vX3g4NzoKKwlsZWFsCTQoJWVzcCksJWVheAorCXJldAorLmdsb2JsCV9PUEVOU1NMX2F0b21pY19hZGQKKy5wcml2YXRlX2V4dGVybglfT1BFTlNTTF9hdG9taWNfYWRkCisuYWxpZ24JNAorX09QRU5TU0xfYXRvbWljX2FkZDoKK0xfT1BFTlNTTF9hdG9taWNfYWRkX2JlZ2luOgorCW1vdmwJNCglZXNwKSwlZWR4CisJbW92bAk4KCVlc3ApLCVlY3gKKwlwdXNobAklZWJ4CisJbm9wCisJbW92bAkoJWVkeCksJWVheAorTDAxOHNwaW46CisJbGVhbAkoJWVheCwlZWN4LDEpLCVlYngKKwlub3AKKy5sb25nCTQ0NzgxMTU2OAorCWpuZQlMMDE4c3BpbgorCW1vdmwJJWVieCwlZWF4CisJcG9wbAklZWJ4CisJcmV0CisuZ2xvYmwJX09QRU5TU0xfaW5kaXJlY3RfY2FsbAorLnByaXZhdGVfZXh0ZXJuCV9PUEVOU1NMX2luZGlyZWN0X2NhbGwKKy5hbGlnbgk0CitfT1BFTlNTTF9pbmRpcmVjdF9jYWxsOgorTF9PUEVOU1NMX2luZGlyZWN0X2NhbGxfYmVnaW46CisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwlZWJwCisJc3VibAkkMjgsJWVzcAorCW1vdmwJMTIoJWVicCksJWVjeAorCW1vdmwJJWVjeCwoJWVzcCkKKwltb3ZsCTE2KCVlYnApLCVlZHgKKwltb3ZsCSVlZHgsNCglZXNwKQorCW1vdmwJMjAoJWVicCksJWVheAorCW1vdmwJJWVheCw4KCVlc3ApCisJbW92bAkyNCglZWJwKSwlZWF4CisJbW92bAklZWF4LDEyKCVlc3ApCisJbW92bAkyOCglZWJwKSwlZWF4CisJbW92bAklZWF4LDE2KCVlc3ApCisJbW92bAkzMiglZWJwKSwlZWF4CisJbW92bAklZWF4LDIwKCVlc3ApCisJbW92bAkzNiglZWJwKSwlZWF4CisJbW92bAklZWF4LDI0KCVlc3ApCisJY2FsbAkqOCglZWJwKQorCW1vdmwJJWVicCwlZXNwCisJcG9wbAklZWJwCisJcmV0CisuZ2xvYmwJX09QRU5TU0xfaWEzMl9yZHJhbmQKKy5wcml2YXRlX2V4dGVybglfT1BFTlNTTF9pYTMyX3JkcmFuZAorLmFsaWduCTQKK19PUEVOU1NMX2lhMzJfcmRyYW5kOgorTF9PUEVOU1NMX2lhMzJfcmRyYW5kX2JlZ2luOgorCW1vdmwJJDgsJWVjeAorTDAxOWxvb3A6CisuYnl0ZQkxNSwxOTksMjQwCisJamMJTDAyMGJyZWFrCisJbG9vcAlMMDE5bG9vcAorTDAyMGJyZWFrOgorCWNtcGwJJDAsJWVheAorCWNtb3ZlbAklZWN4LCVlYXgKKwlyZXQKKy5zZWN0aW9uIF9fSU1QT1JULF9fcG9pbnRlcnMsbm9uX2xhenlfc3ltYm9sX3BvaW50ZXJzCitMX09QRU5TU0xfaWEzMmNhcF9QJG5vbl9sYXp5X3B0cjoKKy5pbmRpcmVjdF9zeW1ib2wJX09QRU5TU0xfaWEzMmNhcF9QCisubG9uZwkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL21hYy14ODZfNjQvY3J5cHRvL2JuL21vZGV4cDUxMi14ODZfNjQuUyBiL21hYy14ODZfNjQvY3J5cHRvL2JuL21vZGV4cDUxMi14ODZfNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWIxMzNlCi0tLSAvZGV2L251bGwKKysrIGIvbWFjLXg4Nl82NC9jcnlwdG8vYm4vbW9kZXhwNTEyLXg4Nl82NC5TCkBAIC0wLDAgKzEsMTc3NiBAQAorI2lmIGRlZmluZWQoX194ODZfNjRfXykKKy50ZXh0CQorCisKKy5wMmFsaWduCTQKK01VTEFERF8xMjh4NTEyOgorCW1vdnEJMCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyOAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXI4LDAoJXJjeCkKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI5CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyOQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTE2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMjQoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjExCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkzMiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMgorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTQwKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDgoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk1NiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxNQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjgKKwltb3ZxCTgoJXJkaSksJXJicAorCW1vdnEJMCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyOQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXI5LDgoJXJjeCkKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMTYoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjExCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkyNCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMgorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTMyKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDAoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk0OCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxNQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTU2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyOAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjkKKwkuYnl0ZQkweGYzLDB4YzMKKworCisucDJhbGlnbgk0Cittb250X3JlZHVjZToKKwlsZWFxCTE5MiglcnNwKSwlcmRpCisJbW92cQkzMiglcnNwKSwlcnNpCisJYWRkcQkkNTc2LCVyc2kKKwlsZWFxCTUyMCglcnNwKSwlcmN4CisKKwltb3ZxCTk2KCVyY3gpLCVyYnAKKwltb3ZxCTAoJXJzaSksJXJheAorCW11bHEJJXJicAorCW1vdnEJKCVyY3gpLCVyOAorCWFkZHEJJXJheCwlcjgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyOCwwKCVyZGkpCisJbW92cQklcmR4LCVyYngKKworCW1vdnEJOCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJbW92cQk4KCVyY3gpLCVyOQorCWFkZHEJJXJheCwlcjkKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXI5CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMTYoJXJzaSksJXJheAorCW11bHEJJXJicAorCW1vdnEJMTYoJXJjeCksJXIxMAorCWFkZHEJJXJheCwlcjEwCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkyNCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJbW92cQkyNCglcmN4KSwlcjExCisJYWRkcQklcmF4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTMyKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwltb3ZxCTMyKCVyY3gpLCVyMTIKKwlhZGRxCSVyYXgsJXIxMgorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEyCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDAoJXJzaSksJXJheAorCW11bHEJJXJicAorCW1vdnEJNDAoJXJjeCksJXIxMworCWFkZHEJJXJheCwlcjEzCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk0OCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJbW92cQk0OCglcmN4KSwlcjE0CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTU2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwltb3ZxCTU2KCVyY3gpLCVyMTUKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjE1CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyOAorCW1vdnEJMTA0KCVyY3gpLCVyYnAKKwltb3ZxCTAoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjkKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyOSw4KCVyZGkpCisJbW92cQklcmR4LCVyYngKKworCW1vdnEJOCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTE2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMjQoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEyCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkzMiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMworCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTQwKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDgoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk1NiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyOAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXI5CisJbW92cQkxMTIoJXJjeCksJXJicAorCW1vdnEJMCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTAsMTYoJXJkaSkKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMTYoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEyCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkyNCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMworCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTMyKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDAoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk0OCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyOAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk1NiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyOQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjkKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJMTIwKCVyY3gpLCVyYnAKKwltb3ZxCTAoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjExLDI0KCVyZGkpCisJbW92cQklcmR4LCVyYngKKworCW1vdnEJOCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMgorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTE2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMjQoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkzMiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxNQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTQwKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyOAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTQ4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI5CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyOQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTU2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTEKKwl4b3JxCSVyYXgsJXJheAorCisJYWRkcQk2NCglcmN4KSwlcjgKKwlhZGNxCTcyKCVyY3gpLCVyOQorCWFkY3EJODAoJXJjeCksJXIxMAorCWFkY3EJODgoJXJjeCksJXIxMQorCWFkY3EJJDAsJXJheAorCisKKworCisJbW92cQklcjgsNjQoJXJkaSkKKwltb3ZxCSVyOSw3MiglcmRpKQorCW1vdnEJJXIxMCwlcmJwCisJbW92cQklcjExLDg4KCVyZGkpCisKKwltb3ZxCSVyYXgsMzg0KCVyc3ApCisKKwltb3ZxCTAoJXJkaSksJXI4CisJbW92cQk4KCVyZGkpLCVyOQorCW1vdnEJMTYoJXJkaSksJXIxMAorCW1vdnEJMjQoJXJkaSksJXIxMQorCisKKworCisKKworCisKKwlhZGRxCSQ4MCwlcmRpCisKKwlhZGRxCSQ2NCwlcnNpCisJbGVhcQkyOTYoJXJzcCksJXJjeAorCisJY2FsbAlNVUxBRERfMTI4eDUxMgorCisJbW92cQkzODQoJXJzcCksJXJheAorCisKKwlhZGRxCS0xNiglcmRpKSwlcjgKKwlhZGNxCS04KCVyZGkpLCVyOQorCW1vdnEJJXI4LDY0KCVyY3gpCisJbW92cQklcjksNzIoJXJjeCkKKworCWFkY3EJJXJheCwlcmF4CisJbW92cQklcmF4LDM4NCglcnNwKQorCisJbGVhcQkxOTIoJXJzcCksJXJkaQorCWFkZHEJJDY0LCVyc2kKKworCisKKworCisJbW92cQkoJXJzaSksJXI4CisJbW92cQk4KCVyc2kpLCVyYngKKworCW1vdnEJKCVyY3gpLCVyYXgKKwltdWxxCSVyOAorCW1vdnEJJXJheCwlcmJwCisJbW92cQklcmR4LCVyOQorCisJbW92cQk4KCVyY3gpLCVyYXgKKwltdWxxCSVyOAorCWFkZHEJJXJheCwlcjkKKworCW1vdnEJKCVyY3gpLCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXI5CisKKwltb3ZxCSVyOSw4KCVyZGkpCisKKworCXN1YnEJJDE5MiwlcnNpCisKKwltb3ZxCSglcmN4KSwlcjgKKwltb3ZxCTgoJXJjeCksJXI5CisKKwljYWxsCU1VTEFERF8xMjh4NTEyCisKKworCisKKwltb3ZxCTAoJXJzaSksJXJheAorCW1vdnEJOCglcnNpKSwlcmJ4CisJbW92cQkxNiglcnNpKSwlcmRpCisJbW92cQkyNCglcnNpKSwlcmR4CisKKworCW1vdnEJMzg0KCVyc3ApLCVyYnAKKworCWFkZHEJNjQoJXJjeCksJXI4CisJYWRjcQk3MiglcmN4KSwlcjkKKworCisJYWRjcQklcmJwLCVyYnAKKworCisKKwlzaGxxCSQzLCVyYnAKKwltb3ZxCTMyKCVyc3ApLCVyY3gKKwlhZGRxCSVyY3gsJXJicAorCisKKwl4b3JxCSVyc2ksJXJzaQorCisJYWRkcQkwKCVyYnApLCVyMTAKKwlhZGNxCTY0KCVyYnApLCVyMTEKKwlhZGNxCTEyOCglcmJwKSwlcjEyCisJYWRjcQkxOTIoJXJicCksJXIxMworCWFkY3EJMjU2KCVyYnApLCVyMTQKKwlhZGNxCTMyMCglcmJwKSwlcjE1CisJYWRjcQkzODQoJXJicCksJXI4CisJYWRjcQk0NDgoJXJicCksJXI5CisKKworCisJc2JicQkkMCwlcnNpCisKKworCWFuZHEJJXJzaSwlcmF4CisJYW5kcQklcnNpLCVyYngKKwlhbmRxCSVyc2ksJXJkaQorCWFuZHEJJXJzaSwlcmR4CisKKwltb3ZxCSQxLCVyYnAKKwlzdWJxCSVyYXgsJXIxMAorCXNiYnEJJXJieCwlcjExCisJc2JicQklcmRpLCVyMTIKKwlzYmJxCSVyZHgsJXIxMworCisKKworCisJc2JicQkkMCwlcmJwCisKKworCisJYWRkcQkkNTEyLCVyY3gKKwltb3ZxCTMyKCVyY3gpLCVyYXgKKwltb3ZxCTQwKCVyY3gpLCVyYngKKwltb3ZxCTQ4KCVyY3gpLCVyZGkKKwltb3ZxCTU2KCVyY3gpLCVyZHgKKworCisKKwlhbmRxCSVyc2ksJXJheAorCWFuZHEJJXJzaSwlcmJ4CisJYW5kcQklcnNpLCVyZGkKKwlhbmRxCSVyc2ksJXJkeAorCisKKworCXN1YnEJJDEsJXJicAorCisJc2JicQklcmF4LCVyMTQKKwlzYmJxCSVyYngsJXIxNQorCXNiYnEJJXJkaSwlcjgKKwlzYmJxCSVyZHgsJXI5CisKKworCisJbW92cQkxNDQoJXJzcCksJXJzaQorCW1vdnEJJXIxMCwwKCVyc2kpCisJbW92cQklcjExLDgoJXJzaSkKKwltb3ZxCSVyMTIsMTYoJXJzaSkKKwltb3ZxCSVyMTMsMjQoJXJzaSkKKwltb3ZxCSVyMTQsMzIoJXJzaSkKKwltb3ZxCSVyMTUsNDAoJXJzaSkKKwltb3ZxCSVyOCw0OCglcnNpKQorCW1vdnEJJXI5LDU2KCVyc2kpCisKKwkuYnl0ZQkweGYzLDB4YzMKKworCisucDJhbGlnbgk0Cittb250X211bF9hM2I6CisKKworCisKKwltb3ZxCTAoJXJkaSksJXJicAorCisJbW92cQklcjEwLCVyYXgKKwltdWxxCSVyYnAKKwltb3ZxCSVyYXgsNTIwKCVyc3ApCisJbW92cQklcmR4LCVyMTAKKwltb3ZxCSVyMTEsJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTEKKwltb3ZxCSVyMTIsJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTIKKwltb3ZxCSVyMTMsJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEyCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTMKKwltb3ZxCSVyMTQsJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTQKKwltb3ZxCSVyMTUsJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTUKKwltb3ZxCSVyOCwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXI4CisJbW92cQklcjksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXI5CisJbW92cQk4KCVyZGkpLCVyYnAKKwltb3ZxCTAoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEwLDUyOCglcnNwKQorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTgoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjExCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkxNiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMgorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTI0KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMzIoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk0MCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxNQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTQ4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyOAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTU2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI5CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyOQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQkxNiglcmRpKSwlcmJwCisJbW92cQkwKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxMSw1MzYoJXJzcCkKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMgorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEyCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMTYoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkyNCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTMyKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjE1CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDAoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXI4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDgoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjkKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXI5CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNTYoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEwCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMQorCW1vdnEJMjQoJXJkaSksJXJicAorCW1vdnEJMCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTIsNTQ0KCVyc3ApCisJbW92cQklcmR4LCVyYngKKworCW1vdnEJOCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMworCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTE2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMjQoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkzMiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyOAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk0MCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyOQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjkKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk0OCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTU2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTIKKwltb3ZxCTMyKCVyZGkpLCVyYnAKKwltb3ZxCTAoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLDU1MiglcnNwKQorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTgoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkxNiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxNQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTI0KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyOAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTMyKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI5CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyOQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTQwKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDgoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjExCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk1NiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMgorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEzCisJbW92cQk0MCglcmRpKSwlcmJwCisJbW92cQkwKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxNCw1NjAoJXJzcCkKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjE1CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMTYoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXI4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMjQoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjkKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXI5CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMzIoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEwCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk0MCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTQ4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMgorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEyCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNTYoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJNDgoJXJkaSksJXJicAorCW1vdnEJMCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTUsNTY4KCVyc3ApCisJbW92cQklcmR4LCVyYngKKworCW1vdnEJOCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyOAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkxNiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyOQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjkKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkyNCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTMyKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDAoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEyCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk0OCglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMworCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTU2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTUKKwltb3ZxCTU2KCVyZGkpLCVyYnAKKwltb3ZxCTAoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyOCw1NzYoJXJzcCkKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk4KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXI5CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyOQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTE2KCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJMjQoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjExCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQkzMiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxMgorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJ4CisKKwltb3ZxCTQwKCVyc2kpLCVyYXgKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJieCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYngKKworCW1vdnEJNDgoJXJzaSksJXJheAorCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmJ4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk1NiglcnNpKSwlcmF4CisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYngsJXIxNQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjgKKwltb3ZxCSVyOSw1ODQoJXJzcCkKKwltb3ZxCSVyMTAsNTkyKCVyc3ApCisJbW92cQklcjExLDYwMCglcnNwKQorCW1vdnEJJXIxMiw2MDgoJXJzcCkKKwltb3ZxCSVyMTMsNjE2KCVyc3ApCisJbW92cQklcjE0LDYyNCglcnNwKQorCW1vdnEJJXIxNSw2MzIoJXJzcCkKKwltb3ZxCSVyOCw2NDAoJXJzcCkKKworCisKKworCisJam1wCW1vbnRfcmVkdWNlCisKKworCisKKy5wMmFsaWduCTQKK3Nxcl9yZWR1Y2U6CisJbW92cQkxNiglcnNwKSwlcmN4CisKKworCisJbW92cQklcjEwLCVyYngKKworCW1vdnEJJXIxMSwlcmF4CisJbXVscQklcmJ4CisJbW92cQklcmF4LDUyOCglcnNwKQorCW1vdnEJJXJkeCwlcjEwCisJbW92cQklcjEyLCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjExCisJbW92cQklcjEzLCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEyCisJbW92cQklcjE0LCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMgorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEzCisJbW92cQklcjE1LCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMworCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjE0CisJbW92cQklcjgsJXJheAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTUKKwltb3ZxCSVyOSwlcmF4CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJzaQorCisJbW92cQklcjEwLDUzNiglcnNwKQorCisKKworCisKKwltb3ZxCTgoJXJjeCksJXJieAorCisJbW92cQkxNiglcmN4KSwlcmF4CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTEsNTQ0KCVyc3ApCisKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJMjQoJXJjeCksJXJheAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjEyCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyMTIKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTIsNTUyKCVyc3ApCisKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJMzIoJXJjeCksJXJheAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjEzCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyMTMKKwlhZGNxCSQwLCVyZHgKKworCW1vdnEJJXJkeCwlcjEwCisJbW92cQk0MCglcmN4KSwlcmF4CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxNAorCWFkY3EJJDAsJXJkeAorCisJbW92cQklcmR4LCVyMTAKKwltb3ZxCSVyOCwlcmF4CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJDAsJXJkeAorCisJbW92cQklcmR4LCVyMTAKKwltb3ZxCSVyOSwlcmF4CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyc2kKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXJzaQorCWFkY3EJJDAsJXJkeAorCisJbW92cQklcmR4LCVyMTEKKworCisKKworCW1vdnEJMTYoJXJjeCksJXJieAorCisJbW92cQkyNCglcmN4KSwlcmF4CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTMsNTYwKCVyc3ApCisKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJMzIoJXJjeCksJXJheAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTQsNTY4KCVyc3ApCisKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJNDAoJXJjeCksJXJheAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSQwLCVyZHgKKworCW1vdnEJJXJkeCwlcjEwCisJbW92cQklcjgsJXJheAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcnNpCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyc2kKKwlhZGNxCSQwLCVyZHgKKworCW1vdnEJJXJkeCwlcjEwCisJbW92cQklcjksJXJheAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjExCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyMTEKKwlhZGNxCSQwLCVyZHgKKworCW1vdnEJJXJkeCwlcjEyCisKKworCisKKworCW1vdnEJMjQoJXJjeCksJXJieAorCisJbW92cQkzMiglcmN4KSwlcmF4CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTUsNTc2KCVyc3ApCisKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJNDAoJXJjeCksJXJheAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcnNpCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyc2kKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyc2ksNTg0KCVyc3ApCisKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJJXI4LCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjExCisJYWRjcQkkMCwlcmR4CisKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJJXI5LCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMgorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEyCisJYWRjcQkkMCwlcmR4CisKKwltb3ZxCSVyZHgsJXIxNQorCisKKworCisJbW92cQkzMiglcmN4KSwlcmJ4CisKKwltb3ZxCTQwKCVyY3gpLCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxMSw1OTIoJXJzcCkKKworCW1vdnEJJXJkeCwlcjEwCisJbW92cQklcjgsJXJheAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjEyCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyMTIKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTIsNjAwKCVyc3ApCisKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJJXI5LCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQkkMCwlcmR4CisKKwltb3ZxCSVyZHgsJXIxMQorCisKKworCisJbW92cQk0MCglcmN4KSwlcmJ4CisKKwltb3ZxCSVyOCwlcmF4CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTUsNjA4KCVyc3ApCisKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJJXI5LCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjExLDYxNiglcnNwKQorCisJbW92cQklcmR4LCVyMTIKKworCisKKworCW1vdnEJJXI4LCVyYngKKworCW1vdnEJJXI5LCVyYXgKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMgorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxMiw2MjQoJXJzcCkKKworCW1vdnEJJXJkeCw2MzIoJXJzcCkKKworCisJbW92cQk1MjgoJXJzcCksJXIxMAorCW1vdnEJNTM2KCVyc3ApLCVyMTEKKwltb3ZxCTU0NCglcnNwKSwlcjEyCisJbW92cQk1NTIoJXJzcCksJXIxMworCW1vdnEJNTYwKCVyc3ApLCVyMTQKKwltb3ZxCTU2OCglcnNwKSwlcjE1CisKKwltb3ZxCTI0KCVyY3gpLCVyYXgKKwltdWxxCSVyYXgKKwltb3ZxCSVyYXgsJXJkaQorCW1vdnEJJXJkeCwlcjgKKworCWFkZHEJJXIxMCwlcjEwCisJYWRjcQklcjExLCVyMTEKKwlhZGNxCSVyMTIsJXIxMgorCWFkY3EJJXIxMywlcjEzCisJYWRjcQklcjE0LCVyMTQKKwlhZGNxCSVyMTUsJXIxNQorCWFkY3EJJDAsJXI4CisKKwltb3ZxCTAoJXJjeCksJXJheAorCW11bHEJJXJheAorCW1vdnEJJXJheCw1MjAoJXJzcCkKKwltb3ZxCSVyZHgsJXJieAorCisJbW92cQk4KCVyY3gpLCVyYXgKKwltdWxxCSVyYXgKKworCWFkZHEJJXJieCwlcjEwCisJYWRjcQklcmF4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKworCW1vdnEJJXJkeCwlcmJ4CisJbW92cQklcjEwLDUyOCglcnNwKQorCW1vdnEJJXIxMSw1MzYoJXJzcCkKKworCW1vdnEJMTYoJXJjeCksJXJheAorCW11bHEJJXJheAorCisJYWRkcQklcmJ4LCVyMTIKKwlhZGNxCSVyYXgsJXIxMworCWFkY3EJJDAsJXJkeAorCisJbW92cQklcmR4LCVyYngKKworCW1vdnEJJXIxMiw1NDQoJXJzcCkKKwltb3ZxCSVyMTMsNTUyKCVyc3ApCisKKwl4b3JxCSVyYnAsJXJicAorCWFkZHEJJXJieCwlcjE0CisJYWRjcQklcmRpLCVyMTUKKwlhZGNxCSQwLCVyYnAKKworCW1vdnEJJXIxNCw1NjAoJXJzcCkKKwltb3ZxCSVyMTUsNTY4KCVyc3ApCisKKworCisKKwltb3ZxCTU3NiglcnNwKSwlcjEwCisJbW92cQk1ODQoJXJzcCksJXIxMQorCW1vdnEJNTkyKCVyc3ApLCVyMTIKKwltb3ZxCTYwMCglcnNwKSwlcjEzCisJbW92cQk2MDgoJXJzcCksJXIxNAorCW1vdnEJNjE2KCVyc3ApLCVyMTUKKwltb3ZxCTYyNCglcnNwKSwlcmRpCisJbW92cQk2MzIoJXJzcCksJXJzaQorCisJbW92cQklcjksJXJheAorCW11bHEJJXJheAorCW1vdnEJJXJheCwlcjkKKwltb3ZxCSVyZHgsJXJieAorCisJYWRkcQklcjEwLCVyMTAKKwlhZGNxCSVyMTEsJXIxMQorCWFkY3EJJXIxMiwlcjEyCisJYWRjcQklcjEzLCVyMTMKKwlhZGNxCSVyMTQsJXIxNAorCWFkY3EJJXIxNSwlcjE1CisJYWRjcQklcmRpLCVyZGkKKwlhZGNxCSVyc2ksJXJzaQorCWFkY3EJJDAsJXJieAorCisJYWRkcQklcmJwLCVyMTAKKworCW1vdnEJMzIoJXJjeCksJXJheAorCW11bHEJJXJheAorCisJYWRkcQklcjgsJXIxMAorCWFkY3EJJXJheCwlcjExCisJYWRjcQkkMCwlcmR4CisKKwltb3ZxCSVyZHgsJXJicAorCisJbW92cQklcjEwLDU3NiglcnNwKQorCW1vdnEJJXIxMSw1ODQoJXJzcCkKKworCW1vdnEJNDAoJXJjeCksJXJheAorCW11bHEJJXJheAorCisJYWRkcQklcmJwLCVyMTIKKwlhZGNxCSVyYXgsJXIxMworCWFkY3EJJDAsJXJkeAorCisJbW92cQklcmR4LCVyYnAKKworCW1vdnEJJXIxMiw1OTIoJXJzcCkKKwltb3ZxCSVyMTMsNjAwKCVyc3ApCisKKwltb3ZxCTQ4KCVyY3gpLCVyYXgKKwltdWxxCSVyYXgKKworCWFkZHEJJXJicCwlcjE0CisJYWRjcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKworCW1vdnEJJXIxNCw2MDgoJXJzcCkKKwltb3ZxCSVyMTUsNjE2KCVyc3ApCisKKwlhZGRxCSVyZHgsJXJkaQorCWFkY3EJJXI5LCVyc2kKKwlhZGNxCSQwLCVyYngKKworCW1vdnEJJXJkaSw2MjQoJXJzcCkKKwltb3ZxCSVyc2ksNjMyKCVyc3ApCisJbW92cQklcmJ4LDY0MCglcnNwKQorCisJam1wCW1vbnRfcmVkdWNlCisKKworCisuZ2xvYmwJX21vZF9leHBfNTEyCisucHJpdmF0ZV9leHRlcm4gX21vZF9leHBfNTEyCisKK19tb2RfZXhwXzUxMjoKKwlwdXNocQklcmJwCisJcHVzaHEJJXJieAorCXB1c2hxCSVyMTIKKwlwdXNocQklcjEzCisJcHVzaHEJJXIxNAorCXB1c2hxCSVyMTUKKworCisJbW92cQklcnNwLCVyOAorCXN1YnEJJDI2ODgsJXJzcAorCWFuZHEJJC02NCwlcnNwCisKKworCW1vdnEJJXI4LDAoJXJzcCkKKwltb3ZxCSVyZGksOCglcnNwKQorCW1vdnEJJXJzaSwxNiglcnNwKQorCW1vdnEJJXJjeCwyNCglcnNwKQorTCRib2R5OgorCisKKworCXB4b3IJJXhtbTQsJXhtbTQKKwltb3ZkcXUJMCglcnNpKSwleG1tMAorCW1vdmRxdQkxNiglcnNpKSwleG1tMQorCW1vdmRxdQkzMiglcnNpKSwleG1tMgorCW1vdmRxdQk0OCglcnNpKSwleG1tMworCW1vdmRxYQkleG1tNCw1MTIoJXJzcCkKKwltb3ZkcWEJJXhtbTQsNTI4KCVyc3ApCisJbW92ZHFhCSV4bW00LDYwOCglcnNwKQorCW1vdmRxYQkleG1tNCw2MjQoJXJzcCkKKwltb3ZkcWEJJXhtbTAsNTQ0KCVyc3ApCisJbW92ZHFhCSV4bW0xLDU2MCglcnNwKQorCW1vdmRxYQkleG1tMiw1NzYoJXJzcCkKKwltb3ZkcWEJJXhtbTMsNTkyKCVyc3ApCisKKworCW1vdmRxdQkwKCVyZHgpLCV4bW0wCisJbW92ZHF1CTE2KCVyZHgpLCV4bW0xCisJbW92ZHF1CTMyKCVyZHgpLCV4bW0yCisJbW92ZHF1CTQ4KCVyZHgpLCV4bW0zCisKKwlsZWFxCTM4NCglcnNwKSwlcmJ4CisJbW92cQklcmJ4LDEzNiglcnNwKQorCWNhbGwJbW9udF9yZWR1Y2UKKworCisJbGVhcQk0NDgoJXJzcCksJXJjeAorCXhvcnEJJXJheCwlcmF4CisJbW92cQklcmF4LDAoJXJjeCkKKwltb3ZxCSVyYXgsOCglcmN4KQorCW1vdnEJJXJheCwyNCglcmN4KQorCW1vdnEJJXJheCwzMiglcmN4KQorCW1vdnEJJXJheCw0MCglcmN4KQorCW1vdnEJJXJheCw0OCglcmN4KQorCW1vdnEJJXJheCw1NiglcmN4KQorCW1vdnEJJXJheCwxMjgoJXJzcCkKKwltb3ZxCSQxLDE2KCVyY3gpCisKKwlsZWFxCTY0MCglcnNwKSwlcmJwCisJbW92cQklcmN4LCVyc2kKKwltb3ZxCSVyYnAsJXJkaQorCW1vdnEJJDgsJXJheAorbG9vcF8wOgorCW1vdnEJKCVyY3gpLCVyYngKKwltb3Z3CSVieCwoJXJkaSkKKwlzaHJxCSQxNiwlcmJ4CisJbW92dwklYngsNjQoJXJkaSkKKwlzaHJxCSQxNiwlcmJ4CisJbW92dwklYngsMTI4KCVyZGkpCisJc2hycQkkMTYsJXJieAorCW1vdncJJWJ4LDE5MiglcmRpKQorCWxlYXEJOCglcmN4KSwlcmN4CisJbGVhcQkyNTYoJXJkaSksJXJkaQorCWRlY3EJJXJheAorCWpueglsb29wXzAKKwltb3ZxCSQzMSwlcmF4CisJbW92cQklcmF4LDMyKCVyc3ApCisJbW92cQklcmJwLDQwKCVyc3ApCisKKwltb3ZxCSVyc2ksMTM2KCVyc3ApCisJbW92cQkwKCVyc2kpLCVyMTAKKwltb3ZxCTgoJXJzaSksJXIxMQorCW1vdnEJMTYoJXJzaSksJXIxMgorCW1vdnEJMjQoJXJzaSksJXIxMworCW1vdnEJMzIoJXJzaSksJXIxNAorCW1vdnEJNDAoJXJzaSksJXIxNQorCW1vdnEJNDgoJXJzaSksJXI4CisJbW92cQk1NiglcnNpKSwlcjkKK2luaXRfbG9vcDoKKwlsZWFxCTM4NCglcnNwKSwlcmRpCisJY2FsbAltb250X211bF9hM2IKKwlsZWFxCTQ0OCglcnNwKSwlcnNpCisJbW92cQk0MCglcnNwKSwlcmJwCisJYWRkcQkkMiwlcmJwCisJbW92cQklcmJwLDQwKCVyc3ApCisJbW92cQklcnNpLCVyY3gKKwltb3ZxCSQ4LCVyYXgKK2xvb3BfMToKKwltb3ZxCSglcmN4KSwlcmJ4CisJbW92dwklYngsKCVyYnApCisJc2hycQkkMTYsJXJieAorCW1vdncJJWJ4LDY0KCVyYnApCisJc2hycQkkMTYsJXJieAorCW1vdncJJWJ4LDEyOCglcmJwKQorCXNocnEJJDE2LCVyYngKKwltb3Z3CSVieCwxOTIoJXJicCkKKwlsZWFxCTgoJXJjeCksJXJjeAorCWxlYXEJMjU2KCVyYnApLCVyYnAKKwlkZWNxCSVyYXgKKwlqbnoJbG9vcF8xCisJbW92cQkzMiglcnNwKSwlcmF4CisJc3VicQkkMSwlcmF4CisJbW92cQklcmF4LDMyKCVyc3ApCisJam5lCWluaXRfbG9vcAorCisKKworCW1vdmRxYQkleG1tMCw2NCglcnNwKQorCW1vdmRxYQkleG1tMSw4MCglcnNwKQorCW1vdmRxYQkleG1tMiw5NiglcnNwKQorCW1vdmRxYQkleG1tMywxMTIoJXJzcCkKKworCisKKworCisJbW92bAkxMjYoJXJzcCksJWVheAorCW1vdnEJJXJheCwlcmR4CisJc2hycQkkMTEsJXJheAorCWFuZGwJJDIwNDcsJWVkeAorCW1vdmwJJWVkeCwxMjYoJXJzcCkKKwlsZWFxCTY0MCglcnNwLCVyYXgsMiksJXJzaQorCW1vdnEJOCglcnNwKSwlcmR4CisJbW92cQkkNCwlcmJwCitsb29wXzI6CisJbW92endxCTE5MiglcnNpKSwlcmJ4CisJbW92endxCTQ0OCglcnNpKSwlcmF4CisJc2hscQkkMTYsJXJieAorCXNobHEJJDE2LCVyYXgKKwltb3Z3CTEyOCglcnNpKSwlYngKKwltb3Z3CTM4NCglcnNpKSwlYXgKKwlzaGxxCSQxNiwlcmJ4CisJc2hscQkkMTYsJXJheAorCW1vdncJNjQoJXJzaSksJWJ4CisJbW92dwkzMjAoJXJzaSksJWF4CisJc2hscQkkMTYsJXJieAorCXNobHEJJDE2LCVyYXgKKwltb3Z3CTAoJXJzaSksJWJ4CisJbW92dwkyNTYoJXJzaSksJWF4CisJbW92cQklcmJ4LDAoJXJkeCkKKwltb3ZxCSVyYXgsOCglcmR4KQorCWxlYXEJNTEyKCVyc2kpLCVyc2kKKwlsZWFxCTE2KCVyZHgpLCVyZHgKKwlzdWJxCSQxLCVyYnAKKwlqbnoJbG9vcF8yCisJbW92cQkkNTA1LDQ4KCVyc3ApCisKKwltb3ZxCTgoJXJzcCksJXJjeAorCW1vdnEJJXJjeCwxMzYoJXJzcCkKKwltb3ZxCTAoJXJjeCksJXIxMAorCW1vdnEJOCglcmN4KSwlcjExCisJbW92cQkxNiglcmN4KSwlcjEyCisJbW92cQkyNCglcmN4KSwlcjEzCisJbW92cQkzMiglcmN4KSwlcjE0CisJbW92cQk0MCglcmN4KSwlcjE1CisJbW92cQk0OCglcmN4KSwlcjgKKwltb3ZxCTU2KCVyY3gpLCVyOQorCWptcAlzcXJfMgorCittYWluX2xvb3BfYTNiOgorCWNhbGwJc3FyX3JlZHVjZQorCWNhbGwJc3FyX3JlZHVjZQorCWNhbGwJc3FyX3JlZHVjZQorc3FyXzI6CisJY2FsbAlzcXJfcmVkdWNlCisJY2FsbAlzcXJfcmVkdWNlCisKKworCisJbW92cQk0OCglcnNwKSwlcmN4CisJbW92cQklcmN4LCVyYXgKKwlzaHJxCSQ0LCVyYXgKKwltb3ZsCTY0KCVyc3AsJXJheCwyKSwlZWR4CisJYW5kcQkkMTUsJXJjeAorCXNocnEJJWNsLCVyZHgKKwlhbmRxCSQzMSwlcmR4CisKKwlsZWFxCTY0MCglcnNwLCVyZHgsMiksJXJzaQorCWxlYXEJNDQ4KCVyc3ApLCVyZHgKKwltb3ZxCSVyZHgsJXJkaQorCW1vdnEJJDQsJXJicAorbG9vcF8zOgorCW1vdnp3cQkxOTIoJXJzaSksJXJieAorCW1vdnp3cQk0NDgoJXJzaSksJXJheAorCXNobHEJJDE2LCVyYngKKwlzaGxxCSQxNiwlcmF4CisJbW92dwkxMjgoJXJzaSksJWJ4CisJbW92dwkzODQoJXJzaSksJWF4CisJc2hscQkkMTYsJXJieAorCXNobHEJJDE2LCVyYXgKKwltb3Z3CTY0KCVyc2kpLCVieAorCW1vdncJMzIwKCVyc2kpLCVheAorCXNobHEJJDE2LCVyYngKKwlzaGxxCSQxNiwlcmF4CisJbW92dwkwKCVyc2kpLCVieAorCW1vdncJMjU2KCVyc2kpLCVheAorCW1vdnEJJXJieCwwKCVyZHgpCisJbW92cQklcmF4LDgoJXJkeCkKKwlsZWFxCTUxMiglcnNpKSwlcnNpCisJbGVhcQkxNiglcmR4KSwlcmR4CisJc3VicQkkMSwlcmJwCisJam56CWxvb3BfMworCW1vdnEJOCglcnNwKSwlcnNpCisJY2FsbAltb250X211bF9hM2IKKworCisKKwltb3ZxCTQ4KCVyc3ApLCVyY3gKKwlzdWJxCSQ1LCVyY3gKKwltb3ZxCSVyY3gsNDgoJXJzcCkKKwlqZ2UJbWFpbl9sb29wX2EzYgorCisKKworZW5kX21haW5fbG9vcF9hM2I6CisKKworCW1vdnEJOCglcnNwKSwlcmR4CisJcHhvcgkleG1tNCwleG1tNAorCW1vdmRxdQkwKCVyZHgpLCV4bW0wCisJbW92ZHF1CTE2KCVyZHgpLCV4bW0xCisJbW92ZHF1CTMyKCVyZHgpLCV4bW0yCisJbW92ZHF1CTQ4KCVyZHgpLCV4bW0zCisJbW92ZHFhCSV4bW00LDU3NiglcnNwKQorCW1vdmRxYQkleG1tNCw1OTIoJXJzcCkKKwltb3ZkcWEJJXhtbTQsNjA4KCVyc3ApCisJbW92ZHFhCSV4bW00LDYyNCglcnNwKQorCW1vdmRxYQkleG1tMCw1MTIoJXJzcCkKKwltb3ZkcWEJJXhtbTEsNTI4KCVyc3ApCisJbW92ZHFhCSV4bW0yLDU0NCglcnNwKQorCW1vdmRxYQkleG1tMyw1NjAoJXJzcCkKKwljYWxsCW1vbnRfcmVkdWNlCisKKworCisJbW92cQk4KCVyc3ApLCVyYXgKKwltb3ZxCTAoJXJheCksJXI4CisJbW92cQk4KCVyYXgpLCVyOQorCW1vdnEJMTYoJXJheCksJXIxMAorCW1vdnEJMjQoJXJheCksJXIxMQorCW1vdnEJMzIoJXJheCksJXIxMgorCW1vdnEJNDAoJXJheCksJXIxMworCW1vdnEJNDgoJXJheCksJXIxNAorCW1vdnEJNTYoJXJheCksJXIxNQorCisKKwltb3ZxCTI0KCVyc3ApLCVyYngKKwlhZGRxCSQ1MTIsJXJieAorCisJc3VicQkwKCVyYngpLCVyOAorCXNiYnEJOCglcmJ4KSwlcjkKKwlzYmJxCTE2KCVyYngpLCVyMTAKKwlzYmJxCTI0KCVyYngpLCVyMTEKKwlzYmJxCTMyKCVyYngpLCVyMTIKKwlzYmJxCTQwKCVyYngpLCVyMTMKKwlzYmJxCTQ4KCVyYngpLCVyMTQKKwlzYmJxCTU2KCVyYngpLCVyMTUKKworCisJbW92cQkwKCVyYXgpLCVyc2kKKwltb3ZxCTgoJXJheCksJXJkaQorCW1vdnEJMTYoJXJheCksJXJjeAorCW1vdnEJMjQoJXJheCksJXJkeAorCWNtb3ZuY3EJJXI4LCVyc2kKKwljbW92bmNxCSVyOSwlcmRpCisJY21vdm5jcQklcjEwLCVyY3gKKwljbW92bmNxCSVyMTEsJXJkeAorCW1vdnEJJXJzaSwwKCVyYXgpCisJbW92cQklcmRpLDgoJXJheCkKKwltb3ZxCSVyY3gsMTYoJXJheCkKKwltb3ZxCSVyZHgsMjQoJXJheCkKKworCW1vdnEJMzIoJXJheCksJXJzaQorCW1vdnEJNDAoJXJheCksJXJkaQorCW1vdnEJNDgoJXJheCksJXJjeAorCW1vdnEJNTYoJXJheCksJXJkeAorCWNtb3ZuY3EJJXIxMiwlcnNpCisJY21vdm5jcQklcjEzLCVyZGkKKwljbW92bmNxCSVyMTQsJXJjeAorCWNtb3ZuY3EJJXIxNSwlcmR4CisJbW92cQklcnNpLDMyKCVyYXgpCisJbW92cQklcmRpLDQwKCVyYXgpCisJbW92cQklcmN4LDQ4KCVyYXgpCisJbW92cQklcmR4LDU2KCVyYXgpCisKKwltb3ZxCTAoJXJzcCksJXJzaQorCW1vdnEJMCglcnNpKSwlcjE1CisJbW92cQk4KCVyc2kpLCVyMTQKKwltb3ZxCTE2KCVyc2kpLCVyMTMKKwltb3ZxCTI0KCVyc2kpLCVyMTIKKwltb3ZxCTMyKCVyc2kpLCVyYngKKwltb3ZxCTQwKCVyc2kpLCVyYnAKKwlsZWFxCTQ4KCVyc2kpLCVyc3AKK0wkZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWFjLXg4Nl82NC9jcnlwdG8vY3B1LXg4Nl82NC1hc20uUyBiL21hYy14ODZfNjQvY3J5cHRvL2NwdS14ODZfNjQtYXNtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkZTA0ZAotLS0gL2Rldi9udWxsCisrKyBiL21hYy14ODZfNjQvY3J5cHRvL2NwdS14ODZfNjQtYXNtLlMKQEAgLTAsMCArMSwxNDMgQEAKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pCisudGV4dAkKKworLmdsb2JsCV9PUEVOU1NMX2lhMzJfY3B1aWQKKy5wcml2YXRlX2V4dGVybiBfT1BFTlNTTF9pYTMyX2NwdWlkCisKKy5wMmFsaWduCTQKK19PUEVOU1NMX2lhMzJfY3B1aWQ6CisKKworCW1vdnEJJXJkaSwlcmRpCisJbW92cQklcmJ4LCVyOAorCisJeG9ybAklZWF4LCVlYXgKKwltb3ZsCSVlYXgsOCglcmRpKQorCWNwdWlkCisJbW92bAklZWF4LCVyMTFkCisKKwl4b3JsCSVlYXgsJWVheAorCWNtcGwJJDE5NzAxNjkxNTksJWVieAorCXNldG5lCSVhbAorCW1vdmwJJWVheCwlcjlkCisJY21wbAkkMTIzMTM4NDE2OSwlZWR4CisJc2V0bmUJJWFsCisJb3JsCSVlYXgsJXI5ZAorCWNtcGwJJDE4MTg1ODgyNzAsJWVjeAorCXNldG5lCSVhbAorCW9ybAklZWF4LCVyOWQKKwlqeglMJGludGVsCisKKwljbXBsCSQxNzUyNDYyNjU3LCVlYngKKwlzZXRuZQklYWwKKwltb3ZsCSVlYXgsJXIxMGQKKwljbXBsCSQxNzY5MjM4MTE3LCVlZHgKKwlzZXRuZQklYWwKKwlvcmwJJWVheCwlcjEwZAorCWNtcGwJJDExNDU5MTM2OTksJWVjeAorCXNldG5lCSVhbAorCW9ybAklZWF4LCVyMTBkCisJam56CUwkaW50ZWwKKworCisKKworCW1vdmwJJDIxNDc0ODM2NDgsJWVheAorCWNwdWlkCisKKworCWNtcGwJJDIxNDc0ODM2NDksJWVheAorCWpiCUwkaW50ZWwKKwltb3ZsCSVlYXgsJXIxMGQKKwltb3ZsCSQyMTQ3NDgzNjQ5LCVlYXgKKwljcHVpZAorCisKKwlvcmwJJWVjeCwlcjlkCisJYW5kbAkkMjA0OSwlcjlkCisKKwljbXBsCSQyMTQ3NDgzNjU2LCVyMTBkCisJamIJTCRpbnRlbAorCisJbW92bAkkMjE0NzQ4MzY1NiwlZWF4CisJY3B1aWQKKworCW1vdnpicQklY2wsJXIxMAorCWluY3EJJXIxMAorCisJbW92bAkkMSwlZWF4CisJY3B1aWQKKworCWJ0bAkkMjgsJWVkeAorCWpuYwlMJGdlbmVyaWMKKwlzaHJsCSQxNiwlZWJ4CisJY21wYgklcjEwYiwlYmwKKwlqYQlMJGdlbmVyaWMKKwlhbmRsCSQ0MDI2NTMxODM5LCVlZHgKKwlqbXAJTCRnZW5lcmljCisKK0wkaW50ZWw6CisJY21wbAkkNCwlcjExZAorCW1vdmwJJC0xLCVyMTBkCisJamIJTCRub2NhY2hlaW5mbworCisJbW92bAkkNCwlZWF4CisJbW92bAkkMCwlZWN4CisJY3B1aWQKKwltb3ZsCSVlYXgsJXIxMGQKKwlzaHJsCSQxNCwlcjEwZAorCWFuZGwJJDQwOTUsJXIxMGQKKworCWNtcGwJJDcsJXIxMWQKKwlqYglMJG5vY2FjaGVpbmZvCisKKwltb3ZsCSQ3LCVlYXgKKwl4b3JsCSVlY3gsJWVjeAorCWNwdWlkCisJbW92bAklZWJ4LDgoJXJkaSkKKworTCRub2NhY2hlaW5mbzoKKwltb3ZsCSQxLCVlYXgKKwljcHVpZAorCisJYW5kbAkkMzIyMDE3Njg5NSwlZWR4CisJY21wbAkkMCwlcjlkCisJam5lCUwkbm90aW50ZWwKKwlvcmwJJDEwNzM3NDE4MjQsJWVkeAorTCRub3RpbnRlbDoKKwlidGwJJDI4LCVlZHgKKwlqbmMJTCRnZW5lcmljCisJYW5kbAkkNDAyNjUzMTgzOSwlZWR4CisJY21wbAkkMCwlcjEwZAorCWplCUwkZ2VuZXJpYworCisJb3JsCSQyNjg0MzU0NTYsJWVkeAorCXNocmwJJDE2LCVlYngKKwljbXBiCSQxLCVibAorCWphCUwkZ2VuZXJpYworCWFuZGwJJDQwMjY1MzE4MzksJWVkeAorTCRnZW5lcmljOgorCWFuZGwJJDIwNDgsJXI5ZAorCWFuZGwJJDQyOTQ5NjUyNDcsJWVjeAorCW9ybAklZWN4LCVyOWQKKworCW1vdmwJJWVkeCwlcjEwZAorCWJ0bAkkMjcsJXI5ZAorCWpuYwlMJGNsZWFyX2F2eAorCXhvcmwJJWVjeCwlZWN4CisuYnl0ZQkweDBmLDB4MDEsMHhkMAorCWFuZGwJJDYsJWVheAorCWNtcGwJJDYsJWVheAorCWplCUwkZG9uZQorTCRjbGVhcl9hdng6CisJbW92bAkkNDAyNjUyNTY5NSwlZWF4CisJYW5kbAklZWF4LCVyOWQKKwlhbmRsCSQ0Mjk0OTY3MjYzLDgoJXJkaSkKK0wkZG9uZToKKwltb3ZsCSVyOWQsNCglcmRpKQorCW1vdmwJJXIxMGQsMCglcmRpKQorCW1vdnEJJXI4LCVyYngKKwkuYnl0ZQkweGYzLDB4YzMKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21hYy14ODZfNjQvY3J5cHRvL3JhbmQvcmRyYW5kLXg4Nl82NC5TIGIvbWFjLXg4Nl82NC9jcnlwdG8vcmFuZC9yZHJhbmQteDg2XzY0LlMKaW5kZXggZjBkZjI5Ni4uMWJhOTkwZiAxMDA2NDQKLS0tIGEvbWFjLXg4Nl82NC9jcnlwdG8vcmFuZC9yZHJhbmQteDg2XzY0LlMKKysrIGIvbWFjLXg4Nl82NC9jcnlwdG8vcmFuZC9yZHJhbmQteDg2XzY0LlMKQEAgLTEsNDggKzEsMTEgQEAKICNpZiBkZWZpbmVkKF9feDg2XzY0X18pCiAudGV4dAkKIAotCi0KLQogLmdsb2JsCV9DUllQVE9fcmRyYW5kCiAucHJpdmF0ZV9leHRlcm4gX0NSWVBUT19yZHJhbmQKIAogLnAyYWxpZ24JNAogX0NSWVBUT19yZHJhbmQ6Ci0JeG9ycQklcmF4LCVyYXgKLQotCi0uYnl0ZQkweDQ4LCAweDBmLCAweGM3LCAweGYxCi0KLQlhZGNxCSVyYXgsJXJheAotCW1vdnEJJXJjeCwwKCVyZGkpCi0JLmJ5dGUJMHhmMywweGMzCi0KLQotCi0KLQotLmdsb2JsCV9DUllQVE9fcmRyYW5kX211bHRpcGxlOF9idWYKLS5wcml2YXRlX2V4dGVybiBfQ1JZUFRPX3JkcmFuZF9tdWx0aXBsZThfYnVmCi0KLS5wMmFsaWduCTQKLV9DUllQVE9fcmRyYW5kX211bHRpcGxlOF9idWY6Ci0JdGVzdHEJJXJzaSwlcnNpCi0JanoJTCRvdXQKLQltb3ZxCSQ4LCVyZHgKLUwkbG9vcDoKLQotCi0uYnl0ZQkweDQ4LCAweDBmLCAweGM3LCAweGYxCi0Jam5jCUwkZXJyCi0JbW92cQklcmN4LDAoJXJkaSkKLQlhZGRxCSVyZHgsJXJkaQotCXN1YnEJJXJkeCwlcnNpCi0Jam56CUwkbG9vcAotTCRvdXQ6Ci0JbW92cQkkMSwlcmF4Ci0JLmJ5dGUJMHhmMywweGMzCi1MJGVycjoKLQl4b3JxCSVyYXgsJXJheAorLmJ5dGUJMHg0OCwgMHgwZiwgMHhjNywgMHhmMAogCS5ieXRlCTB4ZjMsMHhjMwogI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VyY2VzLm1rIGIvc291cmNlcy5tawppbmRleCA0MmQ5ZmE2Li5jZGI3YWJjIDEwMDY0NAotLS0gYS9zb3VyY2VzLm1rCisrKyBiL3NvdXJjZXMubWsKQEAgLTcwLDcgKzcwLDYgQEAKICAgc3JjL2NyeXB0by9ibi9hZGQuY1wKICAgc3JjL2NyeXB0by9ibi9hc20veDg2XzY0LWdjYy5jXAogICBzcmMvY3J5cHRvL2JuL2JuLmNcCi0gIHNyYy9jcnlwdG8vYm4vYm5fYXNuMS5jXAogICBzcmMvY3J5cHRvL2JuL2NtcC5jXAogICBzcmMvY3J5cHRvL2JuL2NvbnZlcnQuY1wKICAgc3JjL2NyeXB0by9ibi9jdHguY1wKQEAgLTEzNywxMyArMTM2LDE1IEBACiAgIHNyYy9jcnlwdG8vZW5naW5lL2VuZ2luZS5jXAogICBzcmMvY3J5cHRvL2Vyci9lcnIuY1wKICAgc3JjL2NyeXB0by9ldnAvYWxnb3JpdGhtLmNcCisgIHNyYy9jcnlwdG8vZXZwL2FzbjEuY1wKICAgc3JjL2NyeXB0by9ldnAvZGlnZXN0c2lnbi5jXAogICBzcmMvY3J5cHRvL2V2cC9ldnAuY1wKLSAgc3JjL2NyeXB0by9ldnAvZXZwX2FzbjEuY1wKICAgc3JjL2NyeXB0by9ldnAvZXZwX2N0eC5jXAogICBzcmMvY3J5cHRvL2V2cC9wX2RzYV9hc24xLmNcCiAgIHNyYy9jcnlwdG8vZXZwL3BfZWMuY1wKICAgc3JjL2NyeXB0by9ldnAvcF9lY19hc24xLmNcCisgIHNyYy9jcnlwdG8vZXZwL3BfaG1hYy5jXAorICBzcmMvY3J5cHRvL2V2cC9wX2htYWNfYXNuMS5jXAogICBzcmMvY3J5cHRvL2V2cC9wX3JzYS5jXAogICBzcmMvY3J5cHRvL2V2cC9wX3JzYV9hc24xLmNcCiAgIHNyYy9jcnlwdG8vZXZwL3Bia2RmLmNcCkBAIC0yMDgsNyArMjA5LDYgQEAKICAgc3JjL2NyeXB0by94NTA5L2kyZF9wci5jXAogICBzcmMvY3J5cHRvL3g1MDkvcGtjczcuY1wKICAgc3JjL2NyeXB0by94NTA5L3RfY3JsLmNcCi0gIHNyYy9jcnlwdG8veDUwOS90X3JlcS5jXAogICBzcmMvY3J5cHRvL3g1MDkvdF94NTA5LmNcCiAgIHNyYy9jcnlwdG8veDUwOS90X3g1MDlhLmNcCiAgIHNyYy9jcnlwdG8veDUwOS94NTA5LmNcCkBAIC0yODEsNyArMjgxLDYgQEAKICAgc3JjL2NyeXB0by94NTA5djMvdjNfdXRsLmNcCiAKIHNzbF9zb3VyY2VzIDo9IFwKLSAgc3JjL3NzbC9jdXN0b21fZXh0ZW5zaW9ucy5jXAogICBzcmMvc3NsL2QxX2JvdGguY1wKICAgc3JjL3NzbC9kMV9jbG50LmNcCiAgIHNyYy9zc2wvZDFfbGliLmNcCkBAIC0yODksNyArMjg4LDYgQEAKICAgc3JjL3NzbC9kMV9wa3QuY1wKICAgc3JjL3NzbC9kMV9zcnRwLmNcCiAgIHNyYy9zc2wvZDFfc3J2ci5jXAotICBzcmMvc3NsL2R0bHNfcmVjb3JkLmNcCiAgIHNyYy9zc2wvcHF1ZXVlL3BxdWV1ZS5jXAogICBzcmMvc3NsL3MzX2JvdGguY1wKICAgc3JjL3NzbC9zM19jbG50LmNcCkBAIC0yOTksMjYgKzI5NywyNCBAQAogICBzcmMvc3NsL3MzX3BrdC5jXAogICBzcmMvc3NsL3MzX3NydnIuY1wKICAgc3JjL3NzbC9zc2xfYWVhZF9jdHguY1wKKyAgc3JjL3NzbC9zc2xfYWxncy5jXAogICBzcmMvc3NsL3NzbF9hc24xLmNcCi0gIHNyYy9zc2wvc3NsX2J1ZmZlci5jXAogICBzcmMvc3NsL3NzbF9jZXJ0LmNcCiAgIHNyYy9zc2wvc3NsX2NpcGhlci5jXAotICBzcmMvc3NsL3NzbF9maWxlLmNcCiAgIHNyYy9zc2wvc3NsX2xpYi5jXAogICBzcmMvc3NsL3NzbF9yc2EuY1wKLSAgc3JjL3NzbC9zc2xfc2Vzc2lvbi5jXAorICBzcmMvc3NsL3NzbF9zZXNzLmNcCiAgIHNyYy9zc2wvc3NsX3N0YXQuY1wKICAgc3JjL3NzbC9zc2xfdHh0LmNcCiAgIHNyYy9zc2wvdDFfZW5jLmNcCiAgIHNyYy9zc2wvdDFfbGliLmNcCi0gIHNyYy9zc2wvdGxzX3JlY29yZC5jXAorICBzcmMvc3NsL3QxX3JlbmVnLmNcCiAKIHRvb2xfc291cmNlcyA6PSBcCiAgIHNyYy90b29sL2FyZ3MuY2NcCiAgIHNyYy90b29sL2NsaWVudC5jY1wKICAgc3JjL3Rvb2wvY29uc3QuY2NcCiAgIHNyYy90b29sL2RpZ2VzdC5jY1wKLSAgc3JjL3Rvb2wvZ2VucnNhLmNjXAogICBzcmMvdG9vbC9wa2NzMTIuY2NcCiAgIHNyYy90b29sL3JhbmQuY2NcCiAgIHNyYy90b29sL3NlcnZlci5jY1wKQEAgLTMyNywxOSArMzIzLDE5IEBACiAgIHNyYy90b29sL3RyYW5zcG9ydF9jb21tb24uY2NcCiAKIGxpbnV4X2FhcmNoNjRfc291cmNlcyA6PSBcCi0gIGxpbnV4LWFhcmNoNjQvY3J5cHRvL2Flcy9hZXN2OC1hcm14NjQuU1wKLSAgbGludXgtYWFyY2g2NC9jcnlwdG8vbW9kZXMvZ2hhc2h2OC1hcm14NjQuU1wKKyAgbGludXgtYWFyY2g2NC9jcnlwdG8vYWVzL2Flc3Y4LWFybXguU1wKKyAgbGludXgtYWFyY2g2NC9jcnlwdG8vbW9kZXMvZ2hhc2h2OC1hcm14LlNcCiAgIGxpbnV4LWFhcmNoNjQvY3J5cHRvL3NoYS9zaGExLWFybXY4LlNcCiAgIGxpbnV4LWFhcmNoNjQvY3J5cHRvL3NoYS9zaGEyNTYtYXJtdjguU1wKICAgbGludXgtYWFyY2g2NC9jcnlwdG8vc2hhL3NoYTUxMi1hcm12OC5TXAogCiBsaW51eF9hcm1fc291cmNlcyA6PSBcCiAgIGxpbnV4LWFybS9jcnlwdG8vYWVzL2Flcy1hcm12NC5TXAotICBsaW51eC1hcm0vY3J5cHRvL2Flcy9hZXN2OC1hcm14MzIuU1wKKyAgbGludXgtYXJtL2NyeXB0by9hZXMvYWVzdjgtYXJteC5TXAogICBsaW51eC1hcm0vY3J5cHRvL2Flcy9ic2Flcy1hcm12Ny5TXAogICBsaW51eC1hcm0vY3J5cHRvL2JuL2FybXY0LW1vbnQuU1wKICAgbGludXgtYXJtL2NyeXB0by9tb2Rlcy9naGFzaC1hcm12NC5TXAotICBsaW51eC1hcm0vY3J5cHRvL21vZGVzL2doYXNodjgtYXJteDMyLlNcCisgIGxpbnV4LWFybS9jcnlwdG8vbW9kZXMvZ2hhc2h2OC1hcm14LlNcCiAgIGxpbnV4LWFybS9jcnlwdG8vc2hhL3NoYTEtYXJtdjQtbGFyZ2UuU1wKICAgbGludXgtYXJtL2NyeXB0by9zaGEvc2hhMjU2LWFybXY0LlNcCiAgIGxpbnV4LWFybS9jcnlwdG8vc2hhL3NoYTUxMi1hcm12NC5TXApAQCAtMzU0LDYgKzM1MCw3IEBACiAgIGxpbnV4LXg4Ni9jcnlwdG8vYm4vYm4tNTg2LlNcCiAgIGxpbnV4LXg4Ni9jcnlwdG8vYm4vY28tNTg2LlNcCiAgIGxpbnV4LXg4Ni9jcnlwdG8vYm4veDg2LW1vbnQuU1wKKyAgbGludXgteDg2L2NyeXB0by9jcHUteDg2LWFzbS5TXAogICBsaW51eC14ODYvY3J5cHRvL21kNS9tZDUtNTg2LlNcCiAgIGxpbnV4LXg4Ni9jcnlwdG8vbW9kZXMvZ2hhc2gteDg2LlNcCiAgIGxpbnV4LXg4Ni9jcnlwdG8vcmM0L3JjNC01ODYuU1wKQEAgLTM3MCw2ICszNjcsNyBAQAogICBsaW51eC14ODZfNjQvY3J5cHRvL2JuL3JzYXoteDg2XzY0LlNcCiAgIGxpbnV4LXg4Nl82NC9jcnlwdG8vYm4veDg2XzY0LW1vbnQuU1wKICAgbGludXgteDg2XzY0L2NyeXB0by9ibi94ODZfNjQtbW9udDUuU1wKKyAgbGludXgteDg2XzY0L2NyeXB0by9jcHUteDg2XzY0LWFzbS5TXAogICBsaW51eC14ODZfNjQvY3J5cHRvL21kNS9tZDUteDg2XzY0LlNcCiAgIGxpbnV4LXg4Nl82NC9jcnlwdG8vbW9kZXMvYWVzbmktZ2NtLXg4Nl82NC5TXAogICBsaW51eC14ODZfNjQvY3J5cHRvL21vZGVzL2doYXNoLXg4Nl82NC5TXApAQCAtMzg3LDYgKzM4NSw3IEBACiAgIG1hYy14ODYvY3J5cHRvL2JuL2JuLTU4Ni5TXAogICBtYWMteDg2L2NyeXB0by9ibi9jby01ODYuU1wKICAgbWFjLXg4Ni9jcnlwdG8vYm4veDg2LW1vbnQuU1wKKyAgbWFjLXg4Ni9jcnlwdG8vY3B1LXg4Ni1hc20uU1wKICAgbWFjLXg4Ni9jcnlwdG8vbWQ1L21kNS01ODYuU1wKICAgbWFjLXg4Ni9jcnlwdG8vbW9kZXMvZ2hhc2gteDg2LlNcCiAgIG1hYy14ODYvY3J5cHRvL3JjNC9yYzQtNTg2LlNcCkBAIC00MDMsNiArNDAyLDcgQEAKICAgbWFjLXg4Nl82NC9jcnlwdG8vYm4vcnNhei14ODZfNjQuU1wKICAgbWFjLXg4Nl82NC9jcnlwdG8vYm4veDg2XzY0LW1vbnQuU1wKICAgbWFjLXg4Nl82NC9jcnlwdG8vYm4veDg2XzY0LW1vbnQ1LlNcCisgIG1hYy14ODZfNjQvY3J5cHRvL2NwdS14ODZfNjQtYXNtLlNcCiAgIG1hYy14ODZfNjQvY3J5cHRvL21kNS9tZDUteDg2XzY0LlNcCiAgIG1hYy14ODZfNjQvY3J5cHRvL21vZGVzL2Flc25pLWdjbS14ODZfNjQuU1wKICAgbWFjLXg4Nl82NC9jcnlwdG8vbW9kZXMvZ2hhc2gteDg2XzY0LlNcCkBAIC00MjAsNiArNDIwLDcgQEAKICAgd2luLXg4Ni9jcnlwdG8vYm4vYm4tNTg2LmFzbVwKICAgd2luLXg4Ni9jcnlwdG8vYm4vY28tNTg2LmFzbVwKICAgd2luLXg4Ni9jcnlwdG8vYm4veDg2LW1vbnQuYXNtXAorICB3aW4teDg2L2NyeXB0by9jcHUteDg2LWFzbS5hc21cCiAgIHdpbi14ODYvY3J5cHRvL21kNS9tZDUtNTg2LmFzbVwKICAgd2luLXg4Ni9jcnlwdG8vbW9kZXMvZ2hhc2gteDg2LmFzbVwKICAgd2luLXg4Ni9jcnlwdG8vcmM0L3JjNC01ODYuYXNtXApAQCAtNDM2LDYgKzQzNyw3IEBACiAgIHdpbi14ODZfNjQvY3J5cHRvL2JuL3JzYXoteDg2XzY0LmFzbVwKICAgd2luLXg4Nl82NC9jcnlwdG8vYm4veDg2XzY0LW1vbnQuYXNtXAogICB3aW4teDg2XzY0L2NyeXB0by9ibi94ODZfNjQtbW9udDUuYXNtXAorICB3aW4teDg2XzY0L2NyeXB0by9jcHUteDg2XzY0LWFzbS5hc21cCiAgIHdpbi14ODZfNjQvY3J5cHRvL21kNS9tZDUteDg2XzY0LmFzbVwKICAgd2luLXg4Nl82NC9jcnlwdG8vbW9kZXMvYWVzbmktZ2NtLXg4Nl82NC5hc21cCiAgIHdpbi14ODZfNjQvY3J5cHRvL21vZGVzL2doYXNoLXg4Nl82NC5hc21cCmRpZmYgLS1naXQgYS9zcmMvLmdpdGlnbm9yZSBiL3NyYy8uZ2l0aWdub3JlCmluZGV4IGEyZTNlZDIuLmI1NDEyNWYgMTAwNjQ0Ci0tLSBhL3NyYy8uZ2l0aWdub3JlCisrKyBiL3NyYy8uZ2l0aWdub3JlCkBAIC0zLDQgKzMsMyBAQAogKi5zd3AKICouc3dvCiBkb2MvKi5odG1sCi1kb2MvZG9jLmNzcwpkaWZmIC0tZ2l0IGEvc3JjL0JVSUxESU5HIGIvc3JjL0JVSUxESU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MThmOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvQlVJTERJTkcKQEAgLTAsMCArMSw5NiBAQAorQnVpbGQgUHJlcmVxdWlzaXRlczoKKworICAqIENNYWtlWzFdIDIuOC44IG9yIGxhdGVyIGlzIHJlcXVpcmVkLgorCisgICogUGVybCA1LjYuMSBvciBsYXRlciBpcyByZXF1aXJlZC4gT24gV2luZG93cywgU3RyYXdiZXJyeSBQZXJsIGFuZCBNU1lTIFBlcmwKKyAgICBoYXZlIGJvdGggYmVlbiByZXBvcnRlZCB0byB3b3JrLiBJZiBub3QgZm91bmQgYnkgQ01ha2UsIGl0IG1heSBiZSBjb25maWd1cmVkCisgICAgZXhwbGljaXRseSBieSBzZXR0aW5nIFBFUkxfRVhFQ1VUQUJMRS4KKworICAqIE9uIFdpbmRvd3MgeW91IGN1cnJlbnRseSBtdXN0IHVzZSBOaW5qYVsyXSB0byBidWlsZDsgb24gb3RoZXIgcGxhdGZvcm1zLAorICAgIGl0IGlzIG5vdCByZXF1aXJlZCwgYnV0IHJlY29tbWVuZGVkLCBiZWNhdXNlIGl0IG1ha2VzIGJ1aWxkcyBmYXN0ZXIuCisKKyAgKiBJZiB5b3UgbmVlZCB0byBidWlsZCBOaW5qYSBmcm9tIHNvdXJjZSwgdGhlbiBhIHJlY2VudCB2ZXJzaW9uIG9mCisgICAgUHl0aG9uWzNdIGlzIHJlcXVpcmVkIChQeXRob24gMi43LjUgd29ya3MpLgorCisgICogT24gV2luZG93cyBvbmx5LCBZYXNtWzRdIGlzIHJlcXVpcmVkLiBJZiBub3QgZm91bmQgYnkgQ01ha2UsIGl0IG1heSBiZQorICAgIGNvbmZpZ3VyZWQgZXhwbGljaXRseSBieSBzZXR0aW5nIENNQUtFX0FTTV9OQVNNX0NPTVBJTEVSLgorCisgICogQSBDIGNvbXBpbGVyIGlzIHJlcXVpcmVkLiBPbiBXaW5kb3dzLCBNU1ZDIDEyIChWaXN1YWwgU3R1ZGlvIDIwMTMpIG9yIGxhdGVyCisgICAgd2l0aCBQbGF0Zm9ybSBTREsgOC4xIG9yIGxhdGVyIGFyZSBzdXBwb3J0ZWQuIFJlY2VudCB2ZXJzaW9ucyBvZiBHQ0MgYW5kCisgICAgQ2xhbmcgc2hvdWxkIHdvcmsgb24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLCBhbmQgbWF5YmUgb24gV2luZG93cyB0b28uCisKKyAgKiBHb1s1XSBpcyByZXF1aXJlZC4gSWYgbm90IGZvdW5kIGJ5IENNYWtlLCB0aGUgZ28gZXhlY3V0YWJsZSBtYXkgYmUKKyAgICBjb25maWd1cmVkIGV4cGxpY2l0bHkgYnkgc2V0dGluZyBHT19FWEVDVVRBQkxFLgorCitVc2luZyBOaW5qYSAobm90ZSB0aGUgJ04nIGlzIGNhcGl0YWxpemVkIGluIHRoZSBjbWFrZSBpbnZvY2F0aW9uKToKKworICBta2RpciBidWlsZAorICBjZCBidWlsZAorICBjbWFrZSAtR05pbmphIC4uCisgIG5pbmphCisKK1VzaW5nIG1ha2VmaWxlcyAoZG9lcyBub3Qgd29yayBvbiBXaW5kb3dzKToKKworICBta2RpciBidWlsZAorICBjZCBidWlsZAorICBjbWFrZSAuLgorICBtYWtlCisKK1lvdSB1c3VhbGx5IGRvbid0IG5lZWQgdG8gcnVuIGNtYWtlIGFnYWluIGFmdGVyIGNoYW5naW5nIENNYWtlTGlzdHMudHh0IGZpbGVzCitiZWNhdXNlIHRoZSBidWlsZCBzY3JpcHRzIHdpbGwgZGV0ZWN0IGNoYW5nZXMgdG8gdGhlbSBhbmQgcmVidWlsZCB0aGVtc2VsdmVzCithdXRvbWF0aWNhbGx5LgorCitOb3RlIHRoYXQgdGhlIGRlZmF1bHQgYnVpbGQgZmxhZ3MgaW4gdGhlIHRvcC1sZXZlbCBDTWFrZUxpc3RzLnR4dCBhcmUgZm9yCitkZWJ1Z2dpbmcgLSBvcHRpbWlzYXRpb24gaXNuJ3QgZW5hYmxlZC4KKworSWYgeW91IHdhbnQgdG8gY3Jvc3MtY29tcGlsZSB0aGVuIHRoZXJlIGlzIGFuIGV4YW1wbGUgdG9vbGNoYWluIGZpbGUgZm9yCiszMi1iaXQgSW50ZWwgaW4gdXRpbC8uIFdpcGUgb3V0IHRoZSBidWlsZCBkaXJlY3RvcnksIHJlY3JlYXRlIGl0IGFuZCBydW4gY21ha2UKK2xpa2UgdGhpczoKKworICBjbWFrZSAtRENNQUtFX1RPT0xDSEFJTl9GSUxFPS4uL3V0aWwvMzItYml0LXRvb2xjaGFpbi5jbWFrZSAtR05pbmphIC4uCisKK0lmIHlvdSB3YW50IHRvIGJ1aWxkIGFzIGEgc2hhcmVkIGxpYnJhcnksIHBhc3MgLURCVUlMRF9TSEFSRURfTElCUz0xLiBPbgorV2luZG93cywgd2hlcmUgZnVuY3Rpb25zIG5lZWQgdG8gYmUgdGFnZ2VkIHdpdGggImRsbGltcG9ydCIgd2hlbiBjb21pbmcgZnJvbSBhCitzaGFyZWQgbGlicmFyeSwgZGVmaW5lIEJPUklOR1NTTF9TSEFSRURfTElCUkFSWSBpbiBhbnkgY29kZSB3aGljaCAjaW5jbHVkZXMgdGhlCitCb3JpbmdTU0wgaGVhZGVycy4KKworCitCdWlsZGluZyBmb3IgQW5kcm9pZDoKKworSXQncyBwb3NzaWJsZSB0byBidWlsZCBCb3JpbmdTU0wgd2l0aCB0aGUgQW5kcm9pZCBOREsgdXNpbmcgQ01ha2UuIFRoaXMgaGFzCitiZWVuIHRlc3RlZCB3aXRoIHZlcnNpb24gMTBkIG9mIHRoZSBOREsuCisKK1VucGFjayB0aGUgQW5kcm9pZCBOREsgc29tZXdoZXJlIGFuZCBleHBvcnQgQU5EUk9JRF9OREsgdG8gcG9pbnQgdG8gdGhlCitkaXJlY3RvcnkuIENsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS90YWthLW5vLW1lL2FuZHJvaWQtY21ha2UgaW50byB1dGlsLy4KK1RoZW4gbWFrZSBhIGJ1aWxkIGRpcmVjdG9yeSBhcyBhYm92ZSBhbmQgcnVuIENNYWtlICp0d2ljZSogbGlrZSB0aGlzOgorCisgIGNtYWtlIC1EQU5EUk9JRF9OQVRJVkVfQVBJX0xFVkVMPWFuZHJvaWQtOSBcCisgICAgICAgIC1EQU5EUk9JRF9BQkk9YXJtZWFiaS12N2EgXAorICAgICAgICAtRENNQUtFX1RPT0xDSEFJTl9GSUxFPS4uL3V0aWwvYW5kcm9pZC1jbWFrZS9hbmRyb2lkLnRvb2xjaGFpbi5jbWFrZSBcCisgICAgICAgIC1HTmluamEgLi4KKworT25jZSB5b3UndmUgcnVuIHRoYXQgdHdpY2UsIG5pbmphIHNob3VsZCBwcm9kdWNlIEFuZHJvaWQtY29tcGF0aWJsZSBiaW5hcmllcy4KK1lvdSBjYW4gcmVwbGFjZSAiYXJtZWFiaS12N2EiIGluIHRoZSBhYm92ZSB3aXRoICJhcm02NC12OGEiIHRvIGJ1aWxkIGFhcmNoNjQKK2JpbmFyaWVzLgorCisKK0tub3duIExpbWl0YXRpb25zIG9uIFdpbmRvd3M6CisKKyAgKiBWZXJzaW9ucyBvZiBjbWFrZSBzaW5jZSAzLjAuMiBoYXZlIGEgYnVnIGluIGl0cyBOaW5qYSBnZW5lcmF0b3IgdGhhdCBjYXVzZXMKKyAgICB5YXNtIHRvIG91dHB1dCB3YXJuaW5ncyAieWFzbTogd2FybmluZzogY2FuIG9wZW4gb25seSBvbmUgaW5wdXQgZmlsZSwgb25seQorICAgIHRoZSBsYXN0IGZpbGUgd2lsbCBiZSBwcm9jZXNzZWQiLiBUaGVzZSB3YXJuaW5ncyBjYW4gYmUgc2FmZWx5IGlnbm9yZWQuCisgICAgVGhlIGNtYWtlIGJ1ZyBpcyBodHRwOi8vd3d3LmNtYWtlLm9yZy9CdWcvdmlldy5waHA/aWQ9MTUyNTMuCisKKyAgKiBjbWFrZSBjYW4gZ2VuZXJhdGUgVmlzdWFsIFN0dWRpbyBwcm9qZWN0cywgYnV0IHRoZSBnZW5lcmF0ZWQgcHJvamVjdCBmaWxlcworICAgIGRvbid0IGhhdmUgc3RlcHMgZm9yIGFzc2VtYmxpbmcgdGhlIGFzc2VtYmx5IGxhbmd1YWdlIHNvdXJjZSBmaWxlcywgc28gdGhleQorICAgIGN1cnJlbnRseSBjYW5ub3QgYmUgdXNlZCB0byBidWlsZCBCb3JpbmdTU0wuCisKK1sxXSBodHRwOi8vd3d3LmNtYWtlLm9yZy9kb3dubG9hZC8KKworWzJdIGh0dHBzOi8vbWFydGluZS5naXRodWIuaW8vbmluamEvCisKK1szXSBodHRwczovL3d3dy5weXRob24ub3JnL2Rvd25sb2Fkcy8KKworWzRdIGh0dHA6Ly95YXNtLnRvcnRhbGwubmV0LworCitbNV0gaHR0cHM6Ly9nb2xhbmcub3JnL2RsLwpkaWZmIC0tZ2l0IGEvc3JjL0JVSUxESU5HLm1kIGIvc3JjL0JVSUxESU5HLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzU4NTFmLi4wMDAwMDAwCi0tLSBhL3NyYy9CVUlMRElORy5tZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0jIEJ1aWxkaW5nIEJvcmluZ1NTTAotCi0jIyBCdWlsZCBQcmVyZXF1aXNpdGVzCi0KLSAgKiBbQ01ha2VdIFsxXSAyLjguOCBvciBsYXRlciBpcyByZXF1aXJlZC4KLQotICAqIFBlcmwgNS42LjEgb3IgbGF0ZXIgaXMgcmVxdWlyZWQuIE9uIFdpbmRvd3MsIFtTdHJhd2JlcnJ5IFBlcmxdIFsyXSBhbmQgTVNZUwotICAgIFBlcmwgaGF2ZSBib3RoIGJlZW4gcmVwb3J0ZWQgdG8gd29yay4gSWYgbm90IGZvdW5kIGJ5IENNYWtlLCBpdCBtYXkgYmUKLSAgICBjb25maWd1cmVkIGV4cGxpY2l0bHkgYnkgc2V0dGluZyBgUEVSTF9FWEVDVVRBQkxFYC4KLQotICAqIE9uIFdpbmRvd3MgeW91IGN1cnJlbnRseSBtdXN0IHVzZSBbTmluamFdIFszXSB0byBidWlsZDsgb24gb3RoZXIgcGxhdGZvcm1zLAotICAgIGl0IGlzIG5vdCByZXF1aXJlZCwgYnV0IHJlY29tbWVuZGVkLCBiZWNhdXNlIGl0IG1ha2VzIGJ1aWxkcyBmYXN0ZXIuCi0KLSAgKiBJZiB5b3UgbmVlZCB0byBidWlsZCBOaW5qYSBmcm9tIHNvdXJjZSwgdGhlbiBhIHJlY2VudCB2ZXJzaW9uIG9mCi0gICAgW1B5dGhvbl0gWzRdIGlzIHJlcXVpcmVkIChQeXRob24gMi43LjUgd29ya3MpLgotCi0gICogT24gV2luZG93cyBvbmx5LCBbWWFzbV0gWzVdIGlzIHJlcXVpcmVkLiBJZiBub3QgZm91bmQgYnkgQ01ha2UsIGl0IG1heSBiZQotICAgIGNvbmZpZ3VyZWQgZXhwbGljaXRseSBieSBzZXR0aW5nIGBDTUFLRV9BU01fTkFTTV9DT01QSUxFUmAuCi0KLSAgKiBBIEMgY29tcGlsZXIgaXMgcmVxdWlyZWQuIE9uIFdpbmRvd3MsIE1TVkMgMTIgKFZpc3VhbCBTdHVkaW8gMjAxMykgb3IgbGF0ZXIKLSAgICB3aXRoIFBsYXRmb3JtIFNESyA4LjEgb3IgbGF0ZXIgYXJlIHN1cHBvcnRlZC4gUmVjZW50IHZlcnNpb25zIG9mIEdDQyBhbmQKLSAgICBDbGFuZyBzaG91bGQgd29yayBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMsIGFuZCBtYXliZSBvbiBXaW5kb3dzIHRvby4KLQotICAqIFtHb10gWzZdIGlzIHJlcXVpcmVkLiBJZiBub3QgZm91bmQgYnkgQ01ha2UsIHRoZSBnbyBleGVjdXRhYmxlIG1heSBiZQotICAgIGNvbmZpZ3VyZWQgZXhwbGljaXRseSBieSBzZXR0aW5nIGBHT19FWEVDVVRBQkxFYC4KLQotIyMgQnVpbGRpbmcKLQotVXNpbmcgTmluamEgKG5vdGUgdGhlICdOJyBpcyBjYXBpdGFsaXplZCBpbiB0aGUgY21ha2UgaW52b2NhdGlvbik6Ci0KLSAgICBta2RpciBidWlsZAotICAgIGNkIGJ1aWxkCi0gICAgY21ha2UgLUdOaW5qYSAuLgotICAgIG5pbmphCi0KLVVzaW5nIE1ha2UgKGRvZXMgbm90IHdvcmsgb24gV2luZG93cyk6Ci0KLSAgICBta2RpciBidWlsZAotICAgIGNkIGJ1aWxkCi0gICAgY21ha2UgLi4KLSAgICBtYWtlCi0KLVlvdSB1c3VhbGx5IGRvbid0IG5lZWQgdG8gcnVuIGBjbWFrZWAgYWdhaW4gYWZ0ZXIgY2hhbmdpbmcgYENNYWtlTGlzdHMudHh0YAotZmlsZXMgYmVjYXVzZSB0aGUgYnVpbGQgc2NyaXB0cyB3aWxsIGRldGVjdCBjaGFuZ2VzIHRvIHRoZW0gYW5kIHJlYnVpbGQKLXRoZW1zZWx2ZXMgYXV0b21hdGljYWxseS4KLQotTm90ZSB0aGF0IHRoZSBkZWZhdWx0IGJ1aWxkIGZsYWdzIGluIHRoZSB0b3AtbGV2ZWwgYENNYWtlTGlzdHMudHh0YCBhcmUgZm9yCi1kZWJ1Z2dpbmfigJRvcHRpbWlzYXRpb24gaXNuJ3QgZW5hYmxlZC4KLQotSWYgeW91IHdhbnQgdG8gY3Jvc3MtY29tcGlsZSB0aGVuIHRoZXJlIGlzIGFuIGV4YW1wbGUgdG9vbGNoYWluIGZpbGUgZm9yIDMyLWJpdAotSW50ZWwgaW4gYHV0aWwvYC4gV2lwZSBvdXQgdGhlIGJ1aWxkIGRpcmVjdG9yeSwgcmVjcmVhdGUgaXQgYW5kIHJ1biBgY21ha2VgIGxpa2UKLXRoaXM6Ci0KLSAgICBjbWFrZSAtRENNQUtFX1RPT0xDSEFJTl9GSUxFPS4uL3V0aWwvMzItYml0LXRvb2xjaGFpbi5jbWFrZSAtR05pbmphIC4uCi0KLUlmIHlvdSB3YW50IHRvIGJ1aWxkIGFzIGEgc2hhcmVkIGxpYnJhcnksIHBhc3MgYC1EQlVJTERfU0hBUkVEX0xJQlM9MWAuIE9uCi1XaW5kb3dzLCB3aGVyZSBmdW5jdGlvbnMgbmVlZCB0byBiZSB0YWdnZWQgd2l0aCBgZGxsaW1wb3J0YCB3aGVuIGNvbWluZyBmcm9tIGEKLXNoYXJlZCBsaWJyYXJ5LCBkZWZpbmUgYEJPUklOR1NTTF9TSEFSRURfTElCUkFSWWAgaW4gYW55IGNvZGUgd2hpY2ggYCNpbmNsdWRlYHMKLXRoZSBCb3JpbmdTU0wgaGVhZGVycy4KLQotIyMjIEJ1aWxkaW5nIGZvciBBbmRyb2lkCi0KLUl0J3MgcG9zc2libGUgdG8gYnVpbGQgQm9yaW5nU1NMIHdpdGggdGhlIEFuZHJvaWQgTkRLIHVzaW5nIENNYWtlLiBUaGlzIGhhcwotYmVlbiB0ZXN0ZWQgd2l0aCB2ZXJzaW9uIDEwZCBvZiB0aGUgTkRLLgotCi1VbnBhY2sgdGhlIEFuZHJvaWQgTkRLIHNvbWV3aGVyZSBhbmQgZXhwb3J0IGBBTkRST0lEX05ES2AgdG8gcG9pbnQgdG8gdGhlCi1kaXJlY3RvcnkuIENsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS90YWthLW5vLW1lL2FuZHJvaWQtY21ha2UgaW50byBgdXRpbC9gLiAgVGhlbgotbWFrZSBhIGJ1aWxkIGRpcmVjdG9yeSBhcyBhYm92ZSBhbmQgcnVuIENNYWtlICp0d2ljZSogbGlrZSB0aGlzOgotCi0gICAgY21ha2UgLURBTkRST0lEX05BVElWRV9BUElfTEVWRUw9YW5kcm9pZC05IFwKLSAgICAgICAgICAtREFORFJPSURfQUJJPWFybWVhYmktdjdhIFwKLSAgICAgICAgICAtRENNQUtFX1RPT0xDSEFJTl9GSUxFPS4uL3V0aWwvYW5kcm9pZC1jbWFrZS9hbmRyb2lkLnRvb2xjaGFpbi5jbWFrZSBcCi0gICAgICAgICAgLURBTkRST0lEX05BVElWRV9BUElfTEVWRUw9MTYgXAotICAgICAgICAgIC1HTmluamEgLi4KLQotT25jZSB5b3UndmUgcnVuIHRoYXQgdHdpY2UsIE5pbmphIHNob3VsZCBwcm9kdWNlIEFuZHJvaWQtY29tcGF0aWJsZSBiaW5hcmllcy4KLVlvdSBjYW4gcmVwbGFjZSBgYXJtZWFiaS12N2FgIGluIHRoZSBhYm92ZSB3aXRoIGBhcm02NC12OGFgIHRvIGJ1aWxkIGFhcmNoNjQKLWJpbmFyaWVzLgotCi0jIyBLbm93biBMaW1pdGF0aW9ucyBvbiBXaW5kb3dzCi0KLSAgKiBWZXJzaW9ucyBvZiBDTWFrZSBzaW5jZSAzLjAuMiBoYXZlIGEgYnVnIGluIGl0cyBOaW5qYSBnZW5lcmF0b3IgdGhhdCBjYXVzZXMKLSAgICB5YXNtIHRvIG91dHB1dCB3YXJuaW5ncwotCi0gICAgICAgIHlhc206IHdhcm5pbmc6IGNhbiBvcGVuIG9ubHkgb25lIGlucHV0IGZpbGUsIG9ubHkgdGhlIGxhc3QgZmlsZSB3aWxsIGJlIHByb2Nlc3NlZAotCi0gICAgVGhlc2Ugd2FybmluZ3MgY2FuIGJlIHNhZmVseSBpZ25vcmVkLiBUaGUgY21ha2UgYnVnIGlzCi0gICAgaHR0cDovL3d3dy5jbWFrZS5vcmcvQnVnL3ZpZXcucGhwP2lkPTE1MjUzLgotCi0gICogQ01ha2UgY2FuIGdlbmVyYXRlIFZpc3VhbCBTdHVkaW8gcHJvamVjdHMsIGJ1dCB0aGUgZ2VuZXJhdGVkIHByb2plY3QgZmlsZXMKLSAgICBkb24ndCBoYXZlIHN0ZXBzIGZvciBhc3NlbWJsaW5nIHRoZSBhc3NlbWJseSBsYW5ndWFnZSBzb3VyY2UgZmlsZXMsIHNvIHRoZXkKLSAgICBjdXJyZW50bHkgY2Fubm90IGJlIHVzZWQgdG8gYnVpbGQgQm9yaW5nU1NMLgotCi0KLSBbMV06IGh0dHA6Ly93d3cuY21ha2Uub3JnL2Rvd25sb2FkLwotIFsyXTogaHR0cDovL3N0cmF3YmVycnlwZXJsLmNvbS8KLSBbM106IGh0dHBzOi8vbWFydGluZS5naXRodWIuaW8vbmluamEvCi0gWzRdOiBodHRwczovL3d3dy5weXRob24ub3JnL2Rvd25sb2Fkcy8KLSBbNV06IGh0dHA6Ly95YXNtLnRvcnRhbGwubmV0LwotIFs2XTogaHR0cHM6Ly9nb2xhbmcub3JnL2RsLwpkaWZmIC0tZ2l0IGEvc3JjL0xJQ0VOU0UgYi9zcmMvTElDRU5TRQppbmRleCBiMjQyZGNiLi44YWU1ZTc3IDEwMDY0NAotLS0gYS9zcmMvTElDRU5TRQorKysgYi9zcmMvTElDRU5TRQpAQCAtNSw5ICs1LDYgQEAKIENvbnRyaWJ1dG9ycyB0byBCb3JpbmdTU0wgYXJlIHJlcXVpcmVkIHRvIGZvbGxvdyB0aGUgQ0xBIHJ1bGVzIGZvciBDaHJvbWl1bToKIGh0dHBzOi8vY2xhLmRldmVsb3BlcnMuZ29vZ2xlLmNvbS9jbGFzCiAKLVNvbWUgZmlsZXMgZnJvbSBJbnRlbCBhcmUgdW5kZXIgeWV0IGFub3RoZXIgbGljZW5zZSwgd2hpY2ggaXMgYWxzbyBpbmNsdWRlZAotdW5kZXJuZWF0aC4KLQogVGhlIE9wZW5TU0wgdG9vbGtpdCBzdGF5cyB1bmRlciBhIGR1YWwgbGljZW5zZSwgaS5lLiBib3RoIHRoZSBjb25kaXRpb25zIG9mIHRoZQogT3BlblNTTCBMaWNlbnNlIGFuZCB0aGUgb3JpZ2luYWwgU1NMZWF5IGxpY2Vuc2UgYXBwbHkgdG8gdGhlIHRvb2xraXQuIFNlZSBiZWxvdwogZm9yIHRoZSBhY3R1YWwgbGljZW5zZSB0ZXh0cy4gQWN0dWFsbHkgYm90aCBsaWNlbnNlcyBhcmUgQlNELXN0eWxlIE9wZW4gU291cmNlCkBAIC0xNDcsMzkgKzE0NCwzIEBACiAgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCiAgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCiAgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLwotCi0KLVNvbWUgZmlsZXMgZnJvbSBJbnRlbCBjYXJyeSB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6Ci0KLSMgQ29weXJpZ2h0IChjKSAyMDEyLCBJbnRlbCBDb3Jwb3JhdGlvbgotIwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICogIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMKLSMgKiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgICAgZGlzdHJpYnV0aW9uLgotIwotIyAqICBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIElOVEVMIENPUlBPUkFUSU9OICIiQVMgSVMiIiBBTkQgQU5ZCi0jIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0jIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBJTlRFTCBDT1JQT1JBVElPTiBPUgotIyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSMgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotIyBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSMgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgotIyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotIyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS9zcmMvUE9SVElORy5tZCBiL3NyYy9QT1JUSU5HLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGI2N2NjLi4wMDAwMDAwCi0tLSBhL3NyYy9QT1JUSU5HLm1kCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLSMgUG9ydGluZyBmcm9tIE9wZW5TU0wgdG8gQm9yaW5nU1NMCi0KLUJvcmluZ1NTTCBpcyBhbiBPcGVuU1NMIGRlcml2YXRpdmUgYW5kIGlzIG1vc3RseSBzb3VyY2UtY29tcGF0aWJsZSwgZm9yIHRoZQotc3Vic2V0IG9mIE9wZW5TU0wgcmV0YWluZWQuIExpYnJhcmllcyBpZGVhbGx5IG5lZWQgbGl0dGxlIHRvIG5vIGNoYW5nZXMgZm9yCi1Cb3JpbmdTU0wgc3VwcG9ydCwgcHJvdmlkZWQgdGhleSBkbyBub3QgdXNlIHJlbW92ZWQgQVBJcy4gSW4gZ2VuZXJhbCwgc2VlIGlmIHRoZQotbGlicmFyeSBjb21waWxlcyBhbmQsIG9uIGZhaWx1cmUsIGNvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24gaW4gdGhlIGhlYWRlciBmaWxlcwotYW5kIHNlZSBpZiBwcm9ibGVtYXRpYyBmZWF0dXJlcyBjYW4gYmUgcmVtb3ZlZC4KLQotSW4gc29tZSBjYXNlcywgQm9yaW5nU1NMLXNwZWNpZmljIGNvZGUgbWF5IGJlIG5lY2Vzc2FyeS4gSW4gdGhhdCBjYXNlLCB0aGUKLWBPUEVOU1NMX0lTX0JPUklOR1NTTGAgcHJlcHJvY2Vzc29yIG1hY3JvIG1heSBiZSB1c2VkIGluIGAjaWZkZWZgcy4gVGhpcyBtYWNybwotc2hvdWxkIGFsc28gYmUgdXNlZCBpbiBsaWV1IG9mIHRoZSBwcmVzZW5jZSBvZiBhbnkgcGFydGljdWxhciBmdW5jdGlvbiB0byBkZXRlY3QKLU9wZW5TU0wgdnMgQm9yaW5nU1NMIGluIGNvbmZpZ3VyZSBzY3JpcHRzLCBldGMuLCB3aGVyZSB0aG9zZSBhcmUgbmVjZXNzYXJ5LgotCi1Gb3IgY29udmVuaWVuY2UsIEJvcmluZ1NTTCBkZWZpbmVzIHVwc3RyZWFtJ3MgYE9QRU5TU0xfTk9fKmAgZmVhdHVyZSBtYWNyb3MKLWNvcnJlc3BvbmRpbmcgdG8gcmVtb3ZlZCBmZWF0dXJlcy4gVGhlc2UgbWF5IGFsc28gYmUgdXNlZCB0byBkaXNhYmxlIGNvZGUgd2hpY2gKLXVzZXMgYSByZW1vdmVkIGZlYXR1cmUuCi0KLU5vdGU6IEJvcmluZ1NTTCBkb2VzICpub3QqIGhhdmUgYSBzdGFibGUgQVBJIG9yIEFCSS4gSXQgbXVzdCBiZSB1cGRhdGVkIHdpdGggaXRzCi1jb25zdW1lcnMuIEl0IGlzIG5vdCBzdWl0YWJsZSBmb3IsIHNheSwgYSBzeXN0ZW0gbGlicmFyeSBpbiBhIHRyYWRpdGlvbmFsIExpbnV4Ci1kaXN0cmlidXRpb24uIEZvciBpbnN0YW5jZSwgQ2hyb21pdW0gc3RhdGljYWxseSBsaW5rcyB0aGUgc3BlY2lmaWMgcmV2aXNpb24gb2YKLUJvcmluZ1NTTCBpdCB3YXMgYnVpbHQgYWdhaW5zdC4gTGlrZXdpc2UsIEFuZHJvaWQncyBzeXN0ZW0taW50ZXJuYWwgY29weSBvZgotQm9yaW5nU1NMIGlzIG5vdCBleHBvc2VkIGJ5IHRoZSBOREsgYW5kIG11c3Qgbm90IGJlIHVzZWQgYnkgdGhpcmQtcGFydHkKLWFwcGxpY2F0aW9ucy4KLQotCi0jIyBNYWpvciBBUEkgY2hhbmdlcwotCi0jIyMgSW50ZWdlciB0eXBlcwotCi1Tb21lIEFQSXMgaGF2ZSBiZWVuIGNvbnZlcnRlZCB0byB1c2UgYHNpemVfdGAgZm9yIGNvbnNpc3RlbmN5IGFuZCB0byBhdm9pZAotaW50ZWdlciBvdmVyZmxvd3MgYXQgdGhlIEFQSSBib3VuZGFyeS4gKEV4aXN0aW5nIGxvZ2ljIHVzZXMgYSBtaXNtYXNoIG9mIGBpbnRgLAotYGxvbmdgLCBhbmQgYHVuc2lnbmVkYC4pICBGb3IgdGhlIG1vc3QgcGFydCwgaW1wbGljaXQgY2FzdHMgbWVhbiB0aGF0IGV4aXN0aW5nCi1jb2RlIGNvbnRpbnVlcyB0byBjb21waWxlLiBJbiBzb21lIGNhc2VzLCB0aGlzIG1heSByZXF1aXJlIEJvcmluZ1NTTC1zcGVjaWZpYwotY29kZSwgcGFydGljdWxhcmx5IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgotCi1Nb3N0IG5vdGFibHksIHRoZSBgU1RBQ0tfT0YoVClgIHR5cGVzIGhhdmUgYWxsIGJlZW4gY29udmVydGVkIHRvIHVzZSBgc2l6ZV90YAotaW5zdGVhZCBvZiBgaW50YCBmb3IgaW5kaWNlcyBhbmQgbGVuZ3Rocy4KLQotIyMjIFJlZmVyZW5jZSBjb3VudHMKLQotU29tZSBleHRlcm5hbCBjb25zdW1lcnMgaW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudHMgZGlyZWN0bHkgYnkgY2FsbGluZwotYENSWVBUT19hZGRgIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgYENSWVBUT19MT0NLXypgIHZhbHVlLgotCi1UaGVzZSBBUElzIG5vIGxvbmdlciBleGlzdCBpbiBCb3JpbmdTU0wuIEluc3RlYWQsIGNvZGUgd2hpY2ggaW5jcmVtZW50cwotcmVmZXJlbmNlIGNvdW50cyBzaG91bGQgY2FsbCB0aGUgY29ycmVzcG9uZGluZyBgRk9PX3VwX3JlZmAgZnVuY3Rpb24sIHN1Y2ggYXMKLWBFVlBfUEtFWV91cF9yZWZgLiBOb3RlIHRoYXQgbm90IGFsbCBvZiB0aGVzZSBBUElzIGFyZSBwcmVzZW50IGluIE9wZW5TU0wgYW5kCi1tYXkgcmVxdWlyZSBgI2lmZGVmYHMuCi0KLSMjIyBFcnJvciBjb2RlcwotCi1PcGVuU1NMJ3MgZXJyb3JzIGFyZSBleHRyZW1lbHkgc3BlY2lmaWMsIGxlYWtpbmcgaW50ZXJuYWxzIG9mIHRoZSBsaWJyYXJ5LAotaW5jbHVkaW5nIGV2ZW4gYSBmdW5jdGlvbiBjb2RlIGZvciB0aGUgZnVuY3Rpb24gd2hpY2ggZW1pdHRlZCB0aGUgZXJyb3IhIEFzIHNvbWUKLWxvZ2ljIGluIEJvcmluZ1NTTCBoYXMgYmVlbiByZXdyaXR0ZW4sIGNvZGUgd2hpY2ggY29uZGl0aW9ucyBvbiB0aGUgZXJyb3IgbWF5Ci1icmVhayAoZ3JlcCBmb3IgYEVSUl9HRVRfUkVBU09OYCBhbmQgYEVSUl9HRVRfRlVOQ2ApLiBUaGlzIGRhbmdlciBhbHNvIGV4aXN0cwotd2hlbiB1cGdyYWRpbmcgT3BlblNTTCB2ZXJzaW9ucy4KLQotV2hlcmUgcG9zc2libGUsIGF2b2lkIGNvbmRpdGlvbmluZyBvbiB0aGUgZXhhY3QgZXJyb3IgcmVhc29uLiBPdGhlcndpc2UsIGEKLUJvcmluZ1NTTCBgI2lmZGVmYCBtYXkgYmUgbmVjZXNzYXJ5LiBFeGFjdGx5IGhvdyBiZXN0IHRvIHJlc29sdmUgdGhpcyBpc3N1ZSBpcwotc3RpbGwgYmVpbmcgZGV0ZXJtaW5lZC4gSXQncyBwb3NzaWJsZSBzb21lIG5ldyBBUElzIHdpbGwgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS4KLQotRnVuY3Rpb24gY29kZXMgaGF2ZSBiZWVuIGNvbXBsZXRlbHkgcmVtb3ZlZC4gUmVtb3ZlIGNvZGUgd2hpY2ggY29uZGl0aW9ucyBvbgotdGhlc2UgYXMgaXQgd2lsbCBicmVhayB3aXRoIHRoZSBzbGlnaHRlc3QgY2hhbmdlIGluIHRoZSBsaWJyYXJ5LCBPcGVuU1NMIG9yCi1Cb3JpbmdTU0wuCi0KLSMjIyBgKl9jdHJsYCBmdW5jdGlvbnMKLQotU29tZSBPcGVuU1NMIEFQSXMgYXJlIGltcGxlbWVudGVkIHdpdGggYGlvY3RsYC1zdHlsZSBmdW5jdGlvbnMgc3VjaCBhcwotYFNTTF9jdHJsYCBhbmQgYEVWUF9QS0VZX0NUWF9jdHJsYCwgY29tYmluZWQgd2l0aCBjb252ZW5pZW5jZSBtYWNyb3MsIHN1Y2ggYXMKLQotICAgICMgZGVmaW5lIFNTTF9DVFhfc2V0X21vZGUoY3R4LG9wKSBcCi0gICAgICAgICAgICBTU0xfQ1RYX2N0cmwoKGN0eCksU1NMX0NUUkxfTU9ERSwob3ApLE5VTEwpCi0KLUluIEJvcmluZ1NTTCwgdGhlc2UgbWFjcm9zIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIHByb3BlciBmdW5jdGlvbnMuIFRoZQotdW5kZXJseWluZyBgX2N0cmxgIGZ1bmN0aW9ucyBoYXZlIGJlZW4gcmVtb3ZlZC4KLQotRm9yIGNvbnZlbmllbmNlLCBgU1NMX0NUUkxfKmAgdmFsdWVzIGFyZSByZXRhaW5lZCBhcyBtYWNyb3MgdG8gYGRvZXNudF9leGlzdGAgc28KLWV4aXN0aW5nIGNvZGUgd2hpY2ggdXNlcyB0aGVtIChvciB0aGUgd3JhcHBlciBtYWNyb3MpIGluIGAjaWZkZWZgIGV4cHJlc3Npb25zCi13aWxsIGNvbnRpbnVlIHRvIGZ1bmN0aW9uLiBIb3dldmVyLCB0aGUgbWFjcm9zIHRoZW1zZWx2ZXMgd2lsbCBub3Qgd29yay4KLQotU3dpdGNoIGFueSBgKl9jdHJsYCBjYWxsZXJzIHRvIHRoZSBtYWNyby9mdW5jdGlvbiB2ZXJzaW9ucy4gVGhpcyB3b3JrcyBpbiBib3RoCi1PcGVuU1NMIGFuZCBCb3JpbmdTU0wuIE5vdGUgdGhhdCBCb3JpbmdTU0wncyBmdW5jdGlvbiB2ZXJzaW9ucyB3aWxsIGJlCi10eXBlLWNoZWNrZWQgYW5kIG1heSByZXF1aXJlIG1vcmUgY2FyZSB3aXRoIHR5cGVzLgotCi0jIyMgSE1BQyBgRVZQX1BLRVlgcwotCi1gRVZQX1BLRVlfSE1BQ2AgaXMgcmVtb3ZlZC4gVXNlIHRoZSBgSE1BQ18qYCBmdW5jdGlvbnMgaW4gYGhtYWMuaGAgaW5zdGVhZC4gVGhpcwotaXMgY29tcGF0aWJsZSB3aXRoIE9wZW5TU0wuCi0KLSMjIyBEU0EgYEVWUF9QS0VZYHMKLQotYEVWUF9QS0VZX0RTQWAgaXMgZGVwcmVjYXRlZC4gSXQgaXMgY3VycmVudGx5IHN0aWxsIHBvc3NpYmxlIHRvIHBhcnNlIERFUiBpbnRvIGEKLURTQSBgRVZQX1BLRVlgLCBidXQgc2lnbmluZyBvciB2ZXJpZnlpbmcgd2l0aCB0aG9zZSBvYmplY3RzIHdpbGwgbm90IHdvcmsuCi0KLSMjIyBERVMKLQotVGhlIGBERVNfY2Jsb2NrYCB0eXBlIGhhcyBiZWVuIHN3aXRjaGVkIGZyb20gYW4gYXJyYXkgdG8gYSBzdHJ1Y3QgdG8gYXZvaWQgdGhlCi1waXRmYWxscyBhcm91bmQgYXJyYXkgdHlwZXMgaW4gQy4gV2hlcmUgZmVhdHVyZXMgd2hpY2ggcmVxdWlyZSBERVMgY2Fubm90IGJlCi1kaXNhYmxlZCwgQm9yaW5nU1NMLXNwZWNpZmljIGNvZGVwYXRocyBtYXkgYmUgbmVjZXNzYXJ5LgotCi0jIyMgVExTIHJlbmVnb3RpYXRpb24KLQotT3BlblNTTCBlbmFibGVzIFRMUyByZW5lZ290aWF0aW9uIGJ5IGRlZmF1bHQgYW5kIGFjY2VwdHMgcmVuZWdvdGlhdGlvbiByZXF1ZXN0cwotZnJvbSB0aGUgcGVlciB0cmFuc3BhcmVudGx5LiBSZW5lZ290aWF0aW9uIGlzIGFuIGV4dHJlbWVseSBwcm9ibGVtYXRpYyBwcm90b2NvbAotZmVhdHVyZSwgc28gQm9yaW5nU1NMIHJlamVjdHMgcGVlciByZW5lZ290aWF0aW9ucyBieSBkZWZhdWx0LgotCi1UbyBlbmFibGUgcmVuZWdvdGlhdGlvbiwgY2FsbCBgU1NMX3NldF9yZWplY3RfcGVlcl9yZW5lZ290aWF0aW9uc2AgYW5kIHNldCBpdCB0bwotb2ZmLiBSZW5lZ290aWF0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGFzIGEgY2xpZW50IGluIFNTTDMvVExTIGFuZCB0aGUKLUhlbGxvUmVxdWVzdCBtdXN0IGJlIHJlY2VpdmVkIGF0IGEgcXVpZXQgcG9pbnQgaW4gdGhlIGFwcGxpY2F0aW9uIHByb3RvY29sLiBUaGlzCi1pcyBzdWZmaWNpZW50IHRvIHN1cHBvcnQgdGhlIGNvbW1vbiB1c2Ugb2YgcmVxdWVzdGluZyBhIG5ldyBjbGllbnQgY2VydGlmaWNhdGUKLWJldHdlZW4gYW4gSFRUUCByZXF1ZXN0IGFuZCByZXNwb25zZSBpbiAodW5waXBlbGluZWQpIEhUVFAvMS4xLgotCi1UaGluZ3Mgd2hpY2ggZG8gbm90IHdvcms6Ci0KLSogVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgcmVuZWdvdGlhdGlvbiBhcyBhIHNlcnZlci4KLQotKiBUaGVyZSBpcyBubyBzdXBwb3J0IGZvciByZW5lZ290aWF0aW9uIGluIERUTFMuCi0KLSogVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgaW5pdGlhdGluZyByZW5lZ290aWF0aW9uOyBgU1NMX3JlbmVnb3RpYXRlYCBhbHdheXMKLSAgZmFpbHMgYW5kIGBTU0xfc2V0X3N0YXRlYCBkb2VzIG5vdGhpbmcuCi0KLSogSW50ZXJsZWF2aW5nIGFwcGxpY2F0aW9uIGRhdGEgd2l0aCB0aGUgbmV3IGhhbmRzaGFrZSBpcyBmb3JiaWRkZW4uCi0KLSogSWYgYSBIZWxsb1JlcXVlc3QgaXMgcmVjZWl2ZWQgd2hpbGUgYFNTTF93cml0ZWAgaGFzIHVuc2VudCBhcHBsaWNhdGlvbiBkYXRhLAotICB0aGUgcmVuZWdvdGlhdGlvbiBpcyByZWplY3RlZC4KLQotCi0jIyBPcHRpb25hbCBCb3JpbmdTU0wtc3BlY2lmaWMgc2ltcGxpZmljYXRpb25zCi0KLUJvcmluZ1NTTCBtYWtlcyBzb21lIGNoYW5nZXMgdG8gT3BlblNTTCB3aGljaCBzaW1wbGlmeSB0aGUgQVBJIGJ1dCByZW1haW4KLWNvbXBhdGlibGUgd2l0aCBPcGVuU1NMIGNvbnN1bWVycy4gSW4gZ2VuZXJhbCwgY29uc3VsdCB0aGUgQm9yaW5nU1NMCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgZnVuY3Rpb25zIGluIG5ldyBCb3JpbmdTU0wtb25seSBjb2RlLgotCi0jIyMgUmV0dXJuIHZhbHVlcwotCi1Nb3N0IE9wZW5TU0wgQVBJcyByZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCBlaXRoZXIgMCBvciAtMSBvbiBmYWlsdXJlLiBCb3JpbmdTU0wKLWhhcyBuYXJyb3dlZCBtb3N0IG9mIHRoZXNlIHRvIDEgb24gc3VjY2VzcyBhbmQgMCBvbiBmYWlsdXJlLiBCb3JpbmdTU0wtc3BlY2lmaWMKLWNvZGUgbWF5IHRha2UgYWR2YW50YWdlIG9mIHRoZSBsZXNzIGVycm9yLXByb25lIEFQSXMgYW5kIHVzZSBgIWAgdG8gY2hlY2sgZm9yCi1lcnJvcnMuCi0KLSMjIyBJbml0aWFsaXphdGlvbgotCi1PcGVuU1NMIGhhcyBhIG51bWJlciBvZiBkaWZmZXJlbnQgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIGZvciBzZXR0aW5nIHVwIGVycm9yCi1zdHJpbmdzIGFuZCBsb2FkaW5nIGFsZ29yaXRobXMsIGV0Yy4gQWxsIG9mIHRoZXNlIGZ1bmN0aW9ucyBzdGlsbCBleGlzdCBpbgotQm9yaW5nU1NMIGZvciBjb252ZW5pZW5jZSwgYnV0IHRoZXkgZG8gbm90aGluZyBhbmQgYXJlIG5vdCBuZWNlc3NhcnkuCi0KLVRoZSBvbmUgZXhjZXB0aW9uIGlzIGBDUllQVE9fbGlicmFyeV9pbml0YCAoYW5kIGBTU0xfbGlicmFyeV9pbml0YCB3aGljaCBtZXJlbHkKLWNhbGxzIGl0KS4gSW4gYEJPUklOR1NTTF9OT19TVEFUSUNfSU5JVElBTElaRVJgIGJ1aWxkcywgaXQgbXVzdCBiZSBjYWxsZWQgdG8KLXF1ZXJ5IENQVSBjYXBhYml0aWxpZXMgYmVmb3JlIHRoZSByZXN0IG9mIHRoZSBsaWJyYXJ5LiBJbiB0aGUgZGVmYXVsdAotY29uZmlndXJhdGlvbiwgdGhpcyBpcyBkb25lIHdpdGggYSBzdGF0aWMgaW5pdGlhbGl6ZXIgYW5kIGlzIGFsc28gdW5uZWNlc3NhcnkuCi0KLSMjIyBUaHJlYWRpbmcKLQotT3BlblNTTCBwcm92aWRlcyBhIG51bWJlciBvZiBBUElzIHRvIGNvbmZpZ3VyZSB0aHJlYWRpbmcgY2FsbGJhY2tzIGFuZCBzZXQgdXAKLWxvY2tzLiBXaXRob3V0IGluaXRpYWxpemluZyB0aGVzZSwgdGhlIGxpYnJhcnkgaXMgbm90IHRocmVhZC1zYWZlLiBDb25maWd1cmluZwotdGhlc2UgZG9lcyBub3RoaW5nIGluIEJvcmluZ1NTTC4gSW5zdGVhZCwgQm9yaW5nU1NMIGNhbGxzIHB0aHJlYWRzIGFuZCB0aGUKLWNvcnJlc3BvbmRpbmcgV2luZG93cyBBUElzIGludGVybmFsbHkgYW5kIGlzIGFsd2F5cyB0aHJlYWQtc2FmZSB3aGVyZSB0aGUgQVBJCi1ndWFyYW50ZWVzIGl0LgpkaWZmIC0tZ2l0IGEvc3JjL1NUWUxFIGIvc3JjL1NUWUxFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OGRhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvU1RZTEUKQEAgLTAsMCArMSwxOTggQEAKK0JvcmluZ1NTTCBTdHlsZSBHdWlkZS4KKworQm9yaW5nU1NMIHVzdWFsbHkgZm9sbG93cyB0aGUgR29vZ2xlIEMrKyBzdHlsZSBndWlkZSwgZm91bmQgYmVsb3cuIFRoZQorcmVzdCBvZiB0aGlzIGRvY3VtZW50IGRlc2NyaWJlcyBkaWZmZXJlbmNlcyBhbmQgY2xhcmlmaWNhdGlvbnMgb24gdG9wCitvZiB0aGUgYmFzZSBndWlkZS4KKworaHR0cHM6Ly9nb29nbGUtc3R5bGVndWlkZS5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvY3BwZ3VpZGUuaHRtbAorCisKK0xlZ2FjeSBjb2RlLgorCitBcyBhIGRlcml2YXRpdmUgb2YgT3BlblNTTCwgQm9yaW5nU1NMIGNvbnRhaW5zIGEgbG90IG9mIGxlZ2FjeSBjb2RlCit0aGF0IGRvZXMgbm90IGZvbGxvdyB0aGlzIHN0eWxlIGd1aWRlLiBQYXJ0aWN1bGFybHkgd2hlcmUgcHVibGljIEFQSQoraXMgY29uY2VybmVkLCBiYWxhbmNlIGNvbnNpc3RlbmN5IHdpdGhpbiBhIG1vZHVsZSB3aXRoIHRoZSBiZW5lZml0cyBvZgorYSBnaXZlbiBydWxlLiBNb2R1bGUtd2lkZSBkZXZpYXRpb25zIG9uIG5hbWluZyBzaG91bGQgYmUgcmVzcGVjdGVkCit3aGlsZSBpbnRlZ2VyIGFuZCByZXR1cm4gdmFsdWUgY29udmVudGlvbnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIKK2NvbnNpc3RlbmN5LgorCitTb21lIG1vZHVsZXMgaGF2ZSBzZWVuIGZldyBjaGFuZ2VzLCBzbyB0aGV5IHN0aWxsIHJldGFpbiB0aGUgb3JpZ2luYWwKK2luZGVudGF0aW9uIHN0eWxlIGZvciBub3cuIFdoZW4gZWRpdGluZyB0aGVzZSwgdHJ5IHRvIHJldGFpbiB0aGUKK29yaWdpbmFsIHN0eWxlLiBGb3IgRW1hY3MsIGRvYy9jLWluZGVudGF0aW9uLmVsIGZyb20gT3BlblNTTCBtYXkgYmUKK2hlbHBmdWwgaW4gdGhpcy4KKworCitMYW5ndWFnZS4KKworVGhlIG1ham9yaXR5IG9mIHRoZSBwcm9qZWN0IGlzIGluIEMsIHNvIEMrKy1zcGVjaWZpYyBydWxlcyBpbiB0aGUKK0dvb2dsZSBzdHlsZSBndWlkZSBkbyBub3QgYXBwbHkuIFN1cHBvcnQgZm9yIEM5OSBmZWF0dXJlcyBkZXBlbmRzIG9uCitvdXIgdGFyZ2V0IHBsYXRmb3Jtcy4gVHlwaWNhbGx5LCBDaHJvbWl1bSdzIHRhcmdldCBNU1ZDIGlzIHRoZSBtb3N0CityZXN0cmljdGl2ZS4KKworVmFyaWFibGUgZGVjbGFyYXRpb25zIGluIHRoZSBtaWRkbGUgb2YgYSBmdW5jdGlvbiBhcmUgYWxsb3dlZC4KKworQ29tbWVudHMgc2hvdWxkIGJlIC8qIEMtc3R5bGUgKi8gZm9yIGNvbnNpc3RlbmN5LgorCitXaGVuIGRlY2xhcmF0aW9uIHBvaW50ZXIgdHlwZXMsICogc2hvdWxkIGJlIHBsYWNlZCBuZXh0IHRvIHRoZSB2YXJpYWJsZQorbmFtZSwgbm90IHRoZSB0eXBlLiBTbworCisgIHVpbnQ4X3QgKnB0cjsKKworbm90CisKKyAgdWludDhfdCogcHRyOworCitSYXRoZXIgdGhhbiBtYWxsb2MoKSBhbmQgZnJlZSgpLCB1c2UgdGhlIHdyYXBwZXJzIE9QRU5TU0xfbWFsbG9jKCkgYW5kCitPUEVOU1NMX2ZyZWUoKS4gVXNlIHRoZSBzdGFuZGFyZCBDIGFzc2VydCgpIGZ1bmN0aW9uIGZyZWVseS4KKworRm9yIG5ldyBjb25zdGFudHMsIHByZWZlciBlbnVtcyB3aGVuIHRoZSB2YWx1ZXMgYXJlIHNlcXVlbnRpYWwgYW5kIHR5cGVkCitjb25zdGFudHMgZm9yIGZsYWdzLiBJZiBhZGRpbmcgdmFsdWVzIHRvIGFuIGV4aXN0aW5nIHNldCBvZiAjZGVmaW5lcywgY29udGludWUKK3dpdGggI2RlZmluZS4KKworCitGb3JtYXR0aW5nLgorCitTaW5nbGUtc3RhdGVtZW50IGJsb2NrcyBhcmUgbm90IGFsbG93ZWQuIEFsbCBjb25kaXRpb25zIGFuZCBsb29wcyBtdXN0Cit1c2UgYnJhY2VzOgorCisgIGlmIChmb28pIHsKKyAgICBkb19zb21ldGhpbmcoKTsKKyAgfQorCitub3QKKworICBpZiAoZm9vKQorICAgIGRvX3NvbWV0aGluZygpOworCisKK0ludGVnZXJzLgorCitQcmVmZXIgdXNpbmcgZXhwbGljaXRseS1zaXplZCBpbnRlZ2VycyB3aGVyZSBhcHByb3ByaWF0ZSByYXRoZXIgdGhhbgorZ2VuZXJpYyBDIG9uZXMuIEZvciBpbnN0YW5jZSwgdG8gcmVwcmVzZW50IGEgYnl0ZSwgdXNlIHVpbnQ4X3QsIG5vdAordW5zaWduZWQgY2hhci4gTGlrZXdpc2UsIHJlcHJlc2VudCBhIHR3by1ieXRlIGZpZWxkIGFzIHVpbnQxNl90LCBub3QKK3Vuc2lnbmVkIHNob3J0LgorCitTaXplcyBhcmUgcmVwcmVzZW50ZWQgYXMgc2l6ZV90LgorCitXaXRoaW4gYSBzdHJ1Y3QgdGhhdCBpcyByZXRhaW5lZCBhY3Jvc3MgdGhlIGxpZmV0aW1lIG9mIGFuIFNTTAorY29ubmVjdGlvbiwgaWYgYm91bmRzIG9mIGEgc2l6ZSBhcmUga25vd24gYW5kIGl0J3MgZWFzeSwgdXNlIGEgc21hbGxlcgoraW50ZWdlciB0eXBlIGxpa2UgdWludDhfdC4gVGhpcyBpcyBhICJmcmVlIiBjb25uZWN0aW9uIGZvb3RwcmludAorb3B0aW1pemF0aW9uIGZvciBzZXJ2ZXJzLiBEb24ndCBtYWtlIGNvZGUgc2lnbmlmaWNhbnRseSBtb3JlIGNvbXBsZXgKK2ZvciBpdCwgYW5kIGRvIHN0aWxsIGNoZWNrIHRoZSBib3VuZHMgd2hlbiBwYXNzaW5nIGluIGFuZCBvdXQgb2YgdGhlCitzdHJ1Y3QuIFRoaXMgbmFycm93aW5nIHNob3VsZCBub3QgcHJvcGFnYXRlIHRvIGxvY2FsIHZhcmlhYmxlcyBhbmQKK2Z1bmN0aW9uIHBhcmFtZXRlcnMuCisKK1doZW4gZG9pbmcgYXJpdGhtZXRpYywgYWNjb3VudCBmb3Igb3ZlcmZsb3cgY29uZGl0aW9ucy4KKworRXhjZXB0IHdpdGggcGxhdGZvcm0gQVBJcywgZG8gbm90IHVzZSBzc2l6ZV90LiBNU1ZDIGxhY2tzIGl0LCBhbmQKK3ByZWZlciBvdXQtb2YtYmFuZCBlcnJvciBzaWduYWxpbmcgZm9yIHNpemVfdCAoc2VlIFJldHVybiB2YWx1ZXMpLgorCisKK05hbWluZy4KKworRm9sbG93IEdvb2dsZSBuYW1pbmcgY29udmVudGlvbnMgaW4gQysrIGZpbGVzLiBJbiBDIGZpbGVzLCB1c2UgdGhlCitmb2xsb3dpbmcgbmFtaW5nIGNvbnZlbnRpb25zIGZvciBjb25zaXN0ZW5jeSB3aXRoIGV4aXN0aW5nIE9wZW5TU0wgYW5kIEMKK3N0eWxlczoKKworRGVmaW5lIHN0cnVjdHMgd2l0aCB0eXBlZGVmIG5hbWVkIFRZUEVfTkFNRS4gVGhlIGNvcnJlc3BvbmRpbmcgc3RydWN0CitzaG91bGQgYmUgbmFtZWQgc3RydWN0IHR5cGVfbmFtZV9zdC4KKworTmFtZSBwdWJsaWMgZnVuY3Rpb25zIGFzIE1PRFVMRV9mdW5jdGlvbl9uYW1lLCB1bmxlc3MgdGhlIG1vZHVsZQorYWxyZWFkeSB1c2VzIGEgZGlmZmVyZW50IG5hbWluZyBzY2hlbWUgZm9yIGxlZ2FjeSByZWFzb25zLiBUaGUgbW9kdWxlCituYW1lIHNob3VsZCBiZSBhIHR5cGUgbmFtZSBpZiB0aGUgZnVuY3Rpb24gaXMgYSBtZXRob2Qgb2YgYSBwYXJ0aWN1bGFyCit0eXBlLgorCitTb21lIHR5cGVzIGFyZSBhbGxvY2F0ZWQgd2l0aGluIHRoZSBsaWJyYXJ5IHdoaWxlIG90aGVycyBhcmUKK2luaXRpYWxpemVkIGludG8gYSBzdHJ1Y3QgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIsIG9mdGVuIG9uIHRoZQorc3RhY2suIE5hbWUgdGhlc2UgZnVuY3Rpb25zIFRZUEVfTkFNRV9uZXcvVFlQRV9OQU1FX2ZyZWUgYW5kCitUWVBFX05BTUVfaW5pdC9UWVBFX05BTUVfY2xlYW51cCwgcmVzcGVjdGl2ZWx5LiBBbGwgVFlQRV9OQU1FX2ZyZWUKK2Z1bmN0aW9ucyBtdXN0IGRvIG5vdGhpbmcgb24gTlVMTCBpbnB1dC4KKworSWYgYSB2YXJpYWJsZSBpcyB0aGUgbGVuZ3RoIG9mIGEgcG9pbnRlciB2YWx1ZSwgaXQgaGFzIHRoZSBzdWZmaXgKK19sZW4uIEFuIG91dHB1dCBwYXJhbWV0ZXIgaXMgbmFtZWQgb3V0IG9yIGhhcyBhbiBvdXRfIHByZWZpeC4gRm9yCitpbnN0YW5jZSwgRm9yIGluc3RhbmNlOgorCisgIHVpbnQ4X3QgKm91dCwKKyAgc2l6ZV90ICpvdXRfbGVuLAorICBjb25zdCB1aW50OF90ICppbiwKKyAgc2l6ZV90IGluX2xlbiwKKworTmFtZSBwdWJsaWMgaGVhZGVycyBsaWtlIGluY2x1ZGUvb3BlbnNzbC9ldnAuaCB3aXRoIGhlYWRlciBndWFyZHMgbGlrZQorT1BFTlNTTF9IRUFERVJfRVZQX0guIE5hbWUgaW50ZXJuYWwgaGVhZGVycyBsaWtlIGNyeXB0by9lYy9pbnRlcm5hbC5oCit3aXRoIGhlYWRlciBndWFyZHMgbGlrZSBPUEVOU1NMX0hFQURFUl9FQ19JTlRFUk5BTF9ILgorCitOYW1lIGVudW1zIGxpa2UgdW5peF9oYWNrZXJfdC4gRm9yIGluc3RhbmNlOgorCitlbnVtIHNob3VsZF9mcmVlX2hhbmRzaGFrZV9idWZmZXJfdCB7CisgIGZyZWVfaGFuZHNoYWtlX2J1ZmZlciwKKyAgZG9udF9mcmVlX2hhbmRzaGFrZV9idWZmZXIsCit9OworCisKK1JldHVybiB2YWx1ZXMuCisKK0FzIGV2ZW4gbWFsbG9jIG1heSBmYWlsIGluIEJvcmluZ1NTTCwgdGhlIHZhc3QgbWFqb3JpdHkgb2YgZnVuY3Rpb25zCit3aWxsIGhhdmUgYSBmYWlsdXJlIGNhc2UuIEZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIGludCB3aXRoIG9uZSBvbgorc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gRG8gbm90IG92ZXJsb2FkIHRoZSByZXR1cm4gdmFsdWUgdG8gYm90aAorc2lnbmFsIHN1Y2Nlc3MvZmFpbHVyZSBhbmQgb3V0cHV0IGFuIGludGVnZXIuIEZvciBleGFtcGxlOgorCisgIE9QRU5TU0xfRVhQT1JUIGludCBDQlNfZ2V0X3UxNihDQlMgKmNicywgdWludDE2X3QgKm91dCk7CisKK0lmIGEgZnVuY3Rpb24gbmVlZHMgbW9yZSB0aGFuIGEgdHJ1ZS9mYWxzZSByZXN1bHQgY29kZSwgZGVmaW5lIGFuIGVudW0KK3JhdGhlciB0aGFuIGFyYml0cmFyaWx5IGFzc2lnbmluZyBtZWFuaW5nIHRvIGludCB2YWx1ZXMuCisKK0lmIGEgZnVuY3Rpb24gb3V0cHV0cyBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0IG9uIHN1Y2Nlc3MgYW5kIHRoZXJlIGFyZSBubworb3RoZXIgb3V0cHV0cywgcmV0dXJuIHRoZSBwb2ludGVyIGRpcmVjdGx5IGFuZCBOVUxMIG9uIGVycm9yLgorCisKK1BhcmFtZXRlcnMuCisKK1doZXJlIG5vdCBjb25zdHJhaW5lZCBieSBsZWdhY3kgY29kZSwgcGFyYW1ldGVyIG9yZGVyIHNob3VsZCBiZToKKworMS4gY29udGV4dCBwYXJhbWV0ZXJzCisyLiBvdXRwdXQgcGFyYW1ldGVycworMy4gaW5wdXQgcGFyYW1ldGVycworCitGb3IgZXhhbXBsZSwKKworLyogQ0JCX2FkZF9hc24gc2V0cyB8Km91dF9jb250ZW50c3wgdG8gYSB8Q0JCfCBpbnRvIHdoaWNoIHRoZSBjb250ZW50cyBvZiBhbgorICogQVNOLjEgb2JqZWN0IGNhbiBiZSB3cml0dGVuLiBUaGUgfHRhZ3wgYXJndW1lbnQgd2lsbCBiZSB1c2VkIGFzIHRoZSB0YWcgZm9yCisgKiB0aGUgb2JqZWN0LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24gZXJyb3IuICovCitPUEVOU1NMX0VYUE9SVCBpbnQgQ0JCX2FkZF9hc24xKENCQiAqY2JiLCBDQkIgKm91dF9jb250ZW50cywgdWludDhfdCB0YWcpOworCisKK0RvY3VtZW50YXRpb24uCisKK0FsbCBwdWJsaWMgc3ltYm9scyBtdXN0IGhhdmUgYSBkb2N1bWVudGF0aW9uIGNvbW1lbnQgaW4gdGhlaXIgaGVhZGVyCitmaWxlLiBUaGUgc3R5bGUgaXMgYmFzZWQgb24gdGhhdCBvZiBHby4gVGhlIGZpcnN0IHNlbnRlbmNlIGJlZ2lucyB3aXRoCit0aGUgc3ltYm9sIG5hbWUsIG9wdGlvbmFsbHkgcHJlZml4ZWQgd2l0aCAiQSIgb3IgIkFuIi4gQXBhcnQgZnJvbSB0aGUKK2luaXRpYWwgbWVudGlvbiBvZiBzeW1ib2wsIHJlZmVyZW5jZXMgdG8gb3RoZXIgc3ltYm9scyBvciBwYXJhbWV0ZXIKK25hbWVzIHNob3VsZCBiZSBzdXJyb3VuZGVkIGJ5IHxwaXBlc3wuCisKK0RvY3VtZW50YXRpb24gc2hvdWxkIGJlIGNvbmNpc2UgYnV0IGNvbXBsZXRlbHkgZGVzY3JpYmUgdGhlIGV4cG9zZWQKK2JlaGF2aW9yIG9mIHRoZSBmdW5jdGlvbi4gUGF5IHNwZWNpYWwgbm90ZSB0byBzdWNjZXNzL2ZhaWx1cmUgYmVoYXZpb3JzCithbmQgY2FsbGVyIG9ibGlnYXRpb25zIG9uIG9iamVjdCBsaWZldGltZXMuIElmIHRoaXMgc2FjcmlmaWNlcworY29uY2lzZW5lc3MsIGNvbnNpZGVyIHNpbXBsaWZ5aW5nIHRoZSBmdW5jdGlvbidzIGJlaGF2aW9yLgorCisvKiBFVlBfRGlnZXN0VmVyaWZ5VXBkYXRlIGFwcGVuZHMgfGxlbnwgYnl0ZXMgZnJvbSB8ZGF0YXwgdG8gdGhlIGRhdGEgd2hpY2gKKyAqIHdpbGwgYmUgdmVyaWZpZWQgYnkgfEVWUF9EaWdlc3RWZXJpZnlGaW5hbHwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kCisgKiB6ZXJvIG90aGVyd2lzZS4gKi8KK09QRU5TU0xfRVhQT1JUIGludCBFVlBfRGlnZXN0VmVyaWZ5VXBkYXRlKEVWUF9NRF9DVFggKmN0eCwgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pOworCitFeHBsaWNpdGx5IG1lbnRpb24gYW55IHN1cnByaXNpbmcgZWRnZSBjYXNlcyBvciBkZXZpYXRpb25zIGZyb20gY29tbW9uCityZXR1cm4gdmFsdWUgcGF0dGVybnMgaW4gbGVnYWN5IGZ1bmN0aW9ucy4KKworLyogUlNBX3ByaXZhdGVfZW5jcnlwdCBlbmNyeXB0cyB8ZmxlbnwgYnl0ZXMgZnJvbSB8ZnJvbXwgd2l0aCB0aGUgcHJpdmF0ZSBrZXkgaW4KKyAqIHxyc2F8IGFuZCB3cml0ZXMgdGhlIGVuY3J5cHRlZCBkYXRhIHRvIHx0b3wuIFRoZSB8dG98IGJ1ZmZlciBtdXN0IGhhdmUgYXQKKyAqIGxlYXN0IHxSU0Ffc2l6ZXwgYnl0ZXMgb2Ygc3BhY2UuIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLCBvcgorICogLTEgb24gZXJyb3IuIFRoZSB8cGFkZGluZ3wgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHxSU0FfKl9QQURESU5HfAorICogdmFsdWVzLiBJZiBpbiBkb3VidCwgfFJTQV9QS0NTMV9QQURESU5HfCBpcyB0aGUgbW9zdCBjb21tb24uCisgKgorICogV0FSTklORzogdGhpcyBmdW5jdGlvbiBpcyBkYW5nZXJvdXMgYmVjYXVzZSBpdCBicmVha3MgdGhlIHVzdWFsIHJldHVybiB2YWx1ZQorICogY29udmVudGlvbi4gVXNlIHxSU0Ffc2lnbl9yYXd8IGluc3RlYWQuICovCitPUEVOU1NMX0VYUE9SVCBpbnQgUlNBX3ByaXZhdGVfZW5jcnlwdChpbnQgZmxlbiwgY29uc3QgdWludDhfdCAqZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnRvLCBSU0EgKnJzYSwgaW50IHBhZGRpbmcpOworCitEb2N1bWVudCBwcml2YXRlIGZ1bmN0aW9ucyBpbiB0aGVpciBpbnRlcm5hbC5oIGhlYWRlciBvciwgaWYgc3RhdGljLAord2hlcmUgZGVmaW5lZC4KZGlmZiAtLWdpdCBhL3NyYy9TVFlMRS5tZCBiL3NyYy9TVFlMRS5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUxZGU3OC4uMDAwMDAwMAotLS0gYS9zcmMvU1RZTEUubWQKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotIyBCb3JpbmdTU0wgU3R5bGUgR3VpZGUKLQotQm9yaW5nU1NMIHVzdWFsbHkgZm9sbG93cyB0aGUKLVtHb29nbGUgQysrIHN0eWxlIGd1aWRlXShodHRwczovL2dvb2dsZS1zdHlsZWd1aWRlLmdvb2dsZWNvZGUuY29tL3N2bi90cnVuay9jcHBndWlkZS5odG1sKS4KLVRoZSByZXN0IG9mIHRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGRpZmZlcmVuY2VzIGFuZCBjbGFyaWZpY2F0aW9ucyBvbgotdG9wIG9mIHRoZSBiYXNlIGd1aWRlLgotCi0KLSMjIExlZ2FjeSBjb2RlCi0KLUFzIGEgZGVyaXZhdGl2ZSBvZiBPcGVuU1NMLCBCb3JpbmdTU0wgY29udGFpbnMgYSBsb3Qgb2YgbGVnYWN5IGNvZGUgdGhhdAotZG9lcyBub3QgZm9sbG93IHRoaXMgc3R5bGUgZ3VpZGUuIFBhcnRpY3VsYXJseSB3aGVyZSBwdWJsaWMgQVBJIGlzCi1jb25jZXJuZWQsIGJhbGFuY2UgY29uc2lzdGVuY3kgd2l0aGluIGEgbW9kdWxlIHdpdGggdGhlIGJlbmVmaXRzIG9mIGEKLWdpdmVuIHJ1bGUuIE1vZHVsZS13aWRlIGRldmlhdGlvbnMgb24gbmFtaW5nIHNob3VsZCBiZSByZXNwZWN0ZWQgd2hpbGUKLWludGVnZXIgYW5kIHJldHVybiB2YWx1ZSBjb252ZW50aW9ucyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBjb25zaXN0ZW5jeS4KLQotU29tZSBtb2R1bGVzIGhhdmUgc2VlbiBmZXcgY2hhbmdlcywgc28gdGhleSBzdGlsbCByZXRhaW4gdGhlIG9yaWdpbmFsCi1pbmRlbnRhdGlvbiBzdHlsZSBmb3Igbm93LiBXaGVuIGVkaXRpbmcgdGhlc2UsIHRyeSB0byByZXRhaW4gdGhlCi1vcmlnaW5hbCBzdHlsZS4gRm9yIEVtYWNzLCBgZG9jL2MtaW5kZW50YXRpb24uZWxgIGZyb20gT3BlblNTTCBtYXkgYmUKLWhlbHBmdWwgaW4gdGhpcy4KLQotCi0jIyBMYW5ndWFnZQotCi1UaGUgbWFqb3JpdHkgb2YgdGhlIHByb2plY3QgaXMgaW4gQywgc28gQysrLXNwZWNpZmljIHJ1bGVzIGluIHRoZQotR29vZ2xlIHN0eWxlIGd1aWRlIGRvIG5vdCBhcHBseS4gU3VwcG9ydCBmb3IgQzk5IGZlYXR1cmVzIGRlcGVuZHMgb24KLW91ciB0YXJnZXQgcGxhdGZvcm1zLiBUeXBpY2FsbHksIENocm9taXVtJ3MgdGFyZ2V0IE1TVkMgaXMgdGhlIG1vc3QKLXJlc3RyaWN0aXZlLgotCi1WYXJpYWJsZSBkZWNsYXJhdGlvbnMgaW4gdGhlIG1pZGRsZSBvZiBhIGZ1bmN0aW9uIGFyZSBhbGxvd2VkLgotCi1Db21tZW50cyBzaG91bGQgYmUgYC8qIEMtc3R5bGUgKi9gIGZvciBjb25zaXN0ZW5jeS4KLQotV2hlbiBkZWNsYXJhdGlvbiBwb2ludGVyIHR5cGVzLCBgKmAgc2hvdWxkIGJlIHBsYWNlZCBuZXh0IHRvIHRoZSB2YXJpYWJsZQotbmFtZSwgbm90IHRoZSB0eXBlLiBTbwotCi0gICAgdWludDhfdCAqcHRyOwotCi1ub3QKLQotICAgIHVpbnQ4X3QqIHB0cjsKLQotUmF0aGVyIHRoYW4gYG1hbGxvYygpYCBhbmQgYGZyZWUoKWAsIHVzZSB0aGUgd3JhcHBlcnMgYE9QRU5TU0xfbWFsbG9jKClgCi1hbmQgYE9QRU5TU0xfZnJlZSgpYC4gVXNlIHRoZSBzdGFuZGFyZCBDIGBhc3NlcnQoKWAgZnVuY3Rpb24gZnJlZWx5LgotCi1Gb3IgbmV3IGNvbnN0YW50cywgcHJlZmVyIGVudW1zIHdoZW4gdGhlIHZhbHVlcyBhcmUgc2VxdWVudGlhbCBhbmQgdHlwZWQKLWNvbnN0YW50cyBmb3IgZmxhZ3MuIElmIGFkZGluZyB2YWx1ZXMgdG8gYW4gZXhpc3Rpbmcgc2V0IG9mIGAjZGVmaW5lYHMsCi1jb250aW51ZSB3aXRoIGAjZGVmaW5lYC4KLQotCi0jIyBGb3JtYXR0aW5nCi0KLVNpbmdsZS1zdGF0ZW1lbnQgYmxvY2tzIGFyZSBub3QgYWxsb3dlZC4gQWxsIGNvbmRpdGlvbnMgYW5kIGxvb3BzIG11c3QKLXVzZSBicmFjZXM6Ci0KLSAgICBpZiAoZm9vKSB7Ci0gICAgICBkb19zb21ldGhpbmcoKTsKLSAgICB9Ci0KLW5vdAotCi0gICAgaWYgKGZvbykKLSAgICAgIGRvX3NvbWV0aGluZygpOwotCi0KLSMjIEludGVnZXJzCi0KLVByZWZlciB1c2luZyBleHBsaWNpdGx5LXNpemVkIGludGVnZXJzIHdoZXJlIGFwcHJvcHJpYXRlIHJhdGhlciB0aGFuCi1nZW5lcmljIEMgb25lcy4gRm9yIGluc3RhbmNlLCB0byByZXByZXNlbnQgYSBieXRlLCB1c2UgYHVpbnQ4X3RgLCBub3QKLWB1bnNpZ25lZCBjaGFyYC4gTGlrZXdpc2UsIHJlcHJlc2VudCBhIHR3by1ieXRlIGZpZWxkIGFzIGB1aW50MTZfdGAsIG5vdAotYHVuc2lnbmVkIHNob3J0YC4KLQotU2l6ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGBzaXplX3RgLgotCi1XaXRoaW4gYSBzdHJ1Y3QgdGhhdCBpcyByZXRhaW5lZCBhY3Jvc3MgdGhlIGxpZmV0aW1lIG9mIGFuIFNTTAotY29ubmVjdGlvbiwgaWYgYm91bmRzIG9mIGEgc2l6ZSBhcmUga25vd24gYW5kIGl0J3MgZWFzeSwgdXNlIGEgc21hbGxlcgotaW50ZWdlciB0eXBlIGxpa2UgYHVpbnQ4X3RgLiBUaGlzIGlzIGEgImZyZWUiIGNvbm5lY3Rpb24gZm9vdHByaW50Ci1vcHRpbWl6YXRpb24gZm9yIHNlcnZlcnMuIERvbid0IG1ha2UgY29kZSBzaWduaWZpY2FudGx5IG1vcmUgY29tcGxleCBmb3IKLWl0LCBhbmQgZG8gc3RpbGwgY2hlY2sgdGhlIGJvdW5kcyB3aGVuIHBhc3NpbmcgaW4gYW5kIG91dCBvZiB0aGUKLXN0cnVjdC4gVGhpcyBuYXJyb3dpbmcgc2hvdWxkIG5vdCBwcm9wYWdhdGUgdG8gbG9jYWwgdmFyaWFibGVzIGFuZAotZnVuY3Rpb24gcGFyYW1ldGVycy4KLQotV2hlbiBkb2luZyBhcml0aG1ldGljLCBhY2NvdW50IGZvciBvdmVyZmxvdyBjb25kaXRpb25zLgotCi1FeGNlcHQgd2l0aCBwbGF0Zm9ybSBBUElzLCBkbyBub3QgdXNlIGBzc2l6ZV90YC4gTVNWQyBsYWNrcyBpdCwgYW5kCi1wcmVmZXIgb3V0LW9mLWJhbmQgZXJyb3Igc2lnbmFsaW5nIGZvciBgc2l6ZV90YCAoc2VlIFJldHVybiB2YWx1ZXMpLgotCi0KLSMjIE5hbWluZwotCi1Gb2xsb3cgR29vZ2xlIG5hbWluZyBjb252ZW50aW9ucyBpbiBDKysgZmlsZXMuIEluIEMgZmlsZXMsIHVzZSB0aGUKLWZvbGxvd2luZyBuYW1pbmcgY29udmVudGlvbnMgZm9yIGNvbnNpc3RlbmN5IHdpdGggZXhpc3RpbmcgT3BlblNTTCBhbmQgQwotc3R5bGVzOgotCi1EZWZpbmUgc3RydWN0cyB3aXRoIHR5cGVkZWYgbmFtZWQgYFRZUEVfTkFNRWAuIFRoZSBjb3JyZXNwb25kaW5nIHN0cnVjdAotc2hvdWxkIGJlIG5hbWVkIGBzdHJ1Y3QgdHlwZV9uYW1lX3N0YC4KLQotTmFtZSBwdWJsaWMgZnVuY3Rpb25zIGFzIGBNT0RVTEVfZnVuY3Rpb25fbmFtZWAsIHVubGVzcyB0aGUgbW9kdWxlCi1hbHJlYWR5IHVzZXMgYSBkaWZmZXJlbnQgbmFtaW5nIHNjaGVtZSBmb3IgbGVnYWN5IHJlYXNvbnMuIFRoZSBtb2R1bGUKLW5hbWUgc2hvdWxkIGJlIGEgdHlwZSBuYW1lIGlmIHRoZSBmdW5jdGlvbiBpcyBhIG1ldGhvZCBvZiBhIHBhcnRpY3VsYXIKLXR5cGUuCi0KLVNvbWUgdHlwZXMgYXJlIGFsbG9jYXRlZCB3aXRoaW4gdGhlIGxpYnJhcnkgd2hpbGUgb3RoZXJzIGFyZSBpbml0aWFsaXplZAotaW50byBhIHN0cnVjdCBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlciwgb2Z0ZW4gb24gdGhlIHN0YWNrLiBOYW1lIHRoZXNlCi1mdW5jdGlvbnMgYFRZUEVfTkFNRV9uZXdgL2BUWVBFX05BTUVfZnJlZWAgYW5kCi1gVFlQRV9OQU1FX2luaXRgL2BUWVBFX05BTUVfY2xlYW51cGAsIHJlc3BlY3RpdmVseS4gQWxsIGBUWVBFX05BTUVfZnJlZWAKLWZ1bmN0aW9ucyBtdXN0IGRvIG5vdGhpbmcgb24gYE5VTExgIGlucHV0LgotCi1JZiBhIHZhcmlhYmxlIGlzIHRoZSBsZW5ndGggb2YgYSBwb2ludGVyIHZhbHVlLCBpdCBoYXMgdGhlIHN1ZmZpeAotYF9sZW5gLiBBbiBvdXRwdXQgcGFyYW1ldGVyIGlzIG5hbWVkIGBvdXRgIG9yIGhhcyBhbiBgb3V0X2AgcHJlZml4LiBGb3IKLWluc3RhbmNlLCBGb3IgaW5zdGFuY2U6Ci0KLSAgICB1aW50OF90ICpvdXQsCi0gICAgc2l6ZV90ICpvdXRfbGVuLAotICAgIGNvbnN0IHVpbnQ4X3QgKmluLAotICAgIHNpemVfdCBpbl9sZW4sCi0KLU5hbWUgcHVibGljIGhlYWRlcnMgbGlrZSBgaW5jbHVkZS9vcGVuc3NsL2V2cC5oYCB3aXRoIGhlYWRlciBndWFyZHMgbGlrZQotYE9QRU5TU0xfSEVBREVSX0VWUF9IYC4gTmFtZSBpbnRlcm5hbCBoZWFkZXJzIGxpa2UKLWBjcnlwdG8vZWMvaW50ZXJuYWwuaGAgd2l0aCBoZWFkZXIgZ3VhcmRzIGxpa2UKLWBPUEVOU1NMX0hFQURFUl9FQ19JTlRFUk5BTF9IYC4KLQotTmFtZSBlbnVtcyBsaWtlIGBlbnVtIHVuaXhfaGFja2VyX3RgLiBGb3IgaW5zdGFuY2U6Ci0KLSAgICBlbnVtIHNob3VsZF9mcmVlX2hhbmRzaGFrZV9idWZmZXJfdCB7Ci0gICAgICBmcmVlX2hhbmRzaGFrZV9idWZmZXIsCi0gICAgICBkb250X2ZyZWVfaGFuZHNoYWtlX2J1ZmZlciwKLSAgICB9OwotCi0KLSMjIFJldHVybiB2YWx1ZXMKLQotQXMgZXZlbiBgbWFsbG9jYCBtYXkgZmFpbCBpbiBCb3JpbmdTU0wsIHRoZSB2YXN0IG1ham9yaXR5IG9mIGZ1bmN0aW9ucwotd2lsbCBoYXZlIGEgZmFpbHVyZSBjYXNlLiBGdW5jdGlvbnMgc2hvdWxkIHJldHVybiBgaW50YCB3aXRoIG9uZSBvbgotc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gRG8gbm90IG92ZXJsb2FkIHRoZSByZXR1cm4gdmFsdWUgdG8gYm90aAotc2lnbmFsIHN1Y2Nlc3MvZmFpbHVyZSBhbmQgb3V0cHV0IGFuIGludGVnZXIuIEZvciBleGFtcGxlOgotCi0gICAgT1BFTlNTTF9FWFBPUlQgaW50IENCU19nZXRfdTE2KENCUyAqY2JzLCB1aW50MTZfdCAqb3V0KTsKLQotSWYgYSBmdW5jdGlvbiBuZWVkcyBtb3JlIHRoYW4gYSB0cnVlL2ZhbHNlIHJlc3VsdCBjb2RlLCBkZWZpbmUgYW4gZW51bQotcmF0aGVyIHRoYW4gYXJiaXRyYXJpbHkgYXNzaWduaW5nIG1lYW5pbmcgdG8gaW50IHZhbHVlcy4KLQotSWYgYSBmdW5jdGlvbiBvdXRwdXRzIGEgcG9pbnRlciB0byBhbiBvYmplY3Qgb24gc3VjY2VzcyBhbmQgdGhlcmUgYXJlIG5vCi1vdGhlciBvdXRwdXRzLCByZXR1cm4gdGhlIHBvaW50ZXIgZGlyZWN0bHkgYW5kIGBOVUxMYCBvbiBlcnJvci4KLQotCi0jIyBQYXJhbWV0ZXJzCi0KLVdoZXJlIG5vdCBjb25zdHJhaW5lZCBieSBsZWdhY3kgY29kZSwgcGFyYW1ldGVyIG9yZGVyIHNob3VsZCBiZToKLQotMS4gY29udGV4dCBwYXJhbWV0ZXJzCi0yLiBvdXRwdXQgcGFyYW1ldGVycwotMy4gaW5wdXQgcGFyYW1ldGVycwotCi1Gb3IgZXhhbXBsZSwKLQotICAgIC8qIENCQl9hZGRfYXNuIHNldHMgfCpvdXRfY29udGVudHN8IHRvIGEgfENCQnwgaW50byB3aGljaCB0aGUgY29udGVudHMgb2YgYW4KLSAgICAgKiBBU04uMSBvYmplY3QgY2FuIGJlIHdyaXR0ZW4uIFRoZSB8dGFnfCBhcmd1bWVudCB3aWxsIGJlIHVzZWQgYXMgdGhlIHRhZyBmb3IKLSAgICAgKiB0aGUgb2JqZWN0LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24gZXJyb3IuICovCi0gICAgT1BFTlNTTF9FWFBPUlQgaW50IENCQl9hZGRfYXNuMShDQkIgKmNiYiwgQ0JCICpvdXRfY29udGVudHMsIHVpbnQ4X3QgdGFnKTsKLQotCi0jIyBEb2N1bWVudGF0aW9uCi0KLUFsbCBwdWJsaWMgc3ltYm9scyBtdXN0IGhhdmUgYSBkb2N1bWVudGF0aW9uIGNvbW1lbnQgaW4gdGhlaXIgaGVhZGVyCi1maWxlLiBUaGUgc3R5bGUgaXMgYmFzZWQgb24gdGhhdCBvZiBHby4gVGhlIGZpcnN0IHNlbnRlbmNlIGJlZ2lucyB3aXRoCi10aGUgc3ltYm9sIG5hbWUsIG9wdGlvbmFsbHkgcHJlZml4ZWQgd2l0aCAiQSIgb3IgIkFuIi4gQXBhcnQgZnJvbSB0aGUKLWluaXRpYWwgbWVudGlvbiBvZiBzeW1ib2wsIHJlZmVyZW5jZXMgdG8gb3RoZXIgc3ltYm9scyBvciBwYXJhbWV0ZXIKLW5hbWVzIHNob3VsZCBiZSBzdXJyb3VuZGVkIGJ5IHxwaXBlc3wuCi0KLURvY3VtZW50YXRpb24gc2hvdWxkIGJlIGNvbmNpc2UgYnV0IGNvbXBsZXRlbHkgZGVzY3JpYmUgdGhlIGV4cG9zZWQKLWJlaGF2aW9yIG9mIHRoZSBmdW5jdGlvbi4gUGF5IHNwZWNpYWwgbm90ZSB0byBzdWNjZXNzL2ZhaWx1cmUgYmVoYXZpb3JzCi1hbmQgY2FsbGVyIG9ibGlnYXRpb25zIG9uIG9iamVjdCBsaWZldGltZXMuIElmIHRoaXMgc2FjcmlmaWNlcwotY29uY2lzZW5lc3MsIGNvbnNpZGVyIHNpbXBsaWZ5aW5nIHRoZSBmdW5jdGlvbidzIGJlaGF2aW9yLgotCi0gICAgLyogRVZQX0RpZ2VzdFZlcmlmeVVwZGF0ZSBhcHBlbmRzIHxsZW58IGJ5dGVzIGZyb20gfGRhdGF8IHRvIHRoZSBkYXRhIHdoaWNoCi0gICAgICogd2lsbCBiZSB2ZXJpZmllZCBieSB8RVZQX0RpZ2VzdFZlcmlmeUZpbmFsfC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQKLSAgICAgKiB6ZXJvIG90aGVyd2lzZS4gKi8KLSAgICBPUEVOU1NMX0VYUE9SVCBpbnQgRVZQX0RpZ2VzdFZlcmlmeVVwZGF0ZShFVlBfTURfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbik7Ci0KLUV4cGxpY2l0bHkgbWVudGlvbiBhbnkgc3VycHJpc2luZyBlZGdlIGNhc2VzIG9yIGRldmlhdGlvbnMgZnJvbSBjb21tb24KLXJldHVybiB2YWx1ZSBwYXR0ZXJucyBpbiBsZWdhY3kgZnVuY3Rpb25zLgotCi0gICAgLyogUlNBX3ByaXZhdGVfZW5jcnlwdCBlbmNyeXB0cyB8ZmxlbnwgYnl0ZXMgZnJvbSB8ZnJvbXwgd2l0aCB0aGUgcHJpdmF0ZSBrZXkgaW4KLSAgICAgKiB8cnNhfCBhbmQgd3JpdGVzIHRoZSBlbmNyeXB0ZWQgZGF0YSB0byB8dG98LiBUaGUgfHRvfCBidWZmZXIgbXVzdCBoYXZlIGF0Ci0gICAgICogbGVhc3QgfFJTQV9zaXplfCBieXRlcyBvZiBzcGFjZS4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIG9yCi0gICAgICogLTEgb24gZXJyb3IuIFRoZSB8cGFkZGluZ3wgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHxSU0FfKl9QQURESU5HfAotICAgICAqIHZhbHVlcy4gSWYgaW4gZG91YnQsIHxSU0FfUEtDUzFfUEFERElOR3wgaXMgdGhlIG1vc3QgY29tbW9uLgotICAgICAqCi0gICAgICogV0FSTklORzogdGhpcyBmdW5jdGlvbiBpcyBkYW5nZXJvdXMgYmVjYXVzZSBpdCBicmVha3MgdGhlIHVzdWFsIHJldHVybiB2YWx1ZQotICAgICAqIGNvbnZlbnRpb24uIFVzZSB8UlNBX3NpZ25fcmF3fCBpbnN0ZWFkLiAqLwotICAgIE9QRU5TU0xfRVhQT1JUIGludCBSU0FfcHJpdmF0ZV9lbmNyeXB0KGludCBmbGVuLCBjb25zdCB1aW50OF90ICpmcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnRvLCBSU0EgKnJzYSwgaW50IHBhZGRpbmcpOwotCi1Eb2N1bWVudCBwcml2YXRlIGZ1bmN0aW9ucyBpbiB0aGVpciBgaW50ZXJuYWwuaGAgaGVhZGVyIG9yLCBpZiBzdGF0aWMsCi13aGVyZSBkZWZpbmVkLgpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vQ01ha2VMaXN0cy50eHQKaW5kZXggMzExNTI3OS4uNjg1OGNiYiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uL2luY2x1ZGUpCiAKIGlmKEFQUExFKQogICBpZiAoJHtBUkNIfSBTVFJFUVVBTCAieDg2IikKQEAgLTU3LDYgKzU3LDcgQEAKICAgc2V0KAogICAgIENSWVBUT19BUkNIX1NPVVJDRVMKIAorICAgIGNwdS14ODZfNjQtYXNtLiR7QVNNX0VYVH0KICAgICBjcHUtaW50ZWwuYwogICApCiBlbmRpZigpCkBAIC02NSw2ICs2Niw3IEBACiAgIHNldCgKICAgICBDUllQVE9fQVJDSF9TT1VSQ0VTCiAKKyAgICBjcHUteDg2LWFzbS4ke0FTTV9FWFR9CiAgICAgY3B1LWludGVsLmMKICAgKQogZW5kaWYoKQpAQCAtMjI4LDMgKzIzMCw2IEBACiApCiAKIHRhcmdldF9saW5rX2xpYnJhcmllcyhyZWZjb3VudF90ZXN0IGNyeXB0bykKKworcGVybGFzbShjcHUteDg2XzY0LWFzbS4ke0FTTV9FWFR9IGNwdS14ODZfNjQtYXNtLnBsKQorcGVybGFzbShjcHUteDg2LWFzbS4ke0FTTV9FWFR9IGNwdS14ODYtYXNtLnBsKQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hZXMvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2Flcy9DTWFrZUxpc3RzLnR4dAppbmRleCBjODJkOTlhLi40OTBmNDBhIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Flcy9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL2Flcy9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQogCiBpZiAoJHtBUkNIfSBTVFJFUVVBTCAieDg2XzY0IikKICAgc2V0KApAQCAtNjAsMTIgKzYwLDMgQEAKIHBlcmxhc20oYWVzLWFybXY0LiR7QVNNX0VYVH0gYXNtL2Flcy1hcm12NC5wbCkKIHBlcmxhc20oYnNhZXMtYXJtdjcuJHtBU01fRVhUfSBhc20vYnNhZXMtYXJtdjcucGwpCiBwZXJsYXNtKGFlc3Y4LWFybXguJHtBU01fRVhUfSBhc20vYWVzdjgtYXJteC5wbCkKLQotYWRkX2V4ZWN1dGFibGUoCi0gIGFlc190ZXN0Ci0KLSAgYWVzX3Rlc3QuY2MKLSAgJDxUQVJHRVRfT0JKRUNUUzp0ZXN0X3N1cHBvcnQ+Ci0pCi0KLXRhcmdldF9saW5rX2xpYnJhcmllcyhhZXNfdGVzdCBjcnlwdG8pCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Flcy9hZXNfdGVzdC5jYyBiL3NyYy9jcnlwdG8vYWVzL2Flc190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDg4ZDgxLi4wMDAwMDAwCi0tLSBhL3NyYy9jcnlwdG8vYWVzL2Flc190ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNSwgR29vZ2xlIEluYy4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+Ci0KLQotc3RhdGljIGJvb2wgVGVzdEFFUyhjb25zdCB1aW50OF90ICprZXksIHNpemVfdCBrZXlfbGVuLAotICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHBsYWludGV4dFtBRVNfQkxPQ0tfU0laRV0sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgY2lwaGVydGV4dFtBRVNfQkxPQ0tfU0laRV0pIHsKLSAgQUVTX0tFWSBhZXNfa2V5OwotICBpZiAoQUVTX3NldF9lbmNyeXB0X2tleShrZXksIGtleV9sZW4gKiA4LCAmYWVzX2tleSkgIT0gMCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiQUVTX3NldF9lbmNyeXB0X2tleSBmYWlsZWRcbiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFRlc3QgZW5jcnlwdGlvbi4KLSAgdWludDhfdCBibG9ja1tBRVNfQkxPQ0tfU0laRV07Ci0gIEFFU19lbmNyeXB0KHBsYWludGV4dCwgYmxvY2ssICZhZXNfa2V5KTsKLSAgaWYgKG1lbWNtcChibG9jaywgY2lwaGVydGV4dCwgQUVTX0JMT0NLX1NJWkUpICE9IDApIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkFFU19lbmNyeXB0IGdhdmUgdGhlIHdyb25nIG91dHB1dFxuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gVGVzdCBpbi1wbGFjZSBlbmNyeXB0aW9uLgotICBtZW1jcHkoYmxvY2ssIHBsYWludGV4dCwgQUVTX0JMT0NLX1NJWkUpOwotICBBRVNfZW5jcnlwdChibG9jaywgYmxvY2ssICZhZXNfa2V5KTsKLSAgaWYgKG1lbWNtcChibG9jaywgY2lwaGVydGV4dCwgQUVTX0JMT0NLX1NJWkUpICE9IDApIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkFFU19lbmNyeXB0IGdhdmUgdGhlIHdyb25nIG91dHB1dFxuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKEFFU19zZXRfZGVjcnlwdF9rZXkoa2V5LCBrZXlfbGVuICogOCwgJmFlc19rZXkpICE9IDApIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkFFU19zZXRfZGVjcnlwdF9rZXkgZmFpbGVkXG4iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBUZXN0IGRlY3J5cHRpb24uCi0gIEFFU19kZWNyeXB0KGNpcGhlcnRleHQsIGJsb2NrLCAmYWVzX2tleSk7Ci0gIGlmIChtZW1jbXAoYmxvY2ssIHBsYWludGV4dCwgQUVTX0JMT0NLX1NJWkUpICE9IDApIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkFFU19kZWNyeXB0IGdhdmUgdGhlIHdyb25nIG91dHB1dFxuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gVGVzdCBpbi1wbGFjZSBkZWNyeXB0aW9uLgotICBtZW1jcHkoYmxvY2ssIGNpcGhlcnRleHQsIEFFU19CTE9DS19TSVpFKTsKLSAgQUVTX2RlY3J5cHQoYmxvY2ssIGJsb2NrLCAmYWVzX2tleSk7Ci0gIGlmIChtZW1jbXAoYmxvY2ssIHBsYWludGV4dCwgQUVTX0JMT0NLX1NJWkUpICE9IDApIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkFFU19kZWNyeXB0IGdhdmUgdGhlIHdyb25nIG91dHB1dFxuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1pbnQgbWFpbigpIHsKLSAgQ1JZUFRPX2xpYnJhcnlfaW5pdCgpOwotCi0gIC8vIFRlc3QgdmVjdG9ycyBmcm9tIEZJUFMtMTk3LCBBcHBlbmRpeCBDLgotICBpZiAoIVRlc3RBRVMoKGNvbnN0IHVpbnQ4X3QgKikiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCi0gICAgICAgICAgICAgICAxMjggLyA4LAotICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKikiXHgwMFx4MTFceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDg4XHg5OVx4YWFceGJiXHhjY1x4ZGRceGVlXHhmZiIsCi0gICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKSJceDY5XHhjNFx4ZTBceGQ4XHg2YVx4N2JceDA0XHgzMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZDhceGNkXHhiN1x4ODBceDcwXHhiNFx4YzVceDVhIikgfHwKLSAgICAgICFUZXN0QUVTKChjb25zdCB1aW50OF90ICopIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIsCi0gICAgICAgICAgICAgICAxOTIgLyA4LAotICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKikiXHgwMFx4MTFceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDg4XHg5OVx4YWFceGJiXHhjY1x4ZGRceGVlXHhmZiIsCi0gICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKSJceGRkXHhhOVx4N2NceGE0XHg4Nlx4NGNceGRmXHhlMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4NmVceGFmXHg3MFx4YTBceGVjXHgwZFx4NzFceDkxIikgfHwKLSAgICAgICFUZXN0QUVTKChjb25zdCB1aW50OF90ICopIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIiwKLSAgICAgICAgICAgICAgIDI1NiAvIDgsCi0gICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKSJceDAwXHgxMVx4MjJceDMzXHg0NFx4NTVceDY2XHg3NyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ODhceDk5XHhhYVx4YmJceGNjXHhkZFx4ZWVceGZmIiwKLSAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopIlx4OGVceGEyXHhiN1x4Y2FceDUxXHg2N1x4NDVceGJmIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhlYVx4ZmNceDQ5XHg5MFx4NGJceDQ5XHg2MFx4ODkiKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByaW50ZigiUEFTU1xuIik7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hZXMvYXNtL2Flcy01ODYucGwgYi9zcmMvY3J5cHRvL2Flcy9hc20vYWVzLTU4Ni5wbAppbmRleCA2ZThhNmE4Li4wN2ZiOTRjIDEwMDc1NQotLS0gYS9zcmMvY3J5cHRvL2Flcy9hc20vYWVzLTU4Ni5wbAorKysgYi9zcmMvY3J5cHRvL2Flcy9hc20vYWVzLTU4Ni5wbApAQCAtNDUsNyArNDUsNyBAQAogIyB0aGUgdW5kZXJ0YWtlbiBlZmZvcnQgd2FzIHRoYXQgaXQgYXBwZWFyZWQgdGhhdCBpbiB0aWdodCBJQS0zMgogIyByZWdpc3RlciB3aW5kb3cgbGl0dGxlLWVuZGlhbiBmbGF2b3IgY291bGQgYWNoaWV2ZSBzbGlnaHRseSBoaWdoZXIKICMgSW5zdHJ1Y3Rpb24gTGV2ZWwgUGFyYWxsZWxpc20sIGFuZCBpdCBpbmRlZWQgcmVzdWx0ZWQgaW4gdXAgdG8gMTUlCi0jIGJldHRlciBwZXJmb3JtYW5jZSBvbiBtb3N0IHJlY2VudCDCtS1hcmNocy4uLgorIyBiZXR0ZXIgcGVyZm9ybWFuY2Ugb24gbW9zdCByZWNlbnQgtS1hcmNocy4uLgogIwogIyBUaGlyZCB2ZXJzaW9uIGFkZHMgQUVTX2NiY19lbmNyeXB0IGltcGxlbWVudGF0aW9uLCB3aGljaCByZXN1bHRlZCBpbgogIyB1cCB0byA0MCUgcGVyZm9ybWFuY2UgaW1yb3ZlbWVudCBvZiBDQkMgYmVuY2htYXJrIHJlc3VsdHMuIDQwJSB3YXMKQEAgLTIyNCw3ICsyMjQsNyBAQAogJHNwZWVkX2xpbWl0PTUxMjsJIyBjaHVua3Mgc21hbGxlciB0aGFuICRzcGVlZF9saW1pdCBhcmUKIAkJCSMgcHJvY2Vzc2VkIHdpdGggY29tcGFjdCByb3V0aW5lIGluIENCQyBtb2RlCiAkc21hbGxfZm9vdHByaW50PTE7CSMgJHNtYWxsX2Zvb3RwcmludD0xIGNvZGUgaXMgfjUlIHNsb3dlciBbb24KLQkJCSMgcmVjZW50IMK1LWFyY2hzXSwgYnV0IH41IHRpbWVzIHNtYWxsZXIhCisJCQkjIHJlY2VudCC1LWFyY2hzXSwgYnV0IH41IHRpbWVzIHNtYWxsZXIhCiAJCQkjIEkgZmF2b3IgY29tcGFjdCBjb2RlIHRvIG1pbmltaXplIGNhY2hlCiAJCQkjIGNvbnRlbnRpb24gYW5kIGluIGhvcGUgdG8gImNvbGxlY3QiIDUlIGJhY2sKIAkJCSMgaW4gcmVhbC1saWZlIGFwcGxpY2F0aW9ucy4uLgpAQCAtNTY1LDcgKzU2NSw3IEBACiAjIFBlcmZvcm1hbmNlIGlzIG5vdCBhY3R1YWxseSBleHRyYW9yZGluYXJ5IGluIGNvbXBhcmlzb24gdG8gcHVyZQogIyB4ODYgY29kZS4gSW4gcGFydGljdWxhciBlbmNyeXB0IHBlcmZvcm1hbmNlIGlzIHZpcnR1YWxseSB0aGUgc2FtZS4KICMgRGVjcnlwdCBwZXJmb3JtYW5jZSBvbiB0aGUgb3RoZXIgaGFuZCBpcyAxNS0yMCUgYmV0dGVyIG9uIG5ld2VyCi0jIMK1LWFyY2hzIFtidXQgd2UncmUgdGhhbmtmdWwgZm9yICphbnkqIGltcHJvdmVtZW50IGhlcmVdLCBhbmQgfjUwJQorIyC1LWFyY2hzIFtidXQgd2UncmUgdGhhbmtmdWwgZm9yICphbnkqIGltcHJvdmVtZW50IGhlcmVdLCBhbmQgfjUwJQogIyBiZXR0ZXIgb24gUElJSTotKSBBbmQgYWRkaXRpb25hbGx5IG9uIHRoZSBwcm9zIHNpZGUgdGhpcyBjb2RlCiAjIGVsaW1pbmF0ZXMgcmVkdW5kYW50IHJlZmVyZW5jZXMgdG8gc3RhY2sgYW5kIHRodXMgcmVsaWV2ZXMvCiAjIG1pbmltaXplcyB0aGUgcHJlc3N1cmUgb24gdGhlIG1lbW9yeSBidXMuCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Flcy9hc20vYWVzLWFybXY0LnBsIGIvc3JjL2NyeXB0by9hZXMvYXNtL2Flcy1hcm12NC5wbAppbmRleCA4ODIwMTdhLi4zNmNkM2I2IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Flcy9hc20vYWVzLWFybXY0LnBsCisrKyBiL3NyYy9jcnlwdG8vYWVzL2FzbS9hZXMtYXJtdjQucGwKQEAgLTY1LDcgKzY1LDcgQEAKICRjb2RlPTw8X19fOwogI2lmIGRlZmluZWQoX19hcm1fXykKICNpZm5kZWYgX19LRVJORUxfXwotIyBpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisjIGluY2x1ZGUgImFybV9hcmNoLmgiCiAjZWxzZQogIyBkZWZpbmUgX19BUk1fQVJDSF9fIF9fTElOVVhfQVJNX0FSQ0hfXwogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Flcy9hc20vYWVzdjgtYXJteC5wbCBiL3NyYy9jcnlwdG8vYWVzL2FzbS9hZXN2OC1hcm14LnBsCmluZGV4IDEyMTE1NGEuLmIwOTE2ZjYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYWVzL2FzbS9hZXN2OC1hcm14LnBsCisrKyBiL3NyYy9jcnlwdG8vYWVzL2FzbS9hZXN2OC1hcm14LnBsCkBAIC00NSw3ICs0NSw3IEBACiAkcHJlZml4PSJhZXNfdjgiOwogCiAkY29kZT08PF9fXzsKLSNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisjaW5jbHVkZSAiYXJtX2FyY2guaCIKIAogI2lmIF9fQVJNX01BWF9BUkNIX18+PTcKIC50ZXh0CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Flcy9hc20vYnNhZXMtYXJtdjcucGwgYi9zcmMvY3J5cHRvL2Flcy9hc20vYnNhZXMtYXJtdjcucGwKaW5kZXggN2ZlMzQ5YS4uMjczZjBiOSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hZXMvYXNtL2JzYWVzLWFybXY3LnBsCisrKyBiL3NyYy9jcnlwdG8vYWVzL2FzbS9ic2Flcy1hcm12Ny5wbApAQCAtNzAzLDcgKzcwMyw3IEBACiAkY29kZS49PDxfX187CiAjaWYgZGVmaW5lZChfX2FybV9fKQogI2lmbmRlZiBfX0tFUk5FTF9fCi0jIGluY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKyMgaW5jbHVkZSAiYXJtX2FyY2guaCIKIAogIyBkZWZpbmUgVkZQX0FCSV9QVVNICXZzdG1kYglzcCEse2Q4LWQxNX0KICMgZGVmaW5lIFZGUF9BQklfUE9QCXZsZG1pYQlzcCEse2Q4LWQxNX0KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wZW5zc2wvYXJtX2FyY2guaCBiL3NyYy9jcnlwdG8vYXJtX2FyY2guaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBzcmMvaW5jbHVkZS9vcGVuc3NsL2FybV9hcmNoLmgKcmVuYW1lIHRvIHNyYy9jcnlwdG8vYXJtX2FyY2guaAppbmRleCAxMjNhODkwLi4wNjAwZmJiIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9vcGVuc3NsL2FybV9hcmNoLmgKKysrIGIvc3JjL2NyeXB0by9hcm1fYXJjaC5oCkBAIC0xMzMsNCArMTMzLDQgQEAKICNkZWZpbmUgQVJNVjhfUE1VTEwgKDEgPDwgNSkKIAogCi0jZW5kaWYgIC8qIE9QRU5TU0xfSEVBREVSX0FSTV9BUkNIX0ggKi8KKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfVEhSRUFEX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXNuMS9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vYXNuMS9DTWFrZUxpc3RzLnR4dAppbmRleCA0MWUzMTIyLi4yODM2MzZlIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9hc24xL0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCiAKIGFkZF9saWJyYXJ5KAogICBhc24xCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2FzbjEvYV9iaXRzdHIuYyBiL3NyYy9jcnlwdG8vYXNuMS9hX2JpdHN0ci5jCmluZGV4IDhiYWQzMzkuLjgwNTVmMGMgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYXNuMS9hX2JpdHN0ci5jCisrKyBiL3NyYy9jcnlwdG8vYXNuMS9hX2JpdHN0ci5jCkBAIC0xMjUsNyArMTI1LDggQEAKIAogCWlmIChsZW4gPCAxKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9TVFJJTkdfVE9PX1NIT1JUKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYzJpX0FTTjFfQklUX1NUUklORywKKwkJCUFTTjFfUl9TVFJJTkdfVE9PX1NIT1JUKTsKIAkJZ290byBlcnI7CiAJCX0KIApAQCAtMTQwLDcgKzE0MSw4IEBACiAJcGFkZGluZyA9ICoocCsrKTsKIAlpZiAocGFkZGluZyA+IDcpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lOVkFMSURfQklUX1NUUklOR19CSVRTX0xFRlQpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBjMmlfQVNOMV9CSVRfU1RSSU5HLAorCQkJQVNOMV9SX0lOVkFMSURfQklUX1NUUklOR19CSVRTX0xFRlQpOwogCQlnb3RvIGVycjsKIAkJfQogCkBAIC0xNTUsNyArMTU3LDggQEAKIAkJcz0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKChpbnQpbGVuKTsKIAkJaWYgKHMgPT0gTlVMTCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGMyaV9BU04xX0JJVF9TVFJJTkcsCisJCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCW1lbWNweShzLHAsKGludClsZW4pOwpAQCAtMjA2LDcgKzIwOSw3IEBACiAJCQkJCQkJCSB3KzEpOwogCQlpZiAoYyA9PSBOVUxMKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9CSVRfU1RSSU5HX3NldF9iaXQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCXJldHVybiAwOwogCQkJfQogICAJCWlmICh3KzEtYS0+bGVuZ3RoID4gMCkgbWVtc2V0KGMrYS0+bGVuZ3RoLCAwLCB3KzEtYS0+bGVuZ3RoKTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXNuMS9hX2Jvb2wuYyBiL3NyYy9jcnlwdG8vYXNuMS9hX2Jvb2wuYwppbmRleCA4MjZiY2Y0Li5jMzBlZTQ4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEvYV9ib29sLmMKKysrIGIvc3JjL2NyeXB0by9hc24xL2FfYm9vbC5jCkBAIC0xMDcsNiArMTA3LDYgQEAKIAkqcHA9cDsKIAlyZXR1cm4ocmV0KTsKIGVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBpKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBkMmlfQVNOMV9CT09MRUFOLCBpKTsKIAlyZXR1cm4ocmV0KTsKIAl9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2FzbjEvYV9ieXRlcy5jIGIvc3JjL2NyeXB0by9hc24xL2FfYnl0ZXMuYwppbmRleCAxOTA0Mzc1Li44ODc0ZjQ4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEvYV9ieXRlcy5jCisrKyBiL3NyYy9jcnlwdG8vYXNuMS9hX2J5dGVzLmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogCSpwcD1wOwogCXJldHVybihyZXQpOwogZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGkpOworCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGQyaV9BU04xX3R5cGVfYnl0ZXMsIGkpOwogCWlmICgocmV0ICE9IE5VTEwpICYmICgoYSA9PSBOVUxMKSB8fCAoKmEgIT0gcmV0KSkpCiAJCUFTTjFfU1RSSU5HX2ZyZWUocmV0KTsKIAlyZXR1cm4oTlVMTCk7CkBAIC0yNDMsNyArMjQzLDcgQEAKIGVycjoKIAlpZiAoKHJldCAhPSBOVUxMKSAmJiAoKGEgPT0gTlVMTCkgfHwgKCphICE9IHJldCkpKQogCQlBU04xX1NUUklOR19mcmVlKHJldCk7Ci0JT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgaSk7CisJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgZDJpX0FTTjFfYnl0ZXMsIGkpOwogCXJldHVybihOVUxMKTsKIAl9CiAKQEAgLTMwOSw3ICszMDksNyBAQAogCWlmIChvcyAhPSBOVUxMKSBBU04xX1NUUklOR19mcmVlKG9zKTsKIAlyZXR1cm4oMSk7CiBlcnI6Ci0JT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYy0+ZXJyb3IpOworCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfY29sbGF0ZV9wcmltaXRpdmUsIGMtPmVycm9yKTsKIAlpZiAob3MgIT0gTlVMTCkgQVNOMV9TVFJJTkdfZnJlZShvcyk7CiAJaWYgKGIuZGF0YSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoYi5kYXRhKTsKIAlyZXR1cm4oMCk7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2FzbjEvYV9kMmlfZnAuYyBiL3NyYy9jcnlwdG8vYXNuMS9hX2QyaV9mcC5jCmluZGV4IDk3ZWM3NWIuLjYwMjJjNzQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYXNuMS9hX2QyaV9mcC5jCisrKyBiL3NyYy9jcnlwdG8vYXNuMS9hX2QyaV9mcC5jCkBAIC03NSw3ICs3NSw3IEBACiAKICAgICAgICAgaWYgKChiPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9CVUZfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9kMmlfZnAsIEVSUl9SX0JVRl9MSUIpOwogICAgICAgICAgICAgICAgIHJldHVybihOVUxMKTsKIAkJfQogICAgICAgICBCSU9fc2V0X2ZwKGIsaW4sQklPX05PQ0xPU0UpOwpAQCAtMTI5LDcgKzEyOSw3IEBACiAKICAgICAgICAgaWYgKChiPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9CVUZfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2QyaV9mcCwgRVJSX1JfQlVGX0xJQik7CiAgICAgICAgICAgICAgICAgcmV0dXJuKE5VTEwpOwogCQl9CiAgICAgICAgIEJJT19zZXRfZnAoYixpbixCSU9fTk9DTE9TRSk7CkBAIC0xNTQsNyArMTU0LDcgQEAKIAliPUJVRl9NRU1fbmV3KCk7CiAJaWYgKGIgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX3JlYWRfYmlvLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiAtMTsKIAkJfQogCkBAIC0xNjcsMjAgKzE2NywyMCBAQAogCiAJCQlpZiAobGVuICsgd2FudCA8IGxlbiB8fCAhQlVGX01FTV9ncm93X2NsZWFuKGIsbGVuK3dhbnQpKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kMmlfcmVhZF9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQlpPUJJT19yZWFkKGluLCYoYi0+ZGF0YVtsZW5dKSx3YW50KTsKIAkJCWlmICgoaSA8IDApICYmICgobGVuLW9mZikgPT0gMCkpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9OT1RfRU5PVUdIX0RBVEEpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX3JlYWRfYmlvLCBBU04xX1JfTk9UX0VOT1VHSF9EQVRBKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQlpZiAoaSA+IDApCiAJCQkJewogCQkJCWlmIChsZW4raSA8IGxlbikKIAkJCQkJewotCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfVE9PX0xPTkcpOworCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2QyaV9yZWFkX2JpbywgQVNOMV9SX1RPT19MT05HKTsKIAkJCQkJZ290byBlcnI7CiAJCQkJCX0KIAkJCQlsZW4rPWk7CkBAIC0yMTEsNyArMjExLDcgQEAKIAkJCWVvcysrOwogCQkJaWYgKGVvcyA8IDApCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9IRUFERVJfVE9PX0xPTkcpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX3JlYWRfYmlvLCBBU04xX1JfSEVBREVSX1RPT19MT05HKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQl3YW50PUhFQURFUl9TSVpFOwpAQCAtMjM1LDEyICsyMzUsMTIgQEAKIAkJCQlpZiAod2FudCA+IElOVF9NQVggLyogQklPX3JlYWQgdGFrZXMgYW4gaW50IGxlbmd0aCAqLyB8fAogCQkJCQlsZW4rd2FudCA8IGxlbikKIAkJCQkJCXsKLQkJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9UT09fTE9ORyk7CisJCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2QyaV9yZWFkX2JpbywgQVNOMV9SX1RPT19MT05HKTsKIAkJCQkJCWdvdG8gZXJyOwogCQkJCQkJfQogCQkJCWlmICghQlVGX01FTV9ncm93X2NsZWFuKGIsbGVuK3dhbnQpKQogCQkJCQl7Ci0JCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kMmlfcmVhZF9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCQkJZ290byBlcnI7CiAJCQkJCX0KIAkJCQl3aGlsZSAod2FudCA+IDApCkBAIC0yNDgsNyArMjQ4LDcgQEAKIAkJCQkJaT1CSU9fcmVhZChpbiwmKGItPmRhdGFbbGVuXSksd2FudCk7CiAJCQkJCWlmIChpIDw9IDApCiAJCQkJCQl7Ci0JCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTk9UX0VOT1VHSF9EQVRBKTsKKwkJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX3JlYWRfYmlvLCBBU04xX1JfTk9UX0VOT1VHSF9EQVRBKTsKIAkJCQkJCWdvdG8gZXJyOwogCQkJCQkJfQogCQkJCQkvKiBUaGlzIGNhbid0IG92ZXJmbG93IGJlY2F1c2UKQEAgLTI1OSw3ICsyNTksNyBAQAogCQkJCX0KIAkJCWlmIChvZmYgKyBjLnNsZW4gPCBvZmYpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9UT09fTE9ORyk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kMmlfcmVhZF9iaW8sIEFTTjFfUl9UT09fTE9ORyk7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJb2ZmKz1jLnNsZW47CkBAIC0yNzQsNyArMjc0LDcgQEAKIAogCWlmIChvZmYgPiBJTlRfTUFYKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9UT09fTE9ORyk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX3JlYWRfYmlvLCBBU04xX1JfVE9PX0xPTkcpOwogCQlnb3RvIGVycjsKIAkJfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2FzbjEvYV9kdXAuYyBiL3NyYy9jcnlwdG8vYXNuMS9hX2R1cC5jCmluZGV4IDVlODc0NTcuLjhlYzFjNWYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYXNuMS9hX2R1cC5jCisrKyBiL3NyYy9jcnlwdG8vYXNuMS9hX2R1cC5jCkBAIC03Miw3ICs3Miw3IEBACiAJaT1pMmQoeCxOVUxMKTsKIAliPU9QRU5TU0xfbWFsbG9jKGkrMTApOwogCWlmIChiID09IE5VTEwpCi0JCXsgT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOyByZXR1cm4oTlVMTCk7IH0KKwkJeyBPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2R1cCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOyByZXR1cm4oTlVMTCk7IH0KIAlwPSBiOwogCWk9aTJkKHgsJnApOwogCXAyPSBiOwpAQCAtOTUsNyArOTUsNyBAQAogCiAJaT1BU04xX2l0ZW1faTJkKHgsJmIsaXQpOwogCWlmIChiID09IE5VTEwpCi0JCXsgT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOyByZXR1cm4oTlVMTCk7IH0KKwkJeyBPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZHVwLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7IHJldHVybihOVUxMKTsgfQogCXA9IGI7CiAJcmV0PUFTTjFfaXRlbV9kMmkoTlVMTCwmcCxpLCBpdCk7CiAJT1BFTlNTTF9mcmVlKGIpOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hc24xL2FfZW51bS5jIGIvc3JjL2NyeXB0by9hc24xL2FfZW51bS5jCmluZGV4IDU3OWRhZmQuLmE1ODFhMzQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYXNuMS9hX2VudW0uYworKysgYi9zcmMvY3J5cHRvL2FzbjEvYV9lbnVtLmMKQEAgLTg0LDcgKzg0LDcgQEAKIAkJfQogCWlmIChhLT5kYXRhID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX0VOVU1FUkFURURfc2V0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybigwKTsKIAkJfQogCWQ9djsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCQlyZXQ9YWk7CiAJaWYgKHJldCA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEJOX3RvX0FTTjFfRU5VTUVSQVRFRCwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKIAkJZ290byBlcnI7CiAJCX0KIAlpZihCTl9pc19uZWdhdGl2ZShibikpIHJldC0+dHlwZSA9IFZfQVNOMV9ORUdfRU5VTUVSQVRFRDsKQEAgLTE1OSw3ICsxNTksNyBAQAogCQl1bnNpZ25lZCBjaGFyICpuZXdfZGF0YT1PUEVOU1NMX3JlYWxsb2MocmV0LT5kYXRhLCBsZW4rNCk7CiAJCWlmICghbmV3X2RhdGEpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBCTl90b19BU04xX0VOVU1FUkFURUQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQlyZXQtPmRhdGE9bmV3X2RhdGE7CkBAIC0xNzcsNyArMTc3LDcgQEAKIAlCSUdOVU0gKnJldDsKIAogCWlmICgocmV0PUJOX2JpbjJibihhaS0+ZGF0YSxhaS0+bGVuZ3RoLGJuKSkgPT0gTlVMTCkKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0JOX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfRU5VTUVSQVRFRF90b19CTiwgQVNOMV9SX0JOX0xJQik7CiAJZWxzZSBpZihhaS0+dHlwZSA9PSBWX0FTTjFfTkVHX0VOVU1FUkFURUQpIEJOX3NldF9uZWdhdGl2ZShyZXQsMSk7CiAJcmV0dXJuKHJldCk7CiAJfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hc24xL2FfZ2VudG0uYyBiL3NyYy9jcnlwdG8vYXNuMS9hX2dlbnRtLmMKaW5kZXggN2NiMThhOS4uYmUwOTNhNCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hc24xL2FfZ2VudG0uYworKysgYi9zcmMvY3J5cHRvL2FzbjEvYV9nZW50bS5jCkBAIC0yMzksNyArMjM5LDcgQEAKIAkJcD1PUEVOU1NMX21hbGxvYyhsZW4pOwogCQlpZiAocCA9PSBOVUxMKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9HRU5FUkFMSVpFRFRJTUVfYWRqLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlyZXR1cm4oTlVMTCk7CiAJCQl9CiAJCWlmIChzLT5kYXRhICE9IE5VTEwpCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2FzbjEvYV9pMmRfZnAuYyBiL3NyYy9jcnlwdG8vYXNuMS9hX2kyZF9mcC5jCmluZGV4IDc0ZGVkNzguLjExZTQwZDMgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYXNuMS9hX2kyZF9mcC5jCisrKyBiL3NyYy9jcnlwdG8vYXNuMS9hX2kyZF9mcC5jCkBAIC02Nyw3ICs2Nyw3IEBACiAKICAgICAgICAgaWYgKChiPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9CVUZfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pMmRfZnAsIEVSUl9SX0JVRl9MSUIpOwogICAgICAgICAgICAgICAgIHJldHVybigwKTsKIAkJfQogICAgICAgICBCSU9fc2V0X2ZwKGIsb3V0LEJJT19OT0NMT1NFKTsKQEAgLTc2LDcgKzc2LDcgQEAKICAgICAgICAgcmV0dXJuKHJldCk7CiAgICAgICAgIH0KIAotaW50IEFTTjFfaTJkX2JpbyhpMmRfb2Zfdm9pZCAqaTJkLCBCSU8gKm91dCwgdm9pZCAqeCkKK2ludCBBU04xX2kyZF9iaW8oaTJkX29mX3ZvaWQgKmkyZCwgQklPICpvdXQsIHVuc2lnbmVkIGNoYXIgKngpCiAJewogCWNoYXIgKmI7CiAJdW5zaWduZWQgY2hhciAqcDsKQEAgLTg2LDcgKzg2LDcgQEAKIAliPShjaGFyICopT1BFTlNTTF9tYWxsb2Mobik7CiAJaWYgKGIgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaTJkX2JpbywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4oMCk7CiAJCX0KIApAQCAtMTE2LDcgKzExNiw3IEBACiAKICAgICAgICAgaWYgKChiPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9CVUZfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2kyZF9mcCwgRVJSX1JfQlVGX0xJQik7CiAgICAgICAgICAgICAgICAgcmV0dXJuKDApOwogCQl9CiAgICAgICAgIEJJT19zZXRfZnAoYixvdXQsQklPX05PQ0xPU0UpOwpAQCAtMTMzLDcgKzEzMyw3IEBACiAJbiA9IEFTTjFfaXRlbV9pMmQoeCwgJmIsIGl0KTsKIAlpZiAoYiA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2kyZF9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuKDApOwogCQl9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXNuMS9hX2ludC5jIGIvc3JjL2NyeXB0by9hc24xL2FfaW50LmMKaW5kZXggOWE1NjUzNC4uMmVjY2NjNSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hc24xL2FfaW50LmMKKysrIGIvc3JjL2NyeXB0by9hc24xL2FfaW50LmMKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCSpwcD1wZW5kOwogCXJldHVybihyZXQpOwogZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGkpOworCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGMyaV9BU04xX0lOVEVHRVIsIGkpOwogCWlmICgocmV0ICE9IE5VTEwpICYmICgoYSA9PSBOVUxMKSB8fCAoKmEgIT0gcmV0KSkpCiAJCU1fQVNOMV9JTlRFR0VSX2ZyZWUocmV0KTsKIAlyZXR1cm4oTlVMTCk7CkBAIC0zMjcsNyArMzI3LDcgQEAKIAkqcHA9cDsKIAlyZXR1cm4ocmV0KTsKIGVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBpKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBkMmlfQVNOMV9VSU5URUdFUiwgaSk7CiAJaWYgKChyZXQgIT0gTlVMTCkgJiYgKChhID09IE5VTEwpIHx8ICgqYSAhPSByZXQpKSkKIAkJTV9BU04xX0lOVEVHRVJfZnJlZShyZXQpOwogCXJldHVybihOVUxMKTsKQEAgLTM1MCw3ICszNTAsNyBAQAogCQl9CiAJaWYgKGEtPmRhdGEgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfSU5URUdFUl9zZXQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuKDApOwogCQl9CiAJZD12OwpAQCAtNDEzLDcgKzQxMyw3IEBACiAJCXJldD1haTsKIAlpZiAocmV0ID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQk5fdG9fQVNOMV9JTlRFR0VSLCBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOwogCQlnb3RvIGVycjsKIAkJfQogCWlmIChCTl9pc19uZWdhdGl2ZShibikgJiYgIUJOX2lzX3plcm8oYm4pKQpAQCAtNDI2LDcgKzQyNiw3IEBACiAJCXVuc2lnbmVkIGNoYXIgKm5ld19kYXRhPU9QRU5TU0xfcmVhbGxvYyhyZXQtPmRhdGEsIGxlbis0KTsKIAkJaWYgKCFuZXdfZGF0YSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEJOX3RvX0FTTjFfSU5URUdFUiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCXJldC0+ZGF0YT1uZXdfZGF0YTsKQEAgLTQ0OSw3ICs0NDksNyBAQAogCUJJR05VTSAqcmV0OwogCiAJaWYgKChyZXQ9Qk5fYmluMmJuKGFpLT5kYXRhLGFpLT5sZW5ndGgsYm4pKSA9PSBOVUxMKQotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfQk5fTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9JTlRFR0VSX3RvX0JOLCBBU04xX1JfQk5fTElCKTsKIAllbHNlIGlmKGFpLT50eXBlID09IFZfQVNOMV9ORUdfSU5URUdFUikKIAkJQk5fc2V0X25lZ2F0aXZlKHJldCwgMSk7CiAJcmV0dXJuKHJldCk7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2FzbjEvYV9tYnN0ci5jIGIvc3JjL2NyeXB0by9hc24xL2FfbWJzdHIuYwppbmRleCA0MjgwNmQxLi45YWJlNjU5IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEvYV9tYnN0ci5jCisrKyBiL3NyYy9jcnlwdG8vYXNuMS9hX21ic3RyLmMKQEAgLTEwOCw3ICsxMDgsNyBAQAogCiAJCWNhc2UgTUJTVFJJTkdfQk1QOgogCQlpZihsZW4gJiAxKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSU5WQUxJRF9CTVBTVFJJTkdfTEVOR1RIKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfbWJzdHJpbmdfbmNvcHksICBBU04xX1JfSU5WQUxJRF9CTVBTVFJJTkdfTEVOR1RIKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQluY2hhciA9IGxlbiA+PiAxOwpAQCAtMTE2LDcgKzExNiw3IEBACiAKIAkJY2FzZSBNQlNUUklOR19VTklWOgogCQlpZihsZW4gJiAzKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSU5WQUxJRF9VTklWRVJTQUxTVFJJTkdfTEVOR1RIKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfbWJzdHJpbmdfbmNvcHksICBBU04xX1JfSU5WQUxJRF9VTklWRVJTQUxTVFJJTkdfTEVOR1RIKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQluY2hhciA9IGxlbiA+PiAyOwpAQCAtMTI3LDcgKzEyNyw3IEBACiAJCS8qIFRoaXMgY291bnRzIHRoZSBjaGFyYWN0ZXJzIGFuZCBkb2VzIHV0Zjggc3ludGF4IGNoZWNraW5nICovCiAJCXJldCA9IHRyYXZlcnNlX3N0cmluZyhpbiwgbGVuLCBNQlNUUklOR19VVEY4LCBpbl91dGY4LCAmbmNoYXIpOwogCQlpZihyZXQgPCAwKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSU5WQUxJRF9VVEY4U1RSSU5HKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfbWJzdHJpbmdfbmNvcHksICBBU04xX1JfSU5WQUxJRF9VVEY4U1RSSU5HKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQlicmVhazsKQEAgLTEzNywxOSArMTM3LDE5IEBACiAJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9VTktOT1dOX0ZPUk1BVCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfbWJzdHJpbmdfbmNvcHksICBBU04xX1JfVU5LTk9XTl9GT1JNQVQpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYoKG1pbnNpemUgPiAwKSAmJiAobmNoYXIgPCBtaW5zaXplKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfU1RSSU5HX1RPT19TSE9SVCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfbWJzdHJpbmdfbmNvcHksICBBU04xX1JfU1RSSU5HX1RPT19TSE9SVCk7CiAJCUJJT19zbnByaW50ZihzdHJidWYsIHNpemVvZiBzdHJidWYsICIlbGQiLCBtaW5zaXplKTsKIAkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJtaW5zaXplPSIsIHN0cmJ1Zik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlpZigobWF4c2l6ZSA+IDApICYmIChuY2hhciA+IG1heHNpemUpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9TVFJJTkdfVE9PX0xPTkcpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX21ic3RyaW5nX25jb3B5LCAgQVNOMV9SX1NUUklOR19UT09fTE9ORyk7CiAJCUJJT19zbnByaW50ZihzdHJidWYsIHNpemVvZiBzdHJidWYsICIlbGQiLCBtYXhzaXplKTsKIAkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJtYXhzaXplPSIsIHN0cmJ1Zik7CiAJCXJldHVybiAtMTsKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCiAJLyogTm93IHdvcmsgb3V0IG1pbmltYWwgdHlwZSAoaWYgYW55KSAqLwogCWlmKHRyYXZlcnNlX3N0cmluZyhpbiwgbGVuLCBpbmZvcm0sIHR5cGVfc3RyLCAmbWFzaykgPCAwKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTExFR0FMX0NIQVJBQ1RFUlMpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX21ic3RyaW5nX25jb3B5LCAgQVNOMV9SX0lMTEVHQUxfQ0hBUkFDVEVSUyk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTE5MSw3ICsxOTEsNyBAQAogCQlmcmVlX291dCA9IDE7CiAJCWRlc3QgPSBBU04xX1NUUklOR190eXBlX25ldyhzdHJfdHlwZSk7CiAJCWlmKCFkZXN0KSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX21ic3RyaW5nX25jb3B5LCAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJCSpvdXQgPSBkZXN0OwpAQCAtMTk5LDcgKzE5OSw3IEBACiAJLyogSWYgYm90aCB0aGUgc2FtZSB0eXBlIGp1c3QgY29weSBhY3Jvc3MgKi8KIAlpZihpbmZvcm0gPT0gb3V0Zm9ybSkgewogCQlpZighQVNOMV9TVFJJTkdfc2V0KGRlc3QsIGluLCBsZW4pKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX21ic3RyaW5nX25jb3B5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJcmV0dXJuIHN0cl90eXBlOwpAQCAtMjMwLDcgKzIzMCw3IEBACiAJfQogCWlmKCEocCA9IE9QRU5TU0xfbWFsbG9jKG91dGxlbiArIDEpKSkgewogCQlpZihmcmVlX291dCkgQVNOMV9TVFJJTkdfZnJlZShkZXN0KTsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX21ic3RyaW5nX25jb3B5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiAtMTsKIAl9CiAJZGVzdC0+bGVuZ3RoID0gb3V0bGVuOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hc24xL2Ffb2JqZWN0LmMgYi9zcmMvY3J5cHRvL2FzbjEvYV9vYmplY3QuYwppbmRleCA2ZGRmY2E5Li4xODk4ODZjIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEvYV9vYmplY3QuYworKysgYi9zcmMvY3J5cHRvL2FzbjEvYV9vYmplY3QuYwpAQCAtMTA2LDEzICsxMDYsMTMgQEAKIAkJfQogCWVsc2UKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfRklSU1RfTlVNX1RPT19MQVJHRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyZF9BU04xX09CSkVDVCwgQVNOMV9SX0ZJUlNUX05VTV9UT09fTEFSR0UpOwogCQlnb3RvIGVycjsKIAkJfQogCiAJaWYgKG51bSA8PSAwKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9NSVNTSU5HX1NFQ09ORF9OVU1CRVIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhMmRfQVNOMV9PQkpFQ1QsIEFTTjFfUl9NSVNTSU5HX1NFQ09ORF9OVU1CRVIpOwogCQlnb3RvIGVycjsKIAkJfQogCWM9ICoocCsrKTsKQEAgLTEyMiw3ICsxMjIsNyBAQAogCQlpZiAobnVtIDw9IDApIGJyZWFrOwogCQlpZiAoKGMgIT0gJy4nKSAmJiAoYyAhPSAnICcpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lOVkFMSURfU0VQQVJBVE9SKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyZF9BU04xX09CSkVDVCwgQVNOMV9SX0lOVkFMSURfU0VQQVJBVE9SKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQlsPTA7CkBAIC0xMzYsNyArMTM2LDcgQEAKIAkJCQlicmVhazsKIAkJCWlmICgoYyA8ICcwJykgfHwgKGMgPiAnOScpKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSU5WQUxJRF9ESUdJVCk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYTJkX0FTTjFfT0JKRUNULCBBU04xX1JfSU5WQUxJRF9ESUdJVCk7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJaWYgKCF1c2VfYm4gJiYgbCA+PSAoKFVMT05HX01BWCAtIDgwKSAvIDEwTCkpCkBAIC0xNjAsNyArMTYwLDcgQEAKIAkJCXsKIAkJCWlmICgoZmlyc3QgPCAyKSAmJiAobCA+PSA0MCkpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9TRUNPTkRfTlVNQkVSX1RPT19MQVJHRSk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYTJkX0FTTjFfT0JKRUNULCBBU04xX1JfU0VDT05EX05VTUJFUl9UT09fTEFSR0UpOwogCQkJCWdvdG8gZXJyOwogCQkJCX0KIAkJCWlmICh1c2VfYm4pCkBAIC0yMDQsNyArMjA0LDcgQEAKIAkJCXsKIAkJCWlmIChsZW4raSA+IG9sZW4pCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhMmRfQVNOMV9PQkpFQ1QsIEFTTjFfUl9CVUZGRVJfVE9PX1NNQUxMKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQl3aGlsZSAoLS1pID4gMCkKQEAgLTI4MCw3ICsyODAsNyBAQAogCWlmKHJldCkgKnBwID0gcDsKIAlyZXR1cm4gcmV0OwogZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGkpOworCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGQyaV9BU04xX09CSkVDVCwgaSk7CiAJcmV0dXJuKE5VTEwpOwogfQogCkBAIC0zMDAsNyArMzAwLDcgQEAKIAlpZiAobGVuIDw9IDAgfHwgbGVuID4gSU5UX01BWCB8fCBwcCA9PSBOVUxMIHx8IChwID0gKnBwKSA9PSBOVUxMIHx8CiAJICAgIHBbbGVuIC0gMV0gJiAweDgwKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTlZBTElEX09CSkVDVF9FTkNPRElORyk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGMyaV9BU04xX09CSkVDVCwgQVNOMV9SX0lOVkFMSURfT0JKRUNUX0VOQ09ESU5HKTsKIAkJcmV0dXJuIE5VTEw7CiAJCX0KIAkvKiBOb3cgMCA8IGxlbiA8PSBJTlRfTUFYLCBzbyB0aGUgY2FzdCBpcyBzYWZlLiAqLwpAQCAtMzA5LDcgKzMwOSw3IEBACiAJCXsKIAkJaWYgKCpwID09IDB4ODAgJiYgKCFpIHx8ICEocFstMV0gJiAweDgwKSkpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSU5WQUxJRF9PQkpFQ1RfRU5DT0RJTkcpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYzJpX0FTTjFfT0JKRUNULCBBU04xX1JfSU5WQUxJRF9PQkpFQ1RfRU5DT0RJTkcpOwogCQkJcmV0dXJuIE5VTEw7CiAJCQl9CiAJCX0KQEAgLTM1MCw3ICszNTAsNyBAQAogCSpwcD1wOwogCXJldHVybihyZXQpOwogZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGkpOworCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGMyaV9BU04xX09CSkVDVCwgaSk7CiAJaWYgKChyZXQgIT0gTlVMTCkgJiYgKChhID09IE5VTEwpIHx8ICgqYSAhPSByZXQpKSkKIAkJQVNOMV9PQkpFQ1RfZnJlZShyZXQpOwogCXJldHVybihOVUxMKTsKQEAgLTM2Myw3ICszNjMsNyBAQAogCXJldD0oQVNOMV9PQkpFQ1QgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoQVNOMV9PQkpFQ1QpKTsKIAlpZiAocmV0ID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX09CSkVDVF9uZXcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuKE5VTEwpOwogCQl9CiAJcmV0LT5sZW5ndGg9MDsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXNuMS9hX3N0cm5pZC5jIGIvc3JjL2NyeXB0by9hc24xL2Ffc3RybmlkLmMKaW5kZXggZDQzMTZmNy4uZGY4NDllMSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hc24xL2Ffc3RybmlkLmMKKysrIGIvc3JjL2NyeXB0by9hc24xL2Ffc3RybmlkLmMKQEAgLTIxNSwxMyArMjE1LDEzIEBACiAJZmxhZ3MgJj0gflNUQUJMRV9GTEFHU19NQUxMT0M7CiAJaWYoIXN0YWJsZSkgc3RhYmxlID0gc2tfQVNOMV9TVFJJTkdfVEFCTEVfbmV3KHNrX3RhYmxlX2NtcCk7CiAJaWYoIXN0YWJsZSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfU1RSSU5HX1RBQkxFX2FkZCwgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmKCEodG1wID0gQVNOMV9TVFJJTkdfVEFCTEVfZ2V0KG5pZCkpKSB7CiAJCXRtcCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihBU04xX1NUUklOR19UQUJMRSkpOwogCQlpZighdG1wKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1NUUklOR19UQUJMRV9hZGQsICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQl0bXAtPmZsYWdzID0gZmxhZ3MgfCBTVEFCTEVfRkxBR1NfTUFMTE9DOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hc24xL2FfdGltZS5jIGIvc3JjL2NyeXB0by9hc24xL2FfdGltZS5jCmluZGV4IGFjMmNiNDguLmUwMmU4NTggMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYXNuMS9hX3RpbWUuYworKysgYi9zcmMvY3J5cHRvL2FzbjEvYV90aW1lLmMKQEAgLTg1LDcgKzg1LDcgQEAKIAlpZihhLT50eXBlID09IFZfQVNOMV9VVENUSU1FIHx8IGEtPnR5cGUgPT0gVl9BU04xX0dFTkVSQUxJWkVEVElNRSkKIAkJCQlyZXR1cm4oaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxwcCwKIAkJCQkgICAgIGEtPnR5cGUgLFZfQVNOMV9VTklWRVJTQUwpKTsKLQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfRVhQRUNUSU5HX0FfVElNRSk7CisJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgWFhYLCBBU04xX1JfRVhQRUNUSU5HX0FfVElNRSk7CiAJcmV0dXJuIC0xOwogCX0KICNlbmRpZgpAQCAtMTA1LDcgKzEwNSw3IEBACiAJdHM9T1BFTlNTTF9nbXRpbWUoJnQsJmRhdGEpOwogCWlmICh0cyA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9FUlJPUl9HRVRUSU5HX1RJTUUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1RJTUVfYWRqLCAgQVNOMV9SX0VSUk9SX0dFVFRJTkdfVElNRSk7CiAJCXJldHVybiBOVUxMOwogCQl9CiAJaWYgKG9mZnNldF9kYXkgfHwgb2Zmc2V0X3NlYykKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXNuMS9hX3V0Y3RtLmMgYi9zcmMvY3J5cHRvL2FzbjEvYV91dGN0bS5jCmluZGV4IGRiYmJlY2IuLjUyYjAxMGYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYXNuMS9hX3V0Y3RtLmMKKysrIGIvc3JjL2NyeXB0by9hc24xL2FfdXRjdG0uYwpAQCAtODEsMTIgKzgxLDEyIEBACiAJCVZfQVNOMV9VVENUSU1FLFZfQVNOMV9VTklWRVJTQUwpOwogCWlmIChyZXQgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIFhYWCwgRVJSX1JfTkVTVEVEX0FTTjFfRVJST1IpOwogCQlyZXR1cm4oTlVMTCk7CiAJCX0KIAlpZiAoIUFTTjFfVVRDVElNRV9jaGVjayhyZXQpKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTlZBTElEX1RJTUVfRk9STUFUKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgWFhYLCBBU04xX1JfSU5WQUxJRF9USU1FX0ZPUk1BVCk7CiAJCWdvdG8gZXJyOwogCQl9CiAKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCQlwPU9QRU5TU0xfbWFsbG9jKGxlbik7CiAJCWlmIChwID09IE5VTEwpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1VUQ1RJTUVfYWRqLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJaWYgKHMtPmRhdGEgIT0gTlVMTCkKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXNuMS9hc24xX2xpYi5jIGIvc3JjL2NyeXB0by9hc24xL2FzbjFfbGliLmMKaW5kZXggYTEwOTc0OS4uOWFhMjY3OCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hc24xL2FzbjFfbGliLmMKKysrIGIvc3JjL2NyeXB0by9hc24xL2FzbjFfbGliLmMKQEAgLTY5LDEwICs2OSwxNyBAQAogT1BFTlNTTF9ERUNMQVJFX0VSUk9SX1JFQVNPTihBU04xLCBNQUxMT0NfRkFJTFVSRSk7CiAKIC8qIENyb3NzLW1vZHVsZSBlcnJvcnMgZnJvbSBjcnlwdG8veDUwOS9pMmRfcHIuYyAqLworT1BFTlNTTF9ERUNMQVJFX0VSUk9SX0ZVTkNUSU9OKEFTTjEsIGkyZF9Qcml2YXRlS2V5KTsKIE9QRU5TU0xfREVDTEFSRV9FUlJPUl9SRUFTT04oQVNOMSwgVU5TVVBQT1JURURfUFVCTElDX0tFWV9UWVBFKTsKIAogLyogQ3Jvc3MtbW9kdWxlIGVycm9ycyBmcm9tIGNyeXB0by94NTA5L2FzbjFfZ2VuLmMuCiAgKiBUT0RPKGRhdmlkYmVuKTogUmVtb3ZlIHRoZXNlIG9uY2UgYXNuMV9nZW4uYyBpcyBnb25lLiAqLworT1BFTlNTTF9ERUNMQVJFX0VSUk9SX0ZVTkNUSU9OKEFTTjEsIEFTTjFfZ2VuZXJhdGVfdjMpOworT1BFTlNTTF9ERUNMQVJFX0VSUk9SX0ZVTkNUSU9OKEFTTjEsIGFzbjFfY2IpOworT1BFTlNTTF9ERUNMQVJFX0VSUk9SX0ZVTkNUSU9OKEFTTjEsIHBhcnNlX3RhZ2dpbmcpOworT1BFTlNTTF9ERUNMQVJFX0VSUk9SX0ZVTkNUSU9OKEFTTjEsIGFwcGVuZF9leHApOworT1BFTlNTTF9ERUNMQVJFX0VSUk9SX0ZVTkNUSU9OKEFTTjEsIGFzbjFfc3RyMnR5cGUpOworT1BFTlNTTF9ERUNMQVJFX0VSUk9SX0ZVTkNUSU9OKEFTTjEsIGJpdHN0cl9jYik7CiBPUEVOU1NMX0RFQ0xBUkVfRVJST1JfUkVBU09OKEFTTjEsIERFUFRIX0VYQ0VFREVEKTsKIE9QRU5TU0xfREVDTEFSRV9FUlJPUl9SRUFTT04oQVNOMSwgSUxMRUdBTF9CSVRTVFJJTkdfRk9STUFUKTsKIE9QRU5TU0xfREVDTEFSRV9FUlJPUl9SRUFTT04oQVNOMSwgSUxMRUdBTF9CT09MRUFOKTsKQEAgLTE3Niw3ICsxODMsNyBAQAogI2VuZGlmCiAJaWYgKCpwbGVuZ3RoID4gKG9tYXggLSAocCAtICpwcCkpKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9UT09fTE9ORyk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfZ2V0X29iamVjdCwgQVNOMV9SX1RPT19MT05HKTsKIAkJLyogU2V0IHRoaXMgc28gdGhhdCBldmVuIGlmIHRoaW5ncyBhcmUgbm90IGxvbmcgZW5vdWdoCiAJCSAqIHRoZSB2YWx1ZXMgYXJlIHNldCBjb3JyZWN0bHkgKi8KIAkJcmV0fD0weDgwOwpAQCAtMTg0LDcgKzE5MSw3IEBACiAJKnBwPXA7CiAJcmV0dXJuKHJldHxpbmYpOwogZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9IRUFERVJfVE9PX0xPTkcpOworCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfZ2V0X29iamVjdCwgQVNOMV9SX0hFQURFUl9UT09fTE9ORyk7CiAJcmV0dXJuKDB4ODApOwogCX0KIApAQCAtNDI2LDcgKzQzMyw3IEBACiAKIAkJaWYgKHN0ci0+ZGF0YSA9PSBOVUxMKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9TVFJJTkdfc2V0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlzdHItPmRhdGE9YzsKIAkJCXJldHVybigwKTsKIAkJCX0KQEAgLTQ2Miw3ICs0NjksNyBAQAogCXJldD0oQVNOMV9TVFJJTkcgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoQVNOMV9TVFJJTkcpKTsKIAlpZiAocmV0ID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1NUUklOR190eXBlX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4oTlVMTCk7CiAJCX0KIAlyZXQtPmxlbmd0aD0wOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hc24xL2Fzbl9wYWNrLmMgYi9zcmMvY3J5cHRvL2FzbjEvYXNuX3BhY2suYwppbmRleCBlODQyYTEwLi5lZTU4ZmE1IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEvYXNuX3BhY2suYworKysgYi9zcmMvY3J5cHRvL2FzbjEvYXNuX3BhY2suYwpAQCAtNjgsNyArNjgsNyBAQAogCiAJaWYgKCFvY3QgfHwgISpvY3QpIHsKIAkJaWYgKCEob2N0bXAgPSBBU04xX1NUUklOR19uZXcgKCkpKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fcGFjaywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAkJaWYgKG9jdCkgKm9jdCA9IG9jdG1wOwpAQCAtODAsMTEgKzgwLDExIEBACiAJfQogCQkKIAlpZiAoIShvY3RtcC0+bGVuZ3RoID0gQVNOMV9pdGVtX2kyZChvYmosICZvY3RtcC0+ZGF0YSwgaXQpKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfRU5DT0RFX0VSUk9SKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX3BhY2ssIEFTTjFfUl9FTkNPREVfRVJST1IpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJaWYgKCFvY3RtcC0+ZGF0YSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9wYWNrLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlyZXR1cm4gb2N0bXA7CkBAIC05OSw2ICs5OSw2IEBACiAKIAlwID0gb2N0LT5kYXRhOwogCWlmKCEocmV0ID0gQVNOMV9pdGVtX2QyaShOVUxMLCAmcCwgb2N0LT5sZW5ndGgsIGl0KSkpCi0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9ERUNPREVfRVJST1IpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fdW5wYWNrLCBBU04xX1JfREVDT0RFX0VSUk9SKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hc24xL2Jpb19uZGVmLmMgYi9zcmMvY3J5cHRvL2FzbjEvYmlvX25kZWYuYwppbmRleCBmMDdkM2RlLi4yZjcxMDVkIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEvYmlvX25kZWYuYworKysgYi9zcmMvY3J5cHRvL2FzbjEvYmlvX25kZWYuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAKIAlpZiAoIWF1eCB8fCAhYXV4LT5hc24xX2NiKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9TVFJFQU1JTkdfTk9UX1NVUFBPUlRFRCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEJJT19uZXdfTkRFRiwgQVNOMV9SX1NUUkVBTUlOR19OT1RfU1VQUE9SVEVEKTsKIAkJcmV0dXJuIE5VTEw7CiAJCX0KIAluZGVmX2F1eCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihOREVGX1NVUFBPUlQpKTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXNuMS9mX2VudW0uYyBiL3NyYy9jcnlwdG8vYXNuMS9mX2VudW0uYwppbmRleCBiY2RiNzczLi41MzBhZmU1IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEvZl9lbnVtLmMKKysrIGIvc3JjL2NyeXB0by9hc24xL2ZfZW51bS5jCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAkJaS09YWdhaW47CiAJCWlmIChpJTIgIT0gMCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9PRERfTlVNQkVSX09GX0NIQVJTKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyaV9BU04xX0VOVU1FUkFURUQsIEFTTjFfUl9PRERfTlVNQkVSX09GX0NIQVJTKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQlpLz0yOwpAQCAtMTU4LDcgKzE1OCw3IEBACiAJCQkJCSh1bnNpZ25lZCBpbnQpbnVtK2kqMik7CiAJCQlpZiAoc3AgPT0gTlVMTCkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyaV9BU04xX0VOVU1FUkFURUQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQlzPXNwOwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJCQkJCW09bS0nQScrMTA7CiAJCQkJZWxzZQogCQkJCQl7Ci0JCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9OT05fSEVYX0NIQVJBQ1RFUlMpOworCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhMmlfQVNOMV9FTlVNRVJBVEVELCBBU04xX1JfTk9OX0hFWF9DSEFSQUNURVJTKTsKIAkJCQkJZ290byBlcnI7CiAJCQkJCX0KIAkJCQlzW251bStqXTw8PTQ7CkBAIC0xOTcsNyArMTk3LDcgQEAKIAlpZiAoMCkKIAkJewogZXJyX3NsOgotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfU0hPUlRfTElORSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyaV9BU04xX0VOVU1FUkFURUQsIEFTTjFfUl9TSE9SVF9MSU5FKTsKIAkJfQogCWlmIChzICE9IE5VTEwpCiAJCU9QRU5TU0xfZnJlZShzKTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXNuMS9mX2ludC5jIGIvc3JjL2NyeXB0by9hc24xL2ZfaW50LmMKaW5kZXggNTE4NjMwNC4uMmM0ZmU2ZiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hc24xL2ZfaW50LmMKKysrIGIvc3JjL2NyeXB0by9hc24xL2ZfaW50LmMKQEAgLTE0OSw3ICsxNDksNyBAQAogCQlpLT1hZ2FpbjsKIAkJaWYgKGklMiAhPSAwKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX09ERF9OVU1CRVJfT0ZfQ0hBUlMpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYTJpX0FTTjFfSU5URUdFUiwgQVNOMV9SX09ERF9OVU1CRVJfT0ZfQ0hBUlMpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCWkvPTI7CkBAIC0xNjIsNyArMTYyLDcgQEAKIAkJCQlzcD1PUEVOU1NMX3JlYWxsb2NfY2xlYW4ocyxzbGVuLG51bStpKjIpOwogCQkJaWYgKHNwID09IE5VTEwpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhMmlfQVNOMV9JTlRFR0VSLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJcz1zcDsKQEAgLTE4MSw3ICsxODEsNyBAQAogCQkJCQltPW0tJ0EnKzEwOwogCQkJCWVsc2UKIAkJCQkJewotCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTk9OX0hFWF9DSEFSQUNURVJTKTsKKwkJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYTJpX0FTTjFfSU5URUdFUiwgQVNOMV9SX05PTl9IRVhfQ0hBUkFDVEVSUyk7CiAJCQkJCWdvdG8gZXJyOwogCQkJCQl9CiAJCQkJc1tudW0ral08PD00OwpAQCAtMjAxLDcgKzIwMSw3IEBACiAJaWYgKDApCiAJCXsKIGVycl9zbDoKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1NIT1JUX0xJTkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhMmlfQVNOMV9JTlRFR0VSLCBBU04xX1JfU0hPUlRfTElORSk7CiAJCX0KIAlpZiAocyAhPSBOVUxMKQogCQlPUEVOU1NMX2ZyZWUocyk7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2FzbjEvZl9zdHJpbmcuYyBiL3NyYy9jcnlwdG8vYXNuMS9mX3N0cmluZy5jCmluZGV4IDVhN2ZlMzYuLjJmNTM2NzAgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYXNuMS9mX3N0cmluZy5jCisrKyBiL3NyYy9jcnlwdG8vYXNuMS9mX3N0cmluZy5jCkBAIC0xNDIsNyArMTQyLDcgQEAKIAkJaS09YWdhaW47CiAJCWlmIChpJTIgIT0gMCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9PRERfTlVNQkVSX09GX0NIQVJTKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyaV9BU04xX1NUUklORywgQVNOMV9SX09ERF9OVU1CRVJfT0ZfQ0hBUlMpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCWkvPTI7CkBAIC0xNTYsNyArMTU2LDcgQEAKIAkJCQkJKHVuc2lnbmVkIGludCludW0raSoyKTsKIAkJCWlmIChzcCA9PSBOVUxMKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYTJpX0FTTjFfU1RSSU5HLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJcz1zcDsKQEAgLTE3NSw3ICsxNzUsNyBAQAogCQkJCQltPW0tJ0EnKzEwOwogCQkJCWVsc2UKIAkJCQkJewotCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTk9OX0hFWF9DSEFSQUNURVJTKTsKKwkJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYTJpX0FTTjFfU1RSSU5HLCBBU04xX1JfTk9OX0hFWF9DSEFSQUNURVJTKTsKIAkJCQkJZ290byBlcnI7CiAJCQkJCX0KIAkJCQlzW251bStqXTw8PTQ7CkBAIC0xOTUsNyArMTk1LDcgQEAKIAlpZiAoMCkKIAkJewogZXJyX3NsOgotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfU0hPUlRfTElORSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyaV9BU04xX1NUUklORywgQVNOMV9SX1NIT1JUX0xJTkUpOwogCQl9CiAJaWYgKHMgIT0gTlVMTCkKIAkJT1BFTlNTTF9mcmVlKHMpOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hc24xL3Rhc25fZGVjLmMgYi9zcmMvY3J5cHRvL2FzbjEvdGFzbl9kZWMuYwppbmRleCA1MDdhODQyLi43M2QzYmIzIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEvdGFzbl9kZWMuYworKysgYi9zcmMvY3J5cHRvL2FzbjEvdGFzbl9kZWMuYwpAQCAtMTg5LDcgKzE4OSw3IEBACiAJCQkgKi8KIAkJCWlmICgodGFnICE9IC0xKSB8fCBvcHQpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTExFR0FMX09QVElPTlNfT05fSVRFTV9URU1QTEFURSk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2V4X2QyaSwgIEFTTjFfUl9JTExFR0FMX09QVElPTlNfT05fSVRFTV9URU1QTEFURSk7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJcmV0dXJuIGFzbjFfdGVtcGxhdGVfZXhfZDJpKHB2YWwsIGluLCBsZW4sCkBAIC0yMDYsNyArMjA2LDcgQEAKIAkJCQkJCSZwLCBsZW4sIC0xLCAwLCAxLCBjdHgpOwogCQlpZiAoIXJldCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCkBAIC0yMTUsNyArMjE1LDcgQEAKIAkJCXsKIAkJCS8qIElmIE9QVElPTkFMLCBhc3N1bWUgdGhpcyBpcyBPSyAqLwogCQkJaWYgKG9wdCkgcmV0dXJuIC0xOwotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX01TVFJJTkdfTk9UX1VOSVZFUlNBTCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX01TVFJJTkdfTk9UX1VOSVZFUlNBTCk7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJLyogQ2hlY2sgdGFnIG1hdGNoZXMgYml0IG1hcCAqLwpAQCAtMjI0LDcgKzIyNCw3IEBACiAJCQkvKiBJZiBPUFRJT05BTCwgYXNzdW1lIHRoaXMgaXMgT0sgKi8KIAkJCWlmIChvcHQpCiAJCQkJcmV0dXJuIC0xOwotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX01TVFJJTkdfV1JPTkdfVEFHKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9leF9kMmksICBBU04xX1JfTVNUUklOR19XUk9OR19UQUcpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCXJldHVybiBhc24xX2QyaV9leF9wcmltaXRpdmUocHZhbCwgaW4sIGxlbiwKQEAgLTI1NSw3ICsyNTUsNyBAQAogCQkJCQkmcCwgbGVuLCBleHB0YWcsIGFjbGFzcywgMSwgY3R4KTsKIAkJCWlmICghcmV0KQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9leF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOwogCQkJCWdvdG8gZXJyOwogCQkJCX0KIAkJCWlmIChyZXQgPT0gLTEpCkBAIC0yODMsNyArMjgzLDcgQEAKIAkJCWltcGhhY2sgPSAqd3A7CiAJCQlpZiAocCA9PSBOVUxMKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9leF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOwogCQkJCWdvdG8gZXJyOwogCQkJCX0KIAkJCSp3cCA9ICh1bnNpZ25lZCBjaGFyKSgoKnAgJiBWX0FTTjFfQ09OU1RSVUNURUQpCkBAIC0yOTgsNyArMjk4LDcgQEAKIAkJaWYgKHB0bXB2YWwpCiAJCQlyZXR1cm4gMTsKIAotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKIAkJZ290byBlcnI7CiAKIApAQCAtMzIwLDcgKzMyMCw3IEBACiAJCQl9CiAJCWVsc2UgaWYgKCFBU04xX2l0ZW1fZXhfbmV3KHB2YWwsIGl0KSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQkvKiBDSE9JQ0UgdHlwZSwgdHJ5IGVhY2ggcG9zc2liaWxpdHkgaW4gdHVybiAqLwpAQCAtMzQwLDcgKzM0MCw3IEBACiAJCQkJYnJlYWs7CiAJCQkvKiBPdGhlcndpc2UgbXVzdCBiZSBhbiBBU04xIHBhcnNpbmcgZXJyb3IgKi8KIAkJCWVycnR0ID0gdHQ7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2V4X2QyaSwgIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CiAJCQlnb3RvIGVycjsKIAkJCX0KIApAQCAtMzU0LDcgKzM1NCw3IEBACiAJCQkJQVNOMV9pdGVtX2V4X2ZyZWUocHZhbCwgaXQpOwogCQkJCXJldHVybiAtMTsKIAkJCQl9Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTk9fTUFUQ0hJTkdfQ0hPSUNFX1RZUEUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2V4X2QyaSwgIEFTTjFfUl9OT19NQVRDSElOR19DSE9JQ0VfVFlQRSk7CiAJCQlnb3RvIGVycjsKIAkJCX0KIApAQCAtMzgwLDcgKzM4MCw3IEBACiAJCQkJCSZwLCBsZW4sIHRhZywgYWNsYXNzLCBvcHQsIGN0eCk7CiAJCWlmICghcmV0KQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9leF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCWVsc2UgaWYgKHJldCA9PSAtMSkKQEAgLTM5NCwxMyArMzk0LDEzIEBACiAJCWVsc2Ugc2VxX25vbGVuID0gc2VxX2VvYzsKIAkJaWYgKCFjc3QpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfU0VRVUVOQ0VfTk9UX0NPTlNUUlVDVEVEKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9leF9kMmksICBBU04xX1JfU0VRVUVOQ0VfTk9UX0NPTlNUUlVDVEVEKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCiAJCWlmICghKnB2YWwgJiYgIUFTTjFfaXRlbV9leF9uZXcocHZhbCwgaXQpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9leF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOwogCQkJZ290byBlcnI7CiAJCQl9CiAKQEAgLTQzNyw3ICs0MzcsNyBAQAogCQkJCXsKIAkJCQlpZiAoIXNlcV9lb2MpCiAJCQkJCXsKLQkJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1VORVhQRUNURURfRU9DKTsKKwkJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2V4X2QyaSwgIEFTTjFfUl9VTkVYUEVDVEVEX0VPQyk7CiAJCQkJCWdvdG8gZXJyOwogCQkJCQl9CiAJCQkJbGVuIC09IHAgLSBxOwpAQCAtNDc5LDEzICs0NzksMTMgQEAKIAkJLyogQ2hlY2sgZm9yIEVPQyBpZiBleHBlY3Rpbmcgb25lICovCiAJCWlmIChzZXFfZW9jICYmICFhc24xX2NoZWNrX2VvYygmcCwgbGVuKSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9NSVNTSU5HX0VPQyk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX01JU1NJTkdfRU9DKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQkvKiBDaGVjayBhbGwgZGF0YSByZWFkICovCiAJCWlmICghc2VxX25vbGVuICYmIGxlbikKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9TRVFVRU5DRV9MRU5HVEhfTUlTTUFUQ0gpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2V4X2QyaSwgIEFTTjFfUl9TRVFVRU5DRV9MRU5HVEhfTUlTTUFUQ0gpOwogCQkJZ290byBlcnI7CiAJCQl9CiAKQEAgLTUwOCw3ICs1MDgsNyBAQAogCQkJZWxzZQogCQkJCXsKIAkJCQllcnJ0dCA9IHNlcXR0OwotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9GSUVMRF9NSVNTSU5HKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX0ZJRUxEX01JU1NJTkcpOwogCQkJCWdvdG8gZXJyOwogCQkJCX0KIAkJCX0KQEAgLTUyNCw3ICs1MjQsNyBAQAogCQlyZXR1cm4gMDsKIAkJfQogCWF1eGVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfQVVYX0VSUk9SKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX0FVWF9FUlJPUik7CiAJZXJyOgogCUFTTjFfaXRlbV9leF9mcmVlKHB2YWwsIGl0KTsKIAlpZiAoZXJydHQpCkBAIC01NjksMjEgKzU2OSwyMSBAQAogCQlxID0gcDsKIAkJaWYgKCFyZXQpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV90ZW1wbGF0ZV9leF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOwogCQkJcmV0dXJuIDA7CiAJCQl9CiAJCWVsc2UgaWYgKHJldCA9PSAtMSkKIAkJCXJldHVybiAtMTsKIAkJaWYgKCFjc3QpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfRVhQTElDSVRfVEFHX05PVF9DT05TVFJVQ1RFRCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3RlbXBsYXRlX2V4X2QyaSwgIEFTTjFfUl9FWFBMSUNJVF9UQUdfTk9UX0NPTlNUUlVDVEVEKTsKIAkJCXJldHVybiAwOwogCQkJfQogCQkvKiBXZSd2ZSBmb3VuZCB0aGUgZmllbGQgc28gaXQgY2FuJ3QgYmUgT1BUSU9OQUwgbm93ICovCiAJCXJldCA9IGFzbjFfdGVtcGxhdGVfbm9leHBfZDJpKHZhbCwgJnAsIGxlbiwgdHQsIDAsIGN0eCk7CiAJCWlmICghcmV0KQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfdGVtcGxhdGVfZXhfZDJpLCAgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKIAkJCXJldHVybiAwOwogCQkJfQogCQkvKiBXZSByZWFkIHRoZSBmaWVsZCBpbiBPSyBzbyB1cGRhdGUgbGVuZ3RoICovCkBAIC01OTMsNyArNTkzLDcgQEAKIAkJCS8qIElmIE5ERUYgd2UgbXVzdCBoYXZlIGFuIEVPQyBoZXJlICovCiAJCQlpZiAoIWFzbjFfY2hlY2tfZW9jKCZwLCBsZW4pKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTUlTU0lOR19FT0MpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfdGVtcGxhdGVfZXhfZDJpLCAgQVNOMV9SX01JU1NJTkdfRU9DKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQl9CkBAIC02MDMsNyArNjAzLDcgQEAKIAkJCSAqIGFuIGVycm9yICovCiAJCQlpZiAobGVuKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfRVhQTElDSVRfTEVOR1RIX01JU01BVENIKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3RlbXBsYXRlX2V4X2QyaSwgIEFTTjFfUl9FWFBMSUNJVF9MRU5HVEhfTUlTTUFUQ0gpOwogCQkJCWdvdG8gZXJyOwogCQkJCX0KIAkJCX0KQEAgLTY1OSw3ICs2NTksNyBAQAogCQkJCQkmcCwgbGVuLCBza3RhZywgc2thY2xhc3MsIG9wdCwgY3R4KTsKIAkJaWYgKCFyZXQpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOwogCQkJcmV0dXJuIDA7CiAJCQl9CiAJCWVsc2UgaWYgKHJldCA9PSAtMSkKQEAgLTY4Miw3ICs2ODIsNyBAQAogCQkJCQogCQlpZiAoISp2YWwpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3RlbXBsYXRlX25vZXhwX2QyaSwgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCkBAIC02OTYsNyArNjk2LDcgQEAKIAkJCQl7CiAJCQkJaWYgKCFza19lb2MpCiAJCQkJCXsKLQkJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1VORVhQRUNURURfRU9DKTsKKwkJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmksICBBU04xX1JfVU5FWFBFQ1RFRF9FT0MpOwogCQkJCQlnb3RvIGVycjsKIAkJCQkJfQogCQkJCWxlbiAtPSBwIC0gcTsKQEAgLTcwOCwyMCArNzA4LDIwIEBACiAJCQkJCQlBU04xX0lURU1fcHRyKHR0LT5pdGVtKSwKIAkJCQkJCS0xLCAwLCAwLCBjdHgpKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfdGVtcGxhdGVfbm9leHBfZDJpLCAgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQlsZW4gLT0gcCAtIHE7CiAJCQlpZiAoIXNrX0FTTjFfVkFMVUVfcHVzaCgoU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKikqdmFsLAogCQkJCQkJc2tmaWVsZCkpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3RlbXBsYXRlX25vZXhwX2QyaSwgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQl9CiAJCWlmIChza19lb2MpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTUlTU0lOR19FT0MpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmksICBBU04xX1JfTUlTU0lOR19FT0MpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCX0KQEAgLTczMiw3ICs3MzIsNyBAQAogCQkJQVNOMV9JVEVNX3B0cih0dC0+aXRlbSksIHR0LT50YWcsIGFjbGFzcywgb3B0LCBjdHgpOwogCQlpZiAoIXJldCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3RlbXBsYXRlX25vZXhwX2QyaSwgIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJZWxzZSBpZiAocmV0ID09IC0xKQpAQCAtNzQ1LDcgKzc0NSw3IEBACiAJCQkJCQkJLTEsIDAsIG9wdCwgY3R4KTsKIAkJaWYgKCFyZXQpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCWVsc2UgaWYgKHJldCA9PSAtMSkKQEAgLTc3NSw3ICs3NzUsNyBAQAogCWxvbmcgbGVuOyAKIAlpZiAoIXB2YWwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lMTEVHQUxfTlVMTCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX2V4X3ByaW1pdGl2ZSwgIEFTTjFfUl9JTExFR0FMX05VTEwpOwogCQlyZXR1cm4gMDsgLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLwogCQl9CiAKQEAgLTc5MywxMiArNzkzLDEyIEBACiAJCXVuc2lnbmVkIGNoYXIgb2NsYXNzOwogCQlpZiAodGFnID49IDApCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSUxMRUdBTF9UQUdHRURfQU5ZKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX2V4X3ByaW1pdGl2ZSwgIEFTTjFfUl9JTExFR0FMX1RBR0dFRF9BTlkpOwogCQkJcmV0dXJuIDA7CiAJCQl9CiAJCWlmIChvcHQpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSUxMRUdBTF9PUFRJT05BTF9BTlkpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kMmlfZXhfcHJpbWl0aXZlLCAgQVNOMV9SX0lMTEVHQUxfT1BUSU9OQUxfQU5ZKTsKIAkJCXJldHVybiAwOwogCQkJfQogCQlwID0gKmluOwpAQCAtODA2LDcgKzgwNiw3IEBACiAJCQkJCSZwLCBpbmxlbiwgLTEsIDAsIDAsIGN0eCk7CiAJCWlmICghcmV0KQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX2V4X3ByaW1pdGl2ZSwgIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CiAJCQlyZXR1cm4gMDsKIAkJCX0KIAkJaWYgKG9jbGFzcyAhPSBWX0FTTjFfVU5JVkVSU0FMKQpAQCAtODIzLDcgKzgyMyw3IEBACiAJCQkJJnAsIGlubGVuLCB0YWcsIGFjbGFzcywgb3B0LCBjdHgpOwogCWlmICghcmV0KQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX2V4X3ByaW1pdGl2ZSwgIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CiAJCXJldHVybiAwOwogCQl9CiAJZWxzZSBpZiAocmV0ID09IC0xKQpAQCAtODQzLDcgKzg0Myw3IEBACiAJCS8qIFNFUVVFTkNFIGFuZCBTRVQgbXVzdCBiZSBjb25zdHJ1Y3RlZCAqLwogCQllbHNlIGlmICghY3N0KQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1RZUEVfTk9UX0NPTlNUUlVDVEVEKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX2V4X3ByaW1pdGl2ZSwgIEFTTjFfUl9UWVBFX05PVF9DT05TVFJVQ1RFRCk7CiAJCQlyZXR1cm4gMDsKIAkJCX0KIApAQCAtODY5LDcgKzg2OSw4IEBACiAJCQl8fCB1dHlwZSA9PSBWX0FTTjFfRU5VTUVSQVRFRCkKIAkJCXsKIAkJCS8qIFRoZXNlIHR5cGVzIG9ubHkgaGF2ZSBwcmltaXRpdmUgZW5jb2RpbmdzLiAqLwotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1RZUEVfTk9UX1BSSU1JVElWRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2QyaV9leF9wcmltaXRpdmUsCisJCQkJQVNOMV9SX1RZUEVfTk9UX1BSSU1JVElWRSk7CiAJCQlyZXR1cm4gMDsKIAkJCX0KIApAQCAtODkxLDcgKzg5Miw3IEBACiAJCS8qIEFwcGVuZCBhIGZpbmFsIG51bGwgdG8gc3RyaW5nICovCiAJCWlmICghQlVGX01FTV9ncm93X2NsZWFuKCZidWYsIGxlbiArIDEpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kMmlfZXhfcHJpbWl0aXZlLCAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJcmV0dXJuIDA7CiAJCQl9CiAJCWJ1Zi5kYXRhW2xlbl0gPSAwOwpAQCAtOTU5LDcgKzk2MCw3IEBACiAJCWNhc2UgVl9BU04xX05VTEw6CiAJCWlmIChsZW4pCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTlVMTF9JU19XUk9OR19MRU5HVEgpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9leF9jMmksICBBU04xX1JfTlVMTF9JU19XUk9OR19MRU5HVEgpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCSpwdmFsID0gKEFTTjFfVkFMVUUgKikxOwpAQCAtOTY4LDcgKzk2OSw3IEBACiAJCWNhc2UgVl9BU04xX0JPT0xFQU46CiAJCWlmIChsZW4gIT0gMSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9CT09MRUFOX0lTX1dST05HX0xFTkdUSCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2V4X2MyaSwgIEFTTjFfUl9CT09MRUFOX0lTX1dST05HX0xFTkdUSCk7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJZWxzZQpAQCAtMTAxNSwxMiArMTAxNiwxMiBAQAogCQlkZWZhdWx0OgogCQlpZiAodXR5cGUgPT0gVl9BU04xX0JNUFNUUklORyAmJiAobGVuICYgMSkpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfQk1QU1RSSU5HX0lTX1dST05HX0xFTkdUSCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2V4X2MyaSwgIEFTTjFfUl9CTVBTVFJJTkdfSVNfV1JPTkdfTEVOR1RIKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQlpZiAodXR5cGUgPT0gVl9BU04xX1VOSVZFUlNBTFNUUklORyAmJiAobGVuICYgMykpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfVU5JVkVSU0FMU1RSSU5HX0lTX1dST05HX0xFTkdUSCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2V4X2MyaSwgIEFTTjFfUl9VTklWRVJTQUxTVFJJTkdfSVNfV1JPTkdfTEVOR1RIKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQkvKiBBbGwgYmFzZWQgb24gQVNOMV9TVFJJTkcgYW5kIGhhbmRsZWQgdGhlIHNhbWUgKi8KQEAgLTEwMjksNyArMTAzMCw3IEBACiAJCQlzdG1wID0gQVNOMV9TVFJJTkdfdHlwZV9uZXcodXR5cGUpOwogCQkJaWYgKCFzdG1wKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9leF9jMmksICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJKnB2YWwgPSAoQVNOMV9WQUxVRSAqKXN0bXA7CkBAIC0xMDUyLDcgKzEwNTMsNyBAQAogCQkJewogCQkJaWYgKCFBU04xX1NUUklOR19zZXQoc3RtcCwgY29udCwgbGVuKSkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZXhfYzJpLCAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJCUFTTjFfU1RSSU5HX2ZyZWUoc3RtcCk7CQogCQkJCSpwdmFsID0gTlVMTDsKIAkJCQlnb3RvIGVycjsKQEAgLTExMTQsNyArMTExNSw3IEBACiAJCWlmKCFhc24xX2NoZWNrX3RsZW4oJnBsZW4sIE5VTEwsIE5VTEwsICZpbmYsIE5VTEwsICZwLCBsZW4sCiAJCQkJLTEsIDAsIDAsIE5VTEwpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZmluZF9lbmQsICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOwogCQkJcmV0dXJuIDA7CiAJCQl9CiAJCWlmIChpbmYpCkBAIC0xMTI1LDcgKzExMjYsNyBAQAogCQl9CiAJaWYgKGV4cGVjdGVkX2VvYykKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTUlTU0lOR19FT0MpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2ZpbmRfZW5kLCAgQVNOMV9SX01JU1NJTkdfRU9DKTsKIAkJcmV0dXJuIDA7CiAJCX0KIAkqaW4gPSBwOwpAQCAtMTE3Miw3ICsxMTczLDcgQEAKIAkJCSAqIGNvbnN0cnVjdGVkIGZvcm0gKi8KIAkJCWlmICghaW5mKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfVU5FWFBFQ1RFRF9FT0MpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfY29sbGVjdCwgIEFTTjFfUl9VTkVYUEVDVEVEX0VPQyk7CiAJCQkJcmV0dXJuIDA7CiAJCQkJfQogCQkJaW5mID0gMDsKQEAgLTExODIsNyArMTE4Myw3IEBACiAJCWlmICghYXNuMV9jaGVja190bGVuKCZwbGVuLCBOVUxMLCBOVUxMLCAmaW5pbmYsICZjc3QsICZwLAogCQkJCQlsZW4sIHRhZywgYWNsYXNzLCAwLCBOVUxMKSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2NvbGxlY3QsICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOwogCQkJcmV0dXJuIDA7CiAJCQl9CiAKQEAgLTExOTEsNyArMTE5Miw3IEBACiAJCQl7CiAJCQlpZiAoZGVwdGggPj0gQVNOMV9NQVhfU1RSSU5HX05FU1QpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9ORVNURURfQVNOMV9TVFJJTkcpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfY29sbGVjdCwgIEFTTjFfUl9ORVNURURfQVNOMV9TVFJJTkcpOwogCQkJCXJldHVybiAwOwogCQkJCX0KIAkJCWlmICghYXNuMV9jb2xsZWN0KGJ1ZiwgJnAsIHBsZW4sIGluaW5mLCB0YWcsIGFjbGFzcywKQEAgLTEyMDQsNyArMTIwNSw3IEBACiAJCX0KIAlpZiAoaW5mKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9NSVNTSU5HX0VPQyk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfY29sbGVjdCwgIEFTTjFfUl9NSVNTSU5HX0VPQyk7CiAJCXJldHVybiAwOwogCQl9CiAJKmluID0gcDsKQEAgLTEyMTksNyArMTIyMCw3IEBACiAJCWxlbiA9IGJ1Zi0+bGVuZ3RoOwogCQlpZiAoIUJVRl9NRU1fZ3Jvd19jbGVhbihidWYsIGxlbiArIHBsZW4pKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgY29sbGVjdF9kYXRhLCAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJcmV0dXJuIDA7CiAJCQl9CiAJCW1lbWNweShidWYtPmRhdGEgKyBsZW4sICpwLCBwbGVuKTsKQEAgLTEyODcsNyArMTI4OCw3IEBACiAJCQkgKi8KIAkJCWlmICghKGkgJiAweDgxKSAmJiAoKHBsZW4gKyBjdHgtPmhkcmxlbikgPiBsZW4pKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfVE9PX0xPTkcpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfY2hlY2tfdGxlbiwgIEFTTjFfUl9UT09fTE9ORyk7CiAJCQkJYXNuMV90bGNfY2xlYXIoY3R4KTsKIAkJCQlyZXR1cm4gMDsKIAkJCQl9CkBAIC0xMjk2LDcgKzEyOTcsNyBAQAogCiAJaWYgKGkgJiAweDgwKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9CQURfT0JKRUNUX0hFQURFUik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfY2hlY2tfdGxlbiwgIEFTTjFfUl9CQURfT0JKRUNUX0hFQURFUik7CiAJCWFzbjFfdGxjX2NsZWFyKGN0eCk7CiAJCXJldHVybiAwOwogCQl9CkBAIC0xMzA5LDcgKzEzMTAsNyBAQAogCQkJICovCiAJCQlpZiAob3B0KSByZXR1cm4gLTE7CiAJCQlhc24xX3RsY19jbGVhcihjdHgpOwotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1dST05HX1RBRyk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2NoZWNrX3RsZW4sICBBU04xX1JfV1JPTkdfVEFHKTsKIAkJCXJldHVybiAwOwogCQkJfQogCQkvKiBXZSBoYXZlIGEgdGFnIGFuZCBjbGFzcyBtYXRjaDoKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXNuMS90YXNuX25ldy5jIGIvc3JjL2NyeXB0by9hc24xL3Rhc25fbmV3LmMKaW5kZXggYzY4ZmUwNi4uNmQ2OWRjYiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hc24xL3Rhc25fbmV3LmMKKysrIGIvc3JjL2NyeXB0by9hc24xL3Rhc25fbmV3LmMKQEAgLTIwOSw3ICsyMDksNyBAQAogCXJldHVybiAxOwogCiAJbWVtZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2l0ZW1fZXhfY29tYmluZV9uZXcsICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJQVNOMV9pdGVtX2V4X2ZyZWUocHZhbCwgaXQpOwogI2lmZGVmIENSWVBUT19NREVCVUcKIAlpZiAoaXQtPnNuYW1lKSBDUllQVE9fcG9wX2luZm8oKTsKQEAgLTIxNyw3ICsyMTcsNyBAQAogCXJldHVybiAwOwogCiAJYXV4ZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9BVVhfRVJST1IpOworCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfaXRlbV9leF9jb21iaW5lX25ldywgIEFTTjFfUl9BVVhfRVJST1IpOwogCUFTTjFfaXRlbV9leF9mcmVlKHB2YWwsIGl0KTsKICNpZmRlZiBDUllQVE9fTURFQlVHCiAJaWYgKGl0LT5zbmFtZSkgQ1JZUFRPX3BvcF9pbmZvKCk7CkBAIC0yODksNyArMjg5LDcgQEAKIAkJc2t2YWwgPSBza19BU04xX1ZBTFVFX25ld19udWxsKCk7CiAJCWlmICghc2t2YWwpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX3RlbXBsYXRlX25ldywgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCXJldCA9IDA7CiAJCQlnb3RvIGRvbmU7CiAJCQl9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2FzbjEvdGFzbl9wcm4uYyBiL3NyYy9jcnlwdG8vYXNuMS90YXNuX3Bybi5jCmluZGV4IDZhMDk3YTEuLmRmMTlmZjAgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYXNuMS90YXNuX3Bybi5jCisrKyBiL3NyYy9jcnlwdG8vYXNuMS90YXNuX3Bybi5jCkBAIC04OCw3ICs4OCw3IEBACiAJcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEFTTjFfUENUWCkpOwogCWlmIChyZXQgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUENUWF9uZXcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIE5VTEw7CiAJCX0KIAlyZXQtPmZsYWdzID0gMDsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXNuMS90YXNuX3V0bC5jIGIvc3JjL2NyeXB0by9hc24xL3Rhc25fdXRsLmMKaW5kZXggOTYwY2RiYi4uZmYzNzY0ZSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hc24xL3Rhc25fdXRsLmMKKysrIGIvc3JjL2NyeXB0by9hc24xL3Rhc25fdXRsLmMKQEAgLTI2MCw3ICsyNjAsOCBAQAogZXJyOgogICAvKiBGSVhNRTogc2hvdWxkIGxvZyB0aGUgdmFsdWUgb3IgT0lEIG9mIHVuc3VwcG9ydGVkIHR5cGUgKi8KICAgaWYgKG51bGxlcnIpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfVU5TVVBQT1JURURfQU5ZX0RFRklORURfQllfVFlQRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kb19hZGIsCisgICAgICAgICAgICAgICAgICAgICAgQVNOMV9SX1VOU1VQUE9SVEVEX0FOWV9ERUZJTkVEX0JZX1RZUEUpOwogICB9CiAgIHJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hc24xL3hfbG9uZy5jIGIvc3JjL2NyeXB0by9hc24xL3hfbG9uZy5jCmluZGV4IDdiMWE2ZmUuLjVjMmY5NmUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYXNuMS94X2xvbmcuYworKysgYi9zcmMvY3J5cHRvL2FzbjEveF9sb25nLmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogCXVuc2lnbmVkIGxvbmcgdXRtcCA9IDA7CiAJY2hhciAqY3AgPSAoY2hhciAqKXB2YWw7CiAJaWYobGVuID4gKGludClzaXplb2YobG9uZykpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lOVEVHRVJfVE9PX0xBUkdFX0ZPUl9MT05HKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgbG9uZ19jMmksICBBU04xX1JfSU5URUdFUl9UT09fTEFSR0VfRk9SX0xPTkcpOwogCQlyZXR1cm4gMDsKIAl9CiAJLyogSXMgaXQgbmVnYXRpdmU/ICovCkBAIC0xNjgsNyArMTY4LDcgQEAKIAkJbHRtcCA9IC1sdG1wOwogCX0KIAlpZihsdG1wID09IGl0LT5zaXplKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTlRFR0VSX1RPT19MQVJHRV9GT1JfTE9ORyk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGxvbmdfYzJpLCAgQVNOMV9SX0lOVEVHRVJfVE9PX0xBUkdFX0ZPUl9MT05HKTsKIAkJcmV0dXJuIDA7CiAJfQogCW1lbWNweShjcCwgJmx0bXAsIHNpemVvZihsb25nKSk7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Jhc2U2NC9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vYmFzZTY0L0NNYWtlTGlzdHMudHh0CmluZGV4IGYxZGJhNmMuLjQyMDM3YTUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYmFzZTY0L0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vYmFzZTY0L0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCiAKIGFkZF9saWJyYXJ5KAogICBiYXNlNjQKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYmlvL0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9iaW8vQ01ha2VMaXN0cy50eHQKaW5kZXggOGRlMDkwYS4uZGJmNTk1MSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9iaW8vQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9iaW8vQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKIAogYWRkX2xpYnJhcnkoCiAgIGJpbwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9iaW8vYmlvLmMgYi9zcmMvY3J5cHRvL2Jpby9iaW8uYwppbmRleCA0YmM5OGJhLi41YWM1OTExIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Jpby9iaW8uYworKysgYi9zcmMvY3J5cHRvL2Jpby9iaW8uYwpAQCAtOTAsNyArOTAsNyBAQAogQklPICpCSU9fbmV3KGNvbnN0IEJJT19NRVRIT0QgKm1ldGhvZCkgewogICBCSU8gKnJldCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihCSU8pKTsKICAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIApAQCAtMTUzLDcgKzE1Myw3IEBACiAgIH0KIAogICBpZiAoaW9fZnVuYyA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9VTlNVUFBPUlRFRF9NRVRIT0QpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgYmlvX2lvLCBCSU9fUl9VTlNVUFBPUlRFRF9NRVRIT0QpOwogICAgIHJldHVybiAtMjsKICAgfQogCkBAIC0xNjUsNyArMTY1LDcgQEAKICAgfQogCiAgIGlmICghYmlvLT5pbml0KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9VTklOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIGJpb19pbywgQklPX1JfVU5JTklUSUFMSVpFRCk7CiAgICAgcmV0dXJuIC0yOwogICB9CiAKQEAgLTIxNyw3ICsyMTcsNyBAQAogICB9CiAKICAgaWYgKGJpby0+bWV0aG9kID09IE5VTEwgfHwgYmlvLT5tZXRob2QtPmN0cmwgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19jdHJsLCBCSU9fUl9VTlNVUFBPUlRFRF9NRVRIT0QpOwogICAgIHJldHVybiAtMjsKICAgfQogCkBAIC0zMjMsNyArMzIzLDcgQEAKICAgfQogCiAgIGlmIChiaW8tPm1ldGhvZCA9PSBOVUxMIHx8IGJpby0+bWV0aG9kLT5jYWxsYmFja19jdHJsID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fY2FsbGJhY2tfY3RybCwgQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC00NjIsMTAgKzQ2Miw2IEBACiAgIEVSUl9wcmludF9lcnJvcnNfY2IocHJpbnRfYmlvLCBiaW8pOwogfQogCi12b2lkIEVSUl9wcmludF9lcnJvcnMoQklPICpiaW8pIHsKLSAgQklPX3ByaW50X2Vycm9ycyhiaW8pOwotfQotCiAvKiBiaW9fcmVhZF9hbGwgcmVhZHMgZXZlcnl0aGluZyBmcm9tIHxiaW98IGFuZCBwcmVwZW5kcyB8cHJlZml4fCB0byBpdC4gT24KICAqIHN1Y2Nlc3MsIHwqb3V0fCBpcyBzZXQgdG8gYW4gYWxsb2NhdGVkIGJ1ZmZlciAod2hpY2ggc2hvdWxkIGJlIGZyZWVkIHdpdGgKICAqIHxPUEVOU1NMX2ZyZWV8KSwgfCpvdXRfbGVufCBpcyBzZXQgdG8gaXRzIGxlbmd0aCBhbmQgb25lIGlzIHJldHVybmVkLiBUaGUKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYmlvL2Jpb19tZW0uYyBiL3NyYy9jcnlwdG8vYmlvL2Jpb19tZW0uYwppbmRleCBlZjU2MTExLi5mM2FhZDZmIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Jpby9iaW9fbWVtLmMKKysrIGIvc3JjL2NyeXB0by9iaW8vYmlvX21lbS5jCkBAIC03MCw3ICs3MCw3IEBACiAgIGNvbnN0IHNpemVfdCBzaXplID0gbGVuIDwgMCA/IHN0cmxlbigoY2hhciAqKWJ1ZikgOiAoc2l6ZV90KWxlbjsKIAogICBpZiAoIWJ1ZiAmJiBsZW4gIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfTlVMTF9QQVJBTUVURVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX25ld19tZW1fYnVmLCBCSU9fUl9OVUxMX1BBUkFNRVRFUik7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIApAQCAtMTY3LDcgKzE2Nyw3IEBACiAgIGIgPSAoQlVGX01FTSAqKWJpby0+cHRyOwogCiAgIGlmIChiaW8tPmZsYWdzICYgQklPX0ZMQUdTX01FTV9SRE9OTFkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX1dSSVRFX1RPX1JFQURfT05MWV9CSU8pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgbWVtX3dyaXRlLCBCSU9fUl9XUklURV9UT19SRUFEX09OTFlfQklPKTsKICAgICBnb3RvIGVycjsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Jpby9idWZmZXIuYyBiL3NyYy9jcnlwdG8vYmlvL2J1ZmZlci5jCmluZGV4IDlkMGNiM2MuLjNmYzA2ODUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYmlvL2J1ZmZlci5jCisrKyBiL3NyYy9jcnlwdG8vYmlvL2J1ZmZlci5jCkBAIC00MDYsNyArNDA2LDcgQEAKICAgcmV0dXJuIHJldDsKIAogbWFsbG9jX2Vycm9yOgotICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBidWZmZXJfY3RybCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9iaW8vY29ubmVjdC5jIGIvc3JjL2NyeXB0by9iaW8vY29ubmVjdC5jCmluZGV4IDJlZDJkZWYuLjMyMzYxYmYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYmlvL2Nvbm5lY3QuYworKysgYi9zcmMvY3J5cHRvL2Jpby9jb25uZWN0LmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogICAgICAgY2FzZSBCSU9fQ09OTl9TX0JFRk9SRToKICAgICAgICAgcCA9IGMtPnBhcmFtX2hvc3RuYW1lOwogICAgICAgICBpZiAocCA9PSBOVUxMKSB7Ci0gICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9OT19IT1NUTkFNRV9TUEVDSUZJRUQpOworICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgY29ubl9zdGF0ZSwgQklPX1JfTk9fSE9TVE5BTUVfU1BFQ0lGSUVEKTsKICAgICAgICAgICBnb3RvIGV4aXRfbG9vcDsKICAgICAgICAgfQogICAgICAgICBmb3IgKDsgKnAgIT0gMDsgcCsrKSB7CkBAIC0xNjcsNyArMTY3LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChjLT5wYXJhbV9wb3J0ID09IE5VTEwpIHsKLSAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX05PX1BPUlRfU1BFQ0lGSUVEKTsKKyAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIGNvbm5fc3RhdGUsIEJJT19SX05PX1BPUlRfU1BFQ0lGSUVEKTsKICAgICAgICAgICBFUlJfYWRkX2Vycm9yX2RhdGEoMiwgImhvc3Q9IiwgYy0+cGFyYW1faG9zdG5hbWUpOwogICAgICAgICAgIGdvdG8gZXhpdF9sb29wOwogICAgICAgICB9CkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICAgICAgaWYgKCFiaW9faXBfYW5kX3BvcnRfdG9fc29ja2V0X2FuZF9hZGRyKAogICAgICAgICAgICAgICAgICZiaW8tPm51bSwgJmMtPnRoZW0sICZjLT50aGVtX2xlbmd0aCwgYy0+cGFyYW1faG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgYy0+cGFyYW1fcG9ydCkpIHsKLSAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX1VOQUJMRV9UT19DUkVBVEVfU09DS0VUKTsKKyAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIGNvbm5fc3RhdGUsIEJJT19SX1VOQUJMRV9UT19DUkVBVEVfU09DS0VUKTsKICAgICAgICAgICBFUlJfYWRkX2Vycm9yX2RhdGEoNCwgImhvc3Q9IiwgYy0+cGFyYW1faG9zdG5hbWUsICI6IiwgYy0+cGFyYW1fcG9ydCk7CiAgICAgICAgICAgZ290byBleGl0X2xvb3A7CiAgICAgICAgIH0KQEAgLTE4NSw3ICsxODUsNyBAQAogCiAgICAgICAgIGlmIChjLT5uYmlvKSB7CiAgICAgICAgICAgaWYgKCFiaW9fc29ja2V0X25iaW8oYmlvLT5udW0sIDEpKSB7Ci0gICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX0VSUk9SX1NFVFRJTkdfTkJJTyk7CisgICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIGNvbm5fc3RhdGUsIEJJT19SX0VSUk9SX1NFVFRJTkdfTkJJTyk7CiAgICAgICAgICAgICBFUlJfYWRkX2Vycm9yX2RhdGEoNCwgImhvc3Q9IiwgYy0+cGFyYW1faG9zdG5hbWUsICI6IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5wYXJhbV9wb3J0KTsKICAgICAgICAgICAgIGdvdG8gZXhpdF9sb29wOwpAQCAtMTk3LDcgKzE5Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGkpKTsKICAgICAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgICBPUEVOU1NMX1BVVF9TWVNURU1fRVJST1Ioc2V0c29ja29wdCk7Ci0gICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9LRUVQQUxJVkUpOworICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgY29ubl9zdGF0ZSwgQklPX1JfS0VFUEFMSVZFKTsKICAgICAgICAgICBFUlJfYWRkX2Vycm9yX2RhdGEoNCwgImhvc3Q9IiwgYy0+cGFyYW1faG9zdG5hbWUsICI6IiwgYy0+cGFyYW1fcG9ydCk7CiAgICAgICAgICAgZ290byBleGl0X2xvb3A7CiAgICAgICAgIH0KQEAgLTIxMSw3ICsyMTEsNyBAQAogICAgICAgICAgICAgYmlvLT5yZXRyeV9yZWFzb24gPSBCSU9fUlJfQ09OTkVDVDsKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgT1BFTlNTTF9QVVRfU1lTVEVNX0VSUk9SKGNvbm5lY3QpOwotICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9DT05ORUNUX0VSUk9SKTsKKyAgICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgY29ubl9zdGF0ZSwgQklPX1JfQ09OTkVDVF9FUlJPUik7CiAgICAgICAgICAgICBFUlJfYWRkX2Vycm9yX2RhdGEoNCwgImhvc3Q9IiwgYy0+cGFyYW1faG9zdG5hbWUsICI6IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5wYXJhbV9wb3J0KTsKICAgICAgICAgICB9CkBAIC0yMzIsNyArMjMyLDcgQEAKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGJpbyk7CiAgICAgICAgICAgICBPUEVOU1NMX1BVVF9TWVNURU1fRVJST1IoY29ubmVjdCk7Ci0gICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX05CSU9fQ09OTkVDVF9FUlJPUik7CisgICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIGNvbm5fc3RhdGUsIEJJT19SX05CSU9fQ09OTkVDVF9FUlJPUik7CiAgICAgICAgICAgICBFUlJfYWRkX2Vycm9yX2RhdGEoNCwgImhvc3Q9IiwgYy0+cGFyYW1faG9zdG5hbWUsICI6IiwgYy0+cGFyYW1fcG9ydCk7CiAgICAgICAgICAgICByZXQgPSAwOwogICAgICAgICAgIH0KQEAgLTQ2NCw3ICs0NjQsNyBAQAogICAgICAgYnJlYWs7CiAgICAgY2FzZSBCSU9fQ1RSTF9TRVRfQ0FMTEJBQ0s6IHsKICNpZiAwIC8qIEZJWE1FOiBTaG91bGQgdGhpcyBiZSB1c2VkPyAgLS0gUmljaGFyZCBMZXZpdHRlICovCi0JCU9QRU5TU0xfUFVUX0VSUk9SKEJJTywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQklPLCBYWFgsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAJCXJldCA9IC0xOwogI2Vsc2UKICAgICAgIHJldCA9IDA7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Jpby9maWxlLmMgYi9zcmMvY3J5cHRvL2Jpby9maWxlLmMKaW5kZXggMmQzY2NmZS4uN2Y1N2FhZCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9iaW8vZmlsZS5jCisrKyBiL3NyYy9jcnlwdG8vYmlvL2ZpbGUuYwpAQCAtODgsNyArODgsNyBAQAogI2RlZmluZSBCSU9fRlBfQVBQRU5EIDB4MDgKIAogc3RhdGljIEZJTEUgKm9wZW5fZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9kZSkgewotI2lmIGRlZmluZWQoT1BFTlNTTF9XSU5ET1dTKSAmJiBkZWZpbmVkKENQX1VURjgpCisjaWYgZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoQ1BfVVRGOCkKICAgaW50IHN6LCBsZW5fMCA9IChpbnQpc3RybGVuKGZpbGVuYW1lKSArIDE7CiAgIERXT1JEIGZsYWdzOwogCkBAIC0xMzMsOSArMTMzLDkgQEAKIAogICAgIEVSUl9hZGRfZXJyb3JfZGF0YSg1LCAiZm9wZW4oJyIsIGZpbGVuYW1lLCAiJywnIiwgbW9kZSwgIicpIik7CiAgICAgaWYgKGVycm5vID09IEVOT0VOVCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9OT19TVUNIX0ZJTEUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fbmV3X2ZpbGUsIEJJT19SX05PX1NVQ0hfRklMRSk7CiAgICAgfSBlbHNlIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfU1lTX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19uZXdfZmlsZSwgQklPX1JfU1lTX0xJQik7CiAgICAgfQogICAgIHJldHVybiBOVUxMOwogICB9CkBAIC0xODIsMTkgKzE4MiwyMCBAQAogfQogCiBzdGF0aWMgaW50IGZpbGVfcmVhZChCSU8gKmIsIGNoYXIgKm91dCwgaW50IG91dGwpIHsKKyAgaW50IHJldCA9IDA7CisKICAgaWYgKCFiLT5pbml0KSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAotICBzaXplX3QgcmV0ID0gZnJlYWQob3V0LCAxLCBvdXRsLCAoRklMRSAqKWItPnB0cik7CisgIHJldCA9IGZyZWFkKG91dCwgMSwgb3V0bCwgKEZJTEUgKiliLT5wdHIpOwogICBpZiAocmV0ID09IDAgJiYgZmVycm9yKChGSUxFICopYi0+cHRyKSkgewogICAgIE9QRU5TU0xfUFVUX1NZU1RFTV9FUlJPUihmcmVhZCk7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBFUlJfUl9TWVNfTElCKTsKLSAgICByZXR1cm4gLTE7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBmaWxlX3JlYWQsIEVSUl9SX1NZU19MSUIpOworICAgIHJldCA9IC0xOwogICB9CiAKLSAgLyogZnJlYWQgcmVhZHMgYXQgbW9zdCB8b3V0bHwgYnl0ZXMsIHNvIHxyZXR8IGZpdHMgaW4gYW4gaW50LiAqLwotICByZXR1cm4gKGludClyZXQ7CisgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZmlsZV93cml0ZShCSU8gKmIsIGNvbnN0IGNoYXIgKmluLCBpbnQgaW5sKSB7CkBAIC0yNTIsNyArMjUzLDcgQEAKICAgICAgIH0gZWxzZSBpZiAobnVtICYgQklPX0ZQX1JFQUQpIHsKICAgICAgICAgQlVGX3N0cmxjcHkocCwgInIiLCBzaXplb2YocCkpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9CQURfRk9QRU5fTU9ERSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgZmlsZV9jdHJsLCBCSU9fUl9CQURfRk9QRU5fTU9ERSk7CiAgICAgICAgIHJldCA9IDA7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQpAQCAtMjYwLDcgKzI2MSw3IEBACiAgICAgICBpZiAoZnAgPT0gTlVMTCkgewogICAgICAgICBPUEVOU1NMX1BVVF9TWVNURU1fRVJST1IoZm9wZW4pOwogICAgICAgICBFUlJfYWRkX2Vycm9yX2RhdGEoNSwgImZvcGVuKCciLCBwdHIsICInLCciLCBwLCAiJykiKTsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBFUlJfUl9TWVNfTElCKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBmaWxlX2N0cmwsIEVSUl9SX1NZU19MSUIpOwogICAgICAgICByZXQgPSAwOwogICAgICAgICBicmVhazsKICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYmlvL3BhaXIuYyBiL3NyYy9jcnlwdG8vYmlvL3BhaXIuYwppbmRleCA2Zjc4ODkwLi5jYzU1OTUwIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Jpby9wYWlyLmMKKysrIGIvc3JjL2NyeXB0by9iaW8vcGFpci5jCkBAIC0xODEsMjUgKzE4MSwyNyBAQAogICBCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYmlvKTsKIAogICBpZiAoIWJpby0+aW5pdCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfVU5JTklUSUFMSVpFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9femVyb19jb3B5X2dldF9yZWFkX2J1ZiwgQklPX1JfVU5JTklUSUFMSVpFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBiID0gYmlvLT5wdHI7CiAKICAgaWYgKCFiIHx8ICFiLT5wZWVyKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9VTlNVUFBPUlRFRF9NRVRIT0QpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX3plcm9fY29weV9nZXRfcmVhZF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIHBlZXJfYiA9IGItPnBlZXItPnB0cjsKICAgaWYgKCFwZWVyX2IgfHwgIXBlZXJfYi0+cGVlciB8fCBwZWVyX2ItPnBlZXItPnB0ciAhPSBiKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9VTlNVUFBPUlRFRF9NRVRIT0QpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX3plcm9fY29weV9nZXRfcmVhZF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChwZWVyX2ItPnplcm9fY29weV9yZWFkX2xvY2spIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX0lOVkFMSURfQVJHVU1FTlQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX3plcm9fY29weV9nZXRfcmVhZF9idWYsIEJJT19SX0lOVkFMSURfQVJHVU1FTlQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTIyNywzMiArMjI5LDM3IEBACiAgIGFzc2VydChCSU9fZ2V0X3JldHJ5X2ZsYWdzKGJpbykgPT0gMCk7CiAKICAgaWYgKCFiaW8tPmluaXQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX1VOSU5JVElBTElaRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX3plcm9fY29weV9nZXRfcmVhZF9idWZfZG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBCSU9fUl9VTklOSVRJQUxJWkVEKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGIgPSBiaW8tPnB0cjsKIAogICBpZiAoIWIgfHwgIWItPnBlZXIpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9femVyb19jb3B5X2dldF9yZWFkX2J1Zl9kb25lLAorICAgICAgICAgICAgICAgICAgICAgIEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBwZWVyX2IgPSBiLT5wZWVyLT5wdHI7CiAgIGlmICghcGVlcl9iIHx8ICFwZWVyX2ItPnBlZXIgfHwgcGVlcl9iLT5wZWVyLT5wdHIgIT0gYikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT196ZXJvX2NvcHlfZ2V0X3JlYWRfYnVmX2RvbmUsCisgICAgICAgICAgICAgICAgICAgICAgQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmICghcGVlcl9iLT56ZXJvX2NvcHlfcmVhZF9sb2NrKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9JTlZBTElEX0FSR1VNRU5UKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT196ZXJvX2NvcHlfZ2V0X3JlYWRfYnVmX2RvbmUsCisgICAgICAgICAgICAgICAgICAgICAgQklPX1JfSU5WQUxJRF9BUkdVTUVOVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBtYXhfYXZhaWxhYmxlID0KICAgICAgIGJpb196ZXJvX2NvcHlfZ2V0X3JlYWRfYnVmKHBlZXJfYiwgJmR1bW15X3JlYWRfYnVmLCAmZHVtbXlfcmVhZF9vZmZzZXQpOwogICBpZiAoYnl0ZXNfcmVhZCA+IG1heF9hdmFpbGFibGUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX0lOVkFMSURfQVJHVU1FTlQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX3plcm9fY29weV9nZXRfcmVhZF9idWZfZG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBCSU9fUl9JTlZBTElEX0FSR1VNRU5UKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0zMTEsMzMgKzMxOCwzNSBAQAogICBCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYmlvKTsKIAogICBpZiAoIWJpby0+aW5pdCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfVU5JTklUSUFMSVpFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9femVyb19jb3B5X2dldF93cml0ZV9idWYsIEJJT19SX1VOSU5JVElBTElaRUQpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgYiA9IGJpby0+cHRyOwogCiAgIGlmICghYiB8fCAhYi0+YnVmIHx8ICFiLT5wZWVyKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9VTlNVUFBPUlRFRF9NRVRIT0QpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX3plcm9fY29weV9nZXRfd3JpdGVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgIEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcGVlcl9iID0gYi0+cGVlci0+cHRyOwogICBpZiAoIXBlZXJfYiB8fCAhcGVlcl9iLT5wZWVyIHx8IHBlZXJfYi0+cGVlci0+cHRyICE9IGIpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9femVyb19jb3B5X2dldF93cml0ZV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGFzc2VydChiLT5idWYgIT0gTlVMTCk7CiAKICAgaWYgKGItPnplcm9fY29weV93cml0ZV9sb2NrKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9JTlZBTElEX0FSR1VNRU5UKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT196ZXJvX2NvcHlfZ2V0X3dyaXRlX2J1ZiwgQklPX1JfSU5WQUxJRF9BUkdVTUVOVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBiLT5yZXF1ZXN0ID0gMDsKICAgaWYgKGItPmNsb3NlZCkgewogICAgIC8qIEJpbyBpcyBhbHJlYWR5IGNsb3NlZC4gKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX0JST0tFTl9QSVBFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT196ZXJvX2NvcHlfZ2V0X3dyaXRlX2J1ZiwgQklPX1JfQlJPS0VOX1BJUEUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTM2MCwzOCArMzY5LDQzIEBACiAgIHVpbnQ4X3QqIGR1bW15X3dyaXRlX2J1ZjsKIAogICBpZiAoIWJpby0+aW5pdCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfVU5JTklUSUFMSVpFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9femVyb19jb3B5X2dldF93cml0ZV9idWZfZG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBCSU9fUl9VTklOSVRJQUxJWkVEKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGIgPSBiaW8tPnB0cjsKIAogICBpZiAoIWIgfHwgIWItPmJ1ZiB8fCAhYi0+cGVlcikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT196ZXJvX2NvcHlfZ2V0X3dyaXRlX2J1Zl9kb25lLAorICAgICAgICAgICAgICAgICAgICAgIEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcGVlcl9iID0gYi0+cGVlci0+cHRyOwogICBpZiAoIXBlZXJfYiB8fCAhcGVlcl9iLT5wZWVyIHx8IHBlZXJfYi0+cGVlci0+cHRyICE9IGIpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9femVyb19jb3B5X2dldF93cml0ZV9idWZfZG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBCSU9fUl9VTlNVUFBPUlRFRF9NRVRIT0QpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgYi0+cmVxdWVzdCA9IDA7CiAgIGlmIChiLT5jbG9zZWQpIHsKICAgICAvKiBCSU8gaXMgYWxyZWFkeSBjbG9zZWQuICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9CUk9LRU5fUElQRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9femVyb19jb3B5X2dldF93cml0ZV9idWZfZG9uZSwgQklPX1JfQlJPS0VOX1BJUEUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKCFiLT56ZXJvX2NvcHlfd3JpdGVfbG9jaykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfSU5WQUxJRF9BUkdVTUVOVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9femVyb19jb3B5X2dldF93cml0ZV9idWZfZG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBCSU9fUl9JTlZBTElEX0FSR1VNRU5UKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIHJlc3QgPSBiaW9femVyb19jb3B5X2dldF93cml0ZV9idWYoYiwgJmR1bW15X3dyaXRlX2J1ZiwgJmR1bW15X3dyaXRlX29mZnNldCk7CiAKICAgaWYgKGJ5dGVzX3dyaXR0ZW4gPiByZXN0KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9JTlZBTElEX0FSR1VNRU5UKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT196ZXJvX2NvcHlfZ2V0X3dyaXRlX2J1Zl9kb25lLAorICAgICAgICAgICAgICAgICAgICAgIEJJT19SX0lOVkFMSURfQVJHVU1FTlQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTUxMSw3ICs1MjUsNyBAQAogICBiLT5yZXF1ZXN0ID0gMDsKICAgaWYgKGItPmNsb3NlZCkgewogICAgIC8qIHdlIGFscmVhZHkgY2xvc2VkICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9CUk9LRU5fUElQRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBiaW9fd3JpdGUsIEJJT19SX0JST0tFTl9QSVBFKTsKICAgICByZXR1cm4gLTE7CiAgIH0KIApAQCAtNTc2LDcgKzU5MCw3IEBACiAgIGIyID0gYmlvMi0+cHRyOwogCiAgIGlmIChiMS0+cGVlciAhPSBOVUxMIHx8IGIyLT5wZWVyICE9IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX0lOX1VTRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBiaW9fbWFrZV9wYWlyLCBCSU9fUl9JTl9VU0UpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTU5MSw3ICs2MDUsNyBAQAogICAgICAgYjEtPmJ1Zl9leHRlcm5hbGx5X2FsbG9jYXRlZCA9IDA7CiAgICAgICBiMS0+YnVmID0gT1BFTlNTTF9tYWxsb2MoYjEtPnNpemUpOwogICAgICAgaWYgKGIxLT5idWYgPT0gTlVMTCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBiaW9fbWFrZV9wYWlyLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICAgIHJldHVybiAwOwogICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC02MTAsNyArNjI0LDcgQEAKICAgICAgIGIyLT5idWZfZXh0ZXJuYWxseV9hbGxvY2F0ZWQgPSAwOwogICAgICAgYjItPmJ1ZiA9IE9QRU5TU0xfbWFsbG9jKGIyLT5zaXplKTsKICAgICAgIGlmIChiMi0+YnVmID09IE5VTEwpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgYmlvX21ha2VfcGFpciwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9iaW8vcHJpbnRmLmMgYi9zcmMvY3J5cHRvL2Jpby9wcmludGYuYwppbmRleCAyZjVhZTRhLi5mNTFiMzk2IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Jpby9wcmludGYuYworKysgYi9zcmMvY3J5cHRvL2Jpby9wcmludGYuYwpAQCAtOTUsNyArOTUsNyBAQAogICAgIG91dCA9IE9QRU5TU0xfbWFsbG9jKHJlcXVlc3RlZF9sZW4gKyAxKTsKICAgICBvdXRfbWFsbG9jZWQgPSAxOwogICAgIGlmIChvdXQgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19wcmludGYsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYmlvL3NvY2tldF9oZWxwZXIuYyBiL3NyYy9jcnlwdG8vYmlvL3NvY2tldF9oZWxwZXIuYwppbmRleCAwMWY2MzVlLi5iMWNkZDFhIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Jpby9zb2NrZXRfaGVscGVyLmMKKysrIGIvc3JjL2NyeXB0by9iaW8vc29ja2V0X2hlbHBlci5jCkBAIC0xMiw4ICsxMiw3IEBACiAgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCiAgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLwogCi0jdW5kZWYgX1BPU0lYX0NfU09VUkNFCi0jZGVmaW5lIF9QT1NJWF9DX1NPVVJDRSAyMDAxMTJMCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UKIAogI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KQEAgLTUxLDcgKzUwLDcgQEAKIAogICByZXQgPSBnZXRhZGRyaW5mbyhob3N0bmFtZSwgcG9ydF9zdHIsICZoaW50LCAmcmVzdWx0KTsKICAgaWYgKHJldCAhPSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1lTLCAwKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTWVMsIGdldGFkZHJpbmZvLCAwKTsKICAgICBFUlJfYWRkX2Vycm9yX2RhdGEoMSwgZ2FpX3N0cmVycm9yKHJldCkpOwogICAgIHJldHVybiAwOwogICB9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2JuL0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9ibi9DTWFrZUxpc3RzLnR4dAppbmRleCAyMzJlNDBhLi4yZTBjYjQ1IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2JuL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vYm4vQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKIAogaWYgKCR7QVJDSH0gU1RSRVFVQUwgIng4Nl82NCIpCiAgIHNldCgKQEAgLTM5LDcgKzM5LDYgQEAKICAgYWRkLmMKICAgYXNtL3g4Nl82NC1nY2MuYwogICBibi5jCi0gIGJuX2FzbjEuYwogICBjbXAuYwogICBjb252ZXJ0LmMKICAgY3R4LmMKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vYWRkLmMgYi9zcmMvY3J5cHRvL2JuL2FkZC5jCmluZGV4IGEwNDNkODMuLjFjNmIyZDcgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYm4vYWRkLmMKKysrIGIvc3JjL2NyeXB0by9ibi9hZGQuYwpAQCAtMjY3LDcgKzI2Nyw3IEBACiAKICAgaWYgKGRpZiA8IDApIC8qIGhtbS4uLiBzaG91bGQgbm90IGJlIGhhcHBlbmluZyAqLwogICB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfQVJHMl9MVF9BUkczKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fdXN1YiwgQk5fUl9BUkcyX0xUX0FSRzMpOwogICAgIHJldHVybiAwOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vYXNtL2FybXY0LW1vbnQucGwgYi9zcmMvY3J5cHRvL2JuL2FzbS9hcm12NC1tb250LnBsCmluZGV4IDQyMDZmZDguLjBmMWI2YTkgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYm4vYXNtL2FybXY0LW1vbnQucGwKKysrIGIvc3JjL2NyeXB0by9ibi9hc20vYXJtdjQtbW9udC5wbApAQCAtNzksNyArNzksNyBAQAogJF9udW09IiRudW0sIzE1KjQiOwkkX2JwZW5kPSRfbnVtOwogCiAkY29kZT08PF9fXzsKLSNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisjaW5jbHVkZSAiYXJtX2FyY2guaCIKIAogLnRleHQKIC5jb2RlCTMyCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2JuL2JuLmMgYi9zcmMvY3J5cHRvL2JuL2JuLmMKaW5kZXggYjM0Mjc0OS4uZjMyZDZiMCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ibi9ibi5jCisrKyBiL3NyYy9jcnlwdG8vYm4vYm4uYwpAQCAtNjksNyArNjksNyBAQAogICBCSUdOVU0gKmJuID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEJJR05VTSkpOwogCiAgIGlmIChibiA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIApAQCAtMjc5LDI2ICsyNzksMjYgQEAKICAgfQogfQogCi1CSUdOVU0gKmJuX3dleHBhbmQoQklHTlVNICpibiwgc2l6ZV90IHdvcmRzKSB7CitCSUdOVU0gKmJuX3dleHBhbmQoQklHTlVNICpibiwgdW5zaWduZWQgd29yZHMpIHsKICAgQk5fVUxPTkcgKmE7CiAKLSAgaWYgKHdvcmRzIDw9IChzaXplX3QpYm4tPmRtYXgpIHsKKyAgaWYgKHdvcmRzIDw9ICh1bnNpZ25lZCkgYm4tPmRtYXgpIHsKICAgICByZXR1cm4gYm47CiAgIH0KIAogICBpZiAod29yZHMgPiAoSU5UX01BWCAvICg0ICogQk5fQklUUzIpKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0JJR05VTV9UT09fTE9ORyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIGJuX3dleHBhbmQsIEJOX1JfQklHTlVNX1RPT19MT05HKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCiAgIGlmIChibi0+ZmxhZ3MgJiBCTl9GTEdfU1RBVElDX0RBVEEpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9FWFBBTkRfT05fU1RBVElDX0JJR05VTV9EQVRBKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgYm5fd2V4cGFuZCwgQk5fUl9FWFBBTkRfT05fU1RBVElDX0JJR05VTV9EQVRBKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCiAgIGEgPSAoQk5fVUxPTkcgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoQk5fVUxPTkcpICogd29yZHMpOwogICBpZiAoYSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgYm5fd2V4cGFuZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKQEAgLTMwNiwxNiArMzA2LDEyIEBACiAKICAgT1BFTlNTTF9mcmVlKGJuLT5kKTsKICAgYm4tPmQgPSBhOwotICBibi0+ZG1heCA9IChpbnQpd29yZHM7CisgIGJuLT5kbWF4ID0gd29yZHM7CiAKICAgcmV0dXJuIGJuOwogfQogCi1CSUdOVU0gKmJuX2V4cGFuZChCSUdOVU0gKmJuLCBzaXplX3QgYml0cykgewotICBpZiAoYml0cyArIEJOX0JJVFMyIC0gMSA8IGJpdHMpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9CSUdOVU1fVE9PX0xPTkcpOwotICAgIHJldHVybiBOVUxMOwotICB9CitCSUdOVU0gKmJuX2V4cGFuZChCSUdOVU0gKmJuLCB1bnNpZ25lZCBiaXRzKSB7CiAgIHJldHVybiBibl93ZXhwYW5kKGJuLCAoYml0cytCTl9CSVRTMi0xKS9CTl9CSVRTMik7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vYm5fYXNuMS5jIGIvc3JjL2NyeXB0by9ibi9ibl9hc24xLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNzBiYTguLjAwMDAwMDAKLS0tIGEvc3JjL2NyeXB0by9ibi9ibl9hc24xLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEdvb2dsZSBJbmMuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCi0KLSNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2J5dGVzdHJpbmcuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgotCi0KLWludCBCTl9jYnMydW5zaWduZWQoQ0JTICpjYnMsIEJJR05VTSAqcmV0KSB7Ci0gIENCUyBjaGlsZDsKLSAgaWYgKCFDQlNfZ2V0X2FzbjEoY2JzLCAmY2hpbGQsIENCU19BU04xX0lOVEVHRVIpIHx8Ci0gICAgICBDQlNfbGVuKCZjaGlsZCkgPT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0JBRF9FTkNPRElORyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAoQ0JTX2RhdGEoJmNoaWxkKVswXSAmIDB4ODApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9ORUdBVElWRV9OVU1CRVIpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyogSU5URUdFUnMgbXVzdCBiZSBtaW5pbWFsLiAqLwotICBpZiAoQ0JTX2RhdGEoJmNoaWxkKVswXSA9PSAweDAwICYmCi0gICAgICBDQlNfbGVuKCZjaGlsZCkgPiAxICYmCi0gICAgICAhKENCU19kYXRhKCZjaGlsZClbMV0gJiAweDgwKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0JBRF9FTkNPRElORyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gQk5fYmluMmJuKENCU19kYXRhKCZjaGlsZCksIENCU19sZW4oJmNoaWxkKSwgcmV0KSAhPSBOVUxMOwotfQotCi1pbnQgQk5fY2JzMnVuc2lnbmVkX2J1Z2d5KENCUyAqY2JzLCBCSUdOVU0gKnJldCkgewotICBDQlMgY2hpbGQ7Ci0gIGlmICghQ0JTX2dldF9hc24xKGNicywgJmNoaWxkLCBDQlNfQVNOMV9JTlRFR0VSKSB8fAotICAgICAgQ0JTX2xlbigmY2hpbGQpID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9CQURfRU5DT0RJTkcpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBpbnRlbnRpb25hbGx5IGRvZXMgbm90IHJlamVjdCBuZWdhdGl2ZSBudW1iZXJzIG9yIG5vbi1taW5pbWFsCi0gICAqIGVuY29kaW5ncy4gRXN0b25pYW4gSURzIGlzc3VlZCBiZXR3ZWVuIFNlcHRlbWJlciAyMDE0IHRvIFNlcHRlbWJlciAyMDE1IGFyZQotICAgKiBicm9rZW4uIFNlZSBodHRwczovL2NyYnVnLmNvbS81MzIwNDggYW5kIGh0dHBzOi8vY3JidWcuY29tLzUzNDc2Ni4KLSAgICoKLSAgICogVE9ETyhkYXZpZGJlbik6IFJlbW92ZSB0aGlzIGNvZGUgYW5kIGNhbGxlcnMgaW4gTWFyY2ggMjAxNi4gKi8KLSAgcmV0dXJuIEJOX2JpbjJibihDQlNfZGF0YSgmY2hpbGQpLCBDQlNfbGVuKCZjaGlsZCksIHJldCkgIT0gTlVMTDsKLX0KLQotaW50IEJOX2JuMmNiYihDQkIgKmNiYiwgY29uc3QgQklHTlVNICpibikgewotICAvKiBOZWdhdGl2ZSBudW1iZXJzIGFyZSB1bnN1cHBvcnRlZC4gKi8KLSAgaWYgKEJOX2lzX25lZ2F0aXZlKGJuKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX05FR0FUSVZFX05VTUJFUik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBDQkIgY2hpbGQ7Ci0gIGlmICghQ0JCX2FkZF9hc24xKGNiYiwgJmNoaWxkLCBDQlNfQVNOMV9JTlRFR0VSKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0VOQ09ERV9FUlJPUik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKiBUaGUgbnVtYmVyIG11c3QgYmUgcGFkZGVkIHdpdGggYSBsZWFkaW5nIHplcm8gaWYgdGhlIGhpZ2ggYml0IHdvdWxkCi0gICAqIG90aGVyd2lzZSBiZSBzZXQgKG9yIHxibnwgaXMgemVybykuICovCi0gIGlmIChCTl9udW1fYml0cyhibikgJSA4ID09IDAgJiYKLSAgICAgICFDQkJfYWRkX3U4KCZjaGlsZCwgMHgwMCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9FTkNPREVfRVJST1IpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdWludDhfdCAqb3V0OwotICBpZiAoIUNCQl9hZGRfc3BhY2UoJmNoaWxkLCAmb3V0LCBCTl9udW1fYnl0ZXMoYm4pKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0VOQ09ERV9FUlJPUik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgQk5fYm4yYmluKGJuLCBvdXQpOwotICBpZiAoIUNCQl9mbHVzaChjYmIpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfRU5DT0RFX0VSUk9SKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vYm5fdGVzdC5jYyBiL3NyYy9jcnlwdG8vYm4vYm5fdGVzdC5jYwppbmRleCA0NzA5M2E3Li42YTdkNDhjIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2JuL2JuX3Rlc3QuY2MKKysrIGIvc3JjL2NyeXB0by9ibi9ibl90ZXN0LmNjCkBAIC04Miw3ICs4Miw2IEBACiAjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KIAogI2luY2x1ZGUgIi4uL2NyeXB0by90ZXN0L3Njb3BlZF90eXBlcy5oIgotI2luY2x1ZGUgIi4uL2NyeXB0by90ZXN0L3Rlc3RfdXRpbC5oIgogCiAKIC8vIFRoaXMgcHJvZ3JhbSB0ZXN0cyB0aGUgQklHTlVNIGltcGxlbWVudGF0aW9uLiBJdCB0YWtlcyBhbiBvcHRpb25hbCAtYmMKQEAgLTExOCwxMyArMTE3LDExIEBACiBzdGF0aWMgYm9vbCB0ZXN0X3NtYWxsX3ByaW1lKEZJTEUgKmZwLCBCTl9DVFggKmN0eCk7CiBzdGF0aWMgYm9vbCB0ZXN0X21vZF9leHBfbW9udDUoRklMRSAqZnAsIEJOX0NUWCAqY3R4KTsKIHN0YXRpYyBib29sIHRlc3Rfc3FydChGSUxFICpmcCwgQk5fQ1RYICpjdHgpOwotc3RhdGljIGJvb2wgdGVzdF9ibjJiaW5fcGFkZGVkKEJOX0NUWCAqY3R4KTsKLXN0YXRpYyBib29sIHRlc3RfZGVjMmJuKEJOX0NUWCAqY3R4KTsKLXN0YXRpYyBib29sIHRlc3RfaGV4MmJuKEJOX0NUWCAqY3R4KTsKLXN0YXRpYyBib29sIHRlc3RfYXNjMmJuKEJOX0NUWCAqY3R4KTsKLXN0YXRpYyBib29sIHRlc3RfbXBpKCk7CitzdGF0aWMgYm9vbCB0ZXN0X2JuMmJpbl9wYWRkZWQoRklMRSAqZnAsIEJOX0NUWCAqY3R4KTsKK3N0YXRpYyBib29sIHRlc3RfZGVjMmJuKEZJTEUgKmZwLCBCTl9DVFggKmN0eCk7CitzdGF0aWMgYm9vbCB0ZXN0X2hleDJibihGSUxFICpmcCwgQk5fQ1RYICpjdHgpOworc3RhdGljIGJvb2wgdGVzdF9hc2MyYm4oRklMRSAqZnAsIEJOX0NUWCAqY3R4KTsKIHN0YXRpYyBib29sIHRlc3RfcmFuZCgpOwotc3RhdGljIGJvb2wgdGVzdF9hc24xKCk7CiAKIHN0YXRpYyBjb25zdCB1aW50OF90IGtTYW1wbGVbXSA9CiAgICAgIlx4QzZceDRGXHg0M1x4MDRceDJBXHhFQVx4Q0FceDZFXHg1OFx4MzZceDgwXHg1Qlx4RThceEM5IgpAQCAtMzE0LDE1ICszMTEsMzUgQEAKICAgfQogICBmbHVzaF9mcChiY19maWxlLmdldCgpKTsKIAotICBpZiAoIXRlc3RfYm4yYmluX3BhZGRlZChjdHguZ2V0KCkpIHx8Ci0gICAgICAhdGVzdF9kZWMyYm4oY3R4LmdldCgpKSB8fAotICAgICAgIXRlc3RfaGV4MmJuKGN0eC5nZXQoKSkgfHwKLSAgICAgICF0ZXN0X2FzYzJibihjdHguZ2V0KCkpIHx8Ci0gICAgICAhdGVzdF9tcGkoKSB8fAotICAgICAgIXRlc3RfcmFuZCgpIHx8Ci0gICAgICAhdGVzdF9hc24xKCkpIHsKKyAgbWVzc2FnZShiY19maWxlLmdldCgpLCAiQk5fYm4yYmluX3BhZGRlZCIpOworICBpZiAoIXRlc3RfYm4yYmluX3BhZGRlZChiY19maWxlLmdldCgpLCBjdHguZ2V0KCkpKSB7CiAgICAgcmV0dXJuIDE7CiAgIH0KKyAgZmx1c2hfZnAoYmNfZmlsZS5nZXQoKSk7CisKKyAgbWVzc2FnZShiY19maWxlLmdldCgpLCAiQk5fZGVjMmJuIik7CisgIGlmICghdGVzdF9kZWMyYm4oYmNfZmlsZS5nZXQoKSwgY3R4LmdldCgpKSkgeworICAgIHJldHVybiAxOworICB9CisgIGZsdXNoX2ZwKGJjX2ZpbGUuZ2V0KCkpOworCisgIG1lc3NhZ2UoYmNfZmlsZS5nZXQoKSwgIkJOX2hleDJibiIpOworICBpZiAoIXRlc3RfaGV4MmJuKGJjX2ZpbGUuZ2V0KCksIGN0eC5nZXQoKSkpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICBmbHVzaF9mcChiY19maWxlLmdldCgpKTsKKworICBtZXNzYWdlKGJjX2ZpbGUuZ2V0KCksICJCTl9hc2MyYm4iKTsKKyAgaWYgKCF0ZXN0X2FzYzJibihiY19maWxlLmdldCgpLCBjdHguZ2V0KCkpKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZmx1c2hfZnAoYmNfZmlsZS5nZXQoKSk7CisKKyAgbWVzc2FnZShiY19maWxlLmdldCgpLCAiQk5fcmFuZCIpOworICBpZiAoIXRlc3RfcmFuZCgpKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZmx1c2hfZnAoYmNfZmlsZS5nZXQoKSk7CiAKICAgcHJpbnRmKCJQQVNTXG4iKTsKICAgcmV0dXJuIDA7CkBAIC00MjMsMTYgKzQ0MCw2IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgaWYgKCFCTl9vbmUoYS5nZXQoKSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQk5femVybyhiLmdldCgpKTsKLSAgaWYgKEJOX2RpdihkLmdldCgpLCBjLmdldCgpLCBhLmdldCgpLCBiLmdldCgpLCBjdHgpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJEaXZpc2lvbiBieSB6ZXJvIHN1Y2NlZWRlZCFcbiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBFUlJfY2xlYXJfZXJyb3IoKTsKLQogICBmb3IgKGludCBpID0gMDsgaSA8IG51bTAgKyBudW0xOyBpKyspIHsKICAgICBpZiAoaSA8IG51bTEpIHsKICAgICAgIGlmICghQk5fcmFuZChhLmdldCgpLCA0MDAsIDAsIDApIHx8CkBAIC04MzAsMTcgKzgzNywxOCBAQAogICB9CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW0wOyBpKyspIHsKKyAgICBCTl9VTE9ORyBzOwogICAgIGRvIHsKICAgICAgIGlmICghQk5fcmFuZChhLmdldCgpLCA1MTIsIC0xLCAwKSB8fAogICAgICAgICAgICFCTl9yYW5kKGIuZ2V0KCksIEJOX0JJVFMyLCAtMSwgMCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQotICAgIH0gd2hpbGUgKEJOX2lzX3plcm8oYi5nZXQoKSkpOworICAgICAgcyA9IGItPmRbMF07CisgICAgfSB3aGlsZSAoIXMpOwogCiAgICAgaWYgKCFCTl9jb3B5KGIuZ2V0KCksIGEuZ2V0KCkpKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIEJOX1VMT05HIHMgPSBiLT5kWzBdOwogICAgIEJOX1VMT05HIHIgPSBCTl9kaXZfd29yZChiLmdldCgpLCBzKTsKICAgICBpZiAociA9PSAoQk5fVUxPTkcpLTEpIHsKICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTg4MywyNyArODkxLDggQEAKICAgU2NvcGVkQklHTlVNIEIoQk5fbmV3KCkpOwogICBTY29wZWRCSUdOVU0gbihCTl9uZXcoKSk7CiAgIFNjb3BlZEJOX01PTlRfQ1RYIG1vbnQoQk5fTU9OVF9DVFhfbmV3KCkpOwotICBpZiAoIWEgfHwgIWIgfHwgIWMgfHwgIWQgfHwgIUEgfHwgIUIgfHwgIW4gfHwgIW1vbnQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBCTl96ZXJvKG4uZ2V0KCkpOwotICBpZiAoQk5fTU9OVF9DVFhfc2V0KG1vbnQuZ2V0KCksIG4uZ2V0KCksIGN0eCkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkJOX01PTlRfQ1RYX3NldCBzdWNjZWVkZWQgZm9yIHplcm8gbW9kdWx1cyFcbiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBFUlJfY2xlYXJfZXJyb3IoKTsKLQotICBpZiAoIUJOX3NldF93b3JkKG4uZ2V0KCksIDE2KSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoQk5fTU9OVF9DVFhfc2V0KG1vbnQuZ2V0KCksIG4uZ2V0KCksIGN0eCkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkJOX01PTlRfQ1RYX3NldCBzdWNjZWVkZWQgZm9yIGV2ZW4gbW9kdWx1cyFcbiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBFUlJfY2xlYXJfZXJyb3IoKTsKLQotICBpZiAoIUJOX3JhbmQoYS5nZXQoKSwgMTAwLCAwLCAwKSB8fAorICBpZiAoIWEgfHwgIWIgfHwgIWMgfHwgIWQgfHwgIUEgfHwgIUIgfHwgIW4gfHwgIW1vbnQgfHwKKyAgICAgICFCTl9yYW5kKGEuZ2V0KCksIDEwMCwgMCwgMCkgfHwKICAgICAgICFCTl9yYW5kKGIuZ2V0KCksIDEwMCwgMCwgMCkpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KQEAgLTk0Myw3ICs5MzIsNiBAQAogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgfQotCiAgIHJldHVybiB0cnVlOwogfQogCkBAIC05OTcsMTYgKzk4NSw2IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgaWYgKCFCTl9vbmUoYS5nZXQoKSkgfHwgIUJOX29uZShiLmdldCgpKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBCTl96ZXJvKGMuZ2V0KCkpOwotICBpZiAoQk5fbW9kX211bChlLmdldCgpLCBhLmdldCgpLCBiLmdldCgpLCBjLmdldCgpLCBjdHgpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJCTl9tb2RfbXVsIHdpdGggemVybyBtb2R1bHVzIHN1Y2NlZWRlZCFcbiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBFUlJfY2xlYXJfZXJyb3IoKTsKLQogICBmb3IgKGludCBqID0gMDsgaiA8IDM7IGorKykgewogICAgIGlmICghQk5fcmFuZChjLmdldCgpLCAxMDI0LCAwLCAwKSkgewogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTA2MSwyMSArMTAzOSw4IEBACiAgIFNjb3BlZEJJR05VTSBjKEJOX25ldygpKTsKICAgU2NvcGVkQklHTlVNIGQoQk5fbmV3KCkpOwogICBTY29wZWRCSUdOVU0gZShCTl9uZXcoKSk7Ci0gIGlmICghYSB8fCAhYiB8fCAhYyB8fCAhZCB8fCAhZSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghQk5fb25lKGEuZ2V0KCkpIHx8ICFCTl9vbmUoYi5nZXQoKSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQk5femVybyhjLmdldCgpKTsKLSAgaWYgKEJOX21vZF9leHAoZC5nZXQoKSwgYS5nZXQoKSwgYi5nZXQoKSwgYy5nZXQoKSwgY3R4KSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiQk5fbW9kX2V4cCB3aXRoIHplcm8gbW9kdWx1cyBzdWNjZWVkZWQhXG4iKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBFUlJfY2xlYXJfZXJyb3IoKTsKLQotICBpZiAoIUJOX3JhbmQoYy5nZXQoKSwgMzAsIDAsIDEpKSB7ICAvLyBtdXN0IGJlIG9kZCBmb3IgbW9udGdvbWVyeQorICBpZiAoIWEgfHwgIWIgfHwgIWMgfHwgIWQgfHwgIWUgfHwKKyAgICAgICFCTl9yYW5kKGMuZ2V0KCksIDMwLCAwLCAxKSkgeyAgLy8gbXVzdCBiZSBvZGQgZm9yIG1vbnRnb21lcnkKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW0yOyBpKyspIHsKQEAgLTExMTQsMzIgKzEwNzksOCBAQAogICBTY29wZWRCSUdOVU0gYyhCTl9uZXcoKSk7CiAgIFNjb3BlZEJJR05VTSBkKEJOX25ldygpKTsKICAgU2NvcGVkQklHTlVNIGUoQk5fbmV3KCkpOwotICBpZiAoIWEgfHwgIWIgfHwgIWMgfHwgIWQgfHwgIWUpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIUJOX29uZShhLmdldCgpKSB8fCAhQk5fb25lKGIuZ2V0KCkpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEJOX3plcm8oYy5nZXQoKSk7Ci0gIGlmIChCTl9tb2RfZXhwX21vbnRfY29uc3R0aW1lKGQuZ2V0KCksIGEuZ2V0KCksIGIuZ2V0KCksIGMuZ2V0KCksIGN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkJOX21vZF9leHBfbW9udF9jb25zdHRpbWUgd2l0aCB6ZXJvIG1vZHVsdXMgc3VjY2VlZGVkIVxuIik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgRVJSX2NsZWFyX2Vycm9yKCk7Ci0KLSAgaWYgKCFCTl9zZXRfd29yZChjLmdldCgpLCAxNikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKEJOX21vZF9leHBfbW9udF9jb25zdHRpbWUoZC5nZXQoKSwgYS5nZXQoKSwgYi5nZXQoKSwgYy5nZXQoKSwgY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZSB3aXRoIGV2ZW4gbW9kdWx1cyBzdWNjZWVkZWQhXG4iKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBFUlJfY2xlYXJfZXJyb3IoKTsKLQotICBpZiAoIUJOX3JhbmQoYy5nZXQoKSwgMzAsIDAsIDEpKSB7ICAvLyBtdXN0IGJlIG9kZCBmb3IgbW9udGdvbWVyeQorICBpZiAoIWEgfHwgIWIgfHwgIWMgfHwgIWQgfHwgIWUgfHwKKyAgICAgICFCTl9yYW5kKGMuZ2V0KCksIDMwLCAwLCAxKSkgeyAgLy8gbXVzdCBiZSBvZGQgZm9yIG1vbnRnb21lcnkKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW0yOyBpKyspIHsKQEAgLTEyNjcsOSArMTIwOCw4IEBACiAgICAgaWYgKCFCTl9vbmUoZS5nZXQoKSkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgd2hpbGUgKCFCTl9pc196ZXJvKGIuZ2V0KCkpKSB7Ci0gICAgICBpZiAoIUJOX211bChlLmdldCgpLCBlLmdldCgpLCBhLmdldCgpLCBjdHgpIHx8Ci0gICAgICAgICAgIUJOX3N1YihiLmdldCgpLCBiLmdldCgpLCBCTl92YWx1ZV9vbmUoKSkpIHsKKyAgICBmb3IgKDsgIUJOX2lzX3plcm8oYi5nZXQoKSk7IEJOX3N1YihiLmdldCgpLCBiLmdldCgpLCBCTl92YWx1ZV9vbmUoKSkpIHsKKyAgICAgIGlmICghQk5fbXVsKGUuZ2V0KCksIGUuZ2V0KCksIGEuZ2V0KCksIGN0eCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgIH0KQEAgLTE0MzEsNyArMTM3MSw3IEBACiAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgYm9vbCB0ZXN0X2JuMmJpbl9wYWRkZWQoQk5fQ1RYICpjdHgpIHsKK3N0YXRpYyBib29sIHRlc3RfYm4yYmluX3BhZGRlZChGSUxFICpmcCwgQk5fQ1RYICpjdHgpIHsKICAgdWludDhfdCB6ZXJvc1syNTZdLCBvdXRbMjU2XSwgcmVmZXJlbmNlWzEyOF07CiAKICAgbWVtc2V0KHplcm9zLCAwLCBzaXplb2YoemVyb3MpKTsKQEAgLTE1MDgsNyArMTQ0OCw3IEBACiAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBib29sIHRlc3RfZGVjMmJuKEJOX0NUWCAqY3R4KSB7CitzdGF0aWMgYm9vbCB0ZXN0X2RlYzJibihGSUxFICpmcCwgQk5fQ1RYICpjdHgpIHsKICAgU2NvcGVkQklHTlVNIGJuOwogICBpbnQgcmV0ID0gRGVjaW1hbFRvQklHTlVNKCZibiwgIjAiKTsKICAgaWYgKHJldCAhPSAxIHx8ICFCTl9pc196ZXJvKGJuLmdldCgpKSB8fCBCTl9pc19uZWdhdGl2ZShibi5nZXQoKSkpIHsKQEAgLTE1NTAsNyArMTQ5MCw3IEBACiAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBib29sIHRlc3RfaGV4MmJuKEJOX0NUWCAqY3R4KSB7CitzdGF0aWMgYm9vbCB0ZXN0X2hleDJibihGSUxFICpmcCwgQk5fQ1RYICpjdHgpIHsKICAgU2NvcGVkQklHTlVNIGJuOwogICBpbnQgcmV0ID0gSGV4VG9CSUdOVU0oJmJuLCAiMCIpOwogICBpZiAocmV0ICE9IDEgfHwgIUJOX2lzX3plcm8oYm4uZ2V0KCkpIHx8IEJOX2lzX25lZ2F0aXZlKGJuLmdldCgpKSkgewpAQCAtMTU5Myw3ICsxNTMzLDcgQEAKICAgcmV0dXJuIFNjb3BlZEJJR05VTShyYXcpOwogfQogCi1zdGF0aWMgYm9vbCB0ZXN0X2FzYzJibihCTl9DVFggKmN0eCkgeworc3RhdGljIGJvb2wgdGVzdF9hc2MyYm4oRklMRSAqZnAsIEJOX0NUWCAqY3R4KSB7CiAgIFNjb3BlZEJJR05VTSBibiA9IEFTQ0lJVG9CSUdOVU0oIjAiKTsKICAgaWYgKCFibiB8fCAhQk5faXNfemVybyhibi5nZXQoKSkgfHwgQk5faXNfbmVnYXRpdmUoYm4uZ2V0KCkpKSB7CiAgICAgZnByaW50ZihzdGRlcnIsICJCTl9hc2MyYm4gZ2F2ZSBhIGJhZCByZXN1bHQuXG4iKTsKQEAgLTE2NDUsNjMgKzE1ODUsNiBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RydWN0IE1QSVRlc3QgewotICBjb25zdCBjaGFyICpiYXNlMTA7Ci0gIGNvbnN0IGNoYXIgKm1waTsKLSAgc2l6ZV90IG1waV9sZW47Ci19OwotCi1zdGF0aWMgY29uc3QgTVBJVGVzdCBrTVBJVGVzdHNbXSA9IHsKLSAgeyAiMCIsICJceDAwXHgwMFx4MDBceDAwIiwgNCB9LAotICB7ICIxIiwgIlx4MDBceDAwXHgwMFx4MDFceDAxIiwgNSB9LAotICB7ICItMSIsICJceDAwXHgwMFx4MDBceDAxXHg4MSIsIDUgfSwKLSAgeyAiMTI4IiwgIlx4MDBceDAwXHgwMFx4MDJceDAwXHg4MCIsIDYgfSwKLSAgeyAiMjU2IiwgIlx4MDBceDAwXHgwMFx4MDJceDAxXHgwMCIsIDYgfSwKLSAgeyAiLTI1NiIsICJceDAwXHgwMFx4MDBceDAyXHg4MVx4MDAiLCA2IH0sCi19OwotCi1zdGF0aWMgYm9vbCB0ZXN0X21waSgpIHsKLSAgdWludDhfdCBzY3JhdGNoWzhdOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGtNUElUZXN0cykgLyBzaXplb2Yoa01QSVRlc3RzWzBdKTsgaSsrKSB7Ci0gICAgY29uc3QgTVBJVGVzdCAmdGVzdCA9IGtNUElUZXN0c1tpXTsKLSAgICBTY29wZWRCSUdOVU0gYm4oQVNDSUlUb0JJR05VTSh0ZXN0LmJhc2UxMCkpOwotICAgIGNvbnN0IHNpemVfdCBtcGlfbGVuID0gQk5fYm4ybXBpKGJuLmdldCgpLCBOVUxMKTsKLSAgICBpZiAobXBpX2xlbiA+IHNpemVvZihzY3JhdGNoKSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJNUEkgdGVzdCAjJXU6IE1QSSBzaXplIGlzIHRvbyBsYXJnZSB0byB0ZXN0LlxuIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkKWkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNvbnN0IHNpemVfdCBtcGlfbGVuMiA9IEJOX2JuMm1waShibi5nZXQoKSwgc2NyYXRjaCk7Ci0gICAgaWYgKG1waV9sZW4gIT0gbXBpX2xlbjIpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiTVBJIHRlc3QgIyV1OiBsZW5ndGggY2hhbmdlcy5cbiIsICh1bnNpZ25lZClpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAobXBpX2xlbiAhPSB0ZXN0Lm1waV9sZW4gfHwKLSAgICAgICAgbWVtY21wKHRlc3QubXBpLCBzY3JhdGNoLCBtcGlfbGVuKSAhPSAwKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIk1QSSB0ZXN0ICMldSBmYWlsZWQ6XG4iLCAodW5zaWduZWQpaSk7Ci0gICAgICBoZXhkdW1wKHN0ZGVyciwgIkV4cGVjdGVkOiAiLCB0ZXN0Lm1waSwgdGVzdC5tcGlfbGVuKTsKLSAgICAgIGhleGR1bXAoc3RkZXJyLCAiR290OiAgICAgICIsIHNjcmF0Y2gsIG1waV9sZW4pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFNjb3BlZEJJR05VTSBibjIoQk5fbXBpMmJuKHNjcmF0Y2gsIG1waV9sZW4sIE5VTEwpKTsKLSAgICBpZiAoYm4yLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiTVBJIHRlc3QgIyV1OiBmYWlsZWQgdG8gcGFyc2VcbiIsICh1bnNpZ25lZClpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoQk5fY21wKGJuLmdldCgpLCBibjIuZ2V0KCkpICE9IDApIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiTVBJIHRlc3QgIyV1OiB3cm9uZyByZXN1bHRcbiIsICh1bnNpZ25lZClpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQogc3RhdGljIGJvb2wgdGVzdF9yYW5kKCkgewogICBTY29wZWRCSUdOVU0gYm4oQk5fbmV3KCkpOwogICBpZiAoIWJuKSB7CkBAIC0xNzQ1LDE3MCArMTYyOCwzIEBACiAKICAgcmV0dXJuIHRydWU7CiB9Ci0KLXN0cnVjdCBBU04xVGVzdCB7Ci0gIGNvbnN0IGNoYXIgKnZhbHVlX2FzY2lpOwotICBjb25zdCBjaGFyICpkZXI7Ci0gIHNpemVfdCBkZXJfbGVuOwotfTsKLQotc3RhdGljIGNvbnN0IEFTTjFUZXN0IGtBU04xVGVzdHNbXSA9IHsKLSAgICB7IjAiLCAiXHgwMlx4MDFceDAwIiwgM30sCi0gICAgeyIxIiwgIlx4MDJceDAxXHgwMSIsIDN9LAotICAgIHsiMTI3IiwgIlx4MDJceDAxXHg3ZiIsIDN9LAotICAgIHsiMTI4IiwgIlx4MDJceDAyXHgwMFx4ODAiLCA0fSwKLSAgICB7IjB4ZGVhZGJlZWYiLCAiXHgwMlx4MDVceDAwXHhkZVx4YWRceGJlXHhlZiIsIDd9LAotICAgIHsiMHgwMTAyMDMwNDA1MDYwNzA4IiwKLSAgICAgIlx4MDJceDA4XHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDgiLCAxMH0sCi0gICAgeyIweGZmZmZmZmZmZmZmZmZmZmYiLAotICAgICAgIlx4MDJceDA5XHgwMFx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIiwgMTF9LAotfTsKLQotc3RydWN0IEFTTjFJbnZhbGlkVGVzdCB7Ci0gIGNvbnN0IGNoYXIgKmRlcjsKLSAgc2l6ZV90IGRlcl9sZW47Ci19OwotCi1zdGF0aWMgY29uc3QgQVNOMUludmFsaWRUZXN0IGtBU04xSW52YWxpZFRlc3RzW10gPSB7Ci0gICAgLy8gQmFkIHRhZy4KLSAgICB7Ilx4MDNceDAxXHgwMCIsIDN9LAotICAgIC8vIEVtcHR5IGNvbnRlbnRzLgotICAgIHsiXHgwMlx4MDAiLCAyfSwKLX07Ci0KLS8vIGtBU04xQnVnZ3lUZXN0cyBhcmUgaW5jb3JyZWN0IGVuY29kaW5ncyBhbmQgaG93IHxCTl9jYnMydW5zaWduZWRfYnVnZ3l8Ci0vLyBzaG91bGQgaW50ZXJwcmV0IHRoZW0uCi1zdGF0aWMgY29uc3QgQVNOMVRlc3Qga0FTTjFCdWdneVRlc3RzW10gPSB7Ci0gICAgLy8gTmVnYXRpdmUgbnVtYmVycy4KLSAgICB7IjEyOCIsICJceDAyXHgwMVx4ODAiLCAzfSwKLSAgICB7IjI1NSIsICJceDAyXHgwMVx4ZmYiLCAzfSwKLSAgICAvLyBVbm5lY2Vzc2FyeSBsZWFkaW5nIHplcm9zLgotICAgIHsiMSIsICJceDAyXHgwMlx4MDBceDAxIiwgNH0sCi19OwotCi1zdGF0aWMgYm9vbCB0ZXN0X2FzbjEoKSB7Ci0gIGZvciAoY29uc3QgQVNOMVRlc3QgJnRlc3QgOiBrQVNOMVRlc3RzKSB7Ci0gICAgU2NvcGVkQklHTlVNIGJuID0gQVNDSUlUb0JJR05VTSh0ZXN0LnZhbHVlX2FzY2lpKTsKLSAgICBpZiAoIWJuKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gVGVzdCB0aGF0IHRoZSBpbnB1dCBpcyBjb3JyZWN0bHkgcGFyc2VkLgotICAgIFNjb3BlZEJJR05VTSBibjIoQk5fbmV3KCkpOwotICAgIGlmICghYm4yKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIENCUyBjYnM7Ci0gICAgQ0JTX2luaXQoJmNicywgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4odGVzdC5kZXIpLCB0ZXN0LmRlcl9sZW4pOwotICAgIGlmICghQk5fY2JzMnVuc2lnbmVkKCZjYnMsIGJuMi5nZXQoKSkgfHwgQ0JTX2xlbigmY2JzKSAhPSAwKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlBhcnNpbmcgQVNOLjEgSU5URUdFUiBmYWlsZWQuXG4iKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKEJOX2NtcChibi5nZXQoKSwgYm4yLmdldCgpKSAhPSAwKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkJhZCBwYXJzZS5cbiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFRlc3QgdGhlIHZhbHVlIHNlcmlhbGl6ZXMgY29ycmVjdGx5LgotICAgIENCQiBjYmI7Ci0gICAgdWludDhfdCAqZGVyOwotICAgIHNpemVfdCBkZXJfbGVuOwotICAgIENCQl96ZXJvKCZjYmIpOwotICAgIGlmICghQ0JCX2luaXQoJmNiYiwgMCkgfHwKLSAgICAgICAgIUJOX2JuMmNiYigmY2JiLCBibi5nZXQoKSkgfHwKLSAgICAgICAgIUNCQl9maW5pc2goJmNiYiwgJmRlciwgJmRlcl9sZW4pKSB7Ci0gICAgICBDQkJfY2xlYW51cCgmY2JiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgU2NvcGVkT3BlblNTTEJ5dGVzIGRlbGV0ZV9kZXIoZGVyKTsKLSAgICBpZiAoZGVyX2xlbiAhPSB0ZXN0LmRlcl9sZW4gfHwKLSAgICAgICAgbWVtY21wKGRlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4odGVzdC5kZXIpLCBkZXJfbGVuKSAhPSAwKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkJhZCBzZXJpYWxpemF0aW9uLlxuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gfEJOX2NiczJ1bnNpZ25lZF9idWdneXwgcGFyc2VzIGFsbCB2YWxpZCBpbnB1dC4KLSAgICBDQlNfaW5pdCgmY2JzLCByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPih0ZXN0LmRlciksIHRlc3QuZGVyX2xlbik7Ci0gICAgaWYgKCFCTl9jYnMydW5zaWduZWRfYnVnZ3koJmNicywgYm4yLmdldCgpKSB8fCBDQlNfbGVuKCZjYnMpICE9IDApIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiUGFyc2luZyBBU04uMSBJTlRFR0VSIGZhaWxlZC5cbiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoQk5fY21wKGJuLmdldCgpLCBibjIuZ2V0KCkpICE9IDApIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiQmFkIHBhcnNlLlxuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgZm9yIChjb25zdCBBU04xSW52YWxpZFRlc3QgJnRlc3QgOiBrQVNOMUludmFsaWRUZXN0cykgewotICAgIFNjb3BlZEJJR05VTSBibihCTl9uZXcoKSk7Ci0gICAgaWYgKCFibikgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBDQlMgY2JzOwotICAgIENCU19pbml0KCZjYnMsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRlc3QuZGVyKSwgdGVzdC5kZXJfbGVuKTsKLSAgICBpZiAoQk5fY2JzMnVuc2lnbmVkKCZjYnMsIGJuLmdldCgpKSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJQYXJzZWQgaW52YWxpZCBpbnB1dC5cbiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBFUlJfY2xlYXJfZXJyb3IoKTsKLQotICAgIC8vIEFsbCB0ZXN0cyBpbiBrQVNOMUludmFsaWRUZXN0cyBhcmUgYWxzbyByZWplY3RlZCBieQotICAgIC8vIHxCTl9jYnMydW5zaWduZWRfYnVnZ3l8LgotICAgIENCU19pbml0KCZjYnMsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRlc3QuZGVyKSwgdGVzdC5kZXJfbGVuKTsKLSAgICBpZiAoQk5fY2JzMnVuc2lnbmVkX2J1Z2d5KCZjYnMsIGJuLmdldCgpKSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJQYXJzZWQgaW52YWxpZCBpbnB1dC5cbiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBFUlJfY2xlYXJfZXJyb3IoKTsKLSAgfQotCi0gIGZvciAoY29uc3QgQVNOMVRlc3QgJnRlc3QgOiBrQVNOMUJ1Z2d5VGVzdHMpIHsKLSAgICAvLyBUaGVzZSBicm9rZW4gZW5jb2RpbmdzIGFyZSByZWplY3RlZCBieSB8Qk5fY2JzMnVuc2lnbmVkfC4KLSAgICBTY29wZWRCSUdOVU0gYm4oQk5fbmV3KCkpOwotICAgIGlmICghYm4pIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBDQlMgY2JzOwotICAgIENCU19pbml0KCZjYnMsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRlc3QuZGVyKSwgdGVzdC5kZXJfbGVuKTsKLSAgICBpZiAoQk5fY2JzMnVuc2lnbmVkKCZjYnMsIGJuLmdldCgpKSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJQYXJzZWQgaW52YWxpZCBpbnB1dC5cbiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBFUlJfY2xlYXJfZXJyb3IoKTsKLQotICAgIC8vIEhvd2V2ZXIgfEJOX2NiczJ1bnNpZ25lZF9idWdneXwgYWNjZXB0cyB0aGVtLgotICAgIFNjb3BlZEJJR05VTSBibjIgPSBBU0NJSVRvQklHTlVNKHRlc3QudmFsdWVfYXNjaWkpOwotICAgIGlmICghYm4yKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQ0JTX2luaXQoJmNicywgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4odGVzdC5kZXIpLCB0ZXN0LmRlcl9sZW4pOwotICAgIGlmICghQk5fY2JzMnVuc2lnbmVkX2J1Z2d5KCZjYnMsIGJuLmdldCgpKSB8fCBDQlNfbGVuKCZjYnMpICE9IDApIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiUGFyc2luZyAoaW52YWxpZCkgQVNOLjEgSU5URUdFUiBmYWlsZWQuXG4iKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoQk5fY21wKGJuLmdldCgpLCBibjIuZ2V0KCkpICE9IDApIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiXCJCYWRcIiBwYXJzZS5cbiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIC8vIFNlcmlhbGl6aW5nIG5lZ2F0aXZlIG51bWJlcnMgaXMgbm90IHN1cHBvcnRlZC4KLSAgU2NvcGVkQklHTlVNIGJuID0gQVNDSUlUb0JJR05VTSgiLTEiKTsKLSAgaWYgKCFibikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBDQkIgY2JiOwotICBDQkJfemVybygmY2JiKTsKLSAgaWYgKCFDQkJfaW5pdCgmY2JiLCAwKSB8fAotICAgICAgQk5fYm4yY2JiKCZjYmIsIGJuLmdldCgpKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiU2VyaWFsaXplZCBuZWdhdGl2ZSBudW1iZXIuXG4iKTsKLSAgICBDQkJfY2xlYW51cCgmY2JiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ0JCX2NsZWFudXAoJmNiYik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2JuL2NvbnZlcnQuYyBiL3NyYy9jcnlwdG8vYm4vY29udmVydC5jCmluZGV4IDAxMjI3MDkuLjUzMWI2NjEgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYm4vY29udmVydC5jCisrKyBiL3NyYy9jcnlwdG8vYm4vY29udmVydC5jCkBAIC01Niw5ICs1Niw3IEBACiAKICNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKQEAgLTY5LDggKzY3LDcgQEAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiBCSUdOVU0gKkJOX2JpbjJibihjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGxlbiwgQklHTlVNICpyZXQpIHsKLSAgc2l6ZV90IG51bV93b3JkczsKLSAgdW5zaWduZWQgbTsKKyAgdW5zaWduZWQgbnVtX3dvcmRzLCBtOwogICBCTl9VTE9ORyB3b3JkID0gMDsKICAgQklHTlVNICpibiA9IE5VTEw7CiAKQEAgLTk2LDEwICs5Myw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIAotICAvKiB8Ym5fd2V4cGFuZHwgbXVzdCBjaGVjayBib3VuZHMgb24gfG51bV93b3Jkc3wgdG8gd3JpdGUgaXQgaW50bwotICAgKiB8cmV0LT5kbWF4fC4gKi8KLSAgYXNzZXJ0KG51bV93b3JkcyA8PSBJTlRfTUFYKTsKLSAgcmV0LT50b3AgPSAoaW50KW51bV93b3JkczsKKyAgcmV0LT50b3AgPSBudW1fd29yZHM7CiAgIHJldC0+bmVnID0gMDsKIAogICB3aGlsZSAobGVuLS0pIHsKQEAgLTIwNCw3ICsxOTgsNyBAQAogCiAgIGJ1ZiA9IChjaGFyICopT1BFTlNTTF9tYWxsb2MoYm4tPnRvcCAqIEJOX0JZVEVTICogMiArIDIpOwogICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9ibjJoZXgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCkBAIC0yMzMsNTkgKzIyNyw0NyBAQAogICByZXR1cm4gYnVmOwogfQogCi0vKiBkZWNvZGVfaGV4IGRlY29kZXMgfGluX2xlbnwgYnl0ZXMgb2YgaGV4IGRhdGEgZnJvbSB8aW58IGFuZCB1cGRhdGVzIHxibnwuICovCi1zdGF0aWMgaW50IGRlY29kZV9oZXgoQklHTlVNICpibiwgY29uc3QgY2hhciAqaW4sIGludCBpbl9sZW4pIHsKLSAgaWYgKGluX2xlbiA+IElOVF9NQVgvNCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0JJR05VTV9UT09fTE9ORyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgLyogfGluX2xlbnwgaXMgdGhlIG51bWJlciBvZiBoZXggZGlnaXRzLiAqLwotICBpZiAoYm5fZXhwYW5kKGJuLCBpbl9sZW4gKiA0KSA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KKy8qIGRlY29kZV9oZXggZGVjb2RlcyB8aXwgYnl0ZXMgb2YgaGV4IGRhdGEgZnJvbSB8aW58IGFuZCB1cGRhdGVzIHxibnwuICovCitzdGF0aWMgdm9pZCBkZWNvZGVfaGV4KEJJR05VTSAqYm4sIGNvbnN0IGNoYXIgKmluLCBpbnQgaSkgeworICBpbnQgaCwgbSwgaiwgaywgYzsKKyAgQk5fVUxPTkcgbD0wOwogCi0gIGludCBpID0gMDsKLSAgd2hpbGUgKGluX2xlbiA+IDApIHsKLSAgICAvKiBEZWNvZGUgb25lIHxCTl9VTE9OR3wgYXQgYSB0aW1lLiAqLwotICAgIGludCB0b2RvID0gQk5fQllURVMgKiAyOwotICAgIGlmICh0b2RvID4gaW5fbGVuKSB7Ci0gICAgICB0b2RvID0gaW5fbGVuOwotICAgIH0KLQotICAgIEJOX1VMT05HIHdvcmQgPSAwOwotICAgIGludCBqOwotICAgIGZvciAoaiA9IHRvZG87IGogPiAwOyBqLS0pIHsKLSAgICAgIGNoYXIgYyA9IGluW2luX2xlbiAtIGpdOwotCi0gICAgICBCTl9VTE9ORyBoZXg7Ci0gICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKLSAgICAgICAgaGV4ID0gYyAtICcwJzsKLSAgICAgIH0gZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpIHsKLSAgICAgICAgaGV4ID0gYyAtICdhJyArIDEwOwotICAgICAgfSBlbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykgewotICAgICAgICBoZXggPSBjIC0gJ0EnICsgMTA7CisgIGogPSBpOyAvKiBsZWFzdCBzaWduaWZpY2FudCAnaGV4JyAqLworICBoID0gMDsKKyAgd2hpbGUgKGogPiAwKSB7CisgICAgbSA9ICgoQk5fQllURVMgKiAyKSA8PSBqKSA/IChCTl9CWVRFUyAqIDIpIDogajsKKyAgICBsID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICBjID0gaW5baiAtIG1dOworICAgICAgaWYgKChjID49ICcwJykgJiYgKGMgPD0gJzknKSkgeworICAgICAgICBrID0gYyAtICcwJzsKKyAgICAgIH0gZWxzZSBpZiAoKGMgPj0gJ2EnKSAmJiAoYyA8PSAnZicpKSB7CisgICAgICAgIGsgPSBjIC0gJ2EnICsgMTA7CisgICAgICB9IGVsc2UgaWYgKChjID49ICdBJykgJiYgKGMgPD0gJ0YnKSkgeworICAgICAgICBrID0gYyAtICdBJyArIDEwOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgaGV4ID0gMDsKLSAgICAgICAgLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuLiBUaGUgY2FsbGVyIGNoZWNrcyB8aXN4ZGlnaXR8LiAqLwotICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgIGsgPSAwOyAvKiBwYXJhbm9pYSAqLwogICAgICAgfQotICAgICAgd29yZCA9ICh3b3JkIDw8IDQpIHwgaGV4OworCisgICAgICBsID0gKGwgPDwgNCkgfCBrOworCisgICAgICBpZiAoLS1tIDw9IDApIHsKKyAgICAgICAgYm4tPmRbaCsrXSA9IGw7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KIAotICAgIGJuLT5kW2krK10gPSB3b3JkOwotICAgIGluX2xlbiAtPSB0b2RvOworICAgIGogLT0gKEJOX0JZVEVTICogMik7CiAgIH0KLSAgYXNzZXJ0KGkgPD0gYm4tPmRtYXgpOwotICBibi0+dG9wID0gaTsKLSAgcmV0dXJuIDE7CisKKyAgYm4tPnRvcCA9IGg7CiB9CiAKIC8qIGRlY29kZV9kZWMgZGVjb2RlcyB8aW5fbGVufCBieXRlcyBvZiBkZWNpbWFsIGRhdGEgZnJvbSB8aW58IGFuZCB1cGRhdGVzIHxibnwuICovCi1zdGF0aWMgaW50IGRlY29kZV9kZWMoQklHTlVNICpibiwgY29uc3QgY2hhciAqaW4sIGludCBpbl9sZW4pIHsKK3N0YXRpYyB2b2lkIGRlY29kZV9kZWMoQklHTlVNICpibiwgY29uc3QgY2hhciAqaW4sIGludCBpbl9sZW4pIHsKICAgaW50IGksIGo7CiAgIEJOX1VMT05HIGwgPSAwOwogCi0gIC8qIERlY29kZSB8Qk5fREVDX05VTXwgZGlnaXRzIGF0IGEgdGltZS4gKi8KICAgaiA9IEJOX0RFQ19OVU0gLSAoaW5fbGVuICUgQk5fREVDX05VTSk7CiAgIGlmIChqID09IEJOX0RFQ19OVU0pIHsKICAgICBqID0gMDsKQEAgLTI5NSwxOCArMjc3LDE1IEBACiAgICAgbCAqPSAxMDsKICAgICBsICs9IGluW2ldIC0gJzAnOwogICAgIGlmICgrK2ogPT0gQk5fREVDX05VTSkgewotICAgICAgaWYgKCFCTl9tdWxfd29yZChibiwgQk5fREVDX0NPTlYpIHx8Ci0gICAgICAgICAgIUJOX2FkZF93b3JkKGJuLCBsKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KKyAgICAgIEJOX211bF93b3JkKGJuLCBCTl9ERUNfQ09OVik7CisgICAgICBCTl9hZGRfd29yZChibiwgbCk7CiAgICAgICBsID0gMDsKICAgICAgIGogPSAwOwogICAgIH0KICAgfQotICByZXR1cm4gMTsKIH0KIAotdHlwZWRlZiBpbnQgKCpkZWNvZGVfZnVuYykgKEJJR05VTSAqYm4sIGNvbnN0IGNoYXIgKmluLCBpbnQgaW5fbGVuKTsKK3R5cGVkZWYgdm9pZCAoKmRlY29kZV9mdW5jKSAoQklHTlVNICpibiwgY29uc3QgY2hhciAqaW4sIGludCBpKTsKIHR5cGVkZWYgaW50ICgqY2hhcl90ZXN0X2Z1bmMpIChpbnQgYyk7CiAKIHN0YXRpYyBpbnQgYm5feDJibihCSUdOVU0gKipvdXRwLCBjb25zdCBjaGFyICppbiwgZGVjb2RlX2Z1bmMgZGVjb2RlLCBjaGFyX3Rlc3RfZnVuYyB3YW50X2NoYXIpIHsKQEAgLTMyMyw3ICszMDIsNyBAQAogICAgIGluKys7CiAgIH0KIAotICBmb3IgKGkgPSAwOyB3YW50X2NoYXIoKHVuc2lnbmVkIGNoYXIpaW5baV0pICYmIGkgKyBuZWcgPCBJTlRfTUFYOyBpKyspIHt9CisgIGZvciAoaSA9IDA7IHdhbnRfY2hhcigodW5zaWduZWQgY2hhcilpbltpXSk7IGkrKykge30KIAogICBudW0gPSBpICsgbmVnOwogICBpZiAob3V0cCA9PSBOVUxMKSB7CkBAIC0zNDEsMTAgKzMyMCwxMyBAQAogICAgIEJOX3plcm8ocmV0KTsKICAgfQogCi0gIGlmICghZGVjb2RlKHJldCwgaW4sIGkpKSB7CisgIC8qIGkgaXMgdGhlIG51bWJlciBvZiBoZXggZGlnZXN0czsgKi8KKyAgaWYgKGJuX2V4cGFuZChyZXQsIGkgKiA0KSA9PSBOVUxMKSB7CiAgICAgZ290byBlcnI7CiAgIH0KIAorICBkZWNvZGUocmV0LCBpbiwgaSk7CisKICAgYm5fY29ycmVjdF90b3AocmV0KTsKICAgaWYgKCFCTl9pc196ZXJvKHJldCkpIHsKICAgICByZXQtPm5lZyA9IG5lZzsKQEAgLTM4Myw3ICszNjUsNyBAQAogICAgICAgKEJOX1VMT05HICopT1BFTlNTTF9tYWxsb2MoKG51bSAvIEJOX0RFQ19OVU0gKyAxKSAqIHNpemVvZihCTl9VTE9ORykpOwogICBidWYgPSAoY2hhciAqKU9QRU5TU0xfbWFsbG9jKG51bSArIDMpOwogICBpZiAoKGJ1ZiA9PSBOVUxMKSB8fCAoYm5fZGF0YSA9PSBOVUxMKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX2JuMmRlYywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAgIHQgPSBCTl9kdXAoYSk7CkBAIC01MTcsODEgKzQ5OSwzIEBACiAgICAgICByZXR1cm4gQk5fTUFTSzI7CiAgIH0KIH0KLQotc2l6ZV90IEJOX2JuMm1waShjb25zdCBCSUdOVU0gKmluLCB1aW50OF90ICpvdXQpIHsKLSAgY29uc3Qgc2l6ZV90IGJpdHMgPSBCTl9udW1fYml0cyhpbik7Ci0gIGNvbnN0IHNpemVfdCBieXRlcyA9IChiaXRzICsgNykgLyA4OwotICAvKiBJZiB0aGUgbnVtYmVyIG9mIGJpdHMgaXMgYSBtdWx0aXBsZSBvZiA4LCBpLmUuIGlmIHRoZSBNU0IgaXMgc2V0LAotICAgKiBwcmVmaXggd2l0aCBhIHplcm8gYnl0ZS4gKi8KLSAgaW50IGV4dGVuZCA9IDA7Ci0gIGlmIChieXRlcyAhPSAwICYmIChiaXRzICYgMHgwNykgPT0gMCkgewotICAgIGV4dGVuZCA9IDE7Ci0gIH0KLQotICBjb25zdCBzaXplX3QgbGVuID0gYnl0ZXMgKyBleHRlbmQ7Ci0gIGlmIChsZW4gPCBieXRlcyB8fAotICAgICAgNCArIGxlbiA8IGxlbiB8fAotICAgICAgKGxlbiAmIDB4ZmZmZmZmZmYpICE9IGxlbikgewotICAgIC8qIElmIHdlIGNhbm5vdCByZXByZXNlbnQgdGhlIG51bWJlciB0aGVuIHdlIGVtaXQgemVybyBhcyB0aGUgaW50ZXJmYWNlCi0gICAgICogZG9lc24ndCBhbGxvdyBhbiBlcnJvciB0byBiZSBzaWduYWxsZWQuICovCi0gICAgaWYgKG91dCkgewotICAgICAgbWVtc2V0KG91dCwgMCwgNCk7Ci0gICAgfQotICAgIHJldHVybiA0OwotICB9Ci0KLSAgaWYgKG91dCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDQgKyBsZW47Ci0gIH0KLQotICBvdXRbMF0gPSBsZW4gPj4gMjQ7Ci0gIG91dFsxXSA9IGxlbiA+PiAxNjsKLSAgb3V0WzJdID0gbGVuID4+IDg7Ci0gIG91dFszXSA9IGxlbjsKLSAgaWYgKGV4dGVuZCkgewotICAgIG91dFs0XSA9IDA7Ci0gIH0KLSAgQk5fYm4yYmluKGluLCBvdXQgKyA0ICsgZXh0ZW5kKTsKLSAgaWYgKGluLT5uZWcgJiYgbGVuID4gMCkgewotICAgIG91dFs0XSB8PSAweDgwOwotICB9Ci0gIHJldHVybiBsZW4gKyA0OwotfQotCi1CSUdOVU0gKkJOX21waTJibihjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGxlbiwgQklHTlVNICpvdXQpIHsKLSAgaWYgKGxlbiA8IDQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9CQURfRU5DT0RJTkcpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGNvbnN0IHNpemVfdCBpbl9sZW4gPSAoKHNpemVfdClpblswXSA8PCAyNCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgKChzaXplX3QpaW5bMV0gPDwgMTYpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoc2l6ZV90KWluWzJdIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoc2l6ZV90KWluWzNdKTsKLSAgaWYgKGluX2xlbiAhPSBsZW4gLSA0KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfQkFEX0VOQ09ESU5HKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmIChvdXQgPT0gTlVMTCkgewotICAgIG91dCA9IEJOX25ldygpOwotICB9Ci0gIGlmIChvdXQgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpZiAoaW5fbGVuID09IDApIHsKLSAgICBCTl96ZXJvKG91dCk7Ci0gICAgcmV0dXJuIG91dDsKLSAgfQotCi0gIGluICs9IDQ7Ci0gIGlmIChCTl9iaW4yYm4oaW4sIGluX2xlbiwgb3V0KSA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgb3V0LT5uZWcgPSAoKCppbikgJiAweDgwKSAhPSAwOwotICBpZiAob3V0LT5uZWcpIHsKLSAgICBCTl9jbGVhcl9iaXQob3V0LCBCTl9udW1fYml0cyhvdXQpIC0gMSk7Ci0gIH0KLSAgcmV0dXJuIG91dDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vY3R4LmMgYi9zcmMvY3J5cHRvL2JuL2N0eC5jCmluZGV4IDQ4ZDlhZGYuLjA1NzgzNzYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYm4vY3R4LmMKKysrIGIvc3JjL2NyeXB0by9ibi9jdHguYwpAQCAtMTI0LDcgKzEyNCw3IEBACiBCTl9DVFggKkJOX0NUWF9uZXcodm9pZCkgewogICBCTl9DVFggKnJldCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihCTl9DVFgpKTsKICAgaWYgKCFyZXQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9DVFhfbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIApAQCAtMTUzLDcgKzE1Myw3IEBACiAgICAgY3R4LT5lcnJfc3RhY2srKzsKICAgfSBlbHNlIGlmICghQk5fU1RBQ0tfcHVzaCgmY3R4LT5zdGFjaywgY3R4LT51c2VkKSkgewogICAgIC8qIChUcnkgdG8pIGdldCBhIG5ldyBmcmFtZSBwb2ludGVyICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfVE9PX01BTllfVEVNUE9SQVJZX1ZBUklBQkxFUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX0NUWF9zdGFydCwgQk5fUl9UT09fTUFOWV9URU1QT1JBUllfVkFSSUFCTEVTKTsKICAgICBjdHgtPmVycl9zdGFjaysrOwogICB9CiB9CkBAIC0xNjksNyArMTY5LDcgQEAKICAgICAvKiBTZXR0aW5nIHRvb19tYW55IHByZXZlbnRzIHJlcGVhdGVkICJnZXQiIGF0dGVtcHRzIGZyb20KICAgICAgKiBjbHV0dGVyaW5nIHRoZSBlcnJvciBzdGFjay4gKi8KICAgICBjdHgtPnRvb19tYW55ID0gMTsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9UT09fTUFOWV9URU1QT1JBUllfVkFSSUFCTEVTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fQ1RYX2dldCwgQk5fUl9UT09fTUFOWV9URU1QT1JBUllfVkFSSUFCTEVTKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2JuL2Rpdi5jIGIvc3JjL2NyeXB0by9ibi9kaXYuYwppbmRleCA3NzlkZGEyLi4zNTg4ZWExIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2JuL2Rpdi5jCisrKyBiL3NyYy9jcnlwdG8vYm4vZGl2LmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgKiBzbyBkb24ndCBqdXN0IHJlbHkgb24gYm5fY2hlY2tfdG9wKCkgaGVyZSAqLwogICBpZiAoKG51bS0+dG9wID4gMCAmJiBudW0tPmRbbnVtLT50b3AgLSAxXSA9PSAwKSB8fAogICAgICAgKGRpdmlzb3ItPnRvcCA+IDAgJiYgZGl2aXNvci0+ZFtkaXZpc29yLT50b3AgLSAxXSA9PSAwKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX05PVF9JTklUSUFMSVpFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX2RpdiwgQk5fUl9OT1RfSU5JVElBTElaRUQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTEzNSw3ICsxMzUsNyBAQAogICB9CiAKICAgaWYgKEJOX2lzX3plcm8oZGl2aXNvcikpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9ESVZfQllfWkVSTyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX2RpdiwgQk5fUl9ESVZfQllfWkVSTyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNTExLDcgKzUxMSw3IEBACiAgICAgLyogbWF4X3NoaWZ0ID49IDAgKi8KIAogICAgIGlmIChtYXhfc2hpZnQgPCAwKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9JTlBVVF9OT1RfUkVEVUNFRCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX2xzaGlmdF9xdWljaywgQk5fUl9JTlBVVF9OT1RfUkVEVUNFRCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vZXhwb25lbnRpYXRpb24uYyBiL3NyYy9jcnlwdG8vYm4vZXhwb25lbnRpYXRpb24uYwppbmRleCA2YzVlMTFiLi5kMzA2M2M5IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2JuL2V4cG9uZW50aWF0aW9uLmMKKysrIGIvc3JjL2NyeXB0by9ibi9leHBvbmVudGlhdGlvbi5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIAogICBpZiAoKHAtPmZsYWdzICYgQk5fRkxHX0NPTlNUVElNRSkgIT0gMCkgewogICAgIC8qIEJOX0ZMR19DT05TVFRJTUUgb25seSBzdXBwb3J0ZWQgYnkgQk5fbW9kX2V4cF9tb250KCkgKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fZXhwLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTE3Myw4ICsxNzMsOCBAQAogICAgIH0KICAgfQogCi0gIGlmIChyICE9IHJyICYmICFCTl9jb3B5KHIsIHJyKSkgewotICAgIGdvdG8gZXJyOworICBpZiAociAhPSBycikgeworICAgIEJOX2NvcHkociwgcnIpOwogICB9CiAgIHJldCA9IDE7CiAKQEAgLTMzMyw3ICszMzMsNyBAQAogICBqID0gMDsKICAgd2hpbGUgKEJOX3VjbXAociwgJihyZWNwLT5OKSkgPj0gMCkgewogICAgIGlmIChqKysgPiAyKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9CQURfUkVDSVBST0NBTCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fZGl2X3JlY3AsIEJOX1JfQkFEX1JFQ0lQUk9DQUwpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIGlmICghQk5fdXN1YihyLCByLCAmKHJlY3AtPk4pKSkgewpAQCAtNDI3LDcgKzQyNyw3IEBACiAKICAgaWYgKEJOX2dldF9mbGFncyhwLCBCTl9GTEdfQ09OU1RUSU1FKSAhPSAwKSB7CiAgICAgLyogQk5fRkxHX0NPTlNUVElNRSBvbmx5IHN1cHBvcnRlZCBieSBCTl9tb2RfZXhwX21vbnQoKSAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBtb2RfZXhwX3JlY3AsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNjE2LDcgKzYxNiw3IEBACiAgIH0KIAogICBpZiAoIUJOX2lzX29kZChtKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0NBTExFRF9XSVRIX0VWRU5fTU9EVUxVUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX21vZF9leHBfbW9udCwgQk5fUl9DQUxMRURfV0lUSF9FVkVOX01PRFVMVVMpOwogICAgIHJldHVybiAwOwogICB9CiAgIGJpdHMgPSBCTl9udW1fYml0cyhwKTsKQEAgLTg2MiwxMyArODYyLDEzIEBACiAgIHVuc2lnbmVkIGNoYXIgKnBvd2VyYnVmID0gTlVMTDsKICAgQklHTlVNIHRtcCwgYW07CiAKLSAgaWYgKCFCTl9pc19vZGQobSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9DQUxMRURfV0lUSF9FVkVOX01PRFVMVVMpOwotICAgIHJldHVybiAwOwotICB9Ci0KICAgdG9wID0gbS0+dG9wOwogCisgIGlmICghKG0tPmRbMF0gJiAxKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9tb2RfZXhwX21vbnRfY29uc3R0aW1lLAorICAgICAgICAgICAgICAgICAgICAgIEJOX1JfQ0FMTEVEX1dJVEhfRVZFTl9NT0RVTFVTKTsKKyAgICByZXR1cm4gMDsKKyAgfQogICBiaXRzID0gQk5fbnVtX2JpdHMocCk7CiAgIGlmIChiaXRzID09IDApIHsKICAgICByZXQgPSBCTl9vbmUocnIpOwpAQCAtOTI2LDYgKzkyNiw3IEBACiAgICAgfQogICB9CiAjZW5kaWYKKyAgKHZvaWQpMDsKIAogICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgb2YgdGhlIHByZS1jb21wdXRlZAogICAgKiBwb3dlcnMgb2YgYW0sIGFtIGl0c2VsZiBhbmQgdG1wLgpAQCAtMTIyMiwxMiArMTIyMywxMyBAQAogCiAgIGlmIChCTl9nZXRfZmxhZ3MocCwgQk5fRkxHX0NPTlNUVElNRSkgIT0gMCkgewogICAgIC8qIEJOX0ZMR19DT05TVFRJTUUgb25seSBzdXBwb3J0ZWQgYnkgQk5fbW9kX2V4cF9tb250KCkgKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX2V4cF9tb250X3dvcmQsCisgICAgICAgIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoIUJOX2lzX29kZChtKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0NBTExFRF9XSVRIX0VWRU5fTU9EVUxVUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX21vZF9leHBfbW9udF93b3JkLCBCTl9SX0NBTExFRF9XSVRIX0VWRU5fTU9EVUxVUyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTM3MCw3ICsxMzcyLDcgQEAKICAgQk5fTU9OVF9DVFggKm1vbnQgPSBOVUxMOwogCiAgIGlmICghKG0tPmRbMF0gJiAxKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0NBTExFRF9XSVRIX0VWRU5fTU9EVUxVUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX21vZF9leHAyX21vbnQsIEJOX1JfQ0FMTEVEX1dJVEhfRVZFTl9NT0RVTFVTKTsKICAgICByZXR1cm4gMDsKICAgfQogICBiaXRzMSA9IEJOX251bV9iaXRzKHAxKTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vZ2NkLmMgYi9zcmMvY3J5cHRvL2JuL2djZC5jCmluZGV4IGUxMDYxNDkuLjMxMzJjMjkgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYm4vZ2NkLmMKKysrIGIvc3JjL2NyeXB0by9ibi9nY2QuYwpAQCAtMjIzLDIzICsyMjMsMjAgQEAKIH0KIAogLyogc29sdmVzIGF4ID09IDEgKG1vZCBuKSAqLwotc3RhdGljIEJJR05VTSAqQk5fbW9kX2ludmVyc2Vfbm9fYnJhbmNoKEJJR05VTSAqb3V0LCBpbnQgKm91dF9ub19pbnZlcnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KTsKK3N0YXRpYyBCSUdOVU0gKkJOX21vZF9pbnZlcnNlX25vX2JyYW5jaChCSUdOVU0gKm91dCwgY29uc3QgQklHTlVNICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqbiwgQk5fQ1RYICpjdHgpOwogCi1CSUdOVU0gKkJOX21vZF9pbnZlcnNlX2V4KEJJR05VTSAqb3V0LCBpbnQgKm91dF9ub19pbnZlcnNlLCBjb25zdCBCSUdOVU0gKmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqbiwgQk5fQ1RYICpjdHgpIHsKK0JJR05VTSAqQk5fbW9kX2ludmVyc2UoQklHTlVNICpvdXQsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpuLAorICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCkgewogICBCSUdOVU0gKkEsICpCLCAqWCwgKlksICpNLCAqRCwgKlQsICpSID0gTlVMTDsKICAgQklHTlVNICpyZXQgPSBOVUxMOwogICBpbnQgc2lnbjsKIAogICBpZiAoKGEtPmZsYWdzICYgQk5fRkxHX0NPTlNUVElNRSkgIT0gMCB8fAogICAgICAgKG4tPmZsYWdzICYgQk5fRkxHX0NPTlNUVElNRSkgIT0gMCkgewotICAgIHJldHVybiBCTl9tb2RfaW52ZXJzZV9ub19icmFuY2gob3V0LCBvdXRfbm9faW52ZXJzZSwgYSwgbiwgY3R4KTsKKyAgICByZXR1cm4gQk5fbW9kX2ludmVyc2Vfbm9fYnJhbmNoKG91dCwgYSwgbiwgY3R4KTsKICAgfQogCi0gICpvdXRfbm9faW52ZXJzZSA9IDA7Ci0KICAgQk5fQ1RYX3N0YXJ0KGN0eCk7CiAgIEEgPSBCTl9DVFhfZ2V0KGN0eCk7CiAgIEIgPSBCTl9DVFhfZ2V0KGN0eCk7CkBAIC01MjUsOCArNTIyLDcgQEAKICAgICAgIH0KICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgKm91dF9ub19pbnZlcnNlID0gMTsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9OT19JTlZFUlNFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX2ludmVyc2UsIEJOX1JfTk9fSU5WRVJTRSk7CiAgICAgZ290byBlcnI7CiAgIH0KICAgcmV0ID0gUjsKQEAgLTUzOSwyNSArNTM1LDE2IEBACiAgIHJldHVybiByZXQ7CiB9CiAKLUJJR05VTSAqQk5fbW9kX2ludmVyc2UoQklHTlVNICpvdXQsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpuLAotICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCkgewotICBpbnQgbm9faW52ZXJzZTsKLSAgcmV0dXJuIEJOX21vZF9pbnZlcnNlX2V4KG91dCwgJm5vX2ludmVyc2UsIGEsIG4sIGN0eCk7Ci19Ci0KIC8qIEJOX21vZF9pbnZlcnNlX25vX2JyYW5jaCBpcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiBCTl9tb2RfaW52ZXJzZS4KICAqIEl0IGRvZXMgbm90IGNvbnRhaW4gYnJhbmNoZXMgdGhhdCBtYXkgbGVhayBzZW5zaXRpdmUgaW5mb3JtYXRpb24uICovCi1zdGF0aWMgQklHTlVNICpCTl9tb2RfaW52ZXJzZV9ub19icmFuY2goQklHTlVNICpvdXQsIGludCAqb3V0X25vX2ludmVyc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpIHsKK3N0YXRpYyBCSUdOVU0gKkJOX21vZF9pbnZlcnNlX25vX2JyYW5jaChCSUdOVU0gKm91dCwgY29uc3QgQklHTlVNICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqbiwgQk5fQ1RYICpjdHgpIHsKICAgQklHTlVNICpBLCAqQiwgKlgsICpZLCAqTSwgKkQsICpULCAqUiA9IE5VTEw7CiAgIEJJR05VTSBsb2NhbF9BLCBsb2NhbF9COwogICBCSUdOVU0gKnBBLCAqcEI7CiAgIEJJR05VTSAqcmV0ID0gTlVMTDsKICAgaW50IHNpZ247CiAKLSAgKm91dF9ub19pbnZlcnNlID0gMDsKLQogICBCTl9DVFhfc3RhcnQoY3R4KTsKICAgQSA9IEJOX0NUWF9nZXQoY3R4KTsKICAgQiA9IEJOX0NUWF9nZXQoY3R4KTsKQEAgLTY5NSw4ICs2ODIsNyBAQAogICAgICAgfQogICAgIH0KICAgfSBlbHNlIHsKLSAgICAqb3V0X25vX2ludmVyc2UgPSAxOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX05PX0lOVkVSU0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9tb2RfaW52ZXJzZV9ub19icmFuY2gsIEJOX1JfTk9fSU5WRVJTRSk7CiAgICAgZ290byBlcnI7CiAgIH0KICAgcmV0ID0gUjsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vaW50ZXJuYWwuaCBiL3NyYy9jcnlwdG8vYm4vaW50ZXJuYWwuaAppbmRleCAwZDBlYjQ0Li4yNjc0YjNjIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2JuL2ludGVybmFsLmgKKysrIGIvc3JjL2NyeXB0by9ibi9pbnRlcm5hbC5oCkBAIC0xMzYsOSArMTM2LDkgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLS8qIGJuX2V4cGFuZCBhY3RzIHRoZSBzYW1lIGFzIHxibl93ZXhwYW5kfCwgYnV0IHRha2VzIGEgbnVtYmVyIG9mIGJpdHMgcmF0aGVyCisvKiBibl9leHBhbmQgYWN0cyB0aGUgc2FtZSBhcyB8Qk5fd2V4cGFuZHwsIGJ1dCB0YWtlcyBhIG51bWJlciBvZiBiaXRzIHJhdGhlcgogICogdGhhbiBhIG51bWJlciBvZiB3b3Jkcy4gKi8KLUJJR05VTSAqYm5fZXhwYW5kKEJJR05VTSAqYm4sIHNpemVfdCBiaXRzKTsKK0JJR05VTSAqYm5fZXhwYW5kKEJJR05VTSAqYm4sIHVuc2lnbmVkIGJpdHMpOwogCiAjaWYgZGVmaW5lZChPUEVOU1NMXzY0X0JJVCkKIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ibi9tb250Z29tZXJ5LmMgYi9zcmMvY3J5cHRvL2JuL21vbnRnb21lcnkuYwppbmRleCBjNmM5Yzg4Li4xNTJjZjJkIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2JuL21vbnRnb21lcnkuYworKysgYi9zcmMvY3J5cHRvL2JuL21vbnRnb21lcnkuYwpAQCAtMTEwLDcgKzExMCw2IEBACiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAotI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KICNpbmNsdWRlIDxvcGVuc3NsL3RocmVhZC5oPgogCkBAIC0xNzcsMTEgKzE3Niw2IEBACiAgIEJJR05VTSB0bW9kOwogICBCTl9VTE9ORyBidWZbMl07CiAKLSAgaWYgKEJOX2lzX3plcm8obW9kKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0RJVl9CWV9aRVJPKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCiAgIEJOX0NUWF9zdGFydChjdHgpOwogICBSaSA9IEJOX0NUWF9nZXQoY3R4KTsKICAgaWYgKFJpID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vbXVsLmMgYi9zcmMvY3J5cHRvL2JuL211bC5jCmluZGV4IDAyOWE1OWUuLmExN2Q3NjYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYm4vbXVsLmMKKysrIGIvc3JjL2NyeXB0by9ibi9tdWwuYwpAQCAtNjY2LDggKzY2Niw4IEBACiAKIGVuZDoKICAgYm5fY29ycmVjdF90b3AocnIpOwotICBpZiAociAhPSByciAmJiAhQk5fY29weShyLCBycikpIHsKLSAgICBnb3RvIGVycjsKKyAgaWYgKHIgIT0gcnIpIHsKKyAgICBCTl9jb3B5KHIsIHJyKTsKICAgfQogICByZXQgPSAxOwogCkBAIC04NzcsOCArODc3LDggQEAKICAgICByci0+dG9wID0gbWF4OwogICB9CiAKLSAgaWYgKHJyICE9IHIgJiYgIUJOX2NvcHkociwgcnIpKSB7Ci0gICAgZ290byBlcnI7CisgIGlmIChyciAhPSByKSB7CisgICAgQk5fY29weShyLCBycik7CiAgIH0KICAgcmV0ID0gMTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ibi9wcmltZS5jIGIvc3JjL2NyeXB0by9ibi9wcmltZS5jCmluZGV4IGJiYjhmZTAuLmNmM2FmY2YgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYm4vcHJpbWUuYworKysgYi9zcmMvY3J5cHRvL2JuL3ByaW1lLmMKQEAgLTM2MiwxMSArMzYyLDExIEBACiAKICAgaWYgKGJpdHMgPCAyKSB7CiAgICAgLyogVGhlcmUgYXJlIG5vIHByaW1lIG51bWJlcnMgdGhpcyBzbWFsbC4gKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9CSVRTX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX2dlbmVyYXRlX3ByaW1lX2V4LCBCTl9SX0JJVFNfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gMDsKICAgfSBlbHNlIGlmIChiaXRzID09IDIgJiYgc2FmZSkgewogICAgIC8qIFRoZSBzbWFsbGVzdCBzYWZlIHByaW1lICg3KSBpcyB0aHJlZSBiaXRzLiAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0JJVFNfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fZ2VuZXJhdGVfcHJpbWVfZXgsIEJOX1JfQklUU19UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTUxNSwxMCArNTE1LDExIEBACiAKICAgLyogQSA6PSBhYnMoYSkgKi8KICAgaWYgKGEtPm5lZykgewotICAgIEJJR05VTSAqdCA9IEJOX0NUWF9nZXQoY3R4KTsKLSAgICBpZiAodCA9PSBOVUxMIHx8ICFCTl9jb3B5KHQsIGEpKSB7CisgICAgQklHTlVNICp0OworICAgIGlmICgodCA9IEJOX0NUWF9nZXQoY3R4KSkgPT0gTlVMTCkgewogICAgICAgZ290byBlcnI7CiAgICAgfQorICAgIEJOX2NvcHkodCwgYSk7CiAgICAgdC0+bmVnID0gMDsKICAgICBBID0gdDsKICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vcmFuZG9tLmMgYi9zcmMvY3J5cHRvL2JuL3JhbmRvbS5jCmluZGV4IDMxMTZlNTQuLjU0OWFjNDggMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYm4vcmFuZG9tLmMKKysrIGIvc3JjL2NyeXB0by9ibi9yYW5kb20uYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAKICAgYnVmID0gT1BFTlNTTF9tYWxsb2MoYnl0ZXMpOwogICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9yYW5kLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMTg2LDcgKzE4Niw3IEBACiAgIHVuc2lnbmVkIGNvdW50ID0gMTAwOwogCiAgIGlmIChyYW5nZS0+bmVnIHx8IEJOX2lzX3plcm8ocmFuZ2UpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfSU5WQUxJRF9SQU5HRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX3JhbmRfcmFuZ2UsIEJOX1JfSU5WQUxJRF9SQU5HRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjE5LDcgKzIxOSw3IEBACiAgICAgICB9CiAKICAgICAgIGlmICghLS1jb3VudCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9UT09fTUFOWV9JVEVSQVRJT05TKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX3JhbmRfcmFuZ2UsIEJOX1JfVE9PX01BTllfSVRFUkFUSU9OUyk7CiAgICAgICAgIHJldHVybiAwOwogICAgICAgfQogICAgIH0gd2hpbGUgKEJOX2NtcChyLCByYW5nZSkgPj0gMCk7CkBAIC0yMzEsNyArMjMxLDcgQEAKICAgICAgIH0KIAogICAgICAgaWYgKCEtLWNvdW50KSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX1RPT19NQU5ZX0lURVJBVElPTlMpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fcmFuZF9yYW5nZSwgQk5fUl9UT09fTUFOWV9JVEVSQVRJT05TKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAgICAgfSB3aGlsZSAoQk5fY21wKHIsIHJhbmdlKSA+PSAwKTsKQEAgLTI2NCwxMyArMjY0LDEzIEBACiAgIH0KIAogICBpZiAoQk5faXNfemVybyhyYW5nZSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9ESVZfQllfWkVSTyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX2dlbmVyYXRlX2RzYV9ub25jZSwgQk5fUl9ESVZfQllfWkVSTyk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBrX2J5dGVzID0gT1BFTlNTTF9tYWxsb2MobnVtX2tfYnl0ZXMpOwogICBpZiAoIWtfYnl0ZXMpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9nZW5lcmF0ZV9kc2Ffbm9uY2UsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0yODEsNyArMjgxLDcgQEAKICAgICAvKiBObyByZWFzb25hYmxlIERTQSBvciBFQ0RTQSBrZXkgc2hvdWxkIGhhdmUgYSBwcml2YXRlIGtleQogICAgICAqIHRoaXMgbGFyZ2UgYW5kIHdlIGRvbid0IGhhbmRsZSB0aGlzIGNhc2UgaW4gb3JkZXIgdG8gYXZvaWQKICAgICAgKiBsZWFraW5nIHRoZSBsZW5ndGggb2YgdGhlIHByaXZhdGUga2V5LiAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX1BSSVZBVEVfS0VZX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX2dlbmVyYXRlX2RzYV9ub25jZSwgQk5fUl9QUklWQVRFX0tFWV9UT09fTEFSR0UpOwogICAgIGdvdG8gZXJyOwogICB9CiAgIG1lbWNweShwcml2YXRlX2J5dGVzLCBwcml2LT5kLCB0b2RvKTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vcnNhel9leHAuaCBiL3NyYy9jcnlwdG8vYm4vcnNhel9leHAuaAppbmRleCBjNzUyYjQ1Li4wYmI2YjBjIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2JuL3JzYXpfZXhwLmgKKysrIGIvc3JjL2NyeXB0by9ibi9yc2F6X2V4cC5oCkBAIC0xLDQ0ICsxLDMyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgQ29weXJpZ2h0IChjKSAyMDEyLCBJbnRlbCBDb3Jwb3JhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgICAgICAgICoKLSogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgICAgKgotKiAgbWV0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogICogIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgICAgICAgKgotKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAgICAgICAgICAqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogICogIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0ICAgICAgKgotKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSAgICAqCi0qICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgICAgICAgICAgICAgICAgICoKLSogICAgIGRpc3RyaWJ1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qICAqICBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyAgICAgICAgICoKLSogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tICAgKgotKiAgICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gICAgICAgICAgICAgICAqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBJTlRFTCBDT1JQT1JBVElPTiAiIkFTIElTIiIgQU5EIEFOWSAgICAgICAgICAqCi0qICBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAgICAgICAgICoKLSogIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAgICAgICAgKgotKiAgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgSU5URUwgQ09SUE9SQVRJT04gT1IgICAgICAgICAgICAqCi0qICBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgICAgICoKLSogIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgICAgICAgKgotKiAgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SICAgICAgICAqCi0qICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GICAgICoKLSogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HICAgICAgKgotKiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTICAgICAgICAqCi0qICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gICAgICAgICAgICAgICoKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQoYykgMjAxMiwgSW50ZWwgQ29ycC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyogRGV2ZWxvcGVycyBhbmQgYXV0aG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqIFNoYXkgR3Vlcm9uICgxLCAyKSwgYW5kIFZsYWQgS3Jhc25vdiAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorKiAoMSkgSW50ZWwgQ29ycG9yYXRpb24sIElzcmFlbCBEZXZlbG9wbWVudCBDZW50ZXIsIEhhaWZhLCBJc3JhZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqICgyKSBVbml2ZXJzaXR5IG9mIEhhaWZhLCBJc3JhZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogRGV2ZWxvcGVycyBhbmQgYXV0aG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBTaGF5IEd1ZXJvbiAoMSwgMiksIGFuZCBWbGFkIEtyYXNub3YgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qICgxKSBJbnRlbCBDb3Jwb3JhdGlvbiwgSXNyYWVsIERldmVsb3BtZW50IENlbnRlciwgSGFpZmEsIElzcmFlbCAgICAgICAgICAgICoKLSogKDIpIFVuaXZlcnNpdHkgb2YgSGFpZmEsIElzcmFlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqIExJQ0VOU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorKiBUaGlzIHN1Ym1pc3Npb24gdG8gT3BlblNTTCBpcyB0byBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgT3BlblNTTCAgCisqIGxpY2Vuc2UsIGFuZCBvbmx5IHRvIHRoZSBPcGVuU1NMIHByb2plY3QsIGluIG9yZGVyIHRvIGFsbG93IGludGVncmF0aW9uICAgIAorKiBpbnRvIHRoZSBwdWJsaWNseSBkaXN0cmlidXRlZCBjb2RlLiAKKyogVGhlIHVzZSBvZiB0aGlzIGNvZGUsIG9yIHBvcnRpb25zIG9mIHRoaXMgY29kZSwgb3IgY29uY2VwdHMgZW1iZWRkZWQgaW4KKyogdGhpcyBjb2RlLCBvciBtb2RpZmljYXRpb24gb2YgdGhpcyBjb2RlIGFuZC9vciBhbGdvcml0aG0ocykgaW4gaXQsIG9yIHRoZQorKiB1c2Ugb2YgdGhpcyBjb2RlIGZvciBhbnkgb3RoZXIgcHVycG9zZSB0aGFuIHN0YXRlZCBhYm92ZSwgcmVxdWlyZXMgc3BlY2lhbAorKiBsaWNlbnNpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRElTQ0xBSU1FUjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPTlRSSUJVVE9SUyBBTkQgVEhFIENPUFlSSUdIVCBPV05FUlMgICAgIAorKiBgYEFTIElTJycuIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCAKKyogVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgCisqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05UUklCVVRPUlMgT1IgVEhFIENPUFlSSUdIVAorKiBPV05FUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCAKKyogT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgICAgCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAgIAorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgICAKKyogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgICAgCisqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmbmRlZiBSU0FaX0VYUF9ICiAjZGVmaW5lIFJTQVpfRVhQX0gKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vc2hpZnQuYyBiL3NyYy9jcnlwdG8vYm4vc2hpZnQuYwppbmRleCBkZWZlYzkyLi5mMTQzOTk2IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2JuL3NoaWZ0LmMKKysrIGIvc3JjL2NyeXB0by9ibi9zaGlmdC5jCkBAIC02OSw3ICs2OSw3IEBACiAgIEJOX1VMT05HIGw7CiAKICAgaWYgKG4gPCAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfTkVHQVRJVkVfTlVNQkVSKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbHNoaWZ0LCBCTl9SX05FR0FUSVZFX05VTUJFUik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTM4LDcgKzEzOCw3IEBACiAgIEJOX1VMT05HIGwsIHRtcDsKIAogICBpZiAobiA8IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9ORUdBVElWRV9OVU1CRVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9yc2hpZnQsIEJOX1JfTkVHQVRJVkVfTlVNQkVSKTsKICAgICByZXR1cm4gMDsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2JuL3NxcnQuYyBiL3NyYy9jcnlwdG8vYm4vc3FydC5jCmluZGV4IDJlZDY2YzIuLmU3MWE4MTggMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYm4vc3FydC5jCisrKyBiL3NyYy9jcnlwdG8vYm4vc3FydC5jCkBAIC04Niw3ICs4Niw3IEBACiAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX1BfSVNfTk9UX1BSSU1FKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX3NxcnQsIEJOX1JfUF9JU19OT1RfUFJJTUUpOwogICAgIHJldHVybiAoTlVMTCk7CiAgIH0KIApAQCAtMjYwLDcgKzI2MCw3IEBACiAgICAgfQogICAgIGlmIChyID09IDApIHsKICAgICAgIC8qIG0gZGl2aWRlcyBwICovCi0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9QX0lTX05PVF9QUklNRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX3NxcnQsIEJOX1JfUF9JU19OT1RfUFJJTUUpOwogICAgICAgZ290byBlbmQ7CiAgICAgfQogICB9IHdoaWxlIChyID09IDEgJiYgKytpIDwgODIpOwpAQCAtMjcxLDcgKzI3MSw3IEBACiAgICAgICogRXZlbiBpZiAgcCAgaXMgbm90IHByaW1lLCB3ZSBzaG91bGQgaGF2ZSBmb3VuZCBzb21lICB5CiAgICAgICogc3VjaCB0aGF0IHIgPT0gLTEuCiAgICAgICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfVE9PX01BTllfSVRFUkFUSU9OUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX21vZF9zcXJ0LCBCTl9SX1RPT19NQU5ZX0lURVJBVElPTlMpOwogICAgIGdvdG8gZW5kOwogICB9CiAKQEAgLTI4Niw3ICsyODYsNyBAQAogICAgIGdvdG8gZW5kOwogICB9CiAgIGlmIChCTl9pc19vbmUoeSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9QX0lTX05PVF9QUklNRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX21vZF9zcXJ0LCBCTl9SX1BfSVNfTk9UX1BSSU1FKTsKICAgICBnb3RvIGVuZDsKICAgfQogCkBAIC0zNzcsNyArMzc3LDcgQEAKICAgICB3aGlsZSAoIUJOX2lzX29uZSh0KSkgewogICAgICAgaSsrOwogICAgICAgaWYgKGkgPT0gZSkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9OT1RfQV9TUVVBUkUpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX3NxcnQsIEJOX1JfTk9UX0FfU1FVQVJFKTsKICAgICAgICAgZ290byBlbmQ7CiAgICAgICB9CiAgICAgICBpZiAoIUJOX21vZF9tdWwodCwgdCwgdCwgcCwgY3R4KSkgewpAQCAtNDEzLDcgKzQxMyw3IEBACiAgICAgfQogCiAgICAgaWYgKCFlcnIgJiYgMCAhPSBCTl9jbXAoeCwgQSkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX05PVF9BX1NRVUFSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX3NxcnQsIEJOX1JfTk9UX0FfU1FVQVJFKTsKICAgICAgIGVyciA9IDE7CiAgICAgfQogICB9CkBAIC00MzQsNyArNDM0LDcgQEAKICAgaW50IG9rID0gMCwgbGFzdF9kZWx0YV92YWxpZCA9IDA7CiAKICAgaWYgKGluLT5uZWcpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9ORUdBVElWRV9OVU1CRVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9zcXJ0LCBCTl9SX05FR0FUSVZFX05VTUJFUik7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKEJOX2lzX3plcm8oaW4pKSB7CkBAIC00NTIsNyArNDUyLDcgQEAKICAgbGFzdF9kZWx0YSA9IEJOX0NUWF9nZXQoY3R4KTsKICAgZGVsdGEgPSBCTl9DVFhfZ2V0KGN0eCk7CiAgIGlmIChlc3RpbWF0ZSA9PSBOVUxMIHx8IHRtcCA9PSBOVUxMIHx8IGxhc3RfZGVsdGEgPT0gTlVMTCB8fCBkZWx0YSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fc3FydCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTQ3MCw3ICs0NzAsNyBAQAogICAgICAgICAhQk5fc3FyKHRtcCwgZXN0aW1hdGUsIGN0eCkgfHwKICAgICAgICAgLyogfGRlbHRhfCA9IHxpbnwgLSB8dG1wfCAqLwogICAgICAgICAhQk5fc3ViKGRlbHRhLCBpbiwgdG1wKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEVSUl9SX0JOX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fc3FydCwgRVJSX1JfQk5fTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtNDkwLDE1ICs0OTAsMTUgQEAKICAgfQogCiAgIGlmIChCTl9jbXAodG1wLCBpbikgIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX05PVF9BX1NRVUFSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX3NxcnQsIEJOX1JfTk9UX0FfU1FVQVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIG9rID0gMTsKIAogZXJyOgotICBpZiAob2sgJiYgb3V0X3NxcnQgPT0gaW4gJiYgIUJOX2NvcHkob3V0X3NxcnQsIGVzdGltYXRlKSkgewotICAgIG9rID0gMDsKKyAgaWYgKG9rICYmIG91dF9zcXJ0ID09IGluKSB7CisgICAgQk5fY29weShvdXRfc3FydCwgZXN0aW1hdGUpOwogICB9CiAgIEJOX0NUWF9lbmQoY3R4KTsKICAgcmV0dXJuIG9rOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9idWYvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2J1Zi9DTWFrZUxpc3RzLnR4dAppbmRleCA2M2YxMDI1Li4xOWVkZjdkIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2J1Zi9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL2J1Zi9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgYnVmCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2J1Zi9idWYuYyBiL3NyYy9jcnlwdG8vYnVmL2J1Zi5jCmluZGV4IDEzYjVjZWIuLjU3NjllNzcgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYnVmL2J1Zi5jCisrKyBiL3NyYy9jcnlwdG8vYnVmL2J1Zi5jCkBAIC02Nyw3ICs2Nyw3IEBACiAKICAgcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEJVRl9NRU0pKTsKICAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQlVGLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQlVGLCBCVUZfTUVNX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKQEAgLTEwNSwxNCArMTA1LDE0IEBACiAgIG4gPSBsZW4gKyAzOwogICBpZiAobiA8IGxlbikgewogICAgIC8qIG92ZXJmbG93ICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQlVGLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQlVGLCBidWZfbWVtX2dyb3csIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gMDsKICAgfQogICBuID0gbiAvIDM7CiAgIGFsbG9jX3NpemUgPSBuICogNDsKICAgaWYgKGFsbG9jX3NpemUgLyA0ICE9IG4pIHsKICAgICAvKiBvdmVyZmxvdyAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJVRiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJVRiwgYnVmX21lbV9ncm93LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTI3LDcgKzEyNyw3IEBACiAgIH0KIAogICBpZiAobmV3X2J1ZiA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQlVGLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQlVGLCBidWZfbWVtX2dyb3csIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBsZW4gPSAwOwogICB9IGVsc2UgewogICAgIGJ1Zi0+ZGF0YSA9IG5ld19idWY7CkBAIC0xODAsMTIgKzE4MCwxMiBAQAogICBhbGxvY19zaXplID0gc2l6ZSArIDE7CiAgIGlmIChhbGxvY19zaXplIDwgc2l6ZSkgewogICAgIC8qIG92ZXJmbG93ICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQlVGLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQlVGLCBCVUZfc3RybmR1cCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIHJldCA9IE9QRU5TU0xfbWFsbG9jKGFsbG9jX3NpemUpOwogICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCVUYsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCVUYsIEJVRl9zdHJuZHVwLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIApAQCAtMjI2LDcgKzIyNiw3IEBACiAKICAgcmV0ID0gT1BFTlNTTF9tYWxsb2MoZHN0X3NpemUpOwogICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCVUYsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCVUYsIEJVRl9tZW1kdXAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2J5dGVzdHJpbmcvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2J5dGVzdHJpbmcvQ01ha2VMaXN0cy50eHQKaW5kZXggMzQ2MmFlZS4uY2JiYWNmMiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ieXRlc3RyaW5nL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vYnl0ZXN0cmluZy9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgYnl0ZXN0cmluZwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ieXRlc3RyaW5nL2J5dGVzdHJpbmdfdGVzdC5jYyBiL3NyYy9jcnlwdG8vYnl0ZXN0cmluZy9ieXRlc3RyaW5nX3Rlc3QuY2MKaW5kZXggZTk4N2UxYi4uNjZlOWMxZSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ieXRlc3RyaW5nL2J5dGVzdHJpbmdfdGVzdC5jYworKysgYi9zcmMvY3J5cHRvL2J5dGVzdHJpbmcvYnl0ZXN0cmluZ190ZXN0LmNjCkBAIC0xMDksNyArMTA5LDcgQEAKICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGEyW10gPSB7MHgzMCwgMywgMSwgMn07CiAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhM1tdID0gezB4MzAsIDB4ODB9OwogICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YTRbXSA9IHsweDMwLCAweDgxLCAxLCAxfTsKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGE1WzQgKyAweDgwXSA9IHsweDMwLCAweDgyLCAwLCAweDgwfTsKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGE1W10gPSB7MHgzMCwgMHg4MiwgMCwgMSwgMX07CiAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhNltdID0gezB4YTEsIDMsIDB4NCwgMSwgMX07CiAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhN1tdID0gezB4YTEsIDMsIDB4NCwgMiwgMX07CiAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhOFtdID0gezB4YTEsIDMsIDB4MiwgMSwgMX07CkBAIC02NDksMTQgKzY0OSw2IEBACiAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW50IFRlc3RaZXJvKCkgewotICBDQkIgY2JiOwotICBDQkJfemVybygmY2JiKTsKLSAgLy8gQ2FsbGluZyB8Q0JCX2NsZWFudXB8IG9uIGEgemVyby1zdGF0ZSB8Q0JCfCBtdXN0IG5vdCBjcmFzaC4KLSAgQ0JCX2NsZWFudXAoJmNiYik7Ci0gIHJldHVybiAxOwotfQotCiBpbnQgbWFpbih2b2lkKSB7CiAgIENSWVBUT19saWJyYXJ5X2luaXQoKTsKIApAQCAtNjczLDggKzY2NSw3IEBACiAgICAgICAhVGVzdENCQkFTTjEoKSB8fAogICAgICAgIVRlc3RCZXJDb252ZXJ0KCkgfHwKICAgICAgICFUZXN0QVNOMVVpbnQ2NCgpIHx8Ci0gICAgICAhVGVzdEdldE9wdGlvbmFsQVNOMUJvb2woKSB8fAotICAgICAgIVRlc3RaZXJvKCkpIHsKKyAgICAgICFUZXN0R2V0T3B0aW9uYWxBU04xQm9vbCgpKSB7CiAgICAgcmV0dXJuIDE7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ieXRlc3RyaW5nL2NiYi5jIGIvc3JjL2NyeXB0by9ieXRlc3RyaW5nL2NiYi5jCmluZGV4IDFkYTZhMjEuLmYxZTA5YTIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYnl0ZXN0cmluZy9jYmIuYworKysgYi9zcmMvY3J5cHRvL2J5dGVzdHJpbmcvY2JiLmMKQEAgLTIwLDEwICsyMCw2IEBACiAjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KIAogCi12b2lkIENCQl96ZXJvKENCQiAqY2JiKSB7Ci0gIG1lbXNldChjYmIsIDAsIHNpemVvZihDQkIpKTsKLX0KLQogc3RhdGljIGludCBjYmJfaW5pdChDQkIgKmNiYiwgdWludDhfdCAqYnVmLCBzaXplX3QgY2FwKSB7CiAgIHN0cnVjdCBjYmJfYnVmZmVyX3N0ICpiYXNlOwogCkBAIC0yNDcsMTEgKzI0Myw2IEBACiAgIHJldHVybiAxOwogfQogCi1zaXplX3QgQ0JCX2xlbihjb25zdCBDQkIgKmNiYikgewotICBhc3NlcnQoY2JiLT5jaGlsZCA9PSBOVUxMKTsKLQotICByZXR1cm4gY2JiLT5iYXNlLT5sZW47Ci19CiAKIHN0YXRpYyBpbnQgY2JiX2FkZF9sZW5ndGhfcHJlZml4ZWQoQ0JCICpjYmIsIENCQiAqb3V0X2NvbnRlbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuX2xlbikgewpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ieXRlc3RyaW5nL2Nicy5jIGIvc3JjL2NyeXB0by9ieXRlc3RyaW5nL2Nicy5jCmluZGV4IDVlMGM1MzguLmI4Y2FlZGQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYnl0ZXN0cmluZy9jYnMuYworKysgYi9zcmMvY3J5cHRvL2J5dGVzdHJpbmcvY2JzLmMKQEAgLTEzNywxNSArMTM3LDYgQEAKICAgcmV0dXJuIDE7CiB9CiAKLWludCBDQlNfY29weV9ieXRlcyhDQlMgKmNicywgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuKSB7Ci0gIGNvbnN0IHVpbnQ4X3QgKnY7Ci0gIGlmICghY2JzX2dldChjYnMsICZ2LCBsZW4pKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgbWVtY3B5KG91dCwgdiwgbGVuKTsKLSAgcmV0dXJuIDE7Ci19Ci0KIHN0YXRpYyBpbnQgY2JzX2dldF9sZW5ndGhfcHJlZml4ZWQoQ0JTICpjYnMsIENCUyAqb3V0LCBzaXplX3QgbGVuX2xlbikgewogICB1aW50MzJfdCBsZW47CiAgIGlmICghY2JzX2dldF91KGNicywgJmxlbiwgbGVuX2xlbikpIHsKQEAgLTMyOSwxOSArMzIwLDE0IEBACiB9CiAKIGludCBDQlNfZ2V0X29wdGlvbmFsX2FzbjEoQ0JTICpjYnMsIENCUyAqb3V0LCBpbnQgKm91dF9wcmVzZW50LCB1bnNpZ25lZCB0YWcpIHsKLSAgaW50IHByZXNlbnQgPSAwOwotCiAgIGlmIChDQlNfcGVla19hc24xX3RhZyhjYnMsIHRhZykpIHsKICAgICBpZiAoIUNCU19nZXRfYXNuMShjYnMsIG91dCwgdGFnKSkgewogICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHByZXNlbnQgPSAxOworICAgICpvdXRfcHJlc2VudCA9IDE7CisgIH0gZWxzZSB7CisgICAgKm91dF9wcmVzZW50ID0gMDsKICAgfQotCi0gIGlmIChvdXRfcHJlc2VudCAhPSBOVUxMKSB7Ci0gICAgKm91dF9wcmVzZW50ID0gcHJlc2VudDsKLSAgfQotCiAgIHJldHVybiAxOwogfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2J5dGVzdHJpbmcvaW50ZXJuYWwuaCBiL3NyYy9jcnlwdG8vYnl0ZXN0cmluZy9pbnRlcm5hbC5oCmluZGV4IGI0ZWE3ZTUuLjM5MWFkMTkgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYnl0ZXN0cmluZy9pbnRlcm5hbC5oCisrKyBiL3NyYy9jcnlwdG8vYnl0ZXN0cmluZy9pbnRlcm5hbC5oCkBAIC0zOCw2ICszOCwxNCBAQAogICogSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCiBPUEVOU1NMX0VYUE9SVCBpbnQgQ0JTX2FzbjFfYmVyX3RvX2RlcihDQlMgKmluLCB1aW50OF90ICoqb3V0LCBzaXplX3QgKm91dF9sZW4pOwogCisvKiBDQlNfZ2V0X2FueV9iZXJfYXNuMV9lbGVtZW50IGFjdHMgdGhlIHNhbWUgYXMgfENCU19nZXRfYW55X2FzbjFfZWxlbWVudHwgYnV0CisgKiBhbHNvIGFsbG93cyBpbmRlZmluaXRlLWxlbmd0aCBlbGVtZW50cyB0byBiZSByZXR1cm5lZC4gSW4gdGhhdCBjYXNlLAorICogfCpvdXRfaGVhZGVyX2xlbnwgYW5kIHxDQlNfbGVuKG91dCl8IHdpbGwgYm90aCBiZSB0d28gYXMgb25seSB0aGUgaGVhZGVyIGlzCisgKiByZXR1cm5lZC4gKi8KK09QRU5TU0xfRVhQT1JUIGludCBDQlNfZ2V0X2FueV9iZXJfYXNuMV9lbGVtZW50KENCUyAqY2JzLCBDQlMgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpvdXRfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpvdXRfaGVhZGVyX2xlbik7CisKIAogI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCiB9ICAvKiBleHRlcm4gQyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9jaGFjaGEvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2NoYWNoYS9DTWFrZUxpc3RzLnR4dAppbmRleCAyNjZlODY5Li42YzNmODdlIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2NoYWNoYS9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL2NoYWNoYS9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQogCiBpZiAoJHtBUkNIfSBTVFJFUVVBTCAiYXJtIikKICAgc2V0KApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9jaGFjaGEvY2hhY2hhX3ZlY19hcm0uUyBiL3NyYy9jcnlwdG8vY2hhY2hhL2NoYWNoYV92ZWNfYXJtLlMKaW5kZXggMGY4MjYyNy4uZGRjMzc0ZSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jaGFjaGEvY2hhY2hhX3ZlY19hcm0uUworKysgYi9zcmMvY3J5cHRvL2NoYWNoYS9jaGFjaGFfdmVjX2FybS5TCkBAIC0yMyw3ICsyMyw2IEBACiAjICAgICAvb3B0L2djYy1saW5hcm8tNC45LTIwMTQuMTEteDg2XzY0X2FybS1saW51eC1nbnVlYWJpaGYvYmluL2FybS1saW51eC1nbnVlYWJpaGYtZ2NjIC1PMyAtbWNwdT1jb3J0ZXgtYTggLW1mcHU9bmVvbiAtZnBpYyAtREFTTV9HRU4gLUkgLi4vLi4vaW5jbHVkZSAtUyBjaGFjaGFfdmVjLmMgLW8gLQogCiAjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pCi0jaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9fYWFyY2g2NF9fKQogCiAJLnN5bnRheCB1bmlmaWVkCiAJLmNwdSBjb3J0ZXgtYTgKQEAgLTE0MjQsNSArMTQyMyw0IEBACiAJLmlkZW50CSJHQ0M6IChMaW5hcm8gR0NDIDIwMTQuMTEpIDQuOS4zIDIwMTQxMDMxIChwcmVyZWxlYXNlKSIKIAkuc2VjdGlvbgkubm90ZS5HTlUtc3RhY2ssIiIsJXByb2diaXRzCiAKLSNlbmRpZiAgLyogX19hcm1fXyB8fCBfX2FhcmNoNjRfXyAqLwogI2VuZGlmICAvKiAhT1BFTlNTTF9OT19BU00gKi8KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY2hhY2hhL2NoYWNoYV92ZWNfYXJtX2dlbmVyYXRlLmdvIGIvc3JjL2NyeXB0by9jaGFjaGEvY2hhY2hhX3ZlY19hcm1fZ2VuZXJhdGUuZ28KaW5kZXggNmQxNjdiOS4uZDY4MWU4YSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jaGFjaGEvY2hhY2hhX3ZlY19hcm1fZ2VuZXJhdGUuZ28KKysrIGIvc3JjL2NyeXB0by9jaGFjaGEvY2hhY2hhX3ZlY19hcm1fZ2VuZXJhdGUuZ28KQEAgLTUyLDggKzUyLDcgQEAKIAlvdXRwdXQuV3JpdGVTdHJpbmcoY29tcGlsZXIpCiAJb3V0cHV0LldyaXRlU3RyaW5nKCIgIikKIAlvdXRwdXQuV3JpdGVTdHJpbmcoc3RyaW5ncy5Kb2luKGFyZ3MsICIgIikpCi0Jb3V0cHV0LldyaXRlU3RyaW5nKCJcblxuI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKVxuIikKLQlvdXRwdXQuV3JpdGVTdHJpbmcoIiNpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19hYXJjaDY0X18pXG5cbiIpCisJb3V0cHV0LldyaXRlU3RyaW5nKCJcblxuI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKVxuXG4iKQogCiAJY21kIDo9IGV4ZWMuQ29tbWFuZChjb21waWxlciwgYXJncy4uLikKIAljbWQuU3RkZXJyID0gb3MuU3RkZXJyCkBAIC0xNDUsNiArMTQ0LDUgQEAKIGAKIAogY29uc3QgdHJhaWxlciA9IGAKLSNlbmRpZiAgLyogX19hcm1fXyB8fCBfX2FhcmNoNjRfXyAqLwogI2VuZGlmICAvKiAhT1BFTlNTTF9OT19BU00gKi8KIGAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY2lwaGVyL0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9jaXBoZXIvQ01ha2VMaXN0cy50eHQKaW5kZXggNmI0YzcyOS4uMjc3NTY5OCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jaXBoZXIvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9jaXBoZXIvQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKIAogYWRkX2xpYnJhcnkoCiAgIGNpcGhlcgpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9jaXBoZXIvYWVhZC5jIGIvc3JjL2NyeXB0by9jaXBoZXIvYWVhZC5jCmluZGV4IDdlNzQ3ZjguLjIwZDY5OWQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vY2lwaGVyL2FlYWQuYworKysgYi9zcmMvY3J5cHRvL2NpcGhlci9hZWFkLmMKQEAgLTMwLDE1ICszMCwxMSBAQAogCiBzaXplX3QgRVZQX0FFQURfbWF4X3RhZ19sZW4oY29uc3QgRVZQX0FFQUQgKmFlYWQpIHsgcmV0dXJuIGFlYWQtPm1heF90YWdfbGVuOyB9CiAKLXZvaWQgRVZQX0FFQURfQ1RYX3plcm8oRVZQX0FFQURfQ1RYICpjdHgpIHsKLSAgbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKEVWUF9BRUFEX0NUWCkpOwotfQotCiBpbnQgRVZQX0FFQURfQ1RYX2luaXQoRVZQX0FFQURfQ1RYICpjdHgsIGNvbnN0IEVWUF9BRUFEICphZWFkLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmtleSwgc2l6ZV90IGtleV9sZW4sIHNpemVfdCB0YWdfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIEVOR0lORSAqaW1wbCkgewogICBpZiAoIWFlYWQtPmluaXQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX05PX0RJUkVDVElPTl9TRVQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0FFQURfQ1RYX2luaXQsIENJUEhFUl9SX05PX0RJUkVDVElPTl9TRVQpOwogICAgIGN0eC0+YWVhZCA9IE5VTEw7CiAgICAgcmV0dXJuIDA7CiAgIH0KQEAgLTUxLDcgKzQ3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdGFnX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGV2cF9hZWFkX2RpcmVjdGlvbl90IGRpcikgewogICBpZiAoa2V5X2xlbiAhPSBhZWFkLT5rZXlfbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9VTlNVUFBPUlRFRF9LRVlfU0laRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBFVlBfQUVBRF9DVFhfaW5pdF93aXRoX2RpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfUl9VTlNVUFBPUlRFRF9LRVlfU0laRSk7CiAgICAgY3R4LT5hZWFkID0gTlVMTDsKICAgICByZXR1cm4gMDsKICAgfQpAQCAtMTA0LDEyICsxMDEsMTIgQEAKICAgc2l6ZV90IHBvc3NpYmxlX291dF9sZW4gPSBpbl9sZW4gKyBjdHgtPmFlYWQtPm92ZXJoZWFkOwogCiAgIGlmIChwb3NzaWJsZV9vdXRfbGVuIDwgaW5fbGVuIC8qIG92ZXJmbG93ICovKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0FFQURfQ1RYX3NlYWwsIENJUEhFUl9SX1RPT19MQVJHRSk7CiAgICAgZ290byBlcnJvcjsKICAgfQogCiAgIGlmICghY2hlY2tfYWxpYXMoaW4sIGluX2xlbiwgb3V0KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfT1VUUFVUX0FMSUFTRVNfSU5QVVQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0FFQURfQ1RYX3NlYWwsIENJUEhFUl9SX09VVFBVVF9BTElBU0VTX0lOUFVUKTsKICAgICBnb3RvIGVycm9yOwogICB9CiAKQEAgLTEzMSw3ICsxMjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBub25jZV9sZW4sIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmFkLCBzaXplX3QgYWRfbGVuKSB7CiAgIGlmICghY2hlY2tfYWxpYXMoaW4sIGluX2xlbiwgb3V0KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfT1VUUFVUX0FMSUFTRVNfSU5QVVQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0FFQURfQ1RYX29wZW4sIENJUEhFUl9SX09VVFBVVF9BTElBU0VTX0lOUFVUKTsKICAgICBnb3RvIGVycm9yOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY2lwaGVyL2FlYWRfdGVzdC5jYyBiL3NyYy9jcnlwdG8vY2lwaGVyL2FlYWRfdGVzdC5jYwppbmRleCBiYWFlZTllLi5lNGI3NWQ2IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QuY2MKKysrIGIvc3JjL2NyeXB0by9jaXBoZXIvYWVhZF90ZXN0LmNjCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KIAogI2luY2x1ZGUgIi4uL3Rlc3QvZmlsZV90ZXN0LmgiCi0jaW5jbHVkZSAiLi4vdGVzdC9zY29wZWRfdHlwZXMuaCIKICNpbmNsdWRlICIuLi90ZXN0L3N0bF9jb21wYXQuaCIKIAogCkBAIC0zNiw2ICszNSwxOCBAQAogLy8gICBDVDogNTI5NDI2NWE2MAogLy8gICBUQUc6IDFkNDU3NTg2MjE3NjJlMDYxMzY4ZTY4ODY4ZTJmOTI5CiAKKy8vIEVWUF9BRUFEX0NUWCBsYWNrcyBhIHplcm8gc3RhdGUsIHNvIGl0IGRvZXNuJ3QgZml0IGVhc2lseSBpbnRvCisvLyBTY29wZWRPcGVuU1NMQ29udGV4dC4KK2NsYXNzIEVWUF9BRUFEX0NUWFNjb3BlciB7CisgcHVibGljOgorICBFVlBfQUVBRF9DVFhTY29wZXIoRVZQX0FFQURfQ1RYICpjdHgpIDogY3R4XyhjdHgpIHt9CisgIH5FVlBfQUVBRF9DVFhTY29wZXIoKSB7CisgICAgRVZQX0FFQURfQ1RYX2NsZWFudXAoY3R4Xyk7CisgIH0KKyBwcml2YXRlOgorICBFVlBfQUVBRF9DVFggKmN0eF87Cit9OworCiBzdGF0aWMgYm9vbCBUZXN0QUVBRChGaWxlVGVzdCAqdCwgdm9pZCAqYXJnKSB7CiAgIGNvbnN0IEVWUF9BRUFEICphZWFkID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFVlBfQUVBRCo+KGFyZyk7CiAKQEAgLTQ5LDE5ICs2MCwyMCBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIFNjb3BlZEVWUF9BRUFEX0NUWCBjdHg7Ci0gIGlmICghRVZQX0FFQURfQ1RYX2luaXRfd2l0aF9kaXJlY3Rpb24oY3R4LmdldCgpLCBhZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzc2w6OnZlY3Rvcl9kYXRhKCZrZXkpLCBrZXkuc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5zaXplKCksIGV2cF9hZWFkX3NlYWwpKSB7CisgIEVWUF9BRUFEX0NUWCBjdHg7CisgIGlmICghRVZQX0FFQURfQ1RYX2luaXRfd2l0aF9kaXJlY3Rpb24oJmN0eCwgYWVhZCwgYnNzbDo6dmVjdG9yX2RhdGEoJmtleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LnNpemUoKSwgdGFnLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnBfYWVhZF9zZWFsKSkgewogICAgIHQtPlByaW50TGluZSgiRmFpbGVkIHRvIGluaXQgQUVBRC4iKTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KKyAgRVZQX0FFQURfQ1RYU2NvcGVyIGNsZWFudXAoJmN0eCk7CiAKICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gb3V0KGluLnNpemUoKSArIEVWUF9BRUFEX21heF9vdmVyaGVhZChhZWFkKSk7CiAgIGlmICghdC0+SGFzQXR0cmlidXRlKCJOT19TRUFMIikpIHsKICAgICBzaXplX3Qgb3V0X2xlbjsKLSAgICBpZiAoIUVWUF9BRUFEX0NUWF9zZWFsKGN0eC5nZXQoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJm91dCksICZvdXRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnNpemUoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJm5vbmNlKSwgbm9uY2Uuc2l6ZSgpLAorICAgIGlmICghRVZQX0FFQURfQ1RYX3NlYWwoJmN0eCwgYnNzbDo6dmVjdG9yX2RhdGEoJm91dCksICZvdXRfbGVuLCBvdXQuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNzbDo6dmVjdG9yX2RhdGEoJm5vbmNlKSwgbm9uY2Uuc2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNzbDo6dmVjdG9yX2RhdGEoJmluKSwgaW4uc2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNzbDo6dmVjdG9yX2RhdGEoJmFkKSwgYWQuc2l6ZSgpKSkgewogICAgICAgdC0+UHJpbnRMaW5lKCJGYWlsZWQgdG8gcnVuIEFFQUQuIik7CkBAIC04OSwxNyArMTAxLDE3IEBACiAKICAgLy8gVGhlICJzdGF0ZWZ1bCIgQUVBRHMgZm9yIGltcGxlbWVudGluZyBwcmUtQUVBRCBjaXBoZXIgc3VpdGVzIG5lZWQgdG8gYmUKICAgLy8gcmVzZXQgYWZ0ZXIgZWFjaCBvcGVyYXRpb24uCi0gIGN0eC5SZXNldCgpOwotICBpZiAoIUVWUF9BRUFEX0NUWF9pbml0X3dpdGhfZGlyZWN0aW9uKGN0eC5nZXQoKSwgYWVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic3NsOjp2ZWN0b3JfZGF0YSgma2V5KSwga2V5LnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcuc2l6ZSgpLCBldnBfYWVhZF9vcGVuKSkgeworICBFVlBfQUVBRF9DVFhfY2xlYW51cCgmY3R4KTsKKyAgaWYgKCFFVlBfQUVBRF9DVFhfaW5pdF93aXRoX2RpcmVjdGlvbigmY3R4LCBhZWFkLCBic3NsOjp2ZWN0b3JfZGF0YSgma2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkuc2l6ZSgpLCB0YWcuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2cF9hZWFkX29wZW4pKSB7CiAgICAgdC0+UHJpbnRMaW5lKCJGYWlsZWQgdG8gaW5pdCBBRUFELiIpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCiAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG91dDIob3V0LnNpemUoKSk7CiAgIHNpemVfdCBvdXQyX2xlbjsKLSAgaW50IHJldCA9IEVWUF9BRUFEX0NUWF9vcGVuKGN0eC5nZXQoKSwKKyAgaW50IHJldCA9IEVWUF9BRUFEX0NUWF9vcGVuKCZjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic3NsOjp2ZWN0b3JfZGF0YSgmb3V0MiksICZvdXQyX2xlbiwgb3V0Mi5zaXplKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic3NsOjp2ZWN0b3JfZGF0YSgmbm9uY2UpLCBub25jZS5zaXplKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic3NsOjp2ZWN0b3JfZGF0YSgmb3V0KSwgb3V0LnNpemUoKSwKQEAgLTEyNSwxMCArMTM3LDEwIEBACiAKICAgLy8gVGhlICJzdGF0ZWZ1bCIgQUVBRHMgZm9yIGltcGxlbWVudGluZyBwcmUtQUVBRCBjaXBoZXIgc3VpdGVzIG5lZWQgdG8gYmUKICAgLy8gcmVzZXQgYWZ0ZXIgZWFjaCBvcGVyYXRpb24uCi0gIGN0eC5SZXNldCgpOwotICBpZiAoIUVWUF9BRUFEX0NUWF9pbml0X3dpdGhfZGlyZWN0aW9uKGN0eC5nZXQoKSwgYWVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic3NsOjp2ZWN0b3JfZGF0YSgma2V5KSwga2V5LnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcuc2l6ZSgpLCBldnBfYWVhZF9vcGVuKSkgeworICBFVlBfQUVBRF9DVFhfY2xlYW51cCgmY3R4KTsKKyAgaWYgKCFFVlBfQUVBRF9DVFhfaW5pdF93aXRoX2RpcmVjdGlvbigmY3R4LCBhZWFkLCBic3NsOjp2ZWN0b3JfZGF0YSgma2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkuc2l6ZSgpLCB0YWcuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2cF9hZWFkX29wZW4pKSB7CiAgICAgdC0+UHJpbnRMaW5lKCJGYWlsZWQgdG8gaW5pdCBBRUFELiIpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQpAQCAtMTM2LDggKzE0OCw4IEBACiAgIC8vIEdhcmJhZ2UgYXQgdGhlIGVuZCBpc24ndCBpZ25vcmVkLgogICBvdXQucHVzaF9iYWNrKDApOwogICBvdXQyLnJlc2l6ZShvdXQuc2l6ZSgpKTsKLSAgaWYgKEVWUF9BRUFEX0NUWF9vcGVuKGN0eC5nZXQoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJm91dDIpLCAmb3V0Ml9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXQyLnNpemUoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJm5vbmNlKSwgbm9uY2Uuc2l6ZSgpLAorICBpZiAoRVZQX0FFQURfQ1RYX29wZW4oJmN0eCwgYnNzbDo6dmVjdG9yX2RhdGEoJm91dDIpLCAmb3V0Ml9sZW4sIG91dDIuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgYnNzbDo6dmVjdG9yX2RhdGEoJm5vbmNlKSwgbm9uY2Uuc2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgYnNzbDo6dmVjdG9yX2RhdGEoJm91dCksIG91dC5zaXplKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBic3NsOjp2ZWN0b3JfZGF0YSgmYWQpLCBhZC5zaXplKCkpKSB7CiAgICAgdC0+UHJpbnRMaW5lKCJEZWNyeXB0ZWQgYmFkIGRhdGEgd2l0aCB0cmFpbGluZyBnYXJiYWdlLiIpOwpAQCAtMTQ3LDEwICsxNTksMTAgQEAKIAogICAvLyBUaGUgInN0YXRlZnVsIiBBRUFEcyBmb3IgaW1wbGVtZW50aW5nIHByZS1BRUFEIGNpcGhlciBzdWl0ZXMgbmVlZCB0byBiZQogICAvLyByZXNldCBhZnRlciBlYWNoIG9wZXJhdGlvbi4KLSAgY3R4LlJlc2V0KCk7Ci0gIGlmICghRVZQX0FFQURfQ1RYX2luaXRfd2l0aF9kaXJlY3Rpb24oY3R4LmdldCgpLCBhZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzc2w6OnZlY3Rvcl9kYXRhKCZrZXkpLCBrZXkuc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5zaXplKCksIGV2cF9hZWFkX29wZW4pKSB7CisgIEVWUF9BRUFEX0NUWF9jbGVhbnVwKCZjdHgpOworICBpZiAoIUVWUF9BRUFEX0NUWF9pbml0X3dpdGhfZGlyZWN0aW9uKCZjdHgsIGFlYWQsIGJzc2w6OnZlY3Rvcl9kYXRhKCZrZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleS5zaXplKCksIHRhZy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZwX2FlYWRfb3BlbikpIHsKICAgICB0LT5QcmludExpbmUoIkZhaWxlZCB0byBpbml0IEFFQUQuIik7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CkBAIC0xNTksOCArMTcxLDggQEAKICAgb3V0WzBdIF49IDB4ODA7CiAgIG91dC5yZXNpemUob3V0LnNpemUoKSAtIDEpOwogICBvdXQyLnJlc2l6ZShvdXQuc2l6ZSgpKTsKLSAgaWYgKEVWUF9BRUFEX0NUWF9vcGVuKGN0eC5nZXQoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJm91dDIpLCAmb3V0Ml9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXQyLnNpemUoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJm5vbmNlKSwgbm9uY2Uuc2l6ZSgpLAorICBpZiAoRVZQX0FFQURfQ1RYX29wZW4oJmN0eCwgYnNzbDo6dmVjdG9yX2RhdGEoJm91dDIpLCAmb3V0Ml9sZW4sIG91dDIuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgYnNzbDo6dmVjdG9yX2RhdGEoJm5vbmNlKSwgbm9uY2Uuc2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgYnNzbDo6dmVjdG9yX2RhdGEoJm91dCksIG91dC5zaXplKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBic3NsOjp2ZWN0b3JfZGF0YSgmYWQpLCBhZC5zaXplKCkpKSB7CiAgICAgdC0+UHJpbnRMaW5lKCJEZWNyeXB0ZWQgYmFkIGRhdGEgd2l0aCBjb3JydXB0ZWQgYnl0ZS4iKTsKQEAgLTE4OCw3ICsyMDAsNiBAQAogICAgIGZwcmludGYoc3RkZXJyLCAiQSBzaWxseSB0YWcgbGVuZ3RoIGRpZG4ndCB0cmlnZ2VyIGFuIGVycm9yIVxuIik7CiAgICAgcmV0dXJuIDA7CiAgIH0KLSAgRVJSX2NsZWFyX2Vycm9yKCk7CiAKICAgLyogUnVubmluZyBhIHNlY29uZCwgZmFpbGVkIF9pbml0IHNob3VsZCBub3QgY2F1c2UgYSBtZW1vcnkgbGVhay4gKi8KICAgaWYgKEVWUF9BRUFEX0NUWF9pbml0KCZjdHgsIGFlYWQsIGtleSwga2V5X2xlbiwKQEAgLTE5Nyw3ICsyMDgsNiBAQAogICAgIGZwcmludGYoc3RkZXJyLCAiQSBzaWxseSB0YWcgbGVuZ3RoIGRpZG4ndCB0cmlnZ2VyIGFuIGVycm9yIVxuIik7CiAgICAgcmV0dXJuIDA7CiAgIH0KLSAgRVJSX2NsZWFyX2Vycm9yKCk7CiAKICAgLyogQ2FsbGluZyBfY2xlYW51cCBvbiBhbiB8RVZQX0FFQURfQ1RYfCBhZnRlciBhIGZhaWxlZCBfaW5pdCBzaG91bGQgYmUgYQogICAgKiBuby1vcC4gKi8KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY2lwaGVyL2NpcGhlci5jIGIvc3JjL2NyeXB0by9jaXBoZXIvY2lwaGVyLmMKaW5kZXggNDQwMTg2Ny4uNDAwYzNmNSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jaXBoZXIvY2lwaGVyLmMKKysrIGIvc3JjL2NyeXB0by9jaXBoZXIvY2lwaGVyLmMKQEAgLTY4LDE4ICs2OCwxMiBAQAogCiBjb25zdCBFVlBfQ0lQSEVSICpFVlBfZ2V0X2NpcGhlcmJ5bmlkKGludCBuaWQpIHsKICAgc3dpdGNoIChuaWQpIHsKLSAgICBjYXNlIE5JRF9yYzJfY2JjOgotICAgICAgcmV0dXJuIEVWUF9yYzJfY2JjKCk7Ci0gICAgY2FzZSBOSURfcmMyXzQwX2NiYzoKLSAgICAgIHJldHVybiBFVlBfcmMyXzQwX2NiYygpOwogICAgIGNhc2UgTklEX2Rlc19lZGUzX2NiYzoKICAgICAgIHJldHVybiBFVlBfZGVzX2VkZTNfY2JjKCk7CiAgICAgY2FzZSBOSURfZGVzX2VkZV9jYmM6CiAgICAgICByZXR1cm4gRVZQX2Rlc19jYmMoKTsKICAgICBjYXNlIE5JRF9hZXNfMTI4X2NiYzoKICAgICAgIHJldHVybiBFVlBfYWVzXzEyOF9jYmMoKTsKLSAgICBjYXNlIE5JRF9hZXNfMTkyX2NiYzoKLSAgICAgIHJldHVybiBFVlBfYWVzXzE5Ml9jYmMoKTsKICAgICBjYXNlIE5JRF9hZXNfMjU2X2NiYzoKICAgICAgIHJldHVybiBFVlBfYWVzXzI1Nl9jYmMoKTsKICAgICBkZWZhdWx0OgpAQCAtMTIxLDcgKzExNSw3IEBACiAKIGludCBFVlBfQ0lQSEVSX0NUWF9jb3B5KEVWUF9DSVBIRVJfQ1RYICpvdXQsIGNvbnN0IEVWUF9DSVBIRVJfQ1RYICppbikgewogICBpZiAoaW4gPT0gTlVMTCB8fCBpbi0+Y2lwaGVyID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0lOUFVUX05PVF9JTklUSUFMSVpFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBFVlBfQ0lQSEVSX0NUWF9jb3B5LCBDSVBIRVJfUl9JTlBVVF9OT1RfSU5JVElBTElaRUQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTEzMSw3ICsxMjUsNyBAQAogICBpZiAoaW4tPmNpcGhlcl9kYXRhICYmIGluLT5jaXBoZXItPmN0eF9zaXplKSB7CiAgICAgb3V0LT5jaXBoZXJfZGF0YSA9IE9QRU5TU0xfbWFsbG9jKGluLT5jaXBoZXItPmN0eF9zaXplKTsKICAgICBpZiAoIW91dC0+Y2lwaGVyX2RhdGEpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBFVlBfQ0lQSEVSX0NUWF9jb3B5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgbWVtY3B5KG91dC0+Y2lwaGVyX2RhdGEsIGluLT5jaXBoZXJfZGF0YSwgaW4tPmNpcGhlci0+Y3R4X3NpemUpOwpAQCAtMTcxLDcgKzE2NSw3IEBACiAgICAgICBjdHgtPmNpcGhlcl9kYXRhID0gT1BFTlNTTF9tYWxsb2MoY3R4LT5jaXBoZXItPmN0eF9zaXplKTsKICAgICAgIGlmICghY3R4LT5jaXBoZXJfZGF0YSkgewogICAgICAgICBjdHgtPmNpcGhlciA9IE5VTEw7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIEVWUF9DaXBoZXJJbml0X2V4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICAgIHJldHVybiAwOwogICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC0xODQsMTIgKzE3OCwxMiBAQAogICAgIGlmIChjdHgtPmNpcGhlci0+ZmxhZ3MgJiBFVlBfQ0lQSF9DVFJMX0lOSVQpIHsKICAgICAgIGlmICghRVZQX0NJUEhFUl9DVFhfY3RybChjdHgsIEVWUF9DVFJMX0lOSVQsIDAsIE5VTEwpKSB7CiAgICAgICAgIGN0eC0+Y2lwaGVyID0gTlVMTDsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9JTklUSUFMSVpBVElPTl9FUlJPUik7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0NpcGhlckluaXRfZXgsIENJUEhFUl9SX0lOSVRJQUxJWkFUSU9OX0VSUk9SKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAgICAgfQogICB9IGVsc2UgaWYgKCFjdHgtPmNpcGhlcikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfTk9fQ0lQSEVSX1NFVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBFVlBfQ2lwaGVySW5pdF9leCwgQ0lQSEVSX1JfTk9fQ0lQSEVSX1NFVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMzQ0LDcgKzMzOCw4IEBACiAgIGJsID0gY3R4LT5idWZfbGVuOwogICBpZiAoY3R4LT5mbGFncyAmIEVWUF9DSVBIX05PX1BBRERJTkcpIHsKICAgICBpZiAoYmwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfREFUQV9OT1RfTVVMVElQTEVfT0ZfQkxPQ0tfTEVOR1RIKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0VuY3J5cHRGaW5hbF9leCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX0RBVEFfTk9UX01VTFRJUExFX09GX0JMT0NLX0xFTkdUSCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgKm91dF9sZW4gPSAwOwpAQCAtNDM5LDcgKzQzNCw4IEBACiAgIGIgPSBjdHgtPmNpcGhlci0+YmxvY2tfc2l6ZTsKICAgaWYgKGN0eC0+ZmxhZ3MgJiBFVlBfQ0lQSF9OT19QQURESU5HKSB7CiAgICAgaWYgKGN0eC0+YnVmX2xlbikgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9EQVRBX05PVF9NVUxUSVBMRV9PRl9CTE9DS19MRU5HVEgpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBFVlBfRGVjcnlwdEZpbmFsX2V4LAorICAgICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfREFUQV9OT1RfTVVMVElQTEVfT0ZfQkxPQ0tfTEVOR1RIKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICAqb3V0X2xlbiA9IDA7CkBAIC00NDgsNyArNDQ0LDggQEAKIAogICBpZiAoYiA+IDEpIHsKICAgICBpZiAoY3R4LT5idWZfbGVuIHx8ICFjdHgtPmZpbmFsX3VzZWQpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfV1JPTkdfRklOQUxfQkxPQ0tfTEVOR1RIKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0RlY3J5cHRGaW5hbF9leCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX1dST05HX0ZJTkFMX0JMT0NLX0xFTkdUSCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgYXNzZXJ0KGIgPD0gc2l6ZW9mKGN0eC0+ZmluYWwpKTsKQEAgLTQ1NywxMyArNDU0LDEzIEBACiAgICAgICogT3RoZXJ3aXNlIGl0IHByb3ZpZGVzIGEgcGFkZGluZyBvcmFjbGUuICovCiAgICAgbiA9IGN0eC0+ZmluYWxbYiAtIDFdOwogICAgIGlmIChuID09IDAgfHwgbiA+IChpbnQpYikgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIEVWUF9EZWNyeXB0RmluYWxfZXgsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KIAogICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgIGlmIChjdHgtPmZpbmFsWy0tYl0gIT0gbikgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBFVlBfRGVjcnlwdEZpbmFsX2V4LCBDSVBIRVJfUl9CQURfREVDUllQVCk7CiAgICAgICAgIHJldHVybiAwOwogICAgICAgfQogICAgIH0KQEAgLTU0MSwxOCArNTM4LDE5IEBACiBpbnQgRVZQX0NJUEhFUl9DVFhfY3RybChFVlBfQ0lQSEVSX0NUWCAqY3R4LCBpbnQgY29tbWFuZCwgaW50IGFyZywgdm9pZCAqcHRyKSB7CiAgIGludCByZXQ7CiAgIGlmICghY3R4LT5jaXBoZXIpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX05PX0NJUEhFUl9TRVQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0NJUEhFUl9DVFhfY3RybCwgQ0lQSEVSX1JfTk9fQ0lQSEVSX1NFVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoIWN0eC0+Y2lwaGVyLT5jdHJsKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9DVFJMX05PVF9JTVBMRU1FTlRFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBFVlBfQ0lQSEVSX0NUWF9jdHJsLCBDSVBIRVJfUl9DVFJMX05PVF9JTVBMRU1FTlRFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICByZXQgPSBjdHgtPmNpcGhlci0+Y3RybChjdHgsIGNvbW1hbmQsIGFyZywgcHRyKTsKICAgaWYgKHJldCA9PSAtMSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQ1RSTF9PUEVSQVRJT05fTk9UX0lNUExFTUVOVEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIEVWUF9DSVBIRVJfQ1RYX2N0cmwsCisgICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfQ1RSTF9PUEVSQVRJT05fTk9UX0lNUExFTUVOVEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC01NzQsNyArNTcyLDggQEAKICAgfQogCiAgIGlmIChrZXlfbGVuID09IDAgfHwgIShjLT5jaXBoZXItPmZsYWdzICYgRVZQX0NJUEhfVkFSSUFCTEVfTEVOR1RIKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfSU5WQUxJRF9LRVlfTEVOR1RIKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIEVWUF9DSVBIRVJfQ1RYX3NldF9rZXlfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX0lOVkFMSURfS0VZX0xFTkdUSCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNjMxLDcgKzYzMCw3IEBACiAgICAgcmV0dXJuIEVWUF9yYzQoKTsKICAgfSBlbHNlIGlmIChPUEVOU1NMX3N0cmNhc2VjbXAobmFtZSwgImRlcy1jYmMiKSA9PSAwKSB7CiAgICAgcmV0dXJuIEVWUF9kZXNfY2JjKCk7Ci0gIH0gZWxzZSBpZiAoT1BFTlNTTF9zdHJjYXNlY21wKG5hbWUsICJkZXMtZWRlMy1jYmMiKSA9PSAwIHx8CisgIH0gZWxzZSBpZiAoT1BFTlNTTF9zdHJjYXNlY21wKG5hbWUsICIzZGVzLWNiYyIpID09IDAgfHwKICAgICAgICAgICAgICBPUEVOU1NMX3N0cmNhc2VjbXAobmFtZSwgIjNkZXMiKSA9PSAwKSB7CiAgICAgcmV0dXJuIEVWUF9kZXNfZWRlM19jYmMoKTsKICAgfSBlbHNlIGlmIChPUEVOU1NMX3N0cmNhc2VjbXAobmFtZSwgImFlcy0xMjgtY2JjIikgPT0gMCkgewpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9jaXBoZXIvY2lwaGVyX3Rlc3QuY2MgYi9zcmMvY3J5cHRvL2NpcGhlci9jaXBoZXJfdGVzdC5jYwppbmRleCA1ZjA0MTc4Li45N2E4NGUwIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2NpcGhlci9jaXBoZXJfdGVzdC5jYworKysgYi9zcmMvY3J5cHRvL2NpcGhlci9jaXBoZXJfdGVzdC5jYwpAQCAtNjksMTIgKzY5LDYgQEAKIHN0YXRpYyBjb25zdCBFVlBfQ0lQSEVSICpHZXRDaXBoZXIoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKICAgaWYgKG5hbWUgPT0gIkRFUy1DQkMiKSB7CiAgICAgcmV0dXJuIEVWUF9kZXNfY2JjKCk7Ci0gIH0gZWxzZSBpZiAobmFtZSA9PSAiREVTLUVDQiIpIHsKLSAgICByZXR1cm4gRVZQX2Rlc19lY2IoKTsKLSAgfSBlbHNlIGlmIChuYW1lID09ICJERVMtRURFIikgewotICAgIHJldHVybiBFVlBfZGVzX2VkZSgpOwotICB9IGVsc2UgaWYgKG5hbWUgPT0gIkRFUy1FREUtQ0JDIikgewotICAgIHJldHVybiBFVlBfZGVzX2VkZV9jYmMoKTsKICAgfSBlbHNlIGlmIChuYW1lID09ICJERVMtRURFMy1DQkMiKSB7CiAgICAgcmV0dXJuIEVWUF9kZXNfZWRlM19jYmMoKTsKICAgfSBlbHNlIGlmIChuYW1lID09ICJSQzQiKSB7CkBAIC0xMTAsNyArMTA0LDYgQEAKIHN0YXRpYyBib29sIFRlc3RPcGVyYXRpb24oRmlsZVRlc3QgKnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmNyeXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJml2LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGxhaW50ZXh0LApAQCAtMTY3LDI5ICsxNjAsMTEgQEAKICAgICAgICghYWFkLmVtcHR5KCkgJiYKICAgICAgICAhRVZQX0NpcGhlclVwZGF0ZShjdHguZ2V0KCksIG51bGxwdHIsICZ1bnVzZWQsIGJzc2w6OnZlY3Rvcl9kYXRhKCZhYWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFhZC5zaXplKCkpKSB8fAotICAgICAgIUVWUF9DSVBIRVJfQ1RYX3NldF9wYWRkaW5nKGN0eC5nZXQoKSwgMCkpIHsKLSAgICB0LT5QcmludExpbmUoIk9wZXJhdGlvbiBmYWlsZWQuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChzdHJlYW1pbmcpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluLT5zaXplKCk7IGkrKykgewotICAgICAgdWludDhfdCBjID0gKCppbilbaV07Ci0gICAgICBpbnQgbGVuOwotICAgICAgaWYgKCFFVlBfQ2lwaGVyVXBkYXRlKGN0eC5nZXQoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJnJlc3VsdCkgKyByZXN1bHRfbGVuMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCAmYywgMSkpIHsKLSAgICAgICAgdC0+UHJpbnRMaW5lKCJPcGVyYXRpb24gZmFpbGVkLiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICByZXN1bHRfbGVuMSArPSBsZW47Ci0gICAgfQotICB9IGVsc2UgaWYgKCFpbi0+ZW1wdHkoKSAmJgotICAgICAgICAgICAgICFFVlBfQ2lwaGVyVXBkYXRlKGN0eC5nZXQoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJnJlc3VsdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdF9sZW4xLCBic3NsOjp2ZWN0b3JfZGF0YShpbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4tPnNpemUoKSkpIHsKLSAgICB0LT5QcmludExpbmUoIk9wZXJhdGlvbiBmYWlsZWQuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghRVZQX0NpcGhlckZpbmFsX2V4KGN0eC5nZXQoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJnJlc3VsdCkgKyByZXN1bHRfbGVuMSwKKyAgICAgICFFVlBfQ0lQSEVSX0NUWF9zZXRfcGFkZGluZyhjdHguZ2V0KCksIDApIHx8CisgICAgICAoIWluLT5lbXB0eSgpICYmCisgICAgICAgIUVWUF9DaXBoZXJVcGRhdGUoY3R4LmdldCgpLCBic3NsOjp2ZWN0b3JfZGF0YSgmcmVzdWx0KSwgJnJlc3VsdF9sZW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJzc2w6OnZlY3Rvcl9kYXRhKGluKSwgaW4tPnNpemUoKSkpIHx8CisgICAgICAhRVZQX0NpcGhlckZpbmFsX2V4KGN0eC5nZXQoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJnJlc3VsdCkgKyByZXN1bHRfbGVuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdF9sZW4yKSkgewogICAgIHQtPlByaW50TGluZSgiT3BlcmF0aW9uIGZhaWxlZC4iKTsKICAgICByZXR1cm4gZmFsc2U7CkBAIC0yNjEsMjEgKzIzNiwxNSBAQAogICB9CiAKICAgLy8gQnkgZGVmYXVsdCwgYm90aCBkaXJlY3Rpb25zIGFyZSBydW4sIHVubGVzcyBvdmVycmlkZGVuIGJ5IHRoZSBvcGVyYXRpb24uCi0gIGlmIChvcGVyYXRpb24gIT0ga0RlY3J5cHQpIHsKLSAgICBpZiAoIVRlc3RPcGVyYXRpb24odCwgY2lwaGVyLCB0cnVlIC8qIGVuY3J5cHQgKi8sIGZhbHNlIC8qIHNpbmdsZS1zaG90ICovLAotICAgICAgICAgICAgICAgICAgICAgICBrZXksIGl2LCBwbGFpbnRleHQsIGNpcGhlcnRleHQsIGFhZCwgdGFnKSB8fAotICAgICAgICAhVGVzdE9wZXJhdGlvbih0LCBjaXBoZXIsIHRydWUgLyogZW5jcnlwdCAqLywgdHJ1ZSAvKiBzdHJlYW1pbmcgKi8sIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgaXYsIHBsYWludGV4dCwgY2lwaGVydGV4dCwgYWFkLCB0YWcpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQorICBpZiAob3BlcmF0aW9uICE9IGtEZWNyeXB0ICYmCisgICAgICAhVGVzdE9wZXJhdGlvbih0LCBjaXBoZXIsIHRydWUgLyogZW5jcnlwdCAqLywga2V5LCBpdiwgcGxhaW50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgY2lwaGVydGV4dCwgYWFkLCB0YWcpKSB7CisgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIGlmIChvcGVyYXRpb24gIT0ga0VuY3J5cHQpIHsKLSAgICBpZiAoIVRlc3RPcGVyYXRpb24odCwgY2lwaGVyLCBmYWxzZSAvKiBkZWNyeXB0ICovLCBmYWxzZSAvKiBzaW5nbGUtc2hvdCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAga2V5LCBpdiwgcGxhaW50ZXh0LCBjaXBoZXJ0ZXh0LCBhYWQsIHRhZykgfHwKLSAgICAgICAgIVRlc3RPcGVyYXRpb24odCwgY2lwaGVyLCBmYWxzZSAvKiBkZWNyeXB0ICovLCB0cnVlIC8qIHN0cmVhbWluZyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAga2V5LCBpdiwgcGxhaW50ZXh0LCBjaXBoZXJ0ZXh0LCBhYWQsIHRhZykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CisgIGlmIChvcGVyYXRpb24gIT0ga0VuY3J5cHQgJiYKKyAgICAgICFUZXN0T3BlcmF0aW9uKHQsIGNpcGhlciwgZmFsc2UgLyogZGVjcnlwdCAqLywga2V5LCBpdiwgcGxhaW50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgY2lwaGVydGV4dCwgYWFkLCB0YWcpKSB7CisgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NpcGhlci9lX2Flcy5jIGIvc3JjL2NyeXB0by9jaXBoZXIvZV9hZXMuYwppbmRleCBlODkwNWY2Li40MWQwYWVjIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2NpcGhlci9lX2Flcy5jCisrKyBiL3NyYy9jcnlwdG8vY2lwaGVyL2VfYWVzLmMKQEAgLTY0LDcgKzY0LDcgQEAKICNpbmNsdWRlICIuLi9tb2Rlcy9pbnRlcm5hbC5oIgogCiAjaWYgZGVmaW5lZChPUEVOU1NMX0FSTSkgfHwgZGVmaW5lZChPUEVOU1NMX0FBUkNINjQpCi0jaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorI2luY2x1ZGUgIi4uL2FybV9hcmNoLmgiCiAjZW5kaWYKIAogCkBAIC05OCw2ICs5OCw4IEBACiAjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pICYmIFwKICAgICAoZGVmaW5lZChPUEVOU1NMX1g4Nl82NCkgfHwgZGVmaW5lZChPUEVOU1NMX1g4NikpCiAjZGVmaW5lIFZQQUVTCitleHRlcm4gdW5zaWduZWQgaW50IE9QRU5TU0xfaWEzMmNhcF9QW107CisKIHN0YXRpYyBjaGFyIHZwYWVzX2NhcGFibGUodm9pZCkgewogICByZXR1cm4gKE9QRU5TU0xfaWEzMmNhcF9QWzFdICYgKDEgPDwgKDQxIC0gMzIpKSkgIT0gMDsKIH0KQEAgLTExMSw2ICsxMTMsNyBAQAogCiAjZWxpZiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkgJiYgXAogICAgIChkZWZpbmVkKE9QRU5TU0xfQVJNKSB8fCBkZWZpbmVkKE9QRU5TU0xfQUFSQ0g2NCkpCisjaW5jbHVkZSAiLi4vYXJtX2FyY2guaCIKIAogI2lmIGRlZmluZWQoT1BFTlNTTF9BUk0pICYmIF9fQVJNX01BWF9BUkNIX18gPj0gNwogI2RlZmluZSBCU0FFUwpAQCAtMzM1LDcgKzMzOCw3IEBACiAgIH0KIAogICBpZiAocmV0IDwgMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQUVTX0tFWV9TRVRVUF9GQUlMRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVzX2luaXRfa2V5LCBDSVBIRVJfUl9BRVNfS0VZX1NFVFVQX0ZBSUxFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNzA4LDcgKzcxMSw3IEBACiAgIH0gZWxzZSB7CiAgICAgaWYgKCFjdHgtPmVuY3J5cHQpIHsKICAgICAgIGlmIChnY3R4LT50YWdsZW4gPCAwIHx8Ci0gICAgICAgICAgIUNSWVBUT19nY20xMjhfZmluaXNoKCZnY3R4LT5nY20sIGN0eC0+YnVmLCBnY3R4LT50YWdsZW4pKSB7CisgICAgICAgICAgIUNSWVBUT19nY20xMjhfZmluaXNoKCZnY3R4LT5nY20sIGN0eC0+YnVmLCBnY3R4LT50YWdsZW4pICE9IDApIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgfQogICAgICAgZ2N0eC0+aXZfc2V0ID0gMDsKQEAgLTg1MCw3ICs4NTMsNyBAQAogICB9CiAKICAgaWYgKHJldCA8IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0FFU19LRVlfU0VUVVBfRkFJTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlc25pX2luaXRfa2V5LCBDSVBIRVJfUl9BRVNfS0VZX1NFVFVQX0ZBSUxFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTA2Myw3ICsxMDY2LDcgQEAKICAgY29uc3Qgc2l6ZV90IGtleV9iaXRzID0ga2V5X2xlbiAqIDg7CiAKICAgaWYgKGtleV9iaXRzICE9IDEyOCAmJiBrZXlfYml0cyAhPSAyNTYpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9LRVlfTEVOR1RIKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2djbV9pbml0LCBDSVBIRVJfUl9CQURfS0VZX0xFTkdUSCk7CiAgICAgcmV0dXJuIDA7IC8qIEVWUF9BRUFEX0NUWF9pbml0IHNob3VsZCBjYXRjaCB0aGlzLiAqLwogICB9CiAKQEAgLTEwNzIsNyArMTA3NSw3IEBACiAgIH0KIAogICBpZiAodGFnX2xlbiA+IEVWUF9BRUFEX0FFU19HQ01fVEFHX0xFTikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVEFHX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19nY21faW5pdCwgQ0lQSEVSX1JfVEFHX1RPT19MQVJHRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTEwNSwxMiArMTEwOCwxMiBAQAogICBHQ00xMjhfQ09OVEVYVCBnY207CiAKICAgaWYgKGluX2xlbiArIGdjbV9jdHgtPnRhZ19sZW4gPCBpbl9sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19nY21fc2VhbCwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChtYXhfb3V0X2xlbiA8IGluX2xlbiArIGdjbV9jdHgtPnRhZ19sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JVRkZFUl9UT09fU01BTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfZ2NtX3NlYWwsIENJUEhFUl9SX0JVRkZFUl9UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTExNDksMTQgKzExNTIsMTQgQEAKICAgR0NNMTI4X0NPTlRFWFQgZ2NtOwogCiAgIGlmIChpbl9sZW4gPCBnY21fY3R4LT50YWdfbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19nY21fb3BlbiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgcGxhaW50ZXh0X2xlbiA9IGluX2xlbiAtIGdjbV9jdHgtPnRhZ19sZW47CiAKICAgaWYgKG1heF9vdXRfbGVuIDwgcGxhaW50ZXh0X2xlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19nY21fb3BlbiwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTE4Miw3ICsxMTg1LDcgQEAKIAogICBDUllQVE9fZ2NtMTI4X3RhZygmZ2NtLCB0YWcsIGdjbV9jdHgtPnRhZ19sZW4pOwogICBpZiAoQ1JZUFRPX21lbWNtcCh0YWcsIGluICsgcGxhaW50ZXh0X2xlbiwgZ2NtX2N0eC0+dGFnX2xlbikgIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfZ2NtX29wZW4sIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xMjM2LDcgKzEyMzksNyBAQAogICBjb25zdCBzaXplX3Qga2V5X2JpdHMgPSBrZXlfbGVuICogODsKIAogICBpZiAoa2V5X2JpdHMgIT0gMTI4ICYmIGtleV9iaXRzICE9IDI1NikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQkFEX0tFWV9MRU5HVEgpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfa2V5X3dyYXBfaW5pdCwgQ0lQSEVSX1JfQkFEX0tFWV9MRU5HVEgpOwogICAgIHJldHVybiAwOyAvKiBFVlBfQUVBRF9DVFhfaW5pdCBzaG91bGQgY2F0Y2ggdGhpcy4gKi8KICAgfQogCkBAIC0xMjQ1LDEzICsxMjQ4LDE0IEBACiAgIH0KIAogICBpZiAodGFnX2xlbiAhPSA4KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9VTlNVUFBPUlRFRF9UQUdfU0laRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19rZXlfd3JhcF9pbml0LAorICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX1VOU1VQUE9SVEVEX1RBR19TSVpFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGt3X2N0eCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWVhZF9hZXNfa2V5X3dyYXBfY3R4KSk7CiAgIGlmIChrd19jdHggPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfa2V5X3dyYXBfaW5pdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTEyODksNyArMTI5Myw4IEBACiAgIHVpbnQ4X3QgQVtBRVNfQkxPQ0tfU0laRV07CiAKICAgaWYgKGFkX2xlbiAhPSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9VTlNVUFBPUlRFRF9BRF9TSVpFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2tleV93cmFwX3NlYWwsCisgICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfVU5TVVBQT1JURURfQURfU0laRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTI5OSwxMiArMTMwNCwxNCBAQAogICB9CiAKICAgaWYgKG5vbmNlX2xlbiAhPSA4KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9VTlNVUFBPUlRFRF9OT05DRV9TSVpFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2tleV93cmFwX3NlYWwsCisgICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfVU5TVVBQT1JURURfTk9OQ0VfU0laRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoaW5fbGVuICUgOCAhPSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9VTlNVUFBPUlRFRF9JTlBVVF9TSVpFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2tleV93cmFwX3NlYWwsCisgICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfVU5TVVBQT1JURURfSU5QVVRfU0laRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTMxMywyOSArMTMyMCwzMiBAQAogICAgKiBjb25zZXJ2YXRpdmVseSBjYXAgaXQgdG8gMl4zMi0xNiB0byBzdG9wIDMyLWJpdCBwbGF0Zm9ybXMgY29tcGxhaW5pbmcgdGhhdAogICAgKiBhIGNvbXBhcmlzb24gaXMgYWx3YXlzIHRydWUuICovCiAgIGlmIChpbl9sZW4gPiAweGZmZmZmZmYwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfa2V5X3dyYXBfc2VhbCwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIG4gPSBpbl9sZW4gLyA4OwogCiAgIGlmIChuIDwgMikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVU5TVVBQT1JURURfSU5QVVRfU0laRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19rZXlfd3JhcF9zZWFsLAorICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX1VOU1VQUE9SVEVEX0lOUFVUX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGluX2xlbiArIDggPCBpbl9sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19rZXlfd3JhcF9zZWFsLCBDSVBIRVJfUl9UT09fTEFSR0UpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKG1heF9vdXRfbGVuIDwgaW5fbGVuICsgOCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19rZXlfd3JhcF9zZWFsLAorICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX0JVRkZFUl9UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKEFFU19zZXRfZW5jcnlwdF9rZXkoa3dfY3R4LT5rZXksIGt3X2N0eC0+a2V5X2JpdHMsICZrcy5rcykgPCAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9BRVNfS0VZX1NFVFVQX0ZBSUxFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19rZXlfd3JhcF9zZWFsLAorICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX0FFU19LRVlfU0VUVVBfRkFJTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xMzc4LDcgKzEzODgsOCBAQAogICB1aW50OF90IEFbQUVTX0JMT0NLX1NJWkVdOwogCiAgIGlmIChhZF9sZW4gIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVU5TVVBQT1JURURfQURfU0laRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19rZXlfd3JhcF9vcGVuLAorICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX1VOU1VQUE9SVEVEX0FEX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTEzODgsMTIgKzEzOTksMTQgQEAKICAgfQogCiAgIGlmIChub25jZV9sZW4gIT0gOCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVU5TVVBQT1JURURfTk9OQ0VfU0laRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19rZXlfd3JhcF9vcGVuLAorICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX1VOU1VQUE9SVEVEX05PTkNFX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGluX2xlbiAlIDggIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVU5TVVBQT1JURURfSU5QVVRfU0laRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19rZXlfd3JhcF9vcGVuLAorICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX1VOU1VQUE9SVEVEX0lOUFVUX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTE0MDIsMjQgKzE0MTUsMjYgQEAKICAgICogY29uc2VydmF0aXZlbHkgY2FwIGl0IHRvIDJeMzItOCB0byBzdG9wIDMyLWJpdCBwbGF0Zm9ybXMgY29tcGxhaW5pbmcgdGhhdAogICAgKiBhIGNvbXBhcmlzb24gaXMgYWx3YXlzIHRydWUuICovCiAgIGlmIChpbl9sZW4gPiAweGZmZmZmZmY4KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfa2V5X3dyYXBfb3BlbiwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChpbl9sZW4gPCAyNCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfa2V5X3dyYXBfb3BlbiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgbiA9IChpbl9sZW4gLyA4KSAtIDE7CiAKICAgaWYgKG1heF9vdXRfbGVuIDwgaW5fbGVuIC0gOCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19rZXlfd3JhcF9vcGVuLAorICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX0JVRkZFUl9UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKEFFU19zZXRfZGVjcnlwdF9rZXkoa3dfY3R4LT5rZXksIGt3X2N0eC0+a2V5X2JpdHMsICZrcy5rcykgPCAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9BRVNfS0VZX1NFVFVQX0ZBSUxFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19rZXlfd3JhcF9vcGVuLAorICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX0FFU19LRVlfU0VUVVBfRkFJTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xNDQyLDcgKzE0NTcsNyBAQAogICB9CiAKICAgaWYgKENSWVBUT19tZW1jbXAoQSwgbm9uY2UsIDgpICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2tleV93cmFwX29wZW4sIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xNTI2LDEzICsxNTQxLDE1IEBACiAgIHN0YXRpYyBjb25zdCBzaXplX3QgaG1hY19rZXlfbGVuID0gMzI7CiAKICAgaWYgKGtleV9sZW4gPCBobWFjX2tleV9sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9LRVlfTEVOR1RIKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2N0cl9obWFjX3NoYTI1Nl9pbml0LAorICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX0JBRF9LRVlfTEVOR1RIKTsKICAgICByZXR1cm4gMDsgLyogRVZQX0FFQURfQ1RYX2luaXQgc2hvdWxkIGNhdGNoIHRoaXMuICovCiAgIH0KIAogICBjb25zdCBzaXplX3QgYWVzX2tleV9sZW4gPSBrZXlfbGVuIC0gaG1hY19rZXlfbGVuOwogICBpZiAoYWVzX2tleV9sZW4gIT0gMTYgJiYgYWVzX2tleV9sZW4gIT0gMzIpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9LRVlfTEVOR1RIKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2N0cl9obWFjX3NoYTI1Nl9pbml0LAorICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX0JBRF9LRVlfTEVOR1RIKTsKICAgICByZXR1cm4gMDsgLyogRVZQX0FFQURfQ1RYX2luaXQgc2hvdWxkIGNhdGNoIHRoaXMuICovCiAgIH0KIApAQCAtMTU0MSwxMyArMTU1OCwxNSBAQAogICB9CiAKICAgaWYgKHRhZ19sZW4gPiBFVlBfQUVBRF9BRVNfQ1RSX0hNQUNfU0hBMjU2X1RBR19MRU4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1RBR19UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfY3RyX2htYWNfc2hhMjU2X2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfVEFHX1RPT19MQVJHRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBhZXNfY3R4ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZWFkX2Flc19jdHJfaG1hY19zaGEyNTZfY3R4KSk7CiAgIGlmIChhZXNfY3R4ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2N0cl9obWFjX3NoYTI1Nl9pbml0LAorICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xNjQ3LDE3ICsxNjY2LDIwIEBACiAgIGlmIChpbl9sZW4gKyBhZXNfY3R4LT50YWdfbGVuIDwgaW5fbGVuIHx8CiAgICAgICAvKiBUaGlzIGlucHV0IGlzIHNvIGxhcmdlIGl0IHdvdWxkIG92ZXJmbG93IHRoZSAzMi1iaXQgYmxvY2sgY291bnRlci4gKi8KICAgICAgIGluX2xlbl82NCA+PSAoT1BFTlNTTF9VNjQoMSkgPDwgMzIpICogQUVTX0JMT0NLX1NJWkUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19jdHJfaG1hY19zaGEyNTZfc2VhbCwKKyAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfUl9UT09fTEFSR0UpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKG1heF9vdXRfbGVuIDwgaW5fbGVuICsgYWVzX2N0eC0+dGFnX2xlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19jdHJfaG1hY19zaGEyNTZfc2VhbCwKKyAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChub25jZV9sZW4gIT0gRVZQX0FFQURfQUVTX0NUUl9ITUFDX1NIQTI1Nl9OT05DRV9MRU4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1VOU1VQUE9SVEVEX05PTkNFX1NJWkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfY3RyX2htYWNfc2hhMjU2X3NlYWwsCisgICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfVU5TVVBQT1JURURfTk9OQ0VfU0laRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTY4MSwxOSArMTcwMywyMiBAQAogICBzaXplX3QgcGxhaW50ZXh0X2xlbjsKIAogICBpZiAoaW5fbGVuIDwgYWVzX2N0eC0+dGFnX2xlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfY3RyX2htYWNfc2hhMjU2X29wZW4sCisgICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgcGxhaW50ZXh0X2xlbiA9IGluX2xlbiAtIGFlc19jdHgtPnRhZ19sZW47CiAKICAgaWYgKG1heF9vdXRfbGVuIDwgcGxhaW50ZXh0X2xlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19jdHJfaG1hY19zaGEyNTZfb3BlbiwKKyAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChub25jZV9sZW4gIT0gRVZQX0FFQURfQUVTX0NUUl9ITUFDX1NIQTI1Nl9OT05DRV9MRU4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1VOU1VQUE9SVEVEX05PTkNFX1NJWkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfY3RyX2htYWNfc2hhMjU2X29wZW4sCisgICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfVU5TVVBQT1JURURfTk9OQ0VfU0laRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTcwMiw3ICsxNzI3LDggQEAKICAgICAgICAgICAgICAgICAgJmFlc19jdHgtPm91dGVyX2luaXRfc3RhdGUsIGFkLCBhZF9sZW4sIG5vbmNlLCBpbiwKICAgICAgICAgICAgICAgICAgcGxhaW50ZXh0X2xlbik7CiAgIGlmIChDUllQVE9fbWVtY21wKGhtYWNfcmVzdWx0LCBpbiArIHBsYWludGV4dF9sZW4sIGFlc19jdHgtPnRhZ19sZW4pICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2N0cl9obWFjX3NoYTI1Nl9vcGVuLAorICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKICAgICByZXR1cm4gMDsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NpcGhlci9lX2NoYWNoYTIwcG9seTEzMDUuYyBiL3NyYy9jcnlwdG8vY2lwaGVyL2VfY2hhY2hhMjBwb2x5MTMwNS5jCmluZGV4IDlkZGExYjAuLmViZjAwODggMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vY2lwaGVyL2VfY2hhY2hhMjBwb2x5MTMwNS5jCisrKyBiL3NyYy9jcnlwdG8vY2lwaGVyL2VfY2hhY2hhMjBwb2x5MTMwNS5jCkBAIC00Miw3ICs0Miw3IEBACiAgIH0KIAogICBpZiAodGFnX2xlbiA+IFBPTFkxMzA1X1RBR19MRU4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2NoYWNoYTIwX3BvbHkxMzA1X2luaXQsIENJUEhFUl9SX1RPT19MQVJHRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTA3LDIyICsxMDcsMjMgQEAKICAgICogQ2FzdGluZyB0byB1aW50NjRfdCBpbnNpZGUgdGhlIGNvbmRpdGlvbmFsIGlzIG5vdCBzdWZmaWNpZW50IHRvIHN0b3AKICAgICogdGhlIHdhcm5pbmcuICovCiAgIGlmIChpbl9sZW5fNjQgPj0gKDF1bGwgPDwgMzIpICogNjQgLSA2NCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfY2hhY2hhMjBfcG9seTEzMDVfc2VhbCwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChpbl9sZW4gKyBjMjBfY3R4LT50YWdfbGVuIDwgaW5fbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9jaGFjaGEyMF9wb2x5MTMwNV9zZWFsLCBDSVBIRVJfUl9UT09fTEFSR0UpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKG1heF9vdXRfbGVuIDwgaW5fbGVuICsgYzIwX2N0eC0+dGFnX2xlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2NoYWNoYTIwX3BvbHkxMzA1X3NlYWwsCisgICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAobm9uY2VfbGVuICE9IENIQUNIQTIwX05PTkNFX0xFTikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfSVZfVE9PX0xBUkdFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfY2hhY2hhMjBfcG9seTEzMDVfc2VhbCwgQ0lQSEVSX1JfSVZfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xNTUsNyArMTU2LDcgQEAKICAgY29uc3QgdWludDY0X3QgaW5fbGVuXzY0ID0gaW5fbGVuOwogCiAgIGlmIChpbl9sZW4gPCBjMjBfY3R4LT50YWdfbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2NoYWNoYTIwX3BvbHkxMzA1X29wZW4sIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xNjcsMTkgKzE2OCwyMCBAQAogICAgKiBDYXN0aW5nIHRvIHVpbnQ2NF90IGluc2lkZSB0aGUgY29uZGl0aW9uYWwgaXMgbm90IHN1ZmZpY2llbnQgdG8gc3RvcAogICAgKiB0aGUgd2FybmluZy4gKi8KICAgaWYgKGluX2xlbl82NCA+PSAoMXVsbCA8PCAzMikgKiA2NCAtIDY0KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9jaGFjaGEyMF9wb2x5MTMwNV9vcGVuLCBDSVBIRVJfUl9UT09fTEFSR0UpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKG5vbmNlX2xlbiAhPSBDSEFDSEEyMF9OT05DRV9MRU4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0lWX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2NoYWNoYTIwX3BvbHkxMzA1X29wZW4sIENJUEhFUl9SX0lWX1RPT19MQVJHRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBwbGFpbnRleHRfbGVuID0gaW5fbGVuIC0gYzIwX2N0eC0+dGFnX2xlbjsKIAogICBpZiAobWF4X291dF9sZW4gPCBwbGFpbnRleHRfbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfY2hhY2hhMjBfcG9seTEzMDVfb3BlbiwKKyAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xOTMsNyArMTk1LDcgQEAKICAgQ1JZUFRPX3BvbHkxMzA1X2ZpbmlzaCgmcG9seTEzMDUsIG1hYyk7CiAKICAgaWYgKENSWVBUT19tZW1jbXAobWFjLCBpbiArIHBsYWludGV4dF9sZW4sIGMyMF9jdHgtPnRhZ19sZW4pICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfY2hhY2hhMjBfcG9seTEzMDVfb3BlbiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOwogICAgIHJldHVybiAwOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY2lwaGVyL2VfZGVzLmMgYi9zcmMvY3J5cHRvL2NpcGhlci9lX2Rlcy5jCmluZGV4IGIxZDMxMmMuLjc0ZTFmY2UgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vY2lwaGVyL2VfZGVzLmMKKysrIGIvc3JjL2NyeXB0by9jaXBoZXIvZV9kZXMuYwpAQCAtOTYsMzEgKzk2LDYgQEAKIGNvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfY2JjKHZvaWQpIHsgcmV0dXJuICZkZXNfY2JjOyB9CiAKIAotc3RhdGljIGludCBkZXNfZWNiX2NpcGhlcihFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1aW50OF90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5fbGVuKSB7Ci0gIGlmIChpbl9sZW4gPCBjdHgtPmNpcGhlci0+YmxvY2tfc2l6ZSkgewotICAgIHJldHVybiAxOwotICB9Ci0gIGluX2xlbiAtPSBjdHgtPmNpcGhlci0+YmxvY2tfc2l6ZTsKLQotICBFVlBfREVTX0tFWSAqZGF0ID0gKEVWUF9ERVNfS0VZICopIGN0eC0+Y2lwaGVyX2RhdGE7Ci0gIHNpemVfdCBpOwotICBmb3IgKGkgPSAwOyBpIDw9IGluX2xlbjsgaSArPSBjdHgtPmNpcGhlci0+YmxvY2tfc2l6ZSkgewotICAgIERFU19lY2JfZW5jcnlwdCgoREVTX2NibG9jayAqKSAoaW4gKyBpKSwgKERFU19jYmxvY2sgKikgKG91dCArIGkpLAotICAgICAgICAgICAgICAgICAgICAmZGF0LT5rcy5rcywgY3R4LT5lbmNyeXB0KTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGNvbnN0IEVWUF9DSVBIRVIgZGVzX2VjYiA9IHsKLSAgICBOSURfZGVzX2VjYiwgICAgICAgICA4IC8qIGJsb2NrX3NpemUgKi8sICA4IC8qIGtleV9zaXplICovLAotICAgIDAgLyogaXZfbGVuICovLCAgICAgIHNpemVvZihFVlBfREVTX0tFWSksIEVWUF9DSVBIX0VDQl9NT0RFLAotICAgIE5VTEwgLyogYXBwX2RhdGEgKi8sIGRlc19pbml0X2tleSwgICAgICAgIGRlc19lY2JfY2lwaGVyLAotICAgIE5VTEwgLyogY2xlYW51cCAqLywgIE5VTEwgLyogY3RybCAqLywgfTsKLQotY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc19lY2Iodm9pZCkgeyByZXR1cm4gJmRlc19lY2I7IH0KLQotCiB0eXBlZGVmIHN0cnVjdCB7CiAgIHVuaW9uIHsKICAgICBkb3VibGUgYWxpZ247CkBAIC0xNTEsNTcgKzEyNiwxMCBAQAogICByZXR1cm4gMTsKIH0KIAotc3RhdGljIGNvbnN0IEVWUF9DSVBIRVIgZGVzX2VkZTNfY2JjID0gewotICAgIE5JRF9kZXNfZWRlM19jYmMsICAgIDggLyogYmxvY2tfc2l6ZSAqLywgIDI0IC8qIGtleV9zaXplICovLAorc3RhdGljIGNvbnN0IEVWUF9DSVBIRVIgZGVzM19jYmMgPSB7CisgICAgTklEX2Rlc19jYmMsICAgICAgICAgOCAvKiBibG9ja19zaXplICovLCAgMjQgLyoga2V5X3NpemUgKi8sCiAgICAgOCAvKiBpdl9sZW4gKi8sICAgICAgc2l6ZW9mKERFU19FREVfS0VZKSwgRVZQX0NJUEhfQ0JDX01PREUsCiAgICAgTlVMTCAvKiBhcHBfZGF0YSAqLywgZGVzX2VkZTNfaW5pdF9rZXksICAgZGVzX2VkZTNfY2JjX2NpcGhlciwKICAgICBOVUxMIC8qIGNsZWFudXAgKi8sICBOVUxMIC8qIGN0cmwgKi8sIH07CiAKLWNvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfZWRlM19jYmModm9pZCkgeyByZXR1cm4gJmRlc19lZGUzX2NiYzsgfQotCi0KLXN0YXRpYyBpbnQgZGVzX2VkZV9pbml0X2tleShFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1aW50OF90ICprZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKml2LCBpbnQgZW5jKSB7Ci0gIERFU19jYmxvY2sgKmRlc2tleSA9IChERVNfY2Jsb2NrICopIGtleTsKLSAgREVTX0VERV9LRVkgKmRhdCA9IChERVNfRURFX0tFWSAqKSBjdHgtPmNpcGhlcl9kYXRhOwotCi0gIERFU19zZXRfa2V5KCZkZXNrZXlbMF0sICZkYXQtPmtzLmtzWzBdKTsKLSAgREVTX3NldF9rZXkoJmRlc2tleVsxXSwgJmRhdC0+a3Mua3NbMV0pOwotICBERVNfc2V0X2tleSgmZGVza2V5WzBdLCAmZGF0LT5rcy5rc1syXSk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIGRlc19lZGVfY2JjID0gewotICAgIE5JRF9kZXNfZWRlX2NiYywgICAgIDggLyogYmxvY2tfc2l6ZSAqLywgIDE2IC8qIGtleV9zaXplICovLAotICAgIDggLyogaXZfbGVuICovLCAgICAgIHNpemVvZihERVNfRURFX0tFWSksIEVWUF9DSVBIX0NCQ19NT0RFLAotICAgIE5VTEwgLyogYXBwX2RhdGEgKi8sIGRlc19lZGVfaW5pdF9rZXkgLCAgIGRlc19lZGUzX2NiY19jaXBoZXIsCi0gICAgTlVMTCAvKiBjbGVhbnVwICovLCAgTlVMTCAvKiBjdHJsICovLCB9OwotCi1jb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZV9jYmModm9pZCkgeyByZXR1cm4gJmRlc19lZGVfY2JjOyB9Ci0KLQotc3RhdGljIGludCBkZXNfZWRlX2VjYl9jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdWludDhfdCAqb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbl9sZW4pIHsKLSAgaWYgKGluX2xlbiA8IGN0eC0+Y2lwaGVyLT5ibG9ja19zaXplKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgaW5fbGVuIC09IGN0eC0+Y2lwaGVyLT5ibG9ja19zaXplOwotCi0gIERFU19FREVfS0VZICpkYXQgPSAoREVTX0VERV9LRVkgKikgY3R4LT5jaXBoZXJfZGF0YTsKLSAgc2l6ZV90IGk7Ci0gIGZvciAoaSA9IDA7IGkgPD0gaW5fbGVuOyBpICs9IGN0eC0+Y2lwaGVyLT5ibG9ja19zaXplKSB7Ci0gICAgREVTX2VjYjNfZW5jcnlwdCgoREVTX2NibG9jayAqKSAoaW4gKyBpKSwgKERFU19jYmxvY2sgKikgKG91dCArIGkpLAotICAgICAgICAgICAgICAgICAgICAgJmRhdC0+a3Mua3NbMF0sICZkYXQtPmtzLmtzWzFdLCAmZGF0LT5rcy5rc1syXSwKLSAgICAgICAgICAgICAgICAgICAgIGN0eC0+ZW5jcnlwdCk7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIGRlc19lZGVfZWNiID0gewotICAgIE5JRF9kZXNfZWRlX2NiYywgICAgIDggLyogYmxvY2tfc2l6ZSAqLywgIDE2IC8qIGtleV9zaXplICovLAotICAgIDAgLyogaXZfbGVuICovLCAgICAgIHNpemVvZihERVNfRURFX0tFWSksIEVWUF9DSVBIX0VDQl9NT0RFLAotICAgIE5VTEwgLyogYXBwX2RhdGEgKi8sIGRlc19lZGVfaW5pdF9rZXkgLCAgIGRlc19lZGVfZWNiX2NpcGhlciwKLSAgICBOVUxMIC8qIGNsZWFudXAgKi8sICBOVUxMIC8qIGN0cmwgKi8sIH07Ci0KLWNvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfZWRlKHZvaWQpIHsgcmV0dXJuICZkZXNfZWRlX2VjYjsgfQorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc19lZGUzX2NiYyh2b2lkKSB7IHJldHVybiAmZGVzM19jYmM7IH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY2lwaGVyL2VfcmMyLmMgYi9zcmMvY3J5cHRvL2NpcGhlci9lX3JjMi5jCmluZGV4IDhjYTdiYmEuLmM5MGFiOTMgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vY2lwaGVyL2VfcmMyLmMKKysrIGIvc3JjL2NyeXB0by9jaXBoZXIvZV9yYzIuYwpAQCAtMzk1LDE4ICszOTUsMTMgQEAKICAgICBjYXNlIEVWUF9DVFJMX0lOSVQ6CiAgICAgICBrZXktPmtleV9iaXRzID0gRVZQX0NJUEhFUl9DVFhfa2V5X2xlbmd0aChjdHgpICogODsKICAgICAgIHJldHVybiAxOwotICAgIGNhc2UgRVZQX0NUUkxfU0VUX1JDMl9LRVlfQklUUzoKLSAgICAgIC8qIFNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IGxhdGVyIGNhbGwgdG8gfEVWUF9DVFJMX0lOSVR8LCBidXQKLSAgICAgICAqIHBlb3BsZSBjYWxsIGl0LCBzbyBpdCBtYXkgYXMgd2VsbCB3b3JrLiAqLwotICAgICAga2V5LT5rZXlfYml0cyA9IGFyZzsKLSAgICAgIHJldHVybiAxOwogCiAgICAgZGVmYXVsdDoKICAgICAgIHJldHVybiAtMTsKICAgfQogfQogCi1zdGF0aWMgY29uc3QgRVZQX0NJUEhFUiByYzJfNDBfY2JjID0geworc3RhdGljIGNvbnN0IEVWUF9DSVBIRVIgcmMyXzQwX2NiY19jaXBoZXIgPSB7CiAgICAgTklEX3JjMl80MF9jYmMsCiAgICAgOCAvKiBibG9jayBzaXplICovLAogICAgIDUgLyogNDAgYml0ICovLApAQCAtNDIxLDIzICs0MTYsNSBAQAogfTsKIAogY29uc3QgRVZQX0NJUEhFUiAqRVZQX3JjMl80MF9jYmModm9pZCkgewotICByZXR1cm4gJnJjMl80MF9jYmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIHJjMl9jYmMgPSB7Ci0gICAgTklEX3JjMl9jYmMsCi0gICAgOCAvKiBibG9jayBzaXplICovLAotICAgIDE2IC8qIDEyOCBiaXQgKi8sCi0gICAgOCAvKiBpdiBsZW4gKi8sCi0gICAgc2l6ZW9mKEVWUF9SQzJfS0VZKSwKLSAgICBFVlBfQ0lQSF9DQkNfTU9ERSB8IEVWUF9DSVBIX1ZBUklBQkxFX0xFTkdUSCB8IEVWUF9DSVBIX0NUUkxfSU5JVCwKLSAgICBOVUxMIC8qIGFwcF9kYXRhICovLAotICAgIHJjMl9pbml0X2tleSwKLSAgICByYzJfY2JjX2NpcGhlciwKLSAgICBOVUxMLAotICAgIHJjMl9jdHJsLAotfTsKLQotY29uc3QgRVZQX0NJUEhFUiAqRVZQX3JjMl9jYmModm9pZCkgewotICByZXR1cm4gJnJjMl9jYmM7CisgIHJldHVybiAmcmMyXzQwX2NiY19jaXBoZXI7CiB9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NpcGhlci9lX3JjNC5jIGIvc3JjL2NyeXB0by9jaXBoZXIvZV9yYzQuYwppbmRleCBlMDViOWZkLi44MGRlYTM2IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2NpcGhlci9lX3JjNC5jCisrKyBiL3NyYy9jcnlwdG8vY2lwaGVyL2VfcmM0LmMKQEAgLTExNSwyMCArMTE1LDIwIEBACiAgIH0KIAogICBpZiAodGFnX2xlbiA+IE1ENV9ESUdFU1RfTEVOR1RIKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9yYzRfbWQ1X3Rsc19pbml0LCBDSVBIRVJfUl9UT09fTEFSR0UpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgLyogVGhlIGtleXMgY29uc2lzdHMgb2YgfE1ENV9ESUdFU1RfTEVOR1RIfCBieXRlcyBvZiBITUFDKE1ENSkga2V5IGZvbGxvd2VkCiAgICAqIGJ5IHNvbWUgbnVtYmVyIG9mIGJ5dGVzIG9mIFJDNCBrZXkuICovCiAgIGlmIChrZXlfbGVuIDw9IE1ENV9ESUdFU1RfTEVOR1RIKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CQURfS0VZX0xFTkdUSCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3JjNF9tZDVfdGxzX2luaXQsIENJUEhFUl9SX0JBRF9LRVlfTEVOR1RIKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIHJjNF9jdHggPSBPUEVOU1NMX21hbGxvYyhzaXplb2Yoc3RydWN0IGFlYWRfcmM0X21kNV90bHNfY3R4KSk7CiAgIGlmIChyYzRfY3R4ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfcmM0X21kNV90bHNfaW5pdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiAwOwogICB9CiAgIG1lbXNldChyYzRfY3R4LCAwLCBzaXplb2Yoc3RydWN0IGFlYWRfcmM0X21kNV90bHNfY3R4KSk7CkBAIC0xODUsMjIgKzE4NSwyMiBAQAogICB1aW50OF90IGRpZ2VzdFtNRDVfRElHRVNUX0xFTkdUSF07CiAKICAgaWYgKGluX2xlbiArIHJjNF9jdHgtPnRhZ19sZW4gPCBpbl9sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3JjNF9tZDVfdGxzX3NlYWwsIENJUEhFUl9SX1RPT19MQVJHRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAobm9uY2VfbGVuICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0lWX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3JjNF9tZDVfdGxzX3NlYWwsIENJUEhFUl9SX0lWX1RPT19MQVJHRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAobWF4X291dF9sZW4gPCBpbl9sZW4gKyByYzRfY3R4LT50YWdfbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfcmM0X21kNV90bHNfc2VhbCwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAobm9uY2VfbGVuICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3JjNF9tZDVfdGxzX3NlYWwsIENJUEhFUl9SX1RPT19MQVJHRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjg4LDIxICsyODgsMjEgQEAKICAgdWludDhfdCBkaWdlc3RbTUQ1X0RJR0VTVF9MRU5HVEhdOwogCiAgIGlmIChpbl9sZW4gPCByYzRfY3R4LT50YWdfbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3JjNF9tZDVfdGxzX29wZW4sIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIHBsYWludGV4dF9sZW4gPSBpbl9sZW4gLSByYzRfY3R4LT50YWdfbGVuOwogCiAgIGlmIChub25jZV9sZW4gIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfcmM0X21kNV90bHNfb3BlbiwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChtYXhfb3V0X2xlbiA8IGluX2xlbikgewogICAgIC8qIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgY2FsbGVyIHByb3ZpZGUgc3BhY2UgZm9yIHRoZSBNQUMsIGV2ZW4gdGhvdWdoIGl0CiAgICAgICogd2lsbCBhbHdheXMgYmUgcmVtb3ZlZCBvbiByZXR1cm4uICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfcmM0X21kNV90bHNfb3BlbiwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMzY2LDcgKzM2Niw3IEBACiAgIE1ENV9GaW5hbChkaWdlc3QsICZtZCk7CiAKICAgaWYgKENSWVBUT19tZW1jbXAob3V0ICsgcGxhaW50ZXh0X2xlbiwgZGlnZXN0LCByYzRfY3R4LT50YWdfbGVuKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9yYzRfbWQ1X3Rsc19vcGVuLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9jaXBoZXIvZV9zc2wzLmMgYi9zcmMvY3J5cHRvL2NpcGhlci9lX3NzbDMuYwppbmRleCAzODljNTJmLi4xMDMxZDliIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2NpcGhlci9lX3NzbDMuYworKysgYi9zcmMvY3J5cHRvL2NpcGhlci9lX3NzbDMuYwpAQCAtODUsMTIgKzg1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwgY29uc3QgRVZQX01EICptZCkgewogICBpZiAodGFnX2xlbiAhPSBFVlBfQUVBRF9ERUZBVUxUX1RBR19MRU5HVEggJiYKICAgICAgIHRhZ19sZW4gIT0gRVZQX01EX3NpemUobWQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9VTlNVUFBPUlRFRF9UQUdfU0laRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3NzbDNfaW5pdCwgQ0lQSEVSX1JfVU5TVVBQT1JURURfVEFHX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGtleV9sZW4gIT0gRVZQX0FFQURfa2V5X2xlbmd0aChjdHgtPmFlYWQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CQURfS0VZX0xFTkdUSCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3NzbDNfaW5pdCwgQ0lQSEVSX1JfQkFEX0tFWV9MRU5HVEgpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTEwMiw3ICsxMDIsNyBAQAogCiAgIEFFQURfU1NMM19DVFggKnNzbDNfY3R4ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEFFQURfU1NMM19DVFgpKTsKICAgaWYgKHNzbDNfY3R4ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfc3NsM19pbml0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgRVZQX0NJUEhFUl9DVFhfaW5pdCgmc3NsM19jdHgtPmNpcGhlcl9jdHgpOwpAQCAtMTMzLDI5ICsxMzMsMjkgQEAKIAogICBpZiAoIXNzbDNfY3R4LT5jaXBoZXJfY3R4LmVuY3J5cHQpIHsKICAgICAvKiBVbmxpa2UgYSBub3JtYWwgQUVBRCwgYW4gU1NMMyBBRUFEIG1heSBvbmx5IGJlIHVzZWQgaW4gb25lIGRpcmVjdGlvbi4gKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfc3NsM19zZWFsLCBDSVBIRVJfUl9JTlZBTElEX09QRVJBVElPTik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoaW5fbGVuICsgRVZQX0FFQURfbWF4X292ZXJoZWFkKGN0eC0+YWVhZCkgPCBpbl9sZW4gfHwKICAgICAgIGluX2xlbiA+IElOVF9NQVgpIHsKICAgICAvKiBFVlBfQ0lQSEVSIHRha2VzIGludCBhcyBpbnB1dC4gKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3NzbDNfc2VhbCwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChtYXhfb3V0X2xlbiA8IGluX2xlbiArIEVWUF9BRUFEX21heF9vdmVyaGVhZChjdHgtPmFlYWQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfc3NsM19zZWFsLCBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChub25jZV9sZW4gIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfSVZfVE9PX0xBUkdFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfc3NsM19zZWFsLCBDSVBIRVJfUl9JVl9UT09fTEFSR0UpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGFkX2xlbiAhPSAxMSAtIDIgLyogbGVuZ3RoIGJ5dGVzICovKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9JTlZBTElEX0FEX1NJWkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9zc2wzX3NlYWwsIENJUEhFUl9SX0lOVkFMSURfQURfU0laRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjE3LDM2ICsyMTcsMzYgQEAKIAogICBpZiAoc3NsM19jdHgtPmNpcGhlcl9jdHguZW5jcnlwdCkgewogICAgIC8qIFVubGlrZSBhIG5vcm1hbCBBRUFELCBhbiBTU0wzIEFFQUQgbWF5IG9ubHkgYmUgdXNlZCBpbiBvbmUgZGlyZWN0aW9uLiAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9zc2wzX29wZW4sIENJUEhFUl9SX0lOVkFMSURfT1BFUkFUSU9OKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIHNpemVfdCBtYWNfbGVuID0gRVZQX01EX0NUWF9zaXplKCZzc2wzX2N0eC0+bWRfY3R4KTsKICAgaWYgKGluX2xlbiA8IG1hY19sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfc3NsM19vcGVuLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAobWF4X291dF9sZW4gPCBpbl9sZW4pIHsKICAgICAvKiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIGNhbGxlciBwcm92aWRlIHNwYWNlIGZvciB0aGUgTUFDLCBldmVuIHRob3VnaCBpdAogICAgICAqIHdpbGwgYWx3YXlzIGJlIHJlbW92ZWQgb24gcmV0dXJuLiAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3NzbDNfb3BlbiwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAobm9uY2VfbGVuICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3NzbDNfb3BlbiwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChhZF9sZW4gIT0gMTEgLSAyIC8qIGxlbmd0aCBieXRlcyAqLykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfSU5WQUxJRF9BRF9TSVpFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfc3NsM19vcGVuLCBDSVBIRVJfUl9JTlZBTElEX0FEX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGluX2xlbiA+IElOVF9NQVgpIHsKICAgICAvKiBFVlBfQ0lQSEVSIHRha2VzIGludCBhcyBpbnB1dC4gKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3NzbDNfb3BlbiwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0yNzAsMTIgKzI3MCwxMiBAQAogICBpZiAoRVZQX0NJUEhFUl9DVFhfbW9kZSgmc3NsM19jdHgtPmNpcGhlcl9jdHgpID09IEVWUF9DSVBIX0NCQ19NT0RFKSB7CiAgICAgdW5zaWduZWQgcGFkZGluZ19sZW5ndGggPSBvdXRbdG90YWwgLSAxXTsKICAgICBpZiAodG90YWwgPCBwYWRkaW5nX2xlbmd0aCArIDEgKyBtYWNfbGVuKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9zc2wzX29wZW4sIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICAvKiBUaGUgcGFkZGluZyBtdXN0IGJlIG1pbmltYWwuICovCiAgICAgaWYgKHBhZGRpbmdfbGVuZ3RoICsgMSA+IEVWUF9DSVBIRVJfQ1RYX2Jsb2NrX3NpemUoJnNzbDNfY3R4LT5jaXBoZXJfY3R4KSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfc3NsM19vcGVuLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgZGF0YV9sZW4gPSB0b3RhbCAtIHBhZGRpbmdfbGVuZ3RoIC0gMSAtIG1hY19sZW47CkBAIC0yODksNyArMjg5LDcgQEAKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoQ1JZUFRPX21lbWNtcCgmb3V0W2RhdGFfbGVuXSwgbWFjLCBtYWNfbGVuKSAhPSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3NzbDNfb3BlbiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTM0MCwxMyArMzQwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9zaGExKCkpOwogfQogCi1zdGF0aWMgaW50IGFlYWRfbnVsbF9zaGExX3NzbDNfaW5pdChFVlBfQUVBRF9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGtleV9sZW4sIHNpemVfdCB0YWdfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBldnBfYWVhZF9kaXJlY3Rpb25fdCBkaXIpIHsKLSAgcmV0dXJuIGFlYWRfc3NsM19pbml0KGN0eCwga2V5LCBrZXlfbGVuLCB0YWdfbGVuLCBkaXIsIEVWUF9lbmNfbnVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgRVZQX3NoYTEoKSk7Ci19Ci0KIHN0YXRpYyBjb25zdCBFVlBfQUVBRCBhZWFkX3JjNF9tZDVfc3NsMyA9IHsKICAgICBNRDVfRElHRVNUX0xFTkdUSCArIDE2LCAvKiBrZXkgbGVuIChNRDUgKyBSQzQpICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogbm9uY2UgbGVuICovCkBAIC00MTIsMTkgKzQwNSw2IEBACiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXRfcmM0X3N0YXRlICovCiB9OwogCi1zdGF0aWMgY29uc3QgRVZQX0FFQUQgYWVhZF9udWxsX3NoYTFfc3NsMyA9IHsKLSAgICBTSEFfRElHRVNUX0xFTkdUSCwgICAgICAgICAgLyoga2V5IGxlbiAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub25jZSBsZW4gKi8KLSAgICBTSEFfRElHRVNUX0xFTkdUSCwgICAgICAgICAgLyogb3ZlcmhlYWQgKFNIQTEpICovCi0gICAgU0hBX0RJR0VTVF9MRU5HVEgsICAgICAgICAgIC8qIG1heCB0YWcgbGVuZ3RoICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgKi8KLSAgICBhZWFkX251bGxfc2hhMV9zc2wzX2luaXQsCi0gICAgYWVhZF9zc2wzX2NsZWFudXAsCi0gICAgYWVhZF9zc2wzX3NlYWwsCi0gICAgYWVhZF9zc2wzX29wZW4sCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldF9yYzRfc3RhdGUgKi8KLX07Ci0KIGNvbnN0IEVWUF9BRUFEICpFVlBfYWVhZF9yYzRfbWQ1X3NzbDModm9pZCkgeyByZXR1cm4gJmFlYWRfcmM0X21kNV9zc2wzOyB9CiAKIGNvbnN0IEVWUF9BRUFEICpFVlBfYWVhZF9yYzRfc2hhMV9zc2wzKHZvaWQpIHsgcmV0dXJuICZhZWFkX3JjNF9zaGExX3NzbDM7IH0KQEAgLTQ0MCw1ICs0MjAsMyBAQAogY29uc3QgRVZQX0FFQUQgKkVWUF9hZWFkX2Rlc19lZGUzX2NiY19zaGExX3NzbDModm9pZCkgewogICByZXR1cm4gJmFlYWRfZGVzX2VkZTNfY2JjX3NoYTFfc3NsMzsKIH0KLQotY29uc3QgRVZQX0FFQUQgKkVWUF9hZWFkX251bGxfc2hhMV9zc2wzKHZvaWQpIHsgcmV0dXJuICZhZWFkX251bGxfc2hhMV9zc2wzOyB9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NpcGhlci9lX3Rscy5jIGIvc3JjL2NyeXB0by9jaXBoZXIvZV90bHMuYwppbmRleCAyNzc4ODgxLi5iZWQwMmNiIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2NpcGhlci9lX3Rscy5jCisrKyBiL3NyYy9jcnlwdG8vY2lwaGVyL2VfdGxzLmMKQEAgLTU3LDEyICs1NywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgaW1wbGljaXRfaXYpIHsKICAgaWYgKHRhZ19sZW4gIT0gRVZQX0FFQURfREVGQVVMVF9UQUdfTEVOR1RIICYmCiAgICAgICB0YWdfbGVuICE9IEVWUF9NRF9zaXplKG1kKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVU5TVVBQT1JURURfVEFHX1NJWkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF90bHNfaW5pdCwgQ0lQSEVSX1JfVU5TVVBQT1JURURfVEFHX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGtleV9sZW4gIT0gRVZQX0FFQURfa2V5X2xlbmd0aChjdHgtPmFlYWQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CQURfS0VZX0xFTkdUSCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3Rsc19pbml0LCBDSVBIRVJfUl9CQURfS0VZX0xFTkdUSCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNzUsNyArNzUsNyBAQAogCiAgIEFFQURfVExTX0NUWCAqdGxzX2N0eCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihBRUFEX1RMU19DVFgpKTsKICAgaWYgKHRsc19jdHggPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF90bHNfaW5pdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiAwOwogICB9CiAgIEVWUF9DSVBIRVJfQ1RYX2luaXQoJnRsc19jdHgtPmNpcGhlcl9jdHgpOwpAQCAtMTA5LDcgKzEwOSw3IEBACiAKICAgaWYgKCF0bHNfY3R4LT5jaXBoZXJfY3R4LmVuY3J5cHQpIHsKICAgICAvKiBVbmxpa2UgYSBub3JtYWwgQUVBRCwgYSBUTFMgQUVBRCBtYXkgb25seSBiZSB1c2VkIGluIG9uZSBkaXJlY3Rpb24uICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9JTlZBTElEX09QRVJBVElPTik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3Rsc19zZWFsLCBDSVBIRVJfUl9JTlZBTElEX09QRVJBVElPTik7CiAgICAgcmV0dXJuIDA7CiAKICAgfQpAQCAtMTE3LDIyICsxMTcsMjIgQEAKICAgaWYgKGluX2xlbiArIEVWUF9BRUFEX21heF9vdmVyaGVhZChjdHgtPmFlYWQpIDwgaW5fbGVuIHx8CiAgICAgICBpbl9sZW4gPiBJTlRfTUFYKSB7CiAgICAgLyogRVZQX0NJUEhFUiB0YWtlcyBpbnQgYXMgaW5wdXQuICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF90bHNfc2VhbCwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChtYXhfb3V0X2xlbiA8IGluX2xlbiArIEVWUF9BRUFEX21heF9vdmVyaGVhZChjdHgtPmFlYWQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfdGxzX3NlYWwsIENJUEhFUl9SX0JVRkZFUl9UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKG5vbmNlX2xlbiAhPSBFVlBfQUVBRF9ub25jZV9sZW5ndGgoY3R4LT5hZWFkKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfSU5WQUxJRF9OT05DRV9TSVpFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfdGxzX3NlYWwsIENJUEhFUl9SX0lOVkFMSURfTk9OQ0VfU0laRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoYWRfbGVuICE9IDEzIC0gMiAvKiBsZW5ndGggYnl0ZXMgKi8pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0lOVkFMSURfQURfU0laRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3Rsc19zZWFsLCBDSVBIRVJfUl9JTlZBTElEX0FEX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTIxNCwzNiArMjE0LDM2IEBACiAKICAgaWYgKHRsc19jdHgtPmNpcGhlcl9jdHguZW5jcnlwdCkgewogICAgIC8qIFVubGlrZSBhIG5vcm1hbCBBRUFELCBhIFRMUyBBRUFEIG1heSBvbmx5IGJlIHVzZWQgaW4gb25lIGRpcmVjdGlvbi4gKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfdGxzX29wZW4sIENJUEhFUl9SX0lOVkFMSURfT1BFUkFUSU9OKTsKICAgICByZXR1cm4gMDsKIAogICB9CiAKICAgaWYgKGluX2xlbiA8IEhNQUNfc2l6ZSgmdGxzX2N0eC0+aG1hY19jdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3Rsc19vcGVuLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAobWF4X291dF9sZW4gPCBpbl9sZW4pIHsKICAgICAvKiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIGNhbGxlciBwcm92aWRlIHNwYWNlIGZvciB0aGUgTUFDLCBldmVuIHRob3VnaCBpdAogICAgICAqIHdpbGwgYWx3YXlzIGJlIHJlbW92ZWQgb24gcmV0dXJuLiAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3Rsc19vcGVuLCBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChub25jZV9sZW4gIT0gRVZQX0FFQURfbm9uY2VfbGVuZ3RoKGN0eC0+YWVhZCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0lOVkFMSURfTk9OQ0VfU0laRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3Rsc19vcGVuLCBDSVBIRVJfUl9JTlZBTElEX05PTkNFX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGFkX2xlbiAhPSAxMyAtIDIgLyogbGVuZ3RoIGJ5dGVzICovKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9JTlZBTElEX0FEX1NJWkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF90bHNfb3BlbiwgQ0lQSEVSX1JfSU5WQUxJRF9BRF9TSVpFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChpbl9sZW4gPiBJTlRfTUFYKSB7CiAgICAgLyogRVZQX0NJUEhFUiB0YWtlcyBpbnQgYXMgaW5wdXQuICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF90bHNfb3BlbiwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0yNzgsNyArMjc4LDcgQEAKICAgICAgICAgKHVuc2lnbmVkKUhNQUNfc2l6ZSgmdGxzX2N0eC0+aG1hY19jdHgpKTsKICAgICAvKiBQdWJsaWNseSBpbnZhbGlkLiBUaGlzIGNhbiBiZSByZWplY3RlZCBpbiBub24tY29uc3RhbnQgdGltZS4gKi8KICAgICBpZiAocGFkZGluZ19vayA9PSAwKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF90bHNfb3BlbiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICB9IGVsc2UgewpAQCAtMzEyLDcgKzMxMiw3IEBACiAgICAgaWYgKCFFVlBfdGxzX2NiY19kaWdlc3RfcmVjb3JkKHRsc19jdHgtPmhtYWNfY3R4Lm1kLCBtYWMsICZtYWNfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZF9maXhlZCwgb3V0LCBkYXRhX3BsdXNfbWFjX2xlbiwgdG90YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsc19jdHgtPm1hY19rZXksIHRsc19jdHgtPm1hY19rZXlfbGVuKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfdGxzX29wZW4sIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBhc3NlcnQobWFjX2xlbiA9PSBITUFDX3NpemUoJnRsc19jdHgtPmhtYWNfY3R4KSk7CkBAIC0zNDksNyArMzQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogICBnb29kICY9IGNvbnN0YW50X3RpbWVfZXFfaW50KHBhZGRpbmdfb2ssIDEpOwogICBpZiAoIWdvb2QpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfdGxzX29wZW4sIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC00NDQsMTMgKzQ0NCw2IEBACiAgIHJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IGFlYWRfbnVsbF9zaGExX3Rsc19pbml0KEVWUF9BRUFEX0NUWCAqY3R4LCBjb25zdCB1aW50OF90ICprZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBrZXlfbGVuLCBzaXplX3QgdGFnX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBldnBfYWVhZF9kaXJlY3Rpb25fdCBkaXIpIHsKLSAgcmV0dXJuIGFlYWRfdGxzX2luaXQoY3R4LCBrZXksIGtleV9sZW4sIHRhZ19sZW4sIGRpciwgRVZQX2VuY19udWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgIEVWUF9zaGExKCksIDEgLyogaW1wbGljaXQgaXYgKi8pOwotfQotCiBzdGF0aWMgY29uc3QgRVZQX0FFQUQgYWVhZF9yYzRfc2hhMV90bHMgPSB7CiAgICAgU0hBX0RJR0VTVF9MRU5HVEggKyAxNiwgLyoga2V5IGxlbiAoU0hBMSArIFJDNCkgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBub25jZSBsZW4gKi8KQEAgLTU4MSwxOSArNTc0LDYgQEAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0X3JjNF9zdGF0ZSAqLwogfTsKIAotc3RhdGljIGNvbnN0IEVWUF9BRUFEIGFlYWRfbnVsbF9zaGExX3RscyA9IHsKLSAgICBTSEFfRElHRVNUX0xFTkdUSCwgICAgICAgICAgLyoga2V5IGxlbiAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub25jZSBsZW4gKi8KLSAgICBTSEFfRElHRVNUX0xFTkdUSCwgICAgICAgICAgLyogb3ZlcmhlYWQgKFNIQTEpICovCi0gICAgU0hBX0RJR0VTVF9MRU5HVEgsICAgICAgICAgIC8qIG1heCB0YWcgbGVuZ3RoICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgKi8KLSAgICBhZWFkX251bGxfc2hhMV90bHNfaW5pdCwKLSAgICBhZWFkX3Rsc19jbGVhbnVwLAotICAgIGFlYWRfdGxzX3NlYWwsCi0gICAgYWVhZF90bHNfb3BlbiwKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0X3JjNF9zdGF0ZSAqLwotfTsKLQogY29uc3QgRVZQX0FFQUQgKkVWUF9hZWFkX3JjNF9zaGExX3Rscyh2b2lkKSB7IHJldHVybiAmYWVhZF9yYzRfc2hhMV90bHM7IH0KIAogY29uc3QgRVZQX0FFQUQgKkVWUF9hZWFkX2Flc18xMjhfY2JjX3NoYTFfdGxzKHZvaWQpIHsKQEAgLTYzMSw1ICs2MTEsMyBAQAogY29uc3QgRVZQX0FFQUQgKkVWUF9hZWFkX2Rlc19lZGUzX2NiY19zaGExX3Rsc19pbXBsaWNpdF9pdih2b2lkKSB7CiAgIHJldHVybiAmYWVhZF9kZXNfZWRlM19jYmNfc2hhMV90bHNfaW1wbGljaXRfaXY7CiB9Ci0KLWNvbnN0IEVWUF9BRUFEICpFVlBfYWVhZF9udWxsX3NoYTFfdGxzKHZvaWQpIHsgcmV0dXJuICZhZWFkX251bGxfc2hhMV90bHM7IH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY2lwaGVyL3Rlc3QvYWVzXzEyOF9nY21fdGVzdHMudHh0IGIvc3JjL2NyeXB0by9jaXBoZXIvdGVzdC9hZXNfMTI4X2djbV90ZXN0cy50eHQKaW5kZXggNzU0NjZmZS4uNWY3YWQzNSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jaXBoZXIvdGVzdC9hZXNfMTI4X2djbV90ZXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9jaXBoZXIvdGVzdC9hZXNfMTI4X2djbV90ZXN0cy50eHQKQEAgLTQxOCw5ICs0MTgsMyBAQAogQ1Q6IDVmMzYyN2JkNTNmOGRhMGJiZTZmM2M5MjQ2ZDZmOTZmZTlhYmI5MWNkZWNmNjZkZGQ0MmY4MzNkOThmNGQ0NjM0YzJlMWUxYWQ0MDg4Yzg0YzIyMTkxYmRiOWQ5OWVmMjI3MzIwZTQ1NWRkMTEyYzRhOWU5Y2NhOTU3MjRmY2M5YWUwMjRlZDEyYmY2MGE4MDJkMGI4N2I5OWQ5YmYyMjU5MDc4NjU2N2MyOTYyMTcxZDJiMDViZWM5NzU0YzYyNzYwOGU5ZWJhN2JjY2M3MDU0MGFhNGRhNzJlMWUwNGIyNmQ4Zjk2OGIxMDIzMGY3MDc1MDFjMDA5MWE4YWMxMThmODZlODdhYWUxYWMwMDI1N2FlZTI5YzMzNDViZDM4MzkxNTQ5NzdhY2QzNzhmYzFiMjE5N2Y1YzFmZDhlMTIyNjJmOWMyOTc0ZmI5MmRjNDgxZWViNTFhYWRkNDRhODg1MWY2MWI5M2E4NGJhNTdmMjg3MGRmMDQyM2QyODliZmRjZmU2MzRmOWVjYjdkN2M2MTEwYTk1YjQ5NDE4YTJkZDY2NjMzNzc2OTAyNzVjMjA1YjNlZmE3OWEwYTc3YzkyNTY3ZmI0MjlkOGVlNDM3MzEyYTM5ZGY3NTE2ZGMyMzhmN2I5NDE0OTM4MjIzZDdlYzI0ZDI1NmQzZmIzYTU5NTRhN2M3NWRiZDc5NDg2ZDQ5YmE2YmIzOGE3Y2NjZTBmNTg3MDAyNjBiNzEzMTlhZGY5OGFiODY4NGUzNDkxM2FiZTJkOWQ5NzE5M2UyCiBUQUc6IGU2OTBlODlhZjM5ZmYzNjdmNWQ0MGExYjdjN2NjZDRmCiAKLUtFWTogMzEzMjMzMzQzNTM2MzczODM5MzAzMTMyMzMzNDM1MzYKLU5PTkNFOiAzMTMyMzMzNDM1MzYzNzM4MzkzMDMxMzIzMzM0MzUzNgotSU46IDQ4NjU2YzZjNmYyYzIwNTc2ZjcyNmM2NAotQUQ6Ci1DVDogY2VjMTg5ZDBlODQxOWI5MGZiMTZkNTU1Ci1UQUc6IDMyODkzODMyYThkNjA5MjI0ZDc3YzJlNTZhOTIyMjgyCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NpcGhlci90ZXN0L2NpcGhlcl90ZXN0LnR4dCBiL3NyYy9jcnlwdG8vY2lwaGVyL3Rlc3QvY2lwaGVyX3Rlc3QudHh0CmluZGV4IDIxZmZmZGIuLjkzY2I4ZjMgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vY2lwaGVyL3Rlc3QvY2lwaGVyX3Rlc3QudHh0CisrKyBiL3NyYy9jcnlwdG8vY2lwaGVyL3Rlc3QvY2lwaGVyX3Rlc3QudHh0CkBAIC0zOCwyMiArMzgsNiBAQAogQ2lwaGVydGV4dCA9IDNGRTMwMUM5NjJBQzAxRDAyMjEzNzYzQzFDQkQ0Q0RDNzk5NjU3QzA2NEVDRjVENDFDNjczODEyQ0ZERTk2NzUKIAogCi0jIERFUyBFREUgQ0JDIHRlc3RzCi1DaXBoZXIgPSBERVMtRURFLUNCQwotS2V5ID0gMDEyMzQ1Njc4OWFiY2RlZmYxZTBkM2MyYjVhNDk3ODYKLUlWID0gZmVkY2JhOTg3NjU0MzIxMAotUGxhaW50ZXh0ID0gMzczNjM1MzQzMzMyMzEyMDRFNkY3NzIwNjk3MzIwNzQ2ODY1MjA3NDY5NkQ2NTIwNjY2RjcyMjAwMDAwMDAwMAotQ2lwaGVydGV4dCA9IDc5NDhDMERBNEZFOTFDRDgxNURDQTk2REJDOUI2MEE4NTdFQjk1NEY0REVCMDhFQjk4NzIyNjQyQUU2OTI1N0IKLQotCi0jIERFUyBFREUgdGVzdHMKLUNpcGhlciA9IERFUy1FREUKLUtleSA9IDAxMjM0NTY3ODlhYmNkZWZmMWUwZDNjMmI1YTQ5Nzg2Ci1JViA9IGZlZGNiYTk4NzY1NDMyMTAKLVBsYWludGV4dCA9IDM3MzYzNTM0MzMzMjMxMjA0RTZGNzcyMDY5NzMyMDc0Njg2NTIwNzQ2OTZENjUyMDY2NkY3MjIwMDAwMDAwMDAKLUNpcGhlcnRleHQgPSAyMkU4ODk0MDJFMjg0MjJGODE2N0FEMjc5RDkwQTU2NkRBNzVCNzM0RTEyQzY3MUZDMjY2OUFFQ0IzRTRGRThGCi0KLQogIyBBRVMgMTI4IEVDQiB0ZXN0cyAoZnJvbSBGSVBTLTE5NyB0ZXN0IHZlY3RvcnMsIGVuY3J5cHQpCiBDaXBoZXIgPSBBRVMtMTI4LUVDQgogS2V5ID0gMDAwMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEYKQEAgLTM3NiwxMyArMzYwLDYgQEAKIEFBRCA9IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAxMTEyMTMxNDE1MTYxNzE4MTkxYTFiMWMxZDFlMWYKIFRhZyA9IDNiNjI5Y2NmYmMxMTE5YjczMTllMWRjZTJjZDZmZDZkCiAKLUNpcGhlciA9IEFFUy0xMjgtR0NNCi1LZXkgPSAzMTMyMzMzNDM1MzYzNzM4MzkzMDMxMzIzMzM0MzUzNgotSVYgPSAzMTMyMzMzNDM1MzYzNzM4MzkzMDMxMzIzMzM0MzUzNgotUGxhaW50ZXh0ID0gNDg2NTZjNmM2ZjJjMjA1NzZmNzI2YzY0Ci1DaXBoZXJ0ZXh0ID0gY2VjMTg5ZDBlODQxOWI5MGZiMTZkNTU1Ci1UYWcgPSAzMjg5MzgzMmE4ZDYwOTIyNGQ3N2MyZTU2YTkyMjI4MgotQUFEID0KIAogIyBPRkIgdGVzdHMgZnJvbSBPcGVuU1NMIHVwc3RyZWFtLgogCkBAIC01NTgsNDAgKzUzNSwzIEBACiBLZXkgPSA4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0IKIFBsYWludGV4dCA9IEY2OUYyNDQ1REY0RjlCMTdBRDJCNDE3QkU2NkMzNzEwCiBDaXBoZXJ0ZXh0ID0gOUE0QjQxQkE3MzhENkM3MkZCMTY2OTE2MDNDMThFMEUKLQotIyBERVMgRUNCIHRlc3RzCi0KLUNpcGhlciA9IERFUy1FQ0IKLUtleSA9IDAwMDAwMDAwMDAwMDAwMDAKLVBsYWludGV4dCA9IDAwMDAwMDAwMDAwMDAwMDAKLUNpcGhlcnRleHQgPSA4Q0E2NERFOUMxQjEyM0E3Ci0KLUNpcGhlciA9IERFUy1FQ0IKLUtleSA9IEZGRkZGRkZGRkZGRkZGRkYKLVBsYWludGV4dCA9IEZGRkZGRkZGRkZGRkZGRkYKLUNpcGhlcnRleHQgPSA3MzU5QjIxNjNFNEVEQzU4Ci0KLUNpcGhlciA9IERFUy1FQ0IKLUtleSA9IDMwMDAwMDAwMDAwMDAwMDAKLVBsYWludGV4dCA9IDEwMDAwMDAwMDAwMDAwMDEKLUNpcGhlcnRleHQgPSA5NThFNkU2MjdBMDU1NTdCCi0KLUNpcGhlciA9IERFUy1FQ0IKLUtleSA9IDExMTExMTExMTExMTExMTEKLVBsYWludGV4dCA9IDExMTExMTExMTExMTExMTEKLUNpcGhlcnRleHQgPSBGNDAzNzlBQjlFMEVDNTMzCi0KLUNpcGhlciA9IERFUy1FQ0IKLUtleSA9IDAxMjM0NTY3ODlBQkNERUYKLVBsYWludGV4dCA9IDExMTExMTExMTExMTExMTEKLUNpcGhlcnRleHQgPSAxNzY2OERGQzcyOTI1MzJECi0KLUNpcGhlciA9IERFUy1FQ0IKLUtleSA9IDExMTExMTExMTExMTExMTEKLVBsYWludGV4dCA9IDAxMjM0NTY3ODlBQkNERUYKLUNpcGhlcnRleHQgPSA4QTVBRTFGODFBQjhGMkRECi0KLUNpcGhlciA9IERFUy1FQ0IKLUtleSA9IEZFRENCQTk4NzY1NDMyMTAKLVBsYWludGV4dCA9IDAxMjM0NTY3ODlBQkNERUYKLUNpcGhlcnRleHQgPSBFRDM5RDk1MEZBNzRCQ0M0CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NtYWMvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2NtYWMvQ01ha2VMaXN0cy50eHQKaW5kZXggYmIzYWJjMy4uOGViZDgwYyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jbWFjL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vY21hYy9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgY21hYwpAQCAtMTIsOCArMTIsNiBAQAogICBjbWFjX3Rlc3QKIAogICBjbWFjX3Rlc3QuY2MKLQotICAkPFRBUkdFVF9PQkpFQ1RTOnRlc3Rfc3VwcG9ydD4KICkKIAogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGNtYWNfdGVzdCBjcnlwdG8pCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NtYWMvY21hY190ZXN0LmNjIGIvc3JjL2NyeXB0by9jbWFjL2NtYWNfdGVzdC5jYwppbmRleCA1M2Y0NWQxLi4wZjA2ODYwIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2NtYWMvY21hY190ZXN0LmNjCisrKyBiL3NyYy9jcnlwdG8vY21hYy9jbWFjX3Rlc3QuY2MKQEAgLTE5LDEzICsxOSwxNiBAQAogI2luY2x1ZGUgPG9wZW5zc2wvY21hYy5oPgogCiAjaW5jbHVkZSAiLi4vdGVzdC9zY29wZWRfdHlwZXMuaCIKLSNpbmNsdWRlICIuLi90ZXN0L3Rlc3RfdXRpbC5oIgogCiAKLXN0YXRpYyB2b2lkIGR1bXAoY29uc3QgdWludDhfdCAqZ290LCBjb25zdCB1aW50OF90ICp3YW50LCBzaXplX3QgbGVuKSB7Ci0gIGhleGR1bXAoc3RkZXJyLCAiZ290IDoiLCBnb3QsIGxlbik7Ci0gIGhleGR1bXAoc3RkZXJyLCAid2FudDoiLCB3YW50LCBsZW4pOwotICBmZmx1c2goc3RkZXJyKTsKK3N0YXRpYyB2b2lkIGR1bXAoY29uc3QgdWludDhfdCAqZ290LCBjb25zdCB1aW50OF90ICpleHBlY3RlZCwgc2l6ZV90IGxlbikgeworICBTY29wZWRCSU8gYmlvKEJJT19uZXdfZnAoc3RkZXJyLCAwIC8qIGRvbid0IGNsb3NlICovKSk7CisKKyAgQklPX3B1dHMoYmlvLmdldCgpLCAiXG5Hb3Q6XG4iKTsKKyAgQklPX2hleGR1bXAoYmlvLmdldCgpLCBnb3QsIGxlbiwgMiAvKiBpbmRlbnQgKi8pOworICBCSU9fcHV0cyhiaW8uZ2V0KCksICJFeHBlY3RlZDpcbiIpOworICBCSU9faGV4ZHVtcChiaW8uZ2V0KCksIGV4cGVjdGVkLCBsZW4sIDIgLyogaW5kZW50ICovKTsKKyAgQklPX2ZsdXNoKGJpby5nZXQoKSk7CiB9CiAKIHN0YXRpYyBpbnQgdGVzdChjb25zdCBjaGFyICpuYW1lLCBjb25zdCB1aW50OF90ICprZXksIHNpemVfdCBrZXlfbGVuLApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9jb25mL0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9jb25mL0NNYWtlTGlzdHMudHh0CmluZGV4IDBhM2M3OTUuLjgwNDZiYjggMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vY29uZi9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL2NvbmYvQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKIAogYWRkX2xpYnJhcnkoCiAgIGNvbmYKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY29uZi9jb25mLmMgYi9zcmMvY3J5cHRvL2NvbmYvY29uZi5jCmluZGV4IGUwOThhMmMuLjIxM2VmYzUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vY29uZi9jb25mLmMKKysrIGIvc3JjL2NyeXB0by9jb25mL2NvbmYuYwpAQCAtMTExLDE2ICsxMTEsNiBAQAogICByZXR1cm4gY29uZjsKIH0KIAotQ09ORl9WQUxVRSAqQ09ORl9WQUxVRV9uZXcodm9pZCkgewotICBDT05GX1ZBTFVFICp2ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKENPTkZfVkFMVUUpKTsKLSAgaWYgKCF2KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIG1lbXNldCh2LCAwLCBzaXplb2YoQ09ORl9WQUxVRSkpOwotICByZXR1cm4gdjsKLX0KLQogc3RhdGljIHZvaWQgdmFsdWVfZnJlZV9jb250ZW50cyhDT05GX1ZBTFVFICp2YWx1ZSkgewogICBpZiAodmFsdWUtPnNlY3Rpb24pIHsKICAgICBPUEVOU1NMX2ZyZWUodmFsdWUtPnNlY3Rpb24pOwpAQCAtMTQ3LDI2ICsxMzcsMjkgQEAKICAgICByZXR1cm47CiAgIH0KIAotICBsaF9DT05GX1ZBTFVFX2RvYWxsKGNvbmYtPmRhdGEsIHZhbHVlX2ZyZWUpOworICBsaF9DT05GX1ZBTFVFX2RvYWxsKGNvbmYtPmRhdGEsIHZhbHVlX2ZyZWVfY29udGVudHMpOwogICBsaF9DT05GX1ZBTFVFX2ZyZWUoY29uZi0+ZGF0YSk7CiAgIE9QRU5TU0xfZnJlZShjb25mKTsKIH0KIAogQ09ORl9WQUxVRSAqTkNPTkZfbmV3X3NlY3Rpb24oY29uc3QgQ09ORiAqY29uZiwgY29uc3QgY2hhciAqc2VjdGlvbikgewogICBTVEFDS19PRihDT05GX1ZBTFVFKSAqc2sgPSBOVUxMOwotICBpbnQgb2sgPSAwOworICBpbnQgb2sgPSAwLCBpOwogICBDT05GX1ZBTFVFICp2ID0gTlVMTCwgKm9sZF92YWx1ZTsKIAogICBzayA9IHNrX0NPTkZfVkFMVUVfbmV3X251bGwoKTsKLSAgdiA9IENPTkZfVkFMVUVfbmV3KCk7CisgIHYgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoQ09ORl9WQUxVRSkpOwogICBpZiAoc2sgPT0gTlVMTCB8fCB2ID09IE5VTEwpIHsKICAgICBnb3RvIGVycjsKICAgfQotICB2LT5zZWN0aW9uID0gT1BFTlNTTF9zdHJkdXAoc2VjdGlvbik7CisgIGkgPSBzdHJsZW4oc2VjdGlvbikgKyAxOworICB2LT5zZWN0aW9uID0gT1BFTlNTTF9tYWxsb2MoaSk7CiAgIGlmICh2LT5zZWN0aW9uID09IE5VTEwpIHsKICAgICBnb3RvIGVycjsKICAgfQogCisgIG1lbWNweSh2LT5zZWN0aW9uLCBzZWN0aW9uLCBpKTsKKyAgdi0+c2VjdGlvbltpLTFdID0gMDsKICAgdi0+bmFtZSA9IE5VTEw7CiAgIHYtPnZhbHVlID0gKGNoYXIgKilzazsKIApAQCAtMjkyLDcgKzI4NSw3IEBACiAgICAgICBycCA9IGU7CiAgICAgICBpZiAocSkgewogICAgICAgICBpZiAociAhPSBxKSB7Ci0gICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgQ09ORl9SX05PX0NMT1NFX0JSQUNFKTsKKyAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBzdHJfY29weSwgQ09ORl9SX05PX0NMT1NFX0JSQUNFKTsKICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgfQogICAgICAgICBlKys7CkBAIC0zMTEsNyArMzA0LDcgQEAKICAgICAgIH0KICAgICAgICpycCA9IHI7CiAgICAgICBpZiAocCA9PSBOVUxMKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIENPTkZfUl9WQVJJQUJMRV9IQVNfTk9fVkFMVUUpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBzdHJfY29weSwgQ09ORl9SX1ZBUklBQkxFX0hBU19OT19WQUxVRSk7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogICAgICAgQlVGX01FTV9ncm93X2NsZWFuKGJ1ZiwgKHN0cmxlbihwKSArIGJ1Zi0+bGVuZ3RoIC0gKGUgLSBmcm9tKSkpOwpAQCAtMzc5LDEyICszNzIsMTEgQEAKICAgcmV0dXJuIHZhbHVlLT52YWx1ZTsKIH0KIAotc3RhdGljIGludCBhZGRfc3RyaW5nKGNvbnN0IENPTkYgKmNvbmYsIENPTkZfVkFMVUUgKnNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgQ09ORl9WQUxVRSAqdmFsdWUpIHsKK2ludCBhZGRfc3RyaW5nKGNvbnN0IENPTkYgKmNvbmYsIENPTkZfVkFMVUUgKnNlY3Rpb24sIENPTkZfVkFMVUUgKnZhbHVlKSB7CiAgIFNUQUNLX09GKENPTkZfVkFMVUUpICpzZWN0aW9uX3N0YWNrID0gKFNUQUNLX09GKENPTkZfVkFMVUUpKikgc2VjdGlvbi0+dmFsdWU7CiAgIENPTkZfVkFMVUUgKm9sZF92YWx1ZTsKIAotICB2YWx1ZS0+c2VjdGlvbiA9IE9QRU5TU0xfc3RyZHVwKHNlY3Rpb24tPnNlY3Rpb24pOworICB2YWx1ZS0+c2VjdGlvbiA9IHNlY3Rpb24tPnNlY3Rpb247CiAgIGlmICghc2tfQ09ORl9WQUxVRV9wdXNoKHNlY3Rpb25fc3RhY2ssIHZhbHVlKSkgewogICAgIHJldHVybiAwOwogICB9CkBAIC01MTMsMTkgKzUwNSwyMCBAQAogICBjaGFyICpzdGFydCwgKnBzZWN0aW9uLCAqcG5hbWU7CiAKICAgaWYgKChidWZmID0gQlVGX01FTV9uZXcoKSkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIEVSUl9SX0JVRl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIGRlZl9sb2FkX2JpbywgRVJSX1JfQlVGX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KIAotICBzZWN0aW9uID0gT1BFTlNTTF9zdHJkdXAoImRlZmF1bHQiKTsKKyAgc2VjdGlvbiA9IChjaGFyICopT1BFTlNTTF9tYWxsb2MoMTApOwogICBpZiAoc2VjdGlvbiA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIGRlZl9sb2FkX2JpbywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CisgIEJVRl9zdHJsY3B5KHNlY3Rpb24sICJkZWZhdWx0IiwgMTApOwogCiAgIHN2ID0gTkNPTkZfbmV3X3NlY3Rpb24oY29uZiwgc2VjdGlvbik7CiAgIGlmIChzdiA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgQ09ORl9SX1VOQUJMRV9UT19DUkVBVEVfTkVXX1NFQ1RJT04pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIGRlZl9sb2FkX2JpbywgQ09ORl9SX1VOQUJMRV9UT19DUkVBVEVfTkVXX1NFQ1RJT04pOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTUzMyw3ICs1MjYsNyBAQAogICBhZ2FpbiA9IDA7CiAgIGZvciAoOzspIHsKICAgICBpZiAoIUJVRl9NRU1fZ3JvdyhidWZmLCBidWZudW0gKyBDT05GQlVGU0laRSkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIEVSUl9SX0JVRl9MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgZGVmX2xvYWRfYmlvLCBFUlJfUl9CVUZfTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICBwID0gJihidWZmLT5kYXRhW2J1Zm51bV0pOwpAQCAtNjAyLDcgKzU5NSw3IEBACiAgICAgICAgICAgc3MgPSBwOwogICAgICAgICAgIGdvdG8gYWdhaW47CiAgICAgICAgIH0KLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgQ09ORl9SX01JU1NJTkdfQ0xPU0VfU1FVQVJFX0JSQUNLRVQpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBkZWZfbG9hZF9iaW8sIENPTkZfUl9NSVNTSU5HX0NMT1NFX1NRVUFSRV9CUkFDS0VUKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAgICAgICAqZW5kID0gJ1wwJzsKQEAgLTYxMyw3ICs2MDYsNyBAQAogICAgICAgICBzdiA9IE5DT05GX25ld19zZWN0aW9uKGNvbmYsIHNlY3Rpb24pOwogICAgICAgfQogICAgICAgaWYgKHN2ID09IE5VTEwpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgQ09ORl9SX1VOQUJMRV9UT19DUkVBVEVfTkVXX1NFQ1RJT04pOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBkZWZfbG9hZF9iaW8sIENPTkZfUl9VTkFCTEVfVE9fQ1JFQVRFX05FV19TRUNUSU9OKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAgICAgICBjb250aW51ZTsKQEAgLTYzMCw3ICs2MjMsNyBAQAogICAgICAgfQogICAgICAgcCA9IGVhdF93cyhjb25mLCBlbmQpOwogICAgICAgaWYgKCpwICE9ICc9JykgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBDT05GX1JfTUlTU0lOR19FUVVBTF9TSUdOKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgZGVmX2xvYWRfYmlvLCBDT05GX1JfTUlTU0lOR19FUVVBTF9TSUdOKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAgICAgICAqZW5kID0gJ1wwJzsKQEAgLTY0NiwxNyArNjM5LDIwIEBACiAgICAgICBwKys7CiAgICAgICAqcCA9ICdcMCc7CiAKLSAgICAgIGlmICghKHYgPSBDT05GX1ZBTFVFX25ldygpKSkgeworICAgICAgaWYgKCEodiA9IChDT05GX1ZBTFVFICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKENPTkZfVkFMVUUpKSkpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgZGVmX2xvYWRfYmlvLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogICAgICAgaWYgKHBzZWN0aW9uID09IE5VTEwpIHsKICAgICAgICAgcHNlY3Rpb24gPSBzZWN0aW9uOwogICAgICAgfQotICAgICAgdi0+bmFtZSA9IE9QRU5TU0xfc3RyZHVwKHBuYW1lKTsKKyAgICAgIHYtPm5hbWUgPSAoY2hhciAqKU9QRU5TU0xfbWFsbG9jKHN0cmxlbihwbmFtZSkgKyAxKTsKKyAgICAgIHYtPnZhbHVlID0gTlVMTDsKICAgICAgIGlmICh2LT5uYW1lID09IE5VTEwpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBkZWZfbG9hZF9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CisgICAgICBCVUZfc3RybGNweSh2LT5uYW1lLCBwbmFtZSwgc3RybGVuKHBuYW1lKSArIDEpOwogICAgICAgaWYgKCFzdHJfY29weShjb25mLCBwc2VjdGlvbiwgJih2LT52YWx1ZSksIHN0YXJ0KSkgewogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KQEAgLTY2NiwxNCArNjYyLDE0IEBACiAgICAgICAgICAgdHYgPSBOQ09ORl9uZXdfc2VjdGlvbihjb25mLCBwc2VjdGlvbik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHR2ID09IE5VTEwpIHsKLSAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBDT05GX1JfVU5BQkxFX1RPX0NSRUFURV9ORVdfU0VDVElPTik7CisgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgZGVmX2xvYWRfYmlvLCBDT05GX1JfVU5BQkxFX1RPX0NSRUFURV9ORVdfU0VDVElPTik7CiAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHR2ID0gc3Y7CiAgICAgICB9CiAgICAgICBpZiAoYWRkX3N0cmluZyhjb25mLCB0diwgdikgPT0gMCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIGRlZl9sb2FkX2JpbywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KICAgICAgIHYgPSBOVUxMOwpAQCAtNzE5LDcgKzcxNSw3IEBACiAgIGludCByZXQ7CiAKICAgaWYgKGluID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBFUlJfUl9TWVNfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBOQ09ORl9sb2FkLCBFUlJfUl9TWVNfTElCKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC03NDAsNyArNzM2LDcgQEAKICAgY29uc3QgY2hhciAqbHN0YXJ0LCAqdG1wZW5kLCAqcDsKIAogICBpZiAobGlzdCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgQ09ORl9SX0xJU1RfQ0FOTk9UX0JFX05VTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIENPTkZfcGFyc2VfbGlzdCwgQ09ORl9SX0xJU1RfQ0FOTk9UX0JFX05VTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY29uZi9pbnRlcm5hbC5oIGIvc3JjL2NyeXB0by9jb25mL2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZDFhOGYuLjAwMDAwMDAKLS0tIGEvc3JjL2NyeXB0by9jb25mL2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEdvb2dsZSBJbmMuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCi0KLSNpZm5kZWYgT1BFTlNTTF9IRUFERVJfQ1JZUFRPX0NPTkZfSU5URVJOQUxfSAotI2RlZmluZSBPUEVOU1NMX0hFQURFUl9DUllQVE9fQ09ORl9JTlRFUk5BTF9ICi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0vKiBDT05GX1ZBTFVFX25ldyByZXR1cm5zIGEgZnJlc2hseSBhbGxvY2F0ZWQgYW5kIHplcm9lZCB8Q09ORl9WQUxVRXwuICovCi1DT05GX1ZBTFVFICpDT05GX1ZBTFVFX25ldyh2b2lkKTsKLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKLX0gIC8qIGV4dGVybiBDICovCi0jZW5kaWYKLQotI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9DUllQVE9fQ09ORl9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NwdS1hcm0uYyBiL3NyYy9jcnlwdG8vY3B1LWFybS5jCmluZGV4IDZlMDM3YWIuLjc0ZTkzN2IgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vY3B1LWFybS5jCisrKyBiL3NyYy9jcnlwdG8vY3B1LWFybS5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKyNpbmNsdWRlICJhcm1fYXJjaC5oIgogCiAKIC8qIFdlIGNhbid0IGluY2x1ZGUgPHN5cy9hdXh2Lmg+IGJlY2F1c2UgdGhlIEFuZHJvaWQgU0RLIHZlcnNpb24gYWdhaW5zdCB3aGljaApAQCAtNzAsMTIgKzcwLDEyIEBACiAgIHNpZ2xvbmdqbXAoc2lnaWxsX2ptcCwgc2lnbmFsKTsKIH0KIAotdm9pZCBDUllQVE9fYXJtX25lb25fcHJvYmUodm9pZCk7Cit2b2lkIENSWVBUT19hcm1fbmVvbl9wcm9iZSgpOwogCiAvLyBwcm9iZV9mb3JfTkVPTiByZXR1cm5zIDEgaWYgYSBORU9OIGluc3RydWN0aW9uIHJ1bnMgc3VjY2Vzc2Z1bGx5LiBCZWNhdXNlCiAvLyBnZXRhdXh2YWwgZG9lc24ndCBleGlzdCBvbiBBbmRyb2lkIHVudGlsIEplbGx5IEJlYW4sIHN1cHBvcnRpbmcgTkVPTiBvbgogLy8gb2xkZXIgZGV2aWNlcyByZXF1aXJlcyB0aGlzLgotc3RhdGljIGludCBwcm9iZV9mb3JfTkVPTih2b2lkKSB7CitzdGF0aWMgaW50IHByb2JlX2Zvcl9ORU9OKCkgewogICBpbnQgc3VwcG9ydGVkID0gMDsKIAogICBzaWdzZXRfdCBzaWdtYXNrOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9jcHUtaW50ZWwuYyBiL3NyYy9jcnlwdG8vY3B1LWludGVsLmMKaW5kZXggOTI0YmFiMC4uZGYwZTEyNyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jcHUtaW50ZWwuYworKysgYi9zcmMvY3J5cHRvL2NwdS1pbnRlbC5jCkBAIC02OCw1OCArNjgsOCBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNpZiBkZWZpbmVkKE9QRU5TU0xfV0lORE9XUykKLSNwcmFnbWEgd2FybmluZyhwdXNoLCAzKQotI2luY2x1ZGUgPGltbWludHJpbi5oPgotI2luY2x1ZGUgPGludHJpbi5oPgotI3ByYWdtYSB3YXJuaW5nKHBvcCkKLSNlbmRpZgotCi0KLS8qIE9QRU5TU0xfY3B1aWQgcnVucyB0aGUgY3B1aWQgaW5zdHJ1Y3Rpb24uIHxsZWFmfCBpcyBwYXNzZWQgaW4gYXMgRUFYIGFuZCBFQ1gKLSAqIGlzIHNldCB0byB6ZXJvLiBJdCB3cml0ZXMgRUFYLCBFQlgsIEVDWCwgYW5kIEVEWCB0byB8Km91dF9lYXh8IHRocm91Z2gKLSAqIHwqb3V0X2VkeHwuICovCi1zdGF0aWMgdm9pZCBPUEVOU1NMX2NwdWlkKHVpbnQzMl90ICpvdXRfZWF4LCB1aW50MzJfdCAqb3V0X2VieCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9lY3gsIHVpbnQzMl90ICpvdXRfZWR4LCB1aW50MzJfdCBsZWFmKSB7Ci0jaWYgZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCi0gIGludCB0bXBbNF07Ci0gIF9fY3B1aWQodG1wLCAoaW50KWxlYWYpOwotICAqb3V0X2VheCA9ICh1aW50MzJfdCl0bXBbMF07Ci0gICpvdXRfZWJ4ID0gKHVpbnQzMl90KXRtcFsxXTsKLSAgKm91dF9lY3ggPSAodWludDMyX3QpdG1wWzJdOwotICAqb3V0X2VkeCA9ICh1aW50MzJfdCl0bXBbM107Ci0jZWxpZiBkZWZpbmVkKF9fcGljX18pICYmIGRlZmluZWQoT1BFTlNTTF8zMl9CSVQpCi0gIC8qIElubGluZSBhc3NlbWJseSBtYXkgbm90IGNsb2JiZXIgdGhlIFBJQyByZWdpc3Rlci4gRm9yIDMyLWJpdCwgdGhpcyBpcyBFQlguCi0gICAqIFNlZSBodHRwczovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00NzYwMi4gKi8KLSAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgInhvciAlJWVjeCwgJSVlY3hcbiIKLSAgICAibW92ICUlZWJ4LCAlJWVkaVxuIgotICAgICJjcHVpZFxuIgotICAgICJ4Y2hnICUlZWRpLCAlJWVieFxuIgotICAgIDogIj1hIigqb3V0X2VheCksICI9RCIoKm91dF9lYngpLCAiPWMiKCpvdXRfZWN4KSwgIj1kIigqb3V0X2VkeCkKLSAgICA6ICJhIihsZWFmKQotICApOwotI2Vsc2UKLSAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgInhvciAlJWVjeCwgJSVlY3hcbiIKLSAgICAiY3B1aWRcbiIKLSAgICA6ICI9YSIoKm91dF9lYXgpLCAiPWIiKCpvdXRfZWJ4KSwgIj1jIigqb3V0X2VjeCksICI9ZCIoKm91dF9lZHgpCi0gICAgOiAiYSIobGVhZikKLSAgKTsKLSNlbmRpZgotfQotCi0vKiBPUEVOU1NMX3hnZXRidiByZXR1cm5zIHRoZSB2YWx1ZSBvZiBhbiBJbnRlbCBFeHRlbmRlZCBDb250cm9sIFJlZ2lzdGVyIChYQ1IpLgotICogQ3VycmVudGx5IG9ubHkgWENSMCBpcyBkZWZpbmVkIGJ5IEludGVsIHNvIHx4Y3J8IHNob3VsZCBhbHdheXMgYmUgemVyby4gKi8KLXN0YXRpYyB1aW50NjRfdCBPUEVOU1NMX3hnZXRidih1aW50MzJfdCB4Y3IpIHsKLSNpZiBkZWZpbmVkKE9QRU5TU0xfV0lORE9XUykKLSAgcmV0dXJuICh1aW50NjRfdClfeGdldGJ2KHhjcik7Ci0jZWxzZQotICB1aW50MzJfdCBlYXgsIGVkeDsKLSAgX19hc21fXyB2b2xhdGlsZSAoInhnZXRidiIgOiAiPWEiKGVheCksICI9ZCIoZWR4KSA6ICJjIih4Y3IpKTsKLSAgcmV0dXJuICgoKHVpbnQ2NF90KWVkeCkgPDwgMzIpIHwgZWF4OwotI2VuZGlmCi19CisvKiBPUEVOU1NMX2lhMzJfY3B1aWQgaXMgZGVmaW5lZCBpbiBjcHUteDg2XzY0LWFzbS5wbC4gKi8KK2V4dGVybiB1aW50NjRfdCBPUEVOU1NMX2lhMzJfY3B1aWQodWludDMyX3QqKTsKIAogLyogaGFuZGxlX2NwdV9lbnYgYXBwbGllcyB0aGUgdmFsdWUgZnJvbSB8aW58IHRvIHRoZSBDUFVJRCB2YWx1ZXMgaW4gfG91dFswXXwKICAqIGFuZCB8b3V0WzFdfC4gU2VlIHRoZSBjb21tZW50IGluIHxPUEVOU1NMX2NwdWlkX3NldHVwfCBhYm91dCB0aGlzLiAqLwpAQCAtMTQxLDEwMSArOTEsMTggQEAKIH0KIAogdm9pZCBPUEVOU1NMX2NwdWlkX3NldHVwKHZvaWQpIHsKLSAgLyogRGV0ZXJtaW5lIHRoZSB2ZW5kb3IgYW5kIG1heGltdW0gaW5wdXQgdmFsdWUuICovCi0gIHVpbnQzMl90IGVheCwgZWJ4LCBlY3gsIGVkeDsKLSAgT1BFTlNTTF9jcHVpZCgmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4LCAwKTsKLQotICB1aW50MzJfdCBudW1faWRzID0gZWF4OwotCi0gIGludCBpc19pbnRlbCA9IGVieCA9PSAweDc1NmU2NTQ3IC8qIEdlbnUgKi8gJiYKLSAgICAgICAgICAgICAgICAgZWR4ID09IDB4NDk2NTZlNjkgLyogaW5lSSAqLyAmJgotICAgICAgICAgICAgICAgICBlY3ggPT0gMHg2YzY1NzQ2ZSAvKiBudGVsICovOwotICBpbnQgaXNfYW1kID0gZWJ4ID09IDB4Njg3NDc1NDEgLyogQXV0aCAqLyAmJgotICAgICAgICAgICAgICAgZWR4ID09IDB4Njk3NDZlNjUgLyogZW50aSAqLyAmJgotICAgICAgICAgICAgICAgZWN4ID09IDB4NDQ0ZDQxNjMgLyogY0FNRCAqLzsKLQotICBpbnQgaGFzX2FtZF94b3AgPSAwOwotICBpZiAoaXNfYW1kKSB7Ci0gICAgLyogQU1ELXNwZWNpZmljIGxvZ2ljLgotICAgICAqIFNlZSBodHRwOi8vZGV2ZWxvcGVyLmFtZC5jb20vd29yZHByZXNzL21lZGlhLzIwMTIvMTAvMjU0ODExLnBkZiAqLwotICAgIE9QRU5TU0xfY3B1aWQoJmVheCwgJmVieCwgJmVjeCwgJmVkeCwgMHg4MDAwMDAwMCk7Ci0gICAgdWludDMyX3QgbnVtX2V4dGVuZGVkX2lkcyA9IGVheDsKLSAgICBpZiAobnVtX2V4dGVuZGVkX2lkcyA+PSAweDgwMDAwMDAxKSB7Ci0gICAgICBPUEVOU1NMX2NwdWlkKCZlYXgsICZlYngsICZlY3gsICZlZHgsIDB4ODAwMDAwMDEpOwotICAgICAgaWYgKGVjeCAmICgxIDw8IDExKSkgewotICAgICAgICBoYXNfYW1kX3hvcCA9IDE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdWludDMyX3QgZXh0ZW5kZWRfZmVhdHVyZXMgPSAwOwotICBpZiAobnVtX2lkcyA+PSA3KSB7Ci0gICAgT1BFTlNTTF9jcHVpZCgmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4LCA3KTsKLSAgICBleHRlbmRlZF9mZWF0dXJlcyA9IGVieDsKLSAgfQotCi0gIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGNvcmVzIHNoYXJpbmcgYW4gTDEgZGF0YSBjYWNoZSB0byBhZGp1c3QgdGhlCi0gICAqIGh5cGVyLXRocmVhZGluZyBiaXQuICovCi0gIHVpbnQzMl90IGNvcmVzX3Blcl9jYWNoZSA9IDA7Ci0gIGlmIChpc19hbWQpIHsKLSAgICAvKiBBTUQgQ1BVcyBuZXZlciBzaGFyZSBhbiBMMSBkYXRhIGNhY2hlIGJldHdlZW4gdGhyZWFkcyBidXQgZG8gc2V0IHRoZSBIVFQKLSAgICAgKiBiaXQgb24gbXVsdGktY29yZSBDUFVzLiAqLwotICAgIGNvcmVzX3Blcl9jYWNoZSA9IDE7Ci0gIH0gZWxzZSBpZiAobnVtX2lkcyA+PSA0KSB7Ci0gICAgLyogVE9ETyhkYXZpZGJlbik6IFRoZSBJbnRlbCBtYW51YWwgc2F5cyB0aGlzIENQVUlEIGxlYWYgZW51bWVyYXRlcyBhbGwKLSAgICAgKiBjYWNoZXMgdXNpbmcgRUNYIGFuZCBkb2Vzbid0IHNheSB3aGljaCBpcyBmaXJzdC4gRG9lcyB0aGlzIG1hdHRlcj8gKi8KLSAgICBPUEVOU1NMX2NwdWlkKCZlYXgsICZlYngsICZlY3gsICZlZHgsIDQpOwotICAgIGNvcmVzX3Blcl9jYWNoZSA9IDEgKyAoKGVheCA+PiAxNCkgJiAweGZmZik7Ci0gIH0KLQotICBPUEVOU1NMX2NwdWlkKCZlYXgsICZlYngsICZlY3gsICZlZHgsIDEpOwotCi0gIC8qIEFkanVzdCB0aGUgaHlwZXItdGhyZWFkaW5nIGJpdC4gKi8KLSAgaWYgKGVkeCAmICgxIDw8IDI4KSkgewotICAgIHVpbnQzMl90IG51bV9sb2dpY2FsX2NvcmVzID0gKGVieCA+PiAxNikgJiAweGZmOwotICAgIGlmIChjb3Jlc19wZXJfY2FjaGUgPT0gMSB8fCBudW1fbG9naWNhbF9jb3JlcyA8PSAxKSB7Ci0gICAgICBlZHggJj0gfigxIDw8IDI4KTsKLSAgICB9Ci0gIH0KLQotICAvKiBSZXNlcnZlZCBiaXQgIzIwIHdhcyBoaXN0b3JpY2FsbHkgcmVwdXJwb3NlZCB0byBjb250cm9sIHRoZSBpbi1tZW1vcnkKLSAgICogcmVwcmVzZW50YXRpb24gb2YgUkM0IHN0YXRlLiBBbHdheXMgc2V0IGl0IHRvIHplcm8uICovCi0gIGVkeCAmPSB+KDEgPDwgMjApOwotCi0gIC8qIFJlc2VydmVkIGJpdCAjMzAgaXMgcmVwdXJwb3NlZCB0byBzaWduYWwgYW4gSW50ZWwgQ1BVLiAqLwotICBpZiAoaXNfaW50ZWwpIHsKLSAgICBlZHggfD0gKDEgPDwgMzApOwotICB9IGVsc2UgewotICAgIGVkeCAmPSB+KDEgPDwgMzApOwotICB9Ci0KLSAgLyogVGhlIFNEQkcgYml0IGlzIHJlcHVycG9zZWQgdG8gZGVub3RlIEFNRCBYT1Agc3VwcG9ydC4gKi8KLSAgaWYgKGhhc19hbWRfeG9wKSB7Ci0gICAgZWN4IHw9ICgxIDw8IDExKTsKLSAgfSBlbHNlIHsKLSAgICBlY3ggJj0gfigxIDw8IDExKTsKLSAgfQotCi0gIHVpbnQ2NF90IHhjcjAgPSAwOwotICBpZiAoZWN4ICYgKDEgPDwgMjcpKSB7Ci0gICAgLyogWENSMCBtYXkgb25seSBiZSBxdWVyaWVkIGlmIHRoZSBPU1hTQVZFIGJpdCBpcyBzZXQuICovCi0gICAgeGNyMCA9IE9QRU5TU0xfeGdldGJ2KDApOwotICB9Ci0gIC8qIFNlZSBJbnRlbCBtYW51YWwsIHNlY3Rpb24gMTQuMy4gKi8KLSAgaWYgKCh4Y3IwICYgNikgIT0gNikgewotICAgIC8qIFlNTSByZWdpc3RlcnMgY2Fubm90IGJlIHVzZWQuICovCi0gICAgZWN4ICY9IH4oMSA8PCAyOCk7IC8qIEFWWCAqLwotICAgIGVjeCAmPSB+KDEgPDwgMTIpOyAvKiBGTUEgKi8KLSAgICBlY3ggJj0gfigxIDw8IDExKTsgLyogQU1EIFhPUCAqLwotICAgIGV4dGVuZGVkX2ZlYXR1cmVzICY9IH4oMSA8PCA1KTsgLyogQVZYMiAqLwotICB9Ci0KLSAgT1BFTlNTTF9pYTMyY2FwX1BbMF0gPSBlZHg7Ci0gIE9QRU5TU0xfaWEzMmNhcF9QWzFdID0gZWN4OwotICBPUEVOU1NMX2lhMzJjYXBfUFsyXSA9IGV4dGVuZGVkX2ZlYXR1cmVzOwotICBPUEVOU1NMX2lhMzJjYXBfUFszXSA9IDA7Ci0KICAgY29uc3QgY2hhciAqZW52MSwgKmVudjI7CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfWDg2XzY0KQorICBPUEVOU1NMX2lhMzJfY3B1aWQoT1BFTlNTTF9pYTMyY2FwX1ApOworI2Vsc2UKKyAgdWludDY0X3QgdmVjID0gT1BFTlNTTF9pYTMyX2NwdWlkKE9QRU5TU0xfaWEzMmNhcF9QKTsKKyAgLyogMTw8MTAgc2V0cyBhIHJlc2VydmVkIGJpdCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB2YXJpYWJsZQorICAgKiB3YXMgYWxyZWFkeSBpbml0aWFsaXNlZC4gKi8KKyAgT1BFTlNTTF9pYTMyY2FwX1BbMF0gPSAoKHVpbnQzMl90KXZlYykgfCAoMSA8PCAxMCk7CisgIE9QRU5TU0xfaWEzMmNhcF9QWzFdID0gdmVjID4+IDMyOworI2VuZGlmCisKICAgZW52MSA9IGdldGVudigiT1BFTlNTTF9pYTMyY2FwIik7CiAgIGlmIChlbnYxID09IE5VTEwpIHsKICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NwdS14ODYtYXNtLnBsIGIvc3JjL2NyeXB0by9jcHUteDg2LWFzbS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTljNDM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NyeXB0by9jcHUteDg2LWFzbS5wbApAQCAtMCwwICsxLDMzNCBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworcHVzaChASU5DLCAiJHtkaXJ9cGVybGFzbSIsICJwZXJsYXNtIik7CityZXF1aXJlICJ4ODZhc20ucGwiOworCismYXNtX2luaXQoJEFSR1ZbMF0sImNyeXB0by9jcHUteDg2LWFzbSIpOworCitmb3IgKEBBUkdWKSB7ICRzc2UyPTEgaWYgKC8tRE9QRU5TU0xfSUEzMl9TU0UyLyk7IH0KKworJmZ1bmN0aW9uX2JlZ2luKCJPUEVOU1NMX2lhMzJfY3B1aWQiKTsKKwkmeG9yCSgiZWR4IiwiZWR4Iik7CisJJnB1c2hmCSgpOworCSZwb3AJKCJlYXgiKTsKKwkmbW92CSgiZWN4IiwiZWF4Iik7CisJJnhvcgkoImVheCIsMTw8MjEpOworCSZwdXNoCSgiZWF4Iik7CisJJnBvcGYJKCk7CisJJnB1c2hmCSgpOworCSZwb3AJKCJlYXgiKTsKKwkmeG9yCSgiZWN4IiwiZWF4Iik7CisJJnhvcgkoImVheCIsImVheCIpOworCSZidAkoImVjeCIsMjEpOworCSZqbmMJKCZsYWJlbCgibm9jcHVpZCIpKTsKKwkmbW92CSgiZXNpIiwmd3BhcmFtKDApKTsKKwkmbW92CSgmRFdQKDgsImVzaSIpLCJlYXgiKTsJIyBjbGVhciAzcmQgd29yZAorCSZjcHVpZAkoKTsKKwkmbW92CSgiZWRpIiwiZWF4Iik7CQkjIG1heCB2YWx1ZSBmb3Igc3RhbmRhcmQgcXVlcnkgbGV2ZWwKKworCSZ4b3IJKCJlYXgiLCJlYXgiKTsKKwkmY21wCSgiZWJ4IiwweDc1NmU2NTQ3KTsJIyAiR2VudSIKKwkmc2V0bmUJKCZMQigiZWF4IikpOworCSZtb3YJKCJlYnAiLCJlYXgiKTsKKwkmY21wCSgiZWR4IiwweDQ5NjU2ZTY5KTsJIyAiaW5lSSIKKwkmc2V0bmUJKCZMQigiZWF4IikpOworCSZvcgkoImVicCIsImVheCIpOworCSZjbXAJKCJlY3giLDB4NmM2NTc0NmUpOwkjICJudGVsIgorCSZzZXRuZQkoJkxCKCJlYXgiKSk7CisJJm9yCSgiZWJwIiwiZWF4Iik7CQkjIDAgaW5kaWNhdGVzIEludGVsIENQVQorCSZqegkoJmxhYmVsKCJpbnRlbCIpKTsKKworCSZjbXAJKCJlYngiLDB4Njg3NDc1NDEpOwkjICJBdXRoIgorCSZzZXRuZQkoJkxCKCJlYXgiKSk7CisJJm1vdgkoImVzaSIsImVheCIpOworCSZjbXAJKCJlZHgiLDB4Njk3NDZFNjUpOwkjICJlbnRpIgorCSZzZXRuZQkoJkxCKCJlYXgiKSk7CisJJm9yCSgiZXNpIiwiZWF4Iik7CisJJmNtcAkoImVjeCIsMHg0NDRENDE2Myk7CSMgImNBTUQiCisJJnNldG5lCSgmTEIoImVheCIpKTsKKwkmb3IJKCJlc2kiLCJlYXgiKTsJCSMgMCBpbmRpY2F0ZXMgQU1EIENQVQorCSZqbnoJKCZsYWJlbCgiaW50ZWwiKSk7CisKKwkjIEFNRCBzcGVjaWZpYworCSZtb3YJKCJlYXgiLDB4ODAwMDAwMDApOworCSZjcHVpZAkoKTsKKwkmY21wCSgiZWF4IiwweDgwMDAwMDAxKTsKKwkmamIJKCZsYWJlbCgiaW50ZWwiKSk7CisJJm1vdgkoImVzaSIsImVheCIpOworCSZtb3YJKCJlYXgiLDB4ODAwMDAwMDEpOworCSZjcHVpZAkoKTsKKwkmb3IJKCJlYnAiLCJlY3giKTsKKwkmYW5kCSgiZWJwIiwxPDwxMXwxKTsJIyBpc29sYXRlIFhPUCBiaXQKKwkmY21wCSgiZXNpIiwweDgwMDAwMDA4KTsKKwkmamIJKCZsYWJlbCgiaW50ZWwiKSk7CisKKwkmbW92CSgiZWF4IiwweDgwMDAwMDA4KTsKKwkmY3B1aWQJKCk7CisJJm1vdnoJKCJlc2kiLCZMQigiZWN4IikpOwkjIG51bWJlciBvZiBjb3JlcyAtIDEKKwkmaW5jCSgiZXNpIik7CQkjIG51bWJlciBvZiBjb3JlcworCisJJm1vdgkoImVheCIsMSk7CisJJnhvcgkoImVjeCIsImVjeCIpOworCSZjcHVpZAkoKTsKKwkmYnQJKCJlZHgiLDI4KTsKKwkmam5jCSgmbGFiZWwoImdlbmVyaWMiKSk7CisJJnNocgkoImVieCIsMTYpOworCSZhbmQJKCJlYngiLDB4ZmYpOworCSZjbXAJKCJlYngiLCJlc2kiKTsKKwkmamEJKCZsYWJlbCgiZ2VuZXJpYyIpKTsKKwkmYW5kCSgiZWR4IiwweGVmZmZmZmZmKTsJIyBjbGVhciBoeXBlci10aHJlYWRpbmcgYml0CisJJmptcAkoJmxhYmVsKCJnZW5lcmljIikpOworCQorJnNldF9sYWJlbCgiaW50ZWwiKTsKKwkmY21wCSgiZWRpIiw3KTsKKwkmamIJKCZsYWJlbCgiY2FjaGVpbmZvIikpOworCisJJm1vdgkoImVzaSIsJndwYXJhbSgwKSk7CisJJm1vdgkoImVheCIsNyk7CisJJnhvcgkoImVjeCIsImVjeCIpOworCSZjcHVpZAkoKTsKKwkmbW92CSgmRFdQKDgsImVzaSIpLCJlYngiKTsKKworJnNldF9sYWJlbCgiY2FjaGVpbmZvIik7CisJJmNtcAkoImVkaSIsNCk7CisJJm1vdgkoImVkaSIsLTEpOworCSZqYgkoJmxhYmVsKCJub2NhY2hlaW5mbyIpKTsKKworCSZtb3YJKCJlYXgiLDQpOworCSZtb3YJKCJlY3giLDApOwkJIyBxdWVyeSBMMUQKKwkmY3B1aWQJKCk7CisJJm1vdgkoImVkaSIsImVheCIpOworCSZzaHIJKCJlZGkiLDE0KTsKKwkmYW5kCSgiZWRpIiwweGZmZik7CQkjIG51bWJlciBvZiBjb3JlcyAtMSBwZXIgTDFECisKKyZzZXRfbGFiZWwoIm5vY2FjaGVpbmZvIik7CisJJm1vdgkoImVheCIsMSk7CisJJnhvcgkoImVjeCIsImVjeCIpOworCSZjcHVpZAkoKTsKKwkmYW5kCSgiZWR4IiwweGJmZWZmZmZmKTsJIyBmb3JjZSByZXNlcnZlZCBiaXRzICMyMCwgIzMwIHRvIDAKKwkmY21wCSgiZWJwIiwwKTsKKwkmam5lCSgmbGFiZWwoIm5vdGludGVsIikpOworCSZvcgkoImVkeCIsMTw8MzApOwkJIyBzZXQgcmVzZXJ2ZWQgYml0IzMwIG9uIEludGVsIENQVXMKKyZzZXRfbGFiZWwoIm5vdGludGVsIik7CisJJmJ0CSgiZWR4IiwyOCk7CQkjIHRlc3QgaHlwZXItdGhyZWFkaW5nIGJpdAorCSZqbmMJKCZsYWJlbCgiZ2VuZXJpYyIpKTsKKwkmYW5kCSgiZWR4IiwweGVmZmZmZmZmKTsKKwkmY21wCSgiZWRpIiwwKTsKKwkmamUJKCZsYWJlbCgiZ2VuZXJpYyIpKTsKKworCSZvcgkoImVkeCIsMHgxMDAwMDAwMCk7CisJJnNocgkoImVieCIsMTYpOworCSZjbXAJKCZMQigiZWJ4IiksMSk7CisJJmphCSgmbGFiZWwoImdlbmVyaWMiKSk7CisJJmFuZAkoImVkeCIsMHhlZmZmZmZmZik7CSMgY2xlYXIgaHlwZXItdGhyZWFkaW5nIGJpdCBpZiBub3QKKworJnNldF9sYWJlbCgiZ2VuZXJpYyIpOworCSZhbmQJKCJlYnAiLDE8PDExKTsJCSMgaXNvbGF0ZSBBTUQgWE9QIGZsYWcKKwkmYW5kCSgiZWN4IiwweGZmZmZmN2ZmKTsJIyBmb3JjZSAxMXRoIGJpdCB0byAwCisJJm1vdgkoImVzaSIsImVkeCIpOworCSZvcgkoImVicCIsImVjeCIpOwkJIyBtZXJnZSBBTUQgWE9QIGZsYWcKKworCSZidAkoImVjeCIsMjcpOwkJIyBjaGVjayBPU1hTQVZFIGJpdAorCSZqbmMJKCZsYWJlbCgiY2xlYXJfYXZ4IikpOworCSZ4b3IJKCJlY3giLCJlY3giKTsKKwkmZGF0YV9ieXRlKDB4MGYsMHgwMSwweGQwKTsJIyB4Z2V0YnYKKwkmYW5kCSgiZWF4Iiw2KTsKKwkmY21wCSgiZWF4Iiw2KTsKKwkmamUJKCZsYWJlbCgiZG9uZSIpKTsKKwkmY21wCSgiZWF4IiwyKTsKKwkmamUJKCZsYWJlbCgiY2xlYXJfYXZ4IikpOworJnNldF9sYWJlbCgiY2xlYXJfeG1tIik7CisJJmFuZAkoImVicCIsMHhmZGZmZmZmZCk7CSMgY2xlYXIgQUVTTkkgYW5kIFBDTE1VTFFEUSBiaXRzCisJJmFuZAkoImVzaSIsMHhmZWZmZmZmZik7CSMgY2xlYXIgRlhTUgorJnNldF9sYWJlbCgiY2xlYXJfYXZ4Iik7CisJJmFuZAkoImVicCIsMHhlZmZmZTdmZik7CSMgY2xlYXIgQVZYLCBGTUEgYW5kIEFNRCBYT1AgYml0cworCSZtb3YJKCJlZGkiLCZ3cGFyYW0oMCkpOworCSZhbmQJKCZEV1AoOCwiZWRpIiksMHhmZmZmZmZkZik7CSMgY2xlYXIgQVZYMgorJnNldF9sYWJlbCgiZG9uZSIpOworCSZtb3YJKCJlYXgiLCJlc2kiKTsKKwkmbW92CSgiZWR4IiwiZWJwIik7Cismc2V0X2xhYmVsKCJub2NwdWlkIik7CismZnVuY3Rpb25fZW5kKCJPUEVOU1NMX2lhMzJfY3B1aWQiKTsKKworJmV4dGVybmFsX2xhYmVsKCJPUEVOU1NMX2lhMzJjYXBfUCIpOworCismZnVuY3Rpb25fYmVnaW5fQigiT1BFTlNTTF9yZHRzYyIsIkVYVFJOXHRfT1BFTlNTTF9pYTMyY2FwX1A6RFdPUkQiKTsKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CisJJnhvcgkoImVkeCIsImVkeCIpOworCSZwaWNtZXVwKCJlY3giLCJPUEVOU1NMX2lhMzJjYXBfUCIpOworCSZidAkoJkRXUCgwLCJlY3giKSw0KTsKKwkmam5jCSgmbGFiZWwoIm5vdHNjIikpOworCSZyZHRzYwkoKTsKKyZzZXRfbGFiZWwoIm5vdHNjIik7CisJJnJldAkoKTsKKyZmdW5jdGlvbl9lbmRfQigiT1BFTlNTTF9yZHRzYyIpOworCisjIFRoaXMgd29ya3MgaW4gUmluZyAwIG9ubHkgW3JlYWQgREpHUFArTVMtRE9TK3ByaXZpbGVnZWQgRFBNSSBob3N0XSwKKyMgYnV0IGl0J3Mgc2FmZSB0byBjYWxsIGl0IG9uIGFueSBbc3VwcG9ydGVkXSAzMi1iaXQgcGxhdGZvcm0uLi4KKyMgSnVzdCBjaGVjayBmb3IgW25vbi1demVybyByZXR1cm4gdmFsdWUuLi4KKyZmdW5jdGlvbl9iZWdpbl9CKCJPUEVOU1NMX2luc3RydW1lbnRfaGFsdCIsIkVYVFJOXHRfT1BFTlNTTF9pYTMyY2FwX1A6RFdPUkQiKTsKKwkmcGljbWV1cCgiZWN4IiwiT1BFTlNTTF9pYTMyY2FwX1AiKTsKKwkmYnQJKCZEV1AoMCwiZWN4IiksNCk7CisJJmpuYwkoJmxhYmVsKCJub2hhbHQiKSk7CSMgbm8gVFNDCisKKwkmZGF0YV93b3JkKDB4OTA1ODkwMGUpOwkJIyBwdXNoICVjczsgcG9wICVlYXgKKwkmYW5kCSgiZWF4IiwzKTsKKwkmam56CSgmbGFiZWwoIm5vaGFsdCIpKTsJIyBub3QgZW5vdWdoIHByaXZpbGVnZXMKKworCSZwdXNoZgkoKTsKKwkmcG9wCSgiZWF4Iik7CisJJmJ0CSgiZWF4Iiw5KTsKKwkmam5jCSgmbGFiZWwoIm5vaGFsdCIpKTsJIyBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorCisJJnJkdHNjCSgpOworCSZwdXNoCSgiZWR4Iik7CisJJnB1c2gJKCJlYXgiKTsKKwkmaGFsdAkoKTsKKwkmcmR0c2MJKCk7CisKKwkmc3ViCSgiZWF4IiwmRFdQKDAsImVzcCIpKTsKKwkmc2JiCSgiZWR4IiwmRFdQKDQsImVzcCIpKTsKKwkmYWRkCSgiZXNwIiw4KTsKKwkmcmV0CSgpOworCismc2V0X2xhYmVsKCJub2hhbHQiKTsKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CisJJnhvcgkoImVkeCIsImVkeCIpOworCSZyZXQJKCk7CismZnVuY3Rpb25fZW5kX0IoIk9QRU5TU0xfaW5zdHJ1bWVudF9oYWx0Iik7CisKKyMgRXNzZW50aWFsbHkgdGhlcmUgaXMgb25seSBvbmUgdXNlIGZvciB0aGlzIGZ1bmN0aW9uLiBVbmRlciBESkdQUDoKKyMKKyMJI2luY2x1ZGUgPGdvMzIuaD4KKyMJLi4uCisjCWk9T1BFTlNTTF9mYXJfc3BpbihfZG9zX2RzLDB4NDZjKTsKKyMJLi4uCisjIHRvIG9idGFpbiB0aGUgbnVtYmVyIG9mIHNwaW5zIHRpbGwgY2xvc2VzdCB0aW1lciBpbnRlcnJ1cHQuCisKKyZmdW5jdGlvbl9iZWdpbl9CKCJPUEVOU1NMX2Zhcl9zcGluIik7CisJJnB1c2hmCSgpOworCSZwb3AJKCJlYXgiKTsKKwkmYnQJKCJlYXgiLDkpOworCSZqbmMJKCZsYWJlbCgibm9zcGluIikpOwkjIGludGVycnVwdHMgYXJlIGRpc2FibGVkCisKKwkmbW92CSgiZWF4IiwmRFdQKDQsImVzcCIpKTsKKwkmbW92CSgiZWN4IiwmRFdQKDgsImVzcCIpKTsKKwkmZGF0YV93b3JkICgweDkwZDg4ZTFlKTsJIyBwdXNoICVkcywgbW92ICVlYXgsJWRzCisJJnhvcgkoImVheCIsImVheCIpOworCSZtb3YJKCJlZHgiLCZEV1AoMCwiZWN4IikpOworCSZqbXAJKCZsYWJlbCgic3BpbiIpKTsKKworCSZhbGlnbgkoMTYpOworJnNldF9sYWJlbCgic3BpbiIpOworCSZpbmMJKCJlYXgiKTsKKwkmY21wCSgiZWR4IiwmRFdQKDAsImVjeCIpKTsKKwkmamUJKCZsYWJlbCgic3BpbiIpKTsKKworCSZkYXRhX3dvcmQgKDB4MWY5MDkwOTApOwkjIHBvcAklZHMKKwkmcmV0CSgpOworCismc2V0X2xhYmVsKCJub3NwaW4iKTsKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CisJJnhvcgkoImVkeCIsImVkeCIpOworCSZyZXQJKCk7CismZnVuY3Rpb25fZW5kX0IoIk9QRU5TU0xfZmFyX3NwaW4iKTsKKworJmZ1bmN0aW9uX2JlZ2luX0IoIk9QRU5TU0xfd2lwZV9jcHUiLCJFWFRSTlx0X09QRU5TU0xfaWEzMmNhcF9QOkRXT1JEIik7CisJJnhvcgkoImVheCIsImVheCIpOworCSZ4b3IJKCJlZHgiLCJlZHgiKTsKKwkmcGljbWV1cCgiZWN4IiwiT1BFTlNTTF9pYTMyY2FwX1AiKTsKKwkmbW92CSgiZWN4IiwmRFdQKDAsImVjeCIpKTsKKwkmYnQJKCZEV1AoMCwiZWN4IiksMSk7CisJJmpuYwkoJmxhYmVsKCJub194ODciKSk7CisJaWYgKCRzc2UyKSB7CisJCSZhbmQJKCJlY3giLDE8PDI2fDE8PDI0KTsJIyBjaGVjayBTU0UyIGFuZCBGWFNSIGJpdHMKKwkJJmNtcAkoImVjeCIsMTw8MjZ8MTw8MjQpOworCQkmam5lCSgmbGFiZWwoIm5vX3NzZTIiKSk7CisJCSZweG9yCSgieG1tMCIsInhtbTAiKTsKKwkJJnB4b3IJKCJ4bW0xIiwieG1tMSIpOworCQkmcHhvcgkoInhtbTIiLCJ4bW0yIik7CisJCSZweG9yCSgieG1tMyIsInhtbTMiKTsKKwkJJnB4b3IJKCJ4bW00IiwieG1tNCIpOworCQkmcHhvcgkoInhtbTUiLCJ4bW01Iik7CisJCSZweG9yCSgieG1tNiIsInhtbTYiKTsKKwkJJnB4b3IJKCJ4bW03IiwieG1tNyIpOworCSZzZXRfbGFiZWwoIm5vX3NzZTIiKTsKKwl9CisJIyBqdXN0IGEgYnVuY2ggb2YgZmxkeiB0byB6YXAgdGhlIGZwL21tIGJhbmsgZm9sbG93ZWQgYnkgZmluaXQuLi4KKwkmZGF0YV93b3JkKDB4ZWVkOWVlZDksMHhlZWQ5ZWVkOSwweGVlZDllZWQ5LDB4ZWVkOWVlZDksMHg5MGUzZGI5Yik7Cismc2V0X2xhYmVsKCJub194ODciKTsKKwkmbGVhCSgiZWF4IiwmRFdQKDQsImVzcCIpKTsKKwkmcmV0CSgpOworJmZ1bmN0aW9uX2VuZF9CKCJPUEVOU1NMX3dpcGVfY3B1Iik7CisKKyZmdW5jdGlvbl9iZWdpbl9CKCJPUEVOU1NMX2F0b21pY19hZGQiKTsKKwkmbW92CSgiZWR4IiwmRFdQKDQsImVzcCIpKTsJIyBmZXRjaCB0aGUgcG9pbnRlciwgMXN0IGFyZworCSZtb3YJKCJlY3giLCZEV1AoOCwiZXNwIikpOwkjIGZldGNoIHRoZSBpbmNyZW1lbnQsIDJuZCBhcmcKKwkmcHVzaAkoImVieCIpOworCSZub3AJKCk7CisJJm1vdgkoImVheCIsJkRXUCgwLCJlZHgiKSk7Cismc2V0X2xhYmVsKCJzcGluIik7CisJJmxlYQkoImVieCIsJkRXUCgwLCJlYXgiLCJlY3giKSk7CisJJm5vcAkoKTsKKwkmZGF0YV93b3JkKDB4MWFiMTBmZjApOwkjIGxvY2s7CWNtcHhjaGcJJWVieCwoJWVkeCkJIyAlZWF4IGlzIGVudm9sdmVkIGFuZCBpcyBhbHdheXMgcmVsb2FkZWQKKwkmam5lCSgmbGFiZWwoInNwaW4iKSk7CisJJm1vdgkoImVheCIsImVieCIpOwkjIE9wZW5TU0wgZXhwZWN0cyB0aGUgbmV3IHZhbHVlCisJJnBvcAkoImVieCIpOworCSZyZXQJKCk7CismZnVuY3Rpb25fZW5kX0IoIk9QRU5TU0xfYXRvbWljX2FkZCIpOworCisjIFRoaXMgZnVuY3Rpb24gY2FuIGJlY29tZSBoYW5keSB1bmRlciBXaW4zMiBpbiBzaXR1YXRpb25zIHdoZW4KKyMgd2UgZG9uJ3Qga25vdyB3aGljaCBjYWxsaW5nIGNvbnZlbnRpb24sIF9fc3RkY2FsbCBvciBfX2NkZWNsKCopLAorIyBpbmRpcmVjdCBjYWxsZWUgaXMgdXNpbmcuIEluIEMgaXQgY2FuIGJlIGRlcGxveWVkIGFzCisjCisjaWZkZWYgT1BFTlNTTF9DUFVJRF9PQkoKKyMJdHlwZSBPUEVOU1NMX2luZGlyZWN0X2NhbGwodm9pZCAqZiwuLi4pOworIwkuLi4KKyMJT1BFTlNTTF9pbmRpcmVjdF9jYWxsKGZ1bmMsW3VwIHRvICRtYXggYXJndW1lbnRzXSk7CisjZW5kaWYKKyMKKyMgKCopCWl0J3MgZGVzaWduZWQgdG8gd29yayBldmVuIGZvciBfX2Zhc3RjYWxsIGlmIG51bWJlciBvZgorIwlhcmd1bWVudHMgaXMgMSBvciAyIQorJmZ1bmN0aW9uX2JlZ2luX0IoIk9QRU5TU0xfaW5kaXJlY3RfY2FsbCIpOworCXsKKwlteSAoJG1heCwkaSk9KDcsKTsJIyAkbWF4IGhhcyB0byBiZSBjaG9zZW4gYXMgNCpuLTEKKwkJCQkjIGluIG9yZGVyIHRvIHByZXNlcnZlIGV2ZW50dWFsCisJCQkJIyBzdGFjayBhbGlnbm1lbnQKKwkmcHVzaAkoImVicCIpOworCSZtb3YJKCJlYnAiLCJlc3AiKTsKKwkmc3ViCSgiZXNwIiwkbWF4KjQpOworCSZtb3YJKCJlY3giLCZEV1AoMTIsImVicCIpKTsKKwkmbW92CSgmRFdQKDAsImVzcCIpLCJlY3giKTsKKwkmbW92CSgiZWR4IiwmRFdQKDE2LCJlYnAiKSk7CisJJm1vdgkoJkRXUCg0LCJlc3AiKSwiZWR4Iik7CisJZm9yKCRpPTI7JGk8JG1heDskaSsrKQorCQl7CisJCSMgU29tZSBjb3BpZXMgd2lsbCBiZSByZWR1bmRhbnQvYm9ndXMuLi4KKwkJJm1vdgkoImVheCIsJkRXUCgxMiskaSo0LCJlYnAiKSk7CisJCSZtb3YJKCZEV1AoMCskaSo0LCJlc3AiKSwiZWF4Iik7CisJCX0KKwkmY2FsbF9wdHIJKCZEV1AoOCwiZWJwIikpOyMgbWFrZSB0aGUgY2FsbC4uLgorCSZtb3YJKCJlc3AiLCJlYnAiKTsJIyAuLi4gYW5kIGp1c3QgcmVzdG9yZSB0aGUgc3RhY2sgcG9pbnRlcgorCQkJCSMgd2l0aG91dCBwYXlpbmcgYXR0ZW50aW9uIHRvIHdoYXQgd2UgY2FsbGVkLAorCQkJCSMgKF9fY2RlY2wgKmZ1bmMpIG9yIChfX3N0ZGNhbGwgKm9uZSkuCisJJnBvcAkoImVicCIpOworCSZyZXQJKCk7CisJfQorJmZ1bmN0aW9uX2VuZF9CKCJPUEVOU1NMX2luZGlyZWN0X2NhbGwiKTsKKworJmZ1bmN0aW9uX2JlZ2luX0IoIk9QRU5TU0xfaWEzMl9yZHJhbmQiKTsKKwkmbW92CSgiZWN4Iiw4KTsKKyZzZXRfbGFiZWwoImxvb3AiKTsKKwkmcmRyYW5kCSgiZWF4Iik7CisJJmpjCSgmbGFiZWwoImJyZWFrIikpOworCSZsb29wCSgmbGFiZWwoImxvb3AiKSk7Cismc2V0X2xhYmVsKCJicmVhayIpOworCSZjbXAJKCJlYXgiLDApOworCSZjbW92ZQkoImVheCIsImVjeCIpOworCSZyZXQJKCk7CismZnVuY3Rpb25fZW5kX0IoIk9QRU5TU0xfaWEzMl9yZHJhbmQiKTsKKworJmhpZGRlbigiT1BFTlNTTF9pYTMyY2FwX1AiKTsKKworJmFzbV9maW5pc2goKTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY3B1LXg4Nl82NC1hc20ucGwgYi9zcmMvY3J5cHRvL2NwdS14ODZfNjQtYXNtLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZDdhNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY3J5cHRvL2NwdS14ODZfNjQtYXNtLnBsCkBAIC0wLDAgKzEsMTYzIEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyRmbGF2b3VyID0gc2hpZnQ7Ciskb3V0cHV0ICA9IHNoaWZ0OworaWYgKCRmbGF2b3VyID1+IC9cLi8pIHsgJG91dHB1dCA9ICRmbGF2b3VyOyB1bmRlZiAkZmxhdm91cjsgfQorCiskd2luNjQ9MDsgJHdpbjY0PTEgaWYgKCRmbGF2b3VyID1+IC9bbm1dYXNtfG1pbmd3NjQvIHx8ICRvdXRwdXQgPX4gL1wuYXNtJC8pOworCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworKCAkeGxhdGU9IiR7ZGlyfXg4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSApIG9yCisoICR4bGF0ZT0iJHtkaXJ9cGVybGFzbS94ODZfNjQteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUpIG9yCitkaWUgImNhbid0IGxvY2F0ZSB4ODZfNjQteGxhdGUucGwiOworCitvcGVuIE9VVCwifCBcIiReWFwiICR4bGF0ZSAkZmxhdm91ciAkb3V0cHV0IjsKKypTVERPVVQ9Kk9VVDsKKworKCRhcmcxLCRhcmcyLCRhcmczLCRhcmc0KT0kd2luNjQ/KCIlcmN4IiwiJXJkeCIsIiVyOCIsICIlcjkiKSA6CSMgV2luNjQgb3JkZXIKKwkJCQkgKCIlcmRpIiwiJXJzaSIsIiVyZHgiLCIlcmN4Iik7CSMgVW5peCBvcmRlcgorCitwcmludDw8X19fOworLnRleHQKKworLmdsb2JsCU9QRU5TU0xfaWEzMl9jcHVpZAorLnR5cGUJT1BFTlNTTF9pYTMyX2NwdWlkLFxAZnVuY3Rpb24sMQorLmFsaWduCTE2CitPUEVOU1NMX2lhMzJfY3B1aWQ6CisJIyBPbiBXaW5kb3dzLCAkYXJnMSBpcyByY3gsIGJ1dCB0aGF0IHdpbGwgYmUgY2xvYmJlcmVkLiBTbyBtYWtlIFdpbmRvd3MKKwkjIHVzZSB0aGUgc2FtZSByZWdpc3RlciBhcyBVbml4LgorCW1vdgkkYXJnMSwlcmRpCisJbW92CSVyYngsJXI4CQkjIHNhdmUgJXJieAorCisJeG9yCSVlYXgsJWVheAorCW1vdgklZWF4LDgoJXJkaSkJCSMgY2xlYXIgM3JkIHdvcmQKKwljcHVpZAorCW1vdgklZWF4LCVyMTFkCQkjIG1heCB2YWx1ZSBmb3Igc3RhbmRhcmQgcXVlcnkgbGV2ZWwKKworCXhvcgklZWF4LCVlYXgKKwljbXAJXCQweDc1NmU2NTQ3LCVlYngJIyAiR2VudSIKKwlzZXRuZQklYWwKKwltb3YJJWVheCwlcjlkCisJY21wCVwkMHg0OTY1NmU2OSwlZWR4CSMgImluZUkiCisJc2V0bmUJJWFsCisJb3IJJWVheCwlcjlkCisJY21wCVwkMHg2YzY1NzQ2ZSwlZWN4CSMgIm50ZWwiCisJc2V0bmUJJWFsCisJb3IJJWVheCwlcjlkCQkjIDAgaW5kaWNhdGVzIEludGVsIENQVQorCWp6CS5MaW50ZWwKKworCWNtcAlcJDB4Njg3NDc1NDEsJWVieAkjICJBdXRoIgorCXNldG5lCSVhbAorCW1vdgklZWF4LCVyMTBkCisJY21wCVwkMHg2OTc0NkU2NSwlZWR4CSMgImVudGkiCisJc2V0bmUJJWFsCisJb3IJJWVheCwlcjEwZAorCWNtcAlcJDB4NDQ0RDQxNjMsJWVjeAkjICJjQU1EIgorCXNldG5lCSVhbAorCW9yCSVlYXgsJXIxMGQJCSMgMCBpbmRpY2F0ZXMgQU1EIENQVQorCWpuegkuTGludGVsCisKKwkjIEFNRCBzcGVjaWZpYworCSMgU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYW1kLmNvbS93b3JkcHJlc3MvbWVkaWEvMjAxMi8xMC8yNTQ4MTEucGRmICgxKQorCisJbW92CVwkMHg4MDAwMDAwMCwlZWF4CisJY3B1aWQKKwkjIFJldHVybnMgIlRoZSBsYXJnZXN0IENQVUlEIGV4dGVuZGVkIGZ1bmN0aW9uIGlucHV0IHZhbHVlIHN1cHBvcnRlZCBieQorCSMgdGhlIHByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbi4iIGluIEVBWC4KKwljbXAJXCQweDgwMDAwMDAxLCVlYXgKKwlqYgkuTGludGVsCisJbW92CSVlYXgsJXIxMGQKKwltb3YJXCQweDgwMDAwMDAxLCVlYXgKKwljcHVpZAorCSMgUmV0dXJucyBmZWF0dXJlIGJpdHMgaW4gRUNYLiBTZWUgcGFnZSAyMCBvZiBbMV0uCisJIyBUT0RPKGZvcmspOiBJIHRoaW5rIHRoaXMgc2hvdWxkIGJlIGEgTU9WLgorCW9yCSVlY3gsJXI5ZAorCWFuZAlcJDB4MDAwMDA4MDEsJXI5ZAkjIGlzb2xhdGUgQU1EIFhPUCBiaXQsIDE8PDExCisKKwljbXAJXCQweDgwMDAwMDA4LCVyMTBkCisJamIJLkxpbnRlbAorCisJbW92CVwkMHg4MDAwMDAwOCwlZWF4CisJY3B1aWQKKwkjIFJldHVybnMgQVBJQyBJRCBhbmQgbnVtYmVyIG9mIGNvcmVzIGluIEVDWC4gU2VlIHBhZ2UgMjcgb2YgWzFdLgorCW1vdnpiCSVjbCwlcjEwCQkjIG51bWJlciBvZiBjb3JlcyAtIDEKKwlpbmMJJXIxMAkJCSMgbnVtYmVyIG9mIGNvcmVzCisKKwltb3YJXCQxLCVlYXgKKwljcHVpZAorCSMgU2VlIHBhZ2UgMTMgb2YgWzFdLgorCWJ0CVwkMjgsJWVkeAkJIyB0ZXN0IGh5cGVyLXRocmVhZGluZyBiaXQKKwlqbmMJLkxnZW5lcmljCisJc2hyCVwkMTYsJWVieAkJIyBudW1iZXIgb2YgbG9naWNhbCBwcm9jZXNzb3JzCisJY21wCSVyMTBiLCVibAorCWphCS5MZ2VuZXJpYworCWFuZAlcJDB4ZWZmZmZmZmYsJWVkeAkjIENsZWFyIGh5cGVyLXRocmVhZGluZyBiaXQuCisJam1wCS5MZ2VuZXJpYworCisuTGludGVsOgorCWNtcAlcJDQsJXIxMWQKKwltb3YJXCQtMSwlcjEwZAorCWpiCS5Mbm9jYWNoZWluZm8KKworCW1vdglcJDQsJWVheAorCW1vdglcJDAsJWVjeAkJIyBxdWVyeSBMMUQKKwljcHVpZAorCW1vdgklZWF4LCVyMTBkCisJc2hyCVwkMTQsJXIxMGQKKwlhbmQJXCQweGZmZiwlcjEwZAkJIyBudW1iZXIgb2YgY29yZXMgLTEgcGVyIEwxRAorCisJY21wCVwkNywlcjExZAorCWpiCS5Mbm9jYWNoZWluZm8KKworCW1vdglcJDcsJWVheAorCXhvcgklZWN4LCVlY3gKKwljcHVpZAorCW1vdgklZWJ4LDgoJXJkaSkKKworLkxub2NhY2hlaW5mbzoKKwltb3YJXCQxLCVlYXgKKwljcHVpZAorCSMgR2V0cyBmZWF0dXJlIGluZm9ybWF0aW9uLiBTZWUgdGFibGUgMy0yMSBpbiB0aGUgSW50ZWwgbWFudWFsLgorCWFuZAlcJDB4YmZlZmZmZmYsJWVkeAkjIGZvcmNlIHJlc2VydmVkIGJpdHMgdG8gMAorCWNtcAlcJDAsJXI5ZAorCWpuZQkuTG5vdGludGVsCisJb3IJXCQweDQwMDAwMDAwLCVlZHgJIyBzZXQgcmVzZXJ2ZWQgYml0IzMwIG9uIEludGVsIENQVXMKKy5Mbm90aW50ZWw6CisJYnQJXCQyOCwlZWR4CQkjIHRlc3QgaHlwZXItdGhyZWFkaW5nIGJpdAorCWpuYwkuTGdlbmVyaWMKKwlhbmQJXCQweGVmZmZmZmZmLCVlZHgJIyB+KDE8PDI4KSAtIGNsZWFyIGh5cGVyLXRocmVhZGluZy4KKwljbXAJXCQwLCVyMTBkCisJamUJLkxnZW5lcmljCisKKwlvcglcJDB4MTAwMDAwMDAsJWVkeAkjIDE8PDI4CisJc2hyCVwkMTYsJWVieAorCWNtcAlcJDEsJWJsCQkJIyBzZWUgaWYgY2FjaGUgaXMgc2hhcmVkCisJamEJLkxnZW5lcmljCisJYW5kCVwkMHhlZmZmZmZmZiwlZWR4CSMgfigxPDwyOCkKKy5MZ2VuZXJpYzoKKwlhbmQJXCQweDAwMDAwODAwLCVyOWQJIyBpc29sYXRlIEFNRCBYT1AgZmxhZworCWFuZAlcJDB4ZmZmZmY3ZmYsJWVjeAorCW9yCSVlY3gsJXI5ZAkJIyBtZXJnZSBBTUQgWE9QIGZsYWcKKworCW1vdgklZWR4LCVyMTBkCQkjICVyOWQ6JXIxMGQgaXMgY29weSBvZiAlZWN4OiVlZHgKKwlidAlcJDI3LCVyOWQJCSMgY2hlY2sgT1NYU0FWRSBiaXQKKwlqbmMJLkxjbGVhcl9hdngKKwl4b3IJJWVjeCwlZWN4CQkjIFhDUjAKKwkuYnl0ZQkweDBmLDB4MDEsMHhkMAkJIyB4Z2V0YnYKKwlhbmQJXCQ2LCVlYXgJCSMgaXNvbGF0ZSBYTU0gYW5kIFlNTSBzdGF0ZSBzdXBwb3J0CisJY21wCVwkNiwlZWF4CisJamUJLkxkb25lCisuTGNsZWFyX2F2eDoKKwltb3YJXCQweGVmZmZlN2ZmLCVlYXgJIyB+KDE8PDI4fDE8PDEyfDE8PDExKQorCWFuZAklZWF4LCVyOWQJCSMgY2xlYXIgQVZYLCBGTUEgYW5kIEFNRCBYT1AgYml0cworCWFuZGwJXCQweGZmZmZmZmRmLDgoJXJkaSkJIyBjbGVheCBBVlgyLCB+KDE8PDUpCisuTGRvbmU6CisJbW92bAklcjlkLDQoJXJkaSkKKwltb3ZsCSVyMTBkLDAoJXJkaSkKKwltb3YJJXI4LCVyYngJCSMgcmVzdG9yZSAlcmJ4CisJcmV0Cisuc2l6ZQlPUEVOU1NMX2lhMzJfY3B1aWQsLi1PUEVOU1NMX2lhMzJfY3B1aWQKKworX19fCisKK2Nsb3NlIFNURE9VVDsJIyBmbHVzaApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9jcnlwdG8uYyBiL3NyYy9jcnlwdG8vY3J5cHRvLmMKaW5kZXggMzRkMDRiNC4uZDliYjA3ZSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jcnlwdG8uYworKysgYi9zcmMvY3J5cHRvL2NyeXB0by5jCkBAIC01NSw3ICs1NSw3IEBACiB1aW50MzJfdCBPUEVOU1NMX2lhMzJjYXBfUFs0XSA9IHswfTsKICNlbGlmIGRlZmluZWQoT1BFTlNTTF9BUk0pIHx8IGRlZmluZWQoT1BFTlNTTF9BQVJDSDY0KQogCi0jaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorI2luY2x1ZGUgImFybV9hcmNoLmgiCiAKICNpZiBkZWZpbmVkKF9fQVJNX05FT05fXykKIHVpbnQzMl90IE9QRU5TU0xfYXJtY2FwX1AgPSBBUk1WN19ORU9OIHwgQVJNVjdfTkVPTl9GVU5DVElPTkFMOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9kZXMvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2Rlcy9DTWFrZUxpc3RzLnR4dAppbmRleCBmNjFmYTE0Li43ZDQ5ZmYzIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Rlcy9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL2Rlcy9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgZGVzCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Rlcy9kZXMuYyBiL3NyYy9jcnlwdG8vZGVzL2Rlcy5jCmluZGV4IGE1NjY5YTYuLjljZDc1ZjUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZGVzL2Rlcy5jCisrKyBiL3NyYy9jcnlwdG8vZGVzL2Rlcy5jCkBAIC0yOTgsOCArMjk4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMH07CiAgIHVpbnQzMl90IGMsIGQsIHQsIHMsIHQyOwogICBjb25zdCB1aW50OF90ICppbjsKKyAgdWludDMyX3QgKms7CiAgIGludCBpOwogCisgIGsgPSAmc2NoZWR1bGUtPmtzLT5kZXNsb25nWzBdOwogICBpbiA9IGtleS0+Ynl0ZXM7CiAKICAgYzJsKGluLCBjKTsKQEAgLTM0MiwxMCArMzQ0LDEwIEBACiAKICAgICAvKiB0YWJsZSBjb250YWluZWQgMDIxMyA0NjU3ICovCiAgICAgdDIgPSAoKHQgPDwgMTZMKSB8IChzICYgMHgwMDAwZmZmZkwpKSAmIDB4ZmZmZmZmZmZMOwotICAgIHNjaGVkdWxlLT5zdWJrZXlzW2ldWzBdID0gUk9UQVRFKHQyLCAzMCkgJiAweGZmZmZmZmZmTDsKKyAgICAqKGsrKykgPSBST1RBVEUodDIsIDMwKSAmIDB4ZmZmZmZmZmZMOwogCiAgICAgdDIgPSAoKHMgPj4gMTZMKSB8ICh0ICYgMHhmZmZmMDAwMEwpKTsKLSAgICBzY2hlZHVsZS0+c3Via2V5c1tpXVsxXSA9IFJPVEFURSh0MiwgMjYpICYgMHhmZmZmZmZmZkw7CisgICAgKihrKyspID0gUk9UQVRFKHQyLCAyNikgJiAweGZmZmZmZmZmTDsKICAgfQogfQogCkBAIC0zODAsNiArMzgyLDcgQEAKIAogc3RhdGljIHZvaWQgREVTX2VuY3J5cHQxKHVpbnQzMl90ICpkYXRhLCBjb25zdCBERVNfa2V5X3NjaGVkdWxlICprcywgaW50IGVuYykgewogICB1aW50MzJfdCBsLCByLCB0LCB1OworICBjb25zdCB1aW50MzJfdCAqczsKIAogICByID0gZGF0YVswXTsKICAgbCA9IGRhdGFbMV07CkBAIC0zOTUsNDIgKzM5OCw0MyBAQAogICByID0gUk9UQVRFKHIsIDI5KSAmIDB4ZmZmZmZmZmZMOwogICBsID0gUk9UQVRFKGwsIDI5KSAmIDB4ZmZmZmZmZmZMOwogCisgIHMgPSBrcy0+a3MtPmRlc2xvbmc7CiAgIC8qIEkgZG9uJ3Qga25vdyBpZiBpdCBpcyB3b3J0aCB0aGUgZWZmb3J0IG9mIGxvb3AgdW5yb2xsaW5nIHRoZQogICAgKiBpbm5lciBsb29wICovCiAgIGlmIChlbmMpIHsKLSAgICBEX0VOQ1JZUFQoa3MsIGwsIHIsIDApOwotICAgIERfRU5DUllQVChrcywgciwgbCwgMSk7Ci0gICAgRF9FTkNSWVBUKGtzLCBsLCByLCAyKTsKLSAgICBEX0VOQ1JZUFQoa3MsIHIsIGwsIDMpOwotICAgIERfRU5DUllQVChrcywgbCwgciwgNCk7Ci0gICAgRF9FTkNSWVBUKGtzLCByLCBsLCA1KTsKLSAgICBEX0VOQ1JZUFQoa3MsIGwsIHIsIDYpOwotICAgIERfRU5DUllQVChrcywgciwgbCwgNyk7Ci0gICAgRF9FTkNSWVBUKGtzLCBsLCByLCA4KTsKLSAgICBEX0VOQ1JZUFQoa3MsIHIsIGwsIDkpOwotICAgIERfRU5DUllQVChrcywgbCwgciwgMTApOwotICAgIERfRU5DUllQVChrcywgciwgbCwgMTEpOwotICAgIERfRU5DUllQVChrcywgbCwgciwgMTIpOwotICAgIERfRU5DUllQVChrcywgciwgbCwgMTMpOwotICAgIERfRU5DUllQVChrcywgbCwgciwgMTQpOwotICAgIERfRU5DUllQVChrcywgciwgbCwgMTUpOworICAgIERfRU5DUllQVChsLCByLCAwKTsgIC8qICAxICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDIpOyAgLyogIDIgKi8KKyAgICBEX0VOQ1JZUFQobCwgciwgNCk7ICAvKiAgMyAqLworICAgIERfRU5DUllQVChyLCBsLCA2KTsgIC8qICA0ICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDgpOyAgLyogIDUgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMTApOyAvKiAgNiAqLworICAgIERfRU5DUllQVChsLCByLCAxMik7IC8qICA3ICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDE0KTsgLyogIDggKi8KKyAgICBEX0VOQ1JZUFQobCwgciwgMTYpOyAvKiAgOSAqLworICAgIERfRU5DUllQVChyLCBsLCAxOCk7IC8qICAxMCAqLworICAgIERfRU5DUllQVChsLCByLCAyMCk7IC8qICAxMSAqLworICAgIERfRU5DUllQVChyLCBsLCAyMik7IC8qICAxMiAqLworICAgIERfRU5DUllQVChsLCByLCAyNCk7IC8qICAxMyAqLworICAgIERfRU5DUllQVChyLCBsLCAyNik7IC8qICAxNCAqLworICAgIERfRU5DUllQVChsLCByLCAyOCk7IC8qICAxNSAqLworICAgIERfRU5DUllQVChyLCBsLCAzMCk7IC8qICAxNiAqLwogICB9IGVsc2UgewotICAgIERfRU5DUllQVChrcywgbCwgciwgMTUpOwotICAgIERfRU5DUllQVChrcywgciwgbCwgMTQpOwotICAgIERfRU5DUllQVChrcywgbCwgciwgMTMpOwotICAgIERfRU5DUllQVChrcywgciwgbCwgMTIpOwotICAgIERfRU5DUllQVChrcywgbCwgciwgMTEpOwotICAgIERfRU5DUllQVChrcywgciwgbCwgMTApOwotICAgIERfRU5DUllQVChrcywgbCwgciwgOSk7Ci0gICAgRF9FTkNSWVBUKGtzLCByLCBsLCA4KTsKLSAgICBEX0VOQ1JZUFQoa3MsIGwsIHIsIDcpOwotICAgIERfRU5DUllQVChrcywgciwgbCwgNik7Ci0gICAgRF9FTkNSWVBUKGtzLCBsLCByLCA1KTsKLSAgICBEX0VOQ1JZUFQoa3MsIHIsIGwsIDQpOwotICAgIERfRU5DUllQVChrcywgbCwgciwgMyk7Ci0gICAgRF9FTkNSWVBUKGtzLCByLCBsLCAyKTsKLSAgICBEX0VOQ1JZUFQoa3MsIGwsIHIsIDEpOwotICAgIERfRU5DUllQVChrcywgciwgbCwgMCk7CisgICAgRF9FTkNSWVBUKGwsIHIsIDMwKTsgLyogMTYgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMjgpOyAvKiAxNSAqLworICAgIERfRU5DUllQVChsLCByLCAyNik7IC8qIDE0ICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDI0KTsgLyogMTMgKi8KKyAgICBEX0VOQ1JZUFQobCwgciwgMjIpOyAvKiAxMiAqLworICAgIERfRU5DUllQVChyLCBsLCAyMCk7IC8qIDExICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDE4KTsgLyogMTAgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMTYpOyAvKiAgOSAqLworICAgIERfRU5DUllQVChsLCByLCAxNCk7IC8qICA4ICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDEyKTsgLyogIDcgKi8KKyAgICBEX0VOQ1JZUFQobCwgciwgMTApOyAvKiAgNiAqLworICAgIERfRU5DUllQVChyLCBsLCA4KTsgIC8qICA1ICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDYpOyAgLyogIDQgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgNCk7ICAvKiAgMyAqLworICAgIERfRU5DUllQVChsLCByLCAyKTsgIC8qICAyICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDApOyAgLyogIDEgKi8KICAgfQogCiAgIC8qIHJvdGF0ZSBhbmQgY2xlYXIgdGhlIHRvcCBiaXRzIG9uIG1hY2hpbmVzIHdpdGggOGJ5dGUgbG9uZ3MgKi8KQEAgLTQ0NCw2ICs0NDgsNyBAQAogCiBzdGF0aWMgdm9pZCBERVNfZW5jcnlwdDIodWludDMyX3QgKmRhdGEsIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKmtzLCBpbnQgZW5jKSB7CiAgIHVpbnQzMl90IGwsIHIsIHQsIHU7CisgIGNvbnN0IHVpbnQzMl90ICpzOwogCiAgIHIgPSBkYXRhWzBdOwogICBsID0gZGF0YVsxXTsKQEAgLTQ1Nyw1MSArNDYyLDUyIEBACiAgIHIgPSBST1RBVEUociwgMjkpICYgMHhmZmZmZmZmZkw7CiAgIGwgPSBST1RBVEUobCwgMjkpICYgMHhmZmZmZmZmZkw7CiAKKyAgcyA9IGtzLT5rcy0+ZGVzbG9uZzsKICAgLyogSSBkb24ndCBrbm93IGlmIGl0IGlzIHdvcnRoIHRoZSBlZmZvcnQgb2YgbG9vcCB1bnJvbGxpbmcgdGhlCiAgICAqIGlubmVyIGxvb3AgKi8KICAgaWYgKGVuYykgewotICAgIERfRU5DUllQVChrcywgbCwgciwgMCk7Ci0gICAgRF9FTkNSWVBUKGtzLCByLCBsLCAxKTsKLSAgICBEX0VOQ1JZUFQoa3MsIGwsIHIsIDIpOwotICAgIERfRU5DUllQVChrcywgciwgbCwgMyk7Ci0gICAgRF9FTkNSWVBUKGtzLCBsLCByLCA0KTsKLSAgICBEX0VOQ1JZUFQoa3MsIHIsIGwsIDUpOwotICAgIERfRU5DUllQVChrcywgbCwgciwgNik7Ci0gICAgRF9FTkNSWVBUKGtzLCByLCBsLCA3KTsKLSAgICBEX0VOQ1JZUFQoa3MsIGwsIHIsIDgpOwotICAgIERfRU5DUllQVChrcywgciwgbCwgOSk7Ci0gICAgRF9FTkNSWVBUKGtzLCBsLCByLCAxMCk7Ci0gICAgRF9FTkNSWVBUKGtzLCByLCBsLCAxMSk7Ci0gICAgRF9FTkNSWVBUKGtzLCBsLCByLCAxMik7Ci0gICAgRF9FTkNSWVBUKGtzLCByLCBsLCAxMyk7Ci0gICAgRF9FTkNSWVBUKGtzLCBsLCByLCAxNCk7Ci0gICAgRF9FTkNSWVBUKGtzLCByLCBsLCAxNSk7CisgICAgRF9FTkNSWVBUKGwsIHIsIDApOyAgLyogIDEgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMik7ICAvKiAgMiAqLworICAgIERfRU5DUllQVChsLCByLCA0KTsgIC8qICAzICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDYpOyAgLyogIDQgKi8KKyAgICBEX0VOQ1JZUFQobCwgciwgOCk7ICAvKiAgNSAqLworICAgIERfRU5DUllQVChyLCBsLCAxMCk7IC8qICA2ICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDEyKTsgLyogIDcgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMTQpOyAvKiAgOCAqLworICAgIERfRU5DUllQVChsLCByLCAxNik7IC8qICA5ICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDE4KTsgLyogIDEwICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDIwKTsgLyogIDExICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDIyKTsgLyogIDEyICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDI0KTsgLyogIDEzICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDI2KTsgLyogIDE0ICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDI4KTsgLyogIDE1ICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDMwKTsgLyogIDE2ICovCiAgIH0gZWxzZSB7Ci0gICAgRF9FTkNSWVBUKGtzLCBsLCByLCAxNSk7Ci0gICAgRF9FTkNSWVBUKGtzLCByLCBsLCAxNCk7Ci0gICAgRF9FTkNSWVBUKGtzLCBsLCByLCAxMyk7Ci0gICAgRF9FTkNSWVBUKGtzLCByLCBsLCAxMik7Ci0gICAgRF9FTkNSWVBUKGtzLCBsLCByLCAxMSk7Ci0gICAgRF9FTkNSWVBUKGtzLCByLCBsLCAxMCk7Ci0gICAgRF9FTkNSWVBUKGtzLCBsLCByLCA5KTsKLSAgICBEX0VOQ1JZUFQoa3MsIHIsIGwsIDgpOwotICAgIERfRU5DUllQVChrcywgbCwgciwgNyk7Ci0gICAgRF9FTkNSWVBUKGtzLCByLCBsLCA2KTsKLSAgICBEX0VOQ1JZUFQoa3MsIGwsIHIsIDUpOwotICAgIERfRU5DUllQVChrcywgciwgbCwgNCk7Ci0gICAgRF9FTkNSWVBUKGtzLCBsLCByLCAzKTsKLSAgICBEX0VOQ1JZUFQoa3MsIHIsIGwsIDIpOwotICAgIERfRU5DUllQVChrcywgbCwgciwgMSk7Ci0gICAgRF9FTkNSWVBUKGtzLCByLCBsLCAwKTsKKyAgICBEX0VOQ1JZUFQobCwgciwgMzApOyAvKiAxNiAqLworICAgIERfRU5DUllQVChyLCBsLCAyOCk7IC8qIDE1ICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDI2KTsgLyogMTQgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMjQpOyAvKiAxMyAqLworICAgIERfRU5DUllQVChsLCByLCAyMik7IC8qIDEyICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDIwKTsgLyogMTEgKi8KKyAgICBEX0VOQ1JZUFQobCwgciwgMTgpOyAvKiAxMCAqLworICAgIERfRU5DUllQVChyLCBsLCAxNik7IC8qICA5ICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDE0KTsgLyogIDggKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMTIpOyAvKiAgNyAqLworICAgIERfRU5DUllQVChsLCByLCAxMCk7IC8qICA2ICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDgpOyAgLyogIDUgKi8KKyAgICBEX0VOQ1JZUFQobCwgciwgNik7ICAvKiAgNCAqLworICAgIERfRU5DUllQVChyLCBsLCA0KTsgIC8qICAzICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDIpOyAgLyogIDIgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMCk7ICAvKiAgMSAqLwogICB9CiAgIC8qIHJvdGF0ZSBhbmQgY2xlYXIgdGhlIHRvcCBiaXRzIG9uIG1hY2hpbmVzIHdpdGggOGJ5dGUgbG9uZ3MgKi8KICAgZGF0YVswXSA9IFJPVEFURShsLCAzKSAmIDB4ZmZmZmZmZmZMOwogICBkYXRhWzFdID0gUk9UQVRFKHIsIDMpICYgMHhmZmZmZmZmZkw7CiB9CiAKLS8qIERFU19lbmNyeXB0MyBpcyBub3Qgc3RhdGljIGJlY2F1c2UgaXQncyB1c2VkIGluIGRlY3JlcGl0LiAqLwotdm9pZCBERVNfZW5jcnlwdDModWludDMyX3QgKmRhdGEsIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKmtzMSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKmtzMiwgY29uc3QgREVTX2tleV9zY2hlZHVsZSAqa3MzKSB7CitzdGF0aWMgdm9pZCBERVNfZW5jcnlwdDModWludDMyX3QgKmRhdGEsIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKmtzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBERVNfa2V5X3NjaGVkdWxlICprczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREVTX2tleV9zY2hlZHVsZSAqa3MzKSB7CiAgIHVpbnQzMl90IGwsIHI7CiAKICAgbCA9IGRhdGFbMF07CkBAIC01MTksOSArNTI1LDkgQEAKICAgZGF0YVsxXSA9IHI7CiB9CiAKLS8qIERFU19kZWNyeXB0MyBpcyBub3Qgc3RhdGljIGJlY2F1c2UgaXQncyB1c2VkIGluIGRlY3JlcGl0LiAqLwotdm9pZCBERVNfZGVjcnlwdDModWludDMyX3QgKmRhdGEsIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKmtzMSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKmtzMiwgY29uc3QgREVTX2tleV9zY2hlZHVsZSAqa3MzKSB7CitzdGF0aWMgdm9pZCBERVNfZGVjcnlwdDModWludDMyX3QgKmRhdGEsIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKmtzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBERVNfa2V5X3NjaGVkdWxlICprczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREVTX2tleV9zY2hlZHVsZSAqa3MzKSB7CiAgIHVpbnQzMl90IGwsIHI7CiAKICAgbCA9IGRhdGFbMF07CkBAIC03NjQsMTAgKzc3MCwzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmMpIHsKICAgREVTX2VkZTNfY2JjX2VuY3J5cHQoaW4sIG91dCwgbGVuLCBrczEsIGtzMiwga3MxLCBpdmVjLCBlbmMpOwogfQotCi0KLS8qIERlcHJlY2F0ZWQgZnVuY3Rpb25zLiAqLwotCi12b2lkIERFU19zZXRfa2V5X3VuY2hlY2tlZChjb25zdCBERVNfY2Jsb2NrICprZXksIERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlKSB7Ci0gIERFU19zZXRfa2V5KGtleSwgc2NoZWR1bGUpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9kZXMvaW50ZXJuYWwuaCBiL3NyYy9jcnlwdG8vZGVzL2ludGVybmFsLmgKaW5kZXggOTE1NTlmZi4uZDNhNWNlYyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9kZXMvaW50ZXJuYWwuaAorKysgYi9zcmMvY3J5cHRvL2Rlcy9pbnRlcm5hbC5oCkBAIC0xODMsMTMgKzE4MywxMyBAQAogICAgIFBFUk1fT1AobCwgciwgdHQsIDQsIDB4MGYwZjBmMGZMKTsgIFwKICAgfQogCi0jZGVmaW5lIExPQURfREFUQShrcywgUiwgUywgdSwgdCwgRTAsIEUxKSBcCi0gIHUgPSBSIF4ga3MtPnN1YmtleXNbU11bMF07ICAgICAgICAgICAgICBcCi0gIHQgPSBSIF4ga3MtPnN1YmtleXNbU11bMV0KKyNkZWZpbmUgTE9BRF9EQVRBKFIsIFMsIHUsIHQsIEUwLCBFMSkgXAorICB1ID0gUiBeIHNbU107ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdCA9IFIgXiBzW1MgKyAxXQogCi0jZGVmaW5lIERfRU5DUllQVChrcywgTEwsIFIsIFMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBEX0VOQ1JZUFQoTEwsIFIsIFMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTE9BRF9EQVRBKGtzLCBSLCBTLCB1LCB0LCBFMCwgRTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExPQURfREFUQShSLCBTLCB1LCB0LCBFMCwgRTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB0ID0gUk9UQVRFKHQsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgTEwgXj0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBERVNfU1B0cmFuc1swXVsodSA+PiAyTCkgJiAweDNmXSBeIERFU19TUHRyYW5zWzJdWyh1ID4+IDEwTCkgJiAweDNmXSBeIFwKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZGgvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2RoL0NNYWtlTGlzdHMudHh0CmluZGV4IDFhNDY1MTIuLmQwYzFkYTcgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZGgvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9kaC9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgZGgKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZGgvZGguYyBiL3NyYy9jcnlwdG8vZGgvZGguYwppbmRleCBkMjVmMzU4Li45NmI4NWYzIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2RoL2RoLmMKKysrIGIvc3JjL2NyeXB0by9kaC9kaC5jCkBAIC03OCw3ICs3OCw3IEBACiBESCAqREhfbmV3X21ldGhvZChjb25zdCBFTkdJTkUgKmVuZ2luZSkgewogICBESCAqZGggPSAoREggKilPUEVOU1NMX21hbGxvYyhzaXplb2YoREgpKTsKICAgaWYgKGRoID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihESCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKERILCBESF9uZXdfbWV0aG9kLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9kaC9kaF9pbXBsLmMgYi9zcmMvY3J5cHRvL2RoL2RoX2ltcGwuYwppbmRleCA2Y2YwYWJiLi5mMjY5NDEyIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2RoL2RoX2ltcGwuYworKysgYi9zcmMvY3J5cHRvL2RoL2RoX2ltcGwuYwpAQCAtMTE3LDcgKzExNyw3IEBACiAgIH0KIAogICBpZiAoZ2VuZXJhdG9yIDw9IDEpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihESCwgREhfUl9CQURfR0VORVJBVE9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihESCwgZ2VuZXJhdGVfcGFyYW1ldGVycywgREhfUl9CQURfR0VORVJBVE9SKTsKICAgICBnb3RvIGVycjsKICAgfQogICBpZiAoZ2VuZXJhdG9yID09IERIX0dFTkVSQVRPUl8yKSB7CkBAIC0xNjUsNyArMTY1LDcgQEAKIAogZXJyOgogICBpZiAoIW9rKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoREgsIEVSUl9SX0JOX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoREgsIGdlbmVyYXRlX3BhcmFtZXRlcnMsIEVSUl9SX0JOX0xJQik7CiAgIH0KIAogICBpZiAoY3R4ICE9IE5VTEwpIHsKQEAgLTI0Miw3ICsyNDIsNyBAQAogCiBlcnI6CiAgIGlmIChvayAhPSAxKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoREgsIEVSUl9SX0JOX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoREgsIGdlbmVyYXRlX2tleSwgRVJSX1JfQk5fTElCKTsKICAgfQogCiAgIGlmIChkaC0+cHViX2tleSA9PSBOVUxMKSB7CkBAIC0yNjQsNyArMjY0LDcgQEAKICAgQklHTlVNIGxvY2FsX3ByaXY7CiAKICAgaWYgKEJOX251bV9iaXRzKGRoLT5wKSA+IE9QRU5TU0xfREhfTUFYX01PRFVMVVNfQklUUykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKERILCBESF9SX01PRFVMVVNfVE9PX0xBUkdFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihESCwgY29tcHV0ZV9rZXksIERIX1JfTU9EVUxVU19UT09fTEFSR0UpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTI3OSw3ICsyNzksNyBAQAogICB9CiAKICAgaWYgKGRoLT5wcml2X2tleSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoREgsIERIX1JfTk9fUFJJVkFURV9WQUxVRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoREgsIGNvbXB1dGVfa2V5LCBESF9SX05PX1BSSVZBVEVfVkFMVUUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTI5MCwxNCArMjkwLDE0IEBACiAgIH0KIAogICBpZiAoIURIX2NoZWNrX3B1Yl9rZXkoZGgsIHB1Yl9rZXksICZjaGVja19yZXN1bHQpIHx8IGNoZWNrX3Jlc3VsdCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKERILCBESF9SX0lOVkFMSURfUFVCS0VZKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihESCwgY29tcHV0ZV9rZXksIERIX1JfSU5WQUxJRF9QVUJLRVkpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgQk5fd2l0aF9mbGFncygmbG9jYWxfcHJpdiwgZGgtPnByaXZfa2V5LCBCTl9GTEdfQ09OU1RUSU1FKTsKICAgaWYgKCFCTl9tb2RfZXhwX21vbnQoc2hhcmVkX2tleSwgcHViX2tleSwgJmxvY2FsX3ByaXYsIGRoLT5wLCBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoREgsIEVSUl9SX0JOX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoREgsIGNvbXB1dGVfa2V5LCBFUlJfUl9CTl9MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZGlnZXN0L0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9kaWdlc3QvQ01ha2VMaXN0cy50eHQKaW5kZXggODU2ZTQ1YS4uODE2ZDExNiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9kaWdlc3QvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9kaWdlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKIAogYWRkX2xpYnJhcnkoCiAgIGRpZ2VzdApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9kaWdlc3QvZGlnZXN0LmMgYi9zcmMvY3J5cHRvL2RpZ2VzdC9kaWdlc3QuYwppbmRleCBlYjcxYjA3Li5mMDk5NDhiIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2RpZ2VzdC9kaWdlc3QuYworKysgYi9zcmMvY3J5cHRvL2RpZ2VzdC9kaWdlc3QuYwpAQCAtMTE2LDcgKzExNiw4IEBACiAgIHVpbnQ4X3QgKnRtcF9idWYgPSBOVUxMOwogCiAgIGlmIChpbiA9PSBOVUxMIHx8IGluLT5kaWdlc3QgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKERJR0VTVCwgRElHRVNUX1JfSU5QVVRfTk9UX0lOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihESUdFU1QsIEVWUF9NRF9DVFhfY29weV9leCwKKyAgICAgICAgICAgICAgICAgICAgICBESUdFU1RfUl9JTlBVVF9OT1RfSU5JVElBTElaRUQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTEyOSwxNSArMTMwLDE1IEBACiAgIH0KIAogICBFVlBfTURfQ1RYX2NsZWFudXAob3V0KTsKKyAgbWVtY3B5KG91dCwgaW4sIHNpemVvZihFVlBfTURfQ1RYKSk7CiAKLSAgb3V0LT5kaWdlc3QgPSBpbi0+ZGlnZXN0OwogICBpZiAoaW4tPm1kX2RhdGEgJiYgaW4tPmRpZ2VzdC0+Y3R4X3NpemUpIHsKICAgICBpZiAodG1wX2J1ZikgewogICAgICAgb3V0LT5tZF9kYXRhID0gdG1wX2J1ZjsKICAgICB9IGVsc2UgewogICAgICAgb3V0LT5tZF9kYXRhID0gT1BFTlNTTF9tYWxsb2MoaW4tPmRpZ2VzdC0+Y3R4X3NpemUpOwogICAgICAgaWYgKCFvdXQtPm1kX2RhdGEpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRElHRVNULCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKERJR0VTVCwgRVZQX01EX0NUWF9jb3B5X2V4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICAgIHJldHVybiAwOwogICAgICAgfQogICAgIH0KQEAgLTE0NSw3ICsxNDYsNiBAQAogICB9CiAKICAgYXNzZXJ0KGluLT5wY3R4ID09IE5VTEwgfHwgaW4tPnBjdHhfb3BzICE9IE5VTEwpOwotICBvdXQtPnBjdHhfb3BzID0gaW4tPnBjdHhfb3BzOwogICBpZiAoaW4tPnBjdHggJiYgaW4tPnBjdHhfb3BzKSB7CiAgICAgb3V0LT5wY3R4ID0gaW4tPnBjdHhfb3BzLT5kdXAoaW4tPnBjdHgpOwogICAgIGlmICghb3V0LT5wY3R4KSB7CkBAIC0xNjQsMjAgKzE2NCwzMCBAQAogCiBpbnQgRVZQX0RpZ2VzdEluaXRfZXgoRVZQX01EX0NUWCAqY3R4LCBjb25zdCBFVlBfTUQgKnR5cGUsIEVOR0lORSAqZW5naW5lKSB7CiAgIGlmIChjdHgtPmRpZ2VzdCAhPSB0eXBlKSB7Ci0gICAgaWYgKGN0eC0+ZGlnZXN0ICYmIGN0eC0+ZGlnZXN0LT5jdHhfc2l6ZSA+IDApIHsKKyAgICBpZiAoY3R4LT5kaWdlc3QgJiYgY3R4LT5kaWdlc3QtPmN0eF9zaXplKSB7CiAgICAgICBPUEVOU1NMX2ZyZWUoY3R4LT5tZF9kYXRhKTsKICAgICB9CiAgICAgY3R4LT5kaWdlc3QgPSB0eXBlOwotICAgIGlmICh0eXBlLT5jdHhfc2l6ZSA+IDApIHsKKyAgICBpZiAoIShjdHgtPmZsYWdzICYgRVZQX01EX0NUWF9GTEFHX05PX0lOSVQpICYmIHR5cGUtPmN0eF9zaXplKSB7CisgICAgICBjdHgtPnVwZGF0ZSA9IHR5cGUtPnVwZGF0ZTsKICAgICAgIGN0eC0+bWRfZGF0YSA9IE9QRU5TU0xfbWFsbG9jKHR5cGUtPmN0eF9zaXplKTsKICAgICAgIGlmIChjdHgtPm1kX2RhdGEgPT0gTlVMTCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihESUdFU1QsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRElHRVNULCBFVlBfRGlnZXN0SW5pdF9leCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KICAgICB9CiAgIH0KIAogICBhc3NlcnQoY3R4LT5wY3R4ID09IE5VTEwgfHwgY3R4LT5wY3R4X29wcyAhPSBOVUxMKTsKKyAgaWYgKGN0eC0+cGN0eF9vcHMpIHsKKyAgICBpZiAoIWN0eC0+cGN0eF9vcHMtPmJlZ2luX2RpZ2VzdChjdHgpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBpZiAoY3R4LT5mbGFncyAmIEVWUF9NRF9DVFhfRkxBR19OT19JTklUKSB7CisgICAgcmV0dXJuIDE7CisgIH0KIAogICBjdHgtPmRpZ2VzdC0+aW5pdChjdHgpOwogICByZXR1cm4gMTsKQEAgLTE4OSw3ICsxOTksNyBAQAogfQogCiBpbnQgRVZQX0RpZ2VzdFVwZGF0ZShFVlBfTURfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pIHsKLSAgY3R4LT5kaWdlc3QtPnVwZGF0ZShjdHgsIGRhdGEsIGxlbik7CisgIGN0eC0+dXBkYXRlKGN0eCwgZGF0YSwgbGVuKTsKICAgcmV0dXJuIDE7CiB9CiAKQEAgLTIwNCw3ICsyMTQsNyBAQAogfQogCiBpbnQgRVZQX0RpZ2VzdEZpbmFsKEVWUF9NRF9DVFggKmN0eCwgdWludDhfdCAqbWQsIHVuc2lnbmVkIGludCAqc2l6ZSkgewotICAodm9pZClFVlBfRGlnZXN0RmluYWxfZXgoY3R4LCBtZCwgc2l6ZSk7CisgIEVWUF9EaWdlc3RGaW5hbF9leChjdHgsIG1kLCBzaXplKTsKICAgRVZQX01EX0NUWF9jbGVhbnVwKGN0eCk7CiAgIHJldHVybiAxOwogfQpAQCAtMjQzLDYgKzI1MywxMCBAQAogICByZXR1cm4gRVZQX01EX3R5cGUoRVZQX01EX0NUWF9tZChjdHgpKTsKIH0KIAordm9pZCBFVlBfTURfQ1RYX3NldF9mbGFncyhFVlBfTURfQ1RYICpjdHgsIHVpbnQzMl90IGZsYWdzKSB7CisgIGN0eC0+ZmxhZ3MgfD0gZmxhZ3M7Cit9CisKIGludCBFVlBfYWRkX2RpZ2VzdChjb25zdCBFVlBfTUQgKmRpZ2VzdCkgewogICByZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZGlnZXN0L2RpZ2VzdHMuYyBiL3NyYy9jcnlwdG8vZGlnZXN0L2RpZ2VzdHMuYwppbmRleCAzMzA3ZjI2Li5mNWVkYTM2IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2RpZ2VzdC9kaWdlc3RzLmMKKysrIGIvc3JjL2NyeXB0by9kaWdlc3QvZGlnZXN0cy5jCkBAIC02Nyw3ICs2Nyw3IEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2lmIGRlZmluZWQoTkRFQlVHKQotI2RlZmluZSBDSEVDSyh4KSAodm9pZCkgKHgpCisjZGVmaW5lIENIRUNLKHgpIHgKICNlbHNlCiAjZGVmaW5lIENIRUNLKHgpIGFzc2VydCh4KQogI2VuZGlmCkBAIC0yNjIsNyArMjYyLDYgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmlkX3RvX2RpZ2VzdCBuaWRfdG9fZGlnZXN0X21hcHBpbmdbXSA9IHsKLSAgeyBOSURfbWQ0LCBFVlBfbWQ0LCBTTl9tZDQsIExOX21kNCB9LAogICB7IE5JRF9tZDUsIEVWUF9tZDUsIFNOX21kNSwgTE5fbWQ1IH0sCiAgIHsgTklEX3NoYTEsIEVWUF9zaGExLCBTTl9zaGExLCBMTl9zaGExIH0sCiAgIHsgTklEX3NoYTIyNCwgRVZQX3NoYTIyNCwgU05fc2hhMjI0LCBMTl9zaGEyMjQgfSwKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZGlnZXN0L2ludGVybmFsLmggYi9zcmMvY3J5cHRvL2RpZ2VzdC9pbnRlcm5hbC5oCmluZGV4IGUzZDgxMmEuLjE1NzJmYTggMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZGlnZXN0L2ludGVybmFsLmgKKysrIGIvc3JjL2NyeXB0by9kaWdlc3QvaW50ZXJuYWwuaApAQCAtOTIsNyArOTIsNyBAQAogfTsKIAogLyogZXZwX21kX3BjdHhfb3BzIGNvbnRhaW5zIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGFsbG93IHRoZSB8cGN0eHwgbWVtYmVyIG9mCi0gKiB8RVZQX01EX0NUWHwgdG8gYmUgbWFuaXB1bGF0ZWQgd2l0aG91dCBicmVha2luZyBsYXllcmluZyBieSBjYWxsaW5nIEVWUAorICogfEVWUF9NRF9DVFh8IHRvIGJlIG1hbmlwdWxhdGVkIHdpdGhvdXQgYnJlYWtpbmcgbGF5aW5nIGJ5IGNhbGxpbmcgRVZQCiAgKiBmdW5jdGlvbnMuICovCiBzdHJ1Y3QgZXZwX21kX3BjdHhfb3BzIHsKICAgLyogZnJlZSBpcyBjYWxsZWQgd2hlbiBhbiB8RVZQX01EX0NUWHwgaXMgYmVpbmcgZnJlZWQgYW5kIHRoZSB8cGN0eHwgYWxzbwpAQCAtMTAyLDggKzEwMiwyMyBAQAogICAvKiBkdXAgaXMgY2FsbGVkIHdoZW4gYW4gfEVWUF9NRF9DVFh8IGlzIGNvcGllZCBhbmQgc28gdGhlIHxwY3R4fCBhbHNvIG5lZWRzCiAgICAqIHRvIGJlIGNvcGllZC4gKi8KICAgRVZQX1BLRVlfQ1RYKiAoKmR1cCkgKEVWUF9QS0VZX0NUWCAqcGN0eCk7CisKKyAgLyogYmVnaW5fZGlnZXN0IGlzIGNhbGxlZCB3aGVuIGEgbmV3IGRpZ2VzdCBvcGVyYXRpb24gaXMgc3RhcnRlZC4gSXQgcmV0dXJucworICAgKiBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCisgIGludCAoKmJlZ2luX2RpZ2VzdCkgKEVWUF9NRF9DVFggKmN0eCk7CiB9OwogCisvKiBFVlBfTURfQ1RYX3NldF9mbGFncyBPUnMgfGZsYWdzfCBpbnRvIHRoZSBmbGFncyBtZW1iZXIgb2YgfGN0eHwuICovCitPUEVOU1NMX0VYUE9SVCB2b2lkIEVWUF9NRF9DVFhfc2V0X2ZsYWdzKEVWUF9NRF9DVFggKmN0eCwgdWludDMyX3QgZmxhZ3MpOworCisvKiBFVlBfTURfQ1RYX0ZMQUdfTk9fSU5JVCBjYXVzZXMgdGhlIHxFVlBfTUR8J3MgfGluaXR8IGZ1bmN0aW9uIG5vdCB0byBiZQorICogY2FsbGVkLCB0aGUgfHVwZGF0ZXwgbWVtYmVyIG5vdCB0byBiZSBjb3BpZWQgZnJvbSB0aGUgfEVWUF9NRHwgaW4KKyAqIHxFVlBfRGlnZXN0SW5pdF9leHwgYW5kIGZvciB8bWRfZGF0YXwgbm90IHRvIGJlIGluaXRpYWxpc2VkLgorICoKKyAqIFRPRE8oZGF2aWRiZW4pOiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBvZiB8RVZQX1BLRVlfSE1BQ3wgYW5kIGNhbgorICogYmUgcmVtb3ZlZCB3aGVuIGl0IGlzIGdvbmUuICovCisjZGVmaW5lIEVWUF9NRF9DVFhfRkxBR19OT19JTklUIDEKKwogCiAjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKIH0gIC8qIGV4dGVybiBDICovCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2RzYS9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vZHNhL0NNYWtlTGlzdHMudHh0CmluZGV4IGU4Yjc3OTMuLjFiYjhiNjMgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZHNhL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vZHNhL0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCiAKIGFkZF9saWJyYXJ5KAogICBkc2EKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZHNhL2RzYS5jIGIvc3JjL2NyeXB0by9kc2EvZHNhLmMKaW5kZXggM2ZmMjljNC4uNjU0NDRiMSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9kc2EvZHNhLmMKKysrIGIvc3JjL2NyeXB0by9kc2EvZHNhLmMKQEAgLTgyLDcgKzgyLDcgQEAKIERTQSAqRFNBX25ld19tZXRob2QoY29uc3QgRU5HSU5FICplbmdpbmUpIHsKICAgRFNBICpkc2EgPSAoRFNBICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKERTQSkpOwogICBpZiAoZHNhID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihEU0EsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihEU0EsIERTQV9uZXdfbWV0aG9kLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9kc2EvZHNhX2FzbjEuYyBiL3NyYy9jcnlwdG8vZHNhL2RzYV9hc24xLmMKaW5kZXggYjZiM2ZhNC4uOTMzZmJhNyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9kc2EvZHNhX2FzbjEuYworKysgYi9zcmMvY3J5cHRvL2RzYS9kc2FfYXNuMS5jCkBAIC03Myw3ICs3Myw3IEBACiAgIERTQV9TSUcgKnNpZzsKICAgc2lnID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKERTQV9TSUcpKTsKICAgaWYgKCFzaWcpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihEU0EsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihEU0EsIGRzYV9zaWdfY2IsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gMDsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2RzYS9kc2FfaW1wbC5jIGIvc3JjL2NyeXB0by9kc2EvZHNhX2ltcGwuYwppbmRleCBiMTA2MTBkLi4yYWI4YmE4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2RzYS9kc2FfaW1wbC5jCisrKyBiL3NyYy9jcnlwdG8vZHNhL2RzYV9pbXBsLmMKQEAgLTgzLDcgKzgzLDcgQEAKICAgaW50IHJldCA9IDA7CiAKICAgaWYgKCFkc2EtPnAgfHwgIWRzYS0+cSB8fCAhZHNhLT5nKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRFNBLCBEU0FfUl9NSVNTSU5HX1BBUkFNRVRFUlMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKERTQSwgc2lnbl9zZXR1cCwgRFNBX1JfTUlTU0lOR19QQVJBTUVURVJTKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xNzEsNyArMTcxLDcgQEAKIAogZXJyOgogICBpZiAoIXJldCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKERTQSwgRVJSX1JfQk5fTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihEU0EsIHNpZ25fc2V0dXAsIEVSUl9SX0JOX0xJQik7CiAgICAgaWYgKHIgIT0gTlVMTCkgewogICAgICAgQk5fY2xlYXJfZnJlZShyKTsKICAgICB9CkBAIC0yNjksNyArMjY5LDcgQEAKIAogZXJyOgogICBpZiAoIXJldCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKERTQSwgcmVhc29uKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihEU0EsIHNpZ24sIHJlYXNvbik7CiAgICAgQk5fZnJlZShyKTsKICAgICBCTl9mcmVlKHMpOwogICB9CkBAIC0yOTIsMTkgKzI5MiwxOSBAQAogICAqb3V0X3ZhbGlkID0gMDsKIAogICBpZiAoIWRzYS0+cCB8fCAhZHNhLT5xIHx8ICFkc2EtPmcpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihEU0EsIERTQV9SX01JU1NJTkdfUEFSQU1FVEVSUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRFNBLCB2ZXJpZnksIERTQV9SX01JU1NJTkdfUEFSQU1FVEVSUyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpID0gQk5fbnVtX2JpdHMoZHNhLT5xKTsKICAgLyogZmlwcyAxODYtMyBhbGxvd3Mgb25seSBkaWZmZXJlbnQgc2l6ZXMgZm9yIHEgKi8KICAgaWYgKGkgIT0gMTYwICYmIGkgIT0gMjI0ICYmIGkgIT0gMjU2KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRFNBLCBEU0FfUl9CQURfUV9WQUxVRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRFNBLCB2ZXJpZnksIERTQV9SX0JBRF9RX1ZBTFVFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChCTl9udW1fYml0cyhkc2EtPnApID4gT1BFTlNTTF9EU0FfTUFYX01PRFVMVVNfQklUUykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKERTQSwgRFNBX1JfTU9EVUxVU19UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKERTQSwgdmVyaWZ5LCBEU0FfUl9NT0RVTFVTX1RPT19MQVJHRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMzgxLDcgKzM4MSw3IEBACiAKIGVycjoKICAgaWYgKHJldCAhPSAxKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRFNBLCBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKERTQSwgdmVyaWZ5LCBFUlJfUl9CTl9MSUIpOwogICB9CiAgIEJOX0NUWF9mcmVlKGN0eCk7CiAgIEJOX2ZyZWUoJnUxKTsKQEAgLTQ4NywxNCArNDg3LDE2IEBACiAKICAgYml0cyA9IChiaXRzICsgNjMpIC8gNjQgKiA2NDsKIAorICAvKiBOQjogc2VlZF9sZW4gPT0gMCBpcyBzcGVjaWFsIGNhc2U6IGNvcHkgZ2VuZXJhdGVkIHNlZWQgdG8KKyAgICogc2VlZF9pbiBpZiBpdCBpcyBub3QgTlVMTC4gKi8KKyAgaWYgKHNlZWRfbGVuICYmIChzZWVkX2xlbiA8IChzaXplX3QpcXNpemUpKSB7CisgICAgc2VlZF9pbiA9IE5VTEw7IC8qIHNlZWQgYnVmZmVyIHRvbyBzbWFsbCAtLSBpZ25vcmUgKi8KKyAgfQorICBpZiAoc2VlZF9sZW4gPiAoc2l6ZV90KXFzaXplKSB7CisgICAgc2VlZF9sZW4gPSBxc2l6ZTsgLyogQXBwLiAyLjIgb2YgRklQUyBQVUIgMTg2IGFsbG93cyBsYXJnZXIgU0VFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgKiBidXQgb3VyIGludGVybmFsIGJ1ZmZlcnMgYXJlIHJlc3RyaWN0ZWQgdG8gMTYwIGJpdHMqLworICB9CiAgIGlmIChzZWVkX2luICE9IE5VTEwpIHsKLSAgICBpZiAoc2VlZF9sZW4gPCAoc2l6ZV90KXFzaXplKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHNlZWRfbGVuID4gKHNpemVfdClxc2l6ZSkgewotICAgICAgLyogT25seSBjb25zdW1lIGFzIG11Y2ggc2VlZCBhcyBpcyBleHBlY3RlZC4gKi8KLSAgICAgIHNlZWRfbGVuID0gcXNpemU7Ci0gICAgfQogICAgIG1lbWNweShzZWVkLCBzZWVkX2luLCBzZWVkX2xlbik7CiAgIH0KIApAQCAtNTI1LDE5ICs1MjcsMjEgQEAKICAgZm9yICg7OykgewogICAgIC8qIEZpbmQgcS4gKi8KICAgICBmb3IgKDs7KSB7CisgICAgICBpbnQgc2VlZF9pc19yYW5kb207CisKICAgICAgIC8qIHN0ZXAgMSAqLwogICAgICAgaWYgKCFCTl9HRU5DQl9jYWxsKGNiLCAwLCBtKyspKSB7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogCi0gICAgICBpbnQgdXNlX3JhbmRvbV9zZWVkID0gKHNlZWRfaW4gPT0gTlVMTCk7Ci0gICAgICBpZiAodXNlX3JhbmRvbV9zZWVkKSB7CisgICAgICBpZiAoIXNlZWRfbGVuKSB7CiAgICAgICAgIGlmICghUkFORF9ieXRlcyhzZWVkLCBxc2l6ZSkpIHsKICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgfQorICAgICAgICBzZWVkX2lzX3JhbmRvbSA9IDE7CiAgICAgICB9IGVsc2UgewotICAgICAgICAvKiBJZiB3ZSBjb21lIGJhY2sgdGhyb3VnaCwgdXNlIHJhbmRvbSBzZWVkIG5leHQgdGltZS4gKi8KLSAgICAgICAgc2VlZF9pbiA9IE5VTEw7CisgICAgICAgIHNlZWRfaXNfcmFuZG9tID0gMDsKKyAgICAgICAgc2VlZF9sZW4gPSAwOyAvKiB1c2UgcmFuZG9tIHNlZWQgaWYgJ3NlZWRfaW4nIHR1cm5zIG91dCB0byBiZSBiYWQqLwogICAgICAgfQogICAgICAgbWVtY3B5KGJ1Ziwgc2VlZCwgcXNpemUpOwogICAgICAgbWVtY3B5KGJ1ZjIsIHNlZWQsIHFzaXplKTsKQEAgLTU2Niw3ICs1NzAsNyBAQAogICAgICAgfQogCiAgICAgICAvKiBzdGVwIDQgKi8KLSAgICAgIHIgPSBCTl9pc19wcmltZV9mYXN0dGVzdF9leChxLCBEU1NfcHJpbWVfY2hlY2tzLCBjdHgsIHVzZV9yYW5kb21fc2VlZCwgY2IpOworICAgICAgciA9IEJOX2lzX3ByaW1lX2Zhc3R0ZXN0X2V4KHEsIERTU19wcmltZV9jaGVja3MsIGN0eCwgc2VlZF9pc19yYW5kb20sIGNiKTsKICAgICAgIGlmIChyID4gMCkgewogICAgICAgICBicmVhazsKICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZWMvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2VjL0NNYWtlTGlzdHMudHh0CmluZGV4IDM4YTkxZjguLmI1ZWJlZmEgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZWMvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9lYy9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgZWMKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZWMvZWMuYyBiL3NyYy9jcnlwdG8vZWMvZWMuYwppbmRleCAzMTE3ZjE2Li5mMzhlYmE2IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2VjL2VjLmMKKysrIGIvc3JjL2NyeXB0by9lYy9lYy5jCkBAIC0yMjIsMTEgKzIyMiw3IEBACiAgICAge05JRF9zZWNwMjI0cjEsICZQMjI0LCAwfSwKICAgICB7CiAgICAgICAgIE5JRF9YOV82Ml9wcmltZTI1NnYxLCAmUDI1NiwKLSAgICAvKiBNU0FOIGFwcGVhcnMgdG8gaGF2ZSBhIGJ1ZyB0aGF0IGNhdXNlcyB0aGlzIFAtMjU2IGNvZGUgdG8gYmUgbWlzY29tcGlsZWQKLSAgICAgKiBpbiBvcHQgbW9kZS4gV2hpbGUgdGhhdCBpcyBiZWluZyBsb29rZWQgYXQsIGRvbid0IHJ1biB0aGUgdWludDEyOF90Ci0gICAgICogUC0yNTYgY29kZSB1bmRlciBNU0FOIGZvciBub3cuICovCi0jaWYgZGVmaW5lZChPUEVOU1NMXzY0X0JJVCkgJiYgIWRlZmluZWQoT1BFTlNTTF9XSU5ET1dTKSAmJiBcCi0gICAgIWRlZmluZWQoTUVNT1JZX1NBTklUSVpFUikKKyNpZiBkZWZpbmVkKE9QRU5TU0xfNjRfQklUKSAmJiAhZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCiAgICAgICAgIEVDX0dGcF9uaXN0cDI1Nl9tZXRob2QsCiAjZWxzZQogICAgICAgICAwLApAQCAtMjQxLDE4ICsyMzcsMTggQEAKICAgRUNfR1JPVVAgKnJldDsKIAogICBpZiAobWV0aCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfU0xPVF9GVUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfZ3JvdXBfbmV3LCBFQ19SX1NMT1RfRlVMTCk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIAogICBpZiAobWV0aC0+Z3JvdXBfaW5pdCA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX2dyb3VwX25ldywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCiAgIHJldCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihFQ19HUk9VUCkpOwogICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19ncm91cF9uZXcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogICBtZW1zZXQocmV0LCAwLCBzaXplb2YoRUNfR1JPVVApKTsKQEAgLTI4MCw3ICsyNzYsOCBAQAogICB9CiAKICAgaWYgKHJldC0+bWV0aC0+Z3JvdXBfc2V0X2N1cnZlID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfR1JPVVBfbmV3X2N1cnZlX0dGcCwKKyAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOwogICAgIHJldHVybiAwOwogICB9CiAgIGlmICghcmV0LT5tZXRoLT5ncm91cF9zZXRfY3VydmUocmV0LCBwLCBhLCBiLCBjdHgpKSB7CkBAIC0zMzIsNyArMzI5LDcgQEAKICAgRUNfR1JPVVAgKmdyb3VwID0gTlVMTDsKICAgRUNfUE9JTlQgKlAgPSBOVUxMOwogICBCTl9DVFggKmN0eCA9IE5VTEw7Ci0gIEJJR05VTSAqcCA9IE5VTEwsICphID0gTlVMTCwgKmIgPSBOVUxMLCAqeCA9IE5VTEwsICp5ID0gTlVMTDsKKyAgQklHTlVNICpwID0gTlVMTCwgKmEgPSBOVUxMLCAqYiA9IE5VTEwsICp4ID0gTlVMTCwgKnkgPSBOVUxMLCAqb3JkZXIgPSBOVUxMOwogICBpbnQgb2sgPSAwOwogICB1bnNpZ25lZCBwYXJhbV9sZW47CiAgIGNvbnN0IEVDX01FVEhPRCAqbWV0aDsKQEAgLTM0MCw3ICszMzcsNyBAQAogICBjb25zdCB1aW50OF90ICpwYXJhbXM7CiAKICAgaWYgKChjdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19ncm91cF9uZXdfZnJvbV9kYXRhLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMzUxLDcgKzM0OCw3IEBACiAgIGlmICghKHAgPSBCTl9iaW4yYm4ocGFyYW1zICsgMCAqIHBhcmFtX2xlbiwgcGFyYW1fbGVuLCBOVUxMKSkgfHwKICAgICAgICEoYSA9IEJOX2JpbjJibihwYXJhbXMgKyAxICogcGFyYW1fbGVuLCBwYXJhbV9sZW4sIE5VTEwpKSB8fAogICAgICAgIShiID0gQk5fYmluMmJuKHBhcmFtcyArIDIgKiBwYXJhbV9sZW4sIHBhcmFtX2xlbiwgTlVMTCkpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0JOX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX2dyb3VwX25ld19mcm9tX2RhdGEsIEVSUl9SX0JOX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMzU5LDM5ICszNTYsNDUgQEAKICAgICBtZXRoID0gY3VydmUtPm1ldGhvZCgpOwogICAgIGlmICgoKGdyb3VwID0gZWNfZ3JvdXBfbmV3KG1ldGgpKSA9PSBOVUxMKSB8fAogICAgICAgICAoIShncm91cC0+bWV0aC0+Z3JvdXBfc2V0X2N1cnZlKGdyb3VwLCBwLCBhLCBiLCBjdHgpKSkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9FQ19MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX2dyb3VwX25ld19mcm9tX2RhdGEsIEVSUl9SX0VDX0xJQik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgaWYgKChncm91cCA9IEVDX0dST1VQX25ld19jdXJ2ZV9HRnAocCwgYSwgYiwgY3R4KSkgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0VDX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfZ3JvdXBfbmV3X2Zyb21fZGF0YSwgRVJSX1JfRUNfTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfQogCiAgIGlmICgoUCA9IEVDX1BPSU5UX25ldyhncm91cCkpID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfRUNfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfZ3JvdXBfbmV3X2Zyb21fZGF0YSwgRVJSX1JfRUNfTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIGlmICghKHggPSBCTl9iaW4yYm4ocGFyYW1zICsgMyAqIHBhcmFtX2xlbiwgcGFyYW1fbGVuLCBOVUxMKSkgfHwKICAgICAgICEoeSA9IEJOX2JpbjJibihwYXJhbXMgKyA0ICogcGFyYW1fbGVuLCBwYXJhbV9sZW4sIE5VTEwpKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19ncm91cF9uZXdfZnJvbV9kYXRhLCBFUlJfUl9CTl9MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKCFFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChncm91cCwgUCwgeCwgeSwgY3R4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9FQ19MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19ncm91cF9uZXdfZnJvbV9kYXRhLCBFUlJfUl9FQ19MSUIpOwogICAgIGdvdG8gZXJyOwogICB9Ci0gIGlmICghQk5fYmluMmJuKHBhcmFtcyArIDUgKiBwYXJhbV9sZW4sIHBhcmFtX2xlbiwgJmdyb3VwLT5vcmRlcikgfHwKLSAgICAgICFCTl9zZXRfd29yZCgmZ3JvdXAtPmNvZmFjdG9yLCAoQk5fVUxPTkcpZGF0YS0+Y29mYWN0b3IpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0JOX0xJQik7CisgIGlmICghKG9yZGVyID0gQk5fYmluMmJuKHBhcmFtcyArIDUgKiBwYXJhbV9sZW4sIHBhcmFtX2xlbiwgTlVMTCkpIHx8CisgICAgICAhQk5fc2V0X3dvcmQoeCwgKEJOX1VMT05HKWRhdGEtPmNvZmFjdG9yKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19ncm91cF9uZXdfZnJvbV9kYXRhLCBFUlJfUl9CTl9MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgZ3JvdXAtPmdlbmVyYXRvciA9IFA7CiAgIFAgPSBOVUxMOworICBpZiAoIUJOX2NvcHkoJmdyb3VwLT5vcmRlciwgb3JkZXIpIHx8CisgICAgICAhQk5fc2V0X3dvcmQoJmdyb3VwLT5jb2ZhY3RvciwgKEJOX1VMT05HKWRhdGEtPmNvZmFjdG9yKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19ncm91cF9uZXdfZnJvbV9kYXRhLCBFUlJfUl9CTl9MSUIpOworICAgIGdvdG8gZXJyOworICB9CisKICAgb2sgPSAxOwogCiBlcnI6CkBAIC00MDQsNiArNDA3LDcgQEAKICAgQk5fZnJlZShwKTsKICAgQk5fZnJlZShhKTsKICAgQk5fZnJlZShiKTsKKyAgQk5fZnJlZShvcmRlcik7CiAgIEJOX2ZyZWUoeCk7CiAgIEJOX2ZyZWUoeSk7CiAgIHJldHVybiBncm91cDsKQEAgLTQyMyw3ICs0MjcsNyBAQAogICB9CiAKICAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfVU5LTk9XTl9HUk9VUCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lLCBFQ19SX1VOS05PV05fR1JPVVApOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKQEAgLTQ1MSwxMSArNDU1LDExIEBACiAKIGludCBlY19ncm91cF9jb3B5KEVDX0dST1VQICpkZXN0LCBjb25zdCBFQ19HUk9VUCAqc3JjKSB7CiAgIGlmIChkZXN0LT5tZXRoLT5ncm91cF9jb3B5ID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfR1JPVVBfY29weSwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoZGVzdC0+bWV0aCAhPSBzcmMtPm1ldGgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0dST1VQX2NvcHksIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOwogICAgIHJldHVybiAwOwogICB9CiAgIGlmIChkZXN0ID09IHNyYykgewpAQCAtNTUwLDcgKzU1NCw4IEBACiBpbnQgRUNfR1JPVVBfZ2V0X2N1cnZlX0dGcChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJJR05VTSAqb3V0X3AsIEJJR05VTSAqb3V0X2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSUdOVU0gKm91dF9iLCBCTl9DVFggKmN0eCkgewogICBpZiAoZ3JvdXAtPm1ldGgtPmdyb3VwX2dldF9jdXJ2ZSA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0dST1VQX2dldF9jdXJ2ZV9HRnAsCisgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICByZXR1cm4gZ3JvdXAtPm1ldGgtPmdyb3VwX2dldF9jdXJ2ZShncm91cCwgb3V0X3AsIG91dF9hLCBvdXRfYiwgY3R4KTsKQEAgLTU2MCw3ICs1NjUsOCBAQAogCiBpbnQgRUNfR1JPVVBfZ2V0X2RlZ3JlZShjb25zdCBFQ19HUk9VUCAqZ3JvdXApIHsKICAgaWYgKGdyb3VwLT5tZXRoLT5ncm91cF9nZXRfZGVncmVlID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfR1JPVVBfZ2V0X2RlZ3JlZSwKKyAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOwogICAgIHJldHVybiAwOwogICB9CiAgIHJldHVybiBncm91cC0+bWV0aC0+Z3JvdXBfZ2V0X2RlZ3JlZShncm91cCk7CkBAIC01OTYsMTcgKzYwMiwxNyBAQAogICBFQ19QT0lOVCAqcmV0OwogCiAgIGlmIChncm91cCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX25ldywgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogICBpZiAoZ3JvdXAtPm1ldGgtPnBvaW50X2luaXQgPT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9uZXcsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIAogICByZXQgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YgKnJldCk7CiAgIGlmIChyZXQgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKQEAgLTY0NywxMSArNjUzLDExIEBACiAKIGludCBFQ19QT0lOVF9jb3B5KEVDX1BPSU5UICpkZXN0LCBjb25zdCBFQ19QT0lOVCAqc3JjKSB7CiAgIGlmIChkZXN0LT5tZXRoLT5wb2ludF9jb3B5ID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfY29weSwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoZGVzdC0+bWV0aCAhPSBzcmMtPm1ldGgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX2NvcHksIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOwogICAgIHJldHVybiAwOwogICB9CiAgIGlmIChkZXN0ID09IHNyYykgewpAQCAtNjcwLDcgKzY3Niw3IEBACiAKICAgdCA9IEVDX1BPSU5UX25ldyhncm91cCk7CiAgIGlmICh0ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9kdXAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogICByID0gRUNfUE9JTlRfY29weSh0LCBhKTsKQEAgLTY4NCwxMSArNjkwLDEyIEBACiAKIGludCBFQ19QT0lOVF9zZXRfdG9faW5maW5pdHkoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQpIHsKICAgaWYgKGdyb3VwLT5tZXRoLT5wb2ludF9zZXRfdG9faW5maW5pdHkgPT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9zZXRfdG9faW5maW5pdHksCisgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnQtPm1ldGgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX3NldF90b19pbmZpbml0eSwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0dXJuIGdyb3VwLT5tZXRoLT5wb2ludF9zZXRfdG9faW5maW5pdHkoZ3JvdXAsIHBvaW50KTsKQEAgLTY5NiwxMSArNzAzLDEyIEBACiAKIGludCBFQ19QT0lOVF9pc19hdF9pbmZpbml0eShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIGNvbnN0IEVDX1BPSU5UICpwb2ludCkgewogICBpZiAoZ3JvdXAtPm1ldGgtPmlzX2F0X2luZmluaXR5ID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfaXNfYXRfaW5maW5pdHksCisgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnQtPm1ldGgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX2lzX2F0X2luZmluaXR5LCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKICAgICByZXR1cm4gMDsKICAgfQogICByZXR1cm4gZ3JvdXAtPm1ldGgtPmlzX2F0X2luZmluaXR5KGdyb3VwLCBwb2ludCk7CkBAIC03MDksMTEgKzcxNywxMiBAQAogaW50IEVDX1BPSU5UX2lzX29uX2N1cnZlKGNvbnN0IEVDX0dST1VQICpncm91cCwgY29uc3QgRUNfUE9JTlQgKnBvaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KSB7CiAgIGlmIChncm91cC0+bWV0aC0+aXNfb25fY3VydmUgPT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9pc19vbl9jdXJ2ZSwKKyAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOwogICAgIHJldHVybiAwOwogICB9CiAgIGlmIChncm91cC0+bWV0aCAhPSBwb2ludC0+bWV0aCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfaXNfb25fY3VydmUsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOwogICAgIHJldHVybiAwOwogICB9CiAgIHJldHVybiBncm91cC0+bWV0aC0+aXNfb25fY3VydmUoZ3JvdXAsIHBvaW50LCBjdHgpOwpAQCAtNzIyLDExICs3MzEsMTEgQEAKIGludCBFQ19QT0lOVF9jbXAoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBFQ19QT0lOVCAqYSwgY29uc3QgRUNfUE9JTlQgKmIsCiAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KSB7CiAgIGlmIChncm91cC0+bWV0aC0+cG9pbnRfY21wID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfY21wLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOwogICAgIHJldHVybiAtMTsKICAgfQogICBpZiAoKGdyb3VwLT5tZXRoICE9IGEtPm1ldGgpIHx8IChhLT5tZXRoICE9IGItPm1ldGgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9jbXAsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOwogICAgIHJldHVybiAtMTsKICAgfQogICByZXR1cm4gZ3JvdXAtPm1ldGgtPnBvaW50X2NtcChncm91cCwgYSwgYiwgY3R4KTsKQEAgLTczNCwxMSArNzQzLDEyIEBACiAKIGludCBFQ19QT0lOVF9tYWtlX2FmZmluZShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpwb2ludCwgQk5fQ1RYICpjdHgpIHsKICAgaWYgKGdyb3VwLT5tZXRoLT5tYWtlX2FmZmluZSA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX21ha2VfYWZmaW5lLAorICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGdyb3VwLT5tZXRoICE9IHBvaW50LT5tZXRoKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9tYWtlX2FmZmluZSwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0dXJuIGdyb3VwLT5tZXRoLT5tYWtlX2FmZmluZShncm91cCwgcG9pbnQsIGN0eCk7CkBAIC03NDksMTIgKzc1OSwxMyBAQAogICBzaXplX3QgaTsKIAogICBpZiAoZ3JvdXAtPm1ldGgtPnBvaW50c19tYWtlX2FmZmluZSA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5Uc19tYWtlX2FmZmluZSwKKyAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOwogICAgIHJldHVybiAwOwogICB9CiAgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewogICAgIGlmIChncm91cC0+bWV0aCAhPSBwb2ludHNbaV0tPm1ldGgpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVHNfbWFrZV9hZmZpbmUsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICB9CkBAIC03NjUsMTEgKzc3NiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVDX1BPSU5UICpwb2ludCwgQklHTlVNICp4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJR05VTSAqeSwgQk5fQ1RYICpjdHgpIHsKICAgaWYgKGdyb3VwLT5tZXRoLT5wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAsCisgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnQtPm1ldGgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwLAorICAgICAgICAgICAgICAgICAgICAgIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOwogICAgIHJldHVybiAwOwogICB9CiAgIHJldHVybiBncm91cC0+bWV0aC0+cG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcyhncm91cCwgcG9pbnQsIHgsIHksIGN0eCk7CkBAIC03NzksMTEgKzc5MiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqeCwgY29uc3QgQklHTlVNICp5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KSB7CiAgIGlmIChncm91cC0+bWV0aC0+cG9pbnRfc2V0X2FmZmluZV9jb29yZGluYXRlcyA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwLAorICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGdyb3VwLT5tZXRoICE9IHBvaW50LT5tZXRoKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcCwKKyAgICAgICAgICAgICAgICAgICAgICBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKICAgICByZXR1cm4gMDsKICAgfQogICByZXR1cm4gZ3JvdXAtPm1ldGgtPnBvaW50X3NldF9hZmZpbmVfY29vcmRpbmF0ZXMoZ3JvdXAsIHBvaW50LCB4LCB5LCBjdHgpOwpAQCAtNzkyLDEyICs4MDcsMTIgQEAKIGludCBFQ19QT0lOVF9hZGQoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqciwgY29uc3QgRUNfUE9JTlQgKmEsCiAgICAgICAgICAgICAgICAgIGNvbnN0IEVDX1BPSU5UICpiLCBCTl9DVFggKmN0eCkgewogICBpZiAoZ3JvdXAtPm1ldGgtPmFkZCA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX2FkZCwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoKGdyb3VwLT5tZXRoICE9IHItPm1ldGgpIHx8IChyLT5tZXRoICE9IGEtPm1ldGgpIHx8CiAgICAgICAoYS0+bWV0aCAhPSBiLT5tZXRoKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfYWRkLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKICAgICByZXR1cm4gMDsKICAgfQogICByZXR1cm4gZ3JvdXAtPm1ldGgtPmFkZChncm91cCwgciwgYSwgYiwgY3R4KTsKQEAgLTgwNywxMSArODIyLDExIEBACiBpbnQgRUNfUE9JTlRfZGJsKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnIsIGNvbnN0IEVDX1BPSU5UICphLAogICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCkgewogICBpZiAoZ3JvdXAtPm1ldGgtPmRibCA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX2RibCwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoKGdyb3VwLT5tZXRoICE9IHItPm1ldGgpIHx8IChyLT5tZXRoICE9IGEtPm1ldGgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9kYmwsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOwogICAgIHJldHVybiAwOwogICB9CiAgIHJldHVybiBncm91cC0+bWV0aC0+ZGJsKGdyb3VwLCByLCBhLCBjdHgpOwpAQCAtODIwLDExICs4MzUsMTEgQEAKIAogaW50IEVDX1BPSU5UX2ludmVydChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICphLCBCTl9DVFggKmN0eCkgewogICBpZiAoZ3JvdXAtPm1ldGgtPmludmVydCA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX2ludmVydCwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoZ3JvdXAtPm1ldGggIT0gYS0+bWV0aCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfaW52ZXJ0LCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKICAgICByZXR1cm4gMDsKICAgfQogICByZXR1cm4gZ3JvdXAtPm1ldGgtPmludmVydChncm91cCwgYSwgY3R4KTsKQEAgLTg1OSwxMSArODc0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKngsIGNvbnN0IEJJR05VTSAqeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqeiwgQk5fQ1RYICpjdHgpIHsKICAgaWYgKGdyb3VwLT5tZXRoLT5wb2ludF9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfcG9pbnRfc2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcCwKKyAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOwogICAgIHJldHVybiAwOwogICB9CiAgIGlmIChncm91cC0+bWV0aCAhPSBwb2ludC0+bWV0aCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfcG9pbnRfc2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcCwKKyAgICAgICAgICAgICAgICAgICAgICBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKICAgICByZXR1cm4gMDsKICAgfQogICByZXR1cm4gZ3JvdXAtPm1ldGgtPnBvaW50X3NldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIHBvaW50LCB4LCB5LApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lYy9lY19hc24xLmMgYi9zcmMvY3J5cHRvL2VjL2VjX2FzbjEuYwppbmRleCAzMWQ4OTQ0Li5mZjNkY2E2IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2VjL2VjX2FzbjEuYworKysgYi9zcmMvY3J5cHRvL2VjL2VjX2FzbjEuYwpAQCAtMTY4LDcgKzE2OCw3IEBACiAgIGlmIChyZXQgPT0gTlVMTCkgewogICAgIHJldCA9IEVDUEtQQVJBTUVURVJTX25ldygpOwogICAgIGlmIChyZXQgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19hc24xX2dyb3VwMnBrcGFyYW1ldGVycywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICB9IGVsc2UgewpAQCAtMTk2LDcgKzE5Niw3IEBACiAgIGludCBuaWQgPSBOSURfdW5kZWY7CiAKICAgaWYgKHBhcmFtcyA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfTUlTU0lOR19QQVJBTUVURVJTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfYXNuMV9wa3BhcmFtZXRlcnMyZ3JvdXAsIEVDX1JfTUlTU0lOR19QQVJBTUVURVJTKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCkBAIC0yMjIsMTMgKzIyMiwxNCBAQAogICB9CiAKICAgaWYgKG5pZCA9PSBOSURfdW5kZWYpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9OT05fTkFNRURfQ1VSVkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19hc24xX3BrcGFyYW1ldGVyczJncm91cCwgRUNfUl9OT05fTkFNRURfQ1VSVkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKICAgcmV0ID0gRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUobmlkKTsKICAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfRUNfR1JPVVBfTkVXX0JZX05BTUVfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX2FzbjFfcGtwYXJhbWV0ZXJzMmdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgIEVDX1JfRUNfR1JPVVBfTkVXX0JZX05BTUVfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIApAQCAtMjQyLDE0ICsyNDMsMTQgQEAKIAogICBwYXJhbXMgPSBkMmlfRUNQS1BBUkFNRVRFUlMoTlVMTCwgaW5wLCBsZW4pOwogICBpZiAocGFyYW1zID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9EMklfRUNQS1BBUkFNRVRFUlNfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGQyaV9FQ1BLUGFyYW1ldGVycywgRUNfUl9EMklfRUNQS1BBUkFNRVRFUlNfRkFJTFVSRSk7CiAgICAgRUNQS1BBUkFNRVRFUlNfZnJlZShwYXJhbXMpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKICAgZ3JvdXAgPSBlY19hc24xX3BrcGFyYW1ldGVyczJncm91cChwYXJhbXMpOwogICBpZiAoZ3JvdXAgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX1BLUEFSQU1FVEVSUzJHUk9VUF9GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZDJpX0VDUEtQYXJhbWV0ZXJzLCBFQ19SX1BLUEFSQU1FVEVSUzJHUk9VUF9GQUlMVVJFKTsKICAgICBFQ1BLUEFSQU1FVEVSU19mcmVlKHBhcmFtcyk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KQEAgLTI2NywxMiArMjY4LDEyIEBACiAgIGludCByZXQgPSAwOwogICBFQ1BLUEFSQU1FVEVSUyAqdG1wID0gZWNfYXNuMV9ncm91cDJwa3BhcmFtZXRlcnMoZ3JvdXAsIE5VTEwpOwogICBpZiAodG1wID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9HUk9VUDJQS1BBUkFNRVRFUlNfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGkyZF9FQ1BLUGFyYW1ldGVycywgRUNfUl9HUk9VUDJQS1BBUkFNRVRFUlNfRkFJTFVSRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0ID0gaTJkX0VDUEtQQVJBTUVURVJTKHRtcCwgb3V0cCk7CiAgIGlmIChyZXQgPT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0kyRF9FQ1BLUEFSQU1FVEVSU19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJkX0VDUEtQYXJhbWV0ZXJzLCBFQ19SX0kyRF9FQ1BLUEFSQU1FVEVSU19GQUlMVVJFKTsKICAgICBFQ1BLUEFSQU1FVEVSU19mcmVlKHRtcCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KQEAgLTI4NywxNCArMjg4LDE0IEBACiAKICAgcHJpdl9rZXkgPSBkMmlfRUNfUFJJVkFURUtFWShOVUxMLCBpbiwgbGVuKTsKICAgaWYgKHByaXZfa2V5ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfRUNfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZDJpX0VDUHJpdmF0ZUtleSwgRVJSX1JfRUNfTElCKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCiAgIGlmIChhID09IE5VTEwgfHwgKmEgPT0gTlVMTCkgewogICAgIHJldCA9IEVDX0tFWV9uZXcoKTsKICAgICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZDJpX0VDUHJpdmF0ZUtleSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9IGVsc2UgewpAQCAtMzA3LDcgKzMwOCw3IEBACiAgIH0KIAogICBpZiAocmV0LT5ncm91cCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0VDX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGQyaV9FQ1ByaXZhdGVLZXksIEVSUl9SX0VDX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMzE4LDE4ICszMTksMTggQEAKICAgICAgICAgQk5fYmluMmJuKE1fQVNOMV9TVFJJTkdfZGF0YShwcml2X2tleS0+cHJpdmF0ZUtleSksCiAgICAgICAgICAgICAgICAgICBNX0FTTjFfU1RSSU5HX2xlbmd0aChwcml2X2tleS0+cHJpdmF0ZUtleSksIHJldC0+cHJpdl9rZXkpOwogICAgIGlmIChyZXQtPnByaXZfa2V5ID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9CTl9MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGQyaV9FQ1ByaXZhdGVLZXksIEVSUl9SX0JOX0xJQik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfTUlTU0lOR19QUklWQVRFX0tFWSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGQyaV9FQ1ByaXZhdGVLZXksIEVDX1JfTUlTU0lOR19QUklWQVRFX0tFWSk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBFQ19QT0lOVF9mcmVlKHJldC0+cHViX2tleSk7CiAgIHJldC0+cHViX2tleSA9IEVDX1BPSU5UX25ldyhyZXQtPmdyb3VwKTsKICAgaWYgKHJldC0+cHViX2tleSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0VDX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGQyaV9FQ1ByaXZhdGVLZXksIEVSUl9SX0VDX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMzQxLDIwICszNDIsMjAgQEAKICAgICBwdWJfb2N0X2xlbiA9IE1fQVNOMV9TVFJJTkdfbGVuZ3RoKHByaXZfa2V5LT5wdWJsaWNLZXkpOwogICAgIC8qIFRoZSBmaXJzdCBieXRlICh0aGUgcG9pbnQgY29udmVyc2lvbiBmb3JtKSBtdXN0IGJlIHByZXNlbnQuICovCiAgICAgaWYgKHB1Yl9vY3RfbGVuIDw9IDApIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0JVRkZFUl9UT09fU01BTEwpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGQyaV9FQ1ByaXZhdGVLZXksIEVDX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgICAgLyogU2F2ZSB0aGUgcG9pbnQgY29udmVyc2lvbiBmb3JtLiAqLwogICAgIHJldC0+Y29udl9mb3JtID0gKHBvaW50X2NvbnZlcnNpb25fZm9ybV90KShwdWJfb2N0WzBdICYgfjB4MDEpOwogICAgIGlmICghRUNfUE9JTlRfb2N0MnBvaW50KHJldC0+Z3JvdXAsIHJldC0+cHViX2tleSwgcHViX29jdCwgcHViX29jdF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9FQ19MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGQyaV9FQ1ByaXZhdGVLZXksIEVSUl9SX0VDX0xJQik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgaWYgKCFFQ19QT0lOVF9tdWwocmV0LT5ncm91cCwgcmV0LT5wdWJfa2V5LCByZXQtPnByaXZfa2V5LCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfRUNfTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBkMmlfRUNQcml2YXRlS2V5LCBFUlJfUl9FQ19MSUIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIC8qIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCBwcml2YXRlLWtleS1vbmx5IGVuY29kaW5nLiAqLwpAQCAtMzg2LDEzICszODcsMTMgQEAKICAgRUNfUFJJVkFURUtFWSAqcHJpdl9rZXkgPSBOVUxMOwogCiAgIGlmIChrZXkgPT0gTlVMTCB8fCBrZXktPmdyb3VwID09IE5VTEwgfHwga2V5LT5wcml2X2tleSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGkyZF9FQ1ByaXZhdGVLZXksIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBwcml2X2tleSA9IEVDX1BSSVZBVEVLRVlfbmV3KCk7CiAgIGlmIChwcml2X2tleSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJkX0VDUHJpdmF0ZUtleSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTQwMSwxNyArNDAyLDE3IEBACiAgIGJ1Zl9sZW4gPSBCTl9udW1fYnl0ZXMoJmtleS0+Z3JvdXAtPm9yZGVyKTsKICAgYnVmZmVyID0gT1BFTlNTTF9tYWxsb2MoYnVmX2xlbik7CiAgIGlmIChidWZmZXIgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGkyZF9FQ1ByaXZhdGVLZXksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIGlmICghQk5fYm4yYmluX3BhZGRlZChidWZmZXIsIGJ1Zl9sZW4sIGtleS0+cHJpdl9rZXkpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0JOX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGkyZF9FQ1ByaXZhdGVLZXksIEVSUl9SX0JOX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAoIU1fQVNOMV9PQ1RFVF9TVFJJTkdfc2V0KHByaXZfa2V5LT5wcml2YXRlS2V5LCBidWZmZXIsIGJ1Zl9sZW4pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0FTTjFfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJkX0VDUHJpdmF0ZUtleSwgRVJSX1JfQVNOMV9MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTQxOSw3ICs0MjAsNyBAQAogICBpZiAoIShrZXktPmVuY19mbGFnICYgRUNfUEtFWV9OT19QQVJBTUVURVJTKSkgewogICAgIGlmICgocHJpdl9rZXktPnBhcmFtZXRlcnMgPSBlY19hc24xX2dyb3VwMnBrcGFyYW1ldGVycygKICAgICAgICAgICAgICBrZXktPmdyb3VwLCBwcml2X2tleS0+cGFyYW1ldGVycykpID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9FQ19MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGkyZF9FQ1ByaXZhdGVLZXksIEVSUl9SX0VDX0xJQik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0KQEAgLTQyOCw3ICs0MjksNyBAQAogICBpZiAoIShrZXktPmVuY19mbGFnICYgRUNfUEtFWV9OT19QVUJLRVkpICYmIGtleS0+cHViX2tleSAhPSBOVUxMKSB7CiAgICAgcHJpdl9rZXktPnB1YmxpY0tleSA9IE1fQVNOMV9CSVRfU1RSSU5HX25ldygpOwogICAgIGlmIChwcml2X2tleS0+cHVibGljS2V5ID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJkX0VDUHJpdmF0ZUtleSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogCkBAIC00MzgsNyArNDM5LDcgQEAKICAgICBpZiAodG1wX2xlbiA+IGJ1Zl9sZW4pIHsKICAgICAgIHVpbnQ4X3QgKnRtcF9idWZmZXIgPSBPUEVOU1NMX3JlYWxsb2MoYnVmZmVyLCB0bXBfbGVuKTsKICAgICAgIGlmICghdG1wX2J1ZmZlcikgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJkX0VDUHJpdmF0ZUtleSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KICAgICAgIGJ1ZmZlciA9IHRtcF9idWZmZXI7CkBAIC00NDcsMjEgKzQ0OCwyMSBAQAogCiAgICAgaWYgKCFFQ19QT0lOVF9wb2ludDJvY3Qoa2V5LT5ncm91cCwga2V5LT5wdWJfa2V5LCBrZXktPmNvbnZfZm9ybSwgYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9sZW4sIE5VTEwpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfRUNfTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBpMmRfRUNQcml2YXRlS2V5LCBFUlJfUl9FQ19MSUIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogCiAgICAgcHJpdl9rZXktPnB1YmxpY0tleS0+ZmxhZ3MgJj0gfihBU04xX1NUUklOR19GTEFHX0JJVFNfTEVGVCB8IDB4MDcpOwogICAgIHByaXZfa2V5LT5wdWJsaWNLZXktPmZsYWdzIHw9IEFTTjFfU1RSSU5HX0ZMQUdfQklUU19MRUZUOwogICAgIGlmICghTV9BU04xX0JJVF9TVFJJTkdfc2V0KHByaXZfa2V5LT5wdWJsaWNLZXksIGJ1ZmZlciwgYnVmX2xlbikpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9BU04xX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJkX0VDUHJpdmF0ZUtleSwgRVJSX1JfQVNOMV9MSUIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9CiAKICAgcmV0ID0gaTJkX0VDX1BSSVZBVEVLRVkocHJpdl9rZXksIG91dHApOwogICBpZiAocmV0ID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfRUNfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJkX0VDUHJpdmF0ZUtleSwgRVJSX1JfRUNfTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogICBvayA9IDE7CkBAIC00NzQsNyArNDc1LDcgQEAKIAogaW50IGkyZF9FQ1BhcmFtZXRlcnMoY29uc3QgRUNfS0VZICprZXksIHVpbnQ4X3QgKipvdXRwKSB7CiAgIGlmIChrZXkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBpMmRfRUNQYXJhbWV0ZXJzLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOwogICAgIHJldHVybiAwOwogICB9CiAgIHJldHVybiBpMmRfRUNQS1BhcmFtZXRlcnMoa2V5LT5ncm91cCwgb3V0cCk7CkBAIC00ODQsMTQgKzQ4NSwxNCBAQAogICBFQ19LRVkgKnJldDsKIAogICBpZiAoaW5wID09IE5VTEwgfHwgKmlucCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGQyaV9FQ1BhcmFtZXRlcnMsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIAogICBpZiAoa2V5ID09IE5VTEwgfHwgKmtleSA9PSBOVUxMKSB7CiAgICAgcmV0ID0gRUNfS0VZX25ldygpOwogICAgIGlmIChyZXQgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBkMmlfRUNQYXJhbWV0ZXJzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgIH0gZWxzZSB7CkBAIC00OTksNyArNTAwLDcgQEAKICAgfQogCiAgIGlmICghZDJpX0VDUEtQYXJhbWV0ZXJzKCZyZXQtPmdyb3VwLCBpbnAsIGxlbikpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfRUNfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZDJpX0VDUGFyYW1ldGVycywgRVJSX1JfRUNfTElCKTsKICAgICBpZiAoa2V5ID09IE5VTEwgfHwgKmtleSA9PSBOVUxMKSB7CiAgICAgICBFQ19LRVlfZnJlZShyZXQpOwogICAgIH0KQEAgLTUxNiwxNyArNTE3LDE3IEBACiAgIEVDX0tFWSAqcmV0ID0gTlVMTDsKIAogICBpZiAoa2V5cCA9PSBOVUxMIHx8ICprZXlwID09IE5VTEwgfHwgKCprZXlwKS0+Z3JvdXAgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBvMmlfRUNQdWJsaWNLZXksIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0ID0gKmtleXA7CiAgIGlmIChyZXQtPnB1Yl9rZXkgPT0gTlVMTCAmJgogICAgICAgKHJldC0+cHViX2tleSA9IEVDX1BPSU5UX25ldyhyZXQtPmdyb3VwKSkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIG8yaV9FQ1B1YmxpY0tleSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiAwOwogICB9CiAgIGlmICghRUNfUE9JTlRfb2N0MnBvaW50KHJldC0+Z3JvdXAsIHJldC0+cHViX2tleSwgKmlucCwgbGVuLCBOVUxMKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9FQ19MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBvMmlfRUNQdWJsaWNLZXksIEVSUl9SX0VDX0xJQik7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgLyogc2F2ZSB0aGUgcG9pbnQgY29udmVyc2lvbiBmb3JtICovCkBAIC01NDAsNyArNTQxLDcgQEAKICAgaW50IG5ld19idWZmZXIgPSAwOwogCiAgIGlmIChrZXkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBpMm9fRUNQdWJsaWNLZXksIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNTU1LDE0ICs1NTYsMTQgQEAKICAgaWYgKCpvdXRwID09IE5VTEwpIHsKICAgICAqb3V0cCA9IE9QRU5TU0xfbWFsbG9jKGJ1Zl9sZW4pOwogICAgIGlmICgqb3V0cCA9PSBOVUxMKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGkyb19FQ1B1YmxpY0tleSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIG5ld19idWZmZXIgPSAxOwogICB9CiAgIGlmICghRUNfUE9JTlRfcG9pbnQyb2N0KGtleS0+Z3JvdXAsIGtleS0+cHViX2tleSwga2V5LT5jb252X2Zvcm0sICpvdXRwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfbGVuLCBOVUxMKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9FQ19MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBpMm9fRUNQdWJsaWNLZXksIEVSUl9SX0VDX0xJQik7CiAgICAgaWYgKG5ld19idWZmZXIpIHsKICAgICAgIE9QRU5TU0xfZnJlZSgqb3V0cCk7CiAgICAgICAqb3V0cCA9IE5VTEw7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2VjL2VjX2tleS5jIGIvc3JjL2NyeXB0by9lYy9lY19rZXkuYwppbmRleCAwZGVmYTk4Li5lNWNiZmVkIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2VjL2VjX2tleS5jCisrKyBiL3NyYy9jcnlwdG8vZWMvZWNfa2V5LmMKQEAgLTg3LDcgKzg3LDcgQEAKIEVDX0tFWSAqRUNfS0VZX25ld19tZXRob2QoY29uc3QgRU5HSU5FICplbmdpbmUpIHsKICAgRUNfS0VZICpyZXQgPSAoRUNfS0VZICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEVDX0tFWSkpOwogICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19LRVlfbmV3X21ldGhvZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKQEAgLTEyNyw3ICsxMjcsNyBAQAogRUNfS0VZICpFQ19LRVlfbmV3X2J5X2N1cnZlX25hbWUoaW50IG5pZCkgewogICBFQ19LRVkgKnJldCA9IEVDX0tFWV9uZXcoKTsKICAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgcmV0LT5ncm91cCA9IEVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lKG5pZCk7CkBAIC0xNjYsNyArMTY2LDcgQEAKIAogRUNfS0VZICpFQ19LRVlfY29weShFQ19LRVkgKmRlc3QsIGNvbnN0IEVDX0tFWSAqc3JjKSB7CiAgIGlmIChkZXN0ID09IE5VTEwgfHwgc3JjID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfS0VZX2NvcHksIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgLyogQ29weSB0aGUgcGFyYW1ldGVycy4gKi8KQEAgLTMwMCwxMiArMzAwLDEyIEBACiAgIEVDX1BPSU5UICpwb2ludCA9IE5VTEw7CiAKICAgaWYgKCFlY2tleSB8fCAhZWNrZXktPmdyb3VwIHx8ICFlY2tleS0+cHViX2tleSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19LRVlfY2hlY2tfa2V5LCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKEVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGVja2V5LT5ncm91cCwgZWNrZXktPnB1Yl9rZXkpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfUE9JTlRfQVRfSU5GSU5JVFkpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19LRVlfY2hlY2tfa2V5LCBFQ19SX1BPSU5UX0FUX0lORklOSVRZKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0zMTksNyArMzE5LDcgQEAKIAogICAvKiB0ZXN0aW5nIHdoZXRoZXIgdGhlIHB1Yl9rZXkgaXMgb24gdGhlIGVsbGlwdGljIGN1cnZlICovCiAgIGlmICghRUNfUE9JTlRfaXNfb25fY3VydmUoZWNrZXktPmdyb3VwLCBlY2tleS0+cHViX2tleSwgY3R4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX1BPSU5UX0lTX05PVF9PTl9DVVJWRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0tFWV9jaGVja19rZXksIEVDX1JfUE9JTlRfSVNfTk9UX09OX0NVUlZFKTsKICAgICBnb3RvIGVycjsKICAgfQogICAvKiB0ZXN0aW5nIHdoZXRoZXIgcHViX2tleSAqIG9yZGVyIGlzIHRoZSBwb2ludCBhdCBpbmZpbml0eSAqLwpAQCAtMzI3LDE1ICszMjcsMTUgQEAKICAgICogdG8gY2hlY2sgdGhlIHByaXZhdGUga2V5LCBiZWxvdz8gKi8KICAgb3JkZXIgPSAmZWNrZXktPmdyb3VwLT5vcmRlcjsKICAgaWYgKEJOX2lzX3plcm8ob3JkZXIpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5WQUxJRF9HUk9VUF9PUkRFUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0tFWV9jaGVja19rZXksIEVDX1JfSU5WQUxJRF9HUk9VUF9PUkRFUik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgaWYgKCFFQ19QT0lOVF9tdWwoZWNrZXktPmdyb3VwLCBwb2ludCwgTlVMTCwgZWNrZXktPnB1Yl9rZXksIG9yZGVyLCBjdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0VDX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0tFWV9jaGVja19rZXksIEVSUl9SX0VDX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgaWYgKCFFQ19QT0lOVF9pc19hdF9pbmZpbml0eShlY2tleS0+Z3JvdXAsIHBvaW50KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX1dST05HX09SREVSKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfS0VZX2NoZWNrX2tleSwgRUNfUl9XUk9OR19PUkRFUik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgLyogaW4gY2FzZSB0aGUgcHJpdl9rZXkgaXMgcHJlc2VudCA6CkBAIC0zNDMsMTUgKzM0MywxNSBAQAogICAgKi8KICAgaWYgKGVja2V5LT5wcml2X2tleSkgewogICAgIGlmIChCTl9jbXAoZWNrZXktPnByaXZfa2V5LCBvcmRlcikgPj0gMCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfV1JPTkdfT1JERVIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0tFWV9jaGVja19rZXksIEVDX1JfV1JPTkdfT1JERVIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIGlmICghRUNfUE9JTlRfbXVsKGVja2V5LT5ncm91cCwgcG9pbnQsIGVja2V5LT5wcml2X2tleSwgTlVMTCwgTlVMTCwgY3R4KSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0VDX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfS0VZX2NoZWNrX2tleSwgRVJSX1JfRUNfTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICBpZiAoRUNfUE9JTlRfY21wKGVja2V5LT5ncm91cCwgcG9pbnQsIGVja2V5LT5wdWJfa2V5LCBjdHgpICE9IDApIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOVkFMSURfUFJJVkFURV9LRVkpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0tFWV9jaGVja19rZXksIEVDX1JfSU5WQUxJRF9QUklWQVRFX0tFWSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0KQEAgLTM3MSw3ICszNzEsOCBAQAogICBpbnQgb2sgPSAwOwogCiAgIGlmICgha2V5IHx8ICFrZXktPmdyb3VwIHx8ICF4IHx8ICF5KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0tFWV9zZXRfcHVibGljX2tleV9hZmZpbmVfY29vcmRpbmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKICAgICByZXR1cm4gMDsKICAgfQogICBjdHggPSBCTl9DVFhfbmV3KCk7CkBAIC0zOTMsNyArMzk0LDggQEAKICAgLyogQ2hlY2sgaWYgcmV0cmlldmVkIGNvb3JkaW5hdGVzIG1hdGNoIG9yaWdpbmFsczogaWYgbm90IHZhbHVlcwogICAgKiBhcmUgb3V0IG9mIHJhbmdlLiAqLwogICBpZiAoQk5fY21wKHgsIHR4KSB8fCBCTl9jbXAoeSwgdHkpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfQ09PUkRJTkFURVNfT1VUX09GX1JBTkdFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfS0VZX3NldF9wdWJsaWNfa2V5X2FmZmluZV9jb29yZGluYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICBFQ19SX0NPT1JESU5BVEVTX09VVF9PRl9SQU5HRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNDIwLDcgKzQyMiw3IEBACiAgIEVDX1BPSU5UICpwdWJfa2V5ID0gTlVMTDsKIAogICBpZiAoIWVja2V5IHx8ICFlY2tleS0+Z3JvdXApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfS0VZX2dlbmVyYXRlX2tleSwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKICAgICByZXR1cm4gMDsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2VjL2VjX21vbnRnb21lcnkuYyBiL3NyYy9jcnlwdG8vZWMvZWNfbW9udGdvbWVyeS5jCmluZGV4IGI4OTcwMDAuLjc0ZGJjNmMgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZWMvZWNfbW9udGdvbWVyeS5jCisrKyBiL3NyYy9jcnlwdG8vZWMvZWNfbW9udGdvbWVyeS5jCkBAIC0yMDAsNyArMjAwLDcgQEAKICAgICBnb3RvIGVycjsKICAgfQogICBpZiAoIUJOX01PTlRfQ1RYX3NldChtb250LCBwLCBjdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0JOX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9tb250X2dyb3VwX3NldF9jdXJ2ZSwgRVJSX1JfQk5fTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogICBvbmUgPSBCTl9uZXcoKTsKQEAgLTIzMiw3ICsyMzIsNyBAQAogaW50IGVjX0dGcF9tb250X2ZpZWxkX211bChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqY3R4KSB7CiAgIGlmIChncm91cC0+bW9udCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfTk9UX0lOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX21vbnRfZmllbGRfbXVsLCBFQ19SX05PVF9JTklUSUFMSVpFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjQyLDcgKzI0Miw3IEBACiBpbnQgZWNfR0ZwX21vbnRfZmllbGRfc3FyKGNvbnN0IEVDX0dST1VQICpncm91cCwgQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KSB7CiAgIGlmIChncm91cC0+bW9udCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfTk9UX0lOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX21vbnRfZmllbGRfc3FyLCBFQ19SX05PVF9JTklUSUFMSVpFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjUyLDcgKzI1Miw3IEBACiBpbnQgZWNfR0ZwX21vbnRfZmllbGRfZW5jb2RlKGNvbnN0IEVDX0dST1VQICpncm91cCwgQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KSB7CiAgIGlmIChncm91cC0+bW9udCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfTk9UX0lOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX21vbnRfZmllbGRfZW5jb2RlLCBFQ19SX05PVF9JTklUSUFMSVpFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjYyLDcgKzI2Miw3IEBACiBpbnQgZWNfR0ZwX21vbnRfZmllbGRfZGVjb2RlKGNvbnN0IEVDX0dST1VQICpncm91cCwgQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KSB7CiAgIGlmIChncm91cC0+bW9udCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfTk9UX0lOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX21vbnRfZmllbGRfZGVjb2RlLCBFQ19SX05PVF9JTklUSUFMSVpFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjcyLDcgKzI3Miw3IEBACiBpbnQgZWNfR0ZwX21vbnRfZmllbGRfc2V0X3RvX29uZShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJJR05VTSAqciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KSB7CiAgIGlmIChncm91cC0+b25lID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9OT1RfSU5JVElBTElaRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfbW9udF9maWVsZF9zZXRfdG9fb25lLCBFQ19SX05PVF9JTklUSUFMSVpFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lYy9vY3QuYyBiL3NyYy9jcnlwdG8vZWMvb2N0LmMKaW5kZXggY2I1MGUxNy4uODE2YTQyZiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lYy9vY3QuYworKysgYi9zcmMvY3J5cHRvL2VjL29jdC5jCkBAIC04NSw3ICs4NSw3IEBACiAKICAgaWYgKChmb3JtICE9IFBPSU5UX0NPTlZFUlNJT05fQ09NUFJFU1NFRCkgJiYKICAgICAgIChmb3JtICE9IFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VEKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOVkFMSURfRk9STSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfcG9pbnQyb2N0LCBFQ19SX0lOVkFMSURfRk9STSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtOTMsNyArOTMsNyBAQAogICAgIC8qIGVuY29kZXMgdG8gYSBzaW5nbGUgMCBvY3RldCAqLwogICAgIGlmIChidWYgIT0gTlVMTCkgewogICAgICAgaWYgKGxlbiA8IDEpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX3BvaW50Mm9jdCwgRUNfUl9CVUZGRVJfVE9PX1NNQUxMKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAgICAgICBidWZbMF0gPSAwOwpAQCAtMTEwLDcgKzExMCw3IEBACiAgIC8qIGlmICdidWYnIGlzIE5VTEwsIGp1c3QgcmV0dXJuIHJlcXVpcmVkIGxlbmd0aCAqLwogICBpZiAoYnVmICE9IE5VTEwpIHsKICAgICBpZiAobGVuIDwgcmV0KSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX3BvaW50Mm9jdCwgRUNfUl9CVUZGRVJfVE9PX1NNQUxMKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtMTQyLDIxICsxNDIsMjEgQEAKICAgICBpID0gMTsKIAogICAgIGlmICghQk5fYm4yYmluX3BhZGRlZChidWYgKyBpLCBmaWVsZF9sZW4sIHgpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfcG9pbnQyb2N0LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgICAgaSArPSBmaWVsZF9sZW47CiAKICAgICBpZiAoZm9ybSA9PSBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRCkgewogICAgICAgaWYgKCFCTl9ibjJiaW5fcGFkZGVkKGJ1ZiArIGksIGZpZWxkX2xlbiwgeSkpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfcG9pbnQyb2N0LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogICAgICAgaSArPSBmaWVsZF9sZW47CiAgICAgfQogCiAgICAgaWYgKGkgIT0gcmV0KSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfcG9pbnQyb2N0LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0KQEAgLTE4Nyw3ICsxODcsNyBAQAogICBpbnQgcmV0ID0gMDsKIAogICBpZiAobGVuID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9vY3QycG9pbnQsIEVDX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgZm9ybSA9IGJ1ZlswXTsKQEAgLTE5NSwxNyArMTk1LDE3IEBACiAgIGZvcm0gPSBmb3JtICYgfjFVOwogICBpZiAoKGZvcm0gIT0gMCkgJiYgKGZvcm0gIT0gUE9JTlRfQ09OVkVSU0lPTl9DT01QUkVTU0VEKSAmJgogICAgICAgKGZvcm0gIT0gUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5WQUxJRF9FTkNPRElORyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfb2N0MnBvaW50LCBFQ19SX0lOVkFMSURfRU5DT0RJTkcpOwogICAgIHJldHVybiAwOwogICB9CiAgIGlmICgoZm9ybSA9PSAwIHx8IGZvcm0gPT0gUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQpICYmIHlfYml0KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5WQUxJRF9FTkNPRElORyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfb2N0MnBvaW50LCBFQ19SX0lOVkFMSURfRU5DT0RJTkcpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGZvcm0gPT0gMCkgewogICAgIGlmIChsZW4gIT0gMSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5WQUxJRF9FTkNPRElORyk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9vY3QycG9pbnQsIEVDX1JfSU5WQUxJRF9FTkNPRElORyk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTIxNyw3ICsyMTcsNyBAQAogICAgICAgKGZvcm0gPT0gUE9JTlRfQ09OVkVSU0lPTl9DT01QUkVTU0VEKSA/IDEgKyBmaWVsZF9sZW4gOiAxICsgMiAqIGZpZWxkX2xlbjsKIAogICBpZiAobGVuICE9IGVuY19sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTlZBTElEX0VOQ09ESU5HKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9vY3QycG9pbnQsIEVDX1JfSU5WQUxJRF9FTkNPRElORyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjMxLDcgKzIzMSw3IEBACiAgIEJOX0NUWF9zdGFydChjdHgpOwogICB4ID0gQk5fQ1RYX2dldChjdHgpOwogICB5ID0gQk5fQ1RYX2dldChjdHgpOwotICBpZiAoeCA9PSBOVUxMIHx8IHkgPT0gTlVMTCkgeworICBpZiAoeSA9PSBOVUxMKSB7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMjM5LDcgKzIzOSw3IEBACiAgICAgZ290byBlcnI7CiAgIH0KICAgaWYgKEJOX3VjbXAoeCwgJmdyb3VwLT5maWVsZCkgPj0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOVkFMSURfRU5DT0RJTkcpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX29jdDJwb2ludCwgRUNfUl9JTlZBTElEX0VOQ09ESU5HKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0yNTIsNyArMjUyLDcgQEAKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICBpZiAoQk5fdWNtcCh5LCAmZ3JvdXAtPmZpZWxkKSA+PSAwKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTlZBTElEX0VOQ09ESU5HKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX29jdDJwb2ludCwgRUNfUl9JTlZBTElEX0VOQ09ESU5HKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtMjYzLDcgKzI2Myw3IEBACiAKICAgLyogdGVzdCByZXF1aXJlZCBieSBYOS42MiAqLwogICBpZiAoIUVDX1BPSU5UX2lzX29uX2N1cnZlKGdyb3VwLCBwb2ludCwgY3R4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX1BPSU5UX0lTX05PVF9PTl9DVVJWRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfb2N0MnBvaW50LCBFQ19SX1BPSU5UX0lTX05PVF9PTl9DVVJWRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMjc5LDExICsyNzksMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3QgbGVuLCBCTl9DVFggKmN0eCkgewogICBpZiAoZ3JvdXAtPm1ldGgtPm9jdDJwb2ludCA9PSAwICYmCiAgICAgICAhKGdyb3VwLT5tZXRoLT5mbGFncyAmIEVDX0ZMQUdTX0RFRkFVTFRfT0NUKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9vY3QycG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnQtPm1ldGgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX29jdDJwb2ludCwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGdyb3VwLT5tZXRoLT5mbGFncyAmIEVDX0ZMQUdTX0RFRkFVTFRfT0NUKSB7CkBAIC0yOTgsMTEgKzI5OSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLCBCTl9DVFggKmN0eCkgewogICBpZiAoZ3JvdXAtPm1ldGgtPnBvaW50Mm9jdCA9PSAwICYmCiAgICAgICAhKGdyb3VwLT5tZXRoLT5mbGFncyAmIEVDX0ZMQUdTX0RFRkFVTFRfT0NUKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9wb2ludDJvY3QsCisgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnQtPm1ldGgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX3BvaW50Mm9jdCwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGdyb3VwLT5tZXRoLT5mbGFncyAmIEVDX0ZMQUdTX0RFRkFVTFRfT0NUKSB7CkBAIC00MDQsOSArNDA2LDkgQEAKICAgICBpZiAoRVJSX0dFVF9MSUIoZXJyKSA9PSBFUlJfTElCX0JOICYmCiAgICAgICAgIEVSUl9HRVRfUkVBU09OKGVycikgPT0gQk5fUl9OT1RfQV9TUVVBUkUpIHsKICAgICAgIEVSUl9jbGVhcl9lcnJvcigpOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5WQUxJRF9DT01QUkVTU0VEX1BPSU5UKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzLCBFQ19SX0lOVkFMSURfQ09NUFJFU1NFRF9QT0lOVCk7CiAgICAgfSBlbHNlIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9CTl9MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXMsIEVSUl9SX0JOX0xJQik7CiAgICAgfQogICAgIGdvdG8gZXJyOwogICB9CkBAIC00MjEsMTAgKzQyMywxMiBAQAogICAgICAgfQogCiAgICAgICBpZiAoa3JvbiA9PSAxKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOVkFMSURfQ09NUFJFU1NJT05fQklUKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVDX1JfSU5WQUxJRF9DT01QUkVTU0lPTl9CSVQpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgLyogQk5fbW9kX3NxcnQoKSBzaG91bGQgaGF2ZSBjb3VnaHQgdGhpcyBlcnJvciAobm90IGEgc3F1YXJlKSAqLwotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTlZBTElEX0NPTVBSRVNTRURfUE9JTlQpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRUNfUl9JTlZBTElEX0NPTVBSRVNTRURfUE9JTlQpOwogICAgICAgfQogICAgICAgZ290byBlcnI7CiAgICAgfQpAQCAtNDMzLDcgKzQzNyw4IEBACiAgICAgfQogICB9CiAgIGlmICh5X2JpdCAhPSBCTl9pc19vZGQoeSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzLAorICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC00NTQsMTEgKzQ1OSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9iaXQsIEJOX0NUWCAqY3R4KSB7CiAgIGlmIChncm91cC0+bWV0aC0+cG9pbnRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXMgPT0gMCAmJgogICAgICAgIShncm91cC0+bWV0aC0+ZmxhZ3MgJiBFQ19GTEFHU19ERUZBVUxUX09DVCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0ZwLAorICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGdyb3VwLT5tZXRoICE9IHBvaW50LT5tZXRoKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRnAsCisgICAgICAgICAgICAgICAgICAgICAgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGdyb3VwLT5tZXRoLT5mbGFncyAmIEVDX0ZMQUdTX0RFRkFVTFRfT0NUKSB7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2VjL3AyNTYtNjQuYyBiL3NyYy9jcnlwdG8vZWMvcDI1Ni02NC5jCmluZGV4IDM5NDZiMjkuLmZkYjk0MmMgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZWMvcDI1Ni02NC5jCisrKyBiL3NyYy9jcnlwdG8vZWMvcDI1Ni02NC5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIC8qIEJOX3RvX2ZlbGVtIGNvbnZlcnRzIGFuIE9wZW5TU0wgQklHTlVNIGludG8gYW4gZmVsZW0uICovCiBzdGF0aWMgaW50IEJOX3RvX2ZlbGVtKGZlbGVtIG91dCwgY29uc3QgQklHTlVNICpibikgewogICBpZiAoQk5faXNfbmVnYXRpdmUoYm4pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfQklHTlVNX09VVF9PRl9SQU5HRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEJOX3RvX2ZlbGVtLCBFQ19SX0JJR05VTV9PVVRfT0ZfUkFOR0UpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTEzNCw3ICsxMzQsNyBAQAogICBtZW1zZXQoYl9vdXQsIDAsIHNpemVvZihiX291dCkpOwogICB1bnNpZ25lZCBudW1fYnl0ZXMgPSBCTl9udW1fYnl0ZXMoYm4pOwogICBpZiAobnVtX2J5dGVzID4gc2l6ZW9mKGJfb3V0KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0JJR05VTV9PVVRfT0ZfUkFOR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBCTl90b19mZWxlbSwgRUNfUl9CSUdOVU1fT1VUX09GX1JBTkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xNjM4LDcgKzE2MzgsOCBAQAogICBpZiAoQk5fY21wKGN1cnZlX3AsIHApIHx8CiAgICAgICBCTl9jbXAoY3VydmVfYSwgYSkgfHwKICAgICAgIEJOX2NtcChjdXJ2ZV9iLCBiKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX1dST05HX0NVUlZFX1BBUkFNRVRFUlMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfbmlzdHAyNTZfZ3JvdXBfc2V0X2N1cnZlLAorICAgICAgICAgICAgICAgICAgICAgIEVDX1JfV1JPTkdfQ1VSVkVfUEFSQU1FVEVSUyk7CiAgICAgZ290byBlcnI7CiAgIH0KICAgcmV0ID0gZWNfR0ZwX3NpbXBsZV9ncm91cF9zZXRfY3VydmUoZ3JvdXAsIHAsIGEsIGIsIGN0eCk7CkBAIC0xNjYwLDcgKzE2NjEsOCBAQAogICBsb25nZmVsZW0gdG1wOwogCiAgIGlmIChFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgcG9pbnQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfUE9JTlRfQVRfSU5GSU5JVFkpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfbmlzdHAyNTZfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICBFQ19SX1BPSU5UX0FUX0lORklOSVRZKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoIUJOX3RvX2ZlbGVtKHhfaW4sICZwb2ludC0+WCkgfHwKQEAgLTE2NzUsNyArMTY3Nyw4IEBACiAgIGZlbGVtX3JlZHVjZSh4X2luLCB0bXApOwogICBmZWxlbV9jb250cmFjdCh4X291dCwgeF9pbik7CiAgIGlmICh4ICE9IE5VTEwgJiYgIXNtYWxsZmVsZW1fdG9fQk4oeCwgeF9vdXQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0JOX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9uaXN0cDI1Nl9wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzLAorICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX0JOX0xJQik7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgZmVsZW1fbXVsKHRtcCwgejEsIHoyKTsKQEAgLTE2ODQsNyArMTY4Nyw4IEBACiAgIGZlbGVtX3JlZHVjZSh5X2luLCB0bXApOwogICBmZWxlbV9jb250cmFjdCh5X291dCwgeV9pbik7CiAgIGlmICh5ICE9IE5VTEwgJiYgIXNtYWxsZmVsZW1fdG9fQk4oeSwgeV9vdXQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0JOX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9uaXN0cDI1Nl9wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzLAorICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX0JOX0xJQik7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0dXJuIDE7CkBAIC0xNzU5LDcgKzE3NjMsNyBAQAogICAgIGlmICghc21hbGxmZWxlbV90b19CTih4LCBnX3ByZV9jb21wWzBdWzFdWzBdKSB8fAogICAgICAgICAhc21hbGxmZWxlbV90b19CTih5LCBnX3ByZV9jb21wWzBdWzFdWzFdKSB8fAogICAgICAgICAhc21hbGxmZWxlbV90b19CTih6LCBnX3ByZV9jb21wWzBdWzFdWzJdKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0JOX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX25pc3RwMjU2X3BvaW50c19tdWwsIEVSUl9SX0JOX0xJQik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgICAgaWYgKCFlY19wb2ludF9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLCBnZW5lcmF0b3IsIHgsIHksIHosCkBAIC0xNzkwLDcgKzE3OTQsNyBAQAogICAgIH0KICAgICBpZiAoc2VjcmV0cyA9PSBOVUxMIHx8IHByZV9jb21wID09IE5VTEwgfHwKICAgICAgICAgKG1peGVkICYmIHRtcF9zbWFsbGZlbGVtcyA9PSBOVUxMKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfbmlzdHAyNTZfcG9pbnRzX211bCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogCkBAIC0xODE0LDcgKzE4MTgsNyBAQAogICAgICAgICAgIC8qIHRoaXMgaXMgYW4gdW51c3VhbCBpbnB1dCwgYW5kIHdlIGRvbid0IGd1YXJhbnRlZQogICAgICAgICAgICAqIGNvbnN0YW50LXRpbWVuZXNzLiAqLwogICAgICAgICAgIGlmICghQk5fbm5tb2QodG1wX3NjYWxhciwgcF9zY2FsYXIsICZncm91cC0+b3JkZXIsIGN0eCkpIHsKLSAgICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9CTl9MSUIpOworICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9uaXN0cDI1Nl9wb2ludHNfbXVsLCBFUlJfUl9CTl9MSUIpOwogICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgICAgfQogICAgICAgICAgIG51bV9ieXRlcyA9IEJOX2JuMmJpbih0bXBfc2NhbGFyLCB0bXApOwpAQCAtMTg1OSw3ICsxODYzLDcgQEAKICAgICAgIC8qIHRoaXMgaXMgYW4gdW51c3VhbCBpbnB1dCwgYW5kIHdlIGRvbid0IGd1YXJhbnRlZQogICAgICAgICogY29uc3RhbnQtdGltZW5lc3MuICovCiAgICAgICBpZiAoIUJOX25ubW9kKHRtcF9zY2FsYXIsIHNjYWxhciwgJmdyb3VwLT5vcmRlciwgY3R4KSkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfQk5fTElCKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9uaXN0cDI1Nl9wb2ludHNfbXVsLCBFUlJfUl9CTl9MSUIpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KICAgICAgIG51bV9ieXRlcyA9IEJOX2JuMmJpbih0bXBfc2NhbGFyLCB0bXApOwpAQCAtMTg4NSw3ICsxODg5LDcgQEAKICAgaWYgKCFzbWFsbGZlbGVtX3RvX0JOKHgsIHhfaW4pIHx8CiAgICAgICAhc21hbGxmZWxlbV90b19CTih5LCB5X2luKSB8fAogICAgICAgIXNtYWxsZmVsZW1fdG9fQk4oeiwgel9pbikpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfQk5fTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX25pc3RwMjU2X3BvaW50c19tdWwsIEVSUl9SX0JOX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgcmV0ID0gZWNfcG9pbnRfc2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcChncm91cCwgciwgeCwgeSwgeiwgY3R4KTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZWMvc2ltcGxlLmMgYi9zcmMvY3J5cHRvL2VjL3NpbXBsZS5jCmluZGV4IGM2MjE5OWMuLjY5ZmQyZTQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZWMvc2ltcGxlLmMKKysrIGIvc3JjL2NyeXB0by9lYy9zaW1wbGUuYwpAQCAtMTcyLDcgKzE3Miw3IEBACiAKICAgLyogcCBtdXN0IGJlIGEgcHJpbWUgPiAzICovCiAgIGlmIChCTl9udW1fYml0cyhwKSA8PSAyIHx8ICFCTl9pc19vZGQocCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTlZBTElEX0ZJRUxEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9ncm91cF9zZXRfY3VydmUsIEVDX1JfSU5WQUxJRF9GSUVMRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjgzLDcgKzI4Myw4IEBACiAgIGlmIChjdHggPT0gTlVMTCkgewogICAgIGN0eCA9IG5ld19jdHggPSBCTl9DVFhfbmV3KCk7CiAgICAgaWYgKGN0eCA9PSBOVUxMKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfZ3JvdXBfY2hlY2tfZGlzY3JpbWluYW50LAorICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9CkBAIC00OTEsNyArNDkyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICp5LCBCTl9DVFggKmN0eCkgewogICBpZiAoeCA9PSBOVUxMIHx8IHkgPT0gTlVMTCkgewogICAgIC8qIHVubGlrZSBmb3IgcHJvamVjdGl2ZSBjb29yZGluYXRlcywgd2UgZG8gbm90IHRvbGVyYXRlIHRoaXMgKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9wb2ludF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzLAorICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNTA4LDcgKzUxMCw4IEBACiAgIGludCByZXQgPSAwOwogCiAgIGlmIChFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgcG9pbnQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfUE9JTlRfQVRfSU5GSU5JVFkpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX3BvaW50X2dldF9hZmZpbmVfY29vcmRpbmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgRUNfUl9QT0lOVF9BVF9JTkZJTklUWSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNTI0LDcgKzUyNyw3IEBACiAgIFpfMSA9IEJOX0NUWF9nZXQoY3R4KTsKICAgWl8yID0gQk5fQ1RYX2dldChjdHgpOwogICBaXzMgPSBCTl9DVFhfZ2V0KGN0eCk7Ci0gIGlmIChaID09IE5VTEwgfHwgWl8xID09IE5VTEwgfHwgWl8yID09IE5VTEwgfHwgWl8zID09IE5VTEwpIHsKKyAgaWYgKFpfMyA9PSBOVUxMKSB7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNTU3LDcgKzU2MCw4IEBACiAgICAgfQogICB9IGVsc2UgewogICAgIGlmICghQk5fbW9kX2ludmVyc2UoWl8xLCBaXywgJmdyb3VwLT5maWVsZCwgY3R4KSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0JOX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfQk5fTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtMTE3OSw3ICsxMTgzLDcgQEAKICAgICBnb3RvIGVycjsKICAgfQogICBpZiAoIXBvaW50LT5aX2lzX29uZSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfbWFrZV9hZmZpbmUsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0xMjY1LDcgKzEyNjksNyBAQAogICAgKiBub24temVybyBwb2ludHNbaV0tPlogYnkgaXRzIGludmVyc2UuICovCiAKICAgaWYgKCFCTl9tb2RfaW52ZXJzZSh0bXAsIHByb2RfWltudW0gLSAxXSwgJmdyb3VwLT5maWVsZCwgY3R4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX3BvaW50c19tYWtlX2FmZmluZSwgRVJSX1JfQk5fTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2VjL3duYWYuYyBiL3NyYy9jcnlwdG8vZWMvd25hZi5jCmluZGV4IDdmYTBlMWIuLmFlMGQ3M2YgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZWMvd25hZi5jCisrKyBiL3NyYy9jcnlwdG8vZWMvd25hZi5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIAogICByZXQgPSAoRUNfUFJFX0NPTVAgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoRUNfUFJFX0NPTVApKTsKICAgaWYgKCFyZXQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19wcmVfY29tcF9uZXcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gcmV0OwogICB9CiAgIHJldC0+YmxvY2tzaXplID0gODsgLyogZGVmYXVsdCAqLwpAQCAtMTU4LDcgKzE1OCw3IEBACiAgIGlmIChCTl9pc196ZXJvKHNjYWxhcikpIHsKICAgICByID0gT1BFTlNTTF9tYWxsb2MoMSk7CiAgICAgaWYgKCFyKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGNvbXB1dGVfd05BRiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIHJbMF0gPSAwOwpAQCAtMTY5LDcgKzE2OSw3IEBACiAgIGlmICh3IDw9IDAgfHwgdyA+IDcpIC8qICdzaWduZWQgY2hhcicgY2FuIHJlcHJlc2VudCBpbnRlZ2VycyB3aXRoIGFic29sdXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBsZXNzIHRoYW4gMl43ICovCiAgIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBjb21wdXRlX3dOQUYsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICBnb3RvIGVycjsKICAgfQogICBiaXQgPSAxIDw8IHc7ICAgICAgICAvKiBhdCBtb3N0IDEyOCAqLwpAQCAtMTgxLDcgKzE4MSw3IEBACiAgIH0KIAogICBpZiAoc2NhbGFyLT5kID09IE5VTEwgfHwgc2NhbGFyLT50b3AgPT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGNvbXB1dGVfd05BRiwgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTE5Miw3ICsxOTIsNyBAQAogICAgICAgICAgICAqICgqcmV0X2xlbiB3aWxsIGJlIHNldCB0byB0aGUgYWN0dWFsIGxlbmd0aCwgaS5lLiBhdCBtb3N0CiAgICAgICAgICAgICogQk5fbnVtX2JpdHMoc2NhbGFyKSArIDEpICovCiAgIGlmIChyID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBjb21wdXRlX3dOQUYsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogICB3aW5kb3dfdmFsID0gc2NhbGFyLT5kWzBdICYgbWFzazsKQEAgLTIyNSw3ICsyMjUsNyBAQAogICAgICAgfQogCiAgICAgICBpZiAoZGlnaXQgPD0gLWJpdCB8fCBkaWdpdCA+PSBiaXQgfHwgIShkaWdpdCAmIDEpKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBjb21wdXRlX3dOQUYsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAKQEAgLTIzNSw3ICsyMzUsNyBAQAogICAgICAgICogZm9yIG1vZGlmaWVkIHdpbmRvdyBOQUZzLCBpdCBtYXkgYWxzbyBiZSAyXncKICAgICAgICAqLwogICAgICAgaWYgKHdpbmRvd192YWwgIT0gMCAmJiB3aW5kb3dfdmFsICE9IG5leHRfYml0ICYmIHdpbmRvd192YWwgIT0gYml0KSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBjb21wdXRlX3dOQUYsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAgICAgfQpAQCAtMjQ2LDEzICsyNDYsMTMgQEAKICAgICB3aW5kb3dfdmFsICs9IGJpdCAqIEJOX2lzX2JpdF9zZXQoc2NhbGFyLCBqICsgdyk7CiAKICAgICBpZiAod2luZG93X3ZhbCA+IG5leHRfYml0KSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGNvbXB1dGVfd05BRiwgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9CiAKICAgaWYgKGogPiBsZW4gKyAxKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgY29tcHV0ZV93TkFGLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgbGVuID0gajsKQEAgLTMxNiw3ICszMTYsNyBAQAogICBpbnQgcmV0ID0gMDsKIAogICBpZiAoZ3JvdXAtPm1ldGggIT0gci0+bWV0aCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfd05BRl9tdWwsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTMyNiw3ICszMjYsNyBAQAogCiAgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewogICAgIGlmIChncm91cC0+bWV0aCAhPSBwb2ludHNbaV0tPm1ldGgpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX211bCwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgIH0KQEAgLTM0MSw3ICszNDEsNyBAQAogICBpZiAoc2NhbGFyICE9IE5VTEwpIHsKICAgICBnZW5lcmF0b3IgPSBFQ19HUk9VUF9nZXQwX2dlbmVyYXRvcihncm91cCk7CiAgICAgaWYgKGdlbmVyYXRvciA9PSBOVUxMKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9VTkRFRklORURfR0VORVJBVE9SKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX211bCwgRUNfUl9VTkRFRklORURfR0VORVJBVE9SKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtMzY2LDcgKzM2Niw3IEBACiAKICAgICAgIC8qIGNoZWNrIHRoYXQgcHJlX2NvbXAgbG9va3Mgc2FuZSAqLwogICAgICAgaWYgKHByZV9jb21wLT5udW0gIT0gKHByZV9jb21wLT5udW1ibG9ja3MgKiBwcmVfcG9pbnRzX3Blcl9ibG9jaykpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3dOQUZfbXVsLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC0zOTEsNyArMzkxLDcgQEAKICAgfQogCiAgIGlmICghd3NpemUgfHwgIXdOQUZfbGVuIHx8ICF3TkFGIHx8ICF2YWxfc3ViKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfd05BRl9tdWwsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC00MjAsNyArNDIwLDcgQEAKIAogICAgIGlmIChwcmVfY29tcCA9PSBOVUxMKSB7CiAgICAgICBpZiAobnVtX3NjYWxhciAhPSAxKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX211bCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KICAgICAgIC8qIHdlIGhhdmUgYWxyZWFkeSBnZW5lcmF0ZWQgYSB3TkFGIGZvciAnc2NhbGFyJyAqLwpAQCAtNDI5LDcgKzQyOSw3IEBACiAgICAgICBzaXplX3QgdG1wX2xlbiA9IDA7CiAKICAgICAgIGlmIChudW1fc2NhbGFyICE9IDApIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3dOQUZfbXVsLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogCkBAIC00NjMsOCArNDYzLDcgQEAKICAgICAgICAgICAvKiBwb3NzaWJseSB3ZSBjYW4gZG8gd2l0aCBmZXdlciBibG9ja3MgdGhhbiBlc3RpbWF0ZWQgKi8KICAgICAgICAgICBudW1ibG9ja3MgPSAodG1wX2xlbiArIGJsb2Nrc2l6ZSAtIDEpIC8gYmxvY2tzaXplOwogICAgICAgICAgIGlmIChudW1ibG9ja3MgPiBwcmVfY29tcC0+bnVtYmxvY2tzKSB7Ci0gICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfSU5URVJOQUxfRVJST1IpOwotICAgICAgICAgICAgT1BFTlNTTF9mcmVlKHRtcF93TkFGKTsKKyAgICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX211bCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgICAgfQogICAgICAgICAgIHRvdGFsbnVtID0gbnVtICsgbnVtYmxvY2tzOwpAQCAtNDc4LDggKzQ3Nyw3IEBACiAgICAgICAgICAgaWYgKGkgPCB0b3RhbG51bSAtIDEpIHsKICAgICAgICAgICAgIHdOQUZfbGVuW2ldID0gYmxvY2tzaXplOwogICAgICAgICAgICAgaWYgKHRtcF9sZW4gPCBibG9ja3NpemUpIHsKLSAgICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKLSAgICAgICAgICAgICAgT1BFTlNTTF9mcmVlKHRtcF93TkFGKTsKKyAgICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3dOQUZfbXVsLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdG1wX2xlbiAtPSBibG9ja3NpemU7CkBAIC00OTIsNyArNDkwLDcgQEAKICAgICAgICAgICB3TkFGW2kgKyAxXSA9IE5VTEw7CiAgICAgICAgICAgd05BRltpXSA9IE9QRU5TU0xfbWFsbG9jKHdOQUZfbGVuW2ldKTsKICAgICAgICAgICBpZiAod05BRltpXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3dOQUZfbXVsLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICAgICAgICBPUEVOU1NMX2ZyZWUodG1wX3dOQUYpOwogICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgICAgfQpAQCAtNTAyLDcgKzUwMCw3IEBACiAgICAgICAgICAgfQogCiAgICAgICAgICAgaWYgKCp0bXBfcG9pbnRzID09IE5VTEwpIHsKLSAgICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfd05BRl9tdWwsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICAgICAgICAgIE9QRU5TU0xfZnJlZSh0bXBfd05BRik7CiAgICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgICB9CkBAIC01MjEsNyArNTE5LDcgQEAKICAgICovCiAgIHZhbCA9IE9QRU5TU0xfbWFsbG9jKChudW1fdmFsICsgMSkgKiBzaXplb2YgdmFsWzBdKTsKICAgaWYgKHZhbCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfd05BRl9tdWwsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogICB2YWxbbnVtX3ZhbF0gPSBOVUxMOyAvKiBwaXZvdCBlbGVtZW50ICovCkBAIC01MzksNyArNTM3LDcgQEAKICAgICB9CiAgIH0KICAgaWYgKCEodiA9PSB2YWwgKyBudW1fdmFsKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3dOQUZfbXVsLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNjk3LDcgKzY5NSw3IEBACiAKICAgZ2VuZXJhdG9yID0gRUNfR1JPVVBfZ2V0MF9nZW5lcmF0b3IoZ3JvdXApOwogICBpZiAoZ2VuZXJhdG9yID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9VTkRFRklORURfR0VORVJBVE9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfd05BRl9wcmVjb21wdXRlX211bHQsIEVDX1JfVU5ERUZJTkVEX0dFTkVSQVRPUik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNzIzLDcgKzcyMSw3IEBACiAgICAgZ290byBlcnI7CiAgIH0KICAgaWYgKEJOX2lzX3plcm8ob3JkZXIpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfVU5LTk9XTl9PUkRFUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3dOQUZfcHJlY29tcHV0ZV9tdWx0LCBFQ19SX1VOS05PV05fT1JERVIpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTc1MSw3ICs3NDksNyBAQAogCiAgIHBvaW50cyA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihFQ19QT0lOVCAqKSAqIChudW0gKyAxKSk7CiAgIGlmICghcG9pbnRzKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfd05BRl9wcmVjb21wdXRlX211bHQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC03NTksMTMgKzc1NywxMyBAQAogICB2YXJbbnVtXSA9IE5VTEw7IC8qIHBpdm90ICovCiAgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewogICAgIGlmICgodmFyW2ldID0gRUNfUE9JTlRfbmV3KGdyb3VwKSkgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX3ByZWNvbXB1dGVfbXVsdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9CiAKICAgaWYgKCEodG1wX3BvaW50ID0gRUNfUE9JTlRfbmV3KGdyb3VwKSkgfHwgIShiYXNlID0gRUNfUE9JTlRfbmV3KGdyb3VwKSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX3ByZWNvbXB1dGVfbXVsdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTc5Nyw3ICs3OTUsNyBAQAogICAgICAgc2l6ZV90IGs7CiAKICAgICAgIGlmIChibG9ja3NpemUgPD0gMikgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfd05BRl9wcmVjb21wdXRlX211bHQsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZWNkaC9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vZWNkaC9DTWFrZUxpc3RzLnR4dAppbmRleCA4ZWFlYWU1Li4zNDZlNzJkIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2VjZGgvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9lY2RoL0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCiAKIGFkZF9saWJyYXJ5KAogICBlY2RoCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2VjZGgvZWNkaC5jIGIvc3JjL2NyeXB0by9lY2RoL2VjZGguYwppbmRleCAxNDg1NmRiLi5hMDExYmFiIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2VjZGgvZWNkaC5jCisrKyBiL3NyYy9jcnlwdG8vZWNkaC9lY2RoLmMKQEAgLTk1LDcgKzk1LDcgQEAKIAogICBwcml2ID0gRUNfS0VZX2dldDBfcHJpdmF0ZV9rZXkocHJpdl9rZXkpOwogICBpZiAocHJpdiA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNESCwgRUNESF9SX05PX1BSSVZBVEVfVkFMVUUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDREgsIEVDREhfY29tcHV0ZV9rZXksIEVDREhfUl9OT19QUklWQVRFX1ZBTFVFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0xMDMsMzUgKzEwMywzNSBAQAogCiAgIHRtcCA9IEVDX1BPSU5UX25ldyhncm91cCk7CiAgIGlmICh0bXAgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDREgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RILCBFQ0RIX2NvbXB1dGVfa2V5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAoIUVDX1BPSU5UX211bChncm91cCwgdG1wLCBOVUxMLCBwdWJfa2V5LCBwcml2LCBjdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNESCwgRUNESF9SX1BPSU5UX0FSSVRITUVUSUNfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNESCwgRUNESF9jb21wdXRlX2tleSwgRUNESF9SX1BPSU5UX0FSSVRITUVUSUNfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAoIUVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLCB0bXAsIHgsIHksIGN0eCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RILCBFQ0RIX1JfUE9JTlRfQVJJVEhNRVRJQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RILCBFQ0RIX2NvbXB1dGVfa2V5LCBFQ0RIX1JfUE9JTlRfQVJJVEhNRVRJQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIGJ1ZmxlbiA9IChFQ19HUk9VUF9nZXRfZGVncmVlKGdyb3VwKSArIDcpIC8gODsKICAgYnVmID0gT1BFTlNTTF9tYWxsb2MoYnVmbGVuKTsKICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNESCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDREgsIEVDREhfY29tcHV0ZV9rZXksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIGlmICghQk5fYm4yYmluX3BhZGRlZChidWYsIGJ1ZmxlbiwgeCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RILCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNESCwgRUNESF9jb21wdXRlX2tleSwgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKEtERiAhPSAwKSB7CiAgICAgaWYgKEtERihidWYsIGJ1Zmxlbiwgb3V0LCAmb3V0bGVuKSA9PSBOVUxMKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RILCBFQ0RIX1JfS0RGX0ZBSUxFRCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RILCBFQ0RIX2NvbXB1dGVfa2V5LCBFQ0RIX1JfS0RGX0ZBSUxFRCk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgICAgcmV0ID0gb3V0bGVuOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lY2RzYS9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vZWNkc2EvQ01ha2VMaXN0cy50eHQKaW5kZXggZTc1ODFiZS4uZjQzMWU1OSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lY2RzYS9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL2VjZHNhL0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCiAKIGFkZF9saWJyYXJ5KAogICBlY2RzYQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lY2RzYS9lY2RzYS5jIGIvc3JjL2NyeXB0by9lY2RzYS9lY2RzYS5jCmluZGV4IDg0MDNkNjAuLmI3MTc5OWUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZWNkc2EvZWNkc2EuYworKysgYi9zcmMvY3J5cHRvL2VjZHNhL2VjZHNhLmMKQEAgLTUyLDExICs1Miw5IEBACiAKICNpbmNsdWRlIDxvcGVuc3NsL2VjZHNhLmg+CiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2J5dGVzdHJpbmcuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgogI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CiAKQEAgLTgzLDE4ICs4MSwxNiBAQAogICAgIHJldHVybiBlY2tleS0+ZWNkc2FfbWV0aC0+dmVyaWZ5KGRpZ2VzdCwgZGlnZXN0X2xlbiwgc2lnLCBzaWdfbGVuLCBlY2tleSk7CiAgIH0KIAotICAvKiBEZWNvZGUgdGhlIEVDRFNBIHNpZ25hdHVyZS4gKi8KLSAgcyA9IEVDRFNBX1NJR19mcm9tX2J5dGVzKHNpZywgc2lnX2xlbik7Ci0gIGlmIChzID09IE5VTEwpIHsKKyAgcyA9IEVDRFNBX1NJR19uZXcoKTsKKyAgY29uc3QgdWludDhfdCAqc2lncCA9IHNpZzsKKyAgaWYgKHMgPT0gTlVMTCB8fCBkMmlfRUNEU0FfU0lHKCZzLCAmc2lncCwgc2lnX2xlbikgPT0gTlVMTCB8fAorICAgICAgc2lncCAhPSBzaWcgKyBzaWdfbGVuKSB7CiAgICAgZ290byBlcnI7CiAgIH0KIAotICAvKiBEZWZlbmQgYWdhaW5zdCBwb3RlbnRpYWwgbGF4bmVzcyBpbiB0aGUgREVSIHBhcnNlci4gKi8KLSAgc2l6ZV90IGRlcl9sZW47Ci0gIGlmICghRUNEU0FfU0lHX3RvX2J5dGVzKCZkZXIsICZkZXJfbGVuLCBzKSB8fAotICAgICAgZGVyX2xlbiAhPSBzaWdfbGVuIHx8IG1lbWNtcChzaWcsIGRlciwgc2lnX2xlbikgIT0gMCkgewotICAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gY3J5cHRvL2J5dGVzdHJpbmcgaXMgc3RyaWN0bHkgREVSLiAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgIC8qIEVuc3VyZSB0aGF0IHRoZSBzaWduYXR1cmUgdXNlcyBERVIgYW5kIGRvZXNuJ3QgaGF2ZSB0cmFpbGluZyBnYXJiYWdlLiAqLworICBjb25zdCBpbnQgZGVyX2xlbiA9IGkyZF9FQ0RTQV9TSUcocywgJmRlcik7CisgIGlmIChkZXJfbGVuIDwgMCB8fCAoc2l6ZV90KSBkZXJfbGVuICE9IHNpZ19sZW4gfHwgbWVtY21wKHNpZywgZGVyLCBzaWdfbGVuKSkgewogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTEyMCwxNCArMTE2LDE0IEBACiAgICAgZGlnZXN0X2xlbiA9IChudW1fYml0cyArIDcpIC8gODsKICAgfQogICBpZiAoIUJOX2JpbjJibihkaWdlc3QsIGRpZ2VzdF9sZW4sIG91dCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfQk5fTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgZGlnZXN0X3RvX2JuLCBFUlJfUl9CTl9MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgLyogSWYgc3RpbGwgdG9vIGxvbmcgdHJ1bmNhdGUgcmVtYWluaW5nIGJpdHMgd2l0aCBhIHNoaWZ0ICovCiAgIGlmICgoOCAqIGRpZ2VzdF9sZW4gPiBudW1fYml0cykgJiYKICAgICAgICFCTl9yc2hpZnQob3V0LCBvdXQsIDggLSAobnVtX2JpdHMgJiAweDcpKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBkaWdlc3RfdG9fYm4sIEVSUl9SX0JOX0xJQik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTQ5LDcgKzE0NSw3IEBACiAgIGNvbnN0IEVDX1BPSU5UICpwdWJfa2V5OwogCiAgIGlmIChlY2tleS0+ZWNkc2FfbWV0aCAmJiBlY2tleS0+ZWNkc2FfbWV0aC0+dmVyaWZ5KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX1JfTk9UX0lNUExFTUVOVEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fdmVyaWZ5LCBFQ0RTQV9SX05PVF9JTVBMRU1FTlRFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTU3LDEzICsxNTMsMTMgQEAKICAgaWYgKChncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKGVja2V5KSkgPT0gTlVMTCB8fAogICAgICAgKHB1Yl9rZXkgPSBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGVja2V5KSkgPT0gTlVMTCB8fAogICAgICAgc2lnID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfUl9NSVNTSU5HX1BBUkFNRVRFUlMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb192ZXJpZnksIEVDRFNBX1JfTUlTU0lOR19QQVJBTUVURVJTKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGN0eCA9IEJOX0NUWF9uZXcoKTsKICAgaWYgKCFjdHgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb192ZXJpZnksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gMDsKICAgfQogICBCTl9DVFhfc3RhcnQoY3R4KTsKQEAgLTE3MiwyNiArMTY4LDI2IEBACiAgIHUyID0gQk5fQ1RYX2dldChjdHgpOwogICBtID0gQk5fQ1RYX2dldChjdHgpOwogICBYID0gQk5fQ1RYX2dldChjdHgpOwotICBpZiAob3JkZXIgPT0gTlVMTCB8fCB1MSA9PSBOVUxMIHx8IHUyID09IE5VTEwgfHwgbSA9PSBOVUxMIHx8IFggPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFUlJfUl9CTl9MSUIpOworICBpZiAoIVgpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fdmVyaWZ5LCBFUlJfUl9CTl9MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKCFFQ19HUk9VUF9nZXRfb3JkZXIoZ3JvdXAsIG9yZGVyLCBjdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVSUl9SX0VDX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3ZlcmlmeSwgRVJSX1JfRUNfTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIGlmIChCTl9pc196ZXJvKHNpZy0+cikgfHwgQk5faXNfbmVnYXRpdmUoc2lnLT5yKSB8fAogICAgICAgQk5fdWNtcChzaWctPnIsIG9yZGVyKSA+PSAwIHx8IEJOX2lzX3plcm8oc2lnLT5zKSB8fAogICAgICAgQk5faXNfbmVnYXRpdmUoc2lnLT5zKSB8fCBCTl91Y21wKHNpZy0+cywgb3JkZXIpID49IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfUl9CQURfU0lHTkFUVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fdmVyaWZ5LCBFQ0RTQV9SX0JBRF9TSUdOQVRVUkUpOwogICAgIHJldCA9IDA7IC8qIHNpZ25hdHVyZSBpcyBpbnZhbGlkICovCiAgICAgZ290byBlcnI7CiAgIH0KICAgLyogY2FsY3VsYXRlIHRtcDEgPSBpbnYoUykgbW9kIG9yZGVyICovCiAgIGlmICghQk5fbW9kX2ludmVyc2UodTIsIHNpZy0+cywgb3JkZXIsIGN0eCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfQk5fTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fdmVyaWZ5LCBFUlJfUl9CTl9MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAgIGlmICghZGlnZXN0X3RvX2JuKG0sIGRpZ2VzdCwgZGlnZXN0X2xlbiwgb3JkZXIpKSB7CkBAIC0xOTksMzAgKzE5NSwzMCBAQAogICB9CiAgIC8qIHUxID0gbSAqIHRtcCBtb2Qgb3JkZXIgKi8KICAgaWYgKCFCTl9tb2RfbXVsKHUxLCBtLCB1Miwgb3JkZXIsIGN0eCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfQk5fTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fdmVyaWZ5LCBFUlJfUl9CTl9MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAgIC8qIHUyID0gciAqIHcgbW9kIHEgKi8KICAgaWYgKCFCTl9tb2RfbXVsKHUyLCBzaWctPnIsIHUyLCBvcmRlciwgY3R4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb192ZXJpZnksIEVSUl9SX0JOX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBwb2ludCA9IEVDX1BPSU5UX25ldyhncm91cCk7CiAgIGlmIChwb2ludCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fdmVyaWZ5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KICAgaWYgKCFFQ19QT0lOVF9tdWwoZ3JvdXAsIHBvaW50LCB1MSwgcHViX2tleSwgdTIsIGN0eCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfRUNfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fdmVyaWZ5LCBFUlJfUl9FQ19MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAgIGlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIHBvaW50LCBYLCBOVUxMLCBjdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVSUl9SX0VDX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3ZlcmlmeSwgRVJSX1JfRUNfTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogICBpZiAoIUJOX25ubW9kKHUxLCBYLCBvcmRlciwgY3R4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb192ZXJpZnksIEVSUl9SX0JOX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgLyogaWYgdGhlIHNpZ25hdHVyZSBpcyBjb3JyZWN0IHUxIGlzIGVxdWFsIHRvIHNpZy0+ciAqLwpAQCAtMjQ1LDEzICsyNDEsMTMgQEAKICAgaW50IHJldCA9IDA7CiAKICAgaWYgKGVja2V5ID09IE5VTEwgfHwgKGdyb3VwID0gRUNfS0VZX2dldDBfZ3JvdXAoZWNrZXkpKSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIGVjZHNhX3NpZ25fc2V0dXAsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoY3R4X2luID09IE5VTEwpIHsKICAgICBpZiAoKGN0eCA9IEJOX0NUWF9uZXcoKSkgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBlY2RzYV9zaWduX3NldHVwLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgIH0gZWxzZSB7CkBAIC0yNjMsMTYgKzI1OSwxNiBAQAogICBvcmRlciA9IEJOX25ldygpOwogICBYID0gQk5fbmV3KCk7CiAgIGlmICghayB8fCAhciB8fCAhb3JkZXIgfHwgIVgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBlY2RzYV9zaWduX3NldHVwLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KICAgdG1wX3BvaW50ID0gRUNfUE9JTlRfbmV3KGdyb3VwKTsKICAgaWYgKHRtcF9wb2ludCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVSUl9SX0VDX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIGVjZHNhX3NpZ25fc2V0dXAsIEVSUl9SX0VDX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgaWYgKCFFQ19HUk9VUF9nZXRfb3JkZXIoZ3JvdXAsIG9yZGVyLCBjdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVSUl9SX0VDX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIGVjZHNhX3NpZ25fc2V0dXAsIEVSUl9SX0VDX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMjkwLDcgKzI4Niw4IEBACiAgICAgICAgIG9rID0gQk5fcmFuZF9yYW5nZShrLCBvcmRlcik7CiAgICAgICB9CiAgICAgICBpZiAoIW9rKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9SX1JBTkRPTV9OVU1CRVJfR0VORVJBVElPTl9GQUlMRUQpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgZWNkc2Ffc2lnbl9zZXR1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRUNEU0FfUl9SQU5ET01fTlVNQkVSX0dFTkVSQVRJT05fRkFJTEVEKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAgICAgfSB3aGlsZSAoQk5faXNfemVybyhrKSk7CkBAIC0zMTAsMjMgKzMwNywyMyBAQAogCiAgICAgLyogY29tcHV0ZSByIHRoZSB4LWNvb3JkaW5hdGUgb2YgZ2VuZXJhdG9yICogayAqLwogICAgIGlmICghRUNfUE9JTlRfbXVsKGdyb3VwLCB0bXBfcG9pbnQsIGssIE5VTEwsIE5VTEwsIGN0eCkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFUlJfUl9FQ19MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIGVjZHNhX3NpZ25fc2V0dXAsIEVSUl9SX0VDX0xJQik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgICAgaWYgKCFFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChncm91cCwgdG1wX3BvaW50LCBYLCBOVUxMLCBjdHgpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfRUNfTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBlY2RzYV9zaWduX3NldHVwLCBFUlJfUl9FQ19MSUIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogCiAgICAgaWYgKCFCTl9ubm1vZChyLCBYLCBvcmRlciwgY3R4KSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVSUl9SX0JOX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgZWNkc2Ffc2lnbl9zZXR1cCwgRVJSX1JfQk5fTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfSB3aGlsZSAoQk5faXNfemVybyhyKSk7CiAKICAgLyogY29tcHV0ZSB0aGUgaW52ZXJzZSBvZiBrICovCiAgIGlmICghQk5fbW9kX2ludmVyc2Uoaywgaywgb3JkZXIsIGN0eCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfQk5fTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgZWNkc2Ffc2lnbl9zZXR1cCwgRVJSX1JfQk5fTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogICAvKiBjbGVhciBvbGQgdmFsdWVzIGlmIG5lY2Vzc2FyeSAqLwpAQCAtMzY4LDcgKzM2NSw3IEBACiAgIGNvbnN0IEJJR05VTSAqcHJpdl9rZXk7CiAKICAgaWYgKGVja2V5LT5lY2RzYV9tZXRoICYmIGVja2V5LT5lY2RzYV9tZXRoLT5zaWduKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX1JfTk9UX0lNUExFTUVOVEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fc2lnbl9leCwgRUNEU0FfUl9OT1RfSU1QTEVNRU5URUQpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKQEAgLTM3NiwyNSArMzczLDI1IEBACiAgIHByaXZfa2V5ID0gRUNfS0VZX2dldDBfcHJpdmF0ZV9rZXkoZWNrZXkpOwogCiAgIGlmIChncm91cCA9PSBOVUxMIHx8IHByaXZfa2V5ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fc2lnbl9leCwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCiAgIHJldCA9IEVDRFNBX1NJR19uZXcoKTsKICAgaWYgKCFyZXQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb19zaWduX2V4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgcyA9IHJldC0+czsKIAogICBpZiAoKGN0eCA9IEJOX0NUWF9uZXcoKSkgPT0gTlVMTCB8fCAob3JkZXIgPSBCTl9uZXcoKSkgPT0gTlVMTCB8fAogICAgICAgKHRtcCA9IEJOX25ldygpKSA9PSBOVUxMIHx8IChtID0gQk5fbmV3KCkpID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb19zaWduX2V4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAoIUVDX0dST1VQX2dldF9vcmRlcihncm91cCwgb3JkZXIsIGN0eCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfRUNfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fc2lnbl9leCwgRVJSX1JfRUNfTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogICBpZiAoIWRpZ2VzdF90b19ibihtLCBkaWdlc3QsIGRpZ2VzdF9sZW4sIG9yZGVyKSkgewpAQCAtNDAzLDM1ICs0MDAsMzUgQEAKICAgZm9yICg7OykgewogICAgIGlmIChpbl9raW52ID09IE5VTEwgfHwgaW5fciA9PSBOVUxMKSB7CiAgICAgICBpZiAoIWVjZHNhX3NpZ25fc2V0dXAoZWNrZXksIGN0eCwgJmtpbnYsICZyZXQtPnIsIGRpZ2VzdCwgZGlnZXN0X2xlbikpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVSUl9SX0VDRFNBX0xJQik7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb19zaWduX2V4LCBFUlJfUl9FQ0RTQV9MSUIpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KICAgICAgIGNraW52ID0ga2ludjsKICAgICB9IGVsc2UgewogICAgICAgY2tpbnYgPSBpbl9raW52OwogICAgICAgaWYgKEJOX2NvcHkocmV0LT5yLCBpbl9yKSA9PSBOVUxMKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb19zaWduX2V4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogICAgIH0KIAogICAgIGlmICghQk5fbW9kX211bCh0bXAsIHByaXZfa2V5LCByZXQtPnIsIG9yZGVyLCBjdHgpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfQk5fTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb19zaWduX2V4LCBFUlJfUl9CTl9MSUIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIGlmICghQk5fbW9kX2FkZF9xdWljayhzLCB0bXAsIG0sIG9yZGVyKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVSUl9SX0JOX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fc2lnbl9leCwgRVJSX1JfQk5fTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICBpZiAoIUJOX21vZF9tdWwocywgcywgY2tpbnYsIG9yZGVyLCBjdHgpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfQk5fTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb19zaWduX2V4LCBFUlJfUl9CTl9MSUIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIGlmIChCTl9pc196ZXJvKHMpKSB7CiAgICAgICAvKiBpZiBraW52IGFuZCByIGhhdmUgYmVlbiBzdXBwbGllZCBieSB0aGUgY2FsbGVyCiAgICAgICAgKiBkb24ndCB0byBnZW5lcmF0ZSBuZXcga2ludiBhbmQgciB2YWx1ZXMgKi8KICAgICAgIGlmIChpbl9raW52ICE9IE5VTEwgJiYgaW5fciAhPSBOVUxMKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9SX05FRURfTkVXX1NFVFVQX1ZBTFVFUyk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb19zaWduX2V4LCBFQ0RTQV9SX05FRURfTkVXX1NFVFVQX1ZBTFVFUyk7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC00NTgsMzYgKzQ1NSwyMCBAQAogaW50IEVDRFNBX3NpZ25fZXgoaW50IHR5cGUsIGNvbnN0IHVpbnQ4X3QgKmRpZ2VzdCwgc2l6ZV90IGRpZ2VzdF9sZW4sCiAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzaWcsIHVuc2lnbmVkIGludCAqc2lnX2xlbiwgY29uc3QgQklHTlVNICpraW52LAogICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICpyLCBFQ19LRVkgKmVja2V5KSB7Ci0gIGludCByZXQgPSAwOwogICBFQ0RTQV9TSUcgKnMgPSBOVUxMOwogCiAgIGlmIChlY2tleS0+ZWNkc2FfbWV0aCAmJiBlY2tleS0+ZWNkc2FfbWV0aC0+c2lnbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9SX05PVF9JTVBMRU1FTlRFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX3NpZ25fZXgsIEVDRFNBX1JfTk9UX0lNUExFTUVOVEVEKTsKICAgICAqc2lnX2xlbiA9IDA7Ci0gICAgZ290byBlcnI7CisgICAgcmV0dXJuIDA7CiAgIH0KIAogICBzID0gRUNEU0FfZG9fc2lnbl9leChkaWdlc3QsIGRpZ2VzdF9sZW4sIGtpbnYsIHIsIGVja2V5KTsKICAgaWYgKHMgPT0gTlVMTCkgewogICAgICpzaWdfbGVuID0gMDsKLSAgICBnb3RvIGVycjsKKyAgICByZXR1cm4gMDsKICAgfQotCi0gIENCQiBjYmI7Ci0gIENCQl96ZXJvKCZjYmIpOwotICBzaXplX3QgbGVuOwotICBpZiAoIUNCQl9pbml0X2ZpeGVkKCZjYmIsIHNpZywgRUNEU0Ffc2l6ZShlY2tleSkpIHx8Ci0gICAgICAhRUNEU0FfU0lHX21hcnNoYWwoJmNiYiwgcykgfHwKLSAgICAgICFDQkJfZmluaXNoKCZjYmIsIE5VTEwsICZsZW4pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX1JfRU5DT0RFX0VSUk9SKTsKLSAgICBDQkJfY2xlYW51cCgmY2JiKTsKLSAgICAqc2lnX2xlbiA9IDA7Ci0gICAgZ290byBlcnI7Ci0gIH0KLSAgKnNpZ19sZW4gPSAodW5zaWduZWQpbGVuOwotICByZXQgPSAxOwotCi1lcnI6CisgICpzaWdfbGVuID0gaTJkX0VDRFNBX1NJRyhzLCAmc2lnKTsKICAgRUNEU0FfU0lHX2ZyZWUocyk7Ci0gIHJldHVybiByZXQ7CisgIHJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lY2RzYS9lY2RzYV9hc24xLmMgYi9zcmMvY3J5cHRvL2VjZHNhL2VjZHNhX2FzbjEuYwppbmRleCBmMmQ3YzM2Li5mNTU3Y2E3IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2VjZHNhL2VjZHNhX2FzbjEuYworKysgYi9zcmMvY3J5cHRvL2VjZHNhL2VjZHNhX2FzbjEuYwpAQCAtNTIsMzMgKzUyLDQ1IEBACiAKICNpbmNsdWRlIDxvcGVuc3NsL2VjZHNhLmg+CiAKLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2J5dGVzdHJpbmcuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2VjX2tleS5oPgogI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CiAKICNpbmNsdWRlICIuLi9lYy9pbnRlcm5hbC5oIgogCiAKLXNpemVfdCBFQ0RTQV9zaXplKGNvbnN0IEVDX0tFWSAqa2V5KSB7Ci0gIGlmIChrZXkgPT0gTlVMTCkgewotICAgIHJldHVybiAwOwotICB9CitERUNMQVJFX0FTTjFfRlVOQ1RJT05TX2NvbnN0KEVDRFNBX1NJRyk7CitERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdChFQ0RTQV9TSUcsIEVDRFNBX1NJRyk7CiAKLSAgc2l6ZV90IGdyb3VwX29yZGVyX3NpemU7CitBU04xX1NFUVVFTkNFKEVDRFNBX1NJRykgPSB7CisgICAgQVNOMV9TSU1QTEUoRUNEU0FfU0lHLCByLCBDQklHTlVNKSwKKyAgICBBU04xX1NJTVBMRShFQ0RTQV9TSUcsIHMsIENCSUdOVU0pLAorfSBBU04xX1NFUVVFTkNFX0VORChFQ0RTQV9TSUcpOworCitJTVBMRU1FTlRfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0X2ZuYW1lKEVDRFNBX1NJRywgRUNEU0FfU0lHLCBFQ0RTQV9TSUcpOworCitzaXplX3QgRUNEU0Ffc2l6ZShjb25zdCBFQ19LRVkgKmtleSkgeworICBzaXplX3QgcmV0LCBpLCBncm91cF9vcmRlcl9zaXplOworICBBU04xX0lOVEVHRVIgYnM7CisgIEJJR05VTSAqb3JkZXIgPSBOVUxMOworICB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKKyAgY29uc3QgRUNfR1JPVVAgKmdyb3VwOworCiAgIGlmIChrZXktPmVjZHNhX21ldGggJiYga2V5LT5lY2RzYV9tZXRoLT5ncm91cF9vcmRlcl9zaXplKSB7CiAgICAgZ3JvdXBfb3JkZXJfc2l6ZSA9IGtleS0+ZWNkc2FfbWV0aC0+Z3JvdXBfb3JkZXJfc2l6ZShrZXkpOwogICB9IGVsc2UgewotICAgIGNvbnN0IEVDX0dST1VQICpncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKGtleSk7CisgICAgc2l6ZV90IG51bV9iaXRzOworCisgICAgaWYgKGtleSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZ3JvdXAgPSBFQ19LRVlfZ2V0MF9ncm91cChrZXkpOwogICAgIGlmIChncm91cCA9PSBOVUxMKSB7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBCSUdOVU0gKm9yZGVyID0gQk5fbmV3KCk7CisgICAgb3JkZXIgPSBCTl9uZXcoKTsKICAgICBpZiAob3JkZXIgPT0gTlVMTCkgewogICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtODcsMTEgKzk5LDIxIEBACiAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBncm91cF9vcmRlcl9zaXplID0gQk5fbnVtX2J5dGVzKG9yZGVyKTsKLSAgICBCTl9jbGVhcl9mcmVlKG9yZGVyKTsKKyAgICBudW1fYml0cyA9IEJOX251bV9iaXRzKG9yZGVyKTsKKyAgICBncm91cF9vcmRlcl9zaXplID0gKG51bV9iaXRzICsgNykgLyA4OwogICB9CiAKLSAgcmV0dXJuIEVDRFNBX1NJR19tYXhfbGVuKGdyb3VwX29yZGVyX3NpemUpOworICBicy5sZW5ndGggPSBncm91cF9vcmRlcl9zaXplOworICBicy5kYXRhID0gYnVmOworICBicy50eXBlID0gVl9BU04xX0lOVEVHRVI7CisgIC8qIElmIHRoZSB0b3AgYml0IGlzIHNldCB0aGUgQVNOLjEgZW5jb2RpbmcgaXMgMSBsYXJnZXIuICovCisgIGJ1ZlswXSA9IDB4ZmY7CisKKyAgaSA9IGkyZF9BU04xX0lOVEVHRVIoJmJzLCBOVUxMKTsKKyAgaSArPSBpOyAvKiByIGFuZCBzICovCisgIHJldCA9IEFTTjFfb2JqZWN0X3NpemUoMSwgaSwgVl9BU04xX1NFUVVFTkNFKTsKKyAgQk5fY2xlYXJfZnJlZShvcmRlcik7CisgIHJldHVybiByZXQ7CiB9CiAKIEVDRFNBX1NJRyAqRUNEU0FfU0lHX25ldyh2b2lkKSB7CkBAIC0xMTcsMTM0ICsxMzksMyBAQAogICBCTl9mcmVlKHNpZy0+cyk7CiAgIE9QRU5TU0xfZnJlZShzaWcpOwogfQotCi1FQ0RTQV9TSUcgKkVDRFNBX1NJR19wYXJzZShDQlMgKmNicykgewotICBFQ0RTQV9TSUcgKnJldCA9IEVDRFNBX1NJR19uZXcoKTsKLSAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgQ0JTIGNoaWxkOwotICBpZiAoIUNCU19nZXRfYXNuMShjYnMsICZjaGlsZCwgQ0JTX0FTTjFfU0VRVUVOQ0UpIHx8Ci0gICAgICAhQk5fY2JzMnVuc2lnbmVkKCZjaGlsZCwgcmV0LT5yKSB8fAotICAgICAgIUJOX2NiczJ1bnNpZ25lZCgmY2hpbGQsIHJldC0+cykgfHwKLSAgICAgIENCU19sZW4oJmNoaWxkKSAhPSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX1JfQkFEX1NJR05BVFVSRSk7Ci0gICAgRUNEU0FfU0lHX2ZyZWUocmV0KTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gcmV0OwotfQotCi1FQ0RTQV9TSUcgKkVDRFNBX1NJR19mcm9tX2J5dGVzKGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuKSB7Ci0gIENCUyBjYnM7Ci0gIENCU19pbml0KCZjYnMsIGluLCBpbl9sZW4pOwotICBFQ0RTQV9TSUcgKnJldCA9IEVDRFNBX1NJR19wYXJzZSgmY2JzKTsKLSAgaWYgKHJldCA9PSBOVUxMIHx8IENCU19sZW4oJmNicykgIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9SX0JBRF9TSUdOQVRVUkUpOwotICAgIEVDRFNBX1NJR19mcmVlKHJldCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotaW50IEVDRFNBX1NJR19tYXJzaGFsKENCQiAqY2JiLCBjb25zdCBFQ0RTQV9TSUcgKnNpZykgewotICBDQkIgY2hpbGQ7Ci0gIGlmICghQ0JCX2FkZF9hc24xKGNiYiwgJmNoaWxkLCBDQlNfQVNOMV9TRVFVRU5DRSkgfHwKLSAgICAgICFCTl9ibjJjYmIoJmNoaWxkLCBzaWctPnIpIHx8Ci0gICAgICAhQk5fYm4yY2JiKCZjaGlsZCwgc2lnLT5zKSB8fAotICAgICAgIUNCQl9mbHVzaChjYmIpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX1JfRU5DT0RFX0VSUk9SKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotaW50IEVDRFNBX1NJR190b19ieXRlcyh1aW50OF90ICoqb3V0X2J5dGVzLCBzaXplX3QgKm91dF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVDRFNBX1NJRyAqc2lnKSB7Ci0gIENCQiBjYmI7Ci0gIENCQl96ZXJvKCZjYmIpOwotICBpZiAoIUNCQl9pbml0KCZjYmIsIDApIHx8Ci0gICAgICAhRUNEU0FfU0lHX21hcnNoYWwoJmNiYiwgc2lnKSB8fAotICAgICAgIUNCQl9maW5pc2goJmNiYiwgb3V0X2J5dGVzLCBvdXRfbGVuKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9SX0VOQ09ERV9FUlJPUik7Ci0gICAgQ0JCX2NsZWFudXAoJmNiYik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIGRlcl9sZW5fbGVuIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gcmVwcmVzZW50IGEgbGVuZ3RoIG9mIHxsZW58Ci0gKiBpbiBERVIuICovCi1zdGF0aWMgc2l6ZV90IGRlcl9sZW5fbGVuKHNpemVfdCBsZW4pIHsKLSAgaWYgKGxlbiA8IDB4ODApIHsKLSAgICByZXR1cm4gMTsKLSAgfQotICBzaXplX3QgcmV0ID0gMTsKLSAgd2hpbGUgKGxlbiA+IDApIHsKLSAgICByZXQrKzsKLSAgICBsZW4gPj49IDg7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotc2l6ZV90IEVDRFNBX1NJR19tYXhfbGVuKHNpemVfdCBvcmRlcl9sZW4pIHsKLSAgLyogQ29tcHV0ZSB0aGUgbWF4aW11bSBsZW5ndGggb2YgYW4gfG9yZGVyX2xlbnwgYnl0ZSBpbnRlZ2VyLiBEZWZlbnNpdmVseQotICAgKiBhc3N1bWUgdGhhdCB0aGUgbGVhZGluZyAweDAwIGlzIGluY2x1ZGVkLiAqLwotICBzaXplX3QgaW50ZWdlcl9sZW4gPSAxIC8qIHRhZyAqLyArIGRlcl9sZW5fbGVuKG9yZGVyX2xlbiArIDEpICsgMSArIG9yZGVyX2xlbjsKLSAgaWYgKGludGVnZXJfbGVuIDwgb3JkZXJfbGVuKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgLyogQW4gRUNEU0Egc2lnbmF0dXJlIGlzIHR3byBJTlRFR0VScy4gKi8KLSAgc2l6ZV90IHZhbHVlX2xlbiA9IDIgKiBpbnRlZ2VyX2xlbjsKLSAgaWYgKHZhbHVlX2xlbiA8IGludGVnZXJfbGVuKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgLyogQWRkIHRoZSBoZWFkZXIuICovCi0gIHNpemVfdCByZXQgPSAxIC8qIHRhZyAqLyArIGRlcl9sZW5fbGVuKHZhbHVlX2xlbikgKyB2YWx1ZV9sZW47Ci0gIGlmIChyZXQgPCB2YWx1ZV9sZW4pIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gcmV0OwotfQotCi1FQ0RTQV9TSUcgKmQyaV9FQ0RTQV9TSUcoRUNEU0FfU0lHICoqb3V0LCBjb25zdCB1aW50OF90ICoqaW5wLCBsb25nIGxlbikgewotICBpZiAobGVuIDwgMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIENCUyBjYnM7Ci0gIENCU19pbml0KCZjYnMsICppbnAsIChzaXplX3QpbGVuKTsKLSAgRUNEU0FfU0lHICpyZXQgPSBFQ0RTQV9TSUdfcGFyc2UoJmNicyk7Ci0gIGlmIChyZXQgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGlmIChvdXQgIT0gTlVMTCkgewotICAgIEVDRFNBX1NJR19mcmVlKCpvdXQpOwotICAgICpvdXQgPSByZXQ7Ci0gIH0KLSAgKmlucCArPSAoc2l6ZV90KWxlbiAtIENCU19sZW4oJmNicyk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWludCBpMmRfRUNEU0FfU0lHKGNvbnN0IEVDRFNBX1NJRyAqc2lnLCB1aW50OF90ICoqb3V0cCkgewotICB1aW50OF90ICpkZXI7Ci0gIHNpemVfdCBkZXJfbGVuOwotICBpZiAoIUVDRFNBX1NJR190b19ieXRlcygmZGVyLCAmZGVyX2xlbiwgc2lnKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoZGVyX2xlbiA+IElOVF9NQVgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfT1ZFUkZMT1cpOwotICAgIE9QRU5TU0xfZnJlZShkZXIpOwotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAob3V0cCAhPSBOVUxMKSB7Ci0gICAgaWYgKCpvdXRwID09IE5VTEwpIHsKLSAgICAgICpvdXRwID0gZGVyOwotICAgICAgZGVyID0gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgbWVtY3B5KCpvdXRwLCBkZXIsIGRlcl9sZW4pOwotICAgICAgKm91dHAgKz0gZGVyX2xlbjsKLSAgICB9Ci0gIH0KLSAgT1BFTlNTTF9mcmVlKGRlcik7Ci0gIHJldHVybiAoaW50KWRlcl9sZW47Ci19CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2VjZHNhL2VjZHNhX3Rlc3QuY2MgYi9zcmMvY3J5cHRvL2VjZHNhL2VjZHNhX3Rlc3QuY2MKaW5kZXggYjkxNjUwOS4uYTZiZDdhMSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lY2RzYS9lY2RzYV90ZXN0LmNjCisrKyBiL3NyYy9jcnlwdG8vZWNkc2EvZWNkc2FfdGVzdC5jYwpAQCAtNzgsMTMgKzc4LDE4IEBACiAKICAgc3dpdGNoIChhcGkpIHsKICAgICBjYXNlIGtFbmNvZGVkQXBpOiB7Ci0gICAgICB1aW50OF90ICpkZXI7Ci0gICAgICBzaXplX3QgZGVyX2xlbjsKLSAgICAgIGlmICghRUNEU0FfU0lHX3RvX2J5dGVzKCZkZXIsICZkZXJfbGVuLCBlY2RzYV9zaWcpKSB7CisgICAgICBpbnQgc2lnX2xlbiA9IGkyZF9FQ0RTQV9TSUcoZWNkc2Ffc2lnLCBOVUxMKTsKKyAgICAgIGlmIChzaWdfbGVuIDw9IDApIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQotICAgICAgU2NvcGVkT3BlblNTTEJ5dGVzIGRlbGV0ZV9kZXIoZGVyKTsKLSAgICAgIGFjdHVhbF9yZXN1bHQgPSBFQ0RTQV92ZXJpZnkoMCwgZGlnZXN0LCBkaWdlc3RfbGVuLCBkZXIsIGRlcl9sZW4sIGVja2V5KTsKKyAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNpZ25hdHVyZShzdGF0aWNfY2FzdDxzaXplX3Q+KHNpZ19sZW4pKTsKKyAgICAgIHVpbnQ4X3QgKnNpZ19wdHIgPSBic3NsOjp2ZWN0b3JfZGF0YSgmc2lnbmF0dXJlKTsKKyAgICAgIHNpZ19sZW4gPSBpMmRfRUNEU0FfU0lHKGVjZHNhX3NpZywgJnNpZ19wdHIpOworICAgICAgaWYgKHNpZ19sZW4gPD0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBhY3R1YWxfcmVzdWx0ID0gRUNEU0FfdmVyaWZ5KDAsIGRpZ2VzdCwgZGlnZXN0X2xlbiwgYnNzbDo6dmVjdG9yX2RhdGEoJnNpZ25hdHVyZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZS5zaXplKCksIGVja2V5KTsKICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtMjYyLDggKzI2Nyw4IEBACiAgICAgZnByaW50ZihvdXQsICIuIik7CiAgICAgZmZsdXNoKG91dCk7CiAgICAgLy8gVmVyaWZ5IGEgdGFtcGVyZWQgc2lnbmF0dXJlLgotICAgIFNjb3BlZEVDRFNBX1NJRyBlY2RzYV9zaWcoRUNEU0FfU0lHX2Zyb21fYnl0ZXMoCi0gICAgICAgIGJzc2w6OnZlY3Rvcl9kYXRhKCZzaWduYXR1cmUpLCBzaWduYXR1cmUuc2l6ZSgpKSk7CisgICAgY29uc3QgdWludDhfdCAqc2lnX3B0ciA9IGJzc2w6OnZlY3Rvcl9kYXRhKCZzaWduYXR1cmUpOworICAgIFNjb3BlZEVDRFNBX1NJRyBlY2RzYV9zaWcoZDJpX0VDRFNBX1NJRyhOVUxMLCAmc2lnX3B0ciwgc2lnbmF0dXJlLnNpemUoKSkpOwogICAgIGlmICghZWNkc2Ffc2lnIHx8CiAgICAgICAgICFUZXN0VGFtcGVyZWRTaWcob3V0LCBrRW5jb2RlZEFwaSwgZGlnZXN0LCAyMCwgZWNkc2Ffc2lnLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGVja2V5LmdldCgpLCBvcmRlci5nZXQoKSkpIHsKQEAgLTMyMCw0NSArMzI1LDExIEBACiAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgYm9vbCBUZXN0RUNEU0FfU0lHX21heF9sZW4oc2l6ZV90IG9yZGVyX2xlbikgewotICAvKiBDcmVhdGUgdGhlIGxhcmdlc3QgcG9zc2libGUgfEVDRFNBX1NJR3wgb2YgdGhlIGdpdmVuIGNvbnN0cmFpbnRzLiAqLwotICBTY29wZWRFQ0RTQV9TSUcgc2lnKEVDRFNBX1NJR19uZXcoKSk7Ci0gIGlmICghc2lnKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ5dGVzKG9yZGVyX2xlbiwgMHhmZik7Ci0gIGlmICghQk5fYmluMmJuKGJzc2w6OnZlY3Rvcl9kYXRhKCZieXRlcyksIGJ5dGVzLnNpemUoKSwgc2lnLT5yKSB8fAotICAgICAgIUJOX2JpbjJibihic3NsOjp2ZWN0b3JfZGF0YSgmYnl0ZXMpLCBieXRlcy5zaXplKCksIHNpZy0+cykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLyogU2VyaWFsaXplIGl0LiAqLwotICB1aW50OF90ICpkZXI7Ci0gIHNpemVfdCBkZXJfbGVuOwotICBpZiAoIUVDRFNBX1NJR190b19ieXRlcygmZGVyLCAmZGVyX2xlbiwgc2lnLmdldCgpKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBTY29wZWRPcGVuU1NMQnl0ZXMgZGVsZXRlX2RlcihkZXIpOwotCi0gIHNpemVfdCBtYXhfbGVuID0gRUNEU0FfU0lHX21heF9sZW4ob3JkZXJfbGVuKTsKLSAgaWYgKG1heF9sZW4gIT0gZGVyX2xlbikgewotICAgIGZwcmludGYoc3RkZXJyLCAiRUNEU0FfU0lHX21heF9sZW4oJXUpIHJldHVybmVkICV1LCB3YW50ZWQgJXVcbiIsCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZD4ob3JkZXJfbGVuKSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG1heF9sZW4pLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGRlcl9sZW4pKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KIGludCBtYWluKHZvaWQpIHsKICAgQ1JZUFRPX2xpYnJhcnlfaW5pdCgpOwogICBFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOwogCi0gIGlmICghVGVzdEJ1aWx0aW4oc3Rkb3V0KSB8fAotICAgICAgIVRlc3RFQ0RTQV9TSUdfbWF4X2xlbigyMjQvOCkgfHwKLSAgICAgICFUZXN0RUNEU0FfU0lHX21heF9sZW4oMjU2LzgpIHx8Ci0gICAgICAhVGVzdEVDRFNBX1NJR19tYXhfbGVuKDM4NC84KSB8fAotICAgICAgIVRlc3RFQ0RTQV9TSUdfbWF4X2xlbig1MTIvOCkgfHwKLSAgICAgICFUZXN0RUNEU0FfU0lHX21heF9sZW4oMTAwMDApKSB7CisgIGlmICghVGVzdEJ1aWx0aW4oc3Rkb3V0KSkgewogICAgIHByaW50ZigiXG5FQ0RTQSB0ZXN0IGZhaWxlZFxuIik7CiAgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRvdXQpOwogICAgIHJldHVybiAxOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lbmdpbmUvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2VuZ2luZS9DTWFrZUxpc3RzLnR4dAppbmRleCA1NjY3ZjAyLi5lMDM2NTBlIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2VuZ2luZS9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL2VuZ2luZS9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgZW5naW5lCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vZXJyL0NNYWtlTGlzdHMudHh0CmluZGV4IDg1MTllNTEuLjUyMTVlZWMgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vZXJyL0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCiAKIGFkZF9jdXN0b21fY29tbWFuZCgKICAgT1VUUFVUIGVycl9kYXRhLmMKQEAgLTgsOCArOCwxMCBAQAogICBhc24xLmVycm9yZGF0YQogICBiaW8uZXJyb3JkYXRhCiAgIGJuLmVycm9yZGF0YQorICBidWYuZXJyb3JkYXRhCiAgIGNpcGhlci5lcnJvcmRhdGEKICAgY29uZi5lcnJvcmRhdGEKKyAgY3J5cHRvLmVycm9yZGF0YQogICBkaC5lcnJvcmRhdGEKICAgZGlnZXN0LmVycm9yZGF0YQogICBkc2EuZXJyb3JkYXRhCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9hc24xLmVycm9yZGF0YSBiL3NyYy9jcnlwdG8vZXJyL2FzbjEuZXJyb3JkYXRhCmluZGV4IDU1MzQyYTAuLjQ0YjljNzMgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL2FzbjEuZXJyb3JkYXRhCisrKyBiL3NyYy9jcnlwdG8vZXJyL2FzbjEuZXJyb3JkYXRhCkBAIC0xLDg4ICsxLDE1MiBAQAotQVNOMSwxMDAsQVNOMV9MRU5HVEhfTUlTTUFUQ0gKLUFTTjEsMTAxLEFVWF9FUlJPUgotQVNOMSwxMDIsQkFEX0dFVF9BU04xX09CSkVDVF9DQUxMCi1BU04xLDEwMyxCQURfT0JKRUNUX0hFQURFUgotQVNOMSwxMDQsQk1QU1RSSU5HX0lTX1dST05HX0xFTkdUSAotQVNOMSwxMDUsQk5fTElCCi1BU04xLDEwNixCT09MRUFOX0lTX1dST05HX0xFTkdUSAotQVNOMSwxMDcsQlVGRkVSX1RPT19TTUFMTAotQVNOMSwxMDgsREVDT0RFX0VSUk9SCi1BU04xLDEwOSxERVBUSF9FWENFRURFRAotQVNOMSwxMTAsRU5DT0RFX0VSUk9SCi1BU04xLDExMSxFUlJPUl9HRVRUSU5HX1RJTUUKLUFTTjEsMTEyLEVYUEVDVElOR19BTl9BU04xX1NFUVVFTkNFCi1BU04xLDExMyxFWFBFQ1RJTkdfQU5fSU5URUdFUgotQVNOMSwxMTQsRVhQRUNUSU5HX0FOX09CSkVDVAotQVNOMSwxMTUsRVhQRUNUSU5HX0FfQk9PTEVBTgotQVNOMSwxMTYsRVhQRUNUSU5HX0FfVElNRQotQVNOMSwxMTcsRVhQTElDSVRfTEVOR1RIX01JU01BVENICi1BU04xLDExOCxFWFBMSUNJVF9UQUdfTk9UX0NPTlNUUlVDVEVECi1BU04xLDExOSxGSUVMRF9NSVNTSU5HCi1BU04xLDEyMCxGSVJTVF9OVU1fVE9PX0xBUkdFCi1BU04xLDEyMSxIRUFERVJfVE9PX0xPTkcKLUFTTjEsMTIyLElMTEVHQUxfQklUU1RSSU5HX0ZPUk1BVAotQVNOMSwxMjMsSUxMRUdBTF9CT09MRUFOCi1BU04xLDEyNCxJTExFR0FMX0NIQVJBQ1RFUlMKLUFTTjEsMTI1LElMTEVHQUxfRk9STUFUCi1BU04xLDEyNixJTExFR0FMX0hFWAotQVNOMSwxMjcsSUxMRUdBTF9JTVBMSUNJVF9UQUcKLUFTTjEsMTI4LElMTEVHQUxfSU5URUdFUgotQVNOMSwxMjksSUxMRUdBTF9ORVNURURfVEFHR0lORwotQVNOMSwxMzAsSUxMRUdBTF9OVUxMCi1BU04xLDEzMSxJTExFR0FMX05VTExfVkFMVUUKLUFTTjEsMTMyLElMTEVHQUxfT0JKRUNUCi1BU04xLDEzMyxJTExFR0FMX09QVElPTkFMX0FOWQotQVNOMSwxMzQsSUxMRUdBTF9PUFRJT05TX09OX0lURU1fVEVNUExBVEUKLUFTTjEsMTM1LElMTEVHQUxfVEFHR0VEX0FOWQotQVNOMSwxMzYsSUxMRUdBTF9USU1FX1ZBTFVFCi1BU04xLDEzNyxJTlRFR0VSX05PVF9BU0NJSV9GT1JNQVQKLUFTTjEsMTM4LElOVEVHRVJfVE9PX0xBUkdFX0ZPUl9MT05HCi1BU04xLDEzOSxJTlZBTElEX0JJVF9TVFJJTkdfQklUU19MRUZUCi1BU04xLDE0MCxJTlZBTElEX0JNUFNUUklOR19MRU5HVEgKLUFTTjEsMTQxLElOVkFMSURfRElHSVQKLUFTTjEsMTQyLElOVkFMSURfTU9ESUZJRVIKLUFTTjEsMTQzLElOVkFMSURfTlVNQkVSCi1BU04xLDE0NCxJTlZBTElEX09CSkVDVF9FTkNPRElORwotQVNOMSwxNDUsSU5WQUxJRF9TRVBBUkFUT1IKLUFTTjEsMTQ2LElOVkFMSURfVElNRV9GT1JNQVQKLUFTTjEsMTQ3LElOVkFMSURfVU5JVkVSU0FMU1RSSU5HX0xFTkdUSAotQVNOMSwxNDgsSU5WQUxJRF9VVEY4U1RSSU5HCi1BU04xLDE0OSxMSVNUX0VSUk9SCi1BU04xLDE1MCxNQUxMT0NfRkFJTFVSRQotQVNOMSwxNTEsTUlTU0lOR19BU04xX0VPUwotQVNOMSwxNTIsTUlTU0lOR19FT0MKLUFTTjEsMTUzLE1JU1NJTkdfU0VDT05EX05VTUJFUgotQVNOMSwxNTQsTUlTU0lOR19WQUxVRQotQVNOMSwxNTUsTVNUUklOR19OT1RfVU5JVkVSU0FMCi1BU04xLDE1NixNU1RSSU5HX1dST05HX1RBRwotQVNOMSwxNTcsTkVTVEVEX0FTTjFfRVJST1IKLUFTTjEsMTU4LE5FU1RFRF9BU04xX1NUUklORwotQVNOMSwxNTksTk9OX0hFWF9DSEFSQUNURVJTCi1BU04xLDE2MCxOT1RfQVNDSUlfRk9STUFUCi1BU04xLDE2MSxOT1RfRU5PVUdIX0RBVEEKLUFTTjEsMTYyLE5PX01BVENISU5HX0NIT0lDRV9UWVBFCi1BU04xLDE2MyxOVUxMX0lTX1dST05HX0xFTkdUSAotQVNOMSwxNjQsT0JKRUNUX05PVF9BU0NJSV9GT1JNQVQKLUFTTjEsMTY1LE9ERF9OVU1CRVJfT0ZfQ0hBUlMKLUFTTjEsMTY2LFNFQ09ORF9OVU1CRVJfVE9PX0xBUkdFCi1BU04xLDE2NyxTRVFVRU5DRV9MRU5HVEhfTUlTTUFUQ0gKLUFTTjEsMTY4LFNFUVVFTkNFX05PVF9DT05TVFJVQ1RFRAotQVNOMSwxNjksU0VRVUVOQ0VfT1JfU0VUX05FRURTX0NPTkZJRwotQVNOMSwxNzAsU0hPUlRfTElORQotQVNOMSwxNzEsU1RSRUFNSU5HX05PVF9TVVBQT1JURUQKLUFTTjEsMTcyLFNUUklOR19UT09fTE9ORwotQVNOMSwxNzMsU1RSSU5HX1RPT19TSE9SVAotQVNOMSwxNzQsVEFHX1ZBTFVFX1RPT19ISUdICi1BU04xLDE3NSxUSU1FX05PVF9BU0NJSV9GT1JNQVQKLUFTTjEsMTc2LFRPT19MT05HCi1BU04xLDE3NyxUWVBFX05PVF9DT05TVFJVQ1RFRAotQVNOMSwxNzgsVFlQRV9OT1RfUFJJTUlUSVZFCi1BU04xLDE3OSxVTkVYUEVDVEVEX0VPQwotQVNOMSwxODAsVU5JVkVSU0FMU1RSSU5HX0lTX1dST05HX0xFTkdUSAotQVNOMSwxODEsVU5LTk9XTl9GT1JNQVQKLUFTTjEsMTgyLFVOS05PV05fVEFHCi1BU04xLDE4MyxVTlNVUFBPUlRFRF9BTllfREVGSU5FRF9CWV9UWVBFCi1BU04xLDE4NCxVTlNVUFBPUlRFRF9QVUJMSUNfS0VZX1RZUEUKLUFTTjEsMTg1LFVOU1VQUE9SVEVEX1RZUEUKLUFTTjEsMTg2LFdST05HX1RBRwotQVNOMSwxODcsV1JPTkdfVFlQRQorQVNOMSxmdW5jdGlvbiwxMDAsQVNOMV9CSVRfU1RSSU5HX3NldF9iaXQKK0FTTjEsZnVuY3Rpb24sMTAxLEFTTjFfRU5VTUVSQVRFRF9zZXQKK0FTTjEsZnVuY3Rpb24sMTAyLEFTTjFfRU5VTUVSQVRFRF90b19CTgorQVNOMSxmdW5jdGlvbiwxMDMsQVNOMV9HRU5FUkFMSVpFRFRJTUVfYWRqCitBU04xLGZ1bmN0aW9uLDEwNCxBU04xX0lOVEVHRVJfc2V0CitBU04xLGZ1bmN0aW9uLDEwNSxBU04xX0lOVEVHRVJfdG9fQk4KK0FTTjEsZnVuY3Rpb24sMTA2LEFTTjFfT0JKRUNUX25ldworQVNOMSxmdW5jdGlvbiwxMDcsQVNOMV9QQ1RYX25ldworQVNOMSxmdW5jdGlvbiwxMDgsQVNOMV9TVFJJTkdfVEFCTEVfYWRkCitBU04xLGZ1bmN0aW9uLDEwOSxBU04xX1NUUklOR19zZXQKK0FTTjEsZnVuY3Rpb24sMTEwLEFTTjFfU1RSSU5HX3R5cGVfbmV3CitBU04xLGZ1bmN0aW9uLDExMSxBU04xX1RJTUVfYWRqCitBU04xLGZ1bmN0aW9uLDExMixBU04xX1VUQ1RJTUVfYWRqCitBU04xLGZ1bmN0aW9uLDExMyxBU04xX2QyaV9mcAorQVNOMSxmdW5jdGlvbiwxMTQsQVNOMV9kdXAKK0FTTjEsZnVuY3Rpb24sMTE1LEFTTjFfZ2VuZXJhdGVfdjMKK0FTTjEsZnVuY3Rpb24sMTE2LEFTTjFfZ2V0X29iamVjdAorQVNOMSxmdW5jdGlvbiwxMTcsQVNOMV9pMmRfYmlvCitBU04xLGZ1bmN0aW9uLDExOCxBU04xX2kyZF9mcAorQVNOMSxmdW5jdGlvbiwxMTksQVNOMV9pdGVtX2QyaV9mcAorQVNOMSxmdW5jdGlvbiwxMjAsQVNOMV9pdGVtX2R1cAorQVNOMSxmdW5jdGlvbiwxMjEsQVNOMV9pdGVtX2V4X2QyaQorQVNOMSxmdW5jdGlvbiwxMjIsQVNOMV9pdGVtX2kyZF9iaW8KK0FTTjEsZnVuY3Rpb24sMTIzLEFTTjFfaXRlbV9pMmRfZnAKK0FTTjEsZnVuY3Rpb24sMTI0LEFTTjFfaXRlbV9wYWNrCitBU04xLGZ1bmN0aW9uLDEyNSxBU04xX2l0ZW1fdW5wYWNrCitBU04xLGZ1bmN0aW9uLDEyNixBU04xX21ic3RyaW5nX25jb3B5CitBU04xLGZ1bmN0aW9uLDEyNyxBU04xX3RlbXBsYXRlX25ldworQVNOMSxmdW5jdGlvbiwxMjgsQklPX25ld19OREVGCitBU04xLGZ1bmN0aW9uLDEyOSxCTl90b19BU04xX0VOVU1FUkFURUQKK0FTTjEsZnVuY3Rpb24sMTMwLEJOX3RvX0FTTjFfSU5URUdFUgorQVNOMSxmdW5jdGlvbiwxMzEsYTJkX0FTTjFfT0JKRUNUCitBU04xLGZ1bmN0aW9uLDEzMixhMmlfQVNOMV9FTlVNRVJBVEVECitBU04xLGZ1bmN0aW9uLDEzMyxhMmlfQVNOMV9JTlRFR0VSCitBU04xLGZ1bmN0aW9uLDEzNCxhMmlfQVNOMV9TVFJJTkcKK0FTTjEsZnVuY3Rpb24sMTM1LGFwcGVuZF9leHAKK0FTTjEsZnVuY3Rpb24sMTM2LGFzbjFfY2IKK0FTTjEsZnVuY3Rpb24sMTM3LGFzbjFfY2hlY2tfdGxlbgorQVNOMSxmdW5jdGlvbiwxMzgsYXNuMV9jb2xsYXRlX3ByaW1pdGl2ZQorQVNOMSxmdW5jdGlvbiwxMzksYXNuMV9jb2xsZWN0CitBU04xLGZ1bmN0aW9uLDE0MCxhc24xX2QyaV9leF9wcmltaXRpdmUKK0FTTjEsZnVuY3Rpb24sMTQxLGFzbjFfZDJpX3JlYWRfYmlvCitBU04xLGZ1bmN0aW9uLDE0Mixhc24xX2RvX2FkYgorQVNOMSxmdW5jdGlvbiwxNDMsYXNuMV9leF9jMmkKK0FTTjEsZnVuY3Rpb24sMTQ0LGFzbjFfZmluZF9lbmQKK0FTTjEsZnVuY3Rpb24sMTQ1LGFzbjFfaXRlbV9leF9jb21iaW5lX25ldworQVNOMSxmdW5jdGlvbiwxNDYsYXNuMV9zdHIydHlwZQorQVNOMSxmdW5jdGlvbiwxNDcsYXNuMV90ZW1wbGF0ZV9leF9kMmkKK0FTTjEsZnVuY3Rpb24sMTQ4LGFzbjFfdGVtcGxhdGVfbm9leHBfZDJpCitBU04xLGZ1bmN0aW9uLDE0OSxiaXRzdHJfY2IKK0FTTjEsZnVuY3Rpb24sMTUwLGMyaV9BU04xX0JJVF9TVFJJTkcKK0FTTjEsZnVuY3Rpb24sMTUxLGMyaV9BU04xX0lOVEVHRVIKK0FTTjEsZnVuY3Rpb24sMTUyLGMyaV9BU04xX09CSkVDVAorQVNOMSxmdW5jdGlvbiwxNTMsY29sbGVjdF9kYXRhCitBU04xLGZ1bmN0aW9uLDE1NCxkMmlfQVNOMV9CT09MRUFOCitBU04xLGZ1bmN0aW9uLDE1NSxkMmlfQVNOMV9PQkpFQ1QKK0FTTjEsZnVuY3Rpb24sMTU2LGQyaV9BU04xX1VJTlRFR0VSCitBU04xLGZ1bmN0aW9uLDE1NyxkMmlfQVNOMV9VVENUSU1FCitBU04xLGZ1bmN0aW9uLDE1OCxkMmlfQVNOMV9ieXRlcworQVNOMSxmdW5jdGlvbiwxNTksZDJpX0FTTjFfdHlwZV9ieXRlcworQVNOMSxmdW5jdGlvbiwxNjAsaTJkX0FTTjFfVElNRQorQVNOMSxmdW5jdGlvbiwxNjEsaTJkX1ByaXZhdGVLZXkKK0FTTjEsZnVuY3Rpb24sMTYyLGxvbmdfYzJpCitBU04xLGZ1bmN0aW9uLDE2MyxwYXJzZV90YWdnaW5nCitBU04xLHJlYXNvbiwxMDAsQVNOMV9MRU5HVEhfTUlTTUFUQ0gKK0FTTjEscmVhc29uLDEwMSxBVVhfRVJST1IKK0FTTjEscmVhc29uLDEwMixCQURfR0VUX0FTTjFfT0JKRUNUX0NBTEwKK0FTTjEscmVhc29uLDEwMyxCQURfT0JKRUNUX0hFQURFUgorQVNOMSxyZWFzb24sMTA0LEJNUFNUUklOR19JU19XUk9OR19MRU5HVEgKK0FTTjEscmVhc29uLDEwNSxCTl9MSUIKK0FTTjEscmVhc29uLDEwNixCT09MRUFOX0lTX1dST05HX0xFTkdUSAorQVNOMSxyZWFzb24sMTA3LEJVRkZFUl9UT09fU01BTEwKK0FTTjEscmVhc29uLDEwOCxERUNPREVfRVJST1IKK0FTTjEscmVhc29uLDEwOSxERVBUSF9FWENFRURFRAorQVNOMSxyZWFzb24sMTEwLEVOQ09ERV9FUlJPUgorQVNOMSxyZWFzb24sMTExLEVSUk9SX0dFVFRJTkdfVElNRQorQVNOMSxyZWFzb24sMTEyLEVYUEVDVElOR19BTl9BU04xX1NFUVVFTkNFCitBU04xLHJlYXNvbiwxMTMsRVhQRUNUSU5HX0FOX0lOVEVHRVIKK0FTTjEscmVhc29uLDExNCxFWFBFQ1RJTkdfQU5fT0JKRUNUCitBU04xLHJlYXNvbiwxMTUsRVhQRUNUSU5HX0FfQk9PTEVBTgorQVNOMSxyZWFzb24sMTE2LEVYUEVDVElOR19BX1RJTUUKK0FTTjEscmVhc29uLDExNyxFWFBMSUNJVF9MRU5HVEhfTUlTTUFUQ0gKK0FTTjEscmVhc29uLDExOCxFWFBMSUNJVF9UQUdfTk9UX0NPTlNUUlVDVEVECitBU04xLHJlYXNvbiwxMTksRklFTERfTUlTU0lORworQVNOMSxyZWFzb24sMTIwLEZJUlNUX05VTV9UT09fTEFSR0UKK0FTTjEscmVhc29uLDEyMSxIRUFERVJfVE9PX0xPTkcKK0FTTjEscmVhc29uLDEyMixJTExFR0FMX0JJVFNUUklOR19GT1JNQVQKK0FTTjEscmVhc29uLDEyMyxJTExFR0FMX0JPT0xFQU4KK0FTTjEscmVhc29uLDEyNCxJTExFR0FMX0NIQVJBQ1RFUlMKK0FTTjEscmVhc29uLDEyNSxJTExFR0FMX0ZPUk1BVAorQVNOMSxyZWFzb24sMTI2LElMTEVHQUxfSEVYCitBU04xLHJlYXNvbiwxMjcsSUxMRUdBTF9JTVBMSUNJVF9UQUcKK0FTTjEscmVhc29uLDEyOCxJTExFR0FMX0lOVEVHRVIKK0FTTjEscmVhc29uLDEyOSxJTExFR0FMX05FU1RFRF9UQUdHSU5HCitBU04xLHJlYXNvbiwxMzAsSUxMRUdBTF9OVUxMCitBU04xLHJlYXNvbiwxMzEsSUxMRUdBTF9OVUxMX1ZBTFVFCitBU04xLHJlYXNvbiwxMzIsSUxMRUdBTF9PQkpFQ1QKK0FTTjEscmVhc29uLDEzMyxJTExFR0FMX09QVElPTkFMX0FOWQorQVNOMSxyZWFzb24sMTM0LElMTEVHQUxfT1BUSU9OU19PTl9JVEVNX1RFTVBMQVRFCitBU04xLHJlYXNvbiwxMzUsSUxMRUdBTF9UQUdHRURfQU5ZCitBU04xLHJlYXNvbiwxMzYsSUxMRUdBTF9USU1FX1ZBTFVFCitBU04xLHJlYXNvbiwxMzcsSU5URUdFUl9OT1RfQVNDSUlfRk9STUFUCitBU04xLHJlYXNvbiwxMzgsSU5URUdFUl9UT09fTEFSR0VfRk9SX0xPTkcKK0FTTjEscmVhc29uLDEzOSxJTlZBTElEX0JJVF9TVFJJTkdfQklUU19MRUZUCitBU04xLHJlYXNvbiwxNDAsSU5WQUxJRF9CTVBTVFJJTkdfTEVOR1RICitBU04xLHJlYXNvbiwxNDEsSU5WQUxJRF9ESUdJVAorQVNOMSxyZWFzb24sMTQyLElOVkFMSURfTU9ESUZJRVIKK0FTTjEscmVhc29uLDE0MyxJTlZBTElEX05VTUJFUgorQVNOMSxyZWFzb24sMTQ0LElOVkFMSURfT0JKRUNUX0VOQ09ESU5HCitBU04xLHJlYXNvbiwxNDUsSU5WQUxJRF9TRVBBUkFUT1IKK0FTTjEscmVhc29uLDE0NixJTlZBTElEX1RJTUVfRk9STUFUCitBU04xLHJlYXNvbiwxNDcsSU5WQUxJRF9VTklWRVJTQUxTVFJJTkdfTEVOR1RICitBU04xLHJlYXNvbiwxNDgsSU5WQUxJRF9VVEY4U1RSSU5HCitBU04xLHJlYXNvbiwxNDksTElTVF9FUlJPUgorQVNOMSxyZWFzb24sMTUwLE1BTExPQ19GQUlMVVJFCitBU04xLHJlYXNvbiwxNTEsTUlTU0lOR19BU04xX0VPUworQVNOMSxyZWFzb24sMTUyLE1JU1NJTkdfRU9DCitBU04xLHJlYXNvbiwxNTMsTUlTU0lOR19TRUNPTkRfTlVNQkVSCitBU04xLHJlYXNvbiwxNTQsTUlTU0lOR19WQUxVRQorQVNOMSxyZWFzb24sMTU1LE1TVFJJTkdfTk9UX1VOSVZFUlNBTAorQVNOMSxyZWFzb24sMTU2LE1TVFJJTkdfV1JPTkdfVEFHCitBU04xLHJlYXNvbiwxNTcsTkVTVEVEX0FTTjFfRVJST1IKK0FTTjEscmVhc29uLDE1OCxORVNURURfQVNOMV9TVFJJTkcKK0FTTjEscmVhc29uLDE1OSxOT05fSEVYX0NIQVJBQ1RFUlMKK0FTTjEscmVhc29uLDE2MCxOT1RfQVNDSUlfRk9STUFUCitBU04xLHJlYXNvbiwxNjEsTk9UX0VOT1VHSF9EQVRBCitBU04xLHJlYXNvbiwxNjIsTk9fTUFUQ0hJTkdfQ0hPSUNFX1RZUEUKK0FTTjEscmVhc29uLDE2MyxOVUxMX0lTX1dST05HX0xFTkdUSAorQVNOMSxyZWFzb24sMTY0LE9CSkVDVF9OT1RfQVNDSUlfRk9STUFUCitBU04xLHJlYXNvbiwxNjUsT0REX05VTUJFUl9PRl9DSEFSUworQVNOMSxyZWFzb24sMTY2LFNFQ09ORF9OVU1CRVJfVE9PX0xBUkdFCitBU04xLHJlYXNvbiwxNjcsU0VRVUVOQ0VfTEVOR1RIX01JU01BVENICitBU04xLHJlYXNvbiwxNjgsU0VRVUVOQ0VfTk9UX0NPTlNUUlVDVEVECitBU04xLHJlYXNvbiwxNjksU0VRVUVOQ0VfT1JfU0VUX05FRURTX0NPTkZJRworQVNOMSxyZWFzb24sMTcwLFNIT1JUX0xJTkUKK0FTTjEscmVhc29uLDE3MSxTVFJFQU1JTkdfTk9UX1NVUFBPUlRFRAorQVNOMSxyZWFzb24sMTcyLFNUUklOR19UT09fTE9ORworQVNOMSxyZWFzb24sMTczLFNUUklOR19UT09fU0hPUlQKK0FTTjEscmVhc29uLDE3NCxUQUdfVkFMVUVfVE9PX0hJR0gKK0FTTjEscmVhc29uLDE3NSxUSU1FX05PVF9BU0NJSV9GT1JNQVQKK0FTTjEscmVhc29uLDE3NixUT09fTE9ORworQVNOMSxyZWFzb24sMTc3LFRZUEVfTk9UX0NPTlNUUlVDVEVECitBU04xLHJlYXNvbiwxNzgsVFlQRV9OT1RfUFJJTUlUSVZFCitBU04xLHJlYXNvbiwxNzksVU5FWFBFQ1RFRF9FT0MKK0FTTjEscmVhc29uLDE4MCxVTklWRVJTQUxTVFJJTkdfSVNfV1JPTkdfTEVOR1RICitBU04xLHJlYXNvbiwxODEsVU5LTk9XTl9GT1JNQVQKK0FTTjEscmVhc29uLDE4MixVTktOT1dOX1RBRworQVNOMSxyZWFzb24sMTgzLFVOU1VQUE9SVEVEX0FOWV9ERUZJTkVEX0JZX1RZUEUKK0FTTjEscmVhc29uLDE4NCxVTlNVUFBPUlRFRF9QVUJMSUNfS0VZX1RZUEUKK0FTTjEscmVhc29uLDE4NSxVTlNVUFBPUlRFRF9UWVBFCitBU04xLHJlYXNvbiwxODYsV1JPTkdfVEFHCitBU04xLHJlYXNvbiwxODcsV1JPTkdfVFlQRQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lcnIvYmlvLmVycm9yZGF0YSBiL3NyYy9jcnlwdG8vZXJyL2Jpby5lcnJvcmRhdGEKaW5kZXggOTRiM2M5Ny4uOWYyYWYwMiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lcnIvYmlvLmVycm9yZGF0YQorKysgYi9zcmMvY3J5cHRvL2Vyci9iaW8uZXJyb3JkYXRhCkBAIC0xLDE3ICsxLDM2IEBACi1CSU8sMTAwLEJBRF9GT1BFTl9NT0RFCi1CSU8sMTAxLEJST0tFTl9QSVBFCi1CSU8sMTAyLENPTk5FQ1RfRVJST1IKLUJJTywxMDMsRVJST1JfU0VUVElOR19OQklPCi1CSU8sMTA0LElOVkFMSURfQVJHVU1FTlQKLUJJTywxMDUsSU5fVVNFCi1CSU8sMTA2LEtFRVBBTElWRQotQklPLDEwNyxOQklPX0NPTk5FQ1RfRVJST1IKLUJJTywxMDgsTk9fSE9TVE5BTUVfU1BFQ0lGSUVECi1CSU8sMTA5LE5PX1BPUlRfU1BFQ0lGSUVECi1CSU8sMTEwLE5PX1NVQ0hfRklMRQotQklPLDExMSxOVUxMX1BBUkFNRVRFUgotQklPLDExMixTWVNfTElCCi1CSU8sMTEzLFVOQUJMRV9UT19DUkVBVEVfU09DS0VUCi1CSU8sMTE0LFVOSU5JVElBTElaRUQKLUJJTywxMTUsVU5TVVBQT1JURURfTUVUSE9ECi1CSU8sMTE2LFdSSVRFX1RPX1JFQURfT05MWV9CSU8KK0JJTyxmdW5jdGlvbiwxMDAsQklPX2NhbGxiYWNrX2N0cmwKK0JJTyxmdW5jdGlvbiwxMDEsQklPX2N0cmwKK0JJTyxmdW5jdGlvbiwxMDIsQklPX25ldworQklPLGZ1bmN0aW9uLDEwMyxCSU9fbmV3X2ZpbGUKK0JJTyxmdW5jdGlvbiwxMDQsQklPX25ld19tZW1fYnVmCitCSU8sZnVuY3Rpb24sMTE4LEJJT19wcmludGYKK0JJTyxmdW5jdGlvbiwxMDUsQklPX3plcm9fY29weV9nZXRfcmVhZF9idWYKK0JJTyxmdW5jdGlvbiwxMDYsQklPX3plcm9fY29weV9nZXRfcmVhZF9idWZfZG9uZQorQklPLGZ1bmN0aW9uLDEwNyxCSU9femVyb19jb3B5X2dldF93cml0ZV9idWYKK0JJTyxmdW5jdGlvbiwxMDgsQklPX3plcm9fY29weV9nZXRfd3JpdGVfYnVmX2RvbmUKK0JJTyxmdW5jdGlvbiwxMDksYmlvX2lvCitCSU8sZnVuY3Rpb24sMTEwLGJpb19tYWtlX3BhaXIKK0JJTyxmdW5jdGlvbiwxMTEsYmlvX3dyaXRlCitCSU8sZnVuY3Rpb24sMTEyLGJ1ZmZlcl9jdHJsCitCSU8sZnVuY3Rpb24sMTEzLGNvbm5fY3RybAorQklPLGZ1bmN0aW9uLDExNCxjb25uX3N0YXRlCitCSU8sZnVuY3Rpb24sMTE1LGZpbGVfY3RybAorQklPLGZ1bmN0aW9uLDExNixmaWxlX3JlYWQKK0JJTyxmdW5jdGlvbiwxMTcsbWVtX3dyaXRlCitCSU8scmVhc29uLDEwMCxCQURfRk9QRU5fTU9ERQorQklPLHJlYXNvbiwxMDEsQlJPS0VOX1BJUEUKK0JJTyxyZWFzb24sMTAyLENPTk5FQ1RfRVJST1IKK0JJTyxyZWFzb24sMTAzLEVSUk9SX1NFVFRJTkdfTkJJTworQklPLHJlYXNvbiwxMDQsSU5WQUxJRF9BUkdVTUVOVAorQklPLHJlYXNvbiwxMDUsSU5fVVNFCitCSU8scmVhc29uLDEwNixLRUVQQUxJVkUKK0JJTyxyZWFzb24sMTA3LE5CSU9fQ09OTkVDVF9FUlJPUgorQklPLHJlYXNvbiwxMDgsTk9fSE9TVE5BTUVfU1BFQ0lGSUVECitCSU8scmVhc29uLDEwOSxOT19QT1JUX1NQRUNJRklFRAorQklPLHJlYXNvbiwxMTAsTk9fU1VDSF9GSUxFCitCSU8scmVhc29uLDExMSxOVUxMX1BBUkFNRVRFUgorQklPLHJlYXNvbiwxMTIsU1lTX0xJQgorQklPLHJlYXNvbiwxMTMsVU5BQkxFX1RPX0NSRUFURV9TT0NLRVQKK0JJTyxyZWFzb24sMTE0LFVOSU5JVElBTElaRUQKK0JJTyxyZWFzb24sMTE1LFVOU1VQUE9SVEVEX01FVEhPRAorQklPLHJlYXNvbiwxMTYsV1JJVEVfVE9fUkVBRF9PTkxZX0JJTwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lcnIvYm4uZXJyb3JkYXRhIGIvc3JjL2NyeXB0by9lcnIvYm4uZXJyb3JkYXRhCmluZGV4IDc2YjYzOTIuLjZmZDQ5NjggMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL2JuLmVycm9yZGF0YQorKysgYi9zcmMvY3J5cHRvL2Vyci9ibi5lcnJvcmRhdGEKQEAgLTEsMTkgKzEsNDQgQEAKLUJOLDEwMCxBUkcyX0xUX0FSRzMKLUJOLDExNyxCQURfRU5DT0RJTkcKLUJOLDEwMSxCQURfUkVDSVBST0NBTAotQk4sMTAyLEJJR05VTV9UT09fTE9ORwotQk4sMTAzLEJJVFNfVE9PX1NNQUxMCi1CTiwxMDQsQ0FMTEVEX1dJVEhfRVZFTl9NT0RVTFVTCi1CTiwxMDUsRElWX0JZX1pFUk8KLUJOLDExOCxFTkNPREVfRVJST1IKLUJOLDEwNixFWFBBTkRfT05fU1RBVElDX0JJR05VTV9EQVRBCi1CTiwxMDcsSU5QVVRfTk9UX1JFRFVDRUQKLUJOLDEwOCxJTlZBTElEX1JBTkdFCi1CTiwxMDksTkVHQVRJVkVfTlVNQkVSCi1CTiwxMTAsTk9UX0FfU1FVQVJFCi1CTiwxMTEsTk9UX0lOSVRJQUxJWkVECi1CTiwxMTIsTk9fSU5WRVJTRQotQk4sMTEzLFBSSVZBVEVfS0VZX1RPT19MQVJHRQotQk4sMTE0LFBfSVNfTk9UX1BSSU1FCi1CTiwxMTUsVE9PX01BTllfSVRFUkFUSU9OUwotQk4sMTE2LFRPT19NQU5ZX1RFTVBPUkFSWV9WQVJJQUJMRVMKK0JOLGZ1bmN0aW9uLDEwMCxCTl9DVFhfZ2V0CitCTixmdW5jdGlvbiwxMDEsQk5fQ1RYX25ldworQk4sZnVuY3Rpb24sMTAyLEJOX0NUWF9zdGFydAorQk4sZnVuY3Rpb24sMTAzLEJOX2JuMmRlYworQk4sZnVuY3Rpb24sMTA0LEJOX2JuMmhleAorQk4sZnVuY3Rpb24sMTA1LEJOX2RpdgorQk4sZnVuY3Rpb24sMTA2LEJOX2Rpdl9yZWNwCitCTixmdW5jdGlvbiwxMDcsQk5fZXhwCitCTixmdW5jdGlvbiwxMDgsQk5fZ2VuZXJhdGVfZHNhX25vbmNlCitCTixmdW5jdGlvbiwxMDksQk5fZ2VuZXJhdGVfcHJpbWVfZXgKK0JOLGZ1bmN0aW9uLDEyNSxCTl9sc2hpZnQKK0JOLGZ1bmN0aW9uLDExMCxCTl9tb2RfZXhwMl9tb250CitCTixmdW5jdGlvbiwxMTEsQk5fbW9kX2V4cF9tb250CitCTixmdW5jdGlvbiwxMTIsQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZQorQk4sZnVuY3Rpb24sMTEzLEJOX21vZF9leHBfbW9udF93b3JkCitCTixmdW5jdGlvbiwxMTQsQk5fbW9kX2ludmVyc2UKK0JOLGZ1bmN0aW9uLDExNSxCTl9tb2RfaW52ZXJzZV9ub19icmFuY2gKK0JOLGZ1bmN0aW9uLDExNixCTl9tb2RfbHNoaWZ0X3F1aWNrCitCTixmdW5jdGlvbiwxMTcsQk5fbW9kX3NxcnQKK0JOLGZ1bmN0aW9uLDExOCxCTl9uZXcKK0JOLGZ1bmN0aW9uLDExOSxCTl9yYW5kCitCTixmdW5jdGlvbiwxMjAsQk5fcmFuZF9yYW5nZQorQk4sZnVuY3Rpb24sMTI2LEJOX3JzaGlmdAorQk4sZnVuY3Rpb24sMTIxLEJOX3NxcnQKK0JOLGZ1bmN0aW9uLDEyMixCTl91c3ViCitCTixmdW5jdGlvbiwxMjMsYm5fd2V4cGFuZAorQk4sZnVuY3Rpb24sMTI0LG1vZF9leHBfcmVjcAorQk4scmVhc29uLDEwMCxBUkcyX0xUX0FSRzMKK0JOLHJlYXNvbiwxMDEsQkFEX1JFQ0lQUk9DQUwKK0JOLHJlYXNvbiwxMDIsQklHTlVNX1RPT19MT05HCitCTixyZWFzb24sMTAzLEJJVFNfVE9PX1NNQUxMCitCTixyZWFzb24sMTA0LENBTExFRF9XSVRIX0VWRU5fTU9EVUxVUworQk4scmVhc29uLDEwNSxESVZfQllfWkVSTworQk4scmVhc29uLDEwNixFWFBBTkRfT05fU1RBVElDX0JJR05VTV9EQVRBCitCTixyZWFzb24sMTA3LElOUFVUX05PVF9SRURVQ0VECitCTixyZWFzb24sMTA4LElOVkFMSURfUkFOR0UKK0JOLHJlYXNvbiwxMDksTkVHQVRJVkVfTlVNQkVSCitCTixyZWFzb24sMTEwLE5PVF9BX1NRVUFSRQorQk4scmVhc29uLDExMSxOT1RfSU5JVElBTElaRUQKK0JOLHJlYXNvbiwxMTIsTk9fSU5WRVJTRQorQk4scmVhc29uLDExMyxQUklWQVRFX0tFWV9UT09fTEFSR0UKK0JOLHJlYXNvbiwxMTQsUF9JU19OT1RfUFJJTUUKK0JOLHJlYXNvbiwxMTUsVE9PX01BTllfSVRFUkFUSU9OUworQk4scmVhc29uLDExNixUT09fTUFOWV9URU1QT1JBUllfVkFSSUFCTEVTCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9idWYuZXJyb3JkYXRhIGIvc3JjL2NyeXB0by9lcnIvYnVmLmVycm9yZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWI2YzlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NyeXB0by9lcnIvYnVmLmVycm9yZGF0YQpAQCAtMCwwICsxLDQgQEAKK0JVRixmdW5jdGlvbiwxMDAsQlVGX01FTV9uZXcKK0JVRixmdW5jdGlvbiwxMDEsQlVGX21lbWR1cAorQlVGLGZ1bmN0aW9uLDEwMixCVUZfc3RybmR1cAorQlVGLGZ1bmN0aW9uLDEwMyxidWZfbWVtX2dyb3cKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXJyL2NpcGhlci5lcnJvcmRhdGEgYi9zcmMvY3J5cHRvL2Vyci9jaXBoZXIuZXJyb3JkYXRhCmluZGV4IDEwMzc1MDUuLmNlODQ1OWIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL2NpcGhlci5lcnJvcmRhdGEKKysrIGIvc3JjL2NyeXB0by9lcnIvY2lwaGVyLmVycm9yZGF0YQpAQCAtMSwyNSArMSw2MCBAQAotQ0lQSEVSLDEwMCxBRVNfS0VZX1NFVFVQX0ZBSUxFRAotQ0lQSEVSLDEwMSxCQURfREVDUllQVAotQ0lQSEVSLDEwMixCQURfS0VZX0xFTkdUSAotQ0lQSEVSLDEwMyxCVUZGRVJfVE9PX1NNQUxMCi1DSVBIRVIsMTA0LENUUkxfTk9UX0lNUExFTUVOVEVECi1DSVBIRVIsMTA1LENUUkxfT1BFUkFUSU9OX05PVF9JTVBMRU1FTlRFRAotQ0lQSEVSLDEwNixEQVRBX05PVF9NVUxUSVBMRV9PRl9CTE9DS19MRU5HVEgKLUNJUEhFUiwxMDcsSU5JVElBTElaQVRJT05fRVJST1IKLUNJUEhFUiwxMDgsSU5QVVRfTk9UX0lOSVRJQUxJWkVECi1DSVBIRVIsMTA5LElOVkFMSURfQURfU0laRQotQ0lQSEVSLDExMCxJTlZBTElEX0tFWV9MRU5HVEgKLUNJUEhFUiwxMTEsSU5WQUxJRF9OT05DRV9TSVpFCi1DSVBIRVIsMTEyLElOVkFMSURfT1BFUkFUSU9OCi1DSVBIRVIsMTEzLElWX1RPT19MQVJHRQotQ0lQSEVSLDExNCxOT19DSVBIRVJfU0VUCi1DSVBIRVIsMTI0LE5PX0RJUkVDVElPTl9TRVQKLUNJUEhFUiwxMTUsT1VUUFVUX0FMSUFTRVNfSU5QVVQKLUNJUEhFUiwxMTYsVEFHX1RPT19MQVJHRQotQ0lQSEVSLDExNyxUT09fTEFSR0UKLUNJUEhFUiwxMTgsVU5TVVBQT1JURURfQURfU0laRQotQ0lQSEVSLDExOSxVTlNVUFBPUlRFRF9JTlBVVF9TSVpFCi1DSVBIRVIsMTIwLFVOU1VQUE9SVEVEX0tFWV9TSVpFCi1DSVBIRVIsMTIxLFVOU1VQUE9SVEVEX05PTkNFX1NJWkUKLUNJUEhFUiwxMjIsVU5TVVBQT1JURURfVEFHX1NJWkUKLUNJUEhFUiwxMjMsV1JPTkdfRklOQUxfQkxPQ0tfTEVOR1RICitDSVBIRVIsZnVuY3Rpb24sMTAwLEVWUF9BRUFEX0NUWF9pbml0CitDSVBIRVIsZnVuY3Rpb24sMTMxLEVWUF9BRUFEX0NUWF9pbml0X3dpdGhfZGlyZWN0aW9uCitDSVBIRVIsZnVuY3Rpb24sMTAxLEVWUF9BRUFEX0NUWF9vcGVuCitDSVBIRVIsZnVuY3Rpb24sMTAyLEVWUF9BRUFEX0NUWF9zZWFsCitDSVBIRVIsZnVuY3Rpb24sMTAzLEVWUF9DSVBIRVJfQ1RYX2NvcHkKK0NJUEhFUixmdW5jdGlvbiwxMDQsRVZQX0NJUEhFUl9DVFhfY3RybAorQ0lQSEVSLGZ1bmN0aW9uLDEwNSxFVlBfQ0lQSEVSX0NUWF9zZXRfa2V5X2xlbmd0aAorQ0lQSEVSLGZ1bmN0aW9uLDEwNixFVlBfQ2lwaGVySW5pdF9leAorQ0lQSEVSLGZ1bmN0aW9uLDEwNyxFVlBfRGVjcnlwdEZpbmFsX2V4CitDSVBIRVIsZnVuY3Rpb24sMTA4LEVWUF9FbmNyeXB0RmluYWxfZXgKK0NJUEhFUixmdW5jdGlvbiwxMzIsYWVhZF9hZXNfY3RyX2htYWNfc2hhMjU2X2luaXQKK0NJUEhFUixmdW5jdGlvbiwxMzMsYWVhZF9hZXNfY3RyX2htYWNfc2hhMjU2X29wZW4KK0NJUEhFUixmdW5jdGlvbiwxMzQsYWVhZF9hZXNfY3RyX2htYWNfc2hhMjU2X3NlYWwKK0NJUEhFUixmdW5jdGlvbiwxMDksYWVhZF9hZXNfZ2NtX2luaXQKK0NJUEhFUixmdW5jdGlvbiwxMTAsYWVhZF9hZXNfZ2NtX29wZW4KK0NJUEhFUixmdW5jdGlvbiwxMTEsYWVhZF9hZXNfZ2NtX3NlYWwKK0NJUEhFUixmdW5jdGlvbiwxMTIsYWVhZF9hZXNfa2V5X3dyYXBfaW5pdAorQ0lQSEVSLGZ1bmN0aW9uLDExMyxhZWFkX2Flc19rZXlfd3JhcF9vcGVuCitDSVBIRVIsZnVuY3Rpb24sMTE0LGFlYWRfYWVzX2tleV93cmFwX3NlYWwKK0NJUEhFUixmdW5jdGlvbiwxMTUsYWVhZF9jaGFjaGEyMF9wb2x5MTMwNV9pbml0CitDSVBIRVIsZnVuY3Rpb24sMTE2LGFlYWRfY2hhY2hhMjBfcG9seTEzMDVfb3BlbgorQ0lQSEVSLGZ1bmN0aW9uLDExNyxhZWFkX2NoYWNoYTIwX3BvbHkxMzA1X3NlYWwKK0NJUEhFUixmdW5jdGlvbiwxMTgsYWVhZF9yYzRfbWQ1X3Rsc19pbml0CitDSVBIRVIsZnVuY3Rpb24sMTE5LGFlYWRfcmM0X21kNV90bHNfb3BlbgorQ0lQSEVSLGZ1bmN0aW9uLDEyMCxhZWFkX3JjNF9tZDVfdGxzX3NlYWwKK0NJUEhFUixmdW5jdGlvbiwxMjEsYWVhZF9zc2wzX2Vuc3VyZV9jaXBoZXJfaW5pdAorQ0lQSEVSLGZ1bmN0aW9uLDEyMixhZWFkX3NzbDNfaW5pdAorQ0lQSEVSLGZ1bmN0aW9uLDEyMyxhZWFkX3NzbDNfb3BlbgorQ0lQSEVSLGZ1bmN0aW9uLDEyNCxhZWFkX3NzbDNfc2VhbAorQ0lQSEVSLGZ1bmN0aW9uLDEyNSxhZWFkX3Rsc19lbnN1cmVfY2lwaGVyX2luaXQKK0NJUEhFUixmdW5jdGlvbiwxMjYsYWVhZF90bHNfaW5pdAorQ0lQSEVSLGZ1bmN0aW9uLDEyNyxhZWFkX3Rsc19vcGVuCitDSVBIRVIsZnVuY3Rpb24sMTI4LGFlYWRfdGxzX3NlYWwKK0NJUEhFUixmdW5jdGlvbiwxMjksYWVzX2luaXRfa2V5CitDSVBIRVIsZnVuY3Rpb24sMTMwLGFlc25pX2luaXRfa2V5CitDSVBIRVIscmVhc29uLDEwMCxBRVNfS0VZX1NFVFVQX0ZBSUxFRAorQ0lQSEVSLHJlYXNvbiwxMDEsQkFEX0RFQ1JZUFQKK0NJUEhFUixyZWFzb24sMTAyLEJBRF9LRVlfTEVOR1RICitDSVBIRVIscmVhc29uLDEwMyxCVUZGRVJfVE9PX1NNQUxMCitDSVBIRVIscmVhc29uLDEwNCxDVFJMX05PVF9JTVBMRU1FTlRFRAorQ0lQSEVSLHJlYXNvbiwxMDUsQ1RSTF9PUEVSQVRJT05fTk9UX0lNUExFTUVOVEVECitDSVBIRVIscmVhc29uLDEwNixEQVRBX05PVF9NVUxUSVBMRV9PRl9CTE9DS19MRU5HVEgKK0NJUEhFUixyZWFzb24sMTA3LElOSVRJQUxJWkFUSU9OX0VSUk9SCitDSVBIRVIscmVhc29uLDEwOCxJTlBVVF9OT1RfSU5JVElBTElaRUQKK0NJUEhFUixyZWFzb24sMTA5LElOVkFMSURfQURfU0laRQorQ0lQSEVSLHJlYXNvbiwxMTAsSU5WQUxJRF9LRVlfTEVOR1RICitDSVBIRVIscmVhc29uLDExMSxJTlZBTElEX05PTkNFX1NJWkUKK0NJUEhFUixyZWFzb24sMTEyLElOVkFMSURfT1BFUkFUSU9OCitDSVBIRVIscmVhc29uLDExMyxJVl9UT09fTEFSR0UKK0NJUEhFUixyZWFzb24sMTE0LE5PX0NJUEhFUl9TRVQKK0NJUEhFUixyZWFzb24sMTI0LE5PX0RJUkVDVElPTl9TRVQKK0NJUEhFUixyZWFzb24sMTE1LE9VVFBVVF9BTElBU0VTX0lOUFVUCitDSVBIRVIscmVhc29uLDExNixUQUdfVE9PX0xBUkdFCitDSVBIRVIscmVhc29uLDExNyxUT09fTEFSR0UKK0NJUEhFUixyZWFzb24sMTE4LFVOU1VQUE9SVEVEX0FEX1NJWkUKK0NJUEhFUixyZWFzb24sMTE5LFVOU1VQUE9SVEVEX0lOUFVUX1NJWkUKK0NJUEhFUixyZWFzb24sMTIwLFVOU1VQUE9SVEVEX0tFWV9TSVpFCitDSVBIRVIscmVhc29uLDEyMSxVTlNVUFBPUlRFRF9OT05DRV9TSVpFCitDSVBIRVIscmVhc29uLDEyMixVTlNVUFBPUlRFRF9UQUdfU0laRQorQ0lQSEVSLHJlYXNvbiwxMjMsV1JPTkdfRklOQUxfQkxPQ0tfTEVOR1RICmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9jb25mLmVycm9yZGF0YSBiL3NyYy9jcnlwdG8vZXJyL2NvbmYuZXJyb3JkYXRhCmluZGV4IDY1MWZhYmUuLjBiOTZhMzIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL2NvbmYuZXJyb3JkYXRhCisrKyBiL3NyYy9jcnlwdG8vZXJyL2NvbmYuZXJyb3JkYXRhCkBAIC0xLDYgKzEsMTAgQEAKLUNPTkYsMTAwLExJU1RfQ0FOTk9UX0JFX05VTEwKLUNPTkYsMTAxLE1JU1NJTkdfQ0xPU0VfU1FVQVJFX0JSQUNLRVQKLUNPTkYsMTAyLE1JU1NJTkdfRVFVQUxfU0lHTgotQ09ORiwxMDMsTk9fQ0xPU0VfQlJBQ0UKLUNPTkYsMTA0LFVOQUJMRV9UT19DUkVBVEVfTkVXX1NFQ1RJT04KLUNPTkYsMTA1LFZBUklBQkxFX0hBU19OT19WQUxVRQorQ09ORixmdW5jdGlvbiwxMDAsQ09ORl9wYXJzZV9saXN0CitDT05GLGZ1bmN0aW9uLDEwMSxOQ09ORl9sb2FkCitDT05GLGZ1bmN0aW9uLDEwMixkZWZfbG9hZF9iaW8KK0NPTkYsZnVuY3Rpb24sMTAzLHN0cl9jb3B5CitDT05GLHJlYXNvbiwxMDAsTElTVF9DQU5OT1RfQkVfTlVMTAorQ09ORixyZWFzb24sMTAxLE1JU1NJTkdfQ0xPU0VfU1FVQVJFX0JSQUNLRVQKK0NPTkYscmVhc29uLDEwMixNSVNTSU5HX0VRVUFMX1NJR04KK0NPTkYscmVhc29uLDEwMyxOT19DTE9TRV9CUkFDRQorQ09ORixyZWFzb24sMTA0LFVOQUJMRV9UT19DUkVBVEVfTkVXX1NFQ1RJT04KK0NPTkYscmVhc29uLDEwNSxWQVJJQUJMRV9IQVNfTk9fVkFMVUUKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXJyL2NyeXB0by5lcnJvcmRhdGEgYi9zcmMvY3J5cHRvL2Vyci9jcnlwdG8uZXJyb3JkYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMGU5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY3J5cHRvL2Vyci9jcnlwdG8uZXJyb3JkYXRhCkBAIC0wLDAgKzEsNCBAQAorQ1JZUFRPLGZ1bmN0aW9uLDEwMCxDUllQVE9fZ2V0X2V4X25ld19pbmRleAorQ1JZUFRPLGZ1bmN0aW9uLDEwMSxDUllQVE9fc2V0X2V4X2RhdGEKK0NSWVBUTyxmdW5jdGlvbiwxMDIsZ2V0X2NsYXNzCitDUllQVE8sZnVuY3Rpb24sMTAzLGdldF9mdW5jX3BvaW50ZXJzCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9kaC5lcnJvcmRhdGEgYi9zcmMvY3J5cHRvL2Vyci9kaC5lcnJvcmRhdGEKaW5kZXggNTcxZTIxOC4uMWZkNjc1YiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lcnIvZGguZXJyb3JkYXRhCisrKyBiL3NyYy9jcnlwdG8vZXJyL2RoLmVycm9yZGF0YQpAQCAtMSw0ICsxLDggQEAKLURILDEwMCxCQURfR0VORVJBVE9SCi1ESCwxMDEsSU5WQUxJRF9QVUJLRVkKLURILDEwMixNT0RVTFVTX1RPT19MQVJHRQotREgsMTAzLE5PX1BSSVZBVEVfVkFMVUUKK0RILGZ1bmN0aW9uLDEwMCxESF9uZXdfbWV0aG9kCitESCxmdW5jdGlvbiwxMDEsY29tcHV0ZV9rZXkKK0RILGZ1bmN0aW9uLDEwMixnZW5lcmF0ZV9rZXkKK0RILGZ1bmN0aW9uLDEwMyxnZW5lcmF0ZV9wYXJhbWV0ZXJzCitESCxyZWFzb24sMTAwLEJBRF9HRU5FUkFUT1IKK0RILHJlYXNvbiwxMDEsSU5WQUxJRF9QVUJLRVkKK0RILHJlYXNvbiwxMDIsTU9EVUxVU19UT09fTEFSR0UKK0RILHJlYXNvbiwxMDMsTk9fUFJJVkFURV9WQUxVRQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lcnIvZGlnZXN0LmVycm9yZGF0YSBiL3NyYy9jcnlwdG8vZXJyL2RpZ2VzdC5lcnJvcmRhdGEKaW5kZXggNDExZTc3OC4uOTVhMzYyMiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lcnIvZGlnZXN0LmVycm9yZGF0YQorKysgYi9zcmMvY3J5cHRvL2Vyci9kaWdlc3QuZXJyb3JkYXRhCkBAIC0xICsxLDMgQEAKLURJR0VTVCwxMDAsSU5QVVRfTk9UX0lOSVRJQUxJWkVECitESUdFU1QsZnVuY3Rpb24sMTAwLEVWUF9EaWdlc3RJbml0X2V4CitESUdFU1QsZnVuY3Rpb24sMTAxLEVWUF9NRF9DVFhfY29weV9leAorRElHRVNULHJlYXNvbiwxMDAsSU5QVVRfTk9UX0lOSVRJQUxJWkVECmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9kc2EuZXJyb3JkYXRhIGIvc3JjL2NyeXB0by9lcnIvZHNhLmVycm9yZGF0YQppbmRleCAzYzU3NjRhLi5jMmRmZjIzIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Vyci9kc2EuZXJyb3JkYXRhCisrKyBiL3NyYy9jcnlwdG8vZXJyL2RzYS5lcnJvcmRhdGEKQEAgLTEsNCArMSw5IEBACi1EU0EsMTAwLEJBRF9RX1ZBTFVFCi1EU0EsMTAxLE1JU1NJTkdfUEFSQU1FVEVSUwotRFNBLDEwMixNT0RVTFVTX1RPT19MQVJHRQotRFNBLDEwMyxORUVEX05FV19TRVRVUF9WQUxVRVMKK0RTQSxmdW5jdGlvbiwxMDAsRFNBX25ld19tZXRob2QKK0RTQSxmdW5jdGlvbiwxMDEsZHNhX3NpZ19jYgorRFNBLGZ1bmN0aW9uLDEwMixzaWduCitEU0EsZnVuY3Rpb24sMTAzLHNpZ25fc2V0dXAKK0RTQSxmdW5jdGlvbiwxMDQsdmVyaWZ5CitEU0EscmVhc29uLDEwMCxCQURfUV9WQUxVRQorRFNBLHJlYXNvbiwxMDEsTUlTU0lOR19QQVJBTUVURVJTCitEU0EscmVhc29uLDEwMixNT0RVTFVTX1RPT19MQVJHRQorRFNBLHJlYXNvbiwxMDMsTkVFRF9ORVdfU0VUVVBfVkFMVUVTCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9lYy5lcnJvcmRhdGEgYi9zcmMvY3J5cHRvL2Vyci9lYy5lcnJvcmRhdGEKaW5kZXggZTdiNDE3NS4uMjUyZjdhYiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lcnIvZWMuZXJyb3JkYXRhCisrKyBiL3NyYy9jcnlwdG8vZXJyL2VjLmVycm9yZGF0YQpAQCAtMSwyOCArMSw5NSBAQAotRUMsMTI2LEJJR05VTV9PVVRfT0ZfUkFOR0UKLUVDLDEwMCxCVUZGRVJfVE9PX1NNQUxMCi1FQywxMDEsQ09PUkRJTkFURVNfT1VUX09GX1JBTkdFCi1FQywxMDIsRDJJX0VDUEtQQVJBTUVURVJTX0ZBSUxVUkUKLUVDLDEwMyxFQ19HUk9VUF9ORVdfQllfTkFNRV9GQUlMVVJFCi1FQywxMDQsR1JPVVAyUEtQQVJBTUVURVJTX0ZBSUxVUkUKLUVDLDEwNSxJMkRfRUNQS1BBUkFNRVRFUlNfRkFJTFVSRQotRUMsMTA2LElOQ09NUEFUSUJMRV9PQkpFQ1RTCi1FQywxMDcsSU5WQUxJRF9DT01QUkVTU0VEX1BPSU5UCi1FQywxMDgsSU5WQUxJRF9DT01QUkVTU0lPTl9CSVQKLUVDLDEwOSxJTlZBTElEX0VOQ09ESU5HCi1FQywxMTAsSU5WQUxJRF9GSUVMRAotRUMsMTExLElOVkFMSURfRk9STQotRUMsMTEyLElOVkFMSURfR1JPVVBfT1JERVIKLUVDLDExMyxJTlZBTElEX1BSSVZBVEVfS0VZCi1FQywxMTQsTUlTU0lOR19QQVJBTUVURVJTCi1FQywxMTUsTUlTU0lOR19QUklWQVRFX0tFWQotRUMsMTE2LE5PTl9OQU1FRF9DVVJWRQotRUMsMTE3LE5PVF9JTklUSUFMSVpFRAotRUMsMTE4LFBLUEFSQU1FVEVSUzJHUk9VUF9GQUlMVVJFCi1FQywxMTksUE9JTlRfQVRfSU5GSU5JVFkKLUVDLDEyMCxQT0lOVF9JU19OT1RfT05fQ1VSVkUKLUVDLDEyMSxTTE9UX0ZVTEwKLUVDLDEyMixVTkRFRklORURfR0VORVJBVE9SCi1FQywxMjMsVU5LTk9XTl9HUk9VUAotRUMsMTI0LFVOS05PV05fT1JERVIKLUVDLDEyNyxXUk9OR19DVVJWRV9QQVJBTUVURVJTCi1FQywxMjUsV1JPTkdfT1JERVIKK0VDLGZ1bmN0aW9uLDE1OSxCTl90b19mZWxlbQorRUMsZnVuY3Rpb24sMTAwLEVDX0dST1VQX2NvcHkKK0VDLGZ1bmN0aW9uLDEwMSxFQ19HUk9VUF9nZXRfY3VydmVfR0ZwCitFQyxmdW5jdGlvbiwxMDIsRUNfR1JPVVBfZ2V0X2RlZ3JlZQorRUMsZnVuY3Rpb24sMTAzLEVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lCitFQyxmdW5jdGlvbiwxNjYsRUNfR1JPVVBfbmV3X2N1cnZlX0dGcAorRUMsZnVuY3Rpb24sMTA0LEVDX0tFWV9jaGVja19rZXkKK0VDLGZ1bmN0aW9uLDEwNSxFQ19LRVlfY29weQorRUMsZnVuY3Rpb24sMTA2LEVDX0tFWV9nZW5lcmF0ZV9rZXkKK0VDLGZ1bmN0aW9uLDE2NSxFQ19LRVlfbmV3X2J5X2N1cnZlX25hbWUKK0VDLGZ1bmN0aW9uLDEwNyxFQ19LRVlfbmV3X21ldGhvZAorRUMsZnVuY3Rpb24sMTA4LEVDX0tFWV9zZXRfcHVibGljX2tleV9hZmZpbmVfY29vcmRpbmF0ZXMKK0VDLGZ1bmN0aW9uLDEwOSxFQ19QT0lOVF9hZGQKK0VDLGZ1bmN0aW9uLDExMCxFQ19QT0lOVF9jbXAKK0VDLGZ1bmN0aW9uLDExMSxFQ19QT0lOVF9jb3B5CitFQyxmdW5jdGlvbiwxMTIsRUNfUE9JTlRfZGJsCitFQyxmdW5jdGlvbiwxMTMsRUNfUE9JTlRfZHVwCitFQyxmdW5jdGlvbiwxMTQsRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAKK0VDLGZ1bmN0aW9uLDExNSxFQ19QT0lOVF9pbnZlcnQKK0VDLGZ1bmN0aW9uLDExNixFQ19QT0lOVF9pc19hdF9pbmZpbml0eQorRUMsZnVuY3Rpb24sMTE3LEVDX1BPSU5UX2lzX29uX2N1cnZlCitFQyxmdW5jdGlvbiwxMTgsRUNfUE9JTlRfbWFrZV9hZmZpbmUKK0VDLGZ1bmN0aW9uLDExOSxFQ19QT0lOVF9uZXcKK0VDLGZ1bmN0aW9uLDEyMCxFQ19QT0lOVF9vY3QycG9pbnQKK0VDLGZ1bmN0aW9uLDEyMSxFQ19QT0lOVF9wb2ludDJvY3QKK0VDLGZ1bmN0aW9uLDEyMixFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcAorRUMsZnVuY3Rpb24sMTIzLEVDX1BPSU5UX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzX0dGcAorRUMsZnVuY3Rpb24sMTI0LEVDX1BPSU5UX3NldF90b19pbmZpbml0eQorRUMsZnVuY3Rpb24sMTI1LEVDX1BPSU5Uc19tYWtlX2FmZmluZQorRUMsZnVuY3Rpb24sMTI2LGNvbXB1dGVfd05BRgorRUMsZnVuY3Rpb24sMTI3LGQyaV9FQ1BLUGFyYW1ldGVycworRUMsZnVuY3Rpb24sMTI4LGQyaV9FQ1BhcmFtZXRlcnMKK0VDLGZ1bmN0aW9uLDEyOSxkMmlfRUNQcml2YXRlS2V5CitFQyxmdW5jdGlvbiwxMzAsZWNfR0ZwX21vbnRfZmllbGRfZGVjb2RlCitFQyxmdW5jdGlvbiwxMzEsZWNfR0ZwX21vbnRfZmllbGRfZW5jb2RlCitFQyxmdW5jdGlvbiwxMzIsZWNfR0ZwX21vbnRfZmllbGRfbXVsCitFQyxmdW5jdGlvbiwxMzMsZWNfR0ZwX21vbnRfZmllbGRfc2V0X3RvX29uZQorRUMsZnVuY3Rpb24sMTM0LGVjX0dGcF9tb250X2ZpZWxkX3NxcgorRUMsZnVuY3Rpb24sMTM1LGVjX0dGcF9tb250X2dyb3VwX3NldF9jdXJ2ZQorRUMsZnVuY3Rpb24sMTYwLGVjX0dGcF9uaXN0cDI1Nl9ncm91cF9zZXRfY3VydmUKK0VDLGZ1bmN0aW9uLDE2MSxlY19HRnBfbmlzdHAyNTZfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcworRUMsZnVuY3Rpb24sMTYyLGVjX0dGcF9uaXN0cDI1Nl9wb2ludHNfbXVsCitFQyxmdW5jdGlvbiwxMzYsZWNfR0ZwX3NpbXBsZV9ncm91cF9jaGVja19kaXNjcmltaW5hbnQKK0VDLGZ1bmN0aW9uLDEzNyxlY19HRnBfc2ltcGxlX2dyb3VwX3NldF9jdXJ2ZQorRUMsZnVuY3Rpb24sMTM4LGVjX0dGcF9zaW1wbGVfbWFrZV9hZmZpbmUKK0VDLGZ1bmN0aW9uLDEzOSxlY19HRnBfc2ltcGxlX29jdDJwb2ludAorRUMsZnVuY3Rpb24sMTQwLGVjX0dGcF9zaW1wbGVfcG9pbnQyb2N0CitFQyxmdW5jdGlvbiwxNDEsZWNfR0ZwX3NpbXBsZV9wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzCitFQyxmdW5jdGlvbiwxNDIsZWNfR0ZwX3NpbXBsZV9wb2ludF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzCitFQyxmdW5jdGlvbiwxNDMsZWNfR0ZwX3NpbXBsZV9wb2ludHNfbWFrZV9hZmZpbmUKK0VDLGZ1bmN0aW9uLDE0NCxlY19HRnBfc2ltcGxlX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzCitFQyxmdW5jdGlvbiwxNDUsZWNfYXNuMV9ncm91cDJwa3BhcmFtZXRlcnMKK0VDLGZ1bmN0aW9uLDE0NixlY19hc24xX3BrcGFyYW1ldGVyczJncm91cAorRUMsZnVuY3Rpb24sMTYzLGVjX2dyb3VwX2NvcHkKK0VDLGZ1bmN0aW9uLDE0NyxlY19ncm91cF9uZXcKK0VDLGZ1bmN0aW9uLDE0OCxlY19ncm91cF9uZXdfY3VydmVfR0ZwCitFQyxmdW5jdGlvbiwxNDksZWNfZ3JvdXBfbmV3X2Zyb21fZGF0YQorRUMsZnVuY3Rpb24sMTUwLGVjX3BvaW50X3NldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAKK0VDLGZ1bmN0aW9uLDE1MSxlY19wcmVfY29tcF9uZXcKK0VDLGZ1bmN0aW9uLDE1MixlY193TkFGX211bAorRUMsZnVuY3Rpb24sMTUzLGVjX3dOQUZfcHJlY29tcHV0ZV9tdWx0CitFQyxmdW5jdGlvbiwxNTQsaTJkX0VDUEtQYXJhbWV0ZXJzCitFQyxmdW5jdGlvbiwxNTUsaTJkX0VDUGFyYW1ldGVycworRUMsZnVuY3Rpb24sMTU2LGkyZF9FQ1ByaXZhdGVLZXkKK0VDLGZ1bmN0aW9uLDE1NyxpMm9fRUNQdWJsaWNLZXkKK0VDLGZ1bmN0aW9uLDE2NCxuaXN0cDI1Nl9wcmVfY29tcF9uZXcKK0VDLGZ1bmN0aW9uLDE1OCxvMmlfRUNQdWJsaWNLZXkKK0VDLHJlYXNvbiwxMjYsQklHTlVNX09VVF9PRl9SQU5HRQorRUMscmVhc29uLDEwMCxCVUZGRVJfVE9PX1NNQUxMCitFQyxyZWFzb24sMTAxLENPT1JESU5BVEVTX09VVF9PRl9SQU5HRQorRUMscmVhc29uLDEwMixEMklfRUNQS1BBUkFNRVRFUlNfRkFJTFVSRQorRUMscmVhc29uLDEwMyxFQ19HUk9VUF9ORVdfQllfTkFNRV9GQUlMVVJFCitFQyxyZWFzb24sMTA0LEdST1VQMlBLUEFSQU1FVEVSU19GQUlMVVJFCitFQyxyZWFzb24sMTA1LEkyRF9FQ1BLUEFSQU1FVEVSU19GQUlMVVJFCitFQyxyZWFzb24sMTA2LElOQ09NUEFUSUJMRV9PQkpFQ1RTCitFQyxyZWFzb24sMTA3LElOVkFMSURfQ09NUFJFU1NFRF9QT0lOVAorRUMscmVhc29uLDEwOCxJTlZBTElEX0NPTVBSRVNTSU9OX0JJVAorRUMscmVhc29uLDEwOSxJTlZBTElEX0VOQ09ESU5HCitFQyxyZWFzb24sMTEwLElOVkFMSURfRklFTEQKK0VDLHJlYXNvbiwxMTEsSU5WQUxJRF9GT1JNCitFQyxyZWFzb24sMTEyLElOVkFMSURfR1JPVVBfT1JERVIKK0VDLHJlYXNvbiwxMTMsSU5WQUxJRF9QUklWQVRFX0tFWQorRUMscmVhc29uLDExNCxNSVNTSU5HX1BBUkFNRVRFUlMKK0VDLHJlYXNvbiwxMTUsTUlTU0lOR19QUklWQVRFX0tFWQorRUMscmVhc29uLDExNixOT05fTkFNRURfQ1VSVkUKK0VDLHJlYXNvbiwxMTcsTk9UX0lOSVRJQUxJWkVECitFQyxyZWFzb24sMTE4LFBLUEFSQU1FVEVSUzJHUk9VUF9GQUlMVVJFCitFQyxyZWFzb24sMTE5LFBPSU5UX0FUX0lORklOSVRZCitFQyxyZWFzb24sMTIwLFBPSU5UX0lTX05PVF9PTl9DVVJWRQorRUMscmVhc29uLDEyMSxTTE9UX0ZVTEwKK0VDLHJlYXNvbiwxMjIsVU5ERUZJTkVEX0dFTkVSQVRPUgorRUMscmVhc29uLDEyMyxVTktOT1dOX0dST1VQCitFQyxyZWFzb24sMTI0LFVOS05PV05fT1JERVIKK0VDLHJlYXNvbiwxMjcsV1JPTkdfQ1VSVkVfUEFSQU1FVEVSUworRUMscmVhc29uLDEyNSxXUk9OR19PUkRFUgpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lcnIvZWNkaC5lcnJvcmRhdGEgYi9zcmMvY3J5cHRvL2Vyci9lY2RoLmVycm9yZGF0YQppbmRleCBmNzE0YzMwLi4wZjEyMTVlIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Vyci9lY2RoLmVycm9yZGF0YQorKysgYi9zcmMvY3J5cHRvL2Vyci9lY2RoLmVycm9yZGF0YQpAQCAtMSwzICsxLDQgQEAKLUVDREgsMTAwLEtERl9GQUlMRUQKLUVDREgsMTAxLE5PX1BSSVZBVEVfVkFMVUUKLUVDREgsMTAyLFBPSU5UX0FSSVRITUVUSUNfRkFJTFVSRQorRUNESCxmdW5jdGlvbiwxMDAsRUNESF9jb21wdXRlX2tleQorRUNESCxyZWFzb24sMTAwLEtERl9GQUlMRUQKK0VDREgscmVhc29uLDEwMSxOT19QUklWQVRFX1ZBTFVFCitFQ0RILHJlYXNvbiwxMDIsUE9JTlRfQVJJVEhNRVRJQ19GQUlMVVJFCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9lY2RzYS5lcnJvcmRhdGEgYi9zcmMvY3J5cHRvL2Vyci9lY2RzYS5lcnJvcmRhdGEKaW5kZXggNThiYTU5MS4uOTdjMjEzZSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lcnIvZWNkc2EuZXJyb3JkYXRhCisrKyBiL3NyYy9jcnlwdG8vZXJyL2VjZHNhLmVycm9yZGF0YQpAQCAtMSw2ICsxLDEwIEBACi1FQ0RTQSwxMDAsQkFEX1NJR05BVFVSRQotRUNEU0EsMTA1LEVOQ09ERV9FUlJPUgotRUNEU0EsMTAxLE1JU1NJTkdfUEFSQU1FVEVSUwotRUNEU0EsMTAyLE5FRURfTkVXX1NFVFVQX1ZBTFVFUwotRUNEU0EsMTAzLE5PVF9JTVBMRU1FTlRFRAotRUNEU0EsMTA0LFJBTkRPTV9OVU1CRVJfR0VORVJBVElPTl9GQUlMRUQKK0VDRFNBLGZ1bmN0aW9uLDEwMCxFQ0RTQV9kb19zaWduX2V4CitFQ0RTQSxmdW5jdGlvbiwxMDEsRUNEU0FfZG9fdmVyaWZ5CitFQ0RTQSxmdW5jdGlvbiwxMDIsRUNEU0Ffc2lnbl9leAorRUNEU0EsZnVuY3Rpb24sMTAzLGRpZ2VzdF90b19ibgorRUNEU0EsZnVuY3Rpb24sMTA0LGVjZHNhX3NpZ25fc2V0dXAKK0VDRFNBLHJlYXNvbiwxMDAsQkFEX1NJR05BVFVSRQorRUNEU0EscmVhc29uLDEwMSxNSVNTSU5HX1BBUkFNRVRFUlMKK0VDRFNBLHJlYXNvbiwxMDIsTkVFRF9ORVdfU0VUVVBfVkFMVUVTCitFQ0RTQSxyZWFzb24sMTAzLE5PVF9JTVBMRU1FTlRFRAorRUNEU0EscmVhc29uLDEwNCxSQU5ET01fTlVNQkVSX0dFTkVSQVRJT05fRkFJTEVECmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9lbmdpbmUuZXJyb3JkYXRhIGIvc3JjL2NyeXB0by9lcnIvZW5naW5lLmVycm9yZGF0YQppbmRleCBlZGJkN2I5Li4xMTg1ZTg4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Vyci9lbmdpbmUuZXJyb3JkYXRhCisrKyBiL3NyYy9jcnlwdG8vZXJyL2VuZ2luZS5lcnJvcmRhdGEKQEAgLTEgKzEgQEAKLUVOR0lORSwxMDAsT1BFUkFUSU9OX05PVF9TVVBQT1JURUQKK0VOR0lORSxyZWFzb24sMTAwLE9QRVJBVElPTl9OT1RfU1VQUE9SVEVECmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9lcnIuYyBiL3NyYy9jcnlwdG8vZXJyL2Vyci5jCmluZGV4IDI0ODI0ZTguLmRlMWI0YTcgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL2Vyci5jCisrKyBiL3NyYy9jcnlwdG8vZXJyL2Vyci5jCkBAIC0xMjUsNiArMTI1LDEwIEBACiAjaW5jbHVkZSAiLi4vaW50ZXJuYWwuaCIKIAogCitleHRlcm4gY29uc3QgdWludDMyX3Qga09wZW5TU0xGdW5jdGlvblZhbHVlc1tdOworZXh0ZXJuIGNvbnN0IHNpemVfdCBrT3BlblNTTEZ1bmN0aW9uVmFsdWVzTGVuOworZXh0ZXJuIGNvbnN0IGNoYXIga09wZW5TU0xGdW5jdGlvblN0cmluZ0RhdGFbXTsKKwogZXh0ZXJuIGNvbnN0IHVpbnQzMl90IGtPcGVuU1NMUmVhc29uVmFsdWVzW107CiBleHRlcm4gY29uc3Qgc2l6ZV90IGtPcGVuU1NMUmVhc29uVmFsdWVzTGVuOwogZXh0ZXJuIGNvbnN0IGNoYXIga09wZW5TU0xSZWFzb25TdHJpbmdEYXRhW107CkBAIC0yNTUsNTEgKzI1OSw0MiBAQAogfQogCiB1aW50MzJfdCBFUlJfZ2V0X2Vycm9yKHZvaWQpIHsKLSAgcmV0dXJuIGdldF9lcnJvcl92YWx1ZXMoMSAvKiBpbmMgKi8sIDAgLyogYm90dG9tICovLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgcmV0dXJuIGdldF9lcnJvcl92YWx1ZXMoMSwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiB9CiAKIHVpbnQzMl90IEVSUl9nZXRfZXJyb3JfbGluZShjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lKSB7Ci0gIHJldHVybiBnZXRfZXJyb3JfdmFsdWVzKDEgLyogaW5jICovLCAwIC8qIGJvdHRvbSAqLywgZmlsZSwgbGluZSwgTlVMTCwgTlVMTCk7CisgIHJldHVybiBnZXRfZXJyb3JfdmFsdWVzKDEsIDAsIGZpbGUsIGxpbmUsIE5VTEwsIE5VTEwpOwogfQogCiB1aW50MzJfdCBFUlJfZ2V0X2Vycm9yX2xpbmVfZGF0YShjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmRhdGEsIGludCAqZmxhZ3MpIHsKLSAgcmV0dXJuIGdldF9lcnJvcl92YWx1ZXMoMSAvKiBpbmMgKi8sIDAgLyogYm90dG9tICovLCBmaWxlLCBsaW5lLCBkYXRhLCBmbGFncyk7CisgIHJldHVybiBnZXRfZXJyb3JfdmFsdWVzKDEsIDAsIGZpbGUsIGxpbmUsIGRhdGEsIGZsYWdzKTsKIH0KIAogdWludDMyX3QgRVJSX3BlZWtfZXJyb3Iodm9pZCkgewotICByZXR1cm4gZ2V0X2Vycm9yX3ZhbHVlcygwIC8qIHBlZWsgKi8sIDAgLyogYm90dG9tICovLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgcmV0dXJuIGdldF9lcnJvcl92YWx1ZXMoMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiB9CiAKIHVpbnQzMl90IEVSUl9wZWVrX2Vycm9yX2xpbmUoY29uc3QgY2hhciAqKmZpbGUsIGludCAqbGluZSkgewotICByZXR1cm4gZ2V0X2Vycm9yX3ZhbHVlcygwIC8qIHBlZWsgKi8sIDAgLyogYm90dG9tICovLCBmaWxlLCBsaW5lLCBOVUxMLCBOVUxMKTsKKyAgcmV0dXJuIGdldF9lcnJvcl92YWx1ZXMoMCwgMCwgZmlsZSwgbGluZSwgTlVMTCwgTlVMTCk7CiB9CiAKIHVpbnQzMl90IEVSUl9wZWVrX2Vycm9yX2xpbmVfZGF0YShjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipkYXRhLCBpbnQgKmZsYWdzKSB7Ci0gIHJldHVybiBnZXRfZXJyb3JfdmFsdWVzKDAgLyogcGVlayAqLywgMCAvKiBib3R0b20gKi8sIGZpbGUsIGxpbmUsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLX0KLQotY29uc3QgY2hhciAqRVJSX3BlZWtfZnVuY3Rpb24odm9pZCkgewotICBFUlJfU1RBVEUgKnN0YXRlID0gZXJyX2dldF9zdGF0ZSgpOwotICBpZiAoc3RhdGUgPT0gTlVMTCB8fCBzdGF0ZS0+Ym90dG9tID09IHN0YXRlLT50b3ApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gc3RhdGUtPmVycm9yc1soc3RhdGUtPmJvdHRvbSArIDEpICUgRVJSX05VTV9FUlJPUlNdLmZ1bmN0aW9uOworICByZXR1cm4gZ2V0X2Vycm9yX3ZhbHVlcygwLCAwLCBmaWxlLCBsaW5lLCBkYXRhLCBmbGFncyk7CiB9CiAKIHVpbnQzMl90IEVSUl9wZWVrX2xhc3RfZXJyb3Iodm9pZCkgewotICByZXR1cm4gZ2V0X2Vycm9yX3ZhbHVlcygwIC8qIHBlZWsgKi8sIDEgLyogdG9wICovLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgcmV0dXJuIGdldF9lcnJvcl92YWx1ZXMoMCwgMSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiB9CiAKIHVpbnQzMl90IEVSUl9wZWVrX2xhc3RfZXJyb3JfbGluZShjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lKSB7Ci0gIHJldHVybiBnZXRfZXJyb3JfdmFsdWVzKDAgLyogcGVlayAqLywgMSAvKiB0b3AgKi8sIGZpbGUsIGxpbmUsIE5VTEwsIE5VTEwpOworICByZXR1cm4gZ2V0X2Vycm9yX3ZhbHVlcygwLCAxLCBmaWxlLCBsaW5lLCBOVUxMLCBOVUxMKTsKIH0KIAogdWludDMyX3QgRVJSX3BlZWtfbGFzdF9lcnJvcl9saW5lX2RhdGEoY29uc3QgY2hhciAqKmZpbGUsIGludCAqbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipkYXRhLCBpbnQgKmZsYWdzKSB7Ci0gIHJldHVybiBnZXRfZXJyb3JfdmFsdWVzKDAgLyogcGVlayAqLywgMSAvKiB0b3AgKi8sIGZpbGUsIGxpbmUsIGRhdGEsIGZsYWdzKTsKKyAgcmV0dXJuIGdldF9lcnJvcl92YWx1ZXMoMCwgMSwgZmlsZSwgbGluZSwgZGF0YSwgZmxhZ3MpOwogfQogCiB2b2lkIEVSUl9jbGVhcl9lcnJvcih2b2lkKSB7CkBAIC0zNDYsMjAgKzM0MSw0MCBAQAogICBlcnJubyA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIGVycl9lcnJvcl9zdHJpbmcodWludDMyX3QgcGFja2VkX2Vycm9yLCBjb25zdCBjaGFyICpmdW5jX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmLCBzaXplX3QgbGVuKSB7Ci0gIGNoYXIgbGliX2J1Zls2NF0sIHJlYXNvbl9idWZbNjRdOwotICBjb25zdCBjaGFyICpsaWJfc3RyLCAqcmVhc29uX3N0cjsKLSAgdW5zaWduZWQgbGliLCByZWFzb247CitjaGFyICpFUlJfZXJyb3Jfc3RyaW5nKHVpbnQzMl90IHBhY2tlZF9lcnJvciwgY2hhciAqcmV0KSB7CisgIHN0YXRpYyBjaGFyIGJ1ZltFUlJfRVJST1JfU1RSSU5HX0JVRl9MRU5dOworCisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIC8qIFRPRE8oZm9yayk6IHJlbW92ZSB0aGlzLiAqLworICAgIHJldCA9IGJ1ZjsKKyAgfQorCisjaWYgIWRlZmluZWQoTkRFQlVHKQorICAvKiBUaGlzIGlzIGFpbWVkIHRvIGhlbHAgY2F0Y2ggY2FsbGVycyB3aG8gZG9uJ3QgcHJvdmlkZQorICAgKiB8RVJSX0VSUk9SX1NUUklOR19CVUZfTEVOfCBieXRlcyBvZiBzcGFjZS4gKi8KKyAgbWVtc2V0KHJldCwgMCwgRVJSX0VSUk9SX1NUUklOR19CVUZfTEVOKTsKKyNlbmRpZgorCisgIEVSUl9lcnJvcl9zdHJpbmdfbihwYWNrZWRfZXJyb3IsIHJldCwgRVJSX0VSUk9SX1NUUklOR19CVUZfTEVOKTsKKworICByZXR1cm4gcmV0OworfQorCit2b2lkIEVSUl9lcnJvcl9zdHJpbmdfbih1aW50MzJfdCBwYWNrZWRfZXJyb3IsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikgeworICBjaGFyIGxpYl9idWZbNjRdLCBmdW5jX2J1Zls2NF0sIHJlYXNvbl9idWZbNjRdOworICBjb25zdCBjaGFyICpsaWJfc3RyLCAqZnVuY19zdHIsICpyZWFzb25fc3RyOworICB1bnNpZ25lZCBsaWIsIGZ1bmMsIHJlYXNvbjsKIAogICBpZiAobGVuID09IDApIHsKICAgICByZXR1cm47CiAgIH0KIAogICBsaWIgPSBFUlJfR0VUX0xJQihwYWNrZWRfZXJyb3IpOworICBmdW5jID0gRVJSX0dFVF9GVU5DKHBhY2tlZF9lcnJvcik7CiAgIHJlYXNvbiA9IEVSUl9HRVRfUkVBU09OKHBhY2tlZF9lcnJvcik7CiAKICAgbGliX3N0ciA9IEVSUl9saWJfZXJyb3Jfc3RyaW5nKHBhY2tlZF9lcnJvcik7CisgIGZ1bmNfc3RyID0gRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nKHBhY2tlZF9lcnJvcik7CiAgIHJlYXNvbl9zdHIgPSBFUlJfcmVhc29uX2Vycm9yX3N0cmluZyhwYWNrZWRfZXJyb3IpOwogCiAgIGlmIChsaWJfc3RyID09IE5VTEwpIHsKQEAgLTM2OCw3ICszODMsOCBAQAogICB9CiAKICAgaWYgKGZ1bmNfc3RyID09IE5VTEwpIHsKLSAgICBmdW5jX3N0ciA9ICJPUEVOU1NMX2ludGVybmFsIjsKKyAgICBCSU9fc25wcmludGYoZnVuY19idWYsIHNpemVvZihmdW5jX2J1ZiksICJmdW5jKCV1KSIsIGZ1bmMpOworICAgIGZ1bmNfc3RyID0gZnVuY19idWY7CiAgIH0KIAogICBpZiAocmVhc29uX3N0ciA9PSBOVUxMKSB7CkBAIC00MTAsMjkgKzQyNiw2IEBACiAgIH0KIH0KIAotY2hhciAqRVJSX2Vycm9yX3N0cmluZyh1aW50MzJfdCBwYWNrZWRfZXJyb3IsIGNoYXIgKnJldCkgewotICBzdGF0aWMgY2hhciBidWZbRVJSX0VSUk9SX1NUUklOR19CVUZfTEVOXTsKLQotICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICAvKiBUT0RPKGZvcmspOiByZW1vdmUgdGhpcy4gKi8KLSAgICByZXQgPSBidWY7Ci0gIH0KLQotI2lmICFkZWZpbmVkKE5ERUJVRykKLSAgLyogVGhpcyBpcyBhaW1lZCB0byBoZWxwIGNhdGNoIGNhbGxlcnMgd2hvIGRvbid0IHByb3ZpZGUKLSAgICogfEVSUl9FUlJPUl9TVFJJTkdfQlVGX0xFTnwgYnl0ZXMgb2Ygc3BhY2UuICovCi0gIG1lbXNldChyZXQsIDAsIEVSUl9FUlJPUl9TVFJJTkdfQlVGX0xFTik7Ci0jZW5kaWYKLQotICBFUlJfZXJyb3Jfc3RyaW5nX24ocGFja2VkX2Vycm9yLCByZXQsIEVSUl9FUlJPUl9TVFJJTkdfQlVGX0xFTik7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBFUlJfZXJyb3Jfc3RyaW5nX24odWludDMyX3QgcGFja2VkX2Vycm9yLCBjaGFyICpidWYsIHNpemVfdCBsZW4pIHsKLSAgZXJyX2Vycm9yX3N0cmluZyhwYWNrZWRfZXJyb3IsIE5VTEwsIGJ1ZiwgbGVuKTsKLX0KLQogLy8gZXJyX3N0cmluZ19jbXAgaXMgYSBjb21wYXJlIGZ1bmN0aW9uIGZvciBzZWFyY2hpbmcgZXJyb3IgdmFsdWVzIHdpdGgKIC8vIHxic2VhcmNofCBpbiB8ZXJyX3N0cmluZ19sb29rdXB8Lgogc3RhdGljIGludCBlcnJfc3RyaW5nX2NtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSB7CkBAIC01MTIsOCArNTA1LDggQEAKICAgICAiSE1BQyByb3V0aW5lcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVJSX0xJQl9ITUFDICovCiAgICAgIkRpZ2VzdCBmdW5jdGlvbnMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVSUl9MSUJfRElHRVNUICovCiAgICAgIkNpcGhlciBmdW5jdGlvbnMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVSUl9MSUJfQ0lQSEVSICovCi0gICAgIkhLREYgZnVuY3Rpb25zIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVSUl9MSUJfSEtERiAqLwogICAgICJVc2VyIGRlZmluZWQgZnVuY3Rpb25zIiwgICAgICAgICAgICAgICAgICAgICAvKiBFUlJfTElCX1VTRVIgKi8KKyAgICAiSEtERiBmdW5jdGlvbnMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVJSX0xJQl9IS0RGICovCiB9OwogCiBjb25zdCBjaGFyICpFUlJfbGliX2Vycm9yX3N0cmluZyh1aW50MzJfdCBwYWNrZWRfZXJyb3IpIHsKQEAgLTUyNiw3ICs1MTksMzYgQEAKIH0KIAogY29uc3QgY2hhciAqRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nKHVpbnQzMl90IHBhY2tlZF9lcnJvcikgewotICByZXR1cm4gIk9QRU5TU0xfaW50ZXJuYWwiOworICBjb25zdCB1aW50MzJfdCBsaWIgPSBFUlJfR0VUX0xJQihwYWNrZWRfZXJyb3IpOworICBjb25zdCB1aW50MzJfdCBmdW5jID0gRVJSX0dFVF9GVU5DKHBhY2tlZF9lcnJvcik7CisKKyAgaWYgKGxpYiA9PSBFUlJfTElCX1NZUykgeworICAgIHN3aXRjaCAoZnVuYykgeworICAgICAgY2FzZSBTWVNfRl9mb3BlbjoKKyAgICAgICAgcmV0dXJuICJmb3BlbiI7CisgICAgICBjYXNlIFNZU19GX2ZjbG9zZToKKyAgICAgICAgcmV0dXJuICJmY2xvc2UiOworICAgICAgY2FzZSBTWVNfRl9mcmVhZDoKKyAgICAgICAgcmV0dXJuICJmcmVhZCI7CisgICAgICBjYXNlIFNZU19GX2Z3cml0ZToKKyAgICAgICAgcmV0dXJuICJmd3JpdGUiOworICAgICAgY2FzZSBTWVNfRl9zb2NrZXQ6CisgICAgICAgIHJldHVybiAic29ja2V0IjsKKyAgICAgIGNhc2UgU1lTX0Zfc2V0c29ja29wdDoKKyAgICAgICAgcmV0dXJuICJzZXRzb2Nrb3B0IjsKKyAgICAgIGNhc2UgU1lTX0ZfY29ubmVjdDoKKyAgICAgICAgcmV0dXJuICJjb25uZWN0IjsKKyAgICAgIGNhc2UgU1lTX0ZfZ2V0YWRkcmluZm86CisgICAgICAgIHJldHVybiAiZ2V0YWRkcmluZm8iOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGVycl9zdHJpbmdfbG9va3VwKEVSUl9HRVRfTElCKHBhY2tlZF9lcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfR0VUX0ZVTkMocGFja2VkX2Vycm9yKSwga09wZW5TU0xGdW5jdGlvblZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcGVuU1NMRnVuY3Rpb25WYWx1ZXNMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrT3BlblNTTEZ1bmN0aW9uU3RyaW5nRGF0YSk7CiB9CiAKIGNvbnN0IGNoYXIgKkVSUl9yZWFzb25fZXJyb3Jfc3RyaW5nKHVpbnQzMl90IHBhY2tlZF9lcnJvcikgewpAQCAtNTc3LDEzICs1OTksMTIgQEAKICAgY29uc3QgdW5zaWduZWQgbG9uZyB0aHJlYWRfaGFzaCA9ICh1aW50cHRyX3QpIGVycl9nZXRfc3RhdGUoKTsKIAogICBmb3IgKDs7KSB7Ci0gICAgY29uc3QgY2hhciAqZnVuY3Rpb24gPSBFUlJfcGVla19mdW5jdGlvbigpOwogICAgIHBhY2tlZF9lcnJvciA9IEVSUl9nZXRfZXJyb3JfbGluZV9kYXRhKCZmaWxlLCAmbGluZSwgJmRhdGEsICZmbGFncyk7CiAgICAgaWYgKHBhY2tlZF9lcnJvciA9PSAwKSB7CiAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBlcnJfZXJyb3Jfc3RyaW5nKHBhY2tlZF9lcnJvciwgZnVuY3Rpb24sIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgIEVSUl9lcnJvcl9zdHJpbmdfbihwYWNrZWRfZXJyb3IsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogICAgIEJJT19zbnByaW50ZihidWYyLCBzaXplb2YoYnVmMiksICIlbHU6JXM6JXM6JWQ6JXNcbiIsIHRocmVhZF9oYXNoLCBidWYsCiAgICAgICAgICAgICAgICAgIGZpbGUsIGxpbmUsIChmbGFncyAmIEVSUl9GTEFHX1NUUklORykgPyBkYXRhIDogIiIpOwogICAgIGlmIChjYWxsYmFjayhidWYyLCBzdHJsZW4oYnVmMiksIGN0eCkgPD0gMCkgewpAQCAtNjIzLDggKzY0NCw4IEBACiAgIGVycm9yLT5mbGFncyA9IGZsYWdzOwogfQogCi12b2lkIEVSUl9wdXRfZXJyb3IoaW50IGxpYnJhcnksIGludCByZWFzb24sIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGxpbmUpIHsKK3ZvaWQgRVJSX3B1dF9lcnJvcihpbnQgbGlicmFyeSwgaW50IGZ1bmMsIGludCByZWFzb24sIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGluZSkgewogICBFUlJfU1RBVEUgKmNvbnN0IHN0YXRlID0gZXJyX2dldF9zdGF0ZSgpOwogICBzdHJ1Y3QgZXJyX2Vycm9yX3N0ICplcnJvcjsKIApAQCAtNjMzLDcgKzY1NCw3IEBACiAgIH0KIAogICBpZiAobGlicmFyeSA9PSBFUlJfTElCX1NZUyAmJiByZWFzb24gPT0gMCkgewotI2lmIGRlZmluZWQoT1BFTlNTTF9XSU5ET1dTKQorI2lmIGRlZmluZWQoV0lOMzIpCiAgICAgcmVhc29uID0gR2V0TGFzdEVycm9yKCk7CiAjZWxzZQogICAgIHJlYXNvbiA9IGVycm5vOwpAQCAtNjQ3LDEwICs2NjgsOSBAQAogCiAgIGVycm9yID0gJnN0YXRlLT5lcnJvcnNbc3RhdGUtPnRvcF07CiAgIGVycl9jbGVhcihlcnJvcik7Ci0gIGVycm9yLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOwogICBlcnJvci0+ZmlsZSA9IGZpbGU7CiAgIGVycm9yLT5saW5lID0gbGluZTsKLSAgZXJyb3ItPnBhY2tlZCA9IEVSUl9QQUNLKGxpYnJhcnksIHJlYXNvbik7CisgIGVycm9yLT5wYWNrZWQgPSBFUlJfUEFDSyhsaWJyYXJ5LCBmdW5jLCByZWFzb24pOwogfQogCiAvKiBFUlJfYWRkX2Vycm9yX2RhdGFfdmRhdGEgdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgY29uc3QgY2hhciogcG9pbnRlcnMsCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9lcnJfZGF0YV9nZW5lcmF0ZS5nbyBiL3NyYy9jcnlwdG8vZXJyL2Vycl9kYXRhX2dlbmVyYXRlLmdvCmluZGV4IDI0ZTBkNjYuLmE1YjRjYjUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL2Vycl9kYXRhX2dlbmVyYXRlLmdvCisrKyBiL3NyYy9jcnlwdG8vZXJyL2Vycl9kYXRhX2dlbmVyYXRlLmdvCkBAIC01OSw4ICs1OSw4IEBACiAJIkhNQUMiLAogCSJESUdFU1QiLAogCSJDSVBIRVIiLAotCSJIS0RGIiwKIAkiVVNFUiIsCisJIkhLREYiLAogfQogCiAvLyBzdHJpbmdMaXN0IGlzIGEgbWFwIGZyb20gdWludDMyIC0+IHN0cmluZyB3aGljaCBjYW4gb3V0cHV0IGRhdGEgZm9yIGEgc29ydGVkCkBAIC02OSw3ICs2OSw3IEBACiAJLy8gZW50cmllcyBpcyBhbiBhcnJheSBvZiBrZXlzIGFuZCBvZmZzZXRzIGludG8gfHN0cmluZ0RhdGF8LiBUaGUKIAkvLyBvZmZzZXRzIGFyZSBpbiB0aGUgYm90dG9tIDE1IGJpdHMgb2YgZWFjaCB1aW50MzIgYW5kIHRoZSBrZXkgaXMgdGhlCiAJLy8gdG9wIDE3IGJpdHMuCi0JZW50cmllcyBbXXVpbnQzMgorCWVudHJpZXMgICAgICAgICBbXXVpbnQzMgogCS8vIGludGVybmVkU3RyaW5ncyBjb250YWlucyB0aGUgc2FtZSBzdHJpbmdzIGFzIGFyZSBpbiB8c3RyaW5nRGF0YXwsCiAJLy8gYnV0IGFsbG93cyBmb3IgZWFzeSBkZWR1cGxpY2F0aW9uLiBJdCBtYXBzIGEgc3RyaW5nIHRvIGl0cyBvZmZzZXQgaW4KIAkvLyB8c3RyaW5nRGF0YXwuCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAkJZm10LkZwcmludGYob3V0LCAiICAgIDB4JXgsXG4iLCB2KQogCX0KIAlvdXQuV3JpdGVTdHJpbmcoIn07XG5cbiIpCi0Jb3V0LldyaXRlU3RyaW5nKCJjb25zdCBzaXplX3QgIiArIHZhbHVlcyArICJMZW4gPSBzaXplb2YoIiArIHZhbHVlcyArICIpIC8gc2l6ZW9mKCIgKyB2YWx1ZXMgKyAiWzBdKTtcblxuIikKKwlvdXQuV3JpdGVTdHJpbmcoImNvbnN0IHNpemVfdCAiICsgdmFsdWVzICsgIkxlbiA9IHNpemVvZigiICsgdmFsdWVzICsgIikgLyBzaXplb2YoIiArIHZhbHVlcyArICJbMF0pO1xuXG4iKTsKIAogCXN0cmluZ0RhdGEgOj0gImtPcGVuU1NMIiArIG5hbWUgKyAiU3RyaW5nRGF0YSIKIAlvdXQuV3JpdGVTdHJpbmcoImNvbnN0IGNoYXIgIiArIHN0cmluZ0RhdGEgKyAiW10gPVxuICAgIFwiIikKQEAgLTE2MSw4ICsxNjEsOCBAQAogfQogCiB0eXBlIGVycm9yRGF0YSBzdHJ1Y3QgewotCXJlYXNvbnMgICAgKnN0cmluZ0xpc3QKLQlsaWJyYXJ5TWFwIG1hcFtzdHJpbmdddWludDMyCisJZnVuY3Rpb25zLCByZWFzb25zICpzdHJpbmdMaXN0CisJbGlicmFyeU1hcCAgICAgICAgIG1hcFtzdHJpbmdddWludDMyCiB9CiAKIGZ1bmMgKGUgKmVycm9yRGF0YSkgcmVhZEVycm9yRGF0YUZpbGUoZmlsZW5hbWUgc3RyaW5nKSBlcnJvciB7CkBAIC0xODQsOCArMTg0LDggQEAKIAkJCWNvbnRpbnVlCiAJCX0KIAkJcGFydHMgOj0gYnl0ZXMuU3BsaXQobGluZSwgY29tbWEpCi0JCWlmIGxlbihwYXJ0cykgIT0gMyB7Ci0JCQlyZXR1cm4gZm10LkVycm9yZigiYmFkIGxpbmUgJWQgaW4gJXM6IGZvdW5kICVkIHZhbHVlcyBidXQgd2FudCAzIiwgbGluZU5vLCBmaWxlbmFtZSwgbGVuKHBhcnRzKSkKKwkJaWYgbGVuKHBhcnRzKSAhPSA0IHsKKwkJCXJldHVybiBmbXQuRXJyb3JmKCJiYWQgbGluZSAlZCBpbiAlczogZm91bmQgJWQgdmFsdWVzIGJ1dCB3YW50IDQiLCBsaW5lTm8sIGZpbGVuYW1lLCBsZW4ocGFydHMpKQogCQl9CiAJCWxpYk51bSwgb2sgOj0gZS5saWJyYXJ5TWFwW3N0cmluZyhwYXJ0c1swXSldCiAJCWlmICFvayB7CkBAIC0xOTQsMTggKzE5NCwyNiBAQAogCQlpZiBsaWJOdW0gPj0gNjQgewogCQkJcmV0dXJuIGZtdC5FcnJvcmYoImJhZCBsaW5lICVkIGluICVzOiBsaWJyYXJ5IHZhbHVlIHRvbyBsYXJnZSIsIGxpbmVObywgZmlsZW5hbWUpCiAJCX0KLQkJa2V5LCBlcnIgOj0gc3RyY29udi5QYXJzZVVpbnQoc3RyaW5nKHBhcnRzWzFdKSwgMTAgLyogYmFzZSAqLywgMzIgLyogYml0IHNpemUgKi8pCisJCWtleSwgZXJyIDo9IHN0cmNvbnYuUGFyc2VVaW50KHN0cmluZyhwYXJ0c1syXSksIDEwIC8qIGJhc2UgKi8sIDMyIC8qIGJpdCBzaXplICovKQogCQlpZiBlcnIgIT0gbmlsIHsKIAkJCXJldHVybiBmbXQuRXJyb3JmKCJiYWQgbGluZSAlZCBpbiAlczogJXMiLCBsaW5lTm8sIGZpbGVuYW1lLCBlcnIpCiAJCX0KIAkJaWYga2V5ID49IDIwNDggewogCQkJcmV0dXJuIGZtdC5FcnJvcmYoImJhZCBsaW5lICVkIGluICVzOiBrZXkgdG9vIGxhcmdlIiwgbGluZU5vLCBmaWxlbmFtZSkKIAkJfQotCQl2YWx1ZSA6PSBzdHJpbmcocGFydHNbMl0pCisJCXZhbHVlIDo9IHN0cmluZyhwYXJ0c1szXSkKIAogCQlsaXN0S2V5IDo9IGxpYk51bTw8MjYgfCB1aW50MzIoa2V5KTw8MTUKIAotCQllcnIgPSBlLnJlYXNvbnMuQWRkKGxpc3RLZXksIHZhbHVlKQorCQlzd2l0Y2ggc3RyaW5nKHBhcnRzWzFdKSB7CisJCWNhc2UgImZ1bmN0aW9uIjoKKwkJCWVyciA9IGUuZnVuY3Rpb25zLkFkZChsaXN0S2V5LCB2YWx1ZSkKKwkJY2FzZSAicmVhc29uIjoKKwkJCWVyciA9IGUucmVhc29ucy5BZGQobGlzdEtleSwgdmFsdWUpCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gZm10LkVycm9yZigiYmFkIGxpbmUgJWQgaW4gJXM6IGJhZCB2YWx1ZSB0eXBlIiwgbGluZU5vLCBmaWxlbmFtZSkKKwkJfQorCiAJCWlmIGVyciAhPSBuaWwgewogCQkJcmV0dXJuIGVycgogCQl9CkBAIC0yMTYsNiArMjI0LDcgQEAKIAogZnVuYyBtYWluKCkgewogCWUgOj0gJmVycm9yRGF0YXsKKwkJZnVuY3Rpb25zOiAgbmV3U3RyaW5nTGlzdCgpLAogCQlyZWFzb25zOiAgICBuZXdTdHJpbmdMaXN0KCksCiAJCWxpYnJhcnlNYXA6IG1ha2UobWFwW3N0cmluZ111aW50MzIpLAogCX0KQEAgLTI3MCw4ICsyNzksOSBAQAogCWZvciBpLCBuYW1lIDo9IHJhbmdlIGxpYnJhcnlOYW1lcyB7CiAJCWZtdC5GcHJpbnRmKG91dCwgIk9QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl8lcyA9PSAlZCwgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8lZCk7XG4iLCBuYW1lLCBpKzEsIGkrMSkKIAl9Ci0JZm10LkZwcmludGYob3V0LCAiT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTlVNX0xJQlMgPT0gJWQsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfbnVtKTtcbiIsIGxlbihsaWJyYXJ5TmFtZXMpKzEpCisJZm10LkZwcmludGYob3V0LCAiT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTlVNX0xJQlMgPT0gJWQsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfbnVtKTtcbiIsIGxlbihsaWJyYXJ5TmFtZXMpICsgMSkKIAlvdXQuV3JpdGVTdHJpbmcoIlxuIikKIAorCWUuZnVuY3Rpb25zLldyaXRlVG8ob3V0LCAiRnVuY3Rpb24iKQogCWUucmVhc29ucy5Xcml0ZVRvKG91dCwgIlJlYXNvbiIpCiB9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9lcnJfdGVzdC5jYyBiL3NyYy9jcnlwdG8vZXJyL2Vycl90ZXN0LmNjCmluZGV4IDY2NDNjNjguLjk4ZGZiODUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL2Vycl90ZXN0LmNjCisrKyBiL3NyYy9jcnlwdG8vZXJyL2Vycl90ZXN0LmNjCkBAIC0yMiw3ICsyMiw3IEBACiAKIHN0YXRpYyBib29sIFRlc3RPdmVyZmxvdygpIHsKICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEVSUl9OVU1fRVJST1JTKjI7IGkrKykgewotICAgIEVSUl9wdXRfZXJyb3IoMSwgaSsxLCAiZnVuY3Rpb24iLCAidGVzdCIsIDEpOworICAgIEVSUl9wdXRfZXJyb3IoMSwgMiwgaSsxLCAidGVzdCIsIDEpOwogICB9CiAKICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEVSUl9OVU1fRVJST1JTIC0gMTsgaSsrKSB7CkBAIC01MCw3ICs1MCw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgRVJSX3B1dF9lcnJvcigxLCAyLCAiZnVuY3Rpb24iLCAidGVzdCIsIDQpOworICBFUlJfcHV0X2Vycm9yKDEsIDIsIDMsICJ0ZXN0IiwgNCk7CiAgIEVSUl9hZGRfZXJyb3JfZGF0YSgxLCAidGVzdGluZyIpOwogCiAgIGludCBwZWVrZWRfbGluZSwgbGluZSwgcGVla2VkX2ZsYWdzLCBmbGFnczsKQEAgLTU4LDcgKzU4LDYgQEAKICAgdWludDMyX3QgcGVla2VkX3BhY2tlZF9lcnJvciA9CiAgICAgICBFUlJfcGVla19lcnJvcl9saW5lX2RhdGEoJnBlZWtlZF9maWxlLCAmcGVla2VkX2xpbmUsICZwZWVrZWRfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVla2VkX2ZsYWdzKTsKLSAgY29uc3QgY2hhciAqZnVuY3Rpb24gPSBFUlJfcGVla19mdW5jdGlvbigpOwogICB1aW50MzJfdCBwYWNrZWRfZXJyb3IgPSBFUlJfZ2V0X2Vycm9yX2xpbmVfZGF0YSgmZmlsZSwgJmxpbmUsICZkYXRhLCAmZmxhZ3MpOwogCiAgIGlmIChwZWVrZWRfcGFja2VkX2Vycm9yICE9IHBhY2tlZF9lcnJvciB8fApAQCAtNjksMTIgKzY4LDEyIEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgaWYgKHN0cmNtcChmdW5jdGlvbiwgImZ1bmN0aW9uIikgIT0gMCB8fAotICAgICAgc3RyY21wKGZpbGUsICJ0ZXN0IikgIT0gMCB8fAorICBpZiAoc3RyY21wKGZpbGUsICJ0ZXN0IikgIT0gMCB8fAogICAgICAgbGluZSAhPSA0IHx8CiAgICAgICAoZmxhZ3MgJiBFUlJfRkxBR19TVFJJTkcpID09IDAgfHwKICAgICAgIEVSUl9HRVRfTElCKHBhY2tlZF9lcnJvcikgIT0gMSB8fAotICAgICAgRVJSX0dFVF9SRUFTT04ocGFja2VkX2Vycm9yKSAhPSAyIHx8CisgICAgICBFUlJfR0VUX0ZVTkMocGFja2VkX2Vycm9yKSAhPSAyIHx8CisgICAgICBFUlJfR0VUX1JFQVNPTihwYWNrZWRfZXJyb3IpICE9IDMgfHwKICAgICAgIHN0cmNtcChkYXRhLCAidGVzdGluZyIpICE9IDApIHsKICAgICBmcHJpbnRmKHN0ZGVyciwgIkJhZCBlcnJvciBkYXRhIHJldHVybmVkLlxuIik7CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtODksNyArODgsNyBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIEVSUl9wdXRfZXJyb3IoMSwgMiwgImZ1bmN0aW9uIiwgInRlc3QiLCA0KTsKKyAgRVJSX3B1dF9lcnJvcigxLCAyLCAzLCAidGVzdCIsIDQpOwogICBFUlJfY2xlYXJfZXJyb3IoKTsKIAogICBpZiAoRVJSX2dldF9lcnJvcigpICE9IDApIHsKQEAgLTEwMSw3ICsxMDAsNyBAQAogfQogCiBzdGF0aWMgYm9vbCBUZXN0UHJpbnQoKSB7Ci0gIEVSUl9wdXRfZXJyb3IoMSwgMiwgImZ1bmN0aW9uIiwgInRlc3QiLCA0KTsKKyAgRVJSX3B1dF9lcnJvcigxLCAyLCAzLCAidGVzdCIsIDQpOwogICBFUlJfYWRkX2Vycm9yX2RhdGEoMSwgInRlc3RpbmciKTsKICAgdWludDMyX3QgcGFja2VkX2Vycm9yID0gRVJSX2dldF9lcnJvcigpOwogCkBAIC0xMTQsNDEgKzExMywxMSBAQAogfQogCiBzdGF0aWMgYm9vbCBUZXN0UmVsZWFzZSgpIHsKLSAgRVJSX3B1dF9lcnJvcigxLCAyLCAiZnVuY3Rpb24iLCAidGVzdCIsIDQpOworICBFUlJfcHV0X2Vycm9yKDEsIDIsIDMsICJ0ZXN0IiwgNCk7CiAgIEVSUl9yZW1vdmVfdGhyZWFkX3N0YXRlKE5VTEwpOwogICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGJvb2wgSGFzU3VmZml4KGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqc3VmZml4KSB7Ci0gIHNpemVfdCBzdWZmaXhfbGVuID0gc3RybGVuKHN1ZmZpeCk7Ci0gIHNpemVfdCBzdHJfbGVuID0gc3RybGVuKHN0cik7Ci0gIGlmIChzdHJfbGVuIDwgc3VmZml4X2xlbikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gc3RyY21wKHN0ciArIHN0cl9sZW4gLSBzdWZmaXhfbGVuLCBzdWZmaXgpID09IDA7Ci19Ci0KLXN0YXRpYyBib29sIFRlc3RQdXRNYWNybygpIHsKLSAgaW50IGV4cGVjdGVkX2xpbmUgPSBfX0xJTkVfXyArIDE7Ci0gIE9QRU5TU0xfUFVUX0VSUk9SKFVTRVIsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKLQotICBpbnQgbGluZTsKLSAgY29uc3QgY2hhciAqZmlsZTsKLSAgY29uc3QgY2hhciAqZnVuY3Rpb24gPSBFUlJfcGVla19mdW5jdGlvbigpOwotICB1aW50MzJfdCBlcnJvciA9IEVSUl9nZXRfZXJyb3JfbGluZSgmZmlsZSwgJmxpbmUpOwotCi0gIGlmIChzdHJjbXAoZnVuY3Rpb24sICJUZXN0UHV0TWFjcm8iKSAhPSAwIHx8Ci0gICAgICAhSGFzU3VmZml4KGZpbGUsICJlcnJfdGVzdC5jYyIpIHx8Ci0gICAgICBsaW5lICE9IGV4cGVjdGVkX2xpbmUgfHwKLSAgICAgIEVSUl9HRVRfTElCKGVycm9yKSAhPSBFUlJfTElCX1VTRVIgfHwKLSAgICAgIEVSUl9HRVRfUkVBU09OKGVycm9yKSAhPSBFUlJfUl9JTlRFUk5BTF9FUlJPUikgewotICAgIGZwcmludGYoc3RkZXJyLCAiQmFkIGVycm9yIGRhdGEgcmV0dXJuZWQuXG4iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQogaW50IG1haW4oKSB7CiAgIENSWVBUT19saWJyYXJ5X2luaXQoKTsKIApAQCAtMTU2LDggKzEyNSw3IEBACiAgICAgICAhVGVzdFB1dEVycm9yKCkgfHwKICAgICAgICFUZXN0Q2xlYXJFcnJvcigpIHx8CiAgICAgICAhVGVzdFByaW50KCkgfHwKLSAgICAgICFUZXN0UmVsZWFzZSgpIHx8Ci0gICAgICAhVGVzdFB1dE1hY3JvKCkpIHsKKyAgICAgICFUZXN0UmVsZWFzZSgpKSB7CiAgICAgcmV0dXJuIDE7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lcnIvZXZwLmVycm9yZGF0YSBiL3NyYy9jcnlwdG8vZXJyL2V2cC5lcnJvcmRhdGEKaW5kZXggOGY4ZGQ0OC4uMTRkZDI3YiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lcnIvZXZwLmVycm9yZGF0YQorKysgYi9zcmMvY3J5cHRvL2Vyci9ldnAuZXJyb3JkYXRhCkBAIC0xLDQ2ICsxLDExNCBAQAotRVZQLDE1MSxCTl9ERUNPREVfRVJST1IKLUVWUCwxMDAsQlVGRkVSX1RPT19TTUFMTAotRVZQLDEwMSxDT01NQU5EX05PVF9TVVBQT1JURUQKLUVWUCwxNDYsQ09OVEVYVF9OT1RfSU5JVElBTElTRUQKLUVWUCwxNDMsREVDT0RFX0VSUk9SCi1FVlAsMTA0LERJRkZFUkVOVF9LRVlfVFlQRVMKLUVWUCwxMDUsRElGRkVSRU5UX1BBUkFNRVRFUlMKLUVWUCwxNDcsRElHRVNUX0FORF9LRVlfVFlQRV9OT1RfU1VQUE9SVEVECi1FVlAsMTA3LEVYUEVDVElOR19BTl9FQ19LRVlfS0VZCi1FVlAsMTQxLEVYUEVDVElOR19BTl9SU0FfS0VZCi1FVlAsMTA5LEVYUEVDVElOR19BX0RIX0tFWQotRVZQLDExMCxFWFBFQ1RJTkdfQV9EU0FfS0VZCi1FVlAsMTExLElMTEVHQUxfT1JfVU5TVVBQT1JURURfUEFERElOR19NT0RFCi1FVlAsMTEyLElOVkFMSURfQ1VSVkUKLUVWUCwxMTMsSU5WQUxJRF9ESUdFU1RfTEVOR1RICi1FVlAsMTE0LElOVkFMSURfRElHRVNUX1RZUEUKLUVWUCwxMTUsSU5WQUxJRF9LRVlCSVRTCi1FVlAsMTE2LElOVkFMSURfTUdGMV9NRAotRVZQLDE0MixJTlZBTElEX09QRVJBVElPTgotRVZQLDExOCxJTlZBTElEX1BBRERJTkdfTU9ERQotRVZQLDExOSxJTlZBTElEX1BTU19QQVJBTUVURVJTCi1FVlAsMTQ0LElOVkFMSURfUFNTX1NBTFRMRU4KLUVWUCwxMjEsSU5WQUxJRF9TQUxUX0xFTkdUSAotRVZQLDEyMixJTlZBTElEX1RSQUlMRVIKLUVWUCwxMjMsS0VZU19OT1RfU0VUCi1FVlAsMTI0LE1JU1NJTkdfUEFSQU1FVEVSUwotRVZQLDEyNSxOT19ERUZBVUxUX0RJR0VTVAotRVZQLDEyNixOT19LRVlfU0VUCi1FVlAsMTI3LE5PX01EQzJfU1VQUE9SVAotRVZQLDEyOCxOT19OSURfRk9SX0NVUlZFCi1FVlAsMTI5LE5PX09QRVJBVElPTl9TRVQKLUVWUCwxMzAsTk9fUEFSQU1FVEVSU19TRVQKLUVWUCwxMzEsT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRQotRVZQLDEzMixPUEVSQVRPTl9OT1RfSU5JVElBTElaRUQKLUVWUCwxNTIsUEFSQU1FVEVSX0VOQ09ESU5HX0VSUk9SCi1FVlAsMTMzLFVOS05PV05fRElHRVNUCi1FVlAsMTM0LFVOS05PV05fTUFTS19ESUdFU1QKLUVWUCwxNTAsVU5LTk9XTl9NRVNTQUdFX0RJR0VTVF9BTEdPUklUSE0KLUVWUCwxNDUsVU5LTk9XTl9QVUJMSUNfS0VZX1RZUEUKLUVWUCwxNDksVU5LTk9XTl9TSUdOQVRVUkVfQUxHT1JJVEhNCi1FVlAsMTM4LFVOU1VQUE9SVEVEX0FMR09SSVRITQotRVZQLDEzOSxVTlNVUFBPUlRFRF9NQVNLX0FMR09SSVRITQotRVZQLDE0MCxVTlNVUFBPUlRFRF9NQVNLX1BBUkFNRVRFUgotRVZQLDE1MyxVTlNVUFBPUlRFRF9QVUJMSUNfS0VZX1RZUEUKLUVWUCwxNTQsVU5TVVBQT1JURURfU0lHTkFUVVJFX1RZUEUKLUVWUCwxNDgsV1JPTkdfUFVCTElDX0tFWV9UWVBFCitFVlAsZnVuY3Rpb24sMTYwLEVWUF9EaWdlc3RTaWduQWxnb3JpdGhtCitFVlAsZnVuY3Rpb24sMTYxLEVWUF9EaWdlc3RWZXJpZnlJbml0RnJvbUFsZ29yaXRobQorRVZQLGZ1bmN0aW9uLDE2MixFVlBfUEtFWV9DVFhfY3RybAorRVZQLGZ1bmN0aW9uLDE2MyxFVlBfUEtFWV9DVFhfZHVwCitFVlAsZnVuY3Rpb24sMTU5LEVWUF9QS0VZX0NUWF9nZXQwX3JzYV9vYWVwX2xhYmVsCitFVlAsZnVuY3Rpb24sMTY0LEVWUF9QS0VZX2NvcHlfcGFyYW1ldGVycworRVZQLGZ1bmN0aW9uLDE2NSxFVlBfUEtFWV9kZWNyeXB0CitFVlAsZnVuY3Rpb24sMTY2LEVWUF9QS0VZX2RlY3J5cHRfaW5pdAorRVZQLGZ1bmN0aW9uLDE2NyxFVlBfUEtFWV9kZXJpdmUKK0VWUCxmdW5jdGlvbiwxMDgsRVZQX1BLRVlfZGVyaXZlX2luaXQKK0VWUCxmdW5jdGlvbiwxNjgsRVZQX1BLRVlfZGVyaXZlX3NldF9wZWVyCitFVlAsZnVuY3Rpb24sMTEwLEVWUF9QS0VZX2VuY3J5cHQKK0VWUCxmdW5jdGlvbiwxMTEsRVZQX1BLRVlfZW5jcnlwdF9pbml0CitFVlAsZnVuY3Rpb24sMTEyLEVWUF9QS0VZX2dldDFfREgKK0VWUCxmdW5jdGlvbiwxNjksRVZQX1BLRVlfZ2V0MV9EU0EKK0VWUCxmdW5jdGlvbiwxMTQsRVZQX1BLRVlfZ2V0MV9FQ19LRVkKK0VWUCxmdW5jdGlvbiwxMTUsRVZQX1BLRVlfZ2V0MV9SU0EKK0VWUCxmdW5jdGlvbiwxMTYsRVZQX1BLRVlfa2V5Z2VuCitFVlAsZnVuY3Rpb24sMTcwLEVWUF9QS0VZX2tleWdlbl9pbml0CitFVlAsZnVuY3Rpb24sMTcxLEVWUF9QS0VZX25ldworRVZQLGZ1bmN0aW9uLDE3MixFVlBfUEtFWV9zZXRfdHlwZQorRVZQLGZ1bmN0aW9uLDEyMCxFVlBfUEtFWV9zaWduCitFVlAsZnVuY3Rpb24sMTIxLEVWUF9QS0VZX3NpZ25faW5pdAorRVZQLGZ1bmN0aW9uLDEyMixFVlBfUEtFWV92ZXJpZnkKK0VWUCxmdW5jdGlvbiwxMjMsRVZQX1BLRVlfdmVyaWZ5X2luaXQKK0VWUCxmdW5jdGlvbiwxNzMsY2hlY2tfcGFkZGluZ19tZAorRVZQLGZ1bmN0aW9uLDEyNSxkMmlfQXV0b1ByaXZhdGVLZXkKK0VWUCxmdW5jdGlvbiwxMjYsZDJpX1ByaXZhdGVLZXkKK0VWUCxmdW5jdGlvbiwxMjcsZG9fRUNfS0VZX3ByaW50CitFVlAsZnVuY3Rpb24sMTc0LGRvX2RzYV9wcmludAorRVZQLGZ1bmN0aW9uLDE3NSxkb19yc2FfcHJpbnQKK0VWUCxmdW5jdGlvbiwxMjksZG9fc2lndmVyX2luaXQKK0VWUCxmdW5jdGlvbiwxNzYsZHNhX3BhcmFtX2RlY29kZQorRVZQLGZ1bmN0aW9uLDE3Nyxkc2FfcHJpdl9kZWNvZGUKK0VWUCxmdW5jdGlvbiwxNzgsZHNhX3ByaXZfZW5jb2RlCitFVlAsZnVuY3Rpb24sMTc5LGRzYV9wdWJfZGVjb2RlCitFVlAsZnVuY3Rpb24sMTgwLGRzYV9wdWJfZW5jb2RlCitFVlAsZnVuY3Rpb24sMTgxLGRzYV9zaWdfcHJpbnQKK0VWUCxmdW5jdGlvbiwxMzAsZWNrZXlfcGFyYW0ydHlwZQorRVZQLGZ1bmN0aW9uLDEzMSxlY2tleV9wYXJhbV9kZWNvZGUKK0VWUCxmdW5jdGlvbiwxMzIsZWNrZXlfcHJpdl9kZWNvZGUKK0VWUCxmdW5jdGlvbiwxMzMsZWNrZXlfcHJpdl9lbmNvZGUKK0VWUCxmdW5jdGlvbiwxMzQsZWNrZXlfcHViX2RlY29kZQorRVZQLGZ1bmN0aW9uLDEzNSxlY2tleV9wdWJfZW5jb2RlCitFVlAsZnVuY3Rpb24sMTM2LGVja2V5X3R5cGUycGFyYW0KK0VWUCxmdW5jdGlvbiwxMzcsZXZwX3BrZXlfY3R4X25ldworRVZQLGZ1bmN0aW9uLDEzOCxobWFjX3NpZ25jdHgKK0VWUCxmdW5jdGlvbiwxMzksaTJkX1B1YmxpY0tleQorRVZQLGZ1bmN0aW9uLDE4MixvbGRfZHNhX3ByaXZfZGVjb2RlCitFVlAsZnVuY3Rpb24sMTQwLG9sZF9lY19wcml2X2RlY29kZQorRVZQLGZ1bmN0aW9uLDE0MSxvbGRfcnNhX3ByaXZfZGVjb2RlCitFVlAsZnVuY3Rpb24sMTQyLHBrZXlfZWNfY3RybAorRVZQLGZ1bmN0aW9uLDE0Myxwa2V5X2VjX2Rlcml2ZQorRVZQLGZ1bmN0aW9uLDE0NCxwa2V5X2VjX2tleWdlbgorRVZQLGZ1bmN0aW9uLDE0NSxwa2V5X2VjX3BhcmFtZ2VuCitFVlAsZnVuY3Rpb24sMTQ2LHBrZXlfZWNfc2lnbgorRVZQLGZ1bmN0aW9uLDE1OCxwa2V5X2htYWNfY3RybAorRVZQLGZ1bmN0aW9uLDE0Nyxwa2V5X3JzYV9jdHJsCitFVlAsZnVuY3Rpb24sMTQ4LHBrZXlfcnNhX2RlY3J5cHQKK0VWUCxmdW5jdGlvbiwxNDkscGtleV9yc2FfZW5jcnlwdAorRVZQLGZ1bmN0aW9uLDE1MCxwa2V5X3JzYV9zaWduCitFVlAsZnVuY3Rpb24sMTUxLHJzYV9hbGdvcl90b19tZAorRVZQLGZ1bmN0aW9uLDE1Mixyc2FfZGlnZXN0X3ZlcmlmeV9pbml0X2Zyb21fYWxnb3JpdGhtCitFVlAsZnVuY3Rpb24sMTUzLHJzYV9tZ2YxX3RvX21kCitFVlAsZnVuY3Rpb24sMTU0LHJzYV9wcml2X2RlY29kZQorRVZQLGZ1bmN0aW9uLDE1NSxyc2FfcHJpdl9lbmNvZGUKK0VWUCxmdW5jdGlvbiwxNTYscnNhX3Bzc190b19jdHgKK0VWUCxmdW5jdGlvbiwxNTcscnNhX3B1Yl9kZWNvZGUKK0VWUCxyZWFzb24sMTUxLEJOX0RFQ09ERV9FUlJPUgorRVZQLHJlYXNvbiwxMDAsQlVGRkVSX1RPT19TTUFMTAorRVZQLHJlYXNvbiwxMDEsQ09NTUFORF9OT1RfU1VQUE9SVEVECitFVlAscmVhc29uLDE0NixDT05URVhUX05PVF9JTklUSUFMSVNFRAorRVZQLHJlYXNvbiwxNDMsREVDT0RFX0VSUk9SCitFVlAscmVhc29uLDEwNCxESUZGRVJFTlRfS0VZX1RZUEVTCitFVlAscmVhc29uLDEwNSxESUZGRVJFTlRfUEFSQU1FVEVSUworRVZQLHJlYXNvbiwxNDcsRElHRVNUX0FORF9LRVlfVFlQRV9OT1RfU1VQUE9SVEVECitFVlAscmVhc29uLDEwNyxFWFBFQ1RJTkdfQU5fRUNfS0VZX0tFWQorRVZQLHJlYXNvbiwxNDEsRVhQRUNUSU5HX0FOX1JTQV9LRVkKK0VWUCxyZWFzb24sMTA5LEVYUEVDVElOR19BX0RIX0tFWQorRVZQLHJlYXNvbiwxMTAsRVhQRUNUSU5HX0FfRFNBX0tFWQorRVZQLHJlYXNvbiwxMTEsSUxMRUdBTF9PUl9VTlNVUFBPUlRFRF9QQURESU5HX01PREUKK0VWUCxyZWFzb24sMTEyLElOVkFMSURfQ1VSVkUKK0VWUCxyZWFzb24sMTEzLElOVkFMSURfRElHRVNUX0xFTkdUSAorRVZQLHJlYXNvbiwxMTQsSU5WQUxJRF9ESUdFU1RfVFlQRQorRVZQLHJlYXNvbiwxMTUsSU5WQUxJRF9LRVlCSVRTCitFVlAscmVhc29uLDExNixJTlZBTElEX01HRjFfTUQKK0VWUCxyZWFzb24sMTQyLElOVkFMSURfT1BFUkFUSU9OCitFVlAscmVhc29uLDExOCxJTlZBTElEX1BBRERJTkdfTU9ERQorRVZQLHJlYXNvbiwxMTksSU5WQUxJRF9QU1NfUEFSQU1FVEVSUworRVZQLHJlYXNvbiwxNDQsSU5WQUxJRF9QU1NfU0FMVExFTgorRVZQLHJlYXNvbiwxMjEsSU5WQUxJRF9TQUxUX0xFTkdUSAorRVZQLHJlYXNvbiwxMjIsSU5WQUxJRF9UUkFJTEVSCitFVlAscmVhc29uLDEyMyxLRVlTX05PVF9TRVQKK0VWUCxyZWFzb24sMTI0LE1JU1NJTkdfUEFSQU1FVEVSUworRVZQLHJlYXNvbiwxMjUsTk9fREVGQVVMVF9ESUdFU1QKK0VWUCxyZWFzb24sMTI2LE5PX0tFWV9TRVQKK0VWUCxyZWFzb24sMTI3LE5PX01EQzJfU1VQUE9SVAorRVZQLHJlYXNvbiwxMjgsTk9fTklEX0ZPUl9DVVJWRQorRVZQLHJlYXNvbiwxMjksTk9fT1BFUkFUSU9OX1NFVAorRVZQLHJlYXNvbiwxMzAsTk9fUEFSQU1FVEVSU19TRVQKK0VWUCxyZWFzb24sMTMxLE9QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUKK0VWUCxyZWFzb24sMTMyLE9QRVJBVE9OX05PVF9JTklUSUFMSVpFRAorRVZQLHJlYXNvbiwxNTIsUEFSQU1FVEVSX0VOQ09ESU5HX0VSUk9SCitFVlAscmVhc29uLDEzMyxVTktOT1dOX0RJR0VTVAorRVZQLHJlYXNvbiwxMzQsVU5LTk9XTl9NQVNLX0RJR0VTVAorRVZQLHJlYXNvbiwxNTAsVU5LTk9XTl9NRVNTQUdFX0RJR0VTVF9BTEdPUklUSE0KK0VWUCxyZWFzb24sMTQ1LFVOS05PV05fUFVCTElDX0tFWV9UWVBFCitFVlAscmVhc29uLDE0OSxVTktOT1dOX1NJR05BVFVSRV9BTEdPUklUSE0KK0VWUCxyZWFzb24sMTM4LFVOU1VQUE9SVEVEX0FMR09SSVRITQorRVZQLHJlYXNvbiwxMzksVU5TVVBQT1JURURfTUFTS19BTEdPUklUSE0KK0VWUCxyZWFzb24sMTQwLFVOU1VQUE9SVEVEX01BU0tfUEFSQU1FVEVSCitFVlAscmVhc29uLDE1MyxVTlNVUFBPUlRFRF9QVUJMSUNfS0VZX1RZUEUKK0VWUCxyZWFzb24sMTU0LFVOU1VQUE9SVEVEX1NJR05BVFVSRV9UWVBFCitFVlAscmVhc29uLDE0OCxXUk9OR19QVUJMSUNfS0VZX1RZUEUKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXJyL2hrZGYuZXJyb3JkYXRhIGIvc3JjL2NyeXB0by9lcnIvaGtkZi5lcnJvcmRhdGEKaW5kZXggODQ4NjZkZS4uODc4YTgwMiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lcnIvaGtkZi5lcnJvcmRhdGEKKysrIGIvc3JjL2NyeXB0by9lcnIvaGtkZi5lcnJvcmRhdGEKQEAgLTEgKzEsMiBAQAotSEtERiwxMDAsT1VUUFVUX1RPT19MQVJHRQorSEtERixmdW5jdGlvbiwxMDAsSEtERgorSEtERixyZWFzb24sMTAwLE9VVFBVVF9UT09fTEFSR0UKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXJyL29iai5lcnJvcmRhdGEgYi9zcmMvY3J5cHRvL2Vyci9vYmouZXJyb3JkYXRhCmluZGV4IGM1NDQzNWUuLjc0ZTQ2MjkgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL29iai5lcnJvcmRhdGEKKysrIGIvc3JjL2NyeXB0by9lcnIvb2JqLmVycm9yZGF0YQpAQCAtMSArMSw1IEBACi1PQkosMTAwLFVOS05PV05fTklECitPQkosZnVuY3Rpb24sMTAwLE9CSl9jcmVhdGUKK09CSixmdW5jdGlvbiwxMDEsT0JKX2R1cAorT0JKLGZ1bmN0aW9uLDEwMixPQkpfbmlkMm9iagorT0JKLGZ1bmN0aW9uLDEwMyxPQkpfdHh0Mm9iagorT0JKLHJlYXNvbiwxMDAsVU5LTk9XTl9OSUQKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXJyL3BlbS5lcnJvcmRhdGEgYi9zcmMvY3J5cHRvL2Vyci9wZW0uZXJyb3JkYXRhCmluZGV4IDJhNGI3M2EuLjQyMjE2YTcgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL3BlbS5lcnJvcmRhdGEKKysrIGIvc3JjL2NyeXB0by9lcnIvcGVtLmVycm9yZGF0YQpAQCAtMSwxNSArMSwzOSBAQAotUEVNLDEwMCxCQURfQkFTRTY0X0RFQ09ERQotUEVNLDEwMSxCQURfREVDUllQVAotUEVNLDEwMixCQURfRU5EX0xJTkUKLVBFTSwxMDMsQkFEX0lWX0NIQVJTCi1QRU0sMTA0LEJBRF9QQVNTV09SRF9SRUFECi1QRU0sMTA1LENJUEhFUl9JU19OVUxMCi1QRU0sMTA2LEVSUk9SX0NPTlZFUlRJTkdfUFJJVkFURV9LRVkKLVBFTSwxMDcsTk9UX0RFS19JTkZPCi1QRU0sMTA4LE5PVF9FTkNSWVBURUQKLVBFTSwxMDksTk9UX1BST0NfVFlQRQotUEVNLDExMCxOT19TVEFSVF9MSU5FCi1QRU0sMTExLFJFQURfS0VZCi1QRU0sMTEyLFNIT1JUX0hFQURFUgotUEVNLDExMyxVTlNVUFBPUlRFRF9DSVBIRVIKLVBFTSwxMTQsVU5TVVBQT1JURURfRU5DUllQVElPTgorUEVNLGZ1bmN0aW9uLDEwMCxQRU1fQVNOMV9yZWFkCitQRU0sZnVuY3Rpb24sMTAxLFBFTV9BU04xX3JlYWRfYmlvCitQRU0sZnVuY3Rpb24sMTAyLFBFTV9BU04xX3dyaXRlCitQRU0sZnVuY3Rpb24sMTAzLFBFTV9BU04xX3dyaXRlX2JpbworUEVNLGZ1bmN0aW9uLDEwNCxQRU1fWDUwOV9JTkZPX3JlYWQKK1BFTSxmdW5jdGlvbiwxMDUsUEVNX1g1MDlfSU5GT19yZWFkX2JpbworUEVNLGZ1bmN0aW9uLDEwNixQRU1fWDUwOV9JTkZPX3dyaXRlX2JpbworUEVNLGZ1bmN0aW9uLDEwNyxQRU1fZG9faGVhZGVyCitQRU0sZnVuY3Rpb24sMTA4LFBFTV9nZXRfRVZQX0NJUEhFUl9JTkZPCitQRU0sZnVuY3Rpb24sMTA5LFBFTV9yZWFkCitQRU0sZnVuY3Rpb24sMTEwLFBFTV9yZWFkX0RIcGFyYW1zCitQRU0sZnVuY3Rpb24sMTExLFBFTV9yZWFkX1ByaXZhdGVLZXkKK1BFTSxmdW5jdGlvbiwxMTIsUEVNX3JlYWRfYmlvCitQRU0sZnVuY3Rpb24sMTEzLFBFTV9yZWFkX2Jpb19ESHBhcmFtcworUEVNLGZ1bmN0aW9uLDExNCxQRU1fcmVhZF9iaW9fUGFyYW1ldGVycworUEVNLGZ1bmN0aW9uLDExNSxQRU1fcmVhZF9iaW9fUHJpdmF0ZUtleQorUEVNLGZ1bmN0aW9uLDExNixQRU1fd3JpdGUKK1BFTSxmdW5jdGlvbiwxMTcsUEVNX3dyaXRlX1ByaXZhdGVLZXkKK1BFTSxmdW5jdGlvbiwxMTgsUEVNX3dyaXRlX2JpbworUEVNLGZ1bmN0aW9uLDExOSxkMmlfUEtDUzhQcml2YXRlS2V5X2JpbworUEVNLGZ1bmN0aW9uLDEyMCxkMmlfUEtDUzhQcml2YXRlS2V5X2ZwCitQRU0sZnVuY3Rpb24sMTIxLGRvX3BrOHBrZXkKK1BFTSxmdW5jdGlvbiwxMjIsZG9fcGs4cGtleV9mcAorUEVNLGZ1bmN0aW9uLDEyMyxsb2FkX2l2CitQRU0scmVhc29uLDEwMCxCQURfQkFTRTY0X0RFQ09ERQorUEVNLHJlYXNvbiwxMDEsQkFEX0RFQ1JZUFQKK1BFTSxyZWFzb24sMTAyLEJBRF9FTkRfTElORQorUEVNLHJlYXNvbiwxMDMsQkFEX0lWX0NIQVJTCitQRU0scmVhc29uLDEwNCxCQURfUEFTU1dPUkRfUkVBRAorUEVNLHJlYXNvbiwxMDUsQ0lQSEVSX0lTX05VTEwKK1BFTSxyZWFzb24sMTA2LEVSUk9SX0NPTlZFUlRJTkdfUFJJVkFURV9LRVkKK1BFTSxyZWFzb24sMTA3LE5PVF9ERUtfSU5GTworUEVNLHJlYXNvbiwxMDgsTk9UX0VOQ1JZUFRFRAorUEVNLHJlYXNvbiwxMDksTk9UX1BST0NfVFlQRQorUEVNLHJlYXNvbiwxMTAsTk9fU1RBUlRfTElORQorUEVNLHJlYXNvbiwxMTEsUkVBRF9LRVkKK1BFTSxyZWFzb24sMTEyLFNIT1JUX0hFQURFUgorUEVNLHJlYXNvbiwxMTMsVU5TVVBQT1JURURfQ0lQSEVSCitQRU0scmVhc29uLDExNCxVTlNVUFBPUlRFRF9FTkNSWVBUSU9OCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9wa2NzOC5lcnJvcmRhdGEgYi9zcmMvY3J5cHRvL2Vyci9wa2NzOC5lcnJvcmRhdGEKaW5kZXggMGViNTA4My4uOTM2ZjNjNSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lcnIvcGtjczguZXJyb3JkYXRhCisrKyBiL3NyYy9jcnlwdG8vZXJyL3BrY3M4LmVycm9yZGF0YQpAQCAtMSwyNSArMSw0MyBAQAotUEtDUzgsMTAwLEJBRF9QS0NTMTJfREFUQQotUEtDUzgsMTAxLEJBRF9QS0NTMTJfVkVSU0lPTgotUEtDUzgsMTAyLENJUEhFUl9IQVNfTk9fT0JKRUNUX0lERU5USUZJRVIKLVBLQ1M4LDEwMyxDUllQVF9FUlJPUgotUEtDUzgsMTA0LERFQ09ERV9FUlJPUgotUEtDUzgsMTA1LEVOQ09ERV9FUlJPUgotUEtDUzgsMTA2LEVOQ1JZUFRfRVJST1IKLVBLQ1M4LDEwNyxFUlJPUl9TRVRUSU5HX0NJUEhFUl9QQVJBTVMKLVBLQ1M4LDEwOCxJTkNPUlJFQ1RfUEFTU1dPUkQKLVBLQ1M4LDEwOSxLRVlHRU5fRkFJTFVSRQotUEtDUzgsMTEwLEtFWV9HRU5fRVJST1IKLVBLQ1M4LDExMSxNRVRIT0RfTk9UX1NVUFBPUlRFRAotUEtDUzgsMTEyLE1JU1NJTkdfTUFDCi1QS0NTOCwxMTMsTVVMVElQTEVfUFJJVkFURV9LRVlTX0lOX1BLQ1MxMgotUEtDUzgsMTE0LFBLQ1MxMl9QVUJMSUNfS0VZX0lOVEVHUklUWV9OT1RfU1VQUE9SVEVECi1QS0NTOCwxMTUsUEtDUzEyX1RPT19ERUVQTFlfTkVTVEVECi1QS0NTOCwxMTYsUFJJVkFURV9LRVlfREVDT0RFX0VSUk9SCi1QS0NTOCwxMTcsUFJJVkFURV9LRVlfRU5DT0RFX0VSUk9SCi1QS0NTOCwxMTgsVE9PX0xPTkcKLVBLQ1M4LDExOSxVTktOT1dOX0FMR09SSVRITQotUEtDUzgsMTIwLFVOS05PV05fQ0lQSEVSCi1QS0NTOCwxMjEsVU5LTk9XTl9DSVBIRVJfQUxHT1JJVEhNCi1QS0NTOCwxMjIsVU5LTk9XTl9ESUdFU1QKLVBLQ1M4LDEyMyxVTktOT1dOX0hBU0gKLVBLQ1M4LDEyNCxVTlNVUFBPUlRFRF9QUklWQVRFX0tFWV9BTEdPUklUSE0KK1BLQ1M4LGZ1bmN0aW9uLDEwMCxFVlBfUEtDUzgyUEtFWQorUEtDUzgsZnVuY3Rpb24sMTAxLEVWUF9QS0VZMlBLQ1M4CitQS0NTOCxmdW5jdGlvbiwxMDIsUEtDUzEyX2dldF9rZXlfYW5kX2NlcnRzCitQS0NTOCxmdW5jdGlvbiwxMDMsUEtDUzEyX2hhbmRsZV9jb250ZW50X2luZm8KK1BLQ1M4LGZ1bmN0aW9uLDEwNCxQS0NTMTJfaGFuZGxlX2NvbnRlbnRfaW5mb3MKK1BLQ1M4LGZ1bmN0aW9uLDEwNSxQS0NTNV9wYmUyX3NldF9pdgorUEtDUzgsZnVuY3Rpb24sMTA2LFBLQ1M1X3BiZV9zZXQKK1BLQ1M4LGZ1bmN0aW9uLDEwNyxQS0NTNV9wYmVfc2V0MF9hbGdvcgorUEtDUzgsZnVuY3Rpb24sMTA4LFBLQ1M1X3Bia2RmMl9zZXQKK1BLQ1M4LGZ1bmN0aW9uLDEwOSxQS0NTOF9kZWNyeXB0CitQS0NTOCxmdW5jdGlvbiwxMTAsUEtDUzhfZW5jcnlwdAorUEtDUzgsZnVuY3Rpb24sMTExLFBLQ1M4X2VuY3J5cHRfcGJlCitQS0NTOCxmdW5jdGlvbiwxMTIscGJlX2NpcGhlcl9pbml0CitQS0NTOCxmdW5jdGlvbiwxMTMscGJlX2NyeXB0CitQS0NTOCxmdW5jdGlvbiwxMTQscGtjczEyX2l0ZW1fZGVjcnlwdF9kMmkKK1BLQ1M4LGZ1bmN0aW9uLDExNSxwa2NzMTJfaXRlbV9pMmRfZW5jcnlwdAorUEtDUzgsZnVuY3Rpb24sMTE2LHBrY3MxMl9rZXlfZ2VuX3JhdworUEtDUzgsZnVuY3Rpb24sMTE3LHBrY3MxMl9wYmVfa2V5aXZnZW4KK1BLQ1M4LHJlYXNvbiwxMDAsQkFEX1BLQ1MxMl9EQVRBCitQS0NTOCxyZWFzb24sMTAxLEJBRF9QS0NTMTJfVkVSU0lPTgorUEtDUzgscmVhc29uLDEwMixDSVBIRVJfSEFTX05PX09CSkVDVF9JREVOVElGSUVSCitQS0NTOCxyZWFzb24sMTAzLENSWVBUX0VSUk9SCitQS0NTOCxyZWFzb24sMTA0LERFQ09ERV9FUlJPUgorUEtDUzgscmVhc29uLDEwNSxFTkNPREVfRVJST1IKK1BLQ1M4LHJlYXNvbiwxMDYsRU5DUllQVF9FUlJPUgorUEtDUzgscmVhc29uLDEwNyxFUlJPUl9TRVRUSU5HX0NJUEhFUl9QQVJBTVMKK1BLQ1M4LHJlYXNvbiwxMDgsSU5DT1JSRUNUX1BBU1NXT1JECitQS0NTOCxyZWFzb24sMTA5LEtFWUdFTl9GQUlMVVJFCitQS0NTOCxyZWFzb24sMTEwLEtFWV9HRU5fRVJST1IKK1BLQ1M4LHJlYXNvbiwxMTEsTUVUSE9EX05PVF9TVVBQT1JURUQKK1BLQ1M4LHJlYXNvbiwxMTIsTUlTU0lOR19NQUMKK1BLQ1M4LHJlYXNvbiwxMTMsTVVMVElQTEVfUFJJVkFURV9LRVlTX0lOX1BLQ1MxMgorUEtDUzgscmVhc29uLDExNCxQS0NTMTJfUFVCTElDX0tFWV9JTlRFR1JJVFlfTk9UX1NVUFBPUlRFRAorUEtDUzgscmVhc29uLDExNSxQS0NTMTJfVE9PX0RFRVBMWV9ORVNURUQKK1BLQ1M4LHJlYXNvbiwxMTYsUFJJVkFURV9LRVlfREVDT0RFX0VSUk9SCitQS0NTOCxyZWFzb24sMTE3LFBSSVZBVEVfS0VZX0VOQ09ERV9FUlJPUgorUEtDUzgscmVhc29uLDExOCxUT09fTE9ORworUEtDUzgscmVhc29uLDExOSxVTktOT1dOX0FMR09SSVRITQorUEtDUzgscmVhc29uLDEyMCxVTktOT1dOX0NJUEhFUgorUEtDUzgscmVhc29uLDEyMSxVTktOT1dOX0NJUEhFUl9BTEdPUklUSE0KK1BLQ1M4LHJlYXNvbiwxMjIsVU5LTk9XTl9ESUdFU1QKK1BLQ1M4LHJlYXNvbiwxMjMsVU5LTk9XTl9IQVNICitQS0NTOCxyZWFzb24sMTI0LFVOU1VQUE9SVEVEX1BSSVZBVEVfS0VZX0FMR09SSVRITQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lcnIvcnNhLmVycm9yZGF0YSBiL3NyYy9jcnlwdG8vZXJyL3JzYS5lcnJvcmRhdGEKaW5kZXggYzE5ZjczYy4uNjRiMzkwZCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lcnIvcnNhLmVycm9yZGF0YQorKysgYi9zcmMvY3J5cHRvL2Vyci9yc2EuZXJyb3JkYXRhCkBAIC0xLDQ2ICsxLDY5IEBACi1SU0EsMTQzLEJBRF9FTkNPRElORwotUlNBLDEwMCxCQURfRV9WQUxVRQotUlNBLDEwMSxCQURfRklYRURfSEVBREVSX0RFQ1JZUFQKLVJTQSwxMDIsQkFEX1BBRF9CWVRFX0NPVU5UCi1SU0EsMTAzLEJBRF9SU0FfUEFSQU1FVEVSUwotUlNBLDEwNCxCQURfU0lHTkFUVVJFCi1SU0EsMTQ1LEJBRF9WRVJTSU9OCi1SU0EsMTA1LEJMT0NLX1RZUEVfSVNfTk9UXzAxCi1SU0EsMTA2LEJOX05PVF9JTklUSUFMSVpFRAotUlNBLDE0MixDQU5OT1RfUkVDT1ZFUl9NVUxUSV9QUklNRV9LRVkKLVJTQSwxMDcsQ1JUX1BBUkFNU19BTFJFQURZX0dJVkVOCi1SU0EsMTA4LENSVF9WQUxVRVNfSU5DT1JSRUNUCi1SU0EsMTA5LERBVEFfTEVOX05PVF9FUVVBTF9UT19NT0RfTEVOCi1SU0EsMTEwLERBVEFfVE9PX0xBUkdFCi1SU0EsMTExLERBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRQotUlNBLDExMixEQVRBX1RPT19MQVJHRV9GT1JfTU9EVUxVUwotUlNBLDExMyxEQVRBX1RPT19TTUFMTAotUlNBLDExNCxEQVRBX1RPT19TTUFMTF9GT1JfS0VZX1NJWkUKLVJTQSwxMTUsRElHRVNUX1RPT19CSUdfRk9SX1JTQV9LRVkKLVJTQSwxMTYsRF9FX05PVF9DT05HUlVFTlRfVE9fMQotUlNBLDExNyxFTVBUWV9QVUJMSUNfS0VZCi1SU0EsMTQ0LEVOQ09ERV9FUlJPUgotUlNBLDExOCxGSVJTVF9PQ1RFVF9JTlZBTElECi1SU0EsMTE5LElOQ09OU0lTVEVOVF9TRVRfT0ZfQ1JUX1ZBTFVFUwotUlNBLDEyMCxJTlRFUk5BTF9FUlJPUgotUlNBLDEyMSxJTlZBTElEX01FU1NBR0VfTEVOR1RICi1SU0EsMTIyLEtFWV9TSVpFX1RPT19TTUFMTAotUlNBLDEyMyxMQVNUX09DVEVUX0lOVkFMSUQKLVJTQSwxMjQsTU9EVUxVU19UT09fTEFSR0UKLVJTQSwxNDEsTVVTVF9IQVZFX0FUX0xFQVNUX1RXT19QUklNRVMKLVJTQSwxMjUsTk9fUFVCTElDX0VYUE9ORU5UCi1SU0EsMTI2LE5VTExfQkVGT1JFX0JMT0NLX01JU1NJTkcKLVJTQSwxMjcsTl9OT1RfRVFVQUxfUF9RCi1SU0EsMTI4LE9BRVBfREVDT0RJTkdfRVJST1IKLVJTQSwxMjksT05MWV9PTkVfT0ZfUF9RX0dJVkVOCi1SU0EsMTMwLE9VVFBVVF9CVUZGRVJfVE9PX1NNQUxMCi1SU0EsMTMxLFBBRERJTkdfQ0hFQ0tfRkFJTEVECi1SU0EsMTMyLFBLQ1NfREVDT0RJTkdfRVJST1IKLVJTQSwxMzMsU0xFTl9DSEVDS19GQUlMRUQKLVJTQSwxMzQsU0xFTl9SRUNPVkVSWV9GQUlMRUQKLVJTQSwxMzUsVE9PX0xPTkcKLVJTQSwxMzYsVE9PX01BTllfSVRFUkFUSU9OUwotUlNBLDEzNyxVTktOT1dOX0FMR09SSVRITV9UWVBFCi1SU0EsMTM4LFVOS05PV05fUEFERElOR19UWVBFCi1SU0EsMTM5LFZBTFVFX01JU1NJTkcKLVJTQSwxNDAsV1JPTkdfU0lHTkFUVVJFX0xFTkdUSAorUlNBLGZ1bmN0aW9uLDEwMCxCTl9CTElORElOR19jb252ZXJ0X2V4CitSU0EsZnVuY3Rpb24sMTAxLEJOX0JMSU5ESU5HX2NyZWF0ZV9wYXJhbQorUlNBLGZ1bmN0aW9uLDEwMixCTl9CTElORElOR19pbnZlcnRfZXgKK1JTQSxmdW5jdGlvbiwxMDMsQk5fQkxJTkRJTkdfbmV3CitSU0EsZnVuY3Rpb24sMTA0LEJOX0JMSU5ESU5HX3VwZGF0ZQorUlNBLGZ1bmN0aW9uLDEwNSxSU0FfY2hlY2tfa2V5CitSU0EsZnVuY3Rpb24sMTA2LFJTQV9uZXdfbWV0aG9kCitSU0EsZnVuY3Rpb24sMTA3LFJTQV9wYWRkaW5nX2FkZF9QS0NTMV9PQUVQX21nZjEKK1JTQSxmdW5jdGlvbiwxMDgsUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX1BTU19tZ2YxCitSU0EsZnVuY3Rpb24sMTA5LFJTQV9wYWRkaW5nX2FkZF9QS0NTMV90eXBlXzEKK1JTQSxmdW5jdGlvbiwxMTAsUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX3R5cGVfMgorUlNBLGZ1bmN0aW9uLDExMSxSU0FfcGFkZGluZ19hZGRfbm9uZQorUlNBLGZ1bmN0aW9uLDExMixSU0FfcGFkZGluZ19jaGVja19QS0NTMV9PQUVQX21nZjEKK1JTQSxmdW5jdGlvbiwxMTMsUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8xCitSU0EsZnVuY3Rpb24sMTE0LFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMgorUlNBLGZ1bmN0aW9uLDExNSxSU0FfcGFkZGluZ19jaGVja19ub25lCitSU0EsZnVuY3Rpb24sMTE2LFJTQV9yZWNvdmVyX2NydF9wYXJhbXMKK1JTQSxmdW5jdGlvbiwxMTcsUlNBX3NpZ24KK1JTQSxmdW5jdGlvbiwxMTgsUlNBX3ZlcmlmeQorUlNBLGZ1bmN0aW9uLDExOSxSU0FfdmVyaWZ5X1BLQ1MxX1BTU19tZ2YxCitSU0EsZnVuY3Rpb24sMTIwLGRlY3J5cHQKK1JTQSxmdW5jdGlvbiwxMjEsZW5jcnlwdAorUlNBLGZ1bmN0aW9uLDEyMixrZXlnZW4KK1JTQSxmdW5jdGlvbiwxMjMscGtjczFfcHJlZml4ZWRfbXNnCitSU0EsZnVuY3Rpb24sMTI0LHByaXZhdGVfdHJhbnNmb3JtCitSU0EsZnVuY3Rpb24sMTI1LHJzYV9zZXR1cF9ibGluZGluZworUlNBLGZ1bmN0aW9uLDEyNixzaWduX3JhdworUlNBLGZ1bmN0aW9uLDEyNyx2ZXJpZnlfcmF3CitSU0EscmVhc29uLDEwMCxCQURfRV9WQUxVRQorUlNBLHJlYXNvbiwxMDEsQkFEX0ZJWEVEX0hFQURFUl9ERUNSWVBUCitSU0EscmVhc29uLDEwMixCQURfUEFEX0JZVEVfQ09VTlQKK1JTQSxyZWFzb24sMTAzLEJBRF9SU0FfUEFSQU1FVEVSUworUlNBLHJlYXNvbiwxMDQsQkFEX1NJR05BVFVSRQorUlNBLHJlYXNvbiwxMDUsQkxPQ0tfVFlQRV9JU19OT1RfMDEKK1JTQSxyZWFzb24sMTA2LEJOX05PVF9JTklUSUFMSVpFRAorUlNBLHJlYXNvbiwxMDcsQ1JUX1BBUkFNU19BTFJFQURZX0dJVkVOCitSU0EscmVhc29uLDEwOCxDUlRfVkFMVUVTX0lOQ09SUkVDVAorUlNBLHJlYXNvbiwxMDksREFUQV9MRU5fTk9UX0VRVUFMX1RPX01PRF9MRU4KK1JTQSxyZWFzb24sMTEwLERBVEFfVE9PX0xBUkdFCitSU0EscmVhc29uLDExMSxEQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUKK1JTQSxyZWFzb24sMTEyLERBVEFfVE9PX0xBUkdFX0ZPUl9NT0RVTFVTCitSU0EscmVhc29uLDExMyxEQVRBX1RPT19TTUFMTAorUlNBLHJlYXNvbiwxMTQsREFUQV9UT09fU01BTExfRk9SX0tFWV9TSVpFCitSU0EscmVhc29uLDExNSxESUdFU1RfVE9PX0JJR19GT1JfUlNBX0tFWQorUlNBLHJlYXNvbiwxMTYsRF9FX05PVF9DT05HUlVFTlRfVE9fMQorUlNBLHJlYXNvbiwxMTcsRU1QVFlfUFVCTElDX0tFWQorUlNBLHJlYXNvbiwxMTgsRklSU1RfT0NURVRfSU5WQUxJRAorUlNBLHJlYXNvbiwxMTksSU5DT05TSVNURU5UX1NFVF9PRl9DUlRfVkFMVUVTCitSU0EscmVhc29uLDEyMCxJTlRFUk5BTF9FUlJPUgorUlNBLHJlYXNvbiwxMjEsSU5WQUxJRF9NRVNTQUdFX0xFTkdUSAorUlNBLHJlYXNvbiwxMjIsS0VZX1NJWkVfVE9PX1NNQUxMCitSU0EscmVhc29uLDEyMyxMQVNUX09DVEVUX0lOVkFMSUQKK1JTQSxyZWFzb24sMTI0LE1PRFVMVVNfVE9PX0xBUkdFCitSU0EscmVhc29uLDEyNSxOT19QVUJMSUNfRVhQT05FTlQKK1JTQSxyZWFzb24sMTI2LE5VTExfQkVGT1JFX0JMT0NLX01JU1NJTkcKK1JTQSxyZWFzb24sMTI3LE5fTk9UX0VRVUFMX1BfUQorUlNBLHJlYXNvbiwxMjgsT0FFUF9ERUNPRElOR19FUlJPUgorUlNBLHJlYXNvbiwxMjksT05MWV9PTkVfT0ZfUF9RX0dJVkVOCitSU0EscmVhc29uLDEzMCxPVVRQVVRfQlVGRkVSX1RPT19TTUFMTAorUlNBLHJlYXNvbiwxMzEsUEFERElOR19DSEVDS19GQUlMRUQKK1JTQSxyZWFzb24sMTMyLFBLQ1NfREVDT0RJTkdfRVJST1IKK1JTQSxyZWFzb24sMTMzLFNMRU5fQ0hFQ0tfRkFJTEVECitSU0EscmVhc29uLDEzNCxTTEVOX1JFQ09WRVJZX0ZBSUxFRAorUlNBLHJlYXNvbiwxMzUsVE9PX0xPTkcKK1JTQSxyZWFzb24sMTM2LFRPT19NQU5ZX0lURVJBVElPTlMKK1JTQSxyZWFzb24sMTM3LFVOS05PV05fQUxHT1JJVEhNX1RZUEUKK1JTQSxyZWFzb24sMTM4LFVOS05PV05fUEFERElOR19UWVBFCitSU0EscmVhc29uLDEzOSxWQUxVRV9NSVNTSU5HCitSU0EscmVhc29uLDE0MCxXUk9OR19TSUdOQVRVUkVfTEVOR1RICmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9zc2wuZXJyb3JkYXRhIGIvc3JjL2NyeXB0by9lcnIvc3NsLmVycm9yZGF0YQppbmRleCAwYjMwYjEzLi40YWUwYTUxIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Vyci9zc2wuZXJyb3JkYXRhCisrKyBiL3NyYy9jcnlwdG8vZXJyL3NzbC5lcnJvcmRhdGEKQEAgLTEsMjE3ICsxLDM4NCBAQAotU1NMLDEwMCxBUFBfREFUQV9JTl9IQU5EU0hBS0UKLVNTTCwxMDEsQVRURU1QVF9UT19SRVVTRV9TRVNTSU9OX0lOX0RJRkZFUkVOVF9DT05URVhUCi1TU0wsMTAyLEJBRF9BTEVSVAotU1NMLDEwMyxCQURfQ0hBTkdFX0NJUEhFUl9TUEVDCi1TU0wsMTA0LEJBRF9EQVRBX1JFVFVSTkVEX0JZX0NBTExCQUNLCi1TU0wsMTA1LEJBRF9ESF9QX0xFTkdUSAotU1NMLDEwNixCQURfRElHRVNUX0xFTkdUSAotU1NMLDEwNyxCQURfRUNDX0NFUlQKLVNTTCwxMDgsQkFEX0VDUE9JTlQKLVNTTCwxMDksQkFEX0hBTkRTSEFLRV9MRU5HVEgKLVNTTCwxMTAsQkFEX0hBTkRTSEFLRV9SRUNPUkQKLVNTTCwxMTEsQkFEX0hFTExPX1JFUVVFU1QKLVNTTCwxMTIsQkFEX0xFTkdUSAotU1NMLDExMyxCQURfUEFDS0VUX0xFTkdUSAotU1NMLDExNCxCQURfUlNBX0VOQ1JZUFQKLVNTTCwxMTUsQkFEX1NJR05BVFVSRQotU1NMLDExNixCQURfU1JUUF9NS0lfVkFMVUUKLVNTTCwxMTcsQkFEX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX0xJU1QKLVNTTCwxMTgsQkFEX1NTTF9GSUxFVFlQRQotU1NMLDExOSxCQURfV1JJVEVfUkVUUlkKLVNTTCwxMjAsQklPX05PVF9TRVQKLVNTTCwxMjEsQk5fTElCCi1TU0wsMjcyLEJVRkZFUl9UT09fU01BTEwKLVNTTCwxMjIsQ0FOTk9UX1NFUklBTElaRV9QVUJMSUNfS0VZCi1TU0wsMTIzLENBX0ROX0xFTkdUSF9NSVNNQVRDSAotU1NMLDEyNCxDQV9ETl9UT09fTE9ORwotU1NMLDEyNSxDQ1NfUkVDRUlWRURfRUFSTFkKLVNTTCwxMjYsQ0VSVElGSUNBVEVfVkVSSUZZX0ZBSUxFRAotU1NMLDEyNyxDRVJUX0NCX0VSUk9SCi1TU0wsMTI4LENFUlRfTEVOR1RIX01JU01BVENICi1TU0wsMTI5LENIQU5ORUxfSURfTk9UX1AyNTYKLVNTTCwxMzAsQ0hBTk5FTF9JRF9TSUdOQVRVUkVfSU5WQUxJRAotU1NMLDEzMSxDSVBIRVJfQ09ERV9XUk9OR19MRU5HVEgKLVNTTCwxMzIsQ0lQSEVSX09SX0hBU0hfVU5BVkFJTEFCTEUKLVNTTCwxMzMsQ0xJRU5USEVMTE9fUEFSU0VfRkFJTEVECi1TU0wsMTM0LENMSUVOVEhFTExPX1RMU0VYVAotU1NMLDEzNSxDT05ORUNUSU9OX1JFSkVDVEVECi1TU0wsMTM2LENPTk5FQ1RJT05fVFlQRV9OT1RfU0VUCi1TU0wsMTM3LENPT0tJRV9NSVNNQVRDSAotU1NMLDI4NCxDVVNUT01fRVhURU5TSU9OX0NPTlRFTlRTX1RPT19MQVJHRQotU1NMLDI4NSxDVVNUT01fRVhURU5TSU9OX0VSUk9SCi1TU0wsMTM4LEQySV9FQ0RTQV9TSUcKLVNTTCwxMzksREFUQV9CRVRXRUVOX0NDU19BTkRfRklOSVNIRUQKLVNTTCwxNDAsREFUQV9MRU5HVEhfVE9PX0xPTkcKLVNTTCwxNDEsREVDT0RFX0VSUk9SCi1TU0wsMTQyLERFQ1JZUFRJT05fRkFJTEVECi1TU0wsMTQzLERFQ1JZUFRJT05fRkFJTEVEX09SX0JBRF9SRUNPUkRfTUFDCi1TU0wsMTQ0LERIX1BVQkxJQ19WQUxVRV9MRU5HVEhfSVNfV1JPTkcKLVNTTCwxNDUsRElHRVNUX0NIRUNLX0ZBSUxFRAotU1NMLDE0NixEVExTX01FU1NBR0VfVE9PX0JJRwotU1NMLDE0NyxFQ0NfQ0VSVF9OT1RfRk9SX1NJR05JTkcKLVNTTCwxNDgsRU1QVFlfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfTElTVAotU1NMLDI3NixFTVNfU1RBVEVfSU5DT05TSVNURU5UCi1TU0wsMTQ5LEVOQ1JZUFRFRF9MRU5HVEhfVE9PX0xPTkcKLVNTTCwyODEsRVJST1JfQURESU5HX0VYVEVOU0lPTgotU1NMLDE1MCxFUlJPUl9JTl9SRUNFSVZFRF9DSVBIRVJfTElTVAotU1NMLDI4MixFUlJPUl9QQVJTSU5HX0VYVEVOU0lPTgotU1NMLDE1MSxFVlBfRElHRVNUU0lHTkZJTkFMX0ZBSUxFRAotU1NMLDE1MixFVlBfRElHRVNUU0lHTklOSVRfRkFJTEVECi1TU0wsMTUzLEVYQ0VTU0lWRV9NRVNTQUdFX1NJWkUKLVNTTCwxNTQsRVhUUkFfREFUQV9JTl9NRVNTQUdFCi1TU0wsMjcxLEZSQUdNRU5UX01JU01BVENICi1TU0wsMTU1LEdPVF9BX0ZJTl9CRUZPUkVfQV9DQ1MKLVNTTCwxNTYsR09UX0NIQU5ORUxfSURfQkVGT1JFX0FfQ0NTCi1TU0wsMTU3LEdPVF9ORVhUX1BST1RPX0JFRk9SRV9BX0NDUwotU1NMLDE1OCxHT1RfTkVYVF9QUk9UT19XSVRIT1VUX0VYVEVOU0lPTgotU1NMLDE1OSxIQU5EU0hBS0VfRkFJTFVSRV9PTl9DTElFTlRfSEVMTE8KLVNTTCwxNjAsSEFORFNIQUtFX1JFQ09SRF9CRUZPUkVfQ0NTCi1TU0wsMTYxLEhUVFBTX1BST1hZX1JFUVVFU1QKLVNTTCwxNjIsSFRUUF9SRVFVRVNUCi1TU0wsMTYzLElOQVBQUk9QUklBVEVfRkFMTEJBQ0sKLVNTTCwxNjQsSU5WQUxJRF9DT01NQU5ECi1TU0wsMTY1LElOVkFMSURfTUVTU0FHRQotU1NMLDE2NixJTlZBTElEX1NTTF9TRVNTSU9OCi1TU0wsMTY3LElOVkFMSURfVElDS0VUX0tFWVNfTEVOR1RICi1TU0wsMTY4LExFTkdUSF9NSVNNQVRDSAotU1NMLDE2OSxMSUJSQVJZX0hBU19OT19DSVBIRVJTCi1TU0wsMTcwLE1JU1NJTkdfREhfS0VZCi1TU0wsMTcxLE1JU1NJTkdfRUNEU0FfU0lHTklOR19DRVJUCi1TU0wsMjgzLE1JU1NJTkdfRVhURU5TSU9OCi1TU0wsMTcyLE1JU1NJTkdfUlNBX0NFUlRJRklDQVRFCi1TU0wsMTczLE1JU1NJTkdfUlNBX0VOQ1JZUFRJTkdfQ0VSVAotU1NMLDE3NCxNSVNTSU5HX1JTQV9TSUdOSU5HX0NFUlQKLVNTTCwxNzUsTUlTU0lOR19UTVBfREhfS0VZCi1TU0wsMTc2LE1JU1NJTkdfVE1QX0VDREhfS0VZCi1TU0wsMTc3LE1JWEVEX1NQRUNJQUxfT1BFUkFUT1JfV0lUSF9HUk9VUFMKLVNTTCwxNzgsTVRVX1RPT19TTUFMTAotU1NMLDI4NixORUdPVElBVEVEX0JPVEhfTlBOX0FORF9BTFBOCi1TU0wsMTc5LE5FU1RFRF9HUk9VUAotU1NMLDE4MCxOT19DRVJUSUZJQ0FURVNfUkVUVVJORUQKLVNTTCwxODEsTk9fQ0VSVElGSUNBVEVfQVNTSUdORUQKLVNTTCwxODIsTk9fQ0VSVElGSUNBVEVfU0VUCi1TU0wsMTgzLE5PX0NJUEhFUlNfQVZBSUxBQkxFCi1TU0wsMTg0LE5PX0NJUEhFUlNfUEFTU0VECi1TU0wsMTg1LE5PX0NJUEhFUlNfU1BFQ0lGSUVECi1TU0wsMTg2LE5PX0NJUEhFUl9NQVRDSAotU1NMLDE4NyxOT19DT01QUkVTU0lPTl9TUEVDSUZJRUQKLVNTTCwxODgsTk9fTUVUSE9EX1NQRUNJRklFRAotU1NMLDE4OSxOT19QMjU2X1NVUFBPUlQKLVNTTCwxOTAsTk9fUFJJVkFURV9LRVlfQVNTSUdORUQKLVNTTCwxOTEsTk9fUkVORUdPVElBVElPTgotU1NMLDE5MixOT19SRVFVSVJFRF9ESUdFU1QKLVNTTCwxOTMsTk9fU0hBUkVEX0NJUEhFUgotU1NMLDE5NCxOT19TSEFSRURfU0lHQVRVUkVfQUxHT1JJVEhNUwotU1NMLDE5NSxOT19TUlRQX1BST0ZJTEVTCi1TU0wsMTk2LE5VTExfU1NMX0NUWAotU1NMLDE5NyxOVUxMX1NTTF9NRVRIT0RfUEFTU0VECi1TU0wsMTk4LE9MRF9TRVNTSU9OX0NJUEhFUl9OT1RfUkVUVVJORUQKLVNTTCwyNzMsT0xEX1NFU1NJT05fVkVSU0lPTl9OT1RfUkVUVVJORUQKLVNTTCwyNzQsT1VUUFVUX0FMSUFTRVNfSU5QVVQKLVNTTCwxOTksUEFDS0VUX0xFTkdUSF9UT09fTE9ORwotU1NMLDIwMCxQQVJTRV9UTFNFWFQKLVNTTCwyMDEsUEFUSF9UT09fTE9ORwotU1NMLDIwMixQRUVSX0RJRF9OT1RfUkVUVVJOX0FfQ0VSVElGSUNBVEUKLVNTTCwyMDMsUEVFUl9FUlJPUl9VTlNVUFBPUlRFRF9DRVJUSUZJQ0FURV9UWVBFCi1TU0wsMjA0LFBST1RPQ09MX0lTX1NIVVRET1dOCi1TU0wsMjA1LFBTS19JREVOVElUWV9OT1RfRk9VTkQKLVNTTCwyMDYsUFNLX05PX0NMSUVOVF9DQgotU1NMLDIwNyxQU0tfTk9fU0VSVkVSX0NCCi1TU0wsMjA4LFJFQURfQklPX05PVF9TRVQKLVNTTCwyMDksUkVBRF9USU1FT1VUX0VYUElSRUQKLVNTTCwyMTAsUkVDT1JEX0xFTkdUSF9NSVNNQVRDSAotU1NMLDIxMSxSRUNPUkRfVE9PX0xBUkdFCi1TU0wsMjEyLFJFTkVHT1RJQVRFX0VYVF9UT09fTE9ORwotU1NMLDIxMyxSRU5FR09USUFUSU9OX0VOQ09ESU5HX0VSUgotU1NMLDIxNCxSRU5FR09USUFUSU9OX01JU01BVENICi1TU0wsMjE1LFJFUVVJUkVEX0NJUEhFUl9NSVNTSU5HCi1TU0wsMjc1LFJFU1VNRURfRU1TX1NFU1NJT05fV0lUSE9VVF9FTVNfRVhURU5TSU9OCi1TU0wsMjc3LFJFU1VNRURfTk9OX0VNU19TRVNTSU9OX1dJVEhfRU1TX0VYVEVOU0lPTgotU1NMLDIxNixTQ1NWX1JFQ0VJVkVEX1dIRU5fUkVORUdPVElBVElORwotU1NMLDIxNyxTRVJWRVJIRUxMT19UTFNFWFQKLVNTTCwyMTgsU0VTU0lPTl9JRF9DT05URVhUX1VOSU5JVElBTElaRUQKLVNTTCwyMTksU0VTU0lPTl9NQVlfTk9UX0JFX0NSRUFURUQKLVNTTCwyMjAsU0lHTkFUVVJFX0FMR09SSVRITVNfRVJST1IKLVNTTCwyODAsU0lHTkFUVVJFX0FMR09SSVRITVNfRVhURU5TSU9OX1NFTlRfQllfU0VSVkVSCi1TU0wsMjIxLFNSVFBfQ09VTERfTk9UX0FMTE9DQVRFX1BST0ZJTEVTCi1TU0wsMjIyLFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFX0xJU1RfVE9PX0xPTkcKLVNTTCwyMjMsU1JUUF9VTktOT1dOX1BST1RFQ1RJT05fUFJPRklMRQotU1NMLDIyNCxTU0wzX0VYVF9JTlZBTElEX1NFUlZFUk5BTUUKLVNTTCwyMjUsU1NMM19FWFRfSU5WQUxJRF9TRVJWRVJOQU1FX1RZUEUKLVNTTCwxMDQyLFNTTFYzX0FMRVJUX0JBRF9DRVJUSUZJQ0FURQotU1NMLDEwMjAsU1NMVjNfQUxFUlRfQkFEX1JFQ09SRF9NQUMKLVNTTCwxMDQ1LFNTTFYzX0FMRVJUX0NFUlRJRklDQVRFX0VYUElSRUQKLVNTTCwxMDQ0LFNTTFYzX0FMRVJUX0NFUlRJRklDQVRFX1JFVk9LRUQKLVNTTCwxMDQ2LFNTTFYzX0FMRVJUX0NFUlRJRklDQVRFX1VOS05PV04KLVNTTCwxMDAwLFNTTFYzX0FMRVJUX0NMT1NFX05PVElGWQotU1NMLDEwMzAsU1NMVjNfQUxFUlRfREVDT01QUkVTU0lPTl9GQUlMVVJFCi1TU0wsMTA0MCxTU0xWM19BTEVSVF9IQU5EU0hBS0VfRkFJTFVSRQotU1NMLDEwNDcsU1NMVjNfQUxFUlRfSUxMRUdBTF9QQVJBTUVURVIKLVNTTCwxMDQxLFNTTFYzX0FMRVJUX05PX0NFUlRJRklDQVRFCi1TU0wsMTAxMCxTU0xWM19BTEVSVF9VTkVYUEVDVEVEX01FU1NBR0UKLVNTTCwxMDQzLFNTTFYzX0FMRVJUX1VOU1VQUE9SVEVEX0NFUlRJRklDQVRFCi1TU0wsMjI2LFNTTF9DVFhfSEFTX05PX0RFRkFVTFRfU1NMX1ZFUlNJT04KLVNTTCwyMjcsU1NMX0hBTkRTSEFLRV9GQUlMVVJFCi1TU0wsMjI4LFNTTF9TRVNTSU9OX0lEX0NBTExCQUNLX0ZBSUxFRAotU1NMLDIyOSxTU0xfU0VTU0lPTl9JRF9DT05GTElDVAotU1NMLDIzMCxTU0xfU0VTU0lPTl9JRF9DT05URVhUX1RPT19MT05HCi1TU0wsMjMxLFNTTF9TRVNTSU9OX0lEX0hBU19CQURfTEVOR1RICi1TU0wsMTA0OSxUTFNWMV9BTEVSVF9BQ0NFU1NfREVOSUVECi1TU0wsMTA1MCxUTFNWMV9BTEVSVF9ERUNPREVfRVJST1IKLVNTTCwxMDIxLFRMU1YxX0FMRVJUX0RFQ1JZUFRJT05fRkFJTEVECi1TU0wsMTA1MSxUTFNWMV9BTEVSVF9ERUNSWVBUX0VSUk9SCi1TU0wsMTA2MCxUTFNWMV9BTEVSVF9FWFBPUlRfUkVTVFJJQ1RJT04KLVNTTCwxMDg2LFRMU1YxX0FMRVJUX0lOQVBQUk9QUklBVEVfRkFMTEJBQ0sKLVNTTCwxMDcxLFRMU1YxX0FMRVJUX0lOU1VGRklDSUVOVF9TRUNVUklUWQotU1NMLDEwODAsVExTVjFfQUxFUlRfSU5URVJOQUxfRVJST1IKLVNTTCwxMTAwLFRMU1YxX0FMRVJUX05PX1JFTkVHT1RJQVRJT04KLVNTTCwxMDcwLFRMU1YxX0FMRVJUX1BST1RPQ09MX1ZFUlNJT04KLVNTTCwxMDIyLFRMU1YxX0FMRVJUX1JFQ09SRF9PVkVSRkxPVwotU1NMLDEwNDgsVExTVjFfQUxFUlRfVU5LTk9XTl9DQQotU1NMLDEwOTAsVExTVjFfQUxFUlRfVVNFUl9DQU5DRUxMRUQKLVNTTCwxMTE0LFRMU1YxX0JBRF9DRVJUSUZJQ0FURV9IQVNIX1ZBTFVFCi1TU0wsMTExMyxUTFNWMV9CQURfQ0VSVElGSUNBVEVfU1RBVFVTX1JFU1BPTlNFCi1TU0wsMTExMSxUTFNWMV9DRVJUSUZJQ0FURV9VTk9CVEFJTkFCTEUKLVNTTCwxMTEyLFRMU1YxX1VOUkVDT0dOSVpFRF9OQU1FCi1TU0wsMTExMCxUTFNWMV9VTlNVUFBPUlRFRF9FWFRFTlNJT04KLVNTTCwyMzIsVExTX0NMSUVOVF9DRVJUX1JFUV9XSVRIX0FOT05fQ0lQSEVSCi1TU0wsMjMzLFRMU19JTExFR0FMX0VYUE9SVEVSX0xBQkVMCi1TU0wsMjM0LFRMU19JTlZBTElEX0VDUE9JTlRGT1JNQVRfTElTVAotU1NMLDIzNSxUTFNfUEVFUl9ESURfTk9UX1JFU1BPTkRfV0lUSF9DRVJUSUZJQ0FURV9MSVNUCi1TU0wsMjM2LFRMU19SU0FfRU5DUllQVEVEX1ZBTFVFX0xFTkdUSF9JU19XUk9ORwotU1NMLDIzNyxUT09fTUFOWV9FTVBUWV9GUkFHTUVOVFMKLVNTTCwyNzgsVE9PX01BTllfV0FSTklOR19BTEVSVFMKLVNTTCwyMzgsVU5BQkxFX1RPX0ZJTkRfRUNESF9QQVJBTUVURVJTCi1TU0wsMjM5LFVOQUJMRV9UT19GSU5EX1BVQkxJQ19LRVlfUEFSQU1FVEVSUwotU1NMLDI3OSxVTkVYUEVDVEVEX0VYVEVOU0lPTgotU1NMLDI0MCxVTkVYUEVDVEVEX0dST1VQX0NMT1NFCi1TU0wsMjQxLFVORVhQRUNURURfTUVTU0FHRQotU1NMLDI0MixVTkVYUEVDVEVEX09QRVJBVE9SX0lOX0dST1VQCi1TU0wsMjQzLFVORVhQRUNURURfUkVDT1JECi1TU0wsMjQ0LFVOSU5JVElBTElaRUQKLVNTTCwyNDUsVU5LTk9XTl9BTEVSVF9UWVBFCi1TU0wsMjQ2LFVOS05PV05fQ0VSVElGSUNBVEVfVFlQRQotU1NMLDI0NyxVTktOT1dOX0NJUEhFUl9SRVRVUk5FRAotU1NMLDI0OCxVTktOT1dOX0NJUEhFUl9UWVBFCi1TU0wsMjQ5LFVOS05PV05fRElHRVNUCi1TU0wsMjUwLFVOS05PV05fS0VZX0VYQ0hBTkdFX1RZUEUKLVNTTCwyNTEsVU5LTk9XTl9QUk9UT0NPTAotU1NMLDI1MixVTktOT1dOX1NTTF9WRVJTSU9OCi1TU0wsMjUzLFVOS05PV05fU1RBVEUKLVNTTCwyNTQsVU5QUk9DRVNTRURfSEFORFNIQUtFX0RBVEEKLVNTTCwyNTUsVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OX0RJU0FCTEVECi1TU0wsMjU2LFVOU1VQUE9SVEVEX0NJUEhFUgotU1NMLDI1NyxVTlNVUFBPUlRFRF9DT01QUkVTU0lPTl9BTEdPUklUSE0KLVNTTCwyNTgsVU5TVVBQT1JURURfRUxMSVBUSUNfQ1VSVkUKLVNTTCwyNTksVU5TVVBQT1JURURfUFJPVE9DT0wKLVNTTCwyNjAsVU5TVVBQT1JURURfU1NMX1ZFUlNJT04KLVNTTCwyNjEsVVNFX1NSVFBfTk9UX05FR09USUFURUQKLVNTTCwyNjIsV1JPTkdfQ0VSVElGSUNBVEVfVFlQRQotU1NMLDI2MyxXUk9OR19DSVBIRVJfUkVUVVJORUQKLVNTTCwyNjQsV1JPTkdfQ1VSVkUKLVNTTCwyNjUsV1JPTkdfTUVTU0FHRV9UWVBFCi1TU0wsMjY2LFdST05HX1NJR05BVFVSRV9UWVBFCi1TU0wsMjY3LFdST05HX1NTTF9WRVJTSU9OCi1TU0wsMjY4LFdST05HX1ZFUlNJT05fTlVNQkVSCi1TU0wsMjY5LFg1MDlfTElCCi1TU0wsMjcwLFg1MDlfVkVSSUZJQ0FUSU9OX1NFVFVQX1BST0JMRU1TCitTU0wsZnVuY3Rpb24sMjc2LFNTTF9BRUFEX0NUWF9uZXcKK1NTTCxmdW5jdGlvbiwyNzcsU1NMX0FFQURfQ1RYX29wZW4KK1NTTCxmdW5jdGlvbiwyNzgsU1NMX0FFQURfQ1RYX3NlYWwKK1NTTCxmdW5jdGlvbiwxMDAsU1NMX0NUWF9jaGVja19wcml2YXRlX2tleQorU1NMLGZ1bmN0aW9uLDEwMSxTU0xfQ1RYX25ldworU1NMLGZ1bmN0aW9uLDI3MixTU0xfQ1RYX3NldDFfdGxzX2NoYW5uZWxfaWQKK1NTTCxmdW5jdGlvbiwxMDIsU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QKK1NTTCxmdW5jdGlvbiwxMDMsU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3RfdGxzMTEKK1NTTCxmdW5jdGlvbiwxMDQsU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0CitTU0wsZnVuY3Rpb24sMjY4LFNTTF9DVFhfc2V0X3RtcF9kaAorU1NMLGZ1bmN0aW9uLDI2OSxTU0xfQ1RYX3NldF90bXBfZWNkaAorU1NMLGZ1bmN0aW9uLDEwNSxTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5CitTU0wsZnVuY3Rpb24sMTA2LFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfQVNOMQorU1NMLGZ1bmN0aW9uLDEwNyxTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUKK1NTTCxmdW5jdGlvbiwxMDgsU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleQorU1NMLGZ1bmN0aW9uLDEwOSxTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5X0FTTjEKK1NTTCxmdW5jdGlvbiwxMTAsU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleV9maWxlCitTU0wsZnVuY3Rpb24sMTExLFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlCitTU0wsZnVuY3Rpb24sMTEyLFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX0FTTjEKK1NTTCxmdW5jdGlvbiwxMTMsU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZQorU1NMLGZ1bmN0aW9uLDExNCxTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9maWxlCitTU0wsZnVuY3Rpb24sMTE1LFNTTF9DVFhfdXNlX3Bza19pZGVudGl0eV9oaW50CitTU0wsZnVuY3Rpb24sMTE2LFNTTF9TRVNTSU9OX25ldworU1NMLGZ1bmN0aW9uLDExNyxTU0xfU0VTU0lPTl9wcmludF9mcAorU1NMLGZ1bmN0aW9uLDExOCxTU0xfU0VTU0lPTl9zZXQxX2lkX2NvbnRleHQKK1NTTCxmdW5jdGlvbiwxMTksU1NMX1NFU1NJT05fdG9fYnl0ZXNfZnVsbAorU1NMLGZ1bmN0aW9uLDEyMCxTU0xfYWNjZXB0CitTU0wsZnVuY3Rpb24sMTIxLFNTTF9hZGRfZGlyX2NlcnRfc3ViamVjdHNfdG9fc3RhY2sKK1NTTCxmdW5jdGlvbiwxMjIsU1NMX2FkZF9maWxlX2NlcnRfc3ViamVjdHNfdG9fc3RhY2sKK1NTTCxmdW5jdGlvbiwxMjMsU1NMX2NoZWNrX3ByaXZhdGVfa2V5CitTU0wsZnVuY3Rpb24sMTI0LFNTTF9jbGVhcgorU1NMLGZ1bmN0aW9uLDEyNSxTU0xfY29ubmVjdAorU1NMLGZ1bmN0aW9uLDEyNixTU0xfZG9faGFuZHNoYWtlCitTU0wsZnVuY3Rpb24sMTI3LFNTTF9sb2FkX2NsaWVudF9DQV9maWxlCitTU0wsZnVuY3Rpb24sMTI4LFNTTF9uZXcKK1NTTCxmdW5jdGlvbiwxMjksU1NMX3BlZWsKK1NTTCxmdW5jdGlvbiwxMzAsU1NMX3JlYWQKK1NTTCxmdW5jdGlvbiwxMzEsU1NMX3JlbmVnb3RpYXRlCitTU0wsZnVuY3Rpb24sMjczLFNTTF9zZXQxX3Rsc19jaGFubmVsX2lkCitTU0wsZnVuY3Rpb24sMTMyLFNTTF9zZXRfY2lwaGVyX2xpc3QKK1NTTCxmdW5jdGlvbiwxMzMsU1NMX3NldF9mZAorU1NMLGZ1bmN0aW9uLDEzNCxTU0xfc2V0X3JmZAorU1NMLGZ1bmN0aW9uLDEzNSxTU0xfc2V0X3Nlc3Npb25faWRfY29udGV4dAorU1NMLGZ1bmN0aW9uLDI3NCxTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUKK1NTTCxmdW5jdGlvbiwyNzAsU1NMX3NldF90bXBfZGgKK1NTTCxmdW5jdGlvbiwyNzEsU1NMX3NldF90bXBfZWNkaAorU1NMLGZ1bmN0aW9uLDEzNixTU0xfc2V0X3dmZAorU1NMLGZ1bmN0aW9uLDEzNyxTU0xfc2h1dGRvd24KK1NTTCxmdW5jdGlvbiwxMzgsU1NMX3VzZV9Qcml2YXRlS2V5CitTU0wsZnVuY3Rpb24sMTM5LFNTTF91c2VfUHJpdmF0ZUtleV9BU04xCitTU0wsZnVuY3Rpb24sMTQwLFNTTF91c2VfUHJpdmF0ZUtleV9maWxlCitTU0wsZnVuY3Rpb24sMTQxLFNTTF91c2VfUlNBUHJpdmF0ZUtleQorU1NMLGZ1bmN0aW9uLDE0MixTU0xfdXNlX1JTQVByaXZhdGVLZXlfQVNOMQorU1NMLGZ1bmN0aW9uLDE0MyxTU0xfdXNlX1JTQVByaXZhdGVLZXlfZmlsZQorU1NMLGZ1bmN0aW9uLDE0NCxTU0xfdXNlX2NlcnRpZmljYXRlCitTU0wsZnVuY3Rpb24sMTQ1LFNTTF91c2VfY2VydGlmaWNhdGVfQVNOMQorU1NMLGZ1bmN0aW9uLDE0NixTU0xfdXNlX2NlcnRpZmljYXRlX2ZpbGUKK1NTTCxmdW5jdGlvbiwxNDcsU1NMX3VzZV9wc2tfaWRlbnRpdHlfaGludAorU1NMLGZ1bmN0aW9uLDE0OCxTU0xfd3JpdGUKK1NTTCxmdW5jdGlvbiwxNDksZDJpX1NTTF9TRVNTSU9OCitTU0wsZnVuY3Rpb24sMTUwLGQyaV9TU0xfU0VTU0lPTl9nZXRfb2N0ZXRfc3RyaW5nCitTU0wsZnVuY3Rpb24sMTUxLGQyaV9TU0xfU0VTU0lPTl9nZXRfc3RyaW5nCitTU0wsZnVuY3Rpb24sMTUyLGRvX3NzbDNfd3JpdGUKK1NTTCxmdW5jdGlvbiwxNTMsZHRsczFfYWNjZXB0CitTU0wsZnVuY3Rpb24sMTU0LGR0bHMxX2J1ZmZlcl9yZWNvcmQKK1NTTCxmdW5jdGlvbiwxNTUsZHRsczFfY2hlY2tfdGltZW91dF9udW0KK1NTTCxmdW5jdGlvbiwxNTYsZHRsczFfY29ubmVjdAorU1NMLGZ1bmN0aW9uLDE1NyxkdGxzMV9kb193cml0ZQorU1NMLGZ1bmN0aW9uLDI2MyxkdGxzMV9nZXRfYnVmZmVyZWRfbWVzc2FnZQorU1NMLGZ1bmN0aW9uLDE1OCxkdGxzMV9nZXRfaGVsbG9fdmVyaWZ5CitTU0wsZnVuY3Rpb24sMTU5LGR0bHMxX2dldF9tZXNzYWdlCitTU0wsZnVuY3Rpb24sMTYwLGR0bHMxX2dldF9tZXNzYWdlX2ZyYWdtZW50CitTU0wsZnVuY3Rpb24sMjY1LGR0bHMxX2htX2ZyYWdtZW50X25ldworU1NMLGZ1bmN0aW9uLDE2MSxkdGxzMV9wcmVwcm9jZXNzX2ZyYWdtZW50CitTU0wsZnVuY3Rpb24sMjY0LGR0bHMxX3Byb2Nlc3NfZnJhZ21lbnQKK1NTTCxmdW5jdGlvbiwxNjIsZHRsczFfcHJvY2Vzc19yZWNvcmQKK1NTTCxmdW5jdGlvbiwxNjMsZHRsczFfcmVhZF9ieXRlcworU1NMLGZ1bmN0aW9uLDI3OSxkdGxzMV9zZWFsX3JlY29yZAorU1NMLGZ1bmN0aW9uLDE2NCxkdGxzMV9zZW5kX2hlbGxvX3ZlcmlmeV9yZXF1ZXN0CitTU0wsZnVuY3Rpb24sMTY1LGR0bHMxX3dyaXRlX2FwcF9kYXRhCitTU0wsZnVuY3Rpb24sMTY2LGkyZF9TU0xfU0VTU0lPTgorU1NMLGZ1bmN0aW9uLDE2Nyxzc2wzX2FjY2VwdAorU1NMLGZ1bmN0aW9uLDE2OSxzc2wzX2NlcnRfdmVyaWZ5X2hhc2gKK1NTTCxmdW5jdGlvbiwxNzAsc3NsM19jaGVja19jZXJ0X2FuZF9hbGdvcml0aG0KK1NTTCxmdW5jdGlvbiwxNzEsc3NsM19jb25uZWN0CitTU0wsZnVuY3Rpb24sMTcyLHNzbDNfY3RybAorU1NMLGZ1bmN0aW9uLDE3Myxzc2wzX2N0eF9jdHJsCitTU0wsZnVuY3Rpb24sMTc0LHNzbDNfZGlnZXN0X2NhY2hlZF9yZWNvcmRzCitTU0wsZnVuY3Rpb24sMTc1LHNzbDNfZG9fY2hhbmdlX2NpcGhlcl9zcGVjCitTU0wsZnVuY3Rpb24sMTc2LHNzbDNfZXhwZWN0X2NoYW5nZV9jaXBoZXJfc3BlYworU1NMLGZ1bmN0aW9uLDE3Nyxzc2wzX2dldF9jZXJ0X3N0YXR1cworU1NMLGZ1bmN0aW9uLDE3OCxzc2wzX2dldF9jZXJ0X3ZlcmlmeQorU1NMLGZ1bmN0aW9uLDE3OSxzc2wzX2dldF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0CitTU0wsZnVuY3Rpb24sMTgwLHNzbDNfZ2V0X2NoYW5uZWxfaWQKK1NTTCxmdW5jdGlvbiwxODEsc3NsM19nZXRfY2xpZW50X2NlcnRpZmljYXRlCitTU0wsZnVuY3Rpb24sMTgyLHNzbDNfZ2V0X2NsaWVudF9oZWxsbworU1NMLGZ1bmN0aW9uLDE4Myxzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlCitTU0wsZnVuY3Rpb24sMTg0LHNzbDNfZ2V0X2ZpbmlzaGVkCitTU0wsZnVuY3Rpb24sMTg1LHNzbDNfZ2V0X2luaXRpYWxfYnl0ZXMKK1NTTCxmdW5jdGlvbiwxODYsc3NsM19nZXRfbWVzc2FnZQorU1NMLGZ1bmN0aW9uLDE4Nyxzc2wzX2dldF9uZXdfc2Vzc2lvbl90aWNrZXQKK1NTTCxmdW5jdGlvbiwxODgsc3NsM19nZXRfbmV4dF9wcm90bworU1NMLGZ1bmN0aW9uLDE4OSxzc2wzX2dldF9yZWNvcmQKK1NTTCxmdW5jdGlvbiwxOTAsc3NsM19nZXRfc2VydmVyX2NlcnRpZmljYXRlCitTU0wsZnVuY3Rpb24sMTkxLHNzbDNfZ2V0X3NlcnZlcl9kb25lCitTU0wsZnVuY3Rpb24sMTkyLHNzbDNfZ2V0X3NlcnZlcl9oZWxsbworU1NMLGZ1bmN0aW9uLDE5Myxzc2wzX2dldF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlCitTU0wsZnVuY3Rpb24sMTk0LHNzbDNfZ2V0X3YyX2NsaWVudF9oZWxsbworU1NMLGZ1bmN0aW9uLDE5NSxzc2wzX2hhbmRzaGFrZV9tYWMKK1NTTCxmdW5jdGlvbiwyNzUsc3NsM19vdXRwdXRfY2VydF9jaGFpbgorU1NMLGZ1bmN0aW9uLDE5Nixzc2wzX3ByZgorU1NMLGZ1bmN0aW9uLDE5Nyxzc2wzX3JlYWRfYnl0ZXMKK1NTTCxmdW5jdGlvbiwxOTgsc3NsM19yZWFkX24KK1NTTCxmdW5jdGlvbiwyNjcsc3NsM19yZWNvcmRfc2VxdWVuY2VfdXBkYXRlCitTU0wsZnVuY3Rpb24sMjY2LHNzbDNfc2VhbF9yZWNvcmQKK1NTTCxmdW5jdGlvbiwxOTksc3NsM19zZW5kX2NlcnRfdmVyaWZ5CitTU0wsZnVuY3Rpb24sMjAwLHNzbDNfc2VuZF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0CitTU0wsZnVuY3Rpb24sMjAxLHNzbDNfc2VuZF9jaGFubmVsX2lkCitTU0wsZnVuY3Rpb24sMjAyLHNzbDNfc2VuZF9jbGllbnRfY2VydGlmaWNhdGUKK1NTTCxmdW5jdGlvbiwyMDMsc3NsM19zZW5kX2NsaWVudF9oZWxsbworU1NMLGZ1bmN0aW9uLDIwNCxzc2wzX3NlbmRfY2xpZW50X2tleV9leGNoYW5nZQorU1NMLGZ1bmN0aW9uLDIwNSxzc2wzX3NlbmRfc2VydmVyX2NlcnRpZmljYXRlCitTU0wsZnVuY3Rpb24sMjA2LHNzbDNfc2VuZF9zZXJ2ZXJfaGVsbG8KK1NTTCxmdW5jdGlvbiwyMDcsc3NsM19zZW5kX3NlcnZlcl9rZXlfZXhjaGFuZ2UKK1NTTCxmdW5jdGlvbiwyMDgsc3NsM19zZXR1cF9yZWFkX2J1ZmZlcgorU1NMLGZ1bmN0aW9uLDIwOSxzc2wzX3NldHVwX3dyaXRlX2J1ZmZlcgorU1NMLGZ1bmN0aW9uLDIxMCxzc2wzX3dyaXRlX2J5dGVzCitTU0wsZnVuY3Rpb24sMjExLHNzbDNfd3JpdGVfcGVuZGluZworU1NMLGZ1bmN0aW9uLDIxMixzc2xfYWRkX2NlcnRfY2hhaW4KK1NTTCxmdW5jdGlvbiwyMTMsc3NsX2FkZF9jZXJ0X3RvX2J1ZgorU1NMLGZ1bmN0aW9uLDIxNCxzc2xfYWRkX2NsaWVudGhlbGxvX3JlbmVnb3RpYXRlX2V4dAorU1NMLGZ1bmN0aW9uLDIxNSxzc2xfYWRkX2NsaWVudGhlbGxvX3Rsc2V4dAorU1NMLGZ1bmN0aW9uLDIxNixzc2xfYWRkX2NsaWVudGhlbGxvX3VzZV9zcnRwX2V4dAorU1NMLGZ1bmN0aW9uLDIxNyxzc2xfYWRkX3NlcnZlcmhlbGxvX3JlbmVnb3RpYXRlX2V4dAorU1NMLGZ1bmN0aW9uLDIxOCxzc2xfYWRkX3NlcnZlcmhlbGxvX3Rsc2V4dAorU1NMLGZ1bmN0aW9uLDIxOSxzc2xfYWRkX3NlcnZlcmhlbGxvX3VzZV9zcnRwX2V4dAorU1NMLGZ1bmN0aW9uLDIyMCxzc2xfYnVpbGRfY2VydF9jaGFpbgorU1NMLGZ1bmN0aW9uLDIyMSxzc2xfYnl0ZXNfdG9fY2lwaGVyX2xpc3QKK1NTTCxmdW5jdGlvbiwyMjIsc3NsX2NlcnRfZHVwCitTU0wsZnVuY3Rpb24sMjIzLHNzbF9jZXJ0X2luc3QKK1NTTCxmdW5jdGlvbiwyMjQsc3NsX2NlcnRfbmV3CitTU0wsZnVuY3Rpb24sMjI1LHNzbF9jaGVja19zZXJ2ZXJoZWxsb190bHNleHQKK1NTTCxmdW5jdGlvbiwyMjYsc3NsX2NoZWNrX3NydnJfZWNjX2NlcnRfYW5kX2FsZworU1NMLGZ1bmN0aW9uLDIyNyxzc2xfY2lwaGVyX3Byb2Nlc3NfcnVsZXN0cgorU1NMLGZ1bmN0aW9uLDIyOCxzc2xfY2lwaGVyX3N0cmVuZ3RoX3NvcnQKK1NTTCxmdW5jdGlvbiwyMjksc3NsX2NyZWF0ZV9jaXBoZXJfbGlzdAorU1NMLGZ1bmN0aW9uLDIzMCxzc2xfY3R4X2xvZ19tYXN0ZXJfc2VjcmV0CitTU0wsZnVuY3Rpb24sMjMxLHNzbF9jdHhfbG9nX3JzYV9jbGllbnRfa2V5X2V4Y2hhbmdlCitTU0wsZnVuY3Rpb24sMjMyLHNzbF9jdHhfbWFrZV9wcm9maWxlcworU1NMLGZ1bmN0aW9uLDIzMyxzc2xfZ2V0X25ld19zZXNzaW9uCitTU0wsZnVuY3Rpb24sMjM0LHNzbF9nZXRfcHJldl9zZXNzaW9uCitTU0wsZnVuY3Rpb24sMjM1LHNzbF9nZXRfc2VydmVyX2NlcnRfaW5kZXgKK1NTTCxmdW5jdGlvbiwyMzYsc3NsX2dldF9zaWduX3BrZXkKK1NTTCxmdW5jdGlvbiwyMzcsc3NsX2luaXRfd2Jpb19idWZmZXIKK1NTTCxmdW5jdGlvbiwyMzgsc3NsX3BhcnNlX2NsaWVudGhlbGxvX3JlbmVnb3RpYXRlX2V4dAorU1NMLGZ1bmN0aW9uLDIzOSxzc2xfcGFyc2VfY2xpZW50aGVsbG9fdGxzZXh0CitTU0wsZnVuY3Rpb24sMjQwLHNzbF9wYXJzZV9jbGllbnRoZWxsb191c2Vfc3J0cF9leHQKK1NTTCxmdW5jdGlvbiwyNDEsc3NsX3BhcnNlX3NlcnZlcmhlbGxvX3JlbmVnb3RpYXRlX2V4dAorU1NMLGZ1bmN0aW9uLDI0Mixzc2xfcGFyc2Vfc2VydmVyaGVsbG9fdGxzZXh0CitTU0wsZnVuY3Rpb24sMjQzLHNzbF9wYXJzZV9zZXJ2ZXJoZWxsb191c2Vfc3J0cF9leHQKK1NTTCxmdW5jdGlvbiwyNDQsc3NsX3NjYW5fY2xpZW50aGVsbG9fdGxzZXh0CitTU0wsZnVuY3Rpb24sMjQ1LHNzbF9zY2FuX3NlcnZlcmhlbGxvX3Rsc2V4dAorU1NMLGZ1bmN0aW9uLDI0Nixzc2xfc2Vzc19jZXJ0X25ldworU1NMLGZ1bmN0aW9uLDI0Nyxzc2xfc2V0X2NlcnQKK1NTTCxmdW5jdGlvbiwyNDgsc3NsX3NldF9wa2V5CitTU0wsZnVuY3Rpb24sMjUyLHNzbF92ZXJpZnlfY2VydF9jaGFpbgorU1NMLGZ1bmN0aW9uLDI1Myx0bHMxMl9jaGVja19wZWVyX3NpZ2FsZworU1NMLGZ1bmN0aW9uLDI1NCx0bHMxX2FlYWRfY3R4X2luaXQKK1NTTCxmdW5jdGlvbiwyNTUsdGxzMV9jZXJ0X3ZlcmlmeV9tYWMKK1NTTCxmdW5jdGlvbiwyNTYsdGxzMV9jaGFuZ2VfY2lwaGVyX3N0YXRlCitTU0wsZnVuY3Rpb24sMjU3LHRsczFfY2hhbmdlX2NpcGhlcl9zdGF0ZV9hZWFkCitTU0wsZnVuY3Rpb24sMjU4LHRsczFfY2hlY2tfZHVwbGljYXRlX2V4dGVuc2lvbnMKK1NTTCxmdW5jdGlvbiwyNTksdGxzMV9lbmMKK1NTTCxmdW5jdGlvbiwyNjAsdGxzMV9leHBvcnRfa2V5aW5nX21hdGVyaWFsCitTU0wsZnVuY3Rpb24sMjYxLHRsczFfcHJmCitTU0wsZnVuY3Rpb24sMjYyLHRsczFfc2V0dXBfa2V5X2Jsb2NrCitTU0wscmVhc29uLDEwMCxBUFBfREFUQV9JTl9IQU5EU0hBS0UKK1NTTCxyZWFzb24sMTAxLEFUVEVNUFRfVE9fUkVVU0VfU0VTU0lPTl9JTl9ESUZGRVJFTlRfQ09OVEVYVAorU1NMLHJlYXNvbiwxMDIsQkFEX0FMRVJUCitTU0wscmVhc29uLDEwMyxCQURfQ0hBTkdFX0NJUEhFUl9TUEVDCitTU0wscmVhc29uLDEwNCxCQURfREFUQV9SRVRVUk5FRF9CWV9DQUxMQkFDSworU1NMLHJlYXNvbiwxMDUsQkFEX0RIX1BfTEVOR1RICitTU0wscmVhc29uLDEwNixCQURfRElHRVNUX0xFTkdUSAorU1NMLHJlYXNvbiwxMDcsQkFEX0VDQ19DRVJUCitTU0wscmVhc29uLDEwOCxCQURfRUNQT0lOVAorU1NMLHJlYXNvbiwxMDksQkFEX0hBTkRTSEFLRV9MRU5HVEgKK1NTTCxyZWFzb24sMTEwLEJBRF9IQU5EU0hBS0VfUkVDT1JECitTU0wscmVhc29uLDExMSxCQURfSEVMTE9fUkVRVUVTVAorU1NMLHJlYXNvbiwxMTIsQkFEX0xFTkdUSAorU1NMLHJlYXNvbiwxMTMsQkFEX1BBQ0tFVF9MRU5HVEgKK1NTTCxyZWFzb24sMTE0LEJBRF9SU0FfRU5DUllQVAorU1NMLHJlYXNvbiwxMTUsQkFEX1NJR05BVFVSRQorU1NMLHJlYXNvbiwxMTYsQkFEX1NSVFBfTUtJX1ZBTFVFCitTU0wscmVhc29uLDExNyxCQURfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfTElTVAorU1NMLHJlYXNvbiwxMTgsQkFEX1NTTF9GSUxFVFlQRQorU1NMLHJlYXNvbiwxMTksQkFEX1dSSVRFX1JFVFJZCitTU0wscmVhc29uLDEyMCxCSU9fTk9UX1NFVAorU1NMLHJlYXNvbiwxMjEsQk5fTElCCitTU0wscmVhc29uLDI3MixCVUZGRVJfVE9PX1NNQUxMCitTU0wscmVhc29uLDEyMixDQU5OT1RfU0VSSUFMSVpFX1BVQkxJQ19LRVkKK1NTTCxyZWFzb24sMTIzLENBX0ROX0xFTkdUSF9NSVNNQVRDSAorU1NMLHJlYXNvbiwxMjQsQ0FfRE5fVE9PX0xPTkcKK1NTTCxyZWFzb24sMTI1LENDU19SRUNFSVZFRF9FQVJMWQorU1NMLHJlYXNvbiwxMjYsQ0VSVElGSUNBVEVfVkVSSUZZX0ZBSUxFRAorU1NMLHJlYXNvbiwxMjcsQ0VSVF9DQl9FUlJPUgorU1NMLHJlYXNvbiwxMjgsQ0VSVF9MRU5HVEhfTUlTTUFUQ0gKK1NTTCxyZWFzb24sMTI5LENIQU5ORUxfSURfTk9UX1AyNTYKK1NTTCxyZWFzb24sMTMwLENIQU5ORUxfSURfU0lHTkFUVVJFX0lOVkFMSUQKK1NTTCxyZWFzb24sMTMxLENJUEhFUl9DT0RFX1dST05HX0xFTkdUSAorU1NMLHJlYXNvbiwxMzIsQ0lQSEVSX09SX0hBU0hfVU5BVkFJTEFCTEUKK1NTTCxyZWFzb24sMTMzLENMSUVOVEhFTExPX1BBUlNFX0ZBSUxFRAorU1NMLHJlYXNvbiwxMzQsQ0xJRU5USEVMTE9fVExTRVhUCitTU0wscmVhc29uLDEzNSxDT05ORUNUSU9OX1JFSkVDVEVECitTU0wscmVhc29uLDEzNixDT05ORUNUSU9OX1RZUEVfTk9UX1NFVAorU1NMLHJlYXNvbiwxMzcsQ09PS0lFX01JU01BVENICitTU0wscmVhc29uLDEzOCxEMklfRUNEU0FfU0lHCitTU0wscmVhc29uLDEzOSxEQVRBX0JFVFdFRU5fQ0NTX0FORF9GSU5JU0hFRAorU1NMLHJlYXNvbiwxNDAsREFUQV9MRU5HVEhfVE9PX0xPTkcKK1NTTCxyZWFzb24sMTQxLERFQ09ERV9FUlJPUgorU1NMLHJlYXNvbiwxNDIsREVDUllQVElPTl9GQUlMRUQKK1NTTCxyZWFzb24sMTQzLERFQ1JZUFRJT05fRkFJTEVEX09SX0JBRF9SRUNPUkRfTUFDCitTU0wscmVhc29uLDE0NCxESF9QVUJMSUNfVkFMVUVfTEVOR1RIX0lTX1dST05HCitTU0wscmVhc29uLDE0NSxESUdFU1RfQ0hFQ0tfRkFJTEVECitTU0wscmVhc29uLDE0NixEVExTX01FU1NBR0VfVE9PX0JJRworU1NMLHJlYXNvbiwxNDcsRUNDX0NFUlRfTk9UX0ZPUl9TSUdOSU5HCitTU0wscmVhc29uLDE0OCxFTVBUWV9TUlRQX1BST1RFQ1RJT05fUFJPRklMRV9MSVNUCitTU0wscmVhc29uLDI3NixFTVNfU1RBVEVfSU5DT05TSVNURU5UCitTU0wscmVhc29uLDE0OSxFTkNSWVBURURfTEVOR1RIX1RPT19MT05HCitTU0wscmVhc29uLDE1MCxFUlJPUl9JTl9SRUNFSVZFRF9DSVBIRVJfTElTVAorU1NMLHJlYXNvbiwxNTEsRVZQX0RJR0VTVFNJR05GSU5BTF9GQUlMRUQKK1NTTCxyZWFzb24sMTUyLEVWUF9ESUdFU1RTSUdOSU5JVF9GQUlMRUQKK1NTTCxyZWFzb24sMTUzLEVYQ0VTU0lWRV9NRVNTQUdFX1NJWkUKK1NTTCxyZWFzb24sMTU0LEVYVFJBX0RBVEFfSU5fTUVTU0FHRQorU1NMLHJlYXNvbiwyNzEsRlJBR01FTlRfTUlTTUFUQ0gKK1NTTCxyZWFzb24sMTU1LEdPVF9BX0ZJTl9CRUZPUkVfQV9DQ1MKK1NTTCxyZWFzb24sMTU2LEdPVF9DSEFOTkVMX0lEX0JFRk9SRV9BX0NDUworU1NMLHJlYXNvbiwxNTcsR09UX05FWFRfUFJPVE9fQkVGT1JFX0FfQ0NTCitTU0wscmVhc29uLDE1OCxHT1RfTkVYVF9QUk9UT19XSVRIT1VUX0VYVEVOU0lPTgorU1NMLHJlYXNvbiwxNTksSEFORFNIQUtFX0ZBSUxVUkVfT05fQ0xJRU5UX0hFTExPCitTU0wscmVhc29uLDE2MCxIQU5EU0hBS0VfUkVDT1JEX0JFRk9SRV9DQ1MKK1NTTCxyZWFzb24sMTYxLEhUVFBTX1BST1hZX1JFUVVFU1QKK1NTTCxyZWFzb24sMTYyLEhUVFBfUkVRVUVTVAorU1NMLHJlYXNvbiwxNjMsSU5BUFBST1BSSUFURV9GQUxMQkFDSworU1NMLHJlYXNvbiwxNjQsSU5WQUxJRF9DT01NQU5ECitTU0wscmVhc29uLDE2NSxJTlZBTElEX01FU1NBR0UKK1NTTCxyZWFzb24sMTY2LElOVkFMSURfU1NMX1NFU1NJT04KK1NTTCxyZWFzb24sMTY3LElOVkFMSURfVElDS0VUX0tFWVNfTEVOR1RICitTU0wscmVhc29uLDE2OCxMRU5HVEhfTUlTTUFUQ0gKK1NTTCxyZWFzb24sMTY5LExJQlJBUllfSEFTX05PX0NJUEhFUlMKK1NTTCxyZWFzb24sMTcwLE1JU1NJTkdfREhfS0VZCitTU0wscmVhc29uLDE3MSxNSVNTSU5HX0VDRFNBX1NJR05JTkdfQ0VSVAorU1NMLHJlYXNvbiwxNzIsTUlTU0lOR19SU0FfQ0VSVElGSUNBVEUKK1NTTCxyZWFzb24sMTczLE1JU1NJTkdfUlNBX0VOQ1JZUFRJTkdfQ0VSVAorU1NMLHJlYXNvbiwxNzQsTUlTU0lOR19SU0FfU0lHTklOR19DRVJUCitTU0wscmVhc29uLDE3NSxNSVNTSU5HX1RNUF9ESF9LRVkKK1NTTCxyZWFzb24sMTc2LE1JU1NJTkdfVE1QX0VDREhfS0VZCitTU0wscmVhc29uLDE3NyxNSVhFRF9TUEVDSUFMX09QRVJBVE9SX1dJVEhfR1JPVVBTCitTU0wscmVhc29uLDE3OCxNVFVfVE9PX1NNQUxMCitTU0wscmVhc29uLDE3OSxORVNURURfR1JPVVAKK1NTTCxyZWFzb24sMTgwLE5PX0NFUlRJRklDQVRFU19SRVRVUk5FRAorU1NMLHJlYXNvbiwxODEsTk9fQ0VSVElGSUNBVEVfQVNTSUdORUQKK1NTTCxyZWFzb24sMTgyLE5PX0NFUlRJRklDQVRFX1NFVAorU1NMLHJlYXNvbiwxODMsTk9fQ0lQSEVSU19BVkFJTEFCTEUKK1NTTCxyZWFzb24sMTg0LE5PX0NJUEhFUlNfUEFTU0VECitTU0wscmVhc29uLDE4NSxOT19DSVBIRVJTX1NQRUNJRklFRAorU1NMLHJlYXNvbiwxODYsTk9fQ0lQSEVSX01BVENICitTU0wscmVhc29uLDE4NyxOT19DT01QUkVTU0lPTl9TUEVDSUZJRUQKK1NTTCxyZWFzb24sMTg4LE5PX01FVEhPRF9TUEVDSUZJRUQKK1NTTCxyZWFzb24sMTg5LE5PX1AyNTZfU1VQUE9SVAorU1NMLHJlYXNvbiwxOTAsTk9fUFJJVkFURV9LRVlfQVNTSUdORUQKK1NTTCxyZWFzb24sMTkxLE5PX1JFTkVHT1RJQVRJT04KK1NTTCxyZWFzb24sMTkyLE5PX1JFUVVJUkVEX0RJR0VTVAorU1NMLHJlYXNvbiwxOTMsTk9fU0hBUkVEX0NJUEhFUgorU1NMLHJlYXNvbiwxOTQsTk9fU0hBUkVEX1NJR0FUVVJFX0FMR09SSVRITVMKK1NTTCxyZWFzb24sMTk1LE5PX1NSVFBfUFJPRklMRVMKK1NTTCxyZWFzb24sMTk2LE5VTExfU1NMX0NUWAorU1NMLHJlYXNvbiwxOTcsTlVMTF9TU0xfTUVUSE9EX1BBU1NFRAorU1NMLHJlYXNvbiwxOTgsT0xEX1NFU1NJT05fQ0lQSEVSX05PVF9SRVRVUk5FRAorU1NMLHJlYXNvbiwyNzMsT0xEX1NFU1NJT05fVkVSU0lPTl9OT1RfUkVUVVJORUQKK1NTTCxyZWFzb24sMjc0LE9VVFBVVF9BTElBU0VTX0lOUFVUCitTU0wscmVhc29uLDE5OSxQQUNLRVRfTEVOR1RIX1RPT19MT05HCitTU0wscmVhc29uLDIwMCxQQVJTRV9UTFNFWFQKK1NTTCxyZWFzb24sMjAxLFBBVEhfVE9PX0xPTkcKK1NTTCxyZWFzb24sMjAyLFBFRVJfRElEX05PVF9SRVRVUk5fQV9DRVJUSUZJQ0FURQorU1NMLHJlYXNvbiwyMDMsUEVFUl9FUlJPUl9VTlNVUFBPUlRFRF9DRVJUSUZJQ0FURV9UWVBFCitTU0wscmVhc29uLDIwNCxQUk9UT0NPTF9JU19TSFVURE9XTgorU1NMLHJlYXNvbiwyMDUsUFNLX0lERU5USVRZX05PVF9GT1VORAorU1NMLHJlYXNvbiwyMDYsUFNLX05PX0NMSUVOVF9DQgorU1NMLHJlYXNvbiwyMDcsUFNLX05PX1NFUlZFUl9DQgorU1NMLHJlYXNvbiwyMDgsUkVBRF9CSU9fTk9UX1NFVAorU1NMLHJlYXNvbiwyMDksUkVBRF9USU1FT1VUX0VYUElSRUQKK1NTTCxyZWFzb24sMjEwLFJFQ09SRF9MRU5HVEhfTUlTTUFUQ0gKK1NTTCxyZWFzb24sMjExLFJFQ09SRF9UT09fTEFSR0UKK1NTTCxyZWFzb24sMjEyLFJFTkVHT1RJQVRFX0VYVF9UT09fTE9ORworU1NMLHJlYXNvbiwyMTMsUkVORUdPVElBVElPTl9FTkNPRElOR19FUlIKK1NTTCxyZWFzb24sMjE0LFJFTkVHT1RJQVRJT05fTUlTTUFUQ0gKK1NTTCxyZWFzb24sMjE1LFJFUVVJUkVEX0NJUEhFUl9NSVNTSU5HCitTU0wscmVhc29uLDI3NSxSRVNVTUVEX0VNU19TRVNTSU9OX1dJVEhPVVRfRU1TX0VYVEVOU0lPTgorU1NMLHJlYXNvbiwyNzcsUkVTVU1FRF9OT05fRU1TX1NFU1NJT05fV0lUSF9FTVNfRVhURU5TSU9OCitTU0wscmVhc29uLDIxNixTQ1NWX1JFQ0VJVkVEX1dIRU5fUkVORUdPVElBVElORworU1NMLHJlYXNvbiwyMTcsU0VSVkVSSEVMTE9fVExTRVhUCitTU0wscmVhc29uLDIxOCxTRVNTSU9OX0lEX0NPTlRFWFRfVU5JTklUSUFMSVpFRAorU1NMLHJlYXNvbiwyMTksU0VTU0lPTl9NQVlfTk9UX0JFX0NSRUFURUQKK1NTTCxyZWFzb24sMjIwLFNJR05BVFVSRV9BTEdPUklUSE1TX0VSUk9SCitTU0wscmVhc29uLDIyMSxTUlRQX0NPVUxEX05PVF9BTExPQ0FURV9QUk9GSUxFUworU1NMLHJlYXNvbiwyMjIsU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfTElTVF9UT09fTE9ORworU1NMLHJlYXNvbiwyMjMsU1JUUF9VTktOT1dOX1BST1RFQ1RJT05fUFJPRklMRQorU1NMLHJlYXNvbiwyMjQsU1NMM19FWFRfSU5WQUxJRF9TRVJWRVJOQU1FCitTU0wscmVhc29uLDIyNSxTU0wzX0VYVF9JTlZBTElEX1NFUlZFUk5BTUVfVFlQRQorU1NMLHJlYXNvbiwxMDQyLFNTTFYzX0FMRVJUX0JBRF9DRVJUSUZJQ0FURQorU1NMLHJlYXNvbiwxMDIwLFNTTFYzX0FMRVJUX0JBRF9SRUNPUkRfTUFDCitTU0wscmVhc29uLDEwNDUsU1NMVjNfQUxFUlRfQ0VSVElGSUNBVEVfRVhQSVJFRAorU1NMLHJlYXNvbiwxMDQ0LFNTTFYzX0FMRVJUX0NFUlRJRklDQVRFX1JFVk9LRUQKK1NTTCxyZWFzb24sMTA0NixTU0xWM19BTEVSVF9DRVJUSUZJQ0FURV9VTktOT1dOCitTU0wscmVhc29uLDEwMDAsU1NMVjNfQUxFUlRfQ0xPU0VfTk9USUZZCitTU0wscmVhc29uLDEwMzAsU1NMVjNfQUxFUlRfREVDT01QUkVTU0lPTl9GQUlMVVJFCitTU0wscmVhc29uLDEwNDAsU1NMVjNfQUxFUlRfSEFORFNIQUtFX0ZBSUxVUkUKK1NTTCxyZWFzb24sMTA0NyxTU0xWM19BTEVSVF9JTExFR0FMX1BBUkFNRVRFUgorU1NMLHJlYXNvbiwxMDQxLFNTTFYzX0FMRVJUX05PX0NFUlRJRklDQVRFCitTU0wscmVhc29uLDEwMTAsU1NMVjNfQUxFUlRfVU5FWFBFQ1RFRF9NRVNTQUdFCitTU0wscmVhc29uLDEwNDMsU1NMVjNfQUxFUlRfVU5TVVBQT1JURURfQ0VSVElGSUNBVEUKK1NTTCxyZWFzb24sMjI2LFNTTF9DVFhfSEFTX05PX0RFRkFVTFRfU1NMX1ZFUlNJT04KK1NTTCxyZWFzb24sMjI3LFNTTF9IQU5EU0hBS0VfRkFJTFVSRQorU1NMLHJlYXNvbiwyMjgsU1NMX1NFU1NJT05fSURfQ0FMTEJBQ0tfRkFJTEVECitTU0wscmVhc29uLDIyOSxTU0xfU0VTU0lPTl9JRF9DT05GTElDVAorU1NMLHJlYXNvbiwyMzAsU1NMX1NFU1NJT05fSURfQ09OVEVYVF9UT09fTE9ORworU1NMLHJlYXNvbiwyMzEsU1NMX1NFU1NJT05fSURfSEFTX0JBRF9MRU5HVEgKK1NTTCxyZWFzb24sMTA0OSxUTFNWMV9BTEVSVF9BQ0NFU1NfREVOSUVECitTU0wscmVhc29uLDEwNTAsVExTVjFfQUxFUlRfREVDT0RFX0VSUk9SCitTU0wscmVhc29uLDEwMjEsVExTVjFfQUxFUlRfREVDUllQVElPTl9GQUlMRUQKK1NTTCxyZWFzb24sMTA1MSxUTFNWMV9BTEVSVF9ERUNSWVBUX0VSUk9SCitTU0wscmVhc29uLDEwNjAsVExTVjFfQUxFUlRfRVhQT1JUX1JFU1RSSUNUSU9OCitTU0wscmVhc29uLDEwODYsVExTVjFfQUxFUlRfSU5BUFBST1BSSUFURV9GQUxMQkFDSworU1NMLHJlYXNvbiwxMDcxLFRMU1YxX0FMRVJUX0lOU1VGRklDSUVOVF9TRUNVUklUWQorU1NMLHJlYXNvbiwxMDgwLFRMU1YxX0FMRVJUX0lOVEVSTkFMX0VSUk9SCitTU0wscmVhc29uLDExMDAsVExTVjFfQUxFUlRfTk9fUkVORUdPVElBVElPTgorU1NMLHJlYXNvbiwxMDcwLFRMU1YxX0FMRVJUX1BST1RPQ09MX1ZFUlNJT04KK1NTTCxyZWFzb24sMTAyMixUTFNWMV9BTEVSVF9SRUNPUkRfT1ZFUkZMT1cKK1NTTCxyZWFzb24sMTA0OCxUTFNWMV9BTEVSVF9VTktOT1dOX0NBCitTU0wscmVhc29uLDEwOTAsVExTVjFfQUxFUlRfVVNFUl9DQU5DRUxMRUQKK1NTTCxyZWFzb24sMTExNCxUTFNWMV9CQURfQ0VSVElGSUNBVEVfSEFTSF9WQUxVRQorU1NMLHJlYXNvbiwxMTEzLFRMU1YxX0JBRF9DRVJUSUZJQ0FURV9TVEFUVVNfUkVTUE9OU0UKK1NTTCxyZWFzb24sMTExMSxUTFNWMV9DRVJUSUZJQ0FURV9VTk9CVEFJTkFCTEUKK1NTTCxyZWFzb24sMTExMixUTFNWMV9VTlJFQ09HTklaRURfTkFNRQorU1NMLHJlYXNvbiwxMTEwLFRMU1YxX1VOU1VQUE9SVEVEX0VYVEVOU0lPTgorU1NMLHJlYXNvbiwyMzIsVExTX0NMSUVOVF9DRVJUX1JFUV9XSVRIX0FOT05fQ0lQSEVSCitTU0wscmVhc29uLDIzMyxUTFNfSUxMRUdBTF9FWFBPUlRFUl9MQUJFTAorU1NMLHJlYXNvbiwyMzQsVExTX0lOVkFMSURfRUNQT0lOVEZPUk1BVF9MSVNUCitTU0wscmVhc29uLDIzNSxUTFNfUEVFUl9ESURfTk9UX1JFU1BPTkRfV0lUSF9DRVJUSUZJQ0FURV9MSVNUCitTU0wscmVhc29uLDIzNixUTFNfUlNBX0VOQ1JZUFRFRF9WQUxVRV9MRU5HVEhfSVNfV1JPTkcKK1NTTCxyZWFzb24sMjM3LFRPT19NQU5ZX0VNUFRZX0ZSQUdNRU5UUworU1NMLHJlYXNvbiwyMzgsVU5BQkxFX1RPX0ZJTkRfRUNESF9QQVJBTUVURVJTCitTU0wscmVhc29uLDIzOSxVTkFCTEVfVE9fRklORF9QVUJMSUNfS0VZX1BBUkFNRVRFUlMKK1NTTCxyZWFzb24sMjQwLFVORVhQRUNURURfR1JPVVBfQ0xPU0UKK1NTTCxyZWFzb24sMjQxLFVORVhQRUNURURfTUVTU0FHRQorU1NMLHJlYXNvbiwyNDIsVU5FWFBFQ1RFRF9PUEVSQVRPUl9JTl9HUk9VUAorU1NMLHJlYXNvbiwyNDMsVU5FWFBFQ1RFRF9SRUNPUkQKK1NTTCxyZWFzb24sMjQ0LFVOSU5JVElBTElaRUQKK1NTTCxyZWFzb24sMjQ1LFVOS05PV05fQUxFUlRfVFlQRQorU1NMLHJlYXNvbiwyNDYsVU5LTk9XTl9DRVJUSUZJQ0FURV9UWVBFCitTU0wscmVhc29uLDI0NyxVTktOT1dOX0NJUEhFUl9SRVRVUk5FRAorU1NMLHJlYXNvbiwyNDgsVU5LTk9XTl9DSVBIRVJfVFlQRQorU1NMLHJlYXNvbiwyNDksVU5LTk9XTl9ESUdFU1QKK1NTTCxyZWFzb24sMjUwLFVOS05PV05fS0VZX0VYQ0hBTkdFX1RZUEUKK1NTTCxyZWFzb24sMjUxLFVOS05PV05fUFJPVE9DT0wKK1NTTCxyZWFzb24sMjUyLFVOS05PV05fU1NMX1ZFUlNJT04KK1NTTCxyZWFzb24sMjUzLFVOS05PV05fU1RBVEUKK1NTTCxyZWFzb24sMjU0LFVOUFJPQ0VTU0VEX0hBTkRTSEFLRV9EQVRBCitTU0wscmVhc29uLDI1NSxVTlNBRkVfTEVHQUNZX1JFTkVHT1RJQVRJT05fRElTQUJMRUQKK1NTTCxyZWFzb24sMjU2LFVOU1VQUE9SVEVEX0NJUEhFUgorU1NMLHJlYXNvbiwyNTcsVU5TVVBQT1JURURfQ09NUFJFU1NJT05fQUxHT1JJVEhNCitTU0wscmVhc29uLDI1OCxVTlNVUFBPUlRFRF9FTExJUFRJQ19DVVJWRQorU1NMLHJlYXNvbiwyNTksVU5TVVBQT1JURURfUFJPVE9DT0wKK1NTTCxyZWFzb24sMjYwLFVOU1VQUE9SVEVEX1NTTF9WRVJTSU9OCitTU0wscmVhc29uLDI2MSxVU0VfU1JUUF9OT1RfTkVHT1RJQVRFRAorU1NMLHJlYXNvbiwyNjIsV1JPTkdfQ0VSVElGSUNBVEVfVFlQRQorU1NMLHJlYXNvbiwyNjMsV1JPTkdfQ0lQSEVSX1JFVFVSTkVECitTU0wscmVhc29uLDI2NCxXUk9OR19DVVJWRQorU1NMLHJlYXNvbiwyNjUsV1JPTkdfTUVTU0FHRV9UWVBFCitTU0wscmVhc29uLDI2NixXUk9OR19TSUdOQVRVUkVfVFlQRQorU1NMLHJlYXNvbiwyNjcsV1JPTkdfU1NMX1ZFUlNJT04KK1NTTCxyZWFzb24sMjY4LFdST05HX1ZFUlNJT05fTlVNQkVSCitTU0wscmVhc29uLDI2OSxYNTA5X0xJQgorU1NMLHJlYXNvbiwyNzAsWDUwOV9WRVJJRklDQVRJT05fU0VUVVBfUFJPQkxFTVMKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXJyL3g1MDkuZXJyb3JkYXRhIGIvc3JjL2NyeXB0by9lcnIveDUwOS5lcnJvcmRhdGEKaW5kZXggZjQ4MjhjZS4uMWI1MGUzNiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lcnIveDUwOS5lcnJvcmRhdGEKKysrIGIvc3JjL2NyeXB0by9lcnIveDUwOS5lcnJvcmRhdGEKQEAgLTEsMzcgKzEsOTYgQEAKLVg1MDksMTAwLEFLSURfTUlTTUFUQ0gKLVg1MDksMTAxLEJBRF9QS0NTN19WRVJTSU9OCi1YNTA5LDEwMixCQURfWDUwOV9GSUxFVFlQRQotWDUwOSwxMDMsQkFTRTY0X0RFQ09ERV9FUlJPUgotWDUwOSwxMDQsQ0FOVF9DSEVDS19ESF9LRVkKLVg1MDksMTA1LENFUlRfQUxSRUFEWV9JTl9IQVNIX1RBQkxFCi1YNTA5LDEwNixDUkxfQUxSRUFEWV9ERUxUQQotWDUwOSwxMDcsQ1JMX1ZFUklGWV9GQUlMVVJFCi1YNTA5LDEwOCxJRFBfTUlTTUFUQ0gKLVg1MDksMTA5LElOVkFMSURfQklUX1NUUklOR19CSVRTX0xFRlQKLVg1MDksMTEwLElOVkFMSURfRElSRUNUT1JZCi1YNTA5LDExMSxJTlZBTElEX0ZJRUxEX05BTUUKLVg1MDksMTEyLElOVkFMSURfVFJVU1QKLVg1MDksMTEzLElTU1VFUl9NSVNNQVRDSAotWDUwOSwxMTQsS0VZX1RZUEVfTUlTTUFUQ0gKLVg1MDksMTE1LEtFWV9WQUxVRVNfTUlTTUFUQ0gKLVg1MDksMTE2LExPQURJTkdfQ0VSVF9ESVIKLVg1MDksMTE3LExPQURJTkdfREVGQVVMVFMKLVg1MDksMTE4LE1FVEhPRF9OT1RfU1VQUE9SVEVECi1YNTA5LDExOSxORVdFUl9DUkxfTk9UX05FV0VSCi1YNTA5LDEyMCxOT1RfUEtDUzdfU0lHTkVEX0RBVEEKLVg1MDksMTIxLE5PX0NFUlRJRklDQVRFU19JTkNMVURFRAotWDUwOSwxMjIsTk9fQ0VSVF9TRVRfRk9SX1VTX1RPX1ZFUklGWQotWDUwOSwxMzYsTk9fQ1JMU19JTkNMVURFRAotWDUwOSwxMjMsTk9fQ1JMX05VTUJFUgotWDUwOSwxMjQsUFVCTElDX0tFWV9ERUNPREVfRVJST1IKLVg1MDksMTI1LFBVQkxJQ19LRVlfRU5DT0RFX0VSUk9SCi1YNTA5LDEyNixTSE9VTERfUkVUUlkKLVg1MDksMTI3LFVOQUJMRV9UT19GSU5EX1BBUkFNRVRFUlNfSU5fQ0hBSU4KLVg1MDksMTI4LFVOQUJMRV9UT19HRVRfQ0VSVFNfUFVCTElDX0tFWQotWDUwOSwxMjksVU5LTk9XTl9LRVlfVFlQRQotWDUwOSwxMzAsVU5LTk9XTl9OSUQKLVg1MDksMTMxLFVOS05PV05fUFVSUE9TRV9JRAotWDUwOSwxMzIsVU5LTk9XTl9UUlVTVF9JRAotWDUwOSwxMzMsVU5TVVBQT1JURURfQUxHT1JJVEhNCi1YNTA5LDEzNCxXUk9OR19MT09LVVBfVFlQRQotWDUwOSwxMzUsV1JPTkdfVFlQRQorWDUwOSxmdW5jdGlvbiwxMDAsQVNOMV9kaWdlc3QKK1g1MDksZnVuY3Rpb24sMTAxLEFTTjFfaXRlbV9zaWduX2N0eAorWDUwOSxmdW5jdGlvbiwxMDIsQVNOMV9pdGVtX3ZlcmlmeQorWDUwOSxmdW5jdGlvbiwxMDMsTkVUU0NBUEVfU1BLSV9iNjRfZGVjb2RlCitYNTA5LGZ1bmN0aW9uLDEwNCxORVRTQ0FQRV9TUEtJX2I2NF9lbmNvZGUKK1g1MDksZnVuY3Rpb24sMTU4LFBLQ1M3X2dldF9DUkxzCitYNTA5LGZ1bmN0aW9uLDEwNSxQS0NTN19nZXRfY2VydGlmaWNhdGVzCitYNTA5LGZ1bmN0aW9uLDEwNixYNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfTklECitYNTA5LGZ1bmN0aW9uLDEwNyxYNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfT0JKCitYNTA5LGZ1bmN0aW9uLDEwOCxYNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfdHh0CitYNTA5LGZ1bmN0aW9uLDEwOSxYNTA5X0FUVFJJQlVURV9nZXQwX2RhdGEKK1g1MDksZnVuY3Rpb24sMTEwLFg1MDlfQVRUUklCVVRFX3NldDFfZGF0YQorWDUwOSxmdW5jdGlvbiwxMTEsWDUwOV9DUkxfYWRkMF9yZXZva2VkCitYNTA5LGZ1bmN0aW9uLDExMixYNTA5X0NSTF9kaWZmCitYNTA5LGZ1bmN0aW9uLDExMyxYNTA5X0NSTF9wcmludF9mcAorWDUwOSxmdW5jdGlvbiwxMTQsWDUwOV9FWFRFTlNJT05fY3JlYXRlX2J5X05JRAorWDUwOSxmdW5jdGlvbiwxMTUsWDUwOV9FWFRFTlNJT05fY3JlYXRlX2J5X09CSgorWDUwOSxmdW5jdGlvbiwxMTYsWDUwOV9JTkZPX25ldworWDUwOSxmdW5jdGlvbiwxMTcsWDUwOV9OQU1FX0VOVFJZX2NyZWF0ZV9ieV9OSUQKK1g1MDksZnVuY3Rpb24sMTE4LFg1MDlfTkFNRV9FTlRSWV9jcmVhdGVfYnlfdHh0CitYNTA5LGZ1bmN0aW9uLDExOSxYNTA5X05BTUVfRU5UUllfc2V0X29iamVjdAorWDUwOSxmdW5jdGlvbiwxMjAsWDUwOV9OQU1FX2FkZF9lbnRyeQorWDUwOSxmdW5jdGlvbiwxMjEsWDUwOV9OQU1FX29uZWxpbmUKK1g1MDksZnVuY3Rpb24sMTIyLFg1MDlfTkFNRV9wcmludAorWDUwOSxmdW5jdGlvbiwxMjMsWDUwOV9QS0VZX25ldworWDUwOSxmdW5jdGlvbiwxMjQsWDUwOV9QVUJLRVlfZ2V0CitYNTA5LGZ1bmN0aW9uLDEyNSxYNTA5X1BVQktFWV9zZXQKK1g1MDksZnVuY3Rpb24sMTI2LFg1MDlfUkVRX2NoZWNrX3ByaXZhdGVfa2V5CitYNTA5LGZ1bmN0aW9uLDEyNyxYNTA5X1JFUV90b19YNTA5CitYNTA5LGZ1bmN0aW9uLDEyOCxYNTA5X1NUT1JFX0NUWF9nZXQxX2lzc3VlcgorWDUwOSxmdW5jdGlvbiwxMjksWDUwOV9TVE9SRV9DVFhfaW5pdAorWDUwOSxmdW5jdGlvbiwxMzAsWDUwOV9TVE9SRV9DVFhfbmV3CitYNTA5LGZ1bmN0aW9uLDEzMSxYNTA5X1NUT1JFX0NUWF9wdXJwb3NlX2luaGVyaXQKK1g1MDksZnVuY3Rpb24sMTMyLFg1MDlfU1RPUkVfYWRkX2NlcnQKK1g1MDksZnVuY3Rpb24sMTMzLFg1MDlfU1RPUkVfYWRkX2NybAorWDUwOSxmdW5jdGlvbiwxMzQsWDUwOV9UUlVTVF9hZGQKK1g1MDksZnVuY3Rpb24sMTM1LFg1MDlfVFJVU1Rfc2V0CitYNTA5LGZ1bmN0aW9uLDEzNixYNTA5X2NoZWNrX3ByaXZhdGVfa2V5CitYNTA5LGZ1bmN0aW9uLDEzNyxYNTA5X2dldF9wdWJrZXlfcGFyYW1ldGVycworWDUwOSxmdW5jdGlvbiwxMzgsWDUwOV9sb2FkX2NlcnRfY3JsX2ZpbGUKK1g1MDksZnVuY3Rpb24sMTM5LFg1MDlfbG9hZF9jZXJ0X2ZpbGUKK1g1MDksZnVuY3Rpb24sMTQwLFg1MDlfbG9hZF9jcmxfZmlsZQorWDUwOSxmdW5jdGlvbiwxNDEsWDUwOV9wcmludF9leF9mcAorWDUwOSxmdW5jdGlvbiwxNDIsWDUwOV90b19YNTA5X1JFUQorWDUwOSxmdW5jdGlvbiwxNDMsWDUwOV92ZXJpZnlfY2VydAorWDUwOSxmdW5jdGlvbiwxNDQsWDUwOWF0X2FkZDFfYXR0cgorWDUwOSxmdW5jdGlvbiwxNDUsWDUwOXYzX2FkZF9leHQKK1g1MDksZnVuY3Rpb24sMTQ2LGFkZF9jZXJ0X2RpcgorWDUwOSxmdW5jdGlvbiwxNDcsYnlfZmlsZV9jdHJsCitYNTA5LGZ1bmN0aW9uLDE0OCxjaGVja19wb2xpY3kKK1g1MDksZnVuY3Rpb24sMTQ5LGRpcl9jdHJsCitYNTA5LGZ1bmN0aW9uLDE1MCxnZXRfY2VydF9ieV9zdWJqZWN0CitYNTA5LGZ1bmN0aW9uLDE1MSxpMmRfRFNBX1BVQktFWQorWDUwOSxmdW5jdGlvbiwxNTIsaTJkX0VDX1BVQktFWQorWDUwOSxmdW5jdGlvbiwxNTMsaTJkX1JTQV9QVUJLRVkKK1g1MDksZnVuY3Rpb24sMTU3LHBrY3M3X3BhcnNlX2hlYWRlcgorWDUwOSxmdW5jdGlvbiwxNTQseDUwOV9uYW1lX2VuY29kZQorWDUwOSxmdW5jdGlvbiwxNTUseDUwOV9uYW1lX2V4X2QyaQorWDUwOSxmdW5jdGlvbiwxNTYseDUwOV9uYW1lX2V4X25ldworWDUwOSxyZWFzb24sMTAwLEFLSURfTUlTTUFUQ0gKK1g1MDkscmVhc29uLDEwMSxCQURfUEtDUzdfVkVSU0lPTgorWDUwOSxyZWFzb24sMTAyLEJBRF9YNTA5X0ZJTEVUWVBFCitYNTA5LHJlYXNvbiwxMDMsQkFTRTY0X0RFQ09ERV9FUlJPUgorWDUwOSxyZWFzb24sMTA0LENBTlRfQ0hFQ0tfREhfS0VZCitYNTA5LHJlYXNvbiwxMDUsQ0VSVF9BTFJFQURZX0lOX0hBU0hfVEFCTEUKK1g1MDkscmVhc29uLDEwNixDUkxfQUxSRUFEWV9ERUxUQQorWDUwOSxyZWFzb24sMTA3LENSTF9WRVJJRllfRkFJTFVSRQorWDUwOSxyZWFzb24sMTA4LElEUF9NSVNNQVRDSAorWDUwOSxyZWFzb24sMTA5LElOVkFMSURfQklUX1NUUklOR19CSVRTX0xFRlQKK1g1MDkscmVhc29uLDExMCxJTlZBTElEX0RJUkVDVE9SWQorWDUwOSxyZWFzb24sMTExLElOVkFMSURfRklFTERfTkFNRQorWDUwOSxyZWFzb24sMTEyLElOVkFMSURfVFJVU1QKK1g1MDkscmVhc29uLDExMyxJU1NVRVJfTUlTTUFUQ0gKK1g1MDkscmVhc29uLDExNCxLRVlfVFlQRV9NSVNNQVRDSAorWDUwOSxyZWFzb24sMTE1LEtFWV9WQUxVRVNfTUlTTUFUQ0gKK1g1MDkscmVhc29uLDExNixMT0FESU5HX0NFUlRfRElSCitYNTA5LHJlYXNvbiwxMTcsTE9BRElOR19ERUZBVUxUUworWDUwOSxyZWFzb24sMTE4LE1FVEhPRF9OT1RfU1VQUE9SVEVECitYNTA5LHJlYXNvbiwxMTksTkVXRVJfQ1JMX05PVF9ORVdFUgorWDUwOSxyZWFzb24sMTIwLE5PVF9QS0NTN19TSUdORURfREFUQQorWDUwOSxyZWFzb24sMTIxLE5PX0NFUlRJRklDQVRFU19JTkNMVURFRAorWDUwOSxyZWFzb24sMTIyLE5PX0NFUlRfU0VUX0ZPUl9VU19UT19WRVJJRlkKK1g1MDkscmVhc29uLDEzNixOT19DUkxTX0lOQ0xVREVECitYNTA5LHJlYXNvbiwxMjMsTk9fQ1JMX05VTUJFUgorWDUwOSxyZWFzb24sMTI0LFBVQkxJQ19LRVlfREVDT0RFX0VSUk9SCitYNTA5LHJlYXNvbiwxMjUsUFVCTElDX0tFWV9FTkNPREVfRVJST1IKK1g1MDkscmVhc29uLDEyNixTSE9VTERfUkVUUlkKK1g1MDkscmVhc29uLDEyNyxVTkFCTEVfVE9fRklORF9QQVJBTUVURVJTX0lOX0NIQUlOCitYNTA5LHJlYXNvbiwxMjgsVU5BQkxFX1RPX0dFVF9DRVJUU19QVUJMSUNfS0VZCitYNTA5LHJlYXNvbiwxMjksVU5LTk9XTl9LRVlfVFlQRQorWDUwOSxyZWFzb24sMTMwLFVOS05PV05fTklECitYNTA5LHJlYXNvbiwxMzEsVU5LTk9XTl9QVVJQT1NFX0lECitYNTA5LHJlYXNvbiwxMzIsVU5LTk9XTl9UUlVTVF9JRAorWDUwOSxyZWFzb24sMTMzLFVOU1VQUE9SVEVEX0FMR09SSVRITQorWDUwOSxyZWFzb24sMTM0LFdST05HX0xPT0tVUF9UWVBFCitYNTA5LHJlYXNvbiwxMzUsV1JPTkdfVFlQRQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lcnIveDUwOXYzLmVycm9yZGF0YSBiL3NyYy9jcnlwdG8vZXJyL3g1MDl2My5lcnJvcmRhdGEKaW5kZXggZTUzYjc4MC4uMDU5ZTY3NyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lcnIveDUwOXYzLmVycm9yZGF0YQorKysgYi9zcmMvY3J5cHRvL2Vyci94NTA5djMuZXJyb3JkYXRhCkBAIC0xLDYzICsxLDEyMCBAQAotWDUwOVYzLDEwMCxCQURfSVBfQUREUkVTUwotWDUwOVYzLDEwMSxCQURfT0JKRUNUCi1YNTA5VjMsMTAyLEJOX0RFQzJCTl9FUlJPUgotWDUwOVYzLDEwMyxCTl9UT19BU04xX0lOVEVHRVJfRVJST1IKLVg1MDlWMywxMDQsQ0FOTk9UX0ZJTkRfRlJFRV9GVU5DVElPTgotWDUwOVYzLDEwNSxESVJOQU1FX0VSUk9SCi1YNTA5VjMsMTA2LERJU1RQT0lOVF9BTFJFQURZX1NFVAotWDUwOVYzLDEwNyxEVVBMSUNBVEVfWk9ORV9JRAotWDUwOVYzLDEwOCxFUlJPUl9DT05WRVJUSU5HX1pPTkUKLVg1MDlWMywxMDksRVJST1JfQ1JFQVRJTkdfRVhURU5TSU9OCi1YNTA5VjMsMTEwLEVSUk9SX0lOX0VYVEVOU0lPTgotWDUwOVYzLDExMSxFWFBFQ1RFRF9BX1NFQ1RJT05fTkFNRQotWDUwOVYzLDExMixFWFRFTlNJT05fRVhJU1RTCi1YNTA5VjMsMTEzLEVYVEVOU0lPTl9OQU1FX0VSUk9SCi1YNTA5VjMsMTE0LEVYVEVOU0lPTl9OT1RfRk9VTkQKLVg1MDlWMywxMTUsRVhURU5TSU9OX1NFVFRJTkdfTk9UX1NVUFBPUlRFRAotWDUwOVYzLDExNixFWFRFTlNJT05fVkFMVUVfRVJST1IKLVg1MDlWMywxMTcsSUxMRUdBTF9FTVBUWV9FWFRFTlNJT04KLVg1MDlWMywxMTgsSUxMRUdBTF9IRVhfRElHSVQKLVg1MDlWMywxMTksSU5DT1JSRUNUX1BPTElDWV9TWU5UQVhfVEFHCi1YNTA5VjMsMTIwLElOVkFMSURfQk9PTEVBTl9TVFJJTkcKLVg1MDlWMywxMjEsSU5WQUxJRF9FWFRFTlNJT05fU1RSSU5HCi1YNTA5VjMsMTIyLElOVkFMSURfTVVMVElQTEVfUkROUwotWDUwOVYzLDEyMyxJTlZBTElEX05BTUUKLVg1MDlWMywxMjQsSU5WQUxJRF9OVUxMX0FSR1VNRU5UCi1YNTA5VjMsMTI1LElOVkFMSURfTlVMTF9OQU1FCi1YNTA5VjMsMTI2LElOVkFMSURfTlVMTF9WQUxVRQotWDUwOVYzLDEyNyxJTlZBTElEX05VTUJFUgotWDUwOVYzLDEyOCxJTlZBTElEX05VTUJFUlMKLVg1MDlWMywxMjksSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUgotWDUwOVYzLDEzMCxJTlZBTElEX09QVElPTgotWDUwOVYzLDEzMSxJTlZBTElEX1BPTElDWV9JREVOVElGSUVSCi1YNTA5VjMsMTMyLElOVkFMSURfUFJPWFlfUE9MSUNZX1NFVFRJTkcKLVg1MDlWMywxMzMsSU5WQUxJRF9QVVJQT1NFCi1YNTA5VjMsMTM0LElOVkFMSURfU0VDVElPTgotWDUwOVYzLDEzNSxJTlZBTElEX1NZTlRBWAotWDUwOVYzLDEzNixJU1NVRVJfREVDT0RFX0VSUk9SCi1YNTA5VjMsMTM3LE1JU1NJTkdfVkFMVUUKLVg1MDlWMywxMzgsTkVFRF9PUkdBTklaQVRJT05fQU5EX05VTUJFUlMKLVg1MDlWMywxMzksTk9fQ09ORklHX0RBVEFCQVNFCi1YNTA5VjMsMTQwLE5PX0lTU1VFUl9DRVJUSUZJQ0FURQotWDUwOVYzLDE0MSxOT19JU1NVRVJfREVUQUlMUwotWDUwOVYzLDE0MixOT19QT0xJQ1lfSURFTlRJRklFUgotWDUwOVYzLDE0MyxOT19QUk9YWV9DRVJUX1BPTElDWV9MQU5HVUFHRV9ERUZJTkVECi1YNTA5VjMsMTQ0LE5PX1BVQkxJQ19LRVkKLVg1MDlWMywxNDUsTk9fU1VCSkVDVF9ERVRBSUxTCi1YNTA5VjMsMTQ2LE9ERF9OVU1CRVJfT0ZfRElHSVRTCi1YNTA5VjMsMTQ3LE9QRVJBVElPTl9OT1RfREVGSU5FRAotWDUwOVYzLDE0OCxPVEhFUk5BTUVfRVJST1IKLVg1MDlWMywxNDksUE9MSUNZX0xBTkdVQUdFX0FMUkVBRFlfREVGSU5FRAotWDUwOVYzLDE1MCxQT0xJQ1lfUEFUSF9MRU5HVEgKLVg1MDlWMywxNTEsUE9MSUNZX1BBVEhfTEVOR1RIX0FMUkVBRFlfREVGSU5FRAotWDUwOVYzLDE1MixQT0xJQ1lfV0hFTl9QUk9YWV9MQU5HVUFHRV9SRVFVSVJFU19OT19QT0xJQ1kKLVg1MDlWMywxNTMsU0VDVElPTl9OT1RfRk9VTkQKLVg1MDlWMywxNTQsVU5BQkxFX1RPX0dFVF9JU1NVRVJfREVUQUlMUwotWDUwOVYzLDE1NSxVTkFCTEVfVE9fR0VUX0lTU1VFUl9LRVlJRAotWDUwOVYzLDE1NixVTktOT1dOX0JJVF9TVFJJTkdfQVJHVU1FTlQKLVg1MDlWMywxNTcsVU5LTk9XTl9FWFRFTlNJT04KLVg1MDlWMywxNTgsVU5LTk9XTl9FWFRFTlNJT05fTkFNRQotWDUwOVYzLDE1OSxVTktOT1dOX09QVElPTgotWDUwOVYzLDE2MCxVTlNVUFBPUlRFRF9PUFRJT04KLVg1MDlWMywxNjEsVU5TVVBQT1JURURfVFlQRQotWDUwOVYzLDE2MixVU0VSX1RPT19MT05HCitYNTA5VjMsZnVuY3Rpb24sMTAwLFNYTkVUX2FkZF9pZF9JTlRFR0VSCitYNTA5VjMsZnVuY3Rpb24sMTAxLFNYTkVUX2FkZF9pZF9hc2MKK1g1MDlWMyxmdW5jdGlvbiwxMDIsU1hORVRfYWRkX2lkX3Vsb25nCitYNTA5VjMsZnVuY3Rpb24sMTAzLFNYTkVUX2dldF9pZF9hc2MKK1g1MDlWMyxmdW5jdGlvbiwxMDQsU1hORVRfZ2V0X2lkX3Vsb25nCitYNTA5VjMsZnVuY3Rpb24sMTA1LFg1MDlWM19FWFRfYWRkCitYNTA5VjMsZnVuY3Rpb24sMTA2LFg1MDlWM19FWFRfYWRkX2FsaWFzCitYNTA5VjMsZnVuY3Rpb24sMTA3LFg1MDlWM19FWFRfZnJlZQorWDUwOVYzLGZ1bmN0aW9uLDEwOCxYNTA5VjNfRVhUX2kyZAorWDUwOVYzLGZ1bmN0aW9uLDEwOSxYNTA5VjNfRVhUX25jb25mCitYNTA5VjMsZnVuY3Rpb24sMTEwLFg1MDlWM19hZGQxX2kyZAorWDUwOVYzLGZ1bmN0aW9uLDExMSxYNTA5VjNfYWRkX3ZhbHVlCitYNTA5VjMsZnVuY3Rpb24sMTEyLFg1MDlWM19nZXRfc2VjdGlvbgorWDUwOVYzLGZ1bmN0aW9uLDExMyxYNTA5VjNfZ2V0X3N0cmluZworWDUwOVYzLGZ1bmN0aW9uLDExNCxYNTA5VjNfZ2V0X3ZhbHVlX2Jvb2wKK1g1MDlWMyxmdW5jdGlvbiwxMTUsWDUwOVYzX3BhcnNlX2xpc3QKK1g1MDlWMyxmdW5jdGlvbiwxMTYsWDUwOV9QVVJQT1NFX2FkZAorWDUwOVYzLGZ1bmN0aW9uLDExNyxYNTA5X1BVUlBPU0Vfc2V0CitYNTA5VjMsZnVuY3Rpb24sMTE4LGEyaV9HRU5FUkFMX05BTUUKK1g1MDlWMyxmdW5jdGlvbiwxMTksY29weV9lbWFpbAorWDUwOVYzLGZ1bmN0aW9uLDEyMCxjb3B5X2lzc3VlcgorWDUwOVYzLGZ1bmN0aW9uLDEyMSxkb19kaXJuYW1lCitYNTA5VjMsZnVuY3Rpb24sMTIyLGRvX2V4dF9pMmQKK1g1MDlWMyxmdW5jdGlvbiwxMjMsZG9fZXh0X25jb25mCitYNTA5VjMsZnVuY3Rpb24sMTI0LGduYW1lc19mcm9tX3NlY3RuYW1lCitYNTA5VjMsZnVuY3Rpb24sMTI1LGhleF90b19zdHJpbmcKK1g1MDlWMyxmdW5jdGlvbiwxMjYsaTJzX0FTTjFfRU5VTUVSQVRFRAorWDUwOVYzLGZ1bmN0aW9uLDEyNyxpMnNfQVNOMV9JQTVTVFJJTkcKK1g1MDlWMyxmdW5jdGlvbiwxMjgsaTJzX0FTTjFfSU5URUdFUgorWDUwOVYzLGZ1bmN0aW9uLDEyOSxpMnZfQVVUSE9SSVRZX0lORk9fQUNDRVNTCitYNTA5VjMsZnVuY3Rpb24sMTMwLG5vdGljZV9zZWN0aW9uCitYNTA5VjMsZnVuY3Rpb24sMTMxLG5yZWZfbm9zCitYNTA5VjMsZnVuY3Rpb24sMTMyLHBvbGljeV9zZWN0aW9uCitYNTA5VjMsZnVuY3Rpb24sMTMzLHByb2Nlc3NfcGNpX3ZhbHVlCitYNTA5VjMsZnVuY3Rpb24sMTM0LHIyaV9jZXJ0cG9sCitYNTA5VjMsZnVuY3Rpb24sMTM1LHIyaV9wY2kKK1g1MDlWMyxmdW5jdGlvbiwxMzYsczJpX0FTTjFfSUE1U1RSSU5HCitYNTA5VjMsZnVuY3Rpb24sMTM3LHMyaV9BU04xX0lOVEVHRVIKK1g1MDlWMyxmdW5jdGlvbiwxMzgsczJpX0FTTjFfT0NURVRfU1RSSU5HCitYNTA5VjMsZnVuY3Rpb24sMTM5LHMyaV9za2V5X2lkCitYNTA5VjMsZnVuY3Rpb24sMTQwLHNldF9kaXN0X3BvaW50X25hbWUKK1g1MDlWMyxmdW5jdGlvbiwxNDEsc3RyaW5nX3RvX2hleAorWDUwOVYzLGZ1bmN0aW9uLDE0Mix2MmlfQVNOMV9CSVRfU1RSSU5HCitYNTA5VjMsZnVuY3Rpb24sMTQzLHYyaV9BVVRIT1JJVFlfSU5GT19BQ0NFU1MKK1g1MDlWMyxmdW5jdGlvbiwxNDQsdjJpX0FVVEhPUklUWV9LRVlJRAorWDUwOVYzLGZ1bmN0aW9uLDE0NSx2MmlfQkFTSUNfQ09OU1RSQUlOVFMKK1g1MDlWMyxmdW5jdGlvbiwxNDYsdjJpX0VYVEVOREVEX0tFWV9VU0FHRQorWDUwOVYzLGZ1bmN0aW9uLDE0Nyx2MmlfR0VORVJBTF9OQU1FUworWDUwOVYzLGZ1bmN0aW9uLDE0OCx2MmlfR0VORVJBTF9OQU1FX2V4CitYNTA5VjMsZnVuY3Rpb24sMTQ5LHYyaV9OQU1FX0NPTlNUUkFJTlRTCitYNTA5VjMsZnVuY3Rpb24sMTUwLHYyaV9QT0xJQ1lfQ09OU1RSQUlOVFMKK1g1MDlWMyxmdW5jdGlvbiwxNTEsdjJpX1BPTElDWV9NQVBQSU5HUworWDUwOVYzLGZ1bmN0aW9uLDE1Mix2MmlfY3JsZAorWDUwOVYzLGZ1bmN0aW9uLDE1Myx2MmlfaWRwCitYNTA5VjMsZnVuY3Rpb24sMTU0LHYyaV9pc3N1ZXJfYWx0CitYNTA5VjMsZnVuY3Rpb24sMTU1LHYyaV9zdWJqZWN0X2FsdAorWDUwOVYzLGZ1bmN0aW9uLDE1Nix2M19nZW5lcmljX2V4dGVuc2lvbgorWDUwOVYzLHJlYXNvbiwxMDAsQkFEX0lQX0FERFJFU1MKK1g1MDlWMyxyZWFzb24sMTAxLEJBRF9PQkpFQ1QKK1g1MDlWMyxyZWFzb24sMTAyLEJOX0RFQzJCTl9FUlJPUgorWDUwOVYzLHJlYXNvbiwxMDMsQk5fVE9fQVNOMV9JTlRFR0VSX0VSUk9SCitYNTA5VjMscmVhc29uLDEwNCxDQU5OT1RfRklORF9GUkVFX0ZVTkNUSU9OCitYNTA5VjMscmVhc29uLDEwNSxESVJOQU1FX0VSUk9SCitYNTA5VjMscmVhc29uLDEwNixESVNUUE9JTlRfQUxSRUFEWV9TRVQKK1g1MDlWMyxyZWFzb24sMTA3LERVUExJQ0FURV9aT05FX0lECitYNTA5VjMscmVhc29uLDEwOCxFUlJPUl9DT05WRVJUSU5HX1pPTkUKK1g1MDlWMyxyZWFzb24sMTA5LEVSUk9SX0NSRUFUSU5HX0VYVEVOU0lPTgorWDUwOVYzLHJlYXNvbiwxMTAsRVJST1JfSU5fRVhURU5TSU9OCitYNTA5VjMscmVhc29uLDExMSxFWFBFQ1RFRF9BX1NFQ1RJT05fTkFNRQorWDUwOVYzLHJlYXNvbiwxMTIsRVhURU5TSU9OX0VYSVNUUworWDUwOVYzLHJlYXNvbiwxMTMsRVhURU5TSU9OX05BTUVfRVJST1IKK1g1MDlWMyxyZWFzb24sMTE0LEVYVEVOU0lPTl9OT1RfRk9VTkQKK1g1MDlWMyxyZWFzb24sMTE1LEVYVEVOU0lPTl9TRVRUSU5HX05PVF9TVVBQT1JURUQKK1g1MDlWMyxyZWFzb24sMTE2LEVYVEVOU0lPTl9WQUxVRV9FUlJPUgorWDUwOVYzLHJlYXNvbiwxMTcsSUxMRUdBTF9FTVBUWV9FWFRFTlNJT04KK1g1MDlWMyxyZWFzb24sMTE4LElMTEVHQUxfSEVYX0RJR0lUCitYNTA5VjMscmVhc29uLDExOSxJTkNPUlJFQ1RfUE9MSUNZX1NZTlRBWF9UQUcKK1g1MDlWMyxyZWFzb24sMTIwLElOVkFMSURfQk9PTEVBTl9TVFJJTkcKK1g1MDlWMyxyZWFzb24sMTIxLElOVkFMSURfRVhURU5TSU9OX1NUUklORworWDUwOVYzLHJlYXNvbiwxMjIsSU5WQUxJRF9NVUxUSVBMRV9SRE5TCitYNTA5VjMscmVhc29uLDEyMyxJTlZBTElEX05BTUUKK1g1MDlWMyxyZWFzb24sMTI0LElOVkFMSURfTlVMTF9BUkdVTUVOVAorWDUwOVYzLHJlYXNvbiwxMjUsSU5WQUxJRF9OVUxMX05BTUUKK1g1MDlWMyxyZWFzb24sMTI2LElOVkFMSURfTlVMTF9WQUxVRQorWDUwOVYzLHJlYXNvbiwxMjcsSU5WQUxJRF9OVU1CRVIKK1g1MDlWMyxyZWFzb24sMTI4LElOVkFMSURfTlVNQkVSUworWDUwOVYzLHJlYXNvbiwxMjksSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUgorWDUwOVYzLHJlYXNvbiwxMzAsSU5WQUxJRF9PUFRJT04KK1g1MDlWMyxyZWFzb24sMTMxLElOVkFMSURfUE9MSUNZX0lERU5USUZJRVIKK1g1MDlWMyxyZWFzb24sMTMyLElOVkFMSURfUFJPWFlfUE9MSUNZX1NFVFRJTkcKK1g1MDlWMyxyZWFzb24sMTMzLElOVkFMSURfUFVSUE9TRQorWDUwOVYzLHJlYXNvbiwxMzQsSU5WQUxJRF9TRUNUSU9OCitYNTA5VjMscmVhc29uLDEzNSxJTlZBTElEX1NZTlRBWAorWDUwOVYzLHJlYXNvbiwxMzYsSVNTVUVSX0RFQ09ERV9FUlJPUgorWDUwOVYzLHJlYXNvbiwxMzcsTUlTU0lOR19WQUxVRQorWDUwOVYzLHJlYXNvbiwxMzgsTkVFRF9PUkdBTklaQVRJT05fQU5EX05VTUJFUlMKK1g1MDlWMyxyZWFzb24sMTM5LE5PX0NPTkZJR19EQVRBQkFTRQorWDUwOVYzLHJlYXNvbiwxNDAsTk9fSVNTVUVSX0NFUlRJRklDQVRFCitYNTA5VjMscmVhc29uLDE0MSxOT19JU1NVRVJfREVUQUlMUworWDUwOVYzLHJlYXNvbiwxNDIsTk9fUE9MSUNZX0lERU5USUZJRVIKK1g1MDlWMyxyZWFzb24sMTQzLE5PX1BST1hZX0NFUlRfUE9MSUNZX0xBTkdVQUdFX0RFRklORUQKK1g1MDlWMyxyZWFzb24sMTQ0LE5PX1BVQkxJQ19LRVkKK1g1MDlWMyxyZWFzb24sMTQ1LE5PX1NVQkpFQ1RfREVUQUlMUworWDUwOVYzLHJlYXNvbiwxNDYsT0REX05VTUJFUl9PRl9ESUdJVFMKK1g1MDlWMyxyZWFzb24sMTQ3LE9QRVJBVElPTl9OT1RfREVGSU5FRAorWDUwOVYzLHJlYXNvbiwxNDgsT1RIRVJOQU1FX0VSUk9SCitYNTA5VjMscmVhc29uLDE0OSxQT0xJQ1lfTEFOR1VBR0VfQUxSRUFEWV9ERUZJTkVECitYNTA5VjMscmVhc29uLDE1MCxQT0xJQ1lfUEFUSF9MRU5HVEgKK1g1MDlWMyxyZWFzb24sMTUxLFBPTElDWV9QQVRIX0xFTkdUSF9BTFJFQURZX0RFRklORUQKK1g1MDlWMyxyZWFzb24sMTUyLFBPTElDWV9XSEVOX1BST1hZX0xBTkdVQUdFX1JFUVVJUkVTX05PX1BPTElDWQorWDUwOVYzLHJlYXNvbiwxNTMsU0VDVElPTl9OT1RfRk9VTkQKK1g1MDlWMyxyZWFzb24sMTU0LFVOQUJMRV9UT19HRVRfSVNTVUVSX0RFVEFJTFMKK1g1MDlWMyxyZWFzb24sMTU1LFVOQUJMRV9UT19HRVRfSVNTVUVSX0tFWUlECitYNTA5VjMscmVhc29uLDE1NixVTktOT1dOX0JJVF9TVFJJTkdfQVJHVU1FTlQKK1g1MDlWMyxyZWFzb24sMTU3LFVOS05PV05fRVhURU5TSU9OCitYNTA5VjMscmVhc29uLDE1OCxVTktOT1dOX0VYVEVOU0lPTl9OQU1FCitYNTA5VjMscmVhc29uLDE1OSxVTktOT1dOX09QVElPTgorWDUwOVYzLHJlYXNvbiwxNjAsVU5TVVBQT1JURURfT1BUSU9OCitYNTA5VjMscmVhc29uLDE2MSxVTlNVUFBPUlRFRF9UWVBFCitYNTA5VjMscmVhc29uLDE2MixVU0VSX1RPT19MT05HCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2V2cC9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vZXZwL0NNYWtlTGlzdHMudHh0CmluZGV4IDVkMmU5MTguLjU3NjlmYTQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXZwL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vZXZwL0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCiAKIGFkZF9saWJyYXJ5KAogICBldnAKQEAgLTYsMTMgKzYsMTUgQEAKICAgT0JKRUNUCiAKICAgYWxnb3JpdGhtLmMKKyAgYXNuMS5jCiAgIGRpZ2VzdHNpZ24uYwogICBldnAuYwotICBldnBfYXNuMS5jCiAgIGV2cF9jdHguYwogICBwX2RzYV9hc24xLmMKICAgcF9lYy5jCiAgIHBfZWNfYXNuMS5jCisgIHBfaG1hYy5jCisgIHBfaG1hY19hc24xLmMKICAgcF9yc2EuYwogICBwX3JzYV9hc24xLmMKICAgcGJrZGYuYwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ldnAvYWxnb3JpdGhtLmMgYi9zcmMvY3J5cHRvL2V2cC9hbGdvcml0aG0uYwppbmRleCA2M2JjNzdhLi5lYTI4ZGZhIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2V2cC9hbGdvcml0aG0uYworKysgYi9zcmMvY3J5cHRvL2V2cC9hbGdvcml0aG0uYwpAQCAtNzQsNyArNzQsOCBAQAogICBkaWdlc3QgPSBFVlBfTURfQ1RYX21kKGN0eCk7CiAgIHBrZXkgPSBFVlBfUEtFWV9DVFhfZ2V0MF9wa2V5KGN0eC0+cGN0eCk7CiAgIGlmICghZGlnZXN0IHx8ICFwa2V5KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9DT05URVhUX05PVF9JTklUSUFMSVNFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfRGlnZXN0U2lnbkFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9DT05URVhUX05PVF9JTklUSUFMSVNFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtOTYsNyArOTcsOCBAQAogICAgKiB0aGF0LiAqLwogICBpZiAoIU9CSl9maW5kX3NpZ2lkX2J5X2FsZ3MoJnNpZ25fbmlkLCBFVlBfTURfdHlwZShkaWdlc3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtleS0+YW1ldGgtPnBrZXlfaWQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9ESUdFU1RfQU5EX0tFWV9UWVBFX05PVF9TVVBQT1JURUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX0RpZ2VzdFNpZ25BbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAgICAgRVZQX1JfRElHRVNUX0FORF9LRVlfVFlQRV9OT1RfU1VQUE9SVEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xMjAsMjEgKzEyMiwyNCBAQAogICAvKiBDb252ZXJ0IHNpZ25hdHVyZSBPSUQgaW50byBkaWdlc3QgYW5kIHB1YmxpYyBrZXkgT0lEcyAqLwogICBpZiAoIU9CSl9maW5kX3NpZ2lkX2FsZ3MoT0JKX29iajJuaWQoYWxnb3ItPmFsZ29yaXRobSksICZkaWdlc3RfbmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBrZXlfbmlkKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfVU5LTk9XTl9TSUdOQVRVUkVfQUxHT1JJVEhNKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9EaWdlc3RWZXJpZnlJbml0RnJvbUFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9VTktOT1dOX1NJR05BVFVSRV9BTEdPUklUSE0pOwogICAgIHJldHVybiAwOwogICB9CiAKICAgLyogQ2hlY2sgcHVibGljIGtleSBPSUQgbWF0Y2hlcyBwdWJsaWMga2V5IHR5cGUgKi8KICAgYW1ldGggPSBFVlBfUEtFWV9hc24xX2ZpbmQoTlVMTCwgcGtleV9uaWQpOwogICBpZiAoYW1ldGggPT0gTlVMTCB8fCBhbWV0aC0+cGtleV9pZCAhPSBwa2V5LT5hbWV0aC0+cGtleV9pZCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfV1JPTkdfUFVCTElDX0tFWV9UWVBFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9EaWdlc3RWZXJpZnlJbml0RnJvbUFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9XUk9OR19QVUJMSUNfS0VZX1RZUEUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgLyogTklEX3VuZGVmIHNpZ25hbHMgdGhhdCB0aGVyZSBhcmUgY3VzdG9tIHBhcmFtZXRlcnMgdG8gc2V0LiAqLwogICBpZiAoZGlnZXN0X25pZCA9PSBOSURfdW5kZWYpIHsKICAgICBpZiAoIXBrZXktPmFtZXRoIHx8ICFwa2V5LT5hbWV0aC0+ZGlnZXN0X3ZlcmlmeV9pbml0X2Zyb21fYWxnb3JpdGhtKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX1VOS05PV05fU0lHTkFUVVJFX0FMR09SSVRITSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9EaWdlc3RWZXJpZnlJbml0RnJvbUFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX1VOS05PV05fU0lHTkFUVVJFX0FMR09SSVRITSk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTE0NCw3ICsxNDksOCBAQAogICAvKiBPdGhlcndpc2UsIGluaXRpYWxpemUgd2l0aCB0aGUgZGlnZXN0IGZyb20gdGhlIE9JRC4gKi8KICAgZGlnZXN0ID0gRVZQX2dldF9kaWdlc3RieW5pZChkaWdlc3RfbmlkKTsKICAgaWYgKGRpZ2VzdCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9VTktOT1dOX01FU1NBR0VfRElHRVNUX0FMR09SSVRITSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfRGlnZXN0VmVyaWZ5SW5pdEZyb21BbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAgICAgRVZQX1JfVU5LTk9XTl9NRVNTQUdFX0RJR0VTVF9BTEdPUklUSE0pOwogICAgIHJldHVybiAwOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXZwL2V2cF9hc24xLmMgYi9zcmMvY3J5cHRvL2V2cC9hc24xLmMKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gc3JjL2NyeXB0by9ldnAvZXZwX2FzbjEuYwpyZW5hbWUgdG8gc3JjL2NyeXB0by9ldnAvYXNuMS5jCmluZGV4IDM1NmM2MmIuLjNkZjlmNTIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXZwL2V2cF9hc24xLmMKKysrIGIvc3JjL2NyeXB0by9ldnAvYXNuMS5jCkBAIC03MSw3ICs3MSw3IEBACiAgIGlmIChvdXQgPT0gTlVMTCB8fCAqb3V0ID09IE5VTEwpIHsKICAgICByZXQgPSBFVlBfUEtFWV9uZXcoKTsKICAgICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX1JfRVZQX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGQyaV9Qcml2YXRlS2V5LCBFUlJfUl9FVlBfTElCKTsKICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgfSBlbHNlIHsKQEAgLTc5LDcgKzc5LDcgQEAKICAgfQogCiAgIGlmICghRVZQX1BLRVlfc2V0X3R5cGUocmV0LCB0eXBlKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfVU5LTk9XTl9QVUJMSUNfS0VZX1RZUEUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZDJpX1ByaXZhdGVLZXksIEVWUF9SX1VOS05PV05fUFVCTElDX0tFWV9UWVBFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC05NCw3ICs5NCw3IEBACiAgICAgICByZXQgPSBFVlBfUEtDUzgyUEtFWShwOCk7CiAgICAgICBQS0NTOF9QUklWX0tFWV9JTkZPX2ZyZWUocDgpOwogICAgIH0gZWxzZSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX0FTTjFfTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZDJpX1ByaXZhdGVLZXksIEVSUl9SX0FTTjFfTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfQpAQCAtMTM0LDcgKzEzNCw4IEBACiAKICAgICBza19BU04xX1RZUEVfcG9wX2ZyZWUoaW5rZXksIEFTTjFfVFlQRV9mcmVlKTsKICAgICBpZiAoIXA4KSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX1VOU1VQUE9SVEVEX1BVQkxJQ19LRVlfVFlQRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGQyaV9BdXRvUHJpdmF0ZUtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX1VOU1VQUE9SVEVEX1BVQkxJQ19LRVlfVFlQRSk7CiAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgcmV0ID0gRVZQX1BLQ1M4MlBLRVkocDgpOwpAQCAtMTYwLDcgKzE2MSw3IEBACiAgICAgY2FzZSBFVlBfUEtFWV9FQzoKICAgICAgIHJldHVybiBpMm9fRUNQdWJsaWNLZXkoa2V5LT5wa2V5LmVjLCBvdXRwKTsKICAgICBkZWZhdWx0OgotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9VTlNVUFBPUlRFRF9QVUJMSUNfS0VZX1RZUEUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBpMmRfUHVibGljS2V5LCBFVlBfUl9VTlNVUFBPUlRFRF9QVUJMSUNfS0VZX1RZUEUpOwogICAgICAgcmV0dXJuIC0xOwogICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2V2cC9kaWdlc3RzaWduLmMgYi9zcmMvY3J5cHRvL2V2cC9kaWdlc3RzaWduLmMKaW5kZXggY2NiNGRlNC4uYzE2M2Q0MCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ldnAvZGlnZXN0c2lnbi5jCisrKyBiL3NyYy9jcnlwdG8vZXZwL2RpZ2VzdHNpZ24uYwpAQCAtNjIsOSArNjIsMTcgQEAKICNpbmNsdWRlICIuLi9kaWdlc3QvaW50ZXJuYWwuaCIKIAogCisvKiBtZF9iZWdpbl9kaWdzZXQgaXMgYSBjYWxsYmFjayBmcm9tIHRoZSB8RVZQX01EX0NUWHwgY29kZSB0aGF0IGlzIGNhbGxlZCB3aGVuCisgKiBhIG5ldyBkaWdlc3QgaXMgYmVndW4uICovCitzdGF0aWMgaW50IG1kX2JlZ2luX2RpZ2VzdChFVlBfTURfQ1RYICpjdHgpIHsKKyAgcmV0dXJuIEVWUF9QS0VZX0NUWF9jdHJsKGN0eC0+cGN0eCwgLTEsIEVWUF9QS0VZX09QX1RZUEVfU0lHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1BLRVlfQ1RSTF9ESUdFU1RJTklULCAwLCBjdHgpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV2cF9tZF9wY3R4X29wcyBtZF9wY3R4X29wcyA9IHsKICAgRVZQX1BLRVlfQ1RYX2ZyZWUsCiAgIEVWUF9QS0VZX0NUWF9kdXAsCisgIG1kX2JlZ2luX2RpZ2VzdCwKIH07CiAKIHN0YXRpYyBpbnQgZG9fc2lndmVyX2luaXQoRVZQX01EX0NUWCAqY3R4LCBFVlBfUEtFWV9DVFggKipwY3R4LApAQCAtODMsMTYgKzkxLDI2IEBACiAgIH0KIAogICBpZiAodHlwZSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9OT19ERUZBVUxUX0RJR0VTVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkb19zaWd2ZXJfaW5pdCwgRVZQX1JfTk9fREVGQVVMVF9ESUdFU1QpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGlzX3ZlcmlmeSkgewotICAgIGlmICghRVZQX1BLRVlfdmVyaWZ5X2luaXQoY3R4LT5wY3R4KSkgeworICAgIGlmIChjdHgtPnBjdHgtPnBtZXRoLT52ZXJpZnljdHhfaW5pdCkgeworICAgICAgaWYgKCFjdHgtPnBjdHgtPnBtZXRoLT52ZXJpZnljdHhfaW5pdChjdHgtPnBjdHgsIGN0eCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBjdHgtPnBjdHgtPm9wZXJhdGlvbiA9IEVWUF9QS0VZX09QX1ZFUklGWUNUWDsKKyAgICB9IGVsc2UgaWYgKCFFVlBfUEtFWV92ZXJpZnlfaW5pdChjdHgtPnBjdHgpKSB7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgaWYgKCFFVlBfUEtFWV9zaWduX2luaXQoY3R4LT5wY3R4KSkgeworICAgIGlmIChjdHgtPnBjdHgtPnBtZXRoLT5zaWduY3R4X2luaXQpIHsKKyAgICAgIGlmICghY3R4LT5wY3R4LT5wbWV0aC0+c2lnbmN0eF9pbml0KGN0eC0+cGN0eCwgY3R4KSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGN0eC0+cGN0eC0+b3BlcmF0aW9uID0gRVZQX1BLRVlfT1BfU0lHTkNUWDsKKyAgICB9IGVsc2UgaWYgKCFFVlBfUEtFWV9zaWduX2luaXQoY3R4LT5wY3R4KSkgewogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICB9CkBAIC0xMjgsMzcgKzE0Niw1OSBAQAogCiBpbnQgRVZQX0RpZ2VzdFNpZ25GaW5hbChFVlBfTURfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dF9zaWcsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm91dF9zaWdfbGVuKSB7CisgIGludCByID0gMDsKKyAgY29uc3QgaW50IGhhc19zaWduY3R4ID0gY3R4LT5wY3R4LT5wbWV0aC0+c2lnbmN0eCAhPSBOVUxMOworCiAgIGlmIChvdXRfc2lnKSB7CiAgICAgRVZQX01EX0NUWCB0bXBfY3R4OwotICAgIGludCByZXQ7CiAgICAgdWludDhfdCBtZFtFVlBfTUFYX01EX1NJWkVdOwogICAgIHVuc2lnbmVkIGludCBtZGxlbjsKIAogICAgIEVWUF9NRF9DVFhfaW5pdCgmdG1wX2N0eCk7Ci0gICAgcmV0ID0gRVZQX01EX0NUWF9jb3B5X2V4KCZ0bXBfY3R4LCBjdHgpICYmCi0gICAgICAgICAgRVZQX0RpZ2VzdEZpbmFsX2V4KCZ0bXBfY3R4LCBtZCwgJm1kbGVuKSAmJgotICAgICAgICAgIEVWUF9QS0VZX3NpZ24oY3R4LT5wY3R4LCBvdXRfc2lnLCBvdXRfc2lnX2xlbiwgbWQsIG1kbGVuKTsKKyAgICBpZiAoIUVWUF9NRF9DVFhfY29weV9leCgmdG1wX2N0eCwgY3R4KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChoYXNfc2lnbmN0eCkgeworICAgICAgciA9IHRtcF9jdHgucGN0eC0+cG1ldGgtPnNpZ25jdHgodG1wX2N0eC5wY3R4LCBvdXRfc2lnLCBvdXRfc2lnX2xlbiwgJnRtcF9jdHgpOworICAgIH0gZWxzZSB7CisgICAgICByID0gRVZQX0RpZ2VzdEZpbmFsX2V4KCZ0bXBfY3R4LCBtZCwgJm1kbGVuKTsKKyAgICAgIGlmIChyKSB7CisgICAgICAgIHIgPSBFVlBfUEtFWV9zaWduKGN0eC0+cGN0eCwgb3V0X3NpZywgb3V0X3NpZ19sZW4sIG1kLCBtZGxlbik7CisgICAgICB9CisgICAgfQogICAgIEVWUF9NRF9DVFhfY2xlYW51cCgmdG1wX2N0eCk7Ci0KLSAgICByZXR1cm4gcmV0OworICAgIHJldHVybiByOwogICB9IGVsc2UgewotICAgIHNpemVfdCBzID0gRVZQX01EX3NpemUoY3R4LT5kaWdlc3QpOwotICAgIHJldHVybiBFVlBfUEtFWV9zaWduKGN0eC0+cGN0eCwgb3V0X3NpZywgb3V0X3NpZ19sZW4sIE5VTEwsIHMpOworICAgIGlmIChoYXNfc2lnbmN0eCkgeworICAgICAgcmV0dXJuIGN0eC0+cGN0eC0+cG1ldGgtPnNpZ25jdHgoY3R4LT5wY3R4LCBvdXRfc2lnLCBvdXRfc2lnX2xlbiwgY3R4KTsKKyAgICB9IGVsc2UgeworICAgICAgc2l6ZV90IHMgPSBFVlBfTURfc2l6ZShjdHgtPmRpZ2VzdCk7CisgICAgICByZXR1cm4gRVZQX1BLRVlfc2lnbihjdHgtPnBjdHgsIG91dF9zaWcsIG91dF9zaWdfbGVuLCBOVUxMLCBzKTsKKyAgICB9CiAgIH0KIH0KIAogaW50IEVWUF9EaWdlc3RWZXJpZnlGaW5hbChFVlBfTURfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKnNpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpZ19sZW4pIHsKICAgRVZQX01EX0NUWCB0bXBfY3R4OwotICBpbnQgcmV0OwogICB1aW50OF90IG1kW0VWUF9NQVhfTURfU0laRV07CisgIGludCByOwogICB1bnNpZ25lZCBpbnQgbWRsZW47CiAKICAgRVZQX01EX0NUWF9pbml0KCZ0bXBfY3R4KTsKLSAgcmV0ID0gRVZQX01EX0NUWF9jb3B5X2V4KCZ0bXBfY3R4LCBjdHgpICYmCi0gICAgICAgIEVWUF9EaWdlc3RGaW5hbF9leCgmdG1wX2N0eCwgbWQsICZtZGxlbikgJiYKLSAgICAgICAgRVZQX1BLRVlfdmVyaWZ5KGN0eC0+cGN0eCwgc2lnLCBzaWdfbGVuLCBtZCwgbWRsZW4pOworICBpZiAoIUVWUF9NRF9DVFhfY29weV9leCgmdG1wX2N0eCwgY3R4KSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChjdHgtPnBjdHgtPnBtZXRoLT52ZXJpZnljdHgpIHsKKyAgICByID0gdG1wX2N0eC5wY3R4LT5wbWV0aC0+dmVyaWZ5Y3R4KHRtcF9jdHgucGN0eCwgc2lnLCBzaWdfbGVuLCAmdG1wX2N0eCk7CisgIH0gZWxzZSB7CisgICAgciA9IEVWUF9EaWdlc3RGaW5hbF9leCgmdG1wX2N0eCwgbWQsICZtZGxlbik7CisgICAgaWYgKHIpIHsKKyAgICAgIHIgPSBFVlBfUEtFWV92ZXJpZnkoY3R4LT5wY3R4LCBzaWcsIHNpZ19sZW4sIG1kLCBtZGxlbik7CisgICAgfQorICB9CisKICAgRVZQX01EX0NUWF9jbGVhbnVwKCZ0bXBfY3R4KTsKIAotICByZXR1cm4gcmV0OworICByZXR1cm4gcjsKIH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXZwL2V2cC5jIGIvc3JjL2NyeXB0by9ldnAvZXZwLmMKaW5kZXggNTgyMjM3OS4uMGFkNWMyNyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ldnAvZXZwLmMKKysrIGIvc3JjL2NyeXB0by9ldnAvZXZwLmMKQEAgLTc1LDYgKzc1LDcgQEAKIAogZXh0ZXJuIGNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EIGRzYV9hc24xX21ldGg7CiBleHRlcm4gY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgZWNfYXNuMV9tZXRoOworZXh0ZXJuIGNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EIGhtYWNfYXNuMV9tZXRoOwogZXh0ZXJuIGNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EIHJzYV9hc24xX21ldGg7CiAKIEVWUF9QS0VZICpFVlBfUEtFWV9uZXcodm9pZCkgewpAQCAtODIsNyArODMsNyBAQAogCiAgIHJldCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihFVlBfUEtFWSkpOwogICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKQEAgLTE1OCwxMiArMTU5LDEyIEBACiAKIGludCBFVlBfUEtFWV9jb3B5X3BhcmFtZXRlcnMoRVZQX1BLRVkgKnRvLCBjb25zdCBFVlBfUEtFWSAqZnJvbSkgewogICBpZiAodG8tPnR5cGUgIT0gZnJvbS0+dHlwZSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfRElGRkVSRU5UX0tFWV9UWVBFUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9jb3B5X3BhcmFtZXRlcnMsIEVWUF9SX0RJRkZFUkVOVF9LRVlfVFlQRVMpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKEVWUF9QS0VZX21pc3NpbmdfcGFyYW1ldGVycyhmcm9tKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfTUlTU0lOR19QQVJBTUVURVJTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2NvcHlfcGFyYW1ldGVycywgRVZQX1JfTUlTU0lOR19QQVJBTUVURVJTKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0yMDYsNiArMjA3LDggQEAKICAgICBjYXNlIEVWUF9QS0VZX1JTQToKICAgICBjYXNlIEVWUF9QS0VZX1JTQTI6CiAgICAgICByZXR1cm4gJnJzYV9hc24xX21ldGg7CisgICAgY2FzZSBFVlBfUEtFWV9ITUFDOgorICAgICAgcmV0dXJuICZobWFjX2FzbjFfbWV0aDsKICAgICBjYXNlIEVWUF9QS0VZX0VDOgogICAgICAgcmV0dXJuICZlY19hc24xX21ldGg7CiAgICAgY2FzZSBFVlBfUEtFWV9EU0E6CkBAIC0yMjMsNiArMjI2LDMyIEBACiAgIHJldHVybiBtZXRoLT5wa2V5X2lkOwogfQogCitFVlBfUEtFWSAqRVZQX1BLRVlfbmV3X21hY19rZXkoaW50IHR5cGUsIEVOR0lORSAqZSwgY29uc3QgdWludDhfdCAqbWFjX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWFjX2tleV9sZW4pIHsKKyAgRVZQX1BLRVlfQ1RYICptYWNfY3R4ID0gTlVMTDsKKyAgRVZQX1BLRVkgKnJldCA9IE5VTEw7CisKKyAgbWFjX2N0eCA9IEVWUF9QS0VZX0NUWF9uZXdfaWQodHlwZSwgZSk7CisgIGlmICghbWFjX2N0eCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKCFFVlBfUEtFWV9rZXlnZW5faW5pdChtYWNfY3R4KSB8fAorICAgICAgIUVWUF9QS0VZX0NUWF9jdHJsKG1hY19jdHgsIC0xLCBFVlBfUEtFWV9PUF9LRVlHRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1BLRVlfQ1RSTF9TRVRfTUFDX0tFWSwgbWFjX2tleV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKiltYWNfa2V5KSB8fAorICAgICAgIUVWUF9QS0VZX2tleWdlbihtYWNfY3R4LCAmcmV0KSkgeworICAgIHJldCA9IE5VTEw7CisgICAgZ290byBtZXJyOworICB9CisKK21lcnI6CisgIGlmIChtYWNfY3R4KSB7CisgICAgRVZQX1BLRVlfQ1RYX2ZyZWUobWFjX2N0eCk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKwogaW50IEVWUF9QS0VZX3NldDFfUlNBKEVWUF9QS0VZICpwa2V5LCBSU0EgKmtleSkgewogICBpZiAoRVZQX1BLRVlfYXNzaWduX1JTQShwa2V5LCBrZXkpKSB7CiAgICAgUlNBX3VwX3JlZihrZXkpOwpAQCAtMjM3LDcgKzI2Niw3IEBACiAKIFJTQSAqRVZQX1BLRVlfZ2V0MV9SU0EoRVZQX1BLRVkgKnBrZXkpIHsKICAgaWYgKHBrZXktPnR5cGUgIT0gRVZQX1BLRVlfUlNBKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9FWFBFQ1RJTkdfQU5fUlNBX0tFWSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9nZXQxX1JTQSwgRVZQX1JfRVhQRUNUSU5HX0FOX1JTQV9LRVkpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIFJTQV91cF9yZWYocGtleS0+cGtleS5yc2EpOwpAQCAtMjU4LDcgKzI4Nyw3IEBACiAKIERTQSAqRVZQX1BLRVlfZ2V0MV9EU0EoRVZQX1BLRVkgKnBrZXkpIHsKICAgaWYgKHBrZXktPnR5cGUgIT0gRVZQX1BLRVlfRFNBKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9FWFBFQ1RJTkdfQV9EU0FfS0VZKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2dldDFfRFNBLCBFVlBfUl9FWFBFQ1RJTkdfQV9EU0FfS0VZKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogICBEU0FfdXBfcmVmKHBrZXktPnBrZXkuZHNhKTsKQEAgLTI3OSw3ICszMDgsNyBAQAogCiBFQ19LRVkgKkVWUF9QS0VZX2dldDFfRUNfS0VZKEVWUF9QS0VZICpwa2V5KSB7CiAgIGlmIChwa2V5LT50eXBlICE9IEVWUF9QS0VZX0VDKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9FWFBFQ1RJTkdfQU5fRUNfS0VZX0tFWSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9nZXQxX0VDX0tFWSwgRVZQX1JfRVhQRUNUSU5HX0FOX0VDX0tFWV9LRVkpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIEVDX0tFWV91cF9yZWYocGtleS0+cGtleS5lYyk7CkBAIC0zMDAsNyArMzI5LDcgQEAKIAogREggKkVWUF9QS0VZX2dldDFfREgoRVZQX1BLRVkgKnBrZXkpIHsKICAgaWYgKHBrZXktPnR5cGUgIT0gRVZQX1BLRVlfREgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0VYUEVDVElOR19BX0RIX0tFWSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9nZXQxX0RILCBFVlBfUl9FWFBFQ1RJTkdfQV9ESF9LRVkpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIERIX3VwX3JlZihwa2V5LT5wa2V5LmRoKTsKQEAgLTMyMCwxMCArMzQ5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKSB7CiAgIGlmIChsZW4gPT0gMyAmJiBtZW1jbXAobmFtZSwgIlJTQSIsIDMpID09IDApIHsKICAgICByZXR1cm4gJnJzYV9hc24xX21ldGg7CisgIH0gZWxzZSBpZiAobGVuID09IDQgJiYgbWVtY21wKG5hbWUsICJITUFDIiwgNCkgPT0gMCkgeworICAgIHJldHVybiAmaG1hY19hc24xX21ldGg7CiAgIH0gaWYgKGxlbiA9PSAyICYmIG1lbWNtcChuYW1lLCAiRUMiLCAyKSA9PSAwKSB7CiAgICAgcmV0dXJuICZlY19hc24xX21ldGg7Ci0gIH0gZWxzZSBpZiAobGVuID09IDMgJiYgbWVtY21wKG5hbWUsICJEU0EiLCAzKSA9PSAwKSB7Ci0gICAgcmV0dXJuICZkc2FfYXNuMV9tZXRoOwogICB9CiAgIHJldHVybiBOVUxMOwogfQpAQCAtMzM3LDcgKzM2Niw3IEBACiAKICAgYW1ldGggPSBFVlBfUEtFWV9hc24xX2ZpbmQoTlVMTCwgdHlwZSk7CiAgIGlmIChhbWV0aCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9VTlNVUFBPUlRFRF9BTEdPUklUSE0pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfc2V0X3R5cGUsIEVWUF9SX1VOU1VQUE9SVEVEX0FMR09SSVRITSk7CiAgICAgRVJSX2FkZF9lcnJvcl9kYXRhZigiYWxnb3JpdGhtICVkICglcykiLCB0eXBlLCBPQkpfbmlkMnNuKHR5cGUpKTsKICAgICByZXR1cm4gMDsKICAgfQpAQCAtNDA3LDYgKzQzNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgKHZvaWQgKilvdXRfbWQpOwogfQogCitFVlBfUEtFWSAqRVZQX1BLRVlfZHVwKEVWUF9QS0VZICpwa2V5KSB7CisgIHJldHVybiBFVlBfUEtFWV91cF9yZWYocGtleSk7Cit9CisKIHZvaWQgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXModm9pZCkge30KIAogdm9pZCBPcGVuU1NMX2FkZF9hbGxfY2lwaGVycyh2b2lkKSB7fQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ldnAvZXZwX2N0eC5jIGIvc3JjL2NyeXB0by9ldnAvZXZwX2N0eC5jCmluZGV4IGE4ZTcxZmUuLjlmNDIyNzQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXZwL2V2cF9jdHguYworKysgYi9zcmMvY3J5cHRvL2V2cC9ldnBfY3R4LmMKQEAgLTY3LDEwICs2NywxMiBAQAogCiAKIGV4dGVybiBjb25zdCBFVlBfUEtFWV9NRVRIT0QgcnNhX3BrZXlfbWV0aDsKK2V4dGVybiBjb25zdCBFVlBfUEtFWV9NRVRIT0QgaG1hY19wa2V5X21ldGg7CiBleHRlcm4gY29uc3QgRVZQX1BLRVlfTUVUSE9EIGVjX3BrZXlfbWV0aDsKIAogc3RhdGljIGNvbnN0IEVWUF9QS0VZX01FVEhPRCAqY29uc3QgZXZwX21ldGhvZHNbXSA9IHsKICAgJnJzYV9wa2V5X21ldGgsCisgICZobWFjX3BrZXlfbWV0aCwKICAgJmVjX3BrZXlfbWV0aCwKIH07CiAKQEAgLTEwMCw3ICsxMDIsNyBAQAogICBwbWV0aCA9IGV2cF9wa2V5X21ldGhfZmluZChpZCk7CiAKICAgaWYgKHBtZXRoID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX1VOU1VQUE9SVEVEX0FMR09SSVRITSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBldnBfcGtleV9jdHhfbmV3LCBFVlBfUl9VTlNVUFBPUlRFRF9BTEdPUklUSE0pOwogICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBPQkpfbmlkMnNuKGlkKTsKICAgICBFUlJfYWRkX2Vycm9yX2RhdGFmKCJhbGdvcml0aG0gJWQgKCVzKSIsIGlkLCBuYW1lKTsKICAgICByZXR1cm4gTlVMTDsKQEAgLTEwOCw3ICsxMTAsNyBAQAogCiAgIHJldCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihFVlBfUEtFWV9DVFgpKTsKICAgaWYgKCFyZXQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGV2cF9wa2V5X2N0eF9uZXcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogICBtZW1zZXQocmV0LCAwLCBzaXplb2YoRVZQX1BLRVlfQ1RYKSk7CkBAIC0xOTAsNyArMTkyLDcgQEAKIAogZXJyOgogICBFVlBfUEtFWV9DVFhfZnJlZShyY3R4KTsKLSAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfTElCX0VWUCk7CisgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfQ1RYX2R1cCwgRVJSX0xJQl9FVlApOwogICByZXR1cm4gTlVMTDsKIH0KIApAQCAtMjA1LDcgKzIwNyw3IEBACiBpbnQgRVZQX1BLRVlfQ1RYX2N0cmwoRVZQX1BLRVlfQ1RYICpjdHgsIGludCBrZXl0eXBlLCBpbnQgb3B0eXBlLCBpbnQgY21kLAogICAgICAgICAgICAgICAgICAgICAgIGludCBwMSwgdm9pZCAqcDIpIHsKICAgaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPmN0cmwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0NPTU1BTkRfTk9UX1NVUFBPUlRFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9DVFhfY3RybCwgRVZQX1JfQ09NTUFORF9OT1RfU1VQUE9SVEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoa2V5dHlwZSAhPSAtMSAmJiBjdHgtPnBtZXRoLT5wa2V5X2lkICE9IGtleXR5cGUpIHsKQEAgLTIxMywxMiArMjE1LDEyIEBACiAgIH0KIAogICBpZiAoY3R4LT5vcGVyYXRpb24gPT0gRVZQX1BLRVlfT1BfVU5ERUZJTkVEKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9OT19PUEVSQVRJT05fU0VUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX0NUWF9jdHJsLCBFVlBfUl9OT19PUEVSQVRJT05fU0VUKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChvcHR5cGUgIT0gLTEgJiYgIShjdHgtPm9wZXJhdGlvbiAmIG9wdHlwZSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX0NUWF9jdHJsLCBFVlBfUl9JTlZBTElEX09QRVJBVElPTik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjI3LDcgKzIyOSw4IEBACiAKIGludCBFVlBfUEtFWV9zaWduX2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpIHsKICAgaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPnNpZ24pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfc2lnbl9pbml0LAorICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTI0NywxMSArMjUwLDEyIEBACiBpbnQgRVZQX1BLRVlfc2lnbihFVlBfUEtFWV9DVFggKmN0eCwgdWludDhfdCAqc2lnLCBzaXplX3QgKnNpZ19sZW4sCiAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4pIHsKICAgaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPnNpZ24pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfc2lnbiwKKyAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoY3R4LT5vcGVyYXRpb24gIT0gRVZQX1BLRVlfT1BfU0lHTikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX3NpZ24sIEVWUF9SX09QRVJBVE9OX05PVF9JTklUSUFMSVpFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0dXJuIGN0eC0+cG1ldGgtPnNpZ24oY3R4LCBzaWcsIHNpZ19sZW4sIGRhdGEsIGRhdGFfbGVuKTsKQEAgLTI1OSw3ICsyNjMsOCBAQAogCiBpbnQgRVZQX1BLRVlfdmVyaWZ5X2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpIHsKICAgaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPnZlcmlmeSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV92ZXJpZnlfaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKICAgICByZXR1cm4gMDsKICAgfQogICBjdHgtPm9wZXJhdGlvbiA9IEVWUF9QS0VZX09QX1ZFUklGWTsKQEAgLTI3NywxMSArMjgyLDEyIEBACiBpbnQgRVZQX1BLRVlfdmVyaWZ5KEVWUF9QS0VZX0NUWCAqY3R4LCBjb25zdCB1aW50OF90ICpzaWcsIHNpemVfdCBzaWdfbGVuLAogICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4pIHsKICAgaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPnZlcmlmeSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV92ZXJpZnksCisgICAgICAgICAgICAgICAgICAgICAgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGN0eC0+b3BlcmF0aW9uICE9IEVWUF9QS0VZX09QX1ZFUklGWSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX3ZlcmlmeSwgRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICByZXR1cm4gY3R4LT5wbWV0aC0+dmVyaWZ5KGN0eCwgc2lnLCBzaWdfbGVuLCBkYXRhLCBkYXRhX2xlbik7CkBAIC0yODksNyArMjk1LDggQEAKIAogaW50IEVWUF9QS0VZX2VuY3J5cHRfaW5pdChFVlBfUEtFWV9DVFggKmN0eCkgewogICBpZiAoIWN0eCB8fCAhY3R4LT5wbWV0aCB8fCAhY3R4LT5wbWV0aC0+ZW5jcnlwdCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9lbmNyeXB0X2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgY3R4LT5vcGVyYXRpb24gPSBFVlBfUEtFWV9PUF9FTkNSWVBUOwpAQCAtMzA2LDExICszMTMsMTIgQEAKIGludCBFVlBfUEtFWV9lbmNyeXB0KEVWUF9QS0VZX0NUWCAqY3R4LCB1aW50OF90ICpvdXQsIHNpemVfdCAqb3V0bGVuLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbmxlbikgewogICBpZiAoIWN0eCB8fCAhY3R4LT5wbWV0aCB8fCAhY3R4LT5wbWV0aC0+ZW5jcnlwdCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9lbmNyeXB0LAorICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOwogICAgIHJldHVybiAwOwogICB9CiAgIGlmIChjdHgtPm9wZXJhdGlvbiAhPSBFVlBfUEtFWV9PUF9FTkNSWVBUKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9PUEVSQVRPTl9OT1RfSU5JVElBTElaRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfZW5jcnlwdCwgRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICByZXR1cm4gY3R4LT5wbWV0aC0+ZW5jcnlwdChjdHgsIG91dCwgb3V0bGVuLCBpbiwgaW5sZW4pOwpAQCAtMzE4LDcgKzMyNiw4IEBACiAKIGludCBFVlBfUEtFWV9kZWNyeXB0X2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpIHsKICAgaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPmRlY3J5cHQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfZGVjcnlwdF9pbml0LAorICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOwogICAgIHJldHVybiAwOwogICB9CiAgIGN0eC0+b3BlcmF0aW9uID0gRVZQX1BLRVlfT1BfREVDUllQVDsKQEAgLTMzNSwxMSArMzQ0LDEyIEBACiBpbnQgRVZQX1BLRVlfZGVjcnlwdChFVlBfUEtFWV9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBzaXplX3QgKm91dGxlbiwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5sZW4pIHsKICAgaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPmRlY3J5cHQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfZGVjcnlwdCwKKyAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoY3R4LT5vcGVyYXRpb24gIT0gRVZQX1BLRVlfT1BfREVDUllQVCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2RlY3J5cHQsIEVWUF9SX09QRVJBVE9OX05PVF9JTklUSUFMSVpFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0dXJuIGN0eC0+cG1ldGgtPmRlY3J5cHQoY3R4LCBvdXQsIG91dGxlbiwgaW4sIGlubGVuKTsKQEAgLTM0Nyw3ICszNTcsOCBAQAogCiBpbnQgRVZQX1BLRVlfZGVyaXZlX2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpIHsKICAgaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPmRlcml2ZSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9kZXJpdmVfaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKICAgICByZXR1cm4gMDsKICAgfQogICBjdHgtPm9wZXJhdGlvbiA9IEVWUF9QS0VZX09QX0RFUklWRTsKQEAgLTM2NiwxMyArMzc3LDE1IEBACiAgIGlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8CiAgICAgICAhKGN0eC0+cG1ldGgtPmRlcml2ZSB8fCBjdHgtPnBtZXRoLT5lbmNyeXB0IHx8IGN0eC0+cG1ldGgtPmRlY3J5cHQpIHx8CiAgICAgICAhY3R4LT5wbWV0aC0+Y3RybCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9kZXJpdmVfc2V0X3BlZXIsCisgICAgICAgICAgICAgICAgICAgICAgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGN0eC0+b3BlcmF0aW9uICE9IEVWUF9QS0VZX09QX0RFUklWRSAmJgogICAgICAgY3R4LT5vcGVyYXRpb24gIT0gRVZQX1BLRVlfT1BfRU5DUllQVCAmJgogICAgICAgY3R4LT5vcGVyYXRpb24gIT0gRVZQX1BLRVlfT1BfREVDUllQVCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2Rlcml2ZV9zZXRfcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9PUEVSQVRPTl9OT1RfSU5JVElBTElaRUQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTM4NywxMiArNDAwLDEyIEBACiAgIH0KIAogICBpZiAoIWN0eC0+cGtleSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfTk9fS0VZX1NFVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9kZXJpdmVfc2V0X3BlZXIsIEVWUF9SX05PX0tFWV9TRVQpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGN0eC0+cGtleS0+dHlwZSAhPSBwZWVyLT50eXBlKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9ESUZGRVJFTlRfS0VZX1RZUEVTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2Rlcml2ZV9zZXRfcGVlciwgRVZQX1JfRElGRkVSRU5UX0tFWV9UWVBFUyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNDAzLDcgKzQxNiw4IEBACiAgICAqIC0yIGlzIE9LIGZvciB1cyBoZXJlLCBhcyB3ZWxsIGFzIDEsIHNvIHdlIGNhbiBjaGVjayBmb3IgMCBvbmx5LiAqLwogICBpZiAoIUVWUF9QS0VZX21pc3NpbmdfcGFyYW1ldGVycyhwZWVyKSAmJgogICAgICAgIUVWUF9QS0VZX2NtcF9wYXJhbWV0ZXJzKGN0eC0+cGtleSwgcGVlcikpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0RJRkZFUkVOVF9QQVJBTUVURVJTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2Rlcml2ZV9zZXRfcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9ESUZGRVJFTlRfUEFSQU1FVEVSUyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNDIzLDExICs0MzcsMTIgQEAKIAogaW50IEVWUF9QS0VZX2Rlcml2ZShFVlBfUEtFWV9DVFggKmN0eCwgdWludDhfdCAqa2V5LCBzaXplX3QgKm91dF9rZXlfbGVuKSB7CiAgIGlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5kZXJpdmUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfZGVyaXZlLAorICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOwogICAgIHJldHVybiAwOwogICB9CiAgIGlmIChjdHgtPm9wZXJhdGlvbiAhPSBFVlBfUEtFWV9PUF9ERVJJVkUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX09QRVJBVE9OX05PVF9JTklUSUFMSVpFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9kZXJpdmUsIEVWUF9SX09QRVJBVE9OX05PVF9JTklUSUFMSVpFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0dXJuIGN0eC0+cG1ldGgtPmRlcml2ZShjdHgsIGtleSwgb3V0X2tleV9sZW4pOwpAQCAtNDM1LDcgKzQ1MCw4IEBACiAKIGludCBFVlBfUEtFWV9rZXlnZW5faW5pdChFVlBfUEtFWV9DVFggKmN0eCkgewogICBpZiAoIWN0eCB8fCAhY3R4LT5wbWV0aCB8fCAhY3R4LT5wbWV0aC0+a2V5Z2VuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2tleWdlbl9pbml0LAorICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOwogICAgIHJldHVybiAwOwogICB9CiAgIGN0eC0+b3BlcmF0aW9uID0gRVZQX1BLRVlfT1BfS0VZR0VOOwpAQCAtNDUxLDExICs0NjcsMTIgQEAKIAogaW50IEVWUF9QS0VZX2tleWdlbihFVlBfUEtFWV9DVFggKmN0eCwgRVZQX1BLRVkgKipwcGtleSkgewogICBpZiAoIWN0eCB8fCAhY3R4LT5wbWV0aCB8fCAhY3R4LT5wbWV0aC0+a2V5Z2VuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2tleWdlbiwKKyAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoY3R4LT5vcGVyYXRpb24gIT0gRVZQX1BLRVlfT1BfS0VZR0VOKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9PUEVSQVRPTl9OT1RfSU5JVElBTElaRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfa2V5Z2VuLCBFVlBfUl9PUEVSQVRPTl9OT1RfSU5JVElBTElaRUQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTQ2Niw3ICs0ODMsNyBAQAogICBpZiAoISpwcGtleSkgewogICAgICpwcGtleSA9IEVWUF9QS0VZX25ldygpOwogICAgIGlmICghKnBwa2V5KSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9MSUJfRVZQKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfa2V5Z2VuLCBFUlJfTElCX0VWUCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXZwL2V2cF9leHRyYV90ZXN0LmNjIGIvc3JjL2NyeXB0by9ldnAvZXZwX2V4dHJhX3Rlc3QuY2MKaW5kZXggOWM5NTVmYS4uNjc0NTQ3ZCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ldnAvZXZwX2V4dHJhX3Rlc3QuY2MKKysrIGIvc3JjL2NyeXB0by9ldnAvZXZwX2V4dHJhX3Rlc3QuY2MKQEAgLTMyMiw4ICszMjIsOCBAQAogfTsKIAogc3RhdGljIFNjb3BlZEVWUF9QS0VZIExvYWRFeGFtcGxlUlNBS2V5KCkgewotICBTY29wZWRSU0EgcnNhKFJTQV9wcml2YXRlX2tleV9mcm9tX2J5dGVzKGtFeGFtcGxlUlNBS2V5REVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrRXhhbXBsZVJTQUtleURFUikpKTsKKyAgY29uc3QgdWludDhfdCAqZGVycCA9IGtFeGFtcGxlUlNBS2V5REVSOworICBTY29wZWRSU0EgcnNhKGQyaV9SU0FQcml2YXRlS2V5KG51bGxwdHIsICZkZXJwLCBzaXplb2Yoa0V4YW1wbGVSU0FLZXlERVIpKSk7CiAgIGlmICghcnNhKSB7CiAgICAgcmV0dXJuIG51bGxwdHI7CiAgIH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXZwL2V2cF90ZXN0LmNjIGIvc3JjL2NyeXB0by9ldnAvZXZwX3Rlc3QuY2MKaW5kZXggYzdhYzkwOC4uMjM5Zjg2OCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ldnAvZXZwX3Rlc3QuY2MKKysrIGIvc3JjL2NyeXB0by9ldnAvZXZwX3Rlc3QuY2MKQEAgLTU2LDE5ICs1NiwxMCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikKLSNwcmFnbWEgd2FybmluZyhwdXNoKQotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQ3MDIpCi0jZW5kaWYKLQogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikKLSNwcmFnbWEgd2FybmluZyhwb3ApCi0jZW5kaWYKLQogI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KICNpbmNsdWRlIDxvcGVuc3NsL2RpZ2VzdC5oPgpAQCAtODEsMTAgKzcyLDExIEBACiAjaW5jbHVkZSAiLi4vdGVzdC9zdGxfY29tcGF0LmgiCiAKIAotLy8gZXZwX3Rlc3QgZGlzcGF0Y2hlcyBiZXR3ZWVuIG11bHRpcGxlIHRlc3QgdHlwZXMuIFByaXZhdGVLZXkgdGVzdHMgdGFrZSBhIGtleQotLy8gbmFtZSBwYXJhbWV0ZXIgYW5kIHNpbmdsZSBibG9jaywgZGVjb2RlIGl0IGFzIGEgUEVNIHByaXZhdGUga2V5LCBhbmQgc2F2ZSBpdAotLy8gdW5kZXIgdGhhdCBrZXkgbmFtZS4gRGVjcnlwdCwgU2lnbiwgYW5kIFZlcmlmeSB0ZXN0cyB0YWtlIGEgcHJldmlvdXNseQotLy8gaW1wb3J0ZWQga2V5IG5hbWUgYXMgcGFyYW1ldGVyIGFuZCB0ZXN0IHRoZWlyIHJlc3BlY3RpdmUgb3BlcmF0aW9ucy4KKy8vIGV2cF90ZXN0IGRpc3BhdGNoZXMgYmV0d2VlbiBtdWx0aXBsZSB0ZXN0IHR5cGVzLiBITUFDIHRlc3RzIHRlc3QgdGhlIGxlZ2FjeQorLy8gRVZQX1BLRVlfSE1BQyBBUEkuIFByaXZhdGVLZXkgdGVzdHMgdGFrZSBhIGtleSBuYW1lIHBhcmFtZXRlciBhbmQgc2luZ2xlCisvLyBibG9jaywgZGVjb2RlIGl0IGFzIGEgUEVNIHByaXZhdGUga2V5LCBhbmQgc2F2ZSBpdCB1bmRlciB0aGF0IGtleSBuYW1lLgorLy8gRGVjcnlwdCwgU2lnbiwgYW5kIFZlcmlmeSB0ZXN0cyB0YWtlIGEgcHJldmlvdXNseSBpbXBvcnRlZCBrZXkgbmFtZSBhcworLy8gcGFyYW1ldGVyIGFuZCB0ZXN0IHRoZWlyIHJlc3BlY3RpdmUgb3BlcmF0aW9ucy4KIAogc3RhdGljIGNvbnN0IEVWUF9NRCAqR2V0RGlnZXN0KEZpbGVUZXN0ICp0LCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgewogICBpZiAobmFtZSA9PSAiTUQ1IikgewpAQCAtMTI4LDEwICsxMjAsNTQgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBib29sIFRlc3RITUFDKEZpbGVUZXN0ICp0KSB7CisgIHN0ZDo6c3RyaW5nIGRpZ2VzdF9zdHI7CisgIGlmICghdC0+R2V0QXR0cmlidXRlKCZkaWdlc3Rfc3RyLCAiSE1BQyIpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEVWUF9NRCAqZGlnZXN0ID0gR2V0RGlnZXN0KHQsIGRpZ2VzdF9zdHIpOworICBpZiAoZGlnZXN0ID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXksIGlucHV0LCBvdXRwdXQ7CisgIGlmICghdC0+R2V0Qnl0ZXMoJmtleSwgIktleSIpIHx8CisgICAgICAhdC0+R2V0Qnl0ZXMoJmlucHV0LCAiSW5wdXQiKSB8fAorICAgICAgIXQtPkdldEJ5dGVzKCZvdXRwdXQsICJPdXRwdXQiKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIFNjb3BlZEVWUF9QS0VZIHBrZXkoRVZQX1BLRVlfbmV3X21hY19rZXkoRVZQX1BLRVlfSE1BQywgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic3NsOjp2ZWN0b3JfZGF0YSgma2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkuc2l6ZSgpKSk7CisgIFNjb3BlZEVWUF9NRF9DVFggbWN0eDsKKyAgaWYgKCFwa2V5IHx8CisgICAgICAhRVZQX0RpZ2VzdFNpZ25Jbml0KG1jdHguZ2V0KCksIG51bGxwdHIsIGRpZ2VzdCwgbnVsbHB0ciwgcGtleS5nZXQoKSkgfHwKKyAgICAgICFFVlBfRGlnZXN0U2lnblVwZGF0ZShtY3R4LmdldCgpLCBic3NsOjp2ZWN0b3JfZGF0YSgmaW5wdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNpemUoKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzaXplX3QgbGVuOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhY3R1YWw7CisgIGlmICghRVZQX0RpZ2VzdFNpZ25GaW5hbChtY3R4LmdldCgpLCBudWxscHRyLCAmbGVuKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBhY3R1YWwucmVzaXplKGxlbik7CisgIGlmICghRVZQX0RpZ2VzdFNpZ25GaW5hbChtY3R4LmdldCgpLCBic3NsOjp2ZWN0b3JfZGF0YSgmYWN0dWFsKSwgJmxlbikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgYWN0dWFsLnJlc2l6ZShsZW4pOworICByZXR1cm4gdC0+RXhwZWN0Qnl0ZXNFcXVhbChic3NsOjp2ZWN0b3JfZGF0YSgmb3V0cHV0KSwgb3V0cHV0LnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNzbDo6dmVjdG9yX2RhdGEoJmFjdHVhbCksIGFjdHVhbC5zaXplKCkpOworfQorCiBzdGF0aWMgYm9vbCBUZXN0RVZQKEZpbGVUZXN0ICp0LCB2b2lkICphcmcpIHsKICAgS2V5TWFwICprZXlfbWFwID0gcmVpbnRlcnByZXRfY2FzdDxLZXlNYXAqPihhcmcpOwogICBpZiAodC0+R2V0VHlwZSgpID09ICJQcml2YXRlS2V5IikgewogICAgIHJldHVybiBJbXBvcnRQcml2YXRlS2V5KHQsIGtleV9tYXApOworICB9IGVsc2UgaWYgKHQtPkdldFR5cGUoKSA9PSAiSE1BQyIpIHsKKyAgICByZXR1cm4gVGVzdEhNQUModCk7CiAgIH0KIAogICBpbnQgKCprZXlfb3BfaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpOwpAQCAtMTgzLDcgKzIxOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgYnNzbDo6dmVjdG9yX2RhdGEoJmlucHV0KSwgaW5wdXQuc2l6ZSgpKSkgewogICAgICAgLy8gRUNEU0Egc29tZXRpbWVzIGRvZXNuJ3QgcHVzaCBhbiBlcnJvciBjb2RlLiBQdXNoIG9uZSBvbiB0aGUgZXJyb3IgcXVldWUKICAgICAgIC8vIHNvIGl0J3MgZGlzdGluZ3Vpc2hhYmxlIGZyb20gb3RoZXIgZXJyb3JzLgotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoVVNFUiwgRVJSX1JfRVZQX0xJQik7CisgICAgICBFUlJfcHV0X2Vycm9yKEVSUl9MSUJfVVNFUiwgMCwgRVJSX1JfRVZQX0xJQiwgX19GSUxFX18sIF9fTElORV9fKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2V2cC9ldnBfdGVzdHMudHh0IGIvc3JjL2NyeXB0by9ldnAvZXZwX3Rlc3RzLnR4dAppbmRleCA5N2RkYWEwLi5jY2NmYTRmIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2V2cC9ldnBfdGVzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vZXZwL2V2cF90ZXN0cy50eHQKQEAgLTE2MywxMSArMTYzLDEyIEBACiBJbnB1dCA9ICIwMTIzNDU2Nzg5QUJDREVGMTIzNCIKIE91dHB1dCA9IDMwNDUwMjIxMDBiMWQxY2IxYTU3NzAzNWJjY2RkNWE4NmM2MTQ4YzJjYzdjNjMzY2Q0MmI3MjM0MTM5YjU5MzA3NmQwNDFlMTUyMDIyMDE4OThjZGQ1MmI0MWNhNTAyMDk4MTg0YjQwOWNmODNhMjFiYzk0NTAwNjc0NmUzYjdjZWE1MjIzNGUwNDNlYzgwMAogIyBUaGlzIG9wZXJhdGlvbiBmYWlscyB3aXRob3V0IGFuIGVycm9yIGNvZGUsIHNvIEVSUl9SX0VWUF9MSUIgaXMgc3VyZmFjZWQuCi1FcnJvciA9IEJBRF9TSUdOQVRVUkUKK0Vycm9yID0gcHVibGljIGtleSByb3V0aW5lcwogCiAjIEJFUiBzaWduYXR1cmUKIFZlcmlmeSA9IFAtMjU2CiBEaWdlc3QgPSBTSEExCiBJbnB1dCA9ICIwMTIzNDU2Nzg5QUJDREVGMTIzNCIKIE91dHB1dCA9IDMwODAwMjIxMDBiMWQxY2IxYTU3NzAzNWJjY2RkNWE4NmM2MTQ4YzJjYzdjNjMzY2Q0MmI3MjM0MTM5YjU5MzA3NmQwNDFlMTUyMDIyMDE4OThjZGQ1MmI0MWNhNTAyMDk4MTg0YjQwOWNmODNhMjFiYzk0NTAwNjc0NmUzYjdjZWE1MjIzNGUwNDNlYzgwMDAwCi1FcnJvciA9IEJBRF9TSUdOQVRVUkUKKyMgVGhpcyBvcGVyYXRpb24gZmFpbHMgd2l0aG91dCBhbiBlcnJvciBjb2RlLCBzbyBFUlJfUl9FVlBfTElCIGlzIHN1cmZhY2VkLgorRXJyb3IgPSBwdWJsaWMga2V5IHJvdXRpbmVzCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2V2cC9pbnRlcm5hbC5oIGIvc3JjL2NyeXB0by9ldnAvaW50ZXJuYWwuaAppbmRleCA2MDg4MWUzLi4wOGE3YmZiIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2V2cC9pbnRlcm5hbC5oCisrKyBiL3NyYy9jcnlwdG8vZXZwL2ludGVybmFsLmgKQEAgLTg5LDcgKzg5LDggQEAKICAgaW50IHBrZXlfYmFzZV9pZDsKICAgdW5zaWduZWQgbG9uZyBwa2V5X2ZsYWdzOwogCi0gIGNvbnN0IGNoYXIgKnBlbV9zdHI7CisgIGNoYXIgKnBlbV9zdHI7CisgIGNoYXIgKmluZm87CiAKICAgaW50ICgqcHViX2RlY29kZSkoRVZQX1BLRVkgKnBrLCBYNTA5X1BVQktFWSAqcHViKTsKICAgaW50ICgqcHViX2VuY29kZSkoWDUwOV9QVUJLRVkgKnB1YiwgY29uc3QgRVZQX1BLRVkgKnBrKTsKQEAgLTExNCw4ICsxMTUsOCBAQAogICBpbnQgKCpwa2V5X3NpemUpKGNvbnN0IEVWUF9QS0VZICpwayk7CiAgIGludCAoKnBrZXlfYml0cykoY29uc3QgRVZQX1BLRVkgKnBrKTsKIAotICBpbnQgKCpwYXJhbV9kZWNvZGUpKEVWUF9QS0VZICpwa2V5LCBjb25zdCB1aW50OF90ICoqcGRlciwgaW50IGRlcmxlbik7Ci0gIGludCAoKnBhcmFtX2VuY29kZSkoY29uc3QgRVZQX1BLRVkgKnBrZXksIHVpbnQ4X3QgKipwZGVyKTsKKyAgaW50ICgqcGFyYW1fZGVjb2RlKShFVlBfUEtFWSAqcGtleSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBkZXIsIGludCBkZXJsZW4pOworICBpbnQgKCpwYXJhbV9lbmNvZGUpKGNvbnN0IEVWUF9QS0VZICpwa2V5LCB1bnNpZ25lZCBjaGFyICoqcGRlcik7CiAgIGludCAoKnBhcmFtX21pc3NpbmcpKGNvbnN0IEVWUF9QS0VZICpwayk7CiAgIGludCAoKnBhcmFtX2NvcHkpKEVWUF9QS0VZICp0bywgY29uc3QgRVZQX1BLRVkgKmZyb20pOwogICBpbnQgKCpwYXJhbV9jbXApKGNvbnN0IEVWUF9QS0VZICphLCBjb25zdCBFVlBfUEtFWSAqYik7CkBAIC0xMjksOSArMTMwLDkgQEAKIAogICAvKiBMZWdhY3kgZnVuY3Rpb25zIGZvciBvbGQgUEVNICovCiAKLSAgaW50ICgqb2xkX3ByaXZfZGVjb2RlKShFVlBfUEtFWSAqcGtleSwgY29uc3QgdWludDhfdCAqKnBkZXIsCisgIGludCAoKm9sZF9wcml2X2RlY29kZSkoRVZQX1BLRVkgKnBrZXksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXJsZW4pOwotICBpbnQgKCpvbGRfcHJpdl9lbmNvZGUpKGNvbnN0IEVWUF9QS0VZICpwa2V5LCB1aW50OF90ICoqcGRlcik7CisgIGludCAoKm9sZF9wcml2X2VuY29kZSkoY29uc3QgRVZQX1BLRVkgKnBrZXksIHVuc2lnbmVkIGNoYXIgKipwZGVyKTsKIAogICAvKiBDb252ZXJ0aW5nIHBhcmFtZXRlcnMgdG8vZnJvbSBBbGdvcml0aG1JZGVudGlmaWVyIChYNTA5X0FMR09SKS4gKi8KICAgaW50ICgqZGlnZXN0X3ZlcmlmeV9pbml0X2Zyb21fYWxnb3JpdGhtKShFVlBfTURfQ1RYICpjdHgsCkBAIC0xNTIsMTIgKzE1MywxNSBAQAogI2RlZmluZSBFVlBfUEtFWV9PUF9TSUdOICgxIDw8IDMpCiAjZGVmaW5lIEVWUF9QS0VZX09QX1ZFUklGWSAoMSA8PCA0KQogI2RlZmluZSBFVlBfUEtFWV9PUF9WRVJJRllSRUNPVkVSICgxIDw8IDUpCi0jZGVmaW5lIEVWUF9QS0VZX09QX0VOQ1JZUFQgKDEgPDwgNikKLSNkZWZpbmUgRVZQX1BLRVlfT1BfREVDUllQVCAoMSA8PCA3KQotI2RlZmluZSBFVlBfUEtFWV9PUF9ERVJJVkUgKDEgPDwgOCkKKyNkZWZpbmUgRVZQX1BLRVlfT1BfU0lHTkNUWCAoMSA8PCA2KQorI2RlZmluZSBFVlBfUEtFWV9PUF9WRVJJRllDVFggKDEgPDwgNykKKyNkZWZpbmUgRVZQX1BLRVlfT1BfRU5DUllQVCAoMSA8PCA4KQorI2RlZmluZSBFVlBfUEtFWV9PUF9ERUNSWVBUICgxIDw8IDkpCisjZGVmaW5lIEVWUF9QS0VZX09QX0RFUklWRSAoMSA8PCAxMCkKIAogI2RlZmluZSBFVlBfUEtFWV9PUF9UWVBFX1NJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIChFVlBfUEtFWV9PUF9TSUdOIHwgRVZQX1BLRVlfT1BfVkVSSUZZIHwgRVZQX1BLRVlfT1BfVkVSSUZZUkVDT1ZFUikKKyAgKEVWUF9QS0VZX09QX1NJR04gfCBFVlBfUEtFWV9PUF9WRVJJRlkgfCBFVlBfUEtFWV9PUF9WRVJJRllSRUNPVkVSIHwgXAorICAgRVZQX1BLRVlfT1BfU0lHTkNUWCB8IEVWUF9QS0VZX09QX1ZFUklGWUNUWCkKIAogI2RlZmluZSBFVlBfUEtFWV9PUF9UWVBFX0NSWVBUIChFVlBfUEtFWV9PUF9FTkNSWVBUIHwgRVZQX1BLRVlfT1BfREVDUllQVCkKIApAQCAtMTc3LDggKzE4MSwxMyBAQAogT1BFTlNTTF9FWFBPUlQgaW50IEVWUF9QS0VZX0NUWF9jdHJsKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQga2V5dHlwZSwgaW50IG9wdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY21kLCBpbnQgcDEsIHZvaWQgKnAyKTsKIAotI2RlZmluZSBFVlBfUEtFWV9DVFJMX01EIDEKLSNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9HRVRfTUQgMgorLyogRVZQX1BLRVlfQ1RSTF9ESUdFU1RJTklUIGlzIGFuIGludGVybmFsIHZhbHVlLiBJdCdzIGNhbGxlZCBieQorICogRVZQX0RpZ2VzdEluaXRfZXggdG8gc2lnbmFsIHRoZSB8RVZQX1BLRVl8IHRoYXQgYSBkaWdlc3Qgb3BlcmF0aW9uIGlzCisgKiBzdGFydGluZy4KKyAqCisgKiBUT0RPKGRhdmlkYmVuKTogVGhpcyBpcyBvbmx5IG5lZWRlZCB0byBzdXBwb3J0IHRoZSBkZXByZWNhdGVkIEhNQUMgfEVWUF9QS0VZfAorICogdHlwZXMuICovCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfRElHRVNUSU5JVCAzCiAKIC8qIEVWUF9QS0VZX0NUUkxfUEVFUl9LRVkgaXMgY2FsbGVkIHdpdGggZGlmZmVyZW50IHZhbHVlcyBvZiB8cDF8OgogICogICAwOiBJcyBjYWxsZWQgZnJvbSB8RVZQX1BLRVlfZGVyaXZlX3NldF9wZWVyfCBhbmQgfHAyfCBjb250YWlucyBhIHBlZXIga2V5LgpAQCAtMTg5LDEyICsxOTgsMjEgQEAKICAqICAgICAgKEVDKURIIGFsd2F5cyByZXR1cm4gb25lIGluIHRoaXMgY2FzZS4KICAqICAgMzogSXMgY2FsbGVkIHdpdGggfHAyfCA9PSBOVUxMIHRvIHNldCB3aGV0aGVyIHRoZSBwZWVyJ3Mga2V5IHdhcyB1c2VkLgogICogICAgICAoRUMpREggYWx3YXlzIHJldHVybiBvbmUgaW4gdGhpcyBjYXNlLiBUaGlzIHdhcyBvbmx5IHVzZWQgZm9yIEdPU1QuICovCi0jZGVmaW5lIEVWUF9QS0VZX0NUUkxfUEVFUl9LRVkgMworI2RlZmluZSBFVlBfUEtFWV9DVFJMX1BFRVJfS0VZIDQKKworLyogRVZQX1BLRVlfQ1RSTF9TRVRfTUFDX0tFWSBzZXRzIGEgTUFDIGtleS4gRm9yIGV4YW1wbGUsIHRoaXMgY2FuIGJlIGRvbmUgYW4KKyAqIHxFVlBfUEtFWV9DVFh8IHByaW9yIHRvIGNhbGxpbmcgfEVWUF9QS0VZX2tleWdlbnwgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgYW4KKyAqIEhNQUMgfEVWUF9QS0VZfCB3aXRoIHRoZSBnaXZlbiBrZXkuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24KKyAqIGVycm9yLiAqLworI2RlZmluZSBFVlBfUEtFWV9DVFJMX1NFVF9NQUNfS0VZIDUKIAogLyogRVZQX1BLRVlfQUxHX0NUUkwgaXMgdGhlIGJhc2UgdmFsdWUgZnJvbSB3aGljaCBrZXktdHlwZSBzcGVjaWZpYyBjdHJsCiAgKiBjb21tYW5kcyBhcmUgbnVtYmVyZWQuICovCiAjZGVmaW5lIEVWUF9QS0VZX0FMR19DVFJMIDB4MTAwMAogCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfTUQgMQorI2RlZmluZSBFVlBfUEtFWV9DVFJMX0dFVF9NRCAyCisKICNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9SU0FfUEFERElORyAoRVZQX1BLRVlfQUxHX0NUUkwgKyAxKQogI2RlZmluZSBFVlBfUEtFWV9DVFJMX0dFVF9SU0FfUEFERElORyAoRVZQX1BLRVlfQUxHX0NUUkwgKyAyKQogI2RlZmluZSBFVlBfUEtFWV9DVFJMX1JTQV9QU1NfU0FMVExFTiAoRVZQX1BLRVlfQUxHX0NUUkwgKyAzKQpAQCAtMjQyLDI1ICsyNjAsMzQgQEAKICAgaW50ICgqa2V5Z2VuKShFVlBfUEtFWV9DVFggKmN0eCwgRVZQX1BLRVkgKnBrZXkpOwogCiAgIGludCAoKnNpZ25faW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpOwotICBpbnQgKCpzaWduKShFVlBfUEtFWV9DVFggKmN0eCwgdWludDhfdCAqc2lnLCBzaXplX3QgKnNpZ2xlbiwKLSAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdGJzLCBzaXplX3QgdGJzbGVuKTsKKyAgaW50ICgqc2lnbikoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKnNpZywgc2l6ZV90ICpzaWdsZW4sCisgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRicywgc2l6ZV90IHRic2xlbik7CiAKICAgaW50ICgqdmVyaWZ5X2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4KTsKLSAgaW50ICgqdmVyaWZ5KShFVlBfUEtFWV9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqc2lnLCBzaXplX3Qgc2lnbGVuLAotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRicywgc2l6ZV90IHRic2xlbik7CisgIGludCAoKnZlcmlmeSkoRVZQX1BLRVlfQ1RYICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZywgc2l6ZV90IHNpZ2xlbiwKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp0YnMsIHNpemVfdCB0YnNsZW4pOworCisgIGludCAoKnNpZ25jdHhfaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9NRF9DVFggKm1jdHgpOworICBpbnQgKCpzaWduY3R4KShFVlBfUEtFWV9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqc2lnLCBzaXplX3QgKnNpZ2xlbiwKKyAgICAgICAgICAgICAgICAgRVZQX01EX0NUWCAqbWN0eCk7CisKKyAgaW50ICgqdmVyaWZ5Y3R4X2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfTURfQ1RYICptY3R4KTsKKyAgaW50ICgqdmVyaWZ5Y3R4KShFVlBfUEtFWV9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2lnLCBpbnQgc2lnbGVuLAorICAgICAgICAgICAgICAgICAgIEVWUF9NRF9DVFggKm1jdHgpOwogCiAgIGludCAoKmVuY3J5cHRfaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpOwotICBpbnQgKCplbmNyeXB0KShFVlBfUEtFWV9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBzaXplX3QgKm91dGxlbiwKLSAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbmxlbik7CisgIGludCAoKmVuY3J5cHQpKEVWUF9QS0VZX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsIHNpemVfdCAqb3V0bGVuLAorICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IGlubGVuKTsKIAogICBpbnQgKCpkZWNyeXB0X2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4KTsKLSAgaW50ICgqZGVjcnlwdCkoRVZQX1BLRVlfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCwgc2l6ZV90ICpvdXRsZW4sCi0gICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5sZW4pOworICBpbnQgKCpkZWNyeXB0KShFVlBfUEtFWV9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LCBzaXplX3QgKm91dGxlbiwKKyAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmxlbik7CiAKICAgaW50ICgqZGVyaXZlX2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4KTsKLSAgaW50ICgqZGVyaXZlKShFVlBfUEtFWV9DVFggKmN0eCwgdWludDhfdCAqa2V5LCBzaXplX3QgKmtleWxlbik7CisgIGludCAoKmRlcml2ZSkoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKmtleSwgc2l6ZV90ICprZXlsZW4pOwogCiAgIGludCAoKmN0cmwpKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQgdHlwZSwgaW50IHAxLCB2b2lkICpwMik7CisgIGludCAoKmN0cmxfc3RyKShFVlBfUEtFWV9DVFggKmN0eCwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqdmFsdWUpOwogfSAvKiBFVlBfUEtFWV9NRVRIT0QgKi87CiAKIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ldnAvcF9kc2FfYXNuMS5jIGIvc3JjL2NyeXB0by9ldnAvcF9kc2FfYXNuMS5jCmluZGV4IDQ3OTBjZjYuLjBhYzdkYTcgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXZwL3BfZHNhX2FzbjEuYworKysgYi9zcmMvY3J5cHRvL2V2cC9wX2RzYV9hc24xLmMKQEAgLTkxLDI5ICs5MSwyOSBAQAogCiAgICAgZHNhID0gZDJpX0RTQXBhcmFtcyhOVUxMLCAmcG0sIHBtbGVuKTsKICAgICBpZiAoZHNhID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfREVDT0RFX0VSUk9SKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZHNhX3B1Yl9kZWNvZGUsIEVWUF9SX0RFQ09ERV9FUlJPUik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0gZWxzZSBpZiAocHR5cGUgPT0gVl9BU04xX05VTEwgfHwgcHR5cGUgPT0gVl9BU04xX1VOREVGKSB7CiAgICAgZHNhID0gRFNBX25ldygpOwogICAgIGlmIChkc2EgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGRzYV9wdWJfZGVjb2RlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9QQVJBTUVURVJfRU5DT0RJTkdfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZHNhX3B1Yl9kZWNvZGUsIEVWUF9SX1BBUkFNRVRFUl9FTkNPRElOR19FUlJPUik7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBwdWJsaWNfa2V5ID0gZDJpX0FTTjFfSU5URUdFUihOVUxMLCAmcCwgcGtsZW4pOwogICBpZiAocHVibGljX2tleSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9ERUNPREVfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZHNhX3B1Yl9kZWNvZGUsIEVWUF9SX0RFQ09ERV9FUlJPUik7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBkc2EtPnB1Yl9rZXkgPSBBU04xX0lOVEVHRVJfdG9fQk4ocHVibGljX2tleSwgTlVMTCk7CiAgIGlmIChkc2EtPnB1Yl9rZXkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfQk5fREVDT0RFX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGRzYV9wdWJfZGVjb2RlLCBFVlBfUl9CTl9ERUNPREVfRVJST1IpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTEyOSwzNyArMTI5LDIxIEBACiAKIHN0YXRpYyBpbnQgZHNhX3B1Yl9lbmNvZGUoWDUwOV9QVUJLRVkgKnBrLCBjb25zdCBFVlBfUEtFWSAqcGtleSkgewogICBEU0EgKmRzYTsKLSAgQVNOMV9TVFJJTkcgKnB2YWwgPSBOVUxMOworICB2b2lkICpwdmFsID0gTlVMTDsKICAgdWludDhfdCAqcGVuYyA9IE5VTEw7CiAgIGludCBwZW5jbGVuOwogCiAgIGRzYSA9IHBrZXktPnBrZXkuZHNhOwogICBkc2EtPndyaXRlX3BhcmFtcyA9IDA7CiAKLSAgaW50IHB0eXBlOwotICBpZiAoZHNhLT5wICYmIGRzYS0+cSAmJiBkc2EtPmcpIHsKLSAgICBwdmFsID0gQVNOMV9TVFJJTkdfbmV3KCk7Ci0gICAgaWYgKCFwdmFsKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKLSAgICAgIGdvdG8gZXJyOwotICAgIH0KLSAgICBwdmFsLT5sZW5ndGggPSBpMmRfRFNBcGFyYW1zKGRzYSwgJnB2YWwtPmRhdGEpOwotICAgIGlmIChwdmFsLT5sZW5ndGggPD0gMCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7Ci0gICAgICBnb3RvIGVycjsKLSAgICB9Ci0gICAgcHR5cGUgPSBWX0FTTjFfU0VRVUVOQ0U7Ci0gIH0gZWxzZSB7Ci0gICAgcHR5cGUgPSBWX0FTTjFfVU5ERUY7Ci0gIH0KLQogICBwZW5jbGVuID0gaTJkX0RTQVB1YmxpY0tleShkc2EsICZwZW5jKTsKKwogICBpZiAocGVuY2xlbiA8PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkc2FfcHViX2VuY29kZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKLSAgaWYgKFg1MDlfUFVCS0VZX3NldDBfcGFyYW0ocGssIE9CSl9uaWQyb2JqKEVWUF9QS0VZX0RTQSksIHB0eXBlLCBwdmFsLAorICBpZiAoWDUwOV9QVUJLRVlfc2V0MF9wYXJhbShwaywgT0JKX25pZDJvYmooRVZQX1BLRVlfRFNBKSwgVl9BU04xX1VOREVGLCBwdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5jLCBwZW5jbGVuKSkgewogICAgIHJldHVybiAxOwogICB9CkBAIC0yNTIsMjMgKzIzNiwyMyBAQAogICAvKiBXZSBoYXZlIHBhcmFtZXRlcnMuIE5vdyBzZXQgcHJpdmF0ZSBrZXkgKi8KICAgZHNhLT5wcml2X2tleSA9IEFTTjFfSU5URUdFUl90b19CTihwcml2a2V5LCBOVUxMKTsKICAgaWYgKGRzYS0+cHJpdl9rZXkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX0xJQl9CTik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkc2FfcHJpdl9kZWNvZGUsIEVSUl9MSUJfQk4pOwogICAgIGdvdG8gZHNhZXJyOwogICB9CiAgIC8qIENhbGN1bGF0ZSBwdWJsaWMga2V5LiAqLwogICBkc2EtPnB1Yl9rZXkgPSBCTl9uZXcoKTsKICAgaWYgKGRzYS0+cHViX2tleSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkc2FfcHJpdl9kZWNvZGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGRzYWVycjsKICAgfQogICBjdHggPSBCTl9DVFhfbmV3KCk7CiAgIGlmIChjdHggPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZHNhX3ByaXZfZGVjb2RlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBkc2FlcnI7CiAgIH0KIAogICBpZiAoIUJOX21vZF9leHAoZHNhLT5wdWJfa2V5LCBkc2EtPmcsIGRzYS0+cHJpdl9rZXksIGRzYS0+cCwgY3R4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX0xJQl9CTik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkc2FfcHJpdl9kZWNvZGUsIEVSUl9MSUJfQk4pOwogICAgIGdvdG8gZHNhZXJyOwogICB9CiAKQEAgLTI4MCw3ICsyNjQsNyBAQAogICByZXR1cm4gMTsKIAogZGVjZXJyOgotICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0RFQ09ERV9FUlJPUik7CisgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZHNhX3ByaXZfZGVjb2RlLCBFVlBfUl9ERUNPREVfRVJST1IpOwogCiBkc2FlcnI6CiAgIEJOX0NUWF9mcmVlKGN0eCk7CkBAIC0yOTcsMTkgKzI4MSwxOSBAQAogICBpbnQgZHBsZW47CiAKICAgaWYgKCFwa2V5LT5wa2V5LmRzYSB8fCAhcGtleS0+cGtleS5kc2EtPnByaXZfa2V5KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9NSVNTSU5HX1BBUkFNRVRFUlMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZHNhX3ByaXZfZW5jb2RlLCBFVlBfUl9NSVNTSU5HX1BBUkFNRVRFUlMpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgcGFyYW1zID0gQVNOMV9TVFJJTkdfbmV3KCk7CiAgIGlmICghcGFyYW1zKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkc2FfcHJpdl9lbmNvZGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIHBhcmFtcy0+bGVuZ3RoID0gaTJkX0RTQXBhcmFtcyhwa2V5LT5wa2V5LmRzYSwgJnBhcmFtcy0+ZGF0YSk7CiAgIGlmIChwYXJhbXMtPmxlbmd0aCA8PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkc2FfcHJpdl9lbmNvZGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogICBwYXJhbXMtPnR5cGUgPSBWX0FTTjFfU0VRVUVOQ0U7CkBAIC0zMTgsMTQgKzMwMiwxMyBAQAogICBwcmtleSA9IEJOX3RvX0FTTjFfSU5URUdFUihwa2V5LT5wa2V5LmRzYS0+cHJpdl9rZXksIE5VTEwpOwogCiAgIGlmICghcHJrZXkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9MSUJfQk4pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZHNhX3ByaXZfZW5jb2RlLCBFUlJfTElCX0JOKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIGRwbGVuID0gaTJkX0FTTjFfSU5URUdFUihwcmtleSwgJmRwKTsKIAogICBBU04xX0lOVEVHRVJfZnJlZShwcmtleSk7Ci0gIHBya2V5ID0gTlVMTDsKIAogICBpZiAoIVBLQ1M4X3BrZXlfc2V0MChwOCwgKEFTTjFfT0JKRUNUICopT0JKX25pZDJvYmooTklEX2RzYSksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIFZfQVNOMV9TRVFVRU5DRSwgcGFyYW1zLCBkcCwgZHBsZW4pKSB7CkBAIC00MzgsNyArNDIxLDcgQEAKIAogICBtID0gKHVpbnQ4X3QgKilPUEVOU1NMX21hbGxvYyhidWZfbGVuICsgMTApOwogICBpZiAobSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkb19kc2FfcHJpbnQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC00NjcsNyArNDUwLDcgQEAKICAgRFNBICpkc2E7CiAgIGRzYSA9IGQyaV9EU0FwYXJhbXMoTlVMTCwgcGRlciwgZGVybGVuKTsKICAgaWYgKGRzYSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9EU0FfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGRzYV9wYXJhbV9kZWNvZGUsIEVSUl9SX0RTQV9MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAgIEVWUF9QS0VZX2Fzc2lnbl9EU0EocGtleSwgZHNhKTsKQEAgLTQ5OCw3ICs0ODEsNyBAQAogICBEU0EgKmRzYTsKICAgZHNhID0gZDJpX0RTQVByaXZhdGVLZXkoTlVMTCwgcGRlciwgZGVybGVuKTsKICAgaWYgKGRzYSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9EU0FfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIG9sZF9kc2FfcHJpdl9kZWNvZGUsIEVSUl9SX0RTQV9MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAgIEVWUF9QS0VZX2Fzc2lnbl9EU0EocGtleSwgZHNhKTsKQEAgLTUzMiw3ICs1MTUsNyBAQAogICB1cGRhdGVfYnVmbGVuKGRzYV9zaWctPnMsICZidWZfbGVuKTsKICAgbSA9IE9QRU5TU0xfbWFsbG9jKGJ1Zl9sZW4gKyAxMCk7CiAgIGlmIChtID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGRzYV9zaWdfcHJpbnQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC01NTUsNiArNTM4LDcgQEAKICAgMCwKIAogICAiRFNBIiwKKyAgIk9wZW5TU0wgRFNBIG1ldGhvZCIsCiAKICAgZHNhX3B1Yl9kZWNvZGUsCiAgIGRzYV9wdWJfZW5jb2RlLApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ldnAvcF9lYy5jIGIvc3JjL2NyeXB0by9ldnAvcF9lYy5jCmluZGV4IDc3ZjIxM2QuLjczYzAwZDggMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXZwL3BfZWMuYworKysgYi9zcmMvY3J5cHRvL2V2cC9wX2VjLmMKQEAgLTEyNSwxOCArMTI1LDI1IEBACiAKIHN0YXRpYyBpbnQgcGtleV9lY19zaWduKEVWUF9QS0VZX0NUWCAqY3R4LCB1aW50OF90ICpzaWcsIHNpemVfdCAqc2lnbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdGJzLCBzaXplX3QgdGJzbGVuKSB7CisgIGludCB0eXBlOwogICB1bnNpZ25lZCBpbnQgc2x0bXA7CisgIEVDX1BLRVlfQ1RYICpkY3R4ID0gY3R4LT5kYXRhOwogICBFQ19LRVkgKmVjID0gY3R4LT5wa2V5LT5wa2V5LmVjOwogCiAgIGlmICghc2lnKSB7CiAgICAgKnNpZ2xlbiA9IEVDRFNBX3NpemUoZWMpOwogICAgIHJldHVybiAxOwogICB9IGVsc2UgaWYgKCpzaWdsZW4gPCAoc2l6ZV90KUVDRFNBX3NpemUoZWMpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfZWNfc2lnbiwgRVZQX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAotICBpZiAoIUVDRFNBX3NpZ24oMCwgdGJzLCB0YnNsZW4sIHNpZywgJnNsdG1wLCBlYykpIHsKKyAgdHlwZSA9IE5JRF9zaGExOworICBpZiAoZGN0eC0+bWQpIHsKKyAgICB0eXBlID0gRVZQX01EX3R5cGUoZGN0eC0+bWQpOworICB9CisKKyAgaWYgKCFFQ0RTQV9zaWduKHR5cGUsIHRicywgdGJzbGVuLCBzaWcsICZzbHRtcCwgZWMpKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgKnNpZ2xlbiA9IChzaXplX3Qpc2x0bXA7CkBAIC0xNDUsNyArMTUyLDE2IEBACiAKIHN0YXRpYyBpbnQgcGtleV9lY192ZXJpZnkoRVZQX1BLRVlfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKnNpZywgc2l6ZV90IHNpZ2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdGJzLCBzaXplX3QgdGJzbGVuKSB7Ci0gIHJldHVybiBFQ0RTQV92ZXJpZnkoMCwgdGJzLCB0YnNsZW4sIHNpZywgc2lnbGVuLCBjdHgtPnBrZXktPnBrZXkuZWMpOworICBpbnQgdHlwZTsKKyAgRUNfUEtFWV9DVFggKmRjdHggPSBjdHgtPmRhdGE7CisgIEVDX0tFWSAqZWMgPSBjdHgtPnBrZXktPnBrZXkuZWM7CisKKyAgdHlwZSA9IE5JRF9zaGExOworICBpZiAoZGN0eC0+bWQpIHsKKyAgICB0eXBlID0gRVZQX01EX3R5cGUoZGN0eC0+bWQpOworICB9CisKKyAgcmV0dXJuIEVDRFNBX3ZlcmlmeSh0eXBlLCB0YnMsIHRic2xlbiwgc2lnLCBzaWdsZW4sIGVjKTsKIH0KIAogc3RhdGljIGludCBwa2V5X2VjX2Rlcml2ZShFVlBfUEtFWV9DVFggKmN0eCwgdWludDhfdCAqa2V5LApAQCAtMTU2LDcgKzE3Miw3IEBACiAgIEVDX0tFWSAqZWNrZXk7CiAKICAgaWYgKCFjdHgtPnBrZXkgfHwgIWN0eC0+cGVlcmtleSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfS0VZU19OT1RfU0VUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfZWNfZGVyaXZlLCBFVlBfUl9LRVlTX05PVF9TRVQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTE5MSw3ICsyMDcsNyBAQAogICAgIGNhc2UgRVZQX1BLRVlfQ1RSTF9FQ19QQVJBTUdFTl9DVVJWRV9OSUQ6CiAgICAgICBncm91cCA9IEVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lKHAxKTsKICAgICAgIGlmIChncm91cCA9PSBOVUxMKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfSU5WQUxJRF9DVVJWRSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9lY19jdHJsLCBFVlBfUl9JTlZBTElEX0NVUlZFKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAgICAgICBFQ19HUk9VUF9mcmVlKGRjdHgtPmdlbl9ncm91cCk7CkBAIC0yMDUsNyArMjIxLDcgQEAKICAgICAgICAgICBFVlBfTURfdHlwZSgoY29uc3QgRVZQX01EICopcDIpICE9IE5JRF9zaGEyNTYgJiYKICAgICAgICAgICBFVlBfTURfdHlwZSgoY29uc3QgRVZQX01EICopcDIpICE9IE5JRF9zaGEzODQgJiYKICAgICAgICAgICBFVlBfTURfdHlwZSgoY29uc3QgRVZQX01EICopcDIpICE9IE5JRF9zaGE1MTIpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9JTlZBTElEX0RJR0VTVF9UWVBFKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBwa2V5X2VjX2N0cmwsIEVWUF9SX0lOVkFMSURfRElHRVNUX1RZUEUpOwogICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KICAgICAgIGRjdHgtPm1kID0gcDI7CkBAIC0yMTYsMTEgKzIzMiwxMiBAQAogICAgICAgcmV0dXJuIDE7CiAKICAgICBjYXNlIEVWUF9QS0VZX0NUUkxfUEVFUl9LRVk6Ci0gICAgICAvKiBEZWZhdWx0IGJlaGF2aW91ciBpcyBPSyAqLworICAgIC8qIERlZmF1bHQgYmVoYXZpb3VyIGlzIE9LICovCisgICAgY2FzZSBFVlBfUEtFWV9DVFJMX0RJR0VTVElOSVQ6CiAgICAgICByZXR1cm4gMTsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0NPTU1BTkRfTk9UX1NVUFBPUlRFRCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfZWNfY3RybCwgRVZQX1JfQ09NTUFORF9OT1RfU1VQUE9SVEVEKTsKICAgICAgIHJldHVybiAwOwogICB9CiB9CkBAIC0yMzEsNyArMjQ4LDcgQEAKICAgaW50IHJldCA9IDA7CiAKICAgaWYgKGRjdHgtPmdlbl9ncm91cCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9OT19QQVJBTUVURVJTX1NFVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBwa2V5X2VjX3BhcmFtZ2VuLCBFVlBfUl9OT19QQVJBTUVURVJTX1NFVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgZWMgPSBFQ19LRVlfbmV3KCk7CkBAIC0yNTEsNyArMjY4LDcgQEAKICAgRUNfS0VZICplYyA9IE5VTEw7CiAgIEVDX1BLRVlfQ1RYICpkY3R4ID0gY3R4LT5kYXRhOwogICBpZiAoY3R4LT5wa2V5ID09IE5VTEwgJiYgZGN0eC0+Z2VuX2dyb3VwID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX05PX1BBUkFNRVRFUlNfU0VUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfZWNfa2V5Z2VuLCBFVlBfUl9OT19QQVJBTUVURVJTX1NFVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgZWMgPSBFQ19LRVlfbmV3KCk7CkBAIC0yNzMsMTEgKzI5MCwxMiBAQAogfQogCiBjb25zdCBFVlBfUEtFWV9NRVRIT0QgZWNfcGtleV9tZXRoID0gewotICAgIEVWUF9QS0VZX0VDLCAgICAgICAgICAwIC8qIGZsYWdzICovLCAgICAgICAgcGtleV9lY19pbml0LAotICAgIHBrZXlfZWNfY29weSwgICAgICAgICBwa2V5X2VjX2NsZWFudXAsICAgICAgMCAvKiBwYXJhbWdlbl9pbml0ICovLAotICAgIHBrZXlfZWNfcGFyYW1nZW4sICAgICAwIC8qIGtleWdlbl9pbml0ICovLCAgcGtleV9lY19rZXlnZW4sCi0gICAgMCAvKiBzaWduX2luaXQgKi8sICAgIHBrZXlfZWNfc2lnbiwgICAgICAgICAwIC8qIHZlcmlmeV9pbml0ICovLAotICAgIHBrZXlfZWNfdmVyaWZ5LCAgICAgICAwIC8qIGVuY3J5cHRfaW5pdCAqLywgMCAvKiBlbmNyeXB0ICovLAotICAgIDAgLyogZGVjcnlwdF9pbml0ICovLCAwIC8qIGRlY3J5cHQgKi8sICAgICAgMCAvKiBkZXJpdmVfaW5pdCAqLywKLSAgICBwa2V5X2VjX2Rlcml2ZSwgICAgICAgcGtleV9lY19jdHJsLAorICAgIEVWUF9QS0VZX0VDLCAgICAgICAgICAgIDAgLyogZmxhZ3MgKi8sICAgICAgICBwa2V5X2VjX2luaXQsCisgICAgcGtleV9lY19jb3B5LCAgICAgICAgICAgcGtleV9lY19jbGVhbnVwLCAgICAgIDAgLyogcGFyYW1nZW5faW5pdCAqLywKKyAgICBwa2V5X2VjX3BhcmFtZ2VuLCAgICAgICAwIC8qIGtleWdlbl9pbml0ICovLCAgcGtleV9lY19rZXlnZW4sCisgICAgMCAvKiBzaWduX2luaXQgKi8sICAgICAgcGtleV9lY19zaWduLCAgICAgICAgIDAgLyogdmVyaWZ5X2luaXQgKi8sCisgICAgcGtleV9lY192ZXJpZnksICAgICAgICAgMCAvKiBzaWduY3R4X2luaXQgKi8sIDAgLyogc2lnbmN0eCAqLywKKyAgICAwIC8qIHZlcmlmeWN0eF9pbml0ICovLCAwIC8qIHZlcmlmeWN0eCAqLywgICAgMCAvKiBlbmNyeXB0X2luaXQgKi8sCisgICAgMCAvKiBlbmNyeXB0ICovLCAgICAgICAgMCAvKiBkZWNyeXB0X2luaXQgKi8sIDAgLyogZGVjcnlwdCAqLywKKyAgICAwIC8qIGRlcml2ZV9pbml0ICovLCAgICBwa2V5X2VjX2Rlcml2ZSwgICAgICAgcGtleV9lY19jdHJsLAogfTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXZwL3BfZWNfYXNuMS5jIGIvc3JjL2NyeXB0by9ldnAvcF9lY19hc24xLmMKaW5kZXggOTg2Nzk0Ny4uZmJiZjRlNyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ldnAvcF9lY19hc24xLmMKKysrIGIvc3JjL2NyeXB0by9ldnAvcF9lY19hc24xLmMKQEAgLTcxLDEzICs3MSwxMyBAQAogICBpbnQgbmlkOwogCiAgIGlmIChlY19rZXkgPT0gTlVMTCB8fCAoZ3JvdXAgPSBFQ19LRVlfZ2V0MF9ncm91cChlY19rZXkpKSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9NSVNTSU5HX1BBUkFNRVRFUlMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfcGFyYW0ydHlwZSwgRVZQX1JfTUlTU0lOR19QQVJBTUVURVJTKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIG5pZCA9IEVDX0dST1VQX2dldF9jdXJ2ZV9uYW1lKGdyb3VwKTsKICAgaWYgKG5pZCA9PSBOSURfdW5kZWYpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX05PX05JRF9GT1JfQ1VSVkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfcGFyYW0ydHlwZSwgRVZQX1JfTk9fTklEX0ZPUl9DVVJWRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtOTQsNyArOTQsNyBAQAogICBpbnQgcGVuY2xlbjsKIAogICBpZiAoIWVja2V5X3BhcmFtMnR5cGUoJnB0eXBlLCAmcHZhbCwgZWNfa2V5KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX1JfRUNfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3B1Yl9lbmNvZGUsIEVSUl9SX0VDX0xJQik7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcGVuY2xlbiA9IGkyb19FQ1B1YmxpY0tleShlY19rZXksIE5VTEwpOwpAQCAtMTM3LDcgKzEzNyw3IEBACiAKICAgICBlY2tleSA9IGQyaV9FQ1BhcmFtZXRlcnMoTlVMTCwgJnBtLCBwbWxlbik7CiAgICAgaWYgKGVja2V5ID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfREVDT0RFX0VSUk9SKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfdHlwZTJwYXJhbSwgRVZQX1JfREVDT0RFX0VSUk9SKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfSBlbHNlIGlmIChwdHlwZSA9PSBWX0FTTjFfT0JKRUNUKSB7CkBAIC0xNTAsNyArMTUwLDcgQEAKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0RFQ09ERV9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBlY2tleV90eXBlMnBhcmFtLCBFVlBfUl9ERUNPREVfRVJST1IpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTE3NywxMyArMTc3LDEzIEBACiAKICAgZWNrZXkgPSBlY2tleV90eXBlMnBhcmFtKHB0eXBlLCBwdmFsKTsKICAgaWYgKCFlY2tleSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX1JfRUNfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3B1Yl9kZWNvZGUsIEVSUl9SX0VDX0xJQik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICAvKiBXZSBoYXZlIHBhcmFtZXRlcnMgbm93IHNldCBwdWJsaWMga2V5ICovCiAgIGlmICghbzJpX0VDUHVibGljS2V5KCZlY2tleSwgJnAsIHBrbGVuKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfREVDT0RFX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3B1Yl9kZWNvZGUsIEVWUF9SX0RFQ09ERV9FUlJPUik7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMjMyLDcgKzIzMiw3IEBACiAKICAgLyogV2UgaGF2ZSBwYXJhbWV0ZXJzIG5vdyBzZXQgcHJpdmF0ZSBrZXkgKi8KICAgaWYgKCFkMmlfRUNQcml2YXRlS2V5KCZlY2tleSwgJnAsIHBrbGVuKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfREVDT0RFX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3ByaXZfZGVjb2RlLCBFVlBfUl9ERUNPREVfRVJST1IpOwogICAgIGdvdG8gZWNlcnI7CiAgIH0KIApAQCAtMjQ2LDIzICsyNDYsMjMgQEAKICAgICBncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKGVja2V5KTsKICAgICBwdWJfa2V5ID0gRUNfUE9JTlRfbmV3KGdyb3VwKTsKICAgICBpZiAocHViX2tleSA9PSBOVUxMKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX0VDX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3ByaXZfZGVjb2RlLCBFUlJfUl9FQ19MSUIpOwogICAgICAgZ290byBlY2xpYmVycjsKICAgICB9CiAgICAgaWYgKCFFQ19QT0lOVF9jb3B5KHB1Yl9rZXksIEVDX0dST1VQX2dldDBfZ2VuZXJhdG9yKGdyb3VwKSkpIHsKICAgICAgIEVDX1BPSU5UX2ZyZWUocHViX2tleSk7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX0VDX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3ByaXZfZGVjb2RlLCBFUlJfUl9FQ19MSUIpOwogICAgICAgZ290byBlY2xpYmVycjsKICAgICB9CiAgICAgcHJpdl9rZXkgPSBFQ19LRVlfZ2V0MF9wcml2YXRlX2tleShlY2tleSk7CiAgICAgaWYgKCFFQ19QT0lOVF9tdWwoZ3JvdXAsIHB1Yl9rZXksIHByaXZfa2V5LCBOVUxMLCBOVUxMLCBOVUxMKSkgewogICAgICAgRUNfUE9JTlRfZnJlZShwdWJfa2V5KTsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX1JfRUNfTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfcHJpdl9kZWNvZGUsIEVSUl9SX0VDX0xJQik7CiAgICAgICBnb3RvIGVjbGliZXJyOwogICAgIH0KICAgICBpZiAoRUNfS0VZX3NldF9wdWJsaWNfa2V5KGVja2V5LCBwdWJfa2V5KSA9PSAwKSB7CiAgICAgICBFQ19QT0lOVF9mcmVlKHB1Yl9rZXkpOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9FQ19MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBlY2tleV9wcml2X2RlY29kZSwgRVJSX1JfRUNfTElCKTsKICAgICAgIGdvdG8gZWNsaWJlcnI7CiAgICAgfQogICAgIEVDX1BPSU5UX2ZyZWUocHViX2tleSk7CkBAIC0yNzIsNyArMjcyLDcgQEAKICAgcmV0dXJuIDE7CiAKIGVjbGliZXJyOgotICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX0VDX0xJQik7CisgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfcHJpdl9kZWNvZGUsIEVSUl9SX0VDX0xJQik7CiBlY2VycjoKICAgaWYgKGVja2V5KSB7CiAgICAgRUNfS0VZX2ZyZWUoZWNrZXkpOwpAQCAtMjkwLDcgKzI5MCw3IEBACiAgIGVjX2tleSA9IHBrZXktPnBrZXkuZWM7CiAKICAgaWYgKCFlY2tleV9wYXJhbTJ0eXBlKCZwdHlwZSwgJnB2YWwsIGVjX2tleSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0RFQ09ERV9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBlY2tleV9wcml2X2VuY29kZSwgRVZQX1JfREVDT0RFX0VSUk9SKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0zMDQsMjAgKzMwNCwyMCBAQAogICBlcGxlbiA9IGkyZF9FQ1ByaXZhdGVLZXkoZWNfa2V5LCBOVUxMKTsKICAgaWYgKCFlcGxlbikgewogICAgIEVDX0tFWV9zZXRfZW5jX2ZsYWdzKGVjX2tleSwgb2xkX2ZsYWdzKTsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX0VDX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBlY2tleV9wcml2X2VuY29kZSwgRVJSX1JfRUNfTElCKTsKICAgICByZXR1cm4gMDsKICAgfQogICBlcCA9ICh1aW50OF90ICopT1BFTlNTTF9tYWxsb2MoZXBsZW4pOwogICBpZiAoIWVwKSB7CiAgICAgRUNfS0VZX3NldF9lbmNfZmxhZ3MoZWNfa2V5LCBvbGRfZmxhZ3MpOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfcHJpdl9lbmNvZGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gMDsKICAgfQogICBwID0gZXA7CiAgIGlmICghaTJkX0VDUHJpdmF0ZUtleShlY19rZXksICZwKSkgewogICAgIEVDX0tFWV9zZXRfZW5jX2ZsYWdzKGVjX2tleSwgb2xkX2ZsYWdzKTsKICAgICBPUEVOU1NMX2ZyZWUoZXApOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX1JfRUNfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3ByaXZfZW5jb2RlLCBFUlJfUl9FQ19MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAgIC8qIHJlc3RvcmUgb2xkIGVuY29kaW5nIGZsYWdzICovCkBAIC0zMjUsNyArMzI1LDYgQEAKIAogICBpZiAoIVBLQ1M4X3BrZXlfc2V0MChwOCwgKEFTTjFfT0JKRUNUICopT0JKX25pZDJvYmooTklEX1g5XzYyX2lkX2VjUHVibGljS2V5KSwKICAgICAgICAgICAgICAgICAgICAgICAgMCwgcHR5cGUsIHB2YWwsIGVwLCBlcGxlbikpIHsKLSAgICBPUEVOU1NMX2ZyZWUoZXApOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTQ3OSw3ICs0NzgsNyBAQAogCiBlcnI6CiAgIGlmICghcmV0KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCByZWFzb24pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZG9fRUNfS0VZX3ByaW50LCByZWFzb24pOwogICB9CiAgIE9QRU5TU0xfZnJlZShwdWJfa2V5X2J5dGVzKTsKICAgQk5fZnJlZShvcmRlcik7CkBAIC00OTIsNyArNDkxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXJsZW4pIHsKICAgRUNfS0VZICplY2tleTsKICAgaWYgKCEoZWNrZXkgPSBkMmlfRUNQYXJhbWV0ZXJzKE5VTEwsIHBkZXIsIGRlcmxlbikpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9FQ19MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfcGFyYW1fZGVjb2RlLCBFUlJfUl9FQ19MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAgIEVWUF9QS0VZX2Fzc2lnbl9FQ19LRVkocGtleSwgZWNrZXkpOwpAQCAtNTI3LDcgKzUyNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVybGVuKSB7CiAgIEVDX0tFWSAqZWM7CiAgIGlmICghKGVjID0gZDJpX0VDUHJpdmF0ZUtleShOVUxMLCBwZGVyLCBkZXJsZW4pKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfREVDT0RFX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIG9sZF9lY19wcml2X2RlY29kZSwgRVZQX1JfREVDT0RFX0VSUk9SKTsKICAgICByZXR1cm4gMDsKICAgfQogICBFVlBfUEtFWV9hc3NpZ25fRUNfS0VZKHBrZXksIGVjKTsKQEAgLTU0Myw2ICs1NDIsNyBAQAogICBFVlBfUEtFWV9FQywKICAgMCwKICAgIkVDIiwKKyAgIk9wZW5TU0wgRUMgYWxnb3JpdGhtIiwKIAogICBlY2tleV9wdWJfZGVjb2RlLAogICBlY2tleV9wdWJfZW5jb2RlLApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ldnAvcF9obWFjLmMgYi9zcmMvY3J5cHRvL2V2cC9wX2htYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDMyNTRhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NyeXB0by9ldnAvcF9obWFjLmMKQEAgLTAsMCArMSwyMjMgQEAKKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA3LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9obWFjLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICIuLi9kaWdlc3QvaW50ZXJuYWwuaCIKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IEVWUF9NRCAqbWQ7ICAgICAgIC8qIE1EIGZvciBITUFDIHVzZSAqLworICBBU04xX09DVEVUX1NUUklORyBrdG1wOyAvKiBUZW1wIHN0b3JhZ2UgZm9yIGtleSAqLworICBITUFDX0NUWCBjdHg7Cit9IEhNQUNfUEtFWV9DVFg7CisKK3N0YXRpYyBpbnQgcGtleV9obWFjX2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpIHsKKyAgSE1BQ19QS0VZX0NUWCAqaGN0eDsKKyAgaGN0eCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihITUFDX1BLRVlfQ1RYKSk7CisgIGlmICghaGN0eCkgeworICAgIHJldHVybiAwOworICB9CisgIG1lbXNldChoY3R4LCAwLCBzaXplb2YoSE1BQ19QS0VZX0NUWCkpOworICBoY3R4LT5rdG1wLnR5cGUgPSBWX0FTTjFfT0NURVRfU1RSSU5HOworICBITUFDX0NUWF9pbml0KCZoY3R4LT5jdHgpOworCisgIGN0eC0+ZGF0YSA9IGhjdHg7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGtleV9obWFjX2NvcHkoRVZQX1BLRVlfQ1RYICpkc3QsIEVWUF9QS0VZX0NUWCAqc3JjKSB7CisgIEhNQUNfUEtFWV9DVFggKnNjdHgsICpkY3R4OworICBpZiAoIXBrZXlfaG1hY19pbml0KGRzdCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzY3R4ID0gc3JjLT5kYXRhOworICBkY3R4ID0gZHN0LT5kYXRhOworICBkY3R4LT5tZCA9IHNjdHgtPm1kOworICBITUFDX0NUWF9pbml0KCZkY3R4LT5jdHgpOworICBpZiAoIUhNQUNfQ1RYX2NvcHlfZXgoJmRjdHgtPmN0eCwgJnNjdHgtPmN0eCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoc2N0eC0+a3RtcC5kYXRhKSB7CisgICAgaWYgKCFBU04xX09DVEVUX1NUUklOR19zZXQoJmRjdHgtPmt0bXAsIHNjdHgtPmt0bXAuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3R4LT5rdG1wLmxlbmd0aCkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcGtleV9obWFjX2NsZWFudXAoRVZQX1BLRVlfQ1RYICpjdHgpIHsKKyAgSE1BQ19QS0VZX0NUWCAqaGN0eCA9IGN0eC0+ZGF0YTsKKworICBpZiAoaGN0eCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgSE1BQ19DVFhfY2xlYW51cCgmaGN0eC0+Y3R4KTsKKyAgaWYgKGhjdHgtPmt0bXAuZGF0YSkgeworICAgIGlmIChoY3R4LT5rdG1wLmxlbmd0aCkgeworICAgICAgT1BFTlNTTF9jbGVhbnNlKGhjdHgtPmt0bXAuZGF0YSwgaGN0eC0+a3RtcC5sZW5ndGgpOworICAgIH0KKyAgICBPUEVOU1NMX2ZyZWUoaGN0eC0+a3RtcC5kYXRhKTsKKyAgICBoY3R4LT5rdG1wLmRhdGEgPSBOVUxMOworICB9CisgIE9QRU5TU0xfZnJlZShoY3R4KTsKK30KKworc3RhdGljIGludCBwa2V5X2htYWNfa2V5Z2VuKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfUEtFWSAqcGtleSkgeworICBBU04xX09DVEVUX1NUUklORyAqaGtleSA9IE5VTEw7CisgIEhNQUNfUEtFWV9DVFggKmhjdHggPSBjdHgtPmRhdGE7CisKKyAgaWYgKCFoY3R4LT5rdG1wLmRhdGEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBoa2V5ID0gQVNOMV9PQ1RFVF9TVFJJTkdfZHVwKCZoY3R4LT5rdG1wKTsKKyAgaWYgKCFoa2V5KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRVZQX1BLRVlfYXNzaWduKHBrZXksIEVWUF9QS0VZX0hNQUMsIGhrZXkpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBpbnRfdXBkYXRlKEVWUF9NRF9DVFggKmN0eCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGNvdW50KSB7CisgIEhNQUNfUEtFWV9DVFggKmhjdHggPSBjdHgtPnBjdHgtPmRhdGE7CisgIEhNQUNfVXBkYXRlKCZoY3R4LT5jdHgsIGRhdGEsIGNvdW50KTsKK30KKworc3RhdGljIGludCBobWFjX3NpZ25jdHhfaW5pdChFVlBfUEtFWV9DVFggKmN0eCwgRVZQX01EX0NUWCAqbWN0eCkgeworICAvKiB8bWN0eHwgZ2V0cyByZXB1cnBvc2VkIGFzIGEgaG9vayB0byBjYWxsIHxITUFDX1VwZGF0ZXwuIFN1cHByZXNzIHRoZQorICAgKiBhdXRvbWF0aWMgc2V0dGluZyBvZiB8bWN0eC0+dXBkYXRlfCBhbmQgdGhlIHJlc3Qgb2YgaXRzIGluaXRpYWxpemF0aW9uLiAqLworICBFVlBfTURfQ1RYX3NldF9mbGFncyhtY3R4LCBFVlBfTURfQ1RYX0ZMQUdfTk9fSU5JVCk7CisgIG1jdHgtPnVwZGF0ZSA9IGludF91cGRhdGU7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhtYWNfc2lnbmN0eChFVlBfUEtFWV9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqc2lnLCBzaXplX3QgKnNpZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9NRF9DVFggKm1jdHgpIHsKKyAgdW5zaWduZWQgaW50IGhsZW47CisgIEhNQUNfUEtFWV9DVFggKmhjdHggPSBjdHgtPmRhdGE7CisgIHNpemVfdCBtZF9zaXplID0gRVZQX01EX0NUWF9zaXplKG1jdHgpOworCisgIGlmICghc2lnKSB7CisgICAgKnNpZ2xlbiA9IG1kX3NpemU7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSBpZiAoKnNpZ2xlbiA8IG1kX3NpemUpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGhtYWNfc2lnbmN0eCwgRVZQX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIUhNQUNfRmluYWwoJmhjdHgtPmN0eCwgc2lnLCAmaGxlbikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICAqc2lnbGVuID0gKHNpemVfdClobGVuOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwa2V5X2htYWNfY3RybChFVlBfUEtFWV9DVFggKmN0eCwgaW50IHR5cGUsIGludCBwMSwgdm9pZCAqcDIpIHsKKyAgSE1BQ19QS0VZX0NUWCAqaGN0eCA9IGN0eC0+ZGF0YTsKKyAgQVNOMV9PQ1RFVF9TVFJJTkcgKmtleTsKKworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEVWUF9QS0VZX0NUUkxfU0VUX01BQ19LRVk6CisgICAgICBpZiAoKCFwMiAmJiBwMSA+IDApIHx8IChwMSA8IC0xKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGlmICghQVNOMV9PQ1RFVF9TVFJJTkdfc2V0KCZoY3R4LT5rdG1wLCBwMiwgcDEpKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVWUF9QS0VZX0NUUkxfTUQ6CisgICAgICBoY3R4LT5tZCA9IHAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVWUF9QS0VZX0NUUkxfRElHRVNUSU5JVDoKKyAgICAgIGtleSA9IChBU04xX09DVEVUX1NUUklORyAqKWN0eC0+cGtleS0+cGtleS5wdHI7CisgICAgICBpZiAoIUhNQUNfSW5pdF9leCgmaGN0eC0+Y3R4LCBrZXktPmRhdGEsIGtleS0+bGVuZ3RoLCBoY3R4LT5tZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+ZW5naW5lKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9obWFjX2N0cmwsIEVWUF9SX0NPTU1BTkRfTk9UX1NVUFBPUlRFRCk7CisgICAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworY29uc3QgRVZQX1BLRVlfTUVUSE9EIGhtYWNfcGtleV9tZXRoID0geworICAgIEVWUF9QS0VZX0hNQUMsICAgICAgICAgIDAgLyogZmxhZ3MgKi8sICAgICAgICBwa2V5X2htYWNfaW5pdCwKKyAgICBwa2V5X2htYWNfY29weSwgICAgICAgICBwa2V5X2htYWNfY2xlYW51cCwgICAgMCAvKiBwYXJhbWdlbl9pbml0ICovLAorICAgIDAgLyogcGFyYW1nZW4gKi8sICAgICAgIDAgLyoga2V5Z2VuX2luaXQgKi8sICBwa2V5X2htYWNfa2V5Z2VuLAorICAgIDAgLyogc2lnbl9pbml0ICovLCAgICAgIDAgLyogc2lnbiAqLywgICAgICAgICAwIC8qIHZlcmlmeV9pbml0ICovLAorICAgIDAgLyogdmVyaWZ5ICovLCAgICAgICAgIGhtYWNfc2lnbmN0eF9pbml0LCAgICBobWFjX3NpZ25jdHgsCisgICAgMCAvKiB2ZXJpZnljdHhfaW5pdCAqLywgMCAvKiB2ZXJpZnljdHggKi8sICAgIDAgLyogZW5jcnlwdF9pbml0ICovLAorICAgIDAgLyogZW5jcnlwdCAqLywgICAgICAgIDAgLyogZGVjcnlwdF9pbml0ICovLCAwIC8qIGRlY3J5cHQgKi8sCisgICAgMCAvKiBkZXJpdmVfaW5pdCAqLywgICAgMCAvKiBkZXJpdmUgKi8sICAgICAgIHBrZXlfaG1hY19jdHJsLAorICAgIDAsCit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ldnAvcF9obWFjX2FzbjEuYyBiL3NyYy9jcnlwdG8vZXZwL3BfaG1hY19hc24xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFhNjY3NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdG8vZXZwL3BfaG1hY19hc24xLmMKQEAgLTAsMCArMSw4OSBAQAorLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDcuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RpZ2VzdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworc3RhdGljIGludCBobWFjX3NpemUoY29uc3QgRVZQX1BLRVkgKnBrZXkpIHsgcmV0dXJuIEVWUF9NQVhfTURfU0laRTsgfQorCitzdGF0aWMgdm9pZCBobWFjX2tleV9mcmVlKEVWUF9QS0VZICpwa2V5KSB7CisgIEFTTjFfT0NURVRfU1RSSU5HICpvcyA9IChBU04xX09DVEVUX1NUUklORyAqKXBrZXktPnBrZXkucHRyOworICBpZiAob3MpIHsKKyAgICBpZiAob3MtPmRhdGEpIHsKKyAgICAgIE9QRU5TU0xfY2xlYW5zZShvcy0+ZGF0YSwgb3MtPmxlbmd0aCk7CisgICAgfQorICAgIEFTTjFfT0NURVRfU1RSSU5HX2ZyZWUob3MpOworICB9Cit9CisKK2NvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EIGhtYWNfYXNuMV9tZXRoID0geworICAgIEVWUF9QS0VZX0hNQUMsICAgICAgIEVWUF9QS0VZX0hNQUMsICAgICAgICAgMCAvKiBmbGFncyAqLywKKyAgICAiSE1BQyIsICAgICAgICAgICAgICAiT3BlblNTTCBITUFDIG1ldGhvZCIsIDAgLyogcHViX2RlY29kZSAqLywKKyAgICAwIC8qIHB1Yl9lbmNvZGUgKi8sICAwIC8qIHB1Yl9jbXAgKi8sICAgICAgIDAgLyogcHViX3ByaW50ICovLAorICAgIDAgLypwcml2X2RlY29kZSAqLywgIDAgLyogcHJpdl9lbmNvZGUgKi8sICAgMCAvKiBwcml2X3ByaW50ICovLAorICAgIDAgLyogcGtleV9vcGFxdWUgKi8sIDAgLyogcGtleV9zdXBwb3J0c19kaWdlc3QgKi8sCisgICAgaG1hY19zaXplLCAgICAgICAgICAgMCAvKiBwa2V5X2JpdHMgKi8sICAgICAwIC8qIHBhcmFtX2RlY29kZSAqLywKKyAgICAwIC8qIHBhcmFtX2VuY29kZSovLCAwIC8qIHBhcmFtX21pc3NpbmcqLywgIDAgLyogcGFyYW1fY29weSovLAorICAgIDAgLyogcGFyYW1fY21wKi8sICAgIDAgLyogcGFyYW1fcHJpbnQqLywgICAgMCAvKiBzaWdfcHJpbnQqLywKKyAgICBobWFjX2tleV9mcmVlLCAgICAgICAwIC8qIG9sZF9wcml2X2RlY29kZSAqLywKKyAgICAwIC8qIG9sZF9wcml2X2VuY29kZSAqLworfTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXZwL3BfcnNhLmMgYi9zcmMvY3J5cHRvL2V2cC9wX3JzYS5jCmluZGV4IGNmZWNiZmQuLjVhYmMwNzUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXZwL3BfcnNhLmMKKysrIGIvc3JjL2NyeXB0by9ldnAvcF9yc2EuYwpAQCAtMTc0LDcgKzE3NCw3IEBACiAgIH0KIAogICBpZiAoKnNpZ2xlbiA8IGtleV9sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0JVRkZFUl9UT09fU01BTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9yc2Ffc2lnbiwgRVZQX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTgyLDEyICsxODIsMTIgQEAKICAgICB1bnNpZ25lZCBpbnQgb3V0X2xlbjsKIAogICAgIGlmICh0YnNsZW4gIT0gRVZQX01EX3NpemUocmN0eC0+bWQpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0lOVkFMSURfRElHRVNUX0xFTkdUSCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfcnNhX3NpZ24sIEVWUF9SX0lOVkFMSURfRElHRVNUX0xFTkdUSCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAKICAgICBpZiAoRVZQX01EX3R5cGUocmN0eC0+bWQpID09IE5JRF9tZGMyKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX05PX01EQzJfU1VQUE9SVCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfcnNhX3NpZ24sIEVWUF9SX05PX01EQzJfU1VQUE9SVCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTI2OCw3ICsyNjgsNyBAQAogICB9CiAKICAgaWYgKCpvdXRsZW4gPCBrZXlfbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfcnNhX2VuY3J5cHQsIEVWUF9SX0JVRkZFUl9UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTMwMCw3ICszMDAsNyBAQAogICB9CiAKICAgaWYgKCpvdXRsZW4gPCBrZXlfbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfcnNhX2RlY3J5cHQsIEVWUF9SX0JVRkZFUl9UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTMzMyw3ICszMzMsNyBAQAogICB9CiAKICAgaWYgKHBhZGRpbmcgPT0gUlNBX05PX1BBRERJTkcpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0lOVkFMSURfUEFERElOR19NT0RFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGNoZWNrX3BhZGRpbmdfbWQsIEVWUF9SX0lOVkFMSURfUEFERElOR19NT0RFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0zNjEsNyArMzYxLDggQEAKICAgICAgICAgICAgMCA9PSAoY3R4LT5vcGVyYXRpb24gJiAoRVZQX1BLRVlfT1BfU0lHTiB8IEVWUF9QS0VZX09QX1ZFUklGWSkpKSB8fAogICAgICAgICAgIChwMSA9PSBSU0FfUEtDUzFfT0FFUF9QQURESU5HICYmCiAgICAgICAgICAgIDAgPT0gKGN0eC0+b3BlcmF0aW9uICYgRVZQX1BLRVlfT1BfVFlQRV9DUllQVCkpKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfSUxMRUdBTF9PUl9VTlNVUFBPUlRFRF9QQURESU5HX01PREUpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfcnNhX2N0cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX0lMTEVHQUxfT1JfVU5TVVBQT1JURURfUEFERElOR19NT0RFKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAgICAgICBpZiAoKHAxID09IFJTQV9QS0NTMV9QU1NfUEFERElORyB8fCBwMSA9PSBSU0FfUEtDUzFfT0FFUF9QQURESU5HKSAmJgpAQCAtMzc4LDcgKzM3OSw3IEBACiAgICAgY2FzZSBFVlBfUEtFWV9DVFJMX1JTQV9QU1NfU0FMVExFTjoKICAgICBjYXNlIEVWUF9QS0VZX0NUUkxfR0VUX1JTQV9QU1NfU0FMVExFTjoKICAgICAgIGlmIChyY3R4LT5wYWRfbW9kZSAhPSBSU0FfUEtDUzFfUFNTX1BBRERJTkcpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9JTlZBTElEX1BTU19TQUxUTEVOKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBwa2V5X3JzYV9jdHJsLCBFVlBfUl9JTlZBTElEX1BTU19TQUxUTEVOKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAgICAgICBpZiAodHlwZSA9PSBFVlBfUEtFWV9DVFJMX0dFVF9SU0FfUFNTX1NBTFRMRU4pIHsKQEAgLTM5Myw3ICszOTQsNyBAQAogCiAgICAgY2FzZSBFVlBfUEtFWV9DVFJMX1JTQV9LRVlHRU5fQklUUzoKICAgICAgIGlmIChwMSA8IDI1NikgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0lOVkFMSURfS0VZQklUUyk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9yc2FfY3RybCwgRVZQX1JfSU5WQUxJRF9LRVlCSVRTKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAgICAgICByY3R4LT5uYml0cyA9IHAxOwpAQCAtNDEwLDcgKzQxMSw3IEBACiAgICAgY2FzZSBFVlBfUEtFWV9DVFJMX1JTQV9PQUVQX01EOgogICAgIGNhc2UgRVZQX1BLRVlfQ1RSTF9HRVRfUlNBX09BRVBfTUQ6CiAgICAgICBpZiAocmN0eC0+cGFkX21vZGUgIT0gUlNBX1BLQ1MxX09BRVBfUEFERElORykgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0lOVkFMSURfUEFERElOR19NT0RFKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBwa2V5X3JzYV9jdHJsLCBFVlBfUl9JTlZBTElEX1BBRERJTkdfTU9ERSk7CiAgICAgICAgIHJldHVybiAwOwogICAgICAgfQogICAgICAgaWYgKHR5cGUgPT0gRVZQX1BLRVlfQ1RSTF9HRVRfUlNBX09BRVBfTUQpIHsKQEAgLTQzNSw3ICs0MzYsNyBAQAogICAgIGNhc2UgRVZQX1BLRVlfQ1RSTF9HRVRfUlNBX01HRjFfTUQ6CiAgICAgICBpZiAocmN0eC0+cGFkX21vZGUgIT0gUlNBX1BLQ1MxX1BTU19QQURESU5HICYmCiAgICAgICAgICAgcmN0eC0+cGFkX21vZGUgIT0gUlNBX1BLQ1MxX09BRVBfUEFERElORykgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0lOVkFMSURfTUdGMV9NRCk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9yc2FfY3RybCwgRVZQX1JfSU5WQUxJRF9NR0YxX01EKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAgICAgICBpZiAodHlwZSA9PSBFVlBfUEtFWV9DVFJMX0dFVF9SU0FfTUdGMV9NRCkgewpAQCAtNDUxLDcgKzQ1Miw3IEBACiAKICAgICBjYXNlIEVWUF9QS0VZX0NUUkxfUlNBX09BRVBfTEFCRUw6CiAgICAgICBpZiAocmN0eC0+cGFkX21vZGUgIT0gUlNBX1BLQ1MxX09BRVBfUEFERElORykgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0lOVkFMSURfUEFERElOR19NT0RFKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBwa2V5X3JzYV9jdHJsLCBFVlBfUl9JTlZBTElEX1BBRERJTkdfTU9ERSk7CiAgICAgICAgIHJldHVybiAwOwogICAgICAgfQogICAgICAgT1BFTlNTTF9mcmVlKHJjdHgtPm9hZXBfbGFiZWwpOwpAQCAtNDY4LDE0ICs0NjksMTcgQEAKIAogICAgIGNhc2UgRVZQX1BLRVlfQ1RSTF9HRVRfUlNBX09BRVBfTEFCRUw6CiAgICAgICBpZiAocmN0eC0+cGFkX21vZGUgIT0gUlNBX1BLQ1MxX09BRVBfUEFERElORykgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0lOVkFMSURfUEFERElOR19NT0RFKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBwa2V5X3JzYV9jdHJsLCBFVlBfUl9JTlZBTElEX1BBRERJTkdfTU9ERSk7CiAgICAgICAgIHJldHVybiAwOwogICAgICAgfQogICAgICAgQ0JTX2luaXQoKENCUyAqKXAyLCByY3R4LT5vYWVwX2xhYmVsLCByY3R4LT5vYWVwX2xhYmVsbGVuKTsKICAgICAgIHJldHVybiAxOwogCisgICAgY2FzZSBFVlBfUEtFWV9DVFJMX0RJR0VTVElOSVQ6CisgICAgICByZXR1cm4gMTsKKwogICAgIGRlZmF1bHQ6Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0NPTU1BTkRfTk9UX1NVUFBPUlRFRCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfcnNhX2N0cmwsIEVWUF9SX0NPTU1BTkRfTk9UX1NVUFBPUlRFRCk7CiAgICAgICByZXR1cm4gMDsKICAgfQogfQpAQCAtNTA1LDEzICs1MDksMTQgQEAKIH0KIAogY29uc3QgRVZQX1BLRVlfTUVUSE9EIHJzYV9wa2V5X21ldGggPSB7Ci0gICAgRVZQX1BLRVlfUlNBLCAgICAgICAgIDAgLyogZmxhZ3MgKi8sICAgICAgICBwa2V5X3JzYV9pbml0LAotICAgIHBrZXlfcnNhX2NvcHksICAgICAgICBwa2V5X3JzYV9jbGVhbnVwLCAgICAgMCAvKiBwYXJhbWdlbl9pbml0ICovLAotICAgIDAgLyogcGFyYW1nZW4gKi8sICAgICAwIC8qIGtleWdlbl9pbml0ICovLCAgcGtleV9yc2Ffa2V5Z2VuLAotICAgIDAgLyogc2lnbl9pbml0ICovLCAgICBwa2V5X3JzYV9zaWduLCAgICAgICAgMCAvKiB2ZXJpZnlfaW5pdCAqLywKLSAgICBwa2V5X3JzYV92ZXJpZnksICAgICAgMCAvKiBlbmNyeXB0X2luaXQgKi8sIHBrZXlfcnNhX2VuY3J5cHQsCi0gICAgMCAvKiBkZWNyeXB0X2luaXQgKi8sIHBrZXlfcnNhX2RlY3J5cHQsICAgICAwIC8qIGRlcml2ZV9pbml0ICovLAotICAgIDAgLyogZGVyaXZlICovLCAgICAgICBwa2V5X3JzYV9jdHJsLAorICAgIEVWUF9QS0VZX1JTQSwgICAgICAgICAgIDAgLyogZmxhZ3MgKi8sICAgICAgICBwa2V5X3JzYV9pbml0LAorICAgIHBrZXlfcnNhX2NvcHksICAgICAgICAgIHBrZXlfcnNhX2NsZWFudXAsICAgICAwIC8qIHBhcmFtZ2VuX2luaXQgKi8sCisgICAgMCAvKiBwYXJhbWdlbiAqLywgICAgICAgMCAvKiBrZXlnZW5faW5pdCAqLywgIHBrZXlfcnNhX2tleWdlbiwKKyAgICAwIC8qIHNpZ25faW5pdCAqLywgICAgICBwa2V5X3JzYV9zaWduLCAgICAgICAgMCAvKiB2ZXJpZnlfaW5pdCAqLywKKyAgICBwa2V5X3JzYV92ZXJpZnksICAgICAgICAwIC8qIHNpZ25jdHhfaW5pdCAqLywgMCAvKiBzaWduY3R4ICovLAorICAgIDAgLyogdmVyaWZ5Y3R4X2luaXQgKi8sIDAgLyogdmVyaWZ5Y3R4ICovLCAgICAwIC8qIGVuY3J5cHRfaW5pdCAqLywKKyAgICBwa2V5X3JzYV9lbmNyeXB0LCAgICAgICAwIC8qIGRlY3J5cHRfaW5pdCAqLywgcGtleV9yc2FfZGVjcnlwdCwKKyAgICAwIC8qIGRlcml2ZV9pbml0ICovLCAgICAwIC8qIGRlcml2ZSAqLywgICAgICAgcGtleV9yc2FfY3RybCwKIH07CiAKIGludCBFVlBfUEtFWV9DVFhfc2V0X3JzYV9wYWRkaW5nKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQgcGFkZGluZykgewpAQCAtNTg4LDcgKzU5Myw3IEBACiAgICAgcmV0dXJuIC0xOwogICB9CiAgIGlmIChDQlNfbGVuKCZsYWJlbCkgPiBJTlRfTUFYKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9PVkVSRkxPVyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9DVFhfZ2V0MF9yc2Ffb2FlcF9sYWJlbCwgRVJSX1JfT1ZFUkZMT1cpOwogICAgIHJldHVybiAtMTsKICAgfQogICAqb3V0X2xhYmVsID0gQ0JTX2RhdGEoJmxhYmVsKTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXZwL3BfcnNhX2FzbjEuYyBiL3NyYy9jcnlwdG8vZXZwL3BfcnNhX2FzbjEuYwppbmRleCBmNjA2MjViLi4xZTJkM2Y2IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2V2cC9wX3JzYV9hc24xLmMKKysrIGIvc3JjL2NyeXB0by9ldnAvcF9yc2FfYXNuMS5jCkBAIC01Nyw3ICs1Nyw2IEBACiAKICNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9ieXRlc3RyaW5nLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9kaWdlc3QuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgogI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CkBAIC03MCwxNCArNjksMTYgQEAKIAogCiBzdGF0aWMgaW50IHJzYV9wdWJfZW5jb2RlKFg1MDlfUFVCS0VZICpwaywgY29uc3QgRVZQX1BLRVkgKnBrZXkpIHsKLSAgdWludDhfdCAqZW5jb2RlZDsKLSAgc2l6ZV90IGVuY29kZWRfbGVuOwotICBpZiAoIVJTQV9wdWJsaWNfa2V5X3RvX2J5dGVzKCZlbmNvZGVkLCAmZW5jb2RlZF9sZW4sIHBrZXktPnBrZXkucnNhKSkgeworICB1aW50OF90ICplbmNvZGVkID0gTlVMTDsKKyAgaW50IGxlbjsKKyAgbGVuID0gaTJkX1JTQVB1YmxpY0tleShwa2V5LT5wa2V5LnJzYSwgJmVuY29kZWQpOworCisgIGlmIChsZW4gPD0gMCkgewogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKCFYNTA5X1BVQktFWV9zZXQwX3BhcmFtKHBrLCBPQkpfbmlkMm9iaihFVlBfUEtFWV9SU0EpLCBWX0FTTjFfTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWQsIGVuY29kZWRfbGVuKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZCwgbGVuKSkgewogICAgIE9QRU5TU0xfZnJlZShlbmNvZGVkKTsKICAgICByZXR1cm4gMDsKICAgfQpAQCAtODgsMjUgKzg5LDE2IEBACiBzdGF0aWMgaW50IHJzYV9wdWJfZGVjb2RlKEVWUF9QS0VZICpwa2V5LCBYNTA5X1BVQktFWSAqcHVia2V5KSB7CiAgIGNvbnN0IHVpbnQ4X3QgKnA7CiAgIGludCBwa2xlbjsKKyAgUlNBICpyc2E7CisKICAgaWYgKCFYNTA5X1BVQktFWV9nZXQwX3BhcmFtKE5VTEwsICZwLCAmcGtsZW4sIE5VTEwsIHB1YmtleSkpIHsKICAgICByZXR1cm4gMDsKICAgfQotCi0gIC8qIEVzdG9uaWFuIElEcyBpc3N1ZWQgYmV0d2VlbiBTZXB0ZW1iZXIgMjAxNCB0byBTZXB0ZW1iZXIgMjAxNSBhcmUKLSAgICogYnJva2VuLiBTZWUgaHR0cHM6Ly9jcmJ1Zy5jb20vNTMyMDQ4IGFuZCBodHRwczovL2NyYnVnLmNvbS81MzQ3NjYuCi0gICAqCi0gICAqIFRPRE8oZGF2aWRiZW4pOiBTd2l0Y2ggdGhpcyB0byB0aGUgc3RyaWN0IHZlcnNpb24gaW4gTWFyY2ggMjAxNiBvciB3aGVuCi0gICAqIENocm9taXVtIGNhbiBmb3JjZSBjbGllbnQgY2VydGlmaWNhdGVzIGRvd24gYSBkaWZmZXJlbnQgY29kZXBhdGgsIHdoaWNoZXZlcgotICAgKiBjb21lcyBmaXJzdC4gKi8KLSAgQ0JTIGNiczsKLSAgQ0JTX2luaXQoJmNicywgcCwgcGtsZW4pOwotICBSU0EgKnJzYSA9IFJTQV9wYXJzZV9wdWJsaWNfa2V5X2J1Z2d5KCZjYnMpOwotICBpZiAocnNhID09IE5VTEwgfHwgQ0JTX2xlbigmY2JzKSAhPSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9ERUNPREVfRVJST1IpOwotICAgIFJTQV9mcmVlKHJzYSk7CisgIHJzYSA9IGQyaV9SU0FQdWJsaWNLZXkoTlVMTCwgJnAsIHBrbGVuKTsKKyAgaWYgKHJzYSA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCByc2FfcHViX2RlY29kZSwgRVJSX1JfUlNBX0xJQik7CiAgICAgcmV0dXJuIDA7CiAgIH0KLQogICBFVlBfUEtFWV9hc3NpZ25fUlNBKHBrZXksIHJzYSk7CiAgIHJldHVybiAxOwogfQpAQCAtMTE3LDE3ICsxMDksMjAgQEAKIH0KIAogc3RhdGljIGludCByc2FfcHJpdl9lbmNvZGUoUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDgsIGNvbnN0IEVWUF9QS0VZICpwa2V5KSB7Ci0gIHVpbnQ4X3QgKmVuY29kZWQ7Ci0gIHNpemVfdCBlbmNvZGVkX2xlbjsKLSAgaWYgKCFSU0FfcHJpdmF0ZV9rZXlfdG9fYnl0ZXMoJmVuY29kZWQsICZlbmNvZGVkX2xlbiwgcGtleS0+cGtleS5yc2EpKSB7CisgIHVpbnQ4X3QgKnJrID0gTlVMTDsKKyAgaW50IHJrbGVuOworCisgIHJrbGVuID0gaTJkX1JTQVByaXZhdGVLZXkocGtleS0+cGtleS5yc2EsICZyayk7CisKKyAgaWYgKHJrbGVuIDw9IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHJzYV9wcml2X2VuY29kZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgLyogVE9ETyhmb3JrKTogY29uc3QgY29ycmVjdG5lc3MgaW4gbmV4dCBsaW5lLiAqLwogICBpZiAoIVBLQ1M4X3BrZXlfc2V0MChwOCwgKEFTTjFfT0JKRUNUICopT0JKX25pZDJvYmooTklEX3JzYUVuY3J5cHRpb24pLCAwLAotICAgICAgICAgICAgICAgICAgICAgICBWX0FTTjFfTlVMTCwgTlVMTCwgZW5jb2RlZCwgZW5jb2RlZF9sZW4pKSB7Ci0gICAgT1BFTlNTTF9mcmVlKGVuY29kZWQpOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgICAgICAgICBWX0FTTjFfTlVMTCwgTlVMTCwgcmssIHJrbGVuKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcnNhX3ByaXZfZW5jb2RlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTM3LDE0ICsxMzIsMTYgQEAKIHN0YXRpYyBpbnQgcnNhX3ByaXZfZGVjb2RlKEVWUF9QS0VZICpwa2V5LCBQS0NTOF9QUklWX0tFWV9JTkZPICpwOCkgewogICBjb25zdCB1aW50OF90ICpwOwogICBpbnQgcGtsZW47CisgIFJTQSAqcnNhOworCiAgIGlmICghUEtDUzhfcGtleV9nZXQwKE5VTEwsICZwLCAmcGtsZW4sIE5VTEwsIHA4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcnNhX3ByaXZfZGVjb2RlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAotICBSU0EgKnJzYSA9IFJTQV9wcml2YXRlX2tleV9mcm9tX2J5dGVzKHAsIHBrbGVuKTsKKyAgcnNhID0gZDJpX1JTQVByaXZhdGVLZXkoTlVMTCwgJnAsIHBrbGVuKTsKICAgaWYgKHJzYSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9SU0FfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHJzYV9wcml2X2RlY29kZSwgRVJSX1JfUlNBX0xJQik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjAxLDI0ICsxOTgsMTEgQEAKICAgICB1cGRhdGVfYnVmbGVuKHJzYS0+ZG1wMSwgJmJ1Zl9sZW4pOwogICAgIHVwZGF0ZV9idWZsZW4ocnNhLT5kbXExLCAmYnVmX2xlbik7CiAgICAgdXBkYXRlX2J1Zmxlbihyc2EtPmlxbXAsICZidWZfbGVuKTsKLQotICAgIGlmIChyc2EtPmFkZGl0aW9uYWxfcHJpbWVzICE9IE5VTEwpIHsKLSAgICAgIHNpemVfdCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfbnVtKHJzYS0+YWRkaXRpb25hbF9wcmltZXMpOwotICAgICAgICAgICBpKyspIHsKLSAgICAgICAgY29uc3QgUlNBX2FkZGl0aW9uYWxfcHJpbWUgKmFwID0KLSAgICAgICAgICAgIHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX3ZhbHVlKHJzYS0+YWRkaXRpb25hbF9wcmltZXMsIGkpOwotICAgICAgICB1cGRhdGVfYnVmbGVuKGFwLT5wcmltZSwgJmJ1Zl9sZW4pOwotICAgICAgICB1cGRhdGVfYnVmbGVuKGFwLT5leHAsICZidWZfbGVuKTsKLSAgICAgICAgdXBkYXRlX2J1ZmxlbihhcC0+Y29lZmYsICZidWZfbGVuKTsKLSAgICAgIH0KLSAgICB9CiAgIH0KIAogICBtID0gKHVpbnQ4X3QgKilPUEVOU1NMX21hbGxvYyhidWZfbGVuICsgMTApOwogICBpZiAobSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkb19yc2FfcHJpbnQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0yNTcsMjggKzI0MSw2IEBACiAgICAgICAgICFBU04xX2JuX3ByaW50KG91dCwgImNvZWZmaWNpZW50OiIsIHJzYS0+aXFtcCwgbSwgb2ZmKSkgewogICAgICAgZ290byBlcnI7CiAgICAgfQotCi0gICAgaWYgKHJzYS0+YWRkaXRpb25hbF9wcmltZXMgIT0gTlVMTCAmJgotICAgICAgICBza19SU0FfYWRkaXRpb25hbF9wcmltZV9udW0ocnNhLT5hZGRpdGlvbmFsX3ByaW1lcykgPiAwKSB7Ci0gICAgICBzaXplX3QgaTsKLQotICAgICAgaWYgKEJJT19wcmludGYob3V0LCAib3RoZXJQcmltZUluZm9zOlxuIikgPD0gMCkgewotICAgICAgICBnb3RvIGVycjsKLSAgICAgIH0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBza19SU0FfYWRkaXRpb25hbF9wcmltZV9udW0ocnNhLT5hZGRpdGlvbmFsX3ByaW1lcyk7Ci0gICAgICAgICAgIGkrKykgewotICAgICAgICBjb25zdCBSU0FfYWRkaXRpb25hbF9wcmltZSAqYXAgPQotICAgICAgICAgICAgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfdmFsdWUocnNhLT5hZGRpdGlvbmFsX3ByaW1lcywgaSk7Ci0KLSAgICAgICAgaWYgKEJJT19wcmludGYob3V0LCAib3RoZXJQcmltZUluZm8gKHByaW1lICV1KTpcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkoaSArIDMpKSA8PSAwIHx8Ci0gICAgICAgICAgICAhQVNOMV9ibl9wcmludChvdXQsICJwcmltZToiLCBhcC0+cHJpbWUsIG0sIG9mZikgfHwKLSAgICAgICAgICAgICFBU04xX2JuX3ByaW50KG91dCwgImV4cG9uZW50OiIsIGFwLT5leHAsIG0sIG9mZikgfHwKLSAgICAgICAgICAgICFBU04xX2JuX3ByaW50KG91dCwgImNvZWZmOiIsIGFwLT5jb2VmZiwgbSwgb2ZmKSkgewotICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQogICB9CiAgIHJldCA9IDE7CiAKQEAgLTQ0NSwxOCArNDA3LDE4IEBACiAgIHJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IG9sZF9yc2FfcHJpdl9kZWNvZGUoRVZQX1BLRVkgKnBrZXksIGNvbnN0IHVpbnQ4X3QgKipwZGVyLAorc3RhdGljIGludCBvbGRfcnNhX3ByaXZfZGVjb2RlKEVWUF9QS0VZICpwa2V5LCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVybGVuKSB7CiAgIFJTQSAqcnNhID0gZDJpX1JTQVByaXZhdGVLZXkoTlVMTCwgcGRlciwgZGVybGVuKTsKICAgaWYgKHJzYSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9SU0FfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIG9sZF9yc2FfcHJpdl9kZWNvZGUsIEVSUl9SX1JTQV9MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAgIEVWUF9QS0VZX2Fzc2lnbl9SU0EocGtleSwgcnNhKTsKICAgcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgb2xkX3JzYV9wcml2X2VuY29kZShjb25zdCBFVlBfUEtFWSAqcGtleSwgdWludDhfdCAqKnBkZXIpIHsKK3N0YXRpYyBpbnQgb2xkX3JzYV9wcml2X2VuY29kZShjb25zdCBFVlBfUEtFWSAqcGtleSwgdW5zaWduZWQgY2hhciAqKnBkZXIpIHsKICAgcmV0dXJuIGkyZF9SU0FQcml2YXRlS2V5KHBrZXktPnBrZXkucnNhLCBwZGVyKTsKIH0KIApAQCAtNTEyLDcgKzQ3NCw3IEBACiAgIH0KICAgbWQgPSBFVlBfZ2V0X2RpZ2VzdGJ5b2JqKGFsZy0+YWxnb3JpdGhtKTsKICAgaWYgKG1kID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX1VOS05PV05fRElHRVNUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHJzYV9hbGdvcl90b19tZCwgRVZQX1JfVU5LTk9XTl9ESUdFU1QpOwogICB9CiAgIHJldHVybiBtZDsKIH0KQEAgLTUyNSwxNiArNDg3LDE2IEBACiAgIH0KICAgLyogQ2hlY2sgbWFzayBhbmQgbG9va3VwIG1hc2sgaGFzaCBhbGdvcml0aG0gKi8KICAgaWYgKE9CSl9vYmoybmlkKGFsZy0+YWxnb3JpdGhtKSAhPSBOSURfbWdmMSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfVU5TVVBQT1JURURfTUFTS19BTEdPUklUSE0pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcnNhX21nZjFfdG9fbWQsIEVWUF9SX1VOU1VQUE9SVEVEX01BU0tfQUxHT1JJVEhNKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogICBpZiAoIW1hc2tIYXNoKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9VTlNVUFBPUlRFRF9NQVNLX1BBUkFNRVRFUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCByc2FfbWdmMV90b19tZCwgRVZQX1JfVU5TVVBQT1JURURfTUFTS19QQVJBTUVURVIpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIG1kID0gRVZQX2dldF9kaWdlc3RieW9iaihtYXNrSGFzaC0+YWxnb3JpdGhtKTsKICAgaWYgKG1kID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX1VOS05PV05fTUFTS19ESUdFU1QpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcnNhX21nZjFfdG9fbWQsIEVWUF9SX1VOS05PV05fTUFTS19ESUdFU1QpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIHJldHVybiBtZDsKQEAgLTYxNCwxMyArNTc2LDEzIEBACiAKICAgLyogU2FuaXR5IGNoZWNrOiBtYWtlIHN1cmUgaXQgaXMgUFNTICovCiAgIGlmIChPQkpfb2JqMm5pZChzaWdhbGctPmFsZ29yaXRobSkgIT0gTklEX3JzYXNzYVBzcykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfVU5TVVBQT1JURURfU0lHTkFUVVJFX1RZUEUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcnNhX3Bzc190b19jdHgsIEVWUF9SX1VOU1VQUE9SVEVEX1NJR05BVFVSRV9UWVBFKTsKICAgICByZXR1cm4gMDsKICAgfQogICAvKiBEZWNvZGUgUFNTIHBhcmFtZXRlcnMgKi8KICAgcHNzID0gcnNhX3Bzc19kZWNvZGUoc2lnYWxnLCAmbWFza0hhc2gpOwogICBpZiAocHNzID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0lOVkFMSURfUFNTX1BBUkFNRVRFUlMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcnNhX3Bzc190b19jdHgsIEVWUF9SX0lOVkFMSURfUFNTX1BBUkFNRVRFUlMpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTY0MCw3ICs2MDIsNyBAQAogICAgIC8qIENvdWxkIHBlcmZvcm0gbW9yZSBzYWx0IGxlbmd0aCBzYW5pdHkgY2hlY2tzIGJ1dCB0aGUgbWFpbgogICAgICAqIFJTQSByb3V0aW5lcyB3aWxsIHRyYXAgb3RoZXIgaW52YWxpZCB2YWx1ZXMgYW55d2F5LiAqLwogICAgIGlmIChzYWx0bGVuIDwgMCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9JTlZBTElEX1NBTFRfTEVOR1RIKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcnNhX3Bzc190b19jdHgsIEVWUF9SX0lOVkFMSURfU0FMVF9MRU5HVEgpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9CkBAIC02NDgsNyArNjEwLDcgQEAKICAgLyogbG93LWxldmVsIHJvdXRpbmVzIHN1cHBvcnQgb25seSB0cmFpbGVyIGZpZWxkIDB4YmMgKHZhbHVlIDEpCiAgICAqIGFuZCBQS0NTIzEgc2F5cyB3ZSBzaG91bGQgcmVqZWN0IGFueSBvdGhlciB2YWx1ZSBhbnl3YXkuICovCiAgIGlmIChwc3MtPnRyYWlsZXJGaWVsZCAmJiBBU04xX0lOVEVHRVJfZ2V0KHBzcy0+dHJhaWxlckZpZWxkKSAhPSAxKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9JTlZBTElEX1RSQUlMRVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcnNhX3Bzc190b19jdHgsIEVWUF9SX0lOVkFMSURfVFJBSUxFUik7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNjc2LDcgKzYzOCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1BLRVkgKnBrZXkpIHsKICAgLyogU2FuaXR5IGNoZWNrOiBtYWtlIHN1cmUgaXQgaXMgUFNTICovCiAgIGlmIChPQkpfb2JqMm5pZChzaWdhbGctPmFsZ29yaXRobSkgIT0gTklEX3JzYXNzYVBzcykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfVU5TVVBQT1JURURfU0lHTkFUVVJFX1RZUEUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcnNhX2RpZ2VzdF92ZXJpZnlfaW5pdF9mcm9tX2FsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9VTlNVUFBPUlRFRF9TSUdOQVRVUkVfVFlQRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0dXJuIHJzYV9wc3NfdG9fY3R4KGN0eCwgc2lnYWxnLCBwa2V5KTsKQEAgLTcwOCw2ICs2NzEsNyBAQAogICBBU04xX1BLRVlfU0lHUEFSQU1fTlVMTCwKIAogICAiUlNBIiwKKyAgIk9wZW5TU0wgUlNBIG1ldGhvZCIsCiAKICAgcnNhX3B1Yl9kZWNvZGUsCiAgIHJzYV9wdWJfZW5jb2RlLApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9leF9kYXRhLmMgYi9zcmMvY3J5cHRvL2V4X2RhdGEuYwppbmRleCBmNTYyZjE3Li4xMGZlZmM4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2V4X2RhdGEuYworKysgYi9zcmMvY3J5cHRvL2V4X2RhdGEuYwpAQCAtMTM4LDcgKzEzOCw3IEBACiAKICAgZnVuY3MgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoQ1JZUFRPX0VYX0RBVEFfRlVOQ1MpKTsKICAgaWYgKGZ1bmNzID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDUllQVE8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDUllQVE8sIENSWVBUT19nZXRfZXhfbmV3X2luZGV4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTU2LDEzICsxNTYsMTIgQEAKIAogICBpZiAoZXhfZGF0YV9jbGFzcy0+bWV0aCA9PSBOVUxMIHx8CiAgICAgICAhc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfcHVzaChleF9kYXRhX2NsYXNzLT5tZXRoLCBmdW5jcykpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDUllQVE8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDUllQVE8sIENSWVBUT19nZXRfZXhfbmV3X2luZGV4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgT1BFTlNTTF9mcmVlKGZ1bmNzKTsKICAgICBnb3RvIGVycjsKICAgfQogCi0gICpvdXRfaW5kZXggPSBza19DUllQVE9fRVhfREFUQV9GVU5DU19udW0oZXhfZGF0YV9jbGFzcy0+bWV0aCkgLSAxICsKLSAgICAgICAgICAgICAgIGV4X2RhdGFfY2xhc3MtPm51bV9yZXNlcnZlZDsKKyAgKm91dF9pbmRleCA9IHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX251bShleF9kYXRhX2NsYXNzLT5tZXRoKSAtIDE7CiAgIHJldCA9IDE7CiAKIGVycjoKQEAgLTE3Niw3ICsxNzUsNyBAQAogICBpZiAoYWQtPnNrID09IE5VTEwpIHsKICAgICBhZC0+c2sgPSBza192b2lkX25ld19udWxsKCk7CiAgICAgaWYgKGFkLT5zayA9PSBOVUxMKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihDUllQVE8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENSWVBUTywgQ1JZUFRPX3NldF9leF9kYXRhLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgIH0KQEAgLTE4Niw3ICsxODUsNyBAQAogICAvKiBBZGQgTlVMTCB2YWx1ZXMgdW50aWwgdGhlIHN0YWNrIGlzIGxvbmcgZW5vdWdoLiAqLwogICBmb3IgKGkgPSBuOyBpIDw9IGluZGV4OyBpKyspIHsKICAgICBpZiAoIXNrX3ZvaWRfcHVzaChhZC0+c2ssIE5VTEwpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihDUllQVE8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENSWVBUTywgQ1JZUFRPX3NldF9leF9kYXRhLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgIH0KQEAgLTIyMyw3ICsyMjIsNyBAQAogICBDUllQVE9fU1RBVElDX01VVEVYX3VubG9jaygmZXhfZGF0YV9jbGFzcy0+bG9jayk7CiAKICAgaWYgKG4gPiAwICYmICpvdXQgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENSWVBUTywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENSWVBUTywgZ2V0X2Z1bmNfcG9pbnRlcnMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0yNDUsOCArMjQ0LDggQEAKICAgICBDUllQVE9fRVhfREFUQV9GVU5DUyAqZnVuY19wb2ludGVyID0KICAgICAgICAgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfdmFsdWUoZnVuY19wb2ludGVycywgaSk7CiAgICAgaWYgKGZ1bmNfcG9pbnRlci0+bmV3X2Z1bmMpIHsKLSAgICAgIGZ1bmNfcG9pbnRlci0+bmV3X2Z1bmMob2JqLCBOVUxMLCBhZCwgaSArIGV4X2RhdGFfY2xhc3MtPm51bV9yZXNlcnZlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19wb2ludGVyLT5hcmdsLCBmdW5jX3BvaW50ZXItPmFyZ3ApOworICAgICAgZnVuY19wb2ludGVyLT5uZXdfZnVuYyhvYmosIE5VTEwsIGFkLCBpLCBmdW5jX3BvaW50ZXItPmFyZ2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfcG9pbnRlci0+YXJncCk7CiAgICAgfQogICB9CiAKQEAgLTI3MywxMiArMjcyLDEyIEBACiAgIGZvciAoaSA9IDA7IGkgPCBza19DUllQVE9fRVhfREFUQV9GVU5DU19udW0oZnVuY19wb2ludGVycyk7IGkrKykgewogICAgIENSWVBUT19FWF9EQVRBX0ZVTkNTICpmdW5jX3BvaW50ZXIgPQogICAgICAgICBza19DUllQVE9fRVhfREFUQV9GVU5DU192YWx1ZShmdW5jX3BvaW50ZXJzLCBpKTsKLSAgICB2b2lkICpwdHIgPSBDUllQVE9fZ2V0X2V4X2RhdGEoZnJvbSwgaSArIGV4X2RhdGFfY2xhc3MtPm51bV9yZXNlcnZlZCk7CisgICAgdm9pZCAqcHRyID0gQ1JZUFRPX2dldF9leF9kYXRhKGZyb20sIGkpOwogICAgIGlmIChmdW5jX3BvaW50ZXItPmR1cF9mdW5jKSB7Ci0gICAgICBmdW5jX3BvaW50ZXItPmR1cF9mdW5jKHRvLCBmcm9tLCAmcHRyLCBpICsgZXhfZGF0YV9jbGFzcy0+bnVtX3Jlc2VydmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX3BvaW50ZXItPmFyZ2wsIGZ1bmNfcG9pbnRlci0+YXJncCk7CisgICAgICBmdW5jX3BvaW50ZXItPmR1cF9mdW5jKHRvLCBmcm9tLCAmcHRyLCBpLCBmdW5jX3BvaW50ZXItPmFyZ2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfcG9pbnRlci0+YXJncCk7CiAgICAgfQotICAgIENSWVBUT19zZXRfZXhfZGF0YSh0bywgaSArIGV4X2RhdGFfY2xhc3MtPm51bV9yZXNlcnZlZCwgcHRyKTsKKyAgICBDUllQVE9fc2V0X2V4X2RhdGEodG8sIGksIHB0cik7CiAgIH0KIAogICBza19DUllQVE9fRVhfREFUQV9GVU5DU19mcmVlKGZ1bmNfcG9pbnRlcnMpOwpAQCAtMjk5LDkgKzI5OCw5IEBACiAgICAgQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgKmZ1bmNfcG9pbnRlciA9CiAgICAgICAgIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX3ZhbHVlKGZ1bmNfcG9pbnRlcnMsIGkpOwogICAgIGlmIChmdW5jX3BvaW50ZXItPmZyZWVfZnVuYykgewotICAgICAgdm9pZCAqcHRyID0gQ1JZUFRPX2dldF9leF9kYXRhKGFkLCBpICsgZXhfZGF0YV9jbGFzcy0+bnVtX3Jlc2VydmVkKTsKLSAgICAgIGZ1bmNfcG9pbnRlci0+ZnJlZV9mdW5jKG9iaiwgcHRyLCBhZCwgaSArIGV4X2RhdGFfY2xhc3MtPm51bV9yZXNlcnZlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfcG9pbnRlci0+YXJnbCwgZnVuY19wb2ludGVyLT5hcmdwKTsKKyAgICAgIHZvaWQgKnB0ciA9IENSWVBUT19nZXRfZXhfZGF0YShhZCwgaSk7CisgICAgICBmdW5jX3BvaW50ZXItPmZyZWVfZnVuYyhvYmosIHB0ciwgYWQsIGksIGZ1bmNfcG9pbnRlci0+YXJnbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfcG9pbnRlci0+YXJncCk7CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vaGtkZi9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vaGtkZi9DTWFrZUxpc3RzLnR4dAppbmRleCA1M2JmNTU4Li42NmQ2ODBhIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2hrZGYvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9oa2RmL0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCiAKIGFkZF9saWJyYXJ5KAogICBoa2RmCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2hrZGYvaGtkZi5jIGIvc3JjL2NyeXB0by9oa2RmL2hrZGYuYwppbmRleCBmOWNkY2IwLi5iYjdmNWE0IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2hrZGYvaGtkZi5jCisrKyBiL3NyYy9jcnlwdG8vaGtkZi9oa2RmLmMKQEAgLTQwLDcgKzQwLDcgQEAKICAgLyogRXhwYW5kIGtleSBtYXRlcmlhbCB0byBkZXNpcmVkIGxlbmd0aC4gKi8KICAgbiA9IChvdXRfbGVuICsgZGlnZXN0X2xlbiAtIDEpIC8gZGlnZXN0X2xlbjsKICAgaWYgKG91dF9sZW4gKyBkaWdlc3RfbGVuIDwgb3V0X2xlbiB8fCBuID4gMjU1KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoSEtERiwgSEtERl9SX09VVFBVVF9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEhLREYsIEhLREYsIEhLREZfUl9PVVRQVVRfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC04Myw3ICs4Myw3IEBACiBvdXQ6CiAgIEhNQUNfQ1RYX2NsZWFudXAoJmhtYWMpOwogICBpZiAocmV0ICE9IDEpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihIS0RGLCBFUlJfUl9ITUFDX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoSEtERiwgSEtERiwgRVJSX1JfSE1BQ19MSUIpOwogICB9CiAgIHJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2htYWMvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2htYWMvQ01ha2VMaXN0cy50eHQKaW5kZXggMzkyY2UwMS4uMTFkMjY3ZiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9obWFjL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vaG1hYy9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgaG1hYwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9obWFjL2htYWMuYyBiL3NyYy9jcnlwdG8vaG1hYy9obWFjLmMKaW5kZXggZDM3YTI0OS4uNTU2ZTdmOSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9obWFjL2htYWMuYworKysgYi9zcmMvY3J5cHRvL2htYWMvaG1hYy5jCkBAIC05Nyw3ICs5Nyw3IEBACiAgIEVWUF9NRF9DVFhfY2xlYW51cCgmY3R4LT5pX2N0eCk7CiAgIEVWUF9NRF9DVFhfY2xlYW51cCgmY3R4LT5vX2N0eCk7CiAgIEVWUF9NRF9DVFhfY2xlYW51cCgmY3R4LT5tZF9jdHgpOwotICBPUEVOU1NMX2NsZWFuc2UoY3R4LCBzaXplb2YoSE1BQ19DVFgpKTsKKyAgT1BFTlNTTF9jbGVhbnNlKGN0eCwgc2l6ZW9mKGN0eCkpOwogfQogCiBpbnQgSE1BQ19Jbml0X2V4KEhNQUNfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmtleSwgc2l6ZV90IGtleV9sZW4sCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2htYWMvaG1hY190ZXN0cy50eHQgYi9zcmMvY3J5cHRvL2htYWMvaG1hY190ZXN0cy50eHQKaW5kZXggNTNmM2Y4Zi4uMDEyZjU5MyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9obWFjL2htYWNfdGVzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vaG1hYy9obWFjX3Rlc3RzLnR4dApAQCAtMSwzICsxLDYgQEAKKyMgVGhpcyB0ZXN0IGZpbGUgaXMgc2hhcmVkIGJldHdlZW4gZXZwX3Rlc3QgYW5kIGhtYWNfdGVzdCwgdG8gdGVzdCB0aGUgbGVnYWN5CisjIEVWUF9QS0VZX0hNQUMgQVBJLgorCiBITUFDID0gTUQ1CiAjIE5vdGU6IFRoZSBlbXB0eSBrZXkgcmVzdWx0cyBpbiBwYXNzaW5nIE5VTEwgdG8gSE1BQ19Jbml0X2V4LCBzbyB0aGlzIHRlc3RzCiAjIHRoYXQgSE1BQ19DVFggYW5kIEhNQUMgdHJlYXQgTlVMTCBhcyB0aGUgZW1wdHkga2V5IGluaXRpYWxseS4KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vaW50ZXJuYWwuaCBiL3NyYy9jcnlwdG8vaW50ZXJuYWwuaAppbmRleCA3MTM2NTlkLi41OWVkZGQwIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2ludGVybmFsLmgKKysrIGIvc3JjL2NyeXB0by9pbnRlcm5hbC5oCkBAIC00NTIsNyArNDUyLDYgQEAKIHR5cGVkZWYgZW51bSB7CiAgIE9QRU5TU0xfVEhSRUFEX0xPQ0FMX0VSUiA9IDAsCiAgIE9QRU5TU0xfVEhSRUFEX0xPQ0FMX1JBTkQsCi0gIE9QRU5TU0xfVEhSRUFEX0xPQ0FMX1VSQU5ET01fQlVGLAogICBPUEVOU1NMX1RIUkVBRF9MT0NBTF9URVNULAogICBOVU1fT1BFTlNTTF9USFJFQURfTE9DQUxTLAogfSB0aHJlYWRfbG9jYWxfZGF0YV90OwpAQCAtNDk0LDE0ICs0OTMsOSBAQAogdHlwZWRlZiBzdHJ1Y3QgewogICBzdHJ1Y3QgQ1JZUFRPX1NUQVRJQ19NVVRFWCBsb2NrOwogICBTVEFDS19PRihDUllQVE9fRVhfREFUQV9GVU5DUykgKm1ldGg7Ci0gIC8qIG51bV9yZXNlcnZlZCBpcyBvbmUgaWYgdGhlIGV4X2RhdGEgaW5kZXggemVybyBpcyByZXNlcnZlZCBmb3IgbGVnYWN5Ci0gICAqIHxUWVBFX2dldF9hcHBfZGF0YXwgZnVuY3Rpb25zLiAqLwotICB1aW50OF90IG51bV9yZXNlcnZlZDsKIH0gQ1JZUFRPX0VYX0RBVEFfQ0xBU1M7CiAKLSNkZWZpbmUgQ1JZUFRPX0VYX0RBVEFfQ0xBU1NfSU5JVCB7Q1JZUFRPX1NUQVRJQ19NVVRFWF9JTklULCBOVUxMLCAwfQotI2RlZmluZSBDUllQVE9fRVhfREFUQV9DTEFTU19JTklUX1dJVEhfQVBQX0RBVEEgXAotICAgIHtDUllQVE9fU1RBVElDX01VVEVYX0lOSVQsIE5VTEwsIDF9CisjZGVmaW5lIENSWVBUT19FWF9EQVRBX0NMQVNTX0lOSVQge0NSWVBUT19TVEFUSUNfTVVURVhfSU5JVCwgTlVMTH0KIAogLyogQ1JZUFRPX2dldF9leF9uZXdfaW5kZXggYWxsb2NhdGVzIGEgbmV3IGluZGV4IGZvciB8ZXhfZGF0YV9jbGFzc3wgYW5kIHdyaXRlcwogICogaXQgdG8gfCpvdXRfaW5kZXh8LiBFYWNoIGNsYXNzIG9mIG9iamVjdCBzaG91bGQgcHJvdmlkZSBhIHdyYXBwZXIgZnVuY3Rpb24KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vbGhhc2gvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2xoYXNoL0NNYWtlTGlzdHMudHh0CmluZGV4IGNlNzg1ZWIuLmM3MWI4YTEgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vbGhhc2gvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9saGFzaC9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgbGhhc2gKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vbGhhc2gvbGhhc2guYyBiL3NyYy9jcnlwdG8vbGhhc2gvbGhhc2guYwppbmRleCAyNTc5MDBlLi5jMjgyZmE4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2xoYXNoL2xoYXNoLmMKKysrIGIvc3JjL2NyeXB0by9saGFzaC9saGFzaC5jCkBAIC0xLDUgKzEsNCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KICAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vbWQ0L0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9tZDQvQ01ha2VMaXN0cy50eHQKaW5kZXggNTkxNDBhNy4uZGI3YTE4NyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9tZDQvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9tZDQvQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKIAogYWRkX2xpYnJhcnkoCiAgIG1kNApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9tZDUvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL21kNS9DTWFrZUxpc3RzLnR4dAppbmRleCBhMzdjNDdlLi42YzVlODBmIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL21kNS9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL21kNS9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQogCiBpZiAoJHtBUkNIfSBTVFJFUVVBTCAieDg2XzY0IikKICAgc2V0KApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9tZDUvbWQ1LmMgYi9zcmMvY3J5cHRvL21kNS9tZDUuYwppbmRleCA2YWQ4ZDEyLi41NTc1ZWZiIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL21kNS9tZDUuYworKysgYi9zcmMvY3J5cHRvL21kNS9tZDUuYwpAQCAtMSw1ICsxLDQgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCiAgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL21lbS5jIGIvc3JjL2NyeXB0by9tZW0uYwppbmRleCBlZGQxNGE4Li5jZTQxNDQwIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL21lbS5jCisrKyBiL3NyYy9jcnlwdG8vbWVtLmMKQEAgLTEsNSArMSw0IEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgogICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9tb2Rlcy9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vbW9kZXMvQ01ha2VMaXN0cy50eHQKaW5kZXggNmRhNTIwNy4uZmZiMjliNiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9tb2Rlcy9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL21vZGVzL0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCiAKIGlmICgke0FSQ0h9IFNUUkVRVUFMICJ4ODZfNjQiKQogICBzZXQoCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL21vZGVzL2FzbS9naGFzaC1hcm12NC5wbCBiL3NyYy9jcnlwdG8vbW9kZXMvYXNtL2doYXNoLWFybXY0LnBsCmluZGV4IGRjNWI5OWUuLjI1YTRlMjcgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vbW9kZXMvYXNtL2doYXNoLWFybXY0LnBsCisrKyBiL3NyYy9jcnlwdG8vbW9kZXMvYXNtL2doYXNoLWFybXY0LnBsCkBAIC00NSw3ICs0NSw3IEBACiAjIHByb2Nlc3NlcyBvbmUgYnl0ZSBpbiA4LjQ1IGN5Y2xlcywgQTkgLSBpbiAxMC4yLCBBMTUgLSBpbiA3LjYzLAogIyBTbmFwZHJhZ29uIFM0IC0gaW4gOS4zMy4KICMKLSMgQ8OibWFyYSwgRC47IEdvdXbDqmEsIEMuIFAuIEwuOyBMw7NwZXosIEouICYgRGFoYWIsIFIuOiBGYXN0IFNvZnR3YXJlCisjIEPibWFyYSwgRC47IEdvdXbqYSwgQy4gUC4gTC47IEzzcGV6LCBKLiAmIERhaGFiLCBSLjogRmFzdCBTb2Z0d2FyZQogIyBQb2x5bm9taWFsIE11bHRpcGxpY2F0aW9uIG9uIEFSTSBQcm9jZXNzb3JzIHVzaW5nIHRoZSBORU9OIEVuZ2luZS4KICMgCiAjIGh0dHA6Ly9jb25yYWRvcGxnLmNyeXB0b2xhbmQubmV0L2ZpbGVzLzIwMTAvMTIvbW9jcnlzZW4xMy5wZGYKQEAgLTEzNCw3ICsxMzQsNyBAQAogCiAkY29kZT08PF9fXzsKICNpZiBkZWZpbmVkKF9fYXJtX18pCi0jaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorI2luY2x1ZGUgImFybV9hcmNoLmgiCiAKIC5zeW50YXggdW5pZmllZAogCkBAIC00NTcsMTIgKzQ1NywxMiBAQAogCXZlb3IJCSRJTiwkWGwJCQlAIGlucF49WGkKIC5MZ211bHRfbmVvbjoKIF9fXwotCSZjbG11bDY0eDY0CSgkWGwsJEhsbywiJElOI2xvIik7CSMgSC5sb8K3WGkubG8KKwkmY2xtdWw2NHg2NAkoJFhsLCRIbG8sIiRJTiNsbyIpOwkjIEgubG+3WGkubG8KICRjb2RlLj08PF9fXzsKIAl2ZW9yCQkkSU4jbG8sJElOI2xvLCRJTiNoaQlAIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZwogX19fCi0JJmNsbXVsNjR4NjQJKCRYbSwkSGhsLCIkSU4jbG8iKTsJIyAoSC5sbytILmhpKcK3KFhpLmxvK1hpLmhpKQotCSZjbG11bDY0eDY0CSgkWGgsJEhoaSwiJElOI2hpIik7CSMgSC5oacK3WGkuaGkKKwkmY2xtdWw2NHg2NAkoJFhtLCRIaGwsIiRJTiNsbyIpOwkjIChILmxvK0guaGkptyhYaS5sbytYaS5oaSkKKwkmY2xtdWw2NHg2NAkoJFhoLCRIaGksIiRJTiNoaSIpOwkjIEguaGm3WGkuaGkKICRjb2RlLj08PF9fXzsKIAl2ZW9yCQkkWG0sJFhtLCRYbAkJQCBLYXJhdHN1YmEgcG9zdC1wcm9jZXNzaW5nCiAJdmVvcgkJJFhtLCRYbSwkWGgKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vbW9kZXMvYXNtL2doYXNoLXg4Ni5wbCBiL3NyYy9jcnlwdG8vbW9kZXMvYXNtL2doYXNoLXg4Ni5wbAppbmRleCAwMjY5MTY5Li4yM2E1NTI3IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL21vZGVzL2FzbS9naGFzaC14ODYucGwKKysrIGIvc3JjL2NyeXB0by9tb2Rlcy9hc20vZ2hhc2gteDg2LnBsCkBAIC0zNTgsNyArMzU4LDcgQEAKICMgZWZmZWN0aXZlIGFkZHJlc3MgY2FsY3VsYXRpb24gYW5kIGZpbmFsbHkgbWVyZ2Ugb2YgdmFsdWUgdG8gWi5oaS4KICMgUmVmZXJlbmNlIHRvIHJlbV80Yml0IGlzIHNjaGVkdWxlZCBzbyBsYXRlIHRoYXQgSSBoYWQgdG8gPj40CiAjIHJlbV80Yml0IGVsZW1lbnRzLiBUaGlzIHJlc3VsdGVkIGluIDIwLTQ1JSBwcm9jZW50IGltcHJvdmVtZW50Ci0jIG9uIGNvbnRlbXBvcmFyeSDCtS1hcmNocy4KKyMgb24gY29udGVtcG9yYXJ5ILUtYXJjaHMuCiB7CiAgICAgbXkgJGNudDsKICAgICBteSAkcmVtXzRiaXQgPSAiZWF4IjsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vbW9kZXMvYXNtL2doYXNoLXg4Nl82NC5wbCBiL3NyYy9jcnlwdG8vbW9kZXMvYXNtL2doYXNoLXg4Nl82NC5wbAppbmRleCA1YTdjZTM5Li42ZTY1NmNhIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL21vZGVzL2FzbS9naGFzaC14ODZfNjQucGwKKysrIGIvc3JjL2NyeXB0by9tb2Rlcy9hc20vZ2hhc2gteDg2XzY0LnBsCkBAIC01NzYsMTUgKzU3NiwxNSBAQAogCSMgZXhwZXJpbWVudGFsIGFsdGVybmF0aXZlLiBzcGVjaWFsIHRoaW5nIGFib3V0IGlzIHRoYXQgdGhlcmUKIAkjIG5vIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgdHdvIG11bHRpcGxpY2F0aW9ucy4uLiAKIAltb3YJCVwkYDB4RTE8PDFgLCVlYXgKLQltb3YJCVwkMHhBMDQwNjA4MDIwQzBFMDAwLCVyMTAJIyAoKDcuLjApwrcweEUwKSYweGZmCisJbW92CQlcJDB4QTA0MDYwODAyMEMwRTAwMCwlcjEwCSMgKCg3Li4wKbcweEUwKSYweGZmCiAJbW92CQlcJDB4MDcsJXIxMWQKIAltb3ZxCQklcmF4LCRUMQogCW1vdnEJCSVyMTAsJFQyCiAJbW92cQkJJXIxMSwkVDMJCSMgYm9ycm93ICRUMwogCXBhbmQJCSRYaSwkVDMKLQlwc2h1ZmIJCSRUMywkVDIJCQkjICgkWGkmNynCtzB4RTAKKwlwc2h1ZmIJCSRUMywkVDIJCQkjICgkWGkmNym3MHhFMAogCW1vdnEJCSVyYXgsJFQzCi0JcGNsbXVscWRxCVwkMHgwMCwkWGksJFQxCQkjIMK3KDB4RTE8PDEpCisJcGNsbXVscWRxCVwkMHgwMCwkWGksJFQxCQkjILcoMHhFMTw8MSkKIAlweG9yCQkkWGksJFQyCiAJcHNsbGRxCQlcJDE1LCRUMgogCXBhZGRkCQkkVDIsJFQyCQkJIyA8PCg2NCs1NisxKQpAQCAtNjU3LDcgKzY1Nyw3IEBACiAJamUJCS5Mc2tpcDR4CiAKIAlzdWIJCVwkMHgzMCwkbGVuCi0JbW92CQlcJDB4QTA0MDYwODAyMEMwRTAwMCwlcmF4CSMgKCg3Li4wKcK3MHhFMCkmMHhmZgorCW1vdgkJXCQweEEwNDA2MDgwMjBDMEUwMDAsJXJheAkjICgoNy4uMCm3MHhFMCkmMHhmZgogCW1vdmRxdQkJMHgzMCgkSHRibCksJEhrZXkzCiAJbW92ZHF1CQkweDQwKCRIdGJsKSwkSGtleTQKIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9tb2Rlcy9hc20vZ2hhc2h2OC1hcm14LnBsIGIvc3JjL2NyeXB0by9tb2Rlcy9hc20vZ2hhc2h2OC1hcm14LnBsCmluZGV4IDNhN2I4ZDguLjY4Njk1MWYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vbW9kZXMvYXNtL2doYXNodjgtYXJteC5wbAorKysgYi9zcmMvY3J5cHRvL21vZGVzL2FzbS9naGFzaHY4LWFybXgucGwKQEAgLTU0LDcgKzU0LDcgQEAKIG15ICgkdDAsJHQxLCR0MiwkeEMyLCRILCRIaGwsJEgyKT1tYXAoInEkXyIsKDguLjE0KSk7CiAKICRjb2RlPTw8X19fOwotI2luY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKyNpbmNsdWRlICJhcm1fYXJjaC5oIgogCiAudGV4dAogX19fCkBAIC0xNDgsMTAgKzE0OCwxMCBAQAogI2VuZGlmCiAJdmV4dC44CQkkSU4sJHQxLCR0MSwjOAogCi0JdnBtdWxsLnA2NAkkWGwsJEgsJElOCQlAIEgubG/Ct1hpLmxvCisJdnBtdWxsLnA2NAkkWGwsJEgsJElOCQlAIEgubG+3WGkubG8KIAl2ZW9yCQkkdDEsJHQxLCRJTgkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKLQl2cG11bGwyLnA2NAkkWGgsJEgsJElOCQlAIEguaGnCt1hpLmhpCi0JdnBtdWxsLnA2NAkkWG0sJEhobCwkdDEJCUAgKEgubG8rSC5oaSnCtyhYaS5sbytYaS5oaSkKKwl2cG11bGwyLnA2NAkkWGgsJEgsJElOCQlAIEguaGm3WGkuaGkKKwl2cG11bGwucDY0CSRYbSwkSGhsLCR0MQkJQCAoSC5sbytILmhpKbcoWGkubG8rWGkuaGkpCiAKIAl2ZXh0LjgJCSR0MSwkWGwsJFhoLCM4CQlAIEthcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKIAl2ZW9yCQkkdDIsJFhsLCRYaApAQCAtMjM5LDcgKzIzOSw3IEBACiAjZW5kaWYKIAl2ZXh0LjgJCSRJbiwkdDEsJHQxLCM4CiAJdmVvcgkJJElOLCRJTiwkWGwJCUAgSVtpXV49WGkKLQl2cG11bGwucDY0CSRYbG4sJEgsJEluCQlAIEjCt0lpKzEKKwl2cG11bGwucDY0CSRYbG4sJEgsJEluCQlAIEi3SWkrMQogCXZlb3IJCSR0MSwkdDEsJEluCQlAIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZwogCXZwbXVsbDIucDY0CSRYaG4sJEgsJEluCiAJYgkJLkxvb3BfbW9kMnhfdjgKQEAgLTI0OCwxNCArMjQ4LDE0IEBACiAuTG9vcF9tb2QyeF92ODoKIAl2ZXh0LjgJCSR0MiwkSU4sJElOLCM4CiAJc3VicwkJJGxlbiwkbGVuLCMzMgkJQCBpcyB0aGVyZSBtb3JlIGRhdGE/Ci0JdnBtdWxsLnA2NAkkWGwsJEgyLCRJTgkJQCBIXjIubG/Ct1hpLmxvCisJdnBtdWxsLnA2NAkkWGwsJEgyLCRJTgkJQCBIXjIubG+3WGkubG8KIAljY2xyCQkkaW5jLGxvCQkJQCBpcyBpdCB0aW1lIHRvIHplcm8gJGluYz8KIAogCSB2cG11bGwucDY0CSRYbW4sJEhobCwkdDEKIAl2ZW9yCQkkdDIsJHQyLCRJTgkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKLQl2cG11bGwyLnA2NAkkWGgsJEgyLCRJTgkJQCBIXjIuaGnCt1hpLmhpCisJdnBtdWxsMi5wNjQJJFhoLCRIMiwkSU4JCUAgSF4yLmhpt1hpLmhpCiAJdmVvcgkJJFhsLCRYbCwkWGxuCQlAIGFjY3VtdWxhdGUKLQl2cG11bGwyLnA2NAkkWG0sJEhobCwkdDIJCUAgKEheMi5sbytIXjIuaGkpwrcoWGkubG8rWGkuaGkpCisJdnBtdWxsMi5wNjQJJFhtLCRIaGwsJHQyCQlAIChIXjIubG8rSF4yLmhpKbcoWGkubG8rWGkuaGkpCiAJIHZsZDEuNjQJeyR0MH0sWyRpbnBdLCRpbmMJQCBsb2FkIFtyb3RhdGVkXSBJW2krMl0KIAogCXZlb3IJCSRYaCwkWGgsJFhobgpAQCAtMjgwLDcgKzI4MCw3IEBACiAJIHZleHQuOAkJJEluLCR0MSwkdDEsIzgKIAkgdmV4dC44CQkkSU4sJHQwLCR0MCwjOAogCXZlb3IJCSRYbCwkWG0sJHQyCi0JIHZwbXVsbC5wNjQJJFhsbiwkSCwkSW4JCUAgSMK3SWkrMQorCSB2cG11bGwucDY0CSRYbG4sJEgsJEluCQlAIEi3SWkrMQogCXZlb3IJCSRJTiwkSU4sJFhoCQlAIGFjY3VtdWxhdGUgJElOIGVhcmx5CiAKIAl2ZXh0LjgJCSR0MiwkWGwsJFhsLCM4CQlAIDJuZCBwaGFzZSBvZiByZWR1Y3Rpb24KQEAgLTMwNCwxMCArMzA0LDEwIEBACiAJdmVvcgkJJElOLCRJTiwkWGwJCUAgaW5wXj1YaQogCXZlb3IJCSR0MSwkdDAsJHQyCQlAICR0MSBpcyByb3RhdGVkIGlucF5YaQogCi0JdnBtdWxsLnA2NAkkWGwsJEgsJElOCQlAIEgubG/Ct1hpLmxvCisJdnBtdWxsLnA2NAkkWGwsJEgsJElOCQlAIEgubG+3WGkubG8KIAl2ZW9yCQkkdDEsJHQxLCRJTgkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKLQl2cG11bGwyLnA2NAkkWGgsJEgsJElOCQlAIEguaGnCt1hpLmhpCi0JdnBtdWxsLnA2NAkkWG0sJEhobCwkdDEJCUAgKEgubG8rSC5oaSnCtyhYaS5sbytYaS5oaSkKKwl2cG11bGwyLnA2NAkkWGgsJEgsJElOCQlAIEguaGm3WGkuaGkKKwl2cG11bGwucDY0CSRYbSwkSGhsLCR0MQkJQCAoSC5sbytILmhpKbcoWGkubG8rWGkuaGkpCiAKIAl2ZXh0LjgJCSR0MSwkWGwsJFhoLCM4CQlAIEthcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKIAl2ZW9yCQkkdDIsJFhsLCRYaApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9tb2Rlcy9nY20uYyBiL3NyYy9jcnlwdG8vbW9kZXMvZ2NtLmMKaW5kZXggNTkzZGNlOC4uYjFjMTBiMyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9tb2Rlcy9nY20uYworKysgYi9zcmMvY3J5cHRvL21vZGVzL2djbS5jCkBAIC0zNDksMTIgKzM0OSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbik7CiAjZW5kaWYKICNlbGlmIGRlZmluZWQoT1BFTlNTTF9BUk0pIHx8IGRlZmluZWQoT1BFTlNTTF9BQVJDSDY0KQotI2luY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKyNpbmNsdWRlICIuLi9hcm1fYXJjaC5oIgogI2lmIF9fQVJNX0FSQ0hfXyA+PSA3CiAjZGVmaW5lIEdIQVNIX0FTTV9BUk0KICNkZWZpbmUgR0NNX0ZVTkNSRUZfNEJJVAogCi1zdGF0aWMgaW50IHBtdWxsX2NhcGFibGUodm9pZCkgeworc3RhdGljIGludCBwbXVsbF9jYXBhYmxlKCkgewogICByZXR1cm4gKE9QRU5TU0xfYXJtY2FwX1AgJiBBUk1WOF9QTVVMTCkgIT0gMDsKIH0KIApAQCAtMzY1LDcgKzM2NSw3IEBACiAKICNpZiBkZWZpbmVkKE9QRU5TU0xfQVJNKQogLyogMzItYml0IEFSTSBhbHNvIGhhcyBzdXBwb3J0IGZvciBkb2luZyBHQ00gd2l0aCBORU9OIGluc3RydWN0aW9ucy4gKi8KLXN0YXRpYyBpbnQgbmVvbl9jYXBhYmxlKHZvaWQpIHsKK3N0YXRpYyBpbnQgbmVvbl9jYXBhYmxlKCkgewogICByZXR1cm4gQ1JZUFRPX2lzX05FT05fY2FwYWJsZSgpOwogfQogCkBAIC0zNzUsNyArMzc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbik7CiAjZWxzZQogLyogQUFyY2g2NCBvbmx5IGhhcyB0aGUgQVJNdjggdmVyc2lvbnMgb2YgZnVuY3Rpb25zLiAqLwotc3RhdGljIGludCBuZW9uX2NhcGFibGUodm9pZCkgeworc3RhdGljIGludCBuZW9uX2NhcGFibGUoKSB7CiAgIHJldHVybiAwOwogfQogdm9pZCBnY21faW5pdF9uZW9uKHUxMjggSHRhYmxlWzE2XSwgY29uc3QgdWludDY0X3QgWGlbMl0pIHsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vbW9kZXMvZ2NtX3Rlc3QuYyBiL3NyYy9jcnlwdG8vbW9kZXMvZ2NtX3Rlc3QuYwppbmRleCA4OWVkNzkyLi5hODgxOWVhIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL21vZGVzL2djbV90ZXN0LmMKKysrIGIvc3JjL2NyeXB0by9tb2Rlcy9nY21fdGVzdC5jCkBAIC01NSw3ICs1NSw2IEBACiAjaW5jbHVkZSA8b3BlbnNzbC9tb2Rlcy5oPgogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKLSNpbmNsdWRlICIuLi90ZXN0L3Rlc3RfdXRpbC5oIgogCiAKIHN0cnVjdCB0ZXN0X2Nhc2UgewpAQCAtMjk5LDYgKzI5OCwxNyBAQAogICByZXR1cm4gMDsKIH0KIAordm9pZCBoZXhkdW1wKGNvbnN0IGNoYXIgKm1zZywgY29uc3Qgdm9pZCAqaW4sIHNpemVfdCBsZW4pIHsKKyAgY29uc3QgdWludDhfdCAqZGF0YSA9IGluOworICBzaXplX3QgaTsKKworICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBtc2cpOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiUwMngiLCBkYXRhW2ldKTsKKyAgfQorICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKIHN0YXRpYyBpbnQgcnVuX3Rlc3RfY2FzZSh1bnNpZ25lZCB0ZXN0X251bSwgY29uc3Qgc3RydWN0IHRlc3RfY2FzZSAqdGVzdCkgewogICBzaXplX3Qga2V5X2xlbiwgcGxhaW50ZXh0X2xlbiwgYWRkaXRpb25hbF9kYXRhX2xlbiwgbm9uY2VfbGVuLCBjaXBoZXJ0ZXh0X2xlbiwKICAgICAgIHRhZ19sZW47CkBAIC0zNTcsOCArMzY3LDggQEAKICAgaWYgKCFDUllQVE9fZ2NtMTI4X2ZpbmlzaCgmY3R4LCB0YWcsIHRhZ19sZW4pIHx8CiAgICAgICAoY2lwaGVydGV4dCAmJiBtZW1jbXAob3V0LCBjaXBoZXJ0ZXh0LCBwbGFpbnRleHRfbGVuKSAhPSAwKSkgewogICAgIGZwcmludGYoc3RkZXJyLCAiJXU6IGVuY3J5cHQgZmFpbGVkLlxuIiwgdGVzdF9udW0pOwotICAgIGhleGR1bXAoc3RkZXJyLCAiZ290IDoiLCBvdXQsIHBsYWludGV4dF9sZW4pOwotICAgIGhleGR1bXAoc3RkZXJyLCAid2FudDoiLCBjaXBoZXJ0ZXh0LCBwbGFpbnRleHRfbGVuKTsKKyAgICBoZXhkdW1wKCJnb3QgIiwgb3V0LCBwbGFpbnRleHRfbGVuKTsKKyAgICBoZXhkdW1wKCJ3YW50IiwgY2lwaGVydGV4dCwgcGxhaW50ZXh0X2xlbik7CiAgICAgZ290byBvdXQ7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9tb2Rlcy9pbnRlcm5hbC5oIGIvc3JjL2NyeXB0by9tb2Rlcy9pbnRlcm5hbC5oCmluZGV4IGNhZWFjNDAuLmQxMjQwNWUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vbW9kZXMvaW50ZXJuYWwuaAorKysgYi9zcmMvY3J5cHRvL21vZGVzL2ludGVybmFsLmgKQEAgLTE3Myw2ICsxNzMsMTEgQEAKICAgdm9pZCAqa2V5OwogfTsKIAorc3RydWN0IHh0czEyOF9jb250ZXh0IHsKKyAgdm9pZCAqa2V5MSwgKmtleTI7CisgIGJsb2NrMTI4X2YgYmxvY2sxLCBibG9jazI7Cit9OworCiBzdHJ1Y3QgY2NtMTI4X2NvbnRleHQgewogICB1bmlvbiB7CiAgICAgdWludDY0X3QgdVsyXTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vb2JqL0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9vYmovQ01ha2VMaXN0cy50eHQKaW5kZXggYjhhNGVmMy4uYTI3ZTUwNCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9vYmovQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9vYmovQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKIAogYWRkX2xpYnJhcnkoCiAgIG9iagpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9vYmovb2JqLmMgYi9zcmMvY3J5cHRvL29iai9vYmouYwppbmRleCA5NGY3MzljLi5iZjE2ZDE3IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL29iai9vYmouYworKysgYi9zcmMvY3J5cHRvL29iai9vYmouYwpAQCAtMTA4LDcgKzEwOCw3IEBACiAKICAgciA9IEFTTjFfT0JKRUNUX25ldygpOwogICBpZiAociA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoT0JKLCBFUlJfUl9BU04xX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoT0JKLCBPQkpfZHVwLCBFUlJfUl9BU04xX0xJQik7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgci0+bG4gPSByLT5zbiA9IE5VTEw7CkBAIC0xNDksNyArMTQ5LDcgQEAKICAgcmV0dXJuIHI7CiAKIGVycjoKLSAgT1BFTlNTTF9QVVRfRVJST1IoT0JKLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgIE9QRU5TU0xfUFVUX0VSUk9SKE9CSiwgT0JKX2R1cCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICBPUEVOU1NMX2ZyZWUobG4pOwogICBPUEVOU1NMX2ZyZWUoc24pOwogICBPUEVOU1NMX2ZyZWUoZGF0YSk7CkBAIC0zMzcsNyArMzM3LDcgQEAKICAgQ1JZUFRPX1NUQVRJQ19NVVRFWF91bmxvY2soJmdsb2JhbF9hZGRlZF9sb2NrKTsKIAogZXJyOgotICBPUEVOU1NMX1BVVF9FUlJPUihPQkosIE9CSl9SX1VOS05PV05fTklEKTsKKyAgT1BFTlNTTF9QVVRfRVJST1IoT0JKLCBPQkpfbmlkMm9iaiwgT0JKX1JfVU5LTk9XTl9OSUQpOwogICByZXR1cm4gTlVMTDsKIH0KIApAQCAtMzg4LDcgKzM4OCw3IEBACiAKICAgYnVmID0gT1BFTlNTTF9tYWxsb2ModG90YWxfbGVuKTsKICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoT0JKLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoT0JKLCBPQkpfdHh0Mm9iaiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKQEAgLTYzNiw3ICs2MzYsNyBAQAogCiAgIGJ1ZiA9IE9QRU5TU0xfbWFsbG9jKGxlbik7CiAgIGlmIChidWYgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKE9CSiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKE9CSiwgT0JKX2NyZWF0ZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcGVtL0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9wZW0vQ01ha2VMaXN0cy50eHQKaW5kZXggMzBkZDdjOS4uNzIwYmEyZiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9wZW0vQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9wZW0vQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKIAogYWRkX2xpYnJhcnkoCiAgIHBlbQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9wZW0vcGVtX2luZm8uYyBiL3NyYy9jcnlwdG8vcGVtL3BlbV9pbmZvLmMKaW5kZXggYjRhZTgwNS4uM2YwMjYxOSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9wZW0vcGVtX2luZm8uYworKysgYi9zcmMvY3J5cHRvL3BlbS9wZW1faW5mby5jCkBAIC04MCw3ICs4MCw3IEBACiAKICAgICAgICAgaWYgKChiPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIEVSUl9SX0JVRl9MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9YNTA5X0lORk9fcmVhZCwgRVJSX1JfQlVGX0xJQik7CiAgICAgICAgICAgICAgICAgcmV0dXJuKDApOwogCQl9CiAgICAgICAgIEJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CkBAIC0xMDcsNyArMTA3LDcgQEAKIAkJewogCQlpZiAoKHJldD1za19YNTA5X0lORk9fbmV3X251bGwoKSkgPT0gTlVMTCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fWDUwOV9JTkZPX3JlYWRfYmlvLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJfQpAQCAtMjQ4LDEzICsyNDgsMTMgQEAKIAkJCQkJewogCQkJCQlpZiAoIWQyaV9Qcml2YXRlS2V5KHB0eXBlLCBwcCwgJnAsIGxlbikpCiAJCQkJCQl7Ci0JCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIEVSUl9SX0FTTjFfTElCKTsKKwkJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1g1MDlfSU5GT19yZWFkX2JpbywgRVJSX1JfQVNOMV9MSUIpOwogCQkJCQkJZ290byBlcnI7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQllbHNlIGlmIChkMmkocHAsJnAsbGVuKSA9PSBOVUxMKQogCQkJCQl7Ci0JCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfQVNOMV9MSUIpOworCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9YNTA5X0lORk9fcmVhZF9iaW8sIEVSUl9SX0FTTjFfTElCKTsKIAkJCQkJZ290byBlcnI7CiAJCQkJCX0KIAkJCQl9CkBAIC0zMjYsNyArMzI2LDcgQEAKIAkJb2Jqc3RyPU9CSl9uaWQyc24oRVZQX0NJUEhFUl9uaWQoZW5jKSk7CiAJCWlmIChvYmpzdHIgPT0gTlVMTCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1JfVU5TVVBQT1JURURfQ0lQSEVSKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1g1MDlfSU5GT193cml0ZV9iaW8sIFBFTV9SX1VOU1VQUE9SVEVEX0NJUEhFUik7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJfQpAQCAtMzQyLDcgKzM0Miw3IEBACiAJCQl7CiAJCQlpZiAoZW5jID09IE5VTEwpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1JfQ0lQSEVSX0lTX05VTEwpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1g1MDlfSU5GT193cml0ZV9iaW8sIFBFTV9SX0NJUEhFUl9JU19OVUxMKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CiAKQEAgLTM2MCw3ICszNjAsNyBAQAogCQkJCUVWUF9DSVBIRVJfbmlkKHhpLT5lbmNfY2lwaGVyLmNpcGhlcikpOwogCQkJaWYgKG9ianN0ciA9PSBOVUxMKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9SX1VOU1VQUE9SVEVEX0NJUEhFUik7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fWDUwOV9JTkZPX3dyaXRlX2JpbywgUEVNX1JfVU5TVVBQT1JURURfQ0lQSEVSKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcGVtL3BlbV9saWIuYyBiL3NyYy9jcnlwdG8vcGVtL3BlbV9saWIuYwppbmRleCA1OTE1Njk2Li41MjAxNDY3IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3BlbS9wZW1fbGliLmMKKysrIGIvc3JjL2NyeXB0by9wZW0vcGVtX2xpYi5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAogICAgICAgICBpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfQlVGX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX0FTTjFfcmVhZCwgRVJSX1JfQlVGX0xJQik7CiAgICAgICAgICAgICAgICAgcmV0dXJuKDApOwogCQl9CiAgICAgICAgIEJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CkBAIC0yNzUsNyArMjc1LDcgQEAKIAogICAgICAgICBpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfQlVGX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX0FTTjFfd3JpdGUsIEVSUl9SX0JVRl9MSUIpOwogICAgICAgICAgICAgICAgIHJldHVybigwKTsKIAkJfQogICAgICAgICBCSU9fc2V0X2ZwKGIsZnAsQklPX05PQ0xPU0UpOwpAQCAtMzAyLDE0ICszMDIsMTQgQEAKIAkJb2Jqc3RyPU9CSl9uaWQyc24oRVZQX0NJUEhFUl9uaWQoZW5jKSk7CiAJCWlmIChvYmpzdHIgPT0gTlVMTCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1JfVU5TVVBQT1JURURfQ0lQSEVSKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX0FTTjFfd3JpdGVfYmlvLCBQRU1fUl9VTlNVUFBPUlRFRF9DSVBIRVIpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCX0KIAogCWlmICgoZHNpemU9aTJkKHgsTlVMTCkpIDwgMCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIEVSUl9SX0FTTjFfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fQVNOMV93cml0ZV9iaW8sIEVSUl9SX0FTTjFfTElCKTsKIAkJZHNpemU9MDsKIAkJZ290byBlcnI7CiAJCX0KQEAgLTMxOCw3ICszMTgsNyBAQAogCWRhdGE9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYygodW5zaWduZWQgaW50KWRzaXplKzIwKTsKIAlpZiAoZGF0YSA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9BU04xX3dyaXRlX2JpbywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlnb3RvIGVycjsKIAkJfQogCXA9ZGF0YTsKQEAgLTMzNiw3ICszMzYsNyBAQAogIAkJCWtsZW49KCpjYWxsYmFjaykoYnVmLFBFTV9CVUZTSVpFLDEsdSk7CiAJCQlpZiAoa2xlbiA8PSAwKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9SX1JFQURfS0VZKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9BU04xX3dyaXRlX2JpbywgUEVNX1JfUkVBRF9LRVkpOwogCQkJCWdvdG8gZXJyOwogCQkJCX0KIAkJCWtzdHI9KHVuc2lnbmVkIGNoYXIgKilidWY7CkBAIC00MDgsNyArNDA4LDcgQEAKIAlrbGVuPWNhbGxiYWNrKGJ1ZixQRU1fQlVGU0laRSwwLHUpOwogCWlmIChrbGVuIDw9IDApCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9CQURfUEFTU1dPUkRfUkVBRCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX2RvX2hlYWRlciwgUEVNX1JfQkFEX1BBU1NXT1JEX1JFQUQpOwogCQlyZXR1cm4oMCk7CiAJCX0KIApAQCAtNDI4LDcgKzQyOCw3IEBACiAJT1BFTlNTTF9jbGVhbnNlKChjaGFyICopa2V5LHNpemVvZihrZXkpKTsKIAlpZiAoIW8pCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9CQURfREVDUllQVCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX2RvX2hlYWRlciwgUEVNX1JfQkFEX0RFQ1JZUFQpOwogCQlyZXR1cm4oMCk7CiAJCX0KIAlqKz1pOwpAQCAtNDM3LDE4ICs0MzcsMTEgQEAKIAl9CiAKIHN0YXRpYyBjb25zdCBFVlBfQ0lQSEVSKiBjaXBoZXJfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKSB7Ci0gIC8qIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgKGRlcHJlY2F0ZWQpIGZ1bmN0aW9uIHxFVlBfZ2V0X2NpcGhlcmJ5bmFtZXwuICovCi0gIGlmICgwID09IHN0cmNtcChuYW1lLCBTTl9yYzQpKSB7Ci0gICAgcmV0dXJuIEVWUF9yYzQoKTsKLSAgfSBlbHNlIGlmICgwID09IHN0cmNtcChuYW1lLCBTTl9kZXNfY2JjKSkgeworICBpZiAoc3RyY21wKG5hbWUsICJERVMtQ0JDIikgPT0gMCkgewogICAgIHJldHVybiBFVlBfZGVzX2NiYygpOwotICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKG5hbWUsIFNOX2Rlc19lZGUzX2NiYykpIHsKLSAgICByZXR1cm4gRVZQX2Rlc19lZGUzX2NiYygpOwotICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKG5hbWUsIFNOX2Flc18xMjhfY2JjKSkgeworICB9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiQUVTLTEyOC1DQkMiKSA9PSAwKSB7CiAgICAgcmV0dXJuIEVWUF9hZXNfMTI4X2NiYygpOwotICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKG5hbWUsIFNOX2Flc18xOTJfY2JjKSkgewotICAgIHJldHVybiBFVlBfYWVzXzE5Ml9jYmMoKTsKLSAgfSBlbHNlIGlmICgwID09IHN0cmNtcChuYW1lLCBTTl9hZXNfMjU2X2NiYykpIHsKKyAgfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgICJBRVMtMjU2LUNCQyIpID09IDApIHsKICAgICByZXR1cm4gRVZQX2Flc18yNTZfY2JjKCk7CiAgIH0gZWxzZSB7CiAgICAgcmV0dXJuIE5VTEw7CkBAIC00NjUsMTkgKzQ1OCwxOSBAQAogCWlmICgoaGVhZGVyID09IE5VTEwpIHx8ICgqaGVhZGVyID09ICdcMCcpIHx8ICgqaGVhZGVyID09ICdcbicpKQogCQlyZXR1cm4oMSk7CiAJaWYgKHN0cm5jbXAoaGVhZGVyLCJQcm9jLVR5cGU6ICIsMTEpICE9IDApCi0JCXsgT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9OT1RfUFJPQ19UWVBFKTsgcmV0dXJuKDApOyB9CisJCXsgT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fZ2V0X0VWUF9DSVBIRVJfSU5GTywgUEVNX1JfTk9UX1BST0NfVFlQRSk7IHJldHVybigwKTsgfQogCWhlYWRlcis9MTE7CiAJaWYgKCpoZWFkZXIgIT0gJzQnKSByZXR1cm4oMCk7IGhlYWRlcisrOwogCWlmICgqaGVhZGVyICE9ICcsJykgcmV0dXJuKDApOyBoZWFkZXIrKzsKIAlpZiAoc3RybmNtcChoZWFkZXIsIkVOQ1JZUFRFRCIsOSkgIT0gMCkKLQkJeyBPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9SX05PVF9FTkNSWVBURUQpOyByZXR1cm4oMCk7IH0KKwkJeyBPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9nZXRfRVZQX0NJUEhFUl9JTkZPLCBQRU1fUl9OT1RfRU5DUllQVEVEKTsgcmV0dXJuKDApOyB9CiAJZm9yICg7ICgqaGVhZGVyICE9ICdcbicpICYmICgqaGVhZGVyICE9ICdcMCcpOyBoZWFkZXIrKykKIAkJOwogCWlmICgqaGVhZGVyID09ICdcMCcpCi0JCXsgT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9TSE9SVF9IRUFERVIpOyByZXR1cm4oMCk7IH0KKwkJeyBPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9nZXRfRVZQX0NJUEhFUl9JTkZPLCBQRU1fUl9TSE9SVF9IRUFERVIpOyByZXR1cm4oMCk7IH0KIAloZWFkZXIrKzsKIAlpZiAoc3RybmNtcChoZWFkZXIsIkRFSy1JbmZvOiAiLDEwKSAhPSAwKQotCQl7IE9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1JfTk9UX0RFS19JTkZPKTsgcmV0dXJuKDApOyB9CisJCXsgT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fZ2V0X0VWUF9DSVBIRVJfSU5GTywgUEVNX1JfTk9UX0RFS19JTkZPKTsgcmV0dXJuKDApOyB9CiAJaGVhZGVyKz0xMDsKIAogCXA9aGVhZGVyOwpAQCAtNDk2LDcgKzQ4OSw3IEBACiAKIAlpZiAoZW5jID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9VTlNVUFBPUlRFRF9FTkNSWVBUSU9OKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fZ2V0X0VWUF9DSVBIRVJfSU5GTywgUEVNX1JfVU5TVVBQT1JURURfRU5DUllQVElPTik7CiAJCXJldHVybigwKTsKIAkJfQogCWlmICghbG9hZF9pdihoZWFkZXJfcHAsJihjaXBoZXItPml2WzBdKSxFVlBfQ0lQSEVSX2l2X2xlbmd0aChlbmMpKSkKQEAgLTUyMyw3ICs1MTYsNyBAQAogCQkJdj0gKmZyb20tJ2EnKzEwOwogCQllbHNlCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9SX0JBRF9JVl9DSEFSUyk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIGxvYWRfaXYsIFBFTV9SX0JBRF9JVl9DSEFSUyk7CiAJCQlyZXR1cm4oMCk7CiAJCQl9CiAJCWZyb20rKzsKQEAgLTU0Myw3ICs1MzYsNyBAQAogCiAgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBFUlJfUl9CVUZfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fd3JpdGUsIEVSUl9SX0JVRl9MSUIpOwogICAgICAgICAgICAgICAgIHJldHVybigwKTsKIAkJfQogICAgICAgICBCSU9fc2V0X2ZwKGIsZnAsQklPX05PQ0xPU0UpOwpAQCAtNjEwLDcgKzYwMyw3IEBACiAJCU9QRU5TU0xfY2xlYW5zZShidWYsIFBFTV9CVUZTSVpFKjgpOwogCQlPUEVOU1NMX2ZyZWUoYnVmKTsKIAl9Ci0JT1BFTlNTTF9QVVRfRVJST1IoUEVNLCByZWFzb24pOworCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3dyaXRlX2JpbywgcmVhc29uKTsKIAlyZXR1cm4oMCk7CiAJfQogCkBAIC02MjMsNyArNjE2LDcgQEAKIAogICAgICAgICBpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfQlVGX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWQsIEVSUl9SX0JVRl9MSUIpOwogICAgICAgICAgICAgICAgIHJldHVybigwKTsKIAkJfQogICAgICAgICBCSU9fc2V0X2ZwKGIsZnAsQklPX05PQ0xPU0UpOwpAQCAtNjUxLDcgKzY0NCw3IEBACiAJCUJVRl9NRU1fZnJlZShuYW1lQik7CiAJCUJVRl9NRU1fZnJlZShoZWFkZXJCKTsKIAkJQlVGX01FTV9mcmVlKGRhdGFCKTsKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfYmlvLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybigwKTsKIAkJfQogCkBAIC02NjIsNyArNjU1LDcgQEAKIAogCQlpZiAoaSA8PSAwKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9OT19TVEFSVF9MSU5FKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfYmlvLCBQRU1fUl9OT19TVEFSVF9MSU5FKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCkBAIC02NzcsNyArNjcwLDcgQEAKIAkJCQljb250aW51ZTsKIAkJCWlmICghQlVGX01FTV9ncm93KG5hbWVCLGkrOSkpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfYmlvLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJbWVtY3B5KG5hbWVCLT5kYXRhLCYoYnVmWzExXSksaS02KTsKQEAgLTY4Nyw3ICs2ODAsNyBAQAogCQl9CiAJaGw9MDsKIAlpZiAoIUJVRl9NRU1fZ3JvdyhoZWFkZXJCLDI1NikpCi0JCXsgT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7IGdvdG8gZXJyOyB9CisJCXsgT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fcmVhZF9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsgZ290byBlcnI7IH0KIAloZWFkZXJCLT5kYXRhWzBdPSdcMCc7CiAJZm9yICg7OykKIAkJewpAQCAtNjk5LDcgKzY5Miw3IEBACiAKIAkJaWYgKGJ1ZlswXSA9PSAnXG4nKSBicmVhazsKIAkJaWYgKCFCVUZfTUVNX2dyb3coaGVhZGVyQixobCtpKzkpKQotCQkJeyBPUEVOU1NMX1BVVF9FUlJPUihQRU0sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsgZ290byBlcnI7IH0KKwkJCXsgT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fcmVhZF9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsgZ290byBlcnI7IH0KIAkJaWYgKHN0cm5jbXAoYnVmLCItLS0tLUVORCAiLDkpID09IDApCiAJCQl7CiAJCQlub2hlYWQ9MTsKQEAgLTcxMiw3ICs3MDUsNyBAQAogCiAJYmw9MDsKIAlpZiAoIUJVRl9NRU1fZ3JvdyhkYXRhQiwxMDI0KSkKLQkJeyBPUEVOU1NMX1BVVF9FUlJPUihQRU0sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsgZ290byBlcnI7IH0KKwkJeyBPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9yZWFkX2JpbywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOyBnb3RvIGVycjsgfQogCWRhdGFCLT5kYXRhWzBdPSdcMCc7CiAJaWYgKCFub2hlYWQpCiAJCXsKQEAgLTczMCw3ICs3MjMsNyBAQAogCQkJaWYgKGkgPiA2NSkgYnJlYWs7CiAJCQlpZiAoIUJVRl9NRU1fZ3Jvd19jbGVhbihkYXRhQixpK2JsKzkpKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9yZWFkX2JpbywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJCWdvdG8gZXJyOwogCQkJCX0KIAkJCW1lbWNweSgmKGRhdGFCLT5kYXRhW2JsXSksYnVmLGkpOwpAQCAtNzYxLDcgKzc1NCw3IEBACiAJCShzdHJuY21wKG5hbWVCLT5kYXRhLCYoYnVmWzldKSxpKSAhPSAwKSB8fAogCQkoc3RybmNtcCgmKGJ1Zls5K2ldKSwiLS0tLS1cbiIsNikgIT0gMCkpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9CQURfRU5EX0xJTkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9yZWFkX2JpbywgUEVNX1JfQkFEX0VORF9MSU5FKTsKIAkJZ290byBlcnI7CiAJCX0KIApAQCAtNzcxLDEzICs3NjQsMTMgQEAKIAkJKHVuc2lnbmVkIGNoYXIgKilkYXRhQi0+ZGF0YSxibCk7CiAJaWYgKGkgPCAwKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1JfQkFEX0JBU0U2NF9ERUNPREUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9yZWFkX2JpbywgUEVNX1JfQkFEX0JBU0U2NF9ERUNPREUpOwogCQlnb3RvIGVycjsKIAkJfQogCWk9RVZQX0RlY29kZUZpbmFsKCZjdHgsKHVuc2lnbmVkIGNoYXIgKikmKGRhdGFCLT5kYXRhW2JsXSksJmspOwogCWlmIChpIDwgMCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9SX0JBRF9CQVNFNjRfREVDT0RFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fcmVhZF9iaW8sIFBFTV9SX0JBRF9CQVNFNjRfREVDT0RFKTsKIAkJZ290byBlcnI7CiAJCX0KIAlibCs9azsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcGVtL3BlbV9vdGguYyBiL3NyYy9jcnlwdG8vcGVtL3BlbV9vdGguYwppbmRleCAzZThmNmJkLi4yMGQxMmI2IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3BlbS9wZW1fb3RoLmMKKysrIGIvc3JjL2NyeXB0by9wZW0vcGVtX290aC5jCkBAIC04Myw3ICs4Myw3IEBACiAJcCA9IGRhdGE7CiAJcmV0PWQyaSh4LCZwLGxlbik7CiAJaWYgKHJldCA9PSBOVUxMKQotCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIEVSUl9SX0FTTjFfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fQVNOMV9yZWFkX2JpbywgRVJSX1JfQVNOMV9MSUIpOwogCU9QRU5TU0xfZnJlZShkYXRhKTsKIAlyZXR1cm4gcmV0OwogCX0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcGVtL3BlbV9wazguYyBiL3NyYy9jcnlwdG8vcGVtL3BlbV9wazguYwppbmRleCAwODI0NDc3Li4wMzUwMzhlIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3BlbS9wZW1fcGs4LmMKKysrIGIvc3JjL2NyeXB0by9wZW0vcGVtX3BrOC5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIAljaGFyIGJ1ZltQRU1fQlVGU0laRV07CiAJaW50IHJldDsKIAlpZighKHA4aW5mID0gRVZQX1BLRVkyUEtDUzgoeCkpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1JfRVJST1JfQ09OVkVSVElOR19QUklWQVRFX0tFWSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgZG9fcGs4cGtleSwgUEVNX1JfRVJST1JfQ09OVkVSVElOR19QUklWQVRFX0tFWSk7CiAJCXJldHVybiAwOwogCX0KIAlpZihlbmMgfHwgKG5pZCAhPSAtMSkpIHsKQEAgLTEyNyw3ICsxMjcsNyBAQAogCQkJaWYgKCFjYikgY2IgPSBQRU1fZGVmX2NhbGxiYWNrOwogCQkJa2xlbiA9IGNiKGJ1ZiwgUEVNX0JVRlNJWkUsIDEsIHUpOwogCQkJaWYoa2xlbiA8PSAwKSB7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9SRUFEX0tFWSk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBkb19wazhwa2V5LCBQRU1fUl9SRUFEX0tFWSk7CiAJCQkJUEtDUzhfUFJJVl9LRVlfSU5GT19mcmVlKHA4aW5mKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KQEAgLTE2Myw3ICsxNjMsNyBAQAogCWlmICghY2IpIGNiID0gUEVNX2RlZl9jYWxsYmFjazsKIAlrbGVuPWNiKHBzYnVmLFBFTV9CVUZTSVpFLDAsdSk7CiAJaWYgKGtsZW4gPD0gMCkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9SX0JBRF9QQVNTV09SRF9SRUFEKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBkMmlfUEtDUzhQcml2YXRlS2V5X2JpbywgUEVNX1JfQkFEX1BBU1NXT1JEX1JFQUQpOwogCQlYNTA5X1NJR19mcmVlKHA4KTsKIAkJcmV0dXJuIE5VTEw7CQogCX0KQEAgLTIxNiw3ICsyMTYsNyBAQAogCUJJTyAqYnA7CiAJaW50IHJldDsKIAlpZighKGJwID0gQklPX25ld19mcChmcCwgQklPX05PQ0xPU0UpKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIEVSUl9SX0JVRl9MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIGRvX3BrOHBrZXlfZnAsIEVSUl9SX0JVRl9MSUIpOwogICAgICAgICAgICAgICAgIHJldHVybigwKTsKIAl9CiAJcmV0ID0gZG9fcGs4cGtleShicCwgeCwgaXNkZXIsIG5pZCwgZW5jLCBrc3RyLCBrbGVuLCBjYiwgdSk7CkBAIC0yMjksNyArMjI5LDcgQEAKIAlCSU8gKmJwOwogCUVWUF9QS0VZICpyZXQ7CiAJaWYoIShicCA9IEJJT19uZXdfZnAoZnAsIEJJT19OT0NMT1NFKSkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBFUlJfUl9CVUZfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBkMmlfUEtDUzhQcml2YXRlS2V5X2ZwLCBFUlJfUl9CVUZfTElCKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAl9CiAJcmV0ID0gZDJpX1BLQ1M4UHJpdmF0ZUtleV9iaW8oYnAsIHgsIGNiLCB1KTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcGVtL3BlbV9wa2V5LmMgYi9zcmMvY3J5cHRvL3BlbS9wZW1fcGtleS5jCmluZGV4IGM0NjI3MjcuLmZlNTg1NTggMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vcGVtL3BlbV9wa2V5LmMKKysrIGIvc3JjL2NyeXB0by9wZW0vcGVtX3BrZXkuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiAJCWlmICghY2IpIGNiID0gUEVNX2RlZl9jYWxsYmFjazsKIAkJa2xlbj1jYihwc2J1ZixQRU1fQlVGU0laRSwwLHUpOwogCQlpZiAoa2xlbiA8PSAwKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9SX0JBRF9QQVNTV09SRF9SRUFEKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfYmlvX1ByaXZhdGVLZXksIFBFTV9SX0JBRF9QQVNTV09SRF9SRUFEKTsKIAkJCVg1MDlfU0lHX2ZyZWUocDgpOwogCQkJZ290byBlcnI7CiAJCX0KQEAgLTEzMiw3ICsxMzIsNyBAQAogCQl9CiBwOGVycjoKIAlpZiAocmV0ID09IE5VTEwpCi0JCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfQVNOMV9MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9yZWFkX2Jpb19Qcml2YXRlS2V5LCBFUlJfUl9BU04xX0xJQik7CiAKIGVycjoKIAlPUEVOU1NMX2ZyZWUobm0pOwpAQCAtMjEwLDcgKzIxMCw3IEBACiAJCX0KIGVycjoKIAlpZiAocmV0ID09IE5VTEwpCi0JCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfQVNOMV9MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9yZWFkX2Jpb19QYXJhbWV0ZXJzLCBFUlJfUl9BU04xX0xJQik7CiAJT1BFTlNTTF9mcmVlKG5tKTsKIAlPUEVOU1NMX2ZyZWUoZGF0YSk7CiAJcmV0dXJuKHJldCk7CkBAIC0yMzYsNyArMjM2LDcgQEAKIAogICAgICAgICBpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfQlVGX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfUHJpdmF0ZUtleSwgRVJSX1JfQlVGX0xJQik7CiAgICAgICAgICAgICAgICAgcmV0dXJuKDApOwogCQl9CiAgICAgICAgIEJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CkBAIC0yNTQsNyArMjU0LDcgQEAKIAogICAgICAgICBpZiAoKGI9QklPX25ld19mcChmcCwgQklPX05PQ0xPU0UpKSA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfQlVGX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3dyaXRlX1ByaXZhdGVLZXksIEVSUl9SX0JVRl9MSUIpOwogICAgICAgICAgICAgICAgIHJldHVybiAwOwogCQl9CiAgICAgICAgIHJldD1QRU1fd3JpdGVfYmlvX1ByaXZhdGVLZXkoYiwgeCwgZW5jLCBrc3RyLCBrbGVuLCBjYiwgdSk7CkBAIC0yODcsNyArMjg3LDcgQEAKIAkJcmV0ID0gZDJpX0RIcGFyYW1zKHgsICZwLCBsZW4pOwogCiAJaWYgKHJldCA9PSBOVUxMKQotCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIEVSUl9SX0FTTjFfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fcmVhZF9iaW9fREhwYXJhbXMsIEVSUl9SX0FTTjFfTElCKTsKIAlPUEVOU1NMX2ZyZWUobm0pOwogCU9QRU5TU0xfZnJlZShkYXRhKTsKIAlyZXR1cm4gcmV0OwpAQCAtMzAxLDcgKzMwMSw3IEBACiAKICAgICAgICAgaWYgKChiPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIEVSUl9SX0JVRl9MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9yZWFkX0RIcGFyYW1zLCBFUlJfUl9CVUZfTElCKTsKICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CiAJCX0KICAgICAgICAgQklPX3NldF9mcChiLGZwLEJJT19OT0NMT1NFKTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcGVybGFzbS9hcm0teGxhdGUucGwgYi9zcmMvY3J5cHRvL3Blcmxhc20vYXJtLXhsYXRlLnBsCmluZGV4IDcwNmZhNzAuLjgxY2ViMzEgMTAwNzU1Ci0tLSBhL3NyYy9jcnlwdG8vcGVybGFzbS9hcm0teGxhdGUucGwKKysrIGIvc3JjL2NyeXB0by9wZXJsYXNtL2FybS14bGF0ZS5wbApAQCAtMTE2LDkgKzExNiw2IEBACiAgICAgcmV0dXJuICRsaW5lOwogfQogCi1wcmludCAiI2lmIGRlZmluZWQoX19hcm1fXylcbiIgaWYgKCRmbGF2b3VyIGVxICJsaW51eDMyIik7Ci1wcmludCAiI2lmIGRlZmluZWQoX19hYXJjaDY0X18pXG4iIGlmICgkZmxhdm91ciBlcSAibGludXg2NCIpOwotCiB3aGlsZSgkbGluZT08PikgewogCiAgICAgaWYgKCRsaW5lID1+IG0vXlxzKigjfEB8XC9cLykvKQl7IHByaW50ICRsaW5lOyBuZXh0OyB9CkBAIC0xNjUsNiArMTYyLDQgQEAKICAgICBwcmludCAiXG4iOwogfQogCi1wcmludCAiI2VuZGlmIiBpZiAoJGZsYXZvdXIgZXEgImxpbnV4MzIiIHx8ICRmbGF2b3VyIGVxICJsaW51eDY0Iik7Ci0KIGNsb3NlIFNURE9VVDsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcGtjczgvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL3BrY3M4L0NNYWtlTGlzdHMudHh0CmluZGV4IGNlNWJjZTEuLjQ0MjZmMWUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vcGtjczgvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9wa2NzOC9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgcGtjczgKQEAgLTE5LDExICsxOSw0IEBACiAgICQ8VEFSR0VUX09CSkVDVFM6dGVzdF9zdXBwb3J0PgogKQogCi1hZGRfZXhlY3V0YWJsZSgKLSAgcGtjczhfdGVzdAotCi0gIHBrY3M4X3Rlc3QuY2MKLSkKLQotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHBrY3M4X3Rlc3QgY3J5cHRvKQogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHBrY3MxMl90ZXN0IGNyeXB0bykKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcGtjczgvaW50ZXJuYWwuaCBiL3NyYy9jcnlwdG8vcGtjczgvaW50ZXJuYWwuaAppbmRleCA3OTk1ZTc4Li40NGNhNGY3IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3BrY3M4L2ludGVybmFsLmgKKysrIGIvc3JjL2NyeXB0by9wa2NzOC9pbnRlcm5hbC5oCkBAIC02NiwxNSArNjYsNiBAQAogI2RlZmluZSBQS0NTNV9ERUZBVUxUX0lURVJBVElPTlMgMjA0OAogI2RlZmluZSBQS0NTNV9TQUxUX0xFTiA4CiAKLS8qIFBLQ1M1X3YyX1BCRV9rZXlpdmdlbiBpbnRpYWxpemVzIHRoZSBzdXBwbGllZCB8Y3R4fCBmb3IgUEJLREYgdjIsIHdoaWNoIG11c3QKLSAqIGJlIHNwZWNpZmllZCBieSB8cGFyYW18LiBUaGUgcGFzc3dvcmQgaXMgc3BlY2lmaWVkIGJ5IHxwYXNzX3Jhd3wgYW5kCi0gKiB8cGFzc19yYXdfbGVufC4gfGNpcGhlcnwgYW5kIHxtZHwgYXJlIGlnbm9yZWQuCi0gKgotICogSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gKi8KLWludCBQS0NTNV92Ml9QQkVfa2V5aXZnZW4oRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqcGFzc19yYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwYXNzX3Jhd19sZW4sIEFTTjFfVFlQRSAqcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwgY29uc3QgRVZQX01EICptZCwgaW50IGVuYyk7Ci0KIAogI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCiB9ICAvKiBleHRlcm4gQyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9wa2NzOC9wNV9wYmUuYyBiL3NyYy9jcnlwdG8vcGtjczgvcDVfcGJlLmMKaW5kZXggNjUzY2FiZi4uZjMwYWU3OSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9wa2NzOC9wNV9wYmUuYworKysgYi9zcmMvY3J5cHRvL3BrY3M4L3A1X3BiZS5jCkBAIC04NiwyMSArODYsMjEgQEAKIAlwYmUgPSBQQkVQQVJBTV9uZXcoKTsKIAlpZiAoIXBiZSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzVfcGJlX3NldDBfYWxnb3IsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJZ290byBlcnI7CiAJCX0KIAlpZihpdGVyIDw9IDApCiAJCWl0ZXIgPSBQS0NTNV9ERUZBVUxUX0lURVJBVElPTlM7CiAJaWYgKCFBU04xX0lOVEVHRVJfc2V0KHBiZS0+aXRlciwgaXRlcikpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M1X3BiZV9zZXQwX2FsZ29yLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCWdvdG8gZXJyOwogCQl9CiAJaWYgKCFzYWx0bGVuKQogCQlzYWx0bGVuID0gUEtDUzVfU0FMVF9MRU47CiAJaWYgKCFBU04xX1NUUklOR19zZXQocGJlLT5zYWx0LCBOVUxMLCBzYWx0bGVuKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzVfcGJlX3NldDBfYWxnb3IsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJZ290byBlcnI7CiAJCX0KIAlzc3RyID0gQVNOMV9TVFJJTkdfZGF0YShwYmUtPnNhbHQpOwpAQCAtMTExLDcgKzExMSw3IEBACiAKIAlpZighQVNOMV9pdGVtX3BhY2socGJlLCBBU04xX0lURU1fcnB0cihQQkVQQVJBTSksICZwYmVfc3RyKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzVfcGJlX3NldDBfYWxnb3IsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJZ290byBlcnI7CiAJCX0KIApAQCAtMTM4LDcgKzEzOCw3IEBACiAJcmV0ID0gWDUwOV9BTEdPUl9uZXcoKTsKIAlpZiAoIXJldCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzVfcGJlX3NldCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gTlVMTDsKIAkJfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3BrY3M4L3A1X3BiZXYyLmMgYi9zcmMvY3J5cHRvL3BrY3M4L3A1X3BiZXYyLmMKaW5kZXggZjU4YWFlNy4uOWViOTg0OCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9wa2NzOC9wNV9wYmV2Mi5jCisrKyBiL3NyYy9jcnlwdG8vcGtjczgvcDVfcGJldjIuYwpAQCAtNTMsOCArNTMsNiBAQAogICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQogICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KQEAgLTEyNiw3ICsxMjQsNyBAQAogCiAJYWxnX25pZCA9IEVWUF9DSVBIRVJfbmlkKGNpcGhlcik7CiAJaWYoYWxnX25pZCA9PSBOSURfdW5kZWYpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfQ0lQSEVSX0hBU19OT19PQkpFQ1RfSURFTlRJRklFUik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTNV9wYmUyX3NldF9pdiwgUEtDUzhfUl9DSVBIRVJfSEFTX05PX09CSkVDVF9JREVOVElGSUVSKTsKIAkJZ290byBlcnI7CiAJfQogCW9iaiA9IE9CSl9uaWQyb2JqKGFsZ19uaWQpOwpAQCAtMTU0LDcgKzE1Miw3IEBACiAJaWYgKCFFVlBfQ2lwaGVySW5pdF9leCgmY3R4LCBjaXBoZXIsIE5VTEwsIE5VTEwsIGl2LCAwKSkKIAkJZ290byBlcnI7CiAJaWYocGFyYW1fdG9fYXNuMSgmY3R4LCBzY2hlbWUtPnBhcmFtZXRlcikgPCAwKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0VSUk9SX1NFVFRJTkdfQ0lQSEVSX1BBUkFNUyk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTNV9wYmUyX3NldF9pdiwgUEtDUzhfUl9FUlJPUl9TRVRUSU5HX0NJUEhFUl9QQVJBTVMpOwogCQlFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjdHgpOwogCQlnb3RvIGVycjsKIAl9CkBAIC0yMDQsNyArMjAyLDcgQEAKIAlyZXR1cm4gcmV0OwogCiAJbWVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCU9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTNV9wYmUyX3NldF9pdiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCiAJZXJyOgogCVBCRTJQQVJBTV9mcmVlKHBiZTIpOwpAQCAtMjk3LDE0MyArMjk1LDkgQEAKIAlyZXR1cm4ga2V5ZnVuYzsKIAogCW1lcnI6Ci0JT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzVfcGJrZGYyX3NldCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCVBCS0RGMlBBUkFNX2ZyZWUoa2RmKTsKIAlYNTA5X0FMR09SX2ZyZWUoa2V5ZnVuYyk7CiAJcmV0dXJuIE5VTEw7CiAJfQogCi1zdGF0aWMgaW50IFBLQ1M1X3YyX1BCS0RGMl9rZXlpdmdlbihFVlBfQ0lQSEVSX0NUWCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGFzc19yYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGFzc19yYXdfbGVuLCBjb25zdCBBU04xX1RZUEUgKnBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVNOMV9UWVBFICppdiwgaW50IGVuYykgewotICBpbnQgcnYgPSAwOwotICBQQktERjJQQVJBTSAqcGJrZGYycGFyYW0gPSBOVUxMOwotCi0gIGlmIChFVlBfQ0lQSEVSX0NUWF9jaXBoZXIoY3R4KSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIENJUEhFUl9SX05PX0NJUEhFUl9TRVQpOwotICAgIGdvdG8gZXJyOwotICB9Ci0KLSAgLyogRGVjb2RlIHBhcmFtZXRlcnMuICovCi0gIGlmIChwYXJhbSA9PSBOVUxMIHx8IHBhcmFtLT50eXBlICE9IFZfQVNOMV9TRVFVRU5DRSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0RFQ09ERV9FUlJPUik7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICBjb25zdCB1aW50OF90ICpwYnVmID0gcGFyYW0tPnZhbHVlLnNlcXVlbmNlLT5kYXRhOwotICBpbnQgcGxlbiA9IHBhcmFtLT52YWx1ZS5zZXF1ZW5jZS0+bGVuZ3RoOwotICBwYmtkZjJwYXJhbSA9IGQyaV9QQktERjJQQVJBTShOVUxMLCAmcGJ1ZiwgcGxlbik7Ci0gIGlmIChwYmtkZjJwYXJhbSA9PSBOVUxMIHx8IHBidWYgIT0gcGFyYW0tPnZhbHVlLnNlcXVlbmNlLT5kYXRhICsgcGxlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0RFQ09ERV9FUlJPUik7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICAvKiBOb3cgY2hlY2sgdGhlIHBhcmFtZXRlcnMuICovCi0gIHVpbnQ4X3Qga2V5W0VWUF9NQVhfS0VZX0xFTkdUSF07Ci0gIGNvbnN0IHNpemVfdCBrZXlfbGVuID0gRVZQX0NJUEhFUl9DVFhfa2V5X2xlbmd0aChjdHgpOwotICBhc3NlcnQoa2V5X2xlbiA8PSBzaXplb2Yoa2V5KSk7Ci0KLSAgaWYgKHBia2RmMnBhcmFtLT5rZXlsZW5ndGggIT0gTlVMTCAmJgotICAgICAgQVNOMV9JTlRFR0VSX2dldChwYmtkZjJwYXJhbS0+a2V5bGVuZ3RoKSAhPSAoaW50KSBrZXlfbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfVU5TVVBQT1JURURfS0VZTEVOR1RIKTsKLSAgICBnb3RvIGVycjsKLSAgfQotCi0gIGlmIChwYmtkZjJwYXJhbS0+cHJmICE9IE5VTEwgJiYKLSAgICAgIE9CSl9vYmoybmlkKHBia2RmMnBhcmFtLT5wcmYtPmFsZ29yaXRobSkgIT0gTklEX2htYWNXaXRoU0hBMSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX1VOU1VQUE9SVEVEX1BSRik7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICBpZiAocGJrZGYycGFyYW0tPnNhbHQtPnR5cGUgIT0gVl9BU04xX09DVEVUX1NUUklORykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX1VOU1VQUE9SVEVEX1NBTFRfVFlQRSk7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICBpZiAocGJrZGYycGFyYW0tPml0ZXItPnR5cGUgIT0gVl9BU04xX0lOVEVHRVIpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9CQURfSVRFUkFUSU9OX0NPVU5UKTsKLSAgICBnb3RvIGVycjsKLSAgfQotICBsb25nIGl0ZXJhdGlvbnMgPSBBU04xX0lOVEVHRVJfZ2V0KHBia2RmMnBhcmFtLT5pdGVyKTsKLSAgaWYgKGl0ZXJhdGlvbnMgPCAwIHx8IGl0ZXJhdGlvbnMgPiBVSU5UX01BWCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0JBRF9JVEVSQVRJT05fQ09VTlQpOwotICAgIGdvdG8gZXJyOwotICB9Ci0KLSAgaWYgKGl2LT50eXBlICE9IFZfQVNOMV9PQ1RFVF9TVFJJTkcgfHwgaXYtPnZhbHVlLm9jdGV0X3N0cmluZyA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfRVJST1JfU0VUVElOR19DSVBIRVJfUEFSQU1TKTsKLSAgICBnb3RvIGVycjsKLSAgfQotCi0gIGNvbnN0IHNpemVfdCBpdl9sZW4gPSBFVlBfQ0lQSEVSX0NUWF9pdl9sZW5ndGgoY3R4KTsKLSAgaWYgKGl2LT52YWx1ZS5vY3RldF9zdHJpbmctPmxlbmd0aCAhPSBpdl9sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9FUlJPUl9TRVRUSU5HX0NJUEhFUl9QQVJBTVMpOwotICAgIGdvdG8gZXJyOwotICB9Ci0KLSAgaWYgKCFQS0NTNV9QQktERjJfSE1BQ19TSEExKChjb25zdCBjaGFyICopIHBhc3NfcmF3LCBwYXNzX3Jhd19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYmtkZjJwYXJhbS0+c2FsdC0+dmFsdWUub2N0ZXRfc3RyaW5nLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJrZGYycGFyYW0tPnNhbHQtPnZhbHVlLm9jdGV0X3N0cmluZy0+bGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9ucywga2V5X2xlbiwga2V5KSkgewotICAgIGdvdG8gZXJyOwotICB9Ci0KLSAgcnYgPSBFVlBfQ2lwaGVySW5pdF9leChjdHgsIE5VTEwgLyogY2lwaGVyICovLCBOVUxMIC8qIGVuZ2luZSAqLywga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGl2LT52YWx1ZS5vY3RldF9zdHJpbmctPmRhdGEsIGVuYyk7Ci0KLSBlcnI6Ci0gIFBCS0RGMlBBUkFNX2ZyZWUocGJrZGYycGFyYW0pOwotICByZXR1cm4gcnY7Ci19Ci0KLWludCBQS0NTNV92Ml9QQkVfa2V5aXZnZW4oRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqcGFzc19yYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwYXNzX3Jhd19sZW4sIEFTTjFfVFlQRSAqcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9DSVBIRVIgKnVudXNlZCwgY29uc3QgRVZQX01EICp1bnVzZWQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5jKSB7Ci0gIFBCRTJQQVJBTSAqcGJlMnBhcmFtID0gTlVMTDsKLSAgaW50IHJ2ID0gMDsKLQotICBpZiAocGFyYW0gPT0gTlVMTCB8fAotICAgICAgcGFyYW0tPnR5cGUgIT0gVl9BU04xX1NFUVVFTkNFIHx8Ci0gICAgICBwYXJhbS0+dmFsdWUuc2VxdWVuY2UgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0RFQ09ERV9FUlJPUik7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICBjb25zdCB1aW50OF90ICpwYnVmID0gcGFyYW0tPnZhbHVlLnNlcXVlbmNlLT5kYXRhOwotICBpbnQgcGxlbiA9IHBhcmFtLT52YWx1ZS5zZXF1ZW5jZS0+bGVuZ3RoOwotICBwYmUycGFyYW0gPSBkMmlfUEJFMlBBUkFNKE5VTEwsICZwYnVmLCBwbGVuKTsKLSAgaWYgKHBiZTJwYXJhbSA9PSBOVUxMIHx8IHBidWYgIT0gcGFyYW0tPnZhbHVlLnNlcXVlbmNlLT5kYXRhICsgcGxlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0RFQ09ERV9FUlJPUik7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICAvKiBDaGVjayB0aGF0IHRoZSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiBpcyBQQktERjIuICovCi0gIGlmIChPQkpfb2JqMm5pZChwYmUycGFyYW0tPmtleWZ1bmMtPmFsZ29yaXRobSkgIT0gTklEX2lkX3Bia2RmMikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX1VOU1VQUE9SVEVEX0tFWV9ERVJJVkFUSU9OX0ZVTkNUSU9OKTsKLSAgICBnb3RvIGVycjsKLSAgfQotCi0gIC8qIFNlZSBpZiB3ZSByZWNvZ25pc2UgdGhlIGVuY3J5cHRpb24gYWxnb3JpdGhtLiAqLwotICBjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIgPQotICAgICAgRVZQX2dldF9jaXBoZXJieW5pZChPQkpfb2JqMm5pZChwYmUycGFyYW0tPmVuY3J5cHRpb24tPmFsZ29yaXRobSkpOwotICBpZiAoY2lwaGVyID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9VTlNVUFBPUlRFRF9DSVBIRVIpOwotICAgIGdvdG8gZXJyOwotICB9Ci0KLSAgLyogRml4dXAgY2lwaGVyIGJhc2VkIG9uIEFsZ29yaXRobUlkZW50aWZpZXIuICovCi0gIGlmICghRVZQX0NpcGhlckluaXRfZXgoY3R4LCBjaXBoZXIsIE5VTEwgLyogZW5naW5lICovLCBOVUxMIC8qIGtleSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGl2ICovLCBlbmMpKSB7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICBydiA9IFBLQ1M1X3YyX1BCS0RGMl9rZXlpdmdlbihjdHgsIHBhc3NfcmF3LCBwYXNzX3Jhd19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBiZTJwYXJhbS0+a2V5ZnVuYy0+cGFyYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYmUycGFyYW0tPmVuY3J5cHRpb24tPnBhcmFtZXRlciwgZW5jKTsKLQotIGVycjoKLSAgUEJFMlBBUkFNX2ZyZWUocGJlMnBhcmFtKTsKLSAgcmV0dXJuIHJ2OwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9wa2NzOC9wa2NzOC5jIGIvc3JjL2NyeXB0by9wa2NzOC9wa2NzOC5jCmluZGV4IDgwNjdjOTEuLjg0M2M3NGQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vcGtjczgvcGtjczguYworKysgYi9zcmMvY3J5cHRvL3BrY3M4L3BrY3M4LmMKQEAgLTY5LDcgKzY5LDYgQEAKICNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgogI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgogCi0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICIuLi9ieXRlc3RyaW5nL2ludGVybmFsLmgiCiAjaW5jbHVkZSAiLi4vZXZwL2ludGVybmFsLmgiCiAKQEAgLTIwMSw3ICsyMDAsNyBAQAogICB9CiAKIGVycjoKLSAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIHBrY3MxMl9rZXlfZ2VuX3JhdywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCiBlbmQ6CiAgIE9QRU5TU0xfZnJlZShBaSk7CkBAIC0yMjgsMTQgKzIyNywxNCBAQAogICAvKiBFeHRyYWN0IHVzZWZ1bCBpbmZvIGZyb20gcGFyYW1ldGVyICovCiAgIGlmIChwYXJhbSA9PSBOVUxMIHx8IHBhcmFtLT50eXBlICE9IFZfQVNOMV9TRVFVRU5DRSB8fAogICAgICAgcGFyYW0tPnZhbHVlLnNlcXVlbmNlID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9ERUNPREVfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwa2NzMTJfcGJlX2tleWl2Z2VuLCBQS0NTOF9SX0RFQ09ERV9FUlJPUik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBwYnVmID0gcGFyYW0tPnZhbHVlLnNlcXVlbmNlLT5kYXRhOwogICBwYmUgPSBkMmlfUEJFUEFSQU0oTlVMTCwgJnBidWYsIHBhcmFtLT52YWx1ZS5zZXF1ZW5jZS0+bGVuZ3RoKTsKICAgaWYgKHBiZSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfREVDT0RFX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGtjczEyX3BiZV9rZXlpdmdlbiwgUEtDUzhfUl9ERUNPREVfRVJST1IpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTI0OCwxMyArMjQ3LDEzIEBACiAgIHNhbHRfbGVuID0gcGJlLT5zYWx0LT5sZW5ndGg7CiAgIGlmICghcGtjczEyX2tleV9nZW5fcmF3KHBhc3NfcmF3LCBwYXNzX3Jhd19sZW4sIHNhbHQsIHNhbHRfbGVuLCBQS0NTMTJfS0VZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb25zLCBFVlBfQ0lQSEVSX2tleV9sZW5ndGgoY2lwaGVyKSwga2V5LCBtZCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9LRVlfR0VOX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGtjczEyX3BiZV9rZXlpdmdlbiwgUEtDUzhfUl9LRVlfR0VOX0VSUk9SKTsKICAgICBQQkVQQVJBTV9mcmVlKHBiZSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKCFwa2NzMTJfa2V5X2dlbl9yYXcocGFzc19yYXcsIHBhc3NfcmF3X2xlbiwgc2FsdCwgc2FsdF9sZW4sIFBLQ1MxMl9JVl9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9ucywgRVZQX0NJUEhFUl9pdl9sZW5ndGgoY2lwaGVyKSwgaXYsIG1kKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0tFWV9HRU5fRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwa2NzMTJfcGJlX2tleWl2Z2VuLCBQS0NTOF9SX0tFWV9HRU5fRVJST1IpOwogICAgIFBCRVBBUkFNX2ZyZWUocGJlKTsKICAgICByZXR1cm4gMDsKICAgfQpAQCAtMjc1LDkzICsyNzQsNDIgQEAKICAgY29uc3QgRVZQX0NJUEhFUiogKCpjaXBoZXJfZnVuYykodm9pZCk7CiAgIGNvbnN0IEVWUF9NRCogKCptZF9mdW5jKSh2b2lkKTsKICAga2V5Z2VuX2Z1bmMga2V5Z2VuOwotICBpbnQgZmxhZ3M7CiB9OwogCi0jZGVmaW5lIFBCRV9VQ1MyX0NPTlZFUlRfUEFTU1dPUkQgMHgxCi0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGJlX3N1aXRlIGtCdWlsdGluUEJFW10gPSB7CiAgICAgewotICAgICBOSURfcGJlX1dpdGhTSEExQW5kNDBCaXRSQzJfQ0JDLCBFVlBfcmMyXzQwX2NiYywgRVZQX3NoYTEsCi0gICAgIHBrY3MxMl9wYmVfa2V5aXZnZW4sIFBCRV9VQ1MyX0NPTlZFUlRfUEFTU1dPUkQKKyAgICAgTklEX3BiZV9XaXRoU0hBMUFuZDQwQml0UkMyX0NCQywgRVZQX3JjMl80MF9jYmMsIEVWUF9zaGExLCBwa2NzMTJfcGJlX2tleWl2Z2VuLAogICAgIH0sCiAgICAgewogICAgICBOSURfcGJlX1dpdGhTSEExQW5kMTI4Qml0UkM0LCBFVlBfcmM0LCBFVlBfc2hhMSwgcGtjczEyX3BiZV9rZXlpdmdlbiwKLSAgICAgUEJFX1VDUzJfQ09OVkVSVF9QQVNTV09SRAogICAgIH0sCiAgICAgewogICAgICBOSURfcGJlX1dpdGhTSEExQW5kM19LZXlfVHJpcGxlREVTX0NCQywgRVZQX2Rlc19lZGUzX2NiYywgRVZQX3NoYTEsCi0gICAgIHBrY3MxMl9wYmVfa2V5aXZnZW4sIFBCRV9VQ1MyX0NPTlZFUlRfUEFTU1dPUkQKLSAgICB9LAotICAgIHsKLSAgICAgIE5JRF9wYmVzMiwgTlVMTCwgTlVMTCwgIFBLQ1M1X3YyX1BCRV9rZXlpdmdlbiwgMAorICAgICBwa2NzMTJfcGJlX2tleWl2Z2VuLAogICAgIH0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBiZV9zdWl0ZSAqZ2V0X3BiZV9zdWl0ZShpbnQgcGJlX25pZCkgewotICB1bnNpZ25lZCBpOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGtCdWlsdGluUEJFKSAvIHNpemVvZihrQnVpbHRpblBCRVswXSk7IGkrKykgewotICAgIGlmIChrQnVpbHRpblBCRVtpXS5wYmVfbmlkID09IHBiZV9uaWQpIHsKLSAgICAgIHJldHVybiAma0J1aWx0aW5QQkVbaV07Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIHBhc3NfdG9fcGFzc19yYXcgcGVyZm9ybXMgYSBwYXNzd29yZCBjb252ZXJzaW9uIChwb3NzaWJseSBhIG5vLW9wKQotICogYXBwcm9wcmlhdGUgdG8gdGhlIHN1cHBsaWVkIHxwYmVfbmlkfC4gVGhlIGlucHV0IHxwYXNzfCBpcyB0cmVhdGVkIGFzIGEKLSAqIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBpZiB8cGFzc19sZW58IGlzIC0xLCBvdGhlcndpc2UgaXQgaXMgdHJlYXRlZCBhcyBhCi0gKiBidWZmZXIgb2YgdGhlIHNwZWNpZmllZCBsZW5ndGguIElmIHRoZSBzdXBwbGllZCBQQkUgTklEIHNldHMgdGhlCi0gKiB8UEJFX1VDUzJfQ09OVkVSVF9QQVNTV09SRHwgZmxhZywgdGhlIHN1cHBsaWVkIHxwYXNzfCB3aWxsIGJlIGNvbnZlcnRlZCB0bwotICogVUNTLTIuCi0gKgotICogSXQgc2V0cyB8Km91dF9wYXNzX3Jhd3wgdG8gYSBuZXcgYnVmZmVyIHRoYXQgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLiBJdAotICogcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gKi8KLXN0YXRpYyBpbnQgcGFzc190b19wYXNzX3JhdyhpbnQgcGJlX25pZCwgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipvdXRfcGFzc19yYXcsIHNpemVfdCAqb3V0X3Bhc3NfcmF3X2xlbikgewotICBpZiAocGFzcyA9PSBOVUxMKSB7Ci0gICAgKm91dF9wYXNzX3JhdyA9IE5VTEw7Ci0gICAgKm91dF9wYXNzX3Jhd19sZW4gPSAwOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgaWYgKHBhc3NfbGVuID09IC0xKSB7Ci0gICAgcGFzc19sZW4gPSBzdHJsZW4ocGFzcyk7Ci0gIH0gZWxzZSBpZiAocGFzc19sZW4gPCAwIHx8IHBhc3NfbGVuID4gMjAwMDAwMDAwMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFUlJfUl9PVkVSRkxPVyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBjb25zdCBzdHJ1Y3QgcGJlX3N1aXRlICpzdWl0ZSA9IGdldF9wYmVfc3VpdGUocGJlX25pZCk7Ci0gIGlmIChzdWl0ZSAhPSBOVUxMICYmIChzdWl0ZS0+ZmxhZ3MgJiBQQkVfVUNTMl9DT05WRVJUX1BBU1NXT1JEKSkgewotICAgIGlmICghYXNjaWlfdG9fdWNzMihwYXNzLCBwYXNzX2xlbiwgb3V0X3Bhc3NfcmF3LCBvdXRfcGFzc19yYXdfbGVuKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfREVDT0RFX0VSUk9SKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAqb3V0X3Bhc3NfcmF3ID0gQlVGX21lbWR1cChwYXNzLCBwYXNzX2xlbik7Ci0gICAgaWYgKCpvdXRfcGFzc19yYXcgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAqb3V0X3Bhc3NfcmF3X2xlbiA9IChzaXplX3QpcGFzc19sZW47Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQogc3RhdGljIGludCBwYmVfY2lwaGVyX2luaXQoQVNOMV9PQkpFQ1QgKnBiZV9vYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwYXNzX3Jhdywgc2l6ZV90IHBhc3NfcmF3X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTjFfVFlQRSAqcGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlBfQ0lQSEVSX0NUWCAqY3R4LCBpbnQgaXNfZW5jcnlwdCkgewogICBjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXI7CiAgIGNvbnN0IEVWUF9NRCAqbWQ7CisgIHVuc2lnbmVkIGk7CiAKLSAgY29uc3Qgc3RydWN0IHBiZV9zdWl0ZSAqc3VpdGUgPSBnZXRfcGJlX3N1aXRlKE9CSl9vYmoybmlkKHBiZV9vYmopKTsKKyAgY29uc3Qgc3RydWN0IHBiZV9zdWl0ZSAqc3VpdGUgPSBOVUxMOworICBjb25zdCBpbnQgcGJlX25pZCA9IE9CSl9vYmoybmlkKHBiZV9vYmopOworCisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoa0J1aWx0aW5QQkUpIC8gc2l6ZW9mKHN0cnVjdCBwYmVfc3VpdGUpOyBpKyspIHsKKyAgICBpZiAoa0J1aWx0aW5QQkVbaV0ucGJlX25pZCA9PSBwYmVfbmlkKSB7CisgICAgICBzdWl0ZSA9ICZrQnVpbHRpblBCRVtpXTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCiAgIGlmIChzdWl0ZSA9PSBOVUxMKSB7CiAgICAgY2hhciBvYmpfc3RyWzgwXTsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9VTktOT1dOX0FMR09SSVRITSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIHBiZV9jaXBoZXJfaW5pdCwgUEtDUzhfUl9VTktOT1dOX0FMR09SSVRITSk7CiAgICAgaWYgKCFwYmVfb2JqKSB7CiAgICAgICBzdHJuY3B5KG9ial9zdHIsICJOVUxMIiwgc2l6ZW9mKG9ial9zdHIpKTsKICAgICB9IGVsc2UgewpAQCAtMzc2LDcgKzMyNCw3IEBACiAgIH0gZWxzZSB7CiAgICAgY2lwaGVyID0gc3VpdGUtPmNpcGhlcl9mdW5jKCk7CiAgICAgaWYgKCFjaXBoZXIpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX1VOS05PV05fQ0lQSEVSKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwYmVfY2lwaGVyX2luaXQsIFBLQ1M4X1JfVU5LTk9XTl9DSVBIRVIpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICB9CkBAIC0zODYsMTQgKzMzNCwxNCBAQAogICB9IGVsc2UgewogICAgIG1kID0gc3VpdGUtPm1kX2Z1bmMoKTsKICAgICBpZiAoIW1kKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9VTktOT1dOX0RJR0VTVCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGJlX2NpcGhlcl9pbml0LCBQS0NTOF9SX1VOS05PV05fRElHRVNUKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgfQogCiAgIGlmICghc3VpdGUtPmtleWdlbihjdHgsIHBhc3NfcmF3LCBwYXNzX3Jhd19sZW4sIHBhcmFtLCBjaXBoZXIsIG1kLAogICAgICAgICAgICAgICAgICAgICAgaXNfZW5jcnlwdCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9LRVlHRU5fRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIHBiZV9jaXBoZXJfaW5pdCwgUEtDUzhfUl9LRVlHRU5fRkFJTFVSRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNDE0LDMyICszNjIsMzIgQEAKIAogICBpZiAoIXBiZV9jaXBoZXJfaW5pdChhbGdvci0+YWxnb3JpdGhtLCBwYXNzX3JhdywgcGFzc19yYXdfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICBhbGdvci0+cGFyYW1ldGVyLCAmY3R4LCBpc19lbmNyeXB0KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX1VOS05PV05fQ0lQSEVSX0FMR09SSVRITSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIHBiZV9jcnlwdCwgUEtDUzhfUl9VTktOT1dOX0NJUEhFUl9BTEdPUklUSE0pOwogICAgIHJldHVybiAwOwogICB9CiAgIGJsb2NrX3NpemUgPSBFVlBfQ0lQSEVSX0NUWF9ibG9ja19zaXplKCZjdHgpOwogCiAgIGlmIChpbl9sZW4gKyBibG9ja19zaXplIDwgaW5fbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfVE9PX0xPTkcpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwYmVfY3J5cHQsIFBLQ1M4X1JfVE9PX0xPTkcpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgYnVmID0gT1BFTlNTTF9tYWxsb2MoaW5fbGVuICsgYmxvY2tfc2l6ZSk7CiAgIGlmIChidWYgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIHBiZV9jcnlwdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKCFFVlBfQ2lwaGVyVXBkYXRlKCZjdHgsIGJ1ZiwgJm4sIGluLCBpbl9sZW4pKSB7CiAgICAgT1BFTlNTTF9mcmVlKGJ1Zik7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIEVSUl9SX0VWUF9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwYmVfY3J5cHQsIEVSUl9SX0VWUF9MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAgICpvdXRfbGVuID0gbjsKIAogICBpZiAoIUVWUF9DaXBoZXJGaW5hbF9leCgmY3R4LCBidWYgKyBuLCAmbikpIHsKICAgICBPUEVOU1NMX2ZyZWUoYnVmKTsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVJSX1JfRVZQX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIHBiZV9jcnlwdCwgRVJSX1JfRVZQX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgKm91dF9sZW4gKz0gbjsKQEAgLTQ2MiwxNCArNDEwLDE0IEBACiAKICAgaWYgKCFwYmVfY3J5cHQoYWxnb3IsIHBhc3NfcmF3LCBwYXNzX3Jhd19sZW4sIG9jdC0+ZGF0YSwgb2N0LT5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICZvdXQsICZvdXRfbGVuLCAwIC8qIGRlY3J5cHQgKi8pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfQ1JZUFRfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwa2NzMTJfaXRlbV9kZWNyeXB0X2QyaSwgUEtDUzhfUl9DUllQVF9FUlJPUik7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgcCA9IG91dDsKICAgcmV0ID0gQVNOMV9pdGVtX2QyaShOVUxMLCAmcCwgb3V0X2xlbiwgaXQpOwogICBPUEVOU1NMX2NsZWFuc2Uob3V0LCBvdXRfbGVuKTsKICAgaWYgKCFyZXQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9ERUNPREVfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwa2NzMTJfaXRlbV9kZWNyeXB0X2QyaSwgUEtDUzhfUl9ERUNPREVfRVJST1IpOwogICB9CiAgIE9QRU5TU0xfZnJlZShvdXQpOwogICByZXR1cm4gcmV0OwpAQCAtNDc5LDEyICs0MjcsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhc3NfbGVuKSB7CiAgIHVpbnQ4X3QgKnBhc3NfcmF3ID0gTlVMTDsKICAgc2l6ZV90IHBhc3NfcmF3X2xlbiA9IDA7Ci0gIGlmICghcGFzc190b19wYXNzX3JhdyhPQkpfb2JqMm5pZChwa2NzOC0+YWxnb3ItPmFsZ29yaXRobSksIHBhc3MsIHBhc3NfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgJnBhc3NfcmF3LCAmcGFzc19yYXdfbGVuKSkgewotICAgIHJldHVybiBOVUxMOworICBQS0NTOF9QUklWX0tFWV9JTkZPICpyZXQ7CisKKyAgaWYgKHBhc3MpIHsKKyAgICBpZiAocGFzc19sZW4gPT0gLTEpIHsKKyAgICAgIHBhc3NfbGVuID0gc3RybGVuKHBhc3MpOworICAgIH0KKyAgICBpZiAoIWFzY2lpX3RvX3VjczIocGFzcywgcGFzc19sZW4sICZwYXNzX3JhdywgJnBhc3NfcmF3X2xlbikpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9kZWNyeXB0LCBQS0NTOF9SX0RFQ09ERV9FUlJPUik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgIH0KIAotICBQS0NTOF9QUklWX0tFWV9JTkZPICpyZXQgPSBQS0NTOF9kZWNyeXB0X3BiZShwa2NzOCwgcGFzc19yYXcsIHBhc3NfcmF3X2xlbik7CisgIHJldCA9IFBLQ1M4X2RlY3J5cHRfcGJlKHBrY3M4LCBwYXNzX3JhdywgcGFzc19yYXdfbGVuKTsKIAogICBpZiAocGFzc19yYXcpIHsKICAgICBPUEVOU1NMX2NsZWFuc2UocGFzc19yYXcsIHBhc3NfcmF3X2xlbik7CkBAIC01MTEsMTcgKzQ2NiwxNyBAQAogCiAgIG9jdCA9IE1fQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCk7CiAgIGlmIChvY3QgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIHBrY3MxMl9pdGVtX2kyZF9lbmNyeXB0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgaW5fbGVuID0gQVNOMV9pdGVtX2kyZChvYmosICZpbiwgaXQpOwogICBpZiAoIWluKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfRU5DT0RFX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGtjczEyX2l0ZW1faTJkX2VuY3J5cHQsIFBLQ1M4X1JfRU5DT0RFX0VSUk9SKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogICBpZiAoIXBiZV9jcnlwdChhbGdvciwgcGFzc19yYXcsIHBhc3NfcmF3X2xlbiwgaW4sIGluX2xlbiwgJm9jdC0+ZGF0YSwgJmNyeXB0X2xlbiwKICAgICAgICAgICAgICAgICAgMSAvKiBlbmNyeXB0ICovKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0VOQ1JZUFRfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwa2NzMTJfaXRlbV9pMmRfZW5jcnlwdCwgUEtDUzhfUl9FTkNSWVBUX0VSUk9SKTsKICAgICBPUEVOU1NMX2ZyZWUoaW4pOwogICAgIHJldHVybiBOVUxMOwogICB9CkBAIC01MzYsMTIgKzQ5MSwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbnMsIFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mKSB7CiAgIHVpbnQ4X3QgKnBhc3NfcmF3ID0gTlVMTDsKICAgc2l6ZV90IHBhc3NfcmF3X2xlbiA9IDA7Ci0gIGlmICghcGFzc190b19wYXNzX3JhdyhwYmVfbmlkLCBwYXNzLCBwYXNzX2xlbiwgJnBhc3NfcmF3LCAmcGFzc19yYXdfbGVuKSkgewotICAgIHJldHVybiBOVUxMOworICBYNTA5X1NJRyAqcmV0OworCisgIGlmIChwYXNzKSB7CisgICAgaWYgKHBhc3NfbGVuID09IC0xKSB7CisgICAgICBwYXNzX2xlbiA9IHN0cmxlbihwYXNzKTsKKyAgICB9CisgICAgaWYgKCFhc2NpaV90b191Y3MyKHBhc3MsIHBhc3NfbGVuLCAmcGFzc19yYXcsICZwYXNzX3Jhd19sZW4pKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfZW5jcnlwdCwgUEtDUzhfUl9ERUNPREVfRVJST1IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICB9CiAKLSAgWDUwOV9TSUcgKnJldCA9IFBLQ1M4X2VuY3J5cHRfcGJlKHBiZV9uaWQsIGNpcGhlciwgcGFzc19yYXcsIHBhc3NfcmF3X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbHQsIHNhbHRfbGVuLCBpdGVyYXRpb25zLCBwOGluZik7CisgIHJldCA9IFBLQ1M4X2VuY3J5cHRfcGJlKHBiZV9uaWQsIHBhc3NfcmF3LCBwYXNzX3Jhd19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbHQsIHNhbHRfbGVuLCBpdGVyYXRpb25zLCBwOGluZik7CiAKICAgaWYgKHBhc3NfcmF3KSB7CiAgICAgT1BFTlNTTF9jbGVhbnNlKHBhc3NfcmF3LCBwYXNzX3Jhd19sZW4pOwpAQCAtNTUwLDcgKzUxMyw3IEBACiAgIHJldHVybiByZXQ7CiB9CiAKLVg1MDlfU0lHICpQS0NTOF9lbmNyeXB0X3BiZShpbnQgcGJlX25pZCwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLAorWDUwOV9TSUcgKlBLQ1M4X2VuY3J5cHRfcGJlKGludCBwYmVfbmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBhc3NfcmF3LCBzaXplX3QgcGFzc19yYXdfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNhbHQsIHNpemVfdCBzYWx0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9ucywgUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDhpbmYpIHsKQEAgLTU1OSwxNyArNTIyLDEzIEBACiAKICAgcGtjczggPSBYNTA5X1NJR19uZXcoKTsKICAgaWYgKHBrY3M4ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9lbmNyeXB0X3BiZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKLSAgaWYgKHBiZV9uaWQgPT0gLTEpIHsKLSAgICBwYmUgPSBQS0NTNV9wYmUyX3NldChjaXBoZXIsIGl0ZXJhdGlvbnMsIHNhbHQsIHNhbHRfbGVuKTsKLSAgfSBlbHNlIHsKLSAgICBwYmUgPSBQS0NTNV9wYmVfc2V0KHBiZV9uaWQsIGl0ZXJhdGlvbnMsIHNhbHQsIHNhbHRfbGVuKTsKLSAgfQorICBwYmUgPSBQS0NTNV9wYmVfc2V0KHBiZV9uaWQsIGl0ZXJhdGlvbnMsIHNhbHQsIHNhbHRfbGVuKTsKICAgaWYgKCFwYmUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVJSX1JfQVNOMV9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9lbmNyeXB0X3BiZSwgRVJSX1JfQVNOMV9MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTU3OSw3ICs1MzgsNyBAQAogICBwa2NzOC0+ZGlnZXN0ID0gcGtjczEyX2l0ZW1faTJkX2VuY3J5cHQoCiAgICAgICBwYmUsIEFTTjFfSVRFTV9ycHRyKFBLQ1M4X1BSSVZfS0VZX0lORk8pLCBwYXNzX3JhdywgcGFzc19yYXdfbGVuLCBwOGluZik7CiAgIGlmICghcGtjczgtPmRpZ2VzdCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0VOQ1JZUFRfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9lbmNyeXB0X3BiZSwgUEtDUzhfUl9FTkNSWVBUX0VSUk9SKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC02MDEsMTIgKzU2MCwxMyBAQAogCiAgIHBrZXkgPSBFVlBfUEtFWV9uZXcoKTsKICAgaWYgKHBrZXkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIEVWUF9QS0NTODJQS0VZLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIAogICBpZiAoIUVWUF9QS0VZX3NldF90eXBlKHBrZXksIE9CSl9vYmoybmlkKGFsZ29pZCkpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfVU5TVVBQT1JURURfUFJJVkFURV9LRVlfQUxHT1JJVEhNKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVZQX1BLQ1M4MlBLRVksCisgICAgICAgICAgICAgICAgICAgICAgUEtDUzhfUl9VTlNVUFBPUlRFRF9QUklWQVRFX0tFWV9BTEdPUklUSE0pOwogICAgIGkydF9BU04xX09CSkVDVChvYmpfdG1wLCA4MCwgYWxnb2lkKTsKICAgICBFUlJfYWRkX2Vycm9yX2RhdGEoMiwgIlRZUEU9Iiwgb2JqX3RtcCk7CiAgICAgZ290byBlcnJvcjsKQEAgLTYxNCwxMSArNTc0LDExIEBACiAKICAgaWYgKHBrZXktPmFtZXRoLT5wcml2X2RlY29kZSkgewogICAgIGlmICghcGtleS0+YW1ldGgtPnByaXZfZGVjb2RlKHBrZXksIHA4KSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfUFJJVkFURV9LRVlfREVDT0RFX0VSUk9SKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFVlBfUEtDUzgyUEtFWSwgUEtDUzhfUl9QUklWQVRFX0tFWV9ERUNPREVfRVJST1IpOwogICAgICAgZ290byBlcnJvcjsKICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfTUVUSE9EX05PVF9TVVBQT1JURUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFVlBfUEtDUzgyUEtFWSwgUEtDUzhfUl9NRVRIT0RfTk9UX1NVUFBPUlRFRCk7CiAgICAgZ290byBlcnJvcjsKICAgfQogCkBAIC02MzQsNyArNTk0LDcgQEAKIAogICBwOCA9IFBLQ1M4X1BSSVZfS0VZX0lORk9fbmV3KCk7CiAgIGlmIChwOCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVZQX1BLRVkyUEtDUzgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogICBwOC0+YnJva2VuID0gUEtDUzhfT0s7CkBAIC02NDIsMTUgKzYwMiwxNyBAQAogICBpZiAocGtleS0+YW1ldGgpIHsKICAgICBpZiAocGtleS0+YW1ldGgtPnByaXZfZW5jb2RlKSB7CiAgICAgICBpZiAoIXBrZXktPmFtZXRoLT5wcml2X2VuY29kZShwOCwgcGtleSkpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfUFJJVkFURV9LRVlfRU5DT0RFX0VSUk9SKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIEVWUF9QS0VZMlBLQ1M4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX1BSSVZBVEVfS0VZX0VOQ09ERV9FUlJPUik7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX01FVEhPRF9OT1RfU1VQUE9SVEVEKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFVlBfUEtFWTJQS0NTOCwgUEtDUzhfUl9NRVRIT0RfTk9UX1NVUFBPUlRFRCk7CiAgICAgICBnb3RvIGVycm9yOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9VTlNVUFBPUlRFRF9QUklWQVRFX0tFWV9BTEdPUklUSE0pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFVlBfUEtFWTJQS0NTOCwKKyAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX1VOU1VQUE9SVEVEX1BSSVZBVEVfS0VZX0FMR09SSVRITSk7CiAgICAgZ290byBlcnJvcjsKICAgfQogICByZXR1cm4gcDg7CkBAIC02ODQsNyArNjQ2LDggQEAKICAgICogcGtjczctZW5jcnlwdGVkRGF0YSBhbmQgYSBwa2NzNy1kYXRhKSBhbmQgZGVwdGggMSAodGhlIHZhcmlvdXMgUEtDUyMxMgogICAgKiBiYWdzKS4gKi8KICAgaWYgKGRlcHRoID4gMykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX1BLQ1MxMl9UT09fREVFUExZX05FU1RFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1MxMl9oYW5kbGVfY29udGVudF9pbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX1BLQ1MxMl9UT09fREVFUExZX05FU1RFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNjkzLDcgKzY1Niw2IEBACiAgICAqIGNvbnZlcnNpb24gY2Fubm90IHNlZSB0aHJvdWdoIHRob3NlIHdyYXBwaW5ncy4gU28gZWFjaCB0aW1lIHdlIHN0ZXAKICAgICogdGhyb3VnaCBvbmUgd2UgbmVlZCB0byBjb252ZXJ0IHRvIERFUiBhZ2Fpbi4gKi8KICAgaWYgKCFDQlNfYXNuMV9iZXJfdG9fZGVyKGNvbnRlbnRfaW5mb3MsICZkZXJfYnl0ZXMsICZkZXJfbGVuKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNzA0LDE0ICs2NjYsMTYgQEAKICAgfQogCiAgIGlmICghQ0JTX2dldF9hc24xKCZpbiwgJmluLCBDQlNfQVNOMV9TRVFVRU5DRSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfaGFuZGxlX2NvbnRlbnRfaW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgd2hpbGUgKENCU19sZW4oJmluKSA+IDApIHsKICAgICBDQlMgY29udGVudF9pbmZvOwogICAgIGlmICghQ0JTX2dldF9hc24xKCZpbiwgJmNvbnRlbnRfaW5mbywgQ0JTX0FTTjFfU0VRVUVOQ0UpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1MxMl9oYW5kbGVfY29udGVudF9pbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtNzQxLDcgKzcwNSw4IEBACiAgIGlmICghQ0JTX2dldF9hc24xKGNvbnRlbnRfaW5mbywgJmNvbnRlbnRfdHlwZSwgQ0JTX0FTTjFfT0JKRUNUKSB8fAogICAgICAgIUNCU19nZXRfYXNuMShjb250ZW50X2luZm8sICZ3cmFwcGVkX2NvbnRlbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgQ0JTX0FTTjFfQ09OVEVYVF9TUEVDSUZJQyB8IENCU19BU04xX0NPTlNUUlVDVEVEIHwgMCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfaGFuZGxlX2NvbnRlbnRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNzY5LDEyICs3MzQsMTQgQEAKICAgICAgICAgIUNCU19nZXRfYXNuMV9lbGVtZW50KCZlY2ksICZhaSwgQ0JTX0FTTjFfU0VRVUVOQ0UpIHx8CiAgICAgICAgICFDQlNfZ2V0X2FzbjEoJmVjaSwgJmVuY3J5cHRlZF9jb250ZW50cywKICAgICAgICAgICAgICAgICAgICAgICBDQlNfQVNOMV9DT05URVhUX1NQRUNJRklDIHwgMCkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzEyX2hhbmRsZV9jb250ZW50X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKICAgICBpZiAoT0JKX2NiczJuaWQoJmNvbnRlbnRzX3R5cGUpICE9IE5JRF9wa2NzN19kYXRhKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1MxMl9oYW5kbGVfY29udGVudF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogCkBAIC03ODUsNyArNzUyLDggQEAKICAgICB9CiAgICAgaWYgKGlucCAhPSBDQlNfZGF0YSgmYWkpICsgQ0JTX2xlbigmYWkpKSB7CiAgICAgICBYNTA5X0FMR09SX2ZyZWUoYWxnb3IpOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfaGFuZGxlX2NvbnRlbnRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtODA1LDcgKzc3Myw4IEBACiAKICAgICBpZiAoIUNCU19nZXRfYXNuMSgmd3JhcHBlZF9jb250ZW50cywgJm9jdGV0X3N0cmluZ19jb250ZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JTX0FTTjFfT0NURVRTVFJJTkcpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1MxMl9oYW5kbGVfY29udGVudF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogCkBAIC04MTgsNyArNzg3LDggQEAKICAgICBYNTA5X1NJRyAqZW5jcnlwdGVkID0gTlVMTDsKIAogICAgIGlmICgqY3R4LT5vdXRfa2V5KSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9NVUxUSVBMRV9QUklWQVRFX0tFWVNfSU5fUEtDUzEyKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfaGFuZGxlX2NvbnRlbnRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFBLQ1M4X1JfTVVMVElQTEVfUFJJVkFURV9LRVlTX0lOX1BLQ1MxMik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKQEAgLTgyNiwxMSArNzk2LDEzIEBACiAgICAgICogc3RydWN0dXJlIGFzIG9uZSBhbmQgc28gfFg1MDlfU0lHfCBpcyByZXVzZWQgdG8gc3RvcmUgaXQuICovCiAgICAgZW5jcnlwdGVkID0gZDJpX1g1MDlfU0lHKE5VTEwsICZpbnAsIENCU19sZW4oJndyYXBwZWRfY29udGVudHMpKTsKICAgICBpZiAoZW5jcnlwdGVkID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzEyX2hhbmRsZV9jb250ZW50X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgICAgaWYgKGlucCAhPSBDQlNfZGF0YSgmd3JhcHBlZF9jb250ZW50cykgKyBDQlNfbGVuKCZ3cmFwcGVkX2NvbnRlbnRzKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfaGFuZGxlX2NvbnRlbnRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKICAgICAgIFg1MDlfU0lHX2ZyZWUoZW5jcnlwdGVkKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KQEAgLTg1Niw3ICs4MjgsOCBAQAogICAgICAgICAhQ0JTX2dldF9hc24xKCZjZXJ0X2JhZywgJndyYXBwZWRfY2VydCwKICAgICAgICAgICAgICAgICAgICAgICBDQlNfQVNOMV9DT05URVhUX1NQRUNJRklDIHwgQ0JTX0FTTjFfQ09OU1RSVUNURUQgfCAwKSB8fAogICAgICAgICAhQ0JTX2dldF9hc24xKCZ3cmFwcGVkX2NlcnQsICZjZXJ0LCBDQlNfQVNOMV9PQ1RFVFNUUklORykpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzEyX2hhbmRsZV9jb250ZW50X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKQEAgLTg2NCwxMSArODM3LDEzIEBACiAgICAgICBjb25zdCB1aW50OF90ICppbnAgPSBDQlNfZGF0YSgmY2VydCk7CiAgICAgICBYNTA5ICp4NTA5ID0gZDJpX1g1MDkoTlVMTCwgJmlucCwgQ0JTX2xlbigmY2VydCkpOwogICAgICAgaWYgKCF4NTA5KSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfaGFuZGxlX2NvbnRlbnRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KICAgICAgIGlmIChpbnAgIT0gQ0JTX2RhdGEoJmNlcnQpICsgQ0JTX2xlbigmY2VydCkpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1MxMl9oYW5kbGVfY29udGVudF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CiAgICAgICAgIFg1MDlfZnJlZSh4NTA5KTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CkBAIC05MDAsNyArODc1LDYgQEAKIAogICAvKiBUaGUgaW5wdXQgbWF5IGJlIGluIEJFUiBmb3JtYXQuICovCiAgIGlmICghQ0JTX2FzbjFfYmVyX3RvX2RlcihiZXJfaW4sICZkZXJfYnl0ZXMsICZkZXJfbGVuKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGRlcl9ieXRlcyAhPSBOVUxMKSB7CkBAIC05MTcsMjcgKzg5MSwyOCBAQAogICBpZiAoIUNCU19nZXRfYXNuMSgmaW4sICZwZngsIENCU19BU04xX1NFUVVFTkNFKSB8fAogICAgICAgQ0JTX2xlbigmaW4pICE9IDAgfHwKICAgICAgICFDQlNfZ2V0X2FzbjFfdWludDY0KCZwZngsICZ2ZXJzaW9uKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1MxMl9nZXRfa2V5X2FuZF9jZXJ0cywgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKHZlcnNpb24gPCAzKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9WRVJTSU9OKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzEyX2dldF9rZXlfYW5kX2NlcnRzLAorICAgICAgICAgICAgICAgICAgICAgIFBLQ1M4X1JfQkFEX1BLQ1MxMl9WRVJTSU9OKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIGlmICghQ0JTX2dldF9hc24xKCZwZngsICZhdXRoc2FmZSwgQ0JTX0FTTjFfU0VRVUVOQ0UpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzEyX2dldF9rZXlfYW5kX2NlcnRzLCBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAoQ0JTX2xlbigmcGZ4KSA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfTUlTU0lOR19NQUMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfZ2V0X2tleV9hbmRfY2VydHMsIFBLQ1M4X1JfTUlTU0lOR19NQUMpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKCFDQlNfZ2V0X2FzbjEoJnBmeCwgJm1hY19kYXRhLCBDQlNfQVNOMV9TRVFVRU5DRSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfZ2V0X2tleV9hbmRfY2VydHMsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC05NDYsNyArOTIxLDcgQEAKICAgaWYgKCFDQlNfZ2V0X2FzbjEoJmF1dGhzYWZlLCAmY29udGVudF90eXBlLCBDQlNfQVNOMV9PQkpFQ1QpIHx8CiAgICAgICAhQ0JTX2dldF9hc24xKCZhdXRoc2FmZSwgJndyYXBwZWRfYXV0aHNhZmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgQ0JTX0FTTjFfQ09OVEVYVF9TUEVDSUZJQyB8IENCU19BU04xX0NPTlNUUlVDVEVEIHwgMCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfZ2V0X2tleV9hbmRfY2VydHMsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC05NTQsMTIgKzkyOSwxMyBAQAogICAgKiBsYXR0ZXIgaW5kaWNhdGVzIHRoYXQgaXQncyBzaWduZWQgYnkgYSBwdWJsaWMga2V5LCB3aGljaCBpc24ndAogICAgKiBzdXBwb3J0ZWQuICovCiAgIGlmIChPQkpfY2JzMm5pZCgmY29udGVudF90eXBlKSAhPSBOSURfcGtjczdfZGF0YSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX1BLQ1MxMl9QVUJMSUNfS0VZX0lOVEVHUklUWV9OT1RfU1VQUE9SVEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzEyX2dldF9rZXlfYW5kX2NlcnRzLAorICAgICAgICAgICAgICAgICAgICAgIFBLQ1M4X1JfUEtDUzEyX1BVQkxJQ19LRVlfSU5URUdSSVRZX05PVF9TVVBQT1JURUQpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKCFDQlNfZ2V0X2FzbjEoJndyYXBwZWRfYXV0aHNhZmVzLCAmYXV0aHNhZmVzLCBDQlNfQVNOMV9PQ1RFVFNUUklORykpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfZ2V0X2tleV9hbmRfY2VydHMsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC05NjcsNyArOTQzLDcgQEAKICAgY3R4Lm91dF9jZXJ0cyA9IG91dF9jZXJ0czsKICAgaWYgKCFhc2NpaV90b191Y3MyKHBhc3N3b3JkLCBzdHJsZW4ocGFzc3dvcmQpLCAmY3R4LnBhc3N3b3JkLAogICAgICAgICAgICAgICAgICAgICAgJmN0eC5wYXNzd29yZF9sZW4pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfREVDT0RFX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzEyX2dldF9rZXlfYW5kX2NlcnRzLCBQS0NTOF9SX0RFQ09ERV9FUlJPUik7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtOTg2LDcgKzk2Miw3IEBACiAgICAgICAgICFDQlNfZ2V0X2FzbjEoJmhhc2hfdHlwZV9zZXEsICZoYXNoX29pZCwgQ0JTX0FTTjFfT0JKRUNUKSB8fAogICAgICAgICAhQ0JTX2dldF9hc24xKCZtYWMsICZleHBlY3RlZF9tYWMsIENCU19BU04xX09DVEVUU1RSSU5HKSB8fAogICAgICAgICAhQ0JTX2dldF9hc24xKCZtYWNfZGF0YSwgJnNhbHQsIENCU19BU04xX09DVEVUU1RSSU5HKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfZ2V0X2tleV9hbmRfY2VydHMsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtOTk1LDcgKzk3MSw4IEBACiAgICAgaWYgKENCU19sZW4oJm1hY19kYXRhKSA+IDApIHsKICAgICAgIGlmICghQ0JTX2dldF9hc24xX3VpbnQ2NCgmbWFjX2RhdGEsICZpdGVyYXRpb25zKSB8fAogICAgICAgICAgIGl0ZXJhdGlvbnMgPiBJTlRfTUFYKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfZ2V0X2tleV9hbmRfY2VydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAgICAgfQpAQCAtMTAwMyw3ICs5ODAsNyBAQAogICAgIGhhc2hfbmlkID0gT0JKX2NiczJuaWQoJmhhc2hfb2lkKTsKICAgICBpZiAoaGFzaF9uaWQgPT0gTklEX3VuZGVmIHx8CiAgICAgICAgIChtZCA9IEVWUF9nZXRfZGlnZXN0YnluaWQoaGFzaF9uaWQpKSA9PSBOVUxMKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9VTktOT1dOX0hBU0gpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1MxMl9nZXRfa2V5X2FuZF9jZXJ0cywgUEtDUzhfUl9VTktOT1dOX0hBU0gpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogCkBAIC0xMDE5LDcgKzk5Niw4IEBACiAgICAgfQogCiAgICAgaWYgKCFDQlNfbWVtX2VxdWFsKCZleHBlY3RlZF9tYWMsIGhtYWMsIGhtYWNfbGVuKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfSU5DT1JSRUNUX1BBU1NXT1JEKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfZ2V0X2tleV9hbmRfY2VydHMsCisgICAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX0lOQ09SUkVDVF9QQVNTV09SRCk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0KQEAgLTExNDgsNyArMTEyNiw2IEBACiAgIGlmICghY2FfY2VydHMpIHsKICAgICBjYV9jZXJ0cyA9IHNrX1g1MDlfbmV3X251bGwoKTsKICAgICBpZiAoY2FfY2VydHMgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBjYV9jZXJ0c19hbGxvY2VkID0gMTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcGtjczgvcGtjczhfdGVzdC5jYyBiL3NyYy9jcnlwdG8vcGtjczgvcGtjczhfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E4OGRkZi4uMDAwMDAwMAotLS0gYS9zcmMvY3J5cHRvL3BrY3M4L3BrY3M4X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEdvb2dsZSBJbmMuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgotI2luY2x1ZGUgPG9wZW5zc2wvcGtjczguaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KLQotI2luY2x1ZGUgIi4uL3Rlc3Qvc2NvcGVkX3R5cGVzLmgiCi0KLQotLyoga0RFUiBpcyBhIFBLQ1MjOCBlbmNyeXB0ZWQgcHJpdmF0ZSBrZXkuIEl0IHdhcyBnZW5lcmF0ZWQgd2l0aDoKLSAqCi0gKiBvcGVuc3NsIGdlbnJzYSA1MTIgPiB0ZXN0LmtleQotICogb3BlbnNzbCBwa2NzOCAtdG9wazggLWluIHRlc3Qua2V5IC1vdXQgdGVzdC5rZXkuZW5jcnlwdGVkIC12MiBkZXMzIC1vdXRmb3JtIGRlcgotICogaGV4ZHVtcCAtQ3YgdGVzdC5rZXkuZW5jcnlwdGVkCi0gKgotICogVGhlIHBhc3N3b3JkIGlzICJ0ZXN0aW5nIi4KLSAqLwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RFUltdID0gewotICAweDMwLCAweDgyLCAweDAxLCAweDllLCAweDMwLCAweDQwLCAweDA2LCAweDA5LCAweDJhLCAweDg2LCAweDQ4LCAweDg2LCAweGY3LCAweDBkLCAweDAxLCAweDA1LAotICAweDBkLCAweDMwLCAweDMzLCAweDMwLCAweDFiLCAweDA2LCAweDA5LCAweDJhLCAweDg2LCAweDQ4LCAweDg2LCAweGY3LCAweDBkLCAweDAxLCAweDA1LCAweDBjLAotICAweDMwLCAweDBlLCAweDA0LCAweDA4LCAweDA2LCAweGE1LCAweDRiLCAweDBjLCAweDBjLCAweDUwLCAweDhjLCAweDE5LCAweDAyLCAweDAyLCAweDA4LCAweDAwLAotICAweDMwLCAweDE0LCAweDA2LCAweDA4LCAweDJhLCAweDg2LCAweDQ4LCAweDg2LCAweGY3LCAweDBkLCAweDAzLCAweDA3LCAweDA0LCAweDA4LCAweDNhLCAweGQwLAotICAweDcwLCAweDRiLCAweDI2LCAweDUwLCAweDEzLCAweDdiLCAweDA0LCAweDgyLCAweDAxLCAweDU4LCAweGE2LCAweGVlLCAweDAyLCAweGYyLCAweGYyLCAweDdjLAotICAweDE5LCAweDkxLCAweGUzLCAweGNlLCAweDMyLCAweDg1LCAweGM1LCAweDAxLCAweGQ5LCAweGUzLCAweDVlLCAweDE0LCAweGI2LCAweGI4LCAweDc4LCAweGFkLAotICAweGRhLCAweDAxLCAweGVjLCAweDllLCAweDQyLCAweGU4LCAweGJmLCAweDBiLCAweDQ2LCAweDAzLCAweGJjLCAweDkyLCAweDZmLCAweGU0LCAweDBmLCAweDBmLAotICAweDQ4LCAweDMwLCAweDEwLCAweDEwLCAweDliLCAweGZiLCAweDRiLCAweGI5LCAweDQ1LCAweGY4LCAweGNmLCAweGFiLCAweGExLCAweDE4LCAweGRkLCAweDE5LAotICAweGE0LCAweGE0LCAweGUxLCAweGYwLCAweGExLCAweDhkLCAweGMyLCAweDIzLCAweGU3LCAweDBkLCAweDdhLCAweDY0LCAweDIxLCAweDZiLCAweGZhLCAweDQ4LAotICAweGI5LCAweDQxLCAweGMxLCAweDBjLCAweDRiLCAweGNlLCAweDZmLCAweDFhLCAweDkxLCAweDliLCAweDlmLCAweGRkLCAweGNmLCAweGE5LCAweDhkLCAweDMzLAotICAweDJjLCAweDQ1LCAweDgxLCAweDVjLCAweDVlLCAweDY3LCAweGM2LCAweDY4LCAweDQzLCAweDYyLCAweGZmLCAweDVlLCAweDliLCAweDFhLCAweDE1LCAweDNhLAotICAweDlkLCAweDcxLCAweDNmLCAweGJlLCAweDMyLCAweDJmLCAweGU1LCAweDkwLCAweDY1LCAweDY1LCAweDljLCAweDIyLCAweGY2LCAweDI5LCAweDJlLCAweGNmLAotICAweDI2LCAweDE2LCAweDdiLCAweDY2LCAweDQ4LCAweDU1LCAweGFkLCAweDlhLCAweDhkLCAweDg5LCAweGY0LCAweDQ4LCAweDRmLCAweDFmLCAweDlkLCAweGI4LAotICAweGZhLCAweGUxLCAweGYxLCAweDNiLCAweDM5LCAweDVjLCAweDcyLCAweGM2LCAweGI4LCAweDNlLCAweDk4LCAweGU4LCAweDc3LCAweGU4LCAweGI2LCAweDcxLAotICAweDg0LCAweGE4LCAweDZlLCAweGNhLCAweGFmLCAweDYyLCAweDk2LCAweDQ5LCAweDhhLCAweDIxLCAweDZmLCAweDllLCAweDc4LCAweDA3LCAweDk3LCAweDM4LAotICAweDQwLCAweDY2LCAweDQyLCAweDVhLCAweDFiLCAweGUwLCAweDliLCAweGU5LCAweDkxLCAweDgyLCAweGU0LCAweGVhLCAweDhmLCAweDJhLCAweGIyLCAweDgwLAotICAweGNlLCAweGU4LCAweDU3LCAweGQzLCAweGFjLCAweDExLCAweDlkLCAweGIyLCAweDM5LCAweDBmLCAweGUxLCAweGNlLCAweDE4LCAweDk2LCAweDM4LCAweGExLAotICAweDE5LCAweDgwLCAweDg4LCAweDgxLCAweDNkLCAweGRhLCAweGFhLCAweDhlLCAweDE1LCAweDI3LCAweDE5LCAweDczLCAweDBjLCAweGYzLCAweGFmLCAweDQ1LAotICAweGU5LCAweDFiLCAweGFkLCAweDZjLCAweDNkLCAweGJmLCAweDk1LCAweGY3LCAweGEwLCAweDg3LCAweDBlLCAweGRlLCAweGYxLCAweGQ4LCAweGVlLCAweGFhLAotICAweDkyLCAweDc2LCAweDhkLCAweDMyLCAweDQ1LCAweGExLCAweGU3LCAweGY1LCAweDA1LCAweGQ2LCAweDJjLCAweDY3LCAweDYzLCAweDEwLCAweGZhLCAweGRlLAotICAweDgwLCAweGM3LCAweDViLCAweDk2LCAweDBmLCAweDI0LCAweDUwLCAweDc4LCAweDMwLCAweGU1LCAweDg5LCAweGYzLCAweDczLCAweGZhLCAweDQwLCAweDExLAotICAweGQ1LCAweDI2LCAweGI4LCAweDM2LCAweDk2LCAweDk4LCAweGU2LCAweGJkLCAweDczLCAweDYyLCAweDU2LCAweGI5LCAweGVhLCAweDI4LCAweDE2LCAweDkzLAotICAweDViLCAweDMzLCAweGFlLCAweDgzLCAweGY5LCAweDFmLCAweGVlLCAweGVmLCAweGM4LCAweGJmLCAweGM3LCAweGIxLCAweDQ3LCAweDQzLCAweGExLCAweGM2LAotICAweDFhLCAweDY0LCAweDQ3LCAweDAyLCAweDQwLCAweDNlLCAweGJjLCAweDBmLCAweDgwLCAweDcxLCAweDVjLCAweDQ0LCAweDYwLCAweGJjLCAweDc4LCAweDJlLAotICAweGQyLCAweDc3LCAweGY4LCAweDZlLCAweDEyLCAweDUxLCAweDg5LCAweGRiLCAweDkwLCAweDY0LCAweGNkLCAweDc2LCAweDEwLCAweDI5LCAweDczLCAweGMyLAotICAweDJmLCAweDk0LCAweDdiLCAweDk4LCAweGNkLCAweGJiLCAweDYxLCAweDE2LCAweDFkLCAweDUyLCAweDExLCAweDczLCAweDQ4LCAweGU2LCAweDM5LCAweGZjLAotICAweGQ2LCAweDJkLAotfTsKLQotc3RhdGljIGJvb2wgdGVzdChjb25zdCB1aW50OF90ICpkZXIsIHNpemVfdCBkZXJfbGVuKSB7Ci0gIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBkZXI7Ci0gIFNjb3BlZFg1MDlfU0lHIHNpZyhkMmlfWDUwOV9TSUcoTlVMTCwgJmRhdGEsIGRlcl9sZW4pKTsKLSAgaWYgKHNpZy5nZXQoKSA9PSBOVUxMIHx8IGRhdGEgIT0gZGVyICsgZGVyX2xlbikgewotICAgIGZwcmludGYoc3RkZXJyLCAiZDJpX1g1MDlfU0lHIGZhaWxlZCBvciBkaWQgbm90IGNvbnN1bWUgYWxsIGJ5dGVzLlxuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IGNoYXIga1Bhc3N3b3JkW10gPSAidGVzdGluZyI7Ci0gIFNjb3BlZFBLQ1M4X1BSSVZfS0VZX0lORk8ga2V5cGFpcihQS0NTOF9kZWNyeXB0KHNpZy5nZXQoKSwga1Bhc3N3b3JkLCAtMSkpOwotICBpZiAoIWtleXBhaXIpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlBLQ1M4X2RlY3J5cHQgZmFpbGVkLlxuIik7Ci0gICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgaWYgKCF0ZXN0KGtERVIsIHNpemVvZihrREVSKSkpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHByaW50ZigiUEFTU1xuIik7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9wb2x5MTMwNS9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vcG9seTEzMDUvQ01ha2VMaXN0cy50eHQKaW5kZXggNjc0ZDlmNi4uYmIwYzFlNCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9wb2x5MTMwNS9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL3BvbHkxMzA1L0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCiAKIGlmICgke0FSQ0h9IFNUUkVRVUFMICJhcm0iKQogICBzZXQoCkBAIC0xOSwxMiArMTksMyBAQAogCiAgICR7UE9MWTEzMDVfQVJDSF9TT1VSQ0VTfQogKQotCi1hZGRfZXhlY3V0YWJsZSgKLSAgcG9seTEzMDVfdGVzdAotCi0gIHBvbHkxMzA1X3Rlc3QuY2MKLSAgJDxUQVJHRVRfT0JKRUNUUzp0ZXN0X3N1cHBvcnQ+Ci0pCi0KLXRhcmdldF9saW5rX2xpYnJhcmllcyhwb2x5MTMwNV90ZXN0IGNyeXB0bykKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcG9seTEzMDUvcG9seTEzMDVfdGVzdC5jYyBiL3NyYy9jcnlwdG8vcG9seTEzMDUvcG9seTEzMDVfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUyNjA3NS4uMDAwMDAwMAotLS0gYS9zcmMvY3J5cHRvL3BvbHkxMzA1L3BvbHkxMzA1X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEdvb2dsZSBJbmMuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3BvbHkxMzA1Lmg+Ci0KLSNpbmNsdWRlICIuLi90ZXN0L2ZpbGVfdGVzdC5oIgotI2luY2x1ZGUgIi4uL3Rlc3Qvc3RsX2NvbXBhdC5oIgotCi0KLS8vIHxDUllQVE9fcG9seTEzMDVfZmluaXNofCByZXF1aXJlcyBhIDE2LWJ5dGUtYWxpZ25lZCBvdXRwdXQuCi0jaWYgZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCi0vLyBNU1ZDIGRvZXNuJ3Qgc3VwcG9ydCBDKysxMSB8YWxpZ25hc3wuCi0jZGVmaW5lIEFMSUdORUQgX19kZWNsc3BlYyhhbGlnbigxNikpCi0jZWxzZQotI2RlZmluZSBBTElHTkVEIGFsaWduYXMoMTYpCi0jZW5kaWYKLQotc3RhdGljIGJvb2wgVGVzdFBvbHkxMzA1KEZpbGVUZXN0ICp0LCB2b2lkICphcmcpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5LCBpbiwgbWFjOwotICBpZiAoIXQtPkdldEJ5dGVzKCZrZXksICJLZXkiKSB8fAotICAgICAgIXQtPkdldEJ5dGVzKCZpbiwgIklucHV0IikgfHwKLSAgICAgICF0LT5HZXRCeXRlcygmbWFjLCAiTUFDIikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKGtleS5zaXplKCkgIT0gMzIgfHwgbWFjLnNpemUoKSAhPSAxNikgewotICAgIHQtPlByaW50TGluZSgiSW52YWxpZCB0ZXN0Iik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gVGVzdCBzaW5nbGUtc2hvdCBvcGVyYXRpb24uCi0gIHBvbHkxMzA1X3N0YXRlIHN0YXRlOwotICBDUllQVE9fcG9seTEzMDVfaW5pdCgmc3RhdGUsIGJzc2w6OnZlY3Rvcl9kYXRhKCZrZXkpKTsKLSAgQ1JZUFRPX3BvbHkxMzA1X3VwZGF0ZSgmc3RhdGUsIGJzc2w6OnZlY3Rvcl9kYXRhKCZpbiksIGluLnNpemUoKSk7Ci0gIEFMSUdORUQgdWludDhfdCBvdXRbMTZdOwotICBDUllQVE9fcG9seTEzMDVfZmluaXNoKCZzdGF0ZSwgb3V0KTsKLSAgaWYgKCF0LT5FeHBlY3RCeXRlc0VxdWFsKG91dCwgMTYsIGJzc2w6OnZlY3Rvcl9kYXRhKCZtYWMpLCBtYWMuc2l6ZSgpKSkgewotICAgIHQtPlByaW50TGluZSgiU2luZ2xlLXNob3QgUG9seTEzMDUgZmFpbGVkLiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFRlc3Qgc3RyZWFtaW5nIGJ5dGUtYnktYnl0ZS4KLSAgQ1JZUFRPX3BvbHkxMzA1X2luaXQoJnN0YXRlLCBic3NsOjp2ZWN0b3JfZGF0YSgma2V5KSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW4uc2l6ZSgpOyBpKyspIHsKLSAgICBDUllQVE9fcG9seTEzMDVfdXBkYXRlKCZzdGF0ZSwgJmluW2ldLCAxKTsKLSAgfQotICBDUllQVE9fcG9seTEzMDVfZmluaXNoKCZzdGF0ZSwgb3V0KTsKLSAgaWYgKCF0LT5FeHBlY3RCeXRlc0VxdWFsKG91dCwgMTYsIGJzc2w6OnZlY3Rvcl9kYXRhKCZtYWMpLCBtYWMuc2l6ZSgpKSkgewotICAgIHQtPlByaW50TGluZSgiU3RyZWFtaW5nIFBvbHkxMzA1IGZhaWxlZC4iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIENSWVBUT19saWJyYXJ5X2luaXQoKTsKLQotICBpZiAoYXJnYyAhPSAyKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlcyA8dGVzdCBmaWxlPlxuIiwgYXJndlswXSk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICByZXR1cm4gRmlsZVRlc3RNYWluKFRlc3RQb2x5MTMwNSwgbnVsbHB0ciwgYXJndlsxXSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3BvbHkxMzA1L3BvbHkxMzA1X3Rlc3QudHh0IGIvc3JjL2NyeXB0by9wb2x5MTMwNS9wb2x5MTMwNV90ZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1ZDQwMy4uMDAwMDAwMAotLS0gYS9zcmMvY3J5cHRvL3BvbHkxMzA1L3BvbHkxMzA1X3Rlc3QudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyBSRkMgNzM1OSwgc2VjdGlvbiAyLjUuMi4KLQotS2V5ID0gODVkNmJlNzg1NzU1NmQzMzdmNDQ1MmZlNDJkNTA2YTgwMTAzODA4YWZiMGRiMmZkNGFiZmY2YWY0MTQ5ZjUxYgotSW5wdXQgPSAiQ3J5cHRvZ3JhcGhpYyBGb3J1bSBSZXNlYXJjaCBHcm91cCIKLU1BQyA9IGE4MDYxZGMxMzA1MTM2YzZjMjJiOGJhZjBjMDEyN2E5Ci0KLQotIyBSRkMgNzM1OSwgc2VjdGlvbiBBLjMuCi0KLUtleSA9IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLUlucHV0ID0gMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLU1BQyA9IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0KLUtleSA9IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzZlNWY2YjVjNWUwNjA3MGYwZWZjYTk2MjI3YTg2M2UKLUlucHV0ID0gNDE2ZTc5MjA3Mzc1NjI2ZDY5NzM3MzY5NmY2ZTIwNzQ2ZjIwNzQ2ODY1MjA0OTQ1NTQ0NjIwNjk2ZTc0NjU2ZTY0NjU2NDIwNjI3OTIwNzQ2ODY1MjA0MzZmNmU3NDcyNjk2Mjc1NzQ2ZjcyMjA2NjZmNzIyMDcwNzU2MjZjNjk2MzYxNzQ2OTZmNmUyMDYxNzMyMDYxNmM2YzIwNmY3MjIwNzA2MTcyNzQyMDZmNjYyMDYxNmUyMDQ5NDU1NDQ2MjA0OTZlNzQ2NTcyNmU2NTc0MmQ0NDcyNjE2Njc0MjA2ZjcyMjA1MjQ2NDMyMDYxNmU2NDIwNjE2ZTc5MjA3Mzc0NjE3NDY1NmQ2NTZlNzQyMDZkNjE2NDY1MjA3NzY5NzQ2ODY5NmUyMDc0Njg2NTIwNjM2ZjZlNzQ2NTc4NzQyMDZmNjYyMDYxNmUyMDQ5NDU1NDQ2MjA2MTYzNzQ2OTc2Njk3NDc5MjA2OTczMjA2MzZmNmU3MzY5NjQ2NTcyNjU2NDIwNjE2ZTIwMjI0OTQ1NTQ0NjIwNDM2ZjZlNzQ3MjY5NjI3NTc0Njk2ZjZlMjIyZTIwNTM3NTYzNjgyMDczNzQ2MTc0NjU2ZDY1NmU3NDczMjA2OTZlNjM2Yzc1NjQ2NTIwNmY3MjYxNmMyMDczNzQ2MTc0NjU2ZDY1NmU3NDczMjA2OTZlMjA0OTQ1NTQ0NjIwNzM2NTczNzM2OTZmNmU3MzJjMjA2MTczMjA3NzY1NmM2YzIwNjE3MzIwNzc3MjY5NzQ3NDY1NmUyMDYxNmU2NDIwNjU2YzY1NjM3NDcyNmY2ZTY5NjMyMDYzNmY2ZDZkNzU2ZTY5NjM2MTc0Njk2ZjZlNzMyMDZkNjE2NDY1MjA2MTc0MjA2MTZlNzkyMDc0Njk2ZDY1MjA2ZjcyMjA3MDZjNjE2MzY1MmMyMDc3Njg2OTYzNjgyMDYxNzI2NTIwNjE2NDY0NzI2NTczNzM2NTY0MjA3NDZmCi1NQUMgPSAzNmU1ZjZiNWM1ZTA2MDcwZjBlZmNhOTYyMjdhODYzZQotCi1LZXkgPSAzNmU1ZjZiNWM1ZTA2MDcwZjBlZmNhOTYyMjdhODYzZTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi1JbnB1dCA9IDQxNmU3OTIwNzM3NTYyNmQ2OTczNzM2OTZmNmUyMDc0NmYyMDc0Njg2NTIwNDk0NTU0NDYyMDY5NmU3NDY1NmU2NDY1NjQyMDYyNzkyMDc0Njg2NTIwNDM2ZjZlNzQ3MjY5NjI3NTc0NmY3MjIwNjY2ZjcyMjA3MDc1NjI2YzY5NjM2MTc0Njk2ZjZlMjA2MTczMjA2MTZjNmMyMDZmNzIyMDcwNjE3Mjc0MjA2ZjY2MjA2MTZlMjA0OTQ1NTQ0NjIwNDk2ZTc0NjU3MjZlNjU3NDJkNDQ3MjYxNjY3NDIwNmY3MjIwNTI0NjQzMjA2MTZlNjQyMDYxNmU3OTIwNzM3NDYxNzQ2NTZkNjU2ZTc0MjA2ZDYxNjQ2NTIwNzc2OTc0Njg2OTZlMjA3NDY4NjUyMDYzNmY2ZTc0NjU3ODc0MjA2ZjY2MjA2MTZlMjA0OTQ1NTQ0NjIwNjE2Mzc0Njk3NjY5NzQ3OTIwNjk3MzIwNjM2ZjZlNzM2OTY0NjU3MjY1NjQyMDYxNmUyMDIyNDk0NTU0NDYyMDQzNmY2ZTc0NzI2OTYyNzU3NDY5NmY2ZTIyMmUyMDUzNzU2MzY4MjA3Mzc0NjE3NDY1NmQ2NTZlNzQ3MzIwNjk2ZTYzNmM3NTY0NjUyMDZmNzI2MTZjMjA3Mzc0NjE3NDY1NmQ2NTZlNzQ3MzIwNjk2ZTIwNDk0NTU0NDYyMDczNjU3MzczNjk2ZjZlNzMyYzIwNjE3MzIwNzc2NTZjNmMyMDYxNzMyMDc3NzI2OTc0NzQ2NTZlMjA2MTZlNjQyMDY1NmM2NTYzNzQ3MjZmNmU2OTYzMjA2MzZmNmQ2ZDc1NmU2OTYzNjE3NDY5NmY2ZTczMjA2ZDYxNjQ2NTIwNjE3NDIwNjE2ZTc5MjA3NDY5NmQ2NTIwNmY3MjIwNzA2YzYxNjM2NTJjMjA3NzY4Njk2MzY4MjA2MTcyNjUyMDYxNjQ2NDcyNjU3MzczNjU2NDIwNzQ2ZgotTUFDID0gZjM0NzdlN2NkOTU0MTdhZjg5YTZiODc5NGMzMTBjZjAKLQotS2V5ID0gMWM5MjQwYTVlYjU1ZDM4YWYzMzM4ODg2MDRmNmI1ZjA0NzM5MTdjMTQwMmI4MDA5OWRjYTVjYmMyMDcwNzVjMAotSW5wdXQgPSAyNzU0Nzc2MTczMjA2MjcyNjk2YzZjNjk2NzJjMjA2MTZlNjQyMDc0Njg2NTIwNzM2YzY5NzQ2ODc5MjA3NDZmNzY2NTczMGE0NDY5NjQyMDY3Nzk3MjY1MjA2MTZlNjQyMDY3Njk2ZDYyNmM2NTIwNjk2ZTIwNzQ2ODY1MjA3NzYxNjI2NTNhMGE0MTZjNmMyMDZkNjk2ZDczNzkyMDc3NjU3MjY1MjA3NDY4NjUyMDYyNmY3MjZmNjc2Zjc2NjU3MzJjMGE0MTZlNjQyMDc0Njg2NTIwNmQ2ZjZkNjUyMDcyNjE3NDY4NzMyMDZmNzU3NDY3NzI2MTYyNjUyZQotTUFDID0gNDU0MTY2OWE3ZWFhZWU2MWU3MDhkYzdjYmNjNWViNjIKLQotS2V5ID0gMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotSW5wdXQgPSBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZgotTUFDID0gMDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLQotS2V5ID0gMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZgotSW5wdXQgPSAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotTUFDID0gMDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLQotS2V5ID0gMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotSW5wdXQgPSBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLU1BQyA9IDA1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0KLUtleSA9IDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLUlucHV0ID0gZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYmZlZmVmZWZlZmVmZWZlZmVmZWZlZmVmZWZlZmVmZTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxCi1NQUMgPSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotCi1LZXkgPSAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi1JbnB1dCA9IGZkZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmCi1NQUMgPSBmYWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZgotCi1LZXkgPSAwMTAwMDAwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi1JbnB1dCA9IGUzMzU5NGQ3NTA1ZTQzYjkwMDAwMDAwMDAwMDAwMDAwMzM5NGQ3NTA1ZTQzNzljZDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi1NQUMgPSAxNDAwMDAwMDAwMDAwMDAwNTUwMDAwMDAwMDAwMDAwMAotCi1LZXkgPSAwMTAwMDAwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi1JbnB1dCA9IGUzMzU5NGQ3NTA1ZTQzYjkwMDAwMDAwMDAwMDAwMDAwMzM5NGQ3NTA1ZTQzNzljZDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotTUFDID0gMTMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcmFuZC9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vcmFuZC9DTWFrZUxpc3RzLnR4dAppbmRleCAzNWQ1MjkwLi4zNzRkOGYxIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3JhbmQvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9yYW5kL0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCiAKIGlmICgke0FSQ0h9IFNUUkVRVUFMICJ4ODZfNjQiKQogICBzZXQoCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3JhbmQvYXNtL3JkcmFuZC14ODZfNjQucGwgYi9zcmMvY3J5cHRvL3JhbmQvYXNtL3JkcmFuZC14ODZfNjQucGwKaW5kZXggYzMyYTU1Yy4uYTkxNzYxMSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9yYW5kL2FzbS9yZHJhbmQteDg2XzY0LnBsCisrKyBiL3NyYy9jcnlwdG8vcmFuZC9hc20vcmRyYW5kLXg4Nl82NC5wbApAQCAtMSwxOSArMSw1IEBACiAjIS91c3IvYmluL2VudiBwZXJsCiAKLSMgQ29weXJpZ2h0IChjKSAyMDE1LCBHb29nbGUgSW5jLgotIwotIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSMgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotIwotIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSMgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0jIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSMgT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotIyBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLwotCiAkZmxhdm91ciA9IHNoaWZ0OwogJG91dHB1dCAgPSBzaGlmdDsKIGlmICgkZmxhdm91ciA9fiAvXC4vKSB7ICRvdXRwdXQgPSAkZmxhdm91cjsgdW5kZWYgJGZsYXZvdXI7IH0KQEAgLTI4LDQ3ICsxNCwxMSBAQAogcHJpbnQ8PF9fXzsKIC50ZXh0CiAKLSMgQ1JZUFRPX3JkcmFuZCB3cml0ZXMgZWlnaHQgYnl0ZXMgb2YgcmFuZG9tIGRhdGEgZnJvbSB0aGUgaGFyZHdhcmUgUk5HIHRvCi0jIHxvdXR8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24gaGFyZHdhcmUgZmFpbHVyZS4KLSMgaW50IENSWVBUT19yZHJhbmQodWludDhfdCBvdXRbOF0pOwogLmdsb2JsCUNSWVBUT19yZHJhbmQKIC50eXBlCUNSWVBUT19yZHJhbmQsXEBmdW5jdGlvbiwxCiAuYWxpZ24JMTYKIENSWVBUT19yZHJhbmQ6Ci0JeG9ycSAlcmF4LCAlcmF4Ci0JIyBUaGlzIGlzIHJkcmFuZCAlcmN4LiBJdCBzZXRzIHJjeCB0byBhIHJhbmRvbSB2YWx1ZSBhbmQgc2V0cyB0aGUgY2FycnkKLQkjIGZsYWcgb24gc3VjY2Vzcy4KLQkuYnl0ZSAweDQ4LCAweDBmLCAweGM3LCAweGYxCi0JIyBBbiBhZGQtd2l0aC1jYXJyeSBvZiB6ZXJvIGVmZmVjdGl2ZWx5IHNldHMgJXJheCB0byB0aGUgY2FycnkgZmxhZy4KLQlhZGNxICVyYXgsICVyYXgKLQltb3ZxICVyY3gsIDAoJXJkaSkKLQlyZXRxCi0KLSMgQ1JZUFRPX3JkcmFuZF9tdWx0aXBsZThfYnVmIGZpbGxzIHxsZW58IGJ5dGVzIGF0IHxidWZ8IHdpdGggcmFuZG9tIGRhdGEgZnJvbQotIyB0aGUgaGFyZHdhcmUgUk5HLiBUaGUgfGxlbnwgYXJndW1lbnQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGVpZ2h0LiBJdCByZXR1cm5zCi0jIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGhhcmR3YXJlIGZhaWx1cmUuCi0jIGludCBDUllQVE9fcmRyYW5kX211bHRpcGxlOF9idWYodWludDhfdCAqYnVmLCBzaXplX3QgbGVuKTsKLS5nbG9ibCBDUllQVE9fcmRyYW5kX211bHRpcGxlOF9idWYKLS50eXBlIENSWVBUT19yZHJhbmRfbXVsdGlwbGU4X2J1ZixcQGZ1bmN0aW9uLDIKLS5hbGlnbiAxNgotQ1JZUFRPX3JkcmFuZF9tdWx0aXBsZThfYnVmOgotCXRlc3QgJXJzaSwgJXJzaQotCWp6IC5Mb3V0Ci0JbW92cSBcJDgsICVyZHgKLS5MbG9vcDoKLQkjIFRoaXMgaXMgcmRyYW5kICVyY3guIEl0IHNldHMgcmN4IHRvIGEgcmFuZG9tIHZhbHVlIGFuZCBzZXRzIHRoZSBjYXJyeQotCSMgZmxhZyBvbiBzdWNjZXNzLgotCS5ieXRlIDB4NDgsIDB4MGYsIDB4YzcsIDB4ZjEKLQlqbmMgLkxlcnIKLQltb3ZxICVyY3gsIDAoJXJkaSkKLQlhZGRxICVyZHgsICVyZGkKLQlzdWJxICVyZHgsICVyc2kKLQlqbnogLkxsb29wCi0uTG91dDoKLQltb3ZxIFwkMSwgJXJheAotCXJldHEKLS5MZXJyOgotCXhvcnEgJXJheCwgJXJheAorCS5ieXRlIDB4NDgsIDB4MGYsIDB4YzcsIDB4ZjAKIAlyZXRxCiBfX18KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9yYW5kL2h3cmFuZC5jIGIvc3JjL2NyeXB0by9yYW5kL2h3cmFuZC5jCmluZGV4IGYwYmJjY2QuLjczZDNkZTcgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vcmFuZC9od3JhbmQuYworKysgYi9zcmMvY3J5cHRvL3JhbmQvaHdyYW5kLmMKQEAgLTE0LDUyICsxNCw0MyBAQAogCiAjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgPG9wZW5zc2wvY3B1Lmg+CiAKLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCiAKICNpZiBkZWZpbmVkKE9QRU5TU0xfWDg2XzY0KSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkKIAotLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluIGFzbS9yZHJhbmQteDg2XzY0LnBsICovCi1leHRlcm4gaW50IENSWVBUT19yZHJhbmQodWludDhfdCBvdXRbOF0pOwotZXh0ZXJuIGludCBDUllQVE9fcmRyYW5kX211bHRpcGxlOF9idWYodWludDhfdCAqYnVmLCBzaXplX3QgbGVuKTsKLQotc3RhdGljIGludCBoYXZlX3JkcmFuZCh2b2lkKSB7CitpbnQgQ1JZUFRPX2hhdmVfaHdyYW5kKHZvaWQpIHsKICAgcmV0dXJuIChPUEVOU1NMX2lhMzJjYXBfUFsxXSAmICgxdSA8PCAzMCkpICE9IDA7CiB9CiAKLWludCBDUllQVE9faHdyYW5kKHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbikgewotICBpZiAoIWhhdmVfcmRyYW5kKCkpIHsKLSAgICByZXR1cm4gMDsKKy8qIENSWVBUT19yZHJhbmQgaXMgZGVmaW5lZCBpbiBhc20vcmRyYW5kLXg4Nl82NC5wbCAqLworZXh0ZXJuIHVpbnQ2NF90IENSWVBUT19yZHJhbmQodm9pZCk7CisKK3ZvaWQgQ1JZUFRPX2h3cmFuZCh1aW50OF90ICpidWYsIHNpemVfdCBsZW4pIHsKKyAgd2hpbGUgKGxlbiA+PSA4KSB7CisgICAgdWludDY0X3QgcmFuZCA9IENSWVBUT19yZHJhbmQoKTsKKyAgICBtZW1jcHkoYnVmLCAmcmFuZCwgc2l6ZW9mKHJhbmQpKTsKKyAgICBsZW4gLT0gc2l6ZW9mKHJhbmQpOworICAgIGJ1ZiArPSBzaXplb2YocmFuZCk7CiAgIH0KIAotICBjb25zdCBzaXplX3QgbGVuX211bHRpcGxlOCA9IGxlbiAmIH43OwotICBpZiAoIUNSWVBUT19yZHJhbmRfbXVsdGlwbGU4X2J1ZihidWYsIGxlbl9tdWx0aXBsZTgpKSB7Ci0gICAgcmV0dXJuIDA7CisgIGlmIChsZW4gPiAwKSB7CisgICAgdWludDY0X3QgcmFuZCA9IENSWVBUT19yZHJhbmQoKTsKKyAgICBtZW1jcHkoYnVmLCAmcmFuZCwgbGVuKTsKICAgfQotICBsZW4gLT0gbGVuX211bHRpcGxlODsKLQotICBpZiAobGVuICE9IDApIHsKLSAgICBhc3NlcnQobGVuIDwgOCk7Ci0KLSAgICB1aW50OF90IHJhbmRfYnVmWzhdOwotICAgIGlmICghQ1JZUFRPX3JkcmFuZChyYW5kX2J1ZikpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBtZW1jcHkoYnVmICsgbGVuX211bHRpcGxlOCwgcmFuZF9idWYsIGxlbik7Ci0gIH0KLQotICByZXR1cm4gMTsKIH0KIAogI2Vsc2UKIAotaW50IENSWVBUT19od3JhbmQodWludDhfdCAqYnVmLCBzaXplX3QgbGVuKSB7CitpbnQgQ1JZUFRPX2hhdmVfaHdyYW5kKHZvaWQpIHsKICAgcmV0dXJuIDA7CiB9CiAKK3ZvaWQgQ1JZUFRPX2h3cmFuZCh1aW50OF90ICpidWYsIHNpemVfdCBsZW4pIHsKKyAgYWJvcnQoKTsKK30KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3JhbmQvaW50ZXJuYWwuaCBiL3NyYy9jcnlwdG8vcmFuZC9pbnRlcm5hbC5oCmluZGV4IGYzNWFiYmIuLjFjY2E3ZjMgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vcmFuZC9pbnRlcm5hbC5oCisrKyBiL3NyYy9jcnlwdG8vcmFuZC9pbnRlcm5hbC5oCkBAIC0yNCwxMCArMjQsMTMgQEAKICAqIHN5c3RlbS4gKi8KIHZvaWQgQ1JZUFRPX3N5c3JhbmQodWludDhfdCAqYnVmLCBzaXplX3QgbGVuKTsKIAotLyogQ1JZUFRPX2h3cmFuZCBmaWxscyB8bGVufCBieXRlcyBhdCB8YnVmfCB3aXRoIGVudHJvcHkgZnJvbSB0aGUgaGFyZHdhcmUuIEl0Ci0gKiByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24gaGFyZHdhcmUgZmFpbHVyZSBvciBpZiBoYXJkd2FyZSBzdXBwb3J0IGlzCi0gKiB1bmF2YWlsYWJsZS4gKi8KLWludCBDUllQVE9faHdyYW5kKHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbik7CisvKiBDUllQVE9faGF2ZV9od3JhbmQgcmV0dXJucyBvbmUgaWZmIHxDUllQVE9faHdyYW5kfCBjYW4gYmUgY2FsbGVkIHRvIGdlbmVyYXRlCisgKiBoYXJkd2FyZSBlbnRyb3B5LiAqLworaW50IENSWVBUT19oYXZlX2h3cmFuZCh2b2lkKTsKKworLyogQ1JZUFRPX2h3cmFuZCBmaWxscyB8bGVufCBieXRlcyBhdCB8YnVmfCB3aXRoIGVudHJvcHkgZnJvbSB0aGUgaGFyZHdhcmUuCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCBpZiB8Q1JZUFRPX2hhdmVfaHdyYW5kfCByZXR1cm5zIG9uZS4gKi8KK3ZvaWQgQ1JZUFRPX2h3cmFuZCh1aW50OF90ICpidWYsIHNpemVfdCBsZW4pOwogCiAKICNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9yYW5kL3JhbmQuYyBiL3NyYy9jcnlwdG8vcmFuZC9yYW5kLmMKaW5kZXggZTc2YTEyMC4uYTY0N2I2YSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9yYW5kL3JhbmQuYworKysgYi9zcmMvY3J5cHRvL3JhbmQvcmFuZC5jCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNpbmNsdWRlIDxvcGVuc3NsL2NoYWNoYS5oPgogI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpAQCAtNzAsMTIgKzY5LDE2IEBACiAgIE9QRU5TU0xfZnJlZShzdGF0ZSk7CiB9CiAKK2V4dGVybiB2b2lkIENSWVBUT19jaGFjaGFfMjAodWludDhfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBrZXlbMzJdLCBjb25zdCB1aW50OF90IG5vbmNlWzhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnRlcik7CisKIGludCBSQU5EX2J5dGVzKHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbikgewogICBpZiAobGVuID09IDApIHsKICAgICByZXR1cm4gMTsKICAgfQogCi0gIGlmICghQ1JZUFRPX2h3cmFuZChidWYsIGxlbikpIHsKKyAgaWYgKCFDUllQVE9faGF2ZV9od3JhbmQoKSkgewogICAgIC8qIFdpdGhvdXQgYSBoYXJkd2FyZSBSTkcgdG8gc2F2ZSB1cyBmcm9tIGFkZHJlc3Mtc3BhY2UgZHVwbGljYXRpb24sIHRoZSBPUwogICAgICAqIGVudHJvcHkgaXMgdXNlZCBkaXJlY3RseS4gKi8KICAgICBDUllQVE9fc3lzcmFuZChidWYsIGxlbik7CkBAIC0xMDUsNiArMTA4LDggQEAKICAgICBzdGF0ZS0+cGFydGlhbF9ibG9ja191c2VkID0gc2l6ZW9mKHN0YXRlLT5wYXJ0aWFsX2Jsb2NrKTsKICAgfQogCisgIENSWVBUT19od3JhbmQoYnVmLCBsZW4pOworCiAgIGlmIChsZW4gPj0gc2l6ZW9mKHN0YXRlLT5wYXJ0aWFsX2Jsb2NrKSkgewogICAgIHNpemVfdCByZW1haW5pbmcgPSBsZW47CiAgICAgd2hpbGUgKHJlbWFpbmluZyA+IDApIHsKQEAgLTE1OCwxMCArMTYzLDYgQEAKIAogdm9pZCBSQU5EX2FkZChjb25zdCB2b2lkICpidWYsIGludCBudW0sIGRvdWJsZSBlbnRyb3B5KSB7fQogCi1pbnQgUkFORF9lZ2QoY29uc3QgY2hhciAqcGF0aCkgewotICByZXR1cm4gMjU1OwotfQotCiBpbnQgUkFORF9wb2xsKHZvaWQpIHsKICAgcmV0dXJuIDE7CiB9CkBAIC0xNjksMTggKzE3MCwzIEBACiBpbnQgUkFORF9zdGF0dXModm9pZCkgewogICByZXR1cm4gMTsKIH0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCByYW5kX21ldGhfc3Qga1NTTGVheU1ldGhvZCA9IHsKLSAgUkFORF9zZWVkLAotICBSQU5EX2J5dGVzLAotICBSQU5EX2NsZWFudXAsCi0gIFJBTkRfYWRkLAotICBSQU5EX3BzZXVkb19ieXRlcywKLSAgUkFORF9zdGF0dXMsCi19OwotCi1SQU5EX01FVEhPRCAqUkFORF9TU0xlYXkodm9pZCkgewotICByZXR1cm4gKFJBTkRfTUVUSE9EKikgJmtTU0xlYXlNZXRob2Q7Ci19Ci0KLXZvaWQgUkFORF9zZXRfcmFuZF9tZXRob2QoY29uc3QgUkFORF9NRVRIT0QgKm1ldGhvZCkge30KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcmFuZC91cmFuZG9tLmMgYi9zcmMvY3J5cHRvL3JhbmQvdXJhbmRvbS5jCmluZGV4IDFjYzUyNjAuLjc4OGE5NzkgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vcmFuZC91cmFuZG9tLmMKKysrIGIvc3JjL2NyeXB0by9yYW5kL3VyYW5kb20uYwpAQCAtMzAsMTI2ICszMCw5MiBAQAogCiAKIC8qIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgUFJORyBieSByZWFkaW5nIGZyb20gL2Rldi91cmFuZG9tLCBvcHRpb25hbGx5IHdpdGggYQotICogYnVmZmVyLCB3aGljaCBpcyB1bnNhZmUgYWNyb3NzIHxmb3JrfC4gKi8KKyAqIGZvcmstc2FmZSBidWZmZXIuCisgKgorICogSWYgYnVmZmVyaW5nIGlzIGVuYWJsZWQgdGhlbiBpdCBtYWludGFpbnMgYSBnbG9iYWwsIGxpbmtlZCBsaXN0IG9mIGJ1ZmZlcnMuCisgKiBUaHJlYWRzIHdoaWNoIG5lZWQgcmFuZG9tIGJ5dGVzIGdyYWIgYSBidWZmZXIgZnJvbSB0aGUgbGlzdCB1bmRlciBhIGxvY2sgYW5kCisgKiBjb3B5IG91dCB0aGUgYnl0ZXMgdGhhdCB0aGV5IG5lZWQuIEluIHRoZSByYXJlIGNhc2UgdGhhdCB0aGUgYnVmZmVyIGlzCisgKiBlbXB0eSwgaXQncyByZWZpbGxlZCBmcm9tIC9kZXYvdXJhbmRvbSBvdXRzaWRlIG9mIHRoZSBsb2NrLgorICoKKyAqIExhcmdlIHJlcXVlc3RzIGFyZSBhbHdheXMgc2VydmljZWQgZnJvbSAvZGV2L3VyYW5kb20gZGlyZWN0bHkuCisgKgorICogRWFjaCBidWZmZXIgY29udGFpbnMgdGhlIFBJRCBvZiB0aGUgcHJvY2VzcyB0aGF0IGNyZWF0ZWQgaXQgYW5kIGl0J3MgdGVzdGVkCisgKiBhZ2FpbnN0IHRoZSBjdXJyZW50IFBJRCBlYWNoIHRpbWUuIFRodXMgcHJvY2Vzc2VzIHRoYXQgZm9yayB3aWxsIGRpc2NhcmQgYWxsCisgKiB0aGUgYnVmZmVycyBmaWxsZWQgYnkgdGhlIHBhcmVudCBwcm9jZXNzLiBUaGVyZSBhcmUgdHdvIHByb2JsZW1zIHdpdGggdGhpczoKKyAqCisgKiAxKSBnbGliYyBtYWludGFpbnMgYSBjYWNoZSBvZiB0aGUgY3VycmVudCBQSUQrUFBJRCBhbmQsIGlmIHRoaXMgY2FjaGUgaXNuJ3QKKyAqICAgIGNvcnJlY3RseSBpbnZhbGlkYXRlZCwgdGhlIGdldHBpZCgpIHdpbGwgY29udGludWUgdG8gYmVsaWV2ZSB0aGF0CisgKiAgICBpdCdzIHRoZSBvbGQgcHJvY2Vzcy4gR2xpYmMgZGVwZW5kcyBvbiB0aGUgZ2xpYmMgd3JhcHBlcnMgZm9yIGZvcmssCisgKiAgICB2Zm9yayBhbmQgY2xvbmUgYmVpbmcgdXNlZCBpbiBvcmRlciB0byBpbnZhbGlkYXRlIHRoZSBnZXRwaWQoKSBjYWNoZS4KKyAqCisgKiAyKSBJZiBhIHByb2Nlc3MgZm9ya3MsIGRpZXMgYW5kIHRoZW4gaXRzIGNoaWxkIGZvcmtzLCBpdCdzIHBvc3NpYmxlIHRoYXQKKyAqICAgIHRoZSB0aGlyZCBwcm9jZXNzIHdpbGwgZW5kIHVwIHdpdGggdGhlIHNhbWUgUElEIGFzIHRoZSBvcmlnaW5hbCBwcm9jZXNzLgorICogICAgSWYgdGhlIHNlY29uZCBwcm9jZXNzIG5ldmVyIHVzZWQgYW55IHJhbmRvbSB2YWx1ZXMgdGhlbiB0aGlzIHdpbGwgbWVhbgorICogICAgdGhhdCB0aGUgdGhpcmQgcHJvY2VzcyBoYXMgc3RhbGUsIGNhY2hlZCB2YWx1ZXMgYW5kIHdvbid0IG5vdGljZS4KKyAqLwogCi0jZGVmaW5lIEJVRl9TSVpFIDQwOTYKKy8qIEJVRl9TSVpFIGlzIGludGVuZGVkIHRvIGJlIGEgNEsgYWxsb2NhdGlvbiB3aXRoIG1hbGxvYyBvdmVyaGVhZC4gc3RydWN0CisgKiByYW5kX2J1ZmZlciBhbHNvIGZpdHMgaW4gdGhpcyBzcGFjZSBhbmQgdGhlIHJlbWFpbmRlciBpcyBlbnRyb3B5LiAqLworI2RlZmluZSBCVUZfU0laRSAoNDA5NiAtIDE2KQogCi0vKiByYW5kX2J1ZmZlciBjb250YWlucyB1bnVzZWQsIHJhbmRvbSBieXRlcywgc29tZSBvZiB3aGljaCBtYXkgaGF2ZSBiZWVuCi0gKiBjb25zdW1lZCBhbHJlYWR5LiAqLworLyogcmFuZF9idWZmZXIgY29udGFpbnMgdW51c2VkLCByYW5kb20gYnl0ZXMuIFRoZXNlIHN0cnVjdHVyZXMgZm9ybSBhIGxpbmtlZAorICogbGlzdCB2aWEgdGhlIHxuZXh0fCBwb2ludGVyLCB3aGljaCBpcyBOVUxMIGluIHRoZSBmaW5hbCBlbGVtZW50LiAqLwogc3RydWN0IHJhbmRfYnVmZmVyIHsKLSAgc2l6ZV90IHVzZWQ7Ci0gIHVpbnQ4X3QgcmFuZFtCVUZfU0laRV07CisgIHNpemVfdCB1c2VkOyAvKiB1c2VkIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgfHJhbmR8IHRoYXQgaGF2ZQorICAgICAgICAgICAgICAgICAgYmVlbiBjb25zdW1lZC4gKi8KKyAgc3RydWN0IHJhbmRfYnVmZmVyICpuZXh0OworICBwaWRfdCBwaWQ7IC8qIHBpZCBjb250YWlucyB0aGUgcGlkIGF0IHRoZSB0aW1lIHRoYXQgdGhlIGJ1ZmZlciB3YXMKKyAgICAgICAgICAgICAgICBjcmVhdGVkIHNvIHRoYXQgZGF0YSBpcyBub3QgZHVwbGljYXRlZCBhZnRlciBhIGZvcmsuICovCisgIHBpZF90IHBwaWQ7IC8qIHBwaWQgY29udGFpbnMgdGhlIHBhcmVudCBwaWQgaW4gb3JkZXIgdG8gdHJ5IGFuZCByZWR1Y2UKKyAgICAgICAgICAgICAgICAgdGhlIHBvc3NpYmlsaXR5IG9mIGR1cGxpY2F0ZWQgUElEIGNvbmZ1c2luZyB0aGUKKyAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uIG9mIGEgZm9yay4gKi8KKyAgdWludDhfdCByYW5kW107CiB9OwogCi0vKiByZXF1ZXN0ZWRfbG9jayBpcyB1c2VkIHRvIHByb3RlY3QgdGhlIHwqX3JlcXVlc3RlZHwgdmFyaWFibGVzLiAqLwotc3RhdGljIHN0cnVjdCBDUllQVE9fU1RBVElDX01VVEVYIHJlcXVlc3RlZF9sb2NrID0gQ1JZUFRPX1NUQVRJQ19NVVRFWF9JTklUOworLyogcmFuZF9ieXRlc19wZXJfYnVmIGlzIHRoZSBudW1iZXIgb2YgYWN0dWFsIGVudHJvcHkgYnl0ZXMgaW4gYSBidWZmZXIuICovCitzdGF0aWMgY29uc3Qgc2l6ZV90IHJhbmRfYnl0ZXNfcGVyX2J1ZiA9IEJVRl9TSVpFIC0gc2l6ZW9mKHN0cnVjdCByYW5kX2J1ZmZlcik7CiAKLS8qIHVyYW5kb21fZmRfcmVxdWVzdGVkIGlzIHNldCBieSB8UkFORF9zZXRfdXJhbmRvbV9mZHwuICBJdCdzIHByb3RlY3RlZCBieQotICogfHJlcXVlc3RlZF9sb2NrfC4gKi8KLXN0YXRpYyBpbnQgdXJhbmRvbV9mZF9yZXF1ZXN0ZWQgPSAtMjsKK3N0YXRpYyBzdHJ1Y3QgQ1JZUFRPX1NUQVRJQ19NVVRFWCBnbG9iYWxfbG9jayA9IENSWVBUT19TVEFUSUNfTVVURVhfSU5JVDsKIAotLyogdXJhbmRvbV9mZCBpcyBhIGZpbGUgZGVzY3JpcHRvciB0byAvZGV2L3VyYW5kb20uIEl0J3MgcHJvdGVjdGVkIGJ5IHxvbmNlfC4gKi8KKy8qIGxpc3RfaGVhZCBpcyB0aGUgc3RhcnQgb2YgYSBnbG9iYWwsIGxpbmtlZC1saXN0IG9mIHJhbmRfYnVmZmVyIG9iamVjdHMuIEl0J3MKKyAqIHByb3RlY3RlZCBieSB8Z2xvYmFsX2xvY2t8LiAqLworc3RhdGljIHN0cnVjdCByYW5kX2J1ZmZlciAqbGlzdF9oZWFkOworCisvKiB1cmFuZG9tX2ZkIGlzIGEgZmlsZSBkZXNjcmlwdG9yIHRvIC9kZXYvdXJhbmRvbS4gSXQncyBwcm90ZWN0ZWQgYnkKKyAqIHxnbG9iYWxfbG9ja3wuICovCiBzdGF0aWMgaW50IHVyYW5kb21fZmQgPSAtMjsKIAotLyogdXJhbmRvbV9idWZmZXJpbmdfcmVxdWVzdGVkIGlzIHNldCBieSB8UkFORF9lbmFibGVfZm9ya191bnNhZmVfYnVmZmVyaW5nfC4KLSAqIEl0J3MgcHJvdGVjdGVkIGJ5IHxyZXF1ZXN0ZWRfbG9ja3wuICovCi1zdGF0aWMgaW50IHVyYW5kb21fYnVmZmVyaW5nX3JlcXVlc3RlZCA9IDA7Ci0KIC8qIHVyYW5kb21fYnVmZmVyaW5nIGNvbnRyb2xzIHdoZXRoZXIgYnVmZmVyaW5nIGlzIGVuYWJsZWQgKDEpIG9yIG5vdCAoMCkuIFRoaXMKLSAqIGlzIHByb3RlY3RlZCBieSB8b25jZXwuICovCisgKiBpcyBwcm90ZWN0ZWQgYnkgfGdsb2JhbF9sb2NrfC4gKi8KIHN0YXRpYyBpbnQgdXJhbmRvbV9idWZmZXJpbmcgPSAwOwogCi1zdGF0aWMgQ1JZUFRPX29uY2VfdCBvbmNlID0gQ1JZUFRPX09OQ0VfSU5JVDsKLQotLyogaW5pdF9vbmNlIGluaXRpYWxpemVzIHRoZSBzdGF0ZSBvZiB0aGlzIG1vZHVsZSB0byB2YWx1ZXMgcHJldmlvdXNseQotICogcmVxdWVzdGVkLiBUaGlzIGlzIHRoZSBvbmx5IGZ1bmN0aW9uIHRoYXQgbW9kaWZpZXMgfHVyYW5kb21fZmR8IGFuZAotICogfHVyYW5kb21fYnVmZmVyaW5nfCwgd2hvc2UgdmFsdWVzIG1heSBiZSByZWFkIHNhZmVseSBhZnRlciBjYWxsaW5nIHRoZQotICogb25jZS4gKi8KLXN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkKSB7Ci0gIENSWVBUT19TVEFUSUNfTVVURVhfbG9ja19yZWFkKCZyZXF1ZXN0ZWRfbG9jayk7Ci0gIHVyYW5kb21fYnVmZmVyaW5nID0gdXJhbmRvbV9idWZmZXJpbmdfcmVxdWVzdGVkOwotICBpbnQgZmQgPSB1cmFuZG9tX2ZkX3JlcXVlc3RlZDsKLSAgQ1JZUFRPX1NUQVRJQ19NVVRFWF91bmxvY2soJnJlcXVlc3RlZF9sb2NrKTsKLQotICBpZiAoZmQgPT0gLTIpIHsKLSAgICBkbyB7Ci0gICAgICBmZCA9IG9wZW4oIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZKTsKLSAgICB9IHdoaWxlIChmZCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7CisvKiB1cmFuZG9tX2dldF9mZF9sb2NrZWQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciB0byAvZGV2L3VyYW5kb20uIFRoZSBjYWxsZXIKKyAqIG9mIHRoaXMgZnVuY3Rpb24gbXVzdCBob2xkIHxnbG9iYWxfbG9ja3wuICovCitzdGF0aWMgaW50IHVyYW5kb21fZ2V0X2ZkX2xvY2tlZCh2b2lkKSB7CisgIGlmICh1cmFuZG9tX2ZkICE9IC0yKSB7CisgICAgcmV0dXJuIHVyYW5kb21fZmQ7CiAgIH0KIAotICBpZiAoZmQgPCAwKSB7Ci0gICAgYWJvcnQoKTsKLSAgfQotCi0gIGludCBmbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZEKTsKLSAgaWYgKGZsYWdzID09IC0xKSB7Ci0gICAgYWJvcnQoKTsKLSAgfQotICBmbGFncyB8PSBGRF9DTE9FWEVDOwotICBpZiAoZmNudGwoZmQsIEZfU0VURkQsIGZsYWdzKSA9PSAtMSkgewotICAgIGFib3J0KCk7Ci0gIH0KLSAgdXJhbmRvbV9mZCA9IGZkOworICB1cmFuZG9tX2ZkID0gb3BlbigiL2Rldi91cmFuZG9tIiwgT19SRE9OTFkpOworICByZXR1cm4gdXJhbmRvbV9mZDsKIH0KIAotdm9pZCBSQU5EX2NsZWFudXAodm9pZCkge30KKy8qIFJBTkRfY2xlYW51cCBmcmVlcyBhbGwgYnVmZmVycywgY2xvc2VzIGFueSBjYWNoZWQgZmlsZSBkZXNjcmlwdG9yCisgKiBhbmQgcmVzZXRzIHRoZSBnbG9iYWwgc3RhdGUuICovCit2b2lkIFJBTkRfY2xlYW51cCh2b2lkKSB7CisgIHN0cnVjdCByYW5kX2J1ZmZlciAqY3VyOwogCi12b2lkIFJBTkRfc2V0X3VyYW5kb21fZmQoaW50IGZkKSB7Ci0gIGZkID0gZHVwKGZkKTsKLSAgaWYgKGZkIDwgMCkgewotICAgIGFib3J0KCk7CisgIENSWVBUT19TVEFUSUNfTVVURVhfbG9ja193cml0ZSgmZ2xvYmFsX2xvY2spOworICB3aGlsZSAoKGN1ciA9IGxpc3RfaGVhZCkpIHsKKyAgICBsaXN0X2hlYWQgPSBjdXItPm5leHQ7CisgICAgT1BFTlNTTF9mcmVlKGN1cik7CiAgIH0KLQotICBDUllQVE9fU1RBVElDX01VVEVYX2xvY2tfd3JpdGUoJnJlcXVlc3RlZF9sb2NrKTsKLSAgdXJhbmRvbV9mZF9yZXF1ZXN0ZWQgPSBmZDsKLSAgQ1JZUFRPX1NUQVRJQ19NVVRFWF91bmxvY2soJnJlcXVlc3RlZF9sb2NrKTsKLQotICBDUllQVE9fb25jZSgmb25jZSwgaW5pdF9vbmNlKTsKLSAgaWYgKHVyYW5kb21fZmQgIT0gZmQpIHsKLSAgICBhYm9ydCgpOyAgLy8gQWxyZWFkeSBpbml0aWFsaXplZC4KKyAgaWYgKHVyYW5kb21fZmQgPj0gMCkgeworICAgIGNsb3NlKHVyYW5kb21fZmQpOwogICB9Ci19Ci0KLXZvaWQgUkFORF9lbmFibGVfZm9ya191bnNhZmVfYnVmZmVyaW5nKGludCBmZCkgewotICBpZiAoZmQgPj0gMCkgewotICAgIGZkID0gZHVwKGZkKTsKLSAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICBhYm9ydCgpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmZCA9IC0yOwotICB9Ci0KLSAgQ1JZUFRPX1NUQVRJQ19NVVRFWF9sb2NrX3dyaXRlKCZyZXF1ZXN0ZWRfbG9jayk7Ci0gIHVyYW5kb21fYnVmZmVyaW5nX3JlcXVlc3RlZCA9IDE7Ci0gIHVyYW5kb21fZmRfcmVxdWVzdGVkID0gZmQ7Ci0gIENSWVBUT19TVEFUSUNfTVVURVhfdW5sb2NrKCZyZXF1ZXN0ZWRfbG9jayk7Ci0KLSAgQ1JZUFRPX29uY2UoJm9uY2UsIGluaXRfb25jZSk7Ci0gIGlmICh1cmFuZG9tX2J1ZmZlcmluZyAhPSAxIHx8IChmZCA+PSAwICYmIHVyYW5kb21fZmQgIT0gZmQpKSB7Ci0gICAgYWJvcnQoKTsgIC8vIEFscmVhZHkgaW5pdGlhbGl6ZWQuCi0gIH0KLX0KLQotc3RhdGljIHN0cnVjdCByYW5kX2J1ZmZlciAqZ2V0X3RocmVhZF9sb2NhbF9idWZmZXIodm9pZCkgewotICBzdHJ1Y3QgcmFuZF9idWZmZXIgKmJ1ZiA9Ci0gICAgICBDUllQVE9fZ2V0X3RocmVhZF9sb2NhbChPUEVOU1NMX1RIUkVBRF9MT0NBTF9VUkFORE9NX0JVRik7Ci0gIGlmIChidWYgIT0gTlVMTCkgewotICAgIHJldHVybiBidWY7Ci0gIH0KLQotICBidWYgPSBPUEVOU1NMX21hbGxvYyhzaXplb2Yoc3RydWN0IHJhbmRfYnVmZmVyKSk7Ci0gIGlmIChidWYgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGJ1Zi0+dXNlZCA9IEJVRl9TSVpFOyAgLyogVG8gdHJpZ2dlciBhIHxyZWFkX2Z1bGx8IG9uIGZpcnN0IHVzZS4gKi8KLSAgaWYgKCFDUllQVE9fc2V0X3RocmVhZF9sb2NhbChPUEVOU1NMX1RIUkVBRF9MT0NBTF9VUkFORE9NX0JVRiwgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QRU5TU0xfZnJlZSkpIHsKLSAgICBPUEVOU1NMX2ZyZWUoYnVmKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiBidWY7CisgIHVyYW5kb21fZmQgPSAtMjsKKyAgbGlzdF9oZWFkID0gTlVMTDsKKyAgQ1JZUFRPX1NUQVRJQ19NVVRFWF91bmxvY2soJmdsb2JhbF9sb2NrKTsKIH0KIAogLyogcmVhZF9mdWxsIHJlYWRzIGV4YWN0bHkgfGxlbnwgYnl0ZXMgZnJvbSB8ZmR8IGludG8gfG91dHwgYW5kIHJldHVybnMgMS4gSW4KQEAgLTE3Miw0OCArMTM4LDExMCBAQAogICByZXR1cm4gMTsKIH0KIAotLyogcmVhZF9mcm9tX2J1ZmZlciByZWFkcyB8cmVxdWVzdGVkfCByYW5kb20gYnl0ZXMgZnJvbSB0aGUgYnVmZmVyIGludG8gfG91dHwsCi0gKiByZWZpbGxpbmcgaXQgaWYgbmVjZXNzYXJ5IHRvIHNhdGlzZnkgdGhlIHJlcXVlc3QuICovCi1zdGF0aWMgdm9pZCByZWFkX2Zyb21fYnVmZmVyKHN0cnVjdCByYW5kX2J1ZmZlciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpvdXQsIHNpemVfdCByZXF1ZXN0ZWQpIHsKLSAgc2l6ZV90IHJlbWFpbmluZyA9IEJVRl9TSVpFIC0gYnVmLT51c2VkOwotCi0gIHdoaWxlIChyZXF1ZXN0ZWQgPiByZW1haW5pbmcpIHsKLSAgICBtZW1jcHkob3V0LCAmYnVmLT5yYW5kW2J1Zi0+dXNlZF0sIHJlbWFpbmluZyk7Ci0gICAgYnVmLT51c2VkICs9IHJlbWFpbmluZzsKLSAgICBvdXQgKz0gcmVtYWluaW5nOwotICAgIHJlcXVlc3RlZCAtPSByZW1haW5pbmc7Ci0KLSAgICBpZiAoIXJlYWRfZnVsbCh1cmFuZG9tX2ZkLCBidWYtPnJhbmQsIEJVRl9TSVpFKSkgewotICAgICAgYWJvcnQoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYnVmLT51c2VkID0gMDsKLSAgICByZW1haW5pbmcgPSBCVUZfU0laRTsKLSAgfQotCi0gIG1lbWNweShvdXQsICZidWYtPnJhbmRbYnVmLT51c2VkXSwgcmVxdWVzdGVkKTsKLSAgYnVmLT51c2VkICs9IHJlcXVlc3RlZDsKLX0KLQotLyogQ1JZUFRPX3N5c3JhbmQgcHV0cyB8cmVxdWVzdGVkfCByYW5kb20gYnl0ZXMgaW50byB8b3V0fC4gKi8KKy8qIENSWVBUT19zeXNyYW5kIHB1dHMgfG51bXwgcmFuZG9tIGJ5dGVzIGludG8gfG91dHwuICovCiB2b2lkIENSWVBUT19zeXNyYW5kKHVpbnQ4X3QgKm91dCwgc2l6ZV90IHJlcXVlc3RlZCkgeworICBpbnQgZmQ7CisgIHN0cnVjdCByYW5kX2J1ZmZlciAqYnVmOworICBzaXplX3QgdG9kbzsKKyAgcGlkX3QgcGlkLCBwcGlkOworCiAgIGlmIChyZXF1ZXN0ZWQgPT0gMCkgewogICAgIHJldHVybjsKICAgfQogCi0gIENSWVBUT19vbmNlKCZvbmNlLCBpbml0X29uY2UpOwotICBpZiAodXJhbmRvbV9idWZmZXJpbmcgJiYgcmVxdWVzdGVkIDwgQlVGX1NJWkUpIHsKLSAgICBzdHJ1Y3QgcmFuZF9idWZmZXIgKmJ1ZiA9IGdldF90aHJlYWRfbG9jYWxfYnVmZmVyKCk7Ci0gICAgaWYgKGJ1ZiAhPSBOVUxMKSB7Ci0gICAgICByZWFkX2Zyb21fYnVmZmVyKGJ1Ziwgb3V0LCByZXF1ZXN0ZWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KKyAgQ1JZUFRPX1NUQVRJQ19NVVRFWF9sb2NrX3dyaXRlKCZnbG9iYWxfbG9jayk7CisgIGZkID0gdXJhbmRvbV9nZXRfZmRfbG9ja2VkKCk7CisKKyAgaWYgKGZkIDwgMCkgeworICAgIENSWVBUT19TVEFUSUNfTVVURVhfdW5sb2NrKCZnbG9iYWxfbG9jayk7CisgICAgYWJvcnQoKTsKKyAgICByZXR1cm47CiAgIH0KIAotICBpZiAoIXJlYWRfZnVsbCh1cmFuZG9tX2ZkLCBvdXQsIHJlcXVlc3RlZCkpIHsKLSAgICBhYm9ydCgpOworICAvKiBJZiBidWZmZXJpbmcgaXMgbm90IGVuYWJsZWQsIG9yIGlmIHRoZSByZXF1ZXN0IGlzIGxhcmdlLCB0aGVuIHRoZQorICAgKiByZXN1bHQgY29tZXMgZGlyZWN0bHkgZnJvbSB1cmFuZG9tLiAqLworICBpZiAoIXVyYW5kb21fYnVmZmVyaW5nIHx8IHJlcXVlc3RlZCA+IEJVRl9TSVpFIC8gMikgeworICAgIENSWVBUT19TVEFUSUNfTVVURVhfdW5sb2NrKCZnbG9iYWxfbG9jayk7CisgICAgaWYgKCFyZWFkX2Z1bGwoZmQsIG91dCwgcmVxdWVzdGVkKSkgeworICAgICAgYWJvcnQoKTsKKyAgICB9CisgICAgcmV0dXJuOwogICB9CisKKyAgcGlkID0gZ2V0cGlkKCk7CisgIHBwaWQgPSBnZXRwcGlkKCk7CisKKyAgZm9yICg7OykgeworICAgIGJ1ZiA9IGxpc3RfaGVhZDsKKyAgICBpZiAoYnVmICYmIGJ1Zi0+cGlkID09IHBpZCAmJiBidWYtPnBwaWQgPT0gcHBpZCAmJgorICAgICAgICByYW5kX2J5dGVzX3Blcl9idWYgLSBidWYtPnVzZWQgPj0gcmVxdWVzdGVkKSB7CisgICAgICBtZW1jcHkob3V0LCAmYnVmLT5yYW5kW2J1Zi0+dXNlZF0sIHJlcXVlc3RlZCk7CisgICAgICBidWYtPnVzZWQgKz0gcmVxdWVzdGVkOworICAgICAgQ1JZUFRPX1NUQVRJQ19NVVRFWF91bmxvY2soJmdsb2JhbF9sb2NrKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBJZiB3ZSBkb24ndCBpbW1lZGlhdGVseSBoYXZlIGVub3VnaCBlbnRyb3B5IHdpdGggdGhlIGNvcnJlY3QKKyAgICAgKiBQSUQsIHJlbW92ZSB0aGUgYnVmZmVyIGZyb20gdGhlIGxpc3QgaW4gb3JkZXIgdG8gZ2FpbgorICAgICAqIGV4Y2x1c2l2ZSBhY2Nlc3MgYW5kIHVubG9jay4gKi8KKyAgICBpZiAoYnVmKSB7CisgICAgICBsaXN0X2hlYWQgPSBidWYtPm5leHQ7CisgICAgfQorICAgIENSWVBUT19TVEFUSUNfTVVURVhfdW5sb2NrKCZnbG9iYWxfbG9jayk7CisKKyAgICBpZiAoIWJ1ZikgeworICAgICAgYnVmID0gKHN0cnVjdCByYW5kX2J1ZmZlciAqKU9QRU5TU0xfbWFsbG9jKEJVRl9TSVpFKTsKKyAgICAgIGlmICghYnVmKSB7CisgICAgICAgIGFib3J0KCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIC8qIFRoZSBidWZmZXIgZG9lc24ndCBjb250YWluIGFueSByYW5kb20gYnl0ZXMgeWV0CisgICAgICAgKiBzbyB3ZSBtYXJrIGl0IGFzIGZ1bGx5IHVzZWQgc28gdGhhdCBpdCB3aWxsIGJlCisgICAgICAgKiBmaWxsZWQgYmVsb3cuICovCisgICAgICBidWYtPnVzZWQgPSByYW5kX2J5dGVzX3Blcl9idWY7CisgICAgICBidWYtPm5leHQgPSBOVUxMOworICAgICAgYnVmLT5waWQgPSBwaWQ7CisgICAgICBidWYtPnBwaWQgPSBwcGlkOworICAgIH0KKworICAgIGlmIChidWYtPnBpZCA9PSBwaWQgJiYgYnVmLT5wcGlkID09IHBwaWQpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIFdlIGhhdmUgZm9ya2VkIGFuZCBzbyBjYW5ub3QgdXNlIHRoZXNlIGJ5dGVzIGFzIHRoZXkKKyAgICAgKiBtYXkgaGF2ZSBiZWVuIHVzZWQgaW4gYW5vdGhlciBwcm9jZXNzLiAqLworICAgIE9QRU5TU0xfZnJlZShidWYpOworICAgIENSWVBUT19TVEFUSUNfTVVURVhfbG9ja193cml0ZSgmZ2xvYmFsX2xvY2spOworICB9CisKKyAgd2hpbGUgKHJlcXVlc3RlZCA+IDApIHsKKyAgICB0b2RvID0gcmFuZF9ieXRlc19wZXJfYnVmIC0gYnVmLT51c2VkOworICAgIGlmICh0b2RvID4gcmVxdWVzdGVkKSB7CisgICAgICB0b2RvID0gcmVxdWVzdGVkOworICAgIH0KKyAgICBtZW1jcHkob3V0LCAmYnVmLT5yYW5kW2J1Zi0+dXNlZF0sIHRvZG8pOworICAgIHJlcXVlc3RlZCAtPSB0b2RvOworICAgIG91dCArPSB0b2RvOworICAgIGJ1Zi0+dXNlZCArPSB0b2RvOworCisgICAgaWYgKGJ1Zi0+dXNlZCA8IHJhbmRfYnl0ZXNfcGVyX2J1ZikgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFyZWFkX2Z1bGwoZmQsIGJ1Zi0+cmFuZCwgcmFuZF9ieXRlc19wZXJfYnVmKSkgeworICAgICAgT1BFTlNTTF9mcmVlKGJ1Zik7CisgICAgICBhYm9ydCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJ1Zi0+dXNlZCA9IDA7CisgIH0KKworICBDUllQVE9fU1RBVElDX01VVEVYX2xvY2tfd3JpdGUoJmdsb2JhbF9sb2NrKTsKKyAgYXNzZXJ0KGxpc3RfaGVhZCAhPSBidWYpOworICBidWYtPm5leHQgPSBsaXN0X2hlYWQ7CisgIGxpc3RfaGVhZCA9IGJ1ZjsKKyAgQ1JZUFRPX1NUQVRJQ19NVVRFWF91bmxvY2soJmdsb2JhbF9sb2NrKTsKIH0KIAogI2VuZGlmICAvKiAhT1BFTlNTTF9XSU5ET1dTICovCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3JjNC9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vcmM0L0NNYWtlTGlzdHMudHh0CmluZGV4IGEyMDhlOTYuLmZlMmQwYzYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vcmM0L0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vcmM0L0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCiAKIGlmICgke0FSQ0h9IFNUUkVRVUFMICJ4ODZfNjQiKQogICBzZXQoCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3JjNC9hc20vcmM0LXg4Nl82NC5wbCBiL3NyYy9jcnlwdG8vcmM0L2FzbS9yYzQteDg2XzY0LnBsCmluZGV4IGNlZjYyNjguLmRiNDYyNDIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vcmM0L2FzbS9yYzQteDg2XzY0LnBsCisrKyBiL3NyYy9jcnlwdG8vcmM0L2FzbS9yYzQteDg2XzY0LnBsCkBAIC01Niw3ICs1Niw3IEBACiAjIGFjaGlldmVzIHJlc3BlY3RmdWwgNDMyTUJwcyBvbiAyLjhHSHogcHJvY2Vzc29yIG5vdy4gRm9yIHJlZmVyZW5jZS4KICMgSWYgZXhlY3V0ZWQgb24gWGVvbiwgY3VycmVudCBSQzRfQ0hBUiBjb2RlLXBhdGggaXMgMi43eCBmYXN0ZXIgdGhhbgogIyBSQzRfSU5UIGNvZGUtcGF0aC4gV2hpbGUgaWYgZXhlY3V0ZWQgb24gT3B0ZXJvbiwgaXQncyBvbmx5IDI1JQotIyBzbG93ZXIgdGhhbiB0aGUgUkM0X0lOVCBvbmUgW21lYW5pbmcgdGhhdCBpZiBDUFUgwrUtYXJjaCBkZXRlY3Rpb24KKyMgc2xvd2VyIHRoYW4gdGhlIFJDNF9JTlQgb25lIFttZWFuaW5nIHRoYXQgaWYgQ1BVILUtYXJjaCBkZXRlY3Rpb24KICMgaXMgbm90IGltcGxlbWVudGVkLCB0aGVuIHRoaXMgZmluYWwgUkM0X0NIQVIgY29kZS1wYXRoIHNob3VsZCBiZQogIyBwcmVmZXJyZWQsIGFzIGl0IHByb3ZpZGVzIGJldHRlciAqYWxsLXJvdW5kKiBwZXJmb3JtYW5jZV0uCiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcnNhL0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9yc2EvQ01ha2VMaXN0cy50eHQKaW5kZXggYmQ4YWQzYi4uMGVhMTJjOCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9yc2EvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9yc2EvQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKIAogYWRkX2xpYnJhcnkoCiAgIHJzYQpAQCAtMTUsNyArMTUsNyBAQAogYWRkX2V4ZWN1dGFibGUoCiAgIHJzYV90ZXN0CiAKLSAgcnNhX3Rlc3QuY2MKKyAgcnNhX3Rlc3QuYwogCiAgICQ8VEFSR0VUX09CSkVDVFM6dGVzdF9zdXBwb3J0PgogKQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9yc2EvYmxpbmRpbmcuYyBiL3NyYy9jcnlwdG8vcnNhL2JsaW5kaW5nLmMKaW5kZXggYzkzY2VlMS4uMjQ1MTQyYiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9yc2EvYmxpbmRpbmcuYworKysgYi9zcmMvY3J5cHRvL3JzYS9ibGluZGluZy5jCkBAIC0xMzcsNyArMTM3LDcgQEAKIAogICByZXQgPSAoQk5fQkxJTkRJTkcqKSBPUEVOU1NMX21hbGxvYyhzaXplb2YoQk5fQkxJTkRJTkcpKTsKICAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBCTl9CTElORElOR19uZXcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogICBtZW1zZXQocmV0LCAwLCBzaXplb2YoQk5fQkxJTkRJTkcpKTsKQEAgLTE5MCw3ICsxOTAsNyBAQAogICBpbnQgcmV0ID0gMDsKIAogICBpZiAoYi0+QSA9PSBOVUxMIHx8IGItPkFpID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0JOX05PVF9JTklUSUFMSVpFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBCTl9CTElORElOR191cGRhdGUsIFJTQV9SX0JOX05PVF9JTklUSUFMSVpFRCk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMjMwLDcgKzIzMCw3IEBACiAgIGludCByZXQgPSAxOwogCiAgIGlmIChiLT5BID09IE5VTEwgfHwgYi0+QWkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQk5fTk9UX0lOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEJOX0JMSU5ESU5HX2NvbnZlcnRfZXgsIFJTQV9SX0JOX05PVF9JTklUSUFMSVpFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjY2LDcgKzI2Niw3IEBACiAgICAgcmV0ID0gQk5fbW9kX211bChuLCBuLCByLCBiLT5tb2QsIGN0eCk7CiAgIH0gZWxzZSB7CiAgICAgaWYgKGItPkFpID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQk5fTk9UX0lOSVRJQUxJWkVEKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgQk5fQkxJTkRJTkdfaW52ZXJ0X2V4LCBSU0FfUl9CTl9OT1RfSU5JVElBTElaRUQpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIHJldCA9IEJOX21vZF9tdWwobiwgbiwgYi0+QWksIGItPm1vZCwgY3R4KTsKQEAgLTMyNSwxMyArMzI1LDEzIEBACiAgICAgaWYgKCFCTl9yYW5kX3JhbmdlKHJldC0+QSwgcmV0LT5tb2QpKSB7CiAgICAgICBnb3RvIGVycjsKICAgICB9Ci0KLSAgICBpbnQgbm9faW52ZXJzZTsKLSAgICBpZiAoQk5fbW9kX2ludmVyc2VfZXgocmV0LT5BaSwgJm5vX2ludmVyc2UsIHJldC0+QSwgcmV0LT5tb2QsIGN0eCkgPT0gTlVMTCkgeworICAgIGlmIChCTl9tb2RfaW52ZXJzZShyZXQtPkFpLCByZXQtPkEsIHJldC0+bW9kLCBjdHgpID09IE5VTEwpIHsKICAgICAgIC8qIHRoaXMgc2hvdWxkIGFsbW9zdCBuZXZlciBoYXBwZW4gZm9yIGdvb2QgUlNBIGtleXMgKi8KLSAgICAgIGlmIChub19pbnZlcnNlKSB7CisgICAgICB1aW50MzJfdCBlcnJvciA9IEVSUl9wZWVrX2xhc3RfZXJyb3IoKTsKKyAgICAgIGlmIChFUlJfR0VUX1JFQVNPTihlcnJvcikgPT0gQk5fUl9OT19JTlZFUlNFKSB7CiAgICAgICAgIGlmIChyZXRyeV9jb3VudGVyLS0gPT0gMCkgewotICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfVE9PX01BTllfSVRFUkFUSU9OUyk7CisgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBCTl9CTElORElOR19jcmVhdGVfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNBX1JfVE9PX01BTllfSVRFUkFUSU9OUyk7CiAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgIH0KICAgICAgICAgRVJSX2NsZWFyX2Vycm9yKCk7CkBAIC00MTYsMTQgKzQxNiwxNCBAQAogICBCTl9DVFhfc3RhcnQoY3R4KTsKICAgZSA9IEJOX0NUWF9nZXQoY3R4KTsKICAgaWYgKGUgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgcnNhX3NldHVwX2JsaW5kaW5nLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAocnNhLT5lID09IE5VTEwpIHsKICAgICBlID0gcnNhX2dldF9wdWJsaWNfZXhwKHJzYS0+ZCwgcnNhLT5wLCByc2EtPnEsIGN0eCk7CiAgICAgaWYgKGUgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9OT19QVUJMSUNfRVhQT05FTlQpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCByc2Ffc2V0dXBfYmxpbmRpbmcsIFJTQV9SX05PX1BVQkxJQ19FWFBPTkVOVCk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0gZWxzZSB7CkBAIC00NDQsNyArNDQ0LDcgQEAKICAgcmV0ID0gQk5fQkxJTkRJTkdfY3JlYXRlX3BhcmFtKE5VTEwsIGUsIG4sIGN0eCwgcnNhLT5tZXRoLT5ibl9tb2RfZXhwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udF9jdHgpOwogICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9SX0JOX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCByc2Ffc2V0dXBfYmxpbmRpbmcsIEVSUl9SX0JOX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9yc2EvaW50ZXJuYWwuaCBiL3NyYy9jcnlwdG8vcnNhL2ludGVybmFsLmgKaW5kZXggYzAwNDRjMy4uZDE1ZjJhNSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9yc2EvaW50ZXJuYWwuaAorKysgYi9zcmMvY3J5cHRvL3JzYS9pbnRlcm5hbC5oCkBAIC01OSw2ICs1OSw4IEBACiAKICNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KIAorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCiAKICNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQogZXh0ZXJuICJDIiB7CkBAIC0xMDcsNiArMTA5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRVZQX01EICptZCwgY29uc3QgRVZQX01EICptZ2YxbWQpOwogaW50IFJTQV9wYWRkaW5nX2FkZF9ub25lKHVpbnQ4X3QgKnRvLCB1bnNpZ25lZCB0b19sZW4sIGNvbnN0IHVpbnQ4X3QgKmZyb20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZnJvbV9sZW4pOworaW50IFJTQV9wYWRkaW5nX2NoZWNrX25vbmUodWludDhfdCAqdG8sIHVuc2lnbmVkIHRvX2xlbiwgY29uc3QgdWludDhfdCAqZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZyb21fbGVuKTsKIAogLyogUlNBX3ByaXZhdGVfdHJhbnNmb3JtIGNhbGxzIGVpdGhlciB0aGUgbWV0aG9kLXNwZWNpZmljIHxwcml2YXRlX3RyYW5zZm9ybXwKICAqIGZ1bmN0aW9uIChpZiBnaXZlbikgb3IgdGhlIGdlbmVyaWMgb25lLiBTZWUgdGhlIGNvbW1lbnQgZm9yCkBAIC0xMTQsMjYgKzExOCwyMCBAQAogaW50IFJTQV9wcml2YXRlX3RyYW5zZm9ybShSU0EgKnJzYSwgdWludDhfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbik7CiAKK3R5cGVkZWYgc3RydWN0IHJzYV9wc3NfcGFyYW1zX3N0IHsKKyAgWDUwOV9BTEdPUiAqaGFzaEFsZ29yaXRobTsKKyAgWDUwOV9BTEdPUiAqbWFza0dlbkFsZ29yaXRobTsKKyAgQVNOMV9JTlRFR0VSICpzYWx0TGVuZ3RoOworICBBU04xX0lOVEVHRVIgKnRyYWlsZXJGaWVsZDsKK30gUlNBX1BTU19QQVJBTVM7CiAKLS8qIFJTQV9hZGRpdGlvbmFsX3ByaW1lIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0aGlyZCwgZm9ydGggZXRjIHByaW1lCi0gKiBpbiBhIG11bHRpLXByaW1lIFJTQSBrZXkuICovCi10eXBlZGVmIHN0cnVjdCBSU0FfYWRkaXRpb25hbF9wcmltZV9zdCB7Ci0gIEJJR05VTSAqcHJpbWU7Ci0gIC8qIGV4cCBpcyBkXntwcmltZS0xfSBtb2QgcHJpbWUgKi8KLSAgQklHTlVNICpleHA7Ci0gIC8qIGNvZWZmIGlzIHN1Y2ggdGhhdCByw5djb2VmZiDiiaEgMSBtb2QgcHJpbWUuICovCi0gIEJJR05VTSAqY29lZmY7CitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFJTQV9QU1NfUEFSQU1TKQogCi0gIC8qIFZhbHVlcyBiZWxvdyBoZXJlIGFyZSBub3QgaW4gdGhlIEFTTi4xIHNlcmlhbGlzYXRpb24uICovCi0KLSAgLyogciBpcyB0aGUgcHJvZHVjdCBvZiBhbGwgcHJpbWVzIChpbmNsdWRpbmcgcCBhbmQgcSkgcHJpb3IgdG8gdGhpcyBvbmUuICovCi0gIEJJR05VTSAqcjsKLSAgLyogbWV0aG9kX21vZCBpcyBtYW5hZ2VkIGJ5IHRoZSB8UlNBX01FVEhPRHwuICovCi0gIEJOX01PTlRfQ1RYICptZXRob2RfbW9kOwotfSBSU0FfYWRkaXRpb25hbF9wcmltZTsKLQotdm9pZCBSU0FfYWRkaXRpb25hbF9wcmltZV9mcmVlKFJTQV9hZGRpdGlvbmFsX3ByaW1lICphcCk7Ci0KK3R5cGVkZWYgc3RydWN0IHJzYV9vYWVwX3BhcmFtc19zdCB7CisgIFg1MDlfQUxHT1IgKmhhc2hGdW5jOworICBYNTA5X0FMR09SICptYXNrR2VuRnVuYzsKKyAgWDUwOV9BTEdPUiAqcFNvdXJjZUZ1bmM7Cit9IFJTQV9PQUVQX1BBUkFNUzsKIAogI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCiB9IC8qIGV4dGVybiBDICovCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3JzYS9wYWRkaW5nLmMgYi9zcmMvY3J5cHRvL3JzYS9wYWRkaW5nLmMKaW5kZXggNWE0MmUyNC4uMGE3MjVmMSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9yc2EvcGFkZGluZy5jCisrKyBiL3NyYy9jcnlwdG8vcnNhL3BhZGRpbmcuYwpAQCAtNzQsMTIgKzc0LDE0IEBACiAgIHVpbnQ4X3QgKnA7CiAKICAgaWYgKHRsZW4gPCBSU0FfUEtDUzFfUEFERElOR19TSVpFKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9LRVlfU0laRV9UT09fU01BTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX3R5cGVfMSwKKyAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9LRVlfU0laRV9UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGZsZW4gPiB0bGVuIC0gUlNBX1BLQ1MxX1BBRERJTkdfU0laRSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfREFUQV9UT09fTEFSR0VfRk9SX0tFWV9TSVpFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2FkZF9QS0NTMV90eXBlXzEsCisgICAgICAgICAgICAgICAgICAgICAgUlNBX1JfREFUQV9UT09fTEFSR0VfRk9SX0tFWV9TSVpFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xMDMsMTMgKzEwNSwxNSBAQAogICBjb25zdCB1aW50OF90ICpwOwogCiAgIGlmIChmbGVuIDwgMikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfREFUQV9UT09fU01BTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8xLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0RBVEFfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gLTE7CiAgIH0KIAogICBwID0gZnJvbTsKICAgaWYgKCgqKHArKykgIT0gMCkgfHwgKCoocCsrKSAhPSAxKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQkxPQ0tfVFlQRV9JU19OT1RfMDEpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8xLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0JMT0NLX1RZUEVfSVNfTk9UXzAxKTsKICAgICByZXR1cm4gLTE7CiAgIH0KIApAQCAtMTIyLDcgKzEyNiw4IEBACiAgICAgICAgIHArKzsKICAgICAgICAgYnJlYWs7CiAgICAgICB9IGVsc2UgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0JBRF9GSVhFRF9IRUFERVJfREVDUllQVCk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9CQURfRklYRURfSEVBREVSX0RFQ1JZUFQpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgICB9CiAgICAgfQpAQCAtMTMwLDE4ICsxMzUsMjEgQEAKICAgfQogCiAgIGlmIChpID09IGopIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX05VTExfQkVGT1JFX0JMT0NLX01JU1NJTkcpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8xLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX05VTExfQkVGT1JFX0JMT0NLX01JU1NJTkcpOwogICAgIHJldHVybiAtMTsKICAgfQogCiAgIGlmIChpIDwgOCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQkFEX1BBRF9CWVRFX0NPVU5UKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMSwKKyAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9CQURfUEFEX0JZVEVfQ09VTlQpOwogICAgIHJldHVybiAtMTsKICAgfQogICBpKys7IC8qIFNraXAgb3ZlciB0aGUgJ1wwJyAqLwogICBqIC09IGk7CiAgIGlmIChqID4gdGxlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfREFUQV9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8xLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0RBVEFfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gLTE7CiAgIH0KICAgbWVtY3B5KHRvLCBwLCBqKTsKQEAgLTE1NSwxMiArMTYzLDE0IEBACiAgIHVpbnQ4X3QgKnA7CiAKICAgaWYgKHRsZW4gPCBSU0FfUEtDUzFfUEFERElOR19TSVpFKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9LRVlfU0laRV9UT09fU01BTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX3R5cGVfMiwKKyAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9LRVlfU0laRV9UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGZsZW4gPiB0bGVuIC0gUlNBX1BLQ1MxX1BBRERJTkdfU0laRSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfREFUQV9UT09fTEFSR0VfRk9SX0tFWV9TSVpFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2FkZF9QS0NTMV90eXBlXzIsCisgICAgICAgICAgICAgICAgICAgICAgUlNBX1JfREFUQV9UT09fTEFSR0VfRk9SX0tFWV9TSVpFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0yNjEsNyArMjcxLDggQEAKICAgc2l6ZV90IG1zZ19pbmRleCwgbXNnX2xlbjsKIAogICBpZiAoZmxlbiA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9FTVBUWV9QVUJMSUNfS0VZKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMiwKKyAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9FTVBUWV9QVUJMSUNfS0VZKTsKICAgICByZXR1cm4gLTE7CiAgIH0KIApAQCAtMjcwLDcgKzI4MSw4IEBACiAgICAqIHxSU0FfUEtDUzFfUEFERElOR3wgbWFrZSBpdCBpbXBvc3NpYmxlIHRvIGNvbXBsZXRlbHkgYXZvaWQgQmxlaWNoZW5iYWNoZXIncwogICAgKiBhdHRhY2suICovCiAgIGlmICghUlNBX21lc3NhZ2VfaW5kZXhfUEtDUzFfdHlwZV8yKGZyb20sIGZsZW4sICZtc2dfaW5kZXgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9QS0NTX0RFQ09ESU5HX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMiwKKyAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9QS0NTX0RFQ09ESU5HX0VSUk9SKTsKICAgICByZXR1cm4gLTE7CiAgIH0KIApAQCAtMjc4LDcgKzI5MCw4IEBACiAgIGlmIChtc2dfbGVuID4gdGxlbikgewogICAgIC8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgYWx3YXlzIGNhbGxlZCB3aXRoIHx0bGVufAogICAgICAqIHRoZSBrZXkgc2l6ZSBhbmQgfGZsZW58IGlzIGJvdW5kZWQgYnkgdGhlIGtleSBzaXplLiAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfUEtDU19ERUNPRElOR19FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19jaGVja19QS0NTMV90eXBlXzIsCisgICAgICAgICAgICAgICAgICAgICAgUlNBX1JfUEtDU19ERUNPRElOR19FUlJPUik7CiAgICAgcmV0dXJuIC0xOwogICB9CiAgIG1lbWNweSh0bywgJmZyb21bbXNnX2luZGV4XSwgbXNnX2xlbik7CkBAIC0yODcsMTIgKzMwMCwxNCBAQAogCiBpbnQgUlNBX3BhZGRpbmdfYWRkX25vbmUodWludDhfdCAqdG8sIHVuc2lnbmVkIHRsZW4sIGNvbnN0IHVpbnQ4X3QgKmZyb20sIHVuc2lnbmVkIGZsZW4pIHsKICAgaWYgKGZsZW4gPiB0bGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfYWRkX25vbmUsCisgICAgICAgICAgICAgICAgICAgICAgUlNBX1JfREFUQV9UT09fTEFSR0VfRk9SX0tFWV9TSVpFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChmbGVuIDwgdGxlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfREFUQV9UT09fU01BTExfRk9SX0tFWV9TSVpFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2FkZF9ub25lLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0RBVEFfVE9PX1NNQUxMX0ZPUl9LRVlfU0laRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMzAwLDYgKzMxNSwxNyBAQAogICByZXR1cm4gMTsKIH0KIAoraW50IFJTQV9wYWRkaW5nX2NoZWNrX25vbmUodWludDhfdCAqdG8sIHVuc2lnbmVkIHRsZW4sIGNvbnN0IHVpbnQ4X3QgKmZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGVuKSB7CisgIGlmIChmbGVuID4gdGxlbikgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfbm9uZSwgUlNBX1JfREFUQV9UT09fTEFSR0UpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIG1lbWNweSh0bywgZnJvbSwgZmxlbik7CisgIHJldHVybiBmbGVuOworfQorCiBpbnQgUEtDUzFfTUdGMSh1aW50OF90ICptYXNrLCB1bnNpZ25lZCBsZW4sIGNvbnN0IHVpbnQ4X3QgKnNlZWQsCiAgICAgICAgICAgICAgICB1bnNpZ25lZCBzZWVkbGVuLCBjb25zdCBFVlBfTUQgKmRnc3QpIHsKICAgdW5zaWduZWQgb3V0bGVuID0gMDsKQEAgLTM2MiwxOCArMzg4LDIxIEBACiAgIG1kbGVuID0gRVZQX01EX3NpemUobWQpOwogCiAgIGlmICh0bGVuIDwgMiAqIG1kbGVuICsgMikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfS0VZX1NJWkVfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2FkZF9QS0NTMV9PQUVQX21nZjEsCisgICAgICAgICAgICAgICAgICAgICAgUlNBX1JfS0VZX1NJWkVfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGVtbGVuID0gdGxlbiAtIDE7CiAgIGlmIChmbGVuID4gZW1sZW4gLSAyICogbWRsZW4gLSAxKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX09BRVBfbWdmMSwKKyAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGVtbGVuIDwgMiAqIG1kbGVuICsgMSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfS0VZX1NJWkVfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2FkZF9QS0NTMV9PQUVQX21nZjEsCisgICAgICAgICAgICAgICAgICAgICAgUlNBX1JfS0VZX1NJWkVfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0zOTMsNyArNDIyLDggQEAKIAogICBkYm1hc2sgPSBPUEVOU1NMX21hbGxvYyhlbWxlbiAtIG1kbGVuKTsKICAgaWYgKGRibWFzayA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19hZGRfUEtDUzFfT0FFUF9tZ2YxLAorICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC00NDcsNyArNDc3LDggQEAKICAgZGJsZW4gPSBmbGVuIC0gbWRsZW4gLSAxOwogICBkYiA9IE9QRU5TU0xfbWFsbG9jKGRibGVuKTsKICAgaWYgKGRiID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX09BRVBfbWdmMSwKKyAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNDk1LDcgKzUyNiw4IEBACiAgIG9uZV9pbmRleCsrOwogICBtbGVuID0gZGJsZW4gLSBvbmVfaW5kZXg7CiAgIGlmICh0bGVuIDwgbWxlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfREFUQV9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfT0FFUF9tZ2YxLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0RBVEFfVE9PX0xBUkdFKTsKICAgICBtbGVuID0gLTE7CiAgIH0gZWxzZSB7CiAgICAgbWVtY3B5KHRvLCBkYiArIG9uZV9pbmRleCwgbWxlbik7CkBAIC01MDcsNyArNTM5LDggQEAKIGRlY29kaW5nX2VycjoKICAgLyogdG8gYXZvaWQgY2hvc2VuIGNpcGhlcnRleHQgYXR0YWNrcywgdGhlIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIG5vdCByZXZlYWwKICAgICogd2hpY2gga2luZCBvZiBkZWNvZGluZyBlcnJvciBoYXBwZW5lZCAqLwotICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX09BRVBfREVDT0RJTkdfRVJST1IpOworICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX09BRVBfbWdmMSwKKyAgICAgICAgICAgICAgICAgICAgUlNBX1JfT0FFUF9ERUNPRElOR19FUlJPUik7CiAgZXJyOgogICBPUEVOU1NMX2ZyZWUoZGIpOwogICByZXR1cm4gLTE7CkBAIC01NDMsMTQgKzU3NiwxNSBAQAogICB9IGVsc2UgaWYgKHNMZW4gPT0gLTIpIHsKICAgICBzTGVuID0gLTI7CiAgIH0gZWxzZSBpZiAoc0xlbiA8IC0yKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9TTEVOX0NIRUNLX0ZBSUxFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfdmVyaWZ5X1BLQ1MxX1BTU19tZ2YxLCBSU0FfUl9TTEVOX0NIRUNLX0ZBSUxFRCk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBNU0JpdHMgPSAoQk5fbnVtX2JpdHMocnNhLT5uKSAtIDEpICYgMHg3OwogICBlbUxlbiA9IFJTQV9zaXplKHJzYSk7CiAgIGlmIChFTVswXSAmICgweEZGIDw8IE1TQml0cykpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0ZJUlNUX09DVEVUX0lOVkFMSUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3ZlcmlmeV9QS0NTMV9QU1NfbWdmMSwKKyAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9GSVJTVF9PQ1RFVF9JTlZBTElEKTsKICAgICBnb3RvIGVycjsKICAgfQogICBpZiAoTVNCaXRzID09IDApIHsKQEAgLTU1OSwxOCArNTkzLDE4IEBACiAgIH0KICAgaWYgKGVtTGVuIDwgKChpbnQpaExlbiArIHNMZW4gKyAyKSkgewogICAgIC8qIHNMZW4gY2FuIGJlIHNtYWxsIG5lZ2F0aXZlICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9EQVRBX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfdmVyaWZ5X1BLQ1MxX1BTU19tZ2YxLCBSU0FfUl9EQVRBX1RPT19MQVJHRSk7CiAgICAgZ290byBlcnI7CiAgIH0KICAgaWYgKEVNW2VtTGVuIC0gMV0gIT0gMHhiYykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfTEFTVF9PQ1RFVF9JTlZBTElEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV92ZXJpZnlfUEtDUzFfUFNTX21nZjEsIFJTQV9SX0xBU1RfT0NURVRfSU5WQUxJRCk7CiAgICAgZ290byBlcnI7CiAgIH0KICAgbWFza2VkREJMZW4gPSBlbUxlbiAtIGhMZW4gLSAxOwogICBIID0gRU0gKyBtYXNrZWREQkxlbjsKICAgREIgPSBPUEVOU1NMX21hbGxvYyhtYXNrZWREQkxlbik7CiAgIGlmICghREIpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV92ZXJpZnlfUEtDUzFfUFNTX21nZjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogICBpZiAoUEtDUzFfTUdGMShEQiwgbWFza2VkREJMZW4sIEgsIGhMZW4sIG1nZjFIYXNoKSA8IDApIHsKQEAgLTU4NiwxMSArNjIwLDEyIEBACiAgICAgOwogICB9CiAgIGlmIChEQltpKytdICE9IDB4MSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfU0xFTl9SRUNPVkVSWV9GQUlMRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3ZlcmlmeV9QS0NTMV9QU1NfbWdmMSwKKyAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9TTEVOX1JFQ09WRVJZX0ZBSUxFRCk7CiAgICAgZ290byBlcnI7CiAgIH0KICAgaWYgKHNMZW4gPj0gMCAmJiAobWFza2VkREJMZW4gLSBpKSAhPSBzTGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9TTEVOX0NIRUNLX0ZBSUxFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfdmVyaWZ5X1BLQ1MxX1BTU19tZ2YxLCBSU0FfUl9TTEVOX0NIRUNLX0ZBSUxFRCk7CiAgICAgZ290byBlcnI7CiAgIH0KICAgaWYgKCFFVlBfRGlnZXN0SW5pdF9leCgmY3R4LCBIYXNoLCBOVUxMKSB8fApAQCAtNjA3LDcgKzY0Miw3IEBACiAgICAgZ290byBlcnI7CiAgIH0KICAgaWYgKG1lbWNtcChIXywgSCwgaExlbikpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0JBRF9TSUdOQVRVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3ZlcmlmeV9QS0NTMV9QU1NfbWdmMSwgUlNBX1JfQkFEX1NJR05BVFVSRSk7CiAgICAgcmV0ID0gMDsKICAgfSBlbHNlIHsKICAgICByZXQgPSAxOwpAQCAtNjQ2LDEyICs2ODEsMTQgQEAKICAgfSBlbHNlIGlmIChzTGVuID09IC0yKSB7CiAgICAgc0xlbiA9IC0yOwogICB9IGVsc2UgaWYgKHNMZW4gPCAtMikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfU0xFTl9DSEVDS19GQUlMRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX1BTU19tZ2YxLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX1NMRU5fQ0hFQ0tfRkFJTEVEKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIGlmIChCTl9pc196ZXJvKHJzYS0+bikpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0VNUFRZX1BVQkxJQ19LRVkpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX1BTU19tZ2YxLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0VNUFRZX1BVQkxJQ19LRVkpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTY2NCwxOCArNzAxLDIxIEBACiAgIH0KICAgaWYgKHNMZW4gPT0gLTIpIHsKICAgICBpZiAoZW1MZW4gPCBoTGVuICsgMikgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19hZGRfUEtDUzFfUFNTX21nZjEsCisgICAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIHNMZW4gPSBlbUxlbiAtIGhMZW4gLSAyOwogICB9IGVsc2UgaWYgKGVtTGVuIDwgaExlbiArIHNMZW4gKyAyKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX1BTU19tZ2YxLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRSk7CiAgICAgZ290byBlcnI7CiAgIH0KICAgaWYgKHNMZW4gPiAwKSB7CiAgICAgc2FsdCA9IE9QRU5TU0xfbWFsbG9jKHNMZW4pOwogICAgIGlmICghc2FsdCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2FkZF9QS0NTMV9QU1NfbWdmMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICBpZiAoIVJBTkRfYnl0ZXMoc2FsdCwgc0xlbikpIHsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcnNhL3JzYS5jIGIvc3JjL2NyeXB0by9yc2EvcnNhLmMKaW5kZXggMmYyMzE2NS4uMTcwNTliMCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9yc2EvcnNhLmMKKysrIGIvc3JjL2NyeXB0by9yc2EvcnNhLmMKQEAgLTc5LDcgKzc5LDcgQEAKIFJTQSAqUlNBX25ld19tZXRob2QoY29uc3QgRU5HSU5FICplbmdpbmUpIHsKICAgUlNBICpyc2EgPSAoUlNBICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFJTQSkpOwogICBpZiAocnNhID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9uZXdfbWV0aG9kLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIApAQCAtMTE0LDE4ICsxMTQsNiBAQAogICByZXR1cm4gcnNhOwogfQogCi12b2lkIFJTQV9hZGRpdGlvbmFsX3ByaW1lX2ZyZWUoUlNBX2FkZGl0aW9uYWxfcHJpbWUgKmFwKSB7Ci0gIGlmIChhcCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQk5fY2xlYXJfZnJlZShhcC0+cHJpbWUpOwotICBCTl9jbGVhcl9mcmVlKGFwLT5leHApOwotICBCTl9jbGVhcl9mcmVlKGFwLT5jb2VmZik7Ci0gIEJOX2NsZWFyX2ZyZWUoYXAtPnIpOwotICBPUEVOU1NMX2ZyZWUoYXApOwotfQotCiB2b2lkIFJTQV9mcmVlKFJTQSAqcnNhKSB7CiAgIHVuc2lnbmVkIHU7CiAKQEAgLTE1NywxMCArMTQ1LDYgQEAKICAgfQogICBPUEVOU1NMX2ZyZWUocnNhLT5ibGluZGluZ3MpOwogICBPUEVOU1NMX2ZyZWUocnNhLT5ibGluZGluZ3NfaW51c2UpOwotICBpZiAocnNhLT5hZGRpdGlvbmFsX3ByaW1lcyAhPSBOVUxMKSB7Ci0gICAgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfcG9wX2ZyZWUocnNhLT5hZGRpdGlvbmFsX3ByaW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FfYWRkaXRpb25hbF9wcmltZV9mcmVlKTsKLSAgfQogICBDUllQVE9fTVVURVhfY2xlYW51cCgmcnNhLT5sb2NrKTsKICAgT1BFTlNTTF9mcmVlKHJzYSk7CiB9CkBAIC0xNzgsMTYgKzE2Miw2IEBACiAgIHJldHVybiBSU0FfZGVmYXVsdF9tZXRob2Qua2V5Z2VuKHJzYSwgYml0cywgZV92YWx1ZSwgY2IpOwogfQogCi1pbnQgUlNBX2dlbmVyYXRlX211bHRpX3ByaW1lX2tleShSU0EgKnJzYSwgaW50IGJpdHMsIGludCBudW1fcHJpbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklHTlVNICplX3ZhbHVlLCBCTl9HRU5DQiAqY2IpIHsKLSAgaWYgKHJzYS0+bWV0aC0+bXVsdGlfcHJpbWVfa2V5Z2VuKSB7Ci0gICAgcmV0dXJuIHJzYS0+bWV0aC0+bXVsdGlfcHJpbWVfa2V5Z2VuKHJzYSwgYml0cywgbnVtX3ByaW1lcywgZV92YWx1ZSwgY2IpOwotICB9Ci0KLSAgcmV0dXJuIFJTQV9kZWZhdWx0X21ldGhvZC5tdWx0aV9wcmltZV9rZXlnZW4ocnNhLCBiaXRzLCBudW1fcHJpbWVzLCBlX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYik7Ci19Ci0KIGludCBSU0FfZW5jcnlwdChSU0EgKnJzYSwgc2l6ZV90ICpvdXRfbGVuLCB1aW50OF90ICpvdXQsIHNpemVfdCBtYXhfb3V0LAogICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuLCBpbnQgcGFkZGluZykgewogICBpZiAocnNhLT5tZXRoLT5lbmNyeXB0KSB7CkBAIC0zNjgsMTUgKzM0MiwyMCBAQAogICAgIH0sCiB9OwogCi1pbnQgUlNBX2FkZF9wa2NzMV9wcmVmaXgodWludDhfdCAqKm91dF9tc2csIHNpemVfdCAqb3V0X21zZ19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppc19hbGxvY2VkLCBpbnQgaGFzaF9uaWQsIGNvbnN0IHVpbnQ4X3QgKm1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbXNnX2xlbikgeworLyogVE9ETyhmb3JrKTogbW9zdGx5IG5ldyBjb2RlLCBuZWVkcyBjYXJlZnVsIHJldmlldy4gKi8KKworLyogcGtjczFfcHJlZml4ZWRfbXNnIGJ1aWxkcyBhIFBLQ1MjMSwgcHJlZml4ZWQgdmVyc2lvbiBvZiB8bXNnfCBmb3IgdGhlIGdpdmVuCisgKiBoYXNoIGZ1bmN0aW9uIGFuZCBzZXRzIHxvdXRfbXNnfCB0byBwb2ludCB0byBpdC4gT24gc3VjY2Vzc2Z1bCByZXR1cm4sCisgKiB8Km91dF9tc2d8IG1heSBiZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCwgaWYgc28sIHwqaXNfYWxsb2NlZHwgd2lsbCBiZSAxLiAqLworc3RhdGljIGludCBwa2NzMV9wcmVmaXhlZF9tc2codWludDhfdCAqKm91dF9tc2csIHNpemVfdCAqb3V0X21zZ19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmlzX2FsbG9jZWQsIGludCBoYXNoX25pZCwgY29uc3QgdWludDhfdCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1zZ19sZW4pIHsKICAgdW5zaWduZWQgaTsKIAogICBpZiAoaGFzaF9uaWQgPT0gTklEX21kNV9zaGExKSB7CiAgICAgLyogU3BlY2lhbCBjYXNlOiBTU0wgc2lnbmF0dXJlLCBqdXN0IGNoZWNrIHRoZSBsZW5ndGguICovCiAgICAgaWYgKG1zZ19sZW4gIT0gU1NMX1NJR19MRU5HVEgpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfSU5WQUxJRF9NRVNTQUdFX0xFTkdUSCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIHBrY3MxX3ByZWZpeGVkX21zZywgUlNBX1JfSU5WQUxJRF9NRVNTQUdFX0xFTkdUSCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTM5OSwxMyArMzc4LDEzIEBACiAKICAgICBzaWduZWRfbXNnX2xlbiA9IHByZWZpeF9sZW4gKyBtc2dfbGVuOwogICAgIGlmIChzaWduZWRfbXNnX2xlbiA8IHByZWZpeF9sZW4pIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfVE9PX0xPTkcpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBwa2NzMV9wcmVmaXhlZF9tc2csIFJTQV9SX1RPT19MT05HKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KIAogICAgIHNpZ25lZF9tc2cgPSBPUEVOU1NMX21hbGxvYyhzaWduZWRfbXNnX2xlbik7CiAgICAgaWYgKCFzaWduZWRfbXNnKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgcGtjczFfcHJlZml4ZWRfbXNnLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTQxOSw3ICszOTgsNyBAQAogICAgIHJldHVybiAxOwogICB9CiAKLSAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9VTktOT1dOX0FMR09SSVRITV9UWVBFKTsKKyAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBwa2NzMV9wcmVmaXhlZF9tc2csIFJTQV9SX1VOS05PV05fQUxHT1JJVEhNX1RZUEUpOwogICByZXR1cm4gMDsKIH0KIApAQCAtNDM2LDE0ICs0MTUsMTQgQEAKICAgICByZXR1cm4gcnNhLT5tZXRoLT5zaWduKGhhc2hfbmlkLCBpbiwgaW5fbGVuLCBvdXQsIG91dF9sZW4sIHJzYSk7CiAgIH0KIAotICBpZiAoIVJTQV9hZGRfcGtjczFfcHJlZml4KCZzaWduZWRfbXNnLCAmc2lnbmVkX21zZ19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25lZF9tc2dfaXNfYWxsb2NlZCwgaGFzaF9uaWQsIGluLCBpbl9sZW4pKSB7CisgIGlmICghcGtjczFfcHJlZml4ZWRfbXNnKCZzaWduZWRfbXNnLCAmc2lnbmVkX21zZ19sZW4sICZzaWduZWRfbXNnX2lzX2FsbG9jZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfbmlkLCBpbiwgaW5fbGVuKSkgewogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKHJzYV9zaXplIDwgUlNBX1BLQ1MxX1BBRERJTkdfU0laRSB8fAogICAgICAgc2lnbmVkX21zZ19sZW4gPiByc2Ffc2l6ZSAtIFJTQV9QS0NTMV9QQURESU5HX1NJWkUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0RJR0VTVF9UT09fQklHX0ZPUl9SU0FfS0VZKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9zaWduLCBSU0FfUl9ESUdFU1RfVE9PX0JJR19GT1JfUlNBX0tFWSk7CiAgICAgZ290byBmaW5pc2g7CiAgIH0KIApAQCAtNDc0LDE4ICs0NTMsMTggQEAKICAgfQogCiAgIGlmIChzaWdfbGVuICE9IHJzYV9zaXplKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9XUk9OR19TSUdOQVRVUkVfTEVOR1RIKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV92ZXJpZnksIFJTQV9SX1dST05HX1NJR05BVFVSRV9MRU5HVEgpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGhhc2hfbmlkID09IE5JRF9tZDVfc2hhMSAmJiBtc2dfbGVuICE9IFNTTF9TSUdfTEVOR1RIKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9JTlZBTElEX01FU1NBR0VfTEVOR1RIKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV92ZXJpZnksIFJTQV9SX0lOVkFMSURfTUVTU0FHRV9MRU5HVEgpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgYnVmID0gT1BFTlNTTF9tYWxsb2MocnNhX3NpemUpOwogICBpZiAoIWJ1ZikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3ZlcmlmeSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTQ5NCwxMyArNDczLDEzIEBACiAgICAgZ290byBvdXQ7CiAgIH0KIAotICBpZiAoIVJTQV9hZGRfcGtjczFfcHJlZml4KCZzaWduZWRfbXNnLCAmc2lnbmVkX21zZ19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25lZF9tc2dfaXNfYWxsb2NlZCwgaGFzaF9uaWQsIG1zZywgbXNnX2xlbikpIHsKKyAgaWYgKCFwa2NzMV9wcmVmaXhlZF9tc2coJnNpZ25lZF9tc2csICZzaWduZWRfbXNnX2xlbiwgJnNpZ25lZF9tc2dfaXNfYWxsb2NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9uaWQsIG1zZywgbXNnX2xlbikpIHsKICAgICBnb3RvIG91dDsKICAgfQogCiAgIGlmIChsZW4gIT0gc2lnbmVkX21zZ19sZW4gfHwgQ1JZUFRPX21lbWNtcChidWYsIHNpZ25lZF9tc2csIGxlbikgIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQkFEX1NJR05BVFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfdmVyaWZ5LCBSU0FfUl9CQURfU0lHTkFUVVJFKTsKICAgICBnb3RvIG91dDsKICAgfQogCkBAIC01MzAsMTIgKzUwOSwxMiBAQAogICB9CiAKICAgaWYgKChrZXktPnAgIT0gTlVMTCkgIT0gKGtleS0+cSAhPSBOVUxMKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfT05MWV9PTkVfT0ZfUF9RX0dJVkVOKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9jaGVja19rZXksIFJTQV9SX09OTFlfT05FX09GX1BfUV9HSVZFTik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoIWtleS0+biB8fCAha2V5LT5lKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9WQUxVRV9NSVNTSU5HKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9jaGVja19rZXksIFJTQV9SX1ZBTFVFX01JU1NJTkcpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTU0Nyw3ICs1MjYsNyBAQAogCiAgIGN0eCA9IEJOX0NUWF9uZXcoKTsKICAgaWYgKGN0eCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfY2hlY2tfa2V5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNTYxLDc0ICs1NDAsNTIgQEAKICAgQk5faW5pdCgmZG1xMSk7CiAgIEJOX2luaXQoJmlxbXApOwogCi0gIGlmICghQk5fbXVsKCZuLCBrZXktPnAsIGtleS0+cSwgY3R4KSB8fAotICAgICAgLyogbGNtID0gbGNtKHByaW1lLTEsIGZvciBhbGwgcHJpbWVzKSAqLworICBpZiAoLyogbiA9IHBxICovCisgICAgICAhQk5fbXVsKCZuLCBrZXktPnAsIGtleS0+cSwgY3R4KSB8fAorICAgICAgLyogbGNtID0gbGNtKHAtMSwgcS0xKSAqLwogICAgICAgIUJOX3N1YigmcG0xLCBrZXktPnAsIEJOX3ZhbHVlX29uZSgpKSB8fAogICAgICAgIUJOX3N1YigmcW0xLCBrZXktPnEsIEJOX3ZhbHVlX29uZSgpKSB8fAogICAgICAgIUJOX211bCgmbGNtLCAmcG0xLCAmcW0xLCBjdHgpIHx8Ci0gICAgICAhQk5fZ2NkKCZnY2QsICZwbTEsICZxbTEsIGN0eCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9MSUJfQk4pOwotICAgIGdvdG8gb3V0OwotICB9Ci0KLSAgc2l6ZV90IG51bV9hZGRpdGlvbmFsX3ByaW1lcyA9IDA7Ci0gIGlmIChrZXktPmFkZGl0aW9uYWxfcHJpbWVzICE9IE5VTEwpIHsKLSAgICBudW1fYWRkaXRpb25hbF9wcmltZXMgPSBza19SU0FfYWRkaXRpb25hbF9wcmltZV9udW0oa2V5LT5hZGRpdGlvbmFsX3ByaW1lcyk7Ci0gIH0KLQotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9hZGRpdGlvbmFsX3ByaW1lczsgaSsrKSB7Ci0gICAgY29uc3QgUlNBX2FkZGl0aW9uYWxfcHJpbWUgKmFwID0KLSAgICAgICAgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfdmFsdWUoa2V5LT5hZGRpdGlvbmFsX3ByaW1lcywgaSk7Ci0gICAgaWYgKCFCTl9tdWwoJm4sICZuLCBhcC0+cHJpbWUsIGN0eCkgfHwKLSAgICAgICAgIUJOX3N1YigmcG0xLCBhcC0+cHJpbWUsIEJOX3ZhbHVlX29uZSgpKSB8fAotICAgICAgICAhQk5fbXVsKCZsY20sICZsY20sICZwbTEsIGN0eCkgfHwKLSAgICAgICAgIUJOX2djZCgmZ2NkLCAmZ2NkLCAmcG0xLCBjdHgpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9MSUJfQk4pOwotICAgICAgZ290byBvdXQ7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFCTl9kaXYoJmxjbSwgTlVMTCwgJmxjbSwgJmdjZCwgY3R4KSB8fAogICAgICAgIUJOX2djZCgmZ2NkLCAmcG0xLCAmcW0xLCBjdHgpIHx8Ci0gICAgICAvKiBkZSA9IGQqZSBtb2QgbGNtKHByaW1lLTEsIGZvciBhbGwgcHJpbWVzKS4gKi8KKyAgICAgICFCTl9kaXYoJmxjbSwgTlVMTCwgJmxjbSwgJmdjZCwgY3R4KSB8fAorICAgICAgLyogZGUgPSBkKmUgbW9kIGxjbShwLTEsIHEtMSkgKi8KICAgICAgICFCTl9tb2RfbXVsKCZkZSwga2V5LT5kLCBrZXktPmUsICZsY20sIGN0eCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9MSUJfQk4pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX2NoZWNrX2tleSwgRVJSX0xJQl9CTik7CiAgICAgZ290byBvdXQ7CiAgIH0KIAogICBpZiAoQk5fY21wKCZuLCBrZXktPm4pICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX05fTk9UX0VRVUFMX1BfUSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfY2hlY2tfa2V5LCBSU0FfUl9OX05PVF9FUVVBTF9QX1EpOwogICAgIGdvdG8gb3V0OwogICB9CiAKICAgaWYgKCFCTl9pc19vbmUoJmRlKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfRF9FX05PVF9DT05HUlVFTlRfVE9fMSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfY2hlY2tfa2V5LCBSU0FfUl9EX0VfTk9UX0NPTkdSVUVOVF9UT18xKTsKICAgICBnb3RvIG91dDsKICAgfQogCiAgIGhhc19jcnRfdmFsdWVzID0ga2V5LT5kbXAxICE9IE5VTEw7CiAgIGlmIChoYXNfY3J0X3ZhbHVlcyAhPSAoa2V5LT5kbXExICE9IE5VTEwpIHx8CiAgICAgICBoYXNfY3J0X3ZhbHVlcyAhPSAoa2V5LT5pcW1wICE9IE5VTEwpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9JTkNPTlNJU1RFTlRfU0VUX09GX0NSVF9WQUxVRVMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX2NoZWNrX2tleSwgUlNBX1JfSU5DT05TSVNURU5UX1NFVF9PRl9DUlRfVkFMVUVTKTsKICAgICBnb3RvIG91dDsKICAgfQogCi0gIGlmIChoYXNfY3J0X3ZhbHVlcyAmJiBudW1fYWRkaXRpb25hbF9wcmltZXMgPT0gMCkgeworICBpZiAoaGFzX2NydF92YWx1ZXMpIHsKICAgICBpZiAoLyogZG1wMSA9IGQgbW9kIChwLTEpICovCiAgICAgICAgICFCTl9tb2QoJmRtcDEsIGtleS0+ZCwgJnBtMSwgY3R4KSB8fAogICAgICAgICAvKiBkbXExID0gZCBtb2QgKHEtMSkgKi8KICAgICAgICAgIUJOX21vZCgmZG1xMSwga2V5LT5kLCAmcW0xLCBjdHgpIHx8CiAgICAgICAgIC8qIGlxbXAgPSBxXi0xIG1vZCBwICovCiAgICAgICAgICFCTl9tb2RfaW52ZXJzZSgmaXFtcCwga2V5LT5xLCBrZXktPnAsIGN0eCkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX0xJQl9CTik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9jaGVja19rZXksIEVSUl9MSUJfQk4pOwogICAgICAgZ290byBvdXQ7CiAgICAgfQogCiAgICAgaWYgKEJOX2NtcCgmZG1wMSwga2V5LT5kbXAxKSAhPSAwIHx8CiAgICAgICAgIEJOX2NtcCgmZG1xMSwga2V5LT5kbXExKSAhPSAwIHx8CiAgICAgICAgIEJOX2NtcCgmaXFtcCwga2V5LT5pcW1wKSAhPSAwKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0NSVF9WQUxVRVNfSU5DT1JSRUNUKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX2NoZWNrX2tleSwgUlNBX1JfQ1JUX1ZBTFVFU19JTkNPUlJFQ1QpOwogICAgICAgZ290byBvdXQ7CiAgICAgfQogICB9CkBAIC02NTYsMTcgKzYxMywxMyBAQAogICBpbnQgb2sgPSAwOwogCiAgIGlmIChyc2EtPm4gPT0gTlVMTCB8fCByc2EtPmUgPT0gTlVMTCB8fCByc2EtPmQgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfRU1QVFlfUFVCTElDX0tFWSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcmVjb3Zlcl9jcnRfcGFyYW1zLCBSU0FfUl9FTVBUWV9QVUJMSUNfS0VZKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChyc2EtPnAgfHwgcnNhLT5xIHx8IHJzYS0+ZG1wMSB8fCByc2EtPmRtcTEgfHwgcnNhLT5pcW1wKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9DUlRfUEFSQU1TX0FMUkVBRFlfR0lWRU4pOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaWYgKHJzYS0+YWRkaXRpb25hbF9wcmltZXMgIT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQ0FOTk9UX1JFQ09WRVJfTVVMVElfUFJJTUVfS0VZKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9yZWNvdmVyX2NydF9wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgUlNBX1JfQ1JUX1BBUkFNU19BTFJFQURZX0dJVkVOKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC02NzUsNyArNjI4LDcgQEAKIAogICBjdHggPSBCTl9DVFhfbmV3KCk7CiAgIGlmIChjdHggPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3JlY292ZXJfY3J0X3BhcmFtcywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTY4OCw3ICs2NDEsNyBAQAogCiAgIGlmICh0b3RpZW50ID09IE5VTEwgfHwgcmVtID09IE5VTEwgfHwgbXVsdGlwbGUgPT0gTlVMTCB8fCBwX3BsdXNfcSA9PSBOVUxMIHx8CiAgICAgICBwX21pbnVzX3EgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3JlY292ZXJfY3J0X3BhcmFtcywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTcxNiwxMiArNjY5LDEyIEBACiAgICAgICAhQk5fZGl2KG11bHRpcGxlLCBOVUxMLCB0b3RpZW50LCByc2EtPm4sIGN0eCkgfHwKICAgICAgICFCTl9hZGRfd29yZChtdWx0aXBsZSwgMSkgfHwKICAgICAgICFCTl9kaXYodG90aWVudCwgcmVtLCB0b3RpZW50LCBtdWx0aXBsZSwgY3R4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfQk5fTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9yZWNvdmVyX2NydF9wYXJhbXMsIEVSUl9SX0JOX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAoIUJOX2lzX3plcm8ocmVtKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQkFEX1JTQV9QQVJBTUVURVJTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9yZWNvdmVyX2NydF9wYXJhbXMsIFJTQV9SX0JBRF9SU0FfUEFSQU1FVEVSUyk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNzMyLDcgKzY4NSw3IEBACiAgIHJzYS0+aXFtcCA9IEJOX25ldygpOwogICBpZiAocnNhLT5wID09IE5VTEwgfHwgcnNhLT5xID09IE5VTEwgfHwgcnNhLT5kbXAxID09IE5VTEwgfHwgcnNhLT5kbXExID09CiAgICAgICBOVUxMIHx8IHJzYS0+aXFtcCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcmVjb3Zlcl9jcnRfcGFyYW1zLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNzUwLDEyICs3MDMsMTIgQEAKICAgICAgICFCTl9yc2hpZnQxKHJzYS0+cSwgcnNhLT5xKSB8fAogICAgICAgIUJOX2Rpdihyc2EtPnAsIE5VTEwsIHJzYS0+biwgcnNhLT5xLCBjdHgpIHx8CiAgICAgICAhQk5fbXVsKG11bHRpcGxlLCByc2EtPnAsIHJzYS0+cSwgY3R4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfQk5fTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9yZWNvdmVyX2NydF9wYXJhbXMsIEVSUl9SX0JOX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAoQk5fY21wKG11bHRpcGxlLCByc2EtPm4pICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9yZWNvdmVyX2NydF9wYXJhbXMsIFJTQV9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC03NjQsNyArNzE3LDcgQEAKICAgICAgICFCTl9zdWIocmVtLCByc2EtPnEsIEJOX3ZhbHVlX29uZSgpKSB8fAogICAgICAgIUJOX21vZChyc2EtPmRtcTEsIHJzYS0+ZCwgcmVtLCBjdHgpIHx8CiAgICAgICAhQk5fbW9kX2ludmVyc2UocnNhLT5pcW1wLCByc2EtPnEsIHJzYS0+cCwgY3R4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfQk5fTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9yZWNvdmVyX2NydF9wYXJhbXMsIEVSUl9SX0JOX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9yc2EvcnNhX2FzbjEuYyBiL3NyYy9jcnlwdG8vcnNhL3JzYV9hc24xLmMKaW5kZXggZTM3NTZiYS4uOTI0Y2I4YSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9yc2EvcnNhX2FzbjEuYworKysgYi9zcmMvY3J5cHRvL3JzYS9yc2FfYXNuMS5jCkBAIC01NSwzODQgKzU1LDQ1IEBACiAKICNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KICNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgotI2luY2x1ZGUgPG9wZW5zc2wvYnl0ZXN0cmluZy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIAotc3RhdGljIGludCBwYXJzZV9pbnRlZ2VyX2J1Z2d5KENCUyAqY2JzLCBCSUdOVU0gKipvdXQsIGludCBidWdneSkgewotICBhc3NlcnQoKm91dCA9PSBOVUxMKTsKLSAgKm91dCA9IEJOX25ldygpOwotICBpZiAoKm91dCA9PSBOVUxMKSB7CisvKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBmcmVlIGFuZCBuZXcgbWV0aG9kcyAqLworc3RhdGljIGludCByc2FfY2IoaW50IG9wZXJhdGlvbiwgQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQsCisgICAgICAgICAgICAgICAgICB2b2lkICpleGFyZykgeworICBpZiAob3BlcmF0aW9uID09IEFTTjFfT1BfTkVXX1BSRSkgeworICAgICpwdmFsID0gKEFTTjFfVkFMVUUgKilSU0FfbmV3KCk7CisgICAgaWYgKCpwdmFsKSB7CisgICAgICByZXR1cm4gMjsKKyAgICB9CiAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKGJ1Z2d5KSB7Ci0gICAgcmV0dXJuIEJOX2NiczJ1bnNpZ25lZF9idWdneShjYnMsICpvdXQpOwotICB9Ci0gIHJldHVybiBCTl9jYnMydW5zaWduZWQoY2JzLCAqb3V0KTsKLX0KLQotc3RhdGljIGludCBwYXJzZV9pbnRlZ2VyKENCUyAqY2JzLCBCSUdOVU0gKipvdXQpIHsKLSAgcmV0dXJuIHBhcnNlX2ludGVnZXJfYnVnZ3koY2JzLCBvdXQsIDAgLyogbm90IGJ1Z2d5ICovKTsKLX0KLQotc3RhdGljIGludCBtYXJzaGFsX2ludGVnZXIoQ0JCICpjYmIsIEJJR05VTSAqYm4pIHsKLSAgaWYgKGJuID09IE5VTEwpIHsKLSAgICAvKiBBbiBSU0Egb2JqZWN0IG1heSBiZSBtaXNzaW5nIHNvbWUgY29tcG9uZW50cy4gKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX1ZBTFVFX01JU1NJTkcpOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBCTl9ibjJjYmIoY2JiLCBibik7Ci19Ci0KLXN0YXRpYyBSU0EgKnBhcnNlX3B1YmxpY19rZXkoQ0JTICpjYnMsIGludCBidWdneSkgewotICBSU0EgKnJldCA9IFJTQV9uZXcoKTsKLSAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgQ0JTIGNoaWxkOwotICBpZiAoIUNCU19nZXRfYXNuMShjYnMsICZjaGlsZCwgQ0JTX0FTTjFfU0VRVUVOQ0UpIHx8Ci0gICAgICAhcGFyc2VfaW50ZWdlcl9idWdneSgmY2hpbGQsICZyZXQtPm4sIGJ1Z2d5KSB8fAotICAgICAgIXBhcnNlX2ludGVnZXIoJmNoaWxkLCAmcmV0LT5lKSB8fAotICAgICAgQ0JTX2xlbigmY2hpbGQpICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0JBRF9FTkNPRElORyk7Ci0gICAgUlNBX2ZyZWUocmV0KTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gcmV0OwotfQotCi1SU0EgKlJTQV9wYXJzZV9wdWJsaWNfa2V5KENCUyAqY2JzKSB7Ci0gIHJldHVybiBwYXJzZV9wdWJsaWNfa2V5KGNicywgMCAvKiBub3QgYnVnZ3kgKi8pOwotfQotCi1SU0EgKlJTQV9wYXJzZV9wdWJsaWNfa2V5X2J1Z2d5KENCUyAqY2JzKSB7Ci0gIC8qIEVzdG9uaWFuIElEcyBpc3N1ZWQgYmV0d2VlbiBTZXB0ZW1iZXIgMjAxNCB0byBTZXB0ZW1iZXIgMjAxNSBhcmUKLSAgICogYnJva2VuLiBTZWUgaHR0cHM6Ly9jcmJ1Zy5jb20vNTMyMDQ4IGFuZCBodHRwczovL2NyYnVnLmNvbS81MzQ3NjYuCi0gICAqCi0gICAqIFRPRE8oZGF2aWRiZW4pOiBSZW1vdmUgdGhpcyBjb2RlIGFuZCBjYWxsZXJzIGluIE1hcmNoIDIwMTYuICovCi0gIHJldHVybiBwYXJzZV9wdWJsaWNfa2V5KGNicywgMSAvKiBidWdneSAqLyk7Ci19Ci0KLVJTQSAqUlNBX3B1YmxpY19rZXlfZnJvbV9ieXRlcyhjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluX2xlbikgewotICBDQlMgY2JzOwotICBDQlNfaW5pdCgmY2JzLCBpbiwgaW5fbGVuKTsKLSAgUlNBICpyZXQgPSBSU0FfcGFyc2VfcHVibGljX2tleSgmY2JzKTsKLSAgaWYgKHJldCA9PSBOVUxMIHx8IENCU19sZW4oJmNicykgIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQkFEX0VOQ09ESU5HKTsKLSAgICBSU0FfZnJlZShyZXQpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWludCBSU0FfbWFyc2hhbF9wdWJsaWNfa2V5KENCQiAqY2JiLCBjb25zdCBSU0EgKnJzYSkgewotICBDQkIgY2hpbGQ7Ci0gIGlmICghQ0JCX2FkZF9hc24xKGNiYiwgJmNoaWxkLCBDQlNfQVNOMV9TRVFVRU5DRSkgfHwKLSAgICAgICFtYXJzaGFsX2ludGVnZXIoJmNoaWxkLCByc2EtPm4pIHx8Ci0gICAgICAhbWFyc2hhbF9pbnRlZ2VyKCZjaGlsZCwgcnNhLT5lKSB8fAotICAgICAgIUNCQl9mbHVzaChjYmIpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9FTkNPREVfRVJST1IpOwotICAgIHJldHVybiAwOworICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PSBBU04xX09QX0ZSRUVfUFJFKSB7CisgICAgUlNBX2ZyZWUoKFJTQSAqKSpwdmFsKTsKKyAgICAqcHZhbCA9IE5VTEw7CisgICAgcmV0dXJuIDI7CiAgIH0KICAgcmV0dXJuIDE7CiB9CiAKLWludCBSU0FfcHVibGljX2tleV90b19ieXRlcyh1aW50OF90ICoqb3V0X2J5dGVzLCBzaXplX3QgKm91dF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUlNBICpyc2EpIHsKLSAgQ0JCIGNiYjsKLSAgQ0JCX3plcm8oJmNiYik7Ci0gIGlmICghQ0JCX2luaXQoJmNiYiwgMCkgfHwKLSAgICAgICFSU0FfbWFyc2hhbF9wdWJsaWNfa2V5KCZjYmIsIHJzYSkgfHwKLSAgICAgICFDQkJfZmluaXNoKCZjYmIsIG91dF9ieXRlcywgb3V0X2xlbikpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0VOQ09ERV9FUlJPUik7Ci0gICAgQ0JCX2NsZWFudXAoJmNiYik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19CitBU04xX1NFUVVFTkNFX2NiKFJTQVByaXZhdGVLZXksIHJzYV9jYikgPSB7CisgIEFTTjFfU0lNUExFKFJTQSwgdmVyc2lvbiwgTE9ORyksCisgIEFTTjFfU0lNUExFKFJTQSwgbiwgQklHTlVNKSwKKyAgQVNOMV9TSU1QTEUoUlNBLCBlLCBCSUdOVU0pLAorICBBU04xX1NJTVBMRShSU0EsIGQsIEJJR05VTSksCisgIEFTTjFfU0lNUExFKFJTQSwgcCwgQklHTlVNKSwKKyAgQVNOMV9TSU1QTEUoUlNBLCBxLCBCSUdOVU0pLAorICBBU04xX1NJTVBMRShSU0EsIGRtcDEsIEJJR05VTSksCisgIEFTTjFfU0lNUExFKFJTQSwgZG1xMSwgQklHTlVNKSwKKyAgQVNOMV9TSU1QTEUoUlNBLCBpcW1wLCBCSUdOVU0pLAorfSBBU04xX1NFUVVFTkNFX0VORF9jYihSU0EsIFJTQVByaXZhdGVLZXkpOwogCi0vKiBrVmVyc2lvblR3b1ByaW1lIGFuZCBrVmVyc2lvbk11bHRpIGFyZSB0aGUgc3VwcG9ydGVkIHZhbHVlcyBvZiB0aGUgdmVyc2lvbgotICogZmllbGQgb2YgYW4gUlNBUHJpdmF0ZUtleSBzdHJ1Y3R1cmUgKFJGQyAzNDQ3KS4gKi8KLXN0YXRpYyBjb25zdCB1aW50NjRfdCBrVmVyc2lvblR3b1ByaW1lID0gMDsKLXN0YXRpYyBjb25zdCB1aW50NjRfdCBrVmVyc2lvbk11bHRpID0gMTsKLQotLyogcnNhX3BhcnNlX2FkZGl0aW9uYWxfcHJpbWUgcGFyc2VzIGEgREVSLWVuY29kZWQgT3RoZXJQcmltZUluZm8gZnJvbSB8Y2JzfCBhbmQKLSAqIGFkdmFuY2VzIHxjYnN8LiBJdCByZXR1cm5zIGEgbmV3bHktYWxsb2NhdGVkIHxSU0FfYWRkaXRpb25hbF9wcmltZXwgb24KLSAqIHN1Y2Nlc3Mgb3IgTlVMTCBvbiBlcnJvci4gVGhlIHxyfCBhbmQgfG1ldGhvZF9tb2R8IGZpZWxkcyBvZiB0aGUgcmVzdWx0IGFyZQotICogc2V0IHRvIE5VTEwuICovCi1zdGF0aWMgUlNBX2FkZGl0aW9uYWxfcHJpbWUgKnJzYV9wYXJzZV9hZGRpdGlvbmFsX3ByaW1lKENCUyAqY2JzKSB7Ci0gIFJTQV9hZGRpdGlvbmFsX3ByaW1lICpyZXQgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoUlNBX2FkZGl0aW9uYWxfcHJpbWUpKTsKLSAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgbWVtc2V0KHJldCwgMCwgc2l6ZW9mKFJTQV9hZGRpdGlvbmFsX3ByaW1lKSk7Ci0KLSAgQ0JTIGNoaWxkOwotICBpZiAoIUNCU19nZXRfYXNuMShjYnMsICZjaGlsZCwgQ0JTX0FTTjFfU0VRVUVOQ0UpIHx8Ci0gICAgICAhcGFyc2VfaW50ZWdlcigmY2hpbGQsICZyZXQtPnByaW1lKSB8fAotICAgICAgIXBhcnNlX2ludGVnZXIoJmNoaWxkLCAmcmV0LT5leHApIHx8Ci0gICAgICAhcGFyc2VfaW50ZWdlcigmY2hpbGQsICZyZXQtPmNvZWZmKSB8fAotICAgICAgQ0JTX2xlbigmY2hpbGQpICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0JBRF9FTkNPRElORyk7Ci0gICAgUlNBX2FkZGl0aW9uYWxfcHJpbWVfZnJlZShyZXQpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotUlNBICpSU0FfcGFyc2VfcHJpdmF0ZV9rZXkoQ0JTICpjYnMpIHsKLSAgQk5fQ1RYICpjdHggPSBOVUxMOwotICBCSUdOVU0gKnByb2R1Y3Rfb2ZfcHJpbWVzX3NvX2ZhciA9IE5VTEw7Ci0gIFJTQSAqcmV0ID0gUlNBX25ldygpOwotICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIENCUyBjaGlsZDsKLSAgdWludDY0X3QgdmVyc2lvbjsKLSAgaWYgKCFDQlNfZ2V0X2FzbjEoY2JzLCAmY2hpbGQsIENCU19BU04xX1NFUVVFTkNFKSB8fAotICAgICAgIUNCU19nZXRfYXNuMV91aW50NjQoJmNoaWxkLCAmdmVyc2lvbikgfHwKLSAgICAgICh2ZXJzaW9uICE9IGtWZXJzaW9uVHdvUHJpbWUgJiYgdmVyc2lvbiAhPSBrVmVyc2lvbk11bHRpKSB8fAotICAgICAgIXBhcnNlX2ludGVnZXIoJmNoaWxkLCAmcmV0LT5uKSB8fAotICAgICAgIXBhcnNlX2ludGVnZXIoJmNoaWxkLCAmcmV0LT5lKSB8fAotICAgICAgIXBhcnNlX2ludGVnZXIoJmNoaWxkLCAmcmV0LT5kKSB8fAotICAgICAgIXBhcnNlX2ludGVnZXIoJmNoaWxkLCAmcmV0LT5wKSB8fAotICAgICAgIXBhcnNlX2ludGVnZXIoJmNoaWxkLCAmcmV0LT5xKSB8fAotICAgICAgIXBhcnNlX2ludGVnZXIoJmNoaWxkLCAmcmV0LT5kbXAxKSB8fAotICAgICAgIXBhcnNlX2ludGVnZXIoJmNoaWxkLCAmcmV0LT5kbXExKSB8fAotICAgICAgIXBhcnNlX2ludGVnZXIoJmNoaWxkLCAmcmV0LT5pcW1wKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQkFEX1ZFUlNJT04pOwotICAgIGdvdG8gZXJyOwotICB9Ci0KLSAgLyogTXVsdGktcHJpbWUgUlNBIHJlcXVpcmVzIGEgbmV3ZXIgdmVyc2lvbi4gKi8KLSAgaWYgKHZlcnNpb24gPT0ga1ZlcnNpb25NdWx0aSAmJgotICAgICAgQ0JTX3BlZWtfYXNuMV90YWcoJmNoaWxkLCBDQlNfQVNOMV9TRVFVRU5DRSkpIHsKLSAgICBDQlMgb3RoZXJfcHJpbWVfaW5mb3M7Ci0gICAgaWYgKCFDQlNfZ2V0X2FzbjEoJmNoaWxkLCAmb3RoZXJfcHJpbWVfaW5mb3MsIENCU19BU04xX1NFUVVFTkNFKSB8fAotICAgICAgICBDQlNfbGVuKCZvdGhlcl9wcmltZV9pbmZvcykgPT0gMCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9CQURfRU5DT0RJTkcpOwotICAgICAgZ290byBlcnI7Ci0gICAgfQotICAgIHJldC0+YWRkaXRpb25hbF9wcmltZXMgPSBza19SU0FfYWRkaXRpb25hbF9wcmltZV9uZXdfbnVsbCgpOwotICAgIGlmIChyZXQtPmFkZGl0aW9uYWxfcHJpbWVzID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwotICAgICAgZ290byBlcnI7Ci0gICAgfQotCi0gICAgY3R4ID0gQk5fQ1RYX25ldygpOwotICAgIHByb2R1Y3Rfb2ZfcHJpbWVzX3NvX2ZhciA9IEJOX25ldygpOwotICAgIGlmIChjdHggPT0gTlVMTCB8fAotICAgICAgICBwcm9kdWN0X29mX3ByaW1lc19zb19mYXIgPT0gTlVMTCB8fAotICAgICAgICAhQk5fbXVsKHByb2R1Y3Rfb2ZfcHJpbWVzX3NvX2ZhciwgcmV0LT5wLCByZXQtPnEsIGN0eCkpIHsKLSAgICAgIGdvdG8gZXJyOwotICAgIH0KLQotICAgIHdoaWxlIChDQlNfbGVuKCZvdGhlcl9wcmltZV9pbmZvcykgPiAwKSB7Ci0gICAgICBSU0FfYWRkaXRpb25hbF9wcmltZSAqYXAgPSByc2FfcGFyc2VfYWRkaXRpb25hbF9wcmltZSgmb3RoZXJfcHJpbWVfaW5mb3MpOwotICAgICAgaWYgKGFwID09IE5VTEwpIHsKLSAgICAgICAgZ290byBlcnI7Ci0gICAgICB9Ci0gICAgICBpZiAoIXNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX3B1c2gocmV0LT5hZGRpdGlvbmFsX3ByaW1lcywgYXApKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwotICAgICAgICBSU0FfYWRkaXRpb25hbF9wcmltZV9mcmVlKGFwKTsKLSAgICAgICAgZ290byBlcnI7Ci0gICAgICB9Ci0gICAgICBhcC0+ciA9IEJOX2R1cChwcm9kdWN0X29mX3ByaW1lc19zb19mYXIpOwotICAgICAgaWYgKGFwLT5yID09IE5VTEwgfHwKLSAgICAgICAgICAhQk5fbXVsKHByb2R1Y3Rfb2ZfcHJpbWVzX3NvX2ZhciwgcHJvZHVjdF9vZl9wcmltZXNfc29fZmFyLAotICAgICAgICAgICAgICAgICAgYXAtPnByaW1lLCBjdHgpKSB7Ci0gICAgICAgIGdvdG8gZXJyOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChDQlNfbGVuKCZjaGlsZCkgIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQkFEX0VOQ09ESU5HKTsKLSAgICBnb3RvIGVycjsKLSAgfQotCi0gIEJOX0NUWF9mcmVlKGN0eCk7Ci0gIEJOX2ZyZWUocHJvZHVjdF9vZl9wcmltZXNfc29fZmFyKTsKLSAgcmV0dXJuIHJldDsKLQotZXJyOgotICBCTl9DVFhfZnJlZShjdHgpOwotICBCTl9mcmVlKHByb2R1Y3Rfb2ZfcHJpbWVzX3NvX2Zhcik7Ci0gIFJTQV9mcmVlKHJldCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1SU0EgKlJTQV9wcml2YXRlX2tleV9mcm9tX2J5dGVzKGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuKSB7Ci0gIENCUyBjYnM7Ci0gIENCU19pbml0KCZjYnMsIGluLCBpbl9sZW4pOwotICBSU0EgKnJldCA9IFJTQV9wYXJzZV9wcml2YXRlX2tleSgmY2JzKTsKLSAgaWYgKHJldCA9PSBOVUxMIHx8IENCU19sZW4oJmNicykgIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQkFEX0VOQ09ESU5HKTsKLSAgICBSU0FfZnJlZShyZXQpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWludCBSU0FfbWFyc2hhbF9wcml2YXRlX2tleShDQkIgKmNiYiwgY29uc3QgUlNBICpyc2EpIHsKLSAgY29uc3QgaW50IGlzX211bHRpcHJpbWUgPQotICAgICAgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfbnVtKHJzYS0+YWRkaXRpb25hbF9wcmltZXMpID4gMDsKLQotICBDQkIgY2hpbGQ7Ci0gIGlmICghQ0JCX2FkZF9hc24xKGNiYiwgJmNoaWxkLCBDQlNfQVNOMV9TRVFVRU5DRSkgfHwKLSAgICAgICFDQkJfYWRkX2FzbjFfdWludDY0KCZjaGlsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX211bHRpcHJpbWUgPyBrVmVyc2lvbk11bHRpIDoga1ZlcnNpb25Ud29QcmltZSkgfHwKLSAgICAgICFtYXJzaGFsX2ludGVnZXIoJmNoaWxkLCByc2EtPm4pIHx8Ci0gICAgICAhbWFyc2hhbF9pbnRlZ2VyKCZjaGlsZCwgcnNhLT5lKSB8fAotICAgICAgIW1hcnNoYWxfaW50ZWdlcigmY2hpbGQsIHJzYS0+ZCkgfHwKLSAgICAgICFtYXJzaGFsX2ludGVnZXIoJmNoaWxkLCByc2EtPnApIHx8Ci0gICAgICAhbWFyc2hhbF9pbnRlZ2VyKCZjaGlsZCwgcnNhLT5xKSB8fAotICAgICAgIW1hcnNoYWxfaW50ZWdlcigmY2hpbGQsIHJzYS0+ZG1wMSkgfHwKLSAgICAgICFtYXJzaGFsX2ludGVnZXIoJmNoaWxkLCByc2EtPmRtcTEpIHx8Ci0gICAgICAhbWFyc2hhbF9pbnRlZ2VyKCZjaGlsZCwgcnNhLT5pcW1wKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfRU5DT0RFX0VSUk9SKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlmIChpc19tdWx0aXByaW1lKSB7Ci0gICAgQ0JCIG90aGVyX3ByaW1lX2luZm9zOwotICAgIGlmICghQ0JCX2FkZF9hc24xKCZjaGlsZCwgJm90aGVyX3ByaW1lX2luZm9zLCBDQlNfQVNOMV9TRVFVRU5DRSkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfRU5DT0RFX0VSUk9SKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBzaXplX3QgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfbnVtKHJzYS0+YWRkaXRpb25hbF9wcmltZXMpOyBpKyspIHsKLSAgICAgIFJTQV9hZGRpdGlvbmFsX3ByaW1lICphcCA9Ci0gICAgICAgICAgICAgIHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX3ZhbHVlKHJzYS0+YWRkaXRpb25hbF9wcmltZXMsIGkpOwotICAgICAgQ0JCIG90aGVyX3ByaW1lX2luZm87Ci0gICAgICBpZiAoIUNCQl9hZGRfYXNuMSgmb3RoZXJfcHJpbWVfaW5mb3MsICZvdGhlcl9wcmltZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0JTX0FTTjFfU0VRVUVOQ0UpIHx8Ci0gICAgICAgICAgIW1hcnNoYWxfaW50ZWdlcigmb3RoZXJfcHJpbWVfaW5mbywgYXAtPnByaW1lKSB8fAotICAgICAgICAgICFtYXJzaGFsX2ludGVnZXIoJm90aGVyX3ByaW1lX2luZm8sIGFwLT5leHApIHx8Ci0gICAgICAgICAgIW1hcnNoYWxfaW50ZWdlcigmb3RoZXJfcHJpbWVfaW5mbywgYXAtPmNvZWZmKSkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0VOQ09ERV9FUlJPUik7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmICghQ0JCX2ZsdXNoKGNiYikpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0VOQ09ERV9FUlJPUik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBSU0FfcHJpdmF0ZV9rZXlfdG9fYnl0ZXModWludDhfdCAqKm91dF9ieXRlcywgc2l6ZV90ICpvdXRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSU0EgKnJzYSkgewotICBDQkIgY2JiOwotICBDQkJfemVybygmY2JiKTsKLSAgaWYgKCFDQkJfaW5pdCgmY2JiLCAwKSB8fAotICAgICAgIVJTQV9tYXJzaGFsX3ByaXZhdGVfa2V5KCZjYmIsIHJzYSkgfHwKLSAgICAgICFDQkJfZmluaXNoKCZjYmIsIG91dF9ieXRlcywgb3V0X2xlbikpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0VOQ09ERV9FUlJPUik7Ci0gICAgQ0JCX2NsZWFudXAoJmNiYik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLVJTQSAqZDJpX1JTQVB1YmxpY0tleShSU0EgKipvdXQsIGNvbnN0IHVpbnQ4X3QgKippbnAsIGxvbmcgbGVuKSB7Ci0gIGlmIChsZW4gPCAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgQ0JTIGNiczsKLSAgQ0JTX2luaXQoJmNicywgKmlucCwgKHNpemVfdClsZW4pOwotICBSU0EgKnJldCA9IFJTQV9wYXJzZV9wdWJsaWNfa2V5KCZjYnMpOwotICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBpZiAob3V0ICE9IE5VTEwpIHsKLSAgICBSU0FfZnJlZSgqb3V0KTsKLSAgICAqb3V0ID0gcmV0OwotICB9Ci0gICppbnAgKz0gKHNpemVfdClsZW4gLSBDQlNfbGVuKCZjYnMpOwotICByZXR1cm4gcmV0OwotfQotCi1pbnQgaTJkX1JTQVB1YmxpY0tleShjb25zdCBSU0EgKmluLCB1aW50OF90ICoqb3V0cCkgewotICB1aW50OF90ICpkZXI7Ci0gIHNpemVfdCBkZXJfbGVuOwotICBpZiAoIVJTQV9wdWJsaWNfa2V5X3RvX2J5dGVzKCZkZXIsICZkZXJfbGVuLCBpbikpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKGRlcl9sZW4gPiBJTlRfTUFYKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9PVkVSRkxPVyk7Ci0gICAgT1BFTlNTTF9mcmVlKGRlcik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChvdXRwICE9IE5VTEwpIHsKLSAgICBpZiAoKm91dHAgPT0gTlVMTCkgewotICAgICAgKm91dHAgPSBkZXI7Ci0gICAgICBkZXIgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICBtZW1jcHkoKm91dHAsIGRlciwgZGVyX2xlbik7Ci0gICAgICAqb3V0cCArPSBkZXJfbGVuOwotICAgIH0KLSAgfQotICBPUEVOU1NMX2ZyZWUoZGVyKTsKLSAgcmV0dXJuIChpbnQpZGVyX2xlbjsKLX0KLQotUlNBICpkMmlfUlNBUHJpdmF0ZUtleShSU0EgKipvdXQsIGNvbnN0IHVpbnQ4X3QgKippbnAsIGxvbmcgbGVuKSB7Ci0gIGlmIChsZW4gPCAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgQ0JTIGNiczsKLSAgQ0JTX2luaXQoJmNicywgKmlucCwgKHNpemVfdClsZW4pOwotICBSU0EgKnJldCA9IFJTQV9wYXJzZV9wcml2YXRlX2tleSgmY2JzKTsKLSAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgaWYgKG91dCAhPSBOVUxMKSB7Ci0gICAgUlNBX2ZyZWUoKm91dCk7Ci0gICAgKm91dCA9IHJldDsKLSAgfQotICAqaW5wICs9IChzaXplX3QpbGVuIC0gQ0JTX2xlbigmY2JzKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotaW50IGkyZF9SU0FQcml2YXRlS2V5KGNvbnN0IFJTQSAqaW4sIHVpbnQ4X3QgKipvdXRwKSB7Ci0gIHVpbnQ4X3QgKmRlcjsKLSAgc2l6ZV90IGRlcl9sZW47Ci0gIGlmICghUlNBX3ByaXZhdGVfa2V5X3RvX2J5dGVzKCZkZXIsICZkZXJfbGVuLCBpbikpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKGRlcl9sZW4gPiBJTlRfTUFYKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9PVkVSRkxPVyk7Ci0gICAgT1BFTlNTTF9mcmVlKGRlcik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChvdXRwICE9IE5VTEwpIHsKLSAgICBpZiAoKm91dHAgPT0gTlVMTCkgewotICAgICAgKm91dHAgPSBkZXI7Ci0gICAgICBkZXIgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICBtZW1jcHkoKm91dHAsIGRlciwgZGVyX2xlbik7Ci0gICAgICAqb3V0cCArPSBkZXJfbGVuOwotICAgIH0KLSAgfQotICBPUEVOU1NMX2ZyZWUoZGVyKTsKLSAgcmV0dXJuIChpbnQpZGVyX2xlbjsKLX0KK0FTTjFfU0VRVUVOQ0VfY2IoUlNBUHVibGljS2V5LCByc2FfY2IpID0geworICAgIEFTTjFfU0lNUExFKFJTQSwgbiwgQklHTlVNKSwKKyAgICBBU04xX1NJTVBMRShSU0EsIGUsIEJJR05VTSksCit9IEFTTjFfU0VRVUVOQ0VfRU5EX2NiKFJTQSwgUlNBUHVibGljS2V5KTsKIAogQVNOMV9TRVFVRU5DRShSU0FfUFNTX1BBUkFNUykgPSB7CiAgIEFTTjFfRVhQX09QVChSU0FfUFNTX1BBUkFNUywgaGFzaEFsZ29yaXRobSwgWDUwOV9BTEdPUiwwKSwKQEAgLTQ0MywyNCArMTA0LDIyIEBACiAKIElNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhSU0FfUFNTX1BBUkFNUyk7CiAKK0FTTjFfU0VRVUVOQ0UoUlNBX09BRVBfUEFSQU1TKSA9IHsKKyAgQVNOMV9FWFBfT1BUKFJTQV9PQUVQX1BBUkFNUywgaGFzaEZ1bmMsIFg1MDlfQUxHT1IsIDApLAorICBBU04xX0VYUF9PUFQoUlNBX09BRVBfUEFSQU1TLCBtYXNrR2VuRnVuYywgWDUwOV9BTEdPUiwgMSksCisgIEFTTjFfRVhQX09QVChSU0FfT0FFUF9QQVJBTVMsIHBTb3VyY2VGdW5jLCBYNTA5X0FMR09SLCAyKSwKK30gQVNOMV9TRVFVRU5DRV9FTkQoUlNBX09BRVBfUEFSQU1TKTsKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKFJTQV9PQUVQX1BBUkFNUyk7CisKK0lNUExFTUVOVF9BU04xX0VOQ09ERV9GVU5DVElPTlNfY29uc3RfZm5hbWUoUlNBLCBSU0FQcml2YXRlS2V5LCBSU0FQcml2YXRlS2V5KTsKKworSU1QTEVNRU5UX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdF9mbmFtZShSU0EsIFJTQVB1YmxpY0tleSwgUlNBUHVibGljS2V5KTsKKwogUlNBICpSU0FQdWJsaWNLZXlfZHVwKGNvbnN0IFJTQSAqcnNhKSB7Ci0gIHVpbnQ4X3QgKmRlcjsKLSAgc2l6ZV90IGRlcl9sZW47Ci0gIGlmICghUlNBX3B1YmxpY19rZXlfdG9fYnl0ZXMoJmRlciwgJmRlcl9sZW4sIHJzYSkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBSU0EgKnJldCA9IFJTQV9wdWJsaWNfa2V5X2Zyb21fYnl0ZXMoZGVyLCBkZXJfbGVuKTsKLSAgT1BFTlNTTF9mcmVlKGRlcik7Ci0gIHJldHVybiByZXQ7CisgIHJldHVybiBBU04xX2l0ZW1fZHVwKEFTTjFfSVRFTV9ycHRyKFJTQVB1YmxpY0tleSksIChSU0EgKikgcnNhKTsKIH0KIAogUlNBICpSU0FQcml2YXRlS2V5X2R1cChjb25zdCBSU0EgKnJzYSkgewotICB1aW50OF90ICpkZXI7Ci0gIHNpemVfdCBkZXJfbGVuOwotICBpZiAoIVJTQV9wcml2YXRlX2tleV90b19ieXRlcygmZGVyLCAmZGVyX2xlbiwgcnNhKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIFJTQSAqcmV0ID0gUlNBX3ByaXZhdGVfa2V5X2Zyb21fYnl0ZXMoZGVyLCBkZXJfbGVuKTsKLSAgT1BFTlNTTF9mcmVlKGRlcik7Ci0gIHJldHVybiByZXQ7CisgIHJldHVybiBBU04xX2l0ZW1fZHVwKEFTTjFfSVRFTV9ycHRyKFJTQVByaXZhdGVLZXkpLCAoUlNBICopIHJzYSk7CiB9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3JzYS9yc2FfaW1wbC5jIGIvc3JjL2NyeXB0by9yc2EvcnNhX2ltcGwuYwppbmRleCBlYjRhMzZmLi5lMTRmMGY1IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3JzYS9yc2FfaW1wbC5jCisrKyBiL3NyYy9jcnlwdG8vcnNhL3JzYV9pbXBsLmMKQEAgLTc4LDE1ICs3OCw2IEBACiAgIEJOX01PTlRfQ1RYX2ZyZWUocnNhLT5fbWV0aG9kX21vZF9wKTsKICAgQk5fTU9OVF9DVFhfZnJlZShyc2EtPl9tZXRob2RfbW9kX3EpOwogCi0gIGlmIChyc2EtPmFkZGl0aW9uYWxfcHJpbWVzICE9IE5VTEwpIHsKLSAgICBzaXplX3QgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfbnVtKHJzYS0+YWRkaXRpb25hbF9wcmltZXMpOyBpKyspIHsKLSAgICAgIFJTQV9hZGRpdGlvbmFsX3ByaW1lICphcCA9Ci0gICAgICAgICAgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfdmFsdWUocnNhLT5hZGRpdGlvbmFsX3ByaW1lcywgaSk7Ci0gICAgICBCTl9NT05UX0NUWF9mcmVlKGFwLT5tZXRob2RfbW9kKTsKLSAgICB9Ci0gIH0KLQogICByZXR1cm4gMTsKIH0KIApAQCAtMTAzLDI0ICs5NCwyNCBAQAogICBpbnQgaSwgcmV0ID0gMDsKIAogICBpZiAocnNhX3NpemUgPiBPUEVOU1NMX1JTQV9NQVhfTU9EVUxVU19CSVRTKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9NT0RVTFVTX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBlbmNyeXB0LCBSU0FfUl9NT0RVTFVTX1RPT19MQVJHRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAobWF4X291dCA8IHJzYV9zaXplKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9PVVRQVVRfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBlbmNyeXB0LCBSU0FfUl9PVVRQVVRfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoQk5fdWNtcChyc2EtPm4sIHJzYS0+ZSkgPD0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQkFEX0VfVkFMVUUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgZW5jcnlwdCwgUlNBX1JfQkFEX0VfVkFMVUUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgLyogZm9yIGxhcmdlIG1vZHVsaSwgZW5mb3JjZSBleHBvbmVudCBsaW1pdCAqLwogICBpZiAoQk5fbnVtX2JpdHMocnNhLT5uKSA+IE9QRU5TU0xfUlNBX1NNQUxMX01PRFVMVVNfQklUUyAmJgogICAgICAgQk5fbnVtX2JpdHMocnNhLT5lKSA+IE9QRU5TU0xfUlNBX01BWF9QVUJFWFBfQklUUykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQkFEX0VfVkFMVUUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgZW5jcnlwdCwgUlNBX1JfQkFEX0VfVkFMVUUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTEzNCw3ICsxMjUsNyBAQAogICByZXN1bHQgPSBCTl9DVFhfZ2V0KGN0eCk7CiAgIGJ1ZiA9IE9QRU5TU0xfbWFsbG9jKHJzYV9zaXplKTsKICAgaWYgKCFmIHx8ICFyZXN1bHQgfHwgIWJ1ZikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgZW5jcnlwdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTE1MSw3ICsxNDIsNyBAQAogICAgICAgaSA9IFJTQV9wYWRkaW5nX2FkZF9ub25lKGJ1ZiwgcnNhX3NpemUsIGluLCBpbl9sZW4pOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfVU5LTk9XTl9QQURESU5HX1RZUEUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBlbmNyeXB0LCBSU0FfUl9VTktOT1dOX1BBRERJTkdfVFlQRSk7CiAgICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0xNjUsNyArMTU2LDcgQEAKIAogICBpZiAoQk5fdWNtcChmLCByc2EtPm4pID49IDApIHsKICAgICAvKiB1c3VhbGx5IHRoZSBwYWRkaW5nIGZ1bmN0aW9ucyB3b3VsZCBjYXRjaCB0aGlzICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfTU9EVUxVUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBlbmNyeXB0LCBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfTU9EVUxVUyk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMTg0LDcgKzE3NSw3IEBACiAgIC8qIHB1dCBpbiBsZWFkaW5nIDAgYnl0ZXMgaWYgdGhlIG51bWJlciBpcyBsZXNzIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUKICAgICogbW9kdWx1cyAqLwogICBpZiAoIUJOX2JuMmJpbl9wYWRkZWQob3V0LCByc2Ffc2l6ZSwgcmVzdWx0KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgZW5jcnlwdCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTMxOCwxMyArMzA5LDEzIEBACiAgIGludCBpLCByZXQgPSAwOwogCiAgIGlmIChtYXhfb3V0IDwgcnNhX3NpemUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIHNpZ25fcmF3LCBSU0FfUl9PVVRQVVRfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBidWYgPSBPUEVOU1NMX21hbGxvYyhyc2Ffc2l6ZSk7CiAgIGlmIChidWYgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgc2lnbl9yYXcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0zMzYsNyArMzI3LDcgQEAKICAgICAgIGkgPSBSU0FfcGFkZGluZ19hZGRfbm9uZShidWYsIHJzYV9zaXplLCBpbiwgaW5fbGVuKTsKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX1VOS05PV05fUEFERElOR19UWVBFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgc2lnbl9yYXcsIFJTQV9SX1VOS05PV05fUEFERElOR19UWVBFKTsKICAgICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTM2OCwyMyArMzU5LDE4IEBACiAgIGludCByZXQgPSAwOwogCiAgIGlmIChtYXhfb3V0IDwgcnNhX3NpemUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIGRlY3J5cHQsIFJTQV9SX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gMDsKICAgfQogCi0gIGlmIChwYWRkaW5nID09IFJTQV9OT19QQURESU5HKSB7Ci0gICAgYnVmID0gb3V0OwotICB9IGVsc2UgewotICAgIC8qIEFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlciB0byBob2xkIHRoZSBwYWRkZWQgcGxhaW50ZXh0LiAqLwotICAgIGJ1ZiA9IE9QRU5TU0xfbWFsbG9jKHJzYV9zaXplKTsKLSAgICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwotICAgICAgZ290byBlcnI7Ci0gICAgfQorICBidWYgPSBPUEVOU1NMX21hbGxvYyhyc2Ffc2l6ZSk7CisgIGlmIChidWYgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgZGVjcnlwdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKGluX2xlbiAhPSByc2Ffc2l6ZSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfREFUQV9MRU5fTk9UX0VRVUFMX1RPX01PRF9MRU4pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgZGVjcnlwdCwgUlNBX1JfREFUQV9MRU5fTk9UX0VRVUFMX1RPX01PRF9MRU4pOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTQwMiwyMiArMzg4LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIE5VTEwsIE5VTEwpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBSU0FfTk9fUEFERElORzoKLSAgICAgIHIgPSByc2Ffc2l6ZTsKKyAgICAgIHIgPSBSU0FfcGFkZGluZ19jaGVja19ub25lKG91dCwgcnNhX3NpemUsIGJ1ZiwgcnNhX3NpemUpOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfVU5LTk9XTl9QQURESU5HX1RZUEUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBkZWNyeXB0LCBSU0FfUl9VTktOT1dOX1BBRERJTkdfVFlQRSk7CiAgICAgICBnb3RvIGVycjsKICAgfQogCiAgIGlmIChyIDwgMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfUEFERElOR19DSEVDS19GQUlMRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgZGVjcnlwdCwgUlNBX1JfUEFERElOR19DSEVDS19GQUlMRUQpOwogICB9IGVsc2UgewogICAgICpvdXRfbGVuID0gcjsKICAgICByZXQgPSAxOwogICB9CiAKIGVycjoKLSAgaWYgKHBhZGRpbmcgIT0gUlNBX05PX1BBRERJTkcgJiYgYnVmICE9IE5VTEwpIHsKKyAgaWYgKGJ1ZiAhPSBOVUxMKSB7CiAgICAgT1BFTlNTTF9jbGVhbnNlKGJ1ZiwgcnNhX3NpemUpOwogICAgIE9QRU5TU0xfZnJlZShidWYpOwogICB9CkBAIC00MzUsMjQgKzQyMSwyNCBAQAogICBCTl9DVFggKmN0eCA9IE5VTEw7CiAKICAgaWYgKEJOX251bV9iaXRzKHJzYS0+bikgPiBPUEVOU1NMX1JTQV9NQVhfTU9EVUxVU19CSVRTKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9NT0RVTFVTX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCB2ZXJpZnlfcmF3LCBSU0FfUl9NT0RVTFVTX1RPT19MQVJHRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoQk5fdWNtcChyc2EtPm4sIHJzYS0+ZSkgPD0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQkFEX0VfVkFMVUUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgdmVyaWZ5X3JhdywgUlNBX1JfQkFEX0VfVkFMVUUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKG1heF9vdXQgPCByc2Ffc2l6ZSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfT1VUUFVUX0JVRkZFUl9UT09fU01BTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgdmVyaWZ5X3JhdywgUlNBX1JfT1VUUFVUX0JVRkZFUl9UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgLyogZm9yIGxhcmdlIG1vZHVsaSwgZW5mb3JjZSBleHBvbmVudCBsaW1pdCAqLwogICBpZiAoQk5fbnVtX2JpdHMocnNhLT5uKSA+IE9QRU5TU0xfUlNBX1NNQUxMX01PRFVMVVNfQklUUyAmJgogICAgICAgQk5fbnVtX2JpdHMocnNhLT5lKSA+IE9QRU5TU0xfUlNBX01BWF9QVUJFWFBfQklUUykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQkFEX0VfVkFMVUUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgdmVyaWZ5X3JhdywgUlNBX1JfQkFEX0VfVkFMVUUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTQ2NCwyMyArNDUwLDE0IEBACiAgIEJOX0NUWF9zdGFydChjdHgpOwogICBmID0gQk5fQ1RYX2dldChjdHgpOwogICByZXN1bHQgPSBCTl9DVFhfZ2V0KGN0eCk7Ci0gIGlmIChwYWRkaW5nID09IFJTQV9OT19QQURESU5HKSB7Ci0gICAgYnVmID0gb3V0OwotICB9IGVsc2UgewotICAgIC8qIEFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlciB0byBob2xkIHRoZSBwYWRkZWQgcGxhaW50ZXh0LiAqLwotICAgIGJ1ZiA9IE9QRU5TU0xfbWFsbG9jKHJzYV9zaXplKTsKLSAgICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwotICAgICAgZ290byBlcnI7Ci0gICAgfQotICB9Ci0gIGlmICghZiB8fCAhcmVzdWx0KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgIGJ1ZiA9IE9QRU5TU0xfbWFsbG9jKHJzYV9zaXplKTsKKyAgaWYgKCFmIHx8ICFyZXN1bHQgfHwgIWJ1ZikgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgdmVyaWZ5X3JhdywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKGluX2xlbiAhPSByc2Ffc2l6ZSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfREFUQV9MRU5fTk9UX0VRVUFMX1RPX01PRF9MRU4pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgdmVyaWZ5X3JhdywgUlNBX1JfREFUQV9MRU5fTk9UX0VRVUFMX1RPX01PRF9MRU4pOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTQ4OSw3ICs0NjYsNyBAQAogICB9CiAKICAgaWYgKEJOX3VjbXAoZiwgcnNhLT5uKSA+PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfTU9EVUxVUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCB2ZXJpZnlfcmF3LCBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfTU9EVUxVUyk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNTA2LDcgKzQ4Myw3IEBACiAgIH0KIAogICBpZiAoIUJOX2JuMmJpbl9wYWRkZWQoYnVmLCByc2Ffc2l6ZSwgcmVzdWx0KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgdmVyaWZ5X3JhdywgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTUxNSwxNSArNDkyLDE1IEBACiAgICAgICByID0gUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8xKG91dCwgcnNhX3NpemUsIGJ1ZiwgcnNhX3NpemUpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBSU0FfTk9fUEFERElORzoKLSAgICAgIHIgPSByc2Ffc2l6ZTsKKyAgICAgIHIgPSBSU0FfcGFkZGluZ19jaGVja19ub25lKG91dCwgcnNhX3NpemUsIGJ1ZiwgcnNhX3NpemUpOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfVU5LTk9XTl9QQURESU5HX1RZUEUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCB2ZXJpZnlfcmF3LCBSU0FfUl9VTktOT1dOX1BBRERJTkdfVFlQRSk7CiAgICAgICBnb3RvIGVycjsKICAgfQogCiAgIGlmIChyIDwgMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfUEFERElOR19DSEVDS19GQUlMRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgdmVyaWZ5X3JhdywgUlNBX1JfUEFERElOR19DSEVDS19GQUlMRUQpOwogICB9IGVsc2UgewogICAgICpvdXRfbGVuID0gcjsKICAgICByZXQgPSAxOwpAQCAtNTM0LDcgKzUxMSw3IEBACiAgICAgQk5fQ1RYX2VuZChjdHgpOwogICAgIEJOX0NUWF9mcmVlKGN0eCk7CiAgIH0KLSAgaWYgKHBhZGRpbmcgIT0gUlNBX05PX1BBRERJTkcgJiYgYnVmICE9IE5VTEwpIHsKKyAgaWYgKGJ1ZiAhPSBOVUxMKSB7CiAgICAgT1BFTlNTTF9jbGVhbnNlKGJ1ZiwgcnNhX3NpemUpOwogICAgIE9QRU5TU0xfZnJlZShidWYpOwogICB9CkBAIC01NTgsNyArNTM1LDcgQEAKICAgcmVzdWx0ID0gQk5fQ1RYX2dldChjdHgpOwogCiAgIGlmIChmID09IE5VTEwgfHwgcmVzdWx0ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIHByaXZhdGVfdHJhbnNmb3JtLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNTY4LDE0ICs1NDUsMTQgQEAKIAogICBpZiAoQk5fdWNtcChmLCByc2EtPm4pID49IDApIHsKICAgICAvKiBVc3VhbGx5IHRoZSBwYWRkaW5nIGZ1bmN0aW9ucyB3b3VsZCBjYXRjaCB0aGlzLiAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfREFUQV9UT09fTEFSR0VfRk9SX01PRFVMVVMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgcHJpdmF0ZV90cmFuc2Zvcm0sIFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9NT0RVTFVTKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIGlmICghKHJzYS0+ZmxhZ3MgJiBSU0FfRkxBR19OT19CTElORElORykpIHsKICAgICBibGluZGluZyA9IHJzYV9ibGluZGluZ19nZXQocnNhLCAmYmxpbmRpbmdfaW5kZXgsIGN0eCk7CiAgICAgaWYgKGJsaW5kaW5nID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBwcml2YXRlX3RyYW5zZm9ybSwgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIGlmICghQk5fQkxJTkRJTkdfY29udmVydF9leChmLCBOVUxMLCBibGluZGluZywgY3R4KSkgewpAQCAtNjE2LDcgKzU5Myw3IEBACiAgIH0KIAogICBpZiAoIUJOX2JuMmJpbl9wYWRkZWQob3V0LCBsZW4sIHJlc3VsdCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIHByaXZhdGVfdHJhbnNmb3JtLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNjM5LDExICs2MTYsNiBAQAogICBCSUdOVU0gbG9jYWxfZG1wMSwgbG9jYWxfZG1xMSwgbG9jYWxfYywgbG9jYWxfcjE7CiAgIEJJR05VTSAqZG1wMSwgKmRtcTEsICpjLCAqcHIxOwogICBpbnQgcmV0ID0gMDsKLSAgc2l6ZV90IGksIG51bV9hZGRpdGlvbmFsX3ByaW1lcyA9IDA7Ci0KLSAgaWYgKHJzYS0+YWRkaXRpb25hbF9wcmltZXMgIT0gTlVMTCkgewotICAgIG51bV9hZGRpdGlvbmFsX3ByaW1lcyA9IHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX251bShyc2EtPmFkZGl0aW9uYWxfcHJpbWVzKTsKLSAgfQogCiAgIEJOX0NUWF9zdGFydChjdHgpOwogICByMSA9IEJOX0NUWF9nZXQoY3R4KTsKQEAgLTc1Miw0MiArNzI0LDYgQEAKICAgICBnb3RvIGVycjsKICAgfQogCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fYWRkaXRpb25hbF9wcmltZXM7IGkrKykgewotICAgIC8qIG11bHRpLXByaW1lIFJTQS4gKi8KLSAgICBCSUdOVU0gbG9jYWxfZXhwLCBsb2NhbF9wcmltZTsKLSAgICBCSUdOVU0gKmV4cCA9ICZsb2NhbF9leHAsICpwcmltZSA9ICZsb2NhbF9wcmltZTsKLSAgICBSU0FfYWRkaXRpb25hbF9wcmltZSAqYXAgPQotICAgICAgICBza19SU0FfYWRkaXRpb25hbF9wcmltZV92YWx1ZShyc2EtPmFkZGl0aW9uYWxfcHJpbWVzLCBpKTsKLQotICAgIEJOX3dpdGhfZmxhZ3MoZXhwLCBhcC0+ZXhwLCBCTl9GTEdfQ09OU1RUSU1FKTsKLSAgICBCTl93aXRoX2ZsYWdzKHByaW1lLCBhcC0+cHJpbWUsIEJOX0ZMR19DT05TVFRJTUUpOwotCi0gICAgLyogYyB3aWxsIGFscmVhZHkgcG9pbnQgdG8gYSBCSUdOVU0gd2l0aCB0aGUgY29ycmVjdCBmbGFncy4gKi8KLSAgICBpZiAoIUJOX21vZChyMSwgYywgcHJpbWUsIGN0eCkpIHsKLSAgICAgIGdvdG8gZXJyOwotICAgIH0KLQotICAgIGlmICgocnNhLT5mbGFncyAmIFJTQV9GTEFHX0NBQ0hFX1BSSVZBVEUpICYmCi0gICAgICAgICFCTl9NT05UX0NUWF9zZXRfbG9ja2VkKCZhcC0+bWV0aG9kX21vZCwgJnJzYS0+bG9jaywgcHJpbWUsIGN0eCkpIHsKLSAgICAgIGdvdG8gZXJyOwotICAgIH0KLQotICAgIGlmICghcnNhLT5tZXRoLT5ibl9tb2RfZXhwKG0xLCByMSwgZXhwLCBwcmltZSwgY3R4LCBhcC0+bWV0aG9kX21vZCkpIHsKLSAgICAgIGdvdG8gZXJyOwotICAgIH0KLQotICAgIEJOX3NldF9mbGFncyhtMSwgQk5fRkxHX0NPTlNUVElNRSk7Ci0KLSAgICBpZiAoIUJOX3N1YihtMSwgbTEsIHIwKSB8fAotICAgICAgICAhQk5fbXVsKG0xLCBtMSwgYXAtPmNvZWZmLCBjdHgpIHx8Ci0gICAgICAgICFCTl9tb2QobTEsIG0xLCBwcmltZSwgY3R4KSB8fAotICAgICAgICAoQk5faXNfbmVnYXRpdmUobTEpICYmICFCTl9hZGQobTEsIG0xLCBwcmltZSkpIHx8Ci0gICAgICAgICFCTl9tdWwobTEsIG0xLCBhcC0+ciwgY3R4KSB8fAotICAgICAgICAhQk5fYWRkKHIwLCByMCwgbTEpKSB7Ci0gICAgICBnb3RvIGVycjsKLSAgICB9Ci0gIH0KLQogICBpZiAocnNhLT5lICYmIHJzYS0+bikgewogICAgIGlmICghcnNhLT5tZXRoLT5ibl9tb2RfZXhwKHZyZnksIHIwLCByc2EtPmUsIHJzYS0+biwgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzYS0+X21ldGhvZF9tb2RfbikpIHsKQEAgLTgzMCwyMCArNzY2LDEyIEBACiAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQga2V5Z2VuX211bHRpcHJpbWUoUlNBICpyc2EsIGludCBiaXRzLCBpbnQgbnVtX3ByaW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklHTlVNICplX3ZhbHVlLCBCTl9HRU5DQiAqY2IpIHsKK3N0YXRpYyBpbnQga2V5Z2VuKFJTQSAqcnNhLCBpbnQgYml0cywgQklHTlVNICplX3ZhbHVlLCBCTl9HRU5DQiAqY2IpIHsKICAgQklHTlVNICpyMCA9IE5VTEwsICpyMSA9IE5VTEwsICpyMiA9IE5VTEwsICpyMyA9IE5VTEwsICp0bXA7CiAgIEJJR05VTSBsb2NhbF9yMCwgbG9jYWxfZCwgbG9jYWxfcDsKICAgQklHTlVNICpwcjAsICpkLCAqcDsKLSAgaW50IHByaW1lX2JpdHMsIG9rID0gLTEsIG4gPSAwLCBpLCBqOworICBpbnQgYml0c3AsIGJpdHNxLCBvayA9IC0xLCBuID0gMDsKICAgQk5fQ1RYICpjdHggPSBOVUxMOwotICBTVEFDS19PRihSU0FfYWRkaXRpb25hbF9wcmltZSkgKmFkZGl0aW9uYWxfcHJpbWVzID0gTlVMTDsKLQotICBpZiAobnVtX3ByaW1lcyA8IDIpIHsKLSAgICBvayA9IDA7IC8qIHdlIHNldCBvdXIgb3duIGVyciAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfTVVTVF9IQVZFX0FUX0xFQVNUX1RXT19QUklNRVMpOwotICAgIGdvdG8gZXJyOwotICB9CiAKICAgY3R4ID0gQk5fQ1RYX25ldygpOwogICBpZiAoY3R4ID09IE5VTEwpIHsKQEAgLTg1NCwzNiArNzgyLDEyIEBACiAgIHIxID0gQk5fQ1RYX2dldChjdHgpOwogICByMiA9IEJOX0NUWF9nZXQoY3R4KTsKICAgcjMgPSBCTl9DVFhfZ2V0KGN0eCk7Ci0gIGlmIChyMCA9PSBOVUxMIHx8IHIxID09IE5VTEwgfHwgcjIgPT0gTlVMTCB8fCByMyA9PSBOVUxMKSB7CisgIGlmIChyMyA9PSBOVUxMKSB7CiAgICAgZ290byBlcnI7CiAgIH0KIAotICBpZiAobnVtX3ByaW1lcyA+IDIpIHsKLSAgICBhZGRpdGlvbmFsX3ByaW1lcyA9IHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX25ld19udWxsKCk7Ci0gICAgaWYgKGFkZGl0aW9uYWxfcHJpbWVzID09IE5VTEwpIHsKLSAgICAgIGdvdG8gZXJyOwotICAgIH0KLSAgfQotCi0gIGZvciAoaSA9IDI7IGkgPCBudW1fcHJpbWVzOyBpKyspIHsKLSAgICBSU0FfYWRkaXRpb25hbF9wcmltZSAqYXAgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoUlNBX2FkZGl0aW9uYWxfcHJpbWUpKTsKLSAgICBpZiAoYXAgPT0gTlVMTCkgewotICAgICAgZ290byBlcnI7Ci0gICAgfQotICAgIG1lbXNldChhcCwgMCwgc2l6ZW9mKFJTQV9hZGRpdGlvbmFsX3ByaW1lKSk7Ci0gICAgYXAtPnByaW1lID0gQk5fbmV3KCk7Ci0gICAgYXAtPmV4cCA9IEJOX25ldygpOwotICAgIGFwLT5jb2VmZiA9IEJOX25ldygpOwotICAgIGFwLT5yID0gQk5fbmV3KCk7Ci0gICAgaWYgKGFwLT5wcmltZSA9PSBOVUxMIHx8Ci0gICAgICAgIGFwLT5leHAgPT0gTlVMTCB8fAotICAgICAgICBhcC0+Y29lZmYgPT0gTlVMTCB8fAotICAgICAgICBhcC0+ciA9PSBOVUxMIHx8Ci0gICAgICAgICFza19SU0FfYWRkaXRpb25hbF9wcmltZV9wdXNoKGFkZGl0aW9uYWxfcHJpbWVzLCBhcCkpIHsKLSAgICAgIFJTQV9hZGRpdGlvbmFsX3ByaW1lX2ZyZWUoYXApOwotICAgICAgZ290byBlcnI7Ci0gICAgfQotICB9CisgIGJpdHNwID0gKGJpdHMgKyAxKSAvIDI7CisgIGJpdHNxID0gYml0cyAtIGJpdHNwOwogCiAgIC8qIFdlIG5lZWQgdGhlIFJTQSBjb21wb25lbnRzIG5vbi1OVUxMICovCiAgIGlmICghcnNhLT5uICYmICgocnNhLT5uID0gQk5fbmV3KCkpID09IE5VTEwpKSB7CkBAIC05MTEsMTQgKzgxNSwxMSBAQAogICAgIGdvdG8gZXJyOwogICB9CiAKLSAgaWYgKCFCTl9jb3B5KHJzYS0+ZSwgZV92YWx1ZSkpIHsKLSAgICBnb3RvIGVycjsKLSAgfQorICBCTl9jb3B5KHJzYS0+ZSwgZV92YWx1ZSk7CiAKICAgLyogZ2VuZXJhdGUgcCBhbmQgcSAqLwotICBwcmltZV9iaXRzID0gKGJpdHMgKyAobnVtX3ByaW1lcyAtIDEpKSAvIG51bV9wcmltZXM7CiAgIGZvciAoOzspIHsKLSAgICBpZiAoIUJOX2dlbmVyYXRlX3ByaW1lX2V4KHJzYS0+cCwgcHJpbWVfYml0cywgMCwgTlVMTCwgTlVMTCwgY2IpIHx8CisgICAgaWYgKCFCTl9nZW5lcmF0ZV9wcmltZV9leChyc2EtPnAsIGJpdHNwLCAwLCBOVUxMLCBOVUxMLCBjYikgfHwKICAgICAgICAgIUJOX3N1YihyMiwgcnNhLT5wLCBCTl92YWx1ZV9vbmUoKSkgfHwKICAgICAgICAgIUJOX2djZChyMSwgcjIsIHJzYS0+ZSwgY3R4KSkgewogICAgICAgZ290byBlcnI7CkBAIC05MzMsMjAgKzgzNCwxOSBAQAogICBpZiAoIUJOX0dFTkNCX2NhbGwoY2IsIDMsIDApKSB7CiAgICAgZ290byBlcnI7CiAgIH0KLSAgcHJpbWVfYml0cyA9ICgoYml0cyAtIHByaW1lX2JpdHMpICsgKG51bV9wcmltZXMgLSAyKSkgLyAobnVtX3ByaW1lcyAtIDEpOwogICBmb3IgKDs7KSB7CiAgICAgLyogV2hlbiBnZW5lcmF0aW5nIHJpZGljdWxvdXNseSBzbWFsbCBrZXlzLCB3ZSBjYW4gZ2V0IHN0dWNrCiAgICAgICogY29udGludWFsbHkgcmVnZW5lcmF0aW5nIHRoZSBzYW1lIHByaW1lIHZhbHVlcy4gQ2hlY2sgZm9yCiAgICAgICogdGhpcyBhbmQgYmFpbCBpZiBpdCBoYXBwZW5zIDMgdGltZXMuICovCiAgICAgdW5zaWduZWQgaW50IGRlZ2VuZXJhdGUgPSAwOwogICAgIGRvIHsKLSAgICAgIGlmICghQk5fZ2VuZXJhdGVfcHJpbWVfZXgocnNhLT5xLCBwcmltZV9iaXRzLCAwLCBOVUxMLCBOVUxMLCBjYikpIHsKKyAgICAgIGlmICghQk5fZ2VuZXJhdGVfcHJpbWVfZXgocnNhLT5xLCBiaXRzcSwgMCwgTlVMTCwgTlVMTCwgY2IpKSB7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogICAgIH0gd2hpbGUgKChCTl9jbXAocnNhLT5wLCByc2EtPnEpID09IDApICYmICgrK2RlZ2VuZXJhdGUgPCAzKSk7CiAgICAgaWYgKGRlZ2VuZXJhdGUgPT0gMykgewogICAgICAgb2sgPSAwOyAvKiB3ZSBzZXQgb3VyIG93biBlcnIgKi8KLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfS0VZX1NJWkVfVE9PX1NNQUxMKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwga2V5Z2VuLCBSU0FfUl9LRVlfU0laRV9UT09fU01BTEwpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIGlmICghQk5fc3ViKHIyLCByc2EtPnEsIEJOX3ZhbHVlX29uZSgpKSB8fApAQCAtOTYwLDkxICs4NjAsMjAgQEAKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfQotCi0gIGlmICghQk5fR0VOQ0JfY2FsbChjYiwgMywgMSkgfHwKLSAgICAgICFCTl9tdWwocnNhLT5uLCByc2EtPnAsIHJzYS0+cSwgY3R4KSkgeworICBpZiAoIUJOX0dFTkNCX2NhbGwoY2IsIDMsIDEpKSB7CiAgICAgZ290byBlcnI7CiAgIH0KLQotICBmb3IgKGkgPSAyOyBpIDwgbnVtX3ByaW1lczsgaSsrKSB7Ci0gICAgUlNBX2FkZGl0aW9uYWxfcHJpbWUgKmFwID0KLSAgICAgICAgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfdmFsdWUoYWRkaXRpb25hbF9wcmltZXMsIGkgLSAyKTsKLSAgICBwcmltZV9iaXRzID0gKChiaXRzIC0gQk5fbnVtX2JpdHMocnNhLT5uKSkgKyAobnVtX3ByaW1lcyAtIChpICsgMSkpKSAvCi0gICAgICAgICAgICAgICAgIChudW1fcHJpbWVzIC0gaSk7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICBpZiAoIUJOX2dlbmVyYXRlX3ByaW1lX2V4KGFwLT5wcmltZSwgcHJpbWVfYml0cywgMCwgTlVMTCwgTlVMTCwgY2IpKSB7Ci0gICAgICAgIGdvdG8gZXJyOwotICAgICAgfQotICAgICAgaWYgKEJOX2NtcChyc2EtPnAsIGFwLT5wcmltZSkgPT0gMCB8fAotICAgICAgICAgIEJOX2NtcChyc2EtPnEsIGFwLT5wcmltZSkgPT0gMCkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgZm9yIChqID0gMDsgaiA8IGkgLSAyOyBqKyspIHsKLSAgICAgICAgaWYgKEJOX2NtcChza19SU0FfYWRkaXRpb25hbF9wcmltZV92YWx1ZShhZGRpdGlvbmFsX3ByaW1lcywgaiktPnByaW1lLAotICAgICAgICAgICAgICAgICAgIGFwLT5wcmltZSkgPT0gMCkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoaiAhPSBpIC0gMikgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFCTl9zdWIocjIsIGFwLT5wcmltZSwgQk5fdmFsdWVfb25lKCkpIHx8Ci0gICAgICAgICAgIUJOX2djZChyMSwgcjIsIHJzYS0+ZSwgY3R4KSkgewotICAgICAgICBnb3RvIGVycjsKLSAgICAgIH0KLQotICAgICAgaWYgKCFCTl9pc19vbmUocjEpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYgKGkgIT0gbnVtX3ByaW1lcyAtIDEpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8qIEZvciB0aGUgbGFzdCBwcmltZSB3ZSdsbCBjaGVjayB0aGF0IGl0IG1ha2VzIG4gbGFyZ2UgZW5vdWdoLiBJbiB0aGUKLSAgICAgICAqIHR3byBwcmltZSBjYXNlIHRoaXMgaXNuJ3QgYSBwcm9ibGVtIGJlY2F1c2Ugd2UgZ2VuZXJhdGUgcHJpbWVzIHdpdGgKLSAgICAgICAqIHRoZSB0b3AgdHdvIGJpdHMgc2V0IGFuZCBzbyB0aGUgcHJvZHVjdCBpcyBhbHdheXMgb2YgdGhlIGV4cGVjdGVkCi0gICAgICAgKiBzaXplLiBJbiB0aGUgbXVsdGkgcHJpbWUgY2FzZSwgdGhpcyBkb2Vzbid0IGZvbGxvdy4gKi8KLSAgICAgIGlmICghQk5fbXVsKHIxLCByc2EtPm4sIGFwLT5wcmltZSwgY3R4KSkgewotICAgICAgICBnb3RvIGVycjsKLSAgICAgIH0KLSAgICAgIGlmIChCTl9udW1fYml0cyhyMSkgPT0gYml0cykgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKCFCTl9HRU5DQl9jYWxsKGNiLCAyLCBuKyspKSB7Ci0gICAgICAgIGdvdG8gZXJyOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGFwLT5yIGlzIGlzIHRoZSBwcm9kdWN0IG9mIGFsbCB0aGUgcHJpbWVzIHByaW9yIHRvIHRoZSBjdXJyZW50IG9uZQotICAgICAqIChpbmNsdWRpbmcgcCBhbmQgcSkuICovCi0gICAgaWYgKCFCTl9jb3B5KGFwLT5yLCByc2EtPm4pKSB7Ci0gICAgICBnb3RvIGVycjsKLSAgICB9Ci0gICAgaWYgKGkgPT0gbnVtX3ByaW1lcyAtIDEpIHsKLSAgICAgIC8qIEluIHRoZSBjYXNlIG9mIHRoZSBsYXN0IHByaW1lLCB3ZSBjYWxjdWxhdGVkIG4gYXMgfHIxfCBpbiB0aGUgbG9vcAotICAgICAgICogYWJvdmUuICovCi0gICAgICBpZiAoIUJOX2NvcHkocnNhLT5uLCByMSkpIHsKLSAgICAgICAgZ290byBlcnI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICghQk5fbXVsKHJzYS0+biwgcnNhLT5uLCBhcC0+cHJpbWUsIGN0eCkpIHsKLSAgICAgIGdvdG8gZXJyOwotICAgIH0KLQotICAgIGlmICghQk5fR0VOQ0JfY2FsbChjYiwgMywgMSkpIHsKLSAgICAgIGdvdG8gZXJyOwotICAgIH0KLSAgfQotCiAgIGlmIChCTl9jbXAocnNhLT5wLCByc2EtPnEpIDwgMCkgewogICAgIHRtcCA9IHJzYS0+cDsKICAgICByc2EtPnAgPSByc2EtPnE7CiAgICAgcnNhLT5xID0gdG1wOwogICB9CiAKKyAgLyogY2FsY3VsYXRlIG4gKi8KKyAgaWYgKCFCTl9tdWwocnNhLT5uLCByc2EtPnAsIHJzYS0+cSwgY3R4KSkgeworICAgIGdvdG8gZXJyOworICB9CisKICAgLyogY2FsY3VsYXRlIGQgKi8KICAgaWYgKCFCTl9zdWIocjEsIHJzYS0+cCwgQk5fdmFsdWVfb25lKCkpKSB7CiAgICAgZ290byBlcnI7IC8qIHAtMSAqLwpAQCAtMTA1NSwxNCArODg0LDYgQEAKICAgaWYgKCFCTl9tdWwocjAsIHIxLCByMiwgY3R4KSkgewogICAgIGdvdG8gZXJyOyAvKiAocC0xKShxLTEpICovCiAgIH0KLSAgZm9yIChpID0gMjsgaSA8IG51bV9wcmltZXM7IGkrKykgewotICAgIFJTQV9hZGRpdGlvbmFsX3ByaW1lICphcCA9Ci0gICAgICAgIHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX3ZhbHVlKGFkZGl0aW9uYWxfcHJpbWVzLCBpIC0gMik7Ci0gICAgaWYgKCFCTl9zdWIocjMsIGFwLT5wcmltZSwgQk5fdmFsdWVfb25lKCkpIHx8Ci0gICAgICAgICFCTl9tdWwocjAsIHIwLCByMywgY3R4KSkgewotICAgICAgZ290byBlcnI7Ci0gICAgfQotICB9CiAgIHByMCA9ICZsb2NhbF9yMDsKICAgQk5fd2l0aF9mbGFncyhwcjAsIHIwLCBCTl9GTEdfQ09OU1RUSU1FKTsKICAgaWYgKCFCTl9tb2RfaW52ZXJzZShyc2EtPmQsIHJzYS0+ZSwgcHIwLCBjdHgpKSB7CkBAIC0xMDkxLDM2ICs5MTIsMTkgQEAKICAgICBnb3RvIGVycjsKICAgfQogCi0gIGZvciAoaSA9IDI7IGkgPCBudW1fcHJpbWVzOyBpKyspIHsKLSAgICBSU0FfYWRkaXRpb25hbF9wcmltZSAqYXAgPQotICAgICAgICBza19SU0FfYWRkaXRpb25hbF9wcmltZV92YWx1ZShhZGRpdGlvbmFsX3ByaW1lcywgaSAtIDIpOwotICAgIGlmICghQk5fc3ViKGFwLT5leHAsIGFwLT5wcmltZSwgQk5fdmFsdWVfb25lKCkpIHx8Ci0gICAgICAgICFCTl9tb2QoYXAtPmV4cCwgcnNhLT5kLCBhcC0+ZXhwLCBjdHgpIHx8Ci0gICAgICAgICFCTl9tb2RfaW52ZXJzZShhcC0+Y29lZmYsIGFwLT5yLCBhcC0+cHJpbWUsIGN0eCkpIHsKLSAgICAgIGdvdG8gZXJyOwotICAgIH0KLSAgfQotCiAgIG9rID0gMTsKLSAgcnNhLT5hZGRpdGlvbmFsX3ByaW1lcyA9IGFkZGl0aW9uYWxfcHJpbWVzOwotICBhZGRpdGlvbmFsX3ByaW1lcyA9IE5VTEw7CiAKIGVycjoKICAgaWYgKG9rID09IC0xKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfTElCX0JOKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIGtleWdlbiwgRVJSX0xJQl9CTik7CiAgICAgb2sgPSAwOwogICB9CiAgIGlmIChjdHggIT0gTlVMTCkgewogICAgIEJOX0NUWF9lbmQoY3R4KTsKICAgICBCTl9DVFhfZnJlZShjdHgpOwogICB9Ci0gIHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX3BvcF9mcmVlKGFkZGl0aW9uYWxfcHJpbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FfYWRkaXRpb25hbF9wcmltZV9mcmVlKTsKLSAgcmV0dXJuIG9rOwotfQogCi1zdGF0aWMgaW50IGtleWdlbihSU0EgKnJzYSwgaW50IGJpdHMsIEJJR05VTSAqZV92YWx1ZSwgQk5fR0VOQ0IgKmNiKSB7Ci0gIHJldHVybiBrZXlnZW5fbXVsdGlwcmltZShyc2EsIGJpdHMsIDIgLyogbnVtIHByaW1lcyAqLywgZV92YWx1ZSwgY2IpOworICByZXR1cm4gb2s7CiB9CiAKIGNvbnN0IHN0cnVjdCByc2FfbWV0aF9zdCBSU0FfZGVmYXVsdF9tZXRob2QgPSB7CkBAIC0xMTUxLDcgKzk1NSw0IEBACiAgIFJTQV9GTEFHX0NBQ0hFX1BVQkxJQyB8IFJTQV9GTEFHX0NBQ0hFX1BSSVZBVEUsCiAKICAga2V5Z2VuLAotICBrZXlnZW5fbXVsdGlwcmltZSwKLQotICBOVUxMIC8qIHN1cHBvcnRzX2RpZ2VzdCAqLywKIH07CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3JzYS9yc2FfdGVzdC5jIGIvc3JjL2NyeXB0by9yc2EvcnNhX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMThjZjNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NyeXB0by9yc2EvcnNhX3Rlc3QuYwpAQCAtMCwwICsxLDUxMSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKworCisjZGVmaW5lIFNldEtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGtleS0+biA9IEJOX2JpbjJibihuLCBzaXplb2YobikgLSAxLCBrZXktPm4pOyAgICAgICAgICAgICBcCisgIGtleS0+ZSA9IEJOX2JpbjJibihlLCBzaXplb2YoZSkgLSAxLCBrZXktPmUpOyAgICAgICAgICAgICBcCisgIGtleS0+ZCA9IEJOX2JpbjJibihkLCBzaXplb2YoZCkgLSAxLCBrZXktPmQpOyAgICAgICAgICAgICBcCisgIGtleS0+cCA9IEJOX2JpbjJibihwLCBzaXplb2YocCkgLSAxLCBrZXktPnApOyAgICAgICAgICAgICBcCisgIGtleS0+cSA9IEJOX2JpbjJibihxLCBzaXplb2YocSkgLSAxLCBrZXktPnEpOyAgICAgICAgICAgICBcCisgIGtleS0+ZG1wMSA9IEJOX2JpbjJibihkbXAxLCBzaXplb2YoZG1wMSkgLSAxLCBrZXktPmRtcDEpOyBcCisgIGtleS0+ZG1xMSA9IEJOX2JpbjJibihkbXExLCBzaXplb2YoZG1xMSkgLSAxLCBrZXktPmRtcTEpOyBcCisgIGtleS0+aXFtcCA9IEJOX2JpbjJibihpcW1wLCBzaXplb2YoaXFtcCkgLSAxLCBrZXktPmlxbXApOyBcCisgIG1lbWNweShjLCBjdGV4dF9leCwgc2l6ZW9mKGN0ZXh0X2V4KSAtIDEpOyAgICAgICAgICAgICAgICBcCisgIHJldHVybiAoc2l6ZW9mKGN0ZXh0X2V4KSAtIDEpOworCitzdGF0aWMgaW50IGtleTEoUlNBICprZXksIHVuc2lnbmVkIGNoYXIgKmMpIHsKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgbltdID0KKyAgICAgICJceDAwXHhBQVx4MzZceEFCXHhDRVx4ODhceEFDXHhGRFx4RkZceDU1XHg1Mlx4M0NceDdGXHhDNFx4NTJceDNGIgorICAgICAgIlx4OTBceEVGXHhBMFx4MERceEYzXHg3N1x4NEFceDI1XHg5Rlx4MkVceDYyXHhCNFx4QzVceEQ5XHg5Q1x4QjUiCisgICAgICAiXHhBRFx4QjNceDAwXHhBMFx4MjhceDVFXHg1M1x4MDFceDkzXHgwRVx4MENceDcwXHhGQlx4NjhceDc2XHg5MyIKKyAgICAgICJceDlDXHhFNlx4MTZceENFXHg2Mlx4NEFceDExXHhFMFx4MDhceDZEXHgzNFx4MUVceEJDXHhBQ1x4QTBceEExIgorICAgICAgIlx4RjUiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGVbXSA9ICJceDExIjsKKworICBzdGF0aWMgdW5zaWduZWQgY2hhciBkW10gPQorICAgICAgIlx4MEFceDAzXHgzN1x4NDhceDYyXHg2NFx4ODdceDY5XHg1Rlx4NUZceDMwXHhCQ1x4MzhceEI5XHg4Qlx4NDQiCisgICAgICAiXHhDMlx4Q0RceDJEXHhGRlx4NDNceDQwXHg5OFx4Q0RceDIwXHhEOFx4QTFceDM4XHhEMFx4OTBceEJGXHg2NCIKKyAgICAgICJceDc5XHg3Q1x4M0ZceEE3XHhBMlx4Q0RceENCXHgzQ1x4RDFceEUwXHhCRFx4QkFceDI2XHg1NFx4QjRceEY5IgorICAgICAgIlx4REZceDhFXHg4QVx4RTVceDlEXHg3M1x4M0RceDlGXHgzM1x4QjNceDAxXHg2Mlx4NEFceEZEXHgxRFx4NTEiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHBbXSA9CisgICAgICAiXHgwMFx4RDhceDQwXHhCNFx4MTZceDY2XHhCNFx4MkVceDkyXHhFQVx4MERceEEzXHhCNFx4MzJceDA0XHhCNSIKKyAgICAgICJceENGXHhDRVx4MzNceDUyXHg1Mlx4NERceDA0XHgxNlx4QTVceEE0XHg0MVx4RTdceDAwXHhBRlx4NDZceDEyIgorICAgICAgIlx4MEQiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHFbXSA9CisgICAgICAiXHgwMFx4QzlceDdGXHhCMVx4RjBceDI3XHhGNFx4NTNceEY2XHgzNFx4MTJceDMzXHhFQVx4QUFceEQxXHhEOSIKKyAgICAgICJceDM1XHgzRlx4NkNceDQyXHhEMFx4ODhceDY2XHhCMVx4RDBceDVBXHgwRlx4MjBceDM1XHgwMlx4OEJceDlEIgorICAgICAgIlx4ODkiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGRtcDFbXSA9CisgICAgICAiXHg1OVx4MEJceDk1XHg3Mlx4QTJceEMyXHhBOVx4QzRceDA2XHgwNVx4OURceEMyXHhBQlx4MkZceDFEXHhBRiIKKyAgICAgICJceEVCXHg3RVx4OEJceDRGXHgxMFx4QTdceDU0XHg5RVx4OEVceEVEXHhGNVx4QjRceEZDXHhFMFx4OUVceDA1IjsKKworICBzdGF0aWMgdW5zaWduZWQgY2hhciBkbXExW10gPQorICAgICAgIlx4MDBceDhFXHgzQ1x4MDVceDIxXHhGRVx4MTVceEUwXHhFQVx4MDZceEEzXHg2Rlx4RjBceEYxXHgwQ1x4OTkiCisgICAgICAiXHg1Mlx4QzNceDVCXHg3QVx4NzVceDE0XHhGRFx4MzJceDM4XHhCOFx4MEFceEFEXHg1Mlx4OThceDYyXHg4RCIKKyAgICAgICJceDUxIjsKKworICBzdGF0aWMgdW5zaWduZWQgY2hhciBpcW1wW10gPQorICAgICAgIlx4MzZceDNGXHhGN1x4MThceDlEXHhBOFx4RTlceDBCXHgxRFx4MzRceDFGXHg3MVx4RDBceDlCXHg3Nlx4QTgiCisgICAgICAiXHhBOVx4NDNceEUxXHgxRFx4MTBceEIyXHg0RFx4MjRceDlGXHgyRFx4RUFceEZFXHhGOFx4MENceDE4XHgyNiI7CisKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgY3RleHRfZXhbXSA9CisgICAgICAiXHgxYlx4OGZceDA1XHhmOVx4Y2FceDFhXHg3OVx4NTJceDZlXHg1M1x4ZjNceGNjXHg1MVx4NGZceGRiXHg4OSIKKyAgICAgICJceDJiXHhmYlx4OTFceDkzXHgyM1x4MWVceDc4XHhiOVx4OTJceGU2XHg4ZFx4NTBceGE0XHg4MFx4Y2JceDUyIgorICAgICAgIlx4MzNceDg5XHg1Y1x4NzRceDk1XHg4ZFx4NWRceDAyXHhhYlx4OGNceDBmXHhkMFx4NDBceGViXHg1OFx4NDQiCisgICAgICAiXHhiMFx4MDVceGMzXHg5ZVx4ZDhceDI3XHg0YVx4OWRceGJmXHhhOFx4MDZceDcxXHg0MFx4OTRceDM5XHhkMiI7CisKKyAgU2V0S2V5OworfQorCitzdGF0aWMgaW50IGtleTIoUlNBICprZXksIHVuc2lnbmVkIGNoYXIgKmMpIHsKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgbltdID0KKyAgICAgICJceDAwXHhBM1x4MDdceDlBXHg5MFx4REZceDBEXHhGRFx4NzJceEFDXHgwOVx4MENceENDXHgyQVx4NzhceEI4IgorICAgICAgIlx4NzRceDEzXHgxM1x4M0VceDQwXHg3NVx4OUNceDk4XHhGQVx4RjhceDIwXHg0Rlx4MzVceDhBXHgwQlx4MjYiCisgICAgICAiXHgzQ1x4NjdceDcwXHhFN1x4ODNceEE5XHgzQlx4NjlceDcxXHhCN1x4MzdceDc5XHhEMlx4NzFceDdCXHhFOCIKKyAgICAgICJceDM0XHg3N1x4Q0YiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGVbXSA9ICJceDMiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGRbXSA9CisgICAgICAiXHg2Q1x4QUZceEJDXHg2MFx4OTRceEIzXHhGRVx4NENceDcyXHhCMFx4QjNceDMyXHhDNlx4RkJceDI1XHhBMiIKKyAgICAgICJceEI3XHg2Mlx4MjlceDgwXHg0RVx4NjhceDY1XHhGQ1x4QTRceDVBXHg3NFx4REZceDBGXHg4Rlx4QjhceDQxIgorICAgICAgIlx4M0JceDUyXHhDMFx4RDBceEU1XHgzRFx4OUJceDU5XHgwRlx4RjFceDlCXHhFN1x4OUZceDQ5XHhERFx4MjEiCisgICAgICAiXHhFNVx4RUIiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHBbXSA9CisgICAgICAiXHgwMFx4Q0ZceDIwXHgzNVx4MDJceDhCXHg5RFx4ODZceDk4XHg0MFx4QjRceDE2XHg2Nlx4QjRceDJFXHg5MiIKKyAgICAgICJceEVBXHgwRFx4QTNceEI0XHgzMlx4MDRceEI1XHhDRlx4Q0VceDkxIjsKKworICBzdGF0aWMgdW5zaWduZWQgY2hhciBxW10gPQorICAgICAgIlx4MDBceEM5XHg3Rlx4QjFceEYwXHgyN1x4RjRceDUzXHhGNlx4MzRceDEyXHgzM1x4RUFceEFBXHhEMVx4RDkiCisgICAgICAiXHgzNVx4M0ZceDZDXHg0Mlx4RDBceDg4XHg2Nlx4QjFceEQwXHg1RiI7CisKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgZG1wMVtdID0KKyAgICAgICJceDAwXHg4QVx4MTVceDc4XHhBQ1x4NURceDEzXHhBRlx4MTBceDJCXHgyMlx4QjlceDk5XHhDRFx4NzRceDYxIgorICAgICAgIlx4RjFceDVFXHg2RFx4MjJceENDXHgwM1x4MjNceERGXHhERlx4MEIiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGRtcTFbXSA9CisgICAgICAiXHgwMFx4ODZceDU1XHgyMVx4NEFceEM1XHg0RFx4OERceDRFXHhDRFx4NjFceDc3XHhGMVx4QzdceDM2XHg5MCIKKyAgICAgICJceENFXHgyQVx4NDhceDJDXHg4Qlx4MDVceDk5XHhDQlx4RTBceDNGIjsKKworICBzdGF0aWMgdW5zaWduZWQgY2hhciBpcW1wW10gPQorICAgICAgIlx4MDBceDgzXHhFRlx4RUZceEI4XHhBOVx4QTRceDBEXHgxRFx4QjZceEVEXHg5OFx4QURceDg0XHhFRFx4MTMiCisgICAgICAiXHgzNVx4RENceEMxXHgwOFx4RjNceDIyXHhEMFx4NTdceENGXHg4RCI7CisKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgY3RleHRfZXhbXSA9CisgICAgICAiXHgxNFx4YmRceGRkXHgyOFx4YzlceDgzXHgzNVx4MTlceDIzXHg4MFx4ZThceGU1XHg0OVx4YjFceDU4XHgyYSIKKyAgICAgICJceDhiXHg0MFx4YjRceDQ4XHg2ZFx4MDNceGE2XHhhNVx4MzFceDFmXHgxZlx4ZDVceGYwXHhhMVx4ODBceGU0IgorICAgICAgIlx4MTdceDUzXHgwM1x4MjlceGE5XHgzNFx4OTBceDc0XHhiMVx4NTJceDEzXHg1NFx4MjlceDA4XHgyNFx4NTIiCisgICAgICAiXHg2Mlx4NTEiOworCisgIFNldEtleTsKK30KKworc3RhdGljIGludCBrZXkzKFJTQSAqa2V5LCB1bnNpZ25lZCBjaGFyICpjKSB7CisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIG5bXSA9CisgICAgICAiXHgwMFx4QkJceEY4XHgyRlx4MDlceDA2XHg4Mlx4Q0VceDlDXHgyM1x4MzhceEFDXHgyQlx4OURceEE4XHg3MSIKKyAgICAgICJceEY3XHgzNlx4OERceDA3XHhFRVx4RDRceDEwXHg0M1x4QTRceDQwXHhENlx4QjZceEYwXHg3NFx4NTRceEY1IgorICAgICAgIlx4MUZceEI4XHhERlx4QkFceEFGXHgwM1x4NUNceDAyXHhBQlx4NjFceEVBXHg0OFx4Q0VceEVCXHg2Rlx4Q0QiCisgICAgICAiXHg0OFx4NzZceEVEXHg1Mlx4MERceDYwXHhFMVx4RUNceDQ2XHgxOVx4NzFceDlEXHg4QVx4NUJceDhCXHg4MCIKKyAgICAgICJceDdGXHhBRlx4QjhceEUwXHhBM1x4REZceEM3XHgzN1x4NzJceDNFXHhFNlx4QjRceEI3XHhEOVx4M0FceDI1IgorICAgICAgIlx4ODRceEVFXHg2QVx4NjRceDlEXHgwNlx4MDlceDUzXHg3NFx4ODhceDM0XHhCMlx4NDVceDQ1XHg5OFx4MzkiCisgICAgICAiXHg0RVx4RTBceEFBXHhCMVx4MkRceDdCXHg2MVx4QTVceDFGXHg1Mlx4N0FceDlBXHg0MVx4RjZceEMxXHg2OCIKKyAgICAgICJceDdGXHhFMlx4NTNceDcyXHg5OFx4Q0FceDJBXHg4Rlx4NTlceDQ2XHhGOFx4RTVceEZEXHgwOVx4MURceEJEIgorICAgICAgIlx4Q0IiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGVbXSA9ICJceDExIjsKKworICBzdGF0aWMgdW5zaWduZWQgY2hhciBkW10gPQorICAgICAgIlx4MDBceEE1XHhEQVx4RkNceDUzXHg0MVx4RkFceEYyXHg4OVx4QzRceEI5XHg4OFx4REJceDMwXHhDMVx4Q0QiCisgICAgICAiXHhGOFx4M0ZceDMxXHgyNVx4MUVceDA2XHg2OFx4QjRceDI3XHg4NFx4ODFceDM4XHgwMVx4NTdceDk2XHg0MSIKKyAgICAgICJceEIyXHg5NFx4MTBceEIzXHhDN1x4OTlceDhEXHg2Qlx4QzRceDY1XHg3NFx4NUVceDVDXHgzOVx4MjZceDY5IgorICAgICAgIlx4RDZceDg3XHgwRFx4QTJceEMwXHg4Mlx4QTlceDM5XHhFM1x4N0ZceERDXHhCOFx4MkVceEM5XHgzRVx4REEiCisgICAgICAiXHhDOVx4N0ZceEYzXHhBRFx4NTlceDUwXHhBQ1x4Q0ZceEJDXHgxMVx4MUNceDc2XHhGMVx4QTlceDUyXHg5NCIKKyAgICAgICJceDQ0XHhFNVx4NkFceEFGXHg2OFx4QzVceDZDXHgwOVx4MkNceEQzXHg4RFx4QzNceEJFXHhGNVx4RDJceDBBIgorICAgICAgIlx4OTNceDk5XHgyNlx4RURceDRGXHg3NFx4QTFceDNFXHhERFx4RkJceEUxXHhBMVx4Q0VceENDXHg0OFx4OTQiCisgICAgICAiXHhBRlx4OTRceDI4XHhDMlx4QjdceEI4XHg4OFx4M0ZceEU0XHg0Nlx4M0FceDRCXHhDOFx4NUJceDFDXHhCMyIKKyAgICAgICJceEMxIjsKKworICBzdGF0aWMgdW5zaWduZWQgY2hhciBwW10gPQorICAgICAgIlx4MDBceEVFXHhDRlx4QUVceDgxXHhCMVx4QjlceEIzXHhDOVx4MDhceDgxXHgwQlx4MTBceEExXHhCNVx4NjAiCisgICAgICAiXHgwMVx4OTlceEVCXHg5Rlx4NDRceEFFXHhGNFx4RkRceEE0XHg5M1x4QjhceDFBXHg5RVx4M0RceDg0XHhGNiIKKyAgICAgICJceDMyXHgxMlx4NEVceEYwXHgyM1x4NkVceDVEXHgxRVx4M0JceDdFXHgyOFx4RkFceEU3XHhBQVx4MDRceDBBIgorICAgICAgIlx4MkRceDVCXHgyNVx4MjFceDc2XHg0NVx4OURceDFGXHgzOVx4NzVceDQxXHhCQVx4MkFceDU4XHhGQlx4NjUiCisgICAgICAiXHg5OSI7CisKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgcVtdID0KKyAgICAgICJceDAwXHhDOVx4N0ZceEIxXHhGMFx4MjdceEY0XHg1M1x4RjZceDM0XHgxMlx4MzNceEVBXHhBQVx4RDFceEQ5IgorICAgICAgIlx4MzVceDNGXHg2Q1x4NDJceEQwXHg4OFx4NjZceEIxXHhEMFx4NUFceDBGXHgyMFx4MzVceDAyXHg4Qlx4OUQiCisgICAgICAiXHg4Nlx4OThceDQwXHhCNFx4MTZceDY2XHhCNFx4MkVceDkyXHhFQVx4MERceEEzXHhCNFx4MzJceDA0XHhCNSIKKyAgICAgICJceENGXHhDRVx4MzNceDUyXHg1Mlx4NERceDA0XHgxNlx4QTVceEE0XHg0MVx4RTdceDAwXHhBRlx4NDZceDE1IgorICAgICAgIlx4MDMiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGRtcDFbXSA9CisgICAgICAiXHg1NFx4NDlceDRDXHhBNlx4M0VceEJBXHgwM1x4MzdceEU0XHhFMlx4NDBceDIzXHhGQ1x4RDZceDlBXHg1QSIKKyAgICAgICJceEVCXHgwN1x4RERceERDXHgwMVx4ODNceEE0XHhEMFx4QUNceDlCXHg1NFx4QjBceDUxXHhGMlx4QjFceDNFIgorICAgICAgIlx4RDlceDQ5XHgwOVx4NzVceEVBXHhCN1x4NzRceDE0XHhGRlx4NTlceEMxXHhGN1x4NjlceDJFXHg5QVx4MkUiCisgICAgICAiXHgyMFx4MkJceDM4XHhGQ1x4OTFceDBBXHg0N1x4NDFceDc0XHhBRFx4QzlceDNDXHgxRlx4NjdceEM5XHg4MSI7CisKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgZG1xMVtdID0KKyAgICAgICJceDQ3XHgxRVx4MDJceDkwXHhGRlx4MEFceEYwXHg3NVx4MDNceDUxXHhCN1x4RjhceDc4XHg4Nlx4NENceEE5IgorICAgICAgIlx4NjFceEFEXHhCRFx4M0FceDhBXHg3RVx4OTlceDFDXHg1Q1x4MDVceDU2XHhBOVx4NENceDMxXHg0Nlx4QTciCisgICAgICAiXHhGOVx4ODBceDNGXHg4Rlx4NkZceDhBXHhFM1x4NDJceEU5XHgzMVx4RkRceDhBXHhFNFx4N0FceDIyXHgwRCIKKyAgICAgICJceDFCXHg5OVx4QTRceDk1XHg4NFx4OThceDA3XHhGRVx4MzlceEY5XHgyNFx4NUFceDk4XHgzNlx4REFceDNEIjsKKworICBzdGF0aWMgdW5zaWduZWQgY2hhciBpcW1wW10gPQorICAgICAgIlx4MDBceEIwXHg2Q1x4NEZceERBXHhCQlx4NjNceDAxXHgxOVx4OERceDI2XHg1Qlx4REJceEFFXHg5NFx4MjMiCisgICAgICAiXHhCM1x4ODBceEYyXHg3MVx4RjdceDM0XHg1M1x4ODhceDUwXHg5M1x4MDdceDdGXHhDRFx4MzlceEUyXHgxMSIKKyAgICAgICJceDlGXHhDOVx4ODZceDMyXHgxNVx4NEZceDU4XHg4M1x4QjFceDY3XHhBOVx4NjdceEJGXHg0MFx4MkJceDRFIgorICAgICAgIlx4OUVceDJFXHgwRlx4OTZceDU2XHhFNlx4OThceEVBXHgzNlx4NjZceEVEXHhGQlx4MjVceDc5XHg4MFx4MzkiCisgICAgICAiXHhGNyI7CisKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgY3RleHRfZXhbXSA9CisgICAgICAiXHhiOFx4MjRceDZiXHg1Nlx4YTZceGVkXHg1OFx4ODFceGFlXHhiNVx4ODVceGQ5XHhhMlx4NWJceDJhXHhkNyIKKyAgICAgICJceDkwXHhjNFx4MTdceGUwXHg4MFx4NjhceDFiXHhmMVx4YWNceDJiXHhjM1x4ZGVceGI2XHg5ZFx4OGJceGNlIgorICAgICAgIlx4ZjBceGM0XHgzNlx4NmZceGVjXHg0MFx4MGFceGYwXHg1Mlx4YTdceDJlXHg5Ylx4MGVceGZmXHhiNVx4YjMiCisgICAgICAiXHhmMlx4ZjFceDkyXHhkYlx4ZWFceGNhXHgwM1x4YzFceDI3XHg0MFx4MDVceDcxXHgxM1x4YmZceDFmXHgwNiIKKyAgICAgICJceDY5XHhhY1x4MjJceGU5XHhmM1x4YTdceDg1XHgyZVx4M2NceDE1XHhkOVx4MTNceGNhXHhiMFx4YjhceDg2IgorICAgICAgIlx4M2FceDk1XHhjOVx4OTJceDk0XHhjZVx4ODZceDc0XHgyMVx4NDlceDU0XHg2MVx4MDNceDQ2XHhmNFx4ZDQiCisgICAgICAiXHg3NFx4YjJceDZmXHg3Y1x4NDhceGI0XHgyZVx4ZTZceDhlXHgxZlx4NTdceDJhXHgxZlx4YzRceDAyXHg2YSIKKyAgICAgICJceGM0XHg1Nlx4YjRceGY1XHg5Zlx4N2JceDYyXHgxZVx4YTFceGI5XHhkOFx4OGZceDY0XHgyMFx4MmZceGIxIjsKKworICBTZXRLZXk7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9iYWRfa2V5KHZvaWQpIHsKKyAgUlNBICprZXkgPSBSU0FfbmV3KCk7CisgIEJJR05VTSBlOworCisgIEJOX2luaXQoJmUpOworICBCTl9zZXRfd29yZCgmZSwgUlNBX0Y0KTsKKworICBpZiAoIVJTQV9nZW5lcmF0ZV9rZXlfZXgoa2V5LCA1MTIsICZlLCBOVUxMKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiUlNBX2dlbmVyYXRlX2tleV9leCBmYWlsZWQuXG4iKTsKKyAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIUJOX2FkZChrZXktPnAsIGtleS0+cCwgQk5fdmFsdWVfb25lKCkpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJCTiBlcnJvci5cbiIpOworICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChSU0FfY2hlY2tfa2V5KGtleSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlJTQV9jaGVja19rZXkgcGFzc2VkIHdpdGggaW52YWxpZCBrZXkhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIEVSUl9jbGVhcl9lcnJvcigpOworICBCTl9mcmVlKCZlKTsKKyAgUlNBX2ZyZWUoa2V5KTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9vbmx5X2RfZ2l2ZW4odm9pZCkgeworICBSU0EgKmtleSA9IFJTQV9uZXcoKTsKKyAgdWludDhfdCBidWZbNjRdOworICB1bnNpZ25lZCBidWZfbGVuID0gc2l6ZW9mKGJ1Zik7CisgIGNvbnN0IHVpbnQ4X3Qga0R1bW15SGFzaFsxNl0gPSB7MH07CisgIGludCByZXQgPSAwOworCisgIGlmICghQk5faGV4MmJuKCZrZXktPm4sCisgICAgICAgICAgICAgICAgICIwMGU3N2JiZjM4ODlkNGVmMzZhOWEyNWQ0ZDY5ZjNmNjMyZWI0MzYyMjE0Yzc0NTE3ZGE2ZDZhZWFhOWJkIgorICAgICAgICAgICAgICAgICAiMDlhYzQyYjI2NjIxY2Q4OGYzYTZlYjAxMzc3MmZjM2JmOWY4MzkxNGI2NDY3MjMxYzYzMDIwMmMzNWIzZSIKKyAgICAgICAgICAgICAgICAgIjU4MDhjNjU5IikgfHwKKyAgICAgICFCTl9oZXgyYm4oJmtleS0+ZSwgIjAxMDAwMSIpIHx8CisgICAgICAhQk5faGV4MmJuKCZrZXktPmQsCisgICAgICAgICAgICAgICAgICIwMzY1ZGI5ZWI2ZDczYjUzYjAxNWM0MGNkOGRiNGRlN2RkNzAzNWM2OGI1YWMxYmY3ODZkN2E0ZWUyY2VhIgorICAgICAgICAgICAgICAgICAiMzE2ZWFlY2EyMWE3M2FjMzY1ZTU4NzEzMTk1ZjJhZTk4NDkzNDg1MjVjYTg1NTM4NmI2ZDAyOGU0MzdhOSIKKyAgICAgICAgICAgICAgICAgIjQ5NWEwMSIpIHx8CisgICAgICBSU0Ffc2l6ZShrZXkpID4gc2l6ZW9mKGJ1ZikpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmICghUlNBX2NoZWNrX2tleShrZXkpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJSU0FfY2hlY2tfa2V5IGZhaWxlZCB3aXRoIG9ubHkgZCBnaXZlbi5cbiIpOworICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmICghUlNBX3NpZ24oTklEX3NoYTI1Niwga0R1bW15SGFzaCwgc2l6ZW9mKGtEdW1teUhhc2gpLCBidWYsICZidWZfbGVuLAorICAgICAgICAgICAgICAgIGtleSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlJTQV9zaWduIGZhaWxlZCB3aXRoIG9ubHkgZCBnaXZlbi5cbiIpOworICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmICghUlNBX3ZlcmlmeShOSURfc2hhMjU2LCBrRHVtbXlIYXNoLCBzaXplb2Yoa0R1bW15SGFzaCksIGJ1ZiwgYnVmX2xlbiwKKyAgICAgICAgICAgICAgICAgIGtleSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlJTQV92ZXJpZnkgZmFpbGVkIHdpdGggb25seSBkIGdpdmVuLlxuIik7CisgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgcmV0ID0gMTsKKworZXJyOgorICBSU0FfZnJlZShrZXkpOworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRlc3RfcmVjb3Zlcl9jcnRfcGFyYW1zKHZvaWQpIHsKKyAgUlNBICprZXkxLCAqa2V5MjsKKyAgQklHTlVNICplID0gQk5fbmV3KCk7CisgIHVpbnQ4X3QgYnVmWzEyOF07CisgIHVuc2lnbmVkIGJ1Zl9sZW4gPSBzaXplb2YoYnVmKTsKKyAgY29uc3QgdWludDhfdCBrRHVtbXlIYXNoWzE2XSA9IHswfTsKKyAgdW5zaWduZWQgaTsKKworICBCTl9zZXRfd29yZChlLCBSU0FfRjQpOworCisgIEVSUl9jbGVhcl9lcnJvcigpOworCisgIGZvciAoaSA9IDA7IGkgPCAxOyBpKyspIHsKKyAgICBrZXkxID0gUlNBX25ldygpOworICAgIGlmICghUlNBX2dlbmVyYXRlX2tleV9leChrZXkxLCA1MTIsIGUsIE5VTEwpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJTQV9nZW5lcmF0ZV9rZXlfZXggZmFpbGVkLlxuIik7CisgICAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIVJTQV9jaGVja19rZXkoa2V5MSkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUlNBX2NoZWNrX2tleSBmYWlsZWQgd2l0aCBvcmlnaW5hbCBrZXkuXG4iKTsKKyAgICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGtleTIgPSBSU0FfbmV3KCk7CisgICAga2V5Mi0+biA9IEJOX2R1cChrZXkxLT5uKTsKKyAgICBrZXkyLT5lID0gQk5fZHVwKGtleTEtPmUpOworICAgIGtleTItPmQgPSBCTl9kdXAoa2V5MS0+ZCk7CisgICAgUlNBX2ZyZWUoa2V5MSk7CisKKyAgICBpZiAoIVJTQV9yZWNvdmVyX2NydF9wYXJhbXMoa2V5MikpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUlNBX3JlY292ZXJfY3J0X3BhcmFtcyBmYWlsZWQuXG4iKTsKKyAgICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChSU0Ffc2l6ZShrZXkyKSA+IGJ1Zl9sZW4pIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghUlNBX2NoZWNrX2tleShrZXkyKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJSU0FfY2hlY2tfa2V5IGZhaWxlZCB3aXRoIHJlY292ZXJlZCBrZXkuXG4iKTsKKyAgICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghUlNBX3NpZ24oTklEX3NoYTI1Niwga0R1bW15SGFzaCwgc2l6ZW9mKGtEdW1teUhhc2gpLCBidWYsICZidWZfbGVuLAorICAgICAgICAgICAgICAgICAga2V5MikpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUlNBX3NpZ24gZmFpbGVkIHdpdGggcmVjb3ZlcmVkIGtleS5cbiIpOworICAgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCFSU0FfdmVyaWZ5KE5JRF9zaGEyNTYsIGtEdW1teUhhc2gsIHNpemVvZihrRHVtbXlIYXNoKSwgYnVmLCBidWZfbGVuLAorICAgICAgICAgICAgICAgICAgICBrZXkyKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJSU0FfdmVyaWZ5IGZhaWxlZCB3aXRoIHJlY292ZXJlZCBrZXkuXG4iKTsKKyAgICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIFJTQV9mcmVlKGtleTIpOworICB9CisKKyAgQk5fZnJlZShlKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyAgaW50IGVyciA9IDA7CisgIGludCB2OworICBSU0EgKmtleTsKKyAgdW5zaWduZWQgY2hhciBwdGV4dFsyNTZdOworICB1bnNpZ25lZCBjaGFyIGN0ZXh0WzI1Nl07CisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHB0ZXh0X2V4W10gPSAiXHg1NFx4ODVceDliXHgzNFx4MmNceDQ5XHhlYVx4MmEiOworICB1bnNpZ25lZCBjaGFyIGN0ZXh0X2V4WzI1Nl07CisgIGludCBwbGVuOworICBpbnQgY2xlbiA9IDA7CisgIGludCBudW07CisgIGludCBuOworCisgIENSWVBUT19saWJyYXJ5X2luaXQoKTsKKworICBwbGVuID0gc2l6ZW9mKHB0ZXh0X2V4KSAtIDE7CisKKyAgZm9yICh2ID0gMDsgdiA8IDM7IHYrKykgeworICAgIGtleSA9IFJTQV9uZXcoKTsKKyAgICBzd2l0Y2ggKHYpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgY2xlbiA9IGtleTEoa2V5LCBjdGV4dF9leCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICBjbGVuID0ga2V5MihrZXksIGN0ZXh0X2V4KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIGNsZW4gPSBrZXkzKGtleSwgY3RleHRfZXgpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGFib3J0KCk7CisgICAgfQorCisgICAgaWYgKCFSU0FfY2hlY2tfa2V5KGtleSkpIHsKKyAgICAgIHByaW50ZigiJWQ6IFJTQV9jaGVja19rZXkgZmFpbGVkXG4iLCB2KTsKKyAgICAgIGVyciA9IDE7CisgICAgICBnb3RvIG9hZXA7CisgICAgfQorCisgICAgbnVtID0gUlNBX3B1YmxpY19lbmNyeXB0KHBsZW4sIHB0ZXh0X2V4LCBjdGV4dCwga2V5LCBSU0FfUEtDUzFfUEFERElORyk7CisgICAgaWYgKG51bSAhPSBjbGVuKSB7CisgICAgICBwcmludGYoIlBLQ1MjMSB2MS41IGVuY3J5cHRpb24gZmFpbGVkIVxuIik7CisgICAgICBlcnIgPSAxOworICAgICAgZ290byBvYWVwOworICAgIH0KKworICAgIG51bSA9IFJTQV9wcml2YXRlX2RlY3J5cHQobnVtLCBjdGV4dCwgcHRleHQsIGtleSwgUlNBX1BLQ1MxX1BBRERJTkcpOworICAgIGlmIChudW0gIT0gcGxlbiB8fCBtZW1jbXAocHRleHQsIHB0ZXh0X2V4LCBudW0pICE9IDApIHsKKyAgICAgIHByaW50ZigiUEtDUyMxIHYxLjUgZGVjcnlwdGlvbiBmYWlsZWQhXG4iKTsKKyAgICAgIGVyciA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZigiUEtDUyAjMSB2MS41IGVuY3J5cHRpb24vZGVjcnlwdGlvbiBva1xuIik7CisgICAgfQorCisgIG9hZXA6CisgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgbnVtID0KKyAgICAgICAgUlNBX3B1YmxpY19lbmNyeXB0KHBsZW4sIHB0ZXh0X2V4LCBjdGV4dCwga2V5LCBSU0FfUEtDUzFfT0FFUF9QQURESU5HKTsKKyAgICBpZiAobnVtID09IC0xKSB7CisgICAgICBwcmludGYoIk5vIE9BRVAgc3VwcG9ydFxuIik7CisgICAgICBnb3RvIG5leHQ7CisgICAgfQorICAgIGlmIChudW0gIT0gY2xlbikgeworICAgICAgcHJpbnRmKCJPQUVQIGVuY3J5cHRpb24gZmFpbGVkIVxuIik7CisgICAgICBlcnIgPSAxOworICAgICAgZ290byBuZXh0OworICAgIH0KKworICAgIG51bSA9IFJTQV9wcml2YXRlX2RlY3J5cHQobnVtLCBjdGV4dCwgcHRleHQsIGtleSwgUlNBX1BLQ1MxX09BRVBfUEFERElORyk7CisgICAgaWYgKG51bSAhPSBwbGVuIHx8IG1lbWNtcChwdGV4dCwgcHRleHRfZXgsIG51bSkgIT0gMCkgeworICAgICAgcHJpbnRmKCJPQUVQIGRlY3J5cHRpb24gKGVuY3J5cHRlZCBkYXRhKSBmYWlsZWQhXG4iKTsKKyAgICAgIGVyciA9IDE7CisgICAgfSBlbHNlIGlmIChtZW1jbXAoY3RleHQsIGN0ZXh0X2V4LCBudW0pID09IDApIHsKKyAgICAgIHByaW50ZigiT0FFUCB0ZXN0IHZlY3RvciAlZCBwYXNzZWQhXG4iLCB2KTsKKyAgICB9CisKKyAgICAvKiBEaWZmZXJlbnQgY2lwaGVydGV4dHMgKHJzYV9vYWVwLmMgd2l0aG91dCAtRFBLQ1NfVEVTVFZFQ1QpLgorICAgICAgIFRyeSBkZWNyeXB0aW5nIGN0ZXh0X2V4ICovCisKKyAgICBudW0gPQorICAgICAgICBSU0FfcHJpdmF0ZV9kZWNyeXB0KGNsZW4sIGN0ZXh0X2V4LCBwdGV4dCwga2V5LCBSU0FfUEtDUzFfT0FFUF9QQURESU5HKTsKKworICAgIGlmIChudW0gIT0gcGxlbiB8fCBtZW1jbXAocHRleHQsIHB0ZXh0X2V4LCBudW0pICE9IDApIHsKKyAgICAgIHByaW50ZigiT0FFUCBkZWNyeXB0aW9uICh0ZXN0IHZlY3RvciBkYXRhKSBmYWlsZWQhXG4iKTsKKyAgICAgIGVyciA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZigiT0FFUCBlbmNyeXB0aW9uL2RlY3J5cHRpb24gb2tcbiIpOworICAgIH0KKworICAgIC8qIFRyeSBkZWNyeXB0aW5nIGNvcnJ1cHRlZCBjaXBoZXJ0ZXh0cyAqLworICAgIGZvciAobiA9IDA7IG4gPCBjbGVuOyArK24pIHsKKyAgICAgIGludCBiOworICAgICAgdW5zaWduZWQgY2hhciBzYXZlZCA9IGN0ZXh0W25dOworICAgICAgZm9yIChiID0gMDsgYiA8IDI1NjsgKytiKSB7CisgICAgICAgIGlmIChiID09IHNhdmVkKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgY3RleHRbbl0gPSBiOworICAgICAgICBudW0gPQorICAgICAgICAgICAgUlNBX3ByaXZhdGVfZGVjcnlwdChudW0sIGN0ZXh0LCBwdGV4dCwga2V5LCBSU0FfUEtDUzFfT0FFUF9QQURESU5HKTsKKyAgICAgICAgaWYgKG51bSA+IDApIHsKKyAgICAgICAgICBwcmludGYoIkNvcnJ1cHQgZGF0YSBkZWNyeXB0ZWQhXG4iKTsKKyAgICAgICAgICBlcnIgPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgIG5leHQ6CisgICAgUlNBX2ZyZWUoa2V5KTsKKyAgfQorCisgIGlmIChlcnIgIT0gMCB8fAorICAgICAgIXRlc3Rfb25seV9kX2dpdmVuKCkgfHwKKyAgICAgICF0ZXN0X3JlY292ZXJfY3J0X3BhcmFtcygpIHx8CisgICAgICAhdGVzdF9iYWRfa2V5KCkpIHsKKyAgICBlcnIgPSAxOworICB9CisKKyAgaWYgKGVyciA9PSAwKSB7CisgICAgcHJpbnRmKCJQQVNTXG4iKTsKKyAgfQorICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9yc2EvcnNhX3Rlc3QuY2MgYi9zcmMvY3J5cHRvL3JzYS9yc2FfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyYjc4Yi4uMDAwMDAwMAotLS0gYS9zcmMvY3J5cHRvL3JzYS9yc2FfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDg2OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCi0gKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCi0gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCi0gKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KLSAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKLSAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgotICoKLSAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCi0gKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCi0gKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCi0gKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgotICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCi0gKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKLSAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCi0gKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKLSAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgotICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KLSAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqCi0gKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgotICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCi0gKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCi0gKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLwotCi0jaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgotI2luY2x1ZGUgPG9wZW5zc2wvYnl0ZXN0cmluZy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgotCi0jaW5jbHVkZSAiLi4vdGVzdC9zY29wZWRfdHlwZXMuaCIKLQotCi0vLyBrUGxhaW50ZXh0IGlzIGEgc2FtcGxlIHBsYWludGV4dC4KLXN0YXRpYyBjb25zdCB1aW50OF90IGtQbGFpbnRleHRbXSA9ICJceDU0XHg4NVx4OWJceDM0XHgyY1x4NDlceGVhXHgyYSI7Ci1zdGF0aWMgY29uc3Qgc2l6ZV90IGtQbGFpbnRleHRMZW4gPSBzaXplb2Yoa1BsYWludGV4dCkgLSAxOwotCi0vLyBrS2V5MSBpcyBhIERFUi1lbmNvZGVkIFJTQVByaXZhdGVLZXkuCi1zdGF0aWMgY29uc3QgdWludDhfdCBrS2V5MVtdID0KLSAgICAiXHgzMFx4ODJceDAxXHgzOFx4MDJceDAxXHgwMFx4MDJceDQxXHgwMFx4YWFceDM2XHhhYlx4Y2VceDg4XHhhY1x4ZmRceGZmIgotICAgICJceDU1XHg1Mlx4M2NceDdmXHhjNFx4NTJceDNmXHg5MFx4ZWZceGEwXHgwZFx4ZjNceDc3XHg0YVx4MjVceDlmXHgyZVx4NjIiCi0gICAgIlx4YjRceGM1XHhkOVx4OWNceGI1XHhhZFx4YjNceDAwXHhhMFx4MjhceDVlXHg1M1x4MDFceDkzXHgwZVx4MGNceDcwXHhmYiIKLSAgICAiXHg2OFx4NzZceDkzXHg5Y1x4ZTZceDE2XHhjZVx4NjJceDRhXHgxMVx4ZTBceDA4XHg2ZFx4MzRceDFlXHhiY1x4YWNceGEwIgotICAgICJceGExXHhmNVx4MDJceDAxXHgxMVx4MDJceDQwXHgwYVx4MDNceDM3XHg0OFx4NjJceDY0XHg4N1x4NjlceDVmXHg1Zlx4MzAiCi0gICAgIlx4YmNceDM4XHhiOVx4OGJceDQ0XHhjMlx4Y2RceDJkXHhmZlx4NDNceDQwXHg5OFx4Y2RceDIwXHhkOFx4YTFceDM4XHhkMCIKLSAgICAiXHg5MFx4YmZceDY0XHg3OVx4N2NceDNmXHhhN1x4YTJceGNkXHhjYlx4M2NceGQxXHhlMFx4YmRceGJhXHgyNlx4NTRceGI0IgotICAgICJceGY5XHhkZlx4OGVceDhhXHhlNVx4OWRceDczXHgzZFx4OWZceDMzXHhiM1x4MDFceDYyXHg0YVx4ZmRceDFkXHg1MVx4MDIiCi0gICAgIlx4MjFceDAwXHhkOFx4NDBceGI0XHgxNlx4NjZceGI0XHgyZVx4OTJceGVhXHgwZFx4YTNceGI0XHgzMlx4MDRceGI1XHhjZiIKLSAgICAiXHhjZVx4MzNceDUyXHg1Mlx4NGRceDA0XHgxNlx4YTVceGE0XHg0MVx4ZTdceDAwXHhhZlx4NDZceDEyXHgwZFx4MDJceDIxIgotICAgICJceDAwXHhjOVx4N2ZceGIxXHhmMFx4MjdceGY0XHg1M1x4ZjZceDM0XHgxMlx4MzNceGVhXHhhYVx4ZDFceGQ5XHgzNVx4M2YiCi0gICAgIlx4NmNceDQyXHhkMFx4ODhceDY2XHhiMVx4ZDBceDVhXHgwZlx4MjBceDM1XHgwMlx4OGJceDlkXHg4OVx4MDJceDIwXHg1OSIKLSAgICAiXHgwYlx4OTVceDcyXHhhMlx4YzJceGE5XHhjNFx4MDZceDA1XHg5ZFx4YzJceGFiXHgyZlx4MWRceGFmXHhlYlx4N2VceDhiIgotICAgICJceDRmXHgxMFx4YTdceDU0XHg5ZVx4OGVceGVkXHhmNVx4YjRceGZjXHhlMFx4OWVceDA1XHgwMlx4MjFceDAwXHg4ZVx4M2MiCi0gICAgIlx4MDVceDIxXHhmZVx4MTVceGUwXHhlYVx4MDZceGEzXHg2Zlx4ZjBceGYxXHgwY1x4OTlceDUyXHhjM1x4NWJceDdhXHg3NSIKLSAgICAiXHgxNFx4ZmRceDMyXHgzOFx4YjhceDBhXHhhZFx4NTJceDk4XHg2Mlx4OGRceDUxXHgwMlx4MjBceDM2XHgzZlx4ZjdceDE4IgotICAgICJceDlkXHhhOFx4ZTlceDBiXHgxZFx4MzRceDFmXHg3MVx4ZDBceDliXHg3Nlx4YThceGE5XHg0M1x4ZTFceDFkXHgxMFx4YjIiCi0gICAgIlx4NGRceDI0XHg5Zlx4MmRceGVhXHhmZVx4ZjhceDBjXHgxOFx4MjYiOwotCi0vLyBrT0FFUENpcGhlcnRleHQxIGlzIGEgc2FtcGxlIGVuY3J5cHRpb24gb2YgfGtQbGFpbnRleHR8IHdpdGggfGtLZXkxfCB1c2luZwotLy8gUlNBIE9BRVAuCi1zdGF0aWMgY29uc3QgdWludDhfdCBrT0FFUENpcGhlcnRleHQxW10gPQotICAgICJceDFiXHg4Zlx4MDVceGY5XHhjYVx4MWFceDc5XHg1Mlx4NmVceDUzXHhmM1x4Y2NceDUxXHg0Zlx4ZGJceDg5XHgyYlx4ZmIiCi0gICAgIlx4OTFceDkzXHgyM1x4MWVceDc4XHhiOVx4OTJceGU2XHg4ZFx4NTBceGE0XHg4MFx4Y2JceDUyXHgzM1x4ODlceDVjXHg3NCIKLSAgICAiXHg5NVx4OGRceDVkXHgwMlx4YWJceDhjXHgwZlx4ZDBceDQwXHhlYlx4NThceDQ0XHhiMFx4MDVceGMzXHg5ZVx4ZDhceDI3IgotICAgICJceDRhXHg5ZFx4YmZceGE4XHgwNlx4NzFceDQwXHg5NFx4MzlceGQyIjsKLQotLy8ga0tleTIgaXMgYSBERVItZW5jb2RlZCBSU0FQcml2YXRlS2V5Lgotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0tleTJbXSA9Ci0gICAgIlx4MzBceDgxXHhmYlx4MDJceDAxXHgwMFx4MDJceDMzXHgwMFx4YTNceDA3XHg5YVx4OTBceGRmXHgwZFx4ZmRceDcyXHhhYyIKLSAgICAiXHgwOVx4MGNceGNjXHgyYVx4NzhceGI4XHg3NFx4MTNceDEzXHgzZVx4NDBceDc1XHg5Y1x4OThceGZhXHhmOFx4MjBceDRmIgotICAgICJceDM1XHg4YVx4MGJceDI2XHgzY1x4NjdceDcwXHhlN1x4ODNceGE5XHgzYlx4NjlceDcxXHhiN1x4MzdceDc5XHhkMlx4NzEiCi0gICAgIlx4N2JceGU4XHgzNFx4NzdceGNmXHgwMlx4MDFceDAzXHgwMlx4MzJceDZjXHhhZlx4YmNceDYwXHg5NFx4YjNceGZlXHg0YyIKLSAgICAiXHg3Mlx4YjBceGIzXHgzMlx4YzZceGZiXHgyNVx4YTJceGI3XHg2Mlx4MjlceDgwXHg0ZVx4NjhceDY1XHhmY1x4YTRceDVhIgotICAgICJceDc0XHhkZlx4MGZceDhmXHhiOFx4NDFceDNiXHg1Mlx4YzBceGQwXHhlNVx4M2RceDliXHg1OVx4MGZceGYxXHg5Ylx4ZTciCi0gICAgIlx4OWZceDQ5XHhkZFx4MjFceGU1XHhlYlx4MDJceDFhXHgwMFx4Y2ZceDIwXHgzNVx4MDJceDhiXHg5ZFx4ODZceDk4XHg0MCIKLSAgICAiXHhiNFx4MTZceDY2XHhiNFx4MmVceDkyXHhlYVx4MGRceGEzXHhiNFx4MzJceDA0XHhiNVx4Y2ZceGNlXHg5MVx4MDJceDFhIgotICAgICJceDAwXHhjOVx4N2ZceGIxXHhmMFx4MjdceGY0XHg1M1x4ZjZceDM0XHgxMlx4MzNceGVhXHhhYVx4ZDFceGQ5XHgzNVx4M2YiCi0gICAgIlx4NmNceDQyXHhkMFx4ODhceDY2XHhiMVx4ZDBceDVmXHgwMlx4MWFceDAwXHg4YVx4MTVceDc4XHhhY1x4NWRceDEzXHhhZiIKLSAgICAiXHgxMFx4MmJceDIyXHhiOVx4OTlceGNkXHg3NFx4NjFceGYxXHg1ZVx4NmRceDIyXHhjY1x4MDNceDIzXHhkZlx4ZGZceDBiIgotICAgICJceDAyXHgxYVx4MDBceDg2XHg1NVx4MjFceDRhXHhjNVx4NGRceDhkXHg0ZVx4Y2RceDYxXHg3N1x4ZjFceGM3XHgzNlx4OTAiCi0gICAgIlx4Y2VceDJhXHg0OFx4MmNceDhiXHgwNVx4OTlceGNiXHhlMFx4M2ZceDAyXHgxYVx4MDBceDgzXHhlZlx4ZWZceGI4XHhhOSIKLSAgICAiXHhhNFx4MGRceDFkXHhiNlx4ZWRceDk4XHhhZFx4ODRceGVkXHgxM1x4MzVceGRjXHhjMVx4MDhceGYzXHgyMlx4ZDBceDU3IgotICAgICJceGNmXHg4ZCI7Ci0KLS8vIGtPQUVQQ2lwaGVydGV4dDIgaXMgYSBzYW1wbGUgZW5jcnlwdGlvbiBvZiB8a1BsYWludGV4dHwgd2l0aCB8a0tleTJ8IHVzaW5nCi0vLyBSU0EgT0FFUC4KLXN0YXRpYyBjb25zdCB1aW50OF90IGtPQUVQQ2lwaGVydGV4dDJbXSA9Ci0gICAgIlx4MTRceGJkXHhkZFx4MjhceGM5XHg4M1x4MzVceDE5XHgyM1x4ODBceGU4XHhlNVx4NDlceGIxXHg1OFx4MmFceDhiXHg0MCIKLSAgICAiXHhiNFx4NDhceDZkXHgwM1x4YTZceGE1XHgzMVx4MWZceDFmXHhkNVx4ZjBceGExXHg4MFx4ZTRceDE3XHg1M1x4MDNceDI5IgotICAgICJceGE5XHgzNFx4OTBceDc0XHhiMVx4NTJceDEzXHg1NFx4MjlceDA4XHgyNFx4NTJceDYyXHg1MSI7Ci0KLS8vIGtLZXkzIGlzIGEgREVSLWVuY29kZWQgUlNBUHJpdmF0ZUtleS4KLXN0YXRpYyBjb25zdCB1aW50OF90IGtLZXkzW10gPQotICAgICJceDMwXHg4Mlx4MDJceDViXHgwMlx4MDFceDAwXHgwMlx4ODFceDgxXHgwMFx4YmJceGY4XHgyZlx4MDlceDA2XHg4Mlx4Y2UiCi0gICAgIlx4OWNceDIzXHgzOFx4YWNceDJiXHg5ZFx4YThceDcxXHhmN1x4MzZceDhkXHgwN1x4ZWVceGQ0XHgxMFx4NDNceGE0XHg0MCIKLSAgICAiXHhkNlx4YjZceGYwXHg3NFx4NTRceGY1XHgxZlx4YjhceGRmXHhiYVx4YWZceDAzXHg1Y1x4MDJceGFiXHg2MVx4ZWFceDQ4IgotICAgICJceGNlXHhlYlx4NmZceGNkXHg0OFx4NzZceGVkXHg1Mlx4MGRceDYwXHhlMVx4ZWNceDQ2XHgxOVx4NzFceDlkXHg4YVx4NWIiCi0gICAgIlx4OGJceDgwXHg3Zlx4YWZceGI4XHhlMFx4YTNceGRmXHhjN1x4MzdceDcyXHgzZVx4ZTZceGI0XHhiN1x4ZDlceDNhXHgyNSIKLSAgICAiXHg4NFx4ZWVceDZhXHg2NFx4OWRceDA2XHgwOVx4NTNceDc0XHg4OFx4MzRceGIyXHg0NVx4NDVceDk4XHgzOVx4NGVceGUwIgotICAgICJceGFhXHhiMVx4MmRceDdiXHg2MVx4YTVceDFmXHg1Mlx4N2FceDlhXHg0MVx4ZjZceGMxXHg2OFx4N2ZceGUyXHg1M1x4NzIiCi0gICAgIlx4OThceGNhXHgyYVx4OGZceDU5XHg0Nlx4ZjhceGU1XHhmZFx4MDlceDFkXHhiZFx4Y2JceDAyXHgwMVx4MTFceDAyXHg4MSIKLSAgICAiXHg4MVx4MDBceGE1XHhkYVx4ZmNceDUzXHg0MVx4ZmFceGYyXHg4OVx4YzRceGI5XHg4OFx4ZGJceDMwXHhjMVx4Y2RceGY4IgotICAgICJceDNmXHgzMVx4MjVceDFlXHgwNlx4NjhceGI0XHgyN1x4ODRceDgxXHgzOFx4MDFceDU3XHg5Nlx4NDFceGIyXHg5NFx4MTAiCi0gICAgIlx4YjNceGM3XHg5OVx4OGRceDZiXHhjNFx4NjVceDc0XHg1ZVx4NWNceDM5XHgyNlx4NjlceGQ2XHg4N1x4MGRceGEyXHhjMCIKLSAgICAiXHg4Mlx4YTlceDM5XHhlM1x4N2ZceGRjXHhiOFx4MmVceGM5XHgzZVx4ZGFceGM5XHg3Zlx4ZjNceGFkXHg1OVx4NTBceGFjIgotICAgICJceGNmXHhiY1x4MTFceDFjXHg3Nlx4ZjFceGE5XHg1Mlx4OTRceDQ0XHhlNVx4NmFceGFmXHg2OFx4YzVceDZjXHgwOVx4MmMiCi0gICAgIlx4ZDNceDhkXHhjM1x4YmVceGY1XHhkMlx4MGFceDkzXHg5OVx4MjZceGVkXHg0Zlx4NzRceGExXHgzZVx4ZGRceGZiXHhlMSIKLSAgICAiXHhhMVx4Y2VceGNjXHg0OFx4OTRceGFmXHg5NFx4MjhceGMyXHhiN1x4YjhceDg4XHgzZlx4ZTRceDQ2XHgzYVx4NGJceGM4IgotICAgICJceDViXHgxY1x4YjNceGMxXHgwMlx4NDFceDAwXHhlZVx4Y2ZceGFlXHg4MVx4YjFceGI5XHhiM1x4YzlceDA4XHg4MVx4MGIiCi0gICAgIlx4MTBceGExXHhiNVx4NjBceDAxXHg5OVx4ZWJceDlmXHg0NFx4YWVceGY0XHhmZFx4YTRceDkzXHhiOFx4MWFceDllXHgzZCIKLSAgICAiXHg4NFx4ZjZceDMyXHgxMlx4NGVceGYwXHgyM1x4NmVceDVkXHgxZVx4M2JceDdlXHgyOFx4ZmFceGU3XHhhYVx4MDRceDBhIgotICAgICJceDJkXHg1Ylx4MjVceDIxXHg3Nlx4NDVceDlkXHgxZlx4MzlceDc1XHg0MVx4YmFceDJhXHg1OFx4ZmJceDY1XHg5OVx4MDIiCi0gICAgIlx4NDFceDAwXHhjOVx4N2ZceGIxXHhmMFx4MjdceGY0XHg1M1x4ZjZceDM0XHgxMlx4MzNceGVhXHhhYVx4ZDFceGQ5XHgzNSIKLSAgICAiXHgzZlx4NmNceDQyXHhkMFx4ODhceDY2XHhiMVx4ZDBceDVhXHgwZlx4MjBceDM1XHgwMlx4OGJceDlkXHg4Nlx4OThceDQwIgotICAgICJceGI0XHgxNlx4NjZceGI0XHgyZVx4OTJceGVhXHgwZFx4YTNceGI0XHgzMlx4MDRceGI1XHhjZlx4Y2VceDMzXHg1Mlx4NTIiCi0gICAgIlx4NGRceDA0XHgxNlx4YTVceGE0XHg0MVx4ZTdceDAwXHhhZlx4NDZceDE1XHgwM1x4MDJceDQwXHg1NFx4NDlceDRjXHhhNiIKLSAgICAiXHgzZVx4YmFceDAzXHgzN1x4ZTRceGUyXHg0MFx4MjNceGZjXHhkNlx4OWFceDVhXHhlYlx4MDdceGRkXHhkY1x4MDFceDgzIgotICAgICJceGE0XHhkMFx4YWNceDliXHg1NFx4YjBceDUxXHhmMlx4YjFceDNlXHhkOVx4NDlceDA5XHg3NVx4ZWFceGI3XHg3NFx4MTQiCi0gICAgIlx4ZmZceDU5XHhjMVx4ZjdceDY5XHgyZVx4OWFceDJlXHgyMFx4MmJceDM4XHhmY1x4OTFceDBhXHg0N1x4NDFceDc0XHhhZCIKLSAgICAiXHhjOVx4M2NceDFmXHg2N1x4YzlceDgxXHgwMlx4NDBceDQ3XHgxZVx4MDJceDkwXHhmZlx4MGFceGYwXHg3NVx4MDNceDUxIgotICAgICJceGI3XHhmOFx4NzhceDg2XHg0Y1x4YTlceDYxXHhhZFx4YmRceDNhXHg4YVx4N2VceDk5XHgxY1x4NWNceDA1XHg1Nlx4YTkiCi0gICAgIlx4NGNceDMxXHg0Nlx4YTdceGY5XHg4MFx4M2ZceDhmXHg2Zlx4OGFceGUzXHg0Mlx4ZTlceDMxXHhmZFx4OGFceGU0XHg3YSIKLSAgICAiXHgyMlx4MGRceDFiXHg5OVx4YTRceDk1XHg4NFx4OThceDA3XHhmZVx4MzlceGY5XHgyNFx4NWFceDk4XHgzNlx4ZGFceDNkIgotICAgICJceDAyXHg0MVx4MDBceGIwXHg2Y1x4NGZceGRhXHhiYlx4NjNceDAxXHgxOVx4OGRceDI2XHg1Ylx4ZGJceGFlXHg5NFx4MjMiCi0gICAgIlx4YjNceDgwXHhmMlx4NzFceGY3XHgzNFx4NTNceDg4XHg1MFx4OTNceDA3XHg3Zlx4Y2RceDM5XHhlMlx4MTFceDlmXHhjOSIKLSAgICAiXHg4Nlx4MzJceDE1XHg0Zlx4NThceDgzXHhiMVx4NjdceGE5XHg2N1x4YmZceDQwXHgyYlx4NGVceDllXHgyZVx4MGZceDk2IgotICAgICJceDU2XHhlNlx4OThceGVhXHgzNlx4NjZceGVkXHhmYlx4MjVceDc5XHg4MFx4MzlceGY3IjsKLQotLy8ga09BRVBDaXBoZXJ0ZXh0MyBpcyBhIHNhbXBsZSBlbmNyeXB0aW9uIG9mIHxrUGxhaW50ZXh0fCB3aXRoIHxrS2V5M3wgdXNpbmcKLS8vIFJTQSBPQUVQLgotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga09BRVBDaXBoZXJ0ZXh0M1tdID0KLSAgICAiXHhiOFx4MjRceDZiXHg1Nlx4YTZceGVkXHg1OFx4ODFceGFlXHhiNVx4ODVceGQ5XHhhMlx4NWJceDJhXHhkN1x4OTBceGM0IgotICAgICJceDE3XHhlMFx4ODBceDY4XHgxYlx4ZjFceGFjXHgyYlx4YzNceGRlXHhiNlx4OWRceDhiXHhjZVx4ZjBceGM0XHgzNlx4NmYiCi0gICAgIlx4ZWNceDQwXHgwYVx4ZjBceDUyXHhhN1x4MmVceDliXHgwZVx4ZmZceGI1XHhiM1x4ZjJceGYxXHg5Mlx4ZGJceGVhXHhjYSIKLSAgICAiXHgwM1x4YzFceDI3XHg0MFx4MDVceDcxXHgxM1x4YmZceDFmXHgwNlx4NjlceGFjXHgyMlx4ZTlceGYzXHhhN1x4ODVceDJlIgotICAgICJceDNjXHgxNVx4ZDlceDEzXHhjYVx4YjBceGI4XHg4Nlx4M2FceDk1XHhjOVx4OTJceDk0XHhjZVx4ODZceDc0XHgyMVx4NDkiCi0gICAgIlx4NTRceDYxXHgwM1x4NDZceGY0XHhkNFx4NzRceGIyXHg2Zlx4N2NceDQ4XHhiNFx4MmVceGU2XHg4ZVx4MWZceDU3XHgyYSIKLSAgICAiXHgxZlx4YzRceDAyXHg2YVx4YzRceDU2XHhiNFx4ZjVceDlmXHg3Ylx4NjJceDFlXHhhMVx4YjlceGQ4XHg4Zlx4NjRceDIwIgotICAgICJceDJmXHhiMSI7Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGtUd29QcmltZUtleVtdID0KLSAgICAiXHgzMFx4ODJceDA0XHhhMVx4MDJceDAxXHgwMFx4MDJceDgyXHgwMVx4MDFceDAwXHg5M1x4M2FceDRmXHhjOVx4NmFceDBhIgotICAgICJceDZiXHgyOFx4MDRceGZhXHhiN1x4MDVceDU2XHhkZlx4YTBceGFhXHg0Zlx4YWFceGFiXHg5NFx4YTBceGE5XHgyNVx4ZWYiCi0gICAgIlx4YzVceDk2XHhkMlx4ZDRceDY2XHgxNlx4NjJceDJjXHgxM1x4N2JceDkxXHhkMFx4MzZceDBhXHgxMFx4MTFceDZkXHg3YSIKLSAgICAiXHg5MVx4YjZceGU0XHg3NFx4NTdceGMxXHgzZFx4N2FceGJlXHgyNFx4MDVceDNhXHgwNFx4MGJceDczXHg5MVx4NTNceGIxIgotICAgICJceDc0XHgxMFx4ZTFceDg3XHhkY1x4OTFceDI4XHg5Y1x4MWVceGU1XHhmMlx4YjlceGZjXHhhMlx4NDhceDM0XHhiNlx4NzgiCi0gICAgIlx4ZWRceDZkXHg5NVx4ZmJceGYyXHhjMFx4NGVceDFjXHhhNFx4MTVceDAwXHgzY1x4OGFceDY4XHgyYlx4ZDZceGNlXHhkNSIKLSAgICAiXHhiM1x4OWZceDY2XHgwMlx4YTdceDBkXHgwOFx4YTNceDIzXHg5Ylx4ZTVceDM2XHg5Nlx4MTNceDIyXHhmOVx4NjlceGE2IgotICAgICJceDg3XHg4OFx4OWJceDg1XHgzZlx4ODNceDljXHhhYlx4MWFceDFiXHg2ZFx4OGRceDE2XHhmNFx4NWVceGJkXHhlZVx4NGIiCi0gICAgIlx4NTlceDU2XHhmOFx4OWRceDU4XHhjZFx4ZDJceDgzXHg4NVx4NTlceDQzXHg4NFx4NjNceDRmXHhlNlx4MWFceDg2XHg2NiIKLSAgICAiXHgwZFx4YjVceGEwXHg4N1x4ODlceGI2XHgxM1x4ODJceDQzXHhkYVx4MzRceDkyXHgzYlx4NjhceGM0XHg5NVx4NzFceDJmIgotICAgICJceDE1XHhjMlx4ZTBceDQzXHg2N1x4M2NceDA4XHgwMFx4MzZceDEwXHhjM1x4YjRceDQ2XHg0Y1x4NGVceDZlXHhmNVx4NDQiCi0gICAgIlx4YTlceDA0XHg0NFx4OWRceGNlXHhjN1x4MDVceDc5XHhlZVx4MTFceGNmXHhhZlx4MmNceGQ3XHg5YVx4MzJceGQzXHhhNSIKLSAgICAiXHgzMFx4ZDRceDNhXHg3OFx4NDNceDM3XHg3NFx4MjJceDkwXHgyNFx4MDRceDExXHhkN1x4OTVceDA4XHg1Mlx4YTRceDcxIgotICAgICJceDQxXHg2OFx4OTRceGIwXHhhMFx4YzNceGVjXHg0ZVx4ZDJceGM0XHgzMFx4NzFceDk4XHg2NFx4OWNceGUzXHg3Y1x4NzYiCi0gICAgIlx4ZWZceDMzXHhhM1x4MmJceGIxXHg4N1x4NjNceGQyXHg1Y1x4MDlceGZjXHg5MFx4MmRceDkyXHhmNFx4NTdceDAyXHgwMSIKLSAgICAiXHgwM1x4MDJceDgyXHgwMVx4MDBceDYyXHgyNlx4ZGZceGRiXHg5Y1x4MDZceGYyXHgxYVx4YWRceGZjXHg3YVx4MDNceDhmIgotICAgICJceDNmXHhjMFx4NzFceDhhXHg3MVx4YzdceGI4XHg2Ylx4MWJceDZlXHg5Zlx4ZDlceDBmXHgzN1x4MzhceDQ0XHgwZVx4ZWMiCi0gICAgIlx4MWRceDYyXHg1Mlx4NjFceDM1XHg3OVx4NWNceDBhXHhiNlx4NDhceGZjXHg2MVx4MjRceDk4XHg0ZFx4OGZceGQ2XHgyOCIKLSAgICAiXHhmY1x4N2VceGMyXHhhZVx4MjZceGFkXHg1Y1x4ZjdceGI2XHgzN1x4Y2JceGEyXHhiNVx4ZWJceGFmXHhlOFx4NjBceGM1IgotICAgICJceGJkXHg2OVx4ZWVceGExXHhkMVx4NTNceDE2XHhkYVx4Y2RceGNlXHhmYlx4NDhceGYzXHhiOVx4NTJceGExXHhkNVx4ODkiCi0gICAgIlx4NjhceDZkXHg2M1x4NTVceDdkXHhiMVx4OWFceGM3XHhlNFx4ODlceGUzXHhjZFx4MTRceGVlXHhhY1x4NmZceDVlXHgwNSIKLSAgICAiXHhjMlx4MTdceGJkXHg0M1x4NzlceGI5XHg2Mlx4MTdceDUwXHhmMVx4MTlceGFmXHhiMFx4NjdceGFlXHgyYVx4NTdceGJkIgotICAgICJceGM3XHg2Nlx4YmNceGYzXHhiM1x4NjRceGExXHhlM1x4MTZceDc0XHg5ZVx4ZWFceDAyXHg1Y1x4YWJceDk0XHhkOFx4OTciCi0gICAgIlx4MDJceDQyXHgwY1x4MmNceGJhXHg1NFx4YjlceGFmXHhlMFx4NDVceDkzXHhhZFx4N2ZceGIzXHgxMFx4NmFceDk2XHg1MCIKLSAgICAiXHg0Ylx4YWZceGNmXHhjOFx4MjdceDYyXHgyZFx4ODNceGU5XHgyNlx4YzZceDk0XHhjMVx4ZWZceDVjXHg4ZVx4MDZceDQyIgotICAgICJceDUzXHhlNVx4NTZceGFmXHhjMlx4OTlceDAxXHhhYVx4OWFceDcxXHhiY1x4ZThceDIxXHgzM1x4MmFceDJkXHhhM1x4MzYiCi0gICAgIlx4YWNceDFiXHg4Nlx4MTlceGY4XHhjZFx4MWZceDgwXHhhNFx4MjZceDk4XHhiOFx4OWZceDYyXHg2Mlx4ZDVceDFhXHg3ZiIKLSAgICAiXHhlZVx4ZGJceGRmXHg4MVx4ZDNceDIxXHhkYlx4MzNceDkyXHhlZVx4ZmZceGUyXHgyZlx4MzJceDc3XHg3M1x4NmFceDU4IgotICAgICJceGFiXHgyMVx4ZjNceGUzXHhlMVx4YmNceDRmXHgxMlx4NzJceGE2XHhiNVx4YzJceGZiXHgyN1x4OWVceGM4XHhjYVx4YWIiCi0gICAgIlx4NjRceGEwXHg4N1x4MDdceDlkXHhlZlx4Y2FceDBmXHhkYlx4MDJceDgxXHg4MVx4MDBceGU2XHhkM1x4NGRceGMwXHhhMSIKLSAgICAiXHg5MVx4MGVceDYyXHhmZFx4YjBceGRkXHhjNlx4MzBceGI4XHg4Y1x4Y2JceDE0XHhjMVx4NGJceDY5XHgzMFx4ZGRceGNkIgotICAgICJceDg2XHg2N1x4Y2JceDM3XHgxNFx4YzVceDAzXHhkMlx4YjRceDY5XHhhYlx4M2RceGU1XHgxNlx4ODFceDBmXHhlNVx4NTAiCi0gICAgIlx4ZjRceDE4XHhiMVx4ZWNceGJjXHg3MVx4ZTlceDgwXHg5OVx4MDZceGU0XHhhM1x4ZmVceDQ0XHg4NFx4NGFceDJkXHgxZSIKLSAgICAiXHgwN1x4N2ZceDIyXHg3MFx4NmRceDRmXHhkNFx4OTNceDBiXHg4Ylx4OTlceGNlXHgxZVx4YWJceGNkXHg0Y1x4ZDJceGQzIgotICAgICJceDEwXHg0N1x4NWNceDA5XHg5Zlx4NmRceDgyXHhjMFx4MDhceDc1XHhlM1x4M2RceDgzXHhjMlx4MTlceDUwXHgyOVx4ZWMiCi0gICAgIlx4MWZceDg0XHgyOVx4Y2NceGYxXHg1Nlx4ZWVceGJkXHg1NFx4NWRceGU2XHgxOVx4ZGZceDBkXHgxY1x4YTRceGJiXHgwYSIKLSAgICAiXHhmZVx4ODRceDQ0XHgyOVx4MWRceGY5XHg1Y1x4ODBceDk2XHg1Ylx4MjRceGI0XHhmN1x4MDJceDFiXHgwMlx4ODFceDgxIgotICAgICJceDAwXHhhM1x4NDhceGYxXHg5Y1x4NThceGMyXHg1Zlx4MzhceGZiXHhkOFx4MTJceDM5XHhmMVx4OGVceDczXHhhMVx4Y2YiCi0gICAgIlx4NzhceDEyXHhlMFx4ZWRceDJhXHhiYlx4ZWZceGFjXHgyM1x4YjJceGJmXHhkNlx4MGNceGU5XHg2ZVx4MWVceGFiXHhlYSIKLSAgICAiXHgzZlx4NjhceDM2XHhhN1x4MWZceGU1XHhhYlx4ZTBceDg2XHhhNVx4NzZceDMyXHg5OFx4ZGRceDc1XHhiNVx4MmJceGJjIgotICAgICJceGNiXHg4YVx4MDNceDAwXHg3Y1x4MmVceGNhXHhmOFx4YmNceDE5XHhlNFx4ZTNceGEzXHgzMVx4YmRceDFkXHgyMFx4MmIiCi0gICAgIlx4MDlceGFkXHg2Zlx4NGNceGVkXHg0OFx4ZDRceGRmXHg4N1x4ZjlceGYwXHg0Nlx4YjlceDg2XHg0Y1x4NGJceDcxXHhlNyIKLSAgICAiXHg0OFx4NzhceGRjXHhlZFx4YzdceDgyXHgwMlx4NDRceGQzXHhhNlx4YjNceDEwXHg1Zlx4NjJceDgxXHhmY1x4YjhceGU0IgotICAgICJceDBlXHhmNFx4MWFceGRkXHhhYlx4M2ZceGJjXHg2M1x4NzlceDViXHgzOVx4NjlceDVlXHhlYVx4YTlceDE1XHhmZVx4OTAiCi0gICAgIlx4ZWNceGRhXHg3NVx4MDJceDgxXHg4MVx4MDBceDk5XHhlMlx4MzNceGQ1XHhjMVx4MGJceDVlXHhlY1x4YTlceDIwXHg5MyIKLSAgICAiXHhkOVx4NzVceGQwXHg1ZFx4ZGNceGI4XHg4MFx4ZGNceGYwXHhjYlx4M2VceDg5XHgwNFx4NDVceDMyXHgyNFx4YjhceDgzIgotICAgICJceDU3XHhlMVx4Y2RceDliXHhjN1x4N2VceDk4XHhiOVx4YWJceDVmXHhlZVx4MzVceGY4XHgxMFx4NzZceDlkXHhkMlx4ZjYiCi0gICAgIlx4OWJceGFiXHgxMFx4YWZceDQzXHgxN1x4ZmVceGQ4XHg1OFx4MzFceDczXHg2OVx4NWFceDU0XHhjMVx4YTBceDQ4XHhkZiIKLSAgICAiXHhlM1x4MGNceGIyXHg1ZFx4MTFceDM0XHgxNFx4NzJceDg4XHhkZFx4ZTFceGUyXHgwYVx4ZGFceDNkXHg1Ylx4YmZceDllIgotICAgICJceDU3XHgyYVx4YjBceDRlXHg5N1x4N2VceDU3XHhkNlx4YmJceDhhXHhjNlx4OWRceDZhXHg1OFx4MWJceGRkXHhmNlx4MzkiCi0gICAgIlx4ZjRceDdlXHgzOFx4M2VceDk5XHg2Nlx4OTRceGIzXHg2OFx4NmRceGQyXHgwN1x4NTRceDU4XHgyZFx4NzBceGJlXHhhNiIKLSAgICAiXHgzZFx4YWJceDBlXHhlN1x4NmRceGNkXHhmYVx4MDFceDY3XHgwMlx4ODFceDgwXHg2Y1x4ZGJceDRiXHhiZFx4OTBceDgxIgotICAgICJceDk0XHhkMFx4YTdceGU1XHg2MVx4N2JceGY2XHg1ZVx4ZjdceGMxXHgzNFx4ZmFceGI3XHg0MFx4OWVceDFjXHg3ZFx4NGEiCi0gICAgIlx4NzJceGMyXHg3N1x4MmFceDhlXHhiM1x4NDZceDQ5XHg2OVx4YzdceGYxXHg3Zlx4OWFceGNmXHgxYVx4MTVceDQzXHhjNyIKLSAgICAiXHhlYlx4MDRceDZlXHg0ZVx4Y2NceDY1XHhlOFx4ZjlceDIzXHg3Mlx4N2RceGRkXHgwNlx4YWNceGFhXHhmZFx4NzRceDg3IgotICAgICJceDUwXHg3ZFx4NjZceDk4XHg5N1x4YzJceDIxXHgyOFx4YmVceDE1XHg3Mlx4MDZceDczXHg5Zlx4ODhceDllXHgzMFx4OGQiCi0gICAgIlx4ZWFceDVhXHhhNlx4YTBceDJmXHgyNlx4NTlceDg4XHgzMlx4NGJceGVmXHg4NVx4YTVceGU4XHg5ZVx4ODVceDAxXHg1NiIKLSAgICAiXHhkOFx4OGRceDE5XHhjY1x4YjVceDk0XHhlY1x4NTZceGE4XHg3Ylx4NDJceGI0XHhhMlx4YmNceDkzXHhjN1x4N2ZceGQyIgotICAgICJceGVjXHhmYlx4OTJceDI2XHg0Nlx4M2ZceDQ3XHgxYlx4NjNceGZmXHgwYlx4NDhceDkxXHhhM1x4MDJceDgxXHg4MFx4MmMiCi0gICAgIlx4NGFceGI5XHhhNFx4NDZceDdiXHhmZlx4NTBceDdlXHhiZlx4NjBceDQ3XHgzYlx4MmJceDY2XHg4Mlx4ZGNceDBlXHg1MyIKLSAgICAiXHg2NVx4NzFceGU5XHhkYVx4MmFceGI4XHgzMlx4OTNceDQyXHhiN1x4ZmZceGVhXHg2N1x4NjZceGYxXHhiY1x4ODdceDI4IgotICAgICJceDY1XHgyOVx4NzlceGNhXHhhYlx4OTNceDU2XHhkYVx4OTVceGMxXHgyNlx4NDRceDNkXHgyN1x4YzFceDkxXHhjNlx4OWIiCi0gICAgIlx4ZDlceGVjXHg5ZFx4YjdceDQ5XHhlN1x4MTZceGVlXHg5OVx4ODdceDUwXHg5NVx4ODFceGQ0XHg1Y1x4NWJceDVhXHg1ZCIKLSAgICAiXHgwYVx4NDNceGE1XHhhN1x4OGZceDVhXHg4MFx4NDlceGEwXHhiN1x4MTBceDg1XHhjN1x4ZjRceDQyXHgzNFx4ODZceGI2IgotICAgICJceDVmXHgzZlx4ODhceDllXHhjN1x4ZjVceDU5XHgyOVx4MzlceDY4XHg0OFx4ZjJceGQ3XHgwOFx4NWJceDkyXHg4ZVx4NmIiCi0gICAgIlx4ZWFceGE1XHg2M1x4NWZceGMwXHhmYlx4ZTRceGUxXHhiMlx4N2RceGI3XHg0MFx4ZTlceDU1XHgwNlx4YmZceDU4XHgyNSIKLSAgICAiXHg2ZiI7Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGtUd29QcmltZUVuY3J5cHRlZE1lc3NhZ2VbXSA9IHsKLSAgICAweDYzLCAweDBhLCAweDMwLCAweDQ1LCAweDQzLCAweDExLCAweDQ1LCAweGI3LCAweDk5LCAweDY3LCAweDkwLCAweDM1LAotICAgIDB4MzcsIDB4MjcsIDB4ZmYsIDB4YmMsIDB4ZTAsIDB4YmYsIDB4YTYsIDB4ZDEsIDB4NDcsIDB4NTAsIDB4YmIsIDB4NmMsCi0gICAgMHgxYywgMHhhYSwgMHg2NiwgMHhmMiwgMHhmZiwgMHg5ZCwgMHg5YSwgMHhhNiwgMHhiNCwgMHgxNiwgMHg2MywgMHhiMCwKLSAgICAweGExLCAweDdjLCAweDdjLCAweDBjLCAweGVmLCAweGIzLCAweDY2LCAweDUyLCAweDQyLCAweGQ3LCAweDVlLCAweGYzLAotICAgIDB4YTQsIDB4MTUsIDB4MzMsIDB4NDAsIDB4NDMsIDB4ZTgsIDB4YjEsIDB4ZmMsIDB4ZTAsIDB4NDIsIDB4ODMsIDB4NDYsCi0gICAgMHgyOCwgMHhjZSwgMHhkZSwgMHg3YiwgMHgwMSwgMHhlYiwgMHgyOCwgMHg5MiwgMHg3MCwgMHhkZiwgMHg4ZCwgMHg1NCwKLSAgICAweDllLCAweGVkLCAweDIzLCAweGI0LCAweDc4LCAweGMzLCAweGNhLCAweDg1LCAweDUzLCAweDQ4LCAweGQ2LCAweDhhLAotICAgIDB4ODcsIDB4ZjcsIDB4NjksIDB4Y2QsIDB4ODIsIDB4OGMsIDB4NGYsIDB4NWMsIDB4MDUsIDB4NTUsIDB4YTYsIDB4NzgsCi0gICAgMHg4OSwgMHhhYiwgMHg0YywgMHhkOCwgMHhhOSwgMHhkNiwgMHhhNSwgMHhmNCwgMHgyOSwgMHg0YywgMHgyMywgMHhjOCwKLSAgICAweGNmLCAweGYwLCAweDRjLCAweDY0LCAweDZiLCAweDRlLCAweDAyLCAweDE3LCAweDY5LCAweGQ2LCAweDQ3LCAweDgzLAotICAgIDB4MzAsIDB4NDMsIDB4MDIsIDB4MjksIDB4ZGEsIDB4ZGEsIDB4NzUsIDB4M2IsIDB4ZDcsIDB4YTcsIDB4MmIsIDB4MzEsCi0gICAgMHhiMywgMHhlOSwgMHg3MSwgMHhhNCwgMHg0MSwgMHhmNywgMHgyNiwgMHg5YiwgMHhjZCwgMHgyMywgMHhmYSwgMHg0NSwKLSAgICAweDNjLCAweDliLCAweDdkLCAweDI4LCAweGY3LCAweGY5LCAweDY3LCAweDA0LCAweGJhLCAweGZjLCAweDQ2LCAweDc1LAotICAgIDB4MTEsIDB4M2MsIDB4ZDUsIDB4MjcsIDB4NDMsIDB4NTMsIDB4YjEsIDB4YjYsIDB4OWUsIDB4MTgsIDB4ZWIsIDB4MTEsCi0gICAgMHhiNCwgMHgyNSwgMHgyMCwgMHgzMCwgMHgwYiwgMHhlMCwgMHgxYywgMHgxNywgMHgzNiwgMHgyMiwgMHgxMCwgMHgwZiwKLSAgICAweDk5LCAweGI1LCAweDUwLCAweDE0LCAweDczLCAweDA3LCAweGYwLCAweDJmLCAweDVkLCAweDRjLCAweGUzLCAweGYyLAotICAgIDB4ODYsIDB4YzIsIDB4MDUsIDB4YzgsIDB4MzgsIDB4ZWQsIDB4ZWIsIDB4MmEsIDB4NGEsIDB4YWIsIDB4NzYsIDB4ZTMsCi0gICAgMHgxYSwgMHg3NSwgMHg0NCwgMHhmNywgMHg2ZSwgMHg5NCwgMHhkYywgMHgyNSwgMHg2MiwgMHg3ZSwgMHgzMSwgMHhjYSwKLSAgICAweGMyLCAweDczLCAweDUxLCAweGI1LCAweDAzLCAweGZiLCAweGY5LCAweGY2LCAweGI1LCAweDhkLCAweDRlLCAweDZjLAotICAgIDB4MjEsIDB4MGUsIDB4ZjksIDB4OTcsIDB4MjYsIDB4NTcsIDB4ZjMsIDB4NTIsIDB4NzIsIDB4MDcsIDB4ZjgsIDB4YjQsCi0gICAgMHhjZCwgMHhiNCwgMHgzOSwgMHhjZiwgMHhiZiwgMHg3OCwgMHhjYywgMHhiNiwgMHg4NywgMHhmOSwgMHhiNywgMHg4YiwKLSAgICAweDZhLCAweGNlLCAweDlmLCAweGM4LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1RocmVlUHJpbWVLZXlbXSA9Ci0gICAgIlx4MzBceDgyXHgwNFx4ZDdceDAyXHgwMVx4MDFceDAyXHg4Mlx4MDFceDAwXHg2Mlx4OTFceGU5XHhlYVx4YjNceDVkXHg2YyIKLSAgICAiXHgyOVx4YWVceDIxXHg4M1x4YmJceGI1XHg4Mlx4YjFceDllXHhlYVx4ZTBceDY0XHg1Ylx4MWVceDJmXHg1ZVx4MmNceDBhIgotICAgICJceDgwXHgzZFx4MjlceGQ0XHhmYVx4OWFceGU3XHg0NFx4ZTZceDIxXHhiZFx4OThceGMwXHgzZFx4ZTBceDUzXHg1OVx4YWUiCi0gICAgIlx4ZDNceDNlXHhmZVx4YzRceGMyXHhjNFx4NWFceDVhXHg4OVx4MDdceGY0XHg0Zlx4ZGNceGIwXHg2YVx4ZDRceDNlXHg5OSIKLSAgICAiXHg3ZFx4N2FceDk3XHgyNlx4NGVceGUxXHg5M1x4Y2FceDZlXHhlZFx4MDdceGZjXHhiNFx4ZmFceDk1XHgxZVx4NzNceDdiIgotICAgICJceDg2XHgwOFx4NmFceGI5XHhkNFx4MjlceGIwXHg3ZVx4NTlceGI3XHg5ZFx4N2JceGViXHg2N1x4NmVceGYwXHhiYlx4NWUiCi0gICAgIlx4Y2ZceGI5XHhjZFx4NThceDkzXHhmMFx4ZTdceDg4XHgxN1x4NmNceDBkXHg3Nlx4MWVceGI5XHgyN1x4OWFceDRkXHgwMiIKLSAgICAiXHgxNlx4YjZceDQ5XHg2ZFx4YTdceDgzXHgyM1x4NGRceDAyXHg0OFx4MGNceDBjXHgxZlx4MGVceDg1XHgyMVx4ZTNceDA2IgotICAgICJceDc2XHgwYVx4NzNceGU2XHhjMVx4MjFceGZhXHgzMFx4MThceDc4XHgyOVx4NWNceDMxXHhkMFx4MjlceGFlXHg2Zlx4N2QiCi0gICAgIlx4ODdceGQ4XHgyZlx4MTZceGZhXHhiY1x4NjdceDhhXHg5NFx4NzFceDU5XHg5Ylx4ZWNceDIyXHg0MFx4NTVceDlmXHhjMiIKLSAgICAiXHg5NFx4YjVceGJkXHg3OFx4MDFceGM5XHhlZlx4MThceGM4XHg2ZFx4MGRceGRjXHg1M1x4NDJceGIyXHg1Y1x4YWJceDY1IgotICAgICJceDA1XHhiZFx4MzVceDA4XHg4NVx4MWJceGY4XHhlOVx4NDdceGJjXHhmZVx4YzVceGFlXHg0N1x4MjlceDYzXHg0NFx4OGUiCi0gICAgIlx4NGRceGI3XHg0N1x4YWJceDBkXHhkOFx4NzZceDY4XHg0Zlx4YzdceDA3XHgwMlx4ZTRceDg2XHhiMFx4Y2ZceGQ4XHgxOSIKLSAgICAiXHhhZFx4ZjRceDg1XHg3Nlx4OGJceDNiXHg0ZVx4NDBceDhkXHgyOVx4N2FceDhhXHgwN1x4MzZceGYzXHg3OFx4YWVceDE3IgotICAgICJceGE2XHg4Zlx4NTNceDU4XHg2NVx4NGNceDg2XHg5ZVx4ZDdceDhiXHhlY1x4MzhceDRmXHg5OVx4YzdceDAyXHgwMVx4MDMiCi0gICAgIlx4MDJceDgyXHgwMVx4MDBceDQxXHhiNlx4OWJceGYxXHhjY1x4ZThceGYyXHhjNlx4NzRceDE2XHg1N1x4ZDJceDc5XHgwMSIKLSAgICAiXHhjYlx4YmZceDQ3XHg0MFx4NDJceGU3XHg2OVx4NzRceGU5XHg3Mlx4YjFceGFhXHhkM1x4NzFceDM4XHhhN1x4MTFceGVmIgotICAgICJceDgzXHg0NFx4MTZceDdlXHg2NVx4ZDVceDdlXHg5NVx4OGNceGU2XHg3NFx4OGNceGQ0XHhhOVx4ZDhceDgxXHhkOFx4M2MiCi0gICAgIlx4M2NceDViXHg1YVx4YTJceGRmXHhlOFx4NzVceDljXHg4ZFx4N2ZceDEwXHhmZVx4NTFceGJhXHgxOVx4ODlceGViXHhiNyIKLSAgICAiXHhkY1x4NDlceGYzXHg1YVx4YThceDc4XHhhN1x4MGVceDE0XHg0Y1x4ZmRceDA0XHgwNVx4OWNceDdiXHhlMlx4YzVceGEzIgotICAgICJceDA0XHhlZVx4ZDlceDRjXHhmZFx4N2RceDQ3XHhiMFx4MGRceDliXHgzZFx4NzBceDkxXHg4MVx4MmNceGFiXHgyYlx4ODciCi0gICAgIlx4YWRceDExXHg2OFx4MjRceGZjXHgyYlx4ZDRceGVlXHg1ZVx4MjhceGViXHg2ZFx4YWJceGRlXHgwZlx4NzdceDE1XHg1OCIKLSAgICAiXHg3Nlx4MzlceGM5XHg1OVx4M2FceDdmXHgxOVx4OWRceGM2XHg3ZVx4ODZceGU0XHhkNVx4MzhceDcwXHg5ZVx4YWVceGI5IgotICAgICJceGZiXHgzM1x4MzNceGQxXHgwY1x4MmRceGFiXHgwMVx4MjBceGUxXHg4Ylx4MjlceDk5XHhkM1x4ZWJceDg3XHgwNVx4NzIiCi0gICAgIlx4YWFceDQzXHg1OFx4NjRceDhlXHg5ZVx4MzFceGRiXHg0NVx4OWJceDJiXHhhY1x4NThceDgwXHg1ZFx4MzNceGEyXHg0MyIKLSAgICAiXHgwNVx4OTZceGNjXHhjYVx4MmRceDA0XHg1Zlx4ZDZceGI3XHgzZFx4OGJceDhmXHgyZFx4YTNceGE1XHhmOFx4NzNceGY1IgotICAgICJceGQ3XHhjMFx4MTlceGZmXHgxMFx4ZTZceGVlXHgzYVx4MjZceDJmXHhlMVx4NjRceDNkXHgxMVx4Y2RceDJkXHhlNFx4MGEiCi0gICAgIlx4ODRceDI3XHhlM1x4Y2JceDE2XHg2Mlx4MTlceGU3XHhlM1x4MGRceDEzXHhlOFx4MDlceDVhXHg1M1x4ZDBceDIwXHg1NiIKLSAgICAiXHgxNVx4ZjVceGIzXHg2N1x4YWNceGExXHhiNVx4OTRceDZiXHhhYlx4ZGNceDcxXHhjN1x4YmZceDBhXHhkZVx4NzZceGY1IgotICAgICJceDAzXHhhMFx4MzBceGQ4XHgyN1x4OWRceDAwXHgyYlx4MDJceDU3XHgwMFx4ZjFceDRmXHhjMlx4ODZceDEzXHgwNlx4MTciCi0gICAgIlx4ZjdceDY5XHg3ZVx4MzdceGRmXHg2N1x4YzVceDMyXHhhMFx4NzRceDFjXHgzMlx4NjlceDBmXHg5Zlx4MDhceDg4XHgyNCIKLSAgICAiXHhiMVx4NTFceGJjXHhiY1x4OTJceGJhXHg3M1x4MWZceDljXHg3NVx4YzJceDE0XHg2ZFx4NGZceGM0XHg1YVx4Y2ZceGRhIgotICAgICJceDQ0XHgzNVx4MDBceDZiXHg0Mlx4M2JceDlmXHgxNFx4ZjFceDA1XHhiM1x4NTFceDIyXHhiNlx4YmVceDljXHhlMFx4YzEiCi0gICAgIlx4NWNceDQ4XHg2MVx4ZGZceDRlXHg0Y1x4NzJceGI4XHgwNVx4MzVceDdjXHhhY1x4ZjFceGJiXHhhMFx4M2JceDJhXHhlYSIKLSAgICAiXHhmN1x4ODZceGU5XHhkMlx4ZmZceDFlXHgxZFx4MDJceDU2XHgwMFx4Y2FceGIxXHgzOVx4ZjZceGEyXHhjNlx4M2JceDY1IgotICAgICJceDQ1XHgyZlx4MzlceDAwXHhjZFx4NmVceGQ2XHg1NVx4ZjdceDcxXHgzN1x4ODlceGMyXHhlN1x4N2FceGMwXHgxYVx4YTYiCi0gICAgIlx4MmZceGVhXHgxN1x4N2NceGFhXHgyYVx4OTFceDhmXHhkNFx4YzdceDUwXHg4Ylx4YWJceDhlXHg5OVx4M2JceDMzXHg5MSIKLSAgICAiXHhiY1x4MDJceDEwXHg1OFx4NGJceDU4XHg0MFx4OWJceGM0XHg4Zlx4NDhceDJiXHhhN1x4NDRceGZkXHgwN1x4MDRceGYwIgotICAgICJceDk4XHg2N1x4NTZceGVhXHgyNVx4OTJceDhiXHgyZVx4NGJceDRhXHhhMVx4ZDNceGMyXHhhNFx4YjRceDliXHg1OVx4NzAiCi0gICAgIlx4MzJceGE2XHhkOFx4OGJceGQ5XHgwMlx4NTdceDAwXHhhMFx4ZGZceGQ3XHgwNFx4MGNceGFlXHhiYVx4YTRceGYwXHhmZSIKLSAgICAiXHhjZlx4ZWFceDQ1XHgyZVx4MjFceGMwXHg0ZFx4NjhceDIxXHg5Ylx4NWZceGJmXHg1Ylx4MDVceDZkXHhjYlx4OGJceGQzIgotICAgICJceDI4XHg2MVx4ZDFceGEyXHgxNVx4MTJceGY5XHgyY1x4MGRceDllXHgzNVx4MmRceDkxXHhkZlx4ZTZceGQ4XHgyM1x4NTUiCi0gICAgIlx4OWNceGQ2XHhkMlx4NmFceDBkXHhmNlx4MDNceGNjXHhlMFx4YzFceGNmXHgyOVx4YmRceGViXHgyYlx4OTJceGRhXHhlYiIKLSAgICAiXHhlYVx4MzRceDMyXHhmN1x4MjVceDU4XHhjZVx4NTNceDFkXHhmNlx4N2RceDE1XHg3Y1x4YzdceDQ3XHg0Zlx4YWZceDQ2IgotICAgICJceDhjXHhhYVx4MTRceDEzXHgwMlx4NTZceDAwXHg4N1x4MjBceGQxXHg0Zlx4MTdceDJlXHhkMlx4NDNceDgzXHg3NFx4ZDAiCi0gICAgIlx4YWJceDMzXHg5Zlx4MzlceDhlXHhhNFx4ZjZceDI1XHgwNlx4ODFceGVmXHhhN1x4MmFceGJjXHg2ZVx4Y2FceDljXHgwZiIKLSAgICAiXHhhOFx4NzFceDcxXHhiNlx4NWZceGUzXHgyZlx4OGJceDA3XHhjN1x4YjRceDY2XHgyN1x4NzdceGI2XHg3ZFx4NTZceGI1IgotICAgICJceDkwXHgzMlx4M2FceGQ1XHhiZFx4MmRceGI0XHhkYVx4YzdceGM0XHhkOFx4YThceGFmXHg1OFx4YTBceDY1XHg5YVx4MzkiCi0gICAgIlx4ZjFceDZlXHg2MVx4YjJceDFlXHhkY1x4ZGNceDZiXHhlMlx4ODFceGMzXHgyM1x4MTJceDNiXHhhMFx4MjFceGM0XHg5MCIKLSAgICAiXHg1ZFx4M2JceDAyXHg1N1x4MDBceGU2XHg4YVx4YWFceGI4XHg2ZFx4MmNceDgxXHg0M1x4YjVceGQ2XHhhMFx4MmJceDQyIgotICAgICJceDQ5XHhhOVx4MGFceDUxXHhmYVx4MThceGM4XHgzMlx4ZWFceDU0XHgxOFx4ZjNceDYwXHhjMlx4YjVceDRhXHg0M1x4MDUiCi0gICAgIlx4OTNceDljXHgwMVx4ZDlceDI4XHhlZFx4NzNceGZhXHg4Mlx4YmNceDEyXHg2NFx4Y2JceGM0XHgyNFx4YTlceDNlXHhhZSIKLSAgICAiXHg3Y1x4NGJceDhmXHg5NFx4NTdceDdiXHgxNFx4MTBceDQxXHhkY1x4NjJceDEyXHg4Y1x4YjJceDRhXHg3Y1x4ZjZceDUzIgotICAgICJceGQ0XHhjNlx4ZTRceGRhXHhkMVx4YTJceDAwXHgwZVx4M2RceDMwXHhmN1x4MDVceDRmXHgxZFx4ODJceGJjXHg1Mlx4ZDkiCi0gICAgIlx4YjFceDMwXHg4Mlx4MDFceDBhXHgzMFx4ODJceDAxXHgwNlx4MDJceDU2XHgwMFx4ODRceDEyXHg0Zlx4ZjdceDNiXHg2NSIKLSAgICAiXHg1M1x4MzRceDZjXHg2Y1x4NGRceDc3XHhkZlx4ZmRceDFmXHhiNlx4MTZceGUyXHgyNVx4MTVceGNhXHhjOVx4YzFceDQxIgotICAgICJceDlhXHg1MFx4ZGFceGViXHg4OFx4NGZceDNkXHhiM1x4MDFceDAwXHg0NFx4YzRceGFjXHhlN1x4MTRceDYyXHhhNlx4NTYiCi0gICAgIlx4ZGVceGM1XHhiN1x4YzNceDFkXHgwN1x4YmRceDdkXHg2NFx4YzVceDdlXHg0NVx4MjVceDU2XHhlZFx4N2FceGQyXHgxNCIKLSAgICAiXHhkYlx4NGVceDI3XHhkNFx4MWZceGY4XHg5NFx4YTdceGVmXHgwN1x4Y2VceGRiXHgyNFx4YjdceGRkXHg3MVx4NWNceDYzIgotICAgICJceGM5XHgzM1x4ZmVceGRlXHg0MFx4NTJceGViXHgwMlx4NTVceDU4XHgwY1x4MzVceDRmXHg3Y1x4ZWVceDM3XHg3OFx4NDgiCi0gICAgIlx4NDhceDMzXHhhNVx4M2ZceGZlXHgxNVx4MjRceDBmXHg0MVx4NmVceDBlXHg4N1x4MzFceDJiXHg4MVx4MTFceDhiXHgzYyIKLSAgICAiXHg5ZFx4MDVceDhhXHgyOVx4MjJceDAwXHhhYVx4ZDhceDgzXHgxZFx4ZWZceDYyXHhlY1x4NmVceGU0XHg5NFx4ODNceGNmIgotICAgICJceGQ3XHg2OFx4YWZceGQzXHhhOFx4ZWRceGQ4XHhmZVx4ZDhceGMzXHg4Zlx4NDhceGZjXHg4Y1x4MGRceGU3XHg4OVx4NmYiCi0gICAgIlx4ZTJceGJmXHhmYlx4MGRceGM1XHg0YVx4MDVceDM0XHg5Mlx4MThceDdhXHg5M1x4YTBceGU4XHg0Mlx4ODZceDIyXHhhOSIKLSAgICAiXHhlOVx4ODBceDM3XHg0N1x4MDJceDU1XHg2MFx4NzZceGFiXHhkZVx4MmJceGY1XHhhMlx4MmNceGFhXHgwY1x4OTlceDgxIgotICAgICJceGVlXHg3Mlx4MmNceDdkXHgyMlx4NTlceDJhXHgzNVx4ZWFceDUwXHg0ZVx4NDdceDZiXHg5Mlx4MmRceDMwXHhhMVx4MDEiCi0gICAgIlx4YTVceDllXHgyNlx4NmVceDI3XHhjYVx4ZjVceGYyXHg4N1x4NWRceDMxXHhhZlx4ZTlceDMyXHhjZFx4MTBceGZkXHg0ZCIKLSAgICAiXHhkYlx4ZjlceDg2XHgwNVx4MTJceDFiXHgwMVx4ODRceDU1XHg5N1x4NWZceGUyXHg3OFx4MjdceGQ5XHhlNFx4MjZceDdkIgotICAgICJceGFiXHgwZVx4ZTBceDFiXHg2Zlx4Y2JceDRiXHgxNFx4ZGRceGRjXHhkY1x4OGJceGU4XHg5Zlx4ZDBceDYyXHg5Nlx4Y2EiCi0gICAgIlx4Y2YiOwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBrVGhyZWVQcmltZUVuY3J5cHRlZE1lc3NhZ2VbXSA9IHsKLSAgICAweDU4LCAweGQ5LCAweGVhLCAweDhhLCAweGY2LCAweDNkLCAweGI0LCAweGQ5LCAweGY3LCAweGJiLCAweDAyLCAweGM1LAotICAgIDB4NTgsIDB4ZDIsIDB4YTksIDB4NDYsIDB4ODAsIDB4NzAsIDB4NzAsIDB4MTYsIDB4MDcsIDB4NjQsIDB4MzIsIDB4NGMsCi0gICAgMHg0ZSwgMHg5MiwgMHg2MSwgMHhiNywgMHhmZiwgMHg5MiwgMHhkYywgMHhmYywgMHhmOCwgMHhmMCwgMHgyYywgMHg4NCwKLSAgICAweDU2LCAweGJjLCAweGU1LCAweDkzLCAweDc2LCAweGU1LCAweGEzLCAweDcyLCAweDk4LCAweGYyLCAweGRmLCAweGVmLAotICAgIDB4OTksIDB4NTMsIDB4ZjYsIDB4ZDgsIDB4NGIsIDB4MDksIDB4YWMsIDB4YTksIDB4YTMsIDB4ZGIsIDB4NjMsIDB4YTEsCi0gICAgMHhiNSwgMHgwOSwgMHg4ZSwgMHg0MCwgMHg4NCwgMHg4ZiwgMHg0ZCwgMHhkNSwgMHgxZCwgMHhhYywgMHg2YywgMHhhYSwKLSAgICAweDZiLCAweDE1LCAweGU3LCAweGIxLCAweDBjLCAweDY3LCAweGQyLCAweGIyLCAweDgxLCAweDU4LCAweDMwLCAweDBlLAotICAgIDB4MTgsIDB4MjcsIDB4YTEsIDB4OWIsIDB4OTYsIDB4YWQsIDB4YWUsIDB4NzYsIDB4MWEsIDB4MzIsIDB4ZjcsIDB4MTAsCi0gICAgMHgwYiwgMHg1MywgMHg4NSwgMHgzMSwgMHhkNiwgMHgyYSwgMHhmNiwgMHgxYywgMHg5ZiwgMHhjMiwgMHhjNywgMHhiMSwKLSAgICAweDA1LCAweDYzLCAweDBiLCAweGE1LCAweDA3LCAweDFmLCAweDFjLCAweDAxLCAweGYwLCAweGUwLCAweDA2LCAweGVhLAotICAgIDB4MjAsIDB4NjksIDB4NDEsIDB4MTksIDB4NTcsIDB4OTIsIDB4MTcsIDB4ZjcsIDB4MGMsIDB4NWMsIDB4NjYsIDB4NzUsCi0gICAgMHgwZSwgMHhlNSwgMHhiMywgMHhmMSwgMHg2NywgMHgzYiwgMHgyNywgMHg0NywgMHhiMiwgMHg4ZSwgMHgxYywgMHhiNiwKLSAgICAweDNmLCAweGRkLCAweDc2LCAweDQyLCAweDMxLCAweDEzLCAweDY4LCAweDk2LCAweGRmLCAweDNiLCAweGQ0LCAweDg3LAotICAgIDB4ZDksIDB4MTYsIDB4NDQsIDB4NzEsIDB4NTIsIDB4MmUsIDB4NTQsIDB4M2UsIDB4MDksIDB4Y2QsIDB4NzEsIDB4YzEsCi0gICAgMHgxZSwgMHg1ZSwgMHg5NiwgMHgxMywgMHhjOSwgMHgxZSwgMHhhNCwgMHhlNiwgMHhlNiwgMHg5NywgMHgyYywgMHg2YiwKLSAgICAweGYyLCAweGE5LCAweDVjLCAweGM2LCAweDYwLCAweDJhLCAweGJjLCAweDgyLCAweGY4LCAweGNiLCAweGQ0LCAweGQ3LAotICAgIDB4ZWEsIDB4OGEsIDB4YTEsIDB4OGEsIDB4ZDksIDB4YTUsIDB4MTQsIDB4OGIsIDB4OWUsIDB4ZjksIDB4MjUsIDB4MDIsCi0gICAgMHhkMiwgMHhhYiwgMHgwYywgMHg0MiwgMHhjYSwgMHgyZCwgMHg0NSwgMHhhMywgMHg1NiwgMHg1ZSwgMHhhMiwgMHgyYSwKLSAgICAweGM4LCAweDYwLCAweGE1LCAweDg3LCAweDVkLCAweDg1LCAweDVjLCAweGRlLCAweGM3LCAweGEyLCAweDQ3LCAweGMzLAotICAgIDB4OTksIDB4MjksIDB4MjMsIDB4NzksIDB4MzYsIDB4ODgsIDB4YWQsIDB4NDAsIDB4M2UsIDB4MjcsIDB4N2QsIDB4ZjAsCi0gICAgMHhiNiwgMHhmYSwgMHg5NSwgMHgyMCwgMHgzYywgMHhlYywgMHhmYywgMHg1NiwgMHgzYiwgMHgyMCwgMHg5MSwgMHhlZSwKLSAgICAweDk4LCAweDEwLCAweDJjLCAweDgyLAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1NpeFByaW1lS2V5W10gPQotICAgICJceDMwXHg4Mlx4MDVceDIwXHgwMlx4MDFceDAxXHgwMlx4ODJceDAxXHgwMFx4MWNceDA0XHgzOVx4NDRceGI5XHhiOFx4NzEiCi0gICAgIlx4MWNceDFjXHhmN1x4ZGNceDExXHgxYlx4ODVceDNiXHgyYlx4ZThceGE2XHhlYlx4ZWJceGU5XHhiNlx4ODZceDk3XHg3MyIKLSAgICAiXHg1ZFx4NzVceDQ2XHhkMVx4MzVceDI1XHhmOFx4MzBceDlhXHhjM1x4NTdceDQ0XHg4OVx4YTZceDQ0XHg1OVx4ZTNceDNhIgotICAgICJceDYwXHhiNVx4MzNceDg0XHg3Mlx4YTRceDAzXHhjNVx4MWFceDIwXHg5OFx4NzBceGJkXHhlOFx4M2JceGMxXHg5Ylx4OGEiCi0gICAgIlx4M2FceDI0XHg0NVx4YjZceDZhXHg3M1x4YjRceGQwXHg2Y1x4MThceGM2XHhhN1x4OTRceGQzXHgyNFx4NzBceGYwXHgyZCIKLSAgICAiXHgwY1x4YTVceGIyXHgzYlx4YzVceDMzXHg5MFx4OWRceDU2XHg4ZFx4MzNceGY2XHg5M1x4N2RceGE3XHg5NVx4ODhceDA1IgotICAgICJceGRmXHhmNVx4NjVceDU4XHhiOVx4NWJceGQzXHgwN1x4OWNceDE2XHg4ZVx4NzRceGZjXHhiOFx4NzZceGFmXHg2Mlx4OTkiCi0gICAgIlx4NmNceGQ0XHhjNVx4YjNceDY5XHhlNVx4NjRceGRmXHgzOFx4MDBceDI1XHgyNFx4ZTlceGIxXHg0YVx4ODVceGE2XHhmNCIKLSAgICAiXHhiNlx4MjNceDY4XHg2N1x4NGFceDJjXHhiZFx4OWRceDAxXHgzYlx4MDRceDhjXHg3MFx4OTRceDgyXHg3Nlx4NDVceDBjIgotICAgICJceDhiXHg5NVx4OGFceDA3XHgxY1x4MzJceGU3XHgwOVx4OTdceDNhXHhmZFx4Y2FceDU3XHhlOVx4NTdceDBjXHhhZVx4MmIiCi0gICAgIlx4YTNceDI1XHhkMVx4ZjJceDBkXHgzNFx4YTFceGU2XHgyZlx4N2JceDFiXHgzNlx4NTNceDgzXHg5NVx4YjlceDI2XHg2ZSIKLSAgICAiXHg0Zlx4MzZceDI2XHhmOFx4NDdceGFlXHhkZlx4ZThceDRkXHhmNlx4YjJceGZmXHgwM1x4MjNceDc0XHhmYVx4YTVceDZkIgotICAgICJceGNiXHhjYlx4ODBceDEyXHhjM1x4NzdceGYwXHgxOVx4YjdceGYyXHg2Ylx4MTlceDVjXHhkZVx4MGFceGQ3XHhlZVx4OGMiCi0gICAgIlx4NDhceDJmXHg1MFx4MjRceGE1XHgyZVx4Y2NceDJhXHhlZFx4YzJceDM1XHhlMFx4M2RceDI5XHgzMVx4MTdceGQ2XHg4ZiIKLSAgICAiXHg0NFx4YWFceDViXHgzM1x4YmRceGI0XHg4OFx4ODdceGQ5XHgyOVx4M2ZceDk0XHhlN1x4NzVceGUzXHgwMlx4MDFceDAzIgotICAgICJceDAyXHg4Mlx4MDFceDAwXHgxMlx4YWRceDdiXHg4M1x4MjZceDdhXHhmNlx4MTJceGJkXHhmYVx4OTJceGI2XHgxMlx4NTgiCi0gICAgIlx4ZDJceDFkXHg0NVx4YzRceDlkXHg0N1x4ZjFceDI0XHg1OVx4YmFceDRjXHhlOFx4ZjhceGQ5XHhlMFx4Y2VceDE5XHg1MCIKLSAgICAiXHgyMFx4NjdceDJjXHhlNFx4ZDhceDViXHhjNFx4MmRceDkxXHg0MVx4ZWJceDA1XHg0Zlx4ZjRceGI0XHgyMFx4YzdceGJjIgotICAgICJceGQ2XHhlMlx4NWNceGEwXHgyN1x4Y2ZceGI4XHhiM1x4M2JceDVjXHhlYlx4NWVceDk2XHhiN1x4OTlceDRiXHg4YVx4YzMiCi0gICAgIlx4NzBceGFmXHg3Zlx4ZDhceDVmXHhlYlx4Y2JceDFhXHg3OVx4NDRceDY4XHg5N1x4ODRceGQ4XHgyOVx4ODdceDY0XHhiYSIKLSAgICAiXHgxOFx4MmVceDk1XHg2Nlx4MWFceDdkXHhkOVx4MzVceDNhXHg1Y1x4OTJceDdhXHg4MVx4MWJceDZjXHhhOVx4ZjhceGZhIgotICAgICJceDA1XHgyM1x4MThceDViXHhiMlx4ZjhceDc3XHgxY1x4YzVceDFiXHg3ZFx4MjZceDVmXHg0OFx4NjlceDFiXHhjNFx4MzQiCi0gICAgIlx4ZWZceDZlXHhhMVx4MTVceGQyXHhiMlx4YWNceGI4XHhhOFx4ZWRceDFlXHhlZVx4ZGNceGI1XHhiOVx4NWNceDc5XHgyNSIKLSAgICAiXHg0OFx4YmJceGU1XHg5ZFx4ZDhceGU1XHhlMlx4OTRceGRmXHhkNVx4MzJceDIyXHg4NFx4YmZceGMyXHhhYVx4YTRceDU0IgotICAgICJceGJiXHgyOVx4ZGJceDEzXHg0YVx4MjhceDNkXHg4M1x4M2FceGZmXHhhM1x4YWVceDM4XHgwOFx4ZmNceDM2XHg4NFx4OTEiCi0gICAgIlx4MzBceGQxXHhmZFx4ODJceDY0XHhmMVx4MGZceGFlXHhiYVx4ZDdceDlhXHg0M1x4NThceDAzXHg1ZVx4NWZceDAxXHhjYiIKLSAgICAiXHg4Ylx4OTBceDhkXHg3N1x4MzRceDZmXHgzN1x4NDBceGI2XHg2ZFx4MjJceDIzXHg5MFx4YjJceGZkXHgzMlx4YjVceDk2IgotICAgICJceDQ1XHhiZlx4YWVceDhjXHhjNFx4NjJceDAzXHg2Y1x4NjhceDkwXHg1OVx4MzFceDFhXHhjYlx4ZmJceGE0XHgwYlx4OTQiCi0gICAgIlx4MTVceDEzXHhkYVx4MWFceDhkXHhhN1x4MGJceDM0XHg2Mlx4OTNceGVhXHhiZVx4NmVceDcxXHhjMlx4MWRceGM4XHg5ZCIKLSAgICAiXHhhY1x4NjZceGNjXHgzMVx4ODdceGZmXHg5OVx4YWJceDAyXHgyY1x4MDBceGE1XHg1N1x4NDFceDY2XHg4N1x4NjhceDAyIgotICAgICJceDZhXHhkZlx4OTdceGIwXHhmZVx4NmJceDM0XHhjNFx4MzNceDg4XHgyYlx4Y2VceDgyXHhhZlx4MmRceDMzXHg1YVx4YWQiCi0gICAgIlx4NzVceDJkXHhhY1x4YTVceGQ2XHgzYVx4MmRceDY1XHg0M1x4NjhceGZiXHg0NFx4OWVceGI4XHgyNVx4MDVceGVkXHg5NyIKLSAgICAiXHgwMlx4MmNceDAwXHhkMlx4NzdceDM0XHgyNFx4YWNceDYwXHg5YVx4YzRceDY4XHgzNFx4ZTVceDZhXHhhM1x4ZGNceGUyIgotICAgICJceGIwXHg1OFx4NWNceDM1XHg4M1x4NWFceGM3XHhhN1x4YzFceDBiXHg3ZVx4OWVceGE1XHg4NVx4MzJceDQ3XHg5M1x4MjIiCi0gICAgIlx4ZWVceGI2XHg1OVx4ZTlceGUzXHg2MVx4OTRceGQwXHgwZVx4Y2JceDAyXHgyYlx4NmVceDNhXHgyYlx4OTlceGFmXHg5YSIKLSAgICAiXHhhY1x4NDdceDNmXHhiYVx4NzVceGZlXHhmMlx4MjNceDJkXHg3N1x4YjBceDFkXHgzNFx4NTdceDFmXHg3M1x4NzdceDkxIgotICAgICJceGM4XHhmOFx4YzlceDFkXHhjM1x4ZTRceDI2XHhjOFx4ZWVceDJjXHhmMFx4YTdceDgzXHgxNFx4N2FceGMzXHg1OVx4NDkiCi0gICAgIlx4MGZceDAyXHgyY1x4MDBceDhjXHg0Zlx4NzhceDE4XHg3Mlx4ZWJceDExXHhkOFx4NDVceDc4XHg5OFx4ZjFceGMyXHg5MyIKLSAgICAiXHg0MVx4Y2FceGU1XHg5Mlx4Y2VceDU3XHg5MVx4ZGFceDZmXHhkNlx4MDdceGE5XHhiZlx4MTlceDAzXHg3Nlx4ZGFceDYyIgotICAgICJceDE3XHg0OVx4Y2VceGU2XHg5Ylx4ZWNceGViXHhiOFx4OGFceGI0XHg4N1x4MDJceDJjXHgwMFx4YTNceGMyXHgyOVx4YTYiCi0gICAgIlx4YTdceGUxXHgzY1x4ZTlceGNmXHgwZlx4NTBceDUxXHgxY1x4Y2NceGM4XHg1Ylx4MDhceDljXHg5N1x4MjRceDNhXHg4NiIKLSAgICAiXHgyM1x4YThceDBiXHhiYlx4NTRceGE2XHhiOVx4NzBceDNkXHgxZFx4ZDBceDFiXHhhM1x4YWNceGQ5XHhiMlx4MDNceDgwIgotICAgICJceGQ3XHg2N1x4ZWNceDMwXHg4Mlx4MDJceDI5XHgzMFx4ODFceDg4XHgwMlx4MmNceDAwXHg5N1x4NWRceDNiXHhmMlx4Y2MiCi0gICAgIlx4YmFceGQ5XHg3N1x4NjdceGFhXHhkMlx4MjJceGE3XHhhM1x4NDlceDA4XHhjN1x4YjhceDI3XHhhMVx4NTlceDRiXHhhNyIKLSAgICAiXHhhNVx4ZDJceDc0XHgwNVx4ZTdceDVhXHgzNVx4ZDdceDI1XHg3OVx4MThceDIwXHg4YVx4MjVceGVjXHgzYlx4NTJceGFmIgotICAgICJceGNiXHhkYlx4MDJceDJiXHg2NFx4ZThceGQyXHhhMVx4ZGRceGQxXHhlNlx4NGZceDlhXHg3MVx4ZTFceDZjXHg2Zlx4YzIiCi0gICAgIlx4MzBceGIwXHg4NVx4MjVceDZmXHhjMFx4ZTZceDMyXHg2Zlx4YzNceGUxXHhhMlx4YWVceDlhXHgzY1x4MjNceGU0XHhjMyIKLSAgICAiXHhhNlx4MTBceDE1XHhiMVx4NmVceDlkXHg3Y1x4ZTFceGNhXHg4N1x4ZTdceDAyXHgyYlx4NWVceGVmXHgyNVx4MjlceGVkIgotICAgICJceGY2XHg1Mlx4MTVceGQzXHg2MFx4YjZceDg4XHhjZlx4MGZceGUyXHgyNFx4YTRceDA0XHg5N1x4OWNceDlkXHg1OFx4MTMiCi0gICAgIlx4YmJceDAwXHg2ZFx4MzlceGY2XHhhZFx4MjFceDdlXHg1Nlx4MmNceDJlXHgwNlx4MDZceGM0XHg2ZFx4NDRceGFjXHg3OSIKLSAgICAiXHgxZlx4ZTVceDMwXHg4MVx4ODlceDAyXHgyY1x4MDBceGRiXHhmMVx4NzhceGY5XHhhNFx4OTRceGVhXHgzOVx4OGFceDNmIgotICAgICJceDIzXHg0OFx4MmFceDIzXHg4Zlx4ZDJceDE4XHg5N1x4ZDJceGRmXHgwZlx4YjhceDJiXHgzM1x4YTBceGU4XHg4Zlx4YmMiCi0gICAgIlx4NGVceDQyXHhmZFx4NTRceGM3XHgwZlx4ZGVceGJhXHg2ZFx4YmFceDk2XHhhN1x4Y2VceDY3XHgzZFx4MDJceDJjXHgwMCIKLSAgICAiXHg5Mlx4YTBceGZiXHg1MVx4MThceDYzXHg0Nlx4ZDFceDA2XHhkNFx4YzJceDMwXHgxY1x4MTdceGI1XHgzNlx4YmJceDBmIgotICAgICJceGUxXHhlYVx4MGFceDdhXHhjN1x4NzdceGMwXHg5Ylx4MGFceDdkXHg4OVx4ODFceGZlXHgzOFx4ODRceGI1XHgzZlx4MjYiCi0gICAgIlx4ZjNceGQxXHhiOVx4YzVceDM0XHg0NFx4ZDNceDAyXHgyYlx4NGNceGJkXHgxZFx4NDRceGM4XHgxOVx4MjNceGQ4XHhiMyIKLSAgICAiXHg5Nlx4NjZceDRiXHg2Mlx4Y2JceDNlXHhlNlx4NmNceDExXHhkZlx4YjJceDkyXHhkM1x4YzhceDM0XHhiOVx4YTZceDVhIgotICAgICJceDJmXHgxOVx4ZjRceDBiXHhiMlx4ZTZceDhlXHhhNlx4YWZceGEzXHhhZVx4YTRceGIzXHg5Mlx4YzRceDc5XHgzMFx4ODEiCi0gICAgIlx4ODVceDAyXHgyYlx4MDBceDg5XHhhYlx4MzBceGZjXHg3Ylx4MzdceDk0XHgxMVx4OWZceDRkXHgzMVx4M2JceGFjXHgwOSIKLSAgICAiXHg1N1x4ZTZceDY0XHhlY1x4YTBceGM4XHhmOFx4MDRceDFhXHhmOVx4MmFceGE0XHg0Ylx4MzZceDE4XHhiYlx4NWZceGRjIgotICAgICJceGNkXHhmMFx4YzhceGNiXHg5N1x4ZDFceGRmXHgxM1x4MTJceDNmXHgwMlx4MmFceDViXHhjN1x4NzVceGZkXHhhN1x4N2EiCi0gICAgIlx4NjJceGI2XHg2YVx4MzNceDc2XHgyN1x4YzhceDA2XHgzYVx4OTlceDk4XHg5ZFx4YzBceDg1XHhmYVx4YWRceDY3XHg1MCIKLSAgICAiXHhjN1x4MThceDMyXHgyNFx4MTBceDdjXHhlYVx4OTNceDMzXHhmNVx4ZGJceDMyXHg2NVx4MzZceDk0XHhiN1x4NjFceDdmIgotICAgICJceDAyXHgyYVx4MTZceDZjXHg5Nlx4YTFceDUwXHg2Zlx4M2FceDkyXHhjMFx4NzVceDQzXHhiNVx4NmJceDljXHgxN1x4MDkiCi0gICAgIlx4ZDNceGYwXHg2N1x4NjlceDQ1XHg5Mlx4ZmJceDdiXHg1MFx4YThceDQyXHg5Ylx4MzNceDkyXHhhYlx4ZDVceGU2XHg0OSIKLSAgICAiXHhiM1x4MjZceDk5XHg1NVx4MTZceDNhXHgzOVx4NjNceDMwXHg4MVx4ODdceDAyXHgyYlx4MDBceGMxXHgyNVx4MTlceDFkIgotICAgICJceDZlXHgxOFx4Y2JceDJkXHg2NFx4ZTJceGU2XHhiNlx4MWNceGU0XHhhYVx4OWNceGI5XHhlZVx4MThceGQ0XHhmN1x4NWYiCi0gICAgIlx4NjZceDQwXHhmMFx4ZTFceDMxXHgzOFx4ZjJceDUzXHgwMFx4OGJceGNjXHhlNFx4MGRceGI3XHg4MVx4YjRceGU2XHgxYyIKLSAgICAiXHgxOVx4YWZceDAyXHgyYlx4MDBceDgwXHhjM1x4NjZceDEzXHg5ZVx4YmJceDMyXHgxZVx4NDNceDQxXHhlZlx4MjRceDEzIgotICAgICJceDQzXHgxY1x4NjhceDdiXHhmNFx4MTBceDhkXHhmYVx4M2ZceDk5XHg4MFx4YTBceDk2XHgyMFx4ZDBceGExXHg4Y1x4YWIiCi0gICAgIlx4MDdceGRkXHhlZFx4NWVceDdhXHg1Nlx4NzhceDk5XHg2OFx4MTFceDFmXHgwMlx4MmJceDAwXHhiMFx4NTlceGVhXHg2NyIKLSAgICAiXHg5M1x4NDJceGJmXHgwN1x4NTRceDM4XHg0MVx4Y2JceDczXHhhNFx4MGVceGMyXHhhZVx4NTZceDE5XHg0MVx4YzlceDhhIgotICAgICJceGIyXHgyZlx4YThceDBhXHhiMVx4NGVceDEyXHgzOVx4MmVceGMwXHg5NFx4OWFceGM2XHhhM1x4ZTRceGFmXHg4YVx4MTYiCi0gICAgIlx4MDZceGI4IjsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1NpeFByaW1lRW5jcnlwdGVkTWVzc2FnZVtdID0gewotICAgIDB4MGEsIDB4Y2IsIDB4NmMsIDB4MDIsIDB4OWQsIDB4MWEsIDB4N2MsIDB4ZjMsIDB4NGUsIDB4ZmYsIDB4MTYsIDB4ODgsCi0gICAgMHhlZSwgMHgyMiwgMHgxZCwgMHg4ZCwgMHhkMiwgMHhmZCwgMHhkZSwgMHg4MywgMHhiMywgMHhkOSwgMHgzNSwgMHgyYywKLSAgICAweDgyLCAweGUwLCAweGZmLCAweGU2LCAweDc5LCAweDZkLCAweDA2LCAweDIxLCAweDc0LCAweGE4LCAweDA0LCAweDBjLAotICAgIDB4ZTIsIDB4ZDMsIDB4OTgsIDB4M2YsIDB4YmYsIDB4ZDAsIDB4ZTksIDB4ODgsIDB4MjQsIDB4ZTIsIDB4MDUsIDB4YTQsCi0gICAgMHg0NSwgMHg1MSwgMHg4NywgMHg2YiwgMHgxYywgMHhlZiwgMHg1ZiwgMHgyZCwgMHg2MSwgMHhiNiwgMHhmMSwgMHg0YywKLSAgICAweDFmLCAweDNkLCAweGJmLCAweDRiLCAweGYyLCAweGRhLCAweDA5LCAweDk3LCAweDgxLCAweGRlLCAweDkxLCAweGI3LAotICAgIDB4MGQsIDB4YjQsIDB4YzIsIDB4YWIsIDB4NDEsIDB4NjQsIDB4OWQsIDB4ZDksIDB4MzksIDB4NDYsIDB4NzksIDB4NjYsCi0gICAgMHg0MywgMHhmMSwgMHgzNCwgMHgyMSwgMHg1NiwgMHgyZiwgMHhjNiwgMHg2OCwgMHg0MCwgMHg0YSwgMHgyZCwgMHg3MywKLSAgICAweDk2LCAweDUwLCAweGUxLCAweGIwLCAweGFmLCAweDQ5LCAweDM5LCAweGI0LCAweGYwLCAweDNhLCAweDc4LCAweDM4LAotICAgIDB4NzAsIDB4YTksIDB4OTEsIDB4NWQsIDB4NWUsIDB4MDcsIDB4ZjQsIDB4ZWMsIDB4YmIsIDB4YzQsIDB4ZTUsIDB4OGEsCi0gICAgMHhiOCwgMHgwNiwgMHhiYSwgMHhkZiwgMHhjNiwgMHg0OCwgMHg3OCwgMHg0YiwgMHhjYSwgMHgyYSwgMHg4YSwgMHg5MiwKLSAgICAweDY0LCAweGUzLCAweGE2LCAweGFlLCAweDg3LCAweDk3LCAweDEyLCAweDE2LCAweDQ2LCAweDY3LCAweDU5LCAweGRmLAotICAgIDB4ZjIsIDB4ZjMsIDB4ODksIDB4NmYsIDB4ZTgsIDB4YTksIDB4MTMsIDB4NTcsIDB4NjMsIDB4NGUsIDB4MDcsIDB4OTgsCi0gICAgMHhjYywgMHg3MywgMHhhMCwgMHg4NCwgMHg5ZCwgMHhlOCwgMHhiMywgMHg1MCwgMHg1OSwgMHhiNSwgMHg1MSwgMHhiMywKLSAgICAweDQxLCAweDdkLCAweDU1LCAweGZlLCAweGQ5LCAweGYwLCAweGM2LCAweGZmLCAweDZlLCAweDk2LCAweDRmLCAweDIyLAotICAgIDB4YjIsIDB4MGQsIDB4NmIsIDB4YzksIDB4ODMsIDB4MmQsIDB4OTgsIDB4OTgsIDB4YjIsIDB4ZDEsIDB4YjcsIDB4ZTQsCi0gICAgMHg1MCwgMHg4MywgMHgxYSwgMHhhOSwgMHgwMiwgMHg5ZiwgMHhhZiwgMHg1NCwgMHg3NCwgMHgyYSwgMHgyYywgMHg2MywKLSAgICAweDEwLCAweDc5LCAweDQ1LCAweDVjLCAweDk1LCAweDBkLCAweGExLCAweDliLCAweDU1LCAweGYzLCAweDFlLCAweGI3LAotICAgIDB4NTYsIDB4NTksIDB4ZjEsIDB4NTksIDB4OGQsIDB4ZDYsIDB4MTUsIDB4ODksIDB4ZjYsIDB4ZmUsIDB4YzAsIDB4MDAsCi0gICAgMHhkZCwgMHgxZiwgMHgyYiwgMHhmMCwgMHhmNywgMHg1ZCwgMHg2NCwgMHg4NCwgMHg3NiwgMHhkMywgMHhjMiwgMHg5MiwKLSAgICAweDM1LCAweGFjLCAweGI1LCAweGY5LCAweGY2LCAweGE4LCAweDA1LCAweDg5LCAweDRjLCAweDk1LCAweDQxLCAweDRlLAotICAgIDB4MzQsIDB4MjUsIDB4MTEsIDB4MTQsCi19OwotCi0vLyBrRXN0b25pYW5SU0FLZXkgaXMgYW4gUlNBUHVibGljS2V5IGVuY29kZWQgd2l0aCBhIG5lZ2F0aXZlIG1vZHVsdXMuIFNlZQotLy8gaHR0cHM6Ly9jcmJ1Zy5jb20vNTMyMDQ4Lgotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0VzdG9uaWFuUlNBS2V5W10gPSB7Ci0gICAgMHgzMCwgMHg4MiwgMHgwMSwgMHgwOSwgMHgwMiwgMHg4MiwgMHgwMSwgMHgwMCwgMHg5NiwgMHhhNiwgMHgyZSwgMHg5YywKLSAgICAweDRlLCAweDZhLCAweGMzLCAweGNjLCAweGNkLCAweDhmLCAweDcwLCAweGMzLCAweDU1LCAweGJmLCAweDVlLCAweDljLAotICAgIDB4ZDQsIDB4ZjMsIDB4MTcsIDB4YzMsIDB4OTcsIDB4NzAsIDB4YWUsIDB4ZGYsIDB4MTIsIDB4NWMsIDB4MTUsIDB4ODAsCi0gICAgMHgwMywgMHhlZiwgMHgyYiwgMHgxOCwgMHg5ZCwgMHg2YSwgMHhjYiwgMHg1MiwgMHgyMiwgMHhjMSwgMHg4MSwgMHhiOCwKLSAgICAweDdlLCAweDYxLCAweGU4LCAweDBmLCAweDc5LCAweDI0LCAweDBmLCAweDgyLCAweDcwLCAweDI0LCAweDRlLCAweDI5LAotICAgIDB4MjAsIDB4MDUsIDB4NTQsIDB4ZWIsIDB4ZDQsIDB4YTksIDB4NjUsIDB4NTksIDB4YjYsIDB4M2MsIDB4NzUsIDB4OTUsCi0gICAgMHgyZiwgMHg0YywgMHhmNiwgMHg5ZCwgMHhkMSwgMHhhZiwgMHg1ZiwgMHgxNCwgMHgxNCwgMHhlNywgMHgyNSwgMHhlYSwKLSAgICAweGE1LCAweDQ3LCAweDVkLCAweGM2LCAweDNlLCAweDI4LCAweDhkLCAweGRjLCAweDU0LCAweDg3LCAweDJhLCAweDdjLAotICAgIDB4MTAsIDB4ZTksIDB4YzYsIDB4NzYsIDB4MmQsIDB4ZTcsIDB4NzksIDB4ZDgsIDB4MGUsIDB4YmIsIDB4YTksIDB4YWMsCi0gICAgMHhiNSwgMHgxOCwgMHg5OCwgMHhkNiwgMHg0NywgMHg2ZSwgMHgwNiwgMHg3MCwgMHhiZiwgMHg5ZSwgMHg4MiwgMHgyNSwKLSAgICAweDk1LCAweDRlLCAweGZkLCAweDcwLCAweGQ3LCAweDczLCAweDQ1LCAweDJlLCAweGMxLCAweDFmLCAweDdhLCAweDlhLAotICAgIDB4OWQsIDB4NjAsIDB4YzAsIDB4MWYsIDB4NjcsIDB4MDYsIDB4MmEsIDB4NGUsIDB4ODcsIDB4M2YsIDB4MTksIDB4ODgsCi0gICAgMHg2OSwgMHg2NCwgMHg0ZCwgMHg5ZiwgMHg3NSwgMHhmNSwgMHhkMywgMHgxYSwgMHg0MSwgMHgzZCwgMHgzNSwgMHgxNywKLSAgICAweGI2LCAweGQxLCAweDQ0LCAweDBkLCAweDI1LCAweDhiLCAweGU3LCAweDk0LCAweDM5LCAweGIwLCAweDdjLCAweGFmLAotICAgIDB4M2UsIDB4NmEsIDB4ZmEsIDB4OGQsIDB4OTAsIDB4MjEsIDB4MGYsIDB4OGEsIDB4NDMsIDB4OTQsIDB4MzcsIDB4N2MsCi0gICAgMHgyYSwgMHgxNSwgMHg0YywgMHhhMCwgMHhmYSwgMHhhOSwgMHgyZiwgMHgyMSwgMHhhNiwgMHg2ZiwgMHg4ZSwgMHgyZiwKLSAgICAweDg5LCAweGJjLCAweGJiLCAweDMzLCAweGY4LCAweDMxLCAweGZjLCAweGRmLCAweGNkLCAweDY4LCAweDlhLCAweGJjLAotICAgIDB4NzUsIDB4MDYsIDB4OTUsIDB4ZjEsIDB4M2QsIDB4ZWYsIDB4Y2EsIDB4NzYsIDB4MjcsIDB4ZDIsIDB4YmEsIDB4OGUsCi0gICAgMHgwZSwgMHgxYywgMHg0MywgMHhkNywgMHg3MCwgMHhiOSwgMHhjNiwgMHgxNSwgMHhjYSwgMHhkNSwgMHg0ZCwgMHg4NywKLSAgICAweGI5LCAweGQxLCAweGFlLCAweGRlLCAweDY5LCAweDczLCAweDAwLCAweDJhLCAweDk3LCAweDUxLCAweDRiLCAweDMwLAotICAgIDB4MDEsIDB4YzIsIDB4ODUsIDB4ZDAsIDB4MDUsIDB4Y2MsIDB4MmUsIDB4ZTgsIDB4YzcsIDB4NDIsIDB4ZTcsIDB4OTQsCi0gICAgMHg1MSwgMHhlMywgMHhmNSwgMHgxOSwgMHgzNSwgMHhkYywgMHg1NywgMHg5NiwgMHhlNywgMHhkOSwgMHhiNCwgMHg0OSwKLSAgICAweDAyLCAweDAzLCAweDAxLCAweDAwLCAweDAxLAotfTsKLQotc3RhdGljIGJvb2wgVGVzdFJTQShjb25zdCB1aW50OF90ICpkZXIsIHNpemVfdCBkZXJfbGVuLAotICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpvYWVwX2NpcGhlcnRleHQsCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBvYWVwX2NpcGhlcnRleHRfbGVuKSB7Ci0gIFNjb3BlZFJTQSBrZXkoZDJpX1JTQVByaXZhdGVLZXkobnVsbHB0ciwgJmRlciwgZGVyX2xlbikpOwotICBpZiAoIWtleSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghUlNBX2NoZWNrX2tleShrZXkuZ2V0KCkpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJSU0FfY2hlY2tfa2V5IGZhaWxlZFxuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdWludDhfdCBjaXBoZXJ0ZXh0WzI1Nl07Ci0KLSAgaW50IG51bSA9IFJTQV9wdWJsaWNfZW5jcnlwdChrUGxhaW50ZXh0TGVuLCBrUGxhaW50ZXh0LCBjaXBoZXJ0ZXh0LCBrZXkuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNBX1BLQ1MxX1BBRERJTkcpOwotICBpZiAobnVtIDwgMCB8fCAoc2l6ZV90KW51bSAhPSBSU0Ffc2l6ZShrZXkuZ2V0KCkpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJQS0NTIzEgdjEuNSBlbmNyeXB0aW9uIGZhaWxlZCFcbiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHVpbnQ4X3QgcGxhaW50ZXh0WzI1Nl07Ci0gIG51bSA9IFJTQV9wcml2YXRlX2RlY3J5cHQobnVtLCBjaXBoZXJ0ZXh0LCBwbGFpbnRleHQsIGtleS5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FfUEtDUzFfUEFERElORyk7Ci0gIGlmIChudW0gPCAwIHx8Ci0gICAgICAoc2l6ZV90KW51bSAhPSBrUGxhaW50ZXh0TGVuIHx8IG1lbWNtcChwbGFpbnRleHQsIGtQbGFpbnRleHQsIG51bSkgIT0gMCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiUEtDUyMxIHYxLjUgZGVjcnlwdGlvbiBmYWlsZWQhXG4iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBudW0gPSBSU0FfcHVibGljX2VuY3J5cHQoa1BsYWludGV4dExlbiwga1BsYWludGV4dCwgY2lwaGVydGV4dCwga2V5LmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNBX1BLQ1MxX09BRVBfUEFERElORyk7Ci0gIGlmIChudW0gPCAwIHx8IChzaXplX3QpbnVtICE9IFJTQV9zaXplKGtleS5nZXQoKSkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk9BRVAgZW5jcnlwdGlvbiBmYWlsZWQhXG4iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBudW0gPSBSU0FfcHJpdmF0ZV9kZWNyeXB0KG51bSwgY2lwaGVydGV4dCwgcGxhaW50ZXh0LCBrZXkuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNBX1BLQ1MxX09BRVBfUEFERElORyk7Ci0gIGlmIChudW0gPCAwIHx8Ci0gICAgICAoc2l6ZV90KW51bSAhPSBrUGxhaW50ZXh0TGVuIHx8IG1lbWNtcChwbGFpbnRleHQsIGtQbGFpbnRleHQsIG51bSkgIT0gMCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiT0FFUCBkZWNyeXB0aW9uIChlbmNyeXB0ZWQgZGF0YSkgZmFpbGVkIVxuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gfG9hZXBfY2lwaGVydGV4dHwgc2hvdWxkIGRlY3J5cHQgdG8gfGtQbGFpbnRleHR8LgotICBudW0gPSBSU0FfcHJpdmF0ZV9kZWNyeXB0KG9hZXBfY2lwaGVydGV4dF9sZW4sIG9hZXBfY2lwaGVydGV4dCwgcGxhaW50ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleS5nZXQoKSwgUlNBX1BLQ1MxX09BRVBfUEFERElORyk7Ci0KLSAgaWYgKG51bSA8IDAgfHwKLSAgICAgIChzaXplX3QpbnVtICE9IGtQbGFpbnRleHRMZW4gfHwgbWVtY21wKHBsYWludGV4dCwga1BsYWludGV4dCwgbnVtKSAhPSAwKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJPQUVQIGRlY3J5cHRpb24gKHRlc3QgdmVjdG9yIGRhdGEpIGZhaWxlZCFcbiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFRyeSBkZWNyeXB0aW5nIGNvcnJ1cHRlZCBjaXBoZXJ0ZXh0cy4KLSAgbWVtY3B5KGNpcGhlcnRleHQsIG9hZXBfY2lwaGVydGV4dCwgb2FlcF9jaXBoZXJ0ZXh0X2xlbik7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb2FlcF9jaXBoZXJ0ZXh0X2xlbjsgaSsrKSB7Ci0gICAgdWludDhfdCBzYXZlZCA9IGNpcGhlcnRleHRbaV07Ci0gICAgZm9yICh1bnNpZ25lZCBiID0gMDsgYiA8IDI1NjsgYisrKSB7Ci0gICAgICBpZiAoYiA9PSBzYXZlZCkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGNpcGhlcnRleHRbaV0gPSBiOwotICAgICAgbnVtID0gUlNBX3ByaXZhdGVfZGVjcnlwdChudW0sIGNpcGhlcnRleHQsIHBsYWludGV4dCwga2V5LmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FfUEtDUzFfT0FFUF9QQURESU5HKTsKLSAgICAgIGlmIChudW0gPiAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ29ycnVwdCBkYXRhIGRlY3J5cHRlZCFcbiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIGNpcGhlcnRleHRbaV0gPSBzYXZlZDsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBUZXN0TXVsdGlQcmltZUtleShpbnQgbnByaW1lcywgY29uc3QgdWludDhfdCAqZGVyLCBzaXplX3QgZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmMsIHNpemVfdCBlbmNfc2l6ZSkgewotICBTY29wZWRSU0EgcnNhKGQyaV9SU0FQcml2YXRlS2V5KG51bGxwdHIsICZkZXIsIGRlcl9zaXplKSk7Ci0gIGlmICghcnNhKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlZC1wcmltZSBrZXkgZmFpbGVkIHRvIHBhcnNlLlxuIiwgbnByaW1lcyk7Ci0gICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghUlNBX2NoZWNrX2tleShyc2EuZ2V0KCkpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJSU0FfY2hlY2tfa2V5IGZhaWxlZCBmb3IgJWQtcHJpbWUga2V5LlxuIiwgbnByaW1lcyk7Ci0gICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHVpbnQ4X3Qgb3V0WzI1Nl07Ci0gIHNpemVfdCBvdXRfbGVuOwotICBpZiAoIVJTQV9kZWNyeXB0KHJzYS5nZXQoKSwgJm91dF9sZW4sIG91dCwgc2l6ZW9mKG91dCksIGVuYywgZW5jX3NpemUsCi0gICAgICAgICAgICAgICAgICAgUlNBX1BLQ1MxX1BBRERJTkcpIHx8Ci0gICAgICBvdXRfbGVuICE9IDExIHx8Ci0gICAgICBtZW1jbXAob3V0LCAiaGVsbG8gd29ybGQiLCAxMSkgIT0gMCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiJWQtcHJpbWUga2V5IGZhaWxlZCB0byBkZWNyeXB0LlxuIiwgbnByaW1lcyk7Ci0gICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBUZXN0TXVsdGlQcmltZUtleWdlbigpIHsKLSAgc3RhdGljIGNvbnN0IGNoYXIga01lc3NhZ2VbXSA9ICJIZWxsbyB3b3JsZC4iOwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtCaXRzID0gMTAyNDsKLSAgdWludDhfdCBlbmNyeXB0ZWRba0JpdHMgLyA4XSwgZGVjcnlwdGVkW2tCaXRzIC8gOF07Ci0gIHNpemVfdCBlbmNyeXB0ZWRfbGVuLCBkZWNyeXB0ZWRfbGVuOwotCi0gIFNjb3BlZFJTQSByc2EoUlNBX25ldygpKTsKLSAgU2NvcGVkQklHTlVNIGUoQk5fbmV3KCkpOwotICBpZiAoIXJzYSB8fCAhZSB8fAotICAgICAgIUJOX3NldF93b3JkKGUuZ2V0KCksIFJTQV9GNCkgfHwKLSAgICAgICFSU0FfZ2VuZXJhdGVfbXVsdGlfcHJpbWVfa2V5KHJzYS5nZXQoKSwga0JpdHMsIDMsIGUuZ2V0KCksIG51bGxwdHIpIHx8Ci0gICAgICAhUlNBX2NoZWNrX2tleShyc2EuZ2V0KCkpIHx8Ci0gICAgICAhUlNBX2VuY3J5cHQocnNhLmdldCgpLCAmZW5jcnlwdGVkX2xlbiwgZW5jcnlwdGVkLCBzaXplb2YoZW5jcnlwdGVkKSwKLSAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWtNZXNzYWdlLCBzaXplb2Yoa01lc3NhZ2UpLAotICAgICAgICAgICAgICAgICAgIFJTQV9QS0NTMV9QQURESU5HKSB8fAotICAgICAgIVJTQV9kZWNyeXB0KHJzYS5nZXQoKSwgJmRlY3J5cHRlZF9sZW4sIGRlY3J5cHRlZCwgc2l6ZW9mKGRlY3J5cHRlZCksCi0gICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkLCBlbmNyeXB0ZWRfbGVuLCBSU0FfUEtDUzFfUEFERElORykgfHwKLSAgICAgIGRlY3J5cHRlZF9sZW4gIT0gc2l6ZW9mKGtNZXNzYWdlKSB8fAotICAgICAgbWVtY21wKGRlY3J5cHRlZCwga01lc3NhZ2UsIHNpemVvZihrTWVzc2FnZSkpICE9IDApIHsKLSAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIFRlc3RCYWRLZXkoKSB7Ci0gIFNjb3BlZFJTQSBrZXkoUlNBX25ldygpKTsKLSAgU2NvcGVkQklHTlVNIGUoQk5fbmV3KCkpOwotCi0gIGlmICgha2V5IHx8ICFlIHx8ICFCTl9zZXRfd29yZChlLmdldCgpLCBSU0FfRjQpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFSU0FfZ2VuZXJhdGVfa2V5X2V4KGtleS5nZXQoKSwgNTEyLCBlLmdldCgpLCBudWxscHRyKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiUlNBX2dlbmVyYXRlX2tleV9leCBmYWlsZWQuXG4iKTsKLSAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFCTl9hZGQoa2V5LT5wLCBrZXktPnAsIEJOX3ZhbHVlX29uZSgpKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiQk4gZXJyb3IuXG4iKTsKLSAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKFJTQV9jaGVja19rZXkoa2V5LmdldCgpKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiUlNBX2NoZWNrX2tleSBwYXNzZWQgd2l0aCBpbnZhbGlkIGtleSFcbiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIEVSUl9jbGVhcl9lcnJvcigpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgVGVzdE9ubHlER2l2ZW4oKSB7Ci0gIHVpbnQ4X3QgYnVmWzY0XTsKLSAgdW5zaWduZWQgYnVmX2xlbiA9IHNpemVvZihidWYpOwotICBTY29wZWRSU0Ega2V5KFJTQV9uZXcoKSk7Ci0gIGlmICgha2V5IHx8Ci0gICAgICAhQk5faGV4MmJuKCZrZXktPm4sCi0gICAgICAgICAgICAgICAgICIwMGU3N2JiZjM4ODlkNGVmMzZhOWEyNWQ0ZDY5ZjNmNjMyZWI0MzYyMjE0Yzc0NTE3ZGE2ZDZhZWFhOWJkIgotICAgICAgICAgICAgICAgICAiMDlhYzQyYjI2NjIxY2Q4OGYzYTZlYjAxMzc3MmZjM2JmOWY4MzkxNGI2NDY3MjMxYzYzMDIwMmMzNWIzZSIKLSAgICAgICAgICAgICAgICAgIjU4MDhjNjU5IikgfHwKLSAgICAgICFCTl9oZXgyYm4oJmtleS0+ZSwgIjAxMDAwMSIpIHx8Ci0gICAgICAhQk5faGV4MmJuKCZrZXktPmQsCi0gICAgICAgICAgICAgICAgICIwMzY1ZGI5ZWI2ZDczYjUzYjAxNWM0MGNkOGRiNGRlN2RkNzAzNWM2OGI1YWMxYmY3ODZkN2E0ZWUyY2VhIgotICAgICAgICAgICAgICAgICAiMzE2ZWFlY2EyMWE3M2FjMzY1ZTU4NzEzMTk1ZjJhZTk4NDkzNDg1MjVjYTg1NTM4NmI2ZDAyOGU0MzdhOSIKLSAgICAgICAgICAgICAgICAgIjQ5NWEwMSIpIHx8Ci0gICAgICBSU0Ffc2l6ZShrZXkuZ2V0KCkpID4gc2l6ZW9mKGJ1ZikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIVJTQV9jaGVja19rZXkoa2V5LmdldCgpKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiUlNBX2NoZWNrX2tleSBmYWlsZWQgd2l0aCBvbmx5IGQgZ2l2ZW4uXG4iKTsKLSAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgY29uc3QgdWludDhfdCBrRHVtbXlIYXNoWzE2XSA9IHswfTsKLQotICBpZiAoIVJTQV9zaWduKE5JRF9zaGEyNTYsIGtEdW1teUhhc2gsIHNpemVvZihrRHVtbXlIYXNoKSwgYnVmLCAmYnVmX2xlbiwKLSAgICAgICAgICAgICAgICBrZXkuZ2V0KCkpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJSU0Ffc2lnbiBmYWlsZWQgd2l0aCBvbmx5IGQgZ2l2ZW4uXG4iKTsKLSAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFSU0FfdmVyaWZ5KE5JRF9zaGEyNTYsIGtEdW1teUhhc2gsIHNpemVvZihrRHVtbXlIYXNoKSwgYnVmLCBidWZfbGVuLAotICAgICAgICAgICAgICAgICAga2V5LmdldCgpKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiUlNBX3ZlcmlmeSBmYWlsZWQgd2l0aCBvbmx5IGQgZ2l2ZW4uXG4iKTsKLSAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIFRlc3RSZWNvdmVyQ1JUUGFyYW1zKCkgewotICBTY29wZWRCSUdOVU0gZShCTl9uZXcoKSk7Ci0gIGlmICghZSB8fCAhQk5fc2V0X3dvcmQoZS5nZXQoKSwgUlNBX0Y0KSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIEVSUl9jbGVhcl9lcnJvcigpOwotCi0gIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCAxOyBpKyspIHsKLSAgICBTY29wZWRSU0Ega2V5MShSU0FfbmV3KCkpOwotICAgIGlmICgha2V5MSB8fAotICAgICAgICAhUlNBX2dlbmVyYXRlX2tleV9leChrZXkxLmdldCgpLCA1MTIsIGUuZ2V0KCksIG51bGxwdHIpKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlJTQV9nZW5lcmF0ZV9rZXlfZXggZmFpbGVkLlxuIik7Ci0gICAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFSU0FfY2hlY2tfa2V5KGtleTEuZ2V0KCkpKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlJTQV9jaGVja19rZXkgZmFpbGVkIHdpdGggb3JpZ2luYWwga2V5LlxuIik7Ci0gICAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgU2NvcGVkUlNBIGtleTIoUlNBX25ldygpKTsKLSAgICBpZiAoIWtleTIpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAga2V5Mi0+biA9IEJOX2R1cChrZXkxLT5uKTsKLSAgICBrZXkyLT5lID0gQk5fZHVwKGtleTEtPmUpOwotICAgIGtleTItPmQgPSBCTl9kdXAoa2V5MS0+ZCk7Ci0gICAgaWYgKGtleTItPm4gPT0gbnVsbHB0ciB8fCBrZXkyLT5lID09IG51bGxwdHIgfHwga2V5Mi0+ZCA9PSBudWxscHRyKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFSU0FfcmVjb3Zlcl9jcnRfcGFyYW1zKGtleTIuZ2V0KCkpKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlJTQV9yZWNvdmVyX2NydF9wYXJhbXMgZmFpbGVkLlxuIik7Ci0gICAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdWludDhfdCBidWZbMTI4XTsKLSAgICB1bnNpZ25lZCBidWZfbGVuID0gc2l6ZW9mKGJ1Zik7Ci0gICAgaWYgKFJTQV9zaXplKGtleTIuZ2V0KCkpID4gYnVmX2xlbikgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghUlNBX2NoZWNrX2tleShrZXkyLmdldCgpKSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJSU0FfY2hlY2tfa2V5IGZhaWxlZCB3aXRoIHJlY292ZXJlZCBrZXkuXG4iKTsKLSAgICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb25zdCB1aW50OF90IGtEdW1teUhhc2hbMTZdID0gezB9OwotICAgIGlmICghUlNBX3NpZ24oTklEX3NoYTI1Niwga0R1bW15SGFzaCwgc2l6ZW9mKGtEdW1teUhhc2gpLCBidWYsICZidWZfbGVuLAotICAgICAgICAgICAgICAgICAga2V5Mi5nZXQoKSkpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiUlNBX3NpZ24gZmFpbGVkIHdpdGggcmVjb3ZlcmVkIGtleS5cbiIpOwotICAgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghUlNBX3ZlcmlmeShOSURfc2hhMjU2LCBrRHVtbXlIYXNoLCBzaXplb2Yoa0R1bW15SGFzaCksIGJ1ZiwgYnVmX2xlbiwKLSAgICAgICAgICAgICAgICAgICAga2V5Mi5nZXQoKSkpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiUlNBX3ZlcmlmeSBmYWlsZWQgd2l0aCByZWNvdmVyZWQga2V5LlxuIik7Ci0gICAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIFRlc3RBU04xKCkgewotICAvLyBUZXN0IHRoYXQgcHJpdmF0ZSBrZXlzIG1heSBiZSBkZWNvZGVkLgotICBTY29wZWRSU0EgcnNhKFJTQV9wcml2YXRlX2tleV9mcm9tX2J5dGVzKGtLZXkxLCBzaXplb2Yoa0tleTEpIC0gMSkpOwotICBpZiAoIXJzYSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFRlc3QgdGhhdCB0aGUgc2VyaWFsaXphdGlvbiByb3VuZC10cmlwcy4KLSAgdWludDhfdCAqZGVyOwotICBzaXplX3QgZGVyX2xlbjsKLSAgaWYgKCFSU0FfcHJpdmF0ZV9rZXlfdG9fYnl0ZXMoJmRlciwgJmRlcl9sZW4sIHJzYS5nZXQoKSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgU2NvcGVkT3BlblNTTEJ5dGVzIGRlbGV0ZV9kZXIoZGVyKTsKLSAgaWYgKGRlcl9sZW4gIT0gc2l6ZW9mKGtLZXkxKSAtIDEgfHwgbWVtY21wKGRlciwga0tleTEsIGRlcl9sZW4pICE9IDApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBUZXN0IHRoYXQgc2VyaWFsaXppbmcgcHVibGljIGtleXMgd29ya3MuCi0gIGlmICghUlNBX3B1YmxpY19rZXlfdG9fYnl0ZXMoJmRlciwgJmRlcl9sZW4sIHJzYS5nZXQoKSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZGVsZXRlX2Rlci5yZXNldChkZXIpOwotCi0gIC8vIFB1YmxpYyBrZXlzIG1heSBiZSBwYXJzZWQgYmFjayBvdXQuCi0gIHJzYS5yZXNldChSU0FfcHVibGljX2tleV9mcm9tX2J5dGVzKGRlciwgZGVyX2xlbikpOwotICBpZiAoIXJzYSB8fCByc2EtPnAgIT0gTlVMTCB8fCByc2EtPnEgIT0gTlVMTCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFNlcmlhbGl6aW5nIHRoZSByZXN1bHQgcm91bmQtdHJpcHMuCi0gIHVpbnQ4X3QgKmRlcjI7Ci0gIHNpemVfdCBkZXIyX2xlbjsKLSAgaWYgKCFSU0FfcHVibGljX2tleV90b19ieXRlcygmZGVyMiwgJmRlcjJfbGVuLCByc2EuZ2V0KCkpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIFNjb3BlZE9wZW5TU0xCeXRlcyBkZWxldGVfZGVyMihkZXIyKTsKLSAgaWYgKGRlcl9sZW4gIT0gZGVyMl9sZW4gfHwgbWVtY21wKGRlciwgZGVyMiwgZGVyX2xlbikgIT0gMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFB1YmxpYyBrZXlzIGNhbm5vdCBiZSBzZXJpYWxpemVkIGFzIHByaXZhdGUga2V5cy4KLSAgaWYgKFJTQV9wcml2YXRlX2tleV90b19ieXRlcygmZGVyLCAmZGVyX2xlbiwgcnNhLmdldCgpKSkgewotICAgIE9QRU5TU0xfZnJlZShkZXIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBFUlJfY2xlYXJfZXJyb3IoKTsKLQotICAvLyBQdWJsaWMga2V5cyB3aXRoIG5lZ2F0aXZlIG1vZHVsaSBhcmUgaW52YWxpZC4KLSAgcnNhLnJlc2V0KFJTQV9wdWJsaWNfa2V5X2Zyb21fYnl0ZXMoa0VzdG9uaWFuUlNBS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa0VzdG9uaWFuUlNBS2V5KSkpOwotICBpZiAocnNhKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEVSUl9jbGVhcl9lcnJvcigpOwotCi0gIC8vIEJ1dCB8UlNBX3BhcnNlX3B1YmxpY19rZXlfYnVnZ3l8IHdpbGwgYWNjZXB0IGl0LgotICBDQlMgY2JzOwotICBDQlNfaW5pdCgmY2JzLCBrRXN0b25pYW5SU0FLZXksIHNpemVvZihrRXN0b25pYW5SU0FLZXkpKTsKLSAgcnNhLnJlc2V0KFJTQV9wYXJzZV9wdWJsaWNfa2V5X2J1Z2d5KCZjYnMpKTsKLSAgaWYgKCFyc2EgfHwgQ0JTX2xlbigmY2JzKSAhPSAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLSAgQ1JZUFRPX2xpYnJhcnlfaW5pdCgpOwotCi0gIGlmICghVGVzdFJTQShrS2V5MSwgc2l6ZW9mKGtLZXkxKSAtIDEsIGtPQUVQQ2lwaGVydGV4dDEsCi0gICAgICAgICAgICAgICBzaXplb2Yoa09BRVBDaXBoZXJ0ZXh0MSkgLSAxKSB8fAotICAgICAgIVRlc3RSU0Eoa0tleTIsIHNpemVvZihrS2V5MikgLSAxLCBrT0FFUENpcGhlcnRleHQyLAotICAgICAgICAgICAgICAgc2l6ZW9mKGtPQUVQQ2lwaGVydGV4dDIpIC0gMSkgfHwKLSAgICAgICFUZXN0UlNBKGtLZXkzLCBzaXplb2Yoa0tleTMpIC0gMSwga09BRVBDaXBoZXJ0ZXh0MywKLSAgICAgICAgICAgICAgIHNpemVvZihrT0FFUENpcGhlcnRleHQzKSAtIDEpIHx8Ci0gICAgICAhVGVzdE9ubHlER2l2ZW4oKSB8fAotICAgICAgIVRlc3RSZWNvdmVyQ1JUUGFyYW1zKCkgfHwKLSAgICAgICFUZXN0QmFkS2V5KCkgfHwKLSAgICAgICFUZXN0TXVsdGlQcmltZUtleSgyLCBrVHdvUHJpbWVLZXksIHNpemVvZihrVHdvUHJpbWVLZXkpIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVHdvUHJpbWVFbmNyeXB0ZWRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrVHdvUHJpbWVFbmNyeXB0ZWRNZXNzYWdlKSkgfHwKLSAgICAgICFUZXN0TXVsdGlQcmltZUtleSgzLCBrVGhyZWVQcmltZUtleSwgc2l6ZW9mKGtUaHJlZVByaW1lS2V5KSAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga1RocmVlUHJpbWVFbmNyeXB0ZWRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrVGhyZWVQcmltZUVuY3J5cHRlZE1lc3NhZ2UpKSB8fAotICAgICAgIVRlc3RNdWx0aVByaW1lS2V5KDYsIGtTaXhQcmltZUtleSwgc2l6ZW9mKGtTaXhQcmltZUtleSkgLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTaXhQcmltZUVuY3J5cHRlZE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGtTaXhQcmltZUVuY3J5cHRlZE1lc3NhZ2UpKSB8fAotICAgICAgIVRlc3RNdWx0aVByaW1lS2V5Z2VuKCkgfHwKLSAgICAgICFUZXN0QVNOMSgpKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwcmludGYoIlBBU1NcbiIpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vc2hhL0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9zaGEvQ01ha2VMaXN0cy50eHQKaW5kZXggZWNmZjA5Yi4uNWExMGM4NSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9zaGEvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9zaGEvQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKIAogaWYgKCR7QVJDSH0gU1RSRVFVQUwgIng4Nl82NCIpCiAgIHNldCgKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vc2hhL2FzbS9zaGExLTU4Ni5wbCBiL3NyYy9jcnlwdG8vc2hhL2FzbS9zaGExLTU4Ni5wbAppbmRleCBlMGI1ZDgzLi40ODk1ZWIzIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3NoYS9hc20vc2hhMS01ODYucGwKKysrIGIvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTEtNTg2LnBsCkBAIC02Niw5ICs2Niw5IEBACiAjIHN3aXRjaCB0byBBVlggYWxvbmUgaW1wcm92ZXMgcGVyZm9ybWFuY2UgYnkgYXMgbGl0dGxlIGFzIDQlIGluCiAjIGNvbXBhcmlzb24gdG8gU1NTRTMgY29kZSBwYXRoLiBCdXQgYmVsb3cgcmVzdWx0IGRvZXNuJ3QgbG9vayBsaWtlCiAjIDQlIGltcHJvdmVtZW50Li4uIFRyb3VibGUgaXMgdGhhdCBTYW5keSBCcmlkZ2UgZGVjb2RlcyAncm9bcmxdJyBhcwotIyBwYWlyIG9mIMK1LW9wcywgYW5kIGl0J3MgdGhlIGFkZGl0aW9uYWwgwrUtb3BzLCB0d28gcGVyIHJvdW5kLCB0aGF0CisjIHBhaXIgb2YgtS1vcHMsIGFuZCBpdCdzIHRoZSBhZGRpdGlvbmFsILUtb3BzLCB0d28gcGVyIHJvdW5kLCB0aGF0CiAjIG1ha2UgaXQgcnVuIHNsb3dlciB0aGFuIENvcmUyIGFuZCBXZXN0bWVyZS4gQnV0ICdzaFtybF1kJyBpcyBkZWNvZGVkCi0jIGFzIHNpbmdsZSDCtS1vcCBieSBTYW5keSBCcmlkZ2UgYW5kIGl0J3MgcmVwbGFjaW5nICdyb1tybF0nIHdpdGgKKyMgYXMgc2luZ2xlILUtb3AgYnkgU2FuZHkgQnJpZGdlIGFuZCBpdCdzIHJlcGxhY2luZyAncm9bcmxdJyB3aXRoCiAjIGVxdWl2YWxlbnQgJ3NoW3JsXWQnIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoZSBpbXByZXNzaXZlIDUuMQogIyBjeWNsZXMgcGVyIHByb2Nlc3NlZCBieXRlLiBCdXQgJ3NoW3JsXWQnIGlzIG5vdCBzb21ldGhpbmcgdGhhdCB1c2VkCiAjIHRvIGJlIGZhc3QsIG5vciBkb2VzIGl0IGFwcGVhciB0byBiZSBmYXN0IGluIHVwY29taW5nIEJ1bGxkb3plcgpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTEtYXJtdjQtbGFyZ2UucGwgYi9zcmMvY3J5cHRvL3NoYS9hc20vc2hhMS1hcm12NC1sYXJnZS5wbAppbmRleCA2NGUyZWQ2Li5hMjBkMzM2IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3NoYS9hc20vc2hhMS1hcm12NC1sYXJnZS5wbAorKysgYi9zcmMvY3J5cHRvL3NoYS9hc20vc2hhMS1hcm12NC1sYXJnZS5wbApAQCAtMTc4LDcgKzE3OCw3IEBACiB9CiAKICRjb2RlPTw8X19fOwotI2luY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKyNpbmNsdWRlICJhcm1fYXJjaC5oIgogCiAudGV4dAogLmNvZGUJMzIKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vc2hhL2FzbS9zaGExLWFybXY4LnBsIGIvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTEtYXJtdjgucGwKaW5kZXggMWM0ZmU0YS4uYThjMDhjMiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTEtYXJtdjgucGwKKysrIGIvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTEtYXJtdjgucGwKQEAgLTE2Miw3ICsxNjIsNyBAQAogfQogCiAkY29kZS49PDxfX187Ci0jaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorI2luY2x1ZGUgImFybV9hcmNoLmgiCiAKIC50ZXh0CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vc2hhL2FzbS9zaGEyNTYtNTg2LnBsIGIvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTI1Ni01ODYucGwKaW5kZXggZTkwNzcxNC4uNjQ2MmU0NSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTI1Ni01ODYucGwKKysrIGIvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTI1Ni01ODYucGwKQEAgLTEwLDcgKzEwLDcgQEAKICMgU0hBMjU2IGJsb2NrIHRyYW5zZm9ybSBmb3IgeDg2LiBTZXB0ZW1iZXIgMjAwNy4KICMKICMgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb3ZlciBjb21waWxlciBnZW5lcmF0ZWQgY29kZSB2YXJpZXMgZnJvbQotIyAxMCUgdG8gNDAlIFtzZWUgYmVsb3ddLiBOb3QgdmVyeSBpbXByZXNzaXZlIG9uIHNvbWUgwrUtYXJjaHMsIGJ1dAorIyAxMCUgdG8gNDAlIFtzZWUgYmVsb3ddLiBOb3QgdmVyeSBpbXByZXNzaXZlIG9uIHNvbWUgtS1hcmNocywgYnV0CiAjIGl0J3MgNSB0aW1lcyBzbWFsbGVyIGFuZCBvcHRpbWl6aWVzIGFtb3VudCBvZiB3cml0ZXMuCiAjCiAjIE1heSAyMDEyLgpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTI1Ni1hcm12NC5wbCBiL3NyYy9jcnlwdG8vc2hhL2FzbS9zaGEyNTYtYXJtdjQucGwKaW5kZXggN2UwNzE0Ny4uZGY3MTY3NiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTI1Ni1hcm12NC5wbAorKysgYi9zcmMvY3J5cHRvL3NoYS9hc20vc2hhMjU2LWFybXY0LnBsCkBAIC0xNjgsNyArMTY4LDcgQEAKIAogJGNvZGU9PDxfX187CiAjaWZuZGVmIF9fS0VSTkVMX18KLSMgaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorIyBpbmNsdWRlICJhcm1fYXJjaC5oIgogI2Vsc2UKICMgZGVmaW5lIF9fQVJNX0FSQ0hfXyBfX0xJTlVYX0FSTV9BUkNIX18KICMgZGVmaW5lIF9fQVJNX01BWF9BUkNIX18gNwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTUxMi01ODYucGwgYi9zcmMvY3J5cHRvL3NoYS9hc20vc2hhNTEyLTU4Ni5wbAppbmRleCAyZjZhMjAyLi5lOTZlYzAwIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3NoYS9hc20vc2hhNTEyLTU4Ni5wbAorKysgYi9zcmMvY3J5cHRvL3NoYS9hc20vc2hhNTEyLTU4Ni5wbApAQCAtMzcsNyArMzcsNyBAQAogIwogIyBJQUxVIGNvZGUtcGF0aCBpcyBvcHRpbWl6ZWQgZm9yIGVsZGVyIFBlbnRpdW1zLiBPbiB2YW5pbGxhIFBlbnRpdW0KICMgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb3ZlciBjb21waWxlciBnZW5lcmF0ZWQgY29kZSByZWFjaGVzIH42MCUsCi0jIHdoaWxlIG9uIFBJSUkgLSB+MzUlLiBPbiBuZXdlciDCtS1hcmNocyBpbXByb3ZlbWVudCB2YXJpZXMgZnJvbSAxNSUKKyMgd2hpbGUgb24gUElJSSAtIH4zNSUuIE9uIG5ld2VyILUtYXJjaHMgaW1wcm92ZW1lbnQgdmFyaWVzIGZyb20gMTUlCiAjIHRvIDUwJSwgYnV0IGl0J3MgbGVzcyBpbXBvcnRhbnQgYXMgdGhleSBhcmUgZXhwZWN0ZWQgdG8gZXhlY3V0ZSBTU0UyCiAjIGNvZGUtcGF0aCwgd2hpY2ggaXMgY29tbW9ubHkgfjItM3ggZmFzdGVyIFt0aGFuIGNvbXBpbGVyIGdlbmVyYXRlZAogIyBjb2RlXS4gU1NFMiBjb2RlLXBhdGggaXMgYXMgZmFzdCBhcyBvcmlnaW5hbCBzaGE1MTItc3NlMi5wbCwgZXZlbgpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTUxMi1hcm12NC5wbCBiL3NyYy9jcnlwdG8vc2hhL2FzbS9zaGE1MTItYXJtdjQucGwKaW5kZXggY2QzNjYyYS4uMjk2NGEzOSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTUxMi1hcm12NC5wbAorKysgYi9zcmMvY3J5cHRvL3NoYS9hc20vc2hhNTEyLWFybXY0LnBsCkBAIC0xOTEsNyArMTkxLDcgQEAKIH0KICRjb2RlPTw8X19fOwogI2lmbmRlZiBfX0tFUk5FTF9fCi0jIGluY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKyMgaW5jbHVkZSAiYXJtX2FyY2guaCIKICMgZGVmaW5lIFZGUF9BQklfUFVTSAl2c3RtZGIJc3AhLHtkOC1kMTV9CiAjIGRlZmluZSBWRlBfQUJJX1BPUAl2bGRtaWEJc3AhLHtkOC1kMTV9CiAjZWxzZQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTUxMi1hcm12OC5wbCBiL3NyYy9jcnlwdG8vc2hhL2FzbS9zaGE1MTItYXJtdjgucGwKaW5kZXggNDBlYjE3YS4uNDNlNzI5MyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTUxMi1hcm12OC5wbAorKysgYi9zcmMvY3J5cHRvL3NoYS9hc20vc2hhNTEyLWFybXY4LnBsCkBAIC0xNjQsNyArMTY0LDcgQEAKIH0KIAogJGNvZGUuPTw8X19fOwotI2luY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKyNpbmNsdWRlICJhcm1fYXJjaC5oIgogCiAudGV4dAogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3N0YWNrL0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9zdGFjay9DTWFrZUxpc3RzLnR4dAppbmRleCBkY2Q4ZWY0Li5iZGIwNTk5IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3N0YWNrL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vc3RhY2svQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKIAogYWRkX2xpYnJhcnkoCiAgIHN0YWNrCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3Rlc3QvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL3Rlc3QvQ01ha2VMaXN0cy50eHQKaW5kZXggOGM3NTMxNC4uODRhNjE3NCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by90ZXN0L0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vdGVzdC9DTWFrZUxpc3RzLnR4dApAQCAtNSw1ICs1LDQgQEAKIAogICBmaWxlX3Rlc3QuY2MKICAgbWFsbG9jLmNjCi0gIHRlc3RfdXRpbC5jYwogKQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by90ZXN0L2ZpbGVfdGVzdC5jYyBiL3NyYy9jcnlwdG8vdGVzdC9maWxlX3Rlc3QuY2MKaW5kZXggNjcyMzM1MC4uOGRmNmY5YSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by90ZXN0L2ZpbGVfdGVzdC5jYworKysgYi9zcmMvY3J5cHRvL3Rlc3QvZmlsZV90ZXN0LmNjCkBAIC0xMjgsNyArMTI4LDYgQEAKICAgICAgIGNvbnN0IGNoYXIgKmRlbGltaXRlciA9IEZpbmREZWxpbWl0ZXIoYnVmKTsKICAgICAgIGlmIChkZWxpbWl0ZXIgPT0gbnVsbHB0cikgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkxpbmUgJXU6IENvdWxkIG5vdCBwYXJzZSBhdHRyaWJ1dGUuXG4iLCBsaW5lXyk7Ci0gICAgICAgIHJldHVybiBrUmVhZEVycm9yOwogICAgICAgfQogICAgICAgc3RkOjpzdHJpbmcga2V5ID0gU3RyaXBTcGFjZShidWYsIGRlbGltaXRlciAtIGJ1Zik7CiAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZSA9IFN0cmlwU3BhY2UoZGVsaW1pdGVyICsgMSwKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vdGVzdC9maWxlX3Rlc3QuaCBiL3NyYy9jcnlwdG8vdGVzdC9maWxlX3Rlc3QuaAppbmRleCAyNDY1MWFiLi43MzAzZDhhIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3Rlc3QvZmlsZV90ZXN0LmgKKysrIGIvc3JjL2NyeXB0by90ZXN0L2ZpbGVfdGVzdC5oCkBAIC0xOCwxOSArMTgsMTEgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikKLSNwcmFnbWEgd2FybmluZyhwdXNoKQotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQ3MDIpCi0jZW5kaWYKLQogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAotI2lmIGRlZmluZWQoX01TQ19WRVIpCi0jcHJhZ21hIHdhcm5pbmcocG9wKQotI2VuZGlmCiAKIC8vIEZpbGUtYmFzZWQgdGVzdCBmcmFtZXdvcmsuCiAvLwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by90ZXN0L21hbGxvYy5jYyBiL3NyYy9jcnlwdG8vdGVzdC9tYWxsb2MuY2MKaW5kZXggODk4ZjJhNy4uOWZmZGYwMSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by90ZXN0L21hbGxvYy5jYworKysgYi9zcmMvY3J5cHRvL3Rlc3QvbWFsbG9jLmNjCkBAIC0zNCw4ICszNCw2IEBACiAjaWYgZGVmaW5lZChfX2xpbnV4X18pICYmIGRlZmluZWQoT1BFTlNTTF9HTElCQykgJiYgIWRlZmluZWQoT1BFTlNTTF9BUk0pICYmIFwKICAgICAhZGVmaW5lZChPUEVOU1NMX0FBUkNINjQpICYmICFkZWZpbmVkKE9QRU5TU0xfQVNBTikKIAotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KQEAgLTQ3LDE0ICs0NSwxNCBAQAogLyogVGhpcyBmaWxlIGRlZmluZXMgb3ZlcnJpZGVzIGZvciB0aGUgc3RhbmRhcmQgYWxsb2NhdGlvbiBmdW5jdGlvbnMgdGhhdCBhbGxvdwogICogYSBnaXZlbiBhbGxvY2F0aW9uIHRvIGJlIG1hZGUgdG8gZmFpbCBmb3IgdGVzdGluZy4gSWYgdGhlIHByb2dyYW0gaXMgcnVuCiAgKiB3aXRoIE1BTExPQ19OVU1CRVJfVE9fRkFJTCBzZXQgdG8gYSBiYXNlLTEwIG51bWJlciB0aGVuIHRoYXQgYWxsb2NhdGlvbiB3aWxsCi0gKiByZXR1cm4gTlVMTC4gSWYgTUFMTE9DX0JSRUFLX09OX0ZBSUwgaXMgYWxzbyBkZWZpbmVkIHRoZW4gdGhlIGFsbG9jYXRpb24KLSAqIHdpbGwgc2lnbmFsIFNJR1RSQVAgcmF0aGVyIHRoYW4gcmV0dXJuIE5VTEwuCisgKiByZXR1cm4gTlVMTC4gSWYgTUFMTE9DX0FCT1JUX09OX0ZBSUwgaXMgYWxzbyBkZWZpbmVkIHRoZW4gdGhlIGFsbG9jYXRpb24KKyAqIHdpbGwgYWJvcnQoKSByYXRoZXIgdGhhbiByZXR1cm4gTlVMTC4KICAqCiAgKiBUaGlzIGNvZGUgaXMgbm90IHRocmVhZCBzYWZlLiAqLwogCiBzdGF0aWMgdWludDY0X3QgY3VycmVudF9tYWxsb2NfY291bnQgPSAwOwogc3RhdGljIHVpbnQ2NF90IG1hbGxvY19udW1iZXJfdG9fZmFpbCA9IDA7Ci1zdGF0aWMgY2hhciBmYWlsdXJlX2VuYWJsZWQgPSAwLCBicmVha19vbl9mYWlsID0gMDsKK3N0YXRpYyBjaGFyIGZhaWx1cmVfZW5hYmxlZCA9IDAsIGFib3J0X29uX2ZhaWwgPSAwOwogc3RhdGljIGludCBpbl9jYWxsID0gMDsKIAogZXh0ZXJuICJDIiB7CkBAIC05Nyw3ICs5NSw3IEBACiAgICAgICAgIHN0ZDo6c2V0X25ld19oYW5kbGVyKGNwcF9uZXdfaGFuZGxlcik7CiAgICAgICB9CiAgICAgfQotICAgIGJyZWFrX29uX2ZhaWwgPSAoTlVMTCAhPSBnZXRlbnYoIk1BTExPQ19CUkVBS19PTl9GQUlMIikpOworICAgIGFib3J0X29uX2ZhaWwgPSAoTlVMTCAhPSBnZXRlbnYoIk1BTExPQ19BQk9SVF9PTl9GQUlMIikpOwogICAgIGluaXQgPSAxOwogICB9CiAKQEAgLTExMCw4ICsxMDgsOCBAQAogICBzaG91bGRfZmFpbCA9IChjdXJyZW50X21hbGxvY19jb3VudCA9PSBtYWxsb2NfbnVtYmVyX3RvX2ZhaWwpOwogICBjdXJyZW50X21hbGxvY19jb3VudCsrOwogCi0gIGlmIChzaG91bGRfZmFpbCAmJiBicmVha19vbl9mYWlsKSB7Ci0gICAgcmFpc2UoU0lHVFJBUCk7CisgIGlmIChzaG91bGRfZmFpbCAmJiBhYm9ydF9vbl9mYWlsKSB7CisgICAgYWJvcnQoKTsKICAgfQogICByZXR1cm4gc2hvdWxkX2ZhaWw7CiB9CkBAIC0xMjAsNyArMTE4LDYgQEAKIAogdm9pZCAqbWFsbG9jKHNpemVfdCBzaXplKSB7CiAgIGlmIChzaG91bGRfZmFpbF9hbGxvY2F0aW9uKCkpIHsKLSAgICBlcnJubyA9IEVOT01FTTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCkBAIC0xMjksNyArMTI2LDYgQEAKIAogdm9pZCAqY2FsbG9jKHNpemVfdCBudW1fZWxlbXMsIHNpemVfdCBzaXplKSB7CiAgIGlmIChzaG91bGRfZmFpbF9hbGxvY2F0aW9uKCkpIHsKLSAgICBlcnJubyA9IEVOT01FTTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCkBAIC0xMzgsNyArMTM0LDYgQEAKIAogdm9pZCAqcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKSB7CiAgIGlmIChzaG91bGRfZmFpbF9hbGxvY2F0aW9uKCkpIHsKLSAgICBlcnJubyA9IEVOT01FTTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3Rlc3Qvc2NvcGVkX3R5cGVzLmggYi9zcmMvY3J5cHRvL3Rlc3Qvc2NvcGVkX3R5cGVzLmgKaW5kZXggZTQ0YzZlZC4uYzVjOGNmZSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by90ZXN0L3Njb3BlZF90eXBlcy5oCisrKyBiL3NyYy9jcnlwdG8vdGVzdC9zY29wZWRfdHlwZXMuaApAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKLSNpbmNsdWRlIDxvcGVuc3NsL2FlYWQuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KICNpbmNsdWRlIDxvcGVuc3NsL2NtYWMuaD4KQEAgLTExMywxMyArMTEyLDkgQEAKIHVzaW5nIFNjb3BlZFJTQSA9IFNjb3BlZE9wZW5TU0xUeXBlPFJTQSwgUlNBX2ZyZWU+OwogdXNpbmcgU2NvcGVkWDUwOSA9IFNjb3BlZE9wZW5TU0xUeXBlPFg1MDksIFg1MDlfZnJlZT47CiB1c2luZyBTY29wZWRYNTA5X0FMR09SID0gU2NvcGVkT3BlblNTTFR5cGU8WDUwOV9BTEdPUiwgWDUwOV9BTEdPUl9mcmVlPjsKLXVzaW5nIFNjb3BlZFg1MDlfU0lHID0gU2NvcGVkT3BlblNTTFR5cGU8WDUwOV9TSUcsIFg1MDlfU0lHX2ZyZWU+OwogCiB1c2luZyBTY29wZWRYNTA5U3RhY2sgPSBTY29wZWRPcGVuU1NMU3RhY2s8U1RBQ0tfT0YoWDUwOSksIFg1MDksIFg1MDlfZnJlZT47CiAKLXVzaW5nIFNjb3BlZEVWUF9BRUFEX0NUWCA9IFNjb3BlZE9wZW5TU0xDb250ZXh0PEVWUF9BRUFEX0NUWCwgdm9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9BRUFEX0NUWF96ZXJvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX0FFQURfQ1RYX2NsZWFudXA+OwogdXNpbmcgU2NvcGVkRVZQX0NJUEhFUl9DVFggPSBTY29wZWRPcGVuU1NMQ29udGV4dDxFVlBfQ0lQSEVSX0NUWCwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlBfQ0lQSEVSX0NUWF9pbml0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwPjsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vdGVzdC90ZXN0X3V0aWwuY2MgYi9zcmMvY3J5cHRvL3Rlc3QvdGVzdF91dGlsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDIxYWFhLi4wMDAwMDAwCi0tLSBhL3NyYy9jcnlwdG8vdGVzdC90ZXN0X3V0aWwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEdvb2dsZSBJbmMuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAidGVzdF91dGlsLmgiCi0KLQotdm9pZCBoZXhkdW1wKEZJTEUgKmZwLCBjb25zdCBjaGFyICptc2csIGNvbnN0IHZvaWQgKmluLCBzaXplX3QgbGVuKSB7Ci0gIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihpbik7Ci0gIHNpemVfdCBpOwotCi0gIGZwdXRzKG1zZywgZnApOwotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICBmcHJpbnRmKGZwLCAiJTAyeCIsIGRhdGFbaV0pOwotICB9Ci0gIGZwdXRzKCJcbiIsIGZwKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vdGVzdC90ZXN0X3V0aWwuaCBiL3NyYy9jcnlwdG8vdGVzdC90ZXN0X3V0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyZTIwNi4uMDAwMDAwMAotLS0gYS9zcmMvY3J5cHRvL3Rlc3QvdGVzdF91dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEdvb2dsZSBJbmMuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCi0KLSNpZm5kZWYgT1BFTlNTTF9IRUFERVJfQ1JZUFRPX1RFU1RfVEVTVF9VVElMX0gKLSNkZWZpbmUgT1BFTlNTTF9IRUFERVJfQ1JZUFRPX1RFU1RfVEVTVF9VVElMX0gKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0vKiBoZXhkdW1wIHdyaXRlcyB8bXNnfCB0byB8ZnB8IGZvbGxvd2VkIGJ5IHRoZSBoZXggZW5jb2Rpbmcgb2YgfGxlbnwgYnl0ZXMKLSAqIGZyb20gfGlufC4gKi8KLXZvaWQgaGV4ZHVtcChGSUxFICpmcCwgY29uc3QgY2hhciAqbXNnLCBjb25zdCB2b2lkICppbiwgc2l6ZV90IGxlbik7Ci0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIE9QRU5TU0xfSEVBREVSX0NSWVBUT19URVNUX1RFU1RfVVRJTF9IICovCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL3g1MDkvQ01ha2VMaXN0cy50eHQKaW5kZXggMjU4YzI2My4uM2JiNTcwNCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5L0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8veDUwOS9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgeDUwOQpAQCAtMTUsNyArMTUsNiBAQAogICBpMmRfcHIuYwogICBwa2NzNy5jCiAgIHRfY3JsLmMKLSAgdF9yZXEuYwogICB0X3g1MDkuYwogICB0X3g1MDlhLmMKICAgeDUwOS5jCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkvYV9kaWdlc3QuYyBiL3NyYy9jcnlwdG8veDUwOS9hX2RpZ2VzdC5jCmluZGV4IDQzMGUyZTYuLjYwNjBiYmQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS9hX2RpZ2VzdC5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS9hX2RpZ2VzdC5jCkBAIC03MSw3ICs3MSw3IEBACiAJaT1pMmQoZGF0YSxOVUxMKTsKIAlpZiAoKHN0cj0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKGkpKSA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgQVNOMV9kaWdlc3QsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuKDApOwogCQl9CiAJcD1zdHI7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkvYV9zaWduLmMgYi9zcmMvY3J5cHRvL3g1MDkvYV9zaWduLmMKaW5kZXggNGU5YmU4YS4uZjIxOWMyMyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5L2Ffc2lnbi5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS9hX3NpZ24uYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJaWYgKChidWZfaW4gPT0gTlVMTCkgfHwgKGJ1Zl9vdXQgPT0gTlVMTCkpCiAJCXsKIAkJb3V0bD0wOwotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEFTTjFfaXRlbV9zaWduX2N0eCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlnb3RvIGVycjsKIAkJfQogCkBAIC0xMTQsNyArMTE0LDcgQEAKIAkJfHwgIUVWUF9EaWdlc3RTaWduRmluYWwoY3R4LCBidWZfb3V0LCAmb3V0bCkpCiAJCXsKIAkJb3V0bD0wOwotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9FVlBfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgQVNOMV9pdGVtX3NpZ25fY3R4LCBFUlJfUl9FVlBfTElCKTsKIAkJZ290byBlcnI7CiAJCX0KIAlpZiAoc2lnbmF0dXJlLT5kYXRhICE9IE5VTEwpIE9QRU5TU0xfZnJlZShzaWduYXR1cmUtPmRhdGEpOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L2FfdmVyaWZ5LmMgYi9zcmMvY3J5cHRvL3g1MDkvYV92ZXJpZnkuYwppbmRleCA1NzJhMTM5Li43MmUwYTYyIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDkvYV92ZXJpZnkuYworKysgYi9zcmMvY3J5cHRvL3g1MDkvYV92ZXJpZnkuYwpAQCAtODAsMTMgKzgwLDEzIEBACiAKIAlpZiAoIXBrZXkpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgQVNOMV9pdGVtX3ZlcmlmeSwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKIAkJcmV0dXJuIDA7CiAJCX0KIAogCWlmIChzaWduYXR1cmUtPnR5cGUgPT0gVl9BU04xX0JJVF9TVFJJTkcgJiYgc2lnbmF0dXJlLT5mbGFncyAmIDB4NykKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfSU5WQUxJRF9CSVRfU1RSSU5HX0JJVFNfTEVGVCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEFTTjFfaXRlbV92ZXJpZnksIFg1MDlfUl9JTlZBTElEX0JJVF9TVFJJTkdfQklUU19MRUZUKTsKIAkJcmV0dXJuIDA7CiAJCX0KIApAQCAtMTAxLDcgKzEwMSw3IEBACiAJCiAJaWYgKGJ1Zl9pbiA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgQVNOMV9pdGVtX3ZlcmlmeSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlnb3RvIGVycjsKIAkJfQogCkBAIC0xMDksNyArMTA5LDcgQEAKIAkJewogCQlPUEVOU1NMX2NsZWFuc2UoYnVmX2luLCh1bnNpZ25lZCBpbnQpaW5sKTsKIAkJT1BFTlNTTF9mcmVlKGJ1Zl9pbik7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX0VWUF9MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBBU04xX2l0ZW1fdmVyaWZ5LCBFUlJfUl9FVlBfTElCKTsKIAkJZ290byBlcnI7CiAJCX0KIApAQCAtMTE5LDcgKzExOSw3IEBACiAJaWYgKEVWUF9EaWdlc3RWZXJpZnlGaW5hbCgmY3R4LHNpZ25hdHVyZS0+ZGF0YSwKIAkJCShzaXplX3Qpc2lnbmF0dXJlLT5sZW5ndGgpIDw9IDApCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfRVZQX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEFTTjFfaXRlbV92ZXJpZnksIEVSUl9SX0VWUF9MSUIpOwogCQlnb3RvIGVycjsKIAkJfQogCS8qIHdlIGRvbid0IG5lZWQgdG8gemVybyB0aGUgJ2N0eCcgYmVjYXVzZSB3ZSBqdXN0IGNoZWNrZWQKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS9hc24xX2dlbi5jIGIvc3JjL2NyeXB0by94NTA5L2FzbjFfZ2VuLmMKaW5kZXggODUwYTgxNi4uZDRkMWVlNiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5L2FzbjFfZ2VuLmMKKysrIGIvc3JjL2NyeXB0by94NTA5L2FzbjFfZ2VuLmMKQEAgLTE3MSw3ICsxNzEsNyBAQAogCQl7CiAJCWlmICghY25mKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1NFUVVFTkNFX09SX1NFVF9ORUVEU19DT05GSUcpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9nZW5lcmF0ZV92MywgQVNOMV9SX1NFUVVFTkNFX09SX1NFVF9ORUVEU19DT05GSUcpOwogCQkJcmV0dXJuIE5VTEw7CiAJCQl9CiAJCXJldCA9IGFzbjFfbXVsdGkoYXNuMV90YWdzLnV0eXBlLCBhc24xX3RhZ3Muc3RyLCBjbmYpOwpAQCAtMzE0LDcgKzMxNCw3IEBACiAKIAlpZiAodXR5cGUgPT0gLTEpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1VOS05PV05fVEFHKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9jYiwgQVNOMV9SX1VOS05PV05fVEFHKTsKIAkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJ0YWc9IiwgZWxlbSk7CiAJCXJldHVybiAtMTsKIAkJfQpAQCAtMzI3LDcgKzMyNyw3IEBACiAJCS8qIElmIG5vIHZhbHVlIGFuZCBub3QgZW5kIG9mIHN0cmluZywgZXJyb3IgKi8KIAkJaWYgKCF2c3RhcnQgJiYgZWxlbVtsZW5dKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX01JU1NJTkdfVkFMVUUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9jYiwgQVNOMV9SX01JU1NJTkdfVkFMVUUpOwogCQkJcmV0dXJuIC0xOwogCQkJfQogCQlyZXR1cm4gMDsKQEAgLTM0MCw3ICszNDAsNyBAQAogCQkvKiBDaGVjayBmb3IgaWxsZWdhbCBtdWx0aXBsZSBJTVBMSUNJVCB0YWdnaW5nICovCiAJCWlmIChhcmctPmltcF90YWcgIT0gLTEpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSUxMRUdBTF9ORVNURURfVEFHR0lORyk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2NiLCBBU04xX1JfSUxMRUdBTF9ORVNURURfVEFHR0lORyk7CiAJCQlyZXR1cm4gLTE7CiAJCQl9CiAJCWlmICghcGFyc2VfdGFnZ2luZyh2c3RhcnQsIHZsZW4sICZhcmctPmltcF90YWcsICZhcmctPmltcF9jbGFzcykpCkBAIC0zNzgsNyArMzc4LDcgQEAKIAkJY2FzZSBBU04xX0dFTl9GTEFHX0ZPUk1BVDoKIAkJaWYgKCF2c3RhcnQpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfVU5LTk9XTl9GT1JNQVQpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9jYiwgQVNOMV9SX1VOS05PV05fRk9STUFUKTsKIAkJCXJldHVybiAtMTsKIAkJCX0KIAkJaWYgKCFzdHJuY21wKHZzdGFydCwgIkFTQ0lJIiwgNSkpCkBAIC0zOTEsNyArMzkxLDcgQEAKIAkJCWFyZy0+Zm9ybWF0ID0gQVNOMV9HRU5fRk9STUFUX0JJVExJU1Q7CiAJCWVsc2UKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9VTktOT1dOX0ZPUk1BVCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2NiLCBBU04xX1JfVU5LTk9XTl9GT1JNQVQpOwogCQkJcmV0dXJuIC0xOwogCQkJfQogCQlicmVhazsKQEAgLTQxNSw3ICs0MTUsNyBAQAogCQlyZXR1cm4gMDsKIAlpZiAodGFnX251bSA8IDApCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lOVkFMSURfTlVNQkVSKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgcGFyc2VfdGFnZ2luZywgQVNOMV9SX0lOVkFMSURfTlVNQkVSKTsKIAkJcmV0dXJuIDA7CiAJCX0KIAkqcHRhZyA9IHRhZ19udW07CkBAIC00NDgsNyArNDQ4LDcgQEAKIAkJCWRlZmF1bHQ6CiAJCQllcmNoWzBdID0gKmVwdHI7CiAJCQllcmNoWzFdID0gMDsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTlZBTElEX01PRElGSUVSKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIHBhcnNlX3RhZ2dpbmcsIEFTTjFfUl9JTlZBTElEX01PRElGSUVSKTsKIAkJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAiQ2hhcj0iLCBlcmNoKTsKIAkJCXJldHVybiAwOwogCQkJYnJlYWs7CkBAIC01MzQsMTMgKzUzNCwxMyBAQAogCS8qIENhbiBvbmx5IGhhdmUgSU1QTElDSVQgaWYgcGVybWl0dGVkICovCiAJaWYgKChhcmctPmltcF90YWcgIT0gLTEpICYmICFpbXBfb2spCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lMTEVHQUxfSU1QTElDSVRfVEFHKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXBwZW5kX2V4cCwgQVNOMV9SX0lMTEVHQUxfSU1QTElDSVRfVEFHKTsKIAkJcmV0dXJuIDA7CiAJCX0KIAogCWlmIChhcmctPmV4cF9jb3VudCA9PSBBU04xX0ZMQUdfRVhQX01BWCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfREVQVEhfRVhDRUVERUQpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhcHBlbmRfZXhwLCBBU04xX1JfREVQVEhfRVhDRUVERUQpOwogCQlyZXR1cm4gMDsKIAkJfQogCkBAIC02NTgsNyArNjU4LDcgQEAKIAogCWlmICghKGF0bXAgPSBBU04xX1RZUEVfbmV3KCkpKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9zdHIydHlwZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gTlVMTDsKIAkJfQogCkBAIC02NzEsNyArNjcxLDcgQEAKIAkJY2FzZSBWX0FTTjFfTlVMTDoKIAkJaWYgKHN0ciAmJiAqc3RyKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lMTEVHQUxfTlVMTF9WQUxVRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3N0cjJ0eXBlLCBBU04xX1JfSUxMRUdBTF9OVUxMX1ZBTFVFKTsKIAkJCWdvdG8gYmFkX2Zvcm07CiAJCQl9CiAJCWJyZWFrOwpAQCAtNjc5LDcgKzY3OSw3IEBACiAJCWNhc2UgVl9BU04xX0JPT0xFQU46CiAJCWlmIChmb3JtYXQgIT0gQVNOMV9HRU5fRk9STUFUX0FTQ0lJKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05PVF9BU0NJSV9GT1JNQVQpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9zdHIydHlwZSwgQVNOMV9SX05PVF9BU0NJSV9GT1JNQVQpOwogCQkJZ290byBiYWRfZm9ybTsKIAkJCX0KIAkJdnRtcC5uYW1lID0gTlVMTDsKQEAgLTY4Nyw3ICs2ODcsNyBAQAogCQl2dG1wLnZhbHVlID0gKGNoYXIgKilzdHI7CiAJCWlmICghWDUwOVYzX2dldF92YWx1ZV9ib29sKCZ2dG1wLCAmYXRtcC0+dmFsdWUuYm9vbGVhbikpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSUxMRUdBTF9CT09MRUFOKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfc3RyMnR5cGUsIEFTTjFfUl9JTExFR0FMX0JPT0xFQU4pOwogCQkJZ290byBiYWRfc3RyOwogCQkJfQogCQlicmVhazsKQEAgLTY5NiwxMiArNjk2LDEyIEBACiAJCWNhc2UgVl9BU04xX0VOVU1FUkFURUQ6CiAJCWlmIChmb3JtYXQgIT0gQVNOMV9HRU5fRk9STUFUX0FTQ0lJKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lOVEVHRVJfTk9UX0FTQ0lJX0ZPUk1BVCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3N0cjJ0eXBlLCBBU04xX1JfSU5URUdFUl9OT1RfQVNDSUlfRk9STUFUKTsKIAkJCWdvdG8gYmFkX2Zvcm07CiAJCQl9CiAJCWlmICghKGF0bXAtPnZhbHVlLmludGVnZXIgPSBzMmlfQVNOMV9JTlRFR0VSKE5VTEwsIChjaGFyICopc3RyKSkpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSUxMRUdBTF9JTlRFR0VSKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfc3RyMnR5cGUsIEFTTjFfUl9JTExFR0FMX0lOVEVHRVIpOwogCQkJZ290byBiYWRfc3RyOwogCQkJfQogCQlicmVhazsKQEAgLTcwOSwxMiArNzA5LDEyIEBACiAJCWNhc2UgVl9BU04xX09CSkVDVDoKIAkJaWYgKGZvcm1hdCAhPSBBU04xX0dFTl9GT1JNQVRfQVNDSUkpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfT0JKRUNUX05PVF9BU0NJSV9GT1JNQVQpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9zdHIydHlwZSwgQVNOMV9SX09CSkVDVF9OT1RfQVNDSUlfRk9STUFUKTsKIAkJCWdvdG8gYmFkX2Zvcm07CiAJCQl9CiAJCWlmICghKGF0bXAtPnZhbHVlLm9iamVjdCA9IE9CSl90eHQyb2JqKHN0ciwgMCkpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lMTEVHQUxfT0JKRUNUKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfc3RyMnR5cGUsIEFTTjFfUl9JTExFR0FMX09CSkVDVCk7CiAJCQlnb3RvIGJhZF9zdHI7CiAJCQl9CiAJCWJyZWFrOwpAQCAtNzIzLDIzICs3MjMsMjMgQEAKIAkJY2FzZSBWX0FTTjFfR0VORVJBTElaRURUSU1FOgogCQlpZiAoZm9ybWF0ICE9IEFTTjFfR0VOX0ZPUk1BVF9BU0NJSSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9USU1FX05PVF9BU0NJSV9GT1JNQVQpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9zdHIydHlwZSwgQVNOMV9SX1RJTUVfTk9UX0FTQ0lJX0ZPUk1BVCk7CiAJCQlnb3RvIGJhZF9mb3JtOwogCQkJfQogCQlpZiAoIShhdG1wLT52YWx1ZS5hc24xX3N0cmluZyA9IEFTTjFfU1RSSU5HX25ldygpKSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfc3RyMnR5cGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCWdvdG8gYmFkX3N0cjsKIAkJCX0KIAkJaWYgKCFBU04xX1NUUklOR19zZXQoYXRtcC0+dmFsdWUuYXNuMV9zdHJpbmcsIHN0ciwgLTEpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9zdHIydHlwZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJZ290byBiYWRfc3RyOwogCQkJfQogCQlhdG1wLT52YWx1ZS5hc24xX3N0cmluZy0+dHlwZSA9IHV0eXBlOwogCQlpZiAoIUFTTjFfVElNRV9jaGVjayhhdG1wLT52YWx1ZS5hc24xX3N0cmluZykpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSUxMRUdBTF9USU1FX1ZBTFVFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfc3RyMnR5cGUsIEFTTjFfUl9JTExFR0FMX1RJTUVfVkFMVUUpOwogCQkJZ290byBiYWRfc3RyOwogCQkJfQogCkBAIC03NjEsNyArNzYxLDcgQEAKIAkJCWZvcm1hdCA9IE1CU1RSSU5HX1VURjg7CiAJCWVsc2UKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTExFR0FMX0ZPUk1BVCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3N0cjJ0eXBlLCBBU04xX1JfSUxMRUdBTF9GT1JNQVQpOwogCQkJZ290byBiYWRfZm9ybTsKIAkJCX0KIApAQCAtNzY5LDcgKzc2OSw3IEBACiAJCWlmIChBU04xX21ic3RyaW5nX2NvcHkoJmF0bXAtPnZhbHVlLmFzbjFfc3RyaW5nLCAodW5zaWduZWQgY2hhciAqKXN0ciwKIAkJCQkJCS0xLCBmb3JtYXQsIEFTTjFfdGFnMmJpdCh1dHlwZSkpIDw9IDApCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3N0cjJ0eXBlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlnb3RvIGJhZF9zdHI7CiAJCQl9CiAJCQpAQCAtNzgyLDcgKzc4Miw3IEBACiAKIAkJaWYgKCEoYXRtcC0+dmFsdWUuYXNuMV9zdHJpbmcgPSBBU04xX1NUUklOR19uZXcoKSkpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3N0cjJ0eXBlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlnb3RvIGJhZF9mb3JtOwogCQkJfQogCkBAIC03OTEsNyArNzkxLDcgQEAKIAogCQkJaWYgKCEocmRhdGEgPSBzdHJpbmdfdG9faGV4KChjaGFyICopc3RyLCAmcmRsZW4pKSkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lMTEVHQUxfSEVYKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3N0cjJ0eXBlLCBBU04xX1JfSUxMRUdBTF9IRVgpOwogCQkJCWdvdG8gYmFkX3N0cjsKIAkJCQl9CiAKQEAgLTgwNiw3ICs4MDYsNyBAQAogCQkJewogCQkJaWYgKCFDT05GX3BhcnNlX2xpc3Qoc3RyLCAnLCcsIDEsIGJpdHN0cl9jYiwgYXRtcC0+dmFsdWUuYml0X3N0cmluZykpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9MSVNUX0VSUk9SKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3N0cjJ0eXBlLCBBU04xX1JfTElTVF9FUlJPUik7CiAJCQkJZ290byBiYWRfc3RyOwogCQkJCX0KIAkJCW5vX3VudXNlZCA9IDA7CkBAIC04MTQsNyArODE0LDcgQEAKIAkJCX0KIAkJZWxzZSAKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTExFR0FMX0JJVFNUUklOR19GT1JNQVQpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9zdHIydHlwZSwgQVNOMV9SX0lMTEVHQUxfQklUU1RSSU5HX0ZPUk1BVCk7CiAJCQlnb3RvIGJhZF9mb3JtOwogCQkJfQogCkBAIC04MzAsNyArODMwLDcgQEAKIAkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1VOU1VQUE9SVEVEX1RZUEUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3N0cjJ0eXBlLCBBU04xX1JfVU5TVVBQT1JURURfVFlQRSk7CiAJCWdvdG8gYmFkX3N0cjsKIAkJYnJlYWs7CiAJCX0KQEAgLTg2MCwxMiArODYwLDEyIEBACiAJCXJldHVybiAwOwogCWlmIChiaXRudW0gPCAwKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTlZBTElEX05VTUJFUik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGJpdHN0cl9jYiwgQVNOMV9SX0lOVkFMSURfTlVNQkVSKTsKIAkJcmV0dXJuIDA7CiAJCX0KIAlpZiAoIUFTTjFfQklUX1NUUklOR19zZXRfYml0KGJpdHN0ciwgYml0bnVtLCAxKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGJpdHN0cl9jYiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gMDsKIAkJfQogCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L2J5X2Rpci5jIGIvc3JjL2NyeXB0by94NTA5L2J5X2Rpci5jCmluZGV4IDMzOTNkZmEuLjM0YmIxZTQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS9ieV9kaXIuYworKysgYi9zcmMvY3J5cHRvL3g1MDkvYnlfZGlyLmMKQEAgLTEzOSw3ICsxMzksNyBAQAogCQkJCQlYNTA5X0ZJTEVUWVBFX1BFTSk7CiAJCQlpZiAoIXJldCkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX0xPQURJTkdfQ0VSVF9ESVIpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIGRpcl9jdHJsLCBYNTA5X1JfTE9BRElOR19DRVJUX0RJUik7CiAJCQkJfQogCQkJfQogCQllbHNlCkBAIC0yMDgsNyArMjA4LDcgQEAKIAogCWlmIChkaXIgPT0gTlVMTCB8fCAhKmRpcikKIAkgICAgewotCSAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfSU5WQUxJRF9ESVJFQ1RPUlkpOworCSAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBhZGRfY2VydF9kaXIsIFg1MDlfUl9JTlZBTElEX0RJUkVDVE9SWSk7CiAJICAgIHJldHVybiAwOwogCSAgICB9CiAKQEAgLTIzNyw3ICsyMzcsNyBAQAogCQkJCWN0eC0+ZGlycyA9IHNrX0JZX0RJUl9FTlRSWV9uZXdfbnVsbCgpOwogCQkJCWlmICghY3R4LT5kaXJzKQogCQkJCQl7Ci0JCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYWRkX2NlcnRfZGlyLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQkJCXJldHVybiAwOwogCQkJCQl9CiAJCQkJfQpAQCAtMzExLDEzICszMTEsMTMgQEAKIAkJfQogCWVsc2UKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfV1JPTkdfTE9PS1VQX1RZUEUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBnZXRfY2VydF9ieV9zdWJqZWN0LCBYNTA5X1JfV1JPTkdfTE9PS1VQX1RZUEUpOwogCQlnb3RvIGZpbmlzaDsKIAkJfQogCiAJaWYgKChiPUJVRl9NRU1fbmV3KCkpID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfQlVGX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIGdldF9jZXJ0X2J5X3N1YmplY3QsIEVSUl9SX0JVRl9MSUIpOwogCQlnb3RvIGZpbmlzaDsKIAkJfQogCQpAQCAtMzM3LDcgKzMzNyw3IEBACiAJCQlqPXN0cmxlbihlbnQtPmRpcikrMSs4KzYrMSsxOwogCQkJaWYgKCFCVUZfTUVNX2dyb3coYixqKSkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIGdldF9jZXJ0X2J5X3N1YmplY3QsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCQlnb3RvIGZpbmlzaDsKIAkJCQl9CiAJCQlpZiAodHlwZSA9PSBYNTA5X0xVX0NSTCAmJiBlbnQtPmhhc2hlcykKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS9ieV9maWxlLmMgYi9zcmMvY3J5cHRvL3g1MDkvYnlfZmlsZS5jCmluZGV4IGYxZDYxOTQuLjJmZGJjZTQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS9ieV9maWxlLmMKKysrIGIvc3JjL2NyeXB0by94NTA5L2J5X2ZpbGUuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiAKIAkJCWlmICghb2spCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9MT0FESU5HX0RFRkFVTFRTKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBieV9maWxlX2N0cmwsIFg1MDlfUl9MT0FESU5HX0RFRkFVTFRTKTsKIAkJCQl9CiAJCQl9CiAJCWVsc2UKQEAgLTEzNyw3ICsxMzcsNyBAQAogCiAJaWYgKChpbiA9PSBOVUxMKSB8fCAoQklPX3JlYWRfZmlsZW5hbWUoaW4sZmlsZSkgPD0gMCkpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfU1lTX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfbG9hZF9jZXJ0X2ZpbGUsIEVSUl9SX1NZU19MSUIpOwogCQlnb3RvIGVycjsKIAkJfQogCkBAIC0xNTYsNyArMTU2LDcgQEAKIAkJCQkJfQogCQkJCWVsc2UKIAkJCQkJewotCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9QRU1fTElCKTsKKwkJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9sb2FkX2NlcnRfZmlsZSwgRVJSX1JfUEVNX0xJQik7CiAJCQkJCWdvdG8gZXJyOwogCQkJCQl9CiAJCQkJfQpAQCAtMTczLDcgKzE3Myw3IEBACiAJCXg9ZDJpX1g1MDlfYmlvKGluLE5VTEwpOwogCQlpZiAoeCA9PSBOVUxMKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfQVNOMV9MSUIpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9sb2FkX2NlcnRfZmlsZSwgRVJSX1JfQVNOMV9MSUIpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCWk9WDUwOV9TVE9SRV9hZGRfY2VydChjdHgtPnN0b3JlX2N0eCx4KTsKQEAgLTE4Miw3ICsxODIsNyBAQAogCQl9CiAJZWxzZQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9CQURfWDUwOV9GSUxFVFlQRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfbG9hZF9jZXJ0X2ZpbGUsIFg1MDlfUl9CQURfWDUwOV9GSUxFVFlQRSk7CiAJCWdvdG8gZXJyOwogCQl9CiBlcnI6CkBAIC0yMDMsNyArMjAzLDcgQEAKIAogCWlmICgoaW4gPT0gTlVMTCkgfHwgKEJJT19yZWFkX2ZpbGVuYW1lKGluLGZpbGUpIDw9IDApKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX1NZU19MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X2xvYWRfY3JsX2ZpbGUsIEVSUl9SX1NZU19MSUIpOwogCQlnb3RvIGVycjsKIAkJfQogCkBAIC0yMjIsNyArMjIyLDcgQEAKIAkJCQkJfQogCQkJCWVsc2UKIAkJCQkJewotCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9QRU1fTElCKTsKKwkJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9sb2FkX2NybF9maWxlLCBFUlJfUl9QRU1fTElCKTsKIAkJCQkJZ290byBlcnI7CiAJCQkJCX0KIAkJCQl9CkBAIC0yMzksNyArMjM5LDcgQEAKIAkJeD1kMmlfWDUwOV9DUkxfYmlvKGluLE5VTEwpOwogCQlpZiAoeCA9PSBOVUxMKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfQVNOMV9MSUIpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9sb2FkX2NybF9maWxlLCBFUlJfUl9BU04xX0xJQik7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJaT1YNTA5X1NUT1JFX2FkZF9jcmwoY3R4LT5zdG9yZV9jdHgseCk7CkBAIC0yNDgsNyArMjQ4LDcgQEAKIAkJfQogCWVsc2UKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfQkFEX1g1MDlfRklMRVRZUEUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X2xvYWRfY3JsX2ZpbGUsIFg1MDlfUl9CQURfWDUwOV9GSUxFVFlQRSk7CiAJCWdvdG8gZXJyOwogCQl9CiBlcnI6CkBAIC0yNjgsMTMgKzI2OCwxMyBAQAogCQlyZXR1cm4gWDUwOV9sb2FkX2NlcnRfZmlsZShjdHgsIGZpbGUsIHR5cGUpOwogCWluID0gQklPX25ld19maWxlKGZpbGUsICJyIik7CiAJaWYoIWluKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX1NZU19MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X2xvYWRfY2VydF9jcmxfZmlsZSwgRVJSX1JfU1lTX0xJQik7CiAJCXJldHVybiAwOwogCX0KIAlpbmYgPSBQRU1fWDUwOV9JTkZPX3JlYWRfYmlvKGluLCBOVUxMLCBOVUxMLCBOVUxMKTsKIAlCSU9fZnJlZShpbik7CiAJaWYoIWluZikgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9QRU1fTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9sb2FkX2NlcnRfY3JsX2ZpbGUsIEVSUl9SX1BFTV9MSUIpOwogCQlyZXR1cm4gMDsKIAl9CiAJZm9yKGkgPSAwOyBpIDwgc2tfWDUwOV9JTkZPX251bShpbmYpOyBpKyspIHsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS9pMmRfcHIuYyBiL3NyYy9jcnlwdG8veDUwOS9pMmRfcHIuYwppbmRleCBlN2Y0MjY5Li40NDNjYTUzIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDkvaTJkX3ByLmMKKysrIGIvc3JjL2NyeXB0by94NTA5L2kyZF9wci5jCkBAIC03OCw3ICs3OCw3IEBACiAJfQogCS8qIEFsdGhvdWdoIHRoaXMgZmlsZSBpcyBpbiBjcnlwdG8veDUwOSBmb3IgbGF5ZXJpbmcgcmVhc29ucywgaXQgZW1pdHMKIAkgKiBhbiBlcnJvciBjb2RlIGZyb20gQVNOMSBmb3IgT3BlblNTTCBjb21wYXRpYmlsaXR5LiAqLwotCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9VTlNVUFBPUlRFRF9QVUJMSUNfS0VZX1RZUEUpOworCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGkyZF9Qcml2YXRlS2V5LCBBU04xX1JfVU5TVVBQT1JURURfUFVCTElDX0tFWV9UWVBFKTsKIAlyZXR1cm4gLTE7CiAJfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkvcGtjczcuYyBiL3NyYy9jcnlwdG8veDUwOS9wa2NzNy5jCmluZGV4IDIwODdmOTQuLjk5ZWUzZGEgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS9wa2NzNy5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS9wa2NzNy5jCkBAIC01Nyw3ICs1Nyw4IEBACiAgIH0KIAogICBpZiAoT0JKX2NiczJuaWQoJmNvbnRlbnRfdHlwZSkgIT0gTklEX3BrY3M3X3NpZ25lZCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9OT1RfUEtDUzdfU0lHTkVEX0RBVEEpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIHBrY3M3X3BhcnNlX2hlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICBYNTA5X1JfTk9UX1BLQ1M3X1NJR05FRF9EQVRBKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC03Miw3ICs3Myw4IEBACiAgIH0KIAogICBpZiAodmVyc2lvbiA8IDEpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfQkFEX1BLQ1M3X1ZFUlNJT04pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIHBrY3M3X3BhcnNlX2hlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICBYNTA5X1JfQkFEX1BLQ1M3X1ZFUlNJT04pOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTEwMSw3ICsxMDMsOCBAQAogICAvKiBTZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIzMTUjc2VjdGlvbi05LjEgKi8KICAgaWYgKCFDQlNfZ2V0X2FzbjEoJnNpZ25lZF9kYXRhLCAmY2VydGlmaWNhdGVzLAogICAgICAgICAgICAgICAgICAgICBDQlNfQVNOMV9DT05URVhUX1NQRUNJRklDIHwgQ0JTX0FTTjFfQ09OU1RSVUNURUQgfCAwKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9OT19DRVJUSUZJQ0FURVNfSU5DTFVERUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFBLQ1M3X2dldF9jZXJ0aWZpY2F0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgWDUwOV9SX05PX0NFUlRJRklDQVRFU19JTkNMVURFRCk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMTY4LDcgKzE3MSw4IEBACiAKICAgaWYgKCFDQlNfZ2V0X2FzbjEoJnNpZ25lZF9kYXRhLCAmY3JscywKICAgICAgICAgICAgICAgICAgICAgQ0JTX0FTTjFfQ09OVEVYVF9TUEVDSUZJQyB8IENCU19BU04xX0NPTlNUUlVDVEVEIHwgMSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfTk9fQ1JMU19JTkNMVURFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgUEtDUzdfZ2V0X0NSTHMsCisgICAgICAgICAgICAgICAgICAgICAgWDUwOV9SX05PX0NSTFNfSU5DTFVERUQpOwogICAgIGdvdG8gZXJyOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS90X2NybC5jIGIvc3JjL2NyeXB0by94NTA5L3RfY3JsLmMKaW5kZXggYTJkOGJjNy4uOTNhN2FmYiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5L3RfY3JsLmMKKysrIGIvc3JjL2NyeXB0by94NTA5L3RfY3JsLmMKQEAgLTcwLDcgKzcwLDcgQEAKIAogICAgICAgICBpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX0JVRl9MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0NSTF9wcmludF9mcCwgRVJSX1JfQlVGX0xJQik7CiAgICAgICAgICAgICAgICAgcmV0dXJuKDApOwogCQl9CiAgICAgICAgIEJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkvdF9yZXEuYyBiL3NyYy9jcnlwdG8veDUwOS90X3JlcS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWM4MzZjLi4wMDAwMDAwCi0tLSBhL3NyYy9jcnlwdG8veDUwOS90X3JlcS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KLSAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKLSAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgotICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcwotICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCi0gKgotICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KLSAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KLSAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KLSAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCi0gKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKLSAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQotICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKLSAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQotICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCi0gKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQotICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCi0gKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKLSAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKLSAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgotI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgotCi0KLWludCBYNTA5X1JFUV9wcmludF9mcChGSUxFICpmcCwgWDUwOV9SRVEgKngpIHsKLSAgQklPICpiaW8gPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7Ci0gIGlmIChiaW8gPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX0JVRl9MSUIpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgQklPX3NldF9mcChiaW8sIGZwLCBCSU9fTk9DTE9TRSk7Ci0gIGludCByZXQgPSBYNTA5X1JFUV9wcmludChiaW8sIHgpOwotICBCSU9fZnJlZShiaW8pOwotICByZXR1cm4gcmV0OwotfQotCi1pbnQgWDUwOV9SRVFfcHJpbnRfZXgoQklPICpiaW8sIFg1MDlfUkVRICp4LCB1bnNpZ25lZCBsb25nIG5tZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjZmxhZykgewotICBsb25nIGw7Ci0gIEVWUF9QS0VZICpwa2V5OwotICBTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKiBzazsKLSAgY2hhciBtbGNoID0gJyAnOwotCi0gIGludCBubWluZGVudCA9IDA7Ci0KLSAgaWYgKChubWZsYWdzICYgWE5fRkxBR19TRVBfTUFTSykgPT0gWE5fRkxBR19TRVBfTVVMVElMSU5FKSB7Ci0gICAgbWxjaCA9ICdcbic7Ci0gICAgbm1pbmRlbnQgPSAxMjsKLSAgfQotCi0gIGlmIChubWZsYWdzID09IFg1MDlfRkxBR19DT01QQVQpIHsKLSAgICBubWluZGVudCA9IDE2OwotICB9Ci0KLSAgWDUwOV9SRVFfSU5GTyAqcmkgPSB4LT5yZXFfaW5mbzsKLSAgaWYgKCEoY2ZsYWcgJiBYNTA5X0ZMQUdfTk9fSEVBREVSKSkgewotICAgIGlmIChCSU9fd3JpdGUoYmlvLCAiQ2VydGlmaWNhdGUgUmVxdWVzdDpcbiIsIDIxKSA8PSAwIHx8Ci0gICAgICAgIEJJT193cml0ZShiaW8sICIgICAgRGF0YTpcbiIsIDEwKSA8PSAwKSB7Ci0gICAgICBnb3RvIGVycjsKLSAgICB9Ci0gIH0KLSAgaWYgKCEoY2ZsYWcgJiBYNTA5X0ZMQUdfTk9fVkVSU0lPTikpIHsKLSAgICBsID0gWDUwOV9SRVFfZ2V0X3ZlcnNpb24oeCk7Ci0gICAgaWYgKEJJT19wcmludGYoYmlvLCAiJThzVmVyc2lvbjogJWxkICgweCVseClcbiIsICIiLCBsICsgMSwgbCkgPD0gMCkgewotICAgICAgZ290byBlcnI7Ci0gICAgfQotICB9Ci0gIGlmICghKGNmbGFnICYgWDUwOV9GTEFHX05PX1NVQkpFQ1QpKSB7Ci0gICAgaWYgKEJJT19wcmludGYoYmlvLCAiICAgICAgICBTdWJqZWN0OiVjIiwgbWxjaCkgPD0gMCB8fAotICAgICAgICBYNTA5X05BTUVfcHJpbnRfZXgoYmlvLCByaS0+c3ViamVjdCwgbm1pbmRlbnQsIG5tZmxhZ3MpIDwgMCB8fAotICAgICAgICBCSU9fd3JpdGUoYmlvLCAiXG4iLCAxKSA8PSAwKSB7Ci0gICAgICBnb3RvIGVycjsKLSAgICB9Ci0gIH0KLSAgaWYgKCEoY2ZsYWcgJiBYNTA5X0ZMQUdfTk9fUFVCS0VZKSkgewotICAgIGlmIChCSU9fd3JpdGUoYmlvLCAiICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzpcbiIsIDMzKSA8PSAwIHx8Ci0gICAgICAgIEJJT19wcmludGYoYmlvLCAiJTEyc1B1YmxpYyBLZXkgQWxnb3JpdGhtOiAiLCAiIikgPD0gMCB8fAotICAgICAgICBpMmFfQVNOMV9PQkpFQ1QoYmlvLCByaS0+cHVia2V5LT5hbGdvci0+YWxnb3JpdGhtKSA8PSAwIHx8Ci0gICAgICAgIEJJT19wdXRzKGJpbywgIlxuIikgPD0gMCkgewotICAgICAgZ290byBlcnI7Ci0gICAgfQotCi0gICAgcGtleSA9IFg1MDlfUkVRX2dldF9wdWJrZXkoeCk7Ci0gICAgaWYgKHBrZXkgPT0gTlVMTCkgewotICAgICAgQklPX3ByaW50ZihiaW8sICIlMTJzVW5hYmxlIHRvIGxvYWQgUHVibGljIEtleVxuIiwgIiIpOwotICAgICAgRVJSX3ByaW50X2Vycm9ycyhiaW8pOwotICAgIH0gZWxzZSB7Ci0gICAgICBFVlBfUEtFWV9wcmludF9wdWJsaWMoYmlvLCBwa2V5LCAxNiwgTlVMTCk7Ci0gICAgICBFVlBfUEtFWV9mcmVlKHBrZXkpOwotICAgIH0KLSAgfQotCi0gIGlmICghKGNmbGFnICYgWDUwOV9GTEFHX05PX0FUVFJJQlVURVMpKSB7Ci0gICAgaWYgKEJJT19wcmludGYoYmlvLCAiJThzQXR0cmlidXRlczpcbiIsICIiKSA8PSAwKSB7Ci0gICAgICBnb3RvIGVycjsKLSAgICB9Ci0KLSAgICBzayA9IHgtPnJlcV9pbmZvLT5hdHRyaWJ1dGVzOwotICAgIGlmIChza19YNTA5X0FUVFJJQlVURV9udW0oc2spID09IDApIHsKLSAgICAgIGlmIChCSU9fcHJpbnRmKGJpbywgIiUxMnNhMDowMFxuIiwgIiIpIDw9IDApIHsKLSAgICAgICAgZ290byBlcnI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNpemVfdCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfQVRUUklCVVRFX251bShzayk7IGkrKykgewotICAgICAgICBYNTA5X0FUVFJJQlVURSAqYSA9IHNrX1g1MDlfQVRUUklCVVRFX3ZhbHVlKHNrLCBpKTsKLSAgICAgICAgQVNOMV9PQkpFQ1QgKmFvYmogPSBYNTA5X0FUVFJJQlVURV9nZXQwX29iamVjdChhKTsKLQotICAgICAgICBpZiAoWDUwOV9SRVFfZXh0ZW5zaW9uX25pZChPQkpfb2JqMm5pZChhb2JqKSkpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChCSU9fcHJpbnRmKGJpbywgIiUxMnMiLCAiIikgPD0gMCkgewotICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgaW50IG51bV9hdHRycyA9IFg1MDlfQVRUUklCVVRFX2NvdW50KGEpOwotICAgICAgICBjb25zdCBpbnQgb2JqX3N0cl9sZW4gPSBpMmFfQVNOMV9PQkpFQ1QoYmlvLCBhb2JqKTsKLSAgICAgICAgaWYgKG9ial9zdHJfbGVuIDw9IDApIHsKLSAgICAgICAgICBpZiAoQklPX3B1dHMoYmlvLCAiKFVuYWJsZSB0byBwcmludCBhdHRyaWJ1dGUgSUQuKVxuIikgPCAwKSB7Ci0gICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGo7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fYXR0cnM7IGorKykgewotICAgICAgICAgIGNvbnN0IEFTTjFfVFlQRSAqYXQgPSBYNTA5X0FUVFJJQlVURV9nZXQwX3R5cGUoYSwgaik7Ci0gICAgICAgICAgY29uc3QgaW50IHR5cGUgPSBhdC0+dHlwZTsKLSAgICAgICAgICBBU04xX0JJVF9TVFJJTkcgKmJzID0gYXQtPnZhbHVlLmFzbjFfc3RyaW5nOwotCi0gICAgICAgICAgaW50IGs7Ci0gICAgICAgICAgZm9yIChrID0gMjUgLSBvYmpfc3RyX2xlbjsgayA+IDA7IGstLSkgewotICAgICAgICAgICAgaWYgKEJJT193cml0ZShiaW8sICIgIiwgMSkgIT0gMSkgewotICAgICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoQklPX3B1dHMoYmlvLCAiOiIpIDw9IDApIHsKLSAgICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICh0eXBlID09IFZfQVNOMV9QUklOVEFCTEVTVFJJTkcgfHwKLSAgICAgICAgICAgICAgdHlwZSA9PSBWX0FTTjFfVVRGOFNUUklORyB8fAotICAgICAgICAgICAgICB0eXBlID09IFZfQVNOMV9JQTVTVFJJTkcgfHwKLSAgICAgICAgICAgICAgdHlwZSA9PSBWX0FTTjFfVDYxU1RSSU5HKSB7Ci0gICAgICAgICAgICBpZiAoQklPX3dyaXRlKGJpbywgKGNoYXIgKilicy0+ZGF0YSwgYnMtPmxlbmd0aCkgIT0gYnMtPmxlbmd0aCkgewotICAgICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJJT19wdXRzKGJpbywgIlxuIik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEJJT19wdXRzKGJpbywgInVuYWJsZSB0byBwcmludCBhdHRyaWJ1dGVcbiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmICghKGNmbGFnICYgWDUwOV9GTEFHX05PX0VYVEVOU0lPTlMpKSB7Ci0gICAgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpleHRzID0gWDUwOV9SRVFfZ2V0X2V4dGVuc2lvbnMoeCk7Ci0gICAgaWYgKGV4dHMpIHsKLSAgICAgIEJJT19wcmludGYoYmlvLCAiJThzUmVxdWVzdGVkIEV4dGVuc2lvbnM6XG4iLCAiIik7Ci0KLSAgICAgIHNpemVfdCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfRVhURU5TSU9OX251bShleHRzKTsgaSsrKSB7Ci0gICAgICAgIFg1MDlfRVhURU5TSU9OICpleCA9IHNrX1g1MDlfRVhURU5TSU9OX3ZhbHVlKGV4dHMsIGkpOwotICAgICAgICBpZiAoQklPX3ByaW50ZihiaW8sICIlMTJzIiwgIiIpIDw9IDApIHsKLSAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgfQotICAgICAgICBBU04xX09CSkVDVCAqb2JqID0gWDUwOV9FWFRFTlNJT05fZ2V0X29iamVjdChleCk7Ci0gICAgICAgIGkyYV9BU04xX09CSkVDVChiaW8sIG9iaik7Ci0gICAgICAgIGNvbnN0IGludCBpc19jcml0aWNhbCA9IFg1MDlfRVhURU5TSU9OX2dldF9jcml0aWNhbChleCk7Ci0gICAgICAgIGlmIChCSU9fcHJpbnRmKGJpbywgIjogJXNcbiIsIGlzX2NyaXRpY2FsID8gImNyaXRpY2FsIiA6ICIiKSA8PSAwKSB7Ci0gICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFYNTA5VjNfRVhUX3ByaW50KGJpbywgZXgsIGNmbGFnLCAxNikpIHsKLSAgICAgICAgICBCSU9fcHJpbnRmKGJpbywgIiUxNnMiLCAiIik7Ci0gICAgICAgICAgQVNOMV9TVFJJTkdfcHJpbnQoYmlvLCBYNTA5X0VYVEVOU0lPTl9nZXRfZGF0YShleCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCSU9fd3JpdGUoYmlvLCAiXG4iLCAxKSA8PSAwKSB7Ci0gICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHNrX1g1MDlfRVhURU5TSU9OX3BvcF9mcmVlKGV4dHMsIFg1MDlfRVhURU5TSU9OX2ZyZWUpOwotICAgIH0KLSAgfQotCi0gIGlmICghKGNmbGFnICYgWDUwOV9GTEFHX05PX1NJR0RVTVApICYmCi0gICAgICAhWDUwOV9zaWduYXR1cmVfcHJpbnQoYmlvLCB4LT5zaWdfYWxnLCB4LT5zaWduYXR1cmUpKSB7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICByZXR1cm4gMTsKLQotZXJyOgotICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9CVUZfTElCKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBYNTA5X1JFUV9wcmludChCSU8gKmJpbywgWDUwOV9SRVEgKnJlcSkgewotICByZXR1cm4gWDUwOV9SRVFfcHJpbnRfZXgoYmlvLCByZXEsIFhOX0ZMQUdfQ09NUEFULCBYNTA5X0ZMQUdfQ09NUEFUKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS90X3g1MDkuYyBiL3NyYy9jcnlwdG8veDUwOS90X3g1MDkuYwppbmRleCA3Nzg1ZWJmLi4yYjlhNDIxIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDkvdF94NTA5LmMKKysrIGIvc3JjL2NyeXB0by94NTA5L3RfeDUwOS5jCkBAIC03NCw3ICs3NCw3IEBACiAKICAgICAgICAgaWYgKChiPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9CVUZfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9wcmludF9leF9mcCwgRVJSX1JfQlVGX0xJQik7CiAgICAgICAgICAgICAgICAgcmV0dXJuKDApOwogCQl9CiAgICAgICAgIEJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CkBAIC00OTMsNyArNDkzLDcgQEAKIAlpZiAoMCkKIAkJewogZXJyOgotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9CVUZfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9OQU1FX3ByaW50LCBFUlJfUl9CVUZfTElCKTsKIAkJfQogCU9QRU5TU0xfZnJlZShiKTsKIAlyZXR1cm4ocmV0KTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS94NTA5X2F0dC5jIGIvc3JjL2NyeXB0by94NTA5L3g1MDlfYXR0LmMKaW5kZXggMTQ5MTQ4NC4uOTBlNzgxMCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5L3g1MDlfYXR0LmMKKysrIGIvc3JjL2NyeXB0by94NTA5L3g1MDlfYXR0LmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogCiAJaWYgKHggPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5YXRfYWRkMV9hdHRyLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOwogCQlnb3RvIGVycjI7CiAJCX0gCiAKQEAgLTE0NCw3ICsxNDQsNyBAQAogCQkqeD1zazsKIAlyZXR1cm4oc2spOwogZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5YXRfYWRkMV9hdHRyLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiBlcnIyOgogCWlmIChuZXdfYXR0ciAhPSBOVUxMKSBYNTA5X0FUVFJJQlVURV9mcmVlKG5ld19hdHRyKTsKIAlpZiAoc2sgIT0gTlVMTCkgc2tfWDUwOV9BVFRSSUJVVEVfZnJlZShzayk7CkBAIC0yMTQsNyArMjE0LDcgQEAKIAlvYmo9T0JKX25pZDJvYmoobmlkKTsKIAlpZiAob2JqID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX1VOS05PV05fTklEKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9BVFRSSUJVVEVfY3JlYXRlX2J5X05JRCwgWDUwOV9SX1VOS05PV05fTklEKTsKIAkJcmV0dXJuKE5VTEwpOwogCQl9CiAJcmV0dXJuIFg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV9PQkooYXR0cixvYmosYXRydHlwZSxkYXRhLGxlbik7CkBAIC0yMjksNyArMjI5LDcgQEAKIAkJewogCQlpZiAoKHJldD1YNTA5X0FUVFJJQlVURV9uZXcoKSkgPT0gTlVMTCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV9PQkosIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCXJldHVybihOVUxMKTsKIAkJCX0KIAkJfQpAQCAtMjU4LDcgKzI1OCw3IEBACiAJb2JqPU9CSl90eHQyb2JqKGF0cm5hbWUsIDApOwogCWlmIChvYmogPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfSU5WQUxJRF9GSUVMRF9OQU1FKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9BVFRSSUJVVEVfY3JlYXRlX2J5X3R4dCwgWDUwOV9SX0lOVkFMSURfRklFTERfTkFNRSk7CiAJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAibmFtZT0iLCBhdHJuYW1lKTsKIAkJcmV0dXJuKE5VTEwpOwogCQl9CkBAIC0yODYsNyArMjg2LDcgQEAKIAkJc3RtcCA9IEFTTjFfU1RSSU5HX3NldF9ieV9OSUQoTlVMTCwgZGF0YSwgbGVuLCBhdHRydHlwZSwKIAkJCQkJCU9CSl9vYmoybmlkKGF0dHItPm9iamVjdCkpOwogCQlpZighc3RtcCkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfQVNOMV9MSUIpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9BVFRSSUJVVEVfc2V0MV9kYXRhLCBFUlJfUl9BU04xX0xJQik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlhdHlwZSA9IHN0bXAtPnR5cGU7CkBAIC0zMTQsNyArMzE0LDcgQEAKIAlpZighc2tfQVNOMV9UWVBFX3B1c2goYXR0ci0+dmFsdWUuc2V0LCB0dG1wKSkgZ290byBlcnI7CiAJcmV0dXJuIDE7CiAJZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0FUVFJJQlVURV9zZXQxX2RhdGEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzM4LDcgKzMzOCw3IEBACiAJdHRtcCA9IFg1MDlfQVRUUklCVVRFX2dldDBfdHlwZShhdHRyLCBpZHgpOwogCWlmKCF0dG1wKSByZXR1cm4gTlVMTDsKIAlpZihhdHJ0eXBlICE9IEFTTjFfVFlQRV9nZXQodHRtcCkpewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfV1JPTkdfVFlQRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfQVRUUklCVVRFX2dldDBfZGF0YSwgWDUwOV9SX1dST05HX1RZUEUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJcmV0dXJuIHR0bXAtPnZhbHVlLnB0cjsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS94NTA5X2NtcC5jIGIvc3JjL2NyeXB0by94NTA5L3g1MDlfY21wLmMKaW5kZXggMGUzNWYzZS4uNzEyZTM2YiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5L3g1MDlfY21wLmMKKysrIGIvc3JjL2NyeXB0by94NTA5L3g1MDlfY21wLmMKQEAgLTMzMywxMyArMzMzLDEzIEBACiAJY2FzZSAxOgogCQlicmVhazsKIAljYXNlIDA6Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9LRVlfVkFMVUVTX01JU01BVENIKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9jaGVja19wcml2YXRlX2tleSwgWDUwOV9SX0tFWV9WQUxVRVNfTUlTTUFUQ0gpOwogCQlicmVhazsKIAljYXNlIC0xOgotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfS0VZX1RZUEVfTUlTTUFUQ0gpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X2NoZWNrX3ByaXZhdGVfa2V5LCBYNTA5X1JfS0VZX1RZUEVfTUlTTUFUQ0gpOwogCQlicmVhazsKIAljYXNlIC0yOgotCSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX1VOS05PV05fS0VZX1RZUEUpOworCSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9jaGVja19wcml2YXRlX2tleSwgWDUwOV9SX1VOS05PV05fS0VZX1RZUEUpOwogCQl9CiAJaWYgKHhrKQogCQlFVlBfUEtFWV9mcmVlKHhrKTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS94NTA5X2x1LmMgYi9zcmMvY3J5cHRvL3g1MDkveDUwOV9sdS5jCmluZGV4IDZkN2JjMjYuLmE2NjIzMDUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS94NTA5X2x1LmMKKysrIGIvc3JjL2NyeXB0by94NTA5L3g1MDlfbHUuYwpAQCAtMzQ1LDcgKzM0NSw3IEBACiAJb2JqPShYNTA5X09CSkVDVCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X09CSkVDVCkpOwogCWlmIChvYmogPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfU1RPUkVfYWRkX2NlcnQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIDA7CiAJCX0KIAlvYmotPnR5cGU9WDUwOV9MVV9YNTA5OwpAQCAtMzU5LDcgKzM1OSw3IEBACiAJCXsKIAkJWDUwOV9PQkpFQ1RfZnJlZV9jb250ZW50cyhvYmopOwogCQlPUEVOU1NMX2ZyZWUob2JqKTsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX0NFUlRfQUxSRUFEWV9JTl9IQVNIX1RBQkxFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9TVE9SRV9hZGRfY2VydCwgWDUwOV9SX0NFUlRfQUxSRUFEWV9JTl9IQVNIX1RBQkxFKTsKIAkJcmV0PTA7CiAJCX0gCiAJZWxzZSBza19YNTA5X09CSkVDVF9wdXNoKGN0eC0+b2Jqcywgb2JqKTsKQEAgLTM3OCw3ICszNzgsNyBAQAogCW9iaj0oWDUwOV9PQkpFQ1QgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOV9PQkpFQ1QpKTsKIAlpZiAob2JqID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1NUT1JFX2FkZF9jcmwsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIDA7CiAJCX0KIAlvYmotPnR5cGU9WDUwOV9MVV9DUkw7CkBAIC0zOTIsNyArMzkyLDcgQEAKIAkJewogCQlYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKG9iaik7CiAJCU9QRU5TU0xfZnJlZShvYmopOwotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfQ0VSVF9BTFJFQURZX0lOX0hBU0hfVEFCTEUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1NUT1JFX2FkZF9jcmwsIFg1MDlfUl9DRVJUX0FMUkVBRFlfSU5fSEFTSF9UQUJMRSk7CiAJCXJldD0wOwogCQl9CiAJZWxzZSBza19YNTA5X09CSkVDVF9wdXNoKGN0eC0+b2Jqcywgb2JqKTsKQEAgLTQxMCw3ICs0MTAsNyBAQAogCQlYNTA5X3VwX3JlZihhLT5kYXRhLng1MDkpOwogCQlicmVhazsKIAljYXNlIFg1MDlfTFVfQ1JMOgotCQlYNTA5X0NSTF91cF9yZWYoYS0+ZGF0YS5jcmwpOworCQlDUllQVE9fcmVmY291bnRfaW5jKCZhLT5kYXRhLmNybC0+cmVmZXJlbmNlcyk7CiAJCWJyZWFrOwogCQl9CiAJfQpAQCAtNTcyLDcgKzU3Miw3IEBACiAJCXsKIAkJb2JqID0gc2tfWDUwOV9PQkpFQ1RfdmFsdWUoY3R4LT5jdHgtPm9ianMsIGlkeCk7CiAJCXggPSBvYmotPmRhdGEuY3JsOwotCQlYNTA5X0NSTF91cF9yZWYoeCk7CisJCUNSWVBUT19yZWZjb3VudF9pbmMoJngtPnJlZmVyZW5jZXMpOwogCQlpZiAoIXNrX1g1MDlfQ1JMX3B1c2goc2ssIHgpKQogCQkJewogCQkJQ1JZUFRPX01VVEVYX3VubG9jaygmY3R4LT5jdHgtPm9ianNfbG9jayk7CkBAIC02NDEsNyArNjQxLDcgQEAKIAkJaWYgKG9rID09IFg1MDlfTFVfUkVUUlkpCiAJCQl7CiAJCQlYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKCZvYmopOwotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX1NIT1VMRF9SRVRSWSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1NUT1JFX0NUWF9nZXQxX2lzc3VlciwgWDUwOV9SX1NIT1VMRF9SRVRSWSk7CiAJCQlyZXR1cm4gLTE7CiAJCQl9CiAJCWVsc2UgaWYgKG9rICE9IFg1MDlfTFVfRkFJTCkKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS94NTA5X29iai5jIGIvc3JjL2NyeXB0by94NTA5L3g1MDlfb2JqLmMKaW5kZXggYjZmMDgxNi4uOTE0ZTBkZSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5L3g1MDlfb2JqLmMKKysrIGIvc3JjL2NyeXB0by94NTA5L3g1MDlfb2JqLmMKQEAgLTE4NCw3ICsxODQsNyBAQAogCQkqcCA9ICdcMCc7CiAJcmV0dXJuKHApOwogZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X05BTUVfb25lbGluZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCWlmIChiICE9IE5VTEwpIEJVRl9NRU1fZnJlZShiKTsKIAlyZXR1cm4oTlVMTCk7CiAJfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L3g1MDlfcjJ4LmMgYi9zcmMvY3J5cHRvL3g1MDkveDUwOV9yMnguYwppbmRleCA4NTk3OWFjLi4zYzhlOWMwIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDkveDUwOV9yMnguYworKysgYi9zcmMvY3J5cHRvL3g1MDkveDUwOV9yMnguYwpAQCAtNzIsNyArNzIsNyBAQAogCiAJaWYgKChyZXQ9WDUwOV9uZXcoKSkgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUkVRX3RvX1g1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJZ290byBlcnI7CiAJCX0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L3g1MDlfcmVxLmMgYi9zcmMvY3J5cHRvL3g1MDkveDUwOV9yZXEuYwppbmRleCAwMWM1MTEzLi4yNzMyZDZlIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDkveDUwOV9yZXEuYworKysgYi9zcmMvY3J5cHRvL3g1MDkveDUwOV9yZXEuYwpAQCAtNzcsNyArNzcsNyBAQAogCXJldD1YNTA5X1JFUV9uZXcoKTsKIAlpZiAocmV0ID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X3RvX1g1MDlfUkVRLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCWdvdG8gZXJyOwogCQl9CiAKQEAgLTEyOCwyNCArMTI4LDI0IEBACiAJCW9rPTE7CiAJCWJyZWFrOwogCWNhc2UgMDoKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX0tFWV9WQUxVRVNfTUlTTUFUQ0gpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JFUV9jaGVja19wcml2YXRlX2tleSwgWDUwOV9SX0tFWV9WQUxVRVNfTUlTTUFUQ0gpOwogCQlicmVhazsKIAljYXNlIC0xOgotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfS0VZX1RZUEVfTUlTTUFUQ0gpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JFUV9jaGVja19wcml2YXRlX2tleSwgWDUwOV9SX0tFWV9UWVBFX01JU01BVENIKTsKIAkJYnJlYWs7CiAJY2FzZSAtMjoKIAkJaWYgKGstPnR5cGUgPT0gRVZQX1BLRVlfRUMpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9FQ19MSUIpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SRVFfY2hlY2tfcHJpdmF0ZV9rZXksIEVSUl9SX0VDX0xJQik7CiAJCQlicmVhazsKIAkJCX0KIAkJaWYgKGstPnR5cGUgPT0gRVZQX1BLRVlfREgpCiAJCQl7CiAJCQkvKiBObyBpZGVhICovCi0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfQ0FOVF9DSEVDS19ESF9LRVkpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SRVFfY2hlY2tfcHJpdmF0ZV9rZXksIFg1MDlfUl9DQU5UX0NIRUNLX0RIX0tFWSk7CiAJCQlicmVhazsKIAkJCX0KLQkgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9VTktOT1dOX0tFWV9UWVBFKTsKKwkgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUkVRX2NoZWNrX3ByaXZhdGVfa2V5LCBYNTA5X1JfVU5LTk9XTl9LRVlfVFlQRSk7CiAJCX0KIAogCUVWUF9QS0VZX2ZyZWUoeGspOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L3g1MDlfdHJzLmMgYi9zcmMvY3J5cHRvL3g1MDkveDUwOV90cnMuYwppbmRleCA4MjBlNjA1Li45YjdjYzljIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDkveDUwOV90cnMuYworKysgYi9zcmMvY3J5cHRvL3g1MDkveDUwOV90cnMuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiBpbnQgWDUwOV9UUlVTVF9zZXQoaW50ICp0LCBpbnQgdHJ1c3QpCiB7CiAJaWYoWDUwOV9UUlVTVF9nZXRfYnlfaWQodHJ1c3QpID09IC0xKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9JTlZBTElEX1RSVVNUKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9UUlVTVF9zZXQsIFg1MDlfUl9JTlZBTElEX1RSVVNUKTsKIAkJcmV0dXJuIDA7CiAJfQogCSp0ID0gdHJ1c3Q7CkBAIC0xNzksNyArMTc5LDcgQEAKIAkvKiBOZWVkIGEgbmV3IGVudHJ5ICovCiAJaWYoaWR4ID09IC0xKSB7CiAJCWlmKCEodHJ0bXAgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOV9UUlVTVCkpKSkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9UUlVTVF9hZGQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCXRydG1wLT5mbGFncyA9IFg1MDlfVFJVU1RfRFlOQU1JQzsKQEAgLTE4OCw3ICsxODgsNyBAQAogCS8qIER1cGxpY2F0ZSB0aGUgc3VwcGxpZWQgbmFtZS4gKi8KIAluYW1lX2R1cCA9IEJVRl9zdHJkdXAobmFtZSk7CiAJaWYgKG5hbWVfZHVwID09IE5VTEwpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1RSVVNUX2FkZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlpZiAoaWR4ID09IC0xKQogCQkJT1BFTlNTTF9mcmVlKHRydG1wKTsKIAkJcmV0dXJuIDA7CkBAIC0yMTAsMTIgKzIxMCwxMiBAQAogCS8qIElmIGl0cyBhIG5ldyBlbnRyeSBtYW5hZ2UgdGhlIGR5bmFtaWMgdGFibGUgKi8KIAlpZihpZHggPT0gLTEpIHsKIAkJaWYoIXRydGFibGUgJiYgISh0cnRhYmxlID0gc2tfWDUwOV9UUlVTVF9uZXcodHJfY21wKSkpIHsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfVFJVU1RfYWRkLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQl0cnRhYmxlX2ZyZWUodHJ0bXApOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaWYgKCFza19YNTA5X1RSVVNUX3B1c2godHJ0YWJsZSwgdHJ0bXApKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1RSVVNUX2FkZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJdHJ0YWJsZV9mcmVlKHRydG1wKTsKIAkJCXJldHVybiAwOwogCQl9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkveDUwOV92My5jIGIvc3JjL2NyeXB0by94NTA5L3g1MDlfdjMuYwppbmRleCBiMDQyOTg1Li4wZmM5YTlhIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDkveDUwOV92My5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS94NTA5X3YzLmMKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCiAJaWYgKHggPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5djNfYWRkX2V4dCwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKIAkJZ290byBlcnIyOwogCQl9CiAKQEAgLTE3MSw3ICsxNzEsNyBAQAogCQkqeD1zazsKIAlyZXR1cm4oc2spOwogZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5djNfYWRkX2V4dCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogZXJyMjoKIAlpZiAobmV3X2V4ICE9IE5VTEwpIFg1MDlfRVhURU5TSU9OX2ZyZWUobmV3X2V4KTsKIAlpZiAoc2sgIT0gTlVMTCkgc2tfWDUwOV9FWFRFTlNJT05fZnJlZShzayk7CkBAIC0xODcsNyArMTg3LDcgQEAKIAlvYmo9T0JKX25pZDJvYmoobmlkKTsKIAlpZiAob2JqID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX1VOS05PV05fTklEKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9FWFRFTlNJT05fY3JlYXRlX2J5X05JRCwgWDUwOV9SX1VOS05PV05fTklEKTsKIAkJcmV0dXJuKE5VTEwpOwogCQl9CiAJcmV0PVg1MDlfRVhURU5TSU9OX2NyZWF0ZV9ieV9PQkooZXgsb2JqLGNyaXQsZGF0YSk7CkBAIC0yMDMsNyArMjAzLDcgQEAKIAkJewogCQlpZiAoKHJldD1YNTA5X0VYVEVOU0lPTl9uZXcoKSkgPT0gTlVMTCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfRVhURU5TSU9OX2NyZWF0ZV9ieV9PQkosIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCXJldHVybihOVUxMKTsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L3g1MDlfdmZ5LmMgYi9zcmMvY3J5cHRvL3g1MDkveDUwOV92ZnkuYwppbmRleCA1ZDg1NmYwLi4yYmE5Yzg0IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDkveDUwOV92ZnkuYworKysgYi9zcmMvY3J5cHRvL3g1MDkveDUwOV92ZnkuYwpAQCAtNzIsOCArNzIsNyBAQAogI2luY2x1ZGUgIi4uL2ludGVybmFsLmgiCiAKIAotc3RhdGljIENSWVBUT19FWF9EQVRBX0NMQVNTIGdfZXhfZGF0YV9jbGFzcyA9Ci0JQ1JZUFRPX0VYX0RBVEFfQ0xBU1NfSU5JVF9XSVRIX0FQUF9EQVRBOworc3RhdGljIENSWVBUT19FWF9EQVRBX0NMQVNTIGdfZXhfZGF0YV9jbGFzcyA9IENSWVBUT19FWF9EQVRBX0NMQVNTX0lOSVQ7CiAKIC8qIENSTCBzY29yZSB2YWx1ZXMgKi8KIApAQCAtMjAyLDcgKzIwMSw3IEBACiAJU1RBQ0tfT0YoWDUwOSkgKnNrdG1wPU5VTEw7CiAJaWYgKGN0eC0+Y2VydCA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9OT19DRVJUX1NFVF9GT1JfVVNfVE9fVkVSSUZZKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV92ZXJpZnlfY2VydCwgWDUwOV9SX05PX0NFUlRfU0VUX0ZPUl9VU19UT19WRVJJRlkpOwogCQlyZXR1cm4gLTE7CiAJCX0KIApAQCAtMjE1LDcgKzIxNCw3IEBACiAJCWlmICgJKChjdHgtPmNoYWluPXNrX1g1MDlfbmV3X251bGwoKSkgPT0gTlVMTCkgfHwKIAkJCSghc2tfWDUwOV9wdXNoKGN0eC0+Y2hhaW4sY3R4LT5jZXJ0KSkpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X3ZlcmlmeV9jZXJ0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlnb3RvIGVuZDsKIAkJCX0KIAkJWDUwOV91cF9yZWYoY3R4LT5jZXJ0KTsKQEAgLTIyNiw3ICsyMjUsNyBAQAogCWlmIChjdHgtPnVudHJ1c3RlZCAhPSBOVUxMCiAJICAgICYmIChza3RtcD1za19YNTA5X2R1cChjdHgtPnVudHJ1c3RlZCkpID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X3ZlcmlmeV9jZXJ0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCWdvdG8gZW5kOwogCQl9CiAKQEAgLTI1Miw3ICsyNTEsNyBAQAogCQkJewogCQkJb2sgPSBjdHgtPmdldF9pc3N1ZXIoJnh0bXAsIGN0eCwgeCk7CiAJCQlpZiAob2sgPCAwKQotCQkJCWdvdG8gZW5kOworCQkJCXJldHVybiBvazsKIAkJCS8qIElmIHN1Y2Nlc3NmdWwgZm9yIG5vdyBmcmVlIHVwIGNlcnQgc28gaXQKIAkJCSAqIHdpbGwgYmUgcGlja2VkIHVwIGFnYWluIGxhdGVyLgogCQkJICovCkBAIC0yNzEsMTAgKzI3MCwxMCBAQAogCQkJCXsKIAkJCQlpZiAoIXNrX1g1MDlfcHVzaChjdHgtPmNoYWluLHh0bXApKQogCQkJCQl7Ci0JCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV92ZXJpZnlfY2VydCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJCQlnb3RvIGVuZDsKIAkJCQkJfQotCQkJCVg1MDlfdXBfcmVmKHh0bXApOworCQkJCUNSWVBUT19yZWZjb3VudF9pbmMoJnh0bXAtPnJlZmVyZW5jZXMpOwogCQkJCSh2b2lkKXNrX1g1MDlfZGVsZXRlX3B0cihza3RtcCx4dG1wKTsKIAkJCQljdHgtPmxhc3RfdW50cnVzdGVkKys7CiAJCQkJeD14dG1wOwpAQCAtMzUwLDE2ICszNDksMTUgQEAKIAogCQlvayA9IGN0eC0+Z2V0X2lzc3VlcigmeHRtcCwgY3R4LCB4KTsKIAotCQlpZiAob2sgPCAwKSBnb3RvIGVuZDsKKwkJaWYgKG9rIDwgMCkgcmV0dXJuIG9rOwogCQlpZiAob2sgPT0gMCkgYnJlYWs7CiAKIAkJeCA9IHh0bXA7CiAJCWlmICghc2tfWDUwOV9wdXNoKGN0eC0+Y2hhaW4seCkpCiAJCQl7CiAJCQlYNTA5X2ZyZWUoeHRtcCk7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7Ci0JCQlvayA9IDA7Ci0JCQlnb3RvIGVuZDsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfdmVyaWZ5X2NlcnQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAwOwogCQkJfQogCQludW0rKzsKIAkJfQpAQCAtOTkyLDcgKzk5MCw3IEBACiAJCSpwaXNzdWVyID0gYmVzdF9jcmxfaXNzdWVyOwogCQkqcHNjb3JlID0gYmVzdF9zY29yZTsKIAkJKnByZWFzb25zID0gYmVzdF9yZWFzb25zOwotCQlYNTA5X0NSTF91cF9yZWYoYmVzdF9jcmwpOworCQlDUllQVE9fcmVmY291bnRfaW5jKCZiZXN0X2NybC0+cmVmZXJlbmNlcyk7CiAJCWlmICgqcGRjcmwpCiAJCQl7CiAJCQlYNTA5X0NSTF9mcmVlKCpwZGNybCk7CkBAIC0xMDk5LDcgKzEwOTcsNyBAQAogCQkJewogCQkJaWYgKGNoZWNrX2NybF90aW1lKGN0eCwgZGVsdGEsIDApKQogCQkJCSpwc2NvcmUgfD0gQ1JMX1NDT1JFX1RJTUVfREVMVEE7Ci0JCQlYNTA5X0NSTF91cF9yZWYoZGVsdGEpOworCQkJQ1JZUFRPX3JlZmNvdW50X2luYygmZGVsdGEtPnJlZmVyZW5jZXMpOwogCQkJKmRjcmwgPSBkZWx0YTsKIAkJCXJldHVybjsKIAkJCX0KQEAgLTE2MzYsNyArMTYzNCw3IEBACiAJCQkJY3R4LT5wYXJhbS0+cG9saWNpZXMsIGN0eC0+cGFyYW0tPmZsYWdzKTsKIAlpZiAocmV0ID09IDApCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBjaGVja19wb2xpY3ksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIDA7CiAJCX0KIAkvKiBJbnZhbGlkIG9yIGluY29uc2lzdGVudCBleHRlbnNpb25zICovCkBAIC0xODMxLDg5ICsxODI5LDQ5IEBACiAJQVNOMV9USU1FIGF0bTsKIAlsb25nIG9mZnNldDsKIAljaGFyIGJ1ZmYxWzI0XSxidWZmMlsyNF0sKnA7Ci0JaW50IGksIGosIHJlbWFpbmluZzsKKwlpbnQgaSxqOwogCiAJcD1idWZmMTsKLQlyZW1haW5pbmcgPSBjdG0tPmxlbmd0aDsKKwlpPWN0bS0+bGVuZ3RoOwogCXN0cj0oY2hhciAqKWN0bS0+ZGF0YTsKLQkvKiBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyAoaGlzdG9yaWNhbCkgY29kZSBhbGxvd3MgbXVjaCBtb3JlIHNsYWNrIGluCi0JICogdGhlIHRpbWUgZm9ybWF0IHRoYW4gUkZDNTI4MC4gSW4gUkZDNTI4MCwgdGhlIHJlcHJlc2VudGF0aW9uIGlzCi0JICogZml4ZWQ6Ci0JICogVVRDVGltZTogWVlNTURESEhNTVNTWgotCSAqIEdlbmVyYWxpemVkVGltZTogWVlZWU1NRERISE1NU1NaICovCiAJaWYgKGN0bS0+dHlwZSA9PSBWX0FTTjFfVVRDVElNRSkKIAkJewotCQkvKiBZWU1NRERISE1NW1NTXVogb3IgWVlNTURESEhNTVtTU10oKy0paGhtbSAqLwotCQlpbnQgbWluX2xlbmd0aCA9IHNpemVvZigiWVlNTURESEhNTVoiKSAtIDE7Ci0JCWludCBtYXhfbGVuZ3RoID0gc2l6ZW9mKCJZWU1NRERISE1NU1MraGhtbSIpIC0gMTsKLQkJaWYgKHJlbWFpbmluZyA8IG1pbl9sZW5ndGggfHwgcmVtYWluaW5nID4gbWF4X2xlbmd0aCkKLQkJCXJldHVybiAwOworCQlpZiAoKGkgPCAxMSkgfHwgKGkgPiAxNykpIHJldHVybiAwOwogCQltZW1jcHkocCxzdHIsMTApOwogCQlwKz0xMDsKIAkJc3RyKz0xMDsKLQkJcmVtYWluaW5nIC09IDEwOwogCQl9CiAJZWxzZQogCQl7Ci0JCS8qIFlZWVlNTURESEhNTVtTU1suZmZmXV1aIG9yIFlZWVlNTURESEhNTVtTU1suZltmW2ZdXV1dKCstKWhobW0gKi8KLQkJaW50IG1pbl9sZW5ndGggPSBzaXplb2YoIllZWVlNTURESEhNTVoiKSAtIDE7Ci0JCWludCBtYXhfbGVuZ3RoID0gc2l6ZW9mKCJZWVlZTU1EREhITU1TUy5mZmYraGhtbSIpIC0gMTsKLQkJaWYgKHJlbWFpbmluZyA8IG1pbl9sZW5ndGggfHwgcmVtYWluaW5nID4gbWF4X2xlbmd0aCkKLQkJCXJldHVybiAwOworCQlpZiAoaSA8IDEzKSByZXR1cm4gMDsKIAkJbWVtY3B5KHAsc3RyLDEyKTsKIAkJcCs9MTI7CiAJCXN0cis9MTI7Ci0JCXJlbWFpbmluZyAtPSAxMjsKIAkJfQogCiAJaWYgKCgqc3RyID09ICdaJykgfHwgKCpzdHIgPT0gJy0nKSB8fCAoKnN0ciA9PSAnKycpKQogCQl7ICoocCsrKT0nMCc7ICoocCsrKT0nMCc7IH0KIAllbHNlCiAJCXsgCi0JCS8qIFNTIChzZWNvbmRzKSAqLwotCQlpZiAocmVtYWluaW5nIDwgMikKLQkJCXJldHVybiAwOwogCQkqKHArKyk9ICooc3RyKyspOwogCQkqKHArKyk9ICooc3RyKyspOwotCQlyZW1haW5pbmcgLT0gMjsKLQkJLyogU2tpcCBhbnkgKHVwIHRvIHRocmVlKSBmcmFjdGlvbmFsIHNlY29uZHMuLi4KLQkJICogVE9ETyhlbWlsaWEpOiBpbiBSRkM1MjgwLCBmcmFjdGlvbmFsIHNlY29uZHMgYXJlIGZvcmJpZGRlbi4KLQkJICogQ2FuIHdlIGp1c3Qga2lsbCB0aGVtIGFsdG9nZXRoZXI/ICovCi0JCWlmIChyZW1haW5pbmcgJiYgKnN0ciA9PSAnLicpCisJCS8qIFNraXAgYW55IGZyYWN0aW9uYWwgc2Vjb25kcy4uLiAqLworCQlpZiAoKnN0ciA9PSAnLicpCiAJCQl7CiAJCQlzdHIrKzsKLQkJCXJlbWFpbmluZy0tOwotCQkJZm9yIChpID0gMDsgaSA8IDMgJiYgcmVtYWluaW5nOyBpKyssIHN0cisrLCByZW1haW5pbmctLSkKLQkJCQl7Ci0JCQkJaWYgKCpzdHIgPCAnMCcgfHwgKnN0ciA+ICc5JykKLQkJCQkJYnJlYWs7Ci0JCQkJfQorCQkJd2hpbGUgKCgqc3RyID49ICcwJykgJiYgKCpzdHIgPD0gJzknKSkgc3RyKys7CiAJCQl9CiAJCQogCQl9CiAJKihwKyspPSdaJzsKIAkqKHArKyk9J1wwJzsKIAotCS8qIFdlIG5vdyBuZWVkIGVpdGhlciBhIHRlcm1pbmF0aW5nICdaJyBvciBhbiBvZmZzZXQuICovCi0JaWYgKCFyZW1haW5pbmcpCi0JCXJldHVybiAwOwogCWlmICgqc3RyID09ICdaJykKLQkJewotCQlpZiAocmVtYWluaW5nICE9IDEpCi0JCQlyZXR1cm4gMDsKIAkJb2Zmc2V0PTA7Ci0JCX0KIAllbHNlCiAJCXsKLQkJLyogKCstKUhITU0gKi8KIAkJaWYgKCgqc3RyICE9ICcrJykgJiYgKCpzdHIgIT0gJy0nKSkKIAkJCXJldHVybiAwOwotCQkvKiBIaXN0b3JpY2FsIGJlaGF2aW91cjogdGhlICgrLSloaG1tIG9mZnNldCBpcyBmb3JiaWRkZW4gaW4gUkZDNTI4MC4gKi8KLQkJaWYgKHJlbWFpbmluZyAhPSA1KQotCQkJcmV0dXJuIDA7Ci0JCWlmIChzdHJbMV0gPCAnMCcgfHwgc3RyWzFdID4gJzknIHx8IHN0clsyXSA8ICcwJyB8fCBzdHJbMl0gPiAnOScgfHwKLQkJCXN0clszXSA8ICcwJyB8fCBzdHJbM10gPiAnOScgfHwgc3RyWzRdIDwgJzAnIHx8IHN0cls0XSA+ICc5JykKLQkJCXJldHVybiAwOwogCQlvZmZzZXQ9KChzdHJbMV0tJzAnKSoxMCsoc3RyWzJdLScwJykpKjYwOwogCQlvZmZzZXQrPShzdHJbM10tJzAnKSoxMCsoc3RyWzRdLScwJyk7CiAJCWlmICgqc3RyID09ICctJykKQEAgLTE5ODUsNDQgKzE5NDMsNDQgQEAKIAkvKiBDUkxzIGNhbid0IGJlIGRlbHRhIGFscmVhZHkgKi8KIAlpZiAoYmFzZS0+YmFzZV9jcmxfbnVtYmVyIHx8IG5ld2VyLT5iYXNlX2NybF9udW1iZXIpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfQ1JMX0FMUkVBRFlfREVMVEEpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9DUkxfZGlmZiwgWDUwOV9SX0NSTF9BTFJFQURZX0RFTFRBKTsKIAkJCXJldHVybiBOVUxMOwogCQkJfQogCS8qIEJhc2UgYW5kIG5ldyBDUkwgbXVzdCBoYXZlIGEgQ1JMIG51bWJlciAqLwogCWlmICghYmFzZS0+Y3JsX251bWJlciB8fCAhbmV3ZXItPmNybF9udW1iZXIpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfTk9fQ1JMX05VTUJFUik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0NSTF9kaWZmLCBYNTA5X1JfTk9fQ1JMX05VTUJFUik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJCX0KIAkvKiBJc3N1ZXIgbmFtZXMgbXVzdCBtYXRjaCAqLwogCWlmIChYNTA5X05BTUVfY21wKFg1MDlfQ1JMX2dldF9pc3N1ZXIoYmFzZSksCiAJCQkJWDUwOV9DUkxfZ2V0X2lzc3VlcihuZXdlcikpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX0lTU1VFUl9NSVNNQVRDSCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0NSTF9kaWZmLCBYNTA5X1JfSVNTVUVSX01JU01BVENIKTsKIAkJCXJldHVybiBOVUxMOwogCQkJfQogCS8qIEFLSUQgYW5kIElEUCBtdXN0IG1hdGNoICovCiAJaWYgKCFjcmxfZXh0ZW5zaW9uX21hdGNoKGJhc2UsIG5ld2VyLCBOSURfYXV0aG9yaXR5X2tleV9pZGVudGlmaWVyKSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9BS0lEX01JU01BVENIKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfQ1JMX2RpZmYsIFg1MDlfUl9BS0lEX01JU01BVENIKTsKIAkJCXJldHVybiBOVUxMOwogCQkJfQogCWlmICghY3JsX2V4dGVuc2lvbl9tYXRjaChiYXNlLCBuZXdlciwgTklEX2lzc3VpbmdfZGlzdHJpYnV0aW9uX3BvaW50KSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9JRFBfTUlTTUFUQ0gpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9DUkxfZGlmZiwgWDUwOV9SX0lEUF9NSVNNQVRDSCk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJCX0KIAkvKiBOZXdlciBDUkwgbnVtYmVyIG11c3QgZXhjZWVkIGZ1bGwgQ1JMIG51bWJlciAqLwogCWlmIChBU04xX0lOVEVHRVJfY21wKG5ld2VyLT5jcmxfbnVtYmVyLCBiYXNlLT5jcmxfbnVtYmVyKSA8PSAwKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX05FV0VSX0NSTF9OT1RfTkVXRVIpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9DUkxfZGlmZiwgWDUwOV9SX05FV0VSX0NSTF9OT1RfTkVXRVIpOwogCQkJcmV0dXJuIE5VTEw7CiAJCQl9CiAJLyogQ1JMcyBtdXN0IHZlcmlmeSAqLwogCWlmIChza2V5ICYmIChYNTA5X0NSTF92ZXJpZnkoYmFzZSwgc2tleSkgPD0gMCB8fAogCQkJWDUwOV9DUkxfdmVyaWZ5KG5ld2VyLCBza2V5KSA8PSAwKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfQ1JMX1ZFUklGWV9GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9DUkxfZGlmZiwgWDUwOV9SX0NSTF9WRVJJRllfRkFJTFVSRSk7CiAJCXJldHVybiBOVUxMOwogCQl9CiAJLyogQ3JlYXRlIG5ldyBDUkwgKi8KQEAgLTIwODcsNyArMjA0NSw3IEBACiAJcmV0dXJuIGNybDsKIAogCW1lbWVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9DUkxfZGlmZiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCWlmIChjcmwpCiAJCVg1MDlfQ1JMX2ZyZWUoY3JsKTsKIAlyZXR1cm4gTlVMTDsKQEAgLTIyMTIsNyArMjE3MCw3IEBACiAJCWlkeCA9IFg1MDlfUFVSUE9TRV9nZXRfYnlfaWQocHVycG9zZSk7CiAJCWlmIChpZHggPT0gLTEpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfVU5LTk9XTl9QVVJQT1NFX0lEKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfU1RPUkVfQ1RYX3B1cnBvc2VfaW5oZXJpdCwgWDUwOV9SX1VOS05PV05fUFVSUE9TRV9JRCk7CiAJCQlyZXR1cm4gMDsKIAkJCX0KIAkJcHRtcCA9IFg1MDlfUFVSUE9TRV9nZXQwKGlkeCk7CkBAIC0yMjIxLDcgKzIxNzksNyBAQAogCQkJaWR4ID0gWDUwOV9QVVJQT1NFX2dldF9ieV9pZChkZWZfcHVycG9zZSk7CiAJCQlpZiAoaWR4ID09IC0xKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfVU5LTk9XTl9QVVJQT1NFX0lEKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1NUT1JFX0NUWF9wdXJwb3NlX2luaGVyaXQsIFg1MDlfUl9VTktOT1dOX1BVUlBPU0VfSUQpOwogCQkJCXJldHVybiAwOwogCQkJCX0KIAkJCXB0bXAgPSBYNTA5X1BVUlBPU0VfZ2V0MChpZHgpOwpAQCAtMjIzNCw3ICsyMTkyLDcgQEAKIAkJaWR4ID0gWDUwOV9UUlVTVF9nZXRfYnlfaWQodHJ1c3QpOwogCQlpZiAoaWR4ID09IC0xKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX1VOS05PV05fVFJVU1RfSUQpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9TVE9SRV9DVFhfcHVycG9zZV9pbmhlcml0LCBYNTA5X1JfVU5LTk9XTl9UUlVTVF9JRCk7CiAJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQpAQCAtMjI1MCw3ICsyMjA4LDcgQEAKIAljdHggPSAoWDUwOV9TVE9SRV9DVFggKilPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOV9TVE9SRV9DVFgpKTsKIAlpZiAoIWN0eCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfU1RPUkVfQ1RYX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gTlVMTDsKIAkJfQogCW1lbXNldChjdHgsIDAsIHNpemVvZihYNTA5X1NUT1JFX0NUWCkpOwpAQCAtMjM3Myw3ICsyMzMxLDcgQEAKIAkJfQogCiAJbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKFg1MDlfU1RPUkVfQ1RYKSk7Ci0JT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfU1RPUkVfQ1RYX2luaXQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS94NTA5Y3NldC5jIGIvc3JjL2NyeXB0by94NTA5L3g1MDljc2V0LmMKaW5kZXggODJkNjFkMC4uYjUyNmM2OSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5L3g1MDljc2V0LmMKKysrIGIvc3JjL2NyeXB0by94NTA5L3g1MDljc2V0LmMKQEAgLTU3LDggKzU3LDYgQEAKICNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgogI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgogCi0jaW5jbHVkZSAiLi4vaW50ZXJuYWwuaCIKLQogCiBpbnQgWDUwOV9DUkxfc2V0X3ZlcnNpb24oWDUwOV9DUkwgKngsIGxvbmcgdmVyc2lvbikKIAl7CkBAIC0xMzAsMTEgKzEyOCw2IEBACiAJcmV0dXJuIDE7CiAJfQogCi12b2lkIFg1MDlfQ1JMX3VwX3JlZihYNTA5X0NSTCAqY3JsKQotCXsKLQlDUllQVE9fcmVmY291bnRfaW5jKCZjcmwtPnJlZmVyZW5jZXMpOwotCX0KLQogaW50IFg1MDlfUkVWT0tFRF9zZXRfcmV2b2NhdGlvbkRhdGUoWDUwOV9SRVZPS0VEICp4LCBBU04xX1RJTUUgKnRtKQogCXsKIAlBU04xX1RJTUUgKmluOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L3g1MDluYW1lLmMgYi9zcmMvY3J5cHRvL3g1MDkveDUwOW5hbWUuYwppbmRleCA3YmIzYWExLi4wNDJkMThiIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDkveDUwOW5hbWUuYworKysgYi9zcmMvY3J5cHRvL3g1MDkveDUwOW5hbWUuYwpAQCAtMjU0LDcgKzI1NCw3IEBACiAJbmV3X25hbWUtPnNldD1zZXQ7CiAJaWYgKCFza19YNTA5X05BTUVfRU5UUllfaW5zZXJ0KHNrLG5ld19uYW1lLGxvYykpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X05BTUVfYWRkX2VudHJ5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCWdvdG8gZXJyOwogCQl9CiAJaWYgKGluYykKQEAgLTI3OSw3ICsyNzksNyBAQAogCW9iaj1PQkpfdHh0Mm9iaihmaWVsZCwgMCk7CiAJaWYgKG9iaiA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9JTlZBTElEX0ZJRUxEX05BTUUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X3R4dCwgWDUwOV9SX0lOVkFMSURfRklFTERfTkFNRSk7CiAJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAibmFtZT0iLCBmaWVsZCk7CiAJCXJldHVybihOVUxMKTsKIAkJfQpAQCAtMjk3LDcgKzI5Nyw3IEBACiAJb2JqPU9CSl9uaWQyb2JqKG5pZCk7CiAJaWYgKG9iaiA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9VTktOT1dOX05JRCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfTkFNRV9FTlRSWV9jcmVhdGVfYnlfTklELCBYNTA5X1JfVU5LTk9XTl9OSUQpOwogCQlyZXR1cm4oTlVMTCk7CiAJCX0KIAluZW50cnkgPSBYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X09CSihuZSxvYmosdHlwZSxieXRlcyxsZW4pOwpAQCAtMzM2LDcgKzMzNiw3IEBACiAJewogCWlmICgobmUgPT0gTlVMTCkgfHwgKG9iaiA9PSBOVUxMKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X05BTUVfRU5UUllfc2V0X29iamVjdCwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKIAkJcmV0dXJuKDApOwogCQl9CiAJQVNOMV9PQkpFQ1RfZnJlZShuZS0+b2JqZWN0KTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS94NTA5c3BraS5jIGIvc3JjL2NyeXB0by94NTA5L3g1MDlzcGtpLmMKaW5kZXggY2NmOTNlMC4uOWJhYjk1NyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5L3g1MDlzcGtpLmMKKysrIGIvc3JjL2NyeXB0by94NTA5L3g1MDlzcGtpLmMKQEAgLTg0LDE1ICs4NCwxNSBAQAogCWlmIChsZW4gPD0gMCkKIAkJbGVuID0gc3RybGVuKHN0cik7CiAJaWYgKCFFVlBfRGVjb2RlZExlbmd0aCgmc3BraV9sZW4sIGxlbikpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX0JBU0U2NF9ERUNPREVfRVJST1IpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBORVRTQ0FQRV9TUEtJX2I2NF9kZWNvZGUsIFg1MDlfUl9CQVNFNjRfREVDT0RFX0VSUk9SKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWlmICghKHNwa2lfZGVyID0gT1BFTlNTTF9tYWxsb2Moc3BraV9sZW4pKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIE5FVFNDQVBFX1NQS0lfYjY0X2RlY29kZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJaWYgKCFFVlBfRGVjb2RlQmFzZTY0KHNwa2lfZGVyLCAmc3BraV9sZW4sIHNwa2lfbGVuLCAoY29uc3QgdWludDhfdCAqKXN0ciwgbGVuKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfQkFTRTY0X0RFQ09ERV9FUlJPUik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIE5FVFNDQVBFX1NQS0lfYjY0X2RlY29kZSwgWDUwOV9SX0JBU0U2NF9ERUNPREVfRVJST1IpOwogCQlPUEVOU1NMX2ZyZWUoc3BraV9kZXIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0xMTMsMTggKzExMywxOCBAQAogCWRlcl9sZW4gPSBpMmRfTkVUU0NBUEVfU1BLSShzcGtpLCBOVUxMKTsKIAlpZiAoIUVWUF9FbmNvZGVkTGVuZ3RoKCZiNjRfbGVuLCBkZXJfbGVuKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9PVkVSRkxPVyk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIE5FVFNDQVBFX1NQS0lfYjY0X2VuY29kZSwgRVJSX1JfT1ZFUkZMT1cpOwogCQlyZXR1cm4gTlVMTDsKIAkJfQogCWRlcl9zcGtpID0gT1BFTlNTTF9tYWxsb2MoZGVyX2xlbik7CiAJaWYgKGRlcl9zcGtpID09IE5VTEwpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBORVRTQ0FQRV9TUEtJX2I2NF9lbmNvZGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWI2NF9zdHIgPSBPUEVOU1NMX21hbGxvYyhiNjRfbGVuKTsKIAlpZiAoYjY0X3N0ciA9PSBOVUxMKSB7CiAJCU9QRU5TU0xfZnJlZShkZXJfc3BraSk7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgTkVUU0NBUEVfU1BLSV9iNjRfZW5jb2RlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlwID0gZGVyX3Nwa2k7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkveF9hbGwuYyBiL3NyYy9jcnlwdG8veDUwOS94X2FsbC5jCmluZGV4IGQ3ZjJkMjkuLjc4NWZkMWUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS94X2FsbC5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS94X2FsbC5jCkBAIC02NCw2ICs2NCw5IEBACiAjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CiAKIAorZXh0ZXJuIGNvbnN0IEFTTjFfSVRFTSBSU0FQcml2YXRlS2V5X2l0OworZXh0ZXJuIGNvbnN0IEFTTjFfSVRFTSBSU0FQdWJsaWNLZXlfaXQ7CisKIGludCBYNTA5X3ZlcmlmeShYNTA5ICphLCBFVlBfUEtFWSAqcikKIAl7CiAJaWYgKFg1MDlfQUxHT1JfY21wKGEtPnNpZ19hbGcsIGEtPmNlcnRfaW5mby0+c2lnbmF0dXJlKSkKQEAgLTE0MSwxMiArMTQ0LDYgQEAKIAkJeC0+c2lnbmF0dXJlLCB4LT5zcGthYyxwa2V5LG1kKSk7CiAJfQogCi1pbnQgTkVUU0NBUEVfU1BLSV92ZXJpZnkoTkVUU0NBUEVfU1BLSSAqeCwgRVZQX1BLRVkgKnBrZXkpCi0JewotCXJldHVybiAoQVNOMV9pdGVtX3ZlcmlmeShBU04xX0lURU1fcnB0cihORVRTQ0FQRV9TUEtBQyksIHgtPnNpZ19hbGdvciwKLQkJeC0+c2lnbmF0dXJlLCB4LT5zcGthYywgcGtleSkpOwotCX0KLQogI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQogWDUwOSAqZDJpX1g1MDlfZnAoRklMRSAqZnAsIFg1MDkgKip4NTA5KQogCXsKQEAgLTI0MiwxNyArMjM5LDE3IEBACiAjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCiBSU0EgKmQyaV9SU0FQcml2YXRlS2V5X2ZwKEZJTEUgKmZwLCBSU0EgKipyc2EpCiAJewotCXJldHVybiBBU04xX2QyaV9mcF9vZihSU0EsIFJTQV9uZXcsIGQyaV9SU0FQcml2YXRlS2V5LCBmcCwgcnNhKTsKKwlyZXR1cm4gQVNOMV9pdGVtX2QyaV9mcChBU04xX0lURU1fcnB0cihSU0FQcml2YXRlS2V5KSwgZnAsIHJzYSk7CiAJfQogCiBpbnQgaTJkX1JTQVByaXZhdGVLZXlfZnAoRklMRSAqZnAsIFJTQSAqcnNhKQogCXsKLQlyZXR1cm4gQVNOMV9pMmRfZnBfb2ZfY29uc3QoUlNBLCBpMmRfUlNBUHJpdmF0ZUtleSwgZnAsIHJzYSk7CisJcmV0dXJuIEFTTjFfaXRlbV9pMmRfZnAoQVNOMV9JVEVNX3JwdHIoUlNBUHJpdmF0ZUtleSksIGZwLCByc2EpOwogCX0KIAogUlNBICpkMmlfUlNBUHVibGljS2V5X2ZwKEZJTEUgKmZwLCBSU0EgKipyc2EpCiAJewotCXJldHVybiBBU04xX2QyaV9mcF9vZihSU0EsIFJTQV9uZXcsIGQyaV9SU0FQdWJsaWNLZXksIGZwLCByc2EpOworCXJldHVybiBBU04xX2l0ZW1fZDJpX2ZwKEFTTjFfSVRFTV9ycHRyKFJTQVB1YmxpY0tleSksIGZwLCByc2EpOwogCX0KIAogUlNBICpkMmlfUlNBX1BVQktFWV9mcChGSUxFICpmcCwgUlNBICoqcnNhKQpAQCAtMjY0LDcgKzI2MSw3IEBACiAKIGludCBpMmRfUlNBUHVibGljS2V5X2ZwKEZJTEUgKmZwLCBSU0EgKnJzYSkKIAl7Ci0JcmV0dXJuIEFTTjFfaTJkX2ZwX29mX2NvbnN0KFJTQSwgaTJkX1JTQVB1YmxpY0tleSwgZnAsIHJzYSk7CisJcmV0dXJuIEFTTjFfaXRlbV9pMmRfZnAoQVNOMV9JVEVNX3JwdHIoUlNBUHVibGljS2V5KSwgZnAsIHJzYSk7CiAJfQogCiBpbnQgaTJkX1JTQV9QVUJLRVlfZnAoRklMRSAqZnAsIFJTQSAqcnNhKQpAQCAtMjc1LDE3ICsyNzIsMTcgQEAKIAogUlNBICpkMmlfUlNBUHJpdmF0ZUtleV9iaW8oQklPICpicCwgUlNBICoqcnNhKQogCXsKLQlyZXR1cm4gQVNOMV9kMmlfYmlvX29mKFJTQSwgUlNBX25ldywgZDJpX1JTQVByaXZhdGVLZXksIGJwLCByc2EpOworCXJldHVybiBBU04xX2l0ZW1fZDJpX2JpbyhBU04xX0lURU1fcnB0cihSU0FQcml2YXRlS2V5KSwgYnAsIHJzYSk7CiAJfQogCiBpbnQgaTJkX1JTQVByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIFJTQSAqcnNhKQogCXsKLQlyZXR1cm4gQVNOMV9pMmRfYmlvX29mX2NvbnN0KFJTQSwgaTJkX1JTQVByaXZhdGVLZXksIGJwLCByc2EpOworCXJldHVybiBBU04xX2l0ZW1faTJkX2JpbyhBU04xX0lURU1fcnB0cihSU0FQcml2YXRlS2V5KSwgYnAsIHJzYSk7CiAJfQogCiBSU0EgKmQyaV9SU0FQdWJsaWNLZXlfYmlvKEJJTyAqYnAsIFJTQSAqKnJzYSkKIAl7Ci0JcmV0dXJuIEFTTjFfZDJpX2Jpb19vZihSU0EsIFJTQV9uZXcsIGQyaV9SU0FQdWJsaWNLZXksIGJwLCByc2EpOworCXJldHVybiBBU04xX2l0ZW1fZDJpX2JpbyhBU04xX0lURU1fcnB0cihSU0FQdWJsaWNLZXkpLCBicCwgcnNhKTsKIAl9CiAKIApAQCAtMjk2LDcgKzI5Myw3IEBACiAKIGludCBpMmRfUlNBUHVibGljS2V5X2JpbyhCSU8gKmJwLCBSU0EgKnJzYSkKIAl7Ci0JcmV0dXJuIEFTTjFfaTJkX2Jpb19vZl9jb25zdChSU0EsIGkyZF9SU0FQdWJsaWNLZXksIGJwLCByc2EpOworCXJldHVybiBBU04xX2l0ZW1faTJkX2JpbyhBU04xX0lURU1fcnB0cihSU0FQdWJsaWNLZXkpLCBicCwgcnNhKTsKIAl9CiAKIGludCBpMmRfUlNBX1BVQktFWV9iaW8oQklPICpicCwgUlNBICpyc2EpCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkveF9jcmwuYyBiL3NyYy9jcnlwdG8veDUwOS94X2NybC5jCmluZGV4IGQ1MTY4NzIuLjJmNDFiYjEgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS94X2NybC5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS94X2NybC5jCkBAIC00MDAsNyArNDAwLDcgQEAKIAlpZighaW5mLT5yZXZva2VkKQogCQlpbmYtPnJldm9rZWQgPSBza19YNTA5X1JFVk9LRURfbmV3KFg1MDlfUkVWT0tFRF9jbXApOwogCWlmKCFpbmYtPnJldm9rZWQgfHwgIXNrX1g1MDlfUkVWT0tFRF9wdXNoKGluZi0+cmV2b2tlZCwgcmV2KSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfQ1JMX2FkZDBfcmV2b2tlZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gMDsKIAl9CiAJaW5mLT5lbmMubW9kaWZpZWQgPSAxOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L3hfaW5mby5jIGIvc3JjL2NyeXB0by94NTA5L3hfaW5mby5jCmluZGV4IGJlNTc5ZDcuLmY5ZTlhYjggMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS94X2luZm8uYworKysgYi9zcmMvY3J5cHRvL3g1MDkveF9pbmZvLmMKQEAgLTY5LDcgKzY5LDcgQEAKIAlyZXQ9KFg1MDlfSU5GTyAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X0lORk8pKTsKIAlpZiAocmV0ID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0lORk9fbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybihOVUxMKTsKIAkJfQogIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L3hfbmFtZS5jIGIvc3JjL2NyeXB0by94NTA5L3hfbmFtZS5jCmluZGV4IDc2Mjc1NmIuLjVjZmIzYWUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS94X25hbWUuYworKysgYi9zcmMvY3J5cHRvL3g1MDkveF9uYW1lLmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogCXJldHVybiAxOwogCiAgbWVtZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCB4NTA5X25hbWVfZXhfbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJaWYgKHJldCkKIAkJewogCQlpZiAocmV0LT5lbnRyaWVzKQpAQCAtMjM5LDcgKzIzOSw3IEBACiBlcnI6CiAgICAgICAgIGlmIChubS54ICE9IE5VTEwpCiAJCVg1MDlfTkFNRV9mcmVlKG5tLngpOwotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX0FTTjFfTElCKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCB4NTA5X25hbWVfZXhfZDJpLCBFUlJfUl9BU04xX0xJQik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwMCw3ICszMDAsNyBAQAogbWVtZXJyOgogCXNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9wb3BfZnJlZShpbnRuYW1lLnMsCiAJCQkJCSAgICAgbG9jYWxfc2tfWDUwOV9OQU1FX0VOVFJZX2ZyZWUpOwotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCB4NTA5X25hbWVfZW5jb2RlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJcmV0dXJuIC0xOwogfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkveF9wa2V5LmMgYi9zcmMvY3J5cHRvL3g1MDkveF9wa2V5LmMKaW5kZXggZjVlOThiOC4uNWJjNjQxNSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5L3hfcGtleS5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS94X3BrZXkuYwpAQCAtNjksNyArNjksNyBAQAogCVg1MDlfUEtFWSAqcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFg1MDlfUEtFWSkpOwogCWlmIChyZXQgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUEtFWV9uZXcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJZ290byBlcnI7CiAJCX0KIAltZW1zZXQocmV0LCAwLCBzaXplb2YoWDUwOV9QS0VZKSk7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkveF9wdWJrZXkuYyBiL3NyYy9jcnlwdG8veDUwOS94X3B1YmtleS5jCmluZGV4IGExNmVkY2EuLmMyZTA4NjMgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS94X3B1YmtleS5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS94X3B1YmtleS5jCkBAIC0xMDAsMTkgKzEwMCwxOSBAQAogCQkJewogCQkJaWYgKCFwa2V5LT5hbWV0aC0+cHViX2VuY29kZShwaywgcGtleSkpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9QVUJMSUNfS0VZX0VOQ09ERV9FUlJPUik7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9QVUJLRVlfc2V0LCBYNTA5X1JfUFVCTElDX0tFWV9FTkNPREVfRVJST1IpOwogCQkJCWdvdG8gZXJyb3I7CiAJCQkJfQogCQkJfQogCQllbHNlCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfTUVUSE9EX05PVF9TVVBQT1JURUQpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9QVUJLRVlfc2V0LCBYNTA5X1JfTUVUSE9EX05PVF9TVVBQT1JURUQpOwogCQkJZ290byBlcnJvcjsKIAkJCX0KIAkJfQogCWVsc2UKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfVU5TVVBQT1JURURfQUxHT1JJVEhNKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9QVUJLRVlfc2V0LCBYNTA5X1JfVU5TVVBQT1JURURfQUxHT1JJVEhNKTsKIAkJZ290byBlcnJvcjsKIAkJfQogCkBAIC0xNTEsMTMgKzE1MSwxMyBAQAogCiAJaWYgKChyZXQgPSBFVlBfUEtFWV9uZXcoKSkgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUFVCS0VZX2dldCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlnb3RvIGVycm9yOwogCQl9CiAKIAlpZiAoIUVWUF9QS0VZX3NldF90eXBlKHJldCwgT0JKX29iajJuaWQoa2V5LT5hbGdvci0+YWxnb3JpdGhtKSkpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX1VOU1VQUE9SVEVEX0FMR09SSVRITSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUFVCS0VZX2dldCwgWDUwOV9SX1VOU1VQUE9SVEVEX0FMR09SSVRITSk7CiAJCWdvdG8gZXJyb3I7CiAJCX0KIApAQCAtMTY1LDEzICsxNjUsMTMgQEAKIAkJewogCQlpZiAoIXJldC0+YW1ldGgtPnB1Yl9kZWNvZGUocmV0LCBrZXkpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX1BVQkxJQ19LRVlfREVDT0RFX0VSUk9SKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUFVCS0VZX2dldCwgWDUwOV9SX1BVQkxJQ19LRVlfREVDT0RFX0VSUk9SKTsKIAkJCWdvdG8gZXJyb3I7CiAJCQl9CiAJCX0KIAllbHNlCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX01FVEhPRF9OT1RfU1VQUE9SVEVEKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9QVUJLRVlfZ2V0LCBYNTA5X1JfTUVUSE9EX05PVF9TVVBQT1JURUQpOwogCQlnb3RvIGVycm9yOwogCQl9CiAKQEAgLTI2Miw3ICsyNjIsNyBAQAogCXBrdG1wID0gRVZQX1BLRVlfbmV3KCk7CiAJaWYgKCFwa3RtcCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIGkyZF9SU0FfUFVCS0VZLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiAwOwogCQl9CiAJRVZQX1BLRVlfc2V0MV9SU0EocGt0bXAsIChSU0EqKSBhKTsKQEAgLTMwMSw3ICszMDEsNyBAQAogCXBrdG1wID0gRVZQX1BLRVlfbmV3KCk7CiAJaWYoIXBrdG1wKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgaTJkX0RTQV9QVUJLRVksICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiAwOwogCQl9CiAJRVZQX1BLRVlfc2V0MV9EU0EocGt0bXAsIChEU0EqKSBhKTsKQEAgLTMzOCw3ICszMzgsNyBAQAogCWlmICghYSkJcmV0dXJuKDApOwogCWlmICgocGt0bXAgPSBFVlBfUEtFWV9uZXcoKSkgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIGkyZF9FQ19QVUJLRVksICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybigwKTsKIAkJfQogCUVWUF9QS0VZX3NldDFfRUNfS0VZKHBrdG1wLCAoRUNfS0VZKikgYSk7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkveF94NTA5YS5jIGIvc3JjL2NyeXB0by94NTA5L3hfeDUwOWEuYwppbmRleCBmYjcxNzJiLi5lMTMyMDRiIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDkveF94NTA5YS5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS94X3g1MDlhLmMKQEAgLTEzMyw0NCArMTMzLDI0IEBACiAKIGludCBYNTA5X2FkZDFfdHJ1c3Rfb2JqZWN0KFg1MDkgKngsIEFTTjFfT0JKRUNUICpvYmopCiB7Ci0JQVNOMV9PQkpFQ1QgKm9ianRtcCA9IE9CSl9kdXAob2JqKTsKLQlpZiAob2JqdG1wID09IE5VTEwpCi0JCWdvdG8gZXJyOwotCVg1MDlfQ0VSVF9BVVggKmF1eCA9IGF1eF9nZXQoeCk7Ci0JaWYgKGF1eC0+dHJ1c3QgPT0gTlVMTCkKLQkJewotCQlhdXgtPnRydXN0ID0gc2tfQVNOMV9PQkpFQ1RfbmV3X251bGwoKTsKLQkJaWYgKGF1eC0+dHJ1c3QgPT0gTlVMTCkKLQkJCWdvdG8gZXJyOwotCQl9Ci0JaWYgKCFza19BU04xX09CSkVDVF9wdXNoKGF1eC0+dHJ1c3QsIG9ianRtcCkpCi0JCWdvdG8gZXJyOwotCXJldHVybiAxOwotCi1lcnI6Ci0JQVNOMV9PQkpFQ1RfZnJlZShvYmp0bXApOwotCXJldHVybiAwOworCVg1MDlfQ0VSVF9BVVggKmF1eDsKKwlBU04xX09CSkVDVCAqb2JqdG1wOworCWlmKCEob2JqdG1wID0gT0JKX2R1cChvYmopKSkgcmV0dXJuIDA7CisJaWYoIShhdXggPSBhdXhfZ2V0KHgpKSkgcmV0dXJuIDA7CisJaWYoIWF1eC0+dHJ1c3QKKwkJJiYgIShhdXgtPnRydXN0ID0gc2tfQVNOMV9PQkpFQ1RfbmV3X251bGwoKSkpIHJldHVybiAwOworCXJldHVybiBza19BU04xX09CSkVDVF9wdXNoKGF1eC0+dHJ1c3QsIG9ianRtcCk7CiB9CiAKIGludCBYNTA5X2FkZDFfcmVqZWN0X29iamVjdChYNTA5ICp4LCBBU04xX09CSkVDVCAqb2JqKQogewotCUFTTjFfT0JKRUNUICpvYmp0bXAgPSBPQkpfZHVwKG9iaik7Ci0JaWYgKG9ianRtcCA9PSBOVUxMKQotCQlnb3RvIGVycjsKLQlYNTA5X0NFUlRfQVVYICphdXggPSBhdXhfZ2V0KHgpOwotCWlmIChhdXgtPnJlamVjdCA9PSBOVUxMKQotCQl7Ci0JCWF1eC0+cmVqZWN0ID0gc2tfQVNOMV9PQkpFQ1RfbmV3X251bGwoKTsKLQkJaWYgKGF1eC0+cmVqZWN0ID09IE5VTEwpCi0JCQlnb3RvIGVycjsKLQkJfQotCWlmICghc2tfQVNOMV9PQkpFQ1RfcHVzaChhdXgtPnJlamVjdCwgb2JqdG1wKSkKLQkJZ290byBlcnI7Ci0JcmV0dXJuIDE7Ci0KLWVycjoKLQlBU04xX09CSkVDVF9mcmVlKG9ianRtcCk7Ci0JcmV0dXJuIDA7CisJWDUwOV9DRVJUX0FVWCAqYXV4OworCUFTTjFfT0JKRUNUICpvYmp0bXA7CisJaWYoIShvYmp0bXAgPSBPQkpfZHVwKG9iaikpKSByZXR1cm4gMDsKKwlpZighKGF1eCA9IGF1eF9nZXQoeCkpKSByZXR1cm4gMDsKKwlpZighYXV4LT5yZWplY3QKKwkJJiYgIShhdXgtPnJlamVjdCA9IHNrX0FTTjFfT0JKRUNUX25ld19udWxsKCkpKSByZXR1cm4gMDsKKwlyZXR1cm4gc2tfQVNOMV9PQkpFQ1RfcHVzaChhdXgtPnJlamVjdCwgb2JqdG1wKTsKIH0KIAogdm9pZCBYNTA5X3RydXN0X2NsZWFyKFg1MDkgKngpCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8veDUwOXYzL0NNYWtlTGlzdHMudHh0CmluZGV4IDVjYzFiNDkuLmM3ZTYwNTQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOXYzL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCiAKIGFkZF9saWJyYXJ5KAogICB4NTA5djMKQEAgLTQ2LDcgKzQ2LDcgQEAKIGFkZF9leGVjdXRhYmxlKAogICB2M25hbWVfdGVzdAogCi0gIHYzbmFtZV90ZXN0LmMKKyAgdjNuYW1ldGVzdC5jCiAKICAgJDxUQVJHRVRfT0JKRUNUUzp0ZXN0X3N1cHBvcnQ+CiApCkBAIC01Niw3ICs1Niw3IEBACiBhZGRfZXhlY3V0YWJsZSgKICAgdGFiX3Rlc3QKIAotICB0YWJfdGVzdC5jCisgIHRhYnRlc3QuYwogCiAgICQ8VEFSR0VUX09CSkVDVFM6dGVzdF9zdXBwb3J0PgogKQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5djMvdGFiX3Rlc3QuYyBiL3NyYy9jcnlwdG8veDUwOXYzL3RhYnRlc3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NyeXB0by94NTA5djMvdGFiX3Rlc3QuYwpyZW5hbWUgdG8gc3JjL2NyeXB0by94NTA5djMvdGFidGVzdC5jCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M19ha2V5LmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M19ha2V5LmMKaW5kZXggOTU3OGE1Ny4uZjZlNmI2OSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5djMvdjNfYWtleS5jCisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX2FrZXkuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJCQl9CiAJCWVsc2UKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfVU5LTk9XTl9PUFRJT04pOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfQVVUSE9SSVRZX0tFWUlELCBYNTA5VjNfUl9VTktOT1dOX09QVElPTik7CiAJCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgIm5hbWU9IiwgY25mLT5uYW1lKTsKIAkJCXJldHVybiBOVUxMOwogCQkJfQpAQCAtMTU0LDcgKzE1NCw3IEBACiAJCXsKIAkJaWYoY3R4ICYmIChjdHgtPmZsYWdzPT1DVFhfVEVTVCkpCiAJCQlyZXR1cm4gQVVUSE9SSVRZX0tFWUlEX25ldygpOwotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX05PX0lTU1VFUl9DRVJUSUZJQ0FURSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0FVVEhPUklUWV9LRVlJRCwgWDUwOVYzX1JfTk9fSVNTVUVSX0NFUlRJRklDQVRFKTsKIAkJcmV0dXJuIE5VTEw7CiAJCX0KIApAQCAtMTY3LDcgKzE2Nyw3IEBACiAJCQlpa2V5aWQgPSBYNTA5VjNfRVhUX2QyaShleHQpOwogCQlpZihrZXlpZD09MiAmJiAhaWtleWlkKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9LRVlJRCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9BVVRIT1JJVFlfS0VZSUQsIFg1MDlWM19SX1VOQUJMRV9UT19HRVRfSVNTVUVSX0tFWUlEKTsKIAkJCXJldHVybiBOVUxMOwogCQkJfQogCQl9CkBAIC0xNzgsNyArMTc4LDcgQEAKIAkJc2VyaWFsID0gTV9BU04xX0lOVEVHRVJfZHVwKFg1MDlfZ2V0X3NlcmlhbE51bWJlcihjZXJ0KSk7CiAJCWlmKCFpc25hbWUgfHwgIXNlcmlhbCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfVU5BQkxFX1RPX0dFVF9JU1NVRVJfREVUQUlMUyk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9BVVRIT1JJVFlfS0VZSUQsIFg1MDlWM19SX1VOQUJMRV9UT19HRVRfSVNTVUVSX0RFVEFJTFMpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCX0KQEAgLTE5MSw3ICsxOTEsNyBAQAogCQkJfHwgIShnZW4gPSBHRU5FUkFMX05BTUVfbmV3KCkpCiAJCQl8fCAhc2tfR0VORVJBTF9OQU1FX3B1c2goZ2VucywgZ2VuKSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfQVVUSE9SSVRZX0tFWUlELCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJZ2VuLT50eXBlID0gR0VOX0RJUk5BTUU7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M19hbHQuYyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX2FsdC5jCmluZGV4IGU2MzlmNDUuLmY1NDczMTYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX2FsdC5jCisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX2FsdC5jCkBAIC0yNTAsNyArMjUwLDcgQEAKIAlDT05GX1ZBTFVFICpjbmY7CiAJc2l6ZV90IGk7CiAJaWYoIShnZW5zID0gc2tfR0VORVJBTF9OQU1FX25ld19udWxsKCkpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9pc3N1ZXJfYWx0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShudmFsKTsgaSsrKSB7CkBAIC0yODIsMjEgKzI4MiwyMSBAQAogCXNpemVfdCBqOwogCWlmKGN0eCAmJiAoY3R4LT5mbGFncyA9PSBDVFhfVEVTVCkpIHJldHVybiAxOwogCWlmKCFjdHggfHwgIWN0eC0+aXNzdWVyX2NlcnQpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9OT19JU1NVRVJfREVUQUlMUyk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgY29weV9pc3N1ZXIsIFg1MDlWM19SX05PX0lTU1VFUl9ERVRBSUxTKTsKIAkJZ290byBlcnI7CiAJfQogICAgICAgICBpID0gWDUwOV9nZXRfZXh0X2J5X05JRChjdHgtPmlzc3Vlcl9jZXJ0LCBOSURfc3ViamVjdF9hbHRfbmFtZSwgLTEpOwogCWlmKGkgPCAwKSByZXR1cm4gMTsKICAgICAgICAgaWYoIShleHQgPSBYNTA5X2dldF9leHQoY3R4LT5pc3N1ZXJfY2VydCwgaSkpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAhKGlhbHQgPSBYNTA5VjNfRVhUX2QyaShleHQpKSApIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JU1NVRVJfREVDT0RFX0VSUk9SKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBjb3B5X2lzc3VlciwgWDUwOVYzX1JfSVNTVUVSX0RFQ09ERV9FUlJPUik7CiAJCWdvdG8gZXJyOwogCX0KIAogCWZvcihqID0gMDsgaiA8IHNrX0dFTkVSQUxfTkFNRV9udW0oaWFsdCk7IGorKykgewogCQlnZW4gPSBza19HRU5FUkFMX05BTUVfdmFsdWUoaWFsdCwgaik7CiAJCWlmKCFza19HRU5FUkFMX05BTUVfcHVzaChnZW5zLCBnZW4pKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgY29weV9pc3N1ZXIsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCWdvdG8gZXJyOwogCQl9CiAJfQpAQCAtMzE2LDcgKzMxNiw3IEBACiAJQ09ORl9WQUxVRSAqY25mOwogCXNpemVfdCBpOwogCWlmKCEoZ2VucyA9IHNrX0dFTkVSQUxfTkFNRV9uZXdfbnVsbCgpKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2Mmlfc3ViamVjdF9hbHQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKG52YWwpOyBpKyspIHsKQEAgLTM1NCw3ICszNTQsNyBAQAogCWlmKGN0eCAhPSBOVUxMICYmIGN0eC0+ZmxhZ3MgPT0gQ1RYX1RFU1QpCiAJCXJldHVybiAxOwogCWlmKCFjdHggfHwgKCFjdHgtPnN1YmplY3RfY2VydCAmJiAhY3R4LT5zdWJqZWN0X3JlcSkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9OT19TVUJKRUNUX0RFVEFJTFMpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGNvcHlfZW1haWwsIFg1MDlWM19SX05PX1NVQkpFQ1RfREVUQUlMUyk7CiAJCWdvdG8gZXJyOwogCX0KIAkvKiBGaW5kIHRoZSBzdWJqZWN0IG5hbWUgKi8KQEAgLTM3NCwxNCArMzc0LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpLS07CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAJCWlmKCFlbWFpbCB8fCAhKGdlbiA9IEdFTkVSQUxfTkFNRV9uZXcoKSkpIHsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBjb3B5X2VtYWlsLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlnb3RvIGVycjsKIAkJfQogCQlnZW4tPmQuaWE1ID0gZW1haWw7CiAJCWVtYWlsID0gTlVMTDsKIAkJZ2VuLT50eXBlID0gR0VOX0VNQUlMOwogCQlpZighc2tfR0VORVJBTF9OQU1FX3B1c2goZ2VucywgZ2VuKSkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGNvcHlfZW1haWwsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCWdvdG8gZXJyOwogCQl9CiAJCWdlbiA9IE5VTEw7CkBAIC00MDUsNyArNDA1LDcgQEAKIAlDT05GX1ZBTFVFICpjbmY7CiAJc2l6ZV90IGk7CiAJaWYoIShnZW5zID0gc2tfR0VORVJBTF9OQU1FX25ld19udWxsKCkpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9HRU5FUkFMX05BTUVTLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShudmFsKTsgaSsrKSB7CkBAIC00MzQsNyArNDM0LDcgQEAKIAogCWlmKCF2YWx1ZSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX01JU1NJTkdfVkFMVUUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGEyaV9HRU5FUkFMX05BTUUsIFg1MDlWM19SX01JU1NJTkdfVkFMVUUpOwogCQlyZXR1cm4gTlVMTDsKIAkJfQogCkBAIC00NDUsNyArNDQ1LDcgQEAKIAkJZ2VuID0gR0VORVJBTF9OQU1FX25ldygpOwogCQlpZihnZW4gPT0gTlVMTCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBhMmlfR0VORVJBTF9OQU1FLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJCX0KIAkJfQpAQCAtNDYzLDcgKzQ2Myw3IEBACiAJCUFTTjFfT0JKRUNUICpvYmo7CiAJCWlmKCEob2JqID0gT0JKX3R4dDJvYmoodmFsdWUsMCkpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9CQURfT0JKRUNUKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgYTJpX0dFTkVSQUxfTkFNRSwgWDUwOVYzX1JfQkFEX09CSkVDVCk7CiAJCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgInZhbHVlPSIsIHZhbHVlKTsKIAkJCWdvdG8gZXJyOwogCQkJfQpAQCAtNDc4LDcgKzQ3OCw3IEBACiAJCQlnZW4tPmQuaXAgPSBhMmlfSVBBRERSRVNTKHZhbHVlKTsKIAkJaWYoZ2VuLT5kLmlwID09IE5VTEwpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0JBRF9JUF9BRERSRVNTKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgYTJpX0dFTkVSQUxfTkFNRSwgWDUwOVYzX1JfQkFEX0lQX0FERFJFU1MpOwogCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJ2YWx1ZT0iLCB2YWx1ZSk7CiAJCQlnb3RvIGVycjsKIAkJCX0KQEAgLTQ4Nyw3ICs0ODcsNyBAQAogCQljYXNlIEdFTl9ESVJOQU1FOgogCQlpZiAoIWRvX2Rpcm5hbWUoZ2VuLCB2YWx1ZSwgY3R4KSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfRElSTkFNRV9FUlJPUik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGEyaV9HRU5FUkFMX05BTUUsIFg1MDlWM19SX0RJUk5BTUVfRVJST1IpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCWJyZWFrOwpAQCAtNDk1LDEyICs0OTUsMTIgQEAKIAkJY2FzZSBHRU5fT1RIRVJOQU1FOgogCQlpZiAoIWRvX290aGVybmFtZShnZW4sIHZhbHVlLCBjdHgpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9PVEhFUk5BTUVfRVJST1IpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBhMmlfR0VORVJBTF9OQU1FLCBYNTA5VjNfUl9PVEhFUk5BTUVfRVJST1IpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCWJyZWFrOwogCQlkZWZhdWx0OgotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX1VOU1VQUE9SVEVEX1RZUEUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGEyaV9HRU5FUkFMX05BTUUsIFg1MDlWM19SX1VOU1VQUE9SVEVEX1RZUEUpOwogCQlnb3RvIGVycjsKIAkJfQogCkBAIC01MTAsNyArNTEwLDcgQEAKIAkJCSAgICAgICFBU04xX1NUUklOR19zZXQoZ2VuLT5kLmlhNSwgKHVuc2lnbmVkIGNoYXIqKXZhbHVlLAogCQkJCQkgICAgICAgc3RybGVuKHZhbHVlKSkpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgYTJpX0dFTkVSQUxfTkFNRSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCX0KQEAgLTUzOCw3ICs1MzgsNyBAQAogCiAJaWYoIXZhbHVlKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfTUlTU0lOR19WQUxVRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0dFTkVSQUxfTkFNRV9leCwgWDUwOVYzX1JfTUlTU0lOR19WQUxVRSk7CiAJCXJldHVybiBOVUxMOwogCQl9CiAKQEAgLTU1OCw3ICs1NTgsNyBAQAogCQl0eXBlID0gR0VOX09USEVSTkFNRTsKIAllbHNlCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9VTlNVUFBPUlRFRF9PUFRJT04pOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9HRU5FUkFMX05BTUVfZXgsIFg1MDlWM19SX1VOU1VQUE9SVEVEX09QVElPTik7CiAJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAibmFtZT0iLCBuYW1lKTsKIAkJcmV0dXJuIE5VTEw7CiAJCX0KQEAgLTYwNCw3ICs2MDQsNyBAQAogCXNrID0gWDUwOVYzX2dldF9zZWN0aW9uKGN0eCwgdmFsdWUpOwogCWlmICghc2spCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9TRUNUSU9OX05PVF9GT1VORCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgZG9fZGlybmFtZSwgWDUwOVYzX1JfU0VDVElPTl9OT1RfRk9VTkQpOwogCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgInNlY3Rpb249IiwgdmFsdWUpOwogCQlYNTA5X05BTUVfZnJlZShubSk7CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5djMvdjNfYmNvbnMuYyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX2Jjb25zLmMKaW5kZXggNzNlZjIxZS4uYTEzODFiNCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5djMvdjNfYmNvbnMuYworKysgYi9zcmMvY3J5cHRvL3g1MDl2My92M19iY29ucy5jCkBAIC0xMDMsNyArMTAzLDcgQEAKIAlDT05GX1ZBTFVFICp2YWw7CiAJc2l6ZV90IGk7CiAJaWYoIShiY29ucyA9IEJBU0lDX0NPTlNUUkFJTlRTX25ldygpKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfQkFTSUNfQ09OU1RSQUlOVFMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKHZhbHVlcyk7IGkrKykgewpAQCAtMTEzLDcgKzExMyw3IEBACiAJCX0gZWxzZSBpZighc3RyY21wKHZhbC0+bmFtZSwgInBhdGhsZW4iKSkgewogCQkJaWYoIVg1MDlWM19nZXRfdmFsdWVfaW50KHZhbCwgJmJjb25zLT5wYXRobGVuKSkgZ290byBlcnI7CiAJCX0gZWxzZSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfTkFNRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9CQVNJQ19DT05TVFJBSU5UUywgWDUwOVYzX1JfSU5WQUxJRF9OQU1FKTsKIAkJCVg1MDlWM19jb25mX2Vycih2YWwpOwogCQkJZ290byBlcnI7CiAJCX0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX2JpdHN0LmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M19iaXRzdC5jCmluZGV4IGUxZTIwODcuLjE1ZTk4NTkgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX2JpdHN0LmMKKysrIGIvc3JjL2NyeXB0by94NTA5djMvdjNfYml0c3QuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAJc2l6ZV90IGk7CiAJY29uc3QgQklUX1NUUklOR19CSVROQU1FICpibmFtOwogCWlmKCEoYnMgPSBNX0FTTjFfQklUX1NUUklOR19uZXcoKSkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0FTTjFfQklUX1NUUklORywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJZm9yKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0obnZhbCk7IGkrKykgewpAQCAtMTIxLDcgKzEyMSw3IEBACiAJCQlpZighc3RyY21wKGJuYW0tPnNuYW1lLCB2YWwtPm5hbWUpIHx8CiAJCQkJIXN0cmNtcChibmFtLT5sbmFtZSwgdmFsLT5uYW1lKSApIHsKIAkJCQlpZighQVNOMV9CSVRfU1RSSU5HX3NldF9iaXQoYnMsIGJuYW0tPmJpdG51bSwgMSkpIHsKLQkJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0FTTjFfQklUX1NUUklORywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJCQlNX0FTTjFfQklUX1NUUklOR19mcmVlKGJzKTsKIAkJCQkJcmV0dXJuIE5VTEw7CiAJCQkJfQpAQCAtMTI5LDcgKzEyOSw3IEBACiAJCQl9CiAJCX0KIAkJaWYoIWJuYW0tPmxuYW1lKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX1VOS05PV05fQklUX1NUUklOR19BUkdVTUVOVCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9BU04xX0JJVF9TVFJJTkcsIFg1MDlWM19SX1VOS05PV05fQklUX1NUUklOR19BUkdVTUVOVCk7CiAJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKIAkJCU1fQVNOMV9CSVRfU1RSSU5HX2ZyZWUoYnMpOwogCQkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M19jb25mLmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M19jb25mLmMKaW5kZXggZmU3MTU2Ni4uY2I2NTY5ZiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5djMvdjNfY29uZi5jCisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX2NvbmYuYwpAQCAtOTIsNyArOTIsNyBAQAogCXJldCA9IGRvX2V4dF9uY29uZihjb25mLCBjdHgsIE9CSl9zbjJuaWQobmFtZSksIGNyaXQsIHZhbHVlKTsKIAlpZiAoIXJldCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0VSUk9SX0lOX0VYVEVOU0lPTik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX0VYVF9uY29uZiwgWDUwOVYzX1JfRVJST1JfSU5fRVhURU5TSU9OKTsKIAkJRVJSX2FkZF9lcnJvcl9kYXRhKDQsIm5hbWU9IiwgbmFtZSwgIiwgdmFsdWU9IiwgdmFsdWUpOwogCQl9CiAJcmV0dXJuIHJldDsKQEAgLTEyMywxMiArMTIzLDEyIEBACiAJdm9pZCAqZXh0X3N0cnVjOwogCWlmIChleHRfbmlkID09IE5JRF91bmRlZikKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX1VOS05PV05fRVhURU5TSU9OX05BTUUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGRvX2V4dF9uY29uZiwgWDUwOVYzX1JfVU5LTk9XTl9FWFRFTlNJT05fTkFNRSk7CiAJCXJldHVybiBOVUxMOwogCQl9CiAJaWYgKCEobWV0aG9kID0gWDUwOVYzX0VYVF9nZXRfbmlkKGV4dF9uaWQpKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX1VOS05PV05fRVhURU5TSU9OKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBkb19leHRfbmNvbmYsIFg1MDlWM19SX1VOS05PV05fRVhURU5TSU9OKTsKIAkJcmV0dXJuIE5VTEw7CiAJCX0KIAkvKiBOb3cgZ2V0IGludGVybmFsIGV4dGVuc2lvbiByZXByZXNlbnRhdGlvbiBiYXNlZCBvbiB0eXBlICovCkBAIC0xMzgsNyArMTM4LDcgQEAKIAkJZWxzZSBudmFsID0gWDUwOVYzX3BhcnNlX2xpc3QodmFsdWUpOwogCQlpZihza19DT05GX1ZBTFVFX251bShudmFsKSA8PSAwKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JTlZBTElEX0VYVEVOU0lPTl9TVFJJTkcpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBkb19leHRfbmNvbmYsIFg1MDlWM19SX0lOVkFMSURfRVhURU5TSU9OX1NUUklORyk7CiAJCQlFUlJfYWRkX2Vycm9yX2RhdGEoNCwgIm5hbWU9IiwgT0JKX25pZDJzbihleHRfbmlkKSwgIixzZWN0aW9uPSIsIHZhbHVlKTsKIAkJCXJldHVybiBOVUxMOwogCQkJfQpAQCAtMTU1LDE0ICsxNTUsMTQgQEAKIAkJewogCQlpZighY3R4LT5kYiB8fCAhY3R4LT5kYl9tZXRoKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9OT19DT05GSUdfREFUQUJBU0UpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBkb19leHRfbmNvbmYsIFg1MDlWM19SX05PX0NPTkZJR19EQVRBQkFTRSk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJCX0KIAkJaWYoIShleHRfc3RydWMgPSBtZXRob2QtPnIyaShtZXRob2QsIGN0eCwgdmFsdWUpKSkgcmV0dXJuIE5VTEw7CiAJCX0KIAllbHNlCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9FWFRFTlNJT05fU0VUVElOR19OT1RfU1VQUE9SVEVEKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBkb19leHRfbmNvbmYsIFg1MDlWM19SX0VYVEVOU0lPTl9TRVRUSU5HX05PVF9TVVBQT1JURUQpOwogCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgIm5hbWU9IiwgT0JKX25pZDJzbihleHRfbmlkKSk7CiAJCXJldHVybiBOVUxMOwogCQl9CkBAIC0yMDcsNyArMjA3LDcgQEAKIAlyZXR1cm4gZXh0OwogCiAJbWVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGRvX2V4dF9pMmQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAlyZXR1cm4gTlVMTDsKIAogCX0KQEAgLTIxOCw3ICsyMTgsNyBAQAogCXsKIAljb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kOwogCWlmICghKG1ldGhvZCA9IFg1MDlWM19FWFRfZ2V0X25pZChleHRfbmlkKSkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9VTktOT1dOX0VYVEVOU0lPTik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX0VYVF9pMmQsIFg1MDlWM19SX1VOS05PV05fRVhURU5TSU9OKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCXJldHVybiBkb19leHRfaTJkKG1ldGhvZCwgZXh0X25pZCwgY3JpdCwgZXh0X3N0cnVjKTsKQEAgLTI3MSw3ICsyNzEsNyBAQAogCVg1MDlfRVhURU5TSU9OICpleHRlbnNpb249TlVMTDsKIAlpZiAoIShvYmogPSBPQkpfdHh0Mm9iaihleHQsIDApKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0VYVEVOU0lPTl9OQU1FX0VSUk9SKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2M19nZW5lcmljX2V4dGVuc2lvbiwgWDUwOVYzX1JfRVhURU5TSU9OX05BTUVfRVJST1IpOwogCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgIm5hbWU9IiwgZXh0KTsKIAkJZ290byBlcnI7CiAJCX0KQEAgLTI4MywxNCArMjgzLDE0IEBACiAKIAlpZiAoZXh0X2RlciA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfRVhURU5TSU9OX1ZBTFVFX0VSUk9SKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2M19nZW5lcmljX2V4dGVuc2lvbiwgWDUwOVYzX1JfRVhURU5TSU9OX1ZBTFVFX0VSUk9SKTsKIAkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJ2YWx1ZT0iLCB2YWx1ZSk7CiAJCWdvdG8gZXJyOwogCQl9CiAKIAlpZiAoIShvY3QgPSBNX0FTTjFfT0NURVRfU1RSSU5HX25ldygpKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2M19nZW5lcmljX2V4dGVuc2lvbiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlnb3RvIGVycjsKIAkJfQogCkBAIC0zODksNyArMzg5LDcgQEAKIAl7CiAJaWYoIWN0eC0+ZGIgfHwgIWN0eC0+ZGJfbWV0aCB8fCAhY3R4LT5kYl9tZXRoLT5nZXRfc3RyaW5nKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfT1BFUkFUSU9OX05PVF9ERUZJTkVEKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfZ2V0X3N0cmluZywgWDUwOVYzX1JfT1BFUkFUSU9OX05PVF9ERUZJTkVEKTsKIAkJcmV0dXJuIE5VTEw7CiAJCX0KIAlpZiAoY3R4LT5kYl9tZXRoLT5nZXRfc3RyaW5nKQpAQCAtNDAxLDcgKzQwMSw3IEBACiAJewogCWlmKCFjdHgtPmRiIHx8ICFjdHgtPmRiX21ldGggfHwgIWN0eC0+ZGJfbWV0aC0+Z2V0X3NlY3Rpb24pCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9PUEVSQVRJT05fTk9UX0RFRklORUQpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19nZXRfc2VjdGlvbiwgWDUwOVYzX1JfT1BFUkFUSU9OX05PVF9ERUZJTkVEKTsKIAkJcmV0dXJuIE5VTEw7CiAJCX0KIAlpZiAoY3R4LT5kYl9tZXRoLT5nZXRfc2VjdGlvbikKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX2Nwb2xzLmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M19jcG9scy5jCmluZGV4IDBiNTg2NzYuLmNiZTU5NmIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX2Nwb2xzLmMKKysrIGIvc3JjL2NyeXB0by94NTA5djMvdjNfY3BvbHMuYwpAQCAtMTQ2LDE5ICsxNDYsMTkgQEAKIAlpbnQgaWE1b3JnOwogCXBvbHMgPSBza19QT0xJQ1lJTkZPX25ld19udWxsKCk7CiAJaWYgKHBvbHMgPT0gTlVMTCkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCByMmlfY2VydHBvbCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJdmFscyA9ICBYNTA5VjNfcGFyc2VfbGlzdCh2YWx1ZSk7CiAJaWYgKHZhbHMgPT0gTlVMTCkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX1g1MDlWM19MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHIyaV9jZXJ0cG9sLCBFUlJfUl9YNTA5VjNfTElCKTsKIAkJZ290byBlcnI7CiAJfQogCWlhNW9yZyA9IDA7CiAJZm9yKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0odmFscyk7IGkrKykgewogCQljbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKHZhbHMsIGkpOwogCQlpZihjbmYtPnZhbHVlIHx8ICFjbmYtPm5hbWUgKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfUE9MSUNZX0lERU5USUZJRVIpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCByMmlfY2VydHBvbCwgWDUwOVYzX1JfSU5WQUxJRF9QT0xJQ1lfSURFTlRJRklFUik7CiAJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKIAkJCWdvdG8gZXJyOwogCQl9CkBAIC0xNzAsNyArMTcwLDcgQEAKIAkJCVNUQUNLX09GKENPTkZfVkFMVUUpICpwb2xzZWN0OwogCQkJcG9sc2VjdCA9IFg1MDlWM19nZXRfc2VjdGlvbihjdHgsIHBzdHIgKyAxKTsKIAkJCWlmKCFwb2xzZWN0KSB7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JTlZBTElEX1NFQ1RJT04pOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcjJpX2NlcnRwb2wsIFg1MDlWM19SX0lOVkFMSURfU0VDVElPTik7CiAKIAkJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKIAkJCQlnb3RvIGVycjsKQEAgLTE4MCw3ICsxODAsNyBAQAogCQkJaWYoIXBvbCkgZ290byBlcnI7CiAJCX0gZWxzZSB7CiAJCQlpZighKHBvYmogPSBPQkpfdHh0Mm9iaihjbmYtPm5hbWUsIDApKSkgewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUik7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCByMmlfY2VydHBvbCwgWDUwOVYzX1JfSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUik7CiAJCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CiAJCQkJZ290byBlcnI7CiAJCQl9CkBAIC0xODksNyArMTg5LDcgQEAKIAkJfQogCQlpZiAoIXNrX1BPTElDWUlORk9fcHVzaChwb2xzLCBwb2wpKXsKIAkJCVBPTElDWUlORk9fZnJlZShwb2wpOwotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHIyaV9jZXJ0cG9sLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlnb3RvIGVycjsKIAkJfQogCX0KQEAgLTIxNCw3ICsyMTQsNyBAQAogCQlpZighc3RyY21wKGNuZi0+bmFtZSwgInBvbGljeUlkZW50aWZpZXIiKSkgewogCQkJQVNOMV9PQkpFQ1QgKnBvYmo7CiAJCQlpZighKHBvYmogPSBPQkpfdHh0Mm9iaihjbmYtPnZhbHVlLCAwKSkpIHsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfT0JKRUNUX0lERU5USUZJRVIpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcG9saWN5X3NlY3Rpb24sIFg1MDlWM19SX0lOVkFMSURfT0JKRUNUX0lERU5USUZJRVIpOwogCQkJCVg1MDlWM19jb25mX2VycihjbmYpOwogCQkJCWdvdG8gZXJyOwogCQkJfQpAQCAtMjI5LDcgKzIyOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPKGZvcmspOiBjb25zdCBjb3JyZWN0bmVzcyAqLwogCQkJcXVhbC0+cHF1YWxpZCA9IChBU04xX09CSkVDVCopIE9CSl9uaWQyb2JqKE5JRF9pZF9xdF9jcHMpOwogCQkJaWYgKHF1YWwtPnBxdWFsaWQgPT0gTlVMTCkgewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcG9saWN5X3NlY3Rpb24sIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKIAkJCQlnb3RvIGVycjsKIAkJCX0KIAkJCXF1YWwtPmQuY3BzdXJpID0gTV9BU04xX0lBNVNUUklOR19uZXcoKTsKQEAgLTI0MSwxMyArMjQxLDEzIEBACiAJCX0gZWxzZSBpZighbmFtZV9jbXAoY25mLT5uYW1lLCAidXNlck5vdGljZSIpKSB7CiAJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqdW5vdDsKIAkJCWlmKCpjbmYtPnZhbHVlICE9ICdAJykgewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfRVhQRUNURURfQV9TRUNUSU9OX05BTUUpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcG9saWN5X3NlY3Rpb24sIFg1MDlWM19SX0VYUEVDVEVEX0FfU0VDVElPTl9OQU1FKTsKIAkJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKIAkJCQlnb3RvIGVycjsKIAkJCX0KIAkJCXVub3QgPSBYNTA5VjNfZ2V0X3NlY3Rpb24oY3R4LCBjbmYtPnZhbHVlICsgMSk7CiAJCQlpZighdW5vdCkgewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9TRUNUSU9OKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHBvbGljeV9zZWN0aW9uLCBYNTA5VjNfUl9JTlZBTElEX1NFQ1RJT04pOwogCiAJCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CiAJCQkJZ290byBlcnI7CkBAIC0yNjAsMjEgKzI2MCwyMSBAQAogCQkJaWYoIXNrX1BPTElDWVFVQUxJTkZPX3B1c2gocG9sLT5xdWFsaWZpZXJzLCBxdWFsKSkKIAkJCQkJCQkJIGdvdG8gbWVycjsKIAkJfSBlbHNlIHsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9PUFRJT04pOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwb2xpY3lfc2VjdGlvbiwgWDUwOVYzX1JfSU5WQUxJRF9PUFRJT04pOwogCiAJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKIAkJCWdvdG8gZXJyOwogCQl9CiAJfQogCWlmKCFwb2wtPnBvbGljeWlkKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfTk9fUE9MSUNZX0lERU5USUZJRVIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHBvbGljeV9zZWN0aW9uLCBYNTA5VjNfUl9OT19QT0xJQ1lfSURFTlRJRklFUik7CiAJCWdvdG8gZXJyOwogCX0KIAogCXJldHVybiBwb2w7CiAKIAltZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcG9saWN5X3NlY3Rpb24sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAogCWVycjoKIAlQT0xJQ1lJTkZPX2ZyZWUocG9sKTsKQEAgLTI5Niw3ICsyOTYsNyBAQAogCXF1YWwtPnBxdWFsaWQgPSAoQVNOMV9PQkpFQ1QgKikgT0JKX25pZDJvYmooTklEX2lkX3F0X3Vub3RpY2UpOwogCWlmIChxdWFsLT5wcXVhbGlkID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgbm90aWNlX3NlY3Rpb24sIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKIAkJZ290byBlcnI7CiAJCX0KIAlpZighKG5vdCA9IFVTRVJOT1RJQ0VfbmV3KCkpKSBnb3RvIG1lcnI7CkBAIC0zMjgsNyArMzI4LDcgQEAKIAkJCX0gZWxzZSBucmVmID0gbm90LT5ub3RpY2VyZWY7CiAJCQlub3MgPSBYNTA5VjNfcGFyc2VfbGlzdChjbmYtPnZhbHVlKTsKIAkJCWlmKCFub3MgfHwgIXNrX0NPTkZfVkFMVUVfbnVtKG5vcykpIHsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfTlVNQkVSUyk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBub3RpY2Vfc2VjdGlvbiwgWDUwOVYzX1JfSU5WQUxJRF9OVU1CRVJTKTsKIAkJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKIAkJCQlnb3RvIGVycjsKIAkJCX0KQEAgLTMzNyw3ICszMzcsNyBAQAogCQkJaWYgKCFyZXQpCiAJCQkJZ290byBlcnI7CiAJCX0gZWxzZSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfT1BUSU9OKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgbm90aWNlX3NlY3Rpb24sIFg1MDlWM19SX0lOVkFMSURfT1BUSU9OKTsKIAkJCVg1MDlWM19jb25mX2VycihjbmYpOwogCQkJZ290byBlcnI7CiAJCX0KQEAgLTM0NSwxNCArMzQ1LDE0IEBACiAKIAlpZihub3QtPm5vdGljZXJlZiAmJiAKIAkgICAgICAoIW5vdC0+bm90aWNlcmVmLT5ub3RpY2Vub3MgfHwgIW5vdC0+bm90aWNlcmVmLT5vcmdhbml6YXRpb24pKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX05FRURfT1JHQU5JWkFUSU9OX0FORF9OVU1CRVJTKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgbm90aWNlX3NlY3Rpb24sIFg1MDlWM19SX05FRURfT1JHQU5JWkFUSU9OX0FORF9OVU1CRVJTKTsKIAkJCWdvdG8gZXJyOwogCX0KIAogCXJldHVybiBxdWFsOwogCiAJbWVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIG5vdGljZV9zZWN0aW9uLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAKIAllcnI6CiAJUE9MSUNZUVVBTElORk9fZnJlZShxdWFsKTsKQEAgLTM2OSw3ICszNjksNyBAQAogCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKG5vcyk7IGkrKykgewogCQljbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKG5vcywgaSk7CiAJCWlmKCEoYWludCA9IHMyaV9BU04xX0lOVEVHRVIoTlVMTCwgY25mLT5uYW1lKSkpIHsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9OVU1CRVIpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBucmVmX25vcywgWDUwOVYzX1JfSU5WQUxJRF9OVU1CRVIpOwogCQkJZ290byBlcnI7CiAJCX0KIAkJaWYoIXNrX0FTTjFfSU5URUdFUl9wdXNoKG5udW1zLCBhaW50KSkgZ290byBtZXJyOwpAQCAtMzc3LDcgKzM3Nyw3IEBACiAJcmV0dXJuIDE7CiAKIAltZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgbnJlZl9ub3MsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAogCWVycjoKIAlza19BU04xX0lOVEVHRVJfcG9wX2ZyZWUobm51bXMsIEFTTjFfU1RSSU5HX2ZyZWUpOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5djMvdjNfY3JsZC5jIGIvc3JjL2NyeXB0by94NTA5djMvdjNfY3JsZC5jCmluZGV4IDM5ODRjMzEuLmU0MWRkNjUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX2NybGQuYworKysgYi9zcmMvY3J5cHRvL3g1MDl2My92M19jcmxkLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCQlnbnNlY3QgPSBYNTA5VjNfcGFyc2VfbGlzdChzZWN0KTsKIAlpZiAoIWduc2VjdCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX1NFQ1RJT05fTk9UX0ZPVU5EKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBnbmFtZXNfZnJvbV9zZWN0bmFtZSwgWDUwOVYzX1JfU0VDVElPTl9OT1RfRk9VTkQpOwogCQlyZXR1cm4gTlVMTDsKIAkJfQogCWdlbnMgPSB2MmlfR0VORVJBTF9OQU1FUyhOVUxMLCBjdHgsIGduc2VjdCk7CkBAIC0xMzYsNyArMTM2LDcgQEAKIAkJZG5zZWN0ID0gWDUwOVYzX2dldF9zZWN0aW9uKGN0eCwgY25mLT52YWx1ZSk7CiAJCWlmICghZG5zZWN0KQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9TRUNUSU9OX05PVF9GT1VORCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHNldF9kaXN0X3BvaW50X25hbWUsIFg1MDlWM19SX1NFQ1RJT05fTk9UX0ZPVU5EKTsKIAkJCXJldHVybiAtMTsKIAkJCX0KIAkJcmV0ID0gWDUwOVYzX05BTUVfZnJvbV9zZWN0aW9uKG5tLCBkbnNlY3QsIE1CU1RSSU5HX0FTQyk7CkBAIC0xNTIsNyArMTUyLDcgQEAKIAkJaWYgKHNrX1g1MDlfTkFNRV9FTlRSWV92YWx1ZShybm0sCiAJCQkJc2tfWDUwOV9OQU1FX0VOVFJZX251bShybm0pIC0gMSktPnNldCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9NVUxUSVBMRV9SRE5TKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgc2V0X2Rpc3RfcG9pbnRfbmFtZSwgWDUwOVYzX1JfSU5WQUxJRF9NVUxUSVBMRV9SRE5TKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQl9CkBAIC0xNjEsNyArMTYxLDcgQEAKIAogCWlmICgqcGRwKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfRElTVFBPSU5UX0FMUkVBRFlfU0VUKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzZXRfZGlzdF9wb2ludF9uYW1lLCBYNTA5VjNfUl9ESVNUUE9JTlRfQUxSRUFEWV9TRVQpOwogCQlnb3RvIGVycjsKIAkJfQogCkBAIC0zNjIsNyArMzYyLDcgQEAKIAlyZXR1cm4gY3JsZDsKIAogCW1lcnI6Ci0JT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfY3JsZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCWVycjoKIAlHRU5FUkFMX05BTUVfZnJlZShnZW4pOwogCUdFTkVSQUxfTkFNRVNfZnJlZShnZW5zKTsKQEAgLTQ5MCw3ICs0OTAsNyBAQAogCQkJfQogCQllbHNlCiAJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfTkFNRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9pZHAsIFg1MDlWM19SX0lOVkFMSURfTkFNRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBYNTA5VjNfY29uZl9lcnIoY25mKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyOwogCQkJfQpAQCAtNDk4LDcgKzQ5OCw3IEBACiAJcmV0dXJuIGlkcDsKIAogCW1lcnI6Ci0JT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfaWRwLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJZXJyOgogCUlTU1VJTkdfRElTVF9QT0lOVF9mcmVlKGlkcCk7CiAJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M19leHRrdS5jIGIvc3JjL2NyeXB0by94NTA5djMvdjNfZXh0a3UuYwppbmRleCBkNjRlYjljLi5mNGI4YWY4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDl2My92M19leHRrdS5jCisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX2V4dGt1LmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogCXNpemVfdCBpOwogCiAJaWYoIShleHRrdSA9IHNrX0FTTjFfT0JKRUNUX25ld19udWxsKCkpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9FWFRFTkRFRF9LRVlfVVNBR0UsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xMzUsNyArMTM1LDcgQEAKIAkJZWxzZSBleHR2YWwgPSB2YWwtPm5hbWU7CiAJCWlmKCEob2JqdG1wID0gT0JKX3R4dDJvYmooZXh0dmFsLCAwKSkpIHsKIAkJCXNrX0FTTjFfT0JKRUNUX3BvcF9mcmVlKGV4dGt1LCBBU04xX09CSkVDVF9mcmVlKTsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9FWFRFTkRFRF9LRVlfVVNBR0UsIFg1MDlWM19SX0lOVkFMSURfT0JKRUNUX0lERU5USUZJRVIpOwogCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5djMvdjNfaWE1LmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M19pYTUuYwppbmRleCA1YTI3MjMzLi5lYzU3ZTliIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDl2My92M19pYTUuYworKysgYi9zcmMvY3J5cHRvL3g1MDl2My92M19pYTUuYwpAQCAtODcsNyArODcsNyBAQAogCWNoYXIgKnRtcDsKIAlpZighaWE1IHx8ICFpYTUtPmxlbmd0aCkgcmV0dXJuIE5VTEw7CiAJaWYoISh0bXAgPSBPUEVOU1NMX21hbGxvYyhpYTUtPmxlbmd0aCArIDEpKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBpMnNfQVNOMV9JQTVTVFJJTkcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCW1lbWNweSh0bXAsIGlhNS0+ZGF0YSwgaWE1LT5sZW5ndGgpOwpAQCAtMTAwLDcgKzEwMCw3IEBACiB7CiAJQVNOMV9JQTVTVFJJTkcgKmlhNTsKIAlpZighc3RyKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX0FSR1VNRU5UKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzMmlfQVNOMV9JQTVTVFJJTkcsIFg1MDlWM19SX0lOVkFMSURfTlVMTF9BUkdVTUVOVCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlpZighKGlhNSA9IE1fQVNOMV9JQTVTVFJJTkdfbmV3KCkpKSBnb3RvIGVycjsKQEAgLTExMSw3ICsxMTEsNyBAQAogCX0KIAlyZXR1cm4gaWE1OwogCWVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHMyaV9BU04xX0lBNVNUUklORywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCXJldHVybiBOVUxMOwogfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M19pbmZvLmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M19pbmZvLmMKaW5kZXggNDc1YzU2Zi4uNzU1OGIyZCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5djMvdjNfaW5mby5jCisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX2luZm8uYwpAQCAtMTI0LDcgKzEyNCw3IEBACiAJCW5sZW4gPSBzdHJsZW4ob2JqdG1wKSArIHN0cmxlbih2dG1wLT5uYW1lKSArIDU7CiAJCW50bXAgPSBPUEVOU1NMX21hbGxvYyhubGVuKTsKIAkJaWYoIW50bXApIHsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBpMnZfQVVUSE9SSVRZX0lORk9fQUNDRVNTLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQlCVUZfc3RybGNweShudG1wLCBvYmp0bXAsIG5sZW4pOwpAQCAtMTQ4LDE5ICsxNDgsMTkgQEAKIAlpbnQgb2JqbGVuOwogCWNoYXIgKm9ianRtcCwgKnB0bXA7CiAJaWYoIShhaW5mbyA9IHNrX0FDQ0VTU19ERVNDUklQVElPTl9uZXdfbnVsbCgpKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfQVVUSE9SSVRZX0lORk9fQUNDRVNTLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShudmFsKTsgaSsrKSB7CiAJCWNuZiA9IHNrX0NPTkZfVkFMVUVfdmFsdWUobnZhbCwgaSk7CiAJCWlmKCEoYWNjID0gQUNDRVNTX0RFU0NSSVBUSU9OX25ldygpKQogCQkJfHwgIXNrX0FDQ0VTU19ERVNDUklQVElPTl9wdXNoKGFpbmZvLCBhY2MpKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0FVVEhPUklUWV9JTkZPX0FDQ0VTUywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJZ290byBlcnI7CiAJCX0KIAkJcHRtcCA9IHN0cmNocihjbmYtPm5hbWUsICc7Jyk7CiAJCWlmKCFwdG1wKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfU1lOVEFYKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0FVVEhPUklUWV9JTkZPX0FDQ0VTUywgWDUwOVYzX1JfSU5WQUxJRF9TWU5UQVgpOwogCQkJZ290byBlcnI7CiAJCX0KIAkJb2JqbGVuID0gcHRtcCAtIGNuZi0+bmFtZTsKQEAgLTE2OSwxNCArMTY5LDE0IEBACiAJCWlmKCF2MmlfR0VORVJBTF9OQU1FX2V4KGFjYy0+bG9jYXRpb24sIG1ldGhvZCwgY3R4LCAmY3RtcCwgMCkpCiAJCQkJCQkJCSBnb3RvIGVycjsgCiAJCWlmKCEob2JqdG1wID0gT1BFTlNTTF9tYWxsb2Mob2JqbGVuICsgMSkpKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0FVVEhPUklUWV9JTkZPX0FDQ0VTUywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJZ290byBlcnI7CiAJCX0KIAkJc3RybmNweShvYmp0bXAsIGNuZi0+bmFtZSwgb2JqbGVuKTsKIAkJb2JqdG1wW29iamxlbl0gPSAwOwogCQlhY2MtPm1ldGhvZCA9IE9CSl90eHQyb2JqKG9ianRtcCwgMCk7CiAJCWlmKCFhY2MtPm1ldGhvZCkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9CQURfT0JKRUNUKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0FVVEhPUklUWV9JTkZPX0FDQ0VTUywgWDUwOVYzX1JfQkFEX09CSkVDVCk7CiAJCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgInZhbHVlPSIsIG9ianRtcCk7CiAJCQlPUEVOU1NMX2ZyZWUob2JqdG1wKTsKIAkJCWdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5djMvdjNfbGliLmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M19saWIuYwppbmRleCBmOGU1NTMxLi5kNGU0ZTc4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDl2My92M19saWIuYworKysgYi9zcmMvY3J5cHRvL3g1MDl2My92M19saWIuYwpAQCAtNzgsMTIgKzc4LDEyIEBACiBpbnQgWDUwOVYzX0VYVF9hZGQoWDUwOVYzX0VYVF9NRVRIT0QgKmV4dCkKIHsKIAlpZighZXh0X2xpc3QgJiYgIShleHRfbGlzdCA9IHNrX1g1MDlWM19FWFRfTUVUSE9EX25ldyhleHRfc3RhY2tfY21wKSkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX0VYVF9hZGQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJZXh0X2xpc3RfZnJlZShleHQpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYoIXNrX1g1MDlWM19FWFRfTUVUSE9EX3B1c2goZXh0X2xpc3QsIGV4dCkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX0VYVF9hZGQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJZXh0X2xpc3RfZnJlZShleHQpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMjcsNyArMTI3LDcgQEAKIAkgICAgY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKmV4dF9tZXRob2QgPSBYNTA5VjNfRVhUX2dldF9uaWQobmlkKTsKIAkgICAgaWYgKGV4dF9tZXRob2QgPT0gTlVMTCkKIAkgICAgewotCQkgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9DQU5OT1RfRklORF9GUkVFX0ZVTkNUSU9OKTsKKwkJICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX0VYVF9mcmVlLCBYNTA5VjNfUl9DQU5OT1RfRklORF9GUkVFX0ZVTkNUSU9OKTsKIAkJICAgIHJldHVybiAwOwogCSAgICB9CiAKQEAgLTEzNyw3ICsxMzcsNyBAQAogCQkgICAgZXh0X21ldGhvZC0+ZXh0X2ZyZWUoZXh0X2RhdGEpOwogCSAgICBlbHNlCiAJICAgIHsKLQkJICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfQ0FOTk9UX0ZJTkRfRlJFRV9GVU5DVElPTik7CisJCSAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19FWFRfZnJlZSwgWDUwOVYzX1JfQ0FOTk9UX0ZJTkRfRlJFRV9GVU5DVElPTik7CiAJCSAgICByZXR1cm4gMDsKIAkgICAgfQogCkBAIC0xNTcsMTEgKzE1NywxMSBAQAogCVg1MDlWM19FWFRfTUVUSE9EICp0bXBleHQ7CiAKIAlpZighKGV4dCA9IFg1MDlWM19FWFRfZ2V0X25pZChuaWRfZnJvbSkpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfRVhURU5TSU9OX05PVF9GT1VORCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX0VYVF9hZGRfYWxpYXMsIFg1MDlWM19SX0VYVEVOU0lPTl9OT1RfRk9VTkQpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYoISh0bXBleHQgPSAoWDUwOVYzX0VYVF9NRVRIT0QgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOVYzX0VYVF9NRVRIT0QpKSkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX0VYVF9hZGRfYWxpYXMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIDA7CiAJfQogCSp0bXBleHQgPSAqZXh0OwpAQCAtMzExLDcgKzMxMSw3IEBACiAJZXh0ID0gWDUwOVYzX0VYVF9pMmQobmlkLCBjcml0LCB2YWx1ZSk7CiAKIAlpZighZXh0KSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfRVJST1JfQ1JFQVRJTkdfRVhURU5TSU9OKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfYWRkMV9pMmQsIFg1MDlWM19SX0VSUk9SX0NSRUFUSU5HX0VYVEVOU0lPTik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMzMwLDYgKzMzMCw2IEBACiAKIAllcnI6CiAJaWYoIShmbGFncyAmIFg1MDlWM19BRERfU0lMRU5UKSkKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBlcnJjb2RlKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfYWRkMV9pMmQsIGVycmNvZGUpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5djMvdjNfbmNvbnMuYyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX25jb25zLmMKaW5kZXggMTlmNWU5NC4uYzQyYTY2NSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5djMvdjNfbmNvbnMuYworKysgYi9zcmMvY3J5cHRvL3g1MDl2My92M19uY29ucy5jCkBAIC0xMzUsNyArMTM1LDcgQEAKIAkJCX0KIAkJZWxzZQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JTlZBTElEX1NZTlRBWCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9OQU1FX0NPTlNUUkFJTlRTLCBYNTA5VjNfUl9JTlZBTElEX1NZTlRBWCk7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJdHZhbC52YWx1ZSA9IHZhbC0+dmFsdWU7CkBAIC0xNTIsNyArMTUyLDcgQEAKIAlyZXR1cm4gbmNvbnM7CiAKIAltZW1lcnI6Ci0JT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfTkFNRV9DT05TVFJBSU5UUywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCWVycjoKIAlpZiAobmNvbnMpCiAJCU5BTUVfQ09OU1RSQUlOVFNfZnJlZShuY29ucyk7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M19wY2kuYyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX3BjaS5jCmluZGV4IGYxOWEzN2EuLmFhOTM4OTEgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX3BjaS5jCisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX3BjaS5jCkBAIC04NywxMyArODcsMTMgQEAKIAkJewogCQlpZiAoKmxhbmd1YWdlKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9QT0xJQ1lfTEFOR1VBR0VfQUxSRUFEWV9ERUZJTkVEKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcHJvY2Vzc19wY2lfdmFsdWUsIFg1MDlWM19SX1BPTElDWV9MQU5HVUFHRV9BTFJFQURZX0RFRklORUQpOwogCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAJCQlyZXR1cm4gMDsKIAkJCX0KIAkJaWYgKCEoKmxhbmd1YWdlID0gT0JKX3R4dDJvYmoodmFsLT52YWx1ZSwgMCkpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JTlZBTElEX09CSkVDVF9JREVOVElGSUVSKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcHJvY2Vzc19wY2lfdmFsdWUsIFg1MDlWM19SX0lOVkFMSURfT0JKRUNUX0lERU5USUZJRVIpOwogCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAJCQlyZXR1cm4gMDsKIAkJCX0KQEAgLTEwMiwxMyArMTAyLDEzIEBACiAJCXsKIAkJaWYgKCpwYXRobGVuKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9QT0xJQ1lfUEFUSF9MRU5HVEhfQUxSRUFEWV9ERUZJTkVEKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcHJvY2Vzc19wY2lfdmFsdWUsIFg1MDlWM19SX1BPTElDWV9QQVRIX0xFTkdUSF9BTFJFQURZX0RFRklORUQpOwogCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAJCQlyZXR1cm4gMDsKIAkJCX0KIAkJaWYgKCFYNTA5VjNfZ2V0X3ZhbHVlX2ludCh2YWwsIHBhdGhsZW4pKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9QT0xJQ1lfUEFUSF9MRU5HVEgpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwcm9jZXNzX3BjaV92YWx1ZSwgWDUwOVYzX1JfUE9MSUNZX1BBVEhfTEVOR1RIKTsKIAkJCVg1MDlWM19jb25mX2Vycih2YWwpOwogCQkJcmV0dXJuIDA7CiAJCQl9CkBAIC0xMjIsNyArMTIyLDcgQEAKIAkJCSpwb2xpY3kgPSBBU04xX09DVEVUX1NUUklOR19uZXcoKTsKIAkJCWlmICghKnBvbGljeSkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwcm9jZXNzX3BjaV92YWx1ZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJCVg1MDlWM19jb25mX2Vycih2YWwpOwogCQkJCXJldHVybiAwOwogCQkJCX0KQEAgLTEzNSw3ICsxMzUsNyBAQAogCiAJCQlpZiAoIXRtcF9kYXRhMikgCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSUxMRUdBTF9IRVhfRElHSVQpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcHJvY2Vzc19wY2lfdmFsdWUsIFg1MDlWM19SX0lMTEVHQUxfSEVYX0RJR0lUKTsKIAkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CkBAIC0xNTYsNyArMTU2LDcgQEAKIAkJCQkvKiByZWFsbG9jIGZhaWx1cmUgaW1wbGllcyB0aGUgb3JpZ2luYWwgZGF0YSBzcGFjZSBpcyBiMHJrZWQgdG9vISAqLwogCQkJCSgqcG9saWN5KS0+ZGF0YSA9IE5VTEw7CiAJCQkJKCpwb2xpY3kpLT5sZW5ndGggPSAwOwotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcHJvY2Vzc19wY2lfdmFsdWUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CkBAIC0xNjksNyArMTY5LDcgQEAKIAkJCUJJTyAqYiA9IEJJT19uZXdfZmlsZSh2YWwtPnZhbHVlICsgNSwgInIiKTsKIAkJCWlmICghYikKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9CSU9fTElCKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHByb2Nlc3NfcGNpX3ZhbHVlLCBFUlJfUl9CSU9fTElCKTsKIAkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CkBAIC0xOTQsNyArMTk0LDcgQEAKIAogCQkJaWYgKG4gPCAwKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX0JJT19MSUIpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcHJvY2Vzc19wY2lfdmFsdWUsIEVSUl9SX0JJT19MSUIpOwogCQkJCVg1MDlWM19jb25mX2Vycih2YWwpOwogCQkJCWdvdG8gZXJyOwogCQkJCX0KQEAgLTIxNywyMCArMjE3LDIwIEBACiAJCQkJLyogcmVhbGxvYyBmYWlsdXJlIGltcGxpZXMgdGhlIG9yaWdpbmFsIGRhdGEgc3BhY2UgaXMgYjBya2VkIHRvbyEgKi8KIAkJCQkoKnBvbGljeSktPmRhdGEgPSBOVUxMOwogCQkJCSgqcG9saWN5KS0+bGVuZ3RoID0gMDsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHByb2Nlc3NfcGNpX3ZhbHVlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJfQogCQllbHNlCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOQ09SUkVDVF9QT0xJQ1lfU1lOVEFYX1RBRyk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHByb2Nlc3NfcGNpX3ZhbHVlLCBYNTA5VjNfUl9JTkNPUlJFQ1RfUE9MSUNZX1NZTlRBWF9UQUcpOwogCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJaWYgKCF0bXBfZGF0YSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwcm9jZXNzX3BjaV92YWx1ZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAJCQlnb3RvIGVycjsKIAkJCX0KQEAgLTI2Miw3ICsyNjIsNyBAQAogCQlDT05GX1ZBTFVFICpjbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKHZhbHMsIGkpOwogCQlpZiAoIWNuZi0+bmFtZSB8fCAoKmNuZi0+bmFtZSAhPSAnQCcgJiYgIWNuZi0+dmFsdWUpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JTlZBTElEX1BST1hZX1BPTElDWV9TRVRUSU5HKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcjJpX3BjaSwgWDUwOVYzX1JfSU5WQUxJRF9QUk9YWV9QT0xJQ1lfU0VUVElORyk7CiAJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKIAkJCWdvdG8gZXJyOwogCQkJfQpAQCAtMjc0LDcgKzI3NCw3IEBACiAJCQlzZWN0ID0gWDUwOVYzX2dldF9zZWN0aW9uKGN0eCwgY25mLT5uYW1lICsgMSk7CiAJCQlpZiAoIXNlY3QpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9TRUNUSU9OKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHIyaV9wY2ksIFg1MDlWM19SX0lOVkFMSURfU0VDVElPTik7CiAJCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CiAJCQkJZ290byBlcnI7CiAJCQkJfQpAQCAtMzAyLDIxICszMDIsMjAgQEAKIAkvKiBMYW5ndWFnZSBpcyBtYW5kYXRvcnkgKi8KIAlpZiAoIWxhbmd1YWdlKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfTk9fUFJPWFlfQ0VSVF9QT0xJQ1lfTEFOR1VBR0VfREVGSU5FRCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcjJpX3BjaSwgWDUwOVYzX1JfTk9fUFJPWFlfQ0VSVF9QT0xJQ1lfTEFOR1VBR0VfREVGSU5FRCk7CiAJCWdvdG8gZXJyOwogCQl9CiAJbmlkID0gT0JKX29iajJuaWQobGFuZ3VhZ2UpOwogCWlmICgobmlkID09IE5JRF9JbmRlcGVuZGVudCB8fCBuaWQgPT0gTklEX2lkX3BwbF9pbmhlcml0QWxsKSAmJiBwb2xpY3kpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLAotCQkJWDUwOVYzX1JfUE9MSUNZX1dIRU5fUFJPWFlfTEFOR1VBR0VfUkVRVUlSRVNfTk9fUE9MSUNZKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCByMmlfcGNpLCBYNTA5VjNfUl9QT0xJQ1lfV0hFTl9QUk9YWV9MQU5HVUFHRV9SRVFVSVJFU19OT19QT0xJQ1kpOwogCQlnb3RvIGVycjsKIAkJfQogCiAJcGNpID0gUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTl9uZXcoKTsKIAlpZiAoIXBjaSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCByMmlfcGNpLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCWdvdG8gZXJyOwogCQl9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX3Bjb25zLmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M19wY29ucy5jCmluZGV4IGI3NTIyOTAuLmY4N2M2YTAgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX3Bjb25zLmMKKysrIGIvc3JjL2NyeXB0by94NTA5djMvdjNfcGNvbnMuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAJQ09ORl9WQUxVRSAqdmFsOwogCXNpemVfdCBpOwogCWlmKCEocGNvbnMgPSBQT0xJQ1lfQ09OU1RSQUlOVFNfbmV3KCkpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9QT0xJQ1lfQ09OU1RSQUlOVFMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKHZhbHVlcyk7IGkrKykgewpAQCAtMTI0LDEzICsxMjQsMTMgQEAKIAkJCWlmKCFYNTA5VjNfZ2V0X3ZhbHVlX2ludCh2YWwsCiAJCQkJJnBjb25zLT5pbmhpYml0UG9saWN5TWFwcGluZykpIGdvdG8gZXJyOwogCQl9IGVsc2UgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JTlZBTElEX05BTUUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfUE9MSUNZX0NPTlNUUkFJTlRTLCBYNTA5VjNfUl9JTlZBTElEX05BTUUpOwogCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAJCQlnb3RvIGVycjsKIAkJfQogCX0KIAlpZiAoIXBjb25zLT5pbmhpYml0UG9saWN5TWFwcGluZyAmJiAhcGNvbnMtPnJlcXVpcmVFeHBsaWNpdFBvbGljeSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lMTEVHQUxfRU1QVFlfRVhURU5TSU9OKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfUE9MSUNZX0NPTlNUUkFJTlRTLCBYNTA5VjNfUl9JTExFR0FMX0VNUFRZX0VYVEVOU0lPTik7CiAJCWdvdG8gZXJyOwogCX0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5djMvdjNfcG1hcHMuYyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX3BtYXBzLmMKaW5kZXggNWI5MDk3Ny4uZmJjMTY5ZCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5djMvdjNfcG1hcHMuYworKysgYi9zcmMvY3J5cHRvL3g1MDl2My92M19wbWFwcy5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIAlzaXplX3QgaTsKIAogCWlmKCEocG1hcHMgPSBza19QT0xJQ1lfTUFQUElOR19uZXdfbnVsbCgpKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfUE9MSUNZX01BUFBJTkdTLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMTMwLDcgKzEzMCw3IEBACiAJCXZhbCA9IHNrX0NPTkZfVkFMVUVfdmFsdWUobnZhbCwgaSk7CiAJCWlmKCF2YWwtPnZhbHVlIHx8ICF2YWwtPm5hbWUpIHsKIAkJCXNrX1BPTElDWV9NQVBQSU5HX3BvcF9mcmVlKHBtYXBzLCBQT0xJQ1lfTUFQUElOR19mcmVlKTsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9QT0xJQ1lfTUFQUElOR1MsIFg1MDlWM19SX0lOVkFMSURfT0JKRUNUX0lERU5USUZJRVIpOwogCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQpAQCAtMTM4LDE0ICsxMzgsMTQgQEAKIAkJb2JqMiA9IE9CSl90eHQyb2JqKHZhbC0+dmFsdWUsIDApOwogCQlpZighb2JqMSB8fCAhb2JqMikgewogCQkJc2tfUE9MSUNZX01BUFBJTkdfcG9wX2ZyZWUocG1hcHMsIFBPTElDWV9NQVBQSU5HX2ZyZWUpOwotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JTlZBTElEX09CSkVDVF9JREVOVElGSUVSKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX1BPTElDWV9NQVBQSU5HUywgWDUwOVYzX1JfSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUik7CiAJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCXBtYXAgPSBQT0xJQ1lfTUFQUElOR19uZXcoKTsKIAkJaWYgKCFwbWFwKSB7CiAJCQlza19QT0xJQ1lfTUFQUElOR19wb3BfZnJlZShwbWFwcywgUE9MSUNZX01BUFBJTkdfZnJlZSk7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX1BPTElDWV9NQVBQSU5HUywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAkJcG1hcC0+aXNzdWVyRG9tYWluUG9saWN5ID0gb2JqMTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX3B1cnAuYyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX3B1cnAuYwppbmRleCBmNTNjMGYxLi44YWU4YTA2IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDl2My92M19wdXJwLmMKKysrIGIvc3JjL2NyeXB0by94NTA5djMvdjNfcHVycC5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIGludCBYNTA5X1BVUlBPU0Vfc2V0KGludCAqcCwgaW50IHB1cnBvc2UpCiB7CiAJaWYoWDUwOV9QVVJQT1NFX2dldF9ieV9pZChwdXJwb3NlKSA9PSAtMSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfUFVSUE9TRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOV9QVVJQT1NFX3NldCwgWDUwOVYzX1JfSU5WQUxJRF9QVVJQT1NFKTsKIAkJcmV0dXJuIDA7CiAJfQogCSpwID0gcHVycG9zZTsKQEAgLTE5MSw3ICsxOTEsNyBAQAogCS8qIE5lZWQgYSBuZXcgZW50cnkgKi8KIAlpZihpZHggPT0gLTEpIHsKIAkJaWYoIShwdG1wID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFg1MDlfUFVSUE9TRSkpKSkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlfUFVSUE9TRV9hZGQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCXB0bXAtPmZsYWdzID0gWDUwOV9QVVJQT1NFX0RZTkFNSUM7CkBAIC0yMDEsNyArMjAxLDcgQEAKIAluYW1lX2R1cCA9IEJVRl9zdHJkdXAobmFtZSk7CiAJc25hbWVfZHVwID0gQlVGX3N0cmR1cChzbmFtZSk7CiAJaWYgKG5hbWVfZHVwID09IE5VTEwgfHwgc25hbWVfZHVwID09IE5VTEwpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOV9QVVJQT1NFX2FkZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlpZiAobmFtZV9kdXAgIT0gTlVMTCkKIAkJCU9QRU5TU0xfZnJlZShuYW1lX2R1cCk7CiAJCWlmIChzbmFtZV9kdXAgIT0gTlVMTCkKQEAgLTIzMiwxMiArMjMyLDEyIEBACiAJLyogSWYgaXRzIGEgbmV3IGVudHJ5IG1hbmFnZSB0aGUgZHluYW1pYyB0YWJsZSAqLwogCWlmKGlkeCA9PSAtMSkgewogCQlpZigheHB0YWJsZSAmJiAhKHhwdGFibGUgPSBza19YNTA5X1BVUlBPU0VfbmV3KHhwX2NtcCkpKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOV9QVVJQT1NFX2FkZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJeHB0YWJsZV9mcmVlKHB0bXApOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaWYgKCFza19YNTA5X1BVUlBPU0VfcHVzaCh4cHRhYmxlLCBwdG1wKSkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlfUFVSUE9TRV9hZGQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCXhwdGFibGVfZnJlZShwdG1wKTsKIAkJCXJldHVybiAwOwogCQl9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M19za2V5LmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M19za2V5LmMKaW5kZXggZTM5NmYwNS4uNDcxYTFhYiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5djMvdjNfc2tleS5jCisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX3NrZXkuYwpAQCAtODYsNyArODYsNyBAQAogCWxvbmcgbGVuZ3RoOwogCiAJaWYoIShvY3QgPSBNX0FTTjFfT0NURVRfU1RSSU5HX25ldygpKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzMmlfQVNOMV9PQ1RFVF9TVFJJTkcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xMTIsMTQgKzExMiwxNCBAQAogCWlmKHN0cmNtcChzdHIsICJoYXNoIikpIHJldHVybiBzMmlfQVNOMV9PQ1RFVF9TVFJJTkcobWV0aG9kLCBjdHgsIHN0cik7CiAKIAlpZighKG9jdCA9IE1fQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCkpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHMyaV9za2V5X2lkLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCWlmKGN0eCAmJiAoY3R4LT5mbGFncyA9PSBDVFhfVEVTVCkpIHJldHVybiBvY3Q7CiAKIAlpZighY3R4IHx8ICghY3R4LT5zdWJqZWN0X3JlcSAmJiAhY3R4LT5zdWJqZWN0X2NlcnQpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfTk9fUFVCTElDX0tFWSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgczJpX3NrZXlfaWQsIFg1MDlWM19SX05PX1BVQkxJQ19LRVkpOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTEyOCw3ICsxMjgsNyBAQAogCWVsc2UgcGsgPSBjdHgtPnN1YmplY3RfY2VydC0+Y2VydF9pbmZvLT5rZXktPnB1YmxpY19rZXk7CiAKIAlpZighcGspIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9OT19QVUJMSUNfS0VZKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzMmlfc2tleV9pZCwgWDUwOVYzX1JfTk9fUFVCTElDX0tFWSk7CiAJCWdvdG8gZXJyOwogCX0KIApAQCAtMTM2LDcgKzEzNiw3IEBACiAJCWdvdG8gZXJyOwogCiAJaWYoIU1fQVNOMV9PQ1RFVF9TVFJJTkdfc2V0KG9jdCwgcGtleV9kaWcsIGRpZ2xlbikpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgczJpX3NrZXlfaWQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJZ290byBlcnI7CiAJfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M19zeG5ldC5jIGIvc3JjL2NyeXB0by94NTA5djMvdjNfc3huZXQuYwppbmRleCA0ZGQ1YmZjLi5iYjVlMjE0IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDl2My92M19zeG5ldC5jCisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX3N4bmV0LmMKQEAgLTE1OSw3ICsxNTksNyBAQAogewogCUFTTjFfSU5URUdFUiAqaXpvbmUgPSBOVUxMOwogCWlmKCEoaXpvbmUgPSBzMmlfQVNOMV9JTlRFR0VSKE5VTEwsIHpvbmUpKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0VSUk9SX0NPTlZFUlRJTkdfWk9ORSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgU1hORVRfYWRkX2lkX2FzYywgWDUwOVYzX1JfRVJST1JfQ09OVkVSVElOR19aT05FKTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiBTWE5FVF9hZGRfaWRfSU5URUdFUihwc3gsIGl6b25lLCB1c2VyLCB1c2VybGVuKTsKQEAgLTE3Miw3ICsxNzIsNyBAQAogewogCUFTTjFfSU5URUdFUiAqaXpvbmUgPSBOVUxMOwogCWlmKCEoaXpvbmUgPSBNX0FTTjFfSU5URUdFUl9uZXcoKSkgfHwgIUFTTjFfSU5URUdFUl9zZXQoaXpvbmUsIGx6b25lKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBTWE5FVF9hZGRfaWRfdWxvbmcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJTV9BU04xX0lOVEVHRVJfZnJlZShpem9uZSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTE5MSwxMiArMTkxLDEyIEBACiAJU1hORVQgKnN4ID0gTlVMTDsKIAlTWE5FVElEICppZCA9IE5VTEw7CiAJaWYoIXBzeCB8fCAhem9uZSB8fCAhdXNlcikgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfTlVMTF9BUkdVTUVOVCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgU1hORVRfYWRkX2lkX0lOVEVHRVIsIFg1MDlWM19SX0lOVkFMSURfTlVMTF9BUkdVTUVOVCk7CiAJCXJldHVybiAwOwogCX0KIAlpZih1c2VybGVuID09IC0xKSB1c2VybGVuID0gc3RybGVuKHVzZXIpOwogCWlmKHVzZXJsZW4gPiA2NCkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX1VTRVJfVE9PX0xPTkcpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFNYTkVUX2FkZF9pZF9JTlRFR0VSLCBYNTA5VjNfUl9VU0VSX1RPT19MT05HKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmKCEqcHN4KSB7CkBAIC0yMDUsNyArMjA1LDcgQEAKIAkJKnBzeCA9IHN4OwogCX0gZWxzZSBzeCA9ICpwc3g7CiAJaWYoU1hORVRfZ2V0X2lkX0lOVEVHRVIoc3gsIHpvbmUpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfRFVQTElDQVRFX1pPTkVfSUQpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFNYTkVUX2FkZF9pZF9JTlRFR0VSLCBYNTA5VjNfUl9EVVBMSUNBVEVfWk9ORV9JRCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMjE4LDcgKzIxOCw3IEBACiAJcmV0dXJuIDE7CiAJCiAJZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgU1hORVRfYWRkX2lkX0lOVEVHRVIsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAlTWE5FVElEX2ZyZWUoaWQpOwogCVNYTkVUX2ZyZWUoc3gpOwogCSpwc3ggPSBOVUxMOwpAQCAtMjMwLDcgKzIzMCw3IEBACiAJQVNOMV9JTlRFR0VSICppem9uZSA9IE5VTEw7CiAJQVNOMV9PQ1RFVF9TVFJJTkcgKm9jdDsKIAlpZighKGl6b25lID0gczJpX0FTTjFfSU5URUdFUihOVUxMLCB6b25lKSkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9FUlJPUl9DT05WRVJUSU5HX1pPTkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFNYTkVUX2dldF9pZF9hc2MsIFg1MDlWM19SX0VSUk9SX0NPTlZFUlRJTkdfWk9ORSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlvY3QgPSBTWE5FVF9nZXRfaWRfSU5URUdFUihzeCwgaXpvbmUpOwpAQCAtMjQzLDcgKzI0Myw3IEBACiAJQVNOMV9JTlRFR0VSICppem9uZSA9IE5VTEw7CiAJQVNOMV9PQ1RFVF9TVFJJTkcgKm9jdDsKIAlpZighKGl6b25lID0gTV9BU04xX0lOVEVHRVJfbmV3KCkpIHx8ICFBU04xX0lOVEVHRVJfc2V0KGl6b25lLCBsem9uZSkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgU1hORVRfZ2V0X2lkX3Vsb25nLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCU1fQVNOMV9JTlRFR0VSX2ZyZWUoaXpvbmUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M191dGwuYyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX3V0bC5jCmluZGV4IGFhNjVjNzkuLjE0YTJmM2IgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX3V0bC5jCisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX3V0bC5jCkBAIC03MCw4ICs3MCw2IEBACiAjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KICNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgogCi0jaW5jbHVkZSAiLi4vY29uZi9pbnRlcm5hbC5oIgotCiAKIHN0YXRpYyBjaGFyICpzdHJpcF9zcGFjZXMoY2hhciAqbmFtZSk7CiBzdGF0aWMgaW50IHNrX3N0cmNtcChjb25zdCBPUEVOU1NMX1NUUklORyAqYSwgY29uc3QgT1BFTlNTTF9TVFJJTkcgKmIpOwpAQCAtOTMsNyArOTEsNyBAQAogCWNoYXIgKnRuYW1lID0gTlVMTCwgKnR2YWx1ZSA9IE5VTEw7CiAJaWYobmFtZSAmJiAhKHRuYW1lID0gQlVGX3N0cmR1cChuYW1lKSkpIGdvdG8gZXJyOwogCWlmKHZhbHVlICYmICEodHZhbHVlID0gQlVGX3N0cmR1cCh2YWx1ZSkpKSBnb3RvIGVycjsKLQlpZighKHZ0bXAgPSBDT05GX1ZBTFVFX25ldygpKSkgZ290byBlcnI7CisJaWYoISh2dG1wID0gKENPTkZfVkFMVUUgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoQ09ORl9WQUxVRSkpKSkgZ290byBlcnI7CiAJaWYoISpleHRsaXN0ICYmICEoKmV4dGxpc3QgPSBza19DT05GX1ZBTFVFX25ld19udWxsKCkpKSBnb3RvIGVycjsKIAl2dG1wLT5zZWN0aW9uID0gTlVMTDsKIAl2dG1wLT5uYW1lID0gdG5hbWU7CkBAIC0xMDEsNyArOTksNyBAQAogCWlmKCFza19DT05GX1ZBTFVFX3B1c2goKmV4dGxpc3QsIHZ0bXApKSBnb3RvIGVycjsKIAlyZXR1cm4gMTsKIAllcnI6Ci0JT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfYWRkX3ZhbHVlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJaWYodnRtcCkgT1BFTlNTTF9mcmVlKHZ0bXApOwogCWlmKHRuYW1lKSBPUEVOU1NMX2ZyZWUodG5hbWUpOwogCWlmKHR2YWx1ZSkgT1BFTlNTTF9mcmVlKHR2YWx1ZSk7CkBAIC0xNDcsNyArMTQ1LDcgQEAKIAlpZighYSkgcmV0dXJuIE5VTEw7CiAJaWYoIShibnRtcCA9IEFTTjFfRU5VTUVSQVRFRF90b19CTihhLCBOVUxMKSkgfHwKIAkgICAgIShzdHJ0bXAgPSBCTl9ibjJkZWMoYm50bXApKSApCi0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGkyc19BU04xX0VOVU1FUkFURUQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAlCTl9mcmVlKGJudG1wKTsKIAlyZXR1cm4gc3RydG1wOwogfQpAQCAtMTU5LDcgKzE1Nyw3IEBACiAJaWYoIWEpIHJldHVybiBOVUxMOwogCWlmKCEoYm50bXAgPSBBU04xX0lOVEVHRVJfdG9fQk4oYSwgTlVMTCkpIHx8CiAJICAgICEoc3RydG1wID0gQk5fYm4yZGVjKGJudG1wKSkgKQotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBpMnNfQVNOMV9JTlRFR0VSLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJQk5fZnJlZShibnRtcCk7CiAJcmV0dXJuIHN0cnRtcDsKIH0KQEAgLTE3MSw3ICsxNjksNyBAQAogCWludCBpc25lZywgaXNoZXg7CiAJaW50IHJldDsKIAlpZiAoIXZhbHVlKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX1ZBTFVFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzMmlfQVNOMV9JTlRFR0VSLCBYNTA5VjNfUl9JTlZBTElEX05VTExfVkFMVUUpOwogCQlyZXR1cm4gMDsKIAl9CiAJYm4gPSBCTl9uZXcoKTsKQEAgLTE5MCw3ICsxODgsNyBAQAogCiAJaWYgKCFyZXQgfHwgdmFsdWVbcmV0XSkgewogCQlCTl9mcmVlKGJuKTsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9CTl9ERUMyQk5fRVJST1IpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHMyaV9BU04xX0lOVEVHRVIsIFg1MDlWM19SX0JOX0RFQzJCTl9FUlJPUik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTk5LDcgKzE5Nyw3IEBACiAJYWludCA9IEJOX3RvX0FTTjFfSU5URUdFUihibiwgTlVMTCk7CiAJQk5fZnJlZShibik7CiAJaWYgKCFhaW50KSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfQk5fVE9fQVNOMV9JTlRFR0VSX0VSUk9SKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzMmlfQVNOMV9JTlRFR0VSLCBYNTA5VjNfUl9CTl9UT19BU04xX0lOVEVHRVJfRVJST1IpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKGlzbmVnKSBhaW50LT50eXBlIHw9IFZfQVNOMV9ORUc7CkBAIC0yMzQsNyArMjMyLDcgQEAKIAkJcmV0dXJuIDE7CiAJfQogCWVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfQk9PTEVBTl9TVFJJTkcpOworCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX2dldF92YWx1ZV9ib29sLCBYNTA5VjNfUl9JTlZBTElEX0JPT0xFQU5fU1RSSU5HKTsKIAlYNTA5VjNfY29uZl9lcnIodmFsdWUpOwogCXJldHVybiAwOwogfQpAQCAtMjY2LDcgKzI2NCw3IEBACiAJbGluZWJ1ZiA9IEJVRl9zdHJkdXAobGluZSk7CiAJaWYgKGxpbmVidWYgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfcGFyc2VfbGlzdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlnb3RvIGVycjsKIAkJfQogCXN0YXRlID0gSERSX05BTUU7CkBAIC0yODEsNyArMjc5LDcgQEAKIAkJCQkqcCA9IDA7CiAJCQkJbnRtcCA9IHN0cmlwX3NwYWNlcyhxKTsKIAkJCQlpZighbnRtcCkgewotCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfTlVMTF9OQU1FKTsKKwkJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfcGFyc2VfbGlzdCwgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX05BTUUpOwogCQkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQkJcSA9IHAgKyAxOwpAQCAtMjkzLDcgKzI5MSw3IEBACiAJCQkJcHJpbnRmKCIlc1xuIiwgbnRtcCk7CiAjZW5kaWYKIAkJCQlpZighbnRtcCkgewotCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfTlVMTF9OQU1FKTsKKwkJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfcGFyc2VfbGlzdCwgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX05BTUUpOwogCQkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQkJWDUwOVYzX2FkZF92YWx1ZShudG1wLCBOVUxMLCAmdmFsdWVzKTsKQEAgLTMwOSw3ICszMDcsNyBAQAogCQkJCXByaW50ZigiJXNcbiIsIG50bXApOwogI2VuZGlmCiAJCQkJaWYoIXZ0bXApIHsKLQkJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JTlZBTElEX05VTExfVkFMVUUpOworCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19wYXJzZV9saXN0LCBYNTA5VjNfUl9JTlZBTElEX05VTExfVkFMVUUpOwogCQkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQkJWDUwOVYzX2FkZF92YWx1ZShudG1wLCB2dG1wLCAmdmFsdWVzKTsKQEAgLTMyNiw3ICszMjQsNyBAQAogCQlwcmludGYoIiVzPSVzXG4iLCBudG1wLCB2dG1wKTsKICNlbmRpZgogCQlpZighdnRtcCkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JTlZBTElEX05VTExfVkFMVUUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfcGFyc2VfbGlzdCwgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX1ZBTFVFKTsKIAkJCWdvdG8gZXJyOwogCQl9CiAJCVg1MDlWM19hZGRfdmFsdWUobnRtcCwgdnRtcCwgJnZhbHVlcyk7CkBAIC0zMzYsNyArMzM0LDcgQEAKIAkJcHJpbnRmKCIlc1xuIiwgbnRtcCk7CiAjZW5kaWYKIAkJaWYoIW50bXApIHsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX05BTUUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfcGFyc2VfbGlzdCwgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX05BTUUpOwogCQkJZ290byBlcnI7CiAJCX0KIAkJWDUwOVYzX2FkZF92YWx1ZShudG1wLCBOVUxMLCAmdmFsdWVzKTsKQEAgLTM4MSw3ICszNzksNyBAQAogCXN0YXRpYyBjb25zdCBjaGFyIGhleGRpZ1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOwogCWlmKCFidWZmZXIgfHwgIWxlbikgcmV0dXJuIE5VTEw7CiAJaWYoISh0bXAgPSBPUEVOU1NMX21hbGxvYyhsZW4gKiAzICsgMSkpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGhleF90b19zdHJpbmcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCXEgPSB0bXA7CkBAIC00MDQsNyArNDAyLDcgQEAKIAl1bnNpZ25lZCBjaGFyICpoZXhidWYsICpxOwogCXVuc2lnbmVkIGNoYXIgY2gsIGNsLCAqcDsKIAlpZighc3RyKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX0FSR1VNRU5UKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzdHJpbmdfdG9faGV4LCBYNTA5VjNfUl9JTlZBTElEX05VTExfQVJHVU1FTlQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJaWYoIShoZXhidWYgPSBPUEVOU1NMX21hbGxvYyhzdHJsZW4oc3RyKSA+PiAxKSkpIGdvdG8gZXJyOwpAQCAtNDEzLDcgKzQxMSw3IEBACiAJCWlmKGNoID09ICc6JykgY29udGludWU7CiAJCWNsID0gKnArKzsKIAkJaWYoIWNsKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX09ERF9OVU1CRVJfT0ZfRElHSVRTKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgc3RyaW5nX3RvX2hleCwgWDUwOVYzX1JfT0REX05VTUJFUl9PRl9ESUdJVFMpOwogCQkJT1BFTlNTTF9mcmVlKGhleGJ1Zik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQpAQCAtNDM3LDEyICs0MzUsMTIgQEAKIAogCWVycjoKIAlpZihoZXhidWYpIE9QRU5TU0xfZnJlZShoZXhidWYpOwotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgc3RyaW5nX3RvX2hleCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCXJldHVybiBOVUxMOwogCiAJYmFkaGV4OgogCU9QRU5TU0xfZnJlZShoZXhidWYpOwotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSUxMRUdBTF9IRVhfRElHSVQpOworCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgc3RyaW5nX3RvX2hleCwgWDUwOVYzX1JfSUxMRUdBTF9IRVhfRElHSVQpOwogCXJldHVybiBOVUxMOwogCiB9CkBAIC04ODQsOSArODgyLDkgQEAKIAkJaWYgKGFzdHJsZW4gPCAwKQogCQkJcmV0dXJuIC0xOwogCQlydiA9IGVxdWFsKGFzdHIsIGFzdHJsZW4sICh1bnNpZ25lZCBjaGFyICopYiwgYmxlbiwgZmxhZ3MpOworCQlPUEVOU1NMX2ZyZWUoYXN0cik7CiAJCWlmIChydiA+IDAgJiYgcGVlcm5hbWUpCiAJCQkqcGVlcm5hbWUgPSBCVUZfc3RybmR1cCgoY2hhciAqKWFzdHIsIGFzdHJsZW4pOwotCQlPUEVOU1NMX2ZyZWUoYXN0cik7CiAJCX0KIAlyZXR1cm4gcnY7CiAJfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5djMvdjNuYW1lX3Rlc3QuYyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzbmFtZXRlc3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NyeXB0by94NTA5djMvdjNuYW1lX3Rlc3QuYwpyZW5hbWUgdG8gc3JjL2NyeXB0by94NTA5djMvdjNuYW1ldGVzdC5jCmRpZmYgLS1naXQgYS9zcmMvZGVjcmVwaXQvQ01ha2VMaXN0cy50eHQgYi9zcmMvZGVjcmVwaXQvQ01ha2VMaXN0cy50eHQKaW5kZXggODRlNTI1Mi4uYjQzZmVhNyAxMDA2NDQKLS0tIGEvc3JjL2RlY3JlcGl0L0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9kZWNyZXBpdC9DTWFrZUxpc3RzLnR4dApAQCAtMSwxNyArMSw5IEBACi1hZGRfc3ViZGlyZWN0b3J5KGJpbykKLWFkZF9zdWJkaXJlY3RvcnkoYmxvd2Zpc2gpCiBhZGRfc3ViZGlyZWN0b3J5KGNhc3QpCi1hZGRfc3ViZGlyZWN0b3J5KGRlcykKLWFkZF9zdWJkaXJlY3RvcnkocnNhKQotYWRkX3N1YmRpcmVjdG9yeSh4dHMpCithZGRfc3ViZGlyZWN0b3J5KGJsb3dmaXNoKQogCiBhZGRfbGlicmFyeSgKICAgZGVjcmVwaXQKIAotICAkPFRBUkdFVF9PQkpFQ1RTOmJpb19kZWNyZXBpdD4KLSAgJDxUQVJHRVRfT0JKRUNUUzpibG93ZmlzaD4KICAgJDxUQVJHRVRfT0JKRUNUUzpjYXN0PgotICAkPFRBUkdFVF9PQkpFQ1RTOmRlc19kZWNyZXBpdD4KLSAgJDxUQVJHRVRfT0JKRUNUUzpyc2FfZGVjcmVwaXQ+Ci0gICQ8VEFSR0VUX09CSkVDVFM6eHRzPgorICAkPFRBUkdFVF9PQkpFQ1RTOmJsb3dmaXNoPgogKQpkaWZmIC0tZ2l0IGEvc3JjL2RlY3JlcGl0L2Jpby9DTWFrZUxpc3RzLnR4dCBiL3NyYy9kZWNyZXBpdC9iaW8vQ01ha2VMaXN0cy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZDkyMzEuLjAwMDAwMDAKLS0tIGEvc3JjL2RlY3JlcGl0L2Jpby9DTWFrZUxpc3RzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQotCi1hZGRfbGlicmFyeSgKLSAgYmlvX2RlY3JlcGl0Ci0KLSAgT0JKRUNUCi0KLSAgYmFzZTY0X2Jpby5jCi0pCmRpZmYgLS1naXQgYS9zcmMvZGVjcmVwaXQvYmlvL2Jhc2U2NF9iaW8uYyBiL3NyYy9kZWNyZXBpdC9iaW8vYmFzZTY0X2Jpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDU2MTM4Li4wMDAwMDAwCi0tLSBhL3NyYy9kZWNyZXBpdC9iaW8vYmFzZTY0X2Jpby5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KLSAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKLSAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgotICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcwotICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCi0gKgotICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KLSAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KLSAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KLSAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCi0gKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKLSAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQotICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKLSAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQotICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCi0gKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQotICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCi0gKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKLSAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKLSAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2Jhc2U2NC5oPgotI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+Ci0KLQotI2RlZmluZSBCNjRfQkxPQ0tfU0laRSAxMDI0Ci0jZGVmaW5lIEI2NF9CTE9DS19TSVpFMiA3NjgKLSNkZWZpbmUgQjY0X05PTkUgMAotI2RlZmluZSBCNjRfRU5DT0RFIDEKLSNkZWZpbmUgQjY0X0RFQ09ERSAyCi0jZGVmaW5lIEVWUF9FTkNPREVfTEVOR1RIKGwpICgoKGwrMikvMyo0KSsobC80OCsxKSoyKzgwKQotCi10eXBlZGVmIHN0cnVjdCBiNjRfc3RydWN0IHsKLSAgaW50IGJ1Zl9sZW47Ci0gIGludCBidWZfb2ZmOwotICBpbnQgdG1wX2xlbjsgLyogdXNlZCB0byBmaW5kIHRoZSBzdGFydCB3aGVuIGRlY29kaW5nICovCi0gIGludCB0bXBfbmw7ICAvKiBJZiB0cnVlLCBzY2FuIHVudGlsICdcbicgKi8KLSAgaW50IGVuY29kZTsKLSAgaW50IHN0YXJ0OyAvKiBoYXZlIHdlIHN0YXJ0ZWQgZGVjb2RpbmcgeWV0PyAqLwotICBpbnQgY29udDsgIC8qIDw9IDAgd2hlbiBmaW5pc2hlZCAqLwotICBFVlBfRU5DT0RFX0NUWCBiYXNlNjQ7Ci0gIGNoYXIgYnVmW0VWUF9FTkNPREVfTEVOR1RIKEI2NF9CTE9DS19TSVpFKSArIDEwXTsKLSAgY2hhciB0bXBbQjY0X0JMT0NLX1NJWkVdOwotfSBCSU9fQjY0X0NUWDsKLQotc3RhdGljIGludCBiNjRfbmV3KEJJTyAqYmlvKSB7Ci0gIEJJT19CNjRfQ1RYICpjdHg7Ci0KLSAgY3R4ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKCpjdHgpKTsKLSAgaWYgKGN0eCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBtZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpOwotCi0gIGN0eC0+Y29udCA9IDE7Ci0gIGN0eC0+c3RhcnQgPSAxOwotCi0gIGJpby0+aW5pdCA9IDE7Ci0gIGJpby0+cHRyID0gKGNoYXIgKiljdHg7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGI2NF9mcmVlKEJJTyAqYmlvKSB7Ci0gIGlmIChiaW8gPT0gTlVMTCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIE9QRU5TU0xfZnJlZShiaW8tPnB0cik7Ci0gIGJpby0+cHRyID0gTlVMTDsKLSAgYmlvLT5pbml0ID0gMDsKLSAgYmlvLT5mbGFncyA9IDA7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGI2NF9yZWFkKEJJTyAqYiwgY2hhciAqb3V0LCBpbnQgb3V0bCkgewotICBpbnQgcmV0ID0gMCwgaSwgaWksIGosIGssIHgsIG4sIG51bSwgcmV0X2NvZGUgPSAwOwotICBCSU9fQjY0X0NUWCAqY3R4OwotICB1aW50OF90ICpwLCAqcTsKLQotICBpZiAob3V0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBjdHggPSAoQklPX0I2NF9DVFggKikgYi0+cHRyOwotCi0gIGlmIChjdHggPT0gTlVMTCB8fCBiLT5uZXh0X2JpbyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7Ci0KLSAgaWYgKGN0eC0+ZW5jb2RlICE9IEI2NF9ERUNPREUpIHsKLSAgICBjdHgtPmVuY29kZSA9IEI2NF9ERUNPREU7Ci0gICAgY3R4LT5idWZfbGVuID0gMDsKLSAgICBjdHgtPmJ1Zl9vZmYgPSAwOwotICAgIGN0eC0+dG1wX2xlbiA9IDA7Ci0gICAgRVZQX0RlY29kZUluaXQoJmN0eC0+YmFzZTY0KTsKLSAgfQotCi0gIC8qIEZpcnN0IGNoZWNrIGlmIHRoZXJlIGFyZSBieXRlcyBkZWNvZGVkL2VuY29kZWQgKi8KLSAgaWYgKGN0eC0+YnVmX2xlbiA+IDApIHsKLSAgICBhc3NlcnQoY3R4LT5idWZfbGVuID49IGN0eC0+YnVmX29mZik7Ci0gICAgaSA9IGN0eC0+YnVmX2xlbiAtIGN0eC0+YnVmX29mZjsKLSAgICBpZiAoaSA+IG91dGwpIHsKLSAgICAgIGkgPSBvdXRsOwotICAgIH0KLSAgICBhc3NlcnQoY3R4LT5idWZfb2ZmICsgaSA8IChpbnQpc2l6ZW9mKGN0eC0+YnVmKSk7Ci0gICAgbWVtY3B5KG91dCwgJmN0eC0+YnVmW2N0eC0+YnVmX29mZl0sIGkpOwotICAgIHJldCA9IGk7Ci0gICAgb3V0ICs9IGk7Ci0gICAgb3V0bCAtPSBpOwotICAgIGN0eC0+YnVmX29mZiArPSBpOwotICAgIGlmIChjdHgtPmJ1Zl9sZW4gPT0gY3R4LT5idWZfb2ZmKSB7Ci0gICAgICBjdHgtPmJ1Zl9sZW4gPSAwOwotICAgICAgY3R4LT5idWZfb2ZmID0gMDsKLSAgICB9Ci0gIH0KLQotICAvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHJvb20gb2Ygb3V0bCBieXRlcyBhbmQgYW4gZW1wdHkgYnVmZmVyLCBzbyB3ZQotICAgKiBzaG91bGQgcmVhZCBpbiBzb21lIG1vcmUuICovCi0KLSAgcmV0X2NvZGUgPSAwOwotICB3aGlsZSAob3V0bCA+IDApIHsKLSAgICBpZiAoY3R4LT5jb250IDw9IDApIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGkgPSBCSU9fcmVhZChiLT5uZXh0X2JpbywgJihjdHgtPnRtcFtjdHgtPnRtcF9sZW5dKSwKLSAgICAgICAgICAgICAgICAgQjY0X0JMT0NLX1NJWkUgLSBjdHgtPnRtcF9sZW4pOwotCi0gICAgaWYgKGkgPD0gMCkgewotICAgICAgcmV0X2NvZGUgPSBpOwotCi0gICAgICAvKiBTaG91bGQgd2UgY29udGludWUgbmV4dCB0aW1lIHdlIGFyZSBjYWxsZWQ/ICovCi0gICAgICBpZiAoIUJJT19zaG91bGRfcmV0cnkoYi0+bmV4dF9iaW8pKSB7Ci0gICAgICAgIGN0eC0+Y29udCA9IGk7Ci0gICAgICAgIC8qIElmIGJ1ZmZlciBlbXB0eSBicmVhayAqLwotICAgICAgICBpZiAoY3R4LT50bXBfbGVuID09IDApIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvKiBGYWxsIHRocm91Z2ggYW5kIHByb2Nlc3Mgd2hhdCB3ZSBoYXZlICovCi0gICAgICAgICAgaSA9IDA7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGVsc2Ugd2UgcmV0cnkgYW5kIGFkZCBtb3JlIGRhdGEgdG8gYnVmZmVyICovCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBpICs9IGN0eC0+dG1wX2xlbjsKLSAgICBjdHgtPnRtcF9sZW4gPSBpOwotCi0gICAgLyogV2UgbmVlZCB0byBzY2FuLCBhIGxpbmUgYXQgYSB0aW1lIHVudGlsIHdlIGhhdmUgYSB2YWxpZCBsaW5lIGlmIHdlIGFyZQotICAgICAqIHN0YXJ0aW5nLiAqLwotICAgIGlmIChjdHgtPnN0YXJ0ICYmIChCSU9fdGVzdF9mbGFncyhiLCBCSU9fRkxBR1NfQkFTRTY0X05PX05MKSkpIHsKLSAgICAgIC8qIGN0eC0+c3RhcnQgPSAxOyAqLwotICAgICAgY3R4LT50bXBfbGVuID0gMDsKLSAgICB9IGVsc2UgaWYgKGN0eC0+c3RhcnQpIHsKLSAgICAgIHEgPSBwID0gKHVpbnQ4X3QgKiljdHgtPnRtcDsKLSAgICAgIG51bSA9IDA7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7Ci0gICAgICAgIGlmICgqKHErKykgIT0gJ1xuJykgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogZHVlIHRvIGEgcHJldmlvdXMgdmVyeSBsb25nIGxpbmUsIHdlIG5lZWQgdG8ga2VlcCBvbiBzY2FubmluZyBmb3IgYQotICAgICAgICAgKiAnXG4nIGJlZm9yZSB3ZSBldmVuIHN0YXJ0IGxvb2tpbmcgZm9yIGJhc2U2NCBlbmNvZGVkIHN0dWZmLiAqLwotICAgICAgICBpZiAoY3R4LT50bXBfbmwpIHsKLSAgICAgICAgICBwID0gcTsKLSAgICAgICAgICBjdHgtPnRtcF9ubCA9IDA7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBrID0gRVZQX0RlY29kZVVwZGF0ZSgmKGN0eC0+YmFzZTY0KSwgKHVpbnQ4X3QgKiljdHgtPmJ1ZiwgJm51bSwgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSAtIHApOwotCi0gICAgICAgIGlmIChrIDw9IDAgJiYgbnVtID09IDAgJiYgY3R4LT5zdGFydCkgewotICAgICAgICAgIEVWUF9EZWNvZGVJbml0KCZjdHgtPmJhc2U2NCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHAgIT0gKHVpbnQ4X3QgKikmKGN0eC0+dG1wWzBdKSkgewotICAgICAgICAgICAgaSAtPSAocCAtICh1aW50OF90ICopJihjdHgtPnRtcFswXSkpOwotICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGk7IHgrKykgewotICAgICAgICAgICAgICBjdHgtPnRtcFt4XSA9IHBbeF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIEVWUF9EZWNvZGVJbml0KCZjdHgtPmJhc2U2NCk7Ci0gICAgICAgICAgY3R4LT5zdGFydCA9IDA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcCA9IHE7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHdlIGZlbGwgb2ZmIHRoZSBlbmQgd2l0aG91dCBzdGFydGluZyAqLwotICAgICAgaWYgKGogPT0gaSAmJiBudW0gPT0gMCkgewotICAgICAgICAvKiBJcyB0aGlzIGlzIG9uZSBsb25nIGNodW5rPywgaWYgc28sIGtlZXAgb24gcmVhZGluZyB1bnRpbCBhIG5ldwotICAgICAgICAgKiBsaW5lLiAqLwotICAgICAgICBpZiAocCA9PSAodWludDhfdCAqKSYoY3R4LT50bXBbMF0pKSB7Ci0gICAgICAgICAgLyogQ2hlY2sgYnVmZmVyIGZ1bGwgKi8KLSAgICAgICAgICBpZiAoaSA9PSBCNjRfQkxPQ0tfU0laRSkgewotICAgICAgICAgICAgY3R4LT50bXBfbmwgPSAxOwotICAgICAgICAgICAgY3R4LT50bXBfbGVuID0gMDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocCAhPSBxKSB7IC8qIGZpbmlzaGVkIG9uIGEgJ1xuJyAqLwotICAgICAgICAgIG4gPSBxIC0gcDsKLSAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBuOyBpaSsrKSB7Ci0gICAgICAgICAgICBjdHgtPnRtcFtpaV0gPSBwW2lpXTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY3R4LT50bXBfbGVuID0gbjsKLSAgICAgICAgfQotICAgICAgICAvKiBlbHNlIGZpbmlzaGVkIG9uIGEgJ1xuJyAqLwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGN0eC0+dG1wX2xlbiA9IDA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChpIDwgQjY0X0JMT0NLX1NJWkUgJiYgY3R4LT5jb250ID4gMCkgewotICAgICAgLyogSWYgYnVmZmVyIGlzbid0IGZ1bGwgYW5kIHdlIGNhbiByZXRyeSB0aGVuIHJlc3RhcnQgdG8gcmVhZCBpbiBtb3JlCi0gICAgICAgKiBkYXRhLiAqLwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgaWYgKEJJT190ZXN0X2ZsYWdzKGIsIEJJT19GTEFHU19CQVNFNjRfTk9fTkwpKSB7Ci0gICAgICBpbnQgeiwgamo7Ci0KLSAgICAgIGpqID0gaSAmIH4zOyAvKiBwcm9jZXNzIHBlciA0ICovCi0gICAgICB6ID0gRVZQX0RlY29kZUJsb2NrKCh1aW50OF90ICopY3R4LT5idWYsICh1aW50OF90ICopY3R4LT50bXAsIGpqKTsKLSAgICAgIGlmIChqaiA+IDIpIHsKLSAgICAgICAgaWYgKGN0eC0+dG1wW2pqIC0gMV0gPT0gJz0nKSB7Ci0gICAgICAgICAgei0tOwotICAgICAgICAgIGlmIChjdHgtPnRtcFtqaiAtIDJdID09ICc9JykgewotICAgICAgICAgICAgei0tOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLyogeiBpcyBub3cgbnVtYmVyIG9mIG91dHB1dCBieXRlcyBhbmQgamogaXMgdGhlIG51bWJlciBjb25zdW1lZC4gKi8KLSAgICAgIGlmIChqaiAhPSBpKSB7Ci0gICAgICAgIG1lbW1vdmUoY3R4LT50bXAsICZjdHgtPnRtcFtqal0sIGkgLSBqaik7Ci0gICAgICAgIGN0eC0+dG1wX2xlbiA9IGkgLSBqajsKLSAgICAgIH0KLSAgICAgIGN0eC0+YnVmX2xlbiA9IDA7Ci0gICAgICBpZiAoeiA+IDApIHsKLSAgICAgICAgY3R4LT5idWZfbGVuID0gejsKLSAgICAgIH0KLSAgICAgIGkgPSB6OwotICAgIH0gZWxzZSB7Ci0gICAgICBpID0gRVZQX0RlY29kZVVwZGF0ZSgmKGN0eC0+YmFzZTY0KSwgKHVpbnQ4X3QgKiljdHgtPmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPmJ1Zl9sZW4sICh1aW50OF90ICopY3R4LT50bXAsIGkpOwotICAgICAgY3R4LT50bXBfbGVuID0gMDsKLSAgICB9Ci0gICAgY3R4LT5idWZfb2ZmID0gMDsKLSAgICBpZiAoaSA8IDApIHsKLSAgICAgIHJldF9jb2RlID0gMDsKLSAgICAgIGN0eC0+YnVmX2xlbiA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoY3R4LT5idWZfbGVuIDw9IG91dGwpIHsKLSAgICAgIGkgPSBjdHgtPmJ1Zl9sZW47Ci0gICAgfSBlbHNlIHsKLSAgICAgIGkgPSBvdXRsOwotICAgIH0KLQotICAgIG1lbWNweShvdXQsIGN0eC0+YnVmLCBpKTsKLSAgICByZXQgKz0gaTsKLSAgICBjdHgtPmJ1Zl9vZmYgPSBpOwotICAgIGlmIChjdHgtPmJ1Zl9vZmYgPT0gY3R4LT5idWZfbGVuKSB7Ci0gICAgICBjdHgtPmJ1Zl9sZW4gPSAwOwotICAgICAgY3R4LT5idWZfb2ZmID0gMDsKLSAgICB9Ci0gICAgb3V0bCAtPSBpOwotICAgIG91dCArPSBpOwotICB9Ci0KLSAgQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKLSAgcmV0dXJuIHJldCA9PSAwID8gcmV0X2NvZGUgOiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYjY0X3dyaXRlKEJJTyAqYiwgY29uc3QgY2hhciAqaW4sIGludCBpbmwpIHsKLSAgaW50IHJldCA9IDAsIG4sIGk7Ci0gIEJJT19CNjRfQ1RYICpjdHg7Ci0KLSAgY3R4ID0gKEJJT19CNjRfQ1RYICopYi0+cHRyOwotICBCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7Ci0KLSAgaWYgKGN0eC0+ZW5jb2RlICE9IEI2NF9FTkNPREUpIHsKLSAgICBjdHgtPmVuY29kZSA9IEI2NF9FTkNPREU7Ci0gICAgY3R4LT5idWZfbGVuID0gMDsKLSAgICBjdHgtPmJ1Zl9vZmYgPSAwOwotICAgIGN0eC0+dG1wX2xlbiA9IDA7Ci0gICAgRVZQX0VuY29kZUluaXQoJihjdHgtPmJhc2U2NCkpOwotICB9Ci0KLSAgYXNzZXJ0KGN0eC0+YnVmX29mZiA8IChpbnQpc2l6ZW9mKGN0eC0+YnVmKSk7Ci0gIGFzc2VydChjdHgtPmJ1Zl9sZW4gPD0gKGludClzaXplb2YoY3R4LT5idWYpKTsKLSAgYXNzZXJ0KGN0eC0+YnVmX2xlbiA+PSBjdHgtPmJ1Zl9vZmYpOwotCi0gIG4gPSBjdHgtPmJ1Zl9sZW4gLSBjdHgtPmJ1Zl9vZmY7Ci0gIHdoaWxlIChuID4gMCkgewotICAgIGkgPSBCSU9fd3JpdGUoYi0+bmV4dF9iaW8sICYoY3R4LT5idWZbY3R4LT5idWZfb2ZmXSksIG4pOwotICAgIGlmIChpIDw9IDApIHsKLSAgICAgIEJJT19jb3B5X25leHRfcmV0cnkoYik7Ci0gICAgICByZXR1cm4gaTsKLSAgICB9Ci0gICAgYXNzZXJ0KGkgPD0gbik7Ci0gICAgY3R4LT5idWZfb2ZmICs9IGk7Ci0gICAgYXNzZXJ0KGN0eC0+YnVmX29mZiA8PSAoaW50KXNpemVvZihjdHgtPmJ1ZikpOwotICAgIGFzc2VydChjdHgtPmJ1Zl9sZW4gPj0gY3R4LT5idWZfb2ZmKTsKLSAgICBuIC09IGk7Ci0gIH0KLQotICAvKiBhdCB0aGlzIHBvaW50IGFsbCBwZW5kaW5nIGRhdGEgaGFzIGJlZW4gd3JpdHRlbi4gKi8KLSAgY3R4LT5idWZfb2ZmID0gMDsKLSAgY3R4LT5idWZfbGVuID0gMDsKLQotICBpZiAoaW4gPT0gTlVMTCB8fCBpbmwgPD0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgd2hpbGUgKGlubCA+IDApIHsKLSAgICBuID0gKGlubCA+IEI2NF9CTE9DS19TSVpFKSA/IEI2NF9CTE9DS19TSVpFIDogaW5sOwotCi0gICAgaWYgKEJJT190ZXN0X2ZsYWdzKGIsIEJJT19GTEFHU19CQVNFNjRfTk9fTkwpKSB7Ci0gICAgICBpZiAoY3R4LT50bXBfbGVuID4gMCkgewotICAgICAgICBhc3NlcnQoY3R4LT50bXBfbGVuIDw9IDMpOwotICAgICAgICBuID0gMyAtIGN0eC0+dG1wX2xlbjsKLSAgICAgICAgLyogVGhlcmUncyBhIHRoZW9yZXRpY2FsIHBvc3NpYmlsaXR5IG9mIHRoaXMuICovCi0gICAgICAgIGlmIChuID4gaW5sKSB7Ci0gICAgICAgICAgbiA9IGlubDsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoJihjdHgtPnRtcFtjdHgtPnRtcF9sZW5dKSwgaW4sIG4pOwotICAgICAgICBjdHgtPnRtcF9sZW4gKz0gbjsKLSAgICAgICAgcmV0ICs9IG47Ci0gICAgICAgIGlmIChjdHgtPnRtcF9sZW4gPCAzKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY3R4LT5idWZfbGVuID0gRVZQX0VuY29kZUJsb2NrKCh1aW50OF90ICopY3R4LT5idWYsICh1aW50OF90ICopY3R4LT50bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnRtcF9sZW4pOwotICAgICAgICBhc3NlcnQoY3R4LT5idWZfbGVuIDw9IChpbnQpc2l6ZW9mKGN0eC0+YnVmKSk7Ci0gICAgICAgIGFzc2VydChjdHgtPmJ1Zl9sZW4gPj0gY3R4LT5idWZfb2ZmKTsKLQotICAgICAgICAvKiBTaW5jZSB3ZSdyZSBub3cgZG9uZSB1c2luZyB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciwgdGhlIGxlbmd0aCBzaG91bGQKLSAgICAgICAgICogYmUgemVyb2VkLiAqLwotICAgICAgICBjdHgtPnRtcF9sZW4gPSAwOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG4gPCAzKSB7Ci0gICAgICAgICAgbWVtY3B5KGN0eC0+dG1wLCBpbiwgbik7Ci0gICAgICAgICAgY3R4LT50bXBfbGVuID0gbjsKLSAgICAgICAgICByZXQgKz0gbjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBuIC09IG4gJSAzOwotICAgICAgICBjdHgtPmJ1Zl9sZW4gPQotICAgICAgICAgICAgRVZQX0VuY29kZUJsb2NrKCh1aW50OF90ICopY3R4LT5idWYsIChjb25zdCB1aW50OF90ICopaW4sIG4pOwotICAgICAgICBhc3NlcnQoY3R4LT5idWZfbGVuIDw9IChpbnQpc2l6ZW9mKGN0eC0+YnVmKSk7Ci0gICAgICAgIGFzc2VydChjdHgtPmJ1Zl9sZW4gPj0gY3R4LT5idWZfb2ZmKTsKLSAgICAgICAgcmV0ICs9IG47Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIEVWUF9FbmNvZGVVcGRhdGUoJihjdHgtPmJhc2U2NCksICh1aW50OF90ICopY3R4LT5idWYsICZjdHgtPmJ1Zl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopaW4sIG4pOwotICAgICAgYXNzZXJ0KGN0eC0+YnVmX2xlbiA8PSAoaW50KXNpemVvZihjdHgtPmJ1ZikpOwotICAgICAgYXNzZXJ0KGN0eC0+YnVmX2xlbiA+PSBjdHgtPmJ1Zl9vZmYpOwotICAgICAgcmV0ICs9IG47Ci0gICAgfQotICAgIGlubCAtPSBuOwotICAgIGluICs9IG47Ci0KLSAgICBjdHgtPmJ1Zl9vZmYgPSAwOwotICAgIG4gPSBjdHgtPmJ1Zl9sZW47Ci0KLSAgICB3aGlsZSAobiA+IDApIHsKLSAgICAgIGkgPSBCSU9fd3JpdGUoYi0+bmV4dF9iaW8sICYoY3R4LT5idWZbY3R4LT5idWZfb2ZmXSksIG4pOwotICAgICAgaWYgKGkgPD0gMCkgewotICAgICAgICBCSU9fY29weV9uZXh0X3JldHJ5KGIpOwotICAgICAgICByZXR1cm4gcmV0ID09IDAgPyBpIDogcmV0OwotICAgICAgfQotICAgICAgYXNzZXJ0KGkgPD0gbik7Ci0gICAgICBuIC09IGk7Ci0gICAgICBjdHgtPmJ1Zl9vZmYgKz0gaTsKLSAgICAgIGFzc2VydChjdHgtPmJ1Zl9vZmYgPD0gKGludClzaXplb2YoY3R4LT5idWYpKTsKLSAgICAgIGFzc2VydChjdHgtPmJ1Zl9sZW4gPj0gY3R4LT5idWZfb2ZmKTsKLSAgICB9Ci0gICAgY3R4LT5idWZfbGVuID0gMDsKLSAgICBjdHgtPmJ1Zl9vZmYgPSAwOwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBsb25nIGI2NF9jdHJsKEJJTyAqYiwgaW50IGNtZCwgbG9uZyBudW0sIHZvaWQgKnB0cikgewotICBCSU9fQjY0X0NUWCAqY3R4OwotICBsb25nIHJldCA9IDE7Ci0gIGludCBpOwotCi0gIGN0eCA9IChCSU9fQjY0X0NUWCAqKWItPnB0cjsKLQotICBzd2l0Y2ggKGNtZCkgewotICAgIGNhc2UgQklPX0NUUkxfUkVTRVQ6Ci0gICAgICBjdHgtPmNvbnQgPSAxOwotICAgICAgY3R4LT5zdGFydCA9IDE7Ci0gICAgICBjdHgtPmVuY29kZSA9IEI2NF9OT05FOwotICAgICAgcmV0ID0gQklPX2N0cmwoYi0+bmV4dF9iaW8sIGNtZCwgbnVtLCBwdHIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJJT19DVFJMX0VPRjogLyogTW9yZSB0byByZWFkICovCi0gICAgICBpZiAoY3R4LT5jb250IDw9IDApIHsKLSAgICAgICAgcmV0ID0gMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IEJJT19jdHJsKGItPm5leHRfYmlvLCBjbWQsIG51bSwgcHRyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCSU9fQ1RSTF9XUEVORElORzogLyogTW9yZSB0byB3cml0ZSBpbiBidWZmZXIgKi8KLSAgICAgIGFzc2VydChjdHgtPmJ1Zl9sZW4gPj0gY3R4LT5idWZfb2ZmKTsKLSAgICAgIHJldCA9IGN0eC0+YnVmX2xlbiAtIGN0eC0+YnVmX29mZjsKLSAgICAgIGlmICgocmV0ID09IDApICYmIChjdHgtPmVuY29kZSAhPSBCNjRfTk9ORSkgJiYgKGN0eC0+YmFzZTY0Lm51bSAhPSAwKSkgewotICAgICAgICByZXQgPSAxOwotICAgICAgfSBlbHNlIGlmIChyZXQgPD0gMCkgewotICAgICAgICByZXQgPSBCSU9fY3RybChiLT5uZXh0X2JpbywgY21kLCBudW0sIHB0cik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQklPX0NUUkxfUEVORElORzogLyogTW9yZSB0byByZWFkIGluIGJ1ZmZlciAqLwotICAgICAgYXNzZXJ0KGN0eC0+YnVmX2xlbiA+PSBjdHgtPmJ1Zl9vZmYpOwotICAgICAgcmV0ID0gY3R4LT5idWZfbGVuIC0gY3R4LT5idWZfb2ZmOwotICAgICAgaWYgKHJldCA8PSAwKSB7Ci0gICAgICAgIHJldCA9IEJJT19jdHJsKGItPm5leHRfYmlvLCBjbWQsIG51bSwgcHRyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCSU9fQ1RSTF9GTFVTSDoKLSAgICAvKiBkbyBhIGZpbmFsIHdyaXRlICovCi0gICAgYWdhaW46Ci0gICAgICB3aGlsZSAoY3R4LT5idWZfbGVuICE9IGN0eC0+YnVmX29mZikgewotICAgICAgICBpID0gYjY0X3dyaXRlKGIsIE5VTEwsIDApOwotICAgICAgICBpZiAoaSA8IDApIHsKLSAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKEJJT190ZXN0X2ZsYWdzKGIsIEJJT19GTEFHU19CQVNFNjRfTk9fTkwpKSB7Ci0gICAgICAgIGlmIChjdHgtPnRtcF9sZW4gIT0gMCkgewotICAgICAgICAgIGN0eC0+YnVmX2xlbiA9IEVWUF9FbmNvZGVCbG9jaygodWludDhfdCAqKWN0eC0+YnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKWN0eC0+dG1wLCBjdHgtPnRtcF9sZW4pOwotICAgICAgICAgIGN0eC0+YnVmX29mZiA9IDA7Ci0gICAgICAgICAgY3R4LT50bXBfbGVuID0gMDsKLSAgICAgICAgICBnb3RvIGFnYWluOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGN0eC0+ZW5jb2RlICE9IEI2NF9OT05FICYmIGN0eC0+YmFzZTY0Lm51bSAhPSAwKSB7Ci0gICAgICAgIGN0eC0+YnVmX29mZiA9IDA7Ci0gICAgICAgIEVWUF9FbmNvZGVGaW5hbCgmKGN0eC0+YmFzZTY0KSwgKHVpbnQ4X3QgKiljdHgtPmJ1ZiwgJihjdHgtPmJ1Zl9sZW4pKTsKLSAgICAgICAgLyogcHVzaCBvdXQgdGhlIGJ5dGVzICovCi0gICAgICAgIGdvdG8gYWdhaW47Ci0gICAgICB9Ci0gICAgICAvKiBGaW5hbGx5IGZsdXNoIHRoZSB1bmRlcmx5aW5nIEJJTyAqLwotICAgICAgcmV0ID0gQklPX2N0cmwoYi0+bmV4dF9iaW8sIGNtZCwgbnVtLCBwdHIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJJT19DX0RPX1NUQVRFX01BQ0hJTkU6Ci0gICAgICBCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7Ci0gICAgICByZXQgPSBCSU9fY3RybChiLT5uZXh0X2JpbywgY21kLCBudW0sIHB0cik7Ci0gICAgICBCSU9fY29weV9uZXh0X3JldHJ5KGIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJJT19DVFJMX0lORk86Ci0gICAgY2FzZSBCSU9fQ1RSTF9HRVQ6Ci0gICAgY2FzZSBCSU9fQ1RSTF9TRVQ6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldCA9IEJJT19jdHJsKGItPm5leHRfYmlvLCBjbWQsIG51bSwgcHRyKTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBsb25nIGI2NF9jYWxsYmFja19jdHJsKEJJTyAqYiwgaW50IGNtZCwgYmlvX2luZm9fY2IgZnApIHsKLSAgbG9uZyByZXQgPSAxOwotCi0gIGlmIChiLT5uZXh0X2JpbyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgc3dpdGNoIChjbWQpIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0ID0gQklPX2NhbGxiYWNrX2N0cmwoYi0+bmV4dF9iaW8sIGNtZCwgZnApOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBiNjRfcHV0cyhCSU8gKmIsIGNvbnN0IGNoYXIgKnN0cikgewotICByZXR1cm4gYjY0X3dyaXRlKGIsIHN0ciwgc3RybGVuKHN0cikpOwotfQotCi1zdGF0aWMgY29uc3QgQklPX01FVEhPRCBiNjRfbWV0aG9kID0gewotICAgIEJJT19UWVBFX0JBU0U2NCwgImJhc2U2NCBlbmNvZGluZyIsIGI2NF93cml0ZSwgYjY0X3JlYWQsIGI2NF9wdXRzLAotICAgIE5VTEwgLyogZ2V0cyAqLywgYjY0X2N0cmwsICAgICAgICAgIGI2NF9uZXcsICAgYjY0X2ZyZWUsIGI2NF9jYWxsYmFja19jdHJsLAotfTsKLQotY29uc3QgQklPX01FVEhPRCAqQklPX2ZfYmFzZTY0KHZvaWQpIHsgcmV0dXJuICZiNjRfbWV0aG9kOyB9CmRpZmYgLS1naXQgYS9zcmMvZGVjcmVwaXQvYmxvd2Zpc2gvQ01ha2VMaXN0cy50eHQgYi9zcmMvZGVjcmVwaXQvYmxvd2Zpc2gvQ01ha2VMaXN0cy50eHQKaW5kZXggMjk3MjljNC4uYWZhZjY0MSAxMDA2NDQKLS0tIGEvc3JjL2RlY3JlcGl0L2Jsb3dmaXNoL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9kZWNyZXBpdC9ibG93ZmlzaC9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgYmxvd2Zpc2gKZGlmZiAtLWdpdCBhL3NyYy9kZWNyZXBpdC9jYXN0L0NNYWtlTGlzdHMudHh0IGIvc3JjL2RlY3JlcGl0L2Nhc3QvQ01ha2VMaXN0cy50eHQKaW5kZXggMjgzMDM4MS4uYWRhOTllNCAxMDA2NDQKLS0tIGEvc3JjL2RlY3JlcGl0L2Nhc3QvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2RlY3JlcGl0L2Nhc3QvQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4vLi4vaW5jbHVkZSkKIAogYWRkX2xpYnJhcnkoCiAgIGNhc3QKZGlmZiAtLWdpdCBhL3NyYy9kZWNyZXBpdC9kZXMvQ01ha2VMaXN0cy50eHQgYi9zcmMvZGVjcmVwaXQvZGVzL0NNYWtlTGlzdHMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWU1YzJlLi4wMDAwMDAwCi0tLSBhL3NyYy9kZWNyZXBpdC9kZXMvQ01ha2VMaXN0cy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKLQotYWRkX2xpYnJhcnkoCi0gIGRlc19kZWNyZXBpdAotCi0gIE9CSkVDVAotCi0gIGNmYjY0ZWRlLmMKLSkKZGlmZiAtLWdpdCBhL3NyYy9kZWNyZXBpdC9kZXMvY2ZiNjRlZGUuYyBiL3NyYy9kZWNyZXBpdC9kZXMvY2ZiNjRlZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwYTc1YS4uMDAwMDAwMAotLS0gYS9zcmMvZGVjcmVwaXQvZGVzL2NmYjY0ZWRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgotICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgotICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcwotICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAotICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCi0gKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCi0gKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KLSAqCi0gKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgotICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgotICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgotICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KLSAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgotICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5Ci0gKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgotICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5Ci0gKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KLSAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCi0gKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKLSAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQotICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQotICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvZGVzLmg+Ci0KLSNpbmNsdWRlICIuLi9jcnlwdG8vZGVzL2ludGVybmFsLmgiCi0KLQotLyogZGVmaW5lZCBpbiBkZXMuYyAqLwotdm9pZCBERVNfZGVjcnlwdDModWludDMyX3QgKmRhdGEsIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKmtzMSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKmtzMiwgY29uc3QgREVTX2tleV9zY2hlZHVsZSAqa3MzKTsKLXZvaWQgREVTX2VuY3J5cHQzKHVpbnQzMl90ICpkYXRhLCBjb25zdCBERVNfa2V5X3NjaGVkdWxlICprczEsCi0gICAgICAgICAgICAgICAgICBjb25zdCBERVNfa2V5X3NjaGVkdWxlICprczIsIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKmtzMyk7Ci0KLS8qIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGVuY3J5cHRlZCBhcyB0aG91Z2ggNjRiaXQgY2ZiIG1vZGUgaXMgYmVpbmcgdXNlZC4gVGhlCi0gKiBleHRyYSBzdGF0ZSBpbmZvcm1hdGlvbiB0byByZWNvcmQgaG93IG11Y2ggb2YgdGhlIDY0Yml0IGJsb2NrIHdlIGhhdmUgdXNlZAotICogaXMgY29udGFpbmVkIGluICpudW07ICovCi12b2lkIERFU19lZGUzX2NmYjY0X2VuY3J5cHQoY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxlbmd0aCwgREVTX2tleV9zY2hlZHVsZSAqa3MxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU19rZXlfc2NoZWR1bGUgKmtzMiwgREVTX2tleV9zY2hlZHVsZSAqa3MzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU19jYmxvY2sgKml2ZWMsIGludCAqbnVtLCBpbnQgZW5jKSB7Ci0gIHVpbnQzMl90IHYwLCB2MTsKLSAgbG9uZyBsID0gbGVuZ3RoOwotICBpbnQgbiA9ICpudW07Ci0gIHVpbnQzMl90IHRpWzJdOwotICB1aW50OF90ICppdiwgYywgY2M7Ci0KLSAgaXYgPSBpdmVjLT5ieXRlczsKLSAgaWYgKGVuYykgewotICAgIHdoaWxlIChsLS0pIHsKLSAgICAgIGlmIChuID09IDApIHsKLSAgICAgICAgYzJsKGl2LCB2MCk7Ci0gICAgICAgIGMybChpdiwgdjEpOwotCi0gICAgICAgIHRpWzBdID0gdjA7Ci0gICAgICAgIHRpWzFdID0gdjE7Ci0gICAgICAgIERFU19lbmNyeXB0Myh0aSwga3MxLCBrczIsIGtzMyk7Ci0gICAgICAgIHYwID0gdGlbMF07Ci0gICAgICAgIHYxID0gdGlbMV07Ci0KLSAgICAgICAgaXYgPSBpdmVjLT5ieXRlczsKLSAgICAgICAgbDJjKHYwLCBpdik7Ci0gICAgICAgIGwyYyh2MSwgaXYpOwotICAgICAgICBpdiA9IGl2ZWMtPmJ5dGVzOwotICAgICAgfQotICAgICAgYyA9ICooaW4rKykgXiBpdltuXTsKLSAgICAgICoob3V0KyspID0gYzsKLSAgICAgIGl2W25dID0gYzsKLSAgICAgIG4gPSAobiArIDEpICYgMHgwNzsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgd2hpbGUgKGwtLSkgewotICAgICAgaWYgKG4gPT0gMCkgewotICAgICAgICBjMmwoaXYsIHYwKTsKLSAgICAgICAgYzJsKGl2LCB2MSk7Ci0KLSAgICAgICAgdGlbMF0gPSB2MDsKLSAgICAgICAgdGlbMV0gPSB2MTsKLSAgICAgICAgREVTX2VuY3J5cHQzKHRpLCBrczEsIGtzMiwga3MzKTsKLSAgICAgICAgdjAgPSB0aVswXTsKLSAgICAgICAgdjEgPSB0aVsxXTsKLQotICAgICAgICBpdiA9IGl2ZWMtPmJ5dGVzOwotICAgICAgICBsMmModjAsIGl2KTsKLSAgICAgICAgbDJjKHYxLCBpdik7Ci0gICAgICAgIGl2ID0gaXZlYy0+Ynl0ZXM7Ci0gICAgICB9Ci0gICAgICBjYyA9ICooaW4rKyk7Ci0gICAgICBjID0gaXZbbl07Ci0gICAgICBpdltuXSA9IGNjOwotICAgICAgKihvdXQrKykgPSBjIF4gY2M7Ci0gICAgICBuID0gKG4gKyAxKSAmIDB4MDc7Ci0gICAgfQotICB9Ci0gIHYwID0gdjEgPSB0aVswXSA9IHRpWzFdID0gYyA9IGNjID0gMDsKLSAgKm51bSA9IG47Ci19Ci0KLS8qIFRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBzaW5nbGUga2V5IENGQi1yIGZvciBERVMsIGV2ZW4gdGhvdWdodCB0aGF0J3MKLSAqIG5vdCB3aGF0IEVWUCBuZWVkcy4gKi8KLQotdm9pZCBERVNfZWRlM19jZmJfZW5jcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBpbnQgbnVtYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsZW5ndGgsIERFU19rZXlfc2NoZWR1bGUgKmtzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgREVTX2tleV9zY2hlZHVsZSAqa3MyLCBERVNfa2V5X3NjaGVkdWxlICprczMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIERFU19jYmxvY2sgKml2ZWMsIGludCBlbmMpIHsKLSAgdWludDMyX3QgZDAsIGQxLCB2MCwgdjE7Ci0gIHVuc2lnbmVkIGxvbmcgbCA9IGxlbmd0aCwgbiA9ICgodW5zaWduZWQgaW50KW51bWJpdHMgKyA3KSAvIDg7Ci0gIGludCBudW0gPSBudW1iaXRzLCBpOwotICB1aW50MzJfdCB0aVsyXTsKLSAgdWludDhfdCAqaXY7Ci0gIHVpbnQ4X3Qgb3ZlY1sxNl07Ci0KLSAgaWYgKG51bSA+IDY0KSB7Ci0gICAgcmV0dXJuOwotICB9OwotCi0gIGl2ID0gaXZlYy0+Ynl0ZXM7Ci0gIGMybChpdiwgdjApOwotICBjMmwoaXYsIHYxKTsKLQotICBpZiAoZW5jKSB7Ci0gICAgd2hpbGUgKGwgPj0gbikgewotICAgICAgbCAtPSBuOwotICAgICAgdGlbMF0gPSB2MDsKLSAgICAgIHRpWzFdID0gdjE7Ci0gICAgICBERVNfZW5jcnlwdDModGksIGtzMSwga3MyLCBrczMpOwotICAgICAgYzJsbihpbiwgZDAsIGQxLCBuKTsKLSAgICAgIGluICs9IG47Ci0gICAgICBkMCBePSB0aVswXTsKLSAgICAgIGQxIF49IHRpWzFdOwotICAgICAgbDJjbihkMCwgZDEsIG91dCwgbik7Ci0gICAgICBvdXQgKz0gbjsKLSAgICAgIC8qIDMwLTA4LTk0IC0gZWF5IC0gY2hhbmdlZCBiZWNhdXNlIGw+PjMyIGFuZCBsPDwzMiBhcmUgYmFkIHVuZGVyCi0gICAgICAgKiBnY2MgOi0oICovCi0gICAgICBpZiAobnVtID09IDMyKSB7Ci0gICAgICAgIHYwID0gdjE7Ci0gICAgICAgIHYxID0gZDA7Ci0gICAgICB9IGVsc2UgaWYgKG51bSA9PSA2NCkgewotICAgICAgICB2MCA9IGQwOwotICAgICAgICB2MSA9IGQxOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaXYgPSAmb3ZlY1swXTsKLSAgICAgICAgbDJjKHYwLCBpdik7Ci0gICAgICAgIGwyYyh2MSwgaXYpOwotICAgICAgICBsMmMoZDAsIGl2KTsKLSAgICAgICAgbDJjKGQxLCBpdik7Ci0gICAgICAgIC8qIHNoaWZ0IG92ZWMgbGVmdCBtb3N0IG9mIHRoZSBiaXRzLi4uICovCi0gICAgICAgIG1lbW1vdmUob3ZlYywgb3ZlYyArIG51bSAvIDgsIDggKyAobnVtICUgOCA/IDEgOiAwKSk7Ci0gICAgICAgIC8qIG5vdyB0aGUgcmVtYWluaW5nIGJpdHMgKi8KLSAgICAgICAgaWYgKG51bSAlIDggIT0gMCkgewotICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKLSAgICAgICAgICAgIG92ZWNbaV0gPDw9IG51bSAlIDg7Ci0gICAgICAgICAgICBvdmVjW2ldIHw9IG92ZWNbaSArIDFdID4+ICg4IC0gbnVtICUgOCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGl2ID0gJm92ZWNbMF07Ci0gICAgICAgIGMybChpdiwgdjApOwotICAgICAgICBjMmwoaXYsIHYxKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgd2hpbGUgKGwgPj0gbikgewotICAgICAgbCAtPSBuOwotICAgICAgdGlbMF0gPSB2MDsKLSAgICAgIHRpWzFdID0gdjE7Ci0gICAgICBERVNfZW5jcnlwdDModGksIGtzMSwga3MyLCBrczMpOwotICAgICAgYzJsbihpbiwgZDAsIGQxLCBuKTsKLSAgICAgIGluICs9IG47Ci0gICAgICAvKiAzMC0wOC05NCAtIGVheSAtIGNoYW5nZWQgYmVjYXVzZSBsPj4zMiBhbmQgbDw8MzIgYXJlIGJhZCB1bmRlcgotICAgICAgICogZ2NjIDotKCAqLwotICAgICAgaWYgKG51bSA9PSAzMikgewotICAgICAgICB2MCA9IHYxOwotICAgICAgICB2MSA9IGQwOwotICAgICAgfSBlbHNlIGlmIChudW0gPT0gNjQpIHsKLSAgICAgICAgdjAgPSBkMDsKLSAgICAgICAgdjEgPSBkMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGl2ID0gJm92ZWNbMF07Ci0gICAgICAgIGwyYyh2MCwgaXYpOwotICAgICAgICBsMmModjEsIGl2KTsKLSAgICAgICAgbDJjKGQwLCBpdik7Ci0gICAgICAgIGwyYyhkMSwgaXYpOwotICAgICAgICAvKiBzaGlmdCBvdmVjIGxlZnQgbW9zdCBvZiB0aGUgYml0cy4uLiAqLwotICAgICAgICBtZW1tb3ZlKG92ZWMsIG92ZWMgKyBudW0gLyA4LCA4ICsgKG51bSAlIDggPyAxIDogMCkpOwotICAgICAgICAvKiBub3cgdGhlIHJlbWFpbmluZyBiaXRzICovCi0gICAgICAgIGlmIChudW0gJSA4ICE9IDApIHsKLSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7Ci0gICAgICAgICAgICBvdmVjW2ldIDw8PSBudW0gJSA4OwotICAgICAgICAgICAgb3ZlY1tpXSB8PSBvdmVjW2kgKyAxXSA+PiAoOCAtIG51bSAlIDgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpdiA9ICZvdmVjWzBdOwotICAgICAgICBjMmwoaXYsIHYwKTsKLSAgICAgICAgYzJsKGl2LCB2MSk7Ci0gICAgICB9Ci0gICAgICBkMCBePSB0aVswXTsKLSAgICAgIGQxIF49IHRpWzFdOwotICAgICAgbDJjbihkMCwgZDEsIG91dCwgbik7Ci0gICAgICBvdXQgKz0gbjsKLSAgICB9Ci0gIH0KLQotICBpdiA9IGl2ZWMtPmJ5dGVzOwotICBsMmModjAsIGl2KTsKLSAgbDJjKHYxLCBpdik7Ci0gIHYwID0gdjEgPSBkMCA9IGQxID0gdGlbMF0gPSB0aVsxXSA9IDA7Ci19CmRpZmYgLS1naXQgYS9zcmMvZGVjcmVwaXQvcnNhL0NNYWtlTGlzdHMudHh0IGIvc3JjL2RlY3JlcGl0L3JzYS9DTWFrZUxpc3RzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkODM2Yi4uMDAwMDAwMAotLS0gYS9zcmMvZGVjcmVwaXQvcnNhL0NNYWtlTGlzdHMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCi0KLWFkZF9saWJyYXJ5KAotICByc2FfZGVjcmVwaXQKLQotICBPQkpFQ1QKLQotICByc2FfZGVjcmVwaXQuYwotKQpkaWZmIC0tZ2l0IGEvc3JjL2RlY3JlcGl0L3h0cy9DTWFrZUxpc3RzLnR4dCBiL3NyYy9kZWNyZXBpdC94dHMvQ01ha2VMaXN0cy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkY2NkZTAuLjAwMDAwMDAKLS0tIGEvc3JjL2RlY3JlcGl0L3h0cy9DTWFrZUxpc3RzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQotCi1hZGRfbGlicmFyeSgKLSAgeHRzCi0KLSAgT0JKRUNUCi0KLSAgeHRzLmMKLSkKZGlmZiAtLWdpdCBhL3NyYy9kZWNyZXBpdC94dHMveHRzLmMgYi9zcmMvZGVjcmVwaXQveHRzL3h0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjhhZDM5Li4wMDAwMDAwCi0tLSBhL3NyYy9kZWNyZXBpdC94dHMveHRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMjAxMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAotICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKLSAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKLSAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2NpcGhlci5oPgotI2luY2x1ZGUgPG9wZW5zc2wvbW9kZXMuaD4KLQotCi0jaWYgZGVmaW5lZChPUEVOU1NMX1g4Nl82NCkgfHwgZGVmaW5lZChPUEVOU1NMX1g4NikgfHwgZGVmaW5lZChPUEVOU1NMX0FBUkNINjQpCi0jZGVmaW5lIFNUUklDVF9BTElHTk1FTlQgMAotI2Vsc2UKLSNkZWZpbmUgU1RSSUNUX0FMSUdOTUVOVCAxCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgeHRzMTI4X2NvbnRleHQgewotICB2b2lkICprZXkxLCAqa2V5MjsKLSAgYmxvY2sxMjhfZiBibG9jazEsIGJsb2NrMjsKLX0gWFRTMTI4X0NPTlRFWFQ7Ci0KLXN0YXRpYyBzaXplX3QgQ1JZUFRPX3h0czEyOF9lbmNyeXB0KGNvbnN0IFhUUzEyOF9DT05URVhUICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IGl2WzE2XSwgY29uc3QgdWludDhfdCAqaW5wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuLCBpbnQgZW5jKSB7Ci0gIGNvbnN0IHVuaW9uIHsKLSAgICBsb25nIG9uZTsKLSAgICBjaGFyIGxpdHRsZTsKLSAgfSBpc19lbmRpYW4gPSB7MX07Ci0gIHVuaW9uIHsKLSAgICB1aW50NjRfdCB1WzJdOwotICAgIHVpbnQzMl90IGRbNF07Ci0gICAgdWludDhfdCBjWzE2XTsKLSAgfSB0d2Vhaywgc2NyYXRjaDsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaWYgKGxlbiA8IDE2KSByZXR1cm4gMDsKLQotICBtZW1jcHkodHdlYWsuYywgaXYsIDE2KTsKLQotICAoKmN0eC0+YmxvY2syKSh0d2Vhay5jLCB0d2Vhay5jLCBjdHgtPmtleTIpOwotCi0gIGlmICghZW5jICYmIChsZW4gJSAxNikpIGxlbiAtPSAxNjsKLQotICB3aGlsZSAobGVuID49IDE2KSB7Ci0jaWYgZGVmaW5lZChTVFJJQ1RfQUxJR05NRU5UKQotICAgIG1lbWNweShzY3JhdGNoLmMsIGlucCwgMTYpOwotICAgIHNjcmF0Y2gudVswXSBePSB0d2Vhay51WzBdOwotICAgIHNjcmF0Y2gudVsxXSBePSB0d2Vhay51WzFdOwotI2Vsc2UKLSAgICBzY3JhdGNoLnVbMF0gPSAoKHVuaW50NjRfdCAqKWlucClbMF0gXiB0d2Vhay51WzBdOwotICAgIHNjcmF0Y2gudVsxXSA9ICgodW5pbnQ2NF90ICopaW5wKVsxXSBeIHR3ZWFrLnVbMV07Ci0jZW5kaWYKLSAgICAoKmN0eC0+YmxvY2sxKShzY3JhdGNoLmMsIHNjcmF0Y2guYywgY3R4LT5rZXkxKTsKLSNpZiBkZWZpbmVkKFNUUklDVF9BTElHTk1FTlQpCi0gICAgc2NyYXRjaC51WzBdIF49IHR3ZWFrLnVbMF07Ci0gICAgc2NyYXRjaC51WzFdIF49IHR3ZWFrLnVbMV07Ci0gICAgbWVtY3B5KG91dCwgc2NyYXRjaC5jLCAxNik7Ci0jZWxzZQotICAgICgodW5pbnQ2NF90ICopb3V0KVswXSA9IHNjcmF0Y2gudVswXSBePSB0d2Vhay51WzBdOwotICAgICgodW5pbnQ2NF90ICopb3V0KVsxXSA9IHNjcmF0Y2gudVsxXSBePSB0d2Vhay51WzFdOwotI2VuZGlmCi0gICAgaW5wICs9IDE2OwotICAgIG91dCArPSAxNjsKLSAgICBsZW4gLT0gMTY7Ci0KLSAgICBpZiAobGVuID09IDApIHJldHVybiAxOwotCi0gICAgaWYgKGlzX2VuZGlhbi5saXR0bGUpIHsKLSAgICAgIHVuc2lnbmVkIGludCBjYXJyeSwgcmVzOwotCi0gICAgICByZXMgPSAweDg3ICYgKCgoaW50KXR3ZWFrLmRbM10pID4+IDMxKTsKLSAgICAgIGNhcnJ5ID0gKHVuc2lnbmVkIGludCkodHdlYWsudVswXSA+PiA2Myk7Ci0gICAgICB0d2Vhay51WzBdID0gKHR3ZWFrLnVbMF0gPDwgMSkgXiByZXM7Ci0gICAgICB0d2Vhay51WzFdID0gKHR3ZWFrLnVbMV0gPDwgMSkgfCBjYXJyeTsKLSAgICB9IGVsc2UgewotICAgICAgc2l6ZV90IGM7Ci0KLSAgICAgIGZvciAoYyA9IDAsIGkgPSAwOyBpIDwgMTY7ICsraSkgewotICAgICAgICAvKgotICAgICAgICAgKiArIHN1YnN0aXR1dGVzIGZvciB8LCBiZWNhdXNlIGMgaXMgMSBiaXQKLSAgICAgICAgICovCi0gICAgICAgIGMgKz0gKChzaXplX3QpdHdlYWsuY1tpXSkgPDwgMTsKLSAgICAgICAgdHdlYWsuY1tpXSA9ICh1aW50OF90KWM7Ci0gICAgICAgIGMgPSBjID4+IDg7Ci0gICAgICB9Ci0gICAgICB0d2Vhay5jWzBdIF49ICh1aW50OF90KSgweDg3ICYgKDAgLSBjKSk7Ci0gICAgfQotICB9Ci0gIGlmIChlbmMpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKLSAgICAgIHVpbnQ4X3QgYyA9IGlucFtpXTsKLSAgICAgIG91dFtpXSA9IHNjcmF0Y2guY1tpXTsKLSAgICAgIHNjcmF0Y2guY1tpXSA9IGM7Ci0gICAgfQotICAgIHNjcmF0Y2gudVswXSBePSB0d2Vhay51WzBdOwotICAgIHNjcmF0Y2gudVsxXSBePSB0d2Vhay51WzFdOwotICAgICgqY3R4LT5ibG9jazEpKHNjcmF0Y2guYywgc2NyYXRjaC5jLCBjdHgtPmtleTEpOwotICAgIHNjcmF0Y2gudVswXSBePSB0d2Vhay51WzBdOwotICAgIHNjcmF0Y2gudVsxXSBePSB0d2Vhay51WzFdOwotICAgIG1lbWNweShvdXQgLSAxNiwgc2NyYXRjaC5jLCAxNik7Ci0gIH0gZWxzZSB7Ci0gICAgdW5pb24gewotICAgICAgdWludDY0X3QgdVsyXTsKLSAgICAgIHVpbnQ4X3QgY1sxNl07Ci0gICAgfSB0d2VhazE7Ci0KLSAgICBpZiAoaXNfZW5kaWFuLmxpdHRsZSkgewotICAgICAgdW5zaWduZWQgaW50IGNhcnJ5LCByZXM7Ci0KLSAgICAgIHJlcyA9IDB4ODcgJiAoKChpbnQpdHdlYWsuZFszXSkgPj4gMzEpOwotICAgICAgY2FycnkgPSAodW5zaWduZWQgaW50KSh0d2Vhay51WzBdID4+IDYzKTsKLSAgICAgIHR3ZWFrMS51WzBdID0gKHR3ZWFrLnVbMF0gPDwgMSkgXiByZXM7Ci0gICAgICB0d2VhazEudVsxXSA9ICh0d2Vhay51WzFdIDw8IDEpIHwgY2Fycnk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNpemVfdCBjOwotCi0gICAgICBmb3IgKGMgPSAwLCBpID0gMDsgaSA8IDE2OyArK2kpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogKyBzdWJzdGl0dXRlcyBmb3IgfCwgYmVjYXVzZSBjIGlzIDEgYml0Ci0gICAgICAgICAqLwotICAgICAgICBjICs9ICgoc2l6ZV90KXR3ZWFrLmNbaV0pIDw8IDE7Ci0gICAgICAgIHR3ZWFrMS5jW2ldID0gKHVpbnQ4X3QpYzsKLSAgICAgICAgYyA9IGMgPj4gODsKLSAgICAgIH0KLSAgICAgIHR3ZWFrMS5jWzBdIF49ICh1aW50OF90KSgweDg3ICYgKDAgLSBjKSk7Ci0gICAgfQotI2lmIGRlZmluZWQoU1RSSUNUX0FMSUdOTUVOVCkKLSAgICBtZW1jcHkoc2NyYXRjaC5jLCBpbnAsIDE2KTsKLSAgICBzY3JhdGNoLnVbMF0gXj0gdHdlYWsxLnVbMF07Ci0gICAgc2NyYXRjaC51WzFdIF49IHR3ZWFrMS51WzFdOwotI2Vsc2UKLSAgICBzY3JhdGNoLnVbMF0gPSAoKHVuaW50NjRfdCAqKWlucClbMF0gXiB0d2VhazEudVswXTsKLSAgICBzY3JhdGNoLnVbMV0gPSAoKHVuaW50NjRfdCAqKWlucClbMV0gXiB0d2VhazEudVsxXTsKLSNlbmRpZgotICAgICgqY3R4LT5ibG9jazEpKHNjcmF0Y2guYywgc2NyYXRjaC5jLCBjdHgtPmtleTEpOwotICAgIHNjcmF0Y2gudVswXSBePSB0d2VhazEudVswXTsKLSAgICBzY3JhdGNoLnVbMV0gXj0gdHdlYWsxLnVbMV07Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKLSAgICAgIHVpbnQ4X3QgYyA9IGlucFsxNiArIGldOwotICAgICAgb3V0WzE2ICsgaV0gPSBzY3JhdGNoLmNbaV07Ci0gICAgICBzY3JhdGNoLmNbaV0gPSBjOwotICAgIH0KLSAgICBzY3JhdGNoLnVbMF0gXj0gdHdlYWsudVswXTsKLSAgICBzY3JhdGNoLnVbMV0gXj0gdHdlYWsudVsxXTsKLSAgICAoKmN0eC0+YmxvY2sxKShzY3JhdGNoLmMsIHNjcmF0Y2guYywgY3R4LT5rZXkxKTsKLSNpZiBkZWZpbmVkKFNUUklDVF9BTElHTk1FTlQpCi0gICAgc2NyYXRjaC51WzBdIF49IHR3ZWFrLnVbMF07Ci0gICAgc2NyYXRjaC51WzFdIF49IHR3ZWFrLnVbMV07Ci0gICAgbWVtY3B5KG91dCwgc2NyYXRjaC5jLCAxNik7Ci0jZWxzZQotICAgICgodW5pbnQ2NF90ICopb3V0KVswXSA9IHNjcmF0Y2gudVswXSBeIHR3ZWFrLnVbMF07Ci0gICAgKCh1bmludDY0X3QgKilvdXQpWzFdID0gc2NyYXRjaC51WzFdIF4gdHdlYWsudVsxXTsKLSNlbmRpZgotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5pb24gewotICAgIGRvdWJsZSBhbGlnbjsKLSAgICBBRVNfS0VZIGtzOwotICB9IGtzMSwga3MyOyAgLyogQUVTIGtleSBzY2hlZHVsZXMgdG8gdXNlICovCi0gIFhUUzEyOF9DT05URVhUIHh0czsKLX0gRVZQX0FFU19YVFNfQ1RYOwotCi1zdGF0aWMgaW50IGFlc194dHNfaW5pdF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKml2LCBpbnQgZW5jKSB7Ci0gIEVWUF9BRVNfWFRTX0NUWCAqeGN0eCA9IGN0eC0+Y2lwaGVyX2RhdGE7Ci0gIGlmICghaXYgJiYgIWtleSkgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgaWYgKGtleSkgewotICAgIC8qIGtleV9sZW4gaXMgdHdvIEFFUyBrZXlzICovCi0gICAgaWYgKGVuYykgewotICAgICAgQUVTX3NldF9lbmNyeXB0X2tleShrZXksIGN0eC0+a2V5X2xlbiAqIDQsICZ4Y3R4LT5rczEua3MpOwotICAgICAgeGN0eC0+eHRzLmJsb2NrMSA9IChibG9jazEyOF9mKSBBRVNfZW5jcnlwdDsKLSAgICB9IGVsc2UgewotICAgICAgQUVTX3NldF9kZWNyeXB0X2tleShrZXksIGN0eC0+a2V5X2xlbiAqIDQsICZ4Y3R4LT5rczEua3MpOwotICAgICAgeGN0eC0+eHRzLmJsb2NrMSA9IChibG9jazEyOF9mKSBBRVNfZGVjcnlwdDsKLSAgICB9Ci0KLSAgICBBRVNfc2V0X2VuY3J5cHRfa2V5KGtleSArIGN0eC0+a2V5X2xlbiAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmtleV9sZW4gKiA0LCAmeGN0eC0+a3MyLmtzKTsKLSAgICB4Y3R4LT54dHMuYmxvY2syID0gKGJsb2NrMTI4X2YpIEFFU19lbmNyeXB0OwotICAgIHhjdHgtPnh0cy5rZXkxID0gJnhjdHgtPmtzMTsKLSAgfQotCi0gIGlmIChpdikgewotICAgIHhjdHgtPnh0cy5rZXkyID0gJnhjdHgtPmtzMjsKLSAgICBtZW1jcHkoY3R4LT5pdiwgaXYsIDE2KTsKLSAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGFlc194dHNfY2lwaGVyKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBsZW4pIHsKLSAgRVZQX0FFU19YVFNfQ1RYICp4Y3R4ID0gY3R4LT5jaXBoZXJfZGF0YTsKLSAgaWYgKCF4Y3R4LT54dHMua2V5MSB8fAotICAgICAgIXhjdHgtPnh0cy5rZXkyIHx8Ci0gICAgICAhb3V0IHx8Ci0gICAgICAhaW4gfHwKLSAgICAgIGxlbiA8IEFFU19CTE9DS19TSVpFIHx8Ci0gICAgICAhQ1JZUFRPX3h0czEyOF9lbmNyeXB0KCZ4Y3R4LT54dHMsIGN0eC0+aXYsIGluLCBvdXQsIGxlbiwgY3R4LT5lbmNyeXB0KSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGFlc194dHNfY3RybChFVlBfQ0lQSEVSX0NUWCAqYywgaW50IHR5cGUsIGludCBhcmcsIHZvaWQgKnB0cikgewotICBFVlBfQUVTX1hUU19DVFggKnhjdHggPSBjLT5jaXBoZXJfZGF0YTsKLSAgaWYgKHR5cGUgPT0gRVZQX0NUUkxfQ09QWSkgewotICAgIEVWUF9DSVBIRVJfQ1RYICpvdXQgPSBwdHI7Ci0gICAgRVZQX0FFU19YVFNfQ1RYICp4Y3R4X291dCA9IG91dC0+Y2lwaGVyX2RhdGE7Ci0gICAgaWYgKHhjdHgtPnh0cy5rZXkxKSB7Ci0gICAgICBpZiAoeGN0eC0+eHRzLmtleTEgIT0gJnhjdHgtPmtzMSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIHhjdHhfb3V0LT54dHMua2V5MSA9ICZ4Y3R4X291dC0+a3MxOwotICAgIH0KLSAgICBpZiAoeGN0eC0+eHRzLmtleTIpIHsKLSAgICAgIGlmICh4Y3R4LT54dHMua2V5MiAhPSAmeGN0eC0+a3MyKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgICAgeGN0eF9vdXQtPnh0cy5rZXkyID0gJnhjdHhfb3V0LT5rczI7Ci0gICAgfQotICAgIHJldHVybiAxOwotICB9IGVsc2UgaWYgKHR5cGUgIT0gRVZQX0NUUkxfSU5JVCkgewotICAgIHJldHVybiAtMTsKLSAgfQotICAvKiBrZXkxIGFuZCBrZXkyIGFyZSB1c2VkIGFzIGFuIGluZGljYXRvciBib3RoIGtleSBhbmQgSVYgYXJlIHNldCAqLwotICB4Y3R4LT54dHMua2V5MSA9IE5VTEw7Ci0gIHhjdHgtPnh0cy5rZXkyID0gTlVMTDsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIGFlc18yNTZfeHRzID0gewotICAgIE5JRF9hZXNfMjU2X3h0cywgICAgIDEgLyogYmxvY2tfc2l6ZSAqLywgIDMyIC8qIGtleV9zaXplICovLAotICAgIDE2IC8qIGl2X2xlbiAqLywgICAgIHNpemVvZihFVlBfQUVTX1hUU19DVFgpLAotICAgIEVWUF9DSVBIX1hUU19NT0RFIHwgRVZQX0NJUEhfQ1VTVE9NX0lWIHwgRVZQX0NJUEhfQUxXQVlTX0NBTExfSU5JVCB8Ci0gICAgICAgIEVWUF9DSVBIX0NUUkxfSU5JVCB8IEVWUF9DSVBIX0NVU1RPTV9DT1BZLAotICAgIE5VTEwgLyogYXBwX2RhdGEgKi8sIGFlc194dHNfaW5pdF9rZXksICAgIGFlc194dHNfY2lwaGVyLAotICAgIE5VTEwgLyogY2xlYW51cCAqLywgIGFlc194dHNfY3RybH07Ci0KLWNvbnN0IEVWUF9DSVBIRVIgKkVWUF9hZXNfMjU2X3h0cyh2b2lkKSB7IHJldHVybiAmYWVzXzI1Nl94dHM7IH0KZGlmZiAtLWdpdCBhL3NyYy9kb2MvZG9jLmNzcyBiL3NyYy9kb2MvZG9jLmNzcwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5kN2M1MTAyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2RvYy9kb2MuY3NzCkBAIC0wLDAgKzEgQEAKKy4uL3V0aWwvZG9jLmNzcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wZW5zc2wvYWVhZC5oIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9hZWFkLmgKaW5kZXggNjU5ZjA1Zi4uZGM0NTNlMyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9hZWFkLmgKKysrIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9hZWFkLmgKQEAgLTE1Myw4ICsxNTMsNiBAQAogT1BFTlNTTF9FWFBPUlQgY29uc3QgRVZQX0FFQUQgKkVWUF9hZWFkX2Rlc19lZGUzX2NiY19zaGExX3Rscyh2b2lkKTsKIE9QRU5TU0xfRVhQT1JUIGNvbnN0IEVWUF9BRUFEICpFVlBfYWVhZF9kZXNfZWRlM19jYmNfc2hhMV90bHNfaW1wbGljaXRfaXYodm9pZCk7CiAKLU9QRU5TU0xfRVhQT1JUIGNvbnN0IEVWUF9BRUFEICpFVlBfYWVhZF9udWxsX3NoYTFfdGxzKHZvaWQpOwotCiAKIC8qIFNTTHYzLXNwZWNpZmljIEFFQUQgYWxnb3JpdGhtcy4KICAqCkBAIC0xNjksNyArMTY3LDYgQEAKIE9QRU5TU0xfRVhQT1JUIGNvbnN0IEVWUF9BRUFEICpFVlBfYWVhZF9hZXNfMTI4X2NiY19zaGExX3NzbDModm9pZCk7CiBPUEVOU1NMX0VYUE9SVCBjb25zdCBFVlBfQUVBRCAqRVZQX2FlYWRfYWVzXzI1Nl9jYmNfc2hhMV9zc2wzKHZvaWQpOwogT1BFTlNTTF9FWFBPUlQgY29uc3QgRVZQX0FFQUQgKkVWUF9hZWFkX2Rlc19lZGUzX2NiY19zaGExX3NzbDModm9pZCk7Ci1PUEVOU1NMX0VYUE9SVCBjb25zdCBFVlBfQUVBRCAqRVZQX2FlYWRfbnVsbF9zaGExX3NzbDModm9pZCk7CiAKIAogLyogVXRpbGl0eSBmdW5jdGlvbnMuICovCkBAIC0yMjYsMTcgKzIyMywxMSBAQAogICBldnBfYWVhZF9zZWFsLAogfTsKIAotLyogRVZQX0FFQURfQ1RYX3plcm8gc2V0cyBhbiB1bmluaXRpYWxpemVkIHxjdHh8IHRvIHRoZSB6ZXJvIHN0YXRlLiBJdCBtdXN0IGJlCi0gKiBpbml0aWFsaXplZCB3aXRoIHxFVlBfQUVBRF9DVFhfaW5pdHwgYmVmb3JlIHVzZS4gSXQgaXMgc2FmZSwgYnV0IG5vdAotICogbmVjZXNzYXJ5LCB0byBjYWxsIHxFVlBfQUVBRF9DVFhfY2xlYW51cHwgaW4gdGhpcyBzdGF0ZS4gVGhpcyBtYXkgYmUgdXNlZCBmb3IKLSAqIG1vcmUgdW5pZm9ybSBjbGVhbnVwIG9mIHxFVlBfQUVBRF9DVFh8LiAqLwotT1BFTlNTTF9FWFBPUlQgdm9pZCBFVlBfQUVBRF9DVFhfemVybyhFVlBfQUVBRF9DVFggKmN0eCk7Ci0KLS8qIEVWUF9BRUFEX0NUWF9pbml0IGluaXRpYWxpemVzIHxjdHh8IGZvciB0aGUgZ2l2ZW4gQUVBRCBhbGdvcml0aG0uIFRoZSB8aW1wbHwKLSAqIGFyZ3VtZW50IGlzIGlnbm9yZWQgYW5kIHNob3VsZCBiZSBOVUxMLiBBdXRoZW50aWNhdGlvbiB0YWdzIG1heSBiZSB0cnVuY2F0ZWQKLSAqIGJ5IHBhc3NpbmcgYSBzaXplIGFzIHx0YWdfbGVufC4gQSB8dGFnX2xlbnwgb2YgemVybyBpbmRpY2F0ZXMgdGhlIGRlZmF1bHQKLSAqIHRhZyBsZW5ndGggYW5kIHRoaXMgaXMgZGVmaW5lZCBhcyBFVlBfQUVBRF9ERUZBVUxUX1RBR19MRU5HVEggZm9yCi0gKiByZWFkYWJpbGl0eS4KKy8qIEVWUF9BRUFEX0NUWF9pbml0IGluaXRpYWxpemVzIHxjdHh8IGZvciB0aGUgZ2l2ZW4gQUVBRCBhbGdvcml0aG0gZnJvbSB8aW1wbHwuCisgKiBUaGUgfGltcGx8IGFyZ3VtZW50IG1heSBiZSBOVUxMIHRvIGNob29zZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KKyAqIEF1dGhlbnRpY2F0aW9uIHRhZ3MgbWF5IGJlIHRydW5jYXRlZCBieSBwYXNzaW5nIGEgc2l6ZSBhcyB8dGFnX2xlbnwuIEEKKyAqIHx0YWdfbGVufCBvZiB6ZXJvIGluZGljYXRlcyB0aGUgZGVmYXVsdCB0YWcgbGVuZ3RoIGFuZCB0aGlzIGlzIGRlZmluZWQgYXMKKyAqIEVWUF9BRUFEX0RFRkFVTFRfVEFHX0xFTkdUSCBmb3IgcmVhZGFiaWxpdHkuCiAgKgogICogUmV0dXJucyAxIG9uIHN1Y2Nlc3MuIE90aGVyd2lzZSByZXR1cm5zIDAgYW5kIHB1c2hlcyB0byB0aGUgZXJyb3Igc3RhY2suIEluCiAgKiB0aGUgZXJyb3IgY2FzZSwgeW91IGRvIG5vdCBuZWVkIHRvIGNhbGwgfEVWUF9BRUFEX0NUWF9jbGVhbnVwfCwgYnV0IGl0J3MKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wZW5zc2wvYWVzLmggYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2Flcy5oCmluZGV4IGVkMDYwZmYuLjg0Y2RlNDEgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wZW5zc2wvYWVzLmgKKysrIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9hZXMuaApAQCAtMTI0LDcgKzEyNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBRVNfS0VZICprZXksIHVpbnQ4X3QgKml2ZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZW5jKTsKIAotLyogQUVTX29mYjEyOF9lbmNyeXB0IGVuY3J5cHRzIChvciBkZWNyeXB0cywgaXQncyB0aGUgc2FtZSBpbiBPRkIgbW9kZSkgfGxlbnwKKy8qIEFFU19vZmIxMjhfZW5jcnlwdCBlbmNyeXB0cyAob3IgZGVjcnlwdHMsIGl0J3MgdGhlIHNhbWUgaW4gQ1RSIG1vZGUpIHxsZW58CiAgKiBieXRlcyBmcm9tIHxpbnwgdG8gfG91dHwuIFRoZSB8bnVtfCBwYXJhbWV0ZXIgbXVzdCBiZSBzZXQgdG8gemVybyBvbiB0aGUKICAqIGZpcnN0IGNhbGwuICovCiBPUEVOU1NMX0VYUE9SVCB2b2lkIEFFU19vZmIxMjhfZW5jcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9hc24xLmggYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2FzbjEuaAppbmRleCAwNDM1MjRkLi40YmFmODFjIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9vcGVuc3NsL2FzbjEuaAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2FzbjEuaApAQCAtNTE1LDYgKzUxNSw3IEBACiAgICAgICAgQVNOMV9PQkpFQ1QgKmFsZ29yaXRobTsKICAgICAgICBBU04xX1RZUEUgKnBhcmFtZXRlcjsKICAgICAgICB9IC8qIFg1MDlfQUxHT1IgKi87CitERUZJTkVfU1RBQ0tfT0YoWDUwOV9BTEdPUik7CiAKIERFQ0xBUkVfQVNOMV9GVU5DVElPTlMoWDUwOV9BTEdPUikKIApAQCAtOTQ5LDcgKzk1MCw3IEBACiAJCQkgIENIRUNLRURfUFBUUl9PRih0eXBlLCB4KSkpCiAKIE9QRU5TU0xfRVhQT1JUIHZvaWQgKkFTTjFfaXRlbV9kMmlfYmlvKGNvbnN0IEFTTjFfSVRFTSAqaXQsIEJJTyAqaW4sIHZvaWQgKngpOwotT1BFTlNTTF9FWFBPUlQgaW50IEFTTjFfaTJkX2JpbyhpMmRfb2Zfdm9pZCAqaTJkLEJJTyAqb3V0LCB2b2lkICp4KTsKK09QRU5TU0xfRVhQT1JUIGludCBBU04xX2kyZF9iaW8oaTJkX29mX3ZvaWQgKmkyZCxCSU8gKm91dCwgdW5zaWduZWQgY2hhciAqeCk7CiAKICNkZWZpbmUgQVNOMV9pMmRfYmlvX29mKHR5cGUsaTJkLG91dCx4KSBcCiAgICAgKEFTTjFfaTJkX2JpbyhDSEVDS0VEX0kyRF9PRih0eXBlLCBpMmQpLCBcCkBAIC0xMDc3LDYgKzEwNzgsNzAgQEAKIH0KICNlbmRpZgogCisjZGVmaW5lIEFTTjFfRl9BU04xX0JJVF9TVFJJTkdfc2V0X2JpdCAxMDAKKyNkZWZpbmUgQVNOMV9GX0FTTjFfRU5VTUVSQVRFRF9zZXQgMTAxCisjZGVmaW5lIEFTTjFfRl9BU04xX0VOVU1FUkFURURfdG9fQk4gMTAyCisjZGVmaW5lIEFTTjFfRl9BU04xX0dFTkVSQUxJWkVEVElNRV9hZGogMTAzCisjZGVmaW5lIEFTTjFfRl9BU04xX0lOVEVHRVJfc2V0IDEwNAorI2RlZmluZSBBU04xX0ZfQVNOMV9JTlRFR0VSX3RvX0JOIDEwNQorI2RlZmluZSBBU04xX0ZfQVNOMV9PQkpFQ1RfbmV3IDEwNgorI2RlZmluZSBBU04xX0ZfQVNOMV9QQ1RYX25ldyAxMDcKKyNkZWZpbmUgQVNOMV9GX0FTTjFfU1RSSU5HX1RBQkxFX2FkZCAxMDgKKyNkZWZpbmUgQVNOMV9GX0FTTjFfU1RSSU5HX3NldCAxMDkKKyNkZWZpbmUgQVNOMV9GX0FTTjFfU1RSSU5HX3R5cGVfbmV3IDExMAorI2RlZmluZSBBU04xX0ZfQVNOMV9USU1FX2FkaiAxMTEKKyNkZWZpbmUgQVNOMV9GX0FTTjFfVVRDVElNRV9hZGogMTEyCisjZGVmaW5lIEFTTjFfRl9BU04xX2QyaV9mcCAxMTMKKyNkZWZpbmUgQVNOMV9GX0FTTjFfZHVwIDExNAorI2RlZmluZSBBU04xX0ZfQVNOMV9nZW5lcmF0ZV92MyAxMTUKKyNkZWZpbmUgQVNOMV9GX0FTTjFfZ2V0X29iamVjdCAxMTYKKyNkZWZpbmUgQVNOMV9GX0FTTjFfaTJkX2JpbyAxMTcKKyNkZWZpbmUgQVNOMV9GX0FTTjFfaTJkX2ZwIDExOAorI2RlZmluZSBBU04xX0ZfQVNOMV9pdGVtX2QyaV9mcCAxMTkKKyNkZWZpbmUgQVNOMV9GX0FTTjFfaXRlbV9kdXAgMTIwCisjZGVmaW5lIEFTTjFfRl9BU04xX2l0ZW1fZXhfZDJpIDEyMQorI2RlZmluZSBBU04xX0ZfQVNOMV9pdGVtX2kyZF9iaW8gMTIyCisjZGVmaW5lIEFTTjFfRl9BU04xX2l0ZW1faTJkX2ZwIDEyMworI2RlZmluZSBBU04xX0ZfQVNOMV9pdGVtX3BhY2sgMTI0CisjZGVmaW5lIEFTTjFfRl9BU04xX2l0ZW1fdW5wYWNrIDEyNQorI2RlZmluZSBBU04xX0ZfQVNOMV9tYnN0cmluZ19uY29weSAxMjYKKyNkZWZpbmUgQVNOMV9GX0FTTjFfdGVtcGxhdGVfbmV3IDEyNworI2RlZmluZSBBU04xX0ZfQklPX25ld19OREVGIDEyOAorI2RlZmluZSBBU04xX0ZfQk5fdG9fQVNOMV9FTlVNRVJBVEVEIDEyOQorI2RlZmluZSBBU04xX0ZfQk5fdG9fQVNOMV9JTlRFR0VSIDEzMAorI2RlZmluZSBBU04xX0ZfYTJkX0FTTjFfT0JKRUNUIDEzMQorI2RlZmluZSBBU04xX0ZfYTJpX0FTTjFfRU5VTUVSQVRFRCAxMzIKKyNkZWZpbmUgQVNOMV9GX2EyaV9BU04xX0lOVEVHRVIgMTMzCisjZGVmaW5lIEFTTjFfRl9hMmlfQVNOMV9TVFJJTkcgMTM0CisjZGVmaW5lIEFTTjFfRl9hcHBlbmRfZXhwIDEzNQorI2RlZmluZSBBU04xX0ZfYXNuMV9jYiAxMzYKKyNkZWZpbmUgQVNOMV9GX2FzbjFfY2hlY2tfdGxlbiAxMzcKKyNkZWZpbmUgQVNOMV9GX2FzbjFfY29sbGF0ZV9wcmltaXRpdmUgMTM4CisjZGVmaW5lIEFTTjFfRl9hc24xX2NvbGxlY3QgMTM5CisjZGVmaW5lIEFTTjFfRl9hc24xX2QyaV9leF9wcmltaXRpdmUgMTQwCisjZGVmaW5lIEFTTjFfRl9hc24xX2QyaV9yZWFkX2JpbyAxNDEKKyNkZWZpbmUgQVNOMV9GX2FzbjFfZG9fYWRiIDE0MgorI2RlZmluZSBBU04xX0ZfYXNuMV9leF9jMmkgMTQzCisjZGVmaW5lIEFTTjFfRl9hc24xX2ZpbmRfZW5kIDE0NAorI2RlZmluZSBBU04xX0ZfYXNuMV9pdGVtX2V4X2NvbWJpbmVfbmV3IDE0NQorI2RlZmluZSBBU04xX0ZfYXNuMV9zdHIydHlwZSAxNDYKKyNkZWZpbmUgQVNOMV9GX2FzbjFfdGVtcGxhdGVfZXhfZDJpIDE0NworI2RlZmluZSBBU04xX0ZfYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmkgMTQ4CisjZGVmaW5lIEFTTjFfRl9iaXRzdHJfY2IgMTQ5CisjZGVmaW5lIEFTTjFfRl9jMmlfQVNOMV9CSVRfU1RSSU5HIDE1MAorI2RlZmluZSBBU04xX0ZfYzJpX0FTTjFfSU5URUdFUiAxNTEKKyNkZWZpbmUgQVNOMV9GX2MyaV9BU04xX09CSkVDVCAxNTIKKyNkZWZpbmUgQVNOMV9GX2NvbGxlY3RfZGF0YSAxNTMKKyNkZWZpbmUgQVNOMV9GX2QyaV9BU04xX0JPT0xFQU4gMTU0CisjZGVmaW5lIEFTTjFfRl9kMmlfQVNOMV9PQkpFQ1QgMTU1CisjZGVmaW5lIEFTTjFfRl9kMmlfQVNOMV9VSU5URUdFUiAxNTYKKyNkZWZpbmUgQVNOMV9GX2QyaV9BU04xX1VUQ1RJTUUgMTU3CisjZGVmaW5lIEFTTjFfRl9kMmlfQVNOMV9ieXRlcyAxNTgKKyNkZWZpbmUgQVNOMV9GX2QyaV9BU04xX3R5cGVfYnl0ZXMgMTU5CisjZGVmaW5lIEFTTjFfRl9pMmRfQVNOMV9USU1FIDE2MAorI2RlZmluZSBBU04xX0ZfaTJkX1ByaXZhdGVLZXkgMTYxCisjZGVmaW5lIEFTTjFfRl9sb25nX2MyaSAxNjIKKyNkZWZpbmUgQVNOMV9GX3BhcnNlX3RhZ2dpbmcgMTYzCiAjZGVmaW5lIEFTTjFfUl9BU04xX0xFTkdUSF9NSVNNQVRDSCAxMDAKICNkZWZpbmUgQVNOMV9SX0FVWF9FUlJPUiAxMDEKICNkZWZpbmUgQVNOMV9SX0JBRF9HRVRfQVNOMV9PQkpFQ1RfQ0FMTCAxMDIKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wZW5zc2wvYmFzZS5oIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9iYXNlLmgKaW5kZXggNjYxODE3YS4uYjc2OWFkNSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9iYXNlLmgKKysrIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9iYXNlLmgKQEAgLTc5LDggKzc5LDkgQEAKICNlbGlmIGRlZmluZWQoX19hcm0pIHx8IGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfTV9BUk0pCiAjZGVmaW5lIE9QRU5TU0xfMzJfQklUCiAjZGVmaW5lIE9QRU5TU0xfQVJNCi0jZWxpZiBkZWZpbmVkKF9fUFBDNjRfXykgfHwgZGVmaW5lZChfX3Bvd2VycGM2NF9fKQorI2VsaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKICNkZWZpbmUgT1BFTlNTTF82NF9CSVQKKyNkZWZpbmUgT1BFTlNTTF9BQVJDSDY0CiAjZWxpZiBkZWZpbmVkKF9fbWlwc19fKSAmJiAhZGVmaW5lZChfX0xQNjRfXykKICNkZWZpbmUgT1BFTlNTTF8zMl9CSVQKICNkZWZpbmUgT1BFTlNTTF9NSVBTCkBAIC05OCw3ICs5OSw3IEBACiAjZGVmaW5lIE9QRU5TU0xfQVBQTEUKICNlbmRpZgogCi0jaWYgZGVmaW5lZChfV0lOMzIpCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCiAjZGVmaW5lIE9QRU5TU0xfV0lORE9XUwogI2VuZGlmCiAKQEAgLTEwOCw5ICsxMDksNyBAQAogI2VuZGlmCiAKICNkZWZpbmUgT1BFTlNTTF9JU19CT1JJTkdTU0wKLSNkZWZpbmUgQk9SSU5HU1NMXzIwMTUwOQogI2RlZmluZSBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDB4MTAwMDIwMDAKLSNkZWZpbmUgU1NMRUFZX1ZFUlNJT05fTlVNQkVSIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIKIAogI2lmIGRlZmluZWQoQk9SSU5HU1NMX1NIQVJFRF9MSUJSQVJZKQogCkBAIC0xNjcsMjkgKzE2NiwxMyBAQAogdHlwZWRlZiBzdHJ1Y3QgRElTVF9QT0lOVF9zdCBESVNUX1BPSU5UOwogdHlwZWRlZiBzdHJ1Y3QgSVNTVUlOR19ESVNUX1BPSU5UX3N0IElTU1VJTkdfRElTVF9QT0lOVDsKIHR5cGVkZWYgc3RydWN0IE5BTUVfQ09OU1RSQUlOVFNfc3QgTkFNRV9DT05TVFJBSU5UUzsKLXR5cGVkZWYgc3RydWN0IE5ldHNjYXBlX2NlcnRpZmljYXRlX3NlcXVlbmNlIE5FVFNDQVBFX0NFUlRfU0VRVUVOQ0U7Ci10eXBlZGVmIHN0cnVjdCBOZXRzY2FwZV9zcGthY19zdCBORVRTQ0FQRV9TUEtBQzsKLXR5cGVkZWYgc3RydWN0IE5ldHNjYXBlX3Nwa2lfc3QgTkVUU0NBUEVfU1BLSTsKLXR5cGVkZWYgc3RydWN0IFBCRTJQQVJBTV9zdCBQQkUyUEFSQU07Ci10eXBlZGVmIHN0cnVjdCBQQkVQQVJBTV9zdCBQQkVQQVJBTTsKLXR5cGVkZWYgc3RydWN0IFBCS0RGMlBBUkFNX3N0IFBCS0RGMlBBUkFNOwogdHlwZWRlZiBzdHJ1Y3QgWDUwOV9QT0xJQ1lfQ0FDSEVfc3QgWDUwOV9QT0xJQ1lfQ0FDSEU7CiB0eXBlZGVmIHN0cnVjdCBYNTA5X1BPTElDWV9MRVZFTF9zdCBYNTA5X1BPTElDWV9MRVZFTDsKIHR5cGVkZWYgc3RydWN0IFg1MDlfUE9MSUNZX05PREVfc3QgWDUwOV9QT0xJQ1lfTk9ERTsKIHR5cGVkZWYgc3RydWN0IFg1MDlfUE9MSUNZX1RSRUVfc3QgWDUwOV9QT0xJQ1lfVFJFRTsKIHR5cGVkZWYgc3RydWN0IFg1MDlfYWxnb3Jfc3QgWDUwOV9BTEdPUjsKLXR5cGVkZWYgc3RydWN0IFg1MDlfY3JsX2luZm9fc3QgWDUwOV9DUkxfSU5GTzsKIHR5cGVkZWYgc3RydWN0IFg1MDlfY3JsX3N0IFg1MDlfQ1JMOwotdHlwZWRlZiBzdHJ1Y3QgWDUwOV9leHRlbnNpb25fc3QgWDUwOV9FWFRFTlNJT047Ci10eXBlZGVmIHN0cnVjdCBYNTA5X2luZm9fc3QgWDUwOV9JTkZPOwotdHlwZWRlZiBzdHJ1Y3QgWDUwOV9uYW1lX2VudHJ5X3N0IFg1MDlfTkFNRV9FTlRSWTsKLXR5cGVkZWYgc3RydWN0IFg1MDlfbmFtZV9zdCBYNTA5X05BTUU7Ci10eXBlZGVmIHN0cnVjdCBYNTA5X29iamVjdHNfc3QgWDUwOV9PQkpFQ1RTOwogdHlwZWRlZiBzdHJ1Y3QgWDUwOV9wdWJrZXlfc3QgWDUwOV9QVUJLRVk7Ci10eXBlZGVmIHN0cnVjdCBYNTA5X3JlcV9pbmZvX3N0IFg1MDlfUkVRX0lORk87Ci10eXBlZGVmIHN0cnVjdCBYNTA5X3JlcV9zdCBYNTA5X1JFUTsKLXR5cGVkZWYgc3RydWN0IFg1MDlfc2lnX3N0IFg1MDlfU0lHOwotdHlwZWRlZiBzdHJ1Y3QgWDUwOV92YWxfc3QgWDUwOV9WQUw7CiB0eXBlZGVmIHN0cnVjdCBiaWdudW1fY3R4IEJOX0NUWDsKIHR5cGVkZWYgc3RydWN0IGJpZ251bV9zdCBCSUdOVU07CiB0eXBlZGVmIHN0cnVjdCBiaW9fbWV0aG9kX3N0IEJJT19NRVRIT0Q7CkBAIC0yMjIsOSArMjA1LDggQEAKIHR5cGVkZWYgc3RydWN0IGhtYWNfY3R4X3N0IEhNQUNfQ1RYOwogdHlwZWRlZiBzdHJ1Y3QgbWQ0X3N0YXRlX3N0IE1ENF9DVFg7CiB0eXBlZGVmIHN0cnVjdCBtZDVfc3RhdGVfc3QgTUQ1X0NUWDsKLXR5cGVkZWYgc3RydWN0IHBrY3MxMl9zdCBQS0NTMTI7CiB0eXBlZGVmIHN0cnVjdCBwa2NzOF9wcml2X2tleV9pbmZvX3N0IFBLQ1M4X1BSSVZfS0VZX0lORk87Ci10eXBlZGVmIHN0cnVjdCBwcml2YXRlX2tleV9zdCBYNTA5X1BLRVk7Cit0eXBlZGVmIHN0cnVjdCBwa2NzMTJfc3QgUEtDUzEyOwogdHlwZWRlZiBzdHJ1Y3QgcmFuZF9tZXRoX3N0IFJBTkRfTUVUSE9EOwogdHlwZWRlZiBzdHJ1Y3QgcmM0X2tleV9zdCBSQzRfS0VZOwogdHlwZWRlZiBzdHJ1Y3QgcnNhX21ldGhfc3QgUlNBX01FVEhPRDsKQEAgLTIzMiwyNiArMjE0LDE1IEBACiB0eXBlZGVmIHN0cnVjdCBzaGEyNTZfc3RhdGVfc3QgU0hBMjU2X0NUWDsKIHR5cGVkZWYgc3RydWN0IHNoYTUxMl9zdGF0ZV9zdCBTSEE1MTJfQ1RYOwogdHlwZWRlZiBzdHJ1Y3Qgc2hhX3N0YXRlX3N0IFNIQV9DVFg7Ci10eXBlZGVmIHN0cnVjdCBzcnRwX3Byb3RlY3Rpb25fcHJvZmlsZV9zdCBTUlRQX1BST1RFQ1RJT05fUFJPRklMRTsKLXR5cGVkZWYgc3RydWN0IHNzbF9jaXBoZXJfc3QgU1NMX0NJUEhFUjsKIHR5cGVkZWYgc3RydWN0IHNzbF9jdHhfc3QgU1NMX0NUWDsKLXR5cGVkZWYgc3RydWN0IHNzbF9jdXN0b21fZXh0ZW5zaW9uIFNTTF9DVVNUT01fRVhURU5TSU9OOwotdHlwZWRlZiBzdHJ1Y3Qgc3NsX21ldGhvZF9zdCBTU0xfTUVUSE9EOwotdHlwZWRlZiBzdHJ1Y3Qgc3NsX3Nlc3Npb25fc3QgU1NMX1NFU1NJT047CiB0eXBlZGVmIHN0cnVjdCBzc2xfc3QgU1NMOwogdHlwZWRlZiBzdHJ1Y3Qgc3RfRVJSX0ZOUyBFUlJfRk5TOwogdHlwZWRlZiBzdHJ1Y3QgdjNfZXh0X2N0eCBYNTA5VjNfQ1RYOwotdHlwZWRlZiBzdHJ1Y3QgeDUwOV9hdHRyaWJ1dGVzX3N0IFg1MDlfQVRUUklCVVRFOwotdHlwZWRlZiBzdHJ1Y3QgeDUwOV9jZXJ0X2F1eF9zdCBYNTA5X0NFUlRfQVVYOwotdHlwZWRlZiBzdHJ1Y3QgeDUwOV9jZXJ0X3BhaXJfc3QgWDUwOV9DRVJUX1BBSVI7Ci10eXBlZGVmIHN0cnVjdCB4NTA5X2NpbmZfc3QgWDUwOV9DSU5GOwogdHlwZWRlZiBzdHJ1Y3QgeDUwOV9jcmxfbWV0aG9kX3N0IFg1MDlfQ1JMX01FVEhPRDsKIHR5cGVkZWYgc3RydWN0IHg1MDlfcmV2b2tlZF9zdCBYNTA5X1JFVk9LRUQ7CiB0eXBlZGVmIHN0cnVjdCB4NTA5X3N0IFg1MDk7CiB0eXBlZGVmIHN0cnVjdCB4NTA5X3N0b3JlX2N0eF9zdCBYNTA5X1NUT1JFX0NUWDsKIHR5cGVkZWYgc3RydWN0IHg1MDlfc3RvcmVfc3QgWDUwOV9TVE9SRTsKLXR5cGVkZWYgc3RydWN0IHg1MDlfdHJ1c3Rfc3QgWDUwOV9UUlVTVDsKLQogdHlwZWRlZiB2b2lkICpPUEVOU1NMX0JMT0NLOwogCiAKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wZW5zc2wvYmFzZTY0LmggYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2Jhc2U2NC5oCmluZGV4IDJkMjdjODkuLjdhZWU5OTAgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wZW5zc2wvYmFzZTY0LmgKKysrIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9iYXNlNjQuaApAQCAtMTQ4LDExICsxNDgsOSBAQAogT1BFTlNTTF9FWFBPUlQgaW50IEVWUF9EZWNvZGVGaW5hbChFVlBfRU5DT0RFX0NUWCAqY3R4LCB1aW50OF90ICpvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0X2xlbik7CiAKLQotLyogRGVwcmVjYXRlZCBmdW5jdGlvbnMuICovCi0KLS8qIEVWUF9EZWNvZGVCbG9jayBlbmNvZGVzIHxzcmNfbGVufCBieXRlcyBmcm9tIHxzcmN8IGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0bwotICogfGRzdHwuIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIC0xIG9uIGVycm9yLgorLyogRGVwcmVjYXRlZDogRVZQX0RlY29kZUJsb2NrIGVuY29kZXMgfHNyY19sZW58IGJ5dGVzIGZyb20gfHNyY3wgYW5kCisgKiB3cml0ZXMgdGhlIHJlc3VsdCB0byB8ZHN0fC4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4KKyAqIG9yIC0xIG9uIGVycm9yLgogICoKICAqIFdBUk5JTkc6IEVWUF9EZWNvZGVCbG9jaydzIHJldHVybiB2YWx1ZSBkb2VzIG5vdCB0YWtlIHBhZGRpbmcgaW50bwogICogYWNjb3VudC4gSXQgYWxzbyBzdHJpcHMgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCB0cmFpbGluZwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9iaW8uaCBiL3NyYy9pbmNsdWRlL29wZW5zc2wvYmlvLmgKaW5kZXggMDRlMzc5MC4uODcyNDY1NyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9iaW8uaAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2Jpby5oCkBAIC03Niw2ICs3Niw4IEBACiAKIC8qIEFsbG9jYXRpb24gYW5kIGZyZWVpbmcuICovCiAKK0RFRklORV9TVEFDS19PRihCSU8pOworCiAvKiBCSU9fbmV3IGNyZWF0ZXMgYSBuZXcgQklPIHdpdGggdGhlIGdpdmVuIHR5cGUgYW5kIGEgcmVmZXJlbmNlIGNvdW50IG9mIG9uZS4KICAqIEl0IHJldHVybnMgdGhlIGZyZXNoIHxCSU98LCBvciBOVUxMIG9uIGVycm9yLiAqLwogT1BFTlNTTF9FWFBPUlQgQklPICpCSU9fbmV3KGNvbnN0IEJJT19NRVRIT0QgKnR5cGUpOwpAQCAtMjA1LDcgKzIwNyw3IEBACiAgKiBmbGFncyBvbiB8YmlvfC4gKi8KIE9QRU5TU0xfRVhQT1JUIHZvaWQgQklPX3NldF9yZXRyeV9yZWFkKEJJTyAqYmlvKTsKIAotLyogQklPX3NldF9yZXRyeV93cml0ZSBzZXRzIHRoZSB8QklPX0ZMQUdTX1dSSVRFfCBhbmQgfEJJT19GTEFHU19TSE9VTERfUkVUUll8CisvKiBCSU9fc2V0X3JldHJ5X3JlYWQgc2V0cyB0aGUgfEJJT19GTEFHU19XUklURXwgYW5kIHxCSU9fRkxBR1NfU0hPVUxEX1JFVFJZfAogICogZmxhZ3Mgb24gfGJpb3wuICovCiBPUEVOU1NMX0VYUE9SVCB2b2lkIEJJT19zZXRfcmV0cnlfd3JpdGUoQklPICpiaW8pOwogCkBAIC02NTQsNyArNjU2LDcgQEAKICAqIGVycm9yIHN0YWNrLiAqLwogT1BFTlNTTF9FWFBPUlQgaW50IEJJT196ZXJvX2NvcHlfZ2V0X3JlYWRfYnVmX2RvbmUoQklPKiBiaW8sIHNpemVfdCBieXRlc19yZWFkKTsKIAotLyogQklPX3plcm9fY29weV9nZXRfd3JpdGVfYnVmIGluaXRpYXRlcyBhIHplcm8gY29weSB3cml0ZSBvcGVyYXRpb24uCisvKiBCSU9femVyb19jb3B5X2dldF93cml0ZV9idWZfZG9uZSBpbml0aWF0ZXMgYSB6ZXJvIGNvcHkgd3JpdGUgb3BlcmF0aW9uLgogICogfG91dF93cml0ZV9idWZ8IGlzIHNldCB0byB0byB0aGUgaW50ZXJuYWwgd3JpdGUgYnVmZmVyLCBhbmQgfG91dF9idWZfb2Zmc2V0fAogICogaXMgc2V0IHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIG9mIHxvdXRfd3JpdGVfYnVmfC4KICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGZvciB3cml0ZSBmcm9tIHxvdXRfd3JpdGVfYnVmfCArCkBAIC02NjUsNyArNjY3LDcgQEAKICAqIHN0YWNrLgogICoKICAqIFRoZSB6ZXJvIGNvcHkgd3JpdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCBieSBjYWxsaW5nCi0gKiB8QklPX3plcm9fY29weV9nZXRfd3JpdGVfYnVmX2RvbmV8LiBOZWl0aGVyIHxCSU9femVyb19jb3B5X2dldF93cml0ZV9idWZ8CisgKiB8QklPX3plcm9fY29weV93cml0ZV9idWZfZG9uZXwuIE5laXRoZXIgfEJJT196ZXJvX2NvcHlfZ2V0X3dyaXRlX2J1ZnwKICAqIG5vciBhbnkgb3RoZXIgSS9PIHdyaXRlIG9wZXJhdGlvbiBtYXkgYmUgY2FsbGVkIHdoaWxlIGEgemVybyBjb3B5IHdyaXRlCiAgKiBvcGVyYXRpb24gaXMgYWN0aXZlLiAqLwogT1BFTlNTTF9FWFBPUlQgaW50IEJJT196ZXJvX2NvcHlfZ2V0X3dyaXRlX2J1ZihCSU8qIGJpbywKQEAgLTY3Myw4ICs2NzUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIG91dF9idWZfb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIG91dF9hdmFpbGFibGVfYnl0ZXMpOwogCi0vKiBCSU9femVyb19jb3B5X2dldF93cml0ZV9idWZfZG9uZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB3cml0aW5nIHRvIGEgQklPIHVzaW5nCi0gKiB8QklPX3plcm9fY29weV9nZXRfd3JpdGVfYnVmfCB0byBmaW5pc2ggdGhlIHdyaXRlIG9wZXJhdGlvbi4gVGhlCisvKiBCSU9femVyb19jb3B5X3dyaXRlX2J1Zl9kb25lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHdyaXRpbmcgdG8gYSBCSU8gdXNpbmcKKyAqIHxCSU9femVyb19jb3B5X2dldF93cml0ZV9idWZfZG9uZXwgdG8gZmluaXNoIHRoZSB3cml0ZSBvcGVyYXRpb24uIFRoZQogICogfGJ5dGVzX3dyaXR0ZW58IGFyZ3VtZW50IGdpdmVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KICAqCiAgKiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzLiBJbiBjYXNlIG9mIGVycm9yIGl0IHJldHVybnMgemVybyBhbmQgcHVzaGVzIHRvIHRoZQpAQCAtNzI1LDE4ICs3MjcsNiBAQAogI2RlZmluZSBCSU9fcHJpbnRfZXJyb3JzX2ZwIEVSUl9wcmludF9lcnJvcnNfZnAKIAogCi0vKiBEZXByZWNhdGVkIGZ1bmN0aW9ucy4gKi8KLQotLyogUmV0dXJucyBhIGZpbHRlciB8QklPfCB0aGF0IGJhc2U2NC1lbmNvZGVzIGRhdGEgd3JpdHRlbiBpbnRvIGl0LCBhbmQgZGVjb2RlcwotICogZGF0YSByZWFkIGZyb20gaXQuIHxCSU9fZ2V0c3wgaXMgbm90IHN1cHBvcnRlZC4gQ2FsbCB8QklPX2ZsdXNofCB3aGVuIGRvbmUKLSAqIHdyaXRpbmcsIHRvIHNpZ25hbCB0aGF0IG5vIG1vcmUgZGF0YSBhcmUgdG8gYmUgZW5jb2RlZC4gVGhlIGZsYWcKLSAqIHxCSU9fRkxBR1NfQkFTRTY0X05PX05MfCBtYXkgYmUgc2V0IHRvIGVuY29kZSBhbGwgdGhlIGRhdGEgb24gb25lIGxpbmUuICovCi1PUEVOU1NMX0VYUE9SVCBjb25zdCBCSU9fTUVUSE9EICpCSU9fZl9iYXNlNjQodm9pZCk7Ci0KLS8qIEVSUl9wcmludF9lcnJvcnMgaXMgYW4gYWxpYXMgZm9yIHxCSU9fcHJpbnRfZXJyb3JzfC4gKi8KLU9QRU5TU0xfRVhQT1JUIHZvaWQgRVJSX3ByaW50X2Vycm9ycyhCSU8gKmJpbyk7Ci0KLQogLyogUHJpdmF0ZSBmdW5jdGlvbnMgKi8KIAogI2RlZmluZSBCSU9fRkxBR1NfUkVBRCAweDAxCkBAIC04ODAsNiArODcwLDI1IEBACiB9ICAvKiBleHRlcm4gQyAqLwogI2VuZGlmCiAKKyNkZWZpbmUgQklPX0ZfQklPX2NhbGxiYWNrX2N0cmwgMTAwCisjZGVmaW5lIEJJT19GX0JJT19jdHJsIDEwMQorI2RlZmluZSBCSU9fRl9CSU9fbmV3IDEwMgorI2RlZmluZSBCSU9fRl9CSU9fbmV3X2ZpbGUgMTAzCisjZGVmaW5lIEJJT19GX0JJT19uZXdfbWVtX2J1ZiAxMDQKKyNkZWZpbmUgQklPX0ZfQklPX3plcm9fY29weV9nZXRfcmVhZF9idWYgMTA1CisjZGVmaW5lIEJJT19GX0JJT196ZXJvX2NvcHlfZ2V0X3JlYWRfYnVmX2RvbmUgMTA2CisjZGVmaW5lIEJJT19GX0JJT196ZXJvX2NvcHlfZ2V0X3dyaXRlX2J1ZiAxMDcKKyNkZWZpbmUgQklPX0ZfQklPX3plcm9fY29weV9nZXRfd3JpdGVfYnVmX2RvbmUgMTA4CisjZGVmaW5lIEJJT19GX2Jpb19pbyAxMDkKKyNkZWZpbmUgQklPX0ZfYmlvX21ha2VfcGFpciAxMTAKKyNkZWZpbmUgQklPX0ZfYmlvX3dyaXRlIDExMQorI2RlZmluZSBCSU9fRl9idWZmZXJfY3RybCAxMTIKKyNkZWZpbmUgQklPX0ZfY29ubl9jdHJsIDExMworI2RlZmluZSBCSU9fRl9jb25uX3N0YXRlIDExNAorI2RlZmluZSBCSU9fRl9maWxlX2N0cmwgMTE1CisjZGVmaW5lIEJJT19GX2ZpbGVfcmVhZCAxMTYKKyNkZWZpbmUgQklPX0ZfbWVtX3dyaXRlIDExNworI2RlZmluZSBCSU9fRl9CSU9fcHJpbnRmIDExOAogI2RlZmluZSBCSU9fUl9CQURfRk9QRU5fTU9ERSAxMDAKICNkZWZpbmUgQklPX1JfQlJPS0VOX1BJUEUgMTAxCiAjZGVmaW5lIEJJT19SX0NPTk5FQ1RfRVJST1IgMTAyCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcGVuc3NsL2JuLmggYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2JuLmgKaW5kZXggOGRlOGNjNC4uZWMxYzhmZiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9ibi5oCisrKyBiL3NyYy9pbmNsdWRlL29wZW5zc2wvYm4uaApAQCAtMTgyLDggKzE4Miw3IEBACiAgKiBhbGxvY2F0ZWQgQklHTlVNIG9uIHN1Y2Nlc3Mgb3IgTlVMTCBvdGhlcndpc2UuICovCiBPUEVOU1NMX0VYUE9SVCBCSUdOVU0gKkJOX2R1cChjb25zdCBCSUdOVU0gKnNyYyk7CiAKLS8qIEJOX2NvcHkgc2V0cyB8ZGVzdHwgZXF1YWwgdG8gfHNyY3wgYW5kIHJldHVybnMgfGRlc3R8IG9yIE5VTEwgb24gYWxsb2NhdGlvbgotICogZmFpbHVyZS4gKi8KKy8qIEJOX2NvcHkgc2V0cyB8ZGVzdHwgZXF1YWwgdG8gfHNyY3wgYW5kIHJldHVybnMgfGRlc3R8LiAqLwogT1BFTlNTTF9FWFBPUlQgQklHTlVNICpCTl9jb3B5KEJJR05VTSAqZGVzdCwgY29uc3QgQklHTlVNICpzcmMpOwogCiAvKiBCTl9jbGVhciBzZXRzIHxibnwgdG8gemVybyBhbmQgZXJhc2VzIHRoZSBvbGQgZGF0YS4gKi8KQEAgLTI5OCwyMSArMjk3LDYgQEAKIE9QRU5TU0xfRVhQT1JUIEJOX1VMT05HIEJOX2dldF93b3JkKGNvbnN0IEJJR05VTSAqYm4pOwogCiAKLS8qIEFTTi4xIGZ1bmN0aW9ucy4gKi8KLQotLyogQk5fY2JzMnVuc2lnbmVkIHBhcnNlcyBhIG5vbi1uZWdhdGl2ZSBERVIgSU5URUdFUiBmcm9tIHxjYnN8IHdyaXRlcyB0aGUKLSAqIHJlc3VsdCB0byB8cmV0fC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBmYWlsdXJlLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IEJOX2NiczJ1bnNpZ25lZChDQlMgKmNicywgQklHTlVNICpyZXQpOwotCi0vKiBCTl9jYnMydW5zaWduZWRfYnVnZ3kgYWN0cyBsaWtlIHxCTl9jYnMydW5zaWduZWR8IGJ1dCB0b2xlcmF0ZXMgc29tZSBpbnZhbGlkCi0gKiBlbmNvZGluZ3MuIERvIG5vdCB1c2UgdGhpcyBmdW5jdGlvbi4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBCTl9jYnMydW5zaWduZWRfYnVnZ3koQ0JTICpjYnMsIEJJR05VTSAqcmV0KTsKLQotLyogQk5fYm4yY2JiIG1hcnNoYWxzIHxibnwgYXMgYSBub24tbmVnYXRpdmUgREVSIElOVEVHRVIgYW5kIGFwcGVuZHMgdGhlIHJlc3VsdAotICogdG8gfGNiYnwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZmFpbHVyZS4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBCTl9ibjJjYmIoQ0JCICpjYmIsIGNvbnN0IEJJR05VTSAqYm4pOwotCi0KIC8qIEludGVybmFsIGZ1bmN0aW9ucy4KICAqCiAgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWZ1bCBmb3IgY29kZSB0aGF0IGlzIGRvaW5nIGxvdy1sZXZlbCBtYW5pcHVsYXRpb25zIG9mCkBAIC0zMjYsNyArMzEwLDcgQEAKIC8qIGJuX3dleHBhbmQgZW5zdXJlcyB0aGF0IHxibnwgaGFzIGF0IGxlYXN0IHx3b3Jkc3wgd29ya3Mgb2Ygc3BhY2Ugd2l0aG91dAogICogYWx0ZXJpbmcgaXRzIHZhbHVlLiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24gYWxsb2NhdGlvbgogICogZmFpbHVyZS4gKi8KLU9QRU5TU0xfRVhQT1JUIEJJR05VTSAqYm5fd2V4cGFuZChCSUdOVU0gKmJuLCBzaXplX3Qgd29yZHMpOworT1BFTlNTTF9FWFBPUlQgQklHTlVNICpibl93ZXhwYW5kKEJJR05VTSAqYm4sIHVuc2lnbmVkIHdvcmRzKTsKIAogCiAvKiBCSUdOVU0gcG9vbHMuCkBAIC03MTAsMTQgKzY5NCw2IEBACiBPUEVOU1NMX0VYUE9SVCBCSUdOVU0gKkJOX21vZF9pbnZlcnNlKEJJR05VTSAqb3V0LCBjb25zdCBCSUdOVU0gKmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqbiwgQk5fQ1RYICpjdHgpOwogCi0vKiBCTl9tb2RfaW52ZXJzZV9leCBhY3RzIGxpa2UgfEJOX21vZF9pbnZlcnNlfCBleGNlcHQgdGhhdCwgd2hlbiBpdCByZXR1cm5zCi0gKiB6ZXJvLCBpdCB3aWxsIHNldCB8Km91dF9ub19pbnZlcnNlfCB0byBvbmUgaWYgdGhlIGZhaWx1cmUgd2FzIGNhdXNlZCBiZWNhdXNlCi0gKiB8YXwgaGFzIG5vIGludmVyc2UgbW9kIHxufC4gT3RoZXJ3aXNlIGl0IHdpbGwgc2V0IHwqb3V0X25vX2ludmVyc2V8IHRvCi0gKiB6ZXJvLiAqLwotT1BFTlNTTF9FWFBPUlQgQklHTlVNICpCTl9tb2RfaW52ZXJzZV9leChCSUdOVU0gKm91dCwgaW50ICpvdXRfbm9faW52ZXJzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KTsKLQogLyogQk5fa3JvbmVja2VyIHJldHVybnMgdGhlIEtyb25lY2tlciBzeW1ib2wgb2YgfGF8IGFuZCB8YnwgKHdoaWNoIGlzIC0xLCAwIG9yCiAgKiAxKSwgb3IgLTIgb24gZXJyb3IuICovCiBPUEVOU1NMX0VYUE9SVCBpbnQgQk5fa3JvbmVja2VyKGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBCTl9DVFggKmN0eCk7CkBAIC04MDYsMjUgKzc4Miw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCwgQk5fTU9OVF9DVFggKm1fY3R4KTsKIAogCi0vKiBEZXByZWNhdGVkIGZ1bmN0aW9ucyAqLwotCi0vKiBCTl9ibjJtcGkgc2VyaWFsaXNlcyB0aGUgdmFsdWUgb2YgfGlufCB0byB8b3V0fCwgdXNpbmcgYSBmb3JtYXQgdGhhdCBjb25zaXN0cwotICogb2YgdGhlIG51bWJlcidzIGxlbmd0aCBpbiBieXRlcyByZXByZXNlbnRlZCBhcyBhIDQtYnl0ZSBiaWctZW5kaWFuIG51bWJlciwKLSAqIGFuZCB0aGUgbnVtYmVyIGl0c2VsZiBpbiBiaWctZW5kaWFuIGZvcm1hdCwgd2hlcmUgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0Ci0gKiBzaWduYWxzIGEgbmVnYXRpdmUgbnVtYmVyLiAoVGhlIHJlcHJlc2VudGF0aW9uIG9mIG51bWJlcnMgd2l0aCB0aGUgTVNCIHNldCBpcwotICogcHJlZml4ZWQgd2l0aCBudWxsIGJ5dGUpLiB8b3V0fCBtdXN0IGhhdmUgc3VmZmljaWVudCBzcGFjZSBhdmFpbGFibGU7IHRvCi0gKiBmaW5kIHRoZSBuZWVkZWQgYW1vdW50IG9mIHNwYWNlLCBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoIHxvdXR8IHNldCB0byBOVUxMLiAqLwotT1BFTlNTTF9FWFBPUlQgc2l6ZV90IEJOX2JuMm1waShjb25zdCBCSUdOVU0gKmluLCB1aW50OF90ICpvdXQpOwotCi0vKiBCTl9iaW4yYm4gcGFyc2VzIHxsZW58IGJ5dGVzIGZyb20gfGlufCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIHZhbHVlLiBUaGUKLSAqIGJ5dGVzIGF0IHxpbnwgYXJlIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBmb3JtYXQgZW1pdHRlZCBieSB8Qk5fYm4ybXBpfC4KLSAqCi0gKiBJZiB8b3V0fCBpcyBOVUxMIHRoZW4gYSBmcmVzaCB8QklHTlVNfCBpcyBhbGxvY2F0ZWQgYW5kIHJldHVybmVkLCBvdGhlcndpc2UKLSAqIHxvdXR8IGlzIHJldXNlZCBhbmQgcmV0dXJuZWQuIE9uIGVycm9yLCBOVUxMIGlzIHJldHVybmVkIGFuZCB0aGUgZXJyb3IgcXVldWUKLSAqIGlzIHVwZGF0ZWQuICovCi1PUEVOU1NMX0VYUE9SVCBCSUdOVU0gKkJOX21waTJibihjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGxlbiwgQklHTlVNICpvdXQpOwotCi0KIC8qIFByaXZhdGUgZnVuY3Rpb25zICovCiAKIHN0cnVjdCBiaWdudW1fc3QgewpAQCAtODcwLDYgKzgyNywzMyBAQAogfSAgLyogZXh0ZXJuIEMgKi8KICNlbmRpZgogCisjZGVmaW5lIEJOX0ZfQk5fQ1RYX2dldCAxMDAKKyNkZWZpbmUgQk5fRl9CTl9DVFhfbmV3IDEwMQorI2RlZmluZSBCTl9GX0JOX0NUWF9zdGFydCAxMDIKKyNkZWZpbmUgQk5fRl9CTl9ibjJkZWMgMTAzCisjZGVmaW5lIEJOX0ZfQk5fYm4yaGV4IDEwNAorI2RlZmluZSBCTl9GX0JOX2RpdiAxMDUKKyNkZWZpbmUgQk5fRl9CTl9kaXZfcmVjcCAxMDYKKyNkZWZpbmUgQk5fRl9CTl9leHAgMTA3CisjZGVmaW5lIEJOX0ZfQk5fZ2VuZXJhdGVfZHNhX25vbmNlIDEwOAorI2RlZmluZSBCTl9GX0JOX2dlbmVyYXRlX3ByaW1lX2V4IDEwOQorI2RlZmluZSBCTl9GX0JOX21vZF9leHAyX21vbnQgMTEwCisjZGVmaW5lIEJOX0ZfQk5fbW9kX2V4cF9tb250IDExMQorI2RlZmluZSBCTl9GX0JOX21vZF9leHBfbW9udF9jb25zdHRpbWUgMTEyCisjZGVmaW5lIEJOX0ZfQk5fbW9kX2V4cF9tb250X3dvcmQgMTEzCisjZGVmaW5lIEJOX0ZfQk5fbW9kX2ludmVyc2UgMTE0CisjZGVmaW5lIEJOX0ZfQk5fbW9kX2ludmVyc2Vfbm9fYnJhbmNoIDExNQorI2RlZmluZSBCTl9GX0JOX21vZF9sc2hpZnRfcXVpY2sgMTE2CisjZGVmaW5lIEJOX0ZfQk5fbW9kX3NxcnQgMTE3CisjZGVmaW5lIEJOX0ZfQk5fbmV3IDExOAorI2RlZmluZSBCTl9GX0JOX3JhbmQgMTE5CisjZGVmaW5lIEJOX0ZfQk5fcmFuZF9yYW5nZSAxMjAKKyNkZWZpbmUgQk5fRl9CTl9zcXJ0IDEyMQorI2RlZmluZSBCTl9GX0JOX3VzdWIgMTIyCisjZGVmaW5lIEJOX0ZfYm5fd2V4cGFuZCAxMjMKKyNkZWZpbmUgQk5fRl9tb2RfZXhwX3JlY3AgMTI0CisjZGVmaW5lIEJOX0ZfQk5fbHNoaWZ0IDEyNQorI2RlZmluZSBCTl9GX0JOX3JzaGlmdCAxMjYKICNkZWZpbmUgQk5fUl9BUkcyX0xUX0FSRzMgMTAwCiAjZGVmaW5lIEJOX1JfQkFEX1JFQ0lQUk9DQUwgMTAxCiAjZGVmaW5lIEJOX1JfQklHTlVNX1RPT19MT05HIDEwMgpAQCAtODg3LDcgKzg3MSw1IEBACiAjZGVmaW5lIEJOX1JfUF9JU19OT1RfUFJJTUUgMTE0CiAjZGVmaW5lIEJOX1JfVE9PX01BTllfSVRFUkFUSU9OUyAxMTUKICNkZWZpbmUgQk5fUl9UT09fTUFOWV9URU1QT1JBUllfVkFSSUFCTEVTIDExNgotI2RlZmluZSBCTl9SX0JBRF9FTkNPRElORyAxMTcKLSNkZWZpbmUgQk5fUl9FTkNPREVfRVJST1IgMTE4CiAKICNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfQk5fSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9idWYuaCBiL3NyYy9pbmNsdWRlL29wZW5zc2wvYnVmLmgKaW5kZXggNzZlMzc5NS4uMmIzNmNlNCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9idWYuaAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2J1Zi5oCkBAIC0xMTUsNCArMTE1LDkgQEAKIH0gIC8qIGV4dGVybiBDICovCiAjZW5kaWYKIAorI2RlZmluZSBCVUZfRl9CVUZfTUVNX25ldyAxMDAKKyNkZWZpbmUgQlVGX0ZfQlVGX21lbWR1cCAxMDEKKyNkZWZpbmUgQlVGX0ZfQlVGX3N0cm5kdXAgMTAyCisjZGVmaW5lIEJVRl9GX2J1Zl9tZW1fZ3JvdyAxMDMKKwogI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9CVUZGRVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9ieXRlc3RyaW5nLmggYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2J5dGVzdHJpbmcuaAppbmRleCAxYjFhMGE5Li45OTYzNDI2IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9vcGVuc3NsL2J5dGVzdHJpbmcuaAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2J5dGVzdHJpbmcuaApAQCAtOTksMTAgKzk5LDYgQEAKICAqIHxjYnN8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLwogT1BFTlNTTF9FWFBPUlQgaW50IENCU19nZXRfYnl0ZXMoQ0JTICpjYnMsIENCUyAqb3V0LCBzaXplX3QgbGVuKTsKIAotLyogQ0JTX2NvcHlfYnl0ZXMgY29waWVzIHRoZSBuZXh0IHxsZW58IGJ5dGVzIGZyb20gfGNic3wgdG8gfG91dHwgYW5kIGFkdmFuY2VzCi0gKiB8Y2JzfC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBDQlNfY29weV9ieXRlcyhDQlMgKmNicywgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuKTsKLQogLyogQ0JTX2dldF91OF9sZW5ndGhfcHJlZml4ZWQgc2V0cyB8Km91dHwgdG8gdGhlIGNvbnRlbnRzIG9mIGFuIDgtYml0LAogICogbGVuZ3RoLXByZWZpeGVkIHZhbHVlIGZyb20gfGNic3wgYW5kIGFkdmFuY2VzIHxjYnN8IG92ZXIgaXQuIEl0IHJldHVybnMgb25lCiAgKiBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLwpAQCAtMTI1LDEyICsxMjEsMTAgQEAKICNkZWZpbmUgQ0JTX0FTTjFfSU5URUdFUiAweDIKICNkZWZpbmUgQ0JTX0FTTjFfQklUU1RSSU5HIDB4MwogI2RlZmluZSBDQlNfQVNOMV9PQ1RFVFNUUklORyAweDQKLSNkZWZpbmUgQ0JTX0FTTjFfTlVMTCAweDUKICNkZWZpbmUgQ0JTX0FTTjFfT0JKRUNUIDB4NgogI2RlZmluZSBDQlNfQVNOMV9FTlVNRVJBVEVEIDB4YQogI2RlZmluZSBDQlNfQVNOMV9TRVFVRU5DRSAoMHgxMCB8IENCU19BU04xX0NPTlNUUlVDVEVEKQogI2RlZmluZSBDQlNfQVNOMV9TRVQgKDB4MTEgfCBDQlNfQVNOMV9DT05TVFJVQ1RFRCkKLSNkZWZpbmUgQ0JTX0FTTjFfR0VORVJBTElaRURUSU1FIDB4MTgKIAogI2RlZmluZSBDQlNfQVNOMV9DT05TVFJVQ1RFRCAweDIwCiAjZGVmaW5lIENCU19BU04xX0NPTlRFWFRfU1BFQ0lGSUMgMHg4MApAQCAtMTY0LDI0ICsxNTgsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKm91dF90YWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqb3V0X2hlYWRlcl9sZW4pOwogCi0vKiBDQlNfZ2V0X2FueV9iZXJfYXNuMV9lbGVtZW50IGFjdHMgdGhlIHNhbWUgYXMgfENCU19nZXRfYW55X2FzbjFfZWxlbWVudHwgYnV0Ci0gKiBhbHNvIGFsbG93cyBpbmRlZmluaXRlLWxlbmd0aCBlbGVtZW50cyB0byBiZSByZXR1cm5lZC4gSW4gdGhhdCBjYXNlLAotICogfCpvdXRfaGVhZGVyX2xlbnwgYW5kIHxDQlNfbGVuKG91dCl8IHdpbGwgYm90aCBiZSB0d28gYXMgb25seSB0aGUgaGVhZGVyIGlzCi0gKiByZXR1cm5lZCwgb3RoZXJ3aXNlIGl0IGJlaGF2ZXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGZ1bmN0aW9uLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IENCU19nZXRfYW55X2Jlcl9hc24xX2VsZW1lbnQoQ0JTICpjYnMsIENCUyAqb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKm91dF90YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm91dF9oZWFkZXJfbGVuKTsKLQogLyogQ0JTX2dldF9hc24xX3VpbnQ2NCBnZXRzIGFuIEFTTi4xIElOVEVHRVIgZnJvbSB8Y2JzfCB1c2luZyB8Q0JTX2dldF9hc24xfAogICogYW5kIHNldHMgfCpvdXR8IHRvIGl0cyB2YWx1ZS4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvciwKICAqIHdoZXJlIGVycm9yIGluY2x1ZGVzIHRoZSBpbnRlZ2VyIGJlaW5nIG5lZ2F0aXZlLCBvciB0b28gbGFyZ2UgdG8gcmVwcmVzZW50CiAgKiBpbiA2NCBiaXRzLiAqLwogT1BFTlNTTF9FWFBPUlQgaW50IENCU19nZXRfYXNuMV91aW50NjQoQ0JTICpjYnMsIHVpbnQ2NF90ICpvdXQpOwogCi0vKiBDQlNfZ2V0X29wdGlvbmFsX2FzbjEgZ2V0cyBhbiBvcHRpb25hbCBleHBsaWNpdGx5LXRhZ2dlZCBlbGVtZW50IGZyb20gfGNic3wKLSAqIHRhZ2dlZCB3aXRoIHx0YWd8IGFuZCBzZXRzIHwqb3V0fCB0byBpdHMgY29udGVudHMuIElmIHByZXNlbnQgYW5kIGlmCi0gKiB8b3V0X3ByZXNlbnR8IGlzIG5vdCBOVUxMLCBpdCBzZXRzIHwqb3V0X3ByZXNlbnR8IHRvIG9uZSwgb3RoZXJ3aXNlIHplcm8uIEl0Ci0gKiByZXR1cm5zIG9uZSBvbiBzdWNjZXNzLCB3aGV0aGVyIG9yIG5vdCB0aGUgZWxlbWVudCB3YXMgcHJlc2VudCwgYW5kIHplcm8gb24KKy8qIENCU19nZXRfb3B0aW9uYWxfYXNuMSBnZXRzIGFuIG9wdGlvbmFsIGV4cGxpY2l0bHktdGFnZ2VkIGVsZW1lbnQKKyAqIGZyb20gfGNic3wgdGFnZ2VkIHdpdGggfHRhZ3wgYW5kIHNldHMgfCpvdXR8IHRvIGl0cyBjb250ZW50cy4gSWYKKyAqIHByZXNlbnQsIGl0IHNldHMgfCpvdXRfcHJlc2VudHwgdG8gb25lLCBvdGhlcndpc2UgemVyby4gSXQgcmV0dXJucworICogb25lIG9uIHN1Y2Nlc3MsIHdoZXRoZXIgb3Igbm90IHRoZSBlbGVtZW50IHdhcyBwcmVzZW50LCBhbmQgemVybyBvbgogICogZGVjb2RlIGZhaWx1cmUuICovCiBPUEVOU1NMX0VYUE9SVCBpbnQgQ0JTX2dldF9vcHRpb25hbF9hc24xKENCUyAqY2JzLCBDQlMgKm91dCwgaW50ICpvdXRfcHJlc2VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdGFnKTsKQEAgLTI1MiwxMiArMjM4LDYgQEAKICAgY2hhciBpc190b3BfbGV2ZWw7CiB9OwogCi0vKiBDQkJfemVybyBzZXRzIGFuIHVuaW5pdGlhbGlzZWQgfGNiYnwgdG8gdGhlIHplcm8gc3RhdGUuIEl0IG11c3QgYmUKLSAqIGluaXRpYWxpc2VkIHdpdGggfENCQl9pbml0fCBvciB8Q0JCX2luaXRfZml4ZWR8IGJlZm9yZSB1c2UsIGJ1dCBpdCBpcyBzYWZlIHRvCi0gKiBjYWxsIHxDQkJfY2xlYW51cHwgd2l0aG91dCBhIHN1Y2Nlc3NmdWwgfENCQl9pbml0fC4gVGhpcyBtYXkgYmUgdXNlZCBmb3IgbW9yZQotICogdW5pZm9ybSBjbGVhbnVwIG9mIGEgfENCQnwuICovCi1PUEVOU1NMX0VYUE9SVCB2b2lkIENCQl96ZXJvKENCQiAqY2JiKTsKLQogLyogQ0JCX2luaXQgaW5pdGlhbGlzZXMgfGNiYnwgd2l0aCB8aW5pdGlhbF9jYXBhY2l0eXwuIFNpbmNlIGEgfENCQnwgZ3Jvd3MgYXMKICAqIG5lZWRlZCwgdGhlIHxpbml0aWFsX2NhcGFjaXR5fCBpcyBqdXN0IGEgaGludC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBvcgogICogemVybyBvbiBlcnJvci4gKi8KQEAgLTI4OCwxNCArMjY4LDYgQEAKICAqIG9uIGVycm9yLiAqLwogT1BFTlNTTF9FWFBPUlQgaW50IENCQl9mbHVzaChDQkIgKmNiYik7CiAKLS8qIENCQl9sZW4gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gfGNiYnwncyB0b3AtbGV2ZWwgfENCQnwuIEl0Ci0gKiBtYXkgYmUgY29tcGFyZWQgYmVmb3JlIGFuZCBhZnRlciBhbiBvcGVyYXRpb24gdG8gZGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzCi0gKiB3ZXJlIHdyaXR0ZW4uCi0gKgotICogSXQgaXMgYSBmYXRhbCBlcnJvciB0byBjYWxsIHRoaXMgb24gYSBDQkIgd2l0aCBhbnkgYWN0aXZlIGNoaWxkcmVuLiBUaGlzIGRvZXMKLSAqIG5vdCBmbHVzaCB8Y2JifC4gKi8KLU9QRU5TU0xfRVhQT1JUIHNpemVfdCBDQkJfbGVuKGNvbnN0IENCQiAqY2JiKTsKLQogLyogQ0JCX2FkZF91OF9sZW5ndGhfcHJlZml4ZWQgc2V0cyB8Km91dF9jb250ZW50c3wgdG8gYSBuZXcgY2hpbGQgb2YgfGNiYnwuIFRoZQogICogZGF0YSB3cml0dGVuIHRvIHwqb3V0X2NvbnRlbnRzfCB3aWxsIGJlIHByZWZpeGVkIGluIHxjYmJ8IHdpdGggYW4gOC1iaXQKICAqIGxlbmd0aC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciB6ZXJvIG9uIGVycm9yLiAqLwpAQCAtMzExLDcgKzI4Myw3IEBACiAgKiBiaWctZW5kaWFuIGxlbmd0aC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciB6ZXJvIG9uIGVycm9yLiAqLwogT1BFTlNTTF9FWFBPUlQgaW50IENCQl9hZGRfdTI0X2xlbmd0aF9wcmVmaXhlZChDQkIgKmNiYiwgQ0JCICpvdXRfY29udGVudHMpOwogCi0vKiBDQkJfYWRkX2FzbjEgc2V0cyB8Km91dF9jb250ZW50c3wgdG8gYSB8Q0JCfCBpbnRvIHdoaWNoIHRoZSBjb250ZW50cyBvZiBhbgorLyogQ0JCX2FkZF9hc24gc2V0cyB8Km91dF9jb250ZW50c3wgdG8gYSB8Q0JCfCBpbnRvIHdoaWNoIHRoZSBjb250ZW50cyBvZiBhbgogICogQVNOLjEgb2JqZWN0IGNhbiBiZSB3cml0dGVuLiBUaGUgfHRhZ3wgYXJndW1lbnQgd2lsbCBiZSB1c2VkIGFzIHRoZSB0YWcgZm9yCiAgKiB0aGUgb2JqZWN0LiBQYXNzaW5nIGluIHx0YWd8IG51bWJlciAzMSB3aWxsIHJldHVybiBpbiBhbiBlcnJvciBzaW5jZSBvbmx5CiAgKiBzaW5nbGUgb2N0ZXQgaWRlbnRpZmllcnMgYXJlIHN1cHBvcnRlZC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciB6ZXJvCkBAIC0zMzIsNyArMzA0LDcgQEAKICAqIHN1Y2Nlc3MgYW5kIHplcm8gb3RoZXJ3aXNlLiAqLwogT1BFTlNTTF9FWFBPUlQgaW50IENCQl9hZGRfdTgoQ0JCICpjYmIsIHVpbnQ4X3QgdmFsdWUpOwogCi0vKiBDQkJfYWRkX3UxNiBhcHBlbmRzIGEgMTYtYml0LCBiaWctZW5kaWFuIG51bWJlciBmcm9tIHx2YWx1ZXwgdG8gfGNiYnwuIEl0CisvKiBDQkJfYWRkX3U4IGFwcGVuZHMgYSAxNi1iaXQsIGJpZy1lbmRpYW4gbnVtYmVyIGZyb20gfHZhbHVlfCB0byB8Y2JifC4gSXQKICAqIHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb3RoZXJ3aXNlLiAqLwogT1BFTlNTTF9FWFBPUlQgaW50IENCQl9hZGRfdTE2KENCQiAqY2JiLCB1aW50MTZfdCB2YWx1ZSk7CiAKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wZW5zc2wvY2hhY2hhLmggYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2NoYWNoYS5oCmluZGV4IGI3ZjU4ODIuLmNlNTNkNDkgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wZW5zc2wvY2hhY2hhLmgKKysrIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9jaGFjaGEuaApAQCAtMjUsOSArMjUsOSBAQAogLyogQ1JZUFRPX2NoYWNoYV8yMCBlbmNyeXB0cyB8aW5fbGVufCBieXRlcyBmcm9tIHxpbnwgd2l0aCB0aGUgZ2l2ZW4ga2V5IGFuZAogICogbm9uY2UgYW5kIHdyaXRlcyB0aGUgcmVzdWx0IHRvIHxvdXR8LCB3aGljaCBtYXkgYmUgZXF1YWwgdG8gfGlufC4gVGhlCiAgKiBpbml0aWFsIGJsb2NrIGNvdW50ZXIgaXMgc3BlY2lmaWVkIGJ5IHxjb3VudGVyfC4gKi8KLU9QRU5TU0xfRVhQT1JUIHZvaWQgQ1JZUFRPX2NoYWNoYV8yMCh1aW50OF90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbl9sZW4sIGNvbnN0IHVpbnQ4X3Qga2V5WzMyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IG5vbmNlWzhdLCBzaXplX3QgY291bnRlcik7Cit2b2lkIENSWVBUT19jaGFjaGFfMjAodWludDhfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5fbGVuLCBjb25zdCB1aW50OF90IGtleVszMl0sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBub25jZVs4XSwgc2l6ZV90IGNvdW50ZXIpOwogCiAKICNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9jaXBoZXIuaCBiL3NyYy9pbmNsdWRlL29wZW5zc2wvY2lwaGVyLmgKaW5kZXggYTRlNzlkZC4uN2Y1ZmUwNCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9jaXBoZXIuaAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2NpcGhlci5oCkBAIC03NSw5ICs3NSw2IEBACiBPUEVOU1NMX0VYUE9SVCBjb25zdCBFVlBfQ0lQSEVSICpFVlBfcmM0KHZvaWQpOwogCiBPUEVOU1NMX0VYUE9SVCBjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2NiYyh2b2lkKTsKLU9QRU5TU0xfRVhQT1JUIGNvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfZWNiKHZvaWQpOwotT1BFTlNTTF9FWFBPUlQgY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc19lZGUodm9pZCk7Ci1PUEVOU1NMX0VYUE9SVCBjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZV9jYmModm9pZCk7CiBPUEVOU1NMX0VYUE9SVCBjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZTNfY2JjKHZvaWQpOwogCiBPUEVOU1NMX0VYUE9SVCBjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzEyOF9lY2Iodm9pZCk7CkBAIC04OSw3ICs4Niw2IEBACiBPUEVOU1NMX0VYUE9SVCBjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzI1Nl9jYmModm9pZCk7CiBPUEVOU1NMX0VYUE9SVCBjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzI1Nl9jdHIodm9pZCk7CiBPUEVOU1NMX0VYUE9SVCBjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzI1Nl9vZmIodm9pZCk7Ci1PUEVOU1NMX0VYUE9SVCBjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzI1Nl94dHModm9pZCk7CiAKIC8qIERlcHJlY2F0ZWQgQUVTLUdDTSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzZXQgfEVWUF9DSVBIX0ZMQUdfQ1VTVE9NX0NJUEhFUnwuCiAgKiBVc2UgfEVWUF9hZWFkX2Flc18xMjhfZ2NtfCBhbmQgfEVWUF9hZWFkX2Flc18yNTZfZ2NtfCBpbnN0ZWFkLiAqLwpAQCAtMTA2LDkgKzEwMiw2IEBACiAgKiBjaXBoZXJ0ZXh0LiAqLwogT1BFTlNTTF9FWFBPUlQgY29uc3QgRVZQX0NJUEhFUiAqRVZQX2VuY19udWxsKHZvaWQpOwogCi0vKiBFVlBfcmMyX2NiYyByZXR1cm5zIGEgY2lwaGVyIHRoYXQgaW1wbGVtZW50cyAxMjgtYml0IFJDMiBpbiBDQkMgbW9kZS4gKi8KLU9QRU5TU0xfRVhQT1JUIGNvbnN0IEVWUF9DSVBIRVIgKkVWUF9yYzJfY2JjKHZvaWQpOwotCiAvKiBFVlBfcmMyXzQwX2NiYyByZXR1cm5zIGEgY2lwaGVyIHRoYXQgaW1wbGVtZW50cyA0MC1iaXQgUkMyIGluIENCQyBtb2RlLiBUaGlzCiAgKiBpcyBvYnZpb3VzbHkgdmVyeSwgdmVyeSB3ZWFrIGFuZCBpcyBpbmNsdWRlZCBvbmx5IGluIG9yZGVyIHRvIHJlYWQgUEtDUyMxMgogICogZmlsZXMsIHdoaWNoIG9mdGVuIGVuY3J5cHQgdGhlIGNlcnRpZmljYXRlIGNoYWluIHVzaW5nIHRoaXMgY2lwaGVyLiBJdCBpcwpAQCAtMzQ1LDcgKzMzOCw2IEBACiAjZGVmaW5lIEVWUF9DSVBIX09GQl9NT0RFIDB4NAogI2RlZmluZSBFVlBfQ0lQSF9DVFJfTU9ERSAweDUKICNkZWZpbmUgRVZQX0NJUEhfR0NNX01PREUgMHg2Ci0jZGVmaW5lIEVWUF9DSVBIX1hUU19NT0RFIDB4NwogCiAKIC8qIENpcGhlciBmbGFncyAoZm9yIHxFVlBfQ0lQSEVSX2ZsYWdzfCkuICovCkBAIC01NDEsNiArNTMzLDQxIEBACiB9ICAvKiBleHRlcm4gQyAqLwogI2VuZGlmCiAKKyNkZWZpbmUgQ0lQSEVSX0ZfRVZQX0FFQURfQ1RYX2luaXQgMTAwCisjZGVmaW5lIENJUEhFUl9GX0VWUF9BRUFEX0NUWF9vcGVuIDEwMQorI2RlZmluZSBDSVBIRVJfRl9FVlBfQUVBRF9DVFhfc2VhbCAxMDIKKyNkZWZpbmUgQ0lQSEVSX0ZfRVZQX0NJUEhFUl9DVFhfY29weSAxMDMKKyNkZWZpbmUgQ0lQSEVSX0ZfRVZQX0NJUEhFUl9DVFhfY3RybCAxMDQKKyNkZWZpbmUgQ0lQSEVSX0ZfRVZQX0NJUEhFUl9DVFhfc2V0X2tleV9sZW5ndGggMTA1CisjZGVmaW5lIENJUEhFUl9GX0VWUF9DaXBoZXJJbml0X2V4IDEwNgorI2RlZmluZSBDSVBIRVJfRl9FVlBfRGVjcnlwdEZpbmFsX2V4IDEwNworI2RlZmluZSBDSVBIRVJfRl9FVlBfRW5jcnlwdEZpbmFsX2V4IDEwOAorI2RlZmluZSBDSVBIRVJfRl9hZWFkX2Flc19nY21faW5pdCAxMDkKKyNkZWZpbmUgQ0lQSEVSX0ZfYWVhZF9hZXNfZ2NtX29wZW4gMTEwCisjZGVmaW5lIENJUEhFUl9GX2FlYWRfYWVzX2djbV9zZWFsIDExMQorI2RlZmluZSBDSVBIRVJfRl9hZWFkX2Flc19rZXlfd3JhcF9pbml0IDExMgorI2RlZmluZSBDSVBIRVJfRl9hZWFkX2Flc19rZXlfd3JhcF9vcGVuIDExMworI2RlZmluZSBDSVBIRVJfRl9hZWFkX2Flc19rZXlfd3JhcF9zZWFsIDExNAorI2RlZmluZSBDSVBIRVJfRl9hZWFkX2NoYWNoYTIwX3BvbHkxMzA1X2luaXQgMTE1CisjZGVmaW5lIENJUEhFUl9GX2FlYWRfY2hhY2hhMjBfcG9seTEzMDVfb3BlbiAxMTYKKyNkZWZpbmUgQ0lQSEVSX0ZfYWVhZF9jaGFjaGEyMF9wb2x5MTMwNV9zZWFsIDExNworI2RlZmluZSBDSVBIRVJfRl9hZWFkX3JjNF9tZDVfdGxzX2luaXQgMTE4CisjZGVmaW5lIENJUEhFUl9GX2FlYWRfcmM0X21kNV90bHNfb3BlbiAxMTkKKyNkZWZpbmUgQ0lQSEVSX0ZfYWVhZF9yYzRfbWQ1X3Rsc19zZWFsIDEyMAorI2RlZmluZSBDSVBIRVJfRl9hZWFkX3NzbDNfZW5zdXJlX2NpcGhlcl9pbml0IDEyMQorI2RlZmluZSBDSVBIRVJfRl9hZWFkX3NzbDNfaW5pdCAxMjIKKyNkZWZpbmUgQ0lQSEVSX0ZfYWVhZF9zc2wzX29wZW4gMTIzCisjZGVmaW5lIENJUEhFUl9GX2FlYWRfc3NsM19zZWFsIDEyNAorI2RlZmluZSBDSVBIRVJfRl9hZWFkX3Rsc19lbnN1cmVfY2lwaGVyX2luaXQgMTI1CisjZGVmaW5lIENJUEhFUl9GX2FlYWRfdGxzX2luaXQgMTI2CisjZGVmaW5lIENJUEhFUl9GX2FlYWRfdGxzX29wZW4gMTI3CisjZGVmaW5lIENJUEhFUl9GX2FlYWRfdGxzX3NlYWwgMTI4CisjZGVmaW5lIENJUEhFUl9GX2Flc19pbml0X2tleSAxMjkKKyNkZWZpbmUgQ0lQSEVSX0ZfYWVzbmlfaW5pdF9rZXkgMTMwCisjZGVmaW5lIENJUEhFUl9GX0VWUF9BRUFEX0NUWF9pbml0X3dpdGhfZGlyZWN0aW9uIDEzMQorI2RlZmluZSBDSVBIRVJfRl9hZWFkX2Flc19jdHJfaG1hY19zaGEyNTZfaW5pdCAxMzIKKyNkZWZpbmUgQ0lQSEVSX0ZfYWVhZF9hZXNfY3RyX2htYWNfc2hhMjU2X29wZW4gMTMzCisjZGVmaW5lIENJUEhFUl9GX2FlYWRfYWVzX2N0cl9obWFjX3NoYTI1Nl9zZWFsIDEzNAogI2RlZmluZSBDSVBIRVJfUl9BRVNfS0VZX1NFVFVQX0ZBSUxFRCAxMDAKICNkZWZpbmUgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQgMTAxCiAjZGVmaW5lIENJUEhFUl9SX0JBRF9LRVlfTEVOR1RIIDEwMgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9jb25mLmggYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2NvbmYuaAppbmRleCBhMjc0MWE4Li44NGZjOTRmIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9vcGVuc3NsL2NvbmYuaAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2NvbmYuaApAQCAtMTM1LDYgKzEzNSwxMCBAQAogfSAgLyogZXh0ZXJuIEMgKi8KICNlbmRpZgogCisjZGVmaW5lIENPTkZfRl9DT05GX3BhcnNlX2xpc3QgMTAwCisjZGVmaW5lIENPTkZfRl9OQ09ORl9sb2FkIDEwMQorI2RlZmluZSBDT05GX0ZfZGVmX2xvYWRfYmlvIDEwMgorI2RlZmluZSBDT05GX0Zfc3RyX2NvcHkgMTAzCiAjZGVmaW5lIENPTkZfUl9MSVNUX0NBTk5PVF9CRV9OVUxMIDEwMAogI2RlZmluZSBDT05GX1JfTUlTU0lOR19DTE9TRV9TUVVBUkVfQlJBQ0tFVCAxMDEKICNkZWZpbmUgQ09ORl9SX01JU1NJTkdfRVFVQUxfU0lHTiAxMDIKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wZW5zc2wvY3B1LmggYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2NwdS5oCmluZGV4IDk4MWQyNDYuLjgzZWM0NzMgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wZW5zc2wvY3B1LmgKKysrIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9jcHUuaApAQCAtNzcsMTYgKzc3LDExIEBACiAgKgogICogICBJbmRleCAwOgogICogICAgIEVEWCBmb3IgQ1BVSUQgd2hlcmUgRUFYID0gMQotICogICAgIEJpdCAyMCBpcyBhbHdheXMgemVybwotICogICAgIEJpdCAyOCBpcyBhZGp1c3RlZCB0byByZWZsZWN0IHdoZXRoZXIgdGhlIGRhdGEgY2FjaGUgaXMgc2hhcmVkIGJldHdlZW4KLSAqICAgICAgIG11bHRpcGxlIGxvZ2ljYWwgY29yZXMKICAqICAgICBCaXQgMzAgaXMgdXNlZCB0byBpbmRpY2F0ZSBhbiBJbnRlbCBDUFUKICAqICAgSW5kZXggMToKICAqICAgICBFQ1ggZm9yIENQVUlEIHdoZXJlIEVBWCA9IDEKLSAqICAgICBCaXQgMTEgaXMgdXNlZCB0byBpbmRpY2F0ZSBBTUQgWE9QIHN1cHBvcnQsIG5vdCBTREJHCiAgKiAgIEluZGV4IDI6CiAgKiAgICAgRUJYIGZvciBDUFVJRCB3aGVyZSBFQVggPSA3Ci0gKiAgIEluZGV4IDMgaXMgc2V0IHRvIHplcm8uCiAgKgogICogTm90ZTogdGhlIENQVUlEIGJpdHMgYXJlIHByZS1hZGp1c3RlZCBmb3IgdGhlIE9TWFNBVkUgYml0IGFuZCB0aGUgWU1NIGFuZCBYTU0KICAqIGJpdHMgaW4gWENSMCwgc28gaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjaGVjayB0aG9zZS4gKi8KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmggYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2NyeXB0by5oCmluZGV4IDUyMDdhMTIuLjNhZjE1NDcgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmgKKysrIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9jcnlwdG8uaApAQCAtMjEsMTAgKzIxLDYgQEAKICAqIG1lbS5oLiAqLwogI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CiAKLS8qIFVwc3RyZWFtIE9wZW5TU0wgZGVmaW5lcyB8Q1JZUFRPX0xPQ0t8LCBldGMuLCBpbiBjcnlwdG8uaCByYXRoZXIgdGhhbgotICogdGhyZWFkLmguICovCi0jaW5jbHVkZSA8b3BlbnNzbC90aHJlYWQuaD4KLQogCiAjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKIGV4dGVybiAiQyIgewpAQCAtNTksNCArNTUsOSBAQAogfSAgLyogZXh0ZXJuIEMgKi8KICNlbmRpZgogCisjZGVmaW5lIENSWVBUT19GX0NSWVBUT19nZXRfZXhfbmV3X2luZGV4IDEwMAorI2RlZmluZSBDUllQVE9fRl9DUllQVE9fc2V0X2V4X2RhdGEgMTAxCisjZGVmaW5lIENSWVBUT19GX2dldF9jbGFzcyAxMDIKKyNkZWZpbmUgQ1JZUFRPX0ZfZ2V0X2Z1bmNfcG9pbnRlcnMgMTAzCisKICNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfQ1JZUFRPX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wZW5zc2wvZGVzLmggYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2Rlcy5oCmluZGV4IGY5ZGI2MmQuLjZlMWIwY2YgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wZW5zc2wvZGVzLmgKKysrIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9kZXMuaApAQCAtNzIsNyArNzIsMTIgQEAKIH0gREVTX2NibG9jazsKIAogdHlwZWRlZiBzdHJ1Y3QgREVTX2tzIHsKLSAgdWludDMyX3Qgc3Via2V5c1sxNl1bMl07CisgIHVuaW9uIHsKKyAgICBERVNfY2Jsb2NrIGNibG9jazsKKyAgICAvKiBtYWtlIHN1cmUgdGhpbmdzIGFyZSBjb3JyZWN0IHNpemUgb24gbWFjaGluZXMgd2l0aAorICAgICAqIDggYnl0ZSBsb25ncyAqLworICAgIHVpbnQzMl90IGRlc2xvbmdbMl07CisgIH0ga3NbMTZdOwogfSBERVNfa2V5X3NjaGVkdWxlOwogCiAKQEAgLTEzNywyNiArMTQyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTX2NibG9jayAqaXZlYywgaW50IGVuYyk7CiAKIAotLyogRGVwcmVjYXRlZCBmdW5jdGlvbnMuICovCi0KLS8qIERFU19zZXRfa2V5X3VuY2hlY2tlZCBjYWxscyB8REVTX3NldF9rZXl8LiAqLwotT1BFTlNTTF9FWFBPUlQgdm9pZCBERVNfc2V0X2tleV91bmNoZWNrZWQoY29uc3QgREVTX2NibG9jayAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTX2tleV9zY2hlZHVsZSAqc2NoZWR1bGUpOwotCi1PUEVOU1NMX0VYUE9SVCB2b2lkIERFU19lZGUzX2NmYjY0X2VuY3J5cHQoY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxlbmd0aCwgREVTX2tleV9zY2hlZHVsZSAqa3MxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU19rZXlfc2NoZWR1bGUgKmtzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNfa2V5X3NjaGVkdWxlICprczMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTX2NibG9jayAqaXZlYywgaW50ICpudW0sIGludCBlbmMpOwotCi1PUEVOU1NMX0VYUE9SVCB2b2lkIERFU19lZGUzX2NmYl9lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iaXRzLCBsb25nIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTX2tleV9zY2hlZHVsZSAqa3MxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNfa2V5X3NjaGVkdWxlICprczIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU19rZXlfc2NoZWR1bGUgKmtzMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTX2NibG9jayAqaXZlYywgaW50IGVuYyk7Ci0KLQogI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCiB9ICAvKiBleHRlcm4gQyAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcGVuc3NsL2RoLmggYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2RoLmgKaW5kZXggNzVkZjYzMi4uMTc1NzRkNSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9kaC5oCisrKyBiL3NyYy9pbmNsdWRlL29wZW5zc2wvZGguaApAQCAtMjM1LDcgKzIzNSw3IEBACiAKICAgQklHTlVNICpwOwogICBCSUdOVU0gKmc7Ci0gIEJJR05VTSAqcHViX2tleTsgIC8qIGdeeCBtb2QgcCAqLworICBCSUdOVU0gKnB1Yl9rZXk7ICAvKiBnXnggKi8KICAgQklHTlVNICpwcml2X2tleTsgLyogeCAqLwogCiAgIC8qIHByaXZfbGVuZ3RoIGNvbnRhaW5zIHRoZSBsZW5ndGgsIGluIGJpdHMsIG9mIHRoZSBwcml2YXRlIHZhbHVlLiBJZiB6ZXJvLApAQCAtMjYyLDYgKzI2MiwxMCBAQAogfSAgLyogZXh0ZXJuIEMgKi8KICNlbmRpZgogCisjZGVmaW5lIERIX0ZfREhfbmV3X21ldGhvZCAxMDAKKyNkZWZpbmUgREhfRl9jb21wdXRlX2tleSAxMDEKKyNkZWZpbmUgREhfRl9nZW5lcmF0ZV9rZXkgMTAyCisjZGVmaW5lIERIX0ZfZ2VuZXJhdGVfcGFyYW1ldGVycyAxMDMKICNkZWZpbmUgREhfUl9CQURfR0VORVJBVE9SIDEwMAogI2RlZmluZSBESF9SX0lOVkFMSURfUFVCS0VZIDEwMQogI2RlZmluZSBESF9SX01PRFVMVVNfVE9PX0xBUkdFIDEwMgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9kaWdlc3QuaCBiL3NyYy9pbmNsdWRlL29wZW5zc2wvZGlnZXN0LmgKaW5kZXggNjZiZTRkMC4uMmVhNGVjNCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9kaWdlc3QuaAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2RpZ2VzdC5oCkBAIC0yMzQsOSArMjM0LDE1IEBACiBzdHJ1Y3QgZW52X21kX2N0eF9zdCB7CiAgIC8qIGRpZ2VzdCBpcyB0aGUgdW5kZXJseWluZyBkaWdlc3QgZnVuY3Rpb24sIG9yIE5VTEwgaWYgbm90IHNldC4gKi8KICAgY29uc3QgRVZQX01EICpkaWdlc3Q7CisgIC8qIGZsYWdzIGlzIHRoZSBPUiBvZiBhIG51bWJlciBvZiB8RVZQX01EX0NUWF9GTEFHXyp8IHZhbHVlcy4gKi8KKyAgdWludDMyX3QgZmxhZ3M7CiAgIC8qIG1kX2RhdGEgcG9pbnRzIHRvIGEgYmxvY2sgb2YgbWVtb3J5IHRoYXQgY29udGFpbnMgdGhlIGhhc2gtc3BlY2lmaWMKICAgICogY29udGV4dC4gKi8KICAgdm9pZCAqbWRfZGF0YTsKKyAgLyogdXBkYXRlIGlzIHVzdWFsbHkgY29waWVkIGZyb20gfGRpZ2VzdC0+dXBkYXRlfCBidXQgY2FuIGRpZmZlciBpbiBzb21lCisgICAqIGNhc2VzLCBpLmUuIEhNQUMuCisgICAqIFRPRE8oZGF2aWRiZW4pOiBSZW1vdmUgdGhpcyBob29rIG9uY2UgfEVWUF9QS0VZX0hNQUN8IGlzIGdvbmUuICovCisgIHZvaWQgKCp1cGRhdGUpKEVWUF9NRF9DVFggKmN0eCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGNvdW50KTsKIAogICAvKiBwY3R4IGlzIGFuIG9wYXF1ZSAoYXQgdGhpcyBsYXllcikgcG9pbnRlciB0byBhZGRpdGlvbmFsIGNvbnRleHQgdGhhdAogICAgKiBFVlBfUEtFWSBmdW5jdGlvbnMgbWF5IHN0b3JlIGluIHRoaXMgb2JqZWN0LiAqLwpAQCAtMjUyLDYgKzI1OCw4IEBACiB9ICAvKiBleHRlcm4gQyAqLwogI2VuZGlmCiAKKyNkZWZpbmUgRElHRVNUX0ZfRVZQX0RpZ2VzdEluaXRfZXggMTAwCisjZGVmaW5lIERJR0VTVF9GX0VWUF9NRF9DVFhfY29weV9leCAxMDEKICNkZWZpbmUgRElHRVNUX1JfSU5QVVRfTk9UX0lOSVRJQUxJWkVEIDEwMAogCiAjZW5kaWYgIC8qIE9QRU5TU0xfSEVBREVSX0RJR0VTVF9IICovCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcGVuc3NsL2RzYS5oIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9kc2EuaAppbmRleCBiMWU3MzA5Li43Mjc0ZTRjIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9vcGVuc3NsL2RzYS5oCisrKyBiL3NyYy9pbmNsdWRlL29wZW5zc2wvZHNhLmgKQEAgLTM2Niw2ICszNjYsMTEgQEAKIH0gIC8qIGV4dGVybiBDICovCiAjZW5kaWYKIAorI2RlZmluZSBEU0FfRl9EU0FfbmV3X21ldGhvZCAxMDAKKyNkZWZpbmUgRFNBX0ZfZHNhX3NpZ19jYiAxMDEKKyNkZWZpbmUgRFNBX0Zfc2lnbiAxMDIKKyNkZWZpbmUgRFNBX0Zfc2lnbl9zZXR1cCAxMDMKKyNkZWZpbmUgRFNBX0ZfdmVyaWZ5IDEwNAogI2RlZmluZSBEU0FfUl9CQURfUV9WQUxVRSAxMDAKICNkZWZpbmUgRFNBX1JfTUlTU0lOR19QQVJBTUVURVJTIDEwMQogI2RlZmluZSBEU0FfUl9NT0RVTFVTX1RPT19MQVJHRSAxMDIKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wZW5zc2wvZWMuaCBiL3NyYy9pbmNsdWRlL29wZW5zc2wvZWMuaAppbmRleCBmNjY0MjExLi4yNWI0NTUxIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9vcGVuc3NsL2VjLmgKKysrIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9lYy5oCkBAIC0yMjAsNyArMjIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSUdOVU0gKngsIEJJR05VTSAqeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCk7CiAKLS8qIEVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwIHNldHMgdGhlIHZhbHVlIG9mIHxwfCB0byBiZSAofHh8LCB8eXwpLiBUaGUKKy8qIEVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXMgc2V0cyB0aGUgdmFsdWUgb2YgfHB8IHRvIGJlICh8eHwsIHx5fCkuIFRoZQogICogfGN0eHwgYXJndW1lbnQgbWF5IGJlIHVzZWQgaWYgbm90IE5VTEwuICovCiBPUEVOU1NMX0VYUE9SVCBpbnQgRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoY29uc3QgRUNfR1JPVVAgKmdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVDX1BPSU5UICpwb2ludCwKQEAgLTI2NSw3ICsyNjUsNyBAQAogT1BFTlNTTF9FWFBPUlQgaW50IEVDX1BPSU5UX2RibChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFQ19QT0lOVCAqYSwgQk5fQ1RYICpjdHgpOwogCi0vKiBFQ19QT0lOVF9pbnZlcnQgc2V0cyB8YXwgZXF1YWwgdG8gbWludXMgfGF8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvCisvKiBFQ19QT0lOVF9kYmwgc2V0cyB8YXwgZXF1YWwgdG8gbWludXMgfGF8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvCiAgKiBvdGhlcndpc2UuIElmIHxjdHh8IGlzIG5vdCBOVUxMLCBpdCBtYXkgYmUgdXNlZC4gKi8KIE9QRU5TU0xfRVhQT1JUIGludCBFQ19QT0lOVF9pbnZlcnQoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpOwpAQCAtMzM0LDYgKzMzNCw3MyBAQAogfSAgLyogZXh0ZXJuIEMgKi8KICNlbmRpZgogCisjZGVmaW5lIEVDX0ZfRUNfR1JPVVBfY29weSAxMDAKKyNkZWZpbmUgRUNfRl9FQ19HUk9VUF9nZXRfY3VydmVfR0ZwIDEwMQorI2RlZmluZSBFQ19GX0VDX0dST1VQX2dldF9kZWdyZWUgMTAyCisjZGVmaW5lIEVDX0ZfRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUgMTAzCisjZGVmaW5lIEVDX0ZfRUNfS0VZX2NoZWNrX2tleSAxMDQKKyNkZWZpbmUgRUNfRl9FQ19LRVlfY29weSAxMDUKKyNkZWZpbmUgRUNfRl9FQ19LRVlfZ2VuZXJhdGVfa2V5IDEwNgorI2RlZmluZSBFQ19GX0VDX0tFWV9uZXdfbWV0aG9kIDEwNworI2RlZmluZSBFQ19GX0VDX0tFWV9zZXRfcHVibGljX2tleV9hZmZpbmVfY29vcmRpbmF0ZXMgMTA4CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfYWRkIDEwOQorI2RlZmluZSBFQ19GX0VDX1BPSU5UX2NtcCAxMTAKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9jb3B5IDExMQorI2RlZmluZSBFQ19GX0VDX1BPSU5UX2RibCAxMTIKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9kdXAgMTEzCisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAgMTE0CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfaW52ZXJ0IDExNQorI2RlZmluZSBFQ19GX0VDX1BPSU5UX2lzX2F0X2luZmluaXR5IDExNgorI2RlZmluZSBFQ19GX0VDX1BPSU5UX2lzX29uX2N1cnZlIDExNworI2RlZmluZSBFQ19GX0VDX1BPSU5UX21ha2VfYWZmaW5lIDExOAorI2RlZmluZSBFQ19GX0VDX1BPSU5UX25ldyAxMTkKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9vY3QycG9pbnQgMTIwCisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfcG9pbnQyb2N0IDEyMQorI2RlZmluZSBFQ19GX0VDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwIDEyMgorI2RlZmluZSBFQ19GX0VDX1BPSU5UX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzX0dGcCAxMjMKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9zZXRfdG9faW5maW5pdHkgMTI0CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRzX21ha2VfYWZmaW5lIDEyNQorI2RlZmluZSBFQ19GX2NvbXB1dGVfd05BRiAxMjYKKyNkZWZpbmUgRUNfRl9kMmlfRUNQS1BhcmFtZXRlcnMgMTI3CisjZGVmaW5lIEVDX0ZfZDJpX0VDUGFyYW1ldGVycyAxMjgKKyNkZWZpbmUgRUNfRl9kMmlfRUNQcml2YXRlS2V5IDEyOQorI2RlZmluZSBFQ19GX2VjX0dGcF9tb250X2ZpZWxkX2RlY29kZSAxMzAKKyNkZWZpbmUgRUNfRl9lY19HRnBfbW9udF9maWVsZF9lbmNvZGUgMTMxCisjZGVmaW5lIEVDX0ZfZWNfR0ZwX21vbnRfZmllbGRfbXVsIDEzMgorI2RlZmluZSBFQ19GX2VjX0dGcF9tb250X2ZpZWxkX3NldF90b19vbmUgMTMzCisjZGVmaW5lIEVDX0ZfZWNfR0ZwX21vbnRfZmllbGRfc3FyIDEzNAorI2RlZmluZSBFQ19GX2VjX0dGcF9tb250X2dyb3VwX3NldF9jdXJ2ZSAxMzUKKyNkZWZpbmUgRUNfRl9lY19HRnBfc2ltcGxlX2dyb3VwX2NoZWNrX2Rpc2NyaW1pbmFudCAxMzYKKyNkZWZpbmUgRUNfRl9lY19HRnBfc2ltcGxlX2dyb3VwX3NldF9jdXJ2ZSAxMzcKKyNkZWZpbmUgRUNfRl9lY19HRnBfc2ltcGxlX21ha2VfYWZmaW5lIDEzOAorI2RlZmluZSBFQ19GX2VjX0dGcF9zaW1wbGVfb2N0MnBvaW50IDEzOQorI2RlZmluZSBFQ19GX2VjX0dGcF9zaW1wbGVfcG9pbnQyb2N0IDE0MAorI2RlZmluZSBFQ19GX2VjX0dGcF9zaW1wbGVfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcyAxNDEKKyNkZWZpbmUgRUNfRl9lY19HRnBfc2ltcGxlX3BvaW50X3NldF9hZmZpbmVfY29vcmRpbmF0ZXMgMTQyCisjZGVmaW5lIEVDX0ZfZWNfR0ZwX3NpbXBsZV9wb2ludHNfbWFrZV9hZmZpbmUgMTQzCisjZGVmaW5lIEVDX0ZfZWNfR0ZwX3NpbXBsZV9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlcyAxNDQKKyNkZWZpbmUgRUNfRl9lY19hc24xX2dyb3VwMnBrcGFyYW1ldGVycyAxNDUKKyNkZWZpbmUgRUNfRl9lY19hc24xX3BrcGFyYW1ldGVyczJncm91cCAxNDYKKyNkZWZpbmUgRUNfRl9lY19ncm91cF9uZXcgMTQ3CisjZGVmaW5lIEVDX0ZfZWNfZ3JvdXBfbmV3X2N1cnZlX0dGcCAxNDgKKyNkZWZpbmUgRUNfRl9lY19ncm91cF9uZXdfZnJvbV9kYXRhIDE0OQorI2RlZmluZSBFQ19GX2VjX3BvaW50X3NldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAgMTUwCisjZGVmaW5lIEVDX0ZfZWNfcHJlX2NvbXBfbmV3IDE1MQorI2RlZmluZSBFQ19GX2VjX3dOQUZfbXVsIDE1MgorI2RlZmluZSBFQ19GX2VjX3dOQUZfcHJlY29tcHV0ZV9tdWx0IDE1MworI2RlZmluZSBFQ19GX2kyZF9FQ1BLUGFyYW1ldGVycyAxNTQKKyNkZWZpbmUgRUNfRl9pMmRfRUNQYXJhbWV0ZXJzIDE1NQorI2RlZmluZSBFQ19GX2kyZF9FQ1ByaXZhdGVLZXkgMTU2CisjZGVmaW5lIEVDX0ZfaTJvX0VDUHVibGljS2V5IDE1NworI2RlZmluZSBFQ19GX28yaV9FQ1B1YmxpY0tleSAxNTgKKyNkZWZpbmUgRUNfRl9CTl90b19mZWxlbSAxNTkKKyNkZWZpbmUgRUNfRl9lY19HRnBfbmlzdHAyNTZfZ3JvdXBfc2V0X2N1cnZlIDE2MAorI2RlZmluZSBFQ19GX2VjX0dGcF9uaXN0cDI1Nl9wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzIDE2MQorI2RlZmluZSBFQ19GX2VjX0dGcF9uaXN0cDI1Nl9wb2ludHNfbXVsIDE2MgorI2RlZmluZSBFQ19GX2VjX2dyb3VwX2NvcHkgMTYzCisjZGVmaW5lIEVDX0ZfbmlzdHAyNTZfcHJlX2NvbXBfbmV3IDE2NAorI2RlZmluZSBFQ19GX0VDX0tFWV9uZXdfYnlfY3VydmVfbmFtZSAxNjUKKyNkZWZpbmUgRUNfRl9FQ19HUk9VUF9uZXdfY3VydmVfR0ZwIDE2NgogI2RlZmluZSBFQ19SX0JVRkZFUl9UT09fU01BTEwgMTAwCiAjZGVmaW5lIEVDX1JfQ09PUkRJTkFURVNfT1VUX09GX1JBTkdFIDEwMQogI2RlZmluZSBFQ19SX0QySV9FQ1BLUEFSQU1FVEVSU19GQUlMVVJFIDEwMgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9lY19rZXkuaCBiL3NyYy9pbmNsdWRlL29wZW5zc2wvZWNfa2V5LmgKaW5kZXggMWNkNGU2ZS4uZWU2NDAzMCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9lY19rZXkuaAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2VjX2tleS5oCkBAIC0xOTIsNyArMTkyLDcgQEAKIE9QRU5TU0xfRVhQT1JUIEVDX0tFWSAqZDJpX0VDUHJpdmF0ZUtleShFQ19LRVkgKipvdXRfa2V5LCBjb25zdCB1aW50OF90ICoqaW5wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGVuKTsKIAotLyogaTJkX0VDUHJpdmF0ZUtleSBtYXJzaGFscyBhbiBFQyBwcml2YXRlIGtleSBmcm9tIHxrZXl8IHRvIGFuIEFTTi4xLCBERVIKKy8qIGkyZF9FQ1BhcmFtZXRlcnMgbWFyc2hhbHMgYW4gRUMgcHJpdmF0ZSBrZXkgZnJvbSB8a2V5fCB0byBhbiBBU04uMSwgREVSCiAgKiBzdHJ1Y3R1cmUuIElmIHxvdXRwfCBpcyBub3QgTlVMTCB0aGVuIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0byB8Km91dHB8IGFuZAogICogfCpvdXRwfCBpcyBhZHZhbmNlZCBqdXN0IHBhc3QgdGhlIG91dHB1dC4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluCiAgKiB0aGUgcmVzdWx0LCB3aGV0aGVyIHdyaXR0ZW4gb3Igbm90LCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLiAqLwpAQCAtMjE1LDggKzIxNSw4IEBACiAKIC8qIG8yaV9FQ1B1YmxpY0tleSBwYXJzZXMgYW4gRUMgcG9pbnQgZnJvbSB8bGVufCBieXRlcyBhdCB8KmlucHwgaW50bwogICogfCpvdXRfa2V5fC4gTm90ZSB0aGF0IHRoaXMgZGlmZmVycyBmcm9tIHRoZSBkMmkgZm9ybWF0IGluIHRoYXQgfCpvdXRfa2V5fAotICogbXVzdCBiZSBub24tTlVMTCB3aXRoIGEgZ3JvdXAgc2V0LiBPbiBzdWNjZXNzZnVsIGV4aXQsIHwqaW5wfCBpcyBhZHZhbmNlZCBieQotICogfGxlbnwgYnl0ZXMuIEl0IHJldHVybnMgfCpvdXRfa2V5fCBvciBOVUxMIG9uIGVycm9yLiAqLworICogbXVzdCBiZSBub24tTlVMTC4gT24gc3VjY2Vzc2Z1bCBleGl0LCB8KmlucHwgaXMgYWR2YW5jZWQgcGFzdCB0aGUgREVSCisgKiBzdHJ1Y3R1cmUuIEl0IHJldHVybnMgfCpvdXRfa2V5fCBvciBOVUxMIG9uIGVycm9yLiAqLwogT1BFTlNTTF9FWFBPUlQgRUNfS0VZICpvMmlfRUNQdWJsaWNLZXkoRUNfS0VZICoqb3V0X2tleSwgY29uc3QgdWludDhfdCAqKmlucCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGVuKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9lY2RoLmggYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2VjZGguaAppbmRleCA4NzhjYmViLi4yN2E4NTc4IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9vcGVuc3NsL2VjZGguaAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2VjZGguaApAQCAtOTUsNiArOTUsNyBAQAogfSAgLyogZXh0ZXJuIEMgKi8KICNlbmRpZgogCisjZGVmaW5lIEVDREhfRl9FQ0RIX2NvbXB1dGVfa2V5IDEwMAogI2RlZmluZSBFQ0RIX1JfS0RGX0ZBSUxFRCAxMDAKICNkZWZpbmUgRUNESF9SX05PX1BSSVZBVEVfVkFMVUUgMTAxCiAjZGVmaW5lIEVDREhfUl9QT0lOVF9BUklUSE1FVElDX0ZBSUxVUkUgMTAyCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmggYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmgKaW5kZXggODQ3MDJjMy4uZTA0NTQ2MyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9lY2RzYS5oCisrKyBiL3NyYy9pbmNsdWRlL29wZW5zc2wvZWNkc2EuaApAQCAtMTQ4LDM0ICsxNDgsNiBAQAogCiAvKiBBU04uMSBmdW5jdGlvbnMuICovCiAKLS8qIEVDRFNBX1NJR19wYXJzZSBwYXJzZXMgYSBERVItZW5jb2RlZCBFQ0RTQS1TaWctVmFsdWUgc3RydWN0dXJlIGZyb20gfGNic3wgYW5kCi0gKiBhZHZhbmNlcyB8Y2JzfC4gSXQgcmV0dXJucyBhIG5ld2x5LWFsbG9jYXRlZCB8RUNEU0FfU0lHfCBvciBOVUxMIG9uIGVycm9yLiAqLwotT1BFTlNTTF9FWFBPUlQgRUNEU0FfU0lHICpFQ0RTQV9TSUdfcGFyc2UoQ0JTICpjYnMpOwotCi0vKiBFQ0RTQV9TSUdfZnJvbV9ieXRlcyBwYXJzZXMgfGlufCBhcyBhIERFUi1lbmNvZGVkIEVDRFNBLVNpZy1WYWx1ZSBzdHJ1Y3R1cmUuCi0gKiBJdCByZXR1cm5zIGEgbmV3bHktYWxsb2NhdGVkIHxFQ0RTQV9TSUd8IHN0cnVjdHVyZSBvciBOVUxMIG9uIGVycm9yLiAqLwotT1BFTlNTTF9FWFBPUlQgRUNEU0FfU0lHICpFQ0RTQV9TSUdfZnJvbV9ieXRlcyhjb25zdCB1aW50OF90ICppbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluX2xlbik7Ci0KLS8qIEVDRFNBX1NJR19tYXJzaGFsIG1hcnNoYWxzIHxzaWd8IGFzIGEgREVSLWVuY29kZWQgRUNEU0EtU2lnLVZhbHVlIGFuZCBhcHBlbmRzCi0gKiB0aGUgcmVzdWx0IHRvIHxjYmJ8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IEVDRFNBX1NJR19tYXJzaGFsKENCQiAqY2JiLCBjb25zdCBFQ0RTQV9TSUcgKnNpZyk7Ci0KLS8qIEVDRFNBX1NJR190b19hc24xIG1hcnNoYWxzIHxzaWd8IGFzIGEgREVSLWVuY29kZWQgRUNEU0EtU2lnLVZhbHVlIGFuZCwgb24KLSAqIHN1Y2Nlc3MsIHNldHMgfCpvdXRfYnl0ZXN8IHRvIGEgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBjb250YWluaW5nIHRoZSByZXN1bHQKLSAqIGFuZCByZXR1cm5zIG9uZS4gT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHplcm8uIFRoZSByZXN1bHQgc2hvdWxkIGJlIGZyZWVkIHdpdGgKLSAqIHxPUEVOU1NMX2ZyZWV8LiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IEVDRFNBX1NJR190b19ieXRlcyh1aW50OF90ICoqb3V0X2J5dGVzLCBzaXplX3QgKm91dF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVDRFNBX1NJRyAqc2lnKTsKLQotLyogRUNEU0FfU0lHX21heF9sZW4gcmV0dXJucyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBERVItZW5jb2RlZCBFQ0RTQS1TaWctVmFsdWUKLSAqIHN0cnVjdHVyZSBmb3IgYSBncm91cCB3aG9zZSBvcmRlciBpcyByZXByZXNlbnRlZCBpbiB8b3JkZXJfbGVufCBieXRlcywgb3IKLSAqIHplcm8gb24gb3ZlcmZsb3cuICovCi1PUEVOU1NMX0VYUE9SVCBzaXplX3QgRUNEU0FfU0lHX21heF9sZW4oc2l6ZV90IG9yZGVyX2xlbik7Ci0KLQotLyogRGVwcmVjYXRlZCBmdW5jdGlvbnMuICovCi0KIC8qIGQyaV9FQ0RTQV9TSUcgcGFyc2VzIGFuIEFTTi4xLCBERVItZW5jb2RlZCwgc2lnbmF0dXJlIGZyb20gfGxlbnwgYnl0ZXMgYXQKICAqIHwqaW5wfC4gSWYgfG91dHwgaXMgbm90IE5VTEwgdGhlbiwgb24gZXhpdCwgYSBwb2ludGVyIHRvIHRoZSByZXN1bHQgaXMgaW4KICAqIHwqb3V0fC4gSWYgfCpvdXR8IGlzIGFscmVhZHkgbm9uLU5VTEwgb24gZW50cnkgdGhlbiB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4KQEAgLTE5NiwxMSArMTY4LDE1IEBACiB9ICAvKiBleHRlcm4gQyAqLwogI2VuZGlmCiAKKyNkZWZpbmUgRUNEU0FfRl9FQ0RTQV9kb19zaWduX2V4IDEwMAorI2RlZmluZSBFQ0RTQV9GX0VDRFNBX2RvX3ZlcmlmeSAxMDEKKyNkZWZpbmUgRUNEU0FfRl9FQ0RTQV9zaWduX2V4IDEwMgorI2RlZmluZSBFQ0RTQV9GX2RpZ2VzdF90b19ibiAxMDMKKyNkZWZpbmUgRUNEU0FfRl9lY2RzYV9zaWduX3NldHVwIDEwNAogI2RlZmluZSBFQ0RTQV9SX0JBRF9TSUdOQVRVUkUgMTAwCiAjZGVmaW5lIEVDRFNBX1JfTUlTU0lOR19QQVJBTUVURVJTIDEwMQogI2RlZmluZSBFQ0RTQV9SX05FRURfTkVXX1NFVFVQX1ZBTFVFUyAxMDIKICNkZWZpbmUgRUNEU0FfUl9OT1RfSU1QTEVNRU5URUQgMTAzCiAjZGVmaW5lIEVDRFNBX1JfUkFORE9NX05VTUJFUl9HRU5FUkFUSU9OX0ZBSUxFRCAxMDQKLSNkZWZpbmUgRUNEU0FfUl9FTkNPREVfRVJST1IgMTA1CiAKICNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfRUNEU0FfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9lcnIuaCBiL3NyYy9pbmNsdWRlL29wZW5zc2wvZXJyLmgKaW5kZXggYzYxZTFlZi4uMzBkYzRhZiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9lcnIuaAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2Vyci5oCkBAIC0xMjYsMTEgKzEyNiwxMiBAQAogICoKICAqIEVhY2ggZXJyb3IgY29udGFpbnM6CiAgKiAgIDEpIFRoZSBsaWJyYXJ5IChpLmUuIGVjLCBwZW0sIHJzYSkgd2hpY2ggY3JlYXRlZCBpdC4KLSAqICAgMikgVGhlIGZ1bmN0aW9uLCBmaWxlLCBhbmQgbGluZSBudW1iZXIgb2YgdGhlIGNhbGwgdGhhdCBhZGRlZCB0aGUgZXJyb3IuCi0gKiAgIDMpIEEgcG9pbnRlciB0byBzb21lIGVycm9yIHNwZWNpZmljIGRhdGEsIHdoaWNoIG1heSBiZSBOVUxMLgorICogICAyKSBBIGZ1bmN0aW9uIGlkZW50aWZpZXIgYW5kIHJlYXNvbiBjb2RlLgorICogICAzKSBUaGUgZmlsZSBhbmQgbGluZSBudW1iZXIgb2YgdGhlIGNhbGwgdGhhdCBhZGRlZCB0aGUgZXJyb3IuCisgKiAgIDQpIEEgcG9pbnRlciB0byBzb21lIGVycm9yIHNwZWNpZmljIGRhdGEsIHdoaWNoIG1heSBiZSBOVUxMLgogICoKLSAqIFRoZSBsaWJyYXJ5IGlkZW50aWZpZXIgYW5kIHJlYXNvbiBjb2RlIGFyZSBwYWNrZWQgaW4gYSB1aW50MzJfdCBhbmQgdGhlcmUKLSAqIGV4aXN0IHZhcmlvdXMgZnVuY3Rpb25zIGZvciB1bnBhY2tpbmcgaXQuCisgKiBUaGUgbGlicmFyeSBpZGVudGlmaWVyLCBmdW5jdGlvbiBpZGVudGlmaWVyIGFuZCByZWFzb24gY29kZSBhcmUgcGFja2VkIGluIGEKKyAqIHVpbnQzMl90IGFuZCB0aGVyZSBleGlzdCB2YXJpb3VzIGZ1bmN0aW9ucyBmb3IgdW5wYWNraW5nIGl0LgogICoKICAqIFRoZSB0eXBpY2FsIGJlaGF2aW91ciBpcyB0aGF0IGFuIGVycm9yIHdpbGwgb2NjdXIgZGVlcCBpbiBhIGNhbGwgcXVldWUgYW5kCiAgKiB0aGF0IGNvZGUgd2lsbCBwdXNoIGFuIGVycm9yIG9udG8gdGhlIGVycm9yIHF1ZXVlLiBBcyB0aGUgZXJyb3IgcXVldWUKQEAgLTE4MywxMCArMTg0LDYgQEAKIE9QRU5TU0xfRVhQT1JUIHVpbnQzMl90IEVSUl9wZWVrX2Vycm9yX2xpbmVfZGF0YShjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipkYXRhLCBpbnQgKmZsYWdzKTsKIAotLyogRVJSX3BlZWtfZnVuY3Rpb24gcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gd2hpY2ggYWRkZWQgdGhlIGxlYXN0Ci0gKiByZWNlbnQgZXJyb3Igb3IgTlVMTCBpZiB0aGUgcXVldWUgaXMgZW1wdHkuICovCi1PUEVOU1NMX0VYUE9SVCBjb25zdCBjaGFyICpFUlJfcGVla19mdW5jdGlvbih2b2lkKTsKLQogLyogVGhlICJwZWVrIGxhc3QiIGZ1bmN0aW9ucyBhY3QgbGlrZSB0aGUgInBlZWsiIGZ1bmN0aW9ucywgYWJvdmUsIGV4Y2VwdCB0aGF0CiAgKiB0aGV5IHJldHVybiB0aGUgbW9zdCByZWNlbnQgZXJyb3IuICovCiBPUEVOU1NMX0VYUE9SVCB1aW50MzJfdCBFUlJfcGVla19sYXN0X2Vycm9yKHZvaWQpOwpAQCAtMjA1LDEwICsyMDIsMTAgQEAKICAqCiAgKiBUaGUgc3RyaW5nIHdpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIGZvcm1hdDoKICAqCi0gKiAgIGVycm9yOltlcnJvciBjb2RlXTpbbGlicmFyeSBuYW1lXTpPUEVOU1NMX2ludGVybmFsOltyZWFzb24gc3RyaW5nXQorICogICBlcnJvcjpbZXJyb3IgY29kZV06W2xpYnJhcnkgbmFtZV06W2Z1bmN0aW9uIG5hbWVdOltyZWFzb24gc3RyaW5nXQogICoKLSAqIGVycm9yIGNvZGUgaXMgYW4gOCBkaWdpdCBoZXhhZGVjaW1hbCBudW1iZXI7IGxpYnJhcnkgbmFtZSBhbmQgcmVhc29uIHN0cmluZwotICogYXJlIEFTQ0lJIHRleHQuCisgKiBlcnJvciBjb2RlIGlzIGFuIDggZGlnaXQgaGV4YWRlY2ltYWwgbnVtYmVyOyBsaWJyYXJ5IG5hbWUsIGZ1bmN0aW9uIG5hbWUKKyAqIGFuZCByZWFzb24gc3RyaW5nIGFyZSBBU0NJSSB0ZXh0LgogICoKICAqIFRPRE8oZm9yayk6IHJlbW92ZSBpbiBmYXZvdXIgb2YgfEVSUl9lcnJvcl9zdHJpbmdfbnwuICovCiBPUEVOU1NMX0VYUE9SVCBjaGFyICpFUlJfZXJyb3Jfc3RyaW5nKHVpbnQzMl90IHBhY2tlZF9lcnJvciwgY2hhciAqYnVmKTsKQEAgLTIyNSw2ICsyMjIsMTAgQEAKICAqIGdlbmVyYXRlZCB8cGFja2VkX2Vycm9yfC4gKi8KIE9QRU5TU0xfRVhQT1JUIGNvbnN0IGNoYXIgKkVSUl9saWJfZXJyb3Jfc3RyaW5nKHVpbnQzMl90IHBhY2tlZF9lcnJvcik7CiAKKy8qIEVSUl9mdW5jX2Vycm9yX3N0cmluZyByZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmdW5jdGlvbiB0aGF0CisgKiBnZW5lcmF0ZWQgfHBhY2tlZF9lcnJvcnwuICovCitPUEVOU1NMX0VYUE9SVCBjb25zdCBjaGFyICpFUlJfZnVuY19lcnJvcl9zdHJpbmcodWludDMyX3QgcGFja2VkX2Vycm9yKTsKKwogLyogRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcgcmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVhc29uIGZvcgogICogfHBhY2tlZF9lcnJvcnwuICovCiBPUEVOU1NMX0VYUE9SVCBjb25zdCBjaGFyICpFUlJfcmVhc29uX2Vycm9yX3N0cmluZyh1aW50MzJfdCBwYWNrZWRfZXJyb3IpOwpAQCAtMjU3LDExICsyNTgsMTEgQEAKIE9QRU5TU0xfRVhQT1JUIHZvaWQgRVJSX3ByaW50X2Vycm9yc19jYihFUlJfcHJpbnRfZXJyb3JzX2NhbGxiYWNrX3QgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY3R4KTsKIAorCiAvKiBFUlJfcHJpbnRfZXJyb3JzX2ZwIHByaW50cyB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgZXJyb3Igc3RhY2sgdG8gfGZpbGV8CiAgKiB1c2luZyBodW1hbiByZWFkYWJsZSBzdHJpbmdzIHdoZXJlIHBvc3NpYmxlLiAqLwogT1BFTlNTTF9FWFBPUlQgdm9pZCBFUlJfcHJpbnRfZXJyb3JzX2ZwKEZJTEUgKmZpbGUpOwogCi0KIC8qIENsZWFyaW5nIGVycm9ycy4gKi8KIAogLyogRVJSX2NsZWFyX2Vycm9yIGNsZWFycyB0aGUgZXJyb3IgcXVldWUgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4gKi8KQEAgLTI4Niw0MSArMjg3LDMwIEBACiAKIC8qIERlcHJlY2F0ZWQgZnVuY3Rpb25zLiAqLwogCi0vKiBFUlJfcmVtb3ZlX3N0YXRlIGNhbGxzIHxFUlJfY2xlYXJfZXJyb3J8LiAqLworLyogfEVSUl9yZW1vdmVfc3RhdGV8IGNhbGxzIHxFUlJfY2xlYXJfZXJyb3J8LiAqLwogT1BFTlNTTF9FWFBPUlQgdm9pZCBFUlJfcmVtb3ZlX3N0YXRlKHVuc2lnbmVkIGxvbmcgcGlkKTsKIAotLyogRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nIHJldHVybnMgdGhlIHN0cmluZyAiT1BFTlNTTF9pbnRlcm5hbCIuICovCi1PUEVOU1NMX0VYUE9SVCBjb25zdCBjaGFyICpFUlJfZnVuY19lcnJvcl9zdHJpbmcodWludDMyX3QgcGFja2VkX2Vycm9yKTsKLQogCiAvKiBQcml2YXRlIGZ1bmN0aW9ucy4gKi8KIAogLyogRVJSX2NsZWFyX3N5c3RlbV9lcnJvciBjbGVhcnMgdGhlIHN5c3RlbSdzIGVycm9yIHZhbHVlIChpLmUuIGVycm5vKS4gKi8KIE9QRU5TU0xfRVhQT1JUIHZvaWQgRVJSX2NsZWFyX3N5c3RlbV9lcnJvcih2b2lkKTsKIAotI2lmIGRlZmluZWQoT1BFTlNTTF9XSU5ET1dTKQotLyogVE9ETyhkYXZpZGJlbik6IFVzZSB8X19mdW5jX198IGRpcmVjdGx5IG9uY2UgdGhlIG1pbmltdW0gTVNWQyB2ZXJzaW9uCi0gKiBzdXBwb3J0cyBpdC4gKi8KLSNkZWZpbmUgT1BFTlNTTF9DVVJSRU5UX0ZVTkNUSU9OIF9fRlVOQ1RJT05fXwotI2Vsc2UKLSNkZWZpbmUgT1BFTlNTTF9DVVJSRU5UX0ZVTkNUSU9OIF9fZnVuY19fCi0jZW5kaWYKLQogLyogT1BFTlNTTF9QVVRfRVJST1IgaXMgdXNlZCBieSBPcGVuU1NMIGNvZGUgdG8gYWRkIGFuIGVycm9yIHRvIHRoZSBlcnJvcgogICogcXVldWUuICovCi0jZGVmaW5lIE9QRU5TU0xfUFVUX0VSUk9SKGxpYnJhcnksIHJlYXNvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBFUlJfcHV0X2Vycm9yKEVSUl9MSUJfIyNsaWJyYXJ5LCByZWFzb24sIE9QRU5TU0xfQ1VSUkVOVF9GVU5DVElPTiwgX19GSUxFX18sIFwKKyNkZWZpbmUgT1BFTlNTTF9QVVRfRVJST1IobGlicmFyeSwgZnVuYywgcmVhc29uKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVSUl9wdXRfZXJyb3IoRVJSX0xJQl8jI2xpYnJhcnksIGxpYnJhcnkjI19GXyMjZnVuYywgcmVhc29uLCBfX0ZJTEVfXywgXAogICAgICAgICAgICAgICAgIF9fTElORV9fKQogCiAvKiBPUEVOU1NMX1BVVF9TWVNURU1fRVJST1IgaXMgdXNlZCBieSBPcGVuU1NMIGNvZGUgdG8gYWRkIGFuIGVycm9yIGZyb20gdGhlCiAgKiBvcGVyYXRpbmcgc3lzdGVtIHRvIHRoZSBlcnJvciBxdWV1ZS4gKi8KIC8qIFRPRE8oZm9yayk6IGluY2x1ZGUgZXJybm8uICovCiAjZGVmaW5lIE9QRU5TU0xfUFVUX1NZU1RFTV9FUlJPUihmdW5jKSBcCi0gIEVSUl9wdXRfZXJyb3IoRVJSX0xJQl9TWVMsIDAsICNmdW5jLCBfX0ZJTEVfXywgX19MSU5FX18pOworICBFUlJfcHV0X2Vycm9yKEVSUl9MSUJfU1lTLCBTWVNfRl8jI2Z1bmMsIDAsIF9fRklMRV9fLCBfX0xJTkVfXyk7CiAKIC8qIEVSUl9wdXRfZXJyb3IgYWRkcyBhbiBlcnJvciB0byB0aGUgZXJyb3IgcXVldWUsIGRyb3BwaW5nIHRoZSBsZWFzdCByZWNlbnQKICAqIGVycm9yIGlmIG5lY2Nlc3NhcnkgZm9yIHNwYWNlIHJlYXNvbnMuICovCi1PUEVOU1NMX0VYUE9SVCB2b2lkIEVSUl9wdXRfZXJyb3IoaW50IGxpYnJhcnksIGludCByZWFzb24sIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLAorT1BFTlNTTF9FWFBPUlQgdm9pZCBFUlJfcHV0X2Vycm9yKGludCBsaWJyYXJ5LCBpbnQgZnVuYywgaW50IHJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCB1bnNpZ25lZCBsaW5lKTsKIAogLyogRVJSX2FkZF9lcnJvcl9kYXRhIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyICh8Y291bnR8KSBvZiBjb25zdCBjaGFyKgpAQCAtMzQzLDggKzMzMyw2IEBACiBPUEVOU1NMX0VYUE9SVCBpbnQgRVJSX3BvcF90b19tYXJrKHZvaWQpOwogCiBzdHJ1Y3QgZXJyX2Vycm9yX3N0IHsKLSAgLyogZnVuY3Rpb24gY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHdoZXJlIHRoZSBlcnJvciBvY2N1cmVkLiAqLwotICBjb25zdCBjaGFyICpmdW5jdGlvbjsKICAgLyogZmlsZSBjb250YWlucyB0aGUgZmlsZW5hbWUgd2hlcmUgdGhlIGVycm9yIG9jY3VyZWQuICovCiAgIGNvbnN0IGNoYXIgKmZpbGU7CiAgIC8qIGRhdGEgY29udGFpbnMgb3B0aW9uYWwgZGF0YS4gSXQgbXVzdCBiZSBmcmVlZCB3aXRoIHxPUEVOU1NMX2ZyZWV8IGlmCkBAIC00MzAsOCArNDE4LDggQEAKICAgRVJSX0xJQl9ITUFDLAogICBFUlJfTElCX0RJR0VTVCwKICAgRVJSX0xJQl9DSVBIRVIsCi0gIEVSUl9MSUJfSEtERiwKICAgRVJSX0xJQl9VU0VSLAorICBFUlJfTElCX0hLREYsCiAgIEVSUl9OVU1fTElCUwogfTsKIApAQCAtNDgxLDExICs0NjksMjIgQEAKICNkZWZpbmUgRVJSX1JfSU5URVJOQUxfRVJST1IgKDQgfCBFUlJfUl9GQVRBTCkKICNkZWZpbmUgRVJSX1JfT1ZFUkZMT1cgKDUgfCBFUlJfUl9GQVRBTCkKIAotI2RlZmluZSBFUlJfUEFDSyhsaWIsIHJlYXNvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKCgoKHVpbnQzMl90KWxpYikgJiAweGZmKSA8PCAyNCkgfCAoKCgodWludDMyX3QpcmVhc29uKSAmIDB4ZmZmKSkpCisvKiBTeXN0ZW0gZXJyb3IgZnVuY3Rpb25zICovCisjZGVmaW5lIFNZU19GX2ZvcGVuIDEwMAorI2RlZmluZSBTWVNfRl9mY2xvc2UgMTAxCisjZGVmaW5lIFNZU19GX2ZyZWFkIDEwMgorI2RlZmluZSBTWVNfRl9md3JpdGUgMTAzCisjZGVmaW5lIFNZU19GX3NvY2tldCAxMDQKKyNkZWZpbmUgU1lTX0Zfc2V0c29ja29wdCAxMDUKKyNkZWZpbmUgU1lTX0ZfY29ubmVjdCAxMDYKKyNkZWZpbmUgU1lTX0ZfZ2V0YWRkcmluZm8gMTA3CisKKyNkZWZpbmUgRVJSX1BBQ0sobGliLCBmdW5jLCByZWFzb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKCh1aW50MzJfdClsaWIpICYgMHhmZikgPDwgMjQpIHwgKCgoKHVpbnQzMl90KWZ1bmMpICYgMHhmZmYpIDw8IDEyKSB8IFwKKyAgICgoKCh1aW50MzJfdClyZWFzb24pICYgMHhmZmYpKSkKIAogI2RlZmluZSBFUlJfR0VUX0xJQihwYWNrZWRfZXJyb3IpICgoaW50KSgoKHBhY2tlZF9lcnJvcikgPj4gMjQpICYgMHhmZikpCi0jZGVmaW5lIEVSUl9HRVRfRlVOQyhwYWNrZWRfZXJyb3IpIDAKKyNkZWZpbmUgRVJSX0dFVF9GVU5DKHBhY2tlZF9lcnJvcikgKChpbnQpKCgocGFja2VkX2Vycm9yKSA+PiAxMikgJiAweGZmZikpCiAjZGVmaW5lIEVSUl9HRVRfUkVBU09OKHBhY2tlZF9lcnJvcikgKChpbnQpKChwYWNrZWRfZXJyb3IpICYgMHhmZmYpKQogCiAvKiBPUEVOU1NMX0RFQ0xBUkVfRVJST1JfUkVBU09OIGlzIHVzZWQgYnkgdXRpbC9tYWtlX2Vycm9ycy5oICh3aGljaCBnZW5lcmF0ZXMKQEAgLTQ5NSw2ICs0OTQsMTMgQEAKICAqICR7bGlifV9SXyR7cmVhc29ufS4gKi8KICNkZWZpbmUgT1BFTlNTTF9ERUNMQVJFX0VSUk9SX1JFQVNPTihsaWIsIHJlYXNvbikKIAorLyogT1BFTlNTTF9ERUNMQVJFX0VSUk9SX0ZVTkNUSU9OIGlzIHVzZWQgYnkgdXRpbC9tYWtlX2Vycm9ycy5oICh3aGljaAorICogZ2VuZXJhdGVzIHRoZSBlcnJvciAqIGRlZmluZXMgdG8gcmVjb2duaXNlIHRoYXQgYW4gYWRkaXRpb25hbCBmdW5jdGlvbiB2YWx1ZQorICogaXMgbmVlZGVkLiBUaGlzIGlzICogbmVlZGVkIHdoZW4gdGhlIGZ1bmN0aW9uIHZhbHVlIGlzIHVzZWQgb3V0c2lkZSBvZiBhbgorICogfE9QRU5TU0xfUFVUX0VSUk9SfCAqIG1hY3JvLiBUaGUgcmVzdWx0aW5nIGRlZmluZSB3aWxsIGJlCisgKiAke2xpYn1fRl8ke3JlYXNvbn0uICovCisjZGVmaW5lIE9QRU5TU0xfREVDTEFSRV9FUlJPUl9GVU5DVElPTihsaWIsIGZ1bmN0aW9uX25hbWUpCisKIAogI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCiB9IC8qIGV4dGVybiBDICovCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcGVuc3NsL2V2cC5oIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9ldnAuaAppbmRleCA5OWIxNDdlLi40OTBhOTUxIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9vcGVuc3NsL2V2cC5oCisrKyBiL3NyYy9pbmNsdWRlL29wZW5zc2wvZXZwLmgKQEAgLTY2LDcgKzY2LDYgQEAKICAqCiAgKiBUT0RPKGZvcmspOiBjbGVhbiB1cCBjYWxsZXJzIHNvIHRoYXQgdGhleSBpbmNsdWRlIHdoYXQgdGhleSB1c2UuICovCiAjaW5jbHVkZSA8b3BlbnNzbC9hZWFkLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9iYXNlNjQuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2NpcGhlci5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZGlnZXN0Lmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KQEAgLTEzNyw2ICsxMzYsMTQgQEAKICAqIHxFVlBfUEtFWV9SU0EyfCB3aWxsIGJlIHR1cm5lZCBpbnRvIHxFVlBfUEtFWV9SU0F8LiAqLwogT1BFTlNTTF9FWFBPUlQgaW50IEVWUF9QS0VZX3R5cGUoaW50IG5pZCk7CiAKKy8qIERlcHJlY2F0ZWQ6IEVWUF9QS0VZX25ld19tYWNfa2V5IGFsbG9jYXRlcyBhIGZyZXNoIHxFVlBfUEtFWXwgb2YgdGhlIGdpdmVuCisgKiB0eXBlIChlLmcuIHxFVlBfUEtFWV9ITUFDfCksIHNldHMgfG1hY19rZXl8IGFzIHRoZSBNQUMga2V5IGFuZCAiZ2VuZXJhdGVzIiBhCisgKiBuZXcga2V5LCBzdWl0YWJsZSBmb3Igc2lnbmluZy4gSXQgcmV0dXJucyB0aGUgZnJlc2ggfEVWUF9QS0VZfCwgb3IgTlVMTCBvbgorICogZXJyb3IuIFVzZSB8SE1BQ19DVFh8IGRpcmVjdGx5IGluc3RlYWQuICovCitPUEVOU1NMX0VYUE9SVCBFVlBfUEtFWSAqRVZQX1BLRVlfbmV3X21hY19rZXkoaW50IHR5cGUsIEVOR0lORSAqZW5naW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm1hY19rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1hY19rZXlfbGVuKTsKKwogCiAvKiBHZXR0aW5nIGFuZCBzZXR0aW5nIGNvbmNyZXRlIHB1YmxpYyBrZXkgdHlwZXMuCiAgKgpAQCAtMTcwLDYgKzE3Nyw5IEBACiAjZGVmaW5lIEVWUF9QS0VZX0RIWCBOSURfZGhwdWJsaWNudW1iZXIKICNkZWZpbmUgRVZQX1BLRVlfRUMgTklEX1g5XzYyX2lkX2VjUHVibGljS2V5CiAKKy8qIERlcHJlY2F0ZWQ6IFVzZSB8SE1BQ19DVFh8IGRpcmVjdGx5IGluc3RlYWQuICovCisjZGVmaW5lIEVWUF9QS0VZX0hNQUMgTklEX2htYWMKKwogLyogRVZQX1BLRVlfYXNzaWduIHNldHMgdGhlIHVuZGVybHlpbmcga2V5IG9mIHxwa2V5fCB0byB8a2V5fCwgd2hpY2ggbXVzdCBiZSBvZgogICogdGhlIGdpdmVuIHR5cGUuIFRoZSB8dHlwZXwgYXJndW1lbnQgc2hvdWxkIGJlIG9uZSBvZiB0aGUgfEVWUF9QS0VZXyp8CiAgKiB2YWx1ZXMuICovCkBAIC0yMTAsMTMgKzIyMCwxMCBAQAogICogdGhlIHJlc3VsdCwgd2hldGhlciB3cml0dGVuIG9yIG5vdCwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4gKi8KIE9QRU5TU0xfRVhQT1JUIGludCBpMmRfUHJpdmF0ZUtleShjb25zdCBFVlBfUEtFWSAqa2V5LCB1aW50OF90ICoqb3V0cCk7CiAKLS8qIGkyZF9QdWJsaWNLZXkgbWFyc2hhbHMgYSBwdWJsaWMga2V5IGZyb20gfGtleXwgdG8gYSB0eXBlLXNwZWNpZmljIGZvcm1hdC4KLSAqIElmIHxvdXRwfCBpcyBub3QgTlVMTCB0aGVuIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0byB8Km91dHB8IGFuZAorLyogaTJkX1B1YmxpY0tleSBtYXJzaGFscyBhIHB1YmxpYyBrZXkgZnJvbSB8a2V5fCB0byBhbiBBU04uMSwgREVSCisgKiBzdHJ1Y3R1cmUuIElmIHxvdXRwfCBpcyBub3QgTlVMTCB0aGVuIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0byB8Km91dHB8IGFuZAogICogfCpvdXRwfCBpcyBhZHZhbmNlZCBqdXN0IHBhc3QgdGhlIG91dHB1dC4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluCi0gKiB0aGUgcmVzdWx0LCB3aGV0aGVyIHdyaXR0ZW4gb3Igbm90LCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLgotICoKLSAqIFJTQSBrZXlzIGFyZSBzZXJpYWxpemVkIGFzIGEgREVSLWVuY29kZWQgUlNBUHVibGljS2V5IChSRkMgMzQ0Nykgc3RydWN0dXJlLgotICogRUMga2V5cyBhcmUgc2VyaWFsaXplZCBhcyBhbiBFQyBwb2ludCBwZXIgU0VDIDEuICovCisgKiB0aGUgcmVzdWx0LCB3aGV0aGVyIHdyaXR0ZW4gb3Igbm90LCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLiAqLwogT1BFTlNTTF9FWFBPUlQgaW50IGkyZF9QdWJsaWNLZXkoRVZQX1BLRVkgKmtleSwgdWludDhfdCAqKm91dHApOwogCiAKQEAgLTM3MCwxMiArMzc3LDEyIEBACiBPUEVOU1NMX0VYUE9SVCBpbnQgRVZQX1BLRVlfcHJpbnRfcHVibGljKEJJTyAqb3V0LCBjb25zdCBFVlBfUEtFWSAqcGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGVudCwgQVNOMV9QQ1RYICpwY3R4KTsKIAotLyogRVZQX1BLRVlfcHJpbnRfcHJpdmF0ZSBwcmludHMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcml2YXRlIGtleSBpbgorLyogRVZQX1BLRVlfcHJpbnRfcHVibGljIHByaW50cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByaXZhdGUga2V5IGluCiAgKiB8cGtleXwgdG8gfG91dHwuIFJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgemVybyBvdGhlcndpc2UuICovCiBPUEVOU1NMX0VYUE9SVCBpbnQgRVZQX1BLRVlfcHJpbnRfcHJpdmF0ZShCSU8gKm91dCwgY29uc3QgRVZQX1BLRVkgKnBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZW50LCBBU04xX1BDVFggKnBjdHgpOwogCi0vKiBFVlBfUEtFWV9wcmludF9wYXJhbXMgcHJpbnRzIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFyYW1ldGVycyBpbgorLyogRVZQX1BLRVlfcHJpbnRfcHVibGljIHByaW50cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhcmFtZXRlcnMgaW4KICAqIHxwa2V5fCB0byB8b3V0fC4gUmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciB6ZXJvIG90aGVyd2lzZS4gKi8KIE9QRU5TU0xfRVhQT1JUIGludCBFVlBfUEtFWV9wcmludF9wYXJhbXMoQklPICpvdXQsIGNvbnN0IEVWUF9QS0VZICpwa2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZW50LCBBU04xX1BDVFggKnBjdHgpOwpAQCAtNDEyLDEzICs0MTksMTMgQEAKICAqIHJldHVybnMgdGhlIGNvbnRleHQgb3IgTlVMTCBvbiBlcnJvci4gKi8KIE9QRU5TU0xfRVhQT1JUIEVWUF9QS0VZX0NUWCAqRVZQX1BLRVlfQ1RYX25ldyhFVlBfUEtFWSAqcGtleSwgRU5HSU5FICplKTsKIAotLyogRVZQX1BLRVlfQ1RYX25ld19pZCBhbGxvY2F0ZXMgYSBmcmVzaCB8RVZQX1BLRVlfQ1RYfCBmb3IgYSBrZXkgb2YgdHlwZSB8aWR8CisvKiBFVlBfUEtFWV9DVFhfbmV3IGFsbG9jYXRlcyBhIGZyZXNoIHxFVlBfUEtFWV9DVFh8IGZvciBhIGtleSBvZiB0eXBlIHxpZHwKICAqIChlLmcuIHxFVlBfUEtFWV9ITUFDfCkuIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGtleSBnZW5lcmF0aW9uIHdoZXJlCiAgKiB8RVZQX1BLRVlfQ1RYX25ld3wgY2FuJ3QgYmUgdXNlZCBiZWNhdXNlIHRoZXJlIGlzbid0IGFuIHxFVlBfUEtFWXwgdG8gcGFzcwogICogaXQuIEl0IHJldHVybnMgdGhlIGNvbnRleHQgb3IgTlVMTCBvbiBlcnJvci4gKi8KIE9QRU5TU0xfRVhQT1JUIEVWUF9QS0VZX0NUWCAqRVZQX1BLRVlfQ1RYX25ld19pZChpbnQgaWQsIEVOR0lORSAqZSk7CiAKLS8qIEVWUF9QS0VZX0NUWF9mcmVlIGZyZWVzIHxjdHh8IGFuZCB0aGUgZGF0YSBpdCBvd25zLiAqLworLyogRVZQX0tFWV9DVFhfZnJlZSBmcmVlcyB8Y3R4fCBhbmQgdGhlIGRhdGEgaXQgb3ducy4gKi8KIE9QRU5TU0xfRVhQT1JUIHZvaWQgRVZQX1BLRVlfQ1RYX2ZyZWUoRVZQX1BLRVlfQ1RYICpjdHgpOwogCiAvKiBFVlBfUEtFWV9DVFhfZHVwIGFsbG9jYXRlcyBhIGZyZXNoIHxFVlBfUEtFWV9DVFh8IGFuZCBzZXRzIGl0IGVxdWFsIHRvIHRoZQpAQCAtNjQzLDYgKzY1MCwxNyBAQAogCiAvKiBEZXByZWNhdGVkIGZ1bmN0aW9ucy4gKi8KIAorLyogRVZQX1BLRVlfZHVwIGFkZHMgb25lIHRvIHRoZSByZWZlcmVuY2UgY291bnQgb2YgfHBrZXl8IGFuZCByZXR1cm5zCisgKiB8cGtleXwuCisgKgorICogV0FSTklORzogdGhpcyBpcyBhIHxfZHVwfCBmdW5jdGlvbiB0aGF0IGRvZXNuJ3QgYWN0dWFsbHkgZHVwbGljYXRlISBVc2UKKyAqIHxFVlBfUEtFWV91cF9yZWZ8IGlmIHlvdSB3YW50IHRvIGluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IHdpdGhvdXQKKyAqIGNvbmZ1c2lvbi4gKi8KK09QRU5TU0xfRVhQT1JUIEVWUF9QS0VZICpFVlBfUEtFWV9kdXAoRVZQX1BLRVkgKnBrZXkpOworCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zICovCisKIC8qIE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zIGRvZXMgbm90aGluZy4gKi8KIE9QRU5TU0xfRVhQT1JUIHZvaWQgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXModm9pZCk7CiAKQEAgLTY1NSw5ICs2NzMsNiBAQAogLyogRVZQX2NsZWFudXAgZG9lcyBub3RoaW5nLiAqLwogT1BFTlNTTF9FWFBPUlQgdm9pZCBFVlBfY2xlYW51cCh2b2lkKTsKIAotCi0vKiBQcml2YXRlIGZ1bmN0aW9ucyAqLwotCiAvKiBFVlBfUEtFWV9hc24xX2ZpbmQgcmV0dXJucyB0aGUgQVNOLjEgbWV0aG9kIHRhYmxlIGZvciB0aGUgZ2l2ZW4gfG5pZHwsIHdoaWNoCiAgKiBzaG91bGQgYmUgb25lIG9mIHRoZSB8RVZQX1BLRVlfKnwgdmFsdWVzLiBJdCByZXR1cm5zIE5VTEwgaWYgfG5pZHwgaXMKICAqIHVua25vd24uICovCkBAIC02NzcsMTAgKzY5MiwxMCBAQAogCiAgIHVuaW9uIHsKICAgICBjaGFyICpwdHI7Ci0gICAgUlNBICpyc2E7Ci0gICAgRFNBICpkc2E7Ci0gICAgREggKmRoOwotICAgIEVDX0tFWSAqZWM7CisgICAgc3RydWN0IHJzYV9zdCAqcnNhOyAvKiBSU0EgKi8KKyAgICBzdHJ1Y3QgZHNhX3N0ICpkc2E7IC8qIERTQSAqLworICAgIHN0cnVjdCBkaF9zdCAqZGg7IC8qIERIICovCisgICAgc3RydWN0IGVjX2tleV9zdCAqZWM7IC8qIEVDQyAqLwogICB9IHBrZXk7CiAKICAgLyogYW1ldGggY29udGFpbnMgYSBwb2ludGVyIHRvIGEgbWV0aG9kIHRhYmxlIHRoYXQgY29udGFpbnMgbWFueSBBU04uMQpAQCAtNjkzLDYgKzcwOCw3NCBAQAogfSAgLyogZXh0ZXJuIEMgKi8KICNlbmRpZgogCisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX2Rlcml2ZV9pbml0IDEwOAorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9lbmNyeXB0IDExMAorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9lbmNyeXB0X2luaXQgMTExCisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX2dldDFfREggMTEyCisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX2dldDFfRUNfS0VZIDExNAorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9nZXQxX1JTQSAxMTUKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfa2V5Z2VuIDExNgorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9zaWduIDEyMAorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9zaWduX2luaXQgMTIxCisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX3ZlcmlmeSAxMjIKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfdmVyaWZ5X2luaXQgMTIzCisjZGVmaW5lIEVWUF9GX2QyaV9BdXRvUHJpdmF0ZUtleSAxMjUKKyNkZWZpbmUgRVZQX0ZfZDJpX1ByaXZhdGVLZXkgMTI2CisjZGVmaW5lIEVWUF9GX2RvX0VDX0tFWV9wcmludCAxMjcKKyNkZWZpbmUgRVZQX0ZfZG9fc2lndmVyX2luaXQgMTI5CisjZGVmaW5lIEVWUF9GX2Vja2V5X3BhcmFtMnR5cGUgMTMwCisjZGVmaW5lIEVWUF9GX2Vja2V5X3BhcmFtX2RlY29kZSAxMzEKKyNkZWZpbmUgRVZQX0ZfZWNrZXlfcHJpdl9kZWNvZGUgMTMyCisjZGVmaW5lIEVWUF9GX2Vja2V5X3ByaXZfZW5jb2RlIDEzMworI2RlZmluZSBFVlBfRl9lY2tleV9wdWJfZGVjb2RlIDEzNAorI2RlZmluZSBFVlBfRl9lY2tleV9wdWJfZW5jb2RlIDEzNQorI2RlZmluZSBFVlBfRl9lY2tleV90eXBlMnBhcmFtIDEzNgorI2RlZmluZSBFVlBfRl9ldnBfcGtleV9jdHhfbmV3IDEzNworI2RlZmluZSBFVlBfRl9obWFjX3NpZ25jdHggMTM4CisjZGVmaW5lIEVWUF9GX2kyZF9QdWJsaWNLZXkgMTM5CisjZGVmaW5lIEVWUF9GX29sZF9lY19wcml2X2RlY29kZSAxNDAKKyNkZWZpbmUgRVZQX0Zfb2xkX3JzYV9wcml2X2RlY29kZSAxNDEKKyNkZWZpbmUgRVZQX0ZfcGtleV9lY19jdHJsIDE0MgorI2RlZmluZSBFVlBfRl9wa2V5X2VjX2Rlcml2ZSAxNDMKKyNkZWZpbmUgRVZQX0ZfcGtleV9lY19rZXlnZW4gMTQ0CisjZGVmaW5lIEVWUF9GX3BrZXlfZWNfcGFyYW1nZW4gMTQ1CisjZGVmaW5lIEVWUF9GX3BrZXlfZWNfc2lnbiAxNDYKKyNkZWZpbmUgRVZQX0ZfcGtleV9yc2FfY3RybCAxNDcKKyNkZWZpbmUgRVZQX0ZfcGtleV9yc2FfZGVjcnlwdCAxNDgKKyNkZWZpbmUgRVZQX0ZfcGtleV9yc2FfZW5jcnlwdCAxNDkKKyNkZWZpbmUgRVZQX0ZfcGtleV9yc2Ffc2lnbiAxNTAKKyNkZWZpbmUgRVZQX0ZfcnNhX2FsZ29yX3RvX21kIDE1MQorI2RlZmluZSBFVlBfRl9yc2FfZGlnZXN0X3ZlcmlmeV9pbml0X2Zyb21fYWxnb3JpdGhtIDE1MgorI2RlZmluZSBFVlBfRl9yc2FfbWdmMV90b19tZCAxNTMKKyNkZWZpbmUgRVZQX0ZfcnNhX3ByaXZfZGVjb2RlIDE1NAorI2RlZmluZSBFVlBfRl9yc2FfcHJpdl9lbmNvZGUgMTU1CisjZGVmaW5lIEVWUF9GX3JzYV9wc3NfdG9fY3R4IDE1NgorI2RlZmluZSBFVlBfRl9yc2FfcHViX2RlY29kZSAxNTcKKyNkZWZpbmUgRVZQX0ZfcGtleV9obWFjX2N0cmwgMTU4CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX0NUWF9nZXQwX3JzYV9vYWVwX2xhYmVsIDE1OQorI2RlZmluZSBFVlBfRl9FVlBfRGlnZXN0U2lnbkFsZ29yaXRobSAxNjAKKyNkZWZpbmUgRVZQX0ZfRVZQX0RpZ2VzdFZlcmlmeUluaXRGcm9tQWxnb3JpdGhtIDE2MQorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9DVFhfY3RybCAxNjIKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfQ1RYX2R1cCAxNjMKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfY29weV9wYXJhbWV0ZXJzIDE2NAorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9kZWNyeXB0IDE2NQorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9kZWNyeXB0X2luaXQgMTY2CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX2Rlcml2ZSAxNjcKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfZGVyaXZlX3NldF9wZWVyIDE2OAorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9nZXQxX0RTQSAxNjkKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfa2V5Z2VuX2luaXQgMTcwCisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX25ldyAxNzEKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfc2V0X3R5cGUgMTcyCisjZGVmaW5lIEVWUF9GX2NoZWNrX3BhZGRpbmdfbWQgMTczCisjZGVmaW5lIEVWUF9GX2RvX2RzYV9wcmludCAxNzQKKyNkZWZpbmUgRVZQX0ZfZG9fcnNhX3ByaW50IDE3NQorI2RlZmluZSBFVlBfRl9kc2FfcGFyYW1fZGVjb2RlIDE3NgorI2RlZmluZSBFVlBfRl9kc2FfcHJpdl9kZWNvZGUgMTc3CisjZGVmaW5lIEVWUF9GX2RzYV9wcml2X2VuY29kZSAxNzgKKyNkZWZpbmUgRVZQX0ZfZHNhX3B1Yl9kZWNvZGUgMTc5CisjZGVmaW5lIEVWUF9GX2RzYV9wdWJfZW5jb2RlIDE4MAorI2RlZmluZSBFVlBfRl9kc2Ffc2lnX3ByaW50IDE4MQorI2RlZmluZSBFVlBfRl9vbGRfZHNhX3ByaXZfZGVjb2RlIDE4MgogI2RlZmluZSBFVlBfUl9CVUZGRVJfVE9PX1NNQUxMIDEwMAogI2RlZmluZSBFVlBfUl9DT01NQU5EX05PVF9TVVBQT1JURUQgMTAxCiAjZGVmaW5lIEVWUF9SX0RJRkZFUkVOVF9LRVlfVFlQRVMgMTA0CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcGVuc3NsL2V4X2RhdGEuaCBiL3NyYy9pbmNsdWRlL29wZW5zc2wvZXhfZGF0YS5oCmluZGV4IGMwZDM3NzMuLjIzMDNlYjQgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wZW5zc2wvZXhfZGF0YS5oCisrKyBiL3NyYy9pbmNsdWRlL29wZW5zc2wvZXhfZGF0YS5oCkBAIC0xMzQsNyArMTM0LDcgQEAKIAogI2lmIDAgLyogU2FtcGxlICovCiAKLS8qIFRZUEVfZ2V0X2V4X25ld19pbmRleCBhbGxvY2F0ZXMgYSBuZXcgaW5kZXggZm9yIHxUWVBFfC4gU2VlIHRoZQorLyogfFRZUEVfZ2V0X2V4X25ld19pbmRleHwgYWxsb2NhdGVzIGEgbmV3IGluZGV4IGZvciB8VFlQRXwuIFNlZSB0aGUKICAqIGRlc2NyaXB0aW9ucyBvZiB0aGUgY2FsbGJhY2sgdHlwZWRlZnMgZm9yIGRldGFpbHMgb2Ygd2hlbiB0aGV5IGFyZQogICogY2FsbGVkLiBBbnkgb2YgdGhlIGNhbGxiYWNrIGFyZ3VtZW50cyBtYXkgYmUgTlVMTC4gVGhlIHxhcmdsfCBhbmQgfGFyZ3B8CiAgKiBhcmd1bWVudHMgYXJlIG9wYXF1ZSB2YWx1ZXMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFja3MuIEl0IHJldHVybnMgdGhlCkBAIC0xNDYsMTEgKzE0NiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYyk7CiAKLS8qIFRZUEVfc2V0X2V4X2RhdGEgc2V0cyBhbiBleHRyYSBkYXRhIHBvaW50ZXIgb24gfHR8LiBUaGUgfGluZGV4fCBhcmd1bWVudAorLyogfFRZUEVfc2V0X2V4X2RhdGF8IHNldHMgYW4gZXh0cmEgZGF0YSBwb2ludGVyIG9uIHx0fC4gVGhlIHxpbmRleHwgYXJndW1lbnQKICAqIHNob3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQgZnJvbSBhIHByZXZpb3VzIGNhbGwgdG8gfFRZUEVfZ2V0X2V4X25ld19pbmRleHwuICovCiBPUEVOU1NMX0VYUE9SVCBpbnQgVFlQRV9zZXRfZXhfZGF0YShUWVBFICp0LCBpbnQgaW5kZXgsIHZvaWQgKmFyZyk7CiAKLS8qIFRZUEVfZ2V0X2V4X2RhdGEgcmV0dXJucyBhbiBleHRyYSBkYXRhIHBvaW50ZXIgZm9yIHx0fCwgb3IgTlVMTCBpZiBubyBzdWNoCisvKiB8VFlQRV9nZXRfZXhfZGF0YXwgcmV0dXJucyBhbiBleHRyYSBkYXRhIHBvaW50ZXIgZm9yIHx0fCwgb3IgTlVMTCBpZiBubyBzdWNoCiAgKiBwb2ludGVyIGV4aXN0cy4gVGhlIHxpbmRleHwgYXJndW1lbnQgc2hvdWxkIGhhdmUgYmVlbiByZXR1cm5lZCBmcm9tIGEKICAqIHByZXZpb3VzIGNhbGwgdG8gfFRZUEVfZ2V0X2V4X25ld19pbmRleHwuICovCiBPUEVOU1NMX0VYUE9SVCB2b2lkICpUWVBFX2dldF9leF9kYXRhKGNvbnN0IFRZUEUgKnQsIGludCBpbmRleCk7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcGVuc3NsL2hrZGYuaCBiL3NyYy9pbmNsdWRlL29wZW5zc2wvaGtkZi5oCmluZGV4IGI3YTBkYzIuLjQwOTFiODQgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wZW5zc2wvaGtkZi5oCisrKyBiL3NyYy9pbmNsdWRlL29wZW5zc2wvaGtkZi5oCkBAIC0zOSw2ICszOSw3IEBACiB9ICAvKiBleHRlcm4gQyAqLwogI2VuZGlmCiAKKyNkZWZpbmUgSEtERl9GX0hLREYgMTAwCiAjZGVmaW5lIEhLREZfUl9PVVRQVVRfVE9PX0xBUkdFIDEwMAogCiAjZW5kaWYgIC8qIE9QRU5TU0xfSEVBREVSX0hLREZfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9saGFzaC5oIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9saGFzaC5oCmluZGV4IDY5MWIyNDcuLmQyZWU5ODIgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wZW5zc2wvbGhhc2guaAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL2xoYXNoLmgKQEAgLTEsNSArMSw0IEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgogICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9tZDQuaCBiL3NyYy9pbmNsdWRlL29wZW5zc2wvbWQ0LmgKaW5kZXggMWRiNzQ5OS4uY2U0ZmE5OSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9tZDQuaAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL21kNC5oCkBAIC0xLDUgKzEsNCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KICAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KQEAgLTcyLDcgKzcxLDcgQEAKIC8qIE1ENF9ESUdFU1RfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgYW4gTUQ0IGRpZ2VzdC4gKi8KICNkZWZpbmUgTUQ0X0RJR0VTVF9MRU5HVEggMTYKIAotLyogTUQ0X0luaXQgaW5pdGlhbGlzZXMgfG1kNHwgYW5kIHJldHVybnMgb25lLiAqLworLyogTUQ0MV9Jbml0IGluaXRpYWxpc2VzIHxtZDR8IGFuZCByZXR1cm5zIG9uZS4gKi8KIE9QRU5TU0xfRVhQT1JUIGludCBNRDRfSW5pdChNRDRfQ1RYICptZDQpOwogCiAvKiBNRDRfVXBkYXRlIGFkZHMgfGxlbnwgYnl0ZXMgZnJvbSB8ZGF0YXwgdG8gfG1kNHwgYW5kIHJldHVybnMgb25lLiAqLwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9tZDUuaCBiL3NyYy9pbmNsdWRlL29wZW5zc2wvbWQ1LmgKaW5kZXggOWIxMzkyMi4uZWZlZGM5OCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9tZDUuaAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL21kNS5oCkBAIC0xLDUgKzEsNCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KICAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KQEAgLTczLDcgKzcyLDcgQEAKIC8qIE1ENV9ESUdFU1RfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgYW4gTUQ1IGRpZ2VzdC4gKi8KICNkZWZpbmUgTUQ1X0RJR0VTVF9MRU5HVEggMTYKIAotLyogTUQ1X0luaXQgaW5pdGlhbGlzZXMgfG1kNXwgYW5kIHJldHVybnMgb25lLiAqLworLyogTUQ1MV9Jbml0IGluaXRpYWxpc2VzIHxtZDV8IGFuZCByZXR1cm5zIG9uZS4gKi8KIE9QRU5TU0xfRVhQT1JUIGludCBNRDVfSW5pdChNRDVfQ1RYICptZDUpOwogCiAvKiBNRDVfVXBkYXRlIGFkZHMgfGxlbnwgYnl0ZXMgZnJvbSB8ZGF0YXwgdG8gfG1kNXwgYW5kIHJldHVybnMgb25lLiAqLwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9tZW0uaCBiL3NyYy9pbmNsdWRlL29wZW5zc2wvbWVtLmgKaW5kZXggYzhlMmIzZS4uNDJlYzQ2YSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9tZW0uaAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL21lbS5oCkBAIC0xLDUgKzEsNCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KICAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wZW5zc2wvb2JqLmggYi9zcmMvaW5jbHVkZS9vcGVuc3NsL29iai5oCmluZGV4IDBjN2FlNjAuLmY0NzY2MTcgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wZW5zc2wvb2JqLmgKKysrIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9vYmouaApAQCAtMTI4LDcgKzEyOCw3IEBACiAvKiBPQkpfbmlkMnNuIHJldHVybnMgdGhlIGxvbmcgbmFtZSBmb3IgfG5pZHwsIG9yIE5VTEwgaWYgfG5pZHwgaXMgdW5rbm93bi4gKi8KIE9QRU5TU0xfRVhQT1JUIGNvbnN0IGNoYXIgKk9CSl9uaWQybG4oaW50IG5pZCk7CiAKLS8qIE9CSl9uaWQyY2JiIHdyaXRlcyB8bmlkfCBhcyBhbiBBU04uMSBPQkpFQ1QgSURFTlRJRklFUiB0byB8b3V0fC4gSXQgcmV0dXJucworLyogT0JKX25pZDJjYnMgd3JpdGVzIHxuaWR8IGFzIGFuIEFTTi4xIE9CSkVDVCBJREVOVElGSUVSIHRvIHxvdXR8LiBJdCByZXR1cm5zCiAgKiBvbmUgb24gc3VjY2VzcyBvciB6ZXJvIG90aGVyd2lzZS4gKi8KIE9QRU5TU0xfRVhQT1JUIGludCBPQkpfbmlkMmNiYihDQkIgKm91dCwgaW50IG5pZCk7CiAKQEAgLTE5Myw2ICsxOTMsMTAgQEAKIH0gIC8qIGV4dGVybiBDICovCiAjZW5kaWYKIAorI2RlZmluZSBPQkpfRl9PQkpfY3JlYXRlIDEwMAorI2RlZmluZSBPQkpfRl9PQkpfZHVwIDEwMQorI2RlZmluZSBPQkpfRl9PQkpfbmlkMm9iaiAxMDIKKyNkZWZpbmUgT0JKX0ZfT0JKX3R4dDJvYmogMTAzCiAjZGVmaW5lIE9CSl9SX1VOS05PV05fTklEIDEwMAogCiAjZW5kaWYgIC8qIE9QRU5TU0xfSEVBREVSX09CSkVDVFNfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9wZW0uaCBiL3NyYy9pbmNsdWRlL29wZW5zc2wvcGVtLmgKaW5kZXggZGI3NjNkNS4uNzc1NmU0NSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9wZW0uaAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL3BlbS5oCkBAIC00MTAsNyArNDEwLDcgQEAKIE9QRU5TU0xfRVhQT1JUIHZvaWQgICAgUEVNX1NpZ25VcGRhdGUoRVZQX01EX0NUWCAqY3R4LHVuc2lnbmVkIGNoYXIgKmQsdW5zaWduZWQgaW50IGNudCk7CiBPUEVOU1NMX0VYUE9SVCBpbnQJUEVNX1NpZ25GaW5hbChFVlBfTURfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKnNpZ3JldCwgdW5zaWduZWQgaW50ICpzaWdsZW4sIEVWUF9QS0VZICpwa2V5KTsKIAotLyogUEVNX2RlZl9jYWxsYmFjayB0cmVhdHMgfHVzZXJkYXRhfCBhcyBhIHN0cmluZyBhbmQgY29waWVzIGl0IGludG8gfGJ1ZnwsCisvKiB8UEVNX2RlZl9jYWxsYmFja3wgdHJlYXRzIHx1c2VyZGF0YXwgYXMgYSBzdHJpbmcgYW5kIGNvcGllcyBpdCBpbnRvIHxidWZ8LAogICogYXNzdW1pbmcgaXRzIHxzaXplfCBpcyBzdWZmaWNpZW50LiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZywgb3IgMAogICogaWYgdGhlcmUgaXMgbm90IGVub3VnaCByb29tLiBJZiBlaXRoZXIgfGJ1Znwgb3IgfHVzZXJkYXRhfCBpcyBOVUxMLCAwIGlzCiAgKiByZXR1cm5lZC4gTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gT3BlblNTTCwgd2hpY2ggcHJvbXB0cyBmb3IgYQpAQCAtNTAyLDYgKzUwMiwzMCBAQAogfQogI2VuZGlmCiAKKyNkZWZpbmUgUEVNX0ZfUEVNX0FTTjFfcmVhZCAxMDAKKyNkZWZpbmUgUEVNX0ZfUEVNX0FTTjFfcmVhZF9iaW8gMTAxCisjZGVmaW5lIFBFTV9GX1BFTV9BU04xX3dyaXRlIDEwMgorI2RlZmluZSBQRU1fRl9QRU1fQVNOMV93cml0ZV9iaW8gMTAzCisjZGVmaW5lIFBFTV9GX1BFTV9YNTA5X0lORk9fcmVhZCAxMDQKKyNkZWZpbmUgUEVNX0ZfUEVNX1g1MDlfSU5GT19yZWFkX2JpbyAxMDUKKyNkZWZpbmUgUEVNX0ZfUEVNX1g1MDlfSU5GT193cml0ZV9iaW8gMTA2CisjZGVmaW5lIFBFTV9GX1BFTV9kb19oZWFkZXIgMTA3CisjZGVmaW5lIFBFTV9GX1BFTV9nZXRfRVZQX0NJUEhFUl9JTkZPIDEwOAorI2RlZmluZSBQRU1fRl9QRU1fcmVhZCAxMDkKKyNkZWZpbmUgUEVNX0ZfUEVNX3JlYWRfREhwYXJhbXMgMTEwCisjZGVmaW5lIFBFTV9GX1BFTV9yZWFkX1ByaXZhdGVLZXkgMTExCisjZGVmaW5lIFBFTV9GX1BFTV9yZWFkX2JpbyAxMTIKKyNkZWZpbmUgUEVNX0ZfUEVNX3JlYWRfYmlvX0RIcGFyYW1zIDExMworI2RlZmluZSBQRU1fRl9QRU1fcmVhZF9iaW9fUGFyYW1ldGVycyAxMTQKKyNkZWZpbmUgUEVNX0ZfUEVNX3JlYWRfYmlvX1ByaXZhdGVLZXkgMTE1CisjZGVmaW5lIFBFTV9GX1BFTV93cml0ZSAxMTYKKyNkZWZpbmUgUEVNX0ZfUEVNX3dyaXRlX1ByaXZhdGVLZXkgMTE3CisjZGVmaW5lIFBFTV9GX1BFTV93cml0ZV9iaW8gMTE4CisjZGVmaW5lIFBFTV9GX2QyaV9QS0NTOFByaXZhdGVLZXlfYmlvIDExOQorI2RlZmluZSBQRU1fRl9kMmlfUEtDUzhQcml2YXRlS2V5X2ZwIDEyMAorI2RlZmluZSBQRU1fRl9kb19wazhwa2V5IDEyMQorI2RlZmluZSBQRU1fRl9kb19wazhwa2V5X2ZwIDEyMgorI2RlZmluZSBQRU1fRl9sb2FkX2l2IDEyMwogI2RlZmluZSBQRU1fUl9CQURfQkFTRTY0X0RFQ09ERSAxMDAKICNkZWZpbmUgUEVNX1JfQkFEX0RFQ1JZUFQgMTAxCiAjZGVmaW5lIFBFTV9SX0JBRF9FTkRfTElORSAxMDIKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wZW5zc2wvcGtjczguaCBiL3NyYy9pbmNsdWRlL29wZW5zc2wvcGtjczguaAppbmRleCBiYjZiMDNjLi44ZGM3NzMxIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9vcGVuc3NsL3BrY3M4LmgKKysrIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9wa2NzOC5oCkBAIC02NiwxNSArNjYsMTMgQEAKICNlbmRpZgogCiAKLS8qIFBLQ1M4X2VuY3J5cHRfcGJlIHNlcmlhbGl6ZXMgYW5kIGVuY3J5cHRzIGEgUEtDUzhfUFJJVl9LRVlfSU5GTyB3aXRoIFBCRVMxIG9yCi0gKiBQQkVTMiBhcyBkZWZpbmVkIGluIFBLQ1MgIzUuIE9ubHkgcGJlV2l0aFNIQUFuZDEyOEJpdFJDNCwKKy8qIFBLQ1M4X2VuY3J5cHRfcGJlIHNlcmlhbGl6ZXMgYW5kIGVuY3J5cHRzIGEgUEtDUzhfUFJJVl9LRVlfSU5GTyB3aXRoIFBCRVMxIGFzCisgKiBkZWZpbmVkIGluIFBLQ1MgIzUuIE9ubHkgcGJlV2l0aFNIQUFuZDEyOEJpdFJDNCwKICAqIHBiZVdpdGhTSEFBbmQzLUtleVRyaXBsZURFUy1DQkMgYW5kIHBiZVdpdGhTSEExQW5kNDBCaXRSQzIsIGRlZmluZWQgaW4gUEtDUwotICogIzEyLCBhbmQgUEJFUzIsIGFyZSBzdXBwb3J0ZWQuICBQQkVTMiBpcyBzZWxlY3RlZCBieSBzZXR0aW5nIHxjaXBoZXJ8IGFuZAotICogcGFzc2luZyAtMSBmb3IgfHBiZV9uaWR8LiAgT3RoZXJ3aXNlLCBQQkVTMSBpcyB1c2VkIGFuZCB8Y2lwaGVyfCBpcyBpZ25vcmVkLgotICoKLSAqIFRoZSB8cGFzc19yYXdfbGVufCBieXRlcyBwb2ludGVkIHRvIGJ5IHxwYXNzX3Jhd3wgYXJlIHVzZWQgYXMgdGhlIHBhc3N3b3JkLgotICogTm90ZSB0aGF0IGFueSBjb252ZXJzaW9ucyBmcm9tIHRoZSBwYXNzd29yZCBhcyBzdXBwbGllZCBpbiBhIHRleHQgc3RyaW5nCi0gKiAoc3VjaCBhcyB0aG9zZSBzcGVjaWZpZWQgaW4gQi4xIG9mIFBLQ1MgIzEyKSBtdXN0IGJlIHBlcmZvcm1lZCBieSB0aGUgY2FsbGVyLgorICogIzEyLCBhcmUgc3VwcG9ydGVkLiBUaGUgfHBhc3NfcmF3X2xlbnwgYnl0ZXMgcG9pbnRlZCB0byBieSB8cGFzc19yYXd8IGFyZQorICogdXNlZCBhcyB0aGUgcGFzc3dvcmQuIE5vdGUgdGhhdCBhbnkgY29udmVyc2lvbnMgZnJvbSB0aGUgcGFzc3dvcmQgYXMKKyAqIHN1cHBsaWVkIGluIGEgdGV4dCBzdHJpbmcgKHN1Y2ggYXMgdGhvc2Ugc3BlY2lmaWVkIGluIEIuMSBvZiBQS0NTICMxMikgbXVzdAorICogYmUgcGVyZm9ybWVkIGJ5IHRoZSBjYWxsZXIuCiAgKgogICogSWYgfHNhbHR8IGlzIE5VTEwsIGEgcmFuZG9tIHNhbHQgb2YgfHNhbHRfbGVufCBieXRlcyBpcyBnZW5lcmF0ZWQuIElmCiAgKiB8c2FsdF9sZW58IGlzIHplcm8sIGEgZGVmYXVsdCBzYWx0IGxlbmd0aCBpcyB1c2VkIGluc3RlYWQuCkBAIC04NSwyMSArODMsMTkgQEAKICAqIFRPRE8oZGF2aWRiZW4pOiBSZWFsbHk/IEFuIFg1MDlfU0lHPyBPcGVuU1NMIHByb2JhYmx5IGRpZCB0aGF0IGJlY2F1c2UgaXQgaGFzCiAgKiB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8uICovCiBPUEVOU1NMX0VYUE9SVCBYNTA5X1NJRyAqUEtDUzhfZW5jcnlwdF9wYmUoaW50IHBiZV9uaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBhc3NfcmF3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwYXNzX3Jhd19sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc2FsdCwgc2l6ZV90IHNhbHRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mKTsKIAotLyogUEtDUzhfZGVjcnlwdF9wYmUgZGVjcnlwdHMgYW5kIGRlY29kZXMgYSBQS0NTOF9QUklWX0tFWV9JTkZPIHdpdGggUEJFUzEgb3IKLSAqIFBCRVMyIGFzIGRlZmluZWQgaW4gUEtDUyAjNS4gT25seSBwYmVXaXRoU0hBQW5kMTI4Qml0UkM0LAotICogcGJlV2l0aFNIQUFuZDMtS2V5VHJpcGxlREVTLUNCQyBhbmQgcGJlV2l0aFNIQTFBbmQ0MEJpdFJDMiwgYW5kIFBCRVMyLAotICogZGVmaW5lZCBpbiBQS0NTICMxMiwgYXJlIHN1cHBvcnRlZC4KLSAqCi0gKiBUaGUgfHBhc3NfcmF3X2xlbnwgYnl0ZXMgcG9pbnRlZCB0byBieSB8cGFzc19yYXd8IGFyZSB1c2VkIGFzIHRoZSBwYXNzd29yZC4KLSAqIE5vdGUgdGhhdCBhbnkgY29udmVyc2lvbnMgZnJvbSB0aGUgcGFzc3dvcmQgYXMgc3VwcGxpZWQgaW4gYSB0ZXh0IHN0cmluZwotICogKHN1Y2ggYXMgdGhvc2Ugc3BlY2lmaWVkIGluIEIuMSBvZiBQS0NTICMxMikgbXVzdCBiZSBwZXJmb3JtZWQgYnkgdGhlIGNhbGxlci4KKy8qIFBLQ1M4X2RlY3J5cHRfcGJlIGRlY3J5cHRzIGFuZCBkZWNvZGVzIGEgUEtDUzhfUFJJVl9LRVlfSU5GTyB3aXRoIFBCRVMxIGFzCisgKiBkZWZpbmVkIGluIFBLQ1MgIzUuIE9ubHkgcGJlV2l0aFNIQUFuZDEyOEJpdFJDNCwKKyAqIHBiZVdpdGhTSEFBbmQzLUtleVRyaXBsZURFUy1DQkMgYW5kIHBiZVdpdGhTSEExQW5kNDBCaXRSQzIsIGRlZmluZWQgaW4gUEtDUworICogIzEyLCBhcmUgc3VwcG9ydGVkLiBUaGUgfHBhc3NfcmF3X2xlbnwgYnl0ZXMgcG9pbnRlZCB0byBieSB8cGFzc19yYXd8IGFyZQorICogdXNlZCBhcyB0aGUgcGFzc3dvcmQuIE5vdGUgdGhhdCBhbnkgY29udmVyc2lvbnMgZnJvbSB0aGUgcGFzc3dvcmQgYXMKKyAqIHN1cHBsaWVkIGluIGEgdGV4dCBzdHJpbmcgKHN1Y2ggYXMgdGhvc2Ugc3BlY2lmaWVkIGluIEIuMSBvZiBQS0NTICMxMikgbXVzdAorICogYmUgcGVyZm9ybWVkIGJ5IHRoZSBjYWxsZXIuCiAgKgogICogVGhlIHJlc3VsdGluZyBzdHJ1Y3R1cmUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLiAqLwogT1BFTlNTTF9FWFBPUlQgUEtDUzhfUFJJVl9LRVlfSU5GTyAqUEtDUzhfZGVjcnlwdF9wYmUoWDUwOV9TSUcgKnBrY3M4LApAQCAtMTA5LDIwICsxMDUsMTggQEAKIAogLyogRGVwcmVjYXRlZCBmdW5jdGlvbnMuICovCiAKLS8qIFBLQ1M4X2VuY3J5cHQgY2FsbHMgfFBLQ1M4X2VuY3J5cHRfcGJlfCBhZnRlciAoaW4gdGhlIFBLQ1MjMTIgY2FzZSkgdHJlYXRpbmcKLSAqIHxwYXNzfCBhcyBhbiBBU0NJSSBzdHJpbmcsIGFwcGVuZGluZyBVKzAwMDAsIGFuZCBjb252ZXJ0aW5nIHRvIFVDUy0yLiAoU28gdGhlCi0gKiBlbXB0eSBwYXNzd29yZCBlbmNvZGVzIGFzIHR3byBOVUwgYnl0ZXMuKSBJbiB0aGUgUEJFUzIgY2FzZSwgdGhlIHBhc3N3b3JkIGlzCi0gKiB1bmNoYW5nZWQuICAqLworLyogUEtDUzhfZW5jcnlwdCBjYWxscyBQS0NTOF9lbmNyeXB0X3BiZSBhZnRlciB0cmVhdGluZyB8cGFzc3wgYXMgYW4gQVNDSUkKKyAqIHN0cmluZywgYXBwZW5kaW5nIFUrMDAwMCwgYW5kIGNvbnZlcnRpbmcgdG8gVUNTLTIuIChTbyB0aGUgZW1wdHkgcGFzc3dvcmQKKyAqIGVuY29kZXMgYXMgdHdvIE5VTCBieXRlcy4pIFRoZSB8Y2lwaGVyfCBhcmd1bWVudCBpcyBpZ25vcmVkLiAqLwogT1BFTlNTTF9FWFBPUlQgWDUwOV9TSUcgKlBLQ1M4X2VuY3J5cHQoaW50IHBiZV9uaWQsIGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhc3MsIGludCBwYXNzX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNhbHQsIHNpemVfdCBzYWx0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDhpbmYpOwogCi0vKiBQS0NTOF9kZWNyeXB0IGNhbGxzIFBLQ1M4X2RlY3J5cHRfcGJlIGFmdGVyIChpbiB0aGUgUEtDUyMxMiBjYXNlKSB0cmVhdGluZwotICogfHBhc3N8IGFzIGFuIEFTQ0lJIHN0cmluZywgYXBwZW5kaW5nIFUrMDAwMCwgYW5kIGNvbnZlcnRpbmcgdG8gVUNTLTIuIChTbyB0aGUKLSAqICBlbXB0eSBwYXNzd29yZCBlbmNvZGVzIGFzIHR3byBOVUwgYnl0ZXMuKSBJbiB0aGUgUEJFUzIgY2FzZSwgdGhlIHBhc3N3b3JkIGlzCi0gKiB1bmNoYW5nZWQuICovCisvKiBQS0NTOF9kZWNyeXB0IGNhbGxzIFBLQ1M4X2RlY3J5cHRfcGJlIGFmdGVyIHRyZWF0aW5nIHxwYXNzfCBhcyBhbiBBU0NJSQorICogc3RyaW5nLCBhcHBlbmRpbmcgVSswMDAwLCBhbmQgY29udmVydGluZyB0byBVQ1MtMi4gKFNvIHRoZSBlbXB0eSBwYXNzd29yZAorICogZW5jb2RlcyBhcyB0d28gTlVMIGJ5dGVzLikgKi8KIE9QRU5TU0xfRVhQT1JUIFBLQ1M4X1BSSVZfS0VZX0lORk8gKlBLQ1M4X2RlY3J5cHQoWDUwOV9TSUcgKnBrY3M4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFzc19sZW4pOwpAQCAtMTc2LDYgKzE3MCwyNCBAQAogfSAgLyogZXh0ZXJuIEMgKi8KICNlbmRpZgogCisjZGVmaW5lIFBLQ1M4X0ZfRVZQX1BLQ1M4MlBLRVkgMTAwCisjZGVmaW5lIFBLQ1M4X0ZfRVZQX1BLRVkyUEtDUzggMTAxCisjZGVmaW5lIFBLQ1M4X0ZfUEtDUzEyX2dldF9rZXlfYW5kX2NlcnRzIDEwMgorI2RlZmluZSBQS0NTOF9GX1BLQ1MxMl9oYW5kbGVfY29udGVudF9pbmZvIDEwMworI2RlZmluZSBQS0NTOF9GX1BLQ1MxMl9oYW5kbGVfY29udGVudF9pbmZvcyAxMDQKKyNkZWZpbmUgUEtDUzhfRl9QS0NTNV9wYmUyX3NldF9pdiAxMDUKKyNkZWZpbmUgUEtDUzhfRl9QS0NTNV9wYmVfc2V0IDEwNgorI2RlZmluZSBQS0NTOF9GX1BLQ1M1X3BiZV9zZXQwX2FsZ29yIDEwNworI2RlZmluZSBQS0NTOF9GX1BLQ1M1X3Bia2RmMl9zZXQgMTA4CisjZGVmaW5lIFBLQ1M4X0ZfUEtDUzhfZGVjcnlwdCAxMDkKKyNkZWZpbmUgUEtDUzhfRl9QS0NTOF9lbmNyeXB0IDExMAorI2RlZmluZSBQS0NTOF9GX1BLQ1M4X2VuY3J5cHRfcGJlIDExMQorI2RlZmluZSBQS0NTOF9GX3BiZV9jaXBoZXJfaW5pdCAxMTIKKyNkZWZpbmUgUEtDUzhfRl9wYmVfY3J5cHQgMTEzCisjZGVmaW5lIFBLQ1M4X0ZfcGtjczEyX2l0ZW1fZGVjcnlwdF9kMmkgMTE0CisjZGVmaW5lIFBLQ1M4X0ZfcGtjczEyX2l0ZW1faTJkX2VuY3J5cHQgMTE1CisjZGVmaW5lIFBLQ1M4X0ZfcGtjczEyX2tleV9nZW5fcmF3IDExNgorI2RlZmluZSBQS0NTOF9GX3BrY3MxMl9wYmVfa2V5aXZnZW4gMTE3CiAjZGVmaW5lIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBIDEwMAogI2RlZmluZSBQS0NTOF9SX0JBRF9QS0NTMTJfVkVSU0lPTiAxMDEKICNkZWZpbmUgUEtDUzhfUl9DSVBIRVJfSEFTX05PX09CSkVDVF9JREVOVElGSUVSIDEwMgpAQCAtMjAxLDExICsyMTMsNSBAQAogI2RlZmluZSBQS0NTOF9SX1VOS05PV05fRElHRVNUIDEyMgogI2RlZmluZSBQS0NTOF9SX1VOS05PV05fSEFTSCAxMjMKICNkZWZpbmUgUEtDUzhfUl9VTlNVUFBPUlRFRF9QUklWQVRFX0tFWV9BTEdPUklUSE0gMTI0Ci0jZGVmaW5lIFBLQ1M4X1JfVU5TVVBQT1JURURfS0VZTEVOR1RIIDEyNQotI2RlZmluZSBQS0NTOF9SX1VOU1VQUE9SVEVEX1NBTFRfVFlQRSAxMjYKLSNkZWZpbmUgUEtDUzhfUl9VTlNVUFBPUlRFRF9DSVBIRVIgMTI3Ci0jZGVmaW5lIFBLQ1M4X1JfVU5TVVBQT1JURURfS0VZX0RFUklWQVRJT05fRlVOQ1RJT04gMTI4Ci0jZGVmaW5lIFBLQ1M4X1JfQkFEX0lURVJBVElPTl9DT1VOVCAxMjkKLSNkZWZpbmUgUEtDUzhfUl9VTlNVUFBPUlRFRF9QUkYgMTMwCiAKICNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfUEtDUzhfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9wb2x5MTMwNS5oIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9wb2x5MTMwNS5oCmluZGV4IDBkYTlmNmUuLmFhOTA0ODYgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wZW5zc2wvcG9seTEzMDUuaAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL3BvbHkxMzA1LmgKQEAgLTIyLDI1ICsyMiwyMiBAQAogI2VuZGlmCiAKIAotdHlwZWRlZiB1aW50OF90IHBvbHkxMzA1X3N0YXRlWzUxMl07Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgcG9seTEzMDVfc3RhdGVbNTEyXTsKIAogLyogcG9seTEzMDVfaW5pdCBzZXRzIHVwIHxzdGF0ZXwgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgYW4KICAqIGF1dGhlbnRpY2F0aW9uIHRhZyB3aXRoIHRoZSBvbmUtdGltZSBrZXkgfGtleXwuIE5vdGUgdGhhdCB8a2V5fCBpcyBhCiAgKiBvbmUtdGltZSBrZXkgYW5kIHRoZXJlZm9yZSB0aGVyZSBpcyBubyBgcmVzZXQnIG1ldGhvZCBiZWNhdXNlIHRoYXQgd291bGQKICAqIGVuYWJsZSBzZXZlcmFsIG1lc3NhZ2VzIHRvIGJlIGF1dGhlbnRpY2F0ZWQgd2l0aCB0aGUgc2FtZSBrZXkuICovCi1PUEVOU1NMX0VYUE9SVCB2b2lkIENSWVBUT19wb2x5MTMwNV9pbml0KHBvbHkxMzA1X3N0YXRlKiBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBrZXlbMzJdKTsKK2V4dGVybiB2b2lkIENSWVBUT19wb2x5MTMwNV9pbml0KHBvbHkxMzA1X3N0YXRlKiBzdGF0ZSwgY29uc3QgdWludDhfdCBrZXlbMzJdKTsKIAogLyogcG9seTEzMDVfdXBkYXRlIHByb2Nlc3NlcyB8aW5fbGVufCBieXRlcyBmcm9tIHxpbnwuIEl0IGNhbiBiZSBjYWxsZWQgemVybyBvcgogICogbW9yZSB0aW1lcyBhZnRlciBwb2x5MTMwNV9pbml0LiAqLwotT1BFTlNTTF9FWFBPUlQgdm9pZCBDUllQVE9fcG9seTEzMDVfdXBkYXRlKHBvbHkxMzA1X3N0YXRlKiBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5fbGVuKTsKK2V4dGVybiB2b2lkIENSWVBUT19wb2x5MTMwNV91cGRhdGUocG9seTEzMDVfc3RhdGUqIHN0YXRlLCBjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluX2xlbik7CiAKIC8qIHBvbHkxMzA1X2ZpbmlzaCBjb21wbGV0ZXMgdGhlIHBvbHkxMzA1IGNhbGN1bGF0aW9uIGFuZCB3cml0ZXMgYSAxNiBieXRlCiAgKiBhdXRoZW50aWNhdGlvbiB0YWcgdG8gfG1hY3wuIFRoZSB8bWFjfCBhZGRyZXNzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAqLwotT1BFTlNTTF9FWFBPUlQgdm9pZCBDUllQVE9fcG9seTEzMDVfZmluaXNoKHBvbHkxMzA1X3N0YXRlKiBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1hY1sxNl0pOworZXh0ZXJuIHZvaWQgQ1JZUFRPX3BvbHkxMzA1X2ZpbmlzaChwb2x5MTMwNV9zdGF0ZSogc3RhdGUsIHVpbnQ4X3QgbWFjWzE2XSk7CiAKIAogI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcGVuc3NsL3JhbmQuaCBiL3NyYy9pbmNsdWRlL29wZW5zc2wvcmFuZC5oCmluZGV4IGRlMWJkOGQuLjMwMGJmNDIgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wZW5zc2wvcmFuZC5oCisrKyBiL3NyYy9pbmNsdWRlL29wZW5zc2wvcmFuZC5oCkBAIC0zMywzNiArMzMsNiBAQAogT1BFTlNTTF9FWFBPUlQgdm9pZCBSQU5EX2NsZWFudXAodm9pZCk7CiAKIAotLyogT2JzY3VyZSBmdW5jdGlvbnMuICovCi0KLSNpZiAhZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCi0vKiBSQU5EX3NldF91cmFuZG9tX2ZkIGNhdXNlcyB0aGUgbW9kdWxlIHRvIHVzZSBhIGNvcHkgb2YgfGZkfCBmb3Igc3lzdGVtCi0gKiByYW5kb21uZXNzIHJhdGhlciBvcGVuaW5nIC9kZXYvdXJhbmRvbSBpbnRlcm5hbGx5LiBUaGUgY2FsbGVyIHJldGFpbnMKLSAqIG93bmVyc2hpcCBvZiB8ZmR8IGFuZCBpcyBhdCBsaWJlcnR5IHRvIGNsb3NlIGl0IGF0IGFueSB0aW1lLiBUaGlzIGlzIHVzZWZ1bAotICogaWYsIGR1ZSB0byBhIHNhbmRib3gsIC9kZXYvdXJhbmRvbSBpc24ndCBhdmFpbGFibGUuIElmIHVzZWQsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgdG8gfFJBTkRfYnl0ZXN8LCBhbmQgaXQgaXMgbXV0dWFsbHkgZXhjbHVzaXZlCi0gKiB3aXRoIHxSQU5EX2VuYWJsZV9mb3JrX3Vuc2FmZV9idWZmZXJpbmd8LgotICoKLSAqIHxSQU5EX3NldF91cmFuZG9tX2ZkfCBkb2VzIG5vdCBidWZmZXIgYW55IGVudHJvcHksIHNvIGl0IGlzIHNhZmUgdG8gY2FsbAotICogfGZvcmt8IGF0IGFueSB0aW1lIGFmdGVyIGNhbGxpbmcgfFJBTkRfc2V0X3VyYW5kb21fZmR8LiAqLwotT1BFTlNTTF9FWFBPUlQgdm9pZCBSQU5EX3NldF91cmFuZG9tX2ZkKGludCBmZCk7Ci0KLS8qIFJBTkRfZW5hYmxlX2ZvcmtfdW5zYWZlX2J1ZmZlcmluZyBlbmFibGVzIGVmZmljaWVudCBidWZmZXJlZCByZWFkaW5nIG9mCi0gKiAvZGV2L3VyYW5kb20uIEl0IGFkZHMgYW4gb3ZlcmhlYWQgb2YgYSBmZXcgS0Igb2YgbWVtb3J5IHBlciB0aHJlYWQuIEl0IG11c3QKLSAqIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgdG8gfFJBTkRfYnl0ZXN8IGFuZCBpdCBpcyBtdXR1YWxseSBleGNsdXNpdmUKLSAqIHdpdGggY2FsbHMgdG8gfFJBTkRfc2V0X3VyYW5kb21fZmR8LgotICoKLSAqIElmIHxmZHwgaXMgbm9uLW5lZ2F0aXZlIHRoZW4gYSBjb3B5IG9mIHxmZHwgd2lsbCBiZSB1c2VkIHJhdGhlciB0aGFuIG9wZW5pbmcKLSAqIC9kZXYvdXJhbmRvbSBpbnRlcm5hbGx5LiBMaWtlIHxSQU5EX3NldF91cmFuZG9tX2ZkfCwgdGhlIGNhbGxlciByZXRhaW5zCi0gKiBvd25lcnNoaXAgb2YgfGZkfC4gSWYgfGZkfCBpcyBuZWdhdGl2ZSB0aGVuIC9kZXYvdXJhbmRvbSB3aWxsIGJlIG9wZW5lZCBhbmQKLSAqIGFueSBlcnJvciBmcm9tIG9wZW4oMikgY3Jhc2hlcyB0aGUgYWRkcmVzcyBzcGFjZS4KLSAqCi0gKiBJdCBoYXMgYW4gdW51c3VhbCBuYW1lIGJlY2F1c2UgdGhlIGJ1ZmZlciBpcyB1bnNhZmUgYWNyb3NzIGNhbGxzIHRvIHxmb3JrfC4KLSAqIEhlbmNlLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgYnkgbGlicmFyaWVzLiAqLwotT1BFTlNTTF9FWFBPUlQgdm9pZCBSQU5EX2VuYWJsZV9mb3JrX3Vuc2FmZV9idWZmZXJpbmcoaW50IGZkKTsKLSNlbmRpZgotCi0KIC8qIERlcHJlY2F0ZWQgZnVuY3Rpb25zICovCiAKIC8qIFJBTkRfcHNldWRvX2J5dGVzIGlzIGEgd3JhcHBlciBhcm91bmQgfFJBTkRfYnl0ZXN8LiAqLwpAQCAtNzcsMzMgKzQ3LDEyIEBACiAvKiBSQU5EX2FkZCBkb2VzIG5vdGhpbmcuICovCiBPUEVOU1NMX0VYUE9SVCB2b2lkIFJBTkRfYWRkKGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG51bSwgZG91YmxlIGVudHJvcHkpOwogCi0vKiBSQU5EX2VnZCByZXR1cm5zIDI1NS4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBSQU5EX2VnZChjb25zdCBjaGFyICopOwotCiAvKiBSQU5EX3BvbGwgcmV0dXJucyBvbmUuICovCiBPUEVOU1NMX0VYUE9SVCBpbnQgUkFORF9wb2xsKHZvaWQpOwogCiAvKiBSQU5EX3N0YXR1cyByZXR1cm5zIG9uZS4gKi8KIE9QRU5TU0xfRVhQT1JUIGludCBSQU5EX3N0YXR1cyh2b2lkKTsKIAotLyogcmFuZF9tZXRoX3N0IGlzIHR5cGVkZWZlZCB0byB8UkFORF9NRVRIT0R8IGluIGJhc2UuaC4gSXQgaXNuJ3QgdXNlZDsgaXQKLSAqIGV4aXN0cyBvbmx5IHRvIGJlIHRoZSByZXR1cm4gdHlwZSBvZiB8UkFORF9TU0xlYXl8LiBJdCdzCi0gKiBleHRlcm5hbCBzbyB0aGF0IHZhcmlhYmxlcyBvZiB0aGlzIHR5cGUgY2FuIGJlIGluaXRpYWxpemVkLiAqLwotc3RydWN0IHJhbmRfbWV0aF9zdCB7Ci0gIHZvaWQgKCpzZWVkKSAoY29uc3Qgdm9pZCAqYnVmLCBpbnQgbnVtKTsKLSAgaW50ICgqYnl0ZXMpICh1aW50OF90ICpidWYsIHNpemVfdCBudW0pOwotICB2b2lkICgqY2xlYW51cCkgKHZvaWQpOwotICB2b2lkICgqYWRkKSAoY29uc3Qgdm9pZCAqYnVmLCBpbnQgbnVtLCBkb3VibGUgZW50cm9weSk7Ci0gIGludCAoKnBzZXVkb3JhbmQpICh1aW50OF90ICpidWYsIHNpemVfdCBudW0pOwotICBpbnQgKCpzdGF0dXMpICh2b2lkKTsKLX07Ci0KLS8qIFJBTkRfU1NMZWF5IHJldHVybnMgYSBwb2ludGVyIHRvIGEgZHVtbXkgfFJBTkRfTUVUSE9EfC4gKi8KLU9QRU5TU0xfRVhQT1JUIFJBTkRfTUVUSE9EICpSQU5EX1NTTGVheSh2b2lkKTsKLQotLyogUkFORF9zZXRfcmFuZF9tZXRob2QgZG9lcyBub3RoaW5nLiAqLwotT1BFTlNTTF9FWFBPUlQgdm9pZCBSQU5EX3NldF9yYW5kX21ldGhvZChjb25zdCBSQU5EX01FVEhPRCAqKTsKLQogCiAjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKIH0gIC8qIGV4dGVybiBDICovCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcGVuc3NsL3JzYS5oIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9yc2EuaAppbmRleCAyYmU1MGRjLi45YjQxNWQ3IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9vcGVuc3NsL3JzYS5oCisrKyBiL3NyYy9pbmNsdWRlL29wZW5zc2wvcnNhLmgKQEAgLTU5LDcgKzU5LDYgQEAKIAogI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgogCi0jaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2V4X2RhdGEuaD4KICNpbmNsdWRlIDxvcGVuc3NsL3RocmVhZC5oPgpAQCAtMTAxLDEyICsxMDAsNiBAQAogT1BFTlNTTF9FWFBPUlQgaW50IFJTQV9nZW5lcmF0ZV9rZXlfZXgoUlNBICpyc2EsIGludCBiaXRzLCBCSUdOVU0gKmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9HRU5DQiAqY2IpOwogCi0vKiBSU0FfZ2VuZXJhdGVfbXVsdGlfcHJpbWVfa2V5IGFjdHMgbGlrZSB8UlNBX2dlbmVyYXRlX2tleV9leHwgYnV0IGNhbgotICogZ2VuZXJhdGUgYW4gUlNBIHByaXZhdGUga2V5IHdpdGggbW9yZSB0aGFuIHR3byBwcmltZXMuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgUlNBX2dlbmVyYXRlX211bHRpX3ByaW1lX2tleShSU0EgKnJzYSwgaW50IGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3ByaW1lcywgQklHTlVNICplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fR0VOQ0IgKmNiKTsKLQogCiAvKiBFbmNyeXB0aW9uIC8gRGVjcnlwdGlvbiAqLwogCkBAIC0yNDcsNyArMjQwLDcgQEAKIE9QRU5TU0xfRVhQT1JUIGludCBSU0FfcHJpdmF0ZV9lbmNyeXB0KGludCBmbGVuLCBjb25zdCB1aW50OF90ICpmcm9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqdG8sIFJTQSAqcnNhLCBpbnQgcGFkZGluZyk7CiAKLS8qIFJTQV9wdWJsaWNfZGVjcnlwdCB2ZXJpZmllcyB8ZmxlbnwgYnl0ZXMgb2Ygc2lnbmF0dXJlIGZyb20gfGZyb218IHVzaW5nIHRoZQorLyogUlNBX3ByaXZhdGVfZW5jcnlwdCB2ZXJpZmllcyB8ZmxlbnwgYnl0ZXMgb2Ygc2lnbmF0dXJlIGZyb20gfGZyb218IHVzaW5nIHRoZQogICogcHVibGljIGtleSBpbiB8cnNhfCBhbmQgd3JpdGVzIHRoZSBwbGFpbnRleHQgdG8gfHRvfC4gVGhlIHx0b3wgYnVmZmVyIG11c3QKICAqIGhhdmUgYXQgbGVhc3QgfFJTQV9zaXplfCBieXRlcyBvZiBzcGFjZS4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzCiAgKiB3cml0dGVuLCBvciAtMSBvbiBlcnJvci4gVGhlIHxwYWRkaW5nfCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0aGUKQEAgLTI3Myw3ICsyNjYsNyBAQAogICogb2YgdHlwZSB8bWR8LiBPdGhlcndpc2UgaXQgcmV0dXJucyB6ZXJvLiAqLwogT1BFTlNTTF9FWFBPUlQgaW50IFJTQV9zdXBwb3J0c19kaWdlc3QoY29uc3QgUlNBICpyc2EsIGNvbnN0IEVWUF9NRCAqbWQpOwogCi0vKiBSU0FQdWJsaWNLZXlfZHVwIGFsbG9jYXRlcyBhIGZyZXNoIHxSU0F8IGFuZCBjb3BpZXMgdGhlIHB1YmxpYyBrZXkgZnJvbQorLyogUlNBUHVibGljS2V5X2R1cCBhbGxvY2F0ZXMgYSBmcmVzaCB8UlNBfCBhbmQgY29waWVzIHRoZSBwcml2YXRlIGtleSBmcm9tCiAgKiB8cnNhfCBpbnRvIGl0LiBJdCByZXR1cm5zIHRoZSBmcmVzaCB8UlNBfCBvYmplY3QsIG9yIE5VTEwgb24gZXJyb3IuICovCiBPUEVOU1NMX0VYUE9SVCBSU0EgKlJTQVB1YmxpY0tleV9kdXAoY29uc3QgUlNBICpyc2EpOwogCkBAIC0zMjIsNjMgKzMxNSwzNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFVlBfTUQgKm1nZjFIYXNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc0xlbik7CiAKLS8qIFJTQV9hZGRfcGtjczFfcHJlZml4IGJ1aWxkcyBhIHZlcnNpb24gb2YgfG1zZ3wgcHJlZml4ZWQgd2l0aCB0aGUgRGlnZXN0SW5mbwotICogaGVhZGVyIGZvciB0aGUgZ2l2ZW4gaGFzaCBmdW5jdGlvbiBhbmQgc2V0cyB8b3V0X21zZ3wgdG8gcG9pbnQgdG8gaXQuIE9uCi0gKiBzdWNjZXNzZnVsIHJldHVybiwgfCpvdXRfbXNnfCBtYXkgYmUgYWxsb2NhdGVkIG1lbW9yeSBhbmQsIGlmIHNvLAotICogfCppc19hbGxvY2VkfCB3aWxsIGJlIDEuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgUlNBX2FkZF9wa2NzMV9wcmVmaXgodWludDhfdCAqKm91dF9tc2csIHNpemVfdCAqb3V0X21zZ19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppc19hbGxvY2VkLCBpbnQgaGFzaF9uaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbXNnLCBzaXplX3QgbXNnX2xlbik7Ci0KIAogLyogQVNOLjEgZnVuY3Rpb25zLiAqLwogCi0vKiBSU0FfcGFyc2VfcHVibGljX2tleSBwYXJzZXMgYSBERVItZW5jb2RlZCBSU0FQdWJsaWNLZXkgc3RydWN0dXJlIChSRkMgMzQ0NykKLSAqIGZyb20gfGNic3wgYW5kIGFkdmFuY2VzIHxjYnN8LiBJdCByZXR1cm5zIGEgbmV3bHktYWxsb2NhdGVkIHxSU0F8IG9yIE5VTEwgb24KLSAqIGVycm9yLiAqLwotT1BFTlNTTF9FWFBPUlQgUlNBICpSU0FfcGFyc2VfcHVibGljX2tleShDQlMgKmNicyk7CisvKiBkMmlfUlNBUHVibGljS2V5IHBhcnNlcyBhbiBBU04uMSwgREVSLWVuY29kZWQsIFJTQSBwdWJsaWMga2V5IGZyb20gfGxlbnwKKyAqIGJ5dGVzIGF0IHwqaW5wfC4gSWYgfG91dHwgaXMgbm90IE5VTEwgdGhlbiwgb24gZXhpdCwgYSBwb2ludGVyIHRvIHRoZSByZXN1bHQKKyAqIGlzIGluIHwqb3V0fC4gSWYgfCpvdXR8IGlzIGFscmVhZHkgbm9uLU5VTEwgb24gZW50cnkgdGhlbiB0aGUgcmVzdWx0IGlzCisgKiB3cml0dGVuIGRpcmVjdGx5IGludG8gfCpvdXR8LCBvdGhlcndpc2UgYSBmcmVzaCB8UlNBfCBpcyBhbGxvY2F0ZWQuIE9uCisgKiBzdWNjZXNzZnVsIGV4aXQsIHwqaW5wfCBpcyBhZHZhbmNlZCBwYXN0IHRoZSBERVIgc3RydWN0dXJlLiBJdCByZXR1cm5zIHRoZQorICogcmVzdWx0IG9yIE5VTEwgb24gZXJyb3IuICovCitPUEVOU1NMX0VYUE9SVCBSU0EgKmQyaV9SU0FQdWJsaWNLZXkoUlNBICoqb3V0LCBjb25zdCB1aW50OF90ICoqaW5wLCBsb25nIGxlbik7CiAKLS8qIFJTQV9wYXJzZV9wdWJsaWNfa2V5X2J1Z2d5IGJlaGF2ZXMgbGlrZSB8UlNBX3BhcnNlX3B1YmxpY19rZXl8LCBidXQgaXQKLSAqIHRvbGVyYXRlcyBzb21lIGludmFsaWQgZW5jb2RpbmdzLiBEbyBub3QgdXNlIHRoaXMgZnVuY3Rpb24uICovCi1PUEVOU1NMX0VYUE9SVCBSU0EgKlJTQV9wYXJzZV9wdWJsaWNfa2V5X2J1Z2d5KENCUyAqY2JzKTsKKy8qIGkyZF9SU0FQdWJsaWNLZXkgbWFyc2hhbHMgfGlufCB0byBhbiBBU04uMSwgREVSIHN0cnVjdHVyZS4gSWYgfG91dHB8IGlzIG5vdAorICogTlVMTCB0aGVuIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0byB8Km91dHB8IGFuZCB8Km91dHB8IGlzIGFkdmFuY2VkIGp1c3QgcGFzdAorICogdGhlIG91dHB1dC4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByZXN1bHQsIHdoZXRoZXIgd3JpdHRlbiBvcgorICogbm90LCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLiAqLworT1BFTlNTTF9FWFBPUlQgaW50IGkyZF9SU0FQdWJsaWNLZXkoY29uc3QgUlNBICppbiwgdWludDhfdCAqKm91dHApOwogCi0vKiBSU0FfcHVibGljX2tleV9mcm9tX2J5dGVzIHBhcnNlcyB8aW58IGFzIGEgREVSLWVuY29kZWQgUlNBUHVibGljS2V5IHN0cnVjdHVyZQotICogKFJGQyAzNDQ3KS4gSXQgcmV0dXJucyBhIG5ld2x5LWFsbG9jYXRlZCB8UlNBfCBvciBOVUxMIG9uIGVycm9yLiAqLwotT1BFTlNTTF9FWFBPUlQgUlNBICpSU0FfcHVibGljX2tleV9mcm9tX2J5dGVzKGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuKTsKKy8qIGQyaV9SU0FQcml2YXRlS2V5IHBhcnNlcyBhbiBBU04uMSwgREVSLWVuY29kZWQsIFJTQSBwcml2YXRlIGtleSBmcm9tIHxsZW58CisgKiBieXRlcyBhdCB8KmlucHwuIElmIHxvdXR8IGlzIG5vdCBOVUxMIHRoZW4sIG9uIGV4aXQsIGEgcG9pbnRlciB0byB0aGUgcmVzdWx0CisgKiBpcyBpbiB8Km91dHwuIElmIHwqb3V0fCBpcyBhbHJlYWR5IG5vbi1OVUxMIG9uIGVudHJ5IHRoZW4gdGhlIHJlc3VsdCBpcworICogd3JpdHRlbiBkaXJlY3RseSBpbnRvIHwqb3V0fCwgb3RoZXJ3aXNlIGEgZnJlc2ggfFJTQXwgaXMgYWxsb2NhdGVkLiBPbgorICogc3VjY2Vzc2Z1bCBleGl0LCB8KmlucHwgaXMgYWR2YW5jZWQgcGFzdCB0aGUgREVSIHN0cnVjdHVyZS4gSXQgcmV0dXJucyB0aGUKKyAqIHJlc3VsdCBvciBOVUxMIG9uIGVycm9yLiAqLworT1BFTlNTTF9FWFBPUlQgUlNBICpkMmlfUlNBUHJpdmF0ZUtleShSU0EgKipvdXQsIGNvbnN0IHVpbnQ4X3QgKippbnAsIGxvbmcgbGVuKTsKIAotLyogUlNBX21hcnNoYWxfcHVibGljX2tleSBtYXJzaGFscyB8cnNhfCBhcyBhIERFUi1lbmNvZGVkIFJTQVB1YmxpY0tleSBzdHJ1Y3R1cmUKLSAqIChSRkMgMzQ0NykgYW5kIGFwcGVuZHMgdGhlIHJlc3VsdCB0byB8Y2JifC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQKLSAqIHplcm8gb24gZmFpbHVyZS4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBSU0FfbWFyc2hhbF9wdWJsaWNfa2V5KENCQiAqY2JiLCBjb25zdCBSU0EgKnJzYSk7Ci0KLS8qIFJTQV9wdWJsaWNfa2V5X3RvX2J5dGVzIG1hcnNoYWxzIHxyc2F8IGFzIGEgREVSLWVuY29kZWQgUlNBUHVibGljS2V5Ci0gKiBzdHJ1Y3R1cmUgKFJGQyAzNDQ3KSBhbmQsIG9uIHN1Y2Nlc3MsIHNldHMgfCpvdXRfYnl0ZXN8IHRvIGEgbmV3bHkgYWxsb2NhdGVkCi0gKiBidWZmZXIgY29udGFpbmluZyB0aGUgcmVzdWx0IGFuZCByZXR1cm5zIG9uZS4gT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHplcm8uIFRoZQotICogcmVzdWx0IHNob3VsZCBiZSBmcmVlZCB3aXRoIHxPUEVOU1NMX2ZyZWV8LiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFJTQV9wdWJsaWNfa2V5X3RvX2J5dGVzKHVpbnQ4X3QgKipvdXRfYnl0ZXMsIHNpemVfdCAqb3V0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSU0EgKnJzYSk7Ci0KLS8qIFJTQV9wYXJzZV9wcml2YXRlX2tleSBwYXJzZXMgYSBERVItZW5jb2RlZCBSU0FQcml2YXRlS2V5IHN0cnVjdHVyZSAoUkZDIDM0NDcpCi0gKiBmcm9tIHxjYnN8IGFuZCBhZHZhbmNlcyB8Y2JzfC4gSXQgcmV0dXJucyBhIG5ld2x5LWFsbG9jYXRlZCB8UlNBfCBvciBOVUxMIG9uCi0gKiBlcnJvci4gKi8KLU9QRU5TU0xfRVhQT1JUIFJTQSAqUlNBX3BhcnNlX3ByaXZhdGVfa2V5KENCUyAqY2JzKTsKLQotLyogUlNBX3ByaXZhdGVfa2V5X2Zyb21fYnl0ZXMgcGFyc2VzIHxpbnwgYXMgYSBERVItZW5jb2RlZCBSU0FQcml2YXRlS2V5Ci0gKiBzdHJ1Y3R1cmUgKFJGQyAzNDQ3KS4gSXQgcmV0dXJucyBhIG5ld2x5LWFsbG9jYXRlZCB8UlNBfCBvciBOVUxMIG9uIGVycm9yLiAqLwotT1BFTlNTTF9FWFBPUlQgUlNBICpSU0FfcHJpdmF0ZV9rZXlfZnJvbV9ieXRlcyhjb25zdCB1aW50OF90ICppbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluX2xlbik7Ci0KLS8qIFJTQV9tYXJzaGFsX3ByaXZhdGVfa2V5IG1hcnNoYWxzIHxyc2F8IGFzIGEgREVSLWVuY29kZWQgUlNBUHJpdmF0ZUtleQotICogc3RydWN0dXJlIChSRkMgMzQ0NykgYW5kIGFwcGVuZHMgdGhlIHJlc3VsdCB0byB8Y2JifC4gSXQgcmV0dXJucyBvbmUgb24KLSAqIHN1Y2Nlc3MgYW5kIHplcm8gb24gZmFpbHVyZS4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBSU0FfbWFyc2hhbF9wcml2YXRlX2tleShDQkIgKmNiYiwgY29uc3QgUlNBICpyc2EpOwotCi0vKiBSU0FfcHJpdmF0ZV9rZXlfdG9fYnl0ZXMgbWFyc2hhbHMgfHJzYXwgYXMgYSBERVItZW5jb2RlZCBSU0FQcml2YXRlS2V5Ci0gKiBzdHJ1Y3R1cmUgKFJGQyAzNDQ3KSBhbmQsIG9uIHN1Y2Nlc3MsIHNldHMgfCpvdXRfYnl0ZXN8IHRvIGEgbmV3bHkgYWxsb2NhdGVkCi0gKiBidWZmZXIgY29udGFpbmluZyB0aGUgcmVzdWx0IGFuZCByZXR1cm5zIG9uZS4gT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHplcm8uIFRoZQotICogcmVzdWx0IHNob3VsZCBiZSBmcmVlZCB3aXRoIHxPUEVOU1NMX2ZyZWV8LiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFJTQV9wcml2YXRlX2tleV90b19ieXRlcyh1aW50OF90ICoqb3V0X2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm91dF9sZW4sIGNvbnN0IFJTQSAqcnNhKTsKKy8qIGkyZF9SU0FQcml2YXRlS2V5IG1hcnNoYWxzIHxpbnwgdG8gYW4gQVNOLjEsIERFUiBzdHJ1Y3R1cmUuIElmIHxvdXRwfCBpcyBub3QKKyAqIE5VTEwgdGhlbiB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gfCpvdXRwfCBhbmQgfCpvdXRwfCBpcyBhZHZhbmNlZCBqdXN0IHBhc3QKKyAqIHRoZSBvdXRwdXQuIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgcmVzdWx0LCB3aGV0aGVyIHdyaXR0ZW4gb3IKKyAqIG5vdCwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4gKi8KK09QRU5TU0xfRVhQT1JUIGludCBpMmRfUlNBUHJpdmF0ZUtleShjb25zdCBSU0EgKmluLCB1aW50OF90ICoqb3V0cCk7CiAKIAogLyogZXhfZGF0YSBmdW5jdGlvbnMuCkBAIC0zOTIsOSArMzU4LDYgQEAKIE9QRU5TU0xfRVhQT1JUIGludCBSU0Ffc2V0X2V4X2RhdGEoUlNBICpyLCBpbnQgaWR4LCB2b2lkICphcmcpOwogT1BFTlNTTF9FWFBPUlQgdm9pZCAqUlNBX2dldF9leF9kYXRhKGNvbnN0IFJTQSAqciwgaW50IGlkeCk7CiAKLQotLyogRmxhZ3MuICovCi0KIC8qIFJTQV9GTEFHX09QQVFVRSBzcGVjaWZpZXMgdGhhdCB0aGlzIFJTQV9NRVRIT0QgZG9lcyBub3QgZXhwb3NlIGl0cyBrZXkKICAqIG1hdGVyaWFsLiBUaGlzIG1heSBiZSBzZXQgaWYsIGZvciBpbnN0YW5jZSwgaXQgaXMgd3JhcHBpbmcgc29tZSBvdGhlciBjcnlwdG8KICAqIEFQSSwgbGlrZSBhIHBsYXRmb3JtIGtleSBzdG9yZS4gKi8KQEAgLTQzMiw1MCArMzk1LDYgQEAKIC8qIFJTQV9ibGluZGluZ19vbiByZXR1cm5zIG9uZS4gKi8KIE9QRU5TU0xfRVhQT1JUIGludCBSU0FfYmxpbmRpbmdfb24oUlNBICpyc2EsIEJOX0NUWCAqY3R4KTsKIAotLyogUlNBX2dlbmVyYXRlX2tleSBiZWhhdmVzIGxpa2UgfFJTQV9nZW5lcmF0ZV9rZXlfZXh8LCB3aGljaCBpcyB3aGF0IHlvdQotICogc2hvdWxkIHVzZSBpbnN0ZWFkLiBJdCByZXR1cm5zIE5VTEwgb24gZXJyb3IsIG9yIGEgbmV3bHktYWxsb2NhdGVkIHxSU0F8IG9uCi0gKiBzdWNjZXNzLiBUaGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IG9ubHkuIFRoZSB8Y2FsbGJhY2t8Ci0gKiBhbmQgfGNiX2FyZ3wgcGFyYW1ldGVycyBtdXN0IGJlIE5VTEwuICovCi1PUEVOU1NMX0VYUE9SVCBSU0EgKlJTQV9nZW5lcmF0ZV9rZXkoaW50IGJpdHMsIHVuc2lnbmVkIGxvbmcgZSwgdm9pZCAqY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2JfYXJnKTsKLQotLyogZDJpX1JTQVB1YmxpY0tleSBwYXJzZXMgYW4gQVNOLjEsIERFUi1lbmNvZGVkLCBSU0EgcHVibGljIGtleSBmcm9tIHxsZW58Ci0gKiBieXRlcyBhdCB8KmlucHwuIElmIHxvdXR8IGlzIG5vdCBOVUxMIHRoZW4sIG9uIGV4aXQsIGEgcG9pbnRlciB0byB0aGUgcmVzdWx0Ci0gKiBpcyBpbiB8Km91dHwuIElmIHwqb3V0fCBpcyBhbHJlYWR5IG5vbi1OVUxMIG9uIGVudHJ5IHRoZW4gdGhlIHJlc3VsdCBpcwotICogd3JpdHRlbiBkaXJlY3RseSBpbnRvIHwqb3V0fCwgb3RoZXJ3aXNlIGEgZnJlc2ggfFJTQXwgaXMgYWxsb2NhdGVkLiBPbgotICogc3VjY2Vzc2Z1bCBleGl0LCB8KmlucHwgaXMgYWR2YW5jZWQgcGFzdCB0aGUgREVSIHN0cnVjdHVyZS4gSXQgcmV0dXJucyB0aGUKLSAqIHJlc3VsdCBvciBOVUxMIG9uIGVycm9yLiAqLwotT1BFTlNTTF9FWFBPUlQgUlNBICpkMmlfUlNBUHVibGljS2V5KFJTQSAqKm91dCwgY29uc3QgdWludDhfdCAqKmlucCwgbG9uZyBsZW4pOwotCi0vKiBpMmRfUlNBUHVibGljS2V5IG1hcnNoYWxzIHxpbnwgdG8gYW4gQVNOLjEsIERFUiBzdHJ1Y3R1cmUuIElmIHxvdXRwfCBpcyBub3QKLSAqIE5VTEwgdGhlbiB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gfCpvdXRwfCBhbmQgfCpvdXRwfCBpcyBhZHZhbmNlZCBqdXN0IHBhc3QKLSAqIHRoZSBvdXRwdXQuIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgcmVzdWx0LCB3aGV0aGVyIHdyaXR0ZW4gb3IKLSAqIG5vdCwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBpMmRfUlNBUHVibGljS2V5KGNvbnN0IFJTQSAqaW4sIHVpbnQ4X3QgKipvdXRwKTsKLQotLyogZDJpX1JTQVByaXZhdGVLZXkgcGFyc2VzIGFuIEFTTi4xLCBERVItZW5jb2RlZCwgUlNBIHByaXZhdGUga2V5IGZyb20gfGxlbnwKLSAqIGJ5dGVzIGF0IHwqaW5wfC4gSWYgfG91dHwgaXMgbm90IE5VTEwgdGhlbiwgb24gZXhpdCwgYSBwb2ludGVyIHRvIHRoZSByZXN1bHQKLSAqIGlzIGluIHwqb3V0fC4gSWYgfCpvdXR8IGlzIGFscmVhZHkgbm9uLU5VTEwgb24gZW50cnkgdGhlbiB0aGUgcmVzdWx0IGlzCi0gKiB3cml0dGVuIGRpcmVjdGx5IGludG8gfCpvdXR8LCBvdGhlcndpc2UgYSBmcmVzaCB8UlNBfCBpcyBhbGxvY2F0ZWQuIE9uCi0gKiBzdWNjZXNzZnVsIGV4aXQsIHwqaW5wfCBpcyBhZHZhbmNlZCBwYXN0IHRoZSBERVIgc3RydWN0dXJlLiBJdCByZXR1cm5zIHRoZQotICogcmVzdWx0IG9yIE5VTEwgb24gZXJyb3IuICovCi1PUEVOU1NMX0VYUE9SVCBSU0EgKmQyaV9SU0FQcml2YXRlS2V5KFJTQSAqKm91dCwgY29uc3QgdWludDhfdCAqKmlucCwgbG9uZyBsZW4pOwotCi0vKiBpMmRfUlNBUHJpdmF0ZUtleSBtYXJzaGFscyB8aW58IHRvIGFuIEFTTi4xLCBERVIgc3RydWN0dXJlLiBJZiB8b3V0cHwgaXMgbm90Ci0gKiBOVUxMIHRoZW4gdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvIHwqb3V0cHwgYW5kIHwqb3V0cHwgaXMgYWR2YW5jZWQganVzdCBwYXN0Ci0gKiB0aGUgb3V0cHV0LiBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHJlc3VsdCwgd2hldGhlciB3cml0dGVuIG9yCi0gKiBub3QsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgaTJkX1JTQVByaXZhdGVLZXkoY29uc3QgUlNBICppbiwgdWludDhfdCAqKm91dHApOwotCi10eXBlZGVmIHN0cnVjdCByc2FfcHNzX3BhcmFtc19zdCB7Ci0gIFg1MDlfQUxHT1IgKmhhc2hBbGdvcml0aG07Ci0gIFg1MDlfQUxHT1IgKm1hc2tHZW5BbGdvcml0aG07Ci0gIEFTTjFfSU5URUdFUiAqc2FsdExlbmd0aDsKLSAgQVNOMV9JTlRFR0VSICp0cmFpbGVyRmllbGQ7Ci19IFJTQV9QU1NfUEFSQU1TOwotCi1ERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFJTQV9QU1NfUEFSQU1TKQotCiAKIHN0cnVjdCByc2FfbWV0aF9zdCB7CiAgIHN0cnVjdCBvcGVuc3NsX21ldGhvZF9jb21tb25fc3QgY29tbW9uOwpAQCAtNTMxLDkgKzQ1MCw2IEBACiAKICAgaW50ICgqa2V5Z2VuKShSU0EgKnJzYSwgaW50IGJpdHMsIEJJR05VTSAqZSwgQk5fR0VOQ0IgKmNiKTsKIAotICBpbnQgKCptdWx0aV9wcmltZV9rZXlnZW4pKFJTQSAqcnNhLCBpbnQgYml0cywgaW50IG51bV9wcmltZXMsIEJJR05VTSAqZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9HRU5DQiAqY2IpOwotCiAgIC8qIHN1cHBvcnRzX2RpZ2VzdCByZXR1cm5zIG9uZSBpZiB8cnNhfCBzdXBwb3J0cyBkaWdlc3RzIG9mIHR5cGUKICAgICogfG1kfC4gSWYgbnVsbCwgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbCBkaWdlc3RzIGFyZSBzdXBwb3J0ZWQuICovCiAgIGludCAoKnN1cHBvcnRzX2RpZ2VzdCkoY29uc3QgUlNBICpyc2EsIGNvbnN0IEVWUF9NRCAqbWQpOwpAQCAtNTQ1LDYgKzQ2MSw4IEBACiB0eXBlZGVmIHN0cnVjdCBibl9ibGluZGluZ19zdCBCTl9CTElORElORzsKIAogc3RydWN0IHJzYV9zdCB7CisgIC8qIHZlcnNpb24gaXMgb25seSB1c2VkIGR1cmluZyBBU04uMSAoZGUpc2VyaWFsaXNhdGlvbi4gKi8KKyAgbG9uZyB2ZXJzaW9uOwogICBSU0FfTUVUSE9EICptZXRoOwogCiAgIEJJR05VTSAqbjsKQEAgLTU1NSw5ICs0NzMsNiBAQAogICBCSUdOVU0gKmRtcDE7CiAgIEJJR05VTSAqZG1xMTsKICAgQklHTlVNICppcW1wOwotCi0gIFNUQUNLX09GKFJTQV9hZGRpdGlvbmFsX3ByaW1lKSAqYWRkaXRpb25hbF9wcmltZXM7Ci0KICAgLyogYmUgY2FyZWZ1bCB1c2luZyB0aGlzIGlmIHRoZSBSU0Egc3RydWN0dXJlIGlzIHNoYXJlZCAqLwogICBDUllQVE9fRVhfREFUQSBleF9kYXRhOwogICBDUllQVE9fcmVmY291bnRfdCByZWZlcmVuY2VzOwpAQCAtNTg3LDYgKzUwMiwzNCBAQAogfSAgLyogZXh0ZXJuIEMgKi8KICNlbmRpZgogCisjZGVmaW5lIFJTQV9GX0JOX0JMSU5ESU5HX2NvbnZlcnRfZXggMTAwCisjZGVmaW5lIFJTQV9GX0JOX0JMSU5ESU5HX2NyZWF0ZV9wYXJhbSAxMDEKKyNkZWZpbmUgUlNBX0ZfQk5fQkxJTkRJTkdfaW52ZXJ0X2V4IDEwMgorI2RlZmluZSBSU0FfRl9CTl9CTElORElOR19uZXcgMTAzCisjZGVmaW5lIFJTQV9GX0JOX0JMSU5ESU5HX3VwZGF0ZSAxMDQKKyNkZWZpbmUgUlNBX0ZfUlNBX2NoZWNrX2tleSAxMDUKKyNkZWZpbmUgUlNBX0ZfUlNBX25ld19tZXRob2QgMTA2CisjZGVmaW5lIFJTQV9GX1JTQV9wYWRkaW5nX2FkZF9QS0NTMV9PQUVQX21nZjEgMTA3CisjZGVmaW5lIFJTQV9GX1JTQV9wYWRkaW5nX2FkZF9QS0NTMV9QU1NfbWdmMSAxMDgKKyNkZWZpbmUgUlNBX0ZfUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX3R5cGVfMSAxMDkKKyNkZWZpbmUgUlNBX0ZfUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX3R5cGVfMiAxMTAKKyNkZWZpbmUgUlNBX0ZfUlNBX3BhZGRpbmdfYWRkX25vbmUgMTExCisjZGVmaW5lIFJTQV9GX1JTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX09BRVBfbWdmMSAxMTIKKyNkZWZpbmUgUlNBX0ZfUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8xIDExMworI2RlZmluZSBSU0FfRl9SU0FfcGFkZGluZ19jaGVja19QS0NTMV90eXBlXzIgMTE0CisjZGVmaW5lIFJTQV9GX1JTQV9wYWRkaW5nX2NoZWNrX25vbmUgMTE1CisjZGVmaW5lIFJTQV9GX1JTQV9yZWNvdmVyX2NydF9wYXJhbXMgMTE2CisjZGVmaW5lIFJTQV9GX1JTQV9zaWduIDExNworI2RlZmluZSBSU0FfRl9SU0FfdmVyaWZ5IDExOAorI2RlZmluZSBSU0FfRl9SU0FfdmVyaWZ5X1BLQ1MxX1BTU19tZ2YxIDExOQorI2RlZmluZSBSU0FfRl9kZWNyeXB0IDEyMAorI2RlZmluZSBSU0FfRl9lbmNyeXB0IDEyMQorI2RlZmluZSBSU0FfRl9rZXlnZW4gMTIyCisjZGVmaW5lIFJTQV9GX3BrY3MxX3ByZWZpeGVkX21zZyAxMjMKKyNkZWZpbmUgUlNBX0ZfcHJpdmF0ZV90cmFuc2Zvcm0gMTI0CisjZGVmaW5lIFJTQV9GX3JzYV9zZXR1cF9ibGluZGluZyAxMjUKKyNkZWZpbmUgUlNBX0Zfc2lnbl9yYXcgMTI2CisjZGVmaW5lIFJTQV9GX3ZlcmlmeV9yYXcgMTI3CiAjZGVmaW5lIFJTQV9SX0JBRF9FX1ZBTFVFIDEwMAogI2RlZmluZSBSU0FfUl9CQURfRklYRURfSEVBREVSX0RFQ1JZUFQgMTAxCiAjZGVmaW5lIFJTQV9SX0JBRF9QQURfQllURV9DT1VOVCAxMDIKQEAgLTYyOCwxMCArNTcxLDUgQEAKICNkZWZpbmUgUlNBX1JfVU5LTk9XTl9QQURESU5HX1RZUEUgMTM4CiAjZGVmaW5lIFJTQV9SX1ZBTFVFX01JU1NJTkcgMTM5CiAjZGVmaW5lIFJTQV9SX1dST05HX1NJR05BVFVSRV9MRU5HVEggMTQwCi0jZGVmaW5lIFJTQV9SX01VU1RfSEFWRV9BVF9MRUFTVF9UV09fUFJJTUVTIDE0MQotI2RlZmluZSBSU0FfUl9DQU5OT1RfUkVDT1ZFUl9NVUxUSV9QUklNRV9LRVkgMTQyCi0jZGVmaW5lIFJTQV9SX0JBRF9FTkNPRElORyAxNDMKLSNkZWZpbmUgUlNBX1JfRU5DT0RFX0VSUk9SIDE0NAotI2RlZmluZSBSU0FfUl9CQURfVkVSU0lPTiAxNDUKIAogI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9SU0FfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9zcnRwLmggYi9zcmMvaW5jbHVkZS9vcGVuc3NsL3NydHAuaAppbmRleCAzOWY2YTg1Li4zZjVhNTNlIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9vcGVuc3NsL3NydHAuaAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL3NydHAuaApAQCAtMSwxOCArMSwxNzggQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNSwgR29vZ2xlIEluYy4KKy8qIHNzbC90bHMxLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLworICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qCisgIERUTFMgY29kZSBieSBFcmljIFJlc2NvcmxhIDxla3JAcnRmbS5jb20+CiAKLS8qIFRoaXMgaGVhZGVyIGlzIHByb3ZpZGVkIGluIG9yZGVyIHRvIG1ha2UgY29tcGlsaW5nIGFnYWluc3QgY29kZSB0aGF0IGV4cGVjdHMKLSAgIE9wZW5TU0wgZWFzaWVyLiAqLworICBDb3B5cmlnaHQgKEMpIDIwMDYsIE5ldHdvcmsgUmVzb25hbmNlLCBJbmMuCisgIENvcHlyaWdodCAoQykgMjAxMSwgUlRGTSwgSW5jLgorKi8KIAotI2luY2x1ZGUgInNzbC5oIgorI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9TUlRQX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfU1JUUF9ICisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogQ29uc3RhbnRzIGZvciBTUlRQIHByb2ZpbGVzICovCisjZGVmaW5lIFNSVFBfQUVTMTI4X0NNX1NIQTFfODAgMHgwMDAxCisjZGVmaW5lIFNSVFBfQUVTMTI4X0NNX1NIQTFfMzIgMHgwMDAyCisjZGVmaW5lIFNSVFBfQUVTMTI4X0Y4X1NIQTFfODAgMHgwMDAzCisjZGVmaW5lIFNSVFBfQUVTMTI4X0Y4X1NIQTFfMzIgMHgwMDA0CisjZGVmaW5lIFNSVFBfTlVMTF9TSEExXzgwICAgICAgMHgwMDA1CisjZGVmaW5lIFNSVFBfTlVMTF9TSEExXzMyICAgICAgMHgwMDA2CisKKy8qIFNTTF9DVFhfc2V0X3NydHBfcHJvZmlsZXMgZW5hYmxlcyBTUlRQIGZvciBhbGwgU1NMIG9iamVjdHMgY3JlYXRlZCBmcm9tCisgKiB8Y3R4fC4gfHByb2ZpbGV8IGNvbnRhaW5zIGEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgcHJvZmlsZSBuYW1lcy4gSXQgcmV0dXJucworICogb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZmFpbHVyZS4gKi8KK09QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3NldF9zcnRwX3Byb2ZpbGVzKFNTTF9DVFggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByb2ZpbGVzKTsKKworLyogU1NMX3NldF9zcnRwX3Byb2ZpbGVzIGVuYWJsZXMgU1JUUCBmb3IgfHNzbHwuICB8cHJvZmlsZXwgY29udGFpbnMgYQorICogY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgcHJvZmlsZSBuYW1lcy4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbgorICogZmFpbHVyZS4gKi8KK09QRU5TU0xfRVhQT1JUIGludCBTU0xfc2V0X3NydHBfcHJvZmlsZXMoU1NMICpjdHgsIGNvbnN0IGNoYXIgKnByb2ZpbGVzKTsKKworLyogU1NMX2dldF9zcnRwX3Byb2ZpbGVzIHJldHVybnMgdGhlIFNSVFAgcHJvZmlsZXMgc3VwcG9ydGVkIGJ5IHxzc2x8LiAqLworT1BFTlNTTF9FWFBPUlQgU1RBQ0tfT0YoU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUpICpTU0xfZ2V0X3NydHBfcHJvZmlsZXMoCisgICAgU1NMICpzc2wpOworCisvKiBTU0xfZ2V0X3NlbGVjdGVkX3NydHBfcHJvZmlsZSByZXR1cm5zIHRoZSBzZWxlY3RlZCBTUlRQIHByb2ZpbGUsIG9yIE5VTEwgaWYKKyAqIFNSVFAgd2FzIG5vdCBuZWdvdGlhdGVkLiAqLworT1BFTlNTTF9FWFBPUlQgY29uc3QgU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUgKlNTTF9nZXRfc2VsZWN0ZWRfc3J0cF9wcm9maWxlKAorICAgIFNTTCAqcyk7CisKKworLyogRGVwcmVjYXRlZCBmdW5jdGlvbnMgKi8KKworLyogU1NMX0NUWF9zZXRfdGxzZXh0X3VzZV9zcnRwIGNhbGxzIFNTTF9DVFhfc2V0X3NydHBfcHJvZmlsZXMuIEl0IHJldHVybnMgemVybworICogb24gc3VjY2VzcyBhbmQgb25lIG9uIGZhaWx1cmUuCisgKgorICogV0FSTklORzogdGhpcyBmdW5jdGlvbiBpcyBkYW5nZXJvdXMgYmVjYXVzZSBpdCBicmVha3MgdGhlIHVzdWFsIHJldHVybiB2YWx1ZQorICogY29udmVudGlvbi4gVXNlIFNTTF9DVFhfc2V0X3NydHBfcHJvZmlsZXMgaW5zdGVhZC4gKi8KK09QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3NldF90bHNleHRfdXNlX3NydHAoU1NMX0NUWCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm9maWxlcyk7CisKKy8qIFNTTF9zZXRfdGxzZXh0X3VzZV9zcnRwIGNhbGxzIFNTTF9zZXRfc3J0cF9wcm9maWxlcy4gSXQgcmV0dXJucyB6ZXJvIG9uCisgKiBzdWNjZXNzIGFuZCBvbmUgb24gZmFpbHVyZS4KKyAqCisgKiBXQVJOSU5HOiB0aGlzIGZ1bmN0aW9uIGlzIGRhbmdlcm91cyBiZWNhdXNlIGl0IGJyZWFrcyB0aGUgdXN1YWwgcmV0dXJuIHZhbHVlCisgKiBjb252ZW50aW9uLiBVc2UgU1NMX3NldF9zcnRwX3Byb2ZpbGVzIGluc3RlYWQuICovCitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3NldF90bHNleHRfdXNlX3NydHAoU1NMICpjdHgsIGNvbnN0IGNoYXIgKnByb2ZpbGVzKTsKKworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfU1JUUF9IICovCisKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wZW5zc2wvc3NsLmggYi9zcmMvaW5jbHVkZS9vcGVuc3NsL3NzbC5oCmluZGV4IDI0YmRmOGUuLjIxN2RiYWYgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wZW5zc2wvc3NsLmgKKysrIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9zc2wuaApAQCAtMTc5LDkgKzE3OSwzMiBAQAogT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9saWJyYXJ5X2luaXQodm9pZCk7CiAKIAotLyogQ2lwaGVyIHN1aXRlcy4KLSAqCi0gKiB8U1NMX0NJUEhFUnwgb2JqZWN0cyByZXByZXNlbnQgY2lwaGVyIHN1aXRlcy4gKi8KKy8qIENpcGhlciBzdWl0ZXMuICovCisKKy8qIEFuIFNTTF9DSVBIRVIgcmVwcmVzZW50cyBhIGNpcGhlciBzdWl0ZS4gKi8KK3R5cGVkZWYgc3RydWN0IHNzbF9jaXBoZXJfc3QgeworICAvKiBuYW1lIGlzIHRoZSBPcGVuU1NMIG5hbWUgZm9yIHRoZSBjaXBoZXIuICovCisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIC8qIGlkIGlzIHRoZSBjaXBoZXIgc3VpdGUgdmFsdWUgYml0d2lzZSBPUi1kIHdpdGggMHgwMzAwMDAwMC4gKi8KKyAgdWludDMyX3QgaWQ7CisKKyAgLyogVGhlIGZvbGxvd2luZyBhcmUgaW50ZXJuYWwgZmllbGRzLiBTZWUgc3NsL2ludGVybmFsLmggZm9yIHRoZWlyIHZhbHVlcy4gKi8KKworICB1aW50MzJfdCBhbGdvcml0aG1fbWtleTsKKyAgdWludDMyX3QgYWxnb3JpdGhtX2F1dGg7CisgIHVpbnQzMl90IGFsZ29yaXRobV9lbmM7CisgIHVpbnQzMl90IGFsZ29yaXRobV9tYWM7CisgIHVpbnQzMl90IGFsZ29yaXRobV9zc2w7CisgIHVpbnQzMl90IGFsZ29fc3RyZW5ndGg7CisKKyAgLyogYWxnb3JpdGhtMiBjb250YWlucyBleHRyYSBmbGFncy4gU2VlIHNzbC9pbnRlcm5hbC5oLiAqLworICB1aW50MzJfdCBhbGdvcml0aG0yOworCisgIC8qIHN0cmVuZ3RoX2JpdHMgaXMgdGhlIHN0cmVuZ3RoIG9mIHRoZSBjaXBoZXIgaW4gYml0cy4gKi8KKyAgaW50IHN0cmVuZ3RoX2JpdHM7CisgIC8qIGFsZ19iaXRzIGlzIHRoZSBudW1iZXIgb2YgYml0cyBvZiBrZXkgbWF0ZXJpYWwgdXNlZCBieSB0aGUgYWxnb3JpdGhtLiAqLworICBpbnQgYWxnX2JpdHM7Cit9IFNTTF9DSVBIRVI7CiAKIERFQ0xBUkVfU1RBQ0tfT0YoU1NMX0NJUEhFUikKIApAQCAtMjA4LDE1ICsyMzEsNiBAQAogICogQ0hBQ0hBMjBfUE9MWTEzMDUuICovCiBPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NJUEhFUl9pc19DSEFDSEEyMFBPTFkxMzA1KGNvbnN0IFNTTF9DSVBIRVIgKmNpcGhlcik7CiAKLS8qIFNTTF9DSVBIRVJfaXNfTlVMTCByZXR1cm5zIG9uZSBpZiB8Y2lwaGVyfCBkb2VzIG5vdCBlbmNyeXB0LiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DSVBIRVJfaXNfTlVMTChjb25zdCBTU0xfQ0lQSEVSICpjaXBoZXIpOwotCi0vKiBTU0xfQ0lQSEVSX2lzX1JDNCByZXR1cm5zIG9uZSBpZiB8Y2lwaGVyfCB1c2VzIFJDNC4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ0lQSEVSX2lzX1JDNChjb25zdCBTU0xfQ0lQSEVSICpjaXBoZXIpOwotCi0vKiBTU0xfQ0lQSEVSX2lzX2Jsb2NrX2NpcGhlciByZXR1cm5zIG9uZSBpZiB8Y2lwaGVyfCBpcyBhIGJsb2NrIGNpcGhlci4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ0lQSEVSX2lzX2Jsb2NrX2NpcGhlcihjb25zdCBTU0xfQ0lQSEVSICpjaXBoZXIpOwotCiAvKiBTU0xfQ0lQSEVSX2dldF9uYW1lIHJldHVybnMgdGhlIE9wZW5TU0wgbmFtZSBvZiB8Y2lwaGVyfC4gKi8KIE9QRU5TU0xfRVhQT1JUIGNvbnN0IGNoYXIgKlNTTF9DSVBIRVJfZ2V0X25hbWUoY29uc3QgU1NMX0NJUEhFUiAqY2lwaGVyKTsKIApAQCAtMjM3LDE1ICsyNTEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0X2FsZ19iaXRzKTsKIAogCi0vKiBTU0wgY29udGV4dHMuCi0gKgotICogfFNTTF9DVFh8IG9iamVjdHMgbWFuYWdlIHNoYXJlZCBzdGF0ZSBhbmQgY29uZmlndXJhdGlvbiBiZXR3ZWVuIG11bHRpcGxlIFRMUwotICogb3IgRFRMUyBjb25uZWN0aW9ucy4gV2hldGhlciB0aGUgY29ubmVjdGlvbnMgYXJlIFRMUyBvciBEVExTIGlzIHNlbGVjdGVkIGJ5Ci0gKiBhbiB8U1NMX01FVEhPRHwgb24gY3JlYXRpb24uCi0gKgotICogfFNTTF9DVFh8IGFyZSByZWZlcmVuY2UtY291bnRlZCBhbmQgbWF5IGJlIHNoYXJlZCBieSBjb25uZWN0aW9ucyBhY3Jvc3MKLSAqIG11bHRpcGxlIHRocmVhZHMuIE9uY2Ugc2hhcmVkLCBmdW5jdGlvbnMgd2hpY2ggY2hhbmdlIHRoZSB8U1NMX0NUWHwncwotICogY29uZmlndXJhdGlvbiBtYXkgbm90IGJlIHVzZWQuICovCisvKiBTU0wgY29udGV4dHMuICovCisKKy8qIEFuIFNTTF9NRVRIT0Qgc2VsZWN0cyB3aGV0aGVyIHRvIHVzZSBUTFMgb3IgRFRMUy4gKi8KK3R5cGVkZWYgc3RydWN0IHNzbF9tZXRob2Rfc3QgU1NMX01FVEhPRDsKIAogLyogVExTX21ldGhvZCBpcyB0aGUgfFNTTF9NRVRIT0R8IHVzZWQgZm9yIFRMUyAoYW5kIFNTTHYzKSBjb25uZWN0aW9ucy4gKi8KIE9QRU5TU0xfRVhQT1JUIGNvbnN0IFNTTF9NRVRIT0QgKlRMU19tZXRob2Qodm9pZCk7CkBAIC0yNTQsMjIgKzI2MywyMCBAQAogT1BFTlNTTF9FWFBPUlQgY29uc3QgU1NMX01FVEhPRCAqRFRMU19tZXRob2Qodm9pZCk7CiAKIC8qIFNTTF9DVFhfbmV3IHJldHVybnMgYSBuZXdseS1hbGxvY2F0ZWQgfFNTTF9DVFh8IHdpdGggZGVmYXVsdCBzZXR0aW5ncyBvciBOVUxMCi0gKiBvbiBlcnJvci4gKi8KKyAqIG9uIGVycm9yLiBBbiB8U1NMX0NUWHwgbWFuYWdlcyBzaGFyZWQgc3RhdGUgYW5kIGNvbmZpZ3VyYXRpb24gYmV0d2VlbgorICogbXVsdGlwbGUgVExTIG9yIERUTFMgY29ubmVjdGlvbnMuICovCiBPUEVOU1NMX0VYUE9SVCBTU0xfQ1RYICpTU0xfQ1RYX25ldyhjb25zdCBTU0xfTUVUSE9EICptZXRob2QpOwogCiAvKiBTU0xfQ1RYX2ZyZWUgcmVsZWFzZXMgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB8Y3R4fC4gKi8KIE9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX0NUWF9mcmVlKFNTTF9DVFggKmN0eCk7CiAKIAotLyogU1NMIGNvbm5lY3Rpb25zLgotICoKLSAqIEFuIHxTU0x8IG9iamVjdCByZXByZXNlbnRzIGEgc2luZ2xlIFRMUyBvciBEVExTIGNvbm5lY3Rpb24uIEFsdGhvdWdoIHRoZQotICogc2hhcmVkIHxTU0xfQ1RYfCBpcyB0aHJlYWQtc2FmZSwgYW4gfFNTTHwgaXMgbm90IHRocmVhZC1zYWZlIGFuZCBtYXkgb25seSBiZQotICogdXNlZCBvbiBvbmUgdGhyZWFkIGF0IGEgdGltZS4gKi8KKy8qIFNTTCBjb25uZWN0aW9ucy4gKi8KIAotLyogU1NMX25ldyByZXR1cm5zIGEgbmV3bHktYWxsb2NhdGVkIHxTU0x8IHVzaW5nIHxjdHh8IG9yIE5VTEwgb24gZXJyb3IuIFRoZSBuZXcKLSAqIGNvbm5lY3Rpb24gaW5oZXJpdHMgc2V0dGluZ3MgZnJvbSB8Y3R4fCBhdCB0aGUgdGltZSBvZiBjcmVhdGlvbi4gU2V0dGluZ3MgbWF5Ci0gKiBhbHNvIGJlIGluZGl2aWR1YWxseSBjb25maWd1cmVkIG9uIHRoZSBjb25uZWN0aW9uLgorLyogU1NMX25ldyByZXR1cm5zIGEgbmV3bHktYWxsb2NhdGVkIHxTU0x8IHVzaW5nIHxjdHh8IG9yIE5VTEwgb24gZXJyb3IuIEFuCisgKiB8U1NMfCBvYmplY3QgcmVwcmVzZW50cyBhIHNpbmdsZSBUTFMgb3IgRFRMUyBjb25uZWN0aW9uLiBJdCBpbmhlcml0cyBzZXR0aW5ncworICogZnJvbSB8Y3R4fCBhdCB0aGUgdGltZSBvZiBjcmVhdGlvbi4gU2V0dGluZ3MgbWF5IGFsc28gYmUgaW5kaXZpZHVhbGx5CisgKiBjb25maWd1cmVkIG9uIHRoZSBjb25uZWN0aW9uLgogICoKICAqIE9uIGNyZWF0aW9uLCBhbiB8U1NMfCBpcyBub3QgY29uZmlndXJlZCB0byBiZSBlaXRoZXIgYSBjbGllbnQgb3Igc2VydmVyLiBDYWxsCiAgKiB8U1NMX3NldF9jb25uZWN0X3N0YXRlfCBvciB8U1NMX3NldF9hY2NlcHRfc3RhdGV8IHRvIHNldCB0aGlzLiAqLwpAQCAtMjg0LDE4MyArMjkxLDkgQEAKIC8qIFNTTF9zZXRfYWNjZXB0X3N0YXRlIGNvbmZpZ3VyZXMgfHNzbHwgdG8gYmUgYSBzZXJ2ZXIuICovCiBPUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9zZXRfYWNjZXB0X3N0YXRlKFNTTCAqc3NsKTsKIAotLyogU1NMX2lzX3NlcnZlciByZXR1cm5zIG9uZSBpZiB8c3NsfCBpcyBjb25maWd1cmVkIGFzIGEgc2VydmVyIGFuZCB6ZXJvCi0gKiBvdGhlcndpc2UuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX2lzX3NlcnZlcihTU0wgKnNzbCk7Ci0KLS8qIFNTTF9zZXRfYmlvIGNvbmZpZ3VyZXMgfHNzbHwgdG8gcmVhZCBmcm9tIHxyYmlvfCBhbmQgd3JpdGUgdG8gfHdiaW98LiB8c3NsfAotICogdGFrZXMgb3duZXJzaGlwIG9mIHRoZSB0d28gfEJJT3xzLiBJZiB8cmJpb3wgYW5kIHx3YmlvfCBhcmUgdGhlIHNhbWUsIHxzc2x8Ci0gKiBvbmx5IHRha2VzIG93bmVyc2hpcCBvZiBvbmUgcmVmZXJlbmNlLgotICoKLSAqIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBvbiBhbiBhbHJlYWR5LWNvbmZpZ3VyZWQgfHNzbHwgaXMgZGVwcmVjYXRlZC4gKi8KLU9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX3NldF9iaW8oU1NMICpzc2wsIEJJTyAqcmJpbywgQklPICp3YmlvKTsKLQotLyogU1NMX2dldF9yYmlvIHJldHVybnMgdGhlIHxCSU98IHRoYXQgfHNzbHwgcmVhZHMgZnJvbS4gKi8KLU9QRU5TU0xfRVhQT1JUIEJJTyAqU1NMX2dldF9yYmlvKGNvbnN0IFNTTCAqc3NsKTsKLQotLyogU1NMX2dldF93YmlvIHJldHVybnMgdGhlIHxCSU98IHRoYXQgfHNzbHwgd3JpdGVzIHRvLiAqLwotT1BFTlNTTF9FWFBPUlQgQklPICpTU0xfZ2V0X3diaW8oY29uc3QgU1NMICpzc2wpOwotCi0vKiBTU0xfZG9faGFuZHNoYWtlIGNvbnRpbnVlcyB0aGUgY3VycmVudCBoYW5kc2hha2UuIElmIHRoZXJlIGlzIG5vbmUgb3IgdGhlCi0gKiBoYW5kc2hha2UgaGFzIGNvbXBsZXRlZCBvciBGYWxzZSBTdGFydGVkLCBpdCByZXR1cm5zIG9uZS4gT3RoZXJ3aXNlLCBpdAotICogcmV0dXJucyA8PSAwLiBUaGUgY2FsbGVyIHNob3VsZCBwYXNzIHRoZSB2YWx1ZSBpbnRvIHxTU0xfZ2V0X2Vycm9yfCB0bwotICogZGV0ZXJtaW5lIGhvdyB0byBwcm9jZWVkLgotICoKLSAqIFRPRE8oZGF2aWRiZW4pOiBFbnN1cmUgMCBpcyBvbmx5IHJldHVybmVkIG9uIHRyYW5zcG9ydCBFT0YuCi0gKiBodHRwczovL2NyYnVnLmNvbS80NjYzMDMuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX2RvX2hhbmRzaGFrZShTU0wgKnNzbCk7Ci0KLS8qIFNTTF9jb25uZWN0IGNvbmZpZ3VyZXMgfHNzbHwgYXMgYSBjbGllbnQsIGlmIHVuY29uZmlndXJlZCwgYW5kIGNhbGxzCi0gKiB8U1NMX2RvX2hhbmRzaGFrZXwuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX2Nvbm5lY3QoU1NMICpzc2wpOwotCi0vKiBTU0xfYWNjZXB0IGNvbmZpZ3VyZXMgfHNzbHwgYXMgYSBzZXJ2ZXIsIGlmIHVuY29uZmlndXJlZCwgYW5kIGNhbGxzCi0gKiB8U1NMX2RvX2hhbmRzaGFrZXwuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX2FjY2VwdChTU0wgKnNzbCk7Ci0KLS8qIFNTTF9yZWFkIHJlYWRzIHVwIHRvIHxudW18IGJ5dGVzIGZyb20gfHNzbHwgaW50byB8YnVmfC4gSXQgaW1wbGljaXRseSBydW5zCi0gKiBhbnkgcGVuZGluZyBoYW5kc2hha2VzLCBpbmNsdWRpbmcgcmVuZWdvdGlhdGlvbnMgd2hlbiBlbmFibGVkLiBPbiBzdWNjZXNzLCBpdAotICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuIE90aGVyd2lzZSwgaXQgcmV0dXJucyA8PSAwLiBUaGUgY2FsbGVyCi0gKiBzaG91bGQgcGFzcyB0aGUgdmFsdWUgaW50byB8U1NMX2dldF9lcnJvcnwgdG8gZGV0ZXJtaW5lIGhvdyB0byBwcm9jZWVkLgotICoKLSAqIFRPRE8oZGF2aWRiZW4pOiBFbnN1cmUgMCBpcyBvbmx5IHJldHVybmVkIG9uIHRyYW5zcG9ydCBFT0YuCi0gKiBodHRwczovL2NyYnVnLmNvbS80NjYzMDMuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3JlYWQoU1NMICpzc2wsIHZvaWQgKmJ1ZiwgaW50IG51bSk7Ci0KLS8qIFNTTF9wZWVrIGJlaGF2ZXMgbGlrZSB8U1NMX3JlYWR8IGJ1dCBkb2VzIG5vdCBjb25zdW1lIGFueSBieXRlcyByZXR1cm5lZC4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfcGVlayhTU0wgKnNzbCwgdm9pZCAqYnVmLCBpbnQgbnVtKTsKLQotLyogU1NMX3dyaXRlIHdyaXRlcyB1cCB0byB8bnVtfCBieXRlcyBmcm9tIHxidWZ8IGludG8gfHNzbHwuIEl0IGltcGxpY2l0bHkgcnVucwotICogYW55IHBlbmRpbmcgaGFuZHNoYWtlcywgaW5jbHVkaW5nIHJlbmVnb3RpYXRpb25zIHdoZW4gZW5hYmxlZC4gT24gc3VjY2VzcywgaXQKLSAqIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLiBPdGhlcndpc2UsIGl0IHJldHVybnMgPD0gMC4gVGhlIGNhbGxlcgotICogc2hvdWxkIHBhc3MgdGhlIHZhbHVlIGludG8gfFNTTF9nZXRfZXJyb3J8IHRvIGRldGVybWluZSBob3cgdG8gcHJvY2VlZC4KLSAqCi0gKiBBIG5vbi1ibG9ja2luZyB8U1NMX3dyaXRlfCBkaWZmZXJzIGZyb20gbm9uLWJsb2NraW5nIHx3cml0ZXwgaW4gdGhhdCBhIGZhaWxlZAotICogfFNTTF93cml0ZXwgc3RpbGwgY29tbWl0cyB0byB0aGUgZGF0YSBwYXNzZWQgaW4uIFdoZW4gcmV0cnlpbmcsIHRoZSBjYWxsZXIKLSAqIG11c3Qgc3VwcGx5IHRoZSBvcmlnaW5hbCB3cml0ZSBidWZmZXIgKG9yIGEgbGFyZ2VyIG9uZSBjb250YWluaW5nIHRoZQotICogb3JpZ2luYWwgYXMgYSBwcmVmaXgpLiBCeSBkZWZhdWx0LCByZXRyaWVzIHdpbGwgZmFpbCBpZiB0aGV5IGFsc28gZG8gbm90Ci0gKiByZXVzZSB0aGUgc2FtZSB8YnVmfCBwb2ludGVyLiBUaGlzIG1heSBiZSByZWxheGVkIHdpdGgKLSAqIHxTU0xfTU9ERV9BQ0NFUFRfTU9WSU5HX1dSSVRFX0JVRkZFUnwsIGJ1dCB0aGUgYnVmZmVyIGNvbnRlbnRzIHN0aWxsIG11c3QgYmUKLSAqIHVuY2hhbmdlZC4KLSAqCi0gKiBCeSBkZWZhdWx0LCB8U1NMX3dyaXRlfCB3aWxsIG5vdCByZXR1cm4gc3VjY2VzcyB1bnRpbCBhbGwgfG51bXwgYnl0ZXMgYXJlCi0gKiB3cml0dGVuLiBUaGlzIG1heSBiZSByZWxheGVkIHdpdGggfFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFfC4gSXQgYWxsb3dzCi0gKiB8U1NMX3dyaXRlfCB0byBjb21wbGV0ZSB3aXRoIGEgcGFydGlhbCByZXN1bHQgd2hlbiBvbmx5IHBhcnQgb2YgdGhlIGlucHV0IHdhcwotICogd3JpdHRlbiBpbiBhIHNpbmdsZSByZWNvcmQuCi0gKgotICogVE9ETyhkYXZpZGJlbik6IEVuc3VyZSAwIGlzIG9ubHkgcmV0dXJuZWQgb24gdHJhbnNwb3J0IEVPRi4KLSAqIGh0dHBzOi8vY3JidWcuY29tLzQ2NjMwMy4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfd3JpdGUoU1NMICpzc2wsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG51bSk7Ci0KLS8qIFNTTF9zaHV0ZG93biBzaHV0cyBkb3duIHxzc2x8LiBPbiBzdWNjZXNzLCBpdCBjb21wbGV0ZXMgaW4gdHdvIHN0YWdlcy4gRmlyc3QsCi0gKiBpdCByZXR1cm5zIDAgaWYgfHNzbHwgY29tcGxldGVkIHVuaS1kaXJlY3Rpb25hbCBzaHV0ZG93bjsgY2xvc2Vfbm90aWZ5IGhhcwotICogYmVlbiBzZW50LCBidXQgdGhlIHBlZXIncyBjbG9zZV9ub3RpZnkgaGFzIG5vdCBiZWVuIHJlY2VpdmVkLiBNb3N0IGNhbGxlcnMKLSAqIG1heSBzdG9wIGF0IHRoaXMgcG9pbnQuIEZvciBiaS1kaXJlY3Rpb25hbCBzaHV0ZG93biwgY2FsbCB8U1NMX3NodXRkb3dufAotICogYWdhaW4uIEl0IHJldHVybnMgMSBpZiBjbG9zZV9ub3RpZnkgaGFzIGJlZW4gYm90aCBzZW50IGFuZCByZWNlaXZlZC4KLSAqCi0gKiBJZiB0aGUgcGVlcidzIGNsb3NlX25vdGlmeSBhcnJpdmVkIGZpcnN0LCB0aGUgZmlyc3Qgc3RhZ2UgaXMgc2tpcHBlZC4KLSAqIHxTU0xfc2h1dGRvd258IHdpbGwgcmV0dXJuIDEgb25jZSBjbG9zZV9ub3RpZnkgaXMgc2VudCBhbmQgc2tpcCAwLiBDYWxsZXJzCi0gKiBvbmx5IGludGVyZXN0ZWQgaW4gdW5pLWRpcmVjdGlvbmFsIHNodXRkb3duIG11c3QgdGhlcmVmb3JlIGFsbG93IGZvciB0aGUKLSAqIGZpcnN0IHN0YWdlIHJldHVybmluZyBlaXRoZXIgMCBvciAxLgotICoKLSAqIHxTU0xfc2h1dGRvd258IHJldHVybnMgLTEgb24gZmFpbHVyZS4gVGhlIGNhbGxlciBzaG91bGQgcGFzcyB0aGUgcmV0dXJuIHZhbHVlCi0gKiBpbnRvIHxTU0xfZ2V0X2Vycm9yfCB0byBkZXRlcm1pbmUgaG93IHRvIHByb2NlZWQuIElmIHRoZSB1bmRlcmx5aW5nIHxCSU98IGlzCi0gKiBub24tYmxvY2tpbmcsIGJvdGggc3RhZ2VzIG1heSByZXF1aXJlIHJldHJ5LgotICoKLSAqIHxTU0xfc2h1dGRvd258IG11c3QgYmUgY2FsbGVkIHRvIHJldGFpbiB8c3NsfCdzIHNlc3Npb24gaW4gdGhlIHNlc3Npb24KLSAqIGNhY2hlLiBVc2UgfFNTTF9DVFhfc2V0X3F1aWV0X3NodXRkb3dufCB0byBjb25maWd1cmUgfFNTTF9zaHV0ZG93bnwgdG8KLSAqIG5laXRoZXIgc2VuZCBub3Igd2FpdCBmb3IgY2xvc2Vfbm90aWZ5IGJ1dCBzdGlsbCByZXRhaW4gdGhlIHNlc3Npb24uCi0gKgotICogVE9ETyhkYXZpZGJlbik6IElzIHRoZXJlIGFueSBwb2ludCBpbiB0aGUgc2Vzc2lvbiBjYWNoZSBpbnRlcmFjdGlvbj8gUmVtb3ZlCi0gKiBpdD8gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfc2h1dGRvd24oU1NMICpzc2wpOwotCi0vKiBTU0xfZ2V0X2Vycm9yIHJldHVybnMgYSB8U1NMX0VSUk9SXyp8IHZhbHVlIGZvciB0aGUgbW9zdCByZWNlbnQgb3BlcmF0aW9uIG9uCi0gKiB8c3NsfC4gSXQgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhbiBvcGVyYXRpb24gZmFpbGVkIHRvIGRldGVybWluZS4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfZ2V0X2Vycm9yKGNvbnN0IFNTTCAqc3NsLCBpbnQgcmV0X2NvZGUpOwotCi0vKiBTU0xfRVJST1JfTk9ORSBpbmRpY2F0ZXMgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuICovCi0jZGVmaW5lIFNTTF9FUlJPUl9OT05FIDAKLQotLyogU1NMX0VSUk9SX1NTTCBpbmRpY2F0ZXMgdGhlIG9wZXJhdGlvbiBmYWlsZWQgd2l0aGluIHRoZSBsaWJyYXJ5LiBUaGUgY2FsbGVyCi0gKiBtYXkgaW5zcGVjdCB0aGUgZXJyb3IgcXVldWUgZm9yIG1vcmUgaW5mb3JtYXRpb24uICovCi0jZGVmaW5lIFNTTF9FUlJPUl9TU0wgMQotCi0vKiBTU0xfRVJST1JfV0FOVF9SRUFEIGluZGljYXRlcyB0aGUgb3BlcmF0aW9uIGZhaWxlZCBhdHRlbXB0aW5nIHRvIHJlYWQgZnJvbQotICogdGhlIHRyYW5zcG9ydC4gVGhlIGNhbGxlciBtYXkgcmV0cnkgdGhlIG9wZXJhdGlvbiB3aGVuIHRoZSB0cmFuc3BvcnQgaXMgcmVhZHkKLSAqIGZvciByZWFkaW5nLiAqLwotI2RlZmluZSBTU0xfRVJST1JfV0FOVF9SRUFEIDIKLQotLyogU1NMX0VSUk9SX1dBTlRfUkVBRCBpbmRpY2F0ZXMgdGhlIG9wZXJhdGlvbiBmYWlsZWQgYXR0ZW1wdGluZyB0byB3cml0ZSB0bwotICogdGhlIHRyYW5zcG9ydC4gVGhlIGNhbGxlciBtYXkgcmV0cnkgdGhlIG9wZXJhdGlvbiB3aGVuIHRoZSB0cmFuc3BvcnQgaXMgcmVhZHkKLSAqIGZvciB3cml0aW5nLiAqLwotI2RlZmluZSBTU0xfRVJST1JfV0FOVF9XUklURSAzCi0KLS8qIFNTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQIGluZGljYXRlcyB0aGUgb3BlcmF0aW9uIGZhaWxlZCBpbiBjYWxsaW5nIHRoZQotICogfGNlcnRfY2J8IG9yIHxjbGllbnRfY2VydF9jYnwuIFRoZSBjYWxsZXIgbWF5IHJldHJ5IHRoZSBvcGVyYXRpb24gd2hlbiB0aGUKLSAqIGNhbGxiYWNrIGlzIHJlYWR5IHRvIHJldHVybiBhIGNlcnRpZmljYXRlIG9yIG9uZSBoYXMgYmVlbiBjb25maWd1cmVkCi0gKiBleHRlcm5hbGx5LgotICoKLSAqIFNlZSBhbHNvIHxTU0xfQ1RYX3NldF9jZXJ0X2NifCBhbmQgfFNTTF9DVFhfc2V0X2NsaWVudF9jZXJ0X2NifC4gKi8KLSNkZWZpbmUgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVAgNAotCi0vKiBTU0xfRVJST1JfV0FOVF9TWVNDQUxMIGluZGljYXRlcyB0aGUgb3BlcmF0aW9uIGZhaWxlZCBleHRlcm5hbGx5IHRvIHRoZQotICogbGlicmFyeS4gVGhlIGNhbGxlciBzaG91bGQgY29uc3VsdCB0aGUgc3lzdGVtLXNwZWNpZmljIGVycm9yIG1lY2hhbmlzbS4gVGhpcwotICogaXMgdHlwaWNhbGx5IHxlcnJub3wgYnV0IG1heSBiZSBzb21ldGhpbmcgY3VzdG9tIGlmIHVzaW5nIGEgY3VzdG9tIHxCSU98LiBJdAotICogbWF5IGFsc28gYmUgc2lnbmFsZWQgaWYgdGhlIHRyYW5zcG9ydCByZXR1cm5lZCBFT0YsIGluIHdoaWNoIGNhc2UgdGhlCi0gKiBvcGVyYXRpb24ncyByZXR1cm4gdmFsdWUgd2lsbCBiZSB6ZXJvLiAqLwotI2RlZmluZSBTU0xfRVJST1JfU1lTQ0FMTCA1Ci0KLS8qIFNTTF9FUlJPUl9aRVJPX1JFVFVSTiBpbmRpY2F0ZXMgdGhlIG9wZXJhdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUgY29ubmVjdGlvbgotICogd2FzIGNsZWFubHkgc2h1dCBkb3duIHdpdGggYSBjbG9zZV9ub3RpZnkgYWxlcnQuICovCi0jZGVmaW5lIFNTTF9FUlJPUl9aRVJPX1JFVFVSTiA2Ci0KLS8qIFNTTF9FUlJPUl9XQU5UX0NPTk5FQ1QgaW5kaWNhdGVzIHRoZSBvcGVyYXRpb24gZmFpbGVkIGF0dGVtcHRpbmcgdG8gY29ubmVjdAotICogdGhlIHRyYW5zcG9ydCAodGhlIHxCSU98IHNpZ25hbGVkIHxCSU9fUlJfQ09OTkVDVHwpLiBUaGUgY2FsbGVyIG1heSByZXRyeSB0aGUKLSAqIG9wZXJhdGlvbiB3aGVuIHRoZSB0cmFuc3BvcnQgaXMgcmVhZHkuICovCi0jZGVmaW5lIFNTTF9FUlJPUl9XQU5UX0NPTk5FQ1QgNwotCi0vKiBTU0xfRVJST1JfV0FOVF9BQ0NFUFQgaW5kaWNhdGVzIHRoZSBvcGVyYXRpb24gZmFpbGVkIGF0dGVtcHRpbmcgdG8gYWNjZXB0IGEKLSAqIGNvbm5lY3Rpb24gZnJvbSB0aGUgdHJhbnNwb3J0ICh0aGUgfEJJT3wgc2lnbmFsZWQgfEJJT19SUl9BQ0NFUFR8KS4gVGhlCi0gKiBjYWxsZXIgbWF5IHJldHJ5IHRoZSBvcGVyYXRpb24gd2hlbiB0aGUgdHJhbnNwb3J0IGlzIHJlYWR5LgotICoKLSAqIFRPRE8oZGF2aWRiZW4pOiBSZW1vdmUgdGhpcy4gSXQncyB1c2VkIGJ5IGFjY2VwdCBCSU9zIHdoaWNoIGFyZSBiaXphcnJlLiAqLwotI2RlZmluZSBTU0xfRVJST1JfV0FOVF9BQ0NFUFQgOAotCi0vKiBTU0xfRVJST1JfV0FOVF9DSEFOTkVMX0lEX0xPT0tVUCBpbmRpY2F0ZXMgdGhlIG9wZXJhdGlvbiBmYWlsZWQgbG9va2luZyB1cAotICogdGhlIENoYW5uZWwgSUQga2V5LiBUaGUgY2FsbGVyIG1heSByZXRyeSB0aGUgb3BlcmF0aW9uIHdoZW4gfGNoYW5uZWxfaWRfY2J8Ci0gKiBpcyByZWFkeSB0byByZXR1cm4gYSBrZXkgb3Igb25lIGhhcyBiZWVuIGNvbmZpZ3VyZWQgd2l0aAotICogfFNTTF9zZXQxX3Rsc19jaGFubmVsX2lkfC4KLSAqCi0gKiBTZWUgYWxzbyB8U1NMX0NUWF9zZXRfY2hhbm5lbF9pZF9jYnwuICovCi0jZGVmaW5lIFNTTF9FUlJPUl9XQU5UX0NIQU5ORUxfSURfTE9PS1VQIDkKLQotLyogU1NMX0VSUk9SX1BFTkRJTkdfU0VTU0lPTiBpbmRpY2F0ZXMgdGhlIG9wZXJhdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUgc2Vzc2lvbgotICogbG9va3VwIGNhbGxiYWNrIGluZGljYXRlZCB0aGUgc2Vzc2lvbiB3YXMgdW5hdmFpbGFibGUuIFRoZSBjYWxsZXIgbWF5IHJldHJ5Ci0gKiB0aGUgb3BlcmF0aW9uIHdoZW4gbG9va3VwIGhhcyBjb21wbGV0ZWQuCi0gKgotICogU2VlIGFsc28gfFNTTF9DVFhfc2Vzc19zZXRfZ2V0X2NifCBhbmQgfFNTTF9tYWdpY19wZW5kaW5nX3Nlc3Npb25fcHRyfC4gKi8KLSNkZWZpbmUgU1NMX0VSUk9SX1BFTkRJTkdfU0VTU0lPTiAxMQotCi0vKiBTU0xfRVJST1JfUEVORElOR19DRVJUSUZJQ0FURSBpbmRpY2F0ZXMgdGhlIG9wZXJhdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUKLSAqIGVhcmx5IGNhbGxiYWNrIGluZGljYXRlZCBjZXJ0aWZpY2F0ZSBsb29rdXAgd2FzIGluY29tcGxldGUuIFRoZSBjYWxsZXIgbWF5Ci0gKiByZXRyeSB0aGUgb3BlcmF0aW9uIHdoZW4gbG9va3VwIGhhcyBjb21wbGV0ZWQuIE5vdGU6IHdoZW4gdGhlIG9wZXJhdGlvbiBpcwotICogcmV0cmllZCwgdGhlIGVhcmx5IGNhbGxiYWNrIHdpbGwgbm90IGJlIGNhbGxlZCBhIHNlY29uZCB0aW1lLgotICoKLSAqIFNlZSBhbHNvIHxzZWxlY3RfY2VydGlmaWNhdGVfY2J8IG9uIHxTU0xfQ1RYfC4gKi8KLSNkZWZpbmUgU1NMX0VSUk9SX1BFTkRJTkdfQ0VSVElGSUNBVEUgMTIKLQotLyogU1NMX0VSUk9SX1dBTlRfUFJJVkFURV9LRVlfT1BFUkFUSU9OIGluZGljYXRlcyB0aGUgb3BlcmF0aW9uIGZhaWxlZCBiZWNhdXNlCi0gKiBhIHByaXZhdGUga2V5IG9wZXJhdGlvbiB3YXMgdW5maW5pc2hlZC4gVGhlIGNhbGxlciBtYXkgcmV0cnkgdGhlIG9wZXJhdGlvbgotICogd2hlbiB0aGUgcHJpdmF0ZSBrZXkgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLgotICoKLSAqIFNlZSBhbHNvIHxTU0xfc2V0X3ByaXZhdGVfa2V5X21ldGhvZHwuICovCi0jZGVmaW5lIFNTTF9FUlJPUl9XQU5UX1BSSVZBVEVfS0VZX09QRVJBVElPTiAxMwotCiAKIC8qIFByb3RvY29sIHZlcnNpb25zLiAqLwogCi0jZGVmaW5lIERUTFMxX1ZFUlNJT05fTUFKT1IgMHhmZQogI2RlZmluZSBTU0wzX1ZFUlNJT05fTUFKT1IgMHgwMwogCiAjZGVmaW5lIFNTTDNfVkVSU0lPTiAweDAzMDAKQEAgLTQ4NywxMSArMzIwLDYgQEAKICAqIHx2ZXJzaW9ufC4gKi8KIE9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX3NldF9tYXhfdmVyc2lvbihTU0wgKnNzbCwgdWludDE2X3QgdmVyc2lvbik7CiAKLS8qIFNTTF92ZXJzaW9uIHJldHVybnMgdGhlIFRMUyBvciBEVExTIHByb3RvY29sIHZlcnNpb24gdXNlZCBieSB8c3NsfCwgd2hpY2ggaXMKLSAqIG9uZSBvZiB0aGUgfCpfVkVSU0lPTnwgdmFsdWVzLiAoRS5nLiB8VExTMV8yX1ZFUlNJT058LikgQmVmb3JlIHRoZSB2ZXJzaW9uCi0gKiBpcyBuZWdvdGlhdGVkLCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfdmVyc2lvbihjb25zdCBTU0wgKnNzbCk7Ci0KIAogLyogT3B0aW9ucy4KICAqCkBAIC01MTgsMTQgKzM0Niw0MSBAQAogICogfEJJT3wuIEluc3RlYWQsIHRoZSBNVFUgaXMgY29uZmlndXJlZCB3aXRoIHxTU0xfc2V0X210dXwuICovCiAjZGVmaW5lIFNTTF9PUF9OT19RVUVSWV9NVFUgMHgwMDAwMTAwMEwKIAotLyogU1NMX09QX05PX1RJQ0tFVCBkaXNhYmxlcyBzZXNzaW9uIHRpY2tldCBzdXBwb3J0IChSRkMgNTA3NykuICovCisvKiBTU0xfT1BfTk9fVElDS0VUIGRpc2FibGVzIHNlc3Npb24gdGlja2V0IHN1cHBvcnQgKFJGQyA0NTA3KS4gKi8KICNkZWZpbmUgU1NMX09QX05PX1RJQ0tFVCAweDAwMDA0MDAwTAogCisvKiBTU0xfT1BfQUxMT1dfVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OIHBlcm1pdHMgdW5zYWZlIGxlZ2FjeSByZW5lZ290aWF0aW9uCisgKiB3aXRob3V0IHJlbmVnb3RpYXRpb25faW5mbyAoUkZDIDU3NDYpIHN1cHBvcnQuICovCisjZGVmaW5lIFNTTF9PUF9BTExPV19VTlNBRkVfTEVHQUNZX1JFTkVHT1RJQVRJT04gMHgwMDA0MDAwMEwKKwogLyogU1NMX09QX0NJUEhFUl9TRVJWRVJfUFJFRkVSRU5DRSBjb25maWd1cmVzIHNlcnZlcnMgdG8gc2VsZWN0IGNpcGhlcnMgYW5kCiAgKiBFQ0RIRSBjdXJ2ZXMgYWNjb3JkaW5nIHRvIHRoZSBzZXJ2ZXIncyBwcmVmZXJlbmNlcyBpbnN0ZWFkIG9mIHRoZQogICogY2xpZW50J3MuICovCiAjZGVmaW5lIFNTTF9PUF9DSVBIRVJfU0VSVkVSX1BSRUZFUkVOQ0UgMHgwMDQwMDAwMEwKIAorLyogVGhlIGZvbGxvd2luZyBmbGFncyB0b2dnbGUgaW5kaXZpZHVhbCBwcm90b2NvbCB2ZXJzaW9ucy4gVGhpcyBpcyBkZXByZWNhdGVkLgorICogVXNlIHxTU0xfQ1RYX3NldF9taW5fdmVyc2lvbnwgYW5kIHxTU0xfQ1RYX3NldF9tYXhfdmVyc2lvbnwgaW5zdGVhZC4gKi8KKyNkZWZpbmUgU1NMX09QX05PX1NTTHYzIDB4MDIwMDAwMDBMCisjZGVmaW5lIFNTTF9PUF9OT19UTFN2MSAweDA0MDAwMDAwTAorI2RlZmluZSBTU0xfT1BfTk9fVExTdjFfMiAweDA4MDAwMDAwTAorI2RlZmluZSBTU0xfT1BfTk9fVExTdjFfMSAweDEwMDAwMDAwTAorI2RlZmluZSBTU0xfT1BfTk9fRFRMU3YxIFNTTF9PUF9OT19UTFN2MQorI2RlZmluZSBTU0xfT1BfTk9fRFRMU3YxXzIgU1NMX09QX05PX1RMU3YxXzIKKworLyogVGhlIGZvbGxvd2luZyBmbGFncyBkbyBub3RoaW5nIGFuZCBhcmUgaW5jbHVkZWQgb25seSB0byBtYWtlIGl0IGVhc2llciB0bworICogY29tcGlsZSBjb2RlIHdpdGggQm9yaW5nU1NMLiAqLworI2RlZmluZSBTU0xfT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTIDAKKyNkZWZpbmUgU1NMX09QX01JQ1JPU09GVF9TRVNTX0lEX0JVRyAwCisjZGVmaW5lIFNTTF9PUF9ORVRTQ0FQRV9DSEFMTEVOR0VfQlVHIDAKKyNkZWZpbmUgU1NMX09QX05PX0NPTVBSRVNTSU9OIDAKKyNkZWZpbmUgU1NMX09QX05PX1NFU1NJT05fUkVTVU1QVElPTl9PTl9SRU5FR09USUFUSU9OIDAKKyNkZWZpbmUgU1NMX09QX05PX1NTTHYyIDAKKyNkZWZpbmUgU1NMX09QX1NJTkdMRV9ESF9VU0UgMAorI2RlZmluZSBTU0xfT1BfU0lOR0xFX0VDREhfVVNFIDAKKyNkZWZpbmUgU1NMX09QX1NTTFJFRjJfUkVVU0VfQ0VSVF9UWVBFX0JVRyAwCisjZGVmaW5lIFNTTF9PUF9UTFNfQkxPQ0tfUEFERElOR19CVUcgMAorI2RlZmluZSBTU0xfT1BfVExTX1JPTExCQUNLX0JVRyAwCisKIC8qIFNTTF9DVFhfc2V0X29wdGlvbnMgZW5hYmxlcyBhbGwgb3B0aW9ucyBzZXQgaW4gfG9wdGlvbnN8ICh3aGljaCBzaG91bGQgYmUgb25lCiAgKiBvciBtb3JlIG9mIHRoZSB8U1NMX09QXyp8IHZhbHVlcywgT1JlZCB0b2dldGhlcikgaW4gfGN0eHwuIEl0IHJldHVybnMgYQogICogYml0bWFzayByZXByZXNlbnRpbmcgdGhlIHJlc3VsdGluZyBlbmFibGVkIG9wdGlvbnMuICovCkBAIC01NzksNiArNDM0LDEwIEBACiAgKiBpbiBvbmUgUlRULiBTZWUgZHJhZnQtYm1vZWxsZXItdGxzLWZhbHNlc3RhcnQtMDEuICovCiAjZGVmaW5lIFNTTF9NT0RFX0VOQUJMRV9GQUxTRV9TVEFSVCAweDAwMDAwMDgwTAogCisvKiBEZXByZWNhdGVkOiBTU0xfTU9ERV9IQU5EU0hBS0VfQ1VUVEhST1VHSCBpcyB0aGUgc2FtZSBhcworICogU1NMX01PREVfRU5BQkxFX0ZBTFNFX1NUQVJULiAqLworI2RlZmluZSBTU0xfTU9ERV9IQU5EU0hBS0VfQ1VUVEhST1VHSCBTU0xfTU9ERV9FTkFCTEVfRkFMU0VfU1RBUlQKKwogLyogU1NMX01PREVfQ0JDX1JFQ09SRF9TUExJVFRJTkcgY2F1c2VzIG11bHRpLWJ5dGUgQ0JDIHJlY29yZHMgaW4gU1NMIDMuMCBhbmQKICAqIFRMUyAxLjAgdG8gYmUgc3BsaXQgaW4gdHdvOiB0aGUgZmlyc3QgcmVjb3JkIHdpbGwgY29udGFpbiBhIHNpbmdsZSBieXRlIGFuZAogICogdGhlIHNlY29uZCB3aWxsIGNvbnRhaW4gdGhlIHJlbWFpbmRlci4gVGhpcyBlZmZlY3RpdmVseSByYW5kb21pc2VzIHRoZSBJViBhbmQKQEAgLTU5MiwxMiArNDUxLDIxIEBACiAKIC8qIFNTTF9NT0RFX1NFTkRfRkFMTEJBQ0tfU0NTViBzZW5kcyBUTFNfRkFMTEJBQ0tfU0NTViBpbiB0aGUgQ2xpZW50SGVsbG8uCiAgKiBUbyBiZSBzZXQgb25seSBieSBhcHBsaWNhdGlvbnMgdGhhdCByZWNvbm5lY3Qgd2l0aCBhIGRvd25ncmFkZWQgcHJvdG9jb2wKLSAqIHZlcnNpb247IHNlZSBSRkMgNzUwNyBmb3IgZGV0YWlscy4KKyAqIHZlcnNpb247IHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi10bHMtZG93bmdyYWRlLXNjc3YtMDUKKyAqIGZvciBkZXRhaWxzLgogICoKICAqIERPIE5PVCBFTkFCTEUgVEhJUyBpZiB5b3VyIGFwcGxpY2F0aW9uIGF0dGVtcHRzIGEgbm9ybWFsIGhhbmRzaGFrZS4gT25seSB1c2UKLSAqIHRoaXMgaW4gZXhwbGljaXQgZmFsbGJhY2sgcmV0cmllcywgZm9sbG93aW5nIHRoZSBndWlkYW5jZSBpbiBSRkMgNzUwNy4gKi8KKyAqIHRoaXMgaW4gZXhwbGljaXQgZmFsbGJhY2sgcmV0cmllcywgZm9sbG93aW5nIHRoZSBndWlkYW5jZSBpbgorICogZHJhZnQtaWV0Zi10bHMtZG93bmdyYWRlLXNjc3YtMDUuICovCiAjZGVmaW5lIFNTTF9NT0RFX1NFTkRfRkFMTEJBQ0tfU0NTViAweDAwMDAwNDAwTAogCisvKiBUaGUgZm9sbG93aW5nIGZsYWdzIGRvIG5vdGhpbmcgYW5kIGFyZSBpbmNsdWRlZCBvbmx5IHRvIG1ha2UgaXQgZWFzaWVyIHRvCisgKiBjb21waWxlIGNvZGUgd2l0aCBCb3JpbmdTU0wuICovCisjZGVmaW5lIFNTTF9NT0RFX0FVVE9fUkVUUlkgMAorI2RlZmluZSBTU0xfTU9ERV9SRUxFQVNFX0JVRkZFUlMgMAorI2RlZmluZSBTU0xfTU9ERV9TRU5EX0NMSUVOVEhFTExPX1RJTUUgMAorI2RlZmluZSBTU0xfTU9ERV9TRU5EX1NFUlZFUkhFTExPX1RJTUUgMAorCiAvKiBTU0xfQ1RYX3NldF9tb2RlIGVuYWJsZXMgYWxsIG1vZGVzIHNldCBpbiB8bW9kZXwgKHdoaWNoIHNob3VsZCBiZSBvbmUgb3IgbW9yZQogICogb2YgdGhlIHxTU0xfTU9ERV8qfCB2YWx1ZXMsIE9SZWQgdG9nZXRoZXIpIGluIHxjdHh8LiBJdCByZXR1cm5zIGEgYml0bWFzawogICogcmVwcmVzZW50aW5nIHRoZSByZXN1bHRpbmcgZW5hYmxlZCBtb2Rlcy4gKi8KQEAgLTYyNywzMDkgKzQ5NSw4IEBACiBPUEVOU1NMX0VYUE9SVCB1aW50MzJfdCBTU0xfZ2V0X21vZGUoY29uc3QgU1NMICpzc2wpOwogCiAKLS8qIENvbmZpZ3VyaW5nIGNlcnRpZmljYXRlcyBhbmQgcHJpdmF0ZSBrZXlzLgotICoKLSAqIFRoZXNlIGZ1bmN0aW9ucyBjb25maWd1cmUgdGhlIGNvbm5lY3Rpb24ncyBsZWFmIGNlcnRpZmljYXRlLCBwcml2YXRlIGtleSwgYW5kCi0gKiBjZXJ0aWZpY2F0ZSBjaGFpbi4gVGhlIGNlcnRpZmljYXRlIGNoYWluIGlzIG9yZGVyZWQgbGVhZiB0byByb290IChhcyBzZW50IG9uCi0gKiB0aGUgd2lyZSkgYnV0IGRvZXMgbm90IGluY2x1ZGUgdGhlIGxlYWYuIEJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgY2VydGlmaWNhdGVzCi0gKiB1c2UgdGhlc2UgZnVuY3Rpb25zLgotICoKLSAqIENlcnRpZmljYXRlcyBhbmQga2V5cyBtYXkgYmUgY29uZmlndXJlZCBiZWZvcmUgdGhlIGhhbmRzaGFrZSBvciBkeW5hbWljYWxseQotICogaW4gdGhlIGVhcmx5IGNhbGxiYWNrIGFuZCBjZXJ0aWZpY2F0ZSBjYWxsYmFjay4gKi8KLQotLyogU1NMX0NUWF91c2VfY2VydGlmaWNhdGUgc2V0cyB8Y3R4fCdzIGxlYWYgY2VydGlmaWNhdGUgdG8gfHg1MDl8LiBJdCByZXR1cm5zCi0gKiBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBmYWlsdXJlLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlKFNTTF9DVFggKmN0eCwgWDUwOSAqeDUwOSk7Ci0KLS8qIFNTTF91c2VfY2VydGlmaWNhdGUgc2V0cyB8c3NsfCdzIGxlYWYgY2VydGlmaWNhdGUgdG8gfHg1MDl8LiBJdCByZXR1cm5zIG9uZQotICogb24gc3VjY2VzcyBhbmQgemVybyBvbiBmYWlsdXJlLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF91c2VfY2VydGlmaWNhdGUoU1NMICpzc2wsIFg1MDkgKng1MDkpOwotCi0vKiBTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5IHNldHMgfGN0eHwncyBwcml2YXRlIGtleSB0byB8cGtleXwuIEl0IHJldHVybnMgb25lIG9uCi0gKiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGZhaWx1cmUuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF91c2VfUHJpdmF0ZUtleShTU0xfQ1RYICpjdHgsIEVWUF9QS0VZICpwa2V5KTsKLQotLyogU1NMX3VzZV9Qcml2YXRlS2V5IHNldHMgfHNzbHwncyBwcml2YXRlIGtleSB0byB8cGtleXwuIEl0IHJldHVybnMgb25lIG9uCi0gKiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGZhaWx1cmUuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3VzZV9Qcml2YXRlS2V5KFNTTCAqc3NsLCBFVlBfUEtFWSAqcGtleSk7Ci0KLS8qIFNTTF9DVFhfc2V0MF9jaGFpbiBzZXRzIHxjdHh8J3MgY2VydGlmaWNhdGUgY2hhaW4sIGV4Y2x1ZGluZyB0aGUgbGVhZiwgdG8KLSAqIHxjaGFpbnwuIE9uIHN1Y2Nlc3MsIGl0IHJldHVybnMgb25lIGFuZCB0YWtlcyBvd25lcnNoaXAgb2YgfGNoYWlufC4KLSAqIE90aGVyd2lzZSwgaXQgcmV0dXJucyB6ZXJvLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfc2V0MF9jaGFpbihTU0xfQ1RYICpjdHgsIFNUQUNLX09GKFg1MDkpICpjaGFpbik7Ci0KLS8qIFNTTF9DVFhfc2V0MV9jaGFpbiBzZXRzIHxjdHh8J3MgY2VydGlmaWNhdGUgY2hhaW4sIGV4Y2x1ZGluZyB0aGUgbGVhZiwgdG8KLSAqIHxjaGFpbnwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZmFpbHVyZS4gVGhlIGNhbGxlciByZXRhaW5zCi0gKiBvd25lcnNoaXAgb2YgfGNoYWlufCBhbmQgbWF5IHJlbGVhc2UgaXQgZnJlZWx5LiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfc2V0MV9jaGFpbihTU0xfQ1RYICpjdHgsIFNUQUNLX09GKFg1MDkpICpjaGFpbik7Ci0KLS8qIFNTTF9zZXQwX2NoYWluIHNldHMgfHNzbHwncyBjZXJ0aWZpY2F0ZSBjaGFpbiwgZXhjbHVkaW5nIHRoZSBsZWFmLCB0bwotICogfGNoYWlufC4gT24gc3VjY2VzcywgaXQgcmV0dXJucyBvbmUgYW5kIHRha2VzIG93bmVyc2hpcCBvZiB8Y2hhaW58LgotICogT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHplcm8uICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3NldDBfY2hhaW4oU1NMICpzc2wsIFNUQUNLX09GKFg1MDkpICpjaGFpbik7Ci0KLS8qIFNTTF9zZXQxX2NoYWluIHNldHMgfHNzbHwncyBjZXJ0aWZpY2F0ZSBjaGFpbiwgZXhjbHVkaW5nIHRoZSBsZWFmLCB0bwotICogfGNoYWlufC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBmYWlsdXJlLiBUaGUgY2FsbGVyIHJldGFpbnMKLSAqIG93bmVyc2hpcCBvZiB8Y2hhaW58IGFuZCBtYXkgcmVsZWFzZSBpdCBmcmVlbHkuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3NldDFfY2hhaW4oU1NMICpzc2wsIFNUQUNLX09GKFg1MDkpICpjaGFpbik7Ci0KLS8qIFNTTF9DVFhfYWRkMF9jaGFpbl9jZXJ0IGFwcGVuZHMgfHg1MDl8IHRvIHxjdHh8J3MgY2VydGlmaWNhdGUgY2hhaW4uIE9uCi0gKiBzdWNjZXNzLCBpdCByZXR1cm5zIG9uZSBhbmQgdGFrZXMgb3duZXJzaGlwIG9mIHx4NTA5fC4gT3RoZXJ3aXNlLCBpdCByZXR1cm5zCi0gKiB6ZXJvLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfYWRkMF9jaGFpbl9jZXJ0KFNTTF9DVFggKmN0eCwgWDUwOSAqeDUwOSk7Ci0KLS8qIFNTTF9DVFhfYWRkMV9jaGFpbl9jZXJ0IGFwcGVuZHMgfHg1MDl8IHRvIHxjdHh8J3MgY2VydGlmaWNhdGUgY2hhaW4uIEl0Ci0gKiByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGZhaWx1cmUuIFRoZSBjYWxsZXIgcmV0YWlucyBvd25lcnNoaXAgb2YKLSAqIHx4NTA5fCBhbmQgbWF5IHJlbGVhc2UgaXQgZnJlZWx5LiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfYWRkMV9jaGFpbl9jZXJ0KFNTTF9DVFggKmN0eCwgWDUwOSAqeDUwOSk7Ci0KLS8qIFNTTF9hZGQwX2NoYWluX2NlcnQgYXBwZW5kcyB8eDUwOXwgdG8gfGN0eHwncyBjZXJ0aWZpY2F0ZSBjaGFpbi4gT24gc3VjY2VzcywKLSAqIGl0IHJldHVybnMgb25lIGFuZCB0YWtlcyBvd25lcnNoaXAgb2YgfHg1MDl8LiBPdGhlcndpc2UsIGl0IHJldHVybnMgemVyby4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfYWRkMF9jaGFpbl9jZXJ0KFNTTCAqc3NsLCBYNTA5ICp4NTA5KTsKLQotLyogU1NMX0NUWF9hZGRfZXh0cmFfY2hhaW5fY2VydCBjYWxscyB8U1NMX0NUWF9hZGQwX2NoYWluX2NlcnR8LiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQoU1NMX0NUWCAqY3R4LCBYNTA5ICp4NTA5KTsKLQotLyogU1NMX2FkZDFfY2hhaW5fY2VydCBhcHBlbmRzIHx4NTA5fCB0byB8Y3R4fCdzIGNlcnRpZmljYXRlIGNoYWluLiBJdCByZXR1cm5zCi0gKiBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBmYWlsdXJlLiBUaGUgY2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mIHx4NTA5fAotICogYW5kIG1heSByZWxlYXNlIGl0IGZyZWVseS4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfYWRkMV9jaGFpbl9jZXJ0KFNTTCAqc3NsLCBYNTA5ICp4NTA5KTsKLQotLyogU1NMX0NUWF9jbGVhcl9jaGFpbl9jZXJ0cyBjbGVhcnMgfGN0eHwncyBjZXJ0aWZpY2F0ZSBjaGFpbiBhbmQgcmV0dXJucwotICogb25lLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfY2xlYXJfY2hhaW5fY2VydHMoU1NMX0NUWCAqY3R4KTsKLQotLyogU1NMX0NUWF9jbGVhcl9leHRyYV9jaGFpbl9jZXJ0cyBjYWxscyB8U1NMX0NUWF9jbGVhcl9jaGFpbl9jZXJ0c3wuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9jbGVhcl9leHRyYV9jaGFpbl9jZXJ0cyhTU0xfQ1RYICpjdHgpOwotCi0vKiBTU0xfY2xlYXJfY2hhaW5fY2VydHMgY2xlYXJzIHxzc2x8J3MgY2VydGlmaWNhdGUgY2hhaW4gYW5kIHJldHVybnMgb25lLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9jbGVhcl9jaGFpbl9jZXJ0cyhTU0wgKnNzbCk7Ci0KLS8qIFNTTF9DVFhfc2V0X2NlcnRfY2Igc2V0cyBhIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHRvIHNlbGVjdCBhIGNlcnRpZmljYXRlLgotICogVGhlIGNhbGxiYWNrIHJldHVybnMgb25lIG9uIHN1Y2Nlc3MsIHplcm8gb24gaW50ZXJuYWwgZXJyb3IsIGFuZCBhIG5lZ2F0aXZlCi0gKiBudW1iZXIgb24gZmFpbHVyZSBvciB0byBwYXVzZSB0aGUgaGFuZHNoYWtlLiBJZiB0aGUgaGFuZHNoYWtlIGlzIHBhdXNlZCwKLSAqIHxTU0xfZ2V0X2Vycm9yfCB3aWxsIHJldHVybiB8U1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVB8LiAqLwotT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfQ1RYX3NldF9jZXJ0X2NiKFNTTF9DVFggKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpjYikoU1NMICpzc2wsIHZvaWQgKmFyZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKTsKLQotLyogU1NMX3NldF9jZXJ0X2NiIHNldHMgYSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCB0byBzZWxlY3QgYSBjZXJ0aWZpY2F0ZS4gVGhlCi0gKiBjYWxsYmFjayByZXR1cm5zIG9uZSBvbiBzdWNjZXNzLCB6ZXJvIG9uIGludGVybmFsIGVycm9yLCBhbmQgYSBuZWdhdGl2ZQotICogbnVtYmVyIG9uIGZhaWx1cmUgb3IgdG8gcGF1c2UgdGhlIGhhbmRzaGFrZS4gSWYgdGhlIGhhbmRzaGFrZSBpcyBwYXVzZWQsCi0gKiB8U1NMX2dldF9lcnJvcnwgd2lsbCByZXR1cm4gfFNTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQfC4gKi8KLU9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX3NldF9jZXJ0X2NiKFNTTCAqc3NsLCBpbnQgKCpjYikoU1NMICpzc2wsIHZvaWQgKmFyZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpOwotCi0vKiBTU0xfY2VydHNfY2xlYXIgcmVzZXRzIHRoZSBwcml2YXRlIGtleSwgbGVhZiBjZXJ0aWZpY2F0ZSwgYW5kIGNlcnRpZmljYXRlCi0gKiBjaGFpbiBvZiB8c3NsfC4gKi8KLU9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX2NlcnRzX2NsZWFyKFNTTCAqc3NsKTsKLQotLyogU1NMX0NUWF9jaGVja19wcml2YXRlX2tleSByZXR1cm5zIG9uZSBpZiB0aGUgY2VydGlmaWNhdGUgYW5kIHByaXZhdGUga2V5Ci0gKiBjb25maWd1cmVkIGluIHxjdHh8IGFyZSBjb25zaXN0ZW50IGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX2NoZWNrX3ByaXZhdGVfa2V5KGNvbnN0IFNTTF9DVFggKmN0eCk7Ci0KLS8qIFNTTF9jaGVja19wcml2YXRlX2tleSByZXR1cm5zIG9uZSBpZiB0aGUgY2VydGlmaWNhdGUgYW5kIHByaXZhdGUga2V5Ci0gKiBjb25maWd1cmVkIGluIHxzc2x8IGFyZSBjb25zaXN0ZW50IGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfY2hlY2tfcHJpdmF0ZV9rZXkoY29uc3QgU1NMICpzc2wpOwotCi0vKiBTU0xfQ1RYX2dldDBfY2VydGlmaWNhdGUgcmV0dXJucyB8Y3R4fCdzIGxlYWYgY2VydGlmaWNhdGUuICovCi1PUEVOU1NMX0VYUE9SVCBYNTA5ICpTU0xfQ1RYX2dldDBfY2VydGlmaWNhdGUoY29uc3QgU1NMX0NUWCAqY3R4KTsKLQotLyogU1NMX2dldF9jZXJ0aWZpY2F0ZSByZXR1cm5zIHxzc2x8J3MgbGVhZiBjZXJ0aWZpY2F0ZS4gKi8KLU9QRU5TU0xfRVhQT1JUIFg1MDkgKlNTTF9nZXRfY2VydGlmaWNhdGUoY29uc3QgU1NMICpzc2wpOwotCi0vKiBTU0xfQ1RYX2dldDBfcHJpdmF0ZWtleSByZXR1cm5zIHxjdHh8J3MgcHJpdmF0ZSBrZXkuICovCi1PUEVOU1NMX0VYUE9SVCBFVlBfUEtFWSAqU1NMX0NUWF9nZXQwX3ByaXZhdGVrZXkoY29uc3QgU1NMX0NUWCAqY3R4KTsKLQotLyogU1NMX2dldF9wcml2YXRla2V5IHJldHVybnMgfHNzbHwncyBwcml2YXRlIGtleS4gKi8KLU9QRU5TU0xfRVhQT1JUIEVWUF9QS0VZICpTU0xfZ2V0X3ByaXZhdGVrZXkoY29uc3QgU1NMICpzc2wpOwotCi0vKiBTU0xfQ1RYX2dldDBfY2hhaW5fY2VydHMgc2V0cyB8Km91dF9jaGFpbnwgdG8gfGN0eHwncyBjZXJ0aWZpY2F0ZSBjaGFpbiBhbmQKLSAqIHJldHVybnMgb25lLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfZ2V0MF9jaGFpbl9jZXJ0cyhjb25zdCBTU0xfQ1RYICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQUNLX09GKFg1MDkpICoqb3V0X2NoYWluKTsKLQotLyogU1NMX0NUWF9nZXRfZXh0cmFfY2hhaW5fY2VydHMgY2FsbHMgfFNTTF9DVFhfZ2V0MF9jaGFpbl9jZXJ0c3wuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9nZXRfZXh0cmFfY2hhaW5fY2VydHMoY29uc3QgU1NMX0NUWCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQUNLX09GKFg1MDkpICoqb3V0X2NoYWluKTsKLQotLyogU1NMX2dldDBfY2hhaW5fY2VydHMgc2V0cyB8Km91dF9jaGFpbnwgdG8gfHNzbHwncyBjZXJ0aWZpY2F0ZSBjaGFpbiBhbmQKLSAqIHJldHVybnMgb25lLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9nZXQwX2NoYWluX2NlcnRzKGNvbnN0IFNTTCAqc3NsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQUNLX09GKFg1MDkpICoqb3V0X2NoYWluKTsKLQotLyogU1NMX0NUWF9zZXRfc2lnbmVkX2NlcnRfdGltZXN0YW1wX2xpc3Qgc2V0cyB0aGUgbGlzdCBvZiBzaWduZWQgY2VydGlmaWNhdGUKLSAqIHRpbWVzdGFtcHMgdGhhdCBpcyBzZW50IHRvIGNsaWVudHMgdGhhdCByZXF1ZXN0IGl0LiBUaGUgfGxpc3R8IGFyZ3VtZW50IG11c3QKLSAqIGNvbnRhaW4gb25lIG9yIG1vcmUgU0NUIHN0cnVjdHVyZXMgc2VyaWFsaXNlZCBhcyBhIFNpZ25lZENlcnRpZmljYXRlVGltZXN0YW1wCi0gKiBMaXN0IChzZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY5NjIjc2VjdGlvbi0zLjMpIOKAkyBpLmUuIGVhY2ggU0NUCi0gKiBpcyBwcmVmaXhlZCBieSBhIGJpZy1lbmRpYW4sIHVpbnQxNiBsZW5ndGggYW5kIHRoZSBjb25jYXRlbmF0aW9uIG9mIG9uZSBvcgotICogbW9yZSBzdWNoIHByZWZpeGVkIFNDVHMgYXJlIHRoZW1zZWx2ZXMgYWxzbyBwcmVmaXhlZCBieSBhIHVpbnQxNiBsZW5ndGguIEl0Ci0gKiByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiBUaGUgY2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mCi0gKiB8bGlzdHwuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9zZXRfc2lnbmVkX2NlcnRfdGltZXN0YW1wX2xpc3QoU1NMX0NUWCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxpc3RfbGVuKTsKLQotLyogU1NMX0NUWF9zZXRfb2NzcF9yZXNwb25zZSBzZXRzIHRoZSBPQ1NQIHJlcG9uc2UgdGhhdCBpcyBzZW50IHRvIGNsaWVudHMKLSAqIHdoaWNoIHJlcXVlc3QgaXQuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZXJyb3IuIFRoZSBjYWxsZXIKLSAqIHJldGFpbnMgb3duZXJzaGlwIG9mIHxyZXNwb25zZXwuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9zZXRfb2NzcF9yZXNwb25zZShTU0xfQ1RYICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpyZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZXNwb25zZV9sZW4pOwotCi0vKiBTU0xfc2V0X3ByaXZhdGVfa2V5X2RpZ2VzdF9wcmVmcyBjb3BpZXMgfG51bV9kaWdlc3RzfCBOSURzIGZyb20gfGRpZ2VzdF9uaWRzfAotICogaW50byB8c3NsfC4gVGhlc2UgZGlnZXN0cyB3aWxsIGJlIHVzZWQsIGluIGRlY3JlYXNpbmcgb3JkZXIgb2YgcHJlZmVyZW5jZSwKLSAqIHdoZW4gc2lnbmluZyB3aXRoIHxzc2x8J3MgcHJpdmF0ZSBrZXkuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24KLSAqIGVycm9yLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9zZXRfcHJpdmF0ZV9rZXlfZGlnZXN0X3ByZWZzKFNTTCAqc3NsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqZGlnZXN0X25pZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9kaWdlc3RzKTsKLQotCi0vKiBDZXJ0aWZpY2F0ZSBhbmQgcHJpdmF0ZSBrZXkgY29udmVuaWVuY2UgZnVuY3Rpb25zLiAqLwotCi0vKiBTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5IHNldHMgfGN0eHwncyBwcml2YXRlIGtleSB0byB8cnNhfC4gSXQgcmV0dXJucyBvbmUKLSAqIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZmFpbHVyZS4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5KFNTTF9DVFggKmN0eCwgUlNBICpyc2EpOwotCi0vKiBTU0xfdXNlX1JTQVByaXZhdGVLZXkgc2V0cyB8Y3R4fCdzIHByaXZhdGUga2V5IHRvIHxyc2F8LiBJdCByZXR1cm5zIG9uZSBvbgotICogc3VjY2VzcyBhbmQgemVybyBvbiBmYWlsdXJlLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF91c2VfUlNBUHJpdmF0ZUtleShTU0wgKnNzbCwgUlNBICpyc2EpOwotCi0vKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjb25maWd1cmUgY2VydGlmaWNhdGVzIG9yIHByaXZhdGUga2V5cyBidXQgdGFrZSBhcwotICogaW5wdXQgREVSLWVuY29kZWQgc3RydWN0dXJlcy4gVGhleSByZXR1cm4gb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24KLSAqIGZhaWx1cmUuICovCi0KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9BU04xKFNTTF9DVFggKmN0eCwgaW50IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmQpOwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF91c2VfY2VydGlmaWNhdGVfQVNOMShTU0wgKnNzbCwgY29uc3QgdWludDhfdCAqZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKLQotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfQVNOMShpbnQgcGssIFNTTF9DVFggKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZCwgbG9uZyBsZW4pOwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF91c2VfUHJpdmF0ZUtleV9BU04xKGludCB0eXBlLCBTU0wgKnNzbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkLCBsb25nIGxlbik7Ci0KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5X0FTTjEoU1NMX0NUWCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkZXJfbGVuKTsKLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfdXNlX1JTQVByaXZhdGVLZXlfQVNOMShTU0wgKnNzbCwgY29uc3QgdWludDhfdCAqZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkZXJfbGVuKTsKLQotLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY29uZmlndXJlIGNlcnRpZmljYXRlcyBvciBwcml2YXRlIGtleXMgYnV0IHRha2UgYXMKLSAqIGlucHV0IGZpbGVzIHRvIHJlYWQgZnJvbS4gVGhleSByZXR1cm4gb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZmFpbHVyZS4gVGhlCi0gKiB8dHlwZXwgcGFyYW1ldGVyIGlzIG9uZSBvZiB0aGUgfFNTTF9GSUxFVFlQRV8qfCB2YWx1ZXMgYW5kIGRldGVybWluZXMgd2hldGhlcgotICogdGhlIGZpbGUncyBjb250ZW50cyBhcmUgcmVhZCBhcyBQRU0gb3IgREVSLiAqLwotCi0jZGVmaW5lIFNTTF9GSUxFVFlQRV9BU04xIFg1MDlfRklMRVRZUEVfQVNOMQotI2RlZmluZSBTU0xfRklMRVRZUEVfUEVNIFg1MDlfRklMRVRZUEVfUEVNCi0KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5X2ZpbGUoU1NMX0NUWCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSk7Ci1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3VzZV9SU0FQcml2YXRlS2V5X2ZpbGUoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUpOwotCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfZmlsZShTU0xfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSk7Ci1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3VzZV9jZXJ0aWZpY2F0ZV9maWxlKFNTTCAqc3NsLCBjb25zdCBjaGFyICpmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSk7Ci0KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoU1NMX0NUWCAqY3R4LCBjb25zdCBjaGFyICpmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSk7Ci1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3VzZV9Qcml2YXRlS2V5X2ZpbGUoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUpOwotCi0vKiBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9maWxlIGNvbmZpZ3VyZXMgY2VydGlmaWNhdGVzIGZvciB8Y3R4fC4gSXQgcmVhZHMgdGhlCi0gKiBjb250ZW50cyBvZiB8ZmlsZXwgYXMgYSBQRU0tZW5jb2RlZCBsZWFmIGNlcnRpZmljYXRlIGZvbGxvd2VkIG9wdGlvbmFsbHkgYnkKLSAqIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiB0byBzZW5kIHRvIHRoZSBwZWVyLiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvCi0gKiBvbiBmYWlsdXJlLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoU1NMX0NUWCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSk7Ci0KLS8qIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiIHNldHMgdGhlIHBhc3N3b3JkIGNhbGxiYWNrIGZvciBQRU0tYmFzZWQKLSAqIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyBjYWxsZWQgb24gfGN0eHwuICovCi1PUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKFNTTF9DVFggKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVtX3Bhc3N3b3JkX2NiICpjYik7Ci0KLS8qIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhIHNldHMgdGhlIHVzZXJkYXRhIHBhcmFtZXRlciBmb3IKLSAqIHxjdHh8J3MgcGFzc3dvcmQgY2FsbGJhY2suICovCi1PUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhKFNTTF9DVFggKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSk7Ci0KLQotLyogQ3VzdG9tIHByaXZhdGUga2V5cy4gKi8KLQotZW51bSBzc2xfcHJpdmF0ZV9rZXlfcmVzdWx0X3QgewotICBzc2xfcHJpdmF0ZV9rZXlfc3VjY2VzcywKLSAgc3NsX3ByaXZhdGVfa2V5X3JldHJ5LAotICBzc2xfcHJpdmF0ZV9rZXlfZmFpbHVyZSwKLX07Ci0KLS8qIFNTTF9QUklWQVRFX0tFWV9NRVRIT0QgZGVzY3JpYmVzIHByaXZhdGUga2V5IGhvb2tzLiBUaGlzIGlzIHVzZWQgdG8gb2ZmLWxvYWQKLSAqIHNpZ25pbmcgb3BlcmF0aW9ucyB0byBhIGN1c3RvbSwgcG90ZW50aWFsbHkgYXN5bmNocm9ub3VzLCBiYWNrZW5kLiAqLwotdHlwZWRlZiBzdHJ1Y3Qgc3NsX3ByaXZhdGVfa2V5X21ldGhvZF9zdCB7Ci0gIC8qIHR5cGUgcmV0dXJucyBlaXRoZXIgfEVWUF9QS0VZX1JTQXwgb3IgfEVWUF9QS0VZX0VDfCB0byBkZW5vdGUgdGhlIHR5cGUgb2YKLSAgICoga2V5IHVzZWQgYnkgfHNzbHwuICovCi0gIGludCAoKnR5cGUpKFNTTCAqc3NsKTsKLQotICAvKiBtYXhfc2lnbmF0dXJlX2xlbiByZXR1cm5zIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIHNpZ25hdHVyZSBzaWduZWQgYnkgdGhlCi0gICAqIGtleSB1c2VkIGJ5IHxzc2x8LiBUaGlzIG11c3QgYmUgYSBjb25zdGFudCB2YWx1ZSBmb3IgYSBnaXZlbiB8c3NsfC4gKi8KLSAgc2l6ZV90ICgqbWF4X3NpZ25hdHVyZV9sZW4pKFNTTCAqc3NsKTsKLQotICAvKiBzaWduIHNpZ25zIHxpbl9sZW58IGJ5dGVzIG9mIGRpZ2VzdCBmcm9tIHxpbnwuIHxtZHwgaXMgdGhlIGhhc2ggZnVuY3Rpb24KLSAgICogdXNlZCB0byBjYWxjdWxhdGUgfGlufC4gT24gc3VjY2VzcywgaXQgcmV0dXJucyB8c3NsX3ByaXZhdGVfa2V5X3N1Y2Nlc3N8Ci0gICAqIGFuZCB3cml0ZXMgYXQgbW9zdCB8bWF4X291dHwgYnl0ZXMgb2Ygc2lnbmF0dXJlIGRhdGEgdG8gfG91dHwuIE9uIGZhaWx1cmUsCi0gICAqIGl0IHJldHVybnMgfHNzbF9wcml2YXRlX2tleV9mYWlsdXJlfC4gSWYgdGhlIG9wZXJhdGlvbiBoYXMgbm90IGNvbXBsZXRlZCwKLSAgICogaXQgcmV0dXJucyB8c3NsX3ByaXZhdGVfa2V5X3JldHJ5fC4gfHNpZ258IHNob3VsZCBhcnJhbmdlIGZvciB0aGUKLSAgICogaGlnaC1sZXZlbCBvcGVyYXRpb24gb24gfHNzbHwgdG8gYmUgcmV0cmllZCB3aGVuIHRoZSBvcGVyYXRpb24gaXMKLSAgICogY29tcGxldGVkLiBUaGlzIHdpbGwgcmVzdWx0IGluIGEgY2FsbCB0byB8c2lnbl9jb21wbGV0ZXwuCi0gICAqCi0gICAqIElmIHRoZSBrZXkgaXMgYW4gUlNBIGtleSwgaW1wbGVtZW50YXRpb25zIG11c3QgdXNlIFBLQ1MjMSBwYWRkaW5nLiB8aW58IGlzCi0gICAqIHRoZSBkaWdlc3QgaXRzZWxmLCBzbyB0aGUgRGlnZXN0SW5mbyBwcmVmaXgsIGlmIGFueSwgbXVzdCBiZSBwcmVwZW5kZWQgYnkKLSAgICogfHNpZ258LiBJZiB8bWR8IGlzIHxFVlBfbWQ1X3NoYTF8LCB0aGVyZSBpcyBubyBwcmVmaXguCi0gICAqCi0gICAqIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgfHNpZ258IHdoaWxlIGFub3RoZXIgcHJpdmF0ZSBrZXkgb3BlcmF0aW9uIGlzIGluCi0gICAqIHByb2dyZXNzIG9uIHxzc2x8LiAqLwotICBlbnVtIHNzbF9wcml2YXRlX2tleV9yZXN1bHRfdCAoKnNpZ24pKFNTTCAqc3NsLCB1aW50OF90ICpvdXQsIHNpemVfdCAqb3V0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWF4X291dCwgY29uc3QgRVZQX01EICptZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluX2xlbik7Ci0KLSAgLyogc2lnbl9jb21wbGV0ZSBjb21wbGV0ZXMgYSBwZW5kaW5nIHxzaWdufCBvcGVyYXRpb24uIElmIHRoZSBvcGVyYXRpb24gaGFzCi0gICAqIGNvbXBsZXRlZCwgaXQgcmV0dXJucyB8c3NsX3ByaXZhdGVfa2V5X3N1Y2Nlc3N8IGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0bwotICAgKiB8b3V0fCBhcyBpbiB8c2lnbnwuIE90aGVyd2lzZSwgaXQgcmV0dXJucyB8c3NsX3ByaXZhdGVfa2V5X2ZhaWx1cmV8IG9uCi0gICAqIGZhaWx1cmUgYW5kIHxzc2xfcHJpdmF0ZV9rZXlfcmV0cnl8IGlmIHRoZSBvcGVyYXRpb24gaXMgc3RpbGwgaW4gcHJvZ3Jlc3MuCi0gICAqCi0gICAqIHxzaWduX2NvbXBsZXRlfCBtYXkgYmUgY2FsbGVkIGFyYml0cmFyaWx5IG1hbnkgdGltZXMgYmVmb3JlIGNvbXBsZXRpb24sIGJ1dAotICAgKiBpdCBpcyBhbiBlcnJvciB0byBjYWxsIHxzaWduX2NvbXBsZXRlfCBpZiB0aGVyZSBpcyBubyBwZW5kaW5nIHxzaWdufAotICAgKiBvcGVyYXRpb24gaW4gcHJvZ3Jlc3Mgb24gfHNzbHwuICovCi0gIGVudW0gc3NsX3ByaXZhdGVfa2V5X3Jlc3VsdF90ICgqc2lnbl9jb21wbGV0ZSkoU1NMICpzc2wsIHVpbnQ4X3QgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm91dF9sZW4sIHNpemVfdCBtYXhfb3V0KTsKLX0gU1NMX1BSSVZBVEVfS0VZX01FVEhPRDsKLQotLyogU1NMX3NldF9wcml2YXRlX2tleV9tZXRob2QgY29uZmlndXJlcyBhIGN1c3RvbSBwcml2YXRlIGtleSBvbiB8c3NsfC4KLSAqIHxrZXlfbWV0aG9kfCBtdXN0IHJlbWFpbiB2YWxpZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHxzc2x8LiAqLwotT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfc2V0X3ByaXZhdGVfa2V5X21ldGhvZCgKLSAgICBTU0wgKnNzbCwgY29uc3QgU1NMX1BSSVZBVEVfS0VZX01FVEhPRCAqa2V5X21ldGhvZCk7Ci0KLQogLyogQ29ubmVjdGlvbiBpbmZvcm1hdGlvbi4gKi8KIAotLyogU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlIHJldHVybnMgdGhlIHBlZXIncyBsZWFmIGNlcnRpZmljYXRlIG9yIE5VTEwgaWYgdGhlCi0gKiBwZWVyIGRpZCBub3QgdXNlIGNlcnRpZmljYXRlcy4gVGhlIGNhbGxlciBtdXN0IGNhbGwgfFg1MDlfZnJlZXwgb24gdGhlCi0gKiByZXN1bHQgdG8gcmVsZWFzZSBpdC4gKi8KLU9QRU5TU0xfRVhQT1JUIFg1MDkgKlNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShjb25zdCBTU0wgKnNzbCk7Ci0KLS8qIFNTTF9nZXRfcGVlcl9jZXJ0X2NoYWluIHJldHVybnMgdGhlIHBlZXIncyBjZXJ0aWZpY2F0ZSBjaGFpbiBvciBOVUxMIGlmCi0gKiB1bmF2YWlsYWJsZSBvciB0aGUgcGVlciBkaWQgbm90IHVzZSBjZXJ0aWZpY2F0ZXMuIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsCi0gKiB0aGlzIG1heSBub3QgYmUgYXZhaWxhYmxlIGlmIHJlc3VtaW5nIGEgc2VyaWFsaXplZCB8U1NMX1NFU1NJT058LiBUaGUgY2FsbGVyCi0gKiBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgcmVzdWx0LgotICoKLSAqIFdBUk5JTkc6IFRoaXMgZnVuY3Rpb24gYmVoYXZlcyBkaWZmZXJlbnRseSBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyLiBJZgotICogfHNzbHwgaXMgYSBzZXJ2ZXIsIHRoZSByZXR1cm5lZCBjaGFpbiBkb2VzIG5vdCBpbmNsdWRlIHRoZSBsZWFmIGNlcnRpZmljYXRlLgotICogSWYgYSBjbGllbnQsIGl0IGRvZXMuICovCi1PUEVOU1NMX0VYUE9SVCBTVEFDS19PRihYNTA5KSAqU1NMX2dldF9wZWVyX2NlcnRfY2hhaW4oY29uc3QgU1NMICpzc2wpOwotCiAvKiBTU0xfZ2V0X3Rsc191bmlxdWUgd3JpdGVzIGF0IG1vc3QgfG1heF9vdXR8IGJ5dGVzIG9mIHRoZSB0bHMtdW5pcXVlIHZhbHVlCiAgKiBmb3IgfHNzbHwgdG8gfG91dHwgYW5kIHNldHMgfCpvdXRfbGVufCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIEl0CiAgKiByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24gZXJyb3IuIEluIGdlbmVyYWwgfG1heF9vdXR8IHNob3VsZCBiZSBhdApAQCAtOTUwLDEyMTggKzUxNyw2IEBACiBPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX2dldF90bHNfdW5pcXVlKGNvbnN0IFNTTCAqc3NsLCB1aW50OF90ICpvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqb3V0X2xlbiwgc2l6ZV90IG1heF9vdXQpOwogCi0vKiBTU0xfZ2V0X2V4dG1zX3N1cHBvcnQgcmV0dXJucyBvbmUgaWYgdGhlIEV4dGVuZGVkIE1hc3RlciBTZWNyZXQKLSAqIGV4dGVuc2lvbiB3YXMgbmVnb3RpYXRlZC4gT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHplcm8uICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX2dldF9leHRtc19zdXBwb3J0KGNvbnN0IFNTTCAqc3NsKTsKLQotLyogU1NMX2dldF9jdXJyZW50X2NpcGhlciByZXR1cm5zIHRoZSBjaXBoZXIgdXNlZCBpbiB0aGUgY3VycmVudCBvdXRnb2luZwotICogY29ubmVjdGlvbiBzdGF0ZSwgb3IgTlVMTCBpZiB0aGUgbnVsbCBjaXBoZXIgaXMgYWN0aXZlLiAqLwotT1BFTlNTTF9FWFBPUlQgY29uc3QgU1NMX0NJUEhFUiAqU1NMX2dldF9jdXJyZW50X2NpcGhlcihjb25zdCBTU0wgKnNzbCk7Ci0KLS8qIFNTTF9zZXNzaW9uX3JldXNlZCByZXR1cm5zIG9uZSBpZiB8c3NsfCBwZXJmb3JtZWQgYW4gYWJicmV2aWF0ZWQgaGFuZHNoYWtlCi0gKiBhbmQgemVybyBvdGhlcndpc2UuCi0gKgotICogVE9ETyhkYXZpZGJlbik6IEhhbW1lciBkb3duIHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyBBUEkgd2hpbGUgYSBoYW5kc2hha2UsCi0gKiBpbml0aWFsIG9yIHJlbmVnbywgaXMgaW4gcHJvZ3Jlc3MuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3Nlc3Npb25fcmV1c2VkKGNvbnN0IFNTTCAqc3NsKTsKLQotLyogU1NMX2dldF9zZWN1cmVfcmVuZWdvdGlhdGlvbl9zdXBwb3J0IHJldHVybnMgb25lIGlmIHRoZSBwZWVyIHN1cHBvcnRzIHNlY3VyZQotICogcmVuZWdvdGlhdGlvbiAoUkZDIDU3NDYpIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfZ2V0X3NlY3VyZV9yZW5lZ290aWF0aW9uX3N1cHBvcnQoY29uc3QgU1NMICpzc2wpOwotCi0KLS8qIEN1c3RvbSBleHRlbnNpb25zLgotICoKLSAqIFRoZSBjdXN0b20gZXh0ZW5zaW9uIGZ1bmN0aW9ucyBhbGxvdyBUTFMgZXh0ZW5zaW9ucyB0byBiZSBhZGRlZCB0bwotICogQ2xpZW50SGVsbG8gYW5kIFNlcnZlckhlbGxvIG1lc3NhZ2VzLiAqLwotCi0vKiBTU0xfY3VzdG9tX2V4dF9hZGRfY2IgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZQotICogQ2xpZW50SGVsbG8gKGZvciBjbGllbnRzKSBvciBTZXJ2ZXJIZWxsbyAoZm9yIHNlcnZlcnMpIGlzIGNvbnN0cnVjdGVkLiBJbgotICogdGhlIGNhc2Ugb2YgYSBzZXJ2ZXIsIHRoaXMgY2FsbGJhY2sgd2lsbCBvbmx5IGJlIGNhbGxlZCBmb3IgYSBnaXZlbgotICogZXh0ZW5zaW9uIGlmIHRoZSBDbGllbnRIZWxsbyBjb250YWluZWQgdGhhdCBleHRlbnNpb24g4oCTIGl0J3Mgbm90IHBvc3NpYmxlIHRvCi0gKiBpbmplY3QgZXh0ZW5zaW9ucyBpbnRvIGEgU2VydmVySGVsbG8gdGhhdCB0aGUgY2xpZW50IGRpZG4ndCByZXF1ZXN0LgotICoKLSAqIFdoZW4gY2FsbGVkLCB8ZXh0ZW5zaW9uX3ZhbHVlfCB3aWxsIGNvbnRhaW4gdGhlIGV4dGVuc2lvbiBudW1iZXIgdGhhdCBpcwotICogYmVpbmcgY29uc2lkZXJlZCBmb3IgYWRkaXRpb24gKHNvIHRoYXQgYSBzaW5nbGUgY2FsbGJhY2sgY2FuIGhhbmRsZSBtdWx0aXBsZQotICogZXh0ZW5zaW9ucykuIElmIHRoZSBjYWxsYmFjayB3aXNoZXMgdG8gaW5jbHVkZSB0aGUgZXh0ZW5zaW9uLCBpdCBtdXN0IHNldAotICogfCpvdXR8IHRvIHBvaW50IHRvIHwqb3V0X2xlbnwgYnl0ZXMgb2YgZXh0ZW5zaW9uIGNvbnRlbnRzIGFuZCByZXR1cm4gb25lLiBJbgotICogdGhpcyBjYXNlLCB0aGUgY29ycmVzcG9uZGluZyB8U1NMX2N1c3RvbV9leHRfZnJlZV9jYnwgY2FsbGJhY2sgd2lsbCBsYXRlciBiZQotICogY2FsbGVkIHdpdGggdGhlIHZhbHVlIG9mIHwqb3V0fCBvbmNlIHRoYXQgZGF0YSBoYXMgYmVlbiBjb3BpZWQuCi0gKgotICogSWYgdGhlIGNhbGxiYWNrIGRvZXMgbm90IHdpc2ggdG8gYWRkIGFuIGV4dGVuc2lvbiBpdCBtdXN0IHJldHVybiB6ZXJvLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoZSBjYWxsYmFjayBjYW4gYWJvcnQgdGhlIGNvbm5lY3Rpb24gYnkgc2V0dGluZwotICogfCpvdXRfYWxlcnRfdmFsdWV8IHRvIGEgVExTIGFsZXJ0IG51bWJlciBhbmQgcmV0dXJuaW5nIC0xLiAqLwotdHlwZWRlZiBpbnQgKCpTU0xfY3VzdG9tX2V4dF9hZGRfY2IpKFNTTCAqc3NsLCB1bnNpZ25lZCBleHRlbnNpb25fdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKm91dCwgc2l6ZV90ICpvdXRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0X2FsZXJ0X3ZhbHVlLCB2b2lkICphZGRfYXJnKTsKLQotLyogU1NMX2N1c3RvbV9leHRfZnJlZV9jYiBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGJ5IE9wZW5TU0wgaWZmCi0gKiBhbiB8U1NMX2N1c3RvbV9leHRfYWRkX2NifCBjYWxsYmFjayBwcmV2aW91c2x5IHJldHVybmVkIG9uZS4gSW4gdGhhdCBjYXNlLAotICogdGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgYW5kIHBhc3NlZCB0aGUgfG91dHwgcG9pbnRlciB0aGF0IHdhcyByZXR1cm5lZCBieQotICogdGhlIGFkZCBjYWxsYmFjay4gVGhpcyBpcyB0byBmcmVlIGFueSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBjcmVhdGVkIGJ5Ci0gKiB0aGUgYWRkIGNhbGxiYWNrLiAqLwotdHlwZWRlZiB2b2lkICgqU1NMX2N1c3RvbV9leHRfZnJlZV9jYikoU1NMICpzc2wsIHVuc2lnbmVkIGV4dGVuc2lvbl92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm91dCwgdm9pZCAqYWRkX2FyZyk7Ci0KLS8qIFNTTF9jdXN0b21fZXh0X3BhcnNlX2NiIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgYnkgT3BlblNTTCB0bwotICogcGFyc2UgYW4gZXh0ZW5zaW9uIGZyb20gdGhlIHBlZXI6IHRoYXQgaXMgZnJvbSB0aGUgU2VydmVySGVsbG8gZm9yIGEgY2xpZW50Ci0gKiBhbmQgZnJvbSB0aGUgQ2xpZW50SGVsbG8gZm9yIGEgc2VydmVyLgotICoKLSAqIFdoZW4gY2FsbGVkLCB8ZXh0ZW5zaW9uX3ZhbHVlfCB3aWxsIGNvbnRhaW4gdGhlIGV4dGVuc2lvbiBudW1iZXIgYW5kIHRoZQotICogY29udGVudHMgb2YgdGhlIGV4dGVuc2lvbiBhcmUgfGNvbnRlbnRzX2xlbnwgYnl0ZXMgYXQgfGNvbnRlbnRzfC4KLSAqCi0gKiBUaGUgY2FsbGJhY2sgbXVzdCByZXR1cm4gb25lIHRvIGNvbnRpbnVlIHRoZSBoYW5kc2hha2UuIE90aGVyd2lzZSwgaWYgaXQKLSAqIHJldHVybnMgemVybywgYSBmYXRhbCBhbGVydCB3aXRoIHZhbHVlIHwqb3V0X2FsZXJ0X3ZhbHVlfCBpcyBzZW50IGFuZCB0aGUKLSAqIGhhbmRzaGFrZSBpcyBhYm9ydGVkLiAqLwotdHlwZWRlZiBpbnQgKCpTU0xfY3VzdG9tX2V4dF9wYXJzZV9jYikoU1NMICpzc2wsIHVuc2lnbmVkIGV4dGVuc2lvbl92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvbnRlbnRzX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0X2FsZXJ0X3ZhbHVlLCB2b2lkICpwYXJzZV9hcmcpOwotCi0vKiBTU0xfZXh0ZW5zaW9uX3N1cHBvcnRlZCByZXR1cm5zIG9uZSBpZmYgT3BlblNTTCBpbnRlcm5hbGx5IGhhbmRsZXMKLSAqIGV4dGVuc2lvbnMgb2YgdHlwZSB8ZXh0ZW5zaW9uX3ZhbHVlfC4gVGhpcyBjYW4gYmUgdXNlZCB0byBhdm9pZCByZWdpc3RlcmluZwotICogY3VzdG9tIGV4dGVuc2lvbiBoYW5kbGVycyBmb3IgZXh0ZW5zaW9ucyB0aGF0IGEgZnV0dXJlIHZlcnNpb24gb2YgT3BlblNTTAotICogbWF5IGhhbmRsZSBpbnRlcm5hbGx5LiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9leHRlbnNpb25fc3VwcG9ydGVkKHVuc2lnbmVkIGV4dGVuc2lvbl92YWx1ZSk7Ci0KLS8qIFNTTF9DVFhfYWRkX2NsaWVudF9jdXN0b21fZXh0IHJlZ2lzdGVycyBjYWxsYmFjayBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nCi0gKiBjdXN0b20gVExTIGV4dGVuc2lvbnMgZm9yIGNsaWVudCBjb25uZWN0aW9ucy4KLSAqCi0gKiBJZiB8YWRkX2NifCBpcyBOVUxMIHRoZW4gYW4gZW1wdHkgZXh0ZW5zaW9uIHdpbGwgYmUgYWRkZWQgaW4gZWFjaAotICogQ2xpZW50SGVsbG8uIE90aGVyd2lzZSwgc2VlIHRoZSBjb21tZW50IGZvciB8U1NMX2N1c3RvbV9leHRfYWRkX2NifCBhYm91dAotICogdGhpcyBjYWxsYmFjay4KLSAqCi0gKiBUaGUgfGZyZWVfY2J8IG1heSBiZSBOVUxMIGlmIHxhZGRfY2J8IGRvZXNuJ3QgZHluYW1pY2FsbHkgYWxsb2NhdGUgZGF0YSB0aGF0Ci0gKiBuZWVkcyB0byBiZSBmcmVlZC4KLSAqCi0gKiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24gZXJyb3IuIEl0J3MgYWx3YXlzIGFuIGVycm9yIHRvIHJlZ2lzdGVyCi0gKiBjYWxsYmFja3MgZm9yIHRoZSBzYW1lIGV4dGVuc2lvbiB0d2ljZSwgb3IgdG8gcmVnaXN0ZXIgY2FsbGJhY2tzIGZvciBhbgotICogZXh0ZW5zaW9uIHRoYXQgT3BlblNTTCBoYW5kbGVzIGludGVybmFsbHkuIFNlZSB8U1NMX2V4dGVuc2lvbl9zdXBwb3J0ZWR8IHRvCi0gKiBkaXNjb3ZlciwgYXQgcnVudGltZSwgd2hpY2ggZXh0ZW5zaW9ucyBPcGVuU1NMIGhhbmRsZXMgaW50ZXJuYWxseS4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX2FkZF9jbGllbnRfY3VzdG9tX2V4dCgKLSAgICBTU0xfQ1RYICpjdHgsIHVuc2lnbmVkIGV4dGVuc2lvbl92YWx1ZSwgU1NMX2N1c3RvbV9leHRfYWRkX2NiIGFkZF9jYiwKLSAgICBTU0xfY3VzdG9tX2V4dF9mcmVlX2NiIGZyZWVfY2IsIHZvaWQgKmFkZF9hcmcsCi0gICAgU1NMX2N1c3RvbV9leHRfcGFyc2VfY2IgcGFyc2VfY2IsIHZvaWQgKnBhcnNlX2FyZyk7Ci0KLS8qIFNTTF9DVFhfYWRkX3NlcnZlcl9jdXN0b21fZXh0IGlzIHRoZSBzYW1lIGFzCi0gKiB8U1NMX0NUWF9hZGRfY2xpZW50X2N1c3RvbV9leHR8LCBidXQgZm9yIHNlcnZlciBjb25uZWN0aW9ucy4KLSAqCi0gKiBVbmxpa2Ugb24gdGhlIGNsaWVudCBzaWRlLCBpZiB8YWRkX2NifCBpcyBOVUxMIG5vIGV4dGVuc2lvbiB3aWxsIGJlIGFkZGVkLgotICogVGhlIHxhZGRfY2J8LCBpZiBhbnksIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhlIENsaWVudEhlbGxvIGNvbnRhaW5lZCBhCi0gKiBtYXRjaGluZyBleHRlbnNpb24uICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9hZGRfc2VydmVyX2N1c3RvbV9leHQoCi0gICAgU1NMX0NUWCAqY3R4LCB1bnNpZ25lZCBleHRlbnNpb25fdmFsdWUsIFNTTF9jdXN0b21fZXh0X2FkZF9jYiBhZGRfY2IsCi0gICAgU1NMX2N1c3RvbV9leHRfZnJlZV9jYiBmcmVlX2NiLCB2b2lkICphZGRfYXJnLAotICAgIFNTTF9jdXN0b21fZXh0X3BhcnNlX2NiIHBhcnNlX2NiLCB2b2lkICpwYXJzZV9hcmcpOwotCi0KLS8qIFNlc3Npb25zLgotICoKLSAqIEFuIHxTU0xfU0VTU0lPTnwgcmVwcmVzZW50cyBhbiBTU0wgc2Vzc2lvbiB0aGF0IG1heSBiZSByZXN1bWVkIGluIGFuCi0gKiBhYmJyZXZpYXRlZCBoYW5kc2hha2UuIEl0IGlzIHJlZmVyZW5jZS1jb3VudGVkIGFuZCBpbW11dGFibGUuIE9uY2UKLSAqIGVzdGFibGlzaGVkLCBhbiB8U1NMX1NFU1NJT058IG1heSBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgfFNTTHwgb2JqZWN0cyBvbgotICogZGlmZmVyZW50IHRocmVhZHMgYW5kIG11c3Qgbm90IGJlIG1vZGlmaWVkLiAqLwotCi1ERUNMQVJFX0xIQVNIX09GKFNTTF9TRVNTSU9OKQotCi0vKiBTU0xfU0VTU0lPTl9uZXcgcmV0dXJucyBhIG5ld2x5LWFsbG9jYXRlZCBibGFuayB8U1NMX1NFU1NJT058IG9yIE5VTEwgb24KLSAqIGVycm9yLiBUaGlzIG1heSBiZSB1c2VmdWwgaW4gd3JpdGluZyB0ZXN0cyBidXQgb3RoZXJ3aXNlIHNob3VsZCBub3QgYmUKLSAqIHVzZWQgb3V0c2lkZSB0aGUgbGlicmFyeS4gKi8KLU9QRU5TU0xfRVhQT1JUIFNTTF9TRVNTSU9OICpTU0xfU0VTU0lPTl9uZXcodm9pZCk7Ci0KLS8qIFNTTF9TRVNTSU9OX3VwX3JlZiwgaWYgfHNlc3Npb258IGlzIG5vdCBOVUxMLCBpbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQKLSAqIG9mIHxzZXNzaW9ufC4gSXQgdGhlbiByZXR1cm5zIHxzZXNzaW9ufC4gKi8KLU9QRU5TU0xfRVhQT1JUIFNTTF9TRVNTSU9OICpTU0xfU0VTU0lPTl91cF9yZWYoU1NMX1NFU1NJT04gKnNlc3Npb24pOwotCi0vKiBTU0xfU0VTU0lPTl9mcmVlIGRlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB8c2Vzc2lvbnwuIElmIGl0IHJlYWNoZXMKLSAqIHplcm8sIGFsbCBkYXRhIHJlZmVyZW5jZWQgYnkgfHNlc3Npb258IGFuZCB8c2Vzc2lvbnwgaXRzZWxmIGFyZSByZWxlYXNlZC4gKi8KLU9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX1NFU1NJT05fZnJlZShTU0xfU0VTU0lPTiAqc2Vzc2lvbik7Ci0KLS8qIFNTTF9TRVNTSU9OX3RvX2J5dGVzIHNlcmlhbGl6ZXMgfGlufCBpbnRvIGEgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBhbmQgc2V0cwotICogfCpvdXRfZGF0YXwgdG8gdGhhdCBidWZmZXIgYW5kIHwqb3V0X2xlbnwgdG8gaXRzIGxlbmd0aC4gVGhlIGNhbGxlciB0YWtlcwotICogb3duZXJzaGlwIG9mIHRoZSBidWZmZXIgYW5kIG11c3QgY2FsbCB8T1BFTlNTTF9mcmVlfCB3aGVuIGRvbmUuIEl0IHJldHVybnMKLSAqIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9TRVNTSU9OX3RvX2J5dGVzKGNvbnN0IFNTTF9TRVNTSU9OICppbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqb3V0X2RhdGEsIHNpemVfdCAqb3V0X2xlbik7Ci0KLS8qIFNTTF9TRVNTSU9OX3RvX2J5dGVzX2Zvcl90aWNrZXQgc2VyaWFsaXplcyB8aW58LCBidXQgZXhjbHVkZXMgdGhlIHNlc3Npb24KLSAqIGlkZW50aWZpY2F0aW9uIGluZm9ybWF0aW9uLCBuYW1lbHkgdGhlIHNlc3Npb24gSUQgYW5kIHRpY2tldC4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfU0VTU0lPTl90b19ieXRlc19mb3JfdGlja2V0KGNvbnN0IFNTTF9TRVNTSU9OICppbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipvdXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqb3V0X2xlbik7Ci0KLS8qIFNTTF9TRVNTSU9OX2Zyb21fYnl0ZXMgcGFyc2VzIHxpbl9sZW58IGJ5dGVzIGZyb20gfGlufCBhcyBhbiBTU0xfU0VTU0lPTi4gSXQKLSAqIHJldHVybnMgYSBuZXdseS1hbGxvY2F0ZWQgfFNTTF9TRVNTSU9OfCBvbiBzdWNjZXNzIG9yIE5VTEwgb24gZXJyb3IuICovCi1PUEVOU1NMX0VYUE9SVCBTU0xfU0VTU0lPTiAqU1NMX1NFU1NJT05fZnJvbV9ieXRlcyhjb25zdCB1aW50OF90ICppbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbl9sZW4pOwotCi0vKiBTU0xfU0VTU0lPTl9nZXRfdmVyc2lvbiByZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIFRMUyB2ZXJzaW9uIHxzZXNzaW9ufAotICogd2FzIGVzdGFibGlzaGVkIGF0LiBGb3IgZXhhbXBsZSwgIlRMU3YxLjIiIG9yICJTU0x2MyIuICovCi1PUEVOU1NMX0VYUE9SVCBjb25zdCBjaGFyICpTU0xfU0VTU0lPTl9nZXRfdmVyc2lvbihjb25zdCBTU0xfU0VTU0lPTiAqc2Vzc2lvbik7Ci0KLS8qIFNTTF9TRVNTSU9OX2dldF9pZCByZXR1cm5zIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluZyB8c2Vzc2lvbnwncyBzZXNzaW9uCi0gKiBJRCBhbmQgc2V0cyB8Km91dF9sZW58IHRvIGl0cyBsZW5ndGguICovCi1PUEVOU1NMX0VYUE9SVCBjb25zdCB1aW50OF90ICpTU0xfU0VTU0lPTl9nZXRfaWQoY29uc3QgU1NMX1NFU1NJT04gKnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKm91dF9sZW4pOwotCi0vKiBTU0xfU0VTU0lPTl9nZXRfdGltZSByZXR1cm5zIHRoZSB0aW1lIGF0IHdoaWNoIHxzZXNzaW9ufCB3YXMgZXN0YWJsaXNoZWQgaW4KLSAqIHNlY29uZHMgc2luY2UgdGhlIFVOSVggZXBvY2guICovCi1PUEVOU1NMX0VYUE9SVCBsb25nIFNTTF9TRVNTSU9OX2dldF90aW1lKGNvbnN0IFNTTF9TRVNTSU9OICpzZXNzaW9uKTsKLQotLyogU1NMX1NFU1NJT05fZ2V0X3RpbWVvdXQgcmV0dXJucyB0aGUgbGlmZXRpbWUgb2YgfHNlc3Npb258IGluIHNlY29uZHMuICovCi1PUEVOU1NMX0VYUE9SVCBsb25nIFNTTF9TRVNTSU9OX2dldF90aW1lb3V0KGNvbnN0IFNTTF9TRVNTSU9OICpzZXNzaW9uKTsKLQotLyogU1NMX1NFU1NJT05fZ2V0X2tleV9leGNoYW5nZV9pbmZvIHJldHVybnMgYSB2YWx1ZSB0aGF0IGRlc2NyaWJlcyB0aGUKLSAqIHN0cmVuZ3RoIG9mIHRoZSBhc3ltbWV0cmljIG9wZXJhdGlvbiB0aGF0IHByb3ZpZGVzIGNvbmZpZGVudGlhbGl0eSB0bwotICogfHNlc3Npb258LiBJdHMgaW50ZXJwcmV0YXRpb24gZGVwZW5kcyBvbiB0aGUgb3BlcmF0aW9uIHVzZWQuIFNlZSB0aGUKLSAqIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgdmFsdWUgaW4gdGhlIHxTU0xfU0VTU0lPTnwgc3RydWN0dXJlLiAqLwotT1BFTlNTTF9FWFBPUlQgdWludDMyX3QgU1NMX1NFU1NJT05fZ2V0X2tleV9leGNoYW5nZV9pbmZvKAotICAgIGNvbnN0IFNTTF9TRVNTSU9OICpzZXNzaW9uKTsKLQotLyogU1NMX1NFU1NJT05fZ2V0MF9wZWVyIHJldHVybidzIHRoZSBwZWVyIGxlYWYgY2VydGlmaWNhdGUgc3RvcmVkIGluCi0gKiB8c2Vzc2lvbnwuCi0gKgotICogVE9ETyhkYXZpZGJlbik6IFRoaXMgc2hvdWxkIHJldHVybiBhIGNvbnN0IFg1MDkgKi4gKi8KLU9QRU5TU0xfRVhQT1JUIFg1MDkgKlNTTF9TRVNTSU9OX2dldDBfcGVlcihjb25zdCBTU0xfU0VTU0lPTiAqc2Vzc2lvbik7Ci0KLS8qIFNTTF9TRVNTSU9OX3NldF90aW1lIHNldHMgfHNlc3Npb258J3MgY3JlYXRpb24gdGltZSB0byB8dGltZXwgYW5kIHJldHVybnMKLSAqIHx0aW1lfC4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZnVsIGluIHdyaXRpbmcgdGVzdHMgYnV0IG90aGVyd2lzZSBzaG91bGQgbm90Ci0gKiBiZSB1c2VkLiAqLwotT1BFTlNTTF9FWFBPUlQgbG9uZyBTU0xfU0VTU0lPTl9zZXRfdGltZShTU0xfU0VTU0lPTiAqc2Vzc2lvbiwgbG9uZyB0aW1lKTsKLQotLyogU1NMX1NFU1NJT05fc2V0X3RpbWUgc2V0cyB8c2Vzc2lvbnwncyB0aW1lb3V0IHRvIHx0aW1lb3V0fCBhbmQgcmV0dXJucyBvbmUuCi0gKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VmdWwgaW4gd3JpdGluZyB0ZXN0cyBidXQgb3RoZXJ3aXNlIHNob3VsZCBub3QgYmUKLSAqIHVzZWQuICovCi1PUEVOU1NMX0VYUE9SVCBsb25nIFNTTF9TRVNTSU9OX3NldF90aW1lb3V0KFNTTF9TRVNTSU9OICpzZXNzaW9uLCBsb25nIHRpbWVvdXQpOwotCi0vKiBTU0xfU0VTU0lPTl9zZXQxX2lkX2NvbnRleHQgc2V0cyB8c2Vzc2lvbnwncyBzZXNzaW9uIElEIGNvbnRleHQgKHNlZQotICogfFNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dHwpIHRvIHxzaWRfY3R4fC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQKLSAqIHplcm8gb24gZXJyb3IuIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWZ1bCBpbiB3cml0aW5nIHRlc3RzIGJ1dCBvdGhlcndpc2UKLSAqIHNob3VsZCBub3QgYmUgdXNlZC4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfU0VTU0lPTl9zZXQxX2lkX2NvbnRleHQoU1NMX1NFU1NJT04gKnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNpZF9jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNpZF9jdHhfbGVuKTsKLQotCi0vKiBTZXNzaW9uIGNhY2hpbmcuCi0gKgotICogU2Vzc2lvbiBjYWNoaW5nIGFsbG93cyBjbGllbnRzIHRvIHJlY29ubmVjdCB0byBhIHNlcnZlciBiYXNlZCBvbiBzYXZlZAotICogcGFyYW1ldGVycyBmcm9tIGEgcHJldmlvdXMgY29ubmVjdGlvbi4KLSAqCi0gKiBGb3IgYSBzZXJ2ZXIsIHRoZSBsaWJyYXJ5IGltcGxlbWVudHMgYSBidWlsdC1pbiBpbnRlcm5hbCBzZXNzaW9uIGNhY2hlIGFzIGFuCi0gKiBpbi1tZW1vcnkgaGFzaCB0YWJsZS4gT25lIG1heSBhbHNvIHJlZ2lzdGVyIGNhbGxiYWNrcyB0byBpbXBsZW1lbnQgYSBjdXN0b20KLSAqIGV4dGVybmFsIHNlc3Npb24gY2FjaGUuIEFuIGV4dGVybmFsIGNhY2hlIG1heSBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG9yCi0gKiBpbnN0ZWFkIG9mIHRoZSBpbnRlcm5hbCBvbmUuIFVzZSB8U1NMX0NUWF9zZXRfc2Vzc2lvbl9jYWNoZV9tb2RlfCB0byB0b2dnbGUKLSAqIHRoZSBpbnRlcm5hbCBjYWNoZS4KLSAqCi0gKiBGb3IgYSBjbGllbnQsIHRoZSBvbmx5IG9wdGlvbiBpcyBhbiBleHRlcm5hbCBzZXNzaW9uIGNhY2hlLiBQcmlvciB0bwotICogaGFuZHNoYWtpbmcsIHRoZSBjb25zdW1lciBzaG91bGQgbG9vayB1cCBhIHNlc3Npb24gZXh0ZXJuYWxseSAoa2V5ZWQsIGZvcgotICogaW5zdGFuY2UsIGJ5IGhvc3RuYW1lKSBhbmQgdXNlIHxTU0xfc2V0X3Nlc3Npb258IHRvIGNvbmZpZ3VyZSB3aGljaCBzZXNzaW9uCi0gKiB0byBvZmZlci4gVGhlIGNhbGxiYWNrcyBtYXkgYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiBuZXcgc2Vzc2lvbnMgYXJlCi0gKiBhdmFpbGFibGUuCi0gKgotICogTm90ZSB0aGF0IG9mZmVyaW5nIG9yIGFjY2VwdGluZyBhIHNlc3Npb24gc2hvcnQtY2lyY3VpdHMgbW9zdCBwYXJhbWV0ZXIKLSAqIG5lZ290aWF0aW9uLiBSZXN1bWluZyBzZXNzaW9ucyBhY3Jvc3MgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zIG1heSByZXN1bHQgaW4KLSAqIHN1cnByaXNpbmcgYmVoYXZvci4gU28sIGZvciBpbnN0YW5jZSwgYSBjbGllbnQgaW1wbGVtZW50aW5nIGEgdmVyc2lvbgotICogZmFsbGJhY2sgc2hvdWxkIHNoYXJkIGl0cyBzZXNzaW9uIGNhY2hlIGJ5IG1heGltdW0gcHJvdG9jb2wgdmVyc2lvbi4gKi8KLQotLyogU1NMX1NFU1NfQ0FDSEVfT0ZGIGRpc2FibGVzIGFsbCBzZXNzaW9uIGNhY2hpbmcuICovCi0jZGVmaW5lIFNTTF9TRVNTX0NBQ0hFX09GRiAweDAwMDAKLQotLyogU1NMX1NFU1NfQ0FDSEVfQ0xJRU5UIGVuYWJsZXMgc2Vzc2lvbiBjYWNoaW5nIGZvciBhIGNsaWVudC4KLSAqCi0gKiBUT0RPKGRhdmlkYmVuKTogVGhlIGludGVybmFsIGNhY2hlIGlzIHVzZWxlc3Mgb24gdGhlIGNsaWVudC4gQWx3YXlzIGFjdCBhcyBpZgotICogU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUwgaXMgc2V0LiBodHRwczovL2NyYnVnLmNvbS81MzExOTQuIEFsc28gc2VlIFRPRE8KLSAqIGF0dGFjaGVkIHRvIHxTU0xfQ1RYX3Nlc3Nfc2V0X25ld19jYnwuICovCi0jZGVmaW5lIFNTTF9TRVNTX0NBQ0hFX0NMSUVOVCAweDAwMDEKLQotLyogU1NMX1NFU1NfQ0FDSEVfU0VSVkVSIGVuYWJsZXMgc2Vzc2lvbiBjYWNoaW5nIGZvciBhIHNlcnZlci4gKi8KLSNkZWZpbmUgU1NMX1NFU1NfQ0FDSEVfU0VSVkVSIDB4MDAwMgotCi0vKiBTU0xfU0VTU19DQUNIRV9TRVJWRVIgZW5hYmxlcyBzZXNzaW9uIGNhY2hpbmcgZm9yIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIuICovCi0jZGVmaW5lIFNTTF9TRVNTX0NBQ0hFX0JPVEggKFNTTF9TRVNTX0NBQ0hFX0NMSUVOVCB8IFNTTF9TRVNTX0NBQ0hFX1NFUlZFUikKLQotLyogU1NMX1NFU1NfQ0FDSEVfTk9fQVVUT19DTEVBUiBkaXNhYmxlcyBhdXRvbWF0aWNhbGx5IGNhbGxpbmcKLSAqIHxTU0xfQ1RYX2ZsdXNoX3Nlc3Npb25zfCBldmVyeSAyNTUgY29ubmVjdGlvbnMuICovCi0jZGVmaW5lIFNTTF9TRVNTX0NBQ0hFX05PX0FVVE9fQ0xFQVIgMHgwMDgwCi0KLS8qIFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMX0xPT0tVUCBkaXNhYmxlcyBsb29raW5nIHVwIGEgc2Vzc2lvbiBmcm9tIHRoZQotICogaW50ZXJuYWwgc2Vzc2lvbiBjYWNoZS4gKi8KLSNkZWZpbmUgU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfTE9PS1VQIDB4MDEwMAotCi0vKiBTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTF9TVE9SRSBkaXNhYmxlcyBzdG9yaW5nIHNlc3Npb25zIGluIHRoZSBpbnRlcm5hbAotICogc2Vzc2lvbiBjYWNoZS4gKi8KLSNkZWZpbmUgU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfU1RPUkUgMHgwMjAwCi0KLS8qIFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMIGRpc2FibGVzIHRoZSBpbnRlcm5hbCBzZXNzaW9uIGNhY2hlLiAqLwotI2RlZmluZSBTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTCBcCi0gICAgKFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMX0xPT0tVUCB8IFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMX1NUT1JFKQotCi0vKiBTU0xfQ1RYX3NldF9zZXNzaW9uX2NhY2hlX21vZGUgc2V0cyB0aGUgc2Vzc2lvbiBjYWNoZSBtb2RlIGJpdHMgZm9yIHxjdHh8IHRvCi0gKiB8bW9kZXwuIEl0IHJldHVybnMgdGhlIHByZXZpb3VzIHZhbHVlLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZShTU0xfQ1RYICpjdHgsIGludCBtb2RlKTsKLQotLyogU1NMX0NUWF9nZXRfc2Vzc2lvbl9jYWNoZV9tb2RlIHJldHVybnMgdGhlIHNlc3Npb24gY2FjaGUgbW9kZSBiaXRzIGZvcgotICogfGN0eHwgKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX2dldF9zZXNzaW9uX2NhY2hlX21vZGUoY29uc3QgU1NMX0NUWCAqY3R4KTsKLQotIC8qIFNTTF9zZXRfc2Vzc2lvbiwgZm9yIGEgY2xpZW50LCBjb25maWd1cmVzIHxzc2x8IHRvIG9mZmVyIHRvIHJlc3VtZSB8c2Vzc2lvbnwKLSAqIGluIHRoZSBpbml0aWFsIGhhbmRzaGFrZS4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfc2V0X3Nlc3Npb24oU1NMICpzc2wsIFNTTF9TRVNTSU9OICpzZXNzaW9uKTsKLQotLyogU1NMX2dldF9zZXNzaW9uIHJldHVybnMgYSBub24tb3duaW5nIHBvaW50ZXIgdG8gfHNzbHwncyBzZXNzaW9uLiBQcmlvciB0byB0aGUKLSAqIGluaXRpYWwgaGFuZHNoYWtlIGJlZ2lubmluZywgdGhpcyBpcyB0aGUgc2Vzc2lvbiB0byBiZSBvZmZlcmVkLCBzZXQgYnkKLSAqIHxTU0xfc2V0X3Nlc3Npb258LiBBZnRlciBhIGhhbmRzaGFrZSBoYXMgZmluaXNoZWQsIHRoaXMgaXMgdGhlIGN1cnJlbnRseQotICogYWN0aXZlIHNlc3Npb24uIEl0cyBiZWhhdmlvciBpcyB1bmRlZmluZWQgd2hpbGUgYSBoYW5kc2hha2UgaXMgcHJvZ3Jlc3MuICovCi1PUEVOU1NMX0VYUE9SVCBTU0xfU0VTU0lPTiAqU1NMX2dldF9zZXNzaW9uKGNvbnN0IFNTTCAqc3NsKTsKLQotLyogU1NMX2dldDBfc2Vzc2lvbiBpcyBhbiBhbGlhcyBmb3IgfFNTTF9nZXRfc2Vzc2lvbnwuICovCi0jZGVmaW5lIFNTTF9nZXQwX3Nlc3Npb24gU1NMX2dldF9zZXNzaW9uCi0KLS8qIFNTTF9nZXQxX3Nlc3Npb24gYWN0cyBsaWtlIHxTU0xfZ2V0X3Nlc3Npb258IGJ1dCByZXR1cm5zIGEgbmV3IHJlZmVyZW5jZSB0bwotICogdGhlIHNlc3Npb24uICovCi1PUEVOU1NMX0VYUE9SVCBTU0xfU0VTU0lPTiAqU1NMX2dldDFfc2Vzc2lvbihTU0wgKnNzbCk7Ci0KLS8qIFNTTF9ERUZBVUxUX1NFU1NJT05fVElNRU9VVCBpcyB0aGUgZGVmYXVsdCBsaWZldGltZSwgaW4gc2Vjb25kcywgb2YgYQotICogc2Vzc2lvbi4gKi8KLSNkZWZpbmUgU1NMX0RFRkFVTFRfU0VTU0lPTl9USU1FT1VUICgyICogNjAgKiA2MCkKLQotLyogU1NMX0NUWF9zZXRfdGltZW91dCBzZXRzIHRoZSBsaWZldGltZSwgaW4gc2Vjb25kcywgb2Ygc2Vzc2lvbnMgY3JlYXRlZCBpbgotICogfGN0eHwgdG8gfHRpbWVvdXR8LiAqLwotT1BFTlNTTF9FWFBPUlQgbG9uZyBTU0xfQ1RYX3NldF90aW1lb3V0KFNTTF9DVFggKmN0eCwgbG9uZyB0aW1lb3V0KTsKLQotLyogU1NMX0NUWF9nZXRfdGltZW91dCByZXR1cm5zIHRoZSBsaWZldGltZSwgaW4gc2Vjb25kcywgb2Ygc2Vzc2lvbnMgY3JlYXRlZCBpbgotICogfGN0eHwuICovCi1PUEVOU1NMX0VYUE9SVCBsb25nIFNTTF9DVFhfZ2V0X3RpbWVvdXQoY29uc3QgU1NMX0NUWCAqY3R4KTsKLQotLyogU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0IHNldHMgfGN0eHwncyBzZXNzaW9uIElEIGNvbnRleHQgdG8gfHNpZF9jdHh8LgotICogSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gVGhlIHNlc3Npb24gSUQgY29udGV4dCBpcyBhbgotICogYXBwbGljYXRpb24tZGVmaW5lZCBvcGFxdWUgYnl0ZSBzdHJpbmcuIEEgc2Vzc2lvbiB3aWxsIG5vdCBiZSB1c2VkIGluIGEKLSAqIGNvbm5lY3Rpb24gd2l0aG91dCBhIG1hdGNoaW5nIHNlc3Npb24gSUQgY29udGV4dC4KLSAqCi0gKiBGb3IgYSBzZXJ2ZXIsIGlmIHxTU0xfVkVSSUZZX1BFRVJ8IGlzIGVuYWJsZWQsIGl0IGlzIGFuIGVycm9yIHRvIG5vdCBzZXQgYQotICogc2Vzc2lvbiBJRCBjb250ZXh0LgotICoKLSAqIFRPRE8oZGF2aWRiZW4pOiBJcyB0aGF0IGNoZWNrIG5lZWRlZD8gVGhhdCBzZWVtcyBhIHNwZWNpYWwgY2FzZSBvZiB0YWtpbmcKLSAqIGNhcmUgbm90IHRvIGNyb3NzLXJlc3VtZSBhY3Jvc3MgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBhbmQgdGhpcyBpcyBvbmx5Ci0gKiByZWxldmFudCBpZiBhIHNlcnZlciByZXF1aXJlcyBjbGllbnQgYXV0aC4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3NldF9zZXNzaW9uX2lkX2NvbnRleHQoU1NMX0NUWCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzaWRfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaWRfY3R4X2xlbik7Ci0KLS8qIFNTTF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0IHNldHMgfHNzbHwncyBzZXNzaW9uIElEIGNvbnRleHQgdG8gfHNpZF9jdHh8LiBJdAotICogcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gU2VlIGFsc28KLSAqIHxTU0xfQ1RYX3NldF9zZXNzaW9uX2lkX2NvbnRleHR8LiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KFNTTCAqc3NsLCBjb25zdCB1aW50OF90ICpzaWRfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNpZF9jdHhfbGVuKTsKLQotLyogU1NMX1NFU1NJT05fQ0FDSEVfTUFYX1NJWkVfREVGQVVMVCBpcyB0aGUgZGVmYXVsdCBtYXhpbXVtIHNpemUgb2YgYSBzZXNzaW9uCi0gKiBjYWNoZS4gKi8KLSNkZWZpbmUgU1NMX1NFU1NJT05fQ0FDSEVfTUFYX1NJWkVfREVGQVVMVCAoMTAyNCAqIDIwKQotCi0vKiBTU0xfQ1RYX3Nlc3Nfc2V0X2NhY2hlX3NpemUgc2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHxjdHh8J3MgaW50ZXJuYWwgc2Vzc2lvbgotICogY2FjaGUgdG8gfHNpemV8LiBJdCByZXR1cm5zIHRoZSBwcmV2aW91cyB2YWx1ZS4gKi8KLU9QRU5TU0xfRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1NMX0NUWF9zZXNzX3NldF9jYWNoZV9zaXplKFNTTF9DVFggKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci0KLS8qIFNTTF9DVFhfc2Vzc19nZXRfY2FjaGVfc2l6ZSByZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgfGN0eHwncyBpbnRlcm5hbAotICogc2Vzc2lvbiBjYWNoZS4gKi8KLU9QRU5TU0xfRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1NMX0NUWF9zZXNzX2dldF9jYWNoZV9zaXplKGNvbnN0IFNTTF9DVFggKmN0eCk7Ci0KLS8qIFNTTF9DVFhfc2Vzc2lvbnMgcmV0dXJucyB8Y3R4fCdzIGludGVybmFsIHNlc3Npb24gY2FjaGUuICovCi1PUEVOU1NMX0VYUE9SVCBMSEFTSF9PRihTU0xfU0VTU0lPTikgKlNTTF9DVFhfc2Vzc2lvbnMoU1NMX0NUWCAqY3R4KTsKLQotLyogU1NMX0NUWF9zZXNzX251bWJlciByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2Vzc2lvbnMgaW4gfGN0eHwncyBpbnRlcm5hbAotICogc2Vzc2lvbiBjYWNoZS4gKi8KLU9QRU5TU0xfRVhQT1JUIHNpemVfdCBTU0xfQ1RYX3Nlc3NfbnVtYmVyKGNvbnN0IFNTTF9DVFggKmN0eCk7Ci0KLS8qIFNTTF9DVFhfYWRkX3Nlc3Npb24gaW5zZXJ0cyB8c2Vzc2lvbnwgaW50byB8Y3R4fCdzIGludGVybmFsIHNlc3Npb24gY2FjaGUuIEl0Ci0gKiByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yIG9yIGlmIHxjdHh8IGFscmVhZHkgaW5jbHVkZWQgYQotICogc2Vzc2lvbiB3aXRoIHRoYXQgc2Vzc2lvbiBJRC4gVGhlIGNhbGxlciByZXRhaW5zIGl0cyByZWZlcmVuY2UgdG8KLSAqIHxzZXNzaW9ufC4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX2FkZF9zZXNzaW9uKFNTTF9DVFggKmN0eCwgU1NMX1NFU1NJT04gKnNlc3Npb24pOwotCi0vKiBTU0xfQ1RYX3JlbW92ZV9zZXNzaW9uIHJlbW92ZXMgfHNlc3Npb258IGZyb20gfGN0eHwncyBpbnRlcm5hbCBzZXNzaW9uIGNhY2hlLgotICogSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvciBvciBpZiBubyBzZXNzaW9uIHdpdGggYSBtYXRjaGluZwotICogSUQgd2FzIGZvdW5kLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfcmVtb3ZlX3Nlc3Npb24oU1NMX0NUWCAqY3R4LCBTU0xfU0VTU0lPTiAqc2Vzc2lvbik7Ci0KLS8qIFNTTF9DVFhfZmx1c2hfc2Vzc2lvbnMgcmVtb3ZlcyBhbGwgc2Vzc2lvbnMgZnJvbSB8Y3R4fCB3aGljaCBoYXZlIGV4cGlyZWQgYXMKLSAqIG9mIHRpbWUgfHRpbWV8LiBJZiB8dGltZXwgaXMgemVybywgYWxsIHNlc3Npb25zIGFyZSByZW1vdmVkLiAqLwotT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfQ1RYX2ZsdXNoX3Nlc3Npb25zKFNTTF9DVFggKmN0eCwgbG9uZyB0aW1lKTsKLQotLyogU1NMX0NUWF9zZXNzX3NldF9uZXdfY2Igc2V0cyB0aGUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gYSBuZXcgc2Vzc2lvbiBpcwotICogZXN0YWJsaXNoZWQgYW5kIHJlYWR5IHRvIGJlIGNhY2hlZC4gSWYgdGhlIHNlc3Npb24gY2FjaGUgaXMgZGlzYWJsZWQgKHRoZQotICogYXBwcm9wcmlhdGUgb25lIG9mIHxTU0xfU0VTU19DQUNIRV9DTElFTlR8IG9yIHxTU0xfU0VTU19DQUNIRV9TRVJWRVJ8IGlzCi0gKiB1bnNldCksIHRoZSBjYWxsYmFjayBpcyBub3QgY2FsbGVkLgotICoKLSAqIFRoZSBjYWxsYmFjayBpcyBwYXNzZWQgYSByZWZlcmVuY2UgdG8gfHNlc3Npb258LiBJdCByZXR1cm5zIG9uZSBpZiBpdCB0YWtlcwotICogb3duZXJzaGlwIGFuZCB6ZXJvIG90aGVyd2lzZS4KLSAqCi0gKiBOb3RlOiBGb3IgYSBjbGllbnQsIHRoZSBjYWxsYmFjayBtYXkgYmUgY2FsbGVkIG9uIGFiYnJldmlhdGVkIGhhbmRzaGFrZXMgaWYgYQotICogdGlja2V0IGlzIHJlbmV3ZWQuIEZ1cnRoZXIsIGl0IG1heSBub3QgYmUgY2FsbGVkIHVudGlsIHNvbWUgdGltZSBhZnRlcgotICogfFNTTF9kb19oYW5kc2hha2V8IG9yIHxTU0xfY29ubmVjdHwgY29tcGxldGVzIGlmIEZhbHNlIFN0YXJ0IGlzIGVuYWJsZWQuIFRodXMKLSAqIGl0J3MgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgY2FsbGJhY2sgb3ZlciBjaGVja2luZyB8U1NMX3Nlc3Npb25fcmV1c2VkfCBvbgotICogaGFuZHNoYWtlIGNvbXBsZXRpb24uCi0gKgotICogVE9ETyhkYXZpZGJlbik6IENvbmRpdGlvbmluZyBjYWxsYmFja3Mgb24gfFNTTF9TRVNTX0NBQ0hFX0NMSUVOVHwgb3IKLSAqIHxTU0xfU0VTU19DQUNIRV9TRVJWRVJ8IGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2Ugd2hlbiBvbmUgY291bGQganVzdCBhcyBlYXNpbHkKLSAqIG5vdCBzdXBwbHkgdGhlIGNhbGxiYWNrcy4gUmVtb3ZpbmcgdGhhdCBjb25kaXRpb24gYW5kIHRoZSBjbGllbnQgaW50ZXJuYWwKLSAqIGNhY2hlIHdvdWxkIHNpbXBsaWZ5IHRoaW5ncy4gKi8KLU9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX0NUWF9zZXNzX3NldF9uZXdfY2IoCi0gICAgU1NMX0NUWCAqY3R4LCBpbnQgKCpuZXdfc2Vzc2lvbl9jYikoU1NMICpzc2wsIFNTTF9TRVNTSU9OICpzZXNzaW9uKSk7Ci0KLS8qIFNTTF9DVFhfc2Vzc19nZXRfbmV3X2NiIHJldHVybnMgdGhlIGNhbGxiYWNrIHNldCBieQotICogfFNTTF9DVFhfc2Vzc19zZXRfbmV3X2NifC4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCAoKlNTTF9DVFhfc2Vzc19nZXRfbmV3X2NiKFNTTF9DVFggKmN0eCkpKAotICAgIFNTTCAqc3NsLCBTU0xfU0VTU0lPTiAqc2Vzc2lvbik7Ci0KLS8qIFNTTF9DVFhfc2Vzc19zZXRfcmVtb3ZlX2NiIHNldHMgYSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIHNlc3Npb24gaXMKLSAqIHJlbW92ZWQgZnJvbSB0aGUgaW50ZXJuYWwgc2Vzc2lvbiBjYWNoZS4KLSAqCi0gKiBUT0RPKGRhdmlkYmVuKTogV2hhdCBpcyB0aGUgcG9pbnQgb2YgdGhpcyBjYWxsYmFjaz8gSXQgc2VlbXMgdXNlbGVzcyBzaW5jZSBpdAotICogb25seSBmaXJlcyBvbiBzZXNzaW9ucyBpbiB0aGUgaW50ZXJuYWwgY2FjaGUuICovCi1PUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2Vzc19zZXRfcmVtb3ZlX2NiKAotICAgIFNTTF9DVFggKmN0eCwKLSAgICB2b2lkICgqcmVtb3ZlX3Nlc3Npb25fY2IpKFNTTF9DVFggKmN0eCwgU1NMX1NFU1NJT04gKnNlc3Npb24pKTsKLQotLyogU1NMX0NUWF9zZXNzX2dldF9yZW1vdmVfY2IgcmV0dXJucyB0aGUgY2FsbGJhY2sgc2V0IGJ5Ci0gKiB8U1NMX0NUWF9zZXNzX3NldF9yZW1vdmVfY2J8LiAqLwotT1BFTlNTTF9FWFBPUlQgdm9pZCAoKlNTTF9DVFhfc2Vzc19nZXRfcmVtb3ZlX2NiKFNTTF9DVFggKmN0eCkpKAotICAgIFNTTF9DVFggKmN0eCwgU1NMX1NFU1NJT04gKnNlc3Npb24pOwotCi0vKiBTU0xfQ1RYX3Nlc3Nfc2V0X2dldF9jYiBzZXRzIGEgY2FsbGJhY2sgdG8gbG9vayB1cCBhIHNlc3Npb24gYnkgSUQgZm9yIGEKLSAqIHNlcnZlci4gVGhlIGNhbGxiYWNrIGlzIHBhc3NlZCB0aGUgc2Vzc2lvbiBJRCBhbmQgc2hvdWxkIHJldHVybiBhIG1hdGNoaW5nCi0gKiB8U1NMX1NFU1NJT058IG9yIE5VTEwgaWYgbm90IGZvdW5kLiBJdCBzaG91bGQgc2V0IHwqb3V0X2NvcHl8IHRvIHplcm8gYW5kCi0gKiByZXR1cm4gYSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBzZXNzaW9uLiBUaGlzIGNhbGxiYWNrIGlzIG5vdCB1c2VkIGZvciBhCi0gKiBjbGllbnQuCi0gKgotICogRm9yIGhpc3RvcmljYWwgcmVhc29ucywgaWYgfCpvdXRfY29weXwgaXMgc2V0IHRvIG9uZSAoZGVmYXVsdCksIHRoZSBTU0wKLSAqIGxpYnJhcnkgd2lsbCB0YWtlIGEgbmV3IHJlZmVyZW5jZSB0byB0aGUgcmV0dXJuZWQgfFNTTF9TRVNTSU9OfCwgZXhwZWN0aW5nCi0gKiB0aGUgY2FsbGJhY2sgdG8gcmV0dXJuIGEgbm9uLW93bmluZyBwb2ludGVyLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZC4gSWYKLSAqIHxjdHh8IGFuZCB0aHVzIHRoZSBjYWxsYmFjayBpcyB1c2VkIG9uIG11bHRpcGxlIHRocmVhZHMsIHRoZSBzZXNzaW9uIG1heSBiZQotICogcmVtb3ZlZCBhbmQgaW52YWxpZGF0ZWQgYmVmb3JlIHRoZSBTU0wgbGlicmFyeSBjYWxscyB8U1NMX1NFU1NJT05fdXBfcmVmfCwKLSAqIHdoZXJlYXMgdGhlIGNhbGxiYWNrIG1heSBzeW5jaHJvbml6ZSBpbnRlcm5hbGx5LgotICoKLSAqIFRvIGxvb2sgdXAgYSBzZXNzaW9uIGFzeW5jaHJvbm91c2x5LCB0aGUgY2FsbGJhY2sgbWF5IHJldHVybgotICogfFNTTF9tYWdpY19wZW5kaW5nX3Nlc3Npb25fcHRyfC4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGF0IGZ1bmN0aW9uIGFuZAotICogfFNTTF9FUlJPUl9QRU5ESU5HX1NFU1NJT058LgotICoKLSAqIElmIHRoZSBpbnRlcm5hbCBzZXNzaW9uIGNhY2hlIGlzIGVuYWJsZWQsIHRoZSBjYWxsYmFjayBpcyBvbmx5IGNvbnN1bHRlZCBpZgotICogdGhlIGludGVybmFsIGNhY2hlIGRvZXMgbm90IHJldHVybiBhIG1hdGNoLiAqLwotT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfQ1RYX3Nlc3Nfc2V0X2dldF9jYigKLSAgICBTU0xfQ1RYICpjdHgsCi0gICAgU1NMX1NFU1NJT04gKigqZ2V0X3Nlc3Npb25fY2IpKFNTTCAqc3NsLCB1aW50OF90ICppZCwgaW50IGlkX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpvdXRfY29weSkpOwotCi0vKiBTU0xfQ1RYX3Nlc3NfZ2V0X2dldF9jYiByZXR1cm5zIHRoZSBjYWxsYmFjayBzZXQgYnkKLSAqIHxTU0xfQ1RYX3Nlc3Nfc2V0X2dldF9jYnwuICovCi1PUEVOU1NMX0VYUE9SVCBTU0xfU0VTU0lPTiAqKCpTU0xfQ1RYX3Nlc3NfZ2V0X2dldF9jYihTU0xfQ1RYICpjdHgpKSgKLSAgICBTU0wgKnNzbCwgdWludDhfdCAqaWQsIGludCBpZF9sZW4sIGludCAqb3V0X2NvcHkpOwotCi0vKiBTU0xfbWFnaWNfcGVuZGluZ19zZXNzaW9uX3B0ciByZXR1cm5zIGEgbWFnaWMgfFNTTF9TRVNTSU9OfCogd2hpY2ggaW5kaWNhdGVzCi0gKiB0aGF0IHRoZSBzZXNzaW9uIGlzbid0IGN1cnJlbnRseSB1bmF2YWlsYWJsZS4gfFNTTF9nZXRfZXJyb3J8IHdpbGwgdGhlbgotICogcmV0dXJuIHxTU0xfRVJST1JfUEVORElOR19TRVNTSU9OfCBhbmQgdGhlIGhhbmRzaGFrZSBjYW4gYmUgcmV0cmllZCBsYXRlcgotICogd2hlbiB0aGUgbG9va3VwIGhhcyBjb21wbGV0ZWQuICovCi1PUEVOU1NMX0VYUE9SVCBTU0xfU0VTU0lPTiAqU1NMX21hZ2ljX3BlbmRpbmdfc2Vzc2lvbl9wdHIodm9pZCk7Ci0KLS8qIEdFTl9TRVNTSU9OX0NCIGlzIGEgY2FsbGJhY2sgdG8gZ2VuZXJhdGUgc2Vzc2lvbiBJRHMgZm9yIHxzc2x8LiBJdCByZXR1cm5zCi0gKiBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gT24gc3VjY2VzcywgdGhlIGdlbmVyYXRlZCBJRCBpcyB3cml0dGVuIHRvCi0gKiB8aWR8IGFuZCB8KmlkX2xlbnwgc2V0IHRvIHRoZSBsZW5ndGguIE9uIGVudHJ5LCB8KmlkX2xlbnwgaXMgdGhlIG1heGltdW0KLSAqIGxlbmd0aCBvZiB0aGUgSUQsIGJ1dCB0aGUgY2FsbGJhY2sgbWF5IHNob3J0ZW4gaXQgaWYgZGVzaXJlZC4gSXQgaXMgYW4gZXJyb3IKLSAqIGZvciB0aGUgY2FsbGJhY2sgdG8gc2V0IHRoZSBzaXplIHRvIHplcm8uCi0gKgotICogQ2FsbGJhY2tzIG1heSB1c2UgfFNTTF9oYXNfbWF0Y2hpbmdfc2Vzc2lvbl9pZHwgdG8gY2hlY2sgdGhhdCB0aGUgZ2VuZXJhdGVkCi0gKiBJRCBpcyB1bmlxdWUuICovCi10eXBlZGVmIGludCAoKkdFTl9TRVNTSU9OX0NCKShjb25zdCBTU0wgKnNzbCwgdWludDhfdCAqaWQsIHVuc2lnbmVkICppZF9sZW4pOwotCi0vKiBTU0xfQ1RYX3NldF9nZW5lcmF0ZV9zZXNzaW9uX2lkIHNldHMgdGhlIHNlc3Npb24gSUQgY2FsbGJhY2sgb2YgfGN0eHwgdG8KLSAqIHxjYnwgYW5kIHJldHVybnMgb25lLiBJdCB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgc2VydmVyIHdoZW4gZXN0YWJsaXNoaW5nIGEgbmV3Ci0gKiBzZXNzaW9uLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfc2V0X2dlbmVyYXRlX3Nlc3Npb25faWQoU1NMX0NUWCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VOX1NFU1NJT05fQ0IgY2IpOwotCi0vKiBTU0xfc2V0X2dlbmVyYXRlX3Nlc3Npb25faWQgc2V0cyB0aGUgc2Vzc2lvbiBJRCBjYWxsYmFjayBvZiB8c3NsfCB0byB8Y2J8IGFuZAotICogcmV0dXJucyBvbmUuIEl0IHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBzZXJ2ZXIgd2hlbiBlc3RhYmxpc2hpbmcgYSBuZXcKLSAqIHNlc3Npb24uICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3NldF9nZW5lcmF0ZV9zZXNzaW9uX2lkKFNTTCAqc3NsLCBHRU5fU0VTU0lPTl9DQiBjYik7Ci0KLS8qIFNTTF9oYXNfbWF0Y2hpbmdfc2Vzc2lvbl9pZCByZXR1cm5zIG9uZSBpZiB8c3NsfCdzIHNlc3Npb24gY2FjaGUgaGFzIGEKLSAqIHNlc3Npb24gb2YgdmFsdWUgfGlkfCBhbmQgemVybyBvdGhlcndpc2UuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX2hhc19tYXRjaGluZ19zZXNzaW9uX2lkKGNvbnN0IFNTTCAqc3NsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaWRfbGVuKTsKLQotCi0vKiBTZXNzaW9uIHRpY2tldHMuCi0gKgotICogU2Vzc2lvbiB0aWNrZXRzLCBmcm9tIFJGQyA1MDc3LCBhbGxvdyBzZXNzaW9uIHJlc3VtcHRpb24gd2l0aG91dCBzZXJ2ZXItc2lkZQotICogc3RhdGUuIFNlc3Npb24gdGlja2V0cyBhcmUgc3VwcG9ydGVkIGluIGJ5IGRlZmF1bHQgYnV0IG1heSBiZSBkaXNhYmxlZCB3aXRoCi0gKiB8U1NMX09QX05PX1RJQ0tFVHwuCi0gKgotICogT24gdGhlIGNsaWVudCwgdGlja2V0LWJhc2VkIHNlc3Npb25zIHVzZSB0aGUgc2FtZSBBUElzIGFzIElELWJhc2VkIHRpY2tldHMuCi0gKiBDYWxsZXJzIGRvIG5vdCBuZWVkIHRvIGhhbmRsZSB0aGVtIGRpZmZlcmVudGx5LgotICoKLSAqIE9uIHRoZSBzZXJ2ZXIsIHRpY2tldHMgYXJlIGVuY3J5cHRlZCBhbmQgYXV0aGVudGljYXRlZCB3aXRoIGEgc2VjcmV0IGtleS4gQnkKLSAqIGRlZmF1bHQsIGFuIHxTU0xfQ1RYfCBnZW5lcmF0ZXMgYSBrZXkgb24gY3JlYXRpb24uIFRpY2tldHMgYXJlIG1pbnRlZCBhbmQKLSAqIHByb2Nlc3NlZCB0cmFuc3BhcmVudGx5LiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtYXkgYmUgdXNlZCB0byBjb25maWd1cmUgYQotICogcGVyc2lzdGVudCBrZXkgb3IgaW1wbGVtZW50IG1vcmUgY3VzdG9tIGJlaGF2aW9yLiAqLwotCi0vKiBTU0xfQ1RYX2dldF90bHNleHRfdGlja2V0X2tleXMgd3JpdGVzIHxjdHh8J3Mgc2Vzc2lvbiB0aWNrZXQga2V5IG1hdGVyaWFsIHRvCi0gKiB8bGVufCBieXRlcyBvZiB8b3V0fC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBpZiB8bGVufCBpcyBub3QKLSAqIDQ4LiBJZiB8b3V0fCBpcyBOVUxMLCBpdCByZXR1cm5zIDQ4IGluc3RlYWQuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9nZXRfdGxzZXh0X3RpY2tldF9rZXlzKFNTTF9DVFggKmN0eCwgdm9pZCAqb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKTsKLQotLyogU1NMX0NUWF9zZXRfdGxzZXh0X3RpY2tldF9rZXlzIHNldHMgfGN0eHwncyBzZXNzaW9uIHRpY2tldCBrZXkgbWF0ZXJpYWwgdG8KLSAqIHxsZW58IGJ5dGVzIG9mIHxpbnwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gaWYgfGxlbnwgaXMgbm90Ci0gKiA0OC4gSWYgfGlufCBpcyBOVUxMLCBpdCByZXR1cm5zIDQ4IGluc3RlYWQuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9zZXRfdGxzZXh0X3RpY2tldF9rZXlzKFNTTF9DVFggKmN0eCwgY29uc3Qgdm9pZCAqaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pOwotCi0vKiBTU0xfVElDS0VUX0tFWV9OQU1FX0xFTiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBrZXkgbmFtZSBwcmVmaXggb2YgYSBzZXNzaW9uCi0gKiB0aWNrZXQuICovCi0jZGVmaW5lIFNTTF9USUNLRVRfS0VZX05BTUVfTEVOIDE2Ci0KLS8qIFNTTF9DVFhfc2V0X3Rsc2V4dF90aWNrZXRfa2V5X2NiIHNldHMgdGhlIHRpY2tldCBjYWxsYmFjayB0byB8Y2FsbGJhY2t8IGFuZAotICogcmV0dXJucyBvbmUuIHxjYWxsYmFja3wgd2lsbCBiZSBjYWxsZWQgd2hlbiBlbmNyeXB0aW5nIGEgbmV3IHRpY2tldCBhbmQgd2hlbgotICogZGVjcnlwdGluZyBhIHRpY2tldCBmcm9tIHRoZSBjbGllbnQuCi0gKgotICogSW4gYm90aCBtb2RlcywgfGN0eHwgYW5kIHxobWFjX2N0eHwgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBpbml0aWFsaXplZCB3aXRoCi0gKiB8RVZQX0NJUEhFUl9DVFhfaW5pdHwgYW5kIHxITUFDX0NUWF9pbml0fCwgcmVzcGVjdGl2ZWx5LiB8Y2FsbGJhY2t8Ci0gKiBjb25maWd1cmVzIHxobWFjX2N0eHwgd2l0aCBhbiBITUFDIGRpZ2VzdCBhbmQga2V5LCBhbmQgY29uZmlndXJlcyB8Y3R4fAotICogZm9yIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbiwgYmFzZWQgb24gdGhlIG1vZGUuCi0gKgotICogV2hlbiBlbmNyeXB0aW5nIGEgbmV3IHRpY2tldCwgfGVuY3J5cHR8IHdpbGwgYmUgb25lLiBJdCB3cml0ZXMgYSBwdWJsaWMKLSAqIDE2LWJ5dGUga2V5IG5hbWUgdG8gfGtleV9uYW1lfCBhbmQgYSBmcmVzaCBJViB0byB8aXZ8LiBUaGUgb3V0cHV0IElWIGxlbmd0aAotICogbXVzdCBtYXRjaCB8RVZQX0NJUEhFUl9DVFhfaXZfbGVuZ3RofCBvZiB0aGUgY2lwaGVyIHNlbGVjdGVkLiBJbiB0aGlzIG1vZGUsCi0gKiB8Y2FsbGJhY2t8IHJldHVybnMgMSBvbiBzdWNjZXNzIGFuZCAtMSBvbiBlcnJvci4KLSAqCi0gKiBXaGVuIGRlY3J5cHRpbmcgYSB0aWNrZXQsIHxlbmNyeXB0fCB3aWxsIGJlIHplcm8uIHxrZXlfbmFtZXwgd2lsbCBwb2ludCB0byBhCi0gKiAxNi1ieXRlIGtleSBuYW1lIGFuZCB8aXZ8IHBvaW50cyB0byBhbiBJVi4gVGhlIGxlbmd0aCBvZiB0aGUgSVYgY29uc3VtZWQgbXVzdAotICogbWF0Y2ggfEVWUF9DSVBIRVJfQ1RYX2l2X2xlbmd0aHwgb2YgdGhlIGNpcGhlciBzZWxlY3RlZC4gSW4gdGhpcyBtb2RlLAotICogfGNhbGxiYWNrfCByZXR1cm5zIC0xIHRvIGFib3J0IHRoZSBoYW5kc2hha2UsIDAgaWYgZGVjcnlwdGluZyB0aGUgdGlja2V0Ci0gKiBmYWlsZWQsIGFuZCAxIG9yIDIgb24gc3VjY2Vzcy4gSWYgaXQgcmV0dXJucyAyLCB0aGUgdGlja2V0IHdpbGwgYmUgcmVuZXdlZC4KLSAqIFRoaXMgbWF5IGJlIHVzZWQgdG8gcmUta2V5IHRoZSB0aWNrZXQuCi0gKgotICogV0FSTklORzogfGNhbGxiYWNrfCB3aWxkbHkgYnJlYWtzIHRoZSB1c3VhbCByZXR1cm4gdmFsdWUgY29udmVudGlvbiBhbmQgaXMKLSAqIGNhbGxlZCBpbiB0d28gZGlmZmVyZW50IG1vZGVzLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfc2V0X3Rsc2V4dF90aWNrZXRfa2V5X2NiKAotICAgIFNTTF9DVFggKmN0eCwgaW50ICgqY2FsbGJhY2spKFNTTCAqc3NsLCB1aW50OF90ICprZXlfbmFtZSwgdWludDhfdCAqaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX0NJUEhFUl9DVFggKmN0eCwgSE1BQ19DVFggKmhtYWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmNyeXB0KSk7Ci0KLQotLyogRWxsaXB0aWMgY3VydmUgRGlmZmllLUhlbGxtYW4uCi0gKgotICogQ2lwaGVyIHN1aXRlcyB1c2luZyBhbiBFQ0RIRSBrZXkgZXhjaGFuZ2UgcGVyZm9ybSBEaWZmaWUtSGVsbG1hbiBvdmVyIGFuCi0gKiBlbGxpcHRpYyBjdXJ2ZSBuZWdvdGlhdGVkIGJ5IGJvdGggZW5kcG9pbnRzLiBTZWUgUkZDIDQ0OTIuIE9ubHkgbmFtZWQgY3VydmVzCi0gKiBhcmUgc3VwcG9ydGVkLiBFQ0RIRSBpcyBhbHdheXMgZW5hYmxlZCwgYnV0IHRoZSBjdXJ2ZSBwcmVmZXJlbmNlcyBtYXkgYmUKLSAqIGNvbmZpZ3VyZWQgd2l0aCB0aGVzZSBmdW5jdGlvbnMuCi0gKgotICogQSBjbGllbnQgbWF5IHVzZSB8U1NMX1NFU1NJT05fZ2V0X2tleV9leGNoYW5nZV9pbmZvfCB0byBkZXRlcm1pbmUgdGhlIGN1cnZlCi0gKiBzZWxlY3RlZC4gKi8KLQotLyogU1NMX0NUWF9zZXQxX2N1cnZlcyBzZXRzIHRoZSBwcmVmZXJyZWQgY3VydmVzIGZvciB8Y3R4fCB0byBiZSB8Y3VydmVzfC4gRWFjaAotICogZWxlbWVudCBvZiB8Y3VydmVzfCBzaG91bGQgYmUgYSBjdXJ2ZSBuaWQuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kCi0gKiB6ZXJvIG9uIGZhaWx1cmUuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9zZXQxX2N1cnZlcyhTU0xfQ1RYICpjdHgsIGNvbnN0IGludCAqY3VydmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGN1cnZlc19sZW4pOwotCi0vKiBTU0xfc2V0MV9jdXJ2ZXMgc2V0cyB0aGUgcHJlZmVycmVkIGN1cnZlcyBmb3IgfHNzbHwgdG8gYmUgfGN1cnZlc3wuIEVhY2gKLSAqIGVsZW1lbnQgb2YgfGN1cnZlc3wgc2hvdWxkIGJlIGEgY3VydmUgbmlkLiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZAotICogemVybyBvbiBmYWlsdXJlLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9zZXQxX2N1cnZlcyhTU0wgKnNzbCwgY29uc3QgaW50ICpjdXJ2ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjdXJ2ZXNfbGVuKTsKLQotLyogU1NMX0NUWF9zZXRfdG1wX2VjZGggY29uZmlndXJlcyB8Y3R4fCB0byB1c2UgdGhlIGN1cnZlIGZyb20gfGVjZGh8IGFzIHRoZQotICogY3VydmUgZm9yIGVwaGVtZXJhbCBFQ0RIIGtleXMuIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHRoaXMgQVBJIGV4cGVjdHMgYW4KLSAqIHxFQ19LRVl8LCBidXQgb25seSB0aGUgY3VydmUgaXMgdXNlZC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbgotICogZXJyb3IuIElmIHVuc2V0LCBhbiBhcHByb3ByaWF0ZSBjdXJ2ZSB3aWxsIGJlIGNob3NlbiBiYXNlZCBvbiBjdXJ2ZQotICogcHJlZmVyZW5jZXMuIChUaGlzIGlzIHJlY29tbWVuZGVkLikgKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3NldF90bXBfZWNkaChTU0xfQ1RYICpjdHgsIGNvbnN0IEVDX0tFWSAqZWNfa2V5KTsKLQotLyogU1NMX3NldF90bXBfZWNkaCBjb25maWd1cmVzIHxzc2x8IHRvIHVzZSB0aGUgY3VydmUgZnJvbSB8ZWNkaHwgYXMgdGhlIGN1cnZlCi0gKiBmb3IgZXBoZW1lcmFsIEVDREgga2V5cy4gRm9yIGhpc3RvcmljYWwgcmVhc29ucywgdGhpcyBBUEkgZXhwZWN0cyBhbgotICogfEVDX0tFWXwsIGJ1dCBvbmx5IHRoZSBjdXJ2ZSBpcyB1c2VkLiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uCi0gKiBlcnJvci4gSWYgdW5zZXQsIGFuIGFwcHJvcHJpYXRlIGN1cnZlIHdpbGwgYmUgY2hvc2VuIGJhc2VkIG9uIGN1cnZlCi0gKiBwcmVmZXJlbmNlcy4gKFRoaXMgaXMgcmVjb21tZW5kZWQuKSAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9zZXRfdG1wX2VjZGgoU1NMICpzc2wsIGNvbnN0IEVDX0tFWSAqZWNfa2V5KTsKLQotLyogU1NMX0NUWF9zZXRfdG1wX2VjZGhfY2FsbGJhY2sgY29uZmlndXJlcyB8Y3R4fCB0byB1c2UgfGNhbGxiYWNrfCB0byBkZXRlcm1pbmUKLSAqIHRoZSBjdXJ2ZSBmb3IgZXBoZW1lcmFsIEVDREgga2V5cy4gfGNhbGxiYWNrfCBzaG91bGQgaWdub3JlIHxpc19leHBvcnR8IGFuZAotICogfGtleWxlbmd0aHwgYW5kIHJldHVybiBhbiB8RUNfS0VZfCBvZiB0aGUgc2VsZWN0ZWQgY3VydmUgb3IgTlVMTCBvbgotICogZXJyb3IuIE9ubHkgdGhlIGN1cnZlIGlzIHVzZWQsIHNvIHRoZSB8RUNfS0VZfCBuZWVkbid0IGhhdmUgYSBnZW5lcmF0ZWQKLSAqIGtleXBhaXIuCi0gKgotICogSWYgdGhlIGNhbGxiYWNrIGlzIHVuc2V0LCBhbiBhcHByb3ByaWF0ZSBjdXJ2ZSB3aWxsIGJlIGNob3NlbiBiYXNlZCBvbiBjdXJ2ZQotICogcHJlZmVyZW5jZXMuIChUaGlzIGlzIHJlY29tbWVuZGVkLikKLSAqCi0gKiBXQVJOSU5HOiBUaGUgY2FsbGVyIGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZSByZXN1bHRpbmcgfEVDX0tFWXwsIHNvCi0gKiB8Y2FsbGJhY2t8IG11c3Qgc2F2ZSBhbmQgcmVsZWFzZSB0aGUgb2JqZWN0IGVsc2V3aGVyZS4gKi8KLU9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX0NUWF9zZXRfdG1wX2VjZGhfY2FsbGJhY2soCi0gICAgU1NMX0NUWCAqY3R4LCBFQ19LRVkgKigqY2FsbGJhY2spKFNTTCAqc3NsLCBpbnQgaXNfZXhwb3J0LCBpbnQga2V5bGVuZ3RoKSk7Ci0KLS8qIFNTTF9zZXRfdG1wX2VjZGhfY2FsbGJhY2sgY29uZmlndXJlcyB8c3NsfCB0byB1c2UgfGNhbGxiYWNrfCB0byBkZXRlcm1pbmUgdGhlCi0gKiBjdXJ2ZSBmb3IgZXBoZW1lcmFsIEVDREgga2V5cy4gfGNhbGxiYWNrfCBzaG91bGQgaWdub3JlIHxpc19leHBvcnR8IGFuZAotICogfGtleWxlbmd0aHwgYW5kIHJldHVybiBhbiB8RUNfS0VZfCBvZiB0aGUgc2VsZWN0ZWQgY3VydmUgb3IgTlVMTCBvbgotICogZXJyb3IuIE9ubHkgdGhlIGN1cnZlIGlzIHVzZWQsIHNvIHRoZSB8RUNfS0VZfCBuZWVkbid0IGhhdmUgYSBnZW5lcmF0ZWQKLSAqIGtleXBhaXIuCi0gKgotICogSWYgdGhlIGNhbGxiYWNrIGlzIHVuc2V0LCBhbiBhcHByb3ByaWF0ZSBjdXJ2ZSB3aWxsIGJlIGNob3NlbiBiYXNlZCBvbiBjdXJ2ZQotICogcHJlZmVyZW5jZXMuIChUaGlzIGlzIHJlY29tbWVuZGVkLikKLSAqCi0gKiBXQVJOSU5HOiBUaGUgY2FsbGVyIGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZSByZXN1bHRpbmcgfEVDX0tFWXwsIHNvCi0gKiB8Y2FsbGJhY2t8IG11c3Qgc2F2ZSBhbmQgcmVsZWFzZSB0aGUgb2JqZWN0IGVsc2V3aGVyZS4gKi8KLU9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX3NldF90bXBfZWNkaF9jYWxsYmFjaygKLSAgICBTU0wgKnNzbCwgRUNfS0VZICooKmNhbGxiYWNrKShTU0wgKnNzbCwgaW50IGlzX2V4cG9ydCwgaW50IGtleWxlbmd0aCkpOwotCi0vKiBTU0xfZ2V0X2N1cnZlX25hbWUgcmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIG5hbWUgZm9yIHRoZSBlbGxpcHRpYyBjdXJ2ZQotICogc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBUTFMgY3VydmUgaWQsIG9yIE5VTEwgaWYgdGhlIGN1cnZlIGlmIHVua25vd24uICovCi1PUEVOU1NMX0VYUE9SVCBjb25zdCBjaGFyICpTU0xfZ2V0X2N1cnZlX25hbWUodWludDE2X3QgY3VydmVfaWQpOwotCi0KLS8qIE11bHRpcGxpY2F0aXZlIERpZmZpZS1IZWxsbWFuLgotICoKLSAqIENpcGhlciBzdWl0ZXMgdXNpbmcgYSBESEUga2V5IGV4Y2hhbmdlIHBlcmZvcm0gRGlmZmllLUhlbGxtYW4gb3ZlciBhCi0gKiBtdWx0aXBsaWNhdGl2ZSBncm91cCBzZWxlY3RlZCBieSB0aGUgc2VydmVyLiBUaGVzZSBjaXBoZXJzIGFyZSBkaXNhYmxlZCBmb3IgYQotICogc2VydmVyIHVubGVzcyBhIGdyb3VwIGlzIGNob3NlbiB3aXRoIG9uZSBvZiB0aGVzZSBmdW5jdGlvbnMuCi0gKgotICogQSBjbGllbnQgbWF5IHVzZSB8U1NMX1NFU1NJT05fZ2V0X2tleV9leGNoYW5nZV9pbmZvfCB0byBkZXRlcm1pbmUgdGhlIHNpemUgb2YKLSAqIHRoZSBzZWxlY3RlZCBncm91cCdzIHByaW1lLCBidXQgbm90ZSB0aGF0IHNlcnZlcnMgbWF5IHNlbGVjdCBkZWdlbmVyYXRlCi0gKiBncm91cHMuICovCi0KLS8qIFNTTF9DVFhfc2V0X3RtcF9kaCBjb25maWd1cmVzIHxjdHh8IHRvIHVzZSB0aGUgZ3JvdXAgZnJvbSB8ZGh8IGFzIHRoZSBncm91cAotICogZm9yIERIRS4gT25seSB0aGUgZ3JvdXAgaXMgdXNlZCwgc28gfGRofCBuZWVkbid0IGhhdmUgYSBrZXlwYWlyLiBJdCByZXR1cm5zCi0gKiBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3NldF90bXBfZGgoU1NMX0NUWCAqY3R4LCBjb25zdCBESCAqZGgpOwotCi0vKiBTU0xfc2V0X3RtcF9kaCBjb25maWd1cmVzIHxzc2x8IHRvIHVzZSB0aGUgZ3JvdXAgZnJvbSB8ZGh8IGFzIHRoZSBncm91cCBmb3IKLSAqIERIRS4gT25seSB0aGUgZ3JvdXAgaXMgdXNlZCwgc28gfGRofCBuZWVkbid0IGhhdmUgYSBrZXlwYWlyLiBJdCByZXR1cm5zIG9uZQotICogb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfc2V0X3RtcF9kaChTU0wgKnNzbCwgY29uc3QgREggKmRoKTsKLQotLyogU1NMX0NUWF9zZXRfdG1wX2RoX2NhbGxiYWNrIGNvbmZpZ3VyZXMgfGN0eHwgdG8gdXNlIHxjYWxsYmFja3wgdG8gZGV0ZXJtaW5lCi0gKiB0aGUgZ3JvdXAgZm9yIERIRSBjaXBoZXJzLiB8Y2FsbGJhY2t8IHNob3VsZCBpZ25vcmUgfGlzX2V4cG9ydHwgYW5kCi0gKiB8a2V5bGVuZ3RofCBhbmQgcmV0dXJuIGEgfERIfCBvZiB0aGUgc2VsZWN0ZWQgZ3JvdXAgb3IgTlVMTCBvbiBlcnJvci4gT25seQotICogdGhlIHBhcmFtZXRlcnMgYXJlIHVzZWQsIHNvIHRoZSB8REh8IG5lZWRuJ3QgaGF2ZSBhIGdlbmVyYXRlZCBrZXlwYWlyLgotICoKLSAqIFdBUk5JTkc6IFRoZSBjYWxsZXIgZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIHJlc3VsdGluZyB8REh8LCBzbwotICogfGNhbGxiYWNrfCBtdXN0IHNhdmUgYW5kIHJlbGVhc2UgdGhlIG9iamVjdCBlbHNld2hlcmUuICovCi1PUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2V0X3RtcF9kaF9jYWxsYmFjaygKLSAgICBTU0xfQ1RYICpjdHgsIERIICooKmNhbGxiYWNrKShTU0wgKnNzbCwgaW50IGlzX2V4cG9ydCwgaW50IGtleWxlbmd0aCkpOwotCi0vKiBTU0xfc2V0X3RtcF9kaF9jYWxsYmFjayBjb25maWd1cmVzIHxzc2x8IHRvIHVzZSB8Y2FsbGJhY2t8IHRvIGRldGVybWluZSB0aGUKLSAqIGdyb3VwIGZvciBESEUgY2lwaGVycy4gfGNhbGxiYWNrfCBzaG91bGQgaWdub3JlIHxpc19leHBvcnR8IGFuZCB8a2V5bGVuZ3RofAotICogYW5kIHJldHVybiBhIHxESHwgb2YgdGhlIHNlbGVjdGVkIGdyb3VwIG9yIE5VTEwgb24gZXJyb3IuIE9ubHkgdGhlCi0gKiBwYXJhbWV0ZXJzIGFyZSB1c2VkLCBzbyB0aGUgfERIfCBuZWVkbid0IGhhdmUgYSBnZW5lcmF0ZWQga2V5cGFpci4KLSAqCi0gKiBXQVJOSU5HOiBUaGUgY2FsbGVyIGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZSByZXN1bHRpbmcgfERIfCwgc28KLSAqIHxjYWxsYmFja3wgbXVzdCBzYXZlIGFuZCByZWxlYXNlIHRoZSBvYmplY3QgZWxzZXdoZXJlLiAqLwotT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfc2V0X3RtcF9kaF9jYWxsYmFjayhTU0wgKnNzbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREggKigqZGgpKFNTTCAqc3NsLCBpbnQgaXNfZXhwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleWxlbmd0aCkpOwotCi0KLS8qIENlcnRpZmljYXRlIHZlcmlmaWNhdGlvbi4KLSAqCi0gKiBTU0wgbWF5IGF1dGhlbnRpY2F0ZSBlaXRoZXIgZW5kcG9pbnQgd2l0aCBhbiBYLjUwOSBjZXJ0aWZpY2F0ZS4gVHlwaWNhbGx5Ci0gKiB0aGlzIGlzIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoZSBzZXJ2ZXIgdG8gdGhlIGNsaWVudC4gVGhlc2UgZnVuY3Rpb25zCi0gKiBjb25maWd1cmUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uLgotICoKLSAqIFdBUk5JTkc6IEJ5IGRlZmF1bHQsIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBlcnJvcnMgb24gYSBjbGllbnQgYXJlIG5vdAotICogZmF0YWwuIFNlZSB8U1NMX1ZFUklGWV9OT05FfCBUaGlzIG1heSBiZSBjb25maWd1cmVkIHdpdGgKLSAqIHxTU0xfQ1RYX3NldF92ZXJpZnl8LgotICoKLSAqIEJ5IGRlZmF1bHQgY2xpZW50cyBhcmUgYW5vbnltb3VzIGJ1dCBhIHNlcnZlciBtYXkgcmVxdWVzdCBhIGNlcnRpZmljYXRlIGZyb20KLSAqIHRoZSBjbGllbnQgYnkgc2V0dGluZyB8U1NMX1ZFUklGWV9QRUVSfC4KLSAqCi0gKiBNYW55IG9mIHRoZXNlIGZ1bmN0aW9ucyB1c2UgT3BlblNTTCdzIGxlZ2FjeSBYLjUwOSBzdGFjayB3aGljaCBpcwotICogdW5kZXJkb2N1bWVudGVkIGFuZCBkZXByZWNhdGVkLCBidXQgdGhlIHJlcGxhY2VtZW50IGlzbid0IHJlYWR5IHlldC4gRm9yCi0gKiBub3csIGNvbnN1bWVycyBtYXkgdXNlIHRoZSBleGlzdGluZyBzdGFjayBvciBieXBhc3MgaXQgYnkgcGVyZm9ybWluZwotICogY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGV4dGVybmFsbHkuIFRoaXMgbWF5IGJlIGRvbmUgd2l0aAotICogfFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrfCBvciBieSBleHRyYWN0aW5nIHRoZSBjaGFpbiB3aXRoCi0gKiB8U1NMX2dldF9wZWVyX2NlcnRfY2hhaW58IGFmdGVyIHRoZSBoYW5kc2hha2UuIEluIHRoZSBmdXR1cmUsIGZ1bmN0aW9ucyB3aWxsCi0gKiBiZSBhZGRlZCB0byB1c2UgdGhlIFNTTCBzdGFjayB3aXRob3V0IGRlcGVuZGluZyBvbiBhbnkgcGFydCBvZiB0aGUgbGVnYWN5Ci0gKiBYLjUwOSBhbmQgQVNOLjEgc3RhY2suICovCi0KLS8qIFNTTF9WRVJJRllfTk9ORSwgb24gYSBjbGllbnQsIHZlcmlmaWVzIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYnV0IGRvZXMgbm90Ci0gKiBtYWtlIGVycm9ycyBmYXRhbC4gVGhlIHJlc3VsdCBtYXkgYmUgY2hlY2tlZCB3aXRoIHxTU0xfZ2V0X3ZlcmlmeV9yZXN1bHR8LiBPbgotICogYSBzZXJ2ZXIgaXQgZG9lcyBub3QgcmVxdWVzdCBhIGNsaWVudCBjZXJ0aWZpY2F0ZS4gVGhpcyBpcyB0aGUgZGVmYXVsdC4gKi8KLSNkZWZpbmUgU1NMX1ZFUklGWV9OT05FIDB4MDAKLQotLyogU1NMX1ZFUklGWV9QRUVSLCBvbiBhIGNsaWVudCwgbWFrZXMgc2VydmVyIGNlcnRpZmljYXRlIGVycm9ycyBmYXRhbC4gT24gYQotICogc2VydmVyIGl0IHJlcXVlc3RzIGEgY2xpZW50IGNlcnRpZmljYXRlIGFuZCBtYWtlcyBlcnJvcnMgZmF0YWwuIEhvd2V2ZXIsCi0gKiBhbm9ueW1vdXMgY2xpZW50cyBhcmUgc3RpbGwgYWxsb3dlZC4gU2VlCi0gKiB8U1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVHwuICovCi0jZGVmaW5lIFNTTF9WRVJJRllfUEVFUiAweDAxCi0KLS8qIFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQgY29uZmlndXJlcyBhIHNlcnZlciB0byByZWplY3QgY29ubmVjdGlvbnMgaWYKLSAqIHRoZSBjbGllbnQgZGVjbGluZXMgdG8gc2VuZCBhIGNlcnRpZmljYXRlLiBPdGhlcndpc2UgfFNTTF9WRVJJRllfUEVFUnwgc3RpbGwKLSAqIGFsbG93cyBhbm9ueW1vdXMgY2xpZW50cy4gKi8KLSNkZWZpbmUgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCAweDAyCi0KLS8qIFNTTF9WRVJJRllfUEVFUl9JRl9OT19PQkMgY29uZmlndXJlcyBhIHNlcnZlciB0byByZXF1ZXN0IGEgY2xpZW50IGNlcnRpZmljYXRlCi0gKiBpZiBhbmQgb25seSBpZiBDaGFubmVsIElEIGlzIG5vdCBuZWdvdGlhdGVkLiAqLwotI2RlZmluZSBTU0xfVkVSSUZZX1BFRVJfSUZfTk9fT0JDIDB4MDQKLQotLyogU1NMX0NUWF9zZXRfdmVyaWZ5IGNvbmZpZ3VyZXMgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGJlaGF2aW9yLiB8bW9kZXwgaXMKLSAqIG9uZSBvZiB0aGUgfFNTTF9WRVJJRllfKnwgdmFsdWVzIGRlZmluZWQgYWJvdmUuIHxjYWxsYmFja3wsIGlmIG5vdCBOVUxMLCBpcwotICogdXNlZCB0byBjdXN0b21pemUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uLiBTZWUgdGhlIGJlaGF2aW9yIG9mCi0gKiB8WDUwOV9TVE9SRV9DVFhfc2V0X3ZlcmlmeV9jYnwuCi0gKgotICogVGhlIGNhbGxiYWNrIG1heSB1c2UgfFNTTF9nZXRfZXhfZGF0YV9YNTA5X1NUT1JFX0NUWF9pZHh8IHdpdGgKLSAqIHxYNTA5X1NUT1JFX0NUWF9nZXRfZXhfZGF0YXwgdG8gbG9vayB1cCB0aGUgfFNTTHwgZnJvbSB8c3RvcmVfY3R4fC4gKi8KLU9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX0NUWF9zZXRfdmVyaWZ5KAotICAgIFNTTF9DVFggKmN0eCwgaW50IG1vZGUsIGludCAoKmNhbGxiYWNrKShpbnQgb2ssIFg1MDlfU1RPUkVfQ1RYICpzdG9yZV9jdHgpKTsKLQotLyogU1NMX3NldF92ZXJpZnkgY29uZmlndXJlcyBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gYmVoYXZpb3IuIHxtb2RlfCBpcyBvbmUgb2YKLSAqIHRoZSB8U1NMX1ZFUklGWV8qfCB2YWx1ZXMgZGVmaW5lZCBhYm92ZS4gfGNhbGxiYWNrfCwgaWYgbm90IE5VTEwsIGlzIHVzZWQgdG8KLSAqIGN1c3RvbWl6ZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24uIFNlZSB0aGUgYmVoYXZpb3Igb2YKLSAqIHxYNTA5X1NUT1JFX0NUWF9zZXRfdmVyaWZ5X2NifC4KLSAqCi0gKiBUaGUgY2FsbGJhY2sgbWF5IHVzZSB8U1NMX2dldF9leF9kYXRhX1g1MDlfU1RPUkVfQ1RYX2lkeHwgd2l0aAotICogfFg1MDlfU1RPUkVfQ1RYX2dldF9leF9kYXRhfCB0byBsb29rIHVwIHRoZSB8U1NMfCBmcm9tIHxzdG9yZV9jdHh8LiAqLwotT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfc2V0X3ZlcmlmeShTU0wgKnNzbCwgaW50IG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmNhbGxiYWNrKShpbnQgb2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYNTA5X1NUT1JFX0NUWCAqc3RvcmVfY3R4KSk7Ci0KLS8qIFNTTF9DVFhfZ2V0X3ZlcmlmeV9tb2RlIHJldHVybnMgfGN0eHwncyB2ZXJpZnkgbW9kZSwgc2V0IGJ5Ci0gKiB8U1NMX0NUWF9zZXRfdmVyaWZ5fC4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX2dldF92ZXJpZnlfbW9kZShjb25zdCBTU0xfQ1RYICpjdHgpOwotCi0vKiBTU0xfZ2V0X3ZlcmlmeV9tb2RlIHJldHVybnMgfHNzbHwncyB2ZXJpZnkgbW9kZSwgc2V0IGJ5IHxTU0xfQ1RYX3NldF92ZXJpZnl8Ci0gKiBvciB8U1NMX3NldF92ZXJpZnl8LiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9nZXRfdmVyaWZ5X21vZGUoY29uc3QgU1NMICpzc2wpOwotCi0vKiBTU0xfQ1RYX2dldF92ZXJpZnlfY2FsbGJhY2sgcmV0dXJucyB0aGUgY2FsbGJhY2sgc2V0IGJ5Ci0gKiB8U1NMX0NUWF9zZXRfdmVyaWZ5fC4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCAoKlNTTF9DVFhfZ2V0X3ZlcmlmeV9jYWxsYmFjayhjb25zdCBTU0xfQ1RYICpjdHgpKSgKLSAgICBpbnQgb2ssIFg1MDlfU1RPUkVfQ1RYICpzdG9yZV9jdHgpOwotCi0vKiBTU0xfZ2V0X3ZlcmlmeV9jYWxsYmFjayByZXR1cm5zIHRoZSBjYWxsYmFjayBzZXQgYnkgfFNTTF9DVFhfc2V0X3ZlcmlmeXwgb3IKLSAqIHxTU0xfc2V0X3ZlcmlmeXwuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgKCpTU0xfZ2V0X3ZlcmlmeV9jYWxsYmFjayhjb25zdCBTU0wgKnNzbCkpKAotICAgIGludCBvaywgWDUwOV9TVE9SRV9DVFggKnN0b3JlX2N0eCk7Ci0KLS8qIFNTTF9DVFhfc2V0X3ZlcmlmeV9kZXB0aCBzZXRzIHRoZSBtYXhpbXVtIGRlcHRoIG9mIGEgY2VydGlmaWNhdGUgY2hhaW4KLSAqIGFjY2VwdGVkIGluIHZlcmlmaWNhdGlvbi4gVGhpcyBudW1iZXIgZG9lcyBub3QgaW5jbHVkZSB0aGUgbGVhZiwgc28gYSBkZXB0aAotICogb2YgMSBhbGxvd3MgdGhlIGxlYWYgYW5kIG9uZSBDQSBjZXJ0aWZpY2F0ZS4gKi8KLU9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX0NUWF9zZXRfdmVyaWZ5X2RlcHRoKFNTTF9DVFggKmN0eCwgaW50IGRlcHRoKTsKLQotLyogU1NMX3NldF92ZXJpZnlfZGVwdGggc2V0cyB0aGUgbWF4aW11bSBkZXB0aCBvZiBhIGNlcnRpZmljYXRlIGNoYWluIGFjY2VwdGVkCi0gKiBpbiB2ZXJpZmljYXRpb24uIFRoaXMgbnVtYmVyIGRvZXMgbm90IGluY2x1ZGUgdGhlIGxlYWYsIHNvIGEgZGVwdGggb2YgMQotICogYWxsb3dzIHRoZSBsZWFmIGFuZCBvbmUgQ0EgY2VydGlmaWNhdGUuICovCi1PUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9zZXRfdmVyaWZ5X2RlcHRoKFNTTCAqc3NsLCBpbnQgZGVwdGgpOwotCi0vKiBTU0xfQ1RYX2dldF92ZXJpZnlfZGVwdGggcmV0dXJucyB0aGUgbWF4aW11bSBkZXB0aCBvZiBhIGNlcnRpZmljYXRlIGFjY2VwdGVkCi0gKiBpbiB2ZXJpZmljYXRpb24uICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9nZXRfdmVyaWZ5X2RlcHRoKGNvbnN0IFNTTF9DVFggKmN0eCk7Ci0KLS8qIFNTTF9nZXRfdmVyaWZ5X2RlcHRoIHJldHVybnMgdGhlIG1heGltdW0gZGVwdGggb2YgYSBjZXJ0aWZpY2F0ZSBhY2NlcHRlZCBpbgotICogdmVyaWZpY2F0aW9uLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9nZXRfdmVyaWZ5X2RlcHRoKGNvbnN0IFNTTCAqc3NsKTsKLQotLyogU1NMX0NUWF9zZXQxX3BhcmFtIHNldHMgdmVyaWZpY2F0aW9uIHBhcmFtZXRlcnMgZnJvbSB8cGFyYW18LiBJdCByZXR1cm5zIG9uZQotICogb24gc3VjY2VzcyBhbmQgemVybyBvbiBmYWlsdXJlLiBUaGUgY2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mIHxwYXJhbXwuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9zZXQxX3BhcmFtKFNTTF9DVFggKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtKTsKLQotLyogU1NMX3NldDFfcGFyYW0gc2V0cyB2ZXJpZmljYXRpb24gcGFyYW1ldGVycyBmcm9tIHxwYXJhbXwuIEl0IHJldHVybnMgb25lIG9uCi0gKiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGZhaWx1cmUuIFRoZSBjYWxsZXIgcmV0YWlucyBvd25lcnNoaXAgb2YgfHBhcmFtfC4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfc2V0MV9wYXJhbShTU0wgKnNzbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0pOwotCi0vKiBTU0xfQ1RYX2dldDBfcGFyYW0gcmV0dXJucyB8Y3R4fCdzIHxYNTA5X1ZFUklGWV9QQVJBTXwgZm9yIGNlcnRpZmljYXRlCi0gKiB2ZXJpZmljYXRpb24uIFRoZSBjYWxsZXIgbXVzdCBub3QgcmVsZWFzZSB0aGUgcmV0dXJuZWQgcG9pbnRlciBidXQgbWF5IGNhbGwKLSAqIGZ1bmN0aW9ucyBvbiBpdCB0byBjb25maWd1cmUgaXQuICovCi1PUEVOU1NMX0VYUE9SVCBYNTA5X1ZFUklGWV9QQVJBTSAqU1NMX0NUWF9nZXQwX3BhcmFtKFNTTF9DVFggKmN0eCk7Ci0KLS8qIFNTTF9nZXQwX3BhcmFtIHJldHVybnMgfHNzbHwncyB8WDUwOV9WRVJJRllfUEFSQU18IGZvciBjZXJ0aWZpY2F0ZQotICogdmVyaWZpY2F0aW9uLiBUaGUgY2FsbGVyIG11c3Qgbm90IHJlbGVhc2UgdGhlIHJldHVybmVkIHBvaW50ZXIgYnV0IG1heSBjYWxsCi0gKiBmdW5jdGlvbnMgb24gaXQgdG8gY29uZmlndXJlIGl0LiAqLwotT1BFTlNTTF9FWFBPUlQgWDUwOV9WRVJJRllfUEFSQU0gKlNTTF9nZXQwX3BhcmFtKFNTTCAqc3NsKTsKLQotLyogU1NMX0NUWF9zZXRfcHVycG9zZSBzZXRzIHxjdHh8J3MgfFg1MDlfVkVSSUZZX1BBUkFNfCdzICdwdXJwb3NlJyBwYXJhbWV0ZXIgdG8KLSAqIHxwdXJwb3NlfC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3NldF9wdXJwb3NlKFNTTF9DVFggKmN0eCwgaW50IHB1cnBvc2UpOwotCi0vKiBTU0xfc2V0X3B1cnBvc2Ugc2V0cyB8c3NsfCdzIHxYNTA5X1ZFUklGWV9QQVJBTXwncyAncHVycG9zZScgcGFyYW1ldGVyIHRvCi0gKiB8cHVycG9zZXwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZXJyb3IuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3NldF9wdXJwb3NlKFNTTCAqc3NsLCBpbnQgcHVycG9zZSk7Ci0KLS8qIFNTTF9DVFhfc2V0X3RydXN0IHNldHMgfGN0eHwncyB8WDUwOV9WRVJJRllfUEFSQU18J3MgJ3RydXN0JyBwYXJhbWV0ZXIgdG8KLSAqIHx0cnVzdHwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZXJyb3IuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9zZXRfdHJ1c3QoU1NMX0NUWCAqY3R4LCBpbnQgdHJ1c3QpOwotCi0vKiBTU0xfc2V0X3RydXN0IHNldHMgfHNzbHwncyB8WDUwOV9WRVJJRllfUEFSQU18J3MgJ3RydXN0JyBwYXJhbWV0ZXIgdG8KLSAqIHx0cnVzdHwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZXJyb3IuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3NldF90cnVzdChTU0wgKnNzbCwgaW50IHRydXN0KTsKLQotLyogU1NMX0NUWF9zZXRfY2VydF9zdG9yZSBzZXRzIHxjdHh8J3MgY2VydGlmaWNhdGUgc3RvcmUgdG8gfHN0b3JlfC4gSXQgdGFrZXMKLSAqIG93bmVyc2hpcCBvZiB8c3RvcmV8LiBUaGUgc3RvcmUgaXMgdXNlZCBmb3IgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uLgotICoKLSAqIFRoZSBzdG9yZSBpcyBhbHNvIHVzZWQgZm9yIHRoZSBhdXRvLWNoYWluaW5nIGZlYXR1cmUsIGJ1dCB0aGlzIGlzIGRlcHJlY2F0ZWQuCi0gKiBTZWUgYWxzbyB8U1NMX01PREVfTk9fQVVUT19DSEFJTnwuICovCi1PUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2V0X2NlcnRfc3RvcmUoU1NMX0NUWCAqY3R4LCBYNTA5X1NUT1JFICpzdG9yZSk7Ci0KLS8qIFNTTF9DVFhfZ2V0X2NlcnRfc3RvcmUgcmV0dXJucyB8Y3R4fCdzIGNlcnRpZmljYXRlIHN0b3JlLiAqLwotT1BFTlNTTF9FWFBPUlQgWDUwOV9TVE9SRSAqU1NMX0NUWF9nZXRfY2VydF9zdG9yZShjb25zdCBTU0xfQ1RYICpjdHgpOwotCi0vKiBTU0xfQ1RYX3NldF9kZWZhdWx0X3ZlcmlmeV9wYXRocyBsb2FkcyB0aGUgT3BlblNTTCBzeXN0ZW0tZGVmYXVsdCB0cnVzdAotICogYW5jaG9ycyBpbnRvIHxjdHh8J3Mgc3RvcmUuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZmFpbHVyZS4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3NldF9kZWZhdWx0X3ZlcmlmeV9wYXRocyhTU0xfQ1RYICpjdHgpOwotCi0vKiBTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyBsb2FkcyB0cnVzdCBhbmNob3JzIGludG8gfGN0eHwncyBzdG9yZSBmcm9tCi0gKiB8Y2FfZmlsZXwgYW5kIHxjYV9kaXJ8LCBlaXRoZXIgb2Ygd2hpY2ggbWF5IGJlIE5VTEwuIElmIHxjYV9maWxlfCBpcyBwYXNzZWQsCi0gKiBpdCBpcyBvcGVuZWQgYW5kIFBFTS1lbmNvZGVkIENBIGNlcnRpZmljYXRlcyBhcmUgcmVhZC4gSWYgfGNhX2RpcnwgaXMgcGFzc2VkLAotICogaXQgaXMgdHJlYXRlZCBhcyBhIGRpcmVjdG9yeSBpbiBPcGVuU1NMJ3MgaGFzaGVkIGRpcmVjdG9yeSBmb3JtYXQuIEl0IHJldHVybnMKLSAqIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGZhaWx1cmUuCi0gKgotICogU2VlCi0gKiBodHRwczovL3d3dy5vcGVuc3NsLm9yZy9kb2NzL21hbm1hc3Rlci9zc2wvU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMuaHRtbAotICogZm9yIGRvY3VtZW50YXRpb24gb24gdGhlIGRpcmVjdG9yeSBmb3JtYXQuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoU1NMX0NUWCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNhX2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY2FfZGlyKTsKLQotLyogU1NMX2dldF92ZXJpZnlfcmVzdWx0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24uIEl0IGlzCi0gKiBlaXRoZXIgfFg1MDlfVl9PS3wgb3IgYSB8WDUwOV9WX0VSUl8qfCB2YWx1ZS4gKi8KLU9QRU5TU0xfRVhQT1JUIGxvbmcgU1NMX2dldF92ZXJpZnlfcmVzdWx0KGNvbnN0IFNTTCAqc3NsKTsKLQotLyogU1NMX3NldF92ZXJpZnlfcmVzdWx0IG92ZXJyaWRlcyB0aGUgcmVzdWx0IG9mIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbi4gKi8KLU9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX3NldF92ZXJpZnlfcmVzdWx0KFNTTCAqc3NsLCBsb25nIHJlc3VsdCk7Ci0KLS8qIFNTTF9nZXRfZXhfZGF0YV9YNTA5X1NUT1JFX0NUWF9pZHggcmV0dXJucyB0aGUgZXhfZGF0YSBpbmRleCB1c2VkIHRvIGxvb2sgdXAKLSAqIHRoZSB8U1NMfCBhc3NvY2lhdGVkIHdpdGggYW4gfFg1MDlfU1RPUkVfQ1RYfCBpbiB0aGUgdmVyaWZ5IGNhbGxiYWNrLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9nZXRfZXhfZGF0YV9YNTA5X1NUT1JFX0NUWF9pZHgodm9pZCk7Ci0KLS8qIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrIHNldHMgYSBjdXN0b20gY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uCi0gKiBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gcmF0aGVyIHRoYW4gfFg1MDlfdmVyaWZ5X2NlcnR8LiB8c3RvcmVfY3R4fCBjb250YWlucwotICogdGhlIHZlcmlmaWNhdGlvbiBwYXJhbWV0ZXJzLiBUaGUgY2FsbGJhY2sgc2hvdWxkIHJldHVybiBvbmUgb24gc3VjY2VzcyBhbmQKLSAqIHplcm8gb24gZmF0YWwgZXJyb3IuIEl0IG1heSB1c2UgfFg1MDlfU1RPUkVfQ1RYX3NldF9lcnJvcnwgdG8gc2V0IGEKLSAqIHZlcmlmaWNhdGlvbiByZXN1bHQuCi0gKgotICogVGhlIGNhbGxiYWNrIG1heSB1c2UgZWl0aGVyIHRoZSB8YXJnfCBwYXJhbWV0ZXIgb3IKLSAqIHxTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9DVFhfaWR4fCB0byByZWNvdmVyIHRoZSBhc3NvY2lhdGVkIHxTU0x8Ci0gKiBvYmplY3QuICovCi1PUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrKAotICAgIFNTTF9DVFggKmN0eCwgaW50ICgqY2FsbGJhY2spKFg1MDlfU1RPUkVfQ1RYICpzdG9yZV9jdHgsIHZvaWQgKmFyZyksCi0gICAgdm9pZCAqYXJnKTsKLQotCi0vKiBDbGllbnQgY2VydGlmaWNhdGUgQ0EgbGlzdC4KLSAqCi0gKiBXaGVuIHJlcXVlc3RpbmcgYSBjbGllbnQgY2VydGlmaWNhdGUsIGEgc2VydmVyIG1heSBhZHZlcnRpc2UgYSBsaXN0IG9mCi0gKiBjZXJ0aWZpY2F0ZSBhdXRob3JpdGllcyB3aGljaCBhcmUgYWNjZXB0ZWQuIFRoZXNlIGZ1bmN0aW9ucyBtYXkgYmUgdXNlZCB0bwotICogY29uZmlndXJlIHRoaXMgbGlzdC4gKi8KLQotLyogU1NMX3NldF9jbGllbnRfQ0FfbGlzdCBzZXRzIHxzc2x8J3MgY2xpZW50IGNlcnRpZmljYXRlIENBIGxpc3QgdG8KLSAqIHxuYW1lX2xpc3R8LiBJdCB0YWtlcyBvd25lcnNoaXAgb2YgfG5hbWVfbGlzdHwuICovCi1PUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9zZXRfY2xpZW50X0NBX2xpc3QoU1NMICpzc2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBQ0tfT0YoWDUwOV9OQU1FKSAqbmFtZV9saXN0KTsKLQotLyogU1NMX0NUWF9zZXRfY2xpZW50X0NBX2xpc3Qgc2V0cyB8Y3R4fCdzIGNsaWVudCBjZXJ0aWZpY2F0ZSBDQSBsaXN0IHRvCi0gKiB8bmFtZV9saXN0fC4gSXQgdGFrZXMgb3duZXJzaGlwIG9mIHxuYW1lX2xpc3R8LiAqLwotT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfQ1RYX3NldF9jbGllbnRfQ0FfbGlzdChTU0xfQ1RYICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQUNLX09GKFg1MDlfTkFNRSkgKm5hbWVfbGlzdCk7Ci0KLS8qIFNTTF9nZXRfY2xpZW50X0NBX2xpc3QgcmV0dXJucyB8c3NsfCdzIGNsaWVudCBjZXJ0aWZpY2F0ZSBDQSBsaXN0LiAqLwotT1BFTlNTTF9FWFBPUlQgU1RBQ0tfT0YoWDUwOV9OQU1FKSAqU1NMX2dldF9jbGllbnRfQ0FfbGlzdChjb25zdCBTU0wgKnNzbCk7Ci0KLS8qIFNTTF9DVFhfZ2V0X2NsaWVudF9DQV9saXN0IHJldHVybnMgfGN0eHwncyBjbGllbnQgY2VydGlmaWNhdGUgQ0EgbGlzdC4gKi8KLU9QRU5TU0xfRVhQT1JUIFNUQUNLX09GKFg1MDlfTkFNRSkgKgotICAgIFNTTF9DVFhfZ2V0X2NsaWVudF9DQV9saXN0KGNvbnN0IFNTTF9DVFggKmN0eCk7Ci0KLS8qIFNTTF9hZGRfY2xpZW50X0NBIGFwcGVuZHMgfHg1MDl8J3Mgc3ViamVjdCB0byB0aGUgY2xpZW50IGNlcnRpZmljYXRlIENBIGxpc3QuCi0gKiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24gZXJyb3IuIFRoZSBjYWxsZXIgcmV0YWlucyBvd25lcnNoaXAgb2YKLSAqIHx4NTA5fC4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfYWRkX2NsaWVudF9DQShTU0wgKnNzbCwgWDUwOSAqeDUwOSk7Ci0KLS8qIFNTTF9DVFhfYWRkX2NsaWVudF9DQSBhcHBlbmRzIHx4NTA5fCdzIHN1YmplY3QgdG8gdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZSBDQQotICogbGlzdC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciB6ZXJvIG9uIGVycm9yLiBUaGUgY2FsbGVyIHJldGFpbnMKLSAqIG93bmVyc2hpcCBvZiB8eDUwOXwuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9hZGRfY2xpZW50X0NBKFNTTF9DVFggKmN0eCwgWDUwOSAqeDUwOSk7Ci0KLS8qIFNTTF9sb2FkX2NsaWVudF9DQV9maWxlIG9wZW5zIHxmaWxlfCBhbmQgcmVhZHMgUEVNLWVuY29kZWQgY2VydGlmaWNhdGVzIGZyb20KLSAqIGl0LiBJdCByZXR1cm5zIGEgbmV3bHktYWxsb2NhdGVkIHN0YWNrIG9mIHRoZSBjZXJ0aWZpY2F0ZSBzdWJqZWN0cyBvciBOVUxMCi0gKiBvbiBlcnJvci4gKi8KLU9QRU5TU0xfRVhQT1JUIFNUQUNLX09GKFg1MDlfTkFNRSkgKlNTTF9sb2FkX2NsaWVudF9DQV9maWxlKGNvbnN0IGNoYXIgKmZpbGUpOwotCi0vKiBTU0xfZHVwX0NBX2xpc3QgbWFrZXMgYSBkZWVwIGNvcHkgb2YgfGxpc3R8LiBJdCByZXR1cm5zIHRoZSBuZXcgbGlzdCBvbgotICogc3VjY2VzcyBvciBOVUxMIG9uIGFsbG9jYXRpb24gZXJyb3IuICovCi1PUEVOU1NMX0VYUE9SVCBTVEFDS19PRihYNTA5X05BTUUpICpTU0xfZHVwX0NBX2xpc3QoU1RBQ0tfT0YoWDUwOV9OQU1FKSAqbGlzdCk7Ci0KLS8qIFNTTF9hZGRfZmlsZV9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrIGJlaGF2ZXMgbGlrZSB8U1NMX2xvYWRfY2xpZW50X0NBX2ZpbGV8Ci0gKiBidXQgYXBwZW5kcyB0aGUgcmVzdWx0IHRvIHxvdXR8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24KLSAqIGVycm9yLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9hZGRfZmlsZV9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrKFNUQUNLX09GKFg1MDlfTkFNRSkgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlKTsKLQotLyogU1NMX2FkZF9kaXJfY2VydF9zdWJqZWN0c190b19zdGFjayBsaXN0cyBmaWxlcyBpbiBkaXJlY3RvcnkgfGRpcnwuIEl0IGNhbGxzCi0gKiB8U1NMX2FkZF9maWxlX2NlcnRfc3ViamVjdHNfdG9fc3RhY2t8IG9uIGVhY2ggZmlsZSBhbmQgcmV0dXJucyBvbmUgb24gc3VjY2VzcwotICogb3IgemVybyBvbiBlcnJvci4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfYWRkX2Rpcl9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrKFNUQUNLX09GKFg1MDlfTkFNRSkgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRpcik7Ci0KLQotLyogQXBwbGljYXRpb24tbGF5ZXIgcHJvdG9jb2wgbmVnb3RhdGlvbi4KLSAqCi0gKiBUaGUgQUxQTiBleHRlbnNpb24gKFJGQyA3MzAxKSBhbGxvd3MgbmVnb3RpYXRpbmcgZGlmZmVyZW50IGFwcGxpY2F0aW9uLWxheWVyCi0gKiBwcm90b2NvbHMgb3ZlciBhIHNpbmdsZSBwb3J0LiBUaGlzIGlzIHVzZWQsIGZvciBleGFtcGxlLCB0byBuZWdvdGlhdGUKLSAqIEhUVFAvMi4gKi8KLQotLyogU1NMX0NUWF9zZXRfYWxwbl9wcm90b3Mgc2V0cyB0aGUgY2xpZW50IEFMUE4gcHJvdG9jb2wgbGlzdCBvbiB8Y3R4fCB0bwotICogfHByb3Rvc3wuIHxwcm90b3N8IG11c3QgYmUgaW4gd2lyZS1mb3JtYXQgKGkuZS4gYSBzZXJpZXMgb2Ygbm9uLWVtcHR5LCA4LWJpdAotICogbGVuZ3RoLXByZWZpeGVkIHN0cmluZ3MpLiBJdCByZXR1cm5zIHplcm8gb24gc3VjY2VzcyBhbmQgb25lIG9uIGZhaWx1cmUuCi0gKiBDb25maWd1cmluZyB0aGlzIGxpc3QgZW5hYmxlcyBBTFBOIG9uIGEgY2xpZW50LgotICoKLSAqIFdBUk5JTkc6IHRoaXMgZnVuY3Rpb24gaXMgZGFuZ2Vyb3VzIGJlY2F1c2UgaXQgYnJlYWtzIHRoZSB1c3VhbCByZXR1cm4gdmFsdWUKLSAqIGNvbnZlbnRpb24uICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9zZXRfYWxwbl9wcm90b3MoU1NMX0NUWCAqY3R4LCBjb25zdCB1aW50OF90ICpwcm90b3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcHJvdG9zX2xlbik7Ci0KLS8qIFNTTF9zZXRfYWxwbl9wcm90b3Mgc2V0cyB0aGUgY2xpZW50IEFMUE4gcHJvdG9jb2wgbGlzdCBvbiB8c3NsfCB0byB8cHJvdG9zfC4KLSAqIHxwcm90b3N8IG11c3QgYmUgaW4gd2lyZS1mb3JtYXQgKGkuZS4gYSBzZXJpZXMgb2Ygbm9uLWVtcHR5LCA4LWJpdAotICogbGVuZ3RoLXByZWZpeGVkIHN0cmluZ3MpLiBJdCByZXR1cm5zIHplcm8gb24gc3VjY2VzcyBhbmQgb25lIG9uIGZhaWx1cmUuCi0gKiBDb25maWd1cmluZyB0aGlzIGxpc3QgZW5hYmxlcyBBTFBOIG9uIGEgY2xpZW50LgotICoKLSAqIFdBUk5JTkc6IHRoaXMgZnVuY3Rpb24gaXMgZGFuZ2Vyb3VzIGJlY2F1c2UgaXQgYnJlYWtzIHRoZSB1c3VhbCByZXR1cm4gdmFsdWUKLSAqIGNvbnZlbnRpb24uICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3NldF9hbHBuX3Byb3RvcyhTU0wgKnNzbCwgY29uc3QgdWludDhfdCAqcHJvdG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcHJvdG9zX2xlbik7Ci0KLS8qIFNTTF9DVFhfc2V0X2FscG5fc2VsZWN0X2NiIHNldHMgYSBjYWxsYmFjayBmdW5jdGlvbiBvbiB8Y3R4fCB0aGF0IGlzIGNhbGxlZAotICogZHVyaW5nIENsaWVudEhlbGxvIHByb2Nlc3NpbmcgaW4gb3JkZXIgdG8gc2VsZWN0IGFuIEFMUE4gcHJvdG9jb2wgZnJvbSB0aGUKLSAqIGNsaWVudCdzIGxpc3Qgb2Ygb2ZmZXJlZCBwcm90b2NvbHMuIENvbmZpZ3VyaW5nIHRoaXMgY2FsbGJhY2sgZW5hYmxlcyBBTFBOIG9uCi0gKiBhIHNlcnZlci4KLSAqCi0gKiBUaGUgY2FsbGJhY2sgaXMgcGFzc2VkIGEgd2lyZS1mb3JtYXQgKGkuZS4gYSBzZXJpZXMgb2Ygbm9uLWVtcHR5LCA4LWJpdAotICogbGVuZ3RoLXByZWZpeGVkIHN0cmluZ3MpIEFMUE4gcHJvdG9jb2wgbGlzdCBpbiB8aW58LiBJdCBzaG91bGQgc2V0IHwqb3V0fCBhbmQKLSAqIHwqb3V0X2xlbnwgdG8gdGhlIHNlbGVjdGVkIHByb3RvY29sIGFuZCByZXR1cm4gfFNTTF9UTFNFWFRfRVJSX09LfCBvbgotICogc3VjY2Vzcy4gSXQgZG9lcyBub3QgcGFzcyBvd25lcnNoaXAgb2YgdGhlIGJ1ZmZlci4gT3RoZXJ3aXNlLCBpdCBzaG91bGQKLSAqIHJldHVybiB8U1NMX1RMU0VYVF9FUlJfTk9BQ0t8LiBPdGhlciB8U1NMX1RMU0VYVF9FUlJfKnwgdmFsdWVzIGFyZQotICogdW5pbXBsZW1lbnRlZCBhbmQgd2lsbCBiZSB0cmVhdGVkIGFzIHxTU0xfVExTRVhUX0VSUl9OT0FDS3wuICovCi1PUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2V0X2FscG5fc2VsZWN0X2NiKAotICAgIFNTTF9DVFggKmN0eCwgaW50ICgqY2IpKFNTTCAqc3NsLCBjb25zdCB1aW50OF90ICoqb3V0LCB1aW50OF90ICpvdXRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCB1bnNpZ25lZCBpbl9sZW4sIHZvaWQgKmFyZyksCi0gICAgdm9pZCAqYXJnKTsKLQotLyogU1NMX2dldDBfYWxwbl9zZWxlY3RlZCBnZXRzIHRoZSBzZWxlY3RlZCBBTFBOIHByb3RvY29sIChpZiBhbnkpIGZyb20gfHNzbHwuCi0gKiBPbiByZXR1cm4gaXQgc2V0cyB8Km91dF9kYXRhfCB0byBwb2ludCB0byB8Km91dF9sZW58IGJ5dGVzIG9mIHByb3RvY29sIG5hbWUKLSAqIChub3QgaW5jbHVkaW5nIHRoZSBsZWFkaW5nIGxlbmd0aC1wcmVmaXggYnl0ZSkuIElmIHRoZSBzZXJ2ZXIgZGlkbid0IHJlc3BvbmQKLSAqIHdpdGggYSBuZWdvdGlhdGVkIHByb3RvY29sIHRoZW4gfCpvdXRfbGVufCB3aWxsIGJlIHplcm8uICovCi1PUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9nZXQwX2FscG5fc2VsZWN0ZWQoY29uc3QgU1NMICpzc2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKm91dF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpvdXRfbGVuKTsKLQotCi0vKiBOZXh0IHByb3RvY29sIG5lZ290aWF0aW9uLgotICoKLSAqIFRoZSBOUE4gZXh0ZW5zaW9uIChkcmFmdC1hZ2wtdGxzLW5leHRwcm90b25lZy0wMykgaXMgdGhlIHByZWRlY2Vzc29yIHRvIEFMUE4KLSAqIGFuZCBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGl0LiAqLwotCi0vKiBTU0xfQ1RYX3NldF9uZXh0X3Byb3Rvc19hZHZlcnRpc2VkX2NiIHNldHMgYSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCB3aGVuIGEKLSAqIFRMUyBzZXJ2ZXIgbmVlZHMgYSBsaXN0IG9mIHN1cHBvcnRlZCBwcm90b2NvbHMgZm9yIE5leHQgUHJvdG9jb2wKLSAqIE5lZ290aWF0aW9uLiBUaGUgcmV0dXJuZWQgbGlzdCBtdXN0IGJlIGluIHdpcmUgZm9ybWF0LiBUaGUgbGlzdCBpcyByZXR1cm5lZAotICogYnkgc2V0dGluZyB8Km91dHwgdG8gcG9pbnQgdG8gaXQgYW5kIHwqb3V0X2xlbnwgdG8gaXRzIGxlbmd0aC4gVGhpcyBtZW1vcnkKLSAqIHdpbGwgbm90IGJlIG1vZGlmaWVkLCBidXQgb25lIHNob3VsZCBhc3N1bWUgdGhhdCB8c3NsfCBrZWVwcyBhIHJlZmVyZW5jZSB0bwotICogaXQuCi0gKgotICogVGhlIGNhbGxiYWNrIHNob3VsZCByZXR1cm4gfFNTTF9UTFNFWFRfRVJSX09LfCBpZiBpdCB3aXNoZXMgdG8gYWR2ZXJ0aXNlLgotICogT3RoZXJ3aXNlLCBubyBzdWNoIGV4dGVuc2lvbiB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBTZXJ2ZXJIZWxsby4gKi8KLU9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX0NUWF9zZXRfbmV4dF9wcm90b3NfYWR2ZXJ0aXNlZF9jYigKLSAgICBTU0xfQ1RYICpjdHgsCi0gICAgaW50ICgqY2IpKFNTTCAqc3NsLCBjb25zdCB1aW50OF90ICoqb3V0LCB1bnNpZ25lZCAqb3V0X2xlbiwgdm9pZCAqYXJnKSwKLSAgICB2b2lkICphcmcpOwotCi0vKiBTU0xfQ1RYX3NldF9uZXh0X3Byb3RvX3NlbGVjdF9jYiBzZXRzIGEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2hlbiBhIGNsaWVudAotICogbmVlZHMgdG8gc2VsZWN0IGEgcHJvdG9jb2wgZnJvbSB0aGUgc2VydmVyJ3MgcHJvdmlkZWQgbGlzdC4gfCpvdXR8IG11c3QgYmUKLSAqIHNldCB0byBwb2ludCB0byB0aGUgc2VsZWN0ZWQgcHJvdG9jb2wgKHdoaWNoIG1heSBiZSB3aXRoaW4gfGlufCkuIFRoZSBsZW5ndGgKLSAqIG9mIHRoZSBwcm90b2NvbCBuYW1lIG11c3QgYmUgd3JpdHRlbiBpbnRvIHwqb3V0X2xlbnwuIFRoZSBzZXJ2ZXIncyBhZHZlcnRpc2VkCi0gKiBwcm90b2NvbHMgYXJlIHByb3ZpZGVkIGluIHxpbnwgYW5kIHxpbl9sZW58LiBUaGUgY2FsbGJhY2sgY2FuIGFzc3VtZSB0aGF0Ci0gKiB8aW58IGlzIHN5bnRhY3RpY2FsbHkgdmFsaWQuCi0gKgotICogVGhlIGNsaWVudCBtdXN0IHNlbGVjdCBhIHByb3RvY29sLiBJdCBpcyBmYXRhbCB0byB0aGUgY29ubmVjdGlvbiBpZiB0aGlzCi0gKiBjYWxsYmFjayByZXR1cm5zIGEgdmFsdWUgb3RoZXIgdGhhbiB8U1NMX1RMU0VYVF9FUlJfT0t8LgotICoKLSAqIENvbmZpZ3VyaW5nIHRoaXMgY2FsbGJhY2sgZW5hYmxlcyBOUE4gb24gYSBjbGllbnQuICovCi1PUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2V0X25leHRfcHJvdG9fc2VsZWN0X2NiKAotICAgIFNTTF9DVFggKmN0eCwgaW50ICgqY2IpKFNTTCAqc3NsLCB1aW50OF90ICoqb3V0LCB1aW50OF90ICpvdXRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCB1bnNpZ25lZCBpbl9sZW4sIHZvaWQgKmFyZyksCi0gICAgdm9pZCAqYXJnKTsKLQotLyogU1NMX2dldDBfbmV4dF9wcm90b19uZWdvdGlhdGVkIHNldHMgfCpvdXRfZGF0YXwgYW5kIHwqb3V0X2xlbnwgdG8gcG9pbnQgdG8KLSAqIHRoZSBjbGllbnQncyByZXF1ZXN0ZWQgcHJvdG9jb2wgZm9yIHRoaXMgY29ubmVjdGlvbi4gSWYgdGhlIGNsaWVudCBkaWRuJ3QKLSAqIHJlcXVlc3QgYW55IHByb3RvY29sLCB0aGVuIHwqb3V0X2RhdGF8IGlzIHNldCB0byBOVUxMLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgY2xpZW50IGNhbiByZXF1ZXN0IGFueSBwcm90b2NvbCBpdCBjaG9vc2VzLiBUaGUgdmFsdWUgcmV0dXJuZWQKLSAqIGZyb20gdGhpcyBmdW5jdGlvbiBuZWVkIG5vdCBiZSBhIG1lbWJlciBvZiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgcHJvdG9jb2xzCi0gKiBwcm92aWRlZCBieSB0aGUgc2VydmVyLiAqLwotT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfZ2V0MF9uZXh0X3Byb3RvX25lZ290aWF0ZWQoY29uc3QgU1NMICpzc2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqb3V0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqb3V0X2xlbik7Ci0KLS8qIFNTTF9zZWxlY3RfbmV4dF9wcm90byBpbXBsZW1lbnRzIHRoZSBzdGFuZGFyZCBwcm90b2NvbCBzZWxlY3Rpb24uIEl0IGlzCi0gKiBleHBlY3RlZCB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIGNhbGxiYWNrIHNldCBieQotICogfFNTTF9DVFhfc2V0X25leHRfcHJvdG9fc2VsZWN0X2NifC4KLSAqCi0gKiBUaGUgcHJvdG9jb2wgZGF0YSBpcyBhc3N1bWVkIHRvIGJlIGEgdmVjdG9yIG9mIDgtYml0LCBsZW5ndGggcHJlZml4ZWQgYnl0ZQotICogc3RyaW5ncy4gVGhlIGxlbmd0aCBieXRlIGl0c2VsZiBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGxlbmd0aC4gQSBieXRlCi0gKiBzdHJpbmcgb2YgbGVuZ3RoIDAgaXMgaW52YWxpZC4gTm8gYnl0ZSBzdHJpbmcgbWF5IGJlIHRydW5jYXRlZC4KLSAqCi0gKiBUaGUgY3VycmVudCwgYnV0IGV4cGVyaW1lbnRhbCBhbGdvcml0aG0gZm9yIHNlbGVjdGluZyB0aGUgcHJvdG9jb2wgaXM6Ci0gKgotICogMSkgSWYgdGhlIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgTlBOIHRoZW4gdGhpcyBpcyBpbmRpY2F0ZWQgdG8gdGhlCi0gKiBjYWxsYmFjay4gSW4gdGhpcyBjYXNlLCB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIGhhcyB0byBhYm9ydCB0aGUgY29ubmVjdGlvbgotICogb3IgaGF2ZSBhIGRlZmF1bHQgYXBwbGljYXRpb24gbGV2ZWwgcHJvdG9jb2wuCi0gKgotICogMikgSWYgdGhlIHNlcnZlciBzdXBwb3J0cyBOUE4sIGJ1dCBhZHZlcnRpc2VzIGFuIGVtcHR5IGxpc3QgdGhlbiB0aGUKLSAqIGNsaWVudCBzZWxlY3RzIHRoZSBmaXJzdCBwcm90Y29sIGluIGl0cyBsaXN0LCBidXQgaW5kaWNhdGVzIHZpYSB0aGUKLSAqIEFQSSB0aGF0IHRoaXMgZmFsbGJhY2sgY2FzZSB3YXMgZW5hY3RlZC4KLSAqCi0gKiAzKSBPdGhlcndpc2UsIHRoZSBjbGllbnQgZmluZHMgdGhlIGZpcnN0IHByb3RvY29sIGluIHRoZSBzZXJ2ZXIncyBsaXN0Ci0gKiB0aGF0IGl0IHN1cHBvcnRzIGFuZCBzZWxlY3RzIHRoaXMgcHJvdG9jb2wuIFRoaXMgaXMgYmVjYXVzZSBpdCdzCi0gKiBhc3N1bWVkIHRoYXQgdGhlIHNlcnZlciBoYXMgYmV0dGVyIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIHByb3RvY29sCi0gKiBhIGNsaWVudCBzaG91bGQgdXNlLgotICoKLSAqIDQpIElmIHRoZSBjbGllbnQgZG9lc24ndCBzdXBwb3J0IGFueSBvZiB0aGUgc2VydmVyJ3MgYWR2ZXJ0aXNlZAotICogcHJvdG9jb2xzLCB0aGVuIHRoaXMgaXMgdHJlYXRlZCB0aGUgc2FtZSBhcyBjYXNlIDIuCi0gKgotICogSXQgcmV0dXJucyBlaXRoZXIgfE9QRU5TU0xfTlBOX05FR09USUFURUR8IGlmIGEgY29tbW9uIHByb3RvY29sIHdhcyBmb3VuZCwgb3IKLSAqIHxPUEVOU1NMX05QTl9OT19PVkVSTEFQfCBpZiB0aGUgZmFsbGJhY2sgY2FzZSB3YXMgcmVhY2hlZC4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfc2VsZWN0X25leHRfcHJvdG8odWludDhfdCAqKm91dCwgdWludDhfdCAqb3V0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzZXJ2ZXJfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNsaWVudF9sZW4pOwotCi0jZGVmaW5lIE9QRU5TU0xfTlBOX1VOU1VQUE9SVEVEIDAKLSNkZWZpbmUgT1BFTlNTTF9OUE5fTkVHT1RJQVRFRCAxCi0jZGVmaW5lIE9QRU5TU0xfTlBOX05PX09WRVJMQVAgMgotCi0KLS8qIENoYW5uZWwgSUQuCi0gKgotICogU2VlIGRyYWZ0LWJhbGZhbnotdGxzLWNoYW5uZWxpZC0wMS4gKi8KLQotLyogU1NMX0NUWF9lbmFibGVfdGxzX2NoYW5uZWxfaWQgZWl0aGVyIGNvbmZpZ3VyZXMgYSBUTFMgc2VydmVyIHRvIGFjY2VwdCBUTFMKLSAqIENoYW5uZWwgSURzIGZyb20gY2xpZW50cywgb3IgY29uZmlndXJlcyBhIGNsaWVudCB0byBzZW5kIFRMUyBDaGFubmVsIElEcyB0bwotICogYSBzZXJ2ZXIuIEl0IHJldHVybnMgb25lLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfZW5hYmxlX3Rsc19jaGFubmVsX2lkKFNTTF9DVFggKmN0eCk7Ci0KLS8qIFNTTF9lbmFibGVfdGxzX2NoYW5uZWxfaWQgZWl0aGVyIGNvbmZpZ3VyZXMgYSBUTFMgc2VydmVyIHRvIGFjY2VwdCBUTFMKLSAqIENoYW5uZWwgSURzIGZyb20gY2xpZW50cywgb3IgY29uZmlndXJlcyBhIGNsaWVudCB0byBzZW5kIFRMUyBDaGFubmVsIElEcyB0bwotICogc2VydmVyLiBJdCByZXR1cm5zIG9uZS4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfZW5hYmxlX3Rsc19jaGFubmVsX2lkKFNTTCAqc3NsKTsKLQotLyogU1NMX0NUWF9zZXQxX3Rsc19jaGFubmVsX2lkIGNvbmZpZ3VyZXMgYSBUTFMgY2xpZW50IHRvIHNlbmQgYSBUTFMgQ2hhbm5lbCBJRAotICogdG8gY29tcGF0aWJsZSBzZXJ2ZXJzLiB8cHJpdmF0ZV9rZXl8IG11c3QgYmUgYSBQLTI1NiBFQyBrZXkuIEl0IHJldHVybnMgb25lCi0gKiBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfc2V0MV90bHNfY2hhbm5lbF9pZChTU0xfQ1RYICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9QS0VZICpwcml2YXRlX2tleSk7Ci0KLS8qIFNTTF9zZXQxX3Rsc19jaGFubmVsX2lkIGNvbmZpZ3VyZXMgYSBUTFMgY2xpZW50IHRvIHNlbmQgYSBUTFMgQ2hhbm5lbCBJRCB0bwotICogY29tcGF0aWJsZSBzZXJ2ZXJzLiB8cHJpdmF0ZV9rZXl8IG11c3QgYmUgYSBQLTI1NiBFQyBrZXkuIEl0IHJldHVybnMgb25lIG9uCi0gKiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9zZXQxX3Rsc19jaGFubmVsX2lkKFNTTCAqc3NsLCBFVlBfUEtFWSAqcHJpdmF0ZV9rZXkpOwotCi0vKiBTU0xfZ2V0X3Rsc19jaGFubmVsX2lkIGdldHMgdGhlIGNsaWVudCdzIFRMUyBDaGFubmVsIElEIGZyb20gYSBzZXJ2ZXIgfFNTTCp8Ci0gKiBhbmQgY29waWVzIHVwIHRvIHRoZSBmaXJzdCB8bWF4X291dHwgYnl0ZXMgaW50byB8b3V0fC4gVGhlIENoYW5uZWwgSUQKLSAqIGNvbnNpc3RzIG9mIHRoZSBjbGllbnQncyBQLTI1NiBwdWJsaWMga2V5IGFzIGFuICh4LHkpIHBhaXIgd2hlcmUgZWFjaCBpcyBhCi0gKiAzMi1ieXRlLCBiaWctZW5kaWFuIGZpZWxkIGVsZW1lbnQuIEl0IHJldHVybnMgMCBpZiB0aGUgY2xpZW50IGRpZG4ndCBvZmZlciBhCi0gKiBDaGFubmVsIElEIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBjb21wbGV0ZSBDaGFubmVsIElEIG90aGVyd2lzZS4gKi8KLU9QRU5TU0xfRVhQT1JUIHNpemVfdCBTU0xfZ2V0X3Rsc19jaGFubmVsX2lkKFNTTCAqc3NsLCB1aW50OF90ICpvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWF4X291dCk7Ci0KLS8qIFNTTF9DVFhfc2V0X2NoYW5uZWxfaWRfY2Igc2V0cyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgVExTIENoYW5uZWwgSUQKLSAqIGlzIHJlcXVlc3RlZC4gVGhlIGNhbGxiYWNrIG1heSBzZXQgfCpvdXRfcGtleXwgdG8gYSBrZXksIHBhc3NpbmcgYSByZWZlcmVuY2UKLSAqIHRvIHRoZSBjYWxsZXIuIElmIG5vbmUgaXMgcmV0dXJuZWQsIHRoZSBoYW5kc2hha2Ugd2lsbCBwYXVzZSBhbmQKLSAqIHxTU0xfZ2V0X2Vycm9yfCB3aWxsIHJldHVybiB8U1NMX0VSUk9SX1dBTlRfQ0hBTk5FTF9JRF9MT09LVVB8LgotICoKLSAqIFNlZSBhbHNvIHxTU0xfRVJST1JfV0FOVF9DSEFOTkVMX0lEX0xPT0tVUHwuICovCi1PUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2V0X2NoYW5uZWxfaWRfY2IoCi0gICAgU1NMX0NUWCAqY3R4LCB2b2lkICgqY2hhbm5lbF9pZF9jYikoU1NMICpzc2wsIEVWUF9QS0VZICoqb3V0X3BrZXkpKTsKLQotLyogU1NMX0NUWF9nZXRfY2hhbm5lbF9pZF9jYiByZXR1cm5zIHRoZSBjYWxsYmFjayBzZXQgYnkKLSAqIHxTU0xfQ1RYX3NldF9jaGFubmVsX2lkX2NifC4gKi8KLU9QRU5TU0xfRVhQT1JUIHZvaWQgKCpTU0xfQ1RYX2dldF9jaGFubmVsX2lkX2NiKFNTTF9DVFggKmN0eCkpKAotICAgIFNTTCAqc3NsLCBFVlBfUEtFWSAqKm91dF9wa2V5KTsKLQotCi0vKiBEVExTLVNSVFAuCi0gKgotICogU2VlIFJGQyA1NzY0LiAqLwotCi0vKiBBbiBTUlRQX1BST1RFQ1RJT05fUFJPRklMRSBpcyBhbiBTUlRQIHByb2ZpbGUgZm9yIHVzZSB3aXRoIHRoZSB1c2Vfc3J0cAotICogZXh0ZW5zaW9uLiAqLwotc3RydWN0IHNydHBfcHJvdGVjdGlvbl9wcm9maWxlX3N0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyBpZDsKLX0gLyogU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUgKi87Ci0KLURFQ0xBUkVfU1RBQ0tfT0YoU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUpCi0KLS8qIFNSVFBfKiBkZWZpbmUgY29uc3RhbnRzIGZvciBTUlRQIHByb2ZpbGVzLiAqLwotI2RlZmluZSBTUlRQX0FFUzEyOF9DTV9TSEExXzgwIDB4MDAwMQotI2RlZmluZSBTUlRQX0FFUzEyOF9DTV9TSEExXzMyIDB4MDAwMgotI2RlZmluZSBTUlRQX0FFUzEyOF9GOF9TSEExXzgwIDB4MDAwMwotI2RlZmluZSBTUlRQX0FFUzEyOF9GOF9TSEExXzMyIDB4MDAwNAotI2RlZmluZSBTUlRQX05VTExfU0hBMV84MCAgICAgIDB4MDAwNQotI2RlZmluZSBTUlRQX05VTExfU0hBMV8zMiAgICAgIDB4MDAwNgotCi0vKiBTU0xfQ1RYX3NldF9zcnRwX3Byb2ZpbGVzIGVuYWJsZXMgU1JUUCBmb3IgYWxsIFNTTCBvYmplY3RzIGNyZWF0ZWQgZnJvbQotICogfGN0eHwuIHxwcm9maWxlfCBjb250YWlucyBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIHByb2ZpbGUgbmFtZXMuIEl0IHJldHVybnMKLSAqIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGZhaWx1cmUuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9zZXRfc3J0cF9wcm9maWxlcyhTU0xfQ1RYICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm9maWxlcyk7Ci0KLS8qIFNTTF9zZXRfc3J0cF9wcm9maWxlcyBlbmFibGVzIFNSVFAgZm9yIHxzc2x8LiAgfHByb2ZpbGV8IGNvbnRhaW5zIGEKLSAqIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIHByb2ZpbGUgbmFtZXMuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24KLSAqIGZhaWx1cmUuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3NldF9zcnRwX3Byb2ZpbGVzKFNTTCAqc3NsLCBjb25zdCBjaGFyICpwcm9maWxlcyk7Ci0KLS8qIFNTTF9nZXRfc3J0cF9wcm9maWxlcyByZXR1cm5zIHRoZSBTUlRQIHByb2ZpbGVzIHN1cHBvcnRlZCBieSB8c3NsfC4gKi8KLU9QRU5TU0xfRVhQT1JUIFNUQUNLX09GKFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFKSAqU1NMX2dldF9zcnRwX3Byb2ZpbGVzKAotICAgIFNTTCAqc3NsKTsKLQotLyogU1NMX2dldF9zZWxlY3RlZF9zcnRwX3Byb2ZpbGUgcmV0dXJucyB0aGUgc2VsZWN0ZWQgU1JUUCBwcm9maWxlLCBvciBOVUxMIGlmCi0gKiBTUlRQIHdhcyBub3QgbmVnb3RpYXRlZC4gKi8KLU9QRU5TU0xfRVhQT1JUIGNvbnN0IFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFICpTU0xfZ2V0X3NlbGVjdGVkX3NydHBfcHJvZmlsZSgKLSAgICBTU0wgKnNzbCk7Ci0KLQotLyogUHJlLXNoYXJlZCBrZXlzLgotICoKLSAqIENvbm5lY3Rpb25zIG1heSBiZSBjb25maWd1cmVkIHdpdGggUFNLIChQcmUtU2hhcmVkIEtleSkgY2lwaGVyIHN1aXRlcy4gVGhlc2UKLSAqIGF1dGhlbnRpY2F0ZSB1c2luZyBvdXQtb2YtYmFuZCBwcmUtc2hhcmVkIGtleXMgcmF0aGVyIHRoYW4gY2VydGlmaWNhdGVzLiBTZWUKLSAqIFJGQyA0Mjc5LgotICoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBOVUwtdGVybWluYXRlZCBDIHN0cmluZ3MgZm9yIGlkZW50aXRpZXMgYW5kIGlkZW50aXR5Ci0gKiBoaW50cywgc28gdmFsdWVzIHdpdGggYSBOVUwgY2hhcmFjdGVyIGFyZSBub3Qgc3VwcG9ydGVkLiAoUkZDIDQyNzkgZG9lcyBub3QKLSAqIHNwZWNpZnkgdGhlIGZvcm1hdCBvZiBhbiBpZGVudGl0eS4pICovCi0KLS8qIFBTS19NQVhfSURFTlRJVFlfTEVOIGlzIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBsZW5ndGggb2YgYSBQU0sgaWRlbnRpdHksCi0gKiBleGNsdWRpbmcgdGhlIE5VTCB0ZXJtaW5hdG9yLiAqLwotI2RlZmluZSBQU0tfTUFYX0lERU5USVRZX0xFTiAxMjgKLQotLyogUFNLX01BWF9QU0tfTEVOIGlzIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBsZW5ndGggb2YgYSBwcmUtc2hhcmVkIGtleS4gKi8KLSNkZWZpbmUgUFNLX01BWF9QU0tfTEVOIDI1NgotCi0vKiBTU0xfQ1RYX3NldF9wc2tfY2xpZW50X2NhbGxiYWNrIHNldHMgdGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIFBTSyBpcwotICogbmVnb3RpYXRlZCBvbiB0aGUgY2xpZW50LiBUaGlzIGNhbGxiYWNrIG11c3QgYmUgc2V0IHRvIGVuYWJsZSBQU0sgY2lwaGVyCi0gKiBzdWl0ZXMgb24gdGhlIGNsaWVudC4KLSAqCi0gKiBUaGUgY2FsbGJhY2sgaXMgcGFzc2VkIHRoZSBpZGVudGl0eSBoaW50IGluIHxoaW50fCBvciBOVUxMIGlmIG5vbmUgd2FzCi0gKiBwcm92aWRlZC4gSXQgc2hvdWxkIHNlbGVjdCBhIFBTSyBpZGVudGl0eSBhbmQgd3JpdGUgdGhlIGlkZW50aXR5IGFuZCB0aGUKLSAqIGNvcnJlc3BvbmRpbmcgUFNLIHRvIHxpZGVudGl0eXwgYW5kIHxwc2t8LCByZXNwZWN0aXZlbHkuIFRoZSBpZGVudGl0eSBpcwotICogd3JpdHRlbiBhcyBhIE5VTC10ZXJtaW5hdGVkIEMgc3RyaW5nIG9mIGxlbmd0aCAoZXhjbHVkaW5nIHRoZSBOVUwgdGVybWluYXRvcikKLSAqIGF0IG1vc3QgfG1heF9pZGVudGl0eV9sZW58LiBUaGUgUFNLJ3MgbGVuZ3RoIG11c3QgYmUgYXQgbW9zdCB8bWF4X3Bza19sZW58LgotICogVGhlIGNhbGxiYWNrIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgUFNLIG9yIDAgaWYgbm8gc3VpdGFibGUgaWRlbnRpdHkgd2FzCi0gKiBmb3VuZC4gKi8KLU9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX0NUWF9zZXRfcHNrX2NsaWVudF9jYWxsYmFjaygKLSAgICBTU0xfQ1RYICpjdHgsCi0gICAgdW5zaWduZWQgKCpwc2tfY2xpZW50X2NhbGxiYWNrKSgKLSAgICAgICAgU1NMICpzc2wsIGNvbnN0IGNoYXIgKmhpbnQsIGNoYXIgKmlkZW50aXR5LAotICAgICAgICB1bnNpZ25lZCBtYXhfaWRlbnRpdHlfbGVuLCB1aW50OF90ICpwc2ssIHVuc2lnbmVkIG1heF9wc2tfbGVuKSk7Ci0KLS8qIFNTTF9zZXRfcHNrX2NsaWVudF9jYWxsYmFjayBzZXRzIHRoZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBQU0sgaXMKLSAqIG5lZ290aWF0ZWQgb24gdGhlIGNsaWVudC4gVGhpcyBjYWxsYmFjayBtdXN0IGJlIHNldCB0byBlbmFibGUgUFNLIGNpcGhlcgotICogc3VpdGVzIG9uIHRoZSBjbGllbnQuIFNlZSBhbHNvIHxTU0xfQ1RYX3NldF9wc2tfY2xpZW50X2NhbGxiYWNrfC4gKi8KLU9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX3NldF9wc2tfY2xpZW50X2NhbGxiYWNrKAotICAgIFNTTCAqc3NsLCB1bnNpZ25lZCAoKnBza19jbGllbnRfY2FsbGJhY2spKFNTTCAqc3NsLCBjb25zdCBjaGFyICpoaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmlkZW50aXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1heF9pZGVudGl0eV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcHNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1heF9wc2tfbGVuKSk7Ci0KLS8qIFNTTF9DVFhfc2V0X3Bza19zZXJ2ZXJfY2FsbGJhY2sgc2V0cyB0aGUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gUFNLIGlzCi0gKiBuZWdvdGlhdGVkIG9uIHRoZSBzZXJ2ZXIuIFRoaXMgY2FsbGJhY2sgbXVzdCBiZSBzZXQgdG8gZW5hYmxlIFBTSyBjaXBoZXIKLSAqIHN1aXRlcyBvbiB0aGUgc2VydmVyLgotICoKLSAqIFRoZSBjYWxsYmFjayBpcyBwYXNzZWQgdGhlIGlkZW50aXR5IGluIHxpZGVudGl0eXwuIEl0IHNob3VsZCB3cml0ZSBhIFBTSyBvZgotICogbGVuZ3RoIGF0IG1vc3QgfG1heF9wc2tfbGVufCB0byB8cHNrfCBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgotICogb3IgemVybyBpZiB0aGUgUFNLIGlkZW50aXR5IGlzIHVua25vd24uICovCi1PUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2V0X3Bza19zZXJ2ZXJfY2FsbGJhY2soCi0gICAgU1NMX0NUWCAqY3R4LAotICAgIHVuc2lnbmVkICgqcHNrX3NlcnZlcl9jYWxsYmFjaykoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmlkZW50aXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcHNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWF4X3Bza19sZW4pKTsKLQotLyogU1NMX3NldF9wc2tfc2VydmVyX2NhbGxiYWNrIHNldHMgdGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIFBTSyBpcwotICogbmVnb3RpYXRlZCBvbiB0aGUgc2VydmVyLiBUaGlzIGNhbGxiYWNrIG11c3QgYmUgc2V0IHRvIGVuYWJsZSBQU0sgY2lwaGVyCi0gKiBzdWl0ZXMgb24gdGhlIHNlcnZlci4gU2VlIGFsc28gfFNTTF9DVFhfc2V0X3Bza19zZXJ2ZXJfY2FsbGJhY2t8LiAqLwotT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfc2V0X3Bza19zZXJ2ZXJfY2FsbGJhY2soCi0gICAgU1NMICpzc2wsCi0gICAgdW5zaWduZWQgKCpwc2tfc2VydmVyX2NhbGxiYWNrKShTU0wgKnNzbCwgY29uc3QgY2hhciAqaWRlbnRpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtYXhfcHNrX2xlbikpOwotCi0vKiBTU0xfQ1RYX3VzZV9wc2tfaWRlbnRpdHlfaGludCBjb25maWd1cmVzIHNlcnZlciBjb25uZWN0aW9ucyB0byBhZHZlcnRpc2UgYW4KLSAqIGlkZW50aXR5IGhpbnQgb2YgfGlkZW50aXR5X2hpbnR8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uCi0gKiBlcnJvci4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3VzZV9wc2tfaWRlbnRpdHlfaGludChTU0xfQ1RYICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaWRlbnRpdHlfaGludCk7Ci0KLS8qIFNTTF91c2VfcHNrX2lkZW50aXR5X2hpbnQgY29uZmlndXJlcyBzZXJ2ZXIgY29ubmVjdGlvbnMgdG8gYWR2ZXJ0aXNlIGFuCi0gKiBpZGVudGl0eSBoaW50IG9mIHxpZGVudGl0eV9oaW50fC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbgotICogZXJyb3IuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3VzZV9wc2tfaWRlbnRpdHlfaGludChTU0wgKnNzbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmlkZW50aXR5X2hpbnQpOwotCi0vKiBTU0xfZ2V0X3Bza19pZGVudGl0eV9oaW50IHJldHVybnMgdGhlIFBTSyBpZGVudGl0eSBoaW50IGFkdmVydGlzZWQgZm9yIHxzc2x8Ci0gKiBvciBOVUxMIGlmIHRoZXJlIGlzIG5vbmUuICovCi1PUEVOU1NMX0VYUE9SVCBjb25zdCBjaGFyICpTU0xfZ2V0X3Bza19pZGVudGl0eV9oaW50KGNvbnN0IFNTTCAqc3NsKTsKLQotLyogU1NMX2dldF9wc2tfaWRlbnRpdHksIGFmdGVyIHRoZSBoYW5kc2hha2UgY29tcGxldGVzLCByZXR1cm5zIHRoZSBQU0sgaWRlbnRpdHkKLSAqIHRoYXQgd2FzIG5lZ290aWF0ZWQgYnkgfHNzbHwgb3IgTlVMTCBpZiBQU0sgd2FzIG5vdCB1c2VkLiAqLwotT1BFTlNTTF9FWFBPUlQgY29uc3QgY2hhciAqU1NMX2dldF9wc2tfaWRlbnRpdHkoY29uc3QgU1NMICpzc2wpOwotCi0KLS8qIGV4X2RhdGEgZnVuY3Rpb25zLgotICoKLSAqIFNlZSB8ZXhfZGF0YS5ofCBmb3IgZGV0YWlscy4gKi8KLQotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9zZXRfZXhfZGF0YShTU0wgKnNzbCwgaW50IGlkeCwgdm9pZCAqZGF0YSk7Ci1PUEVOU1NMX0VYUE9SVCB2b2lkICpTU0xfZ2V0X2V4X2RhdGEoY29uc3QgU1NMICpzc2wsIGludCBpZHgpOwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKTsKLQotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9TRVNTSU9OX3NldF9leF9kYXRhKFNTTF9TRVNTSU9OICpzZXNzaW9uLCBpbnQgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpOwotT1BFTlNTTF9FWFBPUlQgdm9pZCAqU1NMX1NFU1NJT05fZ2V0X2V4X2RhdGEoY29uc3QgU1NMX1NFU1NJT04gKnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4KTsKLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfU0VTU0lPTl9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBUT19FWF9uZXcgKm5ld19mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKTsKLQotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfc2V0X2V4X2RhdGEoU1NMX0NUWCAqY3R4LCBpbnQgaWR4LCB2b2lkICpkYXRhKTsKLU9QRU5TU0xfRVhQT1JUIHZvaWQgKlNTTF9DVFhfZ2V0X2V4X2RhdGEoY29uc3QgU1NMX0NUWCAqY3R4LCBpbnQgaWR4KTsKLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmMpOwotCi0KLS8qIE9ic2N1cmUgZnVuY3Rpb25zLiAqLwotCi0vKiBTU0xfZ2V0X3JjNF9zdGF0ZSBzZXRzIHwqcmVhZF9rZXl8IGFuZCB8KndyaXRlX2tleXwgdG8gdGhlIFJDNCBzdGF0ZXMgZm9yCi0gKiB0aGUgcmVhZCBhbmQgd3JpdGUgZGlyZWN0aW9ucy4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciB6ZXJvIGlmIHxzc2x8Ci0gKiBpc24ndCB1c2luZyBhbiBSQzQtYmFzZWQgY2lwaGVyIHN1aXRlLiAqLwotT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9nZXRfcmM0X3N0YXRlKGNvbnN0IFNTTCAqc3NsLCBjb25zdCBSQzRfS0VZICoqcmVhZF9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkM0X0tFWSAqKndyaXRlX2tleSk7Ci0KLS8qIFNTTF9nZXRfc3RydWN0dXJlX3NpemVzIHJldHVybnMgdGhlIHNpemVzIG9mIHRoZSBTU0wsIFNTTF9DVFggYW5kCi0gKiBTU0xfU0VTU0lPTiBzdHJ1Y3R1cmVzIHNvIHRoYXQgYSB0ZXN0IGNhbiBlbnN1cmUgdGhhdCBvdXRzaWRlIGNvZGUgYWdyZWVzIG9uCi0gKiB0aGVzZSB2YWx1ZXMuICovCi1PUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9nZXRfc3RydWN0dXJlX3NpemVzKHNpemVfdCAqc3NsX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqc3NsX2N0eF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnNzbF9zZXNzaW9uX3NpemUpOwotCiAKIC8qIFVuZGVyZG9jdW1lbnRlZCBmdW5jdGlvbnMuCiAgKgpAQCAtMjI1MiwxNCArNjA3LDEyMiBAQAogI2RlZmluZSBTU0xfU0VOVF9TSFVURE9XTiAxCiAjZGVmaW5lIFNTTF9SRUNFSVZFRF9TSFVURE9XTiAyCiAKKyNkZWZpbmUgU1NMX0ZJTEVUWVBFX0FTTjEgWDUwOV9GSUxFVFlQRV9BU04xCisjZGVmaW5lIFNTTF9GSUxFVFlQRV9QRU0gWDUwOV9GSUxFVFlQRV9QRU0KKwogdHlwZWRlZiBzdHJ1Y3Qgc3NsX3Byb3RvY29sX21ldGhvZF9zdCBTU0xfUFJPVE9DT0xfTUVUSE9EOwordHlwZWRlZiBzdHJ1Y3Qgc3NsX3Nlc3Npb25fc3QgU1NMX1NFU1NJT047Cit0eXBlZGVmIHN0cnVjdCB0bHNfc2lnYWxnc19zdCBUTFNfU0lHQUxHUzsKIHR5cGVkZWYgc3RydWN0IHNzbF9jb25mX2N0eF9zdCBTU0xfQ09ORl9DVFg7CiB0eXBlZGVmIHN0cnVjdCBzc2wzX2VuY19tZXRob2QgU1NMM19FTkNfTUVUSE9EOwogCisvKiBTUlRQIHByb3RlY3Rpb24gcHJvZmlsZXMgZm9yIHVzZSB3aXRoIHRoZSB1c2Vfc3J0cCBleHRlbnNpb24gKFJGQyA1NzY0KS4gKi8KK3R5cGVkZWYgc3RydWN0IHNydHBfcHJvdGVjdGlvbl9wcm9maWxlX3N0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdW5zaWduZWQgbG9uZyBpZDsKK30gU1JUUF9QUk9URUNUSU9OX1BST0ZJTEU7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUpCisKKy8qIEFuIFNTTF9TRVNTSU9OIHJlcHJlc2VudHMgYW4gU1NMIHNlc3Npb24gdGhhdCBtYXkgYmUgcmVzdW1lZCBpbiBhbgorICogYWJicmV2aWF0ZWQgaGFuZHNoYWtlLiAqLworc3RydWN0IHNzbF9zZXNzaW9uX3N0IHsKKyAgaW50IHNzbF92ZXJzaW9uOyAvKiB3aGF0IHNzbCB2ZXJzaW9uIHNlc3Npb24gaW5mbyBpcyBiZWluZyBrZXB0IGluIGhlcmU/ICovCisKKyAgaW50IG1hc3Rlcl9rZXlfbGVuZ3RoOworICB1aW50OF90IG1hc3Rlcl9rZXlbU1NMX01BWF9NQVNURVJfS0VZX0xFTkdUSF07CisgIC8qIHNlc3Npb25faWQgLSB2YWxpZD8gKi8KKyAgdW5zaWduZWQgaW50IHNlc3Npb25faWRfbGVuZ3RoOworICB1aW50OF90IHNlc3Npb25faWRbU1NMX01BWF9TU0xfU0VTU0lPTl9JRF9MRU5HVEhdOworICAvKiB0aGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNlc3Npb24gaXMgYmVpbmcgcmV1c2VkIGluCisgICAqIHRoZSBhcHByb3ByaWF0ZSBjb250ZXh0LiBJdCBpcyB1cCB0byB0aGUgYXBwbGljYXRpb24gdG8gc2V0IHRoaXMsCisgICAqIHZpYSBTU0xfbmV3ICovCisgIHVuc2lnbmVkIGludCBzaWRfY3R4X2xlbmd0aDsKKyAgdWludDhfdCBzaWRfY3R4W1NTTF9NQVhfU0lEX0NUWF9MRU5HVEhdOworCisgIGNoYXIgKnBza19pZGVudGl0eTsKKyAgLyogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IHNlc3Npb24gcmVzdW1wdGlvbiBpcyBub3QgYWxsb3dlZC4gQXBwbGljYXRpb25zIGNhbgorICAgKiBhbHNvIHNldCB0aGlzIGJpdCBmb3IgYSBuZXcgc2Vzc2lvbiB2aWEgbm90X3Jlc3VtYWJsZV9zZXNzaW9uX2NiIHRvCisgICAqIGRpc2FibGUgc2Vzc2lvbiBjYWNoaW5nIGFuZCB0aWNrZXRzLiAqLworICBpbnQgbm90X3Jlc3VtYWJsZTsKKworICAvKiBUaGUgY2VydCBpcyB0aGUgY2VydGlmaWNhdGUgdXNlZCB0byBlc3RhYmxpc2ggdGhpcyBjb25uZWN0aW9uICovCisgIHN0cnVjdCBzZXNzX2NlcnRfc3QgLyogU0VTU19DRVJUICovICpzZXNzX2NlcnQ7CisKKyAgLyogVGhpcyBpcyB0aGUgY2VydCBmb3IgdGhlIG90aGVyIGVuZC4gT24gY2xpZW50cywgaXQgd2lsbCBiZSB0aGUgc2FtZSBhcworICAgKiBzZXNzX2NlcnQtPnBlZXJfa2V5LT54NTA5ICh0aGUgbGF0dGVyIGlzIG5vdCBlbm91Z2ggYXMgc2Vzc19jZXJ0IGlzIG5vdAorICAgKiByZXRhaW5lZCBpbiB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gb2Ygc2Vzc2lvbnMsIHNlZSBzc2xfYXNuMS5jKS4gKi8KKyAgWDUwOSAqcGVlcjsKKyAgLyogd2hlbiBhcHBfdmVyaWZ5X2NhbGxiYWNrIGFjY2VwdHMgYSBzZXNzaW9uIHdoZXJlIHRoZSBwZWVyJ3MgY2VydGlmaWNhdGUgaXMKKyAgICogbm90IG9rLCB3ZSBtdXN0IHJlbWVtYmVyIHRoZSBlcnJvciBmb3Igc2Vzc2lvbiByZXVzZTogKi8KKyAgbG9uZyB2ZXJpZnlfcmVzdWx0OyAvKiBvbmx5IGZvciBzZXJ2ZXJzICovCisKKyAgQ1JZUFRPX3JlZmNvdW50X3QgcmVmZXJlbmNlczsKKyAgbG9uZyB0aW1lb3V0OworICBsb25nIHRpbWU7CisKKyAgY29uc3QgU1NMX0NJUEhFUiAqY2lwaGVyOworCisgIENSWVBUT19FWF9EQVRBIGV4X2RhdGE7IC8qIGFwcGxpY2F0aW9uIHNwZWNpZmljIGRhdGEgKi8KKworICAvKiBUaGVzZSBhcmUgdXNlZCB0byBtYWtlIHJlbW92YWwgb2Ygc2Vzc2lvbi1pZHMgbW9yZSBlZmZpY2llbnQgYW5kIHRvCisgICAqIGltcGxlbWVudCBhIG1heGltdW0gY2FjaGUgc2l6ZS4gKi8KKyAgU1NMX1NFU1NJT04gKnByZXYsICpuZXh0OworICBjaGFyICp0bHNleHRfaG9zdG5hbWU7CisgIC8qIFJGQzQ1MDcgaW5mbyAqLworICB1aW50OF90ICp0bHNleHRfdGljazsgICAgICAgICAgICAgICAvKiBTZXNzaW9uIHRpY2tldCAqLworICBzaXplX3QgdGxzZXh0X3RpY2tsZW47ICAgICAgICAgICAgICAvKiBTZXNzaW9uIHRpY2tldCBsZW5ndGggKi8KKyAgdWludDMyX3QgdGxzZXh0X3RpY2tfbGlmZXRpbWVfaGludDsgLyogU2Vzc2lvbiBsaWZldGltZSBoaW50IGluIHNlY29uZHMgKi8KKworICBzaXplX3QgdGxzZXh0X3NpZ25lZF9jZXJ0X3RpbWVzdGFtcF9saXN0X2xlbmd0aDsKKyAgdWludDhfdCAqdGxzZXh0X3NpZ25lZF9jZXJ0X3RpbWVzdGFtcF9saXN0OyAvKiBTZXJ2ZXIncyBsaXN0LiAqLworCisgIC8qIFRoZSBPQ1NQIHJlc3BvbnNlIHRoYXQgY2FtZSB3aXRoIHRoZSBzZXNzaW9uLiAqLworICBzaXplX3Qgb2NzcF9yZXNwb25zZV9sZW5ndGg7CisgIHVpbnQ4X3QgKm9jc3BfcmVzcG9uc2U7CisKKyAgY2hhciBwZWVyX3NoYTI1Nl92YWxpZDsgLyogTm9uLXplcm8gaWYgcGVlcl9zaGEyNTYgaXMgdmFsaWQgKi8KKyAgdWludDhfdAorICAgICAgcGVlcl9zaGEyNTZbU0hBMjU2X0RJR0VTVF9MRU5HVEhdOyAvKiBTSEEyNTYgb2YgcGVlciBjZXJ0aWZpY2F0ZSAqLworCisgIC8qIG9yaWdpbmFsX2hhbmRzaGFrZV9oYXNoIGNvbnRhaW5zIHRoZSBoYW5kc2hha2UgaGFzaCAoZWl0aGVyIFNIQS0xK01ENSBvcgorICAgKiBTSEEtMiwgZGVwZW5kaW5nIG9uIFRMUyB2ZXJzaW9uKSBmb3IgdGhlIG9yaWdpbmFsLCBmdWxsIGhhbmRzaGFrZSB0aGF0CisgICAqIGNyZWF0ZWQgYSBzZXNzaW9uLiBUaGlzIGlzIHVzZWQgYnkgQ2hhbm5lbCBJRHMgZHVyaW5nIHJlc3VtcHRpb24uICovCisgIHVpbnQ4X3Qgb3JpZ2luYWxfaGFuZHNoYWtlX2hhc2hbRVZQX01BWF9NRF9TSVpFXTsKKyAgdW5zaWduZWQgaW50IG9yaWdpbmFsX2hhbmRzaGFrZV9oYXNoX2xlbjsKKworICAvKiBleHRlbmRlZF9tYXN0ZXJfc2VjcmV0IGlzIHRydWUgaWYgdGhlIG1hc3RlciBzZWNyZXQgaW4gdGhpcyBzZXNzaW9uIHdhcworICAgKiBnZW5lcmF0ZWQgdXNpbmcgRU1TIGFuZCB0aHVzIGlzbid0IHZ1bG5lcmFibGUgdG8gdGhlIFRyaXBsZSBIYW5kc2hha2UKKyAgICogYXR0YWNrLiAqLworICBjaGFyIGV4dGVuZGVkX21hc3Rlcl9zZWNyZXQ7Cit9OworCisKKy8qIENlcnQgcmVsYXRlZCBmbGFncyAqLworLyogTWFueSBpbXBsZW1lbnRhdGlvbnMgaWdub3JlIHNvbWUgYXNwZWN0cyBvZiB0aGUgVExTIHN0YW5kYXJkcyBzdWNoIGFzCisgKiBlbmZvcmNpbmcgY2VydGlmY2F0ZSBjaGFpbiBhbGdvcml0aG1zLiBXaGVuIHRoaXMgaXMgc2V0IHdlIGVuZm9yY2UgdGhlbS4gKi8KKyNkZWZpbmUgU1NMX0NFUlRfRkxBR19UTFNfU1RSSUNUIDB4MDAwMDAwMDFMCisKKy8qIEZsYWdzIGZvciBidWlsZGluZyBjZXJ0aWZpY2F0ZSBjaGFpbnMgKi8KKy8qIFRyZWF0IGFueSBleGlzdGluZyBjZXJ0aWZpY2F0ZXMgYXMgdW50cnVzdGVkIENBcyAqLworI2RlZmluZSBTU0xfQlVJTERfQ0hBSU5fRkxBR19VTlRSVVNURUQgMHgxCisvKiBEb24ndCBpbmNsdWRlIHJvb3QgQ0EgaW4gY2hhaW4gKi8KKyNkZWZpbmUgU1NMX0JVSUxEX0NIQUlOX0ZMQUdfTk9fUk9PVCAweDIKKy8qIEp1c3QgY2hlY2sgY2VydGlmaWNhdGVzIGFscmVhZHkgdGhlcmUgKi8KKyNkZWZpbmUgU1NMX0JVSUxEX0NIQUlOX0ZMQUdfQ0hFQ0sgMHg0CisvKiBJZ25vcmUgdmVyaWZpY2F0aW9uIGVycm9ycyAqLworI2RlZmluZSBTU0xfQlVJTERfQ0hBSU5fRkxBR19JR05PUkVfRVJST1IgMHg4CisvKiBDbGVhciB2ZXJpZmljYXRpb24gZXJyb3JzIGZyb20gcXVldWUgKi8KKyNkZWZpbmUgU1NMX0JVSUxEX0NIQUlOX0ZMQUdfQ0xFQVJfRVJST1IgMHgxMAorCiAvKiBTU0xfc2V0X210dSBzZXRzIHRoZSB8c3NsfCdzIE1UVSBpbiBEVExTIHRvIHxtdHV8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzCiAgKiBhbmQgemVybyBvbiBmYWlsdXJlLiAqLwogT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9zZXRfbXR1KFNTTCAqc3NsLCB1bnNpZ25lZCBtdHUpOwogCisvKiBTU0xfZ2V0X3NlY3VyZV9yZW5lZ290aWF0aW9uX3N1cHBvcnQgcmV0dXJucyBvbmUgaWYgdGhlIHBlZXIgc3VwcG9ydHMgc2VjdXJlCisgKiByZW5lZ290aWF0aW9uIChSRkMgNTc0NikgYW5kIHplcm8gb3RoZXJ3aXNlLiAqLworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9nZXRfc2VjdXJlX3JlbmVnb3RpYXRpb25fc3VwcG9ydChjb25zdCBTU0wgKnNzbCk7CisKIC8qIFNTTF9DVFhfc2V0X21zZ19jYWxsYmFjayBpbnN0YWxscyB8Y2J8IGFzIHRoZSBtZXNzYWdlIGNhbGxiYWNrIGZvciB8Y3R4fC4KICAqIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbiBzZW5kaW5nIG9yIHJlY2VpdmluZyBsb3ctbGV2ZWwgcmVjb3JkCiAgKiBoZWFkZXJzLCBjb21wbGV0ZSBoYW5kc2hha2UgbWVzc2FnZXMsIENoYW5nZUNpcGhlclNwZWMsIGFuZCBhbGVydHMuCkBAIC0yMzA1LDYgKzc2OCwyNiBAQAogCiAjZGVmaW5lIFNTTF9NQVhfQ0VSVF9MSVNUX0RFRkFVTFQgMTAyNCAqIDEwMCAvKiAxMDBrIG1heCBjZXJ0IGxpc3QgKi8KIAorI2RlZmluZSBTU0xfU0VTU0lPTl9DQUNIRV9NQVhfU0laRV9ERUZBVUxUICgxMDI0ICogMjApCisKKyNkZWZpbmUgU1NMX0RFRkFVTFRfU0VTU0lPTl9USU1FT1VUICgyICogNjAgKiA2MCkKKworLyogVGhpcyBjYWxsYmFjayB0eXBlIGlzIHVzZWQgaW5zaWRlIFNTTF9DVFgsIFNTTCwgYW5kIGluIHRoZSBmdW5jdGlvbnMgdGhhdAorICogc2V0IHRoZW0uIEl0IGlzIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGdlbmVyYXRpb24gb2YgU1NML1RMUyBzZXNzaW9uIElEcyBpbiBhCisgKiBzZXJ2ZXIuIFJldHVybiB2YWx1ZSBzaG91bGQgYmUgemVybyBvbiBhbiBlcnJvciwgbm9uLXplcm8gdG8gcHJvY2VlZC4gQWxzbywKKyAqIGNhbGxiYWNrcyBzaG91bGQgdGhlbXNlbHZlcyBjaGVjayBpZiB0aGUgaWQgdGhleSBnZW5lcmF0ZSBpcyB1bmlxdWUKKyAqIG90aGVyd2lzZSB0aGUgU1NMIGhhbmRzaGFrZSB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvciAtIGNhbGxiYWNrcyBjYW4gZG8gdGhpcworICogdXNpbmcgdGhlICdzc2wnIHZhbHVlIHRoZXkncmUgcGFzc2VkIGJ5OworICogICAgICBTU0xfaGFzX21hdGNoaW5nX3Nlc3Npb25faWQoc3NsLCBpZCwgKmlkX2xlbikKKyAqIFRoZSBsZW5ndGggdmFsdWUgcGFzc2VkIGluIGlzIHNldCBhdCB0aGUgbWF4aW11bSBzaXplIHRoZSBzZXNzaW9uIElEIGNhbiBiZS4KKyAqIEluIFNTTHYyIHRoaXMgaXMgMTYgYnl0ZXMsIHdoZXJlYXMgU1NMdjMvVExTdjEgaXQgaXMgMzIgYnl0ZXMuIFRoZSBjYWxsYmFjaworICogY2FuIGFsdGVyIHRoaXMgbGVuZ3RoIHRvIGJlIGxlc3MgaWYgZGVzaXJlZCwgYnV0IHVuZGVyIFNTTHYyIHNlc3Npb24gSURzIGFyZQorICogc3VwcG9zZWQgdG8gYmUgZml4ZWQgYXQgMTYgYnl0ZXMgc28gdGhlIGlkIHdpbGwgYmUgcGFkZGVkIGFmdGVyIHRoZSBjYWxsYmFjaworICogcmV0dXJucyBpbiB0aGlzIGNhc2UuIEl0IGlzIGFsc28gYW4gZXJyb3IgZm9yIHRoZSBjYWxsYmFjayB0byBzZXQgdGhlIHNpemUKKyAqIHRvIHplcm8uICovCit0eXBlZGVmIGludCAoKkdFTl9TRVNTSU9OX0NCKShjb25zdCBTU0wgKnNzbCwgdWludDhfdCAqaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmlkX2xlbik7CisKIC8qIHNzbF9lYXJseV9jYWxsYmFja19jdHggaXMgcGFzc2VkIHRvIGNlcnRhaW4gY2FsbGJhY2tzIHRoYXQgYXJlIGNhbGxlZCB2ZXJ5CiAgKiBlYXJseSBvbiBkdXJpbmcgdGhlIHNlcnZlciBoYW5kc2hha2UuIEF0IHRoaXMgcG9pbnQsIG11Y2ggb2YgdGhlIFNTTCogaGFzbid0CiAgKiBiZWVuIGZpbGxlZCBvdXQgYW5kIG9ubHkgdGhlIENsaWVudEhlbGxvIGNhbiBiZSBkZXBlbmRlZCBvbi4gKi8KQEAgLTIzMzEsNiArODE0LDMxMiBAQAogICAgIGNvbnN0IHN0cnVjdCBzc2xfZWFybHlfY2FsbGJhY2tfY3R4ICpjdHgsIHVpbnQxNl90IGV4dGVuc2lvbl90eXBlLAogICAgIGNvbnN0IHVpbnQ4X3QgKipvdXRfZGF0YSwgc2l6ZV90ICpvdXRfbGVuKTsKIAordHlwZWRlZiBzdHJ1Y3Qgc3NsX2NvbXBfc3QgU1NMX0NPTVA7CisKK3N0cnVjdCBzc2xfY29tcF9zdCB7CisgIGludCBpZDsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgY2hhciAqbWV0aG9kOworfTsKKworREVDTEFSRV9TVEFDS19PRihTU0xfQ09NUCkKK0RFQ0xBUkVfTEhBU0hfT0YoU1NMX1NFU1NJT04pCisKKy8qIHNzbF9jaXBoZXJfcHJlZmVyZW5jZV9saXN0X3N0IGNvbnRhaW5zIGEgbGlzdCBvZiBTU0xfQ0lQSEVScyB3aXRoCisgKiBlcXVhbC1wcmVmZXJlbmNlIGdyb3Vwcy4gRm9yIFRMUyBjbGllbnRzLCB0aGUgZ3JvdXBzIGFyZSBtb290IGJlY2F1c2UgdGhlCisgKiBzZXJ2ZXIgcGlja3MgdGhlIGNpcGhlciBhbmQgZ3JvdXBzIGNhbm5vdCBiZSBleHByZXNzZWQgb24gdGhlIHdpcmUuIEhvd2V2ZXIsCisgKiBmb3Igc2VydmVycywgdGhlIGVxdWFsLXByZWZlcmVuY2UgZ3JvdXBzIGFsbG93IHRoZSBjbGllbnQncyBwcmVmZXJlbmNlcyB0bworICogYmUgcGFydGlhbGx5IHJlc3BlY3RlZC4gKFRoaXMgb25seSBoYXMgYW4gZWZmZWN0IHdpdGgKKyAqIFNTTF9PUF9DSVBIRVJfU0VSVkVSX1BSRUZFUkVOQ0UpLgorICoKKyAqIFRoZSBlcXVhbC1wcmVmZXJlbmNlIGdyb3VwcyBhcmUgZXhwcmVzc2VkIGJ5IGdyb3VwaW5nIFNTTF9DSVBIRVJzIHRvZ2V0aGVyLgorICogQWxsIGVsZW1lbnRzIG9mIGEgZ3JvdXAgaGF2ZSB0aGUgc2FtZSBwcmlvcml0eTogbm8gb3JkZXJpbmcgaXMgZXhwcmVzc2VkCisgKiB3aXRoaW4gYSBncm91cC4KKyAqCisgKiBUaGUgdmFsdWVzIGluIHxjaXBoZXJzfCBhcmUgaW4gb25lLXRvLW9uZSBjb3JyZXNwb25kZW5jZSB3aXRoCisgKiB8aW5fZ3JvdXBfZmxhZ3N8LiAoVGhhdCBpcywgc2tfU1NMX0NJUEhFUl9udW0oY2lwaGVycykgaXMgdGhlIG51bWJlciBvZgorICogYnl0ZXMgaW4gfGluX2dyb3VwX2ZsYWdzfC4pIFRoZSBieXRlcyBpbiB8aW5fZ3JvdXBfZmxhZ3N8IGFyZSBlaXRoZXIgMSwgdG8KKyAqIGluZGljYXRlIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgU1NMX0NJUEhFUiBpcyBub3QgdGhlIGxhc3QgZWxlbWVudCBvZiBhCisgKiBncm91cCwgb3IgMCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzLgorICoKKyAqIEZvciBleGFtcGxlLCBpZiB8aW5fZ3JvdXBfZmxhZ3N8IGNvbnRhaW5zIGFsbCB6ZXJvcyB0aGVuIHRoYXQgaW5kaWNhdGVzIGEKKyAqIHRyYWRpdGlvbmFsLCBmdWxseS1vcmRlcmVkIHByZWZlcmVuY2UuIEV2ZXJ5IFNTTF9DSVBIRVIgaXMgdGhlIGxhc3QgZWxlbWVudAorICogb2YgdGhlIGdyb3VwIChpLmUuIHRoZXkgYXJlIGFsbCBpbiBhIG9uZS1lbGVtZW50IGdyb3VwKS4KKyAqCisgKiBGb3IgYSBtb3JlIGNvbXBsZXggZXhhbXBsZSwgY29uc2lkZXI6CisgKiAgIGNpcGhlcnM6ICAgICAgICBBICBCICBDICBEICBFICBGCisgKiAgIGluX2dyb3VwX2ZsYWdzOiAxICAxICAwICAwICAxICAwCisgKgorICogVGhhdCB3b3VsZCBleHByZXNzIHRoZSBmb2xsb3dpbmcsIG9yZGVyOgorICoKKyAqICAgIEEgICAgICAgICBFCisgKiAgICBCIC0+IEQgLT4gRgorICogICAgQworICovCitzdHJ1Y3Qgc3NsX2NpcGhlcl9wcmVmZXJlbmNlX2xpc3Rfc3QgeworICBTVEFDS19PRihTU0xfQ0lQSEVSKSAqY2lwaGVyczsKKyAgdWludDhfdCAqaW5fZ3JvdXBfZmxhZ3M7Cit9OworCitzdHJ1Y3Qgc3NsX2N0eF9zdCB7CisgIGNvbnN0IFNTTF9QUk9UT0NPTF9NRVRIT0QgKm1ldGhvZDsKKworICAvKiBsb2NrIGlzIHVzZWQgdG8gcHJvdGVjdCB2YXJpb3VzIG9wZXJhdGlvbnMgb24gdGhpcyBvYmplY3QuICovCisgIENSWVBUT19NVVRFWCBsb2NrOworCisgIC8qIG1heF92ZXJzaW9uIGlzIHRoZSBtYXhpbXVtIGFjY2VwdGFibGUgcHJvdG9jb2wgdmVyc2lvbi4gSWYgemVybywgdGhlCisgICAqIG1heGltdW0gc3VwcG9ydGVkIHZlcnNpb24sIGN1cnJlbnRseSAoRClUTFMgMS4yLCBpcyB1c2VkLiAqLworICB1aW50MTZfdCBtYXhfdmVyc2lvbjsKKworICAvKiBtaW5fdmVyc2lvbiBpcyB0aGUgbWluaW11bSBhY2NlcHRhYmxlIHByb3RvY2wgdmVyc2lvbi4gSWYgemVybywgdGhlCisgICAqIG1pbmltdW0gc3VwcG9ydGVkIHZlcnNpb24sIGN1cnJlbnRseSBTU0wgMy4wIGFuZCBEVExTIDEuMCwgaXMgdXNlZCAqLworICB1aW50MTZfdCBtaW5fdmVyc2lvbjsKKworICBzdHJ1Y3Qgc3NsX2NpcGhlcl9wcmVmZXJlbmNlX2xpc3Rfc3QgKmNpcGhlcl9saXN0OworICAvKiBzYW1lIGFzIGFib3ZlIGJ1dCBzb3J0ZWQgZm9yIGxvb2t1cCAqLworICBTVEFDS19PRihTU0xfQ0lQSEVSKSAqY2lwaGVyX2xpc3RfYnlfaWQ7CisgIC8qIGNpcGhlcl9saXN0X3RsczExIGlzIHRoZSBsaXN0IG9mIGNpcGhlcnMgd2hlbiBUTFMgMS4xIG9yIGdyZWF0ZXIgaXMgaW4KKyAgICogdXNlLiBUaGlzIG9ubHkgYXBwbGllcyB0byBzZXJ2ZXIgY29ubmVjdGlvbnMgYXMsIGZvciBjbGllbnRzLCB0aGUgdmVyc2lvbgorICAgKiBudW1iZXIgaXMga25vd24gYXQgY29ubmVjdCB0aW1lIGFuZCBzbyB0aGUgY2lwaGVyIGxpc3QgY2FuIGJlIHNldCB0aGVuLiAqLworICBzdHJ1Y3Qgc3NsX2NpcGhlcl9wcmVmZXJlbmNlX2xpc3Rfc3QgKmNpcGhlcl9saXN0X3RsczExOworCisgIFg1MDlfU1RPUkUgKmNlcnRfc3RvcmU7CisgIExIQVNIX09GKFNTTF9TRVNTSU9OKSAqc2Vzc2lvbnM7CisgIC8qIE1vc3Qgc2Vzc2lvbi1pZHMgdGhhdCB3aWxsIGJlIGNhY2hlZCwgZGVmYXVsdCBpcworICAgKiBTU0xfU0VTU0lPTl9DQUNIRV9NQVhfU0laRV9ERUZBVUxULiAwIGlzIHVubGltaXRlZC4gKi8KKyAgdW5zaWduZWQgbG9uZyBzZXNzaW9uX2NhY2hlX3NpemU7CisgIFNTTF9TRVNTSU9OICpzZXNzaW9uX2NhY2hlX2hlYWQ7CisgIFNTTF9TRVNTSU9OICpzZXNzaW9uX2NhY2hlX3RhaWw7CisKKyAgLyogaGFuZHNoYWtlc19zaW5jZV9jYWNoZV9mbHVzaCBpcyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgaGFuZHNoYWtlcyBzaW5jZQorICAgKiB0aGUgbGFzdCBjYWNoZSBmbHVzaC4gKi8KKyAgaW50IGhhbmRzaGFrZXNfc2luY2VfY2FjaGVfZmx1c2g7CisKKyAgLyogVGhpcyBjYW4gaGF2ZSBvbmUgb2YgMiB2YWx1ZXMsIG9yZWQgdG9nZXRoZXIsCisgICAqIFNTTF9TRVNTX0NBQ0hFX0NMSUVOVCwKKyAgICogU1NMX1NFU1NfQ0FDSEVfU0VSVkVSLAorICAgKiBEZWZhdWx0IGlzIFNTTF9TRVNTSU9OX0NBQ0hFX1NFUlZFUiwgd2hpY2ggbWVhbnMgb25seQorICAgKiBTU0xfYWNjZXB0IHdoaWNoIGNhY2hlIFNTTF9TRVNTSU9OUy4gKi8KKyAgaW50IHNlc3Npb25fY2FjaGVfbW9kZTsKKworICAvKiBJZiB0aW1lb3V0IGlzIG5vdCAwLCBpdCBpcyB0aGUgZGVmYXVsdCB0aW1lb3V0IHZhbHVlIHNldCB3aGVuIFNTTF9uZXcoKSBpcworICAgKiBjYWxsZWQuICBUaGlzIGhhcyBiZWVuIHB1dCBpbiB0byBtYWtlIGxpZmUgZWFzaWVyIHRvIHNldCB0aGluZ3MgdXAgKi8KKyAgbG9uZyBzZXNzaW9uX3RpbWVvdXQ7CisKKyAgLyogSWYgdGhpcyBjYWxsYmFjayBpcyBub3QgbnVsbCwgaXQgd2lsbCBiZSBjYWxsZWQgZWFjaCB0aW1lIGEgc2Vzc2lvbiBpZCBpcworICAgKiBhZGRlZCB0byB0aGUgY2FjaGUuICBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMSwgaXQgbWVhbnMgdGhhdCB0aGUKKyAgICogY2FsbGJhY2sgd2lsbCBkbyBhIFNTTF9TRVNTSU9OX2ZyZWUoKSB3aGVuIGl0IGhhcyBmaW5pc2hlZCB1c2luZyBpdC4KKyAgICogT3RoZXJ3aXNlLCBvbiAwLCBpdCBtZWFucyB0aGUgY2FsbGJhY2sgaGFzIGZpbmlzaGVkIHdpdGggaXQuIElmCisgICAqIHJlbW92ZV9zZXNzaW9uX2NiIGlzIG5vdCBudWxsLCBpdCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgc2Vzc2lvbi1pZCBpcworICAgKiByZW1vdmVkIGZyb20gdGhlIGNhY2hlLiAgQWZ0ZXIgdGhlIGNhbGwsIE9wZW5TU0wgd2lsbCBTU0xfU0VTU0lPTl9mcmVlKCkKKyAgICogaXQuICovCisgIGludCAoKm5ld19zZXNzaW9uX2NiKShTU0wgKnNzbCwgU1NMX1NFU1NJT04gKnNlc3MpOworICB2b2lkICgqcmVtb3ZlX3Nlc3Npb25fY2IpKFNTTF9DVFggKmN0eCwgU1NMX1NFU1NJT04gKnNlc3MpOworICBTU0xfU0VTU0lPTiAqKCpnZXRfc2Vzc2lvbl9jYikoU1NMICpzc2wsIHVpbnQ4X3QgKmRhdGEsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmNvcHkpOworCisgIENSWVBUT19yZWZjb3VudF90IHJlZmVyZW5jZXM7CisKKyAgLyogaWYgZGVmaW5lZCwgdGhlc2Ugb3ZlcnJpZGUgdGhlIFg1MDlfdmVyaWZ5X2NlcnQoKSBjYWxscyAqLworICBpbnQgKCphcHBfdmVyaWZ5X2NhbGxiYWNrKShYNTA5X1NUT1JFX0NUWCAqLCB2b2lkICopOworICB2b2lkICphcHBfdmVyaWZ5X2FyZzsKKyAgLyogYmVmb3JlIE9wZW5TU0wgMC45LjcsICdhcHBfdmVyaWZ5X2FyZycgd2FzIGlnbm9yZWQgKCdhcHBfdmVyaWZ5X2NhbGxiYWNrJworICAgKiB3YXMgY2FsbGVkIHdpdGgganVzdCBvbmUgYXJndW1lbnQpICovCisKKyAgLyogRGVmYXVsdCBwYXNzd29yZCBjYWxsYmFjay4gKi8KKyAgcGVtX3Bhc3N3b3JkX2NiICpkZWZhdWx0X3Bhc3N3ZF9jYWxsYmFjazsKKworICAvKiBEZWZhdWx0IHBhc3N3b3JkIGNhbGxiYWNrIHVzZXIgZGF0YS4gKi8KKyAgdm9pZCAqZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2tfdXNlcmRhdGE7CisKKyAgLyogZ2V0IGNsaWVudCBjZXJ0IGNhbGxiYWNrICovCisgIGludCAoKmNsaWVudF9jZXJ0X2NiKShTU0wgKnNzbCwgWDUwOSAqKng1MDksIEVWUF9QS0VZICoqcGtleSk7CisKKyAgLyogZ2V0IGNoYW5uZWwgaWQgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKmNoYW5uZWxfaWRfY2IpKFNTTCAqc3NsLCBFVlBfUEtFWSAqKnBrZXkpOworCisgIENSWVBUT19FWF9EQVRBIGV4X2RhdGE7CisKKyAgU1RBQ0tfT0YoWDUwOSkgKmV4dHJhX2NlcnRzOworCisKKyAgLyogRGVmYXVsdCB2YWx1ZXMgdXNlZCB3aGVuIG5vIHBlci1TU0wgdmFsdWUgaXMgZGVmaW5lZCBmb2xsb3cgKi8KKworICB2b2lkICgqaW5mb19jYWxsYmFjaykoY29uc3QgU1NMICpzc2wsIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbCk7IC8qIHVzZWQgaWYgU1NMJ3MgaW5mb19jYWxsYmFjayBpcyBOVUxMICovCisKKyAgLyogd2hhdCB3ZSBwdXQgaW4gY2xpZW50IGNlcnQgcmVxdWVzdHMgKi8KKyAgU1RBQ0tfT0YoWDUwOV9OQU1FKSAqY2xpZW50X0NBOworCisKKyAgLyogRGVmYXVsdCB2YWx1ZXMgdG8gdXNlIGluIFNTTCBzdHJ1Y3R1cmVzIGZvbGxvdyAodGhlc2UgYXJlIGNvcGllZCBieQorICAgKiBTU0xfbmV3KSAqLworCisgIHVpbnQzMl90IG9wdGlvbnM7CisgIHVpbnQzMl90IG1vZGU7CisgIHVpbnQzMl90IG1heF9jZXJ0X2xpc3Q7CisKKyAgc3RydWN0IGNlcnRfc3QgLyogQ0VSVCAqLyAqY2VydDsKKworICAvKiBjYWxsYmFjayB0aGF0IGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gcGVlayBhdCBwcm90b2NvbCBtZXNzYWdlcyAqLworICB2b2lkICgqbXNnX2NhbGxiYWNrKShpbnQgd3JpdGVfcCwgaW50IHZlcnNpb24sIGludCBjb250ZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgU1NMICpzc2wsIHZvaWQgKmFyZyk7CisgIHZvaWQgKm1zZ19jYWxsYmFja19hcmc7CisKKyAgaW50IHZlcmlmeV9tb2RlOworICB1bnNpZ25lZCBpbnQgc2lkX2N0eF9sZW5ndGg7CisgIHVpbnQ4X3Qgc2lkX2N0eFtTU0xfTUFYX1NJRF9DVFhfTEVOR1RIXTsKKyAgaW50ICgqZGVmYXVsdF92ZXJpZnlfY2FsbGJhY2spKAorICAgICAgaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqY3R4KTsgLyogY2FsbGVkICd2ZXJpZnlfY2FsbGJhY2snIGluIHRoZSBTU0wgKi8KKworICAvKiBEZWZhdWx0IGdlbmVyYXRlIHNlc3Npb24gSUQgY2FsbGJhY2suICovCisgIEdFTl9TRVNTSU9OX0NCIGdlbmVyYXRlX3Nlc3Npb25faWQ7CisKKyAgWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtOworCisgIC8qIHNlbGVjdF9jZXJ0aWZpY2F0ZV9jYiBpcyBjYWxsZWQgYmVmb3JlIG1vc3QgQ2xpZW50SGVsbG8gcHJvY2Vzc2luZyBhbmQKKyAgICogYmVmb3JlIHRoZSBkZWNpc2lvbiB3aGV0aGVyIHRvIHJlc3VtZSBhIHNlc3Npb24gaXMgbWFkZS4gSXQgbWF5IHJldHVybiBvbmUKKyAgICogdG8gY29udGludWUgdGhlIGhhbmRzaGFrZSBvciB6ZXJvIHRvIGNhdXNlIHRoZSBoYW5kc2hha2UgbG9vcCB0byByZXR1cm4KKyAgICogd2l0aCBhbiBlcnJvciBhbmQgY2F1c2UgU1NMX2dldF9lcnJvciB0byByZXR1cm4KKyAgICogU1NMX0VSUk9SX1BFTkRJTkdfQ0VSVElGSUNBVEUuIE5vdGU6IHdoZW4gdGhlIGhhbmRzaGFrZSBsb29wIGlzIHJlc3VtZWQsIGl0CisgICAqIHdpbGwgbm90IGNhbGwgdGhlIGNhbGxiYWNrIGEgc2Vjb25kIHRpbWUuICovCisgIGludCAoKnNlbGVjdF9jZXJ0aWZpY2F0ZV9jYikoY29uc3Qgc3RydWN0IHNzbF9lYXJseV9jYWxsYmFja19jdHggKik7CisKKyAgLyogZG9zX3Byb3RlY3Rpb25fY2IgaXMgY2FsbGVkIG9uY2UgdGhlIHJlc3VtcHRpb24gZGVjaXNpb24gZm9yIGEgQ2xpZW50SGVsbG8KKyAgICogaGFzIGJlZW4gbWFkZS4gSXQgcmV0dXJucyBvbmUgdG8gY29udGludWUgdGhlIGhhbmRzaGFrZSBvciB6ZXJvIHRvCisgICAqIGFib3J0LiAqLworICBpbnQgKCpkb3NfcHJvdGVjdGlvbl9jYikgKGNvbnN0IHN0cnVjdCBzc2xfZWFybHlfY2FsbGJhY2tfY3R4ICopOworCisgIC8qIHF1aWV0X3NodXRkb3duIGlzIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIG5vdCBzZW5kIGEgY2xvc2Vfbm90aWZ5IG9uCisgICAqIHNodXRkb3duLiAqLworICBpbnQgcXVpZXRfc2h1dGRvd247CisKKyAgLyogTWF4aW11bSBhbW91bnQgb2YgZGF0YSB0byBzZW5kIGluIG9uZSBmcmFnbWVudC4gYWN0dWFsIHJlY29yZCBzaXplIGNhbiBiZQorICAgKiBtb3JlIHRoYW4gdGhpcyBkdWUgdG8gcGFkZGluZyBhbmQgTUFDIG92ZXJoZWFkcy4gKi8KKyAgdWludDE2X3QgbWF4X3NlbmRfZnJhZ21lbnQ7CisKKyAgLyogVExTIGV4dGVuc2lvbnMgc2VydmVybmFtZSBjYWxsYmFjayAqLworICBpbnQgKCp0bHNleHRfc2VydmVybmFtZV9jYWxsYmFjaykoU1NMICosIGludCAqLCB2b2lkICopOworICB2b2lkICp0bHNleHRfc2VydmVybmFtZV9hcmc7CisgIC8qIFJGQyA0NTA3IHNlc3Npb24gdGlja2V0IGtleXMgKi8KKyAgdWludDhfdCB0bHNleHRfdGlja19rZXlfbmFtZVsxNl07CisgIHVpbnQ4X3QgdGxzZXh0X3RpY2tfaG1hY19rZXlbMTZdOworICB1aW50OF90IHRsc2V4dF90aWNrX2Flc19rZXlbMTZdOworICAvKiBDYWxsYmFjayB0byBzdXBwb3J0IGN1c3RvbWlzYXRpb24gb2YgdGlja2V0IGtleSBzZXR0aW5nICovCisgIGludCAoKnRsc2V4dF90aWNrZXRfa2V5X2NiKShTU0wgKnNzbCwgdWludDhfdCAqbmFtZSwgdWludDhfdCAqaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlBfQ0lQSEVSX0NUWCAqZWN0eCwgSE1BQ19DVFggKmhjdHgsIGludCBlbmMpOworCisgIC8qIFNlcnZlci1vbmx5OiBwc2tfaWRlbnRpdHlfaGludCBpcyB0aGUgZGVmYXVsdCBpZGVudGl0eSBoaW50IHRvIHNlbmQgaW4KKyAgICogUFNLLWJhc2VkIGtleSBleGNoYW5nZXMuICovCisgIGNoYXIgKnBza19pZGVudGl0eV9oaW50OworCisgIHVuc2lnbmVkIGludCAoKnBza19jbGllbnRfY2FsbGJhY2spKFNTTCAqc3NsLCBjb25zdCBjaGFyICpoaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICppZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1heF9pZGVudGl0eV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBzaywgdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKTsKKyAgdW5zaWduZWQgaW50ICgqcHNrX3NlcnZlcl9jYWxsYmFjaykoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmlkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwc2ssIHVuc2lnbmVkIGludCBtYXhfcHNrX2xlbik7CisKKworICAvKiByZXRhaW5fb25seV9zaGEyNTZfb2ZfY2xpZW50X2NlcnRzIGlzIHRydWUgaWYgd2Ugc2hvdWxkIGNvbXB1dGUgdGhlIFNIQTI1NgorICAgKiBoYXNoIG9mIHRoZSBwZWVyJ3MgY2VydGlmaWF0ZSBhbmQgdGhlbiBkaXNjYXJkIGl0IHRvIHNhdmUgbWVtb3J5IGFuZAorICAgKiBzZXNzaW9uIHNwYWNlLiBPbmx5IGVmZmVjdGl2ZSBvbiB0aGUgc2VydmVyIHNpZGUuICovCisgIGNoYXIgcmV0YWluX29ubHlfc2hhMjU2X29mX2NsaWVudF9jZXJ0czsKKworICAvKiBOZXh0IHByb3RvY29sIG5lZ290aWF0aW9uIGluZm9ybWF0aW9uICovCisgIC8qIChmb3IgZXhwZXJpbWVudGFsIE5QTiBleHRlbnNpb24pLiAqLworCisgIC8qIEZvciBhIHNlcnZlciwgdGhpcyBjb250YWlucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGJ5IHdoaWNoIHRoZSBzZXQgb2YKKyAgICogYWR2ZXJ0aXNlZCBwcm90b2NvbHMgY2FuIGJlIHByb3ZpZGVkLiAqLworICBpbnQgKCpuZXh0X3Byb3Rvc19hZHZlcnRpc2VkX2NiKShTU0wgKnMsIGNvbnN0IHVpbnQ4X3QgKipidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbGVuLCB2b2lkICphcmcpOworICB2b2lkICpuZXh0X3Byb3Rvc19hZHZlcnRpc2VkX2NiX2FyZzsKKyAgLyogRm9yIGEgY2xpZW50LCB0aGlzIGNvbnRhaW5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBzZWxlY3RzIHRoZQorICAgKiBuZXh0IHByb3RvY29sIGZyb20gdGhlIGxpc3QgcHJvdmlkZWQgYnkgdGhlIHNlcnZlci4gKi8KKyAgaW50ICgqbmV4dF9wcm90b19zZWxlY3RfY2IpKFNTTCAqcywgdWludDhfdCAqKm91dCwgdWludDhfdCAqb3V0bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHVuc2lnbmVkIGludCBpbmxlbiwgdm9pZCAqYXJnKTsKKyAgdm9pZCAqbmV4dF9wcm90b19zZWxlY3RfY2JfYXJnOworCisgIC8qIEFMUE4gaW5mb3JtYXRpb24KKyAgICogKHdlIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiB0cmFuc2l0aW9uaW5nIGZyb20gTlBOIHRvIEFMUE4uKSAqLworCisgIC8qIEZvciBhIHNlcnZlciwgdGhpcyBjb250YWlucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIHRoZQorICAgKiBzZXJ2ZXIgdG8gc2VsZWN0IHRoZSBwcm90b2NvbCBmb3IgdGhlIGNvbm5lY3Rpb24uCisgICAqICAgb3V0OiBvbiBzdWNjZXNzZnVsIHJldHVybiwgdGhpcyBtdXN0IHBvaW50IHRvIHRoZSByYXcgcHJvdG9jb2wKKyAgICogICAgICAgIG5hbWUgKHdpdGhvdXQgdGhlIGxlbmd0aCBwcmVmaXgpLgorICAgKiAgIG91dGxlbjogb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoaXMgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB8Km91dHwuCisgICAqICAgaW46IHBvaW50cyB0byB0aGUgY2xpZW50J3MgbGlzdCBvZiBzdXBwb3J0ZWQgcHJvdG9jb2xzIGluCisgICAqICAgICAgIHdpcmUtZm9ybWF0LgorICAgKiAgIGlubGVuOiB0aGUgbGVuZ3RoIG9mIHxpbnwuICovCisgIGludCAoKmFscG5fc2VsZWN0X2NiKShTU0wgKnMsIGNvbnN0IHVpbnQ4X3QgKipvdXQsIHVpbnQ4X3QgKm91dGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCB1bnNpZ25lZCBpbnQgaW5sZW4sIHZvaWQgKmFyZyk7CisgIHZvaWQgKmFscG5fc2VsZWN0X2NiX2FyZzsKKworICAvKiBGb3IgYSBjbGllbnQsIHRoaXMgY29udGFpbnMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHByb3RvY29scyBpbiB3aXJlCisgICAqIGZvcm1hdC4gKi8KKyAgdWludDhfdCAqYWxwbl9jbGllbnRfcHJvdG9fbGlzdDsKKyAgdW5zaWduZWQgYWxwbl9jbGllbnRfcHJvdG9fbGlzdF9sZW47CisKKyAgLyogU1JUUCBwcm9maWxlcyB3ZSBhcmUgd2lsbGluZyB0byBkbyBmcm9tIFJGQyA1NzY0ICovCisgIFNUQUNLX09GKFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFKSAqc3J0cF9wcm9maWxlczsKKworICAvKiBFQyBleHRlbnNpb24gdmFsdWVzIGluaGVyaXRlZCBieSBTU0wgc3RydWN0dXJlICovCisgIHNpemVfdCB0bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoOworICB1aW50OF90ICp0bHNleHRfZWNwb2ludGZvcm1hdGxpc3Q7CisgIHNpemVfdCB0bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoOworICB1aW50MTZfdCAqdGxzZXh0X2VsbGlwdGljY3VydmVsaXN0OworCisgIC8qIElmIHRydWUsIGEgY2xpZW50IHdpbGwgYWR2ZXJ0aXNlIHRoZSBDaGFubmVsIElEIGV4dGVuc2lvbiBhbmQgYSBzZXJ2ZXIKKyAgICogd2lsbCBlY2hvIGl0LiAqLworICBjaGFyIHRsc2V4dF9jaGFubmVsX2lkX2VuYWJsZWQ7CisgIC8qIHRsc2V4dF9jaGFubmVsX2lkX2VuYWJsZWRfbmV3IGlzIGEgaGFjayB0byBzdXBwb3J0IGJvdGggb2xkIGFuZCBuZXcKKyAgICogQ2hhbm5lbElEIHNpZ25hdHVyZXMuIEl0IGluZGljYXRlcyB0aGF0IGEgY2xpZW50IHNob3VsZCBhZHZlcnRpc2UgdGhlIG5ldworICAgKiBDaGFubmVsSUQgZXh0ZW5zaW9uIG51bWJlci4gKi8KKyAgY2hhciB0bHNleHRfY2hhbm5lbF9pZF9lbmFibGVkX25ldzsKKyAgLyogVGhlIGNsaWVudCdzIENoYW5uZWwgSUQgcHJpdmF0ZSBrZXkuICovCisgIEVWUF9QS0VZICp0bHNleHRfY2hhbm5lbF9pZF9wcml2YXRlOworCisgIC8qIElmIHRydWUsIGEgY2xpZW50IHdpbGwgcmVxdWVzdCBjZXJ0aWZpY2F0ZSB0aW1lc3RhbXBzLiAqLworICBjaGFyIHNpZ25lZF9jZXJ0X3RpbWVzdGFtcHNfZW5hYmxlZDsKKworICAvKiBJZiB0cnVlLCBhIGNsaWVudCB3aWxsIHJlcXVlc3QgYSBzdGFwbGVkIE9DU1AgcmVzcG9uc2UuICovCisgIGNoYXIgb2NzcF9zdGFwbGluZ19lbmFibGVkOworCisgIC8qIElmIG5vdCBOVUxMLCBzZXNzaW9uIGtleSBtYXRlcmlhbCB3aWxsIGJlIGxvZ2dlZCB0byB0aGlzIEJJTyBmb3IgZGVidWdnaW5nCisgICAqIHB1cnBvc2VzLiBUaGUgZm9ybWF0IG1hdGNoZXMgTlNTJ3MgYW5kIGlzIHJlYWRhYmxlIGJ5IFdpcmVzaGFyay4gKi8KKyAgQklPICprZXlsb2dfYmlvOworCisgIC8qIGN1cnJlbnRfdGltZV9jYiwgaWYgbm90IE5VTEwsIGlzIHRoZSBmdW5jdGlvbiB0byB1c2UgdG8gZ2V0IHRoZSBjdXJyZW50CisgICAqIHRpbWUuIEl0IHNldHMgfCpvdXRfY2xvY2t8IHRvIHRoZSBjdXJyZW50IHRpbWUuICovCisgIHZvaWQgKCpjdXJyZW50X3RpbWVfY2IpKGNvbnN0IFNTTCAqc3NsLCBzdHJ1Y3QgdGltZXZhbCAqb3V0X2Nsb2NrKTsKK307CisKK09QRU5TU0xfRVhQT1JUIExIQVNIX09GKFNTTF9TRVNTSU9OKSAqU1NMX0NUWF9zZXNzaW9ucyhTU0xfQ1RYICpjdHgpOworCisvKiBTU0xfQ1RYX3Nlc3NfbnVtYmVyIHJldHVybnMgdGhlIG51bWJlciBvZiBzZXNzaW9ucyBpbiB8Y3R4fCdzIGludGVybmFsCisgKiBzZXNzaW9uIGNhY2hlLiAqLworT1BFTlNTTF9FWFBPUlQgc2l6ZV90IFNTTF9DVFhfc2Vzc19udW1iZXIoY29uc3QgU1NMX0NUWCAqY3R4KTsKKworT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfQ1RYX3Nlc3Nfc2V0X25ld19jYigKKyAgICBTU0xfQ1RYICpjdHgsIGludCAoKm5ld19zZXNzaW9uX2NiKShTU0wgKnNzbCwgU1NMX1NFU1NJT04gKnNlc3MpKTsKK09QRU5TU0xfRVhQT1JUIGludCAoKlNTTF9DVFhfc2Vzc19nZXRfbmV3X2NiKFNTTF9DVFggKmN0eCkpKFNTTCAqc3NsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1NFU1NJT04gKnNlc3MpOworT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfQ1RYX3Nlc3Nfc2V0X3JlbW92ZV9jYigKKyAgICBTU0xfQ1RYICpjdHgsCisgICAgdm9pZCAoKnJlbW92ZV9zZXNzaW9uX2NiKShTU0xfQ1RYICpjdHgsIFNTTF9TRVNTSU9OICpzZXNzKSk7CitPUEVOU1NMX0VYUE9SVCB2b2lkICgqU1NMX0NUWF9zZXNzX2dldF9yZW1vdmVfY2IoU1NMX0NUWCAqY3R4KSkoCisgICAgU1NMX0NUWCAqY3R4LCBTU0xfU0VTU0lPTiAqc2Vzcyk7CitPUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2Vzc19zZXRfZ2V0X2NiKAorICAgIFNTTF9DVFggKmN0eCwKKyAgICBTU0xfU0VTU0lPTiAqKCpnZXRfc2Vzc2lvbl9jYikoU1NMICpzc2wsIHVpbnQ4X3QgKmRhdGEsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY29weSkpOworT1BFTlNTTF9FWFBPUlQgU1NMX1NFU1NJT04gKigqU1NMX0NUWF9zZXNzX2dldF9nZXRfY2IoU1NMX0NUWCAqY3R4KSkoCisgICAgU1NMICpzc2wsIHVpbnQ4X3QgKmRhdGEsIGludCBsZW4sIGludCAqY29weSk7CisvKiBTU0xfbWFnaWNfcGVuZGluZ19zZXNzaW9uX3B0ciByZXR1cm5zIGEgbWFnaWMgU1NMX1NFU1NJT04qIHdoaWNoIGluZGljYXRlcworICogdGhhdCB0aGUgc2Vzc2lvbiBpc24ndCBjdXJyZW50bHkgdW5hdmFpbGFibGUuIFNTTF9nZXRfZXJyb3Igd2lsbCB0aGVuIHJldHVybgorICogU1NMX0VSUk9SX1BFTkRJTkdfU0VTU0lPTiBhbmQgdGhlIGhhbmRzaGFrZSBjYW4gYmUgcmV0cmllZCBsYXRlciB3aGVuIHRoZQorICogbG9va3VwIGhhcyBjb21wbGV0ZWQuICovCitPUEVOU1NMX0VYUE9SVCBTU0xfU0VTU0lPTiAqU1NMX21hZ2ljX3BlbmRpbmdfc2Vzc2lvbl9wdHIodm9pZCk7CiBPUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2V0X2luZm9fY2FsbGJhY2soU1NMX0NUWCAqY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpjYikoY29uc3QgU1NMICpzc2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgaW50IHZhbCkpOwpAQCAtMjM0Myw2ICsxMTMyLDExIEBACiBPUEVOU1NMX0VYUE9SVCBpbnQgKCpTU0xfQ1RYX2dldF9jbGllbnRfY2VydF9jYihTU0xfQ1RYICpjdHgpKShTU0wgKnNzbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDkgKip4NTA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1BLRVkgKipwa2V5KTsKK09QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX0NUWF9zZXRfY2hhbm5lbF9pZF9jYigKKyAgICBTU0xfQ1RYICpjdHgsIHZvaWQgKCpjaGFubmVsX2lkX2NiKShTU0wgKnNzbCwgRVZQX1BLRVkgKipwa2V5KSk7CitPUEVOU1NMX0VYUE9SVCB2b2lkICgqU1NMX0NUWF9nZXRfY2hhbm5lbF9pZF9jYihTU0xfQ1RYICpjdHgpKShTU0wgKnNzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9QS0VZICoqcGtleSk7CisKIC8qIFNTTF9lbmFibGVfc2lnbmVkX2NlcnRfdGltZXN0YW1wcyBjYXVzZXMgfHNzbHwgKHdoaWNoIG11c3QgYmUgdGhlIGNsaWVudCBlbmQKICAqIG9mIGEgY29ubmVjdGlvbikgdG8gcmVxdWVzdCBTQ1RzIGZyb20gdGhlIHNlcnZlci4gU2VlCiAgKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjk2Mi4gSXQgcmV0dXJucyBvbmUuICovCkBAIC0yMzgxLDEyICsxMTc1LDk0IEBACiBPUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9nZXQwX29jc3BfcmVzcG9uc2UoY29uc3QgU1NMICpzc2wsIGNvbnN0IHVpbnQ4X3QgKipvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpvdXRfbGVuKTsKIAorT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfQ1RYX3NldF9uZXh0X3Byb3Rvc19hZHZlcnRpc2VkX2NiKAorICAgIFNTTF9DVFggKnMsCisgICAgaW50ICgqY2IpKFNTTCAqc3NsLCBjb25zdCB1aW50OF90ICoqb3V0LCB1bnNpZ25lZCBpbnQgKm91dGxlbiwgdm9pZCAqYXJnKSwKKyAgICB2b2lkICphcmcpOworT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfQ1RYX3NldF9uZXh0X3Byb3RvX3NlbGVjdF9jYigKKyAgICBTU0xfQ1RYICpzLCBpbnQgKCpjYikoU1NMICpzc2wsIHVpbnQ4X3QgKipvdXQsIHVpbnQ4X3QgKm91dGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHVuc2lnbmVkIGludCBpbmxlbiwgdm9pZCAqYXJnKSwKKyAgICB2b2lkICphcmcpOworT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfZ2V0MF9uZXh0X3Byb3RvX25lZ290aWF0ZWQoY29uc3QgU1NMICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqbGVuKTsKKworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9zZWxlY3RfbmV4dF9wcm90byh1aW50OF90ICoqb3V0LCB1aW50OF90ICpvdXRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCB1bnNpZ25lZCBpbnQgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNsaWVudF9sZW4pOworCisjZGVmaW5lIE9QRU5TU0xfTlBOX1VOU1VQUE9SVEVEIDAKKyNkZWZpbmUgT1BFTlNTTF9OUE5fTkVHT1RJQVRFRCAxCisjZGVmaW5lIE9QRU5TU0xfTlBOX05PX09WRVJMQVAgMgorCisvKiBTU0xfQ1RYX3NldF9hbHBuX3Byb3RvcyBzZXRzIHRoZSBBTFBOIHByb3RvY29sIGxpc3Qgb24gfGN0eHwgdG8gfHByb3Rvc3wuCisgKiB8cHJvdG9zfCBtdXN0IGJlIGluIHdpcmUtZm9ybWF0IChpLmUuIGEgc2VyaWVzIG9mIG5vbi1lbXB0eSwgOC1iaXQKKyAqIGxlbmd0aC1wcmVmaXhlZCBzdHJpbmdzKS4gSXQgcmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MgYW5kIG9uZSBvbiBmYWlsdXJlLgorICoKKyAqIFdBUk5JTkc6IHRoaXMgZnVuY3Rpb24gaXMgZGFuZ2Vyb3VzIGJlY2F1c2UgaXQgYnJlYWtzIHRoZSB1c3VhbCByZXR1cm4gdmFsdWUKKyAqIGNvbnZlbnRpb24uICovCitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9zZXRfYWxwbl9wcm90b3MoU1NMX0NUWCAqY3R4LCBjb25zdCB1aW50OF90ICpwcm90b3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcHJvdG9zX2xlbik7CisKKy8qIFNTTF9zZXRfYWxwbl9wcm90b3Mgc2V0cyB0aGUgQUxQTiBwcm90b2NvbCBsaXN0IG9uIHxzc2x8IHRvIHxwcm90b3N8LgorICogfHByb3Rvc3wgbXVzdCBiZSBpbiB3aXJlLWZvcm1hdCAoaS5lLiBhIHNlcmllcyBvZiBub24tZW1wdHksIDgtYml0CisgKiBsZW5ndGgtcHJlZml4ZWQgc3RyaW5ncykuIEl0IHJldHVybnMgemVybyBvbiBzdWNjZXNzIGFuZCBvbmUgb24gZmFpbHVyZS4KKyAqCisgKiBXQVJOSU5HOiB0aGlzIGZ1bmN0aW9uIGlzIGRhbmdlcm91cyBiZWNhdXNlIGl0IGJyZWFrcyB0aGUgdXN1YWwgcmV0dXJuIHZhbHVlCisgKiBjb252ZW50aW9uLiAqLworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9zZXRfYWxwbl9wcm90b3MoU1NMICpzc2wsIGNvbnN0IHVpbnQ4X3QgKnByb3RvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHByb3Rvc19sZW4pOworCitPUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2V0X2FscG5fc2VsZWN0X2NiKAorICAgIFNTTF9DVFggKmN0eCwgaW50ICgqY2IpKFNTTCAqc3NsLCBjb25zdCB1aW50OF90ICoqb3V0LCB1aW50OF90ICpvdXRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHVuc2lnbmVkIGludCBpbmxlbiwgdm9pZCAqYXJnKSwKKyAgICB2b2lkICphcmcpOworT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfZ2V0MF9hbHBuX3NlbGVjdGVkKGNvbnN0IFNTTCAqc3NsLCBjb25zdCB1aW50OF90ICoqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqbGVuKTsKKworLyogU1NMX2VuYWJsZV9mYXN0cmFkaW9fcGFkZGluZyBjb250cm9scyB3aGV0aGVyIGZhc3RyYWRpbyBwYWRkaW5nIGlzIGVuYWJsZWQKKyAqIG9uIHxzc2x8LiBJZiBpdCBpcywgQ2xpZW50SGVsbG8gbWVzc2FnZXMgYXJlIHBhZGRlZCB0byAxMDI0IGJ5dGVzLiBUaGlzCisgKiBjYXVzZXMgM0cgcmFkaW9zIHRvIHN3aXRjaCB0byBEQ0ggbW9kZSAoaGlnaCBkYXRhIHJhdGUpLiAqLworT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfZW5hYmxlX2Zhc3RyYWRpb19wYWRkaW5nKFNTTCAqc3NsLCBjaGFyIG9uX29mZik7CisKIC8qIFNTTF9zZXRfcmVqZWN0X3BlZXJfcmVuZWdvdGlhdGlvbnMgY29udHJvbHMgd2hldGhlciByZW5lZ290aWF0aW9uIGF0dGVtcHRzIGJ5CiAgKiB0aGUgcGVlciBhcmUgcmVqZWN0ZWQuIEl0IG1heSBiZSBzZXQgYXQgYW55IHBvaW50IGluIGEgY29ubmVjdGlvbidzIGxpZmV0aW1lCiAgKiB0byBjb250cm9sIGZ1dHVyZSByZW5lZ290aWF0aW9ucyBwcm9ncmFtbWF0aWNhbGx5LiBCeSBkZWZhdWx0LCByZW5lZ290aWF0aW9ucwogICogYXJlIHJlamVjdGVkLiAoUmVuZWdvdGlhdGlvbnMgcmVxdWVzdGVkIGJ5IGEgY2xpZW50IGFyZSBhbHdheXMgcmVqZWN0ZWQuKSAqLwogT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfc2V0X3JlamVjdF9wZWVyX3JlbmVnb3RpYXRpb25zKFNTTCAqc3NsLCBpbnQgcmVqZWN0KTsKIAorLyogdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBidWZmZXIgZ2l2ZW4gdG8gY2FsbGJhY2tzIGNvbnRhaW5pbmcgdGhlIHJlc3VsdGluZworICogaWRlbnRpdHkvcHNrICovCisjZGVmaW5lIFBTS19NQVhfSURFTlRJVFlfTEVOIDEyOAorI2RlZmluZSBQU0tfTUFYX1BTS19MRU4gMjU2CitPUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2V0X3Bza19jbGllbnRfY2FsbGJhY2soCisgICAgU1NMX0NUWCAqY3R4LAorICAgIHVuc2lnbmVkIGludCAoKnBza19jbGllbnRfY2FsbGJhY2spKAorICAgICAgICBTU0wgKnNzbCwgY29uc3QgY2hhciAqaGludCwgY2hhciAqaWRlbnRpdHksCisgICAgICAgIHVuc2lnbmVkIGludCBtYXhfaWRlbnRpdHlfbGVuLCB1aW50OF90ICpwc2ssIHVuc2lnbmVkIGludCBtYXhfcHNrX2xlbikpOworT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfc2V0X3Bza19jbGllbnRfY2FsbGJhY2soCisgICAgU1NMICpzc2wsIHVuc2lnbmVkIGludCAoKnBza19jbGllbnRfY2FsbGJhY2spKFNTTCAqc3NsLCBjb25zdCBjaGFyICpoaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICppZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1heF9pZGVudGl0eV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKSk7CitPUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2V0X3Bza19zZXJ2ZXJfY2FsbGJhY2soCisgICAgU1NMX0NUWCAqY3R4LAorICAgIHVuc2lnbmVkIGludCAoKnBza19zZXJ2ZXJfY2FsbGJhY2spKFNTTCAqc3NsLCBjb25zdCBjaGFyICppZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKSk7CitPUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9zZXRfcHNrX3NlcnZlcl9jYWxsYmFjaygKKyAgICBTU0wgKnNzbCwKKyAgICB1bnNpZ25lZCBpbnQgKCpwc2tfc2VydmVyX2NhbGxiYWNrKShTU0wgKnNzbCwgY29uc3QgY2hhciAqaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcHNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXhfcHNrX2xlbikpOworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfdXNlX3Bza19pZGVudGl0eV9oaW50KFNTTF9DVFggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppZGVudGl0eV9oaW50KTsKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfdXNlX3Bza19pZGVudGl0eV9oaW50KFNTTCAqcywgY29uc3QgY2hhciAqaWRlbnRpdHlfaGludCk7CitPUEVOU1NMX0VYUE9SVCBjb25zdCBjaGFyICpTU0xfZ2V0X3Bza19pZGVudGl0eV9oaW50KGNvbnN0IFNTTCAqcyk7CitPUEVOU1NMX0VYUE9SVCBjb25zdCBjaGFyICpTU0xfZ2V0X3Bza19pZGVudGl0eShjb25zdCBTU0wgKnMpOworCiAjZGVmaW5lIFNTTF9OT1RISU5HIDEKICNkZWZpbmUgU1NMX1dSSVRJTkcgMgogI2RlZmluZSBTU0xfUkVBRElORyAzCkBAIC0yMzk0LDcgKzEyNzAsNiBAQAogI2RlZmluZSBTU0xfQ0hBTk5FTF9JRF9MT09LVVAgNQogI2RlZmluZSBTU0xfUEVORElOR19TRVNTSU9OIDcKICNkZWZpbmUgU1NMX0NFUlRJRklDQVRFX1NFTEVDVElPTl9QRU5ESU5HIDgKLSNkZWZpbmUgU1NMX1BSSVZBVEVfS0VZX09QRVJBVElPTiA5CiAKIC8qIFRoZXNlIHdpbGwgb25seSBiZSB1c2VkIHdoZW4gZG9pbmcgbm9uLWJsb2NraW5nIElPICovCiAjZGVmaW5lIFNTTF93YW50X25vdGhpbmcocykgKFNTTF93YW50KHMpID09IFNTTF9OT1RISU5HKQpAQCAtMjQwNSw4ICsxMjgwLDIxOSBAQAogI2RlZmluZSBTU0xfd2FudF9zZXNzaW9uKHMpIChTU0xfd2FudChzKSA9PSBTU0xfUEVORElOR19TRVNTSU9OKQogI2RlZmluZSBTU0xfd2FudF9jZXJ0aWZpY2F0ZShzKSBcCiAgIChTU0xfd2FudChzKSA9PSBTU0xfQ0VSVElGSUNBVEVfU0VMRUNUSU9OX1BFTkRJTkcpCi0jZGVmaW5lIFNTTF93YW50X3ByaXZhdGVfa2V5X29wZXJhdGlvbihzKSBcCi0gIChTU0xfd2FudChzKSA9PSBTU0xfUFJJVkFURV9LRVlfT1BFUkFUSU9OKQorCitzdHJ1Y3Qgc3NsX3N0IHsKKyAgLyogdmVyc2lvbiBpcyB0aGUgcHJvdG9jb2wgdmVyc2lvbi4gKi8KKyAgaW50IHZlcnNpb247CisKKyAgLyogbWV0aG9kIGlzIHRoZSBtZXRob2QgdGFibGUgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCBwcm90b2NvbCAoRFRMUyBvcgorICAgKiBUTFMpLiAqLworICBjb25zdCBTU0xfUFJPVE9DT0xfTUVUSE9EICptZXRob2Q7CisKKyAgLyogZW5jX21ldGhvZCBpcyB0aGUgbWV0aG9kIHRhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgcHJvdG9jb2wKKyAgICogdmVyc2lvbi4gKi8KKyAgY29uc3QgU1NMM19FTkNfTUVUSE9EICplbmNfbWV0aG9kOworCisgIC8qIG1heF92ZXJzaW9uIGlzIHRoZSBtYXhpbXVtIGFjY2VwdGFibGUgcHJvdG9jb2wgdmVyc2lvbi4gSWYgemVybywgdGhlCisgICAqIG1heGltdW0gc3VwcG9ydGVkIHZlcnNpb24sIGN1cnJlbnRseSAoRClUTFMgMS4yLCBpcyB1c2VkLiAqLworICB1aW50MTZfdCBtYXhfdmVyc2lvbjsKKworICAvKiBtaW5fdmVyc2lvbiBpcyB0aGUgbWluaW11bSBhY2NlcHRhYmxlIHByb3RvY2wgdmVyc2lvbi4gSWYgemVybywgdGhlCisgICAqIG1pbmltdW0gc3VwcG9ydGVkIHZlcnNpb24sIGN1cnJlbnRseSBTU0wgMy4wIGFuZCBEVExTIDEuMCwgaXMgdXNlZCAqLworICB1aW50MTZfdCBtaW5fdmVyc2lvbjsKKworICAvKiBUaGVyZSBhcmUgMiBCSU8ncyBldmVuIHRob3VnaCB0aGV5IGFyZSBub3JtYWxseSBib3RoIHRoZSBzYW1lLiBUaGlzIGlzIHNvCisgICAqIGRhdGEgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4gdG8gZGlmZmVyZW50IGhhbmRsZXJzICovCisKKyAgQklPICpyYmlvOyAvKiB1c2VkIGJ5IFNTTF9yZWFkICovCisgIEJJTyAqd2JpbzsgLyogdXNlZCBieSBTU0xfd3JpdGUgKi8KKyAgQklPICpiYmlvOyAvKiB1c2VkIGR1cmluZyBzZXNzaW9uLWlkIHJldXNlIHRvIGNvbmNhdGVuYXRlCisgICAgICAgICAgICAgICogbWVzc2FnZXMgKi8KKworICAvKiBUaGlzIGhvbGRzIGEgdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgd2hhdCB3ZSB3ZXJlIGRvaW5nIHdoZW4gYSAwIG9yIC0xIGlzCisgICAqIHJldHVybmVkLiAgVGhpcyBpcyBuZWVkZWQgZm9yIG5vbi1ibG9ja2luZyBJTyBzbyB3ZSBrbm93IHdoYXQgcmVxdWVzdAorICAgKiBuZWVkcyByZS1kb2luZyB3aGVuIGluIFNTTF9hY2NlcHQgb3IgU1NMX2Nvbm5lY3QgKi8KKyAgaW50IHJ3c3RhdGU7CisKKyAgLyogdHJ1ZSB3aGVuIHdlIGFyZSBhY3R1YWxseSBpbiBTU0xfYWNjZXB0KCkgb3IgU1NMX2Nvbm5lY3QoKSAqLworICBpbnQgaW5faGFuZHNoYWtlOworICBpbnQgKCpoYW5kc2hha2VfZnVuYykoU1NMICopOworCisgIC8qIEltYWdpbmUgdGhhdCBoZXJlJ3MgYSBib29sZWFuIG1lbWJlciAiaW5pdCIgdGhhdCBpcyBzd2l0Y2hlZCBhcyBzb29uIGFzCisgICAqIFNTTF9zZXRfe2FjY2VwdC9jb25uZWN0fV9zdGF0ZSBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCBzbyB0aGF0CisgICAqICJzdGF0ZSIgYW5kICJoYW5kc2hha2VfZnVuYyIgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLiAgQnV0IGFzCisgICAqIGhhbmRzaGFrZV9mdW5jIGlzID09IDAgdW50aWwgdGhlbiwgd2UgdXNlIHRoaXMgdGVzdCBpbnN0ZWFkIG9mIGFuICJpbml0IgorICAgKiBtZW1iZXIuICovCisKKyAgLyogc2VydmVyIGlzIHRydWUgaWZmIHRoZSB0aGlzIFNTTCogaXMgdGhlIHNlcnZlciBoYWxmLiBOb3RlOiBiZWZvcmUgdGhlIFNTTCoKKyAgICogaXMgaW5pdGlhbGl6ZWQgYnkgZWl0aGVyIFNTTF9zZXRfYWNjZXB0X3N0YXRlIG9yIFNTTF9zZXRfY29ubmVjdF9zdGF0ZSwKKyAgICogdGhlIHNpZGUgaXMgbm90IGRldGVybWluZWQuIEluIHRoaXMgc3RhdGUsIHNlcnZlciBpcyBhbHdheXMgZmFsc2UuICovCisgIGludCBzZXJ2ZXI7CisKKyAgLyogcXVpZXRfc2h1dGRvd24gaXMgdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBzaG91bGQgbm90IHNlbmQgYSBjbG9zZV9ub3RpZnkgb24KKyAgICogc2h1dGRvd24uICovCisgIGludCBxdWlldF9zaHV0ZG93bjsKKworICBpbnQgc2h1dGRvd247IC8qIHdlIGhhdmUgc2h1dCB0aGluZ3MgZG93biwgMHgwMSBzZW50LCAweDAyCisgICAgICAgICAgICAgICAgICogZm9yIHJlY2VpdmVkICovCisgIGludCBzdGF0ZTsgICAgLyogd2hlcmUgd2UgYXJlICovCisgIGludCByc3RhdGU7ICAgLyogd2hlcmUgd2UgYXJlIHdoZW4gcmVhZGluZyAqLworCisgIEJVRl9NRU0gKmluaXRfYnVmOyAvKiBidWZmZXIgdXNlZCBkdXJpbmcgaW5pdCAqLworICB1aW50OF90ICppbml0X21zZzsgLyogcG9pbnRlciB0byBoYW5kc2hha2UgbWVzc2FnZSBib2R5LCBzZXQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzbDNfZ2V0X21lc3NhZ2UoKSAqLworICBpbnQgaW5pdF9udW07ICAgICAgLyogYW1vdW50IHJlYWQvd3JpdHRlbiAqLworICBpbnQgaW5pdF9vZmY7ICAgICAgLyogYW1vdW50IHJlYWQvd3JpdHRlbiAqLworCisgIC8qIHVzZWQgaW50ZXJuYWxseSB0byBwb2ludCBhdCBhIHJhdyBwYWNrZXQgKi8KKyAgdWludDhfdCAqcGFja2V0OworICB1bnNpZ25lZCBpbnQgcGFja2V0X2xlbmd0aDsKKworICBzdHJ1Y3Qgc3NsM19zdGF0ZV9zdCAqczM7ICAvKiBTU0x2MyB2YXJpYWJsZXMgKi8KKyAgc3RydWN0IGR0bHMxX3N0YXRlX3N0ICpkMTsgLyogRFRMU3YxIHZhcmlhYmxlcyAqLworCisgIC8qIGNhbGxiYWNrIHRoYXQgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBwZWVrIGF0IHByb3RvY29sIG1lc3NhZ2VzICovCisgIHZvaWQgKCptc2dfY2FsbGJhY2spKGludCB3cml0ZV9wLCBpbnQgdmVyc2lvbiwgaW50IGNvbnRlbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBTU0wgKnNzbCwgdm9pZCAqYXJnKTsKKyAgdm9pZCAqbXNnX2NhbGxiYWNrX2FyZzsKKworICBpbnQgaGl0OyAvKiByZXVzaW5nIGEgcHJldmlvdXMgc2Vzc2lvbiAqLworCisgIFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbTsKKworICAvKiBjcnlwdG8gKi8KKyAgc3RydWN0IHNzbF9jaXBoZXJfcHJlZmVyZW5jZV9saXN0X3N0ICpjaXBoZXJfbGlzdDsKKyAgU1RBQ0tfT0YoU1NMX0NJUEhFUikgKmNpcGhlcl9saXN0X2J5X2lkOworCisgIFNTTF9BRUFEX0NUWCAqYWVhZF9yZWFkX2N0eDsKKyAgU1NMX0FFQURfQ1RYICphZWFkX3dyaXRlX2N0eDsKKworICAvKiBzZXNzaW9uIGluZm8gKi8KKworICAvKiBjbGllbnQgY2VydD8gKi8KKyAgLyogVGhpcyBpcyB1c2VkIHRvIGhvbGQgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSB1c2VkICovCisgIHN0cnVjdCBjZXJ0X3N0IC8qIENFUlQgKi8gKmNlcnQ7CisKKyAgLyogdGhlIHNlc3Npb25faWRfY29udGV4dCBpcyB1c2VkIHRvIGVuc3VyZSBzZXNzaW9ucyBhcmUgb25seSByZXVzZWQKKyAgICogaW4gdGhlIGFwcHJvcHJpYXRlIGNvbnRleHQgKi8KKyAgdW5zaWduZWQgaW50IHNpZF9jdHhfbGVuZ3RoOworICB1aW50OF90IHNpZF9jdHhbU1NMX01BWF9TSURfQ1RYX0xFTkdUSF07CisKKyAgLyogVGhpcyBjYW4gYWxzbyBiZSBpbiB0aGUgc2Vzc2lvbiBvbmNlIGEgc2Vzc2lvbiBpcyBlc3RhYmxpc2hlZCAqLworICBTU0xfU0VTU0lPTiAqc2Vzc2lvbjsKKworICAvKiBEZWZhdWx0IGdlbmVyYXRlIHNlc3Npb24gSUQgY2FsbGJhY2suICovCisgIEdFTl9TRVNTSU9OX0NCIGdlbmVyYXRlX3Nlc3Npb25faWQ7CisKKyAgLyogVXNlZCBpbiBTU0wyIGFuZCBTU0wzICovCisgIGludCB2ZXJpZnlfbW9kZTsgLyogMCBkb24ndCBjYXJlIGFib3V0IHZlcmlmeSBmYWlsdXJlLgorICAgICAgICAgICAgICAgICAgICAqIDEgZmFpbCBpZiB2ZXJpZnkgZmFpbHMgKi8KKyAgaW50ICgqdmVyaWZ5X2NhbGxiYWNrKShpbnQgb2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9TVE9SRV9DVFggKmN0eCk7IC8qIGZhaWwgaWYgY2FsbGJhY2sgcmV0dXJucyAwICovCisKKyAgdm9pZCAoKmluZm9fY2FsbGJhY2spKGNvbnN0IFNTTCAqc3NsLCBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWwpOyAvKiBvcHRpb25hbCBpbmZvcm1hdGlvbmFsIGNhbGxiYWNrICovCisKKyAgLyogU2VydmVyLW9ubHk6IHBza19pZGVudGl0eV9oaW50IGlzIHRoZSBpZGVudGl0eSBoaW50IHRvIHNlbmQgaW4KKyAgICogUFNLLWJhc2VkIGtleSBleGNoYW5nZXMuICovCisgIGNoYXIgKnBza19pZGVudGl0eV9oaW50OworCisgIHVuc2lnbmVkIGludCAoKnBza19jbGllbnRfY2FsbGJhY2spKFNTTCAqc3NsLCBjb25zdCBjaGFyICpoaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICppZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1heF9pZGVudGl0eV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBzaywgdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKTsKKyAgdW5zaWduZWQgaW50ICgqcHNrX3NlcnZlcl9jYWxsYmFjaykoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmlkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwc2ssIHVuc2lnbmVkIGludCBtYXhfcHNrX2xlbik7CisKKyAgU1NMX0NUWCAqY3R4OworCisgIC8qIGV4dHJhIGFwcGxpY2F0aW9uIGRhdGEgKi8KKyAgbG9uZyB2ZXJpZnlfcmVzdWx0OworICBDUllQVE9fRVhfREFUQSBleF9kYXRhOworCisgIC8qIGZvciBzZXJ2ZXIgc2lkZSwga2VlcCB0aGUgbGlzdCBvZiBDQV9kbiB3ZSBjYW4gdXNlICovCisgIFNUQUNLX09GKFg1MDlfTkFNRSkgKmNsaWVudF9DQTsKKworICB1aW50MzJfdCBvcHRpb25zOyAvKiBwcm90b2NvbCBiZWhhdmlvdXIgKi8KKyAgdWludDMyX3QgbW9kZTsgICAgLyogQVBJIGJlaGF2aW91ciAqLworICB1aW50MzJfdCBtYXhfY2VydF9saXN0OworICBpbnQgY2xpZW50X3ZlcnNpb247IC8qIHdoYXQgd2FzIHBhc3NlZCwgdXNlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgKiBTU0x2My9UTFMgcm9sbGJhY2sgY2hlY2sgKi8KKyAgdWludDE2X3QgbWF4X3NlbmRfZnJhZ21lbnQ7CisgIGNoYXIgKnRsc2V4dF9ob3N0bmFtZTsKKyAgLyogc2hvdWxkX2Fja19zbmkgaXMgdHJ1ZSBpZiB0aGUgU05JIGV4dGVuc2lvbiBzaG91bGQgYmUgYWNrZWQuIFRoaXMgaXMKKyAgICogb25seSB1c2VkIGJ5IGEgc2VydmVyLiAqLworICBjaGFyIHNob3VsZF9hY2tfc25pOworICAvKiBSRkM0NTA3IHNlc3Npb24gdGlja2V0IGV4cGVjdGVkIHRvIGJlIHJlY2VpdmVkIG9yIHNlbnQgKi8KKyAgaW50IHRsc2V4dF90aWNrZXRfZXhwZWN0ZWQ7CisgIHNpemVfdCB0bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoOworICB1aW50OF90ICp0bHNleHRfZWNwb2ludGZvcm1hdGxpc3Q7IC8qIG91ciBsaXN0ICovCisgIHNpemVfdCB0bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoOworICB1aW50MTZfdCAqdGxzZXh0X2VsbGlwdGljY3VydmVsaXN0OyAvKiBvdXIgbGlzdCAqLworCisgIFNTTF9DVFggKmluaXRpYWxfY3R4OyAvKiBpbml0aWFsIGN0eCwgdXNlZCB0byBzdG9yZSBzZXNzaW9ucyAqLworCisgIC8qIE5leHQgcHJvdG9jb2wgbmVnb3RpYXRpb24uIEZvciB0aGUgY2xpZW50LCB0aGlzIGlzIHRoZSBwcm90b2NvbCB0aGF0IHdlCisgICAqIHNlbnQgaW4gTmV4dFByb3RvY29sIGFuZCBpcyBzZXQgd2hlbiBoYW5kbGluZyBTZXJ2ZXJIZWxsbyBleHRlbnNpb25zLgorICAgKgorICAgKiBGb3IgYSBzZXJ2ZXIsIHRoaXMgaXMgdGhlIGNsaWVudCdzIHNlbGVjdGVkX3Byb3RvY29sIGZyb20gTmV4dFByb3RvY29sIGFuZAorICAgKiBpcyBzZXQgd2hlbiBoYW5kbGluZyB0aGUgTmV4dFByb3RvY29sIG1lc3NhZ2UsIGJlZm9yZSB0aGUgRmluaXNoZWQKKyAgICogbWVzc2FnZS4gKi8KKyAgdWludDhfdCAqbmV4dF9wcm90b19uZWdvdGlhdGVkOworICBzaXplX3QgbmV4dF9wcm90b19uZWdvdGlhdGVkX2xlbjsKKworICAvKiBzcnRwX3Byb2ZpbGVzIGlzIHRoZSBsaXN0IG9mIGNvbmZpZ3VyZWQgU1JUUCBwcm90ZWN0aW9uIHByb2ZpbGVzIGZvcgorICAgKiBEVExTLVNSVFAuICovCisgIFNUQUNLX09GKFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFKSAqc3J0cF9wcm9maWxlczsKKworICAvKiBzcnRwX3Byb2ZpbGUgaXMgdGhlIHNlbGVjdGVkIFNSVFAgcHJvdGVjdGlvbiBwcm9maWxlIGZvcgorICAgKiBEVExTLVNSVFAuICovCisgIGNvbnN0IFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFICpzcnRwX3Byb2ZpbGU7CisKKyAgLyogQ29waWVkIGZyb20gdGhlIFNTTF9DVFguIEZvciBhIHNlcnZlciwgbWVhbnMgdGhhdCB3ZSdsbCBhY2NlcHQgQ2hhbm5lbCBJRHMKKyAgICogZnJvbSBjbGllbnRzLiBGb3IgYSBjbGllbnQsIG1lYW5zIHRoYXQgd2UnbGwgYWR2ZXJ0aXNlIHN1cHBvcnQuICovCisgIGNoYXIgdGxzZXh0X2NoYW5uZWxfaWRfZW5hYmxlZDsKKyAgLyogVGhlIGNsaWVudCdzIENoYW5uZWwgSUQgcHJpdmF0ZSBrZXkuICovCisgIEVWUF9QS0VZICp0bHNleHRfY2hhbm5lbF9pZF9wcml2YXRlOworCisgIC8qIEVuYWJsZSBzaWduZWQgY2VydGlmaWNhdGUgdGltZSBzdGFtcHMuIEN1cnJlbnRseSBjbGllbnQgb25seS4gKi8KKyAgY2hhciBzaWduZWRfY2VydF90aW1lc3RhbXBzX2VuYWJsZWQ7CisKKyAgLyogRW5hYmxlIE9DU1Agc3RhcGxpbmcuIEN1cnJlbnRseSBjbGllbnQgb25seS4KKyAgICogVE9ETyhkYXZpZGJlbik6IEFkZCBhIHNlcnZlci1zaWRlIGltcGxlbWVudGF0aW9uIHdoZW4gaXQgYmVjb21lcworICAgKiBuZWNlc2FyeS4gKi8KKyAgY2hhciBvY3NwX3N0YXBsaW5nX2VuYWJsZWQ7CisKKyAgLyogRm9yIGEgY2xpZW50LCB0aGlzIGNvbnRhaW5zIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBwcm90b2NvbHMgaW4gd2lyZQorICAgKiBmb3JtYXQuICovCisgIHVpbnQ4X3QgKmFscG5fY2xpZW50X3Byb3RvX2xpc3Q7CisgIHVuc2lnbmVkIGFscG5fY2xpZW50X3Byb3RvX2xpc3RfbGVuOworCisgIC8qIGZhc3RyYWRpb19wYWRkaW5nLCBpZiB0cnVlLCBjYXVzZXMgQ2xpZW50SGVsbG9zIHRvIGJlIHBhZGRlZCB0byAxMDI0CisgICAqIGJ5dGVzLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgY2VsbHVsYXIgcmFkaW8gaXMgZmFzdCBmb3J3YXJkZWQgdG8gRENIIChoaWdoCisgICAqIGRhdGEgcmF0ZSkgc3RhdGUgaW4gM0cgbmV0d29ya3MuICovCisgIGNoYXIgZmFzdHJhZGlvX3BhZGRpbmc7CisKKyAgLyogYWNjZXB0X3BlZXJfcmVuZWdvdGlhdGlvbnMsIGlmIG9uZSwgYWNjZXB0cyByZW5lZ290aWF0aW9uIGF0dGVtcHRzIGZyb20gdGhlCisgICAqIHBlZXIuIE90aGVyd2lzZSwgdGhleSB3aWxsIGJlIHJlamVjdGVkIHdpdGggYSBmYXRhbCBlcnJvci4gKi8KKyAgY2hhciBhY2NlcHRfcGVlcl9yZW5lZ290aWF0aW9uczsKKworICAvKiBUaGVzZSBmaWVsZHMgYXJlIGFsd2F5cyBOVUxMIGFuZCBleGlzdCBvbmx5IHRvIGtlZXAgd3BhX3N1cHBsaWNhbnQgaGFwcHkKKyAgICogYWJvdXQgdGhlIGNoYW5nZSB0byBFVlBfQUVBRC4gVGhleSBhcmUgb25seSBuZWVkZWQgZm9yIEVBUC1GQVNULCB3aGljaCB3ZQorICAgKiBkb24ndCBzdXBwb3J0LiAqLworICBFVlBfQ0lQSEVSX0NUWCAqZW5jX3JlYWRfY3R4OworICBFVlBfTURfQ1RYICpyZWFkX2hhc2g7Cit9OworCisvKiBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFNTTF9zZXRfYXBwX2RhdGEocywgYXJnKSAoU1NMX3NldF9leF9kYXRhKHMsIDAsIChjaGFyICopYXJnKSkKKyNkZWZpbmUgU1NMX2dldF9hcHBfZGF0YShzKSAoU1NMX2dldF9leF9kYXRhKHMsIDApKQorI2RlZmluZSBTU0xfU0VTU0lPTl9zZXRfYXBwX2RhdGEocywgYSkgXAorICAoU1NMX1NFU1NJT05fc2V0X2V4X2RhdGEocywgMCwgKGNoYXIgKilhKSkKKyNkZWZpbmUgU1NMX1NFU1NJT05fZ2V0X2FwcF9kYXRhKHMpIChTU0xfU0VTU0lPTl9nZXRfZXhfZGF0YShzLCAwKSkKKyNkZWZpbmUgU1NMX0NUWF9nZXRfYXBwX2RhdGEoY3R4KSAoU1NMX0NUWF9nZXRfZXhfZGF0YShjdHgsIDApKQorI2RlZmluZSBTU0xfQ1RYX3NldF9hcHBfZGF0YShjdHgsIGFyZykgXAorICAoU1NMX0NUWF9zZXRfZXhfZGF0YShjdHgsIDAsIChjaGFyICopYXJnKSkKIAogLyogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3Igc3NsLT5zdGF0ZSBhcmUgYXJlIHVzZWQgdG8KICAqIGluZGljYXRlIHdoZXJlIHdlIGFyZSB1cCB0byBpbiB0aGUgU1NMIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudC4gVGhlIG1hY3JvcwpAQCAtMjQ0Nyw2ICsxNTMzLDEyIEBACiAgKiBmb3IgdGhlIHBlZXIsIGJ1dCB8U1NMX3JlYWR8IHdpbGwgcmVxdWlyZSB0aGUgaGFuZHNoYWtlIHRvIGJlIGNvbXBsZXRlZC4gKi8KIE9QRU5TU0xfRVhQT1JUIGludCBTU0xfaW5fZmFsc2Vfc3RhcnQoY29uc3QgU1NMICpzKTsKIAorLyogVGhlIGZvbGxvd2luZyAyIHN0YXRlcyBhcmUga2VwdCBpbiBzc2wtPnJzdGF0ZSB3aGVuIHJlYWRzIGZhaWwsCisgKiB5b3Ugc2hvdWxkIG5vdCBuZWVkIHRoZXNlICovCisjZGVmaW5lIFNTTF9TVF9SRUFEX0hFQURFUiAweEYwCisjZGVmaW5lIFNTTF9TVF9SRUFEX0JPRFkgMHhGMQorI2RlZmluZSBTU0xfU1RfUkVBRF9ET05FIDB4RjIKKwogLyogT2J0YWluIGxhdGVzdCBGaW5pc2hlZCBtZXNzYWdlCiAgKiAgIC0tIHRoYXQgd2Ugc2VudCAoU1NMX2dldF9maW5pc2hlZCkKICAqICAgLS0gdGhhdCB3ZSBleHBlY3RlZCBmcm9tIHBlZXIgKFNTTF9nZXRfcGVlcl9maW5pc2hlZCkuCkBAIC0yNDU0LDYgKzE1NDYsMzAgQEAKIE9QRU5TU0xfRVhQT1JUIHNpemVfdCBTU0xfZ2V0X2ZpbmlzaGVkKGNvbnN0IFNTTCAqcywgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpOwogT1BFTlNTTF9FWFBPUlQgc2l6ZV90IFNTTF9nZXRfcGVlcl9maW5pc2hlZChjb25zdCBTU0wgKnMsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKIAorLyogdXNlIGVpdGhlciBTU0xfVkVSSUZZX05PTkUgb3IgU1NMX1ZFUklGWV9QRUVSLCB0aGUgbGFzdCAzIG9wdGlvbnMKKyAqIGFyZSAnb3JlZCcgd2l0aCBTU0xfVkVSSUZZX1BFRVIgaWYgdGhleSBhcmUgZGVzaXJlZCAqLworI2RlZmluZSBTU0xfVkVSSUZZX05PTkUgMHgwMAorI2RlZmluZSBTU0xfVkVSSUZZX1BFRVIgMHgwMQorI2RlZmluZSBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUIDB4MDIKKy8qIFNTTF9WRVJJRllfQ0xJRU5UX09OQ0UgZG9lcyBub3RoaW5nLiAqLworI2RlZmluZSBTU0xfVkVSSUZZX0NMSUVOVF9PTkNFIDB4MDQKKyNkZWZpbmUgU1NMX1ZFUklGWV9QRUVSX0lGX05PX09CQyAweDA4CisKKyNkZWZpbmUgT3BlblNTTF9hZGRfc3NsX2FsZ29yaXRobXMoKSBTU0xfbGlicmFyeV9pbml0KCkKKyNkZWZpbmUgU1NMZWF5X2FkZF9zc2xfYWxnb3JpdGhtcygpIFNTTF9saWJyYXJ5X2luaXQoKQorCisvKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBTU0xfZ2V0X2NpcGhlcihzKSBTU0xfQ0lQSEVSX2dldF9uYW1lKFNTTF9nZXRfY3VycmVudF9jaXBoZXIocykpCisjZGVmaW5lIFNTTF9nZXRfY2lwaGVyX2JpdHMocywgbnApIFwKKyAgU1NMX0NJUEhFUl9nZXRfYml0cyhTU0xfZ2V0X2N1cnJlbnRfY2lwaGVyKHMpLCBucCkKKyNkZWZpbmUgU1NMX2dldF9jaXBoZXJfdmVyc2lvbihzKSBcCisgIFNTTF9DSVBIRVJfZ2V0X3ZlcnNpb24oU1NMX2dldF9jdXJyZW50X2NpcGhlcihzKSkKKyNkZWZpbmUgU1NMX2dldF9jaXBoZXJfbmFtZShzKSBTU0xfQ0lQSEVSX2dldF9uYW1lKFNTTF9nZXRfY3VycmVudF9jaXBoZXIocykpCisjZGVmaW5lIFNTTF9nZXRfdGltZShhKSBTU0xfU0VTU0lPTl9nZXRfdGltZShhKQorI2RlZmluZSBTU0xfc2V0X3RpbWUoYSwgYikgU1NMX1NFU1NJT05fc2V0X3RpbWUoKGEpLCAoYikpCisjZGVmaW5lIFNTTF9nZXRfdGltZW91dChhKSBTU0xfU0VTU0lPTl9nZXRfdGltZW91dChhKQorI2RlZmluZSBTU0xfc2V0X3RpbWVvdXQoYSwgYikgU1NMX1NFU1NJT05fc2V0X3RpbWVvdXQoKGEpLCAoYikpCisKICNkZWZpbmUgZDJpX1NTTF9TRVNTSU9OX2JpbyhicCwgc19pZCkgXAogICBBU04xX2QyaV9iaW9fb2YoU1NMX1NFU1NJT04sIFNTTF9TRVNTSU9OX25ldywgZDJpX1NTTF9TRVNTSU9OLCBicCwgc19pZCkKICNkZWZpbmUgaTJkX1NTTF9TRVNTSU9OX2JpbyhicCwgc19pZCkgXApAQCAtMjUwMCw2ICsxNjE2LDU0IEBACiAjZGVmaW5lIFNTTF9BRF9VTktOT1dOX1BTS19JREVOVElUWSBUTFMxX0FEX1VOS05PV05fUFNLX0lERU5USVRZICAgICAvKiBmYXRhbCAqLwogI2RlZmluZSBTU0xfQURfSU5BUFBST1BSSUFURV9GQUxMQkFDSyBTU0wzX0FEX0lOQVBQUk9QUklBVEVfRkFMTEJBQ0sgLyogZmF0YWwgKi8KIAorI2RlZmluZSBTU0xfRVJST1JfTk9ORSAwCisjZGVmaW5lIFNTTF9FUlJPUl9TU0wgMQorI2RlZmluZSBTU0xfRVJST1JfV0FOVF9SRUFEIDIKKyNkZWZpbmUgU1NMX0VSUk9SX1dBTlRfV1JJVEUgMworI2RlZmluZSBTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUCA0CisjZGVmaW5lIFNTTF9FUlJPUl9TWVNDQUxMIDUgLyogbG9vayBhdCBlcnJvciBzdGFjay9yZXR1cm4gdmFsdWUvZXJybm8gKi8KKyNkZWZpbmUgU1NMX0VSUk9SX1pFUk9fUkVUVVJOIDYKKyNkZWZpbmUgU1NMX0VSUk9SX1dBTlRfQ09OTkVDVCA3CisjZGVmaW5lIFNTTF9FUlJPUl9XQU5UX0FDQ0VQVCA4CisjZGVmaW5lIFNTTF9FUlJPUl9XQU5UX0NIQU5ORUxfSURfTE9PS1VQIDkKKyNkZWZpbmUgU1NMX0VSUk9SX1BFTkRJTkdfU0VTU0lPTiAxMQorI2RlZmluZSBTU0xfRVJST1JfUEVORElOR19DRVJUSUZJQ0FURSAxMgorCisjZGVmaW5lIFNTTF9DVFJMX0VYVFJBX0NIQUlOX0NFUlQgMTQKKworLyogc2VlIHRsczEuaCBmb3IgbWFjcm9zIGJhc2VkIG9uIHRoZXNlICovCisjZGVmaW5lIFNTTF9DVFJMX0dFVF9UTFNFWFRfVElDS0VUX0tFWVMgNTgKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RMU0VYVF9USUNLRVRfS0VZUyA1OQorCisjZGVmaW5lIFNTTF9DVFJMX1NFVF9TUlBfQVJHIDc4CisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTFNfRVhUX1NSUF9VU0VSTkFNRSA3OQorI2RlZmluZSBTU0xfQ1RSTF9TRVRfVExTX0VYVF9TUlBfU1RSRU5HVEggODAKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RMU19FWFRfU1JQX1BBU1NXT1JEIDgxCisKKyNkZWZpbmUgU1NMX0NUUkxfR0VUX0VYVFJBX0NIQUlOX0NFUlRTIDgyCisjZGVmaW5lIFNTTF9DVFJMX0NMRUFSX0VYVFJBX0NIQUlOX0NFUlRTIDgzCisKKyNkZWZpbmUgU1NMX0NUUkxfQ0hBSU4gODgKKyNkZWZpbmUgU1NMX0NUUkxfQ0hBSU5fQ0VSVCA4OQorCisjZGVmaW5lIFNTTF9DVFJMX0dFVF9DVVJWRVMgOTAKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX0NVUlZFUyA5MQorI2RlZmluZSBTU0xfQ1RSTF9TRVRfQ1VSVkVTX0xJU1QgOTIKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1NJR0FMR1MgOTcKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1NJR0FMR1NfTElTVCA5OAorI2RlZmluZSBTU0xfQ1RSTF9TRVRfQ0xJRU5UX1NJR0FMR1MgMTAxCisjZGVmaW5lIFNTTF9DVFJMX1NFVF9DTElFTlRfU0lHQUxHU19MSVNUIDEwMgorI2RlZmluZSBTU0xfQ1RSTF9HRVRfQ0xJRU5UX0NFUlRfVFlQRVMgMTAzCisjZGVmaW5lIFNTTF9DVFJMX1NFVF9DTElFTlRfQ0VSVF9UWVBFUyAxMDQKKyNkZWZpbmUgU1NMX0NUUkxfQlVJTERfQ0VSVF9DSEFJTiAxMDUKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1ZFUklGWV9DRVJUX1NUT1JFIDEwNgorI2RlZmluZSBTU0xfQ1RSTF9TRVRfQ0hBSU5fQ0VSVF9TVE9SRSAxMDcKKyNkZWZpbmUgU1NMX0NUUkxfR0VUX1NFUlZFUl9UTVBfS0VZIDEwOQorI2RlZmluZSBTU0xfQ1RSTF9HRVRfRUNfUE9JTlRfRk9STUFUUyAxMTEKKworI2RlZmluZSBTU0xfQ1RSTF9HRVRfQ0hBSU5fQ0VSVFMgMTE1CisjZGVmaW5lIFNTTF9DVFJMX1NFTEVDVF9DVVJSRU5UX0NFUlQgMTE2CisKIC8qIERUTFN2MV9nZXRfdGltZW91dCBxdWVyaWVzIHRoZSBuZXh0IERUTFMgaGFuZHNoYWtlIHRpbWVvdXQuIElmIHRoZXJlIGlzIGEKICAqIHRpbWVvdXQgaW4gcHJvZ3Jlc3MsIGl0IHNldHMgfCpvdXR8IHRvIHRoZSB0aW1lIHJlbWFpbmluZyBhbmQgcmV0dXJucyBvbmUuCiAgKiBPdGhlcndpc2UsIGl0IHJldHVybnMgemVyby4KQEAgLTI1MjMsMjEgKzE2ODcsMTgzIEBACiAgKiBXQVJOSU5HOiBUaGlzIGZ1bmN0aW9uIGJyZWFrcyB0aGUgdXN1YWwgcmV0dXJuIHZhbHVlIGNvbnZlbnRpb24uICovCiBPUEVOU1NMX0VYUE9SVCBpbnQgRFRMU3YxX2hhbmRsZV90aW1lb3V0KFNTTCAqc3NsKTsKIAorLyogU1NMX3Nlc3Npb25fcmV1c2VkIHJldHVybnMgb25lIGlmIHxzc2x8IHBlcmZvcm1lZCBhbiBhYmJyZXZpYXRlZCBoYW5kc2hha2UKKyAqIGFuZCB6ZXJvIG90aGVyd2lzZS4KKyAqCisgKiBUT0RPKGRhdmlkYmVuKTogSGFtbWVyIGRvd24gdGhlIHNlbWFudGljcyBvZiB0aGlzIEFQSSB3aGlsZSBhIGhhbmRzaGFrZSwKKyAqIGluaXRpYWwgb3IgcmVuZWdvLCBpcyBpbiBwcm9ncmVzcy4gKi8KK09QRU5TU0xfRVhQT1JUIGludCBTU0xfc2Vzc2lvbl9yZXVzZWQoY29uc3QgU1NMICpzc2wpOworCiAvKiBTU0xfdG90YWxfcmVuZWdvdGlhdGlvbnMgcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHJlbmVnb3RpYXRpb24gaGFuZHNoYWtlcwogICogcGVmb3JtZWQgYnkgfHNzbHwuIFRoaXMgaW5jbHVkZXMgdGhlIHBlbmRpbmcgcmVuZWdvdGlhdGlvbiwgaWYgYW55LiAqLwogT1BFTlNTTF9FWFBPUlQgaW50IFNTTF90b3RhbF9yZW5lZ290aWF0aW9ucyhjb25zdCBTU0wgKnNzbCk7CiAKLS8qIFNTTF9nZXQwX2NlcnRpZmljYXRlX3R5cGVzLCBmb3IgYSBjbGllbnQsIHNldHMgfCpvdXRfdHlwZXN8IHRvIGFuIGFycmF5Ci0gKiBjb250YWluaW5nIHRoZSBjbGllbnQgY2VydGlmaWNhdGUgdHlwZXMgcmVxdWVzdGVkIGJ5IGEgc2VydmVyLiBJdCByZXR1cm5zIHRoZQotICogbGVuZ3RoIG9mIHRoZSBhcnJheS4gKi8KLU9QRU5TU0xfRVhQT1JUIHNpemVfdCBTU0xfZ2V0MF9jZXJ0aWZpY2F0ZV90eXBlcyhTU0wgKnNzbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqb3V0X3R5cGVzKTsKKy8qIFNTTF9DVFhfc2V0X3RtcF9kaCBjb25maWd1cmVzIHxjdHh8IHRvIHVzZSB0aGUgZ3JvdXAgZnJvbSB8ZGh8IGFzIHRoZSBncm91cAorICogZm9yIERIRS4gT25seSB0aGUgZ3JvdXAgaXMgdXNlZCwgc28gfGRofCBuZWVkbid0IGhhdmUgYSBrZXlwYWlyLiBJdCByZXR1cm5zCisgKiBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gKi8KK09QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3NldF90bXBfZGgoU1NMX0NUWCAqY3R4LCBjb25zdCBESCAqZGgpOworCisvKiBTU0xfc2V0X3RtcF9kaCBjb25maWd1cmVzIHxzc2x8IHRvIHVzZSB0aGUgZ3JvdXAgZnJvbSB8ZGh8IGFzIHRoZSBncm91cCBmb3IKKyAqIERIRS4gT25seSB0aGUgZ3JvdXAgaXMgdXNlZCwgc28gfGRofCBuZWVkbid0IGhhdmUgYSBrZXlwYWlyLiBJdCByZXR1cm5zIG9uZQorICogb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gKi8KK09QRU5TU0xfRVhQT1JUIGludCBTU0xfc2V0X3RtcF9kaChTU0wgKnNzbCwgY29uc3QgREggKmRoKTsKKworLyogU1NMX0NUWF9zZXRfdG1wX2VjZGggY29uZmlndXJlcyB8Y3R4fCB0byB1c2UgdGhlIGN1cnZlIGZyb20gfGVjZGh8IGFzIHRoZQorICogY3VydmUgZm9yIGVwaGVtZXJhbCBFQ0RIIGtleXMuIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHRoaXMgQVBJIGV4cGVjdHMgYW4KKyAqIHxFQ19LRVl8LCBidXQgb25seSB0aGUgY3VydmUgaXMgdXNlZC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbgorICogZXJyb3IuIElmIHVuc2V0LCBhbiBhcHByb3ByaWF0ZSBjdXJ2ZSB3aWxsIGJlIGNob3NlbiBhdXRvbWF0aWNhbGx5LiAoVGhpcyBpcworICogcmVjb21tZW5kZWQuKSAqLworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfc2V0X3RtcF9lY2RoKFNTTF9DVFggKmN0eCwgY29uc3QgRUNfS0VZICplY19rZXkpOworCisvKiBTU0xfc2V0X3RtcF9lY2RoIGNvbmZpZ3VyZXMgfHNzbHwgdG8gdXNlIHRoZSBjdXJ2ZSBmcm9tIHxlY2RofCBhcyB0aGUgY3VydmUKKyAqIGZvciBlcGhlbWVyYWwgRUNESCBrZXlzLiBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCB0aGlzIEFQSSBleHBlY3RzIGFuCisgKiB8RUNfS0VZfCwgYnV0IG9ubHkgdGhlIGN1cnZlIGlzIHVzZWQuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24KKyAqIGVycm9yLiBJZiB1bnNldCwgYW4gYXBwcm9wcmlhdGUgY3VydmUgd2lsbCBiZSBjaG9zZW4gYXV0b21hdGljYWxseS4gKFRoaXMgaXMKKyAqIHJlY29tbWVuZGVkLikgKi8KK09QRU5TU0xfRVhQT1JUIGludCBTU0xfc2V0X3RtcF9lY2RoKFNTTCAqc3NsLCBjb25zdCBFQ19LRVkgKmVjX2tleSk7CisKKy8qIFNTTF9DVFhfZW5hYmxlX3Rsc19jaGFubmVsX2lkIGVpdGhlciBjb25maWd1cmVzIGEgVExTIHNlcnZlciB0byBhY2NlcHQgVExTCisgKiBjbGllbnQgSURzIGZyb20gY2xpZW50cywgb3IgY29uZmlndXJlcyBhIGNsaWVudCB0byBzZW5kIFRMUyBjbGllbnQgSURzIHRvCisgKiBhIHNlcnZlci4gSXQgcmV0dXJucyBvbmUuICovCitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9lbmFibGVfdGxzX2NoYW5uZWxfaWQoU1NMX0NUWCAqY3R4KTsKKworLyogU1NMX2VuYWJsZV90bHNfY2hhbm5lbF9pZCBlaXRoZXIgY29uZmlndXJlcyBhIFRMUyBzZXJ2ZXIgdG8gYWNjZXB0IFRMUworICogY2xpZW50IElEcyBmcm9tIGNsaWVudHMsIG9yIGNvbmZpZ3VyZSBhIGNsaWVudCB0byBzZW5kIFRMUyBjbGllbnQgSURzIHRvCisgKiBzZXJ2ZXIuIEl0IHJldHVybnMgb25lLiAqLworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9lbmFibGVfdGxzX2NoYW5uZWxfaWQoU1NMICpzc2wpOworCisvKiBTU0xfQ1RYX3NldDFfdGxzX2NoYW5uZWxfaWQgY29uZmlndXJlcyBhIFRMUyBjbGllbnQgdG8gc2VuZCBhIFRMUyBDaGFubmVsIElECisgKiB0byBjb21wYXRpYmxlIHNlcnZlcnMuIHxwcml2YXRlX2tleXwgbXVzdCBiZSBhIFAtMjU2IEVDIGtleS4gSXQgcmV0dXJucyBvbmUKKyAqIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZXJyb3IuICovCitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9zZXQxX3Rsc19jaGFubmVsX2lkKFNTTF9DVFggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1BLRVkgKnByaXZhdGVfa2V5KTsKKworLyogU1NMX3NldDFfdGxzX2NoYW5uZWxfaWQgY29uZmlndXJlcyBhIFRMUyBjbGllbnQgdG8gc2VuZCBhIFRMUyBDaGFubmVsIElEIHRvCisgKiBjb21wYXRpYmxlIHNlcnZlcnMuIHxwcml2YXRlX2tleXwgbXVzdCBiZSBhIFAtMjU2IEVDIGtleS4gSXQgcmV0dXJucyBvbmUgb24KKyAqIHN1Y2Nlc3MgYW5kIHplcm8gb24gZXJyb3IuICovCitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3NldDFfdGxzX2NoYW5uZWxfaWQoU1NMICpzc2wsIEVWUF9QS0VZICpwcml2YXRlX2tleSk7CisKKy8qIFNTTF9nZXRfdGxzX2NoYW5uZWxfaWQgZ2V0cyB0aGUgY2xpZW50J3MgVExTIENoYW5uZWwgSUQgZnJvbSBhIHNlcnZlciBTU0wqCisgKiBhbmQgY29waWVzIHVwIHRvIHRoZSBmaXJzdCB8bWF4X291dHwgYnl0ZXMgaW50byB8b3V0fC4gVGhlIENoYW5uZWwgSUQKKyAqIGNvbnNpc3RzIG9mIHRoZSBjbGllbnQncyBQLTI1NiBwdWJsaWMga2V5IGFzIGFuICh4LHkpIHBhaXIgd2hlcmUgZWFjaCBpcyBhCisgKiAzMi1ieXRlLCBiaWctZW5kaWFuIGZpZWxkIGVsZW1lbnQuIEl0IHJldHVybnMgMCBpZiB0aGUgY2xpZW50IGRpZG4ndCBvZmZlciBhCisgKiBDaGFubmVsIElEIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBjb21wbGV0ZSBDaGFubmVsIElEIG90aGVyd2lzZS4gKi8KK09QRU5TU0xfRVhQT1JUIHNpemVfdCBTU0xfZ2V0X3Rsc19jaGFubmVsX2lkKFNTTCAqc3NsLCB1aW50OF90ICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWF4X291dCk7CisKKyNkZWZpbmUgU1NMX0NUWF9hZGRfZXh0cmFfY2hhaW5fY2VydChjdHgsIHg1MDkpIFwKKyAgU1NMX0NUWF9jdHJsKGN0eCwgU1NMX0NUUkxfRVhUUkFfQ0hBSU5fQ0VSVCwgMCwgKGNoYXIgKil4NTA5KQorI2RlZmluZSBTU0xfQ1RYX2dldF9leHRyYV9jaGFpbl9jZXJ0cyhjdHgsIHB4NTA5KSBcCisgIFNTTF9DVFhfY3RybChjdHgsIFNTTF9DVFJMX0dFVF9FWFRSQV9DSEFJTl9DRVJUUywgMCwgcHg1MDkpCisjZGVmaW5lIFNTTF9DVFhfZ2V0X2V4dHJhX2NoYWluX2NlcnRzX29ubHkoY3R4LCBweDUwOSkgXAorICBTU0xfQ1RYX2N0cmwoY3R4LCBTU0xfQ1RSTF9HRVRfRVhUUkFfQ0hBSU5fQ0VSVFMsIDEsIHB4NTA5KQorI2RlZmluZSBTU0xfQ1RYX2NsZWFyX2V4dHJhX2NoYWluX2NlcnRzKGN0eCkgXAorICBTU0xfQ1RYX2N0cmwoY3R4LCBTU0xfQ1RSTF9DTEVBUl9FWFRSQV9DSEFJTl9DRVJUUywgMCwgTlVMTCkKKworI2RlZmluZSBTU0xfQ1RYX3NldDBfY2hhaW4oY3R4LCBzaykgXAorICBTU0xfQ1RYX2N0cmwoY3R4LCBTU0xfQ1RSTF9DSEFJTiwgMCwgKGNoYXIgKilzaykKKyNkZWZpbmUgU1NMX0NUWF9zZXQxX2NoYWluKGN0eCwgc2spIFwKKyAgU1NMX0NUWF9jdHJsKGN0eCwgU1NMX0NUUkxfQ0hBSU4sIDEsIChjaGFyICopc2spCisjZGVmaW5lIFNTTF9DVFhfYWRkMF9jaGFpbl9jZXJ0KGN0eCwgeDUwOSkgXAorICBTU0xfQ1RYX2N0cmwoY3R4LCBTU0xfQ1RSTF9DSEFJTl9DRVJULCAwLCAoY2hhciAqKXg1MDkpCisjZGVmaW5lIFNTTF9DVFhfYWRkMV9jaGFpbl9jZXJ0KGN0eCwgeDUwOSkgXAorICBTU0xfQ1RYX2N0cmwoY3R4LCBTU0xfQ1RSTF9DSEFJTl9DRVJULCAxLCAoY2hhciAqKXg1MDkpCisjZGVmaW5lIFNTTF9DVFhfZ2V0MF9jaGFpbl9jZXJ0cyhjdHgsIHB4NTA5KSBcCisgIFNTTF9DVFhfY3RybChjdHgsIFNTTF9DVFJMX0dFVF9DSEFJTl9DRVJUUywgMCwgcHg1MDkpCisjZGVmaW5lIFNTTF9DVFhfY2xlYXJfY2hhaW5fY2VydHMoY3R4KSBTU0xfQ1RYX3NldDBfY2hhaW4oY3R4LCBOVUxMKQorI2RlZmluZSBTU0xfQ1RYX2J1aWxkX2NlcnRfY2hhaW4oY3R4LCBmbGFncykgXAorICBTU0xfQ1RYX2N0cmwoY3R4LCBTU0xfQ1RSTF9CVUlMRF9DRVJUX0NIQUlOLCBmbGFncywgTlVMTCkKKyNkZWZpbmUgU1NMX0NUWF9zZWxlY3RfY3VycmVudF9jZXJ0KGN0eCwgeDUwOSkgXAorICBTU0xfQ1RYX2N0cmwoY3R4LCBTU0xfQ1RSTF9TRUxFQ1RfQ1VSUkVOVF9DRVJULCAwLCAoY2hhciAqKXg1MDkpCisKKyNkZWZpbmUgU1NMX0NUWF9zZXQwX3ZlcmlmeV9jZXJ0X3N0b3JlKGN0eCwgc3QpIFwKKyAgU1NMX0NUWF9jdHJsKGN0eCwgU1NMX0NUUkxfU0VUX1ZFUklGWV9DRVJUX1NUT1JFLCAwLCAoY2hhciAqKXN0KQorI2RlZmluZSBTU0xfQ1RYX3NldDFfdmVyaWZ5X2NlcnRfc3RvcmUoY3R4LCBzdCkgXAorICBTU0xfQ1RYX2N0cmwoY3R4LCBTU0xfQ1RSTF9TRVRfVkVSSUZZX0NFUlRfU1RPUkUsIDEsIChjaGFyICopc3QpCisjZGVmaW5lIFNTTF9DVFhfc2V0MF9jaGFpbl9jZXJ0X3N0b3JlKGN0eCwgc3QpIFwKKyAgU1NMX0NUWF9jdHJsKGN0eCwgU1NMX0NUUkxfU0VUX0NIQUlOX0NFUlRfU1RPUkUsIDAsIChjaGFyICopc3QpCisjZGVmaW5lIFNTTF9DVFhfc2V0MV9jaGFpbl9jZXJ0X3N0b3JlKGN0eCwgc3QpIFwKKyAgU1NMX0NUWF9jdHJsKGN0eCwgU1NMX0NUUkxfU0VUX0NIQUlOX0NFUlRfU1RPUkUsIDEsIChjaGFyICopc3QpCisKKyNkZWZpbmUgU1NMX3NldDBfY2hhaW4oY3R4LCBzaykgU1NMX2N0cmwoY3R4LCBTU0xfQ1RSTF9DSEFJTiwgMCwgKGNoYXIgKilzaykKKyNkZWZpbmUgU1NMX3NldDFfY2hhaW4oY3R4LCBzaykgU1NMX2N0cmwoY3R4LCBTU0xfQ1RSTF9DSEFJTiwgMSwgKGNoYXIgKilzaykKKyNkZWZpbmUgU1NMX2FkZDBfY2hhaW5fY2VydChjdHgsIHg1MDkpIFwKKyAgU1NMX2N0cmwoY3R4LCBTU0xfQ1RSTF9DSEFJTl9DRVJULCAwLCAoY2hhciAqKXg1MDkpCisjZGVmaW5lIFNTTF9hZGQxX2NoYWluX2NlcnQoY3R4LCB4NTA5KSBcCisgIFNTTF9jdHJsKGN0eCwgU1NMX0NUUkxfQ0hBSU5fQ0VSVCwgMSwgKGNoYXIgKil4NTA5KQorI2RlZmluZSBTU0xfZ2V0MF9jaGFpbl9jZXJ0cyhjdHgsIHB4NTA5KSBcCisgIFNTTF9jdHJsKGN0eCwgU1NMX0NUUkxfR0VUX0NIQUlOX0NFUlRTLCAwLCBweDUwOSkKKyNkZWZpbmUgU1NMX2NsZWFyX2NoYWluX2NlcnRzKGN0eCkgU1NMX3NldDBfY2hhaW4oY3R4LCBOVUxMKQorI2RlZmluZSBTU0xfYnVpbGRfY2VydF9jaGFpbihzLCBmbGFncykgXAorICBTU0xfY3RybChzLCBTU0xfQ1RSTF9CVUlMRF9DRVJUX0NIQUlOLCBmbGFncywgTlVMTCkKKyNkZWZpbmUgU1NMX3NlbGVjdF9jdXJyZW50X2NlcnQoY3R4LCB4NTA5KSBcCisgIFNTTF9jdHJsKGN0eCwgU1NMX0NUUkxfU0VMRUNUX0NVUlJFTlRfQ0VSVCwgMCwgKGNoYXIgKil4NTA5KQorCisjZGVmaW5lIFNTTF9zZXQwX3ZlcmlmeV9jZXJ0X3N0b3JlKHMsIHN0KSBcCisgIFNTTF9jdHJsKHMsIFNTTF9DVFJMX1NFVF9WRVJJRllfQ0VSVF9TVE9SRSwgMCwgKGNoYXIgKilzdCkKKyNkZWZpbmUgU1NMX3NldDFfdmVyaWZ5X2NlcnRfc3RvcmUocywgc3QpIFwKKyAgU1NMX2N0cmwocywgU1NMX0NUUkxfU0VUX1ZFUklGWV9DRVJUX1NUT1JFLCAxLCAoY2hhciAqKXN0KQorI2RlZmluZSBTU0xfc2V0MF9jaGFpbl9jZXJ0X3N0b3JlKHMsIHN0KSBcCisgIFNTTF9jdHJsKHMsIFNTTF9DVFJMX1NFVF9DSEFJTl9DRVJUX1NUT1JFLCAwLCAoY2hhciAqKXN0KQorI2RlZmluZSBTU0xfc2V0MV9jaGFpbl9jZXJ0X3N0b3JlKHMsIHN0KSBcCisgIFNTTF9jdHJsKHMsIFNTTF9DVFJMX1NFVF9DSEFJTl9DRVJUX1NUT1JFLCAxLCAoY2hhciAqKXN0KQorCisjZGVmaW5lIFNTTF9nZXQxX2N1cnZlcyhjdHgsIHMpIFNTTF9jdHJsKGN0eCwgU1NMX0NUUkxfR0VUX0NVUlZFUywgMCwgKGNoYXIgKilzKQorI2RlZmluZSBTU0xfQ1RYX3NldDFfY3VydmVzKGN0eCwgY2xpc3QsIGNsaXN0bGVuKSBcCisgIFNTTF9DVFhfY3RybChjdHgsIFNTTF9DVFJMX1NFVF9DVVJWRVMsIGNsaXN0bGVuLCAoY2hhciAqKWNsaXN0KQorI2RlZmluZSBTU0xfQ1RYX3NldDFfY3VydmVzX2xpc3QoY3R4LCBzKSBcCisgIFNTTF9DVFhfY3RybChjdHgsIFNTTF9DVFJMX1NFVF9DVVJWRVNfTElTVCwgMCwgKGNoYXIgKilzKQorI2RlZmluZSBTU0xfc2V0MV9jdXJ2ZXMoY3R4LCBjbGlzdCwgY2xpc3RsZW4pIFwKKyAgU1NMX2N0cmwoY3R4LCBTU0xfQ1RSTF9TRVRfQ1VSVkVTLCBjbGlzdGxlbiwgKGNoYXIgKiljbGlzdCkKKyNkZWZpbmUgU1NMX3NldDFfY3VydmVzX2xpc3QoY3R4LCBzKSBcCisgIFNTTF9jdHJsKGN0eCwgU1NMX0NUUkxfU0VUX0NVUlZFU19MSVNULCAwLCAoY2hhciAqKXMpCisKKyNkZWZpbmUgU1NMX0NUWF9zZXQxX3NpZ2FsZ3MoY3R4LCBzbGlzdCwgc2xpc3RsZW4pIFwKKyAgU1NMX0NUWF9jdHJsKGN0eCwgU1NMX0NUUkxfU0VUX1NJR0FMR1MsIHNsaXN0bGVuLCAoaW50ICopc2xpc3QpCisjZGVmaW5lIFNTTF9DVFhfc2V0MV9zaWdhbGdzX2xpc3QoY3R4LCBzKSBcCisgIFNTTF9DVFhfY3RybChjdHgsIFNTTF9DVFJMX1NFVF9TSUdBTEdTX0xJU1QsIDAsIChjaGFyICopcykKKyNkZWZpbmUgU1NMX3NldDFfc2lnYWxncyhjdHgsIHNsaXN0LCBzbGlzdGxlbikgXAorICBTU0xfY3RybChjdHgsIFNTTF9DVFJMX1NFVF9TSUdBTEdTLCBjbGlzdGxlbiwgKGludCAqKXNsaXN0KQorI2RlZmluZSBTU0xfc2V0MV9zaWdhbGdzX2xpc3QoY3R4LCBzKSBcCisgIFNTTF9jdHJsKGN0eCwgU1NMX0NUUkxfU0VUX1NJR0FMR1NfTElTVCwgMCwgKGNoYXIgKilzKQorCisjZGVmaW5lIFNTTF9DVFhfc2V0MV9jbGllbnRfc2lnYWxncyhjdHgsIHNsaXN0LCBzbGlzdGxlbikgXAorICBTU0xfQ1RYX2N0cmwoY3R4LCBTU0xfQ1RSTF9TRVRfQ0xJRU5UX1NJR0FMR1MsIHNsaXN0bGVuLCAoaW50ICopc2xpc3QpCisjZGVmaW5lIFNTTF9DVFhfc2V0MV9jbGllbnRfc2lnYWxnc19saXN0KGN0eCwgcykgXAorICBTU0xfQ1RYX2N0cmwoY3R4LCBTU0xfQ1RSTF9TRVRfQ0xJRU5UX1NJR0FMR1NfTElTVCwgMCwgKGNoYXIgKilzKQorI2RlZmluZSBTU0xfc2V0MV9jbGllbnRfc2lnYWxncyhjdHgsIHNsaXN0LCBzbGlzdGxlbikgXAorICBTU0xfY3RybChjdHgsIFNTTF9DVFJMX1NFVF9DTElFTlRfU0lHQUxHUywgY2xpc3RsZW4sIChpbnQgKilzbGlzdCkKKyNkZWZpbmUgU1NMX3NldDFfY2xpZW50X3NpZ2FsZ3NfbGlzdChjdHgsIHMpIFwKKyAgU1NMX2N0cmwoY3R4LCBTU0xfQ1RSTF9TRVRfQ0xJRU5UX1NJR0FMR1NfTElTVCwgMCwgKGNoYXIgKilzKQorCisjZGVmaW5lIFNTTF9nZXQwX2NlcnRpZmljYXRlX3R5cGVzKHMsIGNsaXN0KSBcCisgIFNTTF9jdHJsKHMsIFNTTF9DVFJMX0dFVF9DTElFTlRfQ0VSVF9UWVBFUywgMCwgKGNoYXIgKiljbGlzdCkKKworI2RlZmluZSBTU0xfQ1RYX3NldDFfY2xpZW50X2NlcnRpZmljYXRlX3R5cGVzKGN0eCwgY2xpc3QsIGNsaXN0bGVuKSBcCisgIFNTTF9DVFhfY3RybChjdHgsIFNTTF9DVFJMX1NFVF9DTElFTlRfQ0VSVF9UWVBFUywgY2xpc3RsZW4sIChjaGFyICopY2xpc3QpCisjZGVmaW5lIFNTTF9zZXQxX2NsaWVudF9jZXJ0aWZpY2F0ZV90eXBlcyhzLCBjbGlzdCwgY2xpc3RsZW4pIFwKKyAgU1NMX2N0cmwocywgU1NMX0NUUkxfU0VUX0NMSUVOVF9DRVJUX1RZUEVTLCBjbGlzdGxlbiwgKGNoYXIgKiljbGlzdCkKKworI2RlZmluZSBTU0xfZ2V0X3NlcnZlcl90bXBfa2V5KHMsIHBrKSBcCisgIFNTTF9jdHJsKHMsIFNTTF9DVFJMX0dFVF9TRVJWRVJfVE1QX0tFWSwgMCwgcGspCisKKyNkZWZpbmUgU1NMX2dldDBfZWNfcG9pbnRfZm9ybWF0cyhzLCBwbHN0KSBcCisgIFNTTF9jdHJsKHMsIFNTTF9DVFJMX0dFVF9FQ19QT0lOVF9GT1JNQVRTLCAwLCAoY2hhciAqKXBsc3QpCiAKIE9QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdChTU0xfQ1RYICosIGNvbnN0IGNoYXIgKnN0cik7Ci1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3RfdGxzMTAoU1NMX0NUWCAqLCBjb25zdCBjaGFyICpzdHIpOwogT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfc2V0X2NpcGhlcl9saXN0X3RsczExKFNTTF9DVFggKiwgY29uc3QgY2hhciAqc3RyKTsKK09QRU5TU0xfRVhQT1JUIGxvbmcgU1NMX0NUWF9zZXRfdGltZW91dChTU0xfQ1RYICpjdHgsIGxvbmcgdCk7CitPUEVOU1NMX0VYUE9SVCBsb25nIFNTTF9DVFhfZ2V0X3RpbWVvdXQoY29uc3QgU1NMX0NUWCAqY3R4KTsKK09QRU5TU0xfRVhQT1JUIFg1MDlfU1RPUkUgKlNTTF9DVFhfZ2V0X2NlcnRfc3RvcmUoY29uc3QgU1NMX0NUWCAqKTsKK09QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX0NUWF9zZXRfY2VydF9zdG9yZShTU0xfQ1RYICosIFg1MDlfU1RPUkUgKik7CiBPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3dhbnQoY29uc3QgU1NMICpzKTsKIAorT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfQ1RYX2ZsdXNoX3Nlc3Npb25zKFNTTF9DVFggKmN0eCwgbG9uZyB0bSk7CisKKy8qIFNTTF9nZXRfY3VycmVudF9jaXBoZXIgcmV0dXJucyB0aGUgY2lwaGVyIHVzZWQgaW4gdGhlIGN1cnJlbnQgb3V0Z29pbmcKKyAqIGNvbm5lY3Rpb24gc3RhdGUsIG9yIE5VTEwgaWYgdGhlIG51bGwgY2lwaGVyIGlzIGFjdGl2ZS4gKi8KK09QRU5TU0xfRVhQT1JUIGNvbnN0IFNTTF9DSVBIRVIgKlNTTF9nZXRfY3VycmVudF9jaXBoZXIoY29uc3QgU1NMICpzKTsKKwogT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9nZXRfZmQoY29uc3QgU1NMICpzKTsKIE9QRU5TU0xfRVhQT1JUIGludCBTU0xfZ2V0X3JmZChjb25zdCBTU0wgKnMpOwogT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9nZXRfd2ZkKGNvbnN0IFNTTCAqcyk7CkBAIC0yNTQ2LDMxICsxODcyLDI0NCBAQAogT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9zZXRfZmQoU1NMICpzLCBpbnQgZmQpOwogT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9zZXRfcmZkKFNTTCAqcywgaW50IGZkKTsKIE9QRU5TU0xfRVhQT1JUIGludCBTU0xfc2V0X3dmZChTU0wgKnMsIGludCBmZCk7CitPUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9zZXRfYmlvKFNTTCAqcywgQklPICpyYmlvLCBCSU8gKndiaW8pOworT1BFTlNTTF9FWFBPUlQgQklPICpTU0xfZ2V0X3JiaW8oY29uc3QgU1NMICpzKTsKK09QRU5TU0xfRVhQT1JUIEJJTyAqU1NMX2dldF93YmlvKGNvbnN0IFNTTCAqcyk7CiBPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3NldF9jaXBoZXJfbGlzdChTU0wgKnMsIGNvbnN0IGNoYXIgKnN0cik7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX2dldF92ZXJpZnlfbW9kZShjb25zdCBTU0wgKnMpOworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9nZXRfdmVyaWZ5X2RlcHRoKGNvbnN0IFNTTCAqcyk7CitPUEVOU1NMX0VYUE9SVCBpbnQgKCpTU0xfZ2V0X3ZlcmlmeV9jYWxsYmFjayhjb25zdCBTU0wgKnMpKShpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYNTA5X1NUT1JFX0NUWCAqKTsKK09QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX3NldF92ZXJpZnkoU1NMICpzLCBpbnQgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqY2FsbGJhY2spKGludCBvaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfU1RPUkVfQ1RYICpjdHgpKTsKK09QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX3NldF92ZXJpZnlfZGVwdGgoU1NMICpzLCBpbnQgZGVwdGgpOworT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfc2V0X2NlcnRfY2IoU1NMICpzLCBpbnQgKCpjYikoU1NMICpzc2wsIHZvaWQgKmFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpOworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF91c2VfUlNBUHJpdmF0ZUtleShTU0wgKnNzbCwgUlNBICpyc2EpOworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF91c2VfUlNBUHJpdmF0ZUtleV9BU04xKFNTTCAqc3NsLCB1aW50OF90ICpkLCBsb25nIGxlbik7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3VzZV9Qcml2YXRlS2V5KFNTTCAqc3NsLCBFVlBfUEtFWSAqcGtleSk7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3VzZV9Qcml2YXRlS2V5X0FTTjEoaW50IHBrLCBTU0wgKnNzbCwgY29uc3QgdWludDhfdCAqZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxlbik7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3VzZV9jZXJ0aWZpY2F0ZShTU0wgKnNzbCwgWDUwOSAqeCk7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3VzZV9jZXJ0aWZpY2F0ZV9BU04xKFNTTCAqc3NsLCBjb25zdCB1aW50OF90ICpkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKKworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF91c2VfUlNBUHJpdmF0ZUtleV9maWxlKFNTTCAqc3NsLCBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlKTsKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfdXNlX1ByaXZhdGVLZXlfZmlsZShTU0wgKnNzbCwgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSk7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3VzZV9jZXJ0aWZpY2F0ZV9maWxlKFNTTCAqc3NsLCBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSk7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleV9maWxlKFNTTF9DVFggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpOworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShTU0xfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlKTsKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9maWxlKFNTTF9DVFggKmN0eCwgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlKTsKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKAorICAgIFNTTF9DVFggKmN0eCwgY29uc3QgY2hhciAqZmlsZSk7IC8qIFBFTSB0eXBlICovCitPUEVOU1NMX0VYUE9SVCBTVEFDS19PRihYNTA5X05BTUUpICpTU0xfbG9hZF9jbGllbnRfQ0FfZmlsZShjb25zdCBjaGFyICpmaWxlKTsKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfYWRkX2ZpbGVfY2VydF9zdWJqZWN0c190b19zdGFjayhTVEFDS19PRihYNTA5X05BTUUpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tDQXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSk7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX2FkZF9kaXJfY2VydF9zdWJqZWN0c190b19zdGFjayhTVEFDS19PRihYNTA5X05BTUUpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja0NBcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRpcik7CisKKy8qIFNTTF9sb2FkX2Vycm9yX3N0cmluZ3MgZG9lcyBub3RoaW5nLiAqLworT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKHZvaWQpOwogCiBPUEVOU1NMX0VYUE9SVCBjb25zdCBjaGFyICpTU0xfc3RhdGVfc3RyaW5nKGNvbnN0IFNTTCAqcyk7CitPUEVOU1NMX0VYUE9SVCBjb25zdCBjaGFyICpTU0xfcnN0YXRlX3N0cmluZyhjb25zdCBTU0wgKnMpOwogT1BFTlNTTF9FWFBPUlQgY29uc3QgY2hhciAqU1NMX3N0YXRlX3N0cmluZ19sb25nKGNvbnN0IFNTTCAqcyk7CitPUEVOU1NMX0VYUE9SVCBjb25zdCBjaGFyICpTU0xfcnN0YXRlX3N0cmluZ19sb25nKGNvbnN0IFNTTCAqcyk7CitPUEVOU1NMX0VYUE9SVCBsb25nIFNTTF9TRVNTSU9OX2dldF90aW1lKGNvbnN0IFNTTF9TRVNTSU9OICpzKTsKK09QRU5TU0xfRVhQT1JUIGxvbmcgU1NMX1NFU1NJT05fc2V0X3RpbWUoU1NMX1NFU1NJT04gKnMsIGxvbmcgdCk7CitPUEVOU1NMX0VYUE9SVCBsb25nIFNTTF9TRVNTSU9OX2dldF90aW1lb3V0KGNvbnN0IFNTTF9TRVNTSU9OICpzKTsKK09QRU5TU0xfRVhQT1JUIGxvbmcgU1NMX1NFU1NJT05fc2V0X3RpbWVvdXQoU1NMX1NFU1NJT04gKnMsIGxvbmcgdCk7CitPUEVOU1NMX0VYUE9SVCBYNTA5ICpTU0xfU0VTU0lPTl9nZXQwX3BlZXIoU1NMX1NFU1NJT04gKnMpOworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9TRVNTSU9OX3NldDFfaWRfY29udGV4dChTU0xfU0VTU0lPTiAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc2lkX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpZF9jdHhfbGVuKTsKIAorT1BFTlNTTF9FWFBPUlQgU1NMX1NFU1NJT04gKlNTTF9TRVNTSU9OX25ldyh2b2lkKTsKK09QRU5TU0xfRVhQT1JUIGNvbnN0IHVpbnQ4X3QgKlNTTF9TRVNTSU9OX2dldF9pZChjb25zdCBTU0xfU0VTU0lPTiAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmxlbik7CiBPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX1NFU1NJT05fcHJpbnRfZnAoRklMRSAqZnAsIGNvbnN0IFNTTF9TRVNTSU9OICpzZXMpOwogT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9TRVNTSU9OX3ByaW50KEJJTyAqZnAsIGNvbnN0IFNTTF9TRVNTSU9OICpzZXMpOwogCisvKiBTU0xfU0VTU0lPTl91cF9yZWYsIGlmIHxzZXNzaW9ufCBpcyBub3QgTlVMTCwgaW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50CisgKiBvZiB8c2Vzc2lvbnwuIEl0IHRoZW4gcmV0dXJucyB8c2Vzc2lvbnwuICovCitPUEVOU1NMX0VYUE9SVCBTU0xfU0VTU0lPTiAqU1NMX1NFU1NJT05fdXBfcmVmKFNTTF9TRVNTSU9OICpzZXNzaW9uKTsKKworLyogU1NMX1NFU1NJT05fZnJlZSBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgfHNlc3Npb258LiBJZiBpdCByZWFjaGVzCisgKiB6ZXJvLCBhbGwgZGF0YSByZWZlcmVuY2VkIGJ5IHxzZXNzaW9ufCBhbmQgfHNlc3Npb258IGl0c2VsZiBhcmUgcmVsZWFzZWQuICovCitPUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9TRVNTSU9OX2ZyZWUoU1NMX1NFU1NJT04gKnNlc3Npb24pOworCitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3NldF9zZXNzaW9uKFNTTCAqdG8sIFNTTF9TRVNTSU9OICpzZXNzaW9uKTsKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX2FkZF9zZXNzaW9uKFNTTF9DVFggKnMsIFNTTF9TRVNTSU9OICpjKTsKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3JlbW92ZV9zZXNzaW9uKFNTTF9DVFggKiwgU1NMX1NFU1NJT04gKmMpOworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfc2V0X2dlbmVyYXRlX3Nlc3Npb25faWQoU1NMX0NUWCAqLCBHRU5fU0VTU0lPTl9DQik7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3NldF9nZW5lcmF0ZV9zZXNzaW9uX2lkKFNTTCAqLCBHRU5fU0VTU0lPTl9DQik7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX2hhc19tYXRjaGluZ19zZXNzaW9uX2lkKGNvbnN0IFNTTCAqc3NsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlkX2xlbik7CisKKy8qIFNTTF9TRVNTSU9OX3RvX2J5dGVzIHNlcmlhbGl6ZXMgfGlufCBpbnRvIGEgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBhbmQgc2V0cworICogfCpvdXRfZGF0YXwgdG8gdGhhdCBidWZmZXIgYW5kIHwqb3V0X2xlbnwgdG8gaXRzIGxlbmd0aC4gVGhlIGNhbGxlciB0YWtlcworICogb3duZXJzaGlwIG9mIHRoZSBidWZmZXIgYW5kIG11c3QgY2FsbCB8T1BFTlNTTF9mcmVlfCB3aGVuIGRvbmUuIEl0IHJldHVybnMKKyAqIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9TRVNTSU9OX3RvX2J5dGVzKFNTTF9TRVNTSU9OICppbiwgdWludDhfdCAqKm91dF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqb3V0X2xlbik7CisKKy8qIFNTTF9TRVNTSU9OX3RvX2J5dGVzX2Zvcl90aWNrZXQgc2VyaWFsaXplcyB8aW58LCBidXQgZXhjbHVkZXMgdGhlIHNlc3Npb24gSUQKKyAqIHdoaWNoIGlzIG5vdCBuZWNlc3NhcnkgaW4gYSBzZXNzaW9uIHRpY2tldC4gKi8KK09QRU5TU0xfRVhQT1JUIGludCBTU0xfU0VTU0lPTl90b19ieXRlc19mb3JfdGlja2V0KFNTTF9TRVNTSU9OICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipvdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqb3V0X2xlbik7CisKKy8qIERlcHJlY2F0ZWQ6IGkyZF9TU0xfU0VTU0lPTiBzZXJpYWxpemVzIHxpbnwgdG8gdGhlIGJ5dGVzIHBvaW50ZWQgdG8gYnkKKyAqIHwqcHB8LiBPbiBzdWNjZXNzLCBpdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBhbmQgYWR2YW5jZXMgfCpwcHwKKyAqIGJ5IHRoYXQgbWFueSBieXRlcy4gT24gZmFpbHVyZSwgaXQgcmV0dXJucyAtMS4gSWYgfHBwfCBpcyBOVUxMLCBubyBieXRlcyBhcmUKKyAqIHdyaXR0ZW4gYW5kIG9ubHkgdGhlIGxlbmd0aCBpcyByZXR1cm5lZC4KKyAqCisgKiBVc2UgU1NMX1NFU1NJT05fdG9fYnl0ZXMgaW5zdGVhZC4gKi8KK09QRU5TU0xfRVhQT1JUIGludCBpMmRfU1NMX1NFU1NJT04oU1NMX1NFU1NJT04gKmluLCB1aW50OF90ICoqcHApOworCisvKiBkMmlfU1NMX1NFU1NJT04gZGVzZXJpYWxpemVzIGEgc2VyaWFsaXplZCBidWZmZXIgY29udGFpbmVkIGluIHRoZSB8bGVuZ3RofAorICogYnl0ZXMgcG9pbnRlZCB0byBieSB8KnBwfC4gSXQgcmV0dXJucyB0aGUgbmV3IFNTTF9TRVNTSU9OIGFuZCBhZHZhbmNlcyB8KnBwfAorICogYnkgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBvbiBzdWNjZXNzIGFuZCBOVUxMIG9uIGZhaWx1cmUuIElmIHxhfCBpcworICogTlVMTCwgdGhlIGNhbGxlciB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIG5ldyBzZXNzaW9uIGFuZCBtdXN0IGNhbGwKKyAqIHxTU0xfU0VTU0lPTl9mcmVlfCB3aGVuIGRvbmUuCisgKgorICogSWYgfGF8IGFuZCB8KmF8IGFyZSBub3QgTlVMTCwgdGhlIFNTTF9TRVNTSU9OIGF0IHwqYXwgaXMgb3ZlcnJpZGRlbiB3aXRoIHRoZQorICogZGVzZXJpYWxpemVkIHNlc3Npb24gcmF0aGVyIHRoYW4gYWxsb2NhdGluZyBhIG5ldyBvbmUuIEluIGFkZGl0aW9uLCB8YXwgaXMKKyAqIG5vdCBOVUxMLCBidXQgfCphfCBpcywgfCphfCBpcyBzZXQgdG8gdGhlIG5ldyBTU0xfU0VTU0lPTi4KKyAqCisgKiBQYXNzaW5nIGEgdmFsdWUgb3RoZXIgdGhhbiBOVUxMIHRvIHxhfCBpcyBkZXByZWNhdGVkLiAqLworT1BFTlNTTF9FWFBPUlQgU1NMX1NFU1NJT04gKmQyaV9TU0xfU0VTU0lPTihTU0xfU0VTU0lPTiAqKmEsIGNvbnN0IHVpbnQ4X3QgKipwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsZW5ndGgpOworCitPUEVOU1NMX0VYUE9SVCBYNTA5ICpTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoY29uc3QgU1NMICpzKTsKKworT1BFTlNTTF9FWFBPUlQgU1RBQ0tfT0YoWDUwOSkgKlNTTF9nZXRfcGVlcl9jZXJ0X2NoYWluKGNvbnN0IFNTTCAqcyk7CisKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX2dldF92ZXJpZnlfbW9kZShjb25zdCBTU0xfQ1RYICpjdHgpOworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfZ2V0X3ZlcmlmeV9kZXB0aChjb25zdCBTU0xfQ1RYICpjdHgpOworT1BFTlNTTF9FWFBPUlQgaW50ICgqU1NMX0NUWF9nZXRfdmVyaWZ5X2NhbGxiYWNrKGNvbnN0IFNTTF9DVFggKmN0eCkpKAorICAgIGludCwgWDUwOV9TVE9SRV9DVFggKik7CitPUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2V0X3ZlcmlmeShTU0xfQ1RYICpjdHgsIGludCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqY2FsbGJhY2spKGludCwgWDUwOV9TVE9SRV9DVFggKikpOworT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfQ1RYX3NldF92ZXJpZnlfZGVwdGgoU1NMX0NUWCAqY3R4LCBpbnQgZGVwdGgpOworT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfQ1RYX3NldF9jZXJ0X3ZlcmlmeV9jYWxsYmFjaygKKyAgICBTU0xfQ1RYICpjdHgsIGludCAoKmNiKShYNTA5X1NUT1JFX0NUWCAqLCB2b2lkICopLCB2b2lkICphcmcpOworT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfQ1RYX3NldF9jZXJ0X2NiKFNTTF9DVFggKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqY2IpKFNTTCAqc3NsLCB2b2lkICphcmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZyk7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleShTU0xfQ1RYICpjdHgsIFJTQSAqcnNhKTsKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5X0FTTjEoU1NMX0NUWCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkLCBsb25nIGxlbik7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF91c2VfUHJpdmF0ZUtleShTU0xfQ1RYICpjdHgsIEVWUF9QS0VZICpwa2V5KTsKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X0FTTjEoaW50IHBrLCBTU0xfQ1RYICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmQsIGxvbmcgbGVuKTsKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZShTU0xfQ1RYICpjdHgsIFg1MDkgKngpOworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX0FTTjEoU1NMX0NUWCAqY3R4LCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZCk7CisKK09QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2IoU1NMX0NUWCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW1fcGFzc3dvcmRfY2IgKmNiKTsKK09QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2JfdXNlcmRhdGEoU1NMX0NUWCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1KTsKKworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfY2hlY2tfcHJpdmF0ZV9rZXkoY29uc3QgU1NMX0NUWCAqY3R4KTsKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfY2hlY2tfcHJpdmF0ZV9rZXkoY29uc3QgU1NMICpjdHgpOworCitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KFNTTF9DVFggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc2lkX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpZF9jdHhfbGVuKTsKKworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KFNTTCAqc3NsLCBjb25zdCB1aW50OF90ICpzaWRfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaWRfY3R4X2xlbik7CisKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3NldF9wdXJwb3NlKFNTTF9DVFggKnMsIGludCBwdXJwb3NlKTsKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfc2V0X3B1cnBvc2UoU1NMICpzLCBpbnQgcHVycG9zZSk7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9zZXRfdHJ1c3QoU1NMX0NUWCAqcywgaW50IHRydXN0KTsKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfc2V0X3RydXN0KFNTTCAqcywgaW50IHRydXN0KTsKKworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfc2V0MV9wYXJhbShTU0xfQ1RYICpjdHgsIFg1MDlfVkVSSUZZX1BBUkFNICp2cG0pOworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9zZXQxX3BhcmFtKFNTTCAqc3NsLCBYNTA5X1ZFUklGWV9QQVJBTSAqdnBtKTsKKworT1BFTlNTTF9FWFBPUlQgWDUwOV9WRVJJRllfUEFSQU0gKlNTTF9DVFhfZ2V0MF9wYXJhbShTU0xfQ1RYICpjdHgpOworT1BFTlNTTF9FWFBPUlQgWDUwOV9WRVJJRllfUEFSQU0gKlNTTF9nZXQwX3BhcmFtKFNTTCAqc3NsKTsKKworT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfY2VydHNfY2xlYXIoU1NMICpzKTsKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfYWNjZXB0KFNTTCAqc3NsKTsKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfY29ubmVjdChTU0wgKnNzbCk7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3JlYWQoU1NMICpzc2wsIHZvaWQgKmJ1ZiwgaW50IG51bSk7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3BlZWsoU1NMICpzc2wsIHZvaWQgKmJ1ZiwgaW50IG51bSk7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3dyaXRlKFNTTCAqc3NsLCBjb25zdCB2b2lkICpidWYsIGludCBudW0pOworT1BFTlNTTF9FWFBPUlQgbG9uZyBTU0xfY3RybChTU0wgKnNzbCwgaW50IGNtZCwgbG9uZyBsYXJnLCB2b2lkICpwYXJnKTsKK09QRU5TU0xfRVhQT1JUIGxvbmcgU1NMX0NUWF9jdHJsKFNTTF9DVFggKmN0eCwgaW50IGNtZCwgbG9uZyBsYXJnLCB2b2lkICpwYXJnKTsKKworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9nZXRfZXJyb3IoY29uc3QgU1NMICpzLCBpbnQgcmV0X2NvZGUpOworLyogU1NMX2dldF92ZXJzaW9uIHJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgVExTIHZlcnNpb24gdXNlZCBieSB8c3wuIEZvcgorICogZXhhbXBsZSwgIlRMU3YxLjIiIG9yICJTU0x2MyIuICovCitPUEVOU1NMX0VYUE9SVCBjb25zdCBjaGFyICpTU0xfZ2V0X3ZlcnNpb24oY29uc3QgU1NMICpzKTsKKy8qIFNTTF9TRVNTSU9OX2dldF92ZXJzaW9uIHJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgVExTIHZlcnNpb24gdXNlZCBieQorICogfHNlc3N8LiBGb3IgZXhhbXBsZSwgIlRMU3YxLjIiIG9yICJTU0x2MyIuICovCitPUEVOU1NMX0VYUE9SVCBjb25zdCBjaGFyICpTU0xfU0VTU0lPTl9nZXRfdmVyc2lvbihjb25zdCBTU0xfU0VTU0lPTiAqc2Vzcyk7CisKIE9QRU5TU0xfRVhQT1JUIFNUQUNLX09GKFNTTF9DSVBIRVIpICpTU0xfZ2V0X2NpcGhlcnMoY29uc3QgU1NMICpzKTsKIAorT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9kb19oYW5kc2hha2UoU1NMICpzKTsKKwogLyogU1NMX3JlbmVnb3RpYXRlX3BlbmRpbmcgcmV0dXJucyBvbmUgaWYgfHNzbHwgaXMgaW4gdGhlIG1pZGRsZSBvZiBhCiAgKiByZW5lZ290aWF0aW9uLiAqLwogT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9yZW5lZ290aWF0ZV9wZW5kaW5nKFNTTCAqc3NsKTsKIAorT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9zaHV0ZG93bihTU0wgKnMpOworCiBPUEVOU1NMX0VYUE9SVCBjb25zdCBjaGFyICpTU0xfYWxlcnRfdHlwZV9zdHJpbmdfbG9uZyhpbnQgdmFsdWUpOwogT1BFTlNTTF9FWFBPUlQgY29uc3QgY2hhciAqU1NMX2FsZXJ0X3R5cGVfc3RyaW5nKGludCB2YWx1ZSk7CiBPUEVOU1NMX0VYUE9SVCBjb25zdCBjaGFyICpTU0xfYWxlcnRfZGVzY19zdHJpbmdfbG9uZyhpbnQgdmFsdWUpOwogT1BFTlNTTF9FWFBPUlQgY29uc3QgY2hhciAqU1NMX2FsZXJ0X2Rlc2Nfc3RyaW5nKGludCB2YWx1ZSk7CiAKK09QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX3NldF9jbGllbnRfQ0FfbGlzdChTU0wgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBQ0tfT0YoWDUwOV9OQU1FKSAqbmFtZV9saXN0KTsKK09QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX0NUWF9zZXRfY2xpZW50X0NBX2xpc3QoU1NMX0NUWCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFDS19PRihYNTA5X05BTUUpICpuYW1lX2xpc3QpOworT1BFTlNTTF9FWFBPUlQgU1RBQ0tfT0YoWDUwOV9OQU1FKSAqU1NMX2dldF9jbGllbnRfQ0FfbGlzdChjb25zdCBTU0wgKnMpOworT1BFTlNTTF9FWFBPUlQgU1RBQ0tfT0YoWDUwOV9OQU1FKSAqCisgICAgU1NMX0NUWF9nZXRfY2xpZW50X0NBX2xpc3QoY29uc3QgU1NMX0NUWCAqcyk7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX2FkZF9jbGllbnRfQ0EoU1NMICpzc2wsIFg1MDkgKngpOworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfYWRkX2NsaWVudF9DQShTU0xfQ1RYICpjdHgsIFg1MDkgKngpOworCitPUEVOU1NMX0VYUE9SVCBsb25nIFNTTF9nZXRfZGVmYXVsdF90aW1lb3V0KGNvbnN0IFNTTCAqcyk7CisKK09QRU5TU0xfRVhQT1JUIFNUQUNLX09GKFg1MDlfTkFNRSkgKlNTTF9kdXBfQ0FfbGlzdChTVEFDS19PRihYNTA5X05BTUUpICpzayk7CisKK09QRU5TU0xfRVhQT1JUIFg1MDkgKlNTTF9nZXRfY2VydGlmaWNhdGUoY29uc3QgU1NMICpzc2wpOworT1BFTlNTTF9FWFBPUlQgRVZQX1BLRVkgKlNTTF9nZXRfcHJpdmF0ZWtleShjb25zdCBTU0wgKnNzbCk7CisKK09QRU5TU0xfRVhQT1JUIFg1MDkgKlNTTF9DVFhfZ2V0MF9jZXJ0aWZpY2F0ZShjb25zdCBTU0xfQ1RYICpjdHgpOworT1BFTlNTTF9FWFBPUlQgRVZQX1BLRVkgKlNTTF9DVFhfZ2V0MF9wcml2YXRla2V5KGNvbnN0IFNTTF9DVFggKmN0eCk7CisKIE9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX0NUWF9zZXRfcXVpZXRfc2h1dGRvd24oU1NMX0NUWCAqY3R4LCBpbnQgbW9kZSk7CiBPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9nZXRfcXVpZXRfc2h1dGRvd24oY29uc3QgU1NMX0NUWCAqY3R4KTsKIE9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX3NldF9xdWlldF9zaHV0ZG93bihTU0wgKnNzbCwgaW50IG1vZGUpOwogT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9nZXRfcXVpZXRfc2h1dGRvd24oY29uc3QgU1NMICpzc2wpOwogT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfc2V0X3NodXRkb3duKFNTTCAqc3NsLCBpbnQgbW9kZSk7CiBPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX2dldF9zaHV0ZG93bihjb25zdCBTU0wgKnNzbCk7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3ZlcnNpb24oY29uc3QgU1NMICpzc2wpOworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKFNTTF9DVFggKmN0eCk7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoU1NMX0NUWCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkNBZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpDQXBhdGgpOworI2RlZmluZSBTU0xfZ2V0MF9zZXNzaW9uIFNTTF9nZXRfc2Vzc2lvbiAvKiBqdXN0IHBlZWsgYXQgcG9pbnRlciAqLworT1BFTlNTTF9FWFBPUlQgU1NMX1NFU1NJT04gKlNTTF9nZXRfc2Vzc2lvbihjb25zdCBTU0wgKnNzbCk7CitPUEVOU1NMX0VYUE9SVCBTU0xfU0VTU0lPTiAqU1NMX2dldDFfc2Vzc2lvbigKKyAgICBTU0wgKnNzbCk7IC8qIG9idGFpbiBhIHJlZmVyZW5jZSBjb3VudCAqLwogT1BFTlNTTF9FWFBPUlQgU1NMX0NUWCAqU1NMX2dldF9TU0xfQ1RYKGNvbnN0IFNTTCAqc3NsKTsKIE9QRU5TU0xfRVhQT1JUIFNTTF9DVFggKlNTTF9zZXRfU1NMX0NUWChTU0wgKnNzbCwgU1NMX0NUWCAqY3R4KTsKIE9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX3NldF9pbmZvX2NhbGxiYWNrKFNTTCAqc3NsLApAQCAtMjU4MCw2ICsyMTE5LDYyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsIGludCB2YWwpOwogT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9zdGF0ZShjb25zdCBTU0wgKnNzbCk7CiAKK09QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX3NldF92ZXJpZnlfcmVzdWx0KFNTTCAqc3NsLCBsb25nIHYpOworT1BFTlNTTF9FWFBPUlQgbG9uZyBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoY29uc3QgU1NMICpzc2wpOworCitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3NldF9leF9kYXRhKFNTTCAqc3NsLCBpbnQgaWR4LCB2b2lkICpkYXRhKTsKK09QRU5TU0xfRVhQT1JUIHZvaWQgKlNTTF9nZXRfZXhfZGF0YShjb25zdCBTU0wgKnNzbCwgaW50IGlkeCk7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBUT19FWF9uZXcgKm5ld19mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBUT19FWF9kdXAgKmR1cF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmMpOworCitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX1NFU1NJT05fc2V0X2V4X2RhdGEoU1NMX1NFU1NJT04gKnNzLCBpbnQgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpOworT1BFTlNTTF9FWFBPUlQgdm9pZCAqU1NMX1NFU1NJT05fZ2V0X2V4X2RhdGEoY29uc3QgU1NMX1NFU1NJT04gKnNzLCBpbnQgaWR4KTsKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfU0VTU0lPTl9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBUT19FWF9uZXcgKm5ld19mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKTsKKworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfc2V0X2V4X2RhdGEoU1NMX0NUWCAqc3NsLCBpbnQgaWR4LCB2b2lkICpkYXRhKTsKK09QRU5TU0xfRVhQT1JUIHZvaWQgKlNTTF9DVFhfZ2V0X2V4X2RhdGEoY29uc3QgU1NMX0NUWCAqc3NsLCBpbnQgaWR4KTsKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmMpOworCitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX2dldF9leF9kYXRhX1g1MDlfU1RPUkVfQ1RYX2lkeCh2b2lkKTsKKworLyogU1NMX0NUWF9zZXNzX3NldF9jYWNoZV9zaXplIHNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB8Y3R4fCdzIHNlc3Npb24gY2FjaGUgdG8KKyAqIHxzaXplfC4gSXQgcmV0dXJucyB0aGUgcHJldmlvdXMgdmFsdWUuICovCitPUEVOU1NMX0VYUE9SVCB1bnNpZ25lZCBsb25nIFNTTF9DVFhfc2Vzc19zZXRfY2FjaGVfc2l6ZShTU0xfQ1RYICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpOworCisvKiBTU0xfQ1RYX3Nlc3NfZ2V0X2NhY2hlX3NpemUgcmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHxjdHh8J3Mgc2Vzc2lvbgorICogY2FjaGUuICovCitPUEVOU1NMX0VYUE9SVCB1bnNpZ25lZCBsb25nIFNTTF9DVFhfc2Vzc19nZXRfY2FjaGVfc2l6ZShjb25zdCBTU0xfQ1RYICpjdHgpOworCisvKiBTU0xfU0VTU19DQUNIRV8qIGFyZSB0aGUgcG9zc2libGUgc2Vzc2lvbiBjYWNoZSBtb2RlIGJpdHMuCisgKiBUT0RPKGRhdmlkYmVuKTogRG9jdW1lbnQuICovCisjZGVmaW5lIFNTTF9TRVNTX0NBQ0hFX09GRiAweDAwMDAKKyNkZWZpbmUgU1NMX1NFU1NfQ0FDSEVfQ0xJRU5UIDB4MDAwMQorI2RlZmluZSBTU0xfU0VTU19DQUNIRV9TRVJWRVIgMHgwMDAyCisjZGVmaW5lIFNTTF9TRVNTX0NBQ0hFX0JPVEggKFNTTF9TRVNTX0NBQ0hFX0NMSUVOVCB8IFNTTF9TRVNTX0NBQ0hFX1NFUlZFUikKKyNkZWZpbmUgU1NMX1NFU1NfQ0FDSEVfTk9fQVVUT19DTEVBUiAweDAwODAKKyNkZWZpbmUgU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfTE9PS1VQIDB4MDEwMAorI2RlZmluZSBTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTF9TVE9SRSAweDAyMDAKKyNkZWZpbmUgU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUwgXAorICAoU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfTE9PS1VQIHwgU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfU1RPUkUpCisKKy8qIFNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZSBzZXRzIHRoZSBzZXNzaW9uIGNhY2hlIG1vZGUgYml0cyBmb3IgfGN0eHwgdG8KKyAqIHxtb2RlfC4gSXQgcmV0dXJucyB0aGUgcHJldmlvdXMgdmFsdWUuICovCitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9zZXRfc2Vzc2lvbl9jYWNoZV9tb2RlKFNTTF9DVFggKmN0eCwgaW50IG1vZGUpOworCisvKiBTU0xfQ1RYX2dldF9zZXNzaW9uX2NhY2hlX21vZGUgcmV0dXJucyB0aGUgc2Vzc2lvbiBjYWNoZSBtb2RlIGJpdHMgZm9yCisgKiB8Y3R4fCAqLworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfZ2V0X3Nlc3Npb25fY2FjaGVfbW9kZShjb25zdCBTU0xfQ1RYICpjdHgpOworCiAvKiBTU0xfQ1RYX2dldF9tYXhfY2VydF9saXN0IHJldHVybnMgdGhlIG1heGltdW0gbGVuZ3RoLCBpbiBieXRlcywgb2YgYSBwZWVyCiAgKiBjZXJ0aWZpY2F0ZSBjaGFpbiBhY2NlcHRlZCBieSB8Y3R4fC4gKi8KIE9QRU5TU0xfRVhQT1JUIHNpemVfdCBTU0xfQ1RYX2dldF9tYXhfY2VydF9saXN0KGNvbnN0IFNTTF9DVFggKmN0eCk7CkBAIC0yNjExLDEyICsyMjA2LDgyIEBACiBPUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9zZXRfbWF4X3NlbmRfZnJhZ21lbnQoU1NMICpzc2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1heF9zZW5kX2ZyYWdtZW50KTsKIAorLyogU1NMX0NUWF9zZXRfdG1wX2RoX2NhbGxiYWNrIGNvbmZpZ3VyZXMgfGN0eHwgdG8gdXNlIHxjYWxsYmFja3wgdG8gZGV0ZXJtaW5lCisgKiB0aGUgZ3JvdXAgZm9yIERIRSBjaXBoZXJzLiB8Y2FsbGJhY2t8IHNob3VsZCBpZ25vcmUgfGlzX2V4cG9ydHwgYW5kCisgKiB8a2V5bGVuZ3RofCBhbmQgcmV0dXJuIGEgfERIfCBvZiB0aGUgc2VsZWN0ZWQgZ3JvdXAgb3IgTlVMTCBvbiBlcnJvci4gT25seQorICogdGhlIHBhcmFtZXRlcnMgYXJlIHVzZWQsIHNvIHRoZSB8REh8IG5lZWRuJ3QgaGF2ZSBhIGdlbmVyYXRlZCBrZXlwYWlyLgorICoKKyAqIFdBUk5JTkc6IFRoZSBjYWxsZXIgZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIHJlc3VsdGluZyB8REh8LCBzbworICogfGNhbGxiYWNrfCBtdXN0IHNhdmUgYW5kIHJlbGVhc2UgdGhlIG9iamVjdCBlbHNld2hlcmUuICovCitPUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2V0X3RtcF9kaF9jYWxsYmFjaygKKyAgICBTU0xfQ1RYICpjdHgsIERIICooKmNhbGxiYWNrKShTU0wgKnNzbCwgaW50IGlzX2V4cG9ydCwgaW50IGtleWxlbmd0aCkpOworCisvKiBTU0xfc2V0X3RtcF9kaF9jYWxsYmFjayBjb25maWd1cmVzIHxzc2x8IHRvIHVzZSB8Y2FsbGJhY2t8IHRvIGRldGVybWluZSB0aGUKKyAqIGdyb3VwIGZvciBESEUgY2lwaGVycy4gfGNhbGxiYWNrfCBzaG91bGQgaWdub3JlIHxpc19leHBvcnR8IGFuZCB8a2V5bGVuZ3RofAorICogYW5kIHJldHVybiBhIHxESHwgb2YgdGhlIHNlbGVjdGVkIGdyb3VwIG9yIE5VTEwgb24gZXJyb3IuIE9ubHkgdGhlCisgKiBwYXJhbWV0ZXJzIGFyZSB1c2VkLCBzbyB0aGUgfERIfCBuZWVkbid0IGhhdmUgYSBnZW5lcmF0ZWQga2V5cGFpci4KKyAqCisgKiBXQVJOSU5HOiBUaGUgY2FsbGVyIGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZSByZXN1bHRpbmcgfERIfCwgc28KKyAqIHxjYWxsYmFja3wgbXVzdCBzYXZlIGFuZCByZWxlYXNlIHRoZSBvYmplY3QgZWxzZXdoZXJlLiAqLworT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfc2V0X3RtcF9kaF9jYWxsYmFjayhTU0wgKnNzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREggKigqZGgpKFNTTCAqc3NsLCBpbnQgaXNfZXhwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleWxlbmd0aCkpOworCisvKiBTU0xfQ1RYX3NldF90bXBfZWNkaF9jYWxsYmFjayBjb25maWd1cmVzIHxjdHh8IHRvIHVzZSB8Y2FsbGJhY2t8IHRvIGRldGVybWluZQorICogdGhlIGN1cnZlIGZvciBlcGhlbWVyYWwgRUNESCBrZXlzLiB8Y2FsbGJhY2t8IHNob3VsZCBpZ25vcmUgfGlzX2V4cG9ydHwgYW5kCisgKiB8a2V5bGVuZ3RofCBhbmQgcmV0dXJuIGFuIHxFQ19LRVl8IG9mIHRoZSBzZWxlY3RlZCBjdXJ2ZSBvciBOVUxMIG9uCisgKiBlcnJvci4gT25seSB0aGUgY3VydmUgaXMgdXNlZCwgc28gdGhlIHxFQ19LRVl8IG5lZWRuJ3QgaGF2ZSBhIGdlbmVyYXRlZAorICoga2V5cGFpci4KKyAqCisgKiBJZiB0aGUgY2FsbGJhY2sgaXMgdW5zZXQsIGFuIGFwcHJvcHJpYXRlIGN1cnZlIHdpbGwgYmUgY2hvc2VuIGF1dG9tYXRpY2FsbHkuCisgKiAoVGhpcyBpcyByZWNvbW1lbmRlZC4pCisgKgorICogV0FSTklORzogVGhlIGNhbGxlciBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgcmVzdWx0aW5nIHxFQ19LRVl8LCBzbworICogfGNhbGxiYWNrfCBtdXN0IHNhdmUgYW5kIHJlbGVhc2UgdGhlIG9iamVjdCBlbHNld2hlcmUuICovCitPUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2V0X3RtcF9lY2RoX2NhbGxiYWNrKAorICAgIFNTTF9DVFggKmN0eCwgRUNfS0VZICooKmNhbGxiYWNrKShTU0wgKnNzbCwgaW50IGlzX2V4cG9ydCwgaW50IGtleWxlbmd0aCkpOworCisvKiBTU0xfc2V0X3RtcF9lY2RoX2NhbGxiYWNrIGNvbmZpZ3VyZXMgfHNzbHwgdG8gdXNlIHxjYWxsYmFja3wgdG8gZGV0ZXJtaW5lIHRoZQorICogY3VydmUgZm9yIGVwaGVtZXJhbCBFQ0RIIGtleXMuIHxjYWxsYmFja3wgc2hvdWxkIGlnbm9yZSB8aXNfZXhwb3J0fCBhbmQKKyAqIHxrZXlsZW5ndGh8IGFuZCByZXR1cm4gYW4gfEVDX0tFWXwgb2YgdGhlIHNlbGVjdGVkIGN1cnZlIG9yIE5VTEwgb24KKyAqIGVycm9yLiBPbmx5IHRoZSBjdXJ2ZSBpcyB1c2VkLCBzbyB0aGUgfEVDX0tFWXwgbmVlZG4ndCBoYXZlIGEgZ2VuZXJhdGVkCisgKiBrZXlwYWlyLgorICoKKyAqIElmIHRoZSBjYWxsYmFjayBpcyB1bnNldCwgYW4gYXBwcm9wcmlhdGUgY3VydmUgd2lsbCBiZSBjaG9zZW4gYXV0b21hdGljYWxseS4KKyAqIChUaGlzIGlzIHJlY29tbWVuZGVkLikKKyAqCisgKiBXQVJOSU5HOiBUaGUgY2FsbGVyIGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZSByZXN1bHRpbmcgfEVDX0tFWXwsIHNvCisgKiB8Y2FsbGJhY2t8IG11c3Qgc2F2ZSBhbmQgcmVsZWFzZSB0aGUgb2JqZWN0IGVsc2V3aGVyZS4gKi8KK09QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX3NldF90bXBfZWNkaF9jYWxsYmFjaygKKyAgICBTU0wgKnNzbCwgRUNfS0VZICooKmNhbGxiYWNrKShTU0wgKnNzbCwgaW50IGlzX2V4cG9ydCwgaW50IGtleWxlbmd0aCkpOworCitPUEVOU1NMX0VYUE9SVCBjb25zdCB2b2lkICpTU0xfZ2V0X2N1cnJlbnRfY29tcHJlc3Npb24oU1NMICpzKTsKK09QRU5TU0xfRVhQT1JUIGNvbnN0IHZvaWQgKlNTTF9nZXRfY3VycmVudF9leHBhbnNpb24oU1NMICpzKTsKKworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9jYWNoZV9oaXQoU1NMICpzKTsKK09QRU5TU0xfRVhQT1JUIGludCBTU0xfaXNfc2VydmVyKFNTTCAqcyk7CisKIC8qIFNTTF9DVFhfc2V0X2Rvc19wcm90ZWN0aW9uX2NiIHNldHMgYSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBvbmNlIHRoZQogICogcmVzdW1wdGlvbiBkZWNpc2lvbiBmb3IgYSBDbGllbnRIZWxsbyBoYXMgYmVlbiBtYWRlLiBJdCBjYW4gcmV0dXJuIDEgdG8KICAqIGFsbG93IHRoZSBoYW5kc2hha2UgdG8gY29udGludWUgb3IgemVybyB0byBjYXVzZSB0aGUgaGFuZHNoYWtlIHRvIGFib3J0LiAqLwogT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfQ1RYX3NldF9kb3NfcHJvdGVjdGlvbl9jYigKICAgICBTU0xfQ1RYICpjdHgsIGludCAoKmNiKShjb25zdCBzdHJ1Y3Qgc3NsX2Vhcmx5X2NhbGxiYWNrX2N0eCAqKSk7CiAKKy8qIFNTTF9nZXRfc3RydWN0dXJlX3NpemVzIHJldHVybnMgdGhlIHNpemVzIG9mIHRoZSBTU0wsIFNTTF9DVFggYW5kCisgKiBTU0xfU0VTU0lPTiBzdHJ1Y3R1cmVzIHNvIHRoYXQgYSB0ZXN0IGNhbiBlbnN1cmUgdGhhdCBvdXRzaWRlIGNvZGUgYWdyZWVzIG9uCisgKiB0aGVzZSB2YWx1ZXMuICovCitPUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9nZXRfc3RydWN0dXJlX3NpemVzKHNpemVfdCAqc3NsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqc3NsX2N0eF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnNzbF9zZXNzaW9uX3NpemUpOworCitPUEVOU1NMX0VYUE9SVCB2b2lkIEVSUl9sb2FkX1NTTF9zdHJpbmdzKHZvaWQpOworCisvKiBTU0xfZ2V0X3JjNF9zdGF0ZSBzZXRzIHwqcmVhZF9rZXl8IGFuZCB8KndyaXRlX2tleXwgdG8gdGhlIFJDNCBzdGF0ZXMgZm9yCisgKiB0aGUgcmVhZCBhbmQgd3JpdGUgZGlyZWN0aW9ucy4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciB6ZXJvIGlmIHxzc2x8CisgKiBpc24ndCB1c2luZyBhbiBSQzQtYmFzZWQgY2lwaGVyIHN1aXRlLiAqLworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9nZXRfcmM0X3N0YXRlKGNvbnN0IFNTTCAqc3NsLCBjb25zdCBSQzRfS0VZICoqcmVhZF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkM0X0tFWSAqKndyaXRlX2tleSk7CisKIAogLyogRGVwcmVjYXRlZCBmdW5jdGlvbnMuICovCiAKQEAgLTI2MzQsMTYgKzIyOTksMTQgQEAKIC8qIFNTTF9DSVBIRVJfZ2V0X3ZlcnNpb24gcmV0dXJucyB0aGUgc3RyaW5nICJUTFN2MS9TU0x2MyIuICovCiBPUEVOU1NMX0VYUE9SVCBjb25zdCBjaGFyICpTU0xfQ0lQSEVSX2dldF92ZXJzaW9uKGNvbnN0IFNTTF9DSVBIRVIgKmNpcGhlcik7CiAKLXR5cGVkZWYgdm9pZCBDT01QX01FVEhPRDsKLQogLyogU1NMX0NPTVBfZ2V0X2NvbXByZXNzaW9uX21ldGhvZHMgcmV0dXJucyBOVUxMLiAqLwotT1BFTlNTTF9FWFBPUlQgQ09NUF9NRVRIT0QgKlNTTF9DT01QX2dldF9jb21wcmVzc2lvbl9tZXRob2RzKHZvaWQpOworT1BFTlNTTF9FWFBPUlQgdm9pZCAqU1NMX0NPTVBfZ2V0X2NvbXByZXNzaW9uX21ldGhvZHModm9pZCk7CiAKIC8qIFNTTF9DT01QX2FkZF9jb21wcmVzc2lvbl9tZXRob2QgcmV0dXJucyBvbmUuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NPTVBfYWRkX2NvbXByZXNzaW9uX21ldGhvZChpbnQgaWQsIENPTVBfTUVUSE9EICpjbSk7CitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NPTVBfYWRkX2NvbXByZXNzaW9uX21ldGhvZChpbnQgaWQsIHZvaWQgKmNtKTsKIAogLyogU1NMX0NPTVBfZ2V0X25hbWUgcmV0dXJucyBOVUxMLiAqLwotT1BFTlNTTF9FWFBPUlQgY29uc3QgY2hhciAqU1NMX0NPTVBfZ2V0X25hbWUoY29uc3QgQ09NUF9NRVRIT0QgKmNvbXApOworT1BFTlNTTF9FWFBPUlQgY29uc3QgY2hhciAqU1NMX0NPTVBfZ2V0X25hbWUoY29uc3Qgdm9pZCAqY29tcCk7CiAKIC8qIFNTTHYyM19tZXRob2QgY2FsbHMgfFRMU19tZXRob2R8LiAqLwogT1BFTlNTTF9FWFBPUlQgY29uc3QgU1NMX01FVEhPRCAqU1NMdjIzX21ldGhvZCh2b2lkKTsKQEAgLTI3NDQsMTMgKzI0MDcsMTMgQEAKIC8qIFNTTF9zZXRfdG1wX3JzYSByZXR1cm5zIG9uZS4gKi8KIE9QRU5TU0xfRVhQT1JUIGludCBTU0xfc2V0X3RtcF9yc2EoU1NMICpzc2wsIGNvbnN0IFJTQSAqcnNhKTsKIAotLyogU1NMX0NUWF9nZXRfcmVhZF9haGVhZCByZXR1cm5zIHplcm8uICovCisvKiBTU0xfQ1RYX2dldF9yZWFkX2hlYWQgcmV0dXJucyB6ZXJvLiAqLwogT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9DVFhfZ2V0X3JlYWRfYWhlYWQoY29uc3QgU1NMX0NUWCAqY3R4KTsKIAogLyogU1NMX0NUWF9zZXRfcmVhZF9haGVhZCBkb2VzIG5vdGhpbmcuICovCiBPUEVOU1NMX0VYUE9SVCB2b2lkIFNTTF9DVFhfc2V0X3JlYWRfYWhlYWQoU1NMX0NUWCAqY3R4LCBpbnQgeWVzKTsKIAotLyogU1NMX2dldF9yZWFkX2FoZWFkIHJldHVybnMgemVyby4gKi8KKy8qIFNTTF9nZXRfcmVhZF9oZWFkIHJldHVybnMgemVyby4gKi8KIE9QRU5TU0xfRVhQT1JUIGludCBTU0xfZ2V0X3JlYWRfYWhlYWQoY29uc3QgU1NMICpzKTsKIAogLyogU1NMX3NldF9yZWFkX2FoZWFkIGRvZXMgbm90aGluZy4gKi8KQEAgLTI3NjIsNzE4ICsyNDI1LDYgQEAKIC8qIFNTTF9zZXRfc3RhdGUgZG9lcyBub3RoaW5nLiAqLwogT1BFTlNTTF9FWFBPUlQgdm9pZCBTU0xfc2V0X3N0YXRlKFNTTCAqc3NsLCBpbnQgc3RhdGUpOwogCi0vKiBTU0xfTU9ERV9IQU5EU0hBS0VfQ1VUVEhST1VHSCBpcyB0aGUgc2FtZSBhcyBTU0xfTU9ERV9FTkFCTEVfRkFMU0VfU1RBUlQuICovCi0jZGVmaW5lIFNTTF9NT0RFX0hBTkRTSEFLRV9DVVRUSFJPVUdIIFNTTF9NT0RFX0VOQUJMRV9GQUxTRV9TVEFSVAotCi0vKiBpMmRfU1NMX1NFU1NJT04gc2VyaWFsaXplcyB8aW58IHRvIHRoZSBieXRlcyBwb2ludGVkIHRvIGJ5IHwqcHB8LiBPbiBzdWNjZXNzLAotICogaXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gYW5kIGFkdmFuY2VzIHwqcHB8IGJ5IHRoYXQgbWFueSBieXRlcy4KLSAqIE9uIGZhaWx1cmUsIGl0IHJldHVybnMgLTEuIElmIHxwcHwgaXMgTlVMTCwgbm8gYnl0ZXMgYXJlIHdyaXR0ZW4gYW5kIG9ubHkgdGhlCi0gKiBsZW5ndGggaXMgcmV0dXJuZWQuCi0gKgotICogVXNlIHxTU0xfU0VTU0lPTl90b19ieXRlc3wgaW5zdGVhZC4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBpMmRfU1NMX1NFU1NJT04oU1NMX1NFU1NJT04gKmluLCB1aW50OF90ICoqcHApOwotCi0vKiBkMmlfU1NMX1NFU1NJT04gcGFyc2VzIGEgc2VyaWFsaXplZCBzZXNzaW9uIGZyb20gdGhlIHxsZW5ndGh8IGJ5dGVzIHBvaW50ZWQKLSAqIHRvIGJ5IHwqcHB8LiBJdCByZXR1cm5zIHRoZSBuZXcgfFNTTF9TRVNTSU9OfCBhbmQgYWR2YW5jZXMgfCpwcHwgYnkgdGhlCi0gKiBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgb24gc3VjY2VzcyBhbmQgTlVMTCBvbiBmYWlsdXJlLiBUaGUgY2FsbGVyIHRha2VzCi0gKiBvd25lcnNoaXAgb2YgdGhlIG5ldyBzZXNzaW9uIGFuZCBtdXN0IGNhbGwgfFNTTF9TRVNTSU9OX2ZyZWV8IHdoZW4gZG9uZS4KLSAqCi0gKiBJZiB8YXwgaXMgbm9uLU5VTEwsIHwqYXwgaXMgcmVsZWFzZWQgYW5kIHNldCB0aGUgbmV3IHxTU0xfU0VTU0lPTnwuCi0gKgotICogVXNlIHxTU0xfU0VTU0lPTl9mcm9tX2J5dGVzfCBpbnN0ZWFkLiAqLwotT1BFTlNTTF9FWFBPUlQgU1NMX1NFU1NJT04gKmQyaV9TU0xfU0VTU0lPTihTU0xfU0VTU0lPTiAqKmEsIGNvbnN0IHVpbnQ4X3QgKipwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsZW5ndGgpOwotCi0vKiBFUlJfbG9hZF9TU0xfc3RyaW5ncyBkb2VzIG5vdGhpbmcuICovCi1PUEVOU1NMX0VYUE9SVCB2b2lkIEVSUl9sb2FkX1NTTF9zdHJpbmdzKHZvaWQpOwotCi0vKiBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzIGRvZXMgbm90aGluZy4gKi8KLU9QRU5TU0xfRVhQT1JUIHZvaWQgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncyh2b2lkKTsKLQotLyogU1NMX0NUWF9zZXRfdGxzZXh0X3VzZV9zcnRwIGNhbGxzIHxTU0xfQ1RYX3NldF9zcnRwX3Byb2ZpbGVzfC4gSXQgcmV0dXJucwotICogemVybyBvbiBzdWNjZXNzIGFuZCBvbmUgb24gZmFpbHVyZS4KLSAqCi0gKiBXQVJOSU5HOiB0aGlzIGZ1bmN0aW9uIGlzIGRhbmdlcm91cyBiZWNhdXNlIGl0IGJyZWFrcyB0aGUgdXN1YWwgcmV0dXJuIHZhbHVlCi0gKiBjb252ZW50aW9uLiBVc2UgfFNTTF9DVFhfc2V0X3NydHBfcHJvZmlsZXN8IGluc3RlYWQuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9zZXRfdGxzZXh0X3VzZV9zcnRwKFNTTF9DVFggKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvZmlsZXMpOwotCi0vKiBTU0xfc2V0X3Rsc2V4dF91c2Vfc3J0cCBjYWxscyB8U1NMX3NldF9zcnRwX3Byb2ZpbGVzfC4gSXQgcmV0dXJucyB6ZXJvIG9uCi0gKiBzdWNjZXNzIGFuZCBvbmUgb24gZmFpbHVyZS4KLSAqCi0gKiBXQVJOSU5HOiB0aGlzIGZ1bmN0aW9uIGlzIGRhbmdlcm91cyBiZWNhdXNlIGl0IGJyZWFrcyB0aGUgdXN1YWwgcmV0dXJuIHZhbHVlCi0gKiBjb252ZW50aW9uLiBVc2UgfFNTTF9zZXRfc3J0cF9wcm9maWxlc3wgaW5zdGVhZC4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBTU0xfc2V0X3Rsc2V4dF91c2Vfc3J0cChTU0wgKnNzbCwgY29uc3QgY2hhciAqcHJvZmlsZXMpOwotCi0vKiBTU0xfZ2V0X2N1cnJlbnRfY29tcHJlc3Npb24gcmV0dXJucyBOVUxMLiAqLwotT1BFTlNTTF9FWFBPUlQgY29uc3QgQ09NUF9NRVRIT0QgKlNTTF9nZXRfY3VycmVudF9jb21wcmVzc2lvbihTU0wgKnMpOwotCi0vKiBTU0xfZ2V0X2N1cnJlbnRfZXhwYW5zaW9uIHJldHVybnMgTlVMTC4gKi8KLU9QRU5TU0xfRVhQT1JUIGNvbnN0IENPTVBfTUVUSE9EICpTU0xfZ2V0X2N1cnJlbnRfZXhwYW5zaW9uKFNTTCAqcyk7Ci0KLSNkZWZpbmUgU1NMX3NldF9hcHBfZGF0YShzLCBhcmcpIChTU0xfc2V0X2V4X2RhdGEocywgMCwgKGNoYXIgKilhcmcpKQotI2RlZmluZSBTU0xfZ2V0X2FwcF9kYXRhKHMpIChTU0xfZ2V0X2V4X2RhdGEocywgMCkpCi0jZGVmaW5lIFNTTF9TRVNTSU9OX3NldF9hcHBfZGF0YShzLCBhKSBcCi0gIChTU0xfU0VTU0lPTl9zZXRfZXhfZGF0YShzLCAwLCAoY2hhciAqKWEpKQotI2RlZmluZSBTU0xfU0VTU0lPTl9nZXRfYXBwX2RhdGEocykgKFNTTF9TRVNTSU9OX2dldF9leF9kYXRhKHMsIDApKQotI2RlZmluZSBTU0xfQ1RYX2dldF9hcHBfZGF0YShjdHgpIChTU0xfQ1RYX2dldF9leF9kYXRhKGN0eCwgMCkpCi0jZGVmaW5lIFNTTF9DVFhfc2V0X2FwcF9kYXRhKGN0eCwgYXJnKSBcCi0gIChTU0xfQ1RYX3NldF9leF9kYXRhKGN0eCwgMCwgKGNoYXIgKilhcmcpKQotCi0jZGVmaW5lIE9wZW5TU0xfYWRkX3NzbF9hbGdvcml0aG1zKCkgU1NMX2xpYnJhcnlfaW5pdCgpCi0jZGVmaW5lIFNTTGVheV9hZGRfc3NsX2FsZ29yaXRobXMoKSBTU0xfbGlicmFyeV9pbml0KCkKLQotI2RlZmluZSBTU0xfZ2V0X2NpcGhlcihzc2wpIFNTTF9DSVBIRVJfZ2V0X25hbWUoU1NMX2dldF9jdXJyZW50X2NpcGhlcihzc2wpKQotI2RlZmluZSBTU0xfZ2V0X2NpcGhlcl9iaXRzKHNzbCwgb3V0X2FsZ19iaXRzKSBcCi0JICBTU0xfQ0lQSEVSX2dldF9iaXRzKFNTTF9nZXRfY3VycmVudF9jaXBoZXIoc3NsKSwgb3V0X2FsZ19iaXRzKQotI2RlZmluZSBTU0xfZ2V0X2NpcGhlcl92ZXJzaW9uKHNzbCkgXAotCSAgU1NMX0NJUEhFUl9nZXRfdmVyc2lvbihTU0xfZ2V0X2N1cnJlbnRfY2lwaGVyKHNzbCkpCi0jZGVmaW5lIFNTTF9nZXRfY2lwaGVyX25hbWUoc3NsKSBcCi0JICBTU0xfQ0lQSEVSX2dldF9uYW1lKFNTTF9nZXRfY3VycmVudF9jaXBoZXIoc3NsKSkKLSNkZWZpbmUgU1NMX2dldF90aW1lKHNlc3Npb24pIFNTTF9TRVNTSU9OX2dldF90aW1lKHNlc3Npb24pCi0jZGVmaW5lIFNTTF9zZXRfdGltZShzZXNzaW9uLCB0aW1lKSBTU0xfU0VTU0lPTl9zZXRfdGltZSgoc2Vzc2lvbiksICh0aW1lKSkKLSNkZWZpbmUgU1NMX2dldF90aW1lb3V0KHNlc3Npb24pIFNTTF9TRVNTSU9OX2dldF90aW1lb3V0KHNlc3Npb24pCi0jZGVmaW5lIFNTTF9zZXRfdGltZW91dChzZXNzaW9uLCB0aW1lb3V0KSBcCi0JCVNTTF9TRVNTSU9OX3NldF90aW1lb3V0KChzZXNzaW9uKSwgKHRpbWVvdXQpKQotCi10eXBlZGVmIHN0cnVjdCBzc2xfY29tcF9zdCBTU0xfQ09NUDsKLQotc3RydWN0IHNzbF9jb21wX3N0IHsKLSAgaW50IGlkOwotICBjb25zdCBjaGFyICpuYW1lOwotICBjaGFyICptZXRob2Q7Ci19OwotCi1ERUNMQVJFX1NUQUNLX09GKFNTTF9DT01QKQotCi0vKiBUaGUgZm9sbG93aW5nIGZsYWdzIHRvZ2dsZSBpbmRpdmlkdWFsIHByb3RvY29sIHZlcnNpb25zLiBUaGlzIGlzIGRlcHJlY2F0ZWQuCi0gKiBVc2UgfFNTTF9DVFhfc2V0X21pbl92ZXJzaW9ufCBhbmQgfFNTTF9DVFhfc2V0X21heF92ZXJzaW9ufCBpbnN0ZWFkLiAqLwotI2RlZmluZSBTU0xfT1BfTk9fU1NMdjMgMHgwMjAwMDAwMEwKLSNkZWZpbmUgU1NMX09QX05PX1RMU3YxIDB4MDQwMDAwMDBMCi0jZGVmaW5lIFNTTF9PUF9OT19UTFN2MV8yIDB4MDgwMDAwMDBMCi0jZGVmaW5lIFNTTF9PUF9OT19UTFN2MV8xIDB4MTAwMDAwMDBMCi0jZGVmaW5lIFNTTF9PUF9OT19EVExTdjEgU1NMX09QX05PX1RMU3YxCi0jZGVmaW5lIFNTTF9PUF9OT19EVExTdjFfMiBTU0xfT1BfTk9fVExTdjFfMgotCi0vKiBUaGUgZm9sbG93aW5nIGZsYWdzIGRvIG5vdGhpbmcgYW5kIGFyZSBpbmNsdWRlZCBvbmx5IHRvIG1ha2UgaXQgZWFzaWVyIHRvCi0gKiBjb21waWxlIGNvZGUgd2l0aCBCb3JpbmdTU0wuICovCi0jZGVmaW5lIFNTTF9NT0RFX0FVVE9fUkVUUlkgMAotI2RlZmluZSBTU0xfTU9ERV9SRUxFQVNFX0JVRkZFUlMgMAotI2RlZmluZSBTU0xfTU9ERV9TRU5EX0NMSUVOVEhFTExPX1RJTUUgMAotI2RlZmluZSBTU0xfTU9ERV9TRU5EX1NFUlZFUkhFTExPX1RJTUUgMAotI2RlZmluZSBTU0xfT1BfQUxMT1dfVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OIDAKLSNkZWZpbmUgU1NMX09QX0RPTlRfSU5TRVJUX0VNUFRZX0ZSQUdNRU5UUyAwCi0jZGVmaW5lIFNTTF9PUF9FUEhFTUVSQUxfUlNBIDAKLSNkZWZpbmUgU1NMX09QX01JQ1JPU09GVF9TRVNTX0lEX0JVRyAwCi0jZGVmaW5lIFNTTF9PUF9NU0lFX1NTTFYyX1JTQV9QQURESU5HIDAKLSNkZWZpbmUgU1NMX09QX05FVFNDQVBFX0NBX0ROX0JVRyAwCi0jZGVmaW5lIFNTTF9PUF9ORVRTQ0FQRV9DSEFMTEVOR0VfQlVHIDAKLSNkZWZpbmUgU1NMX09QX05FVFNDQVBFX0RFTU9fQ0lQSEVSX0NIQU5HRV9CVUcgMAotI2RlZmluZSBTU0xfT1BfTkVUU0NBUEVfUkVVU0VfQ0lQSEVSX0NIQU5HRV9CVUcgMAotI2RlZmluZSBTU0xfT1BfTk9fQ09NUFJFU1NJT04gMAotI2RlZmluZSBTU0xfT1BfTk9fU0VTU0lPTl9SRVNVTVBUSU9OX09OX1JFTkVHT1RJQVRJT04gMAotI2RlZmluZSBTU0xfT1BfTk9fU1NMdjIgMAotI2RlZmluZSBTU0xfT1BfUEtDUzFfQ0hFQ0tfMSAwCi0jZGVmaW5lIFNTTF9PUF9QS0NTMV9DSEVDS18yIDAKLSNkZWZpbmUgU1NMX09QX1NJTkdMRV9ESF9VU0UgMAotI2RlZmluZSBTU0xfT1BfU0lOR0xFX0VDREhfVVNFIDAKLSNkZWZpbmUgU1NMX09QX1NTTEVBWV8wODBfQ0xJRU5UX0RIX0JVRyAwCi0jZGVmaW5lIFNTTF9PUF9TU0xSRUYyX1JFVVNFX0NFUlRfVFlQRV9CVUcgMAotI2RlZmluZSBTU0xfT1BfVExTX0JMT0NLX1BBRERJTkdfQlVHIDAKLSNkZWZpbmUgU1NMX09QX1RMU19ST0xMQkFDS19CVUcgMAotI2RlZmluZSBTU0xfVkVSSUZZX0NMSUVOVF9PTkNFIDAKLQotLyogU1NMX2NhY2hlX2hpdCBjYWxscyB8U1NMX3Nlc3Npb25fcmVzdW1lZHwuICovCi1PUEVOU1NMX0VYUE9SVCBpbnQgU1NMX2NhY2hlX2hpdChTU0wgKnNzbCk7Ci0KLS8qIFNTTF9nZXRfZGVmYXVsdF90aW1lb3V0IHJldHVybnMgfFNTTF9ERUZBVUxUX1NFU1NJT05fVElNRU9VVHwuICovCi1PUEVOU1NMX0VYUE9SVCBsb25nIFNTTF9nZXRfZGVmYXVsdF90aW1lb3V0KGNvbnN0IFNTTCAqc3NsKTsKLQotLyogU1NMX2dldF92ZXJzaW9uIHJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgVExTIHZlcnNpb24gdXNlZCBieSB8c3NsfC4KLSAqIEZvciBleGFtcGxlLCAiVExTdjEuMiIgb3IgIlNTTHYzIi4gKi8KLU9QRU5TU0xfRVhQT1JUIGNvbnN0IGNoYXIgKlNTTF9nZXRfdmVyc2lvbihjb25zdCBTU0wgKnNzbCk7Ci0KLQotLyogUHJpdmF0ZSBzdHJ1Y3R1cmVzLgotICoKLSAqIFRoaXMgc3RydWN0dXJlcyBhcmUgZXhwb3NlZCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLCBidXQgYWNjZXNzIHRvIHRoZW0gaXMKLSAqIGRlcHJlY2F0ZWQuICovCi0KLXN0cnVjdCBzc2xfY2lwaGVyX3N0IHsKLSAgLyogbmFtZSBpcyB0aGUgT3BlblNTTCBuYW1lIGZvciB0aGUgY2lwaGVyLiAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBpZCBpcyB0aGUgY2lwaGVyIHN1aXRlIHZhbHVlIGJpdHdpc2UgT1ItZCB3aXRoIDB4MDMwMDAwMDAuICovCi0gIHVpbnQzMl90IGlkOwotCi0gIC8qIFRoZSBmb2xsb3dpbmcgYXJlIGludGVybmFsIGZpZWxkcy4gU2VlIHNzbC9pbnRlcm5hbC5oIGZvciB0aGVpciB2YWx1ZXMuICovCi0KLSAgdWludDMyX3QgYWxnb3JpdGhtX21rZXk7Ci0gIHVpbnQzMl90IGFsZ29yaXRobV9hdXRoOwotICB1aW50MzJfdCBhbGdvcml0aG1fZW5jOwotICB1aW50MzJfdCBhbGdvcml0aG1fbWFjOwotICB1aW50MzJfdCBhbGdvcml0aG1fc3NsOwotICB1aW50MzJfdCBhbGdvX3N0cmVuZ3RoOwotICB1aW50MzJfdCBhbGdvcml0aG1fcHJmOwotCi0gIC8qIHN0cmVuZ3RoX2JpdHMgaXMgdGhlIHN0cmVuZ3RoIG9mIHRoZSBjaXBoZXIgaW4gYml0cy4gKi8KLSAgaW50IHN0cmVuZ3RoX2JpdHM7Ci0gIC8qIGFsZ19iaXRzIGlzIHRoZSBudW1iZXIgb2YgYml0cyBvZiBrZXkgbWF0ZXJpYWwgdXNlZCBieSB0aGUgYWxnb3JpdGhtLiAqLwotICBpbnQgYWxnX2JpdHM7Ci19OwotCi1zdHJ1Y3Qgc3NsX3Nlc3Npb25fc3QgewotICBpbnQgc3NsX3ZlcnNpb247IC8qIHdoYXQgc3NsIHZlcnNpb24gc2Vzc2lvbiBpbmZvIGlzIGJlaW5nIGtlcHQgaW4gaGVyZT8gKi8KLQotICBpbnQgbWFzdGVyX2tleV9sZW5ndGg7Ci0gIHVpbnQ4X3QgbWFzdGVyX2tleVtTU0xfTUFYX01BU1RFUl9LRVlfTEVOR1RIXTsKLSAgLyogc2Vzc2lvbl9pZCAtIHZhbGlkPyAqLwotICB1bnNpZ25lZCBpbnQgc2Vzc2lvbl9pZF9sZW5ndGg7Ci0gIHVpbnQ4X3Qgc2Vzc2lvbl9pZFtTU0xfTUFYX1NTTF9TRVNTSU9OX0lEX0xFTkdUSF07Ci0gIC8qIHRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgc2Vzc2lvbiBpcyBiZWluZyByZXVzZWQgaW4KLSAgICogdGhlIGFwcHJvcHJpYXRlIGNvbnRleHQuIEl0IGlzIHVwIHRvIHRoZSBhcHBsaWNhdGlvbiB0byBzZXQgdGhpcywKLSAgICogdmlhIFNTTF9uZXcgKi8KLSAgdW5zaWduZWQgaW50IHNpZF9jdHhfbGVuZ3RoOwotICB1aW50OF90IHNpZF9jdHhbU1NMX01BWF9TSURfQ1RYX0xFTkdUSF07Ci0KLSAgY2hhciAqcHNrX2lkZW50aXR5OwotICAvKiBVc2VkIHRvIGluZGljYXRlIHRoYXQgc2Vzc2lvbiByZXN1bXB0aW9uIGlzIG5vdCBhbGxvd2VkLiBBcHBsaWNhdGlvbnMgY2FuCi0gICAqIGFsc28gc2V0IHRoaXMgYml0IGZvciBhIG5ldyBzZXNzaW9uIHZpYSBub3RfcmVzdW1hYmxlX3Nlc3Npb25fY2IgdG8KLSAgICogZGlzYWJsZSBzZXNzaW9uIGNhY2hpbmcgYW5kIHRpY2tldHMuICovCi0gIGludCBub3RfcmVzdW1hYmxlOwotCi0gIC8qIHBlZXIgaXMgdGhlIHBlZXIncyBjZXJ0aWZpY2F0ZS4gKi8KLSAgWDUwOSAqcGVlcjsKLQotICAvKiBjZXJ0X2NoYWluIGlzIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiBzZW50IGJ5IHRoZSBwZWVyLiBOT1RFOiBmb3IgaGlzdG9yaWNhbAotICAgKiByZWFzb25zLCB3aGVuIGEgY2xpZW50IChzbyB0aGUgcGVlciBpcyBhIHNlcnZlciksIHRoZSBjaGFpbiBpbmNsdWRlcwotICAgKiB8cGVlcnwsIGJ1dCB3aGVuIGEgc2VydmVyIGl0IGRvZXMgbm90LiAqLwotICBTVEFDS19PRihYNTA5KSAqY2VydF9jaGFpbjsKLQotICAvKiB3aGVuIGFwcF92ZXJpZnlfY2FsbGJhY2sgYWNjZXB0cyBhIHNlc3Npb24gd2hlcmUgdGhlIHBlZXIncyBjZXJ0aWZpY2F0ZSBpcwotICAgKiBub3Qgb2ssIHdlIG11c3QgcmVtZW1iZXIgdGhlIGVycm9yIGZvciBzZXNzaW9uIHJldXNlOiAqLwotICBsb25nIHZlcmlmeV9yZXN1bHQ7IC8qIG9ubHkgZm9yIHNlcnZlcnMgKi8KLQotICBDUllQVE9fcmVmY291bnRfdCByZWZlcmVuY2VzOwotICBsb25nIHRpbWVvdXQ7Ci0gIGxvbmcgdGltZTsKLQotICBjb25zdCBTU0xfQ0lQSEVSICpjaXBoZXI7Ci0KLSAgLyoga2V5X2V4Y2hhbmdlX2luZm8gY29udGFpbnMgYW4gaW5kaWNhdGlvbiBvZiB0aGUgc2l6ZSBvZiB0aGUgYXN5bW1ldHJpYwotICAgKiBwcmltaXRpdmUgdXNlZCBpbiB0aGUgaGFuZHNoYWtlIHRoYXQgY3JlYXRlZCB0aGlzIHNlc3Npb24uIEluIHRoZSBldmVudAotICAgKiB0aGF0IHR3byBhc3ltbWV0cmljIG9wZXJhdGlvbnMgYXJlIHVzZWQsIHRoaXMgdmFsdWUgYXBwbGllcyB0byB0aGUgb25lCi0gICAqIHRoYXQgY29udHJvbHMgdGhlIGNvbmZpZGVudGlhbGl0eSBvZiB0aGUgY29ubmVjdGlvbi4gSXRzIGludGVycHJldGF0aW9uCi0gICAqIGRlcGVuZHMgb24gdGhlIHByaW1pdGl2ZSB0aGF0IHdhcyB1c2VkOyBhcyBzcGVjaWZpZWQgYnkgdGhlIGNpcGhlciBzdWl0ZToKLSAgICogICBESEU6IHRoZSBzaXplLCBpbiBiaXRzLCBvZiB0aGUgbXVsdGlwbGljYXRpdmUgZ3JvdXAuCi0gICAqICAgUlNBOiB0aGUgc2l6ZSwgaW4gYml0cywgb2YgdGhlIG1vZHVsdXMuCi0gICAqICAgRUNESEU6IHRoZSBUTFMgaWQgZm9yIHRoZSBjdXJ2ZS4KLSAgICoKLSAgICogQSB6ZXJvIGluZGljYXRlcyB0aGF0IHRoZSB2YWx1ZSBpcyB1bmtub3duLiAqLwotICB1aW50MzJfdCBrZXlfZXhjaGFuZ2VfaW5mbzsKLQotICBDUllQVE9fRVhfREFUQSBleF9kYXRhOyAvKiBhcHBsaWNhdGlvbiBzcGVjaWZpYyBkYXRhICovCi0KLSAgLyogVGhlc2UgYXJlIHVzZWQgdG8gbWFrZSByZW1vdmFsIG9mIHNlc3Npb24taWRzIG1vcmUgZWZmaWNpZW50IGFuZCB0bwotICAgKiBpbXBsZW1lbnQgYSBtYXhpbXVtIGNhY2hlIHNpemUuICovCi0gIFNTTF9TRVNTSU9OICpwcmV2LCAqbmV4dDsKLSAgY2hhciAqdGxzZXh0X2hvc3RuYW1lOwotICAvKiBSRkM0NTA3IGluZm8gKi8KLSAgdWludDhfdCAqdGxzZXh0X3RpY2s7ICAgICAgICAgICAgICAgLyogU2Vzc2lvbiB0aWNrZXQgKi8KLSAgc2l6ZV90IHRsc2V4dF90aWNrbGVuOyAgICAgICAgICAgICAgLyogU2Vzc2lvbiB0aWNrZXQgbGVuZ3RoICovCi0gIHVpbnQzMl90IHRsc2V4dF90aWNrX2xpZmV0aW1lX2hpbnQ7IC8qIFNlc3Npb24gbGlmZXRpbWUgaGludCBpbiBzZWNvbmRzICovCi0KLSAgc2l6ZV90IHRsc2V4dF9zaWduZWRfY2VydF90aW1lc3RhbXBfbGlzdF9sZW5ndGg7Ci0gIHVpbnQ4X3QgKnRsc2V4dF9zaWduZWRfY2VydF90aW1lc3RhbXBfbGlzdDsgLyogU2VydmVyJ3MgbGlzdC4gKi8KLQotICAvKiBUaGUgT0NTUCByZXNwb25zZSB0aGF0IGNhbWUgd2l0aCB0aGUgc2Vzc2lvbi4gKi8KLSAgc2l6ZV90IG9jc3BfcmVzcG9uc2VfbGVuZ3RoOwotICB1aW50OF90ICpvY3NwX3Jlc3BvbnNlOwotCi0gIGNoYXIgcGVlcl9zaGEyNTZfdmFsaWQ7IC8qIE5vbi16ZXJvIGlmIHBlZXJfc2hhMjU2IGlzIHZhbGlkICovCi0gIHVpbnQ4X3QKLSAgICAgIHBlZXJfc2hhMjU2W1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTsgLyogU0hBMjU2IG9mIHBlZXIgY2VydGlmaWNhdGUgKi8KLQotICAvKiBvcmlnaW5hbF9oYW5kc2hha2VfaGFzaCBjb250YWlucyB0aGUgaGFuZHNoYWtlIGhhc2ggKGVpdGhlciBTSEEtMStNRDUgb3IKLSAgICogU0hBLTIsIGRlcGVuZGluZyBvbiBUTFMgdmVyc2lvbikgZm9yIHRoZSBvcmlnaW5hbCwgZnVsbCBoYW5kc2hha2UgdGhhdAotICAgKiBjcmVhdGVkIGEgc2Vzc2lvbi4gVGhpcyBpcyB1c2VkIGJ5IENoYW5uZWwgSURzIGR1cmluZyByZXN1bXB0aW9uLiAqLwotICB1aW50OF90IG9yaWdpbmFsX2hhbmRzaGFrZV9oYXNoW0VWUF9NQVhfTURfU0laRV07Ci0gIHVuc2lnbmVkIGludCBvcmlnaW5hbF9oYW5kc2hha2VfaGFzaF9sZW47Ci0KLSAgLyogZXh0ZW5kZWRfbWFzdGVyX3NlY3JldCBpcyB0cnVlIGlmIHRoZSBtYXN0ZXIgc2VjcmV0IGluIHRoaXMgc2Vzc2lvbiB3YXMKLSAgICogZ2VuZXJhdGVkIHVzaW5nIEVNUyBhbmQgdGh1cyBpc24ndCB2dWxuZXJhYmxlIHRvIHRoZSBUcmlwbGUgSGFuZHNoYWtlCi0gICAqIGF0dGFjay4gKi8KLSAgY2hhciBleHRlbmRlZF9tYXN0ZXJfc2VjcmV0OwotfTsKLQotLyogc3NsX2NpcGhlcl9wcmVmZXJlbmNlX2xpc3Rfc3QgY29udGFpbnMgYSBsaXN0IG9mIFNTTF9DSVBIRVJzIHdpdGgKLSAqIGVxdWFsLXByZWZlcmVuY2UgZ3JvdXBzLiBGb3IgVExTIGNsaWVudHMsIHRoZSBncm91cHMgYXJlIG1vb3QgYmVjYXVzZSB0aGUKLSAqIHNlcnZlciBwaWNrcyB0aGUgY2lwaGVyIGFuZCBncm91cHMgY2Fubm90IGJlIGV4cHJlc3NlZCBvbiB0aGUgd2lyZS4gSG93ZXZlciwKLSAqIGZvciBzZXJ2ZXJzLCB0aGUgZXF1YWwtcHJlZmVyZW5jZSBncm91cHMgYWxsb3cgdGhlIGNsaWVudCdzIHByZWZlcmVuY2VzIHRvCi0gKiBiZSBwYXJ0aWFsbHkgcmVzcGVjdGVkLiAoVGhpcyBvbmx5IGhhcyBhbiBlZmZlY3Qgd2l0aAotICogU1NMX09QX0NJUEhFUl9TRVJWRVJfUFJFRkVSRU5DRSkuCi0gKgotICogVGhlIGVxdWFsLXByZWZlcmVuY2UgZ3JvdXBzIGFyZSBleHByZXNzZWQgYnkgZ3JvdXBpbmcgU1NMX0NJUEhFUnMgdG9nZXRoZXIuCi0gKiBBbGwgZWxlbWVudHMgb2YgYSBncm91cCBoYXZlIHRoZSBzYW1lIHByaW9yaXR5OiBubyBvcmRlcmluZyBpcyBleHByZXNzZWQKLSAqIHdpdGhpbiBhIGdyb3VwLgotICoKLSAqIFRoZSB2YWx1ZXMgaW4gfGNpcGhlcnN8IGFyZSBpbiBvbmUtdG8tb25lIGNvcnJlc3BvbmRlbmNlIHdpdGgKLSAqIHxpbl9ncm91cF9mbGFnc3wuIChUaGF0IGlzLCBza19TU0xfQ0lQSEVSX251bShjaXBoZXJzKSBpcyB0aGUgbnVtYmVyIG9mCi0gKiBieXRlcyBpbiB8aW5fZ3JvdXBfZmxhZ3N8LikgVGhlIGJ5dGVzIGluIHxpbl9ncm91cF9mbGFnc3wgYXJlIGVpdGhlciAxLCB0bwotICogaW5kaWNhdGUgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBTU0xfQ0lQSEVSIGlzIG5vdCB0aGUgbGFzdCBlbGVtZW50IG9mIGEKLSAqIGdyb3VwLCBvciAwIHRvIGluZGljYXRlIHRoYXQgaXQgaXMuCi0gKgotICogRm9yIGV4YW1wbGUsIGlmIHxpbl9ncm91cF9mbGFnc3wgY29udGFpbnMgYWxsIHplcm9zIHRoZW4gdGhhdCBpbmRpY2F0ZXMgYQotICogdHJhZGl0aW9uYWwsIGZ1bGx5LW9yZGVyZWQgcHJlZmVyZW5jZS4gRXZlcnkgU1NMX0NJUEhFUiBpcyB0aGUgbGFzdCBlbGVtZW50Ci0gKiBvZiB0aGUgZ3JvdXAgKGkuZS4gdGhleSBhcmUgYWxsIGluIGEgb25lLWVsZW1lbnQgZ3JvdXApLgotICoKLSAqIEZvciBhIG1vcmUgY29tcGxleCBleGFtcGxlLCBjb25zaWRlcjoKLSAqICAgY2lwaGVyczogICAgICAgIEEgIEIgIEMgIEQgIEUgIEYKLSAqICAgaW5fZ3JvdXBfZmxhZ3M6IDEgIDEgIDAgIDAgIDEgIDAKLSAqCi0gKiBUaGF0IHdvdWxkIGV4cHJlc3MgdGhlIGZvbGxvd2luZywgb3JkZXI6Ci0gKgotICogICAgQSAgICAgICAgIEUKLSAqICAgIEIgLT4gRCAtPiBGCi0gKiAgICBDCi0gKi8KLXN0cnVjdCBzc2xfY2lwaGVyX3ByZWZlcmVuY2VfbGlzdF9zdCB7Ci0gIFNUQUNLX09GKFNTTF9DSVBIRVIpICpjaXBoZXJzOwotICB1aW50OF90ICppbl9ncm91cF9mbGFnczsKLX07Ci0KLXN0cnVjdCBzc2xfY3R4X3N0IHsKLSAgY29uc3QgU1NMX1BST1RPQ09MX01FVEhPRCAqbWV0aG9kOwotCi0gIC8qIGxvY2sgaXMgdXNlZCB0byBwcm90ZWN0IHZhcmlvdXMgb3BlcmF0aW9ucyBvbiB0aGlzIG9iamVjdC4gKi8KLSAgQ1JZUFRPX01VVEVYIGxvY2s7Ci0KLSAgLyogbWF4X3ZlcnNpb24gaXMgdGhlIG1heGltdW0gYWNjZXB0YWJsZSBwcm90b2NvbCB2ZXJzaW9uLiBJZiB6ZXJvLCB0aGUKLSAgICogbWF4aW11bSBzdXBwb3J0ZWQgdmVyc2lvbiwgY3VycmVudGx5IChEKVRMUyAxLjIsIGlzIHVzZWQuICovCi0gIHVpbnQxNl90IG1heF92ZXJzaW9uOwotCi0gIC8qIG1pbl92ZXJzaW9uIGlzIHRoZSBtaW5pbXVtIGFjY2VwdGFibGUgcHJvdG9jbCB2ZXJzaW9uLiBJZiB6ZXJvLCB0aGUKLSAgICogbWluaW11bSBzdXBwb3J0ZWQgdmVyc2lvbiwgY3VycmVudGx5IFNTTCAzLjAgYW5kIERUTFMgMS4wLCBpcyB1c2VkICovCi0gIHVpbnQxNl90IG1pbl92ZXJzaW9uOwotCi0gIHN0cnVjdCBzc2xfY2lwaGVyX3ByZWZlcmVuY2VfbGlzdF9zdCAqY2lwaGVyX2xpc3Q7Ci0gIC8qIHNhbWUgYXMgYWJvdmUgYnV0IHNvcnRlZCBmb3IgbG9va3VwICovCi0gIFNUQUNLX09GKFNTTF9DSVBIRVIpICpjaXBoZXJfbGlzdF9ieV9pZDsKLQotICAvKiBjaXBoZXJfbGlzdF90bHMxMCBpcyB0aGUgbGlzdCBvZiBjaXBoZXJzIHdoZW4gVExTIDEuMCBvciBncmVhdGVyIGlzIGluCi0gICAqIHVzZS4gVGhpcyBvbmx5IGFwcGxpZXMgdG8gc2VydmVyIGNvbm5lY3Rpb25zIGFzLCBmb3IgY2xpZW50cywgdGhlIHZlcnNpb24KLSAgICogbnVtYmVyIGlzIGtub3duIGF0IGNvbm5lY3QgdGltZSBhbmQgc28gdGhlIGNpcGhlciBsaXN0IGNhbiBiZSBzZXQgdGhlbi4gSWYKLSAgICogfGNpcGhlcl9saXN0X3RsczExfCBpcyBub24tTlVMTCB0aGVuIHRoaXMgYXBwbGllcyBvbmx5IHRvIFRMUyAxLjAKLSAgICogY29ubmVjdGlvbnMuCi0gICAqCi0gICAqIFRPRE8oYWdsKTogdGhpcyBleGlzdHMgdG8gYXNzaXN0IGluIHRoZSBkZWF0aCBvZiBTU0x2My4gSXQgY2FuIGhvcGVmdWxseQotICAgKiBiZSByZW1vdmVkIGFmdGVyIHRoYXQuICovCi0gIHN0cnVjdCBzc2xfY2lwaGVyX3ByZWZlcmVuY2VfbGlzdF9zdCAqY2lwaGVyX2xpc3RfdGxzMTA7Ci0KLSAgLyogY2lwaGVyX2xpc3RfdGxzMTEgaXMgdGhlIGxpc3Qgb2YgY2lwaGVycyB3aGVuIFRMUyAxLjEgb3IgZ3JlYXRlciBpcyBpbgotICAgKiB1c2UuIFRoaXMgb25seSBhcHBsaWVzIHRvIHNlcnZlciBjb25uZWN0aW9ucyBhcywgZm9yIGNsaWVudHMsIHRoZSB2ZXJzaW9uCi0gICAqIG51bWJlciBpcyBrbm93biBhdCBjb25uZWN0IHRpbWUgYW5kIHNvIHRoZSBjaXBoZXIgbGlzdCBjYW4gYmUgc2V0IHRoZW4uICovCi0gIHN0cnVjdCBzc2xfY2lwaGVyX3ByZWZlcmVuY2VfbGlzdF9zdCAqY2lwaGVyX2xpc3RfdGxzMTE7Ci0KLSAgWDUwOV9TVE9SRSAqY2VydF9zdG9yZTsKLSAgTEhBU0hfT0YoU1NMX1NFU1NJT04pICpzZXNzaW9uczsKLSAgLyogTW9zdCBzZXNzaW9uLWlkcyB0aGF0IHdpbGwgYmUgY2FjaGVkLCBkZWZhdWx0IGlzCi0gICAqIFNTTF9TRVNTSU9OX0NBQ0hFX01BWF9TSVpFX0RFRkFVTFQuIDAgaXMgdW5saW1pdGVkLiAqLwotICB1bnNpZ25lZCBsb25nIHNlc3Npb25fY2FjaGVfc2l6ZTsKLSAgU1NMX1NFU1NJT04gKnNlc3Npb25fY2FjaGVfaGVhZDsKLSAgU1NMX1NFU1NJT04gKnNlc3Npb25fY2FjaGVfdGFpbDsKLQotICAvKiBoYW5kc2hha2VzX3NpbmNlX2NhY2hlX2ZsdXNoIGlzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCBoYW5kc2hha2VzIHNpbmNlCi0gICAqIHRoZSBsYXN0IGNhY2hlIGZsdXNoLiAqLwotICBpbnQgaGFuZHNoYWtlc19zaW5jZV9jYWNoZV9mbHVzaDsKLQotICAvKiBUaGlzIGNhbiBoYXZlIG9uZSBvZiAyIHZhbHVlcywgb3JlZCB0b2dldGhlciwKLSAgICogU1NMX1NFU1NfQ0FDSEVfQ0xJRU5ULAotICAgKiBTU0xfU0VTU19DQUNIRV9TRVJWRVIsCi0gICAqIERlZmF1bHQgaXMgU1NMX1NFU1NJT05fQ0FDSEVfU0VSVkVSLCB3aGljaCBtZWFucyBvbmx5Ci0gICAqIFNTTF9hY2NlcHQgd2hpY2ggY2FjaGUgU1NMX1NFU1NJT05TLiAqLwotICBpbnQgc2Vzc2lvbl9jYWNoZV9tb2RlOwotCi0gIC8qIElmIHRpbWVvdXQgaXMgbm90IDAsIGl0IGlzIHRoZSBkZWZhdWx0IHRpbWVvdXQgdmFsdWUgc2V0IHdoZW4gU1NMX25ldygpIGlzCi0gICAqIGNhbGxlZC4gIFRoaXMgaGFzIGJlZW4gcHV0IGluIHRvIG1ha2UgbGlmZSBlYXNpZXIgdG8gc2V0IHRoaW5ncyB1cCAqLwotICBsb25nIHNlc3Npb25fdGltZW91dDsKLQotICAvKiBJZiB0aGlzIGNhbGxiYWNrIGlzIG5vdCBudWxsLCBpdCB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgYSBzZXNzaW9uIGlkIGlzCi0gICAqIGFkZGVkIHRvIHRoZSBjYWNoZS4gIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAxLCBpdCBtZWFucyB0aGF0IHRoZQotICAgKiBjYWxsYmFjayB3aWxsIGRvIGEgU1NMX1NFU1NJT05fZnJlZSgpIHdoZW4gaXQgaGFzIGZpbmlzaGVkIHVzaW5nIGl0LgotICAgKiBPdGhlcndpc2UsIG9uIDAsIGl0IG1lYW5zIHRoZSBjYWxsYmFjayBoYXMgZmluaXNoZWQgd2l0aCBpdC4gSWYKLSAgICogcmVtb3ZlX3Nlc3Npb25fY2IgaXMgbm90IG51bGwsIGl0IHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBzZXNzaW9uLWlkIGlzCi0gICAqIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuICBBZnRlciB0aGUgY2FsbCwgT3BlblNTTCB3aWxsIFNTTF9TRVNTSU9OX2ZyZWUoKQotICAgKiBpdC4gKi8KLSAgaW50ICgqbmV3X3Nlc3Npb25fY2IpKFNTTCAqc3NsLCBTU0xfU0VTU0lPTiAqc2Vzcyk7Ci0gIHZvaWQgKCpyZW1vdmVfc2Vzc2lvbl9jYikoU1NMX0NUWCAqY3R4LCBTU0xfU0VTU0lPTiAqc2Vzcyk7Ci0gIFNTTF9TRVNTSU9OICooKmdldF9zZXNzaW9uX2NiKShTU0wgKnNzbCwgdWludDhfdCAqZGF0YSwgaW50IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY29weSk7Ci0KLSAgQ1JZUFRPX3JlZmNvdW50X3QgcmVmZXJlbmNlczsKLQotICAvKiBpZiBkZWZpbmVkLCB0aGVzZSBvdmVycmlkZSB0aGUgWDUwOV92ZXJpZnlfY2VydCgpIGNhbGxzICovCi0gIGludCAoKmFwcF92ZXJpZnlfY2FsbGJhY2spKFg1MDlfU1RPUkVfQ1RYICpzdG9yZV9jdHgsIHZvaWQgKmFyZyk7Ci0gIHZvaWQgKmFwcF92ZXJpZnlfYXJnOwotCi0gIC8qIERlZmF1bHQgcGFzc3dvcmQgY2FsbGJhY2suICovCi0gIHBlbV9wYXNzd29yZF9jYiAqZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2s7Ci0KLSAgLyogRGVmYXVsdCBwYXNzd29yZCBjYWxsYmFjayB1c2VyIGRhdGEuICovCi0gIHZvaWQgKmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrX3VzZXJkYXRhOwotCi0gIC8qIGdldCBjbGllbnQgY2VydCBjYWxsYmFjayAqLwotICBpbnQgKCpjbGllbnRfY2VydF9jYikoU1NMICpzc2wsIFg1MDkgKip4NTA5LCBFVlBfUEtFWSAqKnBrZXkpOwotCi0gIC8qIGdldCBjaGFubmVsIGlkIGNhbGxiYWNrICovCi0gIHZvaWQgKCpjaGFubmVsX2lkX2NiKShTU0wgKnNzbCwgRVZQX1BLRVkgKipvdXRfcGtleSk7Ci0KLSAgQ1JZUFRPX0VYX0RBVEEgZXhfZGF0YTsKLQotICAvKiBjdXN0b21fKl9leHRlbnNpb25zIHN0b3JlcyBhbnkgY2FsbGJhY2sgc2V0cyBmb3IgY3VzdG9tIGV4dGVuc2lvbnMuIE5vdGUKLSAgICogdGhhdCB0aGVzZSBwb2ludGVycyB3aWxsIGJlIE5VTEwgaWYgdGhlIHN0YWNrIHdvdWxkIG90aGVyd2lzZSBiZSBlbXB0eS4gKi8KLSAgU1RBQ0tfT0YoU1NMX0NVU1RPTV9FWFRFTlNJT04pICpjbGllbnRfY3VzdG9tX2V4dGVuc2lvbnM7Ci0gIFNUQUNLX09GKFNTTF9DVVNUT01fRVhURU5TSU9OKSAqc2VydmVyX2N1c3RvbV9leHRlbnNpb25zOwotCi0gIC8qIERlZmF1bHQgdmFsdWVzIHVzZWQgd2hlbiBubyBwZXItU1NMIHZhbHVlIGlzIGRlZmluZWQgZm9sbG93ICovCi0KLSAgdm9pZCAoKmluZm9fY2FsbGJhY2spKGNvbnN0IFNTTCAqc3NsLCBpbnQgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWwpOyAvKiB1c2VkIGlmIFNTTCdzIGluZm9fY2FsbGJhY2sgaXMgTlVMTCAqLwotCi0gIC8qIHdoYXQgd2UgcHV0IGluIGNsaWVudCBjZXJ0IHJlcXVlc3RzICovCi0gIFNUQUNLX09GKFg1MDlfTkFNRSkgKmNsaWVudF9DQTsKLQotCi0gIC8qIERlZmF1bHQgdmFsdWVzIHRvIHVzZSBpbiBTU0wgc3RydWN0dXJlcyBmb2xsb3cgKHRoZXNlIGFyZSBjb3BpZWQgYnkKLSAgICogU1NMX25ldykgKi8KLQotICB1aW50MzJfdCBvcHRpb25zOwotICB1aW50MzJfdCBtb2RlOwotICB1aW50MzJfdCBtYXhfY2VydF9saXN0OwotCi0gIHN0cnVjdCBjZXJ0X3N0IC8qIENFUlQgKi8gKmNlcnQ7Ci0KLSAgLyogY2FsbGJhY2sgdGhhdCBhbGxvd3MgYXBwbGljYXRpb25zIHRvIHBlZWsgYXQgcHJvdG9jb2wgbWVzc2FnZXMgKi8KLSAgdm9pZCAoKm1zZ19jYWxsYmFjaykoaW50IHdyaXRlX3AsIGludCB2ZXJzaW9uLCBpbnQgY29udGVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4sIFNTTCAqc3NsLCB2b2lkICphcmcpOwotICB2b2lkICptc2dfY2FsbGJhY2tfYXJnOwotCi0gIGludCB2ZXJpZnlfbW9kZTsKLSAgdW5zaWduZWQgaW50IHNpZF9jdHhfbGVuZ3RoOwotICB1aW50OF90IHNpZF9jdHhbU1NMX01BWF9TSURfQ1RYX0xFTkdUSF07Ci0gIGludCAoKmRlZmF1bHRfdmVyaWZ5X2NhbGxiYWNrKSgKLSAgICAgIGludCBvaywgWDUwOV9TVE9SRV9DVFggKmN0eCk7IC8qIGNhbGxlZCAndmVyaWZ5X2NhbGxiYWNrJyBpbiB0aGUgU1NMICovCi0KLSAgLyogRGVmYXVsdCBnZW5lcmF0ZSBzZXNzaW9uIElEIGNhbGxiYWNrLiAqLwotICBHRU5fU0VTU0lPTl9DQiBnZW5lcmF0ZV9zZXNzaW9uX2lkOwotCi0gIFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbTsKLQotICAvKiBzZWxlY3RfY2VydGlmaWNhdGVfY2IgaXMgY2FsbGVkIGJlZm9yZSBtb3N0IENsaWVudEhlbGxvIHByb2Nlc3NpbmcgYW5kCi0gICAqIGJlZm9yZSB0aGUgZGVjaXNpb24gd2hldGhlciB0byByZXN1bWUgYSBzZXNzaW9uIGlzIG1hZGUuIEl0IG1heSByZXR1cm4gb25lCi0gICAqIHRvIGNvbnRpbnVlIHRoZSBoYW5kc2hha2Ugb3IgemVybyB0byBjYXVzZSB0aGUgaGFuZHNoYWtlIGxvb3AgdG8gcmV0dXJuCi0gICAqIHdpdGggYW4gZXJyb3IgYW5kIGNhdXNlIFNTTF9nZXRfZXJyb3IgdG8gcmV0dXJuCi0gICAqIFNTTF9FUlJPUl9QRU5ESU5HX0NFUlRJRklDQVRFLiBOb3RlOiB3aGVuIHRoZSBoYW5kc2hha2UgbG9vcCBpcyByZXN1bWVkLCBpdAotICAgKiB3aWxsIG5vdCBjYWxsIHRoZSBjYWxsYmFjayBhIHNlY29uZCB0aW1lLiAqLwotICBpbnQgKCpzZWxlY3RfY2VydGlmaWNhdGVfY2IpKGNvbnN0IHN0cnVjdCBzc2xfZWFybHlfY2FsbGJhY2tfY3R4ICopOwotCi0gIC8qIGRvc19wcm90ZWN0aW9uX2NiIGlzIGNhbGxlZCBvbmNlIHRoZSByZXN1bXB0aW9uIGRlY2lzaW9uIGZvciBhIENsaWVudEhlbGxvCi0gICAqIGhhcyBiZWVuIG1hZGUuIEl0IHJldHVybnMgb25lIHRvIGNvbnRpbnVlIHRoZSBoYW5kc2hha2Ugb3IgemVybyB0bwotICAgKiBhYm9ydC4gKi8KLSAgaW50ICgqZG9zX3Byb3RlY3Rpb25fY2IpIChjb25zdCBzdHJ1Y3Qgc3NsX2Vhcmx5X2NhbGxiYWNrX2N0eCAqKTsKLQotICAvKiBxdWlldF9zaHV0ZG93biBpcyB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIHNob3VsZCBub3Qgc2VuZCBhIGNsb3NlX25vdGlmeSBvbgotICAgKiBzaHV0ZG93bi4gKi8KLSAgaW50IHF1aWV0X3NodXRkb3duOwotCi0gIC8qIE1heGltdW0gYW1vdW50IG9mIGRhdGEgdG8gc2VuZCBpbiBvbmUgZnJhZ21lbnQuIGFjdHVhbCByZWNvcmQgc2l6ZSBjYW4gYmUKLSAgICogbW9yZSB0aGFuIHRoaXMgZHVlIHRvIHBhZGRpbmcgYW5kIE1BQyBvdmVyaGVhZHMuICovCi0gIHVpbnQxNl90IG1heF9zZW5kX2ZyYWdtZW50OwotCi0gIC8qIFRMUyBleHRlbnNpb25zIHNlcnZlcm5hbWUgY2FsbGJhY2sgKi8KLSAgaW50ICgqdGxzZXh0X3NlcnZlcm5hbWVfY2FsbGJhY2spKFNTTCAqLCBpbnQgKiwgdm9pZCAqKTsKLSAgdm9pZCAqdGxzZXh0X3NlcnZlcm5hbWVfYXJnOwotICAvKiBSRkMgNDUwNyBzZXNzaW9uIHRpY2tldCBrZXlzICovCi0gIHVpbnQ4X3QgdGxzZXh0X3RpY2tfa2V5X25hbWVbU1NMX1RJQ0tFVF9LRVlfTkFNRV9MRU5dOwotICB1aW50OF90IHRsc2V4dF90aWNrX2htYWNfa2V5WzE2XTsKLSAgdWludDhfdCB0bHNleHRfdGlja19hZXNfa2V5WzE2XTsKLSAgLyogQ2FsbGJhY2sgdG8gc3VwcG9ydCBjdXN0b21pc2F0aW9uIG9mIHRpY2tldCBrZXkgc2V0dGluZyAqLwotICBpbnQgKCp0bHNleHRfdGlja2V0X2tleV9jYikoU1NMICpzc2wsIHVpbnQ4X3QgKm5hbWUsIHVpbnQ4X3QgKml2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX0NJUEhFUl9DVFggKmVjdHgsIEhNQUNfQ1RYICpoY3R4LCBpbnQgZW5jKTsKLQotICAvKiBTZXJ2ZXItb25seTogcHNrX2lkZW50aXR5X2hpbnQgaXMgdGhlIGRlZmF1bHQgaWRlbnRpdHkgaGludCB0byBzZW5kIGluCi0gICAqIFBTSy1iYXNlZCBrZXkgZXhjaGFuZ2VzLiAqLwotICBjaGFyICpwc2tfaWRlbnRpdHlfaGludDsKLQotICB1bnNpZ25lZCBpbnQgKCpwc2tfY2xpZW50X2NhbGxiYWNrKShTU0wgKnNzbCwgY29uc3QgY2hhciAqaGludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqaWRlbnRpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXhfaWRlbnRpdHlfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwc2ssIHVuc2lnbmVkIGludCBtYXhfcHNrX2xlbik7Ci0gIHVuc2lnbmVkIGludCAoKnBza19zZXJ2ZXJfY2FsbGJhY2spKFNTTCAqc3NsLCBjb25zdCBjaGFyICppZGVudGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcHNrLCB1bnNpZ25lZCBpbnQgbWF4X3Bza19sZW4pOwotCi0KLSAgLyogcmV0YWluX29ubHlfc2hhMjU2X29mX2NsaWVudF9jZXJ0cyBpcyB0cnVlIGlmIHdlIHNob3VsZCBjb21wdXRlIHRoZSBTSEEyNTYKLSAgICogaGFzaCBvZiB0aGUgcGVlcidzIGNlcnRpZmlhdGUgYW5kIHRoZW4gZGlzY2FyZCBpdCB0byBzYXZlIG1lbW9yeSBhbmQKLSAgICogc2Vzc2lvbiBzcGFjZS4gT25seSBlZmZlY3RpdmUgb24gdGhlIHNlcnZlciBzaWRlLiAqLwotICBjaGFyIHJldGFpbl9vbmx5X3NoYTI1Nl9vZl9jbGllbnRfY2VydHM7Ci0KLSAgLyogTmV4dCBwcm90b2NvbCBuZWdvdGlhdGlvbiBpbmZvcm1hdGlvbiAqLwotICAvKiAoZm9yIGV4cGVyaW1lbnRhbCBOUE4gZXh0ZW5zaW9uKS4gKi8KLQotICAvKiBGb3IgYSBzZXJ2ZXIsIHRoaXMgY29udGFpbnMgYSBjYWxsYmFjayBmdW5jdGlvbiBieSB3aGljaCB0aGUgc2V0IG9mCi0gICAqIGFkdmVydGlzZWQgcHJvdG9jb2xzIGNhbiBiZSBwcm92aWRlZC4gKi8KLSAgaW50ICgqbmV4dF9wcm90b3NfYWR2ZXJ0aXNlZF9jYikoU1NMICpzc2wsIGNvbnN0IHVpbnQ4X3QgKipvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpvdXRfbGVuLCB2b2lkICphcmcpOwotICB2b2lkICpuZXh0X3Byb3Rvc19hZHZlcnRpc2VkX2NiX2FyZzsKLSAgLyogRm9yIGEgY2xpZW50LCB0aGlzIGNvbnRhaW5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBzZWxlY3RzIHRoZQotICAgKiBuZXh0IHByb3RvY29sIGZyb20gdGhlIGxpc3QgcHJvdmlkZWQgYnkgdGhlIHNlcnZlci4gKi8KLSAgaW50ICgqbmV4dF9wcm90b19zZWxlY3RfY2IpKFNTTCAqc3NsLCB1aW50OF90ICoqb3V0LCB1aW50OF90ICpvdXRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHVuc2lnbmVkIGluX2xlbiwgdm9pZCAqYXJnKTsKLSAgdm9pZCAqbmV4dF9wcm90b19zZWxlY3RfY2JfYXJnOwotCi0gIC8qIEFMUE4gaW5mb3JtYXRpb24KLSAgICogKHdlIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiB0cmFuc2l0aW9uaW5nIGZyb20gTlBOIHRvIEFMUE4uKSAqLwotCi0gIC8qIEZvciBhIHNlcnZlciwgdGhpcyBjb250YWlucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIHRoZQotICAgKiBzZXJ2ZXIgdG8gc2VsZWN0IHRoZSBwcm90b2NvbCBmb3IgdGhlIGNvbm5lY3Rpb24uCi0gICAqICAgb3V0OiBvbiBzdWNjZXNzZnVsIHJldHVybiwgdGhpcyBtdXN0IHBvaW50IHRvIHRoZSByYXcgcHJvdG9jb2wKLSAgICogICAgICAgIG5hbWUgKHdpdGhvdXQgdGhlIGxlbmd0aCBwcmVmaXgpLgotICAgKiAgIG91dGxlbjogb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoaXMgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB8Km91dHwuCi0gICAqICAgaW46IHBvaW50cyB0byB0aGUgY2xpZW50J3MgbGlzdCBvZiBzdXBwb3J0ZWQgcHJvdG9jb2xzIGluCi0gICAqICAgICAgIHdpcmUtZm9ybWF0LgotICAgKiAgIGlubGVuOiB0aGUgbGVuZ3RoIG9mIHxpbnwuICovCi0gIGludCAoKmFscG5fc2VsZWN0X2NiKShTU0wgKnMsIGNvbnN0IHVpbnQ4X3QgKipvdXQsIHVpbnQ4X3QgKm91dF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiwgdW5zaWduZWQgaW5fbGVuLCB2b2lkICphcmcpOwotICB2b2lkICphbHBuX3NlbGVjdF9jYl9hcmc7Ci0KLSAgLyogRm9yIGEgY2xpZW50LCB0aGlzIGNvbnRhaW5zIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBwcm90b2NvbHMgaW4gd2lyZQotICAgKiBmb3JtYXQuICovCi0gIHVpbnQ4X3QgKmFscG5fY2xpZW50X3Byb3RvX2xpc3Q7Ci0gIHVuc2lnbmVkIGFscG5fY2xpZW50X3Byb3RvX2xpc3RfbGVuOwotCi0gIC8qIFNSVFAgcHJvZmlsZXMgd2UgYXJlIHdpbGxpbmcgdG8gZG8gZnJvbSBSRkMgNTc2NCAqLwotICBTVEFDS19PRihTUlRQX1BST1RFQ1RJT05fUFJPRklMRSkgKnNydHBfcHJvZmlsZXM7Ci0KLSAgLyogRUMgZXh0ZW5zaW9uIHZhbHVlcyBpbmhlcml0ZWQgYnkgU1NMIHN0cnVjdHVyZSAqLwotICBzaXplX3QgdGxzZXh0X2VsbGlwdGljY3VydmVsaXN0X2xlbmd0aDsKLSAgdWludDE2X3QgKnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdDsKLQotICAvKiBJZiB0cnVlLCBhIGNsaWVudCB3aWxsIGFkdmVydGlzZSB0aGUgQ2hhbm5lbCBJRCBleHRlbnNpb24gYW5kIGEgc2VydmVyCi0gICAqIHdpbGwgZWNobyBpdC4gKi8KLSAgY2hhciB0bHNleHRfY2hhbm5lbF9pZF9lbmFibGVkOwotICAvKiBUaGUgY2xpZW50J3MgQ2hhbm5lbCBJRCBwcml2YXRlIGtleS4gKi8KLSAgRVZQX1BLRVkgKnRsc2V4dF9jaGFubmVsX2lkX3ByaXZhdGU7Ci0KLSAgLyogSWYgdHJ1ZSwgYSBjbGllbnQgd2lsbCByZXF1ZXN0IGNlcnRpZmljYXRlIHRpbWVzdGFtcHMuICovCi0gIGNoYXIgc2lnbmVkX2NlcnRfdGltZXN0YW1wc19lbmFibGVkOwotCi0gIC8qIFNpZ25lZCBjZXJ0aWZpY2F0ZSB0aW1lc3RhbXAgbGlzdCB0byBiZSBzZW50IHRvIHRoZSBjbGllbnQsIGlmIHJlcXVlc3RlZCAqLwotICB1aW50OF90ICpzaWduZWRfY2VydF90aW1lc3RhbXBfbGlzdDsKLSAgc2l6ZV90IHNpZ25lZF9jZXJ0X3RpbWVzdGFtcF9saXN0X2xlbmd0aDsKLQotICAvKiBJZiB0cnVlLCBhIGNsaWVudCB3aWxsIHJlcXVlc3QgYSBzdGFwbGVkIE9DU1AgcmVzcG9uc2UuICovCi0gIGNoYXIgb2NzcF9zdGFwbGluZ19lbmFibGVkOwotCi0gIC8qIE9DU1AgcmVzcG9uc2UgdG8gYmUgc2VudCB0byB0aGUgY2xpZW50LCBpZiByZXF1ZXN0ZWQuICovCi0gIHVpbnQ4X3QgKm9jc3BfcmVzcG9uc2U7Ci0gIHNpemVfdCBvY3NwX3Jlc3BvbnNlX2xlbmd0aDsKLQotICAvKiBJZiBub3QgTlVMTCwgc2Vzc2lvbiBrZXkgbWF0ZXJpYWwgd2lsbCBiZSBsb2dnZWQgdG8gdGhpcyBCSU8gZm9yIGRlYnVnZ2luZwotICAgKiBwdXJwb3Nlcy4gVGhlIGZvcm1hdCBtYXRjaGVzIE5TUydzIGFuZCBpcyByZWFkYWJsZSBieSBXaXJlc2hhcmsuICovCi0gIEJJTyAqa2V5bG9nX2JpbzsKLQotICAvKiBjdXJyZW50X3RpbWVfY2IsIGlmIG5vdCBOVUxMLCBpcyB0aGUgZnVuY3Rpb24gdG8gdXNlIHRvIGdldCB0aGUgY3VycmVudAotICAgKiB0aW1lLiBJdCBzZXRzIHwqb3V0X2Nsb2NrfCB0byB0aGUgY3VycmVudCB0aW1lLiAqLwotICB2b2lkICgqY3VycmVudF90aW1lX2NiKShjb25zdCBTU0wgKnNzbCwgc3RydWN0IHRpbWV2YWwgKm91dF9jbG9jayk7Ci19OwotCi1zdHJ1Y3Qgc3NsX3N0IHsKLSAgLyogdmVyc2lvbiBpcyB0aGUgcHJvdG9jb2wgdmVyc2lvbi4gKi8KLSAgaW50IHZlcnNpb247Ci0KLSAgLyogbWV0aG9kIGlzIHRoZSBtZXRob2QgdGFibGUgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCBwcm90b2NvbCAoRFRMUyBvcgotICAgKiBUTFMpLiAqLwotICBjb25zdCBTU0xfUFJPVE9DT0xfTUVUSE9EICptZXRob2Q7Ci0KLSAgLyogZW5jX21ldGhvZCBpcyB0aGUgbWV0aG9kIHRhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgcHJvdG9jb2wKLSAgICogdmVyc2lvbi4gKi8KLSAgY29uc3QgU1NMM19FTkNfTUVUSE9EICplbmNfbWV0aG9kOwotCi0gIC8qIG1heF92ZXJzaW9uIGlzIHRoZSBtYXhpbXVtIGFjY2VwdGFibGUgcHJvdG9jb2wgdmVyc2lvbi4gSWYgemVybywgdGhlCi0gICAqIG1heGltdW0gc3VwcG9ydGVkIHZlcnNpb24sIGN1cnJlbnRseSAoRClUTFMgMS4yLCBpcyB1c2VkLiAqLwotICB1aW50MTZfdCBtYXhfdmVyc2lvbjsKLQotICAvKiBtaW5fdmVyc2lvbiBpcyB0aGUgbWluaW11bSBhY2NlcHRhYmxlIHByb3RvY2wgdmVyc2lvbi4gSWYgemVybywgdGhlCi0gICAqIG1pbmltdW0gc3VwcG9ydGVkIHZlcnNpb24sIGN1cnJlbnRseSBTU0wgMy4wIGFuZCBEVExTIDEuMCwgaXMgdXNlZCAqLwotICB1aW50MTZfdCBtaW5fdmVyc2lvbjsKLQotICAvKiBUaGVyZSBhcmUgMiBCSU8ncyBldmVuIHRob3VnaCB0aGV5IGFyZSBub3JtYWxseSBib3RoIHRoZSBzYW1lLiBUaGlzIGlzIHNvCi0gICAqIGRhdGEgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4gdG8gZGlmZmVyZW50IGhhbmRsZXJzICovCi0KLSAgQklPICpyYmlvOyAvKiB1c2VkIGJ5IFNTTF9yZWFkICovCi0gIEJJTyAqd2JpbzsgLyogdXNlZCBieSBTU0xfd3JpdGUgKi8KLSAgQklPICpiYmlvOyAvKiB1c2VkIGR1cmluZyBzZXNzaW9uLWlkIHJldXNlIHRvIGNvbmNhdGVuYXRlCi0gICAgICAgICAgICAgICogbWVzc2FnZXMgKi8KLQotICAvKiBUaGlzIGhvbGRzIGEgdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgd2hhdCB3ZSB3ZXJlIGRvaW5nIHdoZW4gYSAwIG9yIC0xIGlzCi0gICAqIHJldHVybmVkLiAgVGhpcyBpcyBuZWVkZWQgZm9yIG5vbi1ibG9ja2luZyBJTyBzbyB3ZSBrbm93IHdoYXQgcmVxdWVzdAotICAgKiBuZWVkcyByZS1kb2luZyB3aGVuIGluIFNTTF9hY2NlcHQgb3IgU1NMX2Nvbm5lY3QgKi8KLSAgaW50IHJ3c3RhdGU7Ci0KLSAgLyogdHJ1ZSB3aGVuIHdlIGFyZSBhY3R1YWxseSBpbiBTU0xfYWNjZXB0KCkgb3IgU1NMX2Nvbm5lY3QoKSAqLwotICBpbnQgaW5faGFuZHNoYWtlOwotICBpbnQgKCpoYW5kc2hha2VfZnVuYykoU1NMICopOwotCi0gIC8qIEltYWdpbmUgdGhhdCBoZXJlJ3MgYSBib29sZWFuIG1lbWJlciAiaW5pdCIgdGhhdCBpcyBzd2l0Y2hlZCBhcyBzb29uIGFzCi0gICAqIFNTTF9zZXRfe2FjY2VwdC9jb25uZWN0fV9zdGF0ZSBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCBzbyB0aGF0Ci0gICAqICJzdGF0ZSIgYW5kICJoYW5kc2hha2VfZnVuYyIgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLiAgQnV0IGFzCi0gICAqIGhhbmRzaGFrZV9mdW5jIGlzID09IDAgdW50aWwgdGhlbiwgd2UgdXNlIHRoaXMgdGVzdCBpbnN0ZWFkIG9mIGFuICJpbml0IgotICAgKiBtZW1iZXIuICovCi0KLSAgLyogc2VydmVyIGlzIHRydWUgaWZmIHRoZSB0aGlzIFNTTCogaXMgdGhlIHNlcnZlciBoYWxmLiBOb3RlOiBiZWZvcmUgdGhlIFNTTCoKLSAgICogaXMgaW5pdGlhbGl6ZWQgYnkgZWl0aGVyIFNTTF9zZXRfYWNjZXB0X3N0YXRlIG9yIFNTTF9zZXRfY29ubmVjdF9zdGF0ZSwKLSAgICogdGhlIHNpZGUgaXMgbm90IGRldGVybWluZWQuIEluIHRoaXMgc3RhdGUsIHNlcnZlciBpcyBhbHdheXMgZmFsc2UuICovCi0gIGludCBzZXJ2ZXI7Ci0KLSAgLyogcXVpZXRfc2h1dGRvd24gaXMgdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBzaG91bGQgbm90IHNlbmQgYSBjbG9zZV9ub3RpZnkgb24KLSAgICogc2h1dGRvd24uICovCi0gIGludCBxdWlldF9zaHV0ZG93bjsKLQotICBpbnQgc2h1dGRvd247IC8qIHdlIGhhdmUgc2h1dCB0aGluZ3MgZG93biwgMHgwMSBzZW50LCAweDAyCi0gICAgICAgICAgICAgICAgICogZm9yIHJlY2VpdmVkICovCi0gIGludCBzdGF0ZTsgICAgLyogd2hlcmUgd2UgYXJlICovCi0KLSAgQlVGX01FTSAqaW5pdF9idWY7IC8qIGJ1ZmZlciB1c2VkIGR1cmluZyBpbml0ICovCi0gIHVpbnQ4X3QgKmluaXRfbXNnOyAvKiBwb2ludGVyIHRvIGhhbmRzaGFrZSBtZXNzYWdlIGJvZHksIHNldCBieQotICAgICAgICAgICAgICAgICAgICAgICAgc3NsM19nZXRfbWVzc2FnZSgpICovCi0gIGludCBpbml0X251bTsgICAgICAvKiBhbW91bnQgcmVhZC93cml0dGVuICovCi0gIGludCBpbml0X29mZjsgICAgICAvKiBhbW91bnQgcmVhZC93cml0dGVuICovCi0KLSAgc3RydWN0IHNzbDNfc3RhdGVfc3QgKnMzOyAgLyogU1NMdjMgdmFyaWFibGVzICovCi0gIHN0cnVjdCBkdGxzMV9zdGF0ZV9zdCAqZDE7IC8qIERUTFN2MSB2YXJpYWJsZXMgKi8KLQotICAvKiBjYWxsYmFjayB0aGF0IGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gcGVlayBhdCBwcm90b2NvbCBtZXNzYWdlcyAqLwotICB2b2lkICgqbXNnX2NhbGxiYWNrKShpbnQgd3JpdGVfcCwgaW50IHZlcnNpb24sIGludCBjb250ZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgU1NMICpzc2wsIHZvaWQgKmFyZyk7Ci0gIHZvaWQgKm1zZ19jYWxsYmFja19hcmc7Ci0KLSAgaW50IGhpdDsgLyogcmV1c2luZyBhIHByZXZpb3VzIHNlc3Npb24gKi8KLQotICBYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW07Ci0KLSAgLyogY3J5cHRvICovCi0gIHN0cnVjdCBzc2xfY2lwaGVyX3ByZWZlcmVuY2VfbGlzdF9zdCAqY2lwaGVyX2xpc3Q7Ci0gIFNUQUNLX09GKFNTTF9DSVBIRVIpICpjaXBoZXJfbGlzdF9ieV9pZDsKLQotICBTU0xfQUVBRF9DVFggKmFlYWRfcmVhZF9jdHg7Ci0gIFNTTF9BRUFEX0NUWCAqYWVhZF93cml0ZV9jdHg7Ci0KLSAgLyogc2Vzc2lvbiBpbmZvICovCi0KLSAgLyogY2xpZW50IGNlcnQ/ICovCi0gIC8qIFRoaXMgaXMgdXNlZCB0byBob2xkIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgdXNlZCAqLwotICBzdHJ1Y3QgY2VydF9zdCAvKiBDRVJUICovICpjZXJ0OwotCi0gIC8qIHRoZSBzZXNzaW9uX2lkX2NvbnRleHQgaXMgdXNlZCB0byBlbnN1cmUgc2Vzc2lvbnMgYXJlIG9ubHkgcmV1c2VkCi0gICAqIGluIHRoZSBhcHByb3ByaWF0ZSBjb250ZXh0ICovCi0gIHVuc2lnbmVkIGludCBzaWRfY3R4X2xlbmd0aDsKLSAgdWludDhfdCBzaWRfY3R4W1NTTF9NQVhfU0lEX0NUWF9MRU5HVEhdOwotCi0gIC8qIFRoaXMgY2FuIGFsc28gYmUgaW4gdGhlIHNlc3Npb24gb25jZSBhIHNlc3Npb24gaXMgZXN0YWJsaXNoZWQgKi8KLSAgU1NMX1NFU1NJT04gKnNlc3Npb247Ci0KLSAgLyogRGVmYXVsdCBnZW5lcmF0ZSBzZXNzaW9uIElEIGNhbGxiYWNrLiAqLwotICBHRU5fU0VTU0lPTl9DQiBnZW5lcmF0ZV9zZXNzaW9uX2lkOwotCi0gIC8qIFVzZWQgaW4gU1NMMiBhbmQgU1NMMyAqLwotICBpbnQgdmVyaWZ5X21vZGU7IC8qIDAgZG9uJ3QgY2FyZSBhYm91dCB2ZXJpZnkgZmFpbHVyZS4KLSAgICAgICAgICAgICAgICAgICAgKiAxIGZhaWwgaWYgdmVyaWZ5IGZhaWxzICovCi0gIGludCAoKnZlcmlmeV9jYWxsYmFjaykoaW50IG9rLAotICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfU1RPUkVfQ1RYICpjdHgpOyAvKiBmYWlsIGlmIGNhbGxiYWNrIHJldHVybnMgMCAqLwotCi0gIHZvaWQgKCppbmZvX2NhbGxiYWNrKShjb25zdCBTU0wgKnNzbCwgaW50IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsKTsgLyogb3B0aW9uYWwgaW5mb3JtYXRpb25hbCBjYWxsYmFjayAqLwotCi0gIC8qIFNlcnZlci1vbmx5OiBwc2tfaWRlbnRpdHlfaGludCBpcyB0aGUgaWRlbnRpdHkgaGludCB0byBzZW5kIGluCi0gICAqIFBTSy1iYXNlZCBrZXkgZXhjaGFuZ2VzLiAqLwotICBjaGFyICpwc2tfaWRlbnRpdHlfaGludDsKLQotICB1bnNpZ25lZCBpbnQgKCpwc2tfY2xpZW50X2NhbGxiYWNrKShTU0wgKnNzbCwgY29uc3QgY2hhciAqaGludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqaWRlbnRpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXhfaWRlbnRpdHlfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwc2ssIHVuc2lnbmVkIGludCBtYXhfcHNrX2xlbik7Ci0gIHVuc2lnbmVkIGludCAoKnBza19zZXJ2ZXJfY2FsbGJhY2spKFNTTCAqc3NsLCBjb25zdCBjaGFyICppZGVudGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcHNrLCB1bnNpZ25lZCBpbnQgbWF4X3Bza19sZW4pOwotCi0gIFNTTF9DVFggKmN0eDsKLQotICAvKiBleHRyYSBhcHBsaWNhdGlvbiBkYXRhICovCi0gIGxvbmcgdmVyaWZ5X3Jlc3VsdDsKLSAgQ1JZUFRPX0VYX0RBVEEgZXhfZGF0YTsKLQotICAvKiBmb3Igc2VydmVyIHNpZGUsIGtlZXAgdGhlIGxpc3Qgb2YgQ0FfZG4gd2UgY2FuIHVzZSAqLwotICBTVEFDS19PRihYNTA5X05BTUUpICpjbGllbnRfQ0E7Ci0KLSAgdWludDMyX3Qgb3B0aW9uczsgLyogcHJvdG9jb2wgYmVoYXZpb3VyICovCi0gIHVpbnQzMl90IG1vZGU7ICAgIC8qIEFQSSBiZWhhdmlvdXIgKi8KLSAgdWludDMyX3QgbWF4X2NlcnRfbGlzdDsKLSAgaW50IGNsaWVudF92ZXJzaW9uOyAvKiB3aGF0IHdhcyBwYXNzZWQsIHVzZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICogU1NMdjMvVExTIHJvbGxiYWNrIGNoZWNrICovCi0gIHVpbnQxNl90IG1heF9zZW5kX2ZyYWdtZW50OwotICBjaGFyICp0bHNleHRfaG9zdG5hbWU7Ci0gIC8qIFJGQzQ1MDcgc2Vzc2lvbiB0aWNrZXQgZXhwZWN0ZWQgdG8gYmUgcmVjZWl2ZWQgb3Igc2VudCAqLwotICBpbnQgdGxzZXh0X3RpY2tldF9leHBlY3RlZDsKLSAgc2l6ZV90IHRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdF9sZW5ndGg7Ci0gIHVpbnQxNl90ICp0bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3Q7IC8qIG91ciBsaXN0ICovCi0KLSAgU1NMX0NUWCAqaW5pdGlhbF9jdHg7IC8qIGluaXRpYWwgY3R4LCB1c2VkIHRvIHN0b3JlIHNlc3Npb25zICovCi0KLSAgLyogTmV4dCBwcm90b2NvbCBuZWdvdGlhdGlvbi4gRm9yIHRoZSBjbGllbnQsIHRoaXMgaXMgdGhlIHByb3RvY29sIHRoYXQgd2UKLSAgICogc2VudCBpbiBOZXh0UHJvdG9jb2wgYW5kIGlzIHNldCB3aGVuIGhhbmRsaW5nIFNlcnZlckhlbGxvIGV4dGVuc2lvbnMuCi0gICAqCi0gICAqIEZvciBhIHNlcnZlciwgdGhpcyBpcyB0aGUgY2xpZW50J3Mgc2VsZWN0ZWRfcHJvdG9jb2wgZnJvbSBOZXh0UHJvdG9jb2wgYW5kCi0gICAqIGlzIHNldCB3aGVuIGhhbmRsaW5nIHRoZSBOZXh0UHJvdG9jb2wgbWVzc2FnZSwgYmVmb3JlIHRoZSBGaW5pc2hlZAotICAgKiBtZXNzYWdlLiAqLwotICB1aW50OF90ICpuZXh0X3Byb3RvX25lZ290aWF0ZWQ7Ci0gIHNpemVfdCBuZXh0X3Byb3RvX25lZ290aWF0ZWRfbGVuOwotCi0gIC8qIHNydHBfcHJvZmlsZXMgaXMgdGhlIGxpc3Qgb2YgY29uZmlndXJlZCBTUlRQIHByb3RlY3Rpb24gcHJvZmlsZXMgZm9yCi0gICAqIERUTFMtU1JUUC4gKi8KLSAgU1RBQ0tfT0YoU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUpICpzcnRwX3Byb2ZpbGVzOwotCi0gIC8qIHNydHBfcHJvZmlsZSBpcyB0aGUgc2VsZWN0ZWQgU1JUUCBwcm90ZWN0aW9uIHByb2ZpbGUgZm9yCi0gICAqIERUTFMtU1JUUC4gKi8KLSAgY29uc3QgU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUgKnNydHBfcHJvZmlsZTsKLQotICAvKiBDb3BpZWQgZnJvbSB0aGUgU1NMX0NUWC4gRm9yIGEgc2VydmVyLCBtZWFucyB0aGF0IHdlJ2xsIGFjY2VwdCBDaGFubmVsIElEcwotICAgKiBmcm9tIGNsaWVudHMuIEZvciBhIGNsaWVudCwgbWVhbnMgdGhhdCB3ZSdsbCBhZHZlcnRpc2Ugc3VwcG9ydC4gKi8KLSAgY2hhciB0bHNleHRfY2hhbm5lbF9pZF9lbmFibGVkOwotICAvKiBUaGUgY2xpZW50J3MgQ2hhbm5lbCBJRCBwcml2YXRlIGtleS4gKi8KLSAgRVZQX1BLRVkgKnRsc2V4dF9jaGFubmVsX2lkX3ByaXZhdGU7Ci0KLSAgLyogRW5hYmxlIHNpZ25lZCBjZXJ0aWZpY2F0ZSB0aW1lIHN0YW1wcy4gQ3VycmVudGx5IGNsaWVudCBvbmx5LiAqLwotICBjaGFyIHNpZ25lZF9jZXJ0X3RpbWVzdGFtcHNfZW5hYmxlZDsKLQotICAvKiBvY3NwX3N0YXBsaW5nX2VuYWJsZWQgaXMgb25seSB1c2VkIGJ5IGNsaWVudCBjb25uZWN0aW9ucyBhbmQgaW5kaWNhdGVzCi0gICAqIHdoZXRoZXIgT0NTUCBzdGFwbGluZyB3aWxsIGJlIHJlcXVlc3RlZC4gKi8KLSAgY2hhciBvY3NwX3N0YXBsaW5nX2VuYWJsZWQ7Ci0KLSAgLyogRm9yIGEgY2xpZW50LCB0aGlzIGNvbnRhaW5zIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBwcm90b2NvbHMgaW4gd2lyZQotICAgKiBmb3JtYXQuICovCi0gIHVpbnQ4X3QgKmFscG5fY2xpZW50X3Byb3RvX2xpc3Q7Ci0gIHVuc2lnbmVkIGFscG5fY2xpZW50X3Byb3RvX2xpc3RfbGVuOwotCi0gIC8qIGFjY2VwdF9wZWVyX3JlbmVnb3RpYXRpb25zLCBpZiBvbmUsIGFjY2VwdHMgcmVuZWdvdGlhdGlvbiBhdHRlbXB0cyBmcm9tIHRoZQotICAgKiBwZWVyLiBPdGhlcndpc2UsIHRoZXkgd2lsbCBiZSByZWplY3RlZCB3aXRoIGEgZmF0YWwgZXJyb3IuICovCi0gIGNoYXIgYWNjZXB0X3BlZXJfcmVuZWdvdGlhdGlvbnM7Ci0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSBhbHdheXMgTlVMTCBhbmQgZXhpc3Qgb25seSB0byBrZWVwIHdwYV9zdXBwbGljYW50IGhhcHB5Ci0gICAqIGFib3V0IHRoZSBjaGFuZ2UgdG8gRVZQX0FFQUQuIFRoZXkgYXJlIG9ubHkgbmVlZGVkIGZvciBFQVAtRkFTVCwgd2hpY2ggd2UKLSAgICogZG9uJ3Qgc3VwcG9ydC4gKi8KLSAgRVZQX0NJUEhFUl9DVFggKmVuY19yZWFkX2N0eDsKLSAgRVZQX01EX0NUWCAqcmVhZF9oYXNoOwotfTsKLQogCiAvKiBBbmRyb2lkIGNvbXBhdGliaWxpdHkgc2VjdGlvbi4KICAqCkBAIC0zNTAyLDEzMyArMjQ1Myw5OSBAQAogICoKICAqIEhpc3RvcmljYWxseSwgYSBudW1iZXIgb2YgQVBJcyB3ZXJlIGltcGxlbWVudGVkIGluIE9wZW5TU0wgYXMgbWFjcm9zIGFuZAogICogY29uc3RhbnRzIHRvICdjdHJsJyBmdW5jdGlvbnMuIFRvIGF2b2lkIGJyZWFraW5nICNpZmRlZnMgaW4gY29uc3VtZXJzLCB0aGlzCi0gKiBzZWN0aW9uIGRlZmluZXMgYSBudW1iZXIgb2YgbGVnYWN5IG1hY3Jvcy4KLSAqCi0gKiBBbHRob3VnaCB1c2luZyBlaXRoZXIgdGhlIENUUkwgdmFsdWVzIG9yIHRoZWlyIHdyYXBwZXIgbWFjcm9zIGluICNpZmRlZnMgaXMKLSAqIHN0aWxsIHN1cHBvcnRlZCwgdGhlIENUUkwgdmFsdWVzIG1heSBub3QgYmUgcGFzc2VkIHRvIHxTU0xfY3RybHwgYW5kCi0gKiB8U1NMX0NUWF9jdHJsfC4gQ2FsbCB0aGUgZnVuY3Rpb25zIChwcmV2aW91c2x5IHdyYXBwZXIgbWFjcm9zKSBpbnN0ZWFkLiAqLworICogc2VjdGlvbiBkZWZpbmVzIGEgbnVtYmVyIG9mIGxlZ2FjeSBtYWNyb3MuICovCiAKLSNkZWZpbmUgRFRMU19DVFJMX0dFVF9USU1FT1VUIGRvZXNudF9leGlzdAotI2RlZmluZSBEVExTX0NUUkxfSEFORExFX1RJTUVPVVQgZG9lc250X2V4aXN0Ci0jZGVmaW5lIFNTTF9DVFJMX0NIQUlOIGRvZXNudF9leGlzdAotI2RlZmluZSBTU0xfQ1RSTF9DSEFJTl9DRVJUIGRvZXNudF9leGlzdAotI2RlZmluZSBTU0xfQ1RSTF9DSEFOTkVMX0lEIGRvZXNudF9leGlzdAotI2RlZmluZSBTU0xfQ1RSTF9DTEVBUl9FWFRSQV9DSEFJTl9DRVJUUyBkb2VzbnRfZXhpc3QKLSNkZWZpbmUgU1NMX0NUUkxfQ0xFQVJfTU9ERSBkb2VzbnRfZXhpc3QKLSNkZWZpbmUgU1NMX0NUUkxfQ0xFQVJfT1BUSU9OUyBkb2VzbnRfZXhpc3QKLSNkZWZpbmUgU1NMX0NUUkxfRVhUUkFfQ0hBSU5fQ0VSVCBkb2VzbnRfZXhpc3QKLSNkZWZpbmUgU1NMX0NUUkxfR0VUX0NIQUlOX0NFUlRTIGRvZXNudF9leGlzdAotI2RlZmluZSBTU0xfQ1RSTF9HRVRfQ0hBTk5FTF9JRCBkb2VzbnRfZXhpc3QKLSNkZWZpbmUgU1NMX0NUUkxfR0VUX0NMSUVOVF9DRVJUX1RZUEVTIGRvZXNudF9leGlzdAotI2RlZmluZSBTU0xfQ1RSTF9HRVRfRVhUUkFfQ0hBSU5fQ0VSVFMgZG9lc250X2V4aXN0Ci0jZGVmaW5lIFNTTF9DVFJMX0dFVF9NQVhfQ0VSVF9MSVNUIGRvZXNudF9leGlzdAotI2RlZmluZSBTU0xfQ1RSTF9HRVRfTlVNX1JFTkVHT1RJQVRJT05TIGRvZXNudF9leGlzdAotI2RlZmluZSBTU0xfQ1RSTF9HRVRfUkVBRF9BSEVBRCBkb2VzbnRfZXhpc3QKLSNkZWZpbmUgU1NMX0NUUkxfR0VUX1JJX1NVUFBPUlQgZG9lc250X2V4aXN0Ci0jZGVmaW5lIFNTTF9DVFJMX0dFVF9TRVNTSU9OX1JFVVNFRCBkb2VzbnRfZXhpc3QKLSNkZWZpbmUgU1NMX0NUUkxfR0VUX1NFU1NfQ0FDSEVfTU9ERSBkb2VzbnRfZXhpc3QKLSNkZWZpbmUgU1NMX0NUUkxfR0VUX1NFU1NfQ0FDSEVfU0laRSBkb2VzbnRfZXhpc3QKLSNkZWZpbmUgU1NMX0NUUkxfR0VUX1RMU0VYVF9USUNLRVRfS0VZUyBkb2VzbnRfZXhpc3QKLSNkZWZpbmUgU1NMX0NUUkxfR0VUX1RPVEFMX1JFTkVHT1RJQVRJT05TIGRvZXNudF9leGlzdAotI2RlZmluZSBTU0xfQ1RSTF9NT0RFIGRvZXNudF9leGlzdAogI2RlZmluZSBTU0xfQ1RSTF9ORUVEX1RNUF9SU0EgZG9lc250X2V4aXN0Ci0jZGVmaW5lIFNTTF9DVFJMX09QVElPTlMgZG9lc250X2V4aXN0Ci0jZGVmaW5lIFNTTF9DVFJMX1NFU1NfTlVNQkVSIGRvZXNudF9leGlzdAotI2RlZmluZSBTU0xfQ1RSTF9TRVRfQ0hBTk5FTF9JRCBkb2VzbnRfZXhpc3QKLSNkZWZpbmUgU1NMX0NUUkxfU0VUX0NVUlZFUyBkb2VzbnRfZXhpc3QKLSNkZWZpbmUgU1NMX0NUUkxfU0VUX01BWF9DRVJUX0xJU1QgZG9lc250X2V4aXN0Ci0jZGVmaW5lIFNTTF9DVFJMX1NFVF9NQVhfU0VORF9GUkFHTUVOVCBkb2VzbnRfZXhpc3QKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RNUF9SU0EgZG9lc250X2V4aXN0CisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTVBfREggZG9lc250X2V4aXN0CisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTVBfRUNESCBkb2VzbnRfZXhpc3QKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RNUF9SU0FfQ0IgZG9lc250X2V4aXN0CisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTVBfREhfQ0IgZG9lc250X2V4aXN0CisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTVBfRUNESF9DQiBkb2VzbnRfZXhpc3QKKyNkZWZpbmUgU1NMX0NUUkxfR0VUX1NFU1NJT05fUkVVU0VEIGRvZXNudF9leGlzdAorI2RlZmluZSBTU0xfQ1RSTF9HRVRfTlVNX1JFTkVHT1RJQVRJT05TIGRvZXNudF9leGlzdAorI2RlZmluZSBTU0xfQ1RSTF9HRVRfVE9UQUxfUkVORUdPVElBVElPTlMgZG9lc250X2V4aXN0CiAjZGVmaW5lIFNTTF9DVFJMX1NFVF9NU0dfQ0FMTEJBQ0sgZG9lc250X2V4aXN0CiAjZGVmaW5lIFNTTF9DVFJMX1NFVF9NU0dfQ0FMTEJBQ0tfQVJHIGRvZXNudF9leGlzdAogI2RlZmluZSBTU0xfQ1RSTF9TRVRfTVRVIGRvZXNudF9leGlzdAorI2RlZmluZSBTU0xfQ1RSTF9TRVNTX05VTUJFUiBkb2VzbnRfZXhpc3QKKyNkZWZpbmUgU1NMX0NUUkxfT1BUSU9OUyBkb2VzbnRfZXhpc3QKKyNkZWZpbmUgU1NMX0NUUkxfTU9ERSBkb2VzbnRfZXhpc3QKKyNkZWZpbmUgU1NMX0NUUkxfR0VUX1JFQURfQUhFQUQgZG9lc250X2V4aXN0CiAjZGVmaW5lIFNTTF9DVFJMX1NFVF9SRUFEX0FIRUFEIGRvZXNudF9leGlzdAotI2RlZmluZSBTU0xfQ1RSTF9TRVRfU0VTU19DQUNIRV9NT0RFIGRvZXNudF9leGlzdAogI2RlZmluZSBTU0xfQ1RSTF9TRVRfU0VTU19DQUNIRV9TSVpFIGRvZXNudF9leGlzdAotI2RlZmluZSBTU0xfQ1RSTF9TRVRfVExTRVhUX0hPU1ROQU1FIGRvZXNudF9leGlzdAotI2RlZmluZSBTU0xfQ1RSTF9TRVRfVExTRVhUX1NFUlZFUk5BTUVfQVJHIGRvZXNudF9leGlzdAorI2RlZmluZSBTU0xfQ1RSTF9HRVRfU0VTU19DQUNIRV9TSVpFIGRvZXNudF9leGlzdAorI2RlZmluZSBTU0xfQ1RSTF9TRVRfU0VTU19DQUNIRV9NT0RFIGRvZXNudF9leGlzdAorI2RlZmluZSBTU0xfQ1RSTF9HRVRfU0VTU19DQUNIRV9NT0RFIGRvZXNudF9leGlzdAorI2RlZmluZSBTU0xfQ1RSTF9HRVRfTUFYX0NFUlRfTElTVCBkb2VzbnRfZXhpc3QKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX01BWF9DRVJUX0xJU1QgZG9lc250X2V4aXN0CisjZGVmaW5lIFNTTF9DVFJMX1NFVF9NQVhfU0VORF9GUkFHTUVOVCBkb2VzbnRfZXhpc3QKICNkZWZpbmUgU1NMX0NUUkxfU0VUX1RMU0VYVF9TRVJWRVJOQU1FX0NCIGRvZXNudF9leGlzdAotI2RlZmluZSBTU0xfQ1RSTF9TRVRfVExTRVhUX1RJQ0tFVF9LRVlTIGRvZXNudF9leGlzdAorI2RlZmluZSBTU0xfQ1RSTF9TRVRfVExTRVhUX1NFUlZFUk5BTUVfQVJHIGRvZXNudF9leGlzdAorI2RlZmluZSBTU0xfQ1RSTF9TRVRfVExTRVhUX0hPU1ROQU1FIGRvZXNudF9leGlzdAogI2RlZmluZSBTU0xfQ1RSTF9TRVRfVExTRVhUX1RJQ0tFVF9LRVlfQ0IgZG9lc250X2V4aXN0Ci0jZGVmaW5lIFNTTF9DVFJMX1NFVF9UTVBfREggZG9lc250X2V4aXN0Ci0jZGVmaW5lIFNTTF9DVFJMX1NFVF9UTVBfREhfQ0IgZG9lc250X2V4aXN0Ci0jZGVmaW5lIFNTTF9DVFJMX1NFVF9UTVBfRUNESCBkb2VzbnRfZXhpc3QKLSNkZWZpbmUgU1NMX0NUUkxfU0VUX1RNUF9FQ0RIX0NCIGRvZXNudF9leGlzdAotI2RlZmluZSBTU0xfQ1RSTF9TRVRfVE1QX1JTQSBkb2VzbnRfZXhpc3QKLSNkZWZpbmUgU1NMX0NUUkxfU0VUX1RNUF9SU0FfQ0IgZG9lc250X2V4aXN0CisjZGVmaW5lIERUTFNfQ1RSTF9HRVRfVElNRU9VVCBkb2VzbnRfZXhpc3QKKyNkZWZpbmUgRFRMU19DVFJMX0hBTkRMRV9USU1FT1VUIGRvZXNudF9leGlzdAorI2RlZmluZSBTU0xfQ1RSTF9HRVRfUklfU1VQUE9SVCBkb2VzbnRfZXhpc3QKKyNkZWZpbmUgU1NMX0NUUkxfQ0xFQVJfT1BUSU9OUyBkb2VzbnRfZXhpc3QKKyNkZWZpbmUgU1NMX0NUUkxfQ0xFQVJfTU9ERSBkb2VzbnRfZXhpc3QKKyNkZWZpbmUgU1NMX0NUUkxfQ0hBTk5FTF9JRCBkb2VzbnRfZXhpc3QKKyNkZWZpbmUgU1NMX0NUUkxfR0VUX0NIQU5ORUxfSUQgZG9lc250X2V4aXN0CisjZGVmaW5lIFNTTF9DVFJMX1NFVF9DSEFOTkVMX0lEIGRvZXNudF9leGlzdAogCi0jZGVmaW5lIERUTFN2MV9nZXRfdGltZW91dCBEVExTdjFfZ2V0X3RpbWVvdXQKLSNkZWZpbmUgRFRMU3YxX2hhbmRsZV90aW1lb3V0IERUTFN2MV9oYW5kbGVfdGltZW91dAotI2RlZmluZSBTU0xfQ1RYX2FkZDBfY2hhaW5fY2VydCBTU0xfQ1RYX2FkZDBfY2hhaW5fY2VydAotI2RlZmluZSBTU0xfQ1RYX2FkZDFfY2hhaW5fY2VydCBTU0xfQ1RYX2FkZDFfY2hhaW5fY2VydAotI2RlZmluZSBTU0xfQ1RYX2FkZF9leHRyYV9jaGFpbl9jZXJ0IFNTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQKLSNkZWZpbmUgU1NMX0NUWF9jbGVhcl9leHRyYV9jaGFpbl9jZXJ0cyBTU0xfQ1RYX2NsZWFyX2V4dHJhX2NoYWluX2NlcnRzCi0jZGVmaW5lIFNTTF9DVFhfY2xlYXJfY2hhaW5fY2VydHMgU1NMX0NUWF9jbGVhcl9jaGFpbl9jZXJ0cwotI2RlZmluZSBTU0xfQ1RYX2NsZWFyX21vZGUgU1NMX0NUWF9jbGVhcl9tb2RlCi0jZGVmaW5lIFNTTF9DVFhfY2xlYXJfb3B0aW9ucyBTU0xfQ1RYX2NsZWFyX29wdGlvbnMKLSNkZWZpbmUgU1NMX0NUWF9lbmFibGVfdGxzX2NoYW5uZWxfaWQgU1NMX0NUWF9lbmFibGVfdGxzX2NoYW5uZWxfaWQKLSNkZWZpbmUgU1NMX0NUWF9nZXQwX2NoYWluX2NlcnRzIFNTTF9DVFhfZ2V0MF9jaGFpbl9jZXJ0cwotI2RlZmluZSBTU0xfQ1RYX2dldF9leHRyYV9jaGFpbl9jZXJ0cyBTU0xfQ1RYX2dldF9leHRyYV9jaGFpbl9jZXJ0cwotI2RlZmluZSBTU0xfQ1RYX2dldF9tYXhfY2VydF9saXN0IFNTTF9DVFhfZ2V0X21heF9jZXJ0X2xpc3QKLSNkZWZpbmUgU1NMX0NUWF9nZXRfbW9kZSBTU0xfQ1RYX2dldF9tb2RlCi0jZGVmaW5lIFNTTF9DVFhfZ2V0X29wdGlvbnMgU1NMX0NUWF9nZXRfb3B0aW9ucwotI2RlZmluZSBTU0xfQ1RYX2dldF9yZWFkX2FoZWFkIFNTTF9DVFhfZ2V0X3JlYWRfYWhlYWQKLSNkZWZpbmUgU1NMX0NUWF9nZXRfc2Vzc2lvbl9jYWNoZV9tb2RlIFNTTF9DVFhfZ2V0X3Nlc3Npb25fY2FjaGVfbW9kZQotI2RlZmluZSBTU0xfQ1RYX2dldF90bHNleHRfdGlja2V0X2tleXMgU1NMX0NUWF9nZXRfdGxzZXh0X3RpY2tldF9rZXlzCiAjZGVmaW5lIFNTTF9DVFhfbmVlZF90bXBfUlNBIFNTTF9DVFhfbmVlZF90bXBfUlNBCi0jZGVmaW5lIFNTTF9DVFhfc2Vzc19nZXRfY2FjaGVfc2l6ZSBTU0xfQ1RYX3Nlc3NfZ2V0X2NhY2hlX3NpemUKLSNkZWZpbmUgU1NMX0NUWF9zZXNzX251bWJlciBTU0xfQ1RYX3Nlc3NfbnVtYmVyCi0jZGVmaW5lIFNTTF9DVFhfc2Vzc19zZXRfY2FjaGVfc2l6ZSBTU0xfQ1RYX3Nlc3Nfc2V0X2NhY2hlX3NpemUKLSNkZWZpbmUgU1NMX0NUWF9zZXQwX2NoYWluIFNTTF9DVFhfc2V0MF9jaGFpbgotI2RlZmluZSBTU0xfQ1RYX3NldDFfY2hhaW4gU1NMX0NUWF9zZXQxX2NoYWluCi0jZGVmaW5lIFNTTF9DVFhfc2V0MV9jdXJ2ZXMgU1NMX0NUWF9zZXQxX2N1cnZlcwotI2RlZmluZSBTU0xfQ1RYX3NldDFfdGxzX2NoYW5uZWxfaWQgU1NMX0NUWF9zZXQxX3Rsc19jaGFubmVsX2lkCi0jZGVmaW5lIFNTTF9DVFhfc2V0X21heF9jZXJ0X2xpc3QgU1NMX0NUWF9zZXRfbWF4X2NlcnRfbGlzdAotI2RlZmluZSBTU0xfQ1RYX3NldF9tYXhfc2VuZF9mcmFnbWVudCBTU0xfQ1RYX3NldF9tYXhfc2VuZF9mcmFnbWVudAotI2RlZmluZSBTU0xfQ1RYX3NldF9tb2RlIFNTTF9DVFhfc2V0X21vZGUKLSNkZWZpbmUgU1NMX0NUWF9zZXRfbXNnX2NhbGxiYWNrX2FyZyBTU0xfQ1RYX3NldF9tc2dfY2FsbGJhY2tfYXJnCi0jZGVmaW5lIFNTTF9DVFhfc2V0X29wdGlvbnMgU1NMX0NUWF9zZXRfb3B0aW9ucwotI2RlZmluZSBTU0xfQ1RYX3NldF9yZWFkX2FoZWFkIFNTTF9DVFhfc2V0X3JlYWRfYWhlYWQKLSNkZWZpbmUgU1NMX0NUWF9zZXRfc2Vzc2lvbl9jYWNoZV9tb2RlIFNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZQotI2RlZmluZSBTU0xfQ1RYX3NldF90bHNleHRfc2VydmVybmFtZV9hcmcgU1NMX0NUWF9zZXRfdGxzZXh0X3NlcnZlcm5hbWVfYXJnCi0jZGVmaW5lIFNTTF9DVFhfc2V0X3Rsc2V4dF9zZXJ2ZXJuYW1lX2NhbGxiYWNrIFwKLSAgICBTU0xfQ1RYX3NldF90bHNleHRfc2VydmVybmFtZV9jYWxsYmFjawotI2RlZmluZSBTU0xfQ1RYX3NldF90bHNleHRfdGlja2V0X2tleV9jYiBTU0xfQ1RYX3NldF90bHNleHRfdGlja2V0X2tleV9jYgotI2RlZmluZSBTU0xfQ1RYX3NldF90bHNleHRfdGlja2V0X2tleXMgU1NMX0NUWF9zZXRfdGxzZXh0X3RpY2tldF9rZXlzCi0jZGVmaW5lIFNTTF9DVFhfc2V0X3RtcF9kaCBTU0xfQ1RYX3NldF90bXBfZGgKLSNkZWZpbmUgU1NMX0NUWF9zZXRfdG1wX2VjZGggU1NMX0NUWF9zZXRfdG1wX2VjZGgKLSNkZWZpbmUgU1NMX0NUWF9zZXRfdG1wX3JzYSBTU0xfQ1RYX3NldF90bXBfcnNhCi0jZGVmaW5lIFNTTF9hZGQwX2NoYWluX2NlcnQgU1NMX2FkZDBfY2hhaW5fY2VydAotI2RlZmluZSBTU0xfYWRkMV9jaGFpbl9jZXJ0IFNTTF9hZGQxX2NoYWluX2NlcnQKLSNkZWZpbmUgU1NMX2NsZWFyX2NoYWluX2NlcnRzIFNTTF9jbGVhcl9jaGFpbl9jZXJ0cwotI2RlZmluZSBTU0xfY2xlYXJfbW9kZSBTU0xfY2xlYXJfbW9kZQotI2RlZmluZSBTU0xfY2xlYXJfb3B0aW9ucyBTU0xfY2xlYXJfb3B0aW9ucwotI2RlZmluZSBTU0xfZW5hYmxlX3Rsc19jaGFubmVsX2lkIFNTTF9lbmFibGVfdGxzX2NoYW5uZWxfaWQKLSNkZWZpbmUgU1NMX2dldDBfY2VydGlmaWNhdGVfdHlwZXMgU1NMX2dldDBfY2VydGlmaWNhdGVfdHlwZXMKLSNkZWZpbmUgU1NMX2dldDBfY2hhaW5fY2VydHMgU1NMX2dldDBfY2hhaW5fY2VydHMKLSNkZWZpbmUgU1NMX2dldF9tYXhfY2VydF9saXN0IFNTTF9nZXRfbWF4X2NlcnRfbGlzdAotI2RlZmluZSBTU0xfZ2V0X21vZGUgU1NMX2dldF9tb2RlCi0jZGVmaW5lIFNTTF9nZXRfb3B0aW9ucyBTU0xfZ2V0X29wdGlvbnMKLSNkZWZpbmUgU1NMX2dldF9zZWN1cmVfcmVuZWdvdGlhdGlvbl9zdXBwb3J0IFwKLSAgICBTU0xfZ2V0X3NlY3VyZV9yZW5lZ290aWF0aW9uX3N1cHBvcnQKLSNkZWZpbmUgU1NMX2dldF90bHNfY2hhbm5lbF9pZCBTU0xfZ2V0X3Rsc19jaGFubmVsX2lkCiAjZGVmaW5lIFNTTF9uZWVkX3RtcF9SU0EgU1NMX25lZWRfdG1wX1JTQQotI2RlZmluZSBTU0xfbnVtX3JlbmVnb3RpYXRpb25zIFNTTF9udW1fcmVuZWdvdGlhdGlvbnMKKyNkZWZpbmUgU1NMX0NUWF9zZXRfdG1wX3JzYSBTU0xfQ1RYX3NldF90bXBfcnNhCisjZGVmaW5lIFNTTF9zZXRfdG1wX3JzYSBTU0xfc2V0X3RtcF9yc2EKKyNkZWZpbmUgU1NMX0NUWF9zZXRfdG1wX2RoIFNTTF9DVFhfc2V0X3RtcF9kaAorI2RlZmluZSBTU0xfc2V0X3RtcF9kaCBTU0xfc2V0X3RtcF9kaAorI2RlZmluZSBTU0xfQ1RYX3NldF90bXBfZWNkaCBTU0xfQ1RYX3NldF90bXBfZWNkaAorI2RlZmluZSBTU0xfc2V0X3RtcF9lY2RoIFNTTF9zZXRfdG1wX2VjZGgKICNkZWZpbmUgU1NMX3Nlc3Npb25fcmV1c2VkIFNTTF9zZXNzaW9uX3JldXNlZAotI2RlZmluZSBTU0xfc2V0MF9jaGFpbiBTU0xfc2V0MF9jaGFpbgotI2RlZmluZSBTU0xfc2V0MV9jaGFpbiBTU0xfc2V0MV9jaGFpbgotI2RlZmluZSBTU0xfc2V0MV9jdXJ2ZXMgU1NMX3NldDFfY3VydmVzCi0jZGVmaW5lIFNTTF9zZXQxX3Rsc19jaGFubmVsX2lkIFNTTF9zZXQxX3Rsc19jaGFubmVsX2lkCi0jZGVmaW5lIFNTTF9zZXRfbWF4X2NlcnRfbGlzdCBTU0xfc2V0X21heF9jZXJ0X2xpc3QKLSNkZWZpbmUgU1NMX3NldF9tYXhfc2VuZF9mcmFnbWVudCBTU0xfc2V0X21heF9zZW5kX2ZyYWdtZW50Ci0jZGVmaW5lIFNTTF9zZXRfbW9kZSBTU0xfc2V0X21vZGUKKyNkZWZpbmUgU1NMX251bV9yZW5lZ290aWF0aW9ucyBTU0xfbnVtX3JlbmVnb3RpYXRpb25zCisjZGVmaW5lIFNTTF90b3RhbF9yZW5lZ290aWF0aW9ucyBTU0xfdG90YWxfcmVuZWdvdGlhdGlvbnMKKyNkZWZpbmUgU1NMX0NUWF9zZXRfbXNnX2NhbGxiYWNrX2FyZyBTU0xfQ1RYX3NldF9tc2dfY2FsbGJhY2tfYXJnCiAjZGVmaW5lIFNTTF9zZXRfbXNnX2NhbGxiYWNrX2FyZyBTU0xfc2V0X21zZ19jYWxsYmFja19hcmcKICNkZWZpbmUgU1NMX3NldF9tdHUgU1NMX3NldF9tdHUKKyNkZWZpbmUgU1NMX0NUWF9zZXNzX251bWJlciBTU0xfQ1RYX3Nlc3NfbnVtYmVyCisjZGVmaW5lIFNTTF9DVFhfZ2V0X29wdGlvbnMgU1NMX0NUWF9nZXRfb3B0aW9ucworI2RlZmluZSBTU0xfQ1RYX3NldF9vcHRpb25zIFNTTF9DVFhfc2V0X29wdGlvbnMKKyNkZWZpbmUgU1NMX2dldF9vcHRpb25zIFNTTF9nZXRfb3B0aW9ucwogI2RlZmluZSBTU0xfc2V0X29wdGlvbnMgU1NMX3NldF9vcHRpb25zCisjZGVmaW5lIFNTTF9DVFhfZ2V0X21vZGUgU1NMX0NUWF9nZXRfbW9kZQorI2RlZmluZSBTU0xfQ1RYX3NldF9tb2RlIFNTTF9DVFhfc2V0X21vZGUKKyNkZWZpbmUgU1NMX2dldF9tb2RlIFNTTF9nZXRfbW9kZQorI2RlZmluZSBTU0xfc2V0X21vZGUgU1NMX3NldF9tb2RlCisjZGVmaW5lIFNTTF9DVFhfZ2V0X3JlYWRfYWhlYWQgU1NMX0NUWF9nZXRfcmVhZF9haGVhZAorI2RlZmluZSBTU0xfQ1RYX3NldF9yZWFkX2FoZWFkIFNTTF9DVFhfc2V0X3JlYWRfYWhlYWQKKyNkZWZpbmUgU1NMX0NUWF9zZXNzX3NldF9jYWNoZV9zaXplIFNTTF9DVFhfc2Vzc19zZXRfY2FjaGVfc2l6ZQorI2RlZmluZSBTU0xfQ1RYX3Nlc3NfZ2V0X2NhY2hlX3NpemUgU1NMX0NUWF9zZXNzX2dldF9jYWNoZV9zaXplCisjZGVmaW5lIFNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZSBTU0xfQ1RYX3NldF9zZXNzaW9uX2NhY2hlX21vZGUKKyNkZWZpbmUgU1NMX0NUWF9nZXRfc2Vzc2lvbl9jYWNoZV9tb2RlIFNTTF9DVFhfZ2V0X3Nlc3Npb25fY2FjaGVfbW9kZQorI2RlZmluZSBTU0xfQ1RYX2dldF9tYXhfY2VydF9saXN0IFNTTF9DVFhfZ2V0X21heF9jZXJ0X2xpc3QKKyNkZWZpbmUgU1NMX2dldF9tYXhfY2VydF9saXN0IFNTTF9nZXRfbWF4X2NlcnRfbGlzdAorI2RlZmluZSBTU0xfQ1RYX3NldF9tYXhfY2VydF9saXN0IFNTTF9DVFhfc2V0X21heF9jZXJ0X2xpc3QKKyNkZWZpbmUgU1NMX3NldF9tYXhfY2VydF9saXN0IFNTTF9zZXRfbWF4X2NlcnRfbGlzdAorI2RlZmluZSBTU0xfQ1RYX3NldF9tYXhfc2VuZF9mcmFnbWVudCBTU0xfQ1RYX3NldF9tYXhfc2VuZF9mcmFnbWVudAorI2RlZmluZSBTU0xfc2V0X21heF9zZW5kX2ZyYWdtZW50IFNTTF9zZXRfbWF4X3NlbmRfZnJhZ21lbnQKKyNkZWZpbmUgU1NMX0NUWF9zZXRfdGxzZXh0X3NlcnZlcm5hbWVfY2FsbGJhY2sgXAorICAgIFNTTF9DVFhfc2V0X3Rsc2V4dF9zZXJ2ZXJuYW1lX2NhbGxiYWNrCisjZGVmaW5lIFNTTF9DVFhfc2V0X3Rsc2V4dF9zZXJ2ZXJuYW1lX2FyZyBTU0xfQ1RYX3NldF90bHNleHRfc2VydmVybmFtZV9hcmcKICNkZWZpbmUgU1NMX3NldF90bHNleHRfaG9zdF9uYW1lIFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZQotI2RlZmluZSBTU0xfc2V0X3RtcF9kaCBTU0xfc2V0X3RtcF9kaAotI2RlZmluZSBTU0xfc2V0X3RtcF9lY2RoIFNTTF9zZXRfdG1wX2VjZGgKLSNkZWZpbmUgU1NMX3NldF90bXBfcnNhIFNTTF9zZXRfdG1wX3JzYQotI2RlZmluZSBTU0xfdG90YWxfcmVuZWdvdGlhdGlvbnMgU1NMX3RvdGFsX3JlbmVnb3RpYXRpb25zCisjZGVmaW5lIFNTTF9DVFhfc2V0X3Rsc2V4dF90aWNrZXRfa2V5X2NiIFNTTF9DVFhfc2V0X3Rsc2V4dF90aWNrZXRfa2V5X2NiCisjZGVmaW5lIERUTFN2MV9nZXRfdGltZW91dCBEVExTdjFfZ2V0X3RpbWVvdXQKKyNkZWZpbmUgRFRMU3YxX2hhbmRsZV90aW1lb3V0IERUTFN2MV9oYW5kbGVfdGltZW91dAorI2RlZmluZSBTU0xfZ2V0X3NlY3VyZV9yZW5lZ290aWF0aW9uX3N1cHBvcnQgXAorICAgIFNTTF9nZXRfc2VjdXJlX3JlbmVnb3RpYXRpb25fc3VwcG9ydAorI2RlZmluZSBTU0xfQ1RYX2NsZWFyX29wdGlvbnMgU1NMX0NUWF9jbGVhcl9vcHRpb25zCisjZGVmaW5lIFNTTF9jbGVhcl9vcHRpb25zIFNTTF9jbGVhcl9vcHRpb25zCisjZGVmaW5lIFNTTF9DVFhfY2xlYXJfbW9kZSBTU0xfQ1RYX2NsZWFyX21vZGUKKyNkZWZpbmUgU1NMX2NsZWFyX21vZGUgU1NMX2NsZWFyX21vZGUKKyNkZWZpbmUgU1NMX0NUWF9lbmFibGVfdGxzX2NoYW5uZWxfaWQgU1NMX0NUWF9lbmFibGVfdGxzX2NoYW5uZWxfaWQKKyNkZWZpbmUgU1NMX2VuYWJsZV90bHNfY2hhbm5lbF9pZCBTU0xfZW5hYmxlX3Rsc19jaGFubmVsX2lkCisjZGVmaW5lIFNTTF9zZXQxX3Rsc19jaGFubmVsX2lkIFNTTF9zZXQxX3Rsc19jaGFubmVsX2lkCisjZGVmaW5lIFNTTF9DVFhfc2V0MV90bHNfY2hhbm5lbF9pZCBTU0xfQ1RYX3NldDFfdGxzX2NoYW5uZWxfaWQKKyNkZWZpbmUgU1NMX2dldF90bHNfY2hhbm5lbF9pZCBTU0xfZ2V0X3Rsc19jaGFubmVsX2lkCiAKIAogI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCkBAIC0zNjQzLDE0ICsyNTYwLDE5MyBAQAogICogaGVhZGVycyBpbnRyb2R1Y2VzIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBhbmQgaXMgaW5jb25zaXN0ZW50LiBUaGUgZnVuY3Rpb24KICAqIGRlY2xhcmF0aW9ucyBzaG91bGQgbW92ZSB0byBzc2wuaC4gTWFueSBvZiB0aGUgY29uc3RhbnRzIGNhbiBwcm9iYWJseSBiZQogICogcHJ1bmVkIG9yIHVuZXhwb3J0ZWQuICovCisjaW5jbHVkZSA8b3BlbnNzbC9zc2wyLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9zc2wzLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC90bHMxLmg+IC8qIFRoaXMgaXMgbW9zdGx5IHNzbHYzIHdpdGggYSBmZXcgdHdlYWtzICovCisjaW5jbHVkZSA8b3BlbnNzbC9zc2wyMy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3J0cC5oPiAgLyogU3VwcG9ydCBmb3IgdGhlIHVzZV9zcnRwIGV4dGVuc2lvbiAqLwogCiAKIC8qIEJFR0lOIEVSUk9SIENPREVTICovCiAvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1ha2VfZXJyb3JzLmdvLiBBbnkKICAqIGNoYW5nZXMgbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCiAgKi8KKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF9jaGVja19wcml2YXRlX2tleSAxMDAKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF9uZXcgMTAxCisjZGVmaW5lIFNTTF9GX1NTTF9DVFhfc2V0X2NpcGhlcl9saXN0IDEwMgorI2RlZmluZSBTU0xfRl9TU0xfQ1RYX3NldF9jaXBoZXJfbGlzdF90bHMxMSAxMDMKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0IDEwNAorI2RlZmluZSBTU0xfRl9TU0xfQ1RYX3VzZV9Qcml2YXRlS2V5IDEwNQorI2RlZmluZSBTU0xfRl9TU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X0FTTjEgMTA2CisjZGVmaW5lIFNTTF9GX1NTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZSAxMDcKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleSAxMDgKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleV9BU04xIDEwOQorI2RlZmluZSBTU0xfRl9TU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5X2ZpbGUgMTEwCisjZGVmaW5lIFNTTF9GX1NTTF9DVFhfdXNlX2NlcnRpZmljYXRlIDExMQorI2RlZmluZSBTU0xfRl9TU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9BU04xIDExMgorI2RlZmluZSBTU0xfRl9TU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlIDExMworI2RlZmluZSBTU0xfRl9TU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9maWxlIDExNAorI2RlZmluZSBTU0xfRl9TU0xfQ1RYX3VzZV9wc2tfaWRlbnRpdHlfaGludCAxMTUKKyNkZWZpbmUgU1NMX0ZfU1NMX1NFU1NJT05fbmV3IDExNgorI2RlZmluZSBTU0xfRl9TU0xfU0VTU0lPTl9wcmludF9mcCAxMTcKKyNkZWZpbmUgU1NMX0ZfU1NMX1NFU1NJT05fc2V0MV9pZF9jb250ZXh0IDExOAorI2RlZmluZSBTU0xfRl9TU0xfU0VTU0lPTl90b19ieXRlc19mdWxsIDExOQorI2RlZmluZSBTU0xfRl9TU0xfYWNjZXB0IDEyMAorI2RlZmluZSBTU0xfRl9TU0xfYWRkX2Rpcl9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrIDEyMQorI2RlZmluZSBTU0xfRl9TU0xfYWRkX2ZpbGVfY2VydF9zdWJqZWN0c190b19zdGFjayAxMjIKKyNkZWZpbmUgU1NMX0ZfU1NMX2NoZWNrX3ByaXZhdGVfa2V5IDEyMworI2RlZmluZSBTU0xfRl9TU0xfY2xlYXIgMTI0CisjZGVmaW5lIFNTTF9GX1NTTF9jb25uZWN0IDEyNQorI2RlZmluZSBTU0xfRl9TU0xfZG9faGFuZHNoYWtlIDEyNgorI2RlZmluZSBTU0xfRl9TU0xfbG9hZF9jbGllbnRfQ0FfZmlsZSAxMjcKKyNkZWZpbmUgU1NMX0ZfU1NMX25ldyAxMjgKKyNkZWZpbmUgU1NMX0ZfU1NMX3BlZWsgMTI5CisjZGVmaW5lIFNTTF9GX1NTTF9yZWFkIDEzMAorI2RlZmluZSBTU0xfRl9TU0xfcmVuZWdvdGlhdGUgMTMxCisjZGVmaW5lIFNTTF9GX1NTTF9zZXRfY2lwaGVyX2xpc3QgMTMyCisjZGVmaW5lIFNTTF9GX1NTTF9zZXRfZmQgMTMzCisjZGVmaW5lIFNTTF9GX1NTTF9zZXRfcmZkIDEzNAorI2RlZmluZSBTU0xfRl9TU0xfc2V0X3Nlc3Npb25faWRfY29udGV4dCAxMzUKKyNkZWZpbmUgU1NMX0ZfU1NMX3NldF93ZmQgMTM2CisjZGVmaW5lIFNTTF9GX1NTTF9zaHV0ZG93biAxMzcKKyNkZWZpbmUgU1NMX0ZfU1NMX3VzZV9Qcml2YXRlS2V5IDEzOAorI2RlZmluZSBTU0xfRl9TU0xfdXNlX1ByaXZhdGVLZXlfQVNOMSAxMzkKKyNkZWZpbmUgU1NMX0ZfU1NMX3VzZV9Qcml2YXRlS2V5X2ZpbGUgMTQwCisjZGVmaW5lIFNTTF9GX1NTTF91c2VfUlNBUHJpdmF0ZUtleSAxNDEKKyNkZWZpbmUgU1NMX0ZfU1NMX3VzZV9SU0FQcml2YXRlS2V5X0FTTjEgMTQyCisjZGVmaW5lIFNTTF9GX1NTTF91c2VfUlNBUHJpdmF0ZUtleV9maWxlIDE0MworI2RlZmluZSBTU0xfRl9TU0xfdXNlX2NlcnRpZmljYXRlIDE0NAorI2RlZmluZSBTU0xfRl9TU0xfdXNlX2NlcnRpZmljYXRlX0FTTjEgMTQ1CisjZGVmaW5lIFNTTF9GX1NTTF91c2VfY2VydGlmaWNhdGVfZmlsZSAxNDYKKyNkZWZpbmUgU1NMX0ZfU1NMX3VzZV9wc2tfaWRlbnRpdHlfaGludCAxNDcKKyNkZWZpbmUgU1NMX0ZfU1NMX3dyaXRlIDE0OAorI2RlZmluZSBTU0xfRl9kMmlfU1NMX1NFU1NJT04gMTQ5CisjZGVmaW5lIFNTTF9GX2QyaV9TU0xfU0VTU0lPTl9nZXRfb2N0ZXRfc3RyaW5nIDE1MAorI2RlZmluZSBTU0xfRl9kMmlfU1NMX1NFU1NJT05fZ2V0X3N0cmluZyAxNTEKKyNkZWZpbmUgU1NMX0ZfZG9fc3NsM193cml0ZSAxNTIKKyNkZWZpbmUgU1NMX0ZfZHRsczFfYWNjZXB0IDE1MworI2RlZmluZSBTU0xfRl9kdGxzMV9idWZmZXJfcmVjb3JkIDE1NAorI2RlZmluZSBTU0xfRl9kdGxzMV9jaGVja190aW1lb3V0X251bSAxNTUKKyNkZWZpbmUgU1NMX0ZfZHRsczFfY29ubmVjdCAxNTYKKyNkZWZpbmUgU1NMX0ZfZHRsczFfZG9fd3JpdGUgMTU3CisjZGVmaW5lIFNTTF9GX2R0bHMxX2dldF9oZWxsb192ZXJpZnkgMTU4CisjZGVmaW5lIFNTTF9GX2R0bHMxX2dldF9tZXNzYWdlIDE1OQorI2RlZmluZSBTU0xfRl9kdGxzMV9nZXRfbWVzc2FnZV9mcmFnbWVudCAxNjAKKyNkZWZpbmUgU1NMX0ZfZHRsczFfcHJlcHJvY2Vzc19mcmFnbWVudCAxNjEKKyNkZWZpbmUgU1NMX0ZfZHRsczFfcHJvY2Vzc19yZWNvcmQgMTYyCisjZGVmaW5lIFNTTF9GX2R0bHMxX3JlYWRfYnl0ZXMgMTYzCisjZGVmaW5lIFNTTF9GX2R0bHMxX3NlbmRfaGVsbG9fdmVyaWZ5X3JlcXVlc3QgMTY0CisjZGVmaW5lIFNTTF9GX2R0bHMxX3dyaXRlX2FwcF9kYXRhIDE2NQorI2RlZmluZSBTU0xfRl9pMmRfU1NMX1NFU1NJT04gMTY2CisjZGVmaW5lIFNTTF9GX3NzbDNfYWNjZXB0IDE2NworI2RlZmluZSBTU0xfRl9zc2wzX2NlcnRfdmVyaWZ5X2hhc2ggMTY5CisjZGVmaW5lIFNTTF9GX3NzbDNfY2hlY2tfY2VydF9hbmRfYWxnb3JpdGhtIDE3MAorI2RlZmluZSBTU0xfRl9zc2wzX2Nvbm5lY3QgMTcxCisjZGVmaW5lIFNTTF9GX3NzbDNfY3RybCAxNzIKKyNkZWZpbmUgU1NMX0Zfc3NsM19jdHhfY3RybCAxNzMKKyNkZWZpbmUgU1NMX0Zfc3NsM19kaWdlc3RfY2FjaGVkX3JlY29yZHMgMTc0CisjZGVmaW5lIFNTTF9GX3NzbDNfZG9fY2hhbmdlX2NpcGhlcl9zcGVjIDE3NQorI2RlZmluZSBTU0xfRl9zc2wzX2V4cGVjdF9jaGFuZ2VfY2lwaGVyX3NwZWMgMTc2CisjZGVmaW5lIFNTTF9GX3NzbDNfZ2V0X2NlcnRfc3RhdHVzIDE3NworI2RlZmluZSBTU0xfRl9zc2wzX2dldF9jZXJ0X3ZlcmlmeSAxNzgKKyNkZWZpbmUgU1NMX0Zfc3NsM19nZXRfY2VydGlmaWNhdGVfcmVxdWVzdCAxNzkKKyNkZWZpbmUgU1NMX0Zfc3NsM19nZXRfY2hhbm5lbF9pZCAxODAKKyNkZWZpbmUgU1NMX0Zfc3NsM19nZXRfY2xpZW50X2NlcnRpZmljYXRlIDE4MQorI2RlZmluZSBTU0xfRl9zc2wzX2dldF9jbGllbnRfaGVsbG8gMTgyCisjZGVmaW5lIFNTTF9GX3NzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UgMTgzCisjZGVmaW5lIFNTTF9GX3NzbDNfZ2V0X2ZpbmlzaGVkIDE4NAorI2RlZmluZSBTU0xfRl9zc2wzX2dldF9pbml0aWFsX2J5dGVzIDE4NQorI2RlZmluZSBTU0xfRl9zc2wzX2dldF9tZXNzYWdlIDE4NgorI2RlZmluZSBTU0xfRl9zc2wzX2dldF9uZXdfc2Vzc2lvbl90aWNrZXQgMTg3CisjZGVmaW5lIFNTTF9GX3NzbDNfZ2V0X25leHRfcHJvdG8gMTg4CisjZGVmaW5lIFNTTF9GX3NzbDNfZ2V0X3JlY29yZCAxODkKKyNkZWZpbmUgU1NMX0Zfc3NsM19nZXRfc2VydmVyX2NlcnRpZmljYXRlIDE5MAorI2RlZmluZSBTU0xfRl9zc2wzX2dldF9zZXJ2ZXJfZG9uZSAxOTEKKyNkZWZpbmUgU1NMX0Zfc3NsM19nZXRfc2VydmVyX2hlbGxvIDE5MgorI2RlZmluZSBTU0xfRl9zc2wzX2dldF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlIDE5MworI2RlZmluZSBTU0xfRl9zc2wzX2dldF92Ml9jbGllbnRfaGVsbG8gMTk0CisjZGVmaW5lIFNTTF9GX3NzbDNfaGFuZHNoYWtlX21hYyAxOTUKKyNkZWZpbmUgU1NMX0Zfc3NsM19wcmYgMTk2CisjZGVmaW5lIFNTTF9GX3NzbDNfcmVhZF9ieXRlcyAxOTcKKyNkZWZpbmUgU1NMX0Zfc3NsM19yZWFkX24gMTk4CisjZGVmaW5lIFNTTF9GX3NzbDNfc2VuZF9jZXJ0X3ZlcmlmeSAxOTkKKyNkZWZpbmUgU1NMX0Zfc3NsM19zZW5kX2NlcnRpZmljYXRlX3JlcXVlc3QgMjAwCisjZGVmaW5lIFNTTF9GX3NzbDNfc2VuZF9jaGFubmVsX2lkIDIwMQorI2RlZmluZSBTU0xfRl9zc2wzX3NlbmRfY2xpZW50X2NlcnRpZmljYXRlIDIwMgorI2RlZmluZSBTU0xfRl9zc2wzX3NlbmRfY2xpZW50X2hlbGxvIDIwMworI2RlZmluZSBTU0xfRl9zc2wzX3NlbmRfY2xpZW50X2tleV9leGNoYW5nZSAyMDQKKyNkZWZpbmUgU1NMX0Zfc3NsM19zZW5kX3NlcnZlcl9jZXJ0aWZpY2F0ZSAyMDUKKyNkZWZpbmUgU1NMX0Zfc3NsM19zZW5kX3NlcnZlcl9oZWxsbyAyMDYKKyNkZWZpbmUgU1NMX0Zfc3NsM19zZW5kX3NlcnZlcl9rZXlfZXhjaGFuZ2UgMjA3CisjZGVmaW5lIFNTTF9GX3NzbDNfc2V0dXBfcmVhZF9idWZmZXIgMjA4CisjZGVmaW5lIFNTTF9GX3NzbDNfc2V0dXBfd3JpdGVfYnVmZmVyIDIwOQorI2RlZmluZSBTU0xfRl9zc2wzX3dyaXRlX2J5dGVzIDIxMAorI2RlZmluZSBTU0xfRl9zc2wzX3dyaXRlX3BlbmRpbmcgMjExCisjZGVmaW5lIFNTTF9GX3NzbF9hZGRfY2VydF9jaGFpbiAyMTIKKyNkZWZpbmUgU1NMX0Zfc3NsX2FkZF9jZXJ0X3RvX2J1ZiAyMTMKKyNkZWZpbmUgU1NMX0Zfc3NsX2FkZF9jbGllbnRoZWxsb19yZW5lZ290aWF0ZV9leHQgMjE0CisjZGVmaW5lIFNTTF9GX3NzbF9hZGRfY2xpZW50aGVsbG9fdGxzZXh0IDIxNQorI2RlZmluZSBTU0xfRl9zc2xfYWRkX2NsaWVudGhlbGxvX3VzZV9zcnRwX2V4dCAyMTYKKyNkZWZpbmUgU1NMX0Zfc3NsX2FkZF9zZXJ2ZXJoZWxsb19yZW5lZ290aWF0ZV9leHQgMjE3CisjZGVmaW5lIFNTTF9GX3NzbF9hZGRfc2VydmVyaGVsbG9fdGxzZXh0IDIxOAorI2RlZmluZSBTU0xfRl9zc2xfYWRkX3NlcnZlcmhlbGxvX3VzZV9zcnRwX2V4dCAyMTkKKyNkZWZpbmUgU1NMX0Zfc3NsX2J1aWxkX2NlcnRfY2hhaW4gMjIwCisjZGVmaW5lIFNTTF9GX3NzbF9ieXRlc190b19jaXBoZXJfbGlzdCAyMjEKKyNkZWZpbmUgU1NMX0Zfc3NsX2NlcnRfZHVwIDIyMgorI2RlZmluZSBTU0xfRl9zc2xfY2VydF9pbnN0IDIyMworI2RlZmluZSBTU0xfRl9zc2xfY2VydF9uZXcgMjI0CisjZGVmaW5lIFNTTF9GX3NzbF9jaGVja19zZXJ2ZXJoZWxsb190bHNleHQgMjI1CisjZGVmaW5lIFNTTF9GX3NzbF9jaGVja19zcnZyX2VjY19jZXJ0X2FuZF9hbGcgMjI2CisjZGVmaW5lIFNTTF9GX3NzbF9jaXBoZXJfcHJvY2Vzc19ydWxlc3RyIDIyNworI2RlZmluZSBTU0xfRl9zc2xfY2lwaGVyX3N0cmVuZ3RoX3NvcnQgMjI4CisjZGVmaW5lIFNTTF9GX3NzbF9jcmVhdGVfY2lwaGVyX2xpc3QgMjI5CisjZGVmaW5lIFNTTF9GX3NzbF9jdHhfbG9nX21hc3Rlcl9zZWNyZXQgMjMwCisjZGVmaW5lIFNTTF9GX3NzbF9jdHhfbG9nX3JzYV9jbGllbnRfa2V5X2V4Y2hhbmdlIDIzMQorI2RlZmluZSBTU0xfRl9zc2xfY3R4X21ha2VfcHJvZmlsZXMgMjMyCisjZGVmaW5lIFNTTF9GX3NzbF9nZXRfbmV3X3Nlc3Npb24gMjMzCisjZGVmaW5lIFNTTF9GX3NzbF9nZXRfcHJldl9zZXNzaW9uIDIzNAorI2RlZmluZSBTU0xfRl9zc2xfZ2V0X3NlcnZlcl9jZXJ0X2luZGV4IDIzNQorI2RlZmluZSBTU0xfRl9zc2xfZ2V0X3NpZ25fcGtleSAyMzYKKyNkZWZpbmUgU1NMX0Zfc3NsX2luaXRfd2Jpb19idWZmZXIgMjM3CisjZGVmaW5lIFNTTF9GX3NzbF9wYXJzZV9jbGllbnRoZWxsb19yZW5lZ290aWF0ZV9leHQgMjM4CisjZGVmaW5lIFNTTF9GX3NzbF9wYXJzZV9jbGllbnRoZWxsb190bHNleHQgMjM5CisjZGVmaW5lIFNTTF9GX3NzbF9wYXJzZV9jbGllbnRoZWxsb191c2Vfc3J0cF9leHQgMjQwCisjZGVmaW5lIFNTTF9GX3NzbF9wYXJzZV9zZXJ2ZXJoZWxsb19yZW5lZ290aWF0ZV9leHQgMjQxCisjZGVmaW5lIFNTTF9GX3NzbF9wYXJzZV9zZXJ2ZXJoZWxsb190bHNleHQgMjQyCisjZGVmaW5lIFNTTF9GX3NzbF9wYXJzZV9zZXJ2ZXJoZWxsb191c2Vfc3J0cF9leHQgMjQzCisjZGVmaW5lIFNTTF9GX3NzbF9zY2FuX2NsaWVudGhlbGxvX3Rsc2V4dCAyNDQKKyNkZWZpbmUgU1NMX0Zfc3NsX3NjYW5fc2VydmVyaGVsbG9fdGxzZXh0IDI0NQorI2RlZmluZSBTU0xfRl9zc2xfc2Vzc19jZXJ0X25ldyAyNDYKKyNkZWZpbmUgU1NMX0Zfc3NsX3NldF9jZXJ0IDI0NworI2RlZmluZSBTU0xfRl9zc2xfc2V0X3BrZXkgMjQ4CisjZGVmaW5lIFNTTF9GX3NzbF92ZXJpZnlfY2VydF9jaGFpbiAyNTIKKyNkZWZpbmUgU1NMX0ZfdGxzMTJfY2hlY2tfcGVlcl9zaWdhbGcgMjUzCisjZGVmaW5lIFNTTF9GX3RsczFfYWVhZF9jdHhfaW5pdCAyNTQKKyNkZWZpbmUgU1NMX0ZfdGxzMV9jZXJ0X3ZlcmlmeV9tYWMgMjU1CisjZGVmaW5lIFNTTF9GX3RsczFfY2hhbmdlX2NpcGhlcl9zdGF0ZSAyNTYKKyNkZWZpbmUgU1NMX0ZfdGxzMV9jaGFuZ2VfY2lwaGVyX3N0YXRlX2FlYWQgMjU3CisjZGVmaW5lIFNTTF9GX3RsczFfY2hlY2tfZHVwbGljYXRlX2V4dGVuc2lvbnMgMjU4CisjZGVmaW5lIFNTTF9GX3RsczFfZW5jIDI1OQorI2RlZmluZSBTU0xfRl90bHMxX2V4cG9ydF9rZXlpbmdfbWF0ZXJpYWwgMjYwCisjZGVmaW5lIFNTTF9GX3RsczFfcHJmIDI2MQorI2RlZmluZSBTU0xfRl90bHMxX3NldHVwX2tleV9ibG9jayAyNjIKKyNkZWZpbmUgU1NMX0ZfZHRsczFfZ2V0X2J1ZmZlcmVkX21lc3NhZ2UgMjYzCisjZGVmaW5lIFNTTF9GX2R0bHMxX3Byb2Nlc3NfZnJhZ21lbnQgMjY0CisjZGVmaW5lIFNTTF9GX2R0bHMxX2htX2ZyYWdtZW50X25ldyAyNjUKKyNkZWZpbmUgU1NMX0Zfc3NsM19zZWFsX3JlY29yZCAyNjYKKyNkZWZpbmUgU1NMX0Zfc3NsM19yZWNvcmRfc2VxdWVuY2VfdXBkYXRlIDI2NworI2RlZmluZSBTU0xfRl9TU0xfQ1RYX3NldF90bXBfZGggMjY4CisjZGVmaW5lIFNTTF9GX1NTTF9DVFhfc2V0X3RtcF9lY2RoIDI2OQorI2RlZmluZSBTU0xfRl9TU0xfc2V0X3RtcF9kaCAyNzAKKyNkZWZpbmUgU1NMX0ZfU1NMX3NldF90bXBfZWNkaCAyNzEKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF9zZXQxX3Rsc19jaGFubmVsX2lkIDI3MgorI2RlZmluZSBTU0xfRl9TU0xfc2V0MV90bHNfY2hhbm5lbF9pZCAyNzMKKyNkZWZpbmUgU1NMX0ZfU1NMX3NldF90bHNleHRfaG9zdF9uYW1lIDI3NAorI2RlZmluZSBTU0xfRl9zc2wzX291dHB1dF9jZXJ0X2NoYWluIDI3NQorI2RlZmluZSBTU0xfRl9TU0xfQUVBRF9DVFhfbmV3IDI3NgorI2RlZmluZSBTU0xfRl9TU0xfQUVBRF9DVFhfb3BlbiAyNzcKKyNkZWZpbmUgU1NMX0ZfU1NMX0FFQURfQ1RYX3NlYWwgMjc4CisjZGVmaW5lIFNTTF9GX2R0bHMxX3NlYWxfcmVjb3JkIDI3OQogI2RlZmluZSBTU0xfUl9BUFBfREFUQV9JTl9IQU5EU0hBS0UgMTAwCiAjZGVmaW5lIFNTTF9SX0FUVEVNUFRfVE9fUkVVU0VfU0VTU0lPTl9JTl9ESUZGRVJFTlRfQ09OVEVYVCAxMDEKICNkZWZpbmUgU1NMX1JfQkFEX0FMRVJUIDEwMgpAQCAtMzgyOSwxNSArMjkyNSw2IEBACiAjZGVmaW5lIFNTTF9SX1JFU1VNRURfRU1TX1NFU1NJT05fV0lUSE9VVF9FTVNfRVhURU5TSU9OIDI3NQogI2RlZmluZSBTU0xfUl9FTVNfU1RBVEVfSU5DT05TSVNURU5UIDI3NgogI2RlZmluZSBTU0xfUl9SRVNVTUVEX05PTl9FTVNfU0VTU0lPTl9XSVRIX0VNU19FWFRFTlNJT04gMjc3Ci0jZGVmaW5lIFNTTF9SX1RPT19NQU5ZX1dBUk5JTkdfQUxFUlRTIDI3OAotI2RlZmluZSBTU0xfUl9VTkVYUEVDVEVEX0VYVEVOU0lPTiAyNzkKLSNkZWZpbmUgU1NMX1JfU0lHTkFUVVJFX0FMR09SSVRITVNfRVhURU5TSU9OX1NFTlRfQllfU0VSVkVSIDI4MAotI2RlZmluZSBTU0xfUl9FUlJPUl9BRERJTkdfRVhURU5TSU9OIDI4MQotI2RlZmluZSBTU0xfUl9FUlJPUl9QQVJTSU5HX0VYVEVOU0lPTiAyODIKLSNkZWZpbmUgU1NMX1JfTUlTU0lOR19FWFRFTlNJT04gMjgzCi0jZGVmaW5lIFNTTF9SX0NVU1RPTV9FWFRFTlNJT05fQ09OVEVOVFNfVE9PX0xBUkdFIDI4NAotI2RlZmluZSBTU0xfUl9DVVNUT01fRVhURU5TSU9OX0VSUk9SIDI4NQotI2RlZmluZSBTU0xfUl9ORUdPVElBVEVEX0JPVEhfTlBOX0FORF9BTFBOIDI4NgogI2RlZmluZSBTU0xfUl9TU0xWM19BTEVSVF9DTE9TRV9OT1RJRlkgMTAwMAogI2RlZmluZSBTU0xfUl9TU0xWM19BTEVSVF9VTkVYUEVDVEVEX01FU1NBR0UgMTAxMAogI2RlZmluZSBTU0xfUl9TU0xWM19BTEVSVF9CQURfUkVDT1JEX01BQyAxMDIwCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcGVuc3NsL3NzbDIuaCBiL3NyYy9pbmNsdWRlL29wZW5zc2wvc3NsMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NDAxZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL3NzbDIuaApAQCAtMCwwICsxLDI2OCBAQAorLyogc3NsL3NzbDIuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9TU0wyX0ggCisjZGVmaW5lIEhFQURFUl9TU0wyX0ggCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFByb3RvY29sIFZlcnNpb24gQ29kZXMgKi8KKyNkZWZpbmUgU1NMMl9WRVJTSU9OCQkweDAwMDIKKyNkZWZpbmUgU1NMMl9WRVJTSU9OX01BSk9SCTB4MDAKKyNkZWZpbmUgU1NMMl9WRVJTSU9OX01JTk9SCTB4MDIKKy8qICNkZWZpbmUgU1NMMl9DTElFTlRfVkVSU0lPTgkweDAwMDIgKi8KKy8qICNkZWZpbmUgU1NMMl9TRVJWRVJfVkVSU0lPTgkweDAwMDIgKi8KKworLyogUHJvdG9jb2wgTWVzc2FnZSBDb2RlcyAqLworI2RlZmluZSBTU0wyX01UX0VSUk9SCQkJMAorI2RlZmluZSBTU0wyX01UX0NMSUVOVF9IRUxMTwkJMQorI2RlZmluZSBTU0wyX01UX0NMSUVOVF9NQVNURVJfS0VZCTIKKyNkZWZpbmUgU1NMMl9NVF9DTElFTlRfRklOSVNIRUQJCTMKKyNkZWZpbmUgU1NMMl9NVF9TRVJWRVJfSEVMTE8JCTQKKyNkZWZpbmUgU1NMMl9NVF9TRVJWRVJfVkVSSUZZCQk1CisjZGVmaW5lIFNTTDJfTVRfU0VSVkVSX0ZJTklTSEVECQk2CisjZGVmaW5lIFNTTDJfTVRfUkVRVUVTVF9DRVJUSUZJQ0FURQk3CisjZGVmaW5lIFNTTDJfTVRfQ0xJRU5UX0NFUlRJRklDQVRFCTgKKworLyogRXJyb3IgTWVzc2FnZSBDb2RlcyAqLworI2RlZmluZSBTU0wyX1BFX1VOREVGSU5FRF9FUlJPUgkJMHgwMDAwCisjZGVmaW5lIFNTTDJfUEVfTk9fQ0lQSEVSCQkweDAwMDEKKyNkZWZpbmUgU1NMMl9QRV9OT19DRVJUSUZJQ0FURQkJMHgwMDAyCisjZGVmaW5lIFNTTDJfUEVfQkFEX0NFUlRJRklDQVRFCQkweDAwMDQKKyNkZWZpbmUgU1NMMl9QRV9VTlNVUFBPUlRFRF9DRVJUSUZJQ0FURV9UWVBFIDB4MDAwNgorCisvKiBDaXBoZXIgS2luZCBWYWx1ZXMgKi8KKyNkZWZpbmUgU1NMMl9DS19OVUxMX1dJVEhfTUQ1CQkJMHgwMjAwMDAwMCAvKiB2MyAqLworI2RlZmluZSBTU0wyX0NLX1JDNF8xMjhfV0lUSF9NRDUJCTB4MDIwMTAwODAKKyNkZWZpbmUgU1NMMl9DS19SQzRfMTI4X0VYUE9SVDQwX1dJVEhfTUQ1CTB4MDIwMjAwODAKKyNkZWZpbmUgU1NMMl9DS19SQzJfMTI4X0NCQ19XSVRIX01ENQkJMHgwMjAzMDA4MAorI2RlZmluZSBTU0wyX0NLX1JDMl8xMjhfQ0JDX0VYUE9SVDQwX1dJVEhfTUQ1CTB4MDIwNDAwODAKKyNkZWZpbmUgU1NMMl9DS19JREVBXzEyOF9DQkNfV0lUSF9NRDUJCTB4MDIwNTAwODAKKyNkZWZpbmUgU1NMMl9DS19ERVNfNjRfQ0JDX1dJVEhfTUQ1CQkweDAyMDYwMDQwCisjZGVmaW5lIFNTTDJfQ0tfREVTXzY0X0NCQ19XSVRIX1NIQQkJMHgwMjA2MDE0MCAvKiB2MyAqLworI2RlZmluZSBTU0wyX0NLX0RFU18xOTJfRURFM19DQkNfV0lUSF9NRDUJMHgwMjA3MDBjMAorI2RlZmluZSBTU0wyX0NLX0RFU18xOTJfRURFM19DQkNfV0lUSF9TSEEJMHgwMjA3MDFjMCAvKiB2MyAqLworI2RlZmluZSBTU0wyX0NLX1JDNF82NF9XSVRIX01ENQkJCTB4MDIwODAwODAgLyogTVMgaGFjayAqLworIAorI2RlZmluZSBTU0wyX0NLX0RFU182NF9DRkI2NF9XSVRIX01ENV8xCQkweDAyZmYwODAwIC8qIFNTTGVheSAqLworI2RlZmluZSBTU0wyX0NLX05VTEwJCQkJMHgwMmZmMDgxMCAvKiBTU0xlYXkgKi8KKworI2RlZmluZSBTU0wyX1RYVF9ERVNfNjRfQ0ZCNjRfV0lUSF9NRDVfMQkiREVTLUNGQi1NMSIKKyNkZWZpbmUgU1NMMl9UWFRfTlVMTF9XSVRIX01ENQkJCSJOVUxMLU1ENSIKKyNkZWZpbmUgU1NMMl9UWFRfUkM0XzEyOF9XSVRIX01ENQkJIlJDNC1NRDUiCisjZGVmaW5lIFNTTDJfVFhUX1JDNF8xMjhfRVhQT1JUNDBfV0lUSF9NRDUJIkVYUC1SQzQtTUQ1IgorI2RlZmluZSBTU0wyX1RYVF9SQzJfMTI4X0NCQ19XSVRIX01ENQkJIlJDMi1DQkMtTUQ1IgorI2RlZmluZSBTU0wyX1RYVF9SQzJfMTI4X0NCQ19FWFBPUlQ0MF9XSVRIX01ENQkiRVhQLVJDMi1DQkMtTUQ1IgorI2RlZmluZSBTU0wyX1RYVF9JREVBXzEyOF9DQkNfV0lUSF9NRDUJCSJJREVBLUNCQy1NRDUiCisjZGVmaW5lIFNTTDJfVFhUX0RFU182NF9DQkNfV0lUSF9NRDUJCSJERVMtQ0JDLU1ENSIKKyNkZWZpbmUgU1NMMl9UWFRfREVTXzY0X0NCQ19XSVRIX1NIQQkJIkRFUy1DQkMtU0hBIgorI2RlZmluZSBTU0wyX1RYVF9ERVNfMTkyX0VERTNfQ0JDX1dJVEhfTUQ1CSJERVMtQ0JDMy1NRDUiCisjZGVmaW5lIFNTTDJfVFhUX0RFU18xOTJfRURFM19DQkNfV0lUSF9TSEEJIkRFUy1DQkMzLVNIQSIKKyNkZWZpbmUgU1NMMl9UWFRfUkM0XzY0X1dJVEhfTUQ1CQkiUkM0LTY0LU1ENSIKKworI2RlZmluZSBTU0wyX1RYVF9OVUxMCQkJCSJOVUxMIgorCisvKiBGbGFncyBmb3IgdGhlIFNTTF9DSVBIRVIuYWxnb3JpdGhtMiBmaWVsZCAqLworI2RlZmluZSBTU0wyX0NGXzVfQllURV9FTkMJCQkweDAxCisjZGVmaW5lIFNTTDJfQ0ZfOF9CWVRFX0VOQwkJCTB4MDIKKworLyogQ2VydGlmaWNhdGUgVHlwZSBDb2RlcyAqLworI2RlZmluZSBTU0wyX0NUX1g1MDlfQ0VSVElGSUNBVEUJCTB4MDEKKworLyogQXV0aGVudGljYXRpb24gVHlwZSBDb2RlICovCisjZGVmaW5lIFNTTDJfQVRfTUQ1X1dJVEhfUlNBX0VOQ1JZUFRJT04JCTB4MDEKKworI2RlZmluZSBTU0wyX01BWF9TU0xfU0VTU0lPTl9JRF9MRU5HVEgJCTMyCisKKy8qIFVwcGVyL0xvd2VyIEJvdW5kcyAqLworI2RlZmluZSBTU0wyX01BWF9NQVNURVJfS0VZX0xFTkdUSF9JTl9CSVRTCTI1NgorI2lmZGVmIE9QRU5TU0xfU1lTX01QRQorI2RlZmluZSBTU0wyX01BWF9SRUNPUkRfTEVOR1RIXzJfQllURV9IRUFERVIJMjk5OTh1CisjZWxzZQorI2RlZmluZSBTU0wyX01BWF9SRUNPUkRfTEVOR1RIXzJfQllURV9IRUFERVIJMzI3Njd1ICAvKiAyXjE1LTEgKi8KKyNlbmRpZgorI2RlZmluZSBTU0wyX01BWF9SRUNPUkRfTEVOR1RIXzNfQllURV9IRUFERVIJMTYzODMgLyogMl4xNC0xICovCisKKyNkZWZpbmUgU1NMMl9DSEFMTEVOR0VfTEVOR1RICTE2CisvKiNkZWZpbmUgU1NMMl9DSEFMTEVOR0VfTEVOR1RICTMyICovCisjZGVmaW5lIFNTTDJfTUlOX0NIQUxMRU5HRV9MRU5HVEgJMTYKKyNkZWZpbmUgU1NMMl9NQVhfQ0hBTExFTkdFX0xFTkdUSAkzMgorI2RlZmluZSBTU0wyX0NPTk5FQ1RJT05fSURfTEVOR1RICTE2CisjZGVmaW5lIFNTTDJfTUFYX0NPTk5FQ1RJT05fSURfTEVOR1RICTE2CisjZGVmaW5lIFNTTDJfU1NMX1NFU1NJT05fSURfTEVOR1RICTE2CisjZGVmaW5lIFNTTDJfTUFYX0NFUlRfQ0hBTExFTkdFX0xFTkdUSAkzMgorI2RlZmluZSBTU0wyX01JTl9DRVJUX0NIQUxMRU5HRV9MRU5HVEgJMTYKKyNkZWZpbmUgU1NMMl9NQVhfS0VZX01BVEVSSUFMX0xFTkdUSAkyNAorCisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMX0lOVEVSTgorCit0eXBlZGVmIHN0cnVjdCBzc2wyX3N0YXRlX3N0CisJeworCWludCB0aHJlZV9ieXRlX2hlYWRlcjsKKwlpbnQgY2xlYXJfdGV4dDsJCS8qIGNsZWFyIHRleHQgKi8KKwlpbnQgZXNjYXBlOwkJLyogbm90IHVzZWQgaW4gU1NMdjIgKi8KKwlpbnQgc3NsMl9yb2xsYmFjazsJLyogdXNlZCBpZiBTU0x2MjMgcm9sbGVkIGJhY2sgdG8gU1NMdjIgKi8KKworCS8qIG5vbi1ibG9ja2luZyBpbyBpbmZvLCB1c2VkIHRvIG1ha2Ugc3VyZSB0aGUgc2FtZQorCSAqIGFyZ3Mgd2VyZSBwYXNzd2QgKi8KKwl1bnNpZ25lZCBpbnQgd251bTsJLyogbnVtYmVyIG9mIGJ5dGVzIHNlbnQgc28gZmFyICovCisJaW50IHdwZW5kX3RvdDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICp3cGVuZF9idWY7CisKKwlpbnQgd3BlbmRfb2ZmOwkvKiBvZmZzZXQgdG8gZGF0YSB0byB3cml0ZSAqLworCWludCB3cGVuZF9sZW47IAkvKiBudW1iZXIgb2YgYnl0ZXMgcGFzc3dkIHRvIHdyaXRlICovCisJaW50IHdwZW5kX3JldDsgCS8qIG51bWJlciBvZiBieXRlcyB0byByZXR1cm4gdG8gY2FsbGVyICovCisKKwkvKiBidWZmZXIgcmF3IGRhdGEgKi8KKwlpbnQgcmJ1Zl9sZWZ0OworCWludCByYnVmX29mZnM7CisJdW5zaWduZWQgY2hhciAqcmJ1ZjsKKwl1bnNpZ25lZCBjaGFyICp3YnVmOworCisJdW5zaWduZWQgY2hhciAqd3JpdGVfcHRyOy8qIHVzZWQgdG8gcG9pbnQgdG8gdGhlIHN0YXJ0IGR1ZSB0bworCQkJCSAgKiAyLzMgYnl0ZSBoZWFkZXIuICovCisKKwl1bnNpZ25lZCBpbnQgcGFkZGluZzsKKwl1bnNpZ25lZCBpbnQgcmxlbmd0aDsgLyogcGFzc2VkIHRvIHNzbDJfZW5jICovCisJaW50IHJhY3RfZGF0YV9sZW5ndGg7IC8qIFNldCB3aGVuIHRoaW5ncyBhcmUgZW5jcnlwdGVkLiAqLworCXVuc2lnbmVkIGludCB3bGVuZ3RoOyAvKiBwYXNzZWQgdG8gc3NsMl9lbmMgKi8KKwlpbnQgd2FjdF9kYXRhX2xlbmd0aDsgLyogU2V0IHdoZW4gdGhpbmdzIGFyZSBkZWNyeXB0ZWQuICovCisJdW5zaWduZWQgY2hhciAqcmFjdF9kYXRhOworCXVuc2lnbmVkIGNoYXIgKndhY3RfZGF0YTsKKwl1bnNpZ25lZCBjaGFyICptYWNfZGF0YTsKKworCXVuc2lnbmVkIGNoYXIgKnJlYWRfa2V5OworCXVuc2lnbmVkIGNoYXIgKndyaXRlX2tleTsKKworCQkvKiBTdHVmZiBzcGVjaWZpY2FsbHkgdG8gZG8gd2l0aCB0aGlzIFNTTCBzZXNzaW9uICovCisJdW5zaWduZWQgaW50IGNoYWxsZW5nZV9sZW5ndGg7CisJdW5zaWduZWQgY2hhciBjaGFsbGVuZ2VbU1NMMl9NQVhfQ0hBTExFTkdFX0xFTkdUSF07CisJdW5zaWduZWQgaW50IGNvbm5faWRfbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgY29ubl9pZFtTU0wyX01BWF9DT05ORUNUSU9OX0lEX0xFTkdUSF07CisJdW5zaWduZWQgaW50IGtleV9tYXRlcmlhbF9sZW5ndGg7CisJdW5zaWduZWQgY2hhciBrZXlfbWF0ZXJpYWxbU1NMMl9NQVhfS0VZX01BVEVSSUFMX0xFTkdUSCoyXTsKKworCXVuc2lnbmVkIGxvbmcgcmVhZF9zZXF1ZW5jZTsKKwl1bnNpZ25lZCBsb25nIHdyaXRlX3NlcXVlbmNlOworCisJc3RydWN0CXsKKwkJdW5zaWduZWQgaW50IGNvbm5faWRfbGVuZ3RoOworCQl1bnNpZ25lZCBpbnQgY2VydF90eXBlOwkKKwkJdW5zaWduZWQgaW50IGNlcnRfbGVuZ3RoOworCQl1bnNpZ25lZCBpbnQgY3NsOyAKKwkJdW5zaWduZWQgaW50IGNsZWFyOworCQl1bnNpZ25lZCBpbnQgZW5jOyAKKwkJdW5zaWduZWQgY2hhciBjY2xbU1NMMl9NQVhfQ0VSVF9DSEFMTEVOR0VfTEVOR1RIXTsKKwkJdW5zaWduZWQgaW50IGNpcGhlcl9zcGVjX2xlbmd0aDsKKwkJdW5zaWduZWQgaW50IHNlc3Npb25faWRfbGVuZ3RoOworCQl1bnNpZ25lZCBpbnQgY2xlbjsKKwkJdW5zaWduZWQgaW50IHJsZW47CisJCX0gdG1wOworCX0gU1NMMl9TVEFURTsKKworI2VuZGlmCisKKy8qIFNTTHYyICovCisvKiBjbGllbnQgKi8KKyNkZWZpbmUgU1NMMl9TVF9TRU5EX0NMSUVOVF9IRUxMT19BCQkoMHgxMHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX0NMSUVOVF9IRUxMT19CCQkoMHgxMXxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMl9TVF9HRVRfU0VSVkVSX0hFTExPX0EJCSgweDIwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9TRVJWRVJfSEVMTE9fQgkJKDB4MjF8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDJfU1RfU0VORF9DTElFTlRfTUFTVEVSX0tFWV9BCSgweDMwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX01BU1RFUl9LRVlfQgkoMHgzMXxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX0NMSUVOVF9GSU5JU0hFRF9BCQkoMHg0MHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX0NMSUVOVF9GSU5JU0hFRF9CCQkoMHg0MXxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX0NMSUVOVF9DRVJUSUZJQ0FURV9BCSgweDUwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0NFUlRJRklDQVRFX0IJKDB4NTF8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDJfU1RfU0VORF9DTElFTlRfQ0VSVElGSUNBVEVfQwkoMHg1MnxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX0NMSUVOVF9DRVJUSUZJQ0FURV9ECSgweDUzfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9TRVJWRVJfVkVSSUZZX0EJCSgweDYwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9TRVJWRVJfVkVSSUZZX0IJCSgweDYxfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9TRVJWRVJfRklOSVNIRURfQQkJKDB4NzB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDJfU1RfR0VUX1NFUlZFUl9GSU5JU0hFRF9CCQkoMHg3MXxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMl9TVF9DTElFTlRfU1RBUlRfRU5DUllQVElPTgkJKDB4ODB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDJfU1RfWDUwOV9HRVRfQ0xJRU5UX0NFUlRJRklDQVRFCSgweDkwfFNTTF9TVF9DT05ORUNUKQorLyogc2VydmVyICovCisjZGVmaW5lIFNTTDJfU1RfR0VUX0NMSUVOVF9IRUxMT19BCQkoMHgxMHxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9DTElFTlRfSEVMTE9fQgkJKDB4MTF8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMMl9TVF9HRVRfQ0xJRU5UX0hFTExPX0MJCSgweDEyfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfU0VORF9TRVJWRVJfSEVMTE9fQQkJKDB4MjB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX1NFUlZFUl9IRUxMT19CCQkoMHgyMXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9DTElFTlRfTUFTVEVSX0tFWV9BCQkoMHgzMHxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9DTElFTlRfTUFTVEVSX0tFWV9CCQkoMHgzMXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfU0VSVkVSX1ZFUklGWV9BCQkoMHg0MHxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfU0VSVkVSX1ZFUklGWV9CCQkoMHg0MXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfU0VSVkVSX1ZFUklGWV9DCQkoMHg0MnxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9DTElFTlRfRklOSVNIRURfQQkJKDB4NTB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMMl9TVF9HRVRfQ0xJRU5UX0ZJTklTSEVEX0IJCSgweDUxfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfU0VORF9TRVJWRVJfRklOSVNIRURfQQkJKDB4NjB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX1NFUlZFUl9GSU5JU0hFRF9CCQkoMHg2MXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfUkVRVUVTVF9DRVJUSUZJQ0FURV9BCSgweDcwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfU0VORF9SRVFVRVNUX0NFUlRJRklDQVRFX0IJKDB4NzF8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX1JFUVVFU1RfQ0VSVElGSUNBVEVfQwkoMHg3MnxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfUkVRVUVTVF9DRVJUSUZJQ0FURV9ECSgweDczfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfU0VSVkVSX1NUQVJUX0VOQ1JZUFRJT04JCSgweDgwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfWDUwOV9HRVRfU0VSVkVSX0NFUlRJRklDQVRFCSgweDkwfFNTTF9TVF9BQ0NFUFQpCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NyYy9kZWNyZXBpdC9yc2EvcnNhX2RlY3JlcGl0LmMgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmgKc2ltaWxhcml0eSBpbmRleCA4MSUKY29weSBmcm9tIHNyYy9kZWNyZXBpdC9yc2EvcnNhX2RlY3JlcGl0LmMKY29weSB0byBzcmMvaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmgKaW5kZXggYzIzOGY0Ni4uZGYzOTVhOCAxMDA2NDQKLS0tIGEvc3JjL2RlY3JlcGl0L3JzYS9yc2FfZGVjcmVwaXQuYworKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmgKQEAgLTEsMyArMSw0IEBACisvKiBzc2wvc3NsMjMuaCAqLwogLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKQEAgLTUyLDM1ICs1MywzMyBAQAogICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKICAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQogICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQotICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KIAotI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjaWZuZGVmIEhFQURFUl9TU0wyM19ICisjZGVmaW5lIEhFQURFUl9TU0wyM19ICiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCiAKIAotUlNBICpSU0FfZ2VuZXJhdGVfa2V5KGludCBiaXRzLCB1bnNpZ25lZCBsb25nIGVfdmFsdWUsIHZvaWQgKmNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNiX2FyZykgewotICBhc3NlcnQoY2FsbGJhY2sgPT0gTlVMTCk7Ci0gIGFzc2VydChjYl9hcmcgPT0gTlVMTCk7CisvKmNsaWVudCAqLworLyogd3JpdGUgdG8gc2VydmVyICovCisjZGVmaW5lIFNTTDIzX1NUX0NXX0NMTlRfSEVMTE9fQSAoMHgyMTAgfCBTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMjNfU1RfQ1dfQ0xOVF9IRUxMT19CICgweDIxMSB8IFNTTF9TVF9DT05ORUNUKQorLyogcmVhZCBmcm9tIHNlcnZlciAqLworI2RlZmluZSBTU0wyM19TVF9DUl9TUlZSX0hFTExPX0EgKDB4MjIwIHwgU1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDIzX1NUX0NSX1NSVlJfSEVMTE9fQiAoMHgyMjEgfCBTU0xfU1RfQ09OTkVDVCkKIAotICBSU0EgKnJzYSA9IFJTQV9uZXcoKTsKLSAgQklHTlVNICplID0gQk5fbmV3KCk7CisvKiBzZXJ2ZXIgKi8KKy8qIHJlYWQgZnJvbSBjbGllbnQgKi8KKyNkZWZpbmUgU1NMMjNfU1RfU1JfQ0xOVF9IRUxMTyAoMHgyMTAgfCBTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyM19TVF9TUl9WMl9DTE5UX0hFTExPICgweDIyMCB8IFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDIzX1NUX1NSX1NXSVRDSF9WRVJTSU9OICgweDIzMCB8IFNTTF9TVF9BQ0NFUFQpCiAKLSAgaWYgKHJzYSA9PSBOVUxMIHx8Ci0gICAgICBlID09IE5VTEwgfHwKLSAgICAgICFCTl9zZXRfd29yZChlLCBlX3ZhbHVlKSB8fAotICAgICAgIVJTQV9nZW5lcmF0ZV9rZXlfZXgocnNhLCBiaXRzLCBlLCBOVUxMKSkgewotICAgIGdvdG8gZXJyOwotICB9CiAKLSAgQk5fZnJlZShlKTsKLSAgcmV0dXJuIHJzYTsKLQotZXJyOgotICBCTl9mcmVlKGUpOwotICBSU0FfZnJlZShyc2EpOwotICByZXR1cm4gTlVMTDsKKyNpZmRlZiAgX19jcGx1c3BsdXMKIH0KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcGVuc3NsL3NzbDMuaCBiL3NyYy9pbmNsdWRlL29wZW5zc2wvc3NsMy5oCmluZGV4IDFmNmNhMzEuLjY0MGEyMjggMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wZW5zc2wvc3NsMy5oCisrKyBiL3NyYy9pbmNsdWRlL29wZW5zc2wvc3NsMy5oCkBAIC0xMjcsMTQgKzEyNywxMSBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotLyogVGhlc2UgYXJlIGtlcHQgdG8gc3VwcG9ydCBjbGllbnRzIHRoYXQgbmVnb3RpYXRlcyBoaWdoZXIgcHJvdG9jb2wgdmVyc2lvbnMKLSAqIHVzaW5nIFNTTHYyIGNsaWVudCBoZWxsbyByZWNvcmRzLiAqLwotI2RlZmluZSBTU0wyX01UX0NMSUVOVF9IRUxMTyAxCi0jZGVmaW5lIFNTTDJfVkVSU0lPTiAweDAwMDIKIAotLyogU2lnbmFsbGluZyBjaXBoZXIgc3VpdGUgdmFsdWUgZnJvbSBSRkMgNTc0Ni4gKi8KKy8qIFNpZ25hbGxpbmcgY2lwaGVyIHN1aXRlIHZhbHVlOiBmcm9tIFJGQzU3NDYgKi8KICNkZWZpbmUgU1NMM19DS19TQ1NWIDB4MDMwMDAwRkYKLS8qIEZhbGxiYWNrIHNpZ25hbGxpbmcgY2lwaGVyIHN1aXRlIHZhbHVlIGZyb20gUkZDIDc1MDcuICovCisvKiBGYWxsYmFjayBzaWduYWxsaW5nIGNpcGhlciBzdWl0ZSB2YWx1ZTogbm90IElBTkEgYXNzaWduZWQuCisgKiBTZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWJtb2VsbGVyLXRscy1kb3duZ3JhZGUtc2Nzdi0wMSAqLwogI2RlZmluZSBTU0wzX0NLX0ZBTExCQUNLX1NDU1YgMHgwMzAwNTYwMAogCiAjZGVmaW5lIFNTTDNfQ0tfUlNBX05VTExfTUQ1IDB4MDMwMDAwMDEKQEAgLTI3MiwxMSArMjY5LDI5IEBACiAjZGVmaW5lIFNTTDNfTURfQ0xJRU5UX0ZJTklTSEVEX0NPTlNUICJceDQzXHg0Q1x4NEVceDU0IgogI2RlZmluZSBTU0wzX01EX1NFUlZFUl9GSU5JU0hFRF9DT05TVCAiXHg1M1x4NTJceDU2XHg1MiIKIAorI2RlZmluZSBTU0wzX1ZFUlNJT04gMHgwMzAwCisjZGVmaW5lIFNTTDNfVkVSU0lPTl9NQUpPUiAweDAzCisjZGVmaW5lIFNTTDNfVkVSU0lPTl9NSU5PUiAweDAwCisKICNkZWZpbmUgU1NMM19SVF9DSEFOR0VfQ0lQSEVSX1NQRUMgMjAKICNkZWZpbmUgU1NMM19SVF9BTEVSVCAyMQogI2RlZmluZSBTU0wzX1JUX0hBTkRTSEFLRSAyMgogI2RlZmluZSBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEgMjMKIAorLyogUHNldWRvIGNvbnRlbnQgdHlwZXMgdG8gaW5kaWNhdGUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFRMUzFfUlRfQ1JZUFRPIDB4MTAwMAorI2RlZmluZSBUTFMxX1JUX0NSWVBUT19QUkVNQVNURVIgKFRMUzFfUlRfQ1JZUFRPIHwgMHgxKQorI2RlZmluZSBUTFMxX1JUX0NSWVBUT19DTElFTlRfUkFORE9NIChUTFMxX1JUX0NSWVBUTyB8IDB4MikKKyNkZWZpbmUgVExTMV9SVF9DUllQVE9fU0VSVkVSX1JBTkRPTSAoVExTMV9SVF9DUllQVE8gfCAweDMpCisjZGVmaW5lIFRMUzFfUlRfQ1JZUFRPX01BU1RFUiAoVExTMV9SVF9DUllQVE8gfCAweDQpCisKKyNkZWZpbmUgVExTMV9SVF9DUllQVE9fUkVBRCAweDAwMDAKKyNkZWZpbmUgVExTMV9SVF9DUllQVE9fV1JJVEUgMHgwMTAwCisjZGVmaW5lIFRMUzFfUlRfQ1JZUFRPX01BQyAoVExTMV9SVF9DUllQVE8gfCAweDUpCisjZGVmaW5lIFRMUzFfUlRfQ1JZUFRPX0tFWSAoVExTMV9SVF9DUllQVE8gfCAweDYpCisjZGVmaW5lIFRMUzFfUlRfQ1JZUFRPX0lWIChUTFMxX1JUX0NSWVBUTyB8IDB4NykKKyNkZWZpbmUgVExTMV9SVF9DUllQVE9fRklYRURfSVYgKFRMUzFfUlRfQ1JZUFRPIHwgMHg4KQorCiAvKiBQc2V1ZG8gY29udGVudCB0eXBlIGZvciBTU0wvVExTIGhlYWRlciBpbmZvICovCiAjZGVmaW5lIFNTTDNfUlRfSEVBREVSIDB4MTAwCiAKQEAgLTMwNywxNyArMzIyLDIyIEBACiAgIC8qIGRhdGEgaXMgYSBub24tb3duaW5nIHBvaW50ZXIgdG8gdGhlIHJlY29yZCBjb250ZW50cy4gVGhlIHRvdGFsIGxlbmd0aCBvZgogICAgKiB0aGUgYnVmZmVyIGlzIHxvZmZ8ICsgfGxlbmd0aHwuICovCiAgIHVpbnQ4X3QgKmRhdGE7CisgIC8qIGVwb2NoLCBpbiBEVExTLCBpcyB0aGUgZXBvY2ggbnVtYmVyIG9mIHRoZSByZWNvcmQuICovCisgIHVpbnQxNl90IGVwb2NoOworICAvKiBzZXFfbnVtLCBpbiBEVExTLCBpcyB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSByZWNvcmQuIFRoZSB0b3AgdHdvIGJ5dGVzCisgICAqIGFyZSBhbHdheXMgemVyby4KKyAgICoKKyAgICogVE9ETyhkYXZpZGJlbik6IFRoaXMgaXMgY29uZnVzaW5nLiBUaGV5IHNob3VsZCBpbmNsdWRlIHRoZSBlcG9jaCBvciB0aGUKKyAgICogZmllbGQgc2hvdWxkIGJlIHNpeCBieXRlcy4gKi8KKyAgdWludDhfdCBzZXFfbnVtWzhdOwogfSBTU0wzX1JFQ09SRDsKIAogdHlwZWRlZiBzdHJ1Y3Qgc3NsM19idWZmZXJfc3QgewotICAvKiBidWYgaXMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoaXMgYnVmZmVyLiAqLwotICB1aW50OF90ICpidWY7Ci0gIC8qIG9mZnNldCBpcyB0aGUgb2Zmc2V0IGludG8gfGJ1Znwgd2hpY2ggdGhlIGJ1ZmZlciBjb250ZW50cyBzdGFydCBhdC4gKi8KLSAgdWludDE2X3Qgb2Zmc2V0OwotICAvKiBsZW4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGNvbnRlbnRzIGZyb20gfGJ1ZnwgKyB8b2Zmc2V0fC4gKi8KLSAgdWludDE2X3QgbGVuOwotICAvKiBjYXAgaXMgaG93IG11Y2ggbWVtb3J5IGJleW9uZCB8YnVmfCArIHxvZmZzZXR8IGlzIGF2YWlsYWJsZS4gKi8KLSAgdWludDE2X3QgY2FwOworICB1aW50OF90ICpidWY7ICAgICAgIC8qIGF0IGxlYXN0IFNTTDNfUlRfTUFYX1BBQ0tFVF9TSVpFIGJ5dGVzLCBzZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICBzc2wzX3NldHVwX2J1ZmZlcnMoKSAqLworICBzaXplX3QgbGVuOyAgICAgICAgIC8qIGJ1ZmZlciBzaXplICovCisgIGludCBvZmZzZXQ7ICAgICAgICAgLyogd2hlcmUgdG8gJ2NvcHkgZnJvbScgKi8KKyAgaW50IGxlZnQ7ICAgICAgICAgICAvKiBob3cgbWFueSBieXRlcyBsZWZ0ICovCiB9IFNTTDNfQlVGRkVSOwogCiAjZGVmaW5lIFNTTDNfQ1RfUlNBX1NJR04gMQpAQCAtMzQ5LDYgKzM2OSw5IEBACiAgIC8qIGZsYWdzIGZvciBjb3VudGVybWVhc3VyZSBhZ2FpbnN0IGtub3duLUlWIHdlYWtuZXNzICovCiAgIGludCBuZWVkX3JlY29yZF9zcGxpdHRpbmc7CiAKKyAgLyogVGhlIHZhbHVlIG9mICdleHRyYScgd2hlbiB0aGUgYnVmZmVycyB3ZXJlIGluaXRpYWxpemVkICovCisgIGludCBpbml0X2V4dHJhOworCiAgIC8qIGhhdmVfdmVyc2lvbiBpcyB0cnVlIGlmIHRoZSBjb25uZWN0aW9uJ3MgZmluYWwgdmVyc2lvbiBpcyBrbm93bi4gT3RoZXJ3aXNlCiAgICAqIHRoZSB2ZXJzaW9uIGhhcyBub3QgYmVlbiBuZWdvdGlhdGVkIHlldC4gKi8KICAgY2hhciBoYXZlX3ZlcnNpb247CkBAIC0zNTcsMTAgKzM4MCwxMyBAQAogICAgKiBjb21wbGV0ZWQuICovCiAgIGNoYXIgaW5pdGlhbF9oYW5kc2hha2VfY29tcGxldGU7CiAKLSAgLyogcmVhZF9idWZmZXIgaG9sZHMgZGF0YSBmcm9tIHRoZSB0cmFuc3BvcnQgdG8gYmUgcHJvY2Vzc2VkLiAqLwotICBTU0wzX0JVRkZFUiByZWFkX2J1ZmZlcjsKLSAgLyogd3JpdGVfYnVmZmVyIGhvbGRzIGRhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUgdHJhbnNwb3J0LiAqLwotICBTU0wzX0JVRkZFUiB3cml0ZV9idWZmZXI7CisgIC8qIHNuaWZmX2J1ZmZlciBpcyB1c2VkIGJ5IHRoZSBzZXJ2ZXIgaW4gdGhlIGluaXRpYWwgaGFuZHNoYWtlIHRvIHJlYWQgYQorICAgKiBWMkNsaWVudEhlbGxvIGJlZm9yZSB0aGUgcmVjb3JkIGxheWVyIGlzIGluaXRpYWxpemVkLiAqLworICBCVUZfTUVNICpzbmlmZl9idWZmZXI7CisgIHNpemVfdCBzbmlmZl9idWZmZXJfbGVuOworCisgIFNTTDNfQlVGRkVSIHJidWY7IC8qIHJlYWQgSU8gZ29lcyBpbnRvIGhlcmUgKi8KKyAgU1NMM19CVUZGRVIgd2J1ZjsgLyogd3JpdGUgSU8gZ29lcyBpbnRvIGhlcmUgKi8KIAogICBTU0wzX1JFQ09SRCBycmVjOyAvKiBlYWNoIGRlY29kZWQgcmVjb3JkIGdvZXMgaW4gaGVyZSAqLwogCkBAIC0zNzYsMTUgKzQwMiwxMSBAQAogICBpbnQgd3BlbmRfcmV0OyAvKiBudW1iZXIgb2YgYnl0ZXMgc3VibWl0dGVkICovCiAgIGNvbnN0IHVpbnQ4X3QgKndwZW5kX2J1ZjsKIAotICAvKiBoYW5kc2hha2VfYnVmZmVyLCBpZiBub24tTlVMTCwgY29udGFpbnMgdGhlIGhhbmRzaGFrZSB0cmFuc2NyaXB0LiAqLwotICBCVUZfTUVNICpoYW5kc2hha2VfYnVmZmVyOwotICAvKiBoYW5kc2hha2VfaGFzaCwgaWYgaW5pdGlhbGl6ZWQgd2l0aCBhbiB8RVZQX01EfCwgbWFpbnRhaW5zIHRoZSBoYW5kc2hha2UKLSAgICogaGFzaC4gRm9yIFRMUyAxLjEgYW5kIGJlbG93LCBpdCBpcyB0aGUgU0hBLTEgaGFsZi4gKi8KLSAgRVZQX01EX0NUWCBoYW5kc2hha2VfaGFzaDsKLSAgLyogaGFuZHNoYWtlX21kNSwgaWYgaW5pdGlhbGl6ZWQgd2l0aCBhbiB8RVZQX01EfCwgbWFpbnRhaW5zIHRoZSBNRDUgaGFsZiBvZgotICAgKiB0aGUgaGFuZHNoYWtlIGhhc2ggZm9yIFRMUyAxLjEgYW5kIGJlbG93LiAqLwotICBFVlBfTURfQ1RYIGhhbmRzaGFrZV9tZDU7Ci0KKyAgLyogdXNlZCBkdXJpbmcgc3RhcnR1cCwgZGlnZXN0IGFsbCBpbmNvbWluZy9vdXRnb2luZyBwYWNrZXRzICovCisgIEJJTyAqaGFuZHNoYWtlX2J1ZmZlcjsKKyAgLyogV2hlbiBzZXQgb2YgaGFuZHNoYWtlIGRpZ2VzdHMgaXMgZGV0ZXJtaW5lZCwgYnVmZmVyIGlzIGhhc2hlZCBhbmQgZnJlZWQKKyAgICogYW5kIE1EX0NUWC1lcyBmb3IgYWxsIHJlcXVpcmVkIGRpZ2VzdHMgYXJlIHN0b3JlZCBpbiB0aGlzIGFycmF5ICovCisgIEVWUF9NRF9DVFggKipoYW5kc2hha2VfZGdzdDsKICAgLyogdGhpcyBpcyBzZXQgd2hlbmVydmVyIHdlIHNlZSBhIGNoYW5nZV9jaXBoZXJfc3BlYyBtZXNzYWdlIGNvbWUgaW4gd2hlbiB3ZQogICAgKiBhcmUgbm90IGxvb2tpbmcgZm9yIG9uZSAqLwogICBpbnQgY2hhbmdlX2NpcGhlcl9zcGVjOwpAQCAtMzk4LDEzICs0MjAsNiBAQAogCiAgIGludCB0b3RhbF9yZW5lZ290aWF0aW9uczsKIAotICAvKiBlbXB0eV9yZWNvcmRfY291bnQgaXMgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBlbXB0eSByZWNvcmRzIHJlY2VpdmVkLiAqLwotICB1aW50OF90IGVtcHR5X3JlY29yZF9jb3VudDsKLQotICAvKiB3YXJuaW5nX2FsZXJ0X2NvdW50IGlzIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgd2FybmluZyBhbGVydHMKLSAgICogcmVjZWl2ZWQuICovCi0gIHVpbnQ4X3Qgd2FybmluZ19hbGVydF9jb3VudDsKLQogICAvKiBTdGF0ZSBwZXJ0YWluaW5nIHRvIHRoZSBwZW5kaW5nIGhhbmRzaGFrZS4KICAgICoKICAgICogVE9ETyhkYXZpZGJlbik6IFN0YXRlIGlzIGN1cnJlbnQgc3ByZWFkIGFsbCBvdmVyIHRoZSBwbGFjZS4gTW92ZQpAQCAtNDMxLDM0ICs0NDYsNiBAQAogCiAgICAgaW50IHJldXNlX21lc3NhZ2U7CiAKLSAgICB1bmlvbiB7Ci0gICAgICAvKiBzZW50IGlzIGEgYml0c2V0IHdoZXJlIHRoZSBiaXRzIGNvcnJlc3BvbmQgdG8gZWxlbWVudHMgb2Yga0V4dGVuc2lvbnMKLSAgICAgICAqIGluIHQxX2xpYi5jLiBFYWNoIGJpdCBpcyBzZXQgaWYgdGhhdCBleHRlbnNpb24gd2FzIHNlbnQgaW4gYQotICAgICAgICogQ2xpZW50SGVsbG8uIEl0J3Mgbm90IHVzZWQgYnkgc2VydmVycy4gKi8KLSAgICAgIHVpbnQzMl90IHNlbnQ7Ci0gICAgICAvKiByZWNlaXZlZCBpcyBhIGJpdHNldCwgbGlrZSB8c2VudHwsIGJ1dCBpcyB1c2VkIGJ5IHNlcnZlcnMgdG8gcmVjb3JkCi0gICAgICAgKiB3aGljaCBleHRlbnNpb25zIHdlcmUgcmVjZWl2ZWQgZnJvbSBhIGNsaWVudC4gKi8KLSAgICAgIHVpbnQzMl90IHJlY2VpdmVkOwotICAgIH0gZXh0ZW5zaW9uczsKLQotICAgIHVuaW9uIHsKLSAgICAgIC8qIHNlbnQgaXMgYSBiaXRzZXQgd2hlcmUgdGhlIGJpdHMgY29ycmVzcG9uZCB0byBlbGVtZW50cyBvZgotICAgICAgICogfGNsaWVudF9jdXN0b21fZXh0ZW5zaW9uc3wgaW4gdGhlIHxTU0xfQ1RYfC4gRWFjaCBiaXQgaXMgc2V0IGlmIHRoYXQKLSAgICAgICAqIGV4dGVuc2lvbiB3YXMgc2VudCBpbiBhIENsaWVudEhlbGxvLiBJdCdzIG5vdCB1c2VkIGJ5IHNlcnZlcnMuICovCi0gICAgICB1aW50MTZfdCBzZW50OwotICAgICAgLyogcmVjZWl2ZWQgaXMgYSBiaXRzZXQsIGxpa2UgfHNlbnR8LCBidXQgaXMgdXNlZCBieSBzZXJ2ZXJzIHRvIHJlY29yZAotICAgICAgICogd2hpY2ggY3VzdG9tIGV4dGVuc2lvbnMgd2VyZSByZWNlaXZlZCBmcm9tIGEgY2xpZW50LiBUaGUgYml0cyBoZXJlCi0gICAgICAgKiBjb3JyZXNwb25kIHRvIHxzZXJ2ZXJfY3VzdG9tX2V4dGVuc2lvbnN8LiAqLwotICAgICAgdWludDE2X3QgcmVjZWl2ZWQ7Ci0gICAgfSBjdXN0b21fZXh0ZW5zaW9uczsKLQotICAgIC8qIFNOSSBleHRlbnNpb24gKi8KLQotICAgIC8qIHNob3VsZF9hY2tfc25pIGlzIHVzZWQgYnkgYSBzZXJ2ZXIgYW5kIGluZGljYXRlcyB0aGF0IHRoZSBTTkkgZXh0ZW5zaW9uCi0gICAgICogc2hvdWxkIGJlIGVjaG9lZCBpbiB0aGUgU2VydmVySGVsbG8uICovCi0gICAgdW5zaWduZWQgc2hvdWxkX2Fja19zbmk6MTsKLQotCiAgICAgLyogQ2xpZW50LW9ubHk6IGNlcnRfcmVxIGRldGVybWluZXMgaWYgYSBjbGllbnQgY2VydGlmaWNhdGUgaXMgdG8gYmUgc2VudC4KICAgICAgKiBUaGlzIGlzIDAgaWYgbm8gY2xpZW50IENlcnRpZmljYXRlIG1lc3NhZ2UgaXMgdG8gYmUgc2VudCwgMSBpZiB0aGVyZSBpcwogICAgICAqIGEgY2xpZW50IGNlcnRpZmljYXRlLCBhbmQgMiB0byBzZW5kIGFuIGVtcHR5IGNsaWVudCBDZXJ0aWZpY2F0ZQpAQCAtNDg3LDEyICs0NzQsMTMgQEAKICAgICBpbnQgY2VydF9yZXF1ZXN0OwogCiAgICAgLyogY2VydGlmaWNhdGVfc3RhdHVzX2V4cGVjdGVkIGlzIHRydWUgaWYgT0NTUCBzdGFwbGluZyB3YXMgbmVnb3RpYXRlZCBhbmQKLSAgICAgKiB0aGUgc2VydmVyIGlzIGV4cGVjdGVkIHRvIHNlbmQgYSBDZXJ0aWZpY2F0ZVN0YXR1cyBtZXNzYWdlLiAoVGhpcyBpcwotICAgICAqIHVzZWQgb24gYm90aCB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZXMuKSAqLwotICAgIHVuc2lnbmVkIGNlcnRpZmljYXRlX3N0YXR1c19leHBlY3RlZDoxOworICAgICAqIHRoZSBzZXJ2ZXIgaXMgZXhwZWN0ZWQgdG8gc2VuZCBhIENlcnRpZmljYXRlU3RhdHVzIG1lc3NhZ2UuICovCisgICAgY2hhciBjZXJ0aWZpY2F0ZV9zdGF0dXNfZXhwZWN0ZWQ7CiAKLSAgICAvKiBvY3NwX3N0YXBsaW5nX3JlcXVlc3RlZCBpcyB0cnVlIGlmIGEgY2xpZW50IHJlcXVlc3RlZCBPQ1NQIHN0YXBsaW5nLiAqLwotICAgIHVuc2lnbmVkIG9jc3Bfc3RhcGxpbmdfcmVxdWVzdGVkOjE7CisgICAgLyogcGVlcl9lY3BvaW50Zm9ybWF0bGlzdCBjb250YWlucyB0aGUgRUMgcG9pbnQgZm9ybWF0cyBhZHZlcnRpc2VkIGJ5IHRoZQorICAgICAqIHBlZXIuICovCisgICAgdWludDhfdCAqcGVlcl9lY3BvaW50Zm9ybWF0bGlzdDsKKyAgICBzaXplX3QgcGVlcl9lY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGg7CiAKICAgICAvKiBTZXJ2ZXItb25seTogcGVlcl9lbGxpcHRpY2N1cnZlbGlzdCBjb250YWlucyB0aGUgRUMgY3VydmUgSURzIGFkdmVydGlzZWQKICAgICAgKiBieSB0aGUgcGVlci4gVGhpcyBpcyBvbmx5IHNldCBvbiB0aGUgc2VydmVyJ3MgZW5kLiBUaGUgc2VydmVyIGRvZXMgbm90CkBAIC01MTksMTIgKzUwNyw2IEBACiAgICAgLyogQ2xpZW50LW9ubHk6IGluX2ZhbHNlX3N0YXJ0IGlzIG9uZSBpZiB0aGVyZSBpcyBhIHBlbmRpbmcgaGFuZHNoYWtlIGluCiAgICAgICogRmFsc2UgU3RhcnQuIFRoZSBjbGllbnQgbWF5IHdyaXRlIGRhdGEgYXQgdGhpcyBwb2ludC4gKi8KICAgICBjaGFyIGluX2ZhbHNlX3N0YXJ0OwotCi0gICAgLyogcGVlcl9kaF90bXAsIG9uIGEgY2xpZW50LCBpcyB0aGUgc2VydmVyJ3MgREhFIHB1YmxpYyBrZXkuICovCi0gICAgREggKnBlZXJfZGhfdG1wOwotCi0gICAgLyogcGVlcl9lY2RoX3RtcCwgb24gYSBjbGllbnQsIGlzIHRoZSBzZXJ2ZXIncyBFQ0RIRSBwdWJsaWMga2V5LiAqLwotICAgIEVDX0tFWSAqcGVlcl9lY2RoX3RtcDsKICAgfSB0bXA7CiAKICAgLyogQ29ubmVjdGlvbiBiaW5kaW5nIHRvIHByZXZlbnQgcmVuZWdvdGlhdGlvbiBhdHRhY2tzICovCkBAIC01NTEsNiArNTMzLDExIEBACiAgICAqIENoYW5uZWwgSURzIGFuZCB0aGF0IHRsc2V4dF9jaGFubmVsX2lkIHdpbGwgYmUgdmFsaWQgYWZ0ZXIgdGhlCiAgICAqIGhhbmRzaGFrZS4gKi8KICAgY2hhciB0bHNleHRfY2hhbm5lbF9pZF92YWxpZDsKKyAgLyogdGxzZXh0X2NoYW5uZWxfaWRfbmV3IG1lYW5zIHRoYXQgdGhlIHVwZGF0ZWQgQ2hhbm5lbCBJRCBleHRlbnNpb24gd2FzCisgICAqIG5lZ290aWF0ZWQuIFRoaXMgaXMgYSB0ZW1wb3JhcnkgaGFjayBpbiB0aGUgY29kZSB0byBzdXBwb3J0IGJvdGggZm9ybXMgb2YKKyAgICogQ2hhbm5lbCBJRCBleHRlbnNpb24gd2hpbGUgd2UgdHJhbnNpdGlvbiB0byB0aGUgbmV3IGZvcm1hdCwgd2hpY2ggZml4ZWQgYQorICAgKiBzZWN1cml0eSBpc3N1ZS4gKi8KKyAgY2hhciB0bHNleHRfY2hhbm5lbF9pZF9uZXc7CiAgIC8qIEZvciBhIHNlcnZlcjoKICAgICogICAgIElmIHx0bHNleHRfY2hhbm5lbF9pZF92YWxpZHwgaXMgdHJ1ZSwgdGhlbiB0aGlzIGNvbnRhaW5zIHRoZQogICAgKiAgICAgdmVyaWZpZWQgQ2hhbm5lbCBJRCBmcm9tIHRoZSBjbGllbnQ6IGEgUDI1NiBwb2ludCwgKHgseSksIHdoZXJlCkBAIC01NjMsNyArNTUwLDYgQEAKIC8qIGV4dHJhIHN0YXRlICovCiAjZGVmaW5lIFNTTDNfU1RfQ1dfRkxVU0ggKDB4MTAwIHwgU1NMX1NUX0NPTk5FQ1QpCiAjZGVmaW5lIFNTTDNfU1RfRkFMU0VfU1RBUlQgKDB4MTAxIHwgU1NMX1NUX0NPTk5FQ1QpCi0jZGVmaW5lIFNTTDNfU1RfVkVSSUZZX1NFUlZFUl9DRVJUICgweDEwMiB8IFNTTF9TVF9DT05ORUNUKQogLyogd3JpdGUgdG8gc2VydmVyICovCiAjZGVmaW5lIFNTTDNfU1RfQ1dfQ0xOVF9IRUxMT19BICgweDExMCB8IFNTTF9TVF9DT05ORUNUKQogI2RlZmluZSBTU0wzX1NUX0NXX0NMTlRfSEVMTE9fQiAoMHgxMTEgfCBTU0xfU1RfQ09OTkVDVCkKQEAgLTU4OSw3ICs1NzUsNiBAQAogI2RlZmluZSBTU0wzX1NUX0NXX0tFWV9FWENIX0IgKDB4MTgxIHwgU1NMX1NUX0NPTk5FQ1QpCiAjZGVmaW5lIFNTTDNfU1RfQ1dfQ0VSVF9WUkZZX0EgKDB4MTkwIHwgU1NMX1NUX0NPTk5FQ1QpCiAjZGVmaW5lIFNTTDNfU1RfQ1dfQ0VSVF9WUkZZX0IgKDB4MTkxIHwgU1NMX1NUX0NPTk5FQ1QpCi0jZGVmaW5lIFNTTDNfU1RfQ1dfQ0VSVF9WUkZZX0MgKDB4MTkyIHwgU1NMX1NUX0NPTk5FQ1QpCiAjZGVmaW5lIFNTTDNfU1RfQ1dfQ0hBTkdFX0EgKDB4MUEwIHwgU1NMX1NUX0NPTk5FQ1QpCiAjZGVmaW5lIFNTTDNfU1RfQ1dfQ0hBTkdFX0IgKDB4MUExIHwgU1NMX1NUX0NPTk5FQ1QpCiAjZGVmaW5lIFNTTDNfU1RfQ1dfTkVYVF9QUk9UT19BICgweDIwMCB8IFNTTF9TVF9DT05ORUNUKQpAQCAtNjI4LDcgKzYxMyw2IEBACiAjZGVmaW5lIFNTTDNfU1RfU1dfQ0VSVF9CICgweDE0MSB8IFNTTF9TVF9BQ0NFUFQpCiAjZGVmaW5lIFNTTDNfU1RfU1dfS0VZX0VYQ0hfQSAoMHgxNTAgfCBTU0xfU1RfQUNDRVBUKQogI2RlZmluZSBTU0wzX1NUX1NXX0tFWV9FWENIX0IgKDB4MTUxIHwgU1NMX1NUX0FDQ0VQVCkKLSNkZWZpbmUgU1NMM19TVF9TV19LRVlfRVhDSF9DICgweDE1MiB8IFNTTF9TVF9BQ0NFUFQpCiAjZGVmaW5lIFNTTDNfU1RfU1dfQ0VSVF9SRVFfQSAoMHgxNjAgfCBTU0xfU1RfQUNDRVBUKQogI2RlZmluZSBTU0wzX1NUX1NXX0NFUlRfUkVRX0IgKDB4MTYxIHwgU1NMX1NUX0FDQ0VQVCkKICNkZWZpbmUgU1NMM19TVF9TV19TUlZSX0RPTkVfQSAoMHgxNzAgfCBTU0xfU1RfQUNDRVBUKQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oCmluZGV4IGI2MDBiNDMuLjM1MGZhMTQgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wZW5zc2wvc3RhY2suaAorKysgYi9zcmMvaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmgKQEAgLTExMSw2ICsxMTEsMTEgQEAKIAogI2RlZmluZSBTVEFDS19PRih0eXBlKSBzdHJ1Y3Qgc3RhY2tfc3RfIyN0eXBlCiAKKyNkZWZpbmUgREVGSU5FX1NUQUNLX09GKHR5cGUpIFwKK1NUQUNLX09GKHR5cGUpIHtcCisgIF9TVEFDSyBzdGFjazsgXAorfQorCiAjZGVmaW5lIERFQ0xBUkVfU1RBQ0tfT0YodHlwZSkgU1RBQ0tfT0YodHlwZSk7CiAKIC8qIFRoZSBtYWtlX21hY3Jvcy5zaCBzY3JpcHQgaW4gdGhpcyBkaXJlY3RvcnkgcGFyc2VzIHRoZSBmb2xsb3dpbmcgbGluZXMgYW5kCkBAIC0xMzUsMTQgKzE0MCwxMiBAQAogICogU1RBQ0tfT0Y6R0VORVJBTF9OQU1FUwogICogU1RBQ0tfT0Y6R0VORVJBTF9TVUJUUkVFCiAgKiBTVEFDS19PRjpNSU1FX0hFQURFUgotICogU1RBQ0tfT0Y6UEtDUzdfUkVDSVBfSU5GTwogICogU1RBQ0tfT0Y6UEtDUzdfU0lHTkVSX0lORk8KKyAqIFNUQUNLX09GOlBLQ1M3X1JFQ0lQX0lORk8KICAqIFNUQUNLX09GOlBPTElDWUlORk8KICAqIFNUQUNLX09GOlBPTElDWVFVQUxJTkZPCiAgKiBTVEFDS19PRjpQT0xJQ1lfTUFQUElORwotICogU1RBQ0tfT0Y6UlNBX2FkZGl0aW9uYWxfcHJpbWUKICAqIFNUQUNLX09GOlNTTF9DT01QCi0gKiBTVEFDS19PRjpTU0xfQ1VTVE9NX0VYVEVOU0lPTgogICogU1RBQ0tfT0Y6U1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZCiAgKiBTVEFDS19PRjpTWE5FVElECiAgKiBTVEFDS19PRjpYNTA5CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcGVuc3NsL3N0YWNrX21hY3Jvcy5oIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC9zdGFja19tYWNyb3MuaAppbmRleCAwODA5N2FmLi5kYWRjZjZiIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9vcGVuc3NsL3N0YWNrX21hY3Jvcy5oCisrKyBiL3NyYy9pbmNsdWRlL29wZW5zc2wvc3RhY2tfbWFjcm9zLmgKQEAgLTE1MTEsOTMgKzE1MTEsNiBAQAogICAgICAgICAgICAgICAgICAgIGNvcHlfZnVuYyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoTUlNRV9IRUFERVIgKiksIGZyZWVfZnVuYykpKQogCi0vKiBQS0NTN19SRUNJUF9JTkZPICovCi0jZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fbmV3KGNvbXApICAgICAgICAgICAgICAgICBcCi0gICgoU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKilza19uZXcoQ0hFQ0tFRF9DQVNUKCBcCi0gICAgICBzdGFja19jbXBfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpbnQgKCopKGNvbnN0IFBLQ1M3X1JFQ0lQX0lORk8gKiphLCBjb25zdCBQS0NTN19SRUNJUF9JTkZPICoqYiksIGNvbXApKSkKLQotI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX25ld19udWxsKCkgXAotICAoKFNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICopc2tfbmV3X251bGwoKSkKLQotI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX251bShzaykgXAotICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzaykpCi0KLSNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT196ZXJvKHNrKSBcCi0gIHNrX3plcm8oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzaykpOwotCi0jZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fdmFsdWUoc2ssIGkpIFwKLSAgKChQS0NTN19SRUNJUF9JTkZPICopc2tfdmFsdWUoICAgICAgICAgXAotICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzayksIChpKSkpCi0KLSNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKChQS0NTN19SRUNJUF9JTkZPICopc2tfc2V0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKiwgc2spLCAoaSksIFwKLSAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFBLQ1M3X1JFQ0lQX0lORk8gKiwgcCkpKQotCi0jZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fZnJlZShzaykgXAotICBza19mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKiwgc2spKQotCi0jZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYykgICAgICAgICAgICAgXAotICBza19wb3BfZnJlZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKiwgc2spLCBcCi0gICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoUEtDUzdfUkVDSVBfSU5GTyAqKSwgZnJlZV9mdW5jKSkKLQotI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX2luc2VydChzaywgcCwgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc2tfaW5zZXJ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKiwgc2spLCBcCi0gICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBQS0NTN19SRUNJUF9JTkZPICosIHApLCAod2hlcmUpKQotCi0jZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fZGVsZXRlKHNrLCB3aGVyZSkgXAotICAoKFBLQ1M3X1JFQ0lQX0lORk8gKilza19kZWxldGUoICAgICAgICAgICAgIFwKLSAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKiwgc2spLCAod2hlcmUpKSkKLQotI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX2RlbGV0ZV9wdHIoc2ssIHApICAgICAgICAgICAgICAgICAgIFwKLSAgKChQS0NTN19SRUNJUF9JTkZPICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICosIHNrKSwgXAotICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgUEtDUzdfUkVDSVBfSU5GTyAqLCBwKSkpCi0KLSNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgXAotICBza19maW5kKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKiwgc2spLCBcCi0gICAgICAgICAgKG91dF9pbmRleCksIENIRUNLRURfQ0FTVCh2b2lkICosIFBLQ1M3X1JFQ0lQX0lORk8gKiwgcCkpCi0KLSNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19zaGlmdChzaykgXAotICAoKFBLQ1M3X1JFQ0lQX0lORk8gKilza19zaGlmdCggICAgICBcCi0gICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICosIHNrKSkpCi0KLSNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19wdXNoKHNrLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBza19wdXNoKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKiwgc2spLCBcCi0gICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgUEtDUzdfUkVDSVBfSU5GTyAqLCBwKSkKLQotI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX3BvcChzaykgXAotICAoKFBLQ1M3X1JFQ0lQX0lORk8gKilza19wb3AoICAgICAgXAotICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzaykpKQotCi0jZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fZHVwKHNrKSAgICAgIFwKLSAgKChTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqKXNrX2R1cCggXAotICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzaykpKQotCi0jZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fc29ydChzaykgXAotICBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKiwgc2spKQotCi0jZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9faXNfc29ydGVkKHNrKSBcCi0gIHNrX2lzX3NvcnRlZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICosIHNrKSkKLQotI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX3NldF9jbXBfZnVuYyhzaywgY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICgoaW50ICgqKShjb25zdCBQS0NTN19SRUNJUF9JTkZPICoqYSwgY29uc3QgUEtDUzdfUkVDSVBfSU5GTyAqKmIpKSAgICAgICAgIFwKLSAgICAgICBza19zZXRfY21wX2Z1bmMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICosIHNrKSwgICAgICAgICBcCi0gICAgICAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgaW50ICgqKShjb25zdCBQS0NTN19SRUNJUF9JTkZPICoqYSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBLQ1M3X1JFQ0lQX0lORk8gKipiKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcCkpKQotCi0jZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fZGVlcF9jb3B5KHNrLCBjb3B5X2Z1bmMsIGZyZWVfZnVuYykgICAgICAgICAgICAgXAotICAoKFNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICopc2tfZGVlcF9jb3B5KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIENIRUNLRURfQ0FTVChjb25zdCBfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKiwgc2spLCBcCi0gICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqKCopKHZvaWQgKiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgIFBLQ1M3X1JFQ0lQX0lORk8gKigqKShQS0NTN19SRUNJUF9JTkZPICopLCBjb3B5X2Z1bmMpLCAgIFwKLSAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShQS0NTN19SRUNJUF9JTkZPICopLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgZnJlZV9mdW5jKSkpCi0KIC8qIFBLQ1M3X1NJR05FUl9JTkZPICovCiAjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX25ldyhjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAoKFNUQUNLX09GKFBLQ1M3X1NJR05FUl9JTkZPKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoICAgICAgICAgICAgICAgICAgIFwKQEAgLTE2ODYsNiArMTU5OSw5MyBAQAogICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKFBLQ1M3X1NJR05FUl9JTkZPICopLCAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZnJlZV9mdW5jKSkpCiAKKy8qIFBLQ1M3X1JFQ0lQX0lORk8gKi8KKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19uZXcoY29tcCkgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCAoKikoY29uc3QgUEtDUzdfUkVDSVBfSU5GTyAqKmEsIGNvbnN0IFBLQ1M3X1JFQ0lQX0lORk8gKipiKSwgY29tcCkpKQorCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fbmV3X251bGwoKSBcCisgICgoU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKilza19uZXdfbnVsbCgpKQorCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fbnVtKHNrKSBcCisgIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICosIHNrKSkKKworI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX3plcm8oc2spIFwKKyAgc2tfemVybyhDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICosIHNrKSk7CisKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT192YWx1ZShzaywgaSkgXAorICAoKFBLQ1M3X1JFQ0lQX0lORk8gKilza192YWx1ZSggICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICosIHNrKSwgKGkpKSkKKworI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX3NldChzaywgaSwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFBLQ1M3X1JFQ0lQX0lORk8gKilza19zZXQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzayksIChpKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgUEtDUzdfUkVDSVBfSU5GTyAqLCBwKSkpCisKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19wb3BfZnJlZShzaywgZnJlZV9mdW5jKSAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShQS0NTN19SRUNJUF9JTkZPICopLCBmcmVlX2Z1bmMpKQorCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9faW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzayksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFBLQ1M3X1JFQ0lQX0lORk8gKiwgcCksICh3aGVyZSkpCisKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19kZWxldGUoc2ssIHdoZXJlKSBcCisgICgoUEtDUzdfUkVDSVBfSU5GTyAqKXNrX2RlbGV0ZSggICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzayksICh3aGVyZSkpKQorCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKFBLQ1M3X1JFQ0lQX0lORk8gKilza19kZWxldGVfcHRyKCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBQS0NTN19SRUNJUF9JTkZPICosIHApKSkKKworI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX2ZpbmQoc2ssIG91dF9pbmRleCwgcCkgICAgICAgICAgICAgICAgICBcCisgIHNrX2ZpbmQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzayksIFwKKyAgICAgICAgICAob3V0X2luZGV4KSwgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgUEtDUzdfUkVDSVBfSU5GTyAqLCBwKSkKKworI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX3NoaWZ0KHNrKSBcCisgICgoUEtDUzdfUkVDSVBfSU5GTyAqKXNrX3NoaWZ0KCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKiwgc2spKSkKKworI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX3B1c2goc2ssIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3B1c2goQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBQS0NTN19SRUNJUF9JTkZPICosIHApKQorCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fcG9wKHNrKSBcCisgICgoUEtDUzdfUkVDSVBfSU5GTyAqKXNrX3BvcCggICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICosIHNrKSkpCisKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19kdXAoc2spICAgICAgXAorICAoKFNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICosIHNrKSkpCisKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19zb3J0KHNrKSBcCisgIHNrX3NvcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKiwgc2spKQorCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChpbnQgKCopKGNvbnN0IFBLQ1M3X1JFQ0lQX0lORk8gKiphLCBjb25zdCBQS0NTN19SRUNJUF9JTkZPICoqYikpICAgICAgICAgXAorICAgICAgIHNrX3NldF9jbXBfZnVuYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKiwgc2spLCAgICAgICAgIFwKKyAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IFBLQ1M3X1JFQ0lQX0lORk8gKiphLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUEtDUzdfUkVDSVBfSU5GTyAqKmIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19kZWVwX2NvcHkoc2ssIGNvcHlfZnVuYywgZnJlZV9mdW5jKSAgICAgICAgICAgICBcCisgICgoU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKilza19kZWVwX2NvcHkoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKGNvbnN0IF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICooKikodm9pZCAqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgUEtDUzdfUkVDSVBfSU5GTyAqKCopKFBLQ1M3X1JFQ0lQX0lORk8gKiksIGNvcHlfZnVuYyksICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKFBLQ1M3X1JFQ0lQX0lORk8gKiksICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBmcmVlX2Z1bmMpKSkKKwogLyogUE9MSUNZSU5GTyAqLwogI2RlZmluZSBza19QT0xJQ1lJTkZPX25ldyhjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAoKFNUQUNLX09GKFBPTElDWUlORk8pICopc2tfbmV3KENIRUNLRURfQ0FTVCggICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTkzNyw5OSArMTkzNyw2IEBACiAgICAgICAgICAgICAgICAgICAgY29weV9mdW5jKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShQT0xJQ1lfTUFQUElORyAqKSwgZnJlZV9mdW5jKSkpCiAKLS8qIFJTQV9hZGRpdGlvbmFsX3ByaW1lICovCi0jZGVmaW5lIHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX25ldyhjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKFNUQUNLX09GKFJTQV9hZGRpdGlvbmFsX3ByaW1lKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpbnQgKCopKGNvbnN0IFJTQV9hZGRpdGlvbmFsX3ByaW1lICoqYSwgY29uc3QgUlNBX2FkZGl0aW9uYWxfcHJpbWUgKipiKSwgXAotICAgICAgY29tcCkpKQotCi0jZGVmaW5lIHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX25ld19udWxsKCkgXAotICAoKFNUQUNLX09GKFJTQV9hZGRpdGlvbmFsX3ByaW1lKSAqKXNrX25ld19udWxsKCkpCi0KLSNkZWZpbmUgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfbnVtKHNrKSBcCi0gIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFJTQV9hZGRpdGlvbmFsX3ByaW1lKSAqLCBzaykpCi0KLSNkZWZpbmUgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfemVybyhzaykgXAotICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUlNBX2FkZGl0aW9uYWxfcHJpbWUpICosIHNrKSk7Ci0KLSNkZWZpbmUgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfdmFsdWUoc2ssIGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKFJTQV9hZGRpdGlvbmFsX3ByaW1lICopc2tfdmFsdWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFJTQV9hZGRpdGlvbmFsX3ByaW1lKSAqLCBzayksIFwKLSAgICAgIChpKSkpCi0KLSNkZWZpbmUgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICgoUlNBX2FkZGl0aW9uYWxfcHJpbWUgKilza19zZXQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihSU0FfYWRkaXRpb25hbF9wcmltZSkgKiwgc2spLCAoaSksIFwKLSAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFJTQV9hZGRpdGlvbmFsX3ByaW1lICosIHApKSkKLQotI2RlZmluZSBza19SU0FfYWRkaXRpb25hbF9wcmltZV9mcmVlKHNrKSBcCi0gIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihSU0FfYWRkaXRpb25hbF9wcmltZSkgKiwgc2spKQotCi0jZGVmaW5lIHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgICAgICAgICAgICAgXAotICBza19wb3BfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFJTQV9hZGRpdGlvbmFsX3ByaW1lKSAqLCBzayksICAgIFwKLSAgICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKFJTQV9hZGRpdGlvbmFsX3ByaW1lICopLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2Z1bmMpKQotCi0jZGVmaW5lIHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX2luc2VydChzaywgcCwgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc2tfaW5zZXJ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUlNBX2FkZGl0aW9uYWxfcHJpbWUpICosIHNrKSwgXAotICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgUlNBX2FkZGl0aW9uYWxfcHJpbWUgKiwgcCksICh3aGVyZSkpCi0KLSNkZWZpbmUgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfZGVsZXRlKHNrLCB3aGVyZSkgXAotICAoKFJTQV9hZGRpdGlvbmFsX3ByaW1lICopc2tfZGVsZXRlKCAgICAgICAgICAgICBcCi0gICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFJTQV9hZGRpdGlvbmFsX3ByaW1lKSAqLCBzayksICh3aGVyZSkpKQotCi0jZGVmaW5lIHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX2RlbGV0ZV9wdHIoc2ssIHApICAgICAgICAgICAgICAgICAgIFwKLSAgKChSU0FfYWRkaXRpb25hbF9wcmltZSAqKXNrX2RlbGV0ZV9wdHIoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihSU0FfYWRkaXRpb25hbF9wcmltZSkgKiwgc2spLCBcCi0gICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBSU0FfYWRkaXRpb25hbF9wcmltZSAqLCBwKSkpCi0KLSNkZWZpbmUgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfZmluZChzaywgb3V0X2luZGV4LCBwKSAgICAgICAgICAgICAgICAgIFwKLSAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFJTQV9hZGRpdGlvbmFsX3ByaW1lKSAqLCBzayksIFwKLSAgICAgICAgICAob3V0X2luZGV4KSwgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgUlNBX2FkZGl0aW9uYWxfcHJpbWUgKiwgcCkpCi0KLSNkZWZpbmUgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfc2hpZnQoc2spIFwKLSAgKChSU0FfYWRkaXRpb25hbF9wcmltZSAqKXNrX3NoaWZ0KCAgICAgIFwKLSAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUlNBX2FkZGl0aW9uYWxfcHJpbWUpICosIHNrKSkpCi0KLSNkZWZpbmUgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFJTQV9hZGRpdGlvbmFsX3ByaW1lKSAqLCBzayksIFwKLSAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBSU0FfYWRkaXRpb25hbF9wcmltZSAqLCBwKSkKLQotI2RlZmluZSBza19SU0FfYWRkaXRpb25hbF9wcmltZV9wb3Aoc2spIFwKLSAgKChSU0FfYWRkaXRpb25hbF9wcmltZSAqKXNrX3BvcCggICAgICBcCi0gICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFJTQV9hZGRpdGlvbmFsX3ByaW1lKSAqLCBzaykpKQotCi0jZGVmaW5lIHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX2R1cChzaykgICAgICBcCi0gICgoU1RBQ0tfT0YoUlNBX2FkZGl0aW9uYWxfcHJpbWUpICopc2tfZHVwKCBcCi0gICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFJTQV9hZGRpdGlvbmFsX3ByaW1lKSAqLCBzaykpKQotCi0jZGVmaW5lIHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX3NvcnQoc2spIFwKLSAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFJTQV9hZGRpdGlvbmFsX3ByaW1lKSAqLCBzaykpCi0KLSNkZWZpbmUgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfaXNfc29ydGVkKHNrKSBcCi0gIHNrX2lzX3NvcnRlZCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihSU0FfYWRkaXRpb25hbF9wcmltZSkgKiwgc2spKQotCi0jZGVmaW5lIHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX3NldF9jbXBfZnVuYyhzaywgY29tcCkgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKChpbnQgKCopKGNvbnN0IFJTQV9hZGRpdGlvbmFsX3ByaW1lICoqYSwgY29uc3QgUlNBX2FkZGl0aW9uYWxfcHJpbWUgKipiKSkgXAotICAgICAgIHNrX3NldF9jbXBfZnVuYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUlNBX2FkZGl0aW9uYWxfcHJpbWUpICosIHNrKSwgICAgIFwKLSAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqKShjb25zdCBSU0FfYWRkaXRpb25hbF9wcmltZSAqKmEsICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJTQV9hZGRpdGlvbmFsX3ByaW1lICoqYiksICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXApKSkKLQotI2RlZmluZSBza19SU0FfYWRkaXRpb25hbF9wcmltZV9kZWVwX2NvcHkoc2ssIGNvcHlfZnVuYywgZnJlZV9mdW5jKSAgICAgICAgXAotICAoKFNUQUNLX09GKFJTQV9hZGRpdGlvbmFsX3ByaW1lKSAqKXNrX2RlZXBfY29weSggICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQ0hFQ0tFRF9DQVNUKGNvbnN0IF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihSU0FfYWRkaXRpb25hbF9wcmltZSkgKiwgXAotICAgICAgICAgICAgICAgICAgIHNrKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKigqKSh2b2lkICopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgIFJTQV9hZGRpdGlvbmFsX3ByaW1lICooKikoUlNBX2FkZGl0aW9uYWxfcHJpbWUgKiksICAgICAgXAotICAgICAgICAgICAgICAgICAgIGNvcHlfZnVuYyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKFJTQV9hZGRpdGlvbmFsX3ByaW1lICopLCAgICAgXAotICAgICAgICAgICAgICAgICAgIGZyZWVfZnVuYykpKQotCiAvKiBTU0xfQ09NUCAqLwogI2RlZmluZSBza19TU0xfQ09NUF9uZXcoY29tcCkgICAgICAgICAgICAgICAgIFwKICAgKChTVEFDS19PRihTU0xfQ09NUCkgKilza19uZXcoQ0hFQ0tFRF9DQVNUKCBcCkBAIC0yMTA2LDk5ICsyMDEzLDYgQEAKICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICooKikodm9pZCAqKSwgU1NMX0NPTVAgKigqKShTU0xfQ09NUCAqKSwgY29weV9mdW5jKSwgXAogICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKFNTTF9DT01QICopLCBmcmVlX2Z1bmMpKSkKIAotLyogU1NMX0NVU1RPTV9FWFRFTlNJT04gKi8KLSNkZWZpbmUgc2tfU1NMX0NVU1RPTV9FWFRFTlNJT05fbmV3KGNvbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICgoU1RBQ0tfT0YoU1NMX0NVU1RPTV9FWFRFTlNJT04pICopc2tfbmV3KENIRUNLRURfQ0FTVCggICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgc3RhY2tfY21wX2Z1bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGludCAoKikoY29uc3QgU1NMX0NVU1RPTV9FWFRFTlNJT04gKiphLCBjb25zdCBTU0xfQ1VTVE9NX0VYVEVOU0lPTiAqKmIpLCBcCi0gICAgICBjb21wKSkpCi0KLSNkZWZpbmUgc2tfU1NMX0NVU1RPTV9FWFRFTlNJT05fbmV3X251bGwoKSBcCi0gICgoU1RBQ0tfT0YoU1NMX0NVU1RPTV9FWFRFTlNJT04pICopc2tfbmV3X251bGwoKSkKLQotI2RlZmluZSBza19TU0xfQ1VTVE9NX0VYVEVOU0lPTl9udW0oc2spIFwKLSAgc2tfbnVtKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1NMX0NVU1RPTV9FWFRFTlNJT04pICosIHNrKSkKLQotI2RlZmluZSBza19TU0xfQ1VTVE9NX0VYVEVOU0lPTl96ZXJvKHNrKSBcCi0gIHNrX3plcm8oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTU0xfQ1VTVE9NX0VYVEVOU0lPTikgKiwgc2spKTsKLQotI2RlZmluZSBza19TU0xfQ1VTVE9NX0VYVEVOU0lPTl92YWx1ZShzaywgaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICgoU1NMX0NVU1RPTV9FWFRFTlNJT04gKilza192YWx1ZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoU1NMX0NVU1RPTV9FWFRFTlNJT04pICosIHNrKSwgXAotICAgICAgKGkpKSkKLQotI2RlZmluZSBza19TU0xfQ1VTVE9NX0VYVEVOU0lPTl9zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKChTU0xfQ1VTVE9NX0VYVEVOU0lPTiAqKXNrX3NldCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNTTF9DVVNUT01fRVhURU5TSU9OKSAqLCBzayksIChpKSwgXAotICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgU1NMX0NVU1RPTV9FWFRFTlNJT04gKiwgcCkpKQotCi0jZGVmaW5lIHNrX1NTTF9DVVNUT01fRVhURU5TSU9OX2ZyZWUoc2spIFwKLSAgc2tfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNTTF9DVVNUT01fRVhURU5TSU9OKSAqLCBzaykpCi0KLSNkZWZpbmUgc2tfU1NMX0NVU1RPTV9FWFRFTlNJT05fcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYykgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHNrX3BvcF9mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1NMX0NVU1RPTV9FWFRFTlNJT04pICosIHNrKSwgICAgXAotICAgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoU1NMX0NVU1RPTV9FWFRFTlNJT04gKiksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfZnVuYykpCi0KLSNkZWZpbmUgc2tfU1NMX0NVU1RPTV9FWFRFTlNJT05faW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAotICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTU0xfQ1VTVE9NX0VYVEVOU0lPTikgKiwgc2spLCBcCi0gICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBTU0xfQ1VTVE9NX0VYVEVOU0lPTiAqLCBwKSwgKHdoZXJlKSkKLQotI2RlZmluZSBza19TU0xfQ1VTVE9NX0VYVEVOU0lPTl9kZWxldGUoc2ssIHdoZXJlKSBcCi0gICgoU1NMX0NVU1RPTV9FWFRFTlNJT04gKilza19kZWxldGUoICAgICAgICAgICAgIFwKLSAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1NMX0NVU1RPTV9FWFRFTlNJT04pICosIHNrKSwgKHdoZXJlKSkpCi0KLSNkZWZpbmUgc2tfU1NMX0NVU1RPTV9FWFRFTlNJT05fZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAotICAoKFNTTF9DVVNUT01fRVhURU5TSU9OICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNTTF9DVVNUT01fRVhURU5TSU9OKSAqLCBzayksIFwKLSAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFNTTF9DVVNUT01fRVhURU5TSU9OICosIHApKSkKLQotI2RlZmluZSBza19TU0xfQ1VTVE9NX0VYVEVOU0lPTl9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgXAotICBza19maW5kKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1NMX0NVU1RPTV9FWFRFTlNJT04pICosIHNrKSwgXAotICAgICAgICAgIChvdXRfaW5kZXgpLCBDSEVDS0VEX0NBU1Qodm9pZCAqLCBTU0xfQ1VTVE9NX0VYVEVOU0lPTiAqLCBwKSkKLQotI2RlZmluZSBza19TU0xfQ1VTVE9NX0VYVEVOU0lPTl9zaGlmdChzaykgXAotICAoKFNTTF9DVVNUT01fRVhURU5TSU9OICopc2tfc2hpZnQoICAgICAgXAotICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTU0xfQ1VTVE9NX0VYVEVOU0lPTikgKiwgc2spKSkKLQotI2RlZmluZSBza19TU0xfQ1VTVE9NX0VYVEVOU0lPTl9wdXNoKHNrLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBza19wdXNoKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1NMX0NVU1RPTV9FWFRFTlNJT04pICosIHNrKSwgXAotICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFNTTF9DVVNUT01fRVhURU5TSU9OICosIHApKQotCi0jZGVmaW5lIHNrX1NTTF9DVVNUT01fRVhURU5TSU9OX3BvcChzaykgXAotICAoKFNTTF9DVVNUT01fRVhURU5TSU9OICopc2tfcG9wKCAgICAgIFwKLSAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1NMX0NVU1RPTV9FWFRFTlNJT04pICosIHNrKSkpCi0KLSNkZWZpbmUgc2tfU1NMX0NVU1RPTV9FWFRFTlNJT05fZHVwKHNrKSAgICAgIFwKLSAgKChTVEFDS19PRihTU0xfQ1VTVE9NX0VYVEVOU0lPTikgKilza19kdXAoIFwKLSAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoU1NMX0NVU1RPTV9FWFRFTlNJT04pICosIHNrKSkpCi0KLSNkZWZpbmUgc2tfU1NMX0NVU1RPTV9FWFRFTlNJT05fc29ydChzaykgXAotICBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1NMX0NVU1RPTV9FWFRFTlNJT04pICosIHNrKSkKLQotI2RlZmluZSBza19TU0xfQ1VTVE9NX0VYVEVOU0lPTl9pc19zb3J0ZWQoc2spIFwKLSAgc2tfaXNfc29ydGVkKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFNTTF9DVVNUT01fRVhURU5TSU9OKSAqLCBzaykpCi0KLSNkZWZpbmUgc2tfU1NMX0NVU1RPTV9FWFRFTlNJT05fc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKGludCAoKikoY29uc3QgU1NMX0NVU1RPTV9FWFRFTlNJT04gKiphLCBjb25zdCBTU0xfQ1VTVE9NX0VYVEVOU0lPTiAqKmIpKSBcCi0gICAgICAgc2tfc2V0X2NtcF9mdW5jKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTU0xfQ1VTVE9NX0VYVEVOU0lPTikgKiwgc2spLCAgICAgXAotICAgICAgICAgICBDSEVDS0VEX0NBU1Qoc3RhY2tfY21wX2Z1bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCopKGNvbnN0IFNTTF9DVVNUT01fRVhURU5TSU9OICoqYSwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1NMX0NVU1RPTV9FWFRFTlNJT04gKipiKSwgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcCkpKQotCi0jZGVmaW5lIHNrX1NTTF9DVVNUT01fRVhURU5TSU9OX2RlZXBfY29weShzaywgY29weV9mdW5jLCBmcmVlX2Z1bmMpICAgICAgICBcCi0gICgoU1RBQ0tfT0YoU1NMX0NVU1RPTV9FWFRFTlNJT04pICopc2tfZGVlcF9jb3B5KCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBDSEVDS0VEX0NBU1QoY29uc3QgX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFNTTF9DVVNUT01fRVhURU5TSU9OKSAqLCBcCi0gICAgICAgICAgICAgICAgICAgc2spLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqKCopKHZvaWQgKiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgU1NMX0NVU1RPTV9FWFRFTlNJT04gKigqKShTU0xfQ1VTVE9NX0VYVEVOU0lPTiAqKSwgICAgICBcCi0gICAgICAgICAgICAgICAgICAgY29weV9mdW5jKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoU1NMX0NVU1RPTV9FWFRFTlNJT04gKiksICAgICBcCi0gICAgICAgICAgICAgICAgICAgZnJlZV9mdW5jKSkpCi0KIC8qIFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSAqLwogI2RlZmluZSBza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfbmV3KGNvbXApICAgICAgICAgICAgICAgICAgICAgIFwKICAgKChTVEFDS19PRihTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkpICopc2tfbmV3KENIRUNLRURfQ0FTVCggICAgICBcCkBAIC0zNzc3LDI1ICszNTkxLDI1IEBACiAKICNkZWZpbmUgc2tfdm9pZF9uZXdfbnVsbCgpICgoU1RBQ0tfT0Yodm9pZCkqKXNrX25ld19udWxsKCkpCiAKLSNkZWZpbmUgc2tfdm9pZF9udW0oc2spIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKHZvaWQpICosIHNrKSkKKyNkZWZpbmUgc2tfdm9pZF9udW0oc2spIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKHZvaWQpKiwgc2spKQogCi0jZGVmaW5lIHNrX3ZvaWRfemVybyhzaykgc2tfemVybyhDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKHZvaWQpICosIHNrKSk7CisjZGVmaW5lIHNrX3ZvaWRfemVybyhzaykgc2tfemVybyhDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKHZvaWQpKiwgc2spKTsKIAogI2RlZmluZSBza192b2lkX3ZhbHVlKHNrLCBpKSBcCi0gICgodm9pZCAqKXNrX3ZhbHVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0Yodm9pZCkgKiwgc2spLCAoaSkpKQorICAoKHZvaWQgKilza192YWx1ZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKHZvaWQpKiwgc2spLCAoaSkpKQogCiAjZGVmaW5lIHNrX3ZvaWRfc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgKCh2b2lkICopc2tfc2V0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0Yodm9pZCkqLCBzayksIChpKSwgXAogICAgICAgICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgdm9pZCAqLCBwKSkpCiAKLSNkZWZpbmUgc2tfdm9pZF9mcmVlKHNrKSBza19mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0Yodm9pZCkgKiwgc2spKQorI2RlZmluZSBza192b2lkX2ZyZWUoc2spIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRih2b2lkKSosIHNrKSkKIAotI2RlZmluZSBza192b2lkX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgICAgICAgICAgXAotICBza19wb3BfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKHZvaWQpICosIHNrKSwgXAorI2RlZmluZSBza192b2lkX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0Yodm9pZCkqLCBzayksIFwKICAgICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKHZvaWQgKiksIGZyZWVfZnVuYykpCiAKLSNkZWZpbmUgc2tfdm9pZF9pbnNlcnQoc2ssIHAsIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICBcCi0gIHNrX2luc2VydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKHZvaWQpICosIHNrKSwgXAorI2RlZmluZSBza192b2lkX2luc2VydChzaywgcCwgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRih2b2lkKSosIHNrKSwgXAogICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgdm9pZCAqLCBwKSwgKHdoZXJlKSkKIAogI2RlZmluZSBza192b2lkX2RlbGV0ZShzaywgd2hlcmUpIFwKQEAgLTM4MDUsMjcgKzM2MTksMjcgQEAKICAgKCh2b2lkICopc2tfZGVsZXRlX3B0cihDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKHZvaWQpKiwgc2spLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgdm9pZCAqLCBwKSkpCiAKLSNkZWZpbmUgc2tfdm9pZF9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKHZvaWQpICosIHNrKSwgKG91dF9pbmRleCksIFwKKyNkZWZpbmUgc2tfdm9pZF9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19maW5kKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0Yodm9pZCkqLCBzayksIChvdXRfaW5kZXgpLCBcCiAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgdm9pZCAqLCBwKSkKIAogI2RlZmluZSBza192b2lkX3NoaWZ0KHNrKSBcCiAgICgodm9pZCAqKXNrX3NoaWZ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0Yodm9pZCkqLCBzaykpKQogCi0jZGVmaW5lIHNrX3ZvaWRfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKHZvaWQpICosIHNrKSwgXAorI2RlZmluZSBza192b2lkX3B1c2goc2ssIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKHZvaWQpKiwgc2spLCBcCiAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgdm9pZCAqLCBwKSkKIAogI2RlZmluZSBza192b2lkX3BvcChzaykgXAogICAoKHZvaWQgKilza19wb3AoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRih2b2lkKSosIHNrKSkpCiAKICNkZWZpbmUgc2tfdm9pZF9kdXAoc2spIFwKLSAgKChTVEFDS19PRih2b2lkKSopc2tfZHVwKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0Yodm9pZCkgKiwgc2spKSkKKyAgKChTVEFDS19PRih2b2lkKSopc2tfZHVwKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0Yodm9pZCkqLCBzaykpKQogCi0jZGVmaW5lIHNrX3ZvaWRfc29ydChzaykgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKHZvaWQpICosIHNrKSkKKyNkZWZpbmUgc2tfdm9pZF9zb3J0KHNrKSBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0Yodm9pZCkqLCBzaykpCiAKICNkZWZpbmUgc2tfdm9pZF9pc19zb3J0ZWQoc2spIFwKLSAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0Yodm9pZCkgKiwgc2spKQorICBza19pc19zb3J0ZWQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRih2b2lkKSosIHNrKSkKIAogI2RlZmluZSBza192b2lkX3NldF9jbXBfZnVuYyhzaywgY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgKChpbnQgKCopKGNvbnN0IHZvaWQgKiphLCBjb25zdCB2b2lkICoqYikpc2tfc2V0X2NtcF9mdW5jKCAgICAgICAgICAgICAgICBcCkBAIC0zODM1LDcgKzM2NDksNyBAQAogCiAjZGVmaW5lIHNrX3ZvaWRfZGVlcF9jb3B5KHNrLCBjb3B5X2Z1bmMsIGZyZWVfZnVuYykgICAgICAgICAgICAgICAgICBcCiAgICgoU1RBQ0tfT0Yodm9pZCkqKXNrX2RlZXBfY29weSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBDSEVDS0VEX0NBU1QoY29uc3QgX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKHZvaWQpICosIHNrKSwgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoY29uc3QgX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKHZvaWQpKiwgc2spLCAgICAgICBcCiAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqKCopKHZvaWQgKiksIHZvaWQgKigqKSh2b2lkICopLCBjb3B5X2Z1bmMpLCBcCiAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikodm9pZCAqKSwgZnJlZV9mdW5jKSkpCiAKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wZW5zc2wvdGxzMS5oIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC90bHMxLmgKaW5kZXggN2QxNmI1NS4uZjJiZWUyNyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3BlbnNzbC90bHMxLmgKKysrIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC90bHMxLmgKQEAgLTIwOSw3ICsyMDksNyBAQAogI2RlZmluZSBUTFNFWFRfVFlQRV9zaWduYXR1cmVfYWxnb3JpdGhtcyAxMwogCiAvKiBFeHRlbnNpb25UeXBlIHZhbHVlIGZyb20gUkZDNTc2NCAqLwotI2RlZmluZSBUTFNFWFRfVFlQRV9zcnRwIDE0CisjZGVmaW5lIFRMU0VYVF9UWVBFX3VzZV9zcnRwIDE0CiAKIC8qIEV4dGVuc2lvblR5cGUgdmFsdWUgZnJvbSBSRkM1NjIwICovCiAjZGVmaW5lIFRMU0VYVF9UWVBFX2hlYXJ0YmVhdCAxNQpAQCAtMjM5LDcgKzIzOSw4IEBACiAjZGVmaW5lIFRMU0VYVF9UWVBFX25leHRfcHJvdG9fbmVnIDEzMTcyCiAKIC8qIFRoaXMgaXMgbm90IGFuIElBTkEgZGVmaW5lZCBleHRlbnNpb24gbnVtYmVyICovCi0jZGVmaW5lIFRMU0VYVF9UWVBFX2NoYW5uZWxfaWQgMzAwMzIKKyNkZWZpbmUgVExTRVhUX1RZUEVfY2hhbm5lbF9pZCAzMDAzMQorI2RlZmluZSBUTFNFWFRfVFlQRV9jaGFubmVsX2lkX25ldyAzMDAzMgogCiAvKiBOYW1lVHlwZSB2YWx1ZSBmcm9tIFJGQyAzNTQ2ICovCiAjZGVmaW5lIFRMU0VYVF9OQU1FVFlQRV9ob3N0X25hbWUgMApAQCAtMjkwLDYgKzI5MSwxNCBAQAogICAgIFNTTCAqcywgdWludDhfdCAqb3V0LCBzaXplX3Qgb3V0X2xlbiwgY29uc3QgY2hhciAqbGFiZWwsIHNpemVfdCBsYWJlbF9sZW4sCiAgICAgY29uc3QgdWludDhfdCAqY29udGV4dCwgc2l6ZV90IGNvbnRleHRfbGVuLCBpbnQgdXNlX2NvbnRleHQpOwogCitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX2dldF9zaWdhbGdzKFNTTCAqcywgaW50IGlkeCwgaW50ICpwc2lnbiwgaW50ICpwaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwc2lnbmFuZGhhc2gsIHVpbnQ4X3QgKnJzaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJoYXNoKTsKKworT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9nZXRfc2hhcmVkX3NpZ2FsZ3MoU1NMICpzLCBpbnQgaWR4LCBpbnQgKnBzaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwaGFzaCwgaW50ICpwc2lnbmFuZGhhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpyc2lnLCB1aW50OF90ICpyaGFzaCk7CisKIC8qIFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZSwgZm9yIGEgY2xpZW50LCBjb25maWd1cmVzIHxzc2x8IHRvIGFkdmVydGlzZSB8bmFtZXwKICAqIGluIHRoZSBzZXJ2ZXJfbmFtZSBleHRlbnNpb24uIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZXJyb3IuICovCiBPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKFNTTCAqc3NsLCBjb25zdCBjaGFyICpuYW1lKTsKQEAgLTMxMyw2ICszMjIsMzkgQEAKICAqIGNhbGxiYWNrIGFuZCByZXR1cm5zIG9uZS4gU2VlIHxTU0xfQ1RYX3NldF90bHNleHRfc2VydmVybmFtZV9jYWxsYmFja3wuICovCiBPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9zZXRfdGxzZXh0X3NlcnZlcm5hbWVfYXJnKFNTTF9DVFggKmN0eCwgdm9pZCAqYXJnKTsKIAorI2RlZmluZSBTU0xfQ1RYX2dldF90bHNleHRfdGlja2V0X2tleXMoY3R4LCBrZXlzLCBrZXlsZW4pIFwKKyAgU1NMX0NUWF9jdHJsKChjdHgpLCBTU0xfQ1RSTF9HRVRfVExTRVhUX1RJQ0tFVF9LRVlTLCAoa2V5bGVuKSwgKGtleXMpKQorI2RlZmluZSBTU0xfQ1RYX3NldF90bHNleHRfdGlja2V0X2tleXMoY3R4LCBrZXlzLCBrZXlsZW4pIFwKKyAgU1NMX0NUWF9jdHJsKChjdHgpLCBTU0xfQ1RSTF9TRVRfVExTRVhUX1RJQ0tFVF9LRVlTLCAoa2V5bGVuKSwgKGtleXMpKQorCisvKiBTU0xfQ1RYX3NldF90bHNleHRfdGlja2V0X2tleV9jYiBzZXRzIHRoZSB0aWNrZXQgY2FsbGJhY2sgdG8gfGNhbGxiYWNrfCBhbmQKKyAqIHJldHVybnMgb25lLiB8Y2FsbGJhY2t8IHdpbGwgYmUgY2FsbGVkIHdoZW4gZW5jcnlwdGluZyBhIG5ldyB0aWNrZXQgYW5kIHdoZW4KKyAqIGRlY3J5cHRpbmcgYSB0aWNrZXQgZnJvbSB0aGUgY2xpZW50LgorICoKKyAqIEluIGJvdGggbW9kZXMsIHxjdHh8IGFuZCB8aG1hY19jdHh8IHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aAorICogfEVWUF9DSVBIRVJfQ1RYX2luaXR8IGFuZCB8SE1BQ19DVFhfaW5pdHwsIHJlc3BlY3RpdmVseS4gfGNhbGxiYWNrfAorICogY29uZmlndXJlcyB8aG1hY19jdHh8IHdpdGggYW4gSE1BQyBkaWdlc3QgYW5kIGtleSwgYW5kIGNvbmZpZ3VyZXMgfGN0eHwKKyAqIGZvciBlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24sIGJhc2VkIG9uIHRoZSBtb2RlLgorICoKKyAqIFdoZW4gZW5jcnlwdGluZyBhIG5ldyB0aWNrZXQsIHxlbmNyeXB0fCB3aWxsIGJlIG9uZS4gSXQgd3JpdGVzIGEgcHVibGljCisgKiAxNi1ieXRlIGtleSBuYW1lIHRvIHxrZXlfbmFtZXwgYW5kIGEgZnJlc2ggSVYgdG8gfGl2fC4gVGhlIG91dHB1dCBJViBsZW5ndGgKKyAqIG11c3QgbWF0Y2ggfEVWUF9DSVBIRVJfQ1RYX2l2X2xlbmd0aHwgb2YgdGhlIGNpcGhlciBzZWxlY3RlZC4gSW4gdGhpcyBtb2RlLAorICogfGNhbGxiYWNrfCByZXR1cm5zIDEgb24gc3VjY2VzcyBhbmQgLTEgb24gZXJyb3IuCisgKgorICogV2hlbiBkZWNyeXB0aW5nIGEgdGlja2V0LCB8ZW5jcnlwdHwgd2lsbCBiZSB6ZXJvLiB8a2V5X25hbWV8IHdpbGwgcG9pbnQgdG8gYQorICogMTYtYnl0ZSBrZXkgbmFtZSBhbmQgfGl2fCBwb2ludHMgdG8gYW4gSVYuIFRoZSBsZW5ndGggb2YgdGhlIElWIGNvbnN1bWVkIG11c3QKKyAqIG1hdGNoIHxFVlBfQ0lQSEVSX0NUWF9pdl9sZW5ndGh8IG9mIHRoZSBjaXBoZXIgc2VsZWN0ZWQuIEluIHRoaXMgbW9kZSwKKyAqIHxjYWxsYmFja3wgcmV0dXJucyAtMSB0byBhYm9ydCB0aGUgaGFuZHNoYWtlLCAwIGlmIGRlY3J5cHRpbmcgdGhlIHRpY2tldAorICogZmFpbGVkLCBhbmQgMSBvciAyIG9uIHN1Y2Nlc3MuIElmIGl0IHJldHVybnMgMiwgdGhlIHRpY2tldCB3aWxsIGJlIHJlbmV3ZWQuCisgKiBUaGlzIG1heSBiZSB1c2VkIHRvIHJlLWtleSB0aGUgdGlja2V0LgorICoKKyAqIFdBUk5JTkc6IHxjYWxsYmFja3wgd2lsZGx5IGJyZWFrcyB0aGUgdXN1YWwgcmV0dXJuIHZhbHVlIGNvbnZlbnRpb24gYW5kIGlzCisgKiBjYWxsZWQgaW4gdHdvIGRpZmZlcmVudCBtb2Rlcy4gKi8KK09QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX3NldF90bHNleHRfdGlja2V0X2tleV9jYigKKyAgICBTU0xfQ1RYICpjdHgsIGludCAoKmNhbGxiYWNrKShTU0wgKnNzbCwgdWludDhfdCAqa2V5X25hbWUsIHVpbnQ4X3QgKml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9DSVBIRVJfQ1RYICpjdHgsIEhNQUNfQ1RYICpobWFjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5jcnlwdCkpOworCiAvKiBQU0sgY2lwaGVyc3VpdGVzIGZyb20gNDI3OSAqLwogI2RlZmluZSBUTFMxX0NLX1BTS19XSVRIX1JDNF8xMjhfU0hBICAgICAgICAgICAgICAgICAgICAweDAzMDAwMDhBCiAjZGVmaW5lIFRMUzFfQ0tfUFNLX1dJVEhfM0RFU19FREVfQ0JDX1NIQSAgICAgICAgICAgICAgIDB4MDMwMDAwOEIKQEAgLTQ3Miw2ICs1MTQsNyBAQAogCiAjZGVmaW5lIFRMUzFfQ0tfRUNESEVfUlNBX0NIQUNIQTIwX1BPTFkxMzA1IDB4MDMwMENDMTMKICNkZWZpbmUgVExTMV9DS19FQ0RIRV9FQ0RTQV9DSEFDSEEyMF9QT0xZMTMwNSAweDAzMDBDQzE0CisjZGVmaW5lIFRMUzFfQ0tfREhFX1JTQV9DSEFDSEEyMF9QT0xZMTMwNSAweDAzMDBDQzE1CiAKIC8qIFhYWAogICogSW5jb25zaXN0ZW5jeSBhbGVydDoKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wZW5zc2wveDUwOS5oIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC94NTA5LmgKaW5kZXggZjZiM2FmMC4uNjljN2RhNiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3BlbnNzbC94NTA5LmgKKysrIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC94NTA5LmgKQEAgLTEwMiwyMiArMTAyLDIyIEBACiAjZGVmaW5lIFg1MDl2M19LVV9ERUNJUEhFUl9PTkxZCQkweDgwMDAKICNkZWZpbmUgWDUwOXYzX0tVX1VOREVGCQkJMHhmZmZmCiAKLXN0cnVjdCBYNTA5X29iamVjdHNfc3QKK3R5cGVkZWYgc3RydWN0IFg1MDlfb2JqZWN0c19zdAogCXsKIAlpbnQgbmlkOwogCWludCAoKmEyaSkodm9pZCk7CiAJaW50ICgqaTJhKSh2b2lkKTsKLQl9IC8qIFg1MDlfT0JKRUNUUyAqLzsKKwl9IFg1MDlfT0JKRUNUUzsKIAogREVDTEFSRV9BU04xX1NFVF9PRihYNTA5X0FMR09SKQogCiB0eXBlZGVmIFNUQUNLX09GKFg1MDlfQUxHT1IpIFg1MDlfQUxHT1JTOwogCi1zdHJ1Y3QgWDUwOV92YWxfc3QKK3R5cGVkZWYgc3RydWN0IFg1MDlfdmFsX3N0CiAJewogCUFTTjFfVElNRSAqbm90QmVmb3JlOwogCUFTTjFfVElNRSAqbm90QWZ0ZXI7Ci0JfSAvKiBYNTA5X1ZBTCAqLzsKKwl9IFg1MDlfVkFMOwogCiBzdHJ1Y3QgWDUwOV9wdWJrZXlfc3QKIAl7CkBAIC0xMjYsMjUgKzEyNiwyNSBAQAogCUVWUF9QS0VZICpwa2V5OwogCX07CiAKLXN0cnVjdCBYNTA5X3NpZ19zdAordHlwZWRlZiBzdHJ1Y3QgWDUwOV9zaWdfc3QKIAl7CiAJWDUwOV9BTEdPUiAqYWxnb3I7CiAJQVNOMV9PQ1RFVF9TVFJJTkcgKmRpZ2VzdDsKLQl9IC8qIFg1MDlfU0lHICovOworCX0gWDUwOV9TSUc7CiAKLXN0cnVjdCBYNTA5X25hbWVfZW50cnlfc3QKK3R5cGVkZWYgc3RydWN0IFg1MDlfbmFtZV9lbnRyeV9zdAogCXsKIAlBU04xX09CSkVDVCAqb2JqZWN0OwogCUFTTjFfU1RSSU5HICp2YWx1ZTsKIAlpbnQgc2V0OwogCWludCBzaXplOyAJLyogdGVtcCB2YXJpYWJsZSAqLwotCX0gLyogWDUwOV9OQU1FX0VOVFJZICovOworCX0gWDUwOV9OQU1FX0VOVFJZOwogCiBERUNMQVJFX1NUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkKIERFQ0xBUkVfQVNOMV9TRVRfT0YoWDUwOV9OQU1FX0VOVFJZKQogCiAvKiB3ZSBhbHdheXMga2VlcCBYNTA5X05BTUVzIGluIDIgZm9ybXMuICovCi1zdHJ1Y3QgWDUwOV9uYW1lX3N0Cit0eXBlZGVmIHN0cnVjdCBYNTA5X25hbWVfc3QKIAl7CiAJU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqZW50cmllczsKIAlpbnQgbW9kaWZpZWQ7CS8qIHRydWUgaWYgJ2J5dGVzJyBuZWVkcyB0byBiZSBidWlsdCAqLwpAQCAtMTU2LDE4ICsxNTYsMTggQEAKIC8qCXVuc2lnbmVkIGxvbmcgaGFzaDsgS2VlcCB0aGUgaGFzaCBhcm91bmQgZm9yIGxvb2t1cHMgKi8KIAl1bnNpZ25lZCBjaGFyICpjYW5vbl9lbmM7CiAJaW50IGNhbm9uX2VuY2xlbjsKLQl9IC8qIFg1MDlfTkFNRSAqLzsKKwl9IFg1MDlfTkFNRTsKIAogREVDTEFSRV9TVEFDS19PRihYNTA5X05BTUUpCiAKICNkZWZpbmUgWDUwOV9FWF9WX05FVFNDQVBFX0hBQ0sJCTB4ODAwMAogI2RlZmluZSBYNTA5X0VYX1ZfSU5JVAkJCTB4MDAwMQotc3RydWN0IFg1MDlfZXh0ZW5zaW9uX3N0Cit0eXBlZGVmIHN0cnVjdCBYNTA5X2V4dGVuc2lvbl9zdAogCXsKIAlBU04xX09CSkVDVCAqb2JqZWN0OwogCUFTTjFfQk9PTEVBTiBjcml0aWNhbDsKIAlBU04xX09DVEVUX1NUUklORyAqdmFsdWU7Ci0JfSAvKiBYNTA5X0VYVEVOU0lPTiAqLzsKKwl9IFg1MDlfRVhURU5TSU9OOwogCiB0eXBlZGVmIFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSBYNTA5X0VYVEVOU0lPTlM7CiAKQEAgLTE3NSw3ICsxNzUsNyBAQAogREVDTEFSRV9BU04xX1NFVF9PRihYNTA5X0VYVEVOU0lPTikKIAogLyogYSBzZXF1ZW5jZSBvZiB0aGVzZSBhcmUgdXNlZCAqLwotc3RydWN0IHg1MDlfYXR0cmlidXRlc19zdAordHlwZWRlZiBzdHJ1Y3QgeDUwOV9hdHRyaWJ1dGVzX3N0CiAJewogCUFTTjFfT0JKRUNUICpvYmplY3Q7CiAJaW50IHNpbmdsZTsgLyogMCBmb3IgYSBzZXQsIDEgZm9yIGEgc2luZ2xlIGl0ZW0gKHdoaWNoIGlzIHdyb25nKSAqLwpAQCAtMTg0LDEzICsxODQsMTMgQEAKIC8qIDAgKi8JCVNUQUNLX09GKEFTTjFfVFlQRSkgKnNldDsKIC8qIDEgKi8JCUFTTjFfVFlQRQkqc2luZ2xlOwogCQl9IHZhbHVlOwotCX0gLyogWDUwOV9BVFRSSUJVVEUgKi87CisJfSBYNTA5X0FUVFJJQlVURTsKIAogREVDTEFSRV9TVEFDS19PRihYNTA5X0FUVFJJQlVURSkKIERFQ0xBUkVfQVNOMV9TRVRfT0YoWDUwOV9BVFRSSUJVVEUpCiAKIAotc3RydWN0IFg1MDlfcmVxX2luZm9fc3QKK3R5cGVkZWYgc3RydWN0IFg1MDlfcmVxX2luZm9fc3QKIAl7CiAJQVNOMV9FTkNPRElORyBlbmM7CiAJQVNOMV9JTlRFR0VSICp2ZXJzaW9uOwpAQCAtMTk4LDE3ICsxOTgsMTcgQEAKIAlYNTA5X1BVQktFWSAqcHVia2V5OwogCS8qICBkPTIgaGw9MiBsPSAgMCBjb25zOiBjb250OiAwMCAqLwogCVNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqYXR0cmlidXRlczsgLyogWyAwIF0gKi8KLQl9IC8qIFg1MDlfUkVRX0lORk8gKi87CisJfSBYNTA5X1JFUV9JTkZPOwogCi1zdHJ1Y3QgWDUwOV9yZXFfc3QKK3R5cGVkZWYgc3RydWN0IFg1MDlfcmVxX3N0CiAJewogCVg1MDlfUkVRX0lORk8gKnJlcV9pbmZvOwogCVg1MDlfQUxHT1IgKnNpZ19hbGc7CiAJQVNOMV9CSVRfU1RSSU5HICpzaWduYXR1cmU7CiAJQ1JZUFRPX3JlZmNvdW50X3QgcmVmZXJlbmNlczsKLQl9IC8qIFg1MDlfUkVRICovOworCX0gWDUwOV9SRVE7CiAKLXN0cnVjdCB4NTA5X2NpbmZfc3QKK3R5cGVkZWYgc3RydWN0IHg1MDlfY2luZl9zdAogCXsKIAlBU04xX0lOVEVHRVIgKnZlcnNpb247CQkvKiBbIDAgXSBkZWZhdWx0IG9mIHYxICovCiAJQVNOMV9JTlRFR0VSICpzZXJpYWxOdW1iZXI7CkBAIC0yMjEsNyArMjIxLDcgQEAKIAlBU04xX0JJVF9TVFJJTkcgKnN1YmplY3RVSUQ7CQkvKiBbIDIgXSBvcHRpb25hbCBpbiB2MiAqLwogCVNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqZXh0ZW5zaW9uczsJLyogWyAzIF0gb3B0aW9uYWwgaW4gdjMgKi8KIAlBU04xX0VOQ09ESU5HIGVuYzsKLQl9IC8qIFg1MDlfQ0lORiAqLzsKKwl9IFg1MDlfQ0lORjsKIAogLyogVGhpcyBzdHVmZiBpcyBjZXJ0aWZpY2F0ZSAiYXV4aWxpYXJ5IGluZm8iCiAgKiBpdCBjb250YWlucyBkZXRhaWxzIHdoaWNoIGFyZSB1c2VmdWwgaW4gY2VydGlmaWNhdGUKQEAgLTIyOSwxNCArMjI5LDE0IEBACiAgKiB0aGUgZW5kIG9mIHRoZSBjZXJ0aWZpY2F0ZSBpdHNlbGYKICAqLwogCi1zdHJ1Y3QgeDUwOV9jZXJ0X2F1eF9zdAordHlwZWRlZiBzdHJ1Y3QgeDUwOV9jZXJ0X2F1eF9zdAogCXsKIAlTVEFDS19PRihBU04xX09CSkVDVCkgKnRydXN0OwkJLyogdHJ1c3RlZCB1c2VzICovCiAJU1RBQ0tfT0YoQVNOMV9PQkpFQ1QpICpyZWplY3Q7CQkvKiByZWplY3RlZCB1c2VzICovCiAJQVNOMV9VVEY4U1RSSU5HICphbGlhczsJCQkvKiAiZnJpZW5kbHkgbmFtZSIgKi8KIAlBU04xX09DVEVUX1NUUklORyAqa2V5aWQ7CQkvKiBrZXkgaWQgb2YgcHJpdmF0ZSBrZXkgKi8KIAlTVEFDS19PRihYNTA5X0FMR09SKSAqb3RoZXI7CQkvKiBvdGhlciB1bnNwZWNpZmllZCBpbmZvICovCi0JfSAvKiBYNTA5X0NFUlRfQVVYICovOworCX0gWDUwOV9DRVJUX0FVWDsKIAogc3RydWN0IHg1MDlfc3QKIAl7CkBAIC0yNjksMjEgKzI2OSwyMSBAQAogCiAvKiBUaGlzIGlzIHVzZWQgZm9yIGEgdGFibGUgb2YgdHJ1c3QgY2hlY2tpbmcgZnVuY3Rpb25zICovCiAKLXN0cnVjdCB4NTA5X3RydXN0X3N0IHsKK3R5cGVkZWYgc3RydWN0IHg1MDlfdHJ1c3Rfc3QgewogCWludCB0cnVzdDsKIAlpbnQgZmxhZ3M7CiAJaW50ICgqY2hlY2tfdHJ1c3QpKHN0cnVjdCB4NTA5X3RydXN0X3N0ICosIFg1MDkgKiwgaW50KTsKIAljaGFyICpuYW1lOwogCWludCBhcmcxOwogCXZvaWQgKmFyZzI7Ci19IC8qIFg1MDlfVFJVU1QgKi87Cit9IFg1MDlfVFJVU1Q7CiAKIERFQ0xBUkVfU1RBQ0tfT0YoWDUwOV9UUlVTVCkKIAotc3RydWN0IHg1MDlfY2VydF9wYWlyX3N0IHsKK3R5cGVkZWYgc3RydWN0IHg1MDlfY2VydF9wYWlyX3N0IHsKIAlYNTA5ICpmb3J3YXJkOwogCVg1MDkgKnJldmVyc2U7Ci19IC8qIFg1MDlfQ0VSVF9QQUlSICovOworfSBYNTA5X0NFUlRfUEFJUjsKIAogLyogc3RhbmRhcmQgdHJ1c3QgaWRzICovCiAKQEAgLTQwMyw3ICs0MDMsNyBAQAogREVDTEFSRV9TVEFDS19PRihYNTA5X1JFVk9LRUQpCiBERUNMQVJFX0FTTjFfU0VUX09GKFg1MDlfUkVWT0tFRCkKIAotc3RydWN0IFg1MDlfY3JsX2luZm9fc3QKK3R5cGVkZWYgc3RydWN0IFg1MDlfY3JsX2luZm9fc3QKIAl7CiAJQVNOMV9JTlRFR0VSICp2ZXJzaW9uOwogCVg1MDlfQUxHT1IgKnNpZ19hbGc7CkBAIC00MTMsNyArNDEzLDcgQEAKIAlTVEFDS19PRihYNTA5X1JFVk9LRUQpICpyZXZva2VkOwogCVNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAvKiBbMF0gKi8gKmV4dGVuc2lvbnM7CiAJQVNOMV9FTkNPRElORyBlbmM7Ci0JfSAvKiBYNTA5X0NSTF9JTkZPICovOworCX0gWDUwOV9DUkxfSU5GTzsKIAogc3RydWN0IFg1MDlfY3JsX3N0CiAJewpAQCAtNDQxLDcgKzQ0MSw3IEBACiBERUNMQVJFX1NUQUNLX09GKFg1MDlfQ1JMKQogREVDTEFSRV9BU04xX1NFVF9PRihYNTA5X0NSTCkKIAotc3RydWN0IHByaXZhdGVfa2V5X3N0Cit0eXBlZGVmIHN0cnVjdCBwcml2YXRlX2tleV9zdAogCXsKIAlpbnQgdmVyc2lvbjsKIAkvKiBUaGUgUEtDUyM4IGRhdGEgdHlwZXMgKi8KQEAgLTQ1OCwxMCArNDU4LDEwIEBACiAKIAkvKiBleHBhbmRlZCB2ZXJzaW9uIG9mICdlbmNfYWxnb3InICovCiAJRVZQX0NJUEhFUl9JTkZPIGNpcGhlcjsKLQl9IC8qIFg1MDlfUEtFWSAqLzsKKwl9IFg1MDlfUEtFWTsKIAogI2lmbmRlZiBPUEVOU1NMX05PX0VWUAotc3RydWN0IFg1MDlfaW5mb19zdAordHlwZWRlZiBzdHJ1Y3QgWDUwOV9pbmZvX3N0CiAJewogCVg1MDkgKng1MDk7CiAJWDUwOV9DUkwgKmNybDsKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCWludCBlbmNfbGVuOwogCWNoYXIgKmVuY19kYXRhOwogCi0JfSAvKiBYNTA5X0lORk8gKi87CisJfSBYNTA5X0lORk87CiAKIERFQ0xBUkVfU1RBQ0tfT0YoWDUwOV9JTkZPKQogI2VuZGlmCkBAIC00ODAsMjUgKzQ4MCwyNSBAQAogICogUGF0IFJpY2hhcmQgPHBhdHJAeDUwOS5jb20+IGFuZCBhcmUgdXNlZCB0byBtYW5pcHVsYXRlCiAgKiBOZXRzY2FwZXMgc3BraSBzdHJ1Y3R1cmVzIC0gdXNlZnVsIGlmIHlvdSBhcmUgd3JpdGluZyBhIENBIHdlYiBwYWdlCiAgKi8KLXN0cnVjdCBOZXRzY2FwZV9zcGthY19zdAordHlwZWRlZiBzdHJ1Y3QgTmV0c2NhcGVfc3BrYWNfc3QKIAl7CiAJWDUwOV9QVUJLRVkgKnB1YmtleTsKIAlBU04xX0lBNVNUUklORyAqY2hhbGxlbmdlOwkvKiBjaGFsbGVuZ2Ugc2VudCBpbiBhdGxhcyA+PSBQUjIgKi8KLQl9IC8qIE5FVFNDQVBFX1NQS0FDICovOworCX0gTkVUU0NBUEVfU1BLQUM7CiAKLXN0cnVjdCBOZXRzY2FwZV9zcGtpX3N0Cit0eXBlZGVmIHN0cnVjdCBOZXRzY2FwZV9zcGtpX3N0CiAJewogCU5FVFNDQVBFX1NQS0FDICpzcGthYzsJLyogc2lnbmVkIHB1YmxpYyBrZXkgYW5kIGNoYWxsZW5nZSAqLwogCVg1MDlfQUxHT1IgKnNpZ19hbGdvcjsKIAlBU04xX0JJVF9TVFJJTkcgKnNpZ25hdHVyZTsKLQl9IC8qIE5FVFNDQVBFX1NQS0kgKi87CisJfSBORVRTQ0FQRV9TUEtJOwogCiAvKiBOZXRzY2FwZSBjZXJ0aWZpY2F0ZSBzZXF1ZW5jZSBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCBOZXRzY2FwZV9jZXJ0aWZpY2F0ZV9zZXF1ZW5jZQordHlwZWRlZiBzdHJ1Y3QgTmV0c2NhcGVfY2VydGlmaWNhdGVfc2VxdWVuY2UKIAl7CiAJQVNOMV9PQkpFQ1QgKnR5cGU7CiAJU1RBQ0tfT0YoWDUwOSkgKmNlcnRzOwotCX0gLyogTkVUU0NBUEVfQ0VSVF9TRVFVRU5DRSAqLzsKKwl9IE5FVFNDQVBFX0NFUlRfU0VRVUVOQ0U7CiAKIC8qIFVudXNlZCAoYW5kIGl2IGxlbmd0aCBpcyB3cm9uZykKIHR5cGVkZWYgc3RydWN0IENCQ1BhcmFtZXRlcl9zdApAQCAtNTA5LDI0ICs1MDksMjQgQEAKIAogLyogUGFzc3dvcmQgYmFzZWQgZW5jcnlwdGlvbiBzdHJ1Y3R1cmUgKi8KIAotc3RydWN0IFBCRVBBUkFNX3N0IHsKK3R5cGVkZWYgc3RydWN0IFBCRVBBUkFNX3N0IHsKIEFTTjFfT0NURVRfU1RSSU5HICpzYWx0OwogQVNOMV9JTlRFR0VSICppdGVyOwotfSAvKiBQQkVQQVJBTSAqLzsKK30gUEJFUEFSQU07CiAKIC8qIFBhc3N3b3JkIGJhc2VkIGVuY3J5cHRpb24gVjIgc3RydWN0dXJlcyAqLwogCi1zdHJ1Y3QgUEJFMlBBUkFNX3N0IHsKK3R5cGVkZWYgc3RydWN0IFBCRTJQQVJBTV9zdCB7CiBYNTA5X0FMR09SICprZXlmdW5jOwogWDUwOV9BTEdPUiAqZW5jcnlwdGlvbjsKLX0gLyogUEJFMlBBUkFNICovOworfSBQQkUyUEFSQU07CiAKLXN0cnVjdCBQQktERjJQQVJBTV9zdCB7Cit0eXBlZGVmIHN0cnVjdCBQQktERjJQQVJBTV9zdCB7CiBBU04xX1RZUEUgKnNhbHQ7CS8qIFVzdWFsbHkgT0NURVQgU1RSSU5HIGJ1dCBjb3VsZCBiZSBhbnl0aGluZyAqLwogQVNOMV9JTlRFR0VSICppdGVyOwogQVNOMV9JTlRFR0VSICprZXlsZW5ndGg7CiBYNTA5X0FMR09SICpwcmY7Ci19IC8qIFBCS0RGMlBBUkFNICovOworfSBQQktERjJQQVJBTTsKIAogCiAvKiBQS0NTIzggcHJpdmF0ZSBrZXkgaW5mbyBzdHJ1Y3R1cmUgKi8KQEAgLTg5Niw3ICs4OTYsNiBAQAogT1BFTlNTTF9FWFBPUlQgaW50IFg1MDlfQ1JMX3NldF9sYXN0VXBkYXRlKFg1MDlfQ1JMICp4LCBjb25zdCBBU04xX1RJTUUgKnRtKTsKIE9QRU5TU0xfRVhQT1JUIGludCBYNTA5X0NSTF9zZXRfbmV4dFVwZGF0ZShYNTA5X0NSTCAqeCwgY29uc3QgQVNOMV9USU1FICp0bSk7CiBPUEVOU1NMX0VYUE9SVCBpbnQgWDUwOV9DUkxfc29ydChYNTA5X0NSTCAqY3JsKTsKLU9QRU5TU0xfRVhQT1JUIHZvaWQgWDUwOV9DUkxfdXBfcmVmKFg1MDlfQ1JMICpjcmwpOwogCiBPUEVOU1NMX0VYUE9SVCBpbnQgWDUwOV9SRVZPS0VEX3NldF9zZXJpYWxOdW1iZXIoWDUwOV9SRVZPS0VEICp4LCBBU04xX0lOVEVHRVIgKnNlcmlhbCk7CiBPUEVOU1NMX0VYUE9SVCBpbnQgWDUwOV9SRVZPS0VEX3NldF9yZXZvY2F0aW9uRGF0ZShYNTA5X1JFVk9LRUQgKnIsIEFTTjFfVElNRSAqdG0pOwpAQCAtMTIxOCw2ICsxMjE3LDY1IEBACiB9CiAjZW5kaWYKIAorI2RlZmluZSBYNTA5X0ZfQVNOMV9kaWdlc3QgMTAwCisjZGVmaW5lIFg1MDlfRl9BU04xX2l0ZW1fc2lnbl9jdHggMTAxCisjZGVmaW5lIFg1MDlfRl9BU04xX2l0ZW1fdmVyaWZ5IDEwMgorI2RlZmluZSBYNTA5X0ZfTkVUU0NBUEVfU1BLSV9iNjRfZGVjb2RlIDEwMworI2RlZmluZSBYNTA5X0ZfTkVUU0NBUEVfU1BLSV9iNjRfZW5jb2RlIDEwNAorI2RlZmluZSBYNTA5X0ZfUEtDUzdfZ2V0X2NlcnRpZmljYXRlcyAxMDUKKyNkZWZpbmUgWDUwOV9GX1g1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV9OSUQgMTA2CisjZGVmaW5lIFg1MDlfRl9YNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfT0JKIDEwNworI2RlZmluZSBYNTA5X0ZfWDUwOV9BVFRSSUJVVEVfY3JlYXRlX2J5X3R4dCAxMDgKKyNkZWZpbmUgWDUwOV9GX1g1MDlfQVRUUklCVVRFX2dldDBfZGF0YSAxMDkKKyNkZWZpbmUgWDUwOV9GX1g1MDlfQVRUUklCVVRFX3NldDFfZGF0YSAxMTAKKyNkZWZpbmUgWDUwOV9GX1g1MDlfQ1JMX2FkZDBfcmV2b2tlZCAxMTEKKyNkZWZpbmUgWDUwOV9GX1g1MDlfQ1JMX2RpZmYgMTEyCisjZGVmaW5lIFg1MDlfRl9YNTA5X0NSTF9wcmludF9mcCAxMTMKKyNkZWZpbmUgWDUwOV9GX1g1MDlfRVhURU5TSU9OX2NyZWF0ZV9ieV9OSUQgMTE0CisjZGVmaW5lIFg1MDlfRl9YNTA5X0VYVEVOU0lPTl9jcmVhdGVfYnlfT0JKIDExNQorI2RlZmluZSBYNTA5X0ZfWDUwOV9JTkZPX25ldyAxMTYKKyNkZWZpbmUgWDUwOV9GX1g1MDlfTkFNRV9FTlRSWV9jcmVhdGVfYnlfTklEIDExNworI2RlZmluZSBYNTA5X0ZfWDUwOV9OQU1FX0VOVFJZX2NyZWF0ZV9ieV90eHQgMTE4CisjZGVmaW5lIFg1MDlfRl9YNTA5X05BTUVfRU5UUllfc2V0X29iamVjdCAxMTkKKyNkZWZpbmUgWDUwOV9GX1g1MDlfTkFNRV9hZGRfZW50cnkgMTIwCisjZGVmaW5lIFg1MDlfRl9YNTA5X05BTUVfb25lbGluZSAxMjEKKyNkZWZpbmUgWDUwOV9GX1g1MDlfTkFNRV9wcmludCAxMjIKKyNkZWZpbmUgWDUwOV9GX1g1MDlfUEtFWV9uZXcgMTIzCisjZGVmaW5lIFg1MDlfRl9YNTA5X1BVQktFWV9nZXQgMTI0CisjZGVmaW5lIFg1MDlfRl9YNTA5X1BVQktFWV9zZXQgMTI1CisjZGVmaW5lIFg1MDlfRl9YNTA5X1JFUV9jaGVja19wcml2YXRlX2tleSAxMjYKKyNkZWZpbmUgWDUwOV9GX1g1MDlfUkVRX3RvX1g1MDkgMTI3CisjZGVmaW5lIFg1MDlfRl9YNTA5X1NUT1JFX0NUWF9nZXQxX2lzc3VlciAxMjgKKyNkZWZpbmUgWDUwOV9GX1g1MDlfU1RPUkVfQ1RYX2luaXQgMTI5CisjZGVmaW5lIFg1MDlfRl9YNTA5X1NUT1JFX0NUWF9uZXcgMTMwCisjZGVmaW5lIFg1MDlfRl9YNTA5X1NUT1JFX0NUWF9wdXJwb3NlX2luaGVyaXQgMTMxCisjZGVmaW5lIFg1MDlfRl9YNTA5X1NUT1JFX2FkZF9jZXJ0IDEzMgorI2RlZmluZSBYNTA5X0ZfWDUwOV9TVE9SRV9hZGRfY3JsIDEzMworI2RlZmluZSBYNTA5X0ZfWDUwOV9UUlVTVF9hZGQgMTM0CisjZGVmaW5lIFg1MDlfRl9YNTA5X1RSVVNUX3NldCAxMzUKKyNkZWZpbmUgWDUwOV9GX1g1MDlfY2hlY2tfcHJpdmF0ZV9rZXkgMTM2CisjZGVmaW5lIFg1MDlfRl9YNTA5X2dldF9wdWJrZXlfcGFyYW1ldGVycyAxMzcKKyNkZWZpbmUgWDUwOV9GX1g1MDlfbG9hZF9jZXJ0X2NybF9maWxlIDEzOAorI2RlZmluZSBYNTA5X0ZfWDUwOV9sb2FkX2NlcnRfZmlsZSAxMzkKKyNkZWZpbmUgWDUwOV9GX1g1MDlfbG9hZF9jcmxfZmlsZSAxNDAKKyNkZWZpbmUgWDUwOV9GX1g1MDlfcHJpbnRfZXhfZnAgMTQxCisjZGVmaW5lIFg1MDlfRl9YNTA5X3RvX1g1MDlfUkVRIDE0MgorI2RlZmluZSBYNTA5X0ZfWDUwOV92ZXJpZnlfY2VydCAxNDMKKyNkZWZpbmUgWDUwOV9GX1g1MDlhdF9hZGQxX2F0dHIgMTQ0CisjZGVmaW5lIFg1MDlfRl9YNTA5djNfYWRkX2V4dCAxNDUKKyNkZWZpbmUgWDUwOV9GX2FkZF9jZXJ0X2RpciAxNDYKKyNkZWZpbmUgWDUwOV9GX2J5X2ZpbGVfY3RybCAxNDcKKyNkZWZpbmUgWDUwOV9GX2NoZWNrX3BvbGljeSAxNDgKKyNkZWZpbmUgWDUwOV9GX2Rpcl9jdHJsIDE0OQorI2RlZmluZSBYNTA5X0ZfZ2V0X2NlcnRfYnlfc3ViamVjdCAxNTAKKyNkZWZpbmUgWDUwOV9GX2kyZF9EU0FfUFVCS0VZIDE1MQorI2RlZmluZSBYNTA5X0ZfaTJkX0VDX1BVQktFWSAxNTIKKyNkZWZpbmUgWDUwOV9GX2kyZF9SU0FfUFVCS0VZIDE1MworI2RlZmluZSBYNTA5X0ZfeDUwOV9uYW1lX2VuY29kZSAxNTQKKyNkZWZpbmUgWDUwOV9GX3g1MDlfbmFtZV9leF9kMmkgMTU1CisjZGVmaW5lIFg1MDlfRl94NTA5X25hbWVfZXhfbmV3IDE1NgorI2RlZmluZSBYNTA5X0ZfcGtjczdfcGFyc2VfaGVhZGVyIDE1NworI2RlZmluZSBYNTA5X0ZfUEtDUzdfZ2V0X0NSTHMgMTU4CiAjZGVmaW5lIFg1MDlfUl9BS0lEX01JU01BVENIIDEwMAogI2RlZmluZSBYNTA5X1JfQkFEX1BLQ1M3X1ZFUlNJT04gMTAxCiAjZGVmaW5lIFg1MDlfUl9CQURfWDUwOV9GSUxFVFlQRSAxMDIKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wZW5zc2wveDUwOXYzLmggYi9zcmMvaW5jbHVkZS9vcGVuc3NsL3g1MDl2My5oCmluZGV4IGI3YjhiYTcuLjVjYWE1YzEgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wZW5zc2wveDUwOXYzLmgKKysrIGIvc3JjL2luY2x1ZGUvb3BlbnNzbC94NTA5djMuaApAQCAtNzMxLDYgKzczMSw2MyBAQAogI2lmZGVmICBfX2NwbHVzcGx1cwogfQogI2VuZGlmCisjZGVmaW5lIFg1MDlWM19GX1NYTkVUX2FkZF9pZF9JTlRFR0VSIDEwMAorI2RlZmluZSBYNTA5VjNfRl9TWE5FVF9hZGRfaWRfYXNjIDEwMQorI2RlZmluZSBYNTA5VjNfRl9TWE5FVF9hZGRfaWRfdWxvbmcgMTAyCisjZGVmaW5lIFg1MDlWM19GX1NYTkVUX2dldF9pZF9hc2MgMTAzCisjZGVmaW5lIFg1MDlWM19GX1NYTkVUX2dldF9pZF91bG9uZyAxMDQKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOVYzX0VYVF9hZGQgMTA1CisjZGVmaW5lIFg1MDlWM19GX1g1MDlWM19FWFRfYWRkX2FsaWFzIDEwNgorI2RlZmluZSBYNTA5VjNfRl9YNTA5VjNfRVhUX2ZyZWUgMTA3CisjZGVmaW5lIFg1MDlWM19GX1g1MDlWM19FWFRfaTJkIDEwOAorI2RlZmluZSBYNTA5VjNfRl9YNTA5VjNfRVhUX25jb25mIDEwOQorI2RlZmluZSBYNTA5VjNfRl9YNTA5VjNfYWRkMV9pMmQgMTEwCisjZGVmaW5lIFg1MDlWM19GX1g1MDlWM19hZGRfdmFsdWUgMTExCisjZGVmaW5lIFg1MDlWM19GX1g1MDlWM19nZXRfc2VjdGlvbiAxMTIKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOVYzX2dldF9zdHJpbmcgMTEzCisjZGVmaW5lIFg1MDlWM19GX1g1MDlWM19nZXRfdmFsdWVfYm9vbCAxMTQKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOVYzX3BhcnNlX2xpc3QgMTE1CisjZGVmaW5lIFg1MDlWM19GX1g1MDlfUFVSUE9TRV9hZGQgMTE2CisjZGVmaW5lIFg1MDlWM19GX1g1MDlfUFVSUE9TRV9zZXQgMTE3CisjZGVmaW5lIFg1MDlWM19GX2EyaV9HRU5FUkFMX05BTUUgMTE4CisjZGVmaW5lIFg1MDlWM19GX2NvcHlfZW1haWwgMTE5CisjZGVmaW5lIFg1MDlWM19GX2NvcHlfaXNzdWVyIDEyMAorI2RlZmluZSBYNTA5VjNfRl9kb19kaXJuYW1lIDEyMQorI2RlZmluZSBYNTA5VjNfRl9kb19leHRfaTJkIDEyMgorI2RlZmluZSBYNTA5VjNfRl9kb19leHRfbmNvbmYgMTIzCisjZGVmaW5lIFg1MDlWM19GX2duYW1lc19mcm9tX3NlY3RuYW1lIDEyNAorI2RlZmluZSBYNTA5VjNfRl9oZXhfdG9fc3RyaW5nIDEyNQorI2RlZmluZSBYNTA5VjNfRl9pMnNfQVNOMV9FTlVNRVJBVEVEIDEyNgorI2RlZmluZSBYNTA5VjNfRl9pMnNfQVNOMV9JQTVTVFJJTkcgMTI3CisjZGVmaW5lIFg1MDlWM19GX2kyc19BU04xX0lOVEVHRVIgMTI4CisjZGVmaW5lIFg1MDlWM19GX2kydl9BVVRIT1JJVFlfSU5GT19BQ0NFU1MgMTI5CisjZGVmaW5lIFg1MDlWM19GX25vdGljZV9zZWN0aW9uIDEzMAorI2RlZmluZSBYNTA5VjNfRl9ucmVmX25vcyAxMzEKKyNkZWZpbmUgWDUwOVYzX0ZfcG9saWN5X3NlY3Rpb24gMTMyCisjZGVmaW5lIFg1MDlWM19GX3Byb2Nlc3NfcGNpX3ZhbHVlIDEzMworI2RlZmluZSBYNTA5VjNfRl9yMmlfY2VydHBvbCAxMzQKKyNkZWZpbmUgWDUwOVYzX0ZfcjJpX3BjaSAxMzUKKyNkZWZpbmUgWDUwOVYzX0ZfczJpX0FTTjFfSUE1U1RSSU5HIDEzNgorI2RlZmluZSBYNTA5VjNfRl9zMmlfQVNOMV9JTlRFR0VSIDEzNworI2RlZmluZSBYNTA5VjNfRl9zMmlfQVNOMV9PQ1RFVF9TVFJJTkcgMTM4CisjZGVmaW5lIFg1MDlWM19GX3MyaV9za2V5X2lkIDEzOQorI2RlZmluZSBYNTA5VjNfRl9zZXRfZGlzdF9wb2ludF9uYW1lIDE0MAorI2RlZmluZSBYNTA5VjNfRl9zdHJpbmdfdG9faGV4IDE0MQorI2RlZmluZSBYNTA5VjNfRl92MmlfQVNOMV9CSVRfU1RSSU5HIDE0MgorI2RlZmluZSBYNTA5VjNfRl92MmlfQVVUSE9SSVRZX0lORk9fQUNDRVNTIDE0MworI2RlZmluZSBYNTA5VjNfRl92MmlfQVVUSE9SSVRZX0tFWUlEIDE0NAorI2RlZmluZSBYNTA5VjNfRl92MmlfQkFTSUNfQ09OU1RSQUlOVFMgMTQ1CisjZGVmaW5lIFg1MDlWM19GX3YyaV9FWFRFTkRFRF9LRVlfVVNBR0UgMTQ2CisjZGVmaW5lIFg1MDlWM19GX3YyaV9HRU5FUkFMX05BTUVTIDE0NworI2RlZmluZSBYNTA5VjNfRl92MmlfR0VORVJBTF9OQU1FX2V4IDE0OAorI2RlZmluZSBYNTA5VjNfRl92MmlfTkFNRV9DT05TVFJBSU5UUyAxNDkKKyNkZWZpbmUgWDUwOVYzX0ZfdjJpX1BPTElDWV9DT05TVFJBSU5UUyAxNTAKKyNkZWZpbmUgWDUwOVYzX0ZfdjJpX1BPTElDWV9NQVBQSU5HUyAxNTEKKyNkZWZpbmUgWDUwOVYzX0ZfdjJpX2NybGQgMTUyCisjZGVmaW5lIFg1MDlWM19GX3YyaV9pZHAgMTUzCisjZGVmaW5lIFg1MDlWM19GX3YyaV9pc3N1ZXJfYWx0IDE1NAorI2RlZmluZSBYNTA5VjNfRl92Mmlfc3ViamVjdF9hbHQgMTU1CisjZGVmaW5lIFg1MDlWM19GX3YzX2dlbmVyaWNfZXh0ZW5zaW9uIDE1NgogI2RlZmluZSBYNTA5VjNfUl9CQURfSVBfQUREUkVTUyAxMDAKICNkZWZpbmUgWDUwOVYzX1JfQkFEX09CSkVDVCAxMDEKICNkZWZpbmUgWDUwOVYzX1JfQk5fREVDMkJOX0VSUk9SIDEwMgpkaWZmIC0tZ2l0IGEvc3JjL3NzbC9DTWFrZUxpc3RzLnR4dCBiL3NyYy9zc2wvQ01ha2VMaXN0cy50eHQKaW5kZXggMjc4NWRjZi4uY2Y1YTI5ZCAxMDA2NDQKLS0tIGEvc3JjL3NzbC9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvc3NsL0NNYWtlTGlzdHMudHh0CkBAIC0xLDExICsxLDEwIEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vaW5jbHVkZSkKIAogYWRkX3N1YmRpcmVjdG9yeShwcXVldWUpCiAKIGFkZF9saWJyYXJ5KAogICBzc2wKIAotICBjdXN0b21fZXh0ZW5zaW9ucy5jCiAgIGQxX2JvdGguYwogICBkMV9jbG50LmMKICAgZDFfbGliLmMKQEAgLTEzLDcgKzEyLDYgQEAKICAgZDFfcGt0LmMKICAgZDFfc3J0cC5jCiAgIGQxX3NydnIuYwotICBkdGxzX3JlY29yZC5jCiAgIHMzX2JvdGguYwogICBzM19jbG50LmMKICAgczNfZW5jLmMKQEAgLTIyLDE5ICsyMCwxOCBAQAogICBzM19wa3QuYwogICBzM19zcnZyLmMKICAgc3NsX2FlYWRfY3R4LmMKKyAgc3NsX2FsZ3MuYwogICBzc2xfYXNuMS5jCi0gIHNzbF9idWZmZXIuYwogICBzc2xfY2VydC5jCiAgIHNzbF9jaXBoZXIuYwotICBzc2xfZmlsZS5jCiAgIHNzbF9saWIuYwogICBzc2xfcnNhLmMKLSAgc3NsX3Nlc3Npb24uYworICBzc2xfc2Vzcy5jCiAgIHNzbF9zdGF0LmMKICAgc3NsX3R4dC5jCiAgIHQxX2VuYy5jCiAgIHQxX2xpYi5jCi0gIHRsc19yZWNvcmQuYworICB0MV9yZW5lZy5jCiAKICAgJDxUQVJHRVRfT0JKRUNUUzpwcXVldWU+CiApCmRpZmYgLS1naXQgYS9zcmMvc3NsL2N1c3RvbV9leHRlbnNpb25zLmMgYi9zcmMvc3NsL2N1c3RvbV9leHRlbnNpb25zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NDU0M2QuLjAwMDAwMDAKLS0tIGEvc3JjL3NzbC9jdXN0b21fZXh0ZW5zaW9ucy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KLQotI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvYnl0ZXN0cmluZy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+Ci0KLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi0KLXZvaWQgU1NMX0NVU1RPTV9FWFRFTlNJT05fZnJlZShTU0xfQ1VTVE9NX0VYVEVOU0lPTiAqY3VzdG9tX2V4dGVuc2lvbikgewotICBPUEVOU1NMX2ZyZWUoY3VzdG9tX2V4dGVuc2lvbik7Ci19Ci0KLXN0YXRpYyBjb25zdCBTU0xfQ1VTVE9NX0VYVEVOU0lPTiAqY3VzdG9tX2V4dF9maW5kKAotICAgIFNUQUNLX09GKFNTTF9DVVNUT01fRVhURU5TSU9OKSAqc3RhY2ssCi0gICAgdW5zaWduZWQgKm91dF9pbmRleCwgdWludDE2X3QgdmFsdWUpIHsKLSAgc2l6ZV90IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBza19TU0xfQ1VTVE9NX0VYVEVOU0lPTl9udW0oc3RhY2spOyBpKyspIHsKLSAgICBjb25zdCBTU0xfQ1VTVE9NX0VYVEVOU0lPTiAqZXh0ID0gc2tfU1NMX0NVU1RPTV9FWFRFTlNJT05fdmFsdWUoc3RhY2ssIGkpOwotICAgIGlmIChleHQtPnZhbHVlID09IHZhbHVlKSB7Ci0gICAgICBpZiAob3V0X2luZGV4ICE9IE5VTEwpIHsKLSAgICAgICAgKm91dF9pbmRleCA9IGk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZXh0OwotICAgIH0KLSAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBkZWZhdWx0X2FkZF9jYWxsYmFjayBpcyB1c2VkIGFzIHRoZSB8YWRkX2NhbGxiYWNrfCB3aGVuIHRoZSB1c2VyIGRvZXNuJ3QKLSAqIHByb3ZpZGUgb25lLiBGb3Igc2VydmVycywgaXQgZG9lcyBub3RoaW5nIHdoaWxlLCBmb3IgY2xpZW50cywgaXQgY2F1c2VzIGFuCi0gKiBlbXB0eSBleHRlbnNpb24gdG8gYmUgaW5jbHVkZWQuICovCi1zdGF0aWMgaW50IGRlZmF1bHRfYWRkX2NhbGxiYWNrKFNTTCAqc3NsLCB1bnNpZ25lZCBleHRlbnNpb25fdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipvdXQsIHNpemVfdCAqb3V0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpvdXRfYWxlcnRfdmFsdWUsIHZvaWQgKmFkZF9hcmcpIHsKLSAgaWYgKHNzbC0+c2VydmVyKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgKm91dF9sZW4gPSAwOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBjdXN0b21fZXh0X2FkZF9oZWxsbyhTU0wgKnNzbCwgQ0JCICpleHRlbnNpb25zKSB7Ci0gIFNUQUNLX09GKFNTTF9DVVNUT01fRVhURU5TSU9OKSAqc3RhY2sgPSBzc2wtPmN0eC0+Y2xpZW50X2N1c3RvbV9leHRlbnNpb25zOwotICBpZiAoc3NsLT5zZXJ2ZXIpIHsKLSAgICBzdGFjayA9IHNzbC0+Y3R4LT5zZXJ2ZXJfY3VzdG9tX2V4dGVuc2lvbnM7Ci0gIH0KLQotICBpZiAoc3RhY2sgPT0gTlVMTCkgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgc2l6ZV90IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBza19TU0xfQ1VTVE9NX0VYVEVOU0lPTl9udW0oc3RhY2spOyBpKyspIHsKLSAgICBjb25zdCBTU0xfQ1VTVE9NX0VYVEVOU0lPTiAqZXh0ID0gc2tfU1NMX0NVU1RPTV9FWFRFTlNJT05fdmFsdWUoc3RhY2ssIGkpOwotCi0gICAgaWYgKHNzbC0+c2VydmVyICYmCi0gICAgICAgICEoc3NsLT5zMy0+dG1wLmN1c3RvbV9leHRlbnNpb25zLnJlY2VpdmVkICYgKDF1IDw8IGkpKSkgewotICAgICAgLyogU2VydmVycyBjYW5ub3QgZWNobyBleHRlbnNpb25zIHRoYXQgdGhlIGNsaWVudCBkaWRuJ3Qgc2VuZC4gKi8KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnRlbnRzOwotICAgIHNpemVfdCBjb250ZW50c19sZW47Ci0gICAgaW50IGFsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICBDQkIgY29udGVudHNfY2JiOwotCi0gICAgc3dpdGNoIChleHQtPmFkZF9jYWxsYmFjayhzc2wsIGV4dC0+dmFsdWUsICZjb250ZW50cywgJmNvbnRlbnRzX2xlbiwgJmFsZXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0LT5hZGRfYXJnKSkgewotICAgICAgY2FzZSAxOgotICAgICAgICBpZiAoIUNCQl9hZGRfdTE2KGV4dGVuc2lvbnMsIGV4dC0+dmFsdWUpIHx8Ci0gICAgICAgICAgICAhQ0JCX2FkZF91MTZfbGVuZ3RoX3ByZWZpeGVkKGV4dGVuc2lvbnMsICZjb250ZW50c19jYmIpIHx8Ci0gICAgICAgICAgICAhQ0JCX2FkZF9ieXRlcygmY29udGVudHNfY2JiLCBjb250ZW50cywgY29udGVudHNfbGVuKSB8fAotICAgICAgICAgICAgIUNCQl9mbHVzaChleHRlbnNpb25zKSkgewotICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOwotICAgICAgICAgIEVSUl9hZGRfZXJyb3JfZGF0YWYoImV4dGVuc2lvbjogJXUiLCAodW5zaWduZWQpIGV4dC0+dmFsdWUpOwotICAgICAgICAgIGlmIChleHQtPmZyZWVfY2FsbGJhY2sgJiYgMCA8IGNvbnRlbnRzX2xlbikgewotICAgICAgICAgICAgZXh0LT5mcmVlX2NhbGxiYWNrKHNzbCwgZXh0LT52YWx1ZSwgY29udGVudHMsIGV4dC0+YWRkX2FyZyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4dC0+ZnJlZV9jYWxsYmFjayAmJiAwIDwgY29udGVudHNfbGVuKSB7Ci0gICAgICAgICAgZXh0LT5mcmVlX2NhbGxiYWNrKHNzbCwgZXh0LT52YWx1ZSwgY29udGVudHMsIGV4dC0+YWRkX2FyZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXNzbC0+c2VydmVyKSB7Ci0gICAgICAgICAgYXNzZXJ0KChzc2wtPnMzLT50bXAuY3VzdG9tX2V4dGVuc2lvbnMuc2VudCAmICgxdSA8PCBpKSkgPT0gMCk7Ci0gICAgICAgICAgc3NsLT5zMy0+dG1wLmN1c3RvbV9leHRlbnNpb25zLnNlbnQgfD0gKDF1IDw8IGkpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDA6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBzc2wzX3NlbmRfYWxlcnQoc3NsLCBTU0wzX0FMX0ZBVEFMLCBhbGVydCk7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfQ1VTVE9NX0VYVEVOU0lPTl9FUlJPUik7Ci0gICAgICAgIEVSUl9hZGRfZXJyb3JfZGF0YWYoImV4dGVuc2lvbjogJXUiLCAodW5zaWduZWQpIGV4dC0+dmFsdWUpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotaW50IGN1c3RvbV9leHRfYWRkX2NsaWVudGhlbGxvKFNTTCAqc3NsLCBDQkIgKmV4dGVuc2lvbnMpIHsKLSAgcmV0dXJuIGN1c3RvbV9leHRfYWRkX2hlbGxvKHNzbCwgZXh0ZW5zaW9ucyk7Ci19Ci0KLWludCBjdXN0b21fZXh0X3BhcnNlX3NlcnZlcmhlbGxvKFNTTCAqc3NsLCBpbnQgKm91dF9hbGVydCwgdWludDE2X3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDQlMgKmV4dGVuc2lvbikgewotICB1bnNpZ25lZCBpbmRleDsKLSAgY29uc3QgU1NMX0NVU1RPTV9FWFRFTlNJT04gKmV4dCA9Ci0gICAgICBjdXN0b21fZXh0X2ZpbmQoc3NsLT5jdHgtPmNsaWVudF9jdXN0b21fZXh0ZW5zaW9ucywgJmluZGV4LCB2YWx1ZSk7Ci0KLSAgaWYgKC8qIFVua25vd24gZXh0ZW5zaW9ucyBhcmUgbm90IGFsbG93ZWQgaW4gYSBTZXJ2ZXJIZWxsby4gKi8KLSAgICAgIGV4dCA9PSBOVUxMIHx8Ci0gICAgICAvKiBBbHNvLCBpZiB3ZSBkaWRuJ3Qgc2VuZCB0aGUgZXh0ZW5zaW9uLCB0aGF0J3MgYWxzbyB1bmFjY2VwdGFibGUuICovCi0gICAgICAhKHNzbC0+czMtPnRtcC5jdXN0b21fZXh0ZW5zaW9ucy5zZW50ICYgKDF1IDw8IGluZGV4KSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1VORVhQRUNURURfRVhURU5TSU9OKTsKLSAgICBFUlJfYWRkX2Vycm9yX2RhdGFmKCJleHRlbnNpb246ICV1IiwgKHVuc2lnbmVkKXZhbHVlKTsKLSAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlmIChleHQtPnBhcnNlX2NhbGxiYWNrICE9IE5VTEwgJiYKLSAgICAgICFleHQtPnBhcnNlX2NhbGxiYWNrKHNzbCwgdmFsdWUsIENCU19kYXRhKGV4dGVuc2lvbiksIENCU19sZW4oZXh0ZW5zaW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9hbGVydCwgZXh0LT5wYXJzZV9hcmcpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9DVVNUT01fRVhURU5TSU9OX0VSUk9SKTsKLSAgICBFUlJfYWRkX2Vycm9yX2RhdGFmKCJleHRlbnNpb246ICV1IiwgKHVuc2lnbmVkKWV4dC0+dmFsdWUpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBjdXN0b21fZXh0X3BhcnNlX2NsaWVudGhlbGxvKFNTTCAqc3NsLCBpbnQgKm91dF9hbGVydCwgdWludDE2X3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDQlMgKmV4dGVuc2lvbikgewotICB1bnNpZ25lZCBpbmRleDsKLSAgY29uc3QgU1NMX0NVU1RPTV9FWFRFTlNJT04gKmV4dCA9Ci0gICAgICBjdXN0b21fZXh0X2ZpbmQoc3NsLT5jdHgtPnNlcnZlcl9jdXN0b21fZXh0ZW5zaW9ucywgJmluZGV4LCB2YWx1ZSk7Ci0KLSAgaWYgKGV4dCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBhc3NlcnQoKHNzbC0+czMtPnRtcC5jdXN0b21fZXh0ZW5zaW9ucy5yZWNlaXZlZCAmICgxdSA8PCBpbmRleCkpID09IDApOwotICBzc2wtPnMzLT50bXAuY3VzdG9tX2V4dGVuc2lvbnMucmVjZWl2ZWQgfD0gKDF1IDw8IGluZGV4KTsKLQotICBpZiAoZXh0LT5wYXJzZV9jYWxsYmFjayAmJgotICAgICAgIWV4dC0+cGFyc2VfY2FsbGJhY2soc3NsLCB2YWx1ZSwgQ0JTX2RhdGEoZXh0ZW5zaW9uKSwgQ0JTX2xlbihleHRlbnNpb24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2FsZXJ0LCBleHQtPnBhcnNlX2FyZykpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0NVU1RPTV9FWFRFTlNJT05fRVJST1IpOwotICAgIEVSUl9hZGRfZXJyb3JfZGF0YWYoImV4dGVuc2lvbjogJXUiLCAodW5zaWduZWQpZXh0LT52YWx1ZSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotaW50IGN1c3RvbV9leHRfYWRkX3NlcnZlcmhlbGxvKFNTTCAqc3NsLCBDQkIgKmV4dGVuc2lvbnMpIHsKLSAgcmV0dXJuIGN1c3RvbV9leHRfYWRkX2hlbGxvKHNzbCwgZXh0ZW5zaW9ucyk7Ci19Ci0KLS8qIE1BWF9OVU1fQ1VTVE9NX0VYVEVOU0lPTlMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGN1c3RvbSBleHRlbnNpb25zIHRoYXQKLSAqIGNhbiBiZSBzZXQgb24gYW4gfFNTTF9DVFh8LiBJdCdzIGRldGVybWluZWQgYnkgdGhlIHNpemUgb2YgdGhlIGJpdHNldCB1c2VkCi0gKiB0byB0cmFjayB3aGVuIGFuIGV4dGVuc2lvbiBoYXMgYmVlbiBzZW50LiAqLwotI2RlZmluZSBNQVhfTlVNX0NVU1RPTV9FWFRFTlNJT05TIFwKLSAgKHNpemVvZigoKHN0cnVjdCBzc2wzX3N0YXRlX3N0ICopTlVMTCktPnRtcC5jdXN0b21fZXh0ZW5zaW9ucy5zZW50KSAqIDgpCi0KLXN0YXRpYyBpbnQgY3VzdG9tX2V4dF9hcHBlbmQoU1RBQ0tfT0YoU1NMX0NVU1RPTV9FWFRFTlNJT04pICoqc3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGV4dGVuc2lvbl92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX2N1c3RvbV9leHRfYWRkX2NiIGFkZF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX2N1c3RvbV9leHRfZnJlZV9jYiBmcmVlX2NiLCB2b2lkICphZGRfYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfY3VzdG9tX2V4dF9wYXJzZV9jYiBwYXJzZV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGFyc2VfYXJnKSB7Ci0gIGlmIChhZGRfY2IgPT0gTlVMTCB8fAotICAgICAgMHhmZmZmIDwgZXh0ZW5zaW9uX3ZhbHVlIHx8Ci0gICAgICBTU0xfZXh0ZW5zaW9uX3N1cHBvcnRlZChleHRlbnNpb25fdmFsdWUpIHx8Ci0gICAgICAvKiBTcGVjaWZ5aW5nIGEgZnJlZSBjYWxsYmFjayB3aXRob3V0IGFuIGFkZCBjYWxsYmFjayBpcyBub25zZW5zaWNhbAotICAgICAgICogYW5kIGFuIGVycm9yLiAqLwotICAgICAgKCpzdGFjayAhPSBOVUxMICYmCi0gICAgICAgKE1BWF9OVU1fQ1VTVE9NX0VYVEVOU0lPTlMgPD0gc2tfU1NMX0NVU1RPTV9FWFRFTlNJT05fbnVtKCpzdGFjaykgfHwKLSAgICAgICAgY3VzdG9tX2V4dF9maW5kKCpzdGFjaywgTlVMTCwgZXh0ZW5zaW9uX3ZhbHVlKSAhPSBOVUxMKSkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIFNTTF9DVVNUT01fRVhURU5TSU9OICpleHQgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoU1NMX0NVU1RPTV9FWFRFTlNJT04pKTsKLSAgaWYgKGV4dCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgZXh0LT5hZGRfY2FsbGJhY2sgPSBhZGRfY2I7Ci0gIGV4dC0+YWRkX2FyZyA9IGFkZF9hcmc7Ci0gIGV4dC0+ZnJlZV9jYWxsYmFjayA9IGZyZWVfY2I7Ci0gIGV4dC0+cGFyc2VfY2FsbGJhY2sgPSBwYXJzZV9jYjsKLSAgZXh0LT5wYXJzZV9hcmcgPSBwYXJzZV9hcmc7Ci0gIGV4dC0+dmFsdWUgPSBleHRlbnNpb25fdmFsdWU7Ci0KLSAgaWYgKCpzdGFjayA9PSBOVUxMKSB7Ci0gICAgKnN0YWNrID0gc2tfU1NMX0NVU1RPTV9FWFRFTlNJT05fbmV3X251bGwoKTsKLSAgICBpZiAoKnN0YWNrID09IE5VTEwpIHsKLSAgICAgIFNTTF9DVVNUT01fRVhURU5TSU9OX2ZyZWUoZXh0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotCi0gIGlmICghc2tfU1NMX0NVU1RPTV9FWFRFTlNJT05fcHVzaCgqc3RhY2ssIGV4dCkpIHsKLSAgICBTU0xfQ1VTVE9NX0VYVEVOU0lPTl9mcmVlKGV4dCk7Ci0gICAgaWYgKHNrX1NTTF9DVVNUT01fRVhURU5TSU9OX251bSgqc3RhY2spID09IDApIHsKLSAgICAgIHNrX1NTTF9DVVNUT01fRVhURU5TSU9OX2ZyZWUoKnN0YWNrKTsKLSAgICAgICpzdGFjayA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBTU0xfQ1RYX2FkZF9jbGllbnRfY3VzdG9tX2V4dChTU0xfQ1RYICpjdHgsIHVuc2lnbmVkIGV4dGVuc2lvbl92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfY3VzdG9tX2V4dF9hZGRfY2IgYWRkX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9jdXN0b21fZXh0X2ZyZWVfY2IgZnJlZV9jYiwgdm9pZCAqYWRkX2FyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfY3VzdG9tX2V4dF9wYXJzZV9jYiBwYXJzZV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJzZV9hcmcpIHsKLSAgcmV0dXJuIGN1c3RvbV9leHRfYXBwZW5kKCZjdHgtPmNsaWVudF9jdXN0b21fZXh0ZW5zaW9ucywgZXh0ZW5zaW9uX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2NiID8gYWRkX2NiIDogZGVmYXVsdF9hZGRfY2FsbGJhY2ssIGZyZWVfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfYXJnLCBwYXJzZV9jYiwgcGFyc2VfYXJnKTsKLX0KLQotaW50IFNTTF9DVFhfYWRkX3NlcnZlcl9jdXN0b21fZXh0KFNTTF9DVFggKmN0eCwgdW5zaWduZWQgZXh0ZW5zaW9uX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9jdXN0b21fZXh0X2FkZF9jYiBhZGRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX2N1c3RvbV9leHRfZnJlZV9jYiBmcmVlX2NiLCB2b2lkICphZGRfYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9jdXN0b21fZXh0X3BhcnNlX2NiIHBhcnNlX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBhcnNlX2FyZykgewotICByZXR1cm4gY3VzdG9tX2V4dF9hcHBlbmQoJmN0eC0+c2VydmVyX2N1c3RvbV9leHRlbnNpb25zLCBleHRlbnNpb25fdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfY2IgPyBhZGRfY2IgOiBkZWZhdWx0X2FkZF9jYWxsYmFjaywgZnJlZV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9hcmcsIHBhcnNlX2NiLCBwYXJzZV9hcmcpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3NzbC9kMV9ib3RoLmMgYi9zcmMvc3NsL2QxX2JvdGguYwppbmRleCAxYWNiM2NlLi5hYzM1YTY2IDEwMDY0NAotLS0gYS9zcmMvc3NsL2QxX2JvdGguYworKysgYi9zcmMvc3NsL2QxX2JvdGguYwpAQCAtMTExLDggKzExMSw2IEBACiAgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCiAgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLwogCi0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KLQogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC0xNDksNDQgKzE0Nyw1MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZnJhZ19sZW4pOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgKmR0bHMxX3dyaXRlX21lc3NhZ2VfaGVhZGVyKFNTTCAqcywgdW5zaWduZWQgY2hhciAqcCk7CiAKLXN0YXRpYyBobV9mcmFnbWVudCAqZHRsczFfaG1fZnJhZ21lbnRfbmV3KHNpemVfdCBmcmFnX2xlbiwgaW50IHJlYXNzZW1ibHkpIHsKLSAgaG1fZnJhZ21lbnQgKmZyYWcgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoaG1fZnJhZ21lbnQpKTsKK3N0YXRpYyBobV9mcmFnbWVudCAqZHRsczFfaG1fZnJhZ21lbnRfbmV3KHVuc2lnbmVkIGxvbmcgZnJhZ19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVhc3NlbWJseSkgeworICBobV9mcmFnbWVudCAqZnJhZyA9IE5VTEw7CisgIHVpbnQ4X3QgKmJ1ZiA9IE5VTEw7CisgIHVpbnQ4X3QgKmJpdG1hc2sgPSBOVUxMOworCisgIGZyYWcgPSAoaG1fZnJhZ21lbnQgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoaG1fZnJhZ21lbnQpKTsKICAgaWYgKGZyYWcgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgZHRsczFfaG1fZnJhZ21lbnRfbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KLSAgbWVtc2V0KGZyYWcsIDAsIHNpemVvZihobV9mcmFnbWVudCkpOwogCi0gIC8qIElmIHRoZSBoYW5kc2hha2UgbWVzc2FnZSBpcyBlbXB0eSwgfGZyYWctPmZyYWdtZW50fCBhbmQgfGZyYWctPnJlYXNzZW1ibHl8Ci0gICAqIGFyZSBOVUxMLiAqLwotICBpZiAoZnJhZ19sZW4gPiAwKSB7Ci0gICAgZnJhZy0+ZnJhZ21lbnQgPSBPUEVOU1NMX21hbGxvYyhmcmFnX2xlbik7Ci0gICAgaWYgKGZyYWctPmZyYWdtZW50ID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwotICAgICAgZ290byBlcnI7Ci0gICAgfQotCi0gICAgaWYgKHJlYXNzZW1ibHkpIHsKLSAgICAgIC8qIEluaXRpYWxpemUgcmVhc3NlbWJseSBiaXRtYXNrLiAqLwotICAgICAgaWYgKGZyYWdfbGVuICsgNyA8IGZyYWdfbGVuKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfT1ZFUkZMT1cpOwotICAgICAgICBnb3RvIGVycjsKLSAgICAgIH0KLSAgICAgIHNpemVfdCBiaXRtYXNrX2xlbiA9IChmcmFnX2xlbiArIDcpIC8gODsKLSAgICAgIGZyYWctPnJlYXNzZW1ibHkgPSBPUEVOU1NMX21hbGxvYyhiaXRtYXNrX2xlbik7Ci0gICAgICBpZiAoZnJhZy0+cmVhc3NlbWJseSA9PSBOVUxMKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwotICAgICAgICBnb3RvIGVycjsKLSAgICAgIH0KLSAgICAgIG1lbXNldChmcmFnLT5yZWFzc2VtYmx5LCAwLCBiaXRtYXNrX2xlbik7CisgIGlmIChmcmFnX2xlbikgeworICAgIGJ1ZiA9ICh1aW50OF90ICopT1BFTlNTTF9tYWxsb2MoZnJhZ19sZW4pOworICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkdGxzMV9obV9mcmFnbWVudF9uZXcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfZnJlZShmcmFnKTsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgfQogCi0gIHJldHVybiBmcmFnOworICAvKiB6ZXJvIGxlbmd0aCBmcmFnbWVudCBnZXRzIHplcm8gZnJhZy0+ZnJhZ21lbnQgKi8KKyAgZnJhZy0+ZnJhZ21lbnQgPSBidWY7CiAKLWVycjoKLSAgZHRsczFfaG1fZnJhZ21lbnRfZnJlZShmcmFnKTsKLSAgcmV0dXJuIE5VTEw7CisgIC8qIEluaXRpYWxpemUgcmVhc3NlbWJseSBiaXRtYXNrIGlmIG5lY2Vzc2FyeSAqLworICBpZiAocmVhc3NlbWJseSAmJiBmcmFnX2xlbiA+IDApIHsKKyAgICBpZiAoZnJhZ19sZW4gKyA3IDwgZnJhZ19sZW4pIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgZHRsczFfaG1fZnJhZ21lbnRfbmV3LCBFUlJfUl9PVkVSRkxPVyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2l6ZV90IGJpdG1hc2tfbGVuID0gKGZyYWdfbGVuICsgNykgLyA4OworICAgIGJpdG1hc2sgPSAodWludDhfdCAqKU9QRU5TU0xfbWFsbG9jKGJpdG1hc2tfbGVuKTsKKyAgICBpZiAoYml0bWFzayA9PSBOVUxMKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGR0bHMxX2htX2ZyYWdtZW50X25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgaWYgKGJ1ZiAhPSBOVUxMKSB7CisgICAgICAgIE9QRU5TU0xfZnJlZShidWYpOworICAgICAgfQorICAgICAgT1BFTlNTTF9mcmVlKGZyYWcpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbXNldChiaXRtYXNrLCAwLCBiaXRtYXNrX2xlbik7CisgIH0KKworICBmcmFnLT5yZWFzc2VtYmx5ID0gYml0bWFzazsKKworICByZXR1cm4gZnJhZzsKIH0KIAogdm9pZCBkdGxzMV9obV9mcmFnbWVudF9mcmVlKGhtX2ZyYWdtZW50ICpmcmFnKSB7CkBAIC0zMjAsNyArMzI2LDcgQEAKICAgICAgIGlmIChjdXJyX210dSA8PSBEVExTMV9ITV9IRUFERVJfTEVOR1RIKSB7CiAgICAgICAgIC8qIFRvIG1ha2UgZm9yd2FyZCBwcm9ncmVzcywgdGhlIE1UVSBtdXN0LCBhdCBtaW5pbXVtLCBmaXQgdGhlIGhhbmRzaGFrZQogICAgICAgICAgKiBoZWFkZXIgYW5kIG9uZSBieXRlIG9mIGhhbmRzaGFrZSBib2R5LiAqLwotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX01UVV9UT09fU01BTEwpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGR0bHMxX2RvX3dyaXRlLCBTU0xfUl9NVFVfVE9PX1NNQUxMKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgfQogCkBAIC0zMzgsNyArMzQ0LDcgQEAKICAgICAgIGFzc2VydCh0eXBlID09IFNTTDNfUlRfQ0hBTkdFX0NJUEhFUl9TUEVDKTsKICAgICAgIC8qIENoYW5nZUNpcGhlclNwZWMgY2Fubm90IGJlIGZyYWdtZW50ZWQuICovCiAgICAgICBpZiAocy0+aW5pdF9udW0gPiBjdXJyX210dSkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX01UVV9UT09fU01BTEwpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGR0bHMxX2RvX3dyaXRlLCBTU0xfUl9NVFVfVE9PX1NNQUxMKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgfQogICAgICAgbGVuID0gcy0+aW5pdF9udW07CkBAIC00NDQsNyArNDUwLDggQEAKICAgICAgICAgZnJhZy0+bXNnX2hlYWRlci5tc2dfbGVuICE9IG1zZ19oZHItPm1zZ19sZW4pIHsKICAgICAgIC8qIFRoZSBuZXcgZnJhZ21lbnQgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHByZXZpb3VzIGZyYWdtZW50cyBmcm9tCiAgICAgICAgKiB0aGlzIG1lc3NhZ2UuICovCi0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0ZSQUdNRU5UX01JU01BVENIKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgZHRsczFfZ2V0X2J1ZmZlcmVkX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9GUkFHTUVOVF9NSVNNQVRDSCk7CiAgICAgICBzc2wzX3NlbmRfYWxlcnQocywgU1NMM19BTF9GQVRBTCwgU1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSKTsKICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTQ2Niw3ICs0NzMsMTEgQEAKIC8qIGR0bHMxX3Byb2Nlc3NfZnJhZ21lbnQgcmVhZHMgYSBoYW5kc2hha2UgZnJhZ21lbnQgYW5kIHByb2Nlc3NlcyBpdC4gSXQKICAqIHJldHVybnMgb25lIGlmIGEgZnJhZ21lbnQgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgYW5kIDAgb3IgLTEgb24gZXJyb3IuICovCiBzdGF0aWMgaW50IGR0bHMxX3Byb2Nlc3NfZnJhZ21lbnQoU1NMICpzKSB7Ci0gIC8qIFJlYWQgaGFuZHNoYWtlIG1lc3NhZ2UgaGVhZGVyLiAqLworICAvKiBSZWFkIGhhbmRzaGFrZSBtZXNzYWdlIGhlYWRlci4KKyAgICoKKyAgICogVE9ETyhkYXZpZGJlbik6IHNzbF9yZWFkX2J5dGVzIGFsbG93cyBzcGxpdHRpbmcgdGhlIGZyYWdtZW50IGhlYWRlciBhbmQKKyAgICogYm9keSBhY3Jvc3MgdHdvIHJlY29yZHMuIENoYW5nZSB0aGlzIGludGVyZmFjZSB0byBjb25zdW1lIHRoZSBmcmFnbWVudCBpbgorICAgKiBvbmUgcGFzcy4gKi8KICAgdWludDhfdCBoZWFkZXJbRFRMUzFfSE1fSEVBREVSX0xFTkdUSF07CiAgIGludCByZXQgPSBkdGxzMV9yZWFkX2J5dGVzKHMsIFNTTDNfUlRfSEFORFNIQUtFLCBoZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERUTFMxX0hNX0hFQURFUl9MRU5HVEgsIDApOwpAQCAtNDc0LDcgKzQ4NSw3IEBACiAgICAgcmV0dXJuIHJldDsKICAgfQogICBpZiAocmV0ICE9IERUTFMxX0hNX0hFQURFUl9MRU5HVEgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1VORVhQRUNURURfTUVTU0FHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkdGxzMV9wcm9jZXNzX2ZyYWdtZW50LCBTU0xfUl9VTkVYUEVDVEVEX01FU1NBR0UpOwogICAgIHNzbDNfc2VuZF9hbGVydChzLCBTU0wzX0FMX0ZBVEFMLCBTU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFKTsKICAgICByZXR1cm4gLTE7CiAgIH0KQEAgLTQ4MywxNiArNDk0LDE0IEBACiAgIHN0cnVjdCBobV9oZWFkZXJfc3QgbXNnX2hkcjsKICAgZHRsczFfZ2V0X21lc3NhZ2VfaGVhZGVyKGhlYWRlciwgJm1zZ19oZHIpOwogCi0gIC8qIFRPRE8oZGF2aWRiZW4pOiBkdGxzMV9yZWFkX2J5dGVzIGlzIHRoZSB3cm9uZyBhYnN0cmFjdGlvbiBmb3IgRFRMUy4gVGhlcmUKLSAgICogc2hvdWxkIGJlIG5vIG5lZWQgdG8gcmVhY2ggaW50byB8cy0+czMtPnJyZWMubGVuZ3RofC4gKi8KICAgY29uc3Qgc2l6ZV90IGZyYWdfb2ZmID0gbXNnX2hkci5mcmFnX29mZjsKICAgY29uc3Qgc2l6ZV90IGZyYWdfbGVuID0gbXNnX2hkci5mcmFnX2xlbjsKICAgY29uc3Qgc2l6ZV90IG1zZ19sZW4gPSBtc2dfaGRyLm1zZ19sZW47CiAgIGlmIChmcmFnX29mZiA+IG1zZ19sZW4gfHwgZnJhZ19vZmYgKyBmcmFnX2xlbiA8IGZyYWdfb2ZmIHx8CiAgICAgICBmcmFnX29mZiArIGZyYWdfbGVuID4gbXNnX2xlbiB8fAotICAgICAgbXNnX2xlbiA+IGR0bHMxX21heF9oYW5kc2hha2VfbWVzc2FnZV9sZW4ocykgfHwKLSAgICAgIGZyYWdfbGVuID4gcy0+czMtPnJyZWMubGVuZ3RoKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9FWENFU1NJVkVfTUVTU0FHRV9TSVpFKTsKKyAgICAgIG1zZ19sZW4gPiBkdGxzMV9tYXhfaGFuZHNoYWtlX21lc3NhZ2VfbGVuKHMpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkdGxzMV9wcm9jZXNzX2ZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX0VYQ0VTU0lWRV9NRVNTQUdFX1NJWkUpOwogICAgIHNzbDNfc2VuZF9hbGVydChzLCBTU0wzX0FMX0ZBVEFMLCBTU0xfQURfSUxMRUdBTF9QQVJBTUVURVIpOwogICAgIHJldHVybiAtMTsKICAgfQpAQCAtNTI2LDggKzUzNSw4IEBACiAgIHJldCA9IGR0bHMxX3JlYWRfYnl0ZXMocywgU1NMM19SVF9IQU5EU0hBS0UsIGZyYWctPmZyYWdtZW50ICsgZnJhZ19vZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ19sZW4sIDApOwogICBpZiAocmV0ICE9IGZyYWdfbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7Ci0gICAgc3NsM19zZW5kX2FsZXJ0KHMsIFNTTDNfQUxfRkFUQUwsIFNTTF9BRF9JTlRFUk5BTF9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkdGxzMV9wcm9jZXNzX2ZyYWdtZW50LCBTU0xfUl9VTkVYUEVDVEVEX01FU1NBR0UpOworICAgIHNzbDNfc2VuZF9hbGVydChzLCBTU0wzX0FMX0ZBVEFMLCBTU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFKTsKICAgICByZXR1cm4gLTE7CiAgIH0KICAgZHRsczFfaG1fZnJhZ21lbnRfbWFyayhmcmFnLCBmcmFnX29mZiwgZnJhZ19vZmYgKyBmcmFnX2xlbik7CkBAIC01NTQsNyArNTYzLDcgQEAKICAgICBzLT5zMy0+dG1wLnJldXNlX21lc3NhZ2UgPSAwOwogICAgIGlmIChtc2dfdHlwZSA+PSAwICYmIHMtPnMzLT50bXAubWVzc2FnZV90eXBlICE9IG1zZ190eXBlKSB7CiAgICAgICBhbCA9IFNTTF9BRF9VTkVYUEVDVEVEX01FU1NBR0U7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1VORVhQRUNURURfTUVTU0FHRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGR0bHMxX2dldF9tZXNzYWdlLCBTU0xfUl9VTkVYUEVDVEVEX01FU1NBR0UpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAgICAgKm9rID0gMTsKQEAgLTU4MCwxOSArNTg5LDIyIEBACiAgIGFzc2VydChmcmFnLT5yZWFzc2VtYmx5ID09IE5VTEwpOwogCiAgIGlmIChmcmFnLT5tc2dfaGVhZGVyLm1zZ19sZW4gPiAoc2l6ZV90KW1heCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfRVhDRVNTSVZFX01FU1NBR0VfU0laRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkdGxzMV9nZXRfbWVzc2FnZSwgU1NMX1JfRVhDRVNTSVZFX01FU1NBR0VfU0laRSk7CisgICAgZ290byBlcnI7CisgIH0KKworICBDQkIgY2JiOworICBpZiAoIUJVRl9NRU1fZ3JvdyhzLT5pbml0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgKHNpemVfdClmcmFnLT5tc2dfaGVhZGVyLm1zZ19sZW4gKworICAgICAgICAgICAgICAgICAgICBEVExTMV9ITV9IRUFERVJfTEVOR1RIKSB8fAorICAgICAgIUNCQl9pbml0X2ZpeGVkKCZjYmIsICh1aW50OF90ICopcy0+aW5pdF9idWYtPmRhdGEsIHMtPmluaXRfYnVmLT5tYXgpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkdGxzMV9nZXRfbWVzc2FnZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgLyogUmVjb25zdHJ1Y3QgdGhlIGFzc2VtYmxlZCBtZXNzYWdlLiAqLwogICBzaXplX3QgbGVuOwotICBDQkIgY2JiOwotICBDQkJfemVybygmY2JiKTsKLSAgaWYgKCFCVUZfTUVNX2dyb3cocy0+aW5pdF9idWYsCi0gICAgICAgICAgICAgICAgICAgIChzaXplX3QpZnJhZy0+bXNnX2hlYWRlci5tc2dfbGVuICsKLSAgICAgICAgICAgICAgICAgICAgRFRMUzFfSE1fSEVBREVSX0xFTkdUSCkgfHwKLSAgICAgICFDQkJfaW5pdF9maXhlZCgmY2JiLCAodWludDhfdCAqKXMtPmluaXRfYnVmLT5kYXRhLCBzLT5pbml0X2J1Zi0+bWF4KSB8fAotICAgICAgIUNCQl9hZGRfdTgoJmNiYiwgZnJhZy0+bXNnX2hlYWRlci50eXBlKSB8fAorICBpZiAoIUNCQl9hZGRfdTgoJmNiYiwgZnJhZy0+bXNnX2hlYWRlci50eXBlKSB8fAogICAgICAgIUNCQl9hZGRfdTI0KCZjYmIsIGZyYWctPm1zZ19oZWFkZXIubXNnX2xlbikgfHwKICAgICAgICFDQkJfYWRkX3UxNigmY2JiLCBmcmFnLT5tc2dfaGVhZGVyLnNlcSkgfHwKICAgICAgICFDQkJfYWRkX3UyNCgmY2JiLCAwIC8qIGZyYWdfb2ZmICovKSB8fApAQCAtNjAwLDcgKzYxMiw3IEBACiAgICAgICAhQ0JCX2FkZF9ieXRlcygmY2JiLCBmcmFnLT5mcmFnbWVudCwgZnJhZy0+bXNnX2hlYWRlci5tc2dfbGVuKSB8fAogICAgICAgIUNCQl9maW5pc2goJmNiYiwgTlVMTCwgJmxlbikpIHsKICAgICBDQkJfY2xlYW51cCgmY2JiKTsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGR0bHMxX2dldF9tZXNzYWdlLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgYXNzZXJ0KGxlbiA9PSAoc2l6ZV90KWZyYWctPm1zZ19oZWFkZXIubXNnX2xlbiArIERUTFMxX0hNX0hFQURFUl9MRU5HVEgpOwpAQCAtNjE2LDcgKzYyOCw3IEBACiAKICAgaWYgKG1zZ190eXBlID49IDAgJiYgcy0+czMtPnRtcC5tZXNzYWdlX3R5cGUgIT0gbXNnX3R5cGUpIHsKICAgICBhbCA9IFNTTF9BRF9VTkVYUEVDVEVEX01FU1NBR0U7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9VTkVYUEVDVEVEX01FU1NBR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgZHRsczFfZ2V0X21lc3NhZ2UsIFNTTF9SX1VORVhQRUNURURfTUVTU0FHRSk7CiAgICAgZ290byBmX2VycjsKICAgfQogICBpZiAoaGFzaF9tZXNzYWdlID09IHNzbF9oYXNoX21lc3NhZ2UgJiYgIXNzbDNfaGFzaF9jdXJyZW50X21lc3NhZ2UocykpIHsKZGlmZiAtLWdpdCBhL3NyYy9zc2wvZDFfY2xudC5jIGIvc3JjL3NzbC9kMV9jbG50LmMKaW5kZXggNzNhM2Y4YS4uOTJmYjhmNiAxMDA2NDQKLS0tIGEvc3JjL3NzbC9kMV9jbG50LmMKKysrIGIvc3JjL3NzbC9kMV9jbG50LmMKQEAgLTExMiw4ICsxMTIsNiBAQAogICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KICAqLwogCi0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KLQogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC0xMzAsNyArMTI4LDYgQEAKIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAKLQogc3RhdGljIGludCBkdGxzMV9nZXRfaGVsbG9fdmVyaWZ5KFNTTCAqcyk7CiAKIGludCBkdGxzMV9jb25uZWN0KFNTTCAqcykgewpAQCAtMTkxLDggKzE4OCw5IEBACiAgICAgICBjYXNlIFNTTDNfU1RfQ1dfQ0xOVF9IRUxMT19COgogICAgICAgICBzLT5zaHV0ZG93biA9IDA7CiAKLSAgICAgICAgaWYgKCFzc2wzX2luaXRfaGFuZHNoYWtlX2J1ZmZlcihzKSkgewotICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICAvKiBldmVyeSBEVExTIENsaWVudEhlbGxvIHJlc2V0cyBGaW5pc2hlZCBNQUMgKi8KKyAgICAgICAgaWYgKCFzc2wzX2luaXRfZmluaXNoZWRfbWFjKHMpKSB7CisgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkdGxzMV9jb25uZWN0LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICAgICAgcmV0ID0gLTE7CiAgICAgICAgICAgZ290byBlbmQ7CiAgICAgICAgIH0KQEAgLTI2Myw3ICsyNjEsNyBAQAogICAgICAgICAgIGlmIChzLT5zMy0+dG1wLmNlcnRpZmljYXRlX3N0YXR1c19leHBlY3RlZCkgewogICAgICAgICAgICAgcy0+c3RhdGUgPSBTU0wzX1NUX0NSX0NFUlRfU1RBVFVTX0E7CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHMtPnN0YXRlID0gU1NMM19TVF9WRVJJRllfU0VSVkVSX0NFUlQ7CisgICAgICAgICAgICBzLT5zdGF0ZSA9IFNTTDNfU1RfQ1JfS0VZX0VYQ0hfQTsKICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgc2tpcCA9IDE7CkBAIC0yNzIsMTYgKzI3MCw2IEBACiAgICAgICAgIHMtPmluaXRfbnVtID0gMDsKICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgU1NMM19TVF9WRVJJRllfU0VSVkVSX0NFUlQ6Ci0gICAgICAgIHJldCA9IHNzbDNfdmVyaWZ5X3NlcnZlcl9jZXJ0KHMpOwotICAgICAgICBpZiAocmV0IDw9IDApIHsKLSAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgfQotCi0gICAgICAgIHMtPnN0YXRlID0gU1NMM19TVF9DUl9LRVlfRVhDSF9BOwotICAgICAgICBzLT5pbml0X251bSA9IDA7Ci0gICAgICAgIGJyZWFrOwotCiAgICAgICBjYXNlIFNTTDNfU1RfQ1JfS0VZX0VYQ0hfQToKICAgICAgIGNhc2UgU1NMM19TVF9DUl9LRVlfRVhDSF9COgogICAgICAgICByZXQgPSBzc2wzX2dldF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlKHMpOwpAQCAtMjkwLDYgKzI3OCwxMyBAQAogICAgICAgICB9CiAgICAgICAgIHMtPnN0YXRlID0gU1NMM19TVF9DUl9DRVJUX1JFUV9BOwogICAgICAgICBzLT5pbml0X251bSA9IDA7CisKKyAgICAgICAgLyogYXQgdGhpcyBwb2ludCB3ZSBjaGVjayB0aGF0IHdlIGhhdmUgdGhlCisgICAgICAgICAqIHJlcXVpcmVkIHN0dWZmIGZyb20gdGhlIHNlcnZlciAqLworICAgICAgICBpZiAoIXNzbDNfY2hlY2tfY2VydF9hbmRfYWxnb3JpdGhtKHMpKSB7CisgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKICAgICAgIGNhc2UgU1NMM19TVF9DUl9DRVJUX1JFUV9BOgpAQCAtNDMxLDcgKzQyNiw3IEBACiAgICAgICAgIGlmIChyZXQgPD0gMCkgewogICAgICAgICAgIGdvdG8gZW5kOwogICAgICAgICB9Ci0gICAgICAgIHMtPnN0YXRlID0gU1NMM19TVF9WRVJJRllfU0VSVkVSX0NFUlQ7CisgICAgICAgIHMtPnN0YXRlID0gU1NMM19TVF9DUl9LRVlfRVhDSF9BOwogICAgICAgICBzLT5pbml0X251bSA9IDA7CiAgICAgICAgIGJyZWFrOwogCkBAIC00ODgsNyArNDgzLDcgQEAKICAgICAgICAgZ290byBlbmQ7CiAKICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfVU5LTk9XTl9TVEFURSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgZHRsczFfY29ubmVjdCwgU1NMX1JfVU5LTk9XTl9TVEFURSk7CiAgICAgICAgIHJldCA9IC0xOwogICAgICAgICBnb3RvIGVuZDsKICAgICB9CkBAIC01NDMsNyArNTM4LDcgQEAKICAgICAgICFDQlNfZ2V0X3U4X2xlbmd0aF9wcmVmaXhlZCgmaGVsbG9fdmVyaWZ5X3JlcXVlc3QsICZjb29raWUpIHx8CiAgICAgICBDQlNfbGVuKCZoZWxsb192ZXJpZnlfcmVxdWVzdCkgIT0gMCkgewogICAgIGFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0RFQ09ERV9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkdGxzMV9nZXRfaGVsbG9fdmVyaWZ5LCBTU0xfUl9ERUNPREVfRVJST1IpOwogICAgIGdvdG8gZl9lcnI7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3NzbC9kMV9saWIuYyBiL3NyYy9zc2wvZDFfbGliLmMKaW5kZXggY2I5NTU4NS4uZWY3YTljOSAxMDA2NDQKLS0tIGEvc3JjL3NzbC9kMV9saWIuYworKysgYi9zcmMvc3NsL2QxX2xpYi5jCkBAIC01NCwxOCArNTQsMTIgQEAKICAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KICAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLwogCi0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KIAogI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgotI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KLQotI2luY2x1ZGUgImludGVybmFsLmgiCi0KICNpZiBkZWZpbmVkKE9QRU5TU0xfV0lORE9XUykKICNpbmNsdWRlIDxzeXMvdGltZWIuaD4KICNlbHNlCkBAIC03Myw2ICs2NywxMSBAQAogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjZW5kaWYKIAorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogLyogRFRMUzFfTVRVX1RJTUVPVVRTIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lb3V0cyB0byBleHBpcmUKICAqIGJlZm9yZSBzdGFydGluZyB0byBkZWNyZWFzZSB0aGUgTVRVLiAqLwpAQCAtMTUzLDkgKzE1Miw4IEBACiB9CiAKIGludCBkdGxzMV9zdXBwb3J0c19jaXBoZXIoY29uc3QgU1NMX0NJUEhFUiAqY2lwaGVyKSB7Ci0gIC8qIERUTFMgZG9lcyBub3Qgc3VwcG9ydCBzdHJlYW0gY2lwaGVycy4gVGhlIE5VTEwgY2lwaGVyIGlzIHJlamVjdGVkIGJlY2F1c2UKLSAgICogaXQncyBub3QgbmVlZGVkLiAqLwotICByZXR1cm4gY2lwaGVyLT5hbGdvcml0aG1fZW5jICE9IFNTTF9SQzQgJiYgY2lwaGVyLT5hbGdvcml0aG1fZW5jICE9IFNTTF9lTlVMTDsKKyAgLyogRFRMUyBkb2VzIG5vdCBzdXBwb3J0IHN0cmVhbSBjaXBoZXJzLiAqLworICByZXR1cm4gY2lwaGVyLT5hbGdvcml0aG1fZW5jICE9IFNTTF9SQzQ7CiB9CiAKIHZvaWQgZHRsczFfc3RhcnRfdGltZXIoU1NMICpzKSB7CkBAIC0yNjQsNyArMjYyLDcgQEAKIAogICBpZiAocy0+ZDEtPm51bV90aW1lb3V0cyA+IERUTFMxX01BWF9USU1FT1VUUykgewogICAgIC8qIGZhaWwgdGhlIGNvbm5lY3Rpb24sIGVub3VnaCBhbGVydHMgaGF2ZSBiZWVuIHNlbnQgKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1JFQURfVElNRU9VVF9FWFBJUkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGR0bHMxX2NoZWNrX3RpbWVvdXRfbnVtLCBTU0xfUl9SRUFEX1RJTUVPVVRfRVhQSVJFRCk7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKQEAgLTMzMCw5ICszMjgsOCBAQAogICBzMm4obXNnX2hkci0+c2VxLCBwKTsKICAgbDJuMygwLCBwKTsKICAgbDJuMyhtc2dfaGRyLT5tc2dfbGVuLCBwKTsKLSAgcmV0dXJuIHNzbDNfdXBkYXRlX2hhbmRzaGFrZV9oYXNoKHMsIHNlcmlhbGlzZWRfaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNlcmlhbGlzZWRfaGVhZGVyKSkgJiYKLSAgICAgICAgIHNzbDNfdXBkYXRlX2hhbmRzaGFrZV9oYXNoKHMsIG1lc3NhZ2UgKyBEVExTMV9ITV9IRUFERVJfTEVOR1RILCBsZW4pOworICByZXR1cm4gc3NsM19maW5pc2hfbWFjKHMsIHNlcmlhbGlzZWRfaGVhZGVyLCBzaXplb2Yoc2VyaWFsaXNlZF9oZWFkZXIpKSAmJgorICAgICAgICAgc3NsM19maW5pc2hfbWFjKHMsIG1lc3NhZ2UgKyBEVExTMV9ITV9IRUFERVJfTEVOR1RILCBsZW4pOwogfQogCiBpbnQgZHRsczFfaGFuZHNoYWtlX3dyaXRlKFNTTCAqcykgewpkaWZmIC0tZ2l0IGEvc3JjL3NzbC9kMV9tZXRoLmMgYi9zcmMvc3NsL2QxX21ldGguYwppbmRleCBkNTRhMDM3Li5kOTBmNzViIDEwMDY0NAotLS0gYS9zcmMvc3NsL2QxX21ldGguYworKysgYi9zcmMvc3NsL2QxX21ldGguYwpAQCAtNTUsOCArNTUsNiBAQAogICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQogICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCiAKLSNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgotCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogCkBAIC03MSw2ICs2OSw4IEBACiAgICAgZHRsczFfcmVhZF9jbG9zZV9ub3RpZnksCiAgICAgZHRsczFfd3JpdGVfYXBwX2RhdGEsCiAgICAgZHRsczFfZGlzcGF0Y2hfYWxlcnQsCisgICAgc3NsM19jdHJsLAorICAgIHNzbDNfY3R4X2N0cmwsCiAgICAgZHRsczFfc3VwcG9ydHNfY2lwaGVyLAogICAgIERUTFMxX0hNX0hFQURFUl9MRU5HVEgsCiAgICAgZHRsczFfc2V0X2hhbmRzaGFrZV9oZWFkZXIsCmRpZmYgLS1naXQgYS9zcmMvc3NsL2QxX3BrdC5jIGIvc3JjL3NzbC9kMV9wa3QuYwppbmRleCBlMmQ1MDVjLi41NTM0OTlmIDEwMDY0NAotLS0gYS9zcmMvc3NsL2QxX3BrdC5jCisrKyBiL3NyYy9zc2wvZDFfcGt0LmMKQEAgLTEwOSw4ICsxMDksNiBAQAogICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQogICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KIAotI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+Ci0KICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMTI0LDY2ICsxMjIsMjcwIEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogCisvKiBtb2QgMTI4IHNhdHVyYXRpbmcgc3VidHJhY3Qgb2YgdHdvIDY0LWJpdCB2YWx1ZXMgaW4gYmlnLWVuZGlhbiBvcmRlciAqLworc3RhdGljIGludCBzYXRzdWI2NGJlKGNvbnN0IHVpbnQ4X3QgKnYxLCBjb25zdCB1aW50OF90ICp2MikgeworICBpbnQgcmV0LCBzYXQsIGJydywgaTsKKworICBpZiAoc2l6ZW9mKGxvbmcpID09IDgpIHsKKyAgICBkbyB7CisgICAgICBjb25zdCB1bmlvbiB7CisgICAgICAgIGxvbmcgb25lOworICAgICAgICBjaGFyIGxpdHRsZTsKKyAgICAgIH0gaXNfZW5kaWFuID0gezF9OworICAgICAgbG9uZyBsOworCisgICAgICBpZiAoaXNfZW5kaWFuLmxpdHRsZSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8qIG5vdCByZWFjaGVkIG9uIGxpdHRsZS1lbmRpYW5zICovCisgICAgICAvKiBmb2xsb3dpbmcgdGVzdCBpcyByZWR1bmRhbnQsIGJlY2F1c2UgaW5wdXQgaXMKKyAgICAgICAqIGFsd2F5cyBhbGlnbmVkLCBidXQgSSB0YWtlIG5vIGNoYW5jZXMuLi4gKi8KKyAgICAgIGlmICgoKHNpemVfdCl2MSB8IChzaXplX3QpdjIpICYgMHg3KSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBsID0gKigobG9uZyAqKXYxKTsKKyAgICAgIGwgLT0gKigobG9uZyAqKXYyKTsKKyAgICAgIGlmIChsID4gMTI4KSB7CisgICAgICAgIHJldHVybiAxMjg7CisgICAgICB9IGVsc2UgaWYgKGwgPCAtMTI4KSB7CisgICAgICAgIHJldHVybiAtMTI4OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChpbnQpbDsKKyAgICAgIH0KKyAgICB9IHdoaWxlICgwKTsKKyAgfQorCisgIHJldCA9IChpbnQpdjFbN10gLSAoaW50KXYyWzddOworICBzYXQgPSAwOworICBicncgPSByZXQgPj4gODsgLyogYnJ3IGlzIGVpdGhlciAwIG9yIC0xICovCisgIGlmIChyZXQgJiAweDgwKSB7CisgICAgZm9yIChpID0gNjsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIGJydyArPSAoaW50KXYxW2ldIC0gKGludCl2MltpXTsKKyAgICAgIHNhdCB8PSB+YnJ3OworICAgICAgYnJ3ID4+PSA4OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSA2OyBpID49IDA7IGktLSkgeworICAgICAgYnJ3ICs9IChpbnQpdjFbaV0gLSAoaW50KXYyW2ldOworICAgICAgc2F0IHw9IGJydzsKKyAgICAgIGJydyA+Pj0gODsKKyAgICB9CisgIH0KKyAgYnJ3IDw8PSA4OyAvKiBicncgaXMgZWl0aGVyIDAgb3IgLTI1NiAqLworCisgIGlmIChzYXQgJiAweGZmKSB7CisgICAgcmV0dXJuIGJydyB8IDB4ODA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGJydyArIChyZXQgJiAweEZGKTsKKyAgfQorfQorCitzdGF0aWMgaW50IGR0bHMxX3JlY29yZF9yZXBsYXlfY2hlY2soU1NMICpzLCBEVExTMV9CSVRNQVAgKmJpdG1hcCk7CitzdGF0aWMgdm9pZCBkdGxzMV9yZWNvcmRfYml0bWFwX3VwZGF0ZShTU0wgKnMsIERUTFMxX0JJVE1BUCAqYml0bWFwKTsKK3N0YXRpYyBpbnQgZHRsczFfcHJvY2Vzc19yZWNvcmQoU1NMICpzKTsKIHN0YXRpYyBpbnQgZG9fZHRsczFfd3JpdGUoU1NMICpzLCBpbnQgdHlwZSwgY29uc3QgdWludDhfdCAqYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuLCBlbnVtIGR0bHMxX3VzZV9lcG9jaF90IHVzZV9lcG9jaCk7CiAKLS8qIGR0bHMxX2dldF9yZWNvcmQgcmVhZHMgYSBuZXcgaW5wdXQgcmVjb3JkLiBPbiBzdWNjZXNzLCBpdCBwbGFjZXMgaXQgaW4KLSAqIHxzc2wtPnMzLT5ycmVjfCBhbmQgcmV0dXJucyBvbmUuIE90aGVyd2lzZSBpdCByZXR1cm5zIDw9IDAgb24gZXJyb3Igb3IgaWYKLSAqIG1vcmUgZGF0YSBpcyBuZWVkZWQuICovCi1zdGF0aWMgaW50IGR0bHMxX2dldF9yZWNvcmQoU1NMICpzc2wpIHsKLWFnYWluOgotICAvKiBSZWFkIGEgbmV3IHBhY2tldCBpZiB0aGVyZSBpcyBubyB1bmNvbnN1bWVkIG9uZS4gKi8KLSAgaWYgKHNzbF9yZWFkX2J1ZmZlcl9sZW4oc3NsKSA9PSAwKSB7Ci0gICAgaW50IHJldCA9IHNzbF9yZWFkX2J1ZmZlcl9leHRlbmRfdG8oc3NsLCAwIC8qIHVudXNlZCAqLyk7Ci0gICAgaWYgKHJldCA8PSAwKSB7Ci0gICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgfQotICBhc3NlcnQoc3NsX3JlYWRfYnVmZmVyX2xlbihzc2wpID4gMCk7CitzdGF0aWMgaW50IGR0bHMxX3Byb2Nlc3NfcmVjb3JkKFNTTCAqcykgeworICBpbnQgYWw7CisgIFNTTDNfUkVDT1JEICpyciA9ICZzLT5zMy0+cnJlYzsKIAotICAvKiBFbnN1cmUgdGhlIHBhY2tldCBpcyBsYXJnZSBlbm91Z2ggdG8gZGVjcnlwdCBpbi1wbGFjZS4gKi8KLSAgaWYgKHNzbF9yZWFkX2J1ZmZlcl9sZW4oc3NsKSA8IHNzbF9yZWNvcmRfcHJlZml4X2xlbihzc2wpKSB7Ci0gICAgc3NsX3JlYWRfYnVmZmVyX2NsZWFyKHNzbCk7CisgIC8qIGNoZWNrIGlzIG5vdCBuZWVkZWQgSSBiZWxpZXZlICovCisgIGlmIChyci0+bGVuZ3RoID4gU1NMM19SVF9NQVhfRU5DUllQVEVEX0xFTkdUSCkgeworICAgIGFsID0gU1NMX0FEX1JFQ09SRF9PVkVSRkxPVzsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGR0bHMxX3Byb2Nlc3NfcmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX0VOQ1JZUFRFRF9MRU5HVEhfVE9PX0xPTkcpOworICAgIGdvdG8gZl9lcnI7CisgIH0KKworICAvKiB8cnItPmRhdGF8IHBvaW50cyB0byB8cnItPmxlbmd0aHwgYnl0ZXMgb2YgY2lwaGVydGV4dCBpbiB8cy0+cGFja2V0fC4gKi8KKyAgcnItPmRhdGEgPSAmcy0+cGFja2V0W0RUTFMxX1JUX0hFQURFUl9MRU5HVEhdOworCisgIHVpbnQ4X3Qgc2VxWzhdOworICBzZXFbMF0gPSByci0+ZXBvY2ggPj4gODsKKyAgc2VxWzFdID0gcnItPmVwb2NoICYgMHhmZjsKKyAgbWVtY3B5KCZzZXFbMl0sICZyci0+c2VxX251bVsyXSwgNik7CisKKyAgLyogRGVjcnlwdCB0aGUgcGFja2V0IGluLXBsYWNlLiBOb3RlIGl0IGlzIGltcG9ydGFudCB0aGF0IHxTU0xfQUVBRF9DVFhfb3BlbnwKKyAgICogbm90IHdyaXRlIGJleW9uZCB8cnItPmxlbmd0aHwuIFRoZXJlIG1heSBiZSBhbm90aGVyIHJlY29yZCBpbiB0aGUgcGFja2V0LgorICAgKgorICAgKiBUT0RPKGRhdmlkYmVuKTogVGhpcyBhc3N1bWVzIHxzLT52ZXJzaW9ufCBpcyB0aGUgc2FtZSBhcyB0aGUgcmVjb3JkLWxheWVyCisgICAqIHZlcnNpb24gd2hpY2ggaXNuJ3QgYWx3YXlzIHRydWUsIGJ1dCBpdCBvbmx5IGRpZmZlcnMgd2l0aCB0aGUgTlVMTCBjaXBoZXIKKyAgICogd2hpY2ggaWdub3JlcyB0aGUgcGFyYW1ldGVyLiAqLworICBzaXplX3QgcGxhaW50ZXh0X2xlbjsKKyAgaWYgKCFTU0xfQUVBRF9DVFhfb3BlbihzLT5hZWFkX3JlYWRfY3R4LCByci0+ZGF0YSwgJnBsYWludGV4dF9sZW4sIHJyLT5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgcnItPnR5cGUsIHMtPnZlcnNpb24sIHNlcSwgcnItPmRhdGEsIHJyLT5sZW5ndGgpKSB7CisgICAgLyogQmFkIHBhY2tldHMgYXJlIHNpbGVudGx5IGRyb3BwZWQgaW4gRFRMUy4gQ2xlYXIgdGhlIGVycm9yIHF1ZXVlIG9mIGFueQorICAgICAqIGVycm9ycyBkZWNyeXB0aW9uIG1heSBoYXZlIGFkZGVkLiAqLworICAgIEVSUl9jbGVhcl9lcnJvcigpOworICAgIHJyLT5sZW5ndGggPSAwOworICAgIHMtPnBhY2tldF9sZW5ndGggPSAwOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKHBsYWludGV4dF9sZW4gPiBTU0wzX1JUX01BWF9QTEFJTl9MRU5HVEgpIHsKKyAgICBhbCA9IFNTTF9BRF9SRUNPUkRfT1ZFUkZMT1c7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkdGxzMV9wcm9jZXNzX3JlY29yZCwgU1NMX1JfREFUQV9MRU5HVEhfVE9PX0xPTkcpOworICAgIGdvdG8gZl9lcnI7CisgIH0KKyAgYXNzZXJ0KHBsYWludGV4dF9sZW4gPCAoMXUgPDwgMTYpKTsKKyAgcnItPmxlbmd0aCA9IHBsYWludGV4dF9sZW47CisKKyAgcnItPm9mZiA9IDA7CisgIC8qIFNvIGF0IHRoaXMgcG9pbnQgdGhlIGZvbGxvd2luZyBpcyB0cnVlCisgICAqIHNzbC0+czMtPnJyZWMudHlwZSAJaXMgdGhlIHR5cGUgb2YgcmVjb3JkCisgICAqIHNzbC0+czMtPnJyZWMubGVuZ3RoCT09IG51bWJlciBvZiBieXRlcyBpbiByZWNvcmQKKyAgICogc3NsLT5zMy0+cnJlYy5vZmYJPT0gb2Zmc2V0IHRvIGZpcnN0IHZhbGlkIGJ5dGUKKyAgICogc3NsLT5zMy0+cnJlYy5kYXRhCT09IHRoZSBmaXJzdCBieXRlIG9mIHRoZSByZWNvcmQgYm9keS4gKi8KKworICAvKiB3ZSBoYXZlIHB1bGxlZCBpbiBhIGZ1bGwgcGFja2V0IHNvIHplcm8gdGhpbmdzICovCisgIHMtPnBhY2tldF9sZW5ndGggPSAwOworICByZXR1cm4gMTsKKworZl9lcnI6CisgIHNzbDNfc2VuZF9hbGVydChzLCBTU0wzX0FMX0ZBVEFMLCBhbCk7CisKK2VycjoKKyAgcmV0dXJuIDA7Cit9CisKKy8qIENhbGwgdGhpcyB0byBnZXQgYSBuZXcgaW5wdXQgcmVjb3JkLgorICogSXQgd2lsbCByZXR1cm4gPD0gMCBpZiBtb3JlIGRhdGEgaXMgbmVlZGVkLCBub3JtYWxseSBkdWUgdG8gYW4gZXJyb3IKKyAqIG9yIG5vbi1ibG9ja2luZyBJTy4KKyAqIFdoZW4gaXQgZmluaXNoZXMsIG9uZSBwYWNrZXQgaGFzIGJlZW4gZGVjb2RlZCBhbmQgY2FuIGJlIGZvdW5kIGluCisgKiBzc2wtPnMzLT5ycmVjLnR5cGUgICAgLSBpcyB0aGUgdHlwZSBvZiByZWNvcmQKKyAqIHNzbC0+czMtPnJyZWMuZGF0YSwgICAtIGRhdGEKKyAqIHNzbC0+czMtPnJyZWMubGVuZ3RoLCAtIG51bWJlciBvZiBieXRlcworICoKKyAqIHVzZWQgb25seSBieSBkdGxzMV9yZWFkX2J5dGVzICovCitpbnQgZHRsczFfZ2V0X3JlY29yZChTU0wgKnMpIHsKKyAgdWludDhfdCBzc2xfbWFqb3IsIHNzbF9taW5vcjsKKyAgaW50IG47CisgIFNTTDNfUkVDT1JEICpycjsKKyAgdWludDhfdCAqcCA9IE5VTEw7CisgIHVpbnQxNl90IHZlcnNpb247CisKKyAgcnIgPSAmKHMtPnMzLT5ycmVjKTsKKworICAvKiBnZXQgc29tZXRoaW5nIGZyb20gdGhlIHdpcmUgKi8KK2FnYWluOgorICAvKiBjaGVjayBpZiB3ZSBoYXZlIHRoZSBoZWFkZXIgKi8KKyAgaWYgKChzLT5yc3RhdGUgIT0gU1NMX1NUX1JFQURfQk9EWSkgfHwKKyAgICAgIChzLT5wYWNrZXRfbGVuZ3RoIDwgRFRMUzFfUlRfSEVBREVSX0xFTkdUSCkpIHsKKyAgICBuID0gc3NsM19yZWFkX24ocywgRFRMUzFfUlRfSEVBREVSX0xFTkdUSCwgMCk7CisgICAgLyogcmVhZCB0aW1lb3V0IGlzIGhhbmRsZWQgYnkgZHRsczFfcmVhZF9ieXRlcyAqLworICAgIGlmIChuIDw9IDApIHsKKyAgICAgIHJldHVybiBuOyAvKiBlcnJvciBvciBub24tYmxvY2tpbmcgKi8KKyAgICB9CisKKyAgICAvKiB0aGlzIHBhY2tldCBjb250YWluZWQgYSBwYXJ0aWFsIHJlY29yZCwgZHVtcCBpdCAqLworICAgIGlmIChzLT5wYWNrZXRfbGVuZ3RoICE9IERUTFMxX1JUX0hFQURFUl9MRU5HVEgpIHsKKyAgICAgIHMtPnBhY2tldF9sZW5ndGggPSAwOworICAgICAgZ290byBhZ2FpbjsKKyAgICB9CisKKyAgICBzLT5yc3RhdGUgPSBTU0xfU1RfUkVBRF9CT0RZOworCisgICAgcCA9IHMtPnBhY2tldDsKKworICAgIGlmIChzLT5tc2dfY2FsbGJhY2spIHsKKyAgICAgIHMtPm1zZ19jYWxsYmFjaygwLCAwLCBTU0wzX1JUX0hFQURFUiwgcCwgRFRMUzFfUlRfSEVBREVSX0xFTkdUSCwgcywKKyAgICAgICAgICAgICAgICAgICAgICBzLT5tc2dfY2FsbGJhY2tfYXJnKTsKKyAgICB9CisKKyAgICAvKiBQdWxsIGFwYXJ0IHRoZSBoZWFkZXIgaW50byB0aGUgRFRMUzFfUkVDT1JEICovCisgICAgcnItPnR5cGUgPSAqKHArKyk7CisgICAgc3NsX21ham9yID0gKihwKyspOworICAgIHNzbF9taW5vciA9ICoocCsrKTsKKyAgICB2ZXJzaW9uID0gKCgodWludDE2X3Qpc3NsX21ham9yKSA8PCA4KSB8IHNzbF9taW5vcjsKKworICAgIC8qIHNlcXVlbmNlIG51bWJlciBpcyA2NCBiaXRzLCB3aXRoIHRvcCAyIGJ5dGVzID0gZXBvY2ggKi8KKyAgICBuMnMocCwgcnItPmVwb2NoKTsKKworICAgIG1lbWNweSgmKHMtPnMzLT5yZWFkX3NlcXVlbmNlWzJdKSwgcCwgNik7CisgICAgcCArPSA2OworCisgICAgbjJzKHAsIHJyLT5sZW5ndGgpOworCisgICAgLyogTGV0cyBjaGVjayB2ZXJzaW9uICovCisgICAgaWYgKHMtPnMzLT5oYXZlX3ZlcnNpb24pIHsKKyAgICAgIGlmICh2ZXJzaW9uICE9IHMtPnZlcnNpb24pIHsKKyAgICAgICAgLyogVGhlIHJlY29yZCdzIHZlcnNpb24gZG9lc24ndCBtYXRjaCwgc28gc2lsZW50bHkgZHJvcCBpdC4KKyAgICAgICAgICoKKyAgICAgICAgICogVE9ETyhkYXZpZGJlbik6IFRoaXMgZG9lc24ndCB3b3JrLiBUaGUgRFRMUyByZWNvcmQgbGF5ZXIgaXMgbm90CisgICAgICAgICAqIHBhY2tldC1iYXNlZCwgc28gdGhlIHJlbWFpbmRlciBvZiB0aGUgcGFja2V0IGlzbid0IGRyb3BwZWQgYW5kIHdlCisgICAgICAgICAqIGdldCBhIGZyYW1pbmcgZXJyb3IuIEl0J3MgYWxzbyB1bmNsZWFyIHdoYXQgaXQgbWVhbnMgdG8gc2lsZW50bHkKKyAgICAgICAgICogZHJvcCBhIHJlY29yZCBpbiBhIHBhY2tldCBjb250YWluaW5nIHR3byByZWNvcmRzLiAqLworICAgICAgICByci0+bGVuZ3RoID0gMDsKKyAgICAgICAgcy0+cGFja2V0X2xlbmd0aCA9IDA7CisgICAgICAgIGdvdG8gYWdhaW47CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCh2ZXJzaW9uICYgMHhmZjAwKSAhPSAocy0+dmVyc2lvbiAmIDB4ZmYwMCkpIHsKKyAgICAgIC8qIHdyb25nIHZlcnNpb24sIHNpbGVudGx5IGRpc2NhcmQgcmVjb3JkICovCisgICAgICByci0+bGVuZ3RoID0gMDsKKyAgICAgIHMtPnBhY2tldF9sZW5ndGggPSAwOworICAgICAgZ290byBhZ2FpbjsKKyAgICB9CisKKyAgICBpZiAocnItPmxlbmd0aCA+IFNTTDNfUlRfTUFYX0VOQ1JZUFRFRF9MRU5HVEgpIHsKKyAgICAgIC8qIHJlY29yZCB0b28gbG9uZywgc2lsZW50bHkgZGlzY2FyZCBpdCAqLworICAgICAgcnItPmxlbmd0aCA9IDA7CisgICAgICBzLT5wYWNrZXRfbGVuZ3RoID0gMDsKKyAgICAgIGdvdG8gYWdhaW47CisgICAgfQorCisgICAgLyogbm93IHMtPnJzdGF0ZSA9PSBTU0xfU1RfUkVBRF9CT0RZICovCisgIH0KKworICAvKiBzLT5yc3RhdGUgPT0gU1NMX1NUX1JFQURfQk9EWSwgZ2V0IGFuZCBkZWNvZGUgdGhlIGRhdGEgKi8KKworICBpZiAocnItPmxlbmd0aCA+IHMtPnBhY2tldF9sZW5ndGggLSBEVExTMV9SVF9IRUFERVJfTEVOR1RIKSB7CisgICAgLyogbm93IHMtPnBhY2tldF9sZW5ndGggPT0gRFRMUzFfUlRfSEVBREVSX0xFTkdUSCAqLworICAgIG4gPSBzc2wzX3JlYWRfbihzLCByci0+bGVuZ3RoLCAxKTsKKyAgICAvKiBUaGlzIHBhY2tldCBjb250YWluZWQgYSBwYXJ0aWFsIHJlY29yZCwgZHVtcCBpdC4gKi8KKyAgICBpZiAobiAhPSByci0+bGVuZ3RoKSB7CisgICAgICByci0+bGVuZ3RoID0gMDsKKyAgICAgIHMtPnBhY2tldF9sZW5ndGggPSAwOworICAgICAgZ290byBhZ2FpbjsKKyAgICB9CisKKyAgICAvKiBub3cgbiA9PSByci0+bGVuZ3RoLAorICAgICAqIGFuZCBzLT5wYWNrZXRfbGVuZ3RoID09IERUTFMxX1JUX0hFQURFUl9MRU5HVEggKyByci0+bGVuZ3RoICovCisgIH0KKyAgcy0+cnN0YXRlID0gU1NMX1NUX1JFQURfSEVBREVSOyAvKiBzZXQgc3RhdGUgZm9yIGxhdGVyIG9wZXJhdGlvbnMgKi8KKworICBpZiAocnItPmVwb2NoICE9IHMtPmQxLT5yX2Vwb2NoKSB7CisgICAgLyogVGhpcyByZWNvcmQgaXMgZnJvbSB0aGUgd3JvbmcgZXBvY2guIElmIGl0IGlzIHRoZSBuZXh0IGVwb2NoLCBpdCBjb3VsZCBiZQorICAgICAqIGJ1ZmZlcmVkLiBGb3Igc2ltcGxpY2l0eSwgZHJvcCBpdCBhbmQgZXhwZWN0IHJldHJhbnNtaXQgdG8gaGFuZGxlIGl0CisgICAgICogbGF0ZXI7IERUTFMgaXMgc3VwcG9zZWQgdG8gaGFuZGxlIHBhY2tldCBsb3NzLiAqLworICAgIHJyLT5sZW5ndGggPSAwOworICAgIHMtPnBhY2tldF9sZW5ndGggPSAwOwogICAgIGdvdG8gYWdhaW47CiAgIH0KIAotICB1aW50OF90ICpvdXQgPSBzc2xfcmVhZF9idWZmZXIoc3NsKSArIHNzbF9yZWNvcmRfcHJlZml4X2xlbihzc2wpOwotICBzaXplX3QgbWF4X291dCA9IHNzbF9yZWFkX2J1ZmZlcl9sZW4oc3NsKSAtIHNzbF9yZWNvcmRfcHJlZml4X2xlbihzc2wpOwotICB1aW50OF90IHR5cGUsIGFsZXJ0OwotICBzaXplX3QgbGVuLCBjb25zdW1lZDsKLSAgc3dpdGNoIChkdGxzX29wZW5fcmVjb3JkKHNzbCwgJnR5cGUsIG91dCwgJmxlbiwgJmNvbnN1bWVkLCAmYWxlcnQsIG1heF9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfcmVhZF9idWZmZXIoc3NsKSwgc3NsX3JlYWRfYnVmZmVyX2xlbihzc2wpKSkgewotICAgIGNhc2Ugc3NsX29wZW5fcmVjb3JkX3N1Y2Nlc3M6Ci0gICAgICBzc2xfcmVhZF9idWZmZXJfY29uc3VtZShzc2wsIGNvbnN1bWVkKTsKLQotICAgICAgaWYgKGxlbiA+IDB4ZmZmZikgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX09WRVJGTE9XKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotCi0gICAgICBTU0wzX1JFQ09SRCAqcnIgPSAmc3NsLT5zMy0+cnJlYzsKLSAgICAgIHJyLT50eXBlID0gdHlwZTsKLSAgICAgIHJyLT5sZW5ndGggPSAodWludDE2X3QpbGVuOwotICAgICAgcnItPm9mZiA9IDA7Ci0gICAgICByci0+ZGF0YSA9IG91dDsKLSAgICAgIHJldHVybiAxOwotCi0gICAgY2FzZSBzc2xfb3Blbl9yZWNvcmRfZGlzY2FyZDoKLSAgICAgIHNzbF9yZWFkX2J1ZmZlcl9jb25zdW1lKHNzbCwgY29uc3VtZWQpOwotICAgICAgZ290byBhZ2FpbjsKLQotICAgIGNhc2Ugc3NsX29wZW5fcmVjb3JkX2Vycm9yOgotICAgICAgc3NsM19zZW5kX2FsZXJ0KHNzbCwgU1NMM19BTF9GQVRBTCwgYWxlcnQpOwotICAgICAgcmV0dXJuIC0xOwotCi0gICAgY2FzZSBzc2xfb3Blbl9yZWNvcmRfcGFydGlhbDoKLSAgICAgIC8qIEltcG9zc2libGUgaW4gRFRMUy4gKi8KLSAgICAgIGJyZWFrOworICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYSByZXBlYXQsIG9yIGFnZWQgcmVjb3JkLiAqLworICBpZiAoIWR0bHMxX3JlY29yZF9yZXBsYXlfY2hlY2socywgJnMtPmQxLT5iaXRtYXApKSB7CisgICAgcnItPmxlbmd0aCA9IDA7CisgICAgcy0+cGFja2V0X2xlbmd0aCA9IDA7IC8qIGR1bXAgdGhpcyByZWNvcmQgKi8KKyAgICBnb3RvIGFnYWluOyAgICAgICAgICAgLyogZ2V0IGFub3RoZXIgcmVjb3JkICovCiAgIH0KIAotICBhc3NlcnQoMCk7Ci0gIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOwotICByZXR1cm4gLTE7CisgIC8qIGp1c3QgcmVhZCBhIDAgbGVuZ3RoIHBhY2tldCAqLworICBpZiAocnItPmxlbmd0aCA9PSAwKSB7CisgICAgZ290byBhZ2FpbjsKKyAgfQorCisgIGlmICghZHRsczFfcHJvY2Vzc19yZWNvcmQocykpIHsKKyAgICByci0+bGVuZ3RoID0gMDsKKyAgICBzLT5wYWNrZXRfbGVuZ3RoID0gMDsgLyogZHVtcCB0aGlzIHJlY29yZCAqLworICAgIGdvdG8gYWdhaW47ICAgICAgICAgICAvKiBnZXQgYW5vdGhlciByZWNvcmQgKi8KKyAgfQorICBkdGxzMV9yZWNvcmRfYml0bWFwX3VwZGF0ZShzLCAmcy0+ZDEtPmJpdG1hcCk7IC8qIE1hcmsgcmVjZWlwdCBvZiByZWNvcmQuICovCisKKyAgcmV0dXJuIDE7CiB9CiAKIGludCBkdGxzMV9yZWFkX2FwcF9kYXRhKFNTTCAqc3NsLCB1aW50OF90ICpidWYsIGludCBsZW4sIGludCBwZWVrKSB7CkBAIC0xOTEsMTEgKzM5Myw3IEBACiB9CiAKIHZvaWQgZHRsczFfcmVhZF9jbG9zZV9ub3RpZnkoU1NMICpzc2wpIHsKLSAgLyogQmlkaXJlY3Rpb25hbCBzaHV0ZG93biBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIGFuIHVub3JkZXJlZCB0cmFuc3BvcnQuIERUTFMKLSAgICogYWxlcnRzIGFsc28gYXJlbid0IGRlbGl2ZXJlZCByZWxpYWJseSwgc28gd2UgbWF5IGV2ZW4gdGltZSBvdXQgYmVjYXVzZSB0aGUKLSAgICogcGVlciBuZXZlciByZWNlaXZlZCBvdXIgY2xvc2Vfbm90aWZ5LiBSZXBvcnQgdG8gdGhlIGNhbGxlciB0aGF0IHRoZSBjaGFubmVsCi0gICAqIGhhcyBmdWxseSBzaHV0IGRvd24uICovCi0gIHNzbC0+c2h1dGRvd24gfD0gU1NMX1JFQ0VJVkVEX1NIVVRET1dOOworICBkdGxzMV9yZWFkX2J5dGVzKHNzbCwgMCwgTlVMTCwgMCwgMCk7CiB9CiAKIC8qIFJldHVybiB1cCB0byAnbGVuJyBwYXlsb2FkIGJ5dGVzIHJlY2VpdmVkIGluICd0eXBlJyByZWNvcmRzLgpAQCAtMjAzLDYgKzQwMSw3IEBACiAgKgogICogICAtICBTU0wzX1JUX0hBTkRTSEFLRSAod2hlbiBzc2wzX2dldF9tZXNzYWdlIGNhbGxzIHVzKQogICogICAtICBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEgKHdoZW4gc3NsM19yZWFkIGNhbGxzIHVzKQorICogICAtICAwIChkdXJpbmcgYSBzaHV0ZG93biwgbm8gZGF0YSBoYXMgdG8gYmUgcmV0dXJuZWQpCiAgKgogICogSWYgd2UgZG9uJ3QgaGF2ZSBzdG9yZWQgZGF0YSB0byB3b3JrIGZyb20sIHJlYWQgYSBTU0wvVExTIHJlY29yZCBmaXJzdAogICogKHBvc3NpYmx5IG11bHRpcGxlIHJlY29yZHMgaWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byByZXR1cm4pLgpAQCAtMjMwLDkgKzQyOSwxMSBAQAogICBTU0wzX1JFQ09SRCAqcnI7CiAgIHZvaWQgKCpjYikoY29uc3QgU1NMICpzc2wsIGludCB0eXBlMiwgaW50IHZhbCkgPSBOVUxMOwogCi0gIGlmICgodHlwZSAhPSBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEgJiYgdHlwZSAhPSBTU0wzX1JUX0hBTkRTSEFLRSkgfHwKLSAgICAgIChwZWVrICYmIHR5cGUgIT0gU1NMM19SVF9BUFBMSUNBVElPTl9EQVRBKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAvKiBYWFg6IGNoZWNrIHdoYXQgdGhlIHNlY29uZCAnJiYgdHlwZScgaXMgYWJvdXQgKi8KKyAgaWYgKCh0eXBlICYmICh0eXBlICE9IFNTTDNfUlRfQVBQTElDQVRJT05fREFUQSkgJiYKKyAgICAgICAodHlwZSAhPSBTU0wzX1JUX0hBTkRTSEFLRSkgJiYgdHlwZSkgfHwKKyAgICAgIChwZWVrICYmICh0eXBlICE9IFNTTDNfUlRfQVBQTElDQVRJT05fREFUQSkpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkdGxzMV9yZWFkX2J5dGVzLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKQEAgLTI0Myw3ICs0NDQsNyBAQAogICAgICAgcmV0dXJuIGk7CiAgICAgfQogICAgIGlmIChpID09IDApIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfU1NMX0hBTkRTSEFLRV9GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgZHRsczFfcmVhZF9ieXRlcywgU1NMX1JfU1NMX0hBTkRTSEFLRV9GQUlMVVJFKTsKICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgIH0KQEAgLTI2Myw3ICs0NjQsNyBAQAogICB9CiAKICAgLyogZ2V0IG5ldyBwYWNrZXQgaWYgbmVjZXNzYXJ5ICovCi0gIGlmIChyci0+bGVuZ3RoID09IDApIHsKKyAgaWYgKHJyLT5sZW5ndGggPT0gMCB8fCBzLT5yc3RhdGUgPT0gU1NMX1NUX1JFQURfQk9EWSkgewogICAgIHJldCA9IGR0bHMxX2dldF9yZWNvcmQocyk7CiAgICAgaWYgKHJldCA8PSAwKSB7CiAgICAgICByZXQgPSBkdGxzMV9yZWFkX2ZhaWxlZChzLCByZXQpOwpAQCAtMzA2LDE1ICs1MDcsMTAgQEAKICAgICAgIC8qIFRPRE8oZGF2aWRiZW4pOiBJcyB0aGlzIGNoZWNrIHJlZHVuZGFudCB3aXRoIHRoZSBoYW5kc2hha2VfZnVuYwogICAgICAgICogY2hlY2s/ICovCiAgICAgICBhbCA9IFNTTF9BRF9VTkVYUEVDVEVEX01FU1NBR0U7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0FQUF9EQVRBX0lOX0hBTkRTSEFLRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGR0bHMxX3JlYWRfYnl0ZXMsIFNTTF9SX0FQUF9EQVRBX0lOX0hBTkRTSEFLRSk7CiAgICAgICBnb3RvIGZfZXJyOwogICAgIH0KIAotICAgIC8qIERpc2NhcmQgZW1wdHkgcmVjb3Jkcy4gKi8KLSAgICBpZiAocnItPmxlbmd0aCA9PSAwKSB7Ci0gICAgICBnb3RvIHN0YXJ0OwotICAgIH0KLQogICAgIGlmIChsZW4gPD0gMCkgewogICAgICAgcmV0dXJuIGxlbjsKICAgICB9CkBAIC0zMzAsOSArNTI2LDggQEAKICAgICAgIHJyLT5sZW5ndGggLT0gbjsKICAgICAgIHJyLT5vZmYgKz0gbjsKICAgICAgIGlmIChyci0+bGVuZ3RoID09IDApIHsKKyAgICAgICAgcy0+cnN0YXRlID0gU1NMX1NUX1JFQURfSEVBREVSOwogICAgICAgICByci0+b2ZmID0gMDsKLSAgICAgICAgLyogVGhlIHJlY29yZCBoYXMgYmVlbiBjb25zdW1lZCwgc28gd2UgbWF5IG5vdyBjbGVhciB0aGUgYnVmZmVyLiAqLwotICAgICAgICBzc2xfcmVhZF9idWZmZXJfZGlzY2FyZChzKTsKICAgICAgIH0KICAgICB9CiAKQEAgLTM0Nyw3ICs1NDIsNyBAQAogICAgIC8qIEFsZXJ0cyBtYXkgbm90IGJlIGZyYWdtZW50ZWQuICovCiAgICAgaWYgKHJyLT5sZW5ndGggPCAyKSB7CiAgICAgICBhbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0JBRF9BTEVSVCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGR0bHMxX3JlYWRfYnl0ZXMsIFNTTF9SX0JBRF9BTEVSVCk7CiAgICAgICBnb3RvIGZfZXJyOwogICAgIH0KIApAQCAtMzgxLDcgKzU3Niw4IEBACiAKICAgICAgIHMtPnJ3c3RhdGUgPSBTU0xfTk9USElORzsKICAgICAgIHMtPnMzLT5mYXRhbF9hbGVydCA9IGFsZXJ0X2Rlc2NyOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfQURfUkVBU09OX09GRlNFVCArIGFsZXJ0X2Rlc2NyKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgZHRsczFfcmVhZF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9BRF9SRUFTT05fT0ZGU0VUICsgYWxlcnRfZGVzY3IpOwogICAgICAgQklPX3NucHJpbnRmKHRtcCwgc2l6ZW9mIHRtcCwgIiVkIiwgYWxlcnRfZGVzY3IpOwogICAgICAgRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJTU0wgYWxlcnQgbnVtYmVyICIsIHRtcCk7CiAgICAgICBzLT5zaHV0ZG93biB8PSBTU0xfUkVDRUlWRURfU0hVVERPV047CkBAIC0zODksMTkgKzU4NSwyNiBAQAogICAgICAgcmV0dXJuIDA7CiAgICAgfSBlbHNlIHsKICAgICAgIGFsID0gU1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9VTktOT1dOX0FMRVJUX1RZUEUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkdGxzMV9yZWFkX2J5dGVzLCBTU0xfUl9VTktOT1dOX0FMRVJUX1RZUEUpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAKICAgICBnb3RvIHN0YXJ0OwogICB9CiAKKyAgaWYgKHMtPnNodXRkb3duICYgU1NMX1NFTlRfU0hVVERPV04pIHsKKyAgICAvKiBidXQgd2UgaGF2ZSBub3QgcmVjZWl2ZWQgYSBzaHV0ZG93biAqLworICAgIHMtPnJ3c3RhdGUgPSBTU0xfTk9USElORzsKKyAgICByci0+bGVuZ3RoID0gMDsKKyAgICByZXR1cm4gMDsKKyAgfQorCiAgIGlmIChyci0+dHlwZSA9PSBTU0wzX1JUX0NIQU5HRV9DSVBIRVJfU1BFQykgewogICAgIC8qICdDaGFuZ2UgQ2lwaGVyIFNwZWMnIGlzIGp1c3QgYSBzaW5nbGUgYnl0ZSwgc28gd2Uga25vdyBleGFjdGx5IHdoYXQgdGhlCiAgICAgICogcmVjb3JkIHBheWxvYWQgaGFzIHRvIGxvb2sgbGlrZSAqLwogICAgIGlmIChyci0+bGVuZ3RoICE9IDEgfHwgcnItPm9mZiAhPSAwIHx8IHJyLT5kYXRhWzBdICE9IFNTTDNfTVRfQ0NTKSB7CiAgICAgICBhbCA9IFNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfQkFEX0NIQU5HRV9DSVBIRVJfU1BFQyk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGR0bHMxX3JlYWRfYnl0ZXMsIFNTTF9SX0JBRF9DSEFOR0VfQ0lQSEVSX1NQRUMpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAKQEAgLTQzOCw3ICs2NDEsNyBAQAogICBpZiAocnItPnR5cGUgPT0gU1NMM19SVF9IQU5EU0hBS0UgJiYgIXMtPmluX2hhbmRzaGFrZSkgewogICAgIGlmIChyci0+bGVuZ3RoIDwgRFRMUzFfSE1fSEVBREVSX0xFTkdUSCkgewogICAgICAgYWwgPSBTU0xfQURfREVDT0RFX0VSUk9SOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CQURfSEFORFNIQUtFX1JFQ09SRCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGR0bHMxX3JlYWRfYnl0ZXMsIFNTTF9SX0JBRF9IQU5EU0hBS0VfUkVDT1JEKTsKICAgICAgIGdvdG8gZl9lcnI7CiAgICAgfQogICAgIHN0cnVjdCBobV9oZWFkZXJfc3QgbXNnX2hkcjsKQEAgLTQ2Niw3ICs2NjksNyBAQAogICBhc3NlcnQocnItPnR5cGUgIT0gU1NMM19SVF9DSEFOR0VfQ0lQSEVSX1NQRUMgJiYgcnItPnR5cGUgIT0gU1NMM19SVF9BTEVSVCk7CiAKICAgYWwgPSBTU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFOwotICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1VORVhQRUNURURfUkVDT1JEKTsKKyAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkdGxzMV9yZWFkX2J5dGVzLCBTU0xfUl9VTkVYUEVDVEVEX1JFQ09SRCk7CiAKIGZfZXJyOgogICBzc2wzX3NlbmRfYWxlcnQocywgU1NMM19BTF9GQVRBTCwgYWwpOwpAQCAtNDgzLDEzICs2ODYsMTMgQEAKICAgICAgIHJldHVybiBpOwogICAgIH0KICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1NTTF9IQU5EU0hBS0VfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGR0bHMxX3dyaXRlX2FwcF9kYXRhLCBTU0xfUl9TU0xfSEFORFNIQUtFX0ZBSUxVUkUpOwogICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgfQogCiAgIGlmIChsZW4gPiBTU0wzX1JUX01BWF9QTEFJTl9MRU5HVEgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0RUTFNfTUVTU0FHRV9UT09fQklHKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGR0bHMxX3dyaXRlX2FwcF9kYXRhLCBTU0xfUl9EVExTX01FU1NBR0VfVE9PX0JJRyk7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKQEAgLTUxMCwxMSArNzEzLDczIEBACiAgIHJldHVybiBpOwogfQogCisvKiBkdGxzMV9zZWFsX3JlY29yZCBzZWFscyBhIG5ldyByZWNvcmQgb2YgdHlwZSB8dHlwZXwgYW5kIHBsYWludGV4dCB8aW58IGFuZAorICogd3JpdGVzIGl0IHRvIHxvdXR8LiBBdCBtb3N0IHxtYXhfb3V0fCBieXRlcyB3aWxsIGJlIHdyaXR0ZW4uIEl0IHJldHVybnMgb25lCisgKiBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiBPbiBzdWNjZXNzLCBpdCB1cGRhdGVzIHRoZSB3cml0ZSBzZXF1ZW5jZQorICogbnVtYmVyLiAqLworc3RhdGljIGludCBkdGxzMV9zZWFsX3JlY29yZChTU0wgKnMsIHVpbnQ4X3QgKm91dCwgc2l6ZV90ICpvdXRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWF4X291dCwgdWludDhfdCB0eXBlLCBjb25zdCB1aW50OF90ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluX2xlbiwgZW51bSBkdGxzMV91c2VfZXBvY2hfdCB1c2VfZXBvY2gpIHsKKyAgaWYgKG1heF9vdXQgPCBEVExTMV9SVF9IRUFERVJfTEVOR1RIKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkdGxzMV9zZWFsX3JlY29yZCwgU1NMX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBEZXRlcm1pbmUgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjdXJyZW50IGVwb2NoLiAqLworICB1aW50MTZfdCBlcG9jaCA9IHMtPmQxLT53X2Vwb2NoOworICBTU0xfQUVBRF9DVFggKmFlYWQgPSBzLT5hZWFkX3dyaXRlX2N0eDsKKyAgdWludDhfdCAqc2VxID0gcy0+czMtPndyaXRlX3NlcXVlbmNlOworICBpZiAodXNlX2Vwb2NoID09IGR0bHMxX3VzZV9wcmV2aW91c19lcG9jaCkgeworICAgIC8qIERUTFMgcmVuZWdvdGlhdGlvbiBpcyB1bnN1cHBvcnRlZCwgc28gb25seSBlcG9jaHMgMCAoTlVMTCBjaXBoZXIpIGFuZCAxCisgICAgICogKG5lZ290aWF0ZWQgY2lwaGVyKSBleGlzdC4gKi8KKyAgICBhc3NlcnQocy0+ZDEtPndfZXBvY2ggPT0gMSk7CisgICAgZXBvY2ggPSBzLT5kMS0+d19lcG9jaCAtIDE7CisgICAgYWVhZCA9IE5VTEw7CisgICAgc2VxID0gcy0+ZDEtPmxhc3Rfd3JpdGVfc2VxdWVuY2U7CisgIH0KKworICBvdXRbMF0gPSB0eXBlOworCisgIHVpbnQxNl90IHdpcmVfdmVyc2lvbiA9IHMtPnMzLT5oYXZlX3ZlcnNpb24gPyBzLT52ZXJzaW9uIDogRFRMUzFfVkVSU0lPTjsKKyAgb3V0WzFdID0gd2lyZV92ZXJzaW9uID4+IDg7CisgIG91dFsyXSA9IHdpcmVfdmVyc2lvbiAmIDB4ZmY7CisKKyAgb3V0WzNdID0gZXBvY2ggPj4gODsKKyAgb3V0WzRdID0gZXBvY2ggJiAweGZmOworICBtZW1jcHkoJm91dFs1XSwgJnNlcVsyXSwgNik7CisKKyAgc2l6ZV90IGNpcGhlcnRleHRfbGVuOworICBpZiAoIVNTTF9BRUFEX0NUWF9zZWFsKGFlYWQsIG91dCArIERUTFMxX1JUX0hFQURFUl9MRU5HVEgsICZjaXBoZXJ0ZXh0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfb3V0IC0gRFRMUzFfUlRfSEVBREVSX0xFTkdUSCwgdHlwZSwgd2lyZV92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRbM10gLyogc2VxICovLCBpbiwgaW5fbGVuKSB8fAorICAgICAgIXNzbDNfcmVjb3JkX3NlcXVlbmNlX3VwZGF0ZSgmc2VxWzJdLCA2KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKGNpcGhlcnRleHRfbGVuID49IDEgPDwgMTYpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGR0bHMxX3NlYWxfcmVjb3JkLCBFUlJfUl9PVkVSRkxPVyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgb3V0WzExXSA9IGNpcGhlcnRleHRfbGVuID4+IDg7CisgIG91dFsxMl0gPSBjaXBoZXJ0ZXh0X2xlbiAmIDB4ZmY7CisKKyAgKm91dF9sZW4gPSBEVExTMV9SVF9IRUFERVJfTEVOR1RIICsgY2lwaGVydGV4dF9sZW47CisKKyAgaWYgKHMtPm1zZ19jYWxsYmFjaykgeworICAgIHMtPm1zZ19jYWxsYmFjaygxIC8qIHdyaXRlICovLCAwLCBTU0wzX1JUX0hFQURFUiwgb3V0LAorICAgICAgICAgICAgICAgICAgICBEVExTMV9SVF9IRUFERVJfTEVOR1RILCBzLCBzLT5tc2dfY2FsbGJhY2tfYXJnKTsKKyAgfQorCisgIHJldHVybiAxOworfQorCiBzdGF0aWMgaW50IGRvX2R0bHMxX3dyaXRlKFNTTCAqcywgaW50IHR5cGUsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbiwgZW51bSBkdGxzMV91c2VfZXBvY2hfdCB1c2VfZXBvY2gpIHsKKyAgU1NMM19CVUZGRVIgKndiID0gJnMtPnMzLT53YnVmOworCiAgIC8qIHNzbDNfd3JpdGVfcGVuZGluZyBkcm9wcyB0aGUgd3JpdGUgaWYgfEJJT193cml0ZXwgZmFpbHMgaW4gRFRMUywgc28gdGhlcmUKICAgICogaXMgbmV2ZXIgcGVuZGluZyBkYXRhLiAqLwotICBhc3NlcnQoIXNzbF93cml0ZV9idWZmZXJfaXNfcGVuZGluZyhzKSk7CisgIGFzc2VydChzLT5zMy0+d2J1Zi5sZWZ0ID09IDApOwogCiAgIC8qIElmIHdlIGhhdmUgYW4gYWxlcnQgdG8gc2VuZCwgbGV0cyBzZW5kIGl0ICovCiAgIGlmIChzLT5zMy0+YWxlcnRfZGlzcGF0Y2gpIHsKQEAgLTUyNSw4ICs3OTAsNyBAQAogICAgIC8qIGlmIGl0IHdlbnQsIGZhbGwgdGhyb3VnaCBhbmQgc2VuZCBtb3JlIHN0dWZmICovCiAgIH0KIAotICBpZiAobGVuID4gU1NMM19SVF9NQVhfUExBSU5fTEVOR1RIKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgIGlmICh3Yi0+YnVmID09IE5VTEwgJiYgIXNzbDNfc2V0dXBfd3JpdGVfYnVmZmVyKHMpKSB7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKQEAgLTUzNCwxNSArNzk4LDIxIEBACiAgICAgcmV0dXJuIDA7CiAgIH0KIAotICBzaXplX3QgbWF4X291dCA9IGxlbiArIHNzbF9tYXhfc2VhbF9vdmVyaGVhZChzKTsKLSAgdWludDhfdCAqb3V0OworICAvKiBBbGlnbiB0aGUgb3V0cHV0IHNvIHRoZSBjaXBoZXJ0ZXh0IGlzIGFsaWduZWQgdG8gfFNTTDNfQUxJR05fUEFZTE9BRHwuICovCisgIHVpbnRwdHJfdCBhbGlnbiA9ICh1aW50cHRyX3Qpd2ItPmJ1ZiArIERUTFMxX1JUX0hFQURFUl9MRU5HVEg7CisgIGFsaWduID0gKDAgLSBhbGlnbikgJiAoU1NMM19BTElHTl9QQVlMT0FEIC0gMSk7CisgIHVpbnQ4X3QgKm91dCA9IHdiLT5idWYgKyBhbGlnbjsKKyAgd2ItPm9mZnNldCA9IGFsaWduOworICBzaXplX3QgbWF4X291dCA9IHdiLT5sZW4gLSB3Yi0+b2Zmc2V0OworCiAgIHNpemVfdCBjaXBoZXJ0ZXh0X2xlbjsKLSAgaWYgKCFzc2xfd3JpdGVfYnVmZmVyX2luaXQocywgJm91dCwgbWF4X291dCkgfHwKLSAgICAgICFkdGxzX3NlYWxfcmVjb3JkKHMsIG91dCwgJmNpcGhlcnRleHRfbGVuLCBtYXhfb3V0LCB0eXBlLCBidWYsIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9lcG9jaCkpIHsKKyAgaWYgKCFkdGxzMV9zZWFsX3JlY29yZChzLCBvdXQsICZjaXBoZXJ0ZXh0X2xlbiwgbWF4X291dCwgdHlwZSwgYnVmLCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2Vwb2NoKSkgewogICAgIHJldHVybiAtMTsKICAgfQotICBzc2xfd3JpdGVfYnVmZmVyX3NldF9sZW4ocywgY2lwaGVydGV4dF9sZW4pOworCisgIC8qIG5vdyBsZXQncyBzZXQgdXAgd2IgKi8KKyAgd2ItPmxlZnQgPSBjaXBoZXJ0ZXh0X2xlbjsKIAogICAvKiBtZW1vcml6ZSBhcmd1bWVudHMgc28gdGhhdCBzc2wzX3dyaXRlX3BlbmRpbmcgY2FuIGRldGVjdCBiYWQgd3JpdGUgcmV0cmllcwogICAgKiBsYXRlciAqLwpAQCAtNTU1LDYgKzgyNSw0OSBAQAogICByZXR1cm4gc3NsM193cml0ZV9wZW5kaW5nKHMsIHR5cGUsIGJ1ZiwgbGVuKTsKIH0KIAorc3RhdGljIGludCBkdGxzMV9yZWNvcmRfcmVwbGF5X2NoZWNrKFNTTCAqcywgRFRMUzFfQklUTUFQICpiaXRtYXApIHsKKyAgaW50IGNtcDsKKyAgdW5zaWduZWQgaW50IHNoaWZ0OworICBjb25zdCB1aW50OF90ICpzZXEgPSBzLT5zMy0+cmVhZF9zZXF1ZW5jZTsKKworICBjbXAgPSBzYXRzdWI2NGJlKHNlcSwgYml0bWFwLT5tYXhfc2VxX251bSk7CisgIGlmIChjbXAgPiAwKSB7CisgICAgbWVtY3B5KHMtPnMzLT5ycmVjLnNlcV9udW0sIHNlcSwgOCk7CisgICAgcmV0dXJuIDE7IC8qIHRoaXMgcmVjb3JkIGluIG5ldyAqLworICB9CisgIHNoaWZ0ID0gLWNtcDsKKyAgaWYgKHNoaWZ0ID49IHNpemVvZihiaXRtYXAtPm1hcCkgKiA4KSB7CisgICAgcmV0dXJuIDA7IC8qIHN0YWxlLCBvdXRzaWRlIHRoZSB3aW5kb3cgKi8KKyAgfSBlbHNlIGlmIChiaXRtYXAtPm1hcCAmICgoKHVpbnQ2NF90KTEpIDw8IHNoaWZ0KSkgeworICAgIHJldHVybiAwOyAvKiByZWNvcmQgcHJldmlvdXNseSByZWNlaXZlZCAqLworICB9CisKKyAgbWVtY3B5KHMtPnMzLT5ycmVjLnNlcV9udW0sIHNlcSwgOCk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBkdGxzMV9yZWNvcmRfYml0bWFwX3VwZGF0ZShTU0wgKnMsIERUTFMxX0JJVE1BUCAqYml0bWFwKSB7CisgIGludCBjbXA7CisgIHVuc2lnbmVkIGludCBzaGlmdDsKKyAgY29uc3QgdWludDhfdCAqc2VxID0gcy0+czMtPnJlYWRfc2VxdWVuY2U7CisKKyAgY21wID0gc2F0c3ViNjRiZShzZXEsIGJpdG1hcC0+bWF4X3NlcV9udW0pOworICBpZiAoY21wID4gMCkgeworICAgIHNoaWZ0ID0gY21wOworICAgIGlmIChzaGlmdCA8IHNpemVvZihiaXRtYXAtPm1hcCkgKiA4KSB7CisgICAgICBiaXRtYXAtPm1hcCA8PD0gc2hpZnQsIGJpdG1hcC0+bWFwIHw9IDFVTDsKKyAgICB9IGVsc2UgeworICAgICAgYml0bWFwLT5tYXAgPSAxVUw7CisgICAgfQorICAgIG1lbWNweShiaXRtYXAtPm1heF9zZXFfbnVtLCBzZXEsIDgpOworICB9IGVsc2UgeworICAgIHNoaWZ0ID0gLWNtcDsKKyAgICBpZiAoc2hpZnQgPCBzaXplb2YoYml0bWFwLT5tYXApICogOCkgeworICAgICAgYml0bWFwLT5tYXAgfD0gKCh1aW50NjRfdCkxKSA8PCBzaGlmdDsKKyAgICB9CisgIH0KK30KKwogaW50IGR0bHMxX2Rpc3BhdGNoX2FsZXJ0KFNTTCAqcykgewogICBpbnQgaSwgajsKICAgdm9pZCAoKmNiKShjb25zdCBTU0wgKnNzbCwgaW50IHR5cGUsIGludCB2YWwpID0gTlVMTDsKZGlmZiAtLWdpdCBhL3NyYy9zc2wvZDFfc3J0cC5jIGIvc3JjL3NzbC9kMV9zcnRwLmMKaW5kZXggMmZjYzFlYS4uNTkyOGZjOCAxMDA2NDQKLS0tIGEvc3JjL3NzbC9kMV9zcnRwLmMKKysrIGIvc3JjL3NzbC9kMV9zcnRwLmMKQEAgLTExNCw4ICsxMTQsNiBAQAogICBDb3B5cmlnaHQgKEMpIDIwMTEsIFJURk0sIEluYy4KICovCiAKLSNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgotCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIApAQCAtMTI0LDE0ICsxMjIsMTUgQEAKICNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3NydHAuaD4KIAogCi1jb25zdCBTUlRQX1BST1RFQ1RJT05fUFJPRklMRSBrU1JUUFByb2ZpbGVzW10gPSB7CitzdGF0aWMgY29uc3QgU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUgc3J0cF9rbm93bl9wcm9maWxlc1tdID0gewogICAgIHsKLSAgICAgICAgIlNSVFBfQUVTMTI4X0NNX1NIQTFfODAiLCBTUlRQX0FFUzEyOF9DTV9TSEExXzgwLAorICAgICAiU1JUUF9BRVMxMjhfQ01fU0hBMV84MCIsIFNSVFBfQUVTMTI4X0NNX1NIQTFfODAsCiAgICAgfSwKICAgICB7Ci0gICAgICAgICJTUlRQX0FFUzEyOF9DTV9TSEExXzMyIiwgU1JUUF9BRVMxMjhfQ01fU0hBMV8zMiwKKyAgICAgIlNSVFBfQUVTMTI4X0NNX1NIQTFfMzIiLCBTUlRQX0FFUzEyOF9DTV9TSEExXzMyLAogICAgIH0sCiAgICAgezB9LAogfTsKQEAgLTE0MSw3ICsxNDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKSB7CiAgIGNvbnN0IFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFICpwOwogCi0gIHAgPSBrU1JUUFByb2ZpbGVzOworICBwID0gc3J0cF9rbm93bl9wcm9maWxlczsKICAgd2hpbGUgKHAtPm5hbWUpIHsKICAgICBpZiAobGVuID09IHN0cmxlbihwLT5uYW1lKSAmJiAhc3RybmNtcChwLT5uYW1lLCBwcm9maWxlX25hbWUsIGxlbikpIHsKICAgICAgICpwcHRyID0gcDsKQEAgLTE1NCw2ICsxNTMsMjIgQEAKICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZmluZF9wcm9maWxlX2J5X251bSh1bnNpZ25lZCBwcm9maWxlX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTUlRQX1BST1RFQ1RJT05fUFJPRklMRSAqKnBwdHIpIHsKKyAgY29uc3QgU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUgKnA7CisKKyAgcCA9IHNydHBfa25vd25fcHJvZmlsZXM7CisgIHdoaWxlIChwLT5uYW1lKSB7CisgICAgaWYgKHAtPmlkID09IHByb2ZpbGVfbnVtKSB7CisgICAgICAqcHB0ciA9IHA7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcCsrOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgc3NsX2N0eF9tYWtlX3Byb2ZpbGVzKGNvbnN0IGNoYXIgKnByb2ZpbGVzX3N0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQUNLX09GKFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFKSAqKm91dCkgewogICBTVEFDS19PRihTUlRQX1BST1RFQ1RJT05fUFJPRklMRSkgKnByb2ZpbGVzOwpAQCAtMTYzLDcgKzE3OCw4IEBACiAKICAgcHJvZmlsZXMgPSBza19TUlRQX1BST1RFQ1RJT05fUFJPRklMRV9uZXdfbnVsbCgpOwogICBpZiAocHJvZmlsZXMgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfU1JUUF9DT1VMRF9OT1RfQUxMT0NBVEVfUFJPRklMRVMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX2N0eF9tYWtlX3Byb2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1NSVFBfQ09VTERfTk9UX0FMTE9DQVRFX1BST0ZJTEVTKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xNzQsNyArMTkwLDggQEAKICAgICBpZiAoZmluZF9wcm9maWxlX2J5X25hbWUocHRyLCAmcCwgY29sID8gY29sIC0gcHRyIDogc3RybGVuKHB0cikpKSB7CiAgICAgICBza19TUlRQX1BST1RFQ1RJT05fUFJPRklMRV9wdXNoKHByb2ZpbGVzLCBwKTsKICAgICB9IGVsc2UgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9TUlRQX1VOS05PV05fUFJPVEVDVElPTl9QUk9GSUxFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX2N0eF9tYWtlX3Byb2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfU1JUUF9VTktOT1dOX1BST1RFQ1RJT05fUFJPRklMRSk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTE5MiwyOCArMjA5LDI4IEBACiAgIHJldHVybiBzc2xfY3R4X21ha2VfcHJvZmlsZXMocHJvZmlsZXMsICZjdHgtPnNydHBfcHJvZmlsZXMpOwogfQogCi1pbnQgU1NMX3NldF9zcnRwX3Byb2ZpbGVzKFNTTCAqc3NsLCBjb25zdCBjaGFyICpwcm9maWxlcykgewotICByZXR1cm4gc3NsX2N0eF9tYWtlX3Byb2ZpbGVzKHByb2ZpbGVzLCAmc3NsLT5zcnRwX3Byb2ZpbGVzKTsKK2ludCBTU0xfc2V0X3NydHBfcHJvZmlsZXMoU1NMICpzLCBjb25zdCBjaGFyICpwcm9maWxlcykgeworICByZXR1cm4gc3NsX2N0eF9tYWtlX3Byb2ZpbGVzKHByb2ZpbGVzLCAmcy0+c3J0cF9wcm9maWxlcyk7CiB9CiAKLVNUQUNLX09GKFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFKSAqU1NMX2dldF9zcnRwX3Byb2ZpbGVzKFNTTCAqc3NsKSB7Ci0gIGlmIChzc2wgPT0gTlVMTCkgeworU1RBQ0tfT0YoU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUpICpTU0xfZ2V0X3NydHBfcHJvZmlsZXMoU1NMICpzKSB7CisgIGlmIChzID09IE5VTEwpIHsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCi0gIGlmIChzc2wtPnNydHBfcHJvZmlsZXMgIT0gTlVMTCkgewotICAgIHJldHVybiBzc2wtPnNydHBfcHJvZmlsZXM7CisgIGlmIChzLT5zcnRwX3Byb2ZpbGVzICE9IE5VTEwpIHsKKyAgICByZXR1cm4gcy0+c3J0cF9wcm9maWxlczsKICAgfQogCi0gIGlmIChzc2wtPmN0eCAhPSBOVUxMICYmIHNzbC0+Y3R4LT5zcnRwX3Byb2ZpbGVzICE9IE5VTEwpIHsKLSAgICByZXR1cm4gc3NsLT5jdHgtPnNydHBfcHJvZmlsZXM7CisgIGlmIChzLT5jdHggIT0gTlVMTCAmJiBzLT5jdHgtPnNydHBfcHJvZmlsZXMgIT0gTlVMTCkgeworICAgIHJldHVybiBzLT5jdHgtPnNydHBfcHJvZmlsZXM7CiAgIH0KIAogICByZXR1cm4gTlVMTDsKIH0KIAotY29uc3QgU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUgKlNTTF9nZXRfc2VsZWN0ZWRfc3J0cF9wcm9maWxlKFNTTCAqc3NsKSB7Ci0gIHJldHVybiBzc2wtPnNydHBfcHJvZmlsZTsKK2NvbnN0IFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFICpTU0xfZ2V0X3NlbGVjdGVkX3NydHBfcHJvZmlsZShTU0wgKnMpIHsKKyAgcmV0dXJuIHMtPnNydHBfcHJvZmlsZTsKIH0KIAogaW50IFNTTF9DVFhfc2V0X3Rsc2V4dF91c2Vfc3J0cChTU0xfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKnByb2ZpbGVzKSB7CkBAIC0yMjEsNyArMjM4LDE5NSBAQAogICByZXR1cm4gIVNTTF9DVFhfc2V0X3NydHBfcHJvZmlsZXMoY3R4LCBwcm9maWxlcyk7CiB9CiAKLWludCBTU0xfc2V0X3Rsc2V4dF91c2Vfc3J0cChTU0wgKnNzbCwgY29uc3QgY2hhciAqcHJvZmlsZXMpIHsKK2ludCBTU0xfc2V0X3Rsc2V4dF91c2Vfc3J0cChTU0wgKnMsIGNvbnN0IGNoYXIgKnByb2ZpbGVzKSB7CiAgIC8qIFRoaXMgQVBJIGludmVydHMgaXRzIHJldHVybiB2YWx1ZS4gKi8KLSAgcmV0dXJuICFTU0xfc2V0X3NydHBfcHJvZmlsZXMoc3NsLCBwcm9maWxlcyk7CisgIHJldHVybiAhU1NMX3NldF9zcnRwX3Byb2ZpbGVzKHMsIHByb2ZpbGVzKTsKK30KKworLyogTm90ZTogdGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgbGVuZ3RoIGlmIHRoZXJlIGFyZSBubyBwcm9maWxlcyBzcGVjaWZpZWQgKi8KK2ludCBzc2xfYWRkX2NsaWVudGhlbGxvX3VzZV9zcnRwX2V4dChTU0wgKnMsIHVpbnQ4X3QgKnAsIGludCAqbGVuLCBpbnQgbWF4bGVuKSB7CisgIGludCBjdCA9IDA7CisgIGludCBpOworICBTVEFDS19PRihTUlRQX1BST1RFQ1RJT05fUFJPRklMRSkgKmNsbnQgPSAwOworICBjb25zdCBTUlRQX1BST1RFQ1RJT05fUFJPRklMRSAqcHJvZjsKKworICBjbG50ID0gU1NMX2dldF9zcnRwX3Byb2ZpbGVzKHMpOworICBjdCA9IHNrX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX251bShjbG50KTsgLyogLTEgaWYgY2xudCA9PSAwICovCisKKyAgaWYgKHApIHsKKyAgICBpZiAoY3QgPT0gMCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfYWRkX2NsaWVudGhlbGxvX3VzZV9zcnRwX2V4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX0VNUFRZX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX0xJU1QpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKDIgKyBjdCAqIDIgKyAxID4gbWF4bGVuKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9hZGRfY2xpZW50aGVsbG9fdXNlX3NydHBfZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfTElTVF9UT09fTE9ORyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBBZGQgdGhlIGxlbmd0aCAqLworICAgIHMybihjdCAqIDIsIHApOworICAgIGZvciAoaSA9IDA7IGkgPCBjdDsgaSsrKSB7CisgICAgICBwcm9mID0gc2tfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfdmFsdWUoY2xudCwgaSk7CisgICAgICBzMm4ocHJvZi0+aWQsIHApOworICAgIH0KKworICAgIC8qIEFkZCBhbiBlbXB0eSB1c2VfbWtpIHZhbHVlICovCisgICAgKnArKyA9IDA7CisgIH0KKworICAqbGVuID0gMiArIGN0ICogMiArIDE7CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBzc2xfcGFyc2VfY2xpZW50aGVsbG9fdXNlX3NydHBfZXh0KFNTTCAqcywgQ0JTICpjYnMsIGludCAqb3V0X2FsZXJ0KSB7CisgIENCUyBwcm9maWxlX2lkcywgc3J0cF9ta2k7CisgIGNvbnN0IFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFICpjcHJvZiwgKnNwcm9mOworICBTVEFDS19PRihTUlRQX1BST1RFQ1RJT05fUFJPRklMRSkgKmNsaWVudF9wcm9maWxlcyA9IDAsICpzZXJ2ZXJfcHJvZmlsZXM7CisgIHNpemVfdCBpLCBqOworICBpbnQgcmV0ID0gMDsKKworICBpZiAoIUNCU19nZXRfdTE2X2xlbmd0aF9wcmVmaXhlZChjYnMsICZwcm9maWxlX2lkcykgfHwKKyAgICAgIENCU19sZW4oJnByb2ZpbGVfaWRzKSA8IDIgfHwKKyAgICAgICFDQlNfZ2V0X3U4X2xlbmd0aF9wcmVmaXhlZChjYnMsICZzcnRwX21raSkgfHwKKyAgICAgIENCU19sZW4oY2JzKSAhPSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfcGFyc2VfY2xpZW50aGVsbG9fdXNlX3NydHBfZXh0LAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX0JBRF9TUlRQX1BST1RFQ1RJT05fUFJPRklMRV9MSVNUKTsKKyAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBjbGllbnRfcHJvZmlsZXMgPSBza19TUlRQX1BST1RFQ1RJT05fUFJPRklMRV9uZXdfbnVsbCgpOworICBpZiAoY2xpZW50X3Byb2ZpbGVzID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9wYXJzZV9jbGllbnRoZWxsb191c2Vfc3J0cF9leHQsCisgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICpvdXRfYWxlcnQgPSBTU0xfQURfSU5URVJOQUxfRVJST1I7CisgICAgZ290byBkb25lOworICB9CisKKyAgd2hpbGUgKENCU19sZW4oJnByb2ZpbGVfaWRzKSA+IDApIHsKKyAgICB1aW50MTZfdCBwcm9maWxlX2lkOworCisgICAgaWYgKCFDQlNfZ2V0X3UxNigmcHJvZmlsZV9pZHMsICZwcm9maWxlX2lkKSkgeworICAgICAgKm91dF9hbGVydCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKGZpbmRfcHJvZmlsZV9ieV9udW0ocHJvZmlsZV9pZCwgJmNwcm9mKSkgeworICAgICAgc2tfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfcHVzaChjbGllbnRfcHJvZmlsZXMsIGNwcm9mKTsKKyAgICB9CisgIH0KKworICAvKiBEaXNjYXJkIHRoZSBNS0kgdmFsdWUgZm9yIG5vdy4gKi8KKworICBzZXJ2ZXJfcHJvZmlsZXMgPSBTU0xfZ2V0X3NydHBfcHJvZmlsZXMocyk7CisKKyAgLyogUGljayB0aGUgc2VydmVyJ3MgbW9zdCBwcmVmZXJyZWQgcHJvZmlsZS4gKi8KKyAgZm9yIChpID0gMDsgaSA8IHNrX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX251bShzZXJ2ZXJfcHJvZmlsZXMpOyBpKyspIHsKKyAgICBzcHJvZiA9IHNrX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX3ZhbHVlKHNlcnZlcl9wcm9maWxlcywgaSk7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgc2tfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfbnVtKGNsaWVudF9wcm9maWxlcyk7IGorKykgeworICAgICAgY3Byb2YgPSBza19TUlRQX1BST1RFQ1RJT05fUFJPRklMRV92YWx1ZShjbGllbnRfcHJvZmlsZXMsIGopOworCisgICAgICBpZiAoY3Byb2YtPmlkID09IHNwcm9mLT5pZCkgeworICAgICAgICBzLT5zcnRwX3Byb2ZpbGUgPSBzcHJvZjsKKyAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldCA9IDE7CisKK2RvbmU6CisgIGlmIChjbGllbnRfcHJvZmlsZXMpIHsKKyAgICBza19TUlRQX1BST1RFQ1RJT05fUFJPRklMRV9mcmVlKGNsaWVudF9wcm9maWxlcyk7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitpbnQgc3NsX2FkZF9zZXJ2ZXJoZWxsb191c2Vfc3J0cF9leHQoU1NMICpzLCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgKmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4bGVuKSB7CisgIGlmIChwKSB7CisgICAgaWYgKG1heGxlbiA8IDUpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX2FkZF9zZXJ2ZXJoZWxsb191c2Vfc3J0cF9leHQsCisgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9TUlRQX1BST1RFQ1RJT05fUFJPRklMRV9MSVNUX1RPT19MT05HKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChzLT5zcnRwX3Byb2ZpbGUgPT0gMCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfYWRkX3NlcnZlcmhlbGxvX3VzZV9zcnRwX2V4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1VTRV9TUlRQX05PVF9ORUdPVElBVEVEKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHMybigyLCBwKTsKKyAgICBzMm4ocy0+c3J0cF9wcm9maWxlLT5pZCwgcCk7CisgICAgKnArKyA9IDA7CisgIH0KKworICAqbGVuID0gNTsKKworICByZXR1cm4gMTsKK30KKworaW50IHNzbF9wYXJzZV9zZXJ2ZXJoZWxsb191c2Vfc3J0cF9leHQoU1NMICpzLCBDQlMgKmNicywgaW50ICpvdXRfYWxlcnQpIHsKKyAgQ0JTIHByb2ZpbGVfaWRzLCBzcnRwX21raTsKKyAgdWludDE2X3QgcHJvZmlsZV9pZDsKKyAgc2l6ZV90IGk7CisKKyAgU1RBQ0tfT0YoU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUpICpjbGllbnRfcHJvZmlsZXM7CisgIGNvbnN0IFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFICpwcm9mOworCisgIC8qIFRoZSBleHRlbnNpb24gY29uc2lzdHMgb2YgYSB1MTYtcHJlZml4ZWQgcHJvZmlsZSBJRCBsaXN0IGNvbnRhaW5pbmcgYQorICAgKiBzaW5nbGUgdWludDE2X3QgcHJvZmlsZSBJRCwgdGhlbiBmb2xsb3dlZCBieSBhIHU4LXByZWZpeGVkIHNydHBfbWtpIGZpZWxkLgorICAgKgorICAgKiBTZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU3NjQjc2VjdGlvbi00LjEuMSAqLworICBpZiAoIUNCU19nZXRfdTE2X2xlbmd0aF9wcmVmaXhlZChjYnMsICZwcm9maWxlX2lkcykgfHwKKyAgICAgICFDQlNfZ2V0X3UxNigmcHJvZmlsZV9pZHMsICZwcm9maWxlX2lkKSB8fCBDQlNfbGVuKCZwcm9maWxlX2lkcykgIT0gMCB8fAorICAgICAgIUNCU19nZXRfdThfbGVuZ3RoX3ByZWZpeGVkKGNicywgJnNydHBfbWtpKSB8fCBDQlNfbGVuKGNicykgIT0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX3BhcnNlX3NlcnZlcmhlbGxvX3VzZV9zcnRwX2V4dCwKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9CQURfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfTElTVCk7CisgICAgKm91dF9hbGVydCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoQ0JTX2xlbigmc3J0cF9ta2kpICE9IDApIHsKKyAgICAvKiBNdXN0IGJlIG5vIE1LSSwgc2luY2Ugd2UgbmV2ZXIgb2ZmZXIgb25lLiAqLworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX3BhcnNlX3NlcnZlcmhlbGxvX3VzZV9zcnRwX2V4dCwKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9CQURfU1JUUF9NS0lfVkFMVUUpOworICAgICpvdXRfYWxlcnQgPSBTU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBjbGllbnRfcHJvZmlsZXMgPSBTU0xfZ2V0X3NydHBfcHJvZmlsZXMocyk7CisKKyAgLyogVGhyb3cgYW4gZXJyb3IgaWYgdGhlIHNlcnZlciBnYXZlIHVzIGFuIHVuc29saWNpdGVkIGV4dGVuc2lvbiAqLworICBpZiAoY2xpZW50X3Byb2ZpbGVzID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9wYXJzZV9zZXJ2ZXJoZWxsb191c2Vfc3J0cF9leHQsCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfTk9fU1JUUF9QUk9GSUxFUyk7CisgICAgKm91dF9hbGVydCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIHNlcnZlciBnYXZlIHVzIHNvbWV0aGluZyB3ZSBzdXBwb3J0CisgICAgIChhbmQgcHJlc3VtYWJseSBvZmZlcmVkKS4gKi8KKyAgZm9yIChpID0gMDsgaSA8IHNrX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX251bShjbGllbnRfcHJvZmlsZXMpOyBpKyspIHsKKyAgICBwcm9mID0gc2tfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfdmFsdWUoY2xpZW50X3Byb2ZpbGVzLCBpKTsKKworICAgIGlmIChwcm9mLT5pZCA9PSBwcm9maWxlX2lkKSB7CisgICAgICBzLT5zcnRwX3Byb2ZpbGUgPSBwcm9mOworICAgICAgKm91dF9hbGVydCA9IDA7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKworICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9wYXJzZV9zZXJ2ZXJoZWxsb191c2Vfc3J0cF9leHQsCisgICAgICAgICAgICAgICAgICAgIFNTTF9SX0JBRF9TUlRQX1BST1RFQ1RJT05fUFJPRklMRV9MSVNUKTsKKyAgKm91dF9hbGVydCA9IFNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKKyAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zcmMvc3NsL2QxX3NydnIuYyBiL3NyYy9zc2wvZDFfc3J2ci5jCmluZGV4IDg5YzI2YWEuLmU0OWEzZjAgMTAwNjQ0Ci0tLSBhL3NyYy9zc2wvZDFfc3J2ci5jCisrKyBiL3NyYy9zc2wvZDFfc3J2ci5jCkBAIC0xMTIsOCArMTEyLDYgQEAKICAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCiAgKi8KIAotI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+Ci0KICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogCkBAIC0xNTIsNiArMTUwLDExIEBACiAKICAgcy0+aW5faGFuZHNoYWtlKys7CiAKKyAgaWYgKHMtPmNlcnQgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgZHRsczFfYWNjZXB0LCBTU0xfUl9OT19DRVJUSUZJQ0FURV9TRVQpOworICAgIHJldHVybiAtMTsKKyAgfQorCiAgIGZvciAoOzspIHsKICAgICBzdGF0ZSA9IHMtPnN0YXRlOwogCkBAIC0xNzgsOCArMTgxLDggQEAKICAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghc3NsM19pbml0X2hhbmRzaGFrZV9idWZmZXIocykpIHsKLSAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgaWYgKCFzc2wzX2luaXRfZmluaXNoZWRfbWFjKHMpKSB7CisgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkdGxzMV9hY2NlcHQsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICAgICAgICByZXQgPSAtMTsKICAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgfQpAQCAtMjQxLDE5ICsyNDQsOCBAQAogICAgICAgICBzLT5pbml0X251bSA9IDA7CiAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIFNTTDNfU1RfU1dfQ0VSVF9TVEFUVVNfQToKLSAgICAgIGNhc2UgU1NMM19TVF9TV19DRVJUX1NUQVRVU19COgotICAgICAgICByZXQgPSBzc2wzX3NlbmRfY2VydGlmaWNhdGVfc3RhdHVzKHMpOwotICAgICAgICBpZiAocmV0IDw9IDApIHsKLSAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgfQotICAgICAgICBzLT5zdGF0ZSA9IFNTTDNfU1RfU1dfS0VZX0VYQ0hfQTsKLSAgICAgICAgcy0+aW5pdF9udW0gPSAwOwotICAgICAgICBicmVhazsKLQogICAgICAgY2FzZSBTU0wzX1NUX1NXX0tFWV9FWENIX0E6CiAgICAgICBjYXNlIFNTTDNfU1RfU1dfS0VZX0VYQ0hfQjoKLSAgICAgIGNhc2UgU1NMM19TVF9TV19LRVlfRVhDSF9DOgogICAgICAgICBhbGdfYSA9IHMtPnMzLT50bXAubmV3X2NpcGhlci0+YWxnb3JpdGhtX2F1dGg7CiAKICAgICAgICAgLyogU2VuZCBhIFNlcnZlcktleUV4Y2hhbmdlIG1lc3NhZ2UgaWY6CkBAIC00NDcsNyArNDM5LDcgQEAKICAgICAgICAgZ290byBlbmQ7CiAKICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfVU5LTk9XTl9TVEFURSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgZHRsczFfYWNjZXB0LCBTU0xfUl9VTktOT1dOX1NUQVRFKTsKICAgICAgICAgcmV0ID0gLTE7CiAgICAgICAgIGdvdG8gZW5kOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9zc2wvZHRsc19yZWNvcmQuYyBiL3NyYy9zc2wvZHRsc19yZWNvcmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwNDk0YS4uMDAwMDAwMAotLS0gYS9zcmMvc3NsL2R0bHNfcmVjb3JkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyogRFRMUyBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGJ5IE5hZ2VuZHJhIE1vZGFkdWd1Ci0gKiAobmFnZW5kcmFAY3Muc3RhbmZvcmQuZWR1KSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdCAyMDA1LiAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0Ci0gKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCi0gKgotICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgotICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAotICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCi0gKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCi0gKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KLSAqCi0gKi8KLS8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KLSAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKLSAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgotICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcwotICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCi0gKgotICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KLSAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KLSAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KLSAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCi0gKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKLSAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQotICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKLSAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQotICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCi0gKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQotICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCi0gKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKLSAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKLSAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCi0KLSNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2J5dGVzdHJpbmcuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgotCi0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotCi0vKiB0b191NjRfYmUgdHJlYXRzIHxpbnwgYXMgYSA4LWJ5dGUgYmlnLWVuZGlhbiBpbnRlZ2VyIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBhcwotICogYSB8dWludDY0X3R8LiAqLwotc3RhdGljIHVpbnQ2NF90IHRvX3U2NF9iZShjb25zdCB1aW50OF90IGluWzhdKSB7Ci0gIHVpbnQ2NF90IHJldCA9IDA7Ci0gIHVuc2lnbmVkIGk7Ci0gIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLSAgICByZXQgPDw9IDg7Ci0gICAgcmV0IHw9IGluW2ldOwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIGR0bHMxX2JpdG1hcF9zaG91bGRfZGlzY2FyZCByZXR1cm5zIG9uZSBpZiB8c2VxX251bXwgaGFzIGJlZW4gc2VlbiBpbiB8Yml0bWFwfAotICogb3IgaXMgc3RhbGUuIE90aGVyd2lzZSBpdCByZXR1cm5zIHplcm8uICovCi1zdGF0aWMgaW50IGR0bHMxX2JpdG1hcF9zaG91bGRfZGlzY2FyZChEVExTMV9CSVRNQVAgKmJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgc2VxX251bVs4XSkgewotICBjb25zdCB1bnNpZ25lZCBrV2luZG93U2l6ZSA9IHNpemVvZihiaXRtYXAtPm1hcCkgKiA4OwotCi0gIHVpbnQ2NF90IHNlcV9udW1fdSA9IHRvX3U2NF9iZShzZXFfbnVtKTsKLSAgaWYgKHNlcV9udW1fdSA+IGJpdG1hcC0+bWF4X3NlcV9udW0pIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICB1aW50NjRfdCBpZHggPSBiaXRtYXAtPm1heF9zZXFfbnVtIC0gc2VxX251bV91OwotICByZXR1cm4gaWR4ID49IGtXaW5kb3dTaXplIHx8IChiaXRtYXAtPm1hcCAmICgoKHVpbnQ2NF90KTEpIDw8IGlkeCkpOwotfQotCi0vKiBkdGxzMV9iaXRtYXBfcmVjb3JkIHVwZGF0ZXMgfGJpdG1hcHwgdG8gcmVjb3JkIHJlY2VpcHQgb2Ygc2VxdWVuY2UgbnVtYmVyCi0gKiB8c2VxX251bXwuIEl0IHNsaWRlcyB0aGUgd2luZG93IGZvcndhcmQgaWYgbmVlZGVkLiBJdCBpcyBhbiBlcnJvciB0byBjYWxsCi0gKiB0aGlzIGZ1bmN0aW9uIG9uIGEgc3RhbGUgc2VxdWVuY2UgbnVtYmVyLiAqLwotc3RhdGljIHZvaWQgZHRsczFfYml0bWFwX3JlY29yZChEVExTMV9CSVRNQVAgKmJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBzZXFfbnVtWzhdKSB7Ci0gIGNvbnN0IHVuc2lnbmVkIGtXaW5kb3dTaXplID0gc2l6ZW9mKGJpdG1hcC0+bWFwKSAqIDg7Ci0KLSAgdWludDY0X3Qgc2VxX251bV91ID0gdG9fdTY0X2JlKHNlcV9udW0pOwotICAvKiBTaGlmdCB0aGUgd2luZG93IGlmIG5lY2Vzc2FyeS4gKi8KLSAgaWYgKHNlcV9udW1fdSA+IGJpdG1hcC0+bWF4X3NlcV9udW0pIHsKLSAgICB1aW50NjRfdCBzaGlmdCA9IHNlcV9udW1fdSAtIGJpdG1hcC0+bWF4X3NlcV9udW07Ci0gICAgaWYgKHNoaWZ0ID49IGtXaW5kb3dTaXplKSB7Ci0gICAgICBiaXRtYXAtPm1hcCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJpdG1hcC0+bWFwIDw8PSBzaGlmdDsKLSAgICB9Ci0gICAgYml0bWFwLT5tYXhfc2VxX251bSA9IHNlcV9udW1fdTsKLSAgfQotCi0gIHVpbnQ2NF90IGlkeCA9IGJpdG1hcC0+bWF4X3NlcV9udW0gLSBzZXFfbnVtX3U7Ci0gIGlmIChpZHggPCBrV2luZG93U2l6ZSkgewotICAgIGJpdG1hcC0+bWFwIHw9ICgodWludDY0X3QpMSkgPDwgaWR4OwotICB9Ci19Ci0KLWVudW0gc3NsX29wZW5fcmVjb3JkX3QgZHRsc19vcGVuX3JlY29yZCgKLSAgICBTU0wgKnNzbCwgdWludDhfdCAqb3V0X3R5cGUsIHVpbnQ4X3QgKm91dCwgc2l6ZV90ICpvdXRfbGVuLAotICAgIHNpemVfdCAqb3V0X2NvbnN1bWVkLCB1aW50OF90ICpvdXRfYWxlcnQsIHNpemVfdCBtYXhfb3V0LCBjb25zdCB1aW50OF90ICppbiwKLSAgICBzaXplX3QgaW5fbGVuKSB7Ci0gIENCUyBjYnM7Ci0gIENCU19pbml0KCZjYnMsIGluLCBpbl9sZW4pOwotCi0gIC8qIERlY29kZSB0aGUgcmVjb3JkLiAqLwotICB1aW50OF90IHR5cGU7Ci0gIHVpbnQxNl90IHZlcnNpb247Ci0gIHVpbnQ4X3Qgc2VxdWVuY2VbOF07Ci0gIENCUyBib2R5OwotICBpZiAoIUNCU19nZXRfdTgoJmNicywgJnR5cGUpIHx8Ci0gICAgICAhQ0JTX2dldF91MTYoJmNicywgJnZlcnNpb24pIHx8Ci0gICAgICAhQ0JTX2NvcHlfYnl0ZXMoJmNicywgc2VxdWVuY2UsIDgpIHx8Ci0gICAgICAhQ0JTX2dldF91MTZfbGVuZ3RoX3ByZWZpeGVkKCZjYnMsICZib2R5KSB8fAotICAgICAgKHNzbC0+czMtPmhhdmVfdmVyc2lvbiAmJiB2ZXJzaW9uICE9IHNzbC0+dmVyc2lvbikgfHwKLSAgICAgICh2ZXJzaW9uID4+IDgpICE9IERUTFMxX1ZFUlNJT05fTUFKT1IgfHwKLSAgICAgIENCU19sZW4oJmJvZHkpID4gU1NMM19SVF9NQVhfRU5DUllQVEVEX0xFTkdUSCkgewotICAgIC8qIFRoZSByZWNvcmQgaGVhZGVyIHdhcyBpbmNvbXBsZXRlIG9yIG1hbGZvcm1lZC4gRHJvcCB0aGUgZW50aXJlIHBhY2tldC4gKi8KLSAgICAqb3V0X2NvbnN1bWVkID0gaW5fbGVuOwotICAgIHJldHVybiBzc2xfb3Blbl9yZWNvcmRfZGlzY2FyZDsKLSAgfQotCi0gIGlmIChzc2wtPm1zZ19jYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgc3NsLT5tc2dfY2FsbGJhY2soMCAvKiByZWFkICovLCAwLCBTU0wzX1JUX0hFQURFUiwgaW4sCi0gICAgICAgICAgICAgICAgICAgICAgRFRMUzFfUlRfSEVBREVSX0xFTkdUSCwgc3NsLCBzc2wtPm1zZ19jYWxsYmFja19hcmcpOwotICB9Ci0KLSAgdWludDE2X3QgZXBvY2ggPSAoKCh1aW50MTZfdClzZXF1ZW5jZVswXSkgPDwgOCkgfCBzZXF1ZW5jZVsxXTsKLSAgaWYgKGVwb2NoICE9IHNzbC0+ZDEtPnJfZXBvY2ggfHwKLSAgICAgIGR0bHMxX2JpdG1hcF9zaG91bGRfZGlzY2FyZCgmc3NsLT5kMS0+Yml0bWFwLCBzZXF1ZW5jZSkpIHsKLSAgICAvKiBEcm9wIHRoaXMgcmVjb3JkLiBJdCdzIGZyb20gdGhlIHdyb25nIGVwb2NoIG9yIGlzIGEgcmVwbGF5LiBOb3RlIHRoYXQgaWYKLSAgICAgKiB8ZXBvY2h8IGlzIHRoZSBuZXh0IGVwb2NoLCB0aGUgcmVjb3JkIGNvdWxkIGJlIGJ1ZmZlcmVkIGZvciBsYXRlci4gRm9yCi0gICAgICogc2ltcGxpY2l0eSwgZHJvcCBpdCBhbmQgZXhwZWN0IHJldHJhbnNtaXQgdG8gaGFuZGxlIGl0IGxhdGVyOyBEVExTIG11c3QKLSAgICAgKiBoYW5kbGUgcGFja2V0IGxvc3MgYW55d2F5LiAqLwotICAgICpvdXRfY29uc3VtZWQgPSBpbl9sZW4gLSBDQlNfbGVuKCZjYnMpOwotICAgIHJldHVybiBzc2xfb3Blbl9yZWNvcmRfZGlzY2FyZDsKLSAgfQotCi0gIC8qIERlY3J5cHQgdGhlIGJvZHkuICovCi0gIHNpemVfdCBwbGFpbnRleHRfbGVuOwotICBpZiAoIVNTTF9BRUFEX0NUWF9vcGVuKHNzbC0+YWVhZF9yZWFkX2N0eCwgb3V0LCAmcGxhaW50ZXh0X2xlbiwgbWF4X291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCB2ZXJzaW9uLCBzZXF1ZW5jZSwgQ0JTX2RhdGEoJmJvZHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgIENCU19sZW4oJmJvZHkpKSkgewotICAgIC8qIEJhZCBwYWNrZXRzIGFyZSBzaWxlbnRseSBkcm9wcGVkIGluIERUTFMuIFNlZSBzZWN0aW9uIDQuMi4xIG9mIFJGQyA2MzQ3LgotICAgICAqIENsZWFyIHRoZSBlcnJvciBxdWV1ZSBvZiBhbnkgZXJyb3JzIGRlY3J5cHRpb24gbWF5IGhhdmUgYWRkZWQuIERyb3AgdGhlCi0gICAgICogZW50aXJlIHBhY2tldCBhcyBpdCBtdXN0IG5vdCBoYXZlIGNvbWUgZnJvbSB0aGUgcGVlci4KLSAgICAgKgotICAgICAqIFRPRE8oZGF2aWRiZW4pOiBUaGlzIGRvZXNuJ3QgZGlzdGluZ3Vpc2ggbWFsbG9jIGZhaWx1cmVzIGZyb20gZW5jcnlwdGlvbgotICAgICAqIGZhaWx1cmVzLiAqLwotICAgIEVSUl9jbGVhcl9lcnJvcigpOwotICAgICpvdXRfY29uc3VtZWQgPSBpbl9sZW4gLSBDQlNfbGVuKCZjYnMpOwotICAgIHJldHVybiBzc2xfb3Blbl9yZWNvcmRfZGlzY2FyZDsKLSAgfQotCi0gIC8qIENoZWNrIHRoZSBwbGFpbnRleHQgbGVuZ3RoLiAqLwotICBpZiAocGxhaW50ZXh0X2xlbiA+IFNTTDNfUlRfTUFYX1BMQUlOX0xFTkdUSCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfREFUQV9MRU5HVEhfVE9PX0xPTkcpOwotICAgICpvdXRfYWxlcnQgPSBTU0xfQURfUkVDT1JEX09WRVJGTE9XOwotICAgIHJldHVybiBzc2xfb3Blbl9yZWNvcmRfZXJyb3I7Ci0gIH0KLQotICBkdGxzMV9iaXRtYXBfcmVjb3JkKCZzc2wtPmQxLT5iaXRtYXAsIHNlcXVlbmNlKTsKLQotICAvKiBUT0RPKGRhdmlkYmVuKTogTGltaXQgdGhlIG51bWJlciBvZiBlbXB0eSByZWNvcmRzIGFzIGluIFRMUz8gVGhpcyBpcyBvbmx5Ci0gICAqIHVzZWZ1bCBpZiB3ZSBhbHNvIGxpbWl0IGRpc2NhcmRlZCBwYWNrZXRzLiAqLwotCi0gICpvdXRfdHlwZSA9IHR5cGU7Ci0gICpvdXRfbGVuID0gcGxhaW50ZXh0X2xlbjsKLSAgKm91dF9jb25zdW1lZCA9IGluX2xlbiAtIENCU19sZW4oJmNicyk7Ci0gIHJldHVybiBzc2xfb3Blbl9yZWNvcmRfc3VjY2VzczsKLX0KLQotaW50IGR0bHNfc2VhbF9yZWNvcmQoU1NMICpzc2wsIHVpbnQ4X3QgKm91dCwgc2l6ZV90ICpvdXRfbGVuLCBzaXplX3QgbWF4X291dCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHlwZSwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICBlbnVtIGR0bHMxX3VzZV9lcG9jaF90IHVzZV9lcG9jaCkgewotICAvKiBEZXRlcm1pbmUgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjdXJyZW50IGVwb2NoLiAqLwotICB1aW50MTZfdCBlcG9jaCA9IHNzbC0+ZDEtPndfZXBvY2g7Ci0gIFNTTF9BRUFEX0NUWCAqYWVhZCA9IHNzbC0+YWVhZF93cml0ZV9jdHg7Ci0gIHVpbnQ4X3QgKnNlcSA9IHNzbC0+czMtPndyaXRlX3NlcXVlbmNlOwotICBpZiAodXNlX2Vwb2NoID09IGR0bHMxX3VzZV9wcmV2aW91c19lcG9jaCkgewotICAgIC8qIERUTFMgcmVuZWdvdGlhdGlvbiBpcyB1bnN1cHBvcnRlZCwgc28gb25seSBlcG9jaHMgMCAoTlVMTCBjaXBoZXIpIGFuZCAxCi0gICAgICogKG5lZ290aWF0ZWQgY2lwaGVyKSBleGlzdC4gKi8KLSAgICBhc3NlcnQoc3NsLT5kMS0+d19lcG9jaCA9PSAxKTsKLSAgICBlcG9jaCA9IHNzbC0+ZDEtPndfZXBvY2ggLSAxOwotICAgIGFlYWQgPSBOVUxMOwotICAgIHNlcSA9IHNzbC0+ZDEtPmxhc3Rfd3JpdGVfc2VxdWVuY2U7Ci0gIH0KLQotICBpZiAobWF4X291dCA8IERUTFMxX1JUX0hFQURFUl9MRU5HVEgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0JVRkZFUl9UT09fU01BTEwpOwotICAgIHJldHVybiAwOwotICB9Ci0gIC8qIENoZWNrIHRoZSByZWNvcmQgaGVhZGVyIGRvZXMgbm90IGFsaWFzIGFueSBwYXJ0IG9mIHRoZSBpbnB1dC4KLSAgICogfFNTTF9BRUFEX0NUWF9zZWFsfCB3aWxsIGludGVybmFsbHkgZW5mb3JjZSBvdGhlciBhbGlhc2luZyByZXF1aXJlbWVudHMuICovCi0gIGlmIChpbiA8IG91dCArIERUTFMxX1JUX0hFQURFUl9MRU5HVEggJiYgb3V0IDwgaW4gKyBpbl9sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX09VVFBVVF9BTElBU0VTX0lOUFVUKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIG91dFswXSA9IHR5cGU7Ci0KLSAgdWludDE2X3Qgd2lyZV92ZXJzaW9uID0gc3NsLT5zMy0+aGF2ZV92ZXJzaW9uID8gc3NsLT52ZXJzaW9uIDogRFRMUzFfVkVSU0lPTjsKLSAgb3V0WzFdID0gd2lyZV92ZXJzaW9uID4+IDg7Ci0gIG91dFsyXSA9IHdpcmVfdmVyc2lvbiAmIDB4ZmY7Ci0KLSAgb3V0WzNdID0gZXBvY2ggPj4gODsKLSAgb3V0WzRdID0gZXBvY2ggJiAweGZmOwotICBtZW1jcHkoJm91dFs1XSwgJnNlcVsyXSwgNik7Ci0KLSAgc2l6ZV90IGNpcGhlcnRleHRfbGVuOwotICBpZiAoIVNTTF9BRUFEX0NUWF9zZWFsKGFlYWQsIG91dCArIERUTFMxX1JUX0hFQURFUl9MRU5HVEgsICZjaXBoZXJ0ZXh0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfb3V0IC0gRFRMUzFfUlRfSEVBREVSX0xFTkdUSCwgdHlwZSwgd2lyZV92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRbM10gLyogc2VxICovLCBpbiwgaW5fbGVuKSB8fAotICAgICAgIXNzbDNfcmVjb3JkX3NlcXVlbmNlX3VwZGF0ZSgmc2VxWzJdLCA2KSkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaWYgKGNpcGhlcnRleHRfbGVuID49IDEgPDwgMTYpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX09WRVJGTE9XKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBvdXRbMTFdID0gY2lwaGVydGV4dF9sZW4gPj4gODsKLSAgb3V0WzEyXSA9IGNpcGhlcnRleHRfbGVuICYgMHhmZjsKLQotICAqb3V0X2xlbiA9IERUTFMxX1JUX0hFQURFUl9MRU5HVEggKyBjaXBoZXJ0ZXh0X2xlbjsKLQotICBpZiAoc3NsLT5tc2dfY2FsbGJhY2spIHsKLSAgICBzc2wtPm1zZ19jYWxsYmFjaygxIC8qIHdyaXRlICovLCAwLCBTU0wzX1JUX0hFQURFUiwgb3V0LAotICAgICAgICAgICAgICAgICAgICAgIERUTFMxX1JUX0hFQURFUl9MRU5HVEgsIHNzbCwgc3NsLT5tc2dfY2FsbGJhY2tfYXJnKTsKLSAgfQotCi0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3NzbC9pbnRlcm5hbC5oIGIvc3JjL3NzbC9pbnRlcm5hbC5oCmluZGV4IDZmYjhkYmUuLjdkOWE1YWQgMTAwNjQ0Ci0tLSBhL3NyYy9zc2wvaW50ZXJuYWwuaAorKysgYi9zcmMvc3NsL2ludGVybmFsLmgKQEAgLTE4Miw3ICsxODIsNiBAQAogI2RlZmluZSBTU0xfQUVTMTI4R0NNIDB4MDAwMDAwMTBMCiAjZGVmaW5lIFNTTF9BRVMyNTZHQ00gMHgwMDAwMDAyMEwKICNkZWZpbmUgU1NMX0NIQUNIQTIwUE9MWTEzMDUgMHgwMDAwMDA0MEwKLSNkZWZpbmUgU1NMX2VOVUxMIDB4MDAwMDAwODBMCiAKICNkZWZpbmUgU1NMX0FFUyAoU1NMX0FFUzEyOCB8IFNTTF9BRVMyNTYgfCBTU0xfQUVTMTI4R0NNIHwgU1NMX0FFUzI1NkdDTSkKIApAQCAtMjAzLDE1ICsyMDIsMjUgQEAKICNkZWZpbmUgU1NMX1RMU1YxIFNTTF9TU0xWMwogI2RlZmluZSBTU0xfVExTVjFfMiAweDAwMDAwMDA0TAogCi0vKiBCaXRzIGZvciB8YWxnb3JpdGhtX3ByZnwgKGhhbmRzaGFrZSBkaWdlc3QpLiAqLwotI2RlZmluZSBTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUIDB4MQotI2RlZmluZSBTU0xfSEFORFNIQUtFX01BQ19TSEEyNTYgMHgyCi0jZGVmaW5lIFNTTF9IQU5EU0hBS0VfTUFDX1NIQTM4NCAweDQKKy8qIEJpdHMgZm9yIHxhbGdvcml0aG0yfCAoaGFuZHNoYWtlIGRpZ2VzdHMgYW5kIG90aGVyIGV4dHJhIGZsYWdzKS4gKi8KKworI2RlZmluZSBTU0xfSEFORFNIQUtFX01BQ19NRDUgMHgxMAorI2RlZmluZSBTU0xfSEFORFNIQUtFX01BQ19TSEEgMHgyMAorI2RlZmluZSBTU0xfSEFORFNIQUtFX01BQ19TSEEyNTYgMHg0MAorI2RlZmluZSBTU0xfSEFORFNIQUtFX01BQ19TSEEzODQgMHg4MAorI2RlZmluZSBTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUIFwKKyAgKFNTTF9IQU5EU0hBS0VfTUFDX01ENSB8IFNTTF9IQU5EU0hBS0VfTUFDX1NIQSkKIAogLyogU1NMX01BWF9ESUdFU1QgaXMgdGhlIG51bWJlciBvZiBkaWdlc3QgdHlwZXMgd2hpY2ggZXhpc3QuIFdoZW4gYWRkaW5nIGEgbmV3CiAgKiBvbmUsIHVwZGF0ZSB0aGUgdGFibGUgaW4gc3NsX2NpcGhlci5jLiAqLwogI2RlZmluZSBTU0xfTUFYX0RJR0VTVCA0CiAKKy8qIFNTTF9DSVBIRVJfQUxHT1JJVEhNMl9WQVJJQUJMRV9OT05DRV9JTkNMVURFRF9JTl9SRUNPUkQgaXMgYSBmbGFnIGluCisgKiBTU0xfQ0lQSEVSLmFsZ29yaXRobTIgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZhcmlhYmxlIHBhcnQgb2YgdGhlIG5vbmNlIGlzCisgKiBpbmNsdWRlZCBhcyBhIHByZWZpeCBvZiB0aGUgcmVjb3JkLiAoQUVTLUdDTSwgZm9yIGV4YW1wbGUsIGRvZXMgd2l0aCB3aXRoIGFuCisgKiA4LWJ5dGUgdmFyaWFibGUgbm9uY2UuKSAqLworI2RlZmluZSBTU0xfQ0lQSEVSX0FMR09SSVRITTJfVkFSSUFCTEVfTk9OQ0VfSU5DTFVERURfSU5fUkVDT1JEICgxPDwyMikKKwogLyogQml0cyBmb3IgfGFsZ29fc3RyZW5ndGh8LCBjaXBoZXIgc3RyZW5ndGggaW5mb3JtYXRpb24uICovCiAjZGVmaW5lIFNTTF9NRURJVU0gMHgwMDAwMDAwMUwKICNkZWZpbmUgU1NMX0hJR0ggMHgwMDAwMDAwMkwKQEAgLTIyNywxMSArMjM2LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpvdXRfZml4ZWRfaXZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNTTF9DSVBIRVIgKmNpcGhlciwgdWludDE2X3QgdmVyc2lvbik7CiAKLS8qIHNzbF9nZXRfaGFuZHNoYWtlX2RpZ2VzdCByZXR1cm5zIHRoZSB8RVZQX01EfCBjb3JyZXNwb25kaW5nIHRvCi0gKiB8YWxnb3JpdGhtX3ByZnwuIEl0IHJldHVybnMgU0hBLTEgZm9yIHxTU0xfSEFORFNIQUtFX0RFRkFVTFR8LiBUaGUgY2FsbGVyIGlzCi0gKiByZXNwb25zaWJsZSBmb3IgbWFpbnRhaW5pbmcgdGhlIGFkZGl0aW9uYWwgTUQ1IGRpZ2VzdCBhbmQgc3dpdGNoaW5nIHRvCi0gKiBTSEEtMjU2IGluIFRMUyAxLjIuICovCi1jb25zdCBFVlBfTUQgKnNzbF9nZXRfaGFuZHNoYWtlX2RpZ2VzdCh1aW50MzJfdCBhbGdvcml0aG1fcHJmKTsKKy8qIHNzbF9nZXRfaGFuZHNoYWtlX2RpZ2VzdCBsb29rcyB1cCB0aGUgfGl8dGggaGFuZHNoYWtlIGRpZ2VzdCB0eXBlIGFuZCBzZXRzCisgKiB8Km91dF9tYXNrfCB0byB0aGUgfFNTTF9IQU5EU0hBS0VfTUFDXyp8IG1hc2sgYW5kIHwqb3V0X21kfCB0byB0aGUKKyAqIHxFVlBfTUR8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzcyBhbmQgemVybyBpZiB8aXwgPj0gfFNTTF9NQVhfRElHRVNUfC4gKi8KK2ludCBzc2xfZ2V0X2hhbmRzaGFrZV9kaWdlc3QodWludDMyX3QgKm91dF9tYXNrLCBjb25zdCBFVlBfTUQgKipvdXRfbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpKTsKIAogLyogc3NsX2NyZWF0ZV9jaXBoZXJfbGlzdCBldmFsdWF0ZXMgfHJ1bGVfc3RyfCBhY2NvcmRpbmcgdG8gdGhlIGNpcGhlcnMgaW4KICAqIHxzc2xfbWV0aG9kfC4gSXQgc2V0cyB8Km91dF9jaXBoZXJfbGlzdHwgdG8gYSBuZXdseS1hbGxvY2F0ZWQKQEAgLTI0NSwxMiArMjU0LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIFNUQUNLX09GKFNTTF9DSVBIRVIpICoqb3V0X2NpcGhlcl9saXN0X2J5X2lkLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpydWxlX3N0cik7CiAKKy8qIFNTTF9QS0VZXyogZGVub3RlIGNlcnRpZmljYXRlIHR5cGVzLiAqLworI2RlZmluZSBTU0xfUEtFWV9SU0FfRU5DIDAKKyNkZWZpbmUgU1NMX1BLRVlfUlNBX1NJR04gMQorI2RlZmluZSBTU0xfUEtFWV9FQ0MgMgorI2RlZmluZSBTU0xfUEtFWV9OVU0gMworCiAvKiBzc2xfY2lwaGVyX2dldF92YWx1ZSByZXR1cm5zIHRoZSBjaXBoZXIgc3VpdGUgaWQgb2YgfGNpcGhlcnwuICovCiB1aW50MTZfdCBzc2xfY2lwaGVyX2dldF92YWx1ZShjb25zdCBTU0xfQ0lQSEVSICpjaXBoZXIpOwogCi0vKiBzc2xfY2lwaGVyX2dldF9rZXlfdHlwZSByZXR1cm5zIHRoZSB8RVZQX1BLRVlfKnwgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUKLSAqIHNlcnZlciBrZXkgdXNlZCBpbiB8Y2lwaGVyfCBvciB8RVZQX1BLRVlfTk9ORXwgaWYgdGhlcmUgaXMgbm9uZS4gKi8KLWludCBzc2xfY2lwaGVyX2dldF9rZXlfdHlwZShjb25zdCBTU0xfQ0lQSEVSICpjaXBoZXIpOworLyogc3NsX2NpcGhlcl9nZXRfY2VydF9pbmRleCByZXR1cm5zIHRoZSB8U1NMX1BLRVlfKnwgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUKKyAqIGNlcnRpZmljYXRlIHR5cGUgb2YgfGNpcGhlcnwgb3IgLTEgaWYgdGhlcmUgaXMgbm9uZS4gKi8KK2ludCBzc2xfY2lwaGVyX2dldF9jZXJ0X2luZGV4KGNvbnN0IFNTTF9DSVBIRVIgKmNpcGhlcik7CiAKIC8qIHNzbF9jaXBoZXJfaGFzX3NlcnZlcl9wdWJsaWNfa2V5IHJldHVybnMgMSBpZiB8Y2lwaGVyfCBpbnZvbHZlcyBhIHNlcnZlcgogICogcHVibGljIGtleSBpbiB0aGUga2V5IGV4Y2hhbmdlLCBzZW50IGluIGEgc2VydmVyIENlcnRpZmljYXRlIG1lc3NhZ2UuCkBAIC0yNjAsMTYgKzI3NSwxMSBAQAogLyogc3NsX2NpcGhlcl9yZXF1aXJlc19zZXJ2ZXJfa2V5X2V4Y2hhbmdlIHJldHVybnMgMSBpZiB8Y2lwaGVyfCByZXF1aXJlcyBhCiAgKiBTZXJ2ZXJLZXlFeGNoYW5nZSBtZXNzYWdlLiBPdGhlcndpc2UgaXQgcmV0dXJucyAwLgogICoKLSAqIFVubGlrZSB8c3NsX2NpcGhlcl9oYXNfc2VydmVyX3B1YmxpY19rZXl8LCB0aGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gemVybwotICogd2hpbGUgc3RpbGwgYWxsb3dpbmcgfGNpcGhlcnwgYW4gb3B0aW9uYWwgU2VydmVyS2V5RXhjaGFuZ2UuIFRoaXMgaXMgdGhlCi0gKiBjYXNlIGZvciBwbGFpbiBQU0sgY2lwaGVycy4gKi8KKyAqIFVubGlrZSBzc2xfY2lwaGVyX2hhc19zZXJ2ZXJfcHVibGljX2tleSwgc29tZSBjaXBoZXJzIHRha2Ugb3B0aW9uYWwKKyAqIFNlcnZlcktleUV4Y2hhbmdlcy4gUFNLIGFuZCBSU0FfUFNLIG9ubHkgdXNlIHRoZSBTZXJ2ZXJLZXlFeGNoYW5nZSB0bworICogY29tbXVuaWNhdGUgYSBwc2tfaWRlbnRpdHlfaGludCwgc28gaXQgaXMgb3B0aW9uYWwuICovCiBpbnQgc3NsX2NpcGhlcl9yZXF1aXJlc19zZXJ2ZXJfa2V5X2V4Y2hhbmdlKGNvbnN0IFNTTF9DSVBIRVIgKmNpcGhlcik7CiAKLS8qIHNzbF9jaXBoZXJfZ2V0X3JlY29yZF9zcGxpdF9sZW4sIGZvciBUTFMgMS4wIENCQyBtb2RlIGNpcGhlcnMsIHJldHVybnMgdGhlCi0gKiBsZW5ndGggb2YgYW4gZW5jcnlwdGVkIDEtYnl0ZSByZWNvcmQsIGZvciB1c2UgaW4gcmVjb3JkLXNwbGl0dGluZy4gT3RoZXJ3aXNlCi0gKiBpdCByZXR1cm5zIHplcm8uICovCi1zaXplX3Qgc3NsX2NpcGhlcl9nZXRfcmVjb3JkX3NwbGl0X2xlbihjb25zdCBTU0xfQ0lQSEVSICpjaXBoZXIpOwotCiAKIC8qIEVuY3J5cHRpb24gbGF5ZXIuICovCiAKQEAgLTM0MCwyMzggKzM1MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluX2xlbik7CiAKIAotLyogRFRMUyByZXBsYXkgYml0bWFwLiAqLwotCi0vKiBEVExTMV9CSVRNQVAgbWFpbnRhaW5zIGEgc2xpZGluZyB3aW5kb3cgb2YgNjQgc2VxdWVuY2UgbnVtYmVycyB0byBkZXRlY3QKLSAqIHJlcGxheWVkIHBhY2tldHMuIEl0IHNob3VsZCBiZSBpbml0aWFsaXplZCBieSB6ZXJvaW5nIGV2ZXJ5IGZpZWxkLiAqLwotdHlwZWRlZiBzdHJ1Y3QgZHRsczFfYml0bWFwX3N0IHsKLSAgLyogbWFwIGlzIGEgYml0IG1hc2sgb2YgdGhlIGxhc3QgNjQgc2VxdWVuY2UgbnVtYmVycy4gQml0Ci0gICAqIHwxPDxpfCBjb3JyZXNwb25kcyB0byB8bWF4X3NlcV9udW0gLSBpfC4gKi8KLSAgdWludDY0X3QgbWFwOwotICAvKiBtYXhfc2VxX251bSBpcyB0aGUgbGFyZ2VzdCBzZXF1ZW5jZSBudW1iZXIgc2VlbiBzbyBmYXIgYXMgYSA2NC1iaXQKLSAgICogaW50ZWdlci4gKi8KLSAgdWludDY0X3QgbWF4X3NlcV9udW07Ci19IERUTFMxX0JJVE1BUDsKLQotCi0vKiBSZWNvcmQgbGF5ZXIuICovCi0KLS8qIHNzbF9yZWNvcmRfcHJlZml4X2xlbiByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHByZWZpeCBiZWZvcmUgdGhlIGNpcGhlcnRleHQKLSAqIG9mIGEgcmVjb3JkIGZvciB8c3NsfC4KLSAqCi0gKiBUT0RPKGRhdmlkYmVuKTogRXhwb3NlIHRoaXMgYXMgcGFydCBvZiBwdWJsaWMgQVBJIG9uY2UgdGhlIGhpZ2gtbGV2ZWwKLSAqIGJ1ZmZlci1mcmVlIEFQSXMgYXJlIGF2YWlsYWJsZS4gKi8KLXNpemVfdCBzc2xfcmVjb3JkX3ByZWZpeF9sZW4oY29uc3QgU1NMICpzc2wpOwotCi1lbnVtIHNzbF9vcGVuX3JlY29yZF90IHsKLSAgc3NsX29wZW5fcmVjb3JkX3N1Y2Nlc3MsCi0gIHNzbF9vcGVuX3JlY29yZF9kaXNjYXJkLAotICBzc2xfb3Blbl9yZWNvcmRfcGFydGlhbCwKLSAgc3NsX29wZW5fcmVjb3JkX2Vycm9yLAotfTsKLQotLyogdGxzX29wZW5fcmVjb3JkIGRlY3J5cHRzIGEgcmVjb3JkIGZyb20gfGlufC4KLSAqCi0gKiBPbiBzdWNjZXNzLCBpdCByZXR1cm5zIHxzc2xfb3Blbl9yZWNvcmRfc3VjY2Vzc3wuIEl0IHNldHMgfCpvdXRfdHlwZXwgdG8gdGhlCi0gKiByZWNvcmQgdHlwZSwgfCpvdXRfbGVufCB0byB0aGUgcGxhaW50ZXh0IGxlbmd0aCwgYW5kIHdyaXRlcyB0aGUgcmVjb3JkIGJvZHkKLSAqIHRvIHxvdXR8LiBJdCBzZXRzIHwqb3V0X2NvbnN1bWVkfCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHxpbnwgY29uc3VtZWQuCi0gKiBOb3RlIHRoYXQgfCpvdXRfbGVufCBtYXkgYmUgemVyby4KLSAqCi0gKiBJZiBhIHJlY29yZCB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBidXQgc2hvdWxkIGJlIGRpc2NhcmRlZCwgaXQgcmV0dXJucwotICogfHNzbF9vcGVuX3JlY29yZF9kaXNjYXJkfCBhbmQgc2V0cyB8Km91dF9jb25zdW1lZHwgdG8gdGhlIG51bWJlciBvZiBieXRlcwotICogY29uc3VtZWQuCi0gKgotICogSWYgdGhlIGlucHV0IGRpZCBub3QgY29udGFpbiBhIGNvbXBsZXRlIHJlY29yZCwgaXQgcmV0dXJucwotICogfHNzbF9vcGVuX3JlY29yZF9wYXJ0aWFsfC4gSXQgc2V0cyB8Km91dF9jb25zdW1lZHwgdG8gdGhlIHRvdGFsIG51bWJlciBvZgotICogYnl0ZXMgbmVjZXNzYXJ5LiBJdCBpcyBndWFyYW50ZWVkIHRoYXQgYSBzdWNjZXNzZnVsIGNhbGwgdG8gfHRsc19vcGVuX3JlY29yZHwKLSAqIHdpbGwgY29uc3VtZSBhdCBsZWFzdCB0aGF0IG1hbnkgYnl0ZXMuCi0gKgotICogT24gZmFpbHVyZSwgaXQgcmV0dXJucyB8c3NsX29wZW5fcmVjb3JkX2Vycm9yfCBhbmQgc2V0cyB8Km91dF9hbGVydHwgdG8gYW4KLSAqIGFsZXJ0IHRvIGVtaXQuCi0gKgotICogSWYgfGlufCBhbmQgfG91dHwgYWxpYXMsIHxvdXR8IG11c3QgYmUgPD0gfGlufCArIHxzc2xfcmVjb3JkX3ByZWZpeF9sZW58LiAqLwotZW51bSBzc2xfb3Blbl9yZWNvcmRfdCB0bHNfb3Blbl9yZWNvcmQoCi0gICAgU1NMICpzc2wsIHVpbnQ4X3QgKm91dF90eXBlLCB1aW50OF90ICpvdXQsIHNpemVfdCAqb3V0X2xlbiwKLSAgICBzaXplX3QgKm91dF9jb25zdW1lZCwgdWludDhfdCAqb3V0X2FsZXJ0LCBzaXplX3QgbWF4X291dCwgY29uc3QgdWludDhfdCAqaW4sCi0gICAgc2l6ZV90IGluX2xlbik7Ci0KLS8qIGR0bHNfb3Blbl9yZWNvcmQgaW1wbGVtZW50cyB8dGxzX29wZW5fcmVjb3JkfCBmb3IgRFRMUy4gSXQgbmV2ZXIgcmV0dXJucwotICogfHNzbF9vcGVuX3JlY29yZF9wYXJ0aWFsfCBidXQgb3RoZXJ3aXNlIGJlaGF2ZXMgYW5hbG9nb3VzbHkuICovCi1lbnVtIHNzbF9vcGVuX3JlY29yZF90IGR0bHNfb3Blbl9yZWNvcmQoCi0gICAgU1NMICpzc2wsIHVpbnQ4X3QgKm91dF90eXBlLCB1aW50OF90ICpvdXQsIHNpemVfdCAqb3V0X2xlbiwKLSAgICBzaXplX3QgKm91dF9jb25zdW1lZCwgdWludDhfdCAqb3V0X2FsZXJ0LCBzaXplX3QgbWF4X291dCwgY29uc3QgdWludDhfdCAqaW4sCi0gICAgc2l6ZV90IGluX2xlbik7Ci0KLS8qIHNzbF9zZWFsX3ByZWZpeF9sZW4gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBwcmVmaXggYmVmb3JlIHRoZSBjaXBoZXJ0ZXh0Ci0gKiB3aGVuIHNlYWxpbmcgYSByZWNvcmQgd2l0aCB8c3NsfC4gTm90ZSB0aGF0IHRoaXMgdmFsdWUgbWF5IGRpZmZlciBmcm9tCi0gKiB8c3NsX3JlY29yZF9wcmVmaXhfbGVufCB3aGVuIFRMUyAxLjAgQ0JDIHJlY29yZC1zcGxpdHRpbmcgaXMgZW5hYmxlZC4gU2VhbGluZwotICogYSBzbWFsbCByZWNvcmQgbWF5IGFsc28gcmVzdWx0IGluIGEgc21hbGxlciBvdXRwdXQgdGhhbiB0aGlzIHZhbHVlLgotICoKLSAqIFRPRE8oZGF2aWRiZW4pOiBFeHBvc2UgdGhpcyBhcyBwYXJ0IG9mIHB1YmxpYyBBUEkgb25jZSB0aGUgaGlnaC1sZXZlbAotICogYnVmZmVyLWZyZWUgQVBJcyBhcmUgYXZhaWxhYmxlLiAqLwotc2l6ZV90IHNzbF9zZWFsX3ByZWZpeF9sZW4oY29uc3QgU1NMICpzc2wpOwotCi0vKiBzc2xfbWF4X3NlYWxfb3ZlcmhlYWQgcmV0dXJucyB0aGUgbWF4aW11bSBvdmVyaGVhZCBvZiBzZWFsaW5nIGEgcmVjb3JkIHdpdGgKLSAqIHxzc2x8LiBUaGlzIGluY2x1ZGVzIHxzc2xfc2VhbF9wcmVmaXhfbGVufC4KLSAqCi0gKiBUT0RPKGRhdmlkYmVuKTogRXhwb3NlIHRoaXMgYXMgcGFydCBvZiBwdWJsaWMgQVBJIG9uY2UgdGhlIGhpZ2gtbGV2ZWwKLSAqIGJ1ZmZlci1mcmVlIEFQSXMgYXJlIGF2YWlsYWJsZS4gKi8KLXNpemVfdCBzc2xfbWF4X3NlYWxfb3ZlcmhlYWQoY29uc3QgU1NMICpzc2wpOwotCi0vKiB0bHNfc2VhbF9yZWNvcmQgc2VhbHMgYSBuZXcgcmVjb3JkIG9mIHR5cGUgfHR5cGV8IGFuZCBib2R5IHxpbnwgYW5kIHdyaXRlcyBpdAotICogdG8gfG91dHwuIEF0IG1vc3QgfG1heF9vdXR8IGJ5dGVzIHdpbGwgYmUgd3JpdHRlbi4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcwotICogYW5kIHplcm8gb24gZXJyb3IuIElmIGVuYWJsZWQsIHx0bHNfc2VhbF9yZWNvcmR8IGltcGxlbWVudHMgVExTIDEuMCBDQkMgMS9uLTEKLSAqIHJlY29yZCBzcGxpdHRpbmcgYW5kIG1heSB3cml0ZSB0d28gcmVjb3JkcyBjb25jYXRlbmF0ZWQuCi0gKgotICogRm9yIGEgbGFyZ2UgcmVjb3JkLCB0aGUgY2lwaGVydGV4dCB3aWxsIGJlZ2luIHxzc2xfc2VhbF9wcmVmaXhfbGVufCBieXRlcwotICogaW50byBvdXQuIEFsaWduaW5nIHxvdXR8IGFwcHJvcHJpYXRlbHkgbWF5IGltcHJvdmUgcGVyZm9ybWFuY2UuIEl0IHdyaXRlcyBhdAotICogbW9zdCB8aW5fbGVufCArIHxzc2xfbWF4X3NlYWxfb3ZlcmhlYWR8IGJ5dGVzIHRvIHxvdXR8LgotICoKLSAqIElmIHxpbnwgYW5kIHxvdXR8IGFsaWFzLCB8b3V0fCArIHxzc2xfc2VhbF9wcmVmaXhfbGVufCBtdXN0IGJlIDw9IHxpbnwuICovCi1pbnQgdGxzX3NlYWxfcmVjb3JkKFNTTCAqc3NsLCB1aW50OF90ICpvdXQsIHNpemVfdCAqb3V0X2xlbiwgc2l6ZV90IG1heF9vdXQsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHlwZSwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbl9sZW4pOwotCi1lbnVtIGR0bHMxX3VzZV9lcG9jaF90IHsKLSAgZHRsczFfdXNlX3ByZXZpb3VzX2Vwb2NoLAotICBkdGxzMV91c2VfY3VycmVudF9lcG9jaCwKLX07Ci0KLS8qIGR0bHNfc2VhbF9yZWNvcmQgaW1wbGVtZW50cyB8dGxzX3NlYWxfcmVjb3JkfCBmb3IgRFRMUy4gfHVzZV9lcG9jaHwgc2VsZWN0cwotICogd2hpY2ggZXBvY2gncyBjaXBoZXIgc3RhdGUgdG8gdXNlLiAqLwotaW50IGR0bHNfc2VhbF9yZWNvcmQoU1NMICpzc2wsIHVpbnQ4X3QgKm91dCwgc2l6ZV90ICpvdXRfbGVuLCBzaXplX3QgbWF4X291dCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHlwZSwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICBlbnVtIGR0bHMxX3VzZV9lcG9jaF90IHVzZV9lcG9jaCk7Ci0KLQotLyogUHJpdmF0ZSBrZXkgb3BlcmF0aW9ucy4gKi8KLQotLyogc3NsX2hhc19wcml2YXRlX2tleSByZXR1cm5zIG9uZSBpZiB8c3NsfCBoYXMgYSBwcml2YXRlIGtleQotICogY29uZmlndXJlZCBhbmQgemVybyBvdGhlcndpc2UuICovCi1pbnQgc3NsX2hhc19wcml2YXRlX2tleShTU0wgKnNzbCk7Ci0KLS8qIHNzbF9wcml2YXRlX2tleV8qIGNhbGwgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24gb24gdGhlCi0gKiB8U1NMX1BSSVZBVEVfS0VZX01FVEhPRHwgZm9yIHxzc2x8LCBpZiBjb25maWd1cmVkLiBPdGhlcndpc2UsIHRoZXkgaW1wbGVtZW50Ci0gKiB0aGUgb3BlcmF0aW9uIHdpdGggfEVWUF9QS0VZfC4gKi8KLQotaW50IHNzbF9wcml2YXRlX2tleV90eXBlKFNTTCAqc3NsKTsKLQotc2l6ZV90IHNzbF9wcml2YXRlX2tleV9tYXhfc2lnbmF0dXJlX2xlbihTU0wgKnNzbCk7Ci0KLWVudW0gc3NsX3ByaXZhdGVfa2V5X3Jlc3VsdF90IHNzbF9wcml2YXRlX2tleV9zaWduKAotICAgIFNTTCAqc3NsLCB1aW50OF90ICpvdXQsIHNpemVfdCAqb3V0X2xlbiwgc2l6ZV90IG1heF9vdXQsIGNvbnN0IEVWUF9NRCAqbWQsCi0gICAgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbl9sZW4pOwotCi1lbnVtIHNzbF9wcml2YXRlX2tleV9yZXN1bHRfdCBzc2xfcHJpdmF0ZV9rZXlfc2lnbl9jb21wbGV0ZSgKLSAgICBTU0wgKnNzbCwgdWludDhfdCAqb3V0LCBzaXplX3QgKm91dF9sZW4sIHNpemVfdCBtYXhfb3V0KTsKLQotCi0vKiBDdXN0b20gZXh0ZW5zaW9ucyAqLwotCi0vKiBzc2xfY3VzdG9tX2V4dGVuc2lvbiAoYS5rLmEuIFNTTF9DVVNUT01fRVhURU5TSU9OKSBpcyBhIHN0cnVjdHVyZSB0aGF0Ci0gKiBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBjdXN0b20tZXh0ZW5zaW9uIGNhbGxiYWNrcy4gKi8KLXN0cnVjdCBzc2xfY3VzdG9tX2V4dGVuc2lvbiB7Ci0gIFNTTF9jdXN0b21fZXh0X2FkZF9jYiBhZGRfY2FsbGJhY2s7Ci0gIHZvaWQgKmFkZF9hcmc7Ci0gIFNTTF9jdXN0b21fZXh0X2ZyZWVfY2IgZnJlZV9jYWxsYmFjazsKLSAgU1NMX2N1c3RvbV9leHRfcGFyc2VfY2IgcGFyc2VfY2FsbGJhY2s7Ci0gIHZvaWQgKnBhcnNlX2FyZzsKLSAgdWludDE2X3QgdmFsdWU7Ci19OwotCi12b2lkIFNTTF9DVVNUT01fRVhURU5TSU9OX2ZyZWUoU1NMX0NVU1RPTV9FWFRFTlNJT04gKmN1c3RvbV9leHRlbnNpb24pOwotCi1pbnQgY3VzdG9tX2V4dF9hZGRfY2xpZW50aGVsbG8oU1NMICpzc2wsIENCQiAqZXh0ZW5zaW9ucyk7Ci1pbnQgY3VzdG9tX2V4dF9wYXJzZV9zZXJ2ZXJoZWxsbyhTU0wgKnNzbCwgaW50ICpvdXRfYWxlcnQsIHVpbnQxNl90IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0JTICpleHRlbnNpb24pOwotaW50IGN1c3RvbV9leHRfcGFyc2VfY2xpZW50aGVsbG8oU1NMICpzc2wsIGludCAqb3V0X2FsZXJ0LCB1aW50MTZfdCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENCUyAqZXh0ZW5zaW9uKTsKLWludCBjdXN0b21fZXh0X2FkZF9zZXJ2ZXJoZWxsbyhTU0wgKnNzbCwgQ0JCICpleHRlbnNpb25zKTsKLQotCi0vKiBIYW5kc2hha2UgaGFzaC4KLSAqCi0gKiBUaGUgVExTIGhhbmRzaGFrZSBtYWludGFpbnMgYSB0cmFuc2NyaXB0IG9mIGFsbCBoYW5kc2hha2UgbWVzc2FnZXMuIEF0Ci0gKiB2YXJpb3VzIHBvaW50cyBpbiB0aGUgcHJvdG9jb2wsIHRoaXMgaXMgZWl0aGVyIGEgaGFuZHNoYWtlIGJ1ZmZlciwgYSByb2xsaW5nCi0gKiBoYXNoIChzZWxlY3RlZCBieSBjaXBoZXIgc3VpdGUpIG9yIGJvdGguICovCi0KLS8qIHNzbDNfaW5pdF9oYW5kc2hha2VfYnVmZmVyIGluaXRpYWxpemVzIHRoZSBoYW5kc2hha2UgYnVmZmVyIGFuZCByZXNldHMgdGhlCi0gKiBoYW5kc2hha2UgaGFzaC4gSXQgcmV0dXJucyBvbmUgc3VjY2VzcyBhbmQgemVybyBvbiBmYWlsdXJlLiAqLwotaW50IHNzbDNfaW5pdF9oYW5kc2hha2VfYnVmZmVyKFNTTCAqc3NsKTsKLQotLyogc3NsM19pbml0X2hhbmRzaGFrZV9oYXNoIGluaXRpYWxpemVzIHRoZSBoYW5kc2hha2UgaGFzaCBiYXNlZCBvbiB0aGUgcGVuZGluZwotICogY2lwaGVyIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIGhhbmRzaGFrZSBidWZmZXIuIFN1YnNlcXVlbnQgY2FsbHMgdG8KLSAqIHxzc2wzX3VwZGF0ZV9oYW5kc2hha2VfaGFzaHwgd2lsbCB1cGRhdGUgdGhlIHJvbGxpbmcgaGFzaC4gSXQgcmV0dXJucyBvbmUgb24KLSAqIHN1Y2Nlc3MgYW5kIHplcm8gb24gZmFpbHVyZS4gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIHRoZQotICogaGFuZHNoYWtlIGJ1ZmZlciBpcyByZWxlYXNlZC4gKi8KLWludCBzc2wzX2luaXRfaGFuZHNoYWtlX2hhc2goU1NMICpzc2wpOwotCi0vKiBzc2wzX2ZyZWVfaGFuZHNoYWtlX2J1ZmZlciByZWxlYXNlcyB0aGUgaGFuZHNoYWtlIGJ1ZmZlci4gU3Vic2VxdWVudCBjYWxscwotICogdG8gfHNzbDNfdXBkYXRlX2hhbmRzaGFrZV9oYXNofCB3aWxsIG5vdCB1cGRhdGUgdGhlIGhhbmRzaGFrZSBidWZmZXIuICovCi12b2lkIHNzbDNfZnJlZV9oYW5kc2hha2VfYnVmZmVyKFNTTCAqc3NsKTsKLQotLyogc3NsM19mcmVlX2hhbmRzaGFrZV9oYXNoIHJlbGVhc2VzIHRoZSBoYW5kc2hha2UgaGFzaC4gKi8KLXZvaWQgc3NsM19mcmVlX2hhbmRzaGFrZV9oYXNoKFNTTCAqcyk7Ci0KLS8qIHNzbDNfdXBkYXRlX2hhbmRzaGFrZV9oYXNoIGFkZHMgfGlufCB0byB0aGUgaGFuZHNoYWtlIGJ1ZmZlciBhbmQgaGFuZHNoYWtlCi0gKiBoYXNoLCB3aGljaGV2ZXIgaXMgZW5hYmxlZC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBmYWlsdXJlLiAqLwotaW50IHNzbDNfdXBkYXRlX2hhbmRzaGFrZV9oYXNoKFNTTCAqc3NsLCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluX2xlbik7Ci0KLQotLyogVHJhbnNwb3J0IGJ1ZmZlcnMuICovCi0KLS8qIHNzbF9yZWFkX2J1ZmZlciByZXR1cm5zIGEgcG9pbnRlciB0byBjb250ZW50cyBvZiB0aGUgcmVhZCBidWZmZXIuICovCi11aW50OF90ICpzc2xfcmVhZF9idWZmZXIoU1NMICpzc2wpOwotCi0vKiBzc2xfcmVhZF9idWZmZXJfbGVuIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgcmVhZCBidWZmZXIuICovCi1zaXplX3Qgc3NsX3JlYWRfYnVmZmVyX2xlbihjb25zdCBTU0wgKnNzbCk7Ci0KLS8qIHNzbF9yZWFkX2J1ZmZlcl9leHRlbmRfdG8gZXh0ZW5kcyB0aGUgcmVhZCBidWZmZXIgdG8gdGhlIGRlc2lyZWQgbGVuZ3RoLiBGb3IKLSAqIFRMUywgaXQgcmVhZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHVudGlsIHRoZSBidWZmZXIgaXMgfGxlbnwgYnl0ZXMKLSAqIGxvbmcuIEZvciBEVExTLCBpdCByZWFkcyBhIG5ldyBwYWNrZXQgYW5kIGlnbm9yZXMgfGxlbnwuIEl0IHJldHVybnMgb25lIG9uCi0gKiBzdWNjZXNzLCB6ZXJvIG9uIEVPRiwgYW5kIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGVycm9yLgotICoKLSAqIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgfHNzbF9yZWFkX2J1ZmZlcl9leHRlbmRfdG98IGluIERUTFMgd2hlbiB0aGUgYnVmZmVyIGlzCi0gKiBub24tZW1wdHkuICovCi1pbnQgc3NsX3JlYWRfYnVmZmVyX2V4dGVuZF90byhTU0wgKnNzbCwgc2l6ZV90IGxlbik7Ci0KLS8qIHNzbF9yZWFkX2J1ZmZlcl9jb25zdW1lIGNvbnN1bWVzIHxsZW58IGJ5dGVzIGZyb20gdGhlIHJlYWQgYnVmZmVyLiBJdAotICogYWR2YW5jZXMgdGhlIGRhdGEgcG9pbnRlciBhbmQgZGVjcmVtZW50cyB0aGUgbGVuZ3RoLiBUaGUgbWVtb3J5IGNvbnN1bWVkIHdpbGwKLSAqIHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIHxzc2xfcmVhZF9idWZmZXJfZXh0ZW5kfCBvciBpdCBpcwotICogZGlzY2FyZGVkIHdpdGggfHNzbF9yZWFkX2J1ZmZlcl9kaXNjYXJkfC4gKi8KLXZvaWQgc3NsX3JlYWRfYnVmZmVyX2NvbnN1bWUoU1NMICpzc2wsIHNpemVfdCBsZW4pOwotCi0vKiBzc2xfcmVhZF9idWZmZXJfZGlzY2FyZCBkaXNjYXJkcyB0aGUgY29uc3VtZWQgYnl0ZXMgZnJvbSB0aGUgcmVhZCBidWZmZXIuIElmCi0gKiB0aGUgYnVmZmVyIGlzIG5vdyBlbXB0eSwgaXQgcmVsZWFzZXMgbWVtb3J5IHVzZWQgYnkgaXQuICovCi12b2lkIHNzbF9yZWFkX2J1ZmZlcl9kaXNjYXJkKFNTTCAqc3NsKTsKLQotLyogc3NsX3JlYWRfYnVmZmVyX2NsZWFyIHJlbGVhc2VzIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWFkIGJ1ZmZlciBhbmQKLSAqIHplcm8taW5pdGlhbGl6ZXMgaXQuICovCi12b2lkIHNzbF9yZWFkX2J1ZmZlcl9jbGVhcihTU0wgKnNzbCk7Ci0KLS8qIHNzbF93cml0ZV9idWZmZXJfaXNfcGVuZGluZyByZXR1cm5zIG9uZSBpZiB0aGUgd3JpdGUgYnVmZmVyIGhhcyBwZW5kaW5nIGRhdGEKLSAqIGFuZCB6ZXJvIGlmIGlzIGVtcHR5LiAqLwotaW50IHNzbF93cml0ZV9idWZmZXJfaXNfcGVuZGluZyhjb25zdCBTU0wgKnNzbCk7Ci0KLS8qIHNzbF93cml0ZV9idWZmZXJfaW5pdCBpbml0aWFsaXplcyB0aGUgd3JpdGUgYnVmZmVyLiBPbiBzdWNjZXNzLCBpdCBzZXRzCi0gKiB8Km91dF9wdHJ8IHRvIHRoZSBzdGFydCBvZiB0aGUgd3JpdGUgYnVmZmVyIHdpdGggc3BhY2UgZm9yIHVwIHRvIHxtYXhfbGVufAotICogYnl0ZXMuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZmFpbHVyZS4gQ2FsbAotICogfHNzbF93cml0ZV9idWZmZXJfc2V0X2xlbnwgdG8gY29tcGxldGUgaW5pdGlhbGl6YXRpb24uICovCi1pbnQgc3NsX3dyaXRlX2J1ZmZlcl9pbml0KFNTTCAqc3NsLCB1aW50OF90ICoqb3V0X3B0ciwgc2l6ZV90IG1heF9sZW4pOwotCi0vKiBzc2xfd3JpdGVfYnVmZmVyX3NldF9sZW4gaXMgY2FsbGVkIGFmdGVyIHxzc2xfd3JpdGVfYnVmZmVyX2luaXR8IHRvIGNvbXBsZXRlCi0gKiBpbml0aWFsaXphdGlvbiBhZnRlciB8bGVufCBieXRlcyBhcmUgd3JpdHRlbiB0byB0aGUgYnVmZmVyLiAqLwotdm9pZCBzc2xfd3JpdGVfYnVmZmVyX3NldF9sZW4oU1NMICpzc2wsIHNpemVfdCBsZW4pOwotCi0vKiBzc2xfd3JpdGVfYnVmZmVyX2ZsdXNoIGZsdXNoZXMgdGhlIHdyaXRlIGJ1ZmZlciB0byB0aGUgdHJhbnNwb3J0LiBJdCByZXR1cm5zCi0gKiBvbmUgb24gc3VjY2VzcyBhbmQgPD0gMCBvbiBlcnJvci4gRm9yIERUTFMsIHdoZXRoZXIgb3Igbm90IHRoZSB3cml0ZQotICogc3VjY2VlZHMsIHRoZSB3cml0ZSBidWZmZXIgd2lsbCBiZSBjbGVhcmVkLiAqLwotaW50IHNzbF93cml0ZV9idWZmZXJfZmx1c2goU1NMICpzc2wpOwotCi0vKiBzc2xfd3JpdGVfYnVmZmVyX2NsZWFyIHJlbGVhc2VzIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSB3cml0ZSBidWZmZXIKLSAqIGFuZCB6ZXJvLWluaXRpYWxpemVzIGl0LiAqLwotdm9pZCBzc2xfd3JpdGVfYnVmZmVyX2NsZWFyKFNTTCAqc3NsKTsKLQotCiAvKiBVbmRlcmRvY3VtZW50ZWQgZnVuY3Rpb25zLgogICoKICAqIEZ1bmN0aW9ucyBiZWxvdyBoZXJlIGhhdmVuJ3QgYmVlbiB0b3VjaGVkIHVwIGFuZCBtYXkgYmUgdW5kZXJkb2N1bWVudGVkLiAqLwpAQCAtNzA1LDYgKzQ4Myw4IEBACiAgKiBTU0xfYVJTQSA8LSBSU0FfRU5DIHwgUlNBX1NJR04KICAqIFNTTF9hRFNTIDwtIERTQV9TSUdOICovCiAKKyNkZWZpbmUgUEVORElOR19TRVNTSU9OIC0xMDAwMAorCiAvKiBGcm9tIFJGQzQ0OTIsIHVzZWQgaW4gZW5jb2RpbmcgdGhlIGN1cnZlIHR5cGUgaW4gRUNQYXJhbWV0ZXJzICovCiAjZGVmaW5lIEVYUExJQ0lUX1BSSU1FX0NVUlZFX1RZUEUgMQogI2RlZmluZSBFWFBMSUNJVF9DSEFSMl9DVVJWRV9UWVBFIDIKQEAgLTcxNSwyMSArNDk1LDE4IEBACiAgIHNzbF9oYXNoX21lc3NhZ2UsCiB9OwogCi0vKiBTdHJ1Y3R1cmUgY29udGFpbmluZyBkZWNvZGVkIHZhbHVlcyBvZiBzaWduYXR1cmUgYWxnb3JpdGhtcyBleHRlbnNpb24gKi8KLXR5cGVkZWYgc3RydWN0IHRsc19zaWdhbGdzX3N0IHsKLSAgdWludDhfdCByc2lnbjsKLSAgdWludDhfdCByaGFzaDsKLX0gVExTX1NJR0FMR1M7Ci0KLXR5cGVkZWYgc3RydWN0IGNlcnRfc3QgewordHlwZWRlZiBzdHJ1Y3QgY2VydF9wa2V5X3N0IHsKICAgWDUwOSAqeDUwOTsKICAgRVZQX1BLRVkgKnByaXZhdGVrZXk7CiAgIC8qIENoYWluIGZvciB0aGlzIGNlcnRpZmljYXRlICovCiAgIFNUQUNLX09GKFg1MDkpICpjaGFpbjsKK30gQ0VSVF9QS0VZOwogCi0gIC8qIGtleV9tZXRob2QsIGlmIG5vbi1OVUxMLCBpcyBhIHNldCBvZiBjYWxsYmFja3MgdG8gY2FsbCBmb3IgcHJpdmF0ZSBrZXkKLSAgICogb3BlcmF0aW9ucy4gKi8KLSAgY29uc3QgU1NMX1BSSVZBVEVfS0VZX01FVEhPRCAqa2V5X21ldGhvZDsKK3R5cGVkZWYgc3RydWN0IGNlcnRfc3QgeworICAvKiBDdXJyZW50IGFjdGl2ZSBzZXQgKi8KKyAgQ0VSVF9QS0VZICprZXk7IC8qIEFMV0FZUyBwb2ludHMgdG8gYW4gZWxlbWVudCBvZiB0aGUgcGtleXMgYXJyYXkKKyAgICAgICAgICAgICAgICAgICAqIFByb2JhYmx5IGl0IHdvdWxkIG1ha2UgbW9yZSBzZW5zZSB0byBzdG9yZQorICAgICAgICAgICAgICAgICAgICogYW4gaW5kZXgsIG5vdCBhIHBvaW50ZXIuICovCiAKICAgLyogRm9yIGNsaWVudHMgdGhlIGZvbGxvd2luZyBtYXNrcyBhcmUgb2YgKmRpc2FibGVkKiBrZXkgYW5kIGF1dGggYWxnb3JpdGhtcwogICAgKiBiYXNlZCBvbiB0aGUgY3VycmVudCBzZXNzaW9uLgpAQCAtNzU0LDE4ICs1MzEsMzkgQEAKICAgICoga2V5cy4gSWYgTlVMTCwgYSBjdXJ2ZSBpcyBzZWxlY3RlZCBhdXRvbWF0aWNhbGx5LiBTZWUKICAgICogfFNTTF9DVFhfc2V0X3RtcF9lY2RoX2NhbGxiYWNrfC4gKi8KICAgRUNfS0VZICooKmVjZGhfdG1wX2NiKShTU0wgKnNzbCwgaW50IGlzX2V4cG9ydCwgaW50IGtleXNpemUpOworICBDRVJUX1BLRVkgcGtleXNbU1NMX1BLRVlfTlVNXTsKIAotICAvKiBwZWVyX3NpZ2FsZ3MgYXJlIHRoZSBhbGdvcml0aG0vaGFzaCBwYWlycyB0aGF0IHRoZSBwZWVyIHN1cHBvcnRzLiBUaGVzZQotICAgKiBhcmUgdGFrZW4gZnJvbSB0aGUgY29udGVudHMgb2Ygc2lnbmF0dXJlIGFsZ29yaXRobXMgZXh0ZW5zaW9uIGZvciBhIHNlcnZlcgotICAgKiBvciBmcm9tIHRoZSBDZXJ0aWZpY2F0ZVJlcXVlc3QgZm9yIGEgY2xpZW50LiAqLwotICBUTFNfU0lHQUxHUyAqcGVlcl9zaWdhbGdzOwotICAvKiBwZWVyX3NpZ2FsZ3NsZW4gaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHxwZWVyX3NpZ2FsZ3N8LiAqLworICAvKiBTZXJ2ZXItb25seTogY2xpZW50X2NlcnRpZmljYXRlX3R5cGVzIGlzIGxpc3Qgb2YgY2VydGlmaWNhdGUgdHlwZXMgdG8KKyAgICogaW5jbHVkZSBpbiB0aGUgQ2VydGlmaWNhdGVSZXF1ZXN0IG1lc3NhZ2UuCisgICAqLworICB1aW50OF90ICpjbGllbnRfY2VydGlmaWNhdGVfdHlwZXM7CisgIHNpemVfdCBudW1fY2xpZW50X2NlcnRpZmljYXRlX3R5cGVzOworCisgIC8qIHNpZ25hdHVyZSBhbGdvcml0aG1zIHBlZXIgcmVwb3J0czogZS5nLiBzdXBwb3J0ZWQgc2lnbmF0dXJlCisgICAqIGFsZ29yaXRobXMgZXh0ZW5zaW9uIGZvciBzZXJ2ZXIgb3IgYXMgcGFydCBvZiBhIGNlcnRpZmljYXRlCisgICAqIHJlcXVlc3QgZm9yIGNsaWVudC4gKi8KKyAgdWludDhfdCAqcGVlcl9zaWdhbGdzOworICAvKiBTaXplIG9mIGFib3ZlIGFycmF5ICovCiAgIHNpemVfdCBwZWVyX3NpZ2FsZ3NsZW47Ci0KLSAgLyogZGlnZXN0X25pZHMsIGlmIG5vbi1OVUxMLCBpcyB0aGUgc2V0IG9mIGRpZ2VzdHMgc3VwcG9ydGVkIGJ5IHxwcml2YXRla2V5fAotICAgKiBpbiBkZWNyZWFzaW5nIG9yZGVyIG9mIHByZWZlcmVuY2UuICovCi0gIGludCAqZGlnZXN0X25pZHM7Ci0gIHNpemVfdCBudW1fZGlnZXN0X25pZHM7CisgIC8qIHN1cHBwb3J0ZWQgc2lnbmF0dXJlIGFsZ29yaXRobXMuCisgICAqIFdoZW4gc2V0IG9uIGEgY2xpZW50IHRoaXMgaXMgc2VudCBpbiB0aGUgY2xpZW50IGhlbGxvIGFzIHRoZQorICAgKiBzdXBwb3J0ZWQgc2lnbmF0dXJlIGFsZ29yaXRobXMgZXh0ZW5zaW9uLiBGb3Igc2VydmVycworICAgKiBpdCByZXByZXNlbnRzIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtcyB3ZSBhcmUgd2lsbGluZyB0byB1c2UuICovCisgIHVpbnQ4X3QgKmNvbmZfc2lnYWxnczsKKyAgLyogU2l6ZSBvZiBhYm92ZSBhcnJheSAqLworICBzaXplX3QgY29uZl9zaWdhbGdzbGVuOworICAvKiBDbGllbnQgYXV0aGVudGljYXRpb24gc2lnbmF0dXJlIGFsZ29yaXRobXMsIGlmIG5vdCBzZXQgdGhlbgorICAgKiB1c2VzIGNvbmZfc2lnYWxncy4gT24gc2VydmVycyB0aGVzZSB3aWxsIGJlIHRoZSBzaWduYXR1cmUKKyAgICogYWxnb3JpdGhtcyBzZW50IHRvIHRoZSBjbGllbnQgaW4gYSBjZXJpZmljYXRlIHJlcXVlc3QgZm9yIFRMUyAxLjIuCisgICAqIE9uIGEgY2xpZW50IHRoaXMgcmVwcmVzZW50cyB0aGUgc2lnbmF0dXJlIGFsZ29ydGl0aG1zIHdlIGFyZQorICAgKiB3aWxsaW5nIHRvIHVzZSBmb3IgY2xpZW50IGF1dGhlbnRpY2F0aW9uLiAqLworICB1aW50OF90ICpjbGllbnRfc2lnYWxnczsKKyAgLyogU2l6ZSBvZiBhYm92ZSBhcnJheSAqLworICBzaXplX3QgY2xpZW50X3NpZ2FsZ3NsZW47CisgIC8qIFNpZ25hdHVyZSBhbGdvcml0aG1zIHNoYXJlZCBieSBjbGllbnQgYW5kIHNlcnZlcjogY2FjaGVkCisgICAqIGJlY2F1c2UgdGhlc2UgYXJlIHVzZWQgbW9zdCBvZnRlbi4gKi8KKyAgVExTX1NJR0FMR1MgKnNoYXJlZF9zaWdhbGdzOworICBzaXplX3Qgc2hhcmVkX3NpZ2FsZ3NsZW47CiAKICAgLyogQ2VydGlmaWNhdGUgc2V0dXAgY2FsbGJhY2s6IGlmIHNldCBpcyBjYWxsZWQgd2hlbmV2ZXIgYQogICAgKiBjZXJ0aWZpY2F0ZSBtYXkgYmUgcmVxdWlyZWQgKGNsaWVudCBvciBzZXJ2ZXIpLiB0aGUgY2FsbGJhY2sKQEAgLTc3NSw4ICs1NzMsNDEgQEAKICAgICogc3VwcG9ydGVkIHNpZ25hdHVyZSBhbGdvcml0aG1zIG9yIGN1cnZlcy4gKi8KICAgaW50ICgqY2VydF9jYikoU1NMICpzc2wsIHZvaWQgKmFyZyk7CiAgIHZvaWQgKmNlcnRfY2JfYXJnOworCisgIC8qIE9wdGlvbmFsIFg1MDlfU1RPUkUgZm9yIGNoYWluIGJ1aWxkaW5nIG9yIGNlcnRpZmljYXRlIHZhbGlkYXRpb24KKyAgICogSWYgTlVMTCB0aGUgcGFyZW50IFNTTF9DVFggc3RvcmUgaXMgdXNlZCBpbnN0ZWFkLiAqLworICBYNTA5X1NUT1JFICpjaGFpbl9zdG9yZTsKKyAgWDUwOV9TVE9SRSAqdmVyaWZ5X3N0b3JlOwogfSBDRVJUOwogCit0eXBlZGVmIHN0cnVjdCBzZXNzX2NlcnRfc3QgeworICBTVEFDS19PRihYNTA5KSAqY2VydF9jaGFpbjsgLyogYXMgcmVjZWl2ZWQgZnJvbSBwZWVyIChub3QgZm9yIFNTTDIpICovCisKKyAgLyogVGhlICdwZWVyXy4uLicgbWVtYmVycyBhcmUgdXNlZCBvbmx5IGJ5IGNsaWVudHMuICovCisgIGludCBwZWVyX2NlcnRfdHlwZTsKKworICBDRVJUX1BLRVkgKnBlZXJfa2V5OyAvKiBwb2ludHMgdG8gYW4gZWxlbWVudCBvZiBwZWVyX3BrZXlzIChuZXZlciBOVUxMISkgKi8KKyAgQ0VSVF9QS0VZIHBlZXJfcGtleXNbU1NMX1BLRVlfTlVNXTsKKyAgLyogT2J2aW91c2x5IHdlIGRvbid0IGhhdmUgdGhlIHByaXZhdGUga2V5cyBvZiB0aGVzZSwKKyAgICogc28gbWF5YmUgd2Ugc2hvdWxkbid0IGV2ZW4gdXNlIHRoZSBDRVJUX1BLRVkgdHlwZSBoZXJlLiAqLworCisgIERIICpwZWVyX2RoX3RtcDsKKyAgRUNfS0VZICpwZWVyX2VjZGhfdG1wOworfSBTRVNTX0NFUlQ7CisKKy8qIFN0cnVjdHVyZSBjb250YWluaW5nIGRlY29kZWQgdmFsdWVzIG9mIHNpZ25hdHVyZSBhbGdvcml0aG1zIGV4dGVuc2lvbiAqLworc3RydWN0IHRsc19zaWdhbGdzX3N0IHsKKyAgLyogTklEIG9mIGhhc2ggYWxnb3JpdGhtICovCisgIGludCBoYXNoX25pZDsKKyAgLyogTklEIG9mIHNpZ25hdHVyZSBhbGdvcml0aG0gKi8KKyAgaW50IHNpZ25fbmlkOworICAvKiBDb21iaW5lZCBoYXNoIGFuZCBzaWduYXR1cmUgTklEICovCisgIGludCBzaWduYW5kaGFzaF9uaWQ7CisgIC8qIFJhdyB2YWx1ZXMgdXNlZCBpbiBleHRlbnNpb24gKi8KKyAgdWludDhfdCByc2lnbjsKKyAgdWludDhfdCByaGFzaDsKK307CisKIC8qIFNTTF9NRVRIT0QgaXMgYSBjb21wYXRpYmlsaXR5IHN0cnVjdHVyZSB0byBzdXBwb3J0IHRoZSBsZWdhY3kgdmVyc2lvbi1sb2NrZWQKICAqIG1ldGhvZHMuICovCiBzdHJ1Y3Qgc3NsX21ldGhvZF9zdCB7CkBAIC04MDMsNiArNjM0LDggQEAKICAgdm9pZCAoKnNzbF9yZWFkX2Nsb3NlX25vdGlmeSkoU1NMICpzKTsKICAgaW50ICgqc3NsX3dyaXRlX2FwcF9kYXRhKShTU0wgKnMsIGNvbnN0IHZvaWQgKmJ1Zl8sIGludCBsZW4pOwogICBpbnQgKCpzc2xfZGlzcGF0Y2hfYWxlcnQpKFNTTCAqcyk7CisgIGxvbmcgKCpzc2xfY3RybCkoU1NMICpzLCBpbnQgY21kLCBsb25nIGxhcmcsIHZvaWQgKnBhcmcpOworICBsb25nICgqc3NsX2N0eF9jdHJsKShTU0xfQ1RYICpjdHgsIGludCBjbWQsIGxvbmcgbGFyZywgdm9pZCAqcGFyZyk7CiAgIC8qIHN1cHBvcnRzX2NpcGhlciByZXR1cm5zIG9uZSBpZiB8Y2lwaGVyfCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBwcm90b2NvbCBhbmQKICAgICogemVybyBvdGhlcndpc2UuICovCiAgIGludCAoKnN1cHBvcnRzX2NpcGhlcikoY29uc3QgU1NMX0NJUEhFUiAqY2lwaGVyKTsKQEAgLTg2NSw2ICs2OTgsMTUgQEAKIAogI2RlZmluZSBEVExTMV9BTF9IRUFERVJfTEVOR1RIIDIKIAordHlwZWRlZiBzdHJ1Y3QgZHRsczFfYml0bWFwX3N0IHsKKyAgLyogbWFwIGlzIGEgYml0IG1hc2sgb2YgdGhlIGxhc3QgNjQgc2VxdWVuY2UgbnVtYmVycy4gQml0CisgICAqIHwxPDxpfCBjb3JyZXNwb25kcyB0byB8bWF4X3NlcV9udW0gLSBpfC4gKi8KKyAgdWludDY0X3QgbWFwOworICAvKiBtYXhfc2VxX251bSBpcyB0aGUgbGFyZ2VzdCBzZXF1ZW5jZSBudW1iZXIgc2VlbiBzbyBmYXIuIEl0CisgICAqIGlzIGEgNjQtYml0IHZhbHVlIGluIGJpZy1lbmRpYW4gZW5jb2RpbmcuICovCisgIHVpbnQ4X3QgbWF4X3NlcV9udW1bOF07Cit9IERUTFMxX0JJVE1BUDsKKwogLyogVE9ETyhkYXZpZGJlbik6IFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGJvdGggaW5jb21pbmcgbWVzc2FnZXMgYW5kCiAgKiBvdXRnb2luZyBtZXNzYWdlcy4gfGlzX2Njc3wgYW5kIHxlcG9jaHwgYXJlIG9ubHkgdXNlZCBpbiB0aGUgbGF0dGVyIGFuZAogICogc2hvdWxkIGJlIG1vdmVkIGVsc2V3aGVyZS4gKi8KQEAgLTk0OSw3ICs3OTEsNiBAQAogZXh0ZXJuIGNvbnN0IFNTTDNfRU5DX01FVEhPRCBUTFN2MV8xX2VuY19kYXRhOwogZXh0ZXJuIGNvbnN0IFNTTDNfRU5DX01FVEhPRCBUTFN2MV8yX2VuY19kYXRhOwogZXh0ZXJuIGNvbnN0IFNTTDNfRU5DX01FVEhPRCBTU0x2M19lbmNfZGF0YTsKLWV4dGVybiBjb25zdCBTUlRQX1BST1RFQ1RJT05fUFJPRklMRSBrU1JUUFByb2ZpbGVzW107CiAKIHZvaWQgc3NsX2NsZWFyX2NpcGhlcl9jdHgoU1NMICpzKTsKIGludCBzc2xfY2xlYXJfYmFkX3Nlc3Npb24oU1NMICpzKTsKQEAgLTk1NywyNCArNzk4LDExIEBACiBDRVJUICpzc2xfY2VydF9kdXAoQ0VSVCAqY2VydCk7CiB2b2lkIHNzbF9jZXJ0X2NsZWFyX2NlcnRzKENFUlQgKmMpOwogdm9pZCBzc2xfY2VydF9mcmVlKENFUlQgKmMpOworU0VTU19DRVJUICpzc2xfc2Vzc19jZXJ0X25ldyh2b2lkKTsKK3ZvaWQgc3NsX3Nlc3NfY2VydF9mcmVlKFNFU1NfQ0VSVCAqc2MpOworaW50IHNzbF9zZXRfcGVlcl9jZXJ0X3R5cGUoU0VTU19DRVJUICpjLCBpbnQgdHlwZSk7CiBpbnQgc3NsX2dldF9uZXdfc2Vzc2lvbihTU0wgKnMsIGludCBzZXNzaW9uKTsKLQotZW51bSBzc2xfc2Vzc2lvbl9yZXN1bHRfdCB7Ci0gIHNzbF9zZXNzaW9uX3N1Y2Nlc3MsCi0gIHNzbF9zZXNzaW9uX2Vycm9yLAotICBzc2xfc2Vzc2lvbl9yZXRyeSwKLX07Ci0KLS8qIHNzbF9nZXRfcHJldl9zZXNzaW9uIGxvb2tzIHVwIHRoZSBwcmV2aW91cyBzZXNzaW9uIGJhc2VkIG9uIHxjdHh8LiBPbgotICogc3VjY2VzcywgaXQgc2V0cyB8Km91dF9zZXNzaW9ufCB0byB0aGUgc2Vzc2lvbiBvciBOVUxMIGlmIG5vbmUgd2FzIGZvdW5kLiBJdAotICogc2V0cyB8Km91dF9zZW5kX3RpY2tldHwgdG8gd2hldGhlciBhIHRpY2tldCBzaG91bGQgYmUgc2VudCBhdCB0aGUgZW5kIG9mIHRoZQotICogaGFuZHNoYWtlLiBJZiB0aGUgc2Vzc2lvbiBjb3VsZCBub3QgYmUgbG9va2VkIHVwIHN5bmNocm9ub3VzbHksIGl0IHJldHVybnMKLSAqIHxzc2xfc2Vzc2lvbl9yZXRyeXwgYW5kIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4uIE90aGVyd2lzZSwgaXQgcmV0dXJucwotICogfHNzbF9zZXNzaW9uX2Vycm9yfC4gICovCi1lbnVtIHNzbF9zZXNzaW9uX3Jlc3VsdF90IHNzbF9nZXRfcHJldl9zZXNzaW9uKAotICAgIFNTTCAqc3NsLCBTU0xfU0VTU0lPTiAqKm91dF9zZXNzaW9uLCBpbnQgKm91dF9zZW5kX3RpY2tldCwKLSAgICBjb25zdCBzdHJ1Y3Qgc3NsX2Vhcmx5X2NhbGxiYWNrX2N0eCAqY3R4KTsKLQoraW50IHNzbF9nZXRfcHJldl9zZXNzaW9uKFNTTCAqcywgY29uc3Qgc3RydWN0IHNzbF9lYXJseV9jYWxsYmFja19jdHggKmN0eCk7CiBTVEFDS19PRihTU0xfQ0lQSEVSKSAqc3NsX2J5dGVzX3RvX2NpcGhlcl9saXN0KFNTTCAqcywgY29uc3QgQ0JTICpjYnMpOwogaW50IHNzbF9jaXBoZXJfbGlzdF90b19ieXRlcyhTU0wgKnMsIFNUQUNLX09GKFNTTF9DSVBIRVIpICpzaywgdWludDhfdCAqcCk7CiBzdHJ1Y3Qgc3NsX2NpcGhlcl9wcmVmZXJlbmNlX2xpc3Rfc3QgKnNzbF9jaXBoZXJfcHJlZmVyZW5jZV9saXN0X2R1cCgKQEAgLTk4NSwxNiArODEzLDIxIEBACiAgICAgU1RBQ0tfT0YoU1NMX0NJUEhFUikgKmNpcGhlcnMpOwogc3RydWN0IHNzbF9jaXBoZXJfcHJlZmVyZW5jZV9saXN0X3N0ICpzc2xfZ2V0X2NpcGhlcl9wcmVmZXJlbmNlcyhTU0wgKnMpOwogCi1pbnQgc3NsX2NlcnRfc2V0MF9jaGFpbihDRVJUICpjZXJ0LCBTVEFDS19PRihYNTA5KSAqY2hhaW4pOwotaW50IHNzbF9jZXJ0X3NldDFfY2hhaW4oQ0VSVCAqY2VydCwgU1RBQ0tfT0YoWDUwOSkgKmNoYWluKTsKLWludCBzc2xfY2VydF9hZGQwX2NoYWluX2NlcnQoQ0VSVCAqY2VydCwgWDUwOSAqeDUwOSk7Ci1pbnQgc3NsX2NlcnRfYWRkMV9jaGFpbl9jZXJ0KENFUlQgKmNlcnQsIFg1MDkgKng1MDkpOwotdm9pZCBzc2xfY2VydF9zZXRfY2VydF9jYihDRVJUICpjZXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpjYikoU1NMICpzc2wsIHZvaWQgKmFyZyksIHZvaWQgKmFyZyk7CitpbnQgc3NsX2NlcnRfc2V0MF9jaGFpbihDRVJUICpjLCBTVEFDS19PRihYNTA5KSAqY2hhaW4pOworaW50IHNzbF9jZXJ0X3NldDFfY2hhaW4oQ0VSVCAqYywgU1RBQ0tfT0YoWDUwOSkgKmNoYWluKTsKK2ludCBzc2xfY2VydF9hZGQwX2NoYWluX2NlcnQoQ0VSVCAqYywgWDUwOSAqeCk7CitpbnQgc3NsX2NlcnRfYWRkMV9jaGFpbl9jZXJ0KENFUlQgKmMsIFg1MDkgKngpOworaW50IHNzbF9jZXJ0X3NlbGVjdF9jdXJyZW50KENFUlQgKmMsIFg1MDkgKngpOwordm9pZCBzc2xfY2VydF9zZXRfY2VydF9jYihDRVJUICpjLCBpbnQgKCpjYikoU1NMICpzc2wsIHZvaWQgKmFyZyksIHZvaWQgKmFyZyk7CiAKLWludCBzc2xfdmVyaWZ5X2NlcnRfY2hhaW4oU1NMICpzc2wsIFNUQUNLX09GKFg1MDkpICpjZXJ0X2NoYWluKTsKLWludCBzc2xfYWRkX2NlcnRfY2hhaW4oU1NMICpzLCB1bnNpZ25lZCBsb25nICpsKTsKK2ludCBzc2xfdmVyaWZ5X2NlcnRfY2hhaW4oU1NMICpzLCBTVEFDS19PRihYNTA5KSAqc2spOworaW50IHNzbF9hZGRfY2VydF9jaGFpbihTU0wgKnMsIENFUlRfUEtFWSAqY3BrLCB1bnNpZ25lZCBsb25nICpsKTsKK2ludCBzc2xfYnVpbGRfY2VydF9jaGFpbihDRVJUICpjLCBYNTA5X1NUT1JFICpjaGFpbl9zdG9yZSwgaW50IGZsYWdzKTsKK2ludCBzc2xfY2VydF9zZXRfY2VydF9zdG9yZShDRVJUICpjLCBYNTA5X1NUT1JFICpzdG9yZSwgaW50IGNoYWluLCBpbnQgcmVmKTsKK0NFUlRfUEtFWSAqc3NsX2dldF9zZXJ2ZXJfc2VuZF9wa2V5KGNvbnN0IFNTTCAqcyk7CitFVlBfUEtFWSAqc3NsX2dldF9zaWduX3BrZXkoU1NMICpzLCBjb25zdCBTU0xfQ0lQSEVSICpjKTsKIHZvaWQgc3NsX3VwZGF0ZV9jYWNoZShTU0wgKnMsIGludCBtb2RlKTsKK2ludCBzc2xfY2VydF90eXBlKEVWUF9QS0VZICpwa2V5KTsKIAogLyogc3NsX2dldF9jb21wYXRpYmxlX3NlcnZlcl9jaXBoZXJzIGRldGVybWluZXMgdGhlIGtleSBleGNoYW5nZSBhbmQKICAqIGF1dGhlbnRpY2F0aW9uIGNpcGhlciBzdWl0ZSBtYXNrcyBjb21wYXRpYmxlIHdpdGggdGhlIHNlcnZlciBjb25maWd1cmF0aW9uCkBAIC0xMDEwLDkgKzg0MywxMCBAQAogICogfGxlbnwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZmFpbHVyZS4gKi8KIGludCBzc2xfZmlsbF9oZWxsb19yYW5kb20odWludDhfdCAqb3V0LCBzaXplX3QgbGVuLCBpbnQgaXNfc2VydmVyKTsKIAoraW50IHNzbDNfaW5pdF9maW5pc2hlZF9tYWMoU1NMICpzKTsKIGludCBzc2wzX3NlbmRfc2VydmVyX2NlcnRpZmljYXRlKFNTTCAqcyk7CiBpbnQgc3NsM19zZW5kX25ld19zZXNzaW9uX3RpY2tldChTU0wgKnMpOwotaW50IHNzbDNfc2VuZF9jZXJ0aWZpY2F0ZV9zdGF0dXMoU1NMICpzKTsKK2ludCBzc2wzX3NlbmRfY2VydF9zdGF0dXMoU1NMICpzKTsKIGludCBzc2wzX2dldF9maW5pc2hlZChTU0wgKnMsIGludCBzdGF0ZV9hLCBpbnQgc3RhdGVfYik7CiBpbnQgc3NsM19zZW5kX2NoYW5nZV9jaXBoZXJfc3BlYyhTU0wgKnMsIGludCBzdGF0ZV9hLCBpbnQgc3RhdGVfYik7CiBpbnQgc3NsM19wcmYoU1NMICpzLCB1aW50OF90ICpvdXQsIHNpemVfdCBvdXRfbGVuLCBjb25zdCB1aW50OF90ICpzZWNyZXQsCkBAIC0xMDMzLDExICs4NjcsMTEgQEAKIC8qIHNzbDNfY2VydF92ZXJpZnlfaGFzaCB3cml0ZXMgdGhlIENlcnRpZmljYXRlVmVyaWZ5IGhhc2ggaW50byB0aGUgYnl0ZXMKICAqIHBvaW50ZWQgdG8gYnkgfG91dHwgYW5kIHdyaXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHwqb3V0X2xlbnwuIHxvdXR8IG11c3QKICAqIGhhdmUgcm9vbSBmb3IgRVZQX01BWF9NRF9TSVpFIGJ5dGVzLiBGb3IgVExTIDEuMiBhbmQgdXAsIHwqb3V0X21kfCBpcyB1c2VkCi0gKiBmb3IgdGhlIGhhc2ggZnVuY3Rpb24sIG90aGVyd2lzZSB0aGUgaGFzaCBmdW5jdGlvbiBkZXBlbmRzIG9uIHxwa2V5X3R5cGV8Ci0gKiBhbmQgaXMgd3JpdHRlbiB0byB8Km91dF9tZHwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24KKyAqIGZvciB0aGUgaGFzaCBmdW5jdGlvbiwgb3RoZXJ3aXNlIHRoZSBoYXNoIGZ1bmN0aW9uIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YKKyAqIHxwa2V5fCBhbmQgaXMgd3JpdHRlbiB0byB8Km91dF9tZHwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24KICAqIGZhaWx1cmUuICovCiBpbnQgc3NsM19jZXJ0X3ZlcmlmeV9oYXNoKFNTTCAqcywgdWludDhfdCAqb3V0LCBzaXplX3QgKm91dF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9NRCAqKm91dF9tZCwgaW50IHBrZXlfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9NRCAqKm91dF9tZCwgRVZQX1BLRVkgKnBrZXkpOwogCiBpbnQgc3NsM19zZW5kX2ZpbmlzaGVkKFNTTCAqcywgaW50IGEsIGludCBiLCBjb25zdCBjaGFyICpzZW5kZXIsIGludCBzbGVuKTsKIGludCBzc2wzX3N1cHBvcnRzX2NpcGhlcihjb25zdCBTU0xfQ0lQSEVSICpjaXBoZXIpOwpAQCAtMTA1MCwxNSArODg0LDI5IEBACiBpbnQgc3NsM193cml0ZV9ieXRlcyhTU0wgKnMsIGludCB0eXBlLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4pOwogaW50IHNzbDNfZmluYWxfZmluaXNoX21hYyhTU0wgKnMsIGNvbnN0IGNoYXIgKnNlbmRlciwgaW50IHNsZW4sIHVpbnQ4X3QgKnApOwogaW50IHNzbDNfY2VydF92ZXJpZnlfbWFjKFNTTCAqcywgaW50IG1kX25pZCwgdWludDhfdCAqcCk7Ci1pbnQgc3NsM19vdXRwdXRfY2VydF9jaGFpbihTU0wgKnMpOworaW50IHNzbDNfZmluaXNoX21hYyhTU0wgKnMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbik7Cit2b2lkIHNzbDNfZnJlZV9kaWdlc3RfbGlzdChTU0wgKnMpOworaW50IHNzbDNfb3V0cHV0X2NlcnRfY2hhaW4oU1NMICpzLCBDRVJUX1BLRVkgKmNwayk7CiBjb25zdCBTU0xfQ0lQSEVSICpzc2wzX2Nob29zZV9jaXBoZXIoCiAgICAgU1NMICpzc2wsIFNUQUNLX09GKFNTTF9DSVBIRVIpICpjbG50LAogICAgIHN0cnVjdCBzc2xfY2lwaGVyX3ByZWZlcmVuY2VfbGlzdF9zdCAqc3J2cik7CitpbnQgc3NsM19zZXR1cF9yZWFkX2J1ZmZlcihTU0wgKnMpOworaW50IHNzbDNfc2V0dXBfd3JpdGVfYnVmZmVyKFNTTCAqcyk7CitpbnQgc3NsM19yZWxlYXNlX3JlYWRfYnVmZmVyKFNTTCAqcyk7CitpbnQgc3NsM19yZWxlYXNlX3dyaXRlX2J1ZmZlcihTU0wgKnMpOworCitlbnVtIHNob3VsZF9mcmVlX2hhbmRzaGFrZV9idWZmZXJfdCB7CisgIGZyZWVfaGFuZHNoYWtlX2J1ZmZlciwKKyAgZG9udF9mcmVlX2hhbmRzaGFrZV9idWZmZXIsCit9OworaW50IHNzbDNfZGlnZXN0X2NhY2hlZF9yZWNvcmRzKFNTTCAqcywgZW51bSBzaG91bGRfZnJlZV9oYW5kc2hha2VfYnVmZmVyX3QpOwogCiBpbnQgc3NsM19uZXcoU1NMICpzKTsKIHZvaWQgc3NsM19mcmVlKFNTTCAqcyk7CiBpbnQgc3NsM19hY2NlcHQoU1NMICpzKTsKIGludCBzc2wzX2Nvbm5lY3QoU1NMICpzKTsKK2xvbmcgc3NsM19jdHJsKFNTTCAqcywgaW50IGNtZCwgbG9uZyBsYXJnLCB2b2lkICpwYXJnKTsKK2xvbmcgc3NsM19jdHhfY3RybChTU0xfQ1RYICpzLCBpbnQgY21kLCBsb25nIGxhcmcsIHZvaWQgKnBhcmcpOwogCiAvKiBzc2wzX3JlY29yZF9zZXF1ZW5jZV91cGRhdGUgaW5jcmVtZW50cyB0aGUgc2VxdWVuY2UgbnVtYmVyIGluIHxzZXF8LiBJdAogICogcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiB3cmFwYXJvdW5kLiAqLwpAQCAtMTA2OSw3ICs5MTcsMTMgQEAKIGludCBzc2wzX3NldF9oYW5kc2hha2VfaGVhZGVyKFNTTCAqcywgaW50IGh0eXBlLCB1bnNpZ25lZCBsb25nIGxlbik7CiBpbnQgc3NsM19oYW5kc2hha2Vfd3JpdGUoU1NMICpzKTsKIAorZW51bSBkdGxzMV91c2VfZXBvY2hfdCB7CisgIGR0bHMxX3VzZV9wcmV2aW91c19lcG9jaCwKKyAgZHRsczFfdXNlX2N1cnJlbnRfZXBvY2gsCit9OworCiBpbnQgZHRsczFfZG9fd3JpdGUoU1NMICpzLCBpbnQgdHlwZSwgZW51bSBkdGxzMV91c2VfZXBvY2hfdCB1c2VfZXBvY2gpOworaW50IHNzbDNfcmVhZF9uKFNTTCAqcywgaW50IG4sIGludCBleHRlbmQpOwogaW50IGR0bHMxX3JlYWRfYXBwX2RhdGEoU1NMICpzc2wsIHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbiwgaW50IHBlZWspOwogdm9pZCBkdGxzMV9yZWFkX2Nsb3NlX25vdGlmeShTU0wgKnNzbCk7CiBpbnQgZHRsczFfcmVhZF9ieXRlcyhTU0wgKnMsIGludCB0eXBlLCB1aW50OF90ICpidWYsIGludCBsZW4sIGludCBwZWVrKTsKQEAgLTExMTYsOSArOTcwLDExIEBACiBpbnQgc3NsM19zZW5kX2NsaWVudF9rZXlfZXhjaGFuZ2UoU1NMICpzKTsKIGludCBzc2wzX2dldF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlKFNTTCAqcyk7CiBpbnQgc3NsM19nZXRfc2VydmVyX2NlcnRpZmljYXRlKFNTTCAqcyk7CitpbnQgc3NsM19jaGVja19jZXJ0X2FuZF9hbGdvcml0aG0oU1NMICpzKTsKIGludCBzc2wzX3NlbmRfbmV4dF9wcm90byhTU0wgKnMpOwogaW50IHNzbDNfc2VuZF9jaGFubmVsX2lkKFNTTCAqcyk7Ci1pbnQgc3NsM192ZXJpZnlfc2VydmVyX2NlcnQoU1NMICpzKTsKKworaW50IGR0bHMxX2NsaWVudF9oZWxsbyhTU0wgKnMpOwogCiAvKiBzb21lIHNlcnZlci1vbmx5IGZ1bmN0aW9ucyAqLwogaW50IHNzbDNfZ2V0X2luaXRpYWxfYnl0ZXMoU1NMICpzKTsKQEAgLTExNDEsNiArOTk3LDcgQEAKIAogbG9uZyBkdGxzMV9nZXRfbWVzc2FnZShTU0wgKnMsIGludCBzdDEsIGludCBzdG4sIGludCBtdCwgbG9uZyBtYXgsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gc3NsX2hhc2hfbWVzc2FnZV90IGhhc2hfbWVzc2FnZSwgaW50ICpvayk7CitpbnQgZHRsczFfZ2V0X3JlY29yZChTU0wgKnMpOwogaW50IGR0bHMxX2Rpc3BhdGNoX2FsZXJ0KFNTTCAqcyk7CiAKIGludCBzc2xfaW5pdF93YmlvX2J1ZmZlcihTU0wgKnMsIGludCBwdXNoKTsKQEAgLTExNzAsMTUgKzEwMjcsMTIgQEAKIGludCB0bHMxX2FsZXJ0X2NvZGUoaW50IGNvZGUpOwogaW50IHNzbDNfYWxlcnRfY29kZShpbnQgY29kZSk7CiAKK2ludCBzc2xfY2hlY2tfc3J2cl9lY2NfY2VydF9hbmRfYWxnKFg1MDkgKngsIFNTTCAqcyk7CisKIGNoYXIgc3NsX2Vhcmx5X2NhbGxiYWNrX2luaXQoc3RydWN0IHNzbF9lYXJseV9jYWxsYmFja19jdHggKmN0eCk7CiBpbnQgdGxzMV9lY19jdXJ2ZV9pZDJuaWQodWludDE2X3QgY3VydmVfaWQpOwogaW50IHRsczFfZWNfbmlkMmN1cnZlX2lkKHVpbnQxNl90ICpvdXRfY3VydmVfaWQsIGludCBuaWQpOwogCi0vKiB0bHMxX2VjX2N1cnZlX2lkMm5hbWUgcmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIG5hbWUgZm9yIHRoZQotICogY3VydmUgc3BlY2lmaWVkIGJ5IHRoZSBUTFMgY3VydmUgaWQgaW4gfGN1cnZlX2lkfC4gSWYgdGhlCi0gKiBjdXJ2ZSBpcyB1bmtub3duLCBpdCByZXR1cm5zIE5VTEwuICovCi1jb25zdCBjaGFyKiB0bHMxX2VjX2N1cnZlX2lkMm5hbWUodWludDE2X3QgY3VydmVfaWQpOwotCiAvKiB0bHMxX2NoZWNrX2N1cnZlIHBhcnNlcyBFQ1BhcmFtZXRlcnMgb3V0IG9mIHxjYnN8LCBtb2RpZnlpbmcgaXQuIEl0CiAgKiBjaGVja3MgdGhlIGN1cnZlIGlzIG9uZSBvZiBvdXIgcHJlZmVyZW5jZXMgYW5kIHdyaXRlcyB0aGUKICAqIE5hbWVkQ3VydmUgdmFsdWUgdG8gfCpvdXRfY3VydmVfaWR8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZApAQCAtMTIwOCwzOSArMTA2MiwyOCBAQAogCiBpbnQgdGxzMV9zaGFyZWRfbGlzdChTU0wgKnMsIGNvbnN0IHVpbnQ4X3QgKmwxLCBzaXplX3QgbDFsZW4sIGNvbnN0IHVpbnQ4X3QgKmwyLAogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGwybGVuLCBpbnQgbm1hdGNoKTsKLXVpbnQ4X3QgKnNzbF9hZGRfY2xpZW50aGVsbG9fdGxzZXh0KFNTTCAqcywgdWludDhfdCAqY29uc3QgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqY29uc3QgbGltaXQsIHNpemVfdCBoZWFkZXJfbGVuKTsKLXVpbnQ4X3QgKnNzbF9hZGRfc2VydmVyaGVsbG9fdGxzZXh0KFNTTCAqcywgdWludDhfdCAqY29uc3QgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqY29uc3QgbGltaXQpOwordWludDhfdCAqc3NsX2FkZF9jbGllbnRoZWxsb190bHNleHQoU1NMICpzLCB1aW50OF90ICpidWYsIHVpbnQ4X3QgKmxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGhlYWRlcl9sZW4pOwordWludDhfdCAqc3NsX2FkZF9zZXJ2ZXJoZWxsb190bHNleHQoU1NMICpzLCB1aW50OF90ICpidWYsIHVpbnQ4X3QgKmxpbWl0KTsKIGludCBzc2xfcGFyc2VfY2xpZW50aGVsbG9fdGxzZXh0KFNTTCAqcywgQ0JTICpjYnMpOwogaW50IHNzbF9wYXJzZV9zZXJ2ZXJoZWxsb190bHNleHQoU1NMICpzLCBDQlMgKmNicyk7CitpbnQgc3NsX3ByZXBhcmVfY2xpZW50aGVsbG9fdGxzZXh0KFNTTCAqcyk7CitpbnQgc3NsX3ByZXBhcmVfc2VydmVyaGVsbG9fdGxzZXh0KFNTTCAqcyk7CiAKICNkZWZpbmUgdGxzZXh0X3RpY2tfbWQgRVZQX3NoYTI1NgoraW50IHRsczFfcHJvY2Vzc190aWNrZXQoU1NMICpzLCBjb25zdCBzdHJ1Y3Qgc3NsX2Vhcmx5X2NhbGxiYWNrX2N0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1NFU1NJT04gKipyZXQpOwogCi0vKiB0bHNfcHJvY2Vzc190aWNrZXQgcHJvY2Vzc2VzIHRoZSBzZXNzaW9uIHRpY2tldCBleHRlbnNpb24uIE9uIHN1Y2Nlc3MsIGl0Ci0gKiBzZXRzIHwqb3V0X3Nlc3Npb258IHRvIHRoZSBkZWNyeXB0ZWQgc2Vzc2lvbiBvciBOVUxMIGlmIHRoZSB0aWNrZXQgd2FzCi0gKiByZWplY3RlZC4gSXQgc2V0cyB8Km91dF9zZW5kX3RpY2tldHwgdG8gd2hldGhlciBhIG5ldyB0aWNrZXQgc2hvdWxkIGJlIHNlbnQKLSAqIGF0IHRoZSBlbmQgb2YgdGhlIGhhbmRzaGFrZS4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBmYXRhbAotICogZXJyb3IuICovCi1pbnQgdGxzX3Byb2Nlc3NfdGlja2V0KFNTTCAqc3NsLCBTU0xfU0VTU0lPTiAqKm91dF9zZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm91dF9zZW5kX3RpY2tldCwgY29uc3QgdWludDhfdCAqdGlja2V0LAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdGlja2V0X2xlbiwgY29uc3QgdWludDhfdCAqc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNlc3Npb25faWRfbGVuKTsKLQotLyogdGxzMTJfZ2V0X3NpZ2FuZGhhc2ggYXNzZW1ibGVzIHRoZSBTaWduYXR1cmVBbmRIYXNoQWxnb3JpdGhtIGNvcnJlc3BvbmRpbmcgdG8KLSAqIHxzc2x8J3MgcHJpdmF0ZSBrZXkgYW5kIHxtZHwuIFRoZSB0d28tYnl0ZSB2YWx1ZSBpcyB3cml0dGVuIHRvIHxwfC4gSXQKLSAqIHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZmFpbHVyZS4gKi8KLWludCB0bHMxMl9nZXRfc2lnYW5kaGFzaChTU0wgKnNzbCwgdWludDhfdCAqcCwgY29uc3QgRVZQX01EICptZCk7Ci1pbnQgdGxzMTJfZ2V0X3NpZ2lkKGludCBwa2V5X3R5cGUpOworaW50IHRsczEyX2dldF9zaWdhbmRoYXNoKHVpbnQ4X3QgKnAsIGNvbnN0IEVWUF9QS0VZICpwaywgY29uc3QgRVZQX01EICptZCk7CitpbnQgdGxzMTJfZ2V0X3NpZ2lkKGNvbnN0IEVWUF9QS0VZICpwayk7CiBjb25zdCBFVlBfTUQgKnRsczEyX2dldF9oYXNoKHVpbnQ4X3QgaGFzaF9hbGcpOwogCi0vKiB0bHMxX2NoYW5uZWxfaWRfaGFzaCBjb21wdXRlcyB0aGUgaGFzaCB0byBiZSBzaWduZWQgYnkgQ2hhbm5lbCBJRCBhbmQgd3JpdGVzCi0gKiBpdCB0byB8b3V0fCwgd2hpY2ggbXVzdCBjb250YWluIGF0IGxlYXN0IHxFVlBfTUFYX01EX1NJWkV8IGJ5dGVzLiBJdCByZXR1cm5zCi0gKiBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBmYWlsdXJlLiAqLwotaW50IHRsczFfY2hhbm5lbF9pZF9oYXNoKFNTTCAqc3NsLCB1aW50OF90ICpvdXQsIHNpemVfdCAqb3V0X2xlbik7Ci0KK2ludCB0bHMxX2NoYW5uZWxfaWRfaGFzaChFVlBfTURfQ1RYICpjdHgsIFNTTCAqcyk7CiBpbnQgdGxzMV9yZWNvcmRfaGFuZHNoYWtlX2hhc2hlc19mb3JfY2hhbm5lbF9pZChTU0wgKnMpOwogCitpbnQgdGxzMV9zZXRfc2lnYWxnc19saXN0KENFUlQgKmMsIGNvbnN0IGNoYXIgKnN0ciwgaW50IGNsaWVudCk7CitpbnQgdGxzMV9zZXRfc2lnYWxncyhDRVJUICpjLCBjb25zdCBpbnQgKnNhbGcsIHNpemVfdCBzYWxnbGVuLCBpbnQgY2xpZW50KTsKKwogLyogc3NsX2N0eF9sb2dfcnNhX2NsaWVudF9rZXlfZXhjaGFuZ2UgbG9ncyB8cHJlbWFzdGVyfCB0byB8Y3R4fCwgaWYgbG9nZ2luZyBpcwogICogZW5hYmxlZC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBmYWlsdXJlLiBUaGUgZW50cnkgaXMKICAqIGlkZW50aWZpZWQgYnkgdGhlIGZpcnN0IDggYnl0ZXMgb2YgfGVuY3J5cHRlZF9wcmVtYXN0ZXJ8LiAqLwpAQCAtMTI5MywxNiArMTEzNiwyNyBAQAogICogdGhlIHdpcmUgdmVyc2lvbiBleGNlcHQgYXQgQVBJIGJvdW5kYXJpZXMuICovCiB1aW50MTZfdCBzc2wzX3ZlcnNpb25fZnJvbV93aXJlKFNTTCAqcywgdWludDE2X3Qgd2lyZV92ZXJzaW9uKTsKIAotdWludDMyX3Qgc3NsX2dldF9hbGdvcml0aG1fcHJmKFNTTCAqcyk7Ci1pbnQgdGxzMV9wYXJzZV9wZWVyX3NpZ2FsZ3MoU1NMICpzLCBjb25zdCBDQlMgKnNpZ2FsZ3MpOworaW50IHNzbF9hZGRfc2VydmVyaGVsbG9fcmVuZWdvdGlhdGVfZXh0KFNTTCAqcywgdWludDhfdCAqcCwgaW50ICpsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heGxlbik7CitpbnQgc3NsX3BhcnNlX3NlcnZlcmhlbGxvX3JlbmVnb3RpYXRlX2V4dChTU0wgKnMsIENCUyAqY2JzLCBpbnQgKm91dF9hbGVydCk7CitpbnQgc3NsX2FkZF9jbGllbnRoZWxsb19yZW5lZ290aWF0ZV9leHQoU1NMICpzLCB1aW50OF90ICpwLCBpbnQgKmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4bGVuKTsKK2ludCBzc2xfcGFyc2VfY2xpZW50aGVsbG9fcmVuZWdvdGlhdGVfZXh0KFNTTCAqcywgQ0JTICpjYnMsIGludCAqb3V0X2FsZXJ0KTsKK3VpbnQzMl90IHNzbF9nZXRfYWxnb3JpdGhtMihTU0wgKnMpOworaW50IHRsczFfcHJvY2Vzc19zaWdhbGdzKFNTTCAqcywgY29uc3QgQ0JTICpzaWdhbGdzKTsKIAotLyogdGxzMV9jaG9vc2Vfc2lnbmluZ19kaWdlc3QgcmV0dXJucyBhIGRpZ2VzdCBmb3IgdXNlIHdpdGggfHNzbHwncyBwcml2YXRlIGtleQotICogYmFzZWQgb24gdGhlIHBlZXIncyBwcmVmZXJlbmNlcyB0aGUgZGlnZXN0cyBzdXBwb3J0ZWQuICovCi1jb25zdCBFVlBfTUQgKnRsczFfY2hvb3NlX3NpZ25pbmdfZGlnZXN0KFNTTCAqc3NsKTsKKy8qIHRsczFfY2hvb3NlX3NpZ25pbmdfZGlnZXN0IHJldHVybnMgYSBkaWdlc3QgZm9yIHVzZSB3aXRoIHxwa2V5fCBiYXNlZCBvbiB0aGUKKyAqIHBlZXIncyBwcmVmZXJlbmNlcyByZWNvcmRlZCBmb3IgfHN8IGFuZCB0aGUgZGlnZXN0cyBzdXBwb3J0ZWQgYnkgfHBrZXl8LiAqLworY29uc3QgRVZQX01EICp0bHMxX2Nob29zZV9zaWduaW5nX2RpZ2VzdChTU0wgKnMsIEVWUF9QS0VZICpwa2V5KTsKIAogc2l6ZV90IHRsczEyX2dldF9wc2lnYWxncyhTU0wgKnMsIGNvbnN0IHVpbnQ4X3QgKipwc2lncyk7CiBpbnQgdGxzMTJfY2hlY2tfcGVlcl9zaWdhbGcoY29uc3QgRVZQX01EICoqb3V0X21kLCBpbnQgKm91dF9hbGVydCwgU1NMICpzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCUyAqY2JzLCBFVlBfUEtFWSAqcGtleSk7CiB2b2lkIHNzbF9zZXRfY2xpZW50X2Rpc2FibGVkKFNTTCAqcyk7CiAKK2ludCBzc2xfYWRkX2NsaWVudGhlbGxvX3VzZV9zcnRwX2V4dChTU0wgKnMsIHVpbnQ4X3QgKnAsIGludCAqbGVuLCBpbnQgbWF4bGVuKTsKK2ludCBzc2xfcGFyc2VfY2xpZW50aGVsbG9fdXNlX3NydHBfZXh0KFNTTCAqcywgQ0JTICpjYnMsIGludCAqb3V0X2FsZXJ0KTsKK2ludCBzc2xfYWRkX3NlcnZlcmhlbGxvX3VzZV9zcnRwX2V4dChTU0wgKnMsIHVpbnQ4X3QgKnAsIGludCAqbGVuLCBpbnQgbWF4bGVuKTsKK2ludCBzc2xfcGFyc2Vfc2VydmVyaGVsbG9fdXNlX3NydHBfZXh0KFNTTCAqcywgQ0JTICpjYnMsIGludCAqb3V0X2FsZXJ0KTsKKwogI2VuZGlmIC8qIE9QRU5TU0xfSEVBREVSX1NTTF9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9zcmMvc3NsL3MzX2JvdGguYyBiL3NyYy9zc2wvczNfYm90aC5jCmluZGV4IDMxZTM2YzcuLjA2MzM4YjcgMTAwNjQ0Ci0tLSBhL3NyYy9zc2wvczNfYm90aC5jCisrKyBiL3NyYy9zc2wvczNfYm90aC5jCkBAIC0xMTAsOCArMTEwLDYgQEAKICAqIEVDQyBjaXBoZXIgc3VpdGUgc3VwcG9ydCBpbiBPcGVuU1NMIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5CiAgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4gKi8KIAotI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+Ci0KICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtMjQ0LDcgKzI0Miw3IEBACiAgICAqIFRPRE8oZGF2aWRiZW4pOiBJcyB0aGlzIGNoZWNrIG5vdyByZWR1bmRhbnQgd2l0aCBTU0wzX0ZMQUdTX0VYUEVDVF9DQ1M/ICovCiAgIGlmICghcy0+czMtPmNoYW5nZV9jaXBoZXJfc3BlYykgewogICAgIGFsID0gU1NMX0FEX1VORVhQRUNURURfTUVTU0FHRTsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0dPVF9BX0ZJTl9CRUZPUkVfQV9DQ1MpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfZmluaXNoZWQsIFNTTF9SX0dPVF9BX0ZJTl9CRUZPUkVfQV9DQ1MpOwogICAgIGdvdG8gZl9lcnI7CiAgIH0KICAgcy0+czMtPmNoYW5nZV9jaXBoZXJfc3BlYyA9IDA7CkBAIC0yNTQsMTMgKzI1MiwxMyBAQAogCiAgIGlmIChmaW5pc2hlZF9sZW4gIT0gbWVzc2FnZV9sZW4pIHsKICAgICBhbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CQURfRElHRVNUX0xFTkdUSCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9maW5pc2hlZCwgU1NMX1JfQkFEX0RJR0VTVF9MRU5HVEgpOwogICAgIGdvdG8gZl9lcnI7CiAgIH0KIAogICBpZiAoQ1JZUFRPX21lbWNtcChwLCBzLT5zMy0+dG1wLnBlZXJfZmluaXNoX21kLCBmaW5pc2hlZF9sZW4pICE9IDApIHsKICAgICBhbCA9IFNTTF9BRF9ERUNSWVBUX0VSUk9SOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfRElHRVNUX0NIRUNLX0ZBSUxFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9maW5pc2hlZCwgU1NMX1JfRElHRVNUX0NIRUNLX0ZBSUxFRCk7CiAgICAgZ290byBmX2VycjsKICAgfQogCkBAIC0zMDMsMTEgKzMwMSwxNyBAQAogICByZXR1cm4gc3NsM19kb193cml0ZShzLCBTU0wzX1JUX0NIQU5HRV9DSVBIRVJfU1BFQyk7CiB9CiAKLWludCBzc2wzX291dHB1dF9jZXJ0X2NoYWluKFNTTCAqcykgeworaW50IHNzbDNfb3V0cHV0X2NlcnRfY2hhaW4oU1NMICpzLCBDRVJUX1BLRVkgKmNwaykgewogICB1aW50OF90ICpwOwogICB1bnNpZ25lZCBsb25nIGwgPSAzICsgU1NMX0hNX0hFQURFUl9MRU5HVEgocyk7CiAKLSAgaWYgKCFzc2xfYWRkX2NlcnRfY2hhaW4ocywgJmwpKSB7CisgIGlmIChjcGsgPT0gTlVMTCkgeworICAgIC8qIFRMU3YxIHNlbmRzIGEgY2hhaW4gd2l0aCBub3RoaW5nIGluIGl0LCBpbnN0ZWFkIG9mIGFuIGFsZXJ0LiAqLworICAgIGlmICghQlVGX01FTV9ncm93X2NsZWFuKHMtPmluaXRfYnVmLCBsKSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX291dHB1dF9jZXJ0X2NoYWluLCBFUlJfUl9CVUZfTElCKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfSBlbHNlIGlmICghc3NsX2FkZF9jZXJ0X2NoYWluKHMsIGNwaywgJmwpKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMzM2LDcgKzM0MCw3IEBACiAgICAgcy0+czMtPnRtcC5yZXVzZV9tZXNzYWdlID0gMDsKICAgICBpZiAobXNnX3R5cGUgPj0gMCAmJiBzLT5zMy0+dG1wLm1lc3NhZ2VfdHlwZSAhPSBtc2dfdHlwZSkgewogICAgICAgYWwgPSBTU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9VTkVYUEVDVEVEX01FU1NBR0UpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9tZXNzYWdlLCBTU0xfUl9VTkVYUEVDVEVEX01FU1NBR0UpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAgICAgKm9rID0gMTsKQEAgLTM4Miw3ICszODYsNyBAQAogCiAgICAgaWYgKG1zZ190eXBlID49IDAgJiYgKnAgIT0gbXNnX3R5cGUpIHsKICAgICAgIGFsID0gU1NMX0FEX1VORVhQRUNURURfTUVTU0FHRTsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfVU5FWFBFQ1RFRF9NRVNTQUdFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfbWVzc2FnZSwgU1NMX1JfVU5FWFBFQ1RFRF9NRVNTQUdFKTsKICAgICAgIGdvdG8gZl9lcnI7CiAgICAgfQogICAgIHMtPnMzLT50bXAubWVzc2FnZV90eXBlID0gKihwKyspOwpAQCAtMzkwLDEyICszOTQsMTIgQEAKICAgICBuMmwzKHAsIGwpOwogICAgIGlmIChsID4gKHVuc2lnbmVkIGxvbmcpbWF4KSB7CiAgICAgICBhbCA9IFNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfRVhDRVNTSVZFX01FU1NBR0VfU0laRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X21lc3NhZ2UsIFNTTF9SX0VYQ0VTU0lWRV9NRVNTQUdFX1NJWkUpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAKICAgICBpZiAobCAmJiAhQlVGX01FTV9ncm93X2NsZWFuKHMtPmluaXRfYnVmLCBsICsgNCkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfQlVGX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X21lc3NhZ2UsIEVSUl9SX0JVRl9MSUIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIHMtPnMzLT50bXAubWVzc2FnZV9zaXplID0gbDsKQEAgLTQ0Myw4ICs0NDcsOCBAQAogICAvKiBUaGUgaGFuZHNoYWtlIGhlYWRlciAoZGlmZmVyZW50IHNpemUgYmV0d2VlbiBEVExTIGFuZCBUTFMpIGlzIGluY2x1ZGVkIGluCiAgICAqIHRoZSBoYXNoLiAqLwogICBzaXplX3QgaGVhZGVyX2xlbiA9IHMtPmluaXRfbXNnIC0gKHVpbnQ4X3QgKilzLT5pbml0X2J1Zi0+ZGF0YTsKLSAgcmV0dXJuIHNzbDNfdXBkYXRlX2hhbmRzaGFrZV9oYXNoKHMsICh1aW50OF90ICopcy0+aW5pdF9idWYtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5pbml0X251bSArIGhlYWRlcl9sZW4pOworICByZXR1cm4gc3NsM19maW5pc2hfbWFjKHMsICh1aW50OF90ICopcy0+aW5pdF9idWYtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW5pdF9udW0gKyBoZWFkZXJfbGVuKTsKIH0KIAogLyogc3NsM19jZXJ0X3ZlcmlmeV9oYXNoIGlzIGRvY3VtZW50ZWQgYXMgbmVlZGluZyBFVlBfTUFYX01EX1NJWkUgYmVjYXVzZSB0aGF0CkBAIC00NTMsMjUgKzQ1NywzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZF90bHNfaGFzaF9maXRzX2luX21heCk7CiAKIGludCBzc2wzX2NlcnRfdmVyaWZ5X2hhc2goU1NMICpzLCB1aW50OF90ICpvdXQsIHNpemVfdCAqb3V0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRVZQX01EICoqb3V0X21kLCBpbnQgcGtleV90eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9NRCAqKm91dF9tZCwgRVZQX1BLRVkgKnBrZXkpIHsKICAgLyogRm9yIFRMUyB2MS4yIHNlbmQgc2lnbmF0dXJlIGFsZ29yaXRobSBhbmQgc2lnbmF0dXJlIHVzaW5nCiAgICAqIGFncmVlZCBkaWdlc3QgYW5kIGNhY2hlZCBoYW5kc2hha2UgcmVjb3Jkcy4gT3RoZXJ3aXNlLCB1c2UKICAgICogU0hBMSBvciBNRDUgKyBTSEExIGRlcGVuZGluZyBvbiBrZXkgdHlwZS4gICovCiAgIGlmIChTU0xfVVNFX1NJR0FMR1MocykpIHsKKyAgICBjb25zdCB1aW50OF90ICpoZGF0YTsKKyAgICBzaXplX3QgaGRhdGFsZW47CiAgICAgRVZQX01EX0NUWCBtY3R4OwogICAgIHVuc2lnbmVkIGxlbjsKIAorICAgIGlmICghQklPX21lbV9jb250ZW50cyhzLT5zMy0+aGFuZHNoYWtlX2J1ZmZlciwgJmhkYXRhLCAmaGRhdGFsZW4pKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfY2VydF92ZXJpZnlfaGFzaCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgcmV0dXJuIDA7CisgICAgfQogICAgIEVWUF9NRF9DVFhfaW5pdCgmbWN0eCk7CiAgICAgaWYgKCFFVlBfRGlnZXN0SW5pdF9leCgmbWN0eCwgKm91dF9tZCwgTlVMTCkgfHwKLSAgICAgICAgIUVWUF9EaWdlc3RVcGRhdGUoJm1jdHgsIHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zMy0+aGFuZHNoYWtlX2J1ZmZlci0+bGVuZ3RoKSB8fAorICAgICAgICAhRVZQX0RpZ2VzdFVwZGF0ZSgmbWN0eCwgaGRhdGEsIGhkYXRhbGVuKSB8fAogICAgICAgICAhRVZQX0RpZ2VzdEZpbmFsKCZtY3R4LCBvdXQsICZsZW4pKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0VWUF9MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2NlcnRfdmVyaWZ5X2hhc2gsIEVSUl9SX0VWUF9MSUIpOwogICAgICAgRVZQX01EX0NUWF9jbGVhbnVwKCZtY3R4KTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICAqb3V0X2xlbiA9IGxlbjsKLSAgfSBlbHNlIGlmIChwa2V5X3R5cGUgPT0gRVZQX1BLRVlfUlNBKSB7CisgIH0gZWxzZSBpZiAocGtleS0+dHlwZSA9PSBFVlBfUEtFWV9SU0EpIHsKICAgICBpZiAocy0+ZW5jX21ldGhvZC0+Y2VydF92ZXJpZnlfbWFjKHMsIE5JRF9tZDUsIG91dCkgPT0gMCB8fAogICAgICAgICBzLT5lbmNfbWV0aG9kLT5jZXJ0X3ZlcmlmeV9tYWMocywgTklEX3NoYTEsIG91dCArIE1ENV9ESUdFU1RfTEVOR1RIKSA9PQogICAgICAgICAgICAgMCkgewpAQCAtNDc5LDIwICs0ODgsMzEgQEAKICAgICB9CiAgICAgKm91dF9sZW4gPSBNRDVfRElHRVNUX0xFTkdUSCArIFNIQV9ESUdFU1RfTEVOR1RIOwogICAgICpvdXRfbWQgPSBFVlBfbWQ1X3NoYTEoKTsKLSAgfSBlbHNlIGlmIChwa2V5X3R5cGUgPT0gRVZQX1BLRVlfRUMpIHsKKyAgfSBlbHNlIGlmIChwa2V5LT50eXBlID09IEVWUF9QS0VZX0VDKSB7CiAgICAgaWYgKHMtPmVuY19tZXRob2QtPmNlcnRfdmVyaWZ5X21hYyhzLCBOSURfc2hhMSwgb3V0KSA9PSAwKSB7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgKm91dF9sZW4gPSBTSEFfRElHRVNUX0xFTkdUSDsKICAgICAqb3V0X21kID0gRVZQX3NoYTEoKTsKICAgfSBlbHNlIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfY2VydF92ZXJpZnlfaGFzaCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgcmV0dXJuIDE7CiB9CiAKK2ludCBzc2xfY2VydF90eXBlKEVWUF9QS0VZICpwa2V5KSB7CisgIHN3aXRjaCAocGtleS0+dHlwZSkgeworICAgIGNhc2UgRVZQX1BLRVlfUlNBOgorICAgICAgcmV0dXJuIFNTTF9QS0VZX1JTQV9FTkM7CisgICAgY2FzZSBFVlBfUEtFWV9FQzoKKyAgICAgIHJldHVybiBTU0xfUEtFWV9FQ0M7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAtMTsKKyAgfQorfQorCiBpbnQgc3NsX3ZlcmlmeV9hbGFybV90eXBlKGxvbmcgdHlwZSkgewogICBpbnQgYWw7CiAKQEAgLTU2MSw2ICs1ODEsOTIgQEAKICAgcmV0dXJuIGFsOwogfQogCitpbnQgc3NsM19zZXR1cF9yZWFkX2J1ZmZlcihTU0wgKnMpIHsKKyAgdWludDhfdCAqcDsKKyAgc2l6ZV90IGxlbiwgYWxpZ24gPSAwLCBoZWFkZXJsZW47CisKKyAgaWYgKFNTTF9JU19EVExTKHMpKSB7CisgICAgaGVhZGVybGVuID0gRFRMUzFfUlRfSEVBREVSX0xFTkdUSDsKKyAgfSBlbHNlIHsKKyAgICBoZWFkZXJsZW4gPSBTU0wzX1JUX0hFQURFUl9MRU5HVEg7CisgIH0KKworI2lmIGRlZmluZWQoU1NMM19BTElHTl9QQVlMT0FEKSAmJiBTU0wzX0FMSUdOX1BBWUxPQUQgIT0gMAorICBhbGlnbiA9ICgtU1NMM19SVF9IRUFERVJfTEVOR1RIKSAmIChTU0wzX0FMSUdOX1BBWUxPQUQgLSAxKTsKKyNlbmRpZgorCisgIGlmIChzLT5zMy0+cmJ1Zi5idWYgPT0gTlVMTCkgeworICAgIGxlbiA9IFNTTDNfUlRfTUFYX0VOQ1JZUFRFRF9MRU5HVEggKyBoZWFkZXJsZW4gKyBhbGlnbjsKKyAgICBpZiAocy0+b3B0aW9ucyAmIFNTTF9PUF9NSUNST1NPRlRfQklHX1NTTFYzX0JVRkZFUikgeworICAgICAgcy0+czMtPmluaXRfZXh0cmEgPSAxOworICAgICAgbGVuICs9IFNTTDNfUlRfTUFYX0VYVFJBOworICAgIH0KKyAgICBwID0gT1BFTlNTTF9tYWxsb2MobGVuKTsKKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgcy0+czMtPnJidWYuYnVmID0gcDsKKyAgICBzLT5zMy0+cmJ1Zi5sZW4gPSBsZW47CisgIH0KKworICBzLT5wYWNrZXQgPSAmcy0+czMtPnJidWYuYnVmWzBdOworICByZXR1cm4gMTsKKworZXJyOgorICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfc2V0dXBfcmVhZF9idWZmZXIsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBzc2wzX3NldHVwX3dyaXRlX2J1ZmZlcihTU0wgKnMpIHsKKyAgdWludDhfdCAqcDsKKyAgc2l6ZV90IGxlbiwgYWxpZ24gPSAwLCBoZWFkZXJsZW47CisKKyAgaWYgKFNTTF9JU19EVExTKHMpKSB7CisgICAgaGVhZGVybGVuID0gRFRMUzFfUlRfSEVBREVSX0xFTkdUSCArIDE7CisgIH0gZWxzZSB7CisgICAgaGVhZGVybGVuID0gU1NMM19SVF9IRUFERVJfTEVOR1RIOworICB9CisKKyNpZiBkZWZpbmVkKFNTTDNfQUxJR05fUEFZTE9BRCkgJiYgU1NMM19BTElHTl9QQVlMT0FEICE9IDAKKyAgYWxpZ24gPSAoLVNTTDNfUlRfSEVBREVSX0xFTkdUSCkgJiAoU1NMM19BTElHTl9QQVlMT0FEIC0gMSk7CisjZW5kaWYKKworICBpZiAocy0+czMtPndidWYuYnVmID09IE5VTEwpIHsKKyAgICBsZW4gPSBzLT5tYXhfc2VuZF9mcmFnbWVudCArIFNTTDNfUlRfU0VORF9NQVhfRU5DUllQVEVEX09WRVJIRUFEICsKKyAgICAgICAgICBoZWFkZXJsZW4gKyBhbGlnbjsKKyAgICAvKiBBY2NvdW50IGZvciAxL24tMSByZWNvcmQgc3BsaXR0aW5nLiAqLworICAgIGlmIChzLT5tb2RlICYgU1NMX01PREVfQ0JDX1JFQ09SRF9TUExJVFRJTkcpIHsKKyAgICAgIGxlbiArPSBoZWFkZXJsZW4gKyBhbGlnbiArIDEgKyBTU0wzX1JUX1NFTkRfTUFYX0VOQ1JZUFRFRF9PVkVSSEVBRDsKKyAgICB9CisKKyAgICBwID0gT1BFTlNTTF9tYWxsb2MobGVuKTsKKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgcy0+czMtPndidWYuYnVmID0gcDsKKyAgICBzLT5zMy0+d2J1Zi5sZW4gPSBsZW47CisgIH0KKworICByZXR1cm4gMTsKKworZXJyOgorICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfc2V0dXBfd3JpdGVfYnVmZmVyLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgIHJldHVybiAwOworfQorCitpbnQgc3NsM19yZWxlYXNlX3dyaXRlX2J1ZmZlcihTU0wgKnMpIHsKKyAgT1BFTlNTTF9mcmVlKHMtPnMzLT53YnVmLmJ1Zik7CisgIHMtPnMzLT53YnVmLmJ1ZiA9IE5VTEw7CisgIHJldHVybiAxOworfQorCitpbnQgc3NsM19yZWxlYXNlX3JlYWRfYnVmZmVyKFNTTCAqcykgeworICBPUEVOU1NMX2ZyZWUocy0+czMtPnJidWYuYnVmKTsKKyAgcy0+czMtPnJidWYuYnVmID0gTlVMTDsKKyAgcy0+cGFja2V0ID0gTlVMTDsKKyAgcmV0dXJuIDE7Cit9CisKIGludCBzc2xfZmlsbF9oZWxsb19yYW5kb20odWludDhfdCAqb3V0LCBzaXplX3QgbGVuLCBpbnQgaXNfc2VydmVyKSB7CiAgIGlmIChpc19zZXJ2ZXIpIHsKICAgICBjb25zdCB1aW50MzJfdCBjdXJyZW50X3RpbWUgPSB0aW1lKE5VTEwpOwpkaWZmIC0tZ2l0IGEvc3JjL3NzbC9zM19jbG50LmMgYi9zcmMvc3NsL3MzX2NsbnQuYwppbmRleCA1NTlkYjcyLi4xNTllMmQ3IDEwMDY0NAotLS0gYS9zcmMvc3NsL3MzX2NsbnQuYworKysgYi9zcmMvc3NsL3MzX2NsbnQuYwpAQCAtMTQ4LDI2ICsxNDgsMjEgQEAKICAqIE9USEVSV0lTRS4KICAqLwogCi0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KLQogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9idWYuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2J5dGVzdHJpbmcuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9lY19rZXkuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2VjZHNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KICNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgotI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgogI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgotI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgIi4uL2NyeXB0by9kaC9pbnRlcm5hbC5oIgpAQCAtMjIyLDggKzIxNyw4IEBACiAKICAgICAgICAgLyogZG9uJ3QgcHVzaCB0aGUgYnVmZmVyaW5nIEJJTyBxdWl0ZSB5ZXQgKi8KIAotICAgICAgICBpZiAoIXNzbDNfaW5pdF9oYW5kc2hha2VfYnVmZmVyKHMpKSB7Ci0gICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgIGlmICghc3NsM19pbml0X2ZpbmlzaGVkX21hYyhzKSkgeworICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19jb25uZWN0LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICAgICAgcmV0ID0gLTE7CiAgICAgICAgICAgZ290byBlbmQ7CiAgICAgICAgIH0KQEAgLTI3OCw3ICsyNzMsNyBAQAogICAgICAgICAgIGlmIChzLT5zMy0+dG1wLmNlcnRpZmljYXRlX3N0YXR1c19leHBlY3RlZCkgewogICAgICAgICAgICAgcy0+c3RhdGUgPSBTU0wzX1NUX0NSX0NFUlRfU1RBVFVTX0E7CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHMtPnN0YXRlID0gU1NMM19TVF9WRVJJRllfU0VSVkVSX0NFUlQ7CisgICAgICAgICAgICBzLT5zdGF0ZSA9IFNTTDNfU1RfQ1JfS0VZX0VYQ0hfQTsKICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgc2tpcCA9IDE7CkBAIC0yODcsMTYgKzI4Miw2IEBACiAgICAgICAgIHMtPmluaXRfbnVtID0gMDsKICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgU1NMM19TVF9WRVJJRllfU0VSVkVSX0NFUlQ6Ci0gICAgICAgIHJldCA9IHNzbDNfdmVyaWZ5X3NlcnZlcl9jZXJ0KHMpOwotICAgICAgICBpZiAocmV0IDw9IDApIHsKLSAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgfQotCi0gICAgICAgIHMtPnN0YXRlID0gU1NMM19TVF9DUl9LRVlfRVhDSF9BOwotICAgICAgICBzLT5pbml0X251bSA9IDA7Ci0gICAgICAgIGJyZWFrOwotCiAgICAgICBjYXNlIFNTTDNfU1RfQ1JfS0VZX0VYQ0hfQToKICAgICAgIGNhc2UgU1NMM19TVF9DUl9LRVlfRVhDSF9COgogICAgICAgICByZXQgPSBzc2wzX2dldF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlKHMpOwpAQCAtMzA1LDYgKzI5MCwxMyBAQAogICAgICAgICB9CiAgICAgICAgIHMtPnN0YXRlID0gU1NMM19TVF9DUl9DRVJUX1JFUV9BOwogICAgICAgICBzLT5pbml0X251bSA9IDA7CisKKyAgICAgICAgLyogYXQgdGhpcyBwb2ludCB3ZSBjaGVjayB0aGF0IHdlIGhhdmUgdGhlCisgICAgICAgICAqIHJlcXVpcmVkIHN0dWZmIGZyb20gdGhlIHNlcnZlciAqLworICAgICAgICBpZiAoIXNzbDNfY2hlY2tfY2VydF9hbmRfYWxnb3JpdGhtKHMpKSB7CisgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKICAgICAgIGNhc2UgU1NMM19TVF9DUl9DRVJUX1JFUV9BOgpAQCAtMzY0LDcgKzM1Niw2IEBACiAKICAgICAgIGNhc2UgU1NMM19TVF9DV19DRVJUX1ZSRllfQToKICAgICAgIGNhc2UgU1NMM19TVF9DV19DRVJUX1ZSRllfQjoKLSAgICAgIGNhc2UgU1NMM19TVF9DV19DRVJUX1ZSRllfQzoKICAgICAgICAgcmV0ID0gc3NsM19zZW5kX2NlcnRfdmVyaWZ5KHMpOwogICAgICAgICBpZiAocmV0IDw9IDApIHsKICAgICAgICAgICBnb3RvIGVuZDsKQEAgLTQ0Miw5ICs0MzMsMTEgQEAKICAgICAgICAgICAgKiByZWNvcmQgdGhlIGhhbmRzaGFrZSBoYXNoZXMgYXQgdGhpcyBwb2ludCBpbiB0aGUgc2Vzc2lvbiBzbyB0aGF0CiAgICAgICAgICAgICogYW55IHJlc3VtcHRpb24gb2YgdGhpcyBzZXNzaW9uIHdpdGggQ2hhbm5lbElEIGNhbiBzaWduIHRob3NlCiAgICAgICAgICAgICogaGFzaGVzLiAqLwotICAgICAgICAgIHJldCA9IHRsczFfcmVjb3JkX2hhbmRzaGFrZV9oYXNoZXNfZm9yX2NoYW5uZWxfaWQocyk7Ci0gICAgICAgICAgaWYgKHJldCA8PSAwKSB7Ci0gICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICBpZiAocy0+czMtPnRsc2V4dF9jaGFubmVsX2lkX25ldykgeworICAgICAgICAgICAgcmV0ID0gdGxzMV9yZWNvcmRfaGFuZHNoYWtlX2hhc2hlc19mb3JfY2hhbm5lbF9pZChzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgICAgaWYgKChTU0xfZ2V0X21vZGUocykgJiBTU0xfTU9ERV9FTkFCTEVfRkFMU0VfU1RBUlQpICYmCiAgICAgICAgICAgICAgIHNzbDNfY2FuX2ZhbHNlX3N0YXJ0KHMpICYmCkBAIC00ODAsNyArNDczLDcgQEAKICAgICAgICAgaWYgKHJldCA8PSAwKSB7CiAgICAgICAgICAgZ290byBlbmQ7CiAgICAgICAgIH0KLSAgICAgICAgcy0+c3RhdGUgPSBTU0wzX1NUX1ZFUklGWV9TRVJWRVJfQ0VSVDsKKyAgICAgICAgcy0+c3RhdGUgPSBTU0wzX1NUX0NSX0tFWV9FWENIX0E7CiAgICAgICAgIHMtPmluaXRfbnVtID0gMDsKICAgICAgICAgYnJlYWs7CiAKQEAgLTU0MywxNiArNTM2LDExIEBACiAgICAgICAgIC8qIFJlbW92ZSB3cml0ZSBidWZmZXJpbmcgbm93LiAqLwogICAgICAgICBzc2xfZnJlZV93YmlvX2J1ZmZlcihzKTsKIAotICAgICAgICBjb25zdCBpbnQgaXNfaW5pdGlhbF9oYW5kc2hha2UgPSAhcy0+czMtPmluaXRpYWxfaGFuZHNoYWtlX2NvbXBsZXRlOwotCiAgICAgICAgIHMtPmluaXRfbnVtID0gMDsKICAgICAgICAgcy0+czMtPnRtcC5pbl9mYWxzZV9zdGFydCA9IDA7CiAgICAgICAgIHMtPnMzLT5pbml0aWFsX2hhbmRzaGFrZV9jb21wbGV0ZSA9IDE7CiAKLSAgICAgICAgaWYgKGlzX2luaXRpYWxfaGFuZHNoYWtlKSB7Ci0gICAgICAgICAgLyogUmVuZWdvdGlhdGlvbnMgZG8gbm90IHBhcnRpY2lwYXRlIGluIHNlc3Npb24gcmVzdW1wdGlvbi4gKi8KLSAgICAgICAgICBzc2xfdXBkYXRlX2NhY2hlKHMsIFNTTF9TRVNTX0NBQ0hFX0NMSUVOVCk7Ci0gICAgICAgIH0KKyAgICAgICAgc3NsX3VwZGF0ZV9jYWNoZShzLCBTU0xfU0VTU19DQUNIRV9DTElFTlQpOwogCiAgICAgICAgIHJldCA9IDE7CiAgICAgICAgIC8qIHMtPnNlcnZlcj0wOyAqLwpAQCAtNTY0LDcgKzU1Miw3IEBACiAgICAgICAgIGdvdG8gZW5kOwogCiAgICAgICBkZWZhdWx0OgotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1VOS05PV05fU1RBVEUpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfY29ubmVjdCwgU1NMX1JfVU5LTk9XTl9TVEFURSk7CiAgICAgICAgIHJldCA9IC0xOwogICAgICAgICBnb3RvIGVuZDsKICAgICB9CkBAIC02MDAsNyArNTg4LDcgQEAKICAgICAgIHVpbnQxNl90IG1heF92ZXJzaW9uID0gc3NsM19nZXRfbWF4X2NsaWVudF92ZXJzaW9uKHMpOwogICAgICAgLyogRGlzYWJsaW5nIGFsbCB2ZXJzaW9ucyBpcyBzaWxseTogcmV0dXJuIGFuIGVycm9yLiAqLwogICAgICAgaWYgKG1heF92ZXJzaW9uID09IDApIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9XUk9OR19TU0xfVkVSU0lPTik7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX2NsaWVudF9oZWxsbywgU1NMX1JfV1JPTkdfU1NMX1ZFUlNJT04pOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KICAgICAgIHMtPnZlcnNpb24gPSBtYXhfdmVyc2lvbjsKQEAgLTY3Myw3ICs2NjEsNyBAQAogICAgICoocCsrKSA9IGk7CiAgICAgaWYgKGkgIT0gMCkgewogICAgICAgaWYgKGkgPiAoaW50KXNpemVvZihzLT5zZXNzaW9uLT5zZXNzaW9uX2lkKSkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2xpZW50X2hlbGxvLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogICAgICAgbWVtY3B5KHAsIHMtPnNlc3Npb24tPnNlc3Npb25faWQsIGkpOwpAQCAtNjgzLDcgKzY3MSw3IEBACiAgICAgLyogY29va2llIHN0dWZmIGZvciBEVExTICovCiAgICAgaWYgKFNTTF9JU19EVExTKHMpKSB7CiAgICAgICBpZiAocy0+ZDEtPmNvb2tpZV9sZW4gPiBzaXplb2Yocy0+ZDEtPmNvb2tpZSkpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX2NsaWVudF9oZWxsbywgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KICAgICAgICoocCsrKSA9IHMtPmQxLT5jb29raWVfbGVuOwpAQCAtNjk0LDcgKzY4Miw4IEBACiAgICAgLyogQ2lwaGVycyBzdXBwb3J0ZWQgKi8KICAgICBpID0gc3NsX2NpcGhlcl9saXN0X3RvX2J5dGVzKHMsIFNTTF9nZXRfY2lwaGVycyhzKSwgJnBbMl0pOwogICAgIGlmIChpID09IDApIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfTk9fQ0lQSEVSU19BVkFJTEFCTEUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2xpZW50X2hlbGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfTk9fQ0lQSEVSU19BVkFJTEFCTEUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIHMybihpLCBwKTsKQEAgLTcwNSwxMCArNjk0LDE1IEBACiAgICAgKihwKyspID0gMDsgLyogQWRkIHRoZSBOVUxMIG1ldGhvZCAqLwogCiAgICAgLyogVExTIGV4dGVuc2lvbnMqLworICAgIGlmIChzc2xfcHJlcGFyZV9jbGllbnRoZWxsb190bHNleHQocykgPD0gMCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2xpZW50X2hlbGxvLCBTU0xfUl9DTElFTlRIRUxMT19UTFNFWFQpOworICAgICAgZ290byBlcnI7CisgICAgfQorCiAgICAgcCA9IHNzbF9hZGRfY2xpZW50aGVsbG9fdGxzZXh0KHMsIHAsIGJ1ZiArIFNTTDNfUlRfTUFYX1BMQUlOX0xFTkdUSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCAtIGJ1Zik7CiAgICAgaWYgKHAgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfc2VuZF9jbGllbnRfaGVsbG8sIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtNzUyLDcgKzc0Niw4IEBACiAgICAgICAgKiBwYXJhbWV0ZXJzLiBOb3RlOiB0aGlzIGVycm9yIGNvZGUgY29tZXMgYWZ0ZXIgdGhlIG9yaWdpbmFsIG9uZS4KICAgICAgICAqCiAgICAgICAgKiBTZWUgaHR0cHM6Ly9jcmJ1Zy5jb20vNDQ2NTA1LiAqLwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9IQU5EU0hBS0VfRkFJTFVSRV9PTl9DTElFTlRfSEVMTE8pOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9zZXJ2ZXJfaGVsbG8sCisgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9IQU5EU0hBS0VfRkFJTFVSRV9PTl9DTElFTlRfSEVMTE8pOwogICAgIH0KICAgICByZXR1cm4gbjsKICAgfQpAQCAtNzY2LDE0ICs3NjEsMTQgQEAKICAgICAgICFDQlNfZ2V0X3UxNigmc2VydmVyX2hlbGxvLCAmY2lwaGVyX3N1aXRlKSB8fAogICAgICAgIUNCU19nZXRfdTgoJnNlcnZlcl9oZWxsbywgJmNvbXByZXNzaW9uX21ldGhvZCkpIHsKICAgICBhbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9ERUNPREVfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfc2VydmVyX2hlbGxvLCBTU0xfUl9ERUNPREVfRVJST1IpOwogICAgIGdvdG8gZl9lcnI7CiAgIH0KIAogICBhc3NlcnQocy0+czMtPmhhdmVfdmVyc2lvbiA9PSBzLT5zMy0+aW5pdGlhbF9oYW5kc2hha2VfY29tcGxldGUpOwogICBpZiAoIXMtPnMzLT5oYXZlX3ZlcnNpb24pIHsKICAgICBpZiAoIXNzbDNfaXNfdmVyc2lvbl9lbmFibGVkKHMsIHNlcnZlcl92ZXJzaW9uKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9VTlNVUFBPUlRFRF9QUk9UT0NPTCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9oZWxsbywgU1NMX1JfVU5TVVBQT1JURURfUFJPVE9DT0wpOwogICAgICAgcy0+dmVyc2lvbiA9IHNlcnZlcl92ZXJzaW9uOwogICAgICAgLyogTWFyayB0aGUgdmVyc2lvbiBhcyBmaXhlZCBzbyB0aGUgcmVjb3JkLWxheWVyIHZlcnNpb24gaXMgbm90IGNsYW1wZWQKICAgICAgICAqIHRvIFRMUyAxLjAuICovCkBAIC03ODgsNyArNzgzLDcgQEAKICAgICAgKiBmaXhlZC4gQmVnaW4gZW5mb3JjaW5nIHRoZSByZWNvcmQtbGF5ZXIgdmVyc2lvbi4gKi8KICAgICBzLT5zMy0+aGF2ZV92ZXJzaW9uID0gMTsKICAgfSBlbHNlIGlmIChzZXJ2ZXJfdmVyc2lvbiAhPSBzLT52ZXJzaW9uKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9XUk9OR19TU0xfVkVSU0lPTik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9zZXJ2ZXJfaGVsbG8sIFNTTF9SX1dST05HX1NTTF9WRVJTSU9OKTsKICAgICBhbCA9IFNTTF9BRF9QUk9UT0NPTF9WRVJTSU9OOwogICAgIGdvdG8gZl9lcnI7CiAgIH0KQEAgLTgwNCw3ICs3OTksNyBAQAogICAgICAgICBtZW1jbXAocy0+c2Vzc2lvbi0+c2lkX2N0eCwgcy0+c2lkX2N0eCwgcy0+c2lkX2N0eF9sZW5ndGgpKSB7CiAgICAgICAvKiBhY3R1YWxseSBhIGNsaWVudCBhcHBsaWNhdGlvbiBidWcgKi8KICAgICAgIGFsID0gU1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLAorICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9zZXJ2ZXJfaGVsbG8sCiAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9BVFRFTVBUX1RPX1JFVVNFX1NFU1NJT05fSU5fRElGRkVSRU5UX0NPTlRFWFQpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CkBAIC04MjUsNyArODIwLDggQEAKICAgaWYgKGMgPT0gTlVMTCkgewogICAgIC8qIHVua25vd24gY2lwaGVyICovCiAgICAgYWwgPSBTU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9VTktOT1dOX0NJUEhFUl9SRVRVUk5FRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9zZXJ2ZXJfaGVsbG8sCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfVU5LTk9XTl9DSVBIRVJfUkVUVVJORUQpOwogICAgIGdvdG8gZl9lcnI7CiAgIH0KICAgLyogY3QtPm1hc2tfc3NsIHdhcyBjb21wdXRlZCBmcm9tIGNsaWVudCBjYXBhYmlsaXRpZXMuIE5vdwpAQCAtODQxLDcgKzgzNyw3IEBACiAgICAgICAoYy0+YWxnb3JpdGhtX21rZXkgJiBjdC0+bWFza19rKSB8fAogICAgICAgKGMtPmFsZ29yaXRobV9hdXRoICYgY3QtPm1hc2tfYSkpIHsKICAgICBhbCA9IFNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1dST05HX0NJUEhFUl9SRVRVUk5FRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9zZXJ2ZXJfaGVsbG8sIFNTTF9SX1dST05HX0NJUEhFUl9SRVRVUk5FRCk7CiAgICAgZ290byBmX2VycjsKICAgfQogCkBAIC04NDksNDYgKzg0NSw0NSBAQAogICBpZiAoIXNrX1NTTF9DSVBIRVJfZmluZChzaywgTlVMTCwgYykpIHsKICAgICAvKiB3ZSBkaWQgbm90IHNheSB3ZSB3b3VsZCB1c2UgdGhpcyBjaXBoZXIgKi8KICAgICBhbCA9IFNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1dST05HX0NJUEhFUl9SRVRVUk5FRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9zZXJ2ZXJfaGVsbG8sIFNTTF9SX1dST05HX0NJUEhFUl9SRVRVUk5FRCk7CiAgICAgZ290byBmX2VycjsKICAgfQogCiAgIGlmIChzLT5oaXQpIHsKICAgICBpZiAocy0+c2Vzc2lvbi0+Y2lwaGVyICE9IGMpIHsKICAgICAgIGFsID0gU1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9PTERfU0VTU0lPTl9DSVBIRVJfTk9UX1JFVFVSTkVEKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfc2VydmVyX2hlbGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfT0xEX1NFU1NJT05fQ0lQSEVSX05PVF9SRVRVUk5FRCk7CiAgICAgICBnb3RvIGZfZXJyOwogICAgIH0KICAgICBpZiAocy0+c2Vzc2lvbi0+c3NsX3ZlcnNpb24gIT0gcy0+dmVyc2lvbikgewogICAgICAgYWwgPSBTU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX09MRF9TRVNTSU9OX1ZFUlNJT05fTk9UX1JFVFVSTkVEKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfc2VydmVyX2hlbGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfT0xEX1NFU1NJT05fVkVSU0lPTl9OT1RfUkVUVVJORUQpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAgIH0KICAgcy0+czMtPnRtcC5uZXdfY2lwaGVyID0gYzsKIAotICAvKiBOb3cgdGhhdCB0aGUgY2lwaGVyIGlzIGtub3duLCBpbml0aWFsaXplIHRoZSBoYW5kc2hha2UgaGFzaC4gKi8KLSAgaWYgKCFzc2wzX2luaXRfaGFuZHNoYWtlX2hhc2gocykpIHsKLSAgICBnb3RvIGZfZXJyOwotICB9Ci0KICAgLyogSWYgZG9pbmcgYSBmdWxsIGhhbmRzaGFrZSB3aXRoIFRMUyAxLjIsIHRoZSBzZXJ2ZXIgbWF5IHJlcXVlc3QgYSBjbGllbnQKICAgICogY2VydGlmaWNhdGUgd2hpY2ggcmVxdWlyZXMgaGFzaGluZyB0aGUgaGFuZHNoYWtlIHRyYW5zY3JpcHQgdW5kZXIgYQotICAgKiBkaWZmZXJlbnQgaGFzaC4gT3RoZXJ3aXNlLCB0aGUgaGFuZHNoYWtlIGJ1ZmZlciBtYXkgYmUgcmVsZWFzZWQuICovCi0gIGlmICghU1NMX1VTRV9TSUdBTEdTKHMpIHx8IHMtPmhpdCkgewotICAgIHNzbDNfZnJlZV9oYW5kc2hha2VfYnVmZmVyKHMpOworICAgKiBkaWZmZXJlbnQgaGFzaC4gT3RoZXJ3aXNlLCByZWxlYXNlIHRoZSBoYW5kc2hha2UgYnVmZmVyLiAqLworICBpZiAoKCFTU0xfVVNFX1NJR0FMR1MocykgfHwgcy0+aGl0KSAmJgorICAgICAgIXNzbDNfZGlnZXN0X2NhY2hlZF9yZWNvcmRzKHMsIGZyZWVfaGFuZHNoYWtlX2J1ZmZlcikpIHsKKyAgICBnb3RvIGZfZXJyOwogICB9CiAKICAgLyogT25seSB0aGUgTlVMTCBjb21wcmVzc2lvbiBhbGdvcml0aG0gaXMgc3VwcG9ydGVkLiAqLwogICBpZiAoY29tcHJlc3Npb25fbWV0aG9kICE9IDApIHsKICAgICBhbCA9IFNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1VOU1VQUE9SVEVEX0NPTVBSRVNTSU9OX0FMR09SSVRITSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9zZXJ2ZXJfaGVsbG8sCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfVU5TVVBQT1JURURfQ09NUFJFU1NJT05fQUxHT1JJVEhNKTsKICAgICBnb3RvIGZfZXJyOwogICB9CiAKICAgLyogVExTIGV4dGVuc2lvbnMgKi8KICAgaWYgKCFzc2xfcGFyc2Vfc2VydmVyaGVsbG9fdGxzZXh0KHMsICZzZXJ2ZXJfaGVsbG8pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9QQVJTRV9UTFNFWFQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfc2VydmVyX2hlbGxvLCBTU0xfUl9QQVJTRV9UTFNFWFQpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTg5Niw3ICs4OTEsNyBAQAogICBpZiAoQ0JTX2xlbigmc2VydmVyX2hlbGxvKSAhPSAwKSB7CiAgICAgLyogd3JvbmcgcGFja2V0IGxlbmd0aCAqLwogICAgIGFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0JBRF9QQUNLRVRfTEVOR1RIKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9oZWxsbywgU1NMX1JfQkFEX1BBQ0tFVF9MRU5HVEgpOwogICAgIGdvdG8gZl9lcnI7CiAgIH0KIApAQCAtOTA0LDkgKzg5OSwxMSBAQAogICAgICAgcy0+czMtPnRtcC5leHRlbmRlZF9tYXN0ZXJfc2VjcmV0ICE9IHMtPnNlc3Npb24tPmV4dGVuZGVkX21hc3Rlcl9zZWNyZXQpIHsKICAgICBhbCA9IFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKICAgICBpZiAocy0+c2Vzc2lvbi0+ZXh0ZW5kZWRfbWFzdGVyX3NlY3JldCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9SRVNVTUVEX0VNU19TRVNTSU9OX1dJVEhPVVRfRU1TX0VYVEVOU0lPTik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9oZWxsbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1JFU1VNRURfRU1TX1NFU1NJT05fV0lUSE9VVF9FTVNfRVhURU5TSU9OKTsKICAgICB9IGVsc2UgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9SRVNVTUVEX05PTl9FTVNfU0VTU0lPTl9XSVRIX0VNU19FWFRFTlNJT04pOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9zZXJ2ZXJfaGVsbG8sCisgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9SRVNVTUVEX05PTl9FTVNfU0VTU0lPTl9XSVRIX0VNU19FWFRFTlNJT04pOwogICAgIH0KICAgICBnb3RvIGZfZXJyOwogICB9CkBAIC05MTksNDkgKzkxNiwxMiBAQAogICByZXR1cm4gLTE7CiB9CiAKLS8qIHNzbDNfY2hlY2tfY2VydGlmaWNhdGVfZm9yX2NpcGhlciByZXR1cm5zIG9uZSBpZiB8bGVhZnwgaXMgYSBzdWl0YWJsZSBzZXJ2ZXIKLSAqIGNlcnRpZmljYXRlIHR5cGUgZm9yIHxjaXBoZXJ8LiBPdGhlcndpc2UsIGl0IHJldHVybnMgemVybyBhbmQgcHVzaGVzIGFuIGVycm9yCi0gKiBvbiB0aGUgZXJyb3IgcXVldWUuICovCi1zdGF0aWMgaW50IHNzbDNfY2hlY2tfY2VydGlmaWNhdGVfZm9yX2NpcGhlcihYNTA5ICpsZWFmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1NMX0NJUEhFUiAqY2lwaGVyKSB7Ci0gIGludCByZXQgPSAwOwotICBFVlBfUEtFWSAqcGtleSA9IFg1MDlfZ2V0X3B1YmtleShsZWFmKTsKLSAgaWYgKHBrZXkgPT0gTlVMTCkgewotICAgIGdvdG8gZXJyOwotICB9Ci0KLSAgLyogQ2hlY2sgdGhlIGNlcnRpZmljYXRlJ3MgdHlwZSBtYXRjaGVzIHRoZSBjaXBoZXIuICovCi0gIGludCBleHBlY3RlZF90eXBlID0gc3NsX2NpcGhlcl9nZXRfa2V5X3R5cGUoY2lwaGVyKTsKLSAgYXNzZXJ0KGV4cGVjdGVkX3R5cGUgIT0gRVZQX1BLRVlfTk9ORSk7Ci0gIGlmIChwa2V5LT50eXBlICE9IGV4cGVjdGVkX3R5cGUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1dST05HX0NFUlRJRklDQVRFX1RZUEUpOwotICAgIGdvdG8gZXJyOwotICB9Ci0KLSAgLyogVE9ETyhkYXZpZGJlbik6IFRoaXMgYmVoYXZpb3IgaXMgcHJlc2VydmVkIGZyb20gdXBzdHJlYW0uIFNob3VsZCBrZXkgdXNhZ2VzCi0gICAqIGJlIGNoZWNrZWQgaW4gb3RoZXIgY2FzZXMgYXMgd2VsbD8gKi8KLSAgaWYgKGNpcGhlci0+YWxnb3JpdGhtX2F1dGggJiBTU0xfYUVDRFNBKSB7Ci0gICAgLyogVGhpcyBjYWxsIHBvcHVsYXRlcyB0aGUgZXhfZmxhZ3MgZmllbGQgY29ycmVjdGx5ICovCi0gICAgWDUwOV9jaGVja19wdXJwb3NlKGxlYWYsIC0xLCAwKTsKLSAgICBpZiAoKGxlYWYtPmV4X2ZsYWdzICYgRVhGTEFHX0tVU0FHRSkgJiYKLSAgICAgICAgIShsZWFmLT5leF9rdXNhZ2UgJiBYNTA5djNfS1VfRElHSVRBTF9TSUdOQVRVUkUpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0VDQ19DRVJUX05PVF9GT1JfU0lHTklORyk7Ci0gICAgICBnb3RvIGVycjsKLSAgICB9Ci0gIH0KLQotICByZXQgPSAxOwotCi1lcnI6Ci0gIEVWUF9QS0VZX2ZyZWUocGtleSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KIGludCBzc2wzX2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUoU1NMICpzKSB7Ci0gIGludCBhbCwgb2ssIHJldCA9IC0xOworICBpbnQgYWwsIGksIG9rLCByZXQgPSAtMTsKICAgdW5zaWduZWQgbG9uZyBuOwogICBYNTA5ICp4ID0gTlVMTDsKICAgU1RBQ0tfT0YoWDUwOSkgKnNrID0gTlVMTDsKKyAgU0VTU19DRVJUICpzYzsKICAgRVZQX1BLRVkgKnBrZXkgPSBOVUxMOwogICBDQlMgY2JzLCBjZXJ0aWZpY2F0ZV9saXN0OwogICBjb25zdCB1aW50OF90ICpkYXRhOwpAQCAtOTc4LDE1ICs5MzgsMTQgQEAKIAogICBzayA9IHNrX1g1MDlfbmV3X251bGwoKTsKICAgaWYgKHNrID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKCFDQlNfZ2V0X3UyNF9sZW5ndGhfcHJlZml4ZWQoJmNicywgJmNlcnRpZmljYXRlX2xpc3QpIHx8Ci0gICAgICBDQlNfbGVuKCZjZXJ0aWZpY2F0ZV9saXN0KSA9PSAwIHx8CiAgICAgICBDQlNfbGVuKCZjYnMpICE9IDApIHsKICAgICBhbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9ERUNPREVfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfc2VydmVyX2NlcnRpZmljYXRlLCBTU0xfUl9MRU5HVEhfTUlTTUFUQ0gpOwogICAgIGdvdG8gZl9lcnI7CiAgIH0KIApAQCAtOTk0LDQ1ICs5NTMsOTIgQEAKICAgICBDQlMgY2VydGlmaWNhdGU7CiAgICAgaWYgKCFDQlNfZ2V0X3UyNF9sZW5ndGhfcHJlZml4ZWQoJmNlcnRpZmljYXRlX2xpc3QsICZjZXJ0aWZpY2F0ZSkpIHsKICAgICAgIGFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfQ0VSVF9MRU5HVEhfTUlTTUFUQ0gpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9DRVJUX0xFTkdUSF9NSVNNQVRDSCk7CiAgICAgICBnb3RvIGZfZXJyOwogICAgIH0KICAgICBkYXRhID0gQ0JTX2RhdGEoJmNlcnRpZmljYXRlKTsKICAgICB4ID0gZDJpX1g1MDkoTlVMTCwgJmRhdGEsIENCU19sZW4oJmNlcnRpZmljYXRlKSk7CiAgICAgaWYgKHggPT0gTlVMTCkgewogICAgICAgYWwgPSBTU0xfQURfQkFEX0NFUlRJRklDQVRFOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9BU04xX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSwgRVJSX1JfQVNOMV9MSUIpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAgICAgaWYgKGRhdGEgIT0gQ0JTX2RhdGEoJmNlcnRpZmljYXRlKSArIENCU19sZW4oJmNlcnRpZmljYXRlKSkgewogICAgICAgYWwgPSBTU0xfQURfREVDT0RFX0VSUk9SOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9DRVJUX0xFTkdUSF9NSVNNQVRDSCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX0NFUlRfTEVOR1RIX01JU01BVENIKTsKICAgICAgIGdvdG8gZl9lcnI7CiAgICAgfQogICAgIGlmICghc2tfWDUwOV9wdXNoKHNrLCB4KSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIHggPSBOVUxMOwogICB9CiAKLSAgWDUwOSAqbGVhZiA9IHNrX1g1MDlfdmFsdWUoc2ssIDApOwotICBpZiAoIXNzbDNfY2hlY2tfY2VydGlmaWNhdGVfZm9yX2NpcGhlcihsZWFmLCBzLT5zMy0+dG1wLm5ld19jaXBoZXIpKSB7Ci0gICAgYWwgPSBTU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CisgIGkgPSBzc2xfdmVyaWZ5X2NlcnRfY2hhaW4ocywgc2spOworICBpZiAocy0+dmVyaWZ5X21vZGUgIT0gU1NMX1ZFUklGWV9OT05FICYmIGkgPD0gMCkgeworICAgIGFsID0gc3NsX3ZlcmlmeV9hbGFybV90eXBlKHMtPnZlcmlmeV9yZXN1bHQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfc2VydmVyX2NlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX0NFUlRJRklDQVRFX1ZFUklGWV9GQUlMRUQpOworICAgIGdvdG8gZl9lcnI7CisgIH0KKyAgRVJSX2NsZWFyX2Vycm9yKCk7IC8qIGJ1dCB3ZSBrZWVwIHMtPnZlcmlmeV9yZXN1bHQgKi8KKworICBzYyA9IHNzbF9zZXNzX2NlcnRfbmV3KCk7CisgIGlmIChzYyA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBzc2xfc2Vzc19jZXJ0X2ZyZWUocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0KTsKKyAgcy0+c2Vzc2lvbi0+c2Vzc19jZXJ0ID0gc2M7CisKKyAgc2MtPmNlcnRfY2hhaW4gPSBzazsKKyAgLyogSW5jb25zaXN0ZW5jeSBhbGVydDogY2VydF9jaGFpbiBkb2VzIGluY2x1ZGUgdGhlIHBlZXIncyBjZXJ0aWZpY2F0ZSwgd2hpY2gKKyAgICogd2UgZG9uJ3QgaW5jbHVkZSBpbiBzM19zcnZyLmMgKi8KKyAgeCA9IHNrX1g1MDlfdmFsdWUoc2ssIDApOworICBzayA9IE5VTEw7CisgIC8qIFZSUyAxOTk5MDYyMTogcG9zc2libGUgbWVtb3J5IGxlYWs7IHNrPW51bGwgPT0+ICFza19wb3BfZnJlZSgpIEBlbmQqLworCisgIHBrZXkgPSBYNTA5X2dldF9wdWJrZXkoeCk7CisKKyAgaWYgKHBrZXkgPT0gTlVMTCB8fCBFVlBfUEtFWV9taXNzaW5nX3BhcmFtZXRlcnMocGtleSkpIHsKKyAgICB4ID0gTlVMTDsKKyAgICBhbCA9IFNTTDNfQUxfRkFUQUw7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfVU5BQkxFX1RPX0ZJTkRfUFVCTElDX0tFWV9QQVJBTUVURVJTKTsKICAgICBnb3RvIGZfZXJyOwogICB9CiAKLSAgLyogTk9URTogVW5saWtlIHRoZSBzZXJ2ZXIgaGFsZiwgdGhlIGNsaWVudCdzIGNvcHkgb2YgfGNlcnRfY2hhaW58IGluY2x1ZGVzCi0gICAqIHRoZSBsZWFmLiAqLwotICBza19YNTA5X3BvcF9mcmVlKHMtPnNlc3Npb24tPmNlcnRfY2hhaW4sIFg1MDlfZnJlZSk7Ci0gIHMtPnNlc3Npb24tPmNlcnRfY2hhaW4gPSBzazsKLSAgc2sgPSBOVUxMOworICBpID0gc3NsX2NlcnRfdHlwZShwa2V5KTsKKyAgaWYgKGkgPCAwKSB7CisgICAgeCA9IE5VTEw7CisgICAgYWwgPSBTU0wzX0FMX0ZBVEFMOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfc2VydmVyX2NlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1VOS05PV05fQ0VSVElGSUNBVEVfVFlQRSk7CisgICAgZ290byBmX2VycjsKKyAgfQorCisgIGludCBleHBfaWR4ID0gc3NsX2NpcGhlcl9nZXRfY2VydF9pbmRleChzLT5zMy0+dG1wLm5ld19jaXBoZXIpOworICBpZiAoZXhwX2lkeCA+PSAwICYmIGkgIT0gZXhwX2lkeCkgeworICAgIHggPSBOVUxMOworICAgIGFsID0gU1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfc2VydmVyX2NlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1dST05HX0NFUlRJRklDQVRFX1RZUEUpOworICAgIGdvdG8gZl9lcnI7CisgIH0KKyAgc2MtPnBlZXJfY2VydF90eXBlID0gaTsKKyAgWDUwOV9mcmVlKHNjLT5wZWVyX3BrZXlzW2ldLng1MDkpOworICBzYy0+cGVlcl9wa2V5c1tpXS54NTA5ID0gWDUwOV91cF9yZWYoeCk7CisgIHNjLT5wZWVyX2tleSA9ICYoc2MtPnBlZXJfcGtleXNbaV0pOwogCiAgIFg1MDlfZnJlZShzLT5zZXNzaW9uLT5wZWVyKTsKLSAgcy0+c2Vzc2lvbi0+cGVlciA9IFg1MDlfdXBfcmVmKGxlYWYpOworICBzLT5zZXNzaW9uLT5wZWVyID0gWDUwOV91cF9yZWYoeCk7CiAKICAgcy0+c2Vzc2lvbi0+dmVyaWZ5X3Jlc3VsdCA9IHMtPnZlcmlmeV9yZXN1bHQ7CiAKKyAgeCA9IE5VTEw7CiAgIHJldCA9IDE7CiAKICAgaWYgKDApIHsKQEAgLTEwNzEsMTQgKzEwNzcsMjUgQEAKIAogICBpZiAocy0+czMtPnRtcC5tZXNzYWdlX3R5cGUgIT0gU1NMM19NVF9TRVJWRVJfS0VZX0VYQ0hBTkdFKSB7CiAgICAgaWYgKHNzbF9jaXBoZXJfcmVxdWlyZXNfc2VydmVyX2tleV9leGNoYW5nZShzLT5zMy0+dG1wLm5ld19jaXBoZXIpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1VORVhQRUNURURfTUVTU0FHRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9VTkVYUEVDVEVEX01FU1NBR0UpOwogICAgICAgc3NsM19zZW5kX2FsZXJ0KHMsIFNTTDNfQUxfRkFUQUwsIFNTTF9BRF9VTkVYUEVDVEVEX01FU1NBR0UpOwogICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIC8qIEluIHBsYWluIFBTSyBjaXBoZXJzdWl0ZSwgU2VydmVyS2V5RXhjaGFuZ2UgbWF5IGJlIG9taXR0ZWQgdG8gc2VuZCBubwotICAgICAqIGlkZW50aXR5IGhpbnQuICovCisgICAgLyogSW4gcGxhaW4gUFNLIGNpcGhlcnN1aXRlLCBTZXJ2ZXJLZXlFeGNoYW5nZSBjYW4gYmUKKyAgICAgICBvbWl0dGVkIGlmIG5vIGlkZW50aXR5IGhpbnQgaXMgc2VudC4gU2V0IHNlc3Npb24tPnNlc3NfY2VydCBhbnl3YXkgdG8KKyAgICAgICBhdm9pZCBwcm9ibGVtcyBsYXRlci4qLwogICAgIGlmIChzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9hdXRoICYgU1NMX2FQU0spIHsKKyAgICAgIC8qIFBTSyBjaXBoZXJzdWl0ZXMgdGhhdCBhbHNvIHNlbmQgYSBDZXJ0aWZpY2F0ZSB3b3VsZCBoYXZlIGFscmVhZHkKKyAgICAgICAqIGluaXRpYWxpemVkIHxzZXNzX2NlcnR8LiAqLworICAgICAgaWYgKHMtPnNlc3Npb24tPnNlc3NfY2VydCA9PSBOVUxMKSB7CisgICAgICAgIHMtPnNlc3Npb24tPnNlc3NfY2VydCA9IHNzbF9zZXNzX2NlcnRfbmV3KCk7CisgICAgICAgIGlmIChzLT5zZXNzaW9uLT5zZXNzX2NlcnQgPT0gTlVMTCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgfQorCiAgICAgICAvKiBUT0RPKGRhdmlkYmVuKTogVGhpcyBzaG91bGQgYmUgcmVzZXQgaW4gb25lIHBsYWNlIHdpdGggdGhlIHJlc3Qgb2YgdGhlCiAgICAgICAgKiBoYW5kc2hha2Ugc3RhdGUuICovCiAgICAgICBPUEVOU1NMX2ZyZWUocy0+czMtPnRtcC5wZWVyX3Bza19pZGVudGl0eV9oaW50KTsKQEAgLTEwOTIsNiArMTEwOSwxOCBAQAogICBDQlNfaW5pdCgmc2VydmVyX2tleV9leGNoYW5nZSwgcy0+aW5pdF9tc2csIG4pOwogICBzZXJ2ZXJfa2V5X2V4Y2hhbmdlX29yaWcgPSBzZXJ2ZXJfa2V5X2V4Y2hhbmdlOwogCisgIGlmIChzLT5zZXNzaW9uLT5zZXNzX2NlcnQgIT0gTlVMTCkgeworICAgIERIX2ZyZWUocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX2RoX3RtcCk7CisgICAgcy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX2RoX3RtcCA9IE5VTEw7CisgICAgRUNfS0VZX2ZyZWUocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX2VjZGhfdG1wKTsKKyAgICBzLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfZWNkaF90bXAgPSBOVUxMOworICB9IGVsc2UgeworICAgIHMtPnNlc3Npb24tPnNlc3NfY2VydCA9IHNzbF9zZXNzX2NlcnRfbmV3KCk7CisgICAgaWYgKHMtPnNlc3Npb24tPnNlc3NfY2VydCA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKICAgYWxnX2sgPSBzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9ta2V5OwogICBhbGdfYSA9IHMtPnMzLT50bXAubmV3X2NpcGhlci0+YWxnb3JpdGhtX2F1dGg7CiAgIEVWUF9NRF9DVFhfaW5pdCgmbWRfY3R4KTsKQEAgLTExMDMsNyArMTEzMiw3IEBACiAgICAgaWYgKCFDQlNfZ2V0X3UxNl9sZW5ndGhfcHJlZml4ZWQoJnNlcnZlcl9rZXlfZXhjaGFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBza19pZGVudGl0eV9oaW50KSkgewogICAgICAgYWwgPSBTU0xfQURfREVDT0RFX0VSUk9SOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9ERUNPREVfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlLCBTU0xfUl9ERUNPREVfRVJST1IpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAKQEAgLTExMTcsMTQgKzExNDYsMTYgQEAKICAgICBpZiAoQ0JTX2xlbigmcHNrX2lkZW50aXR5X2hpbnQpID4gUFNLX01BWF9JREVOVElUWV9MRU4gfHwKICAgICAgICAgQ0JTX2NvbnRhaW5zX3plcm9fYnl0ZSgmcHNrX2lkZW50aXR5X2hpbnQpKSB7CiAgICAgICBhbCA9IFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfREFUQV9MRU5HVEhfVE9PX0xPTkcpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfREFUQV9MRU5HVEhfVE9PX0xPTkcpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAKICAgICAvKiBTYXZlIHRoZSBpZGVudGl0eSBoaW50IGFzIGEgQyBzdHJpbmcuICovCiAgICAgaWYgKCFDQlNfc3RyZHVwKCZwc2tfaWRlbnRpdHlfaGludCwgJnMtPnMzLT50bXAucGVlcl9wc2tfaWRlbnRpdHlfaGludCkpIHsKICAgICAgIGFsID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICBnb3RvIGZfZXJyOwogICAgIH0KICAgfQpAQCAtMTEzOSwxMyArMTE3MCwxMyBAQAogICAgICAgICAhQ0JTX2dldF91MTZfbGVuZ3RoX3ByZWZpeGVkKCZzZXJ2ZXJfa2V5X2V4Y2hhbmdlLCAmZGhfWXMpIHx8CiAgICAgICAgIENCU19sZW4oJmRoX1lzKSA9PSAwKSB7CiAgICAgICBhbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0RFQ09ERV9FUlJPUik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9rZXlfZXhjaGFuZ2UsIFNTTF9SX0RFQ09ERV9FUlJPUik7CiAgICAgICBnb3RvIGZfZXJyOwogICAgIH0KIAogICAgIGRoID0gREhfbmV3KCk7CiAgICAgaWYgKGRoID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfREhfTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfc2VydmVyX2tleV9leGNoYW5nZSwgRVJSX1JfREhfTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtMTE1MywxNyArMTE4NCwyMyBAQAogICAgICAgICAoZGgtPmcgPSBCTl9iaW4yYm4oQ0JTX2RhdGEoJmRoX2cpLCBDQlNfbGVuKCZkaF9nKSwgTlVMTCkpID09IE5VTEwgfHwKICAgICAgICAgKGRoLT5wdWJfa2V5ID0gQk5fYmluMmJuKENCU19kYXRhKCZkaF9ZcyksIENCU19sZW4oJmRoX1lzKSwgTlVMTCkpID09CiAgICAgICAgICAgICBOVUxMKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0JOX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9rZXlfZXhjaGFuZ2UsIEVSUl9SX0JOX0xJQik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKLSAgICBzLT5zZXNzaW9uLT5rZXlfZXhjaGFuZ2VfaW5mbyA9IERIX251bV9iaXRzKGRoKTsKLSAgICBpZiAocy0+c2Vzc2lvbi0+a2V5X2V4Y2hhbmdlX2luZm8gPCAxMDI0KSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0JBRF9ESF9QX0xFTkdUSCk7CisgICAgaWYgKERIX251bV9iaXRzKGRoKSA8IDEwMjQpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfc2VydmVyX2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX0JBRF9ESF9QX0xFTkdUSCk7CiAgICAgICBnb3RvIGVycjsKICAgICB9Ci0gICAgREhfZnJlZShzLT5zMy0+dG1wLnBlZXJfZGhfdG1wKTsKLSAgICBzLT5zMy0+dG1wLnBlZXJfZGhfdG1wID0gZGg7CisKKyAgICBpZiAoYWxnX2EgJiBTU0xfYVJTQSkgeworICAgICAgcGtleSA9IFg1MDlfZ2V0X3B1YmtleSgKKyAgICAgICAgICBzLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfcGtleXNbU1NMX1BLRVlfUlNBX0VOQ10ueDUwOSk7CisgICAgfQorICAgIC8qIGVsc2UgYW5vbnltb3VzIERILCBzbyBubyBjZXJ0aWZpY2F0ZSBvciBwa2V5LiAqLworCisgICAgcy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX2RoX3RtcCA9IGRoOwogICAgIGRoID0gTlVMTDsKICAgfSBlbHNlIGlmIChhbGdfayAmIFNTTF9rRUNESEUpIHsKICAgICB1aW50MTZfdCBjdXJ2ZV9pZDsKQEAgLTExNzYsMjEgKzEyMTMsMjIgQEAKICAgICAgKiBpbnZhbGlkIGN1cnZlLiAqLwogICAgIGlmICghdGxzMV9jaGVja19jdXJ2ZShzLCAmc2VydmVyX2tleV9leGNoYW5nZSwgJmN1cnZlX2lkKSkgewogICAgICAgYWwgPSBTU0xfQURfREVDT0RFX0VSUk9SOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9XUk9OR19DVVJWRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9rZXlfZXhjaGFuZ2UsIFNTTF9SX1dST05HX0NVUlZFKTsKICAgICAgIGdvdG8gZl9lcnI7CiAgICAgfQogCiAgICAgY3VydmVfbmlkID0gdGxzMV9lY19jdXJ2ZV9pZDJuaWQoY3VydmVfaWQpOwogICAgIGlmIChjdXJ2ZV9uaWQgPT0gMCkgewogICAgICAgYWwgPSBTU0xfQURfSU5URVJOQUxfRVJST1I7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1VOQUJMRV9UT19GSU5EX0VDREhfUEFSQU1FVEVSUyk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9VTkFCTEVfVE9fRklORF9FQ0RIX1BBUkFNRVRFUlMpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAKICAgICBlY2RoID0gRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lKGN1cnZlX25pZCk7Ci0gICAgcy0+c2Vzc2lvbi0+a2V5X2V4Y2hhbmdlX2luZm8gPSBjdXJ2ZV9pZDsKICAgICBpZiAoZWNkaCA9PSBOVUxMKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0VDX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9FQ19MSUIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogCkBAIC0xMTk5LDI1ICsxMjM3LDM3IEBACiAgICAgLyogTmV4dCwgZ2V0IHRoZSBlbmNvZGVkIEVDUG9pbnQgKi8KICAgICBpZiAoIUNCU19nZXRfdThfbGVuZ3RoX3ByZWZpeGVkKCZzZXJ2ZXJfa2V5X2V4Y2hhbmdlLCAmcG9pbnQpKSB7CiAgICAgICBhbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0RFQ09ERV9FUlJPUik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9rZXlfZXhjaGFuZ2UsIFNTTF9SX0RFQ09ERV9FUlJPUik7CiAgICAgICBnb3RvIGZfZXJyOwogICAgIH0KIAogICAgIGlmICgoKHNydnJfZWNwb2ludCA9IEVDX1BPSU5UX25ldyhncm91cCkpID09IE5VTEwpIHx8CiAgICAgICAgICgoYm5fY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKICAgICBpZiAoIUVDX1BPSU5UX29jdDJwb2ludChncm91cCwgc3J2cl9lY3BvaW50LCBDQlNfZGF0YSgmcG9pbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCU19sZW4oJnBvaW50KSwgYm5fY3R4KSkgewogICAgICAgYWwgPSBTU0xfQURfREVDT0RFX0VSUk9SOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CQURfRUNQT0lOVCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9rZXlfZXhjaGFuZ2UsIFNTTF9SX0JBRF9FQ1BPSU5UKTsKICAgICAgIGdvdG8gZl9lcnI7CiAgICAgfQorCisgICAgLyogVGhlIEVDQy9UTFMgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBtZW50aW9uIHRoZSB1c2Ugb2YgRFNBIHRvIHNpZ24KKyAgICAgKiBFQ1BhcmFtZXRlcnMgaW4gdGhlIHNlcnZlciBrZXkgZXhjaGFuZ2UgbWVzc2FnZS4gV2UgZG8gc3VwcG9ydCBSU0EgYW5kCisgICAgICogRUNEU0EuICovCisgICAgaWYgKGFsZ19hICYgU1NMX2FSU0EpIHsKKyAgICAgIHBrZXkgPSBYNTA5X2dldF9wdWJrZXkoCisgICAgICAgICAgcy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX3BrZXlzW1NTTF9QS0VZX1JTQV9FTkNdLng1MDkpOworICAgIH0gZWxzZSBpZiAoYWxnX2EgJiBTU0xfYUVDRFNBKSB7CisgICAgICBwa2V5ID0KKyAgICAgICAgICBYNTA5X2dldF9wdWJrZXkocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX3BrZXlzW1NTTF9QS0VZX0VDQ10ueDUwOSk7CisgICAgfQorICAgIC8qIGVsc2UgYW5vbnltb3VzIEVDREgsIHNvIG5vIGNlcnRpZmljYXRlIG9yIHBrZXkuICovCiAgICAgRUNfS0VZX3NldF9wdWJsaWNfa2V5KGVjZGgsIHNydnJfZWNwb2ludCk7Ci0gICAgRUNfS0VZX2ZyZWUocy0+czMtPnRtcC5wZWVyX2VjZGhfdG1wKTsKLSAgICBzLT5zMy0+dG1wLnBlZXJfZWNkaF90bXAgPSBlY2RoOworICAgIHMtPnNlc3Npb24tPnNlc3NfY2VydC0+cGVlcl9lY2RoX3RtcCA9IGVjZGg7CiAgICAgZWNkaCA9IE5VTEw7CiAgICAgQk5fQ1RYX2ZyZWUoYm5fY3R4KTsKICAgICBibl9jdHggPSBOVUxMOwpAQCAtMTIyNSw3ICsxMjc1LDggQEAKICAgICBzcnZyX2VjcG9pbnQgPSBOVUxMOwogICB9IGVsc2UgaWYgKCEoYWxnX2sgJiBTU0xfa1BTSykpIHsKICAgICBhbCA9IFNTTF9BRF9VTkVYUEVDVEVEX01FU1NBR0U7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9VTkVYUEVDVEVEX01FU1NBR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfc2VydmVyX2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9VTkVYUEVDVEVEX01FU1NBR0UpOwogICAgIGdvdG8gZl9lcnI7CiAgIH0KIApAQCAtMTIzNSwxMiArMTI4Niw5IEBACiAgIENCU19pbml0KCZwYXJhbWV0ZXIsIENCU19kYXRhKCZzZXJ2ZXJfa2V5X2V4Y2hhbmdlX29yaWcpLAogICAgICAgICAgICBDQlNfbGVuKCZzZXJ2ZXJfa2V5X2V4Y2hhbmdlX29yaWcpIC0gQ0JTX2xlbigmc2VydmVyX2tleV9leGNoYW5nZSkpOwogCi0gIC8qIFNlcnZlcktleUV4Y2hhbmdlIHNob3VsZCBiZSBzaWduZWQgYnkgdGhlIHNlcnZlcidzIHB1YmxpYyBrZXkuICovCi0gIGlmIChzc2xfY2lwaGVyX2hhc19zZXJ2ZXJfcHVibGljX2tleShzLT5zMy0+dG1wLm5ld19jaXBoZXIpKSB7Ci0gICAgcGtleSA9IFg1MDlfZ2V0X3B1YmtleShzLT5zZXNzaW9uLT5wZWVyKTsKLSAgICBpZiAocGtleSA9PSBOVUxMKSB7Ci0gICAgICBnb3RvIGVycjsKLSAgICB9CisgIC8qIGlmIGl0IHdhcyBzaWduZWQsIGNoZWNrIHRoZSBzaWduYXR1cmUgKi8KKyAgaWYgKHBrZXkgIT0gTlVMTCkgeworICAgIENCUyBzaWduYXR1cmU7CiAKICAgICBpZiAoU1NMX1VTRV9TSUdBTEdTKHMpKSB7CiAgICAgICBpZiAoIXRsczEyX2NoZWNrX3BlZXJfc2lnYWxnKCZtZCwgJmFsLCBzLCAmc2VydmVyX2tleV9leGNoYW5nZSwgcGtleSkpIHsKQEAgLTEyNTMsMTEgKzEzMDEsMTAgQEAKICAgICB9CiAKICAgICAvKiBUaGUgbGFzdCBmaWVsZCBpbiB8c2VydmVyX2tleV9leGNoYW5nZXwgaXMgdGhlIHNpZ25hdHVyZS4gKi8KLSAgICBDQlMgc2lnbmF0dXJlOwogICAgIGlmICghQ0JTX2dldF91MTZfbGVuZ3RoX3ByZWZpeGVkKCZzZXJ2ZXJfa2V5X2V4Y2hhbmdlLCAmc2lnbmF0dXJlKSB8fAogICAgICAgICBDQlNfbGVuKCZzZXJ2ZXJfa2V5X2V4Y2hhbmdlKSAhPSAwKSB7CiAgICAgICBhbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0RFQ09ERV9FUlJPUik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9rZXlfZXhjaGFuZ2UsIFNTTF9SX0RFQ09ERV9FUlJPUik7CiAgICAgICBnb3RvIGZfZXJyOwogICAgIH0KIApAQCAtMTI3MiwxNiArMTMxOSwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCU19sZW4oJnNpZ25hdHVyZSkpKSB7CiAgICAgICAvKiBiYWQgc2lnbmF0dXJlICovCiAgICAgICBhbCA9IFNTTF9BRF9ERUNSWVBUX0VSUk9SOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CQURfU0lHTkFUVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfc2VydmVyX2tleV9leGNoYW5nZSwgU1NMX1JfQkFEX1NJR05BVFVSRSk7CiAgICAgICBnb3RvIGZfZXJyOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICAvKiBQU0sgY2lwaGVycyBhcmUgdGhlIG9ubHkgc3VwcG9ydGVkIGNlcnRpZmljYXRlLWxlc3MgY2lwaGVycy4gKi8KLSAgICBhc3NlcnQoYWxnX2EgPT0gU1NMX2FQU0spOwotCisgICAgaWYgKHNzbF9jaXBoZXJfaGFzX3NlcnZlcl9wdWJsaWNfa2V5KHMtPnMzLT50bXAubmV3X2NpcGhlcikpIHsKKyAgICAgIC8qIE1pZ2h0IGJlIHdyb25nIGtleSB0eXBlLCBjaGVjayBpdCAqLworICAgICAgaWYgKHNzbDNfY2hlY2tfY2VydF9hbmRfYWxnb3JpdGhtKHMpKSB7CisgICAgICAgIC8qIE90aGVyd2lzZSB0aGlzIHNob3VsZG4ndCBoYXBwZW4gKi8KKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICB9CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgLyogc3RpbGwgZGF0YSBsZWZ0IG92ZXIgKi8KICAgICBpZiAoQ0JTX2xlbigmc2VydmVyX2tleV9leGNoYW5nZSkgPiAwKSB7CiAgICAgICBhbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0VYVFJBX0RBVEFfSU5fTUVTU0FHRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3NlcnZlcl9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9FWFRSQV9EQVRBX0lOX01FU1NBR0UpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAgIH0KQEAgLTEzMjgsMTUgKzEzODMsMTkgQEAKIAogICBpZiAocy0+czMtPnRtcC5tZXNzYWdlX3R5cGUgPT0gU1NMM19NVF9TRVJWRVJfRE9ORSkgewogICAgIHMtPnMzLT50bXAucmV1c2VfbWVzc2FnZSA9IDE7Ci0gICAgLyogSWYgd2UgZ2V0IGhlcmUgd2UgZG9uJ3QgbmVlZCB0aGUgaGFuZHNoYWtlIGJ1ZmZlciBhcyB3ZSB3b24ndCBiZSBkb2luZwotICAgICAqIGNsaWVudCBhdXRoLiAqLwotICAgIHNzbDNfZnJlZV9oYW5kc2hha2VfYnVmZmVyKHMpOworICAgIC8qIElmIHdlIGdldCBoZXJlIHdlIGRvbid0IG5lZWQgYW55IGNhY2hlZCBoYW5kc2hha2UgcmVjb3JkcyBhcyB3ZSB3b250IGJlCisgICAgICogZG9pbmcgY2xpZW50IGF1dGguICovCisgICAgaWYgKHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyICYmCisgICAgICAgICFzc2wzX2RpZ2VzdF9jYWNoZWRfcmVjb3JkcyhzLCBmcmVlX2hhbmRzaGFrZV9idWZmZXIpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CiAgICAgcmV0dXJuIDE7CiAgIH0KIAogICBpZiAocy0+czMtPnRtcC5tZXNzYWdlX3R5cGUgIT0gU1NMM19NVF9DRVJUSUZJQ0FURV9SRVFVRVNUKSB7CiAgICAgc3NsM19zZW5kX2FsZXJ0KHMsIFNTTDNfQUxfRkFUQUwsIFNTTF9BRF9VTkVYUEVDVEVEX01FU1NBR0UpOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfV1JPTkdfTUVTU0FHRV9UWVBFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NlcnRpZmljYXRlX3JlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfV1JPTkdfTUVTU0FHRV9UWVBFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0xMzQ0LDE0ICsxNDAzLDE0IEBACiAKICAgY2Ffc2sgPSBza19YNTA5X05BTUVfbmV3KGNhX2RuX2NtcCk7CiAgIGlmIChjYV9zayA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICAvKiBnZXQgdGhlIGNlcnRpZmljYXRlIHR5cGVzICovCiAgIGlmICghQ0JTX2dldF91OF9sZW5ndGhfcHJlZml4ZWQoJmNicywgJmNlcnRpZmljYXRlX3R5cGVzKSkgewogICAgIHNzbDNfc2VuZF9hbGVydChzLCBTU0wzX0FMX0ZBVEFMLCBTU0xfQURfREVDT0RFX0VSUk9SKTsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0RFQ09ERV9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0LCBTU0xfUl9ERUNPREVfRVJST1IpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTEzNjMsMTAgKzE0MjIsMTYgQEAKIAogICBpZiAoU1NMX1VTRV9TSUdBTEdTKHMpKSB7CiAgICAgQ0JTIHN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtczsKLSAgICBpZiAoIUNCU19nZXRfdTE2X2xlbmd0aF9wcmVmaXhlZCgmY2JzLCAmc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zKSB8fAotICAgICAgICAhdGxzMV9wYXJzZV9wZWVyX3NpZ2FsZ3MocywgJnN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtcykpIHsKKyAgICBpZiAoIUNCU19nZXRfdTE2X2xlbmd0aF9wcmVmaXhlZCgmY2JzLCAmc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zKSkgewogICAgICAgc3NsM19zZW5kX2FsZXJ0KHMsIFNTTDNfQUxfRkFUQUwsIFNTTF9BRF9ERUNPREVfRVJST1IpOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9ERUNPREVfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0LCBTU0xfUl9ERUNPREVfRVJST1IpOworICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgaWYgKCF0bHMxX3Byb2Nlc3Nfc2lnYWxncyhzLCAmc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zKSkgeworICAgICAgc3NsM19zZW5kX2FsZXJ0KHMsIFNTTDNfQUxfRkFUQUwsIFNTTF9BRF9ERUNPREVfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfU0lHTkFUVVJFX0FMR09SSVRITVNfRVJST1IpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9CkBAIC0xMzc0LDcgKzE0MzksNyBAQAogICAvKiBnZXQgdGhlIENBIFJETnMgKi8KICAgaWYgKCFDQlNfZ2V0X3UxNl9sZW5ndGhfcHJlZml4ZWQoJmNicywgJmNlcnRpZmljYXRlX2F1dGhvcml0aWVzKSkgewogICAgIHNzbDNfc2VuZF9hbGVydChzLCBTU0wzX0FMX0ZBVEFMLCBTU0xfQURfREVDT0RFX0VSUk9SKTsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0xFTkdUSF9NSVNNQVRDSCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0LCBTU0xfUl9MRU5HVEhfTUlTTUFUQ0gpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTEzODMsNyArMTQ0OCw4IEBACiAgICAgaWYgKCFDQlNfZ2V0X3UxNl9sZW5ndGhfcHJlZml4ZWQoJmNlcnRpZmljYXRlX2F1dGhvcml0aWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXN0aW5ndWlzaGVkX25hbWUpKSB7CiAgICAgICBzc2wzX3NlbmRfYWxlcnQocywgU1NMM19BTF9GQVRBTCwgU1NMX0FEX0RFQ09ERV9FUlJPUik7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0NBX0ROX1RPT19MT05HKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2VydGlmaWNhdGVfcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX0NBX0ROX1RPT19MT05HKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtMTM5MiwyNCArMTQ1OCwyNiBAQAogICAgIHhuID0gZDJpX1g1MDlfTkFNRShOVUxMLCAmZGF0YSwgQ0JTX2xlbigmZGlzdGluZ3Vpc2hlZF9uYW1lKSk7CiAgICAgaWYgKHhuID09IE5VTEwpIHsKICAgICAgIHNzbDNfc2VuZF9hbGVydChzLCBTU0wzX0FMX0ZBVEFMLCBTU0xfQURfREVDT0RFX0VSUk9SKTsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfQVNOMV9MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0LCBFUlJfUl9BU04xX0xJQik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKICAgICBpZiAoIUNCU19za2lwKCZkaXN0aW5ndWlzaGVkX25hbWUsIGRhdGEgLSBDQlNfZGF0YSgmZGlzdGluZ3Vpc2hlZF9uYW1lKSkpIHsKICAgICAgIHNzbDNfc2VuZF9hbGVydChzLCBTU0wzX0FMX0ZBVEFMLCBTU0xfQURfREVDT0RFX0VSUk9SKTsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKICAgICBpZiAoQ0JTX2xlbigmZGlzdGluZ3Vpc2hlZF9uYW1lKSAhPSAwKSB7CiAgICAgICBzc2wzX3NlbmRfYWxlcnQocywgU1NMM19BTF9GQVRBTCwgU1NMX0FEX0RFQ09ERV9FUlJPUik7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0NBX0ROX0xFTkdUSF9NSVNNQVRDSCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NlcnRpZmljYXRlX3JlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9DQV9ETl9MRU5HVEhfTUlTTUFUQ0gpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogCiAgICAgaWYgKCFza19YNTA5X05BTUVfcHVzaChjYV9zaywgeG4pKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2VydGlmaWNhdGVfcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfQpAQCAtMTQ0MCwyNyArMTUwOCw2IEBACiAgICAgcmV0dXJuIG47CiAgIH0KIAotICBpZiAocy0+aGl0KSB7Ci0gICAgLyogVGhlIHNlcnZlciBpcyBzZW5kaW5nIGEgbmV3IHRpY2tldCBmb3IgYW4gZXhpc3Rpbmcgc2Vzc2lvbi4gU2Vzc2lvbnMgYXJlCi0gICAgICogaW1tdXRhYmxlIG9uY2UgZXN0YWJsaXNoZWQsIHNvIGR1cGxpY2F0ZSBhbGwgYnV0IHRoZSB0aWNrZXQgb2YgdGhlCi0gICAgICogZXhpc3Rpbmcgc2Vzc2lvbi4gKi8KLSAgICB1aW50OF90ICpieXRlczsKLSAgICBzaXplX3QgYnl0ZXNfbGVuOwotICAgIGlmICghU1NMX1NFU1NJT05fdG9fYnl0ZXNfZm9yX3RpY2tldChzLT5zZXNzaW9uLCAmYnl0ZXMsICZieXRlc19sZW4pKSB7Ci0gICAgICBnb3RvIGVycjsKLSAgICB9Ci0gICAgU1NMX1NFU1NJT04gKm5ld19zZXNzaW9uID0gU1NMX1NFU1NJT05fZnJvbV9ieXRlcyhieXRlcywgYnl0ZXNfbGVuKTsKLSAgICBPUEVOU1NMX2ZyZWUoYnl0ZXMpOwotICAgIGlmIChuZXdfc2Vzc2lvbiA9PSBOVUxMKSB7Ci0gICAgICAvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICovCi0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKLSAgICAgIGdvdG8gZXJyOwotICAgIH0KLQotICAgIFNTTF9TRVNTSU9OX2ZyZWUocy0+c2Vzc2lvbik7Ci0gICAgcy0+c2Vzc2lvbiA9IG5ld19zZXNzaW9uOwotICB9Ci0KICAgQ0JTX2luaXQoJm5ld19zZXNzaW9uX3RpY2tldCwgcy0+aW5pdF9tc2csIG4pOwogCiAgIGlmICghQ0JTX2dldF91MzIoJm5ld19zZXNzaW9uX3RpY2tldCwKQEAgLTE0NjgsMTMgKzE1MTUsMTMgQEAKICAgICAgICFDQlNfZ2V0X3UxNl9sZW5ndGhfcHJlZml4ZWQoJm5ld19zZXNzaW9uX3RpY2tldCwgJnRpY2tldCkgfHwKICAgICAgIENCU19sZW4oJm5ld19zZXNzaW9uX3RpY2tldCkgIT0gMCkgewogICAgIGFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0RFQ09ERV9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9uZXdfc2Vzc2lvbl90aWNrZXQsIFNTTF9SX0RFQ09ERV9FUlJPUik7CiAgICAgZ290byBmX2VycjsKICAgfQogCiAgIGlmICghQ0JTX3N0b3coJnRpY2tldCwgJnMtPnNlc3Npb24tPnRsc2V4dF90aWNrLAogICAgICAgICAgICAgICAgICZzLT5zZXNzaW9uLT50bHNleHRfdGlja2xlbikpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X25ld19zZXNzaW9uX3RpY2tldCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTE1MjIsMTQgKzE1NjksMTQgQEAKICAgICAgIENCU19sZW4oJm9jc3BfcmVzcG9uc2UpID09IDAgfHwKICAgICAgIENCU19sZW4oJmNlcnRpZmljYXRlX3N0YXR1cykgIT0gMCkgewogICAgIGFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0RFQ09ERV9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jZXJ0X3N0YXR1cywgU1NMX1JfREVDT0RFX0VSUk9SKTsKICAgICBnb3RvIGZfZXJyOwogICB9CiAKICAgaWYgKCFDQlNfc3Rvdygmb2NzcF9yZXNwb25zZSwgJnMtPnNlc3Npb24tPm9jc3BfcmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgJnMtPnNlc3Npb24tPm9jc3BfcmVzcG9uc2VfbGVuZ3RoKSkgewogICAgIGFsID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2VydF9zdGF0dXMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGZfZXJyOwogICB9CiAgIHJldHVybiAxOwpAQCAtMTU1NSw3ICsxNjAyLDcgQEAKICAgaWYgKG4gPiAwKSB7CiAgICAgLyogc2hvdWxkIGNvbnRhaW4gbm8gZGF0YSAqLwogICAgIHNzbDNfc2VuZF9hbGVydChzLCBTU0wzX0FMX0ZBVEFMLCBTU0xfQURfREVDT0RFX0VSUk9SKTsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0xFTkdUSF9NSVNNQVRDSCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9zZXJ2ZXJfZG9uZSwgU1NMX1JfTEVOR1RIX01JU01BVENIKTsKICAgICByZXR1cm4gLTE7CiAgIH0KIApAQCAtMTU5Myw3ICsxNjQwLDggQEAKICAgICAgIHNpemVfdCBpZGVudGl0eV9sZW47CiAKICAgICAgIGlmIChzLT5wc2tfY2xpZW50X2NhbGxiYWNrID09IE5VTEwpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9QU0tfTk9fQ0xJRU5UX0NCKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2xpZW50X2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfUFNLX05PX0NMSUVOVF9DQik7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogCkBAIC0xNjAyLDI0ICsxNjUwLDI4IEBACiAgICAgICAgICAgcy0+cHNrX2NsaWVudF9jYWxsYmFjayhzLCBzLT5zMy0+dG1wLnBlZXJfcHNrX2lkZW50aXR5X2hpbnQsIGlkZW50aXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGlkZW50aXR5KSwgcHNrLCBzaXplb2YocHNrKSk7CiAgICAgICBpZiAocHNrX2xlbiA+IFBTS19NQVhfUFNLX0xFTikgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2xpZW50X2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0gZWxzZSBpZiAocHNrX2xlbiA9PSAwKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfUFNLX0lERU5USVRZX05PVF9GT1VORCk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX2NsaWVudF9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1BTS19JREVOVElUWV9OT1RfRk9VTkQpOwogICAgICAgICBzc2wzX3NlbmRfYWxlcnQocywgU1NMM19BTF9GQVRBTCwgU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAKICAgICAgIGlkZW50aXR5X2xlbiA9IE9QRU5TU0xfc3RybmxlbihpZGVudGl0eSwgc2l6ZW9mKGlkZW50aXR5KSk7CiAgICAgICBpZiAoaWRlbnRpdHlfbGVuID4gUFNLX01BWF9JREVOVElUWV9MRU4pIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX2NsaWVudF9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAKICAgICAgIE9QRU5TU0xfZnJlZShzLT5zZXNzaW9uLT5wc2tfaWRlbnRpdHkpOwogICAgICAgcy0+c2Vzc2lvbi0+cHNrX2lkZW50aXR5ID0gQlVGX3N0cmR1cChpZGVudGl0eSk7CiAgICAgICBpZiAocy0+c2Vzc2lvbi0+cHNrX2lkZW50aXR5ID09IE5VTEwpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX2NsaWVudF9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAKQEAgLTE2MzgsMjAgKzE2OTAsMjkgQEAKICAgICAgIHBtc19sZW4gPSBTU0xfTUFYX01BU1RFUl9LRVlfTEVOR1RIOwogICAgICAgcG1zID0gT1BFTlNTTF9tYWxsb2MocG1zX2xlbik7CiAgICAgICBpZiAocG1zID09IE5VTEwpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX2NsaWVudF9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAKLSAgICAgIHBrZXkgPSBYNTA5X2dldF9wdWJrZXkocy0+c2Vzc2lvbi0+cGVlcik7CisgICAgICBpZiAocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0ID09IE5VTEwpIHsKKyAgICAgICAgLyogV2Ugc2hvdWxkIGFsd2F5cyBoYXZlIGEgc2VydmVyIGNlcnRpZmljYXRlIHdpdGggU1NMX2tSU0EuICovCisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX2NsaWVudF9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisKKyAgICAgIHBrZXkgPSBYNTA5X2dldF9wdWJrZXkoCisgICAgICAgICAgcy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX3BrZXlzW1NTTF9QS0VZX1JTQV9FTkNdLng1MDkpOwogICAgICAgaWYgKHBrZXkgPT0gTlVMTCB8fAogICAgICAgICAgIHBrZXktPnR5cGUgIT0gRVZQX1BLRVlfUlNBIHx8CiAgICAgICAgICAgcGtleS0+cGtleS5yc2EgPT0gTlVMTCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2xpZW50X2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgICBFVlBfUEtFWV9mcmVlKHBrZXkpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KIAotICAgICAgcy0+c2Vzc2lvbi0+a2V5X2V4Y2hhbmdlX2luZm8gPSBFVlBfUEtFWV9iaXRzKHBrZXkpOwogICAgICAgcnNhID0gcGtleS0+cGtleS5yc2E7CiAgICAgICBFVlBfUEtFWV9mcmVlKHBrZXkpOwogCkBAIC0xNjcxLDcgKzE3MzIsOCBAQAogICAgICAgfQogICAgICAgaWYgKCFSU0FfZW5jcnlwdChyc2EsICZlbmNfcG1zX2xlbiwgcCwgUlNBX3NpemUocnNhKSwgcG1zLCBwbXNfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICBSU0FfUEtDUzFfUEFERElORykpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CQURfUlNBX0VOQ1JZUFQpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfc2VuZF9jbGllbnRfa2V5X2V4Y2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9CQURfUlNBX0VOQ1JZUFQpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KICAgICAgIG4gKz0gZW5jX3Btc19sZW47CkBAIC0xNjg4LDIzICsxNzUwLDMyIEBACiAgICAgICB9CiAgICAgfSBlbHNlIGlmIChhbGdfayAmIFNTTF9rREhFKSB7CiAgICAgICBESCAqZGhfc3J2ciwgKmRoX2NsbnQ7CisgICAgICBTRVNTX0NFUlQgKnNjZXJ0ID0gcy0+c2Vzc2lvbi0+c2Vzc19jZXJ0OwogICAgICAgaW50IGRoX2xlbjsKICAgICAgIHNpemVfdCBwdWJfbGVuOwogCi0gICAgICBpZiAocy0+czMtPnRtcC5wZWVyX2RoX3RtcCA9PSBOVUxMKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgaWYgKHNjZXJ0ID09IE5VTEwpIHsKKyAgICAgICAgc3NsM19zZW5kX2FsZXJ0KHMsIFNTTDNfQUxfRkFUQUwsIFNTTF9BRF9VTkVYUEVDVEVEX01FU1NBR0UpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfc2VuZF9jbGllbnRfa2V5X2V4Y2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9VTkVYUEVDVEVEX01FU1NBR0UpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KLSAgICAgIGRoX3NydnIgPSBzLT5zMy0+dG1wLnBlZXJfZGhfdG1wOworCisgICAgICBpZiAoc2NlcnQtPnBlZXJfZGhfdG1wID09IE5VTEwpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2xpZW50X2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIGRoX3NydnIgPSBzY2VydC0+cGVlcl9kaF90bXA7CiAKICAgICAgIC8qIGdlbmVyYXRlIGEgbmV3IHJhbmRvbSBrZXkgKi8KICAgICAgIGRoX2NsbnQgPSBESHBhcmFtc19kdXAoZGhfc3J2cik7CiAgICAgICBpZiAoZGhfY2xudCA9PSBOVUxMKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfREhfTElCKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2xpZW50X2tleV9leGNoYW5nZSwgRVJSX1JfREhfTElCKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAgICAgICBpZiAoIURIX2dlbmVyYXRlX2tleShkaF9jbG50KSkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0RIX0xJQik7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX2NsaWVudF9rZXlfZXhjaGFuZ2UsIEVSUl9SX0RIX0xJQik7CiAgICAgICAgIERIX2ZyZWUoZGhfY2xudCk7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQpAQCAtMTcxMiwxNCArMTc4MywxNSBAQAogICAgICAgcG1zX2xlbiA9IERIX3NpemUoZGhfY2xudCk7CiAgICAgICBwbXMgPSBPUEVOU1NMX21hbGxvYyhwbXNfbGVuKTsKICAgICAgIGlmIChwbXMgPT0gTlVMTCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2xpZW50X2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgICBESF9mcmVlKGRoX2NsbnQpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KIAogICAgICAgZGhfbGVuID0gREhfY29tcHV0ZV9rZXkocG1zLCBkaF9zcnZyLT5wdWJfa2V5LCBkaF9jbG50KTsKICAgICAgIGlmIChkaF9sZW4gPD0gMCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0RIX0xJQik7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX2NsaWVudF9rZXlfZXhjaGFuZ2UsIEVSUl9SX0RIX0xJQik7CiAgICAgICAgIERIX2ZyZWUoZGhfY2xudCk7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQpAQCAtMTczNyw1MyArMTgwOSw2NCBAQAogICAgICAgRUNfS0VZICp0a2V5OwogICAgICAgaW50IGZpZWxkX3NpemUgPSAwLCBlY2RoX2xlbjsKIAotICAgICAgaWYgKHMtPnMzLT50bXAucGVlcl9lY2RoX3RtcCA9PSBOVUxMKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgaWYgKHMtPnNlc3Npb24tPnNlc3NfY2VydCA9PSBOVUxMKSB7CisgICAgICAgIHNzbDNfc2VuZF9hbGVydChzLCBTU0wzX0FMX0ZBVEFMLCBTU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2xpZW50X2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfVU5FWFBFQ1RFRF9NRVNTQUdFKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAKLSAgICAgIHRrZXkgPSBzLT5zMy0+dG1wLnBlZXJfZWNkaF90bXA7CisgICAgICBpZiAocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX2VjZGhfdG1wID09IE5VTEwpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2xpZW50X2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKworICAgICAgdGtleSA9IHMtPnNlc3Npb24tPnNlc3NfY2VydC0+cGVlcl9lY2RoX3RtcDsKIAogICAgICAgc3J2cl9ncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKHRrZXkpOwogICAgICAgc3J2cl9lY3BvaW50ID0gRUNfS0VZX2dldDBfcHVibGljX2tleSh0a2V5KTsKICAgICAgIGlmIChzcnZyX2dyb3VwID09IE5VTEwgfHwgc3J2cl9lY3BvaW50ID09IE5VTEwpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX2NsaWVudF9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAKICAgICAgIGNsbnRfZWNkaCA9IEVDX0tFWV9uZXcoKTsKICAgICAgIGlmIChjbG50X2VjZGggPT0gTlVMTCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2xpZW50X2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KIAogICAgICAgaWYgKCFFQ19LRVlfc2V0X2dyb3VwKGNsbnRfZWNkaCwgc3J2cl9ncm91cCkpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9FQ19MSUIpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfc2VuZF9jbGllbnRfa2V5X2V4Y2hhbmdlLCBFUlJfUl9FQ19MSUIpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KIAogICAgICAgLyogR2VuZXJhdGUgYSBuZXcgRUNESCBrZXkgcGFpciAqLwogICAgICAgaWYgKCFFQ19LRVlfZ2VuZXJhdGVfa2V5KGNsbnRfZWNkaCkpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9FQ0RIX0xJQik7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX2NsaWVudF9rZXlfZXhjaGFuZ2UsIEVSUl9SX0VDREhfTElCKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAKICAgICAgIGZpZWxkX3NpemUgPSBFQ19HUk9VUF9nZXRfZGVncmVlKHNydnJfZ3JvdXApOwogICAgICAgaWYgKGZpZWxkX3NpemUgPD0gMCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0VDREhfTElCKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2xpZW50X2tleV9leGNoYW5nZSwgRVJSX1JfRUNESF9MSUIpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KIAogICAgICAgcG1zX2xlbiA9IChmaWVsZF9zaXplICsgNykgLyA4OwogICAgICAgcG1zID0gT1BFTlNTTF9tYWxsb2MocG1zX2xlbik7CiAgICAgICBpZiAocG1zID09IE5VTEwpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX2NsaWVudF9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAKICAgICAgIGVjZGhfbGVuID0gRUNESF9jb21wdXRlX2tleShwbXMsIHBtc19sZW4sIHNydnJfZWNwb2ludCwgY2xudF9lY2RoLCBOVUxMKTsKICAgICAgIGlmIChlY2RoX2xlbiA8PSAwKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfRUNESF9MSUIpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfc2VuZF9jbGllbnRfa2V5X2V4Y2hhbmdlLCBFUlJfUl9FQ0RIX0xJQik7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogICAgICAgcG1zX2xlbiA9IGVjZGhfbGVuOwpAQCAtMTc5Nyw3ICsxODgwLDggQEAKICAgICAgICAgICAodWludDhfdCAqKU9QRU5TU0xfbWFsbG9jKGVuY29kZWRfcHRfbGVuICogc2l6ZW9mKHVpbnQ4X3QpKTsKICAgICAgIGJuX2N0eCA9IEJOX0NUWF9uZXcoKTsKICAgICAgIGlmIChlbmNvZGVkUG9pbnQgPT0gTlVMTCB8fCBibl9jdHggPT0gTlVMTCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2xpZW50X2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KIApAQCAtMTgzMCwxMyArMTkxNCwxNSBAQAogICAgICAgcG1zX2xlbiA9IHBza19sZW47CiAgICAgICBwbXMgPSBPUEVOU1NMX21hbGxvYyhwbXNfbGVuKTsKICAgICAgIGlmIChwbXMgPT0gTlVMTCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2xpZW50X2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KICAgICAgIG1lbXNldChwbXMsIDAsIHBtc19sZW4pOwogICAgIH0gZWxzZSB7CiAgICAgICBzc2wzX3NlbmRfYWxlcnQocywgU1NMM19BTF9GQVRBTCwgU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFKTsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2xpZW50X2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtMTg0NywxNSArMTkzMywxOSBAQAogICAgICAgdWludDhfdCAqbmV3X3BtczsKICAgICAgIHNpemVfdCBuZXdfcG1zX2xlbjsKIAotICAgICAgQ0JCX3plcm8oJmNiYik7Ci0gICAgICBpZiAoIUNCQl9pbml0KCZjYmIsIDIgKyBwc2tfbGVuICsgMiArIHBtc19sZW4pIHx8Ci0gICAgICAgICAgIUNCQl9hZGRfdTE2X2xlbmd0aF9wcmVmaXhlZCgmY2JiLCAmY2hpbGQpIHx8CisgICAgICBpZiAoIUNCQl9pbml0KCZjYmIsIDIgKyBwc2tfbGVuICsgMiArIHBtc19sZW4pKSB7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX2NsaWVudF9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgICBpZiAoIUNCQl9hZGRfdTE2X2xlbmd0aF9wcmVmaXhlZCgmY2JiLCAmY2hpbGQpIHx8CiAgICAgICAgICAgIUNCQl9hZGRfYnl0ZXMoJmNoaWxkLCBwbXMsIHBtc19sZW4pIHx8CiAgICAgICAgICAgIUNCQl9hZGRfdTE2X2xlbmd0aF9wcmVmaXhlZCgmY2JiLCAmY2hpbGQpIHx8CiAgICAgICAgICAgIUNCQl9hZGRfYnl0ZXMoJmNoaWxkLCBwc2ssIHBza19sZW4pIHx8CiAgICAgICAgICAgIUNCQl9maW5pc2goJmNiYiwgJm5ld19wbXMsICZuZXdfcG1zX2xlbikpIHsKICAgICAgICAgQ0JCX2NsZWFudXAoJmNiYik7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfc2VuZF9jbGllbnRfa2V5X2V4Y2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogICAgICAgT1BFTlNTTF9jbGVhbnNlKHBtcywgcG1zX2xlbik7CkBAIC0xODk3LDg3ICsxOTg3LDg3IEBACiB9CiAKIGludCBzc2wzX3NlbmRfY2VydF92ZXJpZnkoU1NMICpzKSB7Ci0gIGlmIChzLT5zdGF0ZSA9PSBTU0wzX1NUX0NXX0NFUlRfVlJGWV9BIHx8Ci0gICAgICBzLT5zdGF0ZSA9PSBTU0wzX1NUX0NXX0NFUlRfVlJGWV9CKSB7Ci0gICAgZW51bSBzc2xfcHJpdmF0ZV9rZXlfcmVzdWx0X3Qgc2lnbl9yZXN1bHQ7Ci0gICAgdWludDhfdCAqcCA9IHNzbF9oYW5kc2hha2Vfc3RhcnQocyk7Ci0gICAgc2l6ZV90IHNpZ25hdHVyZV9sZW5ndGggPSAwOwotICAgIHVuc2lnbmVkIGxvbmcgbiA9IDA7Ci0gICAgYXNzZXJ0KHNzbF9oYXNfcHJpdmF0ZV9rZXkocykpOworICB1aW50OF90ICpidWYsICpwOworICBjb25zdCBFVlBfTUQgKm1kID0gTlVMTDsKKyAgdWludDhfdCBkaWdlc3RbRVZQX01BWF9NRF9TSVpFXTsKKyAgc2l6ZV90IGRpZ2VzdF9sZW5ndGg7CisgIEVWUF9QS0VZICpwa2V5OworICBFVlBfUEtFWV9DVFggKnBjdHggPSBOVUxMOworICBzaXplX3Qgc2lnbmF0dXJlX2xlbmd0aCA9IDA7CisgIHVuc2lnbmVkIGxvbmcgbiA9IDA7CiAKLSAgICBpZiAocy0+c3RhdGUgPT0gU1NMM19TVF9DV19DRVJUX1ZSRllfQSkgewotICAgICAgdWludDhfdCAqYnVmID0gKHVpbnQ4X3QgKilzLT5pbml0X2J1Zi0+ZGF0YTsKLSAgICAgIGNvbnN0IEVWUF9NRCAqbWQgPSBOVUxMOwotICAgICAgdWludDhfdCBkaWdlc3RbRVZQX01BWF9NRF9TSVpFXTsKLSAgICAgIHNpemVfdCBkaWdlc3RfbGVuZ3RoOworICBidWYgPSAodWludDhfdCAqKXMtPmluaXRfYnVmLT5kYXRhOwogCi0gICAgICAvKiBXcml0ZSBvdXQgdGhlIGRpZ2VzdCB0eXBlIGlmIG5lZWQgYmUuICovCi0gICAgICBpZiAoU1NMX1VTRV9TSUdBTEdTKHMpKSB7Ci0gICAgICAgIG1kID0gdGxzMV9jaG9vc2Vfc2lnbmluZ19kaWdlc3Qocyk7Ci0gICAgICAgIGlmICghdGxzMTJfZ2V0X3NpZ2FuZGhhc2gocywgcCwgbWQpKSB7Ci0gICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHAgKz0gMjsKLSAgICAgICAgbiArPSAyOworICBpZiAocy0+c3RhdGUgPT0gU1NMM19TVF9DV19DRVJUX1ZSRllfQSkgeworICAgIHAgPSBzc2xfaGFuZHNoYWtlX3N0YXJ0KHMpOworICAgIHBrZXkgPSBzLT5jZXJ0LT5rZXktPnByaXZhdGVrZXk7CisKKyAgICAvKiBXcml0ZSBvdXQgdGhlIGRpZ2VzdCB0eXBlIGlmIG5lZWRiZS4gKi8KKyAgICBpZiAoU1NMX1VTRV9TSUdBTEdTKHMpKSB7CisgICAgICBtZCA9IHRsczFfY2hvb3NlX3NpZ25pbmdfZGlnZXN0KHMsIHBrZXkpOworICAgICAgaWYgKCF0bHMxMl9nZXRfc2lnYW5kaGFzaChwLCBwa2V5LCBtZCkpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2VydF92ZXJpZnksIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgZ290byBlcnI7CiAgICAgICB9Ci0KLSAgICAgIC8qIENvbXB1dGUgdGhlIGRpZ2VzdC4gKi8KLSAgICAgIGNvbnN0IGludCBwa2V5X3R5cGUgPSBzc2xfcHJpdmF0ZV9rZXlfdHlwZShzKTsKLSAgICAgIGlmICghc3NsM19jZXJ0X3ZlcmlmeV9oYXNoKHMsIGRpZ2VzdCwgJmRpZ2VzdF9sZW5ndGgsICZtZCwgcGtleV90eXBlKSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFRoZSBoYW5kc2hha2UgYnVmZmVyIGlzIG5vIGxvbmdlciBuZWNlc3NhcnkuICovCi0gICAgICBzc2wzX2ZyZWVfaGFuZHNoYWtlX2J1ZmZlcihzKTsKLQotICAgICAgLyogU2lnbiB0aGUgZGlnZXN0LiAqLwotICAgICAgc2lnbmF0dXJlX2xlbmd0aCA9IHNzbF9wcml2YXRlX2tleV9tYXhfc2lnbmF0dXJlX2xlbihzKTsKLSAgICAgIGlmIChwICsgMiArIHNpZ25hdHVyZV9sZW5ndGggPiBidWYgKyBTU0wzX1JUX01BWF9QTEFJTl9MRU5HVEgpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9EQVRBX0xFTkdUSF9UT09fTE9ORyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLQotICAgICAgcy0+cndzdGF0ZSA9IFNTTF9QUklWQVRFX0tFWV9PUEVSQVRJT047Ci0gICAgICBzaWduX3Jlc3VsdCA9IHNzbF9wcml2YXRlX2tleV9zaWduKHMsICZwWzJdLCAmc2lnbmF0dXJlX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlX2xlbmd0aCwgbWQsIGRpZ2VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnZXN0X2xlbmd0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChTU0xfVVNFX1NJR0FMR1MocykpIHsKLSAgICAgICAgLyogVGhlIGRpZ2VzdCBoYXMgYWxyZWFkeSBiZWVuIHNlbGVjdGVkIGFuZCB3cml0dGVuLiAqLwotICAgICAgICBwICs9IDI7Ci0gICAgICAgIG4gKz0gMjsKLSAgICAgIH0KLSAgICAgIHNpZ25hdHVyZV9sZW5ndGggPSBzc2xfcHJpdmF0ZV9rZXlfbWF4X3NpZ25hdHVyZV9sZW4ocyk7Ci0gICAgICBzLT5yd3N0YXRlID0gU1NMX1BSSVZBVEVfS0VZX09QRVJBVElPTjsKLSAgICAgIHNpZ25fcmVzdWx0ID0gc3NsX3ByaXZhdGVfa2V5X3NpZ25fY29tcGxldGUocywgJnBbMl0sICZzaWduYXR1cmVfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVfbGVuZ3RoKTsKKyAgICAgIHAgKz0gMjsKKyAgICAgIG4gKz0gMjsKICAgICB9CiAKLSAgICBpZiAoc2lnbl9yZXN1bHQgPT0gc3NsX3ByaXZhdGVfa2V5X3JldHJ5KSB7Ci0gICAgICBzLT5zdGF0ZSA9IFNTTDNfU1RfQ1dfQ0VSVF9WUkZZX0I7Ci0gICAgICByZXR1cm4gLTE7CisgICAgLyogQ29tcHV0ZSB0aGUgZGlnZXN0LiAqLworICAgIGlmICghc3NsM19jZXJ0X3ZlcmlmeV9oYXNoKHMsIGRpZ2VzdCwgJmRpZ2VzdF9sZW5ndGgsICZtZCwgcGtleSkpIHsKKyAgICAgIGdvdG8gZXJyOwogICAgIH0KLSAgICBzLT5yd3N0YXRlID0gU1NMX05PVEhJTkc7Ci0gICAgaWYgKHNpZ25fcmVzdWx0ICE9IHNzbF9wcml2YXRlX2tleV9zdWNjZXNzKSB7Ci0gICAgICByZXR1cm4gLTE7CisKKyAgICAvKiBUaGUgaGFuZHNoYWtlIGJ1ZmZlciBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LiAqLworICAgIGlmIChzLT5zMy0+aGFuZHNoYWtlX2J1ZmZlciAmJgorICAgICAgICAhc3NsM19kaWdlc3RfY2FjaGVkX3JlY29yZHMocywgZnJlZV9oYW5kc2hha2VfYnVmZmVyKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgLyogU2lnbiB0aGUgZGlnZXN0LiAqLworICAgIHBjdHggPSBFVlBfUEtFWV9DVFhfbmV3KHBrZXksIE5VTEwpOworICAgIGlmIChwY3R4ID09IE5VTEwpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgdGhlIEVWUF9QS0VZX0NUWCBhbmQgZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBzaWduYXR1cmUuICovCisgICAgaWYgKCFFVlBfUEtFWV9zaWduX2luaXQocGN0eCkgfHwgIUVWUF9QS0VZX0NUWF9zZXRfc2lnbmF0dXJlX21kKHBjdHgsIG1kKSB8fAorICAgICAgICAhRVZQX1BLRVlfc2lnbihwY3R4LCBOVUxMLCAmc2lnbmF0dXJlX2xlbmd0aCwgZGlnZXN0LCBkaWdlc3RfbGVuZ3RoKSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2VydF92ZXJpZnksIEVSUl9SX0VWUF9MSUIpOworICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgaWYgKHAgKyAyICsgc2lnbmF0dXJlX2xlbmd0aCA+IGJ1ZiArIFNTTDNfUlRfTUFYX1BMQUlOX0xFTkdUSCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2VydF92ZXJpZnksIFNTTF9SX0RBVEFfTEVOR1RIX1RPT19MT05HKTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmICghRVZQX1BLRVlfc2lnbihwY3R4LCAmcFsyXSwgJnNpZ25hdHVyZV9sZW5ndGgsIGRpZ2VzdCwgZGlnZXN0X2xlbmd0aCkpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX2NlcnRfdmVyaWZ5LCBFUlJfUl9FVlBfTElCKTsKKyAgICAgIGdvdG8gZXJyOwogICAgIH0KIAogICAgIHMybihzaWduYXR1cmVfbGVuZ3RoLCBwKTsKICAgICBuICs9IHNpZ25hdHVyZV9sZW5ndGggKyAyOworCiAgICAgaWYgKCFzc2xfc2V0X2hhbmRzaGFrZV9oZWFkZXIocywgU1NMM19NVF9DRVJUSUZJQ0FURV9WRVJJRlksIG4pKSB7Ci0gICAgICByZXR1cm4gLTE7CisgICAgICBnb3RvIGVycjsKICAgICB9Ci0gICAgcy0+c3RhdGUgPSBTU0wzX1NUX0NXX0NFUlRfVlJGWV9DOworICAgIHMtPnN0YXRlID0gU1NMM19TVF9DV19DRVJUX1ZSRllfQjsKICAgfQogCisgIEVWUF9QS0VZX0NUWF9mcmVlKHBjdHgpOwogICByZXR1cm4gc3NsX2RvX3dyaXRlKHMpOworCitlcnI6CisgIEVWUF9QS0VZX0NUWF9mcmVlKHBjdHgpOworICByZXR1cm4gLTE7CiB9CiAKIC8qIHNzbDNfaGFzX2NsaWVudF9jZXJ0aWZpY2F0ZSByZXR1cm5zIHRydWUgaWYgYSBjbGllbnQgY2VydGlmaWNhdGUgaXMKICAqIGNvbmZpZ3VyZWQuICovCi1zdGF0aWMgaW50IHNzbDNfaGFzX2NsaWVudF9jZXJ0aWZpY2F0ZShTU0wgKnNzbCkgewotICByZXR1cm4gc3NsLT5jZXJ0ICYmIHNzbC0+Y2VydC0+eDUwOSAmJiBzc2xfaGFzX3ByaXZhdGVfa2V5KHNzbCk7CitzdGF0aWMgaW50IHNzbDNfaGFzX2NsaWVudF9jZXJ0aWZpY2F0ZShTU0wgKnMpIHsKKyAgcmV0dXJuIHMtPmNlcnQgJiYgcy0+Y2VydC0+a2V5LT54NTA5ICYmIHMtPmNlcnQtPmtleS0+cHJpdmF0ZWtleTsKIH0KIAogaW50IHNzbDNfc2VuZF9jbGllbnRfY2VydGlmaWNhdGUoU1NMICpzKSB7CkBAIC0yMDI1LDcgKzIxMTUsOCBAQAogICAgICAgfQogICAgIH0gZWxzZSBpZiAoaSA9PSAxKSB7CiAgICAgICBpID0gMDsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfQkFEX0RBVEFfUkVUVVJORURfQllfQ0FMTEJBQ0spOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2xpZW50X2NlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfQkFEX0RBVEFfUkVUVVJORURfQllfQ0FMTEJBQ0spOwogICAgIH0KIAogICAgIFg1MDlfZnJlZSh4NTA5KTsKQEAgLTIwNDIsNyArMjEzMywxMSBAQAogICAgICAgICBzLT5zMy0+dG1wLmNlcnRfcmVxID0gMjsKICAgICAgICAgLyogVGhlcmUgaXMgbm8gY2xpZW50IGNlcnRpZmljYXRlLCBzbyB0aGUgaGFuZHNoYWtlIGJ1ZmZlciBtYXkgYmUKICAgICAgICAgICogcmVsZWFzZWQuICovCi0gICAgICAgIHNzbDNfZnJlZV9oYW5kc2hha2VfYnVmZmVyKHMpOworICAgICAgICBpZiAocy0+czMtPmhhbmRzaGFrZV9idWZmZXIgJiYKKyAgICAgICAgICAgICFzc2wzX2RpZ2VzdF9jYWNoZWRfcmVjb3JkcyhzLCBmcmVlX2hhbmRzaGFrZV9idWZmZXIpKSB7CisgICAgICAgICAgc3NsM19zZW5kX2FsZXJ0KHMsIFNTTDNfQUxfRkFUQUwsIFNTTF9BRF9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQogCkBAIC0yMDUxLDIzICsyMTQ2LDg4IEBACiAgIH0KIAogICBpZiAocy0+c3RhdGUgPT0gU1NMM19TVF9DV19DRVJUX0MpIHsKLSAgICBpZiAocy0+czMtPnRtcC5jZXJ0X3JlcSA9PSAyKSB7Ci0gICAgICAvKiBTZW5kIGFuIGVtcHR5IENlcnRpZmljYXRlIG1lc3NhZ2UuICovCi0gICAgICB1aW50OF90ICpwID0gc3NsX2hhbmRzaGFrZV9zdGFydChzKTsKLSAgICAgIGwybjMoMCwgcCk7Ci0gICAgICBpZiAoIXNzbF9zZXRfaGFuZHNoYWtlX2hlYWRlcihzLCBTU0wzX01UX0NFUlRJRklDQVRFLCAzKSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICghc3NsM19vdXRwdXRfY2VydF9jaGFpbihzKSkgeworICAgIENFUlRfUEtFWSAqY2VydF9wa2V5ID0gKHMtPnMzLT50bXAuY2VydF9yZXEgPT0gMikgPyBOVUxMIDogcy0+Y2VydC0+a2V5OworICAgIGlmICghc3NsM19vdXRwdXRfY2VydF9jaGFpbihzLCBjZXJ0X3BrZXkpKSB7CiAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIHMtPnN0YXRlID0gU1NMM19TVF9DV19DRVJUX0Q7CiAgIH0KIAogICAvKiBTU0wzX1NUX0NXX0NFUlRfRCAqLwogICByZXR1cm4gc3NsX2RvX3dyaXRlKHMpOwogfQogCisjZGVmaW5lIGhhc19iaXRzKGksIG0pICgoKGkpICYgKG0pKSA9PSAobSkpCisKK2ludCBzc2wzX2NoZWNrX2NlcnRfYW5kX2FsZ29yaXRobShTU0wgKnMpIHsKKyAgaW50IGksIGlkeDsKKyAgbG9uZyBhbGdfaywgYWxnX2E7CisgIEVWUF9QS0VZICpwa2V5ID0gTlVMTDsKKyAgU0VTU19DRVJUICpzYzsKKyAgREggKmRoOworCisgIC8qIHdlIGRvbid0IGhhdmUgYSBjZXJ0aWZpY2F0ZSAqLworICBpZiAoIXNzbF9jaXBoZXJfaGFzX3NlcnZlcl9wdWJsaWNfa2V5KHMtPnMzLT50bXAubmV3X2NpcGhlcikpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGFsZ19rID0gcy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fbWtleTsKKyAgYWxnX2EgPSBzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9hdXRoOworCisgIHNjID0gcy0+c2Vzc2lvbi0+c2Vzc19jZXJ0OworICBpZiAoc2MgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19jaGVja19jZXJ0X2FuZF9hbGdvcml0aG0sIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGRoID0gcy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX2RoX3RtcDsKKworICAvKiBUaGlzIGlzIHRoZSBwYXNzZWQgY2VydGlmaWNhdGUgKi8KKworICBpZHggPSBzYy0+cGVlcl9jZXJ0X3R5cGU7CisgIGlmIChpZHggPT0gU1NMX1BLRVlfRUNDKSB7CisgICAgaWYgKHNzbF9jaGVja19zcnZyX2VjY19jZXJ0X2FuZF9hbGcoc2MtPnBlZXJfcGtleXNbaWR4XS54NTA5LCBzKSA9PSAwKSB7CisgICAgICAvKiBjaGVjayBmYWlsZWQgKi8KKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19jaGVja19jZXJ0X2FuZF9hbGdvcml0aG0sIFNTTF9SX0JBRF9FQ0NfQ0VSVCk7CisgICAgICBnb3RvIGZfZXJyOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0gZWxzZSBpZiAoYWxnX2EgJiBTU0xfYUVDRFNBKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2NoZWNrX2NlcnRfYW5kX2FsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9NSVNTSU5HX0VDRFNBX1NJR05JTkdfQ0VSVCk7CisgICAgZ290byBmX2VycjsKKyAgfQorICBwa2V5ID0gWDUwOV9nZXRfcHVia2V5KHNjLT5wZWVyX3BrZXlzW2lkeF0ueDUwOSk7CisgIGkgPSBYNTA5X2NlcnRpZmljYXRlX3R5cGUoc2MtPnBlZXJfcGtleXNbaWR4XS54NTA5LCBwa2V5KTsKKyAgRVZQX1BLRVlfZnJlZShwa2V5KTsKKworICAvKiBDaGVjayB0aGF0IHdlIGhhdmUgYSBjZXJ0aWZpY2F0ZSBpZiB3ZSByZXF1aXJlIG9uZSAqLworICBpZiAoKGFsZ19hICYgU1NMX2FSU0EpICYmICFoYXNfYml0cyhpLCBFVlBfUEtfUlNBIHwgRVZQX1BLVF9TSUdOKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19jaGVja19jZXJ0X2FuZF9hbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfTUlTU0lOR19SU0FfU0lHTklOR19DRVJUKTsKKyAgICBnb3RvIGZfZXJyOworICB9CisKKyAgaWYgKChhbGdfayAmIFNTTF9rUlNBKSAmJiAhaGFzX2JpdHMoaSwgRVZQX1BLX1JTQSB8IEVWUF9QS1RfRU5DKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19jaGVja19jZXJ0X2FuZF9hbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfTUlTU0lOR19SU0FfRU5DUllQVElOR19DRVJUKTsKKyAgICBnb3RvIGZfZXJyOworICB9CisKKyAgaWYgKChhbGdfayAmIFNTTF9rREhFKSAmJgorICAgICAgIShoYXNfYml0cyhpLCBFVlBfUEtfREggfCBFVlBfUEtUX0VYQ0gpIHx8IGRoICE9IE5VTEwpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2NoZWNrX2NlcnRfYW5kX2FsZ29yaXRobSwgU1NMX1JfTUlTU0lOR19ESF9LRVkpOworICAgIGdvdG8gZl9lcnI7CisgIH0KKworICByZXR1cm4gMTsKKworZl9lcnI6CisgIHNzbDNfc2VuZF9hbGVydChzLCBTU0wzX0FMX0ZBVEFMLCBTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkUpOworZXJyOgorICByZXR1cm4gMDsKK30KKwogaW50IHNzbDNfc2VuZF9uZXh0X3Byb3RvKFNTTCAqcykgewogICB1bnNpZ25lZCBpbnQgbGVuLCBwYWRkaW5nX2xlbjsKICAgdWludDhfdCAqZCwgKnA7CkBAIC0yMDk3LDYgKzIyNTcsNyBAQAogICB1aW50OF90ICpkOwogICBpbnQgcmV0ID0gLTEsIHB1YmxpY19rZXlfbGVuOwogICBFVlBfTURfQ1RYIG1kX2N0eDsKKyAgc2l6ZV90IHNpZ19sZW47CiAgIEVDRFNBX1NJRyAqc2lnID0gTlVMTDsKICAgdWludDhfdCAqcHVibGljX2tleSA9IE5VTEwsICpkZXJwLCAqZGVyX3NpZyA9IE5VTEw7CiAKQEAgLTIxMTgsNDggKzIyNzksNzIgQEAKICAgfQogICBzLT5yd3N0YXRlID0gU1NMX05PVEhJTkc7CiAKLSAgaWYgKEVWUF9QS0VZX2lkKHMtPnRsc2V4dF9jaGFubmVsX2lkX3ByaXZhdGUpICE9IEVWUF9QS0VZX0VDKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIEVDX0tFWSAqZWNfa2V5ID0gcy0+dGxzZXh0X2NoYW5uZWxfaWRfcHJpdmF0ZS0+cGtleS5lYzsKLQogICBkID0gc3NsX2hhbmRzaGFrZV9zdGFydChzKTsKLSAgczJuKFRMU0VYVF9UWVBFX2NoYW5uZWxfaWQsIGQpOworICBpZiAocy0+czMtPnRsc2V4dF9jaGFubmVsX2lkX25ldykgeworICAgIHMybihUTFNFWFRfVFlQRV9jaGFubmVsX2lkX25ldywgZCk7CisgIH0gZWxzZSB7CisgICAgczJuKFRMU0VYVF9UWVBFX2NoYW5uZWxfaWQsIGQpOworICB9CiAgIHMybihUTFNFWFRfQ0hBTk5FTF9JRF9TSVpFLCBkKTsKIAogICBFVlBfTURfQ1RYX2luaXQoJm1kX2N0eCk7CiAKLSAgcHVibGljX2tleV9sZW4gPSBpMm9fRUNQdWJsaWNLZXkoZWNfa2V5LCBOVUxMKTsKKyAgcHVibGljX2tleV9sZW4gPSBpMmRfUHVibGljS2V5KHMtPnRsc2V4dF9jaGFubmVsX2lkX3ByaXZhdGUsIE5VTEwpOwogICBpZiAocHVibGljX2tleV9sZW4gPD0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfQ0FOTk9UX1NFUklBTElaRV9QVUJMSUNfS0VZKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfc2VuZF9jaGFubmVsX2lkLAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX0NBTk5PVF9TRVJJQUxJWkVfUFVCTElDX0tFWSk7CiAgICAgZ290byBlcnI7CiAgIH0KIAotICAvKiBpMm9fRUNQdWJsaWNLZXkgd2lsbCBwcm9kdWNlIGFuIEFOU0kgWDkuNjIgcHVibGljIGtleSB3aGljaCwgZm9yIGEKKyAgLyogaTJkX1B1YmxpY0tleSB3aWxsIHByb2R1Y2UgYW4gQU5TSSBYOS42MiBwdWJsaWMga2V5IHdoaWNoLCBmb3IgYQogICAgKiBQLTI1NiBrZXksIGlzIDB4MDQgKG1lYW5pbmcgdW5jb21wcmVzc2VkKSBmb2xsb3dlZCBieSB0aGUgeCBhbmQgeQogICAgKiBmaWVsZCBlbGVtZW50cyBhcyAzMi1ieXRlLCBiaWctZW5kaWFuIG51bWJlcnMuICovCiAgIGlmIChwdWJsaWNfa2V5X2xlbiAhPSA2NSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfQ0hBTk5FTF9JRF9OT1RfUDI1Nik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2hhbm5lbF9pZCwgU1NMX1JfQ0hBTk5FTF9JRF9OT1RfUDI1Nik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgcHVibGljX2tleSA9IE9QRU5TU0xfbWFsbG9jKHB1YmxpY19rZXlfbGVuKTsKICAgaWYgKCFwdWJsaWNfa2V5KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2hhbm5lbF9pZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgZGVycCA9IHB1YmxpY19rZXk7Ci0gIGkyb19FQ1B1YmxpY0tleShlY19rZXksICZkZXJwKTsKKyAgaTJkX1B1YmxpY0tleShzLT50bHNleHRfY2hhbm5lbF9pZF9wcml2YXRlLCAmZGVycCk7CiAKLSAgdWludDhfdCBkaWdlc3RbRVZQX01BWF9NRF9TSVpFXTsKLSAgc2l6ZV90IGRpZ2VzdF9sZW47Ci0gIGlmICghdGxzMV9jaGFubmVsX2lkX2hhc2gocywgZGlnZXN0LCAmZGlnZXN0X2xlbikpIHsKKyAgaWYgKEVWUF9EaWdlc3RTaWduSW5pdCgmbWRfY3R4LCBOVUxMLCBFVlBfc2hhMjU2KCksIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dGxzZXh0X2NoYW5uZWxfaWRfcHJpdmF0ZSkgIT0gMSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX2NoYW5uZWxfaWQsCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfRVZQX0RJR0VTVFNJR05JTklUX0ZBSUxFRCk7CiAgICAgZ290byBlcnI7CiAgIH0KIAotICBzaWcgPSBFQ0RTQV9kb19zaWduKGRpZ2VzdCwgZGlnZXN0X2xlbiwgZWNfa2V5KTsKKyAgaWYgKCF0bHMxX2NoYW5uZWxfaWRfaGFzaCgmbWRfY3R4LCBzKSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKCFFVlBfRGlnZXN0U2lnbkZpbmFsKCZtZF9jdHgsIE5VTEwsICZzaWdfbGVuKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX2NoYW5uZWxfaWQsCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfRVZQX0RJR0VTVFNJR05GSU5BTF9GQUlMRUQpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgZGVyX3NpZyA9IE9QRU5TU0xfbWFsbG9jKHNpZ19sZW4pOworICBpZiAoIWRlcl9zaWcpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfc2VuZF9jaGFubmVsX2lkLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoIUVWUF9EaWdlc3RTaWduRmluYWwoJm1kX2N0eCwgZGVyX3NpZywgJnNpZ19sZW4pKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfY2hhbm5lbF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9FVlBfRElHRVNUU0lHTkZJTkFMX0ZBSUxFRCk7CisgICAgZ290byBlcnI7CisgIH0KKworICBkZXJwID0gZGVyX3NpZzsKKyAgc2lnID0gZDJpX0VDRFNBX1NJRyhOVUxMLCAoY29uc3QgdWludDhfdCAqKikmZGVycCwgc2lnX2xlbik7CiAgIGlmIChzaWcgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX2NoYW5uZWxfaWQsIFNTTF9SX0QySV9FQ0RTQV9TSUcpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTIxNjgsNyArMjM1Myw3IEBACiAgIGQgKz0gNjQ7CiAgIGlmICghQk5fYm4yYmluX3BhZGRlZChkLCAzMiwgc2lnLT5yKSB8fAogICAgICAgIUJOX2JuMmJpbl9wYWRkZWQoZCArIDMyLCAzMiwgc2lnLT5zKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX2NoYW5uZWxfaWQsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0yMTk2LDE3ICsyMzgxLDMgQEAKICAgfQogICByZXR1cm4gaTsKIH0KLQotaW50IHNzbDNfdmVyaWZ5X3NlcnZlcl9jZXJ0KFNTTCAqcykgewotICBpbnQgcmV0ID0gc3NsX3ZlcmlmeV9jZXJ0X2NoYWluKHMsIHMtPnNlc3Npb24tPmNlcnRfY2hhaW4pOwotICBpZiAocy0+dmVyaWZ5X21vZGUgIT0gU1NMX1ZFUklGWV9OT05FICYmIHJldCA8PSAwKSB7Ci0gICAgaW50IGFsID0gc3NsX3ZlcmlmeV9hbGFybV90eXBlKHMtPnZlcmlmeV9yZXN1bHQpOwotICAgIHNzbDNfc2VuZF9hbGVydChzLCBTU0wzX0FMX0ZBVEFMLCBhbCk7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9DRVJUSUZJQ0FURV9WRVJJRllfRkFJTEVEKTsKLSAgfSBlbHNlIHsKLSAgICByZXQgPSAxOwotICAgIEVSUl9jbGVhcl9lcnJvcigpOyAvKiBidXQgd2Uga2VlcCBzLT52ZXJpZnlfcmVzdWx0ICovCi0gIH0KLQotICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvc3JjL3NzbC9zM19lbmMuYyBiL3NyYy9zc2wvczNfZW5jLmMKaW5kZXggZjE5MjRjMC4uZmJlNjhkYSAxMDA2NDQKLS0tIGEvc3JjL3NzbC9zM19lbmMuYworKysgYi9zcmMvc3NsL3MzX2VuYy5jCkBAIC00LDIxICs0LDIxIEBACiAgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KICAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KICAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KLSAqCisgKmcKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcwogICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAogICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCiAgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCiAgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KLSAqCisgKmcKICAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCiAgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCiAgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCiAgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgogICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCiAgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqCisgKmcKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAgKiBhcmUgbWV0OgpAQCAtMzMsMTAgKzMzLDEwIEBACiAgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgogICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CiAgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KLSAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbWcKICAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CiAgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgotICoKKyAqZwogICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKICAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKQEAgLTQ4LDcgKzQ4LDcgQEAKICAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKICAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKICAqIFNVQ0ggREFNQUdFLgotICoKKyAqZwogICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKICAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQogICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQpAQCAtNjIsNyArNjIsNyBAQAogICogYXJlIG1ldDoKICAqCiAgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLmcKICAqCiAgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCkBAIC0xMzMsOCArMTMzLDYgQEAKICAqIE9USEVSIEVOVElUWSBCQVNFRCBPTiBJTkZSSU5HRU1FTlQgT0YgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUyBPUgogICogT1RIRVJXSVNFLiAqLwogCi0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KLQogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC0xODIsNyArMTgwLDcgQEAKICAgICBrKys7CiAgICAgaWYgKGsgPiBzaXplb2YoYnVmKSkgewogICAgICAgLyogYnVnOiAnYnVmJyBpcyB0b28gc21hbGwgZm9yIHRoaXMgY2lwaGVyc3VpdGUgKi8KLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3ByZiwgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0xOTEsNyArMTg5LDcgQEAKICAgICB9CiAgICAgYysrOwogICAgIGlmICghRVZQX0RpZ2VzdEluaXRfZXgoJnNoYTEsIEVWUF9zaGExKCksIE5VTEwpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9MSUJfRVZQKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19wcmYsIEVSUl9MSUJfRVZQKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBFVlBfRGlnZXN0VXBkYXRlKCZzaGExLCBidWYsIGspOwpAQCAtMjA2LDcgKzIwNCw3IEBACiAgICAgRVZQX0RpZ2VzdEZpbmFsX2V4KCZzaGExLCBzbWQsIE5VTEwpOwogCiAgICAgaWYgKCFFVlBfRGlnZXN0SW5pdF9leCgmbWQ1LCBFVlBfbWQ1KCksIE5VTEwpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9MSUJfRVZQKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19wcmYsIEVSUl9MSUJfRVZQKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBFVlBfRGlnZXN0VXBkYXRlKCZtZDUsIHNlY3JldCwgc2VjcmV0X2xlbik7CkBAIC0yMzcsNzUgKzIzNSw5NiBAQAogICBzLT5zMy0+dG1wLmtleV9ibG9ja19sZW5ndGggPSAwOwogfQogCi1pbnQgc3NsM19pbml0X2hhbmRzaGFrZV9idWZmZXIoU1NMICpzc2wpIHsKLSAgc3NsM19mcmVlX2hhbmRzaGFrZV9idWZmZXIoc3NsKTsKLSAgc3NsM19mcmVlX2hhbmRzaGFrZV9oYXNoKHNzbCk7Ci0gIHNzbC0+czMtPmhhbmRzaGFrZV9idWZmZXIgPSBCVUZfTUVNX25ldygpOwotICByZXR1cm4gc3NsLT5zMy0+aGFuZHNoYWtlX2J1ZmZlciAhPSBOVUxMOwotfQotCi0vKiBpbml0X2RpZ2VzdF93aXRoX2RhdGEgY2FsbHMgfEVWUF9EaWdlc3RJbml0X2V4fCBvbiB8Y3R4fCB3aXRoIHxtZHwgYW5kIHRoZW4KLSAqIHdyaXRlcyB0aGUgZGF0YSBpbiB8YnVmfCB0byBpdC4gKi8KLXN0YXRpYyBpbnQgaW5pdF9kaWdlc3Rfd2l0aF9kYXRhKEVWUF9NRF9DVFggKmN0eCwgY29uc3QgRVZQX01EICptZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJVRl9NRU0gKmJ1ZikgewotICBpZiAoIUVWUF9EaWdlc3RJbml0X2V4KGN0eCwgbWQsIE5VTEwpKSB7CitpbnQgc3NsM19pbml0X2ZpbmlzaGVkX21hYyhTU0wgKnMpIHsKKyAgQklPX2ZyZWUocy0+czMtPmhhbmRzaGFrZV9idWZmZXIpOworICBzc2wzX2ZyZWVfZGlnZXN0X2xpc3Qocyk7CisgIHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyID0gQklPX25ldyhCSU9fc19tZW0oKSk7CisgIGlmIChzLT5zMy0+aGFuZHNoYWtlX2J1ZmZlciA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KLSAgRVZQX0RpZ2VzdFVwZGF0ZShjdHgsIGJ1Zi0+ZGF0YSwgYnVmLT5sZW5ndGgpOwotICByZXR1cm4gMTsKLX0KLQotaW50IHNzbDNfaW5pdF9oYW5kc2hha2VfaGFzaChTU0wgKnNzbCkgewotICBzc2wzX2ZyZWVfaGFuZHNoYWtlX2hhc2goc3NsKTsKLQotICB1aW50MzJfdCBhbGdvcml0aG1fcHJmID0gc3NsX2dldF9hbGdvcml0aG1fcHJmKHNzbCk7Ci0gIGlmICghaW5pdF9kaWdlc3Rfd2l0aF9kYXRhKCZzc2wtPnMzLT5oYW5kc2hha2VfaGFzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX2dldF9oYW5kc2hha2VfZGlnZXN0KGFsZ29yaXRobV9wcmYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wtPnMzLT5oYW5kc2hha2VfYnVmZmVyKSkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaWYgKGFsZ29yaXRobV9wcmYgPT0gU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVCAmJgotICAgICAgIWluaXRfZGlnZXN0X3dpdGhfZGF0YSgmc3NsLT5zMy0+aGFuZHNoYWtlX21kNSwgRVZQX21kNSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wtPnMzLT5oYW5kc2hha2VfYnVmZmVyKSkgewotICAgIHJldHVybiAwOwotICB9CisgIEJJT19zZXRfY2xvc2Uocy0+czMtPmhhbmRzaGFrZV9idWZmZXIsIEJJT19DTE9TRSk7CiAKICAgcmV0dXJuIDE7CiB9CiAKLXZvaWQgc3NsM19mcmVlX2hhbmRzaGFrZV9oYXNoKFNTTCAqc3NsKSB7Ci0gIEVWUF9NRF9DVFhfY2xlYW51cCgmc3NsLT5zMy0+aGFuZHNoYWtlX2hhc2gpOwotICBFVlBfTURfQ1RYX2NsZWFudXAoJnNzbC0+czMtPmhhbmRzaGFrZV9tZDUpOwordm9pZCBzc2wzX2ZyZWVfZGlnZXN0X2xpc3QoU1NMICpzKSB7CisgIGludCBpOworICBpZiAoIXMtPnMzLT5oYW5kc2hha2VfZGdzdCkgeworICAgIHJldHVybjsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgU1NMX01BWF9ESUdFU1Q7IGkrKykgeworICAgIGlmIChzLT5zMy0+aGFuZHNoYWtlX2Rnc3RbaV0pIHsKKyAgICAgIEVWUF9NRF9DVFhfZGVzdHJveShzLT5zMy0+aGFuZHNoYWtlX2Rnc3RbaV0pOworICAgIH0KKyAgfQorICBPUEVOU1NMX2ZyZWUocy0+czMtPmhhbmRzaGFrZV9kZ3N0KTsKKyAgcy0+czMtPmhhbmRzaGFrZV9kZ3N0ID0gTlVMTDsKIH0KIAotdm9pZCBzc2wzX2ZyZWVfaGFuZHNoYWtlX2J1ZmZlcihTU0wgKnNzbCkgewotICBCVUZfTUVNX2ZyZWUoc3NsLT5zMy0+aGFuZHNoYWtlX2J1ZmZlcik7Ci0gIHNzbC0+czMtPmhhbmRzaGFrZV9idWZmZXIgPSBOVUxMOworaW50IHNzbDNfZmluaXNoX21hYyhTU0wgKnMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikgeworICBpbnQgaTsKKworICBpZiAocy0+czMtPmhhbmRzaGFrZV9idWZmZXIpIHsKKyAgICByZXR1cm4gQklPX3dyaXRlKHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyLCAodm9pZCAqKWJ1ZiwgbGVuKSA+PSAwOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IFNTTF9NQVhfRElHRVNUOyBpKyspIHsKKyAgICBpZiAocy0+czMtPmhhbmRzaGFrZV9kZ3N0W2ldICE9IE5VTEwpIHsKKyAgICAgIEVWUF9EaWdlc3RVcGRhdGUocy0+czMtPmhhbmRzaGFrZV9kZ3N0W2ldLCBidWYsIGxlbik7CisgICAgfQorICB9CisgIHJldHVybiAxOwogfQogCi1pbnQgc3NsM191cGRhdGVfaGFuZHNoYWtlX2hhc2goU1NMICpzc2wsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuKSB7Ci0gIC8qIERlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGhhbmRzaGFrZSwgZWl0aGVyIHRoZSBoYW5kc2hha2UgYnVmZmVyIG1heSBiZQotICAgKiBhY3RpdmUsIHRoZSByb2xsaW5nIGhhc2gsIG9yIGJvdGguICovCitpbnQgc3NsM19kaWdlc3RfY2FjaGVkX3JlY29yZHMoCisgICAgU1NMICpzLCBlbnVtIHNob3VsZF9mcmVlX2hhbmRzaGFrZV9idWZmZXJfdCBzaG91bGRfZnJlZV9oYW5kc2hha2VfYnVmZmVyKSB7CisgIGludCBpOworICB1aW50MzJfdCBtYXNrOworICBjb25zdCBFVlBfTUQgKm1kOworICBjb25zdCB1aW50OF90ICpoZGF0YTsKKyAgc2l6ZV90IGhkYXRhbGVuOwogCi0gIGlmIChzc2wtPnMzLT5oYW5kc2hha2VfYnVmZmVyICE9IE5VTEwpIHsKLSAgICBzaXplX3QgbmV3X2xlbiA9IHNzbC0+czMtPmhhbmRzaGFrZV9idWZmZXItPmxlbmd0aCArIGluX2xlbjsKLSAgICBpZiAobmV3X2xlbiA8IGluX2xlbikgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9PVkVSRkxPVyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKCFCVUZfTUVNX2dyb3coc3NsLT5zMy0+aGFuZHNoYWtlX2J1ZmZlciwgbmV3X2xlbikpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBtZW1jcHkoc3NsLT5zMy0+aGFuZHNoYWtlX2J1ZmZlci0+ZGF0YSArIG5ld19sZW4gLSBpbl9sZW4sIGluLCBpbl9sZW4pOworICAvKiBBbGxvY2F0ZSBoYW5kc2hha2VfZGdzdCBhcnJheSAqLworICBzc2wzX2ZyZWVfZGlnZXN0X2xpc3Qocyk7CisgIHMtPnMzLT5oYW5kc2hha2VfZGdzdCA9IE9QRU5TU0xfbWFsbG9jKFNTTF9NQVhfRElHRVNUICogc2l6ZW9mKEVWUF9NRF9DVFggKikpOworICBpZiAocy0+czMtPmhhbmRzaGFrZV9kZ3N0ID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZGlnZXN0X2NhY2hlZF9yZWNvcmRzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIDA7CiAgIH0KIAotICBpZiAoRVZQX01EX0NUWF9tZCgmc3NsLT5zMy0+aGFuZHNoYWtlX2hhc2gpICE9IE5VTEwpIHsKLSAgICBFVlBfRGlnZXN0VXBkYXRlKCZzc2wtPnMzLT5oYW5kc2hha2VfaGFzaCwgaW4sIGluX2xlbik7CisgIG1lbXNldChzLT5zMy0+aGFuZHNoYWtlX2Rnc3QsIDAsIFNTTF9NQVhfRElHRVNUICogc2l6ZW9mKEVWUF9NRF9DVFggKikpOworICBpZiAoIUJJT19tZW1fY29udGVudHMocy0+czMtPmhhbmRzaGFrZV9idWZmZXIsICZoZGF0YSwgJmhkYXRhbGVuKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19kaWdlc3RfY2FjaGVkX3JlY29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfQkFEX0hBTkRTSEFLRV9MRU5HVEgpOworICAgIHJldHVybiAwOwogICB9Ci0gIGlmIChFVlBfTURfQ1RYX21kKCZzc2wtPnMzLT5oYW5kc2hha2VfbWQ1KSAhPSBOVUxMKSB7Ci0gICAgRVZQX0RpZ2VzdFVwZGF0ZSgmc3NsLT5zMy0+aGFuZHNoYWtlX21kNSwgaW4sIGluX2xlbik7CisKKyAgLyogTG9vcCB0aHJvdWdoIGJpdHMgb2YgYWxnb3JpdGhtMiBmaWVsZCBhbmQgY3JlYXRlIE1EX0NUWC1lcyAqLworICBmb3IgKGkgPSAwOyBzc2xfZ2V0X2hhbmRzaGFrZV9kaWdlc3QoJm1hc2ssICZtZCwgaSk7IGkrKykgeworICAgIGlmICgobWFzayAmIHNzbF9nZXRfYWxnb3JpdGhtMihzKSkgJiYgbWQpIHsKKyAgICAgIHMtPnMzLT5oYW5kc2hha2VfZGdzdFtpXSA9IEVWUF9NRF9DVFhfY3JlYXRlKCk7CisgICAgICBpZiAocy0+czMtPmhhbmRzaGFrZV9kZ3N0W2ldID09IE5VTEwpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2RpZ2VzdF9jYWNoZWRfcmVjb3JkcywgRVJSX0xJQl9FVlApOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGlmICghRVZQX0RpZ2VzdEluaXRfZXgocy0+czMtPmhhbmRzaGFrZV9kZ3N0W2ldLCBtZCwgTlVMTCkpIHsKKyAgICAgICAgRVZQX01EX0NUWF9kZXN0cm95KHMtPnMzLT5oYW5kc2hha2VfZGdzdFtpXSk7CisgICAgICAgIHMtPnMzLT5oYW5kc2hha2VfZGdzdFtpXSA9IE5VTEw7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19kaWdlc3RfY2FjaGVkX3JlY29yZHMsIEVSUl9MSUJfRVZQKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBFVlBfRGlnZXN0VXBkYXRlKHMtPnMzLT5oYW5kc2hha2VfZGdzdFtpXSwgaGRhdGEsIGhkYXRhbGVuKTsKKyAgICB9IGVsc2UgeworICAgICAgcy0+czMtPmhhbmRzaGFrZV9kZ3N0W2ldID0gTlVMTDsKKyAgICB9CiAgIH0KKworICBpZiAoc2hvdWxkX2ZyZWVfaGFuZHNoYWtlX2J1ZmZlciA9PSBmcmVlX2hhbmRzaGFrZV9idWZmZXIpIHsKKyAgICAvKiBGcmVlIGhhbmRzaGFrZV9idWZmZXIgQklPICovCisgICAgQklPX2ZyZWUocy0+czMtPmhhbmRzaGFrZV9idWZmZXIpOworICAgIHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyID0gTlVMTDsKKyAgfQorCiAgIHJldHVybiAxOwogfQogCkBAIC0zMzcsMjIgKzM1NiwzMSBAQAogICBpbnQgbnBhZCwgbjsKICAgdW5zaWduZWQgaW50IGk7CiAgIHVpbnQ4X3QgbWRfYnVmW0VWUF9NQVhfTURfU0laRV07Ci0gIEVWUF9NRF9DVFggY3R4OwotICBjb25zdCBFVlBfTURfQ1RYICpjdHhfdGVtcGxhdGU7CisgIEVWUF9NRF9DVFggY3R4LCAqZCA9IE5VTEw7CiAKLSAgaWYgKG1kX25pZCA9PSBOSURfbWQ1KSB7Ci0gICAgY3R4X3RlbXBsYXRlID0gJnMtPnMzLT5oYW5kc2hha2VfbWQ1OwotICB9IGVsc2UgaWYgKG1kX25pZCA9PSBFVlBfTURfQ1RYX3R5cGUoJnMtPnMzLT5oYW5kc2hha2VfaGFzaCkpIHsKLSAgICBjdHhfdGVtcGxhdGUgPSAmcy0+czMtPmhhbmRzaGFrZV9oYXNoOwotICB9IGVsc2UgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfTk9fUkVRVUlSRURfRElHRVNUKTsKKyAgaWYgKHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyICYmCisgICAgICAhc3NsM19kaWdlc3RfY2FjaGVkX3JlY29yZHMocywgZnJlZV9oYW5kc2hha2VfYnVmZmVyKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLyogU2VhcmNoIGZvciBkaWdlc3Qgb2Ygc3BlY2lmaWVkIHR5cGUgaW4gdGhlIGhhbmRzaGFrZV9kZ3N0IGFycmF5LiAqLworICBmb3IgKGkgPSAwOyBpIDwgU1NMX01BWF9ESUdFU1Q7IGkrKykgeworICAgIGlmIChzLT5zMy0+aGFuZHNoYWtlX2Rnc3RbaV0gJiYKKyAgICAgICAgRVZQX01EX0NUWF90eXBlKHMtPnMzLT5oYW5kc2hha2VfZGdzdFtpXSkgPT0gbWRfbmlkKSB7CisgICAgICBkID0gcy0+czMtPmhhbmRzaGFrZV9kZ3N0W2ldOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKCFkKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2hhbmRzaGFrZV9tYWMsIFNTTF9SX05PX1JFUVVJUkVEX0RJR0VTVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBFVlBfTURfQ1RYX2luaXQoJmN0eCk7Ci0gIGlmICghRVZQX01EX0NUWF9jb3B5X2V4KCZjdHgsIGN0eF90ZW1wbGF0ZSkpIHsKKyAgaWYgKCFFVlBfTURfQ1RYX2NvcHlfZXgoJmN0eCwgZCkpIHsKICAgICBFVlBfTURfQ1RYX2NsZWFudXAoJmN0eCk7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfTElCX0VWUCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2hhbmRzaGFrZV9tYWMsIEVSUl9MSUJfRVZQKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0zNzEsNyArMzk5LDcgQEAKIAogICBpZiAoIUVWUF9EaWdlc3RJbml0X2V4KCZjdHgsIEVWUF9NRF9DVFhfbWQoJmN0eCksIE5VTEwpKSB7CiAgICAgRVZQX01EX0NUWF9jbGVhbnVwKCZjdHgpOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX0xJQl9FVlApOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19oYW5kc2hha2VfbWFjLCBFUlJfTElCX0VWUCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCBzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5LCBzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5X2xlbmd0aCk7CkBAIC0zOTIsNyArNDIwLDcgQEAKICAgICAgIHJldHVybiAxOwogICAgIH0KICAgfQotICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX09WRVJGTE9XKTsKKyAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3JlY29yZF9zZXF1ZW5jZV91cGRhdGUsIEVSUl9SX09WRVJGTE9XKTsKICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9zc2wvczNfbGliLmMgYi9zcmMvc3NsL3MzX2xpYi5jCmluZGV4IDYxN2VhNmUuLjFjMjhhNzMgMTAwNjQ0Ci0tLSBhL3NyYy9zc2wvczNfbGliLmMKKysrIGIvc3JjL3NzbC9zM19saWIuYwpAQCAtMTQ2LDE1ICsxNDYsMTIgQEAKICAqIE9USEVSIEVOVElUWSBCQVNFRCBPTiBJTkZSSU5HRU1FTlQgT0YgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUyBPUgogICogT1RIRVJXSVNFLiAqLwogCi0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KLQogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2RpZ2VzdC5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KICNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgpAQCAtMTg5LDggKzE4Niw3IEBACiAgIHMtPmluaXRfb2ZmID0gMDsKIAogICAvKiBBZGQgdGhlIG1lc3NhZ2UgdG8gdGhlIGhhbmRzaGFrZSBoYXNoLiAqLwotICByZXR1cm4gc3NsM191cGRhdGVfaGFuZHNoYWtlX2hhc2gocywgKHVpbnQ4X3QgKilzLT5pbml0X2J1Zi0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmluaXRfbnVtKTsKKyAgcmV0dXJuIHNzbDNfZmluaXNoX21hYyhzLCAodWludDhfdCAqKXMtPmluaXRfYnVmLT5kYXRhLCBzLT5pbml0X251bSk7CiB9CiAKIGludCBzc2wzX2hhbmRzaGFrZV93cml0ZShTU0wgKnMpIHsgcmV0dXJuIHNzbDNfZG9fd3JpdGUocywgU1NMM19SVF9IQU5EU0hBS0UpOyB9CkBAIC0yMDMsOSArMTk5LDcgQEAKICAgICBnb3RvIGVycjsKICAgfQogICBtZW1zZXQoczMsIDAsIHNpemVvZiAqczMpOwotCi0gIEVWUF9NRF9DVFhfaW5pdCgmczMtPmhhbmRzaGFrZV9oYXNoKTsKLSAgRVZQX01EX0NUWF9pbml0KCZzMy0+aGFuZHNoYWtlX21kNSk7CisgIG1lbXNldChzMy0+cnJlYy5zZXFfbnVtLCAwLCBzaXplb2YoczMtPnJyZWMuc2VxX251bSkpOwogCiAgIHMtPnMzID0gczM7CiAKQEAgLTIyNSwyMCArMjE5LDIwIEBACiAgICAgcmV0dXJuOwogICB9CiAKKyAgQlVGX01FTV9mcmVlKHMtPnMzLT5zbmlmZl9idWZmZXIpOwogICBzc2wzX2NsZWFudXBfa2V5X2Jsb2NrKHMpOwotICBzc2xfcmVhZF9idWZmZXJfY2xlYXIocyk7Ci0gIHNzbF93cml0ZV9idWZmZXJfY2xlYXIocyk7CisgIHNzbDNfcmVsZWFzZV9yZWFkX2J1ZmZlcihzKTsKKyAgc3NsM19yZWxlYXNlX3dyaXRlX2J1ZmZlcihzKTsKICAgREhfZnJlZShzLT5zMy0+dG1wLmRoKTsKICAgRUNfS0VZX2ZyZWUocy0+czMtPnRtcC5lY2RoKTsKIAogICBza19YNTA5X05BTUVfcG9wX2ZyZWUocy0+czMtPnRtcC5jYV9uYW1lcywgWDUwOV9OQU1FX2ZyZWUpOwogICBPUEVOU1NMX2ZyZWUocy0+czMtPnRtcC5jZXJ0aWZpY2F0ZV90eXBlcyk7CisgIE9QRU5TU0xfZnJlZShzLT5zMy0+dG1wLnBlZXJfZWNwb2ludGZvcm1hdGxpc3QpOwogICBPUEVOU1NMX2ZyZWUocy0+czMtPnRtcC5wZWVyX2VsbGlwdGljY3VydmVsaXN0KTsKICAgT1BFTlNTTF9mcmVlKHMtPnMzLT50bXAucGVlcl9wc2tfaWRlbnRpdHlfaGludCk7Ci0gIERIX2ZyZWUocy0+czMtPnRtcC5wZWVyX2RoX3RtcCk7Ci0gIEVDX0tFWV9mcmVlKHMtPnMzLT50bXAucGVlcl9lY2RoX3RtcCk7Ci0gIHNzbDNfZnJlZV9oYW5kc2hha2VfYnVmZmVyKHMpOwotICBzc2wzX2ZyZWVfaGFuZHNoYWtlX2hhc2gocyk7CisgIEJJT19mcmVlKHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyKTsKKyAgc3NsM19mcmVlX2RpZ2VzdF9saXN0KHMpOwogICBPUEVOU1NMX2ZyZWUocy0+czMtPmFscG5fc2VsZWN0ZWQpOwogCiAgIE9QRU5TU0xfY2xlYW5zZShzLT5zMywgc2l6ZW9mICpzLT5zMyk7CkBAIC0yNDYsNiArMjQwLDggQEAKICAgcy0+czMgPSBOVUxMOwogfQogCitzdGF0aWMgaW50IHNzbDNfc2V0X3JlcV9jZXJ0X3R5cGUoQ0VSVCAqYywgY29uc3QgdWludDhfdCAqcCwgc2l6ZV90IGxlbik7CisKIGludCBTU0xfc2Vzc2lvbl9yZXVzZWQoY29uc3QgU1NMICpzc2wpIHsKICAgcmV0dXJuIHNzbC0+aGl0OwogfQpAQCAtMjc4LDcgKzI3NCw3IEBACiAgIERIX2ZyZWUoY3R4LT5jZXJ0LT5kaF90bXApOwogICBjdHgtPmNlcnQtPmRoX3RtcCA9IERIcGFyYW1zX2R1cChkaCk7CiAgIGlmIChjdHgtPmNlcnQtPmRoX3RtcCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9ESF9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX0NUWF9zZXRfdG1wX2RoLCBFUlJfUl9ESF9MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAgIHJldHVybiAxOwpAQCAtMjg4LDcgKzI4NCw3IEBACiAgIERIX2ZyZWUoc3NsLT5jZXJ0LT5kaF90bXApOwogICBzc2wtPmNlcnQtPmRoX3RtcCA9IERIcGFyYW1zX2R1cChkaCk7CiAgIGlmIChzc2wtPmNlcnQtPmRoX3RtcCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9ESF9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX3NldF90bXBfZGgsIEVSUl9SX0RIX0xJQik7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0dXJuIDE7CkBAIC0yOTYsNyArMjkyLDcgQEAKIAogaW50IFNTTF9DVFhfc2V0X3RtcF9lY2RoKFNTTF9DVFggKmN0eCwgY29uc3QgRUNfS0VZICplY19rZXkpIHsKICAgaWYgKGVjX2tleSA9PSBOVUxMIHx8IEVDX0tFWV9nZXQwX2dyb3VwKGVjX2tleSkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9DVFhfc2V0X3RtcF9lY2RoLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOwogICAgIHJldHVybiAwOwogICB9CiAgIGN0eC0+Y2VydC0+ZWNkaF9uaWQgPSBFQ19HUk9VUF9nZXRfY3VydmVfbmFtZShFQ19LRVlfZ2V0MF9ncm91cChlY19rZXkpKTsKQEAgLTMwNSw3ICszMDEsNyBAQAogCiBpbnQgU1NMX3NldF90bXBfZWNkaChTU0wgKnNzbCwgY29uc3QgRUNfS0VZICplY19rZXkpIHsKICAgaWYgKGVjX2tleSA9PSBOVUxMIHx8IEVDX0tFWV9nZXQwX2dyb3VwKGVjX2tleSkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9zZXRfdG1wX2VjZGgsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgc3NsLT5jZXJ0LT5lY2RoX25pZCA9IEVDX0dST1VQX2dldF9jdXJ2ZV9uYW1lKEVDX0tFWV9nZXQwX2dyb3VwKGVjX2tleSkpOwpAQCAtMzI2LDcgKzMyMiw4IEBACiAgIGN0eC0+dGxzZXh0X2NoYW5uZWxfaWRfZW5hYmxlZCA9IDE7CiAgIGlmIChFVlBfUEtFWV9pZChwcml2YXRlX2tleSkgIT0gRVZQX1BLRVlfRUMgfHwKICAgICAgIEVWUF9QS0VZX2JpdHMocHJpdmF0ZV9rZXkpICE9IDI1NikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfQ0hBTk5FTF9JRF9OT1RfUDI1Nik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfQ1RYX3NldDFfdGxzX2NoYW5uZWxfaWQsCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfQ0hBTk5FTF9JRF9OT1RfUDI1Nik7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgRVZQX1BLRVlfZnJlZShjdHgtPnRsc2V4dF9jaGFubmVsX2lkX3ByaXZhdGUpOwpAQCAtMzM4LDcgKzMzNSw3IEBACiAgIHNzbC0+dGxzZXh0X2NoYW5uZWxfaWRfZW5hYmxlZCA9IDE7CiAgIGlmIChFVlBfUEtFWV9pZChwcml2YXRlX2tleSkgIT0gRVZQX1BLRVlfRUMgfHwKICAgICAgIEVWUF9QS0VZX2JpdHMocHJpdmF0ZV9rZXkpICE9IDI1NikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfQ0hBTk5FTF9JRF9OT1RfUDI1Nik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfc2V0MV90bHNfY2hhbm5lbF9pZCwgU1NMX1JfQ0hBTk5FTF9JRF9OT1RfUDI1Nik7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgRVZQX1BLRVlfZnJlZShzc2wtPnRsc2V4dF9jaGFubmVsX2lkX3ByaXZhdGUpOwpAQCAtMzYyLDM2ICszNTksMjM4IEBACiAgICAgcmV0dXJuIDE7CiAgIH0KICAgaWYgKHN0cmxlbihuYW1lKSA+IFRMU0VYVF9NQVhMRU5faG9zdF9uYW1lKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9TU0wzX0VYVF9JTlZBTElEX1NFUlZFUk5BTUUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX3NldF90bHNleHRfaG9zdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1NTTDNfRVhUX0lOVkFMSURfU0VSVkVSTkFNRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgc3NsLT50bHNleHRfaG9zdG5hbWUgPSBCVUZfc3RyZHVwKG5hbWUpOwogICBpZiAoc3NsLT50bHNleHRfaG9zdG5hbWUgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX3NldF90bHNleHRfaG9zdF9uYW1lLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0dXJuIDE7CiB9CiAKLXNpemVfdCBTU0xfZ2V0MF9jZXJ0aWZpY2F0ZV90eXBlcyhTU0wgKnNzbCwgY29uc3QgdWludDhfdCAqKm91dF90eXBlcykgewotICBpZiAoc3NsLT5zZXJ2ZXIgfHwgIXNzbC0+czMtPnRtcC5jZXJ0X3JlcSkgewotICAgICpvdXRfdHlwZXMgPSBOVUxMOwotICAgIHJldHVybiAwOworbG9uZyBzc2wzX2N0cmwoU1NMICpzLCBpbnQgY21kLCBsb25nIGxhcmcsIHZvaWQgKnBhcmcpIHsKKyAgaW50IHJldCA9IDA7CisKKyAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIFNTTF9DVFJMX0NIQUlOOgorICAgICAgaWYgKGxhcmcpIHsKKyAgICAgICAgcmV0dXJuIHNzbF9jZXJ0X3NldDFfY2hhaW4ocy0+Y2VydCwgKFNUQUNLX09GKFg1MDkpICopcGFyZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc3NsX2NlcnRfc2V0MF9jaGFpbihzLT5jZXJ0LCAoU1RBQ0tfT0YoWDUwOSkgKilwYXJnKTsKKyAgICAgIH0KKworICAgIGNhc2UgU1NMX0NUUkxfQ0hBSU5fQ0VSVDoKKyAgICAgIGlmIChsYXJnKSB7CisgICAgICAgIHJldHVybiBzc2xfY2VydF9hZGQxX2NoYWluX2NlcnQocy0+Y2VydCwgKFg1MDkgKilwYXJnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzc2xfY2VydF9hZGQwX2NoYWluX2NlcnQocy0+Y2VydCwgKFg1MDkgKilwYXJnKTsKKyAgICAgIH0KKworICAgIGNhc2UgU1NMX0NUUkxfR0VUX0NIQUlOX0NFUlRTOgorICAgICAgKihTVEFDS19PRihYNTA5KSAqKilwYXJnID0gcy0+Y2VydC0+a2V5LT5jaGFpbjsKKyAgICAgIHJldCA9IDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1NMX0NUUkxfU0VMRUNUX0NVUlJFTlRfQ0VSVDoKKyAgICAgIHJldHVybiBzc2xfY2VydF9zZWxlY3RfY3VycmVudChzLT5jZXJ0LCAoWDUwOSAqKXBhcmcpOworCisgICAgY2FzZSBTU0xfQ1RSTF9HRVRfQ1VSVkVTOiB7CisgICAgICBjb25zdCB1aW50MTZfdCAqY2xpc3QgPSBzLT5zMy0+dG1wLnBlZXJfZWxsaXB0aWNjdXJ2ZWxpc3Q7CisgICAgICBzaXplX3QgY2xpc3RsZW4gPSBzLT5zMy0+dG1wLnBlZXJfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoOworICAgICAgaWYgKHBhcmcpIHsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIGludCAqY3B0ciA9IHBhcmc7CisgICAgICAgIGludCBuaWQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbGlzdGxlbjsgaSsrKSB7CisgICAgICAgICAgbmlkID0gdGxzMV9lY19jdXJ2ZV9pZDJuaWQoY2xpc3RbaV0pOworICAgICAgICAgIGlmIChuaWQgIT0gTklEX3VuZGVmKSB7CisgICAgICAgICAgICBjcHRyW2ldID0gbmlkOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjcHRyW2ldID0gVExTRVhUX25pZF91bmtub3duIHwgY2xpc3RbaV07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gKGludCljbGlzdGxlbjsKKyAgICB9CisKKyAgICBjYXNlIFNTTF9DVFJMX1NFVF9DVVJWRVM6CisgICAgICByZXR1cm4gdGxzMV9zZXRfY3VydmVzKCZzLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoLCBwYXJnLCBsYXJnKTsKKworICAgIGNhc2UgU1NMX0NUUkxfU0VUX1NJR0FMR1M6CisgICAgICByZXR1cm4gdGxzMV9zZXRfc2lnYWxncyhzLT5jZXJ0LCBwYXJnLCBsYXJnLCAwKTsKKworICAgIGNhc2UgU1NMX0NUUkxfU0VUX0NMSUVOVF9TSUdBTEdTOgorICAgICAgcmV0dXJuIHRsczFfc2V0X3NpZ2FsZ3Mocy0+Y2VydCwgcGFyZywgbGFyZywgMSk7CisKKyAgICBjYXNlIFNTTF9DVFJMX0dFVF9DTElFTlRfQ0VSVF9UWVBFUzogeworICAgICAgY29uc3QgdWludDhfdCAqKnBjdHlwZSA9IHBhcmc7CisgICAgICBpZiAocy0+c2VydmVyIHx8ICFzLT5zMy0+dG1wLmNlcnRfcmVxKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgaWYgKHBjdHlwZSkgeworICAgICAgICAqcGN0eXBlID0gcy0+czMtPnRtcC5jZXJ0aWZpY2F0ZV90eXBlczsKKyAgICAgIH0KKyAgICAgIHJldHVybiAoaW50KXMtPnMzLT50bXAubnVtX2NlcnRpZmljYXRlX3R5cGVzOworICAgIH0KKworICAgIGNhc2UgU1NMX0NUUkxfU0VUX0NMSUVOVF9DRVJUX1RZUEVTOgorICAgICAgaWYgKCFzLT5zZXJ2ZXIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICByZXR1cm4gc3NsM19zZXRfcmVxX2NlcnRfdHlwZShzLT5jZXJ0LCBwYXJnLCBsYXJnKTsKKworICAgIGNhc2UgU1NMX0NUUkxfQlVJTERfQ0VSVF9DSEFJTjoKKyAgICAgIHJldHVybiBzc2xfYnVpbGRfY2VydF9jaGFpbihzLT5jZXJ0LCBzLT5jdHgtPmNlcnRfc3RvcmUsIGxhcmcpOworCisgICAgY2FzZSBTU0xfQ1RSTF9TRVRfVkVSSUZZX0NFUlRfU1RPUkU6CisgICAgICByZXR1cm4gc3NsX2NlcnRfc2V0X2NlcnRfc3RvcmUocy0+Y2VydCwgcGFyZywgMCwgbGFyZyk7CisKKyAgICBjYXNlIFNTTF9DVFJMX1NFVF9DSEFJTl9DRVJUX1NUT1JFOgorICAgICAgcmV0dXJuIHNzbF9jZXJ0X3NldF9jZXJ0X3N0b3JlKHMtPmNlcnQsIHBhcmcsIDEsIGxhcmcpOworCisgICAgY2FzZSBTU0xfQ1RSTF9HRVRfU0VSVkVSX1RNUF9LRVk6CisgICAgICBpZiAocy0+c2VydmVyIHx8ICFzLT5zZXNzaW9uIHx8ICFzLT5zZXNzaW9uLT5zZXNzX2NlcnQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBTRVNTX0NFUlQgKnNjOworICAgICAgICBFVlBfUEtFWSAqcHRtcDsKKyAgICAgICAgaW50IHJ2ID0gMDsKKyAgICAgICAgc2MgPSBzLT5zZXNzaW9uLT5zZXNzX2NlcnQ7CisgICAgICAgIGlmICghc2MtPnBlZXJfZGhfdG1wICYmICFzYy0+cGVlcl9lY2RoX3RtcCkgeworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHB0bXAgPSBFVlBfUEtFWV9uZXcoKTsKKyAgICAgICAgaWYgKCFwdG1wKSB7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNjLT5wZWVyX2RoX3RtcCkgeworICAgICAgICAgIHJ2ID0gRVZQX1BLRVlfc2V0MV9ESChwdG1wLCBzYy0+cGVlcl9kaF90bXApOworICAgICAgICB9IGVsc2UgaWYgKHNjLT5wZWVyX2VjZGhfdG1wKSB7CisgICAgICAgICAgcnYgPSBFVlBfUEtFWV9zZXQxX0VDX0tFWShwdG1wLCBzYy0+cGVlcl9lY2RoX3RtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ2KSB7CisgICAgICAgICAgKihFVlBfUEtFWSAqKilwYXJnID0gcHRtcDsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBFVlBfUEtFWV9mcmVlKHB0bXApOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgIGNhc2UgU1NMX0NUUkxfR0VUX0VDX1BPSU5UX0ZPUk1BVFM6IHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgKipwZm9ybWF0ID0gcGFyZzsKKyAgICAgIGlmICghcy0+czMtPnRtcC5wZWVyX2VjcG9pbnRmb3JtYXRsaXN0KSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgKnBmb3JtYXQgPSBzLT5zMy0+dG1wLnBlZXJfZWNwb2ludGZvcm1hdGxpc3Q7CisgICAgICByZXR1cm4gKGludClzLT5zMy0+dG1wLnBlZXJfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKICAgfQotICAqb3V0X3R5cGVzID0gc3NsLT5zMy0+dG1wLmNlcnRpZmljYXRlX3R5cGVzOwotICByZXR1cm4gc3NsLT5zMy0+dG1wLm51bV9jZXJ0aWZpY2F0ZV90eXBlczsKKworICByZXR1cm4gcmV0OwogfQogCi1pbnQgU1NMX0NUWF9zZXQxX2N1cnZlcyhTU0xfQ1RYICpjdHgsIGNvbnN0IGludCAqY3VydmVzLCBzaXplX3QgY3VydmVzX2xlbikgewotICByZXR1cm4gdGxzMV9zZXRfY3VydmVzKCZjdHgtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoLCBjdXJ2ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVzX2xlbik7Ci19Citsb25nIHNzbDNfY3R4X2N0cmwoU1NMX0NUWCAqY3R4LCBpbnQgY21kLCBsb25nIGxhcmcsIHZvaWQgKnBhcmcpIHsKKyAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIFNTTF9DVFJMX1NFVF9UTFNFWFRfVElDS0VUX0tFWVM6CisgICAgY2FzZSBTU0xfQ1RSTF9HRVRfVExTRVhUX1RJQ0tFVF9LRVlTOiB7CisgICAgICB1aW50OF90ICprZXlzID0gcGFyZzsKKyAgICAgIGlmICgha2V5cykgeworICAgICAgICByZXR1cm4gNDg7CisgICAgICB9CisgICAgICBpZiAobGFyZyAhPSA0OCkgeworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfY3R4X2N0cmwsIFNTTF9SX0lOVkFMSURfVElDS0VUX0tFWVNfTEVOR1RIKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBpZiAoY21kID09IFNTTF9DVFJMX1NFVF9UTFNFWFRfVElDS0VUX0tFWVMpIHsKKyAgICAgICAgbWVtY3B5KGN0eC0+dGxzZXh0X3RpY2tfa2V5X25hbWUsIGtleXMsIDE2KTsKKyAgICAgICAgbWVtY3B5KGN0eC0+dGxzZXh0X3RpY2tfaG1hY19rZXksIGtleXMgKyAxNiwgMTYpOworICAgICAgICBtZW1jcHkoY3R4LT50bHNleHRfdGlja19hZXNfa2V5LCBrZXlzICsgMzIsIDE2KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShrZXlzLCBjdHgtPnRsc2V4dF90aWNrX2tleV9uYW1lLCAxNik7CisgICAgICAgIG1lbWNweShrZXlzICsgMTYsIGN0eC0+dGxzZXh0X3RpY2tfaG1hY19rZXksIDE2KTsKKyAgICAgICAgbWVtY3B5KGtleXMgKyAzMiwgY3R4LT50bHNleHRfdGlja19hZXNfa2V5LCAxNik7CisgICAgICB9CisgICAgICByZXR1cm4gMTsKKyAgICB9CiAKLWludCBTU0xfc2V0MV9jdXJ2ZXMoU1NMICpzc2wsIGNvbnN0IGludCAqY3VydmVzLCBzaXplX3QgY3VydmVzX2xlbikgewotICByZXR1cm4gdGxzMV9zZXRfY3VydmVzKCZzc2wtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmc3NsLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoLCBjdXJ2ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVzX2xlbik7CisgICAgY2FzZSBTU0xfQ1RSTF9TRVRfQ1VSVkVTOgorICAgICAgcmV0dXJuIHRsczFfc2V0X2N1cnZlcygmY3R4LT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdF9sZW5ndGgsIHBhcmcsIGxhcmcpOworCisgICAgY2FzZSBTU0xfQ1RSTF9TRVRfU0lHQUxHUzoKKyAgICAgIHJldHVybiB0bHMxX3NldF9zaWdhbGdzKGN0eC0+Y2VydCwgcGFyZywgbGFyZywgMCk7CisKKyAgICBjYXNlIFNTTF9DVFJMX1NFVF9DTElFTlRfU0lHQUxHUzoKKyAgICAgIHJldHVybiB0bHMxX3NldF9zaWdhbGdzKGN0eC0+Y2VydCwgcGFyZywgbGFyZywgMSk7CisKKyAgICBjYXNlIFNTTF9DVFJMX1NFVF9DTElFTlRfQ0VSVF9UWVBFUzoKKyAgICAgIHJldHVybiBzc2wzX3NldF9yZXFfY2VydF90eXBlKGN0eC0+Y2VydCwgcGFyZywgbGFyZyk7CisKKyAgICBjYXNlIFNTTF9DVFJMX0JVSUxEX0NFUlRfQ0hBSU46CisgICAgICByZXR1cm4gc3NsX2J1aWxkX2NlcnRfY2hhaW4oY3R4LT5jZXJ0LCBjdHgtPmNlcnRfc3RvcmUsIGxhcmcpOworCisgICAgY2FzZSBTU0xfQ1RSTF9TRVRfVkVSSUZZX0NFUlRfU1RPUkU6CisgICAgICByZXR1cm4gc3NsX2NlcnRfc2V0X2NlcnRfc3RvcmUoY3R4LT5jZXJ0LCBwYXJnLCAwLCBsYXJnKTsKKworICAgIGNhc2UgU1NMX0NUUkxfU0VUX0NIQUlOX0NFUlRfU1RPUkU6CisgICAgICByZXR1cm4gc3NsX2NlcnRfc2V0X2NlcnRfc3RvcmUoY3R4LT5jZXJ0LCBwYXJnLCAxLCBsYXJnKTsKKworICAgIGNhc2UgU1NMX0NUUkxfRVhUUkFfQ0hBSU5fQ0VSVDoKKyAgICAgIGlmIChjdHgtPmV4dHJhX2NlcnRzID09IE5VTEwpIHsKKyAgICAgICAgY3R4LT5leHRyYV9jZXJ0cyA9IHNrX1g1MDlfbmV3X251bGwoKTsKKyAgICAgICAgaWYgKGN0eC0+ZXh0cmFfY2VydHMgPT0gTlVMTCkgeworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisgICAgICBza19YNTA5X3B1c2goY3R4LT5leHRyYV9jZXJ0cywgKFg1MDkgKilwYXJnKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTU0xfQ1RSTF9HRVRfRVhUUkFfQ0hBSU5fQ0VSVFM6CisgICAgICBpZiAoY3R4LT5leHRyYV9jZXJ0cyA9PSBOVUxMICYmIGxhcmcgPT0gMCkgeworICAgICAgICAqKFNUQUNLX09GKFg1MDkpICoqKXBhcmcgPSBjdHgtPmNlcnQtPmtleS0+Y2hhaW47CisgICAgICB9IGVsc2UgeworICAgICAgICAqKFNUQUNLX09GKFg1MDkpICoqKXBhcmcgPSBjdHgtPmV4dHJhX2NlcnRzOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNTTF9DVFJMX0NMRUFSX0VYVFJBX0NIQUlOX0NFUlRTOgorICAgICAgc2tfWDUwOV9wb3BfZnJlZShjdHgtPmV4dHJhX2NlcnRzLCBYNTA5X2ZyZWUpOworICAgICAgY3R4LT5leHRyYV9jZXJ0cyA9IE5VTEw7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1NMX0NUUkxfQ0hBSU46CisgICAgICBpZiAobGFyZykgeworICAgICAgICByZXR1cm4gc3NsX2NlcnRfc2V0MV9jaGFpbihjdHgtPmNlcnQsIChTVEFDS19PRihYNTA5KSAqKXBhcmcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHNzbF9jZXJ0X3NldDBfY2hhaW4oY3R4LT5jZXJ0LCAoU1RBQ0tfT0YoWDUwOSkgKilwYXJnKTsKKyAgICAgIH0KKworICAgIGNhc2UgU1NMX0NUUkxfQ0hBSU5fQ0VSVDoKKyAgICAgIGlmIChsYXJnKSB7CisgICAgICAgIHJldHVybiBzc2xfY2VydF9hZGQxX2NoYWluX2NlcnQoY3R4LT5jZXJ0LCAoWDUwOSAqKXBhcmcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHNzbF9jZXJ0X2FkZDBfY2hhaW5fY2VydChjdHgtPmNlcnQsIChYNTA5ICopcGFyZyk7CisgICAgICB9CisKKyAgICBjYXNlIFNTTF9DVFJMX0dFVF9DSEFJTl9DRVJUUzoKKyAgICAgICooU1RBQ0tfT0YoWDUwOSkgKiopcGFyZyA9IGN0eC0+Y2VydC0+a2V5LT5jaGFpbjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTU0xfQ1RSTF9TRUxFQ1RfQ1VSUkVOVF9DRVJUOgorICAgICAgcmV0dXJuIHNzbF9jZXJ0X3NlbGVjdF9jdXJyZW50KGN0eC0+Y2VydCwgKFg1MDkgKilwYXJnKTsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAxOwogfQogCiBpbnQgU1NMX0NUWF9zZXRfdGxzZXh0X3NlcnZlcm5hbWVfY2FsbGJhY2soCkBAIC00MDUsMzYgKzYwNCw2IEBACiAgIHJldHVybiAxOwogfQogCi1pbnQgU1NMX0NUWF9nZXRfdGxzZXh0X3RpY2tldF9rZXlzKFNTTF9DVFggKmN0eCwgdm9pZCAqb3V0LCBzaXplX3QgbGVuKSB7Ci0gIGlmIChvdXQgPT0gTlVMTCkgewotICAgIHJldHVybiA0ODsKLSAgfQotICBpZiAobGVuICE9IDQ4KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9JTlZBTElEX1RJQ0tFVF9LRVlTX0xFTkdUSCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgdWludDhfdCAqb3V0X2J5dGVzID0gb3V0OwotICBtZW1jcHkob3V0X2J5dGVzLCBjdHgtPnRsc2V4dF90aWNrX2tleV9uYW1lLCAxNik7Ci0gIG1lbWNweShvdXRfYnl0ZXMgKyAxNiwgY3R4LT50bHNleHRfdGlja19obWFjX2tleSwgMTYpOwotICBtZW1jcHkob3V0X2J5dGVzICsgMzIsIGN0eC0+dGxzZXh0X3RpY2tfYWVzX2tleSwgMTYpOwotICByZXR1cm4gMTsKLX0KLQotaW50IFNTTF9DVFhfc2V0X3Rsc2V4dF90aWNrZXRfa2V5cyhTU0xfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmluLCBzaXplX3QgbGVuKSB7Ci0gIGlmIChpbiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDQ4OwotICB9Ci0gIGlmIChsZW4gIT0gNDgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0lOVkFMSURfVElDS0VUX0tFWVNfTEVOR1RIKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBjb25zdCB1aW50OF90ICppbl9ieXRlcyA9IGluOwotICBtZW1jcHkoY3R4LT50bHNleHRfdGlja19rZXlfbmFtZSwgaW5fYnl0ZXMsIDE2KTsKLSAgbWVtY3B5KGN0eC0+dGxzZXh0X3RpY2tfaG1hY19rZXksIGluX2J5dGVzICsgMTYsIDE2KTsKLSAgbWVtY3B5KGN0eC0+dGxzZXh0X3RpY2tfYWVzX2tleSwgaW5fYnl0ZXMgKyAzMiwgMTYpOwotICByZXR1cm4gMTsKLX0KLQogaW50IFNTTF9DVFhfc2V0X3Rsc2V4dF90aWNrZXRfa2V5X2NiKAogICAgIFNTTF9DVFggKmN0eCwgaW50ICgqY2FsbGJhY2spKFNTTCAqc3NsLCB1aW50OF90ICprZXlfbmFtZSwgdWludDhfdCAqaXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX0NJUEhFUl9DVFggKmN0eCwgSE1BQ19DVFggKmhtYWNfY3R4LApAQCAtNDUzLDExICs2MjIsNiBAQAogICAgIHJldHVybiBzLT5jdHgtPmNpcGhlcl9saXN0X3RsczExOwogICB9CiAKLSAgaWYgKHMtPnZlcnNpb24gPj0gVExTMV9WRVJTSU9OICYmIHMtPmN0eCAhPSBOVUxMICYmCi0gICAgICBzLT5jdHgtPmNpcGhlcl9saXN0X3RsczEwICE9IE5VTEwpIHsKLSAgICByZXR1cm4gcy0+Y3R4LT5jaXBoZXJfbGlzdF90bHMxMDsKLSAgfQotCiAgIGlmIChzLT5jdHggIT0gTlVMTCAmJiBzLT5jdHgtPmNpcGhlcl9saXN0ICE9IE5VTEwpIHsKICAgICByZXR1cm4gcy0+Y3R4LT5jaXBoZXJfbGlzdDsKICAgfQpAQCAtNTQ0LDYgKzcwOCwxMyBAQAogICBpbnQgaGF2ZV9yc2Ffc2lnbiA9IDA7CiAgIGludCBoYXZlX2VjZHNhX3NpZ24gPSAwOwogCisgIC8qIElmIHdlIGhhdmUgY3VzdG9tIGNlcnRpZmljYXRlIHR5cGVzIHNldCwgdXNlIHRoZW0gKi8KKyAgaWYgKHMtPmNlcnQtPmNsaWVudF9jZXJ0aWZpY2F0ZV90eXBlcykgeworICAgIG1lbWNweShwLCBzLT5jZXJ0LT5jbGllbnRfY2VydGlmaWNhdGVfdHlwZXMsCisgICAgICAgICAgIHMtPmNlcnQtPm51bV9jbGllbnRfY2VydGlmaWNhdGVfdHlwZXMpOworICAgIHJldHVybiBzLT5jZXJ0LT5udW1fY2xpZW50X2NlcnRpZmljYXRlX3R5cGVzOworICB9CisKICAgLyogZ2V0IGNvbmZpZ3VyZWQgc2lnYWxncyAqLwogICBzaWdsZW4gPSB0bHMxMl9nZXRfcHNpZ2FsZ3MocywgJnNpZyk7CiAgIGZvciAoaSA9IDA7IGkgPCBzaWdsZW47IGkgKz0gMiwgc2lnICs9IDIpIHsKQEAgLTU3MSwxMyArNzQyLDM2IEBACiAgIHJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgc3NsM19zZXRfcmVxX2NlcnRfdHlwZShDRVJUICpjLCBjb25zdCB1aW50OF90ICpwLCBzaXplX3QgbGVuKSB7CisgIE9QRU5TU0xfZnJlZShjLT5jbGllbnRfY2VydGlmaWNhdGVfdHlwZXMpOworICBjLT5jbGllbnRfY2VydGlmaWNhdGVfdHlwZXMgPSBOVUxMOworICBjLT5udW1fY2xpZW50X2NlcnRpZmljYXRlX3R5cGVzID0gMDsKKworICBpZiAoIXAgfHwgIWxlbikgeworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKGxlbiA+IDB4ZmYpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGMtPmNsaWVudF9jZXJ0aWZpY2F0ZV90eXBlcyA9IEJVRl9tZW1kdXAocCwgbGVuKTsKKyAgaWYgKCFjLT5jbGllbnRfY2VydGlmaWNhdGVfdHlwZXMpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGMtPm51bV9jbGllbnRfY2VydGlmaWNhdGVfdHlwZXMgPSBsZW47CisgIHJldHVybiAxOworfQorCiAvKiBJZiB3ZSBhcmUgdXNpbmcgZGVmYXVsdCBTSEExK01ENSBhbGdvcml0aG1zIHN3aXRjaCB0byBuZXcgU0hBMjU2IFBSRiBhbmQKICAqIGhhbmRzaGFrZSBtYWNzIGlmIHJlcXVpcmVkLiAqLwotdWludDMyX3Qgc3NsX2dldF9hbGdvcml0aG1fcHJmKFNTTCAqcykgewotICB1aW50MzJfdCBhbGdvcml0aG1fcHJmID0gcy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fcHJmOwordWludDMyX3Qgc3NsX2dldF9hbGdvcml0aG0yKFNTTCAqcykgeworICBzdGF0aWMgY29uc3QgdWludDMyX3Qga01hc2sgPSBTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUOworICB1aW50MzJfdCBhbGcyID0gcy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG0yOwogICBpZiAocy0+ZW5jX21ldGhvZC0+ZW5jX2ZsYWdzICYgU1NMX0VOQ19GTEFHX1NIQTI1Nl9QUkYgJiYKLSAgICAgIGFsZ29yaXRobV9wcmYgPT0gU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVCkgeworICAgICAgKGFsZzIgJiBrTWFzaykgPT0ga01hc2spIHsKICAgICByZXR1cm4gU1NMX0hBTkRTSEFLRV9NQUNfU0hBMjU2OwogICB9Ci0gIHJldHVybiBhbGdvcml0aG1fcHJmOworICByZXR1cm4gYWxnMjsKIH0KZGlmZiAtLWdpdCBhL3NyYy9zc2wvczNfbWV0aC5jIGIvc3JjL3NzbC9zM19tZXRoLmMKaW5kZXggMDFjMTEwMS4uNjZiYmIyOSAxMDA2NDQKLS0tIGEvc3JjL3NzbC9zM19tZXRoLmMKKysrIGIvc3JjL3NzbC9zM19tZXRoLmMKQEAgLTU0LDggKzU0LDYgQEAKICAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKICAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCiAKLSNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgotCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogCkBAIC03MCw2ICs2OCw4IEBACiAgICAgc3NsM19yZWFkX2Nsb3NlX25vdGlmeSwKICAgICBzc2wzX3dyaXRlX2FwcF9kYXRhLAogICAgIHNzbDNfZGlzcGF0Y2hfYWxlcnQsCisgICAgc3NsM19jdHJsLAorICAgIHNzbDNfY3R4X2N0cmwsCiAgICAgc3NsM19zdXBwb3J0c19jaXBoZXIsCiAgICAgU1NMM19ITV9IRUFERVJfTEVOR1RILAogICAgIHNzbDNfc2V0X2hhbmRzaGFrZV9oZWFkZXIsCmRpZmYgLS1naXQgYS9zcmMvc3NsL3MzX3BrdC5jIGIvc3JjL3NzbC9zM19wa3QuYwppbmRleCAzYzI0MzVkLi40YTlhZTgzIDEwMDY0NAotLS0gYS9zcmMvc3NsL3MzX3BrdC5jCisrKyBiL3NyYy9zc2wvczNfcGt0LmMKQEAgLTEwNiw4ICsxMDYsNiBAQAogICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQogICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCiAKLSNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgotCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTEyMiw2NSArMTIwLDI4MiBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIAotc3RhdGljIGludCBkb19zc2wzX3dyaXRlKFNTTCAqcywgaW50IHR5cGUsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgdW5zaWduZWQgbGVuKTsKK3N0YXRpYyBpbnQgZG9fc3NsM193cml0ZShTU0wgKnMsIGludCB0eXBlLCBjb25zdCB1aW50OF90ICpidWYsIHVuc2lnbmVkIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcmFnbWVudCk7CitzdGF0aWMgaW50IHNzbDNfZ2V0X3JlY29yZChTU0wgKnMpOwogCi0vKiBrTWF4V2FybmluZ0FsZXJ0cyBpcyB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHdhcm5pbmcgYWxlcnRzIHRoYXQgd2lsbCBiZQotICogcHJvY2Vzc2VkLiAqLwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga01heFdhcm5pbmdBbGVydHMgPSA0OworaW50IHNzbDNfcmVhZF9uKFNTTCAqcywgaW50IG4sIGludCBleHRlbmQpIHsKKyAgLyogSWYgfGV4dGVuZHwgaXMgMCwgb2J0YWluIG5ldyBuLWJ5dGUgcGFja2V0OworICAgKiBpZiB8ZXh0ZW5kfCBpcyAxLCBpbmNyZWFzZSBwYWNrZXQgYnkgYW5vdGhlciBuIGJ5dGVzLgorICAgKgorICAgKiBUaGUgcGFja2V0IHdpbGwgYmUgaW4gdGhlIHN1Yi1hcnJheSBvZiB8cy0+czMtPnJidWYuYnVmfCBzcGVjaWZpZWQgYnkKKyAgICogfHMtPnBhY2tldHwgYW5kIHxzLT5wYWNrZXRfbGVuZ3RofC4gKElmIERUTFMgYW5kIHxleHRlbmR8IGlzIDAsIGFkZGl0aW9uYWwKKyAgICogYnl0ZXMgd2lsbCBiZSByZWFkIGludG8gfHJidWZ8LCB1cCB0byB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLikKKyAgICoKKyAgICogVE9ETyhkYXZpZGJlbik6IHxkdGxzMV9nZXRfcmVjb3JkfCBhbmQgfHNzbDNfZ2V0X3JlY29yZHwgaGF2ZSB2ZXJ5CisgICAqIGRpZmZlcmVudCBuZWVkcy4gU2VwYXJhdGUgdGhlIHR3byByZWNvcmQgbGF5ZXJzLiBJbiBEVExTLCB8QklPX3JlYWR8IGlzCisgICAqIGNhbGxlZCBhdCBtb3N0IG9uY2UsIGFuZCBvbmx5IHdoZW4gfGV4dGVuZHwgaXMgMC4gSW4gVExTLCB0aGUgYnVmZmVyIG5ldmVyCisgICAqIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgcmVjb3JkLiAqLworICBpbnQgaSwgbGVuLCBsZWZ0OworICB1aW50cHRyX3QgYWxpZ24gPSAwOworICB1aW50OF90ICpwa3Q7CisgIFNTTDNfQlVGRkVSICpyYjsKIAotLyogc3NsM19nZXRfcmVjb3JkIHJlYWRzIGEgbmV3IGlucHV0IHJlY29yZC4gT24gc3VjY2VzcywgaXQgcGxhY2VzIGl0IGluCi0gKiB8c3NsLT5zMy0+cnJlY3wgYW5kIHJldHVybnMgb25lLiBPdGhlcndpc2UgaXQgcmV0dXJucyA8PSAwIG9uIGVycm9yIG9yIGlmCi0gKiBtb3JlIGRhdGEgaXMgbmVlZGVkLiAqLwotc3RhdGljIGludCBzc2wzX2dldF9yZWNvcmQoU1NMICpzc2wpIHsKLSAgaW50IHJldDsKKyAgaWYgKG4gPD0gMCkgeworICAgIHJldHVybiBuOworICB9CisKKyAgcmIgPSAmcy0+czMtPnJidWY7CisgIGlmIChyYi0+YnVmID09IE5VTEwgJiYgIXNzbDNfc2V0dXBfcmVhZF9idWZmZXIocykpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBsZWZ0ID0gcmItPmxlZnQ7CisKKyAgYWxpZ24gPSAodWludHB0cl90KXJiLT5idWYgKyBTU0wzX1JUX0hFQURFUl9MRU5HVEg7CisgIGFsaWduID0gKDAgLSBhbGlnbikgJiAoU1NMM19BTElHTl9QQVlMT0FEIC0gMSk7CisKKyAgaWYgKCFleHRlbmQpIHsKKyAgICAvKiBzdGFydCB3aXRoIGVtcHR5IHBhY2tldCAuLi4gKi8KKyAgICBpZiAobGVmdCA9PSAwKSB7CisgICAgICByYi0+b2Zmc2V0ID0gYWxpZ247CisgICAgfSBlbHNlIGlmIChhbGlnbiAhPSAwICYmIGxlZnQgPj0gU1NMM19SVF9IRUFERVJfTEVOR1RIKSB7CisgICAgICAvKiBjaGVjayBpZiBuZXh0IHBhY2tldCBsZW5ndGggaXMgbGFyZ2UgZW5vdWdoIHRvIGp1c3RpZnkgcGF5bG9hZAorICAgICAgICogYWxpZ25tZW50Li4uICovCisgICAgICBwa3QgPSByYi0+YnVmICsgcmItPm9mZnNldDsKKyAgICAgIGlmIChwa3RbMF0gPT0gU1NMM19SVF9BUFBMSUNBVElPTl9EQVRBICYmIChwa3RbM10gPDwgOCB8IHBrdFs0XSkgPj0gMTI4KSB7CisgICAgICAgIC8qIE5vdGUgdGhhdCBldmVuIGlmIHBhY2tldCBpcyBjb3JydXB0ZWQgYW5kIGl0cyBsZW5ndGggZmllbGQgaXMKKyAgICAgICAgICogaW5zYW5lLCB3ZSBjYW4gb25seSBiZSBsZWQgdG8gd3JvbmcgZGVjaXNpb24gYWJvdXQgd2hldGhlciBtZW1tb3ZlCisgICAgICAgICAqIHdpbGwgb2NjdXIgb3Igbm90LiBIZWFkZXIgdmFsdWVzIGhhcyBubyBlZmZlY3Qgb24gbWVtbW92ZSBhcmd1bWVudHMKKyAgICAgICAgICogYW5kIHRoZXJlZm9yZSBubyBidWZmZXIgb3ZlcnJ1biBjYW4gYmUgdHJpZ2dlcmVkLiAqLworICAgICAgICBtZW1tb3ZlKHJiLT5idWYgKyBhbGlnbiwgcGt0LCBsZWZ0KTsKKyAgICAgICAgcmItPm9mZnNldCA9IGFsaWduOworICAgICAgfQorICAgIH0KKyAgICBzLT5wYWNrZXQgPSByYi0+YnVmICsgcmItPm9mZnNldDsKKyAgICBzLT5wYWNrZXRfbGVuZ3RoID0gMDsKKyAgICAvKiAuLi4gbm93IHdlIGNhbiBhY3QgYXMgaWYgJ2V4dGVuZCcgd2FzIHNldCAqLworICB9CisKKyAgLyogSW4gRFRMUywgaWYgdGhlcmUgaXMgbGVmdG92ZXIgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyBwYWNrZXQgb3IgfGV4dGVuZHwgaXMKKyAgICogdHJ1ZSwgY2xhbXAgdG8gdGhlIHByZXZpb3VzIHJlYWQuIERUTFMgcmVjb3JkcyBtYXkgbm90IHNwYW4gcGFja2V0CisgICAqIGJvdW5kYXJpZXMuICovCisgIGlmIChTU0xfSVNfRFRMUyhzKSAmJiBuID4gbGVmdCAmJiAobGVmdCA+IDAgfHwgZXh0ZW5kKSkgeworICAgIG4gPSBsZWZ0OworICB9CisKKyAgLyogaWYgdGhlcmUgaXMgZW5vdWdoIGluIHRoZSBidWZmZXIgZnJvbSBhIHByZXZpb3VzIHJlYWQsIHRha2Ugc29tZSAqLworICBpZiAobGVmdCA+PSBuKSB7CisgICAgcy0+cGFja2V0X2xlbmd0aCArPSBuOworICAgIHJiLT5sZWZ0ID0gbGVmdCAtIG47CisgICAgcmItPm9mZnNldCArPSBuOworICAgIHJldHVybiBuOworICB9CisKKyAgLyogZWxzZSB3ZSBuZWVkIHRvIHJlYWQgbW9yZSBkYXRhICovCisKKyAgbGVuID0gcy0+cGFja2V0X2xlbmd0aDsKKyAgcGt0ID0gcmItPmJ1ZiArIGFsaWduOworICAvKiBNb3ZlIGFueSBhdmFpbGFibGUgYnl0ZXMgdG8gZnJvbnQgb2YgYnVmZmVyOiB8bGVufCBieXRlcyBhbHJlYWR5IHBvaW50ZWQKKyAgICogdG8gYnkgfHBhY2tldHwsIHxsZWZ0fCBleHRyYSBvbmVzIGF0IHRoZSBlbmQuICovCisgIGlmIChzLT5wYWNrZXQgIT0gcGt0KSB7CisgICAgLyogbGVuID4gMCAqLworICAgIG1lbW1vdmUocGt0LCBzLT5wYWNrZXQsIGxlbiArIGxlZnQpOworICAgIHMtPnBhY2tldCA9IHBrdDsKKyAgICByYi0+b2Zmc2V0ID0gbGVuICsgYWxpZ247CisgIH0KKworICBpZiAobiA+IChpbnQpKHJiLT5sZW4gLSByYi0+b2Zmc2V0KSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19yZWFkX24sIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpbnQgbWF4ID0gbjsKKyAgaWYgKFNTTF9JU19EVExTKHMpICYmICFleHRlbmQpIHsKKyAgICBtYXggPSByYi0+bGVuIC0gcmItPm9mZnNldDsKKyAgfQorCisgIHdoaWxlIChsZWZ0IDwgbikgeworICAgIC8qIE5vdyB3ZSBoYXZlIGxlbitsZWZ0IGJ5dGVzIGF0IHRoZSBmcm9udCBvZiBzLT5zMy0+cmJ1Zi5idWYgYW5kIG5lZWQgdG8KKyAgICAgKiByZWFkIGluIG1vcmUgdW50aWwgd2UgaGF2ZSBsZW4rbiAodXAgdG8gbGVuK21heCBpZiBwb3NzaWJsZSkuICovCisgICAgRVJSX2NsZWFyX3N5c3RlbV9lcnJvcigpOworICAgIGlmIChzLT5yYmlvICE9IE5VTEwpIHsKKyAgICAgIHMtPnJ3c3RhdGUgPSBTU0xfUkVBRElORzsKKyAgICAgIGkgPSBCSU9fcmVhZChzLT5yYmlvLCBwa3QgKyBsZW4gKyBsZWZ0LCBtYXggLSBsZWZ0KTsKKyAgICB9IGVsc2UgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3JlYWRfbiwgU1NMX1JfUkVBRF9CSU9fTk9UX1NFVCk7CisgICAgICBpID0gLTE7CisgICAgfQorCisgICAgaWYgKGkgPD0gMCkgeworICAgICAgcmItPmxlZnQgPSBsZWZ0OworICAgICAgaWYgKGxlbiArIGxlZnQgPT0gMCkgeworICAgICAgICBzc2wzX3JlbGVhc2VfcmVhZF9idWZmZXIocyk7CisgICAgICB9CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgbGVmdCArPSBpOworICAgIC8qIHJlYWRzIHNob3VsZCAqbmV2ZXIqIHNwYW4gbXVsdGlwbGUgcGFja2V0cyBmb3IgRFRMUyBiZWNhdXNlIHRoZQorICAgICAqIHVuZGVybHlpbmcgdHJhbnNwb3J0IHByb3RvY29sIGlzIG1lc3NhZ2Ugb3JpZW50ZWQgYXMgb3Bwb3NlZCB0byBieXRlCisgICAgICogb3JpZW50ZWQgYXMgaW4gdGhlIFRMUyBjYXNlLiAqLworICAgIGlmIChTU0xfSVNfRFRMUyhzKSAmJiBuID4gbGVmdCkgeworICAgICAgbiA9IGxlZnQ7IC8qIG1ha2VzIHRoZSB3aGlsZSBjb25kaXRpb24gZmFsc2UgKi8KKyAgICB9CisgIH0KKworICAvKiBkb25lIHJlYWRpbmcsIG5vdyB0aGUgYm9vay1rZWVwaW5nICovCisgIHJiLT5vZmZzZXQgKz0gbjsKKyAgcmItPmxlZnQgPSBsZWZ0IC0gbjsKKyAgcy0+cGFja2V0X2xlbmd0aCArPSBuOworICBzLT5yd3N0YXRlID0gU1NMX05PVEhJTkc7CisKKyAgcmV0dXJuIG47Cit9CisKKy8qIE1BWF9FTVBUWV9SRUNPUkRTIGRlZmluZXMgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSwgZW1wdHkgcmVjb3JkcyB0aGF0IHdpbGwKKyAqIGJlIHByb2Nlc3NlZCBwZXIgY2FsbCB0byBzc2wzX2dldF9yZWNvcmQuIFdpdGhvdXQgdGhpcyBsaW1pdCBhbiBhdHRhY2tlcgorICogY291bGQgc2VuZCBlbXB0eSByZWNvcmRzIGF0IGEgZmFzdGVyIHJhdGUgdGhhbiB3ZSBjYW4gcHJvY2VzcyBhbmQgY2F1c2UKKyAqIHNzbDNfZ2V0X3JlY29yZCB0byBsb29wIGZvcmV2ZXIuICovCisjZGVmaW5lIE1BWF9FTVBUWV9SRUNPUkRTIDMyCisKKy8qIENhbGwgdGhpcyB0byBnZXQgYSBuZXcgaW5wdXQgcmVjb3JkLiBJdCB3aWxsIHJldHVybiA8PSAwIGlmIG1vcmUgZGF0YSBpcworICogbmVlZGVkLCBub3JtYWxseSBkdWUgdG8gYW4gZXJyb3Igb3Igbm9uLWJsb2NraW5nIElPLiBXaGVuIGl0IGZpbmlzaGVzLCBvbmUKKyAqIHBhY2tldCBoYXMgYmVlbiBkZWNvZGVkIGFuZCBjYW4gYmUgZm91bmQgaW4KKyAqIHNzbC0+czMtPnJyZWMudHlwZSAgICAtIGlzIHRoZSB0eXBlIG9mIHJlY29yZAorICogc3NsLT5zMy0+cnJlYy5kYXRhICAgIC0gZGF0YQorICogc3NsLT5zMy0+cnJlYy5sZW5ndGggIC0gbnVtYmVyIG9mIGJ5dGVzICovCisvKiB1c2VkIG9ubHkgYnkgc3NsM19yZWFkX2J5dGVzICovCitzdGF0aWMgaW50IHNzbDNfZ2V0X3JlY29yZChTU0wgKnMpIHsKKyAgdWludDhfdCBzc2xfbWFqb3IsIHNzbF9taW5vcjsKKyAgaW50IGFsLCBuLCBpLCByZXQgPSAtMTsKKyAgU1NMM19SRUNPUkQgKnJyID0gJnMtPnMzLT5ycmVjOworICB1aW50OF90ICpwOworICB1aW50MTZfdCB2ZXJzaW9uOworICBzaXplX3QgZXh0cmE7CisgIHVuc2lnbmVkIGVtcHR5X3JlY29yZF9jb3VudCA9IDA7CisKIGFnYWluOgotICAvKiBFbnN1cmUgdGhlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggdG8gZGVjcnlwdCBpbi1wbGFjZS4gKi8KLSAgcmV0ID0gc3NsX3JlYWRfYnVmZmVyX2V4dGVuZF90byhzc2wsIHNzbF9yZWNvcmRfcHJlZml4X2xlbihzc2wpKTsKLSAgaWYgKHJldCA8PSAwKSB7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotICBhc3NlcnQoc3NsX3JlYWRfYnVmZmVyX2xlbihzc2wpID49IHNzbF9yZWNvcmRfcHJlZml4X2xlbihzc2wpKTsKKyAgLyogY2hlY2sgaWYgd2UgaGF2ZSB0aGUgaGVhZGVyICovCisgIGlmIChzLT5yc3RhdGUgIT0gU1NMX1NUX1JFQURfQk9EWSB8fAorICAgICAgcy0+cGFja2V0X2xlbmd0aCA8IFNTTDNfUlRfSEVBREVSX0xFTkdUSCkgeworICAgIG4gPSBzc2wzX3JlYWRfbihzLCBTU0wzX1JUX0hFQURFUl9MRU5HVEgsIDApOworICAgIGlmIChuIDw9IDApIHsKKyAgICAgIHJldHVybiBuOyAvKiBlcnJvciBvciBub24tYmxvY2tpbmcgKi8KKyAgICB9CisgICAgcy0+cnN0YXRlID0gU1NMX1NUX1JFQURfQk9EWTsKIAotICB1aW50OF90ICpvdXQgPSBzc2xfcmVhZF9idWZmZXIoc3NsKSArIHNzbF9yZWNvcmRfcHJlZml4X2xlbihzc2wpOwotICBzaXplX3QgbWF4X291dCA9IHNzbF9yZWFkX2J1ZmZlcl9sZW4oc3NsKSAtIHNzbF9yZWNvcmRfcHJlZml4X2xlbihzc2wpOwotICB1aW50OF90IHR5cGUsIGFsZXJ0OwotICBzaXplX3QgbGVuLCBjb25zdW1lZDsKLSAgc3dpdGNoICh0bHNfb3Blbl9yZWNvcmQoc3NsLCAmdHlwZSwgb3V0LCAmbGVuLCAmY29uc3VtZWQsICZhbGVydCwgbWF4X291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3JlYWRfYnVmZmVyKHNzbCksIHNzbF9yZWFkX2J1ZmZlcl9sZW4oc3NsKSkpIHsKLSAgICBjYXNlIHNzbF9vcGVuX3JlY29yZF9zdWNjZXNzOgotICAgICAgc3NsX3JlYWRfYnVmZmVyX2NvbnN1bWUoc3NsLCBjb25zdW1lZCk7CisgICAgLyogU29tZSBieXRlcyB3ZXJlIHJlYWQsIHNvIHRoZSByZWFkIGJ1ZmZlciBtdXN0IGJlIGV4aXN0YW50IGFuZAorICAgICAqIHxzLT5zMy0+aW5pdF9leHRyYXwgaXMgZGVmaW5lZC4gKi8KKyAgICBhc3NlcnQocy0+czMtPnJidWYuYnVmICE9IE5VTEwpOworICAgIGV4dHJhID0gcy0+czMtPmluaXRfZXh0cmEgPyBTU0wzX1JUX01BWF9FWFRSQSA6IDA7CiAKLSAgICAgIGlmIChsZW4gPiAweGZmZmYpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9PVkVSRkxPVyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KKyAgICBwID0gcy0+cGFja2V0OworICAgIGlmIChzLT5tc2dfY2FsbGJhY2spIHsKKyAgICAgIHMtPm1zZ19jYWxsYmFjaygwLCAwLCBTU0wzX1JUX0hFQURFUiwgcCwgNSwgcywgcy0+bXNnX2NhbGxiYWNrX2FyZyk7CisgICAgfQogCi0gICAgICBTU0wzX1JFQ09SRCAqcnIgPSAmc3NsLT5zMy0+cnJlYzsKLSAgICAgIHJyLT50eXBlID0gdHlwZTsKLSAgICAgIHJyLT5sZW5ndGggPSAodWludDE2X3QpbGVuOwotICAgICAgcnItPm9mZiA9IDA7Ci0gICAgICByci0+ZGF0YSA9IG91dDsKLSAgICAgIHJldHVybiAxOworICAgIC8qIFB1bGwgYXBhcnQgdGhlIGhlYWRlciBpbnRvIHRoZSBTU0wzX1JFQ09SRCAqLworICAgIHJyLT50eXBlID0gKihwKyspOworICAgIHNzbF9tYWpvciA9ICoocCsrKTsKKyAgICBzc2xfbWlub3IgPSAqKHArKyk7CisgICAgdmVyc2lvbiA9ICgoKHVpbnQxNl90KXNzbF9tYWpvcikgPDwgOCkgfCBzc2xfbWlub3I7CisgICAgbjJzKHAsIHJyLT5sZW5ndGgpOwogCi0gICAgY2FzZSBzc2xfb3Blbl9yZWNvcmRfcGFydGlhbDoKLSAgICAgIHJldCA9IHNzbF9yZWFkX2J1ZmZlcl9leHRlbmRfdG8oc3NsLCBjb25zdW1lZCk7Ci0gICAgICBpZiAocmV0IDw9IDApIHsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgIH0KLSAgICAgIGdvdG8gYWdhaW47CisgICAgaWYgKHMtPnMzLT5oYXZlX3ZlcnNpb24gJiYgdmVyc2lvbiAhPSBzLT52ZXJzaW9uKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3JlY29yZCwgU1NMX1JfV1JPTkdfVkVSU0lPTl9OVU1CRVIpOworICAgICAgYWwgPSBTU0xfQURfUFJPVE9DT0xfVkVSU0lPTjsKKyAgICAgIGdvdG8gZl9lcnI7CisgICAgfQogCi0gICAgY2FzZSBzc2xfb3Blbl9yZWNvcmRfZGlzY2FyZDoKLSAgICAgIHNzbF9yZWFkX2J1ZmZlcl9jb25zdW1lKHNzbCwgY29uc3VtZWQpOwotICAgICAgZ290byBhZ2FpbjsKKyAgICBpZiAoKHZlcnNpb24gPj4gOCkgIT0gU1NMM19WRVJTSU9OX01BSk9SKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3JlY29yZCwgU1NMX1JfV1JPTkdfVkVSU0lPTl9OVU1CRVIpOworICAgICAgZ290byBlcnI7CisgICAgfQogCi0gICAgY2FzZSBzc2xfb3Blbl9yZWNvcmRfZXJyb3I6Ci0gICAgICBzc2wzX3NlbmRfYWxlcnQoc3NsLCBTU0wzX0FMX0ZBVEFMLCBhbGVydCk7Ci0gICAgICByZXR1cm4gLTE7CisgICAgaWYgKHJyLT5sZW5ndGggPiBTU0wzX1JUX01BWF9FTkNSWVBURURfTEVOR1RIICsgZXh0cmEpIHsKKyAgICAgIGFsID0gU1NMX0FEX1JFQ09SRF9PVkVSRkxPVzsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfcmVjb3JkLCBTU0xfUl9FTkNSWVBURURfTEVOR1RIX1RPT19MT05HKTsKKyAgICAgIGdvdG8gZl9lcnI7CisgICAgfQorCisgICAgLyogbm93IHMtPnJzdGF0ZSA9PSBTU0xfU1RfUkVBRF9CT0RZICovCisgIH0gZWxzZSB7CisgICAgLyogfHBhY2tldF9sZW5ndGh8IGlzIG5vbi16ZXJvIGFuZCB8cy0+cnN0YXRlfCBpcyB8U1NMX1NUX1JFQURfQk9EWXwuIFRoZQorICAgICAqIHJlYWQgYnVmZmVyIG11c3QgYmUgZXhpc3RhbnQgYW5kIHxzLT5zMy0+aW5pdF9leHRyYXwgaXMgZGVmaW5lZC4gKi8KKyAgICBhc3NlcnQocy0+czMtPnJidWYuYnVmICE9IE5VTEwpOworICAgIGV4dHJhID0gcy0+czMtPmluaXRfZXh0cmEgPyBTU0wzX1JUX01BWF9FWFRSQSA6IDA7CiAgIH0KIAotICBhc3NlcnQoMCk7Ci0gIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOwotICByZXR1cm4gLTE7CisgIC8qIHMtPnJzdGF0ZSA9PSBTU0xfU1RfUkVBRF9CT0RZLCBnZXQgYW5kIGRlY29kZSB0aGUgZGF0YSAqLworCisgIGlmIChyci0+bGVuZ3RoID4gcy0+cGFja2V0X2xlbmd0aCAtIFNTTDNfUlRfSEVBREVSX0xFTkdUSCkgeworICAgIC8qIG5vdyBzLT5wYWNrZXRfbGVuZ3RoID09IFNTTDNfUlRfSEVBREVSX0xFTkdUSCAqLworICAgIGkgPSByci0+bGVuZ3RoOworICAgIG4gPSBzc2wzX3JlYWRfbihzLCBpLCAxKTsKKyAgICBpZiAobiA8PSAwKSB7CisgICAgICAvKiBFcnJvciBvciBub24tYmxvY2tpbmcgSU8uIE5vdyB8bnwgPT0gfHJyLT5sZW5ndGh8LCBhbmQKKyAgICAgICAqIHxzLT5wYWNrZXRfbGVuZ3RofCA9PSB8U1NMM19SVF9IRUFERVJfTEVOR1RIfCArIHxyci0+bGVuZ3RofC4gKi8KKyAgICAgIHJldHVybiBuOworICAgIH0KKyAgfQorCisgIHMtPnJzdGF0ZSA9IFNTTF9TVF9SRUFEX0hFQURFUjsgLyogc2V0IHN0YXRlIGZvciBsYXRlciBvcGVyYXRpb25zICovCisKKyAgLyogfHJyLT5kYXRhfCBwb2ludHMgdG8gfHJyLT5sZW5ndGh8IGJ5dGVzIG9mIGNpcGhlcnRleHQgaW4gfHMtPnBhY2tldHwuICovCisgIHJyLT5kYXRhID0gJnMtPnBhY2tldFtTU0wzX1JUX0hFQURFUl9MRU5HVEhdOworCisgIC8qIERlY3J5cHQgdGhlIHBhY2tldCBpbi1wbGFjZS4KKyAgICoKKyAgICogVE9ETyhkYXZpZGJlbik6IFRoaXMgYXNzdW1lcyB8cy0+dmVyc2lvbnwgaXMgdGhlIHNhbWUgYXMgdGhlIHJlY29yZC1sYXllcgorICAgKiB2ZXJzaW9uIHdoaWNoIGlzbid0IGFsd2F5cyB0cnVlLCBidXQgaXQgb25seSBkaWZmZXJzIHdpdGggdGhlIE5VTEwgY2lwaGVyCisgICAqIHdoaWNoIGlnbm9yZXMgdGhlIHBhcmFtZXRlci4gKi8KKyAgc2l6ZV90IHBsYWludGV4dF9sZW47CisgIGlmICghU1NMX0FFQURfQ1RYX29wZW4ocy0+YWVhZF9yZWFkX2N0eCwgcnItPmRhdGEsICZwbGFpbnRleHRfbGVuLCByci0+bGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJyLT50eXBlLCBzLT52ZXJzaW9uLCBzLT5zMy0+cmVhZF9zZXF1ZW5jZSwgcnItPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgcnItPmxlbmd0aCkpIHsKKyAgICBhbCA9IFNTTF9BRF9CQURfUkVDT1JEX01BQzsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3JlY29yZCwKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9ERUNSWVBUSU9OX0ZBSUxFRF9PUl9CQURfUkVDT1JEX01BQyk7CisgICAgZ290byBmX2VycjsKKyAgfQorICBpZiAoIXNzbDNfcmVjb3JkX3NlcXVlbmNlX3VwZGF0ZShzLT5zMy0+cmVhZF9zZXF1ZW5jZSwgOCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBpZiAocGxhaW50ZXh0X2xlbiA+IFNTTDNfUlRfTUFYX1BMQUlOX0xFTkdUSCArIGV4dHJhKSB7CisgICAgYWwgPSBTU0xfQURfUkVDT1JEX09WRVJGTE9XOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfcmVjb3JkLCBTU0xfUl9EQVRBX0xFTkdUSF9UT09fTE9ORyk7CisgICAgZ290byBmX2VycjsKKyAgfQorICBhc3NlcnQocGxhaW50ZXh0X2xlbiA8PSAoMXUgPDwgMTYpKTsKKyAgcnItPmxlbmd0aCA9IHBsYWludGV4dF9sZW47CisKKyAgcnItPm9mZiA9IDA7CisgIC8qIFNvIGF0IHRoaXMgcG9pbnQgdGhlIGZvbGxvd2luZyBpcyB0cnVlOgorICAgKiBzc2wtPnMzLT5ycmVjLnR5cGUgaXMgdGhlIHR5cGUgb2YgcmVjb3JkOworICAgKiBzc2wtPnMzLT5ycmVjLmxlbmd0aCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByZWNvcmQ7CisgICAqIHNzbC0+czMtPnJyZWMub2ZmIGlzIHRoZSBvZmZzZXQgdG8gZmlyc3QgdmFsaWQgYnl0ZTsKKyAgICogc3NsLT5zMy0+cnJlYy5kYXRhIHRoZSBmaXJzdCBieXRlIG9mIHRoZSByZWNvcmQgYm9keS4gKi8KKworICAvKiB3ZSBoYXZlIHB1bGxlZCBpbiBhIGZ1bGwgcGFja2V0IHNvIHplcm8gdGhpbmdzICovCisgIHMtPnBhY2tldF9sZW5ndGggPSAwOworCisgIC8qIGp1c3QgcmVhZCBhIDAgbGVuZ3RoIHBhY2tldCAqLworICBpZiAocnItPmxlbmd0aCA9PSAwKSB7CisgICAgZW1wdHlfcmVjb3JkX2NvdW50Kys7CisgICAgaWYgKGVtcHR5X3JlY29yZF9jb3VudCA+IE1BWF9FTVBUWV9SRUNPUkRTKSB7CisgICAgICBhbCA9IFNTTF9BRF9VTkVYUEVDVEVEX01FU1NBR0U7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3JlY29yZCwgU1NMX1JfVE9PX01BTllfRU1QVFlfRlJBR01FTlRTKTsKKyAgICAgIGdvdG8gZl9lcnI7CisgICAgfQorICAgIGdvdG8gYWdhaW47CisgIH0KKworICByZXR1cm4gMTsKKworZl9lcnI6CisgIHNzbDNfc2VuZF9hbGVydChzLCBTU0wzX0FMX0ZBVEFMLCBhbCk7CitlcnI6CisgIHJldHVybiByZXQ7CiB9CiAKIGludCBzc2wzX3dyaXRlX2FwcF9kYXRhKFNTTCAqc3NsLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4pIHsKQEAgLTIwNSw3ICs0MjAsNyBAQAogICAgICAgcmV0dXJuIGk7CiAgICAgfQogICAgIGlmIChpID09IDApIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfU1NMX0hBTkRTSEFLRV9GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM193cml0ZV9ieXRlcywgU1NMX1JfU1NMX0hBTkRTSEFLRV9GQUlMVVJFKTsKICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgIH0KQEAgLTIxOCwyMiArNDMzLDMzIEBACiAgICAqIGJleW9uZCB0aGUgZW5kIG9mIHRoZSB1c2VycyBidWZmZXIgLi4uIHNvIHdlIHRyYXAgYW5kIHJlcG9ydCB0aGUgZXJyb3IgaW4KICAgICogYSB3YXkgdGhlIHVzZXIgd2lsbCBub3RpY2UuICovCiAgIGlmIChsZW4gPCAwIHx8IChzaXplX3QpbGVuIDwgdG90KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CQURfTEVOR1RIKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfd3JpdGVfYnl0ZXMsIFNTTF9SX0JBRF9MRU5HVEgpOwogICAgIHJldHVybiAtMTsKICAgfQogCisgIGludCByZWNvcmRfc3BsaXRfZG9uZSA9IDA7CiAgIG4gPSAobGVuIC0gdG90KTsKICAgZm9yICg7OykgewogICAgIC8qIG1heCBjb250YWlucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZSBjYW4gcHV0IGludG8gYQogICAgICAqIHJlY29yZC4gKi8KICAgICB1bnNpZ25lZCBtYXggPSBzLT5tYXhfc2VuZF9mcmFnbWVudDsKKyAgICAvKiBmcmFnbWVudCBpcyB0cnVlIGlmIGRvX3NzbDNfd3JpdGUgc2hvdWxkIHNlbmQgdGhlIGZpcnN0IGJ5dGUgaW4gaXRzIG93bgorICAgICAqIHJlY29yZCBpbiBvcmRlciB0byByYW5kb21pc2UgYSBDQkMgSVYuICovCisgICAgaW50IGZyYWdtZW50ID0gMDsKKyAgICBpZiAoIXJlY29yZF9zcGxpdF9kb25lICYmIHMtPnMzLT5uZWVkX3JlY29yZF9zcGxpdHRpbmcgJiYKKyAgICAgICAgdHlwZSA9PSBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEpIHsKKyAgICAgIC8qIE9ubHkgdGhlIHRoZSBmaXJzdCByZWNvcmQgcGVyIHdyaXRlIGNhbGwgbmVlZHMgdG8gYmUgc3BsaXQuIFRoZQorICAgICAgICogcmVtYWluaW5nIHBsYWludGV4dCB3YXMgZGV0ZXJtaW5lZCBiZWZvcmUgdGhlIElWIHdhcyByYW5kb21pemVkLiAqLworICAgICAgZnJhZ21lbnQgPSAxOworICAgICAgcmVjb3JkX3NwbGl0X2RvbmUgPSAxOworICAgIH0KICAgICBpZiAobiA+IG1heCkgewogICAgICAgbncgPSBtYXg7CiAgICAgfSBlbHNlIHsKICAgICAgIG53ID0gbjsKICAgICB9CiAKLSAgICBpID0gZG9fc3NsM193cml0ZShzLCB0eXBlLCAmYnVmW3RvdF0sIG53KTsKKyAgICBpID0gZG9fc3NsM193cml0ZShzLCB0eXBlLCAmYnVmW3RvdF0sIG53LCBmcmFnbWVudCk7CiAgICAgaWYgKGkgPD0gMCkgewogICAgICAgcy0+czMtPndudW0gPSB0b3Q7CiAgICAgICByZXR1cm4gaTsKQEAgLTI0OSwxMCArNDc1LDY1IEBACiAgIH0KIH0KIAotLyogZG9fc3NsM193cml0ZSB3cml0ZXMgYW4gU1NMIHJlY29yZCBvZiB0aGUgZ2l2ZW4gdHlwZS4gKi8KLXN0YXRpYyBpbnQgZG9fc3NsM193cml0ZShTU0wgKnMsIGludCB0eXBlLCBjb25zdCB1aW50OF90ICpidWYsIHVuc2lnbmVkIGxlbikgewotICAvKiBJZiB0aGVyZSBpcyBzdGlsbCBkYXRhIGZyb20gdGhlIHByZXZpb3VzIHJlY29yZCwgZmx1c2ggaXQuICovCi0gIGlmIChzc2xfd3JpdGVfYnVmZmVyX2lzX3BlbmRpbmcocykpIHsKKy8qIHNzbDNfc2VhbF9yZWNvcmQgc2VhbHMgYSBuZXcgcmVjb3JkIG9mIHR5cGUgfHR5cGV8IGFuZCBwbGFpbnRleHQgfGlufCBhbmQKKyAqIHdyaXRlcyBpdCB0byB8b3V0fC4gQXQgbW9zdCB8bWF4X291dHwgYnl0ZXMgd2lsbCBiZSB3cml0dGVuLiBJdCByZXR1cm5zIG9uZQorICogb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gT24gc3VjY2VzcywgaXQgdXBkYXRlcyB0aGUgd3JpdGUgc2VxdWVuY2UKKyAqIG51bWJlci4gKi8KK3N0YXRpYyBpbnQgc3NsM19zZWFsX3JlY29yZChTU0wgKnMsIHVpbnQ4X3QgKm91dCwgc2l6ZV90ICpvdXRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtYXhfb3V0LCB1aW50OF90IHR5cGUsIGNvbnN0IHVpbnQ4X3QgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbl9sZW4pIHsKKyAgaWYgKG1heF9vdXQgPCBTU0wzX1JUX0hFQURFUl9MRU5HVEgpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfc2VhbF9yZWNvcmQsIFNTTF9SX0JVRkZFUl9UT09fU01BTEwpOworICAgIHJldHVybiAwOworICB9CisKKyAgb3V0WzBdID0gdHlwZTsKKworICAvKiBTb21lIHNlcnZlcnMgaGFuZyBpZiBpbml0aWFsIENsaWVudEhlbGxvIGlzIGxhcmdlciB0aGFuIDI1NiBieXRlcyBhbmQKKyAgICogcmVjb3JkIHZlcnNpb24gbnVtYmVyID4gVExTIDEuMC4gKi8KKyAgdWludDE2X3Qgd2lyZV92ZXJzaW9uID0gcy0+dmVyc2lvbjsKKyAgaWYgKCFzLT5zMy0+aGF2ZV92ZXJzaW9uICYmIHMtPnZlcnNpb24gPiBTU0wzX1ZFUlNJT04pIHsKKyAgICB3aXJlX3ZlcnNpb24gPSBUTFMxX1ZFUlNJT047CisgIH0KKyAgb3V0WzFdID0gd2lyZV92ZXJzaW9uID4+IDg7CisgIG91dFsyXSA9IHdpcmVfdmVyc2lvbiAmIDB4ZmY7CisKKyAgc2l6ZV90IGNpcGhlcnRleHRfbGVuOworICBpZiAoIVNTTF9BRUFEX0NUWF9zZWFsKHMtPmFlYWRfd3JpdGVfY3R4LCBvdXQgKyBTU0wzX1JUX0hFQURFUl9MRU5HVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmNpcGhlcnRleHRfbGVuLCBtYXhfb3V0IC0gU1NMM19SVF9IRUFERVJfTEVOR1RILAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHdpcmVfdmVyc2lvbiwgcy0+czMtPndyaXRlX3NlcXVlbmNlLCBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbl9sZW4pIHx8CisgICAgICAhc3NsM19yZWNvcmRfc2VxdWVuY2VfdXBkYXRlKHMtPnMzLT53cml0ZV9zZXF1ZW5jZSwgOCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChjaXBoZXJ0ZXh0X2xlbiA+PSAxIDw8IDE2KSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlYWxfcmVjb3JkLCBFUlJfUl9PVkVSRkxPVyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgb3V0WzNdID0gY2lwaGVydGV4dF9sZW4gPj4gODsKKyAgb3V0WzRdID0gY2lwaGVydGV4dF9sZW4gJiAweGZmOworCisgICpvdXRfbGVuID0gU1NMM19SVF9IRUFERVJfTEVOR1RIICsgY2lwaGVydGV4dF9sZW47CisKKyBpZiAocy0+bXNnX2NhbGxiYWNrKSB7CisgICBzLT5tc2dfY2FsbGJhY2soMSAvKiB3cml0ZSAqLywgMCwgU1NMM19SVF9IRUFERVIsIG91dCwgU1NMM19SVF9IRUFERVJfTEVOR1RILAorICAgICAgICAgICAgICAgICAgIHMsIHMtPm1zZ19jYWxsYmFja19hcmcpOworIH0KKworICByZXR1cm4gMTsKK30KKworLyogZG9fc3NsM193cml0ZSB3cml0ZXMgYW4gU1NMIHJlY29yZCBvZiB0aGUgZ2l2ZW4gdHlwZS4gSWYgfGZyYWdtZW50fCBpcyAxCisgKiB0aGVuIGl0IHNwbGl0cyB0aGUgcmVjb3JkIGludG8gYSBvbmUgYnl0ZSByZWNvcmQgYW5kIGEgcmVjb3JkIHdpdGggdGhlIHJlc3QKKyAqIG9mIHRoZSBkYXRhIGluIG9yZGVyIHRvIHJhbmRvbWlzZSBhIENCQyBJVi4gKi8KK3N0YXRpYyBpbnQgZG9fc3NsM193cml0ZShTU0wgKnMsIGludCB0eXBlLCBjb25zdCB1aW50OF90ICpidWYsIHVuc2lnbmVkIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcmFnbWVudCkgeworICBTU0wzX0JVRkZFUiAqd2IgPSAmcy0+czMtPndidWY7CisKKyAgLyogZmlyc3QgY2hlY2sgaWYgdGhlcmUgaXMgYSBTU0wzX0JVRkZFUiBzdGlsbCBiZWluZyB3cml0dGVuIG91dC4gVGhpcyB3aWxsCisgICAqIGhhcHBlbiB3aXRoIG5vbiBibG9ja2luZyBJTyAqLworICBpZiAod2ItPmxlZnQgIT0gMCkgewogICAgIHJldHVybiBzc2wzX3dyaXRlX3BlbmRpbmcocywgdHlwZSwgYnVmLCBsZW4pOwogICB9CiAKQEAgLTI2NSw1MyArNTQ2LDExMyBAQAogICAgIC8qIGlmIGl0IHdlbnQsIGZhbGwgdGhyb3VnaCBhbmQgc2VuZCBtb3JlIHN0dWZmICovCiAgIH0KIAotICBpZiAobGVuID4gU1NMM19SVF9NQVhfUExBSU5fTEVOR1RIKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgIGlmICh3Yi0+YnVmID09IE5VTEwgJiYgIXNzbDNfc2V0dXBfd3JpdGVfYnVmZmVyKHMpKSB7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKICAgaWYgKGxlbiA9PSAwKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KKyAgaWYgKGxlbiA9PSAxKSB7CisgICAgLyogTm8gc2Vuc2UgaW4gZnJhZ21lbnRpbmcgYSBvbmUtYnl0ZSByZWNvcmQuICovCisgICAgZnJhZ21lbnQgPSAwOworICB9CiAKLSAgc2l6ZV90IG1heF9vdXQgPSBsZW4gKyBzc2xfbWF4X3NlYWxfb3ZlcmhlYWQocyk7Ci0gIGlmIChtYXhfb3V0IDwgbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9PVkVSRkxPVyk7Ci0gICAgcmV0dXJuIC0xOworICAvKiBBbGlnbiB0aGUgb3V0cHV0IHNvIHRoZSBjaXBoZXJ0ZXh0IGlzIGFsaWduZWQgdG8gfFNTTDNfQUxJR05fUEFZTE9BRHwuICovCisgIHVpbnRwdHJfdCBhbGlnbjsKKyAgaWYgKGZyYWdtZW50KSB7CisgICAgLyogT25seSBDQkMtbW9kZSBjaXBoZXJzIHJlcXVpcmUgZnJhZ21lbnRpbmcuIENCQy1tb2RlIGNpcGhlcnRleHQgaXMgYQorICAgICAqIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplIHdoaWNoIHdlIG1heSBhc3N1bWUgaXMgYWxpZ25lZC4gVGh1cyB3ZSBvbmx5CisgICAgICogbmVlZCB0byBhY2NvdW50IGZvciBhIHNlY29uZCBjb3B5IG9mIHRoZSByZWNvcmQgaGVhZGVyLiAqLworICAgIGFsaWduID0gKHVpbnRwdHJfdCl3Yi0+YnVmICsgMiAqIFNTTDNfUlRfSEVBREVSX0xFTkdUSDsKKyAgfSBlbHNlIHsKKyAgICBhbGlnbiA9ICh1aW50cHRyX3Qpd2ItPmJ1ZiArIFNTTDNfUlRfSEVBREVSX0xFTkdUSDsKICAgfQotICB1aW50OF90ICpvdXQ7CisgIGFsaWduID0gKDAgLSBhbGlnbikgJiAoU1NMM19BTElHTl9QQVlMT0FEIC0gMSk7CisgIHVpbnQ4X3QgKm91dCA9IHdiLT5idWYgKyBhbGlnbjsKKyAgd2ItPm9mZnNldCA9IGFsaWduOworICBzaXplX3QgbWF4X291dCA9IHdiLT5sZW4gLSB3Yi0+b2Zmc2V0OworCisgIGNvbnN0IHVpbnQ4X3QgKm9yaWdfYnVmID0gYnVmOworICB1bnNpZ25lZCBpbnQgb3JpZ19sZW4gPSBsZW47CisgIHNpemVfdCBmcmFnbWVudF9sZW4gPSAwOworICBpZiAoZnJhZ21lbnQpIHsKKyAgICAvKiBXcml0ZSB0aGUgZmlyc3QgYnl0ZSBpbiBpdHMgb3duIHJlY29yZCBhcyBhIGNvdW50ZXJtZWFzdXJlIGFnYWluc3QKKyAgICAgKiBrbm93bi1JViB3ZWFrbmVzc2VzIGluIENCQyBjaXBoZXJzdWl0ZXMuIChTZWUKKyAgICAgKiBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35ib2RvL3Rscy1jYmMudHh0LikgKi8KKyAgICBpZiAoIXNzbDNfc2VhbF9yZWNvcmQocywgb3V0LCAmZnJhZ21lbnRfbGVuLCBtYXhfb3V0LCB0eXBlLCBidWYsIDEpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG91dCArPSBmcmFnbWVudF9sZW47CisgICAgbWF4X291dCAtPSBmcmFnbWVudF9sZW47CisgICAgYnVmKys7CisgICAgbGVuLS07CisgIH0KKworICBhc3NlcnQoKCgodWludHB0cl90KW91dCArIFNTTDNfUlRfSEVBREVSX0xFTkdUSCkgJiAoU1NMM19BTElHTl9QQVlMT0FEIC0gMSkpCisgICAgICAgICA9PSAwKTsKICAgc2l6ZV90IGNpcGhlcnRleHRfbGVuOwotICBpZiAoIXNzbF93cml0ZV9idWZmZXJfaW5pdChzLCAmb3V0LCBtYXhfb3V0KSB8fAotICAgICAgIXRsc19zZWFsX3JlY29yZChzLCBvdXQsICZjaXBoZXJ0ZXh0X2xlbiwgbWF4X291dCwgdHlwZSwgYnVmLCBsZW4pKSB7CisgIGlmICghc3NsM19zZWFsX3JlY29yZChzLCBvdXQsICZjaXBoZXJ0ZXh0X2xlbiwgbWF4X291dCwgdHlwZSwgYnVmLCBsZW4pKSB7CiAgICAgcmV0dXJuIC0xOwogICB9Ci0gIHNzbF93cml0ZV9idWZmZXJfc2V0X2xlbihzLCBjaXBoZXJ0ZXh0X2xlbik7CisgIGNpcGhlcnRleHRfbGVuICs9IGZyYWdtZW50X2xlbjsKKworICAvKiBub3cgbGV0J3Mgc2V0IHVwIHdiICovCisgIHdiLT5sZWZ0ID0gY2lwaGVydGV4dF9sZW47CiAKICAgLyogbWVtb3JpemUgYXJndW1lbnRzIHNvIHRoYXQgc3NsM193cml0ZV9wZW5kaW5nIGNhbiBkZXRlY3QgYmFkIHdyaXRlIHJldHJpZXMKICAgICogbGF0ZXIgKi8KLSAgcy0+czMtPndwZW5kX3RvdCA9IGxlbjsKLSAgcy0+czMtPndwZW5kX2J1ZiA9IGJ1ZjsKKyAgcy0+czMtPndwZW5kX3RvdCA9IG9yaWdfbGVuOworICBzLT5zMy0+d3BlbmRfYnVmID0gb3JpZ19idWY7CiAgIHMtPnMzLT53cGVuZF90eXBlID0gdHlwZTsKLSAgcy0+czMtPndwZW5kX3JldCA9IGxlbjsKKyAgcy0+czMtPndwZW5kX3JldCA9IG9yaWdfbGVuOwogCiAgIC8qIHdlIG5vdyBqdXN0IG5lZWQgdG8gd3JpdGUgdGhlIGJ1ZmZlciAqLwotICByZXR1cm4gc3NsM193cml0ZV9wZW5kaW5nKHMsIHR5cGUsIGJ1ZiwgbGVuKTsKKyAgcmV0dXJuIHNzbDNfd3JpdGVfcGVuZGluZyhzLCB0eXBlLCBvcmlnX2J1Ziwgb3JpZ19sZW4pOwogfQogCisvKiBpZiBzLT5zMy0+d2J1Zi5sZWZ0ICE9IDAsIHdlIG5lZWQgdG8gY2FsbCB0aGlzICovCiBpbnQgc3NsM193cml0ZV9wZW5kaW5nKFNTTCAqcywgaW50IHR5cGUsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikgeworICBpbnQgaTsKKyAgU1NMM19CVUZGRVIgKndiID0gJihzLT5zMy0+d2J1Zik7CisKICAgaWYgKHMtPnMzLT53cGVuZF90b3QgPiAoaW50KWxlbiB8fAogICAgICAgKHMtPnMzLT53cGVuZF9idWYgIT0gYnVmICYmCiAgICAgICAgIShzLT5tb2RlICYgU1NMX01PREVfQUNDRVBUX01PVklOR19XUklURV9CVUZGRVIpKSB8fAogICAgICAgcy0+czMtPndwZW5kX3R5cGUgIT0gdHlwZSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfQkFEX1dSSVRFX1JFVFJZKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfd3JpdGVfcGVuZGluZywgU1NMX1JfQkFEX1dSSVRFX1JFVFJZKTsKICAgICByZXR1cm4gLTE7CiAgIH0KIAotICBpbnQgcmV0ID0gc3NsX3dyaXRlX2J1ZmZlcl9mbHVzaChzKTsKLSAgaWYgKHJldCA8PSAwKSB7Ci0gICAgcmV0dXJuIHJldDsKKyAgZm9yICg7OykgeworICAgIEVSUl9jbGVhcl9zeXN0ZW1fZXJyb3IoKTsKKyAgICBpZiAocy0+d2JpbyAhPSBOVUxMKSB7CisgICAgICBzLT5yd3N0YXRlID0gU1NMX1dSSVRJTkc7CisgICAgICBpID0gQklPX3dyaXRlKHMtPndiaW8sIChjaGFyICopJih3Yi0+YnVmW3diLT5vZmZzZXRdKSwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCl3Yi0+bGVmdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM193cml0ZV9wZW5kaW5nLCBTU0xfUl9CSU9fTk9UX1NFVCk7CisgICAgICBpID0gLTE7CisgICAgfQorICAgIGlmIChpID09IHdiLT5sZWZ0KSB7CisgICAgICB3Yi0+bGVmdCA9IDA7CisgICAgICB3Yi0+b2Zmc2V0ICs9IGk7CisgICAgICBzc2wzX3JlbGVhc2Vfd3JpdGVfYnVmZmVyKHMpOworICAgICAgcy0+cndzdGF0ZSA9IFNTTF9OT1RISU5HOworICAgICAgcmV0dXJuIHMtPnMzLT53cGVuZF9yZXQ7CisgICAgfSBlbHNlIGlmIChpIDw9IDApIHsKKyAgICAgIGlmIChTU0xfSVNfRFRMUyhzKSkgeworICAgICAgICAvKiBGb3IgRFRMUywganVzdCBkcm9wIGl0LiBUaGF0J3Mga2luZCBvZiB0aGUgd2hvbGUgcG9pbnQgaW4KKyAgICAgICAgICogdXNpbmcgYSBkYXRhZ3JhbSBzZXJ2aWNlICovCisgICAgICAgIHdiLT5sZWZ0ID0gMDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgICAvKiBUT0RPKGRhdmlkYmVuKTogVGhpcyBjb2RlcGF0aCBpcyB1c2VkIGluIERUTFMsIGJ1dCB0aGUgd3JpdGUKKyAgICAgKiBwYXlsb2FkIG1heSBub3Qgc3BsaXQgYWNyb3NzIHBhY2tldHMuICovCisgICAgd2ItPm9mZnNldCArPSBpOworICAgIHdiLT5sZWZ0IC09IGk7CiAgIH0KLSAgcmV0dXJuIHMtPnMzLT53cGVuZF9yZXQ7CiB9CiAKIC8qIHNzbDNfZXhwZWN0X2NoYW5nZV9jaXBoZXJfc3BlYyBpbmZvcm1zIHRoZSByZWNvcmQgbGF5ZXIgdGhhdCBhCkBAIC0zMjEsNyArNjYyLDggQEAKICAqIGZ1bmN0aW9uIHJldHVybnMgemVyby4gT3RoZXJ3aXNlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBvbmUuICovCiBpbnQgc3NsM19leHBlY3RfY2hhbmdlX2NpcGhlcl9zcGVjKFNTTCAqcykgewogICBpZiAocy0+czMtPmhhbmRzaGFrZV9mcmFnbWVudF9sZW4gPiAwIHx8IHMtPnMzLT50bXAucmV1c2VfbWVzc2FnZSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfVU5QUk9DRVNTRURfSEFORFNIQUtFX0RBVEEpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19leHBlY3RfY2hhbmdlX2NpcGhlcl9zcGVjLAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1VOUFJPQ0VTU0VEX0hBTkRTSEFLRV9EQVRBKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0zNzIsNyArNzE0LDcgQEAKIAogICBpZiAoKHR5cGUgJiYgdHlwZSAhPSBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEgJiYgdHlwZSAhPSBTU0wzX1JUX0hBTkRTSEFLRSkgfHwKICAgICAgIChwZWVrICYmIHR5cGUgIT0gU1NMM19SVF9BUFBMSUNBVElPTl9EQVRBKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19yZWFkX2J5dGVzLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKQEAgLTQxMSw3ICs3NTMsNyBAQAogICAgICAgcmV0dXJuIGk7CiAgICAgfQogICAgIGlmIChpID09IDApIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfU1NMX0hBTkRTSEFLRV9GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19yZWFkX2J5dGVzLCBTU0xfUl9TU0xfSEFORFNIQUtFX0ZBSUxVUkUpOwogICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgfQpAQCAtNDI2LDcgKzc2OCw3IEBACiAgIHJyID0gJnMtPnMzLT5ycmVjOwogCiAgIC8qIGdldCBuZXcgcGFja2V0IGlmIG5lY2Vzc2FyeSAqLwotICBpZiAocnItPmxlbmd0aCA9PSAwKSB7CisgIGlmIChyci0+bGVuZ3RoID09IDAgfHwgcy0+cnN0YXRlID09IFNTTF9TVF9SRUFEX0JPRFkpIHsKICAgICByZXQgPSBzc2wzX2dldF9yZWNvcmQocyk7CiAgICAgaWYgKHJldCA8PSAwKSB7CiAgICAgICByZXR1cm4gcmV0OwpAQCAtNDQwLDcgKzc4Miw4IEBACiAgIGlmIChzLT5zMy0+Y2hhbmdlX2NpcGhlcl9zcGVjICYmIHJyLT50eXBlICE9IFNTTDNfUlRfSEFORFNIQUtFICYmCiAgICAgICByci0+dHlwZSAhPSBTU0wzX1JUX0FMRVJUKSB7CiAgICAgYWwgPSBTU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfREFUQV9CRVRXRUVOX0NDU19BTkRfRklOSVNIRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19yZWFkX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX0RBVEFfQkVUV0VFTl9DQ1NfQU5EX0ZJTklTSEVEKTsKICAgICBnb3RvIGZfZXJyOwogICB9CiAKQEAgLTQ0OCw3ICs3OTEsNyBAQAogICAgKiBIYW5kc2hha2UgcmVjb3JkLiAqLwogICBpZiAocnItPnR5cGUgPT0gU1NMM19SVF9IQU5EU0hBS0UgJiYgKHMtPnMzLT5mbGFncyAmIFNTTDNfRkxBR1NfRVhQRUNUX0NDUykpIHsKICAgICBhbCA9IFNTTF9BRF9VTkVYUEVDVEVEX01FU1NBR0U7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9IQU5EU0hBS0VfUkVDT1JEX0JFRk9SRV9DQ1MpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19yZWFkX2J5dGVzLCBTU0xfUl9IQU5EU0hBS0VfUkVDT1JEX0JFRk9SRV9DQ1MpOwogICAgIGdvdG8gZl9lcnI7CiAgIH0KIApAQCAtNDYwLDkgKzgwMyw3IEBACiAgICAgcmV0dXJuIDA7CiAgIH0KIAotICBpZiAodHlwZSAhPSAwICYmIHR5cGUgPT0gcnItPnR5cGUpIHsKLSAgICBzLT5zMy0+d2FybmluZ19hbGVydF9jb3VudCA9IDA7Ci0KKyAgaWYgKHR5cGUgPT0gcnItPnR5cGUpIHsKICAgICAvKiBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEgb3IgU1NMM19SVF9IQU5EU0hBS0UgKi8KICAgICAvKiBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgbm90IGdldHRpbmcgYXBwbGljYXRpb24gZGF0YSB3aGVuIHdlIGFyZSBkb2luZyBhCiAgICAgICogaGFuZHNoYWtlIGZvciB0aGUgZmlyc3QgdGltZSAqLwpAQCAtNDcxLDE1ICs4MTIsMTAgQEAKICAgICAgIC8qIFRPRE8oZGF2aWRiZW4pOiBJcyB0aGlzIGNoZWNrIHJlZHVuZGFudCB3aXRoIHRoZSBoYW5kc2hha2VfZnVuYwogICAgICAgICogY2hlY2s/ICovCiAgICAgICBhbCA9IFNTTF9BRF9VTkVYUEVDVEVEX01FU1NBR0U7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0FQUF9EQVRBX0lOX0hBTkRTSEFLRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfcmVhZF9ieXRlcywgU1NMX1JfQVBQX0RBVEFfSU5fSEFORFNIQUtFKTsKICAgICAgIGdvdG8gZl9lcnI7CiAgICAgfQogCi0gICAgLyogRGlzY2FyZCBlbXB0eSByZWNvcmRzLiAqLwotICAgIGlmIChyci0+bGVuZ3RoID09IDApIHsKLSAgICAgIGdvdG8gc3RhcnQ7Ci0gICAgfQotCiAgICAgaWYgKGxlbiA8PSAwKSB7CiAgICAgICByZXR1cm4gbGVuOwogICAgIH0KQEAgLTQ5NSw5ICs4MzEsMTEgQEAKICAgICAgIHJyLT5sZW5ndGggLT0gbjsKICAgICAgIHJyLT5vZmYgKz0gbjsKICAgICAgIGlmIChyci0+bGVuZ3RoID09IDApIHsKKyAgICAgICAgcy0+cnN0YXRlID0gU1NMX1NUX1JFQURfSEVBREVSOwogICAgICAgICByci0+b2ZmID0gMDsKLSAgICAgICAgLyogVGhlIHJlY29yZCBoYXMgYmVlbiBjb25zdW1lZCwgc28gd2UgbWF5IG5vdyBjbGVhciB0aGUgYnVmZmVyLiAqLwotICAgICAgICBzc2xfcmVhZF9idWZmZXJfZGlzY2FyZChzKTsKKyAgICAgICAgaWYgKHMtPnMzLT5yYnVmLmxlZnQgPT0gMCkgeworICAgICAgICAgIHNzbDNfcmVsZWFzZV9yZWFkX2J1ZmZlcihzKTsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KIApAQCAtNTExLDcgKzg0OSw3IEBACiAgICAgICogYXJlIGZhdGFsLiBSZW5lZ290aWF0aW9ucyBhcyBhIHNlcnZlciBhcmUgbmV2ZXIgc3VwcG9ydGVkLiAqLwogICAgIGlmICghcy0+YWNjZXB0X3BlZXJfcmVuZWdvdGlhdGlvbnMgfHwgcy0+c2VydmVyKSB7CiAgICAgICBhbCA9IFNTTF9BRF9OT19SRU5FR09USUFUSU9OOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9OT19SRU5FR09USUFUSU9OKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19yZWFkX2J5dGVzLCBTU0xfUl9OT19SRU5FR09USUFUSU9OKTsKICAgICAgIGdvdG8gZl9lcnI7CiAgICAgfQogCkBAIC01MzQsNyArODcyLDcgQEAKICAgICAgICAgcy0+czMtPmhhbmRzaGFrZV9mcmFnbWVudFsyXSAhPSAwIHx8CiAgICAgICAgIHMtPnMzLT5oYW5kc2hha2VfZnJhZ21lbnRbM10gIT0gMCkgewogICAgICAgYWwgPSBTU0xfQURfREVDT0RFX0VSUk9SOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CQURfSEVMTE9fUkVRVUVTVCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfcmVhZF9ieXRlcywgU1NMX1JfQkFEX0hFTExPX1JFUVVFU1QpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAgICAgcy0+czMtPmhhbmRzaGFrZV9mcmFnbWVudF9sZW4gPSAwOwpAQCAtNTQ4LDcgKzg4Niw3IEBACiAgICAgICAvKiBUaGlzIGNhbm5vdCBoYXBwZW4uIElmIGEgaGFuZHNoYWtlIGlzIGluIHByb2dyZXNzLCB8dHlwZXwgbXVzdCBiZQogICAgICAgICogfFNTTDNfUlRfSEFORFNIQUtFfC4gKi8KICAgICAgIGFzc2VydCgwKTsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3JlYWRfYnl0ZXMsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtNTU2LDkgKzg5NCw5IEBACiAgICAgICogcHJvdG9jb2wsIG5hbWVseSBpbiBIVFRQUywganVzdCBiZWZvcmUgcmVhZGluZyB0aGUgSFRUUCByZXNwb25zZS4gUmVxdWlyZQogICAgICAqIHRoZSByZWNvcmQtbGF5ZXIgYmUgaWRsZSBhbmQgYXZvaWQgY29tcGxleGl0aWVzIG9mIHNlbmRpbmcgYSBoYW5kc2hha2UKICAgICAgKiByZWNvcmQgd2hpbGUgYW4gYXBwbGljYXRpb25fZGF0YSByZWNvcmQgaXMgYmVpbmcgd3JpdHRlbi4gKi8KLSAgICBpZiAoc3NsX3dyaXRlX2J1ZmZlcl9pc19wZW5kaW5nKHMpKSB7CisgICAgaWYgKHMtPnMzLT53YnVmLmxlZnQgIT0gMCB8fCBzLT5zMy0+cmJ1Zi5sZWZ0ICE9IDApIHsKICAgICAgIGFsID0gU1NMX0FEX05PX1JFTkVHT1RJQVRJT047Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX05PX1JFTkVHT1RJQVRJT04pOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3JlYWRfYnl0ZXMsIFNTTF9SX05PX1JFTkVHT1RJQVRJT04pOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAKQEAgLTU2OSw3ICs5MDcsNyBAQAogICAgICAgcmV0dXJuIGk7CiAgICAgfQogICAgIGlmIChpID09IDApIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfU1NMX0hBTkRTSEFLRV9GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19yZWFkX2J5dGVzLCBTU0xfUl9TU0xfSEFORFNIQUtFX0ZBSUxVUkUpOwogICAgICAgcmV0dXJuIC0xOwogICAgIH0KIApAQCAtNTgzLDcgKzkyMSw3IEBACiAgICAgLyogQWxlcnRzIG1heSBub3QgYmUgZnJhZ21lbnRlZC4gKi8KICAgICBpZiAocnItPmxlbmd0aCA8IDIpIHsKICAgICAgIGFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfQkFEX0FMRVJUKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19yZWFkX2J5dGVzLCBTU0xfUl9CQURfQUxFUlQpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAKQEAgLTYyMiwxNCArOTYwLDcgQEAKICAgICAgICAqIHBlZXIgcmVmdXNlZCBpdCB3aGVyZSB3ZSBjYXJyeSBvbi4gKi8KICAgICAgIGVsc2UgaWYgKGFsZXJ0X2Rlc2NyID09IFNTTF9BRF9OT19SRU5FR09USUFUSU9OKSB7CiAgICAgICAgIGFsID0gU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOwotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX05PX1JFTkVHT1RJQVRJT04pOwotICAgICAgICBnb3RvIGZfZXJyOwotICAgICAgfQotCi0gICAgICBzLT5zMy0+d2FybmluZ19hbGVydF9jb3VudCsrOwotICAgICAgaWYgKHMtPnMzLT53YXJuaW5nX2FsZXJ0X2NvdW50ID4ga01heFdhcm5pbmdBbGVydHMpIHsKLSAgICAgICAgYWwgPSBTU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFOwotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1RPT19NQU5ZX1dBUk5JTkdfQUxFUlRTKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3JlYWRfYnl0ZXMsIFNTTF9SX05PX1JFTkVHT1RJQVRJT04pOwogICAgICAgICBnb3RvIGZfZXJyOwogICAgICAgfQogICAgIH0gZWxzZSBpZiAoYWxlcnRfbGV2ZWwgPT0gU1NMM19BTF9GQVRBTCkgewpAQCAtNjM3LDcgKzk2OCw4IEBACiAKICAgICAgIHMtPnJ3c3RhdGUgPSBTU0xfTk9USElORzsKICAgICAgIHMtPnMzLT5mYXRhbF9hbGVydCA9IGFsZXJ0X2Rlc2NyOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfQURfUkVBU09OX09GRlNFVCArIGFsZXJ0X2Rlc2NyKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19yZWFkX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgU1NMX0FEX1JFQVNPTl9PRkZTRVQgKyBhbGVydF9kZXNjcik7CiAgICAgICBCSU9fc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIiVkIiwgYWxlcnRfZGVzY3IpOwogICAgICAgRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJTU0wgYWxlcnQgbnVtYmVyICIsIHRtcCk7CiAgICAgICBzLT5zaHV0ZG93biB8PSBTU0xfUkVDRUlWRURfU0hVVERPV047CkBAIC02NDUsNyArOTc3LDcgQEAKICAgICAgIHJldHVybiAwOwogICAgIH0gZWxzZSB7CiAgICAgICBhbCA9IFNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfVU5LTk9XTl9BTEVSVF9UWVBFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19yZWFkX2J5dGVzLCBTU0xfUl9VTktOT1dOX0FMRVJUX1RZUEUpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAKQEAgLTY1Myw5ICs5ODUsMTAgQEAKICAgfQogCiAgIGlmIChzLT5zaHV0ZG93biAmIFNTTF9TRU5UX1NIVVRET1dOKSB7Ci0gICAgLyogY2xvc2Vfbm90aWZ5IGhhcyBiZWVuIHNlbnQsIHNvIGRpc2NhcmQgYWxsIHJlY29yZHMgb3RoZXIgdGhhbiBhbGVydHMuICovCisgICAgLyogYnV0IHdlIGhhdmUgbm90IHJlY2VpdmVkIGEgc2h1dGRvd24gKi8KKyAgICBzLT5yd3N0YXRlID0gU1NMX05PVEhJTkc7CiAgICAgcnItPmxlbmd0aCA9IDA7Ci0gICAgZ290byBzdGFydDsKKyAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChyci0+dHlwZSA9PSBTU0wzX1JUX0NIQU5HRV9DSVBIRVJfU1BFQykgewpAQCAtNjYzLDIwICs5OTYsMjAgQEAKICAgICAgKiByZWNvcmQgcGF5bG9hZCBoYXMgdG8gbG9vayBsaWtlICovCiAgICAgaWYgKHJyLT5sZW5ndGggIT0gMSB8fCByci0+b2ZmICE9IDAgfHwgcnItPmRhdGFbMF0gIT0gU1NMM19NVF9DQ1MpIHsKICAgICAgIGFsID0gU1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CQURfQ0hBTkdFX0NJUEhFUl9TUEVDKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19yZWFkX2J5dGVzLCBTU0xfUl9CQURfQ0hBTkdFX0NJUEhFUl9TUEVDKTsKICAgICAgIGdvdG8gZl9lcnI7CiAgICAgfQogCiAgICAgLyogQ2hlY2sgd2UgaGF2ZSBhIGNpcGhlciB0byBjaGFuZ2UgdG8gKi8KICAgICBpZiAocy0+czMtPnRtcC5uZXdfY2lwaGVyID09IE5VTEwpIHsKICAgICAgIGFsID0gU1NMX0FEX1VORVhQRUNURURfTUVTU0FHRTsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfQ0NTX1JFQ0VJVkVEX0VBUkxZKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19yZWFkX2J5dGVzLCBTU0xfUl9DQ1NfUkVDRUlWRURfRUFSTFkpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAKICAgICBpZiAoIShzLT5zMy0+ZmxhZ3MgJiBTU0wzX0ZMQUdTX0VYUEVDVF9DQ1MpKSB7CiAgICAgICBhbCA9IFNTTF9BRF9VTkVYUEVDVEVEX01FU1NBR0U7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0NDU19SRUNFSVZFRF9FQVJMWSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfcmVhZF9ieXRlcywgU1NMX1JfQ0NTX1JFQ0VJVkVEX0VBUkxZKTsKICAgICAgIGdvdG8gZl9lcnI7CiAgICAgfQogCkBAIC03MDIsNyArMTAzNSw3IEBACiAgICAgICAgICByci0+dHlwZSAhPSBTU0wzX1JUX0hBTkRTSEFLRSk7CiAKICAgYWwgPSBTU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFOwotICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1VORVhQRUNURURfUkVDT1JEKTsKKyAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3JlYWRfYnl0ZXMsIFNTTF9SX1VORVhQRUNURURfUkVDT1JEKTsKIAogZl9lcnI6CiAgIHNzbDNfc2VuZF9hbGVydChzLCBTU0wzX0FMX0ZBVEFMLCBhbCk7CkBAIC03MjIsNyArMTA1NSw4IEBACiAgIGlmIChzLT5zMy0+dG1wLmtleV9ibG9jayA9PSBOVUxMKSB7CiAgICAgaWYgKHMtPnNlc3Npb24gPT0gTlVMTCB8fCBzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5X2xlbmd0aCA9PSAwKSB7CiAgICAgICAvKiBtaWdodCBoYXBwZW4gaWYgZHRsczFfcmVhZF9ieXRlcygpIGNhbGxzIHRoaXMgKi8KLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfQ0NTX1JFQ0VJVkVEX0VBUkxZKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19kb19jaGFuZ2VfY2lwaGVyX3NwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9DQ1NfUkVDRUlWRURfRUFSTFkpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC03NTgsOSArMTA5Miw4IEBACiAgIHMtPnMzLT5hbGVydF9kaXNwYXRjaCA9IDE7CiAgIHMtPnMzLT5zZW5kX2FsZXJ0WzBdID0gbGV2ZWw7CiAgIHMtPnMzLT5zZW5kX2FsZXJ0WzFdID0gZGVzYzsKLSAgaWYgKCFzc2xfd3JpdGVfYnVmZmVyX2lzX3BlbmRpbmcocykpIHsKLSAgICAvKiBOb3RoaW5nIGlzIGJlaW5nIHdyaXR0ZW4gb3V0LCBzbyB0aGUgYWxlcnQgbWF5IGJlIGRpc3BhdGNoZWQKLSAgICAgKiBpbW1lZGlhdGVseS4gKi8KKyAgaWYgKHMtPnMzLT53YnVmLmxlZnQgPT0gMCkgeworICAgIC8qIGRhdGEgaXMgc3RpbGwgYmVpbmcgd3JpdHRlbiBvdXQuICovCiAgICAgcmV0dXJuIHMtPm1ldGhvZC0+c3NsX2Rpc3BhdGNoX2FsZXJ0KHMpOwogICB9CiAKQEAgLTc3NCw3ICsxMTA3LDcgQEAKICAgdm9pZCAoKmNiKShjb25zdCBTU0wgKnNzbCwgaW50IHR5cGUsIGludCB2YWwpID0gTlVMTDsKIAogICBzLT5zMy0+YWxlcnRfZGlzcGF0Y2ggPSAwOwotICBpID0gZG9fc3NsM193cml0ZShzLCBTU0wzX1JUX0FMRVJULCAmcy0+czMtPnNlbmRfYWxlcnRbMF0sIDIpOworICBpID0gZG9fc3NsM193cml0ZShzLCBTU0wzX1JUX0FMRVJULCAmcy0+czMtPnNlbmRfYWxlcnRbMF0sIDIsIDApOwogICBpZiAoaSA8PSAwKSB7CiAgICAgcy0+czMtPmFsZXJ0X2Rpc3BhdGNoID0gMTsKICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3NyYy9zc2wvczNfc3J2ci5jIGIvc3JjL3NzbC9zM19zcnZyLmMKaW5kZXggYjQyODA0My4uYTcyZTE3ZSAxMDA2NDQKLS0tIGEvc3JjL3NzbC9zM19zcnZyLmMKKysrIGIvc3JjL3NzbC9zM19zcnZyLmMKQEAgLTE0Niw4ICsxNDYsNiBAQAogICogT1RIRVIgRU5USVRZIEJBU0VEIE9OIElORlJJTkdFTUVOVCBPRiBJTlRFTExFQ1RVQUwgUFJPUEVSVFkgUklHSFRTIE9SCiAgKiBPVEhFUldJU0UuICovCiAKLSNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgotCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTE3NCw2ICsxNzIsMTAgQEAKICNpbmNsdWRlICIuLi9jcnlwdG8vZGgvaW50ZXJuYWwuaCIKIAogCisvKiBJTklUSUFMX1NOSUZGX0JVRkZFUl9TSVpFIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpbiB0aGUgaW5pdGlhbCBzbmlmZgorICogYnVmZmVyLiAqLworI2RlZmluZSBJTklUSUFMX1NOSUZGX0JVRkZFUl9TSVpFIDgKKwogaW50IHNzbDNfYWNjZXB0KFNTTCAqcykgewogICBCVUZfTUVNICpidWYgPSBOVUxMOwogICB1aW50MzJfdCBhbGdfYTsKQEAgLTE5Nyw3ICsxOTksNyBAQAogICBzLT5pbl9oYW5kc2hha2UrKzsKIAogICBpZiAocy0+Y2VydCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9OT19DRVJUSUZJQ0FURV9TRVQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19hY2NlcHQsIFNTTF9SX05PX0NFUlRJRklDQVRFX1NFVCk7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKQEAgLTIyOCw4ICsyMzAsOCBAQAogICAgICAgICAgIGdvdG8gZW5kOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFzc2wzX2luaXRfaGFuZHNoYWtlX2J1ZmZlcihzKSkgewotICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICBpZiAoIXNzbDNfaW5pdF9maW5pc2hlZF9tYWMocykpIHsKKyAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfYWNjZXB0LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICAgICAgcmV0ID0gLTE7CiAgICAgICAgICAgZ290byBlbmQ7CiAgICAgICAgIH0KQEAgLTMwOCwxOSArMzEwLDggQEAKICAgICAgICAgcy0+aW5pdF9udW0gPSAwOwogICAgICAgICBicmVhazsKIAotICAgICAgY2FzZSBTU0wzX1NUX1NXX0NFUlRfU1RBVFVTX0E6Ci0gICAgICBjYXNlIFNTTDNfU1RfU1dfQ0VSVF9TVEFUVVNfQjoKLSAgICAgICAgcmV0ID0gc3NsM19zZW5kX2NlcnRpZmljYXRlX3N0YXR1cyhzKTsKLSAgICAgICAgaWYgKHJldCA8PSAwKSB7Ci0gICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgcy0+c3RhdGUgPSBTU0wzX1NUX1NXX0tFWV9FWENIX0E7Ci0gICAgICAgIHMtPmluaXRfbnVtID0gMDsKLSAgICAgICAgYnJlYWs7Ci0KICAgICAgIGNhc2UgU1NMM19TVF9TV19LRVlfRVhDSF9BOgogICAgICAgY2FzZSBTU0wzX1NUX1NXX0tFWV9FWENIX0I6Ci0gICAgICBjYXNlIFNTTDNfU1RfU1dfS0VZX0VYQ0hfQzoKICAgICAgICAgYWxnX2EgPSBzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9hdXRoOwogCiAgICAgICAgIC8qIFNlbmQgYSBTZXJ2ZXJLZXlFeGNoYW5nZSBtZXNzYWdlIGlmOgpAQCAtNDgyLDcgKzQ3Myw3IEBACiAgICAgICAgIC8qIElmIHRoaXMgaXMgYSBmdWxsIGhhbmRzaGFrZSB3aXRoIENoYW5uZWxJRCB0aGVuIHJlY29yZCB0aGUgaGFzaHNoYWtlCiAgICAgICAgICAqIGhhc2hlcyBpbiB8cy0+c2Vzc2lvbnwgaW4gY2FzZSB3ZSBuZWVkIHRoZW0gdG8gdmVyaWZ5IGEgQ2hhbm5lbElECiAgICAgICAgICAqIHNpZ25hdHVyZSBvbiBhIHJlc3VtcHRpb24gb2YgdGhpcyBzZXNzaW9uIGluIHRoZSBmdXR1cmUuICovCi0gICAgICAgIGlmICghcy0+aGl0KSB7CisgICAgICAgIGlmICghcy0+aGl0ICYmIHMtPnMzLT50bHNleHRfY2hhbm5lbF9pZF9uZXcpIHsKICAgICAgICAgICByZXQgPSB0bHMxX3JlY29yZF9oYW5kc2hha2VfaGFzaGVzX2Zvcl9jaGFubmVsX2lkKHMpOwogICAgICAgICAgIGlmIChyZXQgPD0gMCkgewogICAgICAgICAgICAgZ290byBlbmQ7CkBAIC01NTksOCArNTUwLDYgQEAKICAgICAgICAgaWYgKHMtPmN0eC0+cmV0YWluX29ubHlfc2hhMjU2X29mX2NsaWVudF9jZXJ0cykgewogICAgICAgICAgIFg1MDlfZnJlZShzLT5zZXNzaW9uLT5wZWVyKTsKICAgICAgICAgICBzLT5zZXNzaW9uLT5wZWVyID0gTlVMTDsKLSAgICAgICAgICBza19YNTA5X3BvcF9mcmVlKHMtPnNlc3Npb24tPmNlcnRfY2hhaW4sIFg1MDlfZnJlZSk7Ci0gICAgICAgICAgcy0+c2Vzc2lvbi0+Y2VydF9jaGFpbiA9IE5VTEw7CiAgICAgICAgIH0KIAogICAgICAgICBzLT5zMy0+aW5pdGlhbF9oYW5kc2hha2VfY29tcGxldGUgPSAxOwpAQCAtNTc1LDcgKzU2NCw3IEBACiAgICAgICAgIGdvdG8gZW5kOwogCiAgICAgICBkZWZhdWx0OgotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1VOS05PV05fU1RBVEUpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfYWNjZXB0LCBTU0xfUl9VTktOT1dOX1NUQVRFKTsKICAgICAgICAgcmV0ID0gLTE7CiAgICAgICAgIGdvdG8gZW5kOwogICAgIH0KQEAgLTU5OCwxNiArNTg3LDQyIEBACiAgIHJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgc3NsM19yZWFkX3NuaWZmX2J1ZmZlcihTU0wgKnMsIHNpemVfdCBuKSB7CisgIGlmIChzLT5zMy0+c25pZmZfYnVmZmVyID09IE5VTEwpIHsKKyAgICBzLT5zMy0+c25pZmZfYnVmZmVyID0gQlVGX01FTV9uZXcoKTsKKyAgfQorICBpZiAocy0+czMtPnNuaWZmX2J1ZmZlciA9PSBOVUxMIHx8ICFCVUZfTUVNX2dyb3cocy0+czMtPnNuaWZmX2J1ZmZlciwgbikpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICB3aGlsZSAocy0+czMtPnNuaWZmX2J1ZmZlcl9sZW4gPCBuKSB7CisgICAgaW50IHJldDsKKworICAgIHMtPnJ3c3RhdGUgPSBTU0xfUkVBRElORzsKKyAgICByZXQgPSBCSU9fcmVhZChzLT5yYmlvLCBzLT5zMy0+c25pZmZfYnVmZmVyLT5kYXRhICsgcy0+czMtPnNuaWZmX2J1ZmZlcl9sZW4sCisgICAgICAgICAgICAgICAgICAgbiAtIHMtPnMzLT5zbmlmZl9idWZmZXJfbGVuKTsKKyAgICBpZiAocmV0IDw9IDApIHsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHMtPnJ3c3RhdGUgPSBTU0xfTk9USElORzsKKyAgICBzLT5zMy0+c25pZmZfYnVmZmVyX2xlbiArPSByZXQ7CisgIH0KKworICByZXR1cm4gMTsKK30KKwogaW50IHNzbDNfZ2V0X2luaXRpYWxfYnl0ZXMoU1NMICpzKSB7Ci0gIC8qIFJlYWQgdGhlIGZpcnN0IDUgYnl0ZXMsIHRoZSBzaXplIG9mIHRoZSBUTFMgcmVjb3JkIGhlYWRlci4gVGhpcyBpcwotICAgKiBzdWZmaWNpZW50IHRvIGRldGVjdCBhIFYyQ2xpZW50SGVsbG8gYW5kIGVuc3VyZXMgdGhhdCB3ZSBuZXZlciByZWFkIGJleW9uZAotICAgKiB0aGUgZmlyc3QgcmVjb3JkLiAqLwotICBpbnQgcmV0ID0gc3NsX3JlYWRfYnVmZmVyX2V4dGVuZF90byhzLCBTU0wzX1JUX0hFQURFUl9MRU5HVEgpOworICBpbnQgcmV0OworICBjb25zdCB1aW50OF90ICpwOworCisgIC8qIFJlYWQgdGhlIGZpcnN0IDggYnl0ZXMuIFRvIHJlY29nbml6ZSBhIENsaWVudEhlbGxvIG9yIFYyQ2xpZW50SGVsbG8gb25seQorICAgKiBuZWVkcyB0aGUgZmlyc3QgNiBieXRlcywgYnV0IDggaXMgbmVlZGVkIHRvIHJlY29nbml6ZSBDT05ORUNUIGJlbG93LiAqLworICByZXQgPSBzc2wzX3JlYWRfc25pZmZfYnVmZmVyKHMsIElOSVRJQUxfU05JRkZfQlVGRkVSX1NJWkUpOwogICBpZiAocmV0IDw9IDApIHsKICAgICByZXR1cm4gcmV0OwogICB9Ci0gIGFzc2VydChzc2xfcmVhZF9idWZmZXJfbGVuKHMpID09IFNTTDNfUlRfSEVBREVSX0xFTkdUSCk7Ci0gIGNvbnN0IHVpbnQ4X3QgKnAgPSBzc2xfcmVhZF9idWZmZXIocyk7CisgIGFzc2VydChzLT5zMy0+c25pZmZfYnVmZmVyX2xlbiA+PSBJTklUSUFMX1NOSUZGX0JVRkZFUl9TSVpFKTsKKyAgcCA9IChjb25zdCB1aW50OF90ICopcy0+czMtPnNuaWZmX2J1ZmZlci0+ZGF0YTsKIAogICAvKiBTb21lIGRlZGljYXRlZCBlcnJvciBjb2RlcyBmb3IgcHJvdG9jb2wgbWl4dXBzIHNob3VsZCB0aGUgYXBwbGljYXRpb24gd2lzaAogICAgKiB0byBpbnRlcnByZXQgdGhlbSBkaWZmZXJlbnRseS4gKFRoZXNlIGRvIG5vdCBvdmVybGFwIHdpdGggQ2xpZW50SGVsbG8gb3IKQEAgLTYxNiwyNSArNjMxLDQ2IEBACiAgICAgICBzdHJuY21wKCJQT1NUICIsIChjb25zdCBjaGFyICopcCwgNSkgPT0gMCB8fAogICAgICAgc3RybmNtcCgiSEVBRCAiLCAoY29uc3QgY2hhciAqKXAsIDUpID09IDAgfHwKICAgICAgIHN0cm5jbXAoIlBVVCAiLCAoY29uc3QgY2hhciAqKXAsIDQpID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0hUVFBfUkVRVUVTVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9pbml0aWFsX2J5dGVzLCBTU0xfUl9IVFRQX1JFUVVFU1QpOwogICAgIHJldHVybiAtMTsKICAgfQotICBpZiAoc3RybmNtcCgiQ09OTkUiLCAoY29uc3QgY2hhciAqKXAsIDUpID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0hUVFBTX1BST1hZX1JFUVVFU1QpOworICBpZiAoc3RybmNtcCgiQ09OTkVDVCAiLCAoY29uc3QgY2hhciAqKXAsIDgpID09IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2luaXRpYWxfYnl0ZXMsIFNTTF9SX0hUVFBTX1BST1hZX1JFUVVFU1QpOwogICAgIHJldHVybiAtMTsKICAgfQogCi0gIC8qIERldGVybWluZSBpZiB0aGlzIGlzIGEgVjJDbGllbnRIZWxsby4gKi8KKyAgLyogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBDbGllbnRIZWxsbyBvciBWMkNsaWVudEhlbGxvLiAqLwogICBpZiAoKHBbMF0gJiAweDgwKSAmJiBwWzJdID09IFNTTDJfTVRfQ0xJRU5UX0hFTExPICYmCiAgICAgICBwWzNdID49IFNTTDNfVkVSU0lPTl9NQUpPUikgewogICAgIC8qIFRoaXMgaXMgYSBWMkNsaWVudEhlbGxvLiAqLwogICAgIHMtPnN0YXRlID0gU1NMM19TVF9TUl9WMl9DTElFTlRfSEVMTE87CiAgICAgcmV0dXJuIDE7CiAgIH0KKyAgaWYgKHBbMF0gPT0gU1NMM19SVF9IQU5EU0hBS0UgJiYgcFsxXSA+PSBTU0wzX1ZFUlNJT05fTUFKT1IgJiYKKyAgICAgIHBbNV0gPT0gU1NMM19NVF9DTElFTlRfSEVMTE8pIHsKKyAgICAvKiBUaGlzIGlzIGEgQ2xpZW50SGVsbG8uIEluaXRpYWxpemUgdGhlIHJlY29yZCBsYXllciB3aXRoIHRoZSBhbHJlYWR5CisgICAgICogY29uc3VtZWQgZGF0YSBhbmQgY29udGludWUgdGhlIGhhbmRzaGFrZS4gKi8KKyAgICBpZiAoIXNzbDNfc2V0dXBfcmVhZF9idWZmZXIocykpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYXNzZXJ0KHMtPnJzdGF0ZSA9PSBTU0xfU1RfUkVBRF9IRUFERVIpOworICAgIC8qIFRoZXJlIGNhbm5vdCBoYXZlIGFscmVhZHkgYmVlbiBkYXRhIGluIHRoZSByZWNvcmQgbGF5ZXIuICovCisgICAgYXNzZXJ0KHMtPnMzLT5yYnVmLmxlZnQgPT0gMCk7CisgICAgbWVtY3B5KHMtPnMzLT5yYnVmLmJ1ZiwgcCwgcy0+czMtPnNuaWZmX2J1ZmZlcl9sZW4pOworICAgIHMtPnMzLT5yYnVmLm9mZnNldCA9IDA7CisgICAgcy0+czMtPnJidWYubGVmdCA9IHMtPnMzLT5zbmlmZl9idWZmZXJfbGVuOworICAgIHMtPnBhY2tldF9sZW5ndGggPSAwOwogCi0gIC8qIEZhbGwgdGhyb3VnaCB0byB0aGUgc3RhbmRhcmQgbG9naWMuICovCi0gIHMtPnN0YXRlID0gU1NMM19TVF9TUl9DTE5UX0hFTExPX0E7Ci0gIHJldHVybiAxOworICAgIEJVRl9NRU1fZnJlZShzLT5zMy0+c25pZmZfYnVmZmVyKTsKKyAgICBzLT5zMy0+c25pZmZfYnVmZmVyID0gTlVMTDsKKyAgICBzLT5zMy0+c25pZmZfYnVmZmVyX2xlbiA9IDA7CisKKyAgICBzLT5zdGF0ZSA9IFNTTDNfU1RfU1JfQ0xOVF9IRUxMT19BOworICAgIHJldHVybiAxOworICB9CisKKyAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9pbml0aWFsX2J5dGVzLCBTU0xfUl9VTktOT1dOX1BST1RPQ09MKTsKKyAgcmV0dXJuIC0xOwogfQogCiBpbnQgc3NsM19nZXRfdjJfY2xpZW50X2hlbGxvKFNTTCAqcykgewpAQCAtNjQ3LDM0ICs2ODMsMzYgQEAKICAgQ0JCIGNsaWVudF9oZWxsbywgaGVsbG9fYm9keSwgY2lwaGVyX3N1aXRlczsKICAgdWludDhfdCByYW5kb21bU1NMM19SQU5ET01fU0laRV07CiAKLSAgLyogRGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlIFYyQ2xpZW50SGVsbG8uICovCi0gIGFzc2VydChzc2xfcmVhZF9idWZmZXJfbGVuKHMpID49IFNTTDNfUlRfSEVBREVSX0xFTkdUSCk7Ci0gIHAgPSBzc2xfcmVhZF9idWZmZXIocyk7CisgIC8qIFJlYWQgdGhlIHJlbWFpbmRlciBvZiB0aGUgVjJDbGllbnRIZWxsby4gV2UgaGF2ZSBwcmV2aW91c2x5IHJlYWQgOCBieXRlcworICAgKiBpbiBzc2wzX2dldF9pbml0aWFsX2J5dGVzLiAqLworICBhc3NlcnQocy0+czMtPnNuaWZmX2J1ZmZlcl9sZW4gPj0gSU5JVElBTF9TTklGRl9CVUZGRVJfU0laRSk7CisgIHAgPSAoY29uc3QgdWludDhfdCAqKXMtPnMzLT5zbmlmZl9idWZmZXItPmRhdGE7CiAgIG1zZ19sZW5ndGggPSAoKHBbMF0gJiAweDdmKSA8PCA4KSB8IHBbMV07CiAgIGlmIChtc2dfbGVuZ3RoID4gKDEwMjQgKiA0KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfUkVDT1JEX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF92Ml9jbGllbnRfaGVsbG8sIFNTTF9SX1JFQ09SRF9UT09fTEFSR0UpOwogICAgIHJldHVybiAtMTsKICAgfQotICBpZiAobXNnX2xlbmd0aCA8IFNTTDNfUlRfSEVBREVSX0xFTkdUSCAtIDIpIHsKLSAgICAvKiBSZWplY3QgbGVuZ3RocyB0aGF0IGFyZSB0b28gc2hvcnQgZWFybHkuIFdlIGhhdmUgYWxyZWFkeSByZWFkCi0gICAgICogfFNTTDNfUlRfSEVBREVSX0xFTkdUSHwgYnl0ZXMsIHNvIHdlIHNob3VsZCBub3QgYXR0ZW1wdCB0byBwcm9jZXNzIGFuCi0gICAgICogKGludmFsaWQpIFYyQ2xpZW50SGVsbG8gd2hpY2ggd291bGQgYmUgc2hvcnRlciB0aGFuIHRoYXQuICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9SRUNPUkRfTEVOR1RIX01JU01BVENIKTsKKyAgaWYgKG1zZ19sZW5ndGggPCBJTklUSUFMX1NOSUZGX0JVRkZFUl9TSVpFIC0gMikgeworICAgIC8qIFJlamVjdCBsZW5ndGhzIHRoYXQgYXJlIHRvbyBzaG9ydCBlYXJseS4gV2UgaGF2ZSBhbHJlYWR5IHJlYWQgOCBieXRlcywKKyAgICAgKiBzbyB3ZSBzaG91bGQgbm90IGF0dGVtcHQgdG8gcHJvY2VzcyBhbiAoaW52YWxpZCkgVjJDbGllbnRIZWxsbyB3aGljaAorICAgICAqIHdvdWxkIGJlIHNob3J0ZXIgdGhhbiB0aGF0LiAqLworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfdjJfY2xpZW50X2hlbGxvLAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1JFQ09SRF9MRU5HVEhfTUlTTUFUQ0gpOwogICAgIHJldHVybiAtMTsKICAgfQogCi0gIC8qIFJlYWQgdGhlIHJlbWFpbmRlciBvZiB0aGUgVjJDbGllbnRIZWxsby4gKi8KLSAgcmV0ID0gc3NsX3JlYWRfYnVmZmVyX2V4dGVuZF90byhzLCAyICsgbXNnX2xlbmd0aCk7CisgIHJldCA9IHNzbDNfcmVhZF9zbmlmZl9idWZmZXIocywgbXNnX2xlbmd0aCArIDIpOwogICBpZiAocmV0IDw9IDApIHsKICAgICByZXR1cm4gcmV0OwogICB9Ci0gIGFzc2VydChzc2xfcmVhZF9idWZmZXJfbGVuKHMpID09IG1zZ19sZW5ndGggKyAyKTsKLSAgQ0JTX2luaXQoJnYyX2NsaWVudF9oZWxsbywgc3NsX3JlYWRfYnVmZmVyKHMpICsgMiwgbXNnX2xlbmd0aCk7CisgIGFzc2VydChzLT5zMy0+c25pZmZfYnVmZmVyX2xlbiA9PSBtc2dfbGVuZ3RoICsgMik7CisgIENCU19pbml0KCZ2Ml9jbGllbnRfaGVsbG8sIChjb25zdCB1aW50OF90ICopcy0+czMtPnNuaWZmX2J1ZmZlci0+ZGF0YSArIDIsCisgICAgICAgICAgIG1zZ19sZW5ndGgpOwogCi0gIC8qIFRoZSBWMkNsaWVudEhlbGxvIHdpdGhvdXQgdGhlIGxlbmd0aCBpcyBpbmNvcnBvcmF0ZWQgaW50byB0aGUgaGFuZHNoYWtlCisgIC8qIFRoZSBWMkNsaWVudEhlbGxvIHdpdGhvdXQgdGhlIGxlbmd0aCBpcyBpbmNvcnBvcmF0ZWQgaW50byB0aGUgRmluaXNoZWQKICAgICogaGFzaC4gKi8KLSAgaWYgKCFzc2wzX3VwZGF0ZV9oYW5kc2hha2VfaGFzaChzLCBDQlNfZGF0YSgmdjJfY2xpZW50X2hlbGxvKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQlNfbGVuKCZ2Ml9jbGllbnRfaGVsbG8pKSkgeworICBpZiAoIXNzbDNfZmluaXNoX21hYyhzLCBDQlNfZGF0YSgmdjJfY2xpZW50X2hlbGxvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0JTX2xlbigmdjJfY2xpZW50X2hlbGxvKSkpIHsKICAgICByZXR1cm4gLTE7CiAgIH0KICAgaWYgKHMtPm1zZ19jYWxsYmFjaykgewpAQCAtNjkxLDcgKzcyOSw3IEBACiAgICAgICAhQ0JTX2dldF9ieXRlcygmdjJfY2xpZW50X2hlbGxvLCAmc2Vzc2lvbl9pZCwgc2Vzc2lvbl9pZF9sZW5ndGgpIHx8CiAgICAgICAhQ0JTX2dldF9ieXRlcygmdjJfY2xpZW50X2hlbGxvLCAmY2hhbGxlbmdlLCBjaGFsbGVuZ2VfbGVuZ3RoKSB8fAogICAgICAgQ0JTX2xlbigmdjJfY2xpZW50X2hlbGxvKSAhPSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9ERUNPREVfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfdjJfY2xpZW50X2hlbGxvLCBTU0xfUl9ERUNPREVfRVJST1IpOwogICAgIHJldHVybiAtMTsKICAgfQogCkBAIC03MDksMTAgKzc0NywxMiBAQAogICAgICAgICAgcmFuZF9sZW4pOwogCiAgIC8qIFdyaXRlIG91dCBhbiBlcXVpdmFsZW50IFNTTHYzIENsaWVudEhlbGxvLiAqLwotICBDQkJfemVybygmY2xpZW50X2hlbGxvKTsKICAgaWYgKCFDQkJfaW5pdF9maXhlZCgmY2xpZW50X2hlbGxvLCAodWludDhfdCAqKXMtPmluaXRfYnVmLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgIHMtPmluaXRfYnVmLT5tYXgpIHx8Ci0gICAgICAhQ0JCX2FkZF91OCgmY2xpZW50X2hlbGxvLCBTU0wzX01UX0NMSUVOVF9IRUxMTykgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzLT5pbml0X2J1Zi0+bWF4KSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfdjJfY2xpZW50X2hlbGxvLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICghQ0JCX2FkZF91OCgmY2xpZW50X2hlbGxvLCBTU0wzX01UX0NMSUVOVF9IRUxMTykgfHwKICAgICAgICFDQkJfYWRkX3UyNF9sZW5ndGhfcHJlZml4ZWQoJmNsaWVudF9oZWxsbywgJmhlbGxvX2JvZHkpIHx8CiAgICAgICAhQ0JCX2FkZF91MTYoJmhlbGxvX2JvZHksIHZlcnNpb24pIHx8CiAgICAgICAhQ0JCX2FkZF9ieXRlcygmaGVsbG9fYm9keSwgcmFuZG9tLCBTU0wzX1JBTkRPTV9TSVpFKSB8fApAQCAtNzIwLDcgKzc2MCw3IEBACiAgICAgICAhQ0JCX2FkZF91OCgmaGVsbG9fYm9keSwgMCkgfHwKICAgICAgICFDQkJfYWRkX3UxNl9sZW5ndGhfcHJlZml4ZWQoJmhlbGxvX2JvZHksICZjaXBoZXJfc3VpdGVzKSkgewogICAgIENCQl9jbGVhbnVwKCZjbGllbnRfaGVsbG8pOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfdjJfY2xpZW50X2hlbGxvLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKQEAgLTcyOSw3ICs3NjksNyBAQAogICAgIHVpbnQzMl90IGNpcGhlcl9zcGVjOwogICAgIGlmICghQ0JTX2dldF91MjQoJmNpcGhlcl9zcGVjcywgJmNpcGhlcl9zcGVjKSkgewogICAgICAgQ0JCX2NsZWFudXAoJmNsaWVudF9oZWxsbyk7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0RFQ09ERV9FUlJPUik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3YyX2NsaWVudF9oZWxsbywgU1NMX1JfREVDT0RFX0VSUk9SKTsKICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKQEAgLTczOSw3ICs3NzksNyBAQAogICAgIH0KICAgICBpZiAoIUNCQl9hZGRfdTE2KCZjaXBoZXJfc3VpdGVzLCBjaXBoZXJfc3BlYykpIHsKICAgICAgIENCQl9jbGVhbnVwKCZjbGllbnRfaGVsbG8pOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X3YyX2NsaWVudF9oZWxsbywgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgfQpAQCAtNzQ4LDcgKzc4OCw3IEBACiAgIGlmICghQ0JCX2FkZF91OCgmaGVsbG9fYm9keSwgMSkgfHwgIUNCQl9hZGRfdTgoJmhlbGxvX2JvZHksIDApIHx8CiAgICAgICAhQ0JCX2ZpbmlzaCgmY2xpZW50X2hlbGxvLCBOVUxMLCAmbGVuKSkgewogICAgIENCQl9jbGVhbnVwKCZjbGllbnRfaGVsbG8pOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfdjJfY2xpZW50X2hlbGxvLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKQEAgLTc1OCw5ICs3OTgsMTAgQEAKICAgLyogVGhlIGhhbmRzaGFrZSBtZXNzYWdlIGhlYWRlciBpcyA0IGJ5dGVzLiAqLwogICBzLT5zMy0+dG1wLm1lc3NhZ2Vfc2l6ZSA9IGxlbiAtIDQ7CiAKLSAgLyogQ29uc3VtZSBhbmQgZGlzY2FyZCB0aGUgVjJDbGllbnRIZWxsby4gKi8KLSAgc3NsX3JlYWRfYnVmZmVyX2NvbnN1bWUocywgMiArIG1zZ19sZW5ndGgpOwotICBzc2xfcmVhZF9idWZmZXJfZGlzY2FyZChzKTsKKyAgLyogRHJvcCB0aGUgc25pZmYgYnVmZmVyLiAqLworICBCVUZfTUVNX2ZyZWUocy0+czMtPnNuaWZmX2J1ZmZlcik7CisgIHMtPnMzLT5zbmlmZl9idWZmZXIgPSBOVUxMOworICBzLT5zMy0+c25pZmZfYnVmZmVyX2xlbiA9IDA7CiAKICAgcmV0dXJuIDE7CiB9CkBAIC03NzQsNyArODE1LDYgQEAKICAgQ0JTIGNsaWVudF9oZWxsbzsKICAgdWludDE2X3QgY2xpZW50X3ZlcnNpb247CiAgIENCUyBjbGllbnRfcmFuZG9tLCBzZXNzaW9uX2lkLCBjaXBoZXJfc3VpdGVzLCBjb21wcmVzc2lvbl9tZXRob2RzOwotICBTU0xfU0VTU0lPTiAqc2Vzc2lvbiA9IE5VTEw7CiAKICAgLyogV2UgZG8gdGhpcyBzbyB0aGF0IHdlIHdpbGwgcmVzcG9uZCB3aXRoIG91ciBuYXRpdmUgdHlwZS4gSWYgd2UgYXJlIFRMU3YxCiAgICAqIGFuZCB3ZSBnZXQgU1NMdjMsIHdlIHdpbGwgcmVzcG9uZCB3aXRoIFRMU3YxLCBUaGlzIGRvd24gc3dpdGNoaW5nIHNob3VsZApAQCAtODA3LDcgKzg0Nyw4IEBACiAgICAgICBlYXJseV9jdHguY2xpZW50X2hlbGxvX2xlbiA9IG47CiAgICAgICBpZiAoIXNzbF9lYXJseV9jYWxsYmFja19pbml0KCZlYXJseV9jdHgpKSB7CiAgICAgICAgIGFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9DTElFTlRIRUxMT19QQVJTRV9GQUlMRUQpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9oZWxsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfQ0xJRU5USEVMTE9fUEFSU0VfRkFJTEVEKTsKICAgICAgICAgZ290byBmX2VycjsKICAgICAgIH0KIApAQCAtODIyLDcgKzg2Myw4IEBACiAgICAgICAgICAgY2FzZSAtMToKICAgICAgICAgICAgIC8qIENvbm5lY3Rpb24gcmVqZWN0ZWQuICovCiAgICAgICAgICAgICBhbCA9IFNTTF9BRF9BQ0NFU1NfREVOSUVEOwotICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9DT05ORUNUSU9OX1JFSkVDVEVEKTsKKyAgICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2hlbGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfQ09OTkVDVElPTl9SRUpFQ1RFRCk7CiAgICAgICAgICAgICBnb3RvIGZfZXJyOwogCiAgICAgICAgICAgZGVmYXVsdDoKQEAgLTgzMyw3ICs4NzUsNyBAQAogICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9VTktOT1dOX1NUQVRFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2hlbGxvLCBTU0xfUl9VTktOT1dOX1NUQVRFKTsKICAgICAgIHJldHVybiAtMTsKICAgfQogCkBAIC04NDMsNyArODg1LDcgQEAKICAgICAgICFDQlNfZ2V0X3U4X2xlbmd0aF9wcmVmaXhlZCgmY2xpZW50X2hlbGxvLCAmc2Vzc2lvbl9pZCkgfHwKICAgICAgIENCU19sZW4oJnNlc3Npb25faWQpID4gU1NMX01BWF9TU0xfU0VTU0lPTl9JRF9MRU5HVEgpIHsKICAgICBhbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9ERUNPREVfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2hlbGxvLCBTU0xfUl9ERUNPREVfRVJST1IpOwogICAgIGdvdG8gZl9lcnI7CiAgIH0KIApAQCAtODYwLDcgKzkwMiw3IEBACiAgICAgaWYgKCFDQlNfZ2V0X3U4X2xlbmd0aF9wcmVmaXhlZCgmY2xpZW50X2hlbGxvLCAmY29va2llKSB8fAogICAgICAgICBDQlNfbGVuKCZjb29raWUpID4gRFRMUzFfQ09PS0lFX0xFTkdUSCkgewogICAgICAgYWwgPSBTU0xfQURfREVDT0RFX0VSUk9SOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9ERUNPREVfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jbGllbnRfaGVsbG8sIFNTTF9SX0RFQ09ERV9FUlJPUik7CiAgICAgICBnb3RvIGZfZXJyOwogICAgIH0KICAgfQpAQCAtODc0LDcgKzkxNiw3IEBACiAgICAgLyogU2VsZWN0IHZlcnNpb24gdG8gdXNlICovCiAgICAgdWludDE2X3QgdmVyc2lvbiA9IHNzbDNfZ2V0X211dHVhbF92ZXJzaW9uKHMsIGNsaWVudF92ZXJzaW9uKTsKICAgICBpZiAodmVyc2lvbiA9PSAwKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1VOU1VQUE9SVEVEX1BST1RPQ09MKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2hlbGxvLCBTU0xfUl9VTlNVUFBPUlRFRF9QUk9UT0NPTCk7CiAgICAgICBzLT52ZXJzaW9uID0gcy0+Y2xpZW50X3ZlcnNpb247CiAgICAgICBhbCA9IFNTTF9BRF9QUk9UT0NPTF9WRVJTSU9OOwogICAgICAgZ290byBmX2VycjsKQEAgLTg4NywyMyArOTI5LDE5IEBACiAgICAgcy0+czMtPmhhdmVfdmVyc2lvbiA9IDE7CiAgIH0gZWxzZSBpZiAoU1NMX0lTX0RUTFMocykgPyAocy0+Y2xpZW50X3ZlcnNpb24gPiBzLT52ZXJzaW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHMtPmNsaWVudF92ZXJzaW9uIDwgcy0+dmVyc2lvbikpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1dST05HX1ZFUlNJT05fTlVNQkVSKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9oZWxsbywgU1NMX1JfV1JPTkdfVkVSU0lPTl9OVU1CRVIpOwogICAgIGFsID0gU1NMX0FEX1BST1RPQ09MX1ZFUlNJT047CiAgICAgZ290byBmX2VycjsKICAgfQogCiAgIHMtPmhpdCA9IDA7Ci0gIGludCBzZW5kX25ld190aWNrZXQgPSAwOwotICBzd2l0Y2ggKHNzbF9nZXRfcHJldl9zZXNzaW9uKHMsICZzZXNzaW9uLCAmc2VuZF9uZXdfdGlja2V0LCAmZWFybHlfY3R4KSkgewotICAgIGNhc2Ugc3NsX3Nlc3Npb25fc3VjY2VzczoKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc3NsX3Nlc3Npb25fZXJyb3I6Ci0gICAgICBnb3RvIGVycjsKLSAgICBjYXNlIHNzbF9zZXNzaW9uX3JldHJ5OgotICAgICAgcy0+cndzdGF0ZSA9IFNTTF9QRU5ESU5HX1NFU1NJT047Ci0gICAgICBnb3RvIGVycjsKKyAgaW50IHNlc3Npb25fcmV0ID0gc3NsX2dldF9wcmV2X3Nlc3Npb24ocywgJmVhcmx5X2N0eCk7CisgIGlmIChzZXNzaW9uX3JldCA9PSBQRU5ESU5HX1NFU1NJT04pIHsKKyAgICBzLT5yd3N0YXRlID0gU1NMX1BFTkRJTkdfU0VTU0lPTjsKKyAgICBnb3RvIGVycjsKKyAgfSBlbHNlIGlmIChzZXNzaW9uX3JldCA9PSAtMSkgeworICAgIGdvdG8gZXJyOwogICB9Ci0gIHMtPnRsc2V4dF90aWNrZXRfZXhwZWN0ZWQgPSBzZW5kX25ld190aWNrZXQ7CiAKICAgLyogVGhlIEVNUyBzdGF0ZSBpcyBuZWVkZWQgd2hlbiBtYWtpbmcgdGhlIHJlc3VtcHRpb24gZGVjaXNpb24sIGJ1dAogICAgKiBleHRlbnNpb25zIGFyZSBub3Qgbm9ybWFsbHkgcGFyc2VkIHVudGlsIGxhdGVyLiBUaGlzIGRldGVjdHMgdGhlIEVNUwpAQCAtOTE4LDQwICs5NTYsMzQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW1zX2RhdGEsICZlbXNfbGVuKSAmJgogICAgICAgZW1zX2xlbiA9PSAwOwogCi0gIGlmIChzZXNzaW9uICE9IE5VTEwpIHsKLSAgICBpZiAoc2Vzc2lvbi0+ZXh0ZW5kZWRfbWFzdGVyX3NlY3JldCAmJgorICBpZiAoc2Vzc2lvbl9yZXQgPT0gMSkgeworICAgIGlmIChzLT5zZXNzaW9uLT5leHRlbmRlZF9tYXN0ZXJfc2VjcmV0ICYmCiAgICAgICAgICFoYXZlX2V4dGVuZGVkX21hc3Rlcl9zZWNyZXQpIHsKICAgICAgIC8qIEEgQ2xpZW50SGVsbG8gd2l0aG91dCBFTVMgdGhhdCBhdHRlbXB0cyB0byByZXN1bWUgYSBzZXNzaW9uIHdpdGggRU1TCiAgICAgICAgKiBpcyBmYXRhbCB0byB0aGUgY29ubmVjdGlvbi4gKi8KICAgICAgIGFsID0gU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9SRVNVTUVEX0VNU19TRVNTSU9OX1dJVEhPVVRfRU1TX0VYVEVOU0lPTik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9oZWxsbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1JFU1VNRURfRU1TX1NFU1NJT05fV0lUSE9VVF9FTVNfRVhURU5TSU9OKTsKICAgICAgIGdvdG8gZl9lcnI7CiAgICAgfQogCiAgICAgcy0+aGl0ID0KICAgICAgICAgLyogT25seSByZXN1bWUgaWYgdGhlIHNlc3Npb24ncyB2ZXJzaW9uIG1hdGNoZXMgdGhlIG5lZ290aWF0ZWQgdmVyc2lvbjoKICAgICAgICAgICogbW9zdCBjbGllbnRzIGRvIG5vdCBhY2NlcHQgYSBtaXNtYXRjaC4gKi8KLSAgICAgICAgcy0+dmVyc2lvbiA9PSBzZXNzaW9uLT5zc2xfdmVyc2lvbiAmJgorICAgICAgICBzLT52ZXJzaW9uID09IHMtPnNlc3Npb24tPnNzbF92ZXJzaW9uICYmCiAgICAgICAgIC8qIElmIHRoZSBjbGllbnQgb2ZmZXJzIHRoZSBFTVMgZXh0ZW5zaW9uLCBidXQgdGhlIHByZXZpb3VzIHNlc3Npb24KICAgICAgICAgICogZGlkbid0IHVzZSBpdCwgdGhlbiBuZWdvdGlhdGUgYSBuZXcgc2Vzc2lvbi4gKi8KLSAgICAgICAgaGF2ZV9leHRlbmRlZF9tYXN0ZXJfc2VjcmV0ID09IHNlc3Npb24tPmV4dGVuZGVkX21hc3Rlcl9zZWNyZXQ7CisgICAgICAgIGhhdmVfZXh0ZW5kZWRfbWFzdGVyX3NlY3JldCA9PSBzLT5zZXNzaW9uLT5leHRlbmRlZF9tYXN0ZXJfc2VjcmV0OwogICB9CiAKLSAgaWYgKHMtPmhpdCkgewotICAgIC8qIFVzZSB0aGUgbmV3IHNlc3Npb24uICovCi0gICAgU1NMX1NFU1NJT05fZnJlZShzLT5zZXNzaW9uKTsKLSAgICBzLT5zZXNzaW9uID0gc2Vzc2lvbjsKLSAgICBzZXNzaW9uID0gTlVMTDsKLQotICAgIHMtPnZlcmlmeV9yZXN1bHQgPSBzLT5zZXNzaW9uLT52ZXJpZnlfcmVzdWx0OwotICB9IGVsc2UgaWYgKCFzc2xfZ2V0X25ld19zZXNzaW9uKHMsIDEpKSB7CisgIGlmICghcy0+aGl0ICYmICFzc2xfZ2V0X25ld19zZXNzaW9uKHMsIDEpKSB7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAocy0+Y3R4LT5kb3NfcHJvdGVjdGlvbl9jYiAhPSBOVUxMICYmIHMtPmN0eC0+ZG9zX3Byb3RlY3Rpb25fY2IoJmVhcmx5X2N0eCkgPT0gMCkgewogICAgIC8qIENvbm5lY3Rpb24gcmVqZWN0ZWQgZm9yIERPUyByZWFzb25zLiAqLwogICAgIGFsID0gU1NMX0FEX0FDQ0VTU19ERU5JRUQ7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9DT05ORUNUSU9OX1JFSkVDVEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9oZWxsbywgU1NMX1JfQ09OTkVDVElPTl9SRUpFQ1RFRCk7CiAgICAgZ290byBmX2VycjsKICAgfQogCkBAIC05NjEsNyArOTkzLDcgQEAKICAgICAgICFDQlNfZ2V0X3U4X2xlbmd0aF9wcmVmaXhlZCgmY2xpZW50X2hlbGxvLCAmY29tcHJlc3Npb25fbWV0aG9kcykgfHwKICAgICAgIENCU19sZW4oJmNvbXByZXNzaW9uX21ldGhvZHMpID09IDApIHsKICAgICBhbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9ERUNPREVfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2hlbGxvLCBTU0xfUl9ERUNPREVfRVJST1IpOwogICAgIGdvdG8gZl9lcnI7CiAgIH0KIApAQCAtOTg4LDcgKzEwMjAsOCBAQAogICAgICAgLyogd2UgbmVlZCB0byBoYXZlIHRoZSBjaXBoZXIgaW4gdGhlIGNpcGhlciBsaXN0IGlmIHdlIGFyZSBhc2tlZCB0byByZXVzZQogICAgICAgICogaXQgKi8KICAgICAgIGFsID0gU1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9SRVFVSVJFRF9DSVBIRVJfTUlTU0lORyk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9oZWxsbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1JFUVVJUkVEX0NJUEhFUl9NSVNTSU5HKTsKICAgICAgIGdvdG8gZl9lcnI7CiAgICAgfQogICB9CkBAIC05OTcsMTQgKzEwMzAsMTUgQEAKICAgaWYgKG1lbWNocihDQlNfZGF0YSgmY29tcHJlc3Npb25fbWV0aG9kcyksIDAsCiAgICAgICAgICAgICAgQ0JTX2xlbigmY29tcHJlc3Npb25fbWV0aG9kcykpID09IE5VTEwpIHsKICAgICBhbCA9IFNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX05PX0NPTVBSRVNTSU9OX1NQRUNJRklFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jbGllbnRfaGVsbG8sCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfTk9fQ09NUFJFU1NJT05fU1BFQ0lGSUVEKTsKICAgICBnb3RvIGZfZXJyOwogICB9CiAKICAgLyogVExTIGV4dGVuc2lvbnMuICovCiAgIGlmIChzLT52ZXJzaW9uID49IFNTTDNfVkVSU0lPTiAmJgogICAgICAgIXNzbF9wYXJzZV9jbGllbnRoZWxsb190bHNleHQocywgJmNsaWVudF9oZWxsbykpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1BBUlNFX1RMU0VYVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jbGllbnRfaGVsbG8sIFNTTF9SX1BBUlNFX1RMU0VYVCk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMTAxMiwxMyArMTA0NiwxMyBAQAogICBpZiAoQ0JTX2xlbigmY2xpZW50X2hlbGxvKSAhPSAwKSB7CiAgICAgLyogd3JvbmcgcGFja2V0IGxlbmd0aCAqLwogICAgIGFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0JBRF9QQUNLRVRfTEVOR1RIKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9oZWxsbywgU1NMX1JfQkFEX1BBQ0tFVF9MRU5HVEgpOwogICAgIGdvdG8gZl9lcnI7CiAgIH0KIAogICBpZiAoaGF2ZV9leHRlbmRlZF9tYXN0ZXJfc2VjcmV0ICE9IHMtPnMzLT50bXAuZXh0ZW5kZWRfbWFzdGVyX3NlY3JldCkgewogICAgIGFsID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfRU1TX1NUQVRFX0lOQ09OU0lTVEVOVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jbGllbnRfaGVsbG8sIFNTTF9SX0VNU19TVEFURV9JTkNPTlNJU1RFTlQpOwogICAgIGdvdG8gZl9lcnI7CiAgIH0KIApAQCAtMTAyNiw3ICsxMDYwLDcgQEAKICAgaWYgKCFzLT5oaXQpIHsKICAgICBpZiAoY2lwaGVycyA9PSBOVUxMKSB7CiAgICAgICBhbCA9IFNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfTk9fQ0lQSEVSU19QQVNTRUQpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jbGllbnRfaGVsbG8sIFNTTF9SX05PX0NJUEhFUlNfUEFTU0VEKTsKICAgICAgIGdvdG8gZl9lcnI7CiAgICAgfQogCkBAIC0xMDM1LDcgKzEwNjksNyBAQAogICAgICAgaW50IHJ2ID0gcy0+Y2VydC0+Y2VydF9jYihzLCBzLT5jZXJ0LT5jZXJ0X2NiX2FyZyk7CiAgICAgICBpZiAocnYgPT0gMCkgewogICAgICAgICBhbCA9IFNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9DRVJUX0NCX0VSUk9SKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jbGllbnRfaGVsbG8sIFNTTF9SX0NFUlRfQ0JfRVJST1IpOwogICAgICAgICBnb3RvIGZfZXJyOwogICAgICAgfQogICAgICAgaWYgKHJ2IDwgMCkgewpAQCAtMTA0OCw3ICsxMDgyLDcgQEAKIAogICAgIGlmIChjID09IE5VTEwpIHsKICAgICAgIGFsID0gU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9OT19TSEFSRURfQ0lQSEVSKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2hlbGxvLCBTU0xfUl9OT19TSEFSRURfQ0lQSEVSKTsKICAgICAgIGdvdG8gZl9lcnI7CiAgICAgfQogICAgIHMtPnMzLT50bXAubmV3X2NpcGhlciA9IGM7CkBAIC0xMDcwLDE1ICsxMTA0LDExIEBACiAgICAgcy0+czMtPnRtcC5jZXJ0X3JlcXVlc3QgPSAwOwogICB9CiAKLSAgLyogTm93IHRoYXQgdGhlIGNpcGhlciBpcyBrbm93biwgaW5pdGlhbGl6ZSB0aGUgaGFuZHNoYWtlIGhhc2guICovCi0gIGlmICghc3NsM19pbml0X2hhbmRzaGFrZV9oYXNoKHMpKSB7Ci0gICAgZ290byBmX2VycjsKLSAgfQotCiAgIC8qIEluIFRMUyAxLjIsIGNsaWVudCBhdXRoZW50aWNhdGlvbiByZXF1aXJlcyBoYXNoaW5nIHRoZSBoYW5kc2hha2UgdHJhbnNjcmlwdAogICAgKiB1bmRlciBhIGRpZmZlcmVudCBoYXNoLiBPdGhlcndpc2UsIHJlbGVhc2UgdGhlIGhhbmRzaGFrZSBidWZmZXIuICovCi0gIGlmICghU1NMX1VTRV9TSUdBTEdTKHMpIHx8ICFzLT5zMy0+dG1wLmNlcnRfcmVxdWVzdCkgewotICAgIHNzbDNfZnJlZV9oYW5kc2hha2VfYnVmZmVyKHMpOworICBpZiAoKCFTU0xfVVNFX1NJR0FMR1MocykgfHwgIXMtPnMzLT50bXAuY2VydF9yZXF1ZXN0KSAmJgorICAgICAgIXNzbDNfZGlnZXN0X2NhY2hlZF9yZWNvcmRzKHMsIGZyZWVfaGFuZHNoYWtlX2J1ZmZlcikpIHsKKyAgICBnb3RvIGZfZXJyOwogICB9CiAKICAgLyogd2Ugbm93IGhhdmUgdGhlIGZvbGxvd2luZyBzZXR1cDsKQEAgLTExMDIsNyArMTEzMiw2IEBACiAKIGVycjoKICAgc2tfU1NMX0NJUEhFUl9mcmVlKGNpcGhlcnMpOwotICBTU0xfU0VTU0lPTl9mcmVlKHNlc3Npb24pOwogICByZXR1cm4gcmV0OwogfQogCkBAIC0xMTIzLDcgKzExNTIsOCBAQAogICAgIC8qIElmIHRoaXMgaXMgYSByZXN1bXB0aW9uIGFuZCB0aGUgb3JpZ2luYWwgaGFuZHNoYWtlIGRpZG4ndCBzdXBwb3J0CiAgICAgICogQ2hhbm5lbElEIHRoZW4gd2UgZGlkbid0IHJlY29yZCB0aGUgb3JpZ2luYWwgaGFuZHNoYWtlIGhhc2hlcyBpbiB0aGUKICAgICAgKiBzZXNzaW9uIGFuZCBzbyBjYW5ub3QgcmVzdW1lIHdpdGggQ2hhbm5lbElEcy4gKi8KLSAgICBpZiAocy0+aGl0ICYmIHMtPnNlc3Npb24tPm9yaWdpbmFsX2hhbmRzaGFrZV9oYXNoX2xlbiA9PSAwKSB7CisgICAgaWYgKHMtPmhpdCAmJiBzLT5zMy0+dGxzZXh0X2NoYW5uZWxfaWRfbmV3ICYmCisgICAgICAgIHMtPnNlc3Npb24tPm9yaWdpbmFsX2hhbmRzaGFrZV9oYXNoX2xlbiA9PSAwKSB7CiAgICAgICBzLT5zMy0+dGxzZXh0X2NoYW5uZWxfaWRfdmFsaWQgPSAwOwogICAgIH0KIApAQCAtMTEzNyw3ICsxMTY3LDcgQEAKICAgICAvKiBSYW5kb20gc3R1ZmYgKi8KICAgICBpZiAoIXNzbF9maWxsX2hlbGxvX3JhbmRvbShzLT5zMy0+c2VydmVyX3JhbmRvbSwgU1NMM19SQU5ET01fU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8qIHNlcnZlciAqLykpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfc2VydmVyX2hlbGxvLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIG1lbWNweShwLCBzLT5zMy0+c2VydmVyX3JhbmRvbSwgU1NMM19SQU5ET01fU0laRSk7CkBAIC0xMTYxLDcgKzExOTEsNyBAQAogCiAgICAgc2wgPSBzLT5zZXNzaW9uLT5zZXNzaW9uX2lkX2xlbmd0aDsKICAgICBpZiAoc2wgPiAoaW50KXNpemVvZihzLT5zZXNzaW9uLT5zZXNzaW9uX2lkKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfc2VuZF9zZXJ2ZXJfaGVsbG8sIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgKihwKyspID0gc2w7CkBAIC0xMTczLDEwICsxMjAzLDEzIEBACiAKICAgICAvKiBwdXQgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCAqLwogICAgICoocCsrKSA9IDA7Ci0KKyAgICBpZiAoc3NsX3ByZXBhcmVfc2VydmVyaGVsbG9fdGxzZXh0KHMpIDw9IDApIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX3NlcnZlcl9oZWxsbywgU1NMX1JfU0VSVkVSSEVMTE9fVExTRVhUKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CiAgICAgcCA9IHNzbF9hZGRfc2VydmVyaGVsbG9fdGxzZXh0KHMsIHAsIGJ1ZiArIFNTTDNfUlRfTUFYX1BMQUlOX0xFTkdUSCk7CiAgICAgaWYgKHAgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfc2VuZF9zZXJ2ZXJfaGVsbG8sIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKQEAgLTExOTIsMzIgKzEyMjUsNiBAQAogICByZXR1cm4gc3NsX2RvX3dyaXRlKHMpOwogfQogCi1pbnQgc3NsM19zZW5kX2NlcnRpZmljYXRlX3N0YXR1cyhTU0wgKnNzbCkgewotICBpZiAoc3NsLT5zdGF0ZSA9PSBTU0wzX1NUX1NXX0NFUlRfU1RBVFVTX0EpIHsKLSAgICBDQkIgb3V0LCBvY3NwX3Jlc3BvbnNlOwotICAgIHNpemVfdCBsZW5ndGg7Ci0KLSAgICBDQkJfemVybygmb3V0KTsKLSAgICBpZiAoIUNCQl9pbml0X2ZpeGVkKCZvdXQsIHNzbF9oYW5kc2hha2Vfc3RhcnQoc3NsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzbC0+aW5pdF9idWYtPm1heCAtIFNTTF9ITV9IRUFERVJfTEVOR1RIKHNzbCkpIHx8Ci0gICAgICAgICFDQkJfYWRkX3U4KCZvdXQsIFRMU0VYVF9TVEFUVVNUWVBFX29jc3ApIHx8Ci0gICAgICAgICFDQkJfYWRkX3UyNF9sZW5ndGhfcHJlZml4ZWQoJm91dCwgJm9jc3BfcmVzcG9uc2UpIHx8Ci0gICAgICAgICFDQkJfYWRkX2J5dGVzKCZvY3NwX3Jlc3BvbnNlLCBzc2wtPmN0eC0+b2NzcF9yZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5jdHgtPm9jc3BfcmVzcG9uc2VfbGVuZ3RoKSB8fAotICAgICAgICAhQ0JCX2ZpbmlzaCgmb3V0LCBOVUxMLCAmbGVuZ3RoKSB8fAotICAgICAgICAhc3NsX3NldF9oYW5kc2hha2VfaGVhZGVyKHNzbCwgU1NMM19NVF9DRVJUSUZJQ0FURV9TVEFUVVMsIGxlbmd0aCkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOwotICAgICAgQ0JCX2NsZWFudXAoJm91dCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgc3NsLT5zdGF0ZSA9IFNTTDNfU1RfU1dfQ0VSVF9TVEFUVVNfQjsKLSAgfQotCi0gIC8qIFNTTDNfU1RfU1dfQ0VSVF9TVEFUVVNfQiAqLwotICByZXR1cm4gc3NsX2RvX3dyaXRlKHNzbCk7Ci19Ci0KIGludCBzc2wzX3NlbmRfc2VydmVyX2RvbmUoU1NMICpzKSB7CiAgIGlmIChzLT5zdGF0ZSA9PSBTU0wzX1NUX1NXX1NSVlJfRE9ORV9BKSB7CiAgICAgaWYgKCFzc2xfc2V0X2hhbmRzaGFrZV9oZWFkZXIocywgU1NMM19NVF9TRVJWRVJfRE9ORSwgMCkpIHsKQEAgLTEyMzksOCArMTI0Niw3IEBACiAgIEJOX0NUWCAqYm5fY3R4ID0gTlVMTDsKICAgY29uc3QgY2hhciAqcHNrX2lkZW50aXR5X2hpbnQgPSBOVUxMOwogICBzaXplX3QgcHNrX2lkZW50aXR5X2hpbnRfbGVuID0gMDsKLSAgc2l6ZV90IHNpZ19sZW47Ci0gIHNpemVfdCBtYXhfc2lnX2xlbjsKKyAgRVZQX1BLRVkgKnBrZXk7CiAgIHVpbnQ4X3QgKnAsICpkOwogICBpbnQgYWwsIGk7CiAgIHVpbnQzMl90IGFsZ19rOwpAQCAtMTI0OCwyNiArMTI1NCwxMSBAQAogICBpbnQgbjsKICAgQ0VSVCAqY2VydDsKICAgQklHTlVNICpyWzRdOwotICBpbnQgbnJbNF07CisgIGludCBucls0XSwga247CiAgIEJVRl9NRU0gKmJ1ZjsKICAgRVZQX01EX0NUWCBtZF9jdHg7CiAKLSAgaWYgKHMtPnN0YXRlID09IFNTTDNfU1RfU1dfS0VZX0VYQ0hfQykgewotICAgIHJldHVybiBzc2xfZG9fd3JpdGUocyk7Ci0gIH0KLQotICBpZiAoc3NsX2NpcGhlcl9oYXNfc2VydmVyX3B1YmxpY19rZXkocy0+czMtPnRtcC5uZXdfY2lwaGVyKSkgewotICAgIGlmICghc3NsX2hhc19wcml2YXRlX2tleShzKSkgewotICAgICAgYWwgPSBTU0xfQURfSU5URVJOQUxfRVJST1I7Ci0gICAgICBnb3RvIGZfZXJyOwotICAgIH0KLSAgICBtYXhfc2lnX2xlbiA9IHNzbF9wcml2YXRlX2tleV9tYXhfc2lnbmF0dXJlX2xlbihzKTsKLSAgfSBlbHNlIHsKLSAgICBtYXhfc2lnX2xlbiA9IDA7Ci0gIH0KLQogICBFVlBfTURfQ1RYX2luaXQoJm1kX2N0eCk7Ci0gIGVudW0gc3NsX3ByaXZhdGVfa2V5X3Jlc3VsdF90IHNpZ25fcmVzdWx0OwogICBpZiAocy0+c3RhdGUgPT0gU1NMM19TVF9TV19LRVlfRVhDSF9BKSB7CiAgICAgYWxnX2sgPSBzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9ta2V5OwogICAgIGFsZ19hID0gcy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fYXV0aDsKQEAgLTEyOTUsMjMgKzEyODYsMjUgQEAKICAgICAgIH0KICAgICAgIGlmIChkaHAgPT0gTlVMTCkgewogICAgICAgICBhbCA9IFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9NSVNTSU5HX1RNUF9ESF9LRVkpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfc2VuZF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9NSVNTSU5HX1RNUF9ESF9LRVkpOwogICAgICAgICBnb3RvIGZfZXJyOwogICAgICAgfQogCiAgICAgICBpZiAocy0+czMtPnRtcC5kaCAhPSBOVUxMKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfc2VuZF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogICAgICAgZGggPSBESHBhcmFtc19kdXAoZGhwKTsKICAgICAgIGlmIChkaCA9PSBOVUxMKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfREhfTElCKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfc2VydmVyX2tleV9leGNoYW5nZSwgRVJSX1JfREhfTElCKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAgICAgICBzLT5zMy0+dG1wLmRoID0gZGg7CiAKICAgICAgIGlmICghREhfZ2VuZXJhdGVfa2V5KGRoKSkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0RIX0xJQik7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX3NlcnZlcl9rZXlfZXhjaGFuZ2UsIEVSUl9SX0RIX0xJQik7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogCkBAIC0xMzM1LDEyICsxMzI4LDE0IEBACiAgICAgICB9CiAgICAgICBpZiAobmlkID09IE5JRF91bmRlZikgewogICAgICAgICBhbCA9IFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9NSVNTSU5HX1RNUF9FQ0RIX0tFWSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX3NlcnZlcl9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX01JU1NJTkdfVE1QX0VDREhfS0VZKTsKICAgICAgICAgZ290byBmX2VycjsKICAgICAgIH0KIAogICAgICAgaWYgKHMtPnMzLT50bXAuZWNkaCAhPSBOVUxMKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfc2VuZF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogICAgICAgZWNkaCA9IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZShuaWQpOwpAQCAtMTM1MCwxNCArMTM0NSwxNSBAQAogICAgICAgcy0+czMtPnRtcC5lY2RoID0gZWNkaDsKIAogICAgICAgaWYgKCFFQ19LRVlfZ2VuZXJhdGVfa2V5KGVjZGgpKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfRUNESF9MSUIpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfc2VuZF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlLCBFUlJfUl9FQ0RIX0xJQik7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogCiAgICAgICAvKiBXZSBvbmx5IHN1cHBvcnQgZXBoZW1lcmFsIEVDREgga2V5cyBvdmVyIG5hbWVkIChub3QgZ2VuZXJpYykgY3VydmVzLiAqLwogICAgICAgY29uc3QgRUNfR1JPVVAgKmdyb3VwID0gRUNfS0VZX2dldDBfZ3JvdXAoZWNkaCk7CiAgICAgICBpZiAoIXRsczFfZWNfbmlkMmN1cnZlX2lkKCZjdXJ2ZV9pZCwgRUNfR1JPVVBfZ2V0X2N1cnZlX25hbWUoZ3JvdXApKSkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1VOU1VQUE9SVEVEX0VMTElQVElDX0NVUlZFKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfc2VydmVyX2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfVU5TVVBQT1JURURfRUxMSVBUSUNfQ1VSVkUpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KIApAQCAtMTM3MCw3ICsxMzY2LDggQEAKICAgICAgIGVuY29kZWRQb2ludCA9ICh1aW50OF90ICopT1BFTlNTTF9tYWxsb2MoZW5jb2RlZGxlbiAqIHNpemVvZih1aW50OF90KSk7CiAgICAgICBibl9jdHggPSBCTl9DVFhfbmV3KCk7CiAgICAgICBpZiAoZW5jb2RlZFBvaW50ID09IE5VTEwgfHwgYm5fY3R4ID09IE5VTEwpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX3NlcnZlcl9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAKQEAgLTEzNzksNyArMTM3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRQb2ludCwgZW5jb2RlZGxlbiwgYm5fY3R4KTsKIAogICAgICAgaWYgKGVuY29kZWRsZW4gPT0gMCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0VDREhfTElCKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfc2VydmVyX2tleV9leGNoYW5nZSwgRVJSX1JfRUNESF9MSUIpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KIApAQCAtMTM5OSw3ICsxMzk2LDggQEAKICAgICAgIHJbM10gPSBOVUxMOwogICAgIH0gZWxzZSBpZiAoIShhbGdfayAmIFNTTF9rUFNLKSkgewogICAgICAgYWwgPSBTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1VOS05PV05fS0VZX0VYQ0hBTkdFX1RZUEUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfc2VydmVyX2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1VOS05PV05fS0VZX0VYQ0hBTkdFX1RZUEUpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAKQEAgLTE0MDgsOCArMTQwNiwyMCBAQAogICAgICAgbiArPSAyICsgbnJbaV07CiAgICAgfQogCi0gICAgaWYgKCFCVUZfTUVNX2dyb3dfY2xlYW4oYnVmLCBuICsgU1NMX0hNX0hFQURFUl9MRU5HVEgocykgKyBtYXhfc2lnX2xlbikpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX0xJQl9CVUYpOworICAgIGlmIChzc2xfY2lwaGVyX2hhc19zZXJ2ZXJfcHVibGljX2tleShzLT5zMy0+dG1wLm5ld19jaXBoZXIpKSB7CisgICAgICBwa2V5ID0gc3NsX2dldF9zaWduX3BrZXkocywgcy0+czMtPnRtcC5uZXdfY2lwaGVyKTsKKyAgICAgIGlmIChwa2V5ID09IE5VTEwpIHsKKyAgICAgICAgYWwgPSBTU0xfQURfREVDT0RFX0VSUk9SOworICAgICAgICBnb3RvIGZfZXJyOworICAgICAgfQorICAgICAga24gPSBFVlBfUEtFWV9zaXplKHBrZXkpOworICAgIH0gZWxzZSB7CisgICAgICBwa2V5ID0gTlVMTDsKKyAgICAgIGtuID0gMDsKKyAgICB9CisKKyAgICBpZiAoIUJVRl9NRU1fZ3Jvd19jbGVhbihidWYsIG4gKyBTU0xfSE1fSEVBREVSX0xFTkdUSChzKSArIGtuKSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX3NlbmRfc2VydmVyX2tleV9leGNoYW5nZSwgRVJSX0xJQl9CVUYpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIGQgPSBwID0gc3NsX2hhbmRzaGFrZV9zdGFydChzKTsKQEAgLTE0NDgsODEgKzE0NTgsNTQgQEAKICAgICAgIGVuY29kZWRQb2ludCA9IE5VTEw7CiAgICAgfQogCi0gICAgaWYgKHNzbF9jaXBoZXJfaGFzX3NlcnZlcl9wdWJsaWNfa2V5KHMtPnMzLT50bXAubmV3X2NpcGhlcikpIHsKLSAgICAgIC8qIG4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFyYW1zLCB0aGV5IHN0YXJ0IGF0IGQgYW5kIHAgcG9pbnRzIHRvCisgICAgLyogbm90IGFub255bW91cyAqLworICAgIGlmIChwa2V5ICE9IE5VTEwpIHsKKyAgICAgIC8qIG4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFyYW1zLCB0aGV5IHN0YXJ0IGF0ICYoZFs0XSkgYW5kIHAgcG9pbnRzIHRvCiAgICAgICAgKiB0aGUgc3BhY2UgYXQgdGhlIGVuZC4gKi8KICAgICAgIGNvbnN0IEVWUF9NRCAqbWQ7Ci0gICAgICB1aW50OF90IGRpZ2VzdFtFVlBfTUFYX01EX1NJWkVdOwotICAgICAgdW5zaWduZWQgaW50IGRpZ2VzdF9sZW5ndGg7Ci0KLSAgICAgIGNvbnN0IGludCBwa2V5X3R5cGUgPSBzc2xfcHJpdmF0ZV9rZXlfdHlwZShzKTsKKyAgICAgIHNpemVfdCBzaWdfbGVuID0gRVZQX1BLRVlfc2l6ZShwa2V5KTsKIAogICAgICAgLyogRGV0ZXJtaW5lIHNpZ25hdHVyZSBhbGdvcml0aG0uICovCiAgICAgICBpZiAoU1NMX1VTRV9TSUdBTEdTKHMpKSB7Ci0gICAgICAgIG1kID0gdGxzMV9jaG9vc2Vfc2lnbmluZ19kaWdlc3Qocyk7Ci0gICAgICAgIGlmICghdGxzMTJfZ2V0X3NpZ2FuZGhhc2gocywgcCwgbWQpKSB7CisgICAgICAgIG1kID0gdGxzMV9jaG9vc2Vfc2lnbmluZ19kaWdlc3QocywgcGtleSk7CisgICAgICAgIGlmICghdGxzMTJfZ2V0X3NpZ2FuZGhhc2gocCwgcGtleSwgbWQpKSB7CiAgICAgICAgICAgLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLwogICAgICAgICAgIGFsID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOwotICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX3NlcnZlcl9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgICAgIGdvdG8gZl9lcnI7CiAgICAgICAgIH0KICAgICAgICAgcCArPSAyOwotICAgICAgfSBlbHNlIGlmIChwa2V5X3R5cGUgPT0gRVZQX1BLRVlfUlNBKSB7CisgICAgICB9IGVsc2UgaWYgKHBrZXktPnR5cGUgPT0gRVZQX1BLRVlfUlNBKSB7CiAgICAgICAgIG1kID0gRVZQX21kNV9zaGExKCk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBtZCA9IEVWUF9zaGExKCk7CiAgICAgICB9CiAKLSAgICAgIGlmICghRVZQX0RpZ2VzdEluaXRfZXgoJm1kX2N0eCwgbWQsIE5VTEwpIHx8Ci0gICAgICAgICAgIUVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwgcy0+czMtPmNsaWVudF9yYW5kb20sIFNTTDNfUkFORE9NX1NJWkUpIHx8Ci0gICAgICAgICAgIUVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwgcy0+czMtPnNlcnZlcl9yYW5kb20sIFNTTDNfUkFORE9NX1NJWkUpIHx8Ci0gICAgICAgICAgIUVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwgZCwgbikgfHwKLSAgICAgICAgICAhRVZQX0RpZ2VzdEZpbmFsX2V4KCZtZF9jdHgsIGRpZ2VzdCwgJmRpZ2VzdF9sZW5ndGgpKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX0xJQl9FVlApOworICAgICAgaWYgKCFFVlBfRGlnZXN0U2lnbkluaXQoJm1kX2N0eCwgTlVMTCwgbWQsIE5VTEwsIHBrZXkpIHx8CisgICAgICAgICAgIUVWUF9EaWdlc3RTaWduVXBkYXRlKCZtZF9jdHgsIHMtPnMzLT5jbGllbnRfcmFuZG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0wzX1JBTkRPTV9TSVpFKSB8fAorICAgICAgICAgICFFVlBfRGlnZXN0U2lnblVwZGF0ZSgmbWRfY3R4LCBzLT5zMy0+c2VydmVyX3JhbmRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMM19SQU5ET01fU0laRSkgfHwKKyAgICAgICAgICAhRVZQX0RpZ2VzdFNpZ25VcGRhdGUoJm1kX2N0eCwgZCwgbikgfHwKKyAgICAgICAgICAhRVZQX0RpZ2VzdFNpZ25GaW5hbCgmbWRfY3R4LCAmcFsyXSwgJnNpZ19sZW4pKSB7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX3NlcnZlcl9rZXlfZXhjaGFuZ2UsIEVSUl9MSUJfRVZQKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAKLSAgICAgIHNpZ25fcmVzdWx0ID0gc3NsX3ByaXZhdGVfa2V5X3NpZ24ocywgJnBbMl0sICZzaWdfbGVuLCBtYXhfc2lnX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX01EX0NUWF9tZCgmbWRfY3R4KSwgZGlnZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdlc3RfbGVuZ3RoKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogVGhpcyBrZXkgZXhjaGFuZ2UgZG9lc24ndCBpbnZvbHZlIGEgc2lnbmF0dXJlLiAqLwotICAgICAgc2lnbl9yZXN1bHQgPSBzc2xfcHJpdmF0ZV9rZXlfc3VjY2VzczsKLSAgICAgIHNpZ19sZW4gPSAwOworICAgICAgczJuKHNpZ19sZW4sIHApOworICAgICAgbiArPSBzaWdfbGVuICsgMjsKKyAgICAgIGlmIChTU0xfVVNFX1NJR0FMR1MocykpIHsKKyAgICAgICAgbiArPSAyOworICAgICAgfQogICAgIH0KLSAgfSBlbHNlIHsKLSAgICBhc3NlcnQocy0+c3RhdGUgPT0gU1NMM19TVF9TV19LRVlfRVhDSF9CKTsKLSAgICAvKiBSZXN0b3JlIHxwfC4gKi8KLSAgICBwID0gc3NsX2hhbmRzaGFrZV9zdGFydChzKSArIHMtPmluaXRfbnVtIC0gU1NMX0hNX0hFQURFUl9MRU5HVEgocyk7Ci0gICAgc2lnbl9yZXN1bHQgPSBzc2xfcHJpdmF0ZV9rZXlfc2lnbl9jb21wbGV0ZShzLCAmcFsyXSwgJnNpZ19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfc2lnX2xlbik7Ci0gIH0KIAotICBzd2l0Y2ggKHNpZ25fcmVzdWx0KSB7Ci0gICAgY2FzZSBzc2xfcHJpdmF0ZV9rZXlfc3VjY2VzczoKLSAgICAgIHMtPnJ3c3RhdGUgPSBTU0xfTk9USElORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc3NsX3ByaXZhdGVfa2V5X2ZhaWx1cmU6Ci0gICAgICBzLT5yd3N0YXRlID0gU1NMX05PVEhJTkc7CisgICAgaWYgKCFzc2xfc2V0X2hhbmRzaGFrZV9oZWFkZXIocywgU1NMM19NVF9TRVJWRVJfS0VZX0VYQ0hBTkdFLCBuKSkgewogICAgICAgZ290byBlcnI7Ci0gICAgY2FzZSBzc2xfcHJpdmF0ZV9rZXlfcmV0cnk6Ci0gICAgICBzLT5yd3N0YXRlID0gU1NMX1BSSVZBVEVfS0VZX09QRVJBVElPTjsKLSAgICAgIC8qIFN0YXNoIGF3YXkgfHB8LiAqLwotICAgICAgcy0+aW5pdF9udW0gPSBwIC0gc3NsX2hhbmRzaGFrZV9zdGFydChzKSArIFNTTF9ITV9IRUFERVJfTEVOR1RIKHMpOwotICAgICAgcy0+c3RhdGUgPSBTU0wzX1NUX1NXX0tFWV9FWENIX0I7Ci0gICAgICBnb3RvIGVycjsKKyAgICB9CiAgIH0KIAotICBpZiAoc3NsX2NpcGhlcl9oYXNfc2VydmVyX3B1YmxpY19rZXkocy0+czMtPnRtcC5uZXdfY2lwaGVyKSkgewotICAgIHMybihzaWdfbGVuLCBwKTsKLSAgICBwICs9IHNpZ19sZW47Ci0gIH0KLSAgaWYgKCFzc2xfc2V0X2hhbmRzaGFrZV9oZWFkZXIocywgU1NMM19NVF9TRVJWRVJfS0VZX0VYQ0hBTkdFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwIC0gc3NsX2hhbmRzaGFrZV9zdGFydChzKSkpIHsKLSAgICBnb3RvIGVycjsKLSAgfQotICBzLT5zdGF0ZSA9IFNTTDNfU1RfU1dfS0VZX0VYQ0hfQzsKLQorICBzLT5zdGF0ZSA9IFNTTDNfU1RfU1dfS0VZX0VYQ0hfQjsKICAgRVZQX01EX0NUWF9jbGVhbnVwKCZtZF9jdHgpOwogICByZXR1cm4gc3NsX2RvX3dyaXRlKHMpOwogCkBAIC0xNTc1LDcgKzE1NTgsNyBAQAogICAgICAgICBuYW1lID0gc2tfWDUwOV9OQU1FX3ZhbHVlKHNrLCBpKTsKICAgICAgICAgaiA9IGkyZF9YNTA5X05BTUUobmFtZSwgTlVMTCk7CiAgICAgICAgIGlmICghQlVGX01FTV9ncm93X2NsZWFuKGJ1ZiwgU1NMX0hNX0hFQURFUl9MRU5HVEgocykgKyBuICsgaiArIDIpKSB7Ci0gICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9CVUZfTElCKTsKKyAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfc2VuZF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0LCBFUlJfUl9CVUZfTElCKTsKICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgfQogICAgICAgICBwID0gc3NsX2hhbmRzaGFrZV9zdGFydChzKSArIG47CkBAIC0xNjQ2LDI3ICsxNjI5LDMwIEBACiAgICAgICogdGhlbiB0aGlzIGlzIHRoZSBvbmx5IGZpZWxkIGluIHRoZSBtZXNzYWdlLiAqLwogICAgIGlmICghQ0JTX2dldF91MTZfbGVuZ3RoX3ByZWZpeGVkKCZjbGllbnRfa2V5X2V4Y2hhbmdlLCAmcHNrX2lkZW50aXR5KSB8fAogICAgICAgICAoKGFsZ19rICYgU1NMX2tQU0spICYmIENCU19sZW4oJmNsaWVudF9rZXlfZXhjaGFuZ2UpICE9IDApKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0RFQ09ERV9FUlJPUik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UsIFNTTF9SX0RFQ09ERV9FUlJPUik7CiAgICAgICBhbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CiAgICAgICBnb3RvIGZfZXJyOwogICAgIH0KIAogICAgIGlmIChzLT5wc2tfc2VydmVyX2NhbGxiYWNrID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfUFNLX05PX1NFUlZFUl9DQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9QU0tfTk9fU0VSVkVSX0NCKTsKICAgICAgIGFsID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAKICAgICBpZiAoQ0JTX2xlbigmcHNrX2lkZW50aXR5KSA+IFBTS19NQVhfSURFTlRJVFlfTEVOIHx8CiAgICAgICAgIENCU19jb250YWluc196ZXJvX2J5dGUoJnBza19pZGVudGl0eSkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfREFUQV9MRU5HVEhfVE9PX0xPTkcpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfREFUQV9MRU5HVEhfVE9PX0xPTkcpOwogICAgICAgYWwgPSBTU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CiAgICAgICBnb3RvIGZfZXJyOwogICAgIH0KIAogICAgIGlmICghQ0JTX3N0cmR1cCgmcHNrX2lkZW50aXR5LCAmcy0+c2Vzc2lvbi0+cHNrX2lkZW50aXR5KSkgewogICAgICAgYWwgPSBTU0xfQURfSU5URVJOQUxfRVJST1I7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIGdvdG8gZl9lcnI7CiAgICAgfQogCkBAIC0xNjc0LDEyICsxNjYwLDE0IEBACiAgICAgcHNrX2xlbiA9CiAgICAgICAgIHMtPnBza19zZXJ2ZXJfY2FsbGJhY2socywgcy0+c2Vzc2lvbi0+cHNrX2lkZW50aXR5LCBwc2ssIHNpemVvZihwc2spKTsKICAgICBpZiAocHNrX2xlbiA+IFBTS19NQVhfUFNLX0xFTikgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICBhbCA9IFNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKICAgICAgIGdvdG8gZl9lcnI7CiAgICAgfSBlbHNlIGlmIChwc2tfbGVuID09IDApIHsKICAgICAgIC8qIFBTSyByZWxhdGVkIHRvIHRoZSBnaXZlbiBpZGVudGl0eSBub3QgZm91bmQgKi8KLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfUFNLX0lERU5USVRZX05PVF9GT1VORCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9QU0tfSURFTlRJVFlfTk9UX0ZPVU5EKTsKICAgICAgIGFsID0gU1NMX0FEX1VOS05PV05fUFNLX0lERU5USVRZOwogICAgICAgZ290byBmX2VycjsKICAgICB9CkBAIC0xNjkzLDEwICsxNjgxLDExIEBACiAgICAgdWludDhfdCBnb29kOwogICAgIHNpemVfdCByc2Ffc2l6ZSwgZGVjcnlwdF9sZW4sIHByZW1hc3Rlcl9pbmRleCwgajsKIAotICAgIHBrZXkgPSBzLT5jZXJ0LT5wcml2YXRla2V5OworICAgIHBrZXkgPSBzLT5jZXJ0LT5wa2V5c1tTU0xfUEtFWV9SU0FfRU5DXS5wcml2YXRla2V5OwogICAgIGlmIChwa2V5ID09IE5VTEwgfHwgcGtleS0+dHlwZSAhPSBFVlBfUEtFWV9SU0EgfHwgcGtleS0+cGtleS5yc2EgPT0gTlVMTCkgewogICAgICAgYWwgPSBTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX01JU1NJTkdfUlNBX0NFUlRJRklDQVRFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX01JU1NJTkdfUlNBX0NFUlRJRklDQVRFKTsKICAgICAgIGdvdG8gZl9lcnI7CiAgICAgfQogICAgIHJzYSA9IHBrZXktPnBrZXkucnNhOwpAQCAtMTcwOSw3ICsxNjk4LDggQEAKICAgICAgICAgICBDQlNfbGVuKCZjbGllbnRfa2V5X2V4Y2hhbmdlKSAhPSAwKSB7CiAgICAgICAgIGlmICghKHMtPm9wdGlvbnMgJiBTU0xfT1BfVExTX0Q1X0JVRykpIHsKICAgICAgICAgICBhbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7Ci0gICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9UTFNfUlNBX0VOQ1JZUFRFRF9WQUxVRV9MRU5HVEhfSVNfV1JPTkcpOworICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9UTFNfUlNBX0VOQ1JZUFRFRF9WQUxVRV9MRU5HVEhfSVNfV1JPTkcpOwogICAgICAgICAgIGdvdG8gZl9lcnI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgZW5jcnlwdGVkX3ByZW1hc3Rlcl9zZWNyZXQgPSBjb3B5OwpAQCAtMTcyNiw3ICsxNzE2LDggQEAKICAgICByc2Ffc2l6ZSA9IFJTQV9zaXplKHJzYSk7CiAgICAgaWYgKHJzYV9zaXplIDwgU1NMX01BWF9NQVNURVJfS0VZX0xFTkdUSCkgewogICAgICAgYWwgPSBTU0xfQURfREVDUllQVF9FUlJPUjsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfREVDUllQVElPTl9GQUlMRUQpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfREVDUllQVElPTl9GQUlMRUQpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAKQEAgLTE3NDIsNyArMTczMyw4IEBACiAgICAgLyogQWxsb2NhdGUgYSBidWZmZXIgbGFyZ2UgZW5vdWdoIGZvciBhbiBSU0EgZGVjcnlwdGlvbi4gKi8KICAgICBkZWNyeXB0X2J1ZiA9IE9QRU5TU0xfbWFsbG9jKHJzYV9zaXplKTsKICAgICBpZiAoZGVjcnlwdF9idWYgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKQEAgLTE3NTYsNyArMTc0OCw4IEBACiAgICAgaWYgKGRlY3J5cHRfbGVuICE9IHJzYV9zaXplKSB7CiAgICAgICAvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCBkbyBhIGNoZWNrIHNvIHdlIGRvIG5vdCByZWFkCiAgICAgICAgKiB1bmluaXRpYWxpemVkIG1lbW9yeS4gKi8KLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogCkBAIC0xNzc5LDcgKzE3NzIsOCBAQAogICAgICAgICBCVUZfbWVtZHVwKGRlY3J5cHRfYnVmICsgKHJzYV9zaXplIC0gU1NMX01BWF9NQVNURVJfS0VZX0xFTkdUSCksCiAgICAgICAgICAgICAgICAgICAgU1NMX01BWF9NQVNURVJfS0VZX0xFTkdUSCk7CiAgICAgaWYgKHByZW1hc3Rlcl9zZWNyZXQgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgICAgT1BFTlNTTF9mcmVlKGRlY3J5cHRfYnVmKTsKQEAgLTE4MTAsMzUgKzE4MDQsMzggQEAKIAogICAgIGlmICghQ0JTX2dldF91MTZfbGVuZ3RoX3ByZWZpeGVkKCZjbGllbnRfa2V5X2V4Y2hhbmdlLCAmZGhfWWMpIHx8CiAgICAgICAgIENCU19sZW4oJmRoX1ljKSA9PSAwIHx8IENCU19sZW4oJmNsaWVudF9rZXlfZXhjaGFuZ2UpICE9IDApIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfREhfUFVCTElDX1ZBTFVFX0xFTkdUSF9JU19XUk9ORyk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9ESF9QVUJMSUNfVkFMVUVfTEVOR1RIX0lTX1dST05HKTsKICAgICAgIGFsID0gU1NMX1JfREVDT0RFX0VSUk9SOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAKICAgICBpZiAocy0+czMtPnRtcC5kaCA9PSBOVUxMKSB7CiAgICAgICBhbCA9IFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfTUlTU0lOR19UTVBfREhfS0VZKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX01JU1NJTkdfVE1QX0RIX0tFWSk7CiAgICAgICBnb3RvIGZfZXJyOwogICAgIH0KICAgICBkaF9zcnZyID0gcy0+czMtPnRtcC5kaDsKIAogICAgIHB1YiA9IEJOX2JpbjJibihDQlNfZGF0YSgmZGhfWWMpLCBDQlNfbGVuKCZkaF9ZYyksIE5VTEwpOwogICAgIGlmIChwdWIgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CTl9MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlLCBTU0xfUl9CTl9MSUIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogCiAgICAgLyogQWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBwcmVtYXN0ZXIgc2VjcmV0LiAqLwogICAgIHByZW1hc3Rlcl9zZWNyZXQgPSBPUEVOU1NMX21hbGxvYyhESF9zaXplKGRoX3NydnIpKTsKICAgICBpZiAocHJlbWFzdGVyX3NlY3JldCA9PSBOVUxMKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIEJOX2NsZWFyX2ZyZWUocHViKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIAogICAgIGRoX2xlbiA9IERIX2NvbXB1dGVfa2V5KHByZW1hc3Rlcl9zZWNyZXQsIHB1YiwgZGhfc3J2cik7CiAgICAgaWYgKGRoX2xlbiA8PSAwKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0RIX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UsIEVSUl9SX0RIX0xJQik7CiAgICAgICBCTl9jbGVhcl9mcmVlKHB1Yik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CkBAIC0xODU5LDcgKzE4NTYsOCBAQAogICAgIC8qIGluaXRpYWxpemUgc3RydWN0dXJlcyBmb3Igc2VydmVyJ3MgRUNESCBrZXkgcGFpciAqLwogICAgIHNydnJfZWNkaCA9IEVDX0tFWV9uZXcoKTsKICAgICBpZiAoc3J2cl9lY2RoID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogCkBAIC0xODcyLDE0ICsxODcwLDE1IEBACiAKICAgICBpZiAoIUVDX0tFWV9zZXRfZ3JvdXAoc3J2cl9lY2RoLCBncm91cCkgfHwKICAgICAgICAgIUVDX0tFWV9zZXRfcHJpdmF0ZV9rZXkoc3J2cl9lY2RoLCBwcml2X2tleSkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfRUNfTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZSwgRVJSX1JfRUNfTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIAogICAgIC8qIExldCdzIGdldCBjbGllbnQncyBwdWJsaWMga2V5ICovCiAgICAgY2xudF9lY3BvaW50ID0gRUNfUE9JTlRfbmV3KGdyb3VwKTsKICAgICBpZiAoY2xudF9lY3BvaW50ID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogCkBAIC0xODg4LDMzICsxODg3LDM1IEBACiAgICAgaWYgKCFDQlNfZ2V0X3U4X2xlbmd0aF9wcmVmaXhlZCgmY2xpZW50X2tleV9leGNoYW5nZSwgJmVjZGhfWWMpIHx8CiAgICAgICAgIENCU19sZW4oJmNsaWVudF9rZXlfZXhjaGFuZ2UpICE9IDApIHsKICAgICAgIGFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfREVDT0RFX0VSUk9SKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZSwgU1NMX1JfREVDT0RFX0VSUk9SKTsKICAgICAgIGdvdG8gZl9lcnI7CiAgICAgfQogCiAgICAgYm5fY3R4ID0gQk5fQ1RYX25ldygpOwogICAgIGlmIChibl9jdHggPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKICAgICBpZiAoIUVDX1BPSU5UX29jdDJwb2ludChncm91cCwgY2xudF9lY3BvaW50LCBDQlNfZGF0YSgmZWNkaF9ZYyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JTX2xlbigmZWNkaF9ZYyksIGJuX2N0eCkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfRUNfTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZSwgRVJSX1JfRUNfTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIAogICAgIC8qIEFsbG9jYXRlIGEgYnVmZmVyIGZvciBib3RoIHRoZSBzZWNyZXQgYW5kIHRoZSBQU0suICovCiAgICAgZmllbGRfc2l6ZSA9IEVDX0dST1VQX2dldF9kZWdyZWUoZ3JvdXApOwogICAgIGlmIChmaWVsZF9zaXplIDw9IDApIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfRUNESF9MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlLCBFUlJfUl9FQ0RIX0xJQik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKICAgICBlY2RoX2xlbiA9IChmaWVsZF9zaXplICsgNykgLyA4OwogICAgIHByZW1hc3Rlcl9zZWNyZXQgPSBPUEVOU1NMX21hbGxvYyhlY2RoX2xlbik7CiAgICAgaWYgKHByZW1hc3Rlcl9zZWNyZXQgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKQEAgLTE5MjIsNyArMTkyMyw3IEBACiAgICAgZWNkaF9sZW4gPSBFQ0RIX2NvbXB1dGVfa2V5KHByZW1hc3Rlcl9zZWNyZXQsIGVjZGhfbGVuLCBjbG50X2VjcG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNydnJfZWNkaCwgTlVMTCk7CiAgICAgaWYgKGVjZGhfbGVuIDw9IDApIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfRUNESF9MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlLCBFUlJfUl9FQ0RIX0xJQik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKQEAgLTE5NDQsMTMgKzE5NDUsMTUgQEAKICAgICBwcmVtYXN0ZXJfc2VjcmV0X2xlbiA9IHBza19sZW47CiAgICAgcHJlbWFzdGVyX3NlY3JldCA9IE9QRU5TU0xfbWFsbG9jKHByZW1hc3Rlcl9zZWNyZXRfbGVuKTsKICAgICBpZiAocHJlbWFzdGVyX3NlY3JldCA9PSBOVUxMKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICBtZW1zZXQocHJlbWFzdGVyX3NlY3JldCwgMCwgcHJlbWFzdGVyX3NlY3JldF9sZW4pOwogICB9IGVsc2UgewogICAgIGFsID0gU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfVU5LTk9XTl9DSVBIRVJfVFlQRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1VOS05PV05fQ0lQSEVSX1RZUEUpOwogICAgIGdvdG8gZl9lcnI7CiAgIH0KIApAQCAtMTk2MSwxNCArMTk2NCwxOCBAQAogICAgIHVpbnQ4X3QgKm5ld19kYXRhOwogICAgIHNpemVfdCBuZXdfbGVuOwogCi0gICAgQ0JCX3plcm8oJm5ld19wcmVtYXN0ZXIpOwotICAgIGlmICghQ0JCX2luaXQoJm5ld19wcmVtYXN0ZXIsIDIgKyBwc2tfbGVuICsgMiArIHByZW1hc3Rlcl9zZWNyZXRfbGVuKSB8fAotICAgICAgICAhQ0JCX2FkZF91MTZfbGVuZ3RoX3ByZWZpeGVkKCZuZXdfcHJlbWFzdGVyLCAmY2hpbGQpIHx8CisgICAgaWYgKCFDQkJfaW5pdCgmbmV3X3ByZW1hc3RlciwgMiArIHBza19sZW4gKyAyICsgcHJlbWFzdGVyX3NlY3JldF9sZW4pKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKCFDQkJfYWRkX3UxNl9sZW5ndGhfcHJlZml4ZWQoJm5ld19wcmVtYXN0ZXIsICZjaGlsZCkgfHwKICAgICAgICAgIUNCQl9hZGRfYnl0ZXMoJmNoaWxkLCBwcmVtYXN0ZXJfc2VjcmV0LCBwcmVtYXN0ZXJfc2VjcmV0X2xlbikgfHwKICAgICAgICAgIUNCQl9hZGRfdTE2X2xlbmd0aF9wcmVmaXhlZCgmbmV3X3ByZW1hc3RlciwgJmNoaWxkKSB8fAogICAgICAgICAhQ0JCX2FkZF9ieXRlcygmY2hpbGQsIHBzaywgcHNrX2xlbikgfHwKICAgICAgICAgIUNCQl9maW5pc2goJm5ld19wcmVtYXN0ZXIsICZuZXdfZGF0YSwgJm5ld19sZW4pKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICAgIENCQl9jbGVhbnVwKCZuZXdfcHJlbWFzdGVyKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KQEAgLTIwMjQsNyArMjAzMSwxMCBAQAogICAgKiBDZXJ0aWZpY2F0ZVZlcmlmeSBpcyByZXF1aXJlZCBpZiBhbmQgb25seSBpZiB0aGVyZSdzIGEgY2xpZW50IGNlcnRpZmljYXRlLgogICAgKiAqLwogICBpZiAocGVlciA9PSBOVUxMKSB7Ci0gICAgc3NsM19mcmVlX2hhbmRzaGFrZV9idWZmZXIocyk7CisgICAgaWYgKHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyICYmCisgICAgICAgICFzc2wzX2RpZ2VzdF9jYWNoZWRfcmVjb3JkcyhzLCBmcmVlX2hhbmRzaGFrZV9idWZmZXIpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQogICAgIHJldHVybiAxOwogICB9CiAKQEAgLTIwNDUsNyArMjA1NSw4IEBACiAgIGlmICghKFg1MDlfY2VydGlmaWNhdGVfdHlwZShwZWVyLCBwa2V5KSAmIEVWUF9QS1RfU0lHTikgfHwKICAgICAgIChwa2V5LT50eXBlICE9IEVWUF9QS0VZX1JTQSAmJiBwa2V5LT50eXBlICE9IEVWUF9QS0VZX0VDKSkgewogICAgIGFsID0gU1NMX0FEX1VOU1VQUE9SVEVEX0NFUlRJRklDQVRFOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfUEVFUl9FUlJPUl9VTlNVUFBPUlRFRF9DRVJUSUZJQ0FURV9UWVBFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NlcnRfdmVyaWZ5LAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1BFRVJfRVJST1JfVU5TVVBQT1JURURfQ0VSVElGSUNBVEVfVFlQRSk7CiAgICAgZ290byBmX2VycjsKICAgfQogCkBAIC0yMDU4LDEzICsyMDY5LDE2IEBACiAgIH0KIAogICAvKiBDb21wdXRlIHRoZSBkaWdlc3QuICovCi0gIGlmICghc3NsM19jZXJ0X3ZlcmlmeV9oYXNoKHMsIGRpZ2VzdCwgJmRpZ2VzdF9sZW5ndGgsICZtZCwgcGtleS0+dHlwZSkpIHsKKyAgaWYgKCFzc2wzX2NlcnRfdmVyaWZ5X2hhc2gocywgZGlnZXN0LCAmZGlnZXN0X2xlbmd0aCwgJm1kLCBwa2V5KSkgewogICAgIGdvdG8gZXJyOwogICB9CiAKICAgLyogVGhlIGhhbmRzaGFrZSBidWZmZXIgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSwgYW5kIHdlIG1heSBoYXNoIHRoZSBjdXJyZW50CiAgICAqIG1lc3NhZ2UuKi8KLSAgc3NsM19mcmVlX2hhbmRzaGFrZV9idWZmZXIocyk7CisgIGlmIChzLT5zMy0+aGFuZHNoYWtlX2J1ZmZlciAmJgorICAgICAgIXNzbDNfZGlnZXN0X2NhY2hlZF9yZWNvcmRzKHMsIGZyZWVfaGFuZHNoYWtlX2J1ZmZlcikpIHsKKyAgICBnb3RvIGVycjsKKyAgfQogICBpZiAoIXNzbDNfaGFzaF9jdXJyZW50X21lc3NhZ2UocykpIHsKICAgICBnb3RvIGVycjsKICAgfQpAQCAtMjA3Myw3ICsyMDg3LDcgQEAKICAgaWYgKCFDQlNfZ2V0X3UxNl9sZW5ndGhfcHJlZml4ZWQoJmNlcnRpZmljYXRlX3ZlcmlmeSwgJnNpZ25hdHVyZSkgfHwKICAgICAgIENCU19sZW4oJmNlcnRpZmljYXRlX3ZlcmlmeSkgIT0gMCkgewogICAgIGFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0RFQ09ERV9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jZXJ0X3ZlcmlmeSwgU1NMX1JfREVDT0RFX0VSUk9SKTsKICAgICBnb3RvIGZfZXJyOwogICB9CiAKQEAgLTIwODYsNyArMjEwMCw3IEBACiAgICAgICAhRVZQX1BLRVlfdmVyaWZ5KHBjdHgsIENCU19kYXRhKCZzaWduYXR1cmUpLCBDQlNfbGVuKCZzaWduYXR1cmUpLCBkaWdlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2VzdF9sZW5ndGgpKSB7CiAgICAgYWwgPSBTU0xfQURfREVDUllQVF9FUlJPUjsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0JBRF9TSUdOQVRVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2VydF92ZXJpZnksIFNTTF9SX0JBRF9TSUdOQVRVUkUpOwogICAgIGdvdG8gZl9lcnI7CiAgIH0KIApAQCAtMjEyMywxNCArMjEzNywxNSBAQAogICBpZiAocy0+czMtPnRtcC5tZXNzYWdlX3R5cGUgPT0gU1NMM19NVF9DTElFTlRfS0VZX0VYQ0hBTkdFKSB7CiAgICAgaWYgKChzLT52ZXJpZnlfbW9kZSAmIFNTTF9WRVJJRllfUEVFUikgJiYKICAgICAgICAgKHMtPnZlcmlmeV9tb2RlICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfUEVFUl9ESURfTk9UX1JFVFVSTl9BX0NFUlRJRklDQVRFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2NlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfUEVFUl9ESURfTk9UX1JFVFVSTl9BX0NFUlRJRklDQVRFKTsKICAgICAgIGFsID0gU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAKICAgICAvKiBJZiB0bHMgYXNrZWQgZm9yIGEgY2xpZW50IGNlcnQsIHRoZSBjbGllbnQgbXVzdCByZXR1cm4gYSAwIGxpc3QgKi8KICAgICBpZiAocy0+dmVyc2lvbiA+IFNTTDNfVkVSU0lPTiAmJiBzLT5zMy0+dG1wLmNlcnRfcmVxdWVzdCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLAorICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jbGllbnRfY2VydGlmaWNhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9UTFNfUEVFUl9ESURfTk9UX1JFU1BPTkRfV0lUSF9DRVJUSUZJQ0FURV9MSVNUKTsKICAgICAgIGFsID0gU1NMX0FEX1VORVhQRUNURURfTUVTU0FHRTsKICAgICAgIGdvdG8gZl9lcnI7CkBAIC0yMTQyLDcgKzIxNTcsOCBAQAogCiAgIGlmIChzLT5zMy0+dG1wLm1lc3NhZ2VfdHlwZSAhPSBTU0wzX01UX0NFUlRJRklDQVRFKSB7CiAgICAgYWwgPSBTU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfV1JPTkdfTUVTU0FHRV9UWVBFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9jZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9XUk9OR19NRVNTQUdFX1RZUEUpOwogICAgIGdvdG8gZl9lcnI7CiAgIH0KIApAQCAtMjE1MCwxNCArMjE2NiwxNCBAQAogCiAgIHNrID0gc2tfWDUwOV9uZXdfbnVsbCgpOwogICBpZiAoc2sgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2NlcnRpZmljYXRlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAoIUNCU19nZXRfdTI0X2xlbmd0aF9wcmVmaXhlZCgmY2VydGlmaWNhdGVfbXNnLCAmY2VydGlmaWNhdGVfbGlzdCkgfHwKICAgICAgIENCU19sZW4oJmNlcnRpZmljYXRlX21zZykgIT0gMCkgewogICAgIGFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0RFQ09ERV9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jbGllbnRfY2VydGlmaWNhdGUsIFNTTF9SX0RFQ09ERV9FUlJPUik7CiAgICAgZ290byBmX2VycjsKICAgfQogCkBAIC0yMTY3LDcgKzIxODMsNyBAQAogCiAgICAgaWYgKCFDQlNfZ2V0X3UyNF9sZW5ndGhfcHJlZml4ZWQoJmNlcnRpZmljYXRlX2xpc3QsICZjZXJ0aWZpY2F0ZSkpIHsKICAgICAgIGFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfREVDT0RFX0VSUk9SKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2NlcnRpZmljYXRlLCBTU0xfUl9ERUNPREVfRVJST1IpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAKQEAgLTIxODUsNDIgKzIyMDEsNTAgQEAKICAgICB4ID0gZDJpX1g1MDkoTlVMTCwgJmRhdGEsIENCU19sZW4oJmNlcnRpZmljYXRlKSk7CiAgICAgaWYgKHggPT0gTlVMTCkgewogICAgICAgYWwgPSBTU0xfQURfQkFEX0NFUlRJRklDQVRFOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9BU04xX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9jZXJ0aWZpY2F0ZSwgRVJSX1JfQVNOMV9MSUIpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAgICAgaWYgKGRhdGEgIT0gQ0JTX2RhdGEoJmNlcnRpZmljYXRlKSArIENCU19sZW4oJmNlcnRpZmljYXRlKSkgewogICAgICAgYWwgPSBTU0xfQURfREVDT0RFX0VSUk9SOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9DRVJUX0xFTkdUSF9NSVNNQVRDSCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9jZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX0NFUlRfTEVOR1RIX01JU01BVENIKTsKICAgICAgIGdvdG8gZl9lcnI7CiAgICAgfQogICAgIGlmICghc2tfWDUwOV9wdXNoKHNrLCB4KSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9jZXJ0aWZpY2F0ZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIHggPSBOVUxMOwogICB9CiAKICAgaWYgKHNrX1g1MDlfbnVtKHNrKSA8PSAwKSB7Ci0gICAgLyogTm8gY2xpZW50IGNlcnRpZmljYXRlIHNvIHRoZSBoYW5kc2hha2UgYnVmZmVyIG1heSBiZSBkaXNjYXJkZWQuICovCi0gICAgc3NsM19mcmVlX2hhbmRzaGFrZV9idWZmZXIocyk7Ci0KICAgICAvKiBUTFMgZG9lcyBub3QgbWluZCAwIGNlcnRzIHJldHVybmVkICovCiAgICAgaWYgKHMtPnZlcnNpb24gPT0gU1NMM19WRVJTSU9OKSB7CiAgICAgICBhbCA9IFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfTk9fQ0VSVElGSUNBVEVTX1JFVFVSTkVEKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2NlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfTk9fQ0VSVElGSUNBVEVTX1JFVFVSTkVEKTsKICAgICAgIGdvdG8gZl9lcnI7Ci0gICAgfSBlbHNlIGlmICgocy0+dmVyaWZ5X21vZGUgJiBTU0xfVkVSSUZZX1BFRVIpICYmCisgICAgfQorICAgIC8qIEZhaWwgZm9yIFRMUyBvbmx5IGlmIHdlIHJlcXVpcmVkIGEgY2VydGlmaWNhdGUgKi8KKyAgICBlbHNlIGlmICgocy0+dmVyaWZ5X21vZGUgJiBTU0xfVkVSSUZZX1BFRVIpICYmCiAgICAgICAgICAgICAgKHMtPnZlcmlmeV9tb2RlICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkpIHsKLSAgICAgIC8qIEZhaWwgZm9yIFRMUyBvbmx5IGlmIHdlIHJlcXVpcmVkIGEgY2VydGlmaWNhdGUgKi8KLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfUEVFUl9ESURfTk9UX1JFVFVSTl9BX0NFUlRJRklDQVRFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2xpZW50X2NlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfUEVFUl9ESURfTk9UX1JFVFVSTl9BX0NFUlRJRklDQVRFKTsKICAgICAgIGFsID0gU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOwogICAgICAgZ290byBmX2VycjsKICAgICB9CisgICAgLyogTm8gY2xpZW50IGNlcnRpZmljYXRlIHNvIGRpZ2VzdCBjYWNoZWQgcmVjb3JkcyAqLworICAgIGlmIChzLT5zMy0+aGFuZHNoYWtlX2J1ZmZlciAmJgorICAgICAgICAhc3NsM19kaWdlc3RfY2FjaGVkX3JlY29yZHMocywgZnJlZV9oYW5kc2hha2VfYnVmZmVyKSkgeworICAgICAgYWwgPSBTU0xfQURfSU5URVJOQUxfRVJST1I7CisgICAgICBnb3RvIGZfZXJyOworICAgIH0KICAgfSBlbHNlIHsKICAgICBpID0gc3NsX3ZlcmlmeV9jZXJ0X2NoYWluKHMsIHNrKTsKICAgICBpZiAoaSA8PSAwKSB7CiAgICAgICBhbCA9IHNzbF92ZXJpZnlfYWxhcm1fdHlwZShzLT52ZXJpZnlfcmVzdWx0KTsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfQ0VSVElGSUNBVEVfVkVSSUZZX0ZBSUxFRCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NsaWVudF9jZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX0NFUlRJRklDQVRFX1ZFUklGWV9GQUlMRUQpOwogICAgICAgZ290byBmX2VycjsKICAgICB9CiAgIH0KQEAgLTIyMjksOCArMjI1MywxNyBAQAogICBzLT5zZXNzaW9uLT5wZWVyID0gc2tfWDUwOV9zaGlmdChzayk7CiAgIHMtPnNlc3Npb24tPnZlcmlmeV9yZXN1bHQgPSBzLT52ZXJpZnlfcmVzdWx0OwogCi0gIHNrX1g1MDlfcG9wX2ZyZWUocy0+c2Vzc2lvbi0+Y2VydF9jaGFpbiwgWDUwOV9mcmVlKTsKLSAgcy0+c2Vzc2lvbi0+Y2VydF9jaGFpbiA9IHNrOworICAvKiBXaXRoIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCBzZXNzX2NlcnQgd2lsbCBhbHdheXMgYmUgTlVMTCB3aGVuIHdlCisgICAqIGFycml2ZSBoZXJlLiAqLworICBpZiAocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0ID09IE5VTEwpIHsKKyAgICBzLT5zZXNzaW9uLT5zZXNzX2NlcnQgPSBzc2xfc2Vzc19jZXJ0X25ldygpOworICAgIGlmIChzLT5zZXNzaW9uLT5zZXNzX2NlcnQgPT0gTlVMTCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jbGllbnRfY2VydGlmaWNhdGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorICBza19YNTA5X3BvcF9mcmVlKHMtPnNlc3Npb24tPnNlc3NfY2VydC0+Y2VydF9jaGFpbiwgWDUwOV9mcmVlKTsKKyAgcy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5jZXJ0X2NoYWluID0gc2s7CiAgIC8qIEluY29uc2lzdGVuY3kgYWxlcnQ6IGNlcnRfY2hhaW4gZG9lcyAqbm90KiBpbmNsdWRlIHRoZSBwZWVyJ3Mgb3duCiAgICAqIGNlcnRpZmljYXRlLCB3aGlsZSB3ZSBkbyBpbmNsdWRlIGl0IGluIHMzX2NsbnQuYyAqLwogCkBAIC0yMjUwLDggKzIyODMsMTcgQEAKIH0KIAogaW50IHNzbDNfc2VuZF9zZXJ2ZXJfY2VydGlmaWNhdGUoU1NMICpzKSB7CisgIENFUlRfUEtFWSAqY3BrOworCiAgIGlmIChzLT5zdGF0ZSA9PSBTU0wzX1NUX1NXX0NFUlRfQSkgewotICAgIGlmICghc3NsM19vdXRwdXRfY2VydF9jaGFpbihzKSkgeworICAgIGNwayA9IHNzbF9nZXRfc2VydmVyX3NlbmRfcGtleShzKTsKKyAgICBpZiAoY3BrID09IE5VTEwpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19zZW5kX3NlcnZlcl9jZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghc3NsM19vdXRwdXRfY2VydF9jaGFpbihzLCBjcGspKSB7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgcy0+c3RhdGUgPSBTU0wzX1NUX1NXX0NFUlRfQjsKQEAgLTI0MDIsNyArMjQ0NCw4IEBACiAgIC8qIENsaWVudHMgY2Fubm90IHNlbmQgYSBOZXh0UHJvdG9jb2wgbWVzc2FnZSBpZiB3ZSBkaWRuJ3Qgc2VlIHRoZSBleHRlbnNpb24KICAgICogaW4gdGhlaXIgQ2xpZW50SGVsbG8gKi8KICAgaWYgKCFzLT5zMy0+bmV4dF9wcm90b19uZWdfc2VlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfR09UX05FWFRfUFJPVE9fV0lUSE9VVF9FWFRFTlNJT04pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfbmV4dF9wcm90bywKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9HT1RfTkVYVF9QUk9UT19XSVRIT1VUX0VYVEVOU0lPTik7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKQEAgLTI0MjIsNyArMjQ2NSw4IEBACiAgICAqIFRPRE8oZGF2aWRiZW4pOiBJcyB0aGlzIGNoZWNrIG5vdyByZWR1bmRhbnQgd2l0aAogICAgKiBTU0wzX0ZMQUdTX0VYUEVDVF9DQ1M/ICovCiAgIGlmICghcy0+czMtPmNoYW5nZV9jaXBoZXJfc3BlYykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfR09UX05FWFRfUFJPVE9fQkVGT1JFX0FfQ0NTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X25leHRfcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfR09UX05FWFRfUFJPVE9fQkVGT1JFX0FfQ0NTKTsKICAgICByZXR1cm4gLTE7CiAgIH0KIApAQCAtMjQ0OCwxMCArMjQ5MiwxMSBAQAogaW50IHNzbDNfZ2V0X2NoYW5uZWxfaWQoU1NMICpzKSB7CiAgIGludCByZXQgPSAtMSwgb2s7CiAgIGxvbmcgbjsKLSAgdWludDhfdCBjaGFubmVsX2lkX2hhc2hbRVZQX01BWF9NRF9TSVpFXTsKLSAgc2l6ZV90IGNoYW5uZWxfaWRfaGFzaF9sZW47CisgIEVWUF9NRF9DVFggbWRfY3R4OworICB1aW50OF90IGNoYW5uZWxfaWRfaGFzaFtTSEEyNTZfRElHRVNUX0xFTkdUSF07CisgIHVuc2lnbmVkIGludCBjaGFubmVsX2lkX2hhc2hfbGVuOwogICBjb25zdCB1aW50OF90ICpwOwotICB1aW50MTZfdCBleHRlbnNpb25fdHlwZTsKKyAgdWludDE2X3QgZXh0ZW5zaW9uX3R5cGUsIGV4cGVjdGVkX2V4dGVuc2lvbl90eXBlOwogICBFQ19HUk9VUCAqcDI1NiA9IE5VTEw7CiAgIEVDX0tFWSAqa2V5ID0gTlVMTDsKICAgRUNfUE9JTlQgKnBvaW50ID0gTlVMTDsKQEAgLTI0NzAsOSArMjUxNSwxNSBAQAogCiAgIC8qIEJlZm9yZSBpbmNvcnBvcmF0aW5nIHRoZSBFbmNyeXB0ZWRFeHRlbnNpb25zIG1lc3NhZ2UgdG8gdGhlIGhhbmRzaGFrZQogICAgKiBoYXNoLCBjb21wdXRlIHRoZSBoYXNoIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBzaWduZWQuICovCi0gIGlmICghdGxzMV9jaGFubmVsX2lkX2hhc2gocywgY2hhbm5lbF9pZF9oYXNoLCAmY2hhbm5lbF9pZF9oYXNoX2xlbikpIHsKKyAgY2hhbm5lbF9pZF9oYXNoX2xlbiA9IHNpemVvZihjaGFubmVsX2lkX2hhc2gpOworICBFVlBfTURfQ1RYX2luaXQoJm1kX2N0eCk7CisgIGlmICghRVZQX0RpZ2VzdEluaXRfZXgoJm1kX2N0eCwgRVZQX3NoYTI1NigpLCBOVUxMKSB8fAorICAgICAgIXRsczFfY2hhbm5lbF9pZF9oYXNoKCZtZF9jdHgsIHMpIHx8CisgICAgICAhRVZQX0RpZ2VzdEZpbmFsKCZtZF9jdHgsIGNoYW5uZWxfaWRfaGFzaCwgJmNoYW5uZWxfaWRfaGFzaF9sZW4pKSB7CisgICAgRVZQX01EX0NUWF9jbGVhbnVwKCZtZF9jdHgpOwogICAgIHJldHVybiAtMTsKICAgfQorICBFVlBfTURfQ1RYX2NsZWFudXAoJm1kX2N0eCk7CiAgIGFzc2VydChjaGFubmVsX2lkX2hhc2hfbGVuID09IFNIQTI1Nl9ESUdFU1RfTEVOR1RIKTsKIAogICBpZiAoIXNzbDNfaGFzaF9jdXJyZW50X21lc3NhZ2UocykpIHsKQEAgLTI0ODUsNyArMjUzNiw4IEBACiAgICAqCiAgICAqIFRPRE8oZGF2aWRiZW4pOiBJcyB0aGlzIGNoZWNrIG5vdyByZWR1bmRhbnQgd2l0aCBTU0wzX0ZMQUdTX0VYUEVDVF9DQ1M/ICovCiAgIGlmICghcy0+czMtPmNoYW5nZV9jaXBoZXJfc3BlYykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfR09UX0NIQU5ORUxfSURfQkVGT1JFX0FfQ0NTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NoYW5uZWxfaWQsCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfR09UX0NIQU5ORUxfSURfQkVGT1JFX0FfQ0NTKTsKICAgICByZXR1cm4gLTE7CiAgIH0KIApAQCAtMjUwMiwxOSArMjU1NCwyMyBAQAogICAgKiAgIHVpbnQ4IHlbMzJdOwogICAgKiAgIHVpbnQ4IHJbMzJdOwogICAgKiAgIHVpbnQ4IHNbMzJdOyAqLworICBleHBlY3RlZF9leHRlbnNpb25fdHlwZSA9IFRMU0VYVF9UWVBFX2NoYW5uZWxfaWQ7CisgIGlmIChzLT5zMy0+dGxzZXh0X2NoYW5uZWxfaWRfbmV3KSB7CisgICAgZXhwZWN0ZWRfZXh0ZW5zaW9uX3R5cGUgPSBUTFNFWFRfVFlQRV9jaGFubmVsX2lkX25ldzsKKyAgfQogCiAgIGlmICghQ0JTX2dldF91MTYoJmVuY3J5cHRlZF9leHRlbnNpb25zLCAmZXh0ZW5zaW9uX3R5cGUpIHx8CiAgICAgICAhQ0JTX2dldF91MTZfbGVuZ3RoX3ByZWZpeGVkKCZlbmNyeXB0ZWRfZXh0ZW5zaW9ucywgJmV4dGVuc2lvbikgfHwKICAgICAgIENCU19sZW4oJmVuY3J5cHRlZF9leHRlbnNpb25zKSAhPSAwIHx8Ci0gICAgICBleHRlbnNpb25fdHlwZSAhPSBUTFNFWFRfVFlQRV9jaGFubmVsX2lkIHx8CisgICAgICBleHRlbnNpb25fdHlwZSAhPSBleHBlY3RlZF9leHRlbnNpb25fdHlwZSB8fAogICAgICAgQ0JTX2xlbigmZXh0ZW5zaW9uKSAhPSBUTFNFWFRfQ0hBTk5FTF9JRF9TSVpFKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9JTlZBTElEX01FU1NBR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsM19nZXRfY2hhbm5lbF9pZCwgU1NMX1JfSU5WQUxJRF9NRVNTQUdFKTsKICAgICByZXR1cm4gLTE7CiAgIH0KIAogICBwMjU2ID0gRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUoTklEX1g5XzYyX3ByaW1lMjU2djEpOwogICBpZiAoIXAyNTYpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX05PX1AyNTZfU1VQUE9SVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2wzX2dldF9jaGFubmVsX2lkLCBTU0xfUl9OT19QMjU2X1NVUFBPUlQpOwogICAgIHJldHVybiAtMTsKICAgfQogCkBAIC0yNTQ4LDcgKzI2MDQsOCBAQAogICAvKiBXZSBzdG9yZWQgdGhlIGhhbmRzaGFrZSBoYXNoIGluIHx0bHNleHRfY2hhbm5lbF9pZHwgdGhlIGZpcnN0IHRpbWUgdGhhdCB3ZQogICAgKiB3ZXJlIGNhbGxlZC4gKi8KICAgaWYgKCFFQ0RTQV9kb192ZXJpZnkoY2hhbm5lbF9pZF9oYXNoLCBjaGFubmVsX2lkX2hhc2hfbGVuLCAmc2lnLCBrZXkpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9DSEFOTkVMX0lEX1NJR05BVFVSRV9JTlZBTElEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbDNfZ2V0X2NoYW5uZWxfaWQsCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfQ0hBTk5FTF9JRF9TSUdOQVRVUkVfSU5WQUxJRCk7CiAgICAgcy0+czMtPnRsc2V4dF9jaGFubmVsX2lkX3ZhbGlkID0gMDsKICAgICBnb3RvIGVycjsKICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3NzbC9zc2xfYWVhZF9jdHguYyBiL3NyYy9zc2wvc3NsX2FlYWRfY3R4LmMKaW5kZXggZjkwMDFjNy4uYzJmYmExZCAxMDA2NDQKLS0tIGEvc3JjL3NzbC9zc2xfYWVhZF9jdHguYworKysgYi9zcmMvc3NsL3NzbF9hZWFkX2N0eC5jCkBAIC0xMiw4ICsxMiw2IEBACiAgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCiAgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLwogCi0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KLQogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCkBAIC0zNiw3ICszNCw3IEBACiAgIGNvbnN0IEVWUF9BRUFEICphZWFkOwogICBzaXplX3QgZGlzY2FyZDsKICAgaWYgKCFzc2xfY2lwaGVyX2dldF9ldnBfYWVhZCgmYWVhZCwgJmRpc2NhcmQsICZkaXNjYXJkLCBjaXBoZXIsIHZlcnNpb24pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfQUVBRF9DVFhfbmV3LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNDUsNyArNDMsNyBAQAogICAgIC8qIFRoaXMgaXMgYSAic3RhdGVmdWwiIEFFQUQgKGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJlLUFFQUQgY2lwaGVyCiAgICAgICogc3VpdGVzKS4gKi8KICAgICBpZiAobWFjX2tleV9sZW4gKyBlbmNfa2V5X2xlbiArIGZpeGVkX2l2X2xlbiA+IHNpemVvZihtZXJnZWRfa2V5KSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9BRUFEX0NUWF9uZXcsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBtZW1jcHkobWVyZ2VkX2tleSwgbWFjX2tleSwgbWFjX2tleV9sZW4pOwpAQCAtNTgsNyArNTYsNyBAQAogCiAgIFNTTF9BRUFEX0NUWCAqYWVhZF9jdHggPSAoU1NMX0FFQURfQ1RYICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFNTTF9BRUFEX0NUWCkpOwogICBpZiAoYWVhZF9jdHggPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX0FFQURfQ1RYX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIG1lbXNldChhZWFkX2N0eCwgMCwgc2l6ZW9mKFNTTF9BRUFEX0NUWCkpOwpAQCAtNzgsMTcgKzc2LDE2IEBACiAgICAgaWYgKGZpeGVkX2l2X2xlbiA+IHNpemVvZihhZWFkX2N0eC0+Zml4ZWRfbm9uY2UpIHx8CiAgICAgICAgIGZpeGVkX2l2X2xlbiA+IGFlYWRfY3R4LT52YXJpYWJsZV9ub25jZV9sZW4pIHsKICAgICAgIFNTTF9BRUFEX0NUWF9mcmVlKGFlYWRfY3R4KTsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfQUVBRF9DVFhfbmV3LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgYWVhZF9jdHgtPnZhcmlhYmxlX25vbmNlX2xlbiAtPSBmaXhlZF9pdl9sZW47CiAKICAgICBtZW1jcHkoYWVhZF9jdHgtPmZpeGVkX25vbmNlLCBmaXhlZF9pdiwgZml4ZWRfaXZfbGVuKTsKICAgICBhZWFkX2N0eC0+Zml4ZWRfbm9uY2VfbGVuID0gZml4ZWRfaXZfbGVuOwotICAgIC8qIEFFUy1HQ00gdXNlcyBhbiBleHBsaWNpdCBub25jZS4gKi8KLSAgICBpZiAoY2lwaGVyLT5hbGdvcml0aG1fZW5jICYgKFNTTF9BRVMxMjhHQ00gfCBTU0xfQUVTMjU2R0NNKSkgewotICAgICAgYWVhZF9jdHgtPnZhcmlhYmxlX25vbmNlX2luY2x1ZGVkX2luX3JlY29yZCA9IDE7Ci0gICAgfQorICAgIGFlYWRfY3R4LT52YXJpYWJsZV9ub25jZV9pbmNsdWRlZF9pbl9yZWNvcmQgPQorICAgICAgICAoY2lwaGVyLT5hbGdvcml0aG0yICYKKyAgICAgICAgIFNTTF9DSVBIRVJfQUxHT1JJVEhNMl9WQVJJQUJMRV9OT05DRV9JTkNMVURFRF9JTl9SRUNPUkQpICE9IDA7CiAgIH0gZWxzZSB7CiAgICAgYWVhZF9jdHgtPnZhcmlhYmxlX25vbmNlX2luY2x1ZGVkX2luX3JlY29yZCA9IDE7CiAgICAgYWVhZF9jdHgtPnJhbmRvbV92YXJpYWJsZV9ub25jZSA9IDE7CkBAIC0xNDksNyArMTQ2LDcgQEAKICAgaWYgKGFlYWQgPT0gTlVMTCkgewogICAgIC8qIEhhbmRsZSB0aGUgaW5pdGlhbCBOVUxMIGNpcGhlci4gKi8KICAgICBpZiAoaW5fbGVuID4gbWF4X291dCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX0FFQURfQ1RYX29wZW4sIFNTTF9SX0JVRkZFUl9UT09fU01BTEwpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIG1lbW1vdmUob3V0LCBpbiwgaW5fbGVuKTsKQEAgLTE2NCw3ICsxNjEsNyBAQAogICAgIHNpemVfdCBvdmVyaGVhZCA9IFNTTF9BRUFEX0NUWF9tYXhfb3ZlcmhlYWQoYWVhZCk7CiAgICAgaWYgKGluX2xlbiA8IG92ZXJoZWFkKSB7CiAgICAgICAvKiBQdWJsaWNseSBpbnZhbGlkLiAqLwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CQURfUEFDS0VUX0xFTkdUSCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9BRUFEX0NUWF9vcGVuLCBTU0xfUl9CQURfUEFDS0VUX0xFTkdUSCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgcGxhaW50ZXh0X2xlbiA9IGluX2xlbiAtIG92ZXJoZWFkOwpAQCAtMTgxLDcgKzE3OCw3IEBACiAgIGlmIChhZWFkLT52YXJpYWJsZV9ub25jZV9pbmNsdWRlZF9pbl9yZWNvcmQpIHsKICAgICBpZiAoaW5fbGVuIDwgYWVhZC0+dmFyaWFibGVfbm9uY2VfbGVuKSB7CiAgICAgICAvKiBQdWJsaWNseSBpbnZhbGlkLiAqLwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CQURfUEFDS0VUX0xFTkdUSCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9BRUFEX0NUWF9vcGVuLCBTU0xfUl9CQURfUEFDS0VUX0xFTkdUSCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgbWVtY3B5KG5vbmNlICsgbm9uY2VfbGVuLCBpbiwgYWVhZC0+dmFyaWFibGVfbm9uY2VfbGVuKTsKQEAgLTIwNCw3ICsyMDEsNyBAQAogICBpZiAoYWVhZCA9PSBOVUxMKSB7CiAgICAgLyogSGFuZGxlIHRoZSBpbml0aWFsIE5VTEwgY2lwaGVyLiAqLwogICAgIGlmIChpbl9sZW4gPiBtYXhfb3V0KSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0JVRkZFUl9UT09fU01BTEwpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfQUVBRF9DVFhfc2VhbCwgU1NMX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgbWVtbW92ZShvdXQsIGluLCBpbl9sZW4pOwpAQCAtMjM4LDExICsyMzUsMTEgQEAKICAgc2l6ZV90IGV4dHJhX2xlbiA9IDA7CiAgIGlmIChhZWFkLT52YXJpYWJsZV9ub25jZV9pbmNsdWRlZF9pbl9yZWNvcmQpIHsKICAgICBpZiAobWF4X291dCA8IGFlYWQtPnZhcmlhYmxlX25vbmNlX2xlbikgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX0FFQURfQ1RYX3NlYWwsIFNTTF9SX0JVRkZFUl9UT09fU01BTEwpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGlmIChvdXQgPCBpbiArIGluX2xlbiAmJiBpbiA8IG91dCArIGFlYWQtPnZhcmlhYmxlX25vbmNlX2xlbikgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9PVVRQVVRfQUxJQVNFU19JTlBVVCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9BRUFEX0NUWF9zZWFsLCBTU0xfUl9PVVRQVVRfQUxJQVNFU19JTlBVVCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgbWVtY3B5KG91dCwgbm9uY2UgKyBhZWFkLT5maXhlZF9ub25jZV9sZW4sIGFlYWQtPnZhcmlhYmxlX25vbmNlX2xlbik7CmRpZmYgLS1naXQgYS9zcmMvZGVjcmVwaXQvcnNhL3JzYV9kZWNyZXBpdC5jIGIvc3JjL3NzbC9zc2xfYWxncy5jCnNpbWlsYXJpdHkgaW5kZXggODUlCnJlbmFtZSBmcm9tIHNyYy9kZWNyZXBpdC9yc2EvcnNhX2RlY3JlcGl0LmMKcmVuYW1lIHRvIHNyYy9zc2wvc3NsX2FsZ3MuYwppbmRleCBjMjM4ZjQ2Li5mZGEzOWE1IDEwMDY0NAotLS0gYS9zcmMvZGVjcmVwaXQvcnNhL3JzYV9kZWNyZXBpdC5jCisrKyBiL3NyYy9zc2wvc3NsX2FsZ3MuYwpAQCAtNTQsMzMgKzU0LDEzIEBACiAgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCiAgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLwogCi0jaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KIAotI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KLQotCi1SU0EgKlJTQV9nZW5lcmF0ZV9rZXkoaW50IGJpdHMsIHVuc2lnbmVkIGxvbmcgZV92YWx1ZSwgdm9pZCAqY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2JfYXJnKSB7Ci0gIGFzc2VydChjYWxsYmFjayA9PSBOVUxMKTsKLSAgYXNzZXJ0KGNiX2FyZyA9PSBOVUxMKTsKLQotICBSU0EgKnJzYSA9IFJTQV9uZXcoKTsKLSAgQklHTlVNICplID0gQk5fbmV3KCk7Ci0KLSAgaWYgKHJzYSA9PSBOVUxMIHx8Ci0gICAgICBlID09IE5VTEwgfHwKLSAgICAgICFCTl9zZXRfd29yZChlLCBlX3ZhbHVlKSB8fAotICAgICAgIVJTQV9nZW5lcmF0ZV9rZXlfZXgocnNhLCBiaXRzLCBlLCBOVUxMKSkgewotICAgIGdvdG8gZXJyOwotICB9Ci0KLSAgQk5fZnJlZShlKTsKLSAgcmV0dXJuIHJzYTsKLQotZXJyOgotICBCTl9mcmVlKGUpOwotICBSU0FfZnJlZShyc2EpOwotICByZXR1cm4gTlVMTDsKK2ludCBTU0xfbGlicmFyeV9pbml0KHZvaWQpIHsKKyAgQ1JZUFRPX2xpYnJhcnlfaW5pdCgpOworICByZXR1cm4gMTsKIH0KKwordm9pZCBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKHZvaWQpIHt9CmRpZmYgLS1naXQgYS9zcmMvc3NsL3NzbF9hc24xLmMgYi9zcmMvc3NsL3NzbF9hc24xLmMKaW5kZXggMGQ0NzYwZC4uZDFhYzFiNiAxMDA2NDQKLS0tIGEvc3JjL3NzbC9zc2xfYXNuMS5jCisrKyBiL3NyYy9zc2wvc3NsX2FzbjEuYwpAQCAtODAsOCArODAsNiBAQAogICogT1RIRVIgRU5USVRZIEJBU0VEIE9OIElORlJJTkdFTUVOVCBPRiBJTlRFTExFQ1RVQUwgUFJPUEVSVFkgUklHSFRTIE9SCiAgKiBPVEhFUldJU0UuICovCiAKLSNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgotCiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKQEAgLTExNiwxMCArMTE0LDggQEAKICAqICAgICBzaWduZWRDZXJ0VGltZXN0YW1wTGlzdCBbMTVdIE9DVEVUIFNUUklORyBPUFRJT05BTCwKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGNvbnRlbnRzIG9mIFNDVCBleHRlbnNpb24KICAqICAgICBvY3NwUmVzcG9uc2UgICAgICAgICAgICBbMTZdIE9DVEVUIFNUUklORyBPUFRJT05BTCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHN0YXBsZWQgT0NTUCByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBzdGFwbGVkIE9DU1AgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyCiAgKiAgICAgZXh0ZW5kZWRNYXN0ZXJTZWNyZXQgICAgWzE3XSBCT09MRUFOIE9QVElPTkFMLAotICogICAgIGtleUV4Y2hhbmdlSW5mbyAgICAgICAgIFsxOF0gSU5URUdFUiBPUFRJT05BTCwKLSAqICAgICBjZXJ0Q2hhaW4gICAgICAgICAgICAgICBbMTldIFNFUVVFTkNFIE9GIENlcnRpZmljYXRlIE9QVElPTkFMLAogICogfQogICoKICAqIE5vdGU6IGhpc3RvcmljYWxseSB0aGlzIHNlcmlhbGl6YXRpb24gaGFzIGluY2x1ZGVkIG90aGVyIG9wdGlvbmFsCkBAIC0xNTgsMjggKzE1NCw4IEBACiAgICAgQ0JTX0FTTjFfQ09OU1RSVUNURUQgfCBDQlNfQVNOMV9DT05URVhUX1NQRUNJRklDIHwgMTY7CiBzdGF0aWMgY29uc3QgaW50IGtFeHRlbmRlZE1hc3RlclNlY3JldFRhZyA9CiAgICAgQ0JTX0FTTjFfQ09OU1RSVUNURUQgfCBDQlNfQVNOMV9DT05URVhUX1NQRUNJRklDIHwgMTc7Ci1zdGF0aWMgY29uc3QgaW50IGtLZXlFeGNoYW5nZUluZm9UYWcgPQotICAgIENCU19BU04xX0NPTlNUUlVDVEVEIHwgQ0JTX0FTTjFfQ09OVEVYVF9TUEVDSUZJQyB8IDE4Owotc3RhdGljIGNvbnN0IGludCBrQ2VydENoYWluVGFnID0KLSAgICBDQlNfQVNOMV9DT05TVFJVQ1RFRCB8IENCU19BU04xX0NPTlRFWFRfU1BFQ0lGSUMgfCAxOTsKIAotc3RhdGljIGludCBhZGRfWDUwOShDQkIgKmNiYiwgWDUwOSAqeDUwOSkgewotICBpbnQgbGVuID0gaTJkX1g1MDkoeDUwOSwgTlVMTCk7Ci0gIGlmIChsZW4gPCAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgdWludDhfdCAqYnVmOwotICBpZiAoIUNCQl9hZGRfc3BhY2UoY2JiLCAmYnVmLCBsZW4pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKGJ1ZiAhPSBOVUxMICYmIGkyZF9YNTA5KHg1MDksICZidWYpIDwgMCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IFNTTF9TRVNTSU9OX3RvX2J5dGVzX2Z1bGwoY29uc3QgU1NMX1NFU1NJT04gKmluLCB1aW50OF90ICoqb3V0X2RhdGEsCitzdGF0aWMgaW50IFNTTF9TRVNTSU9OX3RvX2J5dGVzX2Z1bGwoU1NMX1NFU1NJT04gKmluLCB1aW50OF90ICoqb3V0X2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpvdXRfbGVuLCBpbnQgZm9yX3RpY2tldCkgewogICBDQkIgY2JiLCBzZXNzaW9uLCBjaGlsZCwgY2hpbGQyOwogCkBAIC0xODcsOSArMTYzLDExIEBACiAgICAgcmV0dXJuIDA7CiAgIH0KIAotICBDQkJfemVybygmY2JiKTsKLSAgaWYgKCFDQkJfaW5pdCgmY2JiLCAwKSB8fAotICAgICAgIUNCQl9hZGRfYXNuMSgmY2JiLCAmc2Vzc2lvbiwgQ0JTX0FTTjFfU0VRVUVOQ0UpIHx8CisgIGlmICghQ0JCX2luaXQoJmNiYiwgMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghQ0JCX2FkZF9hc24xKCZjYmIsICZzZXNzaW9uLCBDQlNfQVNOMV9TRVFVRU5DRSkgfHwKICAgICAgICFDQkJfYWRkX2FzbjFfdWludDY0KCZzZXNzaW9uLCBTU0xfU0VTU0lPTl9BU04xX1ZFUlNJT04pIHx8CiAgICAgICAhQ0JCX2FkZF9hc24xX3VpbnQ2NCgmc2Vzc2lvbiwgaW4tPnNzbF92ZXJzaW9uKSB8fAogICAgICAgIUNCQl9hZGRfYXNuMSgmc2Vzc2lvbiwgJmNoaWxkLCBDQlNfQVNOMV9PQ1RFVFNUUklORykgfHwKQEAgLTIwMCwxNCArMTc4LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICBmb3JfdGlja2V0ID8gMCA6IGluLT5zZXNzaW9uX2lkX2xlbmd0aCkgfHwKICAgICAgICFDQkJfYWRkX2FzbjEoJnNlc3Npb24sICZjaGlsZCwgQ0JTX0FTTjFfT0NURVRTVFJJTkcpIHx8CiAgICAgICAhQ0JCX2FkZF9ieXRlcygmY2hpbGQsIGluLT5tYXN0ZXJfa2V5LCBpbi0+bWFzdGVyX2tleV9sZW5ndGgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfU0VTU0lPTl90b19ieXRlc19mdWxsLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAoaW4tPnRpbWUgIT0gMCkgewogICAgIGlmICghQ0JCX2FkZF9hc24xKCZzZXNzaW9uLCAmY2hpbGQsIGtUaW1lVGFnKSB8fAogICAgICAgICAhQ0JCX2FkZF9hc24xX3VpbnQ2NCgmY2hpbGQsIGluLT50aW1lKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9TRVNTSU9OX3RvX2J5dGVzX2Z1bGwsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfQpAQCAtMjE1LDcgKzE5Myw3IEBACiAgIGlmIChpbi0+dGltZW91dCAhPSAwKSB7CiAgICAgaWYgKCFDQkJfYWRkX2FzbjEoJnNlc3Npb24sICZjaGlsZCwga1RpbWVvdXRUYWcpIHx8CiAgICAgICAgICFDQkJfYWRkX2FzbjFfdWludDY0KCZjaGlsZCwgaW4tPnRpbWVvdXQpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1NFU1NJT05fdG9fYnl0ZXNfZnVsbCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9CkBAIC0yMjMsMTEgKzIwMSwxNyBAQAogICAvKiBUaGUgcGVlciBjZXJ0aWZpY2F0ZSBpcyBvbmx5IHNlcmlhbGl6ZWQgaWYgdGhlIFNIQS0yNTYgaXNuJ3QKICAgICogc2VyaWFsaXplZCBpbnN0ZWFkLiAqLwogICBpZiAoaW4tPnBlZXIgJiYgIWluLT5wZWVyX3NoYTI1Nl92YWxpZCkgewotICAgIGlmICghQ0JCX2FkZF9hc24xKCZzZXNzaW9uLCAmY2hpbGQsIGtQZWVyVGFnKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgdWludDhfdCAqYnVmOworICAgIGludCBsZW4gPSBpMmRfWDUwOShpbi0+cGVlciwgTlVMTCk7CisgICAgaWYgKGxlbiA8IDApIHsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KLSAgICBpZiAoIWFkZF9YNTA5KCZjaGlsZCwgaW4tPnBlZXIpKSB7CisgICAgaWYgKCFDQkJfYWRkX2FzbjEoJnNlc3Npb24sICZjaGlsZCwga1BlZXJUYWcpIHx8CisgICAgICAgICFDQkJfYWRkX3NwYWNlKCZjaGlsZCwgJmJ1ZiwgbGVuKSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfU0VTU0lPTl90b19ieXRlc19mdWxsLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKGJ1ZiAhPSBOVUxMICYmIGkyZF9YNTA5KGluLT5wZWVyLCAmYnVmKSA8IDApIHsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfQpAQCAtMjM3LDE0ICsyMjEsMTQgQEAKICAgaWYgKCFDQkJfYWRkX2FzbjEoJnNlc3Npb24sICZjaGlsZCwga1Nlc3Npb25JRENvbnRleHRUYWcpIHx8CiAgICAgICAhQ0JCX2FkZF9hc24xKCZjaGlsZCwgJmNoaWxkMiwgQ0JTX0FTTjFfT0NURVRTVFJJTkcpIHx8CiAgICAgICAhQ0JCX2FkZF9ieXRlcygmY2hpbGQyLCBpbi0+c2lkX2N0eCwgaW4tPnNpZF9jdHhfbGVuZ3RoKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1NFU1NJT05fdG9fYnl0ZXNfZnVsbCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKGluLT52ZXJpZnlfcmVzdWx0ICE9IFg1MDlfVl9PSykgewogICAgIGlmICghQ0JCX2FkZF9hc24xKCZzZXNzaW9uLCAmY2hpbGQsIGtWZXJpZnlSZXN1bHRUYWcpIHx8CiAgICAgICAgICFDQkJfYWRkX2FzbjFfdWludDY0KCZjaGlsZCwgaW4tPnZlcmlmeV9yZXN1bHQpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1NFU1NJT05fdG9fYnl0ZXNfZnVsbCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9CkBAIC0yNTQsNyArMjM4LDcgQEAKICAgICAgICAgIUNCQl9hZGRfYXNuMSgmY2hpbGQsICZjaGlsZDIsIENCU19BU04xX09DVEVUU1RSSU5HKSB8fAogICAgICAgICAhQ0JCX2FkZF9ieXRlcygmY2hpbGQyLCAoY29uc3QgdWludDhfdCAqKWluLT50bHNleHRfaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihpbi0+dGxzZXh0X2hvc3RuYW1lKSkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfU0VTU0lPTl90b19ieXRlc19mdWxsLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0KQEAgLTI2NCw3ICsyNDgsNyBAQAogICAgICAgICAhQ0JCX2FkZF9hc24xKCZjaGlsZCwgJmNoaWxkMiwgQ0JTX0FTTjFfT0NURVRTVFJJTkcpIHx8CiAgICAgICAgICFDQkJfYWRkX2J5dGVzKCZjaGlsZDIsIChjb25zdCB1aW50OF90ICopaW4tPnBza19pZGVudGl0eSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGluLT5wc2tfaWRlbnRpdHkpKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9TRVNTSU9OX3RvX2J5dGVzX2Z1bGwsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfQpAQCAtMjcyLDE2ICsyNTYsMTYgQEAKICAgaWYgKGluLT50bHNleHRfdGlja19saWZldGltZV9oaW50ID4gMCkgewogICAgIGlmICghQ0JCX2FkZF9hc24xKCZzZXNzaW9uLCAmY2hpbGQsIGtUaWNrZXRMaWZldGltZUhpbnRUYWcpIHx8CiAgICAgICAgICFDQkJfYWRkX2FzbjFfdWludDY0KCZjaGlsZCwgaW4tPnRsc2V4dF90aWNrX2xpZmV0aW1lX2hpbnQpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1NFU1NJT05fdG9fYnl0ZXNfZnVsbCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9CiAKLSAgaWYgKGluLT50bHNleHRfdGljayAmJiAhZm9yX3RpY2tldCkgeworICBpZiAoaW4tPnRsc2V4dF90aWNrKSB7CiAgICAgaWYgKCFDQkJfYWRkX2FzbjEoJnNlc3Npb24sICZjaGlsZCwga1RpY2tldFRhZykgfHwKICAgICAgICAgIUNCQl9hZGRfYXNuMSgmY2hpbGQsICZjaGlsZDIsIENCU19BU04xX09DVEVUU1RSSU5HKSB8fAogICAgICAgICAhQ0JCX2FkZF9ieXRlcygmY2hpbGQyLCBpbi0+dGxzZXh0X3RpY2ssIGluLT50bHNleHRfdGlja2xlbikpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfU0VTU0lPTl90b19ieXRlc19mdWxsLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0KQEAgLTI5MCw3ICsyNzQsNyBAQAogICAgIGlmICghQ0JCX2FkZF9hc24xKCZzZXNzaW9uLCAmY2hpbGQsIGtQZWVyU0hBMjU2VGFnKSB8fAogICAgICAgICAhQ0JCX2FkZF9hc24xKCZjaGlsZCwgJmNoaWxkMiwgQ0JTX0FTTjFfT0NURVRTVFJJTkcpIHx8CiAgICAgICAgICFDQkJfYWRkX2J5dGVzKCZjaGlsZDIsIGluLT5wZWVyX3NoYTI1Niwgc2l6ZW9mKGluLT5wZWVyX3NoYTI1NikpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1NFU1NJT05fdG9fYnl0ZXNfZnVsbCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9CkBAIC0zMDAsNyArMjg0LDcgQEAKICAgICAgICAgIUNCQl9hZGRfYXNuMSgmY2hpbGQsICZjaGlsZDIsIENCU19BU04xX09DVEVUU1RSSU5HKSB8fAogICAgICAgICAhQ0JCX2FkZF9ieXRlcygmY2hpbGQyLCBpbi0+b3JpZ2luYWxfaGFuZHNoYWtlX2hhc2gsCiAgICAgICAgICAgICAgICAgICAgICAgIGluLT5vcmlnaW5hbF9oYW5kc2hha2VfaGFzaF9sZW4pKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1NFU1NJT05fdG9fYnl0ZXNfZnVsbCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9CkBAIC0zMTAsNyArMjk0LDcgQEAKICAgICAgICAgIUNCQl9hZGRfYXNuMSgmY2hpbGQsICZjaGlsZDIsIENCU19BU04xX09DVEVUU1RSSU5HKSB8fAogICAgICAgICAhQ0JCX2FkZF9ieXRlcygmY2hpbGQyLCBpbi0+dGxzZXh0X3NpZ25lZF9jZXJ0X3RpbWVzdGFtcF9saXN0LAogICAgICAgICAgICAgICAgICAgICAgICBpbi0+dGxzZXh0X3NpZ25lZF9jZXJ0X3RpbWVzdGFtcF9saXN0X2xlbmd0aCkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfU0VTU0lPTl90b19ieXRlc19mdWxsLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0KQEAgLTMxOSw3ICszMDMsNyBAQAogICAgIGlmICghQ0JCX2FkZF9hc24xKCZzZXNzaW9uLCAmY2hpbGQsIGtPQ1NQUmVzcG9uc2VUYWcpIHx8CiAgICAgICAgICFDQkJfYWRkX2FzbjEoJmNoaWxkLCAmY2hpbGQyLCBDQlNfQVNOMV9PQ1RFVFNUUklORykgfHwKICAgICAgICAgIUNCQl9hZGRfYnl0ZXMoJmNoaWxkMiwgaW4tPm9jc3BfcmVzcG9uc2UsIGluLT5vY3NwX3Jlc3BvbnNlX2xlbmd0aCkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfU0VTU0lPTl90b19ieXRlc19mdWxsLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0KQEAgLTMyOCwzNSArMzEyLDEzIEBACiAgICAgaWYgKCFDQkJfYWRkX2FzbjEoJnNlc3Npb24sICZjaGlsZCwga0V4dGVuZGVkTWFzdGVyU2VjcmV0VGFnKSB8fAogICAgICAgICAhQ0JCX2FkZF9hc24xKCZjaGlsZCwgJmNoaWxkMiwgQ0JTX0FTTjFfQk9PTEVBTikgfHwKICAgICAgICAgIUNCQl9hZGRfdTgoJmNoaWxkMiwgMHhmZikpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfU0VTU0lPTl90b19ieXRlc19mdWxsLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0KIAotICBpZiAoaW4tPmtleV9leGNoYW5nZV9pbmZvID4gMCAmJgotICAgICAgKCFDQkJfYWRkX2FzbjEoJnNlc3Npb24sICZjaGlsZCwga0tleUV4Y2hhbmdlSW5mb1RhZykgfHwKLSAgICAgICAhQ0JCX2FkZF9hc24xX3VpbnQ2NCgmY2hpbGQsIGluLT5rZXlfZXhjaGFuZ2VfaW5mbykpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICAvKiBUaGUgY2VydGlmaWNhdGUgY2hhaW4gaXMgb25seSBzZXJpYWxpemVkIGlmIHRoZSBsZWFmJ3MgU0hBLTI1NiBpc24ndAotICAgKiBzZXJpYWxpemVkIGluc3RlYWQuICovCi0gIGlmIChpbi0+Y2VydF9jaGFpbiAhPSBOVUxMICYmICFpbi0+cGVlcl9zaGEyNTZfdmFsaWQpIHsKLSAgICBpZiAoIUNCQl9hZGRfYXNuMSgmc2Vzc2lvbiwgJmNoaWxkLCBrQ2VydENoYWluVGFnKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7Ci0gICAgICBnb3RvIGVycjsKLSAgICB9Ci0gICAgc2l6ZV90IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfbnVtKGluLT5jZXJ0X2NoYWluKTsgaSsrKSB7Ci0gICAgICBpZiAoIWFkZF9YNTA5KCZjaGlsZCwgc2tfWDUwOV92YWx1ZShpbi0+Y2VydF9jaGFpbiwgaSkpKSB7Ci0gICAgICAgIGdvdG8gZXJyOwotICAgICAgfQotICAgIH0KLSAgfQotCiAgIGlmICghQ0JCX2ZpbmlzaCgmY2JiLCBvdXRfZGF0YSwgb3V0X2xlbikpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9TRVNTSU9OX3RvX2J5dGVzX2Z1bGwsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogICByZXR1cm4gMTsKQEAgLTM2NiwxMiArMzI4LDExIEBACiAgIHJldHVybiAwOwogfQogCi1pbnQgU1NMX1NFU1NJT05fdG9fYnl0ZXMoY29uc3QgU1NMX1NFU1NJT04gKmluLCB1aW50OF90ICoqb3V0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpvdXRfbGVuKSB7CitpbnQgU1NMX1NFU1NJT05fdG9fYnl0ZXMoU1NMX1NFU1NJT04gKmluLCB1aW50OF90ICoqb3V0X2RhdGEsIHNpemVfdCAqb3V0X2xlbikgewogICByZXR1cm4gU1NMX1NFU1NJT05fdG9fYnl0ZXNfZnVsbChpbiwgb3V0X2RhdGEsIG91dF9sZW4sIDApOwogfQogCi1pbnQgU1NMX1NFU1NJT05fdG9fYnl0ZXNfZm9yX3RpY2tldChjb25zdCBTU0xfU0VTU0lPTiAqaW4sIHVpbnQ4X3QgKipvdXRfZGF0YSwKK2ludCBTU0xfU0VTU0lPTl90b19ieXRlc19mb3JfdGlja2V0KFNTTF9TRVNTSU9OICppbiwgdWludDhfdCAqKm91dF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpvdXRfbGVuKSB7CiAgIHJldHVybiBTU0xfU0VTU0lPTl90b19ieXRlc19mdWxsKGluLCBvdXRfZGF0YSwgb3V0X2xlbiwgMSk7CiB9CkBAIC0zODYsNyArMzQ3LDcgQEAKIAogICBpZiAobGVuID4gSU5UX01BWCkgewogICAgIE9QRU5TU0xfZnJlZShvdXQpOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfT1ZFUkZMT1cpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgaTJkX1NTTF9TRVNTSU9OLCBFUlJfUl9PVkVSRkxPVyk7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKQEAgLTM5OSwyNiArMzYwLDI2IEBACiAgIHJldHVybiBsZW47CiB9CiAKLS8qIFNTTF9TRVNTSU9OX3BhcnNlX3N0cmluZyBnZXRzIGFuIG9wdGlvbmFsIEFTTi4xIE9DVEVUIFNUUklORworLyogZDJpX1NTTF9TRVNTSU9OX2dldF9zdHJpbmcgZ2V0cyBhbiBvcHRpb25hbCBBU04uMSBPQ1RFVCBTVFJJTkcKICAqIGV4cGxpY2l0bHkgdGFnZ2VkIHdpdGggfHRhZ3wgZnJvbSB8Y2JzfCBhbmQgc2F2ZXMgaXQgaW4gfCpvdXR8LiBPbgogICogZW50cnksIGlmIHwqb3V0fCBpcyBub3QgTlVMTCwgaXQgZnJlZXMgdGhlIGV4aXN0aW5nIGNvbnRlbnRzLiBJZgogICogdGhlIGVsZW1lbnQgd2FzIG5vdCBmb3VuZCwgaXQgc2V0cyB8Km91dHwgdG8gTlVMTC4gSXQgcmV0dXJucyBvbmUKICAqIG9uIHN1Y2Nlc3MsIHdoZXRoZXIgb3Igbm90IHRoZSBlbGVtZW50IHdhcyBmb3VuZCwgYW5kIHplcm8gb24KICAqIGRlY29kZSBlcnJvci4gKi8KLXN0YXRpYyBpbnQgU1NMX1NFU1NJT05fcGFyc2Vfc3RyaW5nKENCUyAqY2JzLCBjaGFyICoqb3V0LCB1bnNpZ25lZCB0YWcpIHsKK3N0YXRpYyBpbnQgZDJpX1NTTF9TRVNTSU9OX2dldF9zdHJpbmcoQ0JTICpjYnMsIGNoYXIgKipvdXQsIHVuc2lnbmVkIHRhZykgewogICBDQlMgdmFsdWU7CiAgIGludCBwcmVzZW50OwogICBpZiAoIUNCU19nZXRfb3B0aW9uYWxfYXNuMV9vY3RldF9zdHJpbmcoY2JzLCAmdmFsdWUsICZwcmVzZW50LCB0YWcpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9JTlZBTElEX1NTTF9TRVNTSU9OKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGQyaV9TU0xfU0VTU0lPTiwgU1NMX1JfSU5WQUxJRF9TU0xfU0VTU0lPTik7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKHByZXNlbnQpIHsKICAgICBpZiAoQ0JTX2NvbnRhaW5zX3plcm9fYnl0ZSgmdmFsdWUpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0lOVkFMSURfU1NMX1NFU1NJT04pOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkMmlfU1NMX1NFU1NJT04sIFNTTF9SX0lOVkFMSURfU1NMX1NFU1NJT04pOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGlmICghQ0JTX3N0cmR1cCgmdmFsdWUsIG91dCkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkMmlfU1NMX1NFU1NJT04sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgfSBlbHNlIHsKQEAgLTQyOCwxNzUgKzM4OSwxODAgQEAKICAgcmV0dXJuIDE7CiB9CiAKLS8qIFNTTF9TRVNTSU9OX3BhcnNlX3N0cmluZyBnZXRzIGFuIG9wdGlvbmFsIEFTTi4xIE9DVEVUIFNUUklORworLyogZDJpX1NTTF9TRVNTSU9OX2dldF9zdHJpbmcgZ2V0cyBhbiBvcHRpb25hbCBBU04uMSBPQ1RFVCBTVFJJTkcKICAqIGV4cGxpY2l0bHkgdGFnZ2VkIHdpdGggfHRhZ3wgZnJvbSB8Y2JzfCBhbmQgc3Rvd3MgaXQgaW4gfCpvdXRfcHRyfAogICogYW5kIHwqb3V0X2xlbnwuIElmIHwqb3V0X3B0cnwgaXMgbm90IE5VTEwsIGl0IGZyZWVzIHRoZSBleGlzdGluZwogICogY29udGVudHMuIE9uIGVudHJ5LCBpZiB0aGUgZWxlbWVudCB3YXMgbm90IGZvdW5kLCBpdCBzZXRzCiAgKiB8Km91dF9wdHJ8IHRvIE5VTEwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MsIHdoZXRoZXIgb3Igbm90IHRoZQogICogZWxlbWVudCB3YXMgZm91bmQsIGFuZCB6ZXJvIG9uIGRlY29kZSBlcnJvci4gKi8KLXN0YXRpYyBpbnQgU1NMX1NFU1NJT05fcGFyc2Vfb2N0ZXRfc3RyaW5nKENCUyAqY2JzLCB1aW50OF90ICoqb3V0X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqb3V0X2xlbiwgdW5zaWduZWQgdGFnKSB7CitzdGF0aWMgaW50IGQyaV9TU0xfU0VTU0lPTl9nZXRfb2N0ZXRfc3RyaW5nKENCUyAqY2JzLCB1aW50OF90ICoqb3V0X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpvdXRfbGVuLCB1bnNpZ25lZCB0YWcpIHsKICAgQ0JTIHZhbHVlOwogICBpZiAoIUNCU19nZXRfb3B0aW9uYWxfYXNuMV9vY3RldF9zdHJpbmcoY2JzLCAmdmFsdWUsIE5VTEwsIHRhZykpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0lOVkFMSURfU1NMX1NFU1NJT04pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgZDJpX1NTTF9TRVNTSU9OLCBTU0xfUl9JTlZBTElEX1NTTF9TRVNTSU9OKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoIUNCU19zdG93KCZ2YWx1ZSwgb3V0X3B0ciwgb3V0X2xlbikpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGQyaV9TU0xfU0VTU0lPTiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiAwOwogICB9CiAgIHJldHVybiAxOwogfQogCi0vKiBTU0xfU0VTU0lPTl9wYXJzZV9ib3VuZGVkX29jdGV0X3N0cmluZyBwYXJzZXMgYW4gb3B0aW9uYWwgQVNOLjEgT0NURVQgU1RSSU5HCi0gKiBleHBsaWNpdGx5IHRhZ2dlZCB3aXRoIHx0YWd8IG9mIHNpemUgYXQgbW9zdCB8bWF4X291dHwuICovCi1zdGF0aWMgaW50IFNTTF9TRVNTSU9OX3BhcnNlX2JvdW5kZWRfb2N0ZXRfc3RyaW5nKAotICAgIENCUyAqY2JzLCB1aW50OF90ICpvdXQsIHVuc2lnbmVkICpvdXRfbGVuLCB1bnNpZ25lZCBtYXhfb3V0LCB1bnNpZ25lZCB0YWcpIHsKLSAgQ0JTIHZhbHVlOwotICBpZiAoIUNCU19nZXRfb3B0aW9uYWxfYXNuMV9vY3RldF9zdHJpbmcoY2JzLCAmdmFsdWUsIE5VTEwsIHRhZykgfHwKLSAgICAgIENCU19sZW4oJnZhbHVlKSA+IG1heF9vdXQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0lOVkFMSURfU1NMX1NFU1NJT04pOwotICAgIHJldHVybiAwOwotICB9Ci0gIG1lbWNweShvdXQsIENCU19kYXRhKCZ2YWx1ZSksIENCU19sZW4oJnZhbHVlKSk7Ci0gICpvdXRfbGVuID0gKHVuc2lnbmVkKUNCU19sZW4oJnZhbHVlKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgU1NMX1NFU1NJT05fcGFyc2VfbG9uZyhDQlMgKmNicywgbG9uZyAqb3V0LCB1bnNpZ25lZCB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkZWZhdWx0X3ZhbHVlKSB7Ci0gIHVpbnQ2NF90IHZhbHVlOwotICBpZiAoIUNCU19nZXRfb3B0aW9uYWxfYXNuMV91aW50NjQoY2JzLCAmdmFsdWUsIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdClkZWZhdWx0X3ZhbHVlKSB8fAotICAgICAgdmFsdWUgPiBMT05HX01BWCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfSU5WQUxJRF9TU0xfU0VTU0lPTik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgKm91dCA9IChsb25nKXZhbHVlOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBTU0xfU0VTU0lPTl9wYXJzZV91MzIoQ0JTICpjYnMsIHVpbnQzMl90ICpvdXQsIHVuc2lnbmVkIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlZmF1bHRfdmFsdWUpIHsKLSAgdWludDY0X3QgdmFsdWU7Ci0gIGlmICghQ0JTX2dldF9vcHRpb25hbF9hc24xX3VpbnQ2NChjYnMsICZ2YWx1ZSwgdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KWRlZmF1bHRfdmFsdWUpIHx8Ci0gICAgICB2YWx1ZSA+IDB4ZmZmZmZmZmYpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0lOVkFMSURfU1NMX1NFU1NJT04pOwotICAgIHJldHVybiAwOwotICB9Ci0gICpvdXQgPSAodWludDMyX3QpdmFsdWU7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgWDUwOSAqcGFyc2VfeDUwOShDQlMgKmNicykgewotICBjb25zdCB1aW50OF90ICpwdHIgPSBDQlNfZGF0YShjYnMpOwotICBYNTA5ICpyZXQgPSBkMmlfWDUwOShOVUxMLCAmcHRyLCBDQlNfbGVuKGNicykpOwotICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBDQlNfc2tpcChjYnMsIHB0ciAtIENCU19kYXRhKGNicykpOwotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgU1NMX1NFU1NJT04gKlNTTF9TRVNTSU9OX3BhcnNlKENCUyAqY2JzKSB7Ci0gIFNTTF9TRVNTSU9OICpyZXQgPSBTU0xfU0VTU0lPTl9uZXcoKTsKLSAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICBDQlMgc2Vzc2lvbjsKK1NTTF9TRVNTSU9OICpkMmlfU1NMX1NFU1NJT04oU1NMX1NFU1NJT04gKiphLCBjb25zdCB1aW50OF90ICoqcHAsIGxvbmcgbGVuZ3RoKSB7CisgIFNTTF9TRVNTSU9OICpyZXQsICphbGxvY2F0ZWQgPSBOVUxMOworICBDQlMgY2JzLCBzZXNzaW9uLCBjaXBoZXIsIHNlc3Npb25faWQsIG1hc3Rlcl9rZXk7CisgIENCUyBwZWVyLCBzaWRfY3R4LCBwZWVyX3NoYTI1Niwgb3JpZ2luYWxfaGFuZHNoYWtlX2hhc2g7CisgIGludCBoYXNfcGVlciwgaGFzX3BlZXJfc2hhMjU2LCBleHRlbmRlZF9tYXN0ZXJfc2VjcmV0OwogICB1aW50NjRfdCB2ZXJzaW9uLCBzc2xfdmVyc2lvbjsKLSAgaWYgKCFDQlNfZ2V0X2FzbjEoY2JzLCAmc2Vzc2lvbiwgQ0JTX0FTTjFfU0VRVUVOQ0UpIHx8CisgIHVpbnQ2NF90IHNlc3Npb25fdGltZSwgdGltZW91dCwgdmVyaWZ5X3Jlc3VsdCwgdGlja2V0X2xpZmV0aW1lX2hpbnQ7CisKKyAgaWYgKGEgJiYgKmEpIHsKKyAgICByZXQgPSAqYTsKKyAgfSBlbHNlIHsKKyAgICByZXQgPSBhbGxvY2F0ZWQgPSBTU0xfU0VTU0lPTl9uZXcoKTsKKyAgICBpZiAoYWxsb2NhdGVkID09IE5VTEwpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIENCU19pbml0KCZjYnMsICpwcCwgbGVuZ3RoKTsKKyAgaWYgKCFDQlNfZ2V0X2FzbjEoJmNicywgJnNlc3Npb24sIENCU19BU04xX1NFUVVFTkNFKSB8fAogICAgICAgIUNCU19nZXRfYXNuMV91aW50NjQoJnNlc3Npb24sICZ2ZXJzaW9uKSB8fAotICAgICAgdmVyc2lvbiAhPSBTU0xfU0VTU0lPTl9BU04xX1ZFUlNJT04gfHwKLSAgICAgICFDQlNfZ2V0X2FzbjFfdWludDY0KCZzZXNzaW9uLCAmc3NsX3ZlcnNpb24pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9JTlZBTElEX1NTTF9TRVNTSU9OKTsKKyAgICAgICFDQlNfZ2V0X2FzbjFfdWludDY0KCZzZXNzaW9uLCAmc3NsX3ZlcnNpb24pIHx8CisgICAgICAhQ0JTX2dldF9hc24xKCZzZXNzaW9uLCAmY2lwaGVyLCBDQlNfQVNOMV9PQ1RFVFNUUklORykgfHwKKyAgICAgICFDQlNfZ2V0X2FzbjEoJnNlc3Npb24sICZzZXNzaW9uX2lkLCBDQlNfQVNOMV9PQ1RFVFNUUklORykgfHwKKyAgICAgICFDQlNfZ2V0X2FzbjEoJnNlc3Npb24sICZtYXN0ZXJfa2V5LCBDQlNfQVNOMV9PQ1RFVFNUUklORykgfHwKKyAgICAgICFDQlNfZ2V0X29wdGlvbmFsX2FzbjFfdWludDY0KCZzZXNzaW9uLCAmc2Vzc2lvbl90aW1lLCBrVGltZVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUoTlVMTCkpIHx8CisgICAgICAhQ0JTX2dldF9vcHRpb25hbF9hc24xX3VpbnQ2NCgmc2Vzc2lvbiwgJnRpbWVvdXQsIGtUaW1lb3V0VGFnLCAzKSB8fAorICAgICAgIUNCU19nZXRfb3B0aW9uYWxfYXNuMSgmc2Vzc2lvbiwgJnBlZXIsICZoYXNfcGVlciwga1BlZXJUYWcpIHx8CisgICAgICAhQ0JTX2dldF9vcHRpb25hbF9hc24xX29jdGV0X3N0cmluZygmc2Vzc2lvbiwgJnNpZF9jdHgsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU2Vzc2lvbklEQ29udGV4dFRhZykgfHwKKyAgICAgICFDQlNfZ2V0X29wdGlvbmFsX2FzbjFfdWludDY0KCZzZXNzaW9uLCAmdmVyaWZ5X3Jlc3VsdCwga1ZlcmlmeVJlc3VsdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfVl9PSykpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGQyaV9TU0xfU0VTU0lPTiwgU1NMX1JfSU5WQUxJRF9TU0xfU0VTU0lPTik7CiAgICAgZ290byBlcnI7CiAgIH0KKyAgaWYgKCFkMmlfU1NMX1NFU1NJT05fZ2V0X3N0cmluZygmc2Vzc2lvbiwgJnJldC0+dGxzZXh0X2hvc3RuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtIb3N0TmFtZVRhZykgfHwKKyAgICAgICFkMmlfU1NMX1NFU1NJT05fZ2V0X3N0cmluZygmc2Vzc2lvbiwgJnJldC0+cHNrX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtQU0tJZGVudGl0eVRhZykpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBpZiAoIUNCU19nZXRfb3B0aW9uYWxfYXNuMV91aW50NjQoJnNlc3Npb24sICZ0aWNrZXRfbGlmZXRpbWVfaGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUaWNrZXRMaWZldGltZUhpbnRUYWcsIDApKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkMmlfU1NMX1NFU1NJT04sIFNTTF9SX0lOVkFMSURfU1NMX1NFU1NJT04pOworICAgIGdvdG8gZXJyOworICB9CisgIGlmICghZDJpX1NTTF9TRVNTSU9OX2dldF9vY3RldF9zdHJpbmcoJnNlc3Npb24sICZyZXQtPnRsc2V4dF90aWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXQtPnRsc2V4dF90aWNrbGVuLCBrVGlja2V0VGFnKSkgeworICAgIGdvdG8gZXJyOworICB9CisgIGlmICghQ0JTX2dldF9vcHRpb25hbF9hc24xX29jdGV0X3N0cmluZygmc2Vzc2lvbiwgJnBlZXJfc2hhMjU2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhc19wZWVyX3NoYTI1Niwga1BlZXJTSEEyNTZUYWcpIHx8CisgICAgICAhQ0JTX2dldF9vcHRpb25hbF9hc24xX29jdGV0X3N0cmluZygmc2Vzc2lvbiwgJm9yaWdpbmFsX2hhbmRzaGFrZV9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwga09yaWdpbmFsSGFuZHNoYWtlSGFzaFRhZykpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGQyaV9TU0xfU0VTU0lPTiwgU1NMX1JfSU5WQUxJRF9TU0xfU0VTU0lPTik7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKCFkMmlfU1NMX1NFU1NJT05fZ2V0X29jdGV0X3N0cmluZygKKyAgICAgICAgICAmc2Vzc2lvbiwgJnJldC0+dGxzZXh0X3NpZ25lZF9jZXJ0X3RpbWVzdGFtcF9saXN0LAorICAgICAgICAgICZyZXQtPnRsc2V4dF9zaWduZWRfY2VydF90aW1lc3RhbXBfbGlzdF9sZW5ndGgsCisgICAgICAgICAga1NpZ25lZENlcnRUaW1lc3RhbXBMaXN0VGFnKSB8fAorICAgICAgIWQyaV9TU0xfU0VTU0lPTl9nZXRfb2N0ZXRfc3RyaW5nKAorICAgICAgICAgICZzZXNzaW9uLCAmcmV0LT5vY3NwX3Jlc3BvbnNlLCAmcmV0LT5vY3NwX3Jlc3BvbnNlX2xlbmd0aCwKKyAgICAgICAgICBrT0NTUFJlc3BvbnNlVGFnKSkgeworICAgIGdvdG8gZXJyOworICB9CisgIGlmICghQ0JTX2dldF9vcHRpb25hbF9hc24xX2Jvb2woJnNlc3Npb24sICZleHRlbmRlZF9tYXN0ZXJfc2VjcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtFeHRlbmRlZE1hc3RlclNlY3JldFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGRlZmF1bHQgdG8gZmFsc2UgKi8pIHx8CisgICAgICBDQlNfbGVuKCZzZXNzaW9uKSAhPSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkMmlfU1NMX1NFU1NJT04sIFNTTF9SX0lOVkFMSURfU1NMX1NFU1NJT04pOworICAgIGdvdG8gZXJyOworICB9CisgIHJldC0+ZXh0ZW5kZWRfbWFzdGVyX3NlY3JldCA9IGV4dGVuZGVkX21hc3Rlcl9zZWNyZXQ7CisKKyAgaWYgKHZlcnNpb24gIT0gU1NMX1NFU1NJT05fQVNOMV9WRVJTSU9OKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkMmlfU1NMX1NFU1NJT04sIFNTTF9SX0lOVkFMSURfU1NMX1NFU1NJT04pOworICAgIGdvdG8gZXJyOworICB9CisKICAgLyogT25seSBzdXBwb3J0IFNTTHYzL1RMUyBhbmQgRFRMUy4gKi8KICAgaWYgKChzc2xfdmVyc2lvbiA+PiA4KSAhPSBTU0wzX1ZFUlNJT05fTUFKT1IgJiYKICAgICAgIChzc2xfdmVyc2lvbiA+PiA4KSAhPSAoRFRMUzFfVkVSU0lPTiA+PiA4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfVU5LTk9XTl9TU0xfVkVSU0lPTik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkMmlfU1NMX1NFU1NJT04sIFNTTF9SX1VOS05PV05fU1NMX1ZFUlNJT04pOwogICAgIGdvdG8gZXJyOwogICB9CiAgIHJldC0+c3NsX3ZlcnNpb24gPSBzc2xfdmVyc2lvbjsKIAotICBDQlMgY2lwaGVyOwogICB1aW50MTZfdCBjaXBoZXJfdmFsdWU7Ci0gIGlmICghQ0JTX2dldF9hc24xKCZzZXNzaW9uLCAmY2lwaGVyLCBDQlNfQVNOMV9PQ1RFVFNUUklORykgfHwKLSAgICAgICFDQlNfZ2V0X3UxNigmY2lwaGVyLCAmY2lwaGVyX3ZhbHVlKSB8fAotICAgICAgQ0JTX2xlbigmY2lwaGVyKSAhPSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9JTlZBTElEX1NTTF9TRVNTSU9OKTsKKyAgaWYgKCFDQlNfZ2V0X3UxNigmY2lwaGVyLCAmY2lwaGVyX3ZhbHVlKSB8fCBDQlNfbGVuKCZjaXBoZXIpICE9IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGQyaV9TU0xfU0VTU0lPTiwgU1NMX1JfQ0lQSEVSX0NPREVfV1JPTkdfTEVOR1RIKTsKICAgICBnb3RvIGVycjsKICAgfQogICByZXQtPmNpcGhlciA9IFNTTF9nZXRfY2lwaGVyX2J5X3ZhbHVlKGNpcGhlcl92YWx1ZSk7CiAgIGlmIChyZXQtPmNpcGhlciA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9VTlNVUFBPUlRFRF9DSVBIRVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgZDJpX1NTTF9TRVNTSU9OLCBTU0xfUl9VTlNVUFBPUlRFRF9DSVBIRVIpOwogICAgIGdvdG8gZXJyOwogICB9CiAKLSAgQ0JTIHNlc3Npb25faWQsIG1hc3Rlcl9rZXk7Ci0gIGlmICghQ0JTX2dldF9hc24xKCZzZXNzaW9uLCAmc2Vzc2lvbl9pZCwgQ0JTX0FTTjFfT0NURVRTVFJJTkcpIHx8Ci0gICAgICBDQlNfbGVuKCZzZXNzaW9uX2lkKSA+IFNTTDNfTUFYX1NTTF9TRVNTSU9OX0lEX0xFTkdUSCB8fAotICAgICAgIUNCU19nZXRfYXNuMSgmc2Vzc2lvbiwgJm1hc3Rlcl9rZXksIENCU19BU04xX09DVEVUU1RSSU5HKSB8fAotICAgICAgQ0JTX2xlbigmbWFzdGVyX2tleSkgPiBTU0xfTUFYX01BU1RFUl9LRVlfTEVOR1RIKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9JTlZBTElEX1NTTF9TRVNTSU9OKTsKKyAgaWYgKENCU19sZW4oJnNlc3Npb25faWQpID4gU1NMM19NQVhfU1NMX1NFU1NJT05fSURfTEVOR1RIKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkMmlfU1NMX1NFU1NJT04sIFNTTF9SX0lOVkFMSURfU1NMX1NFU1NJT04pOwogICAgIGdvdG8gZXJyOwogICB9CiAgIG1lbWNweShyZXQtPnNlc3Npb25faWQsIENCU19kYXRhKCZzZXNzaW9uX2lkKSwgQ0JTX2xlbigmc2Vzc2lvbl9pZCkpOwogICByZXQtPnNlc3Npb25faWRfbGVuZ3RoID0gQ0JTX2xlbigmc2Vzc2lvbl9pZCk7CisKKyAgaWYgKENCU19sZW4oJm1hc3Rlcl9rZXkpID4gU1NMX01BWF9NQVNURVJfS0VZX0xFTkdUSCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgZDJpX1NTTF9TRVNTSU9OLCBTU0xfUl9JTlZBTElEX1NTTF9TRVNTSU9OKTsKKyAgICBnb3RvIGVycjsKKyAgfQogICBtZW1jcHkocmV0LT5tYXN0ZXJfa2V5LCBDQlNfZGF0YSgmbWFzdGVyX2tleSksIENCU19sZW4oJm1hc3Rlcl9rZXkpKTsKICAgcmV0LT5tYXN0ZXJfa2V5X2xlbmd0aCA9IENCU19sZW4oJm1hc3Rlcl9rZXkpOwogCi0gIGlmICghU1NMX1NFU1NJT05fcGFyc2VfbG9uZygmc2Vzc2lvbiwgJnJldC0+dGltZSwga1RpbWVUYWcsIHRpbWUoTlVMTCkpIHx8Ci0gICAgICAhU1NMX1NFU1NJT05fcGFyc2VfbG9uZygmc2Vzc2lvbiwgJnJldC0+dGltZW91dCwga1RpbWVvdXRUYWcsIDMpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9JTlZBTElEX1NTTF9TRVNTSU9OKTsKKyAgaWYgKHNlc3Npb25fdGltZSA+IExPTkdfTUFYIHx8CisgICAgICB0aW1lb3V0ID4gTE9OR19NQVgpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGQyaV9TU0xfU0VTU0lPTiwgU1NMX1JfSU5WQUxJRF9TU0xfU0VTU0lPTik7CiAgICAgZ290byBlcnI7CiAgIH0KKyAgcmV0LT50aW1lID0gc2Vzc2lvbl90aW1lOworICByZXQtPnRpbWVvdXQgPSB0aW1lb3V0OwogCi0gIENCUyBwZWVyOwotICBpbnQgaGFzX3BlZXI7Ci0gIGlmICghQ0JTX2dldF9vcHRpb25hbF9hc24xKCZzZXNzaW9uLCAmcGVlciwgJmhhc19wZWVyLCBrUGVlclRhZykpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0lOVkFMSURfU1NMX1NFU1NJT04pOwotICAgIGdvdG8gZXJyOwotICB9CiAgIFg1MDlfZnJlZShyZXQtPnBlZXIpOwogICByZXQtPnBlZXIgPSBOVUxMOwogICBpZiAoaGFzX3BlZXIpIHsKLSAgICByZXQtPnBlZXIgPSBwYXJzZV94NTA5KCZwZWVyKTsKKyAgICBjb25zdCB1aW50OF90ICpwdHI7CisgICAgcHRyID0gQ0JTX2RhdGEoJnBlZXIpOworICAgIHJldC0+cGVlciA9IGQyaV9YNTA5KE5VTEwsICZwdHIsIENCU19sZW4oJnBlZXIpKTsKICAgICBpZiAocmV0LT5wZWVyID09IE5VTEwpIHsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KLSAgICBpZiAoQ0JTX2xlbigmcGVlcikgIT0gMCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9JTlZBTElEX1NTTF9TRVNTSU9OKTsKKyAgICBpZiAocHRyICE9IENCU19kYXRhKCZwZWVyKSArIENCU19sZW4oJnBlZXIpKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIGQyaV9TU0xfU0VTU0lPTiwgU1NMX1JfSU5WQUxJRF9TU0xfU0VTU0lPTik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0KIAotICBpZiAoIVNTTF9TRVNTSU9OX3BhcnNlX2JvdW5kZWRfb2N0ZXRfc3RyaW5nKAotICAgICAgICAgICZzZXNzaW9uLCByZXQtPnNpZF9jdHgsICZyZXQtPnNpZF9jdHhfbGVuZ3RoLCBzaXplb2YocmV0LT5zaWRfY3R4KSwKLSAgICAgICAgICBrU2Vzc2lvbklEQ29udGV4dFRhZykgfHwKLSAgICAgICFTU0xfU0VTU0lPTl9wYXJzZV9sb25nKCZzZXNzaW9uLCAmcmV0LT52ZXJpZnlfcmVzdWx0LCBrVmVyaWZ5UmVzdWx0VGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9WX09LKSB8fAotICAgICAgIVNTTF9TRVNTSU9OX3BhcnNlX3N0cmluZygmc2Vzc2lvbiwgJnJldC0+dGxzZXh0X2hvc3RuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSG9zdE5hbWVUYWcpIHx8Ci0gICAgICAhU1NMX1NFU1NJT05fcGFyc2Vfc3RyaW5nKCZzZXNzaW9uLCAmcmV0LT5wc2tfaWRlbnRpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtQU0tJZGVudGl0eVRhZykgfHwKLSAgICAgICFTU0xfU0VTU0lPTl9wYXJzZV91MzIoJnNlc3Npb24sICZyZXQtPnRsc2V4dF90aWNrX2xpZmV0aW1lX2hpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUaWNrZXRMaWZldGltZUhpbnRUYWcsIDApIHx8Ci0gICAgICAhU1NMX1NFU1NJT05fcGFyc2Vfb2N0ZXRfc3RyaW5nKCZzZXNzaW9uLCAmcmV0LT50bHNleHRfdGljaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJldC0+dGxzZXh0X3RpY2tsZW4sIGtUaWNrZXRUYWcpKSB7CisgIGlmIChDQlNfbGVuKCZzaWRfY3R4KSA+IHNpemVvZihyZXQtPnNpZF9jdHgpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkMmlfU1NMX1NFU1NJT04sIFNTTF9SX0lOVkFMSURfU1NMX1NFU1NJT04pOwogICAgIGdvdG8gZXJyOwogICB9CisgIG1lbWNweShyZXQtPnNpZF9jdHgsIENCU19kYXRhKCZzaWRfY3R4KSwgQ0JTX2xlbigmc2lkX2N0eCkpOworICByZXQtPnNpZF9jdHhfbGVuZ3RoID0gQ0JTX2xlbigmc2lkX2N0eCk7CiAKLSAgaWYgKENCU19wZWVrX2FzbjFfdGFnKCZzZXNzaW9uLCBrUGVlclNIQTI1NlRhZykpIHsKLSAgICBDQlMgY2hpbGQsIHBlZXJfc2hhMjU2OwotICAgIGlmICghQ0JTX2dldF9hc24xKCZzZXNzaW9uLCAmY2hpbGQsIGtQZWVyU0hBMjU2VGFnKSB8fAotICAgICAgICAhQ0JTX2dldF9hc24xKCZjaGlsZCwgJnBlZXJfc2hhMjU2LCBDQlNfQVNOMV9PQ1RFVFNUUklORykgfHwKLSAgICAgICAgQ0JTX2xlbigmcGVlcl9zaGEyNTYpICE9IHNpemVvZihyZXQtPnBlZXJfc2hhMjU2KSB8fAotICAgICAgICBDQlNfbGVuKCZjaGlsZCkgIT0gMCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9JTlZBTElEX1NTTF9TRVNTSU9OKTsKKyAgaWYgKHZlcmlmeV9yZXN1bHQgPiBMT05HX01BWCB8fAorICAgICAgdGlja2V0X2xpZmV0aW1lX2hpbnQgPiAweGZmZmZmZmZmKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkMmlfU1NMX1NFU1NJT04sIFNTTF9SX0lOVkFMSURfU1NMX1NFU1NJT04pOworICAgIGdvdG8gZXJyOworICB9CisgIHJldC0+dmVyaWZ5X3Jlc3VsdCA9IHZlcmlmeV9yZXN1bHQ7CisgIHJldC0+dGxzZXh0X3RpY2tfbGlmZXRpbWVfaGludCA9IHRpY2tldF9saWZldGltZV9oaW50OworCisgIGlmIChoYXNfcGVlcl9zaGEyNTYpIHsKKyAgICBpZiAoQ0JTX2xlbigmcGVlcl9zaGEyNTYpICE9IHNpemVvZihyZXQtPnBlZXJfc2hhMjU2KSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBkMmlfU1NMX1NFU1NJT04sIFNTTF9SX0lOVkFMSURfU1NMX1NFU1NJT04pOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIG1lbWNweShyZXQtPnBlZXJfc2hhMjU2LCBDQlNfZGF0YSgmcGVlcl9zaGEyNTYpLCBzaXplb2YocmV0LT5wZWVyX3NoYTI1NikpOwpAQCAtNjA1LDEwOCArNTcxLDIyIEBACiAgICAgcmV0LT5wZWVyX3NoYTI1Nl92YWxpZCA9IDA7CiAgIH0KIAotICBpZiAoIVNTTF9TRVNTSU9OX3BhcnNlX2JvdW5kZWRfb2N0ZXRfc3RyaW5nKAotICAgICAgICAgICZzZXNzaW9uLCByZXQtPm9yaWdpbmFsX2hhbmRzaGFrZV9oYXNoLAotICAgICAgICAgICZyZXQtPm9yaWdpbmFsX2hhbmRzaGFrZV9oYXNoX2xlbiwKLSAgICAgICAgICBzaXplb2YocmV0LT5vcmlnaW5hbF9oYW5kc2hha2VfaGFzaCksIGtPcmlnaW5hbEhhbmRzaGFrZUhhc2hUYWcpIHx8Ci0gICAgICAhU1NMX1NFU1NJT05fcGFyc2Vfb2N0ZXRfc3RyaW5nKAotICAgICAgICAgICZzZXNzaW9uLCAmcmV0LT50bHNleHRfc2lnbmVkX2NlcnRfdGltZXN0YW1wX2xpc3QsCi0gICAgICAgICAgJnJldC0+dGxzZXh0X3NpZ25lZF9jZXJ0X3RpbWVzdGFtcF9saXN0X2xlbmd0aCwKLSAgICAgICAgICBrU2lnbmVkQ2VydFRpbWVzdGFtcExpc3RUYWcpIHx8Ci0gICAgICAhU1NMX1NFU1NJT05fcGFyc2Vfb2N0ZXRfc3RyaW5nKAotICAgICAgICAgICZzZXNzaW9uLCAmcmV0LT5vY3NwX3Jlc3BvbnNlLCAmcmV0LT5vY3NwX3Jlc3BvbnNlX2xlbmd0aCwKLSAgICAgICAgICBrT0NTUFJlc3BvbnNlVGFnKSkgeworICBpZiAoQ0JTX2xlbigmb3JpZ2luYWxfaGFuZHNoYWtlX2hhc2gpID4KKyAgICAgIHNpemVvZihyZXQtPm9yaWdpbmFsX2hhbmRzaGFrZV9oYXNoKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgZDJpX1NTTF9TRVNTSU9OLCBTU0xfUl9JTlZBTElEX1NTTF9TRVNTSU9OKTsKICAgICBnb3RvIGVycjsKICAgfQotCi0gIGludCBleHRlbmRlZF9tYXN0ZXJfc2VjcmV0OwotICBpZiAoIUNCU19nZXRfb3B0aW9uYWxfYXNuMV9ib29sKCZzZXNzaW9uLCAmZXh0ZW5kZWRfbWFzdGVyX3NlY3JldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRXh0ZW5kZWRNYXN0ZXJTZWNyZXRUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBkZWZhdWx0IHRvIGZhbHNlICovKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfSU5WQUxJRF9TU0xfU0VTU0lPTik7Ci0gICAgZ290byBlcnI7Ci0gIH0KLSAgcmV0LT5leHRlbmRlZF9tYXN0ZXJfc2VjcmV0ID0gISFleHRlbmRlZF9tYXN0ZXJfc2VjcmV0OwotCi0gIGlmICghU1NMX1NFU1NJT05fcGFyc2VfdTMyKCZzZXNzaW9uLCAmcmV0LT5rZXlfZXhjaGFuZ2VfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleUV4Y2hhbmdlSW5mb1RhZywgMCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0lOVkFMSURfU1NMX1NFU1NJT04pOwotICAgIGdvdG8gZXJyOwotICB9Ci0KLSAgQ0JTIGNlcnRfY2hhaW47Ci0gIGludCBoYXNfY2VydF9jaGFpbjsKLSAgaWYgKCFDQlNfZ2V0X29wdGlvbmFsX2FzbjEoJnNlc3Npb24sICZjZXJ0X2NoYWluLCAmaGFzX2NlcnRfY2hhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDZXJ0Q2hhaW5UYWcpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9JTlZBTElEX1NTTF9TRVNTSU9OKTsKLSAgICBnb3RvIGVycjsKLSAgfQotICBza19YNTA5X3BvcF9mcmVlKHJldC0+Y2VydF9jaGFpbiwgWDUwOV9mcmVlKTsKLSAgcmV0LT5jZXJ0X2NoYWluID0gTlVMTDsKLSAgaWYgKGhhc19jZXJ0X2NoYWluKSB7Ci0gICAgcmV0LT5jZXJ0X2NoYWluID0gc2tfWDUwOV9uZXdfbnVsbCgpOwotICAgIGlmIChyZXQtPmNlcnRfY2hhaW4gPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7Ci0gICAgICBnb3RvIGVycjsKLSAgICB9Ci0gICAgd2hpbGUgKENCU19sZW4oJmNlcnRfY2hhaW4pID4gMCkgewotICAgICAgWDUwOSAqeDUwOSA9IHBhcnNlX3g1MDkoJmNlcnRfY2hhaW4pOwotICAgICAgaWYgKHg1MDkgPT0gTlVMTCkgewotICAgICAgICBnb3RvIGVycjsKLSAgICAgIH0KLSAgICAgIGlmICghc2tfWDUwOV9wdXNoKHJldC0+Y2VydF9jaGFpbiwgeDUwOSkpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7Ci0gICAgICAgIFg1MDlfZnJlZSh4NTA5KTsKLSAgICAgICAgZ290byBlcnI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKENCU19sZW4oJnNlc3Npb24pICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0lOVkFMSURfU1NMX1NFU1NJT04pOwotICAgIGdvdG8gZXJyOwotICB9Ci0KLSAgcmV0dXJuIHJldDsKLQotZXJyOgotICBTU0xfU0VTU0lPTl9mcmVlKHJldCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1TU0xfU0VTU0lPTiAqU1NMX1NFU1NJT05fZnJvbV9ieXRlcyhjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluX2xlbikgewotICBDQlMgY2JzOwotICBDQlNfaW5pdCgmY2JzLCBpbiwgaW5fbGVuKTsKLSAgU1NMX1NFU1NJT04gKnJldCA9IFNTTF9TRVNTSU9OX3BhcnNlKCZjYnMpOwotICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBpZiAoQ0JTX2xlbigmY2JzKSAhPSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9JTlZBTElEX1NTTF9TRVNTSU9OKTsKLSAgICBTU0xfU0VTU0lPTl9mcmVlKHJldCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotU1NMX1NFU1NJT04gKmQyaV9TU0xfU0VTU0lPTihTU0xfU0VTU0lPTiAqKmEsIGNvbnN0IHVpbnQ4X3QgKipwcCwgbG9uZyBsZW5ndGgpIHsKLSAgaWYgKGxlbmd0aCA8IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIENCUyBjYnM7Ci0gIENCU19pbml0KCZjYnMsICpwcCwgbGVuZ3RoKTsKLQotICBTU0xfU0VTU0lPTiAqcmV0ID0gU1NMX1NFU1NJT05fcGFyc2UoJmNicyk7Ci0gIGlmIChyZXQgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9CisgIG1lbWNweShyZXQtPm9yaWdpbmFsX2hhbmRzaGFrZV9oYXNoLCBDQlNfZGF0YSgmb3JpZ2luYWxfaGFuZHNoYWtlX2hhc2gpLAorICAgICAgICAgQ0JTX2xlbigmb3JpZ2luYWxfaGFuZHNoYWtlX2hhc2gpKTsKKyAgcmV0LT5vcmlnaW5hbF9oYW5kc2hha2VfaGFzaF9sZW4gPSBDQlNfbGVuKCZvcmlnaW5hbF9oYW5kc2hha2VfaGFzaCk7CiAKICAgaWYgKGEpIHsKLSAgICBTU0xfU0VTU0lPTl9mcmVlKCphKTsKICAgICAqYSA9IHJldDsKICAgfQogICAqcHAgPSBDQlNfZGF0YSgmY2JzKTsKICAgcmV0dXJuIHJldDsKKworZXJyOgorICBTU0xfU0VTU0lPTl9mcmVlKGFsbG9jYXRlZCk7CisgIHJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3NzbC9zc2xfYnVmZmVyLmMgYi9zcmMvc3NsL3NzbF9idWZmZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNkY2Q4MC4uMDAwMDAwMAotLS0gYS9zcmMvc3NsL3NzbF9idWZmZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEdvb2dsZSBJbmMuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCi0KLSNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgotI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3R5cGVfY2hlY2suaD4KLQotI2luY2x1ZGUgImludGVybmFsLmgiCi0KLQotT1BFTlNTTF9DT01QSUxFX0FTU0VSVCgweGZmZmYgPD0gSU5UX01BWCwgdWludDE2X2ZpdHNfaW5faW50KTsKLQotT1BFTlNTTF9DT01QSUxFX0FTU0VSVCgoU1NMM19BTElHTl9QQVlMT0FEICYgKFNTTDNfQUxJR05fUEFZTE9BRCAtIDEpKSA9PSAwLAotICAgICAgICAgICAgICAgICAgICAgICBhbGlnbl90b19hX3Bvd2VyX29mX3R3byk7Ci0KLS8qIHNldHVwX2J1ZmZlciBpbml0aWFsaXplcyB8YnVmfCB3aXRoIGNhcGFjaXR5IHxjYXB8LCBhbGlnbmVkIHN1Y2ggdGhhdCBkYXRhCi0gKiB3cml0dGVuIGFmdGVyIHxoZWFkZXJfbGVufCBpcyBhbGlnbmVkIHRvIGEgfFNTTDNfQUxJR05fUEFZTE9BRHwtYnl0ZQotICogYm91bmRhcnkuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZXJyb3IuICovCi1zdGF0aWMgaW50IHNldHVwX2J1ZmZlcihTU0wzX0JVRkZFUiAqYnVmLCBzaXplX3QgaGVhZGVyX2xlbiwgc2l6ZV90IGNhcCkgewotICBpZiAoYnVmLT5idWYgIT0gTlVMTCB8fCBjYXAgPiAweGZmZmYpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIEFkZCB1cCB0byB8U1NMM19BTElHTl9QQVlMT0FEfCAtIDEgYnl0ZXMgb2Ygc2xhY2sgZm9yIGFsaWdubWVudC4gKi8KLSAgYnVmLT5idWYgPSBPUEVOU1NMX21hbGxvYyhjYXAgKyBTU0wzX0FMSUdOX1BBWUxPQUQgLSAxKTsKLSAgaWYgKGJ1Zi0+YnVmID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIEFycmFuZ2UgdGhlIGJ1ZmZlciBzdWNoIHRoYXQgdGhlIHJlY29yZCBib2R5IGlzIGFsaWduZWQuICovCi0gIGJ1Zi0+b2Zmc2V0ID0gKDAgLSBoZWFkZXJfbGVuIC0gKHVpbnRwdHJfdClidWYtPmJ1ZikgJgotICAgICAgICAgICAgICAgIChTU0wzX0FMSUdOX1BBWUxPQUQgLSAxKTsKLSAgYnVmLT5sZW4gPSAwOwotICBidWYtPmNhcCA9IGNhcDsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbnN1bWVfYnVmZmVyKFNTTDNfQlVGRkVSICpidWYsIHNpemVfdCBsZW4pIHsKLSAgaWYgKGxlbiA+IGJ1Zi0+bGVuKSB7Ci0gICAgYWJvcnQoKTsKLSAgfQotICBidWYtPm9mZnNldCArPSAodWludDE2X3QpbGVuOwotICBidWYtPmxlbiAtPSAodWludDE2X3QpbGVuOwotICBidWYtPmNhcCAtPSAodWludDE2X3QpbGVuOwotfQotCi1zdGF0aWMgdm9pZCBjbGVhcl9idWZmZXIoU1NMM19CVUZGRVIgKmJ1ZikgewotICBPUEVOU1NMX2ZyZWUoYnVmLT5idWYpOwotICBtZW1zZXQoYnVmLCAwLCBzaXplb2YoU1NMM19CVUZGRVIpKTsKLX0KLQotT1BFTlNTTF9DT01QSUxFX0FTU0VSVChEVExTMV9SVF9IRUFERVJfTEVOR1RIICsgU1NMM19SVF9NQVhfRU5DUllQVEVEX0xFTkdUSCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTU0wzX1JUX01BWF9FWFRSQSA8PSAweGZmZmYsCi0gICAgICAgICAgICAgICAgICAgICAgIG1heGltdW1fcmVhZF9idWZmZXJfdG9vX2xhcmdlKTsKLQotLyogc2V0dXBfcmVhZF9idWZmZXIgaW5pdGlhbGl6ZXMgdGhlIHJlYWQgYnVmZmVyIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkLiBJdAotICogcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBmYWlsdXJlLiAqLwotc3RhdGljIGludCBzZXR1cF9yZWFkX2J1ZmZlcihTU0wgKnNzbCkgewotICBTU0wzX0JVRkZFUiAqYnVmID0gJnNzbC0+czMtPnJlYWRfYnVmZmVyOwotCi0gIGlmIChidWYtPmJ1ZiAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBzaXplX3QgaGVhZGVyX2xlbiA9IHNzbF9yZWNvcmRfcHJlZml4X2xlbihzc2wpOwotICBzaXplX3QgY2FwID0gU1NMM19SVF9NQVhfRU5DUllQVEVEX0xFTkdUSDsKLSAgaWYgKFNTTF9JU19EVExTKHNzbCkpIHsKLSAgICBjYXAgKz0gRFRMUzFfUlRfSEVBREVSX0xFTkdUSDsKLSAgfSBlbHNlIHsKLSAgICBjYXAgKz0gU1NMM19SVF9IRUFERVJfTEVOR1RIOwotICB9Ci0gIGlmIChzc2wtPm9wdGlvbnMgJiBTU0xfT1BfTUlDUk9TT0ZUX0JJR19TU0xWM19CVUZGRVIpIHsKLSAgICBjYXAgKz0gU1NMM19SVF9NQVhfRVhUUkE7Ci0gIH0KLQotICByZXR1cm4gc2V0dXBfYnVmZmVyKGJ1ZiwgaGVhZGVyX2xlbiwgY2FwKTsKLX0KLQotdWludDhfdCAqc3NsX3JlYWRfYnVmZmVyKFNTTCAqc3NsKSB7Ci0gIHJldHVybiBzc2wtPnMzLT5yZWFkX2J1ZmZlci5idWYgKyBzc2wtPnMzLT5yZWFkX2J1ZmZlci5vZmZzZXQ7Ci19Ci0KLXNpemVfdCBzc2xfcmVhZF9idWZmZXJfbGVuKGNvbnN0IFNTTCAqc3NsKSB7Ci0gIHJldHVybiBzc2wtPnMzLT5yZWFkX2J1ZmZlci5sZW47Ci19Ci0KLXN0YXRpYyBpbnQgZHRsc19yZWFkX2J1ZmZlcl9uZXh0X3BhY2tldChTU0wgKnNzbCkgewotICBTU0wzX0JVRkZFUiAqYnVmID0gJnNzbC0+czMtPnJlYWRfYnVmZmVyOwotCi0gIGlmIChidWYtPmxlbiA+IDApIHsKLSAgICAvKiBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHxkdGxzX3JlYWRfYnVmZmVyX2V4dGVuZHwgd2hlbiB0aGUgcmVhZCBidWZmZXIgaXMKLSAgICAgKiBub3QgZW1wdHkuICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLyogUmVhZCBhIHNpbmdsZSBwYWNrZXQgZnJvbSB8c3NsLT5yYmlvfC4gfGJ1Zi0+Y2FwfCBtdXN0IGZpdCBpbiBhbiBpbnQuICovCi0gIHNzbC0+cndzdGF0ZSA9IFNTTF9SRUFESU5HOwotICBpbnQgcmV0ID0gQklPX3JlYWQoc3NsLT5yYmlvLCBidWYtPmJ1ZiArIGJ1Zi0+b2Zmc2V0LCAoaW50KWJ1Zi0+Y2FwKTsKLSAgaWYgKHJldCA8PSAwKSB7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotICBzc2wtPnJ3c3RhdGUgPSBTU0xfTk9USElORzsKLSAgLyogfEJJT19yZWFkfCB3YXMgYm91bmQgYnkgfGJ1Zi0+Y2FwfCwgc28gdGhpcyBjYW5ub3Qgb3ZlcmZsb3cuICovCi0gIGJ1Zi0+bGVuID0gKHVpbnQxNl90KXJldDsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgdGxzX3JlYWRfYnVmZmVyX2V4dGVuZF90byhTU0wgKnNzbCwgc2l6ZV90IGxlbikgewotICBTU0wzX0JVRkZFUiAqYnVmID0gJnNzbC0+czMtPnJlYWRfYnVmZmVyOwotCi0gIGlmIChsZW4gPiBidWYtPmNhcCkgewotICAgIC8qIFRoaXMgbWF5IG9jY3VyIGlmIHxTU0xfT1BfTUlDUk9TT0ZUX0JJR19TU0xWM19CVUZGRVJ8IHdhcyB0b2dnbGVkIGFmdGVyCi0gICAgICogfHNldHVwX3JlYWRfYnVmZmVyfCB3YXMgY2FsbGVkLiBTdGF5IHdpdGhpbiBib3VuZHMsIGJ1dCBkbyBub3QgYXR0ZW1wdCB0bwotICAgICAqIHJlY292ZXIuICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CVUZGRVJfVE9PX1NNQUxMKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvKiBSZWFkIHVudGlsIHRoZSB0YXJnZXQgbGVuZ3RoIGlzIHJlYWNoZWQuICovCi0gIHdoaWxlIChidWYtPmxlbiA8IGxlbikgewotICAgIC8qIFRoZSBhbW91bnQgb2YgZGF0YSB0byByZWFkIGlzIGJvdW5kZWQgYnkgfGJ1Zi0+Y2FwfCwgd2hpY2ggbXVzdCBmaXQgaW4gYW4KLSAgICAgKiBpbnQuICovCi0gICAgc3NsLT5yd3N0YXRlID0gU1NMX1JFQURJTkc7Ci0gICAgaW50IHJldCA9IEJJT19yZWFkKHNzbC0+cmJpbywgYnVmLT5idWYgKyBidWYtPm9mZnNldCArIGJ1Zi0+bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAoaW50KShsZW4gLSBidWYtPmxlbikpOwotICAgIGlmIChyZXQgPD0gMCkgewotICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgc3NsLT5yd3N0YXRlID0gU1NMX05PVEhJTkc7Ci0gICAgLyogfEJJT19yZWFkfCB3YXMgYm91bmQgYnkgfGJ1Zi0+Y2FwIC0gYnVmLT5sZW58LCBzbyB0aGlzIGNhbm5vdAotICAgICAqIG92ZXJmbG93LiAqLwotICAgIGJ1Zi0+bGVuICs9ICh1aW50MTZfdClyZXQ7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotaW50IHNzbF9yZWFkX2J1ZmZlcl9leHRlbmRfdG8oU1NMICpzc2wsIHNpemVfdCBsZW4pIHsKLSAgLyogfHNzbF9yZWFkX2J1ZmZlcl9leHRlbmRfdG98IGltcGxpY2l0bHkgZGlzY2FyZHMgYW55IGNvbnN1bWVkIGRhdGEuICovCi0gIHNzbF9yZWFkX2J1ZmZlcl9kaXNjYXJkKHNzbCk7Ci0KLSAgaWYgKCFzZXR1cF9yZWFkX2J1ZmZlcihzc2wpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgaWYgKHNzbC0+cmJpbyA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CSU9fTk9UX1NFVCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgRVJSX2NsZWFyX3N5c3RlbV9lcnJvcigpOwotCi0gIGludCByZXQ7Ci0gIGlmIChTU0xfSVNfRFRMUyhzc2wpKSB7Ci0gICAgLyogfGxlbnwgaXMgaWdub3JlZCBmb3IgYSBkYXRhZ3JhbSB0cmFuc3BvcnQuICovCi0gICAgcmV0ID0gZHRsc19yZWFkX2J1ZmZlcl9uZXh0X3BhY2tldChzc2wpOwotICB9IGVsc2UgewotICAgIHJldCA9IHRsc19yZWFkX2J1ZmZlcl9leHRlbmRfdG8oc3NsLCBsZW4pOwotICB9Ci0KLSAgaWYgKHJldCA8PSAwKSB7Ci0gICAgLyogSWYgdGhlIGJ1ZmZlciB3YXMgZW1wdHkgb3JpZ2luYWxseSBhbmQgcmVtYWluZWQgZW1wdHkgYWZ0ZXIgYXR0ZW1wdGluZyB0bwotICAgICAqIGV4dGVuZCBpdCwgcmVsZWFzZSB0aGUgYnVmZmVyIHVudGlsIHRoZSBuZXh0IGF0dGVtcHQuICovCi0gICAgc3NsX3JlYWRfYnVmZmVyX2Rpc2NhcmQoc3NsKTsKLSAgfQotICByZXR1cm4gcmV0OwotfQotCi12b2lkIHNzbF9yZWFkX2J1ZmZlcl9jb25zdW1lKFNTTCAqc3NsLCBzaXplX3QgbGVuKSB7Ci0gIFNTTDNfQlVGRkVSICpidWYgPSAmc3NsLT5zMy0+cmVhZF9idWZmZXI7Ci0KLSAgY29uc3VtZV9idWZmZXIoYnVmLCBsZW4pOwotICBpZiAoIVNTTF9JU19EVExTKHNzbCkpIHsKLSAgICAvKiBUaGUgVExTIHN0YWNrIG5ldmVyIHJlYWRzIGJleW9uZCB0aGUgY3VycmVudCByZWNvcmQsIHNvIHRoZXJlIHdpbGwgbmV2ZXIKLSAgICAgKiBiZSB1bmNvbnN1bWVkIGRhdGEuIElmIHJlYWQtYWhlYWQgaXMgZXZlciByZWltcGxlbWVudGVkLAotICAgICAqIHxzc2xfcmVhZF9idWZmZXJfZGlzY2FyZHwgd2lsbCByZXF1aXJlIGEgfG1lbWNweXwgdG8gc2hpZnQgdGhlIGV4Y2VzcwotICAgICAqIGJhY2sgdG8gdGhlIGZyb250IG9mIHRoZSBidWZmZXIsIHRvIGVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgZm9yIHRoZQotICAgICAqIG5leHQgcmVjb3JkLiAqLwotICAgICBhc3NlcnQoYnVmLT5sZW4gPT0gMCk7Ci0gIH0KLX0KLQotdm9pZCBzc2xfcmVhZF9idWZmZXJfZGlzY2FyZChTU0wgKnNzbCkgewotICBpZiAoc3NsLT5zMy0+cmVhZF9idWZmZXIubGVuID09IDApIHsKLSAgICBzc2xfcmVhZF9idWZmZXJfY2xlYXIoc3NsKTsKLSAgfQotfQotCi12b2lkIHNzbF9yZWFkX2J1ZmZlcl9jbGVhcihTU0wgKnNzbCkgewotICBjbGVhcl9idWZmZXIoJnNzbC0+czMtPnJlYWRfYnVmZmVyKTsKLX0KLQotCi1pbnQgc3NsX3dyaXRlX2J1ZmZlcl9pc19wZW5kaW5nKGNvbnN0IFNTTCAqc3NsKSB7Ci0gIHJldHVybiBzc2wtPnMzLT53cml0ZV9idWZmZXIubGVuID4gMDsKLX0KLQotT1BFTlNTTF9DT01QSUxFX0FTU0VSVChTU0wzX1JUX0hFQURFUl9MRU5HVEggKiAyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTDNfUlRfU0VORF9NQVhfRU5DUllQVEVEX09WRVJIRUFEICogMiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTU0wzX1JUX01BWF9QTEFJTl9MRU5HVEggPD0gMHhmZmZmLAotICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtX3Rsc193cml0ZV9idWZmZXJfdG9vX2xhcmdlKTsKLQotT1BFTlNTTF9DT01QSUxFX0FTU0VSVChEVExTMV9SVF9IRUFERVJfTEVOR1RIICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTDNfUlRfU0VORF9NQVhfRU5DUllQVEVEX09WRVJIRUFEICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTDNfUlRfTUFYX1BMQUlOX0xFTkdUSCA8PSAweGZmZmYsCi0gICAgICAgICAgICAgICAgICAgICAgIG1heGltdW1fZHRsc193cml0ZV9idWZmZXJfdG9vX2xhcmdlKTsKLQotaW50IHNzbF93cml0ZV9idWZmZXJfaW5pdChTU0wgKnNzbCwgdWludDhfdCAqKm91dF9wdHIsIHNpemVfdCBtYXhfbGVuKSB7Ci0gIFNTTDNfQlVGRkVSICpidWYgPSAmc3NsLT5zMy0+d3JpdGVfYnVmZmVyOwotCi0gIGlmIChidWYtPmJ1ZiAhPSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBzaXplX3QgaGVhZGVyX2xlbiA9IHNzbF9zZWFsX3ByZWZpeF9sZW4oc3NsKTsKLQotICAvKiBUT0RPKGRhdmlkYmVuKTogVGhpcyBtYXRjaGVzIHRoZSBvcmlnaW5hbCBiZWhhdmlvciBpbiBrZWVwaW5nIHRoZSBtYWxsb2MKLSAgICogc2l6ZSBjb25zaXN0ZW50LiBEb2VzIHRoaXMgbWF0dGVyPyB8Y2FwfCBjb3VsZCBqdXN0IGJlIHxtYXhfbGVufC4gKi8KLSAgc2l6ZV90IGNhcCA9IFNTTDNfUlRfTUFYX1BMQUlOX0xFTkdUSCArIFNTTDNfUlRfU0VORF9NQVhfRU5DUllQVEVEX09WRVJIRUFEOwotICBpZiAoU1NMX0lTX0RUTFMoc3NsKSkgewotICAgIGNhcCArPSBEVExTMV9SVF9IRUFERVJfTEVOR1RIOwotICB9IGVsc2UgewotICAgIGNhcCArPSBTU0wzX1JUX0hFQURFUl9MRU5HVEg7Ci0gICAgaWYgKHNzbC0+bW9kZSAmIFNTTF9NT0RFX0NCQ19SRUNPUkRfU1BMSVRUSU5HKSB7Ci0gICAgICBjYXAgKz0gU1NMM19SVF9IRUFERVJfTEVOR1RIICsgU1NMM19SVF9TRU5EX01BWF9FTkNSWVBURURfT1ZFUkhFQUQ7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG1heF9sZW4gPiBjYXApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0JVRkZFUl9UT09fU01BTEwpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaWYgKCFzZXR1cF9idWZmZXIoYnVmLCBoZWFkZXJfbGVuLCBjYXApKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgKm91dF9wdHIgPSBidWYtPmJ1ZiArIGJ1Zi0+b2Zmc2V0OwotICByZXR1cm4gMTsKLX0KLQotdm9pZCBzc2xfd3JpdGVfYnVmZmVyX3NldF9sZW4oU1NMICpzc2wsIHNpemVfdCBsZW4pIHsKLSAgU1NMM19CVUZGRVIgKmJ1ZiA9ICZzc2wtPnMzLT53cml0ZV9idWZmZXI7Ci0KLSAgaWYgKGxlbiA+IGJ1Zi0+Y2FwKSB7Ci0gICAgYWJvcnQoKTsKLSAgfQotICBidWYtPmxlbiA9IGxlbjsKLX0KLQotc3RhdGljIGludCB0bHNfd3JpdGVfYnVmZmVyX2ZsdXNoKFNTTCAqc3NsKSB7Ci0gIFNTTDNfQlVGRkVSICpidWYgPSAmc3NsLT5zMy0+d3JpdGVfYnVmZmVyOwotCi0gIHdoaWxlIChidWYtPmxlbiA+IDApIHsKLSAgICBzc2wtPnJ3c3RhdGUgPSBTU0xfV1JJVElORzsKLSAgICBpbnQgcmV0ID0gQklPX3dyaXRlKHNzbC0+d2JpbywgYnVmLT5idWYgKyBidWYtPm9mZnNldCwgYnVmLT5sZW4pOwotICAgIGlmIChyZXQgPD0gMCkgewotICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgc3NsLT5yd3N0YXRlID0gU1NMX05PVEhJTkc7Ci0gICAgY29uc3VtZV9idWZmZXIoYnVmLCAoc2l6ZV90KXJldCk7Ci0gIH0KLSAgc3NsX3dyaXRlX2J1ZmZlcl9jbGVhcihzc2wpOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBkdGxzX3dyaXRlX2J1ZmZlcl9mbHVzaChTU0wgKnNzbCkgewotICBTU0wzX0JVRkZFUiAqYnVmID0gJnNzbC0+czMtPndyaXRlX2J1ZmZlcjsKLSAgaWYgKGJ1Zi0+bGVuID09IDApIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIGludCByZXQgPSBCSU9fd3JpdGUoc3NsLT53YmlvLCBidWYtPmJ1ZiArIGJ1Zi0+b2Zmc2V0LCBidWYtPmxlbik7Ci0gIC8qIERyb3AgdGhlIHdyaXRlIGJ1ZmZlciB3aGV0aGVyIG9yIG5vdCB0aGUgd3JpdGUgc3VjY2VlZGVkIHN5bmNocm9ub3VzbHkuCi0gICAqIFRPRE8oZGF2aWRiZW4pOiBIb3cgZG9lcyB0aGlzIGludGVyYWN0IHdpdGggdGhlIHJldHJ5IGZsYWc/ICovCi0gIHNzbF93cml0ZV9idWZmZXJfY2xlYXIoc3NsKTsKLSAgcmV0dXJuIChyZXQgPD0gMCkgPyByZXQgOiAxOwotfQotCi1pbnQgc3NsX3dyaXRlX2J1ZmZlcl9mbHVzaChTU0wgKnNzbCkgewotICBpZiAoc3NsLT53YmlvID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0JJT19OT1RfU0VUKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgRVJSX2NsZWFyX3N5c3RlbV9lcnJvcigpOwotCi0gIGlmIChTU0xfSVNfRFRMUyhzc2wpKSB7Ci0gICAgcmV0dXJuIGR0bHNfd3JpdGVfYnVmZmVyX2ZsdXNoKHNzbCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHRsc193cml0ZV9idWZmZXJfZmx1c2goc3NsKTsKLSAgfQotfQotCi12b2lkIHNzbF93cml0ZV9idWZmZXJfY2xlYXIoU1NMICpzc2wpIHsKLSAgY2xlYXJfYnVmZmVyKCZzc2wtPnMzLT53cml0ZV9idWZmZXIpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3NzbC9zc2xfY2VydC5jIGIvc3JjL3NzbC9zc2xfY2VydC5jCmluZGV4IDQwOTRiMjcuLmYxZmQ2NzUgMTAwNjQ0Ci0tLSBhL3NyYy9zc2wvc3NsX2NlcnQuYworKysgYi9zcmMvc3NsL3NzbF9jZXJ0LmMKQEAgLTExMiw2NCArMTEyLDgyIEBACiAgKiBFQ0MgY2lwaGVyIHN1aXRlIHN1cHBvcnQgaW4gT3BlblNTTCBvcmlnaW5hbGx5IGRldmVsb3BlZCBieQogICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuICovCiAKLSNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgotCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KICNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9idWYuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2VjX2tleS5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgogI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgogI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CiAKICNpbmNsdWRlICIuLi9jcnlwdG8vZGgvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICIuLi9jcnlwdG8vZGlyZWN0b3J5LmgiCiAjaW5jbHVkZSAiLi4vY3J5cHRvL2ludGVybmFsLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogCitzdGF0aWMgQ1JZUFRPX29uY2VfdCBnX3g1MDlfc3RvcmVfZXhfZGF0YV9pbmRleF9vbmNlOworc3RhdGljIGludCBnX3g1MDlfc3RvcmVfZXhfZGF0YV9pbmRleDsKKworc3RhdGljIHZvaWQgc3NsX3g1MDlfc3RvcmVfZXhfZGF0YV9pbmRleF9pbml0KHZvaWQpIHsKKyAgZ194NTA5X3N0b3JlX2V4X2RhdGFfaW5kZXggPSBYNTA5X1NUT1JFX0NUWF9nZXRfZXhfbmV3X2luZGV4KAorICAgICAgMCwgIlNTTCBmb3IgdmVyaWZ5IGNhbGxiYWNrIiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKIGludCBTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9DVFhfaWR4KHZvaWQpIHsKLSAgLyogVGhlIGV4X2RhdGEgaW5kZXggdG8gZ28gZnJvbSB8WDUwOV9TVE9SRV9DVFh8IHRvIHxTU0x8IGFsd2F5cyB1c2VzIHRoZQotICAgKiByZXNlcnZlZCBhcHBfZGF0YSBzbG90LiBCZWZvcmUgZXhfZGF0YSB3YXMgaW50cm9kdWNlZCwgYXBwX2RhdGEgd2FzIHVzZWQuCi0gICAqIEF2b2lkIGJyZWFraW5nIGFueSBzb2Z0d2FyZSB3aGljaCBhc3N1bWVzIHxYNTA5X1NUT1JFX0NUWF9nZXRfYXBwX2RhdGF8Ci0gICAqIHdvcmtzLiAqLwotICByZXR1cm4gMDsKKyAgQ1JZUFRPX29uY2UoJmdfeDUwOV9zdG9yZV9leF9kYXRhX2luZGV4X29uY2UsCisgICAgICAgICAgICAgIHNzbF94NTA5X3N0b3JlX2V4X2RhdGFfaW5kZXhfaW5pdCk7CisgIHJldHVybiBnX3g1MDlfc3RvcmVfZXhfZGF0YV9pbmRleDsKIH0KIAogQ0VSVCAqc3NsX2NlcnRfbmV3KHZvaWQpIHsKLSAgQ0VSVCAqcmV0ID0gKENFUlQgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoQ0VSVCkpOworICBDRVJUICpyZXQ7CisKKyAgcmV0ID0gKENFUlQgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoQ0VSVCkpOwogICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9jZXJ0X25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIG1lbXNldChyZXQsIDAsIHNpemVvZihDRVJUKSk7CiAKKyAgcmV0LT5rZXkgPSAmcmV0LT5wa2V5c1tTU0xfUEtFWV9SU0FfRU5DXTsKICAgcmV0dXJuIHJldDsKIH0KIAogQ0VSVCAqc3NsX2NlcnRfZHVwKENFUlQgKmNlcnQpIHsKLSAgQ0VSVCAqcmV0ID0gKENFUlQgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoQ0VSVCkpOworICBDRVJUICpyZXQ7CisgIGludCBpOworCisgIHJldCA9IChDRVJUICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKENFUlQpKTsKICAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfY2VydF9kdXAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogICBtZW1zZXQocmV0LCAwLCBzaXplb2YoQ0VSVCkpOwogCisgIHJldC0+a2V5ID0gJnJldC0+cGtleXNbY2VydC0+a2V5IC0gJmNlcnQtPnBrZXlzWzBdXTsKKyAgLyogb3IgcmV0LT5rZXkgPSByZXQtPnBrZXlzICsgKGNlcnQtPmtleSAtIGNlcnQtPnBrZXlzKSwgaWYgeW91IGZpbmQgdGhhdAorICAgKiBtb3JlIHJlYWRhYmxlICovCisKICAgcmV0LT5tYXNrX2sgPSBjZXJ0LT5tYXNrX2s7CiAgIHJldC0+bWFza19hID0gY2VydC0+bWFza19hOwogCiAgIGlmIChjZXJ0LT5kaF90bXAgIT0gTlVMTCkgewogICAgIHJldC0+ZGhfdG1wID0gREhwYXJhbXNfZHVwKGNlcnQtPmRoX3RtcCk7CiAgICAgaWYgKHJldC0+ZGhfdG1wID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfREhfTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX2NlcnRfZHVwLCBFUlJfUl9ESF9MSUIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIGlmIChjZXJ0LT5kaF90bXAtPnByaXZfa2V5KSB7CiAgICAgICBCSUdOVU0gKmIgPSBCTl9kdXAoY2VydC0+ZGhfdG1wLT5wcml2X2tleSk7CiAgICAgICBpZiAoIWIpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9CTl9MSUIpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9jZXJ0X2R1cCwgRVJSX1JfQk5fTElCKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAgICAgICByZXQtPmRoX3RtcC0+cHJpdl9rZXkgPSBiOwpAQCAtMTc3LDcgKzE5NSw3IEBACiAgICAgaWYgKGNlcnQtPmRoX3RtcC0+cHViX2tleSkgewogICAgICAgQklHTlVNICpiID0gQk5fZHVwKGNlcnQtPmRoX3RtcC0+cHViX2tleSk7CiAgICAgICBpZiAoIWIpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9CTl9MSUIpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9jZXJ0X2R1cCwgRVJSX1JfQk5fTElCKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAgICAgICByZXQtPmRoX3RtcC0+cHViX2tleSA9IGI7CkBAIC0xODgsMjUgKzIwNiw2NyBAQAogICByZXQtPmVjZGhfbmlkID0gY2VydC0+ZWNkaF9uaWQ7CiAgIHJldC0+ZWNkaF90bXBfY2IgPSBjZXJ0LT5lY2RoX3RtcF9jYjsKIAotICBpZiAoY2VydC0+eDUwOSAhPSBOVUxMKSB7Ci0gICAgcmV0LT54NTA5ID0gWDUwOV91cF9yZWYoY2VydC0+eDUwOSk7CisgIGZvciAoaSA9IDA7IGkgPCBTU0xfUEtFWV9OVU07IGkrKykgeworICAgIENFUlRfUEtFWSAqY3BrID0gY2VydC0+cGtleXMgKyBpOworICAgIENFUlRfUEtFWSAqcnBrID0gcmV0LT5wa2V5cyArIGk7CisgICAgaWYgKGNway0+eDUwOSAhPSBOVUxMKSB7CisgICAgICBycGstPng1MDkgPSBYNTA5X3VwX3JlZihjcGstPng1MDkpOworICAgIH0KKworICAgIGlmIChjcGstPnByaXZhdGVrZXkgIT0gTlVMTCkgeworICAgICAgcnBrLT5wcml2YXRla2V5ID0gRVZQX1BLRVlfdXBfcmVmKGNway0+cHJpdmF0ZWtleSk7CisgICAgfQorCisgICAgaWYgKGNway0+Y2hhaW4pIHsKKyAgICAgIHJway0+Y2hhaW4gPSBYNTA5X2NoYWluX3VwX3JlZihjcGstPmNoYWluKTsKKyAgICAgIGlmICghcnBrLT5jaGFpbikgeworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9jZXJ0X2R1cCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9CiAgIH0KIAotICBpZiAoY2VydC0+cHJpdmF0ZWtleSAhPSBOVUxMKSB7Ci0gICAgcmV0LT5wcml2YXRla2V5ID0gRVZQX1BLRVlfdXBfcmVmKGNlcnQtPnByaXZhdGVrZXkpOwotICB9Ci0KLSAgaWYgKGNlcnQtPmNoYWluKSB7Ci0gICAgcmV0LT5jaGFpbiA9IFg1MDlfY2hhaW5fdXBfcmVmKGNlcnQtPmNoYWluKTsKLSAgICBpZiAoIXJldC0+Y2hhaW4pIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAvKiBDb3B5IG92ZXIgc2lnbmF0dXJlIGFsZ29yaXRobSBjb25maWd1cmF0aW9uLiAqLworICBpZiAoY2VydC0+Y29uZl9zaWdhbGdzKSB7CisgICAgcmV0LT5jb25mX3NpZ2FsZ3MgPSBCVUZfbWVtZHVwKGNlcnQtPmNvbmZfc2lnYWxncywgY2VydC0+Y29uZl9zaWdhbGdzbGVuKTsKKyAgICBpZiAoIXJldC0+Y29uZl9zaWdhbGdzKSB7CiAgICAgICBnb3RvIGVycjsKICAgICB9CisgICAgcmV0LT5jb25mX3NpZ2FsZ3NsZW4gPSBjZXJ0LT5jb25mX3NpZ2FsZ3NsZW47CisgIH0KKworICBpZiAoY2VydC0+Y2xpZW50X3NpZ2FsZ3MpIHsKKyAgICByZXQtPmNsaWVudF9zaWdhbGdzID0gQlVGX21lbWR1cChjZXJ0LT5jbGllbnRfc2lnYWxncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0LT5jbGllbnRfc2lnYWxnc2xlbik7CisgICAgaWYgKCFyZXQtPmNsaWVudF9zaWdhbGdzKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgcmV0LT5jbGllbnRfc2lnYWxnc2xlbiA9IGNlcnQtPmNsaWVudF9zaWdhbGdzbGVuOworICB9CisKKyAgLyogQ29weSBhbnkgY3VzdG9tIGNsaWVudCBjZXJ0aWZpY2F0ZSB0eXBlcyAqLworICBpZiAoY2VydC0+Y2xpZW50X2NlcnRpZmljYXRlX3R5cGVzKSB7CisgICAgcmV0LT5jbGllbnRfY2VydGlmaWNhdGVfdHlwZXMgPSBCVUZfbWVtZHVwKAorICAgICAgICBjZXJ0LT5jbGllbnRfY2VydGlmaWNhdGVfdHlwZXMsIGNlcnQtPm51bV9jbGllbnRfY2VydGlmaWNhdGVfdHlwZXMpOworICAgIGlmICghcmV0LT5jbGllbnRfY2VydGlmaWNhdGVfdHlwZXMpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICByZXQtPm51bV9jbGllbnRfY2VydGlmaWNhdGVfdHlwZXMgPSBjZXJ0LT5udW1fY2xpZW50X2NlcnRpZmljYXRlX3R5cGVzOwogICB9CiAKICAgcmV0LT5jZXJ0X2NiID0gY2VydC0+Y2VydF9jYjsKICAgcmV0LT5jZXJ0X2NiX2FyZyA9IGNlcnQtPmNlcnRfY2JfYXJnOwogCisgIGlmIChjZXJ0LT52ZXJpZnlfc3RvcmUpIHsKKyAgICBDUllQVE9fcmVmY291bnRfaW5jKCZjZXJ0LT52ZXJpZnlfc3RvcmUtPnJlZmVyZW5jZXMpOworICAgIHJldC0+dmVyaWZ5X3N0b3JlID0gY2VydC0+dmVyaWZ5X3N0b3JlOworICB9CisKKyAgaWYgKGNlcnQtPmNoYWluX3N0b3JlKSB7CisgICAgQ1JZUFRPX3JlZmNvdW50X2luYygmY2VydC0+Y2hhaW5fc3RvcmUtPnJlZmVyZW5jZXMpOworICAgIHJldC0+Y2hhaW5fc3RvcmUgPSBjZXJ0LT5jaGFpbl9zdG9yZTsKKyAgfQorCiAgIHJldHVybiByZXQ7CiAKIGVycjoKQEAgLTIxNSwxOCArMjc1LDI3IEBACiB9CiAKIC8qIEZyZWUgdXAgYW5kIGNsZWFyIGFsbCBjZXJ0aWZpY2F0ZXMgYW5kIGNoYWlucyAqLwotdm9pZCBzc2xfY2VydF9jbGVhcl9jZXJ0cyhDRVJUICpjZXJ0KSB7Ci0gIGlmIChjZXJ0ID09IE5VTEwpIHsKK3ZvaWQgc3NsX2NlcnRfY2xlYXJfY2VydHMoQ0VSVCAqYykgeworICBpbnQgaTsKKyAgaWYgKGMgPT0gTlVMTCkgewogICAgIHJldHVybjsKICAgfQogCi0gIFg1MDlfZnJlZShjZXJ0LT54NTA5KTsKLSAgY2VydC0+eDUwOSA9IE5VTEw7Ci0gIEVWUF9QS0VZX2ZyZWUoY2VydC0+cHJpdmF0ZWtleSk7Ci0gIGNlcnQtPnByaXZhdGVrZXkgPSBOVUxMOwotICBza19YNTA5X3BvcF9mcmVlKGNlcnQtPmNoYWluLCBYNTA5X2ZyZWUpOwotICBjZXJ0LT5jaGFpbiA9IE5VTEw7Ci0gIGNlcnQtPmtleV9tZXRob2QgPSBOVUxMOworICBmb3IgKGkgPSAwOyBpIDwgU1NMX1BLRVlfTlVNOyBpKyspIHsKKyAgICBDRVJUX1BLRVkgKmNwayA9IGMtPnBrZXlzICsgaTsKKyAgICBpZiAoY3BrLT54NTA5KSB7CisgICAgICBYNTA5X2ZyZWUoY3BrLT54NTA5KTsKKyAgICAgIGNway0+eDUwOSA9IE5VTEw7CisgICAgfQorICAgIGlmIChjcGstPnByaXZhdGVrZXkpIHsKKyAgICAgIEVWUF9QS0VZX2ZyZWUoY3BrLT5wcml2YXRla2V5KTsKKyAgICAgIGNway0+cHJpdmF0ZWtleSA9IE5VTEw7CisgICAgfQorICAgIGlmIChjcGstPmNoYWluKSB7CisgICAgICBza19YNTA5X3BvcF9mcmVlKGNway0+Y2hhaW4sIFg1MDlfZnJlZSk7CisgICAgICBjcGstPmNoYWluID0gTlVMTDsKKyAgICB9CisgIH0KIH0KIAogdm9pZCBzc2xfY2VydF9mcmVlKENFUlQgKmMpIHsKQEAgLTIzOCwyOSArMzA3LDM4IEBACiAKICAgc3NsX2NlcnRfY2xlYXJfY2VydHMoYyk7CiAgIE9QRU5TU0xfZnJlZShjLT5wZWVyX3NpZ2FsZ3MpOwotICBPUEVOU1NMX2ZyZWUoYy0+ZGlnZXN0X25pZHMpOworICBPUEVOU1NMX2ZyZWUoYy0+Y29uZl9zaWdhbGdzKTsKKyAgT1BFTlNTTF9mcmVlKGMtPmNsaWVudF9zaWdhbGdzKTsKKyAgT1BFTlNTTF9mcmVlKGMtPnNoYXJlZF9zaWdhbGdzKTsKKyAgT1BFTlNTTF9mcmVlKGMtPmNsaWVudF9jZXJ0aWZpY2F0ZV90eXBlcyk7CisgIFg1MDlfU1RPUkVfZnJlZShjLT52ZXJpZnlfc3RvcmUpOworICBYNTA5X1NUT1JFX2ZyZWUoYy0+Y2hhaW5fc3RvcmUpOwogCiAgIE9QRU5TU0xfZnJlZShjKTsKIH0KIAotaW50IHNzbF9jZXJ0X3NldDBfY2hhaW4oQ0VSVCAqY2VydCwgU1RBQ0tfT0YoWDUwOSkgKmNoYWluKSB7Ci0gIHNrX1g1MDlfcG9wX2ZyZWUoY2VydC0+Y2hhaW4sIFg1MDlfZnJlZSk7Ci0gIGNlcnQtPmNoYWluID0gY2hhaW47CitpbnQgc3NsX2NlcnRfc2V0MF9jaGFpbihDRVJUICpjLCBTVEFDS19PRihYNTA5KSAqY2hhaW4pIHsKKyAgQ0VSVF9QS0VZICpjcGsgPSBjLT5rZXk7CisgIGlmICghY3BrKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc2tfWDUwOV9wb3BfZnJlZShjcGstPmNoYWluLCBYNTA5X2ZyZWUpOworICBjcGstPmNoYWluID0gY2hhaW47CiAgIHJldHVybiAxOwogfQogCi1pbnQgc3NsX2NlcnRfc2V0MV9jaGFpbihDRVJUICpjZXJ0LCBTVEFDS19PRihYNTA5KSAqY2hhaW4pIHsKK2ludCBzc2xfY2VydF9zZXQxX2NoYWluKENFUlQgKmMsIFNUQUNLX09GKFg1MDkpICpjaGFpbikgewogICBTVEFDS19PRihYNTA5KSAqZGNoYWluOwotICBpZiAoY2hhaW4gPT0gTlVMTCkgewotICAgIHJldHVybiBzc2xfY2VydF9zZXQwX2NoYWluKGNlcnQsIE5VTEwpOworICBpZiAoIWNoYWluKSB7CisgICAgcmV0dXJuIHNzbF9jZXJ0X3NldDBfY2hhaW4oYywgTlVMTCk7CiAgIH0KIAogICBkY2hhaW4gPSBYNTA5X2NoYWluX3VwX3JlZihjaGFpbik7Ci0gIGlmIChkY2hhaW4gPT0gTlVMTCkgeworICBpZiAoIWRjaGFpbikgewogICAgIHJldHVybiAwOwogICB9CiAKLSAgaWYgKCFzc2xfY2VydF9zZXQwX2NoYWluKGNlcnQsIGRjaGFpbikpIHsKKyAgaWYgKCFzc2xfY2VydF9zZXQwX2NoYWluKGMsIGRjaGFpbikpIHsKICAgICBza19YNTA5X3BvcF9mcmVlKGRjaGFpbiwgWDUwOV9mcmVlKTsKICAgICByZXR1cm4gMDsKICAgfQpAQCAtMjY4LDcxICszNDYsMTQzIEBACiAgIHJldHVybiAxOwogfQogCi1pbnQgc3NsX2NlcnRfYWRkMF9jaGFpbl9jZXJ0KENFUlQgKmNlcnQsIFg1MDkgKng1MDkpIHsKLSAgaWYgKGNlcnQtPmNoYWluID09IE5VTEwpIHsKLSAgICBjZXJ0LT5jaGFpbiA9IHNrX1g1MDlfbmV3X251bGwoKTsKK2ludCBzc2xfY2VydF9hZGQwX2NoYWluX2NlcnQoQ0VSVCAqYywgWDUwOSAqeCkgeworICBDRVJUX1BLRVkgKmNwayA9IGMtPmtleTsKKyAgaWYgKCFjcGspIHsKKyAgICByZXR1cm4gMDsKICAgfQotICBpZiAoY2VydC0+Y2hhaW4gPT0gTlVMTCB8fCAhc2tfWDUwOV9wdXNoKGNlcnQtPmNoYWluLCB4NTA5KSkgeworCisgIGlmICghY3BrLT5jaGFpbikgeworICAgIGNway0+Y2hhaW4gPSBza19YNTA5X25ld19udWxsKCk7CisgIH0KKyAgaWYgKCFjcGstPmNoYWluIHx8ICFza19YNTA5X3B1c2goY3BrLT5jaGFpbiwgeCkpIHsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIHJldHVybiAxOwogfQogCi1pbnQgc3NsX2NlcnRfYWRkMV9jaGFpbl9jZXJ0KENFUlQgKmNlcnQsIFg1MDkgKng1MDkpIHsKLSAgaWYgKCFzc2xfY2VydF9hZGQwX2NoYWluX2NlcnQoY2VydCwgeDUwOSkpIHsKK2ludCBzc2xfY2VydF9hZGQxX2NoYWluX2NlcnQoQ0VSVCAqYywgWDUwOSAqeCkgeworICBpZiAoIXNzbF9jZXJ0X2FkZDBfY2hhaW5fY2VydChjLCB4KSkgewogICAgIHJldHVybiAwOwogICB9CiAKLSAgWDUwOV91cF9yZWYoeDUwOSk7CisgIFg1MDlfdXBfcmVmKHgpOwogICByZXR1cm4gMTsKIH0KIAoraW50IHNzbF9jZXJ0X3NlbGVjdF9jdXJyZW50KENFUlQgKmMsIFg1MDkgKngpIHsKKyAgaW50IGk7CisgIGlmICh4ID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBTU0xfUEtFWV9OVU07IGkrKykgeworICAgIGlmIChjLT5wa2V5c1tpXS54NTA5ID09IHgpIHsKKyAgICAgIGMtPmtleSA9ICZjLT5wa2V5c1tpXTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBTU0xfUEtFWV9OVU07IGkrKykgeworICAgIGlmIChjLT5wa2V5c1tpXS54NTA5ICYmICFYNTA5X2NtcChjLT5wa2V5c1tpXS54NTA5LCB4KSkgeworICAgICAgYy0+a2V5ID0gJmMtPnBrZXlzW2ldOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKIHZvaWQgc3NsX2NlcnRfc2V0X2NlcnRfY2IoQ0VSVCAqYywgaW50ICgqY2IpKFNTTCAqc3NsLCB2b2lkICphcmcpLCB2b2lkICphcmcpIHsKICAgYy0+Y2VydF9jYiA9IGNiOwogICBjLT5jZXJ0X2NiX2FyZyA9IGFyZzsKIH0KIAotaW50IHNzbF92ZXJpZnlfY2VydF9jaGFpbihTU0wgKnNzbCwgU1RBQ0tfT0YoWDUwOSkgKmNlcnRfY2hhaW4pIHsKLSAgaWYgKGNlcnRfY2hhaW4gPT0gTlVMTCB8fCBza19YNTA5X251bShjZXJ0X2NoYWluKSA9PSAwKSB7CitTRVNTX0NFUlQgKnNzbF9zZXNzX2NlcnRfbmV3KHZvaWQpIHsKKyAgU0VTU19DRVJUICpyZXQ7CisKKyAgcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mICpyZXQpOworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9zZXNzX2NlcnRfbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBtZW1zZXQocmV0LCAwLCBzaXplb2YgKnJldCk7CisgIHJldC0+cGVlcl9rZXkgPSAmKHJldC0+cGVlcl9wa2V5c1tTU0xfUEtFWV9SU0FfRU5DXSk7CisKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZCBzc2xfc2Vzc19jZXJ0X2ZyZWUoU0VTU19DRVJUICpzYykgeworICBpbnQgaTsKKworICBpZiAoc2MgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisgIHNrX1g1MDlfcG9wX2ZyZWUoc2MtPmNlcnRfY2hhaW4sIFg1MDlfZnJlZSk7CisKKyAgZm9yIChpID0gMDsgaSA8IFNTTF9QS0VZX05VTTsgaSsrKSB7CisgICAgWDUwOV9mcmVlKHNjLT5wZWVyX3BrZXlzW2ldLng1MDkpOworICB9CisKKyAgREhfZnJlZShzYy0+cGVlcl9kaF90bXApOworICBFQ19LRVlfZnJlZShzYy0+cGVlcl9lY2RoX3RtcCk7CisKKyAgT1BFTlNTTF9mcmVlKHNjKTsKK30KKworaW50IHNzbF9zZXRfcGVlcl9jZXJ0X3R5cGUoU0VTU19DRVJUICpzYywgaW50IHR5cGUpIHsKKyAgc2MtPnBlZXJfY2VydF90eXBlID0gdHlwZTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBzc2xfdmVyaWZ5X2NlcnRfY2hhaW4oU1NMICpzLCBTVEFDS19PRihYNTA5KSAqc2spIHsKKyAgWDUwOSAqeDsKKyAgaW50IGk7CisgIFg1MDlfU1RPUkUgKnZlcmlmeV9zdG9yZTsKKyAgWDUwOV9TVE9SRV9DVFggY3R4OworCisgIGlmIChzLT5jZXJ0LT52ZXJpZnlfc3RvcmUpIHsKKyAgICB2ZXJpZnlfc3RvcmUgPSBzLT5jZXJ0LT52ZXJpZnlfc3RvcmU7CisgIH0gZWxzZSB7CisgICAgdmVyaWZ5X3N0b3JlID0gcy0+Y3R4LT5jZXJ0X3N0b3JlOworICB9CisKKyAgaWYgKHNrID09IE5VTEwgfHwgc2tfWDUwOV9udW0oc2spID09IDApIHsKICAgICByZXR1cm4gMDsKICAgfQogCi0gIFg1MDkgKmxlYWYgPSBza19YNTA5X3ZhbHVlKGNlcnRfY2hhaW4sIDApOwotICBpbnQgcmV0ID0gMDsKLSAgWDUwOV9TVE9SRV9DVFggY3R4OwotICBpZiAoIVg1MDlfU1RPUkVfQ1RYX2luaXQoJmN0eCwgc3NsLT5jdHgtPmNlcnRfc3RvcmUsIGxlYWYsIGNlcnRfY2hhaW4pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9YNTA5X0xJQik7CisgIHggPSBza19YNTA5X3ZhbHVlKHNrLCAwKTsKKyAgaWYgKCFYNTA5X1NUT1JFX0NUWF9pbml0KCZjdHgsIHZlcmlmeV9zdG9yZSwgeCwgc2spKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfdmVyaWZ5X2NlcnRfY2hhaW4sIEVSUl9SX1g1MDlfTElCKTsKICAgICByZXR1cm4gMDsKICAgfQotICBpZiAoIVg1MDlfU1RPUkVfQ1RYX3NldF9leF9kYXRhKCZjdHgsIFNTTF9nZXRfZXhfZGF0YV9YNTA5X1NUT1JFX0NUWF9pZHgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wpKSB7Ci0gICAgZ290byBlcnI7Ci0gIH0KKyAgWDUwOV9TVE9SRV9DVFhfc2V0X2V4X2RhdGEoJmN0eCwgU1NMX2dldF9leF9kYXRhX1g1MDlfU1RPUkVfQ1RYX2lkeCgpLCBzKTsKIAogICAvKiBXZSBuZWVkIHRvIGluaGVyaXQgdGhlIHZlcmlmeSBwYXJhbWV0ZXJzLiBUaGVzZSBjYW4gYmUgZGV0ZXJtaW5lZCBieSB0aGUKICAgICogY29udGV4dDogaWYgaXRzIGEgc2VydmVyIGl0IHdpbGwgdmVyaWZ5IFNTTCBjbGllbnQgY2VydGlmaWNhdGVzIG9yIHZpY2UKICAgICogdmVyc2EuICovCi0gIFg1MDlfU1RPUkVfQ1RYX3NldF9kZWZhdWx0KCZjdHgsIHNzbC0+c2VydmVyID8gInNzbF9jbGllbnQiIDogInNzbF9zZXJ2ZXIiKTsKKyAgWDUwOV9TVE9SRV9DVFhfc2V0X2RlZmF1bHQoJmN0eCwgcy0+c2VydmVyID8gInNzbF9jbGllbnQiIDogInNzbF9zZXJ2ZXIiKTsKIAogICAvKiBBbnl0aGluZyBub24tZGVmYXVsdCBpbiAicGFyYW0iIHNob3VsZCBvdmVyd3JpdGUgYW55dGhpbmcgaW4gdGhlIGN0eC4gKi8KLSAgWDUwOV9WRVJJRllfUEFSQU1fc2V0MShYNTA5X1NUT1JFX0NUWF9nZXQwX3BhcmFtKCZjdHgpLCBzc2wtPnBhcmFtKTsKKyAgWDUwOV9WRVJJRllfUEFSQU1fc2V0MShYNTA5X1NUT1JFX0NUWF9nZXQwX3BhcmFtKCZjdHgpLCBzLT5wYXJhbSk7CiAKLSAgaWYgKHNzbC0+dmVyaWZ5X2NhbGxiYWNrKSB7Ci0gICAgWDUwOV9TVE9SRV9DVFhfc2V0X3ZlcmlmeV9jYigmY3R4LCBzc2wtPnZlcmlmeV9jYWxsYmFjayk7CisgIGlmIChzLT52ZXJpZnlfY2FsbGJhY2spIHsKKyAgICBYNTA5X1NUT1JFX0NUWF9zZXRfdmVyaWZ5X2NiKCZjdHgsIHMtPnZlcmlmeV9jYWxsYmFjayk7CiAgIH0KIAotICBpZiAoc3NsLT5jdHgtPmFwcF92ZXJpZnlfY2FsbGJhY2sgIT0gTlVMTCkgewotICAgIHJldCA9IHNzbC0+Y3R4LT5hcHBfdmVyaWZ5X2NhbGxiYWNrKCZjdHgsIHNzbC0+Y3R4LT5hcHBfdmVyaWZ5X2FyZyk7CisgIGlmIChzLT5jdHgtPmFwcF92ZXJpZnlfY2FsbGJhY2sgIT0gTlVMTCkgeworICAgIGkgPSBzLT5jdHgtPmFwcF92ZXJpZnlfY2FsbGJhY2soJmN0eCwgcy0+Y3R4LT5hcHBfdmVyaWZ5X2FyZyk7CiAgIH0gZWxzZSB7Ci0gICAgcmV0ID0gWDUwOV92ZXJpZnlfY2VydCgmY3R4KTsKKyAgICBpID0gWDUwOV92ZXJpZnlfY2VydCgmY3R4KTsKICAgfQogCi0gIHNzbC0+dmVyaWZ5X3Jlc3VsdCA9IGN0eC5lcnJvcjsKLQotZXJyOgorICBzLT52ZXJpZnlfcmVzdWx0ID0gY3R4LmVycm9yOwogICBYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKCZjdHgpOwotICByZXR1cm4gcmV0OworCisgIHJldHVybiBpOwogfQogCiBzdGF0aWMgdm9pZCBzZXRfY2xpZW50X0NBX2xpc3QoU1RBQ0tfT0YoWDUwOV9OQU1FKSAqKmNhX2xpc3QsCkBAIC0zNDEsMTcgKzQ5MSwxNSBAQAogICAqY2FfbGlzdCA9IG5hbWVfbGlzdDsKIH0KIAotU1RBQ0tfT0YoWDUwOV9OQU1FKSAqU1NMX2R1cF9DQV9saXN0KFNUQUNLX09GKFg1MDlfTkFNRSkgKmxpc3QpIHsKLSAgU1RBQ0tfT0YoWDUwOV9OQU1FKSAqcmV0ID0gc2tfWDUwOV9OQU1FX25ld19udWxsKCk7Ci0gIGlmIChyZXQgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KK1NUQUNLX09GKFg1MDlfTkFNRSkgKlNTTF9kdXBfQ0FfbGlzdChTVEFDS19PRihYNTA5X05BTUUpICpzaykgewogICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfTkFNRV9udW0obGlzdCk7IGkrKykgewotICAgICAgWDUwOV9OQU1FICpuYW1lID0gWDUwOV9OQU1FX2R1cChza19YNTA5X05BTUVfdmFsdWUobGlzdCwgaSkpOworICBTVEFDS19PRihYNTA5X05BTUUpICpyZXQ7CisgIFg1MDlfTkFNRSAqbmFtZTsKKworICByZXQgPSBza19YNTA5X05BTUVfbmV3X251bGwoKTsKKyAgZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfTkFNRV9udW0oc2spOyBpKyspIHsKKyAgICBuYW1lID0gWDUwOV9OQU1FX2R1cChza19YNTA5X05BTUVfdmFsdWUoc2ssIGkpKTsKICAgICBpZiAobmFtZSA9PSBOVUxMIHx8ICFza19YNTA5X05BTUVfcHVzaChyZXQsIG5hbWUpKSB7Ci0gICAgICBYNTA5X05BTUVfZnJlZShuYW1lKTsKICAgICAgIHNrX1g1MDlfTkFNRV9wb3BfZnJlZShyZXQsIFg1MDlfTkFNRV9mcmVlKTsKICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTM2MCwzOCArNTA4LDM4IEBACiAgIHJldHVybiByZXQ7CiB9CiAKLXZvaWQgU1NMX3NldF9jbGllbnRfQ0FfbGlzdChTU0wgKnNzbCwgU1RBQ0tfT0YoWDUwOV9OQU1FKSAqbmFtZV9saXN0KSB7Ci0gIHNldF9jbGllbnRfQ0FfbGlzdCgmc3NsLT5jbGllbnRfQ0EsIG5hbWVfbGlzdCk7Cit2b2lkIFNTTF9zZXRfY2xpZW50X0NBX2xpc3QoU1NMICpzLCBTVEFDS19PRihYNTA5X05BTUUpICpuYW1lX2xpc3QpIHsKKyAgc2V0X2NsaWVudF9DQV9saXN0KCYocy0+Y2xpZW50X0NBKSwgbmFtZV9saXN0KTsKIH0KIAogdm9pZCBTU0xfQ1RYX3NldF9jbGllbnRfQ0FfbGlzdChTU0xfQ1RYICpjdHgsIFNUQUNLX09GKFg1MDlfTkFNRSkgKm5hbWVfbGlzdCkgewotICBzZXRfY2xpZW50X0NBX2xpc3QoJmN0eC0+Y2xpZW50X0NBLCBuYW1lX2xpc3QpOworICBzZXRfY2xpZW50X0NBX2xpc3QoJihjdHgtPmNsaWVudF9DQSksIG5hbWVfbGlzdCk7CiB9CiAKIFNUQUNLX09GKFg1MDlfTkFNRSkgKlNTTF9DVFhfZ2V0X2NsaWVudF9DQV9saXN0KGNvbnN0IFNTTF9DVFggKmN0eCkgewogICByZXR1cm4gY3R4LT5jbGllbnRfQ0E7CiB9CiAKLVNUQUNLX09GKFg1MDlfTkFNRSkgKlNTTF9nZXRfY2xpZW50X0NBX2xpc3QoY29uc3QgU1NMICpzc2wpIHsKLSAgLyogRm9yIGhpc3RvcmljYWwgcmVhc29ucywgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJvdGggdG8gcXVlcnkgY29uZmlndXJhdGlvbgotICAgKiBzdGF0ZSBvbiBhIHNlcnZlciBhcyB3ZWxsIGFzIGhhbmRzaGFrZSBzdGF0ZSBvbiBhIGNsaWVudC4gSG93ZXZlciwgd2hldGhlcgotICAgKiB8c3NsfCBpcyBhIGNsaWVudCBvciBzZXJ2ZXIgaXMgbm90IGtub3duIHVudGlsIGV4cGxpY2l0bHkgY29uZmlndXJlZCB3aXRoCi0gICAqIHxTU0xfc2V0X2Nvbm5lY3Rfc3RhdGV8LiBJZiB8aGFuZHNoYWtlX2Z1bmN8IGlzIE5VTEwsIHxzc2x8IGlzIGluIGFuCi0gICAqIGluZGV0ZXJtaW5hdGUgbW9kZSBhbmQgfHNzbC0+c2VydmVyfCBpcyB1bnNldC4gKi8KLSAgaWYgKHNzbC0+aGFuZHNoYWtlX2Z1bmMgIT0gTlVMTCAmJiAhc3NsLT5zZXJ2ZXIpIHsKLSAgICByZXR1cm4gc3NsLT5zMy0+dG1wLmNhX25hbWVzOworU1RBQ0tfT0YoWDUwOV9OQU1FKSAqU1NMX2dldF9jbGllbnRfQ0FfbGlzdChjb25zdCBTU0wgKnMpIHsKKyAgaWYgKHMtPnNlcnZlcikgeworICAgIGlmIChzLT5jbGllbnRfQ0EgIT0gTlVMTCkgeworICAgICAgcmV0dXJuIHMtPmNsaWVudF9DQTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHMtPmN0eC0+Y2xpZW50X0NBOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoKHMtPnZlcnNpb24gPj4gOCkgPT0gU1NMM19WRVJTSU9OX01BSk9SICYmIHMtPnMzICE9IE5VTEwpIHsKKyAgICAgIHJldHVybiBzLT5zMy0+dG1wLmNhX25hbWVzOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgIH0KLQotICBpZiAoc3NsLT5jbGllbnRfQ0EgIT0gTlVMTCkgewotICAgIHJldHVybiBzc2wtPmNsaWVudF9DQTsKLSAgfQotICByZXR1cm4gc3NsLT5jdHgtPmNsaWVudF9DQTsKIH0KIAotc3RhdGljIGludCBhZGRfY2xpZW50X0NBKFNUQUNLX09GKFg1MDlfTkFNRSkgKipzaywgWDUwOSAqeDUwOSkgeworc3RhdGljIGludCBhZGRfY2xpZW50X0NBKFNUQUNLX09GKFg1MDlfTkFNRSkgKipzaywgWDUwOSAqeCkgewogICBYNTA5X05BTUUgKm5hbWU7CiAKLSAgaWYgKHg1MDkgPT0gTlVMTCkgeworICBpZiAoeCA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKCpzayA9PSBOVUxMKSB7CkBAIC00MDEsNyArNTQ5LDcgQEAKICAgICB9CiAgIH0KIAotICBuYW1lID0gWDUwOV9OQU1FX2R1cChYNTA5X2dldF9zdWJqZWN0X25hbWUoeDUwOSkpOworICBuYW1lID0gWDUwOV9OQU1FX2R1cChYNTA5X2dldF9zdWJqZWN0X25hbWUoeCkpOwogICBpZiAobmFtZSA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KQEAgLTQxNCwxMiArNTYyLDE5NSBAQAogICByZXR1cm4gMTsKIH0KIAotaW50IFNTTF9hZGRfY2xpZW50X0NBKFNTTCAqc3NsLCBYNTA5ICp4NTA5KSB7Ci0gIHJldHVybiBhZGRfY2xpZW50X0NBKCZzc2wtPmNsaWVudF9DQSwgeDUwOSk7CitpbnQgU1NMX2FkZF9jbGllbnRfQ0EoU1NMICpzc2wsIFg1MDkgKngpIHsKKyAgcmV0dXJuIGFkZF9jbGllbnRfQ0EoJihzc2wtPmNsaWVudF9DQSksIHgpOwogfQogCi1pbnQgU1NMX0NUWF9hZGRfY2xpZW50X0NBKFNTTF9DVFggKmN0eCwgWDUwOSAqeDUwOSkgewotICByZXR1cm4gYWRkX2NsaWVudF9DQSgmY3R4LT5jbGllbnRfQ0EsIHg1MDkpOworaW50IFNTTF9DVFhfYWRkX2NsaWVudF9DQShTU0xfQ1RYICpjdHgsIFg1MDkgKngpIHsKKyAgcmV0dXJuIGFkZF9jbGllbnRfQ0EoJihjdHgtPmNsaWVudF9DQSksIHgpOworfQorCitzdGF0aWMgaW50IHhuYW1lX2NtcChjb25zdCBYNTA5X05BTUUgKiphLCBjb25zdCBYNTA5X05BTUUgKipiKSB7CisgIHJldHVybiBYNTA5X05BTUVfY21wKCphLCAqYik7Cit9CisKKy8qIExvYWQgQ0EgY2VydHMgZnJvbSBhIGZpbGUgaW50byBhIFNUQUNLLiBOb3RlIHRoYXQgaXQgaXMgc29tZXdoYXQgbWlzbmFtZWQ7CisgKiBpdCBkb2Vzbid0IHJlYWxseSBoYXZlIGFueXRoaW5nIHRvIGRvIHdpdGggY2xpZW50cyAoZXhjZXB0IHRoYXQgYSBjb21tb24gdXNlCisgKiBmb3IgYSBzdGFjayBvZiBDQXMgaXMgdG8gc2VuZCBpdCB0byB0aGUgY2xpZW50KS4gQWN0dWFsbHksIGl0IGRvZXNuJ3QgaGF2ZQorICogbXVjaCB0byBkbyB3aXRoIENBcywgZWl0aGVyLCBzaW5jZSBpdCB3aWxsIGxvYWQgYW55IG9sZCBjZXJ0LgorICoKKyAqIFxwYXJhbSBmaWxlIHRoZSBmaWxlIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgY2VydHMuCisgKiBccmV0dXJuIGEgOjpTVEFDSyBjb250YWluaW5nIHRoZSBjZXJ0cy4gKi8KK1NUQUNLX09GKFg1MDlfTkFNRSkgKlNTTF9sb2FkX2NsaWVudF9DQV9maWxlKGNvbnN0IGNoYXIgKmZpbGUpIHsKKyAgQklPICppbjsKKyAgWDUwOSAqeCA9IE5VTEw7CisgIFg1MDlfTkFNRSAqeG4gPSBOVUxMOworICBTVEFDS19PRihYNTA5X05BTUUpICpyZXQgPSBOVUxMLCAqc2s7CisKKyAgc2sgPSBza19YNTA5X05BTUVfbmV3KHhuYW1lX2NtcCk7CisgIGluID0gQklPX25ldyhCSU9fc19maWxlKCkpOworCisgIGlmIChzayA9PSBOVUxMIHx8IGluID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9sb2FkX2NsaWVudF9DQV9maWxlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoIUJJT19yZWFkX2ZpbGVuYW1lKGluLCBmaWxlKSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgZm9yICg7OykgeworICAgIGlmIChQRU1fcmVhZF9iaW9fWDUwOShpbiwgJngsIE5VTEwsIE5VTEwpID09IE5VTEwpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICAgIHJldCA9IHNrX1g1MDlfTkFNRV9uZXdfbnVsbCgpOworICAgICAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX2xvYWRfY2xpZW50X0NBX2ZpbGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfQorICAgIHhuID0gWDUwOV9nZXRfc3ViamVjdF9uYW1lKHgpOworICAgIGlmICh4biA9PSBOVUxMKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICAvKiBjaGVjayBmb3IgZHVwbGljYXRlcyAqLworICAgIHhuID0gWDUwOV9OQU1FX2R1cCh4bik7CisgICAgaWYgKHhuID09IE5VTEwpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoc2tfWDUwOV9OQU1FX2ZpbmQoc2ssIE5VTEwsIHhuKSkgeworICAgICAgWDUwOV9OQU1FX2ZyZWUoeG4pOworICAgIH0gZWxzZSB7CisgICAgICBza19YNTA5X05BTUVfcHVzaChzaywgeG4pOworICAgICAgc2tfWDUwOV9OQU1FX3B1c2gocmV0LCB4bik7CisgICAgfQorICB9CisKKyAgaWYgKDApIHsKKyAgZXJyOgorICAgIHNrX1g1MDlfTkFNRV9wb3BfZnJlZShyZXQsIFg1MDlfTkFNRV9mcmVlKTsKKyAgICByZXQgPSBOVUxMOworICB9CisKKyAgc2tfWDUwOV9OQU1FX2ZyZWUoc2spOworICBCSU9fZnJlZShpbik7CisgIFg1MDlfZnJlZSh4KTsKKyAgaWYgKHJldCAhPSBOVUxMKSB7CisgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworLyogQWRkIGEgZmlsZSBvZiBjZXJ0cyB0byBhIHN0YWNrLgorICoKKyAqIFxwYXJhbSBzdGFjayB0aGUgc3RhY2sgdG8gYWRkIHRvLgorICogXHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gYWRkIGZyb20uIEFsbCBjZXJ0cyBpbiB0aGlzIGZpbGUgdGhhdCBhcmUgbm90CisgKiAgICAgYWxyZWFkeSBpbiB0aGUgc3RhY2sgd2lsbCBiZSBhZGRlZC4KKyAqIFxyZXR1cm4gMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4gTm90ZSB0aGF0IGluIHRoZSBjYXNlIG9mIGZhaWx1cmUgc29tZQorICogICAgIGNlcnRzIG1heSBoYXZlIGJlZW4gYWRkZWQgdG8gXGMgc3RhY2suICovCitpbnQgU1NMX2FkZF9maWxlX2NlcnRfc3ViamVjdHNfdG9fc3RhY2soU1RBQ0tfT0YoWDUwOV9OQU1FKSAqc3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSkgeworICBCSU8gKmluOworICBYNTA5ICp4ID0gTlVMTDsKKyAgWDUwOV9OQU1FICp4biA9IE5VTEw7CisgIGludCByZXQgPSAxOworICBpbnQgKCpvbGRjbXApKGNvbnN0IFg1MDlfTkFNRSAqKmEsIGNvbnN0IFg1MDlfTkFNRSAqKmIpOworCisgIG9sZGNtcCA9IHNrX1g1MDlfTkFNRV9zZXRfY21wX2Z1bmMoc3RhY2ssIHhuYW1lX2NtcCk7CisgIGluID0gQklPX25ldyhCSU9fc19maWxlKCkpOworCisgIGlmIChpbiA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfYWRkX2ZpbGVfY2VydF9zdWJqZWN0c190b19zdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoIUJJT19yZWFkX2ZpbGVuYW1lKGluLCBmaWxlKSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgZm9yICg7OykgeworICAgIGlmIChQRU1fcmVhZF9iaW9fWDUwOShpbiwgJngsIE5VTEwsIE5VTEwpID09IE5VTEwpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB4biA9IFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4KTsKKyAgICBpZiAoeG4gPT0gTlVMTCkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIHhuID0gWDUwOV9OQU1FX2R1cCh4bik7CisgICAgaWYgKHhuID09IE5VTEwpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoc2tfWDUwOV9OQU1FX2ZpbmQoc3RhY2ssIE5VTEwsIHhuKSkgeworICAgICAgWDUwOV9OQU1FX2ZyZWUoeG4pOworICAgIH0gZWxzZSB7CisgICAgICBza19YNTA5X05BTUVfcHVzaChzdGFjaywgeG4pOworICAgIH0KKyAgfQorCisgIEVSUl9jbGVhcl9lcnJvcigpOworCisgIGlmICgwKSB7CisgIGVycjoKKyAgICByZXQgPSAwOworICB9CisKKyAgQklPX2ZyZWUoaW4pOworICBYNTA5X2ZyZWUoeCk7CisKKyAgKHZvaWQpIHNrX1g1MDlfTkFNRV9zZXRfY21wX2Z1bmMoc3RhY2ssIG9sZGNtcCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogQWRkIGEgZGlyZWN0b3J5IG9mIGNlcnRzIHRvIGEgc3RhY2suCisgKgorICogXHBhcmFtIHN0YWNrIHRoZSBzdGFjayB0byBhcHBlbmQgdG8uCisgKiBccGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkgdG8gYXBwZW5kIGZyb20uIEFsbCBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSB3aWxsIGJlCisgKiAgICAgZXhhbWluZWQgYXMgcG90ZW50aWFsIGNlcnRzLiBBbnkgdGhhdCBhcmUgYWNjZXB0YWJsZSB0bworICogICAgIFNTTF9hZGRfZGlyX2NlcnRfc3ViamVjdHNfdG9fc3RhY2soKSB0aGF0IGFyZSBub3QgYWxyZWFkeSBpbiB0aGUgc3RhY2sgd2lsbAorICogICAgIGJlIGluY2x1ZGVkLgorICogXHJldHVybiAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLiBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgZmFpbHVyZSBzb21lCisgKiAgICAgY2VydHMgbWF5IGhhdmUgYmVlbiBhZGRlZCB0byBcYyBzdGFjay4gKi8KK2ludCBTU0xfYWRkX2Rpcl9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrKFNUQUNLX09GKFg1MDlfTkFNRSkgKnN0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGlyKSB7CisgIE9QRU5TU0xfRElSX0NUWCAqZCA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICBpbnQgcmV0ID0gMDsKKworICAvKiBOb3RlIHRoYXQgYSBzaWRlIGVmZmVjdCBpcyB0aGF0IHRoZSBDQXMgd2lsbCBiZSBzb3J0ZWQgYnkgbmFtZSAqLworICB3aGlsZSAoKGZpbGVuYW1lID0gT1BFTlNTTF9ESVJfcmVhZCgmZCwgZGlyKSkpIHsKKyAgICBjaGFyIGJ1ZlsxMDI0XTsKKyAgICBpbnQgcjsKKworICAgIGlmIChzdHJsZW4oZGlyKSArIHN0cmxlbihmaWxlbmFtZSkgKyAyID4gc2l6ZW9mKGJ1ZikpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX2FkZF9kaXJfY2VydF9zdWJqZWN0c190b19zdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1BBVEhfVE9PX0xPTkcpOworICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgciA9IEJJT19zbnByaW50ZihidWYsIHNpemVvZiBidWYsICIlcy8lcyIsIGRpciwgZmlsZW5hbWUpOworICAgIGlmIChyIDw9IDAgfHwgciA+PSAoaW50KXNpemVvZihidWYpIHx8CisgICAgICAgICFTU0xfYWRkX2ZpbGVfY2VydF9zdWJqZWN0c190b19zdGFjayhzdGFjaywgYnVmKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisKKyAgaWYgKGVycm5vKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfYWRkX2Rpcl9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrLCBFUlJfUl9TWVNfTElCKTsKKyAgICBFUlJfYWRkX2Vycm9yX2RhdGEoMywgIk9QRU5TU0xfRElSX3JlYWQoJmN0eCwgJyIsIGRpciwgIicpIik7CisgICAgZ290byBlcnI7CisgIH0KKworICByZXQgPSAxOworCitlcnI6CisgIGlmIChkKSB7CisgICAgT1BFTlNTTF9ESVJfZW5kKCZkKTsKKyAgfQorICByZXR1cm4gcmV0OwogfQogCiAvKiBBZGQgYSBjZXJ0aWZpY2F0ZSB0byBhIEJVRl9NRU0gc3RydWN0dXJlICovCkBAIC00MjksNyArNzYwLDcgQEAKIAogICBuID0gaTJkX1g1MDkoeCwgTlVMTCk7CiAgIGlmICghQlVGX01FTV9ncm93X2NsZWFuKGJ1ZiwgKGludCkobiArICgqbCkgKyAzKSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0JVRl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX2FkZF9jZXJ0X3RvX2J1ZiwgRVJSX1JfQlVGX0xJQik7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcCA9ICh1aW50OF90ICopJihidWYtPmRhdGFbKmxdKTsKQEAgLTQ0MSwyMSArNzcyLDM0IEBACiB9CiAKIC8qIEFkZCBjZXJ0aWZpY2F0ZSBjaGFpbiB0byBpbnRlcm5hbCBTU0wgQlVGX01FTSBzdHJ1Y3R1cmUuICovCi1pbnQgc3NsX2FkZF9jZXJ0X2NoYWluKFNTTCAqc3NsLCB1bnNpZ25lZCBsb25nICpsKSB7Ci0gIENFUlQgKmNlcnQgPSBzc2wtPmNlcnQ7Ci0gIEJVRl9NRU0gKmJ1ZiA9IHNzbC0+aW5pdF9idWY7CitpbnQgc3NsX2FkZF9jZXJ0X2NoYWluKFNTTCAqcywgQ0VSVF9QS0VZICpjcGssIHVuc2lnbmVkIGxvbmcgKmwpIHsKKyAgQlVGX01FTSAqYnVmID0gcy0+aW5pdF9idWY7CiAgIGludCBub19jaGFpbiA9IDA7CiAgIHNpemVfdCBpOwogCi0gIFg1MDkgKnggPSBjZXJ0LT54NTA5OwotICBTVEFDS19PRihYNTA5KSAqY2hhaW4gPSBjZXJ0LT5jaGFpbjsKKyAgWDUwOSAqeCA9IGNway0+eDUwOTsKKyAgU1RBQ0tfT0YoWDUwOSkgKmV4dHJhX2NlcnRzOworICBYNTA5X1NUT1JFICpjaGFpbl9zdG9yZTsKIAogICBpZiAoeCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9OT19DRVJUSUZJQ0FURV9TRVQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX2FkZF9jZXJ0X2NoYWluLCBTU0xfUl9OT19DRVJUSUZJQ0FURV9TRVQpOwogICAgIHJldHVybiAwOwogICB9CiAKLSAgaWYgKChzc2wtPm1vZGUgJiBTU0xfTU9ERV9OT19BVVRPX0NIQUlOKSB8fCBjaGFpbiAhPSBOVUxMKSB7CisgIGlmIChzLT5jZXJ0LT5jaGFpbl9zdG9yZSkgeworICAgIGNoYWluX3N0b3JlID0gcy0+Y2VydC0+Y2hhaW5fc3RvcmU7CisgIH0gZWxzZSB7CisgICAgY2hhaW5fc3RvcmUgPSBzLT5jdHgtPmNlcnRfc3RvcmU7CisgIH0KKworICAvKiBJZiB3ZSBoYXZlIGEgY2VydGlmaWNhdGUgc3BlY2lmaWMgY2hhaW4gdXNlIGl0LCBlbHNlIHVzZSBwYXJlbnQgY3R4LiAqLworICBpZiAoY3BrICYmIGNway0+Y2hhaW4pIHsKKyAgICBleHRyYV9jZXJ0cyA9IGNway0+Y2hhaW47CisgIH0gZWxzZSB7CisgICAgZXh0cmFfY2VydHMgPSBzLT5jdHgtPmV4dHJhX2NlcnRzOworICB9CisKKyAgaWYgKChzLT5tb2RlICYgU1NMX01PREVfTk9fQVVUT19DSEFJTikgfHwgZXh0cmFfY2VydHMpIHsKICAgICBub19jaGFpbiA9IDE7CiAgIH0KIApAQCAtNDY0LDggKzgwOCw4IEBACiAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2tfWDUwOV9udW0oY2hhaW4pOyBpKyspIHsKLSAgICAgIHggPSBza19YNTA5X3ZhbHVlKGNoYWluLCBpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2tfWDUwOV9udW0oZXh0cmFfY2VydHMpOyBpKyspIHsKKyAgICAgIHggPSBza19YNTA5X3ZhbHVlKGV4dHJhX2NlcnRzLCBpKTsKICAgICAgIGlmICghc3NsX2FkZF9jZXJ0X3RvX2J1ZihidWYsIGwsIHgpKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgICAgfQpAQCAtNDczLDggKzgxNyw4IEBACiAgIH0gZWxzZSB7CiAgICAgWDUwOV9TVE9SRV9DVFggeHNfY3R4OwogCi0gICAgaWYgKCFYNTA5X1NUT1JFX0NUWF9pbml0KCZ4c19jdHgsIHNzbC0+Y3R4LT5jZXJ0X3N0b3JlLCB4LCBOVUxMKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9YNTA5X0xJQik7CisgICAgaWYgKCFYNTA5X1NUT1JFX0NUWF9pbml0KCZ4c19jdHgsIGNoYWluX3N0b3JlLCB4LCBOVUxMKSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfYWRkX2NlcnRfY2hhaW4sIEVSUl9SX1g1MDlfTElCKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBYNTA5X3ZlcmlmeV9jZXJ0KCZ4c19jdHgpOwpAQCAtNDk0LDY1ICs4MzgsMTMyIEBACiAgIHJldHVybiAxOwogfQogCi1pbnQgU1NMX0NUWF9zZXQwX2NoYWluKFNTTF9DVFggKmN0eCwgU1RBQ0tfT0YoWDUwOSkgKmNoYWluKSB7Ci0gIHJldHVybiBzc2xfY2VydF9zZXQwX2NoYWluKGN0eC0+Y2VydCwgY2hhaW4pOworLyogQnVpbGQgYSBjZXJ0aWZpY2F0ZSBjaGFpbiBmb3IgY3VycmVudCBjZXJ0aWZpY2F0ZSAqLworaW50IHNzbF9idWlsZF9jZXJ0X2NoYWluKENFUlQgKmMsIFg1MDlfU1RPUkUgKmNoYWluX3N0b3JlLCBpbnQgZmxhZ3MpIHsKKyAgQ0VSVF9QS0VZICpjcGsgPSBjLT5rZXk7CisgIFg1MDlfU1RPUkVfQ1RYIHhzX2N0eDsKKyAgU1RBQ0tfT0YoWDUwOSkgKmNoYWluID0gTlVMTCwgKnVudHJ1c3RlZCA9IE5VTEw7CisgIFg1MDkgKng7CisgIGludCBpLCBydiA9IDA7CisgIHVpbnQzMl90IGVycm9yOworCisgIGlmICghY3BrLT54NTA5KSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfYnVpbGRfY2VydF9jaGFpbiwgU1NMX1JfTk9fQ0VSVElGSUNBVEVfU0VUKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIFJlYXJyYW5naW5nIGFuZCBjaGVjayB0aGUgY2hhaW46IGFkZCBldmVyeXRoaW5nIHRvIGEgc3RvcmUgKi8KKyAgaWYgKGZsYWdzICYgU1NMX0JVSUxEX0NIQUlOX0ZMQUdfQ0hFQ0spIHsKKyAgICBzaXplX3QgajsKKyAgICBjaGFpbl9zdG9yZSA9IFg1MDlfU1RPUkVfbmV3KCk7CisgICAgaWYgKCFjaGFpbl9zdG9yZSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8IHNrX1g1MDlfbnVtKGNway0+Y2hhaW4pOyBqKyspIHsKKyAgICAgIHggPSBza19YNTA5X3ZhbHVlKGNway0+Y2hhaW4sIGopOworICAgICAgaWYgKCFYNTA5X1NUT1JFX2FkZF9jZXJ0KGNoYWluX3N0b3JlLCB4KSkgeworICAgICAgICBlcnJvciA9IEVSUl9wZWVrX2xhc3RfZXJyb3IoKTsKKyAgICAgICAgaWYgKEVSUl9HRVRfTElCKGVycm9yKSAhPSBFUlJfTElCX1g1MDkgfHwKKyAgICAgICAgICAgIEVSUl9HRVRfUkVBU09OKGVycm9yKSAhPSBYNTA5X1JfQ0VSVF9BTFJFQURZX0lOX0hBU0hfVEFCTEUpIHsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBZGQgRUUgY2VydCB0b286IGl0IG1pZ2h0IGJlIHNlbGYgc2lnbmVkICovCisgICAgaWYgKCFYNTA5X1NUT1JFX2FkZF9jZXJ0KGNoYWluX3N0b3JlLCBjcGstPng1MDkpKSB7CisgICAgICBlcnJvciA9IEVSUl9wZWVrX2xhc3RfZXJyb3IoKTsKKyAgICAgIGlmIChFUlJfR0VUX0xJQihlcnJvcikgIT0gRVJSX0xJQl9YNTA5IHx8CisgICAgICAgICAgRVJSX0dFVF9SRUFTT04oZXJyb3IpICE9IFg1MDlfUl9DRVJUX0FMUkVBRFlfSU5fSEFTSF9UQUJMRSkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIEVSUl9jbGVhcl9lcnJvcigpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoYy0+Y2hhaW5fc3RvcmUpIHsKKyAgICAgIGNoYWluX3N0b3JlID0gYy0+Y2hhaW5fc3RvcmU7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgU1NMX0JVSUxEX0NIQUlOX0ZMQUdfVU5UUlVTVEVEKSB7CisgICAgICB1bnRydXN0ZWQgPSBjcGstPmNoYWluOworICAgIH0KKyAgfQorCisgIGlmICghWDUwOV9TVE9SRV9DVFhfaW5pdCgmeHNfY3R4LCBjaGFpbl9zdG9yZSwgY3BrLT54NTA5LCB1bnRydXN0ZWQpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfYnVpbGRfY2VydF9jaGFpbiwgRVJSX1JfWDUwOV9MSUIpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaSA9IFg1MDlfdmVyaWZ5X2NlcnQoJnhzX2N0eCk7CisgIGlmIChpIDw9IDAgJiYgZmxhZ3MgJiBTU0xfQlVJTERfQ0hBSU5fRkxBR19JR05PUkVfRVJST1IpIHsKKyAgICBpZiAoZmxhZ3MgJiBTU0xfQlVJTERfQ0hBSU5fRkxBR19DTEVBUl9FUlJPUikgeworICAgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgfQorICAgIGkgPSAxOworICAgIHJ2ID0gMjsKKyAgfQorCisgIGlmIChpID4gMCkgeworICAgIGNoYWluID0gWDUwOV9TVE9SRV9DVFhfZ2V0MV9jaGFpbigmeHNfY3R4KTsKKyAgfQorICBpZiAoaSA8PSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfYnVpbGRfY2VydF9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9DRVJUSUZJQ0FURV9WRVJJRllfRkFJTEVEKTsKKyAgICBpID0gWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yKCZ4c19jdHgpOworICAgIEVSUl9hZGRfZXJyb3JfZGF0YSgyLCAiVmVyaWZ5IGVycm9yOiIsIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGkpKTsKKworICAgIFg1MDlfU1RPUkVfQ1RYX2NsZWFudXAoJnhzX2N0eCk7CisgICAgZ290byBlcnI7CisgIH0KKworICBYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKCZ4c19jdHgpOworICBpZiAoY3BrLT5jaGFpbikgeworICAgIHNrX1g1MDlfcG9wX2ZyZWUoY3BrLT5jaGFpbiwgWDUwOV9mcmVlKTsKKyAgfQorCisgIC8qIFJlbW92ZSBFRSBjZXJ0aWZpY2F0ZSBmcm9tIGNoYWluICovCisgIHggPSBza19YNTA5X3NoaWZ0KGNoYWluKTsKKyAgWDUwOV9mcmVlKHgpOworICBpZiAoZmxhZ3MgJiBTU0xfQlVJTERfQ0hBSU5fRkxBR19OT19ST09UKSB7CisgICAgaWYgKHNrX1g1MDlfbnVtKGNoYWluKSA+IDApIHsKKyAgICAgIC8qIFNlZSBpZiBsYXN0IGNlcnQgaXMgc2VsZiBzaWduZWQgKi8KKyAgICAgIHggPSBza19YNTA5X3ZhbHVlKGNoYWluLCBza19YNTA5X251bShjaGFpbikgLSAxKTsKKyAgICAgIFg1MDlfY2hlY2tfcHVycG9zZSh4LCAtMSwgMCk7CisgICAgICBpZiAoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfU1MpIHsKKyAgICAgICAgeCA9IHNrX1g1MDlfcG9wKGNoYWluKTsKKyAgICAgICAgWDUwOV9mcmVlKHgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGNway0+Y2hhaW4gPSBjaGFpbjsKKyAgaWYgKHJ2ID09IDApIHsKKyAgICBydiA9IDE7CisgIH0KKworZXJyOgorICBpZiAoZmxhZ3MgJiBTU0xfQlVJTERfQ0hBSU5fRkxBR19DSEVDSykgeworICAgIFg1MDlfU1RPUkVfZnJlZShjaGFpbl9zdG9yZSk7CisgIH0KKworICByZXR1cm4gcnY7CiB9CiAKLWludCBTU0xfQ1RYX3NldDFfY2hhaW4oU1NMX0NUWCAqY3R4LCBTVEFDS19PRihYNTA5KSAqY2hhaW4pIHsKLSAgcmV0dXJuIHNzbF9jZXJ0X3NldDFfY2hhaW4oY3R4LT5jZXJ0LCBjaGFpbik7Ci19CitpbnQgc3NsX2NlcnRfc2V0X2NlcnRfc3RvcmUoQ0VSVCAqYywgWDUwOV9TVE9SRSAqc3RvcmUsIGludCBjaGFpbiwgaW50IHJlZikgeworICBYNTA5X1NUT1JFICoqcHN0b3JlOworICBpZiAoY2hhaW4pIHsKKyAgICBwc3RvcmUgPSAmYy0+Y2hhaW5fc3RvcmU7CisgIH0gZWxzZSB7CisgICAgcHN0b3JlID0gJmMtPnZlcmlmeV9zdG9yZTsKKyAgfQogCi1pbnQgU1NMX3NldDBfY2hhaW4oU1NMICpzc2wsIFNUQUNLX09GKFg1MDkpICpjaGFpbikgewotICByZXR1cm4gc3NsX2NlcnRfc2V0MF9jaGFpbihzc2wtPmNlcnQsIGNoYWluKTsKLX0KKyAgWDUwOV9TVE9SRV9mcmVlKCpwc3RvcmUpOworICAqcHN0b3JlID0gc3RvcmU7CiAKLWludCBTU0xfc2V0MV9jaGFpbihTU0wgKnNzbCwgU1RBQ0tfT0YoWDUwOSkgKmNoYWluKSB7Ci0gIHJldHVybiBzc2xfY2VydF9zZXQxX2NoYWluKHNzbC0+Y2VydCwgY2hhaW4pOwotfQotCi1pbnQgU1NMX0NUWF9hZGQwX2NoYWluX2NlcnQoU1NMX0NUWCAqY3R4LCBYNTA5ICp4NTA5KSB7Ci0gIHJldHVybiBzc2xfY2VydF9hZGQwX2NoYWluX2NlcnQoY3R4LT5jZXJ0LCB4NTA5KTsKLX0KLQotaW50IFNTTF9DVFhfYWRkMV9jaGFpbl9jZXJ0KFNTTF9DVFggKmN0eCwgWDUwOSAqeDUwOSkgewotICByZXR1cm4gc3NsX2NlcnRfYWRkMV9jaGFpbl9jZXJ0KGN0eC0+Y2VydCwgeDUwOSk7Ci19Ci0KLWludCBTU0xfQ1RYX2FkZF9leHRyYV9jaGFpbl9jZXJ0KFNTTF9DVFggKmN0eCwgWDUwOSAqeDUwOSkgewotICByZXR1cm4gU1NMX0NUWF9hZGQwX2NoYWluX2NlcnQoY3R4LCB4NTA5KTsKLX0KLQotaW50IFNTTF9hZGQwX2NoYWluX2NlcnQoU1NMICpzc2wsIFg1MDkgKng1MDkpIHsKLSAgcmV0dXJuIHNzbF9jZXJ0X2FkZDBfY2hhaW5fY2VydChzc2wtPmNlcnQsIHg1MDkpOwotfQotCi1pbnQgU1NMX2FkZDFfY2hhaW5fY2VydChTU0wgKnNzbCwgWDUwOSAqeDUwOSkgewotICByZXR1cm4gc3NsX2NlcnRfYWRkMV9jaGFpbl9jZXJ0KHNzbC0+Y2VydCwgeDUwOSk7Ci19Ci0KLWludCBTU0xfQ1RYX2NsZWFyX2NoYWluX2NlcnRzKFNTTF9DVFggKmN0eCkgewotICByZXR1cm4gU1NMX0NUWF9zZXQwX2NoYWluKGN0eCwgTlVMTCk7Ci19Ci0KLWludCBTU0xfQ1RYX2NsZWFyX2V4dHJhX2NoYWluX2NlcnRzKFNTTF9DVFggKmN0eCkgewotICByZXR1cm4gU1NMX0NUWF9jbGVhcl9jaGFpbl9jZXJ0cyhjdHgpOwotfQotCi1pbnQgU1NMX2NsZWFyX2NoYWluX2NlcnRzKFNTTCAqc3NsKSB7Ci0gIHJldHVybiBTU0xfc2V0MF9jaGFpbihzc2wsIE5VTEwpOwotfQotCi1pbnQgU1NMX0NUWF9nZXQwX2NoYWluX2NlcnRzKGNvbnN0IFNTTF9DVFggKmN0eCwgU1RBQ0tfT0YoWDUwOSkgKipvdXRfY2hhaW4pIHsKLSAgKm91dF9jaGFpbiA9IGN0eC0+Y2VydC0+Y2hhaW47Ci0gIHJldHVybiAxOwotfQotCi1pbnQgU1NMX0NUWF9nZXRfZXh0cmFfY2hhaW5fY2VydHMoY29uc3QgU1NMX0NUWCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQUNLX09GKFg1MDkpICoqb3V0X2NoYWluKSB7Ci0gIHJldHVybiBTU0xfQ1RYX2dldDBfY2hhaW5fY2VydHMoY3R4LCBvdXRfY2hhaW4pOwotfQotCi1pbnQgU1NMX2dldDBfY2hhaW5fY2VydHMoY29uc3QgU1NMICpzc2wsIFNUQUNLX09GKFg1MDkpICoqb3V0X2NoYWluKSB7Ci0gICpvdXRfY2hhaW4gPSBzc2wtPmNlcnQtPmNoYWluOworICBpZiAocmVmICYmIHN0b3JlKSB7CisgICAgQ1JZUFRPX3JlZmNvdW50X2luYygmc3RvcmUtPnJlZmVyZW5jZXMpOworICB9CiAgIHJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3NzbC9zc2xfY2lwaGVyLmMgYi9zcmMvc3NsL3NzbF9jaXBoZXIuYwppbmRleCBiMjNkNzc1Li44ZDAzYzllIDEwMDY0NAotLS0gYS9zcmMvc3NsL3NzbF9jaXBoZXIuYworKysgYi9zcmMvc3NsL3NzbF9jaXBoZXIuYwpAQCAtMTM4LDggKzEzOCw2IEBACiAgKiBPVEhFUiBFTlRJVFkgQkFTRUQgT04gSU5GUklOR0VNRU5UIE9GIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMgT1IKICAqIE9USEVSV0lTRS4gKi8KIAotI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+Ci0KICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMTU3LDEyICsxNTUsNiBAQAogLyoga0NpcGhlcnMgaXMgYW4gYXJyYXkgb2YgYWxsIHN1cHBvcnRlZCBjaXBoZXJzLCBzb3J0ZWQgYnkgaWQuICovCiBjb25zdCBTU0xfQ0lQSEVSIGtDaXBoZXJzW10gPSB7CiAgICAgLyogVGhlIFJTQSBjaXBoZXJzICovCi0gICAgLyogQ2lwaGVyIDAyICovCi0gICAgewotICAgICBTU0wzX1RYVF9SU0FfTlVMTF9TSEEsIFNTTDNfQ0tfUlNBX05VTExfU0hBLCBTU0xfa1JTQSwgU1NMX2FSU0EsCi0gICAgIFNTTF9lTlVMTCwgU1NMX1NIQTEsIFNTTF9TU0xWMywgU1NMX0ZJUFMsIFNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFQsIDAsIDAsCi0gICAgfSwKLQogICAgIC8qIENpcGhlciAwNCAqLwogICAgIHsKICAgICAgU1NMM19UWFRfUlNBX1JDNF8xMjhfTUQ1LCBTU0wzX0NLX1JTQV9SQzRfMTI4X01ENSwgU1NMX2tSU0EsIFNTTF9hUlNBLApAQCAtMjc4LDcgKzI3MCw4IEBACiAgICAgIFRMUzFfVFhUX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiwKICAgICAgVExTMV9DS19SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYsIFNTTF9rUlNBLCBTU0xfYVJTQSwgU1NMX0FFUzEyOEdDTSwKICAgICAgU1NMX0FFQUQsIFNTTF9UTFNWMV8yLCBTU0xfSElHSCB8IFNTTF9GSVBTLAotICAgICBTU0xfSEFORFNIQUtFX01BQ19TSEEyNTYsCisgICAgIFNTTF9IQU5EU0hBS0VfTUFDX1NIQTI1NiB8CisgICAgICAgICBTU0xfQ0lQSEVSX0FMR09SSVRITTJfVkFSSUFCTEVfTk9OQ0VfSU5DTFVERURfSU5fUkVDT1JELAogICAgICAxMjgsIDEyOCwKICAgICB9LAogCkBAIC0yODcsNyArMjgwLDggQEAKICAgICAgVExTMV9UWFRfUlNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0LAogICAgICBUTFMxX0NLX1JTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCwgU1NMX2tSU0EsIFNTTF9hUlNBLCBTU0xfQUVTMjU2R0NNLAogICAgICBTU0xfQUVBRCwgU1NMX1RMU1YxXzIsIFNTTF9ISUdIIHwgU1NMX0ZJUFMsCi0gICAgIFNTTF9IQU5EU0hBS0VfTUFDX1NIQTM4NCwKKyAgICAgU1NMX0hBTkRTSEFLRV9NQUNfU0hBMzg0IHwKKyAgICAgICAgIFNTTF9DSVBIRVJfQUxHT1JJVEhNMl9WQVJJQUJMRV9OT05DRV9JTkNMVURFRF9JTl9SRUNPUkQsCiAgICAgIDI1NiwgMjU2LAogICAgIH0sCiAKQEAgLTI5Niw3ICsyOTAsOCBAQAogICAgICBUTFMxX1RYVF9ESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2LAogICAgICBUTFMxX0NLX0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYsIFNTTF9rREhFLCBTU0xfYVJTQSwgU1NMX0FFUzEyOEdDTSwKICAgICAgU1NMX0FFQUQsIFNTTF9UTFNWMV8yLCBTU0xfSElHSCB8IFNTTF9GSVBTLAotICAgICBTU0xfSEFORFNIQUtFX01BQ19TSEEyNTYsCisgICAgIFNTTF9IQU5EU0hBS0VfTUFDX1NIQTI1NiB8CisgICAgICAgICBTU0xfQ0lQSEVSX0FMR09SSVRITTJfVkFSSUFCTEVfTk9OQ0VfSU5DTFVERURfSU5fUkVDT1JELAogICAgICAxMjgsIDEyOCwKICAgICB9LAogCkBAIC0zMDUsNyArMzAwLDggQEAKICAgICAgVExTMV9UWFRfREhFX1JTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCwKICAgICAgVExTMV9DS19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0LCBTU0xfa0RIRSwgU1NMX2FSU0EsIFNTTF9BRVMyNTZHQ00sCiAgICAgIFNTTF9BRUFELCBTU0xfVExTVjFfMiwgU1NMX0hJR0ggfCBTU0xfRklQUywKLSAgICAgU1NMX0hBTkRTSEFLRV9NQUNfU0hBMzg0LAorICAgICBTU0xfSEFORFNIQUtFX01BQ19TSEEzODQgfAorICAgICAgICAgU1NMX0NJUEhFUl9BTEdPUklUSE0yX1ZBUklBQkxFX05PTkNFX0lOQ0xVREVEX0lOX1JFQ09SRCwKICAgICAgMjU2LCAyNTYsCiAgICAgfSwKIApAQCAtMzk5LDcgKzM5NSw4IEBACiAgICAgIFRMUzFfVFhUX0VDREhFX0VDRFNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2LAogICAgICBUTFMxX0NLX0VDREhFX0VDRFNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2LCBTU0xfa0VDREhFLCBTU0xfYUVDRFNBLAogICAgICBTU0xfQUVTMTI4R0NNLCBTU0xfQUVBRCwgU1NMX1RMU1YxXzIsIFNTTF9ISUdIIHwgU1NMX0ZJUFMsCi0gICAgIFNTTF9IQU5EU0hBS0VfTUFDX1NIQTI1NiwKKyAgICAgU1NMX0hBTkRTSEFLRV9NQUNfU0hBMjU2IHwKKyAgICAgICAgIFNTTF9DSVBIRVJfQUxHT1JJVEhNMl9WQVJJQUJMRV9OT05DRV9JTkNMVURFRF9JTl9SRUNPUkQsCiAgICAgIDEyOCwgMTI4LAogICAgIH0sCiAKQEAgLTQwOCw3ICs0MDUsOCBAQAogICAgICBUTFMxX1RYVF9FQ0RIRV9FQ0RTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCwKICAgICAgVExTMV9DS19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCwgU1NMX2tFQ0RIRSwgU1NMX2FFQ0RTQSwKICAgICAgU1NMX0FFUzI1NkdDTSwgU1NMX0FFQUQsIFNTTF9UTFNWMV8yLCBTU0xfSElHSCB8IFNTTF9GSVBTLAotICAgICBTU0xfSEFORFNIQUtFX01BQ19TSEEzODQsCisgICAgIFNTTF9IQU5EU0hBS0VfTUFDX1NIQTM4NCB8CisgICAgICAgICBTU0xfQ0lQSEVSX0FMR09SSVRITTJfVkFSSUFCTEVfTk9OQ0VfSU5DTFVERURfSU5fUkVDT1JELAogICAgICAyNTYsIDI1NiwKICAgICB9LAogCkBAIC00MTcsNyArNDE1LDggQEAKICAgICAgVExTMV9UWFRfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2LAogICAgICBUTFMxX0NLX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiwgU1NMX2tFQ0RIRSwgU1NMX2FSU0EsCiAgICAgIFNTTF9BRVMxMjhHQ00sIFNTTF9BRUFELCBTU0xfVExTVjFfMiwgU1NMX0hJR0ggfCBTU0xfRklQUywKLSAgICAgU1NMX0hBTkRTSEFLRV9NQUNfU0hBMjU2LAorICAgICBTU0xfSEFORFNIQUtFX01BQ19TSEEyNTYgfAorICAgICAgICAgU1NMX0NJUEhFUl9BTEdPUklUSE0yX1ZBUklBQkxFX05PTkNFX0lOQ0xVREVEX0lOX1JFQ09SRCwKICAgICAgMTI4LCAxMjgsCiAgICAgfSwKIApAQCAtNDI2LDcgKzQyNSw4IEBACiAgICAgIFRMUzFfVFhUX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCwKICAgICAgVExTMV9DS19FQ0RIRV9SU0FfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQsIFNTTF9rRUNESEUsIFNTTF9hUlNBLAogICAgICBTU0xfQUVTMjU2R0NNLCBTU0xfQUVBRCwgU1NMX1RMU1YxXzIsIFNTTF9ISUdIIHwgU1NMX0ZJUFMsCi0gICAgIFNTTF9IQU5EU0hBS0VfTUFDX1NIQTM4NCwKKyAgICAgU1NMX0hBTkRTSEFLRV9NQUNfU0hBMzg0IHwKKyAgICAgICAgIFNTTF9DSVBIRVJfQUxHT1JJVEhNMl9WQVJJQUJMRV9OT05DRV9JTkNMVURFRF9JTl9SRUNPUkQsCiAgICAgIDI1NiwgMjU2LAogICAgIH0sCiAKQEAgLTQ0OCwxNSArNDQ4LDE1IEBACiAgICAgIFNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFQsIDI1NiwgMjU2LAogICAgIH0sCiAKLSNpZiAhZGVmaW5lZChCT1JJTkdTU0xfQU5EUk9JRF9TWVNURU0pCiAgICAgLyogQ2hhQ2hhMjAtUG9seTEzMDUgY2lwaGVyIHN1aXRlcy4gKi8KIAorI2lmICFkZWZpbmVkKEFORFJPSUQpCiAgICAgewogICAgICBUTFMxX1RYVF9FQ0RIRV9SU0FfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNSwKICAgICAgVExTMV9DS19FQ0RIRV9SU0FfQ0hBQ0hBMjBfUE9MWTEzMDUsIFNTTF9rRUNESEUsIFNTTF9hUlNBLAogICAgICBTU0xfQ0hBQ0hBMjBQT0xZMTMwNSwgU1NMX0FFQUQsIFNTTF9UTFNWMV8yLCBTU0xfSElHSCwKICAgICAgU1NMX0hBTkRTSEFLRV9NQUNfU0hBMjU2LAotICAgICAyNTYsIDI1NiwKKyAgICAgMjU2LCAwLAogICAgIH0sCiAKICAgICB7CkBAIC00NjQsMTMgKzQ2NCwzMyBAQAogICAgICBUTFMxX0NLX0VDREhFX0VDRFNBX0NIQUNIQTIwX1BPTFkxMzA1LCBTU0xfa0VDREhFLCBTU0xfYUVDRFNBLAogICAgICBTU0xfQ0hBQ0hBMjBQT0xZMTMwNSwgU1NMX0FFQUQsIFNTTF9UTFNWMV8yLCBTU0xfSElHSCwKICAgICAgU1NMX0hBTkRTSEFLRV9NQUNfU0hBMjU2LAotICAgICAyNTYsIDI1NiwKKyAgICAgMjU2LCAwLAorICAgIH0sCisKKyAgICB7CisgICAgIFRMUzFfVFhUX0RIRV9SU0FfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNSwKKyAgICAgVExTMV9DS19ESEVfUlNBX0NIQUNIQTIwX1BPTFkxMzA1LCBTU0xfa0RIRSwgU1NMX2FSU0EsCisgICAgIFNTTF9DSEFDSEEyMFBPTFkxMzA1LCBTU0xfQUVBRCwgU1NMX1RMU1YxXzIsIFNTTF9ISUdILAorICAgICBTU0xfSEFORFNIQUtFX01BQ19TSEEyNTYsCisgICAgIDI1NiwgMCwKICAgICB9LAogI2VuZGlmCiB9OwogCiBzdGF0aWMgY29uc3Qgc2l6ZV90IGtDaXBoZXJzTGVuID0gc2l6ZW9mKGtDaXBoZXJzKSAvIHNpemVvZihrQ2lwaGVyc1swXSk7CiAKK3N0cnVjdCBoYW5kc2hha2VfZGlnZXN0IHsKKyAgdWludDMyX3QgbWFzazsKKyAgY29uc3QgRVZQX01EICooKm1kX2Z1bmMpKHZvaWQpOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoYW5kc2hha2VfZGlnZXN0IHNzbF9oYW5kc2hha2VfZGlnZXN0c1tTU0xfTUFYX0RJR0VTVF0gPSB7CisgICAge1NTTF9IQU5EU0hBS0VfTUFDX01ENSwgRVZQX21kNX0sCisgICAge1NTTF9IQU5EU0hBS0VfTUFDX1NIQSwgRVZQX3NoYTF9LAorICAgIHtTU0xfSEFORFNIQUtFX01BQ19TSEEyNTYsIEVWUF9zaGEyNTZ9LAorICAgIHtTU0xfSEFORFNIQUtFX01BQ19TSEEzODQsIEVWUF9zaGEzODR9LAorfTsKKwogI2RlZmluZSBDSVBIRVJfQUREIDEKICNkZWZpbmUgQ0lQSEVSX0tJTEwgMgogI2RlZmluZSBDSVBIRVJfREVMIDMKQEAgLTUwMSw4ICs1MjEsNyBAQAogfSBDSVBIRVJfQUxJQVM7CiAKIHN0YXRpYyBjb25zdCBDSVBIRVJfQUxJQVMga0NpcGhlckFsaWFzZXNbXSA9IHsKLSAgICAvKiAiQUxMIiBkb2Vzbid0IGluY2x1ZGUgZU5VTEwgKG11c3QgYmUgc3BlY2lmaWNhbGx5IGVuYWJsZWQpICovCi0gICAge1NTTF9UWFRfQUxMLCB+MHUsIH4wdSwgflNTTF9lTlVMTCwgfjB1LCB+MHUsIH4wdX0sCisgICAge1NTTF9UWFRfQUxMLCB+MHUsIH4wdSwgfjB1LCB+MHUsIH4wdSwgfjB1fSwKIAogICAgIC8qIFRoZSAiQ09NUExFTUVOVE9GREVGQVVMVCIgcnVsZSBpcyBvbWl0dGVkLiBJdCBtYXRjaGVzIG5vdGhpbmcuICovCiAKQEAgLTUyMyw3ICs1NDIsNyBAQAogICAgIHtTU0xfVFhUX2tQU0ssIFNTTF9rUFNLLCB+MHUsIH4wdSwgfjB1LCB+MHUsIH4wdX0sCiAKICAgICAvKiBzZXJ2ZXIgYXV0aGVudGljYXRpb24gYWxpYXNlcyAqLwotICAgIHtTU0xfVFhUX2FSU0EsIH4wdSwgU1NMX2FSU0EsIH5TU0xfZU5VTEwsIH4wdSwgfjB1LCB+MHV9LAorICAgIHtTU0xfVFhUX2FSU0EsIH4wdSwgU1NMX2FSU0EsIH4wdSwgfjB1LCB+MHUsIH4wdX0sCiAgICAge1NTTF9UWFRfYUVDRFNBLCB+MHUsIFNTTF9hRUNEU0EsIH4wdSwgfjB1LCB+MHUsIH4wdX0sCiAgICAge1NTTF9UWFRfRUNEU0EsIH4wdSwgU1NMX2FFQ0RTQSwgfjB1LCB+MHUsIH4wdSwgfjB1fSwKICAgICB7U1NMX1RYVF9hUFNLLCB+MHUsIFNTTF9hUFNLLCB+MHUsIH4wdSwgfjB1LCB+MHV9LApAQCAtNTMzLDcgKzU1Miw3IEBACiAgICAge1NTTF9UWFRfRURILCBTU0xfa0RIRSwgfjB1LCB+MHUsIH4wdSwgfjB1LCB+MHV9LAogICAgIHtTU0xfVFhUX0VDREhFLCBTU0xfa0VDREhFLCB+MHUsIH4wdSwgfjB1LCB+MHUsIH4wdX0sCiAgICAge1NTTF9UWFRfRUVDREgsIFNTTF9rRUNESEUsIH4wdSwgfjB1LCB+MHUsIH4wdSwgfjB1fSwKLSAgICB7U1NMX1RYVF9SU0EsIFNTTF9rUlNBLCBTU0xfYVJTQSwgflNTTF9lTlVMTCwgfjB1LCB+MHUsIH4wdX0sCisgICAge1NTTF9UWFRfUlNBLCBTU0xfa1JTQSwgU1NMX2FSU0EsIH4wdSwgfjB1LCB+MHUsIH4wdX0sCiAgICAge1NTTF9UWFRfUFNLLCBTU0xfa1BTSywgU1NMX2FQU0ssIH4wdSwgfjB1LCB+MHUsIH4wdX0sCiAKICAgICAvKiBzeW1tZXRyaWMgZW5jcnlwdGlvbiBhbGlhc2VzICovCkBAIC01NDcsMjEgKzU2NiwyMSBAQAogCiAgICAgLyogTUFDIGFsaWFzZXMgKi8KICAgICB7U1NMX1RYVF9NRDUsIH4wdSwgfjB1LCB+MHUsIFNTTF9NRDUsIH4wdSwgfjB1fSwKLSAgICB7U1NMX1RYVF9TSEExLCB+MHUsIH4wdSwgflNTTF9lTlVMTCwgU1NMX1NIQTEsIH4wdSwgfjB1fSwKLSAgICB7U1NMX1RYVF9TSEEsIH4wdSwgfjB1LCB+U1NMX2VOVUxMLCBTU0xfU0hBMSwgfjB1LCB+MHV9LAorICAgIHtTU0xfVFhUX1NIQTEsIH4wdSwgfjB1LCB+MHUsIFNTTF9TSEExLCB+MHUsIH4wdX0sCisgICAge1NTTF9UWFRfU0hBLCB+MHUsIH4wdSwgfjB1LCBTU0xfU0hBMSwgfjB1LCB+MHV9LAogICAgIHtTU0xfVFhUX1NIQTI1NiwgfjB1LCB+MHUsIH4wdSwgU1NMX1NIQTI1NiwgfjB1LCB+MHV9LAogICAgIHtTU0xfVFhUX1NIQTM4NCwgfjB1LCB+MHUsIH4wdSwgU1NMX1NIQTM4NCwgfjB1LCB+MHV9LAogCiAgICAgLyogcHJvdG9jb2wgdmVyc2lvbiBhbGlhc2VzICovCi0gICAge1NTTF9UWFRfU1NMVjMsIH4wdSwgfjB1LCB+U1NMX2VOVUxMLCB+MHUsIFNTTF9TU0xWMywgfjB1fSwKLSAgICB7U1NMX1RYVF9UTFNWMSwgfjB1LCB+MHUsIH5TU0xfZU5VTEwsIH4wdSwgU1NMX1RMU1YxLCB+MHV9LAotICAgIHtTU0xfVFhUX1RMU1YxXzIsIH4wdSwgfjB1LCB+U1NMX2VOVUxMLCB+MHUsIFNTTF9UTFNWMV8yLCB+MHV9LAorICAgIHtTU0xfVFhUX1NTTFYzLCB+MHUsIH4wdSwgfjB1LCB+MHUsIFNTTF9TU0xWMywgfjB1fSwKKyAgICB7U1NMX1RYVF9UTFNWMSwgfjB1LCB+MHUsIH4wdSwgfjB1LCBTU0xfVExTVjEsIH4wdX0sCisgICAge1NTTF9UWFRfVExTVjFfMiwgfjB1LCB+MHUsIH4wdSwgfjB1LCBTU0xfVExTVjFfMiwgfjB1fSwKIAogICAgIC8qIHN0cmVuZ3RoIGNsYXNzZXMgKi8KICAgICB7U1NMX1RYVF9NRURJVU0sIH4wdSwgfjB1LCB+MHUsIH4wdSwgfjB1LCBTU0xfTUVESVVNfSwKICAgICB7U1NMX1RYVF9ISUdILCB+MHUsIH4wdSwgfjB1LCB+MHUsIH4wdSwgU1NMX0hJR0h9LAogICAgIC8qIEZJUFMgMTQwLTIgYXBwcm92ZWQgY2lwaGVyc3VpdGUgKi8KLSAgICB7U1NMX1RYVF9GSVBTLCB+MHUsIH4wdSwgflNTTF9lTlVMTCwgfjB1LCB+MHUsIFNTTF9GSVBTfSwKKyAgICB7U1NMX1RYVF9GSVBTLCB+MHUsIH4wdSwgfjB1LCB+MHUsIH4wdSwgU1NMX0ZJUFN9LAogfTsKIAogc3RhdGljIGNvbnN0IHNpemVfdCBrQ2lwaGVyQWxpYXNlc0xlbiA9CkBAIC02MTEsNyArNjMwLDcgQEAKICAgICAgICpvdXRfZml4ZWRfaXZfbGVuID0gNDsKICAgICAgIHJldHVybiAxOwogCi0jaWYgIWRlZmluZWQoQk9SSU5HU1NMX0FORFJPSURfU1lTVEVNKQorI2lmICFkZWZpbmVkKEFORFJPSUQpCiAgICAgY2FzZSBTU0xfQ0hBQ0hBMjBQT0xZMTMwNToKICAgICAgICpvdXRfYWVhZCA9IEVWUF9hZWFkX2NoYWNoYTIwX3BvbHkxMzA1KCk7CiAgICAgICAqb3V0X2ZpeGVkX2l2X2xlbiA9IDA7CkBAIC03MDYsMzYgKzcyNSwxOSBAQAogICAgICAgICAgIHJldHVybiAwOwogICAgICAgfQogCi0gICAgY2FzZSBTU0xfZU5VTEw6Ci0gICAgICBzd2l0Y2ggKGNpcGhlci0+YWxnb3JpdGhtX21hYykgewotICAgICAgICBjYXNlIFNTTF9TSEExOgotICAgICAgICAgIGlmICh2ZXJzaW9uID09IFNTTDNfVkVSU0lPTikgewotICAgICAgICAgICAgKm91dF9hZWFkID0gRVZQX2FlYWRfbnVsbF9zaGExX3NzbDMoKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKm91dF9hZWFkID0gRVZQX2FlYWRfbnVsbF9zaGExX3RscygpOwotICAgICAgICAgIH0KLSAgICAgICAgICAqb3V0X21hY19zZWNyZXRfbGVuID0gU0hBX0RJR0VTVF9MRU5HVEg7Ci0gICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KICAgICBkZWZhdWx0OgogICAgICAgcmV0dXJuIDA7CiAgIH0KIH0KIAotY29uc3QgRVZQX01EICpzc2xfZ2V0X2hhbmRzaGFrZV9kaWdlc3QodWludDMyX3QgYWxnb3JpdGhtX3ByZikgewotICBzd2l0Y2ggKGFsZ29yaXRobV9wcmYpIHsKLSAgICBjYXNlIFNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFQ6Ci0gICAgICByZXR1cm4gRVZQX3NoYTEoKTsKLSAgICBjYXNlIFNTTF9IQU5EU0hBS0VfTUFDX1NIQTI1NjoKLSAgICAgIHJldHVybiBFVlBfc2hhMjU2KCk7Ci0gICAgY2FzZSBTU0xfSEFORFNIQUtFX01BQ19TSEEzODQ6Ci0gICAgICByZXR1cm4gRVZQX3NoYTM4NCgpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKK2ludCBzc2xfZ2V0X2hhbmRzaGFrZV9kaWdlc3QodWludDMyX3QgKm91dF9tYXNrLCBjb25zdCBFVlBfTUQgKipvdXRfbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpZHgpIHsKKyAgaWYgKGlkeCA+PSBTU0xfTUFYX0RJR0VTVCkgeworICAgIHJldHVybiAwOwogICB9CisgICpvdXRfbWFzayA9IHNzbF9oYW5kc2hha2VfZGlnZXN0c1tpZHhdLm1hc2s7CisgICpvdXRfbWQgPSBzc2xfaGFuZHNoYWtlX2RpZ2VzdHNbaWR4XS5tZF9mdW5jKCk7CisgIHJldHVybiAxOwogfQogCiAjZGVmaW5lIElURU1fU0VQKGEpIFwKQEAgLTk3Nyw3ICs5NzksNyBAQAogCiAgIG51bWJlcl91c2VzID0gT1BFTlNTTF9tYWxsb2MoKG1heF9zdHJlbmd0aF9iaXRzICsgMSkgKiBzaXplb2YoaW50KSk7CiAgIGlmICghbnVtYmVyX3VzZXMpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9jaXBoZXJfc3RyZW5ndGhfc29ydCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiAwOwogICB9CiAgIG1lbXNldChudW1iZXJfdXNlcywgMCwgKG1heF9zdHJlbmd0aF9iaXRzICsgMSkgKiBzaXplb2YoaW50KSk7CkBAIC0xMDM5LDcgKzEwNDEsOCBAQAogICAgICAgICBjb250aW51ZTsKICAgICAgIH0gZWxzZSBpZiAoIShjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSAmJiAhKGNoID49ICdBJyAmJiBjaCA8PSAnWicpICYmCiAgICAgICAgICAgICAgICAgICEoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9VTkVYUEVDVEVEX09QRVJBVE9SX0lOX0dST1VQKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfY2lwaGVyX3Byb2Nlc3NfcnVsZXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfVU5FWFBFQ1RFRF9PUEVSQVRPUl9JTl9HUk9VUCk7CiAgICAgICAgIHJldHZhbCA9IGluX2dyb3VwID0gMDsKICAgICAgICAgYnJlYWs7CiAgICAgICB9IGVsc2UgewpAQCAtMTA1OSw3ICsxMDYyLDcgQEAKICAgICAgIGwrKzsKICAgICB9IGVsc2UgaWYgKGNoID09ICdbJykgewogICAgICAgaWYgKGluX2dyb3VwKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfTkVTVEVEX0dST1VQKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfY2lwaGVyX3Byb2Nlc3NfcnVsZXN0ciwgU1NMX1JfTkVTVEVEX0dST1VQKTsKICAgICAgICAgcmV0dmFsID0gaW5fZ3JvdXAgPSAwOwogICAgICAgICBicmVhazsKICAgICAgIH0KQEAgLTEwNzQsNyArMTA3Nyw4IEBACiAgICAgLyogSWYgcHJlZmVyZW5jZSBncm91cHMgYXJlIGVuYWJsZWQsIHRoZSBvbmx5IGxlZ2FsIG9wZXJhdG9yIGlzICsuCiAgICAgICogT3RoZXJ3aXNlIHRoZSBpbl9ncm91cCBiaXRzIHdpbGwgZ2V0IG1peGVkIHVwLiAqLwogICAgIGlmIChoYXNfZ3JvdXAgJiYgcnVsZSAhPSBDSVBIRVJfQUREKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX01JWEVEX1NQRUNJQUxfT1BFUkFUT1JfV0lUSF9HUk9VUFMpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfY2lwaGVyX3Byb2Nlc3NfcnVsZXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX01JWEVEX1NQRUNJQUxfT1BFUkFUT1JfV0lUSF9HUk9VUFMpOwogICAgICAgcmV0dmFsID0gaW5fZ3JvdXAgPSAwOwogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMTEwNiw3ICsxMTEwLDggQEAKICAgICAgIGlmIChidWZfbGVuID09IDApIHsKICAgICAgICAgLyogV2UgaGl0IHNvbWV0aGluZyB3ZSBjYW5ub3QgZGVhbCB3aXRoLCBpdCBpcyBubyBjb21tYW5kIG9yIHNlcGFyYXRvcgogICAgICAgICAgKiBub3IgYWxwaGFudW1lcmljLCBzbyB3ZSBjYWxsIHRoaXMgYW4gZXJyb3IuICovCi0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfSU5WQUxJRF9DT01NQU5EKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfY2lwaGVyX3Byb2Nlc3NfcnVsZXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfSU5WQUxJRF9DT01NQU5EKTsKICAgICAgICAgcmV0dmFsID0gaW5fZ3JvdXAgPSAwOwogICAgICAgICBsKys7CiAgICAgICAgIGJyZWFrOwpAQCAtMTE2MCw3ICsxMTY1LDggQEAKICAgICAgIGlmIChidWZfbGVuID09IDggJiYgIXN0cm5jbXAoYnVmLCAiU1RSRU5HVEgiLCA4KSkgewogICAgICAgICBvayA9IHNzbF9jaXBoZXJfc3RyZW5ndGhfc29ydChoZWFkX3AsIHRhaWxfcCk7CiAgICAgICB9IGVsc2UgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0lOVkFMSURfQ09NTUFORCk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX2NpcGhlcl9wcm9jZXNzX3J1bGVzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX0lOVkFMSURfQ09NTUFORCk7CiAgICAgICB9CiAKICAgICAgIGlmIChvayA9PSAwKSB7CkBAIC0xMTgwLDcgKzExODYsNyBAQAogICB9CiAKICAgaWYgKGluX2dyb3VwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9JTlZBTElEX0NPTU1BTkQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX2NpcGhlcl9wcm9jZXNzX3J1bGVzdHIsIFNTTF9SX0lOVkFMSURfQ09NTUFORCk7CiAgICAgcmV0dmFsID0gMDsKICAgfQogCkBAIC0xMjEwLDcgKzEyMTYsNyBAQAogICAgKiBhbGxvY2F0aW9uLiAqLwogICBjb19saXN0ID0gKENJUEhFUl9PUkRFUiAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihDSVBIRVJfT1JERVIpICoga0NpcGhlcnNMZW4pOwogICBpZiAoY29fbGlzdCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfY3JlYXRlX2NpcGhlcl9saXN0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIApAQCAtMTM4NSwyNyArMTM5MSwxMyBAQAogfQogCiBpbnQgU1NMX0NJUEhFUl9pc19BRVNHQ00oY29uc3QgU1NMX0NJUEhFUiAqY2lwaGVyKSB7Ci0gIHJldHVybiAoY2lwaGVyLT5hbGdvcml0aG1fZW5jICYgKFNTTF9BRVMxMjhHQ00gfCBTU0xfQUVTMjU2R0NNKSkgIT0gMDsKKyAgcmV0dXJuIChjaXBoZXItPmFsZ29yaXRobV9tYWMgJiAoU1NMX0FFUzEyOEdDTSB8IFNTTF9BRVMyNTZHQ00pKSAhPSAwOwogfQogCiBpbnQgU1NMX0NJUEhFUl9pc19DSEFDSEEyMFBPTFkxMzA1KGNvbnN0IFNTTF9DSVBIRVIgKmNpcGhlcikgewogICByZXR1cm4gKGNpcGhlci0+YWxnb3JpdGhtX2VuYyAmIFNTTF9DSEFDSEEyMFBPTFkxMzA1KSAhPSAwOwogfQogCi1pbnQgU1NMX0NJUEhFUl9pc19OVUxMKGNvbnN0IFNTTF9DSVBIRVIgKmNpcGhlcikgewotICByZXR1cm4gKGNpcGhlci0+YWxnb3JpdGhtX2VuYyAmIFNTTF9lTlVMTCkgIT0gMDsKLX0KLQotaW50IFNTTF9DSVBIRVJfaXNfUkM0KGNvbnN0IFNTTF9DSVBIRVIgKmNpcGhlcikgewotICByZXR1cm4gKGNpcGhlci0+YWxnb3JpdGhtX2VuYyAmIFNTTF9SQzQpICE9IDA7Ci19Ci0KLWludCBTU0xfQ0lQSEVSX2lzX2Jsb2NrX2NpcGhlcihjb25zdCBTU0xfQ0lQSEVSICpjaXBoZXIpIHsKLSAgLyogTmVpdGhlciBzdHJlYW0gY2lwaGVyIG5vciBBRUFELiAqLwotICByZXR1cm4gKGNpcGhlci0+YWxnb3JpdGhtX2VuYyAmIChTU0xfUkM0IHwgU1NMX2VOVUxMKSkgPT0gMCAmJgotICAgICAgY2lwaGVyLT5hbGdvcml0aG1fbWFjICE9IFNTTF9BRUFEOwotfQotCiAvKiByZXR1cm4gdGhlIGFjdHVhbCBjaXBoZXIgYmVpbmcgdXNlZCAqLwogY29uc3QgY2hhciAqU1NMX0NJUEhFUl9nZXRfbmFtZShjb25zdCBTU0xfQ0lQSEVSICpjaXBoZXIpIHsKICAgaWYgKGNpcGhlciAhPSBOVUxMKSB7CkBAIC0xNDgwLDI0ICsxNDcyLDI3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzc2xfY2lwaGVyX2dldF9wcmZfbmFtZShjb25zdCBTU0xfQ0lQSEVSICpjaXBoZXIpIHsKLSAgc3dpdGNoIChjaXBoZXItPmFsZ29yaXRobV9wcmYpIHsKLSAgICBjYXNlIFNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFQ6Ci0gICAgICAvKiBCZWZvcmUgVExTIDEuMiwgdGhlIFBSRiBjb21wb25lbnQgaXMgdGhlIGhhc2ggdXNlZCBpbiB0aGUgSE1BQywgd2hpY2ggaXMKLSAgICAgICAqIG9ubHkgZXZlciBNRDUgb3IgU0hBLTEuICovCi0gICAgICBzd2l0Y2ggKGNpcGhlci0+YWxnb3JpdGhtX21hYykgewotICAgICAgICBjYXNlIFNTTF9NRDU6Ci0gICAgICAgICAgcmV0dXJuICJNRDUiOwotICAgICAgICBjYXNlIFNTTF9TSEExOgotICAgICAgICAgIHJldHVybiAiU0hBIjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1NMX0hBTkRTSEFLRV9NQUNfU0hBMjU2OgotICAgICAgcmV0dXJuICJTSEEyNTYiOwotICAgIGNhc2UgU1NMX0hBTkRTSEFLRV9NQUNfU0hBMzg0OgotICAgICAgcmV0dXJuICJTSEEzODQiOworICBpZiAoKGNpcGhlci0+YWxnb3JpdGhtMiAmIFNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFQpID09CisgICAgICBTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUKSB7CisgICAgLyogQmVmb3JlIFRMUyAxLjIsIHRoZSBQUkYgY29tcG9uZW50IGlzIHRoZSBoYXNoIHVzZWQgaW4gdGhlIEhNQUMsIHdoaWNoIGlzCisgICAgICogb25seSBldmVyIE1ENSBvciBTSEEtMS4gKi8KKyAgICBzd2l0Y2ggKGNpcGhlci0+YWxnb3JpdGhtX21hYykgeworICAgICAgY2FzZSBTU0xfTUQ1OgorICAgICAgICByZXR1cm4gIk1ENSI7CisgICAgICBjYXNlIFNTTF9TSEExOgorICAgICAgICByZXR1cm4gIlNIQSI7CisgICAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgIHJldHVybiAiVU5LTk9XTiI7CisgICAgfQorICB9IGVsc2UgaWYgKGNpcGhlci0+YWxnb3JpdGhtMiAmIFNTTF9IQU5EU0hBS0VfTUFDX1NIQTI1NikgeworICAgIHJldHVybiAiU0hBMjU2IjsKKyAgfSBlbHNlIGlmIChjaXBoZXItPmFsZ29yaXRobTIgJiBTU0xfSEFORFNIQUtFX01BQ19TSEEzODQpIHsKKyAgICByZXR1cm4gIlNIQTM4NCI7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KDApOworICAgIHJldHVybiAiVU5LTk9XTiI7CiAgIH0KLSAgYXNzZXJ0KDApOwotICByZXR1cm4gIlVOS05PV04iOwogfQogCiBjaGFyICpTU0xfQ0lQSEVSX2dldF9yZmNfbmFtZShjb25zdCBTU0xfQ0lQSEVSICpjaXBoZXIpIHsKQEAgLTE2MzAsMTAgKzE2MjUsNiBAQAogICAgICAgZW5jID0gIkNoYUNoYTIwLVBvbHkxMzA1IjsKICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBTU0xfZU5VTEw6Ci0gICAgICBlbmM9Ik5vbmUiOwotICAgICAgYnJlYWs7Ci0KICAgICBkZWZhdWx0OgogICAgICAgZW5jID0gInVua25vd24iOwogICAgICAgYnJlYWs7CkBAIC0xNjgzLDI4ICsxNjc0LDI5IEBACiAgIHJldHVybiAiVExTdjEvU1NMdjMiOwogfQogCi1DT01QX01FVEhPRCAqU1NMX0NPTVBfZ2V0X2NvbXByZXNzaW9uX21ldGhvZHModm9pZCkgeyByZXR1cm4gTlVMTDsgfQordm9pZCAqU1NMX0NPTVBfZ2V0X2NvbXByZXNzaW9uX21ldGhvZHModm9pZCkgeyByZXR1cm4gTlVMTDsgfQogCi1pbnQgU1NMX0NPTVBfYWRkX2NvbXByZXNzaW9uX21ldGhvZChpbnQgaWQsIENPTVBfTUVUSE9EICpjbSkgeyByZXR1cm4gMTsgfQoraW50IFNTTF9DT01QX2FkZF9jb21wcmVzc2lvbl9tZXRob2QoaW50IGlkLCB2b2lkICpjbSkgeyByZXR1cm4gMTsgfQogCi1jb25zdCBjaGFyICpTU0xfQ09NUF9nZXRfbmFtZShjb25zdCBDT01QX01FVEhPRCAqY29tcCkgeyByZXR1cm4gTlVMTDsgfQorY29uc3QgY2hhciAqU1NMX0NPTVBfZ2V0X25hbWUoY29uc3Qgdm9pZCAqY29tcCkgeyByZXR1cm4gTlVMTDsgfQogCi1pbnQgc3NsX2NpcGhlcl9nZXRfa2V5X3R5cGUoY29uc3QgU1NMX0NJUEhFUiAqY2lwaGVyKSB7CitpbnQgc3NsX2NpcGhlcl9nZXRfY2VydF9pbmRleChjb25zdCBTU0xfQ0lQSEVSICpjaXBoZXIpIHsKICAgdWludDMyX3QgYWxnX2EgPSBjaXBoZXItPmFsZ29yaXRobV9hdXRoOwogCiAgIGlmIChhbGdfYSAmIFNTTF9hRUNEU0EpIHsKLSAgICByZXR1cm4gRVZQX1BLRVlfRUM7CisgICAgcmV0dXJuIFNTTF9QS0VZX0VDQzsKICAgfSBlbHNlIGlmIChhbGdfYSAmIFNTTF9hUlNBKSB7Ci0gICAgcmV0dXJuIEVWUF9QS0VZX1JTQTsKKyAgICByZXR1cm4gU1NMX1BLRVlfUlNBX0VOQzsKICAgfQogCi0gIHJldHVybiBFVlBfUEtFWV9OT05FOworICByZXR1cm4gLTE7CiB9CiAKIGludCBzc2xfY2lwaGVyX2hhc19zZXJ2ZXJfcHVibGljX2tleShjb25zdCBTU0xfQ0lQSEVSICpjaXBoZXIpIHsKLSAgLyogUFNLLWF1dGhlbnRpY2F0ZWQgY2lwaGVycyBkbyBub3QgdXNlIGEgY2VydGlmaWNhdGUuIChSU0FfUFNLIGlzIG5vdAotICAgKiBzdXBwb3J0ZWQuKSAqLwotICBpZiAoY2lwaGVyLT5hbGdvcml0aG1fYXV0aCAmIFNTTF9hUFNLKSB7CisgIC8qIFBTSy1hdXRoZW50aWNhdGVkIGNpcGhlcnMgZG8gbm90IHVzZSBhIHB1YmxpYyBrZXksIGV4Y2VwdCBmb3IKKyAgICogUlNBX1BTSy4gKi8KKyAgaWYgKChjaXBoZXItPmFsZ29yaXRobV9hdXRoICYgU1NMX2FQU0spICYmCisgICAgICAhKGNpcGhlci0+YWxnb3JpdGhtX21rZXkgJiBTU0xfa1JTQSkpIHsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xNzIxLDM0ICsxNzEzLDMgQEAKICAgLyogSXQgaXMgb3B0aW9uYWwgaW4gYWxsIG90aGVycy4gKi8KICAgcmV0dXJuIDA7CiB9Ci0KLXNpemVfdCBzc2xfY2lwaGVyX2dldF9yZWNvcmRfc3BsaXRfbGVuKGNvbnN0IFNTTF9DSVBIRVIgKmNpcGhlcikgewotICBzaXplX3QgYmxvY2tfc2l6ZTsKLSAgc3dpdGNoIChjaXBoZXItPmFsZ29yaXRobV9lbmMpIHsKLSAgICBjYXNlIFNTTF8zREVTOgotICAgICAgYmxvY2tfc2l6ZSA9IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNTTF9BRVMxMjg6Ci0gICAgY2FzZSBTU0xfQUVTMjU2OgotICAgICAgYmxvY2tfc2l6ZSA9IDE2OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICB9Ci0KLSAgc2l6ZV90IG1hY19sZW47Ci0gIHN3aXRjaCAoY2lwaGVyLT5hbGdvcml0aG1fbWFjKSB7Ci0gICAgY2FzZSBTU0xfTUQ1OgotICAgICAgbWFjX2xlbiA9IE1ENV9ESUdFU1RfTEVOR1RIOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTU0xfU0hBMToKLSAgICAgIG1hY19sZW4gPSBTSEFfRElHRVNUX0xFTkdUSDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgfQotCi0gIHNpemVfdCByZXQgPSAxICsgbWFjX2xlbjsKLSAgcmV0ICs9IGJsb2NrX3NpemUgLSAocmV0ICUgYmxvY2tfc2l6ZSk7Ci0gIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3NsL3NzbF9maWxlLmMgYi9zcmMvc3NsL3NzbF9maWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YWQ1YjcuLjAwMDAwMDAKLS0tIGEvc3JjL3NzbC9zc2xfZmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjIzICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KLSAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKLSAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgotICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcwotICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCi0gKgotICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KLSAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KLSAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KLSAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCi0gKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKLSAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQotICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKLSAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQotICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCi0gKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQotICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCi0gKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKLSAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKLSAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCi0gKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAotICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKLSAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKLSAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZwotICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQotICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCi0gKgotICovCi0KLSNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgotI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9zdGFjay5oPgotI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgotCi0jaW5jbHVkZSAiLi4vY3J5cHRvL2RpcmVjdG9yeS5oIgotI2luY2x1ZGUgImludGVybmFsLmgiCi0KLQotc3RhdGljIGludCB4bmFtZV9jbXAoY29uc3QgWDUwOV9OQU1FICoqYSwgY29uc3QgWDUwOV9OQU1FICoqYikgewotICByZXR1cm4gWDUwOV9OQU1FX2NtcCgqYSwgKmIpOwotfQotCi0vKiBUT0RPKGRhdmlkYmVuKTogSXMgdGhlcmUgYW55IHJlYXNvbiB0aGlzIGRvZXNuJ3QgY2FsbAotICogfFNTTF9hZGRfZmlsZV9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrfD8gKi8KLVNUQUNLX09GKFg1MDlfTkFNRSkgKlNTTF9sb2FkX2NsaWVudF9DQV9maWxlKGNvbnN0IGNoYXIgKmZpbGUpIHsKLSAgQklPICppbjsKLSAgWDUwOSAqeCA9IE5VTEw7Ci0gIFg1MDlfTkFNRSAqeG4gPSBOVUxMOwotICBTVEFDS19PRihYNTA5X05BTUUpICpyZXQgPSBOVUxMLCAqc2s7Ci0KLSAgc2sgPSBza19YNTA5X05BTUVfbmV3KHhuYW1lX2NtcCk7Ci0gIGluID0gQklPX25ldyhCSU9fc19maWxlKCkpOwotCi0gIGlmIChzayA9PSBOVUxMIHx8IGluID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKLSAgICBnb3RvIGVycjsKLSAgfQotCi0gIGlmICghQklPX3JlYWRfZmlsZW5hbWUoaW4sIGZpbGUpKSB7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICBmb3IgKDs7KSB7Ci0gICAgaWYgKFBFTV9yZWFkX2Jpb19YNTA5KGluLCAmeCwgTlVMTCwgTlVMTCkgPT0gTlVMTCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChyZXQgPT0gTlVMTCkgewotICAgICAgcmV0ID0gc2tfWDUwOV9OQU1FX25ld19udWxsKCk7Ci0gICAgICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7Ci0gICAgICAgIGdvdG8gZXJyOwotICAgICAgfQotICAgIH0KLSAgICB4biA9IFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4KTsKLSAgICBpZiAoeG4gPT0gTlVMTCkgewotICAgICAgZ290byBlcnI7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgZm9yIGR1cGxpY2F0ZXMgKi8KLSAgICB4biA9IFg1MDlfTkFNRV9kdXAoeG4pOwotICAgIGlmICh4biA9PSBOVUxMKSB7Ci0gICAgICBnb3RvIGVycjsKLSAgICB9Ci0gICAgaWYgKHNrX1g1MDlfTkFNRV9maW5kKHNrLCBOVUxMLCB4bikpIHsKLSAgICAgIFg1MDlfTkFNRV9mcmVlKHhuKTsKLSAgICB9IGVsc2UgewotICAgICAgc2tfWDUwOV9OQU1FX3B1c2goc2ssIHhuKTsKLSAgICAgIHNrX1g1MDlfTkFNRV9wdXNoKHJldCwgeG4pOwotICAgIH0KLSAgfQotCi0gIGlmICgwKSB7Ci0gIGVycjoKLSAgICBza19YNTA5X05BTUVfcG9wX2ZyZWUocmV0LCBYNTA5X05BTUVfZnJlZSk7Ci0gICAgcmV0ID0gTlVMTDsKLSAgfQotCi0gIHNrX1g1MDlfTkFNRV9mcmVlKHNrKTsKLSAgQklPX2ZyZWUoaW4pOwotICBYNTA5X2ZyZWUoeCk7Ci0gIGlmIChyZXQgIT0gTlVMTCkgewotICAgIEVSUl9jbGVhcl9lcnJvcigpOwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWludCBTU0xfYWRkX2ZpbGVfY2VydF9zdWJqZWN0c190b19zdGFjayhTVEFDS19PRihYNTA5X05BTUUpICpzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlKSB7Ci0gIEJJTyAqaW47Ci0gIFg1MDkgKnggPSBOVUxMOwotICBYNTA5X05BTUUgKnhuID0gTlVMTDsKLSAgaW50IHJldCA9IDE7Ci0gIGludCAoKm9sZGNtcCkoY29uc3QgWDUwOV9OQU1FICoqYSwgY29uc3QgWDUwOV9OQU1FICoqYik7Ci0KLSAgb2xkY21wID0gc2tfWDUwOV9OQU1FX3NldF9jbXBfZnVuYyhzdGFjaywgeG5hbWVfY21wKTsKLSAgaW4gPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7Ci0KLSAgaWYgKGluID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKLSAgICBnb3RvIGVycjsKLSAgfQotCi0gIGlmICghQklPX3JlYWRfZmlsZW5hbWUoaW4sIGZpbGUpKSB7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICBmb3IgKDs7KSB7Ci0gICAgaWYgKFBFTV9yZWFkX2Jpb19YNTA5KGluLCAmeCwgTlVMTCwgTlVMTCkgPT0gTlVMTCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHhuID0gWDUwOV9nZXRfc3ViamVjdF9uYW1lKHgpOwotICAgIGlmICh4biA9PSBOVUxMKSB7Ci0gICAgICBnb3RvIGVycjsKLSAgICB9Ci0gICAgeG4gPSBYNTA5X05BTUVfZHVwKHhuKTsKLSAgICBpZiAoeG4gPT0gTlVMTCkgewotICAgICAgZ290byBlcnI7Ci0gICAgfQotICAgIGlmIChza19YNTA5X05BTUVfZmluZChzdGFjaywgTlVMTCwgeG4pKSB7Ci0gICAgICBYNTA5X05BTUVfZnJlZSh4bik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNrX1g1MDlfTkFNRV9wdXNoKHN0YWNrLCB4bik7Ci0gICAgfQotICB9Ci0KLSAgRVJSX2NsZWFyX2Vycm9yKCk7Ci0KLSAgaWYgKDApIHsKLSAgZXJyOgotICAgIHJldCA9IDA7Ci0gIH0KLQotICBCSU9fZnJlZShpbik7Ci0gIFg1MDlfZnJlZSh4KTsKLQotICAodm9pZCkgc2tfWDUwOV9OQU1FX3NldF9jbXBfZnVuYyhzdGFjaywgb2xkY21wKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBBZGQgYSBkaXJlY3Rvcnkgb2YgY2VydHMgdG8gYSBzdGFjay4KLSAqCi0gKiBccGFyYW0gc3RhY2sgdGhlIHN0YWNrIHRvIGFwcGVuZCB0by4KLSAqIFxwYXJhbSBkaXIgdGhlIGRpcmVjdG9yeSB0byBhcHBlbmQgZnJvbS4gQWxsIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IHdpbGwgYmUKLSAqICAgICBleGFtaW5lZCBhcyBwb3RlbnRpYWwgY2VydHMuIEFueSB0aGF0IGFyZSBhY2NlcHRhYmxlIHRvCi0gKiAgICAgU1NMX2FkZF9kaXJfY2VydF9zdWJqZWN0c190b19zdGFjaygpIHRoYXQgYXJlIG5vdCBhbHJlYWR5IGluIHRoZSBzdGFjayB3aWxsCi0gKiAgICAgYmUgaW5jbHVkZWQuCi0gKiBccmV0dXJuIDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuIE5vdGUgdGhhdCBpbiB0aGUgY2FzZSBvZiBmYWlsdXJlIHNvbWUKLSAqICAgICBjZXJ0cyBtYXkgaGF2ZSBiZWVuIGFkZGVkIHRvIFxjIHN0YWNrLiAqLwotaW50IFNTTF9hZGRfZGlyX2NlcnRfc3ViamVjdHNfdG9fc3RhY2soU1RBQ0tfT0YoWDUwOV9OQU1FKSAqc3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkaXIpIHsKLSAgT1BFTlNTTF9ESVJfQ1RYICpkID0gTlVMTDsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGludCByZXQgPSAwOwotCi0gIC8qIE5vdGUgdGhhdCBhIHNpZGUgZWZmZWN0IGlzIHRoYXQgdGhlIENBcyB3aWxsIGJlIHNvcnRlZCBieSBuYW1lICovCi0gIHdoaWxlICgoZmlsZW5hbWUgPSBPUEVOU1NMX0RJUl9yZWFkKCZkLCBkaXIpKSkgewotICAgIGNoYXIgYnVmWzEwMjRdOwotICAgIGludCByOwotCi0gICAgaWYgKHN0cmxlbihkaXIpICsgc3RybGVuKGZpbGVuYW1lKSArIDIgPiBzaXplb2YoYnVmKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9QQVRIX1RPT19MT05HKTsKLSAgICAgIGdvdG8gZXJyOwotICAgIH0KLQotICAgIHIgPSBCSU9fc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiJXMvJXMiLCBkaXIsIGZpbGVuYW1lKTsKLSAgICBpZiAociA8PSAwIHx8IHIgPj0gKGludClzaXplb2YoYnVmKSB8fAotICAgICAgICAhU1NMX2FkZF9maWxlX2NlcnRfc3ViamVjdHNfdG9fc3RhY2soc3RhY2ssIGJ1ZikpIHsKLSAgICAgIGdvdG8gZXJyOwotICAgIH0KLSAgfQotCi0gIGlmIChlcnJubykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfU1lTX0xJQik7Ci0gICAgRVJSX2FkZF9lcnJvcl9kYXRhKDMsICJPUEVOU1NMX0RJUl9yZWFkKCZjdHgsICciLCBkaXIsICInKSIpOwotICAgIGdvdG8gZXJyOwotICB9Ci0KLSAgcmV0ID0gMTsKLQotZXJyOgotICBpZiAoZCkgewotICAgIE9QRU5TU0xfRElSX2VuZCgmZCk7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotaW50IFNTTF91c2VfY2VydGlmaWNhdGVfZmlsZShTU0wgKnNzbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpIHsKLSAgaW50IHJlYXNvbl9jb2RlOwotICBCSU8gKmluOwotICBpbnQgcmV0ID0gMDsKLSAgWDUwOSAqeCA9IE5VTEw7Ci0KLSAgaW4gPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7Ci0gIGlmIChpbiA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9CVUZfTElCKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotCi0gIGlmIChCSU9fcmVhZF9maWxlbmFtZShpbiwgZmlsZSkgPD0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfU1lTX0xJQik7Ci0gICAgZ290byBlbmQ7Ci0gIH0KLQotICBpZiAodHlwZSA9PSBTU0xfRklMRVRZUEVfQVNOMSkgewotICAgIHJlYXNvbl9jb2RlID0gRVJSX1JfQVNOMV9MSUI7Ci0gICAgeCA9IGQyaV9YNTA5X2JpbyhpbiwgTlVMTCk7Ci0gIH0gZWxzZSBpZiAodHlwZSA9PSBTU0xfRklMRVRZUEVfUEVNKSB7Ci0gICAgcmVhc29uX2NvZGUgPSBFUlJfUl9QRU1fTElCOwotICAgIHggPSBQRU1fcmVhZF9iaW9fWDUwOShpbiwgTlVMTCwgc3NsLT5jdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wtPmN0eC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2tfdXNlcmRhdGEpOwotICB9IGVsc2UgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfQkFEX1NTTF9GSUxFVFlQRSk7Ci0gICAgZ290byBlbmQ7Ci0gIH0KLQotICBpZiAoeCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCByZWFzb25fY29kZSk7Ci0gICAgZ290byBlbmQ7Ci0gIH0KLQotICByZXQgPSBTU0xfdXNlX2NlcnRpZmljYXRlKHNzbCwgeCk7Ci0KLWVuZDoKLSAgWDUwOV9mcmVlKHgpOwotICBCSU9fZnJlZShpbik7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotaW50IFNTTF91c2VfUlNBUHJpdmF0ZUtleV9maWxlKFNTTCAqc3NsLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgdHlwZSkgewotICBpbnQgcmVhc29uX2NvZGUsIHJldCA9IDA7Ci0gIEJJTyAqaW47Ci0gIFJTQSAqcnNhID0gTlVMTDsKLQotICBpbiA9IEJJT19uZXcoQklPX3NfZmlsZSgpKTsKLSAgaWYgKGluID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0JVRl9MSUIpOwotICAgIGdvdG8gZW5kOwotICB9Ci0KLSAgaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGluLCBmaWxlKSA8PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9TWVNfTElCKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotCi0gIGlmICh0eXBlID09IFNTTF9GSUxFVFlQRV9BU04xKSB7Ci0gICAgcmVhc29uX2NvZGUgPSBFUlJfUl9BU04xX0xJQjsKLSAgICByc2EgPSBkMmlfUlNBUHJpdmF0ZUtleV9iaW8oaW4sIE5VTEwpOwotICB9IGVsc2UgaWYgKHR5cGUgPT0gU1NMX0ZJTEVUWVBFX1BFTSkgewotICAgIHJlYXNvbl9jb2RlID0gRVJSX1JfUEVNX0xJQjsKLSAgICByc2EgPQotICAgICAgICBQRU1fcmVhZF9iaW9fUlNBUHJpdmF0ZUtleShpbiwgTlVMTCwgc3NsLT5jdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wtPmN0eC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2tfdXNlcmRhdGEpOwotICB9IGVsc2UgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfQkFEX1NTTF9GSUxFVFlQRSk7Ci0gICAgZ290byBlbmQ7Ci0gIH0KLQotICBpZiAocnNhID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHJlYXNvbl9jb2RlKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotICByZXQgPSBTU0xfdXNlX1JTQVByaXZhdGVLZXkoc3NsLCByc2EpOwotICBSU0FfZnJlZShyc2EpOwotCi1lbmQ6Ci0gIEJJT19mcmVlKGluKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotaW50IFNTTF91c2VfUHJpdmF0ZUtleV9maWxlKFNTTCAqc3NsLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgdHlwZSkgewotICBpbnQgcmVhc29uX2NvZGUsIHJldCA9IDA7Ci0gIEJJTyAqaW47Ci0gIEVWUF9QS0VZICpwa2V5ID0gTlVMTDsKLQotICBpbiA9IEJJT19uZXcoQklPX3NfZmlsZSgpKTsKLSAgaWYgKGluID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0JVRl9MSUIpOwotICAgIGdvdG8gZW5kOwotICB9Ci0KLSAgaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGluLCBmaWxlKSA8PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9TWVNfTElCKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotCi0gIGlmICh0eXBlID09IFNTTF9GSUxFVFlQRV9QRU0pIHsKLSAgICByZWFzb25fY29kZSA9IEVSUl9SX1BFTV9MSUI7Ci0gICAgcGtleSA9IFBFTV9yZWFkX2Jpb19Qcml2YXRlS2V5KGluLCBOVUxMLCBzc2wtPmN0eC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbC0+Y3R4LT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFja191c2VyZGF0YSk7Ci0gIH0gZWxzZSBpZiAodHlwZSA9PSBTU0xfRklMRVRZUEVfQVNOMSkgewotICAgIHJlYXNvbl9jb2RlID0gRVJSX1JfQVNOMV9MSUI7Ci0gICAgcGtleSA9IGQyaV9Qcml2YXRlS2V5X2JpbyhpbiwgTlVMTCk7Ci0gIH0gZWxzZSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CQURfU1NMX0ZJTEVUWVBFKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotCi0gIGlmIChwa2V5ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHJlYXNvbl9jb2RlKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotICByZXQgPSBTU0xfdXNlX1ByaXZhdGVLZXkoc3NsLCBwa2V5KTsKLSAgRVZQX1BLRVlfZnJlZShwa2V5KTsKLQotZW5kOgotICBCSU9fZnJlZShpbik7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWludCBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9maWxlKFNTTF9DVFggKmN0eCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpIHsKLSAgaW50IHJlYXNvbl9jb2RlOwotICBCSU8gKmluOwotICBpbnQgcmV0ID0gMDsKLSAgWDUwOSAqeCA9IE5VTEw7Ci0KLSAgaW4gPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7Ci0gIGlmIChpbiA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9CVUZfTElCKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotCi0gIGlmIChCSU9fcmVhZF9maWxlbmFtZShpbiwgZmlsZSkgPD0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfU1lTX0xJQik7Ci0gICAgZ290byBlbmQ7Ci0gIH0KLQotICBpZiAodHlwZSA9PSBTU0xfRklMRVRZUEVfQVNOMSkgewotICAgIHJlYXNvbl9jb2RlID0gRVJSX1JfQVNOMV9MSUI7Ci0gICAgeCA9IGQyaV9YNTA5X2JpbyhpbiwgTlVMTCk7Ci0gIH0gZWxzZSBpZiAodHlwZSA9PSBTU0xfRklMRVRZUEVfUEVNKSB7Ci0gICAgcmVhc29uX2NvZGUgPSBFUlJfUl9QRU1fTElCOwotICAgIHggPSBQRU1fcmVhZF9iaW9fWDUwOShpbiwgTlVMTCwgY3R4LT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFja191c2VyZGF0YSk7Ci0gIH0gZWxzZSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CQURfU1NMX0ZJTEVUWVBFKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotCi0gIGlmICh4ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHJlYXNvbl9jb2RlKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotCi0gIHJldCA9IFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlKGN0eCwgeCk7Ci0KLWVuZDoKLSAgWDUwOV9mcmVlKHgpOwotICBCSU9fZnJlZShpbik7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWludCBTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5X2ZpbGUoU1NMX0NUWCAqY3R4LCBjb25zdCBjaGFyICpmaWxlLCBpbnQgdHlwZSkgewotICBpbnQgcmVhc29uX2NvZGUsIHJldCA9IDA7Ci0gIEJJTyAqaW47Ci0gIFJTQSAqcnNhID0gTlVMTDsKLQotICBpbiA9IEJJT19uZXcoQklPX3NfZmlsZSgpKTsKLSAgaWYgKGluID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0JVRl9MSUIpOwotICAgIGdvdG8gZW5kOwotICB9Ci0KLSAgaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGluLCBmaWxlKSA8PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9TWVNfTElCKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotCi0gIGlmICh0eXBlID09IFNTTF9GSUxFVFlQRV9BU04xKSB7Ci0gICAgcmVhc29uX2NvZGUgPSBFUlJfUl9BU04xX0xJQjsKLSAgICByc2EgPSBkMmlfUlNBUHJpdmF0ZUtleV9iaW8oaW4sIE5VTEwpOwotICB9IGVsc2UgaWYgKHR5cGUgPT0gU1NMX0ZJTEVUWVBFX1BFTSkgewotICAgIHJlYXNvbl9jb2RlID0gRVJSX1JfUEVNX0xJQjsKLSAgICByc2EgPSBQRU1fcmVhZF9iaW9fUlNBUHJpdmF0ZUtleShpbiwgTlVMTCwgY3R4LT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrX3VzZXJkYXRhKTsKLSAgfSBlbHNlIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0JBRF9TU0xfRklMRVRZUEUpOwotICAgIGdvdG8gZW5kOwotICB9Ci0KLSAgaWYgKHJzYSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCByZWFzb25fY29kZSk7Ci0gICAgZ290byBlbmQ7Ci0gIH0KLSAgcmV0ID0gU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleShjdHgsIHJzYSk7Ci0gIFJTQV9mcmVlKHJzYSk7Ci0KLWVuZDoKLSAgQklPX2ZyZWUoaW4pOwotICByZXR1cm4gcmV0OwotfQotCi1pbnQgU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKFNTTF9DVFggKmN0eCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpIHsKLSAgaW50IHJlYXNvbl9jb2RlLCByZXQgPSAwOwotICBCSU8gKmluOwotICBFVlBfUEtFWSAqcGtleSA9IE5VTEw7Ci0KLSAgaW4gPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7Ci0gIGlmIChpbiA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9CVUZfTElCKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotCi0gIGlmIChCSU9fcmVhZF9maWxlbmFtZShpbiwgZmlsZSkgPD0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfU1lTX0xJQik7Ci0gICAgZ290byBlbmQ7Ci0gIH0KLQotICBpZiAodHlwZSA9PSBTU0xfRklMRVRZUEVfUEVNKSB7Ci0gICAgcmVhc29uX2NvZGUgPSBFUlJfUl9QRU1fTElCOwotICAgIHBrZXkgPSBQRU1fcmVhZF9iaW9fUHJpdmF0ZUtleShpbiwgTlVMTCwgY3R4LT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFja191c2VyZGF0YSk7Ci0gIH0gZWxzZSBpZiAodHlwZSA9PSBTU0xfRklMRVRZUEVfQVNOMSkgewotICAgIHJlYXNvbl9jb2RlID0gRVJSX1JfQVNOMV9MSUI7Ci0gICAgcGtleSA9IGQyaV9Qcml2YXRlS2V5X2JpbyhpbiwgTlVMTCk7Ci0gIH0gZWxzZSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CQURfU1NMX0ZJTEVUWVBFKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotCi0gIGlmIChwa2V5ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHJlYXNvbl9jb2RlKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotICByZXQgPSBTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5KGN0eCwgcGtleSk7Ci0gIEVWUF9QS0VZX2ZyZWUocGtleSk7Ci0KLWVuZDoKLSAgQklPX2ZyZWUoaW4pOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBSZWFkIGEgZmlsZSB0aGF0IGNvbnRhaW5zIG91ciBjZXJ0aWZpY2F0ZSBpbiAiUEVNIiBmb3JtYXQsIHBvc3NpYmx5IGZvbGxvd2VkCi0gKiBieSBhIHNlcXVlbmNlIG9mIENBIGNlcnRpZmljYXRlcyB0aGF0IHNob3VsZCBiZSBzZW50IHRvIHRoZSBwZWVyIGluIHRoZQotICogQ2VydGlmaWNhdGUgbWVzc2FnZS4gKi8KLWludCBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKFNTTF9DVFggKmN0eCwgY29uc3QgY2hhciAqZmlsZSkgewotICBCSU8gKmluOwotICBpbnQgcmV0ID0gMDsKLSAgWDUwOSAqeCA9IE5VTEw7Ci0KLSAgRVJSX2NsZWFyX2Vycm9yKCk7IC8qIGNsZWFyIGVycm9yIHN0YWNrIGZvciBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZSgpICovCi0KLSAgaW4gPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7Ci0gIGlmIChpbiA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9CVUZfTElCKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotCi0gIGlmIChCSU9fcmVhZF9maWxlbmFtZShpbiwgZmlsZSkgPD0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfU1lTX0xJQik7Ci0gICAgZ290byBlbmQ7Ci0gIH0KLQotICB4ID0gUEVNX3JlYWRfYmlvX1g1MDlfQVVYKGluLCBOVUxMLCBjdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2tfdXNlcmRhdGEpOwotICBpZiAoeCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9QRU1fTElCKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotCi0gIHJldCA9IFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlKGN0eCwgeCk7Ci0KLSAgaWYgKEVSUl9wZWVrX2Vycm9yKCkgIT0gMCkgewotICAgIHJldCA9IDA7IC8qIEtleS9jZXJ0aWZpY2F0ZSBtaXNtYXRjaCBkb2Vzbid0IGltcGx5IHJldD09MCAuLi4gKi8KLSAgfQotCi0gIGlmIChyZXQpIHsKLSAgICAvKiBJZiB3ZSBjb3VsZCBzZXQgdXAgb3VyIGNlcnRpZmljYXRlLCBub3cgcHJvY2VlZCB0byB0aGUgQ0EKLSAgICAgKiBjZXJ0aWZpY2F0ZXMuICovCi0gICAgWDUwOSAqY2E7Ci0gICAgaW50IHI7Ci0gICAgdWludDMyX3QgZXJyOwotCi0gICAgU1NMX0NUWF9jbGVhcl9jaGFpbl9jZXJ0cyhjdHgpOwotCi0gICAgd2hpbGUgKChjYSA9IFBFTV9yZWFkX2Jpb19YNTA5KGluLCBOVUxMLCBjdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrX3VzZXJkYXRhKSkgIT0KLSAgICAgICAgICAgTlVMTCkgewotICAgICAgciA9IFNTTF9DVFhfYWRkMF9jaGFpbl9jZXJ0KGN0eCwgY2EpOwotICAgICAgaWYgKCFyKSB7Ci0gICAgICAgIFg1MDlfZnJlZShjYSk7Ci0gICAgICAgIHJldCA9IDA7Ci0gICAgICAgIGdvdG8gZW5kOwotICAgICAgfQotICAgICAgLyogTm90ZSB0aGF0IHdlIG11c3Qgbm90IGZyZWUgciBpZiBpdCB3YXMgc3VjY2Vzc2Z1bGx5IGFkZGVkIHRvIHRoZSBjaGFpbgotICAgICAgICogKHdoaWxlIHdlIG11c3QgZnJlZSB0aGUgbWFpbiBjZXJ0aWZpY2F0ZSwgc2luY2UgaXRzIHJlZmVyZW5jZSBjb3VudCBpcwotICAgICAgICogaW5jcmVhc2VkIGJ5IFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlKS4gKi8KLSAgICB9Ci0KLSAgICAvKiBXaGVuIHRoZSB3aGlsZSBsb29wIGVuZHMsIGl0J3MgdXN1YWxseSBqdXN0IEVPRi4gKi8KLSAgICBlcnIgPSBFUlJfcGVla19sYXN0X2Vycm9yKCk7Ci0gICAgaWYgKEVSUl9HRVRfTElCKGVycikgPT0gRVJSX0xJQl9QRU0gJiYKLSAgICAgICAgRVJSX0dFVF9SRUFTT04oZXJyKSA9PSBQRU1fUl9OT19TVEFSVF9MSU5FKSB7Ci0gICAgICBFUlJfY2xlYXJfZXJyb3IoKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0ID0gMDsgLyogc29tZSByZWFsIGVycm9yICovCi0gICAgfQotICB9Ci0KLWVuZDoKLSAgWDUwOV9mcmVlKHgpOwotICBCSU9fZnJlZShpbik7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2IoU1NMX0NUWCAqY3R4LCBwZW1fcGFzc3dvcmRfY2IgKmNiKSB7Ci0gIGN0eC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2sgPSBjYjsKLX0KLQotdm9pZCBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YShTU0xfQ1RYICpjdHgsIHZvaWQgKmRhdGEpIHsKLSAgY3R4LT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFja191c2VyZGF0YSA9IGRhdGE7Ci19Ci0KLUlNUExFTUVOVF9QRU1fcncoU1NMX1NFU1NJT04sIFNTTF9TRVNTSU9OLCBQRU1fU1RSSU5HX1NTTF9TRVNTSU9OLCBTU0xfU0VTU0lPTikKZGlmZiAtLWdpdCBhL3NyYy9zc2wvc3NsX2xpYi5jIGIvc3JjL3NzbC9zc2xfbGliLmMKaW5kZXggNzRiZDYzMy4uZTk1MjI2ZiAxMDA2NDQKLS0tIGEvc3JjL3NzbC9zc2xfbGliLmMKKysrIGIvc3JjL3NzbC9zc2xfbGliLmMKQEAgLTEzOCwxNCArMTM4LDExIEBACiAgKiBPVEhFUiBFTlRJVFkgQkFTRUQgT04gSU5GUklOR0VNRU5UIE9GIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMgT1IKICAqIE9USEVSV0lTRS4gKi8KIAotI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+Ci0KICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSA8b3BlbnNzbC9ieXRlc3RyaW5nLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KICNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2xoYXNoLmg+CkBAIC0xNTgsMTAgKzE1NSw2IEBACiAjaW5jbHVkZSAiLi4vY3J5cHRvL2ludGVybmFsLmgiCiAKIAotLyogfFNTTF9SX1VOS05PV05fUFJPVE9DT0x8IGlzIG5vIGxvbmdlciBlbWl0dGVkLCBidXQgY29udGludWUgdG8gZGVmaW5lIGl0Ci0gKiB0byBhdm9pZCBkb3duc3RyZWFtIGNodXJuLiAqLwotT1BFTlNTTF9ERUNMQVJFX0VSUk9SX1JFQVNPTihTU0wsIFVOS05PV05fUFJPVE9DT0wpCi0KIC8qIFNvbWUgZXJyb3IgY29kZXMgYXJlIHNwZWNpYWwuIEVuc3VyZSB0aGUgbWFrZV9lcnJvcnMuZ28gc2NyaXB0IG5ldmVyCiAgKiByZWdyZXNzZXMgdGhpcy4gKi8KIE9QRU5TU0xfQ09NUElMRV9BU1NFUlQoU1NMX1JfVExTVjFfQUxFUlRfTk9fUkVORUdPVElBVElPTiA9PQpAQCAtMTcxLDE5MiArMTY0LDkxIEBACiAvKiBrTWF4SGFuZHNoYWtlU2l6ZSBpcyB0aGUgbWF4aW11bSBzaXplLCBpbiBieXRlcywgb2YgYSBoYW5kc2hha2UgbWVzc2FnZS4gKi8KIHN0YXRpYyBjb25zdCBzaXplX3Qga01heEhhbmRzaGFrZVNpemUgPSAoMXUgPDwgMjQpIC0gMTsKIAotc3RhdGljIENSWVBUT19FWF9EQVRBX0NMQVNTIGdfZXhfZGF0YV9jbGFzc19zc2wgPQotICAgIENSWVBUT19FWF9EQVRBX0NMQVNTX0lOSVRfV0lUSF9BUFBfREFUQTsKLXN0YXRpYyBDUllQVE9fRVhfREFUQV9DTEFTUyBnX2V4X2RhdGFfY2xhc3Nfc3NsX2N0eCA9Ci0gICAgQ1JZUFRPX0VYX0RBVEFfQ0xBU1NfSU5JVF9XSVRIX0FQUF9EQVRBOworc3RhdGljIENSWVBUT19FWF9EQVRBX0NMQVNTIGdfZXhfZGF0YV9jbGFzc19zc2wgPSBDUllQVE9fRVhfREFUQV9DTEFTU19JTklUOworc3RhdGljIENSWVBUT19FWF9EQVRBX0NMQVNTIGdfZXhfZGF0YV9jbGFzc19zc2xfY3R4ID0gQ1JZUFRPX0VYX0RBVEFfQ0xBU1NfSU5JVDsKIAotaW50IFNTTF9saWJyYXJ5X2luaXQodm9pZCkgewotICBDUllQVE9fbGlicmFyeV9pbml0KCk7CitpbnQgU1NMX2NsZWFyKFNTTCAqc3NsKSB7CisgIGlmIChzc2wtPm1ldGhvZCA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfY2xlYXIsIFNTTF9SX05PX01FVEhPRF9TUEVDSUZJRUQpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKHNzbF9jbGVhcl9iYWRfc2Vzc2lvbihzc2wpKSB7CisgICAgU1NMX1NFU1NJT05fZnJlZShzc2wtPnNlc3Npb24pOworICAgIHNzbC0+c2Vzc2lvbiA9IE5VTEw7CisgIH0KKworICBzc2wtPmhpdCA9IDA7CisgIHNzbC0+c2h1dGRvd24gPSAwOworCisgIC8qIFNTTF9jbGVhciBtYXkgYmUgY2FsbGVkIGJlZm9yZSBvciBhZnRlciB0aGUgfHNzbHwgaXMgaW5pdGlhbGl6ZWQgaW4gZWl0aGVyCisgICAqIGFjY2VwdCBvciBjb25uZWN0IHN0YXRlLiBJbiB0aGUgbGF0dGVyIGNhc2UsIFNTTF9jbGVhciBzaG91bGQgcHJlc2VydmUgdGhlCisgICAqIGhhbGYgYW5kIHJlc2V0IHxzc2wtPnN0YXRlfCBhY2NvcmRpbmdseS4gKi8KKyAgaWYgKHNzbC0+aGFuZHNoYWtlX2Z1bmMgIT0gTlVMTCkgeworICAgIGlmIChzc2wtPnNlcnZlcikgeworICAgICAgU1NMX3NldF9hY2NlcHRfc3RhdGUoc3NsKTsKKyAgICB9IGVsc2UgeworICAgICAgU1NMX3NldF9jb25uZWN0X3N0YXRlKHNzbCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGFzc2VydChzc2wtPnN0YXRlID09IDApOworICB9CisKKyAgLyogVE9ETyhkYXZpZGJlbik6IFNvbWUgc3RhdGUgb24gfHNzbHwgaXMgcmVzZXQgYm90aCBpbiB8U1NMX25ld3wgYW5kCisgICAqIHxTU0xfY2xlYXJ8IGJlY2F1c2UgaXQgaXMgcGVyLWNvbm5lY3Rpb24gc3RhdGUgcmF0aGVyIHRoYW4gY29uZmlndXJhdGlvbgorICAgKiBzdGF0ZS4gUGVyLWNvbm5lY3Rpb24gc3RhdGUgc2hvdWxkIGJlIG9uIHxzc2wtPnMzfCBhbmQgfHNzbC0+ZDF8IHNvIGl0IGlzCisgICAqIG5hdHVyYWxseSByZXNldCBhdCB0aGUgcmlnaHQgcG9pbnRzIGJldHdlZW4gfFNTTF9uZXd8LCB8U1NMX2NsZWFyfCwgYW5kCisgICAqIHxzc2wzX25ld3wuICovCisKKyAgc3NsLT5yd3N0YXRlID0gU1NMX05PVEhJTkc7CisgIHNzbC0+cnN0YXRlID0gU1NMX1NUX1JFQURfSEVBREVSOworCisgIEJVRl9NRU1fZnJlZShzc2wtPmluaXRfYnVmKTsKKyAgc3NsLT5pbml0X2J1ZiA9IE5VTEw7CisKKyAgc3NsLT5wYWNrZXQgPSBOVUxMOworICBzc2wtPnBhY2tldF9sZW5ndGggPSAwOworCisgIHNzbF9jbGVhcl9jaXBoZXJfY3R4KHNzbCk7CisKKyAgT1BFTlNTTF9mcmVlKHNzbC0+bmV4dF9wcm90b19uZWdvdGlhdGVkKTsKKyAgc3NsLT5uZXh0X3Byb3RvX25lZ290aWF0ZWQgPSBOVUxMOworICBzc2wtPm5leHRfcHJvdG9fbmVnb3RpYXRlZF9sZW4gPSAwOworCisgIC8qIFRoZSBzc2wtPmQxLT5tdHUgaXMgc2ltdWx0YW5lb3VzbHkgY29uZmlndXJhdGlvbiAocHJlc2VydmVkIGFjcm9zcworICAgKiBjbGVhcikgYW5kIGNvbm5lY3Rpb24tc3BlY2lmaWMgc3RhdGUgKGdldHMgcmVzZXQpLgorICAgKgorICAgKiBUT0RPKGRhdmlkYmVuKTogQXZvaWQgdGhpcy4gKi8KKyAgdW5zaWduZWQgbXR1ID0gMDsKKyAgaWYgKHNzbC0+ZDEgIT0gTlVMTCkgeworICAgIG10dSA9IHNzbC0+ZDEtPm10dTsKKyAgfQorCisgIHNzbC0+bWV0aG9kLT5zc2xfZnJlZShzc2wpOworICBpZiAoIXNzbC0+bWV0aG9kLT5zc2xfbmV3KHNzbCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzc2wtPmVuY19tZXRob2QgPSBzc2wzX2dldF9lbmNfbWV0aG9kKHNzbC0+dmVyc2lvbik7CisgIGFzc2VydChzc2wtPmVuY19tZXRob2QgIT0gTlVMTCk7CisKKyAgaWYgKFNTTF9JU19EVExTKHNzbCkgJiYgKFNTTF9nZXRfb3B0aW9ucyhzc2wpICYgU1NMX09QX05PX1FVRVJZX01UVSkpIHsKKyAgICBzc2wtPmQxLT5tdHUgPSBtdHU7CisgIH0KKworICBzc2wtPmNsaWVudF92ZXJzaW9uID0gc3NsLT52ZXJzaW9uOworCiAgIHJldHVybiAxOwogfQogCi1zdGF0aWMgdWludDMyX3Qgc3NsX3Nlc3Npb25faGFzaChjb25zdCBTU0xfU0VTU0lPTiAqYSkgewotICB1aW50MzJfdCBoYXNoID0KLSAgICAgICgodWludDMyX3QpYS0+c2Vzc2lvbl9pZFswXSkgfHwKLSAgICAgICgodWludDMyX3QpYS0+c2Vzc2lvbl9pZFsxXSA8PCA4KSB8fAotICAgICAgKCh1aW50MzJfdClhLT5zZXNzaW9uX2lkWzJdIDw8IDE2KSB8fAotICAgICAgKCh1aW50MzJfdClhLT5zZXNzaW9uX2lkWzNdIDw8IDI0KTsKLQotICByZXR1cm4gaGFzaDsKLX0KLQotLyogTkI6IElmIHRoaXMgZnVuY3Rpb24gKG9yIGluZGVlZCB0aGUgaGFzaCBmdW5jdGlvbiB3aGljaCB1c2VzIGEgc29ydCBvZgotICogY29hcnNlciBmdW5jdGlvbiB0aGFuIHRoaXMgb25lKSBpcyBjaGFuZ2VkLCBlbnN1cmUKLSAqIFNTTF9DVFhfaGFzX21hdGNoaW5nX3Nlc3Npb25faWQoKSBpcyBjaGVja2VkIGFjY29yZGluZ2x5LiBJdCByZWxpZXMgb24gYmVpbmcKLSAqIGFibGUgdG8gY29uc3RydWN0IGFuIFNTTF9TRVNTSU9OIHRoYXQgd2lsbCBjb2xsaWRlIHdpdGggYW55IGV4aXN0aW5nIHNlc3Npb24KLSAqIHdpdGggYSBtYXRjaGluZyBzZXNzaW9uIElELiAqLwotc3RhdGljIGludCBzc2xfc2Vzc2lvbl9jbXAoY29uc3QgU1NMX1NFU1NJT04gKmEsIGNvbnN0IFNTTF9TRVNTSU9OICpiKSB7Ci0gIGlmIChhLT5zc2xfdmVyc2lvbiAhPSBiLT5zc2xfdmVyc2lvbikgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgaWYgKGEtPnNlc3Npb25faWRfbGVuZ3RoICE9IGItPnNlc3Npb25faWRfbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICByZXR1cm4gbWVtY21wKGEtPnNlc3Npb25faWQsIGItPnNlc3Npb25faWQsIGEtPnNlc3Npb25faWRfbGVuZ3RoKTsKLX0KLQotU1NMX0NUWCAqU1NMX0NUWF9uZXcoY29uc3QgU1NMX01FVEhPRCAqbWV0aG9kKSB7Ci0gIFNTTF9DVFggKnJldCA9IE5VTEw7Ci0KLSAgaWYgKG1ldGhvZCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9OVUxMX1NTTF9NRVRIT0RfUEFTU0VEKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmIChTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9DVFhfaWR4KCkgPCAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9YNTA5X1ZFUklGSUNBVElPTl9TRVRVUF9QUk9CTEVNUyk7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICByZXQgPSAoU1NMX0NUWCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihTU0xfQ1RYKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkgewotICAgIGdvdG8gZXJyOwotICB9Ci0KLSAgbWVtc2V0KHJldCwgMCwgc2l6ZW9mKFNTTF9DVFgpKTsKLQotICByZXQtPm1ldGhvZCA9IG1ldGhvZC0+bWV0aG9kOwotCi0gIENSWVBUT19NVVRFWF9pbml0KCZyZXQtPmxvY2spOwotCi0gIHJldC0+c2Vzc2lvbl9jYWNoZV9tb2RlID0gU1NMX1NFU1NfQ0FDSEVfU0VSVkVSOwotICByZXQtPnNlc3Npb25fY2FjaGVfc2l6ZSA9IFNTTF9TRVNTSU9OX0NBQ0hFX01BWF9TSVpFX0RFRkFVTFQ7Ci0KLSAgLyogV2UgdGFrZSB0aGUgc3lzdGVtIGRlZmF1bHQgKi8KLSAgcmV0LT5zZXNzaW9uX3RpbWVvdXQgPSBTU0xfREVGQVVMVF9TRVNTSU9OX1RJTUVPVVQ7Ci0KLSAgcmV0LT5yZWZlcmVuY2VzID0gMTsKLQotICByZXQtPm1heF9jZXJ0X2xpc3QgPSBTU0xfTUFYX0NFUlRfTElTVF9ERUZBVUxUOwotICByZXQtPnZlcmlmeV9tb2RlID0gU1NMX1ZFUklGWV9OT05FOwotICByZXQtPmNlcnQgPSBzc2xfY2VydF9uZXcoKTsKLSAgaWYgKHJldC0+Y2VydCA9PSBOVUxMKSB7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICByZXQtPnNlc3Npb25zID0gbGhfU1NMX1NFU1NJT05fbmV3KHNzbF9zZXNzaW9uX2hhc2gsIHNzbF9zZXNzaW9uX2NtcCk7Ci0gIGlmIChyZXQtPnNlc3Npb25zID09IE5VTEwpIHsKLSAgICBnb3RvIGVycjsKLSAgfQotICByZXQtPmNlcnRfc3RvcmUgPSBYNTA5X1NUT1JFX25ldygpOwotICBpZiAocmV0LT5jZXJ0X3N0b3JlID09IE5VTEwpIHsKLSAgICBnb3RvIGVycjsKLSAgfQotCi0gIHNzbF9jcmVhdGVfY2lwaGVyX2xpc3QocmV0LT5tZXRob2QsICZyZXQtPmNpcGhlcl9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICZyZXQtPmNpcGhlcl9saXN0X2J5X2lkLCBTU0xfREVGQVVMVF9DSVBIRVJfTElTVCk7Ci0gIGlmIChyZXQtPmNpcGhlcl9saXN0ID09IE5VTEwgfHwKLSAgICAgIHNrX1NTTF9DSVBIRVJfbnVtKHJldC0+Y2lwaGVyX2xpc3QtPmNpcGhlcnMpIDw9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0xJQlJBUllfSEFTX05PX0NJUEhFUlMpOwotICAgIGdvdG8gZXJyMjsKLSAgfQotCi0gIHJldC0+cGFyYW0gPSBYNTA5X1ZFUklGWV9QQVJBTV9uZXcoKTsKLSAgaWYgKCFyZXQtPnBhcmFtKSB7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICByZXQtPmNsaWVudF9DQSA9IHNrX1g1MDlfTkFNRV9uZXdfbnVsbCgpOwotICBpZiAocmV0LT5jbGllbnRfQ0EgPT0gTlVMTCkgewotICAgIGdvdG8gZXJyOwotICB9Ci0KLSAgQ1JZUFRPX25ld19leF9kYXRhKCZnX2V4X2RhdGFfY2xhc3Nfc3NsX2N0eCwgcmV0LCAmcmV0LT5leF9kYXRhKTsKLQotICByZXQtPm1heF9zZW5kX2ZyYWdtZW50ID0gU1NMM19SVF9NQVhfUExBSU5fTEVOR1RIOwotCi0gIC8qIFNldHVwIFJGQzQ1MDcgdGlja2V0IGtleXMgKi8KLSAgaWYgKCFSQU5EX2J5dGVzKHJldC0+dGxzZXh0X3RpY2tfa2V5X25hbWUsIDE2KSB8fAotICAgICAgIVJBTkRfYnl0ZXMocmV0LT50bHNleHRfdGlja19obWFjX2tleSwgMTYpIHx8Ci0gICAgICAhUkFORF9ieXRlcyhyZXQtPnRsc2V4dF90aWNrX2Flc19rZXksIDE2KSkgewotICAgIHJldC0+b3B0aW9ucyB8PSBTU0xfT1BfTk9fVElDS0VUOwotICB9Ci0KLSAgLyogRGVmYXVsdCBpcyB0byBjb25uZWN0IHRvIG5vbi1SSSBzZXJ2ZXJzLiBXaGVuIFJJIGlzIG1vcmUgd2lkZWx5IGRlcGxveWVkCi0gICAqIG1pZ2h0IGNoYW5nZSB0aGlzLiAqLwotICByZXQtPm9wdGlvbnMgfD0gU1NMX09QX0xFR0FDWV9TRVJWRVJfQ09OTkVDVDsKLQotICAvKiBMb2NrIHRoZSBTU0xfQ1RYIHRvIHRoZSBzcGVjaWZpZWQgdmVyc2lvbiwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kKLSAgICogdXNlcyBvZiBTU0xfTUVUSE9ELiAqLwotICBpZiAobWV0aG9kLT52ZXJzaW9uICE9IDApIHsKLSAgICBTU0xfQ1RYX3NldF9tYXhfdmVyc2lvbihyZXQsIG1ldGhvZC0+dmVyc2lvbik7Ci0gICAgU1NMX0NUWF9zZXRfbWluX3ZlcnNpb24ocmV0LCBtZXRob2QtPnZlcnNpb24pOwotICB9Ci0KLSAgcmV0dXJuIHJldDsKLQotZXJyOgotICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKLWVycjI6Ci0gIFNTTF9DVFhfZnJlZShyZXQpOwotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBTU0xfQ1RYX2ZyZWUoU1NMX0NUWCAqY3R4KSB7Ci0gIGlmIChjdHggPT0gTlVMTCB8fAotICAgICAgIUNSWVBUT19yZWZjb3VudF9kZWNfYW5kX3Rlc3RfemVybygmY3R4LT5yZWZlcmVuY2VzKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIFg1MDlfVkVSSUZZX1BBUkFNX2ZyZWUoY3R4LT5wYXJhbSk7Ci0KLSAgLyogRnJlZSBpbnRlcm5hbCBzZXNzaW9uIGNhY2hlLiBIb3dldmVyOiB0aGUgcmVtb3ZlX2NiKCkgbWF5IHJlZmVyZW5jZSB0aGUKLSAgICogZXhfZGF0YSBvZiBTU0xfQ1RYLCB0aHVzIHRoZSBleF9kYXRhIHN0b3JlIGNhbiBvbmx5IGJlIHJlbW92ZWQgYWZ0ZXIgdGhlCi0gICAqIHNlc3Npb25zIHdlcmUgZmx1c2hlZC4gQXMgdGhlIGV4X2RhdGEgaGFuZGxpbmcgcm91dGluZXMgbWlnaHQgYWxzbyB0b3VjaAotICAgKiB0aGUgc2Vzc2lvbiBjYWNoZSwgdGhlIG1vc3Qgc2VjdXJlIHNvbHV0aW9uIHNlZW1zIHRvIGJlOiBlbXB0eSAoZmx1c2gpIHRoZQotICAgKiBjYWNoZSwgdGhlbiBmcmVlIGV4X2RhdGEsIHRoZW4gZmluYWxseSBmcmVlIHRoZSBjYWNoZS4gKFNlZSB0aWNrZXQKLSAgICogW29wZW5zc2wub3JnICMyMTJdLikgKi8KLSAgU1NMX0NUWF9mbHVzaF9zZXNzaW9ucyhjdHgsIDApOwotCi0gIENSWVBUT19mcmVlX2V4X2RhdGEoJmdfZXhfZGF0YV9jbGFzc19zc2xfY3R4LCBjdHgsICZjdHgtPmV4X2RhdGEpOwotCi0gIENSWVBUT19NVVRFWF9jbGVhbnVwKCZjdHgtPmxvY2spOwotICBsaF9TU0xfU0VTU0lPTl9mcmVlKGN0eC0+c2Vzc2lvbnMpOwotICBYNTA5X1NUT1JFX2ZyZWUoY3R4LT5jZXJ0X3N0b3JlKTsKLSAgc3NsX2NpcGhlcl9wcmVmZXJlbmNlX2xpc3RfZnJlZShjdHgtPmNpcGhlcl9saXN0KTsKLSAgc2tfU1NMX0NJUEhFUl9mcmVlKGN0eC0+Y2lwaGVyX2xpc3RfYnlfaWQpOwotICBzc2xfY2lwaGVyX3ByZWZlcmVuY2VfbGlzdF9mcmVlKGN0eC0+Y2lwaGVyX2xpc3RfdGxzMTApOwotICBzc2xfY2lwaGVyX3ByZWZlcmVuY2VfbGlzdF9mcmVlKGN0eC0+Y2lwaGVyX2xpc3RfdGxzMTEpOwotICBzc2xfY2VydF9mcmVlKGN0eC0+Y2VydCk7Ci0gIHNrX1NTTF9DVVNUT01fRVhURU5TSU9OX3BvcF9mcmVlKGN0eC0+Y2xpZW50X2N1c3RvbV9leHRlbnNpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ1VTVE9NX0VYVEVOU0lPTl9mcmVlKTsKLSAgc2tfU1NMX0NVU1RPTV9FWFRFTlNJT05fcG9wX2ZyZWUoY3R4LT5zZXJ2ZXJfY3VzdG9tX2V4dGVuc2lvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9DVVNUT01fRVhURU5TSU9OX2ZyZWUpOwotICBza19YNTA5X05BTUVfcG9wX2ZyZWUoY3R4LT5jbGllbnRfQ0EsIFg1MDlfTkFNRV9mcmVlKTsKLSAgc2tfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfZnJlZShjdHgtPnNydHBfcHJvZmlsZXMpOwotICBPUEVOU1NMX2ZyZWUoY3R4LT5wc2tfaWRlbnRpdHlfaGludCk7Ci0gIE9QRU5TU0xfZnJlZShjdHgtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCk7Ci0gIE9QRU5TU0xfZnJlZShjdHgtPmFscG5fY2xpZW50X3Byb3RvX2xpc3QpOwotICBPUEVOU1NMX2ZyZWUoY3R4LT5vY3NwX3Jlc3BvbnNlKTsKLSAgT1BFTlNTTF9mcmVlKGN0eC0+c2lnbmVkX2NlcnRfdGltZXN0YW1wX2xpc3QpOwotICBFVlBfUEtFWV9mcmVlKGN0eC0+dGxzZXh0X2NoYW5uZWxfaWRfcHJpdmF0ZSk7Ci0gIEJJT19mcmVlKGN0eC0+a2V5bG9nX2Jpbyk7Ci0KLSAgT1BFTlNTTF9mcmVlKGN0eCk7Ci19Ci0KIFNTTCAqU1NMX25ldyhTU0xfQ1RYICpjdHgpIHsKICAgU1NMICpzOwogCiAgIGlmIChjdHggPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfTlVMTF9TU0xfQ1RYKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9uZXcsIFNTTF9SX05VTExfU1NMX0NUWCk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgaWYgKGN0eC0+bWV0aG9kID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1NTTF9DVFhfSEFTX05PX0RFRkFVTFRfU1NMX1ZFUlNJT04pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX25ldywgU1NMX1JfU1NMX0NUWF9IQVNfTk9fREVGQVVMVF9TU0xfVkVSU0lPTik7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIApAQCAtMzk3LDggKzI4OSwxNyBAQAogCiAgIENSWVBUT19yZWZjb3VudF9pbmMoJmN0eC0+cmVmZXJlbmNlcyk7CiAgIHMtPmN0eCA9IGN0eDsKKyAgcy0+dGxzZXh0X3RpY2tldF9leHBlY3RlZCA9IDA7CiAgIENSWVBUT19yZWZjb3VudF9pbmMoJmN0eC0+cmVmZXJlbmNlcyk7CiAgIHMtPmluaXRpYWxfY3R4ID0gY3R4OworICBpZiAoY3R4LT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QpIHsKKyAgICBzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QgPSBCVUZfbWVtZHVwKAorICAgICAgICBjdHgtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCwgY3R4LT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoKTsKKyAgICBpZiAoIXMtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIHMtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGggPSBjdHgtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGg7CisgIH0KIAogICBpZiAoY3R4LT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3QpIHsKICAgICBzLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3QgPQpAQCAtNDA5LDYgKzMxMCw3IEBACiAgICAgfQogICAgIHMtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdF9sZW5ndGggPSBjdHgtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdF9sZW5ndGg7CiAgIH0KKyAgcy0+bmV4dF9wcm90b19uZWdvdGlhdGVkID0gTlVMTDsKIAogICBpZiAocy0+Y3R4LT5hbHBuX2NsaWVudF9wcm90b19saXN0KSB7CiAgICAgcy0+YWxwbl9jbGllbnRfcHJvdG9fbGlzdCA9IEJVRl9tZW1kdXAocy0+Y3R4LT5hbHBuX2NsaWVudF9wcm90b19saXN0LApAQCAtNDI5LDYgKzMzMSw3IEBACiAgIGFzc2VydChzLT5lbmNfbWV0aG9kICE9IE5VTEwpOwogCiAgIHMtPnJ3c3RhdGUgPSBTU0xfTk9USElORzsKKyAgcy0+cnN0YXRlID0gU1NMX1NUX1JFQURfSEVBREVSOwogCiAgIENSWVBUT19uZXdfZXhfZGF0YSgmZ19leF9kYXRhX2NsYXNzX3NzbCwgcywgJnMtPmV4X2RhdGEpOwogCkBAIC00NTUsNDc0ICszNTgsMTYgQEAKIAogZXJyOgogICBTU0xfZnJlZShzKTsKLSAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCiAgIHJldHVybiBOVUxMOwogfQogCi12b2lkIFNTTF9mcmVlKFNTTCAqc3NsKSB7Ci0gIGlmIChzc2wgPT0gTlVMTCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIFg1MDlfVkVSSUZZX1BBUkFNX2ZyZWUoc3NsLT5wYXJhbSk7Ci0KLSAgQ1JZUFRPX2ZyZWVfZXhfZGF0YSgmZ19leF9kYXRhX2NsYXNzX3NzbCwgc3NsLCAmc3NsLT5leF9kYXRhKTsKLQotICBpZiAoc3NsLT5iYmlvICE9IE5VTEwpIHsKLSAgICAvKiBJZiB0aGUgYnVmZmVyaW5nIEJJTyBpcyBpbiBwbGFjZSwgcG9wIGl0IG9mZiAqLwotICAgIGlmIChzc2wtPmJiaW8gPT0gc3NsLT53YmlvKSB7Ci0gICAgICBzc2wtPndiaW8gPSBCSU9fcG9wKHNzbC0+d2Jpbyk7Ci0gICAgfQotICAgIEJJT19mcmVlKHNzbC0+YmJpbyk7Ci0gICAgc3NsLT5iYmlvID0gTlVMTDsKLSAgfQotCi0gIGludCBmcmVlX3diaW8gPSBzc2wtPndiaW8gIT0gc3NsLT5yYmlvOwotICBCSU9fZnJlZV9hbGwoc3NsLT5yYmlvKTsKLSAgaWYgKGZyZWVfd2JpbykgewotICAgIEJJT19mcmVlX2FsbChzc2wtPndiaW8pOwotICB9Ci0KLSAgQlVGX01FTV9mcmVlKHNzbC0+aW5pdF9idWYpOwotCi0gIC8qIGFkZCBleHRyYSBzdHVmZiAqLwotICBzc2xfY2lwaGVyX3ByZWZlcmVuY2VfbGlzdF9mcmVlKHNzbC0+Y2lwaGVyX2xpc3QpOwotICBza19TU0xfQ0lQSEVSX2ZyZWUoc3NsLT5jaXBoZXJfbGlzdF9ieV9pZCk7Ci0KLSAgc3NsX2NsZWFyX2JhZF9zZXNzaW9uKHNzbCk7Ci0gIFNTTF9TRVNTSU9OX2ZyZWUoc3NsLT5zZXNzaW9uKTsKLQotICBzc2xfY2xlYXJfY2lwaGVyX2N0eChzc2wpOwotCi0gIHNzbF9jZXJ0X2ZyZWUoc3NsLT5jZXJ0KTsKLQotICBPUEVOU1NMX2ZyZWUoc3NsLT50bHNleHRfaG9zdG5hbWUpOwotICBTU0xfQ1RYX2ZyZWUoc3NsLT5pbml0aWFsX2N0eCk7Ci0gIE9QRU5TU0xfZnJlZShzc2wtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCk7Ci0gIE9QRU5TU0xfZnJlZShzc2wtPmFscG5fY2xpZW50X3Byb3RvX2xpc3QpOwotICBFVlBfUEtFWV9mcmVlKHNzbC0+dGxzZXh0X2NoYW5uZWxfaWRfcHJpdmF0ZSk7Ci0gIE9QRU5TU0xfZnJlZShzc2wtPnBza19pZGVudGl0eV9oaW50KTsKLSAgc2tfWDUwOV9OQU1FX3BvcF9mcmVlKHNzbC0+Y2xpZW50X0NBLCBYNTA5X05BTUVfZnJlZSk7Ci0gIE9QRU5TU0xfZnJlZShzc2wtPm5leHRfcHJvdG9fbmVnb3RpYXRlZCk7Ci0gIHNrX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX2ZyZWUoc3NsLT5zcnRwX3Byb2ZpbGVzKTsKLQotICBpZiAoc3NsLT5tZXRob2QgIT0gTlVMTCkgewotICAgIHNzbC0+bWV0aG9kLT5zc2xfZnJlZShzc2wpOwotICB9Ci0gIFNTTF9DVFhfZnJlZShzc2wtPmN0eCk7Ci0KLSAgT1BFTlNTTF9mcmVlKHNzbCk7Ci19Ci0KLXZvaWQgU1NMX3NldF9jb25uZWN0X3N0YXRlKFNTTCAqc3NsKSB7Ci0gIHNzbC0+c2VydmVyID0gMDsKLSAgc3NsLT5zaHV0ZG93biA9IDA7Ci0gIHNzbC0+c3RhdGUgPSBTU0xfU1RfQ09OTkVDVDsKLSAgc3NsLT5oYW5kc2hha2VfZnVuYyA9IHNzbC0+bWV0aG9kLT5zc2xfY29ubmVjdDsKLSAgLyogY2xlYXIgdGhlIGN1cnJlbnQgY2lwaGVyICovCi0gIHNzbF9jbGVhcl9jaXBoZXJfY3R4KHNzbCk7Ci19Ci0KLXZvaWQgU1NMX3NldF9hY2NlcHRfc3RhdGUoU1NMICpzc2wpIHsKLSAgc3NsLT5zZXJ2ZXIgPSAxOwotICBzc2wtPnNodXRkb3duID0gMDsKLSAgc3NsLT5zdGF0ZSA9IFNTTF9TVF9BQ0NFUFQ7Ci0gIHNzbC0+aGFuZHNoYWtlX2Z1bmMgPSBzc2wtPm1ldGhvZC0+c3NsX2FjY2VwdDsKLSAgLyogY2xlYXIgdGhlIGN1cnJlbnQgY2lwaGVyICovCi0gIHNzbF9jbGVhcl9jaXBoZXJfY3R4KHNzbCk7Ci19Ci0KLXZvaWQgU1NMX3NldF9iaW8oU1NMICpzc2wsIEJJTyAqcmJpbywgQklPICp3YmlvKSB7Ci0gIC8qIElmIHRoZSBvdXRwdXQgYnVmZmVyaW5nIEJJTyBpcyBzdGlsbCBpbiBwbGFjZSwgcmVtb3ZlIGl0LiAqLwotICBpZiAoc3NsLT5iYmlvICE9IE5VTEwpIHsKLSAgICBpZiAoc3NsLT53YmlvID09IHNzbC0+YmJpbykgewotICAgICAgc3NsLT53YmlvID0gc3NsLT53YmlvLT5uZXh0X2JpbzsKLSAgICAgIHNzbC0+YmJpby0+bmV4dF9iaW8gPSBOVUxMOwotICAgIH0KLSAgfQotCi0gIGlmIChzc2wtPnJiaW8gIT0gcmJpbykgewotICAgIEJJT19mcmVlX2FsbChzc2wtPnJiaW8pOwotICB9Ci0gIGlmIChzc2wtPndiaW8gIT0gd2JpbyAmJiBzc2wtPnJiaW8gIT0gc3NsLT53YmlvKSB7Ci0gICAgQklPX2ZyZWVfYWxsKHNzbC0+d2Jpbyk7Ci0gIH0KLSAgc3NsLT5yYmlvID0gcmJpbzsKLSAgc3NsLT53YmlvID0gd2JpbzsKLX0KLQotQklPICpTU0xfZ2V0X3JiaW8oY29uc3QgU1NMICpzc2wpIHsgcmV0dXJuIHNzbC0+cmJpbzsgfQotCi1CSU8gKlNTTF9nZXRfd2Jpbyhjb25zdCBTU0wgKnNzbCkgeyByZXR1cm4gc3NsLT53YmlvOyB9Ci0KLWludCBTU0xfZG9faGFuZHNoYWtlKFNTTCAqc3NsKSB7Ci0gIGlmIChzc2wtPmhhbmRzaGFrZV9mdW5jID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0NPTk5FQ1RJT05fVFlQRV9OT1RfU0VUKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoIVNTTF9pbl9pbml0KHNzbCkpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHJldHVybiBzc2wtPmhhbmRzaGFrZV9mdW5jKHNzbCk7Ci19Ci0KLWludCBTU0xfY29ubmVjdChTU0wgKnNzbCkgewotICBpZiAoc3NsLT5oYW5kc2hha2VfZnVuYyA9PSAwKSB7Ci0gICAgLyogTm90IHByb3Blcmx5IGluaXRpYWxpemVkIHlldCAqLwotICAgIFNTTF9zZXRfY29ubmVjdF9zdGF0ZShzc2wpOwotICB9Ci0KLSAgaWYgKHNzbC0+aGFuZHNoYWtlX2Z1bmMgIT0gc3NsLT5tZXRob2QtPnNzbF9jb25uZWN0KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIHNzbC0+aGFuZHNoYWtlX2Z1bmMoc3NsKTsKLX0KLQotaW50IFNTTF9hY2NlcHQoU1NMICpzc2wpIHsKLSAgaWYgKHNzbC0+aGFuZHNoYWtlX2Z1bmMgPT0gMCkgewotICAgIC8qIE5vdCBwcm9wZXJseSBpbml0aWFsaXplZCB5ZXQgKi8KLSAgICBTU0xfc2V0X2FjY2VwdF9zdGF0ZShzc2wpOwotICB9Ci0KLSAgaWYgKHNzbC0+aGFuZHNoYWtlX2Z1bmMgIT0gc3NsLT5tZXRob2QtPnNzbF9hY2NlcHQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gc3NsLT5oYW5kc2hha2VfZnVuYyhzc2wpOwotfQotCi1pbnQgU1NMX3JlYWQoU1NMICpzc2wsIHZvaWQgKmJ1ZiwgaW50IG51bSkgewotICBpZiAoc3NsLT5oYW5kc2hha2VfZnVuYyA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9VTklOSVRJQUxJWkVEKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoc3NsLT5zaHV0ZG93biAmIFNTTF9SRUNFSVZFRF9TSFVURE9XTikgewotICAgIHNzbC0+cndzdGF0ZSA9IFNTTF9OT1RISU5HOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgRVJSX2NsZWFyX3N5c3RlbV9lcnJvcigpOwotICByZXR1cm4gc3NsLT5tZXRob2QtPnNzbF9yZWFkX2FwcF9kYXRhKHNzbCwgYnVmLCBudW0sIDApOwotfQotCi1pbnQgU1NMX3BlZWsoU1NMICpzc2wsIHZvaWQgKmJ1ZiwgaW50IG51bSkgewotICBpZiAoc3NsLT5oYW5kc2hha2VfZnVuYyA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9VTklOSVRJQUxJWkVEKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoc3NsLT5zaHV0ZG93biAmIFNTTF9SRUNFSVZFRF9TSFVURE9XTikgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgRVJSX2NsZWFyX3N5c3RlbV9lcnJvcigpOwotICByZXR1cm4gc3NsLT5tZXRob2QtPnNzbF9yZWFkX2FwcF9kYXRhKHNzbCwgYnVmLCBudW0sIDEpOwotfQotCi1pbnQgU1NMX3dyaXRlKFNTTCAqc3NsLCBjb25zdCB2b2lkICpidWYsIGludCBudW0pIHsKLSAgaWYgKHNzbC0+aGFuZHNoYWtlX2Z1bmMgPT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfVU5JTklUSUFMSVpFRCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgaWYgKHNzbC0+c2h1dGRvd24gJiBTU0xfU0VOVF9TSFVURE9XTikgewotICAgIHNzbC0+cndzdGF0ZSA9IFNTTF9OT1RISU5HOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfUFJPVE9DT0xfSVNfU0hVVERPV04pOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIEVSUl9jbGVhcl9zeXN0ZW1fZXJyb3IoKTsKLSAgcmV0dXJuIHNzbC0+bWV0aG9kLT5zc2xfd3JpdGVfYXBwX2RhdGEoc3NsLCBidWYsIG51bSk7Ci19Ci0KLWludCBTU0xfc2h1dGRvd24oU1NMICpzc2wpIHsKLSAgLyogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gYmVoYXZlcyBkaWZmZXJlbnRseSBmcm9tIHdoYXQgb25lIG1pZ2h0IGV4cGVjdC4KLSAgICogUmV0dXJuIHZhbHVlcyBhcmUgMCBmb3Igbm8gc3VjY2VzcyAoeWV0KSwgMSBmb3Igc3VjY2VzczsgYnV0IGNhbGxpbmcgaXQKLSAgICogb25jZSBpcyB1c3VhbGx5IG5vdCBlbm91Z2gsIGV2ZW4gaWYgYmxvY2tpbmcgSS9PIGlzIHVzZWQgKHNlZQotICAgKiBzc2wzX3NodXRkb3duKS4gKi8KLQotICBpZiAoc3NsLT5oYW5kc2hha2VfZnVuYyA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9VTklOSVRJQUxJWkVEKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoU1NMX2luX2luaXQoc3NsKSkgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgLyogRG8gbm90aGluZyBpZiBjb25maWd1cmVkIG5vdCB0byBzZW5kIGEgY2xvc2Vfbm90aWZ5LiAqLwotICBpZiAoc3NsLT5xdWlldF9zaHV0ZG93bikgewotICAgIHNzbC0+c2h1dGRvd24gPSBTU0xfU0VOVF9TSFVURE9XTiB8IFNTTF9SRUNFSVZFRF9TSFVURE9XTjsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIGlmICghKHNzbC0+c2h1dGRvd24gJiBTU0xfU0VOVF9TSFVURE9XTikpIHsKLSAgICBzc2wtPnNodXRkb3duIHw9IFNTTF9TRU5UX1NIVVRET1dOOwotICAgIHNzbDNfc2VuZF9hbGVydChzc2wsIFNTTDNfQUxfV0FSTklORywgU1NMX0FEX0NMT1NFX05PVElGWSk7Ci0KLSAgICAvKiBvdXIgc2h1dGRvd24gYWxlcnQgaGFzIGJlZW4gc2VudCBub3csIGFuZCBpZiBpdCBzdGlsbCBuZWVkcyB0byBiZQotICAgICAqIHdyaXR0ZW4sIHNzbC0+czMtPmFsZXJ0X2Rpc3BhdGNoIHdpbGwgYmUgdHJ1ZSAqLwotICAgIGlmIChzc2wtPnMzLT5hbGVydF9kaXNwYXRjaCkgewotICAgICAgcmV0dXJuIC0xOyAvKiByZXR1cm4gV0FOVF9XUklURSAqLwotICAgIH0KLSAgfSBlbHNlIGlmIChzc2wtPnMzLT5hbGVydF9kaXNwYXRjaCkgewotICAgIC8qIHJlc2VuZCBpdCBpZiBub3Qgc2VudCAqLwotICAgIGludCByZXQgPSBzc2wtPm1ldGhvZC0+c3NsX2Rpc3BhdGNoX2FsZXJ0KHNzbCk7Ci0gICAgaWYgKHJldCA9PSAtMSkgewotICAgICAgLyogd2Ugb25seSBnZXQgdG8gcmV0dXJuIC0xIGhlcmUgdGhlIDJuZC9OdGggaW52b2NhdGlvbiwgd2UgbXVzdCAgaGF2ZQotICAgICAgICogYWxyZWFkeSBzaWduYWxsZWQgcmV0dXJuIDAgdXBvbiBhIHByZXZpb3VzIGludm9hdGlvbiwgcmV0dXJuCi0gICAgICAgKiBXQU5UX1dSSVRFICovCi0gICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgfSBlbHNlIGlmICghKHNzbC0+c2h1dGRvd24gJiBTU0xfUkVDRUlWRURfU0hVVERPV04pKSB7Ci0gICAgLyogSWYgd2UgYXJlIHdhaXRpbmcgZm9yIGEgY2xvc2UgZnJvbSBvdXIgcGVlciwgd2UgYXJlIGNsb3NlZCAqLwotICAgIHNzbC0+bWV0aG9kLT5zc2xfcmVhZF9jbG9zZV9ub3RpZnkoc3NsKTsKLSAgICBpZiAoIShzc2wtPnNodXRkb3duICYgU1NMX1JFQ0VJVkVEX1NIVVRET1dOKSkgewotICAgICAgcmV0dXJuIC0xOyAvKiByZXR1cm4gV0FOVF9SRUFEICovCi0gICAgfQotICB9Ci0KLSAgaWYgKHNzbC0+c2h1dGRvd24gPT0gKFNTTF9TRU5UX1NIVVRET1dOIHwgU1NMX1JFQ0VJVkVEX1NIVVRET1dOKSAmJgotICAgICAgIXNzbC0+czMtPmFsZXJ0X2Rpc3BhdGNoKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotaW50IFNTTF9nZXRfZXJyb3IoY29uc3QgU1NMICpzc2wsIGludCByZXRfY29kZSkgewotICBpbnQgcmVhc29uOwotICB1aW50MzJfdCBlcnI7Ci0gIEJJTyAqYmlvOwotCi0gIGlmIChyZXRfY29kZSA+IDApIHsKLSAgICByZXR1cm4gU1NMX0VSUk9SX05PTkU7Ci0gIH0KLQotICAvKiBNYWtlIHRoaW5ncyByZXR1cm4gU1NMX0VSUk9SX1NZU0NBTEwgd2hlbiBkb2luZyBTU0xfZG9faGFuZHNoYWtlIGV0YywKLSAgICogd2hlcmUgd2UgZG8gZW5jb2RlIHRoZSBlcnJvciAqLwotICBlcnIgPSBFUlJfcGVla19lcnJvcigpOwotICBpZiAoZXJyICE9IDApIHsKLSAgICBpZiAoRVJSX0dFVF9MSUIoZXJyKSA9PSBFUlJfTElCX1NZUykgewotICAgICAgcmV0dXJuIFNTTF9FUlJPUl9TWVNDQUxMOwotICAgIH0KLSAgICByZXR1cm4gU1NMX0VSUk9SX1NTTDsKLSAgfQotCi0gIGlmIChyZXRfY29kZSA9PSAwKSB7Ci0gICAgaWYgKChzc2wtPnNodXRkb3duICYgU1NMX1JFQ0VJVkVEX1NIVVRET1dOKSAmJgotICAgICAgICAoc3NsLT5zMy0+d2Fybl9hbGVydCA9PSBTU0xfQURfQ0xPU0VfTk9USUZZKSkgewotICAgICAgLyogVGhlIHNvY2tldCB3YXMgY2xlYW5seSBzaHV0IGRvd24gd2l0aCBhIGNsb3NlX25vdGlmeS4gKi8KLSAgICAgIHJldHVybiBTU0xfRVJST1JfWkVST19SRVRVUk47Ci0gICAgfQotICAgIC8qIEFuIEVPRiB3YXMgb2JzZXJ2ZWQgd2hpY2ggdmlvbGF0ZXMgdGhlIHByb3RvY29sLCBhbmQgdGhlIHVuZGVybHlpbmcKLSAgICAgKiB0cmFuc3BvcnQgZG9lcyBub3QgcGFydGljaXBhdGUgaW4gdGhlIGVycm9yIHF1ZXVlLiBCdWJibGUgdXAgdG8gdGhlCi0gICAgICogY2FsbGVyLiAqLwotICAgIHJldHVybiBTU0xfRVJST1JfU1lTQ0FMTDsKLSAgfQotCi0gIGlmIChTU0xfd2FudF9zZXNzaW9uKHNzbCkpIHsKLSAgICByZXR1cm4gU1NMX0VSUk9SX1BFTkRJTkdfU0VTU0lPTjsKLSAgfQotCi0gIGlmIChTU0xfd2FudF9jZXJ0aWZpY2F0ZShzc2wpKSB7Ci0gICAgcmV0dXJuIFNTTF9FUlJPUl9QRU5ESU5HX0NFUlRJRklDQVRFOwotICB9Ci0KLSAgaWYgKFNTTF93YW50X3JlYWQoc3NsKSkgewotICAgIGJpbyA9IFNTTF9nZXRfcmJpbyhzc2wpOwotICAgIGlmIChCSU9fc2hvdWxkX3JlYWQoYmlvKSkgewotICAgICAgcmV0dXJuIFNTTF9FUlJPUl9XQU5UX1JFQUQ7Ci0gICAgfQotCi0gICAgaWYgKEJJT19zaG91bGRfd3JpdGUoYmlvKSkgewotICAgICAgLyogVGhpcyBvbmUgZG9lc24ndCBtYWtlIHRvbyBtdWNoIHNlbnNlIC4uLiBXZSBuZXZlciB0cnkgdG8gd3JpdGUgdG8gdGhlCi0gICAgICAgKiByYmlvLCBhbmQgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB3aGVyZSByYmlvIGFuZCB3YmlvIGFyZSBzZXBhcmF0ZQotICAgICAgICogY291bGRuJ3QgZXZlbiBrbm93IHdoYXQgaXQgc2hvdWxkIHdhaXQgZm9yLiBIb3dldmVyIGlmIHdlIGV2ZXIgc2V0Ci0gICAgICAgKiBzLT5yd3N0YXRlIGluY29ycmVjdGx5IChzbyB0aGF0IHdlIGhhdmUgU1NMX3dhbnRfcmVhZChzKSBpbnN0ZWFkIG9mCi0gICAgICAgKiBTU0xfd2FudF93cml0ZShzKSkgYW5kIHJiaW8gYW5kIHdiaW8gKmFyZSogdGhlIHNhbWUsIHRoaXMgdGVzdCB3b3JrcwotICAgICAgICogYXJvdW5kIHRoYXQgYnVnOyBzbyBpdCBtaWdodCBiZSBzYWZlciB0byBrZWVwIGl0LiAqLwotICAgICAgcmV0dXJuIFNTTF9FUlJPUl9XQU5UX1dSSVRFOwotICAgIH0KLQotICAgIGlmIChCSU9fc2hvdWxkX2lvX3NwZWNpYWwoYmlvKSkgewotICAgICAgcmVhc29uID0gQklPX2dldF9yZXRyeV9yZWFzb24oYmlvKTsKLSAgICAgIGlmIChyZWFzb24gPT0gQklPX1JSX0NPTk5FQ1QpIHsKLSAgICAgICAgcmV0dXJuIFNTTF9FUlJPUl9XQU5UX0NPTk5FQ1Q7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChyZWFzb24gPT0gQklPX1JSX0FDQ0VQVCkgewotICAgICAgICByZXR1cm4gU1NMX0VSUk9SX1dBTlRfQUNDRVBUOwotICAgICAgfQotCi0gICAgICByZXR1cm4gU1NMX0VSUk9SX1NZU0NBTEw7IC8qIHVua25vd24gKi8KLSAgICB9Ci0gIH0KLQotICBpZiAoU1NMX3dhbnRfd3JpdGUoc3NsKSkgewotICAgIGJpbyA9IFNTTF9nZXRfd2Jpbyhzc2wpOwotICAgIGlmIChCSU9fc2hvdWxkX3dyaXRlKGJpbykpIHsKLSAgICAgIHJldHVybiBTU0xfRVJST1JfV0FOVF9XUklURTsKLSAgICB9Ci0KLSAgICBpZiAoQklPX3Nob3VsZF9yZWFkKGJpbykpIHsKLSAgICAgIC8qIFNlZSBhYm92ZSAoU1NMX3dhbnRfcmVhZChzc2wpIHdpdGggQklPX3Nob3VsZF93cml0ZShiaW8pKSAqLwotICAgICAgcmV0dXJuIFNTTF9FUlJPUl9XQU5UX1JFQUQ7Ci0gICAgfQotCi0gICAgaWYgKEJJT19zaG91bGRfaW9fc3BlY2lhbChiaW8pKSB7Ci0gICAgICByZWFzb24gPSBCSU9fZ2V0X3JldHJ5X3JlYXNvbihiaW8pOwotICAgICAgaWYgKHJlYXNvbiA9PSBCSU9fUlJfQ09OTkVDVCkgewotICAgICAgICByZXR1cm4gU1NMX0VSUk9SX1dBTlRfQ09OTkVDVDsKLSAgICAgIH0KLQotICAgICAgaWYgKHJlYXNvbiA9PSBCSU9fUlJfQUNDRVBUKSB7Ci0gICAgICAgIHJldHVybiBTU0xfRVJST1JfV0FOVF9BQ0NFUFQ7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBTU0xfRVJST1JfU1lTQ0FMTDsKLSAgICB9Ci0gIH0KLQotICBpZiAoU1NMX3dhbnRfeDUwOV9sb29rdXAoc3NsKSkgewotICAgIHJldHVybiBTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUDsKLSAgfQotCi0gIGlmIChTU0xfd2FudF9jaGFubmVsX2lkX2xvb2t1cChzc2wpKSB7Ci0gICAgcmV0dXJuIFNTTF9FUlJPUl9XQU5UX0NIQU5ORUxfSURfTE9PS1VQOwotICB9Ci0KLSAgaWYgKFNTTF93YW50X3ByaXZhdGVfa2V5X29wZXJhdGlvbihzc2wpKSB7Ci0gICAgcmV0dXJuIFNTTF9FUlJPUl9XQU5UX1BSSVZBVEVfS0VZX09QRVJBVElPTjsKLSAgfQotCi0gIHJldHVybiBTU0xfRVJST1JfU1lTQ0FMTDsKLX0KLQotdm9pZCBTU0xfQ1RYX3NldF9taW5fdmVyc2lvbihTU0xfQ1RYICpjdHgsIHVpbnQxNl90IHZlcnNpb24pIHsKLSAgY3R4LT5taW5fdmVyc2lvbiA9IHZlcnNpb247Ci19Ci0KLXZvaWQgU1NMX0NUWF9zZXRfbWF4X3ZlcnNpb24oU1NMX0NUWCAqY3R4LCB1aW50MTZfdCB2ZXJzaW9uKSB7Ci0gIGN0eC0+bWF4X3ZlcnNpb24gPSB2ZXJzaW9uOwotfQotCi12b2lkIFNTTF9zZXRfbWluX3ZlcnNpb24oU1NMICpzc2wsIHVpbnQxNl90IHZlcnNpb24pIHsKLSAgc3NsLT5taW5fdmVyc2lvbiA9IHZlcnNpb247Ci19Ci0KLXZvaWQgU1NMX3NldF9tYXhfdmVyc2lvbihTU0wgKnNzbCwgdWludDE2X3QgdmVyc2lvbikgewotICBzc2wtPm1heF92ZXJzaW9uID0gdmVyc2lvbjsKLX0KLQotdWludDMyX3QgU1NMX0NUWF9zZXRfb3B0aW9ucyhTU0xfQ1RYICpjdHgsIHVpbnQzMl90IG9wdGlvbnMpIHsKLSAgY3R4LT5vcHRpb25zIHw9IG9wdGlvbnM7Ci0gIHJldHVybiBjdHgtPm9wdGlvbnM7Ci19Ci0KLXVpbnQzMl90IFNTTF9DVFhfY2xlYXJfb3B0aW9ucyhTU0xfQ1RYICpjdHgsIHVpbnQzMl90IG9wdGlvbnMpIHsKLSAgY3R4LT5vcHRpb25zICY9IH5vcHRpb25zOwotICByZXR1cm4gY3R4LT5vcHRpb25zOwotfQotCi11aW50MzJfdCBTU0xfQ1RYX2dldF9vcHRpb25zKGNvbnN0IFNTTF9DVFggKmN0eCkgeyByZXR1cm4gY3R4LT5vcHRpb25zOyB9Ci0KLXVpbnQzMl90IFNTTF9zZXRfb3B0aW9ucyhTU0wgKnNzbCwgdWludDMyX3Qgb3B0aW9ucykgewotICBzc2wtPm9wdGlvbnMgfD0gb3B0aW9uczsKLSAgcmV0dXJuIHNzbC0+b3B0aW9uczsKLX0KLQotdWludDMyX3QgU1NMX2NsZWFyX29wdGlvbnMoU1NMICpzc2wsIHVpbnQzMl90IG9wdGlvbnMpIHsKLSAgc3NsLT5vcHRpb25zICY9IH5vcHRpb25zOwotICByZXR1cm4gc3NsLT5vcHRpb25zOwotfQotCi11aW50MzJfdCBTU0xfZ2V0X29wdGlvbnMoY29uc3QgU1NMICpzc2wpIHsgcmV0dXJuIHNzbC0+b3B0aW9uczsgfQotCi11aW50MzJfdCBTU0xfQ1RYX3NldF9tb2RlKFNTTF9DVFggKmN0eCwgdWludDMyX3QgbW9kZSkgewotICBjdHgtPm1vZGUgfD0gbW9kZTsKLSAgcmV0dXJuIGN0eC0+bW9kZTsKLX0KLQotdWludDMyX3QgU1NMX0NUWF9jbGVhcl9tb2RlKFNTTF9DVFggKmN0eCwgdWludDMyX3QgbW9kZSkgewotICBjdHgtPm1vZGUgJj0gfm1vZGU7Ci0gIHJldHVybiBjdHgtPm1vZGU7Ci19Ci0KLXVpbnQzMl90IFNTTF9DVFhfZ2V0X21vZGUoY29uc3QgU1NMX0NUWCAqY3R4KSB7IHJldHVybiBjdHgtPm1vZGU7IH0KLQotdWludDMyX3QgU1NMX3NldF9tb2RlKFNTTCAqc3NsLCB1aW50MzJfdCBtb2RlKSB7Ci0gIHNzbC0+bW9kZSB8PSBtb2RlOwotICByZXR1cm4gc3NsLT5tb2RlOwotfQotCi11aW50MzJfdCBTU0xfY2xlYXJfbW9kZShTU0wgKnNzbCwgdWludDMyX3QgbW9kZSkgewotICBzc2wtPm1vZGUgJj0gfm1vZGU7Ci0gIHJldHVybiBzc2wtPm1vZGU7Ci19Ci0KLXVpbnQzMl90IFNTTF9nZXRfbW9kZShjb25zdCBTU0wgKnNzbCkgeyByZXR1cm4gc3NsLT5tb2RlOyB9Ci0KLVg1MDkgKlNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShjb25zdCBTU0wgKnNzbCkgewotICBpZiAoc3NsID09IE5VTEwgfHwgc3NsLT5zZXNzaW9uID09IE5VTEwgfHwgc3NsLT5zZXNzaW9uLT5wZWVyID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gWDUwOV91cF9yZWYoc3NsLT5zZXNzaW9uLT5wZWVyKTsKLX0KLQotU1RBQ0tfT0YoWDUwOSkgKlNTTF9nZXRfcGVlcl9jZXJ0X2NoYWluKGNvbnN0IFNTTCAqc3NsKSB7Ci0gIGlmIChzc2wgPT0gTlVMTCB8fCBzc2wtPnNlc3Npb24gPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiBzc2wtPnNlc3Npb24tPmNlcnRfY2hhaW47Ci19Ci0KLWludCBTU0xfZ2V0X3Rsc191bmlxdWUoY29uc3QgU1NMICpzc2wsIHVpbnQ4X3QgKm91dCwgc2l6ZV90ICpvdXRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWF4X291dCkgewotICAvKiBUaGUgdGxzLXVuaXF1ZSB2YWx1ZSBpcyB0aGUgZmlyc3QgRmluaXNoZWQgbWVzc2FnZSBpbiB0aGUgaGFuZHNoYWtlLCB3aGljaAotICAgKiBpcyB0aGUgY2xpZW50J3MgaW4gYSBmdWxsIGhhbmRzaGFrZSBhbmQgdGhlIHNlcnZlcidzIGZvciBhIHJlc3VtcHRpb24uIFNlZQotICAgKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTkyOSNzZWN0aW9uLTMuMS4gKi8KLSAgY29uc3QgdWludDhfdCAqZmluaXNoZWQgPSBzc2wtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWQ7Ci0gIHNpemVfdCBmaW5pc2hlZF9sZW4gPSBzc2wtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWRfbGVuOwotICBpZiAoc3NsLT5oaXQpIHsKLSAgICAvKiB0bHMtdW5pcXVlIGlzIGJyb2tlbiBmb3IgcmVzdW1lZCBzZXNzaW9ucyB1bmxlc3MgRU1TIGlzIHVzZWQuICovCi0gICAgaWYgKCFzc2wtPnNlc3Npb24tPmV4dGVuZGVkX21hc3Rlcl9zZWNyZXQpIHsKLSAgICAgIGdvdG8gZXJyOwotICAgIH0KLSAgICBmaW5pc2hlZCA9IHNzbC0+czMtPnByZXZpb3VzX3NlcnZlcl9maW5pc2hlZDsKLSAgICBmaW5pc2hlZF9sZW4gPSBzc2wtPnMzLT5wcmV2aW91c19zZXJ2ZXJfZmluaXNoZWRfbGVuOwotICB9Ci0KLSAgaWYgKCFzc2wtPnMzLT5pbml0aWFsX2hhbmRzaGFrZV9jb21wbGV0ZSB8fAotICAgICAgc3NsLT52ZXJzaW9uIDwgVExTMV9WRVJTSU9OKSB7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICAqb3V0X2xlbiA9IGZpbmlzaGVkX2xlbjsKLSAgaWYgKGZpbmlzaGVkX2xlbiA+IG1heF9vdXQpIHsKLSAgICAqb3V0X2xlbiA9IG1heF9vdXQ7Ci0gIH0KLQotICBtZW1jcHkob3V0LCBmaW5pc2hlZCwgKm91dF9sZW4pOwotICByZXR1cm4gMTsKLQotZXJyOgotICAqb3V0X2xlbiA9IDA7Ci0gIG1lbXNldChvdXQsIDAsIG1heF9vdXQpOwotICByZXR1cm4gMDsKLX0KLQogaW50IFNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dChTU0xfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKnNpZF9jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNpZF9jdHhfbGVuKSB7Ci0gIGlmIChzaWRfY3R4X2xlbiA+IHNpemVvZihjdHgtPnNpZF9jdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9TU0xfU0VTU0lPTl9JRF9DT05URVhUX1RPT19MT05HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpZF9jdHhfbGVuKSB7CisgIGlmIChzaWRfY3R4X2xlbiA+IHNpemVvZiBjdHgtPnNpZF9jdHgpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9TU0xfU0VTU0lPTl9JRF9DT05URVhUX1RPT19MT05HKTsKICAgICByZXR1cm4gMDsKICAgfQogICBjdHgtPnNpZF9jdHhfbGVuZ3RoID0gc2lkX2N0eF9sZW47CkBAIC05MzIsOSArMzc3LDEwIEBACiB9CiAKIGludCBTU0xfc2V0X3Nlc3Npb25faWRfY29udGV4dChTU0wgKnNzbCwgY29uc3QgdWludDhfdCAqc2lkX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaWRfY3R4X2xlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaWRfY3R4X2xlbikgewogICBpZiAoc2lkX2N0eF9sZW4gPiBTU0xfTUFYX1NJRF9DVFhfTEVOR1RIKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9TU0xfU0VTU0lPTl9JRF9DT05URVhUX1RPT19MT05HKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1NTTF9TRVNTSU9OX0lEX0NPTlRFWFRfVE9PX0xPTkcpOwogICAgIHJldHVybiAwOwogICB9CiAgIHNzbC0+c2lkX2N0eF9sZW5ndGggPSBzaWRfY3R4X2xlbjsKQEAgLTk1NCw3ICs0MDAsNyBAQAogfQogCiBpbnQgU1NMX2hhc19tYXRjaGluZ19zZXNzaW9uX2lkKGNvbnN0IFNTTCAqc3NsLCBjb25zdCB1aW50OF90ICppZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaWRfbGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpZF9sZW4pIHsKICAgLyogQSBxdWljayBleGFtaW5hdGlvbiBvZiBTU0xfU0VTU0lPTl9oYXNoIGFuZCBTU0xfU0VTU0lPTl9jbXAgc2hvd3MgaG93IHdlCiAgICAqIGNhbiAiY29uc3RydWN0IiBhIHNlc3Npb24gdG8gZ2l2ZSB1cyB0aGUgZGVzaXJlZCBjaGVjayAtIGllLiB0byBmaW5kIGlmCiAgICAqIHRoZXJlJ3MgYSBzZXNzaW9uIGluIHRoZSBoYXNoIHRhYmxlIHRoYXQgd291bGQgY29uZmxpY3Qgd2l0aCBhbnkgbmV3CkBAIC05NzYsMjggKzQyMiwyOCBAQAogICByZXR1cm4gcCAhPSBOVUxMOwogfQogCi1pbnQgU1NMX0NUWF9zZXRfcHVycG9zZShTU0xfQ1RYICpjdHgsIGludCBwdXJwb3NlKSB7Ci0gIHJldHVybiBYNTA5X1ZFUklGWV9QQVJBTV9zZXRfcHVycG9zZShjdHgtPnBhcmFtLCBwdXJwb3NlKTsKK2ludCBTU0xfQ1RYX3NldF9wdXJwb3NlKFNTTF9DVFggKnMsIGludCBwdXJwb3NlKSB7CisgIHJldHVybiBYNTA5X1ZFUklGWV9QQVJBTV9zZXRfcHVycG9zZShzLT5wYXJhbSwgcHVycG9zZSk7CiB9CiAKLWludCBTU0xfc2V0X3B1cnBvc2UoU1NMICpzc2wsIGludCBwdXJwb3NlKSB7Ci0gIHJldHVybiBYNTA5X1ZFUklGWV9QQVJBTV9zZXRfcHVycG9zZShzc2wtPnBhcmFtLCBwdXJwb3NlKTsKK2ludCBTU0xfc2V0X3B1cnBvc2UoU1NMICpzLCBpbnQgcHVycG9zZSkgeworICByZXR1cm4gWDUwOV9WRVJJRllfUEFSQU1fc2V0X3B1cnBvc2Uocy0+cGFyYW0sIHB1cnBvc2UpOwogfQogCi1pbnQgU1NMX0NUWF9zZXRfdHJ1c3QoU1NMX0NUWCAqY3R4LCBpbnQgdHJ1c3QpIHsKLSAgcmV0dXJuIFg1MDlfVkVSSUZZX1BBUkFNX3NldF90cnVzdChjdHgtPnBhcmFtLCB0cnVzdCk7CitpbnQgU1NMX0NUWF9zZXRfdHJ1c3QoU1NMX0NUWCAqcywgaW50IHRydXN0KSB7CisgIHJldHVybiBYNTA5X1ZFUklGWV9QQVJBTV9zZXRfdHJ1c3Qocy0+cGFyYW0sIHRydXN0KTsKIH0KIAotaW50IFNTTF9zZXRfdHJ1c3QoU1NMICpzc2wsIGludCB0cnVzdCkgewotICByZXR1cm4gWDUwOV9WRVJJRllfUEFSQU1fc2V0X3RydXN0KHNzbC0+cGFyYW0sIHRydXN0KTsKK2ludCBTU0xfc2V0X3RydXN0KFNTTCAqcywgaW50IHRydXN0KSB7CisgIHJldHVybiBYNTA5X1ZFUklGWV9QQVJBTV9zZXRfdHJ1c3Qocy0+cGFyYW0sIHRydXN0KTsKIH0KIAotaW50IFNTTF9DVFhfc2V0MV9wYXJhbShTU0xfQ1RYICpjdHgsIGNvbnN0IFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSkgewotICByZXR1cm4gWDUwOV9WRVJJRllfUEFSQU1fc2V0MShjdHgtPnBhcmFtLCBwYXJhbSk7CitpbnQgU1NMX0NUWF9zZXQxX3BhcmFtKFNTTF9DVFggKmN0eCwgWDUwOV9WRVJJRllfUEFSQU0gKnZwbSkgeworICByZXR1cm4gWDUwOV9WRVJJRllfUEFSQU1fc2V0MShjdHgtPnBhcmFtLCB2cG0pOwogfQogCi1pbnQgU1NMX3NldDFfcGFyYW0oU1NMICpzc2wsIGNvbnN0IFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSkgewotICByZXR1cm4gWDUwOV9WRVJJRllfUEFSQU1fc2V0MShzc2wtPnBhcmFtLCBwYXJhbSk7CitpbnQgU1NMX3NldDFfcGFyYW0oU1NMICpzc2wsIFg1MDlfVkVSSUZZX1BBUkFNICp2cG0pIHsKKyAgcmV0dXJuIFg1MDlfVkVSSUZZX1BBUkFNX3NldDEoc3NsLT5wYXJhbSwgdnBtKTsKIH0KIAogdm9pZCBzc2xfY2lwaGVyX3ByZWZlcmVuY2VfbGlzdF9mcmVlKApAQCAtMTA2OSw3ICs1MTUsODYgQEAKIAogWDUwOV9WRVJJRllfUEFSQU0gKlNTTF9nZXQwX3BhcmFtKFNTTCAqc3NsKSB7IHJldHVybiBzc2wtPnBhcmFtOyB9CiAKLXZvaWQgU1NMX2NlcnRzX2NsZWFyKFNTTCAqc3NsKSB7IHNzbF9jZXJ0X2NsZWFyX2NlcnRzKHNzbC0+Y2VydCk7IH0KK3ZvaWQgU1NMX2NlcnRzX2NsZWFyKFNTTCAqcykgeyBzc2xfY2VydF9jbGVhcl9jZXJ0cyhzLT5jZXJ0KTsgfQorCit2b2lkIFNTTF9mcmVlKFNTTCAqc3NsKSB7CisgIGlmIChzc2wgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisgIFg1MDlfVkVSSUZZX1BBUkFNX2ZyZWUoc3NsLT5wYXJhbSk7CisKKyAgQ1JZUFRPX2ZyZWVfZXhfZGF0YSgmZ19leF9kYXRhX2NsYXNzX3NzbCwgc3NsLCAmc3NsLT5leF9kYXRhKTsKKworICBpZiAoc3NsLT5iYmlvICE9IE5VTEwpIHsKKyAgICAvKiBJZiB0aGUgYnVmZmVyaW5nIEJJTyBpcyBpbiBwbGFjZSwgcG9wIGl0IG9mZiAqLworICAgIGlmIChzc2wtPmJiaW8gPT0gc3NsLT53YmlvKSB7CisgICAgICBzc2wtPndiaW8gPSBCSU9fcG9wKHNzbC0+d2Jpbyk7CisgICAgfQorICAgIEJJT19mcmVlKHNzbC0+YmJpbyk7CisgICAgc3NsLT5iYmlvID0gTlVMTDsKKyAgfQorCisgIGludCBmcmVlX3diaW8gPSBzc2wtPndiaW8gIT0gc3NsLT5yYmlvOworICBCSU9fZnJlZV9hbGwoc3NsLT5yYmlvKTsKKyAgaWYgKGZyZWVfd2JpbykgeworICAgIEJJT19mcmVlX2FsbChzc2wtPndiaW8pOworICB9CisKKyAgQlVGX01FTV9mcmVlKHNzbC0+aW5pdF9idWYpOworCisgIC8qIGFkZCBleHRyYSBzdHVmZiAqLworICBzc2xfY2lwaGVyX3ByZWZlcmVuY2VfbGlzdF9mcmVlKHNzbC0+Y2lwaGVyX2xpc3QpOworICBza19TU0xfQ0lQSEVSX2ZyZWUoc3NsLT5jaXBoZXJfbGlzdF9ieV9pZCk7CisKKyAgc3NsX2NsZWFyX2JhZF9zZXNzaW9uKHNzbCk7CisgIFNTTF9TRVNTSU9OX2ZyZWUoc3NsLT5zZXNzaW9uKTsKKworICBzc2xfY2xlYXJfY2lwaGVyX2N0eChzc2wpOworCisgIHNzbF9jZXJ0X2ZyZWUoc3NsLT5jZXJ0KTsKKworICBPUEVOU1NMX2ZyZWUoc3NsLT50bHNleHRfaG9zdG5hbWUpOworICBTU0xfQ1RYX2ZyZWUoc3NsLT5pbml0aWFsX2N0eCk7CisgIE9QRU5TU0xfZnJlZShzc2wtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCk7CisgIE9QRU5TU0xfZnJlZShzc2wtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCk7CisgIE9QRU5TU0xfZnJlZShzc2wtPmFscG5fY2xpZW50X3Byb3RvX2xpc3QpOworICBFVlBfUEtFWV9mcmVlKHNzbC0+dGxzZXh0X2NoYW5uZWxfaWRfcHJpdmF0ZSk7CisgIE9QRU5TU0xfZnJlZShzc2wtPnBza19pZGVudGl0eV9oaW50KTsKKyAgc2tfWDUwOV9OQU1FX3BvcF9mcmVlKHNzbC0+Y2xpZW50X0NBLCBYNTA5X05BTUVfZnJlZSk7CisgIE9QRU5TU0xfZnJlZShzc2wtPm5leHRfcHJvdG9fbmVnb3RpYXRlZCk7CisgIHNrX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX2ZyZWUoc3NsLT5zcnRwX3Byb2ZpbGVzKTsKKworICBpZiAoc3NsLT5tZXRob2QgIT0gTlVMTCkgeworICAgIHNzbC0+bWV0aG9kLT5zc2xfZnJlZShzc2wpOworICB9CisgIFNTTF9DVFhfZnJlZShzc2wtPmN0eCk7CisKKyAgT1BFTlNTTF9mcmVlKHNzbCk7Cit9CisKK3ZvaWQgU1NMX3NldF9iaW8oU1NMICpzLCBCSU8gKnJiaW8sIEJJTyAqd2JpbykgeworICAvKiBJZiB0aGUgb3V0cHV0IGJ1ZmZlcmluZyBCSU8gaXMgc3RpbGwgaW4gcGxhY2UsIHJlbW92ZSBpdC4gKi8KKyAgaWYgKHMtPmJiaW8gIT0gTlVMTCkgeworICAgIGlmIChzLT53YmlvID09IHMtPmJiaW8pIHsKKyAgICAgIHMtPndiaW8gPSBzLT53YmlvLT5uZXh0X2JpbzsKKyAgICAgIHMtPmJiaW8tPm5leHRfYmlvID0gTlVMTDsKKyAgICB9CisgIH0KKworICBpZiAocy0+cmJpbyAhPSByYmlvKSB7CisgICAgQklPX2ZyZWVfYWxsKHMtPnJiaW8pOworICB9CisgIGlmIChzLT53YmlvICE9IHdiaW8gJiYgcy0+cmJpbyAhPSBzLT53YmlvKSB7CisgICAgQklPX2ZyZWVfYWxsKHMtPndiaW8pOworICB9CisgIHMtPnJiaW8gPSByYmlvOworICBzLT53YmlvID0gd2JpbzsKK30KKworQklPICpTU0xfZ2V0X3JiaW8oY29uc3QgU1NMICpzKSB7IHJldHVybiBzLT5yYmlvOyB9CisKK0JJTyAqU1NMX2dldF93YmlvKGNvbnN0IFNTTCAqcykgeyByZXR1cm4gcy0+d2JpbzsgfQogCiBpbnQgU1NMX2dldF9mZChjb25zdCBTU0wgKnMpIHsgcmV0dXJuIFNTTF9nZXRfcmZkKHMpOyB9CiAKQEAgLTExMDUsNyArNjMwLDcgQEAKICAgYmlvID0gQklPX25ldyhCSU9fc19mZCgpKTsKIAogICBpZiAoYmlvID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0JVRl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX3NldF9mZCwgRVJSX1JfQlVGX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgQklPX3NldF9mZChiaW8sIGZkLCBCSU9fTk9DTE9TRSk7CkBAIC0xMTI1LDcgKzY1MCw3IEBACiAgICAgYmlvID0gQklPX25ldyhCSU9fc19mZCgpKTsKIAogICAgIGlmIChiaW8gPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9CVUZfTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX3NldF93ZmQsIEVSUl9SX0JVRl9MSUIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIEJJT19zZXRfZmQoYmlvLCBmZCwgQklPX05PQ0xPU0UpOwpAQCAtMTE0OSw3ICs2NzQsNyBAQAogICAgIGJpbyA9IEJJT19uZXcoQklPX3NfZmQoKSk7CiAKICAgICBpZiAoYmlvID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfQlVGX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9zZXRfcmZkLCBFUlJfUl9CVUZfTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICBCSU9fc2V0X2ZkKGJpbywgZmQsIEJJT19OT0NMT1NFKTsKQEAgLTExOTMsMTggKzcxOCwxNCBAQAogICByZXR1cm4gcmV0OwogfQogCi1pbnQgU1NMX2dldF92ZXJpZnlfbW9kZShjb25zdCBTU0wgKnNzbCkgeyByZXR1cm4gc3NsLT52ZXJpZnlfbW9kZTsgfQoraW50IFNTTF9nZXRfdmVyaWZ5X21vZGUoY29uc3QgU1NMICpzKSB7IHJldHVybiBzLT52ZXJpZnlfbW9kZTsgfQogCi1pbnQgU1NMX2dldF92ZXJpZnlfZGVwdGgoY29uc3QgU1NMICpzc2wpIHsKLSAgcmV0dXJuIFg1MDlfVkVSSUZZX1BBUkFNX2dldF9kZXB0aChzc2wtPnBhcmFtKTsKK2ludCBTU0xfZ2V0X3ZlcmlmeV9kZXB0aChjb25zdCBTU0wgKnMpIHsKKyAgcmV0dXJuIFg1MDlfVkVSSUZZX1BBUkFNX2dldF9kZXB0aChzLT5wYXJhbSk7CiB9CiAKLWludCBTU0xfZ2V0X2V4dG1zX3N1cHBvcnQoY29uc3QgU1NMICpzc2wpIHsKLSAgcmV0dXJuIHNzbC0+czMtPnRtcC5leHRlbmRlZF9tYXN0ZXJfc2VjcmV0ID09IDE7Ci19Ci0KLWludCAoKlNTTF9nZXRfdmVyaWZ5X2NhbGxiYWNrKGNvbnN0IFNTTCAqc3NsKSkoaW50LCBYNTA5X1NUT1JFX0NUWCAqKSB7Ci0gIHJldHVybiBzc2wtPnZlcmlmeV9jYWxsYmFjazsKK2ludCAoKlNTTF9nZXRfdmVyaWZ5X2NhbGxiYWNrKGNvbnN0IFNTTCAqcykpKGludCwgWDUwOV9TVE9SRV9DVFggKikgeworICByZXR1cm4gcy0+dmVyaWZ5X2NhbGxiYWNrOwogfQogCiBpbnQgU1NMX0NUWF9nZXRfdmVyaWZ5X21vZGUoY29uc3QgU1NMX0NUWCAqY3R4KSB7IHJldHVybiBjdHgtPnZlcmlmeV9tb2RlOyB9CkBAIC0xMjEzLDIxICs3MzQsMjAgQEAKICAgcmV0dXJuIFg1MDlfVkVSSUZZX1BBUkFNX2dldF9kZXB0aChjdHgtPnBhcmFtKTsKIH0KIAotaW50ICgqU1NMX0NUWF9nZXRfdmVyaWZ5X2NhbGxiYWNrKGNvbnN0IFNTTF9DVFggKmN0eCkpKAotICAgIGludCBvaywgWDUwOV9TVE9SRV9DVFggKnN0b3JlX2N0eCkgeworaW50ICgqU1NMX0NUWF9nZXRfdmVyaWZ5X2NhbGxiYWNrKGNvbnN0IFNTTF9DVFggKmN0eCkpKGludCwgWDUwOV9TVE9SRV9DVFggKikgewogICByZXR1cm4gY3R4LT5kZWZhdWx0X3ZlcmlmeV9jYWxsYmFjazsKIH0KIAotdm9pZCBTU0xfc2V0X3ZlcmlmeShTU0wgKnNzbCwgaW50IG1vZGUsCi0gICAgICAgICAgICAgICAgICAgIGludCAoKmNhbGxiYWNrKShpbnQgb2ssIFg1MDlfU1RPUkVfQ1RYICpzdG9yZV9jdHgpKSB7Ci0gIHNzbC0+dmVyaWZ5X21vZGUgPSBtb2RlOwordm9pZCBTU0xfc2V0X3ZlcmlmeShTU0wgKnMsIGludCBtb2RlLAorICAgICAgICAgICAgICAgICAgICBpbnQgKCpjYWxsYmFjaykoaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqY3R4KSkgeworICBzLT52ZXJpZnlfbW9kZSA9IG1vZGU7CiAgIGlmIChjYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgc3NsLT52ZXJpZnlfY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICBzLT52ZXJpZnlfY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgfQogfQogCi12b2lkIFNTTF9zZXRfdmVyaWZ5X2RlcHRoKFNTTCAqc3NsLCBpbnQgZGVwdGgpIHsKLSAgWDUwOV9WRVJJRllfUEFSQU1fc2V0X2RlcHRoKHNzbC0+cGFyYW0sIGRlcHRoKTsKK3ZvaWQgU1NMX3NldF92ZXJpZnlfZGVwdGgoU1NMICpzLCBpbnQgZGVwdGgpIHsKKyAgWDUwOV9WRVJJRllfUEFSQU1fc2V0X2RlcHRoKHMtPnBhcmFtLCBkZXB0aCk7CiB9CiAKIGludCBTU0xfQ1RYX2dldF9yZWFkX2FoZWFkKGNvbnN0IFNTTF9DVFggKmN0eCkgeyByZXR1cm4gMDsgfQpAQCAtMTIzOSw0NyArNzU5LDIyNiBAQAogdm9pZCBTU0xfc2V0X3JlYWRfYWhlYWQoU1NMICpzLCBpbnQgeWVzKSB7IH0KIAogaW50IFNTTF9wZW5kaW5nKGNvbnN0IFNTTCAqcykgeworICBpZiAocy0+cnN0YXRlID09IFNTTF9TVF9SRUFEX0JPRFkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCiAgIHJldHVybiAocy0+czMtPnJyZWMudHlwZSA9PSBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEpID8gcy0+czMtPnJyZWMubGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKIH0KIAorWDUwOSAqU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKGNvbnN0IFNTTCAqcykgeworICBYNTA5ICpyOworCisgIGlmIChzID09IE5VTEwgfHwgcy0+c2Vzc2lvbiA9PSBOVUxMKSB7CisgICAgciA9IE5VTEw7CisgIH0gZWxzZSB7CisgICAgciA9IHMtPnNlc3Npb24tPnBlZXI7CisgIH0KKworICBpZiAociA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gWDUwOV91cF9yZWYocik7Cit9CisKK1NUQUNLX09GKFg1MDkpICpTU0xfZ2V0X3BlZXJfY2VydF9jaGFpbihjb25zdCBTU0wgKnMpIHsKKyAgU1RBQ0tfT0YoWDUwOSkgKnI7CisKKyAgaWYgKHMgPT0gTlVMTCB8fCBzLT5zZXNzaW9uID09IE5VTEwgfHwgcy0+c2Vzc2lvbi0+c2Vzc19jZXJ0ID09IE5VTEwpIHsKKyAgICByID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICByID0gcy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5jZXJ0X2NoYWluOworICB9CisKKyAgLyogSWYgd2UgYXJlIGEgY2xpZW50LCBjZXJ0X2NoYWluIGluY2x1ZGVzIHRoZSBwZWVyJ3Mgb3duIGNlcnRpZmljYXRlOyBpZiB3ZQorICAgKiBhcmUgYSBzZXJ2ZXIsIGl0IGRvZXMgbm90LiAqLworICByZXR1cm4gcjsKK30KKwogLyogRml4IHRoaXMgc28gaXQgY2hlY2tzIGFsbCB0aGUgdmFsaWQga2V5L2NlcnQgb3B0aW9ucyAqLwogaW50IFNTTF9DVFhfY2hlY2tfcHJpdmF0ZV9rZXkoY29uc3QgU1NMX0NUWCAqY3R4KSB7Ci0gIGlmIChjdHgtPmNlcnQtPng1MDkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfTk9fQ0VSVElGSUNBVEVfQVNTSUdORUQpOworICBpZiAoY3R4ID09IE5VTEwgfHwgY3R4LT5jZXJ0ID09IE5VTEwgfHwgY3R4LT5jZXJ0LT5rZXktPng1MDkgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX0NUWF9jaGVja19wcml2YXRlX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9OT19DRVJUSUZJQ0FURV9BU1NJR05FRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAotICBpZiAoY3R4LT5jZXJ0LT5wcml2YXRla2V5ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX05PX1BSSVZBVEVfS0VZX0FTU0lHTkVEKTsKKyAgaWYgKGN0eC0+Y2VydC0+a2V5LT5wcml2YXRla2V5ID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9DVFhfY2hlY2tfcHJpdmF0ZV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfTk9fUFJJVkFURV9LRVlfQVNTSUdORUQpOwogICAgIHJldHVybiAwOwogICB9CiAKLSAgcmV0dXJuIFg1MDlfY2hlY2tfcHJpdmF0ZV9rZXkoY3R4LT5jZXJ0LT54NTA5LCBjdHgtPmNlcnQtPnByaXZhdGVrZXkpOworICByZXR1cm4gWDUwOV9jaGVja19wcml2YXRlX2tleShjdHgtPmNlcnQtPmtleS0+eDUwOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5jZXJ0LT5rZXktPnByaXZhdGVrZXkpOwogfQogCiAvKiBGaXggdGhpcyBmdW5jdGlvbiBzbyB0aGF0IGl0IHRha2VzIGFuIG9wdGlvbmFsIHR5cGUgcGFyYW1ldGVyICovCiBpbnQgU1NMX2NoZWNrX3ByaXZhdGVfa2V5KGNvbnN0IFNTTCAqc3NsKSB7Ci0gIGlmIChzc2wtPmNlcnQtPng1MDkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfTk9fQ0VSVElGSUNBVEVfQVNTSUdORUQpOworICBpZiAoc3NsID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9jaGVja19wcml2YXRlX2tleSwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKICAgICByZXR1cm4gMDsKICAgfQogCi0gIGlmIChzc2wtPmNlcnQtPnByaXZhdGVrZXkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfTk9fUFJJVkFURV9LRVlfQVNTSUdORUQpOworICBpZiAoc3NsLT5jZXJ0ID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9jaGVja19wcml2YXRlX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9OT19DRVJUSUZJQ0FURV9BU1NJR05FRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAotICByZXR1cm4gWDUwOV9jaGVja19wcml2YXRlX2tleShzc2wtPmNlcnQtPng1MDksIHNzbC0+Y2VydC0+cHJpdmF0ZWtleSk7CisgIGlmIChzc2wtPmNlcnQtPmtleS0+eDUwOSA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfY2hlY2tfcHJpdmF0ZV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfTk9fQ0VSVElGSUNBVEVfQVNTSUdORUQpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKHNzbC0+Y2VydC0+a2V5LT5wcml2YXRla2V5ID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9jaGVja19wcml2YXRlX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9OT19QUklWQVRFX0tFWV9BU1NJR05FRCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gWDUwOV9jaGVja19wcml2YXRlX2tleShzc2wtPmNlcnQtPmtleS0+eDUwOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5jZXJ0LT5rZXktPnByaXZhdGVrZXkpOwogfQogCi1sb25nIFNTTF9nZXRfZGVmYXVsdF90aW1lb3V0KGNvbnN0IFNTTCAqc3NsKSB7CitpbnQgU1NMX2FjY2VwdChTU0wgKnMpIHsKKyAgaWYgKHMtPmhhbmRzaGFrZV9mdW5jID09IDApIHsKKyAgICAvKiBOb3QgcHJvcGVybHkgaW5pdGlhbGl6ZWQgeWV0ICovCisgICAgU1NMX3NldF9hY2NlcHRfc3RhdGUocyk7CisgIH0KKworICBpZiAocy0+aGFuZHNoYWtlX2Z1bmMgIT0gcy0+bWV0aG9kLT5zc2xfYWNjZXB0KSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfYWNjZXB0LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIHMtPmhhbmRzaGFrZV9mdW5jKHMpOworfQorCitpbnQgU1NMX2Nvbm5lY3QoU1NMICpzKSB7CisgIGlmIChzLT5oYW5kc2hha2VfZnVuYyA9PSAwKSB7CisgICAgLyogTm90IHByb3Blcmx5IGluaXRpYWxpemVkIHlldCAqLworICAgIFNTTF9zZXRfY29ubmVjdF9zdGF0ZShzKTsKKyAgfQorCisgIGlmIChzLT5oYW5kc2hha2VfZnVuYyAhPSBzLT5tZXRob2QtPnNzbF9jb25uZWN0KSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfY29ubmVjdCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiBzLT5oYW5kc2hha2VfZnVuYyhzKTsKK30KKworbG9uZyBTU0xfZ2V0X2RlZmF1bHRfdGltZW91dChjb25zdCBTU0wgKnMpIHsKICAgcmV0dXJuIFNTTF9ERUZBVUxUX1NFU1NJT05fVElNRU9VVDsKIH0KIAoraW50IFNTTF9yZWFkKFNTTCAqcywgdm9pZCAqYnVmLCBpbnQgbnVtKSB7CisgIGlmIChzLT5oYW5kc2hha2VfZnVuYyA9PSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfcmVhZCwgU1NMX1JfVU5JTklUSUFMSVpFRCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKHMtPnNodXRkb3duICYgU1NMX1JFQ0VJVkVEX1NIVVRET1dOKSB7CisgICAgcy0+cndzdGF0ZSA9IFNTTF9OT1RISU5HOworICAgIHJldHVybiAwOworICB9CisKKyAgRVJSX2NsZWFyX3N5c3RlbV9lcnJvcigpOworICByZXR1cm4gcy0+bWV0aG9kLT5zc2xfcmVhZF9hcHBfZGF0YShzLCBidWYsIG51bSwgMCk7Cit9CisKK2ludCBTU0xfcGVlayhTU0wgKnMsIHZvaWQgKmJ1ZiwgaW50IG51bSkgeworICBpZiAocy0+aGFuZHNoYWtlX2Z1bmMgPT0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX3BlZWssIFNTTF9SX1VOSU5JVElBTElaRUQpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChzLT5zaHV0ZG93biAmIFNTTF9SRUNFSVZFRF9TSFVURE9XTikgeworICAgIHJldHVybiAwOworICB9CisKKyAgRVJSX2NsZWFyX3N5c3RlbV9lcnJvcigpOworICByZXR1cm4gcy0+bWV0aG9kLT5zc2xfcmVhZF9hcHBfZGF0YShzLCBidWYsIG51bSwgMSk7Cit9CisKK2ludCBTU0xfd3JpdGUoU1NMICpzLCBjb25zdCB2b2lkICpidWYsIGludCBudW0pIHsKKyAgaWYgKHMtPmhhbmRzaGFrZV9mdW5jID09IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF93cml0ZSwgU1NMX1JfVU5JTklUSUFMSVpFRCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKHMtPnNodXRkb3duICYgU1NMX1NFTlRfU0hVVERPV04pIHsKKyAgICBzLT5yd3N0YXRlID0gU1NMX05PVEhJTkc7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfd3JpdGUsIFNTTF9SX1BST1RPQ09MX0lTX1NIVVRET1dOKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBFUlJfY2xlYXJfc3lzdGVtX2Vycm9yKCk7CisgIHJldHVybiBzLT5tZXRob2QtPnNzbF93cml0ZV9hcHBfZGF0YShzLCBidWYsIG51bSk7Cit9CisKK2ludCBTU0xfc2h1dGRvd24oU1NMICpzKSB7CisgIC8qIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGJlaGF2ZXMgZGlmZmVyZW50bHkgZnJvbSB3aGF0IG9uZSBtaWdodCBleHBlY3QuCisgICAqIFJldHVybiB2YWx1ZXMgYXJlIDAgZm9yIG5vIHN1Y2Nlc3MgKHlldCksIDEgZm9yIHN1Y2Nlc3M7IGJ1dCBjYWxsaW5nIGl0CisgICAqIG9uY2UgaXMgdXN1YWxseSBub3QgZW5vdWdoLCBldmVuIGlmIGJsb2NraW5nIEkvTyBpcyB1c2VkIChzZWUKKyAgICogc3NsM19zaHV0ZG93bikuICovCisKKyAgaWYgKHMtPmhhbmRzaGFrZV9mdW5jID09IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9zaHV0ZG93biwgU1NMX1JfVU5JTklUSUFMSVpFRCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKFNTTF9pbl9pbml0KHMpKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvKiBEbyBub3RoaW5nIGlmIGNvbmZpZ3VyZWQgbm90IHRvIHNlbmQgYSBjbG9zZV9ub3RpZnkuICovCisgIGlmIChzLT5xdWlldF9zaHV0ZG93bikgeworICAgIHMtPnNodXRkb3duID0gU1NMX1NFTlRfU0hVVERPV04gfCBTU0xfUkVDRUlWRURfU0hVVERPV047CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoIShzLT5zaHV0ZG93biAmIFNTTF9TRU5UX1NIVVRET1dOKSkgeworICAgIHMtPnNodXRkb3duIHw9IFNTTF9TRU5UX1NIVVRET1dOOworICAgIHNzbDNfc2VuZF9hbGVydChzLCBTU0wzX0FMX1dBUk5JTkcsIFNTTF9BRF9DTE9TRV9OT1RJRlkpOworCisgICAgLyogb3VyIHNodXRkb3duIGFsZXJ0IGhhcyBiZWVuIHNlbnQgbm93LCBhbmQgaWYgaXQgc3RpbGwgbmVlZHMgdG8gYmUKKyAgICAgKiB3cml0dGVuLCBzLT5zMy0+YWxlcnRfZGlzcGF0Y2ggd2lsbCBiZSB0cnVlICovCisgICAgaWYgKHMtPnMzLT5hbGVydF9kaXNwYXRjaCkgeworICAgICAgcmV0dXJuIC0xOyAvKiByZXR1cm4gV0FOVF9XUklURSAqLworICAgIH0KKyAgfSBlbHNlIGlmIChzLT5zMy0+YWxlcnRfZGlzcGF0Y2gpIHsKKyAgICAvKiByZXNlbmQgaXQgaWYgbm90IHNlbnQgKi8KKyAgICBpbnQgcmV0ID0gcy0+bWV0aG9kLT5zc2xfZGlzcGF0Y2hfYWxlcnQocyk7CisgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgLyogd2Ugb25seSBnZXQgdG8gcmV0dXJuIC0xIGhlcmUgdGhlIDJuZC9OdGggaW52b2NhdGlvbiwgd2UgbXVzdCAgaGF2ZQorICAgICAgICogYWxyZWFkeSBzaWduYWxsZWQgcmV0dXJuIDAgdXBvbiBhIHByZXZpb3VzIGludm9hdGlvbiwgcmV0dXJuCisgICAgICAgKiBXQU5UX1dSSVRFICovCisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgfSBlbHNlIGlmICghKHMtPnNodXRkb3duICYgU1NMX1JFQ0VJVkVEX1NIVVRET1dOKSkgeworICAgIC8qIElmIHdlIGFyZSB3YWl0aW5nIGZvciBhIGNsb3NlIGZyb20gb3VyIHBlZXIsIHdlIGFyZSBjbG9zZWQgKi8KKyAgICBzLT5tZXRob2QtPnNzbF9yZWFkX2Nsb3NlX25vdGlmeShzKTsKKyAgICBpZiAoIShzLT5zaHV0ZG93biAmIFNTTF9SRUNFSVZFRF9TSFVURE9XTikpIHsKKyAgICAgIHJldHVybiAtMTsgLyogcmV0dXJuIFdBTlRfUkVBRCAqLworICAgIH0KKyAgfQorCisgIGlmIChzLT5zaHV0ZG93biA9PSAoU1NMX1NFTlRfU0hVVERPV04gfCBTU0xfUkVDRUlWRURfU0hVVERPV04pICYmCisgICAgICAhcy0+czMtPmFsZXJ0X2Rpc3BhdGNoKSB7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKwogaW50IFNTTF9yZW5lZ290aWF0ZShTU0wgKnNzbCkgewogICAvKiBDYWxsZXItaW5pdGlhdGVkIHJlbmVnb3RpYXRpb24gaXMgbm90IHN1cHBvcnRlZC4gKi8KLSAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9yZW5lZ290aWF0ZSwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgcmV0dXJuIDA7CiB9CiAKQEAgLTEyODcsNiArOTg2LDU0IEBACiAgIHJldHVybiBTU0xfaW5faW5pdChzc2wpICYmIHNzbC0+czMtPmluaXRpYWxfaGFuZHNoYWtlX2NvbXBsZXRlOwogfQogCit1aW50MzJfdCBTU0xfQ1RYX3NldF9vcHRpb25zKFNTTF9DVFggKmN0eCwgdWludDMyX3Qgb3B0aW9ucykgeworICBjdHgtPm9wdGlvbnMgfD0gb3B0aW9uczsKKyAgcmV0dXJuIGN0eC0+b3B0aW9uczsKK30KKwordWludDMyX3QgU1NMX3NldF9vcHRpb25zKFNTTCAqc3NsLCB1aW50MzJfdCBvcHRpb25zKSB7CisgIHNzbC0+b3B0aW9ucyB8PSBvcHRpb25zOworICByZXR1cm4gc3NsLT5vcHRpb25zOworfQorCit1aW50MzJfdCBTU0xfQ1RYX2NsZWFyX29wdGlvbnMoU1NMX0NUWCAqY3R4LCB1aW50MzJfdCBvcHRpb25zKSB7CisgIGN0eC0+b3B0aW9ucyAmPSB+b3B0aW9uczsKKyAgcmV0dXJuIGN0eC0+b3B0aW9uczsKK30KKwordWludDMyX3QgU1NMX2NsZWFyX29wdGlvbnMoU1NMICpzc2wsIHVpbnQzMl90IG9wdGlvbnMpIHsKKyAgc3NsLT5vcHRpb25zICY9IH5vcHRpb25zOworICByZXR1cm4gc3NsLT5vcHRpb25zOworfQorCit1aW50MzJfdCBTU0xfQ1RYX2dldF9vcHRpb25zKGNvbnN0IFNTTF9DVFggKmN0eCkgeyByZXR1cm4gY3R4LT5vcHRpb25zOyB9CisKK3VpbnQzMl90IFNTTF9nZXRfb3B0aW9ucyhjb25zdCBTU0wgKnNzbCkgeyByZXR1cm4gc3NsLT5vcHRpb25zOyB9CisKK3VpbnQzMl90IFNTTF9DVFhfc2V0X21vZGUoU1NMX0NUWCAqY3R4LCB1aW50MzJfdCBtb2RlKSB7CisgIGN0eC0+bW9kZSB8PSBtb2RlOworICByZXR1cm4gY3R4LT5tb2RlOworfQorCit1aW50MzJfdCBTU0xfc2V0X21vZGUoU1NMICpzc2wsIHVpbnQzMl90IG1vZGUpIHsKKyAgc3NsLT5tb2RlIHw9IG1vZGU7CisgIHJldHVybiBzc2wtPm1vZGU7Cit9CisKK3VpbnQzMl90IFNTTF9DVFhfY2xlYXJfbW9kZShTU0xfQ1RYICpjdHgsIHVpbnQzMl90IG1vZGUpIHsKKyAgY3R4LT5tb2RlICY9IH5tb2RlOworICByZXR1cm4gY3R4LT5tb2RlOworfQorCit1aW50MzJfdCBTU0xfY2xlYXJfbW9kZShTU0wgKnNzbCwgdWludDMyX3QgbW9kZSkgeworICBzc2wtPm1vZGUgJj0gfm1vZGU7CisgIHJldHVybiBzc2wtPm1vZGU7Cit9CisKK3VpbnQzMl90IFNTTF9DVFhfZ2V0X21vZGUoY29uc3QgU1NMX0NUWCAqY3R4KSB7IHJldHVybiBjdHgtPm1vZGU7IH0KKwordWludDMyX3QgU1NMX2dldF9tb2RlKGNvbnN0IFNTTCAqc3NsKSB7IHJldHVybiBzc2wtPm1vZGU7IH0KKwogc2l6ZV90IFNTTF9DVFhfZ2V0X21heF9jZXJ0X2xpc3QoY29uc3QgU1NMX0NUWCAqY3R4KSB7CiAgIHJldHVybiBjdHgtPm1heF9jZXJ0X2xpc3Q7CiB9CkBAIC0xMzQxLDYgKzEwODgsMTAgQEAKICAgcmV0dXJuIHNzbC0+czMtPnNlbmRfY29ubmVjdGlvbl9iaW5kaW5nOwogfQogCitsb25nIFNTTF9jdHJsKFNTTCAqcywgaW50IGNtZCwgbG9uZyBsYXJnLCB2b2lkICpwYXJnKSB7CisgIHJldHVybiBzLT5tZXRob2QtPnNzbF9jdHJsKHMsIGNtZCwgbGFyZywgcGFyZyk7Cit9CisKIExIQVNIX09GKFNTTF9TRVNTSU9OKSAqU1NMX0NUWF9zZXNzaW9ucyhTU0xfQ1RYICpjdHgpIHsgcmV0dXJuIGN0eC0+c2Vzc2lvbnM7IH0KIAogc2l6ZV90IFNTTF9DVFhfc2Vzc19udW1iZXIoY29uc3QgU1NMX0NUWCAqY3R4KSB7CkBAIC0xMzY3LDYgKzExMTgsMTAgQEAKICAgcmV0dXJuIGN0eC0+c2Vzc2lvbl9jYWNoZV9tb2RlOwogfQogCitsb25nIFNTTF9DVFhfY3RybChTU0xfQ1RYICpjdHgsIGludCBjbWQsIGxvbmcgbGFyZywgdm9pZCAqcGFyZykgeworICByZXR1cm4gY3R4LT5tZXRob2QtPnNzbF9jdHhfY3RybChjdHgsIGNtZCwgbGFyZywgcGFyZyk7Cit9CisKIC8qIHJldHVybiBhIFNUQUNLIG9mIHRoZSBjaXBoZXJzIGF2YWlsYWJsZSBmb3IgdGhlIFNTTCBhbmQgaW4gb3JkZXIgb2YKICAqIHByZWZlcmVuY2UgKi8KIFNUQUNLX09GKFNTTF9DSVBIRVIpICpTU0xfZ2V0X2NpcGhlcnMoY29uc3QgU1NMICpzKSB7CkBAIC0xMzgzLDExICsxMTM4LDYgQEAKICAgICByZXR1cm4gcy0+Y3R4LT5jaXBoZXJfbGlzdF90bHMxMS0+Y2lwaGVyczsKICAgfQogCi0gIGlmIChzLT52ZXJzaW9uID49IFRMUzFfVkVSU0lPTiAmJiBzLT5jdHggIT0gTlVMTCAmJgotICAgICAgcy0+Y3R4LT5jaXBoZXJfbGlzdF90bHMxMCAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIHMtPmN0eC0+Y2lwaGVyX2xpc3RfdGxzMTAtPmNpcGhlcnM7Ci0gIH0KLQogICBpZiAocy0+Y3R4ICE9IE5VTEwgJiYgcy0+Y3R4LT5jaXBoZXJfbGlzdCAhPSBOVUxMKSB7CiAgICAgcmV0dXJuIHMtPmN0eC0+Y2lwaGVyX2xpc3QtPmNpcGhlcnM7CiAgIH0KQEAgLTE0NDksMjEgKzExOTksNyBAQAogICBpZiAoc2sgPT0gTlVMTCkgewogICAgIHJldHVybiAwOwogICB9IGVsc2UgaWYgKHNrX1NTTF9DSVBIRVJfbnVtKHNrKSA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9OT19DSVBIRVJfTUFUQ0gpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdF90bHMxMChTU0xfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKnN0cikgewotICBTVEFDS19PRihTU0xfQ0lQSEVSKSAqc2s7Ci0KLSAgc2sgPSBzc2xfY3JlYXRlX2NpcGhlcl9saXN0KGN0eC0+bWV0aG9kLCAmY3R4LT5jaXBoZXJfbGlzdF90bHMxMCwgTlVMTCwgc3RyKTsKLSAgaWYgKHNrID09IE5VTEwpIHsKLSAgICByZXR1cm4gMDsKLSAgfSBlbHNlIGlmIChza19TU0xfQ0lQSEVSX251bShzaykgPT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfTk9fQ0lQSEVSX01BVENIKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9DVFhfc2V0X2NpcGhlcl9saXN0LCBTU0xfUl9OT19DSVBIRVJfTUFUQ0gpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTE0NzcsNyArMTIxMyw4IEBACiAgIGlmIChzayA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0gZWxzZSBpZiAoc2tfU1NMX0NJUEhFUl9udW0oc2spID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX05PX0NJUEhFUl9NQVRDSCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdF90bHMxMSwKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9OT19DSVBIRVJfTUFUQ0gpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTE0OTUsNyArMTIzMiw3IEBACiAgIGlmIChzayA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0gZWxzZSBpZiAoc2tfU1NMX0NJUEhFUl9udW0oc2spID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX05PX0NJUEhFUl9NQVRDSCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfc2V0X2NpcGhlcl9saXN0LCBTU0xfUl9OT19DSVBIRVJfTUFUQ0gpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTE1MzEsMTMgKzEyNjgsOSBAQAogICAgIHJldHVybiAwOwogICB9CiAKLSAgLyogRm9yIFNTTHYzLCB0aGUgU0NTViBpcyBhZGRlZC4gT3RoZXJ3aXNlIHRoZSByZW5lZ290aWF0aW9uIGV4dGVuc2lvbiBpcwotICAgKiBhZGRlZC4gKi8KLSAgaWYgKHMtPmNsaWVudF92ZXJzaW9uID09IFNTTDNfVkVSU0lPTiAmJgotICAgICAgIXMtPnMzLT5pbml0aWFsX2hhbmRzaGFrZV9jb21wbGV0ZSkgeworICAvKiBBZGQgU0NTVnMuICovCisgIGlmICghcy0+czMtPmluaXRpYWxfaGFuZHNoYWtlX2NvbXBsZXRlKSB7CiAgICAgczJuKFNTTDNfQ0tfU0NTViAmIDB4ZmZmZiwgcCk7Ci0gICAgLyogVGhlIHJlbmVnb3RpYXRpb24gZXh0ZW5zaW9uIGlzIHJlcXVpcmVkIHRvIGJlIGF0IGluZGV4IHplcm8uICovCi0gICAgcy0+czMtPnRtcC5leHRlbnNpb25zLnNlbnQgfD0gKDF1IDw8IDApOwogICB9CiAKICAgaWYgKHMtPm1vZGUgJiBTU0xfTU9ERV9TRU5EX0ZBTExCQUNLX1NDU1YpIHsKQEAgLTE1NTcsMTMgKzEyOTAsMTQgQEAKICAgfQogCiAgIGlmIChDQlNfbGVuKCZjaXBoZXJfc3VpdGVzKSAlIDIgIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfRVJST1JfSU5fUkVDRUlWRURfQ0lQSEVSX0xJU1QpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX2J5dGVzX3RvX2NpcGhlcl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX0VSUk9SX0lOX1JFQ0VJVkVEX0NJUEhFUl9MSVNUKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCiAgIHNrID0gc2tfU1NMX0NJUEhFUl9uZXdfbnVsbCgpOwogICBpZiAoc2sgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX2J5dGVzX3RvX2NpcGhlcl9saXN0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMTU3MSw3ICsxMzA1LDcgQEAKICAgICB1aW50MTZfdCBjaXBoZXJfc3VpdGU7CiAKICAgICBpZiAoIUNCU19nZXRfdTE2KCZjaXBoZXJfc3VpdGVzLCAmY2lwaGVyX3N1aXRlKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9ieXRlc190b19jaXBoZXJfbGlzdCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogCkBAIC0xNTc5LDcgKzEzMTMsOCBAQAogICAgIGlmIChzLT5zMyAmJiBjaXBoZXJfc3VpdGUgPT0gKFNTTDNfQ0tfU0NTViAmIDB4ZmZmZikpIHsKICAgICAgIC8qIFNDU1YgaXMgZmF0YWwgaWYgcmVuZWdvdGlhdGluZy4gKi8KICAgICAgIGlmIChzLT5zMy0+aW5pdGlhbF9oYW5kc2hha2VfY29tcGxldGUpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9TQ1NWX1JFQ0VJVkVEX1dIRU5fUkVORUdPVElBVElORyk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX2J5dGVzX3RvX2NpcGhlcl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9TQ1NWX1JFQ0VJVkVEX1dIRU5fUkVORUdPVElBVElORyk7CiAgICAgICAgIHNzbDNfc2VuZF9hbGVydChzLCBTU0wzX0FMX0ZBVEFMLCBTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkUpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KQEAgLTE1OTIsNyArMTMyNyw4IEBACiAgICAgICB1aW50MTZfdCBtYXhfdmVyc2lvbiA9IHNzbDNfZ2V0X21heF9zZXJ2ZXJfdmVyc2lvbihzKTsKICAgICAgIGlmIChTU0xfSVNfRFRMUyhzKSA/ICh1aW50MTZfdClzLT52ZXJzaW9uID4gbWF4X3ZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICA6ICh1aW50MTZfdClzLT52ZXJzaW9uIDwgbWF4X3ZlcnNpb24pIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9JTkFQUFJPUFJJQVRFX0ZBTExCQUNLKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfYnl0ZXNfdG9fY2lwaGVyX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX0lOQVBQUk9QUklBVEVfRkFMTEJBQ0spOwogICAgICAgICBzc2wzX3NlbmRfYWxlcnQocywgU1NMM19BTF9GQVRBTCwgU1NMM19BRF9JTkFQUFJPUFJJQVRFX0ZBTExCQUNLKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CkBAIC0xNjAxLDcgKzEzMzcsNyBAQAogCiAgICAgYyA9IFNTTF9nZXRfY2lwaGVyX2J5X3ZhbHVlKGNpcGhlcl9zdWl0ZSk7CiAgICAgaWYgKGMgIT0gTlVMTCAmJiAhc2tfU1NMX0NJUEhFUl9wdXNoKHNrLCBjKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9ieXRlc190b19jaXBoZXJfbGlzdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9CkBAIC0xNjc5LDM3ICsxNDE1LDM5IEBACiAgICpvdXRfbGVuID0gc2Vzc2lvbi0+b2NzcF9yZXNwb25zZV9sZW5ndGg7CiB9CiAKLWludCBTU0xfQ1RYX3NldF9zaWduZWRfY2VydF90aW1lc3RhbXBfbGlzdChTU0xfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxpc3RfbGVuKSB7Ci0gIE9QRU5TU0xfZnJlZShjdHgtPnNpZ25lZF9jZXJ0X3RpbWVzdGFtcF9saXN0KTsKLSAgY3R4LT5zaWduZWRfY2VydF90aW1lc3RhbXBfbGlzdF9sZW5ndGggPSAwOwotCi0gIGN0eC0+c2lnbmVkX2NlcnRfdGltZXN0YW1wX2xpc3QgPSBCVUZfbWVtZHVwKGxpc3QsIGxpc3RfbGVuKTsKLSAgaWYgKGN0eC0+c2lnbmVkX2NlcnRfdGltZXN0YW1wX2xpc3QgPT0gTlVMTCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGN0eC0+c2lnbmVkX2NlcnRfdGltZXN0YW1wX2xpc3RfbGVuZ3RoID0gbGlzdF9sZW47Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBTU0xfQ1RYX3NldF9vY3NwX3Jlc3BvbnNlKFNTTF9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVzcG9uc2VfbGVuKSB7Ci0gIE9QRU5TU0xfZnJlZShjdHgtPm9jc3BfcmVzcG9uc2UpOwotICBjdHgtPm9jc3BfcmVzcG9uc2VfbGVuZ3RoID0gMDsKLQotICBjdHgtPm9jc3BfcmVzcG9uc2UgPSBCVUZfbWVtZHVwKHJlc3BvbnNlLCByZXNwb25zZV9sZW4pOwotICBpZiAoY3R4LT5vY3NwX3Jlc3BvbnNlID09IE5VTEwpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBjdHgtPm9jc3BfcmVzcG9uc2VfbGVuZ3RoID0gcmVzcG9uc2VfbGVuOwotCi0gIHJldHVybiAxOwotfQotCi1pbnQgU1NMX3NlbGVjdF9uZXh0X3Byb3RvKHVpbnQ4X3QgKipvdXQsIHVpbnQ4X3QgKm91dF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNlcnZlciwgdW5zaWduZWQgc2VydmVyX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY2xpZW50LCB1bnNpZ25lZCBjbGllbnRfbGVuKSB7CisvKiBTU0xfc2VsZWN0X25leHRfcHJvdG8gaW1wbGVtZW50cyB0aGUgc3RhbmRhcmQgcHJvdG9jb2wgc2VsZWN0aW9uLiBJdCBpcworICogZXhwZWN0ZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBjYWxsYmFjayBzZXQgYnkKKyAqIFNTTF9DVFhfc2V0X25leHRfcHJvdG9fc2VsZWN0X2NiLgorICoKKyAqIFRoZSBwcm90b2NvbCBkYXRhIGlzIGFzc3VtZWQgdG8gYmUgYSB2ZWN0b3Igb2YgOC1iaXQsIGxlbmd0aCBwcmVmaXhlZCBieXRlCisgKiBzdHJpbmdzLiBUaGUgbGVuZ3RoIGJ5dGUgaXRzZWxmIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbGVuZ3RoLiBBIGJ5dGUKKyAqIHN0cmluZyBvZiBsZW5ndGggMCBpcyBpbnZhbGlkLiBObyBieXRlIHN0cmluZyBtYXkgYmUgdHJ1bmNhdGVkLgorICoKKyAqIFRoZSBjdXJyZW50LCBidXQgZXhwZXJpbWVudGFsIGFsZ29yaXRobSBmb3Igc2VsZWN0aW5nIHRoZSBwcm90b2NvbCBpczoKKyAqCisgKiAxKSBJZiB0aGUgc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCBOUE4gdGhlbiB0aGlzIGlzIGluZGljYXRlZCB0byB0aGUKKyAqIGNhbGxiYWNrLiBJbiB0aGlzIGNhc2UsIHRoZSBjbGllbnQgYXBwbGljYXRpb24gaGFzIHRvIGFib3J0IHRoZSBjb25uZWN0aW9uCisgKiBvciBoYXZlIGEgZGVmYXVsdCBhcHBsaWNhdGlvbiBsZXZlbCBwcm90b2NvbC4KKyAqCisgKiAyKSBJZiB0aGUgc2VydmVyIHN1cHBvcnRzIE5QTiwgYnV0IGFkdmVydGlzZXMgYW4gZW1wdHkgbGlzdCB0aGVuIHRoZQorICogY2xpZW50IHNlbGVjdHMgdGhlIGZpcnN0IHByb3Rjb2wgaW4gaXRzIGxpc3QsIGJ1dCBpbmRpY2F0ZXMgdmlhIHRoZQorICogQVBJIHRoYXQgdGhpcyBmYWxsYmFjayBjYXNlIHdhcyBlbmFjdGVkLgorICoKKyAqIDMpIE90aGVyd2lzZSwgdGhlIGNsaWVudCBmaW5kcyB0aGUgZmlyc3QgcHJvdG9jb2wgaW4gdGhlIHNlcnZlcidzIGxpc3QKKyAqIHRoYXQgaXQgc3VwcG9ydHMgYW5kIHNlbGVjdHMgdGhpcyBwcm90b2NvbC4gVGhpcyBpcyBiZWNhdXNlIGl0J3MKKyAqIGFzc3VtZWQgdGhhdCB0aGUgc2VydmVyIGhhcyBiZXR0ZXIgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggcHJvdG9jb2wKKyAqIGEgY2xpZW50IHNob3VsZCB1c2UuCisgKgorICogNCkgSWYgdGhlIGNsaWVudCBkb2Vzbid0IHN1cHBvcnQgYW55IG9mIHRoZSBzZXJ2ZXIncyBhZHZlcnRpc2VkCisgKiBwcm90b2NvbHMsIHRoZW4gdGhpcyBpcyB0cmVhdGVkIHRoZSBzYW1lIGFzIGNhc2UgMi4KKyAqCisgKiBJdCByZXR1cm5zIGVpdGhlcgorICogT1BFTlNTTF9OUE5fTkVHT1RJQVRFRCBpZiBhIGNvbW1vbiBwcm90b2NvbCB3YXMgZm91bmQsIG9yCisgKiBPUEVOU1NMX05QTl9OT19PVkVSTEFQIGlmIHRoZSBmYWxsYmFjayBjYXNlIHdhcyByZWFjaGVkLgorICovCitpbnQgU1NMX3NlbGVjdF9uZXh0X3Byb3RvKHVpbnQ4X3QgKipvdXQsIHVpbnQ4X3QgKm91dGxlbiwgY29uc3QgdWludDhfdCAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2VydmVyX2xlbiwgY29uc3QgdWludDhfdCAqY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2xpZW50X2xlbikgewogICB1bnNpZ25lZCBpbnQgaSwgajsKICAgY29uc3QgdWludDhfdCAqcmVzdWx0OwogICBpbnQgc3RhdHVzID0gT1BFTlNTTF9OUE5fVU5TVVBQT1JURUQ7CkBAIC0xNzM3LDMxICsxNDc1LDU3IEBACiAKIGZvdW5kOgogICAqb3V0ID0gKHVpbnQ4X3QgKilyZXN1bHQgKyAxOwotICAqb3V0X2xlbiA9IHJlc3VsdFswXTsKKyAgKm91dGxlbiA9IHJlc3VsdFswXTsKICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBTU0xfZ2V0MF9uZXh0X3Byb3RvX25lZ290aWF0ZWQoY29uc3QgU1NMICpzc2wsIGNvbnN0IHVpbnQ4X3QgKipvdXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpvdXRfbGVuKSB7Ci0gICpvdXRfZGF0YSA9IHNzbC0+bmV4dF9wcm90b19uZWdvdGlhdGVkOwotICBpZiAoKm91dF9kYXRhID09IE5VTEwpIHsKLSAgICAqb3V0X2xlbiA9IDA7CisvKiBTU0xfZ2V0MF9uZXh0X3Byb3RvX25lZ290aWF0ZWQgc2V0cyAqZGF0YSBhbmQgKmxlbiB0byBwb2ludCB0byB0aGUgY2xpZW50J3MKKyAqIHJlcXVlc3RlZCBwcm90b2NvbCBmb3IgdGhpcyBjb25uZWN0aW9uIGFuZCByZXR1cm5zIDAuIElmIHRoZSBjbGllbnQgZGlkbid0CisgKiByZXF1ZXN0IGFueSBwcm90b2NvbCwgdGhlbiAqZGF0YSBpcyBzZXQgdG8gTlVMTC4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGNsaWVudCBjYW4gcmVxdWVzdCBhbnkgcHJvdG9jb2wgaXQgY2hvb3Nlcy4gVGhlIHZhbHVlIHJldHVybmVkCisgKiBmcm9tIHRoaXMgZnVuY3Rpb24gbmVlZCBub3QgYmUgYSBtZW1iZXIgb2YgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHByb3RvY29scworICogcHJvdmlkZWQgYnkgdGhlIGNhbGxiYWNrLiAqLwordm9pZCBTU0xfZ2V0MF9uZXh0X3Byb3RvX25lZ290aWF0ZWQoY29uc3QgU1NMICpzLCBjb25zdCB1aW50OF90ICoqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpsZW4pIHsKKyAgKmRhdGEgPSBzLT5uZXh0X3Byb3RvX25lZ290aWF0ZWQ7CisgIGlmICghKmRhdGEpIHsKKyAgICAqbGVuID0gMDsKICAgfSBlbHNlIHsKLSAgICAqb3V0X2xlbiA9IHNzbC0+bmV4dF9wcm90b19uZWdvdGlhdGVkX2xlbjsKKyAgICAqbGVuID0gcy0+bmV4dF9wcm90b19uZWdvdGlhdGVkX2xlbjsKICAgfQogfQogCisvKiBTU0xfQ1RYX3NldF9uZXh0X3Byb3Rvc19hZHZlcnRpc2VkX2NiIHNldHMgYSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCB3aGVuIGEKKyAqIFRMUyBzZXJ2ZXIgbmVlZHMgYSBsaXN0IG9mIHN1cHBvcnRlZCBwcm90b2NvbHMgZm9yIE5leHQgUHJvdG9jb2wKKyAqIE5lZ290aWF0aW9uLiBUaGUgcmV0dXJuZWQgbGlzdCBtdXN0IGJlIGluIHdpcmUgZm9ybWF0LiAgVGhlIGxpc3QgaXMgcmV0dXJuZWQKKyAqIGJ5IHNldHRpbmcgfG91dHwgdG8gcG9pbnQgdG8gaXQgYW5kIHxvdXRsZW58IHRvIGl0cyBsZW5ndGguIFRoaXMgbWVtb3J5IHdpbGwKKyAqIG5vdCBiZSBtb2RpZmllZCwgYnV0IG9uZSBzaG91bGQgYXNzdW1lIHRoYXQgdGhlIFNTTCoga2VlcHMgYSByZWZlcmVuY2UgdG8KKyAqIGl0LgorICoKKyAqIFRoZSBjYWxsYmFjayBzaG91bGQgcmV0dXJuIFNTTF9UTFNFWFRfRVJSX09LIGlmIGl0IHdpc2hlcyB0byBhZHZlcnRpc2UuCisgKiBPdGhlcndpc2UsIG5vIHN1Y2ggZXh0ZW5zaW9uIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIFNlcnZlckhlbGxvLiAqLwogdm9pZCBTU0xfQ1RYX3NldF9uZXh0X3Byb3Rvc19hZHZlcnRpc2VkX2NiKAogICAgIFNTTF9DVFggKmN0eCwKLSAgICBpbnQgKCpjYikoU1NMICpzc2wsIGNvbnN0IHVpbnQ4X3QgKipvdXQsIHVuc2lnbmVkICpvdXRfbGVuLCB2b2lkICphcmcpLAorICAgIGludCAoKmNiKShTU0wgKnNzbCwgY29uc3QgdWludDhfdCAqKm91dCwgdW5zaWduZWQgaW50ICpvdXRsZW4sIHZvaWQgKmFyZyksCiAgICAgdm9pZCAqYXJnKSB7CiAgIGN0eC0+bmV4dF9wcm90b3NfYWR2ZXJ0aXNlZF9jYiA9IGNiOwogICBjdHgtPm5leHRfcHJvdG9zX2FkdmVydGlzZWRfY2JfYXJnID0gYXJnOwogfQogCisvKiBTU0xfQ1RYX3NldF9uZXh0X3Byb3RvX3NlbGVjdF9jYiBzZXRzIGEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2hlbiBhCisgKiBjbGllbnQgbmVlZHMgdG8gc2VsZWN0IGEgcHJvdG9jb2wgZnJvbSB0aGUgc2VydmVyJ3MgcHJvdmlkZWQgbGlzdC4gfG91dHwKKyAqIG11c3QgYmUgc2V0IHRvIHBvaW50IHRvIHRoZSBzZWxlY3RlZCBwcm90b2NvbCAod2hpY2ggbWF5IGJlIHdpdGhpbiB8aW58KS4KKyAqIFRoZSBsZW5ndGggb2YgdGhlIHByb3RvY29sIG5hbWUgbXVzdCBiZSB3cml0dGVuIGludG8gfG91dGxlbnwuIFRoZSBzZXJ2ZXIncworICogYWR2ZXJ0aXNlZCBwcm90b2NvbHMgYXJlIHByb3ZpZGVkIGluIHxpbnwgYW5kIHxpbmxlbnwuIFRoZSBjYWxsYmFjayBjYW4KKyAqIGFzc3VtZSB0aGF0IHxpbnwgaXMgc3ludGFjdGljYWxseSB2YWxpZC4KKyAqCisgKiBUaGUgY2xpZW50IG11c3Qgc2VsZWN0IGEgcHJvdG9jb2wuIEl0IGlzIGZhdGFsIHRvIHRoZSBjb25uZWN0aW9uIGlmIHRoaXMKKyAqIGNhbGxiYWNrIHJldHVybnMgYSB2YWx1ZSBvdGhlciB0aGFuIFNTTF9UTFNFWFRfRVJSX09LLgorICovCiB2b2lkIFNTTF9DVFhfc2V0X25leHRfcHJvdG9fc2VsZWN0X2NiKAotICAgIFNTTF9DVFggKmN0eCwgaW50ICgqY2IpKFNTTCAqc3NsLCB1aW50OF90ICoqb3V0LCB1aW50OF90ICpvdXRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCB1bnNpZ25lZCBpbl9sZW4sIHZvaWQgKmFyZyksCisgICAgU1NMX0NUWCAqY3R4LCBpbnQgKCpjYikoU1NMICpzLCB1aW50OF90ICoqb3V0LCB1aW50OF90ICpvdXRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHVuc2lnbmVkIGludCBpbmxlbiwgdm9pZCAqYXJnKSwKICAgICB2b2lkICphcmcpIHsKICAgY3R4LT5uZXh0X3Byb3RvX3NlbGVjdF9jYiA9IGNiOwogICBjdHgtPm5leHRfcHJvdG9fc2VsZWN0X2NiX2FyZyA9IGFyZzsKQEAgLTE3OTAsMjUgKzE1NTQsMzIgQEAKICAgcmV0dXJuIDA7CiB9CiAKKy8qIFNTTF9DVFhfc2V0X2FscG5fc2VsZWN0X2NiIHNldHMgYSBjYWxsYmFjayBmdW5jdGlvbiBvbiB8Y3R4fCB0aGF0IGlzIGNhbGxlZAorICogZHVyaW5nIENsaWVudEhlbGxvIHByb2Nlc3NpbmcgaW4gb3JkZXIgdG8gc2VsZWN0IGFuIEFMUE4gcHJvdG9jb2wgZnJvbSB0aGUKKyAqIGNsaWVudCdzIGxpc3Qgb2Ygb2ZmZXJlZCBwcm90b2NvbHMuICovCiB2b2lkIFNTTF9DVFhfc2V0X2FscG5fc2VsZWN0X2NiKFNTTF9DVFggKmN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqY2IpKFNTTCAqc3NsLCBjb25zdCB1aW50OF90ICoqb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqb3V0X2xlbiwgY29uc3QgdWludDhfdCAqaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbl9sZW4sIHZvaWQgKmFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpvdXRsZW4sIGNvbnN0IHVpbnQ4X3QgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlubGVuLCB2b2lkICphcmcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpIHsKICAgY3R4LT5hbHBuX3NlbGVjdF9jYiA9IGNiOwogICBjdHgtPmFscG5fc2VsZWN0X2NiX2FyZyA9IGFyZzsKIH0KIAotdm9pZCBTU0xfZ2V0MF9hbHBuX3NlbGVjdGVkKGNvbnN0IFNTTCAqc3NsLCBjb25zdCB1aW50OF90ICoqb3V0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKm91dF9sZW4pIHsKLSAgKm91dF9kYXRhID0gTlVMTDsKKy8qIFNTTF9nZXQwX2FscG5fc2VsZWN0ZWQgZ2V0cyB0aGUgc2VsZWN0ZWQgQUxQTiBwcm90b2NvbCAoaWYgYW55KSBmcm9tIHxzc2x8LgorICogT24gcmV0dXJuIGl0IHNldHMgfCpkYXRhfCB0byBwb2ludCB0byB8KmxlbnwgYnl0ZXMgb2YgcHJvdG9jb2wgbmFtZSAobm90CisgKiBpbmNsdWRpbmcgdGhlIGxlYWRpbmcgbGVuZ3RoLXByZWZpeCBieXRlKS4gSWYgdGhlIHNlcnZlciBkaWRuJ3QgcmVzcG9uZCB3aXRoCisgKiBhIG5lZ290aWF0ZWQgcHJvdG9jb2wgdGhlbiB8Kmxlbnwgd2lsbCBiZSB6ZXJvLiAqLwordm9pZCBTU0xfZ2V0MF9hbHBuX3NlbGVjdGVkKGNvbnN0IFNTTCAqc3NsLCBjb25zdCB1aW50OF90ICoqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqbGVuKSB7CisgICpkYXRhID0gTlVMTDsKICAgaWYgKHNzbC0+czMpIHsKLSAgICAqb3V0X2RhdGEgPSBzc2wtPnMzLT5hbHBuX3NlbGVjdGVkOworICAgICpkYXRhID0gc3NsLT5zMy0+YWxwbl9zZWxlY3RlZDsKICAgfQotICBpZiAoKm91dF9kYXRhID09IE5VTEwpIHsKLSAgICAqb3V0X2xlbiA9IDA7CisgIGlmICgqZGF0YSA9PSBOVUxMKSB7CisgICAgKmxlbiA9IDA7CiAgIH0gZWxzZSB7Ci0gICAgKm91dF9sZW4gPSBzc2wtPnMzLT5hbHBuX3NlbGVjdGVkX2xlbjsKKyAgICAqbGVuID0gc3NsLT5zMy0+YWxwbl9zZWxlY3RlZF9sZW47CiAgIH0KIH0KIApAQCAtMTgyNCw5ICsxNTk1LDIxMCBAQAogICAgICAgcywgb3V0LCBvdXRfbGVuLCBsYWJlbCwgbGFiZWxfbGVuLCBjb250ZXh0LCBjb250ZXh0X2xlbiwgdXNlX2NvbnRleHQpOwogfQogCitzdGF0aWMgdWludDMyX3Qgc3NsX3Nlc3Npb25faGFzaChjb25zdCBTU0xfU0VTU0lPTiAqYSkgeworICB1aW50MzJfdCBoYXNoID0KKyAgICAgICgodWludDMyX3QpYS0+c2Vzc2lvbl9pZFswXSkgfHwKKyAgICAgICgodWludDMyX3QpYS0+c2Vzc2lvbl9pZFsxXSA8PCA4KSB8fAorICAgICAgKCh1aW50MzJfdClhLT5zZXNzaW9uX2lkWzJdIDw8IDE2KSB8fAorICAgICAgKCh1aW50MzJfdClhLT5zZXNzaW9uX2lkWzNdIDw8IDI0KTsKKworICByZXR1cm4gaGFzaDsKK30KKworLyogTkI6IElmIHRoaXMgZnVuY3Rpb24gKG9yIGluZGVlZCB0aGUgaGFzaCBmdW5jdGlvbiB3aGljaCB1c2VzIGEgc29ydCBvZgorICogY29hcnNlciBmdW5jdGlvbiB0aGFuIHRoaXMgb25lKSBpcyBjaGFuZ2VkLCBlbnN1cmUKKyAqIFNTTF9DVFhfaGFzX21hdGNoaW5nX3Nlc3Npb25faWQoKSBpcyBjaGVja2VkIGFjY29yZGluZ2x5LiBJdCByZWxpZXMgb24gYmVpbmcKKyAqIGFibGUgdG8gY29uc3RydWN0IGFuIFNTTF9TRVNTSU9OIHRoYXQgd2lsbCBjb2xsaWRlIHdpdGggYW55IGV4aXN0aW5nIHNlc3Npb24KKyAqIHdpdGggYSBtYXRjaGluZyBzZXNzaW9uIElELiAqLworc3RhdGljIGludCBzc2xfc2Vzc2lvbl9jbXAoY29uc3QgU1NMX1NFU1NJT04gKmEsIGNvbnN0IFNTTF9TRVNTSU9OICpiKSB7CisgIGlmIChhLT5zc2xfdmVyc2lvbiAhPSBiLT5zc2xfdmVyc2lvbikgeworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKGEtPnNlc3Npb25faWRfbGVuZ3RoICE9IGItPnNlc3Npb25faWRfbGVuZ3RoKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICByZXR1cm4gbWVtY21wKGEtPnNlc3Npb25faWQsIGItPnNlc3Npb25faWQsIGEtPnNlc3Npb25faWRfbGVuZ3RoKTsKK30KKworU1NMX0NUWCAqU1NMX0NUWF9uZXcoY29uc3QgU1NMX01FVEhPRCAqbWV0aG9kKSB7CisgIFNTTF9DVFggKnJldCA9IE5VTEw7CisKKyAgaWYgKG1ldGhvZCA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfQ1RYX25ldywgU1NMX1JfTlVMTF9TU0xfTUVUSE9EX1BBU1NFRCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAoU1NMX2dldF9leF9kYXRhX1g1MDlfU1RPUkVfQ1RYX2lkeCgpIDwgMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX0NUWF9uZXcsIFNTTF9SX1g1MDlfVkVSSUZJQ0FUSU9OX1NFVFVQX1BST0JMRU1TKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIHJldCA9IChTU0xfQ1RYICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFNTTF9DVFgpKTsKKyAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBtZW1zZXQocmV0LCAwLCBzaXplb2YoU1NMX0NUWCkpOworCisgIHJldC0+bWV0aG9kID0gbWV0aG9kLT5tZXRob2Q7CisKKyAgQ1JZUFRPX01VVEVYX2luaXQoJnJldC0+bG9jayk7CisKKyAgcmV0LT5jZXJ0X3N0b3JlID0gTlVMTDsKKyAgcmV0LT5zZXNzaW9uX2NhY2hlX21vZGUgPSBTU0xfU0VTU19DQUNIRV9TRVJWRVI7CisgIHJldC0+c2Vzc2lvbl9jYWNoZV9zaXplID0gU1NMX1NFU1NJT05fQ0FDSEVfTUFYX1NJWkVfREVGQVVMVDsKKyAgcmV0LT5zZXNzaW9uX2NhY2hlX2hlYWQgPSBOVUxMOworICByZXQtPnNlc3Npb25fY2FjaGVfdGFpbCA9IE5VTEw7CisKKyAgLyogV2UgdGFrZSB0aGUgc3lzdGVtIGRlZmF1bHQgKi8KKyAgcmV0LT5zZXNzaW9uX3RpbWVvdXQgPSBTU0xfREVGQVVMVF9TRVNTSU9OX1RJTUVPVVQ7CisKKyAgcmV0LT5uZXdfc2Vzc2lvbl9jYiA9IDA7CisgIHJldC0+cmVtb3ZlX3Nlc3Npb25fY2IgPSAwOworICByZXQtPmdldF9zZXNzaW9uX2NiID0gMDsKKyAgcmV0LT5nZW5lcmF0ZV9zZXNzaW9uX2lkID0gMDsKKworICByZXQtPnJlZmVyZW5jZXMgPSAxOworICByZXQtPnF1aWV0X3NodXRkb3duID0gMDsKKworICByZXQtPmluZm9fY2FsbGJhY2sgPSBOVUxMOworCisgIHJldC0+YXBwX3ZlcmlmeV9jYWxsYmFjayA9IDA7CisgIHJldC0+YXBwX3ZlcmlmeV9hcmcgPSBOVUxMOworCisgIHJldC0+bWF4X2NlcnRfbGlzdCA9IFNTTF9NQVhfQ0VSVF9MSVNUX0RFRkFVTFQ7CisgIHJldC0+bXNnX2NhbGxiYWNrID0gMDsKKyAgcmV0LT5tc2dfY2FsbGJhY2tfYXJnID0gTlVMTDsKKyAgcmV0LT52ZXJpZnlfbW9kZSA9IFNTTF9WRVJJRllfTk9ORTsKKyAgcmV0LT5zaWRfY3R4X2xlbmd0aCA9IDA7CisgIHJldC0+ZGVmYXVsdF92ZXJpZnlfY2FsbGJhY2sgPSBOVUxMOworICByZXQtPmNlcnQgPSBzc2xfY2VydF9uZXcoKTsKKyAgaWYgKHJldC0+Y2VydCA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICByZXQtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrID0gMDsKKyAgcmV0LT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFja191c2VyZGF0YSA9IE5VTEw7CisgIHJldC0+Y2xpZW50X2NlcnRfY2IgPSAwOworCisgIHJldC0+c2Vzc2lvbnMgPSBsaF9TU0xfU0VTU0lPTl9uZXcoc3NsX3Nlc3Npb25faGFzaCwgc3NsX3Nlc3Npb25fY21wKTsKKyAgaWYgKHJldC0+c2Vzc2lvbnMgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisgIHJldC0+Y2VydF9zdG9yZSA9IFg1MDlfU1RPUkVfbmV3KCk7CisgIGlmIChyZXQtPmNlcnRfc3RvcmUgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgc3NsX2NyZWF0ZV9jaXBoZXJfbGlzdChyZXQtPm1ldGhvZCwgJnJldC0+Y2lwaGVyX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnJldC0+Y2lwaGVyX2xpc3RfYnlfaWQsIFNTTF9ERUZBVUxUX0NJUEhFUl9MSVNUKTsKKyAgaWYgKHJldC0+Y2lwaGVyX2xpc3QgPT0gTlVMTCB8fAorICAgICAgc2tfU1NMX0NJUEhFUl9udW0ocmV0LT5jaXBoZXJfbGlzdC0+Y2lwaGVycykgPD0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX0NUWF9uZXcsIFNTTF9SX0xJQlJBUllfSEFTX05PX0NJUEhFUlMpOworICAgIGdvdG8gZXJyMjsKKyAgfQorCisgIHJldC0+cGFyYW0gPSBYNTA5X1ZFUklGWV9QQVJBTV9uZXcoKTsKKyAgaWYgKCFyZXQtPnBhcmFtKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICByZXQtPmNsaWVudF9DQSA9IHNrX1g1MDlfTkFNRV9uZXdfbnVsbCgpOworICBpZiAocmV0LT5jbGllbnRfQ0EgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgQ1JZUFRPX25ld19leF9kYXRhKCZnX2V4X2RhdGFfY2xhc3Nfc3NsX2N0eCwgcmV0LCAmcmV0LT5leF9kYXRhKTsKKworICByZXQtPmV4dHJhX2NlcnRzID0gTlVMTDsKKworICByZXQtPm1heF9zZW5kX2ZyYWdtZW50ID0gU1NMM19SVF9NQVhfUExBSU5fTEVOR1RIOworCisgIHJldC0+dGxzZXh0X3NlcnZlcm5hbWVfY2FsbGJhY2sgPSAwOworICByZXQtPnRsc2V4dF9zZXJ2ZXJuYW1lX2FyZyA9IE5VTEw7CisgIC8qIFNldHVwIFJGQzQ1MDcgdGlja2V0IGtleXMgKi8KKyAgaWYgKCFSQU5EX2J5dGVzKHJldC0+dGxzZXh0X3RpY2tfa2V5X25hbWUsIDE2KSB8fAorICAgICAgIVJBTkRfYnl0ZXMocmV0LT50bHNleHRfdGlja19obWFjX2tleSwgMTYpIHx8CisgICAgICAhUkFORF9ieXRlcyhyZXQtPnRsc2V4dF90aWNrX2Flc19rZXksIDE2KSkgeworICAgIHJldC0+b3B0aW9ucyB8PSBTU0xfT1BfTk9fVElDS0VUOworICB9CisKKyAgcmV0LT5uZXh0X3Byb3Rvc19hZHZlcnRpc2VkX2NiID0gMDsKKyAgcmV0LT5uZXh0X3Byb3RvX3NlbGVjdF9jYiA9IDA7CisgIHJldC0+cHNrX2lkZW50aXR5X2hpbnQgPSBOVUxMOworICByZXQtPnBza19jbGllbnRfY2FsbGJhY2sgPSBOVUxMOworICByZXQtPnBza19zZXJ2ZXJfY2FsbGJhY2sgPSBOVUxMOworCisgIC8qIERlZmF1bHQgaXMgdG8gY29ubmVjdCB0byBub24tUkkgc2VydmVycy4gV2hlbiBSSSBpcyBtb3JlIHdpZGVseSBkZXBsb3llZAorICAgKiBtaWdodCBjaGFuZ2UgdGhpcy4gKi8KKyAgcmV0LT5vcHRpb25zIHw9IFNTTF9PUF9MRUdBQ1lfU0VSVkVSX0NPTk5FQ1Q7CisKKyAgLyogTG9jayB0aGUgU1NMX0NUWCB0byB0aGUgc3BlY2lmaWVkIHZlcnNpb24sIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5CisgICAqIHVzZXMgb2YgU1NMX01FVEhPRC4gKi8KKyAgaWYgKG1ldGhvZC0+dmVyc2lvbiAhPSAwKSB7CisgICAgU1NMX0NUWF9zZXRfbWF4X3ZlcnNpb24ocmV0LCBtZXRob2QtPnZlcnNpb24pOworICAgIFNTTF9DVFhfc2V0X21pbl92ZXJzaW9uKHJldCwgbWV0aG9kLT52ZXJzaW9uKTsKKyAgfQorCisgIHJldHVybiByZXQ7CisKK2VycjoKKyAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfQ1RYX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworZXJyMjoKKyAgU1NMX0NUWF9mcmVlKHJldCk7CisgIHJldHVybiBOVUxMOworfQorCit2b2lkIFNTTF9DVFhfZnJlZShTU0xfQ1RYICpjdHgpIHsKKyAgaWYgKGN0eCA9PSBOVUxMIHx8CisgICAgICAhQ1JZUFRPX3JlZmNvdW50X2RlY19hbmRfdGVzdF96ZXJvKCZjdHgtPnJlZmVyZW5jZXMpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgWDUwOV9WRVJJRllfUEFSQU1fZnJlZShjdHgtPnBhcmFtKTsKKworICAvKiBGcmVlIGludGVybmFsIHNlc3Npb24gY2FjaGUuIEhvd2V2ZXI6IHRoZSByZW1vdmVfY2IoKSBtYXkgcmVmZXJlbmNlIHRoZQorICAgKiBleF9kYXRhIG9mIFNTTF9DVFgsIHRodXMgdGhlIGV4X2RhdGEgc3RvcmUgY2FuIG9ubHkgYmUgcmVtb3ZlZCBhZnRlciB0aGUKKyAgICogc2Vzc2lvbnMgd2VyZSBmbHVzaGVkLiBBcyB0aGUgZXhfZGF0YSBoYW5kbGluZyByb3V0aW5lcyBtaWdodCBhbHNvIHRvdWNoCisgICAqIHRoZSBzZXNzaW9uIGNhY2hlLCB0aGUgbW9zdCBzZWN1cmUgc29sdXRpb24gc2VlbXMgdG8gYmU6IGVtcHR5IChmbHVzaCkgdGhlCisgICAqIGNhY2hlLCB0aGVuIGZyZWUgZXhfZGF0YSwgdGhlbiBmaW5hbGx5IGZyZWUgdGhlIGNhY2hlLiAoU2VlIHRpY2tldAorICAgKiBbb3BlbnNzbC5vcmcgIzIxMl0uKSAqLworICBTU0xfQ1RYX2ZsdXNoX3Nlc3Npb25zKGN0eCwgMCk7CisKKyAgQ1JZUFRPX2ZyZWVfZXhfZGF0YSgmZ19leF9kYXRhX2NsYXNzX3NzbF9jdHgsIGN0eCwgJmN0eC0+ZXhfZGF0YSk7CisKKyAgQ1JZUFRPX01VVEVYX2NsZWFudXAoJmN0eC0+bG9jayk7CisgIGxoX1NTTF9TRVNTSU9OX2ZyZWUoY3R4LT5zZXNzaW9ucyk7CisgIFg1MDlfU1RPUkVfZnJlZShjdHgtPmNlcnRfc3RvcmUpOworICBzc2xfY2lwaGVyX3ByZWZlcmVuY2VfbGlzdF9mcmVlKGN0eC0+Y2lwaGVyX2xpc3QpOworICBza19TU0xfQ0lQSEVSX2ZyZWUoY3R4LT5jaXBoZXJfbGlzdF9ieV9pZCk7CisgIHNzbF9jaXBoZXJfcHJlZmVyZW5jZV9saXN0X2ZyZWUoY3R4LT5jaXBoZXJfbGlzdF90bHMxMSk7CisgIHNzbF9jZXJ0X2ZyZWUoY3R4LT5jZXJ0KTsKKyAgc2tfWDUwOV9OQU1FX3BvcF9mcmVlKGN0eC0+Y2xpZW50X0NBLCBYNTA5X05BTUVfZnJlZSk7CisgIHNrX1g1MDlfcG9wX2ZyZWUoY3R4LT5leHRyYV9jZXJ0cywgWDUwOV9mcmVlKTsKKyAgc2tfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfZnJlZShjdHgtPnNydHBfcHJvZmlsZXMpOworICBPUEVOU1NMX2ZyZWUoY3R4LT5wc2tfaWRlbnRpdHlfaGludCk7CisgIE9QRU5TU0xfZnJlZShjdHgtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCk7CisgIE9QRU5TU0xfZnJlZShjdHgtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCk7CisgIE9QRU5TU0xfZnJlZShjdHgtPmFscG5fY2xpZW50X3Byb3RvX2xpc3QpOworICBFVlBfUEtFWV9mcmVlKGN0eC0+dGxzZXh0X2NoYW5uZWxfaWRfcHJpdmF0ZSk7CisgIEJJT19mcmVlKGN0eC0+a2V5bG9nX2Jpbyk7CisKKyAgT1BFTlNTTF9mcmVlKGN0eCk7Cit9CisKK3ZvaWQgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2IoU1NMX0NUWCAqY3R4LCBwZW1fcGFzc3dvcmRfY2IgKmNiKSB7CisgIGN0eC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2sgPSBjYjsKK30KKwordm9pZCBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YShTU0xfQ1RYICpjdHgsIHZvaWQgKnUpIHsKKyAgY3R4LT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFja191c2VyZGF0YSA9IHU7Cit9CisKIHZvaWQgU1NMX0NUWF9zZXRfY2VydF92ZXJpZnlfY2FsbGJhY2soU1NMX0NUWCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpjYikoWDUwOV9TVE9SRV9DVFggKnN0b3JlX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmNiKShYNTA5X1NUT1JFX0NUWCAqLCB2b2lkICopLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpIHsKICAgY3R4LT5hcHBfdmVyaWZ5X2NhbGxiYWNrID0gY2I7CiAgIGN0eC0+YXBwX3ZlcmlmeV9hcmcgPSBhcmc7CkBAIC0xODQyLDQ4ICsxODE0LDU3IEBACiAgIFg1MDlfVkVSSUZZX1BBUkFNX3NldF9kZXB0aChjdHgtPnBhcmFtLCBkZXB0aCk7CiB9CiAKLXZvaWQgU1NMX0NUWF9zZXRfY2VydF9jYihTU0xfQ1RYICpjdHgsIGludCAoKmNiKShTU0wgKnNzbCwgdm9pZCAqYXJnKSwKK3ZvaWQgU1NMX0NUWF9zZXRfY2VydF9jYihTU0xfQ1RYICpjLCBpbnQgKCpjYikoU1NMICpzc2wsIHZvaWQgKmFyZyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKSB7Ci0gIHNzbF9jZXJ0X3NldF9jZXJ0X2NiKGN0eC0+Y2VydCwgY2IsIGFyZyk7CisgIHNzbF9jZXJ0X3NldF9jZXJ0X2NiKGMtPmNlcnQsIGNiLCBhcmcpOwogfQogCi12b2lkIFNTTF9zZXRfY2VydF9jYihTU0wgKnNzbCwgaW50ICgqY2IpKFNTTCAqc3NsLCB2b2lkICphcmcpLCB2b2lkICphcmcpIHsKLSAgc3NsX2NlcnRfc2V0X2NlcnRfY2Ioc3NsLT5jZXJ0LCBjYiwgYXJnKTsKK3ZvaWQgU1NMX3NldF9jZXJ0X2NiKFNTTCAqcywgaW50ICgqY2IpKFNTTCAqc3NsLCB2b2lkICphcmcpLCB2b2lkICphcmcpIHsKKyAgc3NsX2NlcnRfc2V0X2NlcnRfY2Iocy0+Y2VydCwgY2IsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgc3NsX2hhc19rZXkoU1NMICpzLCBzaXplX3QgaWR4KSB7CisgIENFUlRfUEtFWSAqY3BrID0gJnMtPmNlcnQtPnBrZXlzW2lkeF07CisgIHJldHVybiBjcGstPng1MDkgJiYgY3BrLT5wcml2YXRla2V5OwogfQogCiB2b2lkIHNzbF9nZXRfY29tcGF0aWJsZV9zZXJ2ZXJfY2lwaGVycyhTU0wgKnMsIHVpbnQzMl90ICpvdXRfbWFza19rLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9tYXNrX2EpIHsKICAgQ0VSVCAqYyA9IHMtPmNlcnQ7Ci0gIGludCBoYXZlX3JzYV9jZXJ0ID0gMCwgZGhfdG1wOworICBpbnQgcnNhX2VuYywgcnNhX3NpZ24sIGRoX3RtcDsKICAgdWludDMyX3QgbWFza19rLCBtYXNrX2E7Ci0gIGludCBoYXZlX2VjY19jZXJ0ID0gMCwgZWNkc2Ffb2s7CisgIGludCBoYXZlX2VjY19jZXJ0LCBlY2RzYV9vazsKICAgWDUwOSAqeDsKIAorICBpZiAoYyA9PSBOVUxMKSB7CisgICAgLyogVE9ETyhkYXZpZGJlbik6IElzIHRoaXMgY29kZXBhdGggcG9zc2libGU/ICovCisgICAgKm91dF9tYXNrX2sgPSAwOworICAgICpvdXRfbWFza19hID0gMDsKKyAgICByZXR1cm47CisgIH0KKwogICBkaF90bXAgPSAoYy0+ZGhfdG1wICE9IE5VTEwgfHwgYy0+ZGhfdG1wX2NiICE9IE5VTEwpOwogCi0gIGlmIChzLT5jZXJ0LT54NTA5ICE9IE5VTEwgJiYgc3NsX2hhc19wcml2YXRlX2tleShzKSkgewotICAgIGlmIChzc2xfcHJpdmF0ZV9rZXlfdHlwZShzKSA9PSBFVlBfUEtFWV9SU0EpIHsKLSAgICAgIGhhdmVfcnNhX2NlcnQgPSAxOwotICAgIH0gZWxzZSBpZiAoc3NsX3ByaXZhdGVfa2V5X3R5cGUocykgPT0gRVZQX1BLRVlfRUMpIHsKLSAgICAgIGhhdmVfZWNjX2NlcnQgPSAxOwotICAgIH0KLSAgfQotCisgIHJzYV9lbmMgPSBzc2xfaGFzX2tleShzLCBTU0xfUEtFWV9SU0FfRU5DKTsKKyAgcnNhX3NpZ24gPSBzc2xfaGFzX2tleShzLCBTU0xfUEtFWV9SU0FfU0lHTik7CisgIGhhdmVfZWNjX2NlcnQgPSBzc2xfaGFzX2tleShzLCBTU0xfUEtFWV9FQ0MpOwogICBtYXNrX2sgPSAwOwogICBtYXNrX2EgPSAwOwogCisgIGlmIChyc2FfZW5jKSB7CisgICAgbWFza19rIHw9IFNTTF9rUlNBOworICB9CiAgIGlmIChkaF90bXApIHsKICAgICBtYXNrX2sgfD0gU1NMX2tESEU7CiAgIH0KLSAgaWYgKGhhdmVfcnNhX2NlcnQpIHsKLSAgICBtYXNrX2sgfD0gU1NMX2tSU0E7CisgIGlmIChyc2FfZW5jIHx8IHJzYV9zaWduKSB7CiAgICAgbWFza19hIHw9IFNTTF9hUlNBOwogICB9CiAKICAgLyogQW4gRUNDIGNlcnRpZmljYXRlIG1heSBiZSB1c2FibGUgZm9yIEVDRFNBIGNpcGhlciBzdWl0ZXMgZGVwZW5kaW5nIG9uIHRoZQogICAgKiBrZXkgdXNhZ2UgZXh0ZW5zaW9uIGFuZCBvbiB0aGUgY2xpZW50J3MgY3VydmUgcHJlZmVyZW5jZXMuICovCiAgIGlmIChoYXZlX2VjY19jZXJ0KSB7Ci0gICAgeCA9IGMtPng1MDk7CisgICAgeCA9IGMtPnBrZXlzW1NTTF9QS0VZX0VDQ10ueDUwOTsKICAgICAvKiBUaGlzIGNhbGwgcG9wdWxhdGVzIGV4dGVuc2lvbiBmbGFncyAoZXhfZmxhZ3MpLiAqLwogICAgIFg1MDlfY2hlY2tfcHVycG9zZSh4LCAtMSwgMCk7CiAgICAgZWNkc2Ffb2sgPSAoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfS1VTQUdFKQpAQCAtMTkxMywyMiArMTg5NCw4OSBAQAogICAqb3V0X21hc2tfYSA9IG1hc2tfYTsKIH0KIAorLyogVGhpcyBoYW5keSBtYWNybyBib3Jyb3dlZCBmcm9tIGNyeXB0by94NTA5djMvdjNfcHVycC5jICovCisjZGVmaW5lIGt1X3JlamVjdCh4LCB1c2FnZSkgXAorICAoKCh4KS0+ZXhfZmxhZ3MgJiBFWEZMQUdfS1VTQUdFKSAmJiAhKCh4KS0+ZXhfa3VzYWdlICYgKHVzYWdlKSkpCisKK2ludCBzc2xfY2hlY2tfc3J2cl9lY2NfY2VydF9hbmRfYWxnKFg1MDkgKngsIFNTTCAqcykgeworICBjb25zdCBTU0xfQ0lQSEVSICpjcyA9IHMtPnMzLT50bXAubmV3X2NpcGhlcjsKKyAgdWludDMyX3QgYWxnX2EgPSBjcy0+YWxnb3JpdGhtX2F1dGg7CisgIGludCBzaWduYXR1cmVfbmlkID0gMCwgbWRfbmlkID0gMCwgcGtfbmlkID0gMDsKKworICAvKiBUaGlzIGNhbGwgcG9wdWxhdGVzIHRoZSBleF9mbGFncyBmaWVsZCBjb3JyZWN0bHkgKi8KKyAgWDUwOV9jaGVja19wdXJwb3NlKHgsIC0xLCAwKTsKKyAgaWYgKHgtPnNpZ19hbGcgJiYgeC0+c2lnX2FsZy0+YWxnb3JpdGhtKSB7CisgICAgc2lnbmF0dXJlX25pZCA9IE9CSl9vYmoybmlkKHgtPnNpZ19hbGctPmFsZ29yaXRobSk7CisgICAgT0JKX2ZpbmRfc2lnaWRfYWxncyhzaWduYXR1cmVfbmlkLCAmbWRfbmlkLCAmcGtfbmlkKTsKKyAgfQorICBpZiAoYWxnX2EgJiBTU0xfYUVDRFNBKSB7CisgICAgLyoga2V5IHVzYWdlLCBpZiBwcmVzZW50LCBtdXN0IGFsbG93IHNpZ25pbmcgKi8KKyAgICBpZiAoa3VfcmVqZWN0KHgsIFg1MDl2M19LVV9ESUdJVEFMX1NJR05BVFVSRSkpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX2NoZWNrX3NydnJfZWNjX2NlcnRfYW5kX2FsZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX0VDQ19DRVJUX05PVF9GT1JfU0lHTklORyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICByZXR1cm4gMTsgLyogYWxsIGNoZWNrcyBhcmUgb2sgKi8KK30KKworc3RhdGljIGludCBzc2xfZ2V0X3NlcnZlcl9jZXJ0X2luZGV4KGNvbnN0IFNTTCAqcykgeworICBpbnQgaWR4OworICBpZHggPSBzc2xfY2lwaGVyX2dldF9jZXJ0X2luZGV4KHMtPnMzLT50bXAubmV3X2NpcGhlcik7CisgIGlmIChpZHggPT0gU1NMX1BLRVlfUlNBX0VOQyAmJiAhcy0+Y2VydC0+cGtleXNbU1NMX1BLRVlfUlNBX0VOQ10ueDUwOSkgeworICAgIGlkeCA9IFNTTF9QS0VZX1JTQV9TSUdOOworICB9CisgIGlmIChpZHggPT0gLTEpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9nZXRfc2VydmVyX2NlcnRfaW5kZXgsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgfQorICByZXR1cm4gaWR4OworfQorCitDRVJUX1BLRVkgKnNzbF9nZXRfc2VydmVyX3NlbmRfcGtleShjb25zdCBTU0wgKnMpIHsKKyAgaW50IGkgPSBzc2xfZ2V0X3NlcnZlcl9jZXJ0X2luZGV4KHMpOworCisgIC8qIFRoaXMgbWF5IG9yIG1heSBub3QgYmUgYW4gZXJyb3IuICovCisgIGlmIChpIDwgMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLyogTWF5IGJlIE5VTEwuICovCisgIHJldHVybiAmcy0+Y2VydC0+cGtleXNbaV07Cit9CisKK0VWUF9QS0VZICpzc2xfZ2V0X3NpZ25fcGtleShTU0wgKnMsIGNvbnN0IFNTTF9DSVBIRVIgKmNpcGhlcikgeworICB1aW50MzJfdCBhbGdfYSA9IGNpcGhlci0+YWxnb3JpdGhtX2F1dGg7CisgIENFUlQgKmMgPSBzLT5jZXJ0OworICBpbnQgaWR4ID0gLTE7CisKKyAgaWYgKGFsZ19hICYgU1NMX2FSU0EpIHsKKyAgICBpZiAoYy0+cGtleXNbU1NMX1BLRVlfUlNBX1NJR05dLnByaXZhdGVrZXkgIT0gTlVMTCkgeworICAgICAgaWR4ID0gU1NMX1BLRVlfUlNBX1NJR047CisgICAgfSBlbHNlIGlmIChjLT5wa2V5c1tTU0xfUEtFWV9SU0FfRU5DXS5wcml2YXRla2V5ICE9IE5VTEwpIHsKKyAgICAgIGlkeCA9IFNTTF9QS0VZX1JTQV9FTkM7CisgICAgfQorICB9IGVsc2UgaWYgKChhbGdfYSAmIFNTTF9hRUNEU0EpICYmCisgICAgICAgICAgICAgKGMtPnBrZXlzW1NTTF9QS0VZX0VDQ10ucHJpdmF0ZWtleSAhPSBOVUxMKSkgeworICAgIGlkeCA9IFNTTF9QS0VZX0VDQzsKKyAgfQorCisgIGlmIChpZHggPT0gLTEpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9nZXRfc2lnbl9wa2V5LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gYy0+cGtleXNbaWR4XS5wcml2YXRla2V5OworfQorCiB2b2lkIHNzbF91cGRhdGVfY2FjaGUoU1NMICpzLCBpbnQgbW9kZSkgewogICAvKiBOZXZlciBjYWNoZSBzZXNzaW9ucyB3aXRoIGVtcHR5IHNlc3Npb24gSURzLiAqLwogICBpZiAocy0+c2Vzc2lvbi0+c2Vzc2lvbl9pZF9sZW5ndGggPT0gMCkgewogICAgIHJldHVybjsKICAgfQogCi0gIGludCBoYXNfbmV3X3Nlc3Npb24gPSAhcy0+aGl0OwotICBpZiAoIXMtPnNlcnZlciAmJiBzLT50bHNleHRfdGlja2V0X2V4cGVjdGVkKSB7Ci0gICAgLyogQSBjbGllbnQgbWF5IHNlZSBuZXcgc2Vzc2lvbnMgb24gYWJicmV2aWF0ZWQgaGFuZHNoYWtlcyBpZiB0aGUgc2VydmVyCi0gICAgICogZGVjaWRlcyB0byByZW5ldyB0aGUgdGlja2V0LiBPbmNlIHRoZSBoYW5kc2hha2UgaXMgY29tcGxldGVkLCBpdCBzaG91bGQKLSAgICAgKiBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjYWNoZS4gKi8KLSAgICBoYXNfbmV3X3Nlc3Npb24gPSAxOwotICB9Ci0KICAgU1NMX0NUWCAqY3R4ID0gcy0+aW5pdGlhbF9jdHg7Ci0gIGlmICgoY3R4LT5zZXNzaW9uX2NhY2hlX21vZGUgJiBtb2RlKSA9PSBtb2RlICYmIGhhc19uZXdfc2Vzc2lvbiAmJgorICBpZiAoKGN0eC0+c2Vzc2lvbl9jYWNoZV9tb2RlICYgbW9kZSkgPT0gbW9kZSAmJiAhcy0+aGl0ICYmCiAgICAgICAoKGN0eC0+c2Vzc2lvbl9jYWNoZV9tb2RlICYgU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfU1RPUkUpIHx8CiAgICAgICAgU1NMX0NUWF9hZGRfc2Vzc2lvbihjdHgsIHMtPnNlc3Npb24pKSAmJgogICAgICAgY3R4LT5uZXdfc2Vzc2lvbl9jYiAhPSBOVUxMKSB7CkBAIC0xOTU4LDYgKzIwMDYsMTQzIEBACiAgIH0KIH0KIAoraW50IFNTTF9nZXRfZXJyb3IoY29uc3QgU1NMICpzLCBpbnQgcmV0X2NvZGUpIHsKKyAgaW50IHJlYXNvbjsKKyAgdWludDMyX3QgZXJyOworICBCSU8gKmJpbzsKKworICBpZiAocmV0X2NvZGUgPiAwKSB7CisgICAgcmV0dXJuIFNTTF9FUlJPUl9OT05FOworICB9CisKKyAgLyogTWFrZSB0aGluZ3MgcmV0dXJuIFNTTF9FUlJPUl9TWVNDQUxMIHdoZW4gZG9pbmcgU1NMX2RvX2hhbmRzaGFrZSBldGMsCisgICAqIHdoZXJlIHdlIGRvIGVuY29kZSB0aGUgZXJyb3IgKi8KKyAgZXJyID0gRVJSX3BlZWtfZXJyb3IoKTsKKyAgaWYgKGVyciAhPSAwKSB7CisgICAgaWYgKEVSUl9HRVRfTElCKGVycikgPT0gRVJSX0xJQl9TWVMpIHsKKyAgICAgIHJldHVybiBTU0xfRVJST1JfU1lTQ0FMTDsKKyAgICB9CisgICAgcmV0dXJuIFNTTF9FUlJPUl9TU0w7CisgIH0KKworICBpZiAocmV0X2NvZGUgPT0gMCkgeworICAgIGlmICgocy0+c2h1dGRvd24gJiBTU0xfUkVDRUlWRURfU0hVVERPV04pICYmCisgICAgICAgIChzLT5zMy0+d2Fybl9hbGVydCA9PSBTU0xfQURfQ0xPU0VfTk9USUZZKSkgeworICAgICAgLyogVGhlIHNvY2tldCB3YXMgY2xlYW5seSBzaHV0IGRvd24gd2l0aCBhIGNsb3NlX25vdGlmeS4gKi8KKyAgICAgIHJldHVybiBTU0xfRVJST1JfWkVST19SRVRVUk47CisgICAgfQorICAgIC8qIEFuIEVPRiB3YXMgb2JzZXJ2ZWQgd2hpY2ggdmlvbGF0ZXMgdGhlIHByb3RvY29sLCBhbmQgdGhlIHVuZGVybHlpbmcKKyAgICAgKiB0cmFuc3BvcnQgZG9lcyBub3QgcGFydGljaXBhdGUgaW4gdGhlIGVycm9yIHF1ZXVlLiBCdWJibGUgdXAgdG8gdGhlCisgICAgICogY2FsbGVyLiAqLworICAgIHJldHVybiBTU0xfRVJST1JfU1lTQ0FMTDsKKyAgfQorCisgIGlmIChTU0xfd2FudF9zZXNzaW9uKHMpKSB7CisgICAgcmV0dXJuIFNTTF9FUlJPUl9QRU5ESU5HX1NFU1NJT047CisgIH0KKworICBpZiAoU1NMX3dhbnRfY2VydGlmaWNhdGUocykpIHsKKyAgICByZXR1cm4gU1NMX0VSUk9SX1BFTkRJTkdfQ0VSVElGSUNBVEU7CisgIH0KKworICBpZiAoU1NMX3dhbnRfcmVhZChzKSkgeworICAgIGJpbyA9IFNTTF9nZXRfcmJpbyhzKTsKKyAgICBpZiAoQklPX3Nob3VsZF9yZWFkKGJpbykpIHsKKyAgICAgIHJldHVybiBTU0xfRVJST1JfV0FOVF9SRUFEOworICAgIH0KKworICAgIGlmIChCSU9fc2hvdWxkX3dyaXRlKGJpbykpIHsKKyAgICAgIC8qIFRoaXMgb25lIGRvZXNuJ3QgbWFrZSB0b28gbXVjaCBzZW5zZSAuLi4gV2UgbmV2ZXIgdHJ5IHRvIHdyaXRlIHRvIHRoZQorICAgICAgICogcmJpbywgYW5kIGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gd2hlcmUgcmJpbyBhbmQgd2JpbyBhcmUgc2VwYXJhdGUKKyAgICAgICAqIGNvdWxkbid0IGV2ZW4ga25vdyB3aGF0IGl0IHNob3VsZCB3YWl0IGZvci4gSG93ZXZlciBpZiB3ZSBldmVyIHNldAorICAgICAgICogcy0+cndzdGF0ZSBpbmNvcnJlY3RseSAoc28gdGhhdCB3ZSBoYXZlIFNTTF93YW50X3JlYWQocykgaW5zdGVhZCBvZgorICAgICAgICogU1NMX3dhbnRfd3JpdGUocykpIGFuZCByYmlvIGFuZCB3YmlvICphcmUqIHRoZSBzYW1lLCB0aGlzIHRlc3Qgd29ya3MKKyAgICAgICAqIGFyb3VuZCB0aGF0IGJ1Zzsgc28gaXQgbWlnaHQgYmUgc2FmZXIgdG8ga2VlcCBpdC4gKi8KKyAgICAgIHJldHVybiBTU0xfRVJST1JfV0FOVF9XUklURTsKKyAgICB9CisKKyAgICBpZiAoQklPX3Nob3VsZF9pb19zcGVjaWFsKGJpbykpIHsKKyAgICAgIHJlYXNvbiA9IEJJT19nZXRfcmV0cnlfcmVhc29uKGJpbyk7CisgICAgICBpZiAocmVhc29uID09IEJJT19SUl9DT05ORUNUKSB7CisgICAgICAgIHJldHVybiBTU0xfRVJST1JfV0FOVF9DT05ORUNUOworICAgICAgfQorCisgICAgICBpZiAocmVhc29uID09IEJJT19SUl9BQ0NFUFQpIHsKKyAgICAgICAgcmV0dXJuIFNTTF9FUlJPUl9XQU5UX0FDQ0VQVDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIFNTTF9FUlJPUl9TWVNDQUxMOyAvKiB1bmtub3duICovCisgICAgfQorICB9CisKKyAgaWYgKFNTTF93YW50X3dyaXRlKHMpKSB7CisgICAgYmlvID0gU1NMX2dldF93YmlvKHMpOworICAgIGlmIChCSU9fc2hvdWxkX3dyaXRlKGJpbykpIHsKKyAgICAgIHJldHVybiBTU0xfRVJST1JfV0FOVF9XUklURTsKKyAgICB9CisKKyAgICBpZiAoQklPX3Nob3VsZF9yZWFkKGJpbykpIHsKKyAgICAgIC8qIFNlZSBhYm92ZSAoU1NMX3dhbnRfcmVhZChzKSB3aXRoIEJJT19zaG91bGRfd3JpdGUoYmlvKSkgKi8KKyAgICAgIHJldHVybiBTU0xfRVJST1JfV0FOVF9SRUFEOworICAgIH0KKworICAgIGlmIChCSU9fc2hvdWxkX2lvX3NwZWNpYWwoYmlvKSkgeworICAgICAgcmVhc29uID0gQklPX2dldF9yZXRyeV9yZWFzb24oYmlvKTsKKyAgICAgIGlmIChyZWFzb24gPT0gQklPX1JSX0NPTk5FQ1QpIHsKKyAgICAgICAgcmV0dXJuIFNTTF9FUlJPUl9XQU5UX0NPTk5FQ1Q7CisgICAgICB9CisKKyAgICAgIGlmIChyZWFzb24gPT0gQklPX1JSX0FDQ0VQVCkgeworICAgICAgICByZXR1cm4gU1NMX0VSUk9SX1dBTlRfQUNDRVBUOworICAgICAgfQorCisgICAgICByZXR1cm4gU1NMX0VSUk9SX1NZU0NBTEw7CisgICAgfQorICB9CisKKyAgaWYgKFNTTF93YW50X3g1MDlfbG9va3VwKHMpKSB7CisgICAgcmV0dXJuIFNTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQOworICB9CisKKyAgaWYgKFNTTF93YW50X2NoYW5uZWxfaWRfbG9va3VwKHMpKSB7CisgICAgcmV0dXJuIFNTTF9FUlJPUl9XQU5UX0NIQU5ORUxfSURfTE9PS1VQOworICB9CisKKyAgcmV0dXJuIFNTTF9FUlJPUl9TWVNDQUxMOworfQorCitpbnQgU1NMX2RvX2hhbmRzaGFrZShTU0wgKnMpIHsKKyAgaW50IHJldCA9IDE7CisKKyAgaWYgKHMtPmhhbmRzaGFrZV9mdW5jID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9kb19oYW5kc2hha2UsIFNTTF9SX0NPTk5FQ1RJT05fVFlQRV9OT1RfU0VUKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoU1NMX2luX2luaXQocykpIHsKKyAgICByZXQgPSBzLT5oYW5kc2hha2VfZnVuYyhzKTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCit2b2lkIFNTTF9zZXRfYWNjZXB0X3N0YXRlKFNTTCAqc3NsKSB7CisgIHNzbC0+c2VydmVyID0gMTsKKyAgc3NsLT5zaHV0ZG93biA9IDA7CisgIHNzbC0+c3RhdGUgPSBTU0xfU1RfQUNDRVBUOworICBzc2wtPmhhbmRzaGFrZV9mdW5jID0gc3NsLT5tZXRob2QtPnNzbF9hY2NlcHQ7CisgIC8qIGNsZWFyIHRoZSBjdXJyZW50IGNpcGhlciAqLworICBzc2xfY2xlYXJfY2lwaGVyX2N0eChzc2wpOworfQorCit2b2lkIFNTTF9zZXRfY29ubmVjdF9zdGF0ZShTU0wgKnNzbCkgeworICBzc2wtPnNlcnZlciA9IDA7CisgIHNzbC0+c2h1dGRvd24gPSAwOworICBzc2wtPnN0YXRlID0gU1NMX1NUX0NPTk5FQ1Q7CisgIHNzbC0+aGFuZHNoYWtlX2Z1bmMgPSBzc2wtPm1ldGhvZC0+c3NsX2Nvbm5lY3Q7CisgIC8qIGNsZWFyIHRoZSBjdXJyZW50IGNpcGhlciAqLworICBzc2xfY2xlYXJfY2lwaGVyX2N0eChzc2wpOworfQorCiBzdGF0aWMgY29uc3QgY2hhciAqc3NsX2dldF92ZXJzaW9uKGludCB2ZXJzaW9uKSB7CiAgIHN3aXRjaCAodmVyc2lvbikgewogICAgIGNhc2UgVExTMV8yX1ZFUlNJT046CkBAIC0xOTgzLDE2ICsyMTY4LDEyIEBACiAgIH0KIH0KIAotY29uc3QgY2hhciAqU1NMX2dldF92ZXJzaW9uKGNvbnN0IFNTTCAqc3NsKSB7Ci0gIHJldHVybiBzc2xfZ2V0X3ZlcnNpb24oc3NsLT52ZXJzaW9uKTsKK2NvbnN0IGNoYXIgKlNTTF9nZXRfdmVyc2lvbihjb25zdCBTU0wgKnMpIHsKKyAgcmV0dXJuIHNzbF9nZXRfdmVyc2lvbihzLT52ZXJzaW9uKTsKIH0KIAotY29uc3QgY2hhciAqU1NMX1NFU1NJT05fZ2V0X3ZlcnNpb24oY29uc3QgU1NMX1NFU1NJT04gKnNlc3Npb24pIHsKLSAgcmV0dXJuIHNzbF9nZXRfdmVyc2lvbihzZXNzaW9uLT5zc2xfdmVyc2lvbik7Ci19Ci0KLWNvbnN0IGNoYXIqIFNTTF9nZXRfY3VydmVfbmFtZSh1aW50MTZfdCBjdXJ2ZV9pZCkgewotICByZXR1cm4gdGxzMV9lY19jdXJ2ZV9pZDJuYW1lKGN1cnZlX2lkKTsKK2NvbnN0IGNoYXIgKlNTTF9TRVNTSU9OX2dldF92ZXJzaW9uKGNvbnN0IFNTTF9TRVNTSU9OICpzZXNzKSB7CisgIHJldHVybiBzc2xfZ2V0X3ZlcnNpb24oc2Vzcy0+c3NsX3ZlcnNpb24pOwogfQogCiB2b2lkIHNzbF9jbGVhcl9jaXBoZXJfY3R4KFNTTCAqcykgewpAQCAtMjAwNCw3ICsyMTg1LDcgQEAKIAogWDUwOSAqU1NMX2dldF9jZXJ0aWZpY2F0ZShjb25zdCBTU0wgKnMpIHsKICAgaWYgKHMtPmNlcnQgIT0gTlVMTCkgewotICAgIHJldHVybiBzLT5jZXJ0LT54NTA5OworICAgIHJldHVybiBzLT5jZXJ0LT5rZXktPng1MDk7CiAgIH0KIAogICByZXR1cm4gTlVMTDsKQEAgLTIwMTIsNyArMjE5Myw3IEBACiAKIEVWUF9QS0VZICpTU0xfZ2V0X3ByaXZhdGVrZXkoY29uc3QgU1NMICpzKSB7CiAgIGlmIChzLT5jZXJ0ICE9IE5VTEwpIHsKLSAgICByZXR1cm4gcy0+Y2VydC0+cHJpdmF0ZWtleTsKKyAgICByZXR1cm4gcy0+Y2VydC0+a2V5LT5wcml2YXRla2V5OwogICB9CiAKICAgcmV0dXJuIE5VTEw7CkBAIC0yMDIwLDcgKzIyMDEsNyBAQAogCiBYNTA5ICpTU0xfQ1RYX2dldDBfY2VydGlmaWNhdGUoY29uc3QgU1NMX0NUWCAqY3R4KSB7CiAgIGlmIChjdHgtPmNlcnQgIT0gTlVMTCkgewotICAgIHJldHVybiBjdHgtPmNlcnQtPng1MDk7CisgICAgcmV0dXJuIGN0eC0+Y2VydC0+a2V5LT54NTA5OwogICB9CiAKICAgcmV0dXJuIE5VTEw7CkBAIC0yMDI4LDIyICsyMjA5LDIyIEBACiAKIEVWUF9QS0VZICpTU0xfQ1RYX2dldDBfcHJpdmF0ZWtleShjb25zdCBTU0xfQ1RYICpjdHgpIHsKICAgaWYgKGN0eC0+Y2VydCAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIGN0eC0+Y2VydC0+cHJpdmF0ZWtleTsKKyAgICByZXR1cm4gY3R4LT5jZXJ0LT5rZXktPnByaXZhdGVrZXk7CiAgIH0KIAogICByZXR1cm4gTlVMTDsKIH0KIAotY29uc3QgU1NMX0NJUEhFUiAqU1NMX2dldF9jdXJyZW50X2NpcGhlcihjb25zdCBTU0wgKnNzbCkgewotICBpZiAoc3NsLT5hZWFkX3dyaXRlX2N0eCA9PSBOVUxMKSB7Citjb25zdCBTU0xfQ0lQSEVSICpTU0xfZ2V0X2N1cnJlbnRfY2lwaGVyKGNvbnN0IFNTTCAqcykgeworICBpZiAocy0+YWVhZF93cml0ZV9jdHggPT0gTlVMTCkgewogICAgIHJldHVybiBOVUxMOwogICB9Ci0gIHJldHVybiBzc2wtPmFlYWRfd3JpdGVfY3R4LT5jaXBoZXI7CisgIHJldHVybiBzLT5hZWFkX3dyaXRlX2N0eC0+Y2lwaGVyOwogfQogCi1jb25zdCBDT01QX01FVEhPRCAqU1NMX2dldF9jdXJyZW50X2NvbXByZXNzaW9uKFNTTCAqcykgeyByZXR1cm4gTlVMTDsgfQorY29uc3Qgdm9pZCAqU1NMX2dldF9jdXJyZW50X2NvbXByZXNzaW9uKFNTTCAqcykgeyByZXR1cm4gTlVMTDsgfQogCi1jb25zdCBDT01QX01FVEhPRCAqU1NMX2dldF9jdXJyZW50X2V4cGFuc2lvbihTU0wgKnMpIHsgcmV0dXJuIE5VTEw7IH0KK2NvbnN0IHZvaWQgKlNTTF9nZXRfY3VycmVudF9leHBhbnNpb24oU1NMICpzKSB7IHJldHVybiBOVUxMOyB9CiAKIGludCBzc2xfaW5pdF93YmlvX2J1ZmZlcihTU0wgKnMsIGludCBwdXNoKSB7CiAgIEJJTyAqYmJpbzsKQEAgLTIwNjMsNyArMjI0NCw3IEBACiAKICAgQklPX3Jlc2V0KGJiaW8pOwogICBpZiAoIUJJT19zZXRfcmVhZF9idWZmZXJfc2l6ZShiYmlvLCAxKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfQlVGX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfaW5pdF93YmlvX2J1ZmZlciwgRVJSX1JfQlVGX0xJQik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjE0MSw5ICsyMzIyLDkgQEAKICAgcmV0dXJuIFg1MDlfU1RPUkVfc2V0X2RlZmF1bHRfcGF0aHMoY3R4LT5jZXJ0X3N0b3JlKTsKIH0KIAotaW50IFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKFNTTF9DVFggKmN0eCwgY29uc3QgY2hhciAqY2FfZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjYV9kaXIpIHsKLSAgcmV0dXJuIFg1MDlfU1RPUkVfbG9hZF9sb2NhdGlvbnMoY3R4LT5jZXJ0X3N0b3JlLCBjYV9maWxlLCBjYV9kaXIpOworaW50IFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKFNTTF9DVFggKmN0eCwgY29uc3QgY2hhciAqQ0FmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkNBcGF0aCkgeworICByZXR1cm4gWDUwOV9TVE9SRV9sb2FkX2xvY2F0aW9ucyhjdHgtPmNlcnRfc3RvcmUsIENBZmlsZSwgQ0FwYXRoKTsKIH0KIAogdm9pZCBTU0xfc2V0X2luZm9fY2FsbGJhY2soU1NMICpzc2wsCkBAIC0yMTYwLDkgKzIzNDEsNyBAQAogCiB2b2lkIFNTTF9zZXRfc3RhdGUoU1NMICpzc2wsIGludCBzdGF0ZSkgeyB9CiAKLXZvaWQgU1NMX3NldF92ZXJpZnlfcmVzdWx0KFNTTCAqc3NsLCBsb25nIHJlc3VsdCkgewotICBzc2wtPnZlcmlmeV9yZXN1bHQgPSByZXN1bHQ7Ci19Cit2b2lkIFNTTF9zZXRfdmVyaWZ5X3Jlc3VsdChTU0wgKnNzbCwgbG9uZyBhcmcpIHsgc3NsLT52ZXJpZnlfcmVzdWx0ID0gYXJnOyB9CiAKIGxvbmcgU1NMX2dldF92ZXJpZnlfcmVzdWx0KGNvbnN0IFNTTCAqc3NsKSB7IHJldHVybiBzc2wtPnZlcmlmeV9yZXN1bHQ7IH0KIApAQCAtMjE3NiwxMiArMjM1NSwxMiBAQAogICByZXR1cm4gaW5kZXg7CiB9CiAKLWludCBTU0xfc2V0X2V4X2RhdGEoU1NMICpzc2wsIGludCBpZHgsIHZvaWQgKmFyZykgewotICByZXR1cm4gQ1JZUFRPX3NldF9leF9kYXRhKCZzc2wtPmV4X2RhdGEsIGlkeCwgYXJnKTsKK2ludCBTU0xfc2V0X2V4X2RhdGEoU1NMICpzLCBpbnQgaWR4LCB2b2lkICphcmcpIHsKKyAgcmV0dXJuIENSWVBUT19zZXRfZXhfZGF0YSgmcy0+ZXhfZGF0YSwgaWR4LCBhcmcpOwogfQogCi12b2lkICpTU0xfZ2V0X2V4X2RhdGEoY29uc3QgU1NMICpzc2wsIGludCBpZHgpIHsKLSAgcmV0dXJuIENSWVBUT19nZXRfZXhfZGF0YSgmc3NsLT5leF9kYXRhLCBpZHgpOwordm9pZCAqU1NMX2dldF9leF9kYXRhKGNvbnN0IFNTTCAqcywgaW50IGlkeCkgeworICByZXR1cm4gQ1JZUFRPX2dldF9leF9kYXRhKCZzLT5leF9kYXRhLCBpZHgpOwogfQogCiBpbnQgU1NMX0NUWF9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwgQ1JZUFRPX0VYX25ldyAqbmV3X2Z1bmMsCkBAIC0yMTk1LDEyICsyMzc0LDEyIEBACiAgIHJldHVybiBpbmRleDsKIH0KIAotaW50IFNTTF9DVFhfc2V0X2V4X2RhdGEoU1NMX0NUWCAqY3R4LCBpbnQgaWR4LCB2b2lkICphcmcpIHsKLSAgcmV0dXJuIENSWVBUT19zZXRfZXhfZGF0YSgmY3R4LT5leF9kYXRhLCBpZHgsIGFyZyk7CitpbnQgU1NMX0NUWF9zZXRfZXhfZGF0YShTU0xfQ1RYICpzLCBpbnQgaWR4LCB2b2lkICphcmcpIHsKKyAgcmV0dXJuIENSWVBUT19zZXRfZXhfZGF0YSgmcy0+ZXhfZGF0YSwgaWR4LCBhcmcpOwogfQogCi12b2lkICpTU0xfQ1RYX2dldF9leF9kYXRhKGNvbnN0IFNTTF9DVFggKmN0eCwgaW50IGlkeCkgewotICByZXR1cm4gQ1JZUFRPX2dldF9leF9kYXRhKCZjdHgtPmV4X2RhdGEsIGlkeCk7Cit2b2lkICpTU0xfQ1RYX2dldF9leF9kYXRhKGNvbnN0IFNTTF9DVFggKnMsIGludCBpZHgpIHsKKyAgcmV0dXJuIENSWVBUT19nZXRfZXhfZGF0YSgmcy0+ZXhfZGF0YSwgaWR4KTsKIH0KIAogWDUwOV9TVE9SRSAqU1NMX0NUWF9nZXRfY2VydF9zdG9yZShjb25zdCBTU0xfQ1RYICpjdHgpIHsKQEAgLTIyNDgsNyArMjQyNyw4IEBACiAKIGludCBTU0xfQ1RYX3VzZV9wc2tfaWRlbnRpdHlfaGludChTU0xfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKmlkZW50aXR5X2hpbnQpIHsKICAgaWYgKGlkZW50aXR5X2hpbnQgIT0gTlVMTCAmJiBzdHJsZW4oaWRlbnRpdHlfaGludCkgPiBQU0tfTUFYX0lERU5USVRZX0xFTikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfREFUQV9MRU5HVEhfVE9PX0xPTkcpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX0NUWF91c2VfcHNrX2lkZW50aXR5X2hpbnQsCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfREFUQV9MRU5HVEhfVE9PX0xPTkcpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTIyNjYsMjMgKzI0NDYsMjQgQEAKICAgcmV0dXJuIDE7CiB9CiAKLWludCBTU0xfdXNlX3Bza19pZGVudGl0eV9oaW50KFNTTCAqc3NsLCBjb25zdCBjaGFyICppZGVudGl0eV9oaW50KSB7Ci0gIGlmIChzc2wgPT0gTlVMTCkgeworaW50IFNTTF91c2VfcHNrX2lkZW50aXR5X2hpbnQoU1NMICpzLCBjb25zdCBjaGFyICppZGVudGl0eV9oaW50KSB7CisgIGlmIChzID09IE5VTEwpIHsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChpZGVudGl0eV9oaW50ICE9IE5VTEwgJiYgc3RybGVuKGlkZW50aXR5X2hpbnQpID4gUFNLX01BWF9JREVOVElUWV9MRU4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0RBVEFfTEVOR1RIX1RPT19MT05HKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF91c2VfcHNrX2lkZW50aXR5X2hpbnQsCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfREFUQV9MRU5HVEhfVE9PX0xPTkcpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgLyogQ2xlYXIgY3VycmVudGx5IGNvbmZpZ3VyZWQgaGludCwgaWYgYW55LiAqLwotICBPUEVOU1NMX2ZyZWUoc3NsLT5wc2tfaWRlbnRpdHlfaGludCk7Ci0gIHNzbC0+cHNrX2lkZW50aXR5X2hpbnQgPSBOVUxMOworICBPUEVOU1NMX2ZyZWUocy0+cHNrX2lkZW50aXR5X2hpbnQpOworICBzLT5wc2tfaWRlbnRpdHlfaGludCA9IE5VTEw7CiAKICAgaWYgKGlkZW50aXR5X2hpbnQgIT0gTlVMTCkgewotICAgIHNzbC0+cHNrX2lkZW50aXR5X2hpbnQgPSBCVUZfc3RyZHVwKGlkZW50aXR5X2hpbnQpOwotICAgIGlmIChzc2wtPnBza19pZGVudGl0eV9oaW50ID09IE5VTEwpIHsKKyAgICBzLT5wc2tfaWRlbnRpdHlfaGludCA9IEJVRl9zdHJkdXAoaWRlbnRpdHlfaGludCk7CisgICAgaWYgKHMtPnBza19pZGVudGl0eV9oaW50ID09IE5VTEwpIHsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgfQpAQCAtMjI5MCw0NyArMjQ3MSw2MyBAQAogICByZXR1cm4gMTsKIH0KIAotY29uc3QgY2hhciAqU1NMX2dldF9wc2tfaWRlbnRpdHlfaGludChjb25zdCBTU0wgKnNzbCkgewotICBpZiAoc3NsID09IE5VTEwpIHsKK2NvbnN0IGNoYXIgKlNTTF9nZXRfcHNrX2lkZW50aXR5X2hpbnQoY29uc3QgU1NMICpzKSB7CisgIGlmIChzID09IE5VTEwpIHsKICAgICByZXR1cm4gTlVMTDsKICAgfQotICByZXR1cm4gc3NsLT5wc2tfaWRlbnRpdHlfaGludDsKKyAgcmV0dXJuIHMtPnBza19pZGVudGl0eV9oaW50OwogfQogCi1jb25zdCBjaGFyICpTU0xfZ2V0X3Bza19pZGVudGl0eShjb25zdCBTU0wgKnNzbCkgewotICBpZiAoc3NsID09IE5VTEwgfHwgc3NsLT5zZXNzaW9uID09IE5VTEwpIHsKK2NvbnN0IGNoYXIgKlNTTF9nZXRfcHNrX2lkZW50aXR5KGNvbnN0IFNTTCAqcykgeworICBpZiAocyA9PSBOVUxMIHx8IHMtPnNlc3Npb24gPT0gTlVMTCkgewogICAgIHJldHVybiBOVUxMOwogICB9CiAKLSAgcmV0dXJuIHNzbC0+c2Vzc2lvbi0+cHNrX2lkZW50aXR5OworICByZXR1cm4gcy0+c2Vzc2lvbi0+cHNrX2lkZW50aXR5OwogfQogCiB2b2lkIFNTTF9zZXRfcHNrX2NsaWVudF9jYWxsYmFjaygKLSAgICBTU0wgKnNzbCwgdW5zaWduZWQgKCpjYikoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmhpbnQsIGNoYXIgKmlkZW50aXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtYXhfaWRlbnRpdHlfbGVuLCB1aW50OF90ICpwc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1heF9wc2tfbGVuKSkgewotICBzc2wtPnBza19jbGllbnRfY2FsbGJhY2sgPSBjYjsKKyAgICBTU0wgKnMsIHVuc2lnbmVkIGludCAoKmNiKShTU0wgKnNzbCwgY29uc3QgY2hhciAqaGludCwgY2hhciAqaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1heF9pZGVudGl0eV9sZW4sIHVpbnQ4X3QgKnBzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF4X3Bza19sZW4pKSB7CisgIHMtPnBza19jbGllbnRfY2FsbGJhY2sgPSBjYjsKIH0KIAogdm9pZCBTU0xfQ1RYX3NldF9wc2tfY2xpZW50X2NhbGxiYWNrKAotICAgIFNTTF9DVFggKmN0eCwgdW5zaWduZWQgKCpjYikoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmhpbnQsIGNoYXIgKmlkZW50aXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWF4X2lkZW50aXR5X2xlbiwgdWludDhfdCAqcHNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWF4X3Bza19sZW4pKSB7CisgICAgU1NMX0NUWCAqY3R4LCB1bnNpZ25lZCBpbnQgKCpjYikoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmhpbnQsIGNoYXIgKmlkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXhfaWRlbnRpdHlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBzaywgdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKSkgewogICBjdHgtPnBza19jbGllbnRfY2FsbGJhY2sgPSBjYjsKIH0KIAogdm9pZCBTU0xfc2V0X3Bza19zZXJ2ZXJfY2FsbGJhY2soCi0gICAgU1NMICpzc2wsIHVuc2lnbmVkICgqY2IpKFNTTCAqc3NsLCBjb25zdCBjaGFyICppZGVudGl0eSwgdWludDhfdCAqcHNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtYXhfcHNrX2xlbikpIHsKLSAgc3NsLT5wc2tfc2VydmVyX2NhbGxiYWNrID0gY2I7CisgICAgU1NMICpzLCB1bnNpZ25lZCBpbnQgKCpjYikoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmlkZW50aXR5LCB1aW50OF90ICpwc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKSkgeworICBzLT5wc2tfc2VydmVyX2NhbGxiYWNrID0gY2I7CiB9CiAKIHZvaWQgU1NMX0NUWF9zZXRfcHNrX3NlcnZlcl9jYWxsYmFjaygKLSAgICBTU0xfQ1RYICpjdHgsIHVuc2lnbmVkICgqY2IpKFNTTCAqc3NsLCBjb25zdCBjaGFyICppZGVudGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBzaywgdW5zaWduZWQgbWF4X3Bza19sZW4pKSB7CisgICAgU1NMX0NUWCAqY3R4LCB1bnNpZ25lZCBpbnQgKCpjYikoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmlkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBzaywgdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKSkgewogICBjdHgtPnBza19zZXJ2ZXJfY2FsbGJhY2sgPSBjYjsKIH0KIAordm9pZCBTU0xfQ1RYX3NldF9taW5fdmVyc2lvbihTU0xfQ1RYICpjdHgsIHVpbnQxNl90IHZlcnNpb24pIHsKKyAgY3R4LT5taW5fdmVyc2lvbiA9IHZlcnNpb247Cit9CisKK3ZvaWQgU1NMX0NUWF9zZXRfbWF4X3ZlcnNpb24oU1NMX0NUWCAqY3R4LCB1aW50MTZfdCB2ZXJzaW9uKSB7CisgIGN0eC0+bWF4X3ZlcnNpb24gPSB2ZXJzaW9uOworfQorCit2b2lkIFNTTF9zZXRfbWluX3ZlcnNpb24oU1NMICpzc2wsIHVpbnQxNl90IHZlcnNpb24pIHsKKyAgc3NsLT5taW5fdmVyc2lvbiA9IHZlcnNpb247Cit9CisKK3ZvaWQgU1NMX3NldF9tYXhfdmVyc2lvbihTU0wgKnNzbCwgdWludDE2X3QgdmVyc2lvbikgeworICBzc2wtPm1heF92ZXJzaW9uID0gdmVyc2lvbjsKK30KKwogdm9pZCBTU0xfQ1RYX3NldF9tc2dfY2FsbGJhY2soU1NMX0NUWCAqY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmNiKShpbnQgd3JpdGVfcCwgaW50IHZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb250ZW50X3R5cGUsIGNvbnN0IHZvaWQgKmJ1ZiwKQEAgLTIzOTEsMTMgKzI1ODgsMTYgQEAKICAgfQogCiAgIGlmIChlbmNyeXB0ZWRfcHJlbWFzdGVyX2xlbiA8IDgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9jdHhfbG9nX3JzYV9jbGllbnRfa2V5X2V4Y2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICByZXR1cm4gMDsKICAgfQogCi0gIENCQl96ZXJvKCZjYmIpOwotICBpZiAoIUNCQl9pbml0KCZjYmIsIDQgKyAxNiArIDEgKyBwcmVtYXN0ZXJfbGVuICogMiArIDEpIHx8Ci0gICAgICAhQ0JCX2FkZF9ieXRlcygmY2JiLCAoY29uc3QgdWludDhfdCAqKSJSU0EgIiwgNCkgfHwKKyAgaWYgKCFDQkJfaW5pdCgmY2JiLCA0ICsgMTYgKyAxICsgcHJlbWFzdGVyX2xlbiAqIDIgKyAxKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFDQkJfYWRkX2J5dGVzKCZjYmIsIChjb25zdCB1aW50OF90ICopIlJTQSAiLCA0KSB8fAogICAgICAgLyogT25seSB0aGUgZmlyc3QgOCBieXRlcyBvZiB0aGUgZW5jcnlwdGVkIHByZW1hc3RlciBzZWNyZXQgYXJlCiAgICAgICAgKiBsb2dnZWQuICovCiAgICAgICAhY2JiX2FkZF9oZXgoJmNiYiwgZW5jcnlwdGVkX3ByZW1hc3RlciwgOCkgfHwKQEAgLTI0MzEsMTMgKzI2MzEsMTUgQEAKICAgfQogCiAgIGlmIChjbGllbnRfcmFuZG9tX2xlbiAhPSAzMikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX2N0eF9sb2dfbWFzdGVyX3NlY3JldCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgIHJldHVybiAwOwogICB9CiAKLSAgQ0JCX3plcm8oJmNiYik7Ci0gIGlmICghQ0JCX2luaXQoJmNiYiwgMTQgKyA2NCArIDEgKyBtYXN0ZXJfbGVuICogMiArIDEpIHx8Ci0gICAgICAhQ0JCX2FkZF9ieXRlcygmY2JiLCAoY29uc3QgdWludDhfdCAqKSJDTElFTlRfUkFORE9NICIsIDE0KSB8fAorICBpZiAoIUNCQl9pbml0KCZjYmIsIDE0ICsgNjQgKyAxICsgbWFzdGVyX2xlbiAqIDIgKyAxKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFDQkJfYWRkX2J5dGVzKCZjYmIsIChjb25zdCB1aW50OF90ICopIkNMSUVOVF9SQU5ET00gIiwgMTQpIHx8CiAgICAgICAhY2JiX2FkZF9oZXgoJmNiYiwgY2xpZW50X3JhbmRvbSwgMzIpIHx8CiAgICAgICAhQ0JCX2FkZF9ieXRlcygmY2JiLCAoY29uc3QgdWludDhfdCAqKSIgIiwgMSkgfHwKICAgICAgICFjYmJfYWRkX2hleCgmY2JiLCBtYXN0ZXIsIG1hc3Rlcl9sZW4pIHx8CkBAIC0yNjk2LDE1ICsyODk4LDE5IEBACiAgIHJldHVybiB2ZXJzaW9uOwogfQogCi1pbnQgU1NMX2NhY2hlX2hpdChTU0wgKnNzbCkgeyByZXR1cm4gU1NMX3Nlc3Npb25fcmV1c2VkKHNzbCk7IH0KK2ludCBTU0xfY2FjaGVfaGl0KFNTTCAqcykgeyByZXR1cm4gcy0+aGl0OyB9CiAKLWludCBTU0xfaXNfc2VydmVyKFNTTCAqc3NsKSB7IHJldHVybiBzc2wtPnNlcnZlcjsgfQoraW50IFNTTF9pc19zZXJ2ZXIoU1NMICpzKSB7IHJldHVybiBzLT5zZXJ2ZXI7IH0KIAogdm9pZCBTU0xfQ1RYX3NldF9kb3NfcHJvdGVjdGlvbl9jYigKICAgICBTU0xfQ1RYICpjdHgsIGludCAoKmNiKShjb25zdCBzdHJ1Y3Qgc3NsX2Vhcmx5X2NhbGxiYWNrX2N0eCAqKSkgewogICBjdHgtPmRvc19wcm90ZWN0aW9uX2NiID0gY2I7CiB9CiAKK3ZvaWQgU1NMX2VuYWJsZV9mYXN0cmFkaW9fcGFkZGluZyhTU0wgKnMsIGNoYXIgb25fb2ZmKSB7CisgIHMtPmZhc3RyYWRpb19wYWRkaW5nID0gb25fb2ZmOworfQorCiB2b2lkIFNTTF9zZXRfcmVqZWN0X3BlZXJfcmVuZWdvdGlhdGlvbnMoU1NMICpzLCBpbnQgcmVqZWN0KSB7CiAgIHMtPmFjY2VwdF9wZWVyX3JlbmVnb3RpYXRpb25zID0gIXJlamVjdDsKIH0KQEAgLTI3MTksNzMgKzI5MjUsMzkgQEAKICAgICAgICAgIEVWUF9BRUFEX0NUWF9nZXRfcmM0X3N0YXRlKCZzc2wtPmFlYWRfd3JpdGVfY3R4LT5jdHgsIHdyaXRlX2tleSk7CiB9CiAKLWludCBTU0xfY2xlYXIoU1NMICpzc2wpIHsKLSAgaWYgKHNzbC0+bWV0aG9kID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX05PX01FVEhPRF9TUEVDSUZJRUQpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaWYgKHNzbF9jbGVhcl9iYWRfc2Vzc2lvbihzc2wpKSB7Ci0gICAgU1NMX1NFU1NJT05fZnJlZShzc2wtPnNlc3Npb24pOwotICAgIHNzbC0+c2Vzc2lvbiA9IE5VTEw7Ci0gIH0KLQotICBzc2wtPmhpdCA9IDA7Ci0gIHNzbC0+c2h1dGRvd24gPSAwOwotCi0gIC8qIFNTTF9jbGVhciBtYXkgYmUgY2FsbGVkIGJlZm9yZSBvciBhZnRlciB0aGUgfHNzbHwgaXMgaW5pdGlhbGl6ZWQgaW4gZWl0aGVyCi0gICAqIGFjY2VwdCBvciBjb25uZWN0IHN0YXRlLiBJbiB0aGUgbGF0dGVyIGNhc2UsIFNTTF9jbGVhciBzaG91bGQgcHJlc2VydmUgdGhlCi0gICAqIGhhbGYgYW5kIHJlc2V0IHxzc2wtPnN0YXRlfCBhY2NvcmRpbmdseS4gKi8KLSAgaWYgKHNzbC0+aGFuZHNoYWtlX2Z1bmMgIT0gTlVMTCkgewotICAgIGlmIChzc2wtPnNlcnZlcikgewotICAgICAgU1NMX3NldF9hY2NlcHRfc3RhdGUoc3NsKTsKLSAgICB9IGVsc2UgewotICAgICAgU1NMX3NldF9jb25uZWN0X3N0YXRlKHNzbCk7CitpbnQgU1NMX2dldF90bHNfdW5pcXVlKGNvbnN0IFNTTCAqc3NsLCB1aW50OF90ICpvdXQsIHNpemVfdCAqb3V0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1heF9vdXQpIHsKKyAgLyogVGhlIHRscy11bmlxdWUgdmFsdWUgaXMgdGhlIGZpcnN0IEZpbmlzaGVkIG1lc3NhZ2UgaW4gdGhlIGhhbmRzaGFrZSwgd2hpY2gKKyAgICogaXMgdGhlIGNsaWVudCdzIGluIGEgZnVsbCBoYW5kc2hha2UgYW5kIHRoZSBzZXJ2ZXIncyBmb3IgYSByZXN1bXB0aW9uLiBTZWUKKyAgICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU5Mjkjc2VjdGlvbi0zLjEuICovCisgIGNvbnN0IHVpbnQ4X3QgKmZpbmlzaGVkID0gc3NsLT5zMy0+cHJldmlvdXNfY2xpZW50X2ZpbmlzaGVkOworICBzaXplX3QgZmluaXNoZWRfbGVuID0gc3NsLT5zMy0+cHJldmlvdXNfY2xpZW50X2ZpbmlzaGVkX2xlbjsKKyAgaWYgKHNzbC0+aGl0KSB7CisgICAgLyogdGxzLXVuaXF1ZSBpcyBicm9rZW4gZm9yIHJlc3VtZWQgc2Vzc2lvbnMgdW5sZXNzIEVNUyBpcyB1c2VkLiAqLworICAgIGlmICghc3NsLT5zZXNzaW9uLT5leHRlbmRlZF9tYXN0ZXJfc2VjcmV0KSB7CisgICAgICBnb3RvIGVycjsKICAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgYXNzZXJ0KHNzbC0+c3RhdGUgPT0gMCk7CisgICAgZmluaXNoZWQgPSBzc2wtPnMzLT5wcmV2aW91c19zZXJ2ZXJfZmluaXNoZWQ7CisgICAgZmluaXNoZWRfbGVuID0gc3NsLT5zMy0+cHJldmlvdXNfc2VydmVyX2ZpbmlzaGVkX2xlbjsKICAgfQogCi0gIC8qIFRPRE8oZGF2aWRiZW4pOiBTb21lIHN0YXRlIG9uIHxzc2x8IGlzIHJlc2V0IGJvdGggaW4gfFNTTF9uZXd8IGFuZAotICAgKiB8U1NMX2NsZWFyfCBiZWNhdXNlIGl0IGlzIHBlci1jb25uZWN0aW9uIHN0YXRlIHJhdGhlciB0aGFuIGNvbmZpZ3VyYXRpb24KLSAgICogc3RhdGUuIFBlci1jb25uZWN0aW9uIHN0YXRlIHNob3VsZCBiZSBvbiB8c3NsLT5zM3wgYW5kIHxzc2wtPmQxfCBzbyBpdCBpcwotICAgKiBuYXR1cmFsbHkgcmVzZXQgYXQgdGhlIHJpZ2h0IHBvaW50cyBiZXR3ZWVuIHxTU0xfbmV3fCwgfFNTTF9jbGVhcnwsIGFuZAotICAgKiB8c3NsM19uZXd8LiAqLwotCi0gIHNzbC0+cndzdGF0ZSA9IFNTTF9OT1RISU5HOwotCi0gIEJVRl9NRU1fZnJlZShzc2wtPmluaXRfYnVmKTsKLSAgc3NsLT5pbml0X2J1ZiA9IE5VTEw7Ci0KLSAgc3NsX2NsZWFyX2NpcGhlcl9jdHgoc3NsKTsKLQotICBPUEVOU1NMX2ZyZWUoc3NsLT5uZXh0X3Byb3RvX25lZ290aWF0ZWQpOwotICBzc2wtPm5leHRfcHJvdG9fbmVnb3RpYXRlZCA9IE5VTEw7Ci0gIHNzbC0+bmV4dF9wcm90b19uZWdvdGlhdGVkX2xlbiA9IDA7Ci0KLSAgLyogVGhlIHNzbC0+ZDEtPm10dSBpcyBzaW11bHRhbmVvdXNseSBjb25maWd1cmF0aW9uIChwcmVzZXJ2ZWQgYWNyb3NzCi0gICAqIGNsZWFyKSBhbmQgY29ubmVjdGlvbi1zcGVjaWZpYyBzdGF0ZSAoZ2V0cyByZXNldCkuCi0gICAqCi0gICAqIFRPRE8oZGF2aWRiZW4pOiBBdm9pZCB0aGlzLiAqLwotICB1bnNpZ25lZCBtdHUgPSAwOwotICBpZiAoc3NsLT5kMSAhPSBOVUxMKSB7Ci0gICAgbXR1ID0gc3NsLT5kMS0+bXR1OworICBpZiAoIXNzbC0+czMtPmluaXRpYWxfaGFuZHNoYWtlX2NvbXBsZXRlIHx8CisgICAgICBzc2wtPnZlcnNpb24gPCBUTFMxX1ZFUlNJT04pIHsKKyAgICBnb3RvIGVycjsKICAgfQogCi0gIHNzbC0+bWV0aG9kLT5zc2xfZnJlZShzc2wpOwotICBpZiAoIXNzbC0+bWV0aG9kLT5zc2xfbmV3KHNzbCkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBzc2wtPmVuY19tZXRob2QgPSBzc2wzX2dldF9lbmNfbWV0aG9kKHNzbC0+dmVyc2lvbik7Ci0gIGFzc2VydChzc2wtPmVuY19tZXRob2QgIT0gTlVMTCk7Ci0KLSAgaWYgKFNTTF9JU19EVExTKHNzbCkgJiYgKFNTTF9nZXRfb3B0aW9ucyhzc2wpICYgU1NMX09QX05PX1FVRVJZX01UVSkpIHsKLSAgICBzc2wtPmQxLT5tdHUgPSBtdHU7CisgICpvdXRfbGVuID0gZmluaXNoZWRfbGVuOworICBpZiAoZmluaXNoZWRfbGVuID4gbWF4X291dCkgeworICAgICpvdXRfbGVuID0gbWF4X291dDsKICAgfQogCi0gIHNzbC0+Y2xpZW50X3ZlcnNpb24gPSBzc2wtPnZlcnNpb247Ci0KKyAgbWVtY3B5KG91dCwgZmluaXNoZWQsICpvdXRfbGVuKTsKICAgcmV0dXJuIDE7CisKK2VycjoKKyAgKm91dF9sZW4gPSAwOworICBtZW1zZXQob3V0LCAwLCBtYXhfb3V0KTsKKyAgcmV0dXJuIDA7CiB9CiAKIGludCBTU0xfQ1RYX3Nlc3NfY29ubmVjdChjb25zdCBTU0xfQ1RYICpjdHgpIHsgcmV0dXJuIDA7IH0KQEAgLTI3OTksNSArMjk3MSwzIEBACiBpbnQgU1NMX0NUWF9zZXNzX21pc3Nlcyhjb25zdCBTU0xfQ1RYICpjdHgpIHsgcmV0dXJuIDA7IH0KIGludCBTU0xfQ1RYX3Nlc3NfdGltZW91dHMoY29uc3QgU1NMX0NUWCAqY3R4KSB7IHJldHVybiAwOyB9CiBpbnQgU1NMX0NUWF9zZXNzX2NhY2hlX2Z1bGwoY29uc3QgU1NMX0NUWCAqY3R4KSB7IHJldHVybiAwOyB9Ci12b2lkIEVSUl9sb2FkX1NTTF9zdHJpbmdzKHZvaWQpIHt9Ci12b2lkIFNTTF9sb2FkX2Vycm9yX3N0cmluZ3Modm9pZCkge30KZGlmZiAtLWdpdCBhL3NyYy9zc2wvc3NsX3JzYS5jIGIvc3JjL3NzbC9zc2xfcnNhLmMKaW5kZXggY2NkMzg1OC4uODdmNGMxYyAxMDA2NDQKLS0tIGEvc3JjL3NzbC9zc2xfcnNhLmMKKysrIGIvc3JjL3NzbC9zc2xfcnNhLmMKQEAgLTU0LDM4ICs1NCw3OSBAQAogICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQogICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KIAotI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KIAorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgogI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgogI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotCiBzdGF0aWMgaW50IHNzbF9zZXRfY2VydChDRVJUICpjLCBYNTA5ICp4NTA5KTsKIHN0YXRpYyBpbnQgc3NsX3NldF9wa2V5KENFUlQgKmMsIEVWUF9QS0VZICpwa2V5KTsKIAotc3RhdGljIGludCBpc19rZXlfdHlwZV9zdXBwb3J0ZWQoaW50IGtleV90eXBlKSB7Ci0gIHJldHVybiBrZXlfdHlwZSA9PSBFVlBfUEtFWV9SU0EgfHwga2V5X3R5cGUgPT0gRVZQX1BLRVlfRUM7Ci19Ci0KIGludCBTU0xfdXNlX2NlcnRpZmljYXRlKFNTTCAqc3NsLCBYNTA5ICp4KSB7CiAgIGlmICh4ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfdXNlX2NlcnRpZmljYXRlLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOwogICAgIHJldHVybiAwOwogICB9CiAgIHJldHVybiBzc2xfc2V0X2NlcnQoc3NsLT5jZXJ0LCB4KTsKIH0KIAoraW50IFNTTF91c2VfY2VydGlmaWNhdGVfZmlsZShTU0wgKnNzbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpIHsKKyAgaW50IHJlYXNvbl9jb2RlOworICBCSU8gKmluOworICBpbnQgcmV0ID0gMDsKKyAgWDUwOSAqeCA9IE5VTEw7CisKKyAgaW4gPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisgIGlmIChpbiA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfdXNlX2NlcnRpZmljYXRlX2ZpbGUsIEVSUl9SX0JVRl9MSUIpOworICAgIGdvdG8gZW5kOworICB9CisKKyAgaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGluLCBmaWxlKSA8PSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfdXNlX2NlcnRpZmljYXRlX2ZpbGUsIEVSUl9SX1NZU19MSUIpOworICAgIGdvdG8gZW5kOworICB9CisKKyAgaWYgKHR5cGUgPT0gU1NMX0ZJTEVUWVBFX0FTTjEpIHsKKyAgICByZWFzb25fY29kZSA9IEVSUl9SX0FTTjFfTElCOworICAgIHggPSBkMmlfWDUwOV9iaW8oaW4sIE5VTEwpOworICB9IGVsc2UgaWYgKHR5cGUgPT0gU1NMX0ZJTEVUWVBFX1BFTSkgeworICAgIHJlYXNvbl9jb2RlID0gRVJSX1JfUEVNX0xJQjsKKyAgICB4ID0gUEVNX3JlYWRfYmlvX1g1MDkoaW4sIE5VTEwsIHNzbC0+Y3R4LT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5jdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrX3VzZXJkYXRhKTsKKyAgfSBlbHNlIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF91c2VfY2VydGlmaWNhdGVfZmlsZSwgU1NMX1JfQkFEX1NTTF9GSUxFVFlQRSk7CisgICAgZ290byBlbmQ7CisgIH0KKworICBpZiAoeCA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfdXNlX2NlcnRpZmljYXRlX2ZpbGUsIHJlYXNvbl9jb2RlKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIHJldCA9IFNTTF91c2VfY2VydGlmaWNhdGUoc3NsLCB4KTsKKworZW5kOgorICBYNTA5X2ZyZWUoeCk7CisgIEJJT19mcmVlKGluKTsKKworICByZXR1cm4gcmV0OworfQorCiBpbnQgU1NMX3VzZV9jZXJ0aWZpY2F0ZV9BU04xKFNTTCAqc3NsLCBjb25zdCB1aW50OF90ICpkLCBpbnQgbGVuKSB7CiAgIFg1MDkgKng7CiAgIGludCByZXQ7CiAKICAgeCA9IGQyaV9YNTA5KE5VTEwsICZkLCAobG9uZylsZW4pOwogICBpZiAoeCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9BU04xX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfdXNlX2NlcnRpZmljYXRlX0FTTjEsIEVSUl9SX0FTTjFfTElCKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC05OSwxMyArMTQwLDEzIEBACiAgIGludCByZXQ7CiAKICAgaWYgKHJzYSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX3VzZV9SU0FQcml2YXRlS2V5LCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgcGtleSA9IEVWUF9QS0VZX25ldygpOwogICBpZiAocGtleSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9FVlBfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF91c2VfUlNBUHJpdmF0ZUtleSwgRVJSX1JfRVZQX0xJQik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTE5LDM2ICsxNjAsODYgQEAKIH0KIAogc3RhdGljIGludCBzc2xfc2V0X3BrZXkoQ0VSVCAqYywgRVZQX1BLRVkgKnBrZXkpIHsKLSAgaWYgKCFpc19rZXlfdHlwZV9zdXBwb3J0ZWQocGtleS0+dHlwZSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1VOS05PV05fQ0VSVElGSUNBVEVfVFlQRSk7CisgIGludCBpOworCisgIGkgPSBzc2xfY2VydF90eXBlKHBrZXkpOworICBpZiAoaSA8IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9zZXRfcGtleSwgU1NMX1JfVU5LTk9XTl9DRVJUSUZJQ0FURV9UWVBFKTsKICAgICByZXR1cm4gMDsKICAgfQogCi0gIGlmIChjLT54NTA5ICE9IE5VTEwpIHsKKyAgaWYgKGMtPnBrZXlzW2ldLng1MDkgIT0gTlVMTCkgewogICAgIC8qIFNhbml0eS1jaGVjayB0aGF0IHRoZSBwcml2YXRlIGtleSBhbmQgdGhlIGNlcnRpZmljYXRlIG1hdGNoLCB1bmxlc3MgdGhlCiAgICAgICoga2V5IGlzIG9wYXF1ZSAoaW4gY2FzZSBvZiwgc2F5LCBhIHNtYXJ0Y2FyZCkuICovCiAgICAgaWYgKCFFVlBfUEtFWV9pc19vcGFxdWUocGtleSkgJiYKLSAgICAgICAgIVg1MDlfY2hlY2tfcHJpdmF0ZV9rZXkoYy0+eDUwOSwgcGtleSkpIHsKLSAgICAgIFg1MDlfZnJlZShjLT54NTA5KTsKLSAgICAgIGMtPng1MDkgPSBOVUxMOworICAgICAgICAhWDUwOV9jaGVja19wcml2YXRlX2tleShjLT5wa2V5c1tpXS54NTA5LCBwa2V5KSkgeworICAgICAgWDUwOV9mcmVlKGMtPnBrZXlzW2ldLng1MDkpOworICAgICAgYy0+cGtleXNbaV0ueDUwOSA9IE5VTEw7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgIH0KIAotICBFVlBfUEtFWV9mcmVlKGMtPnByaXZhdGVrZXkpOwotICBjLT5wcml2YXRla2V5ID0gRVZQX1BLRVlfdXBfcmVmKHBrZXkpOworICBFVlBfUEtFWV9mcmVlKGMtPnBrZXlzW2ldLnByaXZhdGVrZXkpOworICBjLT5wa2V5c1tpXS5wcml2YXRla2V5ID0gRVZQX1BLRVlfdXBfcmVmKHBrZXkpOworICBjLT5rZXkgPSAmKGMtPnBrZXlzW2ldKTsKIAogICByZXR1cm4gMTsKIH0KIAotaW50IFNTTF91c2VfUlNBUHJpdmF0ZUtleV9BU04xKFNTTCAqc3NsLCBjb25zdCB1aW50OF90ICpkZXIsIHNpemVfdCBkZXJfbGVuKSB7Ci0gIFJTQSAqcnNhID0gUlNBX3ByaXZhdGVfa2V5X2Zyb21fYnl0ZXMoZGVyLCBkZXJfbGVuKTsKK2ludCBTU0xfdXNlX1JTQVByaXZhdGVLZXlfZmlsZShTU0wgKnNzbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpIHsKKyAgaW50IHJlYXNvbl9jb2RlLCByZXQgPSAwOworICBCSU8gKmluOworICBSU0EgKnJzYSA9IE5VTEw7CisKKyAgaW4gPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisgIGlmIChpbiA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfdXNlX1JTQVByaXZhdGVLZXlfZmlsZSwgRVJSX1JfQlVGX0xJQik7CisgICAgZ290byBlbmQ7CisgIH0KKworICBpZiAoQklPX3JlYWRfZmlsZW5hbWUoaW4sIGZpbGUpIDw9IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF91c2VfUlNBUHJpdmF0ZUtleV9maWxlLCBFUlJfUl9TWVNfTElCKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIGlmICh0eXBlID09IFNTTF9GSUxFVFlQRV9BU04xKSB7CisgICAgcmVhc29uX2NvZGUgPSBFUlJfUl9BU04xX0xJQjsKKyAgICByc2EgPSBkMmlfUlNBUHJpdmF0ZUtleV9iaW8oaW4sIE5VTEwpOworICB9IGVsc2UgaWYgKHR5cGUgPT0gU1NMX0ZJTEVUWVBFX1BFTSkgeworICAgIHJlYXNvbl9jb2RlID0gRVJSX1JfUEVNX0xJQjsKKyAgICByc2EgPQorICAgICAgICBQRU1fcmVhZF9iaW9fUlNBUHJpdmF0ZUtleShpbiwgTlVMTCwgc3NsLT5jdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wtPmN0eC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2tfdXNlcmRhdGEpOworICB9IGVsc2UgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX3VzZV9SU0FQcml2YXRlS2V5X2ZpbGUsIFNTTF9SX0JBRF9TU0xfRklMRVRZUEUpOworICAgIGdvdG8gZW5kOworICB9CisKICAgaWYgKHJzYSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9BU04xX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfdXNlX1JTQVByaXZhdGVLZXlfZmlsZSwgcmVhc29uX2NvZGUpOworICAgIGdvdG8gZW5kOworICB9CisgIHJldCA9IFNTTF91c2VfUlNBUHJpdmF0ZUtleShzc2wsIHJzYSk7CisgIFJTQV9mcmVlKHJzYSk7CisKK2VuZDoKKyAgQklPX2ZyZWUoaW4pOworICByZXR1cm4gcmV0OworfQorCitpbnQgU1NMX3VzZV9SU0FQcml2YXRlS2V5X0FTTjEoU1NMICpzc2wsIHVpbnQ4X3QgKmQsIGxvbmcgbGVuKSB7CisgIGludCByZXQ7CisgIGNvbnN0IHVpbnQ4X3QgKnA7CisgIFJTQSAqcnNhOworCisgIHAgPSBkOworICByc2EgPSBkMmlfUlNBUHJpdmF0ZUtleShOVUxMLCAmcCwgKGxvbmcpbGVuKTsKKyAgaWYgKHJzYSA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfdXNlX1JTQVByaXZhdGVLZXlfQVNOMSwgRVJSX1JfQVNOMV9MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAKLSAgaW50IHJldCA9IFNTTF91c2VfUlNBUHJpdmF0ZUtleShzc2wsIHJzYSk7CisgIHJldCA9IFNTTF91c2VfUlNBUHJpdmF0ZUtleShzc2wsIHJzYSk7CiAgIFJTQV9mcmVlKHJzYSk7CiAgIHJldHVybiByZXQ7CiB9CkBAIC0xNTcsNyArMjQ4LDcgQEAKICAgaW50IHJldDsKIAogICBpZiAocGtleSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX3VzZV9Qcml2YXRlS2V5LCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTE2NSw2ICsyNTYsNDYgQEAKICAgcmV0dXJuIHJldDsKIH0KIAoraW50IFNTTF91c2VfUHJpdmF0ZUtleV9maWxlKFNTTCAqc3NsLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgdHlwZSkgeworICBpbnQgcmVhc29uX2NvZGUsIHJldCA9IDA7CisgIEJJTyAqaW47CisgIEVWUF9QS0VZICpwa2V5ID0gTlVMTDsKKworICBpbiA9IEJJT19uZXcoQklPX3NfZmlsZSgpKTsKKyAgaWYgKGluID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF91c2VfUHJpdmF0ZUtleV9maWxlLCBFUlJfUl9CVUZfTElCKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIGlmIChCSU9fcmVhZF9maWxlbmFtZShpbiwgZmlsZSkgPD0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX3VzZV9Qcml2YXRlS2V5X2ZpbGUsIEVSUl9SX1NZU19MSUIpOworICAgIGdvdG8gZW5kOworICB9CisKKyAgaWYgKHR5cGUgPT0gU1NMX0ZJTEVUWVBFX1BFTSkgeworICAgIHJlYXNvbl9jb2RlID0gRVJSX1JfUEVNX0xJQjsKKyAgICBwa2V5ID0gUEVNX3JlYWRfYmlvX1ByaXZhdGVLZXkoaW4sIE5VTEwsIHNzbC0+Y3R4LT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5jdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrX3VzZXJkYXRhKTsKKyAgfSBlbHNlIGlmICh0eXBlID09IFNTTF9GSUxFVFlQRV9BU04xKSB7CisgICAgcmVhc29uX2NvZGUgPSBFUlJfUl9BU04xX0xJQjsKKyAgICBwa2V5ID0gZDJpX1ByaXZhdGVLZXlfYmlvKGluLCBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF91c2VfUHJpdmF0ZUtleV9maWxlLCBTU0xfUl9CQURfU1NMX0ZJTEVUWVBFKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIGlmIChwa2V5ID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF91c2VfUHJpdmF0ZUtleV9maWxlLCByZWFzb25fY29kZSk7CisgICAgZ290byBlbmQ7CisgIH0KKyAgcmV0ID0gU1NMX3VzZV9Qcml2YXRlS2V5KHNzbCwgcGtleSk7CisgIEVWUF9QS0VZX2ZyZWUocGtleSk7CisKK2VuZDoKKyAgQklPX2ZyZWUoaW4pOworICByZXR1cm4gcmV0OworfQorCiBpbnQgU1NMX3VzZV9Qcml2YXRlS2V5X0FTTjEoaW50IHR5cGUsIFNTTCAqc3NsLCBjb25zdCB1aW50OF90ICpkLCBsb25nIGxlbikgewogICBpbnQgcmV0OwogICBjb25zdCB1aW50OF90ICpwOwpAQCAtMTczLDcgKzMwNCw3IEBACiAgIHAgPSBkOwogICBwa2V5ID0gZDJpX1ByaXZhdGVLZXkodHlwZSwgTlVMTCwgJnAsIChsb25nKWxlbik7CiAgIGlmIChwa2V5ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0FTTjFfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF91c2VfUHJpdmF0ZUtleV9BU04xLCBFUlJfUl9BU04xX0xJQik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTg0LDcgKzMxNSw4IEBACiAKIGludCBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZShTU0xfQ1RYICpjdHgsIFg1MDkgKngpIHsKICAgaWYgKHggPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTkyLDI4ICszMjQsMzIgQEAKIH0KIAogc3RhdGljIGludCBzc2xfc2V0X2NlcnQoQ0VSVCAqYywgWDUwOSAqeCkgewotICBFVlBfUEtFWSAqcGtleSA9IFg1MDlfZ2V0X3B1YmtleSh4KTsKKyAgRVZQX1BLRVkgKnBrZXk7CisgIGludCBpOworCisgIHBrZXkgPSBYNTA5X2dldF9wdWJrZXkoeCk7CiAgIGlmIChwa2V5ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1g1MDlfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9zZXRfY2VydCwgU1NMX1JfWDUwOV9MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAKLSAgaWYgKCFpc19rZXlfdHlwZV9zdXBwb3J0ZWQocGtleS0+dHlwZSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1VOS05PV05fQ0VSVElGSUNBVEVfVFlQRSk7CisgIGkgPSBzc2xfY2VydF90eXBlKHBrZXkpOworICBpZiAoaSA8IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9zZXRfY2VydCwgU1NMX1JfVU5LTk9XTl9DRVJUSUZJQ0FURV9UWVBFKTsKICAgICBFVlBfUEtFWV9mcmVlKHBrZXkpOwogICAgIHJldHVybiAwOwogICB9CiAKLSAgaWYgKGMtPnByaXZhdGVrZXkgIT0gTlVMTCkgeworICBpZiAoYy0+cGtleXNbaV0ucHJpdmF0ZWtleSAhPSBOVUxMKSB7CiAgICAgLyogU2FuaXR5LWNoZWNrIHRoYXQgdGhlIHByaXZhdGUga2V5IGFuZCB0aGUgY2VydGlmaWNhdGUgbWF0Y2gsIHVubGVzcyB0aGUKICAgICAgKiBrZXkgaXMgb3BhcXVlIChpbiBjYXNlIG9mLCBzYXksIGEgc21hcnRjYXJkKS4gKi8KLSAgICBpZiAoIUVWUF9QS0VZX2lzX29wYXF1ZShjLT5wcml2YXRla2V5KSAmJgotICAgICAgICAhWDUwOV9jaGVja19wcml2YXRlX2tleSh4LCBjLT5wcml2YXRla2V5KSkgeworICAgIGlmICghRVZQX1BLRVlfaXNfb3BhcXVlKGMtPnBrZXlzW2ldLnByaXZhdGVrZXkpICYmCisgICAgICAgICFYNTA5X2NoZWNrX3ByaXZhdGVfa2V5KHgsIGMtPnBrZXlzW2ldLnByaXZhdGVrZXkpKSB7CiAgICAgICAvKiBkb24ndCBmYWlsIGZvciBhIGNlcnQva2V5IG1pc21hdGNoLCBqdXN0IGZyZWUgY3VycmVudCBwcml2YXRlIGtleQogICAgICAgICogKHdoZW4gc3dpdGNoaW5nIHRvIGEgZGlmZmVyZW50IGNlcnQgJiBrZXksIGZpcnN0IHRoaXMgZnVuY3Rpb24gc2hvdWxkCiAgICAgICAgKiBiZSB1c2VkLCB0aGVuIHNzbF9zZXRfcGtleSAqLwotICAgICAgRVZQX1BLRVlfZnJlZShjLT5wcml2YXRla2V5KTsKLSAgICAgIGMtPnByaXZhdGVrZXkgPSBOVUxMOworICAgICAgRVZQX1BLRVlfZnJlZShjLT5wa2V5c1tpXS5wcml2YXRla2V5KTsKKyAgICAgIGMtPnBrZXlzW2ldLnByaXZhdGVrZXkgPSBOVUxMOwogICAgICAgLyogY2xlYXIgZXJyb3IgcXVldWUgKi8KICAgICAgIEVSUl9jbGVhcl9lcnJvcigpOwogICAgIH0KQEAgLTIyMSwxOSArMzU3LDYzIEBACiAKICAgRVZQX1BLRVlfZnJlZShwa2V5KTsKIAotICBYNTA5X2ZyZWUoYy0+eDUwOSk7Ci0gIGMtPng1MDkgPSBYNTA5X3VwX3JlZih4KTsKKyAgWDUwOV9mcmVlKGMtPnBrZXlzW2ldLng1MDkpOworICBjLT5wa2V5c1tpXS54NTA5ID0gWDUwOV91cF9yZWYoeCk7CisgIGMtPmtleSA9ICYoYy0+cGtleXNbaV0pOwogCiAgIHJldHVybiAxOwogfQogCitpbnQgU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfZmlsZShTU0xfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKmZpbGUsIGludCB0eXBlKSB7CisgIGludCByZWFzb25fY29kZTsKKyAgQklPICppbjsKKyAgaW50IHJldCA9IDA7CisgIFg1MDkgKnggPSBOVUxMOworCisgIGluID0gQklPX25ldyhCSU9fc19maWxlKCkpOworICBpZiAoaW4gPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfZmlsZSwgRVJSX1JfQlVGX0xJQik7CisgICAgZ290byBlbmQ7CisgIH0KKworICBpZiAoQklPX3JlYWRfZmlsZW5hbWUoaW4sIGZpbGUpIDw9IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2ZpbGUsIEVSUl9SX1NZU19MSUIpOworICAgIGdvdG8gZW5kOworICB9CisKKyAgaWYgKHR5cGUgPT0gU1NMX0ZJTEVUWVBFX0FTTjEpIHsKKyAgICByZWFzb25fY29kZSA9IEVSUl9SX0FTTjFfTElCOworICAgIHggPSBkMmlfWDUwOV9iaW8oaW4sIE5VTEwpOworICB9IGVsc2UgaWYgKHR5cGUgPT0gU1NMX0ZJTEVUWVBFX1BFTSkgeworICAgIHJlYXNvbl9jb2RlID0gRVJSX1JfUEVNX0xJQjsKKyAgICB4ID0gUEVNX3JlYWRfYmlvX1g1MDkoaW4sIE5VTEwsIGN0eC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2tfdXNlcmRhdGEpOworICB9IGVsc2UgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9CQURfU1NMX0ZJTEVUWVBFKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIGlmICh4ID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2ZpbGUsIHJlYXNvbl9jb2RlKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIHJldCA9IFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlKGN0eCwgeCk7CisKK2VuZDoKKyAgWDUwOV9mcmVlKHgpOworICBCSU9fZnJlZShpbik7CisgIHJldHVybiByZXQ7Cit9CisKIGludCBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9BU04xKFNTTF9DVFggKmN0eCwgaW50IGxlbiwgY29uc3QgdWludDhfdCAqZCkgewogICBYNTA5ICp4OwogICBpbnQgcmV0OwogCiAgIHggPSBkMmlfWDUwOShOVUxMLCAmZCwgKGxvbmcpbGVuKTsKICAgaWYgKHggPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfQVNOMV9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfQVNOMSwgRVJSX1JfQVNOMV9MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTI0NywxMyArNDI3LDE0IEBACiAgIEVWUF9QS0VZICpwa2V5OwogCiAgIGlmIChyc2EgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9DVFhfdXNlX1JTQVByaXZhdGVLZXksCisgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIHBrZXkgPSBFVlBfUEtFWV9uZXcoKTsKICAgaWYgKHBrZXkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfRVZQX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5LCBFUlJfUl9FVlBfTElCKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0yNjUsMjggKzQ0NiwxMTMgQEAKICAgcmV0dXJuIHJldDsKIH0KIAotaW50IFNTTF9DVFhfdXNlX1JTQVByaXZhdGVLZXlfQVNOMShTU0xfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRlcl9sZW4pIHsKLSAgUlNBICpyc2EgPSBSU0FfcHJpdmF0ZV9rZXlfZnJvbV9ieXRlcyhkZXIsIGRlcl9sZW4pOworaW50IFNTTF9DVFhfdXNlX1JTQVByaXZhdGVLZXlfZmlsZShTU0xfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKmZpbGUsIGludCB0eXBlKSB7CisgIGludCByZWFzb25fY29kZSwgcmV0ID0gMDsKKyAgQklPICppbjsKKyAgUlNBICpyc2EgPSBOVUxMOworCisgIGluID0gQklPX25ldyhCSU9fc19maWxlKCkpOworICBpZiAoaW4gPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleV9maWxlLCBFUlJfUl9CVUZfTElCKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIGlmIChCSU9fcmVhZF9maWxlbmFtZShpbiwgZmlsZSkgPD0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleV9maWxlLCBFUlJfUl9TWVNfTElCKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIGlmICh0eXBlID09IFNTTF9GSUxFVFlQRV9BU04xKSB7CisgICAgcmVhc29uX2NvZGUgPSBFUlJfUl9BU04xX0xJQjsKKyAgICByc2EgPSBkMmlfUlNBUHJpdmF0ZUtleV9iaW8oaW4sIE5VTEwpOworICB9IGVsc2UgaWYgKHR5cGUgPT0gU1NMX0ZJTEVUWVBFX1BFTSkgeworICAgIHJlYXNvbl9jb2RlID0gRVJSX1JfUEVNX0xJQjsKKyAgICByc2EgPSBQRU1fcmVhZF9iaW9fUlNBUHJpdmF0ZUtleShpbiwgTlVMTCwgY3R4LT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrX3VzZXJkYXRhKTsKKyAgfSBlbHNlIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9DVFhfdXNlX1JTQVByaXZhdGVLZXlfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9CQURfU1NMX0ZJTEVUWVBFKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCiAgIGlmIChyc2EgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfQVNOMV9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleV9maWxlLCByZWFzb25fY29kZSk7CisgICAgZ290byBlbmQ7CisgIH0KKyAgcmV0ID0gU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleShjdHgsIHJzYSk7CisgIFJTQV9mcmVlKHJzYSk7CisKK2VuZDoKKyAgQklPX2ZyZWUoaW4pOworICByZXR1cm4gcmV0OworfQorCitpbnQgU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleV9BU04xKFNTTF9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqZCwgbG9uZyBsZW4pIHsKKyAgaW50IHJldDsKKyAgY29uc3QgdWludDhfdCAqcDsKKyAgUlNBICpyc2E7CisKKyAgcCA9IGQ7CisgIHJzYSA9IGQyaV9SU0FQcml2YXRlS2V5KE5VTEwsICZwLCAobG9uZylsZW4pOworICBpZiAocnNhID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9DVFhfdXNlX1JTQVByaXZhdGVLZXlfQVNOMSwgRVJSX1JfQVNOMV9MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAKLSAgaW50IHJldCA9IFNTTF9DVFhfdXNlX1JTQVByaXZhdGVLZXkoY3R4LCByc2EpOworICByZXQgPSBTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5KGN0eCwgcnNhKTsKICAgUlNBX2ZyZWUocnNhKTsKICAgcmV0dXJuIHJldDsKIH0KIAogaW50IFNTTF9DVFhfdXNlX1ByaXZhdGVLZXkoU1NMX0NUWCAqY3R4LCBFVlBfUEtFWSAqcGtleSkgewogICBpZiAocGtleSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX0NUWF91c2VfUHJpdmF0ZUtleSwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIHJldHVybiBzc2xfc2V0X3BrZXkoY3R4LT5jZXJ0LCBwa2V5KTsKIH0KIAoraW50IFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShTU0xfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKmZpbGUsIGludCB0eXBlKSB7CisgIGludCByZWFzb25fY29kZSwgcmV0ID0gMDsKKyAgQklPICppbjsKKyAgRVZQX1BLRVkgKnBrZXkgPSBOVUxMOworCisgIGluID0gQklPX25ldyhCSU9fc19maWxlKCkpOworICBpZiAoaW4gPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlLCBFUlJfUl9CVUZfTElCKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIGlmIChCSU9fcmVhZF9maWxlbmFtZShpbiwgZmlsZSkgPD0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlLCBFUlJfUl9TWVNfTElCKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIGlmICh0eXBlID09IFNTTF9GSUxFVFlQRV9QRU0pIHsKKyAgICByZWFzb25fY29kZSA9IEVSUl9SX1BFTV9MSUI7CisgICAgcGtleSA9IFBFTV9yZWFkX2Jpb19Qcml2YXRlS2V5KGluLCBOVUxMLCBjdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrX3VzZXJkYXRhKTsKKyAgfSBlbHNlIGlmICh0eXBlID09IFNTTF9GSUxFVFlQRV9BU04xKSB7CisgICAgcmVhc29uX2NvZGUgPSBFUlJfUl9BU04xX0xJQjsKKyAgICBwa2V5ID0gZDJpX1ByaXZhdGVLZXlfYmlvKGluLCBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZSwgU1NMX1JfQkFEX1NTTF9GSUxFVFlQRSk7CisgICAgZ290byBlbmQ7CisgIH0KKworICBpZiAocGtleSA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUsIHJlYXNvbl9jb2RlKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorICByZXQgPSBTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5KGN0eCwgcGtleSk7CisgIEVWUF9QS0VZX2ZyZWUocGtleSk7CisKK2VuZDoKKyAgQklPX2ZyZWUoaW4pOworICByZXR1cm4gcmV0OworfQorCiBpbnQgU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9BU04xKGludCB0eXBlLCBTU0xfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGVuKSB7CiAgIGludCByZXQ7CkBAIC0yOTYsNyArNTYyLDcgQEAKICAgcCA9IGQ7CiAgIHBrZXkgPSBkMmlfUHJpdmF0ZUtleSh0eXBlLCBOVUxMLCAmcCwgKGxvbmcpbGVuKTsKICAgaWYgKHBrZXkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfQVNOMV9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9BU04xLCBFUlJfUl9BU04xX0xJQik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMzA1LDc0ICs1NzEsNzYgQEAKICAgcmV0dXJuIHJldDsKIH0KIAotdm9pZCBTU0xfc2V0X3ByaXZhdGVfa2V5X21ldGhvZChTU0wgKnNzbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1NMX1BSSVZBVEVfS0VZX01FVEhPRCAqa2V5X21ldGhvZCkgewotICBzc2wtPmNlcnQtPmtleV9tZXRob2QgPSBrZXlfbWV0aG9kOwotfQogCi1pbnQgU1NMX3NldF9wcml2YXRlX2tleV9kaWdlc3RfcHJlZnMoU1NMICpzc2wsIGNvbnN0IGludCAqZGlnZXN0X25pZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9kaWdlc3RzKSB7Ci0gIE9QRU5TU0xfZnJlZShzc2wtPmNlcnQtPmRpZ2VzdF9uaWRzKTsKKy8qIFJlYWQgYSBmaWxlIHRoYXQgY29udGFpbnMgb3VyIGNlcnRpZmljYXRlIGluICJQRU0iIGZvcm1hdCwgcG9zc2libHkgZm9sbG93ZWQKKyAqIGJ5IGEgc2VxdWVuY2Ugb2YgQ0EgY2VydGlmaWNhdGVzIHRoYXQgc2hvdWxkIGJlIHNlbnQgdG8gdGhlIHBlZXIgaW4gdGhlCisgKiBDZXJ0aWZpY2F0ZSBtZXNzYWdlLiAqLworaW50IFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoU1NMX0NUWCAqY3R4LCBjb25zdCBjaGFyICpmaWxlKSB7CisgIEJJTyAqaW47CisgIGludCByZXQgPSAwOworICBYNTA5ICp4ID0gTlVMTDsKIAotICBzc2wtPmNlcnQtPm51bV9kaWdlc3RfbmlkcyA9IDA7Ci0gIHNzbC0+Y2VydC0+ZGlnZXN0X25pZHMgPSBCVUZfbWVtZHVwKGRpZ2VzdF9uaWRzLCBudW1fZGlnZXN0cypzaXplb2YoaW50KSk7Ci0gIGlmIChzc2wtPmNlcnQtPmRpZ2VzdF9uaWRzID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKLSAgICByZXR1cm4gMDsKLSAgfQorICBFUlJfY2xlYXJfZXJyb3IoKTsgLyogY2xlYXIgZXJyb3Igc3RhY2sgZm9yIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlKCkgKi8KIAotICBzc2wtPmNlcnQtPm51bV9kaWdlc3RfbmlkcyA9IG51bV9kaWdlc3RzOwotICByZXR1cm4gMTsKLX0KLQotaW50IHNzbF9oYXNfcHJpdmF0ZV9rZXkoU1NMICpzc2wpIHsKLSAgcmV0dXJuIHNzbC0+Y2VydC0+cHJpdmF0ZWtleSAhPSBOVUxMIHx8IHNzbC0+Y2VydC0+a2V5X21ldGhvZCAhPSBOVUxMOwotfQotCi1pbnQgc3NsX3ByaXZhdGVfa2V5X3R5cGUoU1NMICpzc2wpIHsKLSAgaWYgKHNzbC0+Y2VydC0+a2V5X21ldGhvZCAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIHNzbC0+Y2VydC0+a2V5X21ldGhvZC0+dHlwZShzc2wpOwotICB9Ci0gIHJldHVybiBFVlBfUEtFWV9pZChzc2wtPmNlcnQtPnByaXZhdGVrZXkpOwotfQotCi1zaXplX3Qgc3NsX3ByaXZhdGVfa2V5X21heF9zaWduYXR1cmVfbGVuKFNTTCAqc3NsKSB7Ci0gIGlmIChzc2wtPmNlcnQtPmtleV9tZXRob2QgIT0gTlVMTCkgewotICAgIHJldHVybiBzc2wtPmNlcnQtPmtleV9tZXRob2QtPm1heF9zaWduYXR1cmVfbGVuKHNzbCk7Ci0gIH0KLSAgcmV0dXJuIEVWUF9QS0VZX3NpemUoc3NsLT5jZXJ0LT5wcml2YXRla2V5KTsKLX0KLQotZW51bSBzc2xfcHJpdmF0ZV9rZXlfcmVzdWx0X3Qgc3NsX3ByaXZhdGVfa2V5X3NpZ24oCi0gICAgU1NMICpzc2wsIHVpbnQ4X3QgKm91dCwgc2l6ZV90ICpvdXRfbGVuLCBzaXplX3QgbWF4X291dCwgY29uc3QgRVZQX01EICptZCwKLSAgICBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluX2xlbikgewotICBpZiAoc3NsLT5jZXJ0LT5rZXlfbWV0aG9kICE9IE5VTEwpIHsKLSAgICByZXR1cm4gc3NsLT5jZXJ0LT5rZXlfbWV0aG9kLT5zaWduKHNzbCwgb3V0LCBvdXRfbGVuLCBtYXhfb3V0LCBtZCwgaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9sZW4pOwotICB9Ci0KLSAgZW51bSBzc2xfcHJpdmF0ZV9rZXlfcmVzdWx0X3QgcmV0ID0gc3NsX3ByaXZhdGVfa2V5X2ZhaWx1cmU7Ci0gIEVWUF9QS0VZX0NUWCAqY3R4ID0gRVZQX1BLRVlfQ1RYX25ldyhzc2wtPmNlcnQtPnByaXZhdGVrZXksIE5VTEwpOwotICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgaW4gPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisgIGlmIChpbiA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlLCBFUlJfUl9CVUZfTElCKTsKICAgICBnb3RvIGVuZDsKICAgfQogCi0gIHNpemVfdCBsZW4gPSBtYXhfb3V0OwotICBpZiAoIUVWUF9QS0VZX3NpZ25faW5pdChjdHgpIHx8Ci0gICAgICAhRVZQX1BLRVlfQ1RYX3NldF9zaWduYXR1cmVfbWQoY3R4LCBtZCkgfHwKLSAgICAgICFFVlBfUEtFWV9zaWduKGN0eCwgb3V0LCAmbGVuLCBpbiwgaW5fbGVuKSkgeworICBpZiAoQklPX3JlYWRfZmlsZW5hbWUoaW4sIGZpbGUpIDw9IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUsIEVSUl9SX1NZU19MSUIpOwogICAgIGdvdG8gZW5kOwogICB9Ci0gICpvdXRfbGVuID0gbGVuOwotICByZXQgPSBzc2xfcHJpdmF0ZV9rZXlfc3VjY2VzczsKKworICB4ID0gUEVNX3JlYWRfYmlvX1g1MDlfQVVYKGluLCBOVUxMLCBjdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2tfdXNlcmRhdGEpOworICBpZiAoeCA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlLCBFUlJfUl9QRU1fTElCKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIHJldCA9IFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlKGN0eCwgeCk7CisKKyAgaWYgKEVSUl9wZWVrX2Vycm9yKCkgIT0gMCkgeworICAgIHJldCA9IDA7IC8qIEtleS9jZXJ0aWZpY2F0ZSBtaXNtYXRjaCBkb2Vzbid0IGltcGx5IHJldD09MCAuLi4gKi8KKyAgfQorCisgIGlmIChyZXQpIHsKKyAgICAvKiBJZiB3ZSBjb3VsZCBzZXQgdXAgb3VyIGNlcnRpZmljYXRlLCBub3cgcHJvY2VlZCB0byB0aGUgQ0EKKyAgICAgKiBjZXJ0aWZpY2F0ZXMuICovCisgICAgWDUwOSAqY2E7CisgICAgaW50IHI7CisgICAgdWludDMyX3QgZXJyOworCisgICAgU1NMX0NUWF9jbGVhcl9jaGFpbl9jZXJ0cyhjdHgpOworCisgICAgd2hpbGUgKChjYSA9IFBFTV9yZWFkX2Jpb19YNTA5KGluLCBOVUxMLCBjdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrX3VzZXJkYXRhKSkgIT0KKyAgICAgICAgICAgTlVMTCkgeworICAgICAgciA9IFNTTF9DVFhfYWRkMF9jaGFpbl9jZXJ0KGN0eCwgY2EpOworICAgICAgaWYgKCFyKSB7CisgICAgICAgIFg1MDlfZnJlZShjYSk7CisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGdvdG8gZW5kOworICAgICAgfQorICAgICAgLyogTm90ZSB0aGF0IHdlIG11c3Qgbm90IGZyZWUgciBpZiBpdCB3YXMgc3VjY2Vzc2Z1bGx5IGFkZGVkIHRvIHRoZSBjaGFpbgorICAgICAgICogKHdoaWxlIHdlIG11c3QgZnJlZSB0aGUgbWFpbiBjZXJ0aWZpY2F0ZSwgc2luY2UgaXRzIHJlZmVyZW5jZSBjb3VudCBpcworICAgICAgICogaW5jcmVhc2VkIGJ5IFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlKS4gKi8KKyAgICB9CisKKyAgICAvKiBXaGVuIHRoZSB3aGlsZSBsb29wIGVuZHMsIGl0J3MgdXN1YWxseSBqdXN0IEVPRi4gKi8KKyAgICBlcnIgPSBFUlJfcGVla19sYXN0X2Vycm9yKCk7CisgICAgaWYgKEVSUl9HRVRfTElCKGVycikgPT0gRVJSX0xJQl9QRU0gJiYKKyAgICAgICAgRVJSX0dFVF9SRUFTT04oZXJyKSA9PSBQRU1fUl9OT19TVEFSVF9MSU5FKSB7CisgICAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0ID0gMDsgLyogc29tZSByZWFsIGVycm9yICovCisgICAgfQorICB9CiAKIGVuZDoKLSAgRVZQX1BLRVlfQ1RYX2ZyZWUoY3R4KTsKKyAgWDUwOV9mcmVlKHgpOworICBCSU9fZnJlZShpbik7CiAgIHJldHVybiByZXQ7CiB9Ci0KLWVudW0gc3NsX3ByaXZhdGVfa2V5X3Jlc3VsdF90IHNzbF9wcml2YXRlX2tleV9zaWduX2NvbXBsZXRlKAotICAgIFNTTCAqc3NsLCB1aW50OF90ICpvdXQsIHNpemVfdCAqb3V0X2xlbiwgc2l6ZV90IG1heF9vdXQpIHsKLSAgLyogT25seSBjdXN0b20ga2V5cyBtYXkgYmUgYXN5bmNocm9ub3VzLiAqLwotICByZXR1cm4gc3NsLT5jZXJ0LT5rZXlfbWV0aG9kLT5zaWduX2NvbXBsZXRlKHNzbCwgb3V0LCBvdXRfbGVuLCBtYXhfb3V0KTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zc2wvc3NsX3Nlc3Npb24uYyBiL3NyYy9zc2wvc3NsX3Nlc3MuYwpzaW1pbGFyaXR5IGluZGV4IDYxJQpyZW5hbWUgZnJvbSBzcmMvc3NsL3NzbF9zZXNzaW9uLmMKcmVuYW1lIHRvIHNyYy9zc2wvc3NsX3Nlc3MuYwppbmRleCAzNDVhY2EyLi45YWI0NTg1IDEwMDY0NAotLS0gYS9zcmMvc3NsL3NzbF9zZXNzaW9uLmMKKysrIGIvc3JjL3NzbC9zc2xfc2Vzcy5jCkBAIC0xMzMsOSArMTMzLDYgQEAKICAqIE9USEVSIEVOVElUWSBCQVNFRCBPTiBJTkZSSU5HRU1FTlQgT0YgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUyBPUgogICogT1RIRVJXSVNFLiAqLwogCi0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKQEAgLTE1MywxMTEgKzE1MCwxMSBAQAogICogdGhhdCBpdCBuZWVkcyB0byBhc3luY2hyb25vdXNseSBmZXRjaCBzZXNzaW9uIGluZm9ybWF0aW9uLiAqLwogc3RhdGljIGNvbnN0IGNoYXIgZ19wZW5kaW5nX3Nlc3Npb25fbWFnaWMgPSAwOwogCi1zdGF0aWMgQ1JZUFRPX0VYX0RBVEFfQ0xBU1MgZ19leF9kYXRhX2NsYXNzID0KLSAgICBDUllQVE9fRVhfREFUQV9DTEFTU19JTklUX1dJVEhfQVBQX0RBVEE7CitzdGF0aWMgQ1JZUFRPX0VYX0RBVEFfQ0xBU1MgZ19leF9kYXRhX2NsYXNzID0gQ1JZUFRPX0VYX0RBVEFfQ0xBU1NfSU5JVDsKIAotc3RhdGljIHZvaWQgU1NMX1NFU1NJT05fbGlzdF9yZW1vdmUoU1NMX0NUWCAqY3R4LCBTU0xfU0VTU0lPTiAqc2Vzc2lvbik7Ci1zdGF0aWMgdm9pZCBTU0xfU0VTU0lPTl9saXN0X2FkZChTU0xfQ1RYICpjdHgsIFNTTF9TRVNTSU9OICpzZXNzaW9uKTsKLXN0YXRpYyBpbnQgcmVtb3ZlX3Nlc3Npb25fbG9jayhTU0xfQ1RYICpjdHgsIFNTTF9TRVNTSU9OICpzZXNzaW9uLCBpbnQgbG9jayk7Ci0KLVNTTF9TRVNTSU9OICpTU0xfU0VTU0lPTl9uZXcodm9pZCkgewotICBTU0xfU0VTU0lPTiAqc2Vzc2lvbiA9IChTU0xfU0VTU0lPTiAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihTU0xfU0VTU0lPTikpOwotICBpZiAoc2Vzc2lvbiA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgbWVtc2V0KHNlc3Npb24sIDAsIHNpemVvZihTU0xfU0VTU0lPTikpOwotCi0gIHNlc3Npb24tPnZlcmlmeV9yZXN1bHQgPSAxOyAvKiBhdm9pZCAwICg9IFg1MDlfVl9PSykganVzdCBpbiBjYXNlICovCi0gIHNlc3Npb24tPnJlZmVyZW5jZXMgPSAxOwotICBzZXNzaW9uLT50aW1lb3V0ID0gU1NMX0RFRkFVTFRfU0VTU0lPTl9USU1FT1VUOwotICBzZXNzaW9uLT50aW1lID0gKHVuc2lnbmVkIGxvbmcpdGltZShOVUxMKTsKLSAgQ1JZUFRPX25ld19leF9kYXRhKCZnX2V4X2RhdGFfY2xhc3MsIHNlc3Npb24sICZzZXNzaW9uLT5leF9kYXRhKTsKLSAgcmV0dXJuIHNlc3Npb247Ci19Ci0KLVNTTF9TRVNTSU9OICpTU0xfU0VTU0lPTl91cF9yZWYoU1NMX1NFU1NJT04gKnNlc3Npb24pIHsKLSAgaWYgKHNlc3Npb24gIT0gTlVMTCkgewotICAgIENSWVBUT19yZWZjb3VudF9pbmMoJnNlc3Npb24tPnJlZmVyZW5jZXMpOwotICB9Ci0gIHJldHVybiBzZXNzaW9uOwotfQotCi12b2lkIFNTTF9TRVNTSU9OX2ZyZWUoU1NMX1NFU1NJT04gKnNlc3Npb24pIHsKLSAgaWYgKHNlc3Npb24gPT0gTlVMTCB8fAotICAgICAgIUNSWVBUT19yZWZjb3VudF9kZWNfYW5kX3Rlc3RfemVybygmc2Vzc2lvbi0+cmVmZXJlbmNlcykpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDUllQVE9fZnJlZV9leF9kYXRhKCZnX2V4X2RhdGFfY2xhc3MsIHNlc3Npb24sICZzZXNzaW9uLT5leF9kYXRhKTsKLQotICBPUEVOU1NMX2NsZWFuc2Uoc2Vzc2lvbi0+bWFzdGVyX2tleSwgc2l6ZW9mKHNlc3Npb24tPm1hc3Rlcl9rZXkpKTsKLSAgT1BFTlNTTF9jbGVhbnNlKHNlc3Npb24tPnNlc3Npb25faWQsIHNpemVvZihzZXNzaW9uLT5zZXNzaW9uX2lkKSk7Ci0gIFg1MDlfZnJlZShzZXNzaW9uLT5wZWVyKTsKLSAgc2tfWDUwOV9wb3BfZnJlZShzZXNzaW9uLT5jZXJ0X2NoYWluLCBYNTA5X2ZyZWUpOwotICBPUEVOU1NMX2ZyZWUoc2Vzc2lvbi0+dGxzZXh0X2hvc3RuYW1lKTsKLSAgT1BFTlNTTF9mcmVlKHNlc3Npb24tPnRsc2V4dF90aWNrKTsKLSAgT1BFTlNTTF9mcmVlKHNlc3Npb24tPnRsc2V4dF9zaWduZWRfY2VydF90aW1lc3RhbXBfbGlzdCk7Ci0gIE9QRU5TU0xfZnJlZShzZXNzaW9uLT5vY3NwX3Jlc3BvbnNlKTsKLSAgT1BFTlNTTF9mcmVlKHNlc3Npb24tPnBza19pZGVudGl0eSk7Ci0gIE9QRU5TU0xfY2xlYW5zZShzZXNzaW9uLCBzaXplb2YoKnNlc3Npb24pKTsKLSAgT1BFTlNTTF9mcmVlKHNlc3Npb24pOwotfQotCi1jb25zdCB1aW50OF90ICpTU0xfU0VTU0lPTl9nZXRfaWQoY29uc3QgU1NMX1NFU1NJT04gKnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKm91dF9sZW4pIHsKLSAgaWYgKG91dF9sZW4gIT0gTlVMTCkgewotICAgICpvdXRfbGVuID0gc2Vzc2lvbi0+c2Vzc2lvbl9pZF9sZW5ndGg7Ci0gIH0KLSAgcmV0dXJuIHNlc3Npb24tPnNlc3Npb25faWQ7Ci19Ci0KLWxvbmcgU1NMX1NFU1NJT05fZ2V0X3RpbWVvdXQoY29uc3QgU1NMX1NFU1NJT04gKnNlc3Npb24pIHsKLSAgcmV0dXJuIHNlc3Npb24tPnRpbWVvdXQ7Ci19Ci0KLWxvbmcgU1NMX1NFU1NJT05fZ2V0X3RpbWUoY29uc3QgU1NMX1NFU1NJT04gKnNlc3Npb24pIHsKLSAgcmV0dXJuIHNlc3Npb24tPnRpbWU7Ci19Ci0KLXVpbnQzMl90IFNTTF9TRVNTSU9OX2dldF9rZXlfZXhjaGFuZ2VfaW5mbyhjb25zdCBTU0xfU0VTU0lPTiAqc2Vzc2lvbikgewotICByZXR1cm4gc2Vzc2lvbi0+a2V5X2V4Y2hhbmdlX2luZm87Ci19Ci0KLVg1MDkgKlNTTF9TRVNTSU9OX2dldDBfcGVlcihjb25zdCBTU0xfU0VTU0lPTiAqc2Vzc2lvbikgewotICByZXR1cm4gc2Vzc2lvbi0+cGVlcjsKLX0KLQotbG9uZyBTU0xfU0VTU0lPTl9zZXRfdGltZShTU0xfU0VTU0lPTiAqc2Vzc2lvbiwgbG9uZyB0aW1lKSB7Ci0gIGlmIChzZXNzaW9uID09IE5VTEwpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHNlc3Npb24tPnRpbWUgPSB0aW1lOwotICByZXR1cm4gdGltZTsKLX0KLQotbG9uZyBTU0xfU0VTU0lPTl9zZXRfdGltZW91dChTU0xfU0VTU0lPTiAqc2Vzc2lvbiwgbG9uZyB0aW1lb3V0KSB7Ci0gIGlmIChzZXNzaW9uID09IE5VTEwpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHNlc3Npb24tPnRpbWVvdXQgPSB0aW1lb3V0OwotICByZXR1cm4gMTsKLX0KLQotaW50IFNTTF9TRVNTSU9OX3NldDFfaWRfY29udGV4dChTU0xfU0VTU0lPTiAqc2Vzc2lvbiwgY29uc3QgdWludDhfdCAqc2lkX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2lkX2N0eF9sZW4pIHsKLSAgaWYgKHNpZF9jdHhfbGVuID4gU1NMX01BWF9TSURfQ1RYX0xFTkdUSCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfU1NMX1NFU1NJT05fSURfQ09OVEVYVF9UT09fTE9ORyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBzZXNzaW9uLT5zaWRfY3R4X2xlbmd0aCA9IHNpZF9jdHhfbGVuOwotICBtZW1jcHkoc2Vzc2lvbi0+c2lkX2N0eCwgc2lkX2N0eCwgc2lkX2N0eF9sZW4pOwotCi0gIHJldHVybiAxOwotfQorc3RhdGljIHZvaWQgU1NMX1NFU1NJT05fbGlzdF9yZW1vdmUoU1NMX0NUWCAqY3R4LCBTU0xfU0VTU0lPTiAqcyk7CitzdGF0aWMgdm9pZCBTU0xfU0VTU0lPTl9saXN0X2FkZChTU0xfQ1RYICpjdHgsIFNTTF9TRVNTSU9OICpzKTsKK3N0YXRpYyBpbnQgcmVtb3ZlX3Nlc3Npb25fbG9jayhTU0xfQ1RYICpjdHgsIFNTTF9TRVNTSU9OICpjLCBpbnQgbGNrKTsKIAogU1NMX1NFU1NJT04gKlNTTF9tYWdpY19wZW5kaW5nX3Nlc3Npb25fcHRyKHZvaWQpIHsKICAgcmV0dXJuIChTU0xfU0VTU0lPTiAqKSZnX3BlbmRpbmdfc2Vzc2lvbl9tYWdpYzsKQEAgLTI4NSwxMiArMTgyLDM3IEBACiAgIHJldHVybiBpbmRleDsKIH0KIAotaW50IFNTTF9TRVNTSU9OX3NldF9leF9kYXRhKFNTTF9TRVNTSU9OICpzZXNzaW9uLCBpbnQgaWR4LCB2b2lkICphcmcpIHsKLSAgcmV0dXJuIENSWVBUT19zZXRfZXhfZGF0YSgmc2Vzc2lvbi0+ZXhfZGF0YSwgaWR4LCBhcmcpOworaW50IFNTTF9TRVNTSU9OX3NldF9leF9kYXRhKFNTTF9TRVNTSU9OICpzLCBpbnQgaWR4LCB2b2lkICphcmcpIHsKKyAgcmV0dXJuIENSWVBUT19zZXRfZXhfZGF0YSgmcy0+ZXhfZGF0YSwgaWR4LCBhcmcpOwogfQogCi12b2lkICpTU0xfU0VTU0lPTl9nZXRfZXhfZGF0YShjb25zdCBTU0xfU0VTU0lPTiAqc2Vzc2lvbiwgaW50IGlkeCkgewotICByZXR1cm4gQ1JZUFRPX2dldF9leF9kYXRhKCZzZXNzaW9uLT5leF9kYXRhLCBpZHgpOwordm9pZCAqU1NMX1NFU1NJT05fZ2V0X2V4X2RhdGEoY29uc3QgU1NMX1NFU1NJT04gKnMsIGludCBpZHgpIHsKKyAgcmV0dXJuIENSWVBUT19nZXRfZXhfZGF0YSgmcy0+ZXhfZGF0YSwgaWR4KTsKK30KKworU1NMX1NFU1NJT04gKlNTTF9TRVNTSU9OX25ldyh2b2lkKSB7CisgIFNTTF9TRVNTSU9OICpzczsKKworICBzcyA9IChTU0xfU0VTU0lPTiAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihTU0xfU0VTU0lPTikpOworICBpZiAoc3MgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1NFU1NJT05fbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbWVtc2V0KHNzLCAwLCBzaXplb2YoU1NMX1NFU1NJT04pKTsKKworICBzcy0+dmVyaWZ5X3Jlc3VsdCA9IDE7IC8qIGF2b2lkIDAgKD0gWDUwOV9WX09LKSBqdXN0IGluIGNhc2UgKi8KKyAgc3MtPnJlZmVyZW5jZXMgPSAxOworICBzcy0+dGltZW91dCA9IFNTTF9ERUZBVUxUX1NFU1NJT05fVElNRU9VVDsKKyAgc3MtPnRpbWUgPSAodW5zaWduZWQgbG9uZyl0aW1lKE5VTEwpOworICBDUllQVE9fbmV3X2V4X2RhdGEoJmdfZXhfZGF0YV9jbGFzcywgc3MsICZzcy0+ZXhfZGF0YSk7CisgIHJldHVybiBzczsKK30KKworY29uc3QgdWludDhfdCAqU1NMX1NFU1NJT05fZ2V0X2lkKGNvbnN0IFNTTF9TRVNTSU9OICpzLCB1bnNpZ25lZCBpbnQgKmxlbikgeworICBpZiAobGVuKSB7CisgICAgKmxlbiA9IHMtPnNlc3Npb25faWRfbGVuZ3RoOworICB9CisgIHJldHVybiBzLT5zZXNzaW9uX2lkOwogfQogCiAvKiBFdmVuIHdpdGggU1NMdjIsIHdlIGhhdmUgMTYgYnl0ZXMgKDEyOCBiaXRzKSBvZiBzZXNzaW9uIElEIHNwYWNlLgpAQCAtMzAzLDkgKzIyNSw5IEBACiAgKiBzZXJ2ZXIuIEhvdyB5b3UgbWlnaHQgc3RvcmUgdGhhdCBtYW55IHNlc3Npb25zIGlzIHBlcmhhcHMgYSBtb3JlIGludGVyZXN0aW5nCiAgKiBxdWVzdGlvbiAuLi4gKi8KIHN0YXRpYyBpbnQgZGVmX2dlbmVyYXRlX3Nlc3Npb25faWQoY29uc3QgU1NMICpzc2wsIHVpbnQ4X3QgKmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqaWRfbGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqaWRfbGVuKSB7CiAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrTWF4QXR0ZW1wdHMgPSAxMDsKLSAgdW5zaWduZWQgcmV0cnkgPSAwOworICB1bnNpZ25lZCBpbnQgcmV0cnkgPSAwOwogICBkbyB7CiAgICAgaWYgKCFSQU5EX2J5dGVzKGlkLCAqaWRfbGVuKSkgewogICAgICAgcmV0dXJuIDA7CkBAIC0zMzUsNyArMjU3LDggQEAKICAgR0VOX1NFU1NJT05fQ0IgY2IgPSBkZWZfZ2VuZXJhdGVfc2Vzc2lvbl9pZDsKIAogICBpZiAocy0+bW9kZSAmIFNTTF9NT0RFX05PX1NFU1NJT05fQ1JFQVRJT04pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1NFU1NJT05fTUFZX05PVF9CRV9DUkVBVEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9nZXRfbmV3X3Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfU0VTU0lPTl9NQVlfTk9UX0JFX0NSRUFURUQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTM1OSw3ICsyODIsOCBAQAogICAgICAgc3MtPnNzbF92ZXJzaW9uID0gcy0+dmVyc2lvbjsKICAgICAgIHNzLT5zZXNzaW9uX2lkX2xlbmd0aCA9IFNTTDNfU1NMX1NFU1NJT05fSURfTEVOR1RIOwogICAgIH0gZWxzZSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1VOU1VQUE9SVEVEX1NTTF9WRVJTSU9OKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX2dldF9uZXdfc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1VOU1VQUE9SVEVEX1NTTF9WRVJTSU9OKTsKICAgICAgIFNTTF9TRVNTSU9OX2ZyZWUoc3MpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMzgxLDcgKzMwNSw4IEBACiAgICAgdG1wID0gc3MtPnNlc3Npb25faWRfbGVuZ3RoOwogICAgIGlmICghY2Iocywgc3MtPnNlc3Npb25faWQsICZ0bXApKSB7CiAgICAgICAvKiBUaGUgY2FsbGJhY2sgZmFpbGVkICovCi0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1NTTF9TRVNTSU9OX0lEX0NBTExCQUNLX0ZBSUxFRCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9nZXRfbmV3X3Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9TU0xfU0VTU0lPTl9JRF9DQUxMQkFDS19GQUlMRUQpOwogICAgICAgU1NMX1NFU1NJT05fZnJlZShzcyk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0zOTAsNyArMzE1LDggQEAKICAgICAgKiBoaWdoZXIgdGhhbiBpdCB3YXMuICovCiAgICAgaWYgKCF0bXAgfHwgdG1wID4gc3MtPnNlc3Npb25faWRfbGVuZ3RoKSB7CiAgICAgICAvKiBUaGUgY2FsbGJhY2sgc2V0IGFuIGlsbGVnYWwgbGVuZ3RoICovCi0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1NTTF9TRVNTSU9OX0lEX0hBU19CQURfTEVOR1RIKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX2dldF9uZXdfc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1NTTF9TRVNTSU9OX0lEX0hBU19CQURfTEVOR1RIKTsKICAgICAgIFNTTF9TRVNTSU9OX2ZyZWUoc3MpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMzk4LDcgKzMyNCw4IEBACiAgICAgc3MtPnNlc3Npb25faWRfbGVuZ3RoID0gdG1wOwogICAgIC8qIEZpbmFsbHksIGNoZWNrIGZvciBhIGNvbmZsaWN0ICovCiAgICAgaWYgKFNTTF9oYXNfbWF0Y2hpbmdfc2Vzc2lvbl9pZChzLCBzcy0+c2Vzc2lvbl9pZCwgc3MtPnNlc3Npb25faWRfbGVuZ3RoKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9TU0xfU0VTU0lPTl9JRF9DT05GTElDVCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9nZXRfbmV3X3Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9TU0xfU0VTU0lPTl9JRF9DT05GTElDVCk7CiAgICAgICBTU0xfU0VTU0lPTl9mcmVlKHNzKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTQwNyw3ICszMzQsNyBAQAogICAgIGlmIChzLT50bHNleHRfaG9zdG5hbWUpIHsKICAgICAgIHNzLT50bHNleHRfaG9zdG5hbWUgPSBCVUZfc3RyZHVwKHMtPnRsc2V4dF9ob3N0bmFtZSk7CiAgICAgICBpZiAoc3MtPnRsc2V4dF9ob3N0bmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9nZXRfbmV3X3Nlc3Npb24sIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICAgICAgU1NMX1NFU1NJT05fZnJlZShzcyk7CiAgICAgICAgIHJldHVybiAwOwogICAgICAgfQpAQCAtNDE3LDcgKzM0NCw3IEBACiAgIH0KIAogICBpZiAocy0+c2lkX2N0eF9sZW5ndGggPiBzaXplb2Yoc3MtPnNpZF9jdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfZ2V0X25ld19zZXNzaW9uLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgU1NMX1NFU1NJT05fZnJlZShzcyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KQEAgLTQzMSwxMTAgKzM1OCwxMjEgQEAKICAgcmV0dXJuIDE7CiB9CiAKLS8qIHNzbF9sb29rdXBfc2Vzc2lvbiBsb29rcyB1cCB8c2Vzc2lvbl9pZHwgaW4gdGhlIHNlc3Npb24gY2FjaGUgYW5kIHNldHMKLSAqIHwqb3V0X3Nlc3Npb258IHRvIGFuIHxTU0xfU0VTU0lPTnwgb2JqZWN0IGlmIGZvdW5kLiBUaGUgY2FsbGVyIHRha2VzCi0gKiBvd25lcnNoaXAgb2YgdGhlIHJlc3VsdC4gKi8KLXN0YXRpYyBlbnVtIHNzbF9zZXNzaW9uX3Jlc3VsdF90IHNzbF9sb29rdXBfc2Vzc2lvbigKLSAgICBTU0wgKnNzbCwgU1NMX1NFU1NJT04gKipvdXRfc2Vzc2lvbiwgY29uc3QgdWludDhfdCAqc2Vzc2lvbl9pZCwKLSAgICBzaXplX3Qgc2Vzc2lvbl9pZF9sZW4pIHsKLSAgKm91dF9zZXNzaW9uID0gTlVMTDsKKy8qIHNzbF9nZXRfcHJldiBhdHRlbXB0cyB0byBmaW5kIGFuIFNTTF9TRVNTSU9OIHRvIGJlIHVzZWQgdG8gcmVzdW1lIHRoaXMKKyAqIGNvbm5lY3Rpb24uIEl0IGlzIG9ubHkgY2FsbGVkIGJ5IHNlcnZlcnMuCisgKgorICogICBjdHg6IGNvbnRhaW5zIHRoZSBlYXJseSBjYWxsYmFjayBjb250ZXh0LCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIGEKKyAqICAgICAgIHNoYWxsb3cgcGFyc2Ugb2YgdGhlIENsaWVudEhlbGxvLgorICoKKyAqIFJldHVybnM6CisgKiAgIC0xOiBlcnJvcgorICogICAgMDogYSBzZXNzaW9uIG1heSBoYXZlIGJlZW4gZm91bmQuCisgKgorICogU2lkZSBlZmZlY3RzOgorICogICAtIElmIGEgc2Vzc2lvbiBpcyBmb3VuZCB0aGVuIHMtPnNlc3Npb24gaXMgcG9pbnRlZCBhdCBpdCAoYWZ0ZXIgZnJlZWluZyBhbgorICogICAgIGV4aXN0aW5nIHNlc3Npb24gaWYgbmVlZCBiZSkgYW5kIHMtPnZlcmlmeV9yZXN1bHQgaXMgc2V0IGZyb20gdGhlIHNlc3Npb24uCisgKiAgIC0gQm90aCBmb3IgbmV3IGFuZCByZXN1bWVkIHNlc3Npb25zLCBzLT50bHNleHRfdGlja2V0X2V4cGVjdGVkIGlzIHNldCB0byAxCisgKiAgICAgaWYgdGhlIHNlcnZlciBzaG91bGQgaXNzdWUgYSBuZXcgc2Vzc2lvbiB0aWNrZXQgKHRvIDAgb3RoZXJ3aXNlKS4gKi8KK2ludCBzc2xfZ2V0X3ByZXZfc2Vzc2lvbihTU0wgKnMsIGNvbnN0IHN0cnVjdCBzc2xfZWFybHlfY2FsbGJhY2tfY3R4ICpjdHgpIHsKKyAgLyogVGhpcyBpcyB1c2VkIG9ubHkgYnkgc2VydmVycy4gKi8KKyAgU1NMX1NFU1NJT04gKnJldCA9IE5VTEw7CisgIGludCBmYXRhbCA9IDA7CisgIGludCB0cnlfc2Vzc2lvbl9jYWNoZSA9IDE7CisgIGludCByOwogCi0gIGlmIChzZXNzaW9uX2lkX2xlbiA9PSAwIHx8IHNlc3Npb25faWRfbGVuID4gU1NMX01BWF9TU0xfU0VTU0lPTl9JRF9MRU5HVEgpIHsKLSAgICByZXR1cm4gc3NsX3Nlc3Npb25fc3VjY2VzczsKKyAgaWYgKGN0eC0+c2Vzc2lvbl9pZF9sZW4gPiBTU0xfTUFYX1NTTF9TRVNTSU9OX0lEX0xFTkdUSCkgeworICAgIGdvdG8gZXJyOwogICB9CiAKLSAgU1NMX1NFU1NJT04gKnNlc3Npb247Ci0gIC8qIFRyeSB0aGUgaW50ZXJuYWwgY2FjaGUsIGlmIGl0IGV4aXN0cy4gKi8KLSAgaWYgKCEoc3NsLT5pbml0aWFsX2N0eC0+c2Vzc2lvbl9jYWNoZV9tb2RlICYKKyAgaWYgKGN0eC0+c2Vzc2lvbl9pZF9sZW4gPT0gMCkgeworICAgIHRyeV9zZXNzaW9uX2NhY2hlID0gMDsKKyAgfQorCisgIHIgPSB0bHMxX3Byb2Nlc3NfdGlja2V0KHMsIGN0eCwgJnJldCk7IC8qIHNldHMgcy0+dGxzZXh0X3RpY2tldF9leHBlY3RlZCAqLworICBzd2l0Y2ggKHIpIHsKKyAgICBjYXNlIC0xOiAvKiBFcnJvciBkdXJpbmcgcHJvY2Vzc2luZyAqLworICAgICAgZmF0YWwgPSAxOworICAgICAgZ290byBlcnI7CisKKyAgICBjYXNlIDA6ICAvKiBObyB0aWNrZXQgZm91bmQgKi8KKyAgICBjYXNlIDE6ICAvKiBaZXJvIGxlbmd0aCB0aWNrZXQgZm91bmQgKi8KKyAgICAgIGJyZWFrOyAvKiBPayB0byBjYXJyeSBvbiBwcm9jZXNzaW5nIHNlc3Npb24gaWQuICovCisKKyAgICBjYXNlIDI6ICAvKiBUaWNrZXQgZm91bmQgYnV0IG5vdCBkZWNyeXB0ZWQuICovCisgICAgY2FzZSAzOiAgLyogVGlja2V0IGRlY3J5cHRlZCwgKnJldCBoYXMgYmVlbiBzZXQuICovCisgICAgICB0cnlfc2Vzc2lvbl9jYWNoZSA9IDA7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCgpOworICB9CisKKyAgaWYgKHRyeV9zZXNzaW9uX2NhY2hlICYmIHJldCA9PSBOVUxMICYmCisgICAgICAhKHMtPmluaXRpYWxfY3R4LT5zZXNzaW9uX2NhY2hlX21vZGUgJgogICAgICAgICBTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTF9MT09LVVApKSB7CiAgICAgU1NMX1NFU1NJT04gZGF0YTsKLSAgICBkYXRhLnNzbF92ZXJzaW9uID0gc3NsLT52ZXJzaW9uOwotICAgIGRhdGEuc2Vzc2lvbl9pZF9sZW5ndGggPSBzZXNzaW9uX2lkX2xlbjsKLSAgICBtZW1jcHkoZGF0YS5zZXNzaW9uX2lkLCBzZXNzaW9uX2lkLCBzZXNzaW9uX2lkX2xlbik7Ci0KLSAgICBDUllQVE9fTVVURVhfbG9ja19yZWFkKCZzc2wtPmluaXRpYWxfY3R4LT5sb2NrKTsKLSAgICBzZXNzaW9uID0gbGhfU1NMX1NFU1NJT05fcmV0cmlldmUoc3NsLT5pbml0aWFsX2N0eC0+c2Vzc2lvbnMsICZkYXRhKTsKLSAgICBpZiAoc2Vzc2lvbiAhPSBOVUxMKSB7Ci0gICAgICBTU0xfU0VTU0lPTl91cF9yZWYoc2Vzc2lvbik7CisgICAgZGF0YS5zc2xfdmVyc2lvbiA9IHMtPnZlcnNpb247CisgICAgZGF0YS5zZXNzaW9uX2lkX2xlbmd0aCA9IGN0eC0+c2Vzc2lvbl9pZF9sZW47CisgICAgaWYgKGN0eC0+c2Vzc2lvbl9pZF9sZW4gPT0gMCkgeworICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIENSWVBUT19NVVRFWF91bmxvY2soJnNzbC0+aW5pdGlhbF9jdHgtPmxvY2spOworICAgIG1lbWNweShkYXRhLnNlc3Npb25faWQsIGN0eC0+c2Vzc2lvbl9pZCwgY3R4LT5zZXNzaW9uX2lkX2xlbik7CiAKLSAgICBpZiAoc2Vzc2lvbiAhPSBOVUxMKSB7Ci0gICAgICAqb3V0X3Nlc3Npb24gPSBzZXNzaW9uOwotICAgICAgcmV0dXJuIHNzbF9zZXNzaW9uX3N1Y2Nlc3M7CisgICAgQ1JZUFRPX01VVEVYX2xvY2tfcmVhZCgmcy0+aW5pdGlhbF9jdHgtPmxvY2spOworICAgIHJldCA9IGxoX1NTTF9TRVNTSU9OX3JldHJpZXZlKHMtPmluaXRpYWxfY3R4LT5zZXNzaW9ucywgJmRhdGEpOworICAgIENSWVBUT19NVVRFWF91bmxvY2soJnMtPmluaXRpYWxfY3R4LT5sb2NrKTsKKworICAgIGlmIChyZXQgIT0gTlVMTCkgeworICAgICAgU1NMX1NFU1NJT05fdXBfcmVmKHJldCk7CiAgICAgfQogICB9CiAKLSAgLyogRmFsbCBiYWNrIHRvIHRoZSBleHRlcm5hbCBjYWNoZSwgaWYgaXQgZXhpc3RzLiAqLwotICBpZiAoc3NsLT5pbml0aWFsX2N0eC0+Z2V0X3Nlc3Npb25fY2IgPT0gTlVMTCkgewotICAgIHJldHVybiBzc2xfc2Vzc2lvbl9zdWNjZXNzOwotICB9Ci0gIGludCBjb3B5ID0gMTsKLSAgc2Vzc2lvbiA9IHNzbC0+aW5pdGlhbF9jdHgtPmdldF9zZXNzaW9uX2NiKHNzbCwgKHVpbnQ4X3QgKilzZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbl9pZF9sZW4sICZjb3B5KTsKLSAgaWYgKHNlc3Npb24gPT0gTlVMTCkgewotICAgIHJldHVybiBzc2xfc2Vzc2lvbl9zdWNjZXNzOwotICB9Ci0gIGlmIChzZXNzaW9uID09IFNTTF9tYWdpY19wZW5kaW5nX3Nlc3Npb25fcHRyKCkpIHsKLSAgICByZXR1cm4gc3NsX3Nlc3Npb25fcmV0cnk7Ci0gIH0KKyAgaWYgKHRyeV9zZXNzaW9uX2NhY2hlICYmIHJldCA9PSBOVUxMICYmCisgICAgICBzLT5pbml0aWFsX2N0eC0+Z2V0X3Nlc3Npb25fY2IgIT0gTlVMTCkgeworICAgIGludCBjb3B5ID0gMTsKIAotICAvKiBJbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IG5vdyBpZiB0aGUgc2Vzc2lvbiBjYWxsYmFjayBhc2tzIHVzIHRvIGRvIHNvCi0gICAqIChub3RlIHRoYXQgaWYgdGhlIHNlc3Npb24gc3RydWN0dXJlcyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2sgYXJlIHNoYXJlZAotICAgKiBiZXR3ZWVuIHRocmVhZHMsIGl0IG11c3QgaGFuZGxlIHRoZSByZWZlcmVuY2UgY291bnQgaXRzZWxmIFtpLmUuIGNvcHkgPT0KLSAgICogMF0sIG9yIHRoaW5ncyB3b24ndCBiZSB0aHJlYWQtc2FmZSkuICovCi0gIGlmIChjb3B5KSB7Ci0gICAgU1NMX1NFU1NJT05fdXBfcmVmKHNlc3Npb24pOwotICB9CisgICAgcmV0ID0gcy0+aW5pdGlhbF9jdHgtPmdldF9zZXNzaW9uX2NiKHMsICh1aW50OF90ICopY3R4LT5zZXNzaW9uX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnNlc3Npb25faWRfbGVuLCAmY29weSk7CisgICAgaWYgKHJldCAhPSBOVUxMKSB7CisgICAgICBpZiAocmV0ID09IFNTTF9tYWdpY19wZW5kaW5nX3Nlc3Npb25fcHRyKCkpIHsKKyAgICAgICAgLyogVGhpcyBpcyBhIG1hZ2ljIHZhbHVlIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBjYWxsYmFjayBuZWVkcyB0bworICAgICAgICAgKiB1bndpbmQgdGhlIHN0YWNrIGFuZCBmaWd1cmUgb3V0IHRoZSBzZXNzaW9uIGFzeW5jaHJvbm91c2x5LiAqLworICAgICAgICByZXR1cm4gUEVORElOR19TRVNTSU9OOworICAgICAgfQogCi0gIC8qIEFkZCB0aGUgZXh0ZXJuYWxseSBjYWNoZWQgc2Vzc2lvbiB0byB0aGUgaW50ZXJuYWwgY2FjaGUgaWYgbmVjZXNzYXJ5LiAqLwotICBpZiAoIShzc2wtPmluaXRpYWxfY3R4LT5zZXNzaW9uX2NhY2hlX21vZGUgJgotICAgICAgICBTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTF9TVE9SRSkpIHsKLSAgICBTU0xfQ1RYX2FkZF9zZXNzaW9uKHNzbC0+aW5pdGlhbF9jdHgsIHNlc3Npb24pOwotICB9CisgICAgICAvKiBJbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IG5vdyBpZiB0aGUgc2Vzc2lvbiBjYWxsYmFjayBhc2tzIHVzIHRvIGRvIHNvCisgICAgICAgKiAobm90ZSB0aGF0IGlmIHRoZSBzZXNzaW9uIHN0cnVjdHVyZXMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrIGFyZQorICAgICAgICogc2hhcmVkIGJldHdlZW4gdGhyZWFkcywgaXQgbXVzdCBoYW5kbGUgdGhlIHJlZmVyZW5jZSBjb3VudCBpdHNlbGYKKyAgICAgICAqIFtpLmUuIGNvcHkgPT0gMF0sIG9yIHRoaW5ncyB3b24ndCBiZSB0aHJlYWQtc2FmZSkuICovCisgICAgICBpZiAoY29weSkgeworICAgICAgICBTU0xfU0VTU0lPTl91cF9yZWYocmV0KTsKKyAgICAgIH0KIAotICAqb3V0X3Nlc3Npb24gPSBzZXNzaW9uOwotICByZXR1cm4gc3NsX3Nlc3Npb25fc3VjY2VzczsKLX0KLQotZW51bSBzc2xfc2Vzc2lvbl9yZXN1bHRfdCBzc2xfZ2V0X3ByZXZfc2Vzc2lvbigKLSAgICBTU0wgKnNzbCwgU1NMX1NFU1NJT04gKipvdXRfc2Vzc2lvbiwgaW50ICpvdXRfc2VuZF90aWNrZXQsCi0gICAgY29uc3Qgc3RydWN0IHNzbF9lYXJseV9jYWxsYmFja19jdHggKmN0eCkgewotICAvKiBUaGlzIGlzIHVzZWQgb25seSBieSBzZXJ2ZXJzLiAqLwotICBhc3NlcnQoc3NsLT5zZXJ2ZXIpOwotICBTU0xfU0VTU0lPTiAqc2Vzc2lvbiA9IE5VTEw7Ci0gIGludCBzZW5kX3RpY2tldCA9IDA7Ci0KLSAgLyogSWYgdGlja2V0cyBhcmUgZGlzYWJsZWQsIGFsd2F5cyBiZWhhdmUgYXMgaWYgbm8gdGlja2V0cyBhcmUgcHJlc2VudC4gKi8KLSAgY29uc3QgdWludDhfdCAqdGlja2V0ID0gTlVMTDsKLSAgc2l6ZV90IHRpY2tldF9sZW4gPSAwOwotICBjb25zdCBpbnQgdGlja2V0c19zdXBwb3J0ZWQgPQotICAgICAgIShTU0xfZ2V0X29wdGlvbnMoc3NsKSAmIFNTTF9PUF9OT19USUNLRVQpICYmCi0gICAgICAoc3NsLT52ZXJzaW9uID4gU1NMM19WRVJTSU9OIHx8IGN0eC0+ZXh0ZW5zaW9ucyAhPSBOVUxMKSAmJgotICAgICAgU1NMX2Vhcmx5X2NhbGxiYWNrX2N0eF9leHRlbnNpb25fZ2V0KGN0eCwgVExTRVhUX1RZUEVfc2Vzc2lvbl90aWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpY2tldCwgJnRpY2tldF9sZW4pOwotICBpZiAodGlja2V0c19zdXBwb3J0ZWQpIHsKLSAgICBpZiAoIXRsc19wcm9jZXNzX3RpY2tldChzc2wsICZzZXNzaW9uLCAmc2VuZF90aWNrZXQsIHRpY2tldCwgdGlja2V0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnNlc3Npb25faWQsIGN0eC0+c2Vzc2lvbl9pZF9sZW4pKSB7Ci0gICAgICByZXR1cm4gc3NsX3Nlc3Npb25fZXJyb3I7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIFRoZSBjbGllbnQgZG9lcyBub3Qgc3VwcG9ydCBzZXNzaW9uIHRpY2tldHMsIHNvIHRoZSBzZXNzaW9uIElEIHNob3VsZCBiZQotICAgICAqIHVzZWQgaW5zdGVhZC4gKi8KLSAgICBlbnVtIHNzbF9zZXNzaW9uX3Jlc3VsdF90IGxvb2t1cF9yZXQgPSBzc2xfbG9va3VwX3Nlc3Npb24oCi0gICAgICAgIHNzbCwgJnNlc3Npb24sIGN0eC0+c2Vzc2lvbl9pZCwgY3R4LT5zZXNzaW9uX2lkX2xlbik7Ci0gICAgaWYgKGxvb2t1cF9yZXQgIT0gc3NsX3Nlc3Npb25fc3VjY2VzcykgewotICAgICAgcmV0dXJuIGxvb2t1cF9yZXQ7CisgICAgICAvKiBBZGQgdGhlIGV4dGVybmFsbHkgY2FjaGVkIHNlc3Npb24gdG8gdGhlIGludGVybmFsIGNhY2hlIGFzIHdlbGwgaWYgYW5kCisgICAgICAgKiBvbmx5IGlmIHdlIGFyZSBzdXBwb3NlZCB0by4gKi8KKyAgICAgIGlmICghKHMtPmluaXRpYWxfY3R4LT5zZXNzaW9uX2NhY2hlX21vZGUgJgorICAgICAgICAgICAgU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfU1RPUkUpKSB7CisgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgc2hvdWxkIG5vdCByZXR1cm4gMSwgb3RoZXJ3aXNlLCB0aGluZ3MgYXJlIHZlcnkKKyAgICAgICAgICogc3RyYW5nZSAqLworICAgICAgICBTU0xfQ1RYX2FkZF9zZXNzaW9uKHMtPmluaXRpYWxfY3R4LCByZXQpOworICAgICAgfQogICAgIH0KICAgfQogCi0gIGlmIChzZXNzaW9uID09IE5VTEwgfHwKLSAgICAgIHNlc3Npb24tPnNpZF9jdHhfbGVuZ3RoICE9IHNzbC0+c2lkX2N0eF9sZW5ndGggfHwKLSAgICAgIG1lbWNtcChzZXNzaW9uLT5zaWRfY3R4LCBzc2wtPnNpZF9jdHgsIHNzbC0+c2lkX2N0eF9sZW5ndGgpICE9IDApIHsKLSAgICBnb3RvIG5vX3Nlc3Npb247CisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOwogICB9CiAKLSAgaWYgKChzc2wtPnZlcmlmeV9tb2RlICYgU1NMX1ZFUklGWV9QRUVSKSAmJiBzc2wtPnNpZF9jdHhfbGVuZ3RoID09IDApIHsKKyAgLyogTm93IHJldCBpcyBub24tTlVMTCBhbmQgd2Ugb3duIG9uZSBvZiBpdHMgcmVmZXJlbmNlIGNvdW50cy4gKi8KKworICBpZiAocmV0LT5zaWRfY3R4X2xlbmd0aCAhPSBzLT5zaWRfY3R4X2xlbmd0aCB8fAorICAgICAgbWVtY21wKHJldC0+c2lkX2N0eCwgcy0+c2lkX2N0eCwgcmV0LT5zaWRfY3R4X2xlbmd0aCkpIHsKKyAgICAvKiBXZSBoYXZlIHRoZSBzZXNzaW9uIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LCBidXQgd2UgZG9uJ3Qgd2FudCB0byB1c2UgaXQKKyAgICAgKiBpbiB0aGlzIGNvbnRleHQuICovCisgICAgZ290byBlcnI7IC8qIHRyZWF0IGxpa2UgY2FjaGUgbWlzcyAqLworICB9CisKKyAgaWYgKChzLT52ZXJpZnlfbW9kZSAmIFNTTF9WRVJJRllfUEVFUikgJiYgcy0+c2lkX2N0eF9sZW5ndGggPT0gMCkgewogICAgIC8qIFdlIGNhbid0IGJlIHN1cmUgaWYgdGhpcyBzZXNzaW9uIGlzIGJlaW5nIHVzZWQgb3V0IG9mIGNvbnRleHQsIHdoaWNoIGlzCiAgICAgICogZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIFNTTF9WRVJJRllfUEVFUi4gVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBoYXZlCiAgICAgICogdXNlZCBTU0xbX0NUWF1fc2V0X3Nlc3Npb25faWRfY29udGV4dC4KQEAgLTU0Myw3NiArNDgxLDgzIEBACiAgICAgICogbGlrZSBhIGNhY2hlIG1pc3MgKG90aGVyd2lzZSBpdCB3b3VsZCBiZSBlYXN5IGZvciBhcHBsaWNhdGlvbnMgdG8KICAgICAgKiBlZmZlY3RpdmVseSBkaXNhYmxlIHRoZSBzZXNzaW9uIGNhY2hlIGJ5IGFjY2lkZW50IHdpdGhvdXQgYW55b25lCiAgICAgICogbm90aWNpbmcpLiAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfU0VTU0lPTl9JRF9DT05URVhUX1VOSU5JVElBTElaRUQpOwotICAgIGdvdG8gZmF0YWxfZXJyb3I7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfZ2V0X3ByZXZfc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9TRVNTSU9OX0lEX0NPTlRFWFRfVU5JTklUSUFMSVpFRCk7CisgICAgZmF0YWwgPSAxOworICAgIGdvdG8gZXJyOwogICB9CiAKLSAgaWYgKHNlc3Npb24tPnRpbWVvdXQgPCAobG9uZykodGltZShOVUxMKSAtIHNlc3Npb24tPnRpbWUpKSB7Ci0gICAgaWYgKCF0aWNrZXRzX3N1cHBvcnRlZCkgewotICAgICAgLyogVGhlIHNlc3Npb24gd2FzIGZyb20gdGhlIGNhY2hlLCBzbyByZW1vdmUgaXQuICovCi0gICAgICBTU0xfQ1RYX3JlbW92ZV9zZXNzaW9uKHNzbC0+aW5pdGlhbF9jdHgsIHNlc3Npb24pOworICBpZiAocmV0LT50aW1lb3V0IDwgKGxvbmcpKHRpbWUoTlVMTCkgLSByZXQtPnRpbWUpKSB7CisgICAgLyogdGltZW91dCAqLworICAgIGlmICh0cnlfc2Vzc2lvbl9jYWNoZSkgeworICAgICAgLyogc2Vzc2lvbiB3YXMgZnJvbSB0aGUgY2FjaGUsIHNvIHJlbW92ZSBpdCAqLworICAgICAgU1NMX0NUWF9yZW1vdmVfc2Vzc2lvbihzLT5pbml0aWFsX2N0eCwgcmV0KTsKICAgICB9Ci0gICAgZ290byBub19zZXNzaW9uOworICAgIGdvdG8gZXJyOwogICB9CiAKLSAgKm91dF9zZXNzaW9uID0gc2Vzc2lvbjsKLSAgKm91dF9zZW5kX3RpY2tldCA9IHNlbmRfdGlja2V0OwotICByZXR1cm4gc3NsX3Nlc3Npb25fc3VjY2VzczsKKyAgU1NMX1NFU1NJT05fZnJlZShzLT5zZXNzaW9uKTsKKyAgcy0+c2Vzc2lvbiA9IHJldDsKKyAgcy0+dmVyaWZ5X3Jlc3VsdCA9IHMtPnNlc3Npb24tPnZlcmlmeV9yZXN1bHQ7CisgIHJldHVybiAxOwogCi1mYXRhbF9lcnJvcjoKLSAgU1NMX1NFU1NJT05fZnJlZShzZXNzaW9uKTsKLSAgcmV0dXJuIHNzbF9zZXNzaW9uX2Vycm9yOwotCi1ub19zZXNzaW9uOgotICAqb3V0X3Nlc3Npb24gPSBOVUxMOwotICAqb3V0X3NlbmRfdGlja2V0ID0gdGlja2V0c19zdXBwb3J0ZWQ7Ci0gIFNTTF9TRVNTSU9OX2ZyZWUoc2Vzc2lvbik7Ci0gIHJldHVybiBzc2xfc2Vzc2lvbl9zdWNjZXNzOworZXJyOgorICBpZiAocmV0ICE9IE5VTEwpIHsKKyAgICBTU0xfU0VTU0lPTl9mcmVlKHJldCk7CisgICAgaWYgKCF0cnlfc2Vzc2lvbl9jYWNoZSkgeworICAgICAgLyogVGhlIHNlc3Npb24gd2FzIGZyb20gYSB0aWNrZXQsIHNvIHdlIHNob3VsZAorICAgICAgICogaXNzdWUgYSB0aWNrZXQgZm9yIHRoZSBuZXcgc2Vzc2lvbiAqLworICAgICAgcy0+dGxzZXh0X3RpY2tldF9leHBlY3RlZCA9IDE7CisgICAgfQorICB9CisgIGlmIChmYXRhbCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gMDsKIH0KIAotaW50IFNTTF9DVFhfYWRkX3Nlc3Npb24oU1NMX0NUWCAqY3R4LCBTU0xfU0VTU0lPTiAqc2Vzc2lvbikgeworaW50IFNTTF9DVFhfYWRkX3Nlc3Npb24oU1NMX0NUWCAqY3R4LCBTU0xfU0VTU0lPTiAqYykgewogICBpbnQgcmV0ID0gMDsKLSAgU1NMX1NFU1NJT04gKm9sZF9zZXNzaW9uOworICBTU0xfU0VTU0lPTiAqczsKIAotICAvKiBBZGQganVzdCAxIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIHxTU0xfQ1RYfCdzIHNlc3Npb24gY2FjaGUgZXZlbiB0aG91Z2ggaXQKKyAgLyogYWRkIGp1c3QgMSByZWZlcmVuY2UgY291bnQgZm9yIHRoZSBTU0xfQ1RYJ3Mgc2Vzc2lvbiBjYWNoZSBldmVuIHRob3VnaCBpdAogICAgKiBoYXMgdHdvIHdheXMgb2YgYWNjZXNzOiBlYWNoIHNlc3Npb24gaXMgaW4gYSBkb3VibHkgbGlua2VkIGxpc3QgYW5kIGFuCi0gICAqIGxoYXNoLiAqLwotICBTU0xfU0VTU0lPTl91cF9yZWYoc2Vzc2lvbik7Ci0gIC8qIElmIHxzZXNzaW9ufCBpcyBpbiBhbHJlYWR5IGluIGNhY2hlLCB3ZSB0YWtlIGJhY2sgdGhlIGluY3JlbWVudCBsYXRlci4gKi8KKyAgICogbGhhc2ggKi8KKyAgU1NMX1NFU1NJT05fdXBfcmVmKGMpOworICAvKiBpZiBzZXNzaW9uIGMgaXMgaW4gYWxyZWFkeSBpbiBjYWNoZSwgd2UgdGFrZSBiYWNrIHRoZSBpbmNyZW1lbnQgbGF0ZXIgKi8KIAogICBDUllQVE9fTVVURVhfbG9ja193cml0ZSgmY3R4LT5sb2NrKTsKLSAgaWYgKCFsaF9TU0xfU0VTU0lPTl9pbnNlcnQoY3R4LT5zZXNzaW9ucywgJm9sZF9zZXNzaW9uLCBzZXNzaW9uKSkgeworICBpZiAoIWxoX1NTTF9TRVNTSU9OX2luc2VydChjdHgtPnNlc3Npb25zLCAmcywgYykpIHsKICAgICBDUllQVE9fTVVURVhfdW5sb2NrKCZjdHgtPmxvY2spOwotICAgIFNTTF9TRVNTSU9OX2ZyZWUoc2Vzc2lvbik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAotICAvKiB8b2xkX3Nlc3Npb258ICE9IE5VTEwgaWZmIHdlIGFscmVhZHkgaGFkIGEgc2Vzc2lvbiB3aXRoIHRoZSBnaXZlbiBzZXNzaW9uCi0gICAqIElELiBJbiB0aGlzIGNhc2UsIHxvbGRfc2Vzc2lvbnwgPT0gfHNlc3Npb258IHNob3VsZCBob2xkICh0aGVuIHdlIGRpZCBub3QKLSAgICogcmVhbGx5IG1vZGlmeSB8Y3R4LT5zZXNzaW9uc3wpLCBvciB3ZSdyZSBpbiB0cm91YmxlLiAqLwotICBpZiAob2xkX3Nlc3Npb24gIT0gTlVMTCAmJiBvbGRfc2Vzc2lvbiAhPSBzZXNzaW9uKSB7CisgIC8qIHMgIT0gTlVMTCBpZmYgd2UgYWxyZWFkeSBoYWQgYSBzZXNzaW9uIHdpdGggdGhlIGdpdmVuIFBJRC4gSW4gdGhpcyBjYXNlLCBzCisgICAqID09IGMgc2hvdWxkIGhvbGQgKHRoZW4gd2UgZGlkIG5vdCByZWFsbHkgbW9kaWZ5IGN0eC0+c2Vzc2lvbnMpLCBvciB3ZSdyZQorICAgKiBpbiB0cm91YmxlLiAqLworICBpZiAocyAhPSBOVUxMICYmIHMgIT0gYykgewogICAgIC8qIFdlICphcmUqIGluIHRyb3VibGUgLi4uICovCi0gICAgU1NMX1NFU1NJT05fbGlzdF9yZW1vdmUoY3R4LCBvbGRfc2Vzc2lvbik7Ci0gICAgU1NMX1NFU1NJT05fZnJlZShvbGRfc2Vzc2lvbik7CisgICAgU1NMX1NFU1NJT05fbGlzdF9yZW1vdmUoY3R4LCBzKTsKKyAgICBTU0xfU0VTU0lPTl9mcmVlKHMpOwogICAgIC8qIC4uLiBzbyBwcmV0ZW5kIHRoZSBvdGhlciBzZXNzaW9uIGRpZCBub3QgZXhpc3QgaW4gY2FjaGUgKHdlIGNhbm5vdAotICAgICAqIGhhbmRsZSB0d28gfFNTTF9TRVNTSU9OfCBzdHJ1Y3R1cmVzIHdpdGggaWRlbnRpY2FsIHNlc3Npb24gSUQgaW4gdGhlIHNhbWUKKyAgICAgKiBoYW5kbGUgdHdvIFNTTF9TRVNTSU9OIHN0cnVjdHVyZXMgd2l0aCBpZGVudGljYWwgc2Vzc2lvbiBJRCBpbiB0aGUgc2FtZQogICAgICAqIGNhY2hlLCB3aGljaCBjb3VsZCBoYXBwZW4gZS5nLiB3aGVuIHR3byB0aHJlYWRzIGNvbmN1cnJlbnRseSBvYnRhaW4gdGhlCi0gICAgICogc2FtZSBzZXNzaW9uIGZyb20gYW4gZXh0ZXJuYWwgY2FjaGUpLiAqLwotICAgIG9sZF9zZXNzaW9uID0gTlVMTDsKKyAgICAgKiBzYW1lIHNlc3Npb24gZnJvbSBhbiBleHRlcm5hbCBjYWNoZSkgKi8KKyAgICBzID0gTlVMTDsKICAgfQogCi0gIC8qIFB1dCBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgdW5sZXNzIGl0IGlzIGFscmVhZHkgaW4gdGhlIGNhY2hlLiAqLwotICBpZiAob2xkX3Nlc3Npb24gPT0gTlVMTCkgewotICAgIFNTTF9TRVNTSU9OX2xpc3RfYWRkKGN0eCwgc2Vzc2lvbik7CisgIC8qIFB1dCBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgdW5sZXNzIGl0IGlzIGFscmVhZHkgaW4gdGhlIGNhY2hlICovCisgIGlmIChzID09IE5VTEwpIHsKKyAgICBTU0xfU0VTU0lPTl9saXN0X2FkZChjdHgsIGMpOwogICB9CiAKLSAgaWYgKG9sZF9zZXNzaW9uICE9IE5VTEwpIHsKLSAgICAvKiBFeGlzdGluZyBjYWNoZSBlbnRyeSAtLSBkZWNyZW1lbnQgcHJldmlvdXNseSBpbmNyZW1lbnRlZCByZWZlcmVuY2UgY291bnQKLSAgICAgKiBiZWNhdXNlIGl0IGFscmVhZHkgdGFrZXMgaW50byBhY2NvdW50IHRoZSBjYWNoZS4gKi8KLSAgICBTU0xfU0VTU0lPTl9mcmVlKG9sZF9zZXNzaW9uKTsgLyogfG9sZF9zZXNzaW9ufCA9PSB8c2Vzc2lvbnwgKi8KKyAgaWYgKHMgIT0gTlVMTCkgeworICAgIC8qIGV4aXN0aW5nIGNhY2hlIGVudHJ5IC0tIGRlY3JlbWVudCBwcmV2aW91c2x5IGluY3JlbWVudGVkIHJlZmVyZW5jZSBjb3VudAorICAgICAqIGJlY2F1c2UgaXQgYWxyZWFkeSB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGNhY2hlICovCisgICAgU1NMX1NFU1NJT05fZnJlZShzKTsgLyogcyA9PSBjICovCiAgICAgcmV0ID0gMDsKICAgfSBlbHNlIHsKLSAgICAvKiBOZXcgY2FjaGUgZW50cnkgLS0gcmVtb3ZlIG9sZCBvbmVzIGlmIGNhY2hlIGhhcyBiZWNvbWUgdG9vIGxhcmdlLiAqLworICAgIC8qIG5ldyBjYWNoZSBlbnRyeSAtLSByZW1vdmUgb2xkIG9uZXMgaWYgY2FjaGUgaGFzIGJlY29tZSB0b28gbGFyZ2UgKi8KICAgICByZXQgPSAxOwogCiAgICAgaWYgKFNTTF9DVFhfc2Vzc19nZXRfY2FjaGVfc2l6ZShjdHgpID4gMCkgewpAQCAtNjI4LDIzICs1NzMsMjMgQEAKICAgcmV0dXJuIHJldDsKIH0KIAotaW50IFNTTF9DVFhfcmVtb3ZlX3Nlc3Npb24oU1NMX0NUWCAqY3R4LCBTU0xfU0VTU0lPTiAqc2Vzc2lvbikgewotICByZXR1cm4gcmVtb3ZlX3Nlc3Npb25fbG9jayhjdHgsIHNlc3Npb24sIDEpOworaW50IFNTTF9DVFhfcmVtb3ZlX3Nlc3Npb24oU1NMX0NUWCAqY3R4LCBTU0xfU0VTU0lPTiAqYykgeworICByZXR1cm4gcmVtb3ZlX3Nlc3Npb25fbG9jayhjdHgsIGMsIDEpOwogfQogCi1zdGF0aWMgaW50IHJlbW92ZV9zZXNzaW9uX2xvY2soU1NMX0NUWCAqY3R4LCBTU0xfU0VTU0lPTiAqc2Vzc2lvbiwgaW50IGxvY2spIHsKK3N0YXRpYyBpbnQgcmVtb3ZlX3Nlc3Npb25fbG9jayhTU0xfQ1RYICpjdHgsIFNTTF9TRVNTSU9OICpjLCBpbnQgbG9jaykgeworICBTU0xfU0VTU0lPTiAqcjsKICAgaW50IHJldCA9IDA7CiAKLSAgaWYgKHNlc3Npb24gIT0gTlVMTCAmJiBzZXNzaW9uLT5zZXNzaW9uX2lkX2xlbmd0aCAhPSAwKSB7CisgIGlmIChjICE9IE5VTEwgJiYgYy0+c2Vzc2lvbl9pZF9sZW5ndGggIT0gMCkgewogICAgIGlmIChsb2NrKSB7CiAgICAgICBDUllQVE9fTVVURVhfbG9ja193cml0ZSgmY3R4LT5sb2NrKTsKICAgICB9Ci0gICAgU1NMX1NFU1NJT04gKmZvdW5kX3Nlc3Npb24gPSBsaF9TU0xfU0VTU0lPTl9yZXRyaWV2ZShjdHgtPnNlc3Npb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbik7Ci0gICAgaWYgKGZvdW5kX3Nlc3Npb24gPT0gc2Vzc2lvbikgeworICAgIHIgPSBsaF9TU0xfU0VTU0lPTl9yZXRyaWV2ZShjdHgtPnNlc3Npb25zLCBjKTsKKyAgICBpZiAociA9PSBjKSB7CiAgICAgICByZXQgPSAxOwotICAgICAgZm91bmRfc2Vzc2lvbiA9IGxoX1NTTF9TRVNTSU9OX2RlbGV0ZShjdHgtPnNlc3Npb25zLCBzZXNzaW9uKTsKLSAgICAgIFNTTF9TRVNTSU9OX2xpc3RfcmVtb3ZlKGN0eCwgc2Vzc2lvbik7CisgICAgICByID0gbGhfU1NMX1NFU1NJT05fZGVsZXRlKGN0eC0+c2Vzc2lvbnMsIGMpOworICAgICAgU1NMX1NFU1NJT05fbGlzdF9yZW1vdmUoY3R4LCBjKTsKICAgICB9CiAKICAgICBpZiAobG9jaykgewpAQCAtNjUyLDQ4ICs1OTcsMTI3IEBACiAgICAgfQogCiAgICAgaWYgKHJldCkgewotICAgICAgZm91bmRfc2Vzc2lvbi0+bm90X3Jlc3VtYWJsZSA9IDE7CisgICAgICByLT5ub3RfcmVzdW1hYmxlID0gMTsKICAgICAgIGlmIChjdHgtPnJlbW92ZV9zZXNzaW9uX2NiICE9IE5VTEwpIHsKLSAgICAgICAgY3R4LT5yZW1vdmVfc2Vzc2lvbl9jYihjdHgsIGZvdW5kX3Nlc3Npb24pOworICAgICAgICBjdHgtPnJlbW92ZV9zZXNzaW9uX2NiKGN0eCwgcik7CiAgICAgICB9Ci0gICAgICBTU0xfU0VTU0lPTl9mcmVlKGZvdW5kX3Nlc3Npb24pOworICAgICAgU1NMX1NFU1NJT05fZnJlZShyKTsKICAgICB9CiAgIH0KIAogICByZXR1cm4gcmV0OwogfQogCi1pbnQgU1NMX3NldF9zZXNzaW9uKFNTTCAqc3NsLCBTU0xfU0VTU0lPTiAqc2Vzc2lvbikgewotICBpZiAoc3NsLT5zZXNzaW9uID09IHNlc3Npb24pIHsKK1NTTF9TRVNTSU9OICpTU0xfU0VTU0lPTl91cF9yZWYoU1NMX1NFU1NJT04gKnNlc3Npb24pIHsKKyAgaWYgKHNlc3Npb24pIHsKKyAgICBDUllQVE9fcmVmY291bnRfaW5jKCZzZXNzaW9uLT5yZWZlcmVuY2VzKTsKKyAgfQorICByZXR1cm4gc2Vzc2lvbjsKK30KKwordm9pZCBTU0xfU0VTU0lPTl9mcmVlKFNTTF9TRVNTSU9OICpzZXNzaW9uKSB7CisgIGlmIChzZXNzaW9uID09IE5VTEwgfHwKKyAgICAgICFDUllQVE9fcmVmY291bnRfZGVjX2FuZF90ZXN0X3plcm8oJnNlc3Npb24tPnJlZmVyZW5jZXMpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgQ1JZUFRPX2ZyZWVfZXhfZGF0YSgmZ19leF9kYXRhX2NsYXNzLCBzZXNzaW9uLCAmc2Vzc2lvbi0+ZXhfZGF0YSk7CisKKyAgT1BFTlNTTF9jbGVhbnNlKHNlc3Npb24tPm1hc3Rlcl9rZXksIHNpemVvZihzZXNzaW9uLT5tYXN0ZXJfa2V5KSk7CisgIE9QRU5TU0xfY2xlYW5zZShzZXNzaW9uLT5zZXNzaW9uX2lkLCBzaXplb2Yoc2Vzc2lvbi0+c2Vzc2lvbl9pZCkpOworICBzc2xfc2Vzc19jZXJ0X2ZyZWUoc2Vzc2lvbi0+c2Vzc19jZXJ0KTsKKyAgWDUwOV9mcmVlKHNlc3Npb24tPnBlZXIpOworICBPUEVOU1NMX2ZyZWUoc2Vzc2lvbi0+dGxzZXh0X2hvc3RuYW1lKTsKKyAgT1BFTlNTTF9mcmVlKHNlc3Npb24tPnRsc2V4dF90aWNrKTsKKyAgT1BFTlNTTF9mcmVlKHNlc3Npb24tPnRsc2V4dF9zaWduZWRfY2VydF90aW1lc3RhbXBfbGlzdCk7CisgIE9QRU5TU0xfZnJlZShzZXNzaW9uLT5vY3NwX3Jlc3BvbnNlKTsKKyAgT1BFTlNTTF9mcmVlKHNlc3Npb24tPnBza19pZGVudGl0eSk7CisgIE9QRU5TU0xfY2xlYW5zZShzZXNzaW9uLCBzaXplb2YoKnNlc3Npb24pKTsKKyAgT1BFTlNTTF9mcmVlKHNlc3Npb24pOworfQorCitpbnQgU1NMX3NldF9zZXNzaW9uKFNTTCAqcywgU1NMX1NFU1NJT04gKnNlc3Npb24pIHsKKyAgaWYgKHMtPnNlc3Npb24gPT0gc2Vzc2lvbikgewogICAgIHJldHVybiAxOwogICB9CiAKLSAgU1NMX1NFU1NJT05fZnJlZShzc2wtPnNlc3Npb24pOwotICBzc2wtPnNlc3Npb24gPSBzZXNzaW9uOworICBTU0xfU0VTU0lPTl9mcmVlKHMtPnNlc3Npb24pOworICBzLT5zZXNzaW9uID0gc2Vzc2lvbjsKICAgaWYgKHNlc3Npb24gIT0gTlVMTCkgewogICAgIFNTTF9TRVNTSU9OX3VwX3JlZihzZXNzaW9uKTsKLSAgICBzc2wtPnZlcmlmeV9yZXN1bHQgPSBzZXNzaW9uLT52ZXJpZnlfcmVzdWx0OworICAgIHMtPnZlcmlmeV9yZXN1bHQgPSBzZXNzaW9uLT52ZXJpZnlfcmVzdWx0OwogICB9CiAKICAgcmV0dXJuIDE7CiB9CiAKLWxvbmcgU1NMX0NUWF9zZXRfdGltZW91dChTU0xfQ1RYICpjdHgsIGxvbmcgdGltZW91dCkgewotICBpZiAoY3R4ID09IE5VTEwpIHsKK2xvbmcgU1NMX1NFU1NJT05fc2V0X3RpbWVvdXQoU1NMX1NFU1NJT04gKnMsIGxvbmcgdCkgeworICBpZiAocyA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAotICBsb25nIG9sZF90aW1lb3V0ID0gY3R4LT5zZXNzaW9uX3RpbWVvdXQ7Ci0gIGN0eC0+c2Vzc2lvbl90aW1lb3V0ID0gdGltZW91dDsKLSAgcmV0dXJuIG9sZF90aW1lb3V0OworICBzLT50aW1lb3V0ID0gdDsKKyAgcmV0dXJuIDE7CiB9CiAKLWxvbmcgU1NMX0NUWF9nZXRfdGltZW91dChjb25zdCBTU0xfQ1RYICpjdHgpIHsKLSAgaWYgKGN0eCA9PSBOVUxMKSB7Citsb25nIFNTTF9TRVNTSU9OX2dldF90aW1lb3V0KGNvbnN0IFNTTF9TRVNTSU9OICpzKSB7CisgIGlmIChzID09IE5VTEwpIHsKICAgICByZXR1cm4gMDsKICAgfQogCi0gIHJldHVybiBjdHgtPnNlc3Npb25fdGltZW91dDsKKyAgcmV0dXJuIHMtPnRpbWVvdXQ7Cit9CisKK2xvbmcgU1NMX1NFU1NJT05fZ2V0X3RpbWUoY29uc3QgU1NMX1NFU1NJT04gKnMpIHsKKyAgaWYgKHMgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIHMtPnRpbWU7Cit9CisKK2xvbmcgU1NMX1NFU1NJT05fc2V0X3RpbWUoU1NMX1NFU1NJT04gKnMsIGxvbmcgdCkgeworICBpZiAocyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzLT50aW1lID0gdDsKKyAgcmV0dXJuIHQ7Cit9CisKK1g1MDkgKlNTTF9TRVNTSU9OX2dldDBfcGVlcihTU0xfU0VTU0lPTiAqcykgeyByZXR1cm4gcy0+cGVlcjsgfQorCitpbnQgU1NMX1NFU1NJT05fc2V0MV9pZF9jb250ZXh0KFNTTF9TRVNTSU9OICpzLCBjb25zdCB1aW50OF90ICpzaWRfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2lkX2N0eF9sZW4pIHsKKyAgaWYgKHNpZF9jdHhfbGVuID4gU1NMX01BWF9TSURfQ1RYX0xFTkdUSCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1NFU1NJT05fc2V0MV9pZF9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1NTTF9TRVNTSU9OX0lEX0NPTlRFWFRfVE9PX0xPTkcpOworICAgIHJldHVybiAwOworICB9CisKKyAgcy0+c2lkX2N0eF9sZW5ndGggPSBzaWRfY3R4X2xlbjsKKyAgbWVtY3B5KHMtPnNpZF9jdHgsIHNpZF9jdHgsIHNpZF9jdHhfbGVuKTsKKworICByZXR1cm4gMTsKK30KKworbG9uZyBTU0xfQ1RYX3NldF90aW1lb3V0KFNTTF9DVFggKnMsIGxvbmcgdCkgeworICBsb25nIGw7CisgIGlmIChzID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGwgPSBzLT5zZXNzaW9uX3RpbWVvdXQ7CisgIHMtPnNlc3Npb25fdGltZW91dCA9IHQ7CisgIHJldHVybiBsOworfQorCitsb25nIFNTTF9DVFhfZ2V0X3RpbWVvdXQoY29uc3QgU1NMX0NUWCAqcykgeworICBpZiAocyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gcy0+c2Vzc2lvbl90aW1lb3V0OwogfQogCiB0eXBlZGVmIHN0cnVjdCB0aW1lb3V0X3BhcmFtX3N0IHsKQEAgLTcwMiwyNSArNzI2LDI1IEBACiAgIExIQVNIX09GKFNTTF9TRVNTSU9OKSAqY2FjaGU7CiB9IFRJTUVPVVRfUEFSQU07CiAKLXN0YXRpYyB2b2lkIHRpbWVvdXRfZG9hbGxfYXJnKFNTTF9TRVNTSU9OICpzZXNzaW9uLCB2b2lkICp2b2lkX3BhcmFtKSB7CitzdGF0aWMgdm9pZCB0aW1lb3V0X2RvYWxsX2FyZyhTU0xfU0VTU0lPTiAqc2Vzcywgdm9pZCAqdm9pZF9wYXJhbSkgewogICBUSU1FT1VUX1BBUkFNICpwYXJhbSA9IHZvaWRfcGFyYW07CiAKICAgaWYgKHBhcmFtLT50aW1lID09IDAgfHwKLSAgICAgIHBhcmFtLT50aW1lID4gKHNlc3Npb24tPnRpbWUgKyBzZXNzaW9uLT50aW1lb3V0KSkgeworICAgICAgcGFyYW0tPnRpbWUgPiAoc2Vzcy0+dGltZSArIHNlc3MtPnRpbWVvdXQpKSB7CiAgICAgLyogdGltZW91dCAqLwogICAgIC8qIFRoZSByZWFzb24gd2UgZG9uJ3QgY2FsbCBTU0xfQ1RYX3JlbW92ZV9zZXNzaW9uKCkgaXMgdG8KICAgICAgKiBzYXZlIG9uIGxvY2tpbmcgb3ZlcmhlYWQgKi8KLSAgICAodm9pZCkgbGhfU1NMX1NFU1NJT05fZGVsZXRlKHBhcmFtLT5jYWNoZSwgc2Vzc2lvbik7Ci0gICAgU1NMX1NFU1NJT05fbGlzdF9yZW1vdmUocGFyYW0tPmN0eCwgc2Vzc2lvbik7Ci0gICAgc2Vzc2lvbi0+bm90X3Jlc3VtYWJsZSA9IDE7CisgICAgKHZvaWQpIGxoX1NTTF9TRVNTSU9OX2RlbGV0ZShwYXJhbS0+Y2FjaGUsIHNlc3MpOworICAgIFNTTF9TRVNTSU9OX2xpc3RfcmVtb3ZlKHBhcmFtLT5jdHgsIHNlc3MpOworICAgIHNlc3MtPm5vdF9yZXN1bWFibGUgPSAxOwogICAgIGlmIChwYXJhbS0+Y3R4LT5yZW1vdmVfc2Vzc2lvbl9jYiAhPSBOVUxMKSB7Ci0gICAgICBwYXJhbS0+Y3R4LT5yZW1vdmVfc2Vzc2lvbl9jYihwYXJhbS0+Y3R4LCBzZXNzaW9uKTsKKyAgICAgIHBhcmFtLT5jdHgtPnJlbW92ZV9zZXNzaW9uX2NiKHBhcmFtLT5jdHgsIHNlc3MpOwogICAgIH0KLSAgICBTU0xfU0VTU0lPTl9mcmVlKHNlc3Npb24pOworICAgIFNTTF9TRVNTSU9OX2ZyZWUoc2Vzcyk7CiAgIH0KIH0KIAotdm9pZCBTU0xfQ1RYX2ZsdXNoX3Nlc3Npb25zKFNTTF9DVFggKmN0eCwgbG9uZyB0aW1lKSB7Cit2b2lkIFNTTF9DVFhfZmx1c2hfc2Vzc2lvbnMoU1NMX0NUWCAqY3R4LCBsb25nIHQpIHsKICAgVElNRU9VVF9QQVJBTSB0cDsKIAogICB0cC5jdHggPSBjdHg7CkBAIC03MjgsNyArNzUyLDcgQEAKICAgaWYgKHRwLmNhY2hlID09IE5VTEwpIHsKICAgICByZXR1cm47CiAgIH0KLSAgdHAudGltZSA9IHRpbWU7CisgIHRwLnRpbWUgPSB0OwogICBDUllQVE9fTVVURVhfbG9ja193cml0ZSgmY3R4LT5sb2NrKTsKICAgbGhfU1NMX1NFU1NJT05fZG9hbGxfYXJnKHRwLmNhY2hlLCB0aW1lb3V0X2RvYWxsX2FyZywgJnRwKTsKICAgQ1JZUFRPX01VVEVYX3VubG9jaygmY3R4LT5sb2NrKTsKQEAgLTc0NSw4MCArNzY5LDgwIEBACiB9CiAKIC8qIGxvY2tlZCBieSBTU0xfQ1RYIGluIHRoZSBjYWxsaW5nIGZ1bmN0aW9uICovCi1zdGF0aWMgdm9pZCBTU0xfU0VTU0lPTl9saXN0X3JlbW92ZShTU0xfQ1RYICpjdHgsIFNTTF9TRVNTSU9OICpzZXNzaW9uKSB7Ci0gIGlmIChzZXNzaW9uLT5uZXh0ID09IE5VTEwgfHwgc2Vzc2lvbi0+cHJldiA9PSBOVUxMKSB7CitzdGF0aWMgdm9pZCBTU0xfU0VTU0lPTl9saXN0X3JlbW92ZShTU0xfQ1RYICpjdHgsIFNTTF9TRVNTSU9OICpzKSB7CisgIGlmIChzLT5uZXh0ID09IE5VTEwgfHwgcy0+cHJldiA9PSBOVUxMKSB7CiAgICAgcmV0dXJuOwogICB9CiAKLSAgaWYgKHNlc3Npb24tPm5leHQgPT0gKFNTTF9TRVNTSU9OICopJmN0eC0+c2Vzc2lvbl9jYWNoZV90YWlsKSB7CisgIGlmIChzLT5uZXh0ID09IChTU0xfU0VTU0lPTiAqKSZjdHgtPnNlc3Npb25fY2FjaGVfdGFpbCkgewogICAgIC8qIGxhc3QgZWxlbWVudCBpbiBsaXN0ICovCi0gICAgaWYgKHNlc3Npb24tPnByZXYgPT0gKFNTTF9TRVNTSU9OICopJmN0eC0+c2Vzc2lvbl9jYWNoZV9oZWFkKSB7CisgICAgaWYgKHMtPnByZXYgPT0gKFNTTF9TRVNTSU9OICopJmN0eC0+c2Vzc2lvbl9jYWNoZV9oZWFkKSB7CiAgICAgICAvKiBvbmx5IG9uZSBlbGVtZW50IGluIGxpc3QgKi8KICAgICAgIGN0eC0+c2Vzc2lvbl9jYWNoZV9oZWFkID0gTlVMTDsKICAgICAgIGN0eC0+c2Vzc2lvbl9jYWNoZV90YWlsID0gTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgY3R4LT5zZXNzaW9uX2NhY2hlX3RhaWwgPSBzZXNzaW9uLT5wcmV2OwotICAgICAgc2Vzc2lvbi0+cHJldi0+bmV4dCA9IChTU0xfU0VTU0lPTiAqKSYoY3R4LT5zZXNzaW9uX2NhY2hlX3RhaWwpOworICAgICAgY3R4LT5zZXNzaW9uX2NhY2hlX3RhaWwgPSBzLT5wcmV2OworICAgICAgcy0+cHJldi0+bmV4dCA9IChTU0xfU0VTU0lPTiAqKSYoY3R4LT5zZXNzaW9uX2NhY2hlX3RhaWwpOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBpZiAoc2Vzc2lvbi0+cHJldiA9PSAoU1NMX1NFU1NJT04gKikmY3R4LT5zZXNzaW9uX2NhY2hlX2hlYWQpIHsKKyAgICBpZiAocy0+cHJldiA9PSAoU1NMX1NFU1NJT04gKikmY3R4LT5zZXNzaW9uX2NhY2hlX2hlYWQpIHsKICAgICAgIC8qIGZpcnN0IGVsZW1lbnQgaW4gbGlzdCAqLwotICAgICAgY3R4LT5zZXNzaW9uX2NhY2hlX2hlYWQgPSBzZXNzaW9uLT5uZXh0OwotICAgICAgc2Vzc2lvbi0+bmV4dC0+cHJldiA9IChTU0xfU0VTU0lPTiAqKSYoY3R4LT5zZXNzaW9uX2NhY2hlX2hlYWQpOworICAgICAgY3R4LT5zZXNzaW9uX2NhY2hlX2hlYWQgPSBzLT5uZXh0OworICAgICAgcy0+bmV4dC0+cHJldiA9IChTU0xfU0VTU0lPTiAqKSYoY3R4LT5zZXNzaW9uX2NhY2hlX2hlYWQpOwogICAgIH0gZWxzZSB7IC8qIG1pZGRsZSBvZiBsaXN0ICovCi0gICAgICBzZXNzaW9uLT5uZXh0LT5wcmV2ID0gc2Vzc2lvbi0+cHJldjsKLSAgICAgIHNlc3Npb24tPnByZXYtPm5leHQgPSBzZXNzaW9uLT5uZXh0OworICAgICAgcy0+bmV4dC0+cHJldiA9IHMtPnByZXY7CisgICAgICBzLT5wcmV2LT5uZXh0ID0gcy0+bmV4dDsKICAgICB9CiAgIH0KLSAgc2Vzc2lvbi0+cHJldiA9IHNlc3Npb24tPm5leHQgPSBOVUxMOworICBzLT5wcmV2ID0gcy0+bmV4dCA9IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIFNTTF9TRVNTSU9OX2xpc3RfYWRkKFNTTF9DVFggKmN0eCwgU1NMX1NFU1NJT04gKnNlc3Npb24pIHsKLSAgaWYgKHNlc3Npb24tPm5leHQgIT0gTlVMTCAmJiBzZXNzaW9uLT5wcmV2ICE9IE5VTEwpIHsKLSAgICBTU0xfU0VTU0lPTl9saXN0X3JlbW92ZShjdHgsIHNlc3Npb24pOworc3RhdGljIHZvaWQgU1NMX1NFU1NJT05fbGlzdF9hZGQoU1NMX0NUWCAqY3R4LCBTU0xfU0VTU0lPTiAqcykgeworICBpZiAocy0+bmV4dCAhPSBOVUxMICYmIHMtPnByZXYgIT0gTlVMTCkgeworICAgIFNTTF9TRVNTSU9OX2xpc3RfcmVtb3ZlKGN0eCwgcyk7CiAgIH0KIAogICBpZiAoY3R4LT5zZXNzaW9uX2NhY2hlX2hlYWQgPT0gTlVMTCkgewotICAgIGN0eC0+c2Vzc2lvbl9jYWNoZV9oZWFkID0gc2Vzc2lvbjsKLSAgICBjdHgtPnNlc3Npb25fY2FjaGVfdGFpbCA9IHNlc3Npb247Ci0gICAgc2Vzc2lvbi0+cHJldiA9IChTU0xfU0VTU0lPTiAqKSYoY3R4LT5zZXNzaW9uX2NhY2hlX2hlYWQpOwotICAgIHNlc3Npb24tPm5leHQgPSAoU1NMX1NFU1NJT04gKikmKGN0eC0+c2Vzc2lvbl9jYWNoZV90YWlsKTsKKyAgICBjdHgtPnNlc3Npb25fY2FjaGVfaGVhZCA9IHM7CisgICAgY3R4LT5zZXNzaW9uX2NhY2hlX3RhaWwgPSBzOworICAgIHMtPnByZXYgPSAoU1NMX1NFU1NJT04gKikmKGN0eC0+c2Vzc2lvbl9jYWNoZV9oZWFkKTsKKyAgICBzLT5uZXh0ID0gKFNTTF9TRVNTSU9OICopJihjdHgtPnNlc3Npb25fY2FjaGVfdGFpbCk7CiAgIH0gZWxzZSB7Ci0gICAgc2Vzc2lvbi0+bmV4dCA9IGN0eC0+c2Vzc2lvbl9jYWNoZV9oZWFkOwotICAgIHNlc3Npb24tPm5leHQtPnByZXYgPSBzZXNzaW9uOwotICAgIHNlc3Npb24tPnByZXYgPSAoU1NMX1NFU1NJT04gKikmKGN0eC0+c2Vzc2lvbl9jYWNoZV9oZWFkKTsKLSAgICBjdHgtPnNlc3Npb25fY2FjaGVfaGVhZCA9IHNlc3Npb247CisgICAgcy0+bmV4dCA9IGN0eC0+c2Vzc2lvbl9jYWNoZV9oZWFkOworICAgIHMtPm5leHQtPnByZXYgPSBzOworICAgIHMtPnByZXYgPSAoU1NMX1NFU1NJT04gKikmKGN0eC0+c2Vzc2lvbl9jYWNoZV9oZWFkKTsKKyAgICBjdHgtPnNlc3Npb25fY2FjaGVfaGVhZCA9IHM7CiAgIH0KIH0KIAogdm9pZCBTU0xfQ1RYX3Nlc3Nfc2V0X25ld19jYihTU0xfQ1RYICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmNiKShTU0wgKnNzbCwgU1NMX1NFU1NJT04gKnNlc3Npb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmNiKShzdHJ1Y3Qgc3NsX3N0ICpzc2wsIFNTTF9TRVNTSU9OICpzZXNzKSkgewogICBjdHgtPm5ld19zZXNzaW9uX2NiID0gY2I7CiB9CiAKLWludCAoKlNTTF9DVFhfc2Vzc19nZXRfbmV3X2NiKFNTTF9DVFggKmN0eCkpKFNTTCAqc3NsLCBTU0xfU0VTU0lPTiAqc2Vzc2lvbikgeworaW50ICgqU1NMX0NUWF9zZXNzX2dldF9uZXdfY2IoU1NMX0NUWCAqY3R4KSkoU1NMICpzc2wsIFNTTF9TRVNTSU9OICpzZXNzKSB7CiAgIHJldHVybiBjdHgtPm5ld19zZXNzaW9uX2NiOwogfQogCi12b2lkIFNTTF9DVFhfc2Vzc19zZXRfcmVtb3ZlX2NiKAotICAgIFNTTF9DVFggKmN0eCwgdm9pZCAoKmNiKShTU0xfQ1RYICpjdHgsIFNTTF9TRVNTSU9OICpzZXNzaW9uKSkgewordm9pZCBTU0xfQ1RYX3Nlc3Nfc2V0X3JlbW92ZV9jYihTU0xfQ1RYICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpjYikoU1NMX0NUWCAqY3R4LCBTU0xfU0VTU0lPTiAqc2VzcykpIHsKICAgY3R4LT5yZW1vdmVfc2Vzc2lvbl9jYiA9IGNiOwogfQogCiB2b2lkICgqU1NMX0NUWF9zZXNzX2dldF9yZW1vdmVfY2IoU1NMX0NUWCAqY3R4KSkoU1NMX0NUWCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9TRVNTSU9OICpzZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1NFU1NJT04gKnNlc3MpIHsKICAgcmV0dXJuIGN0eC0+cmVtb3ZlX3Nlc3Npb25fY2I7CiB9CiAKIHZvaWQgU1NMX0NUWF9zZXNzX3NldF9nZXRfY2IoU1NMX0NUWCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfU0VTU0lPTiAqKCpjYikoU1NMICpzc2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICppZCwgaW50IGlkX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0X2NvcHkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9TRVNTSU9OICooKmNiKShzdHJ1Y3Qgc3NsX3N0ICpzc2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb3B5KSkgewogICBjdHgtPmdldF9zZXNzaW9uX2NiID0gY2I7CiB9CiAKLVNTTF9TRVNTSU9OICooKlNTTF9DVFhfc2Vzc19nZXRfZ2V0X2NiKFNTTF9DVFggKmN0eCkpKAotICAgIFNTTCAqc3NsLCB1aW50OF90ICppZCwgaW50IGlkX2xlbiwgaW50ICpvdXRfY29weSkgeworU1NMX1NFU1NJT04gKigqU1NMX0NUWF9zZXNzX2dldF9nZXRfY2IoU1NMX0NUWCAqY3R4KSkoU1NMICpzc2wsIHVpbnQ4X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgKmNvcHkpIHsKICAgcmV0dXJuIGN0eC0+Z2V0X3Nlc3Npb25fY2I7CiB9CiAKQEAgLTg1MCwzICs4NzQsNSBAQAogdm9pZCAoKlNTTF9DVFhfZ2V0X2NoYW5uZWxfaWRfY2IoU1NMX0NUWCAqY3R4KSkoU1NMICpzc2wsIEVWUF9QS0VZICoqcGtleSkgewogICByZXR1cm4gY3R4LT5jaGFubmVsX2lkX2NiOwogfQorCitJTVBMRU1FTlRfUEVNX3J3KFNTTF9TRVNTSU9OLCBTU0xfU0VTU0lPTiwgUEVNX1NUUklOR19TU0xfU0VTU0lPTiwgU1NMX1NFU1NJT04pCmRpZmYgLS1naXQgYS9zcmMvc3NsL3NzbF9zdGF0LmMgYi9zcmMvc3NsL3NzbF9zdGF0LmMKaW5kZXggNWFkMWU0Ny4uZmE1NTQxYiAxMDA2NDQKLS0tIGEvc3JjL3NzbC9zc2xfc3RhdC5jCisrKyBiL3NyYy9zc2wvc3NsX3N0YXQuYwpAQCAtODIsMTEgKzgyLDkgQEAKICAqIE9USEVSV0lTRS4KICAqLwogCi0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KLQorI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotCiBjb25zdCBjaGFyICpTU0xfc3RhdGVfc3RyaW5nX2xvbmcoY29uc3QgU1NMICpzKSB7CiAgIGNvbnN0IGNoYXIgKnN0cjsKIApAQCAtMzM2LDYgKzMzNCwzNyBAQAogICAgICAgc3RyID0gIlNTTHYzIHJlYWQgY2VydGlmaWNhdGUgdmVyaWZ5IEIiOwogICAgICAgYnJlYWs7CiAKKyAgICAvKiBTU0x2Mi92MyBjb21wYXRpYmlsaXR5IHN0YXRlcyAqLworICAgIC8qIGNsaWVudCAqLworICAgIGNhc2UgU1NMMjNfU1RfQ1dfQ0xOVF9IRUxMT19BOgorICAgICAgc3RyID0gIlNTTHYyL3YzIHdyaXRlIGNsaWVudCBoZWxsbyBBIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTU0wyM19TVF9DV19DTE5UX0hFTExPX0I6CisgICAgICBzdHIgPSAiU1NMdjIvdjMgd3JpdGUgY2xpZW50IGhlbGxvIEIiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNTTDIzX1NUX0NSX1NSVlJfSEVMTE9fQToKKyAgICAgIHN0ciA9ICJTU0x2Mi92MyByZWFkIHNlcnZlciBoZWxsbyBBIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTU0wyM19TVF9DUl9TUlZSX0hFTExPX0I6CisgICAgICBzdHIgPSAiU1NMdjIvdjMgcmVhZCBzZXJ2ZXIgaGVsbG8gQiI7CisgICAgICBicmVhazsKKworICAgIC8qIHNlcnZlciAqLworICAgIGNhc2UgU1NMMjNfU1RfU1JfQ0xOVF9IRUxMTzoKKyAgICAgIHN0ciA9ICJTU0x2Mi92MyByZWFkIGNsaWVudCBoZWxsbyI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1NMMjNfU1RfU1JfVjJfQ0xOVF9IRUxMTzoKKyAgICAgIHN0ciA9ICJTU0x2Mi92MyByZWFkIHYyIGNsaWVudCBoZWxsbyI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1NMMjNfU1RfU1JfU1dJVENIX1ZFUlNJT046CisgICAgICBzdHIgPSAiU1NMdjIvdjMgc3dpdGNoIHZlcnNpb24iOworICAgICAgYnJlYWs7CisKICAgICAvKiBEVExTICovCiAgICAgY2FzZSBEVExTMV9TVF9DUl9IRUxMT19WRVJJRllfUkVRVUVTVF9BOgogICAgICAgc3RyID0gIkRUTFMxIHJlYWQgaGVsbG8gdmVyaWZ5IHJlcXVlc3QgQSI7CkBAIC0zNTMsNiArMzgyLDMwIEBACiAgIHJldHVybiBzdHI7CiB9CiAKK2NvbnN0IGNoYXIgKlNTTF9yc3RhdGVfc3RyaW5nX2xvbmcoY29uc3QgU1NMICpzKSB7CisgIGNvbnN0IGNoYXIgKnN0cjsKKworICBzd2l0Y2ggKHMtPnJzdGF0ZSkgeworICAgIGNhc2UgU1NMX1NUX1JFQURfSEVBREVSOgorICAgICAgc3RyID0gInJlYWQgaGVhZGVyIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTU0xfU1RfUkVBRF9CT0RZOgorICAgICAgc3RyID0gInJlYWQgYm9keSI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1NMX1NUX1JFQURfRE9ORToKKyAgICAgIHN0ciA9ICJyZWFkIGRvbmUiOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgc3RyID0gInVua25vd24iOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gc3RyOworfQorCiBjb25zdCBjaGFyICpTU0xfc3RhdGVfc3RyaW5nKGNvbnN0IFNTTCAqcykgewogICBjb25zdCBjaGFyICpzdHI7CiAKQEAgLTU4Miw2ICs2MzUsMzcgQEAKICAgICAgIHN0ciA9ICIzUkNWX0IiOwogICAgICAgYnJlYWs7CiAKKyAgICAvKiBTU0x2Mi92MyBjb21wYXRpYmlsaXR5IHN0YXRlcyAqLworICAgIC8qIGNsaWVudCAqLworICAgIGNhc2UgU1NMMjNfU1RfQ1dfQ0xOVF9IRUxMT19BOgorICAgICAgc3RyID0gIjIzV0NIQSI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1NMMjNfU1RfQ1dfQ0xOVF9IRUxMT19COgorICAgICAgc3RyID0gIjIzV0NIQiI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1NMMjNfU1RfQ1JfU1JWUl9IRUxMT19BOgorICAgICAgc3RyID0gIjIzUlNIQSI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1NMMjNfU1RfQ1JfU1JWUl9IRUxMT19COgorICAgICAgc3RyID0gIjIzUlNIQSI7CisgICAgICBicmVhazsKKworICAgIC8qIHNlcnZlciAqLworICAgIGNhc2UgU1NMMjNfU1RfU1JfQ0xOVF9IRUxMTzoKKyAgICAgIHN0ciA9ICIyM1JDSF8iOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNTTDIzX1NUX1NSX1YyX0NMTlRfSEVMTE86CisgICAgICBzdHIgPSAiMjNSMkNIIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTU0wyM19TVF9TUl9TV0lUQ0hfVkVSU0lPTjoKKyAgICAgIHN0ciA9ICIyM1JTV18iOworICAgICAgYnJlYWs7CisKICAgICAvKiBEVExTICovCiAgICAgY2FzZSBEVExTMV9TVF9DUl9IRUxMT19WRVJJRllfUkVRVUVTVF9BOgogICAgICAgc3RyID0gIkRSQ0hWQSI7CkBAIC04ODQsMyArOTY4LDI3IEBACiAKICAgcmV0dXJuIHN0cjsKIH0KKworY29uc3QgY2hhciAqU1NMX3JzdGF0ZV9zdHJpbmcoY29uc3QgU1NMICpzKSB7CisgIGNvbnN0IGNoYXIgKnN0cjsKKworICBzd2l0Y2ggKHMtPnJzdGF0ZSkgeworICAgIGNhc2UgU1NMX1NUX1JFQURfSEVBREVSOgorICAgICAgc3RyID0gIlJIIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTU0xfU1RfUkVBRF9CT0RZOgorICAgICAgc3RyID0gIlJCIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTU0xfU1RfUkVBRF9ET05FOgorICAgICAgc3RyID0gIlJEIjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHN0ciA9ICJ1bmtub3duIjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHN0cjsKK30KZGlmZiAtLWdpdCBhL3NyYy9zc2wvc3NsX3Rlc3QuY2MgYi9zcmMvc3NsL3NzbF90ZXN0LmNjCmluZGV4IDgxMGQzZmEuLjFjNmUyNGEgMTAwNjQ0Ci0tLSBhL3NyYy9zc2wvc3NsX3Rlc3QuY2MKKysrIGIvc3JjL3NzbC9zc2xfdGVzdC5jYwpAQCAtMjQsOCArMjQsNiBAQAogI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CiAKICNpbmNsdWRlICJ0ZXN0L3Njb3BlZF90eXBlcy5oIgotI2luY2x1ZGUgIi4uL2NyeXB0by90ZXN0L3Rlc3RfdXRpbC5oIgotCiAKIHN0cnVjdCBFeHBlY3RlZENpcGhlciB7CiAgIHVuc2lnbmVkIGxvbmcgaWQ7CkBAIC0yMTQsMjEgKzIxMiw2IEBACiAgIE5VTEwsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqa011c3ROb3RJbmNsdWRlTnVsbFtdID0gewotICAiQUxMIiwKLSAgIkRFRkFVTFQiLAotICAiQUxMOiFlTlVMTCIsCi0gICJBTEw6IU5VTEwiLAotICAiRklQUyIsCi0gICJTSEEiLAotICAiU0hBMSIsCi0gICJSU0EiLAotICAiU1NMdjMiLAotICAiVExTdjEiLAotICAiVExTdjEuMiIsCi0gIE5VTEwKLX07Ci0KIHN0YXRpYyB2b2lkIFByaW50Q2lwaGVyUHJlZmVyZW5jZUxpc3Qoc3NsX2NpcGhlcl9wcmVmZXJlbmNlX2xpc3Rfc3QgKmxpc3QpIHsKICAgYm9vbCBpbl9ncm91cCA9IGZhbHNlOwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNrX1NTTF9DSVBIRVJfbnVtKGxpc3QtPmNpcGhlcnMpOyBpKyspIHsKQEAgLTI4MiwyNCArMjY1LDYgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBib29sIFRlc3RSdWxlRG9lc05vdEluY2x1ZGVOdWxsKGNvbnN0IGNoYXIgKnJ1bGUpIHsKLSAgU2NvcGVkU1NMX0NUWCBjdHgoU1NMX0NUWF9uZXcoU1NMdjIzX3NlcnZlcl9tZXRob2QoKSkpOwotICBpZiAoIWN0eCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIVNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KGN0eC5nZXQoKSwgcnVsZSkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBjaXBoZXIgcnVsZSAnJXMnIGZhaWxlZFxuIiwgcnVsZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2tfU1NMX0NJUEhFUl9udW0oY3R4LT5jaXBoZXJfbGlzdC0+Y2lwaGVycyk7IGkrKykgewotICAgIGlmIChTU0xfQ0lQSEVSX2lzX05VTEwoc2tfU1NMX0NJUEhFUl92YWx1ZShjdHgtPmNpcGhlcl9saXN0LT5jaXBoZXJzLCBpKSkpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IGNpcGhlciBydWxlICclcycgaW5jbHVkZXMgTlVMTFxuIixydWxlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KIHN0YXRpYyBib29sIFRlc3RDaXBoZXJSdWxlcygpIHsKICAgZm9yIChzaXplX3QgaSA9IDA7IGtDaXBoZXJUZXN0c1tpXS5ydWxlICE9IE5VTEw7IGkrKykgewogICAgIGlmICghVGVzdENpcGhlclJ1bGUoJmtDaXBoZXJUZXN0c1tpXSkpIHsKQEAgLTMxOSwxMiArMjg0LDYgQEAKICAgICBFUlJfY2xlYXJfZXJyb3IoKTsKICAgfQogCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBrTXVzdE5vdEluY2x1ZGVOdWxsW2ldICE9IE5VTEw7IGkrKykgewotICAgIGlmICghVGVzdFJ1bGVEb2VzTm90SW5jbHVkZU51bGwoa011c3ROb3RJbmNsdWRlTnVsbFtpXSkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQogICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMzc2LDEwNCArMzM1LDYgQEAKICAgICAicStUb3B5enZ4OVVTRmdSdnl1b3huMEhnYitSMEEzajZTTFJ1eU9kQWk0Z3Y3WTVvbGl5bnJTSUVJQVlHQmdZRyIKICAgICAiQmdZR0JnWUdCZ1lHQmdZR0JnWUdCZ1lHQmdZR0JnWUdCZ1lHcmdNRUFRZXZBd1FCQkxBREJBRUYiOwogCi0vLyBrQm9yaW5nU1NMU2Vzc2lvbiBpcyBhIHNlcmlhbGl6ZWQgU1NMX1NFU1NJT04gZ2VuZXJhdGVkIGZyb20gYnNzbCBjbGllbnQuCi1zdGF0aWMgY29uc3QgY2hhciBrQm9yaW5nU1NMU2Vzc2lvbltdID0KLSAgICAiTUlJUndRSUJBUUlDQXdNRUFzQXZCQ0Rkb0d4R0syNm1SKzhsTTB1cTYrazl4WXV4UG53QWpwY0Y5bjBZbGk5UiIKLSAgICAia1FRd2J5c2hmV2hkaTVYUTErKzduMkwxcXFyY1ZsbUhCUHByNnlrblQvdTRwVXJwUUI1Rlo3dnF2Tm44TWRIZiIKLSAgICAiOXJXZ29RWUNCRlhnczd1aUJBSUNIQ0NqZ2dSNk1JSUVkakNDQTE2Z0F3SUJBZ0lJZit5ZkQ3WTZVaWN3RFFZSiIKLSAgICAiS29aSWh2Y05BUUVMQlFBd1NURUxNQWtHQTFVRUJoTUNWVk14RXpBUkJnTlZCQW9UQ2tkdmIyZHNaU0JKYm1NeCIKLSAgICAiSlRBakJnTlZCQU1USEVkdmIyZHNaU0JKYm5SbGNtNWxkQ0JCZFhSb2IzSnBkSGtnUnpJd0hoY05NVFV3T0RFeSIKLSAgICAiTVRRMU16RTFXaGNOTVRVeE1URXdNREF3TURBd1dqQm9NUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0F3SyIKLSAgICAiUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnd3TlRXOTFiblJoYVc0Z1ZtbGxkekVUTUJFR0ExVUVDZ3dLUjI5diIKLSAgICAiWjJ4bElFbHVZekVYTUJVR0ExVUVBd3dPZDNkM0xtZHZiMmRzWlM1amIyMHdnZ0VpTUEwR0NTcUdTSWIzRFFFQiIKLSAgICAiQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUMwTWVHNVlHUTB0K0llSmVvbmVQL1ByaEVhaWVpYmVLWWtiS1ZMTlpwbyIKLSAgICAiUEx1QmludmhrWFpvM0RDMTMzTnBDQnB5NlprdEJ3YW1xeWl4QXl1ay9OVTZPamdYcXd3eGZRN2RpMUFJbkxJVSIKLSAgICAiNzkyYzdoRnlOWFNVQ0c3QXQ4SWZpM1l3Qlg5QmE2dS8xZDZyV1RHWkpyZENxM1FVMTFSa0tZeVRxMktUNW1jZSIKLSAgICAiVHY5aUdLcVNrU1RscDhwdXkvOVNaLzNEYlUzVStCdXFDRnFlU2x6N3pqd0ZtazM1YWNkQ2lscEpsVkRETjVDLyIKLSAgICAiUkNoOC9VS2M4UGFMK2N4bHQ1MzFxb1RFTnZZcmZsQm5vMTRZRVpsQ0Jac1BpRmVVU0lMcEtFajNDY3doeTBlTCIKLSAgICAiRXVjV1E3MllaVThtVXpYQm9YR24wekEwY3JGbDVjaS8yc1RCQkdac3lsTkJBZ01CQUFHamdnRkJNSUlCUFRBZCIKLSAgICAiQmdOVkhTVUVGakFVQmdnckJnRUZCUWNEQVFZSUt3WUJCUVVIQXdJd0dRWURWUjBSQkJJd0VJSU9kM2QzTG1kdiIKLSAgICAiYjJkc1pTNWpiMjB3YUFZSUt3WUJCUVVIQVFFRVhEQmFNQ3NHQ0NzR0FRVUZCekFDaGg5b2RIUndPaTh2Y0d0cCIKLSAgICAiTG1kdmIyZHNaUzVqYjIwdlIwbEJSekl1WTNKME1Dc0dDQ3NHQVFVRkJ6QUJoaDlvZEhSd09pOHZZMnhwWlc1MCIKLSAgICAiY3pFdVoyOXZaMnhsTG1OdmJTOXZZM053TUIwR0ExVWREZ1FXQkJTL2J6SHhjRTczUTRqM3NsQzRCTGJNdExqRyIKLSAgICAiR2pBTUJnTlZIUk1CQWY4RUFqQUFNQjhHQTFVZEl3UVlNQmFBRkVyZEJoWWJ2UFpvdFhiMWdiYTdZaHE2V29FdiIKLSAgICAiTUJjR0ExVWRJQVFRTUE0d0RBWUtLd1lCQkFIV2VRSUZBVEF3QmdOVkhSOEVLVEFuTUNXZ0k2QWhoaDlvZEhSdyIKLSAgICAiT2k4dmNHdHBMbWR2YjJkc1pTNWpiMjB2UjBsQlJ6SXVZM0pzTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFBYiIKLSAgICAicWRXUFpFSGswWDdpS1BDVEhMNlMzdzZxMWVSNjdnb3haR0ZTTTFsazFoand5dTdYY0xKdXZBTFZWOXVZM292RSIKLSAgICAia1FaU0h3VCtweU9QV1Foc1NqTysxR3lqdkN2Sy9DQXdpVW1CWCtiUVJHYXFIc1JjaW83eFNiZFZjYWpRM2JYZCIKLSAgICAiWCtzMFdkYk9wbjZNU3RLQWlCVmxvUGxTeEVJOHB4WTZ4L0JCQ25USWsvK0RNQjE3dVpsT2pHM3ZiQW5rRGtQKyIKLSAgICAibjBPVHVjRDlzSFY3RVZqOVhVeGk1MW5PZk5CQ04vczdscFVqRFMvTko0azNpd090YkNQc3dpb3Q4dkxPNzc5YSIKLSAgICAiZjA3dlIwM3IzNDlJei9LVHprOTVybEZ0WDBJVStLWU54Rk5zYW5JWForQzlGWUdSWGt3aEhjdkZiNHFNVUIxeSIKLSAgICAiVFRsTTgwakJNT3d5alpYbWpSQWhwQUlFQUtVREFnRVVxUVVDQXdHSndLcUJwd1NCcE9nZWJibW45TlJVdE1XSCIKLSAgICAiK2VKcHFBNUpMTUZTTUNDaE9zdktleTN0b0JhQ05HVTdIZkFFaWlYTnV1QWRDQm9LMjYyQmpRYzJZWWZxRnpxSCIKLSAgICAienVwcG9wWEN2aG9oeDdqL3RuQ05aSU1nTFl0L085U1hLMlJZSTV6OEZoQ0NIdkI0Q2JENUcwTEdsNUVGUDI3cyIKLSAgICAiSmI2UzNhVFRZUGtRZTh5WlNseGV2ZzZORHdtVG9nTE85RjdVVWthWW1WY01RaHpzc0VFMlpSWU53U09VNktqRSIKLSAgICAiMFlqKzhmQWlCdGJRcmlJRUlOMkw4WmxwYVZyZE41S0ZOZHZjbU94SnU4MVA4cTUzWDU1eFF5R1RuR1d3c2dNQyIKLSAgICAiQVJlemdndnZNSUlFZGpDQ0ExNmdBd0lCQWdJSWYreWZEN1k2VWljd0RRWUpLb1pJaHZjTkFRRUxCUUF3U1RFTCIKLSAgICAiTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFvVENrZHZiMmRzWlNCSmJtTXhKVEFqQmdOVkJBTVRIRWR2YjJkcyIKLSAgICAiWlNCSmJuUmxjbTVsZENCQmRYUm9iM0pwZEhrZ1J6SXdIaGNOTVRVd09ERXlNVFExTXpFMVdoY05NVFV4TVRFdyIKLSAgICAiTURBd01EQXdXakJvTVFzd0NRWURWUVFHRXdKVlV6RVRNQkVHQTFVRUNBd0tRMkZzYVdadmNtNXBZVEVXTUJRRyIKLSAgICAiQTFVRUJ3d05UVzkxYm5SaGFXNGdWbWxsZHpFVE1CRUdBMVVFQ2d3S1IyOXZaMnhsSUVsdVl6RVhNQlVHQTFVRSIKLSAgICAiQXd3T2QzZDNMbWR2YjJkc1pTNWpiMjB3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQiIKLSAgICAiQVFDME1lRzVZR1EwdCtJZUplb25lUC9QcmhFYWllaWJlS1lrYktWTE5acG9QTHVCaW52aGtYWm8zREMxMzNOcCIKLSAgICAiQ0JweTZaa3RCd2FtcXlpeEF5dWsvTlU2T2pnWHF3d3hmUTdkaTFBSW5MSVU3OTJjN2hGeU5YU1VDRzdBdDhJZiIKLSAgICAiaTNZd0JYOUJhNnUvMWQ2cldUR1pKcmRDcTNRVTExUmtLWXlUcTJLVDVtY2VUdjlpR0txU2tTVGxwOHB1eS85UyIKLSAgICAiWi8zRGJVM1UrQnVxQ0ZxZVNsejd6andGbWszNWFjZENpbHBKbFZERE41Qy9SQ2g4L1VLYzhQYUwrY3hsdDUzMSIKLSAgICAicW9URU52WXJmbEJubzE0WUVabENCWnNQaUZlVVNJTHBLRWozQ2N3aHkwZUxFdWNXUTcyWVpVOG1VelhCb1hHbiIKLSAgICAiMHpBMGNyRmw1Y2kvMnNUQkJHWnN5bE5CQWdNQkFBR2pnZ0ZCTUlJQlBUQWRCZ05WSFNVRUZqQVVCZ2dyQmdFRiIKLSAgICAiQlFjREFRWUlLd1lCQlFVSEF3SXdHUVlEVlIwUkJCSXdFSUlPZDNkM0xtZHZiMmRzWlM1amIyMHdhQVlJS3dZQiIKLSAgICAiQlFVSEFRRUVYREJhTUNzR0NDc0dBUVVGQnpBQ2hoOW9kSFJ3T2k4dmNHdHBMbWR2YjJkc1pTNWpiMjB2UjBsQiIKLSAgICAiUnpJdVkzSjBNQ3NHQ0NzR0FRVUZCekFCaGg5b2RIUndPaTh2WTJ4cFpXNTBjekV1WjI5dloyeGxMbU52YlM5diIKLSAgICAiWTNOd01CMEdBMVVkRGdRV0JCUy9iekh4Y0U3M1E0ajNzbEM0QkxiTXRMakdHakFNQmdOVkhSTUJBZjhFQWpBQSIKLSAgICAiTUI4R0ExVWRJd1FZTUJhQUZFcmRCaFlidlBab3RYYjFnYmE3WWhxNldvRXZNQmNHQTFVZElBUVFNQTR3REFZSyIKLSAgICAiS3dZQkJBSFdlUUlGQVRBd0JnTlZIUjhFS1RBbk1DV2dJNkFoaGg5b2RIUndPaTh2Y0d0cExtZHZiMmRzWlM1aiIKLSAgICAiYjIwdlIwbEJSekl1WTNKc01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQWJxZFdQWkVIazBYN2lLUENUSEw2UyIKLSAgICAiM3c2cTFlUjY3Z294WkdGU00xbGsxaGp3eXU3WGNMSnV2QUxWVjl1WTNvdkVrUVpTSHdUK3B5T1BXUWhzU2pPKyIKLSAgICAiMUd5anZDdksvQ0F3aVVtQlgrYlFSR2FxSHNSY2lvN3hTYmRWY2FqUTNiWGRYK3MwV2RiT3BuNk1TdEtBaUJWbCIKLSAgICAib1BsU3hFSThweFk2eC9CQkNuVElrLytETUIxN3VabE9qRzN2YkFua0RrUCtuME9UdWNEOXNIVjdFVmo5WFV4aSIKLSAgICAiNTFuT2ZOQkNOL3M3bHBVakRTL05KNGszaXdPdGJDUHN3aW90OHZMTzc3OWFmMDd2UjAzcjM0OUl6L0tUems5NSIKLSAgICAicmxGdFgwSVUrS1lOeEZOc2FuSVhaK0M5RllHUlhrd2hIY3ZGYjRxTVVCMXlUVGxNODBqQk1Pd3lqWlhtalJBaCIKLSAgICAiTUlJRDhEQ0NBdGlnQXdJQkFnSURBanFETUEwR0NTcUdTSWIzRFFFQkN3VUFNRUl4Q3pBSkJnTlZCQVlUQWxWVCIKLSAgICAiTVJZd0ZBWURWUVFLRXcxSFpXOVVjblZ6ZENCSmJtTXVNUnN3R1FZRFZRUURFeEpIWlc5VWNuVnpkQ0JIYkc5aSIKLSAgICAiWVd3Z1EwRXdIaGNOTVRNd05EQTFNVFV4TlRVMldoY05NVFl4TWpNeE1qTTFPVFU1V2pCSk1Rc3dDUVlEVlFRRyIKLSAgICAiRXdKVlV6RVRNQkVHQTFVRUNoTUtSMjl2WjJ4bElFbHVZekVsTUNNR0ExVUVBeE1jUjI5dloyeGxJRWx1ZEdWeSIKLSAgICAiYm1WMElFRjFkR2h2Y21sMGVTQkhNakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQiIKLSAgICAiQUp3cUJIZGMyRkNST2dhamd1RFlVRWk4aVQveEdYQWFpRVorNEkvRjhZbk9JZTVhL21FTnR6SkVpYUIwQzFOUCIKLSAgICAiVmFUT2dtS1Y3dXRaWDhiaEJZQVN4RjZVUDd4YlNEajBVL2NrNXZ1UjZSWEV6L1JURGZSSy9KOVUzbjIrb0d0diIKLSAgICAiaDhEUVVCOG9NQU5BMmdoelVXeC8vem84cHpjR2pyMUxFUVRyZlNUZTV2bjhNWEg3bE5WZzh5NUtyMExTeStyRSIKLSAgICAiYWhxeXpGUGRGVXVMSDhnWllSL05uYWcrWXl1RU5XbGxoTWdaeFVZaStGT1Z2dU9BU2hER0t1eTZseUFSeHptWiIKLSAgICAiRUFTZzhHRjZsU1dNVGxKMTRyYnRDTW9VL000aWFyTk96MFlEbDVjRGZzQ3gzbnV2UlRQUHVqNXh0OTcwSlNYQyIKLSAgICAiRFRXSm5aMzdEaEY1aVI0M3hhK09jbWtDQXdFQUFhT0I1ekNCNURBZkJnTlZIU01FR0RBV2dCVEFlcGhvalluNyIKLSAgICAicXdWa0RCRjlxbjFsdU1yTVRqQWRCZ05WSFE0RUZnUVVTdDBHRmh1ODltaTFkdldCdHJ0aUdycGFnUzh3RGdZRCIKLSAgICAiVlIwUEFRSC9CQVFEQWdFR01DNEdDQ3NHQVFVRkJ3RUJCQ0l3SURBZUJnZ3JCZ0VGQlFjd0FZWVNhSFIwY0RvdiIKLSAgICAiTDJjdWMzbHRZMlF1WTI5dE1CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRQXdOUVlEVlIwZkJDNHdMREFxb0NpZyIKLSAgICAiSm9Za2FIUjBjRG92TDJjdWMzbHRZMkl1WTI5dEwyTnliSE12WjNSbmJHOWlZV3d1WTNKc01CY0dBMVVkSUFRUSIKLSAgICAiTUE0d0RBWUtLd1lCQkFIV2VRSUZBVEFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBcXZxcElNMXFaNFB0WHRSKyIKLSAgICAiM2gzRWYrQWxCZ0RGSlB1cHlDMXRmdDZkZ21Vc2dXTTBaajdwVXNJSXRNc3Y5MStaT21xY1VIcUZCWXg5MFNwSSIKLSAgICAiaE5NSmJIekN6VFdmODRMdVV0NW9YK1FBaWhjZ2x2Y3BqWnBOeTZqZWhzZ05iMWFIQTMwRFA5ejZlWDBoR2ZuSSIKLSAgICAiT2k5UmRvekhRWkp4anlYT04vaEtUQUFqNzhRMUVLN2dJNEJ6ZkUwMExzaHVrTllRSHBtRWN4cHc4dTFWRHU0WCIKLSAgICAiQnVwbjdqTHJMTjFuQnovMmk4SnczbHNBNXJzYjB6WWFJbXhzc0RWQ2JKQUpQWlBwWkFraURvVUduOEp6SWRQbSIKLSAgICAiWDREa2pZVWlPbk1Ec1dDT3Jtamk5RDZYNTJBU0NXZzIzanJXNGtPVld6ZUJrb0VmdTQzWHJWSmtGbGVXMlY0MCIKLSAgICAiZnNnMTJEQ0NBMzB3Z2dMbW9BTUNBUUlDQXhLNzVqQU5CZ2txaGtpRzl3MEJBUVVGQURCT01Rc3dDUVlEVlFRRyIKLSAgICAiRXdKVlV6RVFNQTRHQTFVRUNoTUhSWEYxYVdaaGVERXRNQ3NHQTFVRUN4TWtSWEYxYVdaaGVDQlRaV04xY21VZyIKLSAgICAiUTJWeWRHbG1hV05oZEdVZ1FYVjBhRzl5YVhSNU1CNFhEVEF5TURVeU1UQTBNREF3TUZvWERURTRNRGd5TVRBMCIKLSAgICAiTURBd01Gb3dRakVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVZGxiMVJ5ZFhOMElFbHVZeTR4R3pBWiIKLSAgICAiQmdOVkJBTVRFa2RsYjFSeWRYTjBJRWRzYjJKaGJDQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUCIKLSAgICAiQURDQ0FRb0NnZ0VCQU5yTUdHTXcvZlFYSXhwV2ZsdmZQR3c0NUhHM2VKSFV2S0hZVFBpb1E3WUQ2VTBoQndpSSIKLSAgICAiMmxndlpqa3B2UVY0aTUwNDZBVzNhbjV4cE9iRVlLYXc3NERraVNnUG5pWFc3WVB6cmFhUng1akpRaGcxRkoydCIKLSAgICAibUVhU0xrL0s4WWREd1JhVlZ5MVE3NGt0Z0hwWHJmTHVYMnZTQUkyNUZQZ1VGVFhad0VhamUzTElrYi9KVlN2TiIKLSAgICAiMEpjK25DWmt6Ti9PZ3hseHlrN20xTlY3cVJuTlZkN0k3TkplT0ZQbFhFK01MZjVRSXpiOFp1YkxqcVE1R1FDMyIKLSAgICAibFFJNWtRc08vamd1MFIwRm12Wk5QbThQQngydkxCNlBZRG5pK2paVEV6blVYaVlyMnoyb0ZMMHk2eGdES0ZJRSIKLSAgICAiY2VXck16M2hPTHNITm9SaW5IbnFGakQwWDhBcjZIRnI1UGtDQXdFQUFhT0I4RENCN1RBZkJnTlZIU01FR0RBVyIKLSAgICAiZ0JSSTVtajVLOUt5bGRkSDJDTWdFRTh6bUpDZjFEQWRCZ05WSFE0RUZnUVV3SHFZYUkySis2c0ZaQXdSZmFwOSIKLSAgICAiWmJqS3pFNHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd09nWURWUjBmQkRNdyIKLSAgICAiTVRBdm9DMmdLNFlwYUhSMGNEb3ZMMk55YkM1blpXOTBjblZ6ZEM1amIyMHZZM0pzY3k5elpXTjFjbVZqWVM1aiIKLSAgICAiY213d1RnWURWUjBnQkVjd1JUQkRCZ1JWSFNBQU1Ec3dPUVlJS3dZQkJRVUhBZ0VXTFdoMGRIQnpPaTh2ZDNkMyIKLSAgICAiTG1kbGIzUnlkWE4wTG1OdmJTOXlaWE52ZFhKalpYTXZjbVZ3YjNOcGRHOXllVEFOQmdrcWhraUc5dzBCQVFVRiIKLSAgICAiQUFPQmdRQjI0Ukp1VGtzV0VvWXdCcktCQ00vd0NNZkhjWDVtN3NMdDFEc2YvL0R3eUU3V1F6aXd1VEI5R05CViIKLSAgICAiZzZKcXl6WVJuT2hJWnFOdGY3Z1QxRWYraTFwY2MveXUyUnN5R1Rpcmx6UVVxcGJTNjZNY0ZBaEp0cnZsa2UrRCIKLSAgICAiTnVzZFZtL0sycnh6WTVEa2YzcytJc3M5QisxZk9IU2M0d05RVHFHdm1PNWg4b1EvRWc9PSI7Ci0KIC8vIGtCYWRTZXNzaW9uRXh0cmFGaWVsZCBpcyBhIGN1c3RvbSBzZXJpYWxpemVkIFNTTF9TRVNTSU9OIGdlbmVyYXRlZCBieSByZXBsYWNpbmcKIC8vIHRoZSBmaW5hbCAob3B0aW9uYWwpIGVsZW1lbnQgb2YgfGtDdXN0b21TZXNzaW9ufCB3aXRoIHRhZyBudW1iZXIgMzAuCiBzdGF0aWMgY29uc3QgY2hhciBrQmFkU2Vzc2lvbkV4dHJhRmllbGRbXSA9CkBAIC00OTgsMTggKzM1OSw2IEBACiAgICAgInErVG9weXp2eDlVU0ZnUnZ5dW94bjBIZ2IrUjBBM2o2U0xSdXlPZEFpNGd2N1k1b2xpeW5yU0lFSUFZR0JnWUciCiAgICAgIkJnWUdCZ1lHQmdZR0JnWUdCZ1lHQmdZR0JnWUdCZ1lHQmdZR3JnTUVBUWV2QXdRQkJMQURCQUVGIjsKIAotLy8ga0JhZFNlc3Npb25UcmFpbGluZ0RhdGEgaXMgYSBjdXN0b20gc2VyaWFsaXplZCBTU0xfU0VTU0lPTiB3aXRoIHRyYWlsaW5nIGRhdGEKLS8vIGFwcGVuZGVkLgotc3RhdGljIGNvbnN0IGNoYXIga0JhZFNlc3Npb25UcmFpbGluZ0RhdGFbXSA9Ci0gICAgIk1JSUJkZ0lCQVFJQ0F3TUVBc0F2QkNBRzVRMW5kcTRZZm1iZW8xendMa05SS21DWEdkTmdXdkdUM2Nza1YweVEiCi0gICAgImtBUXdKbHJsemtBV0JPV2lMai9qSjc2RDdsK1VYb2l6UDJLSTJDN0kyRmNjcU1tSWZGbW1rVXkzMm5JSjBtWkgiCi0gICAgIklXb0pvUVlDQkZSRE80NmlCQUlDQVN5a0F3UUJBcVVEQWdFVXBoQUVEbmQzZHk1bmIyOW5iR1V1WTI5dHFBY0UiCi0gICAgIkJYZHZjbXhrcVFVQ0F3R0p3S3FCcHdTQnBCd1VRdm9lT2swS2czNlNZVGNMRWtYcUt3T0JmRjl2RTRLWDBOeGUiCi0gICAgIkx3amNEVHBzdWgzcVhFYVo5OTJyMU4zOFZEY3lTNlA3STZIQllOOUJzTkhNMzYyelpuWTI3R3BUdytLd2Q3NTEiCi0gICAgIkNMb1hGUG9hTU9lNTdkYkJwWG9ybzZQZDNCVGJmL1R6cjg4SzA2eUVPVERLUE5qMytpbmJNYVZpZ3RLNFBMeVAiCi0gICAgInErVG9weXp2eDlVU0ZnUnZ5dW94bjBIZ2IrUjBBM2o2U0xSdXlPZEFpNGd2N1k1b2xpeW5yU0lFSUFZR0JnWUciCi0gICAgIkJnWUdCZ1lHQmdZR0JnWUdCZ1lHQmdZR0JnWUdCZ1lHQmdZR3JnTUVBUWV2QXdRQkJMQURCQUVGQUFBQSI7Ci0KIHN0YXRpYyBib29sIERlY29kZUJhc2U2NChzdGQ6OnZlY3Rvcjx1aW50OF90PiAqb3V0LCBjb25zdCBjaGFyICppbikgewogICBzaXplX3QgbGVuOwogICBpZiAoIUVWUF9EZWNvZGVkTGVuZ3RoKCZsZW4sIHN0cmxlbihpbikpKSB7CkBAIC01MzgsMTAgKzM4NywxMCBAQAogICB9CiAKICAgLy8gVmVyaWZ5IHRoZSBTU0xfU0VTU0lPTiBkZWNvZGVzLgotICBTY29wZWRTU0xfU0VTU0lPTiBzZXNzaW9uKFNTTF9TRVNTSU9OX2Zyb21fYnl0ZXMoYnNzbDo6dmVjdG9yX2RhdGEoJmlucHV0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNpemUoKSkpOwotICBpZiAoIXNlc3Npb24pIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlNTTF9TRVNTSU9OX2Zyb21fYnl0ZXMgZmFpbGVkXG4iKTsKKyAgY3B0ciA9IGJzc2w6OnZlY3Rvcl9kYXRhKCZpbnB1dCk7CisgIFNjb3BlZFNTTF9TRVNTSU9OIHNlc3Npb24oZDJpX1NTTF9TRVNTSU9OKE5VTEwsICZjcHRyLCBpbnB1dC5zaXplKCkpKTsKKyAgaWYgKCFzZXNzaW9uIHx8IGNwdHIgIT0gYnNzbDo6dmVjdG9yX2RhdGEoJmlucHV0KSArIGlucHV0LnNpemUoKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiZDJpX1NTTF9TRVNTSU9OIGZhaWxlZFxuIik7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKQEAgLTU1NywxNiArNDA2LDYgQEAKICAgaWYgKGVuY29kZWRfbGVuICE9IGlucHV0LnNpemUoKSB8fAogICAgICAgbWVtY21wKGJzc2w6OnZlY3Rvcl9kYXRhKCZpbnB1dCksIGVuY29kZWQuZ2V0KCksIGlucHV0LnNpemUoKSkgIT0gMCkgewogICAgIGZwcmludGYoc3RkZXJyLCAiU1NMX1NFU1NJT05fdG9fYnl0ZXMgZGlkIG5vdCByb3VuZC10cmlwXG4iKTsKLSAgICBoZXhkdW1wKHN0ZGVyciwgIkJlZm9yZTogIiwgaW5wdXQuZGF0YSgpLCBpbnB1dC5zaXplKCkpOwotICAgIGhleGR1bXAoc3RkZXJyLCAiQWZ0ZXI6ICAiLCBlbmNvZGVkX3JhdywgZW5jb2RlZF9sZW4pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFZlcmlmeSB0aGUgU1NMX1NFU1NJT04gYWxzbyBkZWNvZGVzIHdpdGggdGhlIGxlZ2FjeSBBUEkuCi0gIGNwdHIgPSBic3NsOjp2ZWN0b3JfZGF0YSgmaW5wdXQpOwotICBzZXNzaW9uLnJlc2V0KGQyaV9TU0xfU0VTU0lPTihOVUxMLCAmY3B0ciwgaW5wdXQuc2l6ZSgpKSk7Ci0gIGlmICghc2Vzc2lvbiB8fCBjcHRyICE9IGJzc2w6OnZlY3Rvcl9kYXRhKCZpbnB1dCkgKyBpbnB1dC5zaXplKCkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImQyaV9TU0xfU0VTU0lPTiBmYWlsZWRcbiIpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCkBAIC02MDgsMTAgKzQ0NywxMCBAQAogICB9CiAKICAgLy8gVmVyaWZ5IHRoYXQgdGhlIFNTTF9TRVNTSU9OIGZhaWxzIHRvIGRlY29kZS4KLSAgU2NvcGVkU1NMX1NFU1NJT04gc2Vzc2lvbihTU0xfU0VTU0lPTl9mcm9tX2J5dGVzKGJzc2w6OnZlY3Rvcl9kYXRhKCZpbnB1dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zaXplKCkpKTsKKyAgY29uc3QgdWludDhfdCAqcHRyID0gYnNzbDo6dmVjdG9yX2RhdGEoJmlucHV0KTsKKyAgU2NvcGVkU1NMX1NFU1NJT04gc2Vzc2lvbihkMmlfU1NMX1NFU1NJT04oTlVMTCwgJnB0ciwgaW5wdXQuc2l6ZSgpKSk7CiAgIGlmIChzZXNzaW9uKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJTU0xfU0VTU0lPTl9mcm9tX2J5dGVzIHVuZXhwZWN0ZWRseSBzdWNjZWVkZWRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiZDJpX1NTTF9TRVNTSU9OIHVuZXhwZWN0ZWRseSBzdWNjZWVkZWRcbiIpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogICBFUlJfY2xlYXJfZXJyb3IoKTsKQEAgLTY5MCwxNDQgKzUyOSwxNCBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotLy8gQ3JlYXRlU2Vzc2lvbldpdGhUaWNrZXQgcmV0dXJucyBhIHNhbXBsZSB8U1NMX1NFU1NJT058IHdpdGggdGhlIHRpY2tldAotLy8gcmVwbGFjZWQgZm9yIG9uZSBvZiBsZW5ndGggfHRpY2tldF9sZW58IG9yIG51bGxwdHIgb24gZmFpbHVyZS4KLXN0YXRpYyBTY29wZWRTU0xfU0VTU0lPTiBDcmVhdGVTZXNzaW9uV2l0aFRpY2tldChzaXplX3QgdGlja2V0X2xlbikgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZXI7Ci0gIGlmICghRGVjb2RlQmFzZTY0KCZkZXIsIGtPcGVuU1NMU2Vzc2lvbikpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBTY29wZWRTU0xfU0VTU0lPTiBzZXNzaW9uKFNTTF9TRVNTSU9OX2Zyb21fYnl0ZXMoYnNzbDo6dmVjdG9yX2RhdGEoJmRlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXIuc2l6ZSgpKSk7Ci0gIGlmICghc2Vzc2lvbikgewotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgLy8gU3dhcCBvdXQgdGhlIHRpY2tldCBmb3IgYSBnYXJiYWdlIG9uZS4KLSAgT1BFTlNTTF9mcmVlKHNlc3Npb24tPnRsc2V4dF90aWNrKTsKLSAgc2Vzc2lvbi0+dGxzZXh0X3RpY2sgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihPUEVOU1NMX21hbGxvYyh0aWNrZXRfbGVuKSk7Ci0gIGlmIChzZXNzaW9uLT50bHNleHRfdGljayA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgbWVtc2V0KHNlc3Npb24tPnRsc2V4dF90aWNrLCAnYScsIHRpY2tldF9sZW4pOwotICBzZXNzaW9uLT50bHNleHRfdGlja2xlbiA9IHRpY2tldF9sZW47Ci0gIHJldHVybiBzZXNzaW9uOwotfQotCi0vLyBHZXRDbGllbnRIZWxsb0xlbiBjcmVhdGVzIGEgY2xpZW50IFNTTCBjb25uZWN0aW9uIHdpdGggYSB0aWNrZXQgb2YgbGVuZ3RoCi0vLyB8dGlja2V0X2xlbnwgYW5kIHJlY29yZHMgdGhlIENsaWVudEhlbGxvLiBJdCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlCi0vLyBDbGllbnRIZWxsbywgbm90IGluY2x1ZGluZyB0aGUgcmVjb3JkIGhlYWRlciwgb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4KLXN0YXRpYyBzaXplX3QgR2V0Q2xpZW50SGVsbG9MZW4oc2l6ZV90IHRpY2tldF9sZW4pIHsKLSAgU2NvcGVkU1NMX0NUWCBjdHgoU1NMX0NUWF9uZXcoVExTX21ldGhvZCgpKSk7Ci0gIFNjb3BlZFNTTF9TRVNTSU9OIHNlc3Npb24gPSBDcmVhdGVTZXNzaW9uV2l0aFRpY2tldCh0aWNrZXRfbGVuKTsKLSAgaWYgKCFjdHggfHwgIXNlc3Npb24pIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBTY29wZWRTU0wgc3NsKFNTTF9uZXcoY3R4LmdldCgpKSk7Ci0gIFNjb3BlZEJJTyBiaW8oQklPX25ldyhCSU9fc19tZW0oKSkpOwotICBpZiAoIXNzbCB8fCAhYmlvIHx8ICFTU0xfc2V0X3Nlc3Npb24oc3NsLmdldCgpLCBzZXNzaW9uLmdldCgpKSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIC8vIERvIG5vdCBjb25maWd1cmUgYSByZWFkaW5nIEJJTywgYnV0IHJlY29yZCB3aGF0J3Mgd3JpdHRlbiB0byBhIG1lbW9yeSBCSU8uCi0gIFNTTF9zZXRfYmlvKHNzbC5nZXQoKSwgbnVsbHB0ciAvKiByYmlvICovLCBCSU9fdXBfcmVmKGJpby5nZXQoKSkpOwotICBpbnQgcmV0ID0gU1NMX2Nvbm5lY3Qoc3NsLmdldCgpKTsKLSAgaWYgKHJldCA+IDApIHsKLSAgICAvLyBTU0xfY29ubmVjdCBzaG91bGQgZmFpbCB3aXRob3V0IGEgQklPIHRvIHdyaXRlIHRvLgotICAgIHJldHVybiAwOwotICB9Ci0gIEVSUl9jbGVhcl9lcnJvcigpOwotCi0gIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDsKLSAgc2l6ZV90IGNsaWVudF9oZWxsb19sZW47Ci0gIGlmICghQklPX21lbV9jb250ZW50cyhiaW8uZ2V0KCksICZ1bnVzZWQsICZjbGllbnRfaGVsbG9fbGVuKSB8fAotICAgICAgY2xpZW50X2hlbGxvX2xlbiA8PSBTU0wzX1JUX0hFQURFUl9MRU5HVEgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gY2xpZW50X2hlbGxvX2xlbiAtIFNTTDNfUlRfSEVBREVSX0xFTkdUSDsKLX0KLQotc3RydWN0IFBhZGRpbmdUZXN0IHsKLSAgc2l6ZV90IGlucHV0X2xlbiwgcGFkZGVkX2xlbjsKLX07Ci0KLXN0YXRpYyBjb25zdCBQYWRkaW5nVGVzdCBrUGFkZGluZ1Rlc3RzW10gPSB7Ci0gICAgLy8gQ2xpZW50SGVsbG9zIG9mIGxlbmd0aCBiZWxvdyAweDEwMCBkbyBub3QgcmVxdWlyZSBwYWRkaW5nLgotICAgIHsweGZlLCAweGZlfSwKLSAgICB7MHhmZiwgMHhmZn0sCi0gICAgLy8gQ2xpZW50SGVsbG9zIG9mIGxlbmd0aCAweDEwMCB0aHJvdWdoIDB4MWZiIGFyZSBwYWRkZWQgdXAgdG8gMHgyMDAuCi0gICAgezB4MTAwLCAweDIwMH0sCi0gICAgezB4MTIzLCAweDIwMH0sCi0gICAgezB4MWZiLCAweDIwMH0sCi0gICAgLy8gQ2xpZW50SGVsbG9zIG9mIGxlbmd0aCAweDFmYyB0aHJvdWdoIDB4MWZmIGdldCBwYWRkZWQgYmV5b25kIDB4MjAwLiBUaGUKLSAgICAvLyBwYWRkaW5nIGV4dGVuc2lvbiB0YWtlcyBhIG1pbmltdW0gb2YgZm91ciBieXRlcyBwbHVzIG9uZSByZXF1aXJlZCBjb250ZW50Ci0gICAgLy8gYnl0ZS4gKFRvIHdvcmsgYXJvdW5kIHlldCBtb3JlIHNlcnZlciBidWdzLCB3ZSBhdm9pZCBlbXB0eSBmaW5hbAotICAgIC8vIGV4dGVuc2lvbnMuKQotICAgIHsweDFmYywgMHgyMDF9LAotICAgIHsweDFmZCwgMHgyMDJ9LAotICAgIHsweDFmZSwgMHgyMDN9LAotICAgIHsweDFmZiwgMHgyMDR9LAotICAgIC8vIEZpbmFsbHksIGxhcmdlciBDbGllbnRIZWxsb3MgbmVlZCBubyBwYWRkaW5nLgotICAgIHsweDIwMCwgMHgyMDB9LAotICAgIHsweDIwMSwgMHgyMDF9LAotfTsKLQotc3RhdGljIGJvb2wgVGVzdFBhZGRpbmdFeHRlbnNpb24oKSB7Ci0gIC8vIFNhbXBsZSBhIGJhc2VsaW5lIGxlbmd0aC4KLSAgc2l6ZV90IGJhc2VfbGVuID0gR2V0Q2xpZW50SGVsbG9MZW4oMSk7Ci0gIGlmIChiYXNlX2xlbiA9PSAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZm9yIChjb25zdCBQYWRkaW5nVGVzdCAmdGVzdCA6IGtQYWRkaW5nVGVzdHMpIHsKLSAgICBpZiAoYmFzZV9sZW4gPiB0ZXN0LmlucHV0X2xlbikgewotICAgICAgZnByaW50ZihzdGRlcnIsICJCYXNlbGluZSBDbGllbnRIZWxsbyB0b28gbG9uZy5cbiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHNpemVfdCBwYWRkZWRfbGVuID0gR2V0Q2xpZW50SGVsbG9MZW4oMSArIHRlc3QuaW5wdXRfbGVuIC0gYmFzZV9sZW4pOwotICAgIGlmIChwYWRkZWRfbGVuICE9IHRlc3QucGFkZGVkX2xlbikgewotICAgICAgZnByaW50ZihzdGRlcnIsICIldS1ieXRlIENsaWVudEhlbGxvIHBhZGRlZCB0byAldSBieXRlcywgbm90ICV1LlxuIiwKLSAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRlc3QuaW5wdXRfbGVuKSwKLSAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHBhZGRlZF9sZW4pLAotICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZD4odGVzdC5wYWRkZWRfbGVuKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBUZXN0IHRoYXQgfFNTTF9nZXRfY2xpZW50X0NBX2xpc3R8IGVjaG9lcyBiYWNrIHRoZSBjb25maWd1cmVkIHBhcmFtZXRlciBldmVuCi0vLyBiZWZvcmUgY29uZmlndXJpbmcgYXMgYSBzZXJ2ZXIuCi1zdGF0aWMgYm9vbCBUZXN0Q2xpZW50Q0FMaXN0KCkgewotICBTY29wZWRTU0xfQ1RYIGN0eChTU0xfQ1RYX25ldyhUTFNfbWV0aG9kKCkpKTsKLSAgaWYgKCFjdHgpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgU2NvcGVkU1NMIHNzbChTU0xfbmV3KGN0eC5nZXQoKSkpOwotICBpZiAoIXNzbCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFNUQUNLX09GKFg1MDlfTkFNRSkgKnN0YWNrID0gc2tfWDUwOV9OQU1FX25ld19udWxsKCk7Ci0gIGlmIChzdGFjayA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIHxTU0xfc2V0X2NsaWVudF9DQV9saXN0fCB0YWtlcyBvd25lcnNoaXAuCi0gIFNTTF9zZXRfY2xpZW50X0NBX2xpc3Qoc3NsLmdldCgpLCBzdGFjayk7Ci0KLSAgcmV0dXJuIFNTTF9nZXRfY2xpZW50X0NBX2xpc3Qoc3NsLmdldCgpKSA9PSBzdGFjazsKLX0KLQotaW50IG1haW4oKSB7CitpbnQgbWFpbih2b2lkKSB7CiAgIFNTTF9saWJyYXJ5X2luaXQoKTsKIAogICBpZiAoIVRlc3RDaXBoZXJSdWxlcygpIHx8CiAgICAgICAhVGVzdFNTTF9TRVNTSU9ORW5jb2Rpbmcoa09wZW5TU0xTZXNzaW9uKSB8fAogICAgICAgIVRlc3RTU0xfU0VTU0lPTkVuY29kaW5nKGtDdXN0b21TZXNzaW9uKSB8fAotICAgICAgIVRlc3RTU0xfU0VTU0lPTkVuY29kaW5nKGtCb3JpbmdTU0xTZXNzaW9uKSB8fAogICAgICAgIVRlc3RCYWRTU0xfU0VTU0lPTkVuY29kaW5nKGtCYWRTZXNzaW9uRXh0cmFGaWVsZCkgfHwKICAgICAgICFUZXN0QmFkU1NMX1NFU1NJT05FbmNvZGluZyhrQmFkU2Vzc2lvblZlcnNpb24pIHx8Ci0gICAgICAhVGVzdEJhZFNTTF9TRVNTSU9ORW5jb2Rpbmcoa0JhZFNlc3Npb25UcmFpbGluZ0RhdGEpIHx8CiAgICAgICAhVGVzdERlZmF1bHRWZXJzaW9uKDAsICZUTFNfbWV0aG9kKSB8fAogICAgICAgIVRlc3REZWZhdWx0VmVyc2lvbihTU0wzX1ZFUlNJT04sICZTU0x2M19tZXRob2QpIHx8CiAgICAgICAhVGVzdERlZmF1bHRWZXJzaW9uKFRMUzFfVkVSU0lPTiwgJlRMU3YxX21ldGhvZCkgfHwKQEAgLTgzNiw5ICs1NDUsNyBAQAogICAgICAgIVRlc3REZWZhdWx0VmVyc2lvbigwLCAmRFRMU19tZXRob2QpIHx8CiAgICAgICAhVGVzdERlZmF1bHRWZXJzaW9uKERUTFMxX1ZFUlNJT04sICZEVExTdjFfbWV0aG9kKSB8fAogICAgICAgIVRlc3REZWZhdWx0VmVyc2lvbihEVExTMV8yX1ZFUlNJT04sICZEVExTdjFfMl9tZXRob2QpIHx8Ci0gICAgICAhVGVzdENpcGhlckdldFJGQ05hbWUoKSB8fAotICAgICAgIVRlc3RQYWRkaW5nRXh0ZW5zaW9uKCkgfHwKLSAgICAgICFUZXN0Q2xpZW50Q0FMaXN0KCkpIHsKKyAgICAgICFUZXN0Q2lwaGVyR2V0UkZDTmFtZSgpKSB7CiAgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOwogICAgIHJldHVybiAxOwogICB9CmRpZmYgLS1naXQgYS9zcmMvc3NsL3NzbF90eHQuYyBiL3NyYy9zc2wvc3NsX3R4dC5jCmluZGV4IDNiYTA4ODcuLjIyNzVmMTYgMTAwNjQ0Ci0tLSBhL3NyYy9zc2wvc3NsX3R4dC5jCisrKyBiL3NyYy9zc2wvc3NsX3R4dC5jCkBAIC04MCwxNCArODAsMTIgQEAKICAqIE9USEVSIEVOVElUWSBCQVNFRCBPTiBJTkZSSU5HRU1FTlQgT0YgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUyBPUgogICogT1RIRVJXSVNFLiAqLwogCi0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KLQogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KIAotI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWYuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgotI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCkBAIC05OCw3ICs5Niw3IEBACiAKICAgYiA9IEJJT19uZXcoQklPX3NfZmlsZSgpKTsKICAgaWYgKGIgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfQlVGX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfU0VTU0lPTl9wcmludF9mcCwgRVJSX1JfQlVGX0xJQik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3NzbC90MV9lbmMuYyBiL3NyYy9zc2wvdDFfZW5jLmMKaW5kZXggMDc2ZjhiZC4uNmJkODBjMyAxMDA2NDQKLS0tIGEvc3JjL3NzbC90MV9lbmMuYworKysgYi9zcmMvc3NsL3QxX2VuYy5jCkBAIC0xMzMsOCArMTMzLDYgQEAKICAqIE9USEVSIEVOVElUWSBCQVNFRCBPTiBJTkZSSU5HRU1FTlQgT0YgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUyBPUgogICogT1RIRVJXSVNFLiAqLwogCi0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KLQogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC0xNTEsNyArMTQ5LDcgQEAKIAogCiAvKiB0bHMxX1BfaGFzaCBjb21wdXRlcyB0aGUgVExTIFBfPGhhc2g+IGZ1bmN0aW9uIGFzIGRlc2NyaWJlZCBpbiBSRkMgNTI0NiwKLSAqIHNlY3Rpb24gNS4gSXQgWE9ScyB8b3V0X2xlbnwgYnl0ZXMgdG8gfG91dHwsIHVzaW5nIHxtZHwgYXMgdGhlIGhhc2ggYW5kCisgKiBzZWN0aW9uIDUuIEl0IHdyaXRlcyB8b3V0X2xlbnwgYnl0ZXMgdG8gfG91dHwsIHVzaW5nIHxtZHwgYXMgdGhlIGhhc2ggYW5kCiAgKiB8c2VjcmV0fCBhcyB0aGUgc2VjcmV0LiB8c2VlZDF8IHRocm91Z2ggfHNlZWQzfCBhcmUgY29uY2F0ZW5hdGVkIHRvIGZvcm0gdGhlCiAgKiBzZWVkIHBhcmFtZXRlci4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBmYWlsdXJlLiAqLwogc3RhdGljIGludCB0bHMxX1BfaGFzaCh1aW50OF90ICpvdXQsIHNpemVfdCBvdXRfbGVuLCBjb25zdCBFVlBfTUQgKm1kLApAQCAtMTkwLDMyICsxODgsMjYgQEAKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIAotICAgIHVuc2lnbmVkIGxlbjsKLSAgICB1aW50OF90IGhtYWNbRVZQX01BWF9NRF9TSVpFXTsKLSAgICBpZiAoIUhNQUNfRmluYWwoJmN0eCwgaG1hYywgJmxlbikpIHsKLSAgICAgIGdvdG8gZXJyOwotICAgIH0KLSAgICBhc3NlcnQobGVuID09IGNodW5rKTsKLQotICAgIC8qIFhPUiB0aGUgcmVzdWx0IGludG8gfG91dHwuICovCi0gICAgaWYgKGxlbiA+IG91dF9sZW4pIHsKLSAgICAgIGxlbiA9IG91dF9sZW47Ci0gICAgfQotICAgIHVuc2lnbmVkIGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICBvdXRbaV0gXj0gaG1hY1tpXTsKLSAgICB9Ci0gICAgb3V0ICs9IGxlbjsKLSAgICBvdXRfbGVuIC09IGxlbjsKLQotICAgIGlmIChvdXRfbGVuID09IDApIHsKKyAgICBpZiAob3V0X2xlbiA+IGNodW5rKSB7CisgICAgICB1bnNpZ25lZCBsZW47CisgICAgICBpZiAoIUhNQUNfRmluYWwoJmN0eCwgb3V0LCAmbGVuKSkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIGFzc2VydChsZW4gPT0gY2h1bmspOworICAgICAgb3V0ICs9IGxlbjsKKyAgICAgIG91dF9sZW4gLT0gbGVuOworICAgICAgLyogQ2FsY3VsYXRlIHRoZSBuZXh0IEExIHZhbHVlLiAqLworICAgICAgaWYgKCFITUFDX0ZpbmFsKCZjdHhfdG1wLCBBMSwgJkExX2xlbikpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIExhc3QgY2h1bmsuICovCisgICAgICBpZiAoIUhNQUNfRmluYWwoJmN0eCwgQTEsICZBMV9sZW4pKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgICAgbWVtY3B5KG91dCwgQTEsIG91dF9sZW4pOwogICAgICAgYnJlYWs7CiAgICAgfQotCi0gICAgLyogQ2FsY3VsYXRlIHRoZSBuZXh0IEExIHZhbHVlLiAqLwotICAgIGlmICghSE1BQ19GaW5hbCgmY3R4X3RtcCwgQTEsICZBMV9sZW4pKSB7Ci0gICAgICBnb3RvIGVycjsKLSAgICB9CiAgIH0KIAogICByZXQgPSAxOwpAQCAtMjMyLDM2ICsyMjQsNjIgQEAKICAgICAgICAgICAgICBzaXplX3Qgc2VjcmV0X2xlbiwgY29uc3QgY2hhciAqbGFiZWwsIHNpemVfdCBsYWJlbF9sZW4sCiAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc2VlZDEsIHNpemVfdCBzZWVkMV9sZW4sCiAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc2VlZDIsIHNpemVfdCBzZWVkMl9sZW4pIHsKKyAgc2l6ZV90IGlkeCwgbGVuLCBjb3VudCwgaTsKKyAgY29uc3QgdWludDhfdCAqUzE7CisgIHVpbnQzMl90IG07CisgIGNvbnN0IEVWUF9NRCAqbWQ7CisgIGludCByZXQgPSAwOworICB1aW50OF90ICp0bXA7CiAKICAgaWYgKG91dF9sZW4gPT0gMCkgewogICAgIHJldHVybiAxOwogICB9CiAKLSAgbWVtc2V0KG91dCwgMCwgb3V0X2xlbik7Ci0KLSAgdWludDMyX3QgYWxnb3JpdGhtX3ByZiA9IHNzbF9nZXRfYWxnb3JpdGhtX3ByZihzKTsKLSAgaWYgKGFsZ29yaXRobV9wcmYgPT0gU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVCkgewotICAgIC8qIElmIHVzaW5nIHRoZSBNRDUvU0hBMSBQUkYsIHxzZWNyZXR8IGlzIHBhcnRpdGlvbmVkIGJldHdlZW4gU0hBLTEgYW5kCi0gICAgICogTUQ1LCBNRDUgZmlyc3QuICovCi0gICAgc2l6ZV90IHNlY3JldF9oYWxmID0gc2VjcmV0X2xlbiAtIChzZWNyZXRfbGVuIC8gMik7Ci0gICAgaWYgKCF0bHMxX1BfaGFzaChvdXQsIG91dF9sZW4sIEVWUF9tZDUoKSwgc2VjcmV0LCBzZWNyZXRfaGFsZiwKLSAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbGFiZWwsIGxhYmVsX2xlbiwgc2VlZDEsIHNlZWQxX2xlbiwgc2VlZDIsCi0gICAgICAgICAgICAgICAgICAgICBzZWVkMl9sZW4pKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBOb3RlIHRoYXQsIGlmIHxzZWNyZXRfbGVufCBpcyBvZGQsIHRoZSB0d28gaGFsdmVzIHNoYXJlIGEgYnl0ZS4gKi8KLSAgICBzZWNyZXQgPSBzZWNyZXQgKyAoc2VjcmV0X2xlbiAtIHNlY3JldF9oYWxmKTsKLSAgICBzZWNyZXRfbGVuID0gc2VjcmV0X2hhbGY7Ci0gIH0KLQotICBpZiAoIXRsczFfUF9oYXNoKG91dCwgb3V0X2xlbiwgc3NsX2dldF9oYW5kc2hha2VfZGlnZXN0KGFsZ29yaXRobV9wcmYpLAotICAgICAgICAgICAgICAgICAgIHNlY3JldCwgc2VjcmV0X2xlbiwgKGNvbnN0IHVpbnQ4X3QgKilsYWJlbCwgbGFiZWxfbGVuLAotICAgICAgICAgICAgICAgICAgIHNlZWQxLCBzZWVkMV9sZW4sIHNlZWQyLCBzZWVkMl9sZW4pKSB7CisgIC8qIEFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gKi8KKyAgdG1wID0gT1BFTlNTTF9tYWxsb2Mob3V0X2xlbik7CisgIGlmICh0bXAgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgdGxzMV9wcmYsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gMDsKICAgfQogCi0gIHJldHVybiAxOworICAvKiBDb3VudCBudW1iZXIgb2YgZGlnZXN0cyBhbmQgcGFydGl0aW9uIHxzZWNyZXR8IGV2ZW5seS4gKi8KKyAgY291bnQgPSAwOworICBmb3IgKGlkeCA9IDA7IHNzbF9nZXRfaGFuZHNoYWtlX2RpZ2VzdCgmbSwgJm1kLCBpZHgpOyBpZHgrKykgeworICAgIGlmIChtICYgc3NsX2dldF9hbGdvcml0aG0yKHMpKSB7CisgICAgICBjb3VudCsrOworICAgIH0KKyAgfQorICAvKiBUT0RPKGRhdmlkYmVuKTogVGhlIG9ubHkgY2FzZSB3aGVyZSBjb3VudCBpc24ndCAxIGlzIHRoZSBvbGQgTUQ1L1NIQS0xCisgICAqIGNvbWJpbmF0aW9uLiBUaGUgbG9naWMgYXJvdW5kIG11bHRpcGxlIGhhbmRzaGFrZSBkaWdlc3RzIGNhbiBwcm9iYWJseSBiZQorICAgKiBzaW1wbGlmaWVkLiAqLworICBhc3NlcnQoY291bnQgPT0gMSB8fCBjb3VudCA9PSAyKTsKKyAgbGVuID0gc2VjcmV0X2xlbiAvIGNvdW50OworICBpZiAoY291bnQgPT0gMSkgeworICAgIHNlY3JldF9sZW4gPSAwOworICB9CisgIFMxID0gc2VjcmV0OworICBtZW1zZXQob3V0LCAwLCBvdXRfbGVuKTsKKyAgZm9yIChpZHggPSAwOyBzc2xfZ2V0X2hhbmRzaGFrZV9kaWdlc3QoJm0sICZtZCwgaWR4KTsgaWR4KyspIHsKKyAgICBpZiAobSAmIHNzbF9nZXRfYWxnb3JpdGhtMihzKSkgeworICAgICAgLyogSWYgfGNvdW50fCBpcyAyIGFuZCB8c2VjcmV0X2xlbnwgaXMgb2RkLCB8c2VjcmV0fCBpcyBwYXJ0aXRpb25lZCBpbnRvCisgICAgICAgKiB0d28gaGFsdmVzIHdpdGggYW4gb3ZlcmxhcHBpbmcgYnl0ZS4gKi8KKyAgICAgIGlmICghdGxzMV9QX2hhc2godG1wLCBvdXRfbGVuLCBtZCwgUzEsIGxlbiArIChzZWNyZXRfbGVuICYgMSksCisgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbGFiZWwsIGxhYmVsX2xlbiwgc2VlZDEsIHNlZWQxX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VlZDIsIHNlZWQyX2xlbikpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgICBTMSArPSBsZW47CisgICAgICBmb3IgKGkgPSAwOyBpIDwgb3V0X2xlbjsgaSsrKSB7CisgICAgICAgIG91dFtpXSBePSB0bXBbaV07CisgICAgICB9CisgICAgfQorICB9CisgIHJldCA9IDE7CisKK2VycjoKKyAgT1BFTlNTTF9jbGVhbnNlKHRtcCwgb3V0X2xlbik7CisgIE9QRU5TU0xfZnJlZSh0bXApOworICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHRsczFfZ2VuZXJhdGVfa2V5X2Jsb2NrKFNTTCAqcywgdWludDhfdCAqb3V0LCBzaXplX3Qgb3V0X2xlbikgewpAQCAtMjk5LDcgKzMxNyw3IEBACiAgIGl2X2xlbiA9IHMtPnMzLT50bXAubmV3X2ZpeGVkX2l2X2xlbjsKIAogICBpZiAoYWVhZCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCB0bHMxX2NoYW5nZV9jaXBoZXJfc3RhdGUsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0zMDksNyArMzI3LDcgQEAKICAgICAgKiBzdWl0ZXMpIHRoZSBrZXkgbGVuZ3RoIHJlcG9ydGVkIGJ5IHxFVlBfQUVBRF9rZXlfbGVuZ3RofCB3aWxsCiAgICAgICogaW5jbHVkZSB0aGUgTUFDIGFuZCBJViBrZXkgYnl0ZXMuICovCiAgICAgaWYgKGtleV9sZW4gPCBtYWNfc2VjcmV0X2xlbiArIGl2X2xlbikgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHRsczFfY2hhbmdlX2NpcGhlcl9zdGF0ZSwgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGtleV9sZW4gLT0gbWFjX3NlY3JldF9sZW4gKyBpdl9sZW47CkBAIC0zNDAsNyArMzU4LDcgQEAKICAgfQogCiAgIGlmIChrZXlfZGF0YSAtIHMtPnMzLT50bXAua2V5X2Jsb2NrICE9IHMtPnMzLT50bXAua2V5X2Jsb2NrX2xlbmd0aCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgdGxzMV9jaGFuZ2VfY2lwaGVyX3N0YXRlLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMzUxLDI2ICszNjksMTQgQEAKICAgICAgICAgcy0+czMtPnRtcC5uZXdfY2lwaGVyLCBrZXksIGtleV9sZW4sIG1hY19zZWNyZXQsIG1hY19zZWNyZXRfbGVuLCBpdiwKICAgICAgICAgaXZfbGVuKTsKICAgICByZXR1cm4gcy0+YWVhZF9yZWFkX2N0eCAhPSBOVUxMOworICB9IGVsc2UgeworICAgIFNTTF9BRUFEX0NUWF9mcmVlKHMtPmFlYWRfd3JpdGVfY3R4KTsKKyAgICBzLT5hZWFkX3dyaXRlX2N0eCA9IFNTTF9BRUFEX0NUWF9uZXcoCisgICAgICAgIGV2cF9hZWFkX3NlYWwsIHNzbDNfdmVyc2lvbl9mcm9tX3dpcmUocywgcy0+dmVyc2lvbiksCisgICAgICAgIHMtPnMzLT50bXAubmV3X2NpcGhlciwga2V5LCBrZXlfbGVuLCBtYWNfc2VjcmV0LCBtYWNfc2VjcmV0X2xlbiwgaXYsCisgICAgICAgIGl2X2xlbik7CisgICAgcmV0dXJuIHMtPmFlYWRfd3JpdGVfY3R4ICE9IE5VTEw7CiAgIH0KLQotICBTU0xfQUVBRF9DVFhfZnJlZShzLT5hZWFkX3dyaXRlX2N0eCk7Ci0gIHMtPmFlYWRfd3JpdGVfY3R4ID0gU1NMX0FFQURfQ1RYX25ldygKLSAgICAgIGV2cF9hZWFkX3NlYWwsIHNzbDNfdmVyc2lvbl9mcm9tX3dpcmUocywgcy0+dmVyc2lvbiksCi0gICAgICBzLT5zMy0+dG1wLm5ld19jaXBoZXIsIGtleSwga2V5X2xlbiwgbWFjX3NlY3JldCwgbWFjX3NlY3JldF9sZW4sIGl2LAotICAgICAgaXZfbGVuKTsKLSAgaWYgKHMtPmFlYWRfd3JpdGVfY3R4ID09IE5VTEwpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHMtPnMzLT5uZWVkX3JlY29yZF9zcGxpdHRpbmcgPSAwOwotICBpZiAoIVNTTF9VU0VfRVhQTElDSVRfSVYocykgJiYKLSAgICAgIChzLT5tb2RlICYgU1NMX01PREVfQ0JDX1JFQ09SRF9TUExJVFRJTkcpICE9IDAgJiYKLSAgICAgIFNTTF9DSVBIRVJfaXNfYmxvY2tfY2lwaGVyKHMtPnMzLT50bXAubmV3X2NpcGhlcikpIHsKLSAgICAvKiBFbmFibGUgMS9uLTEgcmVjb3JkLXNwbGl0dGluZyB0byByYW5kb21pemUgdGhlIElWLiBTZWUKLSAgICAgKiBodHRwczovL3d3dy5vcGVuc3NsLm9yZy9+Ym9kby90bHMtY2JjLnR4dCBhbmQgdGhlIEJFQVNUIGF0dGFjay4gKi8KLSAgICBzLT5zMy0+bmVlZF9yZWNvcmRfc3BsaXR0aW5nID0gMTsKLSAgfQotICByZXR1cm4gMTsKIH0KIAogaW50IHRsczFfc2V0dXBfa2V5X2Jsb2NrKFNTTCAqcykgewpAQCAtNDAwLDE0ICs0MDYsMTQgQEAKICAgICAgKiBrZXkgbGVuZ3RoIHJlcG9ydGVkIGJ5IHxFVlBfQUVBRF9rZXlfbGVuZ3RofCB3aWxsIGluY2x1ZGUgdGhlIE1BQyBrZXkKICAgICAgKiBieXRlcyBhbmQgaW5pdGlhbCBpbXBsaWNpdCBJVi4gKi8KICAgICBpZiAoa2V5X2xlbiA8IG1hY19zZWNyZXRfbGVuICsgZml4ZWRfaXZfbGVuKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgdGxzMV9zZXR1cF9rZXlfYmxvY2ssIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBrZXlfbGVuIC09IG1hY19zZWNyZXRfbGVuICsgZml4ZWRfaXZfbGVuOwogICB9IGVsc2UgewogICAgIC8qIFRoZSBub25jZSBpcyBzcGxpdCBpbnRvIGEgZml4ZWQgcG9ydGlvbiBhbmQgYSB2YXJpYWJsZSBwb3J0aW9uLiAqLwogICAgIGlmICh2YXJpYWJsZV9pdl9sZW4gPCBmaXhlZF9pdl9sZW4pIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCB0bHMxX3NldHVwX2tleV9ibG9jaywgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIHZhcmlhYmxlX2l2X2xlbiAtPSBmaXhlZF9pdl9sZW47CkBAIC00MjksNyArNDM1LDcgQEAKIAogICBwID0gKHVpbnQ4X3QgKilPUEVOU1NMX21hbGxvYyhrZXlfYmxvY2tfbGVuKTsKICAgaWYgKHAgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgdGxzMV9zZXR1cF9rZXlfYmxvY2ssIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC00NDAsNjEgKzQ0Niw2MCBAQAogICAgIGdvdG8gZXJyOwogICB9CiAKKyAgaWYgKCFTU0xfVVNFX0VYUExJQ0lUX0lWKHMpICYmCisgICAgICAocy0+bW9kZSAmIFNTTF9NT0RFX0NCQ19SRUNPUkRfU1BMSVRUSU5HKSAhPSAwKSB7CisgICAgLyogZW5hYmxlIHZ1bG5lcmFiaWxpdHkgY291bnRlcm1lYXN1cmUgZm9yIENCQyBjaXBoZXJzIHdpdGgga25vd24tSVYKKyAgICAgKiBwcm9ibGVtIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35ib2RvL3Rscy1jYmMudHh0KS4gKi8KKyAgICBzLT5zMy0+bmVlZF9yZWNvcmRfc3BsaXR0aW5nID0gMTsKKworICAgIGlmIChzLT5zZXNzaW9uLT5jaXBoZXIgIT0gTlVMTCAmJgorICAgICAgICBzLT5zZXNzaW9uLT5jaXBoZXItPmFsZ29yaXRobV9lbmMgPT0gU1NMX1JDNCkgeworICAgICAgcy0+czMtPm5lZWRfcmVjb3JkX3NwbGl0dGluZyA9IDA7CisgICAgfQorICB9CisKICAgcmV0ID0gMTsKIAogZXJyOgogICByZXR1cm4gcmV0OwogCiBjaXBoZXJfdW5hdmFpbGFibGVfZXJyOgotICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0NJUEhFUl9PUl9IQVNIX1VOQVZBSUxBQkxFKTsKKyAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCB0bHMxX3NldHVwX2tleV9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgU1NMX1JfQ0lQSEVSX09SX0hBU0hfVU5BVkFJTEFCTEUpOwogICByZXR1cm4gMDsKIH0KIAogaW50IHRsczFfY2VydF92ZXJpZnlfbWFjKFNTTCAqcywgaW50IG1kX25pZCwgdWludDhfdCAqb3V0KSB7Ci0gIGNvbnN0IEVWUF9NRF9DVFggKmN0eF90ZW1wbGF0ZTsKLSAgaWYgKG1kX25pZCA9PSBOSURfbWQ1KSB7Ci0gICAgY3R4X3RlbXBsYXRlID0gJnMtPnMzLT5oYW5kc2hha2VfbWQ1OwotICB9IGVsc2UgaWYgKG1kX25pZCA9PSBFVlBfTURfQ1RYX3R5cGUoJnMtPnMzLT5oYW5kc2hha2VfaGFzaCkpIHsKLSAgICBjdHhfdGVtcGxhdGUgPSAmcy0+czMtPmhhbmRzaGFrZV9oYXNoOwotICB9IGVsc2UgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfTk9fUkVRVUlSRURfRElHRVNUKTsKKyAgdW5zaWduZWQgaW50IHJldDsKKyAgRVZQX01EX0NUWCBjdHgsICpkID0gTlVMTDsKKyAgaW50IGk7CisKKyAgaWYgKHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyICYmCisgICAgICAhc3NsM19kaWdlc3RfY2FjaGVkX3JlY29yZHMocywgZnJlZV9oYW5kc2hha2VfYnVmZmVyKSkgewogICAgIHJldHVybiAwOwogICB9CiAKLSAgRVZQX01EX0NUWCBjdHg7CisgIGZvciAoaSA9IDA7IGkgPCBTU0xfTUFYX0RJR0VTVDsgaSsrKSB7CisgICAgaWYgKHMtPnMzLT5oYW5kc2hha2VfZGdzdFtpXSAmJgorICAgICAgICBFVlBfTURfQ1RYX3R5cGUocy0+czMtPmhhbmRzaGFrZV9kZ3N0W2ldKSA9PSBtZF9uaWQpIHsKKyAgICAgIGQgPSBzLT5zMy0+aGFuZHNoYWtlX2Rnc3RbaV07CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoIWQpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHRsczFfY2VydF92ZXJpZnlfbWFjLCBTU0xfUl9OT19SRVFVSVJFRF9ESUdFU1QpOworICAgIHJldHVybiAwOworICB9CisKICAgRVZQX01EX0NUWF9pbml0KCZjdHgpOwotICBpZiAoIUVWUF9NRF9DVFhfY29weV9leCgmY3R4LCBjdHhfdGVtcGxhdGUpKSB7CisgIGlmICghRVZQX01EX0NUWF9jb3B5X2V4KCZjdHgsIGQpKSB7CiAgICAgRVZQX01EX0NUWF9jbGVhbnVwKCZjdHgpOwogICAgIHJldHVybiAwOwogICB9Ci0gIHVuc2lnbmVkIHJldDsKICAgRVZQX0RpZ2VzdEZpbmFsX2V4KCZjdHgsIG91dCwgJnJldCk7CiAgIEVWUF9NRF9DVFhfY2xlYW51cCgmY3R4KTsKLSAgcmV0dXJuIHJldDsKLX0KIAotc3RhdGljIGludCBhcHBlbmRfZGlnZXN0KGNvbnN0IEVWUF9NRF9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBzaXplX3QgKm91dF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1heF9vdXQpIHsKLSAgaW50IHJldCA9IDA7Ci0gIEVWUF9NRF9DVFggY3R4X2NvcHk7Ci0gIEVWUF9NRF9DVFhfaW5pdCgmY3R4X2NvcHkpOwotCi0gIGlmIChFVlBfTURfQ1RYX3NpemUoY3R4KSA+IG1heF9vdXQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0JVRkZFUl9UT09fU01BTEwpOwotICAgIGdvdG8gZXJyOwotICB9Ci0gIHVuc2lnbmVkIGxlbjsKLSAgaWYgKCFFVlBfTURfQ1RYX2NvcHlfZXgoJmN0eF9jb3B5LCBjdHgpIHx8Ci0gICAgICAhRVZQX0RpZ2VzdEZpbmFsX2V4KCZjdHhfY29weSwgb3V0LCAmbGVuKSkgewotICAgIGdvdG8gZXJyOwotICB9Ci0gIGFzc2VydChsZW4gPT0gRVZQX01EX0NUWF9zaXplKGN0eCkpOwotCi0gICpvdXRfbGVuID0gbGVuOwotICByZXQgPSAxOwotCi1lcnI6Ci0gIEVWUF9NRF9DVFhfY2xlYW51cCgmY3R4X2NvcHkpOwogICByZXR1cm4gcmV0OwogfQogCkBAIC01MDQsMTkgKzUwOSw0NCBAQAogICogdW5kZXJseWluZyBkaWdlc3RzIHNvIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYW5kIHByaW9yIHRvIHRoZSBmaW5hbAogICogdXBkYXRlIGV0Yy4gKi8KIGludCB0bHMxX2hhbmRzaGFrZV9kaWdlc3QoU1NMICpzLCB1aW50OF90ICpvdXQsIHNpemVfdCBvdXRfbGVuKSB7Ci0gIHNpemVfdCBtZDVfbGVuID0gMDsKLSAgaWYgKEVWUF9NRF9DVFhfbWQoJnMtPnMzLT5oYW5kc2hha2VfbWQ1KSAhPSBOVUxMICYmCi0gICAgICAhYXBwZW5kX2RpZ2VzdCgmcy0+czMtPmhhbmRzaGFrZV9tZDUsIG91dCwgJm1kNV9sZW4sIG91dF9sZW4pKSB7Ci0gICAgcmV0dXJuIC0xOworICBjb25zdCBFVlBfTUQgKm1kOworICBFVlBfTURfQ1RYIGN0eDsKKyAgaW50IGVyciA9IDAsIGxlbiA9IDA7CisgIHNpemVfdCBpOworICB1aW50MzJfdCBtYXNrOworCisgIEVWUF9NRF9DVFhfaW5pdCgmY3R4KTsKKworICBmb3IgKGkgPSAwOyBzc2xfZ2V0X2hhbmRzaGFrZV9kaWdlc3QoJm1hc2ssICZtZCwgaSk7IGkrKykgeworICAgIHNpemVfdCBoYXNoX3NpemU7CisgICAgdW5zaWduZWQgaW50IGRpZ2VzdF9sZW47CisgICAgRVZQX01EX0NUWCAqaGRnc3QgPSBzLT5zMy0+aGFuZHNoYWtlX2Rnc3RbaV07CisKKyAgICBpZiAoKG1hc2sgJiBzc2xfZ2V0X2FsZ29yaXRobTIocykpID09IDApIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGhhc2hfc2l6ZSA9IEVWUF9NRF9zaXplKG1kKTsKKyAgICBpZiAoIWhkZ3N0IHx8CisgICAgICAgIGhhc2hfc2l6ZSA+IG91dF9sZW4gfHwKKyAgICAgICAgIUVWUF9NRF9DVFhfY29weV9leCgmY3R4LCBoZGdzdCkgfHwKKyAgICAgICAgIUVWUF9EaWdlc3RGaW5hbF9leCgmY3R4LCBvdXQsICZkaWdlc3RfbGVuKSB8fAorICAgICAgICBkaWdlc3RfbGVuICE9IGhhc2hfc2l6ZSAvKiBpbnRlcm5hbCBlcnJvciAqLykgeworICAgICAgZXJyID0gMTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIG91dCArPSBkaWdlc3RfbGVuOworICAgIG91dF9sZW4gLT0gZGlnZXN0X2xlbjsKKyAgICBsZW4gKz0gZGlnZXN0X2xlbjsKICAgfQogCi0gIHNpemVfdCBsZW47Ci0gIGlmICghYXBwZW5kX2RpZ2VzdCgmcy0+czMtPmhhbmRzaGFrZV9oYXNoLCBvdXQgKyBtZDVfbGVuLCAmbGVuLAotICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbiAtIG1kNV9sZW4pKSB7CisgIEVWUF9NRF9DVFhfY2xlYW51cCgmY3R4KTsKKworICBpZiAoZXJyICE9IDApIHsKICAgICByZXR1cm4gLTE7CiAgIH0KLQotICByZXR1cm4gKGludCkobWQ1X2xlbiArIGxlbik7CisgIHJldHVybiBsZW47CiB9CiAKIGludCB0bHMxX2ZpbmFsX2ZpbmlzaF9tYWMoU1NMICpzLCBjb25zdCBjaGFyICpzdHIsIGludCBzbGVuLCB1aW50OF90ICpvdXQpIHsKQEAgLTUyNSw4ICs1NTUsMTQgQEAKICAgaW50IGRpZ2VzdHNfbGVuOwogCiAgIC8qIEF0IHRoaXMgcG9pbnQsIHRoZSBoYW5kc2hha2Ugc2hvdWxkIGhhdmUgcmVsZWFzZWQgdGhlIGhhbmRzaGFrZSBidWZmZXIgb24KLSAgICogaXRzIG93bi4gKi8KKyAgICogaXRzIG93bi4KKyAgICogVE9ETyhkYXZpZGJlbik6IEFwYXJ0IGZyb20gaW5pdGlhbGl6YXRpb24sIHRoZSBoYW5kc2hha2UgYnVmZmVyIHNob3VsZCBiZQorICAgKiBvcnRob2dvbmFsIHRvIHRoZSBoYW5kc2hha2UgZGlnZXN0LiBodHRwczovL2NyYnVnLmNvbS80OTIzNzEgKi8KICAgYXNzZXJ0KHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyID09IE5VTEwpOworICBpZiAocy0+czMtPmhhbmRzaGFrZV9idWZmZXIgJiYKKyAgICAgICFzc2wzX2RpZ2VzdF9jYWNoZWRfcmVjb3JkcyhzLCBmcmVlX2hhbmRzaGFrZV9idWZmZXIpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KIAogICBkaWdlc3RzX2xlbiA9IHRsczFfaGFuZHNoYWtlX2RpZ2VzdChzLCBidWYsIHNpemVvZihidWYpKTsKICAgaWYgKGRpZ2VzdHNfbGVuIDwgMCkgewpAQCAtNTUxLDcgKzU4NywyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcHJlbWFzdGVyX2xlbikgewogICBpZiAocy0+czMtPnRtcC5leHRlbmRlZF9tYXN0ZXJfc2VjcmV0KSB7CiAgICAgdWludDhfdCBkaWdlc3RzWzIgKiBFVlBfTUFYX01EX1NJWkVdOwotICAgIGludCBkaWdlc3RzX2xlbiA9IHRsczFfaGFuZHNoYWtlX2RpZ2VzdChzLCBkaWdlc3RzLCBzaXplb2YoZGlnZXN0cykpOworICAgIGludCBkaWdlc3RzX2xlbjsKKworICAgIC8qIFRoZSBtYXN0ZXIgc2VjcmV0IGlzIGJhc2VkIG9uIHRoZSBoYW5kc2hha2UgaGFzaCBqdXN0IGFmdGVyIHNlbmRpbmcgdGhlCisgICAgICogQ2xpZW50S2V5RXhjaGFuZ2UuIEhvd2V2ZXIsIHdlIG1pZ2h0IGhhdmUgYSBjbGllbnQgY2VydGlmaWNhdGUgdG8gc2VuZCwKKyAgICAgKiBpbiB3aGljaCBjYXNlIHdlIG1pZ2h0IG5lZWQgZGlmZmVyZW50IGhhc2hlcyBmb3IgdGhlIHZlcmlmaWNhdGlvbiBhbmQKKyAgICAgKiB0aHVzIHN0aWxsIG5lZWQgdGhlIGhhbmRzaGFrZSBidWZmZXIgYXJvdW5kLiBLZWVwaW5nIGJvdGggYSBoYW5kc2hha2UKKyAgICAgKiBidWZmZXIgKmFuZCogcnVubmluZyBoYXNoZXMgaXNuJ3QgeWV0IHN1cHBvcnRlZCBzbywgd2hlbiBpdCBjb21lcyB0bworICAgICAqIGNhbGN1bGF0aW5nIHRoZSBGaW5pc2hlZCBoYXNoLCB3ZSdsbCBoYXZlIHRvIGhhc2ggdGhlIGhhbmRzaGFrZSBidWZmZXIKKyAgICAgKiBhZ2Fpbi4gKi8KKyAgICBpZiAocy0+czMtPmhhbmRzaGFrZV9idWZmZXIgJiYKKyAgICAgICAgIXNzbDNfZGlnZXN0X2NhY2hlZF9yZWNvcmRzKHMsIGRvbnRfZnJlZV9oYW5kc2hha2VfYnVmZmVyKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZGlnZXN0c19sZW4gPSB0bHMxX2hhbmRzaGFrZV9kaWdlc3QocywgZGlnZXN0cywgc2l6ZW9mKGRpZ2VzdHMpKTsKICAgICBpZiAoZGlnZXN0c19sZW4gPT0gLTEpIHsKICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTU4MCwyMSArNjMwLDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnRleHQsIHNpemVfdCBjb250ZXh0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZV9jb250ZXh0KSB7CiAgIGlmICghcy0+czMtPmhhdmVfdmVyc2lvbiB8fCBzLT52ZXJzaW9uID09IFNTTDNfVkVSU0lPTikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHRsczFfZXhwb3J0X2tleWluZ19tYXRlcmlhbCwKKyAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgc2l6ZV90IHNlZWRfbGVuID0gMiAqIFNTTDNfUkFORE9NX1NJWkU7CiAgIGlmICh1c2VfY29udGV4dCkgewogICAgIGlmIChjb250ZXh0X2xlbiA+PSAxdSA8PCAxNikgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9PVkVSRkxPVyk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHRsczFfZXhwb3J0X2tleWluZ19tYXRlcmlhbCwgRVJSX1JfT1ZFUkZMT1cpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIHNlZWRfbGVuICs9IDIgKyBjb250ZXh0X2xlbjsKICAgfQogICB1aW50OF90ICpzZWVkID0gT1BFTlNTTF9tYWxsb2Moc2VlZF9sZW4pOwogICBpZiAoc2VlZCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCB0bHMxX2V4cG9ydF9rZXlpbmdfbWF0ZXJpYWwsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gMDsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvc3NsL3QxX2xpYi5jIGIvc3JjL3NzbC90MV9saWIuYwppbmRleCBmMzBlOGViLi45ZTVjMDExIDEwMDY0NAotLS0gYS9zcmMvc3NsL3QxX2xpYi5jCisrKyBiL3NyYy9zc2wvdDFfbGliLmMKQEAgLTEwNiwxNiArMTA2LDEyIEBACiAgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCiAgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KIAotI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+Ci0KICNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSA8b3BlbnNzbC9ieXRlc3RyaW5nLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9kaWdlc3QuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9obWFjLmg+CkBAIC0xMjYsNiArMTIyLDkgQEAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiAKK3N0YXRpYyBpbnQgdGxzX2RlY3J5cHRfdGlja2V0KFNTTCAqcywgY29uc3QgdWludDhfdCAqdGljaywgaW50IHRpY2tsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzZXNzX2lkLCBpbnQgc2Vzc2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9TRVNTSU9OICoqcHNlc3MpOwogc3RhdGljIGludCBzc2xfY2hlY2tfY2xpZW50aGVsbG9fdGxzZXh0KFNTTCAqcyk7CiBzdGF0aWMgaW50IHNzbF9jaGVja19zZXJ2ZXJoZWxsb190bHNleHQoU1NMICpzKTsKIApAQCAtMjE0LDcgKzIxMyw4IEBACiAgIGV4dGVuc2lvbl90eXBlcyA9CiAgICAgICAodWludDE2X3QgKilPUEVOU1NMX21hbGxvYyhzaXplb2YodWludDE2X3QpICogbnVtX2V4dGVuc2lvbnMpOwogICBpZiAoZXh0ZW5zaW9uX3R5cGVzID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHRsczFfY2hlY2tfZHVwbGljYXRlX2V4dGVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZG9uZTsKICAgfQogCkBAIC0zMzgsMjEgKzMzOCwyNCBAQAogc3RydWN0IHRsc19jdXJ2ZSB7CiAgIHVpbnQxNl90IGN1cnZlX2lkOwogICBpbnQgbmlkOwotICBjb25zdCBjaGFyIGN1cnZlX25hbWVbOF07CiB9OwogCiAvKiBFQ0MgY3VydmVzIGZyb20gUkZDNDQ5Mi4gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdGxzX2N1cnZlIHRsc19jdXJ2ZXNbXSA9IHsKLSAgICB7MjEsIE5JRF9zZWNwMjI0cjEsICJQLTIyNCJ9LAotICAgIHsyMywgTklEX1g5XzYyX3ByaW1lMjU2djEsICJQLTI1NiJ9LAotICAgIHsyNCwgTklEX3NlY3AzODRyMSwgIlAtMzg0In0sCi0gICAgezI1LCBOSURfc2VjcDUyMXIxLCAiUC01MjEifSwKKyAgICB7MjEsIE5JRF9zZWNwMjI0cjF9LAorICAgIHsyMywgTklEX1g5XzYyX3ByaW1lMjU2djF9LAorICAgIHsyNCwgTklEX3NlY3AzODRyMX0sCisgICAgezI1LCBOSURfc2VjcDUyMXIxfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGVjZm9ybWF0c19kZWZhdWx0W10gPSB7CisgICAgVExTRVhUX0VDUE9JTlRGT1JNQVRfdW5jb21wcmVzc2VkLAogfTsKIAogc3RhdGljIGNvbnN0IHVpbnQxNl90IGVjY3VydmVzX2RlZmF1bHRbXSA9IHsKICAgICAyMywgLyogWDlfNjJfcHJpbWUyNTZ2MSAqLwogICAgIDI0LCAvKiBzZWNwMzg0cjEgKi8KLSNpZiBkZWZpbmVkKEJPUklOR1NTTF9BTkRST0lEX1NZU1RFTSkKKyNpZiBkZWZpbmVkKEFORFJPSUQpCiAgICAgMjUsIC8qIHNlY3A1MjFyMSAqLwogI2VuZGlmCiB9OwpAQCAtMzc4LDE2ICszODEsNiBAQAogICByZXR1cm4gMDsKIH0KIAotY29uc3QgY2hhciogdGxzMV9lY19jdXJ2ZV9pZDJuYW1lKHVpbnQxNl90IGN1cnZlX2lkKSB7Ci0gIHNpemVfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHRsc19jdXJ2ZXMpIC8gc2l6ZW9mKHRsc19jdXJ2ZXNbMF0pOyBpKyspIHsKLSAgICBpZiAoY3VydmVfaWQgPT0gdGxzX2N1cnZlc1tpXS5jdXJ2ZV9pZCkgewotICAgICAgcmV0dXJuIHRsc19jdXJ2ZXNbaV0uY3VydmVfbmFtZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KIC8qIHRsczFfZ2V0X2N1cnZlbGlzdCBzZXRzIHwqb3V0X2N1cnZlX2lkc3wgYW5kIHwqb3V0X2N1cnZlX2lkc19sZW58IHRvIHRoZQogICogbGlzdCBvZiBhbGxvd2VkIGN1cnZlIElEcy4gSWYgfGdldF9wZWVyX2N1cnZlc3wgaXMgbm9uLXplcm8sIHJldHVybiB0aGUKICAqIHBlZXIncyBjdXJ2ZSBsaXN0LiBPdGhlcndpc2UsIHJldHVybiB0aGUgcHJlZmVycmVkIGxpc3QuICovCkBAIC01NDIsNiArNTM1LDI4IEBACiAgIHJldHVybiAxOwogfQogCisvKiB0bHMxX2NoZWNrX3BvaW50X2Zvcm1hdCByZXR1cm5zIG9uZSBpZiB8Y29tcF9pZHwgaXMgY29uc2lzdGVudCB3aXRoIHRoZQorICogcGVlcidzIHBvaW50IGZvcm1hdCBwcmVmZXJlbmNlcy4gKi8KK3N0YXRpYyBpbnQgdGxzMV9jaGVja19wb2ludF9mb3JtYXQoU1NMICpzLCB1aW50OF90IGNvbXBfaWQpIHsKKyAgdWludDhfdCAqcCA9IHMtPnMzLT50bXAucGVlcl9lY3BvaW50Zm9ybWF0bGlzdDsKKyAgc2l6ZV90IHBsZW4gPSBzLT5zMy0+dG1wLnBlZXJfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoOworICBzaXplX3QgaTsKKworICAvKiBJZiBwb2ludCBmb3JtYXRzIGV4dGVuc2lvbiBwcmVzZW50IGNoZWNrIGl0LCBvdGhlcndpc2UgZXZlcnl0aGluZyBpcworICAgKiBzdXBwb3J0ZWQgKHNlZSBSRkM0NDkyKS4gKi8KKyAgaWYgKHAgPT0gTlVMTCkgeworICAgIHJldHVybiAxOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHBsZW47IGkrKykgeworICAgIGlmIChjb21wX2lkID09IHBbaV0pIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCiAvKiB0bHMxX2NoZWNrX2N1cnZlX2lkIHJldHVybnMgb25lIGlmIHxjdXJ2ZV9pZHwgaXMgY29uc2lzdGVudCB3aXRoIGJvdGggb3VyCiAgKiBhbmQgdGhlIHBlZXIncyBjdXJ2ZSBwcmVmZXJlbmNlcy4gTm90ZTogaWYgY2FsbGVkIGFzIHRoZSBjbGllbnQsIG9ubHkgb3VyCiAgKiBwcmVmZXJlbmNlcyBhcmUgY2hlY2tlZDsgdGhlIHBlZXIgKHRoZSBzZXJ2ZXIpIGRvZXMgbm90IHNlbmQgcHJlZmVyZW5jZXMuICovCkBAIC01NzgsNiArNTkzLDE4IEBACiAgIHJldHVybiAxOwogfQogCitzdGF0aWMgdm9pZCB0bHMxX2dldF9mb3JtYXRsaXN0KFNTTCAqcywgY29uc3QgdWludDhfdCAqKnBmb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBmb3JtYXRzbGVuKSB7CisgIC8qIElmIHdlIGhhdmUgYSBjdXN0b20gcG9pbnQgZm9ybWF0IGxpc3QgdXNlIGl0IG90aGVyd2lzZSB1c2UgZGVmYXVsdCAqLworICBpZiAocy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0KSB7CisgICAgKnBmb3JtYXRzID0gcy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0OworICAgICpwZm9ybWF0c2xlbiA9IHMtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGg7CisgIH0gZWxzZSB7CisgICAgKnBmb3JtYXRzID0gZWNmb3JtYXRzX2RlZmF1bHQ7CisgICAgKnBmb3JtYXRzbGVuID0gc2l6ZW9mKGVjZm9ybWF0c19kZWZhdWx0KTsKKyAgfQorfQorCiBpbnQgdGxzMV9jaGVja19lY19jZXJ0KFNTTCAqcywgWDUwOSAqeCkgewogICBpbnQgcmV0ID0gMDsKICAgRVZQX1BLRVkgKnBrZXkgPSBYNTA5X2dldF9wdWJrZXkoeCk7CkBAIC01ODgsNyArNjE1LDcgQEAKICAgICAgIHBrZXktPnR5cGUgIT0gRVZQX1BLRVlfRUMgfHwKICAgICAgICF0bHMxX2N1cnZlX3BhcmFtc19mcm9tX2VjX2tleSgmY3VydmVfaWQsICZjb21wX2lkLCBwa2V5LT5wa2V5LmVjKSB8fAogICAgICAgIXRsczFfY2hlY2tfY3VydmVfaWQocywgY3VydmVfaWQpIHx8Ci0gICAgICBjb21wX2lkICE9IFRMU0VYVF9FQ1BPSU5URk9STUFUX3VuY29tcHJlc3NlZCkgeworICAgICAgIXRsczFfY2hlY2tfcG9pbnRfZm9ybWF0KHMsIGNvbXBfaWQpKSB7CiAgICAgZ290byBkb25lOwogICB9CiAKQEAgLTYzNiw4ICs2NjMsMTcgQEAKIH07CiAKIHNpemVfdCB0bHMxMl9nZXRfcHNpZ2FsZ3MoU1NMICpzLCBjb25zdCB1aW50OF90ICoqcHNpZ3MpIHsKLSAgKnBzaWdzID0gdGxzMTJfc2lnYWxnczsKLSAgcmV0dXJuIHNpemVvZih0bHMxMl9zaWdhbGdzKTsKKyAgLyogSWYgc2VydmVyIHVzZSBjbGllbnQgYXV0aGVudGljYXRpb24gc2lnYWxncyBpZiBub3QgTlVMTCAqLworICBpZiAocy0+c2VydmVyICYmIHMtPmNlcnQtPmNsaWVudF9zaWdhbGdzKSB7CisgICAgKnBzaWdzID0gcy0+Y2VydC0+Y2xpZW50X3NpZ2FsZ3M7CisgICAgcmV0dXJuIHMtPmNlcnQtPmNsaWVudF9zaWdhbGdzbGVuOworICB9IGVsc2UgaWYgKHMtPmNlcnQtPmNvbmZfc2lnYWxncykgeworICAgICpwc2lncyA9IHMtPmNlcnQtPmNvbmZfc2lnYWxnczsKKyAgICByZXR1cm4gcy0+Y2VydC0+Y29uZl9zaWdhbGdzbGVuOworICB9IGVsc2UgeworICAgICpwc2lncyA9IHRsczEyX3NpZ2FsZ3M7CisgICAgcmV0dXJuIHNpemVvZih0bHMxMl9zaWdhbGdzKTsKKyAgfQogfQogCiAvKiB0bHMxMl9jaGVja19wZWVyX3NpZ2FsZyBwYXJzZXMgYSBTaWduYXR1cmVBbmRIYXNoQWxnb3JpdGhtIG91dCBvZiB8Y2JzfC4gSXQKQEAgLTY0OCwyNiArNjg0LDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JTICpjYnMsIEVWUF9QS0VZICpwa2V5KSB7CiAgIGNvbnN0IHVpbnQ4X3QgKnNlbnRfc2lnczsKICAgc2l6ZV90IHNlbnRfc2lnc2xlbiwgaTsKLSAgaW50IHNpZ2FsZyA9IHRsczEyX2dldF9zaWdpZChwa2V5LT50eXBlKTsKKyAgaW50IHNpZ2FsZyA9IHRsczEyX2dldF9zaWdpZChwa2V5KTsKICAgdWludDhfdCBoYXNoLCBzaWduYXR1cmU7CiAKICAgLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLwogICBpZiAoc2lnYWxnID09IC0xKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCB0bHMxMl9jaGVja19wZWVyX3NpZ2FsZywgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICpvdXRfYWxlcnQgPSBTU0xfQURfSU5URVJOQUxfRVJST1I7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoIUNCU19nZXRfdTgoY2JzLCAmaGFzaCkgfHwKICAgICAgICFDQlNfZ2V0X3U4KGNicywgJnNpZ25hdHVyZSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0RFQ09ERV9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCB0bHMxMl9jaGVja19wZWVyX3NpZ2FsZywgU1NMX1JfREVDT0RFX0VSUk9SKTsKICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIC8qIENoZWNrIGtleSB0eXBlIGlzIGNvbnNpc3RlbnQgd2l0aCBzaWduYXR1cmUgKi8KICAgaWYgKHNpZ2FsZyAhPSBzaWduYXR1cmUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1dST05HX1NJR05BVFVSRV9UWVBFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHRsczEyX2NoZWNrX3BlZXJfc2lnYWxnLCBTU0xfUl9XUk9OR19TSUdOQVRVUkVfVFlQRSk7CiAgICAgKm91dF9hbGVydCA9IFNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKICAgICByZXR1cm4gMDsKICAgfQpAQCAtNjgyLDggKzcxOCw4IEBACiAgICAgfQogCiAgICAgaWYgKHMtPnNlcnZlciAmJiAoIXRsczFfY2hlY2tfY3VydmVfaWQocywgY3VydmVfaWQpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgY29tcF9pZCAhPSBUTFNFWFRfRUNQT0lOVEZPUk1BVF91bmNvbXByZXNzZWQpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1dST05HX0NVUlZFKTsKKyAgICAgICAgICAgICAgICAgICAgICAhdGxzMV9jaGVja19wb2ludF9mb3JtYXQocywgY29tcF9pZCkpKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHRsczEyX2NoZWNrX3BlZXJfc2lnYWxnLCBTU0xfUl9XUk9OR19DVVJWRSk7CiAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtNjk5LDE0ICs3MzUsMTQgQEAKIAogICAvKiBBbGxvdyBmYWxsYmFjayB0byBTSEEtMS4gKi8KICAgaWYgKGkgPT0gc2VudF9zaWdzbGVuICYmIGhhc2ggIT0gVExTRVhUX2hhc2hfc2hhMSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfV1JPTkdfU0lHTkFUVVJFX1RZUEUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgdGxzMTJfY2hlY2tfcGVlcl9zaWdhbGcsIFNTTF9SX1dST05HX1NJR05BVFVSRV9UWVBFKTsKICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOwogICAgIHJldHVybiAwOwogICB9CiAKICAgKm91dF9tZCA9IHRsczEyX2dldF9oYXNoKGhhc2gpOwogICBpZiAoKm91dF9tZCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9VTktOT1dOX0RJR0VTVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCB0bHMxMl9jaGVja19wZWVyX3NpZ2FsZywgU1NMX1JfVU5LTk9XTl9ESUdFU1QpOwogICAgICpvdXRfYWxlcnQgPSBTU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CiAgICAgcmV0dXJuIDA7CiAgIH0KQEAgLTc2MywxNTI0ICs3OTksMzA0IEBACiAgIH0KIH0KIAotLyogdGxzX2V4dGVuc2lvbiByZXByZXNlbnRzIGEgVExTIGV4dGVuc2lvbiB0aGF0IGlzIGhhbmRsZWQgaW50ZXJuYWxseS4gVGhlCi0gKiB8aW5pdHwgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIGhhbmRzaGFrZSwgYmVmb3JlIGFueSBvdGhlciBmdW5jdGlvbnMgb2YKLSAqIHRoZSBleHRlbnNpb24uIFRoZW4gdGhlIGFkZCBhbmQgcGFyc2UgY2FsbGJhY2tzIGFyZSBjYWxsZWQgYXMgbmVlZGVkLgotICoKLSAqIFRoZSBwYXJzZSBjYWxsYmFja3MgcmVjZWl2ZSBhIHxDQlN8IHRoYXQgY29udGFpbnMgdGhlIGNvbnRlbnRzIG9mIHRoZQotICogZXh0ZW5zaW9uIChpLmUuIG5vdCBpbmNsdWRpbmcgdGhlIHR5cGUgYW5kIGxlbmd0aCBieXRlcykuIElmIGFuIGV4dGVuc2lvbiBpcwotICogbm90IHJlY2VpdmVkIHRoZW4gdGhlIHBhcnNlIGNhbGxiYWNrcyB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgTlVMTCBDQlMgc28gdGhhdAotICogdGhleSBjYW4gZG8gYW55IHByb2Nlc3NpbmcgbmVlZGVkIHRvIGhhbmRsZSB0aGUgYWJzZW5jZSBvZiBhbiBleHRlbnNpb24uCi0gKgotICogVGhlIGFkZCBjYWxsYmFja3MgcmVjZWl2ZSBhIHxDQkJ8IHRvIHdoaWNoIHRoZSBleHRlbnNpb24gY2FuIGJlIGFwcGVuZGVkIGJ1dAotICogdGhlIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhcHBlbmRpbmcgdGhlIHR5cGUgYW5kIGxlbmd0aCBieXRlcyB0b28uCi0gKgotICogQWxsIGNhbGxiYWNrcyByZXR1cm4gb25lIGZvciBzdWNjZXNzIGFuZCB6ZXJvIGZvciBlcnJvci4gSWYgYSBwYXJzZSBmdW5jdGlvbgotICogcmV0dXJucyB6ZXJvIHRoZW4gYSBmYXRhbCBhbGVydCB3aXRoIHZhbHVlIHwqb3V0X2FsZXJ0fCB3aWxsIGJlIHNlbnQuIElmCi0gKiB8Km91dF9hbGVydHwgaXNuJ3Qgc2V0LCB0aGVuIGEgfGRlY29kZV9lcnJvcnwgYWxlcnQgd2lsbCBiZSBzZW50LiAqLwotc3RydWN0IHRsc19leHRlbnNpb24gewotICB1aW50MTZfdCB2YWx1ZTsKLSAgdm9pZCAoKmluaXQpKFNTTCAqc3NsKTsKLQotICBpbnQgKCphZGRfY2xpZW50aGVsbG8pKFNTTCAqc3NsLCBDQkIgKm91dCk7Ci0gIGludCAoKnBhcnNlX3NlcnZlcmhlbGxvKShTU0wgKnNzbCwgdWludDhfdCAqb3V0X2FsZXJ0LCBDQlMgKmNvbnRlbnRzKTsKLQotICBpbnQgKCpwYXJzZV9jbGllbnRoZWxsbykoU1NMICpzc2wsIHVpbnQ4X3QgKm91dF9hbGVydCwgQ0JTICpjb250ZW50cyk7Ci0gIGludCAoKmFkZF9zZXJ2ZXJoZWxsbykoU1NMICpzc2wsIENCQiAqb3V0KTsKLX07Ci0KLQotLyogU2VydmVyIG5hbWUgaW5kaWNhdGlvbiAoU05JKS4KLSAqCi0gKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjA2NiNzZWN0aW9uLTMuICovCi0KLXN0YXRpYyB2b2lkIGV4dF9zbmlfaW5pdChTU0wgKnNzbCkgewotICBzc2wtPnMzLT50bXAuc2hvdWxkX2Fja19zbmkgPSAwOwotfQotCi1zdGF0aWMgaW50IGV4dF9zbmlfYWRkX2NsaWVudGhlbGxvKFNTTCAqc3NsLCBDQkIgKm91dCkgewotICBpZiAoc3NsLT50bHNleHRfaG9zdG5hbWUgPT0gTlVMTCkgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgQ0JCIGNvbnRlbnRzLCBzZXJ2ZXJfbmFtZV9saXN0LCBuYW1lOwotICBpZiAoIUNCQl9hZGRfdTE2KG91dCwgVExTRVhUX1RZUEVfc2VydmVyX25hbWUpIHx8Ci0gICAgICAhQ0JCX2FkZF91MTZfbGVuZ3RoX3ByZWZpeGVkKG91dCwgJmNvbnRlbnRzKSB8fAotICAgICAgIUNCQl9hZGRfdTE2X2xlbmd0aF9wcmVmaXhlZCgmY29udGVudHMsICZzZXJ2ZXJfbmFtZV9saXN0KSB8fAotICAgICAgIUNCQl9hZGRfdTgoJnNlcnZlcl9uYW1lX2xpc3QsIFRMU0VYVF9OQU1FVFlQRV9ob3N0X25hbWUpIHx8Ci0gICAgICAhQ0JCX2FkZF91MTZfbGVuZ3RoX3ByZWZpeGVkKCZzZXJ2ZXJfbmFtZV9saXN0LCAmbmFtZSkgfHwKLSAgICAgICFDQkJfYWRkX2J5dGVzKCZuYW1lLCAoY29uc3QgdWludDhfdCAqKXNzbC0+dGxzZXh0X2hvc3RuYW1lLAotICAgICAgICAgICAgICAgICAgICAgc3RybGVuKHNzbC0+dGxzZXh0X2hvc3RuYW1lKSkgfHwKLSAgICAgICFDQkJfZmx1c2gob3V0KSkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X3NuaV9wYXJzZV9zZXJ2ZXJoZWxsbyhTU0wgKnNzbCwgdWludDhfdCAqb3V0X2FsZXJ0LCBDQlMgKmNvbnRlbnRzKSB7Ci0gIGlmIChjb250ZW50cyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBpZiAoQ0JTX2xlbihjb250ZW50cykgIT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgYXNzZXJ0KHNzbC0+dGxzZXh0X2hvc3RuYW1lICE9IE5VTEwpOwotCi0gIGlmICghc3NsLT5oaXQpIHsKLSAgICBhc3NlcnQoc3NsLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUgPT0gTlVMTCk7Ci0gICAgc3NsLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUgPSBCVUZfc3RyZHVwKHNzbC0+dGxzZXh0X2hvc3RuYW1lKTsKLSAgICBpZiAoIXNzbC0+c2Vzc2lvbi0+dGxzZXh0X2hvc3RuYW1lKSB7Ci0gICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X3NuaV9wYXJzZV9jbGllbnRoZWxsbyhTU0wgKnNzbCwgdWludDhfdCAqb3V0X2FsZXJ0LCBDQlMgKmNvbnRlbnRzKSB7Ci0gIGlmIChjb250ZW50cyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICAvKiBUaGUgc2VydmVybmFtZSBleHRlbnNpb24gaXMgdHJlYXRlZCBhcyBmb2xsb3dzOgotICAgKgotICAgKiAtIE9ubHkgdGhlIGhvc3RuYW1lIHR5cGUgaXMgc3VwcG9ydGVkIHdpdGggYSBtYXhpbXVtIGxlbmd0aCBvZiAyNTUuCi0gICAqIC0gVGhlIHNlcnZlcm5hbWUgaXMgcmVqZWN0ZWQgaWYgdG9vIGxvbmcgb3IgaWYgaXQgY29udGFpbnMgemVyb3MsIGluCi0gICAqICAgd2hpY2ggY2FzZSBhbiBmYXRhbCBhbGVydCBpcyBnZW5lcmF0ZWQuCi0gICAqIC0gVGhlIHNlcnZlcm5hbWUgZmllbGQgaXMgbWFpbnRhaW5lZCB0b2dldGhlciB3aXRoIHRoZSBzZXNzaW9uIGNhY2hlLgotICAgKiAtIFdoZW4gYSBzZXNzaW9uIGlzIHJlc3VtZWQsIHRoZSBzZXJ2ZXJuYW1lIGNhbGxiYWNrIGlzIGludm9rZWQgaW4gb3JkZXIKLSAgICogICB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gcG9zaXRpb24gaXRzZWxmIHRvIHRoZSByaWdodCBjb250ZXh0LgotICAgKiAtIFRoZSBzZXJ2ZXJuYW1lIGlzIGFja25vd2xlZGdlZCBpZiBpdCBpcyBuZXcgZm9yIGEgc2Vzc2lvbiBvciB3aGVuCi0gICAqICAgaXQgaXMgaWRlbnRpY2FsIHRvIGEgcHJldmlvdXNseSB1c2VkIGZvciB0aGUgc2FtZSBzZXNzaW9uLgotICAgKiAgIEFwcGxpY2F0aW9ucyBjYW4gY29udHJvbCB0aGUgYmVoYXZpb3VyLiAgVGhleSBjYW4gYXQgYW55IHRpbWUKLSAgICogICBzZXQgYSAnZGVzaXJhYmxlJyBzZXJ2ZXJuYW1lIGZvciBhIG5ldyBTU0wgb2JqZWN0LiBUaGlzIGNhbiBiZSB0aGUKLSAgICogICBjYXNlIGZvciBleGFtcGxlIHdpdGggSFRUUFMgd2hlbiBhIEhvc3Q6IGhlYWRlciBmaWVsZCBpcyByZWNlaXZlZCBhbmQKLSAgICogICBhIHJlbmVnb3RpYXRpb24gaXMgcmVxdWVzdGVkLiBJbiB0aGlzIGNhc2UsIGEgcG9zc2libGUgc2VydmVybmFtZQotICAgKiAgIHByZXNlbnRlZCBpbiB0aGUgbmV3IGNsaWVudCBoZWxsbyBpcyBvbmx5IGFja25vd2xlZGdlZCBpZiBpdCBtYXRjaGVzCi0gICAqICAgdGhlIHZhbHVlIG9mIHRoZSBIb3N0OiBmaWVsZC4KLSAgICogLSBBcHBsaWNhdGlvbnMgbXVzdCAgdXNlIFNTTF9PUF9OT19TRVNTSU9OX1JFU1VNUFRJT05fT05fUkVORUdPVElBVElPTgotICAgKiAgIGlmIHRoZXkgcHJvdmlkZSBmb3IgY2hhbmdpbmcgYW4gZXhwbGljaXQgc2VydmVybmFtZSBjb250ZXh0IGZvciB0aGUKLSAgICogICBzZXNzaW9uLAotICAgKiAgIGkuZS4gd2hlbiB0aGUgc2Vzc2lvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZCB3aXRoIGEgc2VydmVybmFtZSBleHRlbnNpb24uCi0gICAqLwotCi0gIENCUyBzZXJ2ZXJfbmFtZV9saXN0OwotICBjaGFyIGhhdmVfc2Vlbl9ob3N0X25hbWUgPSAwOwotCi0gIGlmICghQ0JTX2dldF91MTZfbGVuZ3RoX3ByZWZpeGVkKGNvbnRlbnRzLCAmc2VydmVyX25hbWVfbGlzdCkgfHwKLSAgICAgIENCU19sZW4oJnNlcnZlcl9uYW1lX2xpc3QpID09IDAgfHwKLSAgICAgIENCU19sZW4oY29udGVudHMpICE9IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIERlY29kZSBlYWNoIFNlcnZlck5hbWUgaW4gdGhlIGV4dGVuc2lvbi4gKi8KLSAgd2hpbGUgKENCU19sZW4oJnNlcnZlcl9uYW1lX2xpc3QpID4gMCkgewotICAgIHVpbnQ4X3QgbmFtZV90eXBlOwotICAgIENCUyBob3N0X25hbWU7Ci0KLSAgICBpZiAoIUNCU19nZXRfdTgoJnNlcnZlcl9uYW1lX2xpc3QsICZuYW1lX3R5cGUpIHx8Ci0gICAgICAgICFDQlNfZ2V0X3UxNl9sZW5ndGhfcHJlZml4ZWQoJnNlcnZlcl9uYW1lX2xpc3QsICZob3N0X25hbWUpKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBPbmx5IGhvc3RfbmFtZSBpcyBzdXBwb3J0ZWQuICovCi0gICAgaWYgKG5hbWVfdHlwZSAhPSBUTFNFWFRfTkFNRVRZUEVfaG9zdF9uYW1lKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBpZiAoaGF2ZV9zZWVuX2hvc3RfbmFtZSkgewotICAgICAgLyogVGhlIFNlcnZlck5hbWVMaXN0IE1VU1QgTk9UIGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBuYW1lIG9mIHRoZSBzYW1lCi0gICAgICAgKiBuYW1lX3R5cGUuICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBoYXZlX3NlZW5faG9zdF9uYW1lID0gMTsKLQotICAgIGlmIChDQlNfbGVuKCZob3N0X25hbWUpID09IDAgfHwKLSAgICAgICAgQ0JTX2xlbigmaG9zdF9uYW1lKSA+IFRMU0VYVF9NQVhMRU5faG9zdF9uYW1lIHx8Ci0gICAgICAgIENCU19jb250YWluc196ZXJvX2J5dGUoJmhvc3RfbmFtZSkpIHsKLSAgICAgICpvdXRfYWxlcnQgPSBTU0xfQURfVU5SRUNPR05JWkVEX05BTUU7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoIXNzbC0+aGl0KSB7Ci0gICAgICBhc3NlcnQoc3NsLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUgPT0gTlVMTCk7Ci0gICAgICBpZiAoc3NsLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUpIHsKLSAgICAgICAgLyogVGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZS4gKi8KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIC8qIENvcHkgdGhlIGhvc3RuYW1lIGFzIGEgc3RyaW5nLiAqLwotICAgICAgaWYgKCFDQlNfc3RyZHVwKCZob3N0X25hbWUsICZzc2wtPnNlc3Npb24tPnRsc2V4dF9ob3N0bmFtZSkpIHsKLSAgICAgICAgKm91dF9hbGVydCA9IFNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIHNzbC0+czMtPnRtcC5zaG91bGRfYWNrX3NuaSA9IDE7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X3NuaV9hZGRfc2VydmVyaGVsbG8oU1NMICpzc2wsIENCQiAqb3V0KSB7Ci0gIGlmIChzc2wtPmhpdCB8fAotICAgICAgIXNzbC0+czMtPnRtcC5zaG91bGRfYWNrX3NuaSB8fAotICAgICAgc3NsLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUgPT0gTlVMTCkgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgaWYgKCFDQkJfYWRkX3UxNihvdXQsIFRMU0VYVF9UWVBFX3NlcnZlcl9uYW1lKSB8fAotICAgICAgIUNCQl9hZGRfdTE2KG91dCwgMCAvKiBsZW5ndGggKi8pKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotCi0vKiBSZW5lZ290aWF0aW9uIGluZGljYXRpb24uCi0gKgotICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU3NDYgKi8KLQotc3RhdGljIGludCBleHRfcmlfYWRkX2NsaWVudGhlbGxvKFNTTCAqc3NsLCBDQkIgKm91dCkgewotICBDQkIgY29udGVudHMsIHByZXZfZmluaXNoZWQ7Ci0gIGlmICghQ0JCX2FkZF91MTYob3V0LCBUTFNFWFRfVFlQRV9yZW5lZ290aWF0ZSkgfHwKLSAgICAgICFDQkJfYWRkX3UxNl9sZW5ndGhfcHJlZml4ZWQob3V0LCAmY29udGVudHMpIHx8Ci0gICAgICAhQ0JCX2FkZF91OF9sZW5ndGhfcHJlZml4ZWQoJmNvbnRlbnRzLCAmcHJldl9maW5pc2hlZCkgfHwKLSAgICAgICFDQkJfYWRkX2J5dGVzKCZwcmV2X2ZpbmlzaGVkLCBzc2wtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWQsCi0gICAgICAgICAgICAgICAgICAgICBzc2wtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWRfbGVuKSB8fAotICAgICAgIUNCQl9mbHVzaChvdXQpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBleHRfcmlfcGFyc2Vfc2VydmVyaGVsbG8oU1NMICpzc2wsIHVpbnQ4X3QgKm91dF9hbGVydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCUyAqY29udGVudHMpIHsKLSAgaWYgKGNvbnRlbnRzID09IE5VTEwpIHsKLSAgICAvKiBObyByZW5lZ290aWF0aW9uIGV4dGVuc2lvbiByZWNlaXZlZC4KLSAgICAgKgotICAgICAqIFN0cmljdGx5IHNwZWFraW5nIGlmIHdlIHdhbnQgdG8gYXZvaWQgYW4gYXR0YWNrIHdlIHNob3VsZCAqYWx3YXlzKiBzZWUKLSAgICAgKiBSSSBldmVuIG9uIGluaXRpYWwgU2VydmVySGVsbG8gYmVjYXVzZSB0aGUgY2xpZW50IGRvZXNuJ3Qgc2VlIGFueQotICAgICAqIHJlbmVnb3RpYXRpb24gZHVyaW5nIGFuIGF0dGFjay4gSG93ZXZlciB0aGlzIHdvdWxkIG1lYW4gd2UgY291bGQgbm90Ci0gICAgICogY29ubmVjdCB0byBhbnkgc2VydmVyIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBSSS4KLSAgICAgKgotICAgICAqIEEgbGFjayBvZiB0aGUgZXh0ZW5zaW9uIGlzIGFsbG93ZWQgaWYgU1NMX09QX0xFR0FDWV9TRVJWRVJfQ09OTkVDVCBpcwotICAgICAqIGRlZmluZWQuICovCi0gICAgaWYgKHNzbC0+b3B0aW9ucyAmIFNTTF9PUF9MRUdBQ1lfU0VSVkVSX0NPTk5FQ1QpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgICpvdXRfYWxlcnQgPSBTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9VTlNBRkVfTEVHQUNZX1JFTkVHT1RJQVRJT05fRElTQUJMRUQpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgY29uc3Qgc2l6ZV90IGV4cGVjdGVkX2xlbiA9IHNzbC0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZF9sZW4gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5zMy0+cHJldmlvdXNfc2VydmVyX2ZpbmlzaGVkX2xlbjsKLQotICAvKiBDaGVjayBmb3IgbG9naWMgZXJyb3JzICovCi0gIGFzc2VydCghZXhwZWN0ZWRfbGVuIHx8IHNzbC0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZF9sZW4pOwotICBhc3NlcnQoIWV4cGVjdGVkX2xlbiB8fCBzc2wtPnMzLT5wcmV2aW91c19zZXJ2ZXJfZmluaXNoZWRfbGVuKTsKLQotICAvKiBQYXJzZSBvdXQgdGhlIGV4dGVuc2lvbiBjb250ZW50cy4gKi8KLSAgQ0JTIHJlbmVnb3RpYXRlZF9jb25uZWN0aW9uOwotICBpZiAoIUNCU19nZXRfdThfbGVuZ3RoX3ByZWZpeGVkKGNvbnRlbnRzLCAmcmVuZWdvdGlhdGVkX2Nvbm5lY3Rpb24pIHx8Ci0gICAgICBDQlNfbGVuKGNvbnRlbnRzKSAhPSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9SRU5FR09USUFUSU9OX0VOQ09ESU5HX0VSUik7Ci0gICAgKm91dF9hbGVydCA9IFNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIENoZWNrIHRoYXQgdGhlIGV4dGVuc2lvbiBtYXRjaGVzLiAqLwotICBpZiAoQ0JTX2xlbigmcmVuZWdvdGlhdGVkX2Nvbm5lY3Rpb24pICE9IGV4cGVjdGVkX2xlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfUkVORUdPVElBVElPTl9NSVNNQVRDSCk7Ci0gICAgKm91dF9hbGVydCA9IFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGNvbnN0IHVpbnQ4X3QgKmQgPSBDQlNfZGF0YSgmcmVuZWdvdGlhdGVkX2Nvbm5lY3Rpb24pOwotICBpZiAoQ1JZUFRPX21lbWNtcChkLCBzc2wtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWQsCi0gICAgICAgIHNzbC0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZF9sZW4pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9SRU5FR09USUFUSU9OX01JU01BVENIKTsKLSAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOwotICAgIHJldHVybiAwOwotICB9Ci0gIGQgKz0gc3NsLT5zMy0+cHJldmlvdXNfY2xpZW50X2ZpbmlzaGVkX2xlbjsKLQotICBpZiAoQ1JZUFRPX21lbWNtcChkLCBzc2wtPnMzLT5wcmV2aW91c19zZXJ2ZXJfZmluaXNoZWQsCi0gICAgICAgIHNzbC0+czMtPnByZXZpb3VzX3NlcnZlcl9maW5pc2hlZF9sZW4pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9SRU5FR09USUFUSU9OX01JU01BVENIKTsKLSAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOwotICAgIHJldHVybiAwOwotICB9Ci0gIHNzbC0+czMtPnNlbmRfY29ubmVjdGlvbl9iaW5kaW5nID0gMTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBleHRfcmlfcGFyc2VfY2xpZW50aGVsbG8oU1NMICpzc2wsIHVpbnQ4X3QgKm91dF9hbGVydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCUyAqY29udGVudHMpIHsKLSAgLyogUmVuZWdvdGlhdGlvbiBpc24ndCBzdXBwb3J0ZWQgYXMgYSBzZXJ2ZXIgc28gdGhpcyBmdW5jdGlvbiBzaG91bGQgbmV2ZXIgYmUKLSAgICogY2FsbGVkIGFmdGVyIHRoZSBpbml0aWFsIGhhbmRzaGFrZS4gKi8KLSAgYXNzZXJ0KCFzc2wtPnMzLT5pbml0aWFsX2hhbmRzaGFrZV9jb21wbGV0ZSk7Ci0KLSAgQ0JTIGZha2VfY29udGVudHM7Ci0gIHN0YXRpYyBjb25zdCB1aW50OF90IGtGYWtlRXh0ZW5zaW9uW10gPSB7MH07Ci0KLSAgaWYgKGNvbnRlbnRzID09IE5VTEwpIHsKLSAgICBpZiAoc3NsLT5zMy0+c2VuZF9jb25uZWN0aW9uX2JpbmRpbmcpIHsKLSAgICAgIC8qIFRoZSByZW5lZ290aWF0aW9uIFNDU1Ygd2FzIHJlY2VpdmVkIHNvIHByZXRlbmQgdGhhdCB3ZSByZWNlaXZlZCBhCi0gICAgICAgKiByZW5lZ290aWF0aW9uIGV4dGVuc2lvbi4gKi8KLSAgICAgIENCU19pbml0KCZmYWtlX2NvbnRlbnRzLCBrRmFrZUV4dGVuc2lvbiwgc2l6ZW9mKGtGYWtlRXh0ZW5zaW9uKSk7Ci0gICAgICBjb250ZW50cyA9ICZmYWtlX2NvbnRlbnRzOwotICAgICAgLyogV2UgcmVxdWlyZSB0aGF0IHRoZSByZW5lZ290aWF0aW9uIGV4dGVuc2lvbiBpcyBhdCBpbmRleCB6ZXJvIG9mCi0gICAgICAgKiBrRXh0ZW5zaW9ucy4gKi8KLSAgICAgIHNzbC0+czMtPnRtcC5leHRlbnNpb25zLnJlY2VpdmVkIHw9ICgxdSA8PCAwKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICB9Ci0KLSAgQ0JTIHJlbmVnb3RpYXRlZF9jb25uZWN0aW9uOwotCi0gIGlmICghQ0JTX2dldF91OF9sZW5ndGhfcHJlZml4ZWQoY29udGVudHMsICZyZW5lZ290aWF0ZWRfY29ubmVjdGlvbikgfHwKLSAgICAgIENCU19sZW4oY29udGVudHMpICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1JFTkVHT1RJQVRJT05fRU5DT0RJTkdfRVJSKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIENoZWNrIHRoYXQgdGhlIGV4dGVuc2lvbiBtYXRjaGVzICovCi0gIGlmICghQ0JTX21lbV9lcXVhbCgmcmVuZWdvdGlhdGVkX2Nvbm5lY3Rpb24sIHNzbC0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZCwKLSAgICAgICAgICAgICAgICAgICAgIHNzbC0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZF9sZW4pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9SRU5FR09USUFUSU9OX01JU01BVENIKTsKLSAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgc3NsLT5zMy0+c2VuZF9jb25uZWN0aW9uX2JpbmRpbmcgPSAxOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGV4dF9yaV9hZGRfc2VydmVyaGVsbG8oU1NMICpzc2wsIENCQiAqb3V0KSB7Ci0gIENCQiBjb250ZW50cywgcHJldl9maW5pc2hlZDsKLSAgaWYgKCFDQkJfYWRkX3UxNihvdXQsIFRMU0VYVF9UWVBFX3JlbmVnb3RpYXRlKSB8fAotICAgICAgIUNCQl9hZGRfdTE2X2xlbmd0aF9wcmVmaXhlZChvdXQsICZjb250ZW50cykgfHwKLSAgICAgICFDQkJfYWRkX3U4X2xlbmd0aF9wcmVmaXhlZCgmY29udGVudHMsICZwcmV2X2ZpbmlzaGVkKSB8fAotICAgICAgIUNCQl9hZGRfYnl0ZXMoJnByZXZfZmluaXNoZWQsIHNzbC0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZCwKLSAgICAgICAgICAgICAgICAgICAgIHNzbC0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZF9sZW4pIHx8Ci0gICAgICAhQ0JCX2FkZF9ieXRlcygmcHJldl9maW5pc2hlZCwgc3NsLT5zMy0+cHJldmlvdXNfc2VydmVyX2ZpbmlzaGVkLAotICAgICAgICAgICAgICAgICAgICAgc3NsLT5zMy0+cHJldmlvdXNfc2VydmVyX2ZpbmlzaGVkX2xlbikgfHwKLSAgICAgICFDQkJfZmx1c2gob3V0KSkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotLyogRXh0ZW5kZWQgTWFzdGVyIFNlY3JldC4KLSAqCi0gKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi10bHMtc2Vzc2lvbi1oYXNoLTA1ICovCi0KLXN0YXRpYyB2b2lkIGV4dF9lbXNfaW5pdChTU0wgKnNzbCkgewotICBzc2wtPnMzLT50bXAuZXh0ZW5kZWRfbWFzdGVyX3NlY3JldCA9IDA7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X2Vtc19hZGRfY2xpZW50aGVsbG8oU1NMICpzc2wsIENCQiAqb3V0KSB7Ci0gIGlmIChzc2wtPnZlcnNpb24gPT0gU1NMM19WRVJTSU9OKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBpZiAoIUNCQl9hZGRfdTE2KG91dCwgVExTRVhUX1RZUEVfZXh0ZW5kZWRfbWFzdGVyX3NlY3JldCkgfHwKLSAgICAgICFDQkJfYWRkX3UxNihvdXQsIDAgLyogbGVuZ3RoICovKSkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X2Vtc19wYXJzZV9zZXJ2ZXJoZWxsbyhTU0wgKnNzbCwgdWludDhfdCAqb3V0X2FsZXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCUyAqY29udGVudHMpIHsKLSAgaWYgKGNvbnRlbnRzID09IE5VTEwpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIGlmIChzc2wtPnZlcnNpb24gPT0gU1NMM19WRVJTSU9OIHx8IENCU19sZW4oY29udGVudHMpICE9IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHNzbC0+czMtPnRtcC5leHRlbmRlZF9tYXN0ZXJfc2VjcmV0ID0gMTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X2Vtc19wYXJzZV9jbGllbnRoZWxsbyhTU0wgKnNzbCwgdWludDhfdCAqb3V0X2FsZXJ0LCBDQlMgKmNvbnRlbnRzKSB7Ci0gIGlmIChzc2wtPnZlcnNpb24gPT0gU1NMM19WRVJTSU9OIHx8IGNvbnRlbnRzID09IE5VTEwpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIGlmIChDQlNfbGVuKGNvbnRlbnRzKSAhPSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBzc2wtPnMzLT50bXAuZXh0ZW5kZWRfbWFzdGVyX3NlY3JldCA9IDE7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGV4dF9lbXNfYWRkX3NlcnZlcmhlbGxvKFNTTCAqc3NsLCBDQkIgKm91dCkgewotICBpZiAoIXNzbC0+czMtPnRtcC5leHRlbmRlZF9tYXN0ZXJfc2VjcmV0KSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBpZiAoIUNCQl9hZGRfdTE2KG91dCwgVExTRVhUX1RZUEVfZXh0ZW5kZWRfbWFzdGVyX3NlY3JldCkgfHwKLSAgICAgICFDQkJfYWRkX3UxNihvdXQsIDAgLyogbGVuZ3RoICovKSkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotLyogU2Vzc2lvbiB0aWNrZXRzLgotICoKLSAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MDc3ICovCi0KLXN0YXRpYyBpbnQgZXh0X3RpY2tldF9hZGRfY2xpZW50aGVsbG8oU1NMICpzc2wsIENCQiAqb3V0KSB7Ci0gIGlmIChTU0xfZ2V0X29wdGlvbnMoc3NsKSAmIFNTTF9PUF9OT19USUNLRVQpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIGNvbnN0IHVpbnQ4X3QgKnRpY2tldF9kYXRhID0gTlVMTDsKLSAgaW50IHRpY2tldF9sZW4gPSAwOwotCi0gIC8qIFJlbmVnb3RpYXRpb24gZG9lcyBub3QgcGFydGljaXBhdGUgaW4gc2Vzc2lvbiByZXN1bXB0aW9uLiBIb3dldmVyLCBzdGlsbAotICAgKiBhZHZlcnRpc2UgdGhlIGV4dGVuc2lvbiB0byBhdm9pZCBwb3RlbnRpYWxseSBicmVha2luZyBzZXJ2ZXJzIHdoaWNoIGNhcnJ5Ci0gICAqIG92ZXIgdGhlIHN0YXRlIGZyb20gdGhlIHByZXZpb3VzIGhhbmRzaGFrZSwgc3VjaCBhcyBPcGVuU1NMIHNlcnZlcnMKLSAgICogd2l0aG91dCB1cHN0cmVhbSdzIDNjM2YwMjU5MjM4NTk0ZDc3MjY0YTc4OTQ0ZDQwOWYyMTI3NjQyYzQuICovCi0gIGlmICghc3NsLT5zMy0+aW5pdGlhbF9oYW5kc2hha2VfY29tcGxldGUgJiYKLSAgICAgIHNzbC0+c2Vzc2lvbiAhPSBOVUxMICYmCi0gICAgICBzc2wtPnNlc3Npb24tPnRsc2V4dF90aWNrICE9IE5VTEwpIHsKLSAgICB0aWNrZXRfZGF0YSA9IHNzbC0+c2Vzc2lvbi0+dGxzZXh0X3RpY2s7Ci0gICAgdGlja2V0X2xlbiA9IHNzbC0+c2Vzc2lvbi0+dGxzZXh0X3RpY2tsZW47Ci0gIH0KLQotICBDQkIgdGlja2V0OwotICBpZiAoIUNCQl9hZGRfdTE2KG91dCwgVExTRVhUX1RZUEVfc2Vzc2lvbl90aWNrZXQpIHx8Ci0gICAgICAhQ0JCX2FkZF91MTZfbGVuZ3RoX3ByZWZpeGVkKG91dCwgJnRpY2tldCkgfHwKLSAgICAgICFDQkJfYWRkX2J5dGVzKCZ0aWNrZXQsIHRpY2tldF9kYXRhLCB0aWNrZXRfbGVuKSB8fAotICAgICAgIUNCQl9mbHVzaChvdXQpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBleHRfdGlja2V0X3BhcnNlX3NlcnZlcmhlbGxvKFNTTCAqc3NsLCB1aW50OF90ICpvdXRfYWxlcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JTICpjb250ZW50cykgewotICBzc2wtPnRsc2V4dF90aWNrZXRfZXhwZWN0ZWQgPSAwOwotCi0gIGlmIChjb250ZW50cyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICAvKiBJZiB8U1NMX09QX05PX1RJQ0tFVHwgaXMgc2V0IHRoZW4gbm8gZXh0ZW5zaW9uIHdpbGwgaGF2ZSBiZWVuIHNlbnQgYW5kCi0gICAqIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCwgZXZlbiBpZiB0aGUgc2VydmVyIHRyaWVzIHRvIHNlbmQgdGhlCi0gICAqIGV4dGVuc2lvbi4gKi8KLSAgYXNzZXJ0KChTU0xfZ2V0X29wdGlvbnMoc3NsKSAmIFNTTF9PUF9OT19USUNLRVQpID09IDApOwotCi0gIGlmIChDQlNfbGVuKGNvbnRlbnRzKSAhPSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBzc2wtPnRsc2V4dF90aWNrZXRfZXhwZWN0ZWQgPSAxOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBleHRfdGlja2V0X3BhcnNlX2NsaWVudGhlbGxvKFNTTCAqc3NsLCB1aW50OF90ICpvdXRfYWxlcnQsIENCUyAqY29udGVudHMpIHsKLSAgLyogVGhpcyBmdW5jdGlvbiBpc24ndCB1c2VkIGJlY2F1c2UgdGhlIHRpY2tldCBleHRlbnNpb24gZnJvbSB0aGUgY2xpZW50IGlzCi0gICAqIGhhbmRsZWQgaW4gc3NsX3Nlc3MuYy4gKi8KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X3RpY2tldF9hZGRfc2VydmVyaGVsbG8oU1NMICpzc2wsIENCQiAqb3V0KSB7Ci0gIGlmICghc3NsLT50bHNleHRfdGlja2V0X2V4cGVjdGVkKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICAvKiBJZiB8U1NMX09QX05PX1RJQ0tFVHwgaXMgc2V0LCB8dGxzZXh0X3RpY2tldF9leHBlY3RlZHwgc2hvdWxkIG5ldmVyIGJlCi0gICAqIHRydWUuICovCi0gIGFzc2VydCgoU1NMX2dldF9vcHRpb25zKHNzbCkgJiBTU0xfT1BfTk9fVElDS0VUKSA9PSAwKTsKLQotICBpZiAoIUNCQl9hZGRfdTE2KG91dCwgVExTRVhUX1RZUEVfc2Vzc2lvbl90aWNrZXQpIHx8Ci0gICAgICAhQ0JCX2FkZF91MTYob3V0LCAwIC8qIGxlbmd0aCAqLykpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJldHVybiAxOwotfQotCi0KLS8qIFNpZ25hdHVyZSBBbGdvcml0aG1zLgotICoKLSAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MjQ2I3NlY3Rpb24tNy40LjEuNC4xICovCi0KLXN0YXRpYyBpbnQgZXh0X3NpZ2FsZ3NfYWRkX2NsaWVudGhlbGxvKFNTTCAqc3NsLCBDQkIgKm91dCkgewotICBpZiAoc3NsM192ZXJzaW9uX2Zyb21fd2lyZShzc2wsIHNzbC0+Y2xpZW50X3ZlcnNpb24pIDwgVExTMV8yX1ZFUlNJT04pIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIGNvbnN0IHVpbnQ4X3QgKnNpZ2FsZ3NfZGF0YTsKLSAgY29uc3Qgc2l6ZV90IHNpZ2FsZ3NfbGVuID0gdGxzMTJfZ2V0X3BzaWdhbGdzKHNzbCwgJnNpZ2FsZ3NfZGF0YSk7Ci0KLSAgQ0JCIGNvbnRlbnRzLCBzaWdhbGdzOwotICBpZiAoIUNCQl9hZGRfdTE2KG91dCwgVExTRVhUX1RZUEVfc2lnbmF0dXJlX2FsZ29yaXRobXMpIHx8Ci0gICAgICAhQ0JCX2FkZF91MTZfbGVuZ3RoX3ByZWZpeGVkKG91dCwgJmNvbnRlbnRzKSB8fAotICAgICAgIUNCQl9hZGRfdTE2X2xlbmd0aF9wcmVmaXhlZCgmY29udGVudHMsICZzaWdhbGdzKSB8fAotICAgICAgIUNCQl9hZGRfYnl0ZXMoJnNpZ2FsZ3MsIHNpZ2FsZ3NfZGF0YSwgc2lnYWxnc19sZW4pIHx8Ci0gICAgICAhQ0JCX2ZsdXNoKG91dCkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGV4dF9zaWdhbGdzX3BhcnNlX3NlcnZlcmhlbGxvKFNTTCAqc3NsLCB1aW50OF90ICpvdXRfYWxlcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCUyAqY29udGVudHMpIHsKLSAgaWYgKGNvbnRlbnRzICE9IE5VTEwpIHsKLSAgICAvKiBTZXJ2ZXJzIE1VU1QgTk9UIHNlbmQgdGhpcyBleHRlbnNpb24uICovCi0gICAgKm91dF9hbGVydCA9IFNTTF9BRF9VTlNVUFBPUlRFRF9FWFRFTlNJT047Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9TSUdOQVRVUkVfQUxHT1JJVEhNU19FWFRFTlNJT05fU0VOVF9CWV9TRVJWRVIpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X3NpZ2FsZ3NfcGFyc2VfY2xpZW50aGVsbG8oU1NMICpzc2wsIHVpbnQ4X3QgKm91dF9hbGVydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JTICpjb250ZW50cykgewotICBPUEVOU1NMX2ZyZWUoc3NsLT5jZXJ0LT5wZWVyX3NpZ2FsZ3MpOwotICBzc2wtPmNlcnQtPnBlZXJfc2lnYWxncyA9IE5VTEw7Ci0gIHNzbC0+Y2VydC0+cGVlcl9zaWdhbGdzbGVuID0gMDsKLQotICBpZiAoY29udGVudHMgPT0gTlVMTCkgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgQ0JTIHN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtczsKLSAgaWYgKCFDQlNfZ2V0X3UxNl9sZW5ndGhfcHJlZml4ZWQoY29udGVudHMsICZzdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXMpIHx8Ci0gICAgICBDQlNfbGVuKGNvbnRlbnRzKSAhPSAwIHx8Ci0gICAgICBDQlNfbGVuKCZzdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXMpID09IDAgfHwKLSAgICAgICF0bHMxX3BhcnNlX3BlZXJfc2lnYWxncyhzc2wsICZzdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXMpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBleHRfc2lnYWxnc19hZGRfc2VydmVyaGVsbG8oU1NMICpzc2wsIENCQiAqb3V0KSB7Ci0gIC8qIFNlcnZlcnMgTVVTVCBOT1Qgc2VuZCB0aGlzIGV4dGVuc2lvbi4gKi8KLSAgcmV0dXJuIDE7Ci19Ci0KLQotLyogT0NTUCBTdGFwbGluZy4KLSAqCi0gKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjA2NiNzZWN0aW9uLTggKi8KLQotc3RhdGljIHZvaWQgZXh0X29jc3BfaW5pdChTU0wgKnNzbCkgewotICBzc2wtPnMzLT50bXAuY2VydGlmaWNhdGVfc3RhdHVzX2V4cGVjdGVkID0gMDsKLX0KLQotc3RhdGljIGludCBleHRfb2NzcF9hZGRfY2xpZW50aGVsbG8oU1NMICpzc2wsIENCQiAqb3V0KSB7Ci0gIGlmICghc3NsLT5vY3NwX3N0YXBsaW5nX2VuYWJsZWQpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIENCQiBjb250ZW50czsKLSAgaWYgKCFDQkJfYWRkX3UxNihvdXQsIFRMU0VYVF9UWVBFX3N0YXR1c19yZXF1ZXN0KSB8fAotICAgICAgIUNCQl9hZGRfdTE2X2xlbmd0aF9wcmVmaXhlZChvdXQsICZjb250ZW50cykgfHwKLSAgICAgICFDQkJfYWRkX3U4KCZjb250ZW50cywgVExTRVhUX1NUQVRVU1RZUEVfb2NzcCkgfHwKLSAgICAgICFDQkJfYWRkX3UxNigmY29udGVudHMsIDAgLyogZW1wdHkgcmVzcG9uZGVyIElEIGxpc3QgKi8pIHx8Ci0gICAgICAhQ0JCX2FkZF91MTYoJmNvbnRlbnRzLCAwIC8qIGVtcHR5IHJlcXVlc3QgZXh0ZW5zaW9ucyAqLykgfHwKLSAgICAgICFDQkJfZmx1c2gob3V0KSkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X29jc3BfcGFyc2Vfc2VydmVyaGVsbG8oU1NMICpzc2wsIHVpbnQ4X3QgKm91dF9hbGVydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JTICpjb250ZW50cykgewotICBpZiAoY29udGVudHMgPT0gTlVMTCkgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgaWYgKENCU19sZW4oY29udGVudHMpICE9IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHNzbC0+czMtPnRtcC5jZXJ0aWZpY2F0ZV9zdGF0dXNfZXhwZWN0ZWQgPSAxOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBleHRfb2NzcF9wYXJzZV9jbGllbnRoZWxsbyhTU0wgKnNzbCwgdWludDhfdCAqb3V0X2FsZXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQlMgKmNvbnRlbnRzKSB7Ci0gIGlmIChjb250ZW50cyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICB1aW50OF90IHN0YXR1c190eXBlOwotICBpZiAoIUNCU19nZXRfdTgoY29udGVudHMsICZzdGF0dXNfdHlwZSkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIFdlIGNhbm5vdCBkZWNpZGUgd2hldGhlciBPQ1NQIHN0YXBsaW5nIHdpbGwgb2NjdXIgeWV0IGJlY2F1c2UgdGhlIGNvcnJlY3QKLSAgICogU1NMX0NUWCBtaWdodCBub3QgaGF2ZSBiZWVuIHNlbGVjdGVkLiAqLwotICBzc2wtPnMzLT50bXAub2NzcF9zdGFwbGluZ19yZXF1ZXN0ZWQgPSBzdGF0dXNfdHlwZSA9PSBUTFNFWFRfU1RBVFVTVFlQRV9vY3NwOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGV4dF9vY3NwX2FkZF9zZXJ2ZXJoZWxsbyhTU0wgKnNzbCwgQ0JCICpvdXQpIHsKLSAgLyogVGhlIGV4dGVuc2lvbiBzaG91bGRuJ3QgYmUgc2VudCB3aGVuIHJlc3VtaW5nIHNlc3Npb25zLiAqLwotICBpZiAoc3NsLT5oaXQgfHwKLSAgICAgICFzc2wtPnMzLT50bXAub2NzcF9zdGFwbGluZ19yZXF1ZXN0ZWQgfHwKLSAgICAgIHNzbC0+Y3R4LT5vY3NwX3Jlc3BvbnNlX2xlbmd0aCA9PSAwKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBzc2wtPnMzLT50bXAuY2VydGlmaWNhdGVfc3RhdHVzX2V4cGVjdGVkID0gMTsKLQotICByZXR1cm4gQ0JCX2FkZF91MTYob3V0LCBUTFNFWFRfVFlQRV9zdGF0dXNfcmVxdWVzdCkgJiYKLSAgICAgICAgIENCQl9hZGRfdTE2KG91dCwgMCAvKiBsZW5ndGggKi8pOwotfQotCi0KLS8qIE5leHQgcHJvdG9jb2wgbmVnb3RpYXRpb24uCi0gKgotICogaHR0cHM6Ly9odG1scHJldmlldy5naXRodWIuaW8vP2h0dHBzOi8vZ2l0aHViLmNvbS9hZ2wvdGVjaG5vdGVzL2Jsb2IvbWFzdGVyL25leHRwcm90b25lZy5odG1sICovCi0KLXN0YXRpYyB2b2lkIGV4dF9ucG5faW5pdChTU0wgKnNzbCkgewotICBzc2wtPnMzLT5uZXh0X3Byb3RvX25lZ19zZWVuID0gMDsKLX0KLQotc3RhdGljIGludCBleHRfbnBuX2FkZF9jbGllbnRoZWxsbyhTU0wgKnNzbCwgQ0JCICpvdXQpIHsKLSAgaWYgKHNzbC0+czMtPmluaXRpYWxfaGFuZHNoYWtlX2NvbXBsZXRlIHx8Ci0gICAgICBzc2wtPmN0eC0+bmV4dF9wcm90b19zZWxlY3RfY2IgPT0gTlVMTCB8fAotICAgICAgU1NMX0lTX0RUTFMoc3NsKSkgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgaWYgKCFDQkJfYWRkX3UxNihvdXQsIFRMU0VYVF9UWVBFX25leHRfcHJvdG9fbmVnKSB8fAotICAgICAgIUNCQl9hZGRfdTE2KG91dCwgMCAvKiBsZW5ndGggKi8pKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBleHRfbnBuX3BhcnNlX3NlcnZlcmhlbGxvKFNTTCAqc3NsLCB1aW50OF90ICpvdXRfYWxlcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JTICpjb250ZW50cykgewotICBpZiAoY29udGVudHMgPT0gTlVMTCkgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgLyogSWYgYW55IG9mIHRoZXNlIGFyZSBmYWxzZSB0aGVuIHdlIHNob3VsZCBuZXZlciBoYXZlIHNlbnQgdGhlIE5QTgotICAgKiBleHRlbnNpb24gaW4gdGhlIENsaWVudEhlbGxvIGFuZCB0aHVzIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG5ldmVyIGhhdmUgYmVlbgotICAgKiBjYWxsZWQuICovCi0gIGFzc2VydCghc3NsLT5zMy0+aW5pdGlhbF9oYW5kc2hha2VfY29tcGxldGUpOwotICBhc3NlcnQoIVNTTF9JU19EVExTKHNzbCkpOwotICBhc3NlcnQoc3NsLT5jdHgtPm5leHRfcHJvdG9fc2VsZWN0X2NiICE9IE5VTEwpOwotCi0gIGlmIChzc2wtPnMzLT5hbHBuX3NlbGVjdGVkICE9IE5VTEwpIHsKLSAgICAvKiBOUE4gYW5kIEFMUE4gbWF5IG5vdCBiZSBuZWdvdGlhdGVkIGluIHRoZSBzYW1lIGNvbm5lY3Rpb24uICovCi0gICAgKm91dF9hbGVydCA9IFNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX05FR09USUFURURfQk9USF9OUE5fQU5EX0FMUE4pOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgY29uc3QgdWludDhfdCAqY29uc3Qgb3JpZ19jb250ZW50cyA9IENCU19kYXRhKGNvbnRlbnRzKTsKLSAgY29uc3Qgc2l6ZV90IG9yaWdfbGVuID0gQ0JTX2xlbihjb250ZW50cyk7Ci0KLSAgd2hpbGUgKENCU19sZW4oY29udGVudHMpICE9IDApIHsKLSAgICBDQlMgcHJvdG87Ci0gICAgaWYgKCFDQlNfZ2V0X3U4X2xlbmd0aF9wcmVmaXhlZChjb250ZW50cywgJnByb3RvKSB8fAotICAgICAgICBDQlNfbGVuKCZwcm90bykgPT0gMCkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0KLSAgdWludDhfdCAqc2VsZWN0ZWQ7Ci0gIHVpbnQ4X3Qgc2VsZWN0ZWRfbGVuOwotICBpZiAoc3NsLT5jdHgtPm5leHRfcHJvdG9fc2VsZWN0X2NiKAotICAgICAgICAgIHNzbCwgJnNlbGVjdGVkLCAmc2VsZWN0ZWRfbGVuLCBvcmlnX2NvbnRlbnRzLCBvcmlnX2xlbiwKLSAgICAgICAgICBzc2wtPmN0eC0+bmV4dF9wcm90b19zZWxlY3RfY2JfYXJnKSAhPSBTU0xfVExTRVhUX0VSUl9PSykgewotICAgICpvdXRfYWxlcnQgPSBTU0xfQURfSU5URVJOQUxfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBPUEVOU1NMX2ZyZWUoc3NsLT5uZXh0X3Byb3RvX25lZ290aWF0ZWQpOwotICBzc2wtPm5leHRfcHJvdG9fbmVnb3RpYXRlZCA9IEJVRl9tZW1kdXAoc2VsZWN0ZWQsIHNlbGVjdGVkX2xlbik7Ci0gIGlmIChzc2wtPm5leHRfcHJvdG9fbmVnb3RpYXRlZCA9PSBOVUxMKSB7Ci0gICAgKm91dF9hbGVydCA9IFNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHNzbC0+bmV4dF9wcm90b19uZWdvdGlhdGVkX2xlbiA9IHNlbGVjdGVkX2xlbjsKLSAgc3NsLT5zMy0+bmV4dF9wcm90b19uZWdfc2VlbiA9IDE7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X25wbl9wYXJzZV9jbGllbnRoZWxsbyhTU0wgKnNzbCwgdWludDhfdCAqb3V0X2FsZXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCUyAqY29udGVudHMpIHsKLSAgaWYgKGNvbnRlbnRzICE9IE5VTEwgJiYgQ0JTX2xlbihjb250ZW50cykgIT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaWYgKGNvbnRlbnRzID09IE5VTEwgfHwKLSAgICAgIHNzbC0+czMtPmluaXRpYWxfaGFuZHNoYWtlX2NvbXBsZXRlIHx8Ci0gICAgICAvKiBJZiB0aGUgQUxQTiBleHRlbnNpb24gaXMgc2VlbiBiZWZvcmUgTlBOLCBpZ25vcmUgaXQuIChJZiBBTFBOIGlzIHNlZW4KLSAgICAgICAqIGFmdGVyd2FyZHMsIHBhcnNpbmcgdGhlIEFMUE4gZXh0ZW5zaW9uIHdpbGwgY2xlYXIKLSAgICAgICAqIHxuZXh0X3Byb3RvX25lZ19zZWVufC4gKi8KLSAgICAgIHNzbC0+czMtPmFscG5fc2VsZWN0ZWQgIT0gTlVMTCB8fAotICAgICAgc3NsLT5jdHgtPm5leHRfcHJvdG9zX2FkdmVydGlzZWRfY2IgPT0gTlVMTCB8fAotICAgICAgU1NMX0lTX0RUTFMoc3NsKSkgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgc3NsLT5zMy0+bmV4dF9wcm90b19uZWdfc2VlbiA9IDE7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGV4dF9ucG5fYWRkX3NlcnZlcmhlbGxvKFNTTCAqc3NsLCBDQkIgKm91dCkgewotICAvKiB8bmV4dF9wcm90b19uZWdfc2VlbnwgbWlnaHQgaGF2ZSBiZWVuIGNsZWFyZWQgd2hlbiBhbiBBTFBOIGV4dGVuc2lvbiB3YXMKLSAgICogcGFyc2VkLiAqLwotICBpZiAoIXNzbC0+czMtPm5leHRfcHJvdG9fbmVnX3NlZW4pIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIGNvbnN0IHVpbnQ4X3QgKm5wYTsKLSAgdW5zaWduZWQgbnBhX2xlbjsKLQotICBpZiAoc3NsLT5jdHgtPm5leHRfcHJvdG9zX2FkdmVydGlzZWRfY2IoCi0gICAgICAgICAgc3NsLCAmbnBhLCAmbnBhX2xlbiwgc3NsLT5jdHgtPm5leHRfcHJvdG9zX2FkdmVydGlzZWRfY2JfYXJnKSAhPQotICAgICAgU1NMX1RMU0VYVF9FUlJfT0spIHsKLSAgICBzc2wtPnMzLT5uZXh0X3Byb3RvX25lZ19zZWVuID0gMDsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIENCQiBjb250ZW50czsKLSAgaWYgKCFDQkJfYWRkX3UxNihvdXQsIFRMU0VYVF9UWVBFX25leHRfcHJvdG9fbmVnKSB8fAotICAgICAgIUNCQl9hZGRfdTE2X2xlbmd0aF9wcmVmaXhlZChvdXQsICZjb250ZW50cykgfHwKLSAgICAgICFDQkJfYWRkX2J5dGVzKCZjb250ZW50cywgbnBhLCBucGFfbGVuKSB8fAotICAgICAgIUNCQl9mbHVzaChvdXQpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotCi0vKiBTaWduZWQgY2VydGlmaWNhdGUgdGltZXN0YW1wcy4KLSAqCi0gKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjk2MiNzZWN0aW9uLTMuMy4xICovCi0KLXN0YXRpYyBpbnQgZXh0X3NjdF9hZGRfY2xpZW50aGVsbG8oU1NMICpzc2wsIENCQiAqb3V0KSB7Ci0gIGlmICghc3NsLT5zaWduZWRfY2VydF90aW1lc3RhbXBzX2VuYWJsZWQpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIGlmICghQ0JCX2FkZF91MTYob3V0LCBUTFNFWFRfVFlQRV9jZXJ0aWZpY2F0ZV90aW1lc3RhbXApIHx8Ci0gICAgICAhQ0JCX2FkZF91MTYob3V0LCAwIC8qIGxlbmd0aCAqLykpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGV4dF9zY3RfcGFyc2Vfc2VydmVyaGVsbG8oU1NMICpzc2wsIHVpbnQ4X3QgKm91dF9hbGVydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQlMgKmNvbnRlbnRzKSB7Ci0gIGlmIChjb250ZW50cyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICAvKiBJZiB0aGlzIGlzIGZhbHNlIHRoZW4gd2Ugc2hvdWxkIG5ldmVyIGhhdmUgc2VudCB0aGUgU0NUIGV4dGVuc2lvbiBpbiB0aGUKLSAgICogQ2xpZW50SGVsbG8gYW5kIHRodXMgdGhpcyBmdW5jdGlvbiBzaG91bGQgbmV2ZXIgaGF2ZSBiZWVuIGNhbGxlZC4gKi8KLSAgYXNzZXJ0KHNzbC0+c2lnbmVkX2NlcnRfdGltZXN0YW1wc19lbmFibGVkKTsKLQotICBpZiAoQ0JTX2xlbihjb250ZW50cykgPT0gMCkgewotICAgICpvdXRfYWxlcnQgPSBTU0xfQURfREVDT0RFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyogU2Vzc2lvbiByZXN1bXB0aW9uIHVzZXMgdGhlIG9yaWdpbmFsIHNlc3Npb24gaW5mb3JtYXRpb24uICovCi0gIGlmICghc3NsLT5oaXQgJiYKLSAgICAgICFDQlNfc3Rvdyhjb250ZW50cywgJnNzbC0+c2Vzc2lvbi0+dGxzZXh0X3NpZ25lZF9jZXJ0X3RpbWVzdGFtcF9saXN0LAotICAgICAgICAgICAgICAgICZzc2wtPnNlc3Npb24tPnRsc2V4dF9zaWduZWRfY2VydF90aW1lc3RhbXBfbGlzdF9sZW5ndGgpKSB7Ci0gICAgKm91dF9hbGVydCA9IFNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGV4dF9zY3RfcGFyc2VfY2xpZW50aGVsbG8oU1NMICpzc2wsIHVpbnQ4X3QgKm91dF9hbGVydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQlMgKmNvbnRlbnRzKSB7Ci0gIHJldHVybiBjb250ZW50cyA9PSBOVUxMIHx8IENCU19sZW4oY29udGVudHMpID09IDA7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X3NjdF9hZGRfc2VydmVyaGVsbG8oU1NMICpzc2wsIENCQiAqb3V0KSB7Ci0gIC8qIFRoZSBleHRlbnNpb24gc2hvdWxkbid0IGJlIHNlbnQgd2hlbiByZXN1bWluZyBzZXNzaW9ucy4gKi8KLSAgaWYgKHNzbC0+aGl0IHx8Ci0gICAgICBzc2wtPmN0eC0+c2lnbmVkX2NlcnRfdGltZXN0YW1wX2xpc3RfbGVuZ3RoID09IDApIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIENCQiBjb250ZW50czsKLSAgcmV0dXJuIENCQl9hZGRfdTE2KG91dCwgVExTRVhUX1RZUEVfY2VydGlmaWNhdGVfdGltZXN0YW1wKSAmJgotICAgICAgICAgQ0JCX2FkZF91MTZfbGVuZ3RoX3ByZWZpeGVkKG91dCwgJmNvbnRlbnRzKSAmJgotICAgICAgICAgQ0JCX2FkZF9ieXRlcygmY29udGVudHMsIHNzbC0+Y3R4LT5zaWduZWRfY2VydF90aW1lc3RhbXBfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5jdHgtPnNpZ25lZF9jZXJ0X3RpbWVzdGFtcF9saXN0X2xlbmd0aCkgJiYKLSAgICAgICAgIENCQl9mbHVzaChvdXQpOwotfQotCi0KLS8qIEFwcGxpY2F0aW9uLWxldmVsIFByb3RvY29sIE5lZ290aWF0aW9uLgotICoKLSAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MzAxICovCi0KLXN0YXRpYyB2b2lkIGV4dF9hbHBuX2luaXQoU1NMICpzc2wpIHsKLSAgT1BFTlNTTF9mcmVlKHNzbC0+czMtPmFscG5fc2VsZWN0ZWQpOwotICBzc2wtPnMzLT5hbHBuX3NlbGVjdGVkID0gTlVMTDsKLX0KLQotc3RhdGljIGludCBleHRfYWxwbl9hZGRfY2xpZW50aGVsbG8oU1NMICpzc2wsIENCQiAqb3V0KSB7Ci0gIGlmIChzc2wtPmFscG5fY2xpZW50X3Byb3RvX2xpc3QgPT0gTlVMTCB8fAotICAgICAgc3NsLT5zMy0+aW5pdGlhbF9oYW5kc2hha2VfY29tcGxldGUpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIENCQiBjb250ZW50cywgcHJvdG9fbGlzdDsKLSAgaWYgKCFDQkJfYWRkX3UxNihvdXQsIFRMU0VYVF9UWVBFX2FwcGxpY2F0aW9uX2xheWVyX3Byb3RvY29sX25lZ290aWF0aW9uKSB8fAotICAgICAgIUNCQl9hZGRfdTE2X2xlbmd0aF9wcmVmaXhlZChvdXQsICZjb250ZW50cykgfHwKLSAgICAgICFDQkJfYWRkX3UxNl9sZW5ndGhfcHJlZml4ZWQoJmNvbnRlbnRzLCAmcHJvdG9fbGlzdCkgfHwKLSAgICAgICFDQkJfYWRkX2J5dGVzKCZwcm90b19saXN0LCBzc2wtPmFscG5fY2xpZW50X3Byb3RvX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICBzc2wtPmFscG5fY2xpZW50X3Byb3RvX2xpc3RfbGVuKSB8fAotICAgICAgIUNCQl9mbHVzaChvdXQpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBleHRfYWxwbl9wYXJzZV9zZXJ2ZXJoZWxsbyhTU0wgKnNzbCwgdWludDhfdCAqb3V0X2FsZXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQlMgKmNvbnRlbnRzKSB7Ci0gIGlmIChjb250ZW50cyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBhc3NlcnQoIXNzbC0+czMtPmluaXRpYWxfaGFuZHNoYWtlX2NvbXBsZXRlKTsKLSAgYXNzZXJ0KHNzbC0+YWxwbl9jbGllbnRfcHJvdG9fbGlzdCAhPSBOVUxMKTsKLQotICBpZiAoc3NsLT5zMy0+bmV4dF9wcm90b19uZWdfc2VlbikgewotICAgIC8qIE5QTiBhbmQgQUxQTiBtYXkgbm90IGJlIG5lZ290aWF0ZWQgaW4gdGhlIHNhbWUgY29ubmVjdGlvbi4gKi8KLSAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfTkVHT1RJQVRFRF9CT1RIX05QTl9BTkRfQUxQTik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKiBUaGUgZXh0ZW5zaW9uIGRhdGEgY29uc2lzdHMgb2YgYSBQcm90b2NvbE5hbWVMaXN0IHdoaWNoIG11c3QgaGF2ZQotICAgKiBleGFjdGx5IG9uZSBQcm90b2NvbE5hbWUuIEVhY2ggb2YgdGhlc2UgaXMgbGVuZ3RoLXByZWZpeGVkLiAqLwotICBDQlMgcHJvdG9jb2xfbmFtZV9saXN0LCBwcm90b2NvbF9uYW1lOwotICBpZiAoIUNCU19nZXRfdTE2X2xlbmd0aF9wcmVmaXhlZChjb250ZW50cywgJnByb3RvY29sX25hbWVfbGlzdCkgfHwKLSAgICAgIENCU19sZW4oY29udGVudHMpICE9IDAgfHwKLSAgICAgICFDQlNfZ2V0X3U4X2xlbmd0aF9wcmVmaXhlZCgmcHJvdG9jb2xfbmFtZV9saXN0LCAmcHJvdG9jb2xfbmFtZSkgfHwKLSAgICAgIC8qIEVtcHR5IHByb3RvY29sIG5hbWVzIGFyZSBmb3JiaWRkZW4uICovCi0gICAgICBDQlNfbGVuKCZwcm90b2NvbF9uYW1lKSA9PSAwIHx8Ci0gICAgICBDQlNfbGVuKCZwcm90b2NvbF9uYW1lX2xpc3QpICE9IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlmICghQ0JTX3N0b3coJnByb3RvY29sX25hbWUsICZzc2wtPnMzLT5hbHBuX3NlbGVjdGVkLAotICAgICAgICAgICAgICAgICZzc2wtPnMzLT5hbHBuX3NlbGVjdGVkX2xlbikpIHsKLSAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X2FscG5fcGFyc2VfY2xpZW50aGVsbG8oU1NMICpzc2wsIHVpbnQ4X3QgKm91dF9hbGVydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JTICpjb250ZW50cykgewotICBpZiAoY29udGVudHMgPT0gTlVMTCkgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgaWYgKHNzbC0+Y3R4LT5hbHBuX3NlbGVjdF9jYiA9PSBOVUxMIHx8Ci0gICAgICBzc2wtPnMzLT5pbml0aWFsX2hhbmRzaGFrZV9jb21wbGV0ZSkgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgLyogQUxQTiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgTlBOLiAqLwotICBzc2wtPnMzLT5uZXh0X3Byb3RvX25lZ19zZWVuID0gMDsKLQotICBDQlMgcHJvdG9jb2xfbmFtZV9saXN0OwotICBpZiAoIUNCU19nZXRfdTE2X2xlbmd0aF9wcmVmaXhlZChjb250ZW50cywgJnByb3RvY29sX25hbWVfbGlzdCkgfHwKLSAgICAgIENCU19sZW4oY29udGVudHMpICE9IDAgfHwKLSAgICAgIENCU19sZW4oJnByb3RvY29sX25hbWVfbGlzdCkgPCAyKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZSB0aGUgcHJvdG9jb2wgbGlzdC4gKi8KLSAgQ0JTIHByb3RvY29sX25hbWVfbGlzdF9jb3B5ID0gcHJvdG9jb2xfbmFtZV9saXN0OwotICB3aGlsZSAoQ0JTX2xlbigmcHJvdG9jb2xfbmFtZV9saXN0X2NvcHkpID4gMCkgewotICAgIENCUyBwcm90b2NvbF9uYW1lOwotCi0gICAgaWYgKCFDQlNfZ2V0X3U4X2xlbmd0aF9wcmVmaXhlZCgmcHJvdG9jb2xfbmFtZV9saXN0X2NvcHksICZwcm90b2NvbF9uYW1lKSB8fAotICAgICAgICAvKiBFbXB0eSBwcm90b2NvbCBuYW1lcyBhcmUgZm9yYmlkZGVuLiAqLwotICAgICAgICBDQlNfbGVuKCZwcm90b2NvbF9uYW1lKSA9PSAwKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLQotICBjb25zdCB1aW50OF90ICpzZWxlY3RlZDsKLSAgdWludDhfdCBzZWxlY3RlZF9sZW47Ci0gIGlmIChzc2wtPmN0eC0+YWxwbl9zZWxlY3RfY2IoCi0gICAgICAgICAgc3NsLCAmc2VsZWN0ZWQsICZzZWxlY3RlZF9sZW4sIENCU19kYXRhKCZwcm90b2NvbF9uYW1lX2xpc3QpLAotICAgICAgICAgIENCU19sZW4oJnByb3RvY29sX25hbWVfbGlzdCksCi0gICAgICAgICAgc3NsLT5jdHgtPmFscG5fc2VsZWN0X2NiX2FyZykgPT0gU1NMX1RMU0VYVF9FUlJfT0spIHsKLSAgICBPUEVOU1NMX2ZyZWUoc3NsLT5zMy0+YWxwbl9zZWxlY3RlZCk7Ci0gICAgc3NsLT5zMy0+YWxwbl9zZWxlY3RlZCA9IEJVRl9tZW1kdXAoc2VsZWN0ZWQsIHNlbGVjdGVkX2xlbik7Ci0gICAgaWYgKHNzbC0+czMtPmFscG5fc2VsZWN0ZWQgPT0gTlVMTCkgewotICAgICAgKm91dF9hbGVydCA9IFNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBzc2wtPnMzLT5hbHBuX3NlbGVjdGVkX2xlbiA9IHNlbGVjdGVkX2xlbjsKLSAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGV4dF9hbHBuX2FkZF9zZXJ2ZXJoZWxsbyhTU0wgKnNzbCwgQ0JCICpvdXQpIHsKLSAgaWYgKHNzbC0+czMtPmFscG5fc2VsZWN0ZWQgPT0gTlVMTCkgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgQ0JCIGNvbnRlbnRzLCBwcm90b19saXN0LCBwcm90bzsKLSAgaWYgKCFDQkJfYWRkX3UxNihvdXQsIFRMU0VYVF9UWVBFX2FwcGxpY2F0aW9uX2xheWVyX3Byb3RvY29sX25lZ290aWF0aW9uKSB8fAotICAgICAgIUNCQl9hZGRfdTE2X2xlbmd0aF9wcmVmaXhlZChvdXQsICZjb250ZW50cykgfHwKLSAgICAgICFDQkJfYWRkX3UxNl9sZW5ndGhfcHJlZml4ZWQoJmNvbnRlbnRzLCAmcHJvdG9fbGlzdCkgfHwKLSAgICAgICFDQkJfYWRkX3U4X2xlbmd0aF9wcmVmaXhlZCgmcHJvdG9fbGlzdCwgJnByb3RvKSB8fAotICAgICAgIUNCQl9hZGRfYnl0ZXMoJnByb3RvLCBzc2wtPnMzLT5hbHBuX3NlbGVjdGVkLCBzc2wtPnMzLT5hbHBuX3NlbGVjdGVkX2xlbikgfHwKLSAgICAgICFDQkJfZmx1c2gob3V0KSkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotLyogQ2hhbm5lbCBJRC4KLSAqCi0gKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtYmFsZmFuei10bHMtY2hhbm5lbGlkLTAxICovCi0KLXN0YXRpYyB2b2lkIGV4dF9jaGFubmVsX2lkX2luaXQoU1NMICpzc2wpIHsKLSAgc3NsLT5zMy0+dGxzZXh0X2NoYW5uZWxfaWRfdmFsaWQgPSAwOwotfQotCi1zdGF0aWMgaW50IGV4dF9jaGFubmVsX2lkX2FkZF9jbGllbnRoZWxsbyhTU0wgKnNzbCwgQ0JCICpvdXQpIHsKLSAgaWYgKCFzc2wtPnRsc2V4dF9jaGFubmVsX2lkX2VuYWJsZWQgfHwKLSAgICAgIFNTTF9JU19EVExTKHNzbCkpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIGlmICghQ0JCX2FkZF91MTYob3V0LCBUTFNFWFRfVFlQRV9jaGFubmVsX2lkKSB8fAotICAgICAgIUNCQl9hZGRfdTE2KG91dCwgMCAvKiBsZW5ndGggKi8pKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBleHRfY2hhbm5lbF9pZF9wYXJzZV9zZXJ2ZXJoZWxsbyhTU0wgKnNzbCwgdWludDhfdCAqb3V0X2FsZXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQlMgKmNvbnRlbnRzKSB7Ci0gIGlmIChjb250ZW50cyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBhc3NlcnQoIVNTTF9JU19EVExTKHNzbCkpOwotICBhc3NlcnQoc3NsLT50bHNleHRfY2hhbm5lbF9pZF9lbmFibGVkKTsKLQotICBpZiAoQ0JTX2xlbihjb250ZW50cykgIT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgc3NsLT5zMy0+dGxzZXh0X2NoYW5uZWxfaWRfdmFsaWQgPSAxOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBleHRfY2hhbm5lbF9pZF9wYXJzZV9jbGllbnRoZWxsbyhTU0wgKnNzbCwgdWludDhfdCAqb3V0X2FsZXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQlMgKmNvbnRlbnRzKSB7Ci0gIGlmIChjb250ZW50cyA9PSBOVUxMIHx8Ci0gICAgICAhc3NsLT50bHNleHRfY2hhbm5lbF9pZF9lbmFibGVkIHx8Ci0gICAgICBTU0xfSVNfRFRMUyhzc2wpKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBpZiAoQ0JTX2xlbihjb250ZW50cykgIT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgc3NsLT5zMy0+dGxzZXh0X2NoYW5uZWxfaWRfdmFsaWQgPSAxOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBleHRfY2hhbm5lbF9pZF9hZGRfc2VydmVyaGVsbG8oU1NMICpzc2wsIENCQiAqb3V0KSB7Ci0gIGlmICghc3NsLT5zMy0+dGxzZXh0X2NoYW5uZWxfaWRfdmFsaWQpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIGlmICghQ0JCX2FkZF91MTYob3V0LCBUTFNFWFRfVFlQRV9jaGFubmVsX2lkKSB8fAotICAgICAgIUNCQl9hZGRfdTE2KG91dCwgMCAvKiBsZW5ndGggKi8pKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotCi0vKiBTZWN1cmUgUmVhbC10aW1lIFRyYW5zcG9ydCBQcm90b2NvbCAoU1JUUCkgZXh0ZW5zaW9uLgotICoKLSAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1NzY0ICovCi0KLQotc3RhdGljIHZvaWQgZXh0X3NydHBfaW5pdChTU0wgKnNzbCkgewotICBzc2wtPnNydHBfcHJvZmlsZSA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X3NydHBfYWRkX2NsaWVudGhlbGxvKFNTTCAqc3NsLCBDQkIgKm91dCkgewotICBTVEFDS19PRihTUlRQX1BST1RFQ1RJT05fUFJPRklMRSkgKnByb2ZpbGVzID0gU1NMX2dldF9zcnRwX3Byb2ZpbGVzKHNzbCk7Ci0gIGlmIChwcm9maWxlcyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgY29uc3Qgc2l6ZV90IG51bV9wcm9maWxlcyA9IHNrX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX251bShwcm9maWxlcyk7Ci0gIGlmIChudW1fcHJvZmlsZXMgPT0gMCkgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgQ0JCIGNvbnRlbnRzLCBwcm9maWxlX2lkczsKLSAgaWYgKCFDQkJfYWRkX3UxNihvdXQsIFRMU0VYVF9UWVBFX3NydHApIHx8Ci0gICAgICAhQ0JCX2FkZF91MTZfbGVuZ3RoX3ByZWZpeGVkKG91dCwgJmNvbnRlbnRzKSB8fAotICAgICAgIUNCQl9hZGRfdTE2X2xlbmd0aF9wcmVmaXhlZCgmY29udGVudHMsICZwcm9maWxlX2lkcykpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHNpemVfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3Byb2ZpbGVzOyBpKyspIHsKLSAgICBpZiAoIUNCQl9hZGRfdTE2KCZwcm9maWxlX2lkcywKLSAgICAgICAgICAgICAgICAgICAgIHNrX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX3ZhbHVlKHByb2ZpbGVzLCBpKS0+aWQpKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLQotICBpZiAoIUNCQl9hZGRfdTgoJmNvbnRlbnRzLCAwIC8qIGVtcHR5IHVzZV9ta2kgdmFsdWUgKi8pIHx8Ci0gICAgICAhQ0JCX2ZsdXNoKG91dCkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGV4dF9zcnRwX3BhcnNlX3NlcnZlcmhlbGxvKFNTTCAqc3NsLCB1aW50OF90ICpvdXRfYWxlcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCUyAqY29udGVudHMpIHsKLSAgaWYgKGNvbnRlbnRzID09IE5VTEwpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIC8qIFRoZSBleHRlbnNpb24gY29uc2lzdHMgb2YgYSB1MTYtcHJlZml4ZWQgcHJvZmlsZSBJRCBsaXN0IGNvbnRhaW5pbmcgYQotICAgKiBzaW5nbGUgdWludDE2X3QgcHJvZmlsZSBJRCwgdGhlbiBmb2xsb3dlZCBieSBhIHU4LXByZWZpeGVkIHNydHBfbWtpIGZpZWxkLgotICAgKgotICAgKiBTZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU3NjQjc2VjdGlvbi00LjEuMSAqLwotICBDQlMgcHJvZmlsZV9pZHMsIHNydHBfbWtpOwotICB1aW50MTZfdCBwcm9maWxlX2lkOwotICBpZiAoIUNCU19nZXRfdTE2X2xlbmd0aF9wcmVmaXhlZChjb250ZW50cywgJnByb2ZpbGVfaWRzKSB8fAotICAgICAgIUNCU19nZXRfdTE2KCZwcm9maWxlX2lkcywgJnByb2ZpbGVfaWQpIHx8Ci0gICAgICBDQlNfbGVuKCZwcm9maWxlX2lkcykgIT0gMCB8fAotICAgICAgIUNCU19nZXRfdThfbGVuZ3RoX3ByZWZpeGVkKGNvbnRlbnRzLCAmc3J0cF9ta2kpIHx8Ci0gICAgICBDQlNfbGVuKGNvbnRlbnRzKSAhPSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CQURfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfTElTVCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAoQ0JTX2xlbigmc3J0cF9ta2kpICE9IDApIHsKLSAgICAvKiBNdXN0IGJlIG5vIE1LSSwgc2luY2Ugd2UgbmV2ZXIgb2ZmZXIgb25lLiAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfQkFEX1NSVFBfTUtJX1ZBTFVFKTsKLSAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgU1RBQ0tfT0YoU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUpICpwcm9maWxlcyA9IFNTTF9nZXRfc3J0cF9wcm9maWxlcyhzc2wpOwotCi0gIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgc2VydmVyIGdhdmUgdXMgc29tZXRoaW5nIHdlIHN1cHBvcnQgKGFuZCBwcmVzdW1hYmx5Ci0gICAqIG9mZmVyZWQpLiAqLwotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IHNrX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX251bShwcm9maWxlcyk7IGkrKykgewotICAgIGNvbnN0IFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFICpwcm9maWxlID0KLSAgICAgICAgc2tfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfdmFsdWUocHJvZmlsZXMsIGkpOwotCi0gICAgaWYgKHByb2ZpbGUtPmlkID09IHByb2ZpbGVfaWQpIHsKLSAgICAgIHNzbC0+c3J0cF9wcm9maWxlID0gcHJvZmlsZTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotCi0gIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfQkFEX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX0xJU1QpOwotICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBleHRfc3J0cF9wYXJzZV9jbGllbnRoZWxsbyhTU0wgKnNzbCwgdWludDhfdCAqb3V0X2FsZXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQlMgKmNvbnRlbnRzKSB7Ci0gIGlmIChjb250ZW50cyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBDQlMgcHJvZmlsZV9pZHMsIHNydHBfbWtpOwotICBpZiAoIUNCU19nZXRfdTE2X2xlbmd0aF9wcmVmaXhlZChjb250ZW50cywgJnByb2ZpbGVfaWRzKSB8fAotICAgICAgQ0JTX2xlbigmcHJvZmlsZV9pZHMpIDwgMiB8fAotICAgICAgIUNCU19nZXRfdThfbGVuZ3RoX3ByZWZpeGVkKGNvbnRlbnRzLCAmc3J0cF9ta2kpIHx8Ci0gICAgICBDQlNfbGVuKGNvbnRlbnRzKSAhPSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CQURfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfTElTVCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgLyogRGlzY2FyZCB0aGUgTUtJIHZhbHVlIGZvciBub3cuICovCi0KLSAgY29uc3QgU1RBQ0tfT0YoU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUpICpzZXJ2ZXJfcHJvZmlsZXMgPQotICAgICAgU1NMX2dldF9zcnRwX3Byb2ZpbGVzKHNzbCk7Ci0KLSAgLyogUGljayB0aGUgc2VydmVyJ3MgbW9zdCBwcmVmZXJyZWQgcHJvZmlsZS4gKi8KLSAgc2l6ZV90IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBza19TUlRQX1BST1RFQ1RJT05fUFJPRklMRV9udW0oc2VydmVyX3Byb2ZpbGVzKTsgaSsrKSB7Ci0gICAgY29uc3QgU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUgKnNlcnZlcl9wcm9maWxlID0KLSAgICAgICAgc2tfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfdmFsdWUoc2VydmVyX3Byb2ZpbGVzLCBpKTsKLQotICAgIENCUyBwcm9maWxlX2lkc190bXA7Ci0gICAgQ0JTX2luaXQoJnByb2ZpbGVfaWRzX3RtcCwgQ0JTX2RhdGEoJnByb2ZpbGVfaWRzKSwgQ0JTX2xlbigmcHJvZmlsZV9pZHMpKTsKLQotICAgIHdoaWxlIChDQlNfbGVuKCZwcm9maWxlX2lkc190bXApID4gMCkgewotICAgICAgdWludDE2X3QgcHJvZmlsZV9pZDsKLSAgICAgIGlmICghQ0JTX2dldF91MTYoJnByb2ZpbGVfaWRzX3RtcCwgJnByb2ZpbGVfaWQpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICBpZiAoc2VydmVyX3Byb2ZpbGUtPmlkID09IHByb2ZpbGVfaWQpIHsKLSAgICAgICAgc3NsLT5zcnRwX3Byb2ZpbGUgPSBzZXJ2ZXJfcHJvZmlsZTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X3NydHBfYWRkX3NlcnZlcmhlbGxvKFNTTCAqc3NsLCBDQkIgKm91dCkgewotICBpZiAoc3NsLT5zcnRwX3Byb2ZpbGUgPT0gTlVMTCkgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgQ0JCIGNvbnRlbnRzLCBwcm9maWxlX2lkczsKLSAgaWYgKCFDQkJfYWRkX3UxNihvdXQsIFRMU0VYVF9UWVBFX3NydHApIHx8Ci0gICAgICAhQ0JCX2FkZF91MTZfbGVuZ3RoX3ByZWZpeGVkKG91dCwgJmNvbnRlbnRzKSB8fAotICAgICAgIUNCQl9hZGRfdTE2X2xlbmd0aF9wcmVmaXhlZCgmY29udGVudHMsICZwcm9maWxlX2lkcykgfHwKLSAgICAgICFDQkJfYWRkX3UxNigmcHJvZmlsZV9pZHMsIHNzbC0+c3J0cF9wcm9maWxlLT5pZCkgfHwKLSAgICAgICFDQkJfYWRkX3U4KCZjb250ZW50cywgMCAvKiBlbXB0eSBNS0kgKi8pIHx8Ci0gICAgICAhQ0JCX2ZsdXNoKG91dCkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJldHVybiAxOwotfQotCi0KLS8qIEVDIHBvaW50IGZvcm1hdHMuCi0gKgotICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ0OTIjc2VjdGlvbi01LjEuMiAqLwotCi1zdGF0aWMgaW50IHNzbF9hbnlfZWNfY2lwaGVyX3N1aXRlc19lbmFibGVkKGNvbnN0IFNTTCAqc3NsKSB7Ci0gIGlmIChzc2wtPnZlcnNpb24gPCBUTFMxX1ZFUlNJT04gJiYgIVNTTF9JU19EVExTKHNzbCkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGNvbnN0IFNUQUNLX09GKFNTTF9DSVBIRVIpICpjaXBoZXJfc3RhY2sgPSBTU0xfZ2V0X2NpcGhlcnMoc3NsKTsKLQotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IHNrX1NTTF9DSVBIRVJfbnVtKGNpcGhlcl9zdGFjayk7IGkrKykgewotICAgIGNvbnN0IFNTTF9DSVBIRVIgKmNpcGhlciA9IHNrX1NTTF9DSVBIRVJfdmFsdWUoY2lwaGVyX3N0YWNrLCBpKTsKLQotICAgIGNvbnN0IHVpbnQzMl90IGFsZ19rID0gY2lwaGVyLT5hbGdvcml0aG1fbWtleTsKLSAgICBjb25zdCB1aW50MzJfdCBhbGdfYSA9IGNpcGhlci0+YWxnb3JpdGhtX2F1dGg7Ci0gICAgaWYgKChhbGdfayAmIFNTTF9rRUNESEUpIHx8IChhbGdfYSAmIFNTTF9hRUNEU0EpKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBleHRfZWNfcG9pbnRfYWRkX2V4dGVuc2lvbihTU0wgKnNzbCwgQ0JCICpvdXQpIHsKLSAgQ0JCIGNvbnRlbnRzLCBmb3JtYXRzOwotICBpZiAoIUNCQl9hZGRfdTE2KG91dCwgVExTRVhUX1RZUEVfZWNfcG9pbnRfZm9ybWF0cykgfHwKLSAgICAgICFDQkJfYWRkX3UxNl9sZW5ndGhfcHJlZml4ZWQob3V0LCAmY29udGVudHMpIHx8Ci0gICAgICAhQ0JCX2FkZF91OF9sZW5ndGhfcHJlZml4ZWQoJmNvbnRlbnRzLCAmZm9ybWF0cykgfHwKLSAgICAgICFDQkJfYWRkX3U4KCZmb3JtYXRzLCBUTFNFWFRfRUNQT0lOVEZPUk1BVF91bmNvbXByZXNzZWQpIHx8Ci0gICAgICAhQ0JCX2ZsdXNoKG91dCkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGV4dF9lY19wb2ludF9hZGRfY2xpZW50aGVsbG8oU1NMICpzc2wsIENCQiAqb3V0KSB7Ci0gIGlmICghc3NsX2FueV9lY19jaXBoZXJfc3VpdGVzX2VuYWJsZWQoc3NsKSkgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcmV0dXJuIGV4dF9lY19wb2ludF9hZGRfZXh0ZW5zaW9uKHNzbCwgb3V0KTsKLX0KLQotc3RhdGljIGludCBleHRfZWNfcG9pbnRfcGFyc2Vfc2VydmVyaGVsbG8oU1NMICpzc2wsIHVpbnQ4X3QgKm91dF9hbGVydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCUyAqY29udGVudHMpIHsKLSAgaWYgKGNvbnRlbnRzID09IE5VTEwpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIENCUyBlY19wb2ludF9mb3JtYXRfbGlzdDsKLSAgaWYgKCFDQlNfZ2V0X3U4X2xlbmd0aF9wcmVmaXhlZChjb250ZW50cywgJmVjX3BvaW50X2Zvcm1hdF9saXN0KSB8fAotICAgICAgQ0JTX2xlbihjb250ZW50cykgIT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyogUGVyIFJGQyA0NDkyLCBzZWN0aW9uIDUuMS4yLCBpbXBsZW1lbnRhdGlvbnMgTVVTVCBzdXBwb3J0IHRoZSB1bmNvbXByZXNzZWQKLSAgICogcG9pbnQgZm9ybWF0LiAqLwotICBpZiAobWVtY2hyKENCU19kYXRhKCZlY19wb2ludF9mb3JtYXRfbGlzdCksIFRMU0VYVF9FQ1BPSU5URk9STUFUX3VuY29tcHJlc3NlZCwKLSAgICAgICAgICAgICBDQlNfbGVuKCZlY19wb2ludF9mb3JtYXRfbGlzdCkpID09IE5VTEwpIHsKLSAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X2VjX3BvaW50X3BhcnNlX2NsaWVudGhlbGxvKFNTTCAqc3NsLCB1aW50OF90ICpvdXRfYWxlcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQlMgKmNvbnRlbnRzKSB7Ci0gIHJldHVybiBleHRfZWNfcG9pbnRfcGFyc2Vfc2VydmVyaGVsbG8oc3NsLCBvdXRfYWxlcnQsIGNvbnRlbnRzKTsKLX0KLQotc3RhdGljIGludCBleHRfZWNfcG9pbnRfYWRkX3NlcnZlcmhlbGxvKFNTTCAqc3NsLCBDQkIgKm91dCkgewotICBjb25zdCB1aW50MzJfdCBhbGdfayA9IHNzbC0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fbWtleTsKLSAgY29uc3QgdWludDMyX3QgYWxnX2EgPSBzc2wtPnMzLT50bXAubmV3X2NpcGhlci0+YWxnb3JpdGhtX2F1dGg7Ci0gIGNvbnN0IGludCB1c2luZ19lY2MgPSAoYWxnX2sgJiBTU0xfa0VDREhFKSB8fCAoYWxnX2EgJiBTU0xfYUVDRFNBKTsKLQotICBpZiAoIXVzaW5nX2VjYykgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcmV0dXJuIGV4dF9lY19wb2ludF9hZGRfZXh0ZW5zaW9uKHNzbCwgb3V0KTsKLX0KLQotCi0vKiBFQyBzdXBwb3J0ZWQgY3VydmVzLgotICoKLSAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NDkyI3NlY3Rpb24tNS4xLjIgKi8KLQotc3RhdGljIHZvaWQgZXh0X2VjX2N1cnZlc19pbml0KFNTTCAqc3NsKSB7Ci0gIE9QRU5TU0xfZnJlZShzc2wtPnMzLT50bXAucGVlcl9lbGxpcHRpY2N1cnZlbGlzdCk7Ci0gIHNzbC0+czMtPnRtcC5wZWVyX2VsbGlwdGljY3VydmVsaXN0ID0gTlVMTDsKLSAgc3NsLT5zMy0+dG1wLnBlZXJfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoID0gMDsKLX0KLQotc3RhdGljIGludCBleHRfZWNfY3VydmVzX2FkZF9jbGllbnRoZWxsbyhTU0wgKnNzbCwgQ0JCICpvdXQpIHsKLSAgaWYgKCFzc2xfYW55X2VjX2NpcGhlcl9zdWl0ZXNfZW5hYmxlZChzc2wpKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBDQkIgY29udGVudHMsIGN1cnZlc19ieXRlczsKLSAgaWYgKCFDQkJfYWRkX3UxNihvdXQsIFRMU0VYVF9UWVBFX2VsbGlwdGljX2N1cnZlcykgfHwKLSAgICAgICFDQkJfYWRkX3UxNl9sZW5ndGhfcHJlZml4ZWQob3V0LCAmY29udGVudHMpIHx8Ci0gICAgICAhQ0JCX2FkZF91MTZfbGVuZ3RoX3ByZWZpeGVkKCZjb250ZW50cywgJmN1cnZlc19ieXRlcykpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGNvbnN0IHVpbnQxNl90ICpjdXJ2ZXM7Ci0gIHNpemVfdCBjdXJ2ZXNfbGVuOwotICB0bHMxX2dldF9jdXJ2ZWxpc3Qoc3NsLCAwLCAmY3VydmVzLCAmY3VydmVzX2xlbik7Ci0KLSAgc2l6ZV90IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBjdXJ2ZXNfbGVuOyBpKyspIHsKLSAgICBpZiAoIUNCQl9hZGRfdTE2KCZjdXJ2ZXNfYnl0ZXMsIGN1cnZlc1tpXSkpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBDQkJfZmx1c2gob3V0KTsKLX0KLQotc3RhdGljIGludCBleHRfZWNfY3VydmVzX3BhcnNlX3NlcnZlcmhlbGxvKFNTTCAqc3NsLCB1aW50OF90ICpvdXRfYWxlcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JTICpjb250ZW50cykgewotICAvKiBUaGlzIGV4dGVuc2lvbiBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgZWNob2VkIGJ5IHNlcnZlcnMgYW5kIGlzIGlnbm9yZWQuICovCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGV4dF9lY19jdXJ2ZXNfcGFyc2VfY2xpZW50aGVsbG8oU1NMICpzc2wsIHVpbnQ4X3QgKm91dF9hbGVydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQlMgKmNvbnRlbnRzKSB7Ci0gIGlmIChjb250ZW50cyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBDQlMgZWxsaXB0aWNfY3VydmVfbGlzdDsKLSAgaWYgKCFDQlNfZ2V0X3UxNl9sZW5ndGhfcHJlZml4ZWQoY29udGVudHMsICZlbGxpcHRpY19jdXJ2ZV9saXN0KSB8fAotICAgICAgQ0JTX2xlbigmZWxsaXB0aWNfY3VydmVfbGlzdCkgPT0gMCB8fAotICAgICAgKENCU19sZW4oJmVsbGlwdGljX2N1cnZlX2xpc3QpICYgMSkgIT0gMCB8fAotICAgICAgQ0JTX2xlbihjb250ZW50cykgIT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgc3NsLT5zMy0+dG1wLnBlZXJfZWxsaXB0aWNjdXJ2ZWxpc3QgPQotICAgICAgKHVpbnQxNl90ICopT1BFTlNTTF9tYWxsb2MoQ0JTX2xlbigmZWxsaXB0aWNfY3VydmVfbGlzdCkpOwotCi0gIGlmIChzc2wtPnMzLT50bXAucGVlcl9lbGxpcHRpY2N1cnZlbGlzdCA9PSBOVUxMKSB7Ci0gICAgKm91dF9hbGVydCA9IFNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGNvbnN0IHNpemVfdCBudW1fY3VydmVzID0gQ0JTX2xlbigmZWxsaXB0aWNfY3VydmVfbGlzdCkgLyAyOwotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9jdXJ2ZXM7IGkrKykgewotICAgIGlmICghQ0JTX2dldF91MTYoJmVsbGlwdGljX2N1cnZlX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAmc3NsLT5zMy0+dG1wLnBlZXJfZWxsaXB0aWNjdXJ2ZWxpc3RbaV0pKSB7Ci0gICAgICBnb3RvIGVycjsKLSAgICB9Ci0gIH0KLQotICBhc3NlcnQoQ0JTX2xlbigmZWxsaXB0aWNfY3VydmVfbGlzdCkgPT0gMCk7Ci0gIHNzbC0+czMtPnRtcC5wZWVyX2VsbGlwdGljY3VydmVsaXN0X2xlbmd0aCA9IG51bV9jdXJ2ZXM7Ci0KLSAgcmV0dXJuIDE7Ci0KLWVycjoKLSAgT1BFTlNTTF9mcmVlKHNzbC0+czMtPnRtcC5wZWVyX2VsbGlwdGljY3VydmVsaXN0KTsKLSAgc3NsLT5zMy0+dG1wLnBlZXJfZWxsaXB0aWNjdXJ2ZWxpc3QgPSBOVUxMOwotICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBleHRfZWNfY3VydmVzX2FkZF9zZXJ2ZXJoZWxsbyhTU0wgKnNzbCwgQ0JCICpvdXQpIHsKLSAgLyogU2VydmVycyBkb24ndCBlY2hvIHRoaXMgZXh0ZW5zaW9uLiAqLwotICByZXR1cm4gMTsKLX0KLQotCi0vKiBrRXh0ZW5zaW9ucyBjb250YWlucyBhbGwgdGhlIHN1cHBvcnRlZCBleHRlbnNpb25zLiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB0bHNfZXh0ZW5zaW9uIGtFeHRlbnNpb25zW10gPSB7Ci0gIHsKLSAgICAvKiBUaGUgcmVuZWdvdGlhdGlvbiBleHRlbnNpb24gbXVzdCBhbHdheXMgYmUgYXQgaW5kZXggemVybyBiZWNhdXNlIHRoZQotICAgICAqIHxyZWNlaXZlZHwgYW5kIHxzZW50fCBiaXRzZXRzIG5lZWQgdG8gYmUgdHdlYWtlZCB3aGVuIHRoZSAiZXh0ZW5zaW9uIiBpcwotICAgICAqIHNlbnQgYXMgYW4gU0NTVi4gKi8KLSAgICBUTFNFWFRfVFlQRV9yZW5lZ290aWF0ZSwKLSAgICBOVUxMLAotICAgIGV4dF9yaV9hZGRfY2xpZW50aGVsbG8sCi0gICAgZXh0X3JpX3BhcnNlX3NlcnZlcmhlbGxvLAotICAgIGV4dF9yaV9wYXJzZV9jbGllbnRoZWxsbywKLSAgICBleHRfcmlfYWRkX3NlcnZlcmhlbGxvLAotICB9LAotICB7Ci0gICAgVExTRVhUX1RZUEVfc2VydmVyX25hbWUsCi0gICAgZXh0X3NuaV9pbml0LAotICAgIGV4dF9zbmlfYWRkX2NsaWVudGhlbGxvLAotICAgIGV4dF9zbmlfcGFyc2Vfc2VydmVyaGVsbG8sCi0gICAgZXh0X3NuaV9wYXJzZV9jbGllbnRoZWxsbywKLSAgICBleHRfc25pX2FkZF9zZXJ2ZXJoZWxsbywKLSAgfSwKLSAgewotICAgIFRMU0VYVF9UWVBFX2V4dGVuZGVkX21hc3Rlcl9zZWNyZXQsCi0gICAgZXh0X2Vtc19pbml0LAotICAgIGV4dF9lbXNfYWRkX2NsaWVudGhlbGxvLAotICAgIGV4dF9lbXNfcGFyc2Vfc2VydmVyaGVsbG8sCi0gICAgZXh0X2Vtc19wYXJzZV9jbGllbnRoZWxsbywKLSAgICBleHRfZW1zX2FkZF9zZXJ2ZXJoZWxsbywKLSAgfSwKLSAgewotICAgIFRMU0VYVF9UWVBFX3Nlc3Npb25fdGlja2V0LAotICAgIE5VTEwsCi0gICAgZXh0X3RpY2tldF9hZGRfY2xpZW50aGVsbG8sCi0gICAgZXh0X3RpY2tldF9wYXJzZV9zZXJ2ZXJoZWxsbywKLSAgICBleHRfdGlja2V0X3BhcnNlX2NsaWVudGhlbGxvLAotICAgIGV4dF90aWNrZXRfYWRkX3NlcnZlcmhlbGxvLAotICB9LAotICB7Ci0gICAgVExTRVhUX1RZUEVfc2lnbmF0dXJlX2FsZ29yaXRobXMsCi0gICAgTlVMTCwKLSAgICBleHRfc2lnYWxnc19hZGRfY2xpZW50aGVsbG8sCi0gICAgZXh0X3NpZ2FsZ3NfcGFyc2Vfc2VydmVyaGVsbG8sCi0gICAgZXh0X3NpZ2FsZ3NfcGFyc2VfY2xpZW50aGVsbG8sCi0gICAgZXh0X3NpZ2FsZ3NfYWRkX3NlcnZlcmhlbGxvLAotICB9LAotICB7Ci0gICAgVExTRVhUX1RZUEVfc3RhdHVzX3JlcXVlc3QsCi0gICAgZXh0X29jc3BfaW5pdCwKLSAgICBleHRfb2NzcF9hZGRfY2xpZW50aGVsbG8sCi0gICAgZXh0X29jc3BfcGFyc2Vfc2VydmVyaGVsbG8sCi0gICAgZXh0X29jc3BfcGFyc2VfY2xpZW50aGVsbG8sCi0gICAgZXh0X29jc3BfYWRkX3NlcnZlcmhlbGxvLAotICB9LAotICB7Ci0gICAgVExTRVhUX1RZUEVfbmV4dF9wcm90b19uZWcsCi0gICAgZXh0X25wbl9pbml0LAotICAgIGV4dF9ucG5fYWRkX2NsaWVudGhlbGxvLAotICAgIGV4dF9ucG5fcGFyc2Vfc2VydmVyaGVsbG8sCi0gICAgZXh0X25wbl9wYXJzZV9jbGllbnRoZWxsbywKLSAgICBleHRfbnBuX2FkZF9zZXJ2ZXJoZWxsbywKLSAgfSwKLSAgewotICAgIFRMU0VYVF9UWVBFX2NlcnRpZmljYXRlX3RpbWVzdGFtcCwKLSAgICBOVUxMLAotICAgIGV4dF9zY3RfYWRkX2NsaWVudGhlbGxvLAotICAgIGV4dF9zY3RfcGFyc2Vfc2VydmVyaGVsbG8sCi0gICAgZXh0X3NjdF9wYXJzZV9jbGllbnRoZWxsbywKLSAgICBleHRfc2N0X2FkZF9zZXJ2ZXJoZWxsbywKLSAgfSwKLSAgewotICAgIFRMU0VYVF9UWVBFX2FwcGxpY2F0aW9uX2xheWVyX3Byb3RvY29sX25lZ290aWF0aW9uLAotICAgIGV4dF9hbHBuX2luaXQsCi0gICAgZXh0X2FscG5fYWRkX2NsaWVudGhlbGxvLAotICAgIGV4dF9hbHBuX3BhcnNlX3NlcnZlcmhlbGxvLAotICAgIGV4dF9hbHBuX3BhcnNlX2NsaWVudGhlbGxvLAotICAgIGV4dF9hbHBuX2FkZF9zZXJ2ZXJoZWxsbywKLSAgfSwKLSAgewotICAgIFRMU0VYVF9UWVBFX2NoYW5uZWxfaWQsCi0gICAgZXh0X2NoYW5uZWxfaWRfaW5pdCwKLSAgICBleHRfY2hhbm5lbF9pZF9hZGRfY2xpZW50aGVsbG8sCi0gICAgZXh0X2NoYW5uZWxfaWRfcGFyc2Vfc2VydmVyaGVsbG8sCi0gICAgZXh0X2NoYW5uZWxfaWRfcGFyc2VfY2xpZW50aGVsbG8sCi0gICAgZXh0X2NoYW5uZWxfaWRfYWRkX3NlcnZlcmhlbGxvLAotICB9LAotICB7Ci0gICAgVExTRVhUX1RZUEVfc3J0cCwKLSAgICBleHRfc3J0cF9pbml0LAotICAgIGV4dF9zcnRwX2FkZF9jbGllbnRoZWxsbywKLSAgICBleHRfc3J0cF9wYXJzZV9zZXJ2ZXJoZWxsbywKLSAgICBleHRfc3J0cF9wYXJzZV9jbGllbnRoZWxsbywKLSAgICBleHRfc3J0cF9hZGRfc2VydmVyaGVsbG8sCi0gIH0sCi0gIHsKLSAgICBUTFNFWFRfVFlQRV9lY19wb2ludF9mb3JtYXRzLAotICAgIE5VTEwsCi0gICAgZXh0X2VjX3BvaW50X2FkZF9jbGllbnRoZWxsbywKLSAgICBleHRfZWNfcG9pbnRfcGFyc2Vfc2VydmVyaGVsbG8sCi0gICAgZXh0X2VjX3BvaW50X3BhcnNlX2NsaWVudGhlbGxvLAotICAgIGV4dF9lY19wb2ludF9hZGRfc2VydmVyaGVsbG8sCi0gIH0sCi0gIHsKLSAgICBUTFNFWFRfVFlQRV9lbGxpcHRpY19jdXJ2ZXMsCi0gICAgZXh0X2VjX2N1cnZlc19pbml0LAotICAgIGV4dF9lY19jdXJ2ZXNfYWRkX2NsaWVudGhlbGxvLAotICAgIGV4dF9lY19jdXJ2ZXNfcGFyc2Vfc2VydmVyaGVsbG8sCi0gICAgZXh0X2VjX2N1cnZlc19wYXJzZV9jbGllbnRoZWxsbywKLSAgICBleHRfZWNfY3VydmVzX2FkZF9zZXJ2ZXJoZWxsbywKLSAgfSwKLX07Ci0KLSNkZWZpbmUga051bUV4dGVuc2lvbnMgKHNpemVvZihrRXh0ZW5zaW9ucykgLyBzaXplb2Yoc3RydWN0IHRsc19leHRlbnNpb24pKQotCi1PUEVOU1NMX0NPTVBJTEVfQVNTRVJUKGtOdW1FeHRlbnNpb25zIDw9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKChTU0wgKilOVUxMKS0+czMtPnRtcC5leHRlbnNpb25zLnNlbnQpICogOCwKLSAgICAgICAgICAgICAgICAgICAgICAgdG9vX21hbnlfZXh0ZW5zaW9uc19mb3Jfc2VudF9iaXRzZXQpOwotT1BFTlNTTF9DT01QSUxFX0FTU0VSVChrTnVtRXh0ZW5zaW9ucyA8PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCgoU1NMICopTlVMTCktPnMzLT50bXAuZXh0ZW5zaW9ucy5yZWNlaXZlZCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgIHRvb19tYW55X2V4dGVuc2lvbnNfZm9yX3JlY2VpdmVkX2JpdHNldCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGxzX2V4dGVuc2lvbiAqdGxzX2V4dGVuc2lvbl9maW5kKHVpbnQzMl90ICpvdXRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB2YWx1ZSkgewotICB1bnNpZ25lZCBpOwotICBmb3IgKGkgPSAwOyBpIDwga051bUV4dGVuc2lvbnM7IGkrKykgewotICAgIGlmIChrRXh0ZW5zaW9uc1tpXS52YWx1ZSA9PSB2YWx1ZSkgewotICAgICAgKm91dF9pbmRleCA9IGk7Ci0gICAgICByZXR1cm4gJmtFeHRlbnNpb25zW2ldOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi1pbnQgU1NMX2V4dGVuc2lvbl9zdXBwb3J0ZWQodW5zaWduZWQgZXh0ZW5zaW9uX3ZhbHVlKSB7Ci0gIHVpbnQzMl90IGluZGV4OwotICByZXR1cm4gZXh0ZW5zaW9uX3ZhbHVlID09IFRMU0VYVF9UWVBFX3BhZGRpbmcgfHwKLSAgICAgICAgIHRsc19leHRlbnNpb25fZmluZCgmaW5kZXgsIGV4dGVuc2lvbl92YWx1ZSkgIT0gTlVMTDsKLX0KLQogLyogaGVhZGVyX2xlbiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBDbGllbnRIZWxsbyBoZWFkZXIgd3JpdHRlbiBzbyBmYXIsIHVzZWQgdG8KICAqIGNvbXB1dGUgcGFkZGluZy4gSXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgcmVjb3JkIGhlYWRlci4gUGFzcyAwIGlmIG5vIHBhZGRpbmcKICAqIGlzIHRvIGJlIGRvbmUuICovCi11aW50OF90ICpzc2xfYWRkX2NsaWVudGhlbGxvX3Rsc2V4dChTU0wgKnMsIHVpbnQ4X3QgKmNvbnN0IGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmNvbnN0IGxpbWl0LCBzaXplX3QgaGVhZGVyX2xlbikgewordWludDhfdCAqc3NsX2FkZF9jbGllbnRoZWxsb190bHNleHQoU1NMICpzLCB1aW50OF90ICpidWYsIHVpbnQ4X3QgKmxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGhlYWRlcl9sZW4pIHsKKyAgaW50IGV4dGRhdGFsZW4gPSAwOworICB1aW50OF90ICpyZXQgPSBidWY7CisgIHVpbnQ4X3QgKm9yaWcgPSBidWY7CisgIC8qIFNlZSBpZiB3ZSBzdXBwb3J0IGFueSBFQ0MgY2lwaGVyc3VpdGVzICovCisgIGludCB1c2luZ19lY2MgPSAwOworCisgIGlmIChzLT52ZXJzaW9uID49IFRMUzFfVkVSU0lPTiB8fCBTU0xfSVNfRFRMUyhzKSkgeworICAgIHNpemVfdCBpOworICAgIHVpbnQzMl90IGFsZ19rLCBhbGdfYTsKKyAgICBTVEFDS19PRihTU0xfQ0lQSEVSKSAqY2lwaGVyX3N0YWNrID0gU1NMX2dldF9jaXBoZXJzKHMpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNrX1NTTF9DSVBIRVJfbnVtKGNpcGhlcl9zdGFjayk7IGkrKykgeworICAgICAgY29uc3QgU1NMX0NJUEhFUiAqYyA9IHNrX1NTTF9DSVBIRVJfdmFsdWUoY2lwaGVyX3N0YWNrLCBpKTsKKworICAgICAgYWxnX2sgPSBjLT5hbGdvcml0aG1fbWtleTsKKyAgICAgIGFsZ19hID0gYy0+YWxnb3JpdGhtX2F1dGg7CisgICAgICBpZiAoKGFsZ19rICYgU1NMX2tFQ0RIRSkgfHwgKGFsZ19hICYgU1NMX2FFQ0RTQSkpIHsKKyAgICAgICAgdXNpbmdfZWNjID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKICAgLyogZG9uJ3QgYWRkIGV4dGVuc2lvbnMgZm9yIFNTTHYzIHVubGVzcyBkb2luZyBzZWN1cmUgcmVuZWdvdGlhdGlvbiAqLwogICBpZiAocy0+Y2xpZW50X3ZlcnNpb24gPT0gU1NMM19WRVJTSU9OICYmICFzLT5zMy0+c2VuZF9jb25uZWN0aW9uX2JpbmRpbmcpIHsKLSAgICByZXR1cm4gYnVmOworICAgIHJldHVybiBvcmlnOwogICB9CiAKLSAgQ0JCIGNiYiwgZXh0ZW5zaW9uczsKLSAgQ0JCX3plcm8oJmNiYik7Ci0gIGlmICghQ0JCX2luaXRfZml4ZWQoJmNiYiwgYnVmLCBsaW1pdCAtIGJ1ZikgfHwKLSAgICAgICFDQkJfYWRkX3UxNl9sZW5ndGhfcHJlZml4ZWQoJmNiYiwgJmV4dGVuc2lvbnMpKSB7Ci0gICAgZ290byBlcnI7CisgIHJldCArPSAyOworCisgIGlmIChyZXQgPj0gbGltaXQpIHsKKyAgICByZXR1cm4gTlVMTDsgLyogc2hvdWxkIG5ldmVyIG9jY3VyLiAqLwogICB9CiAKLSAgcy0+czMtPnRtcC5leHRlbnNpb25zLnNlbnQgPSAwOwotICBzLT5zMy0+dG1wLmN1c3RvbV9leHRlbnNpb25zLnNlbnQgPSAwOworICBpZiAocy0+dGxzZXh0X2hvc3RuYW1lICE9IE5VTEwpIHsKKyAgICAvKiBBZGQgVExTIGV4dGVuc2lvbiBzZXJ2ZXJuYW1lIHRvIHRoZSBDbGllbnQgSGVsbG8gbWVzc2FnZSAqLworICAgIHVuc2lnbmVkIGxvbmcgc2l6ZV9zdHI7CisgICAgbG9uZyBsZW5tYXg7CiAKLSAgc2l6ZV90IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBrTnVtRXh0ZW5zaW9uczsgaSsrKSB7Ci0gICAgaWYgKGtFeHRlbnNpb25zW2ldLmluaXQgIT0gTlVMTCkgewotICAgICAga0V4dGVuc2lvbnNbaV0uaW5pdChzKTsKKyAgICAvKiBjaGVjayBmb3IgZW5vdWdoIHNwYWNlLgorICAgICAgIDQgZm9yIHRoZSBzZXJ2ZXJuYW1lIHR5cGUgYW5kIGVudGVuc2lvbiBsZW5ndGgKKyAgICAgICAyIGZvciBzZXJ2ZXJuYW1lbGlzdCBsZW5ndGgKKyAgICAgICAxIGZvciB0aGUgaG9zdG5hbWUgdHlwZQorICAgICAgIDIgZm9yIGhvc3RuYW1lIGxlbmd0aAorICAgICAgICsgaG9zdG5hbWUgbGVuZ3RoICovCisKKyAgICBsZW5tYXggPSBsaW1pdCAtIHJldCAtIDk7CisgICAgc2l6ZV9zdHIgPSBzdHJsZW4ocy0+dGxzZXh0X2hvc3RuYW1lKTsKKyAgICBpZiAobGVubWF4IDwgMCB8fCBzaXplX3N0ciA+ICh1bnNpZ25lZCBsb25nKWxlbm1heCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogZXh0ZW5zaW9uIHR5cGUgYW5kIGxlbmd0aCAqLworICAgIHMybihUTFNFWFRfVFlQRV9zZXJ2ZXJfbmFtZSwgcmV0KTsKKyAgICBzMm4oc2l6ZV9zdHIgKyA1LCByZXQpOworCisgICAgLyogbGVuZ3RoIG9mIHNlcnZlcm5hbWUgbGlzdCAqLworICAgIHMybihzaXplX3N0ciArIDMsIHJldCk7CisKKyAgICAvKiBob3N0bmFtZSB0eXBlLCBsZW5ndGggYW5kIGhvc3RuYW1lICovCisgICAgKihyZXQrKykgPSAodWludDhfdClUTFNFWFRfTkFNRVRZUEVfaG9zdF9uYW1lOworICAgIHMybihzaXplX3N0ciwgcmV0KTsKKyAgICBtZW1jcHkocmV0LCBzLT50bHNleHRfaG9zdG5hbWUsIHNpemVfc3RyKTsKKyAgICByZXQgKz0gc2l6ZV9zdHI7CisgIH0KKworICAvKiBBZGQgUkkgaWYgcmVuZWdvdGlhdGluZyAqLworICBpZiAocy0+czMtPmluaXRpYWxfaGFuZHNoYWtlX2NvbXBsZXRlKSB7CisgICAgaW50IGVsOworCisgICAgaWYgKCFzc2xfYWRkX2NsaWVudGhlbGxvX3JlbmVnb3RpYXRlX2V4dChzLCAwLCAmZWwsIDApKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9hZGRfY2xpZW50aGVsbG9fdGxzZXh0LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoKGxpbWl0IC0gcmV0IC0gNCAtIGVsKSA8IDApIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHMybihUTFNFWFRfVFlQRV9yZW5lZ290aWF0ZSwgcmV0KTsKKyAgICBzMm4oZWwsIHJldCk7CisKKyAgICBpZiAoIXNzbF9hZGRfY2xpZW50aGVsbG9fcmVuZWdvdGlhdGVfZXh0KHMsIHJldCwgJmVsLCBlbCkpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX2FkZF9jbGllbnRoZWxsb190bHNleHQsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldCArPSBlbDsKKyAgfQorCisgIC8qIEFkZCBleHRlbmRlZCBtYXN0ZXIgc2VjcmV0LiAqLworICBpZiAocy0+dmVyc2lvbiAhPSBTU0wzX1ZFUlNJT04pIHsKKyAgICBpZiAobGltaXQgLSByZXQgLSA0IDwgMCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHMybihUTFNFWFRfVFlQRV9leHRlbmRlZF9tYXN0ZXJfc2VjcmV0LCByZXQpOworICAgIHMybigwLCByZXQpOworICB9CisKKyAgaWYgKCEoU1NMX2dldF9vcHRpb25zKHMpICYgU1NMX09QX05PX1RJQ0tFVCkpIHsKKyAgICBpbnQgdGlja2xlbiA9IDA7CisgICAgLyogUmVuZWdvdGlhdGlvbiBkb2VzIG5vdCBwYXJ0aWNpcGF0ZSBpbiBzZXNzaW9uIHJlc3VtcHRpb24uIEhvd2V2ZXIsIHN0aWxsCisgICAgICogYWR2ZXJ0aXNlIHRoZSBleHRlbnNpb24gdG8gYXZvaWQgcG90ZW50aWFsbHkgYnJlYWtpbmcgc2VydmVycyB3aGljaCBjYXJyeQorICAgICAqIG92ZXIgdGhlIHN0YXRlIGZyb20gdGhlIHByZXZpb3VzIGhhbmRzaGFrZSwgc3VjaCBhcyBPcGVuU1NMIHNlcnZlcnMKKyAgICAgKiB3aXRob3V0IHVwc3RyZWFtJ3MgM2MzZjAyNTkyMzg1OTRkNzcyNjRhNzg5NDRkNDA5ZjIxMjc2NDJjNC4gKi8KKyAgICBpZiAoIXMtPnMzLT5pbml0aWFsX2hhbmRzaGFrZV9jb21wbGV0ZSAmJiBzLT5zZXNzaW9uICE9IE5VTEwgJiYKKyAgICAgICAgcy0+c2Vzc2lvbi0+dGxzZXh0X3RpY2sgIT0gTlVMTCkgeworICAgICAgdGlja2xlbiA9IHMtPnNlc3Npb24tPnRsc2V4dF90aWNrbGVuOworICAgIH0KKworICAgIC8qIENoZWNrIGZvciBlbm91Z2ggcm9vbSAyIGZvciBleHRlbnNpb24gdHlwZSwgMiBmb3IgbGVuIHJlc3QgZm9yCisgICAgICogdGlja2V0LiAqLworICAgIGlmICgobG9uZykobGltaXQgLSByZXQgLSA0IC0gdGlja2xlbikgPCAwKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgczJuKFRMU0VYVF9UWVBFX3Nlc3Npb25fdGlja2V0LCByZXQpOworICAgIHMybih0aWNrbGVuLCByZXQpOworICAgIGlmICh0aWNrbGVuKSB7CisgICAgICBtZW1jcHkocmV0LCBzLT5zZXNzaW9uLT50bHNleHRfdGljaywgdGlja2xlbik7CisgICAgICByZXQgKz0gdGlja2xlbjsKICAgICB9CiAgIH0KIAotICBmb3IgKGkgPSAwOyBpIDwga051bUV4dGVuc2lvbnM7IGkrKykgewotICAgIGNvbnN0IHNpemVfdCBsZW5fYmVmb3JlID0gQ0JCX2xlbigmZXh0ZW5zaW9ucyk7Ci0gICAgaWYgKCFrRXh0ZW5zaW9uc1tpXS5hZGRfY2xpZW50aGVsbG8ocywgJmV4dGVuc2lvbnMpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0VSUk9SX0FERElOR19FWFRFTlNJT04pOwotICAgICAgRVJSX2FkZF9lcnJvcl9kYXRhZigiZXh0ZW5zaW9uOiAldSIsICh1bnNpZ25lZClrRXh0ZW5zaW9uc1tpXS52YWx1ZSk7Ci0gICAgICBnb3RvIGVycjsKKyAgaWYgKHNzbDNfdmVyc2lvbl9mcm9tX3dpcmUocywgcy0+Y2xpZW50X3ZlcnNpb24pID49IFRMUzFfMl9WRVJTSU9OKSB7CisgICAgc2l6ZV90IHNhbGdsZW47CisgICAgY29uc3QgdWludDhfdCAqc2FsZzsKKyAgICBzYWxnbGVuID0gdGxzMTJfZ2V0X3BzaWdhbGdzKHMsICZzYWxnKTsKKyAgICBpZiAoKHNpemVfdCkobGltaXQgLSByZXQpIDwgc2FsZ2xlbiArIDYpIHsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLQotICAgIGlmIChDQkJfbGVuKCZleHRlbnNpb25zKSAhPSBsZW5fYmVmb3JlKSB7Ci0gICAgICBzLT5zMy0+dG1wLmV4dGVuc2lvbnMuc2VudCB8PSAoMXUgPDwgaSk7Ci0gICAgfQorICAgIHMybihUTFNFWFRfVFlQRV9zaWduYXR1cmVfYWxnb3JpdGhtcywgcmV0KTsKKyAgICBzMm4oc2FsZ2xlbiArIDIsIHJldCk7CisgICAgczJuKHNhbGdsZW4sIHJldCk7CisgICAgbWVtY3B5KHJldCwgc2FsZywgc2FsZ2xlbik7CisgICAgcmV0ICs9IHNhbGdsZW47CiAgIH0KIAotICBpZiAoIWN1c3RvbV9leHRfYWRkX2NsaWVudGhlbGxvKHMsICZleHRlbnNpb25zKSkgewotICAgIGdvdG8gZXJyOworICBpZiAocy0+b2NzcF9zdGFwbGluZ19lbmFibGVkKSB7CisgICAgLyogVGhlIHN0YXR1c19yZXF1ZXN0IGV4dGVuc2lvbiBpcyBleGNlc3NpdmVseSBleHRlbnNpYmxlIGF0IGV2ZXJ5IGxheWVyLgorICAgICAqIE9uIHRoZSBjbGllbnQsIG9ubHkgc3VwcG9ydCByZXF1ZXN0aW5nIE9DU1AgcmVzcG9uc2VzIHdpdGggYW4gZW1wdHkKKyAgICAgKiByZXNwb25kZXJfaWRfbGlzdCBhbmQgbm8gZXh0ZW5zaW9ucy4gKi8KKyAgICBpZiAobGltaXQgLSByZXQgLSA0IC0gMSAtIDIgLSAyIDwgMCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgczJuKFRMU0VYVF9UWVBFX3N0YXR1c19yZXF1ZXN0LCByZXQpOworICAgIHMybigxICsgMiArIDIsIHJldCk7CisgICAgLyogc3RhdHVzX3R5cGUgKi8KKyAgICAqKHJldCsrKSA9IFRMU0VYVF9TVEFUVVNUWVBFX29jc3A7CisgICAgLyogcmVzcG9uZGVyX2lkX2xpc3QgLSBlbXB0eSAqLworICAgIHMybigwLCByZXQpOworICAgIC8qIHJlcXVlc3RfZXh0ZW5zaW9ucyAtIGVtcHR5ICovCisgICAgczJuKDAsIHJldCk7CisgIH0KKworICBpZiAocy0+Y3R4LT5uZXh0X3Byb3RvX3NlbGVjdF9jYiAmJiAhcy0+czMtPmluaXRpYWxfaGFuZHNoYWtlX2NvbXBsZXRlICYmCisgICAgICAhU1NMX0lTX0RUTFMocykpIHsKKyAgICAvKiBUaGUgY2xpZW50IGFkdmVydGlzZXMgYW4gZW10cHkgZXh0ZW5zaW9uIHRvIGluZGljYXRlIGl0cyBzdXBwb3J0IGZvcgorICAgICAqIE5leHQgUHJvdG9jb2wgTmVnb3RpYXRpb24gKi8KKyAgICBpZiAobGltaXQgLSByZXQgLSA0IDwgMCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHMybihUTFNFWFRfVFlQRV9uZXh0X3Byb3RvX25lZywgcmV0KTsKKyAgICBzMm4oMCwgcmV0KTsKKyAgfQorCisgIGlmIChzLT5zaWduZWRfY2VydF90aW1lc3RhbXBzX2VuYWJsZWQpIHsKKyAgICAvKiBUaGUgY2xpZW50IGFkdmVydGlzZXMgYW4gZW1wdHkgZXh0ZW5zaW9uIHRvIGluZGljYXRlIGl0cyBzdXBwb3J0IGZvcgorICAgICAqIGNlcnRpZmljYXRlIHRpbWVzdGFtcHMuICovCisgICAgaWYgKGxpbWl0IC0gcmV0IC0gNCA8IDApIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzMm4oVExTRVhUX1RZUEVfY2VydGlmaWNhdGVfdGltZXN0YW1wLCByZXQpOworICAgIHMybigwLCByZXQpOworICB9CisKKyAgaWYgKHMtPmFscG5fY2xpZW50X3Byb3RvX2xpc3QgJiYgIXMtPnMzLT5pbml0aWFsX2hhbmRzaGFrZV9jb21wbGV0ZSkgeworICAgIGlmICgoc2l6ZV90KShsaW1pdCAtIHJldCkgPCA2ICsgcy0+YWxwbl9jbGllbnRfcHJvdG9fbGlzdF9sZW4pIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzMm4oVExTRVhUX1RZUEVfYXBwbGljYXRpb25fbGF5ZXJfcHJvdG9jb2xfbmVnb3RpYXRpb24sIHJldCk7CisgICAgczJuKDIgKyBzLT5hbHBuX2NsaWVudF9wcm90b19saXN0X2xlbiwgcmV0KTsKKyAgICBzMm4ocy0+YWxwbl9jbGllbnRfcHJvdG9fbGlzdF9sZW4sIHJldCk7CisgICAgbWVtY3B5KHJldCwgcy0+YWxwbl9jbGllbnRfcHJvdG9fbGlzdCwgcy0+YWxwbl9jbGllbnRfcHJvdG9fbGlzdF9sZW4pOworICAgIHJldCArPSBzLT5hbHBuX2NsaWVudF9wcm90b19saXN0X2xlbjsKKyAgfQorCisgIGlmIChzLT50bHNleHRfY2hhbm5lbF9pZF9lbmFibGVkICYmICFTU0xfSVNfRFRMUyhzKSkgeworICAgIC8qIFRoZSBjbGllbnQgYWR2ZXJ0aXNlcyBhbiBlbXRweSBleHRlbnNpb24gdG8gaW5kaWNhdGUgaXRzIHN1cHBvcnQgZm9yCisgICAgICogQ2hhbm5lbCBJRC4gKi8KKyAgICBpZiAobGltaXQgLSByZXQgLSA0IDwgMCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzLT5jdHgtPnRsc2V4dF9jaGFubmVsX2lkX2VuYWJsZWRfbmV3KSB7CisgICAgICBzMm4oVExTRVhUX1RZUEVfY2hhbm5lbF9pZF9uZXcsIHJldCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHMybihUTFNFWFRfVFlQRV9jaGFubmVsX2lkLCByZXQpOworICAgIH0KKyAgICBzMm4oMCwgcmV0KTsKKyAgfQorCisgIGlmIChTU0xfZ2V0X3NydHBfcHJvZmlsZXMocykpIHsKKyAgICBpbnQgZWw7CisKKyAgICBzc2xfYWRkX2NsaWVudGhlbGxvX3VzZV9zcnRwX2V4dChzLCAwLCAmZWwsIDApOworCisgICAgaWYgKChsaW1pdCAtIHJldCAtIDQgLSBlbCkgPCAwKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzMm4oVExTRVhUX1RZUEVfdXNlX3NydHAsIHJldCk7CisgICAgczJuKGVsLCByZXQpOworCisgICAgaWYgKCFzc2xfYWRkX2NsaWVudGhlbGxvX3VzZV9zcnRwX2V4dChzLCByZXQsICZlbCwgZWwpKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9hZGRfY2xpZW50aGVsbG9fdGxzZXh0LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0ICs9IGVsOworICB9CisKKyAgaWYgKHVzaW5nX2VjYykgeworICAgIC8qIEFkZCBUTFMgZXh0ZW5zaW9uIEVDUG9pbnRGb3JtYXRzIHRvIHRoZSBDbGllbnRIZWxsbyBtZXNzYWdlICovCisgICAgbG9uZyBsZW5tYXg7CisgICAgY29uc3QgdWludDhfdCAqZm9ybWF0czsKKyAgICBjb25zdCB1aW50MTZfdCAqY3VydmVzOworICAgIHNpemVfdCBmb3JtYXRzX2xlbiwgY3VydmVzX2xlbiwgaTsKKworICAgIHRsczFfZ2V0X2Zvcm1hdGxpc3QocywgJmZvcm1hdHMsICZmb3JtYXRzX2xlbik7CisKKyAgICBsZW5tYXggPSBsaW1pdCAtIHJldCAtIDU7CisgICAgaWYgKGxlbm1heCA8IDApIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZm9ybWF0c19sZW4gPiAoc2l6ZV90KWxlbm1heCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChmb3JtYXRzX2xlbiA+IDI1NSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfYWRkX2NsaWVudGhlbGxvX3Rsc2V4dCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgczJuKFRMU0VYVF9UWVBFX2VjX3BvaW50X2Zvcm1hdHMsIHJldCk7CisgICAgczJuKGZvcm1hdHNfbGVuICsgMSwgcmV0KTsKKyAgICAqKHJldCsrKSA9ICh1aW50OF90KWZvcm1hdHNfbGVuOworICAgIG1lbWNweShyZXQsIGZvcm1hdHMsIGZvcm1hdHNfbGVuKTsKKyAgICByZXQgKz0gZm9ybWF0c19sZW47CisKKyAgICAvKiBBZGQgVExTIGV4dGVuc2lvbiBFbGxpcHRpY0N1cnZlcyB0byB0aGUgQ2xpZW50SGVsbG8gbWVzc2FnZSAqLworICAgIHRsczFfZ2V0X2N1cnZlbGlzdChzLCAwLCAmY3VydmVzLCAmY3VydmVzX2xlbik7CisKKyAgICBsZW5tYXggPSBsaW1pdCAtIHJldCAtIDY7CisgICAgaWYgKGxlbm1heCA8IDApIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoY3VydmVzX2xlbiAqIDIgPiAoc2l6ZV90KWxlbm1heCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChjdXJ2ZXNfbGVuICogMiA+IDY1NTMyKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9hZGRfY2xpZW50aGVsbG9fdGxzZXh0LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzMm4oVExTRVhUX1RZUEVfZWxsaXB0aWNfY3VydmVzLCByZXQpOworICAgIHMybigoY3VydmVzX2xlbiAqIDIpICsgMiwgcmV0KTsKKworICAgIHMybihjdXJ2ZXNfbGVuICogMiwgcmV0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3VydmVzX2xlbjsgaSsrKSB7CisgICAgICBzMm4oY3VydmVzW2ldLCByZXQpOworICAgIH0KICAgfQogCiAgIGlmIChoZWFkZXJfbGVuID4gMCkgewotICAgIGhlYWRlcl9sZW4gKz0gQ0JCX2xlbigmZXh0ZW5zaW9ucyk7CisgICAgc2l6ZV90IGNsaWVudGhlbGxvX21pbnNpemUgPSAwOworICAgIGhlYWRlcl9sZW4gKz0gcmV0IC0gb3JpZzsKICAgICBpZiAoaGVhZGVyX2xlbiA+IDB4ZmYgJiYgaGVhZGVyX2xlbiA8IDB4MjAwKSB7CiAgICAgICAvKiBBZGQgcGFkZGluZyB0byB3b3JrYXJvdW5kIGJ1Z3MgaW4gRjUgdGVybWluYXRvcnMuIFNlZQogICAgICAgICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWFnbC10bHMtcGFkZGluZy0wMwogICAgICAgICoKICAgICAgICAqIE5COiBiZWNhdXNlIHRoaXMgY29kZSB3b3JrcyBvdXQgdGhlIGxlbmd0aCBvZiBhbGwgZXhpc3RpbmcgZXh0ZW5zaW9ucwogICAgICAgICogaXQgTVVTVCBhbHdheXMgYXBwZWFyIGxhc3QuICovCi0gICAgICBzaXplX3QgcGFkZGluZ19sZW4gPSAweDIwMCAtIGhlYWRlcl9sZW47CisgICAgICBjbGllbnRoZWxsb19taW5zaXplID0gMHgyMDA7CisgICAgfQorICAgIGlmIChzLT5mYXN0cmFkaW9fcGFkZGluZykgeworICAgICAgLyogUGFkIHRoZSBDbGllbnRIZWxsbyByZWNvcmQgdG8gMTAyNCBieXRlcyB0byBmYXN0IGZvcndhcmQgdGhlIHJhZGlvCisgICAgICAgKiBpbnRvIERDSCAoaGlnaCBkYXRhIHJhdGUpIHN0YXRlIGluIDNHIG5ldHdvcmtzLiBOb3RlIHRoYXQgd2hlbgorICAgICAgICogZmFzdHJhZGlvX3BhZGRpbmcgaXMgZW5hYmxlZCwgZXZlbiBpZiB0aGUgaGVhZGVyX2xlbiBpcyBsZXNzIHRoYW4gMjU1CisgICAgICAgKiBieXRlcywgdGhlIHBhZGRpbmcgd2lsbCBiZSBhcHBsaWVkIHJlZ2FyZGxlc3MuIFRoaXMgaXMgc2xpZ2h0bHkKKyAgICAgICAqIGRpZmZlcmVudCBmcm9tIHRoZSBUTFMgcGFkZGluZyBleHRlbnNpb24gc3VnZ2VzdGVkIGluCisgICAgICAgKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtYWdsLXRscy1wYWRkaW5nLTAzICovCisgICAgICBjbGllbnRoZWxsb19taW5zaXplID0gMHg0MDA7CisgICAgfQorICAgIGlmIChoZWFkZXJfbGVuIDwgY2xpZW50aGVsbG9fbWluc2l6ZSkgeworICAgICAgc2l6ZV90IHBhZGRpbmdfbGVuID0gY2xpZW50aGVsbG9fbWluc2l6ZSAtIGhlYWRlcl9sZW47CiAgICAgICAvKiBFeHRlbnNpb25zIHRha2UgYXQgbGVhc3QgZm91ciBieXRlcyB0byBlbmNvZGUuIEFsd2F5cyBpbmNsdWRlIGxlYXN0CiAgICAgICAgKiBvbmUgYnl0ZSBvZiBkYXRhIGlmIGluY2x1ZGluZyB0aGUgZXh0ZW5zaW9uLiBXZWJTcGhlcmUgQXBwbGljYXRpb24KICAgICAgICAqIFNlcnZlciA3LjAgaXMgaW50b2xlcmFudCB0byB0aGUgbGFzdCBleHRlbnNpb24gYmVpbmcgemVyby1sZW5ndGguICovCkBAIC0yMjkwLDE2NCArMTEwNiw1NDcgQEAKICAgICAgICAgcGFkZGluZ19sZW4gPSAxOwogICAgICAgfQogCi0gICAgICB1aW50OF90ICpwYWRkaW5nX2J5dGVzOwotICAgICAgaWYgKCFDQkJfYWRkX3UxNigmZXh0ZW5zaW9ucywgVExTRVhUX1RZUEVfcGFkZGluZykgfHwKLSAgICAgICAgICAhQ0JCX2FkZF91MTYoJmV4dGVuc2lvbnMsIHBhZGRpbmdfbGVuKSB8fAotICAgICAgICAgICFDQkJfYWRkX3NwYWNlKCZleHRlbnNpb25zLCAmcGFkZGluZ19ieXRlcywgcGFkZGluZ19sZW4pKSB7Ci0gICAgICAgIGdvdG8gZXJyOworICAgICAgaWYgKGxpbWl0IC0gcmV0IC0gNCAtIChsb25nKXBhZGRpbmdfbGVuIDwgMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgIH0KIAotICAgICAgbWVtc2V0KHBhZGRpbmdfYnl0ZXMsIDAsIHBhZGRpbmdfbGVuKTsKKyAgICAgIHMybihUTFNFWFRfVFlQRV9wYWRkaW5nLCByZXQpOworICAgICAgczJuKHBhZGRpbmdfbGVuLCByZXQpOworICAgICAgbWVtc2V0KHJldCwgMCwgcGFkZGluZ19sZW4pOworICAgICAgcmV0ICs9IHBhZGRpbmdfbGVuOwogICAgIH0KICAgfQogCi0gIGlmICghQ0JCX2ZsdXNoKCZjYmIpKSB7Ci0gICAgZ290byBlcnI7CisgIGV4dGRhdGFsZW4gPSByZXQgLSBvcmlnIC0gMjsKKyAgaWYgKGV4dGRhdGFsZW4gPT0gMCkgeworICAgIHJldHVybiBvcmlnOwogICB9CiAKLSAgdWludDhfdCAqcmV0ID0gYnVmOwotICBjb25zdCBzaXplX3QgY2JiX2xlbiA9IENCQl9sZW4oJmNiYik7Ci0gIC8qIElmIG9ubHkgdHdvIGJ5dGVzIGhhdmUgYmVlbiB3cml0dGVuIHRoZW4gdGhlIGV4dGVuc2lvbnMgYXJlIGFjdHVhbGx5IGVtcHR5Ci0gICAqIGFuZCB0aG9zZSB0d28gYnl0ZXMgYXJlIHRoZSB6ZXJvIGxlbmd0aC4gSW4gdGhhdCBjYXNlLCB3ZSBkb24ndCBib3RoZXIKLSAgICogc2VuZGluZyB0aGUgZXh0ZW5zaW9ucyBsZW5ndGguICovCi0gIGlmIChjYmJfbGVuID4gMikgewotICAgIHJldCArPSBjYmJfbGVuOwotICB9Ci0KLSAgQ0JCX2NsZWFudXAoJmNiYik7CisgIHMybihleHRkYXRhbGVuLCBvcmlnKTsKICAgcmV0dXJuIHJldDsKLQotZXJyOgotICBDQkJfY2xlYW51cCgmY2JiKTsKLSAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7Ci0gIHJldHVybiBOVUxMOwogfQogCi11aW50OF90ICpzc2xfYWRkX3NlcnZlcmhlbGxvX3Rsc2V4dChTU0wgKnMsIHVpbnQ4X3QgKmNvbnN0IGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmNvbnN0IGxpbWl0KSB7Cit1aW50OF90ICpzc2xfYWRkX3NlcnZlcmhlbGxvX3Rsc2V4dChTU0wgKnMsIHVpbnQ4X3QgKmJ1ZiwgdWludDhfdCAqbGltaXQpIHsKKyAgaW50IGV4dGRhdGFsZW4gPSAwOworICB1aW50OF90ICpvcmlnID0gYnVmOworICB1aW50OF90ICpyZXQgPSBidWY7CisgIGludCBuZXh0X3Byb3RvX25lZ19zZWVuOworICB1aW50MzJfdCBhbGdfayA9IHMtPnMzLT50bXAubmV3X2NpcGhlci0+YWxnb3JpdGhtX21rZXk7CisgIHVpbnQzMl90IGFsZ19hID0gcy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fYXV0aDsKKyAgaW50IHVzaW5nX2VjYyA9IChhbGdfayAmIFNTTF9rRUNESEUpIHx8IChhbGdfYSAmIFNTTF9hRUNEU0EpOworICB1c2luZ19lY2MgPSB1c2luZ19lY2MgJiYgKHMtPnMzLT50bXAucGVlcl9lY3BvaW50Zm9ybWF0bGlzdCAhPSBOVUxMKTsKKwogICAvKiBkb24ndCBhZGQgZXh0ZW5zaW9ucyBmb3IgU1NMdjMsIHVubGVzcyBkb2luZyBzZWN1cmUgcmVuZWdvdGlhdGlvbiAqLwogICBpZiAocy0+dmVyc2lvbiA9PSBTU0wzX1ZFUlNJT04gJiYgIXMtPnMzLT5zZW5kX2Nvbm5lY3Rpb25fYmluZGluZykgewotICAgIHJldHVybiBidWY7CisgICAgcmV0dXJuIG9yaWc7CiAgIH0KIAotICBDQkIgY2JiLCBleHRlbnNpb25zOwotICBDQkJfemVybygmY2JiKTsKLSAgaWYgKCFDQkJfaW5pdF9maXhlZCgmY2JiLCBidWYsIGxpbWl0IC0gYnVmKSB8fAotICAgICAgIUNCQl9hZGRfdTE2X2xlbmd0aF9wcmVmaXhlZCgmY2JiLCAmZXh0ZW5zaW9ucykpIHsKLSAgICBnb3RvIGVycjsKKyAgcmV0ICs9IDI7CisgIGlmIChyZXQgPj0gbGltaXQpIHsKKyAgICByZXR1cm4gTlVMTDsgLyogc2hvdWxkIG5ldmVyIGhhcHBlbi4gKi8KICAgfQogCi0gIHVuc2lnbmVkIGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBrTnVtRXh0ZW5zaW9uczsgaSsrKSB7Ci0gICAgaWYgKCEocy0+czMtPnRtcC5leHRlbnNpb25zLnJlY2VpdmVkICYgKDF1IDw8IGkpKSkgewotICAgICAgLyogRG9uJ3Qgc2VuZCBleHRlbnNpb25zIHRoYXQgd2VyZSBub3QgcmVjZWl2ZWQuICovCi0gICAgICBjb250aW51ZTsKKyAgaWYgKCFzLT5oaXQgJiYgcy0+c2hvdWxkX2Fja19zbmkgJiYgcy0+c2Vzc2lvbi0+dGxzZXh0X2hvc3RuYW1lICE9IE5VTEwpIHsKKyAgICBpZiAoKGxvbmcpKGxpbWl0IC0gcmV0IC0gNCkgPCAwKSB7CisgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBpZiAoIWtFeHRlbnNpb25zW2ldLmFkZF9zZXJ2ZXJoZWxsbyhzLCAmZXh0ZW5zaW9ucykpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfRVJST1JfQURESU5HX0VYVEVOU0lPTik7Ci0gICAgICBFUlJfYWRkX2Vycm9yX2RhdGFmKCJleHRlbnNpb246ICV1IiwgKHVuc2lnbmVkKWtFeHRlbnNpb25zW2ldLnZhbHVlKTsKLSAgICAgIGdvdG8gZXJyOworICAgIHMybihUTFNFWFRfVFlQRV9zZXJ2ZXJfbmFtZSwgcmV0KTsKKyAgICBzMm4oMCwgcmV0KTsKKyAgfQorCisgIGlmIChzLT5zMy0+c2VuZF9jb25uZWN0aW9uX2JpbmRpbmcpIHsKKyAgICBpbnQgZWw7CisKKyAgICBpZiAoIXNzbF9hZGRfc2VydmVyaGVsbG9fcmVuZWdvdGlhdGVfZXh0KHMsIDAsICZlbCwgMCkpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX2FkZF9zZXJ2ZXJoZWxsb190bHNleHQsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICgobGltaXQgLSByZXQgLSA0IC0gZWwpIDwgMCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgczJuKFRMU0VYVF9UWVBFX3JlbmVnb3RpYXRlLCByZXQpOworICAgIHMybihlbCwgcmV0KTsKKworICAgIGlmICghc3NsX2FkZF9zZXJ2ZXJoZWxsb19yZW5lZ290aWF0ZV9leHQocywgcmV0LCAmZWwsIGVsKSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfYWRkX3NlcnZlcmhlbGxvX3Rsc2V4dCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0ICs9IGVsOworICB9CisKKyAgaWYgKHMtPnMzLT50bXAuZXh0ZW5kZWRfbWFzdGVyX3NlY3JldCkgeworICAgIGlmICgobG9uZykobGltaXQgLSByZXQgLSA0KSA8IDApIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHMybihUTFNFWFRfVFlQRV9leHRlbmRlZF9tYXN0ZXJfc2VjcmV0LCByZXQpOworICAgIHMybigwLCByZXQpOworICB9CisKKyAgaWYgKHVzaW5nX2VjYykgeworICAgIGNvbnN0IHVpbnQ4X3QgKnBsaXN0OworICAgIHNpemVfdCBwbGlzdGxlbjsKKyAgICAvKiBBZGQgVExTIGV4dGVuc2lvbiBFQ1BvaW50Rm9ybWF0cyB0byB0aGUgU2VydmVySGVsbG8gbWVzc2FnZSAqLworICAgIGxvbmcgbGVubWF4OworCisgICAgdGxzMV9nZXRfZm9ybWF0bGlzdChzLCAmcGxpc3QsICZwbGlzdGxlbik7CisKKyAgICBsZW5tYXggPSBsaW1pdCAtIHJldCAtIDU7CisgICAgaWYgKGxlbm1heCA8IDApIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAocGxpc3RsZW4gPiAoc2l6ZV90KWxlbm1heCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChwbGlzdGxlbiA+IDI1NSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfYWRkX3NlcnZlcmhlbGxvX3Rsc2V4dCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgczJuKFRMU0VYVF9UWVBFX2VjX3BvaW50X2Zvcm1hdHMsIHJldCk7CisgICAgczJuKHBsaXN0bGVuICsgMSwgcmV0KTsKKyAgICAqKHJldCsrKSA9ICh1aW50OF90KXBsaXN0bGVuOworICAgIG1lbWNweShyZXQsIHBsaXN0LCBwbGlzdGxlbik7CisgICAgcmV0ICs9IHBsaXN0bGVuOworICB9CisgIC8qIEN1cnJlbnRseSB0aGUgc2VydmVyIHNob3VsZCBub3QgcmVzcG9uZCB3aXRoIGEgU3VwcG9ydGVkQ3VydmVzIGV4dGVuc2lvbiAqLworCisgIGlmIChzLT50bHNleHRfdGlja2V0X2V4cGVjdGVkICYmICEoU1NMX2dldF9vcHRpb25zKHMpICYgU1NMX09QX05PX1RJQ0tFVCkpIHsKKyAgICBpZiAoKGxvbmcpKGxpbWl0IC0gcmV0IC0gNCkgPCAwKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgczJuKFRMU0VYVF9UWVBFX3Nlc3Npb25fdGlja2V0LCByZXQpOworICAgIHMybigwLCByZXQpOworICB9CisKKyAgaWYgKHMtPnMzLT50bXAuY2VydGlmaWNhdGVfc3RhdHVzX2V4cGVjdGVkKSB7CisgICAgaWYgKChsb25nKShsaW1pdCAtIHJldCAtIDQpIDwgMCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHMybihUTFNFWFRfVFlQRV9zdGF0dXNfcmVxdWVzdCwgcmV0KTsKKyAgICBzMm4oMCwgcmV0KTsKKyAgfQorCisgIGlmIChzLT5zcnRwX3Byb2ZpbGUpIHsKKyAgICBpbnQgZWw7CisKKyAgICBzc2xfYWRkX3NlcnZlcmhlbGxvX3VzZV9zcnRwX2V4dChzLCAwLCAmZWwsIDApOworCisgICAgaWYgKChsaW1pdCAtIHJldCAtIDQgLSBlbCkgPCAwKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzMm4oVExTRVhUX1RZUEVfdXNlX3NydHAsIHJldCk7CisgICAgczJuKGVsLCByZXQpOworCisgICAgaWYgKCFzc2xfYWRkX3NlcnZlcmhlbGxvX3VzZV9zcnRwX2V4dChzLCByZXQsICZlbCwgZWwpKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9hZGRfc2VydmVyaGVsbG9fdGxzZXh0LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0ICs9IGVsOworICB9CisKKyAgbmV4dF9wcm90b19uZWdfc2VlbiA9IHMtPnMzLT5uZXh0X3Byb3RvX25lZ19zZWVuOworICBzLT5zMy0+bmV4dF9wcm90b19uZWdfc2VlbiA9IDA7CisgIGlmIChuZXh0X3Byb3RvX25lZ19zZWVuICYmIHMtPmN0eC0+bmV4dF9wcm90b3NfYWR2ZXJ0aXNlZF9jYikgeworICAgIGNvbnN0IHVpbnQ4X3QgKm5wYTsKKyAgICB1bnNpZ25lZCBpbnQgbnBhbGVuOworICAgIGludCByOworCisgICAgciA9IHMtPmN0eC0+bmV4dF9wcm90b3NfYWR2ZXJ0aXNlZF9jYigKKyAgICAgICAgcywgJm5wYSwgJm5wYWxlbiwgcy0+Y3R4LT5uZXh0X3Byb3Rvc19hZHZlcnRpc2VkX2NiX2FyZyk7CisgICAgaWYgKHIgPT0gU1NMX1RMU0VYVF9FUlJfT0spIHsKKyAgICAgIGlmICgobG9uZykobGltaXQgLSByZXQgLSA0IC0gbnBhbGVuKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBzMm4oVExTRVhUX1RZUEVfbmV4dF9wcm90b19uZWcsIHJldCk7CisgICAgICBzMm4obnBhbGVuLCByZXQpOworICAgICAgbWVtY3B5KHJldCwgbnBhLCBucGFsZW4pOworICAgICAgcmV0ICs9IG5wYWxlbjsKKyAgICAgIHMtPnMzLT5uZXh0X3Byb3RvX25lZ19zZWVuID0gMTsKICAgICB9CiAgIH0KIAotICBpZiAoIWN1c3RvbV9leHRfYWRkX3NlcnZlcmhlbGxvKHMsICZleHRlbnNpb25zKSkgewotICAgIGdvdG8gZXJyOworICBpZiAocy0+czMtPmFscG5fc2VsZWN0ZWQpIHsKKyAgICBjb25zdCB1aW50OF90ICpzZWxlY3RlZCA9IHMtPnMzLT5hbHBuX3NlbGVjdGVkOworICAgIHNpemVfdCBsZW4gPSBzLT5zMy0+YWxwbl9zZWxlY3RlZF9sZW47CisKKyAgICBpZiAoKGxvbmcpKGxpbWl0IC0gcmV0IC0gNCAtIDIgLSAxIC0gbGVuKSA8IDApIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzMm4oVExTRVhUX1RZUEVfYXBwbGljYXRpb25fbGF5ZXJfcHJvdG9jb2xfbmVnb3RpYXRpb24sIHJldCk7CisgICAgczJuKDMgKyBsZW4sIHJldCk7CisgICAgczJuKDEgKyBsZW4sIHJldCk7CisgICAgKnJldCsrID0gbGVuOworICAgIG1lbWNweShyZXQsIHNlbGVjdGVkLCBsZW4pOworICAgIHJldCArPSBsZW47CiAgIH0KIAotICBpZiAoIUNCQl9mbHVzaCgmY2JiKSkgewotICAgIGdvdG8gZXJyOworICAvKiBJZiB0aGUgY2xpZW50IGFkdmVydGlzZWQgc3VwcG9ydCBmb3IgQ2hhbm5lbCBJRCwgYW5kIHdlIGhhdmUgaXQKKyAgICogZW5hYmxlZCwgdGhlbiB3ZSB3YW50IHRvIGVjaG8gaXQgYmFjay4gKi8KKyAgaWYgKHMtPnMzLT50bHNleHRfY2hhbm5lbF9pZF92YWxpZCkgeworICAgIGlmIChsaW1pdCAtIHJldCAtIDQgPCAwKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHMtPnMzLT50bHNleHRfY2hhbm5lbF9pZF9uZXcpIHsKKyAgICAgIHMybihUTFNFWFRfVFlQRV9jaGFubmVsX2lkX25ldywgcmV0KTsKKyAgICB9IGVsc2UgeworICAgICAgczJuKFRMU0VYVF9UWVBFX2NoYW5uZWxfaWQsIHJldCk7CisgICAgfQorICAgIHMybigwLCByZXQpOwogICB9CiAKLSAgdWludDhfdCAqcmV0ID0gYnVmOwotICBjb25zdCBzaXplX3QgY2JiX2xlbiA9IENCQl9sZW4oJmNiYik7Ci0gIC8qIElmIG9ubHkgdHdvIGJ5dGVzIGhhdmUgYmVlbiB3cml0dGVuIHRoZW4gdGhlIGV4dGVuc2lvbnMgYXJlIGFjdHVhbGx5IGVtcHR5Ci0gICAqIGFuZCB0aG9zZSB0d28gYnl0ZXMgYXJlIHRoZSB6ZXJvIGxlbmd0aC4gSW4gdGhhdCBjYXNlLCB3ZSBkb24ndCBib3RoZXIKLSAgICogc2VuZGluZyB0aGUgZXh0ZW5zaW9ucyBsZW5ndGguICovCi0gIGlmIChjYmJfbGVuID4gMikgewotICAgIHJldCArPSBjYmJfbGVuOworICBleHRkYXRhbGVuID0gcmV0IC0gb3JpZyAtIDI7CisgIGlmIChleHRkYXRhbGVuID09IDApIHsKKyAgICByZXR1cm4gb3JpZzsKICAgfQogCi0gIENCQl9jbGVhbnVwKCZjYmIpOworICBzMm4oZXh0ZGF0YWxlbiwgb3JpZyk7CiAgIHJldHVybiByZXQ7Cit9CiAKLWVycjoKLSAgQ0JCX2NsZWFudXAoJmNiYik7Ci0gIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOwotICByZXR1cm4gTlVMTDsKKy8qIHRsczFfYWxwbl9oYW5kbGVfY2xpZW50X2hlbGxvIGlzIGNhbGxlZCB0byBwcm9jZXNzIHRoZSBBTFBOIGV4dGVuc2lvbiBpbiBhCisgKiBDbGllbnRIZWxsby4KKyAqICAgY2JzOiB0aGUgY29udGVudHMgb2YgdGhlIGV4dGVuc2lvbiwgbm90IGluY2x1ZGluZyB0aGUgdHlwZSBhbmQgbGVuZ3RoLgorICogICBvdXRfYWxlcnQ6IGEgcG9pbnRlciB0byB0aGUgYWxlcnQgdmFsdWUgdG8gc2VuZCBpbiB0aGUgZXZlbnQgb2YgYSB6ZXJvCisgKiAgICAgICByZXR1cm4uCisgKgorICogICByZXR1cm5zOiAxIG9uIHN1Y2Nlc3MuICovCitzdGF0aWMgaW50IHRsczFfYWxwbl9oYW5kbGVfY2xpZW50X2hlbGxvKFNTTCAqcywgQ0JTICpjYnMsIGludCAqb3V0X2FsZXJ0KSB7CisgIENCUyBwcm90b2NvbF9uYW1lX2xpc3QsIHByb3RvY29sX25hbWVfbGlzdF9jb3B5OworICBjb25zdCB1aW50OF90ICpzZWxlY3RlZDsKKyAgdWludDhfdCBzZWxlY3RlZF9sZW47CisgIGludCByOworCisgIGlmIChzLT5jdHgtPmFscG5fc2VsZWN0X2NiID09IE5VTEwpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmICghQ0JTX2dldF91MTZfbGVuZ3RoX3ByZWZpeGVkKGNicywgJnByb3RvY29sX25hbWVfbGlzdCkgfHwKKyAgICAgIENCU19sZW4oY2JzKSAhPSAwIHx8IENCU19sZW4oJnByb3RvY29sX25hbWVfbGlzdCkgPCAyKSB7CisgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgfQorCisgIC8qIFZhbGlkYXRlIHRoZSBwcm90b2NvbCBsaXN0LiAqLworICBwcm90b2NvbF9uYW1lX2xpc3RfY29weSA9IHByb3RvY29sX25hbWVfbGlzdDsKKyAgd2hpbGUgKENCU19sZW4oJnByb3RvY29sX25hbWVfbGlzdF9jb3B5KSA+IDApIHsKKyAgICBDQlMgcHJvdG9jb2xfbmFtZTsKKworICAgIGlmICghQ0JTX2dldF91OF9sZW5ndGhfcHJlZml4ZWQoJnByb3RvY29sX25hbWVfbGlzdF9jb3B5LCAmcHJvdG9jb2xfbmFtZSkpIHsKKyAgICAgIGdvdG8gcGFyc2VfZXJyb3I7CisgICAgfQorICB9CisKKyAgciA9IHMtPmN0eC0+YWxwbl9zZWxlY3RfY2IoCisgICAgICBzLCAmc2VsZWN0ZWQsICZzZWxlY3RlZF9sZW4sIENCU19kYXRhKCZwcm90b2NvbF9uYW1lX2xpc3QpLAorICAgICAgQ0JTX2xlbigmcHJvdG9jb2xfbmFtZV9saXN0KSwgcy0+Y3R4LT5hbHBuX3NlbGVjdF9jYl9hcmcpOworICBpZiAociA9PSBTU0xfVExTRVhUX0VSUl9PSykgeworICAgIE9QRU5TU0xfZnJlZShzLT5zMy0+YWxwbl9zZWxlY3RlZCk7CisgICAgcy0+czMtPmFscG5fc2VsZWN0ZWQgPSBCVUZfbWVtZHVwKHNlbGVjdGVkLCBzZWxlY3RlZF9sZW4pOworICAgIGlmICghcy0+czMtPmFscG5fc2VsZWN0ZWQpIHsKKyAgICAgICpvdXRfYWxlcnQgPSBTU0xfQURfSU5URVJOQUxfRVJST1I7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcy0+czMtPmFscG5fc2VsZWN0ZWRfbGVuID0gc2VsZWN0ZWRfbGVuOworICB9CisKKyAgcmV0dXJuIDE7CisKK3BhcnNlX2Vycm9yOgorICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKyAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc3NsX3NjYW5fY2xpZW50aGVsbG9fdGxzZXh0KFNTTCAqcywgQ0JTICpjYnMsIGludCAqb3V0X2FsZXJ0KSB7Ci0gIHNpemVfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwga051bUV4dGVuc2lvbnM7IGkrKykgewotICAgIGlmIChrRXh0ZW5zaW9uc1tpXS5pbml0ICE9IE5VTEwpIHsKLSAgICAgIGtFeHRlbnNpb25zW2ldLmluaXQocyk7Ci0gICAgfQotICB9CisgIGludCByZW5lZ290aWF0ZV9zZWVuID0gMDsKKyAgQ0JTIGV4dGVuc2lvbnM7CiAKLSAgcy0+czMtPnRtcC5leHRlbnNpb25zLnJlY2VpdmVkID0gMDsKLSAgcy0+czMtPnRtcC5jdXN0b21fZXh0ZW5zaW9ucy5yZWNlaXZlZCA9IDA7Ci0gIC8qIFRoZSByZW5lZ290aWF0aW9uIGV4dGVuc2lvbiBtdXN0IGFsd2F5cyBiZSBhdCBpbmRleCB6ZXJvIGJlY2F1c2UgdGhlCi0gICAqIHxyZWNlaXZlZHwgYW5kIHxzZW50fCBiaXRzZXRzIG5lZWQgdG8gYmUgdHdlYWtlZCB3aGVuIHRoZSAiZXh0ZW5zaW9uIiBpcwotICAgKiBzZW50IGFzIGFuIFNDU1YuICovCi0gIGFzc2VydChrRXh0ZW5zaW9uc1swXS52YWx1ZSA9PSBUTFNFWFRfVFlQRV9yZW5lZ290aWF0ZSk7CisgIHMtPnNob3VsZF9hY2tfc25pID0gMDsKKyAgcy0+c3J0cF9wcm9maWxlID0gTlVMTDsKKyAgcy0+czMtPm5leHRfcHJvdG9fbmVnX3NlZW4gPSAwOworICBzLT5zMy0+dG1wLmNlcnRpZmljYXRlX3N0YXR1c19leHBlY3RlZCA9IDA7CisgIHMtPnMzLT50bXAuZXh0ZW5kZWRfbWFzdGVyX3NlY3JldCA9IDA7CisKKyAgT1BFTlNTTF9mcmVlKHMtPnMzLT5hbHBuX3NlbGVjdGVkKTsKKyAgcy0+czMtPmFscG5fc2VsZWN0ZWQgPSBOVUxMOworCisgIC8qIENsZWFyIGFueSBzaWduYXR1cmUgYWxnb3JpdGhtcyBleHRlbnNpb24gcmVjZWl2ZWQgKi8KKyAgT1BFTlNTTF9mcmVlKHMtPmNlcnQtPnBlZXJfc2lnYWxncyk7CisgIHMtPmNlcnQtPnBlZXJfc2lnYWxncyA9IE5VTEw7CisgIHMtPmNlcnQtPnBlZXJfc2lnYWxnc2xlbiA9IDA7CisKKyAgLyogQ2xlYXIgYW55IHNoYXJlZCBzaWduYXR1cmUgYWxnb3JpdGhtcyAqLworICBPUEVOU1NMX2ZyZWUocy0+Y2VydC0+c2hhcmVkX3NpZ2FsZ3MpOworICBzLT5jZXJ0LT5zaGFyZWRfc2lnYWxncyA9IE5VTEw7CisgIHMtPmNlcnQtPnNoYXJlZF9zaWdhbGdzbGVuID0gMDsKKworICAvKiBDbGVhciBFQ0MgZXh0ZW5zaW9ucyAqLworICBPUEVOU1NMX2ZyZWUocy0+czMtPnRtcC5wZWVyX2VjcG9pbnRmb3JtYXRsaXN0KTsKKyAgcy0+czMtPnRtcC5wZWVyX2VjcG9pbnRmb3JtYXRsaXN0ID0gTlVMTDsKKyAgcy0+czMtPnRtcC5wZWVyX2VjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aCA9IDA7CisKKyAgT1BFTlNTTF9mcmVlKHMtPnMzLT50bXAucGVlcl9lbGxpcHRpY2N1cnZlbGlzdCk7CisgIHMtPnMzLT50bXAucGVlcl9lbGxpcHRpY2N1cnZlbGlzdCA9IE5VTEw7CisgIHMtPnMzLT50bXAucGVlcl9lbGxpcHRpY2N1cnZlbGlzdF9sZW5ndGggPSAwOwogCiAgIC8qIFRoZXJlIG1heSBiZSBubyBleHRlbnNpb25zLiAqLwotICBpZiAoQ0JTX2xlbihjYnMpICE9IDApIHsKLSAgICAvKiBEZWNvZGUgdGhlIGV4dGVuc2lvbnMgYmxvY2sgYW5kIGNoZWNrIGl0IGlzIHZhbGlkLiAqLwotICAgIENCUyBleHRlbnNpb25zOwotICAgIGlmICghQ0JTX2dldF91MTZfbGVuZ3RoX3ByZWZpeGVkKGNicywgJmV4dGVuc2lvbnMpIHx8Ci0gICAgICAgICF0bHMxX2NoZWNrX2R1cGxpY2F0ZV9leHRlbnNpb25zKCZleHRlbnNpb25zKSkgeworICBpZiAoQ0JTX2xlbihjYnMpID09IDApIHsKKyAgICBnb3RvIHJpX2NoZWNrOworICB9CisKKyAgLyogRGVjb2RlIHRoZSBleHRlbnNpb25zIGJsb2NrIGFuZCBjaGVjayBpdCBpcyB2YWxpZC4gKi8KKyAgaWYgKCFDQlNfZ2V0X3UxNl9sZW5ndGhfcHJlZml4ZWQoY2JzLCAmZXh0ZW5zaW9ucykgfHwKKyAgICAgICF0bHMxX2NoZWNrX2R1cGxpY2F0ZV9leHRlbnNpb25zKCZleHRlbnNpb25zKSkgeworICAgICpvdXRfYWxlcnQgPSBTU0xfQURfREVDT0RFX0VSUk9SOworICAgIHJldHVybiAwOworICB9CisKKyAgd2hpbGUgKENCU19sZW4oJmV4dGVuc2lvbnMpICE9IDApIHsKKyAgICB1aW50MTZfdCB0eXBlOworICAgIENCUyBleHRlbnNpb247CisKKyAgICAvKiBEZWNvZGUgdGhlIG5leHQgZXh0ZW5zaW9uLiAqLworICAgIGlmICghQ0JTX2dldF91MTYoJmV4dGVuc2lvbnMsICZ0eXBlKSB8fAorICAgICAgICAhQ0JTX2dldF91MTZfbGVuZ3RoX3ByZWZpeGVkKCZleHRlbnNpb25zLCAmZXh0ZW5zaW9uKSkgewogICAgICAgKm91dF9hbGVydCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICB3aGlsZSAoQ0JTX2xlbigmZXh0ZW5zaW9ucykgIT0gMCkgewotICAgICAgdWludDE2X3QgdHlwZTsKLSAgICAgIENCUyBleHRlbnNpb247CisgICAgLyogVGhlIHNlcnZlcm5hbWUgZXh0ZW5zaW9uIGlzIHRyZWF0ZWQgYXMgZm9sbG93czoKIAotICAgICAgLyogRGVjb2RlIHRoZSBuZXh0IGV4dGVuc2lvbi4gKi8KLSAgICAgIGlmICghQ0JTX2dldF91MTYoJmV4dGVuc2lvbnMsICZ0eXBlKSB8fAotICAgICAgICAgICFDQlNfZ2V0X3UxNl9sZW5ndGhfcHJlZml4ZWQoJmV4dGVuc2lvbnMsICZleHRlbnNpb24pKSB7CisgICAgICAgLSBPbmx5IHRoZSBob3N0bmFtZSB0eXBlIGlzIHN1cHBvcnRlZCB3aXRoIGEgbWF4aW11bSBsZW5ndGggb2YgMjU1LgorICAgICAgIC0gVGhlIHNlcnZlcm5hbWUgaXMgcmVqZWN0ZWQgaWYgdG9vIGxvbmcgb3IgaWYgaXQgY29udGFpbnMgemVyb3MsIGluCisgICAgICAgICB3aGljaCBjYXNlIGFuIGZhdGFsIGFsZXJ0IGlzIGdlbmVyYXRlZC4KKyAgICAgICAtIFRoZSBzZXJ2ZXJuYW1lIGZpZWxkIGlzIG1haW50YWluZWQgdG9nZXRoZXIgd2l0aCB0aGUgc2Vzc2lvbiBjYWNoZS4KKyAgICAgICAtIFdoZW4gYSBzZXNzaW9uIGlzIHJlc3VtZWQsIHRoZSBzZXJ2ZXJuYW1lIGNhbGwgYmFjayBpbnZva2VkIGluIG9yZGVyCisgICAgICAgICB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gcG9zaXRpb24gaXRzZWxmIHRvIHRoZSByaWdodCBjb250ZXh0LgorICAgICAgIC0gVGhlIHNlcnZlcm5hbWUgaXMgYWNrbm93bGVkZ2VkIGlmIGl0IGlzIG5ldyBmb3IgYSBzZXNzaW9uIG9yIHdoZW4KKyAgICAgICAgIGl0IGlzIGlkZW50aWNhbCB0byBhIHByZXZpb3VzbHkgdXNlZCBmb3IgdGhlIHNhbWUgc2Vzc2lvbi4KKyAgICAgICAgIEFwcGxpY2F0aW9ucyBjYW4gY29udHJvbCB0aGUgYmVoYXZpb3VyLiAgVGhleSBjYW4gYXQgYW55IHRpbWUKKyAgICAgICAgIHNldCBhICdkZXNpcmFibGUnIHNlcnZlcm5hbWUgZm9yIGEgbmV3IFNTTCBvYmplY3QuIFRoaXMgY2FuIGJlIHRoZQorICAgICAgICAgY2FzZSBmb3IgZXhhbXBsZSB3aXRoIEhUVFBTIHdoZW4gYSBIb3N0OiBoZWFkZXIgZmllbGQgaXMgcmVjZWl2ZWQgYW5kCisgICAgICAgICBhIHJlbmVnb3RpYXRpb24gaXMgcmVxdWVzdGVkLiBJbiB0aGlzIGNhc2UsIGEgcG9zc2libGUgc2VydmVybmFtZQorICAgICAgICAgcHJlc2VudGVkIGluIHRoZSBuZXcgY2xpZW50IGhlbGxvIGlzIG9ubHkgYWNrbm93bGVkZ2VkIGlmIGl0IG1hdGNoZXMKKyAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgSG9zdDogZmllbGQuCisgICAgICAgLSBBcHBsaWNhdGlvbnMgbXVzdCAgdXNlIFNTTF9PUF9OT19TRVNTSU9OX1JFU1VNUFRJT05fT05fUkVORUdPVElBVElPTgorICAgICAgICAgaWYgdGhleSBwcm92aWRlIGZvciBjaGFuZ2luZyBhbiBleHBsaWNpdCBzZXJ2ZXJuYW1lIGNvbnRleHQgZm9yIHRoZQorICAgICAgIHNlc3Npb24sCisgICAgICAgICBpLmUuIHdoZW4gdGhlIHNlc3Npb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQgd2l0aCBhIHNlcnZlcm5hbWUgZXh0ZW5zaW9uLgorICAgICAgIC0gT24gc2Vzc2lvbiByZWNvbm5lY3QsIHRoZSBzZXJ2ZXJuYW1lIGV4dGVuc2lvbiBtYXkgYmUgYWJzZW50LiAqLworCisgICAgaWYgKHR5cGUgPT0gVExTRVhUX1RZUEVfc2VydmVyX25hbWUpIHsKKyAgICAgIENCUyBzZXJ2ZXJfbmFtZV9saXN0OworICAgICAgY2hhciBoYXZlX3NlZW5faG9zdF9uYW1lID0gMDsKKworICAgICAgaWYgKCFDQlNfZ2V0X3UxNl9sZW5ndGhfcHJlZml4ZWQoJmV4dGVuc2lvbiwgJnNlcnZlcl9uYW1lX2xpc3QpIHx8CisgICAgICAgICAgQ0JTX2xlbigmc2VydmVyX25hbWVfbGlzdCkgPCAxIHx8IENCU19sZW4oJmV4dGVuc2lvbikgIT0gMCkgewogICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAKLSAgICAgIHVuc2lnbmVkIGV4dF9pbmRleDsKLSAgICAgIGNvbnN0IHN0cnVjdCB0bHNfZXh0ZW5zaW9uICpjb25zdCBleHQgPQotICAgICAgICAgIHRsc19leHRlbnNpb25fZmluZCgmZXh0X2luZGV4LCB0eXBlKTsKKyAgICAgIC8qIERlY29kZSBlYWNoIFNlcnZlck5hbWUgaW4gdGhlIGV4dGVuc2lvbi4gKi8KKyAgICAgIHdoaWxlIChDQlNfbGVuKCZzZXJ2ZXJfbmFtZV9saXN0KSA+IDApIHsKKyAgICAgICAgdWludDhfdCBuYW1lX3R5cGU7CisgICAgICAgIENCUyBob3N0X25hbWU7CiAKLSAgICAgIGlmIChleHQgPT0gTlVMTCkgewotICAgICAgICBpZiAoIWN1c3RvbV9leHRfcGFyc2VfY2xpZW50aGVsbG8ocywgb3V0X2FsZXJ0LCB0eXBlLCAmZXh0ZW5zaW9uKSkgewotICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfRVJST1JfUEFSU0lOR19FWFRFTlNJT04pOworICAgICAgICAvKiBEZWNvZGUgdGhlIE5hbWVUeXBlLiAqLworICAgICAgICBpZiAoIUNCU19nZXRfdTgoJnNlcnZlcl9uYW1lX2xpc3QsICZuYW1lX3R5cGUpKSB7CisgICAgICAgICAgKm91dF9hbGVydCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CiAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9CiAKLSAgICAgIHMtPnMzLT50bXAuZXh0ZW5zaW9ucy5yZWNlaXZlZCB8PSAoMXUgPDwgZXh0X2luZGV4KTsKLSAgICAgIHVpbnQ4X3QgYWxlcnQgPSBTU0xfQURfREVDT0RFX0VSUk9SOwotICAgICAgaWYgKCFleHQtPnBhcnNlX2NsaWVudGhlbGxvKHMsICZhbGVydCwgJmV4dGVuc2lvbikpIHsKLSAgICAgICAgKm91dF9hbGVydCA9IGFsZXJ0OwotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0VSUk9SX1BBUlNJTkdfRVhURU5TSU9OKTsKLSAgICAgICAgRVJSX2FkZF9lcnJvcl9kYXRhZigiZXh0ZW5zaW9uOiAldSIsICh1bnNpZ25lZCl0eXBlKTsKKyAgICAgICAgLyogT25seSBob3N0X25hbWUgaXMgc3VwcG9ydGVkLiAqLworICAgICAgICBpZiAobmFtZV90eXBlICE9IFRMU0VYVF9OQU1FVFlQRV9ob3N0X25hbWUpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoYXZlX3NlZW5faG9zdF9uYW1lKSB7CisgICAgICAgICAgLyogVGhlIFNlcnZlck5hbWVMaXN0IE1VU1QgTk9UIGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBuYW1lIG9mIHRoZSBzYW1lCisgICAgICAgICAgICogbmFtZV90eXBlLiAqLworICAgICAgICAgICpvdXRfYWxlcnQgPSBTU0xfQURfREVDT0RFX0VSUk9SOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaGF2ZV9zZWVuX2hvc3RfbmFtZSA9IDE7CisKKyAgICAgICAgaWYgKCFDQlNfZ2V0X3UxNl9sZW5ndGhfcHJlZml4ZWQoJnNlcnZlcl9uYW1lX2xpc3QsICZob3N0X25hbWUpIHx8CisgICAgICAgICAgICBDQlNfbGVuKCZob3N0X25hbWUpIDwgMSkgeworICAgICAgICAgICpvdXRfYWxlcnQgPSBTU0xfQURfREVDT0RFX0VSUk9SOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKENCU19sZW4oJmhvc3RfbmFtZSkgPiBUTFNFWFRfTUFYTEVOX2hvc3RfbmFtZSB8fAorICAgICAgICAgICAgQ0JTX2NvbnRhaW5zX3plcm9fYnl0ZSgmaG9zdF9uYW1lKSkgeworICAgICAgICAgICpvdXRfYWxlcnQgPSBTU0xfQURfVU5SRUNPR05JWkVEX05BTUU7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXMtPmhpdCkgeworICAgICAgICAgIGFzc2VydChzLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUgPT0gTlVMTCk7CisgICAgICAgICAgaWYgKHMtPnNlc3Npb24tPnRsc2V4dF9ob3N0bmFtZSkgeworICAgICAgICAgICAgLyogVGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZS4gKi8KKyAgICAgICAgICAgICpvdXRfYWxlcnQgPSBTU0xfQURfREVDT0RFX0VSUk9SOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogQ29weSB0aGUgaG9zdG5hbWUgYXMgYSBzdHJpbmcuICovCisgICAgICAgICAgaWYgKCFDQlNfc3RyZHVwKCZob3N0X25hbWUsICZzLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUpKSB7CisgICAgICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorCisgICAgICAgICAgcy0+c2hvdWxkX2Fja19zbmkgPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlID09IFRMU0VYVF9UWVBFX2VjX3BvaW50X2Zvcm1hdHMpIHsKKyAgICAgIENCUyBlY19wb2ludF9mb3JtYXRfbGlzdDsKKworICAgICAgaWYgKCFDQlNfZ2V0X3U4X2xlbmd0aF9wcmVmaXhlZCgmZXh0ZW5zaW9uLCAmZWNfcG9pbnRfZm9ybWF0X2xpc3QpIHx8CisgICAgICAgICAgQ0JTX2xlbigmZXh0ZW5zaW9uKSAhPSAwKSB7CisgICAgICAgICpvdXRfYWxlcnQgPSBTU0xfQURfREVDT0RFX0VSUk9SOwogICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KKworICAgICAgaWYgKCFDQlNfc3RvdygmZWNfcG9pbnRfZm9ybWF0X2xpc3QsICZzLT5zMy0+dG1wLnBlZXJfZWNwb2ludGZvcm1hdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICZzLT5zMy0+dG1wLnBlZXJfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoKSkgeworICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVExTRVhUX1RZUEVfZWxsaXB0aWNfY3VydmVzKSB7CisgICAgICBDQlMgZWxsaXB0aWNfY3VydmVfbGlzdDsKKyAgICAgIHNpemVfdCBpLCBudW1fY3VydmVzOworCisgICAgICBpZiAoIUNCU19nZXRfdTE2X2xlbmd0aF9wcmVmaXhlZCgmZXh0ZW5zaW9uLCAmZWxsaXB0aWNfY3VydmVfbGlzdCkgfHwKKyAgICAgICAgICBDQlNfbGVuKCZlbGxpcHRpY19jdXJ2ZV9saXN0KSA9PSAwIHx8CisgICAgICAgICAgKENCU19sZW4oJmVsbGlwdGljX2N1cnZlX2xpc3QpICYgMSkgIT0gMCB8fAorICAgICAgICAgIENCU19sZW4oJmV4dGVuc2lvbikgIT0gMCkgeworICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIE9QRU5TU0xfZnJlZShzLT5zMy0+dG1wLnBlZXJfZWxsaXB0aWNjdXJ2ZWxpc3QpOworICAgICAgcy0+czMtPnRtcC5wZWVyX2VsbGlwdGljY3VydmVsaXN0X2xlbmd0aCA9IDA7CisKKyAgICAgIHMtPnMzLT50bXAucGVlcl9lbGxpcHRpY2N1cnZlbGlzdCA9CisgICAgICAgICAgKHVpbnQxNl90ICopT1BFTlNTTF9tYWxsb2MoQ0JTX2xlbigmZWxsaXB0aWNfY3VydmVfbGlzdCkpOworCisgICAgICBpZiAocy0+czMtPnRtcC5wZWVyX2VsbGlwdGljY3VydmVsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgKm91dF9hbGVydCA9IFNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIG51bV9jdXJ2ZXMgPSBDQlNfbGVuKCZlbGxpcHRpY19jdXJ2ZV9saXN0KSAvIDI7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2N1cnZlczsgaSsrKSB7CisgICAgICAgIGlmICghQ0JTX2dldF91MTYoJmVsbGlwdGljX2N1cnZlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPnMzLT50bXAucGVlcl9lbGxpcHRpY2N1cnZlbGlzdFtpXSkpIHsKKyAgICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChDQlNfbGVuKCZlbGxpcHRpY19jdXJ2ZV9saXN0KSAhPSAwKSB7CisgICAgICAgICpvdXRfYWxlcnQgPSBTU0xfQURfSU5URVJOQUxfRVJST1I7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICBzLT5zMy0+dG1wLnBlZXJfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoID0gbnVtX2N1cnZlczsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVExTRVhUX1RZUEVfcmVuZWdvdGlhdGUpIHsKKyAgICAgIGlmICghc3NsX3BhcnNlX2NsaWVudGhlbGxvX3JlbmVnb3RpYXRlX2V4dChzLCAmZXh0ZW5zaW9uLCBvdXRfYWxlcnQpKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgcmVuZWdvdGlhdGVfc2VlbiA9IDE7CisgICAgfSBlbHNlIGlmICh0eXBlID09IFRMU0VYVF9UWVBFX3NpZ25hdHVyZV9hbGdvcml0aG1zKSB7CisgICAgICBDQlMgc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zOworCisgICAgICBpZiAoIUNCU19nZXRfdTE2X2xlbmd0aF9wcmVmaXhlZCgmZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtcykgfHwKKyAgICAgICAgICBDQlNfbGVuKCZleHRlbnNpb24pICE9IDApIHsKKyAgICAgICAgKm91dF9hbGVydCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICAvKiBFbnN1cmUgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG1zIGFyZSBub24tZW1wdHkuIEl0IGNvbnRhaW5zIGEgbGlzdCBvZgorICAgICAgICogU2lnbmF0dXJlQW5kSGFzaEFsZ29yaXRobXMgd2hpY2ggYXJlIHR3byBieXRlcyBlYWNoLiAqLworICAgICAgaWYgKENCU19sZW4oJnN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtcykgPT0gMCB8fAorICAgICAgICAgIChDQlNfbGVuKCZzdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXMpICUgMikgIT0gMCkgeworICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIGlmICghdGxzMV9wcm9jZXNzX3NpZ2FsZ3MocywgJnN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtcykpIHsKKyAgICAgICAgKm91dF9hbGVydCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgLyogSWYgc2lnYWxncyByZWNlaXZlZCBhbmQgbm8gc2hhcmVkIGFsZ29yaXRobXMgZmF0YWwgZXJyb3IuICovCisgICAgICBpZiAocy0+Y2VydC0+cGVlcl9zaWdhbGdzICYmICFzLT5jZXJ0LT5zaGFyZWRfc2lnYWxncykgeworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9zY2FuX2NsaWVudGhlbGxvX3Rsc2V4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfTk9fU0hBUkVEX1NJR0FUVVJFX0FMR09SSVRITVMpOworICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVExTRVhUX1RZUEVfbmV4dF9wcm90b19uZWcgJiYKKyAgICAgICAgICAgICAgICFzLT5zMy0+aW5pdGlhbF9oYW5kc2hha2VfY29tcGxldGUgJiYKKyAgICAgICAgICAgICAgIHMtPnMzLT5hbHBuX3NlbGVjdGVkID09IE5VTEwgJiYgIVNTTF9JU19EVExTKHMpKSB7CisgICAgICAvKiBUaGUgZXh0ZW5zaW9uIG11c3QgYmUgZW1wdHkuICovCisgICAgICBpZiAoQ0JTX2xlbigmZXh0ZW5zaW9uKSAhPSAwKSB7CisgICAgICAgICpvdXRfYWxlcnQgPSBTU0xfQURfREVDT0RFX0VSUk9SOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIHMtPnMzLT5uZXh0X3Byb3RvX25lZ19zZWVuID0gMTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVExTRVhUX1RZUEVfYXBwbGljYXRpb25fbGF5ZXJfcHJvdG9jb2xfbmVnb3RpYXRpb24gJiYKKyAgICAgICAgICAgICAgIHMtPmN0eC0+YWxwbl9zZWxlY3RfY2IgJiYgIXMtPnMzLT5pbml0aWFsX2hhbmRzaGFrZV9jb21wbGV0ZSkgeworICAgICAgaWYgKCF0bHMxX2FscG5faGFuZGxlX2NsaWVudF9oZWxsbyhzLCAmZXh0ZW5zaW9uLCBvdXRfYWxlcnQpKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgLyogQUxQTiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgTlBOLiAqLworICAgICAgcy0+czMtPm5leHRfcHJvdG9fbmVnX3NlZW4gPSAwOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUTFNFWFRfVFlQRV9jaGFubmVsX2lkICYmIHMtPnRsc2V4dF9jaGFubmVsX2lkX2VuYWJsZWQgJiYKKyAgICAgICAgICAgICAgICFTU0xfSVNfRFRMUyhzKSkgeworICAgICAgLyogVGhlIGV4dGVuc2lvbiBtdXN0IGJlIGVtcHR5LiAqLworICAgICAgaWYgKENCU19sZW4oJmV4dGVuc2lvbikgIT0gMCkgeworICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIHMtPnMzLT50bHNleHRfY2hhbm5lbF9pZF92YWxpZCA9IDE7CisgICAgfSBlbHNlIGlmICh0eXBlID09IFRMU0VYVF9UWVBFX2NoYW5uZWxfaWRfbmV3ICYmCisgICAgICAgICAgICAgICBzLT50bHNleHRfY2hhbm5lbF9pZF9lbmFibGVkICYmICFTU0xfSVNfRFRMUyhzKSkgeworICAgICAgLyogVGhlIGV4dGVuc2lvbiBtdXN0IGJlIGVtcHR5LiAqLworICAgICAgaWYgKENCU19sZW4oJmV4dGVuc2lvbikgIT0gMCkgeworICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIHMtPnMzLT50bHNleHRfY2hhbm5lbF9pZF92YWxpZCA9IDE7CisgICAgICBzLT5zMy0+dGxzZXh0X2NoYW5uZWxfaWRfbmV3ID0gMTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVExTRVhUX1RZUEVfdXNlX3NydHApIHsKKyAgICAgIGlmICghc3NsX3BhcnNlX2NsaWVudGhlbGxvX3VzZV9zcnRwX2V4dChzLCAmZXh0ZW5zaW9uLCBvdXRfYWxlcnQpKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUTFNFWFRfVFlQRV9leHRlbmRlZF9tYXN0ZXJfc2VjcmV0ICYmCisgICAgICAgICAgICAgICBzLT52ZXJzaW9uICE9IFNTTDNfVkVSU0lPTikgeworICAgICAgaWYgKENCU19sZW4oJmV4dGVuc2lvbikgIT0gMCkgeworICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIHMtPnMzLT50bXAuZXh0ZW5kZWRfbWFzdGVyX3NlY3JldCA9IDE7CiAgICAgfQogICB9CiAKLSAgZm9yIChpID0gMDsgaSA8IGtOdW1FeHRlbnNpb25zOyBpKyspIHsKLSAgICBpZiAoIShzLT5zMy0+dG1wLmV4dGVuc2lvbnMucmVjZWl2ZWQgJiAoMXUgPDwgaSkpKSB7Ci0gICAgICAvKiBFeHRlbnNpb24gd2Fzbid0IG9ic2VydmVkIHNvIGNhbGwgdGhlIGNhbGxiYWNrIHdpdGggYSBOVUxMCi0gICAgICAgKiBwYXJhbWV0ZXIuICovCi0gICAgICB1aW50OF90IGFsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICAgIGlmICgha0V4dGVuc2lvbnNbaV0ucGFyc2VfY2xpZW50aGVsbG8ocywgJmFsZXJ0LCBOVUxMKSkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX01JU1NJTkdfRVhURU5TSU9OKTsKLSAgICAgICAgRVJSX2FkZF9lcnJvcl9kYXRhZigiZXh0ZW5zaW9uOiAldSIsICh1bnNpZ25lZClrRXh0ZW5zaW9uc1tpXS52YWx1ZSk7Ci0gICAgICAgICpvdXRfYWxlcnQgPSBhbGVydDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgfQorcmlfY2hlY2s6CisgIC8qIE5lZWQgUkkgaWYgcmVuZWdvdGlhdGluZyAqLworCisgIGlmICghcmVuZWdvdGlhdGVfc2VlbiAmJiBzLT5zMy0+aW5pdGlhbF9oYW5kc2hha2VfY29tcGxldGUgJiYKKyAgICAgICEocy0+b3B0aW9ucyAmIFNTTF9PUF9BTExPV19VTlNBRkVfTEVHQUNZX1JFTkVHT1RJQVRJT04pKSB7CisgICAgKm91dF9hbGVydCA9IFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9zY2FuX2NsaWVudGhlbGxvX3Rsc2V4dCwKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9VTlNBRkVfTEVHQUNZX1JFTkVHT1RJQVRJT05fRElTQUJMRUQpOworICAgIHJldHVybiAwOwogICB9CiAKICAgcmV0dXJuIDE7CkBAIC0yNDYxLDg3ICsxNjYwLDI2NyBAQAogICB9CiAKICAgaWYgKHNzbF9jaGVja19jbGllbnRoZWxsb190bHNleHQocykgPD0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfQ0xJRU5USEVMTE9fVExTRVhUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9wYXJzZV9jbGllbnRoZWxsb190bHNleHQsCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfQ0xJRU5USEVMTE9fVExTRVhUKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIHJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IHNzbF9zY2FuX3NlcnZlcmhlbGxvX3Rsc2V4dChTU0wgKnMsIENCUyAqY2JzLCBpbnQgKm91dF9hbGVydCkgewotICB1aW50MzJfdCByZWNlaXZlZCA9IDA7Ci0gIGFzc2VydChrTnVtRXh0ZW5zaW9ucyA8PSBzaXplb2YocmVjZWl2ZWQpICogOCk7CisvKiBzc2xfbmV4dF9wcm90b192YWxpZGF0ZSB2YWxpZGF0ZXMgYSBOZXh0IFByb3RvY29sIE5lZ290aWF0aW9uIGJsb2NrLiBObworICogZWxlbWVudHMgb2YgemVybyBsZW5ndGggYXJlIGFsbG93ZWQgYW5kIHRoZSBzZXQgb2YgZWxlbWVudHMgbXVzdCBleGFjdGx5CisgKiBmaWxsIHRoZSBsZW5ndGggb2YgdGhlIGJsb2NrLiAqLworc3RhdGljIGNoYXIgc3NsX25leHRfcHJvdG9fdmFsaWRhdGUoY29uc3QgQ0JTICpjYnMpIHsKKyAgQ0JTIGNvcHkgPSAqY2JzOwogCi0gIGlmIChDQlNfbGVuKGNicykgIT0gMCkgewotICAgIC8qIERlY29kZSB0aGUgZXh0ZW5zaW9ucyBibG9jayBhbmQgY2hlY2sgaXQgaXMgdmFsaWQuICovCi0gICAgQ0JTIGV4dGVuc2lvbnM7Ci0gICAgaWYgKCFDQlNfZ2V0X3UxNl9sZW5ndGhfcHJlZml4ZWQoY2JzLCAmZXh0ZW5zaW9ucykgfHwKLSAgICAgICAgIXRsczFfY2hlY2tfZHVwbGljYXRlX2V4dGVuc2lvbnMoJmV4dGVuc2lvbnMpKSB7Ci0gICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKyAgd2hpbGUgKENCU19sZW4oJmNvcHkpICE9IDApIHsKKyAgICBDQlMgcHJvdG87CisgICAgaWYgKCFDQlNfZ2V0X3U4X2xlbmd0aF9wcmVmaXhlZCgmY29weSwgJnByb3RvKSB8fCBDQlNfbGVuKCZwcm90bykgPT0gMCkgewogICAgICAgcmV0dXJuIDA7CiAgICAgfQotCi0KLSAgICB3aGlsZSAoQ0JTX2xlbigmZXh0ZW5zaW9ucykgIT0gMCkgewotICAgICAgdWludDE2X3QgdHlwZTsKLSAgICAgIENCUyBleHRlbnNpb247Ci0KLSAgICAgIC8qIERlY29kZSB0aGUgbmV4dCBleHRlbnNpb24uICovCi0gICAgICBpZiAoIUNCU19nZXRfdTE2KCZleHRlbnNpb25zLCAmdHlwZSkgfHwKLSAgICAgICAgICAhQ0JTX2dldF91MTZfbGVuZ3RoX3ByZWZpeGVkKCZleHRlbnNpb25zLCAmZXh0ZW5zaW9uKSkgewotICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIHVuc2lnbmVkIGV4dF9pbmRleDsKLSAgICAgIGNvbnN0IHN0cnVjdCB0bHNfZXh0ZW5zaW9uICpjb25zdCBleHQgPQotICAgICAgICAgIHRsc19leHRlbnNpb25fZmluZCgmZXh0X2luZGV4LCB0eXBlKTsKLQotICAgICAgaWYgKGV4dCA9PSBOVUxMKSB7Ci0gICAgICAgIGlmICghY3VzdG9tX2V4dF9wYXJzZV9zZXJ2ZXJoZWxsbyhzLCBvdXRfYWxlcnQsIHR5cGUsICZleHRlbnNpb24pKSB7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghKHMtPnMzLT50bXAuZXh0ZW5zaW9ucy5zZW50ICYgKDF1IDw8IGV4dF9pbmRleCkpKSB7Ci0gICAgICAgIC8qIElmIHRoZSBleHRlbnNpb24gd2FzIG5ldmVyIHNlbnQgdGhlbiBpdCBpcyBpbGxlZ2FsLiAqLwotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1VORVhQRUNURURfRVhURU5TSU9OKTsKLSAgICAgICAgRVJSX2FkZF9lcnJvcl9kYXRhZigiZXh0ZW5zaW9uIDoldSIsICh1bnNpZ25lZCl0eXBlKTsKLSAgICAgICAgKm91dF9hbGVydCA9IFNTTF9BRF9ERUNPREVfRVJST1I7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICByZWNlaXZlZCB8PSAoMXUgPDwgZXh0X2luZGV4KTsKLQotICAgICAgdWludDhfdCBhbGVydCA9IFNTTF9BRF9ERUNPREVfRVJST1I7Ci0gICAgICBpZiAoIWV4dC0+cGFyc2Vfc2VydmVyaGVsbG8ocywgJmFsZXJ0LCAmZXh0ZW5zaW9uKSkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX0VSUk9SX1BBUlNJTkdfRVhURU5TSU9OKTsKLSAgICAgICAgRVJSX2FkZF9lcnJvcl9kYXRhZigiZXh0ZW5zaW9uOiAldSIsICh1bnNpZ25lZCl0eXBlKTsKLSAgICAgICAgKm91dF9hbGVydCA9IGFsZXJ0OwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IGtOdW1FeHRlbnNpb25zOyBpKyspIHsKLSAgICBpZiAoIShyZWNlaXZlZCAmICgxdSA8PCBpKSkpIHsKLSAgICAgIC8qIEV4dGVuc2lvbiB3YXNuJ3Qgb2JzZXJ2ZWQgc28gY2FsbCB0aGUgY2FsbGJhY2sgd2l0aCBhIE5VTEwKLSAgICAgICAqIHBhcmFtZXRlci4gKi8KLSAgICAgIHVpbnQ4X3QgYWxlcnQgPSBTU0xfQURfREVDT0RFX0VSUk9SOwotICAgICAgaWYgKCFrRXh0ZW5zaW9uc1tpXS5wYXJzZV9zZXJ2ZXJoZWxsbyhzLCAmYWxlcnQsIE5VTEwpKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfTUlTU0lOR19FWFRFTlNJT04pOwotICAgICAgICBFUlJfYWRkX2Vycm9yX2RhdGFmKCJleHRlbnNpb246ICV1IiwgKHVuc2lnbmVkKWtFeHRlbnNpb25zW2ldLnZhbHVlKTsKLSAgICAgICAgKm91dF9hbGVydCA9IGFsZXJ0OwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICB9CiAgIH0KIAogICByZXR1cm4gMTsKIH0KIAorc3RhdGljIGludCBzc2xfc2Nhbl9zZXJ2ZXJoZWxsb190bHNleHQoU1NMICpzLCBDQlMgKmNicywgaW50ICpvdXRfYWxlcnQpIHsKKyAgaW50IHRsc2V4dF9zZXJ2ZXJuYW1lID0gMDsKKyAgaW50IHJlbmVnb3RpYXRlX3NlZW4gPSAwOworICBDQlMgZXh0ZW5zaW9uczsKKworICAvKiBUT0RPKGRhdmlkYmVuKTogTW92ZSBhbGwgb2YgdGhlc2UgdG8gc29tZSBwZXItaGFuZHNoYWtlIHN0YXRlIHRoYXQgZ2V0cworICAgKiBzeXN0ZW1hdGljYWxseSByZXNldCBvbiBhIG5ldyBoYW5kc2hha2U7IHBlcmhhcHMgYWxsb2NhdGUgaXQgZnJlc2ggZWFjaAorICAgKiB0aW1lIHNvIGl0J3Mgbm90IGV2ZW4ga2VwdCBhcm91bmQgcG9zdC1oYW5kc2hha2UuICovCisgIHMtPnMzLT5uZXh0X3Byb3RvX25lZ19zZWVuID0gMDsKKyAgcy0+dGxzZXh0X3RpY2tldF9leHBlY3RlZCA9IDA7CisgIHMtPnMzLT50bXAuY2VydGlmaWNhdGVfc3RhdHVzX2V4cGVjdGVkID0gMDsKKyAgcy0+czMtPnRtcC5leHRlbmRlZF9tYXN0ZXJfc2VjcmV0ID0gMDsKKyAgcy0+c3J0cF9wcm9maWxlID0gTlVMTDsKKworICBPUEVOU1NMX2ZyZWUocy0+czMtPmFscG5fc2VsZWN0ZWQpOworICBzLT5zMy0+YWxwbl9zZWxlY3RlZCA9IE5VTEw7CisKKyAgLyogQ2xlYXIgRUNDIGV4dGVuc2lvbnMgKi8KKyAgT1BFTlNTTF9mcmVlKHMtPnMzLT50bXAucGVlcl9lY3BvaW50Zm9ybWF0bGlzdCk7CisgIHMtPnMzLT50bXAucGVlcl9lY3BvaW50Zm9ybWF0bGlzdCA9IE5VTEw7CisgIHMtPnMzLT50bXAucGVlcl9lY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGggPSAwOworCisgIC8qIFRoZXJlIG1heSBiZSBubyBleHRlbnNpb25zLiAqLworICBpZiAoQ0JTX2xlbihjYnMpID09IDApIHsKKyAgICBnb3RvIHJpX2NoZWNrOworICB9CisKKyAgLyogRGVjb2RlIHRoZSBleHRlbnNpb25zIGJsb2NrIGFuZCBjaGVjayBpdCBpcyB2YWxpZC4gKi8KKyAgaWYgKCFDQlNfZ2V0X3UxNl9sZW5ndGhfcHJlZml4ZWQoY2JzLCAmZXh0ZW5zaW9ucykgfHwKKyAgICAgICF0bHMxX2NoZWNrX2R1cGxpY2F0ZV9leHRlbnNpb25zKCZleHRlbnNpb25zKSkgeworICAgICpvdXRfYWxlcnQgPSBTU0xfQURfREVDT0RFX0VSUk9SOworICAgIHJldHVybiAwOworICB9CisKKyAgd2hpbGUgKENCU19sZW4oJmV4dGVuc2lvbnMpICE9IDApIHsKKyAgICB1aW50MTZfdCB0eXBlOworICAgIENCUyBleHRlbnNpb247CisKKyAgICAvKiBEZWNvZGUgdGhlIG5leHQgZXh0ZW5zaW9uLiAqLworICAgIGlmICghQ0JTX2dldF91MTYoJmV4dGVuc2lvbnMsICZ0eXBlKSB8fAorICAgICAgICAhQ0JTX2dldF91MTZfbGVuZ3RoX3ByZWZpeGVkKCZleHRlbnNpb25zLCAmZXh0ZW5zaW9uKSkgeworICAgICAgKm91dF9hbGVydCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAodHlwZSA9PSBUTFNFWFRfVFlQRV9zZXJ2ZXJfbmFtZSkgeworICAgICAgLyogVGhlIGV4dGVuc2lvbiBtdXN0IGJlIGVtcHR5LiAqLworICAgICAgaWYgKENCU19sZW4oJmV4dGVuc2lvbikgIT0gMCkgeworICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIC8qIFdlIG11c3QgaGF2ZSBzZW50IGl0IGluIENsaWVudEhlbGxvLiAqLworICAgICAgaWYgKHMtPnRsc2V4dF9ob3N0bmFtZSA9PSBOVUxMKSB7CisgICAgICAgICpvdXRfYWxlcnQgPSBTU0xfQURfVU5TVVBQT1JURURfRVhURU5TSU9OOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgdGxzZXh0X3NlcnZlcm5hbWUgPSAxOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUTFNFWFRfVFlQRV9lY19wb2ludF9mb3JtYXRzKSB7CisgICAgICBDQlMgZWNfcG9pbnRfZm9ybWF0X2xpc3Q7CisKKyAgICAgIGlmICghQ0JTX2dldF91OF9sZW5ndGhfcHJlZml4ZWQoJmV4dGVuc2lvbiwgJmVjX3BvaW50X2Zvcm1hdF9saXN0KSB8fAorICAgICAgICAgIENCU19sZW4oJmV4dGVuc2lvbikgIT0gMCkgeworICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIGlmICghQ0JTX3N0b3coJmVjX3BvaW50X2Zvcm1hdF9saXN0LCAmcy0+czMtPnRtcC5wZWVyX2VjcG9pbnRmb3JtYXRsaXN0LAorICAgICAgICAgICAgICAgICAgICAmcy0+czMtPnRtcC5wZWVyX2VjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aCkpIHsKKyAgICAgICAgKm91dF9hbGVydCA9IFNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlID09IFRMU0VYVF9UWVBFX3Nlc3Npb25fdGlja2V0KSB7CisgICAgICBpZiAoKFNTTF9nZXRfb3B0aW9ucyhzKSAmIFNTTF9PUF9OT19USUNLRVQpIHx8IENCU19sZW4oJmV4dGVuc2lvbikgPiAwKSB7CisgICAgICAgICpvdXRfYWxlcnQgPSBTU0xfQURfVU5TVVBQT1JURURfRVhURU5TSU9OOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgcy0+dGxzZXh0X3RpY2tldF9leHBlY3RlZCA9IDE7CisgICAgfSBlbHNlIGlmICh0eXBlID09IFRMU0VYVF9UWVBFX3N0YXR1c19yZXF1ZXN0KSB7CisgICAgICAvKiBUaGUgZXh0ZW5zaW9uIE1VU1QgYmUgZW1wdHkgYW5kIG1heSBvbmx5IHNlbnQgaWYgd2UndmUgcmVxdWVzdGVkIGEKKyAgICAgICAqIHN0YXR1cyByZXF1ZXN0IG1lc3NhZ2UuICovCisgICAgICBpZiAoQ0JTX2xlbigmZXh0ZW5zaW9uKSAhPSAwKSB7CisgICAgICAgICpvdXRfYWxlcnQgPSBTU0xfQURfREVDT0RFX0VSUk9SOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgaWYgKCFzLT5vY3NwX3N0YXBsaW5nX2VuYWJsZWQpIHsKKyAgICAgICAgKm91dF9hbGVydCA9IFNTTF9BRF9VTlNVUFBPUlRFRF9FWFRFTlNJT047CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICAvKiBTZXQgYSBmbGFnIHRvIGV4cGVjdCBhIENlcnRpZmljYXRlU3RhdHVzIG1lc3NhZ2UgKi8KKyAgICAgIHMtPnMzLT50bXAuY2VydGlmaWNhdGVfc3RhdHVzX2V4cGVjdGVkID0gMTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVExTRVhUX1RZUEVfbmV4dF9wcm90b19uZWcgJiYKKyAgICAgICAgICAgICAgICFzLT5zMy0+aW5pdGlhbF9oYW5kc2hha2VfY29tcGxldGUgJiYgIVNTTF9JU19EVExTKHMpKSB7CisgICAgICB1aW50OF90ICpzZWxlY3RlZDsKKyAgICAgIHVpbnQ4X3Qgc2VsZWN0ZWRfbGVuOworCisgICAgICAvKiBXZSBtdXN0IGhhdmUgcmVxdWVzdGVkIGl0LiAqLworICAgICAgaWYgKHMtPmN0eC0+bmV4dF9wcm90b19zZWxlY3RfY2IgPT0gTlVMTCkgeworICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX1VOU1VQUE9SVEVEX0VYVEVOU0lPTjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIC8qIFRoZSBkYXRhIG11c3QgYmUgdmFsaWQuICovCisgICAgICBpZiAoIXNzbF9uZXh0X3Byb3RvX3ZhbGlkYXRlKCZleHRlbnNpb24pKSB7CisgICAgICAgICpvdXRfYWxlcnQgPSBTU0xfQURfREVDT0RFX0VSUk9SOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgaWYgKHMtPmN0eC0+bmV4dF9wcm90b19zZWxlY3RfY2IoCisgICAgICAgICAgICAgIHMsICZzZWxlY3RlZCwgJnNlbGVjdGVkX2xlbiwgQ0JTX2RhdGEoJmV4dGVuc2lvbiksCisgICAgICAgICAgICAgIENCU19sZW4oJmV4dGVuc2lvbiksCisgICAgICAgICAgICAgIHMtPmN0eC0+bmV4dF9wcm90b19zZWxlY3RfY2JfYXJnKSAhPSBTU0xfVExTRVhUX0VSUl9PSykgeworICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgcy0+bmV4dF9wcm90b19uZWdvdGlhdGVkID0gQlVGX21lbWR1cChzZWxlY3RlZCwgc2VsZWN0ZWRfbGVuKTsKKyAgICAgIGlmIChzLT5uZXh0X3Byb3RvX25lZ290aWF0ZWQgPT0gTlVMTCkgeworICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgcy0+bmV4dF9wcm90b19uZWdvdGlhdGVkX2xlbiA9IHNlbGVjdGVkX2xlbjsKKyAgICAgIHMtPnMzLT5uZXh0X3Byb3RvX25lZ19zZWVuID0gMTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVExTRVhUX1RZUEVfYXBwbGljYXRpb25fbGF5ZXJfcHJvdG9jb2xfbmVnb3RpYXRpb24gJiYKKyAgICAgICAgICAgICAgICFzLT5zMy0+aW5pdGlhbF9oYW5kc2hha2VfY29tcGxldGUpIHsKKyAgICAgIENCUyBwcm90b2NvbF9uYW1lX2xpc3QsIHByb3RvY29sX25hbWU7CisKKyAgICAgIC8qIFdlIG11c3QgaGF2ZSByZXF1ZXN0ZWQgaXQuICovCisgICAgICBpZiAocy0+YWxwbl9jbGllbnRfcHJvdG9fbGlzdCA9PSBOVUxMKSB7CisgICAgICAgICpvdXRfYWxlcnQgPSBTU0xfQURfVU5TVVBQT1JURURfRVhURU5TSU9OOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgLyogVGhlIGV4dGVuc2lvbiBkYXRhIGNvbnNpc3RzIG9mIGEgUHJvdG9jb2xOYW1lTGlzdCB3aGljaCBtdXN0IGhhdmUKKyAgICAgICAqIGV4YWN0bHkgb25lIFByb3RvY29sTmFtZS4gRWFjaCBvZiB0aGVzZSBpcyBsZW5ndGgtcHJlZml4ZWQuICovCisgICAgICBpZiAoIUNCU19nZXRfdTE2X2xlbmd0aF9wcmVmaXhlZCgmZXh0ZW5zaW9uLCAmcHJvdG9jb2xfbmFtZV9saXN0KSB8fAorICAgICAgICAgIENCU19sZW4oJmV4dGVuc2lvbikgIT0gMCB8fAorICAgICAgICAgICFDQlNfZ2V0X3U4X2xlbmd0aF9wcmVmaXhlZCgmcHJvdG9jb2xfbmFtZV9saXN0LCAmcHJvdG9jb2xfbmFtZSkgfHwKKyAgICAgICAgICBDQlNfbGVuKCZwcm90b2NvbF9uYW1lX2xpc3QpICE9IDApIHsKKyAgICAgICAgKm91dF9hbGVydCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICBpZiAoIUNCU19zdG93KCZwcm90b2NvbF9uYW1lLCAmcy0+czMtPmFscG5fc2VsZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICZzLT5zMy0+YWxwbl9zZWxlY3RlZF9sZW4pKSB7CisgICAgICAgICpvdXRfYWxlcnQgPSBTU0xfQURfSU5URVJOQUxfRVJST1I7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUTFNFWFRfVFlQRV9jaGFubmVsX2lkICYmICFTU0xfSVNfRFRMUyhzKSkgeworICAgICAgaWYgKENCU19sZW4oJmV4dGVuc2lvbikgIT0gMCkgeworICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIHMtPnMzLT50bHNleHRfY2hhbm5lbF9pZF92YWxpZCA9IDE7CisgICAgfSBlbHNlIGlmICh0eXBlID09IFRMU0VYVF9UWVBFX2NoYW5uZWxfaWRfbmV3ICYmICFTU0xfSVNfRFRMUyhzKSkgeworICAgICAgaWYgKENCU19sZW4oJmV4dGVuc2lvbikgIT0gMCkgeworICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIHMtPnMzLT50bHNleHRfY2hhbm5lbF9pZF92YWxpZCA9IDE7CisgICAgICBzLT5zMy0+dGxzZXh0X2NoYW5uZWxfaWRfbmV3ID0gMTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVExTRVhUX1RZUEVfY2VydGlmaWNhdGVfdGltZXN0YW1wKSB7CisgICAgICBpZiAoQ0JTX2xlbigmZXh0ZW5zaW9uKSA9PSAwKSB7CisgICAgICAgICpvdXRfYWxlcnQgPSBTU0xfQURfREVDT0RFX0VSUk9SOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgLyogU2Vzc2lvbiByZXN1bXB0aW9uIHVzZXMgdGhlIG9yaWdpbmFsIHNlc3Npb24gaW5mb3JtYXRpb24uICovCisgICAgICBpZiAoIXMtPmhpdCAmJgorICAgICAgICAgICFDQlNfc3RvdygmZXh0ZW5zaW9uLCAmcy0+c2Vzc2lvbi0+dGxzZXh0X3NpZ25lZF9jZXJ0X3RpbWVzdGFtcF9saXN0LAorICAgICAgICAgICAgICAgICAgICAmcy0+c2Vzc2lvbi0+dGxzZXh0X3NpZ25lZF9jZXJ0X3RpbWVzdGFtcF9saXN0X2xlbmd0aCkpIHsKKyAgICAgICAgKm91dF9hbGVydCA9IFNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlID09IFRMU0VYVF9UWVBFX3JlbmVnb3RpYXRlKSB7CisgICAgICBpZiAoIXNzbF9wYXJzZV9zZXJ2ZXJoZWxsb19yZW5lZ290aWF0ZV9leHQocywgJmV4dGVuc2lvbiwgb3V0X2FsZXJ0KSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgcmVuZWdvdGlhdGVfc2VlbiA9IDE7CisgICAgfSBlbHNlIGlmICh0eXBlID09IFRMU0VYVF9UWVBFX3VzZV9zcnRwKSB7CisgICAgICBpZiAoIXNzbF9wYXJzZV9zZXJ2ZXJoZWxsb191c2Vfc3J0cF9leHQocywgJmV4dGVuc2lvbiwgb3V0X2FsZXJ0KSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVExTRVhUX1RZUEVfZXh0ZW5kZWRfbWFzdGVyX3NlY3JldCkgeworICAgICAgaWYgKC8qIEl0IGlzIGludmFsaWQgZm9yIHRoZSBzZXJ2ZXIgdG8gc2VsZWN0IEVNUyBhbmQKKyAgICAgICAgICAgICBTU0x2My4gKi8KKyAgICAgICAgICBzLT52ZXJzaW9uID09IFNTTDNfVkVSU0lPTiB8fCBDQlNfbGVuKCZleHRlbnNpb24pICE9IDApIHsKKyAgICAgICAgKm91dF9hbGVydCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICBzLT5zMy0+dG1wLmV4dGVuZGVkX21hc3Rlcl9zZWNyZXQgPSAxOworICAgIH0KKyAgfQorCisgIGlmICghcy0+aGl0ICYmIHRsc2V4dF9zZXJ2ZXJuYW1lID09IDEgJiYgcy0+dGxzZXh0X2hvc3RuYW1lKSB7CisgICAgaWYgKHMtPnNlc3Npb24tPnRsc2V4dF9ob3N0bmFtZSA9PSBOVUxMKSB7CisgICAgICBzLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUgPSBCVUZfc3RyZHVwKHMtPnRsc2V4dF9ob3N0bmFtZSk7CisgICAgICBpZiAoIXMtPnNlc3Npb24tPnRsc2V4dF9ob3N0bmFtZSkgeworICAgICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX1VOUkVDT0dOSVpFRF9OQU1FOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgKm91dF9hbGVydCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworcmlfY2hlY2s6CisgIC8qIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIHNlZSBSSS4gU3RyaWN0bHkgc3BlYWtpbmcgaWYgd2Ugd2FudCB0byBhdm9pZCBhbgorICAgKiBhdHRhY2sgd2Ugc2hvdWxkICphbHdheXMqIHNlZSBSSSBldmVuIG9uIGluaXRpYWwgc2VydmVyIGhlbGxvIGJlY2F1c2UgdGhlCisgICAqIGNsaWVudCBkb2Vzbid0IHNlZSBhbnkgcmVuZWdvdGlhdGlvbiBkdXJpbmcgYW4gYXR0YWNrLiBIb3dldmVyIHRoaXMgd291bGQKKyAgICogbWVhbiB3ZSBjb3VsZCBub3QgY29ubmVjdCB0byBhbnkgc2VydmVyIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBSSSBzbyBmb3IKKyAgICogdGhlIGltbWVkaWF0ZSBmdXR1cmUgdG9sZXJhdGUgUkkgYWJzZW5jZSBvbiBpbml0aWFsIGNvbm5lY3Qgb25seS4gKi8KKyAgaWYgKCFyZW5lZ290aWF0ZV9zZWVuICYmICEocy0+b3B0aW9ucyAmIFNTTF9PUF9MRUdBQ1lfU0VSVkVSX0NPTk5FQ1QpICYmCisgICAgICAhKHMtPm9wdGlvbnMgJiBTU0xfT1BfQUxMT1dfVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OKSkgeworICAgICpvdXRfYWxlcnQgPSBTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfc2Nhbl9zZXJ2ZXJoZWxsb190bHNleHQsCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OX0RJU0FCTEVEKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAxOworfQorCitpbnQgc3NsX3ByZXBhcmVfY2xpZW50aGVsbG9fdGxzZXh0KFNTTCAqcykgeyByZXR1cm4gMTsgfQorCitpbnQgc3NsX3ByZXBhcmVfc2VydmVyaGVsbG9fdGxzZXh0KFNTTCAqcykgeyByZXR1cm4gMTsgfQorCiBzdGF0aWMgaW50IHNzbF9jaGVja19jbGllbnRoZWxsb190bHNleHQoU1NMICpzKSB7CiAgIGludCByZXQgPSBTU0xfVExTRVhUX0VSUl9OT0FDSzsKICAgaW50IGFsID0gU1NMX0FEX1VOUkVDT0dOSVpFRF9OQU1FOwpAQCAtMjU2OCw3ICsxOTQ3LDcgQEAKICAgICAgIHJldHVybiAxOwogCiAgICAgY2FzZSBTU0xfVExTRVhUX0VSUl9OT0FDSzoKLSAgICAgIHMtPnMzLT50bXAuc2hvdWxkX2Fja19zbmkgPSAwOworICAgICAgcy0+c2hvdWxkX2Fja19zbmkgPSAwOwogICAgICAgcmV0dXJuIDE7CiAKICAgICBkZWZhdWx0OgpAQCAtMjU3Nyw5ICsxOTU2LDIyIEBACiB9CiAKIHN0YXRpYyBpbnQgc3NsX2NoZWNrX3NlcnZlcmhlbGxvX3Rsc2V4dChTU0wgKnMpIHsKLSAgaW50IHJldCA9IFNTTF9UTFNFWFRfRVJSX09LOworICBpbnQgcmV0ID0gU1NMX1RMU0VYVF9FUlJfTk9BQ0s7CiAgIGludCBhbCA9IFNTTF9BRF9VTlJFQ09HTklaRURfTkFNRTsKIAorICAvKiBJZiB3ZSBhcmUgY2xpZW50IGFuZCB1c2luZyBhbiBlbGxpcHRpYyBjdXJ2ZSBjcnlwdG9ncmFwaHkgY2lwaGVyIHN1aXRlLAorICAgKiB0aGVuIGlmIHNlcnZlciByZXR1cm5zIGFuIEVDIHBvaW50IGZvcm1hdHMgbGlzdHMgZXh0ZW5zaW9uIGl0IG11c3QgY29udGFpbgorICAgKiB1bmNvbXByZXNzZWQuICovCisgIHVpbnQzMl90IGFsZ19rID0gcy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fbWtleTsKKyAgdWludDMyX3QgYWxnX2EgPSBzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9hdXRoOworICBpZiAoKChhbGdfayAmIFNTTF9rRUNESEUpIHx8IChhbGdfYSAmIFNTTF9hRUNEU0EpKSAmJgorICAgICAgIXRsczFfY2hlY2tfcG9pbnRfZm9ybWF0KHMsIFRMU0VYVF9FQ1BPSU5URk9STUFUX3VuY29tcHJlc3NlZCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9jaGVja19zZXJ2ZXJoZWxsb190bHNleHQsCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfVExTX0lOVkFMSURfRUNQT0lOVEZPUk1BVF9MSVNUKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0ID0gU1NMX1RMU0VYVF9FUlJfT0s7CisKICAgaWYgKHMtPmN0eCAhPSBOVUxMICYmIHMtPmN0eC0+dGxzZXh0X3NlcnZlcm5hbWVfY2FsbGJhY2sgIT0gMCkgewogICAgIHJldCA9IHMtPmN0eC0+dGxzZXh0X3NlcnZlcm5hbWVfY2FsbGJhY2socywgJmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3R4LT50bHNleHRfc2VydmVybmFtZV9hcmcpOwpAQCAtMjYxNSwxMzEgKzIwMDcsMjAzIEBACiAgIH0KIAogICBpZiAoc3NsX2NoZWNrX3NlcnZlcmhlbGxvX3Rsc2V4dChzKSA8PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9TRVJWRVJIRUxMT19UTFNFWFQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgc3NsX3BhcnNlX3NlcnZlcmhlbGxvX3Rsc2V4dCwKKyAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9TRVJWRVJIRUxMT19UTFNFWFQpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgcmV0dXJuIDE7CiB9CiAKLWludCB0bHNfcHJvY2Vzc190aWNrZXQoU1NMICpzc2wsIFNTTF9TRVNTSU9OICoqb3V0X3Nlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0X3NlbmRfdGlja2V0LCBjb25zdCB1aW50OF90ICp0aWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0aWNrZXRfbGVuLCBjb25zdCB1aW50OF90ICpzZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2Vzc2lvbl9pZF9sZW4pIHsKLSAgaW50IHJldCA9IDE7IC8qIE1vc3QgZXJyb3JzIGFyZSBub24tZmF0YWwuICovCi0gIFNTTF9DVFggKnNzbF9jdHggPSBzc2wtPmluaXRpYWxfY3R4OwotICB1aW50OF90ICpwbGFpbnRleHQgPSBOVUxMOworLyogU2luY2UgdGhlIHNlcnZlciBjYWNoZSBsb29rdXAgaXMgZG9uZSBlYXJseSBvbiBpbiB0aGUgcHJvY2Vzc2luZyBvZiB0aGUKKyAqIENsaWVudEhlbGxvLCBhbmQgb3RoZXIgb3BlcmF0aW9ucyBkZXBlbmQgb24gdGhlIHJlc3VsdCwgd2UgbmVlZCB0byBoYW5kbGUKKyAqIGFueSBUTFMgc2Vzc2lvbiB0aWNrZXQgZXh0ZW5zaW9uIGF0IHRoZSBzYW1lIHRpbWUuCisgKgorICogICBjdHg6IGNvbnRhaW5zIHRoZSBlYXJseSBjYWxsYmFjayBjb250ZXh0LCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIGEKKyAqICAgICAgIHNoYWxsb3cgcGFyc2Ugb2YgdGhlIENsaWVudEhlbGxvLgorICogICByZXQ6IChvdXRwdXQpIG9uIHJldHVybiwgaWYgYSB0aWNrZXQgd2FzIGRlY3J5cHRlZCwgdGhlbiB0aGlzIGlzIHNldCB0bworICogICAgICAgcG9pbnQgdG8gdGhlIHJlc3VsdGluZyBzZXNzaW9uLgorICoKKyAqIFJldHVybnM6CisgKiAgIC0xOiBmYXRhbCBlcnJvciwgZWl0aGVyIGZyb20gcGFyc2luZyBvciBkZWNyeXB0aW5nIHRoZSB0aWNrZXQuCisgKiAgICAwOiBubyB0aWNrZXQgd2FzIGZvdW5kIChvciB3YXMgaWdub3JlZCwgYmFzZWQgb24gc2V0dGluZ3MpLgorICogICAgMTogYSB6ZXJvIGxlbmd0aCBleHRlbnNpb24gd2FzIGZvdW5kLCBpbmRpY2F0aW5nIHRoYXQgdGhlIGNsaWVudCBzdXBwb3J0cworICogICAgICAgc2Vzc2lvbiB0aWNrZXRzIGJ1dCBkb2Vzbid0IGN1cnJlbnRseSBoYXZlIG9uZSB0byBvZmZlci4KKyAqICAgIDI6IGEgdGlja2V0IHdhcyBvZmZlcmVkIGJ1dCBjb3VsZG4ndCBiZSBkZWNyeXB0ZWQgYmVjYXVzZSBvZiBhIG5vbi1mYXRhbAorICogICAgICAgZXJyb3IuCisgKiAgICAzOiBhIHRpY2tldCB3YXMgc3VjY2Vzc2Z1bGx5IGRlY3J5cHRlZCBhbmQgKnJldCB3YXMgc2V0LgorICoKKyAqIFNpZGUgZWZmZWN0czoKKyAqICAgU2V0cyBzLT50bHNleHRfdGlja2V0X2V4cGVjdGVkIHRvIDEgaWYgdGhlIHNlcnZlciB3aWxsIGhhdmUgdG8gaXNzdWUKKyAqICAgYSBuZXcgc2Vzc2lvbiB0aWNrZXQgdG8gdGhlIGNsaWVudCBiZWNhdXNlIHRoZSBjbGllbnQgaW5kaWNhdGVkIHN1cHBvcnQKKyAqICAgYnV0IHRoZSBjbGllbnQgZWl0aGVyIGRvZXNuJ3QgaGF2ZSBhIHNlc3Npb24gdGlja2V0IG9yIHdlIGNvdWxkbid0IHVzZQorICogICB0aGUgb25lIGl0IGdhdmUgdXMsIG9yIGlmIHMtPmN0eC0+dGxzZXh0X3RpY2tldF9rZXlfY2IgYXNrZWQgdG8gcmVuZXcKKyAqICAgdGhlIGNsaWVudCdzIHRpY2tldC4gIE90aGVyd2lzZSwgcy0+dGxzZXh0X3RpY2tldF9leHBlY3RlZCBpcyBzZXQgdG8gMC4KKyAqLworaW50IHRsczFfcHJvY2Vzc190aWNrZXQoU1NMICpzLCBjb25zdCBzdHJ1Y3Qgc3NsX2Vhcmx5X2NhbGxiYWNrX2N0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1NFU1NJT04gKipyZXQpIHsKKyAgKnJldCA9IE5VTEw7CisgIHMtPnRsc2V4dF90aWNrZXRfZXhwZWN0ZWQgPSAwOworICBjb25zdCB1aW50OF90ICpkYXRhOworICBzaXplX3QgbGVuOworICBpbnQgcjsKIAotICBITUFDX0NUWCBobWFjX2N0eDsKLSAgSE1BQ19DVFhfaW5pdCgmaG1hY19jdHgpOwotICBFVlBfQ0lQSEVSX0NUWCBjaXBoZXJfY3R4OwotICBFVlBfQ0lQSEVSX0NUWF9pbml0KCZjaXBoZXJfY3R4KTsKLQotICAqb3V0X3NlbmRfdGlja2V0ID0gMDsKLSAgKm91dF9zZXNzaW9uID0gTlVMTDsKLQotICBpZiAoc2Vzc2lvbl9pZF9sZW4gPiBTU0xfTUFYX1NTTF9TRVNTSU9OX0lEX0xFTkdUSCkgewotICAgIGdvdG8gZG9uZTsKKyAgLyogSWYgdGlja2V0cyBkaXNhYmxlZCBiZWhhdmUgYXMgaWYgbm8gdGlja2V0IHByZXNlbnQgdG8gcGVybWl0IHN0YXRlZnVsCisgICAqIHJlc3VtcHRpb24uICovCisgIGlmICgoU1NMX2dldF9vcHRpb25zKHMpICYgU1NMX09QX05PX1RJQ0tFVCkgfHwKKyAgICAgIChzLT52ZXJzaW9uIDw9IFNTTDNfVkVSU0lPTiAmJiAhY3R4LT5leHRlbnNpb25zKSB8fAorICAgICAgIVNTTF9lYXJseV9jYWxsYmFja19jdHhfZXh0ZW5zaW9uX2dldChjdHgsIFRMU0VYVF9UWVBFX3Nlc3Npb25fdGlja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwgJmxlbikpIHsKKyAgICByZXR1cm4gMDsKICAgfQogCi0gIGlmICh0aWNrZXRfbGVuID09IDApIHsKKyAgaWYgKGxlbiA9PSAwKSB7CiAgICAgLyogVGhlIGNsaWVudCB3aWxsIGFjY2VwdCBhIHRpY2tldCBidXQgZG9lc24ndCBjdXJyZW50bHkgaGF2ZSBvbmUuICovCi0gICAgKm91dF9zZW5kX3RpY2tldCA9IDE7Ci0gICAgZ290byBkb25lOworICAgIHMtPnRsc2V4dF90aWNrZXRfZXhwZWN0ZWQgPSAxOworICAgIHJldHVybiAxOwogICB9CiAKKyAgciA9IHRsc19kZWNyeXB0X3RpY2tldChzLCBkYXRhLCBsZW4sIGN0eC0+c2Vzc2lvbl9pZCwgY3R4LT5zZXNzaW9uX2lkX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXQpOworICBzd2l0Y2ggKHIpIHsKKyAgICBjYXNlIDI6IC8qIHRpY2tldCBjb3VsZG4ndCBiZSBkZWNyeXB0ZWQgKi8KKyAgICAgIHMtPnRsc2V4dF90aWNrZXRfZXhwZWN0ZWQgPSAxOworICAgICAgcmV0dXJuIDI7CisKKyAgICBjYXNlIDM6IC8qIHRpY2tldCB3YXMgZGVjcnlwdGVkICovCisgICAgICByZXR1cm4gcjsKKworICAgIGNhc2UgNDogLyogdGlja2V0IGRlY3J5cHRlZCBidXQgbmVlZCB0byByZW5ldyAqLworICAgICAgcy0+dGxzZXh0X3RpY2tldF9leHBlY3RlZCA9IDE7CisgICAgICByZXR1cm4gMzsKKworICAgIGRlZmF1bHQ6IC8qIGZhdGFsIGVycm9yICovCisgICAgICByZXR1cm4gLTE7CisgIH0KK30KKworLyogdGxzX2RlY3J5cHRfdGlja2V0IGF0dGVtcHRzIHRvIGRlY3J5cHQgYSBzZXNzaW9uIHRpY2tldC4KKyAqCisgKiAgIGV0aWNrOiBwb2ludHMgdG8gdGhlIGJvZHkgb2YgdGhlIHNlc3Npb24gdGlja2V0IGV4dGVuc2lvbi4KKyAqICAgZXRpY2tsZW46IHRoZSBsZW5ndGggb2YgdGhlIHNlc3Npb24gdGlja2V0cyBleHRlbmlvbi4KKyAqICAgc2Vzc19pZDogcG9pbnRzIGF0IHRoZSBzZXNzaW9uIElELgorICogICBzZXNzbGVuOiB0aGUgbGVuZ3RoIG9mIHRoZSBzZXNzaW9uIElELgorICogICBwc2VzczogKG91dHB1dCkgb24gcmV0dXJuLCBpZiBhIHRpY2tldCB3YXMgZGVjcnlwdGVkLCB0aGVuIHRoaXMgaXMgc2V0IHRvCisgKiAgICAgICBwb2ludCB0byB0aGUgcmVzdWx0aW5nIHNlc3Npb24uCisgKgorICogUmV0dXJuczoKKyAqICAgLTE6IGZhdGFsIGVycm9yLCBlaXRoZXIgZnJvbSBwYXJzaW5nIG9yIGRlY3J5cHRpbmcgdGhlIHRpY2tldC4KKyAqICAgIDI6IHRoZSB0aWNrZXQgY291bGRuJ3QgYmUgZGVjcnlwdGVkLgorICogICAgMzogYSB0aWNrZXQgd2FzIHN1Y2Nlc3NmdWxseSBkZWNyeXB0ZWQgYW5kICpwc2VzcyB3YXMgc2V0LgorICogICAgNDogc2FtZSBhcyAzLCBidXQgdGhlIHRpY2tldCBuZWVkcyB0byBiZSByZW5ld2VkLiAqLworc3RhdGljIGludCB0bHNfZGVjcnlwdF90aWNrZXQoU1NMICpzLCBjb25zdCB1aW50OF90ICpldGljaywgaW50IGV0aWNrbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc2Vzc19pZCwgaW50IHNlc3NsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfU0VTU0lPTiAqKnBzZXNzKSB7CisgIFNTTF9TRVNTSU9OICpzZXNzOworICB1aW50OF90ICpzZGVjOworICBjb25zdCB1aW50OF90ICpwOworICBpbnQgc2xlbiwgbWxlbiwgcmVuZXdfdGlja2V0ID0gMDsKKyAgdWludDhfdCB0aWNrX2htYWNbRVZQX01BWF9NRF9TSVpFXTsKKyAgSE1BQ19DVFggaGN0eDsKKyAgRVZQX0NJUEhFUl9DVFggY3R4OworICBTU0xfQ1RYICp0Y3R4ID0gcy0+aW5pdGlhbF9jdHg7CisKICAgLyogRW5zdXJlIHRoZXJlIGlzIHJvb20gZm9yIHRoZSBrZXkgbmFtZSBhbmQgdGhlIGxhcmdlc3QgSVYKICAgICogfHRsc2V4dF90aWNrZXRfa2V5X2NifCBtYXkgdHJ5IHRvIGNvbnN1bWUuIFRoZSByZWFsIGxpbWl0IG1heSBiZSBsb3dlciwgYnV0CiAgICAqIHRoZSBtYXhpbXVtIElWIGxlbmd0aCBzaG91bGQgYmUgd2VsbCB1bmRlciB0aGUgbWluaW11bSBzaXplIGZvciB0aGUKICAgICogc2Vzc2lvbiBtYXRlcmlhbCBhbmQgSE1BQy4gKi8KLSAgaWYgKHRpY2tldF9sZW4gPCBTU0xfVElDS0VUX0tFWV9OQU1FX0xFTiArIEVWUF9NQVhfSVZfTEVOR1RIKSB7Ci0gICAgZ290byBkb25lOworICBpZiAoZXRpY2tsZW4gPCAxNiArIEVWUF9NQVhfSVZfTEVOR1RIKSB7CisgICAgcmV0dXJuIDI7CiAgIH0KLSAgY29uc3QgdWludDhfdCAqaXYgPSB0aWNrZXQgKyBTU0xfVElDS0VUX0tFWV9OQU1FX0xFTjsKIAotICBpZiAoc3NsX2N0eC0+dGxzZXh0X3RpY2tldF9rZXlfY2IgIT0gTlVMTCkgewotICAgIGludCBjYl9yZXQgPSBzc2xfY3R4LT50bHNleHRfdGlja2V0X2tleV9jYihzc2wsICh1aW50OF90Kil0aWNrZXQgLyogbmFtZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKWl2LCAmY2lwaGVyX2N0eCwgJmhtYWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGRlY3J5cHQgKi8pOwotICAgIGlmIChjYl9yZXQgPCAwKSB7Ci0gICAgICByZXQgPSAwOwotICAgICAgZ290byBkb25lOworICAvKiBJbml0aWFsaXplIHNlc3Npb24gdGlja2V0IGVuY3J5cHRpb24gYW5kIEhNQUMgY29udGV4dHMgKi8KKyAgSE1BQ19DVFhfaW5pdCgmaGN0eCk7CisgIEVWUF9DSVBIRVJfQ1RYX2luaXQoJmN0eCk7CisgIGlmICh0Y3R4LT50bHNleHRfdGlja2V0X2tleV9jYikgeworICAgIHVpbnQ4X3QgKm5jdGljayA9ICh1aW50OF90ICopZXRpY2s7CisgICAgaW50IHJ2ID0gdGN0eC0+dGxzZXh0X3RpY2tldF9rZXlfY2IocywgbmN0aWNrLCBuY3RpY2sgKyAxNiwgJmN0eCwgJmhjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBkZWNyeXB0ICovKTsKKyAgICBpZiAocnYgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGlmIChjYl9yZXQgPT0gMCkgewotICAgICAgZ290byBkb25lOworICAgIGlmIChydiA9PSAwKSB7CisgICAgICByZXR1cm4gMjsKICAgICB9Ci0gICAgaWYgKGNiX3JldCA9PSAyKSB7Ci0gICAgICAqb3V0X3NlbmRfdGlja2V0ID0gMTsKKyAgICBpZiAocnYgPT0gMikgeworICAgICAgcmVuZXdfdGlja2V0ID0gMTsKICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgLyogQ2hlY2sgdGhlIGtleSBuYW1lIG1hdGNoZXMuICovCi0gICAgaWYgKG1lbWNtcCh0aWNrZXQsIHNzbF9jdHgtPnRsc2V4dF90aWNrX2tleV9uYW1lLAotICAgICAgICAgICAgICAgU1NMX1RJQ0tFVF9LRVlfTkFNRV9MRU4pICE9IDApIHsKLSAgICAgIGdvdG8gZG9uZTsKKyAgICAvKiBDaGVjayBrZXkgbmFtZSBtYXRjaGVzICovCisgICAgaWYgKG1lbWNtcChldGljaywgdGN0eC0+dGxzZXh0X3RpY2tfa2V5X25hbWUsIDE2KSkgeworICAgICAgcmV0dXJuIDI7CiAgICAgfQotICAgIGlmICghSE1BQ19Jbml0X2V4KCZobWFjX2N0eCwgc3NsX2N0eC0+dGxzZXh0X3RpY2tfaG1hY19rZXksCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNzbF9jdHgtPnRsc2V4dF90aWNrX2htYWNfa2V5KSwgdGxzZXh0X3RpY2tfbWQoKSwKKyAgICBpZiAoIUhNQUNfSW5pdF9leCgmaGN0eCwgdGN0eC0+dGxzZXh0X3RpY2tfaG1hY19rZXksIDE2LCB0bHNleHRfdGlja19tZCgpLAogICAgICAgICAgICAgICAgICAgICAgIE5VTEwpIHx8Ci0gICAgICAgICFFVlBfRGVjcnlwdEluaXRfZXgoJmNpcGhlcl9jdHgsIEVWUF9hZXNfMTI4X2NiYygpLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF9jdHgtPnRsc2V4dF90aWNrX2Flc19rZXksIGl2KSkgewotICAgICAgcmV0ID0gMDsKLSAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgIUVWUF9EZWNyeXB0SW5pdF9leCgmY3R4LCBFVlBfYWVzXzEyOF9jYmMoKSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3R4LT50bHNleHRfdGlja19hZXNfa2V5LCBldGljayArIDE2KSkgeworICAgICAgSE1BQ19DVFhfY2xlYW51cCgmaGN0eCk7CisgICAgICBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjdHgpOworICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgfQotICBzaXplX3QgaXZfbGVuID0gRVZQX0NJUEhFUl9DVFhfaXZfbGVuZ3RoKCZjaXBoZXJfY3R4KTsKIAotICAvKiBDaGVjayB0aGUgTUFDIGF0IHRoZSBlbmQgb2YgdGhlIHRpY2tldC4gKi8KLSAgdWludDhfdCBtYWNbRVZQX01BWF9NRF9TSVpFXTsKLSAgc2l6ZV90IG1hY19sZW4gPSBITUFDX3NpemUoJmhtYWNfY3R4KTsKLSAgaWYgKHRpY2tldF9sZW4gPCBTU0xfVElDS0VUX0tFWV9OQU1FX0xFTiArIGl2X2xlbiArIDEgKyBtYWNfbGVuKSB7CisgIC8qIEZpcnN0LCBjaGVjayB0aGUgTUFDLiBUaGUgTUFDIGlzIGF0IHRoZSBlbmQgb2YgdGhlIHRpY2tldC4gKi8KKyAgbWxlbiA9IEhNQUNfc2l6ZSgmaGN0eCk7CisgIGlmICgoc2l6ZV90KSBldGlja2xlbiA8IDE2ICsgRVZQX0NJUEhFUl9DVFhfaXZfbGVuZ3RoKCZjdHgpICsgMSArIG1sZW4pIHsKICAgICAvKiBUaGUgdGlja2V0IG11c3QgYmUgbGFyZ2UgZW5vdWdoIGZvciBrZXkgbmFtZSwgSVYsIGRhdGEsIGFuZCBNQUMuICovCi0gICAgZ290byBkb25lOworICAgIEhNQUNfQ1RYX2NsZWFudXAoJmhjdHgpOworICAgIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisgICAgcmV0dXJuIDI7CiAgIH0KLSAgSE1BQ19VcGRhdGUoJmhtYWNfY3R4LCB0aWNrZXQsIHRpY2tldF9sZW4gLSBtYWNfbGVuKTsKLSAgSE1BQ19GaW5hbCgmaG1hY19jdHgsIG1hYywgTlVMTCk7Ci0gIGlmIChDUllQVE9fbWVtY21wKG1hYywgdGlja2V0ICsgKHRpY2tldF9sZW4gLSBtYWNfbGVuKSwgbWFjX2xlbikgIT0gMCkgewotICAgIGdvdG8gZG9uZTsKKyAgZXRpY2tsZW4gLT0gbWxlbjsKKyAgLyogQ2hlY2sgSE1BQyBvZiBlbmNyeXB0ZWQgdGlja2V0ICovCisgIEhNQUNfVXBkYXRlKCZoY3R4LCBldGljaywgZXRpY2tsZW4pOworICBITUFDX0ZpbmFsKCZoY3R4LCB0aWNrX2htYWMsIE5VTEwpOworICBITUFDX0NUWF9jbGVhbnVwKCZoY3R4KTsKKyAgaWYgKENSWVBUT19tZW1jbXAodGlja19obWFjLCBldGljayArIGV0aWNrbGVuLCBtbGVuKSkgeworICAgIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisgICAgcmV0dXJuIDI7CiAgIH0KIAotICAvKiBEZWNyeXB0IHRoZSBzZXNzaW9uIGRhdGEuICovCi0gIGNvbnN0IHVpbnQ4X3QgKmNpcGhlcnRleHQgPSB0aWNrZXQgKyBTU0xfVElDS0VUX0tFWV9OQU1FX0xFTiArIGl2X2xlbjsKLSAgc2l6ZV90IGNpcGhlcnRleHRfbGVuID0gdGlja2V0X2xlbiAtIFNTTF9USUNLRVRfS0VZX05BTUVfTEVOIC0gaXZfbGVuIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjX2xlbjsKLSAgcGxhaW50ZXh0ID0gT1BFTlNTTF9tYWxsb2MoY2lwaGVydGV4dF9sZW4pOwotICBpZiAocGxhaW50ZXh0ID09IE5VTEwpIHsKLSAgICByZXQgPSAwOwotICAgIGdvdG8gZG9uZTsKKyAgLyogQXR0ZW1wdCB0byBkZWNyeXB0IHNlc3Npb24gZGF0YSAqLworICAvKiBNb3ZlIHAgYWZ0ZXIgSVYgdG8gc3RhcnQgb2YgZW5jcnlwdGVkIHRpY2tldCwgdXBkYXRlIGxlbmd0aCAqLworICBwID0gZXRpY2sgKyAxNiArIEVWUF9DSVBIRVJfQ1RYX2l2X2xlbmd0aCgmY3R4KTsKKyAgZXRpY2tsZW4gLT0gMTYgKyBFVlBfQ0lQSEVSX0NUWF9pdl9sZW5ndGgoJmN0eCk7CisgIHNkZWMgPSBPUEVOU1NMX21hbGxvYyhldGlja2xlbik7CisgIGlmICghc2RlYykgeworICAgIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisgICAgcmV0dXJuIC0xOwogICB9Ci0gIGlmIChjaXBoZXJ0ZXh0X2xlbiA+PSBJTlRfTUFYKSB7Ci0gICAgZ290byBkb25lOworICBFVlBfRGVjcnlwdFVwZGF0ZSgmY3R4LCBzZGVjLCAmc2xlbiwgcCwgZXRpY2tsZW4pOworICBpZiAoRVZQX0RlY3J5cHRGaW5hbF9leCgmY3R4LCBzZGVjICsgc2xlbiwgJm1sZW4pIDw9IDApIHsKKyAgICBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjdHgpOworICAgIE9QRU5TU0xfZnJlZShzZGVjKTsKKyAgICByZXR1cm4gMjsKICAgfQotICBpbnQgbGVuMSwgbGVuMjsKLSAgaWYgKCFFVlBfRGVjcnlwdFVwZGF0ZSgmY2lwaGVyX2N0eCwgcGxhaW50ZXh0LCAmbGVuMSwgY2lwaGVydGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWNpcGhlcnRleHRfbGVuKSB8fAotICAgICAgIUVWUF9EZWNyeXB0RmluYWxfZXgoJmNpcGhlcl9jdHgsIHBsYWludGV4dCArIGxlbjEsICZsZW4yKSkgewotICAgIEVSUl9jbGVhcl9lcnJvcigpOyAvKiBEb24ndCBsZWF2ZSBhbiBlcnJvciBvbiB0aGUgcXVldWUuICovCi0gICAgZ290byBkb25lOworICBzbGVuICs9IG1sZW47CisgIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisgIHAgPSBzZGVjOworCisgIHNlc3MgPSBkMmlfU1NMX1NFU1NJT04oTlVMTCwgJnAsIHNsZW4pOworICBPUEVOU1NMX2ZyZWUoc2RlYyk7CisgIGlmIChzZXNzKSB7CisgICAgLyogVGhlIHNlc3Npb24gSUQsIGlmIG5vbi1lbXB0eSwgaXMgdXNlZCBieSBzb21lIGNsaWVudHMgdG8gZGV0ZWN0IHRoYXQgdGhlCisgICAgICogdGlja2V0IGhhcyBiZWVuIGFjY2VwdGVkLiBTbyB3ZSBjb3B5IGl0IHRvIHRoZSBzZXNzaW9uIHN0cnVjdHVyZS4gSWYgaXQKKyAgICAgKiBpcyBlbXB0eSBzZXQgbGVuZ3RoIHRvIHplcm8gYXMgcmVxdWlyZWQgYnkgc3RhbmRhcmQuICovCisgICAgaWYgKHNlc3NsZW4pIHsKKyAgICAgIG1lbWNweShzZXNzLT5zZXNzaW9uX2lkLCBzZXNzX2lkLCBzZXNzbGVuKTsKKyAgICB9CisgICAgc2Vzcy0+c2Vzc2lvbl9pZF9sZW5ndGggPSBzZXNzbGVuOworICAgICpwc2VzcyA9IHNlc3M7CisgICAgaWYgKHJlbmV3X3RpY2tldCkgeworICAgICAgcmV0dXJuIDQ7CisgICAgfQorICAgIHJldHVybiAzOwogICB9CiAKLSAgLyogRGVjb2RlIHRoZSBzZXNzaW9uLiAqLwotICBTU0xfU0VTU0lPTiAqc2Vzc2lvbiA9IFNTTF9TRVNTSU9OX2Zyb21fYnl0ZXMocGxhaW50ZXh0LCBsZW4xICsgbGVuMik7Ci0gIGlmIChzZXNzaW9uID09IE5VTEwpIHsKLSAgICBFUlJfY2xlYXJfZXJyb3IoKTsgLyogRG9uJ3QgbGVhdmUgYW4gZXJyb3Igb24gdGhlIHF1ZXVlLiAqLwotICAgIGdvdG8gZG9uZTsKLSAgfQotCi0gIC8qIENvcHkgdGhlIGNsaWVudCdzIHNlc3Npb24gSUQgaW50byB0aGUgbmV3IHNlc3Npb24sIHRvIGRlbm90ZSB0aGUgdGlja2V0IGhhcwotICAgKiBiZWVuIGFjY2VwdGVkLiAqLwotICBtZW1jcHkoc2Vzc2lvbi0+c2Vzc2lvbl9pZCwgc2Vzc2lvbl9pZCwgc2Vzc2lvbl9pZF9sZW4pOwotICBzZXNzaW9uLT5zZXNzaW9uX2lkX2xlbmd0aCA9IHNlc3Npb25faWRfbGVuOwotCi0gICpvdXRfc2Vzc2lvbiA9IHNlc3Npb247Ci0KLWRvbmU6Ci0gIE9QRU5TU0xfZnJlZShwbGFpbnRleHQpOwotICBITUFDX0NUWF9jbGVhbnVwKCZobWFjX2N0eCk7Ci0gIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmNpcGhlcl9jdHgpOwotICByZXR1cm4gcmV0OworICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgLyogRm9yIHNlc3Npb24gcGFyc2UgZmFpbHVyZSwgaW5kaWNhdGUgdGhhdCB3ZSBuZWVkIHRvIHNlbmQgYSBuZXcgdGlja2V0LiAqLworICByZXR1cm4gMjsKIH0KIAogLyogVGFibGVzIHRvIHRyYW5zbGF0ZSBmcm9tIE5JRHMgdG8gVExTIHYxLjIgaWRzICovCkBAIC0yNzY5LDEyICsyMjMzLDE4IEBACiAgIHJldHVybiAtMTsKIH0KIAotaW50IHRsczEyX2dldF9zaWdpZChpbnQgcGtleV90eXBlKSB7Ci0gIHJldHVybiB0bHMxMl9maW5kX2lkKHBrZXlfdHlwZSwgdGxzMTJfc2lnLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGxzMTJfc2lnKSAvIHNpemVvZih0bHMxMl9sb29rdXApKTsKK3N0YXRpYyBpbnQgdGxzMTJfZmluZF9uaWQoaW50IGlkLCBjb25zdCB0bHMxMl9sb29rdXAgKnRhYmxlLCBzaXplX3QgdGxlbikgeworICBzaXplX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IHRsZW47IGkrKykgeworICAgIGlmICh0YWJsZVtpXS5pZCA9PSBpZCkgeworICAgICAgcmV0dXJuIHRhYmxlW2ldLm5pZDsKKyAgICB9CisgIH0KKworICByZXR1cm4gTklEX3VuZGVmOwogfQogCi1pbnQgdGxzMTJfZ2V0X3NpZ2FuZGhhc2goU1NMICpzc2wsIHVpbnQ4X3QgKnAsIGNvbnN0IEVWUF9NRCAqbWQpIHsKK2ludCB0bHMxMl9nZXRfc2lnYW5kaGFzaCh1aW50OF90ICpwLCBjb25zdCBFVlBfUEtFWSAqcGssIGNvbnN0IEVWUF9NRCAqbWQpIHsKICAgaW50IHNpZ19pZCwgbWRfaWQ7CiAKICAgaWYgKCFtZCkgewpAQCAtMjc4Nyw3ICsyMjU3LDcgQEAKICAgICByZXR1cm4gMDsKICAgfQogCi0gIHNpZ19pZCA9IHRsczEyX2dldF9zaWdpZChzc2xfcHJpdmF0ZV9rZXlfdHlwZShzc2wpKTsKKyAgc2lnX2lkID0gdGxzMTJfZ2V0X3NpZ2lkKHBrKTsKICAgaWYgKHNpZ19pZCA9PSAtMSkgewogICAgIHJldHVybiAwOwogICB9CkBAIC0yNzk3LDYgKzIyNjcsMTEgQEAKICAgcmV0dXJuIDE7CiB9CiAKK2ludCB0bHMxMl9nZXRfc2lnaWQoY29uc3QgRVZQX1BLRVkgKnBrKSB7CisgIHJldHVybiB0bHMxMl9maW5kX2lkKHBrLT50eXBlLCB0bHMxMl9zaWcsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0bHMxMl9zaWcpIC8gc2l6ZW9mKHRsczEyX2xvb2t1cCkpOworfQorCiBjb25zdCBFVlBfTUQgKnRsczEyX2dldF9oYXNoKHVpbnQ4X3QgaGFzaF9hbGcpIHsKICAgc3dpdGNoIChoYXNoX2FsZykgewogICAgIGNhc2UgVExTRVhUX2hhc2hfbWQ1OgpAQCAtMjgzNywxMjkgKzIzMTIsMjU2IEBACiAgIH0KIH0KIAotT1BFTlNTTF9DT01QSUxFX0FTU0VSVChzaXplb2YoVExTX1NJR0FMR1MpID09IDIsCi0gICAgc2l6ZW9mX3Rsc19zaWdhbGdzX2lzX25vdF90d28pOwotCi1pbnQgdGxzMV9wYXJzZV9wZWVyX3NpZ2FsZ3MoU1NMICpzc2wsIGNvbnN0IENCUyAqaW5fc2lnYWxncykgewotICAvKiBFeHRlbnNpb24gaWdub3JlZCBmb3IgaW5hcHByb3ByaWF0ZSB2ZXJzaW9ucyAqLwotICBpZiAoIVNTTF9VU0VfU0lHQUxHUyhzc2wpKSB7Ci0gICAgcmV0dXJuIDE7CisvKiBDb252ZXJ0IFRMUyAxLjIgc2lnbmF0dXJlIGFsZ29yaXRobSBleHRlbnNpb24gdmFsdWVzIGludG8gTklEcyAqLworc3RhdGljIHZvaWQgdGxzMV9sb29rdXBfc2lnYWxnKGludCAqcGhhc2hfbmlkLCBpbnQgKnBzaWduX25pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBzaWduaGFzaF9uaWQsIGNvbnN0IHVpbnQ4X3QgKmRhdGEpIHsKKyAgaW50IHNpZ25fbmlkID0gMCwgaGFzaF9uaWQgPSAwOworICBpZiAoIXBoYXNoX25pZCAmJiAhcHNpZ25fbmlkICYmICFwc2lnbmhhc2hfbmlkKSB7CisgICAgcmV0dXJuOwogICB9CiAKLSAgQ0VSVCAqY29uc3QgY2VydCA9IHNzbC0+Y2VydDsKLSAgT1BFTlNTTF9mcmVlKGNlcnQtPnBlZXJfc2lnYWxncyk7Ci0gIGNlcnQtPnBlZXJfc2lnYWxncyA9IE5VTEw7Ci0gIGNlcnQtPnBlZXJfc2lnYWxnc2xlbiA9IDA7Ci0KLSAgc2l6ZV90IG51bV9zaWdhbGdzID0gQ0JTX2xlbihpbl9zaWdhbGdzKTsKLQotICBpZiAobnVtX3NpZ2FsZ3MgJSAyICE9IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBudW1fc2lnYWxncyAvPSAyOwotCi0gIC8qIHN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtcyBpbiB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdCBpcwotICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiAqLwotICBpZiAobnVtX3NpZ2FsZ3MgPT0gMCkgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgLyogVGhpcyBtdWx0aXBsaWNhdGlvbiBkb2Vzbid0IG92ZXJmbG93IGJlY2F1c2Ugc2l6ZW9mKFRMU19TSUdBTEdTKSBpcyB0d28KLSAgICogKHN0YXRpY2FsbHkgYXNzZXJ0ZWQgYWJvdmUpIGFuZCB3ZSBqdXN0IGRpdmlkZWQgfG51bV9zaWdhbGdzfCBieSB0d28uICovCi0gIGNlcnQtPnBlZXJfc2lnYWxncyA9IE9QRU5TU0xfbWFsbG9jKG51bV9zaWdhbGdzICogc2l6ZW9mKFRMU19TSUdBTEdTKSk7Ci0gIGlmIChjZXJ0LT5wZWVyX3NpZ2FsZ3MgPT0gTlVMTCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGNlcnQtPnBlZXJfc2lnYWxnc2xlbiA9IG51bV9zaWdhbGdzOwotCi0gIENCUyBzaWdhbGdzOwotICBDQlNfaW5pdCgmc2lnYWxncywgQ0JTX2RhdGEoaW5fc2lnYWxncyksIENCU19sZW4oaW5fc2lnYWxncykpOwotCi0gIHNpemVfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NpZ2FsZ3M7IGkrKykgewotICAgIFRMU19TSUdBTEdTICpjb25zdCBzaWdhbGcgPSAmY2VydC0+cGVlcl9zaWdhbGdzW2ldOwotICAgIGlmICghQ0JTX2dldF91OCgmc2lnYWxncywgJnNpZ2FsZy0+cmhhc2gpIHx8Ci0gICAgICAgICFDQlNfZ2V0X3U4KCZzaWdhbGdzLCAmc2lnYWxnLT5yc2lnbikpIHsKLSAgICAgIHJldHVybiAwOworICBpZiAocGhhc2hfbmlkIHx8IHBzaWduaGFzaF9uaWQpIHsKKyAgICBoYXNoX25pZCA9IHRsczEyX2ZpbmRfbmlkKGRhdGFbMF0sIHRsczEyX21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRsczEyX21kKSAvIHNpemVvZih0bHMxMl9sb29rdXApKTsKKyAgICBpZiAocGhhc2hfbmlkKSB7CisgICAgICAqcGhhc2hfbmlkID0gaGFzaF9uaWQ7CiAgICAgfQogICB9CiAKKyAgaWYgKHBzaWduX25pZCB8fCBwc2lnbmhhc2hfbmlkKSB7CisgICAgc2lnbl9uaWQgPSB0bHMxMl9maW5kX25pZChkYXRhWzFdLCB0bHMxMl9zaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGxzMTJfc2lnKSAvIHNpemVvZih0bHMxMl9sb29rdXApKTsKKyAgICBpZiAocHNpZ25fbmlkKSB7CisgICAgICAqcHNpZ25fbmlkID0gc2lnbl9uaWQ7CisgICAgfQorICB9CisKKyAgaWYgKHBzaWduaGFzaF9uaWQpIHsKKyAgICBpZiAoc2lnbl9uaWQgJiYgaGFzaF9uaWQpIHsKKyAgICAgIE9CSl9maW5kX3NpZ2lkX2J5X2FsZ3MocHNpZ25oYXNoX25pZCwgaGFzaF9uaWQsIHNpZ25fbmlkKTsKKyAgICB9IGVsc2UgeworICAgICAgKnBzaWduaGFzaF9uaWQgPSBOSURfdW5kZWY7CisgICAgfQorICB9Cit9CisKKy8qIEdpdmVuIHByZWZlcmVuY2UgYW5kIGFsbG93ZWQgc2lnYWxncyBzZXQgc2hhcmVkIHNpZ2FsZ3MgKi8KK3N0YXRpYyBpbnQgdGxzMTJfZG9fc2hhcmVkX3NpZ2FsZ3MoVExTX1NJR0FMR1MgKnNoc2lnLCBjb25zdCB1aW50OF90ICpwcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcHJlZmxlbiwgY29uc3QgdWludDhfdCAqYWxsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhbGxvd2xlbikgeworICBjb25zdCB1aW50OF90ICpwdG1wLCAqYXRtcDsKKyAgc2l6ZV90IGksIGosIG5tYXRjaCA9IDA7CisKKyAgZm9yIChpID0gMCwgcHRtcCA9IHByZWY7IGkgPCBwcmVmbGVuOyBpICs9IDIsIHB0bXAgKz0gMikgeworICAgIC8qIFNraXAgZGlzYWJsZWQgaGFzaGVzIG9yIHNpZ25hdHVyZSBhbGdvcml0aG1zICovCisgICAgaWYgKHRsczEyX2dldF9oYXNoKHB0bXBbMF0pID09IE5VTEwgfHwKKyAgICAgICAgdGxzMTJfZ2V0X3BrZXlfdHlwZShwdG1wWzFdKSA9PSAtMSkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgZm9yIChqID0gMCwgYXRtcCA9IGFsbG93OyBqIDwgYWxsb3dsZW47IGogKz0gMiwgYXRtcCArPSAyKSB7CisgICAgICBpZiAocHRtcFswXSA9PSBhdG1wWzBdICYmIHB0bXBbMV0gPT0gYXRtcFsxXSkgeworICAgICAgICBubWF0Y2grKzsKKyAgICAgICAgaWYgKHNoc2lnKSB7CisgICAgICAgICAgc2hzaWctPnJoYXNoID0gcHRtcFswXTsKKyAgICAgICAgICBzaHNpZy0+cnNpZ24gPSBwdG1wWzFdOworICAgICAgICAgIHRsczFfbG9va3VwX3NpZ2FsZygmc2hzaWctPmhhc2hfbmlkLCAmc2hzaWctPnNpZ25fbmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hzaWctPnNpZ25hbmRoYXNoX25pZCwgcHRtcCk7CisgICAgICAgICAgc2hzaWcrKzsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBubWF0Y2g7Cit9CisKKy8qIFNldCBzaGFyZWQgc2lnbmF0dXJlIGFsZ29yaXRobXMgZm9yIFNTTCBzdHJ1Y3R1cmVzICovCitzdGF0aWMgaW50IHRsczFfc2V0X3NoYXJlZF9zaWdhbGdzKFNTTCAqcykgeworICBjb25zdCB1aW50OF90ICpwcmVmLCAqYWxsb3csICpjb25mOworICBzaXplX3QgcHJlZmxlbiwgYWxsb3dsZW4sIGNvbmZsZW47CisgIHNpemVfdCBubWF0Y2g7CisgIFRMU19TSUdBTEdTICpzYWxncyA9IE5VTEw7CisgIENFUlQgKmMgPSBzLT5jZXJ0OworCisgIE9QRU5TU0xfZnJlZShjLT5zaGFyZWRfc2lnYWxncyk7CisgIGMtPnNoYXJlZF9zaWdhbGdzID0gTlVMTDsKKyAgYy0+c2hhcmVkX3NpZ2FsZ3NsZW4gPSAwOworCisgIC8qIElmIGNsaWVudCB1c2UgY2xpZW50IHNpZ25hdHVyZSBhbGdvcml0aG1zIGlmIG5vdCBOVUxMICovCisgIGlmICghcy0+c2VydmVyICYmIGMtPmNsaWVudF9zaWdhbGdzKSB7CisgICAgY29uZiA9IGMtPmNsaWVudF9zaWdhbGdzOworICAgIGNvbmZsZW4gPSBjLT5jbGllbnRfc2lnYWxnc2xlbjsKKyAgfSBlbHNlIGlmIChjLT5jb25mX3NpZ2FsZ3MpIHsKKyAgICBjb25mID0gYy0+Y29uZl9zaWdhbGdzOworICAgIGNvbmZsZW4gPSBjLT5jb25mX3NpZ2FsZ3NsZW47CisgIH0gZWxzZSB7CisgICAgY29uZmxlbiA9IHRsczEyX2dldF9wc2lnYWxncyhzLCAmY29uZik7CisgIH0KKworICBpZiAocy0+b3B0aW9ucyAmIFNTTF9PUF9DSVBIRVJfU0VSVkVSX1BSRUZFUkVOQ0UpIHsKKyAgICBwcmVmID0gY29uZjsKKyAgICBwcmVmbGVuID0gY29uZmxlbjsKKyAgICBhbGxvdyA9IGMtPnBlZXJfc2lnYWxnczsKKyAgICBhbGxvd2xlbiA9IGMtPnBlZXJfc2lnYWxnc2xlbjsKKyAgfSBlbHNlIHsKKyAgICBhbGxvdyA9IGNvbmY7CisgICAgYWxsb3dsZW4gPSBjb25mbGVuOworICAgIHByZWYgPSBjLT5wZWVyX3NpZ2FsZ3M7CisgICAgcHJlZmxlbiA9IGMtPnBlZXJfc2lnYWxnc2xlbjsKKyAgfQorCisgIG5tYXRjaCA9IHRsczEyX2RvX3NoYXJlZF9zaWdhbGdzKE5VTEwsIHByZWYsIHByZWZsZW4sIGFsbG93LCBhbGxvd2xlbik7CisgIGlmICghbm1hdGNoKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBzYWxncyA9IE9QRU5TU0xfbWFsbG9jKG5tYXRjaCAqIHNpemVvZihUTFNfU0lHQUxHUykpOworICBpZiAoIXNhbGdzKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBubWF0Y2ggPSB0bHMxMl9kb19zaGFyZWRfc2lnYWxncyhzYWxncywgcHJlZiwgcHJlZmxlbiwgYWxsb3csIGFsbG93bGVuKTsKKyAgYy0+c2hhcmVkX3NpZ2FsZ3MgPSBzYWxnczsKKyAgYy0+c2hhcmVkX3NpZ2FsZ3NsZW4gPSBubWF0Y2g7CisgIHJldHVybiAxOworfQorCisvKiBTZXQgcHJlZmVycmVkIGRpZ2VzdCBmb3IgZWFjaCBrZXkgdHlwZSAqLworaW50IHRsczFfcHJvY2Vzc19zaWdhbGdzKFNTTCAqcywgY29uc3QgQ0JTICpzaWdhbGdzKSB7CisgIENFUlQgKmMgPSBzLT5jZXJ0OworCisgIC8qIEV4dGVuc2lvbiBpZ25vcmVkIGZvciBpbmFwcHJvcHJpYXRlIHZlcnNpb25zICovCisgIGlmICghU1NMX1VTRV9TSUdBTEdTKHMpKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoQ0JTX2xlbihzaWdhbGdzKSAlIDIgIT0gMCB8fAorICAgICAgIUNCU19zdG93KHNpZ2FsZ3MsICZjLT5wZWVyX3NpZ2FsZ3MsICZjLT5wZWVyX3NpZ2FsZ3NsZW4pIHx8CisgICAgICAhdGxzMV9zZXRfc2hhcmVkX3NpZ2FsZ3MocykpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCiAgIHJldHVybiAxOwogfQogCi1jb25zdCBFVlBfTUQgKnRsczFfY2hvb3NlX3NpZ25pbmdfZGlnZXN0KFNTTCAqc3NsKSB7Ci0gIENFUlQgKmNlcnQgPSBzc2wtPmNlcnQ7Ci0gIGludCB0eXBlID0gc3NsX3ByaXZhdGVfa2V5X3R5cGUoc3NsKTsKLSAgc2l6ZV90IGksIGo7Citjb25zdCBFVlBfTUQgKnRsczFfY2hvb3NlX3NpZ25pbmdfZGlnZXN0KFNTTCAqcywgRVZQX1BLRVkgKnBrZXkpIHsKKyAgQ0VSVCAqYyA9IHMtPmNlcnQ7CisgIGludCB0eXBlID0gRVZQX1BLRVlfaWQocGtleSk7CisgIHNpemVfdCBpOwogCi0gIHN0YXRpYyBjb25zdCBpbnQga0RlZmF1bHREaWdlc3RMaXN0W10gPSB7TklEX3NoYTI1NiwgTklEX3NoYTM4NCwgTklEX3NoYTUxMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSURfc2hhMjI0LCBOSURfc2hhMX07Ci0KLSAgY29uc3QgaW50ICpkaWdlc3RfbmlkcyA9IGtEZWZhdWx0RGlnZXN0TGlzdDsKLSAgc2l6ZV90IG51bV9kaWdlc3RfbmlkcyA9Ci0gICAgICBzaXplb2Yoa0RlZmF1bHREaWdlc3RMaXN0KSAvIHNpemVvZihrRGVmYXVsdERpZ2VzdExpc3RbMF0pOwotICBpZiAoY2VydC0+ZGlnZXN0X25pZHMgIT0gTlVMTCkgewotICAgIGRpZ2VzdF9uaWRzID0gY2VydC0+ZGlnZXN0X25pZHM7Ci0gICAgbnVtX2RpZ2VzdF9uaWRzID0gY2VydC0+bnVtX2RpZ2VzdF9uaWRzOwotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IG51bV9kaWdlc3RfbmlkczsgaSsrKSB7Ci0gICAgY29uc3QgaW50IGRpZ2VzdF9uaWQgPSBkaWdlc3Rfbmlkc1tpXTsKLSAgICBmb3IgKGogPSAwOyBqIDwgY2VydC0+cGVlcl9zaWdhbGdzbGVuOyBqKyspIHsKLSAgICAgIGNvbnN0IEVWUF9NRCAqbWQgPSB0bHMxMl9nZXRfaGFzaChjZXJ0LT5wZWVyX3NpZ2FsZ3Nbal0ucmhhc2gpOwotICAgICAgaWYgKG1kID09IE5VTEwgfHwKLSAgICAgICAgICBkaWdlc3RfbmlkICE9IEVWUF9NRF90eXBlKG1kKSB8fAotICAgICAgICAgIHRsczEyX2dldF9wa2V5X3R5cGUoY2VydC0+cGVlcl9zaWdhbGdzW2pdLnJzaWduKSAhPSB0eXBlKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICByZXR1cm4gbWQ7CisgIC8qIFNlbGVjdCB0aGUgZmlyc3Qgc2hhcmVkIGRpZ2VzdCBzdXBwb3J0ZWQgYnkgb3VyIGtleS4gKi8KKyAgZm9yIChpID0gMDsgaSA8IGMtPnNoYXJlZF9zaWdhbGdzbGVuOyBpKyspIHsKKyAgICBjb25zdCBFVlBfTUQgKm1kID0gdGxzMTJfZ2V0X2hhc2goYy0+c2hhcmVkX3NpZ2FsZ3NbaV0ucmhhc2gpOworICAgIGlmIChtZCA9PSBOVUxMIHx8CisgICAgICAgIHRsczEyX2dldF9wa2V5X3R5cGUoYy0+c2hhcmVkX3NpZ2FsZ3NbaV0ucnNpZ24pICE9IHR5cGUgfHwKKyAgICAgICAgIUVWUF9QS0VZX3N1cHBvcnRzX2RpZ2VzdChwa2V5LCBtZCkpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KKyAgICByZXR1cm4gbWQ7CiAgIH0KIAogICAvKiBJZiBubyBzdWl0YWJsZSBkaWdlc3QgbWF5IGJlIGZvdW5kLCBkZWZhdWx0IHRvIFNIQS0xLiAqLwogICByZXR1cm4gRVZQX3NoYTEoKTsKIH0KIAotaW50IHRsczFfY2hhbm5lbF9pZF9oYXNoKFNTTCAqc3NsLCB1aW50OF90ICpvdXQsIHNpemVfdCAqb3V0X2xlbikgewotICBpbnQgcmV0ID0gMDsKK2ludCBTU0xfZ2V0X3NpZ2FsZ3MoU1NMICpzLCBpbnQgaWR4LCBpbnQgKnBzaWduLCBpbnQgKnBoYXNoLCBpbnQgKnBzaWduaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcnNpZywgdWludDhfdCAqcmhhc2gpIHsKKyAgY29uc3QgdWludDhfdCAqcHNpZyA9IHMtPmNlcnQtPnBlZXJfc2lnYWxnczsKKworICBpZiAocHNpZyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoaWR4ID49IDApIHsKKyAgICBpZHggPDw9IDE7CisgICAgaWYgKGlkeCA+PSAoaW50KXMtPmNlcnQtPnBlZXJfc2lnYWxnc2xlbikgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHBzaWcgKz0gaWR4OworICAgIGlmIChyaGFzaCkgeworICAgICAgKnJoYXNoID0gcHNpZ1swXTsKKyAgICB9CisgICAgaWYgKHJzaWcpIHsKKyAgICAgICpyc2lnID0gcHNpZ1sxXTsKKyAgICB9CisgICAgdGxzMV9sb29rdXBfc2lnYWxnKHBoYXNoLCBwc2lnbiwgcHNpZ25oYXNoLCBwc2lnKTsKKyAgfQorCisgIHJldHVybiBzLT5jZXJ0LT5wZWVyX3NpZ2FsZ3NsZW4gLyAyOworfQorCitpbnQgU1NMX2dldF9zaGFyZWRfc2lnYWxncyhTU0wgKnMsIGludCBpZHgsIGludCAqcHNpZ24sIGludCAqcGhhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBzaWduaGFzaCwgdWludDhfdCAqcnNpZywgdWludDhfdCAqcmhhc2gpIHsKKyAgVExTX1NJR0FMR1MgKnNoc2lnYWxncyA9IHMtPmNlcnQtPnNoYXJlZF9zaWdhbGdzOworCisgIGlmICghc2hzaWdhbGdzIHx8IGlkeCA+PSAoaW50KXMtPmNlcnQtPnNoYXJlZF9zaWdhbGdzbGVuKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzaHNpZ2FsZ3MgKz0gaWR4OworICBpZiAocGhhc2gpIHsKKyAgICAqcGhhc2ggPSBzaHNpZ2FsZ3MtPmhhc2hfbmlkOworICB9CisgIGlmIChwc2lnbikgeworICAgICpwc2lnbiA9IHNoc2lnYWxncy0+c2lnbl9uaWQ7CisgIH0KKyAgaWYgKHBzaWduaGFzaCkgeworICAgICpwc2lnbmhhc2ggPSBzaHNpZ2FsZ3MtPnNpZ25hbmRoYXNoX25pZDsKKyAgfQorICBpZiAocnNpZykgeworICAgICpyc2lnID0gc2hzaWdhbGdzLT5yc2lnbjsKKyAgfQorICBpZiAocmhhc2gpIHsKKyAgICAqcmhhc2ggPSBzaHNpZ2FsZ3MtPnJoYXNoOworICB9CisKKyAgcmV0dXJuIHMtPmNlcnQtPnNoYXJlZF9zaWdhbGdzbGVuOworfQorCisvKiB0bHMxX2NoYW5uZWxfaWRfaGFzaCBjYWxjdWxhdGVzIHRoZSBzaWduZWQgZGF0YSBmb3IgYSBDaGFubmVsIElEIG9uIHRoZQorICogZ2l2ZW4gU1NMIGNvbm5lY3Rpb24gYW5kIHdyaXRlcyBpdCB0byB8bWR8LiAqLworaW50IHRsczFfY2hhbm5lbF9pZF9oYXNoKEVWUF9NRF9DVFggKm1kLCBTU0wgKnMpIHsKICAgRVZQX01EX0NUWCBjdHg7CisgIHVpbnQ4X3QgdGVtcF9kaWdlc3RbRVZQX01BWF9NRF9TSVpFXTsKKyAgdW5zaWduZWQgdGVtcF9kaWdlc3RfbGVuOworICBpbnQgaTsKKyAgc3RhdGljIGNvbnN0IGNoYXIga0NsaWVudElETWFnaWNbXSA9ICJUTFMgQ2hhbm5lbCBJRCBzaWduYXR1cmUiOworCisgIGlmIChzLT5zMy0+aGFuZHNoYWtlX2J1ZmZlciAmJgorICAgICAgIXNzbDNfZGlnZXN0X2NhY2hlZF9yZWNvcmRzKHMsIGZyZWVfaGFuZHNoYWtlX2J1ZmZlcikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIEVWUF9EaWdlc3RVcGRhdGUobWQsIGtDbGllbnRJRE1hZ2ljLCBzaXplb2Yoa0NsaWVudElETWFnaWMpKTsKKworICBpZiAocy0+aGl0ICYmIHMtPnMzLT50bHNleHRfY2hhbm5lbF9pZF9uZXcpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrUmVzdW1wdGlvbk1hZ2ljW10gPSAiUmVzdW1wdGlvbiI7CisgICAgRVZQX0RpZ2VzdFVwZGF0ZShtZCwga1Jlc3VtcHRpb25NYWdpYywgc2l6ZW9mKGtSZXN1bXB0aW9uTWFnaWMpKTsKKyAgICBpZiAocy0+c2Vzc2lvbi0+b3JpZ2luYWxfaGFuZHNoYWtlX2hhc2hfbGVuID09IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBFVlBfRGlnZXN0VXBkYXRlKG1kLCBzLT5zZXNzaW9uLT5vcmlnaW5hbF9oYW5kc2hha2VfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgIHMtPnNlc3Npb24tPm9yaWdpbmFsX2hhbmRzaGFrZV9oYXNoX2xlbik7CisgIH0KIAogICBFVlBfTURfQ1RYX2luaXQoJmN0eCk7Ci0gIGlmICghRVZQX0RpZ2VzdEluaXRfZXgoJmN0eCwgRVZQX3NoYTI1NigpLCBOVUxMKSkgewotICAgIGdvdG8gZXJyOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IGNoYXIga0NsaWVudElETWFnaWNbXSA9ICJUTFMgQ2hhbm5lbCBJRCBzaWduYXR1cmUiOwotICBFVlBfRGlnZXN0VXBkYXRlKCZjdHgsIGtDbGllbnRJRE1hZ2ljLCBzaXplb2Yoa0NsaWVudElETWFnaWMpKTsKLQotICBpZiAoc3NsLT5oaXQpIHsKLSAgICBzdGF0aWMgY29uc3QgY2hhciBrUmVzdW1wdGlvbk1hZ2ljW10gPSAiUmVzdW1wdGlvbiI7Ci0gICAgRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCBrUmVzdW1wdGlvbk1hZ2ljLCBzaXplb2Yoa1Jlc3VtcHRpb25NYWdpYykpOwotICAgIGlmIChzc2wtPnNlc3Npb24tPm9yaWdpbmFsX2hhbmRzaGFrZV9oYXNoX2xlbiA9PSAwKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKLSAgICAgIGdvdG8gZXJyOworICBmb3IgKGkgPSAwOyBpIDwgU1NMX01BWF9ESUdFU1Q7IGkrKykgeworICAgIGlmIChzLT5zMy0+aGFuZHNoYWtlX2Rnc3RbaV0gPT0gTlVMTCkgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIEVWUF9EaWdlc3RVcGRhdGUoJmN0eCwgc3NsLT5zZXNzaW9uLT5vcmlnaW5hbF9oYW5kc2hha2VfaGFzaCwKLSAgICAgICAgICAgICAgICAgICAgIHNzbC0+c2Vzc2lvbi0+b3JpZ2luYWxfaGFuZHNoYWtlX2hhc2hfbGVuKTsKKyAgICBpZiAoIUVWUF9NRF9DVFhfY29weV9leCgmY3R4LCBzLT5zMy0+aGFuZHNoYWtlX2Rnc3RbaV0pKSB7CisgICAgICBFVlBfTURfQ1RYX2NsZWFudXAoJmN0eCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgRVZQX0RpZ2VzdEZpbmFsX2V4KCZjdHgsIHRlbXBfZGlnZXN0LCAmdGVtcF9kaWdlc3RfbGVuKTsKKyAgICBFVlBfRGlnZXN0VXBkYXRlKG1kLCB0ZW1wX2RpZ2VzdCwgdGVtcF9kaWdlc3RfbGVuKTsKICAgfQotCi0gIHVpbnQ4X3QgaGFuZHNoYWtlX2hhc2hbRVZQX01BWF9NRF9TSVpFXTsKLSAgaW50IGhhbmRzaGFrZV9oYXNoX2xlbiA9IHRsczFfaGFuZHNoYWtlX2RpZ2VzdChzc2wsIGhhbmRzaGFrZV9oYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoYW5kc2hha2VfaGFzaCkpOwotICBpZiAoaGFuZHNoYWtlX2hhc2hfbGVuIDwgMCkgewotICAgIGdvdG8gZXJyOwotICB9Ci0gIEVWUF9EaWdlc3RVcGRhdGUoJmN0eCwgaGFuZHNoYWtlX2hhc2gsIChzaXplX3QpaGFuZHNoYWtlX2hhc2hfbGVuKTsKLSAgdW5zaWduZWQgbGVuX3U7Ci0gIEVWUF9EaWdlc3RGaW5hbF9leCgmY3R4LCBvdXQsICZsZW5fdSk7Ci0gICpvdXRfbGVuID0gbGVuX3U7Ci0KLSAgcmV0ID0gMTsKLQotZXJyOgogICBFVlBfTURfQ1RYX2NsZWFudXAoJmN0eCk7Ci0gIHJldHVybiByZXQ7CisKKyAgcmV0dXJuIDE7CiB9CiAKIC8qIHRsczFfcmVjb3JkX2hhbmRzaGFrZV9oYXNoZXNfZm9yX2NoYW5uZWxfaWQgcmVjb3JkcyB0aGUgY3VycmVudCBoYW5kc2hha2UKQEAgLTI5NzMsNiArMjU3NSwxMiBAQAogICAgIHJldHVybiAtMTsKICAgfQogCisgIC8qIEl0IG9ubHkgbWFrZXMgc2Vuc2UgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGlmIENoYW5uZWwgSURzIGhhdmUgYmVlbgorICAgKiBuZWdvdGlhdGVkLiAqLworICBpZiAoIXMtPnMzLT50bHNleHRfY2hhbm5lbF9pZF9uZXcpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKwogICBkaWdlc3RfbGVuID0KICAgICAgIHRsczFfaGFuZHNoYWtlX2RpZ2VzdChzLCBzLT5zZXNzaW9uLT5vcmlnaW5hbF9oYW5kc2hha2VfaGFzaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yocy0+c2Vzc2lvbi0+b3JpZ2luYWxfaGFuZHNoYWtlX2hhc2gpKTsKQEAgLTI5ODQsMyArMjU5Miw0OCBAQAogCiAgIHJldHVybiAxOwogfQorCitpbnQgdGxzMV9zZXRfc2lnYWxncyhDRVJUICpjLCBjb25zdCBpbnQgKnBzaWdfbmlkcywgc2l6ZV90IHNhbGdsZW4sCisgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50KSB7CisgIHVpbnQ4X3QgKnNpZ2FsZ3MsICpzcHRyOworICBpbnQgcmhhc2gsIHJzaWduOworICBzaXplX3QgaTsKKworICBpZiAoc2FsZ2xlbiAmIDEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHNpZ2FsZ3MgPSBPUEVOU1NMX21hbGxvYyhzYWxnbGVuKTsKKyAgaWYgKHNpZ2FsZ3MgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgZm9yIChpID0gMCwgc3B0ciA9IHNpZ2FsZ3M7IGkgPCBzYWxnbGVuOyBpICs9IDIpIHsKKyAgICByaGFzaCA9IHRsczEyX2ZpbmRfaWQoKnBzaWdfbmlkcysrLCB0bHMxMl9tZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRsczEyX21kKSAvIHNpemVvZih0bHMxMl9sb29rdXApKTsKKyAgICByc2lnbiA9IHRsczEyX2ZpbmRfaWQoKnBzaWdfbmlkcysrLCB0bHMxMl9zaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0bHMxMl9zaWcpIC8gc2l6ZW9mKHRsczEyX2xvb2t1cCkpOworCisgICAgaWYgKHJoYXNoID09IC0xIHx8IHJzaWduID09IC0xKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgKnNwdHIrKyA9IHJoYXNoOworICAgICpzcHRyKysgPSByc2lnbjsKKyAgfQorCisgIGlmIChjbGllbnQpIHsKKyAgICBPUEVOU1NMX2ZyZWUoYy0+Y2xpZW50X3NpZ2FsZ3MpOworICAgIGMtPmNsaWVudF9zaWdhbGdzID0gc2lnYWxnczsKKyAgICBjLT5jbGllbnRfc2lnYWxnc2xlbiA9IHNhbGdsZW47CisgIH0gZWxzZSB7CisgICAgT1BFTlNTTF9mcmVlKGMtPmNvbmZfc2lnYWxncyk7CisgICAgYy0+Y29uZl9zaWdhbGdzID0gc2lnYWxnczsKKyAgICBjLT5jb25mX3NpZ2FsZ3NsZW4gPSBzYWxnbGVuOworICB9CisKKyAgcmV0dXJuIDE7CisKK2VycjoKKyAgT1BFTlNTTF9mcmVlKHNpZ2FsZ3MpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9zc2wvdDFfcmVuZWcuYyBiL3NyYy9zc2wvdDFfcmVuZWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDAwOWMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NzbC90MV9yZW5lZy5jCkBAIC0wLDAgKzEsMjQ2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYnl0ZXN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKKy8qIEFkZCB0aGUgY2xpZW50J3MgcmVuZWdvdGlhdGlvbiBiaW5kaW5nICovCitpbnQgc3NsX2FkZF9jbGllbnRoZWxsb19yZW5lZ290aWF0ZV9leHQoU1NMICpzLCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgKmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4bGVuKSB7CisgIGlmIChwKSB7CisgICAgaWYgKHMtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWRfbGVuICsgMSA+IG1heGxlbikgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfYWRkX2NsaWVudGhlbGxvX3JlbmVnb3RpYXRlX2V4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1JFTkVHT1RJQVRFX0VYVF9UT09fTE9ORyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBMZW5ndGggYnl0ZSAqLworICAgICpwID0gcy0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZF9sZW47CisgICAgcCsrOworCisgICAgbWVtY3B5KHAsIHMtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWQsCisgICAgICAgICAgIHMtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWRfbGVuKTsKKyAgfQorCisgICpsZW4gPSBzLT5zMy0+cHJldmlvdXNfY2xpZW50X2ZpbmlzaGVkX2xlbiArIDE7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFBhcnNlIHRoZSBjbGllbnQncyByZW5lZ290aWF0aW9uIGJpbmRpbmcgYW5kIGFib3J0IGlmIGl0J3Mgbm90IHJpZ2h0ICovCitpbnQgc3NsX3BhcnNlX2NsaWVudGhlbGxvX3JlbmVnb3RpYXRlX2V4dChTU0wgKnMsIENCUyAqY2JzLCBpbnQgKm91dF9hbGVydCkgeworICBDQlMgcmVuZWdvdGlhdGVkX2Nvbm5lY3Rpb247CisKKyAgaWYgKCFDQlNfZ2V0X3U4X2xlbmd0aF9wcmVmaXhlZChjYnMsICZyZW5lZ290aWF0ZWRfY29ubmVjdGlvbikgfHwKKyAgICAgIENCU19sZW4oY2JzKSAhPSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfcGFyc2VfY2xpZW50aGVsbG9fcmVuZWdvdGlhdGVfZXh0LAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1JFTkVHT1RJQVRJT05fRU5DT0RJTkdfRVJSKTsKKyAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qIENoZWNrIHRoYXQgdGhlIGV4dGVuc2lvbiBtYXRjaGVzICovCisgIGlmICghQ0JTX21lbV9lcXVhbCgmcmVuZWdvdGlhdGVkX2Nvbm5lY3Rpb24sIHMtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWQsCisgICAgICAgICAgICAgICAgICAgICBzLT5zMy0+cHJldmlvdXNfY2xpZW50X2ZpbmlzaGVkX2xlbikpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9wYXJzZV9jbGllbnRoZWxsb19yZW5lZ290aWF0ZV9leHQsCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfUkVORUdPVElBVElPTl9NSVNNQVRDSCk7CisgICAgKm91dF9hbGVydCA9IFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHMtPnMzLT5zZW5kX2Nvbm5lY3Rpb25fYmluZGluZyA9IDE7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIEFkZCB0aGUgc2VydmVyJ3MgcmVuZWdvdGlhdGlvbiBiaW5kaW5nICovCitpbnQgc3NsX2FkZF9zZXJ2ZXJoZWxsb19yZW5lZ290aWF0ZV9leHQoU1NMICpzLCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgKmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4bGVuKSB7CisgIGlmIChwKSB7CisgICAgaWYgKHMtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWRfbGVuICsKKyAgICAgICAgICAgIHMtPnMzLT5wcmV2aW91c19zZXJ2ZXJfZmluaXNoZWRfbGVuICsgMSA+IG1heGxlbikgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfYWRkX3NlcnZlcmhlbGxvX3JlbmVnb3RpYXRlX2V4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1JFTkVHT1RJQVRFX0VYVF9UT09fTE9ORyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBMZW5ndGggYnl0ZSAqLworICAgICpwID0gcy0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZF9sZW4gKworICAgICAgICAgcy0+czMtPnByZXZpb3VzX3NlcnZlcl9maW5pc2hlZF9sZW47CisgICAgcCsrOworCisgICAgbWVtY3B5KHAsIHMtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWQsCisgICAgICAgICAgIHMtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWRfbGVuKTsKKyAgICBwICs9IHMtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWRfbGVuOworCisgICAgbWVtY3B5KHAsIHMtPnMzLT5wcmV2aW91c19zZXJ2ZXJfZmluaXNoZWQsCisgICAgICAgICAgIHMtPnMzLT5wcmV2aW91c19zZXJ2ZXJfZmluaXNoZWRfbGVuKTsKKyAgfQorCisgICpsZW4gPSBzLT5zMy0+cHJldmlvdXNfY2xpZW50X2ZpbmlzaGVkX2xlbiArCisgICAgICAgICBzLT5zMy0+cHJldmlvdXNfc2VydmVyX2ZpbmlzaGVkX2xlbiArIDE7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFBhcnNlIHRoZSBzZXJ2ZXIncyByZW5lZ290aWF0aW9uIGJpbmRpbmcgYW5kIGFib3J0IGlmIGl0J3Mgbm90IHJpZ2h0ICovCitpbnQgc3NsX3BhcnNlX3NlcnZlcmhlbGxvX3JlbmVnb3RpYXRlX2V4dChTU0wgKnMsIENCUyAqY2JzLCBpbnQgKm91dF9hbGVydCkgeworICBpbnQgZXhwZWN0ZWRfbGVuID0KKyAgICAgIHMtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWRfbGVuICsgcy0+czMtPnByZXZpb3VzX3NlcnZlcl9maW5pc2hlZF9sZW47CisgIENCUyByZW5lZ290aWF0ZWRfY29ubmVjdGlvbjsKKyAgY29uc3QgdWludDhfdCAqZDsKKworICAvKiBDaGVjayBmb3IgbG9naWMgZXJyb3JzICovCisgIGFzc2VydCghZXhwZWN0ZWRfbGVuIHx8IHMtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWRfbGVuKTsKKyAgYXNzZXJ0KCFleHBlY3RlZF9sZW4gfHwgcy0+czMtPnByZXZpb3VzX3NlcnZlcl9maW5pc2hlZF9sZW4pOworCisgIC8qIFBhcnNlIG91dCB0aGUgZXh0ZW5zaW9uIGNvbnRlbnRzLiAqLworICBpZiAoIUNCU19nZXRfdThfbGVuZ3RoX3ByZWZpeGVkKGNicywgJnJlbmVnb3RpYXRlZF9jb25uZWN0aW9uKSB8fAorICAgICAgQ0JTX2xlbihjYnMpICE9IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9wYXJzZV9zZXJ2ZXJoZWxsb19yZW5lZ290aWF0ZV9leHQsCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfUkVORUdPVElBVElPTl9FTkNPRElOR19FUlIpOworICAgICpvdXRfYWxlcnQgPSBTU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBDaGVjayB0aGF0IHRoZSBleHRlbnNpb24gbWF0Y2hlcy4gKi8KKyAgaWYgKENCU19sZW4oJnJlbmVnb3RpYXRlZF9jb25uZWN0aW9uKSAhPSBleHBlY3RlZF9sZW4pIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIHNzbF9wYXJzZV9zZXJ2ZXJoZWxsb19yZW5lZ290aWF0ZV9leHQsCisgICAgICAgICAgICAgICAgICAgICAgU1NMX1JfUkVORUdPVElBVElPTl9NSVNNQVRDSCk7CisgICAgKm91dF9hbGVydCA9IFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGQgPSBDQlNfZGF0YSgmcmVuZWdvdGlhdGVkX2Nvbm5lY3Rpb24pOworICBpZiAobWVtY21wKGQsIHMtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWQsCisgICAgICAgICAgICAgcy0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZF9sZW4pKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfcGFyc2Vfc2VydmVyaGVsbG9fcmVuZWdvdGlhdGVfZXh0LAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1JFTkVHT1RJQVRJT05fTUlTTUFUQ0gpOworICAgICpvdXRfYWxlcnQgPSBTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZCArPSBzLT5zMy0+cHJldmlvdXNfY2xpZW50X2ZpbmlzaGVkX2xlbjsKKworICBpZiAobWVtY21wKGQsIHMtPnMzLT5wcmV2aW91c19zZXJ2ZXJfZmluaXNoZWQsCisgICAgICAgICAgICAgcy0+czMtPnByZXZpb3VzX3NlcnZlcl9maW5pc2hlZF9sZW4pKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBzc2xfcGFyc2Vfc2VydmVyaGVsbG9fcmVuZWdvdGlhdGVfZXh0LAorICAgICAgICAgICAgICAgICAgICAgIFNTTF9SX1JFTkVHT1RJQVRJT05fTUlTTUFUQ0gpOworICAgICpvdXRfYWxlcnQgPSBTU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcy0+czMtPnNlbmRfY29ubmVjdGlvbl9iaW5kaW5nID0gMTsKKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy9zc2wvdGVzdC9ic3NsX3NoaW0uY2MgYi9zcmMvc3NsL3Rlc3QvYnNzbF9zaGltLmNjCmluZGV4IGVkYWU2N2IuLjQwY2IxNDkgMTAwNjQ0Ci0tLSBhL3NyYy9zc2wvdGVzdC9ic3NsX3NoaW0uY2MKKysrIGIvc3JjL3NzbC90ZXN0L2Jzc2xfc2hpbS5jYwpAQCAtMzgsMTQgKzM4LDEwIEBACiAjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KICNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYnl0ZXN0cmluZy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvY2lwaGVyLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2htYWMuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KICNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgogCiAjaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICIuLi8uLi9jcnlwdG8vdGVzdC9zY29wZWRfdHlwZXMuaCIKQEAgLTk0LDE3ICs5MCwxMCBAQAogICBTY29wZWRTU0xfU0VTU0lPTiBwZW5kaW5nX3Nlc3Npb247CiAgIGJvb2wgZWFybHlfY2FsbGJhY2tfY2FsbGVkID0gZmFsc2U7CiAgIGJvb2wgaGFuZHNoYWtlX2RvbmUgPSBmYWxzZTsKLSAgLy8gcHJpdmF0ZV9rZXkgaXMgdGhlIHVuZGVybHlpbmcgcHJpdmF0ZSBrZXkgdXNlZCB3aGVuIHRlc3RpbmcgY3VzdG9tIGtleXMuCi0gIFNjb3BlZEVWUF9QS0VZIHByaXZhdGVfa2V5OwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzaWduYXR1cmU7Ci0gIC8vIHNpZ25hdHVyZV9yZXRyaWVzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgYW4gYXN5bmNocm9ub3VzIHNpZ24gb3BlcmF0aW9uIGhhcwotICAvLyBiZWVuIHJldHJpZWQuCi0gIHVuc2lnbmVkIHNpZ25hdHVyZV9yZXRyaWVzID0gMDsKLSAgYm9vbCBnb3RfbmV3X3Nlc3Npb24gPSBmYWxzZTsKIH07CiAKIHN0YXRpYyB2b2lkIFRlc3RTdGF0ZUV4RnJlZSh2b2lkICpwYXJlbnQsIHZvaWQgKnB0ciwgQ1JZUFRPX0VYX0RBVEEgKmFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgbG9uZyBhcmdsLCB2b2lkICphcmdwKSB7CisJCQkgICAgaW50IGluZGV4LCBsb25nIGFyZ2wsIHZvaWQgKmFyZ3ApIHsKICAgZGVsZXRlICgoVGVzdFN0YXRlICopcHRyKTsKIH0KIApAQCAtMTQwLDEzNyArMTI5LDE4IEBACiAgIHJldHVybiBwa2V5OwogfQogCi1zdGF0aWMgaW50IEFzeW5jUHJpdmF0ZUtleVR5cGUoU1NMICpzc2wpIHsKLSAgcmV0dXJuIEVWUF9QS0VZX2lkKEdldFRlc3RTdGF0ZShzc2wpLT5wcml2YXRlX2tleS5nZXQoKSk7Ci19Ci0KLXN0YXRpYyBzaXplX3QgQXN5bmNQcml2YXRlS2V5TWF4U2lnbmF0dXJlTGVuKFNTTCAqc3NsKSB7Ci0gIHJldHVybiBFVlBfUEtFWV9zaXplKEdldFRlc3RTdGF0ZShzc2wpLT5wcml2YXRlX2tleS5nZXQoKSk7Ci19Ci0KLXN0YXRpYyBzc2xfcHJpdmF0ZV9rZXlfcmVzdWx0X3QgQXN5bmNQcml2YXRlS2V5U2lnbigKLSAgICBTU0wgKnNzbCwgdWludDhfdCAqb3V0LCBzaXplX3QgKm91dF9sZW4sIHNpemVfdCBtYXhfb3V0LAotICAgIGNvbnN0IEVWUF9NRCAqbWQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuKSB7Ci0gIFRlc3RTdGF0ZSAqdGVzdF9zdGF0ZSA9IEdldFRlc3RTdGF0ZShzc2wpOwotICBpZiAoIXRlc3Rfc3RhdGUtPnNpZ25hdHVyZS5lbXB0eSgpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJBc3luY1ByaXZhdGVLZXlTaWduIGNhbGxlZCB3aXRoIG9wZXJhdGlvbiBwZW5kaW5nLlxuIik7Ci0gICAgYWJvcnQoKTsKLSAgfQotCi0gIFNjb3BlZEVWUF9QS0VZX0NUWCBjdHgoRVZQX1BLRVlfQ1RYX25ldyh0ZXN0X3N0YXRlLT5wcml2YXRlX2tleS5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKTsKLSAgaWYgKCFjdHgpIHsKLSAgICByZXR1cm4gc3NsX3ByaXZhdGVfa2V5X2ZhaWx1cmU7Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgc2lnbmF0dXJlIGludG8gfHRlc3Rfc3RhdGV8LgotICBzaXplX3QgbGVuID0gMDsKLSAgaWYgKCFFVlBfUEtFWV9zaWduX2luaXQoY3R4LmdldCgpKSB8fAotICAgICAgIUVWUF9QS0VZX0NUWF9zZXRfc2lnbmF0dXJlX21kKGN0eC5nZXQoKSwgbWQpIHx8Ci0gICAgICAhRVZQX1BLRVlfc2lnbihjdHguZ2V0KCksIG51bGxwdHIsICZsZW4sIGluLCBpbl9sZW4pKSB7Ci0gICAgcmV0dXJuIHNzbF9wcml2YXRlX2tleV9mYWlsdXJlOwotICB9Ci0gIHRlc3Rfc3RhdGUtPnNpZ25hdHVyZS5yZXNpemUobGVuKTsKLSAgaWYgKCFFVlBfUEtFWV9zaWduKGN0eC5nZXQoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJnRlc3Rfc3RhdGUtPnNpZ25hdHVyZSksICZsZW4sCi0gICAgICAgICAgICAgICAgICAgICBpbiwgaW5fbGVuKSkgewotICAgIHJldHVybiBzc2xfcHJpdmF0ZV9rZXlfZmFpbHVyZTsKLSAgfQotICB0ZXN0X3N0YXRlLT5zaWduYXR1cmUucmVzaXplKGxlbik7Ci0KLSAgLy8gVGhlIHNpZ25hdHVyZSB3aWxsIGJlIHJlbGVhc2VkIGFzeW5jaHJvbm91c2x5IGluIHxBc3luY1ByaXZhdGVLZXlTaWduQ29tcGxldGV8LgotICByZXR1cm4gc3NsX3ByaXZhdGVfa2V5X3JldHJ5OwotfQotCi1zdGF0aWMgc3NsX3ByaXZhdGVfa2V5X3Jlc3VsdF90IEFzeW5jUHJpdmF0ZUtleVNpZ25Db21wbGV0ZSgKLSAgICBTU0wgKnNzbCwgdWludDhfdCAqb3V0LCBzaXplX3QgKm91dF9sZW4sIHNpemVfdCBtYXhfb3V0KSB7Ci0gIFRlc3RTdGF0ZSAqdGVzdF9zdGF0ZSA9IEdldFRlc3RTdGF0ZShzc2wpOwotICBpZiAodGVzdF9zdGF0ZS0+c2lnbmF0dXJlLmVtcHR5KCkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICJBc3luY1ByaXZhdGVLZXlTaWduQ29tcGxldGUgY2FsbGVkIHdpdGhvdXQgb3BlcmF0aW9uIHBlbmRpbmcuXG4iKTsKLSAgICBhYm9ydCgpOwotICB9Ci0KLSAgaWYgKHRlc3Rfc3RhdGUtPnNpZ25hdHVyZV9yZXRyaWVzIDwgMikgewotICAgIC8vIE9ubHkgcmV0dXJuIHRoZSBzaWduYXR1cmUgb24gdGhlIHNlY29uZCBhdHRlbXB0LCB0byB0ZXN0IGJvdGggaW5jb21wbGV0ZQotICAgIC8vIHxzaWdufCBhbmQgfHNpZ25fY29tcGxldGV8LgotICAgIHJldHVybiBzc2xfcHJpdmF0ZV9rZXlfcmV0cnk7Ci0gIH0KLQotICBpZiAobWF4X291dCA8IHRlc3Rfc3RhdGUtPnNpZ25hdHVyZS5zaXplKCkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dCBidWZmZXIgdG9vIHNtYWxsLlxuIik7Ci0gICAgcmV0dXJuIHNzbF9wcml2YXRlX2tleV9mYWlsdXJlOwotICB9Ci0gIG1lbWNweShvdXQsIGJzc2w6OnZlY3Rvcl9kYXRhKCZ0ZXN0X3N0YXRlLT5zaWduYXR1cmUpLAotICAgICAgICAgdGVzdF9zdGF0ZS0+c2lnbmF0dXJlLnNpemUoKSk7Ci0gICpvdXRfbGVuID0gdGVzdF9zdGF0ZS0+c2lnbmF0dXJlLnNpemUoKTsKLQotICB0ZXN0X3N0YXRlLT5zaWduYXR1cmUuY2xlYXIoKTsKLSAgdGVzdF9zdGF0ZS0+c2lnbmF0dXJlX3JldHJpZXMgPSAwOwotICByZXR1cm4gc3NsX3ByaXZhdGVfa2V5X3N1Y2Nlc3M7Ci19Ci0KLXN0YXRpYyBjb25zdCBTU0xfUFJJVkFURV9LRVlfTUVUSE9EIGdfYXN5bmNfcHJpdmF0ZV9rZXlfbWV0aG9kID0gewotICAgIEFzeW5jUHJpdmF0ZUtleVR5cGUsCi0gICAgQXN5bmNQcml2YXRlS2V5TWF4U2lnbmF0dXJlTGVuLAotICAgIEFzeW5jUHJpdmF0ZUtleVNpZ24sCi0gICAgQXN5bmNQcml2YXRlS2V5U2lnbkNvbXBsZXRlLAotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0cnVjdCBGcmVlIHsKLSAgdm9pZCBvcGVyYXRvcigpKFQgKmJ1ZikgewotICAgIGZyZWUoYnVmKTsKLSAgfQotfTsKLQogc3RhdGljIGJvb2wgSW5zdGFsbENlcnRpZmljYXRlKFNTTCAqc3NsKSB7CiAgIGNvbnN0IFRlc3RDb25maWcgKmNvbmZpZyA9IEdldENvbmZpZ1B0cihzc2wpOwotICBUZXN0U3RhdGUgKnRlc3Rfc3RhdGUgPSBHZXRUZXN0U3RhdGUoc3NsKTsKLQotICBpZiAoIWNvbmZpZy0+ZGlnZXN0X3ByZWZzLmVtcHR5KCkpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhciwgRnJlZTxjaGFyPj4gZGlnZXN0X3ByZWZzKAotICAgICAgICBzdHJkdXAoY29uZmlnLT5kaWdlc3RfcHJlZnMuY19zdHIoKSkpOwotICAgIHN0ZDo6dmVjdG9yPGludD4gZGlnZXN0X2xpc3Q7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICBjaGFyICp0b2tlbiA9Ci0gICAgICAgICAgc3RydG9rKGRpZ2VzdF9saXN0LmVtcHR5KCkgPyBkaWdlc3RfcHJlZnMuZ2V0KCkgOiBudWxscHRyLCAiLCIpOwotICAgICAgaWYgKHRva2VuID09IG51bGxwdHIpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGRpZ2VzdF9saXN0LnB1c2hfYmFjayhFVlBfTURfdHlwZShFVlBfZ2V0X2RpZ2VzdGJ5bmFtZSh0b2tlbikpKTsKLSAgICB9Ci0KLSAgICBpZiAoIVNTTF9zZXRfcHJpdmF0ZV9rZXlfZGlnZXN0X3ByZWZzKHNzbCwgZGlnZXN0X2xpc3QuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnZXN0X2xpc3Quc2l6ZSgpKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGlmICghY29uZmlnLT5rZXlfZmlsZS5lbXB0eSgpKSB7Ci0gICAgaWYgKGNvbmZpZy0+dXNlX2FzeW5jX3ByaXZhdGVfa2V5KSB7Ci0gICAgICB0ZXN0X3N0YXRlLT5wcml2YXRlX2tleSA9IExvYWRQcml2YXRlS2V5KGNvbmZpZy0+a2V5X2ZpbGUuY19zdHIoKSk7Ci0gICAgICBpZiAoIXRlc3Rfc3RhdGUtPnByaXZhdGVfa2V5KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIFNTTF9zZXRfcHJpdmF0ZV9rZXlfbWV0aG9kKHNzbCwgJmdfYXN5bmNfcHJpdmF0ZV9rZXlfbWV0aG9kKTsKLSAgICB9IGVsc2UgaWYgKCFTU0xfdXNlX1ByaXZhdGVLZXlfZmlsZShzc2wsIGNvbmZpZy0+a2V5X2ZpbGUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfRklMRVRZUEVfUEVNKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgaWYgKCFjb25maWctPmtleV9maWxlLmVtcHR5KCkgJiYKKyAgICAgICFTU0xfdXNlX1ByaXZhdGVLZXlfZmlsZShzc2wsIGNvbmZpZy0+a2V5X2ZpbGUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfRklMRVRZUEVfUEVNKSkgeworICAgIHJldHVybiBmYWxzZTsKICAgfQogICBpZiAoIWNvbmZpZy0+Y2VydF9maWxlLmVtcHR5KCkgJiYKICAgICAgICFTU0xfdXNlX2NlcnRpZmljYXRlX2ZpbGUoc3NsLCBjb25maWctPmNlcnRfZmlsZS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfRklMRVRZUEVfUEVNKSkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQotICBpZiAoIWNvbmZpZy0+b2NzcF9yZXNwb25zZS5lbXB0eSgpICYmCi0gICAgICAhU1NMX0NUWF9zZXRfb2NzcF9yZXNwb25zZShzc2wtPmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopY29uZmlnLT5vY3NwX3Jlc3BvbnNlLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+b2NzcF9yZXNwb25zZS5zaXplKCkpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9CiAgIHJldHVybiB0cnVlOwogfQogCkBAIC0zMjYsMjkgKzE5NiwxMCBAQAogICByZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBWZXJpZnlTdWNjZWVkKFg1MDlfU1RPUkVfQ1RYICpzdG9yZV9jdHgsIHZvaWQgKmFyZykgewotICBTU0wqIHNzbCA9IChTU0wqKVg1MDlfU1RPUkVfQ1RYX2dldF9leF9kYXRhKHN0b3JlX2N0eCwKLSAgICAgIFNTTF9nZXRfZXhfZGF0YV9YNTA5X1NUT1JFX0NUWF9pZHgoKSk7Ci0gIGNvbnN0IFRlc3RDb25maWcgKmNvbmZpZyA9IEdldENvbmZpZ1B0cihzc2wpOwotCi0gIGlmICghY29uZmlnLT5leHBlY3RlZF9vY3NwX3Jlc3BvbnNlLmVtcHR5KCkpIHsKLSAgICBjb25zdCB1aW50OF90ICpkYXRhOwotICAgIHNpemVfdCBsZW47Ci0gICAgU1NMX2dldDBfb2NzcF9yZXNwb25zZShzc2wsICZkYXRhLCAmbGVuKTsKLSAgICBpZiAobGVuID09IDApIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiT0NTUCByZXNwb25zZSBub3QgYXZhaWxhYmxlIGluIHZlcmlmeSBjYWxsYmFja1xuIik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLQorc3RhdGljIGludCBTa2lwVmVyaWZ5KGludCBwcmV2ZXJpZnlfb2ssIFg1MDlfU1RPUkVfQ1RYICpzdG9yZV9jdHgpIHsKICAgcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgVmVyaWZ5RmFpbChYNTA5X1NUT1JFX0NUWCAqc3RvcmVfY3R4LCB2b2lkICphcmcpIHsKLSAgc3RvcmVfY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfQVBQTElDQVRJT05fVkVSSUZJQ0FUSU9OOwotICByZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBOZXh0UHJvdG9zQWR2ZXJ0aXNlZENhbGxiYWNrKFNTTCAqc3NsLCBjb25zdCB1aW50OF90ICoqb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqb3V0X2xlbiwgdm9pZCAqYXJnKSB7CiAgIGNvbnN0IFRlc3RDb25maWcgKmNvbmZpZyA9IEdldENvbmZpZ1B0cihzc2wpOwpAQCAtNDkwLDk0ICszNDEsNiBAQAogICB9CiB9CiAKLXN0YXRpYyBpbnQgTmV3U2Vzc2lvbkNhbGxiYWNrKFNTTCAqc3NsLCBTU0xfU0VTU0lPTiAqc2Vzc2lvbikgewotICBHZXRUZXN0U3RhdGUoc3NsKS0+Z290X25ld19zZXNzaW9uID0gdHJ1ZTsKLSAgLy8gQm9yaW5nU1NMIHBhc3NlcyBhIHJlZmVyZW5jZSB0byB8c2Vzc2lvbnwuCi0gIFNTTF9TRVNTSU9OX2ZyZWUoc2Vzc2lvbik7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IFRpY2tldEtleUNhbGxiYWNrKFNTTCAqc3NsLCB1aW50OF90ICprZXlfbmFtZSwgdWludDhfdCAqaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9DSVBIRVJfQ1RYICpjdHgsIEhNQUNfQ1RYICpobWFjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuY3J5cHQpIHsKLSAgLy8gVGhpcyBpcyBqdXN0IHRlc3QgY29kZSwgc28gdXNlIHRoZSBhbGwtemVyb3Mga2V5LgotICBzdGF0aWMgY29uc3QgdWludDhfdCBrWmVyb3NbMTZdID0gezB9OwotCi0gIGlmIChlbmNyeXB0KSB7Ci0gICAgbWVtY3B5KGtleV9uYW1lLCBrWmVyb3MsIHNpemVvZihrWmVyb3MpKTsKLSAgICBSQU5EX2J5dGVzKGl2LCAxNik7Ci0gIH0gZWxzZSBpZiAobWVtY21wKGtleV9uYW1lLCBrWmVyb3MsIDE2KSAhPSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAoIUhNQUNfSW5pdF9leChobWFjX2N0eCwga1plcm9zLCBzaXplb2Yoa1plcm9zKSwgRVZQX3NoYTI1NigpLCBOVUxMKSB8fAotICAgICAgIUVWUF9DaXBoZXJJbml0X2V4KGN0eCwgRVZQX2Flc18xMjhfY2JjKCksIE5VTEwsIGtaZXJvcywgaXYsIGVuY3J5cHQpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgaWYgKCFlbmNyeXB0KSB7Ci0gICAgcmV0dXJuIEdldENvbmZpZ1B0cihzc2wpLT5yZW5ld190aWNrZXQgPyAyIDogMTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotLy8ga0N1c3RvbUV4dGVuc2lvblZhbHVlIGlzIHRoZSBleHRlbnNpb24gdmFsdWUgdGhhdCB0aGUgY3VzdG9tIGV4dGVuc2lvbgotLy8gY2FsbGJhY2tzIHdpbGwgYWRkLgotc3RhdGljIGNvbnN0IHVpbnQxNl90IGtDdXN0b21FeHRlbnNpb25WYWx1ZSA9IDEyMzQ7Ci1zdGF0aWMgdm9pZCAqY29uc3Qga0N1c3RvbUV4dGVuc2lvbkFkZEFyZyA9Ci0gICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KGtDdXN0b21FeHRlbnNpb25WYWx1ZSk7Ci1zdGF0aWMgdm9pZCAqY29uc3Qga0N1c3RvbUV4dGVuc2lvblBhcnNlQXJnID0KLSAgICByZWludGVycHJldF9jYXN0PHZvaWQgKj4oa0N1c3RvbUV4dGVuc2lvblZhbHVlICsgMSk7Ci1zdGF0aWMgY29uc3QgY2hhciBrQ3VzdG9tRXh0ZW5zaW9uQ29udGVudHNbXSA9ICJjdXN0b20gZXh0ZW5zaW9uIjsKLQotc3RhdGljIGludCBDdXN0b21FeHRlbnNpb25BZGRDYWxsYmFjayhTU0wgKnNzbCwgdW5zaWduZWQgZXh0ZW5zaW9uX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqb3V0LCBzaXplX3QgKm91dF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0X2FsZXJ0X3ZhbHVlLCB2b2lkICphZGRfYXJnKSB7Ci0gIGlmIChleHRlbnNpb25fdmFsdWUgIT0ga0N1c3RvbUV4dGVuc2lvblZhbHVlIHx8Ci0gICAgICBhZGRfYXJnICE9IGtDdXN0b21FeHRlbnNpb25BZGRBcmcpIHsKLSAgICBhYm9ydCgpOwotICB9Ci0KLSAgaWYgKEdldENvbmZpZ1B0cihzc2wpLT5jdXN0b21fZXh0ZW5zaW9uX3NraXApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoR2V0Q29uZmlnUHRyKHNzbCktPmN1c3RvbV9leHRlbnNpb25fZmFpbF9hZGQpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAqb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oa0N1c3RvbUV4dGVuc2lvbkNvbnRlbnRzKTsKLSAgKm91dF9sZW4gPSBzaXplb2Yoa0N1c3RvbUV4dGVuc2lvbkNvbnRlbnRzKSAtIDE7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIEN1c3RvbUV4dGVuc2lvbkZyZWVDYWxsYmFjayhTU0wgKnNzbCwgdW5zaWduZWQgZXh0ZW5zaW9uX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm91dCwgdm9pZCAqYWRkX2FyZykgewotICBpZiAoZXh0ZW5zaW9uX3ZhbHVlICE9IGtDdXN0b21FeHRlbnNpb25WYWx1ZSB8fAotICAgICAgYWRkX2FyZyAhPSBrQ3VzdG9tRXh0ZW5zaW9uQWRkQXJnIHx8Ci0gICAgICBvdXQgIT0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KGtDdXN0b21FeHRlbnNpb25Db250ZW50cykpIHsKLSAgICBhYm9ydCgpOwotICB9Ci19Ci0KLXN0YXRpYyBpbnQgQ3VzdG9tRXh0ZW5zaW9uUGFyc2VDYWxsYmFjayhTU0wgKnNzbCwgdW5zaWduZWQgZXh0ZW5zaW9uX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb250ZW50c19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpvdXRfYWxlcnRfdmFsdWUsIHZvaWQgKnBhcnNlX2FyZykgewotICBpZiAoZXh0ZW5zaW9uX3ZhbHVlICE9IGtDdXN0b21FeHRlbnNpb25WYWx1ZSB8fAotICAgICAgcGFyc2VfYXJnICE9IGtDdXN0b21FeHRlbnNpb25QYXJzZUFyZykgewotICAgIGFib3J0KCk7Ci0gIH0KLQotICBpZiAoY29udGVudHNfbGVuICE9IHNpemVvZihrQ3VzdG9tRXh0ZW5zaW9uQ29udGVudHMpIC0gMSB8fAotICAgICAgbWVtY21wKGNvbnRlbnRzLCBrQ3VzdG9tRXh0ZW5zaW9uQ29udGVudHMsIGNvbnRlbnRzX2xlbikgIT0gMCkgewotICAgICpvdXRfYWxlcnRfdmFsdWUgPSBTU0xfQURfREVDT0RFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KIC8vIENvbm5lY3QgcmV0dXJucyBhIG5ldyBzb2NrZXQgY29ubmVjdGVkIHRvIGxvY2FsaG9zdCBvbiB8cG9ydHwgb3IgLTEgb24KIC8vIGVycm9yLgogc3RhdGljIGludCBDb25uZWN0KHVpbnQxNl90IHBvcnQpIHsKQEAgLTY0MywyMyArNDA2LDcgQEAKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQogCi0gIHN0ZDo6c3RyaW5nIGNpcGhlcl9saXN0ID0gIkFMTCI7Ci0gIGlmICghY29uZmlnLT5jaXBoZXIuZW1wdHkoKSkgewotICAgIGNpcGhlcl9saXN0ID0gY29uZmlnLT5jaXBoZXI7Ci0gICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhzc2xfY3R4LmdldCgpLCBTU0xfT1BfQ0lQSEVSX1NFUlZFUl9QUkVGRVJFTkNFKTsKLSAgfQotICBpZiAoIVNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KHNzbF9jdHguZ2V0KCksIGNpcGhlcl9saXN0LmNfc3RyKCkpKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICBpZiAoIWNvbmZpZy0+Y2lwaGVyX3RsczEwLmVtcHR5KCkgJiYKLSAgICAgICFTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdF90bHMxMChzc2xfY3R4LmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2lwaGVyX3RsczEwLmNfc3RyKCkpKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgaWYgKCFjb25maWctPmNpcGhlcl90bHMxMS5lbXB0eSgpICYmCi0gICAgICAhU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3RfdGxzMTEoc3NsX2N0eC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmNpcGhlcl90bHMxMS5jX3N0cigpKSkgeworICBpZiAoIVNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KHNzbF9jdHguZ2V0KCksICJBTEwiKSkgewogICAgIHJldHVybiBudWxscHRyOwogICB9CiAKQEAgLTY5MSw0NiArNDM4LDEyIEBACiAgICAgU1NMX0NUWF9zZXRfYWxwbl9zZWxlY3RfY2Ioc3NsX2N0eC5nZXQoKSwgQWxwblNlbGVjdENhbGxiYWNrLCBOVUxMKTsKICAgfQogCi0gIFNTTF9DVFhfZW5hYmxlX3Rsc19jaGFubmVsX2lkKHNzbF9jdHguZ2V0KCkpOworICBzc2xfY3R4LT50bHNleHRfY2hhbm5lbF9pZF9lbmFibGVkX25ldyA9IDE7CiAgIFNTTF9DVFhfc2V0X2NoYW5uZWxfaWRfY2Ioc3NsX2N0eC5nZXQoKSwgQ2hhbm5lbElkQ2FsbGJhY2spOwogCiAgIHNzbF9jdHgtPmN1cnJlbnRfdGltZV9jYiA9IEN1cnJlbnRUaW1lQ2FsbGJhY2s7CiAKICAgU1NMX0NUWF9zZXRfaW5mb19jYWxsYmFjayhzc2xfY3R4LmdldCgpLCBJbmZvQ2FsbGJhY2spOwotICBTU0xfQ1RYX3Nlc3Nfc2V0X25ld19jYihzc2xfY3R4LmdldCgpLCBOZXdTZXNzaW9uQ2FsbGJhY2spOwotCi0gIGlmIChjb25maWctPnVzZV90aWNrZXRfY2FsbGJhY2spIHsKLSAgICBTU0xfQ1RYX3NldF90bHNleHRfdGlja2V0X2tleV9jYihzc2xfY3R4LmdldCgpLCBUaWNrZXRLZXlDYWxsYmFjayk7Ci0gIH0KLQotICBpZiAoY29uZmlnLT5lbmFibGVfY2xpZW50X2N1c3RvbV9leHRlbnNpb24gJiYKLSAgICAgICFTU0xfQ1RYX2FkZF9jbGllbnRfY3VzdG9tX2V4dCgKLSAgICAgICAgICBzc2xfY3R4LmdldCgpLCBrQ3VzdG9tRXh0ZW5zaW9uVmFsdWUsIEN1c3RvbUV4dGVuc2lvbkFkZENhbGxiYWNrLAotICAgICAgICAgIEN1c3RvbUV4dGVuc2lvbkZyZWVDYWxsYmFjaywga0N1c3RvbUV4dGVuc2lvbkFkZEFyZywKLSAgICAgICAgICBDdXN0b21FeHRlbnNpb25QYXJzZUNhbGxiYWNrLCBrQ3VzdG9tRXh0ZW5zaW9uUGFyc2VBcmcpKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICBpZiAoY29uZmlnLT5lbmFibGVfc2VydmVyX2N1c3RvbV9leHRlbnNpb24gJiYKLSAgICAgICFTU0xfQ1RYX2FkZF9zZXJ2ZXJfY3VzdG9tX2V4dCgKLSAgICAgICAgICBzc2xfY3R4LmdldCgpLCBrQ3VzdG9tRXh0ZW5zaW9uVmFsdWUsIEN1c3RvbUV4dGVuc2lvbkFkZENhbGxiYWNrLAotICAgICAgICAgIEN1c3RvbUV4dGVuc2lvbkZyZWVDYWxsYmFjaywga0N1c3RvbUV4dGVuc2lvbkFkZEFyZywKLSAgICAgICAgICBDdXN0b21FeHRlbnNpb25QYXJzZUNhbGxiYWNrLCBrQ3VzdG9tRXh0ZW5zaW9uUGFyc2VBcmcpKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICBpZiAoY29uZmlnLT52ZXJpZnlfZmFpbCkgewotICAgIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrKHNzbF9jdHguZ2V0KCksIFZlcmlmeUZhaWwsIE5VTEwpOwotICB9IGVsc2UgewotICAgIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrKHNzbF9jdHguZ2V0KCksIFZlcmlmeVN1Y2NlZWQsIE5VTEwpOwotICB9Ci0KLSAgaWYgKCFjb25maWctPnNpZ25lZF9jZXJ0X3RpbWVzdGFtcHMuZW1wdHkoKSAmJgotICAgICAgIVNTTF9DVFhfc2V0X3NpZ25lZF9jZXJ0X3RpbWVzdGFtcF9saXN0KAotICAgICAgICAgIHNzbF9jdHguZ2V0KCksIChjb25zdCB1aW50OF90ICopY29uZmlnLT5zaWduZWRfY2VydF90aW1lc3RhbXBzLmRhdGEoKSwKLSAgICAgICAgICBjb25maWctPnNpZ25lZF9jZXJ0X3RpbWVzdGFtcHMuc2l6ZSgpKSkgewotICAgIHJldHVybiBudWxscHRyOwotICB9CiAKICAgcmV0dXJuIHNzbF9jdHg7CiB9CkBAIC03ODcsOSArNTAwLDYgQEAKICAgICBjYXNlIFNTTF9FUlJPUl9QRU5ESU5HX0NFUlRJRklDQVRFOgogICAgICAgLy8gVGhlIGhhbmRzaGFrZSB3aWxsIHJlc3VtZSB3aXRob3V0IGEgc2Vjb25kIGNhbGwgdG8gdGhlIGVhcmx5IGNhbGxiYWNrLgogICAgICAgcmV0dXJuIEluc3RhbGxDZXJ0aWZpY2F0ZShzc2wpOwotICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUFJJVkFURV9LRVlfT1BFUkFUSU9OOgotICAgICAgdGVzdF9zdGF0ZS0+c2lnbmF0dXJlX3JldHJpZXMrKzsKLSAgICAgIHJldHVybiB0cnVlOwogICAgIGRlZmF1bHQ6CiAgICAgICByZXR1cm4gZmFsc2U7CiAgIH0KQEAgLTgyMSwxNzcgKzUzMSw2IEBACiAgIHJldHVybiByZXQ7CiB9CiAKLS8vIERvU2h1dGRvd24gY2FsbHMgfFNTTF9zaHV0ZG93bnwsIHJlc29sdmluZyBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMuIEl0Ci0vLyByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGZpbmFsIHxTU0xfc2h1dGRvd258IGNhbGwuCi1zdGF0aWMgaW50IERvU2h1dGRvd24oU1NMICpzc2wpIHsKLSAgY29uc3QgVGVzdENvbmZpZyAqY29uZmlnID0gR2V0Q29uZmlnUHRyKHNzbCk7Ci0gIGludCByZXQ7Ci0gIGRvIHsKLSAgICByZXQgPSBTU0xfc2h1dGRvd24oc3NsKTsKLSAgfSB3aGlsZSAoY29uZmlnLT5hc3luYyAmJiBSZXRyeUFzeW5jKHNzbCwgcmV0KSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8vIENoZWNrSGFuZHNoYWtlUHJvcGVydGllcyBjaGVja3MsIGltbWVkaWF0ZWx5IGFmdGVyIHxzc2x8IGNvbXBsZXRlcyBpdHMKLS8vIGluaXRpYWwgaGFuZHNoYWtlIChvciBGYWxzZSBTdGFydHMpLCB3aGV0aGVyIGFsbCB0aGUgcHJvcGVydGllcyBhcmUKLS8vIGNvbnNpc3RlbnQgd2l0aCB0aGUgdGVzdCBjb25maWd1cmF0aW9uIGFuZCBpbnZhcmlhbnRzLgotc3RhdGljIGJvb2wgQ2hlY2tIYW5kc2hha2VQcm9wZXJ0aWVzKFNTTCAqc3NsLCBib29sIGlzX3Jlc3VtZSkgewotICBjb25zdCBUZXN0Q29uZmlnICpjb25maWcgPSBHZXRDb25maWdQdHIoc3NsKTsKLQotICBpZiAoU1NMX2dldF9jdXJyZW50X2NpcGhlcihzc2wpID09IG51bGxwdHIpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIm51bGwgY2lwaGVyIGFmdGVyIGhhbmRzaGFrZVxuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGlzX3Jlc3VtZSAmJgotICAgICAgKCEhU1NMX3Nlc3Npb25fcmV1c2VkKHNzbCkgPT0gY29uZmlnLT5leHBlY3Rfc2Vzc2lvbl9taXNzKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAic2Vzc2lvbiB3YXMlcyByZXVzZWRcbiIsCi0gICAgICAgICAgICBTU0xfc2Vzc2lvbl9yZXVzZWQoc3NsKSA/ICIiIDogIiBub3QiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBib29sIGV4cGVjdF9oYW5kc2hha2VfZG9uZSA9IGlzX3Jlc3VtZSB8fCAhY29uZmlnLT5mYWxzZV9zdGFydDsKLSAgaWYgKGV4cGVjdF9oYW5kc2hha2VfZG9uZSAhPSBHZXRUZXN0U3RhdGUoc3NsKS0+aGFuZHNoYWtlX2RvbmUpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImhhbmRzaGFrZSB3YXMlcyBjb21wbGV0ZWRcbiIsCi0gICAgICAgICAgICBHZXRUZXN0U3RhdGUoc3NsKS0+aGFuZHNoYWtlX2RvbmUgPyAiIiA6ICIgbm90Iik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGV4cGVjdF9oYW5kc2hha2VfZG9uZSAmJiAhY29uZmlnLT5pc19zZXJ2ZXIpIHsKLSAgICBib29sIGV4cGVjdF9uZXdfc2Vzc2lvbiA9Ci0gICAgICAgICFjb25maWctPmV4cGVjdF9ub19zZXNzaW9uICYmCi0gICAgICAgICghU1NMX3Nlc3Npb25fcmV1c2VkKHNzbCkgfHwgY29uZmlnLT5leHBlY3RfdGlja2V0X3JlbmV3YWwpOwotICAgIGlmIChleHBlY3RfbmV3X3Nlc3Npb24gIT0gR2V0VGVzdFN0YXRlKHNzbCktPmdvdF9uZXdfc2Vzc2lvbikgewotICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICJuZXcgc2Vzc2lvbiB3YXMlcyBlc3RhYmxpc2hlZCwgYnV0IHdlIGV4cGVjdGVkIHRoZSBvcHBvc2l0ZVxuIiwKLSAgICAgICAgICAgICAgR2V0VGVzdFN0YXRlKHNzbCktPmdvdF9uZXdfc2Vzc2lvbiA/ICIiIDogIiBub3QiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBpZiAoY29uZmlnLT5pc19zZXJ2ZXIgJiYgIUdldFRlc3RTdGF0ZShzc2wpLT5lYXJseV9jYWxsYmFja19jYWxsZWQpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImVhcmx5IGNhbGxiYWNrIG5vdCBjYWxsZWRcbiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghY29uZmlnLT5leHBlY3RlZF9zZXJ2ZXJfbmFtZS5lbXB0eSgpKSB7Ci0gICAgY29uc3QgY2hhciAqc2VydmVyX25hbWUgPQotICAgICAgICBTU0xfZ2V0X3NlcnZlcm5hbWUoc3NsLCBUTFNFWFRfTkFNRVRZUEVfaG9zdF9uYW1lKTsKLSAgICBpZiAoc2VydmVyX25hbWUgIT0gY29uZmlnLT5leHBlY3RlZF9zZXJ2ZXJfbmFtZSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJzZXJ2ZXJuYW1lIG1pc21hdGNoIChnb3QgJXM7IHdhbnQgJXMpXG4iLAotICAgICAgICAgICAgICBzZXJ2ZXJfbmFtZSwgY29uZmlnLT5leHBlY3RlZF9zZXJ2ZXJfbmFtZS5jX3N0cigpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWNvbmZpZy0+ZXhwZWN0ZWRfY2VydGlmaWNhdGVfdHlwZXMuZW1wdHkoKSkgewotICAgIGNvbnN0IHVpbnQ4X3QgKmNlcnRpZmljYXRlX3R5cGVzOwotICAgIHNpemVfdCBjZXJ0aWZpY2F0ZV90eXBlc19sZW4gPQotICAgICAgICBTU0xfZ2V0MF9jZXJ0aWZpY2F0ZV90eXBlcyhzc2wsICZjZXJ0aWZpY2F0ZV90eXBlcyk7Ci0gICAgaWYgKGNlcnRpZmljYXRlX3R5cGVzX2xlbiAhPSBjb25maWctPmV4cGVjdGVkX2NlcnRpZmljYXRlX3R5cGVzLnNpemUoKSB8fAotICAgICAgICBtZW1jbXAoY2VydGlmaWNhdGVfdHlwZXMsCi0gICAgICAgICAgICAgICBjb25maWctPmV4cGVjdGVkX2NlcnRpZmljYXRlX3R5cGVzLmRhdGEoKSwKLSAgICAgICAgICAgICAgIGNlcnRpZmljYXRlX3R5cGVzX2xlbikgIT0gMCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJjZXJ0aWZpY2F0ZSB0eXBlcyBtaXNtYXRjaFxuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFjb25maWctPmV4cGVjdGVkX25leHRfcHJvdG8uZW1wdHkoKSkgewotICAgIGNvbnN0IHVpbnQ4X3QgKm5leHRfcHJvdG87Ci0gICAgdW5zaWduZWQgbmV4dF9wcm90b19sZW47Ci0gICAgU1NMX2dldDBfbmV4dF9wcm90b19uZWdvdGlhdGVkKHNzbCwgJm5leHRfcHJvdG8sICZuZXh0X3Byb3RvX2xlbik7Ci0gICAgaWYgKG5leHRfcHJvdG9fbGVuICE9IGNvbmZpZy0+ZXhwZWN0ZWRfbmV4dF9wcm90by5zaXplKCkgfHwKLSAgICAgICAgbWVtY21wKG5leHRfcHJvdG8sIGNvbmZpZy0+ZXhwZWN0ZWRfbmV4dF9wcm90by5kYXRhKCksCi0gICAgICAgICAgICAgICBuZXh0X3Byb3RvX2xlbikgIT0gMCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJuZWdvdGlhdGVkIG5leHQgcHJvdG8gbWlzbWF0Y2hcbiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGlmICghY29uZmlnLT5leHBlY3RlZF9hbHBuLmVtcHR5KCkpIHsKLSAgICBjb25zdCB1aW50OF90ICphbHBuX3Byb3RvOwotICAgIHVuc2lnbmVkIGFscG5fcHJvdG9fbGVuOwotICAgIFNTTF9nZXQwX2FscG5fc2VsZWN0ZWQoc3NsLCAmYWxwbl9wcm90bywgJmFscG5fcHJvdG9fbGVuKTsKLSAgICBpZiAoYWxwbl9wcm90b19sZW4gIT0gY29uZmlnLT5leHBlY3RlZF9hbHBuLnNpemUoKSB8fAotICAgICAgICBtZW1jbXAoYWxwbl9wcm90bywgY29uZmlnLT5leHBlY3RlZF9hbHBuLmRhdGEoKSwKLSAgICAgICAgICAgICAgIGFscG5fcHJvdG9fbGVuKSAhPSAwKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIm5lZ290aWF0ZWQgYWxwbiBwcm90byBtaXNtYXRjaFxuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFjb25maWctPmV4cGVjdGVkX2NoYW5uZWxfaWQuZW1wdHkoKSkgewotICAgIHVpbnQ4X3QgY2hhbm5lbF9pZFs2NF07Ci0gICAgaWYgKCFTU0xfZ2V0X3Rsc19jaGFubmVsX2lkKHNzbCwgY2hhbm5lbF9pZCwgc2l6ZW9mKGNoYW5uZWxfaWQpKSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJubyBjaGFubmVsIGlkIG5lZ290aWF0ZWRcbiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoY29uZmlnLT5leHBlY3RlZF9jaGFubmVsX2lkLnNpemUoKSAhPSA2NCB8fAotICAgICAgICBtZW1jbXAoY29uZmlnLT5leHBlY3RlZF9jaGFubmVsX2lkLmRhdGEoKSwKLSAgICAgICAgICAgICAgIGNoYW5uZWxfaWQsIDY0KSAhPSAwKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgImNoYW5uZWwgaWQgbWlzbWF0Y2hcbiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGlmIChjb25maWctPmV4cGVjdF9leHRlbmRlZF9tYXN0ZXJfc2VjcmV0KSB7Ci0gICAgaWYgKCFzc2wtPnNlc3Npb24tPmV4dGVuZGVkX21hc3Rlcl9zZWNyZXQpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiTm8gRU1TIGZvciBzZXNzaW9uIHdoZW4gZXhwZWN0ZWQiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWNvbmZpZy0+ZXhwZWN0ZWRfb2NzcF9yZXNwb25zZS5lbXB0eSgpKSB7Ci0gICAgY29uc3QgdWludDhfdCAqZGF0YTsKLSAgICBzaXplX3QgbGVuOwotICAgIFNTTF9nZXQwX29jc3BfcmVzcG9uc2Uoc3NsLCAmZGF0YSwgJmxlbik7Ci0gICAgaWYgKGNvbmZpZy0+ZXhwZWN0ZWRfb2NzcF9yZXNwb25zZS5zaXplKCkgIT0gbGVuIHx8Ci0gICAgICAgIG1lbWNtcChjb25maWctPmV4cGVjdGVkX29jc3BfcmVzcG9uc2UuZGF0YSgpLCBkYXRhLCBsZW4pICE9IDApIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiT0NTUCByZXNwb25zZSBtaXNtYXRjaFxuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFjb25maWctPmV4cGVjdGVkX3NpZ25lZF9jZXJ0X3RpbWVzdGFtcHMuZW1wdHkoKSkgewotICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGE7Ci0gICAgc2l6ZV90IGxlbjsKLSAgICBTU0xfZ2V0MF9zaWduZWRfY2VydF90aW1lc3RhbXBfbGlzdChzc2wsICZkYXRhLCAmbGVuKTsKLSAgICBpZiAoY29uZmlnLT5leHBlY3RlZF9zaWduZWRfY2VydF90aW1lc3RhbXBzLnNpemUoKSAhPSBsZW4gfHwKLSAgICAgICAgbWVtY21wKGNvbmZpZy0+ZXhwZWN0ZWRfc2lnbmVkX2NlcnRfdGltZXN0YW1wcy5kYXRhKCksCi0gICAgICAgICAgICAgICBkYXRhLCBsZW4pICE9IDApIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiU0NUIGxpc3QgbWlzbWF0Y2hcbiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGlmIChjb25maWctPmV4cGVjdF92ZXJpZnlfcmVzdWx0KSB7Ci0gICAgaW50IGV4cGVjdGVkX3ZlcmlmeV9yZXN1bHQgPSBjb25maWctPnZlcmlmeV9mYWlsID8KLSAgICAgIFg1MDlfVl9FUlJfQVBQTElDQVRJT05fVkVSSUZJQ0FUSU9OIDoKLSAgICAgIFg1MDlfVl9PSzsKLQotICAgIGlmIChTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoc3NsKSAhPSBleHBlY3RlZF92ZXJpZnlfcmVzdWx0KSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIldyb25nIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiByZXN1bHRcbiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGlmICghY29uZmlnLT5pc19zZXJ2ZXIpIHsKLSAgICAvKiBDbGllbnRzIHNob3VsZCBleHBlY3QgYSBwZWVyIGNlcnRpZmljYXRlIGNoYWluIGlmZiB0aGlzIHdhcyBub3QgYSBQU0sKLSAgICAgKiBjaXBoZXIgc3VpdGUuICovCi0gICAgaWYgKGNvbmZpZy0+cHNrLmVtcHR5KCkpIHsKLSAgICAgIGlmIChTU0xfZ2V0X3BlZXJfY2VydF9jaGFpbihzc2wpID09IG51bGxwdHIpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIHBlZXIgY2VydGlmaWNhdGUgY2hhaW4hXG4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoU1NMX2dldF9wZWVyX2NlcnRfY2hhaW4oc3NsKSAhPSBudWxscHRyKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuZXhwZWN0ZWQgcGVlciBjZXJ0aWZpY2F0ZSBjaGFpbiFcbiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQogLy8gRG9FeGNoYW5nZSBydW5zIGEgdGVzdCBTU0wgZXhjaGFuZ2UgYWdhaW5zdCB0aGUgcGVlci4gT24gc3VjY2VzcywgaXQgcmV0dXJucwogLy8gdHJ1ZSBhbmQgc2V0cyB8Km91dF9zZXNzaW9ufCB0byB0aGUgbmVnb3RpYXRlZCBTU0wgc2Vzc2lvbi4gSWYgdGhlIHRlc3QgaXMgYQogLy8gcmVzdW1wdGlvbiBhdHRlbXB0LCB8aXNfcmVzdW1lfCBpcyB0cnVlIGFuZCB8c2Vzc2lvbnwgaXMgdGhlIHNlc3Npb24gZnJvbSB0aGUKQEAgLTEwMjMsMTAgKzU2Miw3IEBACiAgIH0KICAgaWYgKGNvbmZpZy0+cmVxdWlyZV9hbnlfY2xpZW50X2NlcnRpZmljYXRlKSB7CiAgICAgU1NMX3NldF92ZXJpZnkoc3NsLmdldCgpLCBTU0xfVkVSSUZZX1BFRVJ8U1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCwKLSAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgfQotICBpZiAoY29uZmlnLT52ZXJpZnlfcGVlcikgewotICAgIFNTTF9zZXRfdmVyaWZ5KHNzbC5nZXQoKSwgU1NMX1ZFUklGWV9QRUVSLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICBTa2lwVmVyaWZ5KTsKICAgfQogICBpZiAoY29uZmlnLT5mYWxzZV9zdGFydCkgewogICAgIFNTTF9zZXRfbW9kZShzc2wuZ2V0KCksIFNTTF9NT0RFX0VOQUJMRV9GQUxTRV9TVEFSVCk7CkBAIC0xMDUyLDggKzU4OCw4IEBACiAgIGlmIChjb25maWctPnRsc19kNV9idWcpIHsKICAgICBTU0xfc2V0X29wdGlvbnMoc3NsLmdldCgpLCBTU0xfT1BfVExTX0Q1X0JVRyk7CiAgIH0KLSAgaWYgKGNvbmZpZy0+bWljcm9zb2Z0X2JpZ19zc2x2M19idWZmZXIpIHsKLSAgICBTU0xfc2V0X29wdGlvbnMoc3NsLmdldCgpLCBTU0xfT1BfTUlDUk9TT0ZUX0JJR19TU0xWM19CVUZGRVIpOworICBpZiAoY29uZmlnLT5hbGxvd191bnNhZmVfbGVnYWN5X3JlbmVnb3RpYXRpb24pIHsKKyAgICBTU0xfc2V0X29wdGlvbnMoc3NsLmdldCgpLCBTU0xfT1BfQUxMT1dfVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OKTsKICAgfQogICBpZiAoY29uZmlnLT5ub19sZWdhY3lfc2VydmVyX2Nvbm5lY3QpIHsKICAgICBTU0xfY2xlYXJfb3B0aW9ucyhzc2wuZ2V0KCksIFNTTF9PUF9MRUdBQ1lfU0VSVkVSX0NPTk5FQ1QpOwpAQCAtMTEwMSw2ICs2MzcsNyBAQAogICAgICAgIVNTTF9lbmFibGVfc2lnbmVkX2NlcnRfdGltZXN0YW1wcyhzc2wuZ2V0KCkpKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CisgIFNTTF9lbmFibGVfZmFzdHJhZGlvX3BhZGRpbmcoc3NsLmdldCgpLCBjb25maWctPmZhc3RyYWRpb19wYWRkaW5nKTsKICAgaWYgKGNvbmZpZy0+bWluX3ZlcnNpb24gIT0gMCkgewogICAgIFNTTF9zZXRfbWluX3ZlcnNpb24oc3NsLmdldCgpLCAodWludDE2X3QpY29uZmlnLT5taW5fdmVyc2lvbik7CiAgIH0KQEAgLTExMTQsMTMgKzY1MSwxNCBAQAogICBpZiAoY29uZmlnLT5pbnN0YWxsX2Rkb3NfY2FsbGJhY2spIHsKICAgICBTU0xfQ1RYX3NldF9kb3NfcHJvdGVjdGlvbl9jYihzc2xfY3R4LCBERG9TQ2FsbGJhY2spOwogICB9CisgIGlmICghY29uZmlnLT5jaXBoZXIuZW1wdHkoKSAmJgorICAgICAgIVNTTF9zZXRfY2lwaGVyX2xpc3Qoc3NsLmdldCgpLCBjb25maWctPmNpcGhlci5jX3N0cigpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQogICBpZiAoIWNvbmZpZy0+cmVqZWN0X3BlZXJfcmVuZWdvdGlhdGlvbnMpIHsKICAgICAvKiBSZW5lZ290aWF0aW9ucyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdC4gKi8KICAgICBTU0xfc2V0X3JlamVjdF9wZWVyX3JlbmVnb3RpYXRpb25zKHNzbC5nZXQoKSwgMCk7CiAgIH0KLSAgaWYgKCFjb25maWctPmNoZWNrX2Nsb3NlX25vdGlmeSkgewotICAgIFNTTF9zZXRfcXVpZXRfc2h1dGRvd24oc3NsLmdldCgpLCAxKTsKLSAgfQogCiAgIGludCBzb2NrID0gQ29ubmVjdChjb25maWctPnBvcnQpOwogICBpZiAoc29jayA9PSAtMSkgewpAQCAtMTE4MSwxNCArNzE5LDEyNSBAQAogICAgICAgICByZXQgPSBTU0xfY29ubmVjdChzc2wuZ2V0KCkpOwogICAgICAgfQogICAgIH0gd2hpbGUgKGNvbmZpZy0+YXN5bmMgJiYgUmV0cnlBc3luYyhzc2wuZ2V0KCksIHJldCkpOwotICAgIGlmIChyZXQgIT0gMSB8fAotICAgICAgICAhQ2hlY2tIYW5kc2hha2VQcm9wZXJ0aWVzKHNzbC5nZXQoKSwgaXNfcmVzdW1lKSkgeworICAgIGlmIChyZXQgIT0gMSkgewogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8vIFJlc2V0IHRoZSBzdGF0ZSB0byBhc3NlcnQgbGF0ZXIgdGhhdCB0aGUgY2FsbGJhY2sgaXNuJ3QgY2FsbGVkIGluCi0gICAgLy8gcmVuZWdvdGF0aW9ucy4KLSAgICBHZXRUZXN0U3RhdGUoc3NsLmdldCgpKS0+Z290X25ld19zZXNzaW9uID0gZmFsc2U7CisgICAgaWYgKFNTTF9nZXRfY3VycmVudF9jaXBoZXIoc3NsLmdldCgpKSA9PSBudWxscHRyKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIm51bGwgY2lwaGVyIGFmdGVyIGhhbmRzaGFrZVxuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGlzX3Jlc3VtZSAmJgorICAgICAgICAoISFTU0xfc2Vzc2lvbl9yZXVzZWQoc3NsLmdldCgpKSA9PSBjb25maWctPmV4cGVjdF9zZXNzaW9uX21pc3MpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgInNlc3Npb24gd2FzJXMgcmV1c2VkXG4iLAorICAgICAgICAgICAgICBTU0xfc2Vzc2lvbl9yZXVzZWQoc3NsLmdldCgpKSA/ICIiIDogIiBub3QiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGV4cGVjdF9oYW5kc2hha2VfZG9uZSA9IGlzX3Jlc3VtZSB8fCAhY29uZmlnLT5mYWxzZV9zdGFydDsKKyAgICBpZiAoZXhwZWN0X2hhbmRzaGFrZV9kb25lICE9IEdldFRlc3RTdGF0ZShzc2wuZ2V0KCkpLT5oYW5kc2hha2VfZG9uZSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJoYW5kc2hha2Ugd2FzJXMgY29tcGxldGVkXG4iLAorICAgICAgICAgICAgICBHZXRUZXN0U3RhdGUoc3NsLmdldCgpKS0+aGFuZHNoYWtlX2RvbmUgPyAiIiA6ICIgbm90Iik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGNvbmZpZy0+aXNfc2VydmVyICYmICFHZXRUZXN0U3RhdGUoc3NsLmdldCgpKS0+ZWFybHlfY2FsbGJhY2tfY2FsbGVkKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgImVhcmx5IGNhbGxiYWNrIG5vdCBjYWxsZWRcbiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghY29uZmlnLT5leHBlY3RlZF9zZXJ2ZXJfbmFtZS5lbXB0eSgpKSB7CisgICAgICBjb25zdCBjaGFyICpzZXJ2ZXJfbmFtZSA9CisgICAgICAgIFNTTF9nZXRfc2VydmVybmFtZShzc2wuZ2V0KCksIFRMU0VYVF9OQU1FVFlQRV9ob3N0X25hbWUpOworICAgICAgaWYgKHNlcnZlcl9uYW1lICE9IGNvbmZpZy0+ZXhwZWN0ZWRfc2VydmVyX25hbWUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJzZXJ2ZXJuYW1lIG1pc21hdGNoIChnb3QgJXM7IHdhbnQgJXMpXG4iLAorICAgICAgICAgICAgICAgIHNlcnZlcl9uYW1lLCBjb25maWctPmV4cGVjdGVkX3NlcnZlcl9uYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjb25maWctPmV4cGVjdGVkX2NlcnRpZmljYXRlX3R5cGVzLmVtcHR5KCkpIHsKKyAgICAgIHVpbnQ4X3QgKmNlcnRpZmljYXRlX3R5cGVzOworICAgICAgaW50IG51bV9jZXJ0aWZpY2F0ZV90eXBlcyA9CisgICAgICAgIFNTTF9nZXQwX2NlcnRpZmljYXRlX3R5cGVzKHNzbC5nZXQoKSwgJmNlcnRpZmljYXRlX3R5cGVzKTsKKyAgICAgIGlmIChudW1fY2VydGlmaWNhdGVfdHlwZXMgIT0KKyAgICAgICAgICAoaW50KWNvbmZpZy0+ZXhwZWN0ZWRfY2VydGlmaWNhdGVfdHlwZXMuc2l6ZSgpIHx8CisgICAgICAgICAgbWVtY21wKGNlcnRpZmljYXRlX3R5cGVzLAorICAgICAgICAgICAgICAgICBjb25maWctPmV4cGVjdGVkX2NlcnRpZmljYXRlX3R5cGVzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgbnVtX2NlcnRpZmljYXRlX3R5cGVzKSAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY2VydGlmaWNhdGUgdHlwZXMgbWlzbWF0Y2hcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjb25maWctPmV4cGVjdGVkX25leHRfcHJvdG8uZW1wdHkoKSkgeworICAgICAgY29uc3QgdWludDhfdCAqbmV4dF9wcm90bzsKKyAgICAgIHVuc2lnbmVkIG5leHRfcHJvdG9fbGVuOworICAgICAgU1NMX2dldDBfbmV4dF9wcm90b19uZWdvdGlhdGVkKHNzbC5nZXQoKSwgJm5leHRfcHJvdG8sICZuZXh0X3Byb3RvX2xlbik7CisgICAgICBpZiAobmV4dF9wcm90b19sZW4gIT0gY29uZmlnLT5leHBlY3RlZF9uZXh0X3Byb3RvLnNpemUoKSB8fAorICAgICAgICAgIG1lbWNtcChuZXh0X3Byb3RvLCBjb25maWctPmV4cGVjdGVkX25leHRfcHJvdG8uZGF0YSgpLAorICAgICAgICAgICAgICAgICBuZXh0X3Byb3RvX2xlbikgIT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5lZ290aWF0ZWQgbmV4dCBwcm90byBtaXNtYXRjaFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWNvbmZpZy0+ZXhwZWN0ZWRfYWxwbi5lbXB0eSgpKSB7CisgICAgICBjb25zdCB1aW50OF90ICphbHBuX3Byb3RvOworICAgICAgdW5zaWduZWQgYWxwbl9wcm90b19sZW47CisgICAgICBTU0xfZ2V0MF9hbHBuX3NlbGVjdGVkKHNzbC5nZXQoKSwgJmFscG5fcHJvdG8sICZhbHBuX3Byb3RvX2xlbik7CisgICAgICBpZiAoYWxwbl9wcm90b19sZW4gIT0gY29uZmlnLT5leHBlY3RlZF9hbHBuLnNpemUoKSB8fAorICAgICAgICAgIG1lbWNtcChhbHBuX3Byb3RvLCBjb25maWctPmV4cGVjdGVkX2FscG4uZGF0YSgpLAorICAgICAgICAgICAgICAgICBhbHBuX3Byb3RvX2xlbikgIT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5lZ290aWF0ZWQgYWxwbiBwcm90byBtaXNtYXRjaFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWNvbmZpZy0+ZXhwZWN0ZWRfY2hhbm5lbF9pZC5lbXB0eSgpKSB7CisgICAgICB1aW50OF90IGNoYW5uZWxfaWRbNjRdOworICAgICAgaWYgKCFTU0xfZ2V0X3Rsc19jaGFubmVsX2lkKHNzbC5nZXQoKSwgY2hhbm5lbF9pZCwgc2l6ZW9mKGNoYW5uZWxfaWQpKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5vIGNoYW5uZWwgaWQgbmVnb3RpYXRlZFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmIChjb25maWctPmV4cGVjdGVkX2NoYW5uZWxfaWQuc2l6ZSgpICE9IDY0IHx8CisgICAgICAgICAgbWVtY21wKGNvbmZpZy0+ZXhwZWN0ZWRfY2hhbm5lbF9pZC5kYXRhKCksCisgICAgICAgICAgICAgICAgIGNoYW5uZWxfaWQsIDY0KSAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY2hhbm5lbCBpZCBtaXNtYXRjaFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29uZmlnLT5leHBlY3RfZXh0ZW5kZWRfbWFzdGVyX3NlY3JldCkgeworICAgICAgaWYgKCFzc2wtPnNlc3Npb24tPmV4dGVuZGVkX21hc3Rlcl9zZWNyZXQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJObyBFTVMgZm9yIHNlc3Npb24gd2hlbiBleHBlY3RlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjb25maWctPmV4cGVjdGVkX29jc3BfcmVzcG9uc2UuZW1wdHkoKSkgeworICAgICAgY29uc3QgdWludDhfdCAqZGF0YTsKKyAgICAgIHNpemVfdCBsZW47CisgICAgICBTU0xfZ2V0MF9vY3NwX3Jlc3BvbnNlKHNzbC5nZXQoKSwgJmRhdGEsICZsZW4pOworICAgICAgaWYgKGNvbmZpZy0+ZXhwZWN0ZWRfb2NzcF9yZXNwb25zZS5zaXplKCkgIT0gbGVuIHx8CisgICAgICAgICAgbWVtY21wKGNvbmZpZy0+ZXhwZWN0ZWRfb2NzcF9yZXNwb25zZS5kYXRhKCksIGRhdGEsIGxlbikgIT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk9DU1AgcmVzcG9uc2UgbWlzbWF0Y2hcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjb25maWctPmV4cGVjdGVkX3NpZ25lZF9jZXJ0X3RpbWVzdGFtcHMuZW1wdHkoKSkgeworICAgICAgY29uc3QgdWludDhfdCAqZGF0YTsKKyAgICAgIHNpemVfdCBsZW47CisgICAgICBTU0xfZ2V0MF9zaWduZWRfY2VydF90aW1lc3RhbXBfbGlzdChzc2wuZ2V0KCksICZkYXRhLCAmbGVuKTsKKyAgICAgIGlmIChjb25maWctPmV4cGVjdGVkX3NpZ25lZF9jZXJ0X3RpbWVzdGFtcHMuc2l6ZSgpICE9IGxlbiB8fAorICAgICAgICAgIG1lbWNtcChjb25maWctPmV4cGVjdGVkX3NpZ25lZF9jZXJ0X3RpbWVzdGFtcHMuZGF0YSgpLAorICAgICAgICAgICAgICAgICBkYXRhLCBsZW4pICE9IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJTQ1QgbGlzdCBtaXNtYXRjaFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CiAgIH0KIAogICBpZiAoY29uZmlnLT5leHBvcnRfa2V5aW5nX21hdGVyaWFsID4gMCkgewpAQCAtMTIzNCwxOSArODgzLDE4IEBACiAgICAgfQogICAgIC8vIFRoaXMgbW9kZSB3cml0ZXMgYSBudW1iZXIgb2YgZGlmZmVyZW50IHJlY29yZCBzaXplcyBpbiBhbiBhdHRlbXB0IHRvCiAgICAgLy8gdHJpcCB1cCB0aGUgQ0JDIHJlY29yZCBzcGxpdHRpbmcgY29kZS4KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtCdWZMZW4gPSAzMjc2OTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBidWYobmV3IHVpbnQ4X3Rba0J1Zkxlbl0pOwotICAgIG1lbXNldChidWYuZ2V0KCksIDB4NDIsIGtCdWZMZW4pOworICAgIHVpbnQ4X3QgYnVmWzMyNzY5XTsKKyAgICBtZW1zZXQoYnVmLCAweDQyLCBzaXplb2YoYnVmKSk7CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUmVjb3JkU2l6ZXNbXSA9IHsKICAgICAgICAgMCwgMSwgMjU1LCAyNTYsIDI1NywgMTYzODMsIDE2Mzg0LCAxNjM4NSwgMzI3NjcsIDMyNzY4LCAzMjc2OX07CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa1JlY29yZFNpemVzKSAvIHNpemVvZihrUmVjb3JkU2l6ZXNbMF0pOwogICAgICAgICAgaSsrKSB7CiAgICAgICBjb25zdCBzaXplX3QgbGVuID0ga1JlY29yZFNpemVzW2ldOwotICAgICAgaWYgKGxlbiA+IGtCdWZMZW4pIHsKKyAgICAgIGlmIChsZW4gPiBzaXplb2YoYnVmKSkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkJhZCBrUmVjb3JkU2l6ZXMgdmFsdWUuXG4iKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQotICAgICAgaWYgKFdyaXRlQWxsKHNzbC5nZXQoKSwgYnVmLmdldCgpLCBsZW4pIDwgMCkgeworICAgICAgaWYgKFdyaXRlQWxsKHNzbC5nZXQoKSwgYnVmLCBsZW4pIDwgMCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9CiAgICAgfQpAQCAtMTI1Nyw4MiArOTA1LDUzIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIH0KICAgICB9Ci0gICAgaWYgKCFjb25maWctPnNoaW1fc2h1dHNfZG93bikgewotICAgICAgZm9yICg7OykgewotICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtCdWZMZW4gPSAxNjM4NDsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYnVmKG5ldyB1aW50OF90W2tCdWZMZW5dKTsKLQotICAgICAgICAvLyBSZWFkIG9ubHkgNTEyIGJ5dGVzIGF0IGEgdGltZSBpbiBUTFMgdG8gZW5zdXJlIHJlY29yZHMgbWF5IGJlCi0gICAgICAgIC8vIHJldHVybmVkIGluIG11bHRpcGxlIHJlYWRzLgotICAgICAgICBpbnQgbiA9IERvUmVhZChzc2wuZ2V0KCksIGJ1Zi5nZXQoKSwgY29uZmlnLT5pc19kdGxzID8ga0J1ZkxlbiA6IDUxMik7Ci0gICAgICAgIGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNzbC5nZXQoKSwgbik7Ci0gICAgICAgIGlmIChlcnIgPT0gU1NMX0VSUk9SX1pFUk9fUkVUVVJOIHx8Ci0gICAgICAgICAgICAobiA9PSAwICYmIGVyciA9PSBTU0xfRVJST1JfU1lTQ0FMTCkpIHsKLSAgICAgICAgICBpZiAobiAhPSAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgU1NMX2dldF9lcnJvciBvdXRwdXRcbiIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBTdG9wIG9uIGVpdGhlciBjbGVhbiBvciB1bmNsZWFuIHNodXRkb3duLgotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBTU0xfRVJST1JfTk9ORSkgewotICAgICAgICAgIGlmIChuID4gMCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIFNTTF9nZXRfZXJyb3Igb3V0cHV0XG4iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIFN1Y2Nlc3NmdWxseSByZWFkIGRhdGEuCi0gICAgICAgIGlmIChuIDw9IDApIHsKKyAgICBmb3IgKDs7KSB7CisgICAgICB1aW50OF90IGJ1Zls1MTJdOworICAgICAgaW50IG4gPSBEb1JlYWQoc3NsLmdldCgpLCBidWYsIHNpemVvZihidWYpKTsKKyAgICAgIGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNzbC5nZXQoKSwgbik7CisgICAgICBpZiAoZXJyID09IFNTTF9FUlJPUl9aRVJPX1JFVFVSTiB8fAorICAgICAgICAgIChuID09IDAgJiYgZXJyID09IFNTTF9FUlJPUl9TWVNDQUxMKSkgeworICAgICAgICBpZiAobiAhPSAwKSB7CiAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIFNTTF9nZXRfZXJyb3Igb3V0cHV0XG4iKTsKICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBBZnRlciBhIHN1Y2Nlc3NmdWwgcmVhZCwgd2l0aCBvciB3aXRob3V0IEZhbHNlIFN0YXJ0LCB0aGUgaGFuZHNoYWtlCi0gICAgICAgIC8vIG11c3QgYmUgY29tcGxldGUuCi0gICAgICAgIGlmICghR2V0VGVzdFN0YXRlKHNzbC5nZXQoKSktPmhhbmRzaGFrZV9kb25lKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICJoYW5kc2hha2Ugd2FzIG5vdCBjb21wbGV0ZWQgYWZ0ZXIgU1NMX3JlYWRcbiIpOworICAgICAgICAvLyBBY2NlcHQgc2h1dGRvd25zIHdpdGggb3Igd2l0aG91dCBjbG9zZV9ub3RpZnkuCisgICAgICAgIC8vIFRPRE8oZGF2aWRiZW4pOiBXcml0ZSB0ZXN0cyB3aGljaCBkaXN0aW5ndWlzaCB0aGVzZSB0d28gY2FzZXMuCisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIGlmIChlcnIgIT0gU1NMX0VSUk9SX05PTkUpIHsKKyAgICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIFNTTF9nZXRfZXJyb3Igb3V0cHV0XG4iKTsKICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgLy8gU3VjY2Vzc2Z1bGx5IHJlYWQgZGF0YS4KKyAgICAgIGlmIChuIDw9IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIFNTTF9nZXRfZXJyb3Igb3V0cHV0XG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQogCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgYnVmW2ldIF49IDB4ZmY7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFdyaXRlQWxsKHNzbC5nZXQoKSwgYnVmLmdldCgpLCBuKSA8IDApIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgIC8vIEFmdGVyIGEgc3VjY2Vzc2Z1bCByZWFkLCB3aXRoIG9yIHdpdGhvdXQgRmFsc2UgU3RhcnQsIHRoZSBoYW5kc2hha2UKKyAgICAgIC8vIG11c3QgYmUgY29tcGxldGUuCisgICAgICBpZiAoIUdldFRlc3RTdGF0ZShzc2wuZ2V0KCkpLT5oYW5kc2hha2VfZG9uZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImhhbmRzaGFrZSB3YXMgbm90IGNvbXBsZXRlZCBhZnRlciBTU0xfcmVhZFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgYnVmW2ldIF49IDB4ZmY7CisgICAgICB9CisgICAgICBpZiAoV3JpdGVBbGwoc3NsLmdldCgpLCBidWYsIG4pIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgaWYgKCFjb25maWctPmlzX3NlcnZlciAmJiAhY29uZmlnLT5mYWxzZV9zdGFydCAmJgotICAgICAgIWNvbmZpZy0+aW1wbGljaXRfaGFuZHNoYWtlICYmCi0gICAgICBHZXRUZXN0U3RhdGUoc3NsLmdldCgpKS0+Z290X25ld19zZXNzaW9uKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJuZXcgc2Vzc2lvbiB3YXMgZXN0YWJsaXNoZWQgYWZ0ZXIgdGhlIGhhbmRzaGFrZVxuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KICAgaWYgKG91dF9zZXNzaW9uKSB7CiAgICAgb3V0X3Nlc3Npb24tPnJlc2V0KFNTTF9nZXQxX3Nlc3Npb24oc3NsLmdldCgpKSk7CiAgIH0KIAotICByZXQgPSBEb1NodXRkb3duKHNzbC5nZXQoKSk7Ci0KLSAgaWYgKGNvbmZpZy0+c2hpbV9zaHV0c19kb3duICYmIGNvbmZpZy0+Y2hlY2tfY2xvc2Vfbm90aWZ5KSB7Ci0gICAgLy8gV2UgaW5pdGlhdGUgc2h1dGRvd24sIHNvIHxTU0xfc2h1dGRvd258IHdpbGwgcmV0dXJuIGluIHR3byBzdGFnZXMuIEZpcnN0Ci0gICAgLy8gaXQgcmV0dXJucyB6ZXJvIHdoZW4gb3VyIGNsb3NlX25vdGlmeSBpcyBzZW50LCB0aGVuIG9uZSB3aGVuIHRoZSBwZWVyJ3MKLSAgICAvLyBpcyByZWNlaXZlZC4KLSAgICBpZiAocmV0ICE9IDApIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5leHBlY3RlZCBTU0xfc2h1dGRvd24gcmVzdWx0OiAlZCAhPSAwXG4iLCByZXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXQgPSBEb1NodXRkb3duKHNzbC5nZXQoKSk7Ci0gIH0KLQotICBpZiAocmV0ICE9IDEpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVuZXhwZWN0ZWQgU1NMX3NodXRkb3duIHJlc3VsdDogJWQgIT0gMVxuIiwgcmV0KTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQorICBTU0xfc2h1dGRvd24oc3NsLmdldCgpKTsKICAgcmV0dXJuIHRydWU7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9zc2wvdGVzdC9ydW5uZXIvY2lwaGVyX3N1aXRlcy5nbyBiL3NyYy9zc2wvdGVzdC9ydW5uZXIvY2lwaGVyX3N1aXRlcy5nbwppbmRleCBmZmMwNTZkLi43MGM3MjYyIDEwMDY0NAotLS0gYS9zcmMvc3NsL3Rlc3QvcnVubmVyL2NpcGhlcl9zdWl0ZXMuZ28KKysrIGIvc3JjL3NzbC90ZXN0L3J1bm5lci9jaXBoZXJfc3VpdGVzLmdvCkBAIC0xMDIsNiArMTAyLDcgQEAKIAl7VExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMzg0LCAzMiwgNDgsIDE2LCBlY2RoZUVDRFNBS0EsIHN1aXRlRUNESEUgfCBzdWl0ZUVDRFNBIHwgc3VpdGVUTFMxMiB8IHN1aXRlU0hBMzg0LCBjaXBoZXJBRVMsIG1hY1NIQTM4NCwgbmlsfSwKIAl7VExTX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwgMzIsIDIwLCAxNiwgZWNkaGVSU0FLQSwgc3VpdGVFQ0RIRSwgY2lwaGVyQUVTLCBtYWNTSEExLCBuaWx9LAogCXtUTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsIDMyLCAyMCwgMTYsIGVjZGhlRUNEU0FLQSwgc3VpdGVFQ0RIRSB8IHN1aXRlRUNEU0EsIGNpcGhlckFFUywgbWFjU0hBMSwgbmlsfSwKKwl7VExTX0RIRV9SU0FfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNV9TSEEyNTYsIDMyLCAwLCAwLCBkaGVSU0FLQSwgc3VpdGVUTFMxMiwgbmlsLCBuaWwsIGFlYWRDSEFDSEEyMFBPTFkxMzA1fSwKIAl7VExTX0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYsIDE2LCAwLCA0LCBkaGVSU0FLQSwgc3VpdGVUTFMxMiwgbmlsLCBuaWwsIGFlYWRBRVNHQ019LAogCXtUTFNfREhFX1JTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCwgMzIsIDAsIDQsIGRoZVJTQUtBLCBzdWl0ZVRMUzEyIHwgc3VpdGVTSEEzODQsIG5pbCwgbmlsLCBhZWFkQUVTR0NNfSwKIAl7VExTX0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYsIDE2LCAzMiwgMTYsIGRoZVJTQUtBLCBzdWl0ZVRMUzEyLCBjaXBoZXJBRVMsIG1hY1NIQTI1NiwgbmlsfSwKQEAgLTExOSwxOCArMTIwLDEyIEBACiAJe1RMU19FQ0RIRV9SU0FfV0lUSF8zREVTX0VERV9DQkNfU0hBLCAyNCwgMjAsIDgsIGVjZGhlUlNBS0EsIHN1aXRlRUNESEUsIGNpcGhlcjNERVMsIG1hY1NIQTEsIG5pbH0sCiAJe1RMU19ESEVfUlNBX1dJVEhfM0RFU19FREVfQ0JDX1NIQSwgMjQsIDIwLCA4LCBkaGVSU0FLQSwgMCwgY2lwaGVyM0RFUywgbWFjU0hBMSwgbmlsfSwKIAl7VExTX1JTQV9XSVRIXzNERVNfRURFX0NCQ19TSEEsIDI0LCAyMCwgOCwgcnNhS0EsIDAsIGNpcGhlcjNERVMsIG1hY1NIQTEsIG5pbH0sCisJe1RMU19FQ0RIRV9QU0tfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYsIDE2LCAwLCA0LCBlY2RoZVBTS0tBLCBzdWl0ZUVDREhFIHwgc3VpdGVUTFMxMiB8IHN1aXRlUFNLLCBuaWwsIG5pbCwgYWVhZEFFU0dDTX0sCiAJe1RMU19QU0tfV0lUSF9SQzRfMTI4X1NIQSwgMTYsIDIwLCAwLCBwc2tLQSwgc3VpdGVOb0RUTFMgfCBzdWl0ZVBTSywgY2lwaGVyUkM0LCBtYWNTSEExLCBuaWx9LAogCXtUTFNfUFNLX1dJVEhfQUVTXzEyOF9DQkNfU0hBLCAxNiwgMjAsIDE2LCBwc2tLQSwgc3VpdGVQU0ssIGNpcGhlckFFUywgbWFjU0hBMSwgbmlsfSwKIAl7VExTX1BTS19XSVRIX0FFU18yNTZfQ0JDX1NIQSwgMzIsIDIwLCAxNiwgcHNrS0EsIHN1aXRlUFNLLCBjaXBoZXJBRVMsIG1hY1NIQTEsIG5pbH0sCiAJe1RMU19FQ0RIRV9QU0tfV0lUSF9BRVNfMTI4X0NCQ19TSEEsIDE2LCAyMCwgMTYsIGVjZGhlUFNLS0EsIHN1aXRlRUNESEUgfCBzdWl0ZVBTSywgY2lwaGVyQUVTLCBtYWNTSEExLCBuaWx9LAogCXtUTFNfRUNESEVfUFNLX1dJVEhfQUVTXzI1Nl9DQkNfU0hBLCAzMiwgMjAsIDE2LCBlY2RoZVBTS0tBLCBzdWl0ZUVDREhFIHwgc3VpdGVQU0ssIGNpcGhlckFFUywgbWFjU0hBMSwgbmlsfSwKLQl7VExTX1JTQV9XSVRIX05VTExfU0hBLCAwLCAyMCwgMCwgcnNhS0EsIHN1aXRlTm9EVExTLCBjaXBoZXJOdWxsLCBtYWNTSEExLCBuaWx9LAotfQotCi10eXBlIG51bGxDaXBoZXIgc3RydWN0e30KLQotZnVuYyBjaXBoZXJOdWxsKGtleSwgaXYgW11ieXRlLCBpc1JlYWQgYm9vbCkgaW50ZXJmYWNle30gewotCXJldHVybiBudWxsQ2lwaGVye30KIH0KIAogZnVuYyBjaXBoZXJSQzQoa2V5LCBpdiBbXWJ5dGUsIGlzUmVhZCBib29sKSBpbnRlcmZhY2V7fSB7CkBAIC0zNzUsNyArMzcwLDYgQEAKIC8vIEEgbGlzdCBvZiB0aGUgcG9zc2libGUgY2lwaGVyIHN1aXRlIGlkcy4gVGFrZW4gZnJvbQogLy8gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy90bHMtcGFyYW1ldGVycy90bHMtcGFyYW1ldGVycy54bWwKIGNvbnN0ICgKLQlUTFNfUlNBX1dJVEhfTlVMTF9TSEEgICAgICAgICAgICAgICAgICAgdWludDE2ID0gMHgwMDAyCiAJVExTX1JTQV9XSVRIX1JDNF8xMjhfTUQ1ICAgICAgICAgICAgICAgIHVpbnQxNiA9IDB4MDAwNAogCVRMU19SU0FfV0lUSF9SQzRfMTI4X1NIQSAgICAgICAgICAgICAgICB1aW50MTYgPSAweDAwMDUKIAlUTFNfUlNBX1dJVEhfM0RFU19FREVfQ0JDX1NIQSAgICAgICAgICAgdWludDE2ID0gMHgwMDBhCkBAIC00MTIsMTIgKzQwNiwxMyBAQAogCVRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQgICB1aW50MTYgPSAweGMwMzAKIAlUTFNfRUNESEVfUFNLX1dJVEhfQUVTXzEyOF9DQkNfU0hBICAgICAgdWludDE2ID0gMHhjMDM1CiAJVExTX0VDREhFX1BTS19XSVRIX0FFU18yNTZfQ0JDX1NIQSAgICAgIHVpbnQxNiA9IDB4YzAzNgotCXJlbmVnb3RpYXRpb25TQ1NWICAgICAgICAgICAgICAgICAgICAgICB1aW50MTYgPSAweDAwZmYKIAlmYWxsYmFja1NDU1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2ID0gMHg1NjAwCiApCiAKIC8vIEFkZGl0aW9uYWwgY2lwaGVyIHN1aXRlIElEcywgbm90IElBTkEtYXNzaWduZWQuCiBjb25zdCAoCisJVExTX0VDREhFX1BTS19XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiAgICAgICAgIHVpbnQxNiA9IDB4Y2FmZQogCVRMU19FQ0RIRV9SU0FfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNV9TSEEyNTYgICB1aW50MTYgPSAweGNjMTMKIAlUTFNfRUNESEVfRUNEU0FfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNV9TSEEyNTYgdWludDE2ID0gMHhjYzE0CisJVExTX0RIRV9SU0FfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNV9TSEEyNTYgICAgIHVpbnQxNiA9IDB4Y2MxNQogKQpkaWZmIC0tZ2l0IGEvc3JjL3NzbC90ZXN0L3J1bm5lci9jb21tb24uZ28gYi9zcmMvc3NsL3Rlc3QvcnVubmVyL2NvbW1vbi5nbwppbmRleCA3N2JlOWY2Li5lZGViYmExIDEwMDY0NAotLS0gYS9zcmMvc3NsL3Rlc3QvcnVubmVyL2NvbW1vbi5nbworKysgYi9zcmMvc3NsL3Rlc3QvcnVubmVyL2NvbW1vbi5nbwpAQCAtODIsNyArODIsNiBAQAogCWV4dGVuc2lvblNpZ25lZENlcnRpZmljYXRlVGltZXN0YW1wIHVpbnQxNiA9IDE4CiAJZXh0ZW5zaW9uRXh0ZW5kZWRNYXN0ZXJTZWNyZXQgICAgICAgdWludDE2ID0gMjMKIAlleHRlbnNpb25TZXNzaW9uVGlja2V0ICAgICAgICAgICAgICB1aW50MTYgPSAzNQotCWV4dGVuc2lvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNiA9IDEyMzQgIC8vIG5vdCBJQU5BIGFzc2lnbmVkCiAJZXh0ZW5zaW9uTmV4dFByb3RvTmVnICAgICAgICAgICAgICAgdWludDE2ID0gMTMxNzIgLy8gbm90IElBTkEgYXNzaWduZWQKIAlleHRlbnNpb25SZW5lZ290aWF0aW9uSW5mbyAgICAgICAgICB1aW50MTYgPSAweGZmMDEKIAlleHRlbnNpb25DaGFubmVsSUQgICAgICAgICAgICAgICAgICB1aW50MTYgPSAzMDAzMiAvLyBub3QgSUFOQSBhc3NpZ25lZApAQCAtMTg5LDkgKzE4OCw3IEBACiAJVmVyaWZpZWRDaGFpbnMgICAgICAgICAgICAgW11bXSp4NTA5LkNlcnRpZmljYXRlIC8vIHZlcmlmaWVkIGNoYWlucyBidWlsdCBmcm9tIFBlZXJDZXJ0aWZpY2F0ZXMKIAlDaGFubmVsSUQgICAgICAgICAgICAgICAgICAqZWNkc2EuUHVibGljS2V5ICAgICAgLy8gdGhlIGNoYW5uZWwgSUQgZm9yIHRoaXMgY29ubmVjdGlvbgogCVNSVFBQcm90ZWN0aW9uUHJvZmlsZSAgICAgIHVpbnQxNiAgICAgICAgICAgICAgICAvLyB0aGUgbmVnb3RpYXRlZCBEVExTLVNSVFAgcHJvdGVjdGlvbiBwcm9maWxlCi0JVExTVW5pcXVlICAgICAgICAgICAgICAgICAgW11ieXRlICAgICAgICAgICAgICAgIC8vIHRoZSB0bHMtdW5pcXVlIGNoYW5uZWwgYmluZGluZwotCVNDVExpc3QgICAgICAgICAgICAgICAgICAgIFtdYnl0ZSAgICAgICAgICAgICAgICAvLyBzaWduZWQgY2VydGlmaWNhdGUgdGltZXN0YW1wIGxpc3QKLQlDbGllbnRDZXJ0U2lnbmF0dXJlSGFzaCAgICB1aW50OCAgICAgICAgICAgICAgICAgLy8gVExTIGlkIG9mIHRoZSBoYXNoIHVzZWQgYnkgdGhlIGNsaWVudCB0byBzaWduIHRoZSBoYW5kc2hha2UKKwlUTFNVbmlxdWUgICAgICAgICAgICAgICAgICBbXWJ5dGUKIH0KIAogLy8gQ2xpZW50QXV0aFR5cGUgZGVjbGFyZXMgdGhlIHBvbGljeSB0aGUgc2VydmVyIHdpbGwgZm9sbG93IGZvcgpAQCAtMjE3LDggKzIxNCw2IEBACiAJaGFuZHNoYWtlSGFzaCAgICAgICAgW11ieXRlICAgICAgICAgICAgICAvLyBIYW5kc2hha2UgaGFzaCBmb3IgQ2hhbm5lbCBJRCBwdXJwb3Nlcy4KIAlzZXJ2ZXJDZXJ0aWZpY2F0ZXMgICBbXSp4NTA5LkNlcnRpZmljYXRlIC8vIENlcnRpZmljYXRlIGNoYWluIHByZXNlbnRlZCBieSB0aGUgc2VydmVyCiAJZXh0ZW5kZWRNYXN0ZXJTZWNyZXQgYm9vbCAgICAgICAgICAgICAgICAvLyBXaGV0aGVyIGFuIGV4dGVuZGVkIG1hc3RlciBzZWNyZXQgd2FzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHNlc3Npb24KLQlzY3RMaXN0ICAgICAgICAgICAgICBbXWJ5dGUKLQlvY3NwUmVzcG9uc2UgICAgICAgICBbXWJ5dGUKIH0KIAogLy8gQ2xpZW50U2Vzc2lvbkNhY2hlIGlzIGEgY2FjaGUgb2YgQ2xpZW50U2Vzc2lvblN0YXRlIG9iamVjdHMgdGhhdCBjYW4gYmUgdXNlZApAQCAtNDA0LDEwICszOTksNiBAQAogCS8vIFNlcnZlcktleUV4Y2hhbmdlIG1lc3NhZ2Ugc2hvdWxkIGJlIGludmFsaWQuCiAJSW52YWxpZFNLWFNpZ25hdHVyZSBib29sCiAKLQkvLyBJbnZhbGlkQ2VydFZlcmlmeVNpZ25hdHVyZSBzcGVjaWZpZXMgdGhhdCB0aGUgc2lnbmF0dXJlIGluIGEKLQkvLyBDZXJ0aWZpY2F0ZVZlcmlmeSBtZXNzYWdlIHNob3VsZCBiZSBpbnZhbGlkLgotCUludmFsaWRDZXJ0VmVyaWZ5U2lnbmF0dXJlIGJvb2wKLQogCS8vIEludmFsaWRTS1hDdXJ2ZSBjYXVzZXMgdGhlIGN1cnZlIElEIGluIHRoZSBTZXJ2ZXJLZXlFeGNoYW5nZSBtZXNzYWdlCiAJLy8gdG8gYmUgd3JvbmcuCiAJSW52YWxpZFNLWEN1cnZlIGJvb2wKQEAgLTQ4NSwxMCArNDc2LDYgQEAKIAkvLyBUTFNfRkFMTEJBQ0tfU0NTViBpbiB0aGUgQ2xpZW50SGVsbG8uCiAJU2VuZEZhbGxiYWNrU0NTViBib29sCiAKLQkvLyBTZW5kUmVuZWdvdGlhdGlvblNDU1YgY2F1c2VzIHRoZSBjbGllbnQgdG8gaW5jbHVkZSB0aGUgcmVuZWdvdGlhdGlvbgotCS8vIFNDU1YgaW4gdGhlIENsaWVudEhlbGxvLgotCVNlbmRSZW5lZ290aWF0aW9uU0NTViBib29sCi0KIAkvLyBNYXhIYW5kc2hha2VSZWNvcmRMZW5ndGgsIGlmIG5vbi16ZXJvLCBpcyB0aGUgbWF4aW11bSBzaXplIG9mIGEKIAkvLyBoYW5kc2hha2UgcmVjb3JkLiBIYW5kc2hha2UgbWVzc2FnZXMgd2lsbCBiZSBzcGxpdCBpbnRvIG11bHRpcGxlCiAJLy8gcmVjb3JkcyBhdCB0aGUgc3BlY2lmaWVkIHNpemUsIGV4Y2VwdCB0aGF0IHRoZSBjbGllbnRfdmVyc2lvbiB3aWxsCkBAIC01NDgsMTQgKzUzNSwxMSBAQAogCS8vIG11c3Qgc3BlY2lmeSBpbiB0aGUgc2VydmVyX25hbWUgZXh0ZW5zaW9uLgogCUV4cGVjdFNlcnZlck5hbWUgc3RyaW5nCiAKLQkvLyBTd2FwTlBOQW5kQUxQTiBzd2l0Y2hlcyB0aGUgcmVsYXRpdmUgb3JkZXIgYmV0d2VlbiBOUE4gYW5kIEFMUE4gaW4KLQkvLyBib3RoIENsaWVudEhlbGxvIGFuZCBTZXJ2ZXJIZWxsby4KKwkvLyBTd2FwTlBOQW5kQUxQTiBzd2l0Y2hlcyB0aGUgcmVsYXRpdmUgb3JkZXIgYmV0d2VlbiBOUE4gYW5kCisJLy8gQUxQTiBvbiB0aGUgc2VydmVyLiBUaGlzIGlzIHRvIHRlc3QgdGhhdCBzZXJ2ZXIgcHJlZmVyZW5jZQorCS8vIG9mIEFMUE4gd29ya3MgcmVnYXJkbGVzcyBvZiB0aGVpciByZWxhdGl2ZSBvcmRlci4KIAlTd2FwTlBOQW5kQUxQTiBib29sCiAKLQkvLyBBTFBOUHJvdG9jb2wsIGlmIG5vdCBuaWwsIHNldHMgdGhlIEFMUE4gcHJvdG9jb2wgdGhhdCBhIHNlcnZlciB3aWxsCi0JLy8gcmV0dXJuLgotCUFMUE5Qcm90b2NvbCAqc3RyaW5nCi0KIAkvLyBBbGxvd1Nlc3Npb25WZXJzaW9uTWlzbWF0Y2ggY2F1c2VzIHRoZSBzZXJ2ZXIgdG8gcmVzdW1lIHNlc3Npb25zCiAJLy8gcmVnYXJkbGVzcyBvZiB0aGUgdmVyc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb24uCiAJQWxsb3dTZXNzaW9uVmVyc2lvbk1pc21hdGNoIGJvb2wKQEAgLTU4OCwxNSArNTcyLDExIEBACiAJLy8gZGlkbid0IHN1cHBvcnQgdGhlIHJlbmVnb3RpYXRpb24gaW5mbyBleHRlbnNpb24uCiAJTm9SZW5lZ290aWF0aW9uSW5mbyBib29sCiAKLQkvLyBSZXF1aXJlUmVuZWdvdGlhdGlvbkluZm8sIGlmIHRydWUsIGNhdXNlcyB0aGUgY2xpZW50IHRvIHJldHVybiBhbgotCS8vIGVycm9yIGlmIHRoZSBzZXJ2ZXIgZG9lc24ndCByZXBseSB3aXRoIHRoZSByZW5lZ290aWF0aW9uIGV4dGVuc2lvbi4KLQlSZXF1aXJlUmVuZWdvdGlhdGlvbkluZm8gYm9vbAotCi0JLy8gU2VxdWVuY2VOdW1iZXJNYXBwaW5nLCBpZiBub24tbmlsLCBpcyB0aGUgbWFwcGluZyBmdW5jdGlvbiB0byBhcHBseQotCS8vIHRvIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2Ygb3V0Z29pbmcgcGFja2V0cy4gRm9yIGJvdGggVExTIGFuZCBEVExTLAotCS8vIHRoZSB0d28gbW9zdC1zaWduaWZpY2FudCBieXRlcyBpbiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlIG51bWJlciBhcmUKLQkvLyBpZ25vcmVkIHNvIHRoYXQgdGhlIERUTFMgZXBvY2ggY2Fubm90IGJlIGNoYW5nZWQuCi0JU2VxdWVuY2VOdW1iZXJNYXBwaW5nIGZ1bmModWludDY0KSB1aW50NjQKKwkvLyBTZXF1ZW5jZU51bWJlckluY3JlbWVudCwgaWYgbm9uLXplcm8sIGNhdXNlcyBvdXRnb2luZyBzZXF1ZW5jZQorCS8vIG51bWJlcnMgaW4gRFRMUyB0byBpbmNyZW1lbnQgYnkgdGhhdCB2YWx1ZSByYXRoZXIgYnkgMS4gVGhpcyBpcyB0bworCS8vIHN0cmVzcyB0aGUgcmVwbGF5IGJpdG1hcCB3aW5kb3cgYnkgc2ltdWxhdGluZyBleHRyZW1lIHBhY2tldCBsb3NzIGFuZAorCS8vIHJldHJhbnNtaXQgYXQgdGhlIHJlY29yZCBsYXllci4KKwlTZXF1ZW5jZU51bWJlckluY3JlbWVudCB1aW50NjQKIAogCS8vIFJTQUVwaGVtZXJhbEtleSwgaWYgdHJ1ZSwgY2F1c2VzIHRoZSBzZXJ2ZXIgdG8gc2VuZCBhCiAJLy8gU2VydmVyS2V5RXhjaGFuZ2UgbWVzc2FnZSBjb250YWluaW5nIGFuIGVwaGVtZXJhbCBrZXkgKGFzIGluCkBAIC02MjksNiArNjA5LDEwIEBACiAJLy8gYWNyb3NzIGEgcmVuZWdvLgogCVJlcXVpcmVTYW1lUmVuZWdvQ2xpZW50VmVyc2lvbiBib29sCiAKKwkvLyBSZXF1aXJlRmFzdHJhZGlvUGFkZGluZywgaWYgdHJ1ZSwgcmVxdWlyZXMgdGhhdCBDbGllbnRIZWxsbyBtZXNzYWdlcworCS8vIGJlIGF0IGxlYXN0IDEwMDAgYnl0ZXMgbG9uZy4KKwlSZXF1aXJlRmFzdHJhZGlvUGFkZGluZyBib29sCisKIAkvLyBFeHBlY3RJbml0aWFsUmVjb3JkVmVyc2lvbiwgaWYgbm9uLXplcm8sIGlzIHRoZSBleHBlY3RlZAogCS8vIHZlcnNpb24gb2YgdGhlIHJlY29yZHMgYmVmb3JlIHRoZSB2ZXJzaW9uIGlzIGRldGVybWluZWQuCiAJRXhwZWN0SW5pdGlhbFJlY29yZFZlcnNpb24gdWludDE2CkBAIC02NDIsMTEgKzYyNiw3IEBACiAJLy8gdGhlIHNlcnZlciBiZWxpZXZlcyBpdCBoYXMgYWN0dWFsbHkgbmVnb3RpYXRlZC4KIAlTZW5kQ2lwaGVyU3VpdGUgdWludDE2CiAKLQkvLyBBcHBEYXRhQmVmb3JlSGFuZHNoYWtlLCBpZiBub3QgbmlsLCBjYXVzZXMgYXBwbGljYXRpb24gZGF0YSB0byBiZQotCS8vIHNlbnQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBmaXJzdCBoYW5kc2hha2UgbWVzc2FnZS4KLQlBcHBEYXRhQmVmb3JlSGFuZHNoYWtlIFtdYnl0ZQotCi0JLy8gQXBwRGF0YUFmdGVyQ2hhbmdlQ2lwaGVyU3BlYywgaWYgbm90IG5pbCwgY2F1c2VzIGFwcGxpY2F0aW9uIGRhdGEgdG8KKwkvLyBBcHBEYXRhQWZ0ZXJDaGFuZ2VDaXBoZXJTcGVjLCBpZiBub3QgbnVsbCwgY2F1c2VzIGFwcGxpY2F0aW9uIGRhdGEgdG8KIAkvLyBiZSBzZW50IGltbWVkaWF0ZWx5IGFmdGVyIENoYW5nZUNpcGhlclNwZWMuCiAJQXBwRGF0YUFmdGVyQ2hhbmdlQ2lwaGVyU3BlYyBbXWJ5dGUKIApAQCAtNjg4LDEwICs2NjgsMTcgQEAKIAkvLyBoYW5kc2hha2UgZnJhZ21lbnRzIGluIERUTFMgdG8gaGF2ZSB0aGUgd3JvbmcgbWVzc2FnZSBsZW5ndGguCiAJRnJhZ21lbnRNZXNzYWdlTGVuZ3RoTWlzbWF0Y2ggYm9vbAogCi0JLy8gU3BsaXRGcmFnbWVudHMsIGlmIG5vbi16ZXJvLCBjYXVzZXMgdGhlIGhhbmRzaGFrZSBmcmFnbWVudHMgaW4gRFRMUwotCS8vIHRvIGJlIHNwbGl0IGFjcm9zcyB0d28gcmVjb3Jkcy4gVGhlIHZhbHVlIG9mIHxTcGxpdEZyYWdtZW50c3wgaXMgdGhlCi0JLy8gbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBmaXJzdCBmcmFnbWVudC4KLQlTcGxpdEZyYWdtZW50cyBpbnQKKwkvLyBTcGxpdEZyYWdtZW50SGVhZGVyLCBpZiB0cnVlLCBjYXVzZXMgdGhlIGhhbmRzaGFrZSBmcmFnbWVudHMgaW4gRFRMUworCS8vIHRvIGJlIHNwbGl0IGFjcm9zcyB0d28gcmVjb3Jkcy4KKwlTcGxpdEZyYWdtZW50SGVhZGVyIGJvb2wKKworCS8vIFNwbGl0RnJhZ21lbnRCb2R5LCBpZiB0cnVlLCBjYXVzZXMgdGhlIGhhbmRzaGFrZSBib2RpZXMgaW4gRFRMUyB0byBiZQorCS8vIHNwbGl0IGFjcm9zcyB0d28gcmVjb3Jkcy4KKwkvLworCS8vIFRPRE8oZGF2aWRiZW4pOiBUaGVyZSdzIG9uZSBmaW5hbCBzcGxpdCB0byB0ZXN0OiB3aGVuIHRoZSBoZWFkZXIgYW5kCisJLy8gYm9keSBhcmUgc3BsaXQgYWNyb3NzIHR3byByZWNvcmRzLiBCdXQgdGhvc2UgYXJlIChpbmNvcnJlY3RseSkKKwkvLyBhY2NlcHRlZCByaWdodCBub3cuCisJU3BsaXRGcmFnbWVudEJvZHkgYm9vbAogCiAJLy8gU2VuZEVtcHR5RnJhZ21lbnRzLCBpZiB0cnVlLCBjYXVzZXMgaGFuZHNoYWtlcyB0byBpbmNsdWRlIGVtcHR5CiAJLy8gZnJhZ21lbnRzIGluIERUTFMuCkBAIC03MTgsNiArNzA1LDEwIEBACiAJLy8gcHJlZmVyZW5jZXMgdG8gYmUgaWdub3JlZC4KIAlJZ25vcmVQZWVyQ3VydmVQcmVmZXJlbmNlcyBib29sCiAKKwkvLyBTZW5kV2FybmluZ0FsZXJ0cywgaWYgbm9uLXplcm8sIGNhdXNlcyBldmVyeSByZWNvcmQgdG8gYmUgcHJlZmFjZWQgYnkKKwkvLyBhIHdhcm5pbmcgYWxlcnQuCisJU2VuZFdhcm5pbmdBbGVydHMgYWxlcnQKKwogCS8vIEJhZEZpbmlzaGVkLCBpZiB0cnVlLCBjYXVzZXMgdGhlIEZpbmlzaGVkIGhhc2ggdG8gYmUgYnJva2VuLgogCUJhZEZpbmlzaGVkIGJvb2wKIApAQCAtNzM2LDQzICs3MjcsNiBAQAogCiAJLy8gRW5hYmxlQWxsQ2lwaGVyc0luRFRMUywgaWYgdHJ1ZSwgY2F1c2VzIFJDNCB0byBiZSBlbmFibGVkIGluIERUTFMuCiAJRW5hYmxlQWxsQ2lwaGVyc0luRFRMUyBib29sCi0KLQkvLyBFbXB0eUNlcnRpZmljYXRlTGlzdCwgaWYgdHJ1ZSwgY2F1c2VzIHRoZSBzZXJ2ZXIgdG8gc2VuZCBhbiBlbXB0eQotCS8vIGNlcnRpZmljYXRlIGxpc3QgaW4gdGhlIENlcnRpZmljYXRlIG1lc3NhZ2UuCi0JRW1wdHlDZXJ0aWZpY2F0ZUxpc3QgYm9vbAotCi0JLy8gRXhwZWN0TmV3VGlja2V0LCBpZiB0cnVlLCBjYXVzZXMgdGhlIGNsaWVudCB0byBhYm9ydCBpZiBpdCBkb2VzIG5vdAotCS8vIHJlY2VpdmUgYSBuZXcgdGlja2V0LgotCUV4cGVjdE5ld1RpY2tldCBib29sCi0KLQkvLyBSZXF1aXJlQ2xpZW50SGVsbG9TaXplLCBpZiBub3QgemVybywgaXMgdGhlIHJlcXVpcmVkIGxlbmd0aCBpbiBieXRlcwotCS8vIG9mIHRoZSBDbGllbnRIZWxsbyAvcmVjb3JkLy4gVGhpcyBpcyBjaGVja2VkIGJ5IHRoZSBzZXJ2ZXIuCi0JUmVxdWlyZUNsaWVudEhlbGxvU2l6ZSBpbnQKLQotCS8vIEN1c3RvbUV4dGVuc2lvbiwgaWYgbm90IGVtcHR5LCBjb250YWlucyB0aGUgY29udGVudHMgb2YgYW4gZXh0ZW5zaW9uCi0JLy8gdGhhdCB3aWxsIGJlIGFkZGVkIHRvIGNsaWVudC9zZXJ2ZXIgaGVsbG9zLgotCUN1c3RvbUV4dGVuc2lvbiBzdHJpbmcKLQotCS8vIEV4cGVjdGVkQ3VzdG9tRXh0ZW5zaW9uLCBpZiBub3QgbmlsLCBjb250YWlucyB0aGUgZXhwZWN0ZWQgY29udGVudHMKLQkvLyBvZiBhIGN1c3RvbSBleHRlbnNpb24uCi0JRXhwZWN0ZWRDdXN0b21FeHRlbnNpb24gKnN0cmluZwotCi0JLy8gTm9DbG9zZU5vdGlmeSwgaWYgdHJ1ZSwgY2F1c2VzIHRoZSBjbG9zZV9ub3RpZnkgYWxlcnQgdG8gYmUgc2tpcHBlZAotCS8vIG9uIGNvbm5lY3Rpb24gc2h1dGRvd24uCi0JTm9DbG9zZU5vdGlmeSBib29sCi0KLQkvLyBFeHBlY3RDbG9zZU5vdGlmeSwgaWYgdHJ1ZSwgcmVxdWlyZXMgYSBjbG9zZV9ub3RpZnkgZnJvbSB0aGUgcGVlciBvbgotCS8vIHNodXRkb3duLiBSZWNvcmRzIGZyb20gdGhlIHBlZXIgcmVjZWl2ZWQgYWZ0ZXIgY2xvc2Vfbm90aWZ5IGlzIHNlbnQKLQkvLyBhcmUgbm90IGRpc2NhcmQuCi0JRXhwZWN0Q2xvc2VOb3RpZnkgYm9vbAotCi0JLy8gU2VuZExhcmdlUmVjb3JkcywgaWYgdHJ1ZSwgYWxsb3dzIG91dGdvaW5nIHJlY29yZHMgdG8gYmUgc2VudAotCS8vIGFyYml0cmFyaWx5IGxhcmdlLgotCVNlbmRMYXJnZVJlY29yZHMgYm9vbAotCi0JLy8gTmVnb3RpYXRlQUxQTkFuZE5QTiwgaWYgdHJ1ZSwgY2F1c2VzIHRoZSBzZXJ2ZXIgdG8gbmVnb3RpYXRlIGJvdGgKLQkvLyBBTFBOIGFuZCBOUE4gaW4gdGhlIHNhbWUgY29ubmV0aW9uLgotCU5lZ290aWF0ZUFMUE5BbmROUE4gYm9vbAogfQogCiBmdW5jIChjICpDb25maWcpIHNlcnZlckluaXQoKSB7CmRpZmYgLS1naXQgYS9zcmMvc3NsL3Rlc3QvcnVubmVyL2Nvbm4uZ28gYi9zcmMvc3NsL3Rlc3QvcnVubmVyL2Nvbm4uZ28KaW5kZXggMzliZGZkYS4uYWRiYzFjMyAxMDA2NDQKLS0tIGEvc3JjL3NzbC90ZXN0L3J1bm5lci9jb25uLmdvCisrKyBiL3NyYy9zc2wvdGVzdC9ydW5uZXIvY29ubi5nbwpAQCAtMTIsNyArMTIsNiBAQAogCSJjcnlwdG8vZWNkc2EiCiAJImNyeXB0by9zdWJ0bGUiCiAJImNyeXB0by94NTA5IgotCSJlbmNvZGluZy9iaW5hcnkiCiAJImVycm9ycyIKIAkiZm10IgogCSJpbyIKQEAgLTQwLDcgKzM5LDYgQEAKIAlleHRlbmRlZE1hc3RlclNlY3JldCBib29sIC8vIHdoZXRoZXIgdGhpcyBzZXNzaW9uIHVzZWQgYW4gZXh0ZW5kZWQgbWFzdGVyIHNlY3JldAogCWNpcGhlclN1aXRlICAgICAgICAgICpjaXBoZXJTdWl0ZQogCW9jc3BSZXNwb25zZSAgICAgICAgIFtdYnl0ZSAvLyBzdGFwbGVkIE9DU1AgcmVzcG9uc2UKLQlzY3RMaXN0ICAgICAgICAgICAgICBbXWJ5dGUgLy8gc2lnbmVkIGNlcnRpZmljYXRlIHRpbWVzdGFtcCBsaXN0CiAJcGVlckNlcnRpZmljYXRlcyAgICAgW10qeDUwOS5DZXJ0aWZpY2F0ZQogCS8vIHZlcmlmaWVkQ2hhaW5zIGNvbnRhaW5zIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbnMgdGhhdCB3ZSBidWlsdCwgYXMKIAkvLyBvcHBvc2VkIHRvIHRoZSBvbmVzIHByZXNlbnRlZCBieSB0aGUgc2VydmVyLgpAQCAtNTAsMTEgKzQ4LDYgQEAKIAkvLyBmaXJzdEZpbmlzaGVkIGNvbnRhaW5zIHRoZSBmaXJzdCBGaW5pc2hlZCBoYXNoIHNlbnQgZHVyaW5nIHRoZQogCS8vIGhhbmRzaGFrZS4gVGhpcyBpcyB0aGUgInRscy11bmlxdWUiIGNoYW5uZWwgYmluZGluZyB2YWx1ZS4KIAlmaXJzdEZpbmlzaGVkIFsxMl1ieXRlCi0JLy8gY2xpZW50Q2VydFNpZ25hdHVyZUhhc2ggY29udGFpbnMgdGhlIFRMUyBoYXNoIGlkIGZvciB0aGUgaGFzaCB0aGF0Ci0JLy8gd2FzIHVzZWQgYnkgdGhlIGNsaWVudCB0byBzaWduIHRoZSBoYW5kc2hha2Ugd2l0aCBhIGNsaWVudAotCS8vIGNlcnRpZmljYXRlLiBUaGlzIGlzIG9ubHkgc2V0IGJ5IGEgc2VydmVyIGFuZCBpcyB6ZXJvIGlmIG5vIGNsaWVudAotCS8vIGNlcnRpZmljYXRlcyB3ZXJlIHVzZWQuCi0JY2xpZW50Q2VydFNpZ25hdHVyZUhhc2ggdWludDgKIAogCWNsaWVudFJhbmRvbSwgc2VydmVyUmFuZG9tIFszMl1ieXRlCiAJbWFzdGVyU2VjcmV0ICAgICAgICAgICAgICAgWzQ4XWJ5dGUKQEAgLTk0LDggKzg3LDYgQEAKIAljLm91dC5pc0RUTFMgPSBjLmlzRFRMUwogCWMuaW4uY29uZmlnID0gYy5jb25maWcKIAljLm91dC5jb25maWcgPSBjLmNvbmZpZwotCi0JYy5vdXQudXBkYXRlT3V0U2VxKCkKIH0KIAogLy8gQWNjZXNzIHRvIG5ldC5Db25uIG1ldGhvZHMuCkBAIC0xNDMsNyArMTM0LDYgQEAKIAljaXBoZXIgIGludGVyZmFjZXt9IC8vIGNpcGhlciBhbGdvcml0aG0KIAltYWMgICAgIG1hY0Z1bmN0aW9uCiAJc2VxICAgICBbOF1ieXRlIC8vIDY0LWJpdCBzZXF1ZW5jZSBudW1iZXIKLQlvdXRTZXEgIFs4XWJ5dGUgLy8gTWFwcGVkIHNlcXVlbmNlIG51bWJlcgogCWJmcmVlICAgKmJsb2NrICAvLyBsaXN0IG9mIGZyZWUgYmxvY2tzCiAKIAluZXh0Q2lwaGVyIGludGVyZmFjZXt9IC8vIG5leHQgZW5jcnlwdGlvbiBzdGF0ZQpAQCAtMTk5LDYgKzE4OSwxMCBAQAogCWlmIGhjLmlzRFRMUyB7CiAJCS8vIEluY3JlbWVudCB1cCB0byB0aGUgZXBvY2ggaW4gRFRMUy4KIAkJbGltaXQgPSAyCisKKwkJaWYgaXNPdXRnb2luZyAmJiBoYy5jb25maWcuQnVncy5TZXF1ZW5jZU51bWJlckluY3JlbWVudCAhPSAwIHsKKwkJCWluY3JlbWVudCA9IGhjLmNvbmZpZy5CdWdzLlNlcXVlbmNlTnVtYmVySW5jcmVtZW50CisJCX0KIAl9CiAJZm9yIGkgOj0gNzsgaSA+PSBsaW1pdDsgaS0tIHsKIAkJaW5jcmVtZW50ICs9IHVpbnQ2NChoYy5zZXFbaV0pCkBAIC0yMTIsOCArMjA2LDYgQEAKIAlpZiBpbmNyZW1lbnQgIT0gMCB7CiAJCXBhbmljKCJUTFM6IHNlcXVlbmNlIG51bWJlciB3cmFwYXJvdW5kIikKIAl9Ci0KLQloYy51cGRhdGVPdXRTZXEoKQogfQogCiAvLyBpbmNOZXh0U2VxIGluY3JlbWVudHMgdGhlIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciBmb3IgdGhlIG5leHQgZXBvY2guCkBAIC0yNDksMjIgKzI0MSw2IEBACiAJCQloYy5zZXFbaV0gPSAwCiAJCX0KIAl9Ci0KLQloYy51cGRhdGVPdXRTZXEoKQotfQotCi1mdW5jIChoYyAqaGFsZkNvbm4pIHVwZGF0ZU91dFNlcSgpIHsKLQlpZiBoYy5jb25maWcuQnVncy5TZXF1ZW5jZU51bWJlck1hcHBpbmcgIT0gbmlsIHsKLQkJc2VxVTY0IDo9IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGhjLnNlcVs6XSkKLQkJc2VxVTY0ID0gaGMuY29uZmlnLkJ1Z3MuU2VxdWVuY2VOdW1iZXJNYXBwaW5nKHNlcVU2NCkKLQkJYmluYXJ5LkJpZ0VuZGlhbi5QdXRVaW50NjQoaGMub3V0U2VxWzpdLCBzZXFVNjQpCi0KLQkJLy8gVGhlIERUTFMgZXBvY2ggY2Fubm90IGJlIGNoYW5nZWQuCi0JCWNvcHkoaGMub3V0U2VxWzoyXSwgaGMuc2VxWzoyXSkKLQkJcmV0dXJuCi0JfQotCi0JY29weShoYy5vdXRTZXFbOl0sIGhjLnNlcVs6XSkKIH0KIAogZnVuYyAoaGMgKmhhbGZDb25uKSByZWNvcmRIZWFkZXJMZW4oKSBpbnQgewpAQCAtNDIxLDggKzM5Nyw2IEBACiAJCQkvLwogCQkJLy8gSG93ZXZlciwgb3VyIGJlaGF2aW9yIG1hdGNoZXMgT3BlblNTTCwgc28gd2UgbGVhawogCQkJLy8gb25seSBhcyBtdWNoIGFzIHRoZXkgZG8uCi0JCWNhc2UgbnVsbENpcGhlcjoKLQkJCWJyZWFrCiAJCWRlZmF1bHQ6CiAJCQlwYW5pYygidW5rbm93biBjaXBoZXIgdHlwZSIpCiAJCX0KQEAgLTQ4Niw3ICs0NjAsNyBAQAogCiAJLy8gbWFjCiAJaWYgaGMubWFjICE9IG5pbCB7Ci0JCW1hYyA6PSBoYy5tYWMuTUFDKGhjLm91dERpZ2VzdEJ1ZiwgaGMub3V0U2VxWzA6XSwgYi5kYXRhWzozXSwgYi5kYXRhW3JlY29yZEhlYWRlckxlbi0yOnJlY29yZEhlYWRlckxlbl0sIGIuZGF0YVtyZWNvcmRIZWFkZXJMZW4rZXhwbGljaXRJVkxlbjpdKQorCQltYWMgOj0gaGMubWFjLk1BQyhoYy5vdXREaWdlc3RCdWYsIGhjLnNlcVswOl0sIGIuZGF0YVs6M10sIGIuZGF0YVtyZWNvcmRIZWFkZXJMZW4tMjpyZWNvcmRIZWFkZXJMZW5dLCBiLmRhdGFbcmVjb3JkSGVhZGVyTGVuK2V4cGxpY2l0SVZMZW46XSkKIAogCQluIDo9IGxlbihiLmRhdGEpCiAJCWIucmVzaXplKG4gKyBsZW4obWFjKSkKQEAgLTUwNCw3ICs0NzgsNyBAQAogCQljYXNlICp0bHNBZWFkOgogCQkJcGF5bG9hZExlbiA6PSBsZW4oYi5kYXRhKSAtIHJlY29yZEhlYWRlckxlbiAtIGV4cGxpY2l0SVZMZW4KIAkJCWIucmVzaXplKGxlbihiLmRhdGEpICsgYy5PdmVyaGVhZCgpKQotCQkJbm9uY2UgOj0gaGMub3V0U2VxWzpdCisJCQlub25jZSA6PSBoYy5zZXFbOl0KIAkJCWlmIGMuZXhwbGljaXROb25jZSB7CiAJCQkJbm9uY2UgPSBiLmRhdGFbcmVjb3JkSGVhZGVyTGVuIDogcmVjb3JkSGVhZGVyTGVuK2V4cGxpY2l0SVZMZW5dCiAJCQl9CkBAIC01MTIsNyArNDg2LDcgQEAKIAkJCXBheWxvYWQgPSBwYXlsb2FkWzpwYXlsb2FkTGVuXQogCiAJCQl2YXIgYWRkaXRpb25hbERhdGEgWzEzXWJ5dGUKLQkJCWNvcHkoYWRkaXRpb25hbERhdGFbOl0sIGhjLm91dFNlcVs6XSkKKwkJCWNvcHkoYWRkaXRpb25hbERhdGFbOl0sIGhjLnNlcVs6XSkKIAkJCWNvcHkoYWRkaXRpb25hbERhdGFbODpdLCBiLmRhdGFbOjNdKQogCQkJYWRkaXRpb25hbERhdGFbMTFdID0gYnl0ZShwYXlsb2FkTGVuID4+IDgpCiAJCQlhZGRpdGlvbmFsRGF0YVsxMl0gPSBieXRlKHBheWxvYWRMZW4pCkBAIC01MjgsOCArNTAyLDYgQEAKIAkJCWIucmVzaXplKHJlY29yZEhlYWRlckxlbiArIGV4cGxpY2l0SVZMZW4gKyBsZW4ocHJlZml4KSArIGxlbihmaW5hbEJsb2NrKSkKIAkJCWMuQ3J5cHRCbG9ja3MoYi5kYXRhW3JlY29yZEhlYWRlckxlbitleHBsaWNpdElWTGVuOl0sIHByZWZpeCkKIAkJCWMuQ3J5cHRCbG9ja3MoYi5kYXRhW3JlY29yZEhlYWRlckxlbitleHBsaWNpdElWTGVuK2xlbihwcmVmaXgpOl0sIGZpbmFsQmxvY2spCi0JCWNhc2UgbnVsbENpcGhlcjoKLQkJCWJyZWFrCiAJCWRlZmF1bHQ6CiAJCQlwYW5pYygidW5rbm93biBjaXBoZXIgdHlwZSIpCiAJCX0KQEAgLTY1OCwxMCArNjMwLDEwIEBACiAJaWYgZXJyIDo9IGIucmVhZEZyb21VbnRpbChjLmNvbm4sIHJlY29yZEhlYWRlckxlbik7IGVyciAhPSBuaWwgewogCQkvLyBSRkMgc3VnZ2VzdHMgdGhhdCBFT0Ygd2l0aG91dCBhbiBhbGVydENsb3NlTm90aWZ5IGlzCiAJCS8vIGFuIGVycm9yLCBidXQgcG9wdWxhciB3ZWIgc2l0ZXMgc2VlbSB0byBkbyB0aGlzLAotCQkvLyBzbyB3ZSBjYW4ndCBtYWtlIGl0IGFuIGVycm9yLCBvdXRzaWRlIG9mIHRlc3RzLgotCQlpZiBlcnIgPT0gaW8uRU9GICYmIGMuY29uZmlnLkJ1Z3MuRXhwZWN0Q2xvc2VOb3RpZnkgewotCQkJZXJyID0gaW8uRXJyVW5leHBlY3RlZEVPRgotCQl9CisJCS8vIHNvIHdlIGNhbid0IG1ha2UgaXQgYW4gZXJyb3IuCisJCS8vIGlmIGVyciA9PSBpby5FT0YgeworCQkvLyAJZXJyID0gaW8uRXJyVW5leHBlY3RlZEVPRgorCQkvLyB9CiAJCWlmIGUsIG9rIDo9IGVyci4obmV0LkVycm9yKTsgIW9rIHx8ICFlLlRlbXBvcmFyeSgpIHsKIAkJCWMuaW4uc2V0RXJyb3JMb2NrZWQoZXJyKQogCQl9CkBAIC03NTAsMTAgKzcyMiw2IEBACiAJCQljLnNlbmRBbGVydChhbGVydEludGVybmFsRXJyb3IpCiAJCQlyZXR1cm4gYy5pbi5zZXRFcnJvckxvY2tlZChlcnJvcnMuTmV3KCJ0bHM6IGFwcGxpY2F0aW9uIGRhdGEgcmVjb3JkIHJlcXVlc3RlZCBiZWZvcmUgaGFuZHNoYWtlIGNvbXBsZXRlIikpCiAJCX0KLQljYXNlIHJlY29yZFR5cGVBbGVydDoKLQkJLy8gTG9va2luZyBmb3IgYSBjbG9zZV9ub3RpZnkuIE5vdGU6IHVubGlrZSBhIHJlYWwKLQkJLy8gaW1wbGVtZW50YXRpb24sIHRoaXMgaXMgbm90IHRvbGVyYW50IG9mIGFkZGl0aW9uYWwgcmVjb3Jkcy4KLQkJLy8gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBFeHBlY3RDbG9zZU5vdGlmeS4KIAl9CiAKIEFnYWluOgpAQCAtODE2LDcgKzc4NCw3IEBACiAJCQkvLyBBIGNsaWVudCBtaWdodCBuZWVkIHRvIHByb2Nlc3MgYSBIZWxsb1JlcXVlc3QgZnJvbQogCQkJLy8gdGhlIHNlcnZlciwgdGh1cyByZWNlaXZpbmcgYSBoYW5kc2hha2UgbWVzc2FnZSB3aGVuCiAJCQkvLyBhcHBsaWNhdGlvbiBkYXRhIGlzIGV4cGVjdGVkIGlzIG9rLgotCQkJaWYgIWMuaXNDbGllbnQgfHwgd2FudCAhPSByZWNvcmRUeXBlQXBwbGljYXRpb25EYXRhIHsKKwkJCWlmICFjLmlzQ2xpZW50IHsKIAkJCQlyZXR1cm4gYy5pbi5zZXRFcnJvckxvY2tlZChjLnNlbmRBbGVydChhbGVydE5vUmVuZWdvdGlhdGlvbikpCiAJCQl9CiAJCX0KQEAgLTgzMSw4ICs3OTksMTMgQEAKIAogLy8gc2VuZEFsZXJ0IHNlbmRzIGEgVExTIGFsZXJ0IG1lc3NhZ2UuCiAvLyBjLm91dC5NdXRleCA8PSBMLgotZnVuYyAoYyAqQ29ubikgc2VuZEFsZXJ0TG9ja2VkKGxldmVsIGJ5dGUsIGVyciBhbGVydCkgZXJyb3IgewotCWMudG1wWzBdID0gbGV2ZWwKK2Z1bmMgKGMgKkNvbm4pIHNlbmRBbGVydExvY2tlZChlcnIgYWxlcnQpIGVycm9yIHsKKwlzd2l0Y2ggZXJyIHsKKwljYXNlIGFsZXJ0Tm9SZW5lZ290aWF0aW9uLCBhbGVydENsb3NlTm90aWZ5OgorCQljLnRtcFswXSA9IGFsZXJ0TGV2ZWxXYXJuaW5nCisJZGVmYXVsdDoKKwkJYy50bXBbMF0gPSBhbGVydExldmVsRXJyb3IKKwl9CiAJYy50bXBbMV0gPSBieXRlKGVycikKIAlpZiBjLmNvbmZpZy5CdWdzLkZyYWdtZW50QWxlcnQgewogCQljLndyaXRlUmVjb3JkKHJlY29yZFR5cGVBbGVydCwgYy50bXBbMDoxXSkKQEAgLTg0MCw4ICs4MTMsOCBAQAogCX0gZWxzZSB7CiAJCWMud3JpdGVSZWNvcmQocmVjb3JkVHlwZUFsZXJ0LCBjLnRtcFswOjJdKQogCX0KLQkvLyBFcnJvciBhbGVydHMgYXJlIGZhdGFsIHRvIHRoZSBjb25uZWN0aW9uLgotCWlmIGxldmVsID09IGFsZXJ0TGV2ZWxFcnJvciB7CisJLy8gY2xvc2VOb3RpZnkgaXMgYSBzcGVjaWFsIGNhc2UgaW4gdGhhdCBpdCBpc24ndCBhbiBlcnJvcjoKKwlpZiBlcnIgIT0gYWxlcnRDbG9zZU5vdGlmeSB7CiAJCXJldHVybiBjLm91dC5zZXRFcnJvckxvY2tlZCgmbmV0Lk9wRXJyb3J7T3A6ICJsb2NhbCBlcnJvciIsIEVycjogZXJyfSkKIAl9CiAJcmV0dXJuIG5pbApAQCAtODUwLDE3ICs4MjMsOSBAQAogLy8gc2VuZEFsZXJ0IHNlbmRzIGEgVExTIGFsZXJ0IG1lc3NhZ2UuCiAvLyBMIDwgYy5vdXQuTXV0ZXguCiBmdW5jIChjICpDb25uKSBzZW5kQWxlcnQoZXJyIGFsZXJ0KSBlcnJvciB7Ci0JbGV2ZWwgOj0gYnl0ZShhbGVydExldmVsRXJyb3IpCi0JaWYgZXJyID09IGFsZXJ0Tm9SZW5lZ290aWF0aW9uIHx8IGVyciA9PSBhbGVydENsb3NlTm90aWZ5IHsKLQkJbGV2ZWwgPSBhbGVydExldmVsV2FybmluZwotCX0KLQlyZXR1cm4gYy5TZW5kQWxlcnQobGV2ZWwsIGVycikKLX0KLQotZnVuYyAoYyAqQ29ubikgU2VuZEFsZXJ0KGxldmVsIGJ5dGUsIGVyciBhbGVydCkgZXJyb3IgewogCWMub3V0LkxvY2soKQogCWRlZmVyIGMub3V0LlVubG9jaygpCi0JcmV0dXJuIGMuc2VuZEFsZXJ0TG9ja2VkKGxldmVsLCBlcnIpCisJcmV0dXJuIGMuc2VuZEFsZXJ0TG9ja2VkKGVycikKIH0KIAogLy8gd3JpdGVWMlJlY29yZCB3cml0ZXMgYSByZWNvcmQgZm9yIGEgVjJDbGllbnRIZWxsby4KQEAgLTg3Niw2ICs4NDEsMTMgQEAKIC8vIHRvIHRoZSBjb25uZWN0aW9uIGFuZCB1cGRhdGVzIHRoZSByZWNvcmQgbGF5ZXIgc3RhdGUuCiAvLyBjLm91dC5NdXRleCA8PSBMLgogZnVuYyAoYyAqQ29ubikgd3JpdGVSZWNvcmQodHlwIHJlY29yZFR5cGUsIGRhdGEgW11ieXRlKSAobiBpbnQsIGVyciBlcnJvcikgeworCWlmIHR5cCAhPSByZWNvcmRUeXBlQWxlcnQgJiYgYy5jb25maWcuQnVncy5TZW5kV2FybmluZ0FsZXJ0cyAhPSAwIHsKKwkJYWxlcnQgOj0gbWFrZShbXWJ5dGUsIDIpCisJCWFsZXJ0WzBdID0gYWxlcnRMZXZlbFdhcm5pbmcKKwkJYWxlcnRbMV0gPSBieXRlKGMuY29uZmlnLkJ1Z3MuU2VuZFdhcm5pbmdBbGVydHMpCisJCWMud3JpdGVSZWNvcmQocmVjb3JkVHlwZUFsZXJ0LCBhbGVydCkKKwl9CisKIAlpZiBjLmlzRFRMUyB7CiAJCXJldHVybiBjLmR0bHNXcml0ZVJlY29yZCh0eXAsIGRhdGEpCiAJfQpAQCAtODg0LDkgKzg1Niw5IEBACiAJYiA6PSBjLm91dC5uZXdCbG9jaygpCiAJZmlyc3QgOj0gdHJ1ZQogCWlzQ2xpZW50SGVsbG8gOj0gdHlwID09IHJlY29yZFR5cGVIYW5kc2hha2UgJiYgbGVuKGRhdGEpID4gMCAmJiBkYXRhWzBdID09IHR5cGVDbGllbnRIZWxsbwotCWZvciBsZW4oZGF0YSkgPiAwIHx8IGZpcnN0IHsKKwlmb3IgbGVuKGRhdGEpID4gMCB7CiAJCW0gOj0gbGVuKGRhdGEpCi0JCWlmIG0gPiBtYXhQbGFpbnRleHQgJiYgIWMuY29uZmlnLkJ1Z3MuU2VuZExhcmdlUmVjb3JkcyB7CisJCWlmIG0gPiBtYXhQbGFpbnRleHQgewogCQkJbSA9IG1heFBsYWludGV4dAogCQl9CiAJCWlmIHR5cCA9PSByZWNvcmRUeXBlSGFuZHNoYWtlICYmIGMuY29uZmlnLkJ1Z3MuTWF4SGFuZHNoYWtlUmVjb3JkTGVuZ3RoID4gMCAmJiBtID4gYy5jb25maWcuQnVncy5NYXhIYW5kc2hha2VSZWNvcmRMZW5ndGggewpAQCAtMTA2Niw5ICsxMDM4LDYgQEAKIC8vIHNlcXVlbmNlIG51bWJlciBleHBlY3RhdGlvbnMgYnV0IG90aGVyd2lzZSBpZ25vcmVzIHRoZW0uCiBmdW5jIChjICpDb25uKSBza2lwUGFja2V0KHBhY2tldCBbXWJ5dGUpIGVycm9yIHsKIAlmb3IgbGVuKHBhY2tldCkgPiAwIHsKLQkJaWYgbGVuKHBhY2tldCkgPCAxMyB7Ci0JCQlyZXR1cm4gZXJyb3JzLk5ldygidGxzOiBiYWQgcGFja2V0IikKLQkJfQogCQkvLyBEcm9wcGVkIHBhY2tldHMgYXJlIGNvbXBsZXRlbHkgaWdub3JlZCBzYXZlIHRvIHVwZGF0ZQogCQkvLyBleHBlY3RlZCBzZXF1ZW5jZSBudW1iZXJzIGZvciB0aGlzIGFuZCB0aGUgbmV4dCBlcG9jaC4gKFdlCiAJCS8vIGRvbid0IGFzc2VydCBvbiB0aGUgY29udGVudHMgb2YgdGhlIHBhY2tldHMgYm90aCBmb3IKQEAgLTEwODgsOSArMTA1Nyw2IEBACiAJCQl9CiAJCQljLmluLmluY05leHRTZXEoKQogCQl9Ci0JCWlmIGxlbihwYWNrZXQpIDwgMTMraW50KGxlbmd0aCkgewotCQkJcmV0dXJuIGVycm9ycy5OZXcoInRsczogYmFkIHBhY2tldCIpCi0JCX0KIAkJcGFja2V0ID0gcGFja2V0WzEzK2xlbmd0aDpdCiAJfQogCXJldHVybiBuaWwKQEAgLTExNDcsNyArMTExMyw3IEBACiAJfQogCiAJaWYgYy5jb25maWcuQnVncy5TZW5kU3B1cmlvdXNBbGVydCAhPSAwIHsKLQkJYy5zZW5kQWxlcnRMb2NrZWQoYWxlcnRMZXZlbEVycm9yLCBjLmNvbmZpZy5CdWdzLlNlbmRTcHVyaW91c0FsZXJ0KQorCQljLnNlbmRBbGVydExvY2tlZChjLmNvbmZpZy5CdWdzLlNlbmRTcHVyaW91c0FsZXJ0KQogCX0KIAogCS8vIFNTTCAzLjAgYW5kIFRMUyAxLjAgYXJlIHN1c2NlcHRpYmxlIHRvIGEgY2hvc2VuLXBsYWludGV4dApAQCAtMTI3NCwyMiArMTI0MCwxMCBAQAogCiAJYy5oYW5kc2hha2VNdXRleC5Mb2NrKCkKIAlkZWZlciBjLmhhbmRzaGFrZU11dGV4LlVubG9jaygpCi0JaWYgYy5oYW5kc2hha2VDb21wbGV0ZSAmJiAhYy5jb25maWcuQnVncy5Ob0Nsb3NlTm90aWZ5IHsKKwlpZiBjLmhhbmRzaGFrZUNvbXBsZXRlIHsKIAkJYWxlcnRFcnIgPSBjLnNlbmRBbGVydChhbGVydENsb3NlTm90aWZ5KQogCX0KIAotCS8vIENvbnN1bWUgYSBjbG9zZV9ub3RpZnkgZnJvbSB0aGUgcGVlciBpZiBvbmUgaGFzbid0IGJlZW4gcmVjZWl2ZWQKLQkvLyBhbHJlYWR5LiBUaGlzIGF2b2lkcyB0aGUgcGVlciBmcm9tIGZhaWxpbmcgfFNTTF9zaHV0ZG93bnwgZHVlIHRvIGEKLQkvLyB3cml0ZSBmYWlsaW5nLgotCWlmIGMuaGFuZHNoYWtlQ29tcGxldGUgJiYgYWxlcnRFcnIgPT0gbmlsICYmIGMuY29uZmlnLkJ1Z3MuRXhwZWN0Q2xvc2VOb3RpZnkgewotCQlmb3IgYy5pbi5lcnJvcigpID09IG5pbCB7Ci0JCQljLnJlYWRSZWNvcmQocmVjb3JkVHlwZUFsZXJ0KQotCQl9Ci0JCWlmIGMuaW4uZXJyb3IoKSAhPSBpby5FT0YgewotCQkJYWxlcnRFcnIgPSBjLmluLmVycm9yKCkKLQkJfQotCX0KLQogCWlmIGVyciA6PSBjLmNvbm4uQ2xvc2UoKTsgZXJyICE9IG5pbCB7CiAJCXJldHVybiBlcnIKIAl9CkBAIC0xMzE5LDkgKzEyNzMsNiBAQAogCQl9KQogCQljLmNvbm4uV3JpdGUoW11ieXRle2FsZXJ0TGV2ZWxFcnJvciwgYnl0ZShhbGVydEludGVybmFsRXJyb3IpfSkKIAl9Ci0JaWYgZGF0YSA6PSBjLmNvbmZpZy5CdWdzLkFwcERhdGFCZWZvcmVIYW5kc2hha2U7IGRhdGEgIT0gbmlsIHsKLQkJYy53cml0ZVJlY29yZChyZWNvcmRUeXBlQXBwbGljYXRpb25EYXRhLCBkYXRhKQotCX0KIAlpZiBjLmlzQ2xpZW50IHsKIAkJYy5oYW5kc2hha2VFcnIgPSBjLmNsaWVudEhhbmRzaGFrZSgpCiAJfSBlbHNlIHsKQEAgLTEzNTMsOCArMTMwNCw2IEBACiAJCXN0YXRlLkNoYW5uZWxJRCA9IGMuY2hhbm5lbElECiAJCXN0YXRlLlNSVFBQcm90ZWN0aW9uUHJvZmlsZSA9IGMuc3J0cFByb3RlY3Rpb25Qcm9maWxlCiAJCXN0YXRlLlRMU1VuaXF1ZSA9IGMuZmlyc3RGaW5pc2hlZFs6XQotCQlzdGF0ZS5TQ1RMaXN0ID0gYy5zY3RMaXN0Ci0JCXN0YXRlLkNsaWVudENlcnRTaWduYXR1cmVIYXNoID0gYy5jbGllbnRDZXJ0U2lnbmF0dXJlSGFzaAogCX0KIAogCXJldHVybiBzdGF0ZQpkaWZmIC0tZ2l0IGEvc3JjL3NzbC90ZXN0L3J1bm5lci9kdGxzLmdvIGIvc3JjL3NzbC90ZXN0L3J1bm5lci9kdGxzLmdvCmluZGV4IDVjNTlkZWEuLjUwZjc3ODYgMTAwNjQ0Ci0tLSBhL3NyYy9zc2wvdGVzdC9ydW5uZXIvZHRscy5nbworKysgYi9zcmMvc3NsL3Rlc3QvcnVubmVyL2R0bHMuZ28KQEAgLTIxNiwxMCArMjE2LDEzIEBACiAJLy8gUGFjayBoYW5kc2hha2UgZnJhZ21lbnRzIGludG8gcmVjb3Jkcy4KIAl2YXIgcmVjb3JkcyBbXVtdYnl0ZQogCWZvciBfLCBmcmFnbWVudCA6PSByYW5nZSBmcmFnbWVudHMgewotCQlpZiBuIDo9IGMuY29uZmlnLkJ1Z3MuU3BsaXRGcmFnbWVudHM7IG4gPiAwIHsKLQkJCWlmIGxlbihmcmFnbWVudCkgPiBuIHsKLQkJCQlyZWNvcmRzID0gYXBwZW5kKHJlY29yZHMsIGZyYWdtZW50WzpuXSkKLQkJCQlyZWNvcmRzID0gYXBwZW5kKHJlY29yZHMsIGZyYWdtZW50W246XSkKKwkJaWYgYy5jb25maWcuQnVncy5TcGxpdEZyYWdtZW50SGVhZGVyIHsKKwkJCXJlY29yZHMgPSBhcHBlbmQocmVjb3JkcywgZnJhZ21lbnRbOjJdKQorCQkJcmVjb3JkcyA9IGFwcGVuZChyZWNvcmRzLCBmcmFnbWVudFsyOl0pCisJCX0gZWxzZSBpZiBjLmNvbmZpZy5CdWdzLlNwbGl0RnJhZ21lbnRCb2R5IHsKKwkJCWlmIGxlbihmcmFnbWVudCkgPiAxMiB7CisJCQkJcmVjb3JkcyA9IGFwcGVuZChyZWNvcmRzLCBmcmFnbWVudFs6MTNdKQorCQkJCXJlY29yZHMgPSBhcHBlbmQocmVjb3JkcywgZnJhZ21lbnRbMTM6XSkKIAkJCX0gZWxzZSB7CiAJCQkJcmVjb3JkcyA9IGFwcGVuZChyZWNvcmRzLCBmcmFnbWVudCkKIAkJCX0KQEAgLTI5OCwxMyArMzAxLDEzIEBACiAJYi5kYXRhWzFdID0gYnl0ZSh2ZXJzID4+IDgpCiAJYi5kYXRhWzJdID0gYnl0ZSh2ZXJzKQogCS8vIERUTFMgcmVjb3JkcyBpbmNsdWRlIGFuIGV4cGxpY2l0IHNlcXVlbmNlIG51bWJlci4KLQljb3B5KGIuZGF0YVszOjExXSwgYy5vdXQub3V0U2VxWzA6XSkKKwljb3B5KGIuZGF0YVszOjExXSwgYy5vdXQuc2VxWzA6XSkKIAliLmRhdGFbMTFdID0gYnl0ZShsZW4oZGF0YSkgPj4gOCkKIAliLmRhdGFbMTJdID0gYnl0ZShsZW4oZGF0YSkpCiAJaWYgZXhwbGljaXRJVkxlbiA+IDAgewogCQlleHBsaWNpdElWIDo9IGIuZGF0YVtyZWNvcmRIZWFkZXJMZW4gOiByZWNvcmRIZWFkZXJMZW4rZXhwbGljaXRJVkxlbl0KIAkJaWYgZXhwbGljaXRJVklzU2VxIHsKLQkJCWNvcHkoZXhwbGljaXRJViwgYy5vdXQub3V0U2VxWzpdKQorCQkJY29weShleHBsaWNpdElWLCBjLm91dC5zZXFbOl0pCiAJCX0gZWxzZSB7CiAJCQlpZiBfLCBlcnIgPSBpby5SZWFkRnVsbChjLmNvbmZpZy5yYW5kKCksIGV4cGxpY2l0SVYpOyBlcnIgIT0gbmlsIHsKIAkJCQlyZXR1cm4KZGlmZiAtLWdpdCBhL3NyYy9zc2wvdGVzdC9ydW5uZXIvaGFuZHNoYWtlX2NsaWVudC5nbyBiL3NyYy9zc2wvdGVzdC9ydW5uZXIvaGFuZHNoYWtlX2NsaWVudC5nbwppbmRleCBhM2NlNjg2Li5hOTUwMzEzIDEwMDY0NAotLS0gYS9zcmMvc3NsL3Rlc3QvcnVubmVyL2hhbmRzaGFrZV9jbGllbnQuZ28KKysrIGIvc3JjL3NzbC90ZXN0L3J1bm5lci9oYW5kc2hha2VfY2xpZW50LmdvCkBAIC00NSw3ICs0NSw3IEBACiAKIAluZXh0UHJvdG9zTGVuZ3RoIDo9IDAKIAlmb3IgXywgcHJvdG8gOj0gcmFuZ2UgYy5jb25maWcuTmV4dFByb3RvcyB7Ci0JCWlmIGwgOj0gbGVuKHByb3RvKTsgbCA+IDI1NSB7CisJCWlmIGwgOj0gbGVuKHByb3RvKTsgbCA9PSAwIHx8IGwgPiAyNTUgewogCQkJcmV0dXJuIGVycm9ycy5OZXcoInRsczogaW52YWxpZCBOZXh0UHJvdG9zIHZhbHVlIikKIAkJfSBlbHNlIHsKIAkJCW5leHRQcm90b3NMZW5ndGggKz0gMSArIGwKQEAgLTYxLDcgKzYxLDYgQEAKIAkJY29tcHJlc3Npb25NZXRob2RzOiAgICAgIFtddWludDh7Y29tcHJlc3Npb25Ob25lfSwKIAkJcmFuZG9tOiAgICAgICAgICAgICAgICAgIG1ha2UoW11ieXRlLCAzMiksCiAJCW9jc3BTdGFwbGluZzogICAgICAgICAgICB0cnVlLAotCQlzY3RMaXN0U3VwcG9ydGVkOiAgICAgICAgdHJ1ZSwKIAkJc2VydmVyTmFtZTogICAgICAgICAgICAgIGMuY29uZmlnLlNlcnZlck5hbWUsCiAJCXN1cHBvcnRlZEN1cnZlczogICAgICAgICBjLmNvbmZpZy5jdXJ2ZVByZWZlcmVuY2VzKCksCiAJCXN1cHBvcnRlZFBvaW50czogICAgICAgICBbXXVpbnQ4e3BvaW50Rm9ybWF0VW5jb21wcmVzc2VkfSwKQEAgLTc0LDcgKzczLDYgQEAKIAkJZXh0ZW5kZWRNYXN0ZXJTZWNyZXQ6ICAgIGMuY29uZmlnLm1heFZlcnNpb24oKSA+PSBWZXJzaW9uVExTMTAsCiAJCXNydHBQcm90ZWN0aW9uUHJvZmlsZXM6ICBjLmNvbmZpZy5TUlRQUHJvdGVjdGlvblByb2ZpbGVzLAogCQlzcnRwTWFzdGVyS2V5SWRlbnRpZmllcjogYy5jb25maWcuQnVncy5TUlRQTWFzdGVyS2V5SWRlbnRpZmVyLAotCQljdXN0b21FeHRlbnNpb246ICAgICAgICAgYy5jb25maWcuQnVncy5DdXN0b21FeHRlbnNpb24sCiAJfQogCiAJaWYgYy5jb25maWcuQnVncy5TZW5kQ2xpZW50VmVyc2lvbiAhPSAwIHsKQEAgLTEyNSwxMCArMTIzLDYgQEAKIAkJfQogCX0KIAotCWlmIGMuY29uZmlnLkJ1Z3MuU2VuZFJlbmVnb3RpYXRpb25TQ1NWIHsKLQkJaGVsbG8uY2lwaGVyU3VpdGVzID0gYXBwZW5kKGhlbGxvLmNpcGhlclN1aXRlcywgcmVuZWdvdGlhdGlvblNDU1YpCi0JfQotCiAJaWYgYy5jb25maWcuQnVncy5TZW5kRmFsbGJhY2tTQ1NWIHsKIAkJaGVsbG8uY2lwaGVyU3VpdGVzID0gYXBwZW5kKGhlbGxvLmNpcGhlclN1aXRlcywgZmFsbGJhY2tTQ1NWKQogCX0KQEAgLTI3OCwxMCArMjcyLDYgQEAKIAkJcmV0dXJuIGZtdC5FcnJvcmYoInRsczogc2VydmVyIHNlbGVjdGVkIGFuIHVuc3VwcG9ydGVkIGNpcGhlciBzdWl0ZSIpCiAJfQogCi0JaWYgYy5jb25maWcuQnVncy5SZXF1aXJlUmVuZWdvdGlhdGlvbkluZm8gJiYgc2VydmVySGVsbG8uc2VjdXJlUmVuZWdvdGlhdGlvbiA9PSBuaWwgewotCQlyZXR1cm4gZXJyb3JzLk5ldygidGxzOiByZW5lZ290aWF0aW9uIGV4dGVuc2lvbiBtaXNzaW5nIikKLQl9Ci0KIAlpZiBsZW4oYy5jbGllbnRWZXJpZnkpID4gMCAmJiAhYy5jb25maWcuQnVncy5Ob1JlbmVnb3RpYXRpb25JbmZvIHsKIAkJdmFyIGV4cGVjdGVkUmVuZWdJbmZvIFtdYnl0ZQogCQlleHBlY3RlZFJlbmVnSW5mbyA9IGFwcGVuZChleHBlY3RlZFJlbmVnSW5mbywgYy5jbGllbnRWZXJpZnkuLi4pCkBAIC0yOTIsMTIgKzI4Miw2IEBACiAJCX0KIAl9CiAKLQlpZiBleHBlY3RlZCA6PSBjLmNvbmZpZy5CdWdzLkV4cGVjdGVkQ3VzdG9tRXh0ZW5zaW9uOyBleHBlY3RlZCAhPSBuaWwgewotCQlpZiBzZXJ2ZXJIZWxsby5jdXN0b21FeHRlbnNpb24gIT0gKmV4cGVjdGVkIHsKLQkJCXJldHVybiBmbXQuRXJyb3JmKCJ0bHM6IGJhZCBjdXN0b20gZXh0ZW5zaW9uIGNvbnRlbnRzICVxIiwgc2VydmVySGVsbG8uY3VzdG9tRXh0ZW5zaW9uKQotCQl9Ci0JfQotCiAJaHMgOj0gJmNsaWVudEhhbmRzaGFrZVN0YXRlewogCQljOiAgICAgICAgICAgIGMsCiAJCXNlcnZlckhlbGxvOiAgc2VydmVySGVsbG8sCkBAIC0zNzIsNyArMzU2LDYgQEAKIAljb3B5KGMuY2xpZW50UmFuZG9tWzpdLCBocy5oZWxsby5yYW5kb20pCiAJY29weShjLnNlcnZlclJhbmRvbVs6XSwgaHMuc2VydmVySGVsbG8ucmFuZG9tKQogCWNvcHkoYy5tYXN0ZXJTZWNyZXRbOl0sIGhzLm1hc3RlclNlY3JldCkKLQogCXJldHVybiBuaWwKIH0KIApAQCAtNjI0LDkgKzYwNyw2IEBACiAJCQljLnNlbmRBbGVydChhbGVydEludGVybmFsRXJyb3IpCiAJCQlyZXR1cm4gZXJyCiAJCX0KLQkJaWYgYy5jb25maWcuQnVncy5JbnZhbGlkQ2VydFZlcmlmeVNpZ25hdHVyZSB7Ci0JCQlkaWdlc3RbMF0gXj0gMHg4MAotCQl9CiAKIAkJc3dpdGNoIGtleSA6PSBjLmNvbmZpZy5DZXJ0aWZpY2F0ZXNbMF0uUHJpdmF0ZUtleS4odHlwZSkgewogCQljYXNlICplY2RzYS5Qcml2YXRlS2V5OgpAQCAtNzUwLDI4ICs3MzAsMTMgQEAKIAkJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygidGxzOiBzZXJ2ZXIgcmVzdW1lZCBzZXNzaW9uIG9uIHJlbmVnb3RpYXRpb24iKQogCQl9CiAKLQkJaWYgaHMuc2VydmVySGVsbG8uc2N0TGlzdCAhPSBuaWwgewotCQkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJ0bHM6IHNlcnZlciBzZW50IFNDVCBleHRlbnNpb24gb24gc2Vzc2lvbiByZXN1bXB0aW9uIikKLQkJfQotCi0JCWlmIGhzLnNlcnZlckhlbGxvLm9jc3BTdGFwbGluZyB7Ci0JCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoInRsczogc2VydmVyIHNlbnQgT0NTUCBleHRlbnNpb24gb24gc2Vzc2lvbiByZXN1bXB0aW9uIikKLQkJfQotCiAJCS8vIFJlc3RvcmUgbWFzdGVyU2VjcmV0IGFuZCBwZWVyQ2VydHMgZnJvbSBwcmV2aW91cyBzdGF0ZQogCQlocy5tYXN0ZXJTZWNyZXQgPSBocy5zZXNzaW9uLm1hc3RlclNlY3JldAogCQljLnBlZXJDZXJ0aWZpY2F0ZXMgPSBocy5zZXNzaW9uLnNlcnZlckNlcnRpZmljYXRlcwogCQljLmV4dGVuZGVkTWFzdGVyU2VjcmV0ID0gaHMuc2Vzc2lvbi5leHRlbmRlZE1hc3RlclNlY3JldAotCQljLnNjdExpc3QgPSBocy5zZXNzaW9uLnNjdExpc3QKLQkJYy5vY3NwUmVzcG9uc2UgPSBocy5zZXNzaW9uLm9jc3BSZXNwb25zZQogCQlocy5maW5pc2hlZEhhc2guZGlzY2FyZEhhbmRzaGFrZUJ1ZmZlcigpCiAJCXJldHVybiB0cnVlLCBuaWwKIAl9Ci0KLQlpZiBocy5zZXJ2ZXJIZWxsby5zY3RMaXN0ICE9IG5pbCB7Ci0JCWMuc2N0TGlzdCA9IGhzLnNlcnZlckhlbGxvLnNjdExpc3QKLQl9Ci0KIAlyZXR1cm4gZmFsc2UsIG5pbAogfQogCkBAIC04MTgsMTQgKzc4Myw5IEBACiAJCW1hc3RlclNlY3JldDogICAgICAgaHMubWFzdGVyU2VjcmV0LAogCQloYW5kc2hha2VIYXNoOiAgICAgIGhzLmZpbmlzaGVkSGFzaC5zZXJ2ZXIuU3VtKG5pbCksCiAJCXNlcnZlckNlcnRpZmljYXRlczogYy5wZWVyQ2VydGlmaWNhdGVzLAotCQlzY3RMaXN0OiAgICAgICAgICAgIGMuc2N0TGlzdCwKLQkJb2NzcFJlc3BvbnNlOiAgICAgICBjLm9jc3BSZXNwb25zZSwKIAl9CiAKIAlpZiAhaHMuc2VydmVySGVsbG8udGlja2V0U3VwcG9ydGVkIHsKLQkJaWYgYy5jb25maWcuQnVncy5FeHBlY3ROZXdUaWNrZXQgewotCQkJcmV0dXJuIGVycm9ycy5OZXcoInRsczogZXhwZWN0ZWQgbmV3IHRpY2tldCIpCi0JCX0KIAkJaWYgaHMuc2Vzc2lvbiA9PSBuaWwgJiYgbGVuKGhzLnNlcnZlckhlbGxvLnNlc3Npb25JZCkgPiAwIHsKIAkJCXNlc3Npb24uc2Vzc2lvbklkID0gaHMuc2VydmVySGVsbG8uc2Vzc2lvbklkCiAJCQlocy5zZXNzaW9uID0gc2Vzc2lvbgpkaWZmIC0tZ2l0IGEvc3JjL3NzbC90ZXN0L3J1bm5lci9oYW5kc2hha2VfbWVzc2FnZXMuZ28gYi9zcmMvc3NsL3Rlc3QvcnVubmVyL2hhbmRzaGFrZV9tZXNzYWdlcy5nbwppbmRleCBkYTg1ZTdhLi5jZTIxNGZkIDEwMDY0NAotLS0gYS9zcmMvc3NsL3Rlc3QvcnVubmVyL2hhbmRzaGFrZV9tZXNzYWdlcy5nbworKysgYi9zcmMvc3NsL3Rlc3QvcnVubmVyL2hhbmRzaGFrZV9tZXNzYWdlcy5nbwpAQCAtMzIsNyArMzIsNiBAQAogCXNydHBQcm90ZWN0aW9uUHJvZmlsZXMgIFtddWludDE2CiAJc3J0cE1hc3RlcktleUlkZW50aWZpZXIgc3RyaW5nCiAJc2N0TGlzdFN1cHBvcnRlZCAgICAgICAgYm9vbAotCWN1c3RvbUV4dGVuc2lvbiAgICAgICAgIHN0cmluZwogfQogCiBmdW5jIChtICpjbGllbnRIZWxsb01zZykgZXF1YWwoaSBpbnRlcmZhY2V7fSkgYm9vbCB7CkBAIC02Niw4ICs2NSw3IEBACiAJCW0uZXh0ZW5kZWRNYXN0ZXJTZWNyZXQgPT0gbTEuZXh0ZW5kZWRNYXN0ZXJTZWNyZXQgJiYKIAkJZXFVaW50MTZzKG0uc3J0cFByb3RlY3Rpb25Qcm9maWxlcywgbTEuc3J0cFByb3RlY3Rpb25Qcm9maWxlcykgJiYKIAkJbS5zcnRwTWFzdGVyS2V5SWRlbnRpZmllciA9PSBtMS5zcnRwTWFzdGVyS2V5SWRlbnRpZmllciAmJgotCQltLnNjdExpc3RTdXBwb3J0ZWQgPT0gbTEuc2N0TGlzdFN1cHBvcnRlZCAmJgotCQltLmN1c3RvbUV4dGVuc2lvbiA9PSBtMS5jdXN0b21FeHRlbnNpb24KKwkJbS5zY3RMaXN0U3VwcG9ydGVkID09IG0xLnNjdExpc3RTdXBwb3J0ZWQKIH0KIAogZnVuYyAobSAqY2xpZW50SGVsbG9Nc2cpIG1hcnNoYWwoKSBbXWJ5dGUgewpAQCAtMTIxLDcgKzExOSw3IEBACiAJaWYgbGVuKG0uYWxwblByb3RvY29scykgPiAwIHsKIAkJZXh0ZW5zaW9uc0xlbmd0aCArPSAyCiAJCWZvciBfLCBzIDo9IHJhbmdlIG0uYWxwblByb3RvY29scyB7Ci0JCQlpZiBsIDo9IGxlbihzKTsgbCA+IDI1NSB7CisJCQlpZiBsIDo9IGxlbihzKTsgbCA9PSAwIHx8IGwgPiAyNTUgewogCQkJCXBhbmljKCJpbnZhbGlkIEFMUE4gcHJvdG9jb2wiKQogCQkJfQogCQkJZXh0ZW5zaW9uc0xlbmd0aCsrCkBAIC0xNDAsMTAgKzEzOCw2IEBACiAJaWYgbS5zY3RMaXN0U3VwcG9ydGVkIHsKIAkJbnVtRXh0ZW5zaW9ucysrCiAJfQotCWlmIGwgOj0gbGVuKG0uY3VzdG9tRXh0ZW5zaW9uKTsgbCA+IDAgewotCQlleHRlbnNpb25zTGVuZ3RoICs9IGwKLQkJbnVtRXh0ZW5zaW9ucysrCi0JfQogCWlmIG51bUV4dGVuc2lvbnMgPiAwIHsKIAkJZXh0ZW5zaW9uc0xlbmd0aCArPSA0ICogbnVtRXh0ZW5zaW9ucwogCQlsZW5ndGggKz0gMiArIGV4dGVuc2lvbnNMZW5ndGgKQEAgLTM4MiwxNCArMzc2LDYgQEAKIAkJelsxXSA9IGJ5dGUoZXh0ZW5zaW9uU2lnbmVkQ2VydGlmaWNhdGVUaW1lc3RhbXAgJiAweGZmKQogCQl6ID0gels0Ol0KIAl9Ci0JaWYgbCA6PSBsZW4obS5jdXN0b21FeHRlbnNpb24pOyBsID4gMCB7Ci0JCXpbMF0gPSBieXRlKGV4dGVuc2lvbkN1c3RvbSA+PiA4KQotCQl6WzFdID0gYnl0ZShleHRlbnNpb25DdXN0b20gJiAweGZmKQotCQl6WzJdID0gYnl0ZShsID4+IDgpCi0JCXpbM10gPSBieXRlKGwgJiAweGZmKQotCQljb3B5KHpbNDpdLCBbXWJ5dGUobS5jdXN0b21FeHRlbnNpb24pKQotCQl6ID0gels0K2w6XQotCX0KIAogCW0ucmF3ID0geAogCkBAIC00NTcsNyArNDQzLDYgQEAKIAltLnNpZ25hdHVyZUFuZEhhc2hlcyA9IG5pbAogCW0uYWxwblByb3RvY29scyA9IG5pbAogCW0uZXh0ZW5kZWRNYXN0ZXJTZWNyZXQgPSBmYWxzZQotCW0uY3VzdG9tRXh0ZW5zaW9uID0gIiIKIAogCWlmIGxlbihkYXRhKSA9PSAwIHsKIAkJLy8gQ2xpZW50SGVsbG8gaXMgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBleHRlbnNpb24gZGF0YQpAQCAtNjE5LDggKzYwNCw2IEBACiAJCQkJcmV0dXJuIGZhbHNlCiAJCQl9CiAJCQltLnNjdExpc3RTdXBwb3J0ZWQgPSB0cnVlCi0JCWNhc2UgZXh0ZW5zaW9uQ3VzdG9tOgotCQkJbS5jdXN0b21FeHRlbnNpb24gPSBzdHJpbmcoZGF0YVs6bGVuZ3RoXSkKIAkJfQogCQlkYXRhID0gZGF0YVtsZW5ndGg6XQogCX0KQEAgLTY0MiwxNSArNjI1LDQwIEBACiAJdGlja2V0U3VwcG9ydGVkICAgICAgICAgYm9vbAogCXNlY3VyZVJlbmVnb3RpYXRpb24gICAgIFtdYnl0ZQogCWFscG5Qcm90b2NvbCAgICAgICAgICAgIHN0cmluZwotCWFscG5Qcm90b2NvbEVtcHR5ICAgICAgIGJvb2wKIAlkdXBsaWNhdGVFeHRlbnNpb24gICAgICBib29sCiAJY2hhbm5lbElEUmVxdWVzdGVkICAgICAgYm9vbAogCWV4dGVuZGVkTWFzdGVyU2VjcmV0ICAgIGJvb2wKIAlzcnRwUHJvdGVjdGlvblByb2ZpbGUgICB1aW50MTYKIAlzcnRwTWFzdGVyS2V5SWRlbnRpZmllciBzdHJpbmcKIAlzY3RMaXN0ICAgICAgICAgICAgICAgICBbXWJ5dGUKLQljdXN0b21FeHRlbnNpb24gICAgICAgICBzdHJpbmcKLQlucG5MYXN0ICAgICAgICAgICAgICAgICBib29sCit9CisKK2Z1bmMgKG0gKnNlcnZlckhlbGxvTXNnKSBlcXVhbChpIGludGVyZmFjZXt9KSBib29sIHsKKwltMSwgb2sgOj0gaS4oKnNlcnZlckhlbGxvTXNnKQorCWlmICFvayB7CisJCXJldHVybiBmYWxzZQorCX0KKworCXJldHVybiBieXRlcy5FcXVhbChtLnJhdywgbTEucmF3KSAmJgorCQltLmlzRFRMUyA9PSBtMS5pc0RUTFMgJiYKKwkJbS52ZXJzID09IG0xLnZlcnMgJiYKKwkJYnl0ZXMuRXF1YWwobS5yYW5kb20sIG0xLnJhbmRvbSkgJiYKKwkJYnl0ZXMuRXF1YWwobS5zZXNzaW9uSWQsIG0xLnNlc3Npb25JZCkgJiYKKwkJbS5jaXBoZXJTdWl0ZSA9PSBtMS5jaXBoZXJTdWl0ZSAmJgorCQltLmNvbXByZXNzaW9uTWV0aG9kID09IG0xLmNvbXByZXNzaW9uTWV0aG9kICYmCisJCW0ubmV4dFByb3RvTmVnID09IG0xLm5leHRQcm90b05lZyAmJgorCQllcVN0cmluZ3MobS5uZXh0UHJvdG9zLCBtMS5uZXh0UHJvdG9zKSAmJgorCQltLm9jc3BTdGFwbGluZyA9PSBtMS5vY3NwU3RhcGxpbmcgJiYKKwkJbS50aWNrZXRTdXBwb3J0ZWQgPT0gbTEudGlja2V0U3VwcG9ydGVkICYmCisJCWJ5dGVzLkVxdWFsKG0uc2VjdXJlUmVuZWdvdGlhdGlvbiwgbTEuc2VjdXJlUmVuZWdvdGlhdGlvbikgJiYKKwkJKG0uc2VjdXJlUmVuZWdvdGlhdGlvbiA9PSBuaWwpID09IChtMS5zZWN1cmVSZW5lZ290aWF0aW9uID09IG5pbCkgJiYKKwkJbS5hbHBuUHJvdG9jb2wgPT0gbTEuYWxwblByb3RvY29sICYmCisJCW0uZHVwbGljYXRlRXh0ZW5zaW9uID09IG0xLmR1cGxpY2F0ZUV4dGVuc2lvbiAmJgorCQltLmNoYW5uZWxJRFJlcXVlc3RlZCA9PSBtMS5jaGFubmVsSURSZXF1ZXN0ZWQgJiYKKwkJbS5leHRlbmRlZE1hc3RlclNlY3JldCA9PSBtMS5leHRlbmRlZE1hc3RlclNlY3JldCAmJgorCQltLnNydHBQcm90ZWN0aW9uUHJvZmlsZSA9PSBtMS5zcnRwUHJvdGVjdGlvblByb2ZpbGUgJiYKKwkJbS5zcnRwTWFzdGVyS2V5SWRlbnRpZmllciA9PSBtMS5zcnRwTWFzdGVyS2V5SWRlbnRpZmllciAmJgorCQlieXRlcy5FcXVhbChtLnNjdExpc3QsIG0xLnNjdExpc3QpCiB9CiAKIGZ1bmMgKG0gKnNlcnZlckhlbGxvTXNnKSBtYXJzaGFsKCkgW11ieXRlIHsKQEAgLTY4Nyw3ICs2OTUsNyBAQAogCWlmIG0uY2hhbm5lbElEUmVxdWVzdGVkIHsKIAkJbnVtRXh0ZW5zaW9ucysrCiAJfQotCWlmIGFscG5MZW4gOj0gbGVuKG0uYWxwblByb3RvY29sKTsgYWxwbkxlbiA+IDAgfHwgbS5hbHBuUHJvdG9jb2xFbXB0eSB7CisJaWYgYWxwbkxlbiA6PSBsZW4obS5hbHBuUHJvdG9jb2wpOyBhbHBuTGVuID4gMCB7CiAJCWlmIGFscG5MZW4gPj0gMjU2IHsKIAkJCXBhbmljKCJpbnZhbGlkIEFMUE4gcHJvdG9jb2wiKQogCQl9CkBAIC03MDUsMTAgKzcxMyw2IEBACiAJCWV4dGVuc2lvbnNMZW5ndGggKz0gbGVuKG0uc2N0TGlzdCkKIAkJbnVtRXh0ZW5zaW9ucysrCiAJfQotCWlmIGwgOj0gbGVuKG0uY3VzdG9tRXh0ZW5zaW9uKTsgbCA+IDAgewotCQlleHRlbnNpb25zTGVuZ3RoICs9IGwKLQkJbnVtRXh0ZW5zaW9ucysrCi0JfQogCiAJaWYgbnVtRXh0ZW5zaW9ucyA+IDAgewogCQlleHRlbnNpb25zTGVuZ3RoICs9IDQgKiBudW1FeHRlbnNpb25zCkBAIC03NDMsNyArNzQ3LDcgQEAKIAkJelsxXSA9IDB4ZmYKIAkJeiA9IHpbNDpdCiAJfQotCWlmIG0ubmV4dFByb3RvTmVnICYmICFtLm5wbkxhc3QgeworCWlmIG0ubmV4dFByb3RvTmVnIHsKIAkJelswXSA9IGJ5dGUoZXh0ZW5zaW9uTmV4dFByb3RvTmVnID4+IDgpCiAJCXpbMV0gPSBieXRlKGV4dGVuc2lvbk5leHRQcm90b05lZyAmIDB4ZmYpCiAJCXpbMl0gPSBieXRlKG5leHRQcm90b0xlbiA+PiA4KQpAQCAtNzgwLDcgKzc4NCw3IEBACiAJCWNvcHkoeiwgbS5zZWN1cmVSZW5lZ290aWF0aW9uKQogCQl6ID0geltsZW4obS5zZWN1cmVSZW5lZ290aWF0aW9uKTpdCiAJfQotCWlmIGFscG5MZW4gOj0gbGVuKG0uYWxwblByb3RvY29sKTsgYWxwbkxlbiA+IDAgfHwgbS5hbHBuUHJvdG9jb2xFbXB0eSB7CisJaWYgYWxwbkxlbiA6PSBsZW4obS5hbHBuUHJvdG9jb2wpOyBhbHBuTGVuID4gMCB7CiAJCXpbMF0gPSBieXRlKGV4dGVuc2lvbkFMUE4gPj4gOCkKIAkJelsxXSA9IGJ5dGUoZXh0ZW5zaW9uQUxQTiAmIDB4ZmYpCiAJCWwgOj0gMiArIDEgKyBhbHBuTGVuCkBAIC04MzQsMzEgKzgzOCw2IEBACiAJCWNvcHkoels0Ol0sIG0uc2N0TGlzdCkKIAkJeiA9IHpbNCtsOl0KIAl9Ci0JaWYgbCA6PSBsZW4obS5jdXN0b21FeHRlbnNpb24pOyBsID4gMCB7Ci0JCXpbMF0gPSBieXRlKGV4dGVuc2lvbkN1c3RvbSA+PiA4KQotCQl6WzFdID0gYnl0ZShleHRlbnNpb25DdXN0b20gJiAweGZmKQotCQl6WzJdID0gYnl0ZShsID4+IDgpCi0JCXpbM10gPSBieXRlKGwgJiAweGZmKQotCQljb3B5KHpbNDpdLCBbXWJ5dGUobS5jdXN0b21FeHRlbnNpb24pKQotCQl6ID0gels0K2w6XQotCX0KLQlpZiBtLm5leHRQcm90b05lZyAmJiBtLm5wbkxhc3QgewotCQl6WzBdID0gYnl0ZShleHRlbnNpb25OZXh0UHJvdG9OZWcgPj4gOCkKLQkJelsxXSA9IGJ5dGUoZXh0ZW5zaW9uTmV4dFByb3RvTmVnICYgMHhmZikKLQkJelsyXSA9IGJ5dGUobmV4dFByb3RvTGVuID4+IDgpCi0JCXpbM10gPSBieXRlKG5leHRQcm90b0xlbikKLQkJeiA9IHpbNDpdCi0KLQkJZm9yIF8sIHYgOj0gcmFuZ2UgbS5uZXh0UHJvdG9zIHsKLQkJCWwgOj0gbGVuKHYpCi0JCQlpZiBsID4gMjU1IHsKLQkJCQlsID0gMjU1Ci0JCQl9Ci0JCQl6WzBdID0gYnl0ZShsKQotCQkJY29weSh6WzE6XSwgW11ieXRlKHZbMDpsXSkpCi0JCQl6ID0gelsxK2w6XQotCQl9Ci0JfQogCiAJbS5yYXcgPSB4CiAKQEAgLTg5MCw5ICs4NjksNyBAQAogCW0ub2NzcFN0YXBsaW5nID0gZmFsc2UKIAltLnRpY2tldFN1cHBvcnRlZCA9IGZhbHNlCiAJbS5hbHBuUHJvdG9jb2wgPSAiIgotCW0uYWxwblByb3RvY29sRW1wdHkgPSBmYWxzZQogCW0uZXh0ZW5kZWRNYXN0ZXJTZWNyZXQgPSBmYWxzZQotCW0uY3VzdG9tRXh0ZW5zaW9uID0gIiIKIAogCWlmIGxlbihkYXRhKSA9PSAwIHsKIAkJLy8gU2VydmVySGVsbG8gaXMgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBleHRlbnNpb24gZGF0YQpAQCAtOTYzLDcgKzk0MCw2IEBACiAJCQl9CiAJCQlkID0gZFsxOl0KIAkJCW0uYWxwblByb3RvY29sID0gc3RyaW5nKGQpCi0JCQltLmFscG5Qcm90b2NvbEVtcHR5ID0gbGVuKGQpID09IDAKIAkJY2FzZSBleHRlbnNpb25DaGFubmVsSUQ6CiAJCQlpZiBsZW5ndGggPiAwIHsKIAkJCQlyZXR1cm4gZmFsc2UKQEAgLTk4OSw5ICs5NjUsMTQgQEAKIAkJCX0KIAkJCW0uc3J0cE1hc3RlcktleUlkZW50aWZpZXIgPSBzdHJpbmcoZFsxOl0pCiAJCWNhc2UgZXh0ZW5zaW9uU2lnbmVkQ2VydGlmaWNhdGVUaW1lc3RhbXA6Ci0JCQltLnNjdExpc3QgPSBkYXRhWzpsZW5ndGhdCi0JCWNhc2UgZXh0ZW5zaW9uQ3VzdG9tOgotCQkJbS5jdXN0b21FeHRlbnNpb24gPSBzdHJpbmcoZGF0YVs6bGVuZ3RoXSkKKwkJCWlmIGxlbmd0aCA8IDIgeworCQkJCXJldHVybiBmYWxzZQorCQkJfQorCQkJbCA6PSBpbnQoZGF0YVswXSk8PDggfCBpbnQoZGF0YVsxXSkKKwkJCWlmIGwgIT0gbGVuKGRhdGEpLTIgeworCQkJCXJldHVybiBmYWxzZQorCQkJfQorCQkJbS5zY3RMaXN0ID0gZGF0YVsyOmxlbmd0aF0KIAkJfQogCQlkYXRhID0gZGF0YVtsZW5ndGg6XQogCX0KQEAgLTEwMDQsNiArOTg1LDE2IEBACiAJY2VydGlmaWNhdGVzIFtdW11ieXRlCiB9CiAKK2Z1bmMgKG0gKmNlcnRpZmljYXRlTXNnKSBlcXVhbChpIGludGVyZmFjZXt9KSBib29sIHsKKwltMSwgb2sgOj0gaS4oKmNlcnRpZmljYXRlTXNnKQorCWlmICFvayB7CisJCXJldHVybiBmYWxzZQorCX0KKworCXJldHVybiBieXRlcy5FcXVhbChtLnJhdywgbTEucmF3KSAmJgorCQllcUJ5dGVTbGljZXMobS5jZXJ0aWZpY2F0ZXMsIG0xLmNlcnRpZmljYXRlcykKK30KKwogZnVuYyAobSAqY2VydGlmaWNhdGVNc2cpIG1hcnNoYWwoKSAoeCBbXWJ5dGUpIHsKIAlpZiBtLnJhdyAhPSBuaWwgewogCQlyZXR1cm4gbS5yYXcKQEAgLTEwODEsNiArMTA3MiwxNiBAQAogCWtleSBbXWJ5dGUKIH0KIAorZnVuYyAobSAqc2VydmVyS2V5RXhjaGFuZ2VNc2cpIGVxdWFsKGkgaW50ZXJmYWNle30pIGJvb2wgeworCW0xLCBvayA6PSBpLigqc2VydmVyS2V5RXhjaGFuZ2VNc2cpCisJaWYgIW9rIHsKKwkJcmV0dXJuIGZhbHNlCisJfQorCisJcmV0dXJuIGJ5dGVzLkVxdWFsKG0ucmF3LCBtMS5yYXcpICYmCisJCWJ5dGVzLkVxdWFsKG0ua2V5LCBtMS5rZXkpCit9CisKIGZ1bmMgKG0gKnNlcnZlcktleUV4Y2hhbmdlTXNnKSBtYXJzaGFsKCkgW11ieXRlIHsKIAlpZiBtLnJhdyAhPSBuaWwgewogCQlyZXR1cm4gbS5yYXcKQEAgLTExMTIsNiArMTExMywxNyBAQAogCXJlc3BvbnNlICAgW11ieXRlCiB9CiAKK2Z1bmMgKG0gKmNlcnRpZmljYXRlU3RhdHVzTXNnKSBlcXVhbChpIGludGVyZmFjZXt9KSBib29sIHsKKwltMSwgb2sgOj0gaS4oKmNlcnRpZmljYXRlU3RhdHVzTXNnKQorCWlmICFvayB7CisJCXJldHVybiBmYWxzZQorCX0KKworCXJldHVybiBieXRlcy5FcXVhbChtLnJhdywgbTEucmF3KSAmJgorCQltLnN0YXR1c1R5cGUgPT0gbTEuc3RhdHVzVHlwZSAmJgorCQlieXRlcy5FcXVhbChtLnJlc3BvbnNlLCBtMS5yZXNwb25zZSkKK30KKwogZnVuYyAobSAqY2VydGlmaWNhdGVTdGF0dXNNc2cpIG1hcnNoYWwoKSBbXWJ5dGUgewogCWlmIG0ucmF3ICE9IG5pbCB7CiAJCXJldHVybiBtLnJhdwpAQCAtMTE2Myw2ICsxMTc1LDExIEBACiAKIHR5cGUgc2VydmVySGVsbG9Eb25lTXNnIHN0cnVjdHt9CiAKK2Z1bmMgKG0gKnNlcnZlckhlbGxvRG9uZU1zZykgZXF1YWwoaSBpbnRlcmZhY2V7fSkgYm9vbCB7CisJXywgb2sgOj0gaS4oKnNlcnZlckhlbGxvRG9uZU1zZykKKwlyZXR1cm4gb2sKK30KKwogZnVuYyAobSAqc2VydmVySGVsbG9Eb25lTXNnKSBtYXJzaGFsKCkgW11ieXRlIHsKIAl4IDo9IG1ha2UoW11ieXRlLCA0KQogCXhbMF0gPSB0eXBlU2VydmVySGVsbG9Eb25lCkBAIC0xMTc4LDYgKzExOTUsMTYgQEAKIAljaXBoZXJ0ZXh0IFtdYnl0ZQogfQogCitmdW5jIChtICpjbGllbnRLZXlFeGNoYW5nZU1zZykgZXF1YWwoaSBpbnRlcmZhY2V7fSkgYm9vbCB7CisJbTEsIG9rIDo9IGkuKCpjbGllbnRLZXlFeGNoYW5nZU1zZykKKwlpZiAhb2sgeworCQlyZXR1cm4gZmFsc2UKKwl9CisKKwlyZXR1cm4gYnl0ZXMuRXF1YWwobS5yYXcsIG0xLnJhdykgJiYKKwkJYnl0ZXMuRXF1YWwobS5jaXBoZXJ0ZXh0LCBtMS5jaXBoZXJ0ZXh0KQorfQorCiBmdW5jIChtICpjbGllbnRLZXlFeGNoYW5nZU1zZykgbWFyc2hhbCgpIFtdYnl0ZSB7CiAJaWYgbS5yYXcgIT0gbmlsIHsKIAkJcmV0dXJuIG0ucmF3CkBAIC0xMjEyLDYgKzEyMzksMTYgQEAKIAl2ZXJpZnlEYXRhIFtdYnl0ZQogfQogCitmdW5jIChtICpmaW5pc2hlZE1zZykgZXF1YWwoaSBpbnRlcmZhY2V7fSkgYm9vbCB7CisJbTEsIG9rIDo9IGkuKCpmaW5pc2hlZE1zZykKKwlpZiAhb2sgeworCQlyZXR1cm4gZmFsc2UKKwl9CisKKwlyZXR1cm4gYnl0ZXMuRXF1YWwobS5yYXcsIG0xLnJhdykgJiYKKwkJYnl0ZXMuRXF1YWwobS52ZXJpZnlEYXRhLCBtMS52ZXJpZnlEYXRhKQorfQorCiBmdW5jIChtICpmaW5pc2hlZE1zZykgbWFyc2hhbCgpICh4IFtdYnl0ZSkgewogCWlmIG0ucmF3ICE9IG5pbCB7CiAJCXJldHVybiBtLnJhdwpAQCAtMTIzOSw2ICsxMjc2LDE2IEBACiAJcHJvdG8gc3RyaW5nCiB9CiAKK2Z1bmMgKG0gKm5leHRQcm90b01zZykgZXF1YWwoaSBpbnRlcmZhY2V7fSkgYm9vbCB7CisJbTEsIG9rIDo9IGkuKCpuZXh0UHJvdG9Nc2cpCisJaWYgIW9rIHsKKwkJcmV0dXJuIGZhbHNlCisJfQorCisJcmV0dXJuIGJ5dGVzLkVxdWFsKG0ucmF3LCBtMS5yYXcpICYmCisJCW0ucHJvdG8gPT0gbTEucHJvdG8KK30KKwogZnVuYyAobSAqbmV4dFByb3RvTXNnKSBtYXJzaGFsKCkgW11ieXRlIHsKIAlpZiBtLnJhdyAhPSBuaWwgewogCQlyZXR1cm4gbS5yYXcKQEAgLTEzMDYsNiArMTM1MywxOCBAQAogCWNlcnRpZmljYXRlQXV0aG9yaXRpZXMgW11bXWJ5dGUKIH0KIAorZnVuYyAobSAqY2VydGlmaWNhdGVSZXF1ZXN0TXNnKSBlcXVhbChpIGludGVyZmFjZXt9KSBib29sIHsKKwltMSwgb2sgOj0gaS4oKmNlcnRpZmljYXRlUmVxdWVzdE1zZykKKwlpZiAhb2sgeworCQlyZXR1cm4gZmFsc2UKKwl9CisKKwlyZXR1cm4gYnl0ZXMuRXF1YWwobS5yYXcsIG0xLnJhdykgJiYKKwkJYnl0ZXMuRXF1YWwobS5jZXJ0aWZpY2F0ZVR5cGVzLCBtMS5jZXJ0aWZpY2F0ZVR5cGVzKSAmJgorCQllcUJ5dGVTbGljZXMobS5jZXJ0aWZpY2F0ZUF1dGhvcml0aWVzLCBtMS5jZXJ0aWZpY2F0ZUF1dGhvcml0aWVzKSAmJgorCQllcVNpZ25hdHVyZUFuZEhhc2hlcyhtLnNpZ25hdHVyZUFuZEhhc2hlcywgbTEuc2lnbmF0dXJlQW5kSGFzaGVzKQorfQorCiBmdW5jIChtICpjZXJ0aWZpY2F0ZVJlcXVlc3RNc2cpIG1hcnNoYWwoKSAoeCBbXWJ5dGUpIHsKIAlpZiBtLnJhdyAhPSBuaWwgewogCQlyZXR1cm4gbS5yYXcKQEAgLTE0NDgsNiArMTUwNywxOSBAQAogCXNpZ25hdHVyZSAgICAgICAgICAgW11ieXRlCiB9CiAKK2Z1bmMgKG0gKmNlcnRpZmljYXRlVmVyaWZ5TXNnKSBlcXVhbChpIGludGVyZmFjZXt9KSBib29sIHsKKwltMSwgb2sgOj0gaS4oKmNlcnRpZmljYXRlVmVyaWZ5TXNnKQorCWlmICFvayB7CisJCXJldHVybiBmYWxzZQorCX0KKworCXJldHVybiBieXRlcy5FcXVhbChtLnJhdywgbTEucmF3KSAmJgorCQltLmhhc1NpZ25hdHVyZUFuZEhhc2ggPT0gbTEuaGFzU2lnbmF0dXJlQW5kSGFzaCAmJgorCQltLnNpZ25hdHVyZUFuZEhhc2guaGFzaCA9PSBtMS5zaWduYXR1cmVBbmRIYXNoLmhhc2ggJiYKKwkJbS5zaWduYXR1cmVBbmRIYXNoLnNpZ25hdHVyZSA9PSBtMS5zaWduYXR1cmVBbmRIYXNoLnNpZ25hdHVyZSAmJgorCQlieXRlcy5FcXVhbChtLnNpZ25hdHVyZSwgbTEuc2lnbmF0dXJlKQorfQorCiBmdW5jIChtICpjZXJ0aWZpY2F0ZVZlcmlmeU1zZykgbWFyc2hhbCgpICh4IFtdYnl0ZSkgewogCWlmIG0ucmF3ICE9IG5pbCB7CiAJCXJldHVybiBtLnJhdwpAQCAtMTUxNyw2ICsxNTg5LDE2IEBACiAJdGlja2V0IFtdYnl0ZQogfQogCitmdW5jIChtICpuZXdTZXNzaW9uVGlja2V0TXNnKSBlcXVhbChpIGludGVyZmFjZXt9KSBib29sIHsKKwltMSwgb2sgOj0gaS4oKm5ld1Nlc3Npb25UaWNrZXRNc2cpCisJaWYgIW9rIHsKKwkJcmV0dXJuIGZhbHNlCisJfQorCisJcmV0dXJuIGJ5dGVzLkVxdWFsKG0ucmF3LCBtMS5yYXcpICYmCisJCWJ5dGVzLkVxdWFsKG0udGlja2V0LCBtMS50aWNrZXQpCit9CisKIGZ1bmMgKG0gKm5ld1Nlc3Npb25UaWNrZXRNc2cpIG1hcnNoYWwoKSAoeCBbXWJ5dGUpIHsKIAlpZiBtLnJhdyAhPSBuaWwgewogCQlyZXR1cm4gbS5yYXcKQEAgLTE1NjksNiArMTY1MSwxOSBAQAogCWNoYWxsZW5nZSAgICBbXWJ5dGUKIH0KIAorZnVuYyAobSAqdjJDbGllbnRIZWxsb01zZykgZXF1YWwoaSBpbnRlcmZhY2V7fSkgYm9vbCB7CisJbTEsIG9rIDo9IGkuKCp2MkNsaWVudEhlbGxvTXNnKQorCWlmICFvayB7CisJCXJldHVybiBmYWxzZQorCX0KKworCXJldHVybiBieXRlcy5FcXVhbChtLnJhdywgbTEucmF3KSAmJgorCQltLnZlcnMgPT0gbTEudmVycyAmJgorCQllcVVpbnQxNnMobS5jaXBoZXJTdWl0ZXMsIG0xLmNpcGhlclN1aXRlcykgJiYKKwkJYnl0ZXMuRXF1YWwobS5zZXNzaW9uSWQsIG0xLnNlc3Npb25JZCkgJiYKKwkJYnl0ZXMuRXF1YWwobS5jaGFsbGVuZ2UsIG0xLmNoYWxsZW5nZSkKK30KKwogZnVuYyAobSAqdjJDbGllbnRIZWxsb01zZykgbWFyc2hhbCgpIFtdYnl0ZSB7CiAJaWYgbS5yYXcgIT0gbmlsIHsKIAkJcmV0dXJuIG0ucmF3CkBAIC0xNjA4LDYgKzE3MDMsMTcgQEAKIAljb29raWUgW11ieXRlCiB9CiAKK2Z1bmMgKG0gKmhlbGxvVmVyaWZ5UmVxdWVzdE1zZykgZXF1YWwoaSBpbnRlcmZhY2V7fSkgYm9vbCB7CisJbTEsIG9rIDo9IGkuKCpoZWxsb1ZlcmlmeVJlcXVlc3RNc2cpCisJaWYgIW9rIHsKKwkJcmV0dXJuIGZhbHNlCisJfQorCisJcmV0dXJuIGJ5dGVzLkVxdWFsKG0ucmF3LCBtMS5yYXcpICYmCisJCW0udmVycyA9PSBtMS52ZXJzICYmCisJCWJ5dGVzLkVxdWFsKG0uY29va2llLCBtMS5jb29raWUpCit9CisKIGZ1bmMgKG0gKmhlbGxvVmVyaWZ5UmVxdWVzdE1zZykgbWFyc2hhbCgpIFtdYnl0ZSB7CiAJaWYgbS5yYXcgIT0gbmlsIHsKIAkJcmV0dXJuIG0ucmF3CkBAIC0xNjQ5LDYgKzE3NTUsMTYgQEAKIAljaGFubmVsSUQgW11ieXRlCiB9CiAKK2Z1bmMgKG0gKmVuY3J5cHRlZEV4dGVuc2lvbnNNc2cpIGVxdWFsKGkgaW50ZXJmYWNle30pIGJvb2wgeworCW0xLCBvayA6PSBpLigqZW5jcnlwdGVkRXh0ZW5zaW9uc01zZykKKwlpZiAhb2sgeworCQlyZXR1cm4gZmFsc2UKKwl9CisKKwlyZXR1cm4gYnl0ZXMuRXF1YWwobS5yYXcsIG0xLnJhdykgJiYKKwkJYnl0ZXMuRXF1YWwobS5jaGFubmVsSUQsIG0xLmNoYW5uZWxJRCkKK30KKwogZnVuYyAobSAqZW5jcnlwdGVkRXh0ZW5zaW9uc01zZykgbWFyc2hhbCgpIFtdYnl0ZSB7CiAJaWYgbS5yYXcgIT0gbmlsIHsKIAkJcmV0dXJuIG0ucmF3CmRpZmYgLS1naXQgYS9zcmMvc3NsL3Rlc3QvcnVubmVyL2hhbmRzaGFrZV9zZXJ2ZXIuZ28gYi9zcmMvc3NsL3Rlc3QvcnVubmVyL2hhbmRzaGFrZV9zZXJ2ZXIuZ28KaW5kZXggMDY4ZGZmOS4uODVjYzBkMiAxMDA2NDQKLS0tIGEvc3JjL3NzbC90ZXN0L3J1bm5lci9oYW5kc2hha2Vfc2VydmVyLmdvCisrKyBiL3NyYy9zc2wvdGVzdC9ydW5uZXIvaGFuZHNoYWtlX3NlcnZlci5nbwpAQCAtMTM5LDggKzEzOSw4IEBACiAJCWMuc2VuZEFsZXJ0KGFsZXJ0VW5leHBlY3RlZE1lc3NhZ2UpCiAJCXJldHVybiBmYWxzZSwgdW5leHBlY3RlZE1lc3NhZ2VFcnJvcihocy5jbGllbnRIZWxsbywgbXNnKQogCX0KLQlpZiBzaXplIDo9IGNvbmZpZy5CdWdzLlJlcXVpcmVDbGllbnRIZWxsb1NpemU7IHNpemUgIT0gMCAmJiBsZW4oaHMuY2xpZW50SGVsbG8ucmF3KSAhPSBzaXplIHsKLQkJcmV0dXJuIGZhbHNlLCBmbXQuRXJyb3JmKCJ0bHM6IENsaWVudEhlbGxvIHJlY29yZCBzaXplIGlzICVkLCBidXQgZXhwZWN0ZWQgJWQiLCBsZW4oaHMuY2xpZW50SGVsbG8ucmF3KSwgc2l6ZSkKKwlpZiBjb25maWcuQnVncy5SZXF1aXJlRmFzdHJhZGlvUGFkZGluZyAmJiBsZW4oaHMuY2xpZW50SGVsbG8ucmF3KSA8IDEwMDAgeworCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoInRsczogQ2xpZW50SGVsbG8gcmVjb3JkIHNpemUgc2hvdWxkIGJlIGxhcmdlciB0aGFuIDEwMDAgYnl0ZXMgd2hlbiBwYWRkaW5nIGVuYWJsZWQuIikKIAl9CiAKIAlpZiBjLmlzRFRMUyAmJiAhY29uZmlnLkJ1Z3MuU2tpcEhlbGxvVmVyaWZ5UmVxdWVzdCB7CkBAIC0yMTAsMTEgKzIxMCw4IEBACiAJfQogCWMuaGF2ZVZlcnMgPSB0cnVlCiAKLQlocy5oZWxsbyA9ICZzZXJ2ZXJIZWxsb01zZ3sKLQkJaXNEVExTOiAgICAgICAgICBjLmlzRFRMUywKLQkJY3VzdG9tRXh0ZW5zaW9uOiBjb25maWcuQnVncy5DdXN0b21FeHRlbnNpb24sCi0JCW5wbkxhc3Q6ICAgICAgICAgY29uZmlnLkJ1Z3MuU3dhcE5QTkFuZEFMUE4sCi0JfQorCWhzLmhlbGxvID0gbmV3KHNlcnZlckhlbGxvTXNnKQorCWhzLmhlbGxvLmlzRFRMUyA9IGMuaXNEVExTCiAKIAlzdXBwb3J0ZWRDdXJ2ZSA6PSBmYWxzZQogCXByZWZlcnJlZEN1cnZlcyA6PSBjb25maWcuY3VydmVQcmVmZXJlbmNlcygpCkBAIC0yODgsMTggKzI4NSwxMiBAQAogCX0KIAogCWlmIGxlbihocy5jbGllbnRIZWxsby5hbHBuUHJvdG9jb2xzKSA+IDAgewotCQlpZiBwcm90byA6PSBjLmNvbmZpZy5CdWdzLkFMUE5Qcm90b2NvbDsgcHJvdG8gIT0gbmlsIHsKLQkJCWhzLmhlbGxvLmFscG5Qcm90b2NvbCA9ICpwcm90bwotCQkJaHMuaGVsbG8uYWxwblByb3RvY29sRW1wdHkgPSBsZW4oKnByb3RvKSA9PSAwCi0JCQljLmNsaWVudFByb3RvY29sID0gKnByb3RvCi0JCQljLnVzZWRBTFBOID0gdHJ1ZQotCQl9IGVsc2UgaWYgc2VsZWN0ZWRQcm90bywgZmFsbGJhY2sgOj0gbXV0dWFsUHJvdG9jb2woaHMuY2xpZW50SGVsbG8uYWxwblByb3RvY29scywgYy5jb25maWcuTmV4dFByb3Rvcyk7ICFmYWxsYmFjayB7CisJCWlmIHNlbGVjdGVkUHJvdG8sIGZhbGxiYWNrIDo9IG11dHVhbFByb3RvY29sKGhzLmNsaWVudEhlbGxvLmFscG5Qcm90b2NvbHMsIGMuY29uZmlnLk5leHRQcm90b3MpOyAhZmFsbGJhY2sgewogCQkJaHMuaGVsbG8uYWxwblByb3RvY29sID0gc2VsZWN0ZWRQcm90bwogCQkJYy5jbGllbnRQcm90b2NvbCA9IHNlbGVjdGVkUHJvdG8KIAkJCWMudXNlZEFMUE4gPSB0cnVlCiAJCX0KLQl9Ci0JaWYgbGVuKGhzLmNsaWVudEhlbGxvLmFscG5Qcm90b2NvbHMpID09IDAgfHwgYy5jb25maWcuQnVncy5OZWdvdGlhdGVBTFBOQW5kTlBOIHsKKwl9IGVsc2UgewogCQkvLyBBbHRob3VnaCBzZW5kaW5nIGFuIGVtcHR5IE5QTiBleHRlbnNpb24gaXMgcmVhc29uYWJsZSwgRmlyZWZveCBoYXMKIAkJLy8gaGFkIGEgYnVnIGFyb3VuZCB0aGlzLiBCZXN0IHRvIHNlbmQgbm90aGluZyBhdCBhbGwgaWYKIAkJLy8gY29uZmlnLk5leHRQcm90b3MgaXMgZW1wdHkuIFNlZQpAQCAtMzQ0LDEyICszMzUsNiBAQAogCQlocy5oZWxsby5zcnRwUHJvdGVjdGlvblByb2ZpbGUgPSBjLmNvbmZpZy5CdWdzLlNlbmRTUlRQUHJvdGVjdGlvblByb2ZpbGUKIAl9CiAKLQlpZiBleHBlY3RlZCA6PSBjLmNvbmZpZy5CdWdzLkV4cGVjdGVkQ3VzdG9tRXh0ZW5zaW9uOyBleHBlY3RlZCAhPSBuaWwgewotCQlpZiBocy5jbGllbnRIZWxsby5jdXN0b21FeHRlbnNpb24gIT0gKmV4cGVjdGVkIHsKLQkJCXJldHVybiBmYWxzZSwgZm10LkVycm9yZigidGxzOiBiYWQgY3VzdG9tIGV4dGVuc2lvbiBjb250ZW50cyAlcSIsIGhzLmNsaWVudEhlbGxvLmN1c3RvbUV4dGVuc2lvbikKLQkJfQotCX0KLQogCV8sIGhzLmVjZHNhT2sgPSBocy5jZXJ0LlByaXZhdGVLZXkuKCplY2RzYS5Qcml2YXRlS2V5KQogCiAJLy8gRm9yIHRlc3QgcHVycG9zZXMsIGNoZWNrIHRoYXQgdGhlIHBlZXIgbmV2ZXIgb2ZmZXJzIGEgc2Vzc2lvbiB3aGVuCkBAIC01MzEsOSArNTE2LDcgQEAKIAogCWlmICFpc1BTSyB7CiAJCWNlcnRNc2cgOj0gbmV3KGNlcnRpZmljYXRlTXNnKQotCQlpZiAhY29uZmlnLkJ1Z3MuRW1wdHlDZXJ0aWZpY2F0ZUxpc3QgewotCQkJY2VydE1zZy5jZXJ0aWZpY2F0ZXMgPSBocy5jZXJ0LkNlcnRpZmljYXRlCi0JCX0KKwkJY2VydE1zZy5jZXJ0aWZpY2F0ZXMgPSBocy5jZXJ0LkNlcnRpZmljYXRlCiAJCWlmICFjb25maWcuQnVncy5VbmF1dGhlbnRpY2F0ZWRFQ0RIIHsKIAkJCWNlcnRNc2dCeXRlcyA6PSBjZXJ0TXNnLm1hcnNoYWwoKQogCQkJaWYgY29uZmlnLkJ1Z3MuV3JvbmdDZXJ0aWZpY2F0ZU1lc3NhZ2VUeXBlIHsKQEAgLTY4NSw3ICs2NjgsNiBAQAogCQkJaWYgIWlzU3VwcG9ydGVkU2lnbmF0dXJlQW5kSGFzaChzaWduYXR1cmVBbmRIYXNoLCBjb25maWcuc2lnbmF0dXJlQW5kSGFzaGVzRm9yU2VydmVyKCkpIHsKIAkJCQlyZXR1cm4gZXJyb3JzLk5ldygidGxzOiB1bnN1cHBvcnRlZCBoYXNoIGZ1bmN0aW9uIGZvciBjbGllbnQgY2VydGlmaWNhdGUiKQogCQkJfQotCQkJYy5jbGllbnRDZXJ0U2lnbmF0dXJlSGFzaCA9IHNpZ25hdHVyZUFuZEhhc2guaGFzaAogCQl9IGVsc2UgewogCQkJLy8gQmVmb3JlIFRMUyAxLjIgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0gd2FzIGltcGxpY2l0CiAJCQkvLyBmcm9tIHRoZSBrZXkgdHlwZSwgYW5kIG9ubHkgb25lIGhhc2ggcGVyIHNpZ25hdHVyZQpkaWZmIC0tZ2l0IGEvc3JjL3NzbC90ZXN0L3J1bm5lci9ydW5uZXIuZ28gYi9zcmMvc3NsL3Rlc3QvcnVubmVyL3J1bm5lci5nbwppbmRleCAyNjlhOTU1Li45NGMxZDMyIDEwMDY0NAotLS0gYS9zcmMvc3NsL3Rlc3QvcnVubmVyL3J1bm5lci5nbworKysgYi9zcmMvc3NsL3Rlc3QvcnVubmVyL3J1bm5lci5nbwpAQCAtMzIsMTAgKzMyLDYgQEAKIAltYWxsb2NUZXN0RGVidWcgPSBmbGFnLkJvb2woIm1hbGxvYy10ZXN0LWRlYnVnIiwgZmFsc2UsICJJZiB0cnVlLCBhc2sgYnNzbF9zaGltIHRvIGFib3J0IHJhdGhlciB0aGFuIGZhaWwgYSBtYWxsb2MuIFRoaXMgY2FuIGJlIHVzZWQgd2l0aCBhIHNwZWNpZmljIHZhbHVlIGZvciAtLW1hbGxvYy10ZXN0IHRvIGlkZW50aXR5IHRoZSBtYWxsb2MgZmFpbGluZyB0aGF0IGlzIGNhdXNpbmcgcHJvYmxlbXMuIikKIAlqc29uT3V0cHV0ICAgICAgPSBmbGFnLlN0cmluZygianNvbi1vdXRwdXQiLCAiIiwgIlRoZSBmaWxlIHRvIG91dHB1dCBKU09OIHJlc3VsdHMgdG8uIikKIAlwaXBlICAgICAgICAgICAgPSBmbGFnLkJvb2woInBpcGUiLCBmYWxzZSwgIklmIHRydWUsIHByaW50IHN0YXR1cyBvdXRwdXQgc3VpdGFibGUgZm9yIHBpcGluZyBpbnRvIGFub3RoZXIgcHJvZ3JhbS4iKQotCXRlc3RUb1J1biAgICAgICA9IGZsYWcuU3RyaW5nKCJ0ZXN0IiwgIiIsICJUaGUgbmFtZSBvZiBhIHRlc3QgdG8gcnVuLCBvciBlbXB0eSB0byBydW4gYWxsIHRlc3RzIikKLQludW1Xb3JrZXJzICAgICAgPSBmbGFnLkludCgibnVtLXdvcmtlcnMiLCBydW50aW1lLk51bUNQVSgpLCAiVGhlIG51bWJlciBvZiB3b3JrZXJzIHRvIHJ1biBpbiBwYXJhbGxlbC4iKQotCXNoaW1QYXRoICAgICAgICA9IGZsYWcuU3RyaW5nKCJzaGltLXBhdGgiLCAiLi4vLi4vLi4vYnVpbGQvc3NsL3Rlc3QvYnNzbF9zaGltIiwgIlRoZSBsb2NhdGlvbiBvZiB0aGUgc2hpbSBiaW5hcnkuIikKLQlyZXNvdXJjZURpciAgICAgPSBmbGFnLlN0cmluZygicmVzb3VyY2UtZGlyIiwgIi4iLCAiVGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBmaW5kIGNlcnRpZmljYXRlIGFuZCBrZXkgZmlsZXMuIikKICkKIAogY29uc3QgKApAQCAtNTgsMjEgKzU0LDIxIEBACiAKIGZ1bmMgaW5pdENlcnRpZmljYXRlcygpIHsKIAl2YXIgZXJyIGVycm9yCi0JcnNhQ2VydGlmaWNhdGUsIGVyciA9IExvYWRYNTA5S2V5UGFpcihwYXRoLkpvaW4oKnJlc291cmNlRGlyLCByc2FDZXJ0aWZpY2F0ZUZpbGUpLCBwYXRoLkpvaW4oKnJlc291cmNlRGlyLCByc2FLZXlGaWxlKSkKKwlyc2FDZXJ0aWZpY2F0ZSwgZXJyID0gTG9hZFg1MDlLZXlQYWlyKHJzYUNlcnRpZmljYXRlRmlsZSwgcnNhS2V5RmlsZSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJcGFuaWMoZXJyKQogCX0KIAlyc2FDZXJ0aWZpY2F0ZS5PQ1NQU3RhcGxlID0gdGVzdE9DU1BSZXNwb25zZQogCXJzYUNlcnRpZmljYXRlLlNpZ25lZENlcnRpZmljYXRlVGltZXN0YW1wTGlzdCA9IHRlc3RTQ1RMaXN0CiAKLQllY2RzYUNlcnRpZmljYXRlLCBlcnIgPSBMb2FkWDUwOUtleVBhaXIocGF0aC5Kb2luKCpyZXNvdXJjZURpciwgZWNkc2FDZXJ0aWZpY2F0ZUZpbGUpLCBwYXRoLkpvaW4oKnJlc291cmNlRGlyLCBlY2RzYUtleUZpbGUpKQorCWVjZHNhQ2VydGlmaWNhdGUsIGVyciA9IExvYWRYNTA5S2V5UGFpcihlY2RzYUNlcnRpZmljYXRlRmlsZSwgZWNkc2FLZXlGaWxlKQogCWlmIGVyciAhPSBuaWwgewogCQlwYW5pYyhlcnIpCiAJfQogCWVjZHNhQ2VydGlmaWNhdGUuT0NTUFN0YXBsZSA9IHRlc3RPQ1NQUmVzcG9uc2UKIAllY2RzYUNlcnRpZmljYXRlLlNpZ25lZENlcnRpZmljYXRlVGltZXN0YW1wTGlzdCA9IHRlc3RTQ1RMaXN0CiAKLQljaGFubmVsSURQRU1CbG9jaywgZXJyIDo9IGlvdXRpbC5SZWFkRmlsZShwYXRoLkpvaW4oKnJlc291cmNlRGlyLCBjaGFubmVsSURLZXlGaWxlKSkKKwljaGFubmVsSURQRU1CbG9jaywgZXJyIDo9IGlvdXRpbC5SZWFkRmlsZShjaGFubmVsSURLZXlGaWxlKQogCWlmIGVyciAhPSBuaWwgewogCQlwYW5pYyhlcnIpCiAJfQpAQCAtMTU1LDIxICsxNTEsOSBAQAogCS8vIGV4cGVjdGVkU1JUUFByb3RlY3Rpb25Qcm9maWxlIGlzIHRoZSBEVExTLVNSVFAgcHJvZmlsZSB0aGF0CiAJLy8gc2hvdWxkIGJlIG5lZ290aWF0ZWQuIElmIHplcm8sIG5vbmUgc2hvdWxkIGJlIG5lZ290aWF0ZWQuCiAJZXhwZWN0ZWRTUlRQUHJvdGVjdGlvblByb2ZpbGUgdWludDE2Ci0JLy8gZXhwZWN0ZWRPQ1NQUmVzcG9uc2UsIGlmIG5vdCBuaWwsIGlzIHRoZSBleHBlY3RlZCBPQ1NQIHJlc3BvbnNlIHRvIGJlIHJlY2VpdmVkLgotCWV4cGVjdGVkT0NTUFJlc3BvbnNlIFtddWludDgKLQkvLyBleHBlY3RlZFNDVExpc3QsIGlmIG5vdCBuaWwsIGlzIHRoZSBleHBlY3RlZCBTQ1QgbGlzdCB0byBiZSByZWNlaXZlZC4KLQlleHBlY3RlZFNDVExpc3QgW111aW50OAotCS8vIGV4cGVjdGVkQ2xpZW50Q2VydFNpZ25hdHVyZUhhc2gsIGlmIG5vdCB6ZXJvLCBpcyB0aGUgVExTIGlkIG9mIHRoZQotCS8vIGhhc2ggZnVuY3Rpb24gdGhhdCB0aGUgY2xpZW50IHNob3VsZCBoYXZlIHVzZWQgd2hlbiBzaWduaW5nIHRoZQotCS8vIGhhbmRzaGFrZSB3aXRoIGEgY2xpZW50IGNlcnRpZmljYXRlLgotCWV4cGVjdGVkQ2xpZW50Q2VydFNpZ25hdHVyZUhhc2ggdWludDgKIAkvLyBtZXNzYWdlTGVuIGlzIHRoZSBsZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgdGVzdCBtZXNzYWdlIHRoYXQgd2lsbCBiZQogCS8vIHNlbnQuCiAJbWVzc2FnZUxlbiBpbnQKLQkvLyBtZXNzYWdlQ291bnQgaXMgdGhlIG51bWJlciBvZiB0ZXN0IG1lc3NhZ2VzIHRoYXQgd2lsbCBiZSBzZW50LgotCW1lc3NhZ2VDb3VudCBpbnQKLQkvLyBkaWdlc3RQcmVmcyBpcyB0aGUgbGlzdCBvZiBkaWdlc3QgcHJlZmVyZW5jZXMgZnJvbSB0aGUgY2xpZW50LgotCWRpZ2VzdFByZWZzIHN0cmluZwogCS8vIGNlcnRGaWxlIGlzIHRoZSBwYXRoIHRvIHRoZSBjZXJ0aWZpY2F0ZSB0byB1c2UgZm9yIHRoZSBzZXJ2ZXIuCiAJY2VydEZpbGUgc3RyaW5nCiAJLy8ga2V5RmlsZSBpcyB0aGUgcGF0aCB0byB0aGUgcHJpdmF0ZSBrZXkgdG8gdXNlIGZvciB0aGUgc2VydmVyLgpAQCAtMTkwLDE5ICsxNzQsMTIgQEAKIAkvLyBuZXdTZXNzaW9uc09uUmVzdW1lLCBpZiB0cnVlLCB3aWxsIGNhdXNlIHJlc3VtZUNvbmZpZyB0bwogCS8vIHVzZSBhIGRpZmZlcmVudCBzZXNzaW9uIHJlc3VtcHRpb24gY29udGV4dC4KIAluZXdTZXNzaW9uc09uUmVzdW1lIGJvb2wKLQkvLyBub1Nlc3Npb25DYWNoZSwgaWYgdHJ1ZSwgd2lsbCBjYXVzZSB0aGUgc2VydmVyIHRvIHJ1biB3aXRob3V0IGEKLQkvLyBzZXNzaW9uIGNhY2hlLgotCW5vU2Vzc2lvbkNhY2hlIGJvb2wKIAkvLyBzZW5kUHJlZml4IHNlbmRzIGEgcHJlZml4IG9uIHRoZSBzb2NrZXQgYmVmb3JlIGFjdHVhbGx5IHBlcmZvcm1pbmcgYQogCS8vIGhhbmRzaGFrZS4KIAlzZW5kUHJlZml4IHN0cmluZwogCS8vIHNoaW1Xcml0ZXNGaXJzdCBjb250cm9scyB3aGV0aGVyIHRoZSBzaGltIHNlbmRzIGFuIGluaXRpYWwgImhlbGxvIgogCS8vIG1lc3NhZ2UgYmVmb3JlIGRvaW5nIGEgcm91bmR0cmlwIHdpdGggdGhlIHJ1bm5lci4KIAlzaGltV3JpdGVzRmlyc3QgYm9vbAotCS8vIHNoaW1TaHV0c0Rvd24sIGlmIHRydWUsIHJ1bnMgYSB0ZXN0IHdoZXJlIHRoZSBzaGltIHNodXRzIGRvd24gdGhlCi0JLy8gY29ubmVjdGlvbiBpbW1lZGlhdGVseSBhZnRlciB0aGUgaGFuZHNoYWtlIHJhdGhlciB0aGFuIGVjaG9pbmcKLQkvLyBtZXNzYWdlcyBmcm9tIHRoZSBydW5uZXIuCi0Jc2hpbVNodXRzRG93biBib29sCiAJLy8gcmVuZWdvdGlhdGUgaW5kaWNhdGVzIHRoZSB0aGUgY29ubmVjdGlvbiBzaG91bGQgYmUgcmVuZWdvdGlhdGVkCiAJLy8gZHVyaW5nIHRoZSBleGNoYW5nZS4KIAlyZW5lZ290aWF0ZSBib29sCkBAIC0yMjcsMjAgKzIwNCw5NDEgQEAKIAkvLyB0ZXN0VExTVW5pcXVlLCBpZiB0cnVlLCBjYXVzZXMgdGhlIHNoaW0gdG8gc2VuZCB0aGUgdGxzLXVuaXF1ZSB2YWx1ZQogCS8vIHdoaWNoIHdpbGwgYmUgY29tcGFyZWQgYWdhaW5zdCB0aGUgZXhwZWN0ZWQgdmFsdWUuCiAJdGVzdFRMU1VuaXF1ZSBib29sCi0JLy8gc2VuZEVtcHR5UmVjb3JkcyBpcyB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGVtcHR5IHJlY29yZHMgdG8gc2VuZAotCS8vIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHRlc3QgbWVzc2FnZS4KLQlzZW5kRW1wdHlSZWNvcmRzIGludAotCS8vIHNlbmRXYXJuaW5nQWxlcnRzIGlzIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgd2FybmluZyBhbGVydHMgdG8gc2VuZAotCS8vIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHRlc3QgbWVzc2FnZS4KLQlzZW5kV2FybmluZ0FsZXJ0cyBpbnQKLQkvLyBleHBlY3RNZXNzYWdlRHJvcHBlZCwgaWYgdHJ1ZSwgbWVhbnMgdGhlIHRlc3QgbWVzc2FnZSBpcyBleHBlY3RlZCB0bwotCS8vIGJlIGRyb3BwZWQgYnkgdGhlIGNsaWVudCByYXRoZXIgdGhhbiBlY2hvZWQgYmFjay4KLQlleHBlY3RNZXNzYWdlRHJvcHBlZCBib29sCiB9CiAKLXZhciB0ZXN0Q2FzZXMgW110ZXN0Q2FzZQordmFyIHRlc3RDYXNlcyA9IFtddGVzdENhc2V7CisJeworCQluYW1lOiAiQmFkUlNBU2lnbmF0dXJlIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2e1RMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTZ9LAorCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCUludmFsaWRTS1hTaWduYXR1cmU6IHRydWUsCisJCQl9LAorCQl9LAorCQlzaG91bGRGYWlsOiAgICB0cnVlLAorCQlleHBlY3RlZEVycm9yOiAiOkJBRF9TSUdOQVRVUkU6IiwKKwl9LAorCXsKKwkJbmFtZTogIkJhZEVDRFNBU2lnbmF0dXJlIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2e1RMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1Nn0sCisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJSW52YWxpZFNLWFNpZ25hdHVyZTogdHJ1ZSwKKwkJCX0sCisJCQlDZXJ0aWZpY2F0ZXM6IFtdQ2VydGlmaWNhdGV7Z2V0RUNEU0FDZXJ0aWZpY2F0ZSgpfSwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpCQURfU0lHTkFUVVJFOiIsCisJfSwKKwl7CisJCW5hbWU6ICJCYWRFQ0RTQUN1cnZlIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2e1RMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1Nn0sCisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJSW52YWxpZFNLWEN1cnZlOiB0cnVlLAorCQkJfSwKKwkJCUNlcnRpZmljYXRlczogW11DZXJ0aWZpY2F0ZXtnZXRFQ0RTQUNlcnRpZmljYXRlKCl9LAorCQl9LAorCQlzaG91bGRGYWlsOiAgICB0cnVlLAorCQlleHBlY3RlZEVycm9yOiAiOldST05HX0NVUlZFOiIsCisJfSwKKwl7CisJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAorCQluYW1lOiAgICAgIkJhZFJTQVZlcnNpb24iLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUNpcGhlclN1aXRlczogW111aW50MTZ7VExTX1JTQV9XSVRIX1JDNF8xMjhfU0hBfSwKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlSc2FDbGllbnRLZXlFeGNoYW5nZVZlcnNpb246IFZlcnNpb25UTFMxMSwKKwkJCX0sCisJCX0sCisJCXNob3VsZEZhaWw6ICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICI6REVDUllQVElPTl9GQUlMRURfT1JfQkFEX1JFQ09SRF9NQUM6IiwKKwl9LAorCXsKKwkJbmFtZTogIk5vRmFsbGJhY2tTQ1NWIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJRmFpbElmTm90RmFsbGJhY2tTQ1NWOiB0cnVlLAorCQkJfSwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgICAgICB0cnVlLAorCQlleHBlY3RlZExvY2FsRXJyb3I6ICJubyBmYWxsYmFjayBTQ1NWIGZvdW5kIiwKKwl9LAorCXsKKwkJbmFtZTogIlNlbmRGYWxsYmFja1NDU1YiLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlGYWlsSWZOb3RGYWxsYmFja1NDU1Y6IHRydWUsCisJCQl9LAorCQl9LAorCQlmbGFnczogW11zdHJpbmd7Ii1mYWxsYmFjay1zY3N2In0sCisJfSwKKwl7CisJCW5hbWU6ICJDbGllbnRDZXJ0aWZpY2F0ZVR5cGVzIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlDbGllbnRBdXRoOiBSZXF1ZXN0Q2xpZW50Q2VydCwKKwkJCUNsaWVudENlcnRpZmljYXRlVHlwZXM6IFtdYnl0ZXsKKwkJCQlDZXJ0VHlwZURTU1NpZ24sCisJCQkJQ2VydFR5cGVSU0FTaWduLAorCQkJCUNlcnRUeXBlRUNEU0FTaWduLAorCQkJfSwKKwkJfSwKKwkJZmxhZ3M6IFtdc3RyaW5neworCQkJIi1leHBlY3QtY2VydGlmaWNhdGUtdHlwZXMiLAorCQkJYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZVRvU3RyaW5nKFtdYnl0ZXsKKwkJCQlDZXJ0VHlwZURTU1NpZ24sCisJCQkJQ2VydFR5cGVSU0FTaWduLAorCQkJCUNlcnRUeXBlRUNEU0FTaWduLAorCQkJfSksCisJCX0sCisJfSwKKwl7CisJCW5hbWU6ICJOb0NsaWVudENlcnRpZmljYXRlIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlDbGllbnRBdXRoOiBSZXF1aXJlQW55Q2xpZW50Q2VydCwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgICAgICB0cnVlLAorCQlleHBlY3RlZExvY2FsRXJyb3I6ICJjbGllbnQgZGlkbid0IHByb3ZpZGUgYSBjZXJ0aWZpY2F0ZSIsCisJfSwKKwl7CisJCW5hbWU6ICJVbmF1dGhlbnRpY2F0ZWRFQ0RIIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2e1RMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTZ9LAorCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCVVuYXV0aGVudGljYXRlZEVDREg6IHRydWUsCisJCQl9LAorCQl9LAorCQlzaG91bGRGYWlsOiAgICB0cnVlLAorCQlleHBlY3RlZEVycm9yOiAiOlVORVhQRUNURURfTUVTU0FHRToiLAorCX0sCisJeworCQluYW1lOiAiU2tpcENlcnRpZmljYXRlU3RhdHVzIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2e1RMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTZ9LAorCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCVNraXBDZXJ0aWZpY2F0ZVN0YXR1czogdHJ1ZSwKKwkJCX0sCisJCX0sCisJCWZsYWdzOiBbXXN0cmluZ3sKKwkJCSItZW5hYmxlLW9jc3Atc3RhcGxpbmciLAorCQl9LAorCX0sCisJeworCQluYW1lOiAiU2tpcFNlcnZlcktleUV4Y2hhbmdlIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2e1RMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTZ9LAorCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCVNraXBTZXJ2ZXJLZXlFeGNoYW5nZTogdHJ1ZSwKKwkJCX0sCisJCX0sCisJCXNob3VsZEZhaWw6ICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICI6VU5FWFBFQ1RFRF9NRVNTQUdFOiIsCisJfSwKKwl7CisJCW5hbWU6ICJTa2lwQ2hhbmdlQ2lwaGVyU3BlYy1DbGllbnQiLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlTa2lwQ2hhbmdlQ2lwaGVyU3BlYzogdHJ1ZSwKKwkJCX0sCisJCX0sCisJCXNob3VsZEZhaWw6ICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICI6SEFORFNIQUtFX1JFQ09SRF9CRUZPUkVfQ0NTOiIsCisJfSwKKwl7CisJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAorCQluYW1lOiAgICAgIlNraXBDaGFuZ2VDaXBoZXJTcGVjLVNlcnZlciIsCisJCWNvbmZpZzogQ29uZmlneworCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCVNraXBDaGFuZ2VDaXBoZXJTcGVjOiB0cnVlLAorCQkJfSwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpIQU5EU0hBS0VfUkVDT1JEX0JFRk9SRV9DQ1M6IiwKKwl9LAorCXsKKwkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCisJCW5hbWU6ICAgICAiU2tpcENoYW5nZUNpcGhlclNwZWMtU2VydmVyLU5QTiIsCisJCWNvbmZpZzogQ29uZmlneworCQkJTmV4dFByb3RvczogW11zdHJpbmd7ImJhciJ9LAorCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCVNraXBDaGFuZ2VDaXBoZXJTcGVjOiB0cnVlLAorCQkJfSwKKwkJfSwKKwkJZmxhZ3M6IFtdc3RyaW5neworCQkJIi1hZHZlcnRpc2UtbnBuIiwgIlx4MDNmb29ceDAzYmFyXHgwM2JheiIsCisJCX0sCisJCXNob3VsZEZhaWw6ICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICI6SEFORFNIQUtFX1JFQ09SRF9CRUZPUkVfQ0NTOiIsCisJfSwKKwl7CisJCW5hbWU6ICJGcmFnbWVudEFjcm9zc0NoYW5nZUNpcGhlclNwZWMtQ2xpZW50IiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJRnJhZ21lbnRBY3Jvc3NDaGFuZ2VDaXBoZXJTcGVjOiB0cnVlLAorCQkJfSwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpIQU5EU0hBS0VfUkVDT1JEX0JFRk9SRV9DQ1M6IiwKKwl9LAorCXsKKwkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCisJCW5hbWU6ICAgICAiRnJhZ21lbnRBY3Jvc3NDaGFuZ2VDaXBoZXJTcGVjLVNlcnZlciIsCisJCWNvbmZpZzogQ29uZmlneworCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCUZyYWdtZW50QWNyb3NzQ2hhbmdlQ2lwaGVyU3BlYzogdHJ1ZSwKKwkJCX0sCisJCX0sCisJCXNob3VsZEZhaWw6ICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICI6SEFORFNIQUtFX1JFQ09SRF9CRUZPUkVfQ0NTOiIsCisJfSwKKwl7CisJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAorCQluYW1lOiAgICAgIkZyYWdtZW50QWNyb3NzQ2hhbmdlQ2lwaGVyU3BlYy1TZXJ2ZXItTlBOIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlOZXh0UHJvdG9zOiBbXXN0cmluZ3siYmFyIn0sCisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJRnJhZ21lbnRBY3Jvc3NDaGFuZ2VDaXBoZXJTcGVjOiB0cnVlLAorCQkJfSwKKwkJfSwKKwkJZmxhZ3M6IFtdc3RyaW5neworCQkJIi1hZHZlcnRpc2UtbnBuIiwgIlx4MDNmb29ceDAzYmFyXHgwM2JheiIsCisJCX0sCisJCXNob3VsZEZhaWw6ICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICI6SEFORFNIQUtFX1JFQ09SRF9CRUZPUkVfQ0NTOiIsCisJfSwKKwl7CisJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAorCQluYW1lOiAgICAgIkFsZXJ0IiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJU2VuZFNwdXJpb3VzQWxlcnQ6IGFsZXJ0UmVjb3JkT3ZlcmZsb3csCisJCQl9LAorCQl9LAorCQlzaG91bGRGYWlsOiAgICB0cnVlLAorCQlleHBlY3RlZEVycm9yOiAiOlRMU1YxX0FMRVJUX1JFQ09SRF9PVkVSRkxPVzoiLAorCX0sCisJeworCQlwcm90b2NvbDogZHRscywKKwkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCisJCW5hbWU6ICAgICAiQWxlcnQtRFRMUyIsCisJCWNvbmZpZzogQ29uZmlneworCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCVNlbmRTcHVyaW91c0FsZXJ0OiBhbGVydFJlY29yZE92ZXJmbG93LAorCQkJfSwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpUTFNWMV9BTEVSVF9SRUNPUkRfT1ZFUkZMT1c6IiwKKwl9LAorCXsKKwkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCisJCW5hbWU6ICAgICAiRnJhZ21lbnRBbGVydCIsCisJCWNvbmZpZzogQ29uZmlneworCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCUZyYWdtZW50QWxlcnQ6ICAgICB0cnVlLAorCQkJCVNlbmRTcHVyaW91c0FsZXJ0OiBhbGVydFJlY29yZE92ZXJmbG93LAorCQkJfSwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpCQURfQUxFUlQ6IiwKKwl9LAorCXsKKwkJcHJvdG9jb2w6IGR0bHMsCisJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAorCQluYW1lOiAgICAgIkZyYWdtZW50QWxlcnQtRFRMUyIsCisJCWNvbmZpZzogQ29uZmlneworCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCUZyYWdtZW50QWxlcnQ6ICAgICB0cnVlLAorCQkJCVNlbmRTcHVyaW91c0FsZXJ0OiBhbGVydFJlY29yZE92ZXJmbG93LAorCQkJfSwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpCQURfQUxFUlQ6IiwKKwl9LAorCXsKKwkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCisJCW5hbWU6ICAgICAiRWFybHlDaGFuZ2VDaXBoZXJTcGVjLXNlcnZlci0xIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJRWFybHlDaGFuZ2VDaXBoZXJTcGVjOiAxLAorCQkJfSwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpDQ1NfUkVDRUlWRURfRUFSTFk6IiwKKwl9LAorCXsKKwkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCisJCW5hbWU6ICAgICAiRWFybHlDaGFuZ2VDaXBoZXJTcGVjLXNlcnZlci0yIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJRWFybHlDaGFuZ2VDaXBoZXJTcGVjOiAyLAorCQkJfSwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpDQ1NfUkVDRUlWRURfRUFSTFk6IiwKKwl9LAorCXsKKwkJbmFtZTogIlNraXBOZXdTZXNzaW9uVGlja2V0IiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJU2tpcE5ld1Nlc3Npb25UaWNrZXQ6IHRydWUsCisJCQl9LAorCQl9LAorCQlzaG91bGRGYWlsOiAgICB0cnVlLAorCQlleHBlY3RlZEVycm9yOiAiOkNDU19SRUNFSVZFRF9FQVJMWToiLAorCX0sCisJeworCQl0ZXN0VHlwZTogc2VydmVyVGVzdCwKKwkJbmFtZTogICAgICJGYWxsYmFja1NDU1YiLAorCQljb25maWc6IENvbmZpZ3sKKwkJCU1heFZlcnNpb246IFZlcnNpb25UTFMxMSwKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlTZW5kRmFsbGJhY2tTQ1NWOiB0cnVlLAorCQkJfSwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpJTkFQUFJPUFJJQVRFX0ZBTExCQUNLOiIsCisJfSwKKwl7CisJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAorCQluYW1lOiAgICAgIkZhbGxiYWNrU0NTVi1WZXJzaW9uTWF0Y2giLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlTZW5kRmFsbGJhY2tTQ1NWOiB0cnVlLAorCQkJfSwKKwkJfSwKKwl9LAorCXsKKwkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCisJCW5hbWU6ICAgICAiRnJhZ21lbnRlZENsaWVudFZlcnNpb24iLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlNYXhIYW5kc2hha2VSZWNvcmRMZW5ndGg6IDEsCisJCQkJRnJhZ21lbnRDbGllbnRWZXJzaW9uOiAgICB0cnVlLAorCQkJfSwKKwkJfSwKKwkJZXhwZWN0ZWRWZXJzaW9uOiBWZXJzaW9uVExTMTIsCisJfSwKKwl7CisJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAorCQluYW1lOiAgICAgIk1pbm9yVmVyc2lvblRvbGVyYW5jZSIsCisJCWNvbmZpZzogQ29uZmlneworCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCVNlbmRDbGllbnRWZXJzaW9uOiAweDAzZmYsCisJCQl9LAorCQl9LAorCQlleHBlY3RlZFZlcnNpb246IFZlcnNpb25UTFMxMiwKKwl9LAorCXsKKwkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCisJCW5hbWU6ICAgICAiTWFqb3JWZXJzaW9uVG9sZXJhbmNlIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJU2VuZENsaWVudFZlcnNpb246IDB4MDQwMCwKKwkJCX0sCisJCX0sCisJCWV4cGVjdGVkVmVyc2lvbjogVmVyc2lvblRMUzEyLAorCX0sCisJeworCQl0ZXN0VHlwZTogc2VydmVyVGVzdCwKKwkJbmFtZTogICAgICJWZXJzaW9uVG9vTG93IiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJU2VuZENsaWVudFZlcnNpb246IDB4MDIwMCwKKwkJCX0sCisJCX0sCisJCXNob3VsZEZhaWw6ICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICI6VU5TVVBQT1JURURfUFJPVE9DT0w6IiwKKwl9LAorCXsKKwkJdGVzdFR5cGU6ICAgICAgc2VydmVyVGVzdCwKKwkJbmFtZTogICAgICAgICAgIkh0dHBHRVQiLAorCQlzZW5kUHJlZml4OiAgICAiR0VUIC8gSFRUUC8xLjBcbiIsCisJCXNob3VsZEZhaWw6ICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICI6SFRUUF9SRVFVRVNUOiIsCisJfSwKKwl7CisJCXRlc3RUeXBlOiAgICAgIHNlcnZlclRlc3QsCisJCW5hbWU6ICAgICAgICAgICJIdHRwUE9TVCIsCisJCXNlbmRQcmVmaXg6ICAgICJQT1NUIC8gSFRUUC8xLjBcbiIsCisJCXNob3VsZEZhaWw6ICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICI6SFRUUF9SRVFVRVNUOiIsCisJfSwKKwl7CisJCXRlc3RUeXBlOiAgICAgIHNlcnZlclRlc3QsCisJCW5hbWU6ICAgICAgICAgICJIdHRwSEVBRCIsCisJCXNlbmRQcmVmaXg6ICAgICJIRUFEIC8gSFRUUC8xLjBcbiIsCisJCXNob3VsZEZhaWw6ICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICI6SFRUUF9SRVFVRVNUOiIsCisJfSwKKwl7CisJCXRlc3RUeXBlOiAgICAgIHNlcnZlclRlc3QsCisJCW5hbWU6ICAgICAgICAgICJIdHRwUFVUIiwKKwkJc2VuZFByZWZpeDogICAgIlBVVCAvIEhUVFAvMS4wXG4iLAorCQlzaG91bGRGYWlsOiAgICB0cnVlLAorCQlleHBlY3RlZEVycm9yOiAiOkhUVFBfUkVRVUVTVDoiLAorCX0sCisJeworCQl0ZXN0VHlwZTogICAgICBzZXJ2ZXJUZXN0LAorCQluYW1lOiAgICAgICAgICAiSHR0cENPTk5FQ1QiLAorCQlzZW5kUHJlZml4OiAgICAiQ09OTkVDVCB3d3cuZ29vZ2xlLmNvbTo0NDMgSFRUUC8xLjBcbiIsCisJCXNob3VsZEZhaWw6ICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICI6SFRUUFNfUFJPWFlfUkVRVUVTVDoiLAorCX0sCisJeworCQl0ZXN0VHlwZTogICAgICBzZXJ2ZXJUZXN0LAorCQluYW1lOiAgICAgICAgICAiR2FyYmFnZSIsCisJCXNlbmRQcmVmaXg6ICAgICJibGFoIiwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpVTktOT1dOX1BST1RPQ09MOiIsCisJfSwKKwl7CisJCW5hbWU6ICJTa2lwQ2lwaGVyVmVyc2lvbkNoZWNrIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2e1RMU19SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTZ9LAorCQkJTWF4VmVyc2lvbjogICBWZXJzaW9uVExTMTEsCisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJU2tpcENpcGhlclZlcnNpb25DaGVjazogdHJ1ZSwKKwkJCX0sCisJCX0sCisJCXNob3VsZEZhaWw6ICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICI6V1JPTkdfQ0lQSEVSX1JFVFVSTkVEOiIsCisJfSwKKwl7CisJCW5hbWU6ICJSU0FFcGhlbWVyYWxLZXkiLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUNpcGhlclN1aXRlczogW111aW50MTZ7VExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQX0sCisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJUlNBRXBoZW1lcmFsS2V5OiB0cnVlLAorCQkJfSwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpVTkVYUEVDVEVEX01FU1NBR0U6IiwKKwl9LAorCXsKKwkJbmFtZTogICAgICAgICAgIkRpc2FibGVFdmVyeXRoaW5nIiwKKwkJZmxhZ3M6ICAgICAgICAgW11zdHJpbmd7Ii1uby10bHMxMiIsICItbm8tdGxzMTEiLCAiLW5vLXRsczEiLCAiLW5vLXNzbDMifSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpXUk9OR19TU0xfVkVSU0lPTjoiLAorCX0sCisJeworCQlwcm90b2NvbDogICAgICBkdGxzLAorCQluYW1lOiAgICAgICAgICAiRGlzYWJsZUV2ZXJ5dGhpbmctRFRMUyIsCisJCWZsYWdzOiAgICAgICAgIFtdc3RyaW5neyItbm8tdGxzMTIiLCAiLW5vLXRsczEifSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpXUk9OR19TU0xfVkVSU0lPTjoiLAorCX0sCisJeworCQluYW1lOiAiTm9TaGFyZWRDaXBoZXIiLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUNpcGhlclN1aXRlczogW111aW50MTZ7fSwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpIQU5EU0hBS0VfRkFJTFVSRV9PTl9DTElFTlRfSEVMTE86IiwKKwl9LAorCXsKKwkJcHJvdG9jb2w6IGR0bHMsCisJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAorCQluYW1lOiAgICAgIk1UVSIsCisJCWNvbmZpZzogQ29uZmlneworCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCU1heFBhY2tldExlbmd0aDogMjU2LAorCQkJfSwKKwkJfSwKKwkJZmxhZ3M6IFtdc3RyaW5neyItbXR1IiwgIjI1NiJ9LAorCX0sCisJeworCQlwcm90b2NvbDogZHRscywKKwkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCisJCW5hbWU6ICAgICAiTVRVRXhjZWVkZWQiLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlNYXhQYWNrZXRMZW5ndGg6IDI1NSwKKwkJCX0sCisJCX0sCisJCWZsYWdzOiAgICAgICAgICAgICAgW11zdHJpbmd7Ii1tdHUiLCAiMjU2In0sCisJCXNob3VsZEZhaWw6ICAgICAgICAgdHJ1ZSwKKwkJZXhwZWN0ZWRMb2NhbEVycm9yOiAiZHRsczogZXhjZWVkZWQgbWF4aW11bSBwYWNrZXQgbGVuZ3RoIiwKKwl9LAorCXsKKwkJbmFtZTogIkNlcnRNaXNtYXRjaFJTQSIsCisJCWNvbmZpZzogQ29uZmlneworCQkJQ2lwaGVyU3VpdGVzOiBbXXVpbnQxNntUTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTZ9LAorCQkJQ2VydGlmaWNhdGVzOiBbXUNlcnRpZmljYXRle2dldEVDRFNBQ2VydGlmaWNhdGUoKX0sCisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJU2VuZENpcGhlclN1aXRlOiBUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2LAorCQkJfSwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpXUk9OR19DRVJUSUZJQ0FURV9UWVBFOiIsCisJfSwKKwl7CisJCW5hbWU6ICJDZXJ0TWlzbWF0Y2hFQ0RTQSIsCisJCWNvbmZpZzogQ29uZmlneworCQkJQ2lwaGVyU3VpdGVzOiBbXXVpbnQxNntUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2fSwKKwkJCUNlcnRpZmljYXRlczogW11DZXJ0aWZpY2F0ZXtnZXRSU0FDZXJ0aWZpY2F0ZSgpfSwKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlTZW5kQ2lwaGVyU3VpdGU6IFRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiwKKwkJCX0sCisJCX0sCisJCXNob3VsZEZhaWw6ICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICI6V1JPTkdfQ0VSVElGSUNBVEVfVFlQRToiLAorCX0sCisJeworCQluYW1lOiAgICAgICAgICAgICAiVExTRmF0YWxCYWRQYWNrZXRzIiwKKwkJZGFtYWdlRmlyc3RXcml0ZTogdHJ1ZSwKKwkJc2hvdWxkRmFpbDogICAgICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogICAgIjpERUNSWVBUSU9OX0ZBSUxFRF9PUl9CQURfUkVDT1JEX01BQzoiLAorCX0sCisJeworCQlwcm90b2NvbDogICAgICAgICBkdGxzLAorCQluYW1lOiAgICAgICAgICAgICAiRFRMU0lnbm9yZUJhZFBhY2tldHMiLAorCQlkYW1hZ2VGaXJzdFdyaXRlOiB0cnVlLAorCX0sCisJeworCQlwcm90b2NvbDogICAgICAgICBkdGxzLAorCQluYW1lOiAgICAgICAgICAgICAiRFRMU0lnbm9yZUJhZFBhY2tldHMtQXN5bmMiLAorCQlkYW1hZ2VGaXJzdFdyaXRlOiB0cnVlLAorCQlmbGFnczogICAgICAgICAgICBbXXN0cmluZ3siLWFzeW5jIn0sCisJfSwKKwl7CisJCW5hbWU6ICJBcHBEYXRhQWZ0ZXJDaGFuZ2VDaXBoZXJTcGVjIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJQXBwRGF0YUFmdGVyQ2hhbmdlQ2lwaGVyU3BlYzogW11ieXRlKCJURVNUIE1FU1NBR0UiKSwKKwkJCX0sCisJCX0sCisJCXNob3VsZEZhaWw6ICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICI6REFUQV9CRVRXRUVOX0NDU19BTkRfRklOSVNIRUQ6IiwKKwl9LAorCXsKKwkJcHJvdG9jb2w6IGR0bHMsCisJCW5hbWU6ICAgICAiQXBwRGF0YUFmdGVyQ2hhbmdlQ2lwaGVyU3BlYy1EVExTIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJQXBwRGF0YUFmdGVyQ2hhbmdlQ2lwaGVyU3BlYzogW11ieXRlKCJURVNUIE1FU1NBR0UiKSwKKwkJCX0sCisJCX0sCisJCS8vIEJvcmluZ1NTTCdzIERUTFMgaW1wbGVtZW50YXRpb24gd2lsbCBkcm9wIHRoZSBvdXQtb2Ytb3JkZXIKKwkJLy8gYXBwbGljYXRpb24gZGF0YS4KKwl9LAorCXsKKwkJbmFtZTogIkFsZXJ0QWZ0ZXJDaGFuZ2VDaXBoZXJTcGVjIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJQWxlcnRBZnRlckNoYW5nZUNpcGhlclNwZWM6IGFsZXJ0UmVjb3JkT3ZlcmZsb3csCisJCQl9LAorCQl9LAorCQlzaG91bGRGYWlsOiAgICB0cnVlLAorCQlleHBlY3RlZEVycm9yOiAiOlRMU1YxX0FMRVJUX1JFQ09SRF9PVkVSRkxPVzoiLAorCX0sCisJeworCQlwcm90b2NvbDogZHRscywKKwkJbmFtZTogICAgICJBbGVydEFmdGVyQ2hhbmdlQ2lwaGVyU3BlYy1EVExTIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJQWxlcnRBZnRlckNoYW5nZUNpcGhlclNwZWM6IGFsZXJ0UmVjb3JkT3ZlcmZsb3csCisJCQl9LAorCQl9LAorCQlzaG91bGRGYWlsOiAgICB0cnVlLAorCQlleHBlY3RlZEVycm9yOiAiOlRMU1YxX0FMRVJUX1JFQ09SRF9PVkVSRkxPVzoiLAorCX0sCisJeworCQlwcm90b2NvbDogZHRscywKKwkJbmFtZTogICAgICJSZW9yZGVySGFuZHNoYWtlRnJhZ21lbnRzLVNtYWxsLURUTFMiLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlSZW9yZGVySGFuZHNoYWtlRnJhZ21lbnRzOiB0cnVlLAorCQkJCS8vIFNtYWxsIGVub3VnaCB0aGF0IGV2ZXJ5IGhhbmRzaGFrZSBtZXNzYWdlIGlzCisJCQkJLy8gZnJhZ21lbnRlZC4KKwkJCQlNYXhIYW5kc2hha2VSZWNvcmRMZW5ndGg6IDIsCisJCQl9LAorCQl9LAorCX0sCisJeworCQlwcm90b2NvbDogZHRscywKKwkJbmFtZTogICAgICJSZW9yZGVySGFuZHNoYWtlRnJhZ21lbnRzLUxhcmdlLURUTFMiLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlSZW9yZGVySGFuZHNoYWtlRnJhZ21lbnRzOiB0cnVlLAorCQkJCS8vIExhcmdlIGVub3VnaCB0aGF0IG5vIGhhbmRzaGFrZSBtZXNzYWdlIGlzCisJCQkJLy8gZnJhZ21lbnRlZC4KKwkJCQlNYXhIYW5kc2hha2VSZWNvcmRMZW5ndGg6IDIwNDgsCisJCQl9LAorCQl9LAorCX0sCisJeworCQlwcm90b2NvbDogZHRscywKKwkJbmFtZTogICAgICJNaXhDb21wbGV0ZU1lc3NhZ2VXaXRoRnJhZ21lbnRzLURUTFMiLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlSZW9yZGVySGFuZHNoYWtlRnJhZ21lbnRzOiAgICAgICB0cnVlLAorCQkJCU1peENvbXBsZXRlTWVzc2FnZVdpdGhGcmFnbWVudHM6IHRydWUsCisJCQkJTWF4SGFuZHNoYWtlUmVjb3JkTGVuZ3RoOiAgICAgICAgMiwKKwkJCX0sCisJCX0sCisJfSwKKwl7CisJCW5hbWU6ICJTZW5kSW52YWxpZFJlY29yZFR5cGUiLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlTZW5kSW52YWxpZFJlY29yZFR5cGU6IHRydWUsCisJCQl9LAorCQl9LAorCQlzaG91bGRGYWlsOiAgICB0cnVlLAorCQlleHBlY3RlZEVycm9yOiAiOlVORVhQRUNURURfUkVDT1JEOiIsCisJfSwKKwl7CisJCXByb3RvY29sOiBkdGxzLAorCQluYW1lOiAgICAgIlNlbmRJbnZhbGlkUmVjb3JkVHlwZS1EVExTIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJU2VuZEludmFsaWRSZWNvcmRUeXBlOiB0cnVlLAorCQkJfSwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpVTkVYUEVDVEVEX1JFQ09SRDoiLAorCX0sCisJeworCQluYW1lOiAiRmFsc2VTdGFydC1Ta2lwU2VydmVyU2Vjb25kTGVnIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2e1RMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTZ9LAorCQkJTmV4dFByb3RvczogICBbXXN0cmluZ3siZm9vIn0sCisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJU2tpcE5ld1Nlc3Npb25UaWNrZXQ6IHRydWUsCisJCQkJU2tpcENoYW5nZUNpcGhlclNwZWM6IHRydWUsCisJCQkJU2tpcEZpbmlzaGVkOiAgICAgICAgIHRydWUsCisJCQkJRXhwZWN0RmFsc2VTdGFydDogICAgIHRydWUsCisJCQl9LAorCQl9LAorCQlmbGFnczogW11zdHJpbmd7CisJCQkiLWZhbHNlLXN0YXJ0IiwKKwkJCSItaGFuZHNoYWtlLW5ldmVyLWRvbmUiLAorCQkJIi1hZHZlcnRpc2UtYWxwbiIsICJceDAzZm9vIiwKKwkJfSwKKwkJc2hpbVdyaXRlc0ZpcnN0OiB0cnVlLAorCQlzaG91bGRGYWlsOiAgICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICAgIjpVTkVYUEVDVEVEX1JFQ09SRDoiLAorCX0sCisJeworCQluYW1lOiAiRmFsc2VTdGFydC1Ta2lwU2VydmVyU2Vjb25kTGVnLUltcGxpY2l0IiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2e1RMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTZ9LAorCQkJTmV4dFByb3RvczogICBbXXN0cmluZ3siZm9vIn0sCisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJU2tpcE5ld1Nlc3Npb25UaWNrZXQ6IHRydWUsCisJCQkJU2tpcENoYW5nZUNpcGhlclNwZWM6IHRydWUsCisJCQkJU2tpcEZpbmlzaGVkOiAgICAgICAgIHRydWUsCisJCQl9LAorCQl9LAorCQlmbGFnczogW11zdHJpbmd7CisJCQkiLWltcGxpY2l0LWhhbmRzaGFrZSIsCisJCQkiLWZhbHNlLXN0YXJ0IiwKKwkJCSItaGFuZHNoYWtlLW5ldmVyLWRvbmUiLAorCQkJIi1hZHZlcnRpc2UtYWxwbiIsICJceDAzZm9vIiwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpVTkVYUEVDVEVEX1JFQ09SRDoiLAorCX0sCisJeworCQl0ZXN0VHlwZTogICAgICAgICAgIHNlcnZlclRlc3QsCisJCW5hbWU6ICAgICAgICAgICAgICAgIkZhaWxFYXJseUNhbGxiYWNrIiwKKwkJZmxhZ3M6ICAgICAgICAgICAgICBbXXN0cmluZ3siLWZhaWwtZWFybHktY2FsbGJhY2sifSwKKwkJc2hvdWxkRmFpbDogICAgICAgICB0cnVlLAorCQlleHBlY3RlZEVycm9yOiAgICAgICI6Q09OTkVDVElPTl9SRUpFQ1RFRDoiLAorCQlleHBlY3RlZExvY2FsRXJyb3I6ICJyZW1vdGUgZXJyb3I6IGFjY2VzcyBkZW5pZWQiLAorCX0sCisJeworCQluYW1lOiAiV3JvbmdNZXNzYWdlVHlwZSIsCisJCWNvbmZpZzogQ29uZmlneworCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCVdyb25nQ2VydGlmaWNhdGVNZXNzYWdlVHlwZTogdHJ1ZSwKKwkJCX0sCisJCX0sCisJCXNob3VsZEZhaWw6ICAgICAgICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogICAgICAiOlVORVhQRUNURURfTUVTU0FHRToiLAorCQlleHBlY3RlZExvY2FsRXJyb3I6ICJyZW1vdGUgZXJyb3I6IHVuZXhwZWN0ZWQgbWVzc2FnZSIsCisJfSwKKwl7CisJCXByb3RvY29sOiBkdGxzLAorCQluYW1lOiAgICAgIldyb25nTWVzc2FnZVR5cGUtRFRMUyIsCisJCWNvbmZpZzogQ29uZmlneworCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCVdyb25nQ2VydGlmaWNhdGVNZXNzYWdlVHlwZTogdHJ1ZSwKKwkJCX0sCisJCX0sCisJCXNob3VsZEZhaWw6ICAgICAgICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogICAgICAiOlVORVhQRUNURURfTUVTU0FHRToiLAorCQlleHBlY3RlZExvY2FsRXJyb3I6ICJyZW1vdGUgZXJyb3I6IHVuZXhwZWN0ZWQgbWVzc2FnZSIsCisJfSwKKwl7CisJCXByb3RvY29sOiBkdGxzLAorCQluYW1lOiAgICAgIkZyYWdtZW50TWVzc2FnZVR5cGVNaXNtYXRjaC1EVExTIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJTWF4SGFuZHNoYWtlUmVjb3JkTGVuZ3RoOiAgICAyLAorCQkJCUZyYWdtZW50TWVzc2FnZVR5cGVNaXNtYXRjaDogdHJ1ZSwKKwkJCX0sCisJCX0sCisJCXNob3VsZEZhaWw6ICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICI6RlJBR01FTlRfTUlTTUFUQ0g6IiwKKwl9LAorCXsKKwkJcHJvdG9jb2w6IGR0bHMsCisJCW5hbWU6ICAgICAiRnJhZ21lbnRNZXNzYWdlTGVuZ3RoTWlzbWF0Y2gtRFRMUyIsCisJCWNvbmZpZzogQ29uZmlneworCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCU1heEhhbmRzaGFrZVJlY29yZExlbmd0aDogICAgICAyLAorCQkJCUZyYWdtZW50TWVzc2FnZUxlbmd0aE1pc21hdGNoOiB0cnVlLAorCQkJfSwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpGUkFHTUVOVF9NSVNNQVRDSDoiLAorCX0sCisJeworCQlwcm90b2NvbDogZHRscywKKwkJbmFtZTogICAgICJTcGxpdEZyYWdtZW50SGVhZGVyLURUTFMiLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlTcGxpdEZyYWdtZW50SGVhZGVyOiB0cnVlLAorCQkJfSwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpVTkVYUEVDVEVEX01FU1NBR0U6IiwKKwl9LAorCXsKKwkJcHJvdG9jb2w6IGR0bHMsCisJCW5hbWU6ICAgICAiU3BsaXRGcmFnbWVudEJvZHktRFRMUyIsCisJCWNvbmZpZzogQ29uZmlneworCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCVNwbGl0RnJhZ21lbnRCb2R5OiB0cnVlLAorCQkJfSwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpVTkVYUEVDVEVEX01FU1NBR0U6IiwKKwl9LAorCXsKKwkJcHJvdG9jb2w6IGR0bHMsCisJCW5hbWU6ICAgICAiU2VuZEVtcHR5RnJhZ21lbnRzLURUTFMiLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlTZW5kRW1wdHlGcmFnbWVudHM6IHRydWUsCisJCQl9LAorCQl9LAorCX0sCisJeworCQluYW1lOiAiVW5zdXBwb3J0ZWRDaXBoZXJTdWl0ZSIsCisJCWNvbmZpZzogQ29uZmlneworCQkJQ2lwaGVyU3VpdGVzOiBbXXVpbnQxNntUTFNfUlNBX1dJVEhfUkM0XzEyOF9TSEF9LAorCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCUlnbm9yZVBlZXJDaXBoZXJQcmVmZXJlbmNlczogdHJ1ZSwKKwkJCX0sCisJCX0sCisJCWZsYWdzOiAgICAgICAgIFtdc3RyaW5neyItY2lwaGVyIiwgIkRFRkFVTFQ6IVJDNCJ9LAorCQlzaG91bGRGYWlsOiAgICB0cnVlLAorCQlleHBlY3RlZEVycm9yOiAiOldST05HX0NJUEhFUl9SRVRVUk5FRDoiLAorCX0sCisJeworCQluYW1lOiAiVW5zdXBwb3J0ZWRDdXJ2ZSIsCisJCWNvbmZpZzogQ29uZmlneworCQkJQ2lwaGVyU3VpdGVzOiBbXXVpbnQxNntUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2fSwKKwkJCS8vIEJvcmluZ1NTTCBpbXBsZW1lbnRzIFAtMjI0IGJ1dCBkb2Vzbid0IGVuYWJsZSBpdCBieQorCQkJLy8gZGVmYXVsdC4KKwkJCUN1cnZlUHJlZmVyZW5jZXM6IFtdQ3VydmVJRHtDdXJ2ZVAyMjR9LAorCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCUlnbm9yZVBlZXJDdXJ2ZVByZWZlcmVuY2VzOiB0cnVlLAorCQkJfSwKKwkJfSwKKwkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogIjpXUk9OR19DVVJWRToiLAorCX0sCisJeworCQluYW1lOiAiU2VuZFdhcm5pbmdBbGVydHMiLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlTZW5kV2FybmluZ0FsZXJ0czogYWxlcnRBY2Nlc3NEZW5pZWQsCisJCQl9LAorCQl9LAorCX0sCisJeworCQlwcm90b2NvbDogZHRscywKKwkJbmFtZTogICAgICJTZW5kV2FybmluZ0FsZXJ0cy1EVExTIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJU2VuZFdhcm5pbmdBbGVydHM6IGFsZXJ0QWNjZXNzRGVuaWVkLAorCQkJfSwKKwkJfSwKKwl9LAorCXsKKwkJbmFtZTogIkJhZEZpbmlzaGVkIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJQmFkRmluaXNoZWQ6IHRydWUsCisJCQl9LAorCQl9LAorCQlzaG91bGRGYWlsOiAgICB0cnVlLAorCQlleHBlY3RlZEVycm9yOiAiOkRJR0VTVF9DSEVDS19GQUlMRUQ6IiwKKwl9LAorCXsKKwkJbmFtZTogIkZhbHNlU3RhcnQtQmFkRmluaXNoZWQiLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUNpcGhlclN1aXRlczogW111aW50MTZ7VExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1Nn0sCisJCQlOZXh0UHJvdG9zOiAgIFtdc3RyaW5neyJmb28ifSwKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlCYWRGaW5pc2hlZDogICAgICB0cnVlLAorCQkJCUV4cGVjdEZhbHNlU3RhcnQ6IHRydWUsCisJCQl9LAorCQl9LAorCQlmbGFnczogW11zdHJpbmd7CisJCQkiLWZhbHNlLXN0YXJ0IiwKKwkJCSItaGFuZHNoYWtlLW5ldmVyLWRvbmUiLAorCQkJIi1hZHZlcnRpc2UtYWxwbiIsICJceDAzZm9vIiwKKwkJfSwKKwkJc2hpbVdyaXRlc0ZpcnN0OiB0cnVlLAorCQlzaG91bGRGYWlsOiAgICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICAgIjpESUdFU1RfQ0hFQ0tfRkFJTEVEOiIsCisJfSwKKwl7CisJCW5hbWU6ICJOb0ZhbHNlU3RhcnQtTm9BTFBOIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2e1RMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTZ9LAorCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCUV4cGVjdEZhbHNlU3RhcnQ6ICAgICAgICAgIHRydWUsCisJCQkJQWxlcnRCZWZvcmVGYWxzZVN0YXJ0VGVzdDogYWxlcnRBY2Nlc3NEZW5pZWQsCisJCQl9LAorCQl9LAorCQlmbGFnczogW11zdHJpbmd7CisJCQkiLWZhbHNlLXN0YXJ0IiwKKwkJfSwKKwkJc2hpbVdyaXRlc0ZpcnN0OiAgICB0cnVlLAorCQlzaG91bGRGYWlsOiAgICAgICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICAgICAgIjpUTFNWMV9BTEVSVF9BQ0NFU1NfREVOSUVEOiIsCisJCWV4cGVjdGVkTG9jYWxFcnJvcjogInRsczogcGVlciBkaWQgbm90IGZhbHNlIHN0YXJ0OiBFT0YiLAorCX0sCisJeworCQluYW1lOiAiTm9GYWxzZVN0YXJ0LU5vQUVBRCIsCisJCWNvbmZpZzogQ29uZmlneworCQkJQ2lwaGVyU3VpdGVzOiBbXXVpbnQxNntUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBfSwKKwkJCU5leHRQcm90b3M6ICAgW11zdHJpbmd7ImZvbyJ9LAorCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCUV4cGVjdEZhbHNlU3RhcnQ6ICAgICAgICAgIHRydWUsCisJCQkJQWxlcnRCZWZvcmVGYWxzZVN0YXJ0VGVzdDogYWxlcnRBY2Nlc3NEZW5pZWQsCisJCQl9LAorCQl9LAorCQlmbGFnczogW11zdHJpbmd7CisJCQkiLWZhbHNlLXN0YXJ0IiwKKwkJCSItYWR2ZXJ0aXNlLWFscG4iLCAiXHgwM2ZvbyIsCisJCX0sCisJCXNoaW1Xcml0ZXNGaXJzdDogICAgdHJ1ZSwKKwkJc2hvdWxkRmFpbDogICAgICAgICB0cnVlLAorCQlleHBlY3RlZEVycm9yOiAgICAgICI6VExTVjFfQUxFUlRfQUNDRVNTX0RFTklFRDoiLAorCQlleHBlY3RlZExvY2FsRXJyb3I6ICJ0bHM6IHBlZXIgZGlkIG5vdCBmYWxzZSBzdGFydDogRU9GIiwKKwl9LAorCXsKKwkJbmFtZTogIk5vRmFsc2VTdGFydC1SU0EiLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUNpcGhlclN1aXRlczogW111aW50MTZ7VExTX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1Nn0sCisJCQlOZXh0UHJvdG9zOiAgIFtdc3RyaW5neyJmb28ifSwKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlFeHBlY3RGYWxzZVN0YXJ0OiAgICAgICAgICB0cnVlLAorCQkJCUFsZXJ0QmVmb3JlRmFsc2VTdGFydFRlc3Q6IGFsZXJ0QWNjZXNzRGVuaWVkLAorCQkJfSwKKwkJfSwKKwkJZmxhZ3M6IFtdc3RyaW5neworCQkJIi1mYWxzZS1zdGFydCIsCisJCQkiLWFkdmVydGlzZS1hbHBuIiwgIlx4MDNmb28iLAorCQl9LAorCQlzaGltV3JpdGVzRmlyc3Q6ICAgIHRydWUsCisJCXNob3VsZEZhaWw6ICAgICAgICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogICAgICAiOlRMU1YxX0FMRVJUX0FDQ0VTU19ERU5JRUQ6IiwKKwkJZXhwZWN0ZWRMb2NhbEVycm9yOiAidGxzOiBwZWVyIGRpZCBub3QgZmFsc2Ugc3RhcnQ6IEVPRiIsCisJfSwKKwl7CisJCW5hbWU6ICJOb0ZhbHNlU3RhcnQtREhFX1JTQSIsCisJCWNvbmZpZzogQ29uZmlneworCQkJQ2lwaGVyU3VpdGVzOiBbXXVpbnQxNntUTFNfREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1Nn0sCisJCQlOZXh0UHJvdG9zOiAgIFtdc3RyaW5neyJmb28ifSwKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlFeHBlY3RGYWxzZVN0YXJ0OiAgICAgICAgICB0cnVlLAorCQkJCUFsZXJ0QmVmb3JlRmFsc2VTdGFydFRlc3Q6IGFsZXJ0QWNjZXNzRGVuaWVkLAorCQkJfSwKKwkJfSwKKwkJZmxhZ3M6IFtdc3RyaW5neworCQkJIi1mYWxzZS1zdGFydCIsCisJCQkiLWFkdmVydGlzZS1hbHBuIiwgIlx4MDNmb28iLAorCQl9LAorCQlzaGltV3JpdGVzRmlyc3Q6ICAgIHRydWUsCisJCXNob3VsZEZhaWw6ICAgICAgICAgdHJ1ZSwKKwkJZXhwZWN0ZWRFcnJvcjogICAgICAiOlRMU1YxX0FMRVJUX0FDQ0VTU19ERU5JRUQ6IiwKKwkJZXhwZWN0ZWRMb2NhbEVycm9yOiAidGxzOiBwZWVyIGRpZCBub3QgZmFsc2Ugc3RhcnQ6IEVPRiIsCisJfSwKKwl7CisJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAorCQluYW1lOiAgICAgIk5vU3VwcG9ydGVkQ3VydmVzIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2e1RMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTZ9LAorCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCU5vU3VwcG9ydGVkQ3VydmVzOiB0cnVlLAorCQkJfSwKKwkJfSwKKwl9LAorCXsKKwkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCisJCW5hbWU6ICAgICAiTm9Db21tb25DdXJ2ZXMiLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUNpcGhlclN1aXRlczogW111aW50MTZ7CisJCQkJVExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiwKKwkJCQlUTFNfREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiwKKwkJCX0sCisJCQlDdXJ2ZVByZWZlcmVuY2VzOiBbXUN1cnZlSUR7Q3VydmVQMjI0fSwKKwkJfSwKKwkJZXhwZWN0ZWRDaXBoZXI6IFRMU19ESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2LAorCX0sCisJeworCQlwcm90b2NvbDogZHRscywKKwkJbmFtZTogICAgICJTZW5kU3BsaXRBbGVydC1TeW5jIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJU2VuZFNwbGl0QWxlcnQ6IHRydWUsCisJCQl9LAorCQl9LAorCX0sCisJeworCQlwcm90b2NvbDogZHRscywKKwkJbmFtZTogICAgICJTZW5kU3BsaXRBbGVydC1Bc3luYyIsCisJCWNvbmZpZzogQ29uZmlneworCQkJQnVnczogUHJvdG9jb2xCdWdzeworCQkJCVNlbmRTcGxpdEFsZXJ0OiB0cnVlLAorCQkJfSwKKwkJfSwKKwkJZmxhZ3M6IFtdc3RyaW5neyItYXN5bmMifSwKKwl9LAorCXsKKwkJcHJvdG9jb2w6IGR0bHMsCisJCW5hbWU6ICAgICAiUGFja0RUTFNIYW5kc2hha2UiLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlNYXhIYW5kc2hha2VSZWNvcmRMZW5ndGg6IDIsCisJCQkJUGFja0hhbmRzaGFrZUZyYWdtZW50czogICAyMCwKKwkJCQlQYWNrSGFuZHNoYWtlUmVjb3JkczogICAgIDIwMCwKKwkJCX0sCisJCX0sCisJfSwKKwl7CisJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAorCQlwcm90b2NvbDogZHRscywKKwkJbmFtZTogICAgICJOb1JDNC1EVExTIiwKKwkJY29uZmlnOiBDb25maWd7CisJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2e1RMU19FQ0RIRV9SU0FfV0lUSF9SQzRfMTI4X1NIQX0sCisJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7CisJCQkJRW5hYmxlQWxsQ2lwaGVyc0luRFRMUzogdHJ1ZSwKKwkJCX0sCisJCX0sCisJCXNob3VsZEZhaWw6ICAgIHRydWUsCisJCWV4cGVjdGVkRXJyb3I6ICI6Tk9fU0hBUkVEX0NJUEhFUjoiLAorCX0sCit9CiAKLWZ1bmMgZG9FeGNoYW5nZSh0ZXN0ICp0ZXN0Q2FzZSwgY29uZmlnICpDb25maWcsIGNvbm4gbmV0LkNvbm4sIGlzUmVzdW1lIGJvb2wpIGVycm9yIHsKK2Z1bmMgZG9FeGNoYW5nZSh0ZXN0ICp0ZXN0Q2FzZSwgY29uZmlnICpDb25maWcsIGNvbm4gbmV0LkNvbm4sIG1lc3NhZ2VMZW4gaW50LCBpc1Jlc3VtZSBib29sKSBlcnJvciB7CiAJdmFyIGNvbm5EZWJ1ZyAqcmVjb3JkaW5nQ29ubgogCXZhciBjb25uRGFtYWdlICpkYW1hZ2VBZGFwdG9yCiAJaWYgKmZsYWdEZWJ1ZyB7CkBAIC0yODUsNyArMTE4Myw2IEBACiAJCQl0bHNDb25uID0gQ2xpZW50KGNvbm4sIGNvbmZpZykKIAkJfQogCX0KLQlkZWZlciB0bHNDb25uLkNsb3NlKCkKIAogCWlmIGVyciA6PSB0bHNDb25uLkhhbmRzaGFrZSgpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIGVycgpAQCAtMzM4LDE4ICsxMjM1LDYgQEAKIAkJcmV0dXJuIGZtdC5FcnJvcmYoIlNSVFAgcHJvZmlsZSBtaXNtYXRjaDogZ290ICVkLCB3YW50ZWQgJWQiLCBwLCB0ZXN0LmV4cGVjdGVkU1JUUFByb3RlY3Rpb25Qcm9maWxlKQogCX0KIAotCWlmIHRlc3QuZXhwZWN0ZWRPQ1NQUmVzcG9uc2UgIT0gbmlsICYmICFieXRlcy5FcXVhbCh0ZXN0LmV4cGVjdGVkT0NTUFJlc3BvbnNlLCB0bHNDb25uLk9DU1BSZXNwb25zZSgpKSB7Ci0JCXJldHVybiBmbXQuRXJyb3JmKCJPQ1NQIFJlc3BvbnNlIG1pc21hdGNoIikKLQl9Ci0KLQlpZiB0ZXN0LmV4cGVjdGVkU0NUTGlzdCAhPSBuaWwgJiYgIWJ5dGVzLkVxdWFsKHRlc3QuZXhwZWN0ZWRTQ1RMaXN0LCBjb25uU3RhdGUuU0NUTGlzdCkgewotCQlyZXR1cm4gZm10LkVycm9yZigiU0NUIGxpc3QgbWlzbWF0Y2giKQotCX0KLQotCWlmIGV4cGVjdGVkIDo9IHRlc3QuZXhwZWN0ZWRDbGllbnRDZXJ0U2lnbmF0dXJlSGFzaDsgZXhwZWN0ZWQgIT0gMCAmJiBleHBlY3RlZCAhPSBjb25uU3RhdGUuQ2xpZW50Q2VydFNpZ25hdHVyZUhhc2ggewotCQlyZXR1cm4gZm10LkVycm9yZigiZXhwZWN0ZWQgY2xpZW50IHRvIHNpZ24gaGFuZHNoYWtlIHdpdGggaGFzaCAlZCwgYnV0IGdvdCAlZCIsIGV4cGVjdGVkLCBjb25uU3RhdGUuQ2xpZW50Q2VydFNpZ25hdHVyZUhhc2gpCi0JfQotCiAJaWYgdGVzdC5leHBvcnRLZXlpbmdNYXRlcmlhbCA+IDAgewogCQlhY3R1YWwgOj0gbWFrZShbXWJ5dGUsIHRlc3QuZXhwb3J0S2V5aW5nTWF0ZXJpYWwpCiAJCWlmIF8sIGVyciA6PSBpby5SZWFkRnVsbCh0bHNDb25uLCBhY3R1YWwpOyBlcnIgIT0gbmlsIHsKQEAgLTM4NiwxNCArMTI3MSw2IEBACiAJCX0KIAl9CiAKLQlmb3IgaSA6PSAwOyBpIDwgdGVzdC5zZW5kRW1wdHlSZWNvcmRzOyBpKysgewotCQl0bHNDb25uLldyaXRlKG5pbCkKLQl9Ci0KLQlmb3IgaSA6PSAwOyBpIDwgdGVzdC5zZW5kV2FybmluZ0FsZXJ0czsgaSsrIHsKLQkJdGxzQ29ubi5TZW5kQWxlcnQoYWxlcnRMZXZlbFdhcm5pbmcsIGFsZXJ0VW5leHBlY3RlZE1lc3NhZ2UpCi0JfQotCiAJaWYgdGVzdC5yZW5lZ290aWF0ZSB7CiAJCWlmIHRlc3QucmVuZWdvdGlhdGVDaXBoZXJzICE9IG5pbCB7CiAJCQljb25maWcuQ2lwaGVyU3VpdGVzID0gdGVzdC5yZW5lZ290aWF0ZUNpcGhlcnMKQEAgLTQxMSw3ICsxMjg4LDYgQEAKIAkJY29ubkRhbWFnZS5zZXREYW1hZ2UoZmFsc2UpCiAJfQogCi0JbWVzc2FnZUxlbiA6PSB0ZXN0Lm1lc3NhZ2VMZW4KIAlpZiBtZXNzYWdlTGVuIDwgMCB7CiAJCWlmIHRlc3QucHJvdG9jb2wgPT0gZHRscyB7CiAJCQlyZXR1cm4gZm10LkVycm9yZigibWVzc2FnZUxlbiA8IDAgbm90IHN1cHBvcnRlZCBmb3IgRFRMUyB0ZXN0cyIpCkBAIC00MjAsNTcgKzEyOTYsMzcgQEAKIAkJXywgZXJyIDo9IGlvLkNvcHkoaW91dGlsLkRpc2NhcmQsIHRsc0Nvbm4pCiAJCXJldHVybiBlcnIKIAl9CisKIAlpZiBtZXNzYWdlTGVuID09IDAgewogCQltZXNzYWdlTGVuID0gMzIKIAl9CisJdGVzdE1lc3NhZ2UgOj0gbWFrZShbXWJ5dGUsIG1lc3NhZ2VMZW4pCisJZm9yIGkgOj0gcmFuZ2UgdGVzdE1lc3NhZ2UgeworCQl0ZXN0TWVzc2FnZVtpXSA9IDB4NDIKKwl9CisJdGxzQ29ubi5Xcml0ZSh0ZXN0TWVzc2FnZSkKIAotCW1lc3NhZ2VDb3VudCA6PSB0ZXN0Lm1lc3NhZ2VDb3VudAotCWlmIG1lc3NhZ2VDb3VudCA9PSAwIHsKLQkJbWVzc2FnZUNvdW50ID0gMQorCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgbGVuKHRlc3RNZXNzYWdlKSkKKwlpZiB0ZXN0LnByb3RvY29sID09IGR0bHMgeworCQlidWZUbXAgOj0gbWFrZShbXWJ5dGUsIGxlbihidWYpKzEpCisJCW4sIGVyciA6PSB0bHNDb25uLlJlYWQoYnVmVG1wKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQlpZiBuICE9IGxlbihidWYpIHsKKwkJCXJldHVybiBmbXQuRXJyb3JmKCJiYWQgcmVwbHk7IGxlbmd0aCBtaXNtYXRjaCAoJWQgdnMgJWQpIiwgbiwgbGVuKGJ1ZikpCisJCX0KKwkJY29weShidWYsIGJ1ZlRtcCkKKwl9IGVsc2UgeworCQlfLCBlcnIgOj0gaW8uUmVhZEZ1bGwodGxzQ29ubiwgYnVmKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQogCX0KIAotCWZvciBqIDo9IDA7IGogPCBtZXNzYWdlQ291bnQ7IGorKyB7Ci0JCXRlc3RNZXNzYWdlIDo9IG1ha2UoW11ieXRlLCBtZXNzYWdlTGVuKQotCQlmb3IgaSA6PSByYW5nZSB0ZXN0TWVzc2FnZSB7Ci0JCQl0ZXN0TWVzc2FnZVtpXSA9IDB4NDIgXiBieXRlKGopCi0JCX0KLQkJdGxzQ29ubi5Xcml0ZSh0ZXN0TWVzc2FnZSkKLQotCQlmb3IgaSA6PSAwOyBpIDwgdGVzdC5zZW5kRW1wdHlSZWNvcmRzOyBpKysgewotCQkJdGxzQ29ubi5Xcml0ZShuaWwpCi0JCX0KLQotCQlmb3IgaSA6PSAwOyBpIDwgdGVzdC5zZW5kV2FybmluZ0FsZXJ0czsgaSsrIHsKLQkJCXRsc0Nvbm4uU2VuZEFsZXJ0KGFsZXJ0TGV2ZWxXYXJuaW5nLCBhbGVydFVuZXhwZWN0ZWRNZXNzYWdlKQotCQl9Ci0KLQkJaWYgdGVzdC5zaGltU2h1dHNEb3duIHx8IHRlc3QuZXhwZWN0TWVzc2FnZURyb3BwZWQgewotCQkJLy8gVGhlIHNoaW0gd2lsbCBub3QgcmVzcG9uZC4KLQkJCWNvbnRpbnVlCi0JCX0KLQotCQlidWYgOj0gbWFrZShbXWJ5dGUsIGxlbih0ZXN0TWVzc2FnZSkpCi0JCWlmIHRlc3QucHJvdG9jb2wgPT0gZHRscyB7Ci0JCQlidWZUbXAgOj0gbWFrZShbXWJ5dGUsIGxlbihidWYpKzEpCi0JCQluLCBlcnIgOj0gdGxzQ29ubi5SZWFkKGJ1ZlRtcCkKLQkJCWlmIGVyciAhPSBuaWwgewotCQkJCXJldHVybiBlcnIKLQkJCX0KLQkJCWlmIG4gIT0gbGVuKGJ1ZikgewotCQkJCXJldHVybiBmbXQuRXJyb3JmKCJiYWQgcmVwbHk7IGxlbmd0aCBtaXNtYXRjaCAoJWQgdnMgJWQpIiwgbiwgbGVuKGJ1ZikpCi0JCQl9Ci0JCQljb3B5KGJ1ZiwgYnVmVG1wKQotCQl9IGVsc2UgewotCQkJXywgZXJyIDo9IGlvLlJlYWRGdWxsKHRsc0Nvbm4sIGJ1ZikKLQkJCWlmIGVyciAhPSBuaWwgewotCQkJCXJldHVybiBlcnIKLQkJCX0KLQkJfQotCi0JCWZvciBpLCB2IDo9IHJhbmdlIGJ1ZiB7Ci0JCQlpZiB2ICE9IHRlc3RNZXNzYWdlW2ldXjB4ZmYgewotCQkJCXJldHVybiBmbXQuRXJyb3JmKCJiYWQgcmVwbHkgY29udGVudHMgYXQgYnl0ZSAlZCIsIGkpCi0JCQl9CisJZm9yIGksIHYgOj0gcmFuZ2UgYnVmIHsKKwkJaWYgdiAhPSB0ZXN0TWVzc2FnZVtpXV4weGZmIHsKKwkJCXJldHVybiBmbXQuRXJyb3JmKCJiYWQgcmVwbHkgY29udGVudHMgYXQgYnl0ZSAlZCIsIGkpCiAJCX0KIAl9CiAKQEAgLTUyNiw3ICsxMzgyLDcgQEAKIAl9CiB9CiAKLWZ1bmMgcnVuVGVzdCh0ZXN0ICp0ZXN0Q2FzZSwgc2hpbVBhdGggc3RyaW5nLCBtYWxsb2NOdW1Ub0ZhaWwgaW50NjQpIGVycm9yIHsKK2Z1bmMgcnVuVGVzdCh0ZXN0ICp0ZXN0Q2FzZSwgYnVpbGREaXIgc3RyaW5nLCBtYWxsb2NOdW1Ub0ZhaWwgaW50NjQpIGVycm9yIHsKIAlpZiAhdGVzdC5zaG91bGRGYWlsICYmIChsZW4odGVzdC5leHBlY3RlZEVycm9yKSA+IDAgfHwgbGVuKHRlc3QuZXhwZWN0ZWRMb2NhbEVycm9yKSA+IDApIHsKIAkJcGFuaWMoIkVycm9yIGV4cGVjdGVkIHdpdGhvdXQgc2hvdWxkRmFpbCBpbiAiICsgdGVzdC5uYW1lKQogCX0KQEAgLTUzNSwxMCArMTM5MSw2IEBACiAJCXBhbmljKCJleHBlY3RSZXN1bWVSZWplY3RlZCB3aXRob3V0IHJlc3VtZVNlc3Npb24gaW4gIiArIHRlc3QubmFtZSkKIAl9CiAKLQlpZiB0ZXN0LnRlc3RUeXBlICE9IGNsaWVudFRlc3QgJiYgdGVzdC5leHBlY3RlZENsaWVudENlcnRTaWduYXR1cmVIYXNoICE9IDAgewotCQlwYW5pYygiZXhwZWN0ZWRDbGllbnRDZXJ0U2lnbmF0dXJlSGFzaCBub24temVybyB3aXRoIHNlcnZlclRlc3QgaW4gIiArIHRlc3QubmFtZSkKLQl9Ci0KIAlsaXN0ZW5lciwgZXJyIDo9IG5ldC5MaXN0ZW5UQ1AoInRjcDQiLCAmbmV0LlRDUEFkZHJ7SVA6IG5ldC5JUHsxMjcsIDAsIDAsIDF9fSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJcGFuaWMoZXJyKQpAQCAtNTQ5LDMwICsxNDAxLDI2IEBACiAJCX0KIAl9KCkKIAorCXNoaW1fcGF0aCA6PSBwYXRoLkpvaW4oYnVpbGREaXIsICJzc2wvdGVzdC9ic3NsX3NoaW0iKQogCWZsYWdzIDo9IFtdc3RyaW5neyItcG9ydCIsIHN0cmNvbnYuSXRvYShsaXN0ZW5lci5BZGRyKCkuKCpuZXQuVENQQWRkcikuUG9ydCl9CiAJaWYgdGVzdC50ZXN0VHlwZSA9PSBzZXJ2ZXJUZXN0IHsKIAkJZmxhZ3MgPSBhcHBlbmQoZmxhZ3MsICItc2VydmVyIikKIAogCQlmbGFncyA9IGFwcGVuZChmbGFncywgIi1rZXktZmlsZSIpCiAJCWlmIHRlc3Qua2V5RmlsZSA9PSAiIiB7Ci0JCQlmbGFncyA9IGFwcGVuZChmbGFncywgcGF0aC5Kb2luKCpyZXNvdXJjZURpciwgcnNhS2V5RmlsZSkpCisJCQlmbGFncyA9IGFwcGVuZChmbGFncywgcnNhS2V5RmlsZSkKIAkJfSBlbHNlIHsKLQkJCWZsYWdzID0gYXBwZW5kKGZsYWdzLCBwYXRoLkpvaW4oKnJlc291cmNlRGlyLCB0ZXN0LmtleUZpbGUpKQorCQkJZmxhZ3MgPSBhcHBlbmQoZmxhZ3MsIHRlc3Qua2V5RmlsZSkKIAkJfQogCiAJCWZsYWdzID0gYXBwZW5kKGZsYWdzLCAiLWNlcnQtZmlsZSIpCiAJCWlmIHRlc3QuY2VydEZpbGUgPT0gIiIgewotCQkJZmxhZ3MgPSBhcHBlbmQoZmxhZ3MsIHBhdGguSm9pbigqcmVzb3VyY2VEaXIsIHJzYUNlcnRpZmljYXRlRmlsZSkpCisJCQlmbGFncyA9IGFwcGVuZChmbGFncywgcnNhQ2VydGlmaWNhdGVGaWxlKQogCQl9IGVsc2UgewotCQkJZmxhZ3MgPSBhcHBlbmQoZmxhZ3MsIHBhdGguSm9pbigqcmVzb3VyY2VEaXIsIHRlc3QuY2VydEZpbGUpKQorCQkJZmxhZ3MgPSBhcHBlbmQoZmxhZ3MsIHRlc3QuY2VydEZpbGUpCiAJCX0KIAl9CiAKLQlpZiB0ZXN0LmRpZ2VzdFByZWZzICE9ICIiIHsKLQkJZmxhZ3MgPSBhcHBlbmQoZmxhZ3MsICItZGlnZXN0LXByZWZzIikKLQkJZmxhZ3MgPSBhcHBlbmQoZmxhZ3MsIHRlc3QuZGlnZXN0UHJlZnMpCi0JfQotCiAJaWYgdGVzdC5wcm90b2NvbCA9PSBkdGxzIHsKIAkJZmxhZ3MgPSBhcHBlbmQoZmxhZ3MsICItZHRscyIpCiAJfQpAQCAtNTg1LDEwICsxNDMzLDYgQEAKIAkJZmxhZ3MgPSBhcHBlbmQoZmxhZ3MsICItc2hpbS13cml0ZXMtZmlyc3QiKQogCX0KIAotCWlmIHRlc3Quc2hpbVNodXRzRG93biB7Ci0JCWZsYWdzID0gYXBwZW5kKGZsYWdzLCAiLXNoaW0tc2h1dHMtZG93biIpCi0JfQotCiAJaWYgdGVzdC5leHBvcnRLZXlpbmdNYXRlcmlhbCA+IDAgewogCQlmbGFncyA9IGFwcGVuZChmbGFncywgIi1leHBvcnQta2V5aW5nLW1hdGVyaWFsIiwgc3RyY29udi5JdG9hKHRlc3QuZXhwb3J0S2V5aW5nTWF0ZXJpYWwpKQogCQlmbGFncyA9IGFwcGVuZChmbGFncywgIi1leHBvcnQtbGFiZWwiLCB0ZXN0LmV4cG9ydExhYmVsKQpAQCAtNjA5LDExICsxNDUzLDExIEBACiAKIAl2YXIgc2hpbSAqZXhlYy5DbWQKIAlpZiAqdXNlVmFsZ3JpbmQgewotCQlzaGltID0gdmFsZ3JpbmRPZihmYWxzZSwgc2hpbVBhdGgsIGZsYWdzLi4uKQorCQlzaGltID0gdmFsZ3JpbmRPZihmYWxzZSwgc2hpbV9wYXRoLCBmbGFncy4uLikKIAl9IGVsc2UgaWYgKnVzZUdEQiB7Ci0JCXNoaW0gPSBnZGJPZihzaGltUGF0aCwgZmxhZ3MuLi4pCisJCXNoaW0gPSBnZGJPZihzaGltX3BhdGgsIGZsYWdzLi4uKQogCX0gZWxzZSB7Ci0JCXNoaW0gPSBleGVjLkNvbW1hbmQoc2hpbVBhdGgsIGZsYWdzLi4uKQorCQlzaGltID0gZXhlYy5Db21tYW5kKHNoaW1fcGF0aCwgZmxhZ3MuLi4pCiAJfQogCXNoaW0uU3RkaW4gPSBvcy5TdGRpbgogCXZhciBzdGRvdXRCdWYsIHN0ZGVyckJ1ZiBieXRlcy5CdWZmZXIKQEAgLTYyMyw3ICsxNDY3LDcgQEAKIAkJc2hpbS5FbnYgPSBvcy5FbnZpcm9uKCkKIAkJc2hpbS5FbnYgPSBhcHBlbmQoc2hpbS5FbnYsICJNQUxMT0NfTlVNQkVSX1RPX0ZBSUw9IitzdHJjb252LkZvcm1hdEludChtYWxsb2NOdW1Ub0ZhaWwsIDEwKSkKIAkJaWYgKm1hbGxvY1Rlc3REZWJ1ZyB7Ci0JCQlzaGltLkVudiA9IGFwcGVuZChzaGltLkVudiwgIk1BTExPQ19CUkVBS19PTl9GQUlMPTEiKQorCQkJc2hpbS5FbnYgPSBhcHBlbmQoc2hpbS5FbnYsICJNQUxMT0NfQUJPUlRfT05fRkFJTD0xIikKIAkJfQogCQlzaGltLkVudiA9IGFwcGVuZChzaGltLkVudiwgIl9NQUxMT0NfQ0hFQ0s9MSIpCiAJfQpAQCAtNjM1LDEwICsxNDc5LDggQEAKIAlnbyBmdW5jKCkgeyB3YWl0Q2hhbiA8LSBzaGltLldhaXQoKSB9KCkKIAogCWNvbmZpZyA6PSB0ZXN0LmNvbmZpZwotCWlmICF0ZXN0Lm5vU2Vzc2lvbkNhY2hlIHsKLQkJY29uZmlnLkNsaWVudFNlc3Npb25DYWNoZSA9IE5ld0xSVUNsaWVudFNlc3Npb25DYWNoZSgxKQotCQljb25maWcuU2VydmVyU2Vzc2lvbkNhY2hlID0gTmV3TFJVU2VydmVyU2Vzc2lvbkNhY2hlKDEpCi0JfQorCWNvbmZpZy5DbGllbnRTZXNzaW9uQ2FjaGUgPSBOZXdMUlVDbGllbnRTZXNzaW9uQ2FjaGUoMSkKKwljb25maWcuU2VydmVyU2Vzc2lvbkNhY2hlID0gTmV3TFJVU2VydmVyU2Vzc2lvbkNhY2hlKDEpCiAJaWYgdGVzdC50ZXN0VHlwZSA9PSBjbGllbnRUZXN0IHsKIAkJaWYgbGVuKGNvbmZpZy5DZXJ0aWZpY2F0ZXMpID09IDAgewogCQkJY29uZmlnLkNlcnRpZmljYXRlcyA9IFtdQ2VydGlmaWNhdGV7Z2V0UlNBQ2VydGlmaWNhdGUoKX0KQEAgLTY1Myw3ICsxNDk1LDcgQEAKIAogCWNvbm4sIGVyciA6PSBhY2NlcHRPcldhaXQobGlzdGVuZXIsIHdhaXRDaGFuKQogCWlmIGVyciA9PSBuaWwgewotCQllcnIgPSBkb0V4Y2hhbmdlKHRlc3QsICZjb25maWcsIGNvbm4sIGZhbHNlIC8qIG5vdCBhIHJlc3VtcHRpb24gKi8pCisJCWVyciA9IGRvRXhjaGFuZ2UodGVzdCwgJmNvbmZpZywgY29ubiwgdGVzdC5tZXNzYWdlTGVuLCBmYWxzZSAvKiBub3QgYSByZXN1bXB0aW9uICovKQogCQljb25uLkNsb3NlKCkKIAl9CiAKQEAgLTY2NywxMiArMTUwOSw3IEBACiAJCQlpZiBsZW4ocmVzdW1lQ29uZmlnLkNlcnRpZmljYXRlcykgPT0gMCB7CiAJCQkJcmVzdW1lQ29uZmlnLkNlcnRpZmljYXRlcyA9IFtdQ2VydGlmaWNhdGV7Z2V0UlNBQ2VydGlmaWNhdGUoKX0KIAkJCX0KLQkJCWlmIHRlc3QubmV3U2Vzc2lvbnNPblJlc3VtZSB7Ci0JCQkJaWYgIXRlc3Qubm9TZXNzaW9uQ2FjaGUgewotCQkJCQlyZXN1bWVDb25maWcuQ2xpZW50U2Vzc2lvbkNhY2hlID0gTmV3TFJVQ2xpZW50U2Vzc2lvbkNhY2hlKDEpCi0JCQkJCXJlc3VtZUNvbmZpZy5TZXJ2ZXJTZXNzaW9uQ2FjaGUgPSBOZXdMUlVTZXJ2ZXJTZXNzaW9uQ2FjaGUoMSkKLQkJCQl9Ci0JCQl9IGVsc2UgeworCQkJaWYgIXRlc3QubmV3U2Vzc2lvbnNPblJlc3VtZSB7CiAJCQkJcmVzdW1lQ29uZmlnLlNlc3Npb25UaWNrZXRLZXkgPSBjb25maWcuU2Vzc2lvblRpY2tldEtleQogCQkJCXJlc3VtZUNvbmZpZy5DbGllbnRTZXNzaW9uQ2FjaGUgPSBjb25maWcuQ2xpZW50U2Vzc2lvbkNhY2hlCiAJCQkJcmVzdW1lQ29uZmlnLlNlcnZlclNlc3Npb25DYWNoZSA9IGNvbmZpZy5TZXJ2ZXJTZXNzaW9uQ2FjaGUKQEAgLTY4Myw3ICsxNTIwLDcgQEAKIAkJdmFyIGNvbm5SZXN1bWUgbmV0LkNvbm4KIAkJY29ublJlc3VtZSwgZXJyID0gYWNjZXB0T3JXYWl0KGxpc3RlbmVyLCB3YWl0Q2hhbikKIAkJaWYgZXJyID09IG5pbCB7Ci0JCQllcnIgPSBkb0V4Y2hhbmdlKHRlc3QsICZyZXN1bWVDb25maWcsIGNvbm5SZXN1bWUsIHRydWUgLyogcmVzdW1wdGlvbiAqLykKKwkJCWVyciA9IGRvRXhjaGFuZ2UodGVzdCwgJnJlc3VtZUNvbmZpZywgY29ublJlc3VtZSwgdGVzdC5tZXNzYWdlTGVuLCB0cnVlIC8qIHJlc3VtcHRpb24gKi8pCiAJCQljb25uUmVzdW1lLkNsb3NlKCkKIAkJfQogCX0KQEAgLTc2OSw2ICsxNjA2LDcgQEAKIAl7IkRIRS1SU0EtQUVTMjU2LUdDTSIsIFRMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0fSwKIAl7IkRIRS1SU0EtQUVTMjU2LVNIQSIsIFRMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBfSwKIAl7IkRIRS1SU0EtQUVTMjU2LVNIQTI1NiIsIFRMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMjU2fSwKKwl7IkRIRS1SU0EtQ0hBQ0hBMjAtUE9MWTEzMDUiLCBUTFNfREhFX1JTQV9XSVRIX0NIQUNIQTIwX1BPTFkxMzA1X1NIQTI1Nn0sCiAJeyJFQ0RIRS1FQ0RTQS1BRVMxMjgtR0NNIiwgVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2fSwKIAl7IkVDREhFLUVDRFNBLUFFUzEyOC1TSEEiLCBUTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEF9LAogCXsiRUNESEUtRUNEU0EtQUVTMTI4LVNIQTI1NiIsIFRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQTI1Nn0sCkBAIC03OTIsNyArMTYzMCw2IEBACiAJeyJQU0stUkM0LVNIQSIsIFRMU19QU0tfV0lUSF9SQzRfMTI4X1NIQX0sCiAJeyJSQzQtTUQ1IiwgVExTX1JTQV9XSVRIX1JDNF8xMjhfTUQ1fSwKIAl7IlJDNC1TSEEiLCBUTFNfUlNBX1dJVEhfUkM0XzEyOF9TSEF9LAotCXsiTlVMTC1TSEEiLCBUTFNfUlNBX1dJVEhfTlVMTF9TSEF9LAogfQogCiBmdW5jIGhhc0NvbXBvbmVudChzdWl0ZU5hbWUsIGNvbXBvbmVudCBzdHJpbmcpIGJvb2wgewpAQCAtODA3LDcgKzE2NDQsNyBAQAogfQogCiBmdW5jIGlzRFRMU0NpcGhlcihzdWl0ZU5hbWUgc3RyaW5nKSBib29sIHsKLQlyZXR1cm4gIWhhc0NvbXBvbmVudChzdWl0ZU5hbWUsICJSQzQiKSAmJiAhaGFzQ29tcG9uZW50KHN1aXRlTmFtZSwgIk5VTEwiKQorCXJldHVybiAhaGFzQ29tcG9uZW50KHN1aXRlTmFtZSwgIlJDNCIpCiB9CiAKIGZ1bmMgYmlnRnJvbUhleChoZXggc3RyaW5nKSAqYmlnLkludCB7CkBAIC04MTgsMTE1MiArMTY1NSw2IEBACiAJcmV0dXJuIHJldAogfQogCi1mdW5jIGFkZEJhc2ljVGVzdHMoKSB7Ci0JYmFzaWNUZXN0cyA6PSBbXXRlc3RDYXNlewotCQl7Ci0JCQluYW1lOiAiQmFkUlNBU2lnbmF0dXJlIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUNpcGhlclN1aXRlczogW111aW50MTZ7VExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1Nn0sCi0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlJbnZhbGlkU0tYU2lnbmF0dXJlOiB0cnVlLAotCQkJCX0sCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6QkFEX1NJR05BVFVSRToiLAotCQl9LAotCQl7Ci0JCQluYW1lOiAiQmFkRUNEU0FTaWduYXR1cmUiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQ2lwaGVyU3VpdGVzOiBbXXVpbnQxNntUTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTZ9LAotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJSW52YWxpZFNLWFNpZ25hdHVyZTogdHJ1ZSwKLQkJCQl9LAotCQkJCUNlcnRpZmljYXRlczogW11DZXJ0aWZpY2F0ZXtnZXRFQ0RTQUNlcnRpZmljYXRlKCl9LAotCQkJfSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOkJBRF9TSUdOQVRVUkU6IiwKLQkJfSwKLQkJewotCQkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCi0JCQluYW1lOiAgICAgIkJhZFJTQVNpZ25hdHVyZS1DbGllbnRBdXRoIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJSW52YWxpZENlcnRWZXJpZnlTaWduYXR1cmU6IHRydWUsCi0JCQkJfSwKLQkJCQlDZXJ0aWZpY2F0ZXM6IFtdQ2VydGlmaWNhdGV7Z2V0UlNBQ2VydGlmaWNhdGUoKX0sCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6QkFEX1NJR05BVFVSRToiLAotCQkJZmxhZ3M6ICAgICAgICAgW11zdHJpbmd7Ii1yZXF1aXJlLWFueS1jbGllbnQtY2VydGlmaWNhdGUifSwKLQkJfSwKLQkJewotCQkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCi0JCQluYW1lOiAgICAgIkJhZEVDRFNBU2lnbmF0dXJlLUNsaWVudEF1dGgiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlJbnZhbGlkQ2VydFZlcmlmeVNpZ25hdHVyZTogdHJ1ZSwKLQkJCQl9LAotCQkJCUNlcnRpZmljYXRlczogW11DZXJ0aWZpY2F0ZXtnZXRFQ0RTQUNlcnRpZmljYXRlKCl9LAotCQkJfSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOkJBRF9TSUdOQVRVUkU6IiwKLQkJCWZsYWdzOiAgICAgICAgIFtdc3RyaW5neyItcmVxdWlyZS1hbnktY2xpZW50LWNlcnRpZmljYXRlIn0sCi0JCX0sCi0JCXsKLQkJCW5hbWU6ICJCYWRFQ0RTQUN1cnZlIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUNpcGhlclN1aXRlczogW111aW50MTZ7VExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2fSwKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCUludmFsaWRTS1hDdXJ2ZTogdHJ1ZSwKLQkJCQl9LAotCQkJCUNlcnRpZmljYXRlczogW11DZXJ0aWZpY2F0ZXtnZXRFQ0RTQUNlcnRpZmljYXRlKCl9LAotCQkJfSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOldST05HX0NVUlZFOiIsCi0JCX0sCi0JCXsKLQkJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAotCQkJbmFtZTogICAgICJCYWRSU0FWZXJzaW9uIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUNpcGhlclN1aXRlczogW111aW50MTZ7VExTX1JTQV9XSVRIX1JDNF8xMjhfU0hBfSwKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCVJzYUNsaWVudEtleUV4Y2hhbmdlVmVyc2lvbjogVmVyc2lvblRMUzExLAotCQkJCX0sCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6REVDUllQVElPTl9GQUlMRURfT1JfQkFEX1JFQ09SRF9NQUM6IiwKLQkJfSwKLQkJewotCQkJbmFtZTogIk5vRmFsbGJhY2tTQ1NWIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJRmFpbElmTm90RmFsbGJhY2tTQ1NWOiB0cnVlLAotCQkJCX0sCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgICAgICB0cnVlLAotCQkJZXhwZWN0ZWRMb2NhbEVycm9yOiAibm8gZmFsbGJhY2sgU0NTViBmb3VuZCIsCi0JCX0sCi0JCXsKLQkJCW5hbWU6ICJTZW5kRmFsbGJhY2tTQ1NWIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJRmFpbElmTm90RmFsbGJhY2tTQ1NWOiB0cnVlLAotCQkJCX0sCi0JCQl9LAotCQkJZmxhZ3M6IFtdc3RyaW5neyItZmFsbGJhY2stc2NzdiJ9LAotCQl9LAotCQl7Ci0JCQluYW1lOiAiQ2xpZW50Q2VydGlmaWNhdGVUeXBlcyIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlDbGllbnRBdXRoOiBSZXF1ZXN0Q2xpZW50Q2VydCwKLQkJCQlDbGllbnRDZXJ0aWZpY2F0ZVR5cGVzOiBbXWJ5dGV7Ci0JCQkJCUNlcnRUeXBlRFNTU2lnbiwKLQkJCQkJQ2VydFR5cGVSU0FTaWduLAotCQkJCQlDZXJ0VHlwZUVDRFNBU2lnbiwKLQkJCQl9LAotCQkJfSwKLQkJCWZsYWdzOiBbXXN0cmluZ3sKLQkJCQkiLWV4cGVjdC1jZXJ0aWZpY2F0ZS10eXBlcyIsCi0JCQkJYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZVRvU3RyaW5nKFtdYnl0ZXsKLQkJCQkJQ2VydFR5cGVEU1NTaWduLAotCQkJCQlDZXJ0VHlwZVJTQVNpZ24sCi0JCQkJCUNlcnRUeXBlRUNEU0FTaWduLAotCQkJCX0pLAotCQkJfSwKLQkJfSwKLQkJewotCQkJbmFtZTogIk5vQ2xpZW50Q2VydGlmaWNhdGUiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQ2xpZW50QXV0aDogUmVxdWlyZUFueUNsaWVudENlcnQsCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgICAgICB0cnVlLAotCQkJZXhwZWN0ZWRMb2NhbEVycm9yOiAiY2xpZW50IGRpZG4ndCBwcm92aWRlIGEgY2VydGlmaWNhdGUiLAotCQl9LAotCQl7Ci0JCQluYW1lOiAiVW5hdXRoZW50aWNhdGVkRUNESCIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2e1RMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTZ9LAotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJVW5hdXRoZW50aWNhdGVkRUNESDogdHJ1ZSwKLQkJCQl9LAotCQkJfSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOlVORVhQRUNURURfTUVTU0FHRToiLAotCQl9LAotCQl7Ci0JCQluYW1lOiAiU2tpcENlcnRpZmljYXRlU3RhdHVzIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUNpcGhlclN1aXRlczogW111aW50MTZ7VExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1Nn0sCi0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlTa2lwQ2VydGlmaWNhdGVTdGF0dXM6IHRydWUsCi0JCQkJfSwKLQkJCX0sCi0JCQlmbGFnczogW11zdHJpbmd7Ci0JCQkJIi1lbmFibGUtb2NzcC1zdGFwbGluZyIsCi0JCQl9LAotCQl9LAotCQl7Ci0JCQluYW1lOiAiU2tpcFNlcnZlcktleUV4Y2hhbmdlIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUNpcGhlclN1aXRlczogW111aW50MTZ7VExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1Nn0sCi0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlTa2lwU2VydmVyS2V5RXhjaGFuZ2U6IHRydWUsCi0JCQkJfSwKLQkJCX0sCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpVTkVYUEVDVEVEX01FU1NBR0U6IiwKLQkJfSwKLQkJewotCQkJbmFtZTogIlNraXBDaGFuZ2VDaXBoZXJTcGVjLUNsaWVudCIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCVNraXBDaGFuZ2VDaXBoZXJTcGVjOiB0cnVlLAotCQkJCX0sCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6SEFORFNIQUtFX1JFQ09SRF9CRUZPUkVfQ0NTOiIsCi0JCX0sCi0JCXsKLQkJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAotCQkJbmFtZTogICAgICJTa2lwQ2hhbmdlQ2lwaGVyU3BlYy1TZXJ2ZXIiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlTa2lwQ2hhbmdlQ2lwaGVyU3BlYzogdHJ1ZSwKLQkJCQl9LAotCQkJfSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOkhBTkRTSEFLRV9SRUNPUkRfQkVGT1JFX0NDUzoiLAotCQl9LAotCQl7Ci0JCQl0ZXN0VHlwZTogc2VydmVyVGVzdCwKLQkJCW5hbWU6ICAgICAiU2tpcENoYW5nZUNpcGhlclNwZWMtU2VydmVyLU5QTiIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlOZXh0UHJvdG9zOiBbXXN0cmluZ3siYmFyIn0sCi0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlTa2lwQ2hhbmdlQ2lwaGVyU3BlYzogdHJ1ZSwKLQkJCQl9LAotCQkJfSwKLQkJCWZsYWdzOiBbXXN0cmluZ3sKLQkJCQkiLWFkdmVydGlzZS1ucG4iLCAiXHgwM2Zvb1x4MDNiYXJceDAzYmF6IiwKLQkJCX0sCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpIQU5EU0hBS0VfUkVDT1JEX0JFRk9SRV9DQ1M6IiwKLQkJfSwKLQkJewotCQkJbmFtZTogIkZyYWdtZW50QWNyb3NzQ2hhbmdlQ2lwaGVyU3BlYy1DbGllbnQiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlGcmFnbWVudEFjcm9zc0NoYW5nZUNpcGhlclNwZWM6IHRydWUsCi0JCQkJfSwKLQkJCX0sCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpIQU5EU0hBS0VfUkVDT1JEX0JFRk9SRV9DQ1M6IiwKLQkJfSwKLQkJewotCQkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCi0JCQluYW1lOiAgICAgIkZyYWdtZW50QWNyb3NzQ2hhbmdlQ2lwaGVyU3BlYy1TZXJ2ZXIiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlGcmFnbWVudEFjcm9zc0NoYW5nZUNpcGhlclNwZWM6IHRydWUsCi0JCQkJfSwKLQkJCX0sCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpIQU5EU0hBS0VfUkVDT1JEX0JFRk9SRV9DQ1M6IiwKLQkJfSwKLQkJewotCQkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCi0JCQluYW1lOiAgICAgIkZyYWdtZW50QWNyb3NzQ2hhbmdlQ2lwaGVyU3BlYy1TZXJ2ZXItTlBOIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCU5leHRQcm90b3M6IFtdc3RyaW5neyJiYXIifSwKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCUZyYWdtZW50QWNyb3NzQ2hhbmdlQ2lwaGVyU3BlYzogdHJ1ZSwKLQkJCQl9LAotCQkJfSwKLQkJCWZsYWdzOiBbXXN0cmluZ3sKLQkJCQkiLWFkdmVydGlzZS1ucG4iLCAiXHgwM2Zvb1x4MDNiYXJceDAzYmF6IiwKLQkJCX0sCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpIQU5EU0hBS0VfUkVDT1JEX0JFRk9SRV9DQ1M6IiwKLQkJfSwKLQkJewotCQkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCi0JCQluYW1lOiAgICAgIkFsZXJ0IiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJU2VuZFNwdXJpb3VzQWxlcnQ6IGFsZXJ0UmVjb3JkT3ZlcmZsb3csCi0JCQkJfSwKLQkJCX0sCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpUTFNWMV9BTEVSVF9SRUNPUkRfT1ZFUkZMT1c6IiwKLQkJfSwKLQkJewotCQkJcHJvdG9jb2w6IGR0bHMsCi0JCQl0ZXN0VHlwZTogc2VydmVyVGVzdCwKLQkJCW5hbWU6ICAgICAiQWxlcnQtRFRMUyIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCVNlbmRTcHVyaW91c0FsZXJ0OiBhbGVydFJlY29yZE92ZXJmbG93LAotCQkJCX0sCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6VExTVjFfQUxFUlRfUkVDT1JEX09WRVJGTE9XOiIsCi0JCX0sCi0JCXsKLQkJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAotCQkJbmFtZTogICAgICJGcmFnbWVudEFsZXJ0IiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJRnJhZ21lbnRBbGVydDogICAgIHRydWUsCi0JCQkJCVNlbmRTcHVyaW91c0FsZXJ0OiBhbGVydFJlY29yZE92ZXJmbG93LAotCQkJCX0sCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6QkFEX0FMRVJUOiIsCi0JCX0sCi0JCXsKLQkJCXByb3RvY29sOiBkdGxzLAotCQkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCi0JCQluYW1lOiAgICAgIkZyYWdtZW50QWxlcnQtRFRMUyIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCUZyYWdtZW50QWxlcnQ6ICAgICB0cnVlLAotCQkJCQlTZW5kU3B1cmlvdXNBbGVydDogYWxlcnRSZWNvcmRPdmVyZmxvdywKLQkJCQl9LAotCQkJfSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOkJBRF9BTEVSVDoiLAotCQl9LAotCQl7Ci0JCQl0ZXN0VHlwZTogc2VydmVyVGVzdCwKLQkJCW5hbWU6ICAgICAiRWFybHlDaGFuZ2VDaXBoZXJTcGVjLXNlcnZlci0xIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJRWFybHlDaGFuZ2VDaXBoZXJTcGVjOiAxLAotCQkJCX0sCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6Q0NTX1JFQ0VJVkVEX0VBUkxZOiIsCi0JCX0sCi0JCXsKLQkJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAotCQkJbmFtZTogICAgICJFYXJseUNoYW5nZUNpcGhlclNwZWMtc2VydmVyLTIiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlFYXJseUNoYW5nZUNpcGhlclNwZWM6IDIsCi0JCQkJfSwKLQkJCX0sCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpDQ1NfUkVDRUlWRURfRUFSTFk6IiwKLQkJfSwKLQkJewotCQkJbmFtZTogIlNraXBOZXdTZXNzaW9uVGlja2V0IiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJU2tpcE5ld1Nlc3Npb25UaWNrZXQ6IHRydWUsCi0JCQkJfSwKLQkJCX0sCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpDQ1NfUkVDRUlWRURfRUFSTFk6IiwKLQkJfSwKLQkJewotCQkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCi0JCQluYW1lOiAgICAgIkZhbGxiYWNrU0NTViIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlNYXhWZXJzaW9uOiBWZXJzaW9uVExTMTEsCi0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlTZW5kRmFsbGJhY2tTQ1NWOiB0cnVlLAotCQkJCX0sCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6SU5BUFBST1BSSUFURV9GQUxMQkFDSzoiLAotCQl9LAotCQl7Ci0JCQl0ZXN0VHlwZTogc2VydmVyVGVzdCwKLQkJCW5hbWU6ICAgICAiRmFsbGJhY2tTQ1NWLVZlcnNpb25NYXRjaCIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCVNlbmRGYWxsYmFja1NDU1Y6IHRydWUsCi0JCQkJfSwKLQkJCX0sCi0JCX0sCi0JCXsKLQkJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAotCQkJbmFtZTogICAgICJGcmFnbWVudGVkQ2xpZW50VmVyc2lvbiIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCU1heEhhbmRzaGFrZVJlY29yZExlbmd0aDogMSwKLQkJCQkJRnJhZ21lbnRDbGllbnRWZXJzaW9uOiAgICB0cnVlLAotCQkJCX0sCi0JCQl9LAotCQkJZXhwZWN0ZWRWZXJzaW9uOiBWZXJzaW9uVExTMTIsCi0JCX0sCi0JCXsKLQkJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAotCQkJbmFtZTogICAgICJNaW5vclZlcnNpb25Ub2xlcmFuY2UiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlTZW5kQ2xpZW50VmVyc2lvbjogMHgwM2ZmLAotCQkJCX0sCi0JCQl9LAotCQkJZXhwZWN0ZWRWZXJzaW9uOiBWZXJzaW9uVExTMTIsCi0JCX0sCi0JCXsKLQkJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAotCQkJbmFtZTogICAgICJNYWpvclZlcnNpb25Ub2xlcmFuY2UiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlTZW5kQ2xpZW50VmVyc2lvbjogMHgwNDAwLAotCQkJCX0sCi0JCQl9LAotCQkJZXhwZWN0ZWRWZXJzaW9uOiBWZXJzaW9uVExTMTIsCi0JCX0sCi0JCXsKLQkJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAotCQkJbmFtZTogICAgICJWZXJzaW9uVG9vTG93IiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJU2VuZENsaWVudFZlcnNpb246IDB4MDIwMCwKLQkJCQl9LAotCQkJfSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOlVOU1VQUE9SVEVEX1BST1RPQ09MOiIsCi0JCX0sCi0JCXsKLQkJCXRlc3RUeXBlOiAgICAgIHNlcnZlclRlc3QsCi0JCQluYW1lOiAgICAgICAgICAiSHR0cEdFVCIsCi0JCQlzZW5kUHJlZml4OiAgICAiR0VUIC8gSFRUUC8xLjBcbiIsCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpIVFRQX1JFUVVFU1Q6IiwKLQkJfSwKLQkJewotCQkJdGVzdFR5cGU6ICAgICAgc2VydmVyVGVzdCwKLQkJCW5hbWU6ICAgICAgICAgICJIdHRwUE9TVCIsCi0JCQlzZW5kUHJlZml4OiAgICAiUE9TVCAvIEhUVFAvMS4wXG4iLAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6SFRUUF9SRVFVRVNUOiIsCi0JCX0sCi0JCXsKLQkJCXRlc3RUeXBlOiAgICAgIHNlcnZlclRlc3QsCi0JCQluYW1lOiAgICAgICAgICAiSHR0cEhFQUQiLAotCQkJc2VuZFByZWZpeDogICAgIkhFQUQgLyBIVFRQLzEuMFxuIiwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOkhUVFBfUkVRVUVTVDoiLAotCQl9LAotCQl7Ci0JCQl0ZXN0VHlwZTogICAgICBzZXJ2ZXJUZXN0LAotCQkJbmFtZTogICAgICAgICAgIkh0dHBQVVQiLAotCQkJc2VuZFByZWZpeDogICAgIlBVVCAvIEhUVFAvMS4wXG4iLAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6SFRUUF9SRVFVRVNUOiIsCi0JCX0sCi0JCXsKLQkJCXRlc3RUeXBlOiAgICAgIHNlcnZlclRlc3QsCi0JCQluYW1lOiAgICAgICAgICAiSHR0cENPTk5FQ1QiLAotCQkJc2VuZFByZWZpeDogICAgIkNPTk5FQ1Qgd3d3Lmdvb2dsZS5jb206NDQzIEhUVFAvMS4wXG4iLAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6SFRUUFNfUFJPWFlfUkVRVUVTVDoiLAotCQl9LAotCQl7Ci0JCQl0ZXN0VHlwZTogICAgICBzZXJ2ZXJUZXN0LAotCQkJbmFtZTogICAgICAgICAgIkdhcmJhZ2UiLAotCQkJc2VuZFByZWZpeDogICAgImJsYWgiLAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6V1JPTkdfVkVSU0lPTl9OVU1CRVI6IiwKLQkJfSwKLQkJewotCQkJbmFtZTogIlNraXBDaXBoZXJWZXJzaW9uQ2hlY2siLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQ2lwaGVyU3VpdGVzOiBbXXVpbnQxNntUTFNfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2fSwKLQkJCQlNYXhWZXJzaW9uOiAgIFZlcnNpb25UTFMxMSwKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCVNraXBDaXBoZXJWZXJzaW9uQ2hlY2s6IHRydWUsCi0JCQkJfSwKLQkJCX0sCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpXUk9OR19DSVBIRVJfUkVUVVJORUQ6IiwKLQkJfSwKLQkJewotCQkJbmFtZTogIlJTQUVwaGVtZXJhbEtleSIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2e1RMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEF9LAotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJUlNBRXBoZW1lcmFsS2V5OiB0cnVlLAotCQkJCX0sCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6VU5FWFBFQ1RFRF9NRVNTQUdFOiIsCi0JCX0sCi0JCXsKLQkJCW5hbWU6ICAgICAgICAgICJEaXNhYmxlRXZlcnl0aGluZyIsCi0JCQlmbGFnczogICAgICAgICBbXXN0cmluZ3siLW5vLXRsczEyIiwgIi1uby10bHMxMSIsICItbm8tdGxzMSIsICItbm8tc3NsMyJ9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6V1JPTkdfU1NMX1ZFUlNJT046IiwKLQkJfSwKLQkJewotCQkJcHJvdG9jb2w6ICAgICAgZHRscywKLQkJCW5hbWU6ICAgICAgICAgICJEaXNhYmxlRXZlcnl0aGluZy1EVExTIiwKLQkJCWZsYWdzOiAgICAgICAgIFtdc3RyaW5neyItbm8tdGxzMTIiLCAiLW5vLXRsczEifSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOldST05HX1NTTF9WRVJTSU9OOiIsCi0JCX0sCi0JCXsKLQkJCW5hbWU6ICJOb1NoYXJlZENpcGhlciIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2e30sCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6SEFORFNIQUtFX0ZBSUxVUkVfT05fQ0xJRU5UX0hFTExPOiIsCi0JCX0sCi0JCXsKLQkJCXByb3RvY29sOiBkdGxzLAotCQkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCi0JCQluYW1lOiAgICAgIk1UVSIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCU1heFBhY2tldExlbmd0aDogMjU2LAotCQkJCX0sCi0JCQl9LAotCQkJZmxhZ3M6IFtdc3RyaW5neyItbXR1IiwgIjI1NiJ9LAotCQl9LAotCQl7Ci0JCQlwcm90b2NvbDogZHRscywKLQkJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAotCQkJbmFtZTogICAgICJNVFVFeGNlZWRlZCIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCU1heFBhY2tldExlbmd0aDogMjU1LAotCQkJCX0sCi0JCQl9LAotCQkJZmxhZ3M6ICAgICAgICAgICAgICBbXXN0cmluZ3siLW10dSIsICIyNTYifSwKLQkJCXNob3VsZEZhaWw6ICAgICAgICAgdHJ1ZSwKLQkJCWV4cGVjdGVkTG9jYWxFcnJvcjogImR0bHM6IGV4Y2VlZGVkIG1heGltdW0gcGFja2V0IGxlbmd0aCIsCi0JCX0sCi0JCXsKLQkJCW5hbWU6ICJDZXJ0TWlzbWF0Y2hSU0EiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQ2lwaGVyU3VpdGVzOiBbXXVpbnQxNntUTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTZ9LAotCQkJCUNlcnRpZmljYXRlczogW11DZXJ0aWZpY2F0ZXtnZXRFQ0RTQUNlcnRpZmljYXRlKCl9LAotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJU2VuZENpcGhlclN1aXRlOiBUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2LAotCQkJCX0sCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6V1JPTkdfQ0VSVElGSUNBVEVfVFlQRToiLAotCQl9LAotCQl7Ci0JCQluYW1lOiAiQ2VydE1pc21hdGNoRUNEU0EiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQ2lwaGVyU3VpdGVzOiBbXXVpbnQxNntUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2fSwKLQkJCQlDZXJ0aWZpY2F0ZXM6IFtdQ2VydGlmaWNhdGV7Z2V0UlNBQ2VydGlmaWNhdGUoKX0sCi0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlTZW5kQ2lwaGVyU3VpdGU6IFRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiwKLQkJCQl9LAotCQkJfSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOldST05HX0NFUlRJRklDQVRFX1RZUEU6IiwKLQkJfSwKLQkJewotCQkJbmFtZTogIkVtcHR5Q2VydGlmaWNhdGVMaXN0IiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUNpcGhlclN1aXRlczogW111aW50MTZ7VExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1Nn0sCi0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlFbXB0eUNlcnRpZmljYXRlTGlzdDogdHJ1ZSwKLQkJCQl9LAotCQkJfSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOkRFQ09ERV9FUlJPUjoiLAotCQl9LAotCQl7Ci0JCQluYW1lOiAgICAgICAgICAgICAiVExTRmF0YWxCYWRQYWNrZXRzIiwKLQkJCWRhbWFnZUZpcnN0V3JpdGU6IHRydWUsCi0JCQlzaG91bGRGYWlsOiAgICAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogICAgIjpERUNSWVBUSU9OX0ZBSUxFRF9PUl9CQURfUkVDT1JEX01BQzoiLAotCQl9LAotCQl7Ci0JCQlwcm90b2NvbDogICAgICAgICBkdGxzLAotCQkJbmFtZTogICAgICAgICAgICAgIkRUTFNJZ25vcmVCYWRQYWNrZXRzIiwKLQkJCWRhbWFnZUZpcnN0V3JpdGU6IHRydWUsCi0JCX0sCi0JCXsKLQkJCXByb3RvY29sOiAgICAgICAgIGR0bHMsCi0JCQluYW1lOiAgICAgICAgICAgICAiRFRMU0lnbm9yZUJhZFBhY2tldHMtQXN5bmMiLAotCQkJZGFtYWdlRmlyc3RXcml0ZTogdHJ1ZSwKLQkJCWZsYWdzOiAgICAgICAgICAgIFtdc3RyaW5neyItYXN5bmMifSwKLQkJfSwKLQkJewotCQkJbmFtZTogIkFwcERhdGFCZWZvcmVIYW5kc2hha2UiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlBcHBEYXRhQmVmb3JlSGFuZHNoYWtlOiBbXWJ5dGUoIlRFU1QgTUVTU0FHRSIpLAotCQkJCX0sCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6VU5FWFBFQ1RFRF9SRUNPUkQ6IiwKLQkJfSwKLQkJewotCQkJbmFtZTogIkFwcERhdGFCZWZvcmVIYW5kc2hha2UtRW1wdHkiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlBcHBEYXRhQmVmb3JlSGFuZHNoYWtlOiBbXWJ5dGV7fSwKLQkJCQl9LAotCQkJfSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOlVORVhQRUNURURfUkVDT1JEOiIsCi0JCX0sCi0JCXsKLQkJCXByb3RvY29sOiBkdGxzLAotCQkJbmFtZTogICAgICJBcHBEYXRhQmVmb3JlSGFuZHNoYWtlLURUTFMiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlBcHBEYXRhQmVmb3JlSGFuZHNoYWtlOiBbXWJ5dGUoIlRFU1QgTUVTU0FHRSIpLAotCQkJCX0sCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6VU5FWFBFQ1RFRF9SRUNPUkQ6IiwKLQkJfSwKLQkJewotCQkJcHJvdG9jb2w6IGR0bHMsCi0JCQluYW1lOiAgICAgIkFwcERhdGFCZWZvcmVIYW5kc2hha2UtRFRMUy1FbXB0eSIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCUFwcERhdGFCZWZvcmVIYW5kc2hha2U6IFtdYnl0ZXt9LAotCQkJCX0sCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6VU5FWFBFQ1RFRF9SRUNPUkQ6IiwKLQkJfSwKLQkJewotCQkJbmFtZTogIkFwcERhdGFBZnRlckNoYW5nZUNpcGhlclNwZWMiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlBcHBEYXRhQWZ0ZXJDaGFuZ2VDaXBoZXJTcGVjOiBbXWJ5dGUoIlRFU1QgTUVTU0FHRSIpLAotCQkJCX0sCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6REFUQV9CRVRXRUVOX0NDU19BTkRfRklOSVNIRUQ6IiwKLQkJfSwKLQkJewotCQkJbmFtZTogIkFwcERhdGFBZnRlckNoYW5nZUNpcGhlclNwZWMtRW1wdHkiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlBcHBEYXRhQWZ0ZXJDaGFuZ2VDaXBoZXJTcGVjOiBbXWJ5dGV7fSwKLQkJCQl9LAotCQkJfSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOkRBVEFfQkVUV0VFTl9DQ1NfQU5EX0ZJTklTSEVEOiIsCi0JCX0sCi0JCXsKLQkJCXByb3RvY29sOiBkdGxzLAotCQkJbmFtZTogICAgICJBcHBEYXRhQWZ0ZXJDaGFuZ2VDaXBoZXJTcGVjLURUTFMiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlBcHBEYXRhQWZ0ZXJDaGFuZ2VDaXBoZXJTcGVjOiBbXWJ5dGUoIlRFU1QgTUVTU0FHRSIpLAotCQkJCX0sCi0JCQl9LAotCQkJLy8gQm9yaW5nU1NMJ3MgRFRMUyBpbXBsZW1lbnRhdGlvbiB3aWxsIGRyb3AgdGhlIG91dC1vZi1vcmRlcgotCQkJLy8gYXBwbGljYXRpb24gZGF0YS4KLQkJfSwKLQkJewotCQkJcHJvdG9jb2w6IGR0bHMsCi0JCQluYW1lOiAgICAgIkFwcERhdGFBZnRlckNoYW5nZUNpcGhlclNwZWMtRFRMUy1FbXB0eSIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCUFwcERhdGFBZnRlckNoYW5nZUNpcGhlclNwZWM6IFtdYnl0ZXt9LAotCQkJCX0sCi0JCQl9LAotCQkJLy8gQm9yaW5nU1NMJ3MgRFRMUyBpbXBsZW1lbnRhdGlvbiB3aWxsIGRyb3AgdGhlIG91dC1vZi1vcmRlcgotCQkJLy8gYXBwbGljYXRpb24gZGF0YS4KLQkJfSwKLQkJewotCQkJbmFtZTogIkFsZXJ0QWZ0ZXJDaGFuZ2VDaXBoZXJTcGVjIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJQWxlcnRBZnRlckNoYW5nZUNpcGhlclNwZWM6IGFsZXJ0UmVjb3JkT3ZlcmZsb3csCi0JCQkJfSwKLQkJCX0sCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpUTFNWMV9BTEVSVF9SRUNPUkRfT1ZFUkZMT1c6IiwKLQkJfSwKLQkJewotCQkJcHJvdG9jb2w6IGR0bHMsCi0JCQluYW1lOiAgICAgIkFsZXJ0QWZ0ZXJDaGFuZ2VDaXBoZXJTcGVjLURUTFMiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlBbGVydEFmdGVyQ2hhbmdlQ2lwaGVyU3BlYzogYWxlcnRSZWNvcmRPdmVyZmxvdywKLQkJCQl9LAotCQkJfSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOlRMU1YxX0FMRVJUX1JFQ09SRF9PVkVSRkxPVzoiLAotCQl9LAotCQl7Ci0JCQlwcm90b2NvbDogZHRscywKLQkJCW5hbWU6ICAgICAiUmVvcmRlckhhbmRzaGFrZUZyYWdtZW50cy1TbWFsbC1EVExTIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJUmVvcmRlckhhbmRzaGFrZUZyYWdtZW50czogdHJ1ZSwKLQkJCQkJLy8gU21hbGwgZW5vdWdoIHRoYXQgZXZlcnkgaGFuZHNoYWtlIG1lc3NhZ2UgaXMKLQkJCQkJLy8gZnJhZ21lbnRlZC4KLQkJCQkJTWF4SGFuZHNoYWtlUmVjb3JkTGVuZ3RoOiAyLAotCQkJCX0sCi0JCQl9LAotCQl9LAotCQl7Ci0JCQlwcm90b2NvbDogZHRscywKLQkJCW5hbWU6ICAgICAiUmVvcmRlckhhbmRzaGFrZUZyYWdtZW50cy1MYXJnZS1EVExTIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJUmVvcmRlckhhbmRzaGFrZUZyYWdtZW50czogdHJ1ZSwKLQkJCQkJLy8gTGFyZ2UgZW5vdWdoIHRoYXQgbm8gaGFuZHNoYWtlIG1lc3NhZ2UgaXMKLQkJCQkJLy8gZnJhZ21lbnRlZC4KLQkJCQkJTWF4SGFuZHNoYWtlUmVjb3JkTGVuZ3RoOiAyMDQ4LAotCQkJCX0sCi0JCQl9LAotCQl9LAotCQl7Ci0JCQlwcm90b2NvbDogZHRscywKLQkJCW5hbWU6ICAgICAiTWl4Q29tcGxldGVNZXNzYWdlV2l0aEZyYWdtZW50cy1EVExTIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJUmVvcmRlckhhbmRzaGFrZUZyYWdtZW50czogICAgICAgdHJ1ZSwKLQkJCQkJTWl4Q29tcGxldGVNZXNzYWdlV2l0aEZyYWdtZW50czogdHJ1ZSwKLQkJCQkJTWF4SGFuZHNoYWtlUmVjb3JkTGVuZ3RoOiAgICAgICAgMiwKLQkJCQl9LAotCQkJfSwKLQkJfSwKLQkJewotCQkJbmFtZTogIlNlbmRJbnZhbGlkUmVjb3JkVHlwZSIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCVNlbmRJbnZhbGlkUmVjb3JkVHlwZTogdHJ1ZSwKLQkJCQl9LAotCQkJfSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOlVORVhQRUNURURfUkVDT1JEOiIsCi0JCX0sCi0JCXsKLQkJCXByb3RvY29sOiBkdGxzLAotCQkJbmFtZTogICAgICJTZW5kSW52YWxpZFJlY29yZFR5cGUtRFRMUyIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCVNlbmRJbnZhbGlkUmVjb3JkVHlwZTogdHJ1ZSwKLQkJCQl9LAotCQkJfSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOlVORVhQRUNURURfUkVDT1JEOiIsCi0JCX0sCi0JCXsKLQkJCW5hbWU6ICJGYWxzZVN0YXJ0LVNraXBTZXJ2ZXJTZWNvbmRMZWciLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQ2lwaGVyU3VpdGVzOiBbXXVpbnQxNntUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2fSwKLQkJCQlOZXh0UHJvdG9zOiAgIFtdc3RyaW5neyJmb28ifSwKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCVNraXBOZXdTZXNzaW9uVGlja2V0OiB0cnVlLAotCQkJCQlTa2lwQ2hhbmdlQ2lwaGVyU3BlYzogdHJ1ZSwKLQkJCQkJU2tpcEZpbmlzaGVkOiAgICAgICAgIHRydWUsCi0JCQkJCUV4cGVjdEZhbHNlU3RhcnQ6ICAgICB0cnVlLAotCQkJCX0sCi0JCQl9LAotCQkJZmxhZ3M6IFtdc3RyaW5newotCQkJCSItZmFsc2Utc3RhcnQiLAotCQkJCSItaGFuZHNoYWtlLW5ldmVyLWRvbmUiLAotCQkJCSItYWR2ZXJ0aXNlLWFscG4iLCAiXHgwM2ZvbyIsCi0JCQl9LAotCQkJc2hpbVdyaXRlc0ZpcnN0OiB0cnVlLAotCQkJc2hvdWxkRmFpbDogICAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogICAiOlVORVhQRUNURURfUkVDT1JEOiIsCi0JCX0sCi0JCXsKLQkJCW5hbWU6ICJGYWxzZVN0YXJ0LVNraXBTZXJ2ZXJTZWNvbmRMZWctSW1wbGljaXQiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQ2lwaGVyU3VpdGVzOiBbXXVpbnQxNntUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2fSwKLQkJCQlOZXh0UHJvdG9zOiAgIFtdc3RyaW5neyJmb28ifSwKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCVNraXBOZXdTZXNzaW9uVGlja2V0OiB0cnVlLAotCQkJCQlTa2lwQ2hhbmdlQ2lwaGVyU3BlYzogdHJ1ZSwKLQkJCQkJU2tpcEZpbmlzaGVkOiAgICAgICAgIHRydWUsCi0JCQkJfSwKLQkJCX0sCi0JCQlmbGFnczogW11zdHJpbmd7Ci0JCQkJIi1pbXBsaWNpdC1oYW5kc2hha2UiLAotCQkJCSItZmFsc2Utc3RhcnQiLAotCQkJCSItaGFuZHNoYWtlLW5ldmVyLWRvbmUiLAotCQkJCSItYWR2ZXJ0aXNlLWFscG4iLCAiXHgwM2ZvbyIsCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6VU5FWFBFQ1RFRF9SRUNPUkQ6IiwKLQkJfSwKLQkJewotCQkJdGVzdFR5cGU6ICAgICAgICAgICBzZXJ2ZXJUZXN0LAotCQkJbmFtZTogICAgICAgICAgICAgICAiRmFpbEVhcmx5Q2FsbGJhY2siLAotCQkJZmxhZ3M6ICAgICAgICAgICAgICBbXXN0cmluZ3siLWZhaWwtZWFybHktY2FsbGJhY2sifSwKLQkJCXNob3VsZEZhaWw6ICAgICAgICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICAgICAgIjpDT05ORUNUSU9OX1JFSkVDVEVEOiIsCi0JCQlleHBlY3RlZExvY2FsRXJyb3I6ICJyZW1vdGUgZXJyb3I6IGFjY2VzcyBkZW5pZWQiLAotCQl9LAotCQl7Ci0JCQluYW1lOiAiV3JvbmdNZXNzYWdlVHlwZSIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCVdyb25nQ2VydGlmaWNhdGVNZXNzYWdlVHlwZTogdHJ1ZSwKLQkJCQl9LAotCQkJfSwKLQkJCXNob3VsZEZhaWw6ICAgICAgICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICAgICAgIjpVTkVYUEVDVEVEX01FU1NBR0U6IiwKLQkJCWV4cGVjdGVkTG9jYWxFcnJvcjogInJlbW90ZSBlcnJvcjogdW5leHBlY3RlZCBtZXNzYWdlIiwKLQkJfSwKLQkJewotCQkJcHJvdG9jb2w6IGR0bHMsCi0JCQluYW1lOiAgICAgIldyb25nTWVzc2FnZVR5cGUtRFRMUyIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCVdyb25nQ2VydGlmaWNhdGVNZXNzYWdlVHlwZTogdHJ1ZSwKLQkJCQl9LAotCQkJfSwKLQkJCXNob3VsZEZhaWw6ICAgICAgICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICAgICAgIjpVTkVYUEVDVEVEX01FU1NBR0U6IiwKLQkJCWV4cGVjdGVkTG9jYWxFcnJvcjogInJlbW90ZSBlcnJvcjogdW5leHBlY3RlZCBtZXNzYWdlIiwKLQkJfSwKLQkJewotCQkJcHJvdG9jb2w6IGR0bHMsCi0JCQluYW1lOiAgICAgIkZyYWdtZW50TWVzc2FnZVR5cGVNaXNtYXRjaC1EVExTIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJTWF4SGFuZHNoYWtlUmVjb3JkTGVuZ3RoOiAgICAyLAotCQkJCQlGcmFnbWVudE1lc3NhZ2VUeXBlTWlzbWF0Y2g6IHRydWUsCi0JCQkJfSwKLQkJCX0sCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpGUkFHTUVOVF9NSVNNQVRDSDoiLAotCQl9LAotCQl7Ci0JCQlwcm90b2NvbDogZHRscywKLQkJCW5hbWU6ICAgICAiRnJhZ21lbnRNZXNzYWdlTGVuZ3RoTWlzbWF0Y2gtRFRMUyIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCU1heEhhbmRzaGFrZVJlY29yZExlbmd0aDogICAgICAyLAotCQkJCQlGcmFnbWVudE1lc3NhZ2VMZW5ndGhNaXNtYXRjaDogdHJ1ZSwKLQkJCQl9LAotCQkJfSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOkZSQUdNRU5UX01JU01BVENIOiIsCi0JCX0sCi0JCXsKLQkJCXByb3RvY29sOiBkdGxzLAotCQkJbmFtZTogICAgICJTcGxpdEZyYWdtZW50cy1IZWFkZXItRFRMUyIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCVNwbGl0RnJhZ21lbnRzOiAyLAotCQkJCX0sCi0JCQl9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6VU5FWFBFQ1RFRF9NRVNTQUdFOiIsCi0JCX0sCi0JCXsKLQkJCXByb3RvY29sOiBkdGxzLAotCQkJbmFtZTogICAgICJTcGxpdEZyYWdtZW50cy1Cb3VuZGFyeS1EVExTIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJU3BsaXRGcmFnbWVudHM6IGR0bHNSZWNvcmRIZWFkZXJMZW4sCi0JCQkJfSwKLQkJCX0sCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpFWENFU1NJVkVfTUVTU0FHRV9TSVpFOiIsCi0JCX0sCi0JCXsKLQkJCXByb3RvY29sOiBkdGxzLAotCQkJbmFtZTogICAgICJTcGxpdEZyYWdtZW50cy1Cb2R5LURUTFMiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlTcGxpdEZyYWdtZW50czogZHRsc1JlY29yZEhlYWRlckxlbiArIDEsCi0JCQkJfSwKLQkJCX0sCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpFWENFU1NJVkVfTUVTU0FHRV9TSVpFOiIsCi0JCX0sCi0JCXsKLQkJCXByb3RvY29sOiBkdGxzLAotCQkJbmFtZTogICAgICJTZW5kRW1wdHlGcmFnbWVudHMtRFRMUyIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCVNlbmRFbXB0eUZyYWdtZW50czogdHJ1ZSwKLQkJCQl9LAotCQkJfSwKLQkJfSwKLQkJewotCQkJbmFtZTogIlVuc3VwcG9ydGVkQ2lwaGVyU3VpdGUiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQ2lwaGVyU3VpdGVzOiBbXXVpbnQxNntUTFNfUlNBX1dJVEhfUkM0XzEyOF9TSEF9LAotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJSWdub3JlUGVlckNpcGhlclByZWZlcmVuY2VzOiB0cnVlLAotCQkJCX0sCi0JCQl9LAotCQkJZmxhZ3M6ICAgICAgICAgW11zdHJpbmd7Ii1jaXBoZXIiLCAiREVGQVVMVDohUkM0In0sCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpXUk9OR19DSVBIRVJfUkVUVVJORUQ6IiwKLQkJfSwKLQkJewotCQkJbmFtZTogIlVuc3VwcG9ydGVkQ3VydmUiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQ2lwaGVyU3VpdGVzOiBbXXVpbnQxNntUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2fSwKLQkJCQkvLyBCb3JpbmdTU0wgaW1wbGVtZW50cyBQLTIyNCBidXQgZG9lc24ndCBlbmFibGUgaXQgYnkKLQkJCQkvLyBkZWZhdWx0LgotCQkJCUN1cnZlUHJlZmVyZW5jZXM6IFtdQ3VydmVJRHtDdXJ2ZVAyMjR9LAotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJSWdub3JlUGVlckN1cnZlUHJlZmVyZW5jZXM6IHRydWUsCi0JCQkJfSwKLQkJCX0sCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpXUk9OR19DVVJWRToiLAotCQl9LAotCQl7Ci0JCQluYW1lOiAiQmFkRmluaXNoZWQiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlCYWRGaW5pc2hlZDogdHJ1ZSwKLQkJCQl9LAotCQkJfSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOkRJR0VTVF9DSEVDS19GQUlMRUQ6IiwKLQkJfSwKLQkJewotCQkJbmFtZTogIkZhbHNlU3RhcnQtQmFkRmluaXNoZWQiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQ2lwaGVyU3VpdGVzOiBbXXVpbnQxNntUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2fSwKLQkJCQlOZXh0UHJvdG9zOiAgIFtdc3RyaW5neyJmb28ifSwKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCUJhZEZpbmlzaGVkOiAgICAgIHRydWUsCi0JCQkJCUV4cGVjdEZhbHNlU3RhcnQ6IHRydWUsCi0JCQkJfSwKLQkJCX0sCi0JCQlmbGFnczogW11zdHJpbmd7Ci0JCQkJIi1mYWxzZS1zdGFydCIsCi0JCQkJIi1oYW5kc2hha2UtbmV2ZXItZG9uZSIsCi0JCQkJIi1hZHZlcnRpc2UtYWxwbiIsICJceDAzZm9vIiwKLQkJCX0sCi0JCQlzaGltV3JpdGVzRmlyc3Q6IHRydWUsCi0JCQlzaG91bGRGYWlsOiAgICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAgICI6RElHRVNUX0NIRUNLX0ZBSUxFRDoiLAotCQl9LAotCQl7Ci0JCQluYW1lOiAiTm9GYWxzZVN0YXJ0LU5vQUxQTiIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2e1RMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTZ9LAotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJRXhwZWN0RmFsc2VTdGFydDogICAgICAgICAgdHJ1ZSwKLQkJCQkJQWxlcnRCZWZvcmVGYWxzZVN0YXJ0VGVzdDogYWxlcnRBY2Nlc3NEZW5pZWQsCi0JCQkJfSwKLQkJCX0sCi0JCQlmbGFnczogW11zdHJpbmd7Ci0JCQkJIi1mYWxzZS1zdGFydCIsCi0JCQl9LAotCQkJc2hpbVdyaXRlc0ZpcnN0OiAgICB0cnVlLAotCQkJc2hvdWxkRmFpbDogICAgICAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogICAgICAiOlRMU1YxX0FMRVJUX0FDQ0VTU19ERU5JRUQ6IiwKLQkJCWV4cGVjdGVkTG9jYWxFcnJvcjogInRsczogcGVlciBkaWQgbm90IGZhbHNlIHN0YXJ0OiBFT0YiLAotCQl9LAotCQl7Ci0JCQluYW1lOiAiTm9GYWxzZVN0YXJ0LU5vQUVBRCIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2e1RMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEF9LAotCQkJCU5leHRQcm90b3M6ICAgW11zdHJpbmd7ImZvbyJ9LAotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJRXhwZWN0RmFsc2VTdGFydDogICAgICAgICAgdHJ1ZSwKLQkJCQkJQWxlcnRCZWZvcmVGYWxzZVN0YXJ0VGVzdDogYWxlcnRBY2Nlc3NEZW5pZWQsCi0JCQkJfSwKLQkJCX0sCi0JCQlmbGFnczogW11zdHJpbmd7Ci0JCQkJIi1mYWxzZS1zdGFydCIsCi0JCQkJIi1hZHZlcnRpc2UtYWxwbiIsICJceDAzZm9vIiwKLQkJCX0sCi0JCQlzaGltV3JpdGVzRmlyc3Q6ICAgIHRydWUsCi0JCQlzaG91bGRGYWlsOiAgICAgICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAgICAgICI6VExTVjFfQUxFUlRfQUNDRVNTX0RFTklFRDoiLAotCQkJZXhwZWN0ZWRMb2NhbEVycm9yOiAidGxzOiBwZWVyIGRpZCBub3QgZmFsc2Ugc3RhcnQ6IEVPRiIsCi0JCX0sCi0JCXsKLQkJCW5hbWU6ICJOb0ZhbHNlU3RhcnQtUlNBIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUNpcGhlclN1aXRlczogW111aW50MTZ7VExTX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1Nn0sCi0JCQkJTmV4dFByb3RvczogICBbXXN0cmluZ3siZm9vIn0sCi0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlFeHBlY3RGYWxzZVN0YXJ0OiAgICAgICAgICB0cnVlLAotCQkJCQlBbGVydEJlZm9yZUZhbHNlU3RhcnRUZXN0OiBhbGVydEFjY2Vzc0RlbmllZCwKLQkJCQl9LAotCQkJfSwKLQkJCWZsYWdzOiBbXXN0cmluZ3sKLQkJCQkiLWZhbHNlLXN0YXJ0IiwKLQkJCQkiLWFkdmVydGlzZS1hbHBuIiwgIlx4MDNmb28iLAotCQkJfSwKLQkJCXNoaW1Xcml0ZXNGaXJzdDogICAgdHJ1ZSwKLQkJCXNob3VsZEZhaWw6ICAgICAgICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICAgICAgIjpUTFNWMV9BTEVSVF9BQ0NFU1NfREVOSUVEOiIsCi0JCQlleHBlY3RlZExvY2FsRXJyb3I6ICJ0bHM6IHBlZXIgZGlkIG5vdCBmYWxzZSBzdGFydDogRU9GIiwKLQkJfSwKLQkJewotCQkJbmFtZTogIk5vRmFsc2VTdGFydC1ESEVfUlNBIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUNpcGhlclN1aXRlczogW111aW50MTZ7VExTX0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTZ9LAotCQkJCU5leHRQcm90b3M6ICAgW11zdHJpbmd7ImZvbyJ9LAotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJRXhwZWN0RmFsc2VTdGFydDogICAgICAgICAgdHJ1ZSwKLQkJCQkJQWxlcnRCZWZvcmVGYWxzZVN0YXJ0VGVzdDogYWxlcnRBY2Nlc3NEZW5pZWQsCi0JCQkJfSwKLQkJCX0sCi0JCQlmbGFnczogW11zdHJpbmd7Ci0JCQkJIi1mYWxzZS1zdGFydCIsCi0JCQkJIi1hZHZlcnRpc2UtYWxwbiIsICJceDAzZm9vIiwKLQkJCX0sCi0JCQlzaGltV3JpdGVzRmlyc3Q6ICAgIHRydWUsCi0JCQlzaG91bGRGYWlsOiAgICAgICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAgICAgICI6VExTVjFfQUxFUlRfQUNDRVNTX0RFTklFRDoiLAotCQkJZXhwZWN0ZWRMb2NhbEVycm9yOiAidGxzOiBwZWVyIGRpZCBub3QgZmFsc2Ugc3RhcnQ6IEVPRiIsCi0JCX0sCi0JCXsKLQkJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAotCQkJbmFtZTogICAgICJOb1N1cHBvcnRlZEN1cnZlcyIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2e1RMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTZ9LAotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJTm9TdXBwb3J0ZWRDdXJ2ZXM6IHRydWUsCi0JCQkJfSwKLQkJCX0sCi0JCX0sCi0JCXsKLQkJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAotCQkJbmFtZTogICAgICJOb0NvbW1vbkN1cnZlcyIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlDaXBoZXJTdWl0ZXM6IFtddWludDE2ewotCQkJCQlUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2LAotCQkJCQlUTFNfREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiwKLQkJCQl9LAotCQkJCUN1cnZlUHJlZmVyZW5jZXM6IFtdQ3VydmVJRHtDdXJ2ZVAyMjR9LAotCQkJfSwKLQkJCWV4cGVjdGVkQ2lwaGVyOiBUTFNfREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiwKLQkJfSwKLQkJewotCQkJcHJvdG9jb2w6IGR0bHMsCi0JCQluYW1lOiAgICAgIlNlbmRTcGxpdEFsZXJ0LVN5bmMiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlTZW5kU3BsaXRBbGVydDogdHJ1ZSwKLQkJCQl9LAotCQkJfSwKLQkJfSwKLQkJewotCQkJcHJvdG9jb2w6IGR0bHMsCi0JCQluYW1lOiAgICAgIlNlbmRTcGxpdEFsZXJ0LUFzeW5jIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJU2VuZFNwbGl0QWxlcnQ6IHRydWUsCi0JCQkJfSwKLQkJCX0sCi0JCQlmbGFnczogW11zdHJpbmd7Ii1hc3luYyJ9LAotCQl9LAotCQl7Ci0JCQlwcm90b2NvbDogZHRscywKLQkJCW5hbWU6ICAgICAiUGFja0RUTFNIYW5kc2hha2UiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlNYXhIYW5kc2hha2VSZWNvcmRMZW5ndGg6IDIsCi0JCQkJCVBhY2tIYW5kc2hha2VGcmFnbWVudHM6ICAgMjAsCi0JCQkJCVBhY2tIYW5kc2hha2VSZWNvcmRzOiAgICAgMjAwLAotCQkJCX0sCi0JCQl9LAotCQl9LAotCQl7Ci0JCQl0ZXN0VHlwZTogc2VydmVyVGVzdCwKLQkJCXByb3RvY29sOiBkdGxzLAotCQkJbmFtZTogICAgICJOb1JDNC1EVExTIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUNpcGhlclN1aXRlczogW111aW50MTZ7VExTX0VDREhFX1JTQV9XSVRIX1JDNF8xMjhfU0hBfSwKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCUVuYWJsZUFsbENpcGhlcnNJbkRUTFM6IHRydWUsCi0JCQkJfSwKLQkJCX0sCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpOT19TSEFSRURfQ0lQSEVSOiIsCi0JCX0sCi0JCXsKLQkJCW5hbWU6ICAgICAgICAgICAgICJTZW5kRW1wdHlSZWNvcmRzLVBhc3MiLAotCQkJc2VuZEVtcHR5UmVjb3JkczogMzIsCi0JCX0sCi0JCXsKLQkJCW5hbWU6ICAgICAgICAgICAgICJTZW5kRW1wdHlSZWNvcmRzIiwKLQkJCXNlbmRFbXB0eVJlY29yZHM6IDMzLAotCQkJc2hvdWxkRmFpbDogICAgICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICAgICI6VE9PX01BTllfRU1QVFlfRlJBR01FTlRTOiIsCi0JCX0sCi0JCXsKLQkJCW5hbWU6ICAgICAgICAgICAgICJTZW5kRW1wdHlSZWNvcmRzLUFzeW5jIiwKLQkJCXNlbmRFbXB0eVJlY29yZHM6IDMzLAotCQkJZmxhZ3M6ICAgICAgICAgICAgW11zdHJpbmd7Ii1hc3luYyJ9LAotCQkJc2hvdWxkRmFpbDogICAgICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICAgICI6VE9PX01BTllfRU1QVFlfRlJBR01FTlRTOiIsCi0JCX0sCi0JCXsKLQkJCW5hbWU6ICAgICAgICAgICAgICAiU2VuZFdhcm5pbmdBbGVydHMtUGFzcyIsCi0JCQlzZW5kV2FybmluZ0FsZXJ0czogNCwKLQkJfSwKLQkJewotCQkJcHJvdG9jb2w6ICAgICAgICAgIGR0bHMsCi0JCQluYW1lOiAgICAgICAgICAgICAgIlNlbmRXYXJuaW5nQWxlcnRzLURUTFMtUGFzcyIsCi0JCQlzZW5kV2FybmluZ0FsZXJ0czogNCwKLQkJfSwKLQkJewotCQkJbmFtZTogICAgICAgICAgICAgICJTZW5kV2FybmluZ0FsZXJ0cyIsCi0JCQlzZW5kV2FybmluZ0FsZXJ0czogNSwKLQkJCXNob3VsZEZhaWw6ICAgICAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogICAgICI6VE9PX01BTllfV0FSTklOR19BTEVSVFM6IiwKLQkJfSwKLQkJewotCQkJbmFtZTogICAgICAgICAgICAgICJTZW5kV2FybmluZ0FsZXJ0cy1Bc3luYyIsCi0JCQlzZW5kV2FybmluZ0FsZXJ0czogNSwKLQkJCWZsYWdzOiAgICAgICAgICAgICBbXXN0cmluZ3siLWFzeW5jIn0sCi0JCQlzaG91bGRGYWlsOiAgICAgICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICAgICAiOlRPT19NQU5ZX1dBUk5JTkdfQUxFUlRTOiIsCi0JCX0sCi0JCXsKLQkJCW5hbWU6ICJFbXB0eVNlc3Npb25JRCIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlTZXNzaW9uVGlja2V0c0Rpc2FibGVkOiB0cnVlLAotCQkJfSwKLQkJCW5vU2Vzc2lvbkNhY2hlOiB0cnVlLAotCQkJZmxhZ3M6ICAgICAgICAgIFtdc3RyaW5neyItZXhwZWN0LW5vLXNlc3Npb24ifSwKLQkJfSwKLQkJewotCQkJbmFtZTogIlVuY2xlYW4tU2h1dGRvd24iLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlOb0Nsb3NlTm90aWZ5OiAgICAgdHJ1ZSwKLQkJCQkJRXhwZWN0Q2xvc2VOb3RpZnk6IHRydWUsCi0JCQkJfSwKLQkJCX0sCi0JCQlzaGltU2h1dHNEb3duOiB0cnVlLAotCQkJZmxhZ3M6ICAgICAgICAgW11zdHJpbmd7Ii1jaGVjay1jbG9zZS1ub3RpZnkifSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiVW5leHBlY3RlZCBTU0xfc2h1dGRvd24gcmVzdWx0OiAtMSAhPSAxIiwKLQkJfSwKLQkJewotCQkJbmFtZTogIlVuY2xlYW4tU2h1dGRvd24tSWdub3JlZCIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCU5vQ2xvc2VOb3RpZnk6IHRydWUsCi0JCQkJfSwKLQkJCX0sCi0JCQlzaGltU2h1dHNEb3duOiB0cnVlLAotCQl9LAotCQl7Ci0JCQluYW1lOiAiTGFyZ2VQbGFpbnRleHQiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlTZW5kTGFyZ2VSZWNvcmRzOiB0cnVlLAotCQkJCX0sCi0JCQl9LAotCQkJbWVzc2FnZUxlbjogICAgbWF4UGxhaW50ZXh0ICsgMSwKLQkJCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCQlleHBlY3RlZEVycm9yOiAiOkRBVEFfTEVOR1RIX1RPT19MT05HOiIsCi0JCX0sCi0JCXsKLQkJCXByb3RvY29sOiBkdGxzLAotCQkJbmFtZTogICAgICJMYXJnZVBsYWludGV4dC1EVExTIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJU2VuZExhcmdlUmVjb3JkczogdHJ1ZSwKLQkJCQl9LAotCQkJfSwKLQkJCW1lc3NhZ2VMZW46ICAgIG1heFBsYWludGV4dCArIDEsCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpEQVRBX0xFTkdUSF9UT09fTE9ORzoiLAotCQl9LAotCQl7Ci0JCQluYW1lOiAiTGFyZ2VDaXBoZXJ0ZXh0IiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJU2VuZExhcmdlUmVjb3JkczogdHJ1ZSwKLQkJCQl9LAotCQkJfSwKLQkJCW1lc3NhZ2VMZW46ICAgIG1heFBsYWludGV4dCAqIDIsCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpFTkNSWVBURURfTEVOR1RIX1RPT19MT05HOiIsCi0JCX0sCi0JCXsKLQkJCXByb3RvY29sOiBkdGxzLAotCQkJbmFtZTogICAgICJMYXJnZUNpcGhlcnRleHQtRFRMUyIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCVNlbmRMYXJnZVJlY29yZHM6IHRydWUsCi0JCQkJfSwKLQkJCX0sCi0JCQltZXNzYWdlTGVuOiBtYXhQbGFpbnRleHQgKiAyLAotCQkJLy8gVW5saWtlIHRoZSBvdGhlciBmb3VyIGNhc2VzLCBEVExTIGRyb3BzIHJlY29yZHMgd2hpY2gKLQkJCS8vIGFyZSBpbnZhbGlkIGJlZm9yZSBhdXRoZW50aWNhdGlvbiwgc28gdGhlIGNvbm5lY3Rpb24KLQkJCS8vIGRvZXMgbm90IGZhaWwuCi0JCQlleHBlY3RNZXNzYWdlRHJvcHBlZDogdHJ1ZSwKLQkJfSwKLQl9Ci0JdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgYmFzaWNUZXN0cy4uLikKLX0KLQogZnVuYyBhZGRDaXBoZXJTdWl0ZVRlc3RzKCkgewogCWZvciBfLCBzdWl0ZSA6PSByYW5nZSB0ZXN0Q2lwaGVyU3VpdGVzIHsKIAkJY29uc3QgcHNrID0gIjEyMzQ1IgpAQCAtMTk4OCwxMCArMTY3OSw2IEBACiAJCQkJIi1wc2siLCBwc2ssCiAJCQkJIi1wc2staWRlbnRpdHkiLCBwc2tJZGVudGl0eSkKIAkJfQotCQlpZiBoYXNDb21wb25lbnQoc3VpdGUubmFtZSwgIk5VTEwiKSB7Ci0JCQkvLyBOVUxMIGNpcGhlcnMgbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWQuCi0JCQlmbGFncyA9IGFwcGVuZChmbGFncywgIi1jaXBoZXIiLCAiREVGQVVMVDpOVUxMLVNIQSIpCi0JCX0KIAogCQlmb3IgXywgdmVyIDo9IHJhbmdlIHRsc1ZlcnNpb25zIHsKIAkJCWlmIHZlci52ZXJzaW9uIDwgVmVyc2lvblRMUzEyICYmIGlzVExTMTJPbmx5KHN1aXRlLm5hbWUpIHsKQEAgLTIwNjUsNDcgKzE3NTIsNiBAQAogCQkJCX0pCiAJCQl9CiAJCX0KLQotCQkvLyBFbnN1cmUgYm90aCBUTFMgYW5kIERUTFMgYWNjZXB0IHRoZWlyIG1heGltdW0gcmVjb3JkIHNpemVzLgotCQl0ZXN0Q2FzZXMgPSBhcHBlbmQodGVzdENhc2VzLCB0ZXN0Q2FzZXsKLQkJCW5hbWU6IHN1aXRlLm5hbWUgKyAiLUxhcmdlUmVjb3JkIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUNpcGhlclN1aXRlczogICAgICAgICBbXXVpbnQxNntzdWl0ZS5pZH0sCi0JCQkJQ2VydGlmaWNhdGVzOiAgICAgICAgIFtdQ2VydGlmaWNhdGV7Y2VydH0sCi0JCQkJUHJlU2hhcmVkS2V5OiAgICAgICAgIFtdYnl0ZShwc2spLAotCQkJCVByZVNoYXJlZEtleUlkZW50aXR5OiBwc2tJZGVudGl0eSwKLQkJCX0sCi0JCQlmbGFnczogICAgICBmbGFncywKLQkJCW1lc3NhZ2VMZW46IG1heFBsYWludGV4dCwKLQkJfSkKLQkJdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgdGVzdENhc2V7Ci0JCQluYW1lOiBzdWl0ZS5uYW1lICsgIi1MYXJnZVJlY29yZC1FeHRyYSIsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlDaXBoZXJTdWl0ZXM6ICAgICAgICAgW111aW50MTZ7c3VpdGUuaWR9LAotCQkJCUNlcnRpZmljYXRlczogICAgICAgICBbXUNlcnRpZmljYXRle2NlcnR9LAotCQkJCVByZVNoYXJlZEtleTogICAgICAgICBbXWJ5dGUocHNrKSwKLQkJCQlQcmVTaGFyZWRLZXlJZGVudGl0eTogcHNrSWRlbnRpdHksCi0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlTZW5kTGFyZ2VSZWNvcmRzOiB0cnVlLAotCQkJCX0sCi0JCQl9LAotCQkJZmxhZ3M6ICAgICAgYXBwZW5kKGZsYWdzLCAiLW1pY3Jvc29mdC1iaWctc3NsdjMtYnVmZmVyIiksCi0JCQltZXNzYWdlTGVuOiBtYXhQbGFpbnRleHQgKyAxNjM4NCwKLQkJfSkKLQkJaWYgaXNEVExTQ2lwaGVyKHN1aXRlLm5hbWUpIHsKLQkJCXRlc3RDYXNlcyA9IGFwcGVuZCh0ZXN0Q2FzZXMsIHRlc3RDYXNlewotCQkJCXByb3RvY29sOiBkdGxzLAotCQkJCW5hbWU6ICAgICBzdWl0ZS5uYW1lICsgIi1MYXJnZVJlY29yZC1EVExTIiwKLQkJCQljb25maWc6IENvbmZpZ3sKLQkJCQkJQ2lwaGVyU3VpdGVzOiAgICAgICAgIFtddWludDE2e3N1aXRlLmlkfSwKLQkJCQkJQ2VydGlmaWNhdGVzOiAgICAgICAgIFtdQ2VydGlmaWNhdGV7Y2VydH0sCi0JCQkJCVByZVNoYXJlZEtleTogICAgICAgICBbXWJ5dGUocHNrKSwKLQkJCQkJUHJlU2hhcmVkS2V5SWRlbnRpdHk6IHBza0lkZW50aXR5LAotCQkJCX0sCi0JCQkJZmxhZ3M6ICAgICAgZmxhZ3MsCi0JCQkJbWVzc2FnZUxlbjogbWF4UGxhaW50ZXh0LAotCQkJfSkKLQkJfQogCX0KIAogCXRlc3RDYXNlcyA9IGFwcGVuZCh0ZXN0Q2FzZXMsIHRlc3RDYXNlewpAQCAtMjEyMiw5NCArMTc2OCw2IEBACiAJCXNob3VsZEZhaWw6ICAgIHRydWUsCiAJCWV4cGVjdGVkRXJyb3I6ICJCQURfREhfUF9MRU5HVEgiLAogCX0pCi0KLQkvLyB2ZXJzaW9uU3BlY2lmaWNDaXBoZXJzVGVzdCBzcGVjaWZpZXMgYSB0ZXN0IGZvciB0aGUgVExTIDEuMCBhbmQgVExTCi0JLy8gMS4xIHNwZWNpZmljIGNpcGhlciBzdWl0ZSBzZXR0aW5ncy4gQSBzZXJ2ZXIgaXMgc2V0dXAgd2l0aCB0aGUgZ2l2ZW4KLQkvLyBjaXBoZXIgbGlzdHMgYW5kIHRoZW4gYSBjb25uZWN0aW9uIGlzIG1hZGUgZm9yIGVhY2ggbWVtYmVyIG9mCi0JLy8gZXhwZWN0YXRpb25zLiBUaGUgY2lwaGVyIHN1aXRlIHRoYXQgdGhlIHNlcnZlciBzZWxlY3RzIG11c3QgbWF0Y2gKLQkvLyB0aGUgc3BlY2lmaWVkIG9uZS4KLQl2YXIgdmVyc2lvblNwZWNpZmljQ2lwaGVyc1Rlc3QgPSBbXXN0cnVjdCB7Ci0JCWNpcGhlcnNEZWZhdWx0LCBjaXBoZXJzVExTMTAsIGNpcGhlcnNUTFMxMSBzdHJpbmcKLQkJLy8gZXhwZWN0YXRpb25zIGlzIGEgbWFwIGZyb20gVExTIHZlcnNpb24gdG8gY2lwaGVyIHN1aXRlIGlkLgotCQlleHBlY3RhdGlvbnMgbWFwW3VpbnQxNl11aW50MTYKLQl9ewotCQl7Ci0JCQkvLyBUZXN0IHRoYXQgdGhlIG51bGwgY2FzZSAod2hlcmUgbm8gdmVyc2lvbi1zcGVjaWZpYyBjaXBoZXJzIGFyZSBzZXQpCi0JCQkvLyB3b3JrcyBhcyBleHBlY3RlZC4KLQkJCSJSQzQtU0hBOkFFUzEyOC1TSEEiLCAvLyBkZWZhdWx0IGNpcGhlcnMKLQkJCSIiLCAgICAgICAgICAgICAgICAgICAvLyBubyBjaXBoZXJzIHNwZWNpZmljYWxseSBmb3IgVExTIOKJpSAxLjAKLQkJCSIiLCAgICAgICAgICAgICAgICAgICAvLyBubyBjaXBoZXJzIHNwZWNpZmljYWxseSBmb3IgVExTIOKJpSAxLjEKLQkJCW1hcFt1aW50MTZddWludDE2ewotCQkJCVZlcnNpb25TU0wzMDogVExTX1JTQV9XSVRIX1JDNF8xMjhfU0hBLAotCQkJCVZlcnNpb25UTFMxMDogVExTX1JTQV9XSVRIX1JDNF8xMjhfU0hBLAotCQkJCVZlcnNpb25UTFMxMTogVExTX1JTQV9XSVRIX1JDNF8xMjhfU0hBLAotCQkJCVZlcnNpb25UTFMxMjogVExTX1JTQV9XSVRIX1JDNF8xMjhfU0hBLAotCQkJfSwKLQkJfSwKLQkJewotCQkJLy8gV2l0aCBjaXBoZXJzX3RsczEwIHNldCwgVExTIDEuMCwgMS4xIGFuZCAxLjIgc2hvdWxkIGdldCBhIGRpZmZlcmVudAotCQkJLy8gY2lwaGVyLgotCQkJIlJDNC1TSEE6QUVTMTI4LVNIQSIsIC8vIGRlZmF1bHQKLQkJCSJBRVMxMjgtU0hBIiwgICAgICAgICAvLyB0aGVzZSBjaXBoZXJzIGZvciBUTFMg4omlIDEuMAotCQkJIiIsICAgICAgICAgICAgICAgICAgIC8vIG5vIGNpcGhlcnMgc3BlY2lmaWNhbGx5IGZvciBUTFMg4omlIDEuMQotCQkJbWFwW3VpbnQxNl11aW50MTZ7Ci0JCQkJVmVyc2lvblNTTDMwOiBUTFNfUlNBX1dJVEhfUkM0XzEyOF9TSEEsCi0JCQkJVmVyc2lvblRMUzEwOiBUTFNfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLAotCQkJCVZlcnNpb25UTFMxMTogVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSwKLQkJCQlWZXJzaW9uVExTMTI6IFRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEsCi0JCQl9LAotCQl9LAotCQl7Ci0JCQkvLyBXaXRoIGNpcGhlcnNfdGxzMTEgc2V0LCBUTFMgMS4xIGFuZCAxLjIgc2hvdWxkIGdldCBhIGRpZmZlcmVudAotCQkJLy8gY2lwaGVyLgotCQkJIlJDNC1TSEE6QUVTMTI4LVNIQSIsIC8vIGRlZmF1bHQKLQkJCSIiLCAgICAgICAgICAgICAgICAgICAvLyBubyBjaXBoZXJzIHNwZWNpZmljYWxseSBmb3IgVExTIOKJpSAxLjAKLQkJCSJBRVMxMjgtU0hBIiwgICAgICAgICAvLyB0aGVzZSBjaXBoZXJzIGZvciBUTFMg4omlIDEuMQotCQkJbWFwW3VpbnQxNl11aW50MTZ7Ci0JCQkJVmVyc2lvblNTTDMwOiBUTFNfUlNBX1dJVEhfUkM0XzEyOF9TSEEsCi0JCQkJVmVyc2lvblRMUzEwOiBUTFNfUlNBX1dJVEhfUkM0XzEyOF9TSEEsCi0JCQkJVmVyc2lvblRMUzExOiBUTFNfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLAotCQkJCVZlcnNpb25UTFMxMjogVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSwKLQkJCX0sCi0JCX0sCi0JCXsKLQkJCS8vIFdpdGggYm90aCBjaXBoZXJzX3RsczEwIGFuZCBjaXBoZXJzX3RsczExIHNldCwgY2lwaGVyc190bHMxMSBzaG91bGQKLQkJCS8vIG1hc2sgY2lwaGVyc190bHMxMCBmb3IgVExTIDEuMSBhbmQgMS4yLgotCQkJIlJDNC1TSEE6QUVTMTI4LVNIQSIsIC8vIGRlZmF1bHQKLQkJCSJBRVMxMjgtU0hBIiwgICAgICAgICAvLyB0aGVzZSBjaXBoZXJzIGZvciBUTFMg4omlIDEuMAotCQkJIkFFUzI1Ni1TSEEiLCAgICAgICAgIC8vIHRoZXNlIGNpcGhlcnMgZm9yIFRMUyDiiaUgMS4xCi0JCQltYXBbdWludDE2XXVpbnQxNnsKLQkJCQlWZXJzaW9uU1NMMzA6IFRMU19SU0FfV0lUSF9SQzRfMTI4X1NIQSwKLQkJCQlWZXJzaW9uVExTMTA6IFRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEsCi0JCQkJVmVyc2lvblRMUzExOiBUTFNfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBLAotCQkJCVZlcnNpb25UTFMxMjogVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwKLQkJCX0sCi0JCX0sCi0JfQotCi0JZm9yIGksIHRlc3QgOj0gcmFuZ2UgdmVyc2lvblNwZWNpZmljQ2lwaGVyc1Rlc3QgewotCQlmb3IgdmVyc2lvbiwgZXhwZWN0ZWRDaXBoZXJTdWl0ZSA6PSByYW5nZSB0ZXN0LmV4cGVjdGF0aW9ucyB7Ci0JCQlmbGFncyA6PSBbXXN0cmluZ3siLWNpcGhlciIsIHRlc3QuY2lwaGVyc0RlZmF1bHR9Ci0JCQlpZiBsZW4odGVzdC5jaXBoZXJzVExTMTApID4gMCB7Ci0JCQkJZmxhZ3MgPSBhcHBlbmQoZmxhZ3MsICItY2lwaGVyLXRsczEwIiwgdGVzdC5jaXBoZXJzVExTMTApCi0JCQl9Ci0JCQlpZiBsZW4odGVzdC5jaXBoZXJzVExTMTEpID4gMCB7Ci0JCQkJZmxhZ3MgPSBhcHBlbmQoZmxhZ3MsICItY2lwaGVyLXRsczExIiwgdGVzdC5jaXBoZXJzVExTMTEpCi0JCQl9Ci0KLQkJCXRlc3RDYXNlcyA9IGFwcGVuZCh0ZXN0Q2FzZXMsIHRlc3RDYXNlewotCQkJCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAotCQkJCW5hbWU6ICAgICBmbXQuU3ByaW50ZigiVmVyc2lvblNwZWNpZmljQ2lwaGVyc1Rlc3QtJWQtJXgiLCBpLCB2ZXJzaW9uKSwKLQkJCQljb25maWc6IENvbmZpZ3sKLQkJCQkJTWF4VmVyc2lvbjogICB2ZXJzaW9uLAotCQkJCQlNaW5WZXJzaW9uOiAgIHZlcnNpb24sCi0JCQkJCUNpcGhlclN1aXRlczogW111aW50MTZ7VExTX1JTQV9XSVRIX1JDNF8xMjhfU0hBLCBUTFNfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLCBUTFNfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBfSwKLQkJCQl9LAotCQkJCWZsYWdzOiAgICAgICAgICBmbGFncywKLQkJCQlleHBlY3RlZENpcGhlcjogZXhwZWN0ZWRDaXBoZXJTdWl0ZSwKLQkJCX0pCi0JCX0KLQl9CiB9CiAKIGZ1bmMgYWRkQmFkRUNEU0FTaWduYXR1cmVUZXN0cygpIHsKQEAgLTIyNzksOCArMTgzNyw3IEBACiAJCQlNaW5WZXJzaW9uOiAgIFZlcnNpb25UTFMxMCwKIAkJCUNpcGhlclN1aXRlczogW111aW50MTZ7VExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQX0sCiAJCX0sCi0JCW1lc3NhZ2VMZW46ICAgIC0xLCAvLyByZWFkIHVudGlsIEVPRgotCQlyZXN1bWVTZXNzaW9uOiB0cnVlLAorCQltZXNzYWdlTGVuOiAtMSwgLy8gcmVhZCB1bnRpbCBFT0YKIAkJZmxhZ3M6IFtdc3RyaW5newogCQkJIi1hc3luYyIsCiAJCQkiLXdyaXRlLWRpZmZlcmVudC1yZWNvcmQtc2l6ZXMiLApAQCAtMjMyNSw4ICsxODgyLDggQEAKIAkJCQlDbGllbnRDQXM6ICBjZXJ0UG9vbCwKIAkJCX0sCiAJCQlmbGFnczogW11zdHJpbmd7Ci0JCQkJIi1jZXJ0LWZpbGUiLCBwYXRoLkpvaW4oKnJlc291cmNlRGlyLCByc2FDZXJ0aWZpY2F0ZUZpbGUpLAotCQkJCSIta2V5LWZpbGUiLCBwYXRoLkpvaW4oKnJlc291cmNlRGlyLCByc2FLZXlGaWxlKSwKKwkJCQkiLWNlcnQtZmlsZSIsIHJzYUNlcnRpZmljYXRlRmlsZSwKKwkJCQkiLWtleS1maWxlIiwgcnNhS2V5RmlsZSwKIAkJCX0sCiAJCX0pCiAJCXRlc3RDYXNlcyA9IGFwcGVuZCh0ZXN0Q2FzZXMsIHRlc3RDYXNlewpAQCAtMjM2MCw4ICsxOTE3LDggQEAKIAkJCQkJQ2xpZW50Q0FzOiAgY2VydFBvb2wsCiAJCQkJfSwKIAkJCQlmbGFnczogW11zdHJpbmd7Ci0JCQkJCSItY2VydC1maWxlIiwgcGF0aC5Kb2luKCpyZXNvdXJjZURpciwgZWNkc2FDZXJ0aWZpY2F0ZUZpbGUpLAotCQkJCQkiLWtleS1maWxlIiwgcGF0aC5Kb2luKCpyZXNvdXJjZURpciwgZWNkc2FLZXlGaWxlKSwKKwkJCQkJIi1jZXJ0LWZpbGUiLCBlY2RzYUNlcnRpZmljYXRlRmlsZSwKKwkJCQkJIi1rZXktZmlsZSIsIGVjZHNhS2V5RmlsZSwKIAkJCQl9LAogCQkJfSkKIAkJfQpAQCAtMjUxOCw3ICsyMDc1LDYgQEAKIAkJCQlSZW5ld1RpY2tldE9uUmVzdW1lOiB0cnVlLAogCQkJfSwKIAkJfSwKLQkJZmxhZ3M6ICAgICAgICAgW11zdHJpbmd7Ii1leHBlY3QtdGlja2V0LXJlbmV3YWwifSwKIAkJcmVzdW1lU2Vzc2lvbjogdHJ1ZSwKIAl9KQogCXRlc3RzID0gYXBwZW5kKHRlc3RzLCB0ZXN0Q2FzZXsKQEAgLTI1NjcsNDIgKzIxMjMsMTAgQEAKIAkJCUNsaWVudEF1dGg6IFJlcXVpcmVBbnlDbGllbnRDZXJ0LAogCQl9LAogCQlmbGFnczogW11zdHJpbmd7Ci0JCQkiLWNlcnQtZmlsZSIsIHBhdGguSm9pbigqcmVzb3VyY2VEaXIsIHJzYUNlcnRpZmljYXRlRmlsZSksCi0JCQkiLWtleS1maWxlIiwgcGF0aC5Kb2luKCpyZXNvdXJjZURpciwgcnNhS2V5RmlsZSksCisJCQkiLWNlcnQtZmlsZSIsIHJzYUNlcnRpZmljYXRlRmlsZSwKKwkJCSIta2V5LWZpbGUiLCByc2FLZXlGaWxlLAogCQl9LAogCX0pCi0JaWYgYXN5bmMgewotCQl0ZXN0cyA9IGFwcGVuZCh0ZXN0cywgdGVzdENhc2V7Ci0JCQl0ZXN0VHlwZTogY2xpZW50VGVzdCwKLQkJCW5hbWU6ICAgICAiQ2xpZW50QXV0aC1DbGllbnQtQXN5bmNLZXkiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQ2xpZW50QXV0aDogUmVxdWlyZUFueUNsaWVudENlcnQsCi0JCQl9LAotCQkJZmxhZ3M6IFtdc3RyaW5newotCQkJCSItY2VydC1maWxlIiwgcGF0aC5Kb2luKCpyZXNvdXJjZURpciwgcnNhQ2VydGlmaWNhdGVGaWxlKSwKLQkJCQkiLWtleS1maWxlIiwgcGF0aC5Kb2luKCpyZXNvdXJjZURpciwgcnNhS2V5RmlsZSksCi0JCQkJIi11c2UtYXN5bmMtcHJpdmF0ZS1rZXkiLAotCQkJfSwKLQkJfSkKLQkJdGVzdHMgPSBhcHBlbmQodGVzdHMsIHRlc3RDYXNlewotCQkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCi0JCQluYW1lOiAgICAgIkJhc2ljLVNlcnZlci1SU0FBc3luY0tleSIsCi0JCQlmbGFnczogW11zdHJpbmd7Ci0JCQkJIi1jZXJ0LWZpbGUiLCBwYXRoLkpvaW4oKnJlc291cmNlRGlyLCByc2FDZXJ0aWZpY2F0ZUZpbGUpLAotCQkJCSIta2V5LWZpbGUiLCBwYXRoLkpvaW4oKnJlc291cmNlRGlyLCByc2FLZXlGaWxlKSwKLQkJCQkiLXVzZS1hc3luYy1wcml2YXRlLWtleSIsCi0JCQl9LAotCQl9KQotCQl0ZXN0cyA9IGFwcGVuZCh0ZXN0cywgdGVzdENhc2V7Ci0JCQl0ZXN0VHlwZTogc2VydmVyVGVzdCwKLQkJCW5hbWU6ICAgICAiQmFzaWMtU2VydmVyLUVDRFNBQXN5bmNLZXkiLAotCQkJZmxhZ3M6IFtdc3RyaW5newotCQkJCSItY2VydC1maWxlIiwgcGF0aC5Kb2luKCpyZXNvdXJjZURpciwgZWNkc2FDZXJ0aWZpY2F0ZUZpbGUpLAotCQkJCSIta2V5LWZpbGUiLCBwYXRoLkpvaW4oKnJlc291cmNlRGlyLCBlY2RzYUtleUZpbGUpLAotCQkJCSItdXNlLWFzeW5jLXByaXZhdGUta2V5IiwKLQkJCX0sCi0JCX0pCi0JfQogCXRlc3RzID0gYXBwZW5kKHRlc3RzLCB0ZXN0Q2FzZXsKIAkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCiAJCW5hbWU6ICAgICAiQ2xpZW50QXV0aC1TZXJ2ZXIiLApAQCAtMjY0Nyw1NyArMjE3MSw2IEBACiAJCWZsYWdzOiBbXXN0cmluZ3siLXBzayIsICJzZWNyZXQifSwKIAl9KQogCi0JdGVzdHMgPSBhcHBlbmQodGVzdHMsIHRlc3RDYXNlewotCQl0ZXN0VHlwZTogY2xpZW50VGVzdCwKLQkJbmFtZTogICAgICJPQ1NQU3RhcGxpbmctQ2xpZW50IiwKLQkJZmxhZ3M6IFtdc3RyaW5newotCQkJIi1lbmFibGUtb2NzcC1zdGFwbGluZyIsCi0JCQkiLWV4cGVjdC1vY3NwLXJlc3BvbnNlIiwKLQkJCWJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVUb1N0cmluZyh0ZXN0T0NTUFJlc3BvbnNlKSwKLQkJCSItdmVyaWZ5LXBlZXIiLAotCQl9LAotCQlyZXN1bWVTZXNzaW9uOiB0cnVlLAotCX0pCi0KLQl0ZXN0cyA9IGFwcGVuZCh0ZXN0cywgdGVzdENhc2V7Ci0JCXRlc3RUeXBlOiAgICAgICAgICAgICBzZXJ2ZXJUZXN0LAotCQluYW1lOiAgICAgICAgICAgICAgICAgIk9DU1BTdGFwbGluZy1TZXJ2ZXIiLAotCQlleHBlY3RlZE9DU1BSZXNwb25zZTogdGVzdE9DU1BSZXNwb25zZSwKLQkJZmxhZ3M6IFtdc3RyaW5newotCQkJIi1vY3NwLXJlc3BvbnNlIiwKLQkJCWJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVUb1N0cmluZyh0ZXN0T0NTUFJlc3BvbnNlKSwKLQkJfSwKLQkJcmVzdW1lU2Vzc2lvbjogdHJ1ZSwKLQl9KQotCi0JdGVzdHMgPSBhcHBlbmQodGVzdHMsIHRlc3RDYXNlewotCQl0ZXN0VHlwZTogY2xpZW50VGVzdCwKLQkJbmFtZTogICAgICJDZXJ0aWZpY2F0ZVZlcmlmaWNhdGlvblN1Y2NlZWQiLAotCQlmbGFnczogW11zdHJpbmd7Ci0JCQkiLXZlcmlmeS1wZWVyIiwKLQkJfSwKLQl9KQotCi0JdGVzdHMgPSBhcHBlbmQodGVzdHMsIHRlc3RDYXNlewotCQl0ZXN0VHlwZTogY2xpZW50VGVzdCwKLQkJbmFtZTogICAgICJDZXJ0aWZpY2F0ZVZlcmlmaWNhdGlvbkZhaWwiLAotCQlmbGFnczogW11zdHJpbmd7Ci0JCQkiLXZlcmlmeS1mYWlsIiwKLQkJCSItdmVyaWZ5LXBlZXIiLAotCQl9LAotCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQlleHBlY3RlZEVycm9yOiAiOkNFUlRJRklDQVRFX1ZFUklGWV9GQUlMRUQ6IiwKLQl9KQotCi0JdGVzdHMgPSBhcHBlbmQodGVzdHMsIHRlc3RDYXNlewotCQl0ZXN0VHlwZTogY2xpZW50VGVzdCwKLQkJbmFtZTogICAgICJDZXJ0aWZpY2F0ZVZlcmlmaWNhdGlvblNvZnRGYWlsIiwKLQkJZmxhZ3M6IFtdc3RyaW5newotCQkJIi12ZXJpZnktZmFpbCIsCi0JCQkiLWV4cGVjdC12ZXJpZnktcmVzdWx0IiwKLQkJfSwKLQl9KQotCiAJaWYgcHJvdG9jb2wgPT0gdGxzIHsKIAkJdGVzdHMgPSBhcHBlbmQodGVzdHMsIHRlc3RDYXNlewogCQkJbmFtZTogICAgICAgICJSZW5lZ290aWF0ZS1DbGllbnQiLApAQCAtMjgxOSw3ICsyMjkyLDcgQEAKIAkJCWNvbmZpZzogQ29uZmlnewogCQkJCVJlcXVlc3RDaGFubmVsSUQ6IHRydWUsCiAJCQl9LAotCQkJZmxhZ3M6ICAgICAgICAgICBbXXN0cmluZ3siLXNlbmQtY2hhbm5lbC1pZCIsIHBhdGguSm9pbigqcmVzb3VyY2VEaXIsIGNoYW5uZWxJREtleUZpbGUpfSwKKwkJCWZsYWdzOiAgICAgICAgICAgW11zdHJpbmd7Ii1zZW5kLWNoYW5uZWwtaWQiLCBjaGFubmVsSURLZXlGaWxlfSwKIAkJCXJlc3VtZVNlc3Npb246ICAgdHJ1ZSwKIAkJCWV4cGVjdENoYW5uZWxJRDogdHJ1ZSwKIAkJfSkKQEAgLTI4MzgsMzMgKzIzMTEsNiBAQAogCQkJcmVzdW1lU2Vzc2lvbjogICB0cnVlLAogCQkJZXhwZWN0Q2hhbm5lbElEOiB0cnVlLAogCQl9KQotCi0JCS8vIEJpZGlyZWN0aW9uYWwgc2h1dGRvd24gd2l0aCB0aGUgcnVubmVyIGluaXRpYXRpbmcuCi0JCXRlc3RzID0gYXBwZW5kKHRlc3RzLCB0ZXN0Q2FzZXsKLQkJCW5hbWU6ICJTaHV0ZG93bi1SdW5uZXIiLAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlFeHBlY3RDbG9zZU5vdGlmeTogdHJ1ZSwKLQkJCQl9LAotCQkJfSwKLQkJCWZsYWdzOiBbXXN0cmluZ3siLWNoZWNrLWNsb3NlLW5vdGlmeSJ9LAotCQl9KQotCi0JCS8vIEJpZGlyZWN0aW9uYWwgc2h1dGRvd24gd2l0aCB0aGUgc2hpbSBpbml0aWF0aW5nLiBUaGUgcnVubmVyLAotCQkvLyBpbiB0aGUgbWVhbnRpbWUsIHNlbmRzIGdhcmJhZ2UgYmVmb3JlIHRoZSBjbG9zZV9ub3RpZnkgd2hpY2gKLQkJLy8gdGhlIHNoaW0gbXVzdCBpZ25vcmUuCi0JCXRlc3RzID0gYXBwZW5kKHRlc3RzLCB0ZXN0Q2FzZXsKLQkJCW5hbWU6ICJTaHV0ZG93bi1TaGltIiwKLQkJCWNvbmZpZzogQ29uZmlnewotCQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkJRXhwZWN0Q2xvc2VOb3RpZnk6IHRydWUsCi0JCQkJfSwKLQkJCX0sCi0JCQlzaGltU2h1dHNEb3duOiAgICAgdHJ1ZSwKLQkJCXNlbmRFbXB0eVJlY29yZHM6ICAxLAotCQkJc2VuZFdhcm5pbmdBbGVydHM6IDEsCi0JCQlmbGFnczogICAgICAgICAgICAgW11zdHJpbmd7Ii1jaGVjay1jbG9zZS1ub3RpZnkifSwKLQkJfSkKIAl9IGVsc2UgewogCQl0ZXN0cyA9IGFwcGVuZCh0ZXN0cywgdGVzdENhc2V7CiAJCQluYW1lOiAiU2tpcEhlbGxvVmVyaWZ5UmVxdWVzdCIsCkBAIC0zMjc1LDcwICsyNzIxLDYgQEAKIAkJZXhwZWN0ZWROZXh0UHJvdG9UeXBlOiBhbHBuLAogCQlyZXN1bWVTZXNzaW9uOiAgICAgICAgIHRydWUsCiAJfSkKLQl2YXIgZW1wdHlTdHJpbmcgc3RyaW5nCi0JdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgdGVzdENhc2V7Ci0JCXRlc3RUeXBlOiBjbGllbnRUZXN0LAotCQluYW1lOiAgICAgIkFMUE5DbGllbnQtRW1wdHlQcm90b2NvbE5hbWUiLAotCQljb25maWc6IENvbmZpZ3sKLQkJCU5leHRQcm90b3M6IFtdc3RyaW5neyIifSwKLQkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQkvLyBBIHNlcnZlciByZXR1cm5pbmcgYW4gZW1wdHkgQUxQTiBwcm90b2NvbAotCQkJCS8vIHNob3VsZCBiZSByZWplY3RlZC4KLQkJCQlBTFBOUHJvdG9jb2w6ICZlbXB0eVN0cmluZywKLQkJCX0sCi0JCX0sCi0JCWZsYWdzOiBbXXN0cmluZ3sKLQkJCSItYWR2ZXJ0aXNlLWFscG4iLCAiXHgwM2ZvbyIsCi0JCX0sCi0JCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCWV4cGVjdGVkRXJyb3I6ICI6UEFSU0VfVExTRVhUOiIsCi0JfSkKLQl0ZXN0Q2FzZXMgPSBhcHBlbmQodGVzdENhc2VzLCB0ZXN0Q2FzZXsKLQkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCi0JCW5hbWU6ICAgICAiQUxQTlNlcnZlci1FbXB0eVByb3RvY29sTmFtZSIsCi0JCWNvbmZpZzogQ29uZmlnewotCQkJLy8gQSBDbGllbnRIZWxsbyBjb250YWluaW5nIGFuIGVtcHR5IEFMUE4gcHJvdG9jb2wKLQkJCS8vIHNob3VsZCBiZSByZWplY3RlZC4KLQkJCU5leHRQcm90b3M6IFtdc3RyaW5neyJmb28iLCAiIiwgImJheiJ9LAotCQl9LAotCQlmbGFnczogW11zdHJpbmd7Ci0JCQkiLXNlbGVjdC1hbHBuIiwgImZvbyIsCi0JCX0sCi0JCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCWV4cGVjdGVkRXJyb3I6ICI6UEFSU0VfVExTRVhUOiIsCi0JfSkKLQkvLyBUZXN0IHRoYXQgbmVnb3RpYXRpbmcgYm90aCBOUE4gYW5kIEFMUE4gaXMgZm9yYmlkZGVuLgotCXRlc3RDYXNlcyA9IGFwcGVuZCh0ZXN0Q2FzZXMsIHRlc3RDYXNlewotCQluYW1lOiAiTmVnb3RpYXRlQUxQTkFuZE5QTiIsCi0JCWNvbmZpZzogQ29uZmlnewotCQkJTmV4dFByb3RvczogW11zdHJpbmd7ImZvbyIsICJiYXIiLCAiYmF6In0sCi0JCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJTmVnb3RpYXRlQUxQTkFuZE5QTjogdHJ1ZSwKLQkJCX0sCi0JCX0sCi0JCWZsYWdzOiBbXXN0cmluZ3sKLQkJCSItYWR2ZXJ0aXNlLWFscG4iLCAiXHgwM2ZvbyIsCi0JCQkiLXNlbGVjdC1uZXh0LXByb3RvIiwgImZvbyIsCi0JCX0sCi0JCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCWV4cGVjdGVkRXJyb3I6ICI6TkVHT1RJQVRFRF9CT1RIX05QTl9BTkRfQUxQTjoiLAotCX0pCi0JdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgdGVzdENhc2V7Ci0JCW5hbWU6ICJOZWdvdGlhdGVBTFBOQW5kTlBOLVN3YXBwZWQiLAotCQljb25maWc6IENvbmZpZ3sKLQkJCU5leHRQcm90b3M6IFtdc3RyaW5neyJmb28iLCAiYmFyIiwgImJheiJ9LAotCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCU5lZ290aWF0ZUFMUE5BbmROUE46IHRydWUsCi0JCQkJU3dhcE5QTkFuZEFMUE46ICAgICAgdHJ1ZSwKLQkJCX0sCi0JCX0sCi0JCWZsYWdzOiBbXXN0cmluZ3sKLQkJCSItYWR2ZXJ0aXNlLWFscG4iLCAiXHgwM2ZvbyIsCi0JCQkiLXNlbGVjdC1uZXh0LXByb3RvIiwgImZvbyIsCi0JCX0sCi0JCXNob3VsZEZhaWw6ICAgIHRydWUsCi0JCWV4cGVjdGVkRXJyb3I6ICI6TkVHT1RJQVRFRF9CT1RIX05QTl9BTkRfQUxQTjoiLAotCX0pCiAJLy8gUmVzdW1lIHdpdGggYSBjb3JydXB0IHRpY2tldC4KIAl0ZXN0Q2FzZXMgPSBhcHBlbmQodGVzdENhc2VzLCB0ZXN0Q2FzZXsKIAkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCkBAIC0zMzUxLDI0ICsyNzMzLDYgQEAKIAkJcmVzdW1lU2Vzc2lvbjogICAgICAgIHRydWUsCiAJCWV4cGVjdFJlc3VtZVJlamVjdGVkOiB0cnVlLAogCX0pCi0JLy8gVGVzdCB0aGUgdGlja2V0IGNhbGxiYWNrLCB3aXRoIGFuZCB3aXRob3V0IHJlbmV3YWwuCi0JdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgdGVzdENhc2V7Ci0JCXRlc3RUeXBlOiAgICAgIHNlcnZlclRlc3QsCi0JCW5hbWU6ICAgICAgICAgICJUaWNrZXRDYWxsYmFjayIsCi0JCXJlc3VtZVNlc3Npb246IHRydWUsCi0JCWZsYWdzOiAgICAgICAgIFtdc3RyaW5neyItdXNlLXRpY2tldC1jYWxsYmFjayJ9LAotCX0pCi0JdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgdGVzdENhc2V7Ci0JCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAotCQluYW1lOiAgICAgIlRpY2tldENhbGxiYWNrLVJlbmV3IiwKLQkJY29uZmlnOiBDb25maWd7Ci0JCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJRXhwZWN0TmV3VGlja2V0OiB0cnVlLAotCQkJfSwKLQkJfSwKLQkJZmxhZ3M6ICAgICAgICAgW11zdHJpbmd7Ii11c2UtdGlja2V0LWNhbGxiYWNrIiwgIi1yZW5ldy10aWNrZXQifSwKLQkJcmVzdW1lU2Vzc2lvbjogdHJ1ZSwKLQl9KQogCS8vIFJlc3VtZSB3aXRoIGFuIG92ZXJzaXplZCBzZXNzaW9uIGlkLgogCXRlc3RDYXNlcyA9IGFwcGVuZCh0ZXN0Q2FzZXMsIHRlc3RDYXNlewogCQl0ZXN0VHlwZTogc2VydmVyVGVzdCwKQEAgLTM0NTgsMzkgKzI4MjIsMjIgQEAKIAkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKIAkJZXhwZWN0ZWRFcnJvcjogIjpCQURfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfTElTVDoiLAogCX0pCi0JLy8gVGVzdCBTQ1QgbGlzdC4KKwkvLyBUZXN0IE9DU1Agc3RhcGxpbmcgYW5kIFNDVCBsaXN0LgogCXRlc3RDYXNlcyA9IGFwcGVuZCh0ZXN0Q2FzZXMsIHRlc3RDYXNlewotCQluYW1lOiAgICAgIlNpZ25lZENlcnRpZmljYXRlVGltZXN0YW1wTGlzdC1DbGllbnQiLAotCQl0ZXN0VHlwZTogY2xpZW50VGVzdCwKKwkJbmFtZTogIk9DU1BTdGFwbGluZyIsCisJCWZsYWdzOiBbXXN0cmluZ3sKKwkJCSItZW5hYmxlLW9jc3Atc3RhcGxpbmciLAorCQkJIi1leHBlY3Qtb2NzcC1yZXNwb25zZSIsCisJCQliYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlVG9TdHJpbmcodGVzdE9DU1BSZXNwb25zZSksCisJCX0sCisJfSkKKwl0ZXN0Q2FzZXMgPSBhcHBlbmQodGVzdENhc2VzLCB0ZXN0Q2FzZXsKKwkJbmFtZTogIlNpZ25lZENlcnRpZmljYXRlVGltZXN0YW1wTGlzdCIsCiAJCWZsYWdzOiBbXXN0cmluZ3sKIAkJCSItZW5hYmxlLXNpZ25lZC1jZXJ0LXRpbWVzdGFtcHMiLAogCQkJIi1leHBlY3Qtc2lnbmVkLWNlcnQtdGltZXN0YW1wcyIsCiAJCQliYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlVG9TdHJpbmcodGVzdFNDVExpc3QpLAogCQl9LAotCQlyZXN1bWVTZXNzaW9uOiB0cnVlLAotCX0pCi0JdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgdGVzdENhc2V7Ci0JCW5hbWU6ICAgICAiU2lnbmVkQ2VydGlmaWNhdGVUaW1lc3RhbXBMaXN0LVNlcnZlciIsCi0JCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAotCQlmbGFnczogW11zdHJpbmd7Ci0JCQkiLXNpZ25lZC1jZXJ0LXRpbWVzdGFtcHMiLAotCQkJYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZVRvU3RyaW5nKHRlc3RTQ1RMaXN0KSwKLQkJfSwKLQkJZXhwZWN0ZWRTQ1RMaXN0OiB0ZXN0U0NUTGlzdCwKLQkJcmVzdW1lU2Vzc2lvbjogICB0cnVlLAotCX0pCi0JdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgdGVzdENhc2V7Ci0JCXRlc3RUeXBlOiBjbGllbnRUZXN0LAotCQluYW1lOiAgICAgIkNsaWVudEhlbGxvUGFkZGluZyIsCi0JCWNvbmZpZzogQ29uZmlnewotCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCVJlcXVpcmVDbGllbnRIZWxsb1NpemU6IDUxMiwKLQkJCX0sCi0JCX0sCi0JCS8vIFRoaXMgaG9zdG5hbWUganVzdCBuZWVkcyB0byBiZSBsb25nIGVub3VnaCB0byBwdXNoIHRoZQotCQkvLyBDbGllbnRIZWxsbyBpbnRvIEY1J3MgZGFuZ2VyIHpvbmUgYmV0d2VlbiAyNTYgYW5kIDUxMSBieXRlcwotCQkvLyBsb25nLgotCQlmbGFnczogW11zdHJpbmd7Ii1ob3N0LW5hbWUiLCAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkuY29tIn0sCiAJfSkKIH0KIApAQCAtMzYwOSwzMyArMjk1Niw3IEBACiAJCWV4cGVjdGVkRXJyb3I6ICAgICAgIjpOT19SRU5FR09USUFUSU9OOiIsCiAJCWV4cGVjdGVkTG9jYWxFcnJvcjogInJlbW90ZSBlcnJvcjogbm8gcmVuZWdvdGlhdGlvbiIsCiAJfSkKLQkvLyBUaGUgc2VydmVyIHNob3VsZG4ndCBlY2hvIHRoZSByZW5lZ290aWF0aW9uIGV4dGVuc2lvbiB1bmxlc3MKLQkvLyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4KLQl0ZXN0Q2FzZXMgPSBhcHBlbmQodGVzdENhc2VzLCB0ZXN0Q2FzZXsKLQkJdGVzdFR5cGU6IHNlcnZlclRlc3QsCi0JCW5hbWU6ICAgICAiUmVuZWdvdGlhdGUtU2VydmVyLU5vRXh0IiwKLQkJY29uZmlnOiBDb25maWd7Ci0JCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJTm9SZW5lZ290aWF0aW9uSW5mbzogICAgICB0cnVlLAotCQkJCVJlcXVpcmVSZW5lZ290aWF0aW9uSW5mbzogdHJ1ZSwKLQkJCX0sCi0JCX0sCi0JCXNob3VsZEZhaWw6ICAgICAgICAgdHJ1ZSwKLQkJZXhwZWN0ZWRMb2NhbEVycm9yOiAicmVuZWdvdGlhdGlvbiBleHRlbnNpb24gbWlzc2luZyIsCi0JfSkKLQkvLyBUaGUgcmVuZWdvdGlhdGlvbiBTQ1NWIHNob3VsZCBiZSBzdWZmaWNpZW50IGZvciB0aGUgc2VydmVyIHRvIGVjaG8KLQkvLyB0aGUgZXh0ZW5zaW9uLgotCXRlc3RDYXNlcyA9IGFwcGVuZCh0ZXN0Q2FzZXMsIHRlc3RDYXNlewotCQl0ZXN0VHlwZTogc2VydmVyVGVzdCwKLQkJbmFtZTogICAgICJSZW5lZ290aWF0ZS1TZXJ2ZXItTm9FeHQtU0NTViIsCi0JCWNvbmZpZzogQ29uZmlnewotCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCU5vUmVuZWdvdGlhdGlvbkluZm86ICAgICAgdHJ1ZSwKLQkJCQlTZW5kUmVuZWdvdGlhdGlvblNDU1Y6ICAgIHRydWUsCi0JCQkJUmVxdWlyZVJlbmVnb3RpYXRpb25JbmZvOiB0cnVlLAotCQkJfSwKLQkJfSwKLQl9KQorCS8vIFRPRE8oYWdsKTogdGVzdCB0aGUgcmVuZWdvdGlhdGlvbiBpbmZvIFNDU1YuCiAJdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgdGVzdENhc2V7CiAJCW5hbWU6ICJSZW5lZ290aWF0ZS1DbGllbnQiLAogCQljb25maWc6IENvbmZpZ3sKQEAgLTM2NjgsNyArMjk4OSw4IEBACiAJCWV4cGVjdGVkRXJyb3I6ICI6UkVORUdPVElBVElPTl9NSVNNQVRDSDoiLAogCX0pCiAJdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgdGVzdENhc2V7Ci0JCW5hbWU6ICJSZW5lZ290aWF0ZS1DbGllbnQtTm9FeHQiLAorCQluYW1lOiAgICAgICAgIlJlbmVnb3RpYXRlLUNsaWVudC1Ob0V4dCIsCisJCXJlbmVnb3RpYXRlOiB0cnVlLAogCQljb25maWc6IENvbmZpZ3sKIAkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKIAkJCQlOb1JlbmVnb3RpYXRpb25JbmZvOiB0cnVlLApAQCAtMzcyMSwxOSArMzA0Myw2IEBACiAJCQl9LAogCQl9LAogCX0pCi0JdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgdGVzdENhc2V7Ci0JCW5hbWU6ICAgICAgICAiUmVuZWdvdGlhdGUtRmFsc2VTdGFydCIsCi0JCXJlbmVnb3RpYXRlOiB0cnVlLAotCQljb25maWc6IENvbmZpZ3sKLQkJCUNpcGhlclN1aXRlczogW111aW50MTZ7VExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1Nn0sCi0JCQlOZXh0UHJvdG9zOiAgIFtdc3RyaW5neyJmb28ifSwKLQkJfSwKLQkJZmxhZ3M6IFtdc3RyaW5newotCQkJIi1mYWxzZS1zdGFydCIsCi0JCQkiLXNlbGVjdC1uZXh0LXByb3RvIiwgImZvbyIsCi0JCX0sCi0JCXNoaW1Xcml0ZXNGaXJzdDogdHJ1ZSwKLQl9KQogfQogCiBmdW5jIGFkZERUTFNSZXBsYXlUZXN0cygpIHsKQEAgLTM3NDEsMzkgKzMwNTAsNDMgQEAKIAl0ZXN0Q2FzZXMgPSBhcHBlbmQodGVzdENhc2VzLCB0ZXN0Q2FzZXsKIAkJcHJvdG9jb2w6ICAgICBkdGxzLAogCQluYW1lOiAgICAgICAgICJEVExTLVJlcGxheSIsCi0JCW1lc3NhZ2VDb3VudDogMjAwLAogCQlyZXBsYXlXcml0ZXM6IHRydWUsCiAJfSkKIAotCS8vIFRlc3QgdGhlIGluY29taW5nIHNlcXVlbmNlIG51bWJlciBza2lwcGluZyBieSB2YWx1ZXMgbGFyZ2VyCisJLy8gVGVzdCB0aGUgb3V0Z29pbmcgc2VxdWVuY2UgbnVtYmVyIHNraXBwaW5nIGJ5IHZhbHVlcyBsYXJnZXIKIAkvLyB0aGFuIHRoZSByZXRyYW5zbWl0IHdpbmRvdy4KIAl0ZXN0Q2FzZXMgPSBhcHBlbmQodGVzdENhc2VzLCB0ZXN0Q2FzZXsKIAkJcHJvdG9jb2w6IGR0bHMsCiAJCW5hbWU6ICAgICAiRFRMUy1SZXBsYXktTGFyZ2VHYXBzIiwKIAkJY29uZmlnOiBDb25maWd7CiAJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJU2VxdWVuY2VOdW1iZXJNYXBwaW5nOiBmdW5jKGluIHVpbnQ2NCkgdWludDY0IHsKLQkJCQkJcmV0dXJuIGluICogMTI3Ci0JCQkJfSwKKwkJCQlTZXF1ZW5jZU51bWJlckluY3JlbWVudDogMTI3LAogCQkJfSwKIAkJfSwKLQkJbWVzc2FnZUNvdW50OiAyMDAsCiAJCXJlcGxheVdyaXRlczogdHJ1ZSwKIAl9KQorfQogCi0JLy8gVGVzdCB0aGUgaW5jb21pbmcgc2VxdWVuY2UgbnVtYmVyIGNoYW5naW5nIG5vbi1tb25vdG9uaWNhbGx5LgorZnVuYyBhZGRGYXN0UmFkaW9QYWRkaW5nVGVzdHMoKSB7CiAJdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgdGVzdENhc2V7Ci0JCXByb3RvY29sOiBkdGxzLAotCQluYW1lOiAgICAgIkRUTFMtUmVwbGF5LU5vbk1vbm90b25pYyIsCisJCXByb3RvY29sOiB0bHMsCisJCW5hbWU6ICAgICAiRmFzdFJhZGlvLVBhZGRpbmciLAogCQljb25maWc6IENvbmZpZ3sKIAkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKLQkJCQlTZXF1ZW5jZU51bWJlck1hcHBpbmc6IGZ1bmMoaW4gdWludDY0KSB1aW50NjQgewotCQkJCQlyZXR1cm4gaW4gXiAzMQotCQkJCX0sCisJCQkJUmVxdWlyZUZhc3RyYWRpb1BhZGRpbmc6IHRydWUsCiAJCQl9LAogCQl9LAotCQltZXNzYWdlQ291bnQ6IDIwMCwKLQkJcmVwbGF5V3JpdGVzOiB0cnVlLAorCQlmbGFnczogW11zdHJpbmd7Ii1mYXN0cmFkaW8tcGFkZGluZyJ9LAorCX0pCisJdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgdGVzdENhc2V7CisJCXByb3RvY29sOiBkdGxzLAorCQluYW1lOiAgICAgIkZhc3RSYWRpby1QYWRkaW5nLURUTFMiLAorCQljb25maWc6IENvbmZpZ3sKKwkJCUJ1Z3M6IFByb3RvY29sQnVnc3sKKwkJCQlSZXF1aXJlRmFzdHJhZGlvUGFkZGluZzogdHJ1ZSwKKwkJCX0sCisJCX0sCisJCWZsYWdzOiBbXXN0cmluZ3siLWZhc3RyYWRpby1wYWRkaW5nIn0sCiAJfSkKIH0KIApAQCAtMzgwMyw4ICszMTE2LDggQEAKIAkJCQl9LAogCQkJfSwKIAkJCWZsYWdzOiBbXXN0cmluZ3sKLQkJCQkiLWNlcnQtZmlsZSIsIHBhdGguSm9pbigqcmVzb3VyY2VEaXIsIHJzYUNlcnRpZmljYXRlRmlsZSksCi0JCQkJIi1rZXktZmlsZSIsIHBhdGguSm9pbigqcmVzb3VyY2VEaXIsIHJzYUtleUZpbGUpLAorCQkJCSItY2VydC1maWxlIiwgcnNhQ2VydGlmaWNhdGVGaWxlLAorCQkJCSIta2V5LWZpbGUiLCByc2FLZXlGaWxlLAogCQkJfSwKIAkJfSkKIApAQCAtMzgzNCw4ICszMTQ3LDggQEAKIAkJCX0sCiAJCX0sCiAJCWZsYWdzOiBbXXN0cmluZ3sKLQkJCSItY2VydC1maWxlIiwgcGF0aC5Kb2luKCpyZXNvdXJjZURpciwgcnNhQ2VydGlmaWNhdGVGaWxlKSwKLQkJCSIta2V5LWZpbGUiLCBwYXRoLkpvaW4oKnJlc291cmNlRGlyLCByc2FLZXlGaWxlKSwKKwkJCSItY2VydC1maWxlIiwgcnNhQ2VydGlmaWNhdGVGaWxlLAorCQkJIi1rZXktZmlsZSIsIHJzYUtleUZpbGUsCiAJCX0sCiAJfSkKIApAQCAtMzg2NSw4ICszMTc4LDggQEAKIAkJCX0sCiAJCX0sCiAJCWZsYWdzOiBbXXN0cmluZ3sKLQkJCSItY2VydC1maWxlIiwgcGF0aC5Kb2luKCpyZXNvdXJjZURpciwgcnNhQ2VydGlmaWNhdGVGaWxlKSwKLQkJCSIta2V5LWZpbGUiLCBwYXRoLkpvaW4oKnJlc291cmNlRGlyLCByc2FLZXlGaWxlKSwKKwkJCSItY2VydC1maWxlIiwgcnNhQ2VydGlmaWNhdGVGaWxlLAorCQkJIi1rZXktZmlsZSIsIHJzYUtleUZpbGUsCiAJCX0sCiAJfSkKIApAQCAtMzkyMiw3MyArMzIzNSw2IEBACiAJCXNob3VsZEZhaWw6ICAgIHRydWUsCiAJCWV4cGVjdGVkRXJyb3I6ICI6V1JPTkdfU0lHTkFUVVJFX1RZUEU6IiwKIAl9KQotCi0JLy8gVGVzdCB0aGF0IHRoZSBhZ3JlZWQgdXBvbiBkaWdlc3QgcmVzcGVjdHMgdGhlIGNsaWVudCBwcmVmZXJlbmNlcyBhbmQKLQkvLyB0aGUgc2VydmVyIGRpZ2VzdHMuCi0JdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgdGVzdENhc2V7Ci0JCW5hbWU6ICJBZ3JlZS1EaWdlc3QtRmFsbGJhY2siLAotCQljb25maWc6IENvbmZpZ3sKLQkJCUNsaWVudEF1dGg6IFJlcXVpcmVBbnlDbGllbnRDZXJ0LAotCQkJU2lnbmF0dXJlQW5kSGFzaGVzOiBbXXNpZ25hdHVyZUFuZEhhc2h7Ci0JCQkJe3NpZ25hdHVyZVJTQSwgaGFzaFNIQTUxMn0sCi0JCQkJe3NpZ25hdHVyZVJTQSwgaGFzaFNIQTF9LAotCQkJfSwKLQkJfSwKLQkJZmxhZ3M6IFtdc3RyaW5newotCQkJIi1jZXJ0LWZpbGUiLCBwYXRoLkpvaW4oKnJlc291cmNlRGlyLCByc2FDZXJ0aWZpY2F0ZUZpbGUpLAotCQkJIi1rZXktZmlsZSIsIHBhdGguSm9pbigqcmVzb3VyY2VEaXIsIHJzYUtleUZpbGUpLAotCQl9LAotCQlkaWdlc3RQcmVmczogICAgICAgICAgICAgICAgICAgICAiU0hBMjU2IiwKLQkJZXhwZWN0ZWRDbGllbnRDZXJ0U2lnbmF0dXJlSGFzaDogaGFzaFNIQTEsCi0JfSkKLQl0ZXN0Q2FzZXMgPSBhcHBlbmQodGVzdENhc2VzLCB0ZXN0Q2FzZXsKLQkJbmFtZTogIkFncmVlLURpZ2VzdC1TSEEyNTYiLAotCQljb25maWc6IENvbmZpZ3sKLQkJCUNsaWVudEF1dGg6IFJlcXVpcmVBbnlDbGllbnRDZXJ0LAotCQkJU2lnbmF0dXJlQW5kSGFzaGVzOiBbXXNpZ25hdHVyZUFuZEhhc2h7Ci0JCQkJe3NpZ25hdHVyZVJTQSwgaGFzaFNIQTF9LAotCQkJCXtzaWduYXR1cmVSU0EsIGhhc2hTSEEyNTZ9LAotCQkJfSwKLQkJfSwKLQkJZmxhZ3M6IFtdc3RyaW5newotCQkJIi1jZXJ0LWZpbGUiLCBwYXRoLkpvaW4oKnJlc291cmNlRGlyLCByc2FDZXJ0aWZpY2F0ZUZpbGUpLAotCQkJIi1rZXktZmlsZSIsIHBhdGguSm9pbigqcmVzb3VyY2VEaXIsIHJzYUtleUZpbGUpLAotCQl9LAotCQlkaWdlc3RQcmVmczogICAgICAgICAgICAgICAgICAgICAiU0hBMjU2LFNIQTEiLAotCQlleHBlY3RlZENsaWVudENlcnRTaWduYXR1cmVIYXNoOiBoYXNoU0hBMjU2LAotCX0pCi0JdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgdGVzdENhc2V7Ci0JCW5hbWU6ICJBZ3JlZS1EaWdlc3QtU0hBMSIsCi0JCWNvbmZpZzogQ29uZmlnewotCQkJQ2xpZW50QXV0aDogUmVxdWlyZUFueUNsaWVudENlcnQsCi0JCQlTaWduYXR1cmVBbmRIYXNoZXM6IFtdc2lnbmF0dXJlQW5kSGFzaHsKLQkJCQl7c2lnbmF0dXJlUlNBLCBoYXNoU0hBMX0sCi0JCQl9LAotCQl9LAotCQlmbGFnczogW11zdHJpbmd7Ci0JCQkiLWNlcnQtZmlsZSIsIHBhdGguSm9pbigqcmVzb3VyY2VEaXIsIHJzYUNlcnRpZmljYXRlRmlsZSksCi0JCQkiLWtleS1maWxlIiwgcGF0aC5Kb2luKCpyZXNvdXJjZURpciwgcnNhS2V5RmlsZSksCi0JCX0sCi0JCWRpZ2VzdFByZWZzOiAgICAgICAgICAgICAgICAgICAgICJTSEE1MTIsU0hBMjU2LFNIQTEiLAotCQlleHBlY3RlZENsaWVudENlcnRTaWduYXR1cmVIYXNoOiBoYXNoU0hBMSwKLQl9KQotCXRlc3RDYXNlcyA9IGFwcGVuZCh0ZXN0Q2FzZXMsIHRlc3RDYXNlewotCQluYW1lOiAiQWdyZWUtRGlnZXN0LURlZmF1bHQiLAotCQljb25maWc6IENvbmZpZ3sKLQkJCUNsaWVudEF1dGg6IFJlcXVpcmVBbnlDbGllbnRDZXJ0LAotCQkJU2lnbmF0dXJlQW5kSGFzaGVzOiBbXXNpZ25hdHVyZUFuZEhhc2h7Ci0JCQkJe3NpZ25hdHVyZVJTQSwgaGFzaFNIQTI1Nn0sCi0JCQkJe3NpZ25hdHVyZUVDRFNBLCBoYXNoU0hBMjU2fSwKLQkJCQl7c2lnbmF0dXJlUlNBLCBoYXNoU0hBMX0sCi0JCQkJe3NpZ25hdHVyZUVDRFNBLCBoYXNoU0hBMX0sCi0JCQl9LAotCQl9LAotCQlmbGFnczogW11zdHJpbmd7Ci0JCQkiLWNlcnQtZmlsZSIsIHBhdGguSm9pbigqcmVzb3VyY2VEaXIsIHJzYUNlcnRpZmljYXRlRmlsZSksCi0JCQkiLWtleS1maWxlIiwgcGF0aC5Kb2luKCpyZXNvdXJjZURpciwgcnNhS2V5RmlsZSksCi0JCX0sCi0JCWV4cGVjdGVkQ2xpZW50Q2VydFNpZ25hdHVyZUhhc2g6IGhhc2hTSEEyNTYsCi0JfSkKIH0KIAogLy8gdGltZW91dHMgaXMgdGhlIHJldHJhbnNtaXQgc2NoZWR1bGUgZm9yIEJvcmluZ1NTTC4gSXQgZG91YmxlcyBhbmQKQEAgLTQxOTUsMTExICszNDQxLDcgQEAKIAl9CiB9CiAKLWZ1bmMgYWRkQ3VzdG9tRXh0ZW5zaW9uVGVzdHMoKSB7Ci0JZXhwZWN0ZWRDb250ZW50cyA6PSAiY3VzdG9tIGV4dGVuc2lvbiIKLQllbXB0eVN0cmluZyA6PSAiIgotCi0JZm9yIF8sIGlzQ2xpZW50IDo9IHJhbmdlIFtdYm9vbHtmYWxzZSwgdHJ1ZX0gewotCQlzdWZmaXggOj0gIlNlcnZlciIKLQkJZmxhZyA6PSAiLWVuYWJsZS1zZXJ2ZXItY3VzdG9tLWV4dGVuc2lvbiIKLQkJdGVzdFR5cGUgOj0gc2VydmVyVGVzdAotCQlpZiBpc0NsaWVudCB7Ci0JCQlzdWZmaXggPSAiQ2xpZW50IgotCQkJZmxhZyA9ICItZW5hYmxlLWNsaWVudC1jdXN0b20tZXh0ZW5zaW9uIgotCQkJdGVzdFR5cGUgPSBjbGllbnRUZXN0Ci0JCX0KLQotCQl0ZXN0Q2FzZXMgPSBhcHBlbmQodGVzdENhc2VzLCB0ZXN0Q2FzZXsKLQkJCXRlc3RUeXBlOiB0ZXN0VHlwZSwKLQkJCW5hbWU6ICAgICAiQ3VzdG9tRXh0ZW5zaW9ucy0iICsgc3VmZml4LAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlDdXN0b21FeHRlbnNpb246ICAgICAgICAgZXhwZWN0ZWRDb250ZW50cywKLQkJCQkJRXhwZWN0ZWRDdXN0b21FeHRlbnNpb246ICZleHBlY3RlZENvbnRlbnRzLAotCQkJCX0sCi0JCQl9LAotCQkJZmxhZ3M6IFtdc3RyaW5ne2ZsYWd9LAotCQl9KQotCi0JCS8vIElmIHRoZSBwYXJzZSBjYWxsYmFjayBmYWlscywgdGhlIGhhbmRzaGFrZSBzaG91bGQgYWxzbyBmYWlsLgotCQl0ZXN0Q2FzZXMgPSBhcHBlbmQodGVzdENhc2VzLCB0ZXN0Q2FzZXsKLQkJCXRlc3RUeXBlOiB0ZXN0VHlwZSwKLQkJCW5hbWU6ICAgICAiQ3VzdG9tRXh0ZW5zaW9ucy1QYXJzZUVycm9yLSIgKyBzdWZmaXgsCi0JCQljb25maWc6IENvbmZpZ3sKLQkJCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJCUN1c3RvbUV4dGVuc2lvbjogICAgICAgICBleHBlY3RlZENvbnRlbnRzICsgImZvbyIsCi0JCQkJCUV4cGVjdGVkQ3VzdG9tRXh0ZW5zaW9uOiAmZXhwZWN0ZWRDb250ZW50cywKLQkJCQl9LAotCQkJfSwKLQkJCWZsYWdzOiAgICAgICAgIFtdc3RyaW5ne2ZsYWd9LAotCQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJCWV4cGVjdGVkRXJyb3I6ICI6Q1VTVE9NX0VYVEVOU0lPTl9FUlJPUjoiLAotCQl9KQotCi0JCS8vIElmIHRoZSBhZGQgY2FsbGJhY2sgZmFpbHMsIHRoZSBoYW5kc2hha2Ugc2hvdWxkIGFsc28gZmFpbC4KLQkJdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgdGVzdENhc2V7Ci0JCQl0ZXN0VHlwZTogdGVzdFR5cGUsCi0JCQluYW1lOiAgICAgIkN1c3RvbUV4dGVuc2lvbnMtRmFpbEFkZC0iICsgc3VmZml4LAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlDdXN0b21FeHRlbnNpb246ICAgICAgICAgZXhwZWN0ZWRDb250ZW50cywKLQkJCQkJRXhwZWN0ZWRDdXN0b21FeHRlbnNpb246ICZleHBlY3RlZENvbnRlbnRzLAotCQkJCX0sCi0JCQl9LAotCQkJZmxhZ3M6ICAgICAgICAgW11zdHJpbmd7ZmxhZywgIi1jdXN0b20tZXh0ZW5zaW9uLWZhaWwtYWRkIn0sCi0JCQlzaG91bGRGYWlsOiAgICB0cnVlLAotCQkJZXhwZWN0ZWRFcnJvcjogIjpDVVNUT01fRVhURU5TSU9OX0VSUk9SOiIsCi0JCX0pCi0KLQkJLy8gSWYgdGhlIGFkZCBjYWxsYmFjayByZXR1cm5zIHplcm8sIG5vIGV4dGVuc2lvbiBzaG91bGQgYmUKLQkJLy8gYWRkZWQuCi0JCXNraXBDdXN0b21FeHRlbnNpb24gOj0gZXhwZWN0ZWRDb250ZW50cwotCQlpZiBpc0NsaWVudCB7Ci0JCQkvLyBGb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGNsaWVudCBza2lwcyBzZW5kaW5nIHRoZQotCQkJLy8gY3VzdG9tIGV4dGVuc2lvbiwgdGhlIHNlcnZlciBtdXN0IG5vdCDigJxlY2hv4oCdIGl0LgotCQkJc2tpcEN1c3RvbUV4dGVuc2lvbiA9ICIiCi0JCX0KLQkJdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgdGVzdENhc2V7Ci0JCQl0ZXN0VHlwZTogdGVzdFR5cGUsCi0JCQluYW1lOiAgICAgIkN1c3RvbUV4dGVuc2lvbnMtU2tpcC0iICsgc3VmZml4LAotCQkJY29uZmlnOiBDb25maWd7Ci0JCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCQlDdXN0b21FeHRlbnNpb246ICAgICAgICAgc2tpcEN1c3RvbUV4dGVuc2lvbiwKLQkJCQkJRXhwZWN0ZWRDdXN0b21FeHRlbnNpb246ICZlbXB0eVN0cmluZywKLQkJCQl9LAotCQkJfSwKLQkJCWZsYWdzOiBbXXN0cmluZ3tmbGFnLCAiLWN1c3RvbS1leHRlbnNpb24tc2tpcCJ9LAotCQl9KQotCX0KLQotCS8vIFRoZSBjdXN0b20gZXh0ZW5zaW9uIGFkZCBjYWxsYmFjayBzaG91bGQgbm90IGJlIGNhbGxlZCBpZiB0aGUgY2xpZW50Ci0JLy8gZG9lc24ndCBzZW5kIHRoZSBleHRlbnNpb24uCi0JdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgdGVzdENhc2V7Ci0JCXRlc3RUeXBlOiBzZXJ2ZXJUZXN0LAotCQluYW1lOiAgICAgIkN1c3RvbUV4dGVuc2lvbnMtTm90Q2FsbGVkLVNlcnZlciIsCi0JCWNvbmZpZzogQ29uZmlnewotCQkJQnVnczogUHJvdG9jb2xCdWdzewotCQkJCUV4cGVjdGVkQ3VzdG9tRXh0ZW5zaW9uOiAmZW1wdHlTdHJpbmcsCi0JCQl9LAotCQl9LAotCQlmbGFnczogW11zdHJpbmd7Ii1lbmFibGUtc2VydmVyLWN1c3RvbS1leHRlbnNpb24iLCAiLWN1c3RvbS1leHRlbnNpb24tZmFpbC1hZGQifSwKLQl9KQotCi0JLy8gVGVzdCBhbiB1bmtub3duIGV4dGVuc2lvbiBmcm9tIHRoZSBzZXJ2ZXIuCi0JdGVzdENhc2VzID0gYXBwZW5kKHRlc3RDYXNlcywgdGVzdENhc2V7Ci0JCXRlc3RUeXBlOiBjbGllbnRUZXN0LAotCQluYW1lOiAgICAgIlVua25vd25FeHRlbnNpb24tQ2xpZW50IiwKLQkJY29uZmlnOiBDb25maWd7Ci0JCQlCdWdzOiBQcm90b2NvbEJ1Z3N7Ci0JCQkJQ3VzdG9tRXh0ZW5zaW9uOiBleHBlY3RlZENvbnRlbnRzLAotCQkJfSwKLQkJfSwKLQkJc2hvdWxkRmFpbDogICAgdHJ1ZSwKLQkJZXhwZWN0ZWRFcnJvcjogIjpVTkVYUEVDVEVEX0VYVEVOU0lPTjoiLAotCX0pCi19Ci0KLWZ1bmMgd29ya2VyKHN0YXR1c0NoYW4gY2hhbiBzdGF0dXNNc2csIGMgY2hhbiAqdGVzdENhc2UsIHNoaW1QYXRoIHN0cmluZywgd2cgKnN5bmMuV2FpdEdyb3VwKSB7CitmdW5jIHdvcmtlcihzdGF0dXNDaGFuIGNoYW4gc3RhdHVzTXNnLCBjIGNoYW4gKnRlc3RDYXNlLCBidWlsZERpciBzdHJpbmcsIHdnICpzeW5jLldhaXRHcm91cCkgewogCWRlZmVyIHdnLkRvbmUoKQogCiAJZm9yIHRlc3QgOj0gcmFuZ2UgYyB7CkBAIC00MzA3LDExICszNDQ5LDExIEBACiAKIAkJaWYgKm1hbGxvY1Rlc3QgPCAwIHsKIAkJCXN0YXR1c0NoYW4gPC0gc3RhdHVzTXNne3Rlc3Q6IHRlc3QsIHN0YXJ0ZWQ6IHRydWV9Ci0JCQllcnIgPSBydW5UZXN0KHRlc3QsIHNoaW1QYXRoLCAtMSkKKwkJCWVyciA9IHJ1blRlc3QodGVzdCwgYnVpbGREaXIsIC0xKQogCQl9IGVsc2UgewogCQkJZm9yIG1hbGxvY051bVRvRmFpbCA6PSBpbnQ2NCgqbWFsbG9jVGVzdCk7IDsgbWFsbG9jTnVtVG9GYWlsKysgewogCQkJCXN0YXR1c0NoYW4gPC0gc3RhdHVzTXNne3Rlc3Q6IHRlc3QsIHN0YXJ0ZWQ6IHRydWV9Ci0JCQkJaWYgZXJyID0gcnVuVGVzdCh0ZXN0LCBzaGltUGF0aCwgbWFsbG9jTnVtVG9GYWlsKTsgZXJyICE9IGVyck1vcmVNYWxsb2NzIHsKKwkJCQlpZiBlcnIgPSBydW5UZXN0KHRlc3QsIGJ1aWxkRGlyLCBtYWxsb2NOdW1Ub0ZhaWwpOyBlcnIgIT0gZXJyTW9yZU1hbGxvY3MgewogCQkJCQlpZiBlcnIgIT0gbmlsIHsKIAkJCQkJCWZtdC5QcmludGYoIlxuXG5tYWxsb2MgdGVzdCBmYWlsZWQgYXQgJWQ6ICVzXG4iLCBtYWxsb2NOdW1Ub0ZhaWwsIGVycikKIAkJCQkJfQpAQCAtNDM3MywxMCArMzUxNSwxMiBAQAogfQogCiBmdW5jIG1haW4oKSB7Ci0JZmxhZy5QYXJzZSgpCi0JKnJlc291cmNlRGlyID0gcGF0aC5DbGVhbigqcmVzb3VyY2VEaXIpCisJdmFyIGZsYWdUZXN0ICpzdHJpbmcgPSBmbGFnLlN0cmluZygidGVzdCIsICIiLCAiVGhlIG5hbWUgb2YgYSB0ZXN0IHRvIHJ1biwgb3IgZW1wdHkgdG8gcnVuIGFsbCB0ZXN0cyIpCisJdmFyIGZsYWdOdW1Xb3JrZXJzICppbnQgPSBmbGFnLkludCgibnVtLXdvcmtlcnMiLCBydW50aW1lLk51bUNQVSgpLCAiVGhlIG51bWJlciBvZiB3b3JrZXJzIHRvIHJ1biBpbiBwYXJhbGxlbC4iKQorCXZhciBmbGFnQnVpbGREaXIgKnN0cmluZyA9IGZsYWcuU3RyaW5nKCJidWlsZC1kaXIiLCAiLi4vLi4vLi4vYnVpbGQiLCAiVGhlIGJ1aWxkIGRpcmVjdG9yeSB0byBydW4gdGhlIHNoaW0gZnJvbS4iKQogCi0JYWRkQmFzaWNUZXN0cygpCisJZmxhZy5QYXJzZSgpCisKIAlhZGRDaXBoZXJTdWl0ZVRlc3RzKCkKIAlhZGRCYWRFQ0RTQVNpZ25hdHVyZVRlc3RzKCkKIAlhZGRDQkNQYWRkaW5nVGVzdHMoKQpAQCAtNDM5MiwxMCArMzUzNiwxMCBAQAogCWFkZFJlbmVnb3RpYXRpb25UZXN0cygpCiAJYWRkRFRMU1JlcGxheVRlc3RzKCkKIAlhZGRTaWduaW5nSGFzaFRlc3RzKCkKKwlhZGRGYXN0UmFkaW9QYWRkaW5nVGVzdHMoKQogCWFkZERUTFNSZXRyYW5zbWl0VGVzdHMoKQogCWFkZEV4cG9ydEtleWluZ01hdGVyaWFsVGVzdHMoKQogCWFkZFRMU1VuaXF1ZVRlc3RzKCkKLQlhZGRDdXN0b21FeHRlbnNpb25UZXN0cygpCiAJZm9yIF8sIGFzeW5jIDo9IHJhbmdlIFtdYm9vbHtmYWxzZSwgdHJ1ZX0gewogCQlmb3IgXywgc3BsaXRIYW5kc2hha2UgOj0gcmFuZ2UgW11ib29se2ZhbHNlLCB0cnVlfSB7CiAJCQlmb3IgXywgcHJvdG9jb2wgOj0gcmFuZ2UgW11wcm90b2NvbHt0bHMsIGR0bHN9IHsKQEAgLTQ0MDYsMTkgKzM1NTAsMjEgQEAKIAogCXZhciB3ZyBzeW5jLldhaXRHcm91cAogCi0Jc3RhdHVzQ2hhbiA6PSBtYWtlKGNoYW4gc3RhdHVzTXNnLCAqbnVtV29ya2VycykKLQl0ZXN0Q2hhbiA6PSBtYWtlKGNoYW4gKnRlc3RDYXNlLCAqbnVtV29ya2VycykKKwludW1Xb3JrZXJzIDo9ICpmbGFnTnVtV29ya2VycworCisJc3RhdHVzQ2hhbiA6PSBtYWtlKGNoYW4gc3RhdHVzTXNnLCBudW1Xb3JrZXJzKQorCXRlc3RDaGFuIDo9IG1ha2UoY2hhbiAqdGVzdENhc2UsIG51bVdvcmtlcnMpCiAJZG9uZUNoYW4gOj0gbWFrZShjaGFuICp0ZXN0T3V0cHV0KQogCiAJZ28gc3RhdHVzUHJpbnRlcihkb25lQ2hhbiwgc3RhdHVzQ2hhbiwgbGVuKHRlc3RDYXNlcykpCiAKLQlmb3IgaSA6PSAwOyBpIDwgKm51bVdvcmtlcnM7IGkrKyB7CisJZm9yIGkgOj0gMDsgaSA8IG51bVdvcmtlcnM7IGkrKyB7CiAJCXdnLkFkZCgxKQotCQlnbyB3b3JrZXIoc3RhdHVzQ2hhbiwgdGVzdENoYW4sICpzaGltUGF0aCwgJndnKQorCQlnbyB3b3JrZXIoc3RhdHVzQ2hhbiwgdGVzdENoYW4sICpmbGFnQnVpbGREaXIsICZ3ZykKIAl9CiAKIAlmb3IgaSA6PSByYW5nZSB0ZXN0Q2FzZXMgewotCQlpZiBsZW4oKnRlc3RUb1J1bikgPT0gMCB8fCAqdGVzdFRvUnVuID09IHRlc3RDYXNlc1tpXS5uYW1lIHsKKwkJaWYgbGVuKCpmbGFnVGVzdCkgPT0gMCB8fCAqZmxhZ1Rlc3QgPT0gdGVzdENhc2VzW2ldLm5hbWUgewogCQkJdGVzdENoYW4gPC0gJnRlc3RDYXNlc1tpXQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvc3JjL3NzbC90ZXN0L3Rlc3RfY29uZmlnLmNjIGIvc3JjL3NzbC90ZXN0L3Rlc3RfY29uZmlnLmNjCmluZGV4IDFjNDJiMmUuLjM2M2I2ZjMgMTAwNjQ0Ci0tLSBhL3NyYy9zc2wvdGVzdC90ZXN0X2NvbmZpZy5jYworKysgYi9zcmMvc3NsL3Rlc3QvdGVzdF9jb25maWcuY2MKQEAgLTY1LDkgKzY1LDEyIEBACiAgIHsgIi1leHBlY3Qtc2Vzc2lvbi1taXNzIiwgJlRlc3RDb25maWc6OmV4cGVjdF9zZXNzaW9uX21pc3MgfSwKICAgeyAiLWV4cGVjdC1leHRlbmRlZC1tYXN0ZXItc2VjcmV0IiwKICAgICAmVGVzdENvbmZpZzo6ZXhwZWN0X2V4dGVuZGVkX21hc3Rlcl9zZWNyZXQgfSwKKyAgeyAiLWFsbG93LXVuc2FmZS1sZWdhY3ktcmVuZWdvdGlhdGlvbiIsCisgICAgJlRlc3RDb25maWc6OmFsbG93X3Vuc2FmZV9sZWdhY3lfcmVuZWdvdGlhdGlvbiB9LAogICB7ICItZW5hYmxlLW9jc3Atc3RhcGxpbmciLCAmVGVzdENvbmZpZzo6ZW5hYmxlX29jc3Bfc3RhcGxpbmcgfSwKICAgeyAiLWVuYWJsZS1zaWduZWQtY2VydC10aW1lc3RhbXBzIiwKICAgICAmVGVzdENvbmZpZzo6ZW5hYmxlX3NpZ25lZF9jZXJ0X3RpbWVzdGFtcHMgfSwKKyAgeyAiLWZhc3RyYWRpby1wYWRkaW5nIiwgJlRlc3RDb25maWc6OmZhc3RyYWRpb19wYWRkaW5nIH0sCiAgIHsgIi1pbXBsaWNpdC1oYW5kc2hha2UiLCAmVGVzdENvbmZpZzo6aW1wbGljaXRfaGFuZHNoYWtlIH0sCiAgIHsgIi11c2UtZWFybHktY2FsbGJhY2siLCAmVGVzdENvbmZpZzo6dXNlX2Vhcmx5X2NhbGxiYWNrIH0sCiAgIHsgIi1mYWlsLWVhcmx5LWNhbGxiYWNrIiwgJlRlc3RDb25maWc6OmZhaWxfZWFybHlfY2FsbGJhY2sgfSwKQEAgLTc5LDI3ICs4Miw5IEBACiAgIHsgIi1yZWplY3QtcGVlci1yZW5lZ290aWF0aW9ucyIsICZUZXN0Q29uZmlnOjpyZWplY3RfcGVlcl9yZW5lZ290aWF0aW9ucyB9LAogICB7ICItbm8tbGVnYWN5LXNlcnZlci1jb25uZWN0IiwgJlRlc3RDb25maWc6Om5vX2xlZ2FjeV9zZXJ2ZXJfY29ubmVjdCB9LAogICB7ICItdGxzLXVuaXF1ZSIsICZUZXN0Q29uZmlnOjp0bHNfdW5pcXVlIH0sCi0gIHsgIi11c2UtYXN5bmMtcHJpdmF0ZS1rZXkiLCAmVGVzdENvbmZpZzo6dXNlX2FzeW5jX3ByaXZhdGVfa2V5IH0sCi0gIHsgIi1leHBlY3QtdGlja2V0LXJlbmV3YWwiLCAmVGVzdENvbmZpZzo6ZXhwZWN0X3RpY2tldF9yZW5ld2FsIH0sCi0gIHsgIi1leHBlY3Qtbm8tc2Vzc2lvbiIsICZUZXN0Q29uZmlnOjpleHBlY3Rfbm9fc2Vzc2lvbiB9LAotICB7ICItdXNlLXRpY2tldC1jYWxsYmFjayIsICZUZXN0Q29uZmlnOjp1c2VfdGlja2V0X2NhbGxiYWNrIH0sCi0gIHsgIi1yZW5ldy10aWNrZXQiLCAmVGVzdENvbmZpZzo6cmVuZXdfdGlja2V0IH0sCi0gIHsgIi1lbmFibGUtY2xpZW50LWN1c3RvbS1leHRlbnNpb24iLAotICAgICZUZXN0Q29uZmlnOjplbmFibGVfY2xpZW50X2N1c3RvbV9leHRlbnNpb24gfSwKLSAgeyAiLWVuYWJsZS1zZXJ2ZXItY3VzdG9tLWV4dGVuc2lvbiIsCi0gICAgJlRlc3RDb25maWc6OmVuYWJsZV9zZXJ2ZXJfY3VzdG9tX2V4dGVuc2lvbiB9LAotICB7ICItY3VzdG9tLWV4dGVuc2lvbi1za2lwIiwgJlRlc3RDb25maWc6OmN1c3RvbV9leHRlbnNpb25fc2tpcCB9LAotICB7ICItY3VzdG9tLWV4dGVuc2lvbi1mYWlsLWFkZCIsICZUZXN0Q29uZmlnOjpjdXN0b21fZXh0ZW5zaW9uX2ZhaWxfYWRkIH0sCi0gIHsgIi1jaGVjay1jbG9zZS1ub3RpZnkiLCAmVGVzdENvbmZpZzo6Y2hlY2tfY2xvc2Vfbm90aWZ5IH0sCi0gIHsgIi1zaGltLXNodXRzLWRvd24iLCAmVGVzdENvbmZpZzo6c2hpbV9zaHV0c19kb3duIH0sCi0gIHsgIi1taWNyb3NvZnQtYmlnLXNzbHYzLWJ1ZmZlciIsICZUZXN0Q29uZmlnOjptaWNyb3NvZnRfYmlnX3NzbHYzX2J1ZmZlciB9LAotICB7ICItdmVyaWZ5LWZhaWwiLCAmVGVzdENvbmZpZzo6dmVyaWZ5X2ZhaWwgfSwKLSAgeyAiLXZlcmlmeS1wZWVyIiwgJlRlc3RDb25maWc6OnZlcmlmeV9wZWVyIH0sCi0gIHsgIi1leHBlY3QtdmVyaWZ5LXJlc3VsdCIsICZUZXN0Q29uZmlnOjpleHBlY3RfdmVyaWZ5X3Jlc3VsdCB9CiB9OwogCiBjb25zdCBGbGFnPHN0ZDo6c3RyaW5nPiBrU3RyaW5nRmxhZ3NbXSA9IHsKLSAgeyAiLWRpZ2VzdC1wcmVmcyIsICZUZXN0Q29uZmlnOjpkaWdlc3RfcHJlZnMgfSwKICAgeyAiLWtleS1maWxlIiwgJlRlc3RDb25maWc6OmtleV9maWxlIH0sCiAgIHsgIi1jZXJ0LWZpbGUiLCAmVGVzdENvbmZpZzo6Y2VydF9maWxlIH0sCiAgIHsgIi1leHBlY3Qtc2VydmVyLW5hbWUiLCAmVGVzdENvbmZpZzo6ZXhwZWN0ZWRfc2VydmVyX25hbWUgfSwKQEAgLTExNiw4ICsxMDEsNiBAQAogICB7ICItcHNrLWlkZW50aXR5IiwgJlRlc3RDb25maWc6OnBza19pZGVudGl0eSB9LAogICB7ICItc3J0cC1wcm9maWxlcyIsICZUZXN0Q29uZmlnOjpzcnRwX3Byb2ZpbGVzIH0sCiAgIHsgIi1jaXBoZXIiLCAmVGVzdENvbmZpZzo6Y2lwaGVyIH0sCi0gIHsgIi1jaXBoZXItdGxzMTAiLCAmVGVzdENvbmZpZzo6Y2lwaGVyX3RsczEwIH0sCi0gIHsgIi1jaXBoZXItdGxzMTEiLCAmVGVzdENvbmZpZzo6Y2lwaGVyX3RsczExIH0sCiAgIHsgIi1leHBvcnQtbGFiZWwiLCAmVGVzdENvbmZpZzo6ZXhwb3J0X2xhYmVsIH0sCiAgIHsgIi1leHBvcnQtY29udGV4dCIsICZUZXN0Q29uZmlnOjpleHBvcnRfY29udGV4dCB9LAogfTsKQEAgLTEyOCw4ICsxMTEsNiBAQAogICB7ICItZXhwZWN0LW9jc3AtcmVzcG9uc2UiLCAmVGVzdENvbmZpZzo6ZXhwZWN0ZWRfb2NzcF9yZXNwb25zZSB9LAogICB7ICItZXhwZWN0LXNpZ25lZC1jZXJ0LXRpbWVzdGFtcHMiLAogICAgICZUZXN0Q29uZmlnOjpleHBlY3RlZF9zaWduZWRfY2VydF90aW1lc3RhbXBzIH0sCi0gIHsgIi1vY3NwLXJlc3BvbnNlIiwgJlRlc3RDb25maWc6Om9jc3BfcmVzcG9uc2UgfSwKLSAgeyAiLXNpZ25lZC1jZXJ0LXRpbWVzdGFtcHMiLCAmVGVzdENvbmZpZzo6c2lnbmVkX2NlcnRfdGltZXN0YW1wcyB9LAogfTsKIAogY29uc3QgRmxhZzxpbnQ+IGtJbnRGbGFnc1tdID0gewpkaWZmIC0tZ2l0IGEvc3JjL3NzbC90ZXN0L3Rlc3RfY29uZmlnLmggYi9zcmMvc3NsL3Rlc3QvdGVzdF9jb25maWcuaAppbmRleCA5ZGVhOGU5Li41ZDc1M2M4IDEwMDY0NAotLS0gYS9zcmMvc3NsL3Rlc3QvdGVzdF9jb25maWcuaAorKysgYi9zcmMvc3NsL3Rlc3QvdGVzdF9jb25maWcuaApAQCAtMjQsNyArMjQsNiBAQAogICBib29sIGlzX2R0bHMgPSBmYWxzZTsKICAgYm9vbCByZXN1bWUgPSBmYWxzZTsKICAgYm9vbCBmYWxsYmFja19zY3N2ID0gZmFsc2U7Ci0gIHN0ZDo6c3RyaW5nIGRpZ2VzdF9wcmVmczsKICAgc3RkOjpzdHJpbmcga2V5X2ZpbGU7CiAgIHN0ZDo6c3RyaW5nIGNlcnRfZmlsZTsKICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfc2VydmVyX25hbWU7CkBAIC01NSwxMSArNTQsMTMgQEAKICAgYm9vbCBleHBlY3RfZXh0ZW5kZWRfbWFzdGVyX3NlY3JldCA9IGZhbHNlOwogICBzdGQ6OnN0cmluZyBwc2s7CiAgIHN0ZDo6c3RyaW5nIHBza19pZGVudGl0eTsKKyAgYm9vbCBhbGxvd191bnNhZmVfbGVnYWN5X3JlbmVnb3RpYXRpb24gPSBmYWxzZTsKICAgc3RkOjpzdHJpbmcgc3J0cF9wcm9maWxlczsKICAgYm9vbCBlbmFibGVfb2NzcF9zdGFwbGluZyA9IGZhbHNlOwogICBzdGQ6OnN0cmluZyBleHBlY3RlZF9vY3NwX3Jlc3BvbnNlOwogICBib29sIGVuYWJsZV9zaWduZWRfY2VydF90aW1lc3RhbXBzID0gZmFsc2U7CiAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3NpZ25lZF9jZXJ0X3RpbWVzdGFtcHM7CisgIGJvb2wgZmFzdHJhZGlvX3BhZGRpbmcgPSBmYWxzZTsKICAgaW50IG1pbl92ZXJzaW9uID0gMDsKICAgaW50IG1heF92ZXJzaW9uID0gMDsKICAgaW50IG10dSA9IDA7CkBAIC03MCw4ICs3MSw2IEBACiAgIGJvb2wgZmFpbF9kZG9zX2NhbGxiYWNrID0gZmFsc2U7CiAgIGJvb2wgZmFpbF9zZWNvbmRfZGRvc19jYWxsYmFjayA9IGZhbHNlOwogICBzdGQ6OnN0cmluZyBjaXBoZXI7Ci0gIHN0ZDo6c3RyaW5nIGNpcGhlcl90bHMxMDsKLSAgc3RkOjpzdHJpbmcgY2lwaGVyX3RsczExOwogICBib29sIGhhbmRzaGFrZV9uZXZlcl9kb25lID0gZmFsc2U7CiAgIGludCBleHBvcnRfa2V5aW5nX21hdGVyaWFsID0gMDsKICAgc3RkOjpzdHJpbmcgZXhwb3J0X2xhYmVsOwpAQCAtODAsMjMgKzc5LDYgQEAKICAgYm9vbCByZWplY3RfcGVlcl9yZW5lZ290aWF0aW9ucyA9IGZhbHNlOwogICBib29sIG5vX2xlZ2FjeV9zZXJ2ZXJfY29ubmVjdCA9IGZhbHNlOwogICBib29sIHRsc191bmlxdWUgPSBmYWxzZTsKLSAgYm9vbCB1c2VfYXN5bmNfcHJpdmF0ZV9rZXkgPSBmYWxzZTsKLSAgYm9vbCBleHBlY3RfdGlja2V0X3JlbmV3YWwgPSBmYWxzZTsKLSAgYm9vbCBleHBlY3Rfbm9fc2Vzc2lvbiA9IGZhbHNlOwotICBib29sIHVzZV90aWNrZXRfY2FsbGJhY2sgPSBmYWxzZTsKLSAgYm9vbCByZW5ld190aWNrZXQgPSBmYWxzZTsKLSAgYm9vbCBlbmFibGVfY2xpZW50X2N1c3RvbV9leHRlbnNpb24gPSBmYWxzZTsKLSAgYm9vbCBlbmFibGVfc2VydmVyX2N1c3RvbV9leHRlbnNpb24gPSBmYWxzZTsKLSAgYm9vbCBjdXN0b21fZXh0ZW5zaW9uX3NraXAgPSBmYWxzZTsKLSAgYm9vbCBjdXN0b21fZXh0ZW5zaW9uX2ZhaWxfYWRkID0gZmFsc2U7Ci0gIHN0ZDo6c3RyaW5nIG9jc3BfcmVzcG9uc2U7Ci0gIGJvb2wgY2hlY2tfY2xvc2Vfbm90aWZ5ID0gZmFsc2U7Ci0gIGJvb2wgc2hpbV9zaHV0c19kb3duID0gZmFsc2U7Ci0gIGJvb2wgbWljcm9zb2Z0X2JpZ19zc2x2M19idWZmZXIgPSBmYWxzZTsKLSAgYm9vbCB2ZXJpZnlfZmFpbCA9IGZhbHNlOwotICBib29sIHZlcmlmeV9wZWVyID0gZmFsc2U7Ci0gIGJvb2wgZXhwZWN0X3ZlcmlmeV9yZXN1bHQgPSBmYWxzZTsKLSAgc3RkOjpzdHJpbmcgc2lnbmVkX2NlcnRfdGltZXN0YW1wczsKIH07CiAKIGJvb2wgUGFyc2VDb25maWcoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBUZXN0Q29uZmlnICpvdXRfY29uZmlnKTsKZGlmZiAtLWdpdCBhL3NyYy9zc2wvdGxzX3JlY29yZC5jIGIvc3JjL3NzbC90bHNfcmVjb3JkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZTMxYjQuLjAwMDAwMDAKLS0tIGEvc3JjL3NzbC90bHNfcmVjb3JkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgotICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgotICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcwotICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAotICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCi0gKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCi0gKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KLSAqCi0gKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgotICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgotICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgotICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KLSAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgotICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5Ci0gKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgotICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5Ci0gKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KLSAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCi0gKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKLSAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQotICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQotICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KLSAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0Ci0gKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCi0gKgotICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgotICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAotICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCi0gKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCi0gKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KLQotI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvYnl0ZXN0cmluZy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+Ci0KLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi0KLS8qIGtNYXhFbXB0eVJlY29yZHMgaXMgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSwgZW1wdHkgcmVjb3JkcyB0aGF0IHdpbGwgYmUKLSAqIHByb2Nlc3NlZC4gV2l0aG91dCB0aGlzIGxpbWl0IGFuIGF0dGFja2VyIGNvdWxkIHNlbmQgZW1wdHkgcmVjb3JkcyBhdCBhCi0gKiBmYXN0ZXIgcmF0ZSB0aGFuIHdlIGNhbiBwcm9jZXNzIGFuZCBjYXVzZSByZWNvcmQgcHJvY2Vzc2luZyB0byBsb29wCi0gKiBmb3JldmVyLiAqLwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga01heEVtcHR5UmVjb3JkcyA9IDMyOwotCi1zaXplX3Qgc3NsX3JlY29yZF9wcmVmaXhfbGVuKGNvbnN0IFNTTCAqc3NsKSB7Ci0gIGlmIChTU0xfSVNfRFRMUyhzc2wpKSB7Ci0gICAgcmV0dXJuIERUTFMxX1JUX0hFQURFUl9MRU5HVEggKwotICAgICAgICAgICBTU0xfQUVBRF9DVFhfZXhwbGljaXRfbm9uY2VfbGVuKHNzbC0+YWVhZF9yZWFkX2N0eCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIFNTTDNfUlRfSEVBREVSX0xFTkdUSCArCi0gICAgICAgICAgIFNTTF9BRUFEX0NUWF9leHBsaWNpdF9ub25jZV9sZW4oc3NsLT5hZWFkX3JlYWRfY3R4KTsKLSAgfQotfQotCi1zaXplX3Qgc3NsX3NlYWxfcHJlZml4X2xlbihjb25zdCBTU0wgKnNzbCkgewotICBpZiAoU1NMX0lTX0RUTFMoc3NsKSkgewotICAgIHJldHVybiBEVExTMV9SVF9IRUFERVJfTEVOR1RIICsKLSAgICAgICAgICAgU1NMX0FFQURfQ1RYX2V4cGxpY2l0X25vbmNlX2xlbihzc2wtPmFlYWRfd3JpdGVfY3R4KTsKLSAgfSBlbHNlIHsKLSAgICBzaXplX3QgcmV0ID0gU1NMM19SVF9IRUFERVJfTEVOR1RIICsKLSAgICAgICAgICAgICAgICAgU1NMX0FFQURfQ1RYX2V4cGxpY2l0X25vbmNlX2xlbihzc2wtPmFlYWRfd3JpdGVfY3R4KTsKLSAgICBpZiAoc3NsLT5zMy0+bmVlZF9yZWNvcmRfc3BsaXR0aW5nKSB7Ci0gICAgICByZXQgKz0gU1NMM19SVF9IRUFERVJfTEVOR1RIOwotICAgICAgcmV0ICs9IHNzbF9jaXBoZXJfZ2V0X3JlY29yZF9zcGxpdF9sZW4oc3NsLT5hZWFkX3dyaXRlX2N0eC0+Y2lwaGVyKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotfQotCi1zaXplX3Qgc3NsX21heF9zZWFsX292ZXJoZWFkKGNvbnN0IFNTTCAqc3NsKSB7Ci0gIGlmIChTU0xfSVNfRFRMUyhzc2wpKSB7Ci0gICAgcmV0dXJuIERUTFMxX1JUX0hFQURFUl9MRU5HVEggKwotICAgICAgICAgICBTU0xfQUVBRF9DVFhfbWF4X292ZXJoZWFkKHNzbC0+YWVhZF93cml0ZV9jdHgpOwotICB9IGVsc2UgewotICAgIHNpemVfdCByZXQgPSBTU0wzX1JUX0hFQURFUl9MRU5HVEggKwotICAgICAgICAgICAgICAgICBTU0xfQUVBRF9DVFhfbWF4X292ZXJoZWFkKHNzbC0+YWVhZF93cml0ZV9jdHgpOwotICAgIGlmIChzc2wtPnMzLT5uZWVkX3JlY29yZF9zcGxpdHRpbmcpIHsKLSAgICAgIHJldCAqPSAyOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci19Ci0KLWVudW0gc3NsX29wZW5fcmVjb3JkX3QgdGxzX29wZW5fcmVjb3JkKAotICAgIFNTTCAqc3NsLCB1aW50OF90ICpvdXRfdHlwZSwgdWludDhfdCAqb3V0LCBzaXplX3QgKm91dF9sZW4sCi0gICAgc2l6ZV90ICpvdXRfY29uc3VtZWQsIHVpbnQ4X3QgKm91dF9hbGVydCwgc2l6ZV90IG1heF9vdXQsIGNvbnN0IHVpbnQ4X3QgKmluLAotICAgIHNpemVfdCBpbl9sZW4pIHsKLSAgQ0JTIGNiczsKLSAgQ0JTX2luaXQoJmNicywgaW4sIGluX2xlbik7Ci0KLSAgLyogRGVjb2RlIHRoZSByZWNvcmQgaGVhZGVyLiAqLwotICB1aW50OF90IHR5cGU7Ci0gIHVpbnQxNl90IHZlcnNpb24sIGNpcGhlcnRleHRfbGVuOwotICBpZiAoIUNCU19nZXRfdTgoJmNicywgJnR5cGUpIHx8Ci0gICAgICAhQ0JTX2dldF91MTYoJmNicywgJnZlcnNpb24pIHx8Ci0gICAgICAhQ0JTX2dldF91MTYoJmNicywgJmNpcGhlcnRleHRfbGVuKSkgewotICAgICpvdXRfY29uc3VtZWQgPSBTU0wzX1JUX0hFQURFUl9MRU5HVEg7Ci0gICAgcmV0dXJuIHNzbF9vcGVuX3JlY29yZF9wYXJ0aWFsOwotICB9Ci0KLSAgLyogQ2hlY2sgdGhlIHZlcnNpb24uICovCi0gIGlmICgoc3NsLT5zMy0+aGF2ZV92ZXJzaW9uICYmIHZlcnNpb24gIT0gc3NsLT52ZXJzaW9uKSB8fAotICAgICAgKHZlcnNpb24gPj4gOCkgIT0gU1NMM19WRVJTSU9OX01BSk9SKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9XUk9OR19WRVJTSU9OX05VTUJFUik7Ci0gICAgKm91dF9hbGVydCA9IFNTTF9BRF9QUk9UT0NPTF9WRVJTSU9OOwotICAgIHJldHVybiBzc2xfb3Blbl9yZWNvcmRfZXJyb3I7Ci0gIH0KLQotICAvKiBDaGVjayB0aGUgY2lwaGVydGV4dCBsZW5ndGguICovCi0gIHNpemVfdCBleHRyYSA9IDA7Ci0gIGlmIChzc2wtPm9wdGlvbnMgJiBTU0xfT1BfTUlDUk9TT0ZUX0JJR19TU0xWM19CVUZGRVIpIHsKLSAgICBleHRyYSA9IFNTTDNfUlRfTUFYX0VYVFJBOwotICB9Ci0gIGlmIChjaXBoZXJ0ZXh0X2xlbiA+IFNTTDNfUlRfTUFYX0VOQ1JZUFRFRF9MRU5HVEggKyBleHRyYSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfRU5DUllQVEVEX0xFTkdUSF9UT09fTE9ORyk7Ci0gICAgKm91dF9hbGVydCA9IFNTTF9BRF9SRUNPUkRfT1ZFUkZMT1c7Ci0gICAgcmV0dXJuIHNzbF9vcGVuX3JlY29yZF9lcnJvcjsKLSAgfQotCi0gIC8qIEV4dHJhY3QgdGhlIGJvZHkuICovCi0gIENCUyBib2R5OwotICBpZiAoIUNCU19nZXRfYnl0ZXMoJmNicywgJmJvZHksIGNpcGhlcnRleHRfbGVuKSkgewotICAgICpvdXRfY29uc3VtZWQgPSBTU0wzX1JUX0hFQURFUl9MRU5HVEggKyAoc2l6ZV90KWNpcGhlcnRleHRfbGVuOwotICAgIHJldHVybiBzc2xfb3Blbl9yZWNvcmRfcGFydGlhbDsKLSAgfQotCi0gIGlmIChzc2wtPm1zZ19jYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgc3NsLT5tc2dfY2FsbGJhY2soMCAvKiByZWFkICovLCAwLCBTU0wzX1JUX0hFQURFUiwgaW4sCi0gICAgICAgICAgICAgICAgICAgICAgU1NMM19SVF9IRUFERVJfTEVOR1RILCBzc2wsIHNzbC0+bXNnX2NhbGxiYWNrX2FyZyk7Ci0gIH0KLQotICAvKiBEZWNyeXB0IHRoZSBib2R5LiAqLwotICBzaXplX3QgcGxhaW50ZXh0X2xlbjsKLSAgaWYgKCFTU0xfQUVBRF9DVFhfb3Blbihzc2wtPmFlYWRfcmVhZF9jdHgsIG91dCwgJnBsYWludGV4dF9sZW4sIG1heF9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgdmVyc2lvbiwgc3NsLT5zMy0+cmVhZF9zZXF1ZW5jZSwgQ0JTX2RhdGEoJmJvZHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgIENCU19sZW4oJmJvZHkpKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfREVDUllQVElPTl9GQUlMRURfT1JfQkFEX1JFQ09SRF9NQUMpOwotICAgICpvdXRfYWxlcnQgPSBTU0xfQURfQkFEX1JFQ09SRF9NQUM7Ci0gICAgcmV0dXJuIHNzbF9vcGVuX3JlY29yZF9lcnJvcjsKLSAgfQotICBpZiAoIXNzbDNfcmVjb3JkX3NlcXVlbmNlX3VwZGF0ZShzc2wtPnMzLT5yZWFkX3NlcXVlbmNlLCA4KSkgewotICAgICpvdXRfYWxlcnQgPSBTU0xfQURfSU5URVJOQUxfRVJST1I7Ci0gICAgcmV0dXJuIHNzbF9vcGVuX3JlY29yZF9lcnJvcjsKLSAgfQotCi0gIC8qIENoZWNrIHRoZSBwbGFpbnRleHQgbGVuZ3RoLiAqLwotICBpZiAocGxhaW50ZXh0X2xlbiA+IFNTTDNfUlRfTUFYX1BMQUlOX0xFTkdUSCArIGV4dHJhKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9EQVRBX0xFTkdUSF9UT09fTE9ORyk7Ci0gICAgKm91dF9hbGVydCA9IFNTTF9BRF9SRUNPUkRfT1ZFUkZMT1c7Ci0gICAgcmV0dXJuIHNzbF9vcGVuX3JlY29yZF9lcnJvcjsKLSAgfQotCi0gIC8qIExpbWl0IHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgZW1wdHkgcmVjb3Jkcy4gKi8KLSAgaWYgKHBsYWludGV4dF9sZW4gPT0gMCkgewotICAgIHNzbC0+czMtPmVtcHR5X3JlY29yZF9jb3VudCsrOwotICAgIGlmIChzc2wtPnMzLT5lbXB0eV9yZWNvcmRfY291bnQgPiBrTWF4RW1wdHlSZWNvcmRzKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX1RPT19NQU5ZX0VNUFRZX0ZSQUdNRU5UUyk7Ci0gICAgICAqb3V0X2FsZXJ0ID0gU1NMX0FEX1VORVhQRUNURURfTUVTU0FHRTsKLSAgICAgIHJldHVybiBzc2xfb3Blbl9yZWNvcmRfZXJyb3I7Ci0gICAgfQotICAgIC8qIEFwYXJ0IGZyb20gdGhlIGxpbWl0LCBlbXB0eSByZWNvcmRzIGFyZSByZXR1cm5lZCB1cCB0byB0aGUgY2FsbGVyLiBUaGlzCi0gICAgICogYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmVqZWN0IHJlY29yZHMgb2YgdGhlIHdyb25nIHR5cGUuICovCi0gIH0gZWxzZSB7Ci0gICAgc3NsLT5zMy0+ZW1wdHlfcmVjb3JkX2NvdW50ID0gMDsKLSAgfQotCi0gICpvdXRfdHlwZSA9IHR5cGU7Ci0gICpvdXRfbGVuID0gcGxhaW50ZXh0X2xlbjsKLSAgKm91dF9jb25zdW1lZCA9IGluX2xlbiAtIENCU19sZW4oJmNicyk7Ci0gIHJldHVybiBzc2xfb3Blbl9yZWNvcmRfc3VjY2VzczsKLX0KLQotc3RhdGljIGludCBkb19zZWFsX3JlY29yZChTU0wgKnNzbCwgdWludDhfdCAqb3V0LCBzaXplX3QgKm91dF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtYXhfb3V0LCB1aW50OF90IHR5cGUsIGNvbnN0IHVpbnQ4X3QgKmluLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5fbGVuKSB7Ci0gIGlmIChtYXhfb3V0IDwgU1NMM19SVF9IRUFERVJfTEVOR1RIKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBTU0xfUl9CVUZGRVJfVE9PX1NNQUxMKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICAvKiBDaGVjayB0aGUgcmVjb3JkIGhlYWRlciBkb2VzIG5vdCBhbGlhcyBhbnkgcGFydCBvZiB0aGUgaW5wdXQuCi0gICAqIHxTU0xfQUVBRF9DVFhfc2VhbHwgd2lsbCBpbnRlcm5hbGx5IGVuZm9yY2Ugb3RoZXIgYWxpYXNpbmcgcmVxdWlyZW1lbnRzLiAqLwotICBpZiAoaW4gPCBvdXQgKyBTU0wzX1JUX0hFQURFUl9MRU5HVEggJiYgb3V0IDwgaW4gKyBpbl9sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihTU0wsIFNTTF9SX09VVFBVVF9BTElBU0VTX0lOUFVUKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIG91dFswXSA9IHR5cGU7Ci0KLSAgLyogU29tZSBzZXJ2ZXJzIGhhbmcgaWYgaW5pdGlhbCBDbGllbnRIZWxsbyBpcyBsYXJnZXIgdGhhbiAyNTYgYnl0ZXMgYW5kCi0gICAqIHJlY29yZCB2ZXJzaW9uIG51bWJlciA+IFRMUyAxLjAuICovCi0gIHVpbnQxNl90IHdpcmVfdmVyc2lvbiA9IHNzbC0+dmVyc2lvbjsKLSAgaWYgKCFzc2wtPnMzLT5oYXZlX3ZlcnNpb24gJiYgc3NsLT52ZXJzaW9uID4gU1NMM19WRVJTSU9OKSB7Ci0gICAgd2lyZV92ZXJzaW9uID0gVExTMV9WRVJTSU9OOwotICB9Ci0gIG91dFsxXSA9IHdpcmVfdmVyc2lvbiA+PiA4OwotICBvdXRbMl0gPSB3aXJlX3ZlcnNpb24gJiAweGZmOwotCi0gIHNpemVfdCBjaXBoZXJ0ZXh0X2xlbjsKLSAgaWYgKCFTU0xfQUVBRF9DVFhfc2VhbChzc2wtPmFlYWRfd3JpdGVfY3R4LCBvdXQgKyBTU0wzX1JUX0hFQURFUl9MRU5HVEgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJmNpcGhlcnRleHRfbGVuLCBtYXhfb3V0IC0gU1NMM19SVF9IRUFERVJfTEVOR1RILAotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHdpcmVfdmVyc2lvbiwgc3NsLT5zMy0+d3JpdGVfc2VxdWVuY2UsIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgIGluX2xlbikgfHwKLSAgICAgICFzc2wzX3JlY29yZF9zZXF1ZW5jZV91cGRhdGUoc3NsLT5zMy0+d3JpdGVfc2VxdWVuY2UsIDgpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAoY2lwaGVydGV4dF9sZW4gPj0gMSA8PCAxNikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfT1ZFUkZMT1cpOwotICAgIHJldHVybiAwOwotICB9Ci0gIG91dFszXSA9IGNpcGhlcnRleHRfbGVuID4+IDg7Ci0gIG91dFs0XSA9IGNpcGhlcnRleHRfbGVuICYgMHhmZjsKLQotICAqb3V0X2xlbiA9IFNTTDNfUlRfSEVBREVSX0xFTkdUSCArIGNpcGhlcnRleHRfbGVuOwotCi0gIGlmIChzc2wtPm1zZ19jYWxsYmFjaykgewotICAgIHNzbC0+bXNnX2NhbGxiYWNrKDEgLyogd3JpdGUgKi8sIDAsIFNTTDNfUlRfSEVBREVSLCBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgU1NMM19SVF9IRUFERVJfTEVOR1RILCBzc2wsIHNzbC0+bXNnX2NhbGxiYWNrX2FyZyk7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotaW50IHRsc19zZWFsX3JlY29yZChTU0wgKnNzbCwgdWludDhfdCAqb3V0LCBzaXplX3QgKm91dF9sZW4sIHNpemVfdCBtYXhfb3V0LAotICAgICAgICAgICAgICAgICAgICB1aW50OF90IHR5cGUsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuKSB7Ci0gIHNpemVfdCBmcmFnX2xlbiA9IDA7Ci0gIGlmIChzc2wtPnMzLT5uZWVkX3JlY29yZF9zcGxpdHRpbmcgJiYgdHlwZSA9PSBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEgJiYKLSAgICAgIGluX2xlbiA+IDEpIHsKLSAgICAvKiB8ZG9fc2VhbF9yZWNvcmR8IHdpbGwgbm90aWNlIGlmIGl0IGNsb2JiZXJzIHxpblswXXwsIGJ1dCBub3QgaWYgaXQKLSAgICAgKiBhbGlhc2VzIHRoZSByZXN0IG9mIHxpbnwuICovCi0gICAgaWYgKGluICsgMSA8PSBvdXQgJiYgb3V0IDwgaW4gKyBpbl9sZW4pIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgU1NMX1JfT1VUUFVUX0FMSUFTRVNfSU5QVVQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC8qIEVuc3VyZSB8ZG9fc2VhbF9yZWNvcmR8IGRvZXMgbm90IHdyaXRlIGJleW9uZCB8aW5bMF18LiAqLwotICAgIHNpemVfdCBmcmFnX21heF9vdXQgPSBtYXhfb3V0OwotICAgIGlmIChvdXQgPD0gaW4gKyAxICYmIGluICsgMSA8IG91dCArIGZyYWdfbWF4X291dCkgewotICAgICAgZnJhZ19tYXhfb3V0ID0gKHNpemVfdCkoaW4gKyAxIC0gb3V0KTsKLSAgICB9Ci0gICAgaWYgKCFkb19zZWFsX3JlY29yZChzc2wsIG91dCwgJmZyYWdfbGVuLCBmcmFnX21heF9vdXQsIHR5cGUsIGluLCAxKSkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGluKys7Ci0gICAgaW5fbGVuLS07Ci0gICAgb3V0ICs9IGZyYWdfbGVuOwotICAgIG1heF9vdXQgLT0gZnJhZ19sZW47Ci0KLSAgICBhc3NlcnQoU1NMM19SVF9IRUFERVJfTEVOR1RIICsKLSAgICAgICAgICAgICAgIHNzbF9jaXBoZXJfZ2V0X3JlY29yZF9zcGxpdF9sZW4oc3NsLT5hZWFkX3dyaXRlX2N0eC0+Y2lwaGVyKSA9PQotICAgICAgICAgICBmcmFnX2xlbik7Ci0gIH0KLQotICBpZiAoIWRvX3NlYWxfcmVjb3JkKHNzbCwgb3V0LCBvdXRfbGVuLCBtYXhfb3V0LCB0eXBlLCBpbiwgaW5fbGVuKSkgewotICAgIHJldHVybiAwOwotICB9Ci0gICpvdXRfbGVuICs9IGZyYWdfbGVuOwotICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90b29sL0NNYWtlTGlzdHMudHh0IGIvc3JjL3Rvb2wvQ01ha2VMaXN0cy50eHQKaW5kZXggMmQ3MDZiYS4uNzRjMWFjOCAxMDA2NDQKLS0tIGEvc3JjL3Rvb2wvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL3Rvb2wvQ01ha2VMaXN0cy50eHQKQEAgLTcsNyArNyw2IEBACiAgIGNsaWVudC5jYwogICBjb25zdC5jYwogICBkaWdlc3QuY2MKLSAgZ2VucnNhLmNjCiAgIHBrY3MxMi5jYwogICByYW5kLmNjCiAgIHNlcnZlci5jYwpAQCAtMTksMTAgKzE4LDUgQEAKIGlmIChBUFBMRSBPUiBXSU4zMiBPUiBBTkRST0lEKQogICB0YXJnZXRfbGlua19saWJyYXJpZXMoYnNzbCBzc2wgY3J5cHRvKQogZWxzZSgpCi0gIGZpbmRfbGlicmFyeShGT1VORF9MSUJSVCBydCkKLSAgaWYgKEZPVU5EX0xJQlJUKQotICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhic3NsIHNzbCBjcnlwdG8gLWxydCkKLSAgZWxzZSgpCi0gICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGJzc2wgc3NsIGNyeXB0bykKLSAgZW5kaWYoKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoYnNzbCBzc2wgY3J5cHRvIC1scnQpCiBlbmRpZigpCmRpZmYgLS1naXQgYS9zcmMvdG9vbC9hcmdzLmNjIGIvc3JjL3Rvb2wvYXJncy5jYwppbmRleCA5ZWMxOGEzLi5hMTY0NDc2IDEwMDY0NAotLS0gYS9zcmMvdG9vbC9hcmdzLmNjCisrKyBiL3NyYy90b29sL2FyZ3MuY2MKQEAgLTE1LDkgKzE1LDcgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgImludGVybmFsLmgiCkBAIC03NywyOCArNzUsMyBAQAogICAgIGZwcmludGYoc3RkZXJyLCAiJXNcdCVzXG4iLCB0ZW1wbC0+bmFtZSwgdGVtcGwtPmRlc2NyaXB0aW9uKTsKICAgfQogfQotCi1ib29sIEdldFVuc2lnbmVkKHVuc2lnbmVkICpvdXQsIGNvbnN0IHN0ZDo6c3RyaW5nICZhcmdfbmFtZSwKLSAgICAgICAgICAgICAgICAgdW5zaWduZWQgZGVmYXVsdF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiAmYXJncykgewotICBjb25zdCBhdXRvICZpdCA9IGFyZ3MuZmluZChhcmdfbmFtZSk7Ci0gIGlmIChpdCA9PSBhcmdzLmVuZCgpKSB7Ci0gICAgKm91dCA9IGRlZmF1bHRfdmFsdWU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnN0cmluZyAmdmFsdWUgPSBpdC0+c2Vjb25kOwotICBpZiAodmFsdWUuZW1wdHkoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGNoYXIgKmVuZHB0cjsKLSAgdW5zaWduZWQgbG9uZyBpbnQgbnVtID0gc3RydG91bCh2YWx1ZS5jX3N0cigpLCAmZW5kcHRyLCAxMCk7Ci0gIGlmICgqZW5kcHRyIHx8Ci0gICAgICBudW0gPiBVSU5UX01BWCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpvdXQgPSBudW07Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2wvY2xpZW50LmNjIGIvc3JjL3Rvb2wvY2xpZW50LmNjCmluZGV4IGNkODM1M2IuLjFkZTBkZjIgMTAwNjQ0Ci0tLSBhL3NyYy90b29sL2NsaWVudC5jYworKysgYi9zcmMvdG9vbC9jbGllbnQuY2MKQEAgLTcwLDE2ICs3MCw2IEBACiAgICAgICJUaGUga2V5IHRvIHVzZSBmb3Igc2lnbmluZyBhIGNoYW5uZWwgSUQiLAogICAgIH0sCiAgICAgewotICAgICAiLWZhbHNlLXN0YXJ0Iiwga0Jvb2xlYW5Bcmd1bWVudCwKLSAgICAgIkVuYWJsZSBGYWxzZSBTdGFydCIsCi0gICAgfSwKLSAgICB7ICItc2Vzc2lvbi1pbiIsIGtPcHRpb25hbEFyZ3VtZW50LAotICAgICAgIkEgZmlsZSBjb250YWluaW5nIGEgc2Vzc2lvbiB0byByZXN1bWUuIiwKLSAgICB9LAotICAgIHsgIi1zZXNzaW9uLW91dCIsIGtPcHRpb25hbEFyZ3VtZW50LAotICAgICAgIkEgZmlsZSB0byB3cml0ZSB0aGUgbmVnb3RpYXRlZCBzZXNzaW9uIHRvLiIsCi0gICAgfSwKLSAgICB7CiAgICAgICIiLCBrT3B0aW9uYWxBcmd1bWVudCwgIiIsCiAgICAgfSwKIH07CkBAIC0yMjEsMTAgKzIxMSw3IEBACiAgICAgaWYgKCFwa2V5IHx8ICFTU0xfQ1RYX3NldDFfdGxzX2NoYW5uZWxfaWQoY3R4LmdldCgpLCBwa2V5LmdldCgpKSkgewogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgfQotCi0gIGlmIChhcmdzX21hcC5jb3VudCgiLWZhbHNlLXN0YXJ0IikgIT0gMCkgewotICAgIFNTTF9DVFhfc2V0X21vZGUoY3R4LmdldCgpLCBTU0xfTU9ERV9FTkFCTEVfRkFMU0VfU1RBUlQpOworICAgIGN0eC0+dGxzZXh0X2NoYW5uZWxfaWRfZW5hYmxlZF9uZXcgPSAxOwogICB9CiAKICAgaW50IHNvY2sgPSAtMTsKQEAgLTIzOSwyMyArMjI2LDYgQEAKICAgICBTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoc3NsLmdldCgpLCBhcmdzX21hcFsiLXNlcnZlci1uYW1lIl0uY19zdHIoKSk7CiAgIH0KIAotICBpZiAoYXJnc19tYXAuY291bnQoIi1zZXNzaW9uLWluIikgIT0gMCkgewotICAgIFNjb3BlZEJJTyBpbihCSU9fbmV3X2ZpbGUoYXJnc19tYXBbIi1zZXNzaW9uLWluIl0uY19zdHIoKSwgInJiIikpOwotICAgIGlmICghaW4pIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgcmVhZGluZyBzZXNzaW9uXG4iKTsKLSAgICAgIEVSUl9wcmludF9lcnJvcnNfY2IoUHJpbnRFcnJvckNhbGxiYWNrLCBzdGRlcnIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBTY29wZWRTU0xfU0VTU0lPTiBzZXNzaW9uKFBFTV9yZWFkX2Jpb19TU0xfU0VTU0lPTihpbi5nZXQoKSwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBudWxscHRyKSk7Ci0gICAgaWYgKCFzZXNzaW9uKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHJlYWRpbmcgc2Vzc2lvblxuIik7Ci0gICAgICBFUlJfcHJpbnRfZXJyb3JzX2NiKFByaW50RXJyb3JDYWxsYmFjaywgc3RkZXJyKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgU1NMX3NldF9zZXNzaW9uKHNzbC5nZXQoKSwgc2Vzc2lvbi5nZXQoKSk7Ci0gIH0KLQogICBTU0xfc2V0X2Jpbyhzc2wuZ2V0KCksIGJpby5nZXQoKSwgYmlvLmdldCgpKTsKICAgYmlvLnJlbGVhc2UoKTsKIApAQCAtMjcwLDE2ICsyNDAsNiBAQAogICBmcHJpbnRmKHN0ZGVyciwgIkNvbm5lY3RlZC5cbiIpOwogICBQcmludENvbm5lY3Rpb25JbmZvKHNzbC5nZXQoKSk7CiAKLSAgaWYgKGFyZ3NfbWFwLmNvdW50KCItc2Vzc2lvbi1vdXQiKSAhPSAwKSB7Ci0gICAgU2NvcGVkQklPIG91dChCSU9fbmV3X2ZpbGUoYXJnc19tYXBbIi1zZXNzaW9uLW91dCJdLmNfc3RyKCksICJ3YiIpKTsKLSAgICBpZiAoIW91dCB8fAotICAgICAgICAhUEVNX3dyaXRlX2Jpb19TU0xfU0VTU0lPTihvdXQuZ2V0KCksIFNTTF9nZXQwX3Nlc3Npb24oc3NsLmdldCgpKSkpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd2hpbGUgc2F2aW5nIHNlc3Npb246XG4iKTsKLSAgICAgIEVSUl9wcmludF9lcnJvcnNfY2IoUHJpbnRFcnJvckNhbGxiYWNrLCBzdGRlcnIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCiAgIGJvb2wgb2sgPSBUcmFuc2ZlckRhdGEoc3NsLmdldCgpLCBzb2NrKTsKIAogICByZXR1cm4gb2s7CmRpZmYgLS1naXQgYS9zcmMvdG9vbC9jb25zdC5jYyBiL3NyYy90b29sL2NvbnN0LmNjCmluZGV4IDdiNzAwMWUuLjUyMjI2NjcgMTAwNjQ0Ci0tLSBhL3NyYy90b29sL2NvbnN0LmNjCisrKyBiL3NyYy90b29sL2NvbnN0LmNjCkBAIC0xNSwxMCArMTUsOSBAQAogI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCi0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKK2V4dGVybiAiQyIgewogCi0KLWNvbnN0IHVpbnQ4X3Qga0RFUlJTQVByaXZhdGUyMDQ4W10gPSB7Cit1aW50OF90IGtERVJSU0FQcml2YXRlMjA0OFtdID0gewogICAgIDB4MzAsIDB4ODIsIDB4MDQsIDB4YTMsIDB4MDIsIDB4MDEsIDB4MDAsIDB4MDIsIDB4ODIsIDB4MDEsIDB4MDEsIDB4MDAsCiAgICAgMHhkMCwgMHgwMiwgMHhkZSwgMHg1ZCwgMHgxOSwgMHgzMywgMHg0OCwgMHgxNSwgMHhjNywgMHg4NiwgMHhkZSwgMHhhMywKICAgICAweGVjLCAweDYzLCAweDg5LCAweDE0LCAweDYzLCAweDk5LCAweDMwLCAweDFmLCAweDVkLCAweDI1LCAweGIyLCAweGZhLApAQCAtMTIxLDkgKzEyMCw5IEBACiAgICAgMHg3NywgMHhlNiwgMHhkMywKIH07CiAKLWNvbnN0IHNpemVfdCBrREVSUlNBUHJpdmF0ZTIwNDhMZW4gPSBzaXplb2Yoa0RFUlJTQVByaXZhdGUyMDQ4KTsKK3NpemVfdCBrREVSUlNBUHJpdmF0ZTIwNDhMZW4gPSBzaXplb2Yoa0RFUlJTQVByaXZhdGUyMDQ4KTsKIAotY29uc3QgdWludDhfdCBrREVSUlNBUHJpdmF0ZTQwOTZbXSA9IHsKK3VpbnQ4X3Qga0RFUlJTQVByaXZhdGU0MDk2W10gPSB7CiAgICAgMHgzMCwgMHg4MiwgMHgwOSwgMHgyOCwgMHgwMiwgMHgwMSwgMHgwMCwgMHgwMiwgMHg4MiwgMHgwMiwgMHgwMSwgMHgwMCwKICAgICAweGMzLCAweDgyLCAweDAxLCAweGRhLCAweDAzLCAweGUxLCAweDBkLCAweDc4LCAweGY0LCAweDg2LCAweGYxLCAweDI4LAogICAgIDB4ZjAsIDB4NGMsIDB4MzQsIDB4YTYsIDB4NzMsIDB4MGMsIDB4ZmIsIDB4MjIsIDB4ZmEsIDB4MzUsIDB4YzksIDB4M2EsCkBAIC0zMjIsMTEzICszMjEsNiBAQAogICAgIDB4NTksIDB4OGUsIDB4ZDcsIDB4NDUsIDB4ODcsIDB4ODYsIDB4MDUsIDB4OWQsCiB9OwogCi1jb25zdCBzaXplX3Qga0RFUlJTQVByaXZhdGU0MDk2TGVuID0gc2l6ZW9mKGtERVJSU0FQcml2YXRlNDA5Nik7CitzaXplX3Qga0RFUlJTQVByaXZhdGU0MDk2TGVuID0gc2l6ZW9mKGtERVJSU0FQcml2YXRlNDA5Nik7CiAKLWNvbnN0IHVpbnQ4X3Qga0RFUlJTQVByaXZhdGUzUHJpbWUyMDQ4W10gPSB7Ci0gICAgMHgzMCwgMHg4MiwgMHgwNCwgMHhkNywgMHgwMiwgMHgwMSwgMHgwMSwgMHgwMiwgMHg4MiwgMHgwMSwgMHgwMCwgMHg2MiwKLSAgICAweDkxLCAweGU5LCAweGVhLCAweGIzLCAweDVkLCAweDZjLCAweDI5LCAweGFlLCAweDIxLCAweDgzLCAweGJiLCAweGI1LAotICAgIDB4ODIsIDB4YjEsIDB4OWUsIDB4ZWEsIDB4ZTAsIDB4NjQsIDB4NWIsIDB4MWUsIDB4MmYsIDB4NWUsIDB4MmMsIDB4MGEsCi0gICAgMHg4MCwgMHgzZCwgMHgyOSwgMHhkNCwgMHhmYSwgMHg5YSwgMHhlNywgMHg0NCwgMHhlNiwgMHgyMSwgMHhiZCwgMHg5OCwKLSAgICAweGMwLCAweDNkLCAweGUwLCAweDUzLCAweDU5LCAweGFlLCAweGQzLCAweDNlLCAweGZlLCAweGM0LCAweGMyLCAweGM0LAotICAgIDB4NWEsIDB4NWEsIDB4ODksIDB4MDcsIDB4ZjQsIDB4NGYsIDB4ZGMsIDB4YjAsIDB4NmEsIDB4ZDQsIDB4M2UsIDB4OTksCi0gICAgMHg3ZCwgMHg3YSwgMHg5NywgMHgyNiwgMHg0ZSwgMHhlMSwgMHg5MywgMHhjYSwgMHg2ZSwgMHhlZCwgMHgwNywgMHhmYywKLSAgICAweGI0LCAweGZhLCAweDk1LCAweDFlLCAweDczLCAweDdiLCAweDg2LCAweDA4LCAweDZhLCAweGI5LCAweGQ0LCAweDI5LAotICAgIDB4YjAsIDB4N2UsIDB4NTksIDB4YjcsIDB4OWQsIDB4N2IsIDB4ZWIsIDB4NjcsIDB4NmUsIDB4ZjAsIDB4YmIsIDB4NWUsCi0gICAgMHhjZiwgMHhiOSwgMHhjZCwgMHg1OCwgMHg5MywgMHhmMCwgMHhlNywgMHg4OCwgMHgxNywgMHg2YywgMHgwZCwgMHg3NiwKLSAgICAweDFlLCAweGI5LCAweDI3LCAweDlhLCAweDRkLCAweDAyLCAweDE2LCAweGI2LCAweDQ5LCAweDZkLCAweGE3LCAweDgzLAotICAgIDB4MjMsIDB4NGQsIDB4MDIsIDB4NDgsIDB4MGMsIDB4MGMsIDB4MWYsIDB4MGUsIDB4ODUsIDB4MjEsIDB4ZTMsIDB4MDYsCi0gICAgMHg3NiwgMHgwYSwgMHg3MywgMHhlNiwgMHhjMSwgMHgyMSwgMHhmYSwgMHgzMCwgMHgxOCwgMHg3OCwgMHgyOSwgMHg1YywKLSAgICAweDMxLCAweGQwLCAweDI5LCAweGFlLCAweDZmLCAweDdkLCAweDg3LCAweGQ4LCAweDJmLCAweDE2LCAweGZhLCAweGJjLAotICAgIDB4NjcsIDB4OGEsIDB4OTQsIDB4NzEsIDB4NTksIDB4OWIsIDB4ZWMsIDB4MjIsIDB4NDAsIDB4NTUsIDB4OWYsIDB4YzIsCi0gICAgMHg5NCwgMHhiNSwgMHhiZCwgMHg3OCwgMHgwMSwgMHhjOSwgMHhlZiwgMHgxOCwgMHhjOCwgMHg2ZCwgMHgwZCwgMHhkYywKLSAgICAweDUzLCAweDQyLCAweGIyLCAweDVjLCAweGFiLCAweDY1LCAweDA1LCAweGJkLCAweDM1LCAweDA4LCAweDg1LCAweDFiLAotICAgIDB4ZjgsIDB4ZTksIDB4NDcsIDB4YmMsIDB4ZmUsIDB4YzUsIDB4YWUsIDB4NDcsIDB4MjksIDB4NjMsIDB4NDQsIDB4OGUsCi0gICAgMHg0ZCwgMHhiNywgMHg0NywgMHhhYiwgMHgwZCwgMHhkOCwgMHg3NiwgMHg2OCwgMHg0ZiwgMHhjNywgMHgwNywgMHgwMiwKLSAgICAweGU0LCAweDg2LCAweGIwLCAweGNmLCAweGQ4LCAweDE5LCAweGFkLCAweGY0LCAweDg1LCAweDc2LCAweDhiLCAweDNiLAotICAgIDB4NGUsIDB4NDAsIDB4OGQsIDB4MjksIDB4N2EsIDB4OGEsIDB4MDcsIDB4MzYsIDB4ZjMsIDB4NzgsIDB4YWUsIDB4MTcsCi0gICAgMHhhNiwgMHg4ZiwgMHg1MywgMHg1OCwgMHg2NSwgMHg0YywgMHg4NiwgMHg5ZSwgMHhkNywgMHg4YiwgMHhlYywgMHgzOCwKLSAgICAweDRmLCAweDk5LCAweGM3LCAweDAyLCAweDAxLCAweDAzLCAweDAyLCAweDgyLCAweDAxLCAweDAwLCAweDQxLCAweGI2LAotICAgIDB4OWIsIDB4ZjEsIDB4Y2MsIDB4ZTgsIDB4ZjIsIDB4YzYsIDB4NzQsIDB4MTYsIDB4NTcsIDB4ZDIsIDB4NzksIDB4MDEsCi0gICAgMHhjYiwgMHhiZiwgMHg0NywgMHg0MCwgMHg0MiwgMHhlNywgMHg2OSwgMHg3NCwgMHhlOSwgMHg3MiwgMHhiMSwgMHhhYSwKLSAgICAweGQzLCAweDcxLCAweDM4LCAweGE3LCAweDExLCAweGVmLCAweDgzLCAweDQ0LCAweDE2LCAweDdlLCAweDY1LCAweGQ1LAotICAgIDB4N2UsIDB4OTUsIDB4OGMsIDB4ZTYsIDB4NzQsIDB4OGMsIDB4ZDQsIDB4YTksIDB4ZDgsIDB4ODEsIDB4ZDgsIDB4M2MsCi0gICAgMHgzYywgMHg1YiwgMHg1YSwgMHhhMiwgMHhkZiwgMHhlOCwgMHg3NSwgMHg5YywgMHg4ZCwgMHg3ZiwgMHgxMCwgMHhmZSwKLSAgICAweDUxLCAweGJhLCAweDE5LCAweDg5LCAweGViLCAweGI3LCAweGRjLCAweDQ5LCAweGYzLCAweDVhLCAweGE4LCAweDc4LAotICAgIDB4YTcsIDB4MGUsIDB4MTQsIDB4NGMsIDB4ZmQsIDB4MDQsIDB4MDUsIDB4OWMsIDB4N2IsIDB4ZTIsIDB4YzUsIDB4YTMsCi0gICAgMHgwNCwgMHhlZSwgMHhkOSwgMHg0YywgMHhmZCwgMHg3ZCwgMHg0NywgMHhiMCwgMHgwZCwgMHg5YiwgMHgzZCwgMHg3MCwKLSAgICAweDkxLCAweDgxLCAweDJjLCAweGFiLCAweDJiLCAweDg3LCAweGFkLCAweDExLCAweDY4LCAweDI0LCAweGZjLCAweDJiLAotICAgIDB4ZDQsIDB4ZWUsIDB4NWUsIDB4MjgsIDB4ZWIsIDB4NmQsIDB4YWIsIDB4ZGUsIDB4MGYsIDB4NzcsIDB4MTUsIDB4NTgsCi0gICAgMHg3NiwgMHgzOSwgMHhjOSwgMHg1OSwgMHgzYSwgMHg3ZiwgMHgxOSwgMHg5ZCwgMHhjNiwgMHg3ZSwgMHg4NiwgMHhlNCwKLSAgICAweGQ1LCAweDM4LCAweDcwLCAweDllLCAweGFlLCAweGI5LCAweGZiLCAweDMzLCAweDMzLCAweGQxLCAweDBjLCAweDJkLAotICAgIDB4YWIsIDB4MDEsIDB4MjAsIDB4ZTEsIDB4OGIsIDB4MjksIDB4OTksIDB4ZDMsIDB4ZWIsIDB4ODcsIDB4MDUsIDB4NzIsCi0gICAgMHhhYSwgMHg0MywgMHg1OCwgMHg2NCwgMHg4ZSwgMHg5ZSwgMHgzMSwgMHhkYiwgMHg0NSwgMHg5YiwgMHgyYiwgMHhhYywKLSAgICAweDU4LCAweDgwLCAweDVkLCAweDMzLCAweGEyLCAweDQzLCAweDA1LCAweDk2LCAweGNjLCAweGNhLCAweDJkLCAweDA0LAotICAgIDB4NWYsIDB4ZDYsIDB4YjcsIDB4M2QsIDB4OGIsIDB4OGYsIDB4MmQsIDB4YTMsIDB4YTUsIDB4ZjgsIDB4NzMsIDB4ZjUsCi0gICAgMHhkNywgMHhjMCwgMHgxOSwgMHhmZiwgMHgxMCwgMHhlNiwgMHhlZSwgMHgzYSwgMHgyNiwgMHgyZiwgMHhlMSwgMHg2NCwKLSAgICAweDNkLCAweDExLCAweGNkLCAweDJkLCAweGU0LCAweDBhLCAweDg0LCAweDI3LCAweGUzLCAweGNiLCAweDE2LCAweDYyLAotICAgIDB4MTksIDB4ZTcsIDB4ZTMsIDB4MGQsIDB4MTMsIDB4ZTgsIDB4MDksIDB4NWEsIDB4NTMsIDB4ZDAsIDB4MjAsIDB4NTYsCi0gICAgMHgxNSwgMHhmNSwgMHhiMywgMHg2NywgMHhhYywgMHhhMSwgMHhiNSwgMHg5NCwgMHg2YiwgMHhhYiwgMHhkYywgMHg3MSwKLSAgICAweGM3LCAweGJmLCAweDBhLCAweGRlLCAweDc2LCAweGY1LCAweDAzLCAweGEwLCAweDMwLCAweGQ4LCAweDI3LCAweDlkLAotICAgIDB4MDAsIDB4MmIsIDB4MDIsIDB4NTcsIDB4MDAsIDB4ZjEsIDB4NGYsIDB4YzIsIDB4ODYsIDB4MTMsIDB4MDYsIDB4MTcsCi0gICAgMHhmNywgMHg2OSwgMHg3ZSwgMHgzNywgMHhkZiwgMHg2NywgMHhjNSwgMHgzMiwgMHhhMCwgMHg3NCwgMHgxYywgMHgzMiwKLSAgICAweDY5LCAweDBmLCAweDlmLCAweDA4LCAweDg4LCAweDI0LCAweGIxLCAweDUxLCAweGJjLCAweGJjLCAweDkyLCAweGJhLAotICAgIDB4NzMsIDB4MWYsIDB4OWMsIDB4NzUsIDB4YzIsIDB4MTQsIDB4NmQsIDB4NGYsIDB4YzQsIDB4NWEsIDB4Y2YsIDB4ZGEsCi0gICAgMHg0NCwgMHgzNSwgMHgwMCwgMHg2YiwgMHg0MiwgMHgzYiwgMHg5ZiwgMHgxNCwgMHhmMSwgMHgwNSwgMHhiMywgMHg1MSwKLSAgICAweDIyLCAweGI2LCAweGJlLCAweDljLCAweGUwLCAweGMxLCAweDVjLCAweDQ4LCAweDYxLCAweGRmLCAweDRlLCAweDRjLAotICAgIDB4NzIsIDB4YjgsIDB4MDUsIDB4MzUsIDB4N2MsIDB4YWMsIDB4ZjEsIDB4YmIsIDB4YTAsIDB4M2IsIDB4MmEsIDB4ZWEsCi0gICAgMHhmNywgMHg4NiwgMHhlOSwgMHhkMiwgMHhmZiwgMHgxZSwgMHgxZCwgMHgwMiwgMHg1NiwgMHgwMCwgMHhjYSwgMHhiMSwKLSAgICAweDM5LCAweGY2LCAweGEyLCAweGM2LCAweDNiLCAweDY1LCAweDQ1LCAweDJmLCAweDM5LCAweDAwLCAweGNkLCAweDZlLAotICAgIDB4ZDYsIDB4NTUsIDB4ZjcsIDB4NzEsIDB4MzcsIDB4ODksIDB4YzIsIDB4ZTcsIDB4N2EsIDB4YzAsIDB4MWEsIDB4YTYsCi0gICAgMHgyZiwgMHhlYSwgMHgxNywgMHg3YywgMHhhYSwgMHgyYSwgMHg5MSwgMHg4ZiwgMHhkNCwgMHhjNywgMHg1MCwgMHg4YiwKLSAgICAweGFiLCAweDhlLCAweDk5LCAweDNiLCAweDMzLCAweDkxLCAweGJjLCAweDAyLCAweDEwLCAweDU4LCAweDRiLCAweDU4LAotICAgIDB4NDAsIDB4OWIsIDB4YzQsIDB4OGYsIDB4NDgsIDB4MmIsIDB4YTcsIDB4NDQsIDB4ZmQsIDB4MDcsIDB4MDQsIDB4ZjAsCi0gICAgMHg5OCwgMHg2NywgMHg1NiwgMHhlYSwgMHgyNSwgMHg5MiwgMHg4YiwgMHgyZSwgMHg0YiwgMHg0YSwgMHhhMSwgMHhkMywKLSAgICAweGMyLCAweGE0LCAweGI0LCAweDliLCAweDU5LCAweDcwLCAweDMyLCAweGE2LCAweGQ4LCAweDhiLCAweGQ5LCAweDAyLAotICAgIDB4NTcsIDB4MDAsIDB4YTAsIDB4ZGYsIDB4ZDcsIDB4MDQsIDB4MGMsIDB4YWUsIDB4YmEsIDB4YTQsIDB4ZjAsIDB4ZmUsCi0gICAgMHhjZiwgMHhlYSwgMHg0NSwgMHgyZSwgMHgyMSwgMHhjMCwgMHg0ZCwgMHg2OCwgMHgyMSwgMHg5YiwgMHg1ZiwgMHhiZiwKLSAgICAweDViLCAweDA1LCAweDZkLCAweGNiLCAweDhiLCAweGQzLCAweDI4LCAweDYxLCAweGQxLCAweGEyLCAweDE1LCAweDEyLAotICAgIDB4ZjksIDB4MmMsIDB4MGQsIDB4OWUsIDB4MzUsIDB4MmQsIDB4OTEsIDB4ZGYsIDB4ZTYsIDB4ZDgsIDB4MjMsIDB4NTUsCi0gICAgMHg5YywgMHhkNiwgMHhkMiwgMHg2YSwgMHgwZCwgMHhmNiwgMHgwMywgMHhjYywgMHhlMCwgMHhjMSwgMHhjZiwgMHgyOSwKLSAgICAweGJkLCAweGViLCAweDJiLCAweDkyLCAweGRhLCAweGViLCAweGVhLCAweDM0LCAweDMyLCAweGY3LCAweDI1LCAweDU4LAotICAgIDB4Y2UsIDB4NTMsIDB4MWQsIDB4ZjYsIDB4N2QsIDB4MTUsIDB4N2MsIDB4YzcsIDB4NDcsIDB4NGYsIDB4YWYsIDB4NDYsCi0gICAgMHg4YywgMHhhYSwgMHgxNCwgMHgxMywgMHgwMiwgMHg1NiwgMHgwMCwgMHg4NywgMHgyMCwgMHhkMSwgMHg0ZiwgMHgxNywKLSAgICAweDJlLCAweGQyLCAweDQzLCAweDgzLCAweDc0LCAweGQwLCAweGFiLCAweDMzLCAweDlmLCAweDM5LCAweDhlLCAweGE0LAotICAgIDB4ZjYsIDB4MjUsIDB4MDYsIDB4ODEsIDB4ZWYsIDB4YTcsIDB4MmEsIDB4YmMsIDB4NmUsIDB4Y2EsIDB4OWMsIDB4MGYsCi0gICAgMHhhOCwgMHg3MSwgMHg3MSwgMHhiNiwgMHg1ZiwgMHhlMywgMHgyZiwgMHg4YiwgMHgwNywgMHhjNywgMHhiNCwgMHg2NiwKLSAgICAweDI3LCAweDc3LCAweGI2LCAweDdkLCAweDU2LCAweGI1LCAweDkwLCAweDMyLCAweDNhLCAweGQ1LCAweGJkLCAweDJkLAotICAgIDB4YjQsIDB4ZGEsIDB4YzcsIDB4YzQsIDB4ZDgsIDB4YTgsIDB4YWYsIDB4NTgsIDB4YTAsIDB4NjUsIDB4OWEsIDB4MzksCi0gICAgMHhmMSwgMHg2ZSwgMHg2MSwgMHhiMiwgMHgxZSwgMHhkYywgMHhkYywgMHg2YiwgMHhlMiwgMHg4MSwgMHhjMywgMHgyMywKLSAgICAweDEyLCAweDNiLCAweGEwLCAweDIxLCAweGM0LCAweDkwLCAweDVkLCAweDNiLCAweDAyLCAweDU3LCAweDAwLCAweGU2LAotICAgIDB4OGEsIDB4YWEsIDB4YjgsIDB4NmQsIDB4MmMsIDB4ODEsIDB4NDMsIDB4YjUsIDB4ZDYsIDB4YTAsIDB4MmIsIDB4NDIsCi0gICAgMHg0OSwgMHhhOSwgMHgwYSwgMHg1MSwgMHhmYSwgMHgxOCwgMHhjOCwgMHgzMiwgMHhlYSwgMHg1NCwgMHgxOCwgMHhmMywKLSAgICAweDYwLCAweGMyLCAweGI1LCAweDRhLCAweDQzLCAweDA1LCAweDkzLCAweDljLCAweDAxLCAweGQ5LCAweDI4LCAweGVkLAotICAgIDB4NzMsIDB4ZmEsIDB4ODIsIDB4YmMsIDB4MTIsIDB4NjQsIDB4Y2IsIDB4YzQsIDB4MjQsIDB4YTksIDB4M2UsIDB4YWUsCi0gICAgMHg3YywgMHg0YiwgMHg4ZiwgMHg5NCwgMHg1NywgMHg3YiwgMHgxNCwgMHgxMCwgMHg0MSwgMHhkYywgMHg2MiwgMHgxMiwKLSAgICAweDhjLCAweGIyLCAweDRhLCAweDdjLCAweGY2LCAweDUzLCAweGQ0LCAweGM2LCAweGU0LCAweGRhLCAweGQxLCAweGEyLAotICAgIDB4MDAsIDB4MGUsIDB4M2QsIDB4MzAsIDB4ZjcsIDB4MDUsIDB4NGYsIDB4MWQsIDB4ODIsIDB4YmMsIDB4NTIsIDB4ZDksCi0gICAgMHhiMSwgMHgzMCwgMHg4MiwgMHgwMSwgMHgwYSwgMHgzMCwgMHg4MiwgMHgwMSwgMHgwNiwgMHgwMiwgMHg1NiwgMHgwMCwKLSAgICAweDg0LCAweDEyLCAweDRmLCAweGY3LCAweDNiLCAweDY1LCAweDUzLCAweDM0LCAweDZjLCAweDZjLCAweDRkLCAweDc3LAotICAgIDB4ZGYsIDB4ZmQsIDB4MWYsIDB4YjYsIDB4MTYsIDB4ZTIsIDB4MjUsIDB4MTUsIDB4Y2EsIDB4YzksIDB4YzEsIDB4NDEsCi0gICAgMHg5YSwgMHg1MCwgMHhkYSwgMHhlYiwgMHg4OCwgMHg0ZiwgMHgzZCwgMHhiMywgMHgwMSwgMHgwMCwgMHg0NCwgMHhjNCwKLSAgICAweGFjLCAweGU3LCAweDE0LCAweDYyLCAweGE2LCAweDU2LCAweGRlLCAweGM1LCAweGI3LCAweGMzLCAweDFkLCAweDA3LAotICAgIDB4YmQsIDB4N2QsIDB4NjQsIDB4YzUsIDB4N2UsIDB4NDUsIDB4MjUsIDB4NTYsIDB4ZWQsIDB4N2EsIDB4ZDIsIDB4MTQsCi0gICAgMHhkYiwgMHg0ZSwgMHgyNywgMHhkNCwgMHgxZiwgMHhmOCwgMHg5NCwgMHhhNywgMHhlZiwgMHgwNywgMHhjZSwgMHhkYiwKLSAgICAweDI0LCAweGI3LCAweGRkLCAweDcxLCAweDVjLCAweDYzLCAweGM5LCAweDMzLCAweGZlLCAweGRlLCAweDQwLCAweDUyLAotICAgIDB4ZWIsIDB4MDIsIDB4NTUsIDB4NTgsIDB4MGMsIDB4MzUsIDB4NGYsIDB4N2MsIDB4ZWUsIDB4MzcsIDB4NzgsIDB4NDgsCi0gICAgMHg0OCwgMHgzMywgMHhhNSwgMHgzZiwgMHhmZSwgMHgxNSwgMHgyNCwgMHgwZiwgMHg0MSwgMHg2ZSwgMHgwZSwgMHg4NywKLSAgICAweDMxLCAweDJiLCAweDgxLCAweDExLCAweDhiLCAweDNjLCAweDlkLCAweDA1LCAweDhhLCAweDI5LCAweDIyLCAweDAwLAotICAgIDB4YWEsIDB4ZDgsIDB4ODMsIDB4MWQsIDB4ZWYsIDB4NjIsIDB4ZWMsIDB4NmUsIDB4ZTQsIDB4OTQsIDB4ODMsIDB4Y2YsCi0gICAgMHhkNywgMHg2OCwgMHhhZiwgMHhkMywgMHhhOCwgMHhlZCwgMHhkOCwgMHhmZSwgMHhkOCwgMHhjMywgMHg4ZiwgMHg0OCwKLSAgICAweGZjLCAweDhjLCAweDBkLCAweGU3LCAweDg5LCAweDZmLCAweGUyLCAweGJmLCAweGZiLCAweDBkLCAweGM1LCAweDRhLAotICAgIDB4MDUsIDB4MzQsIDB4OTIsIDB4MTgsIDB4N2EsIDB4OTMsIDB4YTAsIDB4ZTgsIDB4NDIsIDB4ODYsIDB4MjIsIDB4YTksCi0gICAgMHhlOSwgMHg4MCwgMHgzNywgMHg0NywgMHgwMiwgMHg1NSwgMHg2MCwgMHg3NiwgMHhhYiwgMHhkZSwgMHgyYiwgMHhmNSwKLSAgICAweGEyLCAweDJjLCAweGFhLCAweDBjLCAweDk5LCAweDgxLCAweGVlLCAweDcyLCAweDJjLCAweDdkLCAweDIyLCAweDU5LAotICAgIDB4MmEsIDB4MzUsIDB4ZWEsIDB4NTAsIDB4NGUsIDB4NDcsIDB4NmIsIDB4OTIsIDB4MmQsIDB4MzAsIDB4YTEsIDB4MDEsCi0gICAgMHhhNSwgMHg5ZSwgMHgyNiwgMHg2ZSwgMHgyNywgMHhjYSwgMHhmNSwgMHhmMiwgMHg4NywgMHg1ZCwgMHgzMSwgMHhhZiwKLSAgICAweGU5LCAweDMyLCAweGNkLCAweDEwLCAweGZkLCAweDRkLCAweGRiLCAweGY5LCAweDg2LCAweDA1LCAweDEyLCAweDFiLAotICAgIDB4MDEsIDB4ODQsIDB4NTUsIDB4OTcsIDB4NWYsIDB4ZTIsIDB4NzgsIDB4MjcsIDB4ZDksIDB4ZTQsIDB4MjYsIDB4N2QsCi0gICAgMHhhYiwgMHgwZSwgMHhlMCwgMHgxYiwgMHg2ZiwgMHhjYiwgMHg0YiwgMHgxNCwgMHhkZCwgMHhkYywgMHhkYywgMHg4YiwKLSAgICAweGU4LCAweDlmLCAweGQwLCAweDYyLCAweDk2LCAweGNhLCAweGNmLAotfTsKLQotY29uc3Qgc2l6ZV90IGtERVJSU0FQcml2YXRlM1ByaW1lMjA0OExlbiA9IHNpemVvZihrREVSUlNBUHJpdmF0ZTNQcmltZTIwNDgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2wvZ2VucnNhLmNjIGIvc3JjL3Rvb2wvZ2VucnNhLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjM5NDAxLi4wMDAwMDAwCi0tLSBhL3NyYy90b29sL2dlbnJzYS5jYworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNSwgR29vZ2xlIEluYy4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KLQotI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgotI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgotCi0jaW5jbHVkZSAiLi4vY3J5cHRvL3Rlc3Qvc2NvcGVkX3R5cGVzLmgiCi0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFyZ3VtZW50IGtBcmd1bWVudHNbXSA9IHsKLSAgICB7Ci0gICAgICItbnByaW1lcyIsIGtPcHRpb25hbEFyZ3VtZW50LAotICAgICAiVGhlIG51bWJlciBvZiBwcmltZXMgdG8gZ2VuZXJhdGUgKGRlZmF1bHQ6IDIpIiwKLSAgICB9LAotICAgIHsKLSAgICAgIi1iaXRzIiwga09wdGlvbmFsQXJndW1lbnQsCi0gICAgICJUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG1vZHVsdXMgKGRlZmF1bHQ6IDIwNDgpIiwKLSAgICB9LAotICAgIHsKLSAgICAgIiIsIGtPcHRpb25hbEFyZ3VtZW50LCAiIiwKLSAgICB9LAotfTsKLQotYm9vbCBHZW5lcmF0ZVJTQUtleShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmFyZ3MpIHsKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhcmdzX21hcDsKLQotICBpZiAoIVBhcnNlS2V5VmFsdWVBcmd1bWVudHMoJmFyZ3NfbWFwLCBhcmdzLCBrQXJndW1lbnRzKSkgewotICAgIFByaW50VXNhZ2Uoa0FyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdW5zaWduZWQgYml0cywgbnByaW1lcyA9IDA7Ci0gIGlmICghR2V0VW5zaWduZWQoJmJpdHMsICItYml0cyIsIDIwNDgsIGFyZ3NfbWFwKSB8fAotICAgICAgIUdldFVuc2lnbmVkKCZucHJpbWVzLCAiLW5wcmltZXMiLCAyLCBhcmdzX21hcCkpIHsKLSAgICBQcmludFVzYWdlKGtBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFNjb3BlZFJTQSByc2EoUlNBX25ldygpKTsKLSAgU2NvcGVkQklHTlVNIGUoQk5fbmV3KCkpOwotICBTY29wZWRCSU8gYmlvKEJJT19uZXdfZnAoc3Rkb3V0LCBCSU9fTk9DTE9TRSkpOwotCi0gIGlmICghQk5fc2V0X3dvcmQoZS5nZXQoKSwgUlNBX0Y0KSB8fAotICAgICAgIVJTQV9nZW5lcmF0ZV9tdWx0aV9wcmltZV9rZXkocnNhLmdldCgpLCBiaXRzLCBucHJpbWVzLCBlLmdldCgpLCBOVUxMKSB8fAotICAgICAgIVBFTV93cml0ZV9iaW9fUlNBUHJpdmF0ZUtleShiaW8uZ2V0KCksIHJzYS5nZXQoKSwgTlVMTCAvKiBjaXBoZXIgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyoga2V5ICovLCAwIC8qIGtleSBsZW4gKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogcGFzc3dvcmQgY2FsbGJhY2sgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogY2FsbGJhY2sgYXJnICovKSkgewotICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90b29sL2ludGVybmFsLmggYi9zcmMvdG9vbC9pbnRlcm5hbC5oCmluZGV4IDg0ZjhjNGQuLjI3N2QwOTkgMTAwNjQ0Ci0tLSBhL3NyYy90b29sL2ludGVybmFsLmgKKysrIGIvc3JjL3Rvb2wvaW50ZXJuYWwuaApAQCAtMTUsOCArMTUsNiBAQAogI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9UT09MX0lOVEVSTkFMX0gKICNkZWZpbmUgT1BFTlNTTF9IRUFERVJfVE9PTF9JTlRFUk5BTF9ICiAKLSNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KLQogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKQEAgLTUxLDE3ICs0OSw1IEBACiAKIHZvaWQgUHJpbnRVc2FnZShjb25zdCBzdHJ1Y3QgYXJndW1lbnQgKnRlbXBsYXRlcyk7CiAKLWJvb2wgR2V0VW5zaWduZWQodW5zaWduZWQgKm91dCwgY29uc3Qgc3RkOjpzdHJpbmcgJmFyZ19uYW1lLAotICAgICAgICAgICAgICAgICB1bnNpZ25lZCBkZWZhdWx0X3ZhbHVlLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ICZhcmdzKTsKLQotLy8gVGhlc2UgdmFsdWVzIGFyZSBERVIgZW5jb2RlZCwgUlNBIHByaXZhdGUga2V5cy4KLWV4dGVybiBjb25zdCB1aW50OF90IGtERVJSU0FQcml2YXRlMjA0OFtdOwotZXh0ZXJuIGNvbnN0IHNpemVfdCBrREVSUlNBUHJpdmF0ZTIwNDhMZW47Ci1leHRlcm4gY29uc3QgdWludDhfdCBrREVSUlNBUHJpdmF0ZTQwOTZbXTsKLWV4dGVybiBjb25zdCBzaXplX3Qga0RFUlJTQVByaXZhdGU0MDk2TGVuOwotZXh0ZXJuIGNvbnN0IHVpbnQ4X3Qga0RFUlJTQVByaXZhdGUzUHJpbWUyMDQ4W107Ci1leHRlcm4gY29uc3Qgc2l6ZV90IGtERVJSU0FQcml2YXRlM1ByaW1lMjA0OExlbjsKLQogCiAjZW5kaWYgLyogIU9QRU5TU0xfSEVBREVSX1RPT0xfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2wvc2VydmVyLmNjIGIvc3JjL3Rvb2wvc2VydmVyLmNjCmluZGV4IGFiYzcxY2YuLjE2NGQ2YTUgMTAwNjQ0Ci0tLSBhL3NyYy90b29sL3NlcnZlci5jYworKysgYi9zcmMvdG9vbC9zZXJ2ZXIuY2MKQEAgLTM1LDU0ICszNSwxMCBAQAogICAgICAgIlByaXZhdGUta2V5IGZpbGUgdG8gdXNlIChkZWZhdWx0IGlzIHNlcnZlci5wZW0pIiwKICAgICB9LAogICAgIHsKLSAgICAgICItb2NzcC1yZXNwb25zZSIsIGtPcHRpb25hbEFyZ3VtZW50LAotICAgICAgIk9DU1AgcmVzcG9uc2UgZmlsZSB0byBzZW5kIiwKLSAgICB9LAotICAgIHsKICAgICAgIiIsIGtPcHRpb25hbEFyZ3VtZW50LCAiIiwKICAgICB9LAogfTsKIAotc3RhdGljIGJvb2wgTG9hZE9DU1BSZXNwb25zZShTU0xfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSB7Ci0gIHZvaWQgKmRhdGEgPSBOVUxMOwotICBib29sIHJldCA9IGZhbHNlOwotICBzaXplX3QgYnl0ZXNfcmVhZDsKLSAgbG9uZyBsZW5ndGg7Ci0KLSAgRklMRSAqZiA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKTsKLQotICBpZiAoZiA9PSBOVUxMIHx8Ci0gICAgICBmc2VlayhmLCAwLCBTRUVLX0VORCkgIT0gMCkgewotICAgIGdvdG8gb3V0OwotICB9Ci0KLSAgbGVuZ3RoID0gZnRlbGwoZik7Ci0gIGlmIChsZW5ndGggPCAwKSB7Ci0gICAgZ290byBvdXQ7Ci0gIH0KLQotICBkYXRhID0gbWFsbG9jKGxlbmd0aCk7Ci0gIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICBnb3RvIG91dDsKLSAgfQotICByZXdpbmQoZik7Ci0KLSAgYnl0ZXNfcmVhZCA9IGZyZWFkKGRhdGEsIDEsIGxlbmd0aCwgZik7Ci0gIGlmIChmZXJyb3IoZikgIT0gMCB8fAotICAgICAgYnl0ZXNfcmVhZCAhPSAoc2l6ZV90KWxlbmd0aCB8fAotICAgICAgIVNTTF9DVFhfc2V0X29jc3BfcmVzcG9uc2UoY3R4LCAodWludDhfdCopZGF0YSwgYnl0ZXNfcmVhZCkpIHsKLSAgICBnb3RvIG91dDsKLSAgfQotCi0gIHJldCA9IHRydWU7Ci1vdXQ6Ci0gIGlmIChmICE9IE5VTEwpIHsKLSAgICAgIGZjbG9zZShmKTsKLSAgfQotICBmcmVlKGRhdGEpOwotICByZXR1cm4gcmV0OwotfQotCiBib29sIFNlcnZlcihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmFyZ3MpIHsKICAgaWYgKCFJbml0U29ja2V0TGlicmFyeSgpKSB7CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTE4LDEyICs3NCw2IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgaWYgKGFyZ3NfbWFwLmNvdW50KCItb2NzcC1yZXNwb25zZSIpICE9IDAgJiYKLSAgICAgICFMb2FkT0NTUFJlc3BvbnNlKGN0eCwgYXJnc19tYXBbIi1vY3NwLXJlc3BvbnNlIl0uY19zdHIoKSkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBsb2FkIE9DU1AgcmVzcG9uc2U6ICVzXG4iLCBhcmdzX21hcFsiLW9jc3AtcmVzcG9uc2UiXS5jX3N0cigpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQogICBpbnQgc29jayA9IC0xOwogICBpZiAoIUFjY2VwdCgmc29jaywgYXJnc19tYXBbIi1hY2NlcHQiXSkpIHsKICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9zcmMvdG9vbC9zcGVlZC5jYyBiL3NyYy90b29sL3NwZWVkLmNjCmluZGV4IDMwN2IwYjkuLmFiMTdjMmYgMTAwNjQ0Ci0tLSBhL3NyYy90b29sL3NwZWVkLmNjCisrKyBiL3NyYy90b29sL3NwZWVkLmNjCkBAIC0zNiw5ICszNiwxNiBAQAogI2VuZGlmCiAKICNpbmNsdWRlICIuLi9jcnlwdG8vdGVzdC9zY29wZWRfdHlwZXMuaCIKLSNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiAKK2V4dGVybiAiQyIgeworLy8gVGhlc2UgdmFsdWVzIGFyZSBERVIgZW5jb2RlZCwgUlNBIHByaXZhdGUga2V5cy4KK2V4dGVybiBjb25zdCB1aW50OF90IGtERVJSU0FQcml2YXRlMjA0OFtdOworZXh0ZXJuIHNpemVfdCBrREVSUlNBUHJpdmF0ZTIwNDhMZW47CitleHRlcm4gY29uc3QgdWludDhfdCBrREVSUlNBUHJpdmF0ZTQwOTZbXTsKK2V4dGVybiBzaXplX3Qga0RFUlJTQVByaXZhdGU0MDk2TGVuOworfQorCiAvLyBUaW1lUmVzdWx0cyByZXByZXNlbnRzIHRoZSByZXN1bHRzIG9mIGJlbmNobWFya2luZyBhIGZ1bmN0aW9uLgogc3RydWN0IFRpbWVSZXN1bHRzIHsKICAgLy8gbnVtX2NhbGxzIGlzIHRoZSBudW1iZXIgb2YgZnVuY3Rpb24gY2FsbHMgZG9uZSBpbiB0aGUgdGltZSBwZXJpb2QuCkBAIC00MDcsOSArNDE0LDkgQEAKICAgICBzZWxlY3RlZCA9IGFyZ3NbMF07CiAgIH0KIAotICBSU0EgKmtleSA9IFJTQV9wcml2YXRlX2tleV9mcm9tX2J5dGVzKGtERVJSU0FQcml2YXRlMjA0OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrREVSUlNBUHJpdmF0ZTIwNDhMZW4pOwotICBpZiAoa2V5ID09IE5VTEwpIHsKKyAgUlNBICprZXkgPSBOVUxMOworICBjb25zdCB1aW50OF90ICppbnAgPSBrREVSUlNBUHJpdmF0ZTIwNDg7CisgIGlmIChOVUxMID09IGQyaV9SU0FQcml2YXRlS2V5KCZrZXksICZpbnAsIGtERVJSU0FQcml2YXRlMjA0OExlbikpIHsKICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSBSU0Ega2V5LlxuIik7CiAgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOwogICAgIHJldHVybiBmYWxzZTsKQEAgLTQyMCwyMiArNDI3LDEwIEBACiAgIH0KIAogICBSU0FfZnJlZShrZXkpOwotICBrZXkgPSBSU0FfcHJpdmF0ZV9rZXlfZnJvbV9ieXRlcyhrREVSUlNBUHJpdmF0ZTNQcmltZTIwNDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtERVJSU0FQcml2YXRlM1ByaW1lMjA0OExlbik7Ci0gIGlmIChrZXkgPT0gTlVMTCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlIFJTQSBrZXkuXG4iKTsKLSAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9CisgIGtleSA9IE5VTEw7CiAKLSAgaWYgKCFTcGVlZFJTQSgiUlNBIDIwNDggKDMgcHJpbWUsIGU9MykiLCBrZXksIHNlbGVjdGVkKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFJTQV9mcmVlKGtleSk7Ci0gIGtleSA9IFJTQV9wcml2YXRlX2tleV9mcm9tX2J5dGVzKGtERVJSU0FQcml2YXRlNDA5NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RFUlJTQVByaXZhdGU0MDk2TGVuKTsKLSAgaWYgKGtleSA9PSBOVUxMKSB7CisgIGlucCA9IGtERVJSU0FQcml2YXRlNDA5NjsKKyAgaWYgKE5VTEwgPT0gZDJpX1JTQVByaXZhdGVLZXkoJmtleSwgJmlucCwga0RFUlJTQVByaXZhdGU0MDk2TGVuKSkgewogICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlIDQwOTYtYml0IFJTQSBrZXkuXG4iKTsKICAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CiAgICAgcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9zcmMvdG9vbC90b29sLmNjIGIvc3JjL3Rvb2wvdG9vbC5jYwppbmRleCBlNGQ1MjAxLi40YmQ3ZDFhIDEwMDY0NAotLS0gYS9zcmMvdG9vbC90b29sLmNjCisrKyBiL3NyYy90b29sL3Rvb2wuY2MKQEAgLTI3LDE3ICsyNywxNiBAQAogCiAKIGJvb2wgQ2xpZW50KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmYXJncyk7Ci1ib29sIERvUEtDUzEyKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmYXJncyk7Ci1ib29sIEdlbmVyYXRlUlNBS2V5KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmYXJncyk7Citib29sIFNlcnZlcihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmFyZ3MpOwogYm9vbCBNRDVTdW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZhcmdzKTsKLWJvb2wgUmFuZChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmFyZ3MpOwogYm9vbCBTSEExU3VtKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmYXJncyk7CiBib29sIFNIQTIyNFN1bShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmFyZ3MpOwogYm9vbCBTSEEyNTZTdW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZhcmdzKTsKIGJvb2wgU0hBMzg0U3VtKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmYXJncyk7CiBib29sIFNIQTUxMlN1bShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmFyZ3MpOwotYm9vbCBTZXJ2ZXIoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZhcmdzKTsKK2Jvb2wgRG9QS0NTMTIoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZhcmdzKTsKIGJvb2wgU3BlZWQoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZhcmdzKTsKK2Jvb2wgUmFuZChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmFyZ3MpOwogCiB0eXBlZGVmIGJvb2wgKCp0b29sX2Z1bmNfdCkoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZhcmdzKTsKIApAQCAtNDcsMjAgKzQ2LDE5IEBACiB9OwogCiBzdGF0aWMgY29uc3QgVG9vbCBrVG9vbHNbXSA9IHsKLSAgeyAiY2xpZW50IiwgQ2xpZW50IH0sCi0gIHsgImdlbnJzYSIsIEdlbmVyYXRlUlNBS2V5IH0sCi0gIHsgIm1kNXN1bSIsIE1ENVN1bSB9LAorICB7ICJzcGVlZCIsIFNwZWVkIH0sCiAgIHsgInBrY3MxMiIsIERvUEtDUzEyIH0sCi0gIHsgInJhbmQiLCBSYW5kIH0sCisgIHsgImNsaWVudCIsIENsaWVudCB9LAogICB7ICJzX2NsaWVudCIsIENsaWVudCB9LAotICB7ICJzX3NlcnZlciIsIFNlcnZlciB9LAogICB7ICJzZXJ2ZXIiLCBTZXJ2ZXIgfSwKKyAgeyAic19zZXJ2ZXIiLCBTZXJ2ZXIgfSwKKyAgeyAibWQ1c3VtIiwgTUQ1U3VtIH0sCiAgIHsgInNoYTFzdW0iLCBTSEExU3VtIH0sCiAgIHsgInNoYTIyNHN1bSIsIFNIQTIyNFN1bSB9LAogICB7ICJzaGEyNTZzdW0iLCBTSEEyNTZTdW0gfSwKICAgeyAic2hhMzg0c3VtIiwgU0hBMzg0U3VtIH0sCiAgIHsgInNoYTUxMnN1bSIsIFNIQTUxMlN1bSB9LAotICB7ICJzcGVlZCIsIFNwZWVkIH0sCisgIHsgInJhbmQiLCBSYW5kIH0sCiAgIHsgIiIsIG51bGxwdHIgfSwKIH07CiAKZGlmZiAtLWdpdCBhL3NyYy90b29sL3RyYW5zcG9ydF9jb21tb24uY2MgYi9zcmMvdG9vbC90cmFuc3BvcnRfY29tbW9uLmNjCmluZGV4IDk4ZjBmOTUuLjNmNWU2MzEgMTAwNjQ0Ci0tLSBhL3NyYy90b29sL3RyYW5zcG9ydF9jb21tb24uY2MKKysrIGIvc3JjL3Rvb2wvdHJhbnNwb3J0X2NvbW1vbi5jYwpAQCAtMTY5LDggKzE2OSw2IEBACiAgIGNvbnN0IFNTTF9DSVBIRVIgKmNpcGhlciA9IFNTTF9nZXRfY3VycmVudF9jaXBoZXIoc3NsKTsKIAogICBmcHJpbnRmKHN0ZGVyciwgIiAgVmVyc2lvbjogJXNcbiIsIFNTTF9nZXRfdmVyc2lvbihzc2wpKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIFJlc3VtZWQgc2Vzc2lvbjogJXNcbiIsCi0gICAgICAgICAgU1NMX3Nlc3Npb25fcmV1c2VkKHNzbCkgPyAieWVzIiA6ICJubyIpOwogICBmcHJpbnRmKHN0ZGVyciwgIiAgQ2lwaGVyOiAlc1xuIiwgU1NMX0NJUEhFUl9nZXRfbmFtZShjaXBoZXIpKTsKICAgZnByaW50ZihzdGRlcnIsICIgIFNlY3VyZSByZW5lZ290aWF0aW9uOiAlc1xuIiwKICAgICAgICAgICBTU0xfZ2V0X3NlY3VyZV9yZW5lZ290aWF0aW9uX3N1cHBvcnQoc3NsKSA/ICJ5ZXMiIDogIm5vIik7CmRpZmYgLS1naXQgYS9zcmMvdXRpbC9hbGxfdGVzdHMuZ28gYi9zcmMvdXRpbC9hbGxfdGVzdHMuZ28KaW5kZXggNTY2YzNmNy4uNDk5NTRkZiAxMDA2NDQKLS0tIGEvc3JjL3V0aWwvYWxsX3Rlc3RzLmdvCisrKyBiL3NyYy91dGlsL2FsbF90ZXN0cy5nbwpAQCAtNDEsNiArNDEsNjMgQEAKIAogdHlwZSB0ZXN0IFtdc3RyaW5nCiAKK3ZhciB0ZXN0cyA9IFtddGVzdHsKKwl7ImNyeXB0by9iYXNlNjQvYmFzZTY0X3Rlc3QifSwKKwl7ImNyeXB0by9iaW8vYmlvX3Rlc3QifSwKKwl7ImNyeXB0by9ibi9ibl90ZXN0In0sCisJeyJjcnlwdG8vYnl0ZXN0cmluZy9ieXRlc3RyaW5nX3Rlc3QifSwKKwl7ImNyeXB0by9jaXBoZXIvYWVhZF90ZXN0IiwgImFlcy0xMjgtZ2NtIiwgImNyeXB0by9jaXBoZXIvdGVzdC9hZXNfMTI4X2djbV90ZXN0cy50eHQifSwKKwl7ImNyeXB0by9jaXBoZXIvYWVhZF90ZXN0IiwgImFlcy0xMjgta2V5LXdyYXAiLCAiY3J5cHRvL2NpcGhlci90ZXN0L2Flc18xMjhfa2V5X3dyYXBfdGVzdHMudHh0In0sCisJeyJjcnlwdG8vY2lwaGVyL2FlYWRfdGVzdCIsICJhZXMtMjU2LWdjbSIsICJjcnlwdG8vY2lwaGVyL3Rlc3QvYWVzXzI1Nl9nY21fdGVzdHMudHh0In0sCisJeyJjcnlwdG8vY2lwaGVyL2FlYWRfdGVzdCIsICJhZXMtMjU2LWtleS13cmFwIiwgImNyeXB0by9jaXBoZXIvdGVzdC9hZXNfMjU2X2tleV93cmFwX3Rlc3RzLnR4dCJ9LAorCXsiY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QiLCAiY2hhY2hhMjAtcG9seTEzMDUiLCAiY3J5cHRvL2NpcGhlci90ZXN0L2NoYWNoYTIwX3BvbHkxMzA1X3Rlc3RzLnR4dCJ9LAorCXsiY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QiLCAicmM0LW1kNS10bHMiLCAiY3J5cHRvL2NpcGhlci90ZXN0L3JjNF9tZDVfdGxzX3Rlc3RzLnR4dCJ9LAorCXsiY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QiLCAicmM0LXNoYTEtdGxzIiwgImNyeXB0by9jaXBoZXIvdGVzdC9yYzRfc2hhMV90bHNfdGVzdHMudHh0In0sCisJeyJjcnlwdG8vY2lwaGVyL2FlYWRfdGVzdCIsICJhZXMtMTI4LWNiYy1zaGExLXRscyIsICJjcnlwdG8vY2lwaGVyL3Rlc3QvYWVzXzEyOF9jYmNfc2hhMV90bHNfdGVzdHMudHh0In0sCisJeyJjcnlwdG8vY2lwaGVyL2FlYWRfdGVzdCIsICJhZXMtMTI4LWNiYy1zaGExLXRscy1pbXBsaWNpdC1pdiIsICJjcnlwdG8vY2lwaGVyL3Rlc3QvYWVzXzEyOF9jYmNfc2hhMV90bHNfaW1wbGljaXRfaXZfdGVzdHMudHh0In0sCisJeyJjcnlwdG8vY2lwaGVyL2FlYWRfdGVzdCIsICJhZXMtMTI4LWNiYy1zaGEyNTYtdGxzIiwgImNyeXB0by9jaXBoZXIvdGVzdC9hZXNfMTI4X2NiY19zaGEyNTZfdGxzX3Rlc3RzLnR4dCJ9LAorCXsiY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QiLCAiYWVzLTI1Ni1jYmMtc2hhMS10bHMiLCAiY3J5cHRvL2NpcGhlci90ZXN0L2Flc18yNTZfY2JjX3NoYTFfdGxzX3Rlc3RzLnR4dCJ9LAorCXsiY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QiLCAiYWVzLTI1Ni1jYmMtc2hhMS10bHMtaW1wbGljaXQtaXYiLCAiY3J5cHRvL2NpcGhlci90ZXN0L2Flc18yNTZfY2JjX3NoYTFfdGxzX2ltcGxpY2l0X2l2X3Rlc3RzLnR4dCJ9LAorCXsiY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QiLCAiYWVzLTI1Ni1jYmMtc2hhMjU2LXRscyIsICJjcnlwdG8vY2lwaGVyL3Rlc3QvYWVzXzI1Nl9jYmNfc2hhMjU2X3Rsc190ZXN0cy50eHQifSwKKwl7ImNyeXB0by9jaXBoZXIvYWVhZF90ZXN0IiwgImFlcy0yNTYtY2JjLXNoYTM4NC10bHMiLCAiY3J5cHRvL2NpcGhlci90ZXN0L2Flc18yNTZfY2JjX3NoYTM4NF90bHNfdGVzdHMudHh0In0sCisJeyJjcnlwdG8vY2lwaGVyL2FlYWRfdGVzdCIsICJkZXMtZWRlMy1jYmMtc2hhMS10bHMiLCAiY3J5cHRvL2NpcGhlci90ZXN0L2Rlc19lZGUzX2NiY19zaGExX3Rsc190ZXN0cy50eHQifSwKKwl7ImNyeXB0by9jaXBoZXIvYWVhZF90ZXN0IiwgImRlcy1lZGUzLWNiYy1zaGExLXRscy1pbXBsaWNpdC1pdiIsICJjcnlwdG8vY2lwaGVyL3Rlc3QvZGVzX2VkZTNfY2JjX3NoYTFfdGxzX2ltcGxpY2l0X2l2X3Rlc3RzLnR4dCJ9LAorCXsiY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QiLCAicmM0LW1kNS1zc2wzIiwgImNyeXB0by9jaXBoZXIvdGVzdC9yYzRfbWQ1X3NzbDNfdGVzdHMudHh0In0sCisJeyJjcnlwdG8vY2lwaGVyL2FlYWRfdGVzdCIsICJyYzQtc2hhMS1zc2wzIiwgImNyeXB0by9jaXBoZXIvdGVzdC9yYzRfc2hhMV9zc2wzX3Rlc3RzLnR4dCJ9LAorCXsiY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QiLCAiYWVzLTEyOC1jYmMtc2hhMS1zc2wzIiwgImNyeXB0by9jaXBoZXIvdGVzdC9hZXNfMTI4X2NiY19zaGExX3NzbDNfdGVzdHMudHh0In0sCisJeyJjcnlwdG8vY2lwaGVyL2FlYWRfdGVzdCIsICJhZXMtMjU2LWNiYy1zaGExLXNzbDMiLCAiY3J5cHRvL2NpcGhlci90ZXN0L2Flc18yNTZfY2JjX3NoYTFfc3NsM190ZXN0cy50eHQifSwKKwl7ImNyeXB0by9jaXBoZXIvYWVhZF90ZXN0IiwgImRlcy1lZGUzLWNiYy1zaGExLXNzbDMiLCAiY3J5cHRvL2NpcGhlci90ZXN0L2Rlc19lZGUzX2NiY19zaGExX3NzbDNfdGVzdHMudHh0In0sCisJeyJjcnlwdG8vY2lwaGVyL2FlYWRfdGVzdCIsICJhZXMtMTI4LWN0ci1obWFjLXNoYTI1NiIsICJjcnlwdG8vY2lwaGVyL3Rlc3QvYWVzXzEyOF9jdHJfaG1hY19zaGEyNTYudHh0In0sCisJeyJjcnlwdG8vY2lwaGVyL2FlYWRfdGVzdCIsICJhZXMtMjU2LWN0ci1obWFjLXNoYTI1NiIsICJjcnlwdG8vY2lwaGVyL3Rlc3QvYWVzXzI1Nl9jdHJfaG1hY19zaGEyNTYudHh0In0sCisJeyJjcnlwdG8vY2lwaGVyL2NpcGhlcl90ZXN0IiwgImNyeXB0by9jaXBoZXIvdGVzdC9jaXBoZXJfdGVzdC50eHQifSwKKwl7ImNyeXB0by9jbWFjL2NtYWNfdGVzdCJ9LAorCXsiY3J5cHRvL2NvbnN0YW50X3RpbWVfdGVzdCJ9LAorCXsiY3J5cHRvL2RoL2RoX3Rlc3QifSwKKwl7ImNyeXB0by9kaWdlc3QvZGlnZXN0X3Rlc3QifSwKKwl7ImNyeXB0by9kc2EvZHNhX3Rlc3QifSwKKwl7ImNyeXB0by9lYy9lY190ZXN0In0sCisJeyJjcnlwdG8vZWMvZXhhbXBsZV9tdWwifSwKKwl7ImNyeXB0by9lY2RzYS9lY2RzYV90ZXN0In0sCisJeyJjcnlwdG8vZXJyL2Vycl90ZXN0In0sCisJeyJjcnlwdG8vZXZwL2V2cF9leHRyYV90ZXN0In0sCisJeyJjcnlwdG8vZXZwL2V2cF90ZXN0IiwgImNyeXB0by9ldnAvZXZwX3Rlc3RzLnR4dCJ9LAorCXsiY3J5cHRvL2V2cC9ldnBfdGVzdCIsICJjcnlwdG8vaG1hYy9obWFjX3Rlc3RzLnR4dCJ9LAorCXsiY3J5cHRvL2V2cC9wYmtkZl90ZXN0In0sCisJeyJjcnlwdG8vaGtkZi9oa2RmX3Rlc3QifSwKKwl7ImNyeXB0by9obWFjL2htYWNfdGVzdCIsICJjcnlwdG8vaG1hYy9obWFjX3Rlc3RzLnR4dCJ9LAorCXsiY3J5cHRvL2xoYXNoL2xoYXNoX3Rlc3QifSwKKwl7ImNyeXB0by9tb2Rlcy9nY21fdGVzdCJ9LAorCXsiY3J5cHRvL3BrY3M4L3BrY3MxMl90ZXN0In0sCisJeyJjcnlwdG8vcmVmY291bnRfdGVzdCJ9LAorCXsiY3J5cHRvL3JzYS9yc2FfdGVzdCJ9LAorCXsiY3J5cHRvL3RocmVhZF90ZXN0In0sCisJeyJjcnlwdG8veDUwOS9wa2NzN190ZXN0In0sCisJeyJjcnlwdG8veDUwOXYzL3RhYl90ZXN0In0sCisJeyJjcnlwdG8veDUwOXYzL3YzbmFtZV90ZXN0In0sCisJeyJzc2wvcHF1ZXVlL3BxdWV1ZV90ZXN0In0sCisJeyJzc2wvc3NsX3Rlc3QifSwKK30KKwogLy8gdGVzdE91dHB1dCBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIENocm9taXVtJ3MgSlNPTiB0ZXN0IHJlc3VsdCBmb3JtYXQuIFNlZQogLy8gaHR0cHM6Ly93d3cuY2hyb21pdW0ub3JnL2RldmVsb3BlcnMvdGhlLWpzb24tdGVzdC1yZXN1bHRzLWZvcm1hdAogdHlwZSB0ZXN0T3V0cHV0IHN0cnVjdCB7CkBAIC0xOTcsNDMgKzI1NCw4IEBACiAJcmV0dXJuIHN0cmluZ3MuSm9pbihhcmdzLCAiICIpCiB9CiAKLS8vIHNldFdvcmtpbmdEaXJlY3Rvcnkgd2Fsa3MgdXAgZGlyZWN0b3JpZXMgYXMgbmVlZGVkIHVudGlsIHRoZSBjdXJyZW50IHdvcmtpbmcKLS8vIGRpcmVjdG9yeSBpcyB0aGUgdG9wIG9mIGEgQm9yaW5nU1NMIGNoZWNrb3V0LgotZnVuYyBzZXRXb3JraW5nRGlyZWN0b3J5KCkgewotCWZvciBpIDo9IDA7IGkgPCA2NDsgaSsrIHsKLQkJaWYgXywgZXJyIDo9IG9zLlN0YXQoIkJVSUxESU5HLm1kIik7IGVyciA9PSBuaWwgewotCQkJcmV0dXJuCi0JCX0KLQkJb3MuQ2hkaXIoIi4uIikKLQl9Ci0KLQlwYW5pYygiQ291bGRuJ3QgZmluZCBCVUlMRElORy5tZCBpbiBhIHBhcmVudCBkaXJlY3RvcnkhIikKLX0KLQotZnVuYyBwYXJzZVRlc3RDb25maWcoZmlsZW5hbWUgc3RyaW5nKSAoW110ZXN0LCBlcnJvcikgewotCWluLCBlcnIgOj0gb3MuT3BlbihmaWxlbmFtZSkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIG5pbCwgZXJyCi0JfQotCWRlZmVyIGluLkNsb3NlKCkKLQotCWRlY29kZXIgOj0ganNvbi5OZXdEZWNvZGVyKGluKQotCXZhciByZXN1bHQgW110ZXN0Ci0JaWYgZXJyIDo9IGRlY29kZXIuRGVjb2RlKCZyZXN1bHQpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIG5pbCwgZXJyCi0JfQotCXJldHVybiByZXN1bHQsIG5pbAotfQotCiBmdW5jIG1haW4oKSB7CiAJZmxhZy5QYXJzZSgpCi0Jc2V0V29ya2luZ0RpcmVjdG9yeSgpCi0KLQl0ZXN0cywgZXJyIDo9IHBhcnNlVGVzdENvbmZpZygidXRpbC9hbGxfdGVzdHMuanNvbiIpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCWZtdC5QcmludGYoIkZhaWxlZCB0byBwYXJzZSBpbnB1dDogJXNcbiIsIGVycikKLQkJb3MuRXhpdCgxKQotCX0KIAogCXRlc3RPdXRwdXQgOj0gbmV3VGVzdE91dHB1dCgpCiAJdmFyIGZhaWxlZCBbXXRlc3QKZGlmZiAtLWdpdCBhL3NyYy91dGlsL2FsbF90ZXN0cy5qc29uIGIvc3JjL3V0aWwvYWxsX3Rlc3RzLmpzb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZGFhMmYuLjAwMDAwMDAKLS0tIGEvc3JjL3V0aWwvYWxsX3Rlc3RzLmpzb24KKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1bCi0JWyJjcnlwdG8vYWVzL2Flc190ZXN0Il0sCi0JWyJjcnlwdG8vYmFzZTY0L2Jhc2U2NF90ZXN0Il0sCi0JWyJjcnlwdG8vYmlvL2Jpb190ZXN0Il0sCi0JWyJjcnlwdG8vYm4vYm5fdGVzdCJdLAotCVsiY3J5cHRvL2J5dGVzdHJpbmcvYnl0ZXN0cmluZ190ZXN0Il0sCi0JWyJjcnlwdG8vY2lwaGVyL2FlYWRfdGVzdCIsICJhZXMtMTI4LWdjbSIsICJjcnlwdG8vY2lwaGVyL3Rlc3QvYWVzXzEyOF9nY21fdGVzdHMudHh0Il0sCi0JWyJjcnlwdG8vY2lwaGVyL2FlYWRfdGVzdCIsICJhZXMtMTI4LWtleS13cmFwIiwgImNyeXB0by9jaXBoZXIvdGVzdC9hZXNfMTI4X2tleV93cmFwX3Rlc3RzLnR4dCJdLAotCVsiY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QiLCAiYWVzLTI1Ni1nY20iLCAiY3J5cHRvL2NpcGhlci90ZXN0L2Flc18yNTZfZ2NtX3Rlc3RzLnR4dCJdLAotCVsiY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QiLCAiYWVzLTI1Ni1rZXktd3JhcCIsICJjcnlwdG8vY2lwaGVyL3Rlc3QvYWVzXzI1Nl9rZXlfd3JhcF90ZXN0cy50eHQiXSwKLQlbImNyeXB0by9jaXBoZXIvYWVhZF90ZXN0IiwgImNoYWNoYTIwLXBvbHkxMzA1IiwgImNyeXB0by9jaXBoZXIvdGVzdC9jaGFjaGEyMF9wb2x5MTMwNV90ZXN0cy50eHQiXSwKLQlbImNyeXB0by9jaXBoZXIvYWVhZF90ZXN0IiwgInJjNC1tZDUtdGxzIiwgImNyeXB0by9jaXBoZXIvdGVzdC9yYzRfbWQ1X3Rsc190ZXN0cy50eHQiXSwKLQlbImNyeXB0by9jaXBoZXIvYWVhZF90ZXN0IiwgInJjNC1zaGExLXRscyIsICJjcnlwdG8vY2lwaGVyL3Rlc3QvcmM0X3NoYTFfdGxzX3Rlc3RzLnR4dCJdLAotCVsiY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QiLCAiYWVzLTEyOC1jYmMtc2hhMS10bHMiLCAiY3J5cHRvL2NpcGhlci90ZXN0L2Flc18xMjhfY2JjX3NoYTFfdGxzX3Rlc3RzLnR4dCJdLAotCVsiY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QiLCAiYWVzLTEyOC1jYmMtc2hhMS10bHMtaW1wbGljaXQtaXYiLCAiY3J5cHRvL2NpcGhlci90ZXN0L2Flc18xMjhfY2JjX3NoYTFfdGxzX2ltcGxpY2l0X2l2X3Rlc3RzLnR4dCJdLAotCVsiY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QiLCAiYWVzLTEyOC1jYmMtc2hhMjU2LXRscyIsICJjcnlwdG8vY2lwaGVyL3Rlc3QvYWVzXzEyOF9jYmNfc2hhMjU2X3Rsc190ZXN0cy50eHQiXSwKLQlbImNyeXB0by9jaXBoZXIvYWVhZF90ZXN0IiwgImFlcy0yNTYtY2JjLXNoYTEtdGxzIiwgImNyeXB0by9jaXBoZXIvdGVzdC9hZXNfMjU2X2NiY19zaGExX3Rsc190ZXN0cy50eHQiXSwKLQlbImNyeXB0by9jaXBoZXIvYWVhZF90ZXN0IiwgImFlcy0yNTYtY2JjLXNoYTEtdGxzLWltcGxpY2l0LWl2IiwgImNyeXB0by9jaXBoZXIvdGVzdC9hZXNfMjU2X2NiY19zaGExX3Rsc19pbXBsaWNpdF9pdl90ZXN0cy50eHQiXSwKLQlbImNyeXB0by9jaXBoZXIvYWVhZF90ZXN0IiwgImFlcy0yNTYtY2JjLXNoYTI1Ni10bHMiLCAiY3J5cHRvL2NpcGhlci90ZXN0L2Flc18yNTZfY2JjX3NoYTI1Nl90bHNfdGVzdHMudHh0Il0sCi0JWyJjcnlwdG8vY2lwaGVyL2FlYWRfdGVzdCIsICJhZXMtMjU2LWNiYy1zaGEzODQtdGxzIiwgImNyeXB0by9jaXBoZXIvdGVzdC9hZXNfMjU2X2NiY19zaGEzODRfdGxzX3Rlc3RzLnR4dCJdLAotCVsiY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QiLCAiZGVzLWVkZTMtY2JjLXNoYTEtdGxzIiwgImNyeXB0by9jaXBoZXIvdGVzdC9kZXNfZWRlM19jYmNfc2hhMV90bHNfdGVzdHMudHh0Il0sCi0JWyJjcnlwdG8vY2lwaGVyL2FlYWRfdGVzdCIsICJkZXMtZWRlMy1jYmMtc2hhMS10bHMtaW1wbGljaXQtaXYiLCAiY3J5cHRvL2NpcGhlci90ZXN0L2Rlc19lZGUzX2NiY19zaGExX3Rsc19pbXBsaWNpdF9pdl90ZXN0cy50eHQiXSwKLQlbImNyeXB0by9jaXBoZXIvYWVhZF90ZXN0IiwgInJjNC1tZDUtc3NsMyIsICJjcnlwdG8vY2lwaGVyL3Rlc3QvcmM0X21kNV9zc2wzX3Rlc3RzLnR4dCJdLAotCVsiY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QiLCAicmM0LXNoYTEtc3NsMyIsICJjcnlwdG8vY2lwaGVyL3Rlc3QvcmM0X3NoYTFfc3NsM190ZXN0cy50eHQiXSwKLQlbImNyeXB0by9jaXBoZXIvYWVhZF90ZXN0IiwgImFlcy0xMjgtY2JjLXNoYTEtc3NsMyIsICJjcnlwdG8vY2lwaGVyL3Rlc3QvYWVzXzEyOF9jYmNfc2hhMV9zc2wzX3Rlc3RzLnR4dCJdLAotCVsiY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QiLCAiYWVzLTI1Ni1jYmMtc2hhMS1zc2wzIiwgImNyeXB0by9jaXBoZXIvdGVzdC9hZXNfMjU2X2NiY19zaGExX3NzbDNfdGVzdHMudHh0Il0sCi0JWyJjcnlwdG8vY2lwaGVyL2FlYWRfdGVzdCIsICJkZXMtZWRlMy1jYmMtc2hhMS1zc2wzIiwgImNyeXB0by9jaXBoZXIvdGVzdC9kZXNfZWRlM19jYmNfc2hhMV9zc2wzX3Rlc3RzLnR4dCJdLAotCVsiY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QiLCAiYWVzLTEyOC1jdHItaG1hYy1zaGEyNTYiLCAiY3J5cHRvL2NpcGhlci90ZXN0L2Flc18xMjhfY3RyX2htYWNfc2hhMjU2LnR4dCJdLAotCVsiY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QiLCAiYWVzLTI1Ni1jdHItaG1hYy1zaGEyNTYiLCAiY3J5cHRvL2NpcGhlci90ZXN0L2Flc18yNTZfY3RyX2htYWNfc2hhMjU2LnR4dCJdLAotCVsiY3J5cHRvL2NpcGhlci9jaXBoZXJfdGVzdCIsICJjcnlwdG8vY2lwaGVyL3Rlc3QvY2lwaGVyX3Rlc3QudHh0Il0sCi0JWyJjcnlwdG8vY21hYy9jbWFjX3Rlc3QiXSwKLQlbImNyeXB0by9jb25zdGFudF90aW1lX3Rlc3QiXSwKLQlbImNyeXB0by9kaC9kaF90ZXN0Il0sCi0JWyJjcnlwdG8vZGlnZXN0L2RpZ2VzdF90ZXN0Il0sCi0JWyJjcnlwdG8vZHNhL2RzYV90ZXN0Il0sCi0JWyJjcnlwdG8vZWMvZWNfdGVzdCJdLAotCVsiY3J5cHRvL2VjL2V4YW1wbGVfbXVsIl0sCi0JWyJjcnlwdG8vZWNkc2EvZWNkc2FfdGVzdCJdLAotCVsiY3J5cHRvL2Vyci9lcnJfdGVzdCJdLAotCVsiY3J5cHRvL2V2cC9ldnBfZXh0cmFfdGVzdCJdLAotCVsiY3J5cHRvL2V2cC9ldnBfdGVzdCIsICJjcnlwdG8vZXZwL2V2cF90ZXN0cy50eHQiXSwKLQlbImNyeXB0by9ldnAvcGJrZGZfdGVzdCJdLAotCVsiY3J5cHRvL2hrZGYvaGtkZl90ZXN0Il0sCi0JWyJjcnlwdG8vaG1hYy9obWFjX3Rlc3QiLCAiY3J5cHRvL2htYWMvaG1hY190ZXN0cy50eHQiXSwKLQlbImNyeXB0by9saGFzaC9saGFzaF90ZXN0Il0sCi0JWyJjcnlwdG8vbW9kZXMvZ2NtX3Rlc3QiXSwKLQlbImNyeXB0by9wa2NzOC9wa2NzOF90ZXN0Il0sCi0JWyJjcnlwdG8vcGtjczgvcGtjczEyX3Rlc3QiXSwKLQlbImNyeXB0by9wb2x5MTMwNS9wb2x5MTMwNV90ZXN0IiwgImNyeXB0by9wb2x5MTMwNS9wb2x5MTMwNV90ZXN0LnR4dCJdLAotCVsiY3J5cHRvL3JlZmNvdW50X3Rlc3QiXSwKLQlbImNyeXB0by9yc2EvcnNhX3Rlc3QiXSwKLQlbImNyeXB0by90aHJlYWRfdGVzdCJdLAotCVsiY3J5cHRvL3g1MDkvcGtjczdfdGVzdCJdLAotCVsiY3J5cHRvL3g1MDl2My90YWJfdGVzdCJdLAotCVsiY3J5cHRvL3g1MDl2My92M25hbWVfdGVzdCJdLAotCVsic3NsL3BxdWV1ZS9wcXVldWVfdGVzdCJdLAotCVsic3NsL3NzbF90ZXN0Il0KLV0KZGlmZiAtLWdpdCBhL3NyYy91dGlsL2RvYy5nbyBiL3NyYy91dGlsL2RvYy5nbwppbmRleCAyM2NkNWY0Li41NDBkNmNhIDEwMDY0NAotLS0gYS9zcmMvdXRpbC9kb2MuZ28KKysrIGIvc3JjL3V0aWwvZG9jLmdvCkBAIC00OCw4ICs0OCw5IEBACiAJLy8gUHJlYW1ibGUgY29udGFpbnMgYSBjb21tZW50IGZvciBhIGdyb3VwIG9mIGZ1bmN0aW9ucy4KIAlQcmVhbWJsZSBbXXN0cmluZwogCURlY2xzICAgIFtdSGVhZGVyRGVjbAotCS8vIEFuY2hvciwgaWYgbm9uLWVtcHR5LCBpcyB0aGUgVVJMIGZyYWdtZW50IHRvIHVzZSBpbiBhbmNob3IgdGFncy4KLQlBbmNob3Igc3RyaW5nCisJLy8gTnVtIGlzIGp1c3QgdGhlIGluZGV4IG9mIHRoZSBzZWN0aW9uLiBJdCdzIGluY2x1ZGVkIGluIG9yZGVyIHRvIGhlbHAKKwkvLyB0ZXh0L3RlbXBsYXRlIGdlbmVyYXRlIGFuY2hvcnMuCisJTnVtIGludAogCS8vIElzUHJpdmF0ZSBpcyB0cnVlIGlmIHRoZSBzZWN0aW9uIGNvbnRhaW5zIHByaXZhdGUgZnVuY3Rpb25zIChhcwogCS8vIGluZGljYXRlZCBieSBpdHMgbmFtZSkuCiAJSXNQcml2YXRlIGJvb2wKQEAgLTY0LDggKzY1LDEwIEBACiAJTmFtZSBzdHJpbmcKIAkvLyBEZWNsIGNvbnRhaW5zIHRoZSBwcmVmb3JtYXR0ZWQgQyBkZWNsYXJhdGlvbiBpdHNlbGYuCiAJRGVjbCBzdHJpbmcKLQkvLyBBbmNob3IsIGlmIG5vbi1lbXB0eSwgaXMgdGhlIFVSTCBmcmFnbWVudCB0byB1c2UgaW4gYW5jaG9yIHRhZ3MuCi0JQW5jaG9yIHN0cmluZworCS8vIE51bSBpcyBhbiBpbmRleCBmb3IgdGhlIGRlY2xhcmF0aW9uLCBidXQgdGhlIHZhbHVlIGlzIHVuaXF1ZSBmb3IgYWxsCisJLy8gZGVjbGFyYXRpb25zIGluIGEgSGVhZGVyRmlsZS4gSXQncyBpbmNsdWRlZCBpbiBvcmRlciB0byBoZWxwCisJLy8gdGV4dC90ZW1wbGF0ZSBnZW5lcmF0ZSBhbmNob3JzLgorCU51bSBpbnQKIH0KIAogY29uc3QgKApAQCAtMTg5LDYgKzE5MiwxNCBAQAogCXJldHVybgogfQogCitmdW5jIHNraXBQYXN0KHMsIHNraXAgc3RyaW5nKSBzdHJpbmcgeworCWkgOj0gc3RyaW5ncy5JbmRleChzLCBza2lwKQorCWlmIGkgPiAwIHsKKwkJcmV0dXJuIHNbaTpdCisJfQorCXJldHVybiBzCit9CisKIGZ1bmMgc2tpcExpbmUocyBzdHJpbmcpIHN0cmluZyB7CiAJaSA6PSBzdHJpbmdzLkluZGV4KHMsICJcbiIpCiAJaWYgaSA+IDAgewpAQCAtMjE2LDkgKzIyNyw4IEBACiAJCX0KIAkJcmV0dXJuIGRlY2xbOmldLCB0cnVlCiAJfQotCWRlY2wgPSBzdHJpbmdzLlRyaW1QcmVmaXgoZGVjbCwgIk9QRU5TU0xfRVhQT1JUICIpCi0JZGVjbCA9IHN0cmluZ3MuVHJpbVByZWZpeChkZWNsLCAiU1RBQ0tfT0YoIikKLQlkZWNsID0gc3RyaW5ncy5UcmltUHJlZml4KGRlY2wsICJMSEFTSF9PRigiKQorCWRlY2wgPSBza2lwUGFzdChkZWNsLCAiU1RBQ0tfT0YoIikKKwlkZWNsID0gc2tpcFBhc3QoZGVjbCwgIkxIQVNIX09GKCIpCiAJaSA6PSBzdHJpbmdzLkluZGV4KGRlY2wsICIoIikKIAlpZiBpIDwgMCB7CiAJCXJldHVybiAiIiwgZmFsc2UKQEAgLTIzMywxMCArMjQzLDYgQEAKIAlyZXR1cm4gZGVjbFtqKzEgOiBpXSwgdHJ1ZQogfQogCi1mdW5jIHNhbml0aXplQW5jaG9yKG5hbWUgc3RyaW5nKSBzdHJpbmcgewotCXJldHVybiBzdHJpbmdzLlJlcGxhY2UobmFtZSwgIiAiLCAiLSIsIC0xKQotfQotCiBmdW5jIChjb25maWcgKkNvbmZpZykgcGFyc2VIZWFkZXIocGF0aCBzdHJpbmcpICgqSGVhZGVyRmlsZSwgZXJyb3IpIHsKIAloZWFkZXJQYXRoIDo9IGZpbGVwYXRoLkpvaW4oY29uZmlnLkJhc2VEaXJlY3RvcnksIHBhdGgpCiAKQEAgLTMwOCw3ICszMTQsNyBAQAogCQl9CiAJfQogCi0JYWxsQW5jaG9ycyA6PSBtYWtlKG1hcFtzdHJpbmddc3RydWN0e30pCisJdmFyIHNlY3Rpb25OdW1iZXIsIGRlY2xOdW1iZXIgaW50CiAKIAlmb3IgewogCQkvLyBTdGFydCBvZiBhIHNlY3Rpb24uCkBAIC0zMjQsNyArMzMwLDEwIEBACiAJCQlyZXR1cm4gbmlsLCBmbXQuRXJyb3JmKCJibGFuayBsaW5lIGF0IHN0YXJ0IG9mIHNlY3Rpb24gb24gbGluZSAlZCIsIGxpbmVObykKIAkJfQogCi0JCXZhciBzZWN0aW9uIEhlYWRlclNlY3Rpb24KKwkJc2VjdGlvbiA6PSBIZWFkZXJTZWN0aW9ueworCQkJTnVtOiBzZWN0aW9uTnVtYmVyLAorCQl9CisJCXNlY3Rpb25OdW1iZXIrKwogCiAJCWlmIHN0cmluZ3MuSGFzUHJlZml4KGxpbmUsIGNvbW1lbnRTdGFydCkgewogCQkJY29tbWVudCwgcmVzdCwgcmVzdExpbmVObywgZXJyIDo9IGV4dHJhY3RDb21tZW50KGxpbmVzLCBsaW5lTm8pCkBAIC0zMzIsMTcgKzM0MSw4IEBACiAJCQkJcmV0dXJuIG5pbCwgZXJyCiAJCQl9CiAJCQlpZiBsZW4ocmVzdCkgPiAwICYmIGxlbihyZXN0WzBdKSA9PSAwIHsKLQkJCQlhbmNob3IgOj0gc2FuaXRpemVBbmNob3IoZmlyc3RTZW50ZW5jZShjb21tZW50KSkKLQkJCQlpZiBsZW4oYW5jaG9yKSA+IDAgewotCQkJCQlpZiBfLCBvayA6PSBhbGxBbmNob3JzW2FuY2hvcl07IG9rIHsKLQkJCQkJCXJldHVybiBuaWwsIGZtdC5FcnJvcmYoImR1cGxpY2F0ZSBhbmNob3I6ICVzIiwgYW5jaG9yKQotCQkJCQl9Ci0JCQkJCWFsbEFuY2hvcnNbYW5jaG9yXSA9IHN0cnVjdHt9e30KLQkJCQl9Ci0KIAkJCQlzZWN0aW9uLlByZWFtYmxlID0gY29tbWVudAogCQkJCXNlY3Rpb24uSXNQcml2YXRlID0gbGVuKGNvbW1lbnQpID4gMCAmJiBzdHJpbmdzLkhhc1ByZWZpeChjb21tZW50WzBdLCAiUHJpdmF0ZSBmdW5jdGlvbnMiKQotCQkJCXNlY3Rpb24uQW5jaG9yID0gYW5jaG9yCiAJCQkJbGluZXMgPSByZXN0WzE6XQogCQkJCWxpbmVObyA9IHJlc3RMaW5lTm8gKyAxCiAJCQl9CkBAIC0zODEsMTggKzM4MSwxMyBAQAogCQkJaWYgbGFzdCA6PSBsZW4oc2VjdGlvbi5EZWNscykgLSAxOyBsZW4obmFtZSkgPT0gMCAmJiBsZW4oY29tbWVudCkgPT0gMCAmJiBsYXN0ID49IDAgewogCQkJCXNlY3Rpb24uRGVjbHNbbGFzdF0uRGVjbCArPSAiXG4iICsgZGVjbAogCQkJfSBlbHNlIHsKLQkJCQlhbmNob3IgOj0gc2FuaXRpemVBbmNob3IobmFtZSkKLQkJCQkvLyBUT0RPKGRhdmlkYmVuKTogRW5mb3JjZSB1bmlxdWVuZXNzLiBUaGlzIGlzCi0JCQkJLy8gc2tpcHBlZCBiZWNhdXNlICNpZmRlZnMgY3VycmVudGx5IHJlc3VsdCBpbgotCQkJCS8vIGR1cGxpY2F0ZSB0YWJsZS1vZi1jb250ZW50cyBlbnRyaWVzLgotCQkJCWFsbEFuY2hvcnNbYW5jaG9yXSA9IHN0cnVjdHt9e30KLQogCQkJCXNlY3Rpb24uRGVjbHMgPSBhcHBlbmQoc2VjdGlvbi5EZWNscywgSGVhZGVyRGVjbHsKIAkJCQkJQ29tbWVudDogY29tbWVudCwKIAkJCQkJTmFtZTogICAgbmFtZSwKIAkJCQkJRGVjbDogICAgZGVjbCwKLQkJCQkJQW5jaG9yOiAgYW5jaG9yLAorCQkJCQlOdW06ICAgICBkZWNsTnVtYmVyLAogCQkJCX0pCisJCQkJZGVjbE51bWJlcisrCiAJCQl9CiAKIAkJCWlmIGxlbihsaW5lcykgPiAwICYmIGxlbihsaW5lc1swXSkgPT0gMCB7CkBAIC00NTYsNyArNDUxLDcgQEAKIAlpZiBlbmQgPiAwIHsKIAkJZW5kICs9IHN0YXJ0CiAJCXcgOj0gc3RyaW5ncy5Ub0xvd2VyKHN0cmluZyhzW3N0YXJ0OmVuZF0pKQotCQlpZiB3ID09ICJhIiB8fCB3ID09ICJhbiIgeworCQlpZiB3ID09ICJhIiB8fCB3ID09ICJhbiIgfHwgdyA9PSAiZGVwcmVjYXRlZDoiIHsKIAkJCXN0YXJ0ID0gZW5kICsgMQogCQkJZ290byBhZ2FpbgogCQl9CkBAIC01MDAsOSArNDk1LDkgQEAKICAgICA8b2w+CiAgICAgICB7e3JhbmdlIC5TZWN0aW9uc319CiAgICAgICAgIHt7aWYgbm90IC5Jc1ByaXZhdGV9fQotICAgICAgICAgIHt7aWYgLkFuY2hvcn19PGxpIGNsYXNzPSJoZWFkZXIiPjxhIGhyZWY9IiN7ey5BbmNob3J9fSI+e3suUHJlYW1ibGUgfCBmaXJzdFNlbnRlbmNlIHwgaHRtbCB8IG1hcmt1cFBpcGVXb3Jkc319PC9hPjwvbGk+e3tlbmR9fQorICAgICAgICAgIHt7aWYgLlByZWFtYmxlfX08bGkgY2xhc3M9ImhlYWRlciI+PGEgaHJlZj0iI3NlY3Rpb24te3suTnVtfX0iPnt7LlByZWFtYmxlIHwgZmlyc3RTZW50ZW5jZSB8IGh0bWwgfCBtYXJrdXBQaXBlV29yZHN9fTwvYT48L2xpPnt7ZW5kfX0KICAgICAgICAgICB7e3JhbmdlIC5EZWNsc319Ci0gICAgICAgICAgICB7e2lmIC5BbmNob3J9fTxsaT48YSBocmVmPSIje3suQW5jaG9yfX0iPjx0dD57ey5OYW1lfX08L3R0PjwvYT48L2xpPnt7ZW5kfX0KKyAgICAgICAgICAgIHt7aWYgLk5hbWV9fTxsaT48YSBocmVmPSIjZGVjbC17ey5OdW19fSI+PHR0Pnt7Lk5hbWV9fTwvdHQ+PC9hPjwvbGk+e3tlbmR9fQogICAgICAgICAgIHt7ZW5kfX0KICAgICAgICAge3tlbmR9fQogICAgICAge3tlbmR9fQpAQCAtNTEzLDcgKzUwOCw3IEBACiAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICAgICB7e2lmIC5QcmVhbWJsZX19CiAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbnByZWFtYmxlIj4KLSAgICAgICAgICA8YXt7aWYgLkFuY2hvcn19IG5hbWU9Int7LkFuY2hvcn19Int7ZW5kfX0+CisgICAgICAgICAgPGEgbmFtZT0ic2VjdGlvbi17ey5OdW19fSI+CiAgICAgICAgICAge3tyYW5nZSAuUHJlYW1ibGV9fTxwPnt7LiB8IGh0bWwgfCBtYXJrdXBQaXBlV29yZHN9fTwvcD57e2VuZH19CiAgICAgICAgICAgPC9hPgogICAgICAgICAgIDwvZGl2PgpAQCAtNTIxLDcgKzUxNiw3IEBACiAKICAgICAgICAge3tyYW5nZSAuRGVjbHN9fQogICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2wiPgotICAgICAgICAgIDxhe3tpZiAuQW5jaG9yfX0gbmFtZT0ie3suQW5jaG9yfX0ie3tlbmR9fT4KKyAgICAgICAgICA8YSBuYW1lPSJkZWNsLXt7Lk51bX19Ij4KICAgICAgICAgICB7e3JhbmdlIC5Db21tZW50fX0KICAgICAgICAgICAgIDxwPnt7LiB8IGh0bWwgfCBtYXJrdXBQaXBlV29yZHMgfCBuZXdsaW5lc1RvQlIgfCBtYXJrdXBGaXJzdFdvcmR9fTwvcD4KICAgICAgICAgICB7e2VuZH19CkBAIC02MTAsMTQgKzYwNSw2IEBACiAJcmV0dXJuIG5pbAogfQogCi1mdW5jIGNvcHlGaWxlKG91dFBhdGggc3RyaW5nLCBpbkZpbGVQYXRoIHN0cmluZykgZXJyb3IgewotCWJ5dGVzLCBlcnIgOj0gaW91dGlsLlJlYWRGaWxlKGluRmlsZVBhdGgpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBlcnIKLQl9Ci0JcmV0dXJuIGlvdXRpbC5Xcml0ZUZpbGUoZmlsZXBhdGguSm9pbihvdXRQYXRoLCBmaWxlcGF0aC5CYXNlKGluRmlsZVBhdGgpKSwgYnl0ZXMsIDA2NjYpCi19Ci0KIGZ1bmMgbWFpbigpIHsKIAl2YXIgKAogCQljb25maWdGbGFnICpzdHJpbmcgPSBmbGFnLlN0cmluZygiY29uZmlnIiwgImRvYy5jb25maWciLCAiTG9jYXRpb24gb2YgY29uZmlnIGZpbGUiKQpAQCAtNjU4LDkgKzY0NSw0IEBACiAJCWZtdC5QcmludGYoIkZhaWxlZCB0byBnZW5lcmF0ZSBpbmRleDogJXNcbiIsIGVycikKIAkJb3MuRXhpdCgxKQogCX0KLQotCWlmIGVyciA6PSBjb3B5RmlsZSgqb3V0cHV0RGlyLCAiZG9jLmNzcyIpOyBlcnIgIT0gbmlsIHsKLQkJZm10LlByaW50ZigiRmFpbGVkIHRvIGNvcHkgc3RhdGljIGZpbGU6ICVzXG4iLCBlcnIpCi0JCW9zLkV4aXQoMSkKLQl9CiB9CmRpZmYgLS1naXQgYS9zcmMvdXRpbC9nZW5lcmF0ZV9idWlsZF9maWxlcy5weSBiL3NyYy91dGlsL2dlbmVyYXRlX2J1aWxkX2ZpbGVzLnB5CmluZGV4IDJlYWU5OGEuLmU1MzRhNTYgMTAwNjQ0Ci0tLSBhL3NyYy91dGlsL2dlbmVyYXRlX2J1aWxkX2ZpbGVzLnB5CisrKyBiL3NyYy91dGlsL2dlbmVyYXRlX2J1aWxkX2ZpbGVzLnB5CkBAIC0xOSw3ICsxOSw2IEBACiBpbXBvcnQgb3MKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCi1pbXBvcnQganNvbgogCiAKICMgT1NfQVJDSF9DT01CT1MgbWFwcyBmcm9tIE9TIGFuZCBwbGF0Zm9ybSB0byB0aGUgT3BlblNTTCBhc3NlbWJseSAic3R5bGUiIGZvcgpAQCAtNjksOSArNjgsNyBAQAogICAgICAgZ3lwaS53cml0ZShzZWxmLmhlYWRlciArICd7XG4gIFwndmFyaWFibGVzXCc6IHtcbicpCiAKICAgICAgIHNlbGYuUHJpbnRWYXJpYWJsZVNlY3Rpb24oCi0gICAgICAgICAgZ3lwaSwgJ2JvcmluZ3NzbF9zc2xfc291cmNlcycsIGZpbGVzWydzc2wnXSkKLSAgICAgIHNlbGYuUHJpbnRWYXJpYWJsZVNlY3Rpb24oCi0gICAgICAgICAgZ3lwaSwgJ2JvcmluZ3NzbF9jcnlwdG9fc291cmNlcycsIGZpbGVzWydjcnlwdG8nXSkKKyAgICAgICAgICBneXBpLCAnYm9yaW5nc3NsX2xpYl9zb3VyY2VzJywgZmlsZXNbJ2NyeXB0byddICsgZmlsZXNbJ3NzbCddKQogCiAgICAgICBmb3IgKChvc25hbWUsIGFyY2gpLCBhc21fZmlsZXMpIGluIGFzbV9vdXRwdXRzOgogICAgICAgICBzZWxmLlByaW50VmFyaWFibGVTZWN0aW9uKGd5cGksICdib3Jpbmdzc2xfJXNfJXNfc291cmNlcycgJQpAQCAtMTM2LDkgKzEzMyw2IEBACiAKICIiIgogCi0gIGRlZiBFeHRyYUZpbGVzKHNlbGYpOgotICAgIHJldHVybiBbJ2FuZHJvaWRfY29tcGF0X2hhY2tzLmMnLCAnYW5kcm9pZF9jb21wYXRfa2V5d3JhcC5jJ10KLQogICBkZWYgUHJpbnRWYXJpYWJsZVNlY3Rpb24oc2VsZiwgb3V0LCBuYW1lLCBmaWxlcyk6CiAgICAgb3V0LndyaXRlKCclcyA6PSBcXFxuJyAlIG5hbWUpCiAgICAgZm9yIGYgaW4gc29ydGVkKGZpbGVzKToKQEAgLTE0OSw3ICsxNDMsOCBAQAogICAgIHdpdGggb3Blbignc291cmNlcy5taycsICd3KycpIGFzIG1ha2VmaWxlOgogICAgICAgbWFrZWZpbGUud3JpdGUoc2VsZi5oZWFkZXIpCiAKLSAgICAgIGZpbGVzWydjcnlwdG8nXS5leHRlbmQoc2VsZi5FeHRyYUZpbGVzKCkpCisgICAgICBmaWxlc1snY3J5cHRvJ10uYXBwZW5kKCdhbmRyb2lkX2NvbXBhdF9oYWNrcy5jJykKKyAgICAgIGZpbGVzWydjcnlwdG8nXS5hcHBlbmQoJ2FuZHJvaWRfY29tcGF0X2tleXdyYXAuYycpCiAgICAgICBzZWxmLlByaW50VmFyaWFibGVTZWN0aW9uKG1ha2VmaWxlLCAnY3J5cHRvX3NvdXJjZXMnLCBmaWxlc1snY3J5cHRvJ10pCiAgICAgICBzZWxmLlByaW50VmFyaWFibGVTZWN0aW9uKG1ha2VmaWxlLCAnc3NsX3NvdXJjZXMnLCBmaWxlc1snc3NsJ10pCiAgICAgICBzZWxmLlByaW50VmFyaWFibGVTZWN0aW9uKG1ha2VmaWxlLCAndG9vbF9zb3VyY2VzJywgZmlsZXNbJ3Rvb2wnXSkKQEAgLTE1OSwxMjcgKzE1NCw2IEBACiAgICAgICAgICAgICBtYWtlZmlsZSwgJyVzXyVzX3NvdXJjZXMnICUgKG9zbmFtZSwgYXJjaCksIGFzbV9maWxlcykKIAogCi1jbGFzcyBBbmRyb2lkU3RhbmRhbG9uZShBbmRyb2lkKToKLSAgIiIiQW5kcm9pZFN0YW5kYWxvbmUgaXMgZm9yIEFuZHJvaWQgYnVpbGRzIG91dHNpZGUgb2YgdGhlIEFuZHJvaWQtc3lzdGVtLCBpLmUuCi0KLSAgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IHdpc2ggd2lzaCB0byBzaGlwIEJvcmluZ1NTTC4KLSAgIiIiCi0KLSAgZGVmIEV4dHJhRmlsZXMoc2VsZik6Ci0gICAgcmV0dXJuIFtdCi0KLQotY2xhc3MgQmF6ZWwob2JqZWN0KToKLSAgIiIiQmF6ZWwgb3V0cHV0cyBmaWxlcyBzdWl0YWJsZSBmb3IgaW5jbHVkaW5nIGluIEJhemVsIGZpbGVzLiIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICBzZWxmLmZpcnN0U2VjdGlvbiA9IFRydWUKLSAgICBzZWxmLmhlYWRlciA9IFwKLSIiIiMgVGhpcyBmaWxlIGlzIGNyZWF0ZWQgYnkgZ2VuZXJhdGVfYnVpbGRfZmlsZXMucHkuIERvIG5vdCBlZGl0IG1hbnVhbGx5LgotCi0iIiIKLQotICBkZWYgUHJpbnRWYXJpYWJsZVNlY3Rpb24oc2VsZiwgb3V0LCBuYW1lLCBmaWxlcyk6Ci0gICAgaWYgbm90IHNlbGYuZmlyc3RTZWN0aW9uOgotICAgICAgb3V0LndyaXRlKCdcbicpCi0gICAgc2VsZi5maXJzdFNlY3Rpb24gPSBGYWxzZQotCi0gICAgb3V0LndyaXRlKCclcyA9IFtcbicgJSBuYW1lKQotICAgIGZvciBmIGluIHNvcnRlZChmaWxlcyk6Ci0gICAgICBvdXQud3JpdGUoJyAgICAiJXMiLFxuJyAlIGYpCi0gICAgb3V0LndyaXRlKCddXG4nKQotCi0gIGRlZiBXcml0ZUZpbGVzKHNlbGYsIGZpbGVzLCBhc21fb3V0cHV0cyk6Ci0gICAgd2l0aCBvcGVuKCdCVUlMRC5nZW5lcmF0ZWQnLCAndysnKSBhcyBvdXQ6Ci0gICAgICBvdXQud3JpdGUoc2VsZi5oZWFkZXIpCi0KLSAgICAgIHNlbGYuUHJpbnRWYXJpYWJsZVNlY3Rpb24ob3V0LCAnc3NsX2hlYWRlcnMnLCBmaWxlc1snc3NsX2hlYWRlcnMnXSkKLSAgICAgIHNlbGYuUHJpbnRWYXJpYWJsZVNlY3Rpb24oCi0gICAgICAgICAgb3V0LCAnc3NsX2ludGVybmFsX2hlYWRlcnMnLCBmaWxlc1snc3NsX2ludGVybmFsX2hlYWRlcnMnXSkKLSAgICAgIHNlbGYuUHJpbnRWYXJpYWJsZVNlY3Rpb24ob3V0LCAnc3NsX3NvdXJjZXMnLCBmaWxlc1snc3NsJ10pCi0gICAgICBzZWxmLlByaW50VmFyaWFibGVTZWN0aW9uKG91dCwgJ2NyeXB0b19oZWFkZXJzJywgZmlsZXNbJ2NyeXB0b19oZWFkZXJzJ10pCi0gICAgICBzZWxmLlByaW50VmFyaWFibGVTZWN0aW9uKAotICAgICAgICAgIG91dCwgJ2NyeXB0b19pbnRlcm5hbF9oZWFkZXJzJywgZmlsZXNbJ2NyeXB0b19pbnRlcm5hbF9oZWFkZXJzJ10pCi0gICAgICBzZWxmLlByaW50VmFyaWFibGVTZWN0aW9uKG91dCwgJ2NyeXB0b19zb3VyY2VzJywgZmlsZXNbJ2NyeXB0byddKQotICAgICAgc2VsZi5QcmludFZhcmlhYmxlU2VjdGlvbihvdXQsICd0b29sX3NvdXJjZXMnLCBmaWxlc1sndG9vbCddKQotCi0gICAgICBmb3IgKChvc25hbWUsIGFyY2gpLCBhc21fZmlsZXMpIGluIGFzbV9vdXRwdXRzOgotICAgICAgICBpZiBvc25hbWUgaXMgbm90ICdsaW51eCc6Ci0gICAgICAgICAgY29udGludWUKLSAgICAgICAgc2VsZi5QcmludFZhcmlhYmxlU2VjdGlvbigKLSAgICAgICAgICAgIG91dCwgJ2NyeXB0b19zb3VyY2VzXyVzJyAlIGFyY2gsIGFzbV9maWxlcykKLQotICAgIHdpdGggb3BlbignQlVJTEQuZ2VuZXJhdGVkX3Rlc3RzJywgJ3crJykgYXMgb3V0OgotICAgICAgb3V0LndyaXRlKHNlbGYuaGVhZGVyKQotCi0gICAgICBvdXQud3JpdGUoJ3Rlc3Rfc3VwcG9ydF9zb3VyY2VzID0gW1xuJykKLSAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlc1sndGVzdF9zdXBwb3J0J106Ci0gICAgICAgIGlmIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpID09ICdtYWxsb2MuY2MnOgotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIG91dC53cml0ZSgnICAgICIlcyIsXG4nICUgZmlsZW5hbWUpCi0gICAgICBvdXQud3JpdGUoJ10gKyBnbG9iKFsic3JjL2NyeXB0by90ZXN0LyouaCJdKVxuXG4nKQotCi0gICAgICBuYW1lX2NvdW50cyA9IHt9Ci0gICAgICBmb3IgdGVzdCBpbiBmaWxlc1sndGVzdHMnXToKLSAgICAgICAgbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUodGVzdFswXSkKLSAgICAgICAgbmFtZV9jb3VudHNbbmFtZV0gPSBuYW1lX2NvdW50cy5nZXQobmFtZSwgMCkgKyAxCi0KLSAgICAgIGZpcnN0ID0gVHJ1ZQotICAgICAgZm9yIHRlc3QgaW4gZmlsZXNbJ3Rlc3RzJ106Ci0gICAgICAgIG5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHRlc3RbMF0pCi0gICAgICAgIGlmIG5hbWVfY291bnRzW25hbWVdID4gMToKLSAgICAgICAgICBpZiAnLycgaW4gdGVzdFsxXToKLSAgICAgICAgICAgIG5hbWUgKz0gJ18nICsgb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKHRlc3RbMV0pKVswXQotICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBuYW1lICs9ICdfJyArIHRlc3RbMV0ucmVwbGFjZSgnLScsICdfJykKLQotICAgICAgICBpZiBub3QgZmlyc3Q6Ci0gICAgICAgICAgb3V0LndyaXRlKCdcbicpCi0gICAgICAgIGZpcnN0ID0gRmFsc2UKLQotICAgICAgICBzcmNfcHJlZml4ID0gJ3NyYy8nICsgdGVzdFswXQotICAgICAgICBmb3Igc3JjIGluIGZpbGVzWyd0ZXN0J106Ci0gICAgICAgICAgaWYgc3JjLnN0YXJ0c3dpdGgoc3JjX3ByZWZpeCk6Ci0gICAgICAgICAgICBzcmMgPSBzcmMKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2FuJ3QgZmluZCBzb3VyY2UgZm9yICVzIiAlIHRlc3RbMF0pCi0KLSAgICAgICAgb3V0LndyaXRlKCdjY190ZXN0KFxuJykKLSAgICAgICAgb3V0LndyaXRlKCcgICAgbmFtZSA9ICIlcyIsXG4nICUgbmFtZSkKLSAgICAgICAgb3V0LndyaXRlKCcgICAgc2l6ZSA9ICJzbWFsbCIsXG4nKQotICAgICAgICBvdXQud3JpdGUoJyAgICBzcmNzID0gWyIlcyJdICsgdGVzdF9zdXBwb3J0X3NvdXJjZXMsXG4nICUgc3JjKQotCi0gICAgICAgIGRhdGFfZmlsZXMgPSBbXQotICAgICAgICBpZiBsZW4odGVzdCkgPiAxOgotCi0gICAgICAgICAgb3V0LndyaXRlKCcgICAgYXJncyA9IFtcbicpCi0gICAgICAgICAgZm9yIGFyZyBpbiB0ZXN0WzE6XToKLSAgICAgICAgICAgIGlmICcvJyBpbiBhcmc6Ci0gICAgICAgICAgICAgIG91dC53cml0ZSgnICAgICAgICAiJChsb2NhdGlvbiBzcmMvJXMpIixcbicgJSBhcmcpCi0gICAgICAgICAgICAgIGRhdGFfZmlsZXMuYXBwZW5kKCdzcmMvJXMnICUgYXJnKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgb3V0LndyaXRlKCcgICAgICAgICIlcyIsXG4nICUgYXJnKQotICAgICAgICAgIG91dC53cml0ZSgnICAgIF0sXG4nKQotCi0gICAgICAgIG91dC53cml0ZSgnICAgIGNvcHRzID0gYm9yaW5nc3NsX2NvcHRzLFxuJykKLQotICAgICAgICBpZiBsZW4oZGF0YV9maWxlcykgPiAwOgotICAgICAgICAgIG91dC53cml0ZSgnICAgIGRhdGEgPSBbXG4nKQotICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBkYXRhX2ZpbGVzOgotICAgICAgICAgICAgb3V0LndyaXRlKCcgICAgICAgICIlcyIsXG4nICUgZmlsZW5hbWUpCi0gICAgICAgICAgb3V0LndyaXRlKCcgICAgXSxcbicpCi0KLSAgICAgICAgaWYgJ3NzbC8nIGluIHRlc3RbMF06Ci0gICAgICAgICAgb3V0LndyaXRlKCcgICAgZGVwcyA9IFtcbicpCi0gICAgICAgICAgb3V0LndyaXRlKCcgICAgICAgICI6Y3J5cHRvIixcbicpCi0gICAgICAgICAgb3V0LndyaXRlKCcgICAgICAgICI6c3NsIixcbicpCi0gICAgICAgICAgb3V0LndyaXRlKCcgICAgXSxcbicpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgb3V0LndyaXRlKCcgICAgZGVwcyA9IFsiOmNyeXB0byJdLFxuJykKLSAgICAgICAgb3V0LndyaXRlKCcpXG4nKQotCi0KIGRlZiBGaW5kQ01ha2VGaWxlcyhkaXJlY3RvcnkpOgogICAiIiJSZXR1cm5zIGxpc3Qgb2YgYWxsIENNYWtlTGlzdHMudHh0IGZpbGVzIHJlY3Vyc2l2ZWx5IGluIGRpcmVjdG9yeS4iIiIKICAgY21ha2VmaWxlcyA9IFtdCkBAIC0zMTQsMTAgKzE4OCw2IEBACiAgIHJldHVybiBUcnVlCiAKIAotZGVmIFNTTEhlYWRlckZpbGVzKGRlbnQsIGlzX2Rpcik6Ci0gIHJldHVybiBkZW50IGluIFsnc3NsLmgnLCAndGxzMS5oJywgJ3NzbDIzLmgnLCAnc3NsMy5oJywgJ2R0bHMxLmgnXQotCi0KIGRlZiBGaW5kQ0ZpbGVzKGRpcmVjdG9yeSwgZmlsdGVyX2Z1bmMpOgogICAiIiJSZWN1cnNlcyB0aHJvdWdoIGRpcmVjdG9yeSBhbmQgcmV0dXJucyBhIGxpc3Qgb2YgcGF0aHMgdG8gYWxsIHRoZSBDIHNvdXJjZQogICBmaWxlcyB0aGF0IHBhc3MgZmlsdGVyX2Z1bmMuIiIiCkBAIC0zMzgsMjEgKzIwOCw2IEBACiAgIHJldHVybiBjZmlsZXMKIAogCi1kZWYgRmluZEhlYWRlckZpbGVzKGRpcmVjdG9yeSwgZmlsdGVyX2Z1bmMpOgotICAiIiJSZWN1cnNlcyB0aHJvdWdoIGRpcmVjdG9yeSBhbmQgcmV0dXJucyBhIGxpc3Qgb2YgcGF0aHMgdG8gYWxsIHRoZSBoZWFkZXIgZmlsZXMgdGhhdCBwYXNzIGZpbHRlcl9mdW5jLiIiIgotICBoZmlsZXMgPSBbXQotCi0gIGZvciAocGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcykgaW4gb3Mud2FsayhkaXJlY3RvcnkpOgotICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6Ci0gICAgICBpZiBub3QgZmlsZW5hbWUuZW5kc3dpdGgoJy5oJyk6Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICBpZiBub3QgZmlsdGVyX2Z1bmMoZmlsZW5hbWUsIEZhbHNlKToKLSAgICAgICAgY29udGludWUKLSAgICAgIGhmaWxlcy5hcHBlbmQob3MucGF0aC5qb2luKHBhdGgsIGZpbGVuYW1lKSkKLQotICByZXR1cm4gaGZpbGVzCi0KLQogZGVmIEV4dHJhY3RQZXJsQXNtRnJvbUNNYWtlRmlsZShjbWFrZWZpbGUpOgogICAiIiJQYXJzZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBDTWFrZUxpc3RzLnR4dCBmaWxlIHBhc3NlZCBhcyBhbiBhcmd1bWVudCBhbmQKICAgcmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSBwZXJsYXNtKCkgZGlyZWN0aXZlcyBmb3VuZCBpbiB0aGUgZmlsZS4iIiIKQEAgLTQzNCw5ICsyODksNiBAQAogICAgICAgaWYgbm90IG91dHB1dC5zdGFydHN3aXRoKCdzcmMnKToKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignb3V0cHV0IG1pc3Npbmcgc3JjOiAlcycgJSBvdXRwdXQpCiAgICAgICBvdXRwdXQgPSBvcy5wYXRoLmpvaW4ob3V0RGlyLCBvdXRwdXRbNDpdKQotICAgICAgaWYgb3V0cHV0LmVuZHN3aXRoKCctYXJteC4ke0FTTV9FWFR9Jyk6Ci0gICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKCctYXJteCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctYXJteDY0JyBpZiBhcmNoID09ICdhYXJjaDY0JyBlbHNlICctYXJteDMyJykKICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKCcke0FTTV9FWFR9JywgYXNtX2V4dCkKIAogICAgICAgaWYgYXJjaCBpbiBBcmNoRm9yQXNtRmlsZW5hbWUoZmlsZW5hbWUpOgpAQCAtNDUwLDcgKzMwMiw3IEBACiAgIHJldHVybiBhc21maWxlcwogCiAKLWRlZiBtYWluKHBsYXRmb3Jtcyk6CitkZWYgbWFpbihwbGF0Zm9ybSk6CiAgIGNyeXB0b19jX2ZpbGVzID0gRmluZENGaWxlcyhvcy5wYXRoLmpvaW4oJ3NyYycsICdjcnlwdG8nKSwgTm9UZXN0cykKICAgc3NsX2NfZmlsZXMgPSBGaW5kQ0ZpbGVzKG9zLnBhdGguam9pbignc3JjJywgJ3NzbCcpLCBOb1Rlc3RzKQogICB0b29sX2NjX2ZpbGVzID0gRmluZENGaWxlcyhvcy5wYXRoLmpvaW4oJ3NyYycsICd0b29sJyksIE5vVGVzdHMpCkBAIC00NjgsODAgKzMyMCwzNiBAQAogICB0ZXN0X2NfZmlsZXMgPSBGaW5kQ0ZpbGVzKG9zLnBhdGguam9pbignc3JjJywgJ2NyeXB0bycpLCBPbmx5VGVzdHMpCiAgIHRlc3RfY19maWxlcyArPSBGaW5kQ0ZpbGVzKG9zLnBhdGguam9pbignc3JjJywgJ3NzbCcpLCBPbmx5VGVzdHMpCiAKLSAgc3NsX2hfZmlsZXMgPSAoCi0gICAgICBGaW5kSGVhZGVyRmlsZXMoCi0gICAgICAgICAgb3MucGF0aC5qb2luKCdzcmMnLCAnaW5jbHVkZScsICdvcGVuc3NsJyksCi0gICAgICAgICAgU1NMSGVhZGVyRmlsZXMpKQotCi0gIGRlZiBOb3RTU0xIZWFkZXJGaWxlcyhmaWxlbmFtZSwgaXNfZGlyKToKLSAgICByZXR1cm4gbm90IFNTTEhlYWRlckZpbGVzKGZpbGVuYW1lLCBpc19kaXIpCi0gIGNyeXB0b19oX2ZpbGVzID0gKAotICAgICAgRmluZEhlYWRlckZpbGVzKAotICAgICAgICAgIG9zLnBhdGguam9pbignc3JjJywgJ2luY2x1ZGUnLCAnb3BlbnNzbCcpLAotICAgICAgICAgIE5vdFNTTEhlYWRlckZpbGVzKSkKLQotICBzc2xfaW50ZXJuYWxfaF9maWxlcyA9IEZpbmRIZWFkZXJGaWxlcyhvcy5wYXRoLmpvaW4oJ3NyYycsICdzc2wnKSwgTm9UZXN0cykKLSAgY3J5cHRvX2ludGVybmFsX2hfZmlsZXMgPSBGaW5kSGVhZGVyRmlsZXMoCi0gICAgICBvcy5wYXRoLmpvaW4oJ3NyYycsICdjcnlwdG8nKSwgTm9UZXN0cykKLQotICB3aXRoIG9wZW4oJ3NyYy91dGlsL2FsbF90ZXN0cy5qc29uJywgJ3InKSBhcyBmOgotICAgIHRlc3RzID0ganNvbi5sb2FkKGYpCi0gIHRlc3RfYmluYXJpZXMgPSBzZXQoW3Rlc3RbMF0gZm9yIHRlc3QgaW4gdGVzdHNdKQotICB0ZXN0X3NvdXJjZXMgPSBzZXQoWwotICAgICAgdGVzdC5yZXBsYWNlKCcuY2MnLCAnJykucmVwbGFjZSgnLmMnLCAnJykucmVwbGFjZSgKLSAgICAgICAgICAnc3JjLycsCi0gICAgICAgICAgJycpCi0gICAgICBmb3IgdGVzdCBpbiB0ZXN0X2NfZmlsZXNdKQotICBpZiB0ZXN0X2JpbmFyaWVzICE9IHRlc3Rfc291cmNlczoKLSAgICBwcmludCAnVGVzdCBzb3VyY2VzIGFuZCBjb25maWd1cmVkIHRlc3RzIGRvIG5vdCBtYXRjaCcKLSAgICBhID0gdGVzdF9iaW5hcmllcy5kaWZmZXJlbmNlKHRlc3Rfc291cmNlcykKLSAgICBpZiBsZW4oYSkgPiAwOgotICAgICAgcHJpbnQgJ1RoZXNlIHRlc3RzIGFyZSBjb25maWd1cmVkIHdpdGhvdXQgc291cmNlczogJyArIHN0cihhKQotICAgIGIgPSB0ZXN0X3NvdXJjZXMuZGlmZmVyZW5jZSh0ZXN0X2JpbmFyaWVzKQotICAgIGlmIGxlbihiKSA+IDA6Ci0gICAgICBwcmludCAnVGhlc2UgdGVzdCBzb3VyY2VzIGFyZSBub3QgY29uZmlndXJlZDogJyArIHN0cihiKQotCiAgIGZpbGVzID0gewogICAgICAgJ2NyeXB0byc6IGNyeXB0b19jX2ZpbGVzLAotICAgICAgJ2NyeXB0b19oZWFkZXJzJzogY3J5cHRvX2hfZmlsZXMsCi0gICAgICAnY3J5cHRvX2ludGVybmFsX2hlYWRlcnMnOiBjcnlwdG9faW50ZXJuYWxfaF9maWxlcywKICAgICAgICdzc2wnOiBzc2xfY19maWxlcywKLSAgICAgICdzc2xfaGVhZGVycyc6IHNzbF9oX2ZpbGVzLAotICAgICAgJ3NzbF9pbnRlcm5hbF9oZWFkZXJzJzogc3NsX2ludGVybmFsX2hfZmlsZXMsCiAgICAgICAndG9vbCc6IHRvb2xfY2NfZmlsZXMsCiAgICAgICAndGVzdCc6IHRlc3RfY19maWxlcywKICAgICAgICd0ZXN0X3N1cHBvcnQnOiB0ZXN0X3N1cHBvcnRfY2NfZmlsZXMsCi0gICAgICAndGVzdHMnOiB0ZXN0cywKICAgfQogCiAgIGFzbV9vdXRwdXRzID0gc29ydGVkKFdyaXRlQXNtRmlsZXMoUmVhZFBlcmxBc21PcGVyYXRpb25zKCkpLml0ZXJpdGVtcygpKQogCi0gIGZvciBwbGF0Zm9ybSBpbiBwbGF0Zm9ybXM6Ci0gICAgcGxhdGZvcm0uV3JpdGVGaWxlcyhmaWxlcywgYXNtX291dHB1dHMpCisgIHBsYXRmb3JtLldyaXRlRmlsZXMoZmlsZXMsIGFzbV9vdXRwdXRzKQogCiAgIHJldHVybiAwCiAKIAogZGVmIFVzYWdlKCk6Ci0gIHByaW50ICdVc2FnZTogcHl0aG9uICVzIFtjaHJvbWl1bXxhbmRyb2lkfGFuZHJvaWQtc3RhbmRhbG9uZXxiYXplbF0nICUgc3lzLmFyZ3ZbMF0KKyAgcHJpbnQgJ1VzYWdlOiBweXRob24gJXMgW2Nocm9taXVtfGFuZHJvaWRdJyAlIHN5cy5hcmd2WzBdCiAgIHN5cy5leGl0KDEpCiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgaWYgbGVuKHN5cy5hcmd2KSA8IDI6CisgIGlmIGxlbihzeXMuYXJndikgIT0gMjoKICAgICBVc2FnZSgpCiAKLSAgcGxhdGZvcm1zID0gW10KLSAgZm9yIHMgaW4gc3lzLmFyZ3ZbMTpdOgotICAgIGlmIHMgPT0gJ2Nocm9taXVtJyBvciBzID09ICdneXAnOgotICAgICAgcGxhdGZvcm1zLmFwcGVuZChDaHJvbWl1bSgpKQotICAgIGVsaWYgcyA9PSAnYW5kcm9pZCc6Ci0gICAgICBwbGF0Zm9ybXMuYXBwZW5kKEFuZHJvaWQoKSkKLSAgICBlbGlmIHMgPT0gJ2FuZHJvaWQtc3RhbmRhbG9uZSc6Ci0gICAgICBwbGF0Zm9ybXMuYXBwZW5kKEFuZHJvaWRTdGFuZGFsb25lKCkpCi0gICAgZWxpZiBzID09ICdiYXplbCc6Ci0gICAgICBwbGF0Zm9ybXMuYXBwZW5kKEJhemVsKCkpCi0gICAgZWxzZToKLSAgICAgIFVzYWdlKCkKKyAgcGxhdGZvcm0gPSBOb25lCisgIGlmIHN5cy5hcmd2WzFdID09ICdjaHJvbWl1bSc6CisgICAgcGxhdGZvcm0gPSBDaHJvbWl1bSgpCisgIGVsaWYgc3lzLmFyZ3ZbMV0gPT0gJ2FuZHJvaWQnOgorICAgIHBsYXRmb3JtID0gQW5kcm9pZCgpCisgIGVsc2U6CisgICAgVXNhZ2UoKQogCi0gIHN5cy5leGl0KG1haW4ocGxhdGZvcm1zKSkKKyAgc3lzLmV4aXQobWFpbihwbGF0Zm9ybSkpCmRpZmYgLS1naXQgYS9zcmMvdXRpbC9tYWtlX2Vycm9ycy5nbyBiL3NyYy91dGlsL21ha2VfZXJyb3JzLmdvCmluZGV4IGNjMzU0MDkuLmRjODAzOWEgMTAwNjQ0Ci0tLSBhL3NyYy91dGlsL21ha2VfZXJyb3JzLmdvCisrKyBiL3NyYy91dGlsL21ha2VfZXJyb3JzLmdvCkBAIC0yNSw2ICsyNSw3IEBACiAJInNvcnQiCiAJInN0cmNvbnYiCiAJInN0cmluZ3MiCisJInVuaWNvZGUiCiApCiAKIC8vIHNzbC5oIHJlc2VydmVzIHZhbHVlcyAxMDAwIGFuZCBhYm92ZSBmb3IgZXJyb3IgY29kZXMgY29ycmVzcG9uZGluZyB0bwpAQCAtNjAsMTEgKzYxLDEyIEBACiAJfQogCiAJcHJlZml4IDo9IHN0cmluZ3MuVG9VcHBlcihsaWIpCi0JcmVhc29ucywgZXJyIDo9IHBhcnNlSGVhZGVyKHByZWZpeCwgaGVhZGVyRmlsZSkKKwlmdW5jdGlvbnMsIHJlYXNvbnMsIGVyciA6PSBwYXJzZUhlYWRlcihwcmVmaXgsIGhlYWRlckZpbGUpCiAJaGVhZGVyRmlsZS5DbG9zZSgpCiAKIAlpZiByZXNldCB7CiAJCWVyciA9IG5pbAorCQlmdW5jdGlvbnMgPSBtYWtlKG1hcFtzdHJpbmddaW50KQogCQkvLyBSZXRhaW4gYW55IHJlYXNvbiBjb2RlcyBhYm92ZSByZXNlcnZlZFJlYXNvbkNvZGUuCiAJCW5ld1JlYXNvbnMgOj0gbWFrZShtYXBbc3RyaW5nXWludCkKIAkJZm9yIGtleSwgdmFsdWUgOj0gcmFuZ2UgcmVhc29ucyB7CkBAIC05NSwxMSArOTcsMTIgQEAKIAkJCWNvbnRpbnVlCiAJCX0KIAotCQlpZiBlcnIgOj0gYWRkUmVhc29ucyhyZWFzb25zLCBuYW1lLCBwcmVmaXgpOyBlcnIgIT0gbmlsIHsKKwkJaWYgZXJyIDo9IGFkZEZ1bmN0aW9uc0FuZFJlYXNvbnMoZnVuY3Rpb25zLCByZWFzb25zLCBuYW1lLCBwcmVmaXgpOyBlcnIgIT0gbmlsIHsKIAkJCXJldHVybiBlcnIKIAkJfQogCX0KIAorCWFzc2lnbk5ld1ZhbHVlcyhmdW5jdGlvbnMsIC0xKQogCWFzc2lnbk5ld1ZhbHVlcyhyZWFzb25zLCByZXNlcnZlZFJlYXNvbkNvZGUpCiAKIAloZWFkZXJGaWxlLCBlcnIgPSBvcy5PcGVuKGhlYWRlclBhdGgpCkBAIC0xMTQsNyArMTE3LDcgQEAKIAl9CiAJZGVmZXIgbmV3SGVhZGVyRmlsZS5DbG9zZSgpCiAKLQlpZiBlcnIgOj0gd3JpdGVIZWFkZXJGaWxlKG5ld0hlYWRlckZpbGUsIGhlYWRlckZpbGUsIHByZWZpeCwgcmVhc29ucyk7IGVyciAhPSBuaWwgeworCWlmIGVyciA6PSB3cml0ZUhlYWRlckZpbGUobmV3SGVhZGVyRmlsZSwgaGVhZGVyRmlsZSwgcHJlZml4LCBmdW5jdGlvbnMsIHJlYXNvbnMpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIGVycgogCX0KIAlvcy5SZW5hbWUoaGVhZGVyUGF0aCsiLnRtcCIsIGhlYWRlclBhdGgpCkBAIC0xMjQsNyArMTI3LDggQEAKIAkJcmV0dXJuIGVycgogCX0KIAotCW91dHB1dFN0cmluZ3MoZGF0YUZpbGUsIGxpYiwgcmVhc29ucykKKwlvdXRwdXRTdHJpbmdzKGRhdGFGaWxlLCBsaWIsIHR5cGVGdW5jdGlvbnMsIGZ1bmN0aW9ucykKKwlvdXRwdXRTdHJpbmdzKGRhdGFGaWxlLCBsaWIsIHR5cGVSZWFzb25zLCByZWFzb25zKQogCWRhdGFGaWxlLkNsb3NlKCkKIAogCXJldHVybiBuaWwKQEAgLTEzMiwxNiArMTM2LDE2IEBACiAKIGZ1bmMgZmluZFRvcGxldmVsKCkgKHBhdGggc3RyaW5nLCBlcnIgZXJyb3IpIHsKIAlwYXRoID0gIi4uIgotCWJ1aWxkaW5nUGF0aCA6PSBmaWxlcGF0aC5Kb2luKHBhdGgsICJCVUlMRElORy5tZCIpCisJYnVpbGRpbmdQYXRoIDo9IGZpbGVwYXRoLkpvaW4ocGF0aCwgIkJVSUxESU5HIikKIAogCV8sIGVyciA9IG9zLlN0YXQoYnVpbGRpbmdQYXRoKQogCWlmIGVyciAhPSBuaWwgJiYgb3MuSXNOb3RFeGlzdChlcnIpIHsKIAkJcGF0aCA9IGZpbGVwYXRoLkpvaW4oIi4uIiwgcGF0aCkKLQkJYnVpbGRpbmdQYXRoID0gZmlsZXBhdGguSm9pbihwYXRoLCAiQlVJTERJTkcubWQiKQorCQlidWlsZGluZ1BhdGggPSBmaWxlcGF0aC5Kb2luKHBhdGgsICJCVUlMRElORyIpCiAJCV8sIGVyciA9IG9zLlN0YXQoYnVpbGRpbmdQYXRoKQogCX0KIAlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuICIiLCBlcnJvcnMuTmV3KCJDYW5ub3QgZmluZCBCVUlMRElORy5tZCBmaWxlIGF0IHRoZSB0b3AtbGV2ZWwiKQorCQlyZXR1cm4gIiIsIGVycm9ycy5OZXcoIkNhbm5vdCBmaW5kIEJVSUxESU5HIGZpbGUgYXQgdGhlIHRvcC1sZXZlbCIpCiAJfQogCXJldHVybiBwYXRoLCBuaWwKIH0KQEAgLTE3OSw3ICsxODMsNyBAQAogCX0KIH0KIAotZnVuYyBwYXJzZURlZmluZUxpbmUobGluZSwgbGliIHN0cmluZykgKGtleSBzdHJpbmcsIHZhbHVlIGludCwgb2sgYm9vbCkgeworZnVuYyBwYXJzZURlZmluZUxpbmUobGluZSwgbGliIHN0cmluZykgKHR5cCBpbnQsIGtleSBzdHJpbmcsIHZhbHVlIGludCwgb2sgYm9vbCkgewogCWlmICFzdHJpbmdzLkhhc1ByZWZpeChsaW5lLCAiI2RlZmluZSAiKSB7CiAJCXJldHVybgogCX0KQEAgLTE4OSw4ICsxOTMsMTYgQEAKIAkJcmV0dXJuCiAJfQogCisJZnVuY1ByZWZpeCA6PSBsaWIgKyAiX0ZfIgorCXJlYXNvblByZWZpeCA6PSBsaWIgKyAiX1JfIgorCiAJa2V5ID0gZmllbGRzWzFdCi0JaWYgIXN0cmluZ3MuSGFzUHJlZml4KGtleSwgbGliKyJfUl8iKSB7CisJc3dpdGNoIHsKKwljYXNlIHN0cmluZ3MuSGFzUHJlZml4KGtleSwgZnVuY1ByZWZpeCk6CisJCXR5cCA9IHR5cGVGdW5jdGlvbnMKKwljYXNlIHN0cmluZ3MuSGFzUHJlZml4KGtleSwgcmVhc29uUHJlZml4KToKKwkJdHlwID0gdHlwZVJlYXNvbnMKKwlkZWZhdWx0OgogCQlyZXR1cm4KIAl9CiAKQEAgLTIwMyw3ICsyMTUsNyBAQAogCXJldHVybgogfQogCi1mdW5jIHdyaXRlSGVhZGVyRmlsZSh3IGlvLldyaXRlciwgaGVhZGVyRmlsZSBpby5SZWFkZXIsIGxpYiBzdHJpbmcsIHJlYXNvbnMgbWFwW3N0cmluZ11pbnQpIGVycm9yIHsKK2Z1bmMgd3JpdGVIZWFkZXJGaWxlKHcgaW8uV3JpdGVyLCBoZWFkZXJGaWxlIGlvLlJlYWRlciwgbGliIHN0cmluZywgZnVuY3Rpb25zLCByZWFzb25zIG1hcFtzdHJpbmddaW50KSBlcnJvciB7CiAJdmFyIGxhc3QgW11ieXRlCiAJdmFyIGhhdmVMYXN0LCBzYXdEZWZpbmUgYm9vbAogCW5ld0xpbmUgOj0gW11ieXRlKCJcbiIpCkBAIC0yMTEsNyArMjIzLDcgQEAKIAlzY2FubmVyIDo9IGJ1ZmlvLk5ld1NjYW5uZXIoaGVhZGVyRmlsZSkKIAlmb3Igc2Nhbm5lci5TY2FuKCkgewogCQlsaW5lIDo9IHNjYW5uZXIuVGV4dCgpCi0JCV8sIF8sIG9rIDo9IHBhcnNlRGVmaW5lTGluZShsaW5lLCBsaWIpCisJCV8sIF8sIF8sIG9rIDo9IHBhcnNlRGVmaW5lTGluZShsaW5lLCBsaWIpCiAJCWlmIG9rIHsKIAkJCXNhd0RlZmluZSA9IHRydWUKIAkJCWNvbnRpbnVlCkBAIC0yMzUsNiArMjQ3LDcgQEAKIAkJcmV0dXJuIGVycgogCX0KIAorCW91dHB1dEFzc2lnbm1lbnRzKHcsIGZ1bmN0aW9ucykKIAlvdXRwdXRBc3NpZ25tZW50cyh3LCByZWFzb25zKQogCXcuV3JpdGUobmV3TGluZSkKIApAQCAtMjQ2LDkgKzI1OSwxNCBAQAogCXJldHVybiBuaWwKIH0KIAotZnVuYyBvdXRwdXRTdHJpbmdzKHcgaW8uV3JpdGVyLCBsaWIgc3RyaW5nLCBhc3NpZ25tZW50cyBtYXBbc3RyaW5nXWludCkgeworY29uc3QgKAorCXR5cGVGdW5jdGlvbnMgPSBpb3RhCisJdHlwZVJlYXNvbnMKKykKKworZnVuYyBvdXRwdXRTdHJpbmdzKHcgaW8uV3JpdGVyLCBsaWIgc3RyaW5nLCB0eSBpbnQsIGFzc2lnbm1lbnRzIG1hcFtzdHJpbmddaW50KSB7CiAJbGliID0gc3RyaW5ncy5Ub1VwcGVyKGxpYikKLQlwcmVmaXhMZW4gOj0gbGVuKGxpYiArICJfUl8iKQorCXByZWZpeExlbiA6PSBsZW4obGliICsgIl9GXyIpCiAKIAlrZXlzIDo9IG1ha2UoW11zdHJpbmcsIDAsIGxlbihhc3NpZ25tZW50cykpCiAJZm9yIGtleSA6PSByYW5nZSBhc3NpZ25tZW50cyB7CkBAIC0yNTcsNyArMjc1LDExIEBACiAJc29ydC5TdHJpbmdzKGtleXMpCiAKIAlmb3IgXywga2V5IDo9IHJhbmdlIGtleXMgewotCQlmbXQuRnByaW50Zih3LCAiJXMsJWQsJXNcbiIsIGxpYiwgYXNzaWdubWVudHNba2V5XSwga2V5W3ByZWZpeExlbjpdKQorCQl0eXBlU3RyaW5nIDo9ICJmdW5jdGlvbiIKKwkJaWYgdHkgPT0gdHlwZVJlYXNvbnMgeworCQkJdHlwZVN0cmluZyA9ICJyZWFzb24iCisJCX0KKwkJZm10LkZwcmludGYodywgIiVzLCVzLCVkLCVzXG4iLCBsaWIsIHR5cGVTdHJpbmcsIGFzc2lnbm1lbnRzW2tleV0sIGtleVtwcmVmaXhMZW46XSkKIAl9CiB9CiAKQEAgLTMxNyw3ICszMzksNyBAQAogCX0KIH0KIAotZnVuYyBhZGRSZWFzb25zKHJlYXNvbnMgbWFwW3N0cmluZ11pbnQsIGZpbGVuYW1lLCBwcmVmaXggc3RyaW5nKSBlcnJvciB7CitmdW5jIGFkZEZ1bmN0aW9uc0FuZFJlYXNvbnMoZnVuY3Rpb25zLCByZWFzb25zIG1hcFtzdHJpbmddaW50LCBmaWxlbmFtZSwgcHJlZml4IHN0cmluZykgZXJyb3IgewogCWZpbGUsIGVyciA6PSBvcy5PcGVuKGZpbGVuYW1lKQogCWlmIGVyciAhPSBuaWwgewogCQlyZXR1cm4gZXJyCkBAIC0zMjUsMTUgKzM0Nyw0NSBAQAogCWRlZmVyIGZpbGUuQ2xvc2UoKQogCiAJcmVhc29uUHJlZml4IDo9IHByZWZpeCArICJfUl8iCisJdmFyIGN1cnJlbnRGdW5jdGlvbiBzdHJpbmcKIAogCXNjYW5uZXIgOj0gYnVmaW8uTmV3U2Nhbm5lcihmaWxlKQogCWZvciBzY2FubmVyLlNjYW4oKSB7CiAJCWxpbmUgOj0gc2Nhbm5lci5UZXh0KCkKIAorCQlpZiBsZW4obGluZSkgPiAwICYmIHVuaWNvZGUuSXNMZXR0ZXIocnVuZShsaW5lWzBdKSkgeworCQkJLyogRnVuY3Rpb24gc3RhcnQgKi8KKwkJCWZpZWxkcyA6PSBzdHJpbmdzLkZpZWxkcyhsaW5lKQorCQkJZm9yIF8sIGZpZWxkIDo9IHJhbmdlIGZpZWxkcyB7CisJCQkJaWYgaSA6PSBzdHJpbmdzLkluZGV4KGZpZWxkLCAiKCIpOyBpICE9IC0xIHsKKwkJCQkJZiA6PSBmaWVsZFs6aV0KKwkJCQkJLy8gVGhlIHJldHVybiB0eXBlIG9mIHNvbWUgZnVuY3Rpb25zIGlzCisJCQkJCS8vIGEgbWFjcm8gdGhhdCBjb250YWlucyBhICIoIi4KKwkJCQkJaWYgZiA9PSAiU1RBQ0tfT0YiIHsKKwkJCQkJCWNvbnRpbnVlCisJCQkJCX0KKwkJCQkJY3VycmVudEZ1bmN0aW9uID0gZgorCQkJCQlmb3IgbGVuKGN1cnJlbnRGdW5jdGlvbikgPiAwICYmIGN1cnJlbnRGdW5jdGlvblswXSA9PSAnKicgeworCQkJCQkJY3VycmVudEZ1bmN0aW9uID0gY3VycmVudEZ1bmN0aW9uWzE6XQorCQkJCQl9CisJCQkJCWJyZWFrCisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gRG8gbm90IGluY2x1ZGUgY3Jvc3MtbW9kdWxlIGVycm9yIGxpbmVzLgorCQlpZiBzdHJpbmdzLkNvbnRhaW5zKGxpbmUsICJPUEVOU1NMX1BVVF9FUlJPUigiICsgcHJlZml4ICsgIiwiKSB7CisJCQlmdW5jdGlvblRva2VuIDo9IHByZWZpeCArICJfRl8iICsgY3VycmVudEZ1bmN0aW9uCisJCQlpZiBfLCBvayA6PSBmdW5jdGlvbnNbZnVuY3Rpb25Ub2tlbl07ICFvayB7CisJCQkJZnVuY3Rpb25zW2Z1bmN0aW9uVG9rZW5dID0gLTEKKwkJCX0KKwkJfQorCiAJCWhhbmRsZURlY2xhcmVNYWNybyhsaW5lLCAiX1JfIiwgIk9QRU5TU0xfREVDTEFSRV9FUlJPUl9SRUFTT04oIiwgcmVhc29ucykKKwkJaGFuZGxlRGVjbGFyZU1hY3JvKGxpbmUsICJfRl8iLCAiT1BFTlNTTF9ERUNMQVJFX0VSUk9SX0ZVTkNUSU9OKCIsIGZ1bmN0aW9ucykKIAogCQlmb3IgbGVuKGxpbmUpID4gMCB7Ci0JCQlpIDo9IHN0cmluZ3MuSW5kZXgobGluZSwgcHJlZml4KyJfIikKKwkJCWkgOj0gc3RyaW5ncy5JbmRleChsaW5lLCBwcmVmaXggKyAiXyIpCiAJCQlpZiBpID09IC0xIHsKIAkJCQlicmVhawogCQkJfQpAQCAtMzYxLDE3ICs0MTMsMjUgQEAKIAlyZXR1cm4gc2Nhbm5lci5FcnIoKQogfQogCi1mdW5jIHBhcnNlSGVhZGVyKGxpYiBzdHJpbmcsIGZpbGUgaW8uUmVhZGVyKSAocmVhc29ucyBtYXBbc3RyaW5nXWludCwgZXJyIGVycm9yKSB7CitmdW5jIHBhcnNlSGVhZGVyKGxpYiBzdHJpbmcsIGZpbGUgaW8uUmVhZGVyKSAoZnVuY3Rpb25zLCByZWFzb25zIG1hcFtzdHJpbmddaW50LCBlcnIgZXJyb3IpIHsKKwlmdW5jdGlvbnMgPSBtYWtlKG1hcFtzdHJpbmddaW50KQogCXJlYXNvbnMgPSBtYWtlKG1hcFtzdHJpbmddaW50KQogCiAJc2Nhbm5lciA6PSBidWZpby5OZXdTY2FubmVyKGZpbGUpCiAJZm9yIHNjYW5uZXIuU2NhbigpIHsKLQkJa2V5LCB2YWx1ZSwgb2sgOj0gcGFyc2VEZWZpbmVMaW5lKHNjYW5uZXIuVGV4dCgpLCBsaWIpCisJCXR5cCwga2V5LCB2YWx1ZSwgb2sgOj0gcGFyc2VEZWZpbmVMaW5lKHNjYW5uZXIuVGV4dCgpLCBsaWIpCiAJCWlmICFvayB7CiAJCQljb250aW51ZQogCQl9CiAKLQkJcmVhc29uc1trZXldID0gdmFsdWUKKwkJc3dpdGNoIHR5cCB7CisJCWNhc2UgdHlwZUZ1bmN0aW9uczoKKwkJCWZ1bmN0aW9uc1trZXldID0gdmFsdWUKKwkJY2FzZSB0eXBlUmVhc29uczoKKwkJCXJlYXNvbnNba2V5XSA9IHZhbHVlCisJCWRlZmF1bHQ6CisJCQlwYW5pYygiaW50ZXJuYWwgZXJyb3IiKQorCQl9CiAJfQogCiAJZXJyID0gc2Nhbm5lci5FcnIoKQpkaWZmIC0tZ2l0IGEvc3NsLXNvdXJjZXMubWsgYi9zc2wtc291cmNlcy5tawppbmRleCBhNGM4NDcwLi4wZDE1YmFjIDEwMDY0NAotLS0gYS9zc2wtc291cmNlcy5taworKysgYi9zc2wtc291cmNlcy5tawpAQCAtMSw1ICsxLDUgQEAKIExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTICs9ICQoTE9DQUxfUEFUSCkvc291cmNlcy5tawogaW5jbHVkZSAkKExPQ0FMX1BBVEgpL3NvdXJjZXMubWsKIAotTE9DQUxfQ0ZMQUdTICs9IC1JJChMT0NBTF9QQVRIKS9zcmMvaW5jbHVkZSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLURCT1JJTkdTU0xfQU5EUk9JRF9TWVNURU0KK0xPQ0FMX0NGTEFHUyArPSAtSSQoTE9DQUxfUEFUSCkvc3JjL2luY2x1ZGUgLVduby11bnVzZWQtcGFyYW1ldGVyCiBMT0NBTF9TUkNfRklMRVMgKz0gJChzc2xfc291cmNlcykKZGlmZiAtLWdpdCBhL3dpbi14ODYvY3J5cHRvL2NwdS14ODYtYXNtLmFzbSBiL3dpbi14ODYvY3J5cHRvL2NwdS14ODYtYXNtLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzE3YTczCi0tLSAvZGV2L251bGwKKysrIGIvd2luLXg4Ni9jcnlwdG8vY3B1LXg4Ni1hc20uYXNtCkBAIC0wLDAgKzEsMzAzIEBACislaWZpZG4gX19PVVRQVVRfRk9STUFUX18sb2JqCitzZWN0aW9uCWNvZGUJdXNlMzIgY2xhc3M9Y29kZSBhbGlnbj02NAorJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sd2luMzIKKyVpZmRlZiBfX1lBU01fVkVSU0lPTl9JRF9fCislaWYgX19ZQVNNX1ZFUlNJT05fSURfXyA8IDAxMDEwMDAwaAorJWVycm9yIHlhc20gdmVyc2lvbiAxLjEuMCBvciBsYXRlciBuZWVkZWQuCislZW5kaWYKKzsgWWFzbSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIC4wMCBhbmQgY29tcGxhaW5zIGFib3V0IHJlZGVmaW5pbmcgaXQuCis7IGh0dHBzOi8vd3d3LnRvcnRhbGwubmV0L3Byb2plY3RzL3lhc20vbWFudWFsL2h0bWwvb2JqZm10LXdpbjMyLXNhZmVzZWguaHRtbAorJWVsc2UKKyRAZmVhdC4wMCBlcXUgMQorJWVuZGlmCitzZWN0aW9uCS50ZXh0CWNvZGUgYWxpZ249NjQKKyVlbHNlCitzZWN0aW9uCS50ZXh0CWNvZGUKKyVlbmRpZgorZ2xvYmFsCV9PUEVOU1NMX2lhMzJfY3B1aWQKK2FsaWduCTE2CitfT1BFTlNTTF9pYTMyX2NwdWlkOgorTCRfT1BFTlNTTF9pYTMyX2NwdWlkX2JlZ2luOgorCXB1c2gJZWJwCisJcHVzaAllYngKKwlwdXNoCWVzaQorCXB1c2gJZWRpCisJeG9yCWVkeCxlZHgKKwlwdXNoZmQKKwlwb3AJZWF4CisJbW92CWVjeCxlYXgKKwl4b3IJZWF4LDIwOTcxNTIKKwlwdXNoCWVheAorCXBvcGZkCisJcHVzaGZkCisJcG9wCWVheAorCXhvcgllY3gsZWF4CisJeG9yCWVheCxlYXgKKwlidAllY3gsMjEKKwlqbmMJTkVBUiBMJDAwMG5vY3B1aWQKKwltb3YJZXNpLERXT1JEIFsyMCtlc3BdCisJbW92CURXT1JEIFs4K2VzaV0sZWF4CisJY3B1aWQKKwltb3YJZWRpLGVheAorCXhvcgllYXgsZWF4CisJY21wCWVieCwxOTcwMTY5MTU5CisJc2V0bmUJYWwKKwltb3YJZWJwLGVheAorCWNtcAllZHgsMTIzMTM4NDE2OQorCXNldG5lCWFsCisJb3IJZWJwLGVheAorCWNtcAllY3gsMTgxODU4ODI3MAorCXNldG5lCWFsCisJb3IJZWJwLGVheAorCWp6CU5FQVIgTCQwMDFpbnRlbAorCWNtcAllYngsMTc1MjQ2MjY1NworCXNldG5lCWFsCisJbW92CWVzaSxlYXgKKwljbXAJZWR4LDE3NjkyMzgxMTcKKwlzZXRuZQlhbAorCW9yCWVzaSxlYXgKKwljbXAJZWN4LDExNDU5MTM2OTkKKwlzZXRuZQlhbAorCW9yCWVzaSxlYXgKKwlqbnoJTkVBUiBMJDAwMWludGVsCisJbW92CWVheCwyMTQ3NDgzNjQ4CisJY3B1aWQKKwljbXAJZWF4LDIxNDc0ODM2NDkKKwlqYglORUFSIEwkMDAxaW50ZWwKKwltb3YJZXNpLGVheAorCW1vdgllYXgsMjE0NzQ4MzY0OQorCWNwdWlkCisJb3IJZWJwLGVjeAorCWFuZAllYnAsMjA0OQorCWNtcAllc2ksMjE0NzQ4MzY1NgorCWpiCU5FQVIgTCQwMDFpbnRlbAorCW1vdgllYXgsMjE0NzQ4MzY1NgorCWNwdWlkCisJbW92engJZXNpLGNsCisJaW5jCWVzaQorCW1vdgllYXgsMQorCXhvcgllY3gsZWN4CisJY3B1aWQKKwlidAllZHgsMjgKKwlqbmMJTkVBUiBMJDAwMmdlbmVyaWMKKwlzaHIJZWJ4LDE2CisJYW5kCWVieCwyNTUKKwljbXAJZWJ4LGVzaQorCWphCU5FQVIgTCQwMDJnZW5lcmljCisJYW5kCWVkeCw0MDI2NTMxODM5CisJam1wCU5FQVIgTCQwMDJnZW5lcmljCitMJDAwMWludGVsOgorCWNtcAllZGksNworCWpiCU5FQVIgTCQwMDNjYWNoZWluZm8KKwltb3YJZXNpLERXT1JEIFsyMCtlc3BdCisJbW92CWVheCw3CisJeG9yCWVjeCxlY3gKKwljcHVpZAorCW1vdglEV09SRCBbOCtlc2ldLGVieAorTCQwMDNjYWNoZWluZm86CisJY21wCWVkaSw0CisJbW92CWVkaSwtMQorCWpiCU5FQVIgTCQwMDRub2NhY2hlaW5mbworCW1vdgllYXgsNAorCW1vdgllY3gsMAorCWNwdWlkCisJbW92CWVkaSxlYXgKKwlzaHIJZWRpLDE0CisJYW5kCWVkaSw0MDk1CitMJDAwNG5vY2FjaGVpbmZvOgorCW1vdgllYXgsMQorCXhvcgllY3gsZWN4CisJY3B1aWQKKwlhbmQJZWR4LDMyMjAxNzY4OTUKKwljbXAJZWJwLDAKKwlqbmUJTkVBUiBMJDAwNW5vdGludGVsCisJb3IJZWR4LDEwNzM3NDE4MjQKK0wkMDA1bm90aW50ZWw6CisJYnQJZWR4LDI4CisJam5jCU5FQVIgTCQwMDJnZW5lcmljCisJYW5kCWVkeCw0MDI2NTMxODM5CisJY21wCWVkaSwwCisJamUJTkVBUiBMJDAwMmdlbmVyaWMKKwlvcgllZHgsMjY4NDM1NDU2CisJc2hyCWVieCwxNgorCWNtcAlibCwxCisJamEJTkVBUiBMJDAwMmdlbmVyaWMKKwlhbmQJZWR4LDQwMjY1MzE4MzkKK0wkMDAyZ2VuZXJpYzoKKwlhbmQJZWJwLDIwNDgKKwlhbmQJZWN4LDQyOTQ5NjUyNDcKKwltb3YJZXNpLGVkeAorCW9yCWVicCxlY3gKKwlidAllY3gsMjcKKwlqbmMJTkVBUiBMJDAwNmNsZWFyX2F2eAorCXhvcgllY3gsZWN4CitkYgkxNSwxLDIwOAorCWFuZAllYXgsNgorCWNtcAllYXgsNgorCWplCU5FQVIgTCQwMDdkb25lCisJY21wCWVheCwyCisJamUJTkVBUiBMJDAwNmNsZWFyX2F2eAorTCQwMDhjbGVhcl94bW06CisJYW5kCWVicCw0MjYxNDEyODYxCisJYW5kCWVzaSw0Mjc4MTkwMDc5CitMJDAwNmNsZWFyX2F2eDoKKwlhbmQJZWJwLDQwMjY1MjU2OTUKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJYW5kCURXT1JEIFs4K2VkaV0sNDI5NDk2NzI2MworTCQwMDdkb25lOgorCW1vdgllYXgsZXNpCisJbW92CWVkeCxlYnAKK0wkMDAwbm9jcHVpZDoKKwlwb3AJZWRpCisJcG9wCWVzaQorCXBvcAllYngKKwlwb3AJZWJwCisJcmV0Cis7ZXh0ZXJuCV9PUEVOU1NMX2lhMzJjYXBfUAorZ2xvYmFsCV9PUEVOU1NMX3JkdHNjCithbGlnbgkxNgorX09QRU5TU0xfcmR0c2M6CitMJF9PUEVOU1NMX3JkdHNjX2JlZ2luOgorCXhvcgllYXgsZWF4CisJeG9yCWVkeCxlZHgKKwlsZWEJZWN4LFtfT1BFTlNTTF9pYTMyY2FwX1BdCisJYnQJRFdPUkQgW2VjeF0sNAorCWpuYwlORUFSIEwkMDA5bm90c2MKKwlyZHRzYworTCQwMDlub3RzYzoKKwlyZXQKK2dsb2JhbAlfT1BFTlNTTF9pbnN0cnVtZW50X2hhbHQKK2FsaWduCTE2CitfT1BFTlNTTF9pbnN0cnVtZW50X2hhbHQ6CitMJF9PUEVOU1NMX2luc3RydW1lbnRfaGFsdF9iZWdpbjoKKwlsZWEJZWN4LFtfT1BFTlNTTF9pYTMyY2FwX1BdCisJYnQJRFdPUkQgW2VjeF0sNAorCWpuYwlORUFSIEwkMDEwbm9oYWx0CitkZAkyNDIxNzIzMTUwCisJYW5kCWVheCwzCisJam56CU5FQVIgTCQwMTBub2hhbHQKKwlwdXNoZmQKKwlwb3AJZWF4CisJYnQJZWF4LDkKKwlqbmMJTkVBUiBMJDAxMG5vaGFsdAorCXJkdHNjCisJcHVzaAllZHgKKwlwdXNoCWVheAorCWhsdAorCXJkdHNjCisJc3ViCWVheCxEV09SRCBbZXNwXQorCXNiYgllZHgsRFdPUkQgWzQrZXNwXQorCWFkZAllc3AsOAorCXJldAorTCQwMTBub2hhbHQ6CisJeG9yCWVheCxlYXgKKwl4b3IJZWR4LGVkeAorCXJldAorZ2xvYmFsCV9PUEVOU1NMX2Zhcl9zcGluCithbGlnbgkxNgorX09QRU5TU0xfZmFyX3NwaW46CitMJF9PUEVOU1NMX2Zhcl9zcGluX2JlZ2luOgorCXB1c2hmZAorCXBvcAllYXgKKwlidAllYXgsOQorCWpuYwlORUFSIEwkMDExbm9zcGluCisJbW92CWVheCxEV09SRCBbNCtlc3BdCisJbW92CWVjeCxEV09SRCBbOCtlc3BdCitkZAkyNDMwMTExMjYyCisJeG9yCWVheCxlYXgKKwltb3YJZWR4LERXT1JEIFtlY3hdCisJam1wCU5FQVIgTCQwMTJzcGluCithbGlnbgkxNgorTCQwMTJzcGluOgorCWluYwllYXgKKwljbXAJZWR4LERXT1JEIFtlY3hdCisJamUJTkVBUiBMJDAxMnNwaW4KK2RkCTUyOTU2Nzg4OAorCXJldAorTCQwMTFub3NwaW46CisJeG9yCWVheCxlYXgKKwl4b3IJZWR4LGVkeAorCXJldAorZ2xvYmFsCV9PUEVOU1NMX3dpcGVfY3B1CithbGlnbgkxNgorX09QRU5TU0xfd2lwZV9jcHU6CitMJF9PUEVOU1NMX3dpcGVfY3B1X2JlZ2luOgorCXhvcgllYXgsZWF4CisJeG9yCWVkeCxlZHgKKwlsZWEJZWN4LFtfT1BFTlNTTF9pYTMyY2FwX1BdCisJbW92CWVjeCxEV09SRCBbZWN4XQorCWJ0CURXT1JEIFtlY3hdLDEKKwlqbmMJTkVBUiBMJDAxM25vX3g4NworCWFuZAllY3gsODM4ODYwODAKKwljbXAJZWN4LDgzODg2MDgwCisJam5lCU5FQVIgTCQwMTRub19zc2UyCisJcHhvcgl4bW0wLHhtbTAKKwlweG9yCXhtbTEseG1tMQorCXB4b3IJeG1tMix4bW0yCisJcHhvcgl4bW0zLHhtbTMKKwlweG9yCXhtbTQseG1tNAorCXB4b3IJeG1tNSx4bW01CisJcHhvcgl4bW02LHhtbTYKKwlweG9yCXhtbTcseG1tNworTCQwMTRub19zc2UyOgorZGQJNDAwNzI1OTg2NSw0MDA3MjU5ODY1LDQwMDcyNTk4NjUsNDAwNzI1OTg2NSwyNDMwODUxOTk1CitMJDAxM25vX3g4NzoKKwlsZWEJZWF4LFs0K2VzcF0KKwlyZXQKK2dsb2JhbAlfT1BFTlNTTF9hdG9taWNfYWRkCithbGlnbgkxNgorX09QRU5TU0xfYXRvbWljX2FkZDoKK0wkX09QRU5TU0xfYXRvbWljX2FkZF9iZWdpbjoKKwltb3YJZWR4LERXT1JEIFs0K2VzcF0KKwltb3YJZWN4LERXT1JEIFs4K2VzcF0KKwlwdXNoCWVieAorCW5vcAorCW1vdgllYXgsRFdPUkQgW2VkeF0KK0wkMDE1c3BpbjoKKwlsZWEJZWJ4LFtlY3gqMStlYXhdCisJbm9wCitkZAk0NDc4MTE1NjgKKwlqbmUJTkVBUiBMJDAxNXNwaW4KKwltb3YJZWF4LGVieAorCXBvcAllYngKKwlyZXQKK2dsb2JhbAlfT1BFTlNTTF9pbmRpcmVjdF9jYWxsCithbGlnbgkxNgorX09QRU5TU0xfaW5kaXJlY3RfY2FsbDoKK0wkX09QRU5TU0xfaW5kaXJlY3RfY2FsbF9iZWdpbjoKKwlwdXNoCWVicAorCW1vdgllYnAsZXNwCisJc3ViCWVzcCwyOAorCW1vdgllY3gsRFdPUkQgWzEyK2VicF0KKwltb3YJRFdPUkQgW2VzcF0sZWN4CisJbW92CWVkeCxEV09SRCBbMTYrZWJwXQorCW1vdglEV09SRCBbNCtlc3BdLGVkeAorCW1vdgllYXgsRFdPUkQgWzIwK2VicF0KKwltb3YJRFdPUkQgWzgrZXNwXSxlYXgKKwltb3YJZWF4LERXT1JEIFsyNCtlYnBdCisJbW92CURXT1JEIFsxMitlc3BdLGVheAorCW1vdgllYXgsRFdPUkQgWzI4K2VicF0KKwltb3YJRFdPUkQgWzE2K2VzcF0sZWF4CisJbW92CWVheCxEV09SRCBbMzIrZWJwXQorCW1vdglEV09SRCBbMjArZXNwXSxlYXgKKwltb3YJZWF4LERXT1JEIFszNitlYnBdCisJbW92CURXT1JEIFsyNCtlc3BdLGVheAorCWNhbGwJRFdPUkQgWzgrZWJwXQorCW1vdgllc3AsZWJwCisJcG9wCWVicAorCXJldAorZ2xvYmFsCV9PUEVOU1NMX2lhMzJfcmRyYW5kCithbGlnbgkxNgorX09QRU5TU0xfaWEzMl9yZHJhbmQ6CitMJF9PUEVOU1NMX2lhMzJfcmRyYW5kX2JlZ2luOgorCW1vdgllY3gsOAorTCQwMTZsb29wOgorZGIJMTUsMTk5LDI0MAorCWpjCU5FQVIgTCQwMTdicmVhaworCWxvb3AJTCQwMTZsb29wCitMJDAxN2JyZWFrOgorCWNtcAllYXgsMAorCWNtb3ZlCWVheCxlY3gKKwlyZXQKK3NlZ21lbnQJLmJzcworY29tbW9uCV9PUEVOU1NMX2lhMzJjYXBfUCAxNgpkaWZmIC0tZ2l0IGEvd2luLXg4Nl82NC9jcnlwdG8vYm4vbW9kZXhwNTEyLXg4Nl82NC5hc20gYi93aW4teDg2XzY0L2NyeXB0by9ibi9tb2RleHA1MTIteDg2XzY0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2U0YTYxCi0tLSAvZGV2L251bGwKKysrIGIvd2luLXg4Nl82NC9jcnlwdG8vYm4vbW9kZXhwNTEyLXg4Nl82NC5hc20KQEAgLTAsMCArMSwxODg3IEBACitPUFRJT04JRE9UTkFNRQorLnRleHQkCVNFR01FTlQgQUxJR04oMjU2KSAnQ09ERScKKworCitBTElHTgkxNgorTVVMQUREXzEyOHg1MTIJUFJPQyBQUklWQVRFCisJbW92CXJheCxRV09SRCBQVFJbcnNpXQorCW11bAlyYnAKKwlhZGQJcjgscmF4CisJYWRjCXJkeCwwCisJbW92CVFXT1JEIFBUUltyY3hdLHI4CisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzgrcnNpXQorCW11bAlyYnAKKwlhZGQJcjkscmF4CisJYWRjCXJkeCwwCisJYWRkCXI5LHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUlsxNityc2ldCisJbXVsCXJicAorCWFkZAlyMTAscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMCxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbMjQrcnNpXQorCW11bAlyYnAKKwlhZGQJcjExLHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTEscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzMyK3JzaV0KKwltdWwJcmJwCisJYWRkCXIxMixyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjEyLHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUls0MCtyc2ldCisJbXVsCXJicAorCWFkZAlyMTMscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMyxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbNDgrcnNpXQorCW11bAlyYnAKKwlhZGQJcjE0LHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTQscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzU2K3JzaV0KKwltdWwJcmJwCisJYWRkCXIxNSxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjE1LHJieAorCWFkYwlyZHgsMAorCW1vdglyOCxyZHgKKwltb3YJcmJwLFFXT1JEIFBUUls4K3JkaV0KKwltb3YJcmF4LFFXT1JEIFBUUltyc2ldCisJbXVsCXJicAorCWFkZAlyOSxyYXgKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkQgUFRSWzgrcmN4XSxyOQorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUls4K3JzaV0KKwltdWwJcmJwCisJYWRkCXIxMCxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjEwLHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUlsxNityc2ldCisJbXVsCXJicAorCWFkZAlyMTEscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMSxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbMjQrcnNpXQorCW11bAlyYnAKKwlhZGQJcjEyLHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTIscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzMyK3JzaV0KKwltdWwJcmJwCisJYWRkCXIxMyxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjEzLHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUls0MCtyc2ldCisJbXVsCXJicAorCWFkZAlyMTQscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxNCxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbNDgrcnNpXQorCW11bAlyYnAKKwlhZGQJcjE1LHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTUscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzU2K3JzaV0KKwltdWwJcmJwCisJYWRkCXI4LHJheAorCWFkYwlyZHgsMAorCWFkZAlyOCxyYngKKwlhZGMJcmR4LDAKKwltb3YJcjkscmR4CisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CitNVUxBRERfMTI4eDUxMglFTkRQCisKK0FMSUdOCTE2Cittb250X3JlZHVjZQlQUk9DIFBSSVZBVEUKKwlsZWEJcmRpLFFXT1JEIFBUUlsxOTIrcnNwXQorCW1vdglyc2ksUVdPUkQgUFRSWzMyK3JzcF0KKwlhZGQJcnNpLDU3NgorCWxlYQlyY3gsUVdPUkQgUFRSWzUyMCtyc3BdCisKKwltb3YJcmJwLFFXT1JEIFBUUls5NityY3hdCisJbW92CXJheCxRV09SRCBQVFJbcnNpXQorCW11bAlyYnAKKwltb3YJcjgsUVdPUkQgUFRSW3JjeF0KKwlhZGQJcjgscmF4CisJYWRjCXJkeCwwCisJbW92CVFXT1JEIFBUUltyZGldLHI4CisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzgrcnNpXQorCW11bAlyYnAKKwltb3YJcjksUVdPUkQgUFRSWzgrcmN4XQorCWFkZAlyOSxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjkscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzE2K3JzaV0KKwltdWwJcmJwCisJbW92CXIxMCxRV09SRCBQVFJbMTYrcmN4XQorCWFkZAlyMTAscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMCxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbMjQrcnNpXQorCW11bAlyYnAKKwltb3YJcjExLFFXT1JEIFBUUlsyNCtyY3hdCisJYWRkCXIxMSxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjExLHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUlszMityc2ldCisJbXVsCXJicAorCW1vdglyMTIsUVdPUkQgUFRSWzMyK3JjeF0KKwlhZGQJcjEyLHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTIscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzQwK3JzaV0KKwltdWwJcmJwCisJbW92CXIxMyxRV09SRCBQVFJbNDArcmN4XQorCWFkZAlyMTMscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMyxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbNDgrcnNpXQorCW11bAlyYnAKKwltb3YJcjE0LFFXT1JEIFBUUls0OCtyY3hdCisJYWRkCXIxNCxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjE0LHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUls1Nityc2ldCisJbXVsCXJicAorCW1vdglyMTUsUVdPUkQgUFRSWzU2K3JjeF0KKwlhZGQJcjE1LHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTUscmJ4CisJYWRjCXJkeCwwCisJbW92CXI4LHJkeAorCW1vdglyYnAsUVdPUkQgUFRSWzEwNCtyY3hdCisJbW92CXJheCxRV09SRCBQVFJbcnNpXQorCW11bAlyYnAKKwlhZGQJcjkscmF4CisJYWRjCXJkeCwwCisJbW92CVFXT1JEIFBUUls4K3JkaV0scjkKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbOCtyc2ldCisJbXVsCXJicAorCWFkZAlyMTAscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMCxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbMTYrcnNpXQorCW11bAlyYnAKKwlhZGQJcjExLHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTEscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzI0K3JzaV0KKwltdWwJcmJwCisJYWRkCXIxMixyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjEyLHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUlszMityc2ldCisJbXVsCXJicAorCWFkZAlyMTMscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMyxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbNDArcnNpXQorCW11bAlyYnAKKwlhZGQJcjE0LHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTQscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzQ4K3JzaV0KKwltdWwJcmJwCisJYWRkCXIxNSxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjE1LHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUls1Nityc2ldCisJbXVsCXJicAorCWFkZAlyOCxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjgscmJ4CisJYWRjCXJkeCwwCisJbW92CXI5LHJkeAorCW1vdglyYnAsUVdPUkQgUFRSWzExMityY3hdCisJbW92CXJheCxRV09SRCBQVFJbcnNpXQorCW11bAlyYnAKKwlhZGQJcjEwLHJheAorCWFkYwlyZHgsMAorCW1vdglRV09SRCBQVFJbMTYrcmRpXSxyMTAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbOCtyc2ldCisJbXVsCXJicAorCWFkZAlyMTEscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMSxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbMTYrcnNpXQorCW11bAlyYnAKKwlhZGQJcjEyLHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTIscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzI0K3JzaV0KKwltdWwJcmJwCisJYWRkCXIxMyxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjEzLHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUlszMityc2ldCisJbXVsCXJicAorCWFkZAlyMTQscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxNCxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbNDArcnNpXQorCW11bAlyYnAKKwlhZGQJcjE1LHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTUscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzQ4K3JzaV0KKwltdWwJcmJwCisJYWRkCXI4LHJheAorCWFkYwlyZHgsMAorCWFkZAlyOCxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbNTYrcnNpXQorCW11bAlyYnAKKwlhZGQJcjkscmF4CisJYWRjCXJkeCwwCisJYWRkCXI5LHJieAorCWFkYwlyZHgsMAorCW1vdglyMTAscmR4CisJbW92CXJicCxRV09SRCBQVFJbMTIwK3JjeF0KKwltb3YJcmF4LFFXT1JEIFBUUltyc2ldCisJbXVsCXJicAorCWFkZAlyMTEscmF4CisJYWRjCXJkeCwwCisJbW92CVFXT1JEIFBUUlsyNCtyZGldLHIxMQorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUls4K3JzaV0KKwltdWwJcmJwCisJYWRkCXIxMixyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjEyLHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUlsxNityc2ldCisJbXVsCXJicAorCWFkZAlyMTMscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMyxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbMjQrcnNpXQorCW11bAlyYnAKKwlhZGQJcjE0LHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTQscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzMyK3JzaV0KKwltdWwJcmJwCisJYWRkCXIxNSxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjE1LHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUls0MCtyc2ldCisJbXVsCXJicAorCWFkZAlyOCxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjgscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzQ4K3JzaV0KKwltdWwJcmJwCisJYWRkCXI5LHJheAorCWFkYwlyZHgsMAorCWFkZAlyOSxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbNTYrcnNpXQorCW11bAlyYnAKKwlhZGQJcjEwLHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTAscmJ4CisJYWRjCXJkeCwwCisJbW92CXIxMSxyZHgKKwl4b3IJcmF4LHJheAorCisJYWRkCXI4LFFXT1JEIFBUUls2NCtyY3hdCisJYWRjCXI5LFFXT1JEIFBUUls3MityY3hdCisJYWRjCXIxMCxRV09SRCBQVFJbODArcmN4XQorCWFkYwlyMTEsUVdPUkQgUFRSWzg4K3JjeF0KKwlhZGMJcmF4LDAKKworCisKKworCW1vdglRV09SRCBQVFJbNjQrcmRpXSxyOAorCW1vdglRV09SRCBQVFJbNzIrcmRpXSxyOQorCW1vdglyYnAscjEwCisJbW92CVFXT1JEIFBUUls4OCtyZGldLHIxMQorCisJbW92CVFXT1JEIFBUUlszODQrcnNwXSxyYXgKKworCW1vdglyOCxRV09SRCBQVFJbcmRpXQorCW1vdglyOSxRV09SRCBQVFJbOCtyZGldCisJbW92CXIxMCxRV09SRCBQVFJbMTYrcmRpXQorCW1vdglyMTEsUVdPUkQgUFRSWzI0K3JkaV0KKworCisKKworCisKKworCisJYWRkCXJkaSw4KjEwCisKKwlhZGQJcnNpLDY0CisJbGVhCXJjeCxRV09SRCBQVFJbMjk2K3JzcF0KKworCWNhbGwJTVVMQUREXzEyOHg1MTIKKworCW1vdglyYXgsUVdPUkQgUFRSWzM4NCtyc3BdCisKKworCWFkZAlyOCxRV09SRCBQVFJbKCgtMTYpKStyZGldCisJYWRjCXI5LFFXT1JEIFBUUlsoKC04KSkrcmRpXQorCW1vdglRV09SRCBQVFJbNjQrcmN4XSxyOAorCW1vdglRV09SRCBQVFJbNzIrcmN4XSxyOQorCisJYWRjCXJheCxyYXgKKwltb3YJUVdPUkQgUFRSWzM4NCtyc3BdLHJheAorCisJbGVhCXJkaSxRV09SRCBQVFJbMTkyK3JzcF0KKwlhZGQJcnNpLDY0CisKKworCisKKworCW1vdglyOCxRV09SRCBQVFJbcnNpXQorCW1vdglyYngsUVdPUkQgUFRSWzgrcnNpXQorCisJbW92CXJheCxRV09SRCBQVFJbcmN4XQorCW11bAlyOAorCW1vdglyYnAscmF4CisJbW92CXI5LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbOCtyY3hdCisJbXVsCXI4CisJYWRkCXI5LHJheAorCisJbW92CXJheCxRV09SRCBQVFJbcmN4XQorCW11bAlyYngKKwlhZGQJcjkscmF4CisKKwltb3YJUVdPUkQgUFRSWzgrcmRpXSxyOQorCisKKwlzdWIJcnNpLDE5MgorCisJbW92CXI4LFFXT1JEIFBUUltyY3hdCisJbW92CXI5LFFXT1JEIFBUUls4K3JjeF0KKworCWNhbGwJTVVMQUREXzEyOHg1MTIKKworCisKKworCW1vdglyYXgsUVdPUkQgUFRSW3JzaV0KKwltb3YJcmJ4LFFXT1JEIFBUUls4K3JzaV0KKwltb3YJcmRpLFFXT1JEIFBUUlsxNityc2ldCisJbW92CXJkeCxRV09SRCBQVFJbMjQrcnNpXQorCisKKwltb3YJcmJwLFFXT1JEIFBUUlszODQrcnNwXQorCisJYWRkCXI4LFFXT1JEIFBUUls2NCtyY3hdCisJYWRjCXI5LFFXT1JEIFBUUls3MityY3hdCisKKworCWFkYwlyYnAscmJwCisKKworCisJc2hsCXJicCwzCisJbW92CXJjeCxRV09SRCBQVFJbMzIrcnNwXQorCWFkZAlyYnAscmN4CisKKworCXhvcglyc2kscnNpCisKKwlhZGQJcjEwLFFXT1JEIFBUUltyYnBdCisJYWRjCXIxMSxRV09SRCBQVFJbNjQrcmJwXQorCWFkYwlyMTIsUVdPUkQgUFRSWzEyOCtyYnBdCisJYWRjCXIxMyxRV09SRCBQVFJbMTkyK3JicF0KKwlhZGMJcjE0LFFXT1JEIFBUUlsyNTYrcmJwXQorCWFkYwlyMTUsUVdPUkQgUFRSWzMyMCtyYnBdCisJYWRjCXI4LFFXT1JEIFBUUlszODQrcmJwXQorCWFkYwlyOSxRV09SRCBQVFJbNDQ4K3JicF0KKworCisKKwlzYmIJcnNpLDAKKworCisJYW5kCXJheCxyc2kKKwlhbmQJcmJ4LHJzaQorCWFuZAlyZGkscnNpCisJYW5kCXJkeCxyc2kKKworCW1vdglyYnAsMQorCXN1YglyMTAscmF4CisJc2JiCXIxMSxyYngKKwlzYmIJcjEyLHJkaQorCXNiYglyMTMscmR4CisKKworCisKKwlzYmIJcmJwLDAKKworCisKKwlhZGQJcmN4LDUxMgorCW1vdglyYXgsUVdPUkQgUFRSWzMyK3JjeF0KKwltb3YJcmJ4LFFXT1JEIFBUUls0MCtyY3hdCisJbW92CXJkaSxRV09SRCBQVFJbNDgrcmN4XQorCW1vdglyZHgsUVdPUkQgUFRSWzU2K3JjeF0KKworCisKKwlhbmQJcmF4LHJzaQorCWFuZAlyYngscnNpCisJYW5kCXJkaSxyc2kKKwlhbmQJcmR4LHJzaQorCisKKworCXN1YglyYnAsMQorCisJc2JiCXIxNCxyYXgKKwlzYmIJcjE1LHJieAorCXNiYglyOCxyZGkKKwlzYmIJcjkscmR4CisKKworCisJbW92CXJzaSxRV09SRCBQVFJbMTQ0K3JzcF0KKwltb3YJUVdPUkQgUFRSW3JzaV0scjEwCisJbW92CVFXT1JEIFBUUls4K3JzaV0scjExCisJbW92CVFXT1JEIFBUUlsxNityc2ldLHIxMgorCW1vdglRV09SRCBQVFJbMjQrcnNpXSxyMTMKKwltb3YJUVdPUkQgUFRSWzMyK3JzaV0scjE0CisJbW92CVFXT1JEIFBUUls0MCtyc2ldLHIxNQorCW1vdglRV09SRCBQVFJbNDgrcnNpXSxyOAorCW1vdglRV09SRCBQVFJbNTYrcnNpXSxyOQorCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0Cittb250X3JlZHVjZQlFTkRQCisKK0FMSUdOCTE2Cittb250X211bF9hM2IJUFJPQyBQUklWQVRFCisKKworCisKKwltb3YJcmJwLFFXT1JEIFBUUltyZGldCisKKwltb3YJcmF4LHIxMAorCW11bAlyYnAKKwltb3YJUVdPUkQgUFRSWzUyMCtyc3BdLHJheAorCW1vdglyMTAscmR4CisJbW92CXJheCxyMTEKKwltdWwJcmJwCisJYWRkCXIxMCxyYXgKKwlhZGMJcmR4LDAKKwltb3YJcjExLHJkeAorCW1vdglyYXgscjEyCisJbXVsCXJicAorCWFkZAlyMTEscmF4CisJYWRjCXJkeCwwCisJbW92CXIxMixyZHgKKwltb3YJcmF4LHIxMworCW11bAlyYnAKKwlhZGQJcjEyLHJheAorCWFkYwlyZHgsMAorCW1vdglyMTMscmR4CisJbW92CXJheCxyMTQKKwltdWwJcmJwCisJYWRkCXIxMyxyYXgKKwlhZGMJcmR4LDAKKwltb3YJcjE0LHJkeAorCW1vdglyYXgscjE1CisJbXVsCXJicAorCWFkZAlyMTQscmF4CisJYWRjCXJkeCwwCisJbW92CXIxNSxyZHgKKwltb3YJcmF4LHI4CisJbXVsCXJicAorCWFkZAlyMTUscmF4CisJYWRjCXJkeCwwCisJbW92CXI4LHJkeAorCW1vdglyYXgscjkKKwltdWwJcmJwCisJYWRkCXI4LHJheAorCWFkYwlyZHgsMAorCW1vdglyOSxyZHgKKwltb3YJcmJwLFFXT1JEIFBUUls4K3JkaV0KKwltb3YJcmF4LFFXT1JEIFBUUltyc2ldCisJbXVsCXJicAorCWFkZAlyMTAscmF4CisJYWRjCXJkeCwwCisJbW92CVFXT1JEIFBUUls1MjgrcnNwXSxyMTAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbOCtyc2ldCisJbXVsCXJicAorCWFkZAlyMTEscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMSxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbMTYrcnNpXQorCW11bAlyYnAKKwlhZGQJcjEyLHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTIscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzI0K3JzaV0KKwltdWwJcmJwCisJYWRkCXIxMyxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjEzLHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUlszMityc2ldCisJbXVsCXJicAorCWFkZAlyMTQscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxNCxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbNDArcnNpXQorCW11bAlyYnAKKwlhZGQJcjE1LHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTUscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzQ4K3JzaV0KKwltdWwJcmJwCisJYWRkCXI4LHJheAorCWFkYwlyZHgsMAorCWFkZAlyOCxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbNTYrcnNpXQorCW11bAlyYnAKKwlhZGQJcjkscmF4CisJYWRjCXJkeCwwCisJYWRkCXI5LHJieAorCWFkYwlyZHgsMAorCW1vdglyMTAscmR4CisJbW92CXJicCxRV09SRCBQVFJbMTYrcmRpXQorCW1vdglyYXgsUVdPUkQgUFRSW3JzaV0KKwltdWwJcmJwCisJYWRkCXIxMSxyYXgKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkQgUFRSWzUzNityc3BdLHIxMQorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUls4K3JzaV0KKwltdWwJcmJwCisJYWRkCXIxMixyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjEyLHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUlsxNityc2ldCisJbXVsCXJicAorCWFkZAlyMTMscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMyxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbMjQrcnNpXQorCW11bAlyYnAKKwlhZGQJcjE0LHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTQscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzMyK3JzaV0KKwltdWwJcmJwCisJYWRkCXIxNSxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjE1LHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUls0MCtyc2ldCisJbXVsCXJicAorCWFkZAlyOCxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjgscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzQ4K3JzaV0KKwltdWwJcmJwCisJYWRkCXI5LHJheAorCWFkYwlyZHgsMAorCWFkZAlyOSxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbNTYrcnNpXQorCW11bAlyYnAKKwlhZGQJcjEwLHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTAscmJ4CisJYWRjCXJkeCwwCisJbW92CXIxMSxyZHgKKwltb3YJcmJwLFFXT1JEIFBUUlsyNCtyZGldCisJbW92CXJheCxRV09SRCBQVFJbcnNpXQorCW11bAlyYnAKKwlhZGQJcjEyLHJheAorCWFkYwlyZHgsMAorCW1vdglRV09SRCBQVFJbNTQ0K3JzcF0scjEyCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzgrcnNpXQorCW11bAlyYnAKKwlhZGQJcjEzLHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTMscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzE2K3JzaV0KKwltdWwJcmJwCisJYWRkCXIxNCxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjE0LHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUlsyNCtyc2ldCisJbXVsCXJicAorCWFkZAlyMTUscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxNSxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbMzIrcnNpXQorCW11bAlyYnAKKwlhZGQJcjgscmF4CisJYWRjCXJkeCwwCisJYWRkCXI4LHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUls0MCtyc2ldCisJbXVsCXJicAorCWFkZAlyOSxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjkscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzQ4K3JzaV0KKwltdWwJcmJwCisJYWRkCXIxMCxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjEwLHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUls1Nityc2ldCisJbXVsCXJicAorCWFkZAlyMTEscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMSxyYngKKwlhZGMJcmR4LDAKKwltb3YJcjEyLHJkeAorCW1vdglyYnAsUVdPUkQgUFRSWzMyK3JkaV0KKwltb3YJcmF4LFFXT1JEIFBUUltyc2ldCisJbXVsCXJicAorCWFkZAlyMTMscmF4CisJYWRjCXJkeCwwCisJbW92CVFXT1JEIFBUUls1NTIrcnNwXSxyMTMKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbOCtyc2ldCisJbXVsCXJicAorCWFkZAlyMTQscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxNCxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbMTYrcnNpXQorCW11bAlyYnAKKwlhZGQJcjE1LHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTUscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzI0K3JzaV0KKwltdWwJcmJwCisJYWRkCXI4LHJheAorCWFkYwlyZHgsMAorCWFkZAlyOCxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbMzIrcnNpXQorCW11bAlyYnAKKwlhZGQJcjkscmF4CisJYWRjCXJkeCwwCisJYWRkCXI5LHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUls0MCtyc2ldCisJbXVsCXJicAorCWFkZAlyMTAscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMCxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbNDgrcnNpXQorCW11bAlyYnAKKwlhZGQJcjExLHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTEscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzU2K3JzaV0KKwltdWwJcmJwCisJYWRkCXIxMixyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjEyLHJieAorCWFkYwlyZHgsMAorCW1vdglyMTMscmR4CisJbW92CXJicCxRV09SRCBQVFJbNDArcmRpXQorCW1vdglyYXgsUVdPUkQgUFRSW3JzaV0KKwltdWwJcmJwCisJYWRkCXIxNCxyYXgKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkQgUFRSWzU2MCtyc3BdLHIxNAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUls4K3JzaV0KKwltdWwJcmJwCisJYWRkCXIxNSxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjE1LHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUlsxNityc2ldCisJbXVsCXJicAorCWFkZAlyOCxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjgscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzI0K3JzaV0KKwltdWwJcmJwCisJYWRkCXI5LHJheAorCWFkYwlyZHgsMAorCWFkZAlyOSxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbMzIrcnNpXQorCW11bAlyYnAKKwlhZGQJcjEwLHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTAscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzQwK3JzaV0KKwltdWwJcmJwCisJYWRkCXIxMSxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjExLHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUls0OCtyc2ldCisJbXVsCXJicAorCWFkZAlyMTIscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMixyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbNTYrcnNpXQorCW11bAlyYnAKKwlhZGQJcjEzLHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTMscmJ4CisJYWRjCXJkeCwwCisJbW92CXIxNCxyZHgKKwltb3YJcmJwLFFXT1JEIFBUUls0OCtyZGldCisJbW92CXJheCxRV09SRCBQVFJbcnNpXQorCW11bAlyYnAKKwlhZGQJcjE1LHJheAorCWFkYwlyZHgsMAorCW1vdglRV09SRCBQVFJbNTY4K3JzcF0scjE1CisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzgrcnNpXQorCW11bAlyYnAKKwlhZGQJcjgscmF4CisJYWRjCXJkeCwwCisJYWRkCXI4LHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUlsxNityc2ldCisJbXVsCXJicAorCWFkZAlyOSxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjkscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzI0K3JzaV0KKwltdWwJcmJwCisJYWRkCXIxMCxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjEwLHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUlszMityc2ldCisJbXVsCXJicAorCWFkZAlyMTEscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMSxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbNDArcnNpXQorCW11bAlyYnAKKwlhZGQJcjEyLHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTIscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzQ4K3JzaV0KKwltdWwJcmJwCisJYWRkCXIxMyxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjEzLHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUls1Nityc2ldCisJbXVsCXJicAorCWFkZAlyMTQscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxNCxyYngKKwlhZGMJcmR4LDAKKwltb3YJcjE1LHJkeAorCW1vdglyYnAsUVdPUkQgUFRSWzU2K3JkaV0KKwltb3YJcmF4LFFXT1JEIFBUUltyc2ldCisJbXVsCXJicAorCWFkZAlyOCxyYXgKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkQgUFRSWzU3Nityc3BdLHI4CisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzgrcnNpXQorCW11bAlyYnAKKwlhZGQJcjkscmF4CisJYWRjCXJkeCwwCisJYWRkCXI5LHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUlsxNityc2ldCisJbXVsCXJicAorCWFkZAlyMTAscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMCxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbMjQrcnNpXQorCW11bAlyYnAKKwlhZGQJcjExLHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTEscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzMyK3JzaV0KKwltdWwJcmJwCisJYWRkCXIxMixyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjEyLHJieAorCWFkYwlyZHgsMAorCW1vdglyYngscmR4CisKKwltb3YJcmF4LFFXT1JEIFBUUls0MCtyc2ldCisJbXVsCXJicAorCWFkZAlyMTMscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMyxyYngKKwlhZGMJcmR4LDAKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbNDgrcnNpXQorCW11bAlyYnAKKwlhZGQJcjE0LHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTQscmJ4CisJYWRjCXJkeCwwCisJbW92CXJieCxyZHgKKworCW1vdglyYXgsUVdPUkQgUFRSWzU2K3JzaV0KKwltdWwJcmJwCisJYWRkCXIxNSxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjE1LHJieAorCWFkYwlyZHgsMAorCW1vdglyOCxyZHgKKwltb3YJUVdPUkQgUFRSWzU4NCtyc3BdLHI5CisJbW92CVFXT1JEIFBUUls1OTIrcnNwXSxyMTAKKwltb3YJUVdPUkQgUFRSWzYwMCtyc3BdLHIxMQorCW1vdglRV09SRCBQVFJbNjA4K3JzcF0scjEyCisJbW92CVFXT1JEIFBUUls2MTYrcnNwXSxyMTMKKwltb3YJUVdPUkQgUFRSWzYyNCtyc3BdLHIxNAorCW1vdglRV09SRCBQVFJbNjMyK3JzcF0scjE1CisJbW92CVFXT1JEIFBUUls2NDArcnNwXSxyOAorCisKKworCisKKwlqbXAJbW9udF9yZWR1Y2UKKworCittb250X211bF9hM2IJRU5EUAorCitBTElHTgkxNgorc3FyX3JlZHVjZQlQUk9DIFBSSVZBVEUKKwltb3YJcmN4LFFXT1JEIFBUUlsxNityc3BdCisKKworCisJbW92CXJieCxyMTAKKworCW1vdglyYXgscjExCisJbXVsCXJieAorCW1vdglRV09SRCBQVFJbNTI4K3JzcF0scmF4CisJbW92CXIxMCxyZHgKKwltb3YJcmF4LHIxMgorCW11bAlyYngKKwlhZGQJcjEwLHJheAorCWFkYwlyZHgsMAorCW1vdglyMTEscmR4CisJbW92CXJheCxyMTMKKwltdWwJcmJ4CisJYWRkCXIxMSxyYXgKKwlhZGMJcmR4LDAKKwltb3YJcjEyLHJkeAorCW1vdglyYXgscjE0CisJbXVsCXJieAorCWFkZAlyMTIscmF4CisJYWRjCXJkeCwwCisJbW92CXIxMyxyZHgKKwltb3YJcmF4LHIxNQorCW11bAlyYngKKwlhZGQJcjEzLHJheAorCWFkYwlyZHgsMAorCW1vdglyMTQscmR4CisJbW92CXJheCxyOAorCW11bAlyYngKKwlhZGQJcjE0LHJheAorCWFkYwlyZHgsMAorCW1vdglyMTUscmR4CisJbW92CXJheCxyOQorCW11bAlyYngKKwlhZGQJcjE1LHJheAorCWFkYwlyZHgsMAorCW1vdglyc2kscmR4CisKKwltb3YJUVdPUkQgUFRSWzUzNityc3BdLHIxMAorCisKKworCisKKwltb3YJcmJ4LFFXT1JEIFBUUls4K3JjeF0KKworCW1vdglyYXgsUVdPUkQgUFRSWzE2K3JjeF0KKwltdWwJcmJ4CisJYWRkCXIxMSxyYXgKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkQgUFRSWzU0NCtyc3BdLHIxMQorCisJbW92CXIxMCxyZHgKKwltb3YJcmF4LFFXT1JEIFBUUlsyNCtyY3hdCisJbXVsCXJieAorCWFkZAlyMTIscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMixyMTAKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkQgUFRSWzU1Mityc3BdLHIxMgorCisJbW92CXIxMCxyZHgKKwltb3YJcmF4LFFXT1JEIFBUUlszMityY3hdCisJbXVsCXJieAorCWFkZAlyMTMscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMyxyMTAKKwlhZGMJcmR4LDAKKworCW1vdglyMTAscmR4CisJbW92CXJheCxRV09SRCBQVFJbNDArcmN4XQorCW11bAlyYngKKwlhZGQJcjE0LHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTQscjEwCisJYWRjCXJkeCwwCisKKwltb3YJcjEwLHJkeAorCW1vdglyYXgscjgKKwltdWwJcmJ4CisJYWRkCXIxNSxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjE1LHIxMAorCWFkYwlyZHgsMAorCisJbW92CXIxMCxyZHgKKwltb3YJcmF4LHI5CisJbXVsCXJieAorCWFkZAlyc2kscmF4CisJYWRjCXJkeCwwCisJYWRkCXJzaSxyMTAKKwlhZGMJcmR4LDAKKworCW1vdglyMTEscmR4CisKKworCisKKwltb3YJcmJ4LFFXT1JEIFBUUlsxNityY3hdCisKKwltb3YJcmF4LFFXT1JEIFBUUlsyNCtyY3hdCisJbXVsCXJieAorCWFkZAlyMTMscmF4CisJYWRjCXJkeCwwCisJbW92CVFXT1JEIFBUUls1NjArcnNwXSxyMTMKKworCW1vdglyMTAscmR4CisJbW92CXJheCxRV09SRCBQVFJbMzIrcmN4XQorCW11bAlyYngKKwlhZGQJcjE0LHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTQscjEwCisJYWRjCXJkeCwwCisJbW92CVFXT1JEIFBUUls1NjgrcnNwXSxyMTQKKworCW1vdglyMTAscmR4CisJbW92CXJheCxRV09SRCBQVFJbNDArcmN4XQorCW11bAlyYngKKwlhZGQJcjE1LHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTUscjEwCisJYWRjCXJkeCwwCisKKwltb3YJcjEwLHJkeAorCW1vdglyYXgscjgKKwltdWwJcmJ4CisJYWRkCXJzaSxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcnNpLHIxMAorCWFkYwlyZHgsMAorCisJbW92CXIxMCxyZHgKKwltb3YJcmF4LHI5CisJbXVsCXJieAorCWFkZAlyMTEscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMSxyMTAKKwlhZGMJcmR4LDAKKworCW1vdglyMTIscmR4CisKKworCisKKworCW1vdglyYngsUVdPUkQgUFRSWzI0K3JjeF0KKworCW1vdglyYXgsUVdPUkQgUFRSWzMyK3JjeF0KKwltdWwJcmJ4CisJYWRkCXIxNSxyYXgKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkQgUFRSWzU3Nityc3BdLHIxNQorCisJbW92CXIxMCxyZHgKKwltb3YJcmF4LFFXT1JEIFBUUls0MCtyY3hdCisJbXVsCXJieAorCWFkZAlyc2kscmF4CisJYWRjCXJkeCwwCisJYWRkCXJzaSxyMTAKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkQgUFRSWzU4NCtyc3BdLHJzaQorCisJbW92CXIxMCxyZHgKKwltb3YJcmF4LHI4CisJbXVsCXJieAorCWFkZAlyMTEscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMSxyMTAKKwlhZGMJcmR4LDAKKworCW1vdglyMTAscmR4CisJbW92CXJheCxyOQorCW11bAlyYngKKwlhZGQJcjEyLHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTIscjEwCisJYWRjCXJkeCwwCisKKwltb3YJcjE1LHJkeAorCisKKworCisJbW92CXJieCxRV09SRCBQVFJbMzIrcmN4XQorCisJbW92CXJheCxRV09SRCBQVFJbNDArcmN4XQorCW11bAlyYngKKwlhZGQJcjExLHJheAorCWFkYwlyZHgsMAorCW1vdglRV09SRCBQVFJbNTkyK3JzcF0scjExCisKKwltb3YJcjEwLHJkeAorCW1vdglyYXgscjgKKwltdWwJcmJ4CisJYWRkCXIxMixyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjEyLHIxMAorCWFkYwlyZHgsMAorCW1vdglRV09SRCBQVFJbNjAwK3JzcF0scjEyCisKKwltb3YJcjEwLHJkeAorCW1vdglyYXgscjkKKwltdWwJcmJ4CisJYWRkCXIxNSxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjE1LHIxMAorCWFkYwlyZHgsMAorCisJbW92CXIxMSxyZHgKKworCisKKworCW1vdglyYngsUVdPUkQgUFRSWzQwK3JjeF0KKworCW1vdglyYXgscjgKKwltdWwJcmJ4CisJYWRkCXIxNSxyYXgKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkQgUFRSWzYwOCtyc3BdLHIxNQorCisJbW92CXIxMCxyZHgKKwltb3YJcmF4LHI5CisJbXVsCXJieAorCWFkZAlyMTEscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMSxyMTAKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkQgUFRSWzYxNityc3BdLHIxMQorCisJbW92CXIxMixyZHgKKworCisKKworCW1vdglyYngscjgKKworCW1vdglyYXgscjkKKwltdWwJcmJ4CisJYWRkCXIxMixyYXgKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkQgUFRSWzYyNCtyc3BdLHIxMgorCisJbW92CVFXT1JEIFBUUls2MzIrcnNwXSxyZHgKKworCisJbW92CXIxMCxRV09SRCBQVFJbNTI4K3JzcF0KKwltb3YJcjExLFFXT1JEIFBUUls1MzYrcnNwXQorCW1vdglyMTIsUVdPUkQgUFRSWzU0NCtyc3BdCisJbW92CXIxMyxRV09SRCBQVFJbNTUyK3JzcF0KKwltb3YJcjE0LFFXT1JEIFBUUls1NjArcnNwXQorCW1vdglyMTUsUVdPUkQgUFRSWzU2OCtyc3BdCisKKwltb3YJcmF4LFFXT1JEIFBUUlsyNCtyY3hdCisJbXVsCXJheAorCW1vdglyZGkscmF4CisJbW92CXI4LHJkeAorCisJYWRkCXIxMCxyMTAKKwlhZGMJcjExLHIxMQorCWFkYwlyMTIscjEyCisJYWRjCXIxMyxyMTMKKwlhZGMJcjE0LHIxNAorCWFkYwlyMTUscjE1CisJYWRjCXI4LDAKKworCW1vdglyYXgsUVdPUkQgUFRSW3JjeF0KKwltdWwJcmF4CisJbW92CVFXT1JEIFBUUls1MjArcnNwXSxyYXgKKwltb3YJcmJ4LHJkeAorCisJbW92CXJheCxRV09SRCBQVFJbOCtyY3hdCisJbXVsCXJheAorCisJYWRkCXIxMCxyYngKKwlhZGMJcjExLHJheAorCWFkYwlyZHgsMAorCisJbW92CXJieCxyZHgKKwltb3YJUVdPUkQgUFRSWzUyOCtyc3BdLHIxMAorCW1vdglRV09SRCBQVFJbNTM2K3JzcF0scjExCisKKwltb3YJcmF4LFFXT1JEIFBUUlsxNityY3hdCisJbXVsCXJheAorCisJYWRkCXIxMixyYngKKwlhZGMJcjEzLHJheAorCWFkYwlyZHgsMAorCisJbW92CXJieCxyZHgKKworCW1vdglRV09SRCBQVFJbNTQ0K3JzcF0scjEyCisJbW92CVFXT1JEIFBUUls1NTIrcnNwXSxyMTMKKworCXhvcglyYnAscmJwCisJYWRkCXIxNCxyYngKKwlhZGMJcjE1LHJkaQorCWFkYwlyYnAsMAorCisJbW92CVFXT1JEIFBUUls1NjArcnNwXSxyMTQKKwltb3YJUVdPUkQgUFRSWzU2OCtyc3BdLHIxNQorCisKKworCisJbW92CXIxMCxRV09SRCBQVFJbNTc2K3JzcF0KKwltb3YJcjExLFFXT1JEIFBUUls1ODQrcnNwXQorCW1vdglyMTIsUVdPUkQgUFRSWzU5Mityc3BdCisJbW92CXIxMyxRV09SRCBQVFJbNjAwK3JzcF0KKwltb3YJcjE0LFFXT1JEIFBUUls2MDgrcnNwXQorCW1vdglyMTUsUVdPUkQgUFRSWzYxNityc3BdCisJbW92CXJkaSxRV09SRCBQVFJbNjI0K3JzcF0KKwltb3YJcnNpLFFXT1JEIFBUUls2MzIrcnNwXQorCisJbW92CXJheCxyOQorCW11bAlyYXgKKwltb3YJcjkscmF4CisJbW92CXJieCxyZHgKKworCWFkZAlyMTAscjEwCisJYWRjCXIxMSxyMTEKKwlhZGMJcjEyLHIxMgorCWFkYwlyMTMscjEzCisJYWRjCXIxNCxyMTQKKwlhZGMJcjE1LHIxNQorCWFkYwlyZGkscmRpCisJYWRjCXJzaSxyc2kKKwlhZGMJcmJ4LDAKKworCWFkZAlyMTAscmJwCisKKwltb3YJcmF4LFFXT1JEIFBUUlszMityY3hdCisJbXVsCXJheAorCisJYWRkCXIxMCxyOAorCWFkYwlyMTEscmF4CisJYWRjCXJkeCwwCisKKwltb3YJcmJwLHJkeAorCisJbW92CVFXT1JEIFBUUls1NzYrcnNwXSxyMTAKKwltb3YJUVdPUkQgUFRSWzU4NCtyc3BdLHIxMQorCisJbW92CXJheCxRV09SRCBQVFJbNDArcmN4XQorCW11bAlyYXgKKworCWFkZAlyMTIscmJwCisJYWRjCXIxMyxyYXgKKwlhZGMJcmR4LDAKKworCW1vdglyYnAscmR4CisKKwltb3YJUVdPUkQgUFRSWzU5Mityc3BdLHIxMgorCW1vdglRV09SRCBQVFJbNjAwK3JzcF0scjEzCisKKwltb3YJcmF4LFFXT1JEIFBUUls0OCtyY3hdCisJbXVsCXJheAorCisJYWRkCXIxNCxyYnAKKwlhZGMJcjE1LHJheAorCWFkYwlyZHgsMAorCisJbW92CVFXT1JEIFBUUls2MDgrcnNwXSxyMTQKKwltb3YJUVdPUkQgUFRSWzYxNityc3BdLHIxNQorCisJYWRkCXJkaSxyZHgKKwlhZGMJcnNpLHI5CisJYWRjCXJieCwwCisKKwltb3YJUVdPUkQgUFRSWzYyNCtyc3BdLHJkaQorCW1vdglRV09SRCBQVFJbNjMyK3JzcF0scnNpCisJbW92CVFXT1JEIFBUUls2NDArcnNwXSxyYngKKworCWptcAltb250X3JlZHVjZQorCisKK3Nxcl9yZWR1Y2UJRU5EUAorUFVCTElDCW1vZF9leHBfNTEyCisKK21vZF9leHBfNTEyCVBST0MgUFVCTElDCisJbW92CVFXT1JEIFBUUls4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRCBQVFJbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX21vZF9leHBfNTEyOjoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCW1vdglyY3gscjkKKworCisJcHVzaAlyYnAKKwlwdXNoCXJieAorCXB1c2gJcjEyCisJcHVzaAlyMTMKKwlwdXNoCXIxNAorCXB1c2gJcjE1CisKKworCW1vdglyOCxyc3AKKwlzdWIJcnNwLDI2ODgKKwlhbmQJcnNwLC02NAorCisKKwltb3YJUVdPUkQgUFRSW3JzcF0scjgKKwltb3YJUVdPUkQgUFRSWzgrcnNwXSxyZGkKKwltb3YJUVdPUkQgUFRSWzE2K3JzcF0scnNpCisJbW92CVFXT1JEIFBUUlsyNCtyc3BdLHJjeAorJEwkYm9keTo6CisKKworCisJcHhvcgl4bW00LHhtbTQKKwltb3ZkcXUJeG1tMCxYTU1XT1JEIFBUUltyc2ldCisJbW92ZHF1CXhtbTEsWE1NV09SRCBQVFJbMTYrcnNpXQorCW1vdmRxdQl4bW0yLFhNTVdPUkQgUFRSWzMyK3JzaV0KKwltb3ZkcXUJeG1tMyxYTU1XT1JEIFBUUls0OCtyc2ldCisJbW92ZHFhCVhNTVdPUkQgUFRSWzUxMityc3BdLHhtbTQKKwltb3ZkcWEJWE1NV09SRCBQVFJbNTI4K3JzcF0seG1tNAorCW1vdmRxYQlYTU1XT1JEIFBUUls2MDgrcnNwXSx4bW00CisJbW92ZHFhCVhNTVdPUkQgUFRSWzYyNCtyc3BdLHhtbTQKKwltb3ZkcWEJWE1NV09SRCBQVFJbNTQ0K3JzcF0seG1tMAorCW1vdmRxYQlYTU1XT1JEIFBUUls1NjArcnNwXSx4bW0xCisJbW92ZHFhCVhNTVdPUkQgUFRSWzU3Nityc3BdLHhtbTIKKwltb3ZkcWEJWE1NV09SRCBQVFJbNTkyK3JzcF0seG1tMworCisKKwltb3ZkcXUJeG1tMCxYTU1XT1JEIFBUUltyZHhdCisJbW92ZHF1CXhtbTEsWE1NV09SRCBQVFJbMTYrcmR4XQorCW1vdmRxdQl4bW0yLFhNTVdPUkQgUFRSWzMyK3JkeF0KKwltb3ZkcXUJeG1tMyxYTU1XT1JEIFBUUls0OCtyZHhdCisKKwlsZWEJcmJ4LFFXT1JEIFBUUlszODQrcnNwXQorCW1vdglRV09SRCBQVFJbMTM2K3JzcF0scmJ4CisJY2FsbAltb250X3JlZHVjZQorCisKKwlsZWEJcmN4LFFXT1JEIFBUUls0NDgrcnNwXQorCXhvcglyYXgscmF4CisJbW92CVFXT1JEIFBUUltyY3hdLHJheAorCW1vdglRV09SRCBQVFJbOCtyY3hdLHJheAorCW1vdglRV09SRCBQVFJbMjQrcmN4XSxyYXgKKwltb3YJUVdPUkQgUFRSWzMyK3JjeF0scmF4CisJbW92CVFXT1JEIFBUUls0MCtyY3hdLHJheAorCW1vdglRV09SRCBQVFJbNDgrcmN4XSxyYXgKKwltb3YJUVdPUkQgUFRSWzU2K3JjeF0scmF4CisJbW92CVFXT1JEIFBUUlsxMjgrcnNwXSxyYXgKKwltb3YJUVdPUkQgUFRSWzE2K3JjeF0sMQorCisJbGVhCXJicCxRV09SRCBQVFJbNjQwK3JzcF0KKwltb3YJcnNpLHJjeAorCW1vdglyZGkscmJwCisJbW92CXJheCw4Citsb29wXzA6OgorCW1vdglyYngsUVdPUkQgUFRSW3JjeF0KKwltb3YJV09SRCBQVFJbcmRpXSxieAorCXNocglyYngsMTYKKwltb3YJV09SRCBQVFJbNjQrcmRpXSxieAorCXNocglyYngsMTYKKwltb3YJV09SRCBQVFJbMTI4K3JkaV0sYngKKwlzaHIJcmJ4LDE2CisJbW92CVdPUkQgUFRSWzE5MityZGldLGJ4CisJbGVhCXJjeCxRV09SRCBQVFJbOCtyY3hdCisJbGVhCXJkaSxRV09SRCBQVFJbMjU2K3JkaV0KKwlkZWMJcmF4CisJam56CWxvb3BfMAorCW1vdglyYXgsMzEKKwltb3YJUVdPUkQgUFRSWzMyK3JzcF0scmF4CisJbW92CVFXT1JEIFBUUls0MCtyc3BdLHJicAorCisJbW92CVFXT1JEIFBUUlsxMzYrcnNwXSxyc2kKKwltb3YJcjEwLFFXT1JEIFBUUltyc2ldCisJbW92CXIxMSxRV09SRCBQVFJbOCtyc2ldCisJbW92CXIxMixRV09SRCBQVFJbMTYrcnNpXQorCW1vdglyMTMsUVdPUkQgUFRSWzI0K3JzaV0KKwltb3YJcjE0LFFXT1JEIFBUUlszMityc2ldCisJbW92CXIxNSxRV09SRCBQVFJbNDArcnNpXQorCW1vdglyOCxRV09SRCBQVFJbNDgrcnNpXQorCW1vdglyOSxRV09SRCBQVFJbNTYrcnNpXQoraW5pdF9sb29wOjoKKwlsZWEJcmRpLFFXT1JEIFBUUlszODQrcnNwXQorCWNhbGwJbW9udF9tdWxfYTNiCisJbGVhCXJzaSxRV09SRCBQVFJbNDQ4K3JzcF0KKwltb3YJcmJwLFFXT1JEIFBUUls0MCtyc3BdCisJYWRkCXJicCwyCisJbW92CVFXT1JEIFBUUls0MCtyc3BdLHJicAorCW1vdglyY3gscnNpCisJbW92CXJheCw4Citsb29wXzE6OgorCW1vdglyYngsUVdPUkQgUFRSW3JjeF0KKwltb3YJV09SRCBQVFJbcmJwXSxieAorCXNocglyYngsMTYKKwltb3YJV09SRCBQVFJbNjQrcmJwXSxieAorCXNocglyYngsMTYKKwltb3YJV09SRCBQVFJbMTI4K3JicF0sYngKKwlzaHIJcmJ4LDE2CisJbW92CVdPUkQgUFRSWzE5MityYnBdLGJ4CisJbGVhCXJjeCxRV09SRCBQVFJbOCtyY3hdCisJbGVhCXJicCxRV09SRCBQVFJbMjU2K3JicF0KKwlkZWMJcmF4CisJam56CWxvb3BfMQorCW1vdglyYXgsUVdPUkQgUFRSWzMyK3JzcF0KKwlzdWIJcmF4LDEKKwltb3YJUVdPUkQgUFRSWzMyK3JzcF0scmF4CisJam5lCWluaXRfbG9vcAorCisKKworCW1vdmRxYQlYTU1XT1JEIFBUUls2NCtyc3BdLHhtbTAKKwltb3ZkcWEJWE1NV09SRCBQVFJbODArcnNwXSx4bW0xCisJbW92ZHFhCVhNTVdPUkQgUFRSWzk2K3JzcF0seG1tMgorCW1vdmRxYQlYTU1XT1JEIFBUUlsxMTIrcnNwXSx4bW0zCisKKworCisKKworCW1vdgllYXgsRFdPUkQgUFRSWzEyNityc3BdCisJbW92CXJkeCxyYXgKKwlzaHIJcmF4LDExCisJYW5kCWVkeCwwMDdGRmgKKwltb3YJRFdPUkQgUFRSWzEyNityc3BdLGVkeAorCWxlYQlyc2ksUVdPUkQgUFRSWzY0MCtyYXgqMityc3BdCisJbW92CXJkeCxRV09SRCBQVFJbOCtyc3BdCisJbW92CXJicCw0Citsb29wXzI6OgorCW1vdnp4CXJieCxXT1JEIFBUUlsxOTIrcnNpXQorCW1vdnp4CXJheCxXT1JEIFBUUls0NDgrcnNpXQorCXNobAlyYngsMTYKKwlzaGwJcmF4LDE2CisJbW92CWJ4LFdPUkQgUFRSWzEyOCtyc2ldCisJbW92CWF4LFdPUkQgUFRSWzM4NCtyc2ldCisJc2hsCXJieCwxNgorCXNobAlyYXgsMTYKKwltb3YJYngsV09SRCBQVFJbNjQrcnNpXQorCW1vdglheCxXT1JEIFBUUlszMjArcnNpXQorCXNobAlyYngsMTYKKwlzaGwJcmF4LDE2CisJbW92CWJ4LFdPUkQgUFRSW3JzaV0KKwltb3YJYXgsV09SRCBQVFJbMjU2K3JzaV0KKwltb3YJUVdPUkQgUFRSW3JkeF0scmJ4CisJbW92CVFXT1JEIFBUUls4K3JkeF0scmF4CisJbGVhCXJzaSxRV09SRCBQVFJbNTEyK3JzaV0KKwlsZWEJcmR4LFFXT1JEIFBUUlsxNityZHhdCisJc3ViCXJicCwxCisJam56CWxvb3BfMgorCW1vdglRV09SRCBQVFJbNDgrcnNwXSw1MDUKKworCW1vdglyY3gsUVdPUkQgUFRSWzgrcnNwXQorCW1vdglRV09SRCBQVFJbMTM2K3JzcF0scmN4CisJbW92CXIxMCxRV09SRCBQVFJbcmN4XQorCW1vdglyMTEsUVdPUkQgUFRSWzgrcmN4XQorCW1vdglyMTIsUVdPUkQgUFRSWzE2K3JjeF0KKwltb3YJcjEzLFFXT1JEIFBUUlsyNCtyY3hdCisJbW92CXIxNCxRV09SRCBQVFJbMzIrcmN4XQorCW1vdglyMTUsUVdPUkQgUFRSWzQwK3JjeF0KKwltb3YJcjgsUVdPUkQgUFRSWzQ4K3JjeF0KKwltb3YJcjksUVdPUkQgUFRSWzU2K3JjeF0KKwlqbXAJc3FyXzIKKworbWFpbl9sb29wX2EzYjo6CisJY2FsbAlzcXJfcmVkdWNlCisJY2FsbAlzcXJfcmVkdWNlCisJY2FsbAlzcXJfcmVkdWNlCitzcXJfMjo6CisJY2FsbAlzcXJfcmVkdWNlCisJY2FsbAlzcXJfcmVkdWNlCisKKworCisJbW92CXJjeCxRV09SRCBQVFJbNDgrcnNwXQorCW1vdglyYXgscmN4CisJc2hyCXJheCw0CisJbW92CWVkeCxEV09SRCBQVFJbNjQrcmF4KjIrcnNwXQorCWFuZAlyY3gsMTUKKwlzaHIJcmR4LGNsCisJYW5kCXJkeCwwMUZoCisKKwlsZWEJcnNpLFFXT1JEIFBUUls2NDArcmR4KjIrcnNwXQorCWxlYQlyZHgsUVdPUkQgUFRSWzQ0OCtyc3BdCisJbW92CXJkaSxyZHgKKwltb3YJcmJwLDQKK2xvb3BfMzo6CisJbW92engJcmJ4LFdPUkQgUFRSWzE5Mityc2ldCisJbW92engJcmF4LFdPUkQgUFRSWzQ0OCtyc2ldCisJc2hsCXJieCwxNgorCXNobAlyYXgsMTYKKwltb3YJYngsV09SRCBQVFJbMTI4K3JzaV0KKwltb3YJYXgsV09SRCBQVFJbMzg0K3JzaV0KKwlzaGwJcmJ4LDE2CisJc2hsCXJheCwxNgorCW1vdglieCxXT1JEIFBUUls2NCtyc2ldCisJbW92CWF4LFdPUkQgUFRSWzMyMCtyc2ldCisJc2hsCXJieCwxNgorCXNobAlyYXgsMTYKKwltb3YJYngsV09SRCBQVFJbcnNpXQorCW1vdglheCxXT1JEIFBUUlsyNTYrcnNpXQorCW1vdglRV09SRCBQVFJbcmR4XSxyYngKKwltb3YJUVdPUkQgUFRSWzgrcmR4XSxyYXgKKwlsZWEJcnNpLFFXT1JEIFBUUls1MTIrcnNpXQorCWxlYQlyZHgsUVdPUkQgUFRSWzE2K3JkeF0KKwlzdWIJcmJwLDEKKwlqbnoJbG9vcF8zCisJbW92CXJzaSxRV09SRCBQVFJbOCtyc3BdCisJY2FsbAltb250X211bF9hM2IKKworCisKKwltb3YJcmN4LFFXT1JEIFBUUls0OCtyc3BdCisJc3ViCXJjeCw1CisJbW92CVFXT1JEIFBUUls0OCtyc3BdLHJjeAorCWpnZQltYWluX2xvb3BfYTNiCisKKworCitlbmRfbWFpbl9sb29wX2EzYjo6CisKKworCW1vdglyZHgsUVdPUkQgUFRSWzgrcnNwXQorCXB4b3IJeG1tNCx4bW00CisJbW92ZHF1CXhtbTAsWE1NV09SRCBQVFJbcmR4XQorCW1vdmRxdQl4bW0xLFhNTVdPUkQgUFRSWzE2K3JkeF0KKwltb3ZkcXUJeG1tMixYTU1XT1JEIFBUUlszMityZHhdCisJbW92ZHF1CXhtbTMsWE1NV09SRCBQVFJbNDgrcmR4XQorCW1vdmRxYQlYTU1XT1JEIFBUUls1NzYrcnNwXSx4bW00CisJbW92ZHFhCVhNTVdPUkQgUFRSWzU5Mityc3BdLHhtbTQKKwltb3ZkcWEJWE1NV09SRCBQVFJbNjA4K3JzcF0seG1tNAorCW1vdmRxYQlYTU1XT1JEIFBUUls2MjQrcnNwXSx4bW00CisJbW92ZHFhCVhNTVdPUkQgUFRSWzUxMityc3BdLHhtbTAKKwltb3ZkcWEJWE1NV09SRCBQVFJbNTI4K3JzcF0seG1tMQorCW1vdmRxYQlYTU1XT1JEIFBUUls1NDQrcnNwXSx4bW0yCisJbW92ZHFhCVhNTVdPUkQgUFRSWzU2MCtyc3BdLHhtbTMKKwljYWxsCW1vbnRfcmVkdWNlCisKKworCisJbW92CXJheCxRV09SRCBQVFJbOCtyc3BdCisJbW92CXI4LFFXT1JEIFBUUltyYXhdCisJbW92CXI5LFFXT1JEIFBUUls4K3JheF0KKwltb3YJcjEwLFFXT1JEIFBUUlsxNityYXhdCisJbW92CXIxMSxRV09SRCBQVFJbMjQrcmF4XQorCW1vdglyMTIsUVdPUkQgUFRSWzMyK3JheF0KKwltb3YJcjEzLFFXT1JEIFBUUls0MCtyYXhdCisJbW92CXIxNCxRV09SRCBQVFJbNDgrcmF4XQorCW1vdglyMTUsUVdPUkQgUFRSWzU2K3JheF0KKworCisJbW92CXJieCxRV09SRCBQVFJbMjQrcnNwXQorCWFkZAlyYngsNTEyCisKKwlzdWIJcjgsUVdPUkQgUFRSW3JieF0KKwlzYmIJcjksUVdPUkQgUFRSWzgrcmJ4XQorCXNiYglyMTAsUVdPUkQgUFRSWzE2K3JieF0KKwlzYmIJcjExLFFXT1JEIFBUUlsyNCtyYnhdCisJc2JiCXIxMixRV09SRCBQVFJbMzIrcmJ4XQorCXNiYglyMTMsUVdPUkQgUFRSWzQwK3JieF0KKwlzYmIJcjE0LFFXT1JEIFBUUls0OCtyYnhdCisJc2JiCXIxNSxRV09SRCBQVFJbNTYrcmJ4XQorCisKKwltb3YJcnNpLFFXT1JEIFBUUltyYXhdCisJbW92CXJkaSxRV09SRCBQVFJbOCtyYXhdCisJbW92CXJjeCxRV09SRCBQVFJbMTYrcmF4XQorCW1vdglyZHgsUVdPUkQgUFRSWzI0K3JheF0KKwljbW92bmMJcnNpLHI4CisJY21vdm5jCXJkaSxyOQorCWNtb3ZuYwlyY3gscjEwCisJY21vdm5jCXJkeCxyMTEKKwltb3YJUVdPUkQgUFRSW3JheF0scnNpCisJbW92CVFXT1JEIFBUUls4K3JheF0scmRpCisJbW92CVFXT1JEIFBUUlsxNityYXhdLHJjeAorCW1vdglRV09SRCBQVFJbMjQrcmF4XSxyZHgKKworCW1vdglyc2ksUVdPUkQgUFRSWzMyK3JheF0KKwltb3YJcmRpLFFXT1JEIFBUUls0MCtyYXhdCisJbW92CXJjeCxRV09SRCBQVFJbNDgrcmF4XQorCW1vdglyZHgsUVdPUkQgUFRSWzU2K3JheF0KKwljbW92bmMJcnNpLHIxMgorCWNtb3ZuYwlyZGkscjEzCisJY21vdm5jCXJjeCxyMTQKKwljbW92bmMJcmR4LHIxNQorCW1vdglRV09SRCBQVFJbMzIrcmF4XSxyc2kKKwltb3YJUVdPUkQgUFRSWzQwK3JheF0scmRpCisJbW92CVFXT1JEIFBUUls0OCtyYXhdLHJjeAorCW1vdglRV09SRCBQVFJbNTYrcmF4XSxyZHgKKworCW1vdglyc2ksUVdPUkQgUFRSW3JzcF0KKwltb3YJcjE1LFFXT1JEIFBUUltyc2ldCisJbW92CXIxNCxRV09SRCBQVFJbOCtyc2ldCisJbW92CXIxMyxRV09SRCBQVFJbMTYrcnNpXQorCW1vdglyMTIsUVdPUkQgUFRSWzI0K3JzaV0KKwltb3YJcmJ4LFFXT1JEIFBUUlszMityc2ldCisJbW92CXJicCxRV09SRCBQVFJbNDArcnNpXQorCWxlYQlyc3AsUVdPUkQgUFRSWzQ4K3JzaV0KKyRMJGVwaWxvZ3VlOjoKKwltb3YJcmRpLFFXT1JEIFBUUls4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRCBQVFJbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorJEwkU0VIX2VuZF9tb2RfZXhwXzUxMjo6Cittb2RfZXhwXzUxMglFTkRQCitFWFRFUk4JX19pbXBfUnRsVmlydHVhbFVud2luZDpORUFSCisKK0FMSUdOCTE2Cittb2RfZXhwXzUxMl9zZV9oYW5kbGVyCVBST0MgUFJJVkFURQorCXB1c2gJcnNpCisJcHVzaAlyZGkKKwlwdXNoCXJieAorCXB1c2gJcmJwCisJcHVzaAlyMTIKKwlwdXNoCXIxMworCXB1c2gJcjE0CisJcHVzaAlyMTUKKwlwdXNoZnEKKwlzdWIJcnNwLDY0CisKKwltb3YJcmF4LFFXT1JEIFBUUlsxMjArcjhdCisJbW92CXJieCxRV09SRCBQVFJbMjQ4K3I4XQorCisJbGVhCXIxMCxRV09SRCBQVFJbJEwkYm9keV0KKwljbXAJcmJ4LHIxMAorCWpiCSRMJGluX3Byb2xvZ3VlCisKKwltb3YJcmF4LFFXT1JEIFBUUlsxNTIrcjhdCisKKwlsZWEJcjEwLFFXT1JEIFBUUlskTCRlcGlsb2d1ZV0KKwljbXAJcmJ4LHIxMAorCWphZQkkTCRpbl9wcm9sb2d1ZQorCisJbW92CXJheCxRV09SRCBQVFJbcmF4XQorCisJbW92CXJieCxRV09SRCBQVFJbMzIrcmF4XQorCW1vdglyYnAsUVdPUkQgUFRSWzQwK3JheF0KKwltb3YJcjEyLFFXT1JEIFBUUlsyNCtyYXhdCisJbW92CXIxMyxRV09SRCBQVFJbMTYrcmF4XQorCW1vdglyMTQsUVdPUkQgUFRSWzgrcmF4XQorCW1vdglyMTUsUVdPUkQgUFRSW3JheF0KKwlsZWEJcmF4LFFXT1JEIFBUUls0OCtyYXhdCisJbW92CVFXT1JEIFBUUlsxNDQrcjhdLHJieAorCW1vdglRV09SRCBQVFJbMTYwK3I4XSxyYnAKKwltb3YJUVdPUkQgUFRSWzIxNityOF0scjEyCisJbW92CVFXT1JEIFBUUlsyMjQrcjhdLHIxMworCW1vdglRV09SRCBQVFJbMjMyK3I4XSxyMTQKKwltb3YJUVdPUkQgUFRSWzI0MCtyOF0scjE1CisKKyRMJGluX3Byb2xvZ3VlOjoKKwltb3YJcmRpLFFXT1JEIFBUUls4K3JheF0KKwltb3YJcnNpLFFXT1JEIFBUUlsxNityYXhdCisJbW92CVFXT1JEIFBUUlsxNTIrcjhdLHJheAorCW1vdglRV09SRCBQVFJbMTY4K3I4XSxyc2kKKwltb3YJUVdPUkQgUFRSWzE3NityOF0scmRpCisKKwltb3YJcmRpLFFXT1JEIFBUUls0MCtyOV0KKwltb3YJcnNpLHI4CisJbW92CWVjeCwxNTQKKwlERAkwYTU0OGYzZmNoCisKKwltb3YJcnNpLHI5CisJeG9yCXJjeCxyY3gKKwltb3YJcmR4LFFXT1JEIFBUUls4K3JzaV0KKwltb3YJcjgsUVdPUkQgUFRSW3JzaV0KKwltb3YJcjksUVdPUkQgUFRSWzE2K3JzaV0KKwltb3YJcjEwLFFXT1JEIFBUUls0MCtyc2ldCisJbGVhCXIxMSxRV09SRCBQVFJbNTYrcnNpXQorCWxlYQlyMTIsUVdPUkQgUFRSWzI0K3JzaV0KKwltb3YJUVdPUkQgUFRSWzMyK3JzcF0scjEwCisJbW92CVFXT1JEIFBUUls0MCtyc3BdLHIxMQorCW1vdglRV09SRCBQVFJbNDgrcnNwXSxyMTIKKwltb3YJUVdPUkQgUFRSWzU2K3JzcF0scmN4CisJY2FsbAlRV09SRCBQVFJbX19pbXBfUnRsVmlydHVhbFVud2luZF0KKworCW1vdgllYXgsMQorCWFkZAlyc3AsNjQKKwlwb3BmcQorCXBvcAlyMTUKKwlwb3AJcjE0CisJcG9wCXIxMworCXBvcAlyMTIKKwlwb3AJcmJwCisJcG9wCXJieAorCXBvcAlyZGkKKwlwb3AJcnNpCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0Cittb2RfZXhwXzUxMl9zZV9oYW5kbGVyCUVORFAKKworLnRleHQkCUVORFMKKy5wZGF0YQlTRUdNRU5UIFJFQURPTkxZIEFMSUdOKDQpCitBTElHTgk0CisJREQJaW1hZ2VyZWwgJEwkU0VIX2JlZ2luX21vZF9leHBfNTEyCisJREQJaW1hZ2VyZWwgJEwkU0VIX2VuZF9tb2RfZXhwXzUxMgorCURECWltYWdlcmVsICRMJFNFSF9pbmZvX21vZF9leHBfNTEyCisKKy5wZGF0YQlFTkRTCisueGRhdGEJU0VHTUVOVCBSRUFET05MWSBBTElHTig4KQorQUxJR04JOAorJEwkU0VIX2luZm9fbW9kX2V4cF81MTI6OgorREIJOSwwLDAsMAorCURECWltYWdlcmVsIG1vZF9leHBfNTEyX3NlX2hhbmRsZXIKKworLnhkYXRhCUVORFMKK0VORApkaWZmIC0tZ2l0IGEvd2luLXg4Nl82NC9jcnlwdG8vY3B1LXg4Nl82NC1hc20uYXNtIGIvd2luLXg4Nl82NC9jcnlwdG8vY3B1LXg4Nl82NC1hc20uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MmQ3YmIKLS0tIC9kZXYvbnVsbAorKysgYi93aW4teDg2XzY0L2NyeXB0by9jcHUteDg2XzY0LWFzbS5hc20KQEAgLTAsMCArMSwxNTQgQEAKK2RlZmF1bHQJcmVsCislZGVmaW5lIFhNTVdPUkQKKyVkZWZpbmUgWU1NV09SRAorJWRlZmluZSBaTU1XT1JECitzZWN0aW9uCS50ZXh0IGNvZGUgYWxpZ249NjQKKworCitnbG9iYWwJT1BFTlNTTF9pYTMyX2NwdWlkCisKK0FMSUdOCTE2CitPUEVOU1NMX2lhMzJfY3B1aWQ6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9PUEVOU1NMX2lhMzJfY3B1aWQ6CisJbW92CXJkaSxyY3gKKworCisKKworCW1vdglyZGkscmN4CisJbW92CXI4LHJieAorCisJeG9yCWVheCxlYXgKKwltb3YJRFdPUkRbOCtyZGldLGVheAorCWNwdWlkCisJbW92CXIxMWQsZWF4CisKKwl4b3IJZWF4LGVheAorCWNtcAllYngsMHg3NTZlNjU0NworCXNldG5lCWFsCisJbW92CXI5ZCxlYXgKKwljbXAJZWR4LDB4NDk2NTZlNjkKKwlzZXRuZQlhbAorCW9yCXI5ZCxlYXgKKwljbXAJZWN4LDB4NmM2NTc0NmUKKwlzZXRuZQlhbAorCW9yCXI5ZCxlYXgKKwlqeglORUFSICRMJGludGVsCisKKwljbXAJZWJ4LDB4Njg3NDc1NDEKKwlzZXRuZQlhbAorCW1vdglyMTBkLGVheAorCWNtcAllZHgsMHg2OTc0NkU2NQorCXNldG5lCWFsCisJb3IJcjEwZCxlYXgKKwljbXAJZWN4LDB4NDQ0RDQxNjMKKwlzZXRuZQlhbAorCW9yCXIxMGQsZWF4CisJam56CU5FQVIgJEwkaW50ZWwKKworCisKKworCW1vdgllYXgsMHg4MDAwMDAwMAorCWNwdWlkCisKKworCWNtcAllYXgsMHg4MDAwMDAwMQorCWpiCU5FQVIgJEwkaW50ZWwKKwltb3YJcjEwZCxlYXgKKwltb3YJZWF4LDB4ODAwMDAwMDEKKwljcHVpZAorCisKKwlvcglyOWQsZWN4CisJYW5kCXI5ZCwweDAwMDAwODAxCisKKwljbXAJcjEwZCwweDgwMDAwMDA4CisJamIJTkVBUiAkTCRpbnRlbAorCisJbW92CWVheCwweDgwMDAwMDA4CisJY3B1aWQKKworCW1vdnp4CXIxMCxjbAorCWluYwlyMTAKKworCW1vdgllYXgsMQorCWNwdWlkCisKKwlidAllZHgsMjgKKwlqbmMJTkVBUiAkTCRnZW5lcmljCisJc2hyCWVieCwxNgorCWNtcAlibCxyMTBiCisJamEJTkVBUiAkTCRnZW5lcmljCisJYW5kCWVkeCwweGVmZmZmZmZmCisJam1wCU5FQVIgJEwkZ2VuZXJpYworCiskTCRpbnRlbDoKKwljbXAJcjExZCw0CisJbW92CXIxMGQsLTEKKwlqYglORUFSICRMJG5vY2FjaGVpbmZvCisKKwltb3YJZWF4LDQKKwltb3YJZWN4LDAKKwljcHVpZAorCW1vdglyMTBkLGVheAorCXNocglyMTBkLDE0CisJYW5kCXIxMGQsMHhmZmYKKworCWNtcAlyMTFkLDcKKwlqYglORUFSICRMJG5vY2FjaGVpbmZvCisKKwltb3YJZWF4LDcKKwl4b3IJZWN4LGVjeAorCWNwdWlkCisJbW92CURXT1JEWzgrcmRpXSxlYngKKworJEwkbm9jYWNoZWluZm86CisJbW92CWVheCwxCisJY3B1aWQKKworCWFuZAllZHgsMHhiZmVmZmZmZgorCWNtcAlyOWQsMAorCWpuZQlORUFSICRMJG5vdGludGVsCisJb3IJZWR4LDB4NDAwMDAwMDAKKyRMJG5vdGludGVsOgorCWJ0CWVkeCwyOAorCWpuYwlORUFSICRMJGdlbmVyaWMKKwlhbmQJZWR4LDB4ZWZmZmZmZmYKKwljbXAJcjEwZCwwCisJamUJTkVBUiAkTCRnZW5lcmljCisKKwlvcgllZHgsMHgxMDAwMDAwMAorCXNocgllYngsMTYKKwljbXAJYmwsMQorCWphCU5FQVIgJEwkZ2VuZXJpYworCWFuZAllZHgsMHhlZmZmZmZmZgorJEwkZ2VuZXJpYzoKKwlhbmQJcjlkLDB4MDAwMDA4MDAKKwlhbmQJZWN4LDB4ZmZmZmY3ZmYKKwlvcglyOWQsZWN4CisKKwltb3YJcjEwZCxlZHgKKwlidAlyOWQsMjcKKwlqbmMJTkVBUiAkTCRjbGVhcl9hdngKKwl4b3IJZWN4LGVjeAorREIJMHgwZiwweDAxLDB4ZDAKKwlhbmQJZWF4LDYKKwljbXAJZWF4LDYKKwlqZQlORUFSICRMJGRvbmUKKyRMJGNsZWFyX2F2eDoKKwltb3YJZWF4LDB4ZWZmZmU3ZmYKKwlhbmQJcjlkLGVheAorCWFuZAlEV09SRFs4K3JkaV0sMHhmZmZmZmZkZgorJEwkZG9uZToKKwltb3YJRFdPUkRbNCtyZGldLHI5ZAorCW1vdglEV09SRFtyZGldLHIxMGQKKwltb3YJcmJ4LHI4CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CiskTCRTRUhfZW5kX09QRU5TU0xfaWEzMl9jcHVpZDoKKwpkaWZmIC0tZ2l0IGEvd2luLXg4Nl82NC9jcnlwdG8vcmFuZC9yZHJhbmQteDg2XzY0LmFzbSBiL3dpbi14ODZfNjQvY3J5cHRvL3JhbmQvcmRyYW5kLXg4Nl82NC5hc20KaW5kZXggNGMwMzc5MS4uYTYzZWE2OSAxMDA2NDQKLS0tIGEvd2luLXg4Nl82NC9jcnlwdG8vcmFuZC9yZHJhbmQteDg2XzY0LmFzbQorKysgYi93aW4teDg2XzY0L2NyeXB0by9yYW5kL3JkcmFuZC14ODZfNjQuYXNtCkBAIC01LDkgKzUsNiBAQAogc2VjdGlvbgkudGV4dCBjb2RlIGFsaWduPTY0CiAKIAotCi0KLQogZ2xvYmFsCUNSWVBUT19yZHJhbmQKIAogQUxJR04JMTYKQEAgLTE5LDUyICsxNiw3IEBACiAJbW92CXJkaSxyY3gKIAogCi0JeG9yCXJheCxyYXgKLQotCi1EQgkweDQ4LDB4MGYsMHhjNywweGYxCi0KLQlhZGMJcmF4LHJheAotCW1vdglRV09SRFtyZGldLHJjeAotCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQotCW1vdglyc2ksUVdPUkRbMTYrcnNwXQotCURCCTBGM2gsMEMzaAkJO3JlcHJldAotCi0KLQotCi0KLWdsb2JhbAlDUllQVE9fcmRyYW5kX211bHRpcGxlOF9idWYKLQotQUxJR04JMTYKLUNSWVBUT19yZHJhbmRfbXVsdGlwbGU4X2J1ZjoKLQltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKLQltb3YJUVdPUkRbMTYrcnNwXSxyc2kKLQltb3YJcmF4LHJzcAotJEwkU0VIX2JlZ2luX0NSWVBUT19yZHJhbmRfbXVsdGlwbGU4X2J1ZjoKLQltb3YJcmRpLHJjeAotCW1vdglyc2kscmR4Ci0KLQotCXRlc3QJcnNpLHJzaQotCWp6CU5FQVIgJEwkb3V0Ci0JbW92CXJkeCw4Ci0kTCRsb29wOgotCi0KLURCCTB4NDgsMHgwZiwweGM3LDB4ZjEKLQlqbmMJTkVBUiAkTCRlcnIKLQltb3YJUVdPUkRbcmRpXSxyY3gKLQlhZGQJcmRpLHJkeAotCXN1Yglyc2kscmR4Ci0Jam56CU5FQVIgJEwkbG9vcAotJEwkb3V0OgotCW1vdglyYXgsMQotCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQotCW1vdglyc2ksUVdPUkRbMTYrcnNwXQotCURCCTBGM2gsMEMzaAkJO3JlcHJldAotJEwkZXJyOgotCXhvcglyYXgscmF4CitEQgkweDQ4LDB4MGYsMHhjNywweGYwCiAJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCiAJbW92CXJzaSxRV09SRFsxNityc3BdCiAJREIJMEYzaCwwQzNoCQk7cmVwcmV0Cg==