ZGlmZiAtLWdpdCBhL2F1dG8vb3MvbGludXggYi9hdXRvL29zL2xpbnV4CmluZGV4IDM5MDI3YjMuLmE3YThkNzEgMTAwNjQ0Ci0tLSBhL2F1dG8vb3MvbGludXgKKysrIGIvYXV0by9vcy9saW51eApAQCAtMzgsNyArMzgsNyBAQAogCiBuZ3hfZmVhdHVyZT0iZXBvbGwiCiBuZ3hfZmVhdHVyZV9uYW1lPSJOR1hfSEFWRV9FUE9MTCIKLW5neF9mZWF0dXJlX3J1bj1ubworbmd4X2ZlYXR1cmVfcnVuPXllcwogbmd4X2ZlYXR1cmVfaW5jcz0iI2luY2x1ZGUgPHN5cy9lcG9sbC5oPiIKIG5neF9mZWF0dXJlX2xpYnM9CiBuZ3hfZmVhdHVyZV90ZXN0PSJpbnQgZWZkID0gMCwgZmQgPSAxLCBuOwpAQCAtNjIsMTIgKzYyLDE0IEBACiBDQ19BVVhfRkxBR1M9Ii1EX0dOVV9TT1VSQ0UiCiBuZ3hfZmVhdHVyZT0ic2VuZGZpbGUoKSIKIG5neF9mZWF0dXJlX25hbWU9Ik5HWF9IQVZFX1NFTkRGSUxFIgotbmd4X2ZlYXR1cmVfcnVuPW5vCi1uZ3hfZmVhdHVyZV9pbmNzPSIjaW5jbHVkZSA8c3lzL3NlbmRmaWxlLmg+Igorbmd4X2ZlYXR1cmVfcnVuPXllcworbmd4X2ZlYXR1cmVfaW5jcz0iI2luY2x1ZGUgPHN5cy9zZW5kZmlsZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+Igogbmd4X2ZlYXR1cmVfbGlicz0KIG5neF9mZWF0dXJlX3Rlc3Q9ImludCBzID0gMCwgZmQgPSAxOwogICAgICAgICAgICAgICAgICAgc3NpemVfdCBuOyBvZmZfdCBvZmYgPSAwOwotICAgICAgICAgICAgICAgICAgbiA9IHNlbmRmaWxlKHMsIGZkLCAmb2ZmLCAxKSIKKyAgICAgICAgICAgICAgICAgIG4gPSBzZW5kZmlsZShzLCBmZCwgJm9mZiwgMSk7CisgICAgICAgICAgICAgICAgICBpZiAobiA9PSAtMSAmJiBlcnJubyA9PSBFTk9TWVMpIHJldHVybiAxIgogLiBhdXRvL2ZlYXR1cmUKIAogaWYgWyAkbmd4X2ZvdW5kID0geWVzIF07IHRoZW4KQEAgLTgwLDEyICs4MiwxNCBAQAogQ0NfQVVYX0ZMQUdTPSItRF9HTlVfU09VUkNFIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiCiBuZ3hfZmVhdHVyZT0ic2VuZGZpbGU2NCgpIgogbmd4X2ZlYXR1cmVfbmFtZT0iTkdYX0hBVkVfU0VOREZJTEU2NCIKLW5neF9mZWF0dXJlX3J1bj1ubwotbmd4X2ZlYXR1cmVfaW5jcz0iI2luY2x1ZGUgPHN5cy9zZW5kZmlsZS5oPiIKK25neF9mZWF0dXJlX3J1bj15ZXMKK25neF9mZWF0dXJlX2luY3M9IiNpbmNsdWRlIDxzeXMvc2VuZGZpbGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPiIKIG5neF9mZWF0dXJlX2xpYnM9CiBuZ3hfZmVhdHVyZV90ZXN0PSJpbnQgcyA9IDAsIGZkID0gMTsKICAgICAgICAgICAgICAgICAgIHNzaXplX3Qgbjsgb2ZmX3Qgb2ZmID0gMDsKLSAgICAgICAgICAgICAgICAgIG4gPSBzZW5kZmlsZShzLCBmZCwgJm9mZiwgMSkiCisgICAgICAgICAgICAgICAgICBuID0gc2VuZGZpbGUocywgZmQsICZvZmYsIDEpOworICAgICAgICAgICAgICAgICAgaWYgKG4gPT0gLTEgJiYgZXJybm8gPT0gRU5PU1lTKSByZXR1cm4gMSIKIC4gYXV0by9mZWF0dXJlCiAKIApkaWZmIC0tZ2l0IGEvYXV0by9zb3VyY2VzIGIvYXV0by9zb3VyY2VzCmluZGV4IGI1OTgwODMuLjVlYWNjMWEgMTAwNjQ0Ci0tLSBhL2F1dG8vc291cmNlcworKysgYi9hdXRvL3NvdXJjZXMKQEAgLTI2Niw2ICsyNjYsNyBAQAogCiBIVFRQX1NSQ1M9InNyYy9odHRwL25neF9odHRwLmMgXAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5jIFwKKyAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfY29uZmlnLmMgXAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9zcGVjaWFsX3Jlc3BvbnNlLmMgXAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMgXAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZS5jIFwKZGlmZiAtLWdpdCBhL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sIGIvZG9jcy94bWwvbmdpbngvY2hhbmdlcy54bWwKaW5kZXggMDY2YjVhNS4uMzMxNzMzNSAxMDA2NDQKLS0tIGEvZG9jcy94bWwvbmdpbngvY2hhbmdlcy54bWwKKysrIGIvZG9jcy94bWwvbmdpbngvY2hhbmdlcy54bWwKQEAgLTksNiArOSw1OCBAQAogPHRpdGxlIGxhbmc9ImVuIj5uZ2lueCBjaGFuZ2Vsb2c8L3RpdGxlPgogCiAKKzxjaGFuZ2VzIHZlcj0iMC4zLjE3IiBkYXRlPSIxOC4xMi4yMDA1Ij4KKworPGNoYW5nZSB0eXBlPSJjaGFuZ2UiPgorPHBhcmEgbGFuZz0icnUiPgorzsEgTGludXggY29uZmlndXJlINTF0MXS2CDQ0s/XxdLRxdQgzsHMyd7JxSBlcG9sbCDJIHNlbmRmaWxlNjQoKSDXINHE0sUuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Citub3cgb24gTGludXggY29uZmlndXJlIGNoZWNrcyB0aGUgcHJlc2VuY2Ugb2YgZXBvbGwgYW5kIHNlbmRmaWxlNjQoKSBpbiBrZXJuZWwuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK8TJ0sXL1MnXwSBtYXAg0M/ExMXS1snXwcXUIMTPzcXOztnFIMnNxc7BINcgxs/SzcHUxSAiLmRvbWFpbi50bGQiLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICJtYXAiIGRpcmVjdGl2ZSBzdXBwb3J0cyBkb21haW4gbmFtZXMgaW4gdGhlICIuZG9tYWluLnRsZCIgZm9ybS4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CivXzyDX0sXN0SBTU0wgaGFuZHNoYWtlIM7FIMlj0M/M2NrP18HMydPYINTBys3B1dTZLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlIHRpbWVvdXRzIHdlcmUgbm90IHVzZWQgaW4gU1NMIGhhbmRzaGFrZS4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CivXIMnT0M/M2NrP18HOyckg0NLP1M/Lz8zBIEhUVFBTINcgxMnSxcvUydfFIHByb3h5X3Bhc3MuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+CitpbiB0aGUgSFRUUCBwcm90b2NvbCBpbiB0aGUgInByb3h5X3Bhc3MiIGRpcmVjdGl2ZS4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CivQ0skgydPQz8zY2s/Xwc7JySDQ0s/Uz8vPzMEgSFRUUFMg1yDEydLFy9TJ18UgcHJveHlfcGFzcyDQzyDVzc/M3sHOycAKK8nT0M/M2NrP18HM09Eg0M/S1CA4MC4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3doZW4gdGhlIEhUVFAgcHJvdG9jb2wgd2FzIHVzZWQgaW4gdGhlICJwcm94eV9wYXNzIiBkaXJlY3RpdmUgdGhlIHBvcnQgODAKK3dhcyB1c2VkIGJ5IGRlZmF1bHQuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPC9jaGFuZ2VzPgorCisKIDxjaGFuZ2VzIHZlcj0iMC4zLjE2IiBkYXRlPSIxNi4xMi4yMDA1Ij4KIAogPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KQEAgLTM4Myw3ICs0MzUsNyBAQAogxMnSxcvUydfBIHByb3h5X3Bhc3Mg0M/ExMXS1snXwcXUINDSz9TPy8/MIEhUVFBTLgogPC9wYXJhPgogPHBhcmEgbGFuZz0iZW4iPgotdGhlICJwcm94eV9zZXRfYm9keSIgZGlyZWN0aXZlIHN1cHBvcnRzIHRoZSBIVFRQUyBwcm90b2NvbC4KK3RoZSAicHJveHlfcGFzcyIgZGlyZWN0aXZlIHN1cHBvcnRzIHRoZSBIVFRQUyBwcm90b2NvbC4KIDwvcGFyYT4KIDwvY2hhbmdlPgogCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ2lueC5oIGIvc3JjL2NvcmUvbmdpbnguaAppbmRleCBjZTllNTk2Li5jNmM1NjJmIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ2lueC5oCisrKyBiL3NyYy9jb3JlL25naW54LmgKQEAgLTgsNyArOCw3IEBACiAjZGVmaW5lIF9OR0lOWF9IX0lOQ0xVREVEXwogCiAKLSNkZWZpbmUgTkdJTlhfVkVSICAgICAgICAgICJuZ2lueC8wLjMuMTYiCisjZGVmaW5lIE5HSU5YX1ZFUiAgICAgICAgICAibmdpbngvMC4zLjE3IgogCiAjZGVmaW5lIE5HSU5YX1ZBUiAgICAgICAgICAiTkdJTlgiCiAjZGVmaW5lIE5HWF9PTERQSURfRVhUICAgICAiLm9sZGJpbiIKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9oYXNoLmMgYi9zcmMvY29yZS9uZ3hfaGFzaC5jCmluZGV4IDRkZWNkNDIuLmRhYjE5MzUgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9oYXNoLmMKKysrIGIvc3JjL2NvcmUvbmd4X2hhc2guYwpAQCAtNzYsMTAgKzc2LDYgQEAKICAgICAgICAgbi0tOwogICAgIH0KIAotICAgIGlmIChuID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCiAgICAga2V5ID0gMDsKIAogICAgIGZvciAoaSA9IG47IGkgPCBsZW47IGkrKykgewpAQCAtOTMsOCArODksMjggQEAKICAgICB2YWx1ZSA9IG5neF9oYXNoX2ZpbmQoJmh3Yy0+aGFzaCwga2V5LCAmbmFtZVtuXSwgbGVuIC0gbik7CiAKICAgICBpZiAodmFsdWUpIHsKKworICAgICAgICAvKgorICAgICAgICAgKiB0aGUgMiBsb3cgYml0cyBvZiB2YWx1ZSBoYXZlIHRoZSBzcGVjaWFsIG1lYW5pbmc6CisgICAgICAgICAqICAgICAwMCAtIHZhbHVlIGlzIGRhdGEgcG9pbnRlciwKKyAgICAgICAgICogICAgIDAxIC0gdmFsdWUgaXMgcG9pbnRlciB0byB3aWxkY2FyZCBoYXNoIGFsbG93aW5nCisgICAgICAgICAqICAgICAgICAgICIqLmV4YW1wbGUuY29tIiBvbmx5LAorICAgICAgICAgKiAgICAgMTEgLSB2YWx1ZSBpcyBwb2ludGVyIHRvIHdpbGRjYXJkIGhhc2ggYWxsb3dpbmcKKyAgICAgICAgICogICAgICAgICAgYm90aCAiZXhhbXBsZS5jb20iIGFuZCAiKi5leGFtcGxlLmNvbSIuCisgICAgICAgICAqLworCiAgICAgICAgIGlmICgodWludHB0cl90KSB2YWx1ZSAmIDEpIHsKLSAgICAgICAgICAgIGh3YyA9IChuZ3hfaGFzaF93aWxkY2FyZF90ICopICgodWludHB0cl90KSB2YWx1ZSAmICh1aW50cHRyX3QpIH4xKTsKKworICAgICAgICAgICAgaHdjID0gKG5neF9oYXNoX3dpbGRjYXJkX3QgKikgKCh1aW50cHRyX3QpIHZhbHVlICYgKHVpbnRwdHJfdCkgfjMpOworCisgICAgICAgICAgICBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCh1aW50cHRyX3QpIHZhbHVlICYgMikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHdjLT52YWx1ZTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdmFsdWUgPSBuZ3hfaGFzaF9maW5kX3dpbGRjYXJkKGh3YywgbmFtZSwgbiAtIDEpOwogCkBAIC0zMzIsNyArMzQ4LDcgQEAKICAgICBuZ3hfdWludF90IG5lbHRzKQogewogICAgIHNpemVfdCAgICAgICAgICAgICAgICBsZW47Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgIGksIG47CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgIGksIG4sIGRvdDsKICAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgY3Vycl9uYW1lcywgbmV4dF9uYW1lczsKICAgICBuZ3hfaGFzaF9rZXlfdCAgICAgICAqbmFtZSwgKm5leHRfbmFtZTsKICAgICBuZ3hfaGFzaF9pbml0X3QgICAgICAgaDsKQEAgLTM1OSw5ICszNzUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAid2MwOiBcIiVWXCIiLCAmbmFtZXNbbl0ua2V5KTsKICNlbmRpZgogCisgICAgICAgIGRvdCA9IDA7CisKICAgICAgICAgZm9yIChsZW4gPSAwOyBsZW4gPCBuYW1lc1tuXS5rZXkubGVuOyBsZW4rKykgewogICAgICAgICAgICAgaWYgKG5hbWVzW25dLmtleS5kYXRhW2xlbl0gPT0gJy4nKSB7Ci0gICAgICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICAgICAgZG90ID0gMTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzcxLDcgKzM4OSw3IEBACiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgbmFtZS0+a2V5LmxlbiA9IGxlbiAtIDE7CisgICAgICAgIG5hbWUtPmtleS5sZW4gPSBsZW47CiAgICAgICAgIG5hbWUtPmtleS5kYXRhID0gbmFtZXNbbl0ua2V5LmRhdGE7CiAgICAgICAgIG5hbWUtPmtleV9oYXNoID0gaGluaXQtPmtleShuYW1lLT5rZXkuZGF0YSwgbmFtZS0+a2V5Lmxlbik7CiAgICAgICAgIG5hbWUtPnZhbHVlID0gbmFtZXNbbl0udmFsdWU7CkBAIC0zODEsNiArMzk5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgIndjMTogXCIlVlwiIiwgJm5hbWUtPmtleSk7CiAjZW5kaWYKIAorICAgICAgICBpZiAoZG90KSB7CisgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgfQorCiAgICAgICAgIG5leHRfbmFtZXMubmVsdHMgPSAwOwogCiAgICAgICAgIGlmIChuYW1lc1tuXS5rZXkubGVuICE9IGxlbikgewpAQCAtNDE3LDcgKzQzOSw3IEBACiAKICNpZiAwCiAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIGhpbml0LT5wb29sLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJ3YzI6IFwiJVZcIiIsICZuZXh0X25hbWUtPmtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICJ3YzM6IFwiJVZcIiIsICZuZXh0X25hbWUtPmtleSk7CiAjZW5kaWYKICAgICAgICAgfQogCkBAIC00NDIsNyArNDY0LDcgQEAKICNlbmRpZgogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBuYW1lLT52YWx1ZSA9ICh2b2lkICopICgodWludHB0cl90KSB3ZGMgfCAxKTsKKyAgICAgICAgICAgIG5hbWUtPnZhbHVlID0gKHZvaWQgKikgKCh1aW50cHRyX3QpIHdkYyB8IChkb3QgPyAxIDogMykpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvZXZlbnQvbmd4X2V2ZW50X29wZW5zc2wuYyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfb3BlbnNzbC5jCmluZGV4IGIzNDM3MTguLjc4ODQ2M2MgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfb3BlbnNzbC5jCisrKyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfb3BlbnNzbC5jCkBAIC0zMzQsNiArMzM0LDcgQEAKICAgICBpZiAoc3NsZXJyID09IFNTTF9FUlJPUl9XQU5UX1JFQUQpIHsKICAgICAgICAgYy0+cmVhZC0+cmVhZHkgPSAwOwogICAgICAgICBjLT5yZWFkLT5oYW5kbGVyID0gbmd4X3NzbF9oYW5kc2hha2VfaGFuZGxlcjsKKyAgICAgICAgYy0+d3JpdGUtPmhhbmRsZXIgPSBuZ3hfc3NsX2hhbmRzaGFrZV9oYW5kbGVyOwogCiAgICAgICAgIGlmIChuZ3hfaGFuZGxlX3JlYWRfZXZlbnQoYy0+cmVhZCwgMCkgPT0gTkdYX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwpAQCAtMzQ0LDYgKzM0NSw3IEBACiAKICAgICBpZiAoc3NsZXJyID09IFNTTF9FUlJPUl9XQU5UX1dSSVRFKSB7CiAgICAgICAgIGMtPndyaXRlLT5yZWFkeSA9IDA7CisgICAgICAgIGMtPnJlYWQtPmhhbmRsZXIgPSBuZ3hfc3NsX2hhbmRzaGFrZV9oYW5kbGVyOwogICAgICAgICBjLT53cml0ZS0+aGFuZGxlciA9IG5neF9zc2xfaGFuZHNoYWtlX2hhbmRsZXI7CiAKICAgICAgICAgaWYgKG5neF9oYW5kbGVfd3JpdGVfZXZlbnQoYy0+d3JpdGUsIDApID09IE5HWF9FUlJPUikgewpAQCAtMzU3LDYgKzM1OSw3IEBACiAKICAgICBjLT5zc2wtPm5vX3dhaXRfc2h1dGRvd24gPSAxOwogICAgIGMtPnNzbC0+bm9fc2VuZF9zaHV0ZG93biA9IDE7CisgICAgYy0+cmVhZC0+ZW9mID0gMTsKIAogICAgIGlmIChzc2xlcnIgPT0gU1NMX0VSUk9SX1pFUk9fUkVUVVJOIHx8IEVSUl9wZWVrX2Vycm9yKCkgPT0gMCkgewogICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfSU5GTywgYy0+bG9nLCBlcnIsCkBAIC0zNjUsNiArMzY4LDggQEAKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKKyAgICBjLT5yZWFkLT5lcnJvciA9IDE7CisKICAgICBuZ3hfc3NsX2Nvbm5lY3Rpb25fZXJyb3IoYywgc3NsZXJyLCBlcnIsICJTU0xfZG9faGFuZHNoYWtlKCkgZmFpbGVkIik7CiAKICAgICByZXR1cm4gTkdYX0VSUk9SOwpAQCAtMzgxLDYgKzM4NiwxMSBAQAogICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfRVZFTlQsIGMtPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAiU1NMIGhhbmRzaGFrZSBoYW5kbGVyOiAlZCIsIGV2LT53cml0ZSk7CiAKKyAgICBpZiAoZXYtPnRpbWVkb3V0KSB7CisgICAgICAgIGMtPnNzbC0+aGFuZGxlcihjKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGlmIChuZ3hfc3NsX2hhbmRzaGFrZShjKSA9PSBOR1hfQUdBSU4pIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTU0OCw2ICs1NTgsNyBAQAogICAgICAgICByZXR1cm4gTkdYX0RPTkU7CiAgICAgfQogCisgICAgYy0+cmVhZC0+ZXJyb3IgPSAxOwogICAgIG5neF9zc2xfY29ubmVjdGlvbl9lcnJvcihjLCBzc2xlcnIsIGVyciwgIlNTTF9yZWFkKCkgZmFpbGVkIik7CiAKICAgICByZXR1cm4gTkdYX0VSUk9SOwpAQCAtNzczLDYgKzc4NCw3IEBACiAKICAgICBjLT5zc2wtPm5vX3dhaXRfc2h1dGRvd24gPSAxOwogICAgIGMtPnNzbC0+bm9fc2VuZF9zaHV0ZG93biA9IDE7CisgICAgYy0+d3JpdGUtPmVycm9yID0gMTsKIAogICAgIG5neF9zc2xfY29ubmVjdGlvbl9lcnJvcihjLCBzc2xlcnIsIGVyciwgIlNTTF93cml0ZSgpIGZhaWxlZCIpOwogCkBAIC03OTUsNiArODA3LDcgQEAKIG5neF9zc2xfc2h1dGRvd24obmd4X2Nvbm5lY3Rpb25fdCAqYykKIHsKICAgICBpbnQgICAgICAgICBuLCBzc2xlcnIsIG1vZGU7CisgICAgbmd4X2Vycl90ICAgZXJyOwogICAgIG5neF91aW50X3QgIGFnYWluOwogCiAgICAgaWYgKGMtPnRpbWVkb3V0KSB7CkBAIC04NjYsNyArODc5LDkgQEAKICAgICAgICAgcmV0dXJuIE5HWF9BR0FJTjsKICAgICB9CiAKLSAgICBuZ3hfc3NsX2Vycm9yKE5HWF9MT0dfQUxFUlQsIGMtPmxvZywgMCwgIlNTTF9zaHV0ZG93bigpIGZhaWxlZCIpOworICAgIGVyciA9IChzc2xlcnIgPT0gU1NMX0VSUk9SX1NZU0NBTEwpID8gbmd4X2Vycm5vIDogMDsKKworICAgIG5neF9zc2xfY29ubmVjdGlvbl9lcnJvcihjLCBzc2xlcnIsIGVyciwgIlNTTF9zaHV0ZG93bigpIGZhaWxlZCIpOwogCiAgICAgU1NMX2ZyZWUoYy0+c3NsLT5jb25uZWN0aW9uKTsKICAgICBjLT5zc2wgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9tYXBfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX21hcF9tb2R1bGUuYwppbmRleCAyNzY5MDI4Li4wNGUyZTBhIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX21hcF9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX21hcF9tb2R1bGUuYwpAQCAtOSw4ICs5LDYgQEAKICNpbmNsdWRlIDxuZ3hfaHR0cC5oPgogCiAKLSNkZWZpbmUgTkdYX0hUVFBfTUFQX0hBU0ggICAgICAgMTAwMDcKLQogdHlwZWRlZiBzdHJ1Y3QgewogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBoYXNoX21heF9zaXplOwogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBoYXNoX2J1Y2tldF9zaXplOwpAQCAtMTgsMTMgKzE2LDcgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X3Bvb2xfdCAgICAgICAgICAgICAgICAgKnBvb2w7Ci0KLSAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAga2V5czsKLSAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAqa2V5c19oYXNoOwotCi0gICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgIGRuc193aWxkY2FyZHM7Ci0gICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgKmRuc19oYXNoOworICAgIG5neF9odHRwX2hhc2hfY29uZl90ICAgICAgICBoYXNoOwogCiAgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgKnZhbHVlc19oYXNoOwogCkBAIC0yNTMsNDAgKzI0NSw0NCBAQAogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCi0gICAgaWYgKG5neF9hcnJheV9pbml0KCZjdHgua2V5cywgcG9vbCwgMTYzODQsIHNpemVvZihuZ3hfaGFzaF9rZXlfdCkpCisgICAgaWYgKG5neF9hcnJheV9pbml0KCZjdHguaGFzaC5rZXlzLCBwb29sLCAxNjM4NCwgc2l6ZW9mKG5neF9oYXNoX2tleV90KSkKICAgICAgICAgIT0gTkdYX09LKQogICAgIHsKICAgICAgICAgbmd4X2Rlc3Ryb3lfcG9vbChwb29sKTsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAotICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmY3R4LmRuc193aWxkY2FyZHMsIHBvb2wsIDE2Mzg0LCBzaXplb2Yobmd4X2hhc2hfa2V5X3QpKQorICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmY3R4Lmhhc2guZG5zX3dpbGRjYXJkcywgcG9vbCwgMTYzODQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaGFzaF9rZXlfdCkpCiAgICAgICAgICE9IE5HWF9PSykKICAgICB7CiAgICAgICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKLSAgICBjdHgua2V5c19oYXNoID0gbmd4X3BjYWxsb2MocG9vbCwgc2l6ZW9mKG5neF9hcnJheV90KSAqIE5HWF9IVFRQX01BUF9IQVNIKTsKLSAgICBpZiAoY3R4LmtleXNfaGFzaCA9PSBOVUxMKSB7CisgICAgY3R4Lmhhc2gua2V5c19oYXNoID0gbmd4X3BjYWxsb2MocG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfYXJyYXlfdCkgKiBOR1hfSFRUUF9DT05GSUdfSEFTSCk7CisgICAgaWYgKGN0eC5oYXNoLmtleXNfaGFzaCA9PSBOVUxMKSB7CiAgICAgICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKLSAgICBjdHguZG5zX2hhc2ggPSBuZ3hfcGNhbGxvYyhwb29sLCBzaXplb2Yobmd4X2FycmF5X3QpICogTkdYX0hUVFBfTUFQX0hBU0gpOwotICAgIGlmIChjdHguZG5zX2hhc2ggPT0gTlVMTCkgeworICAgIGN0eC5oYXNoLmRuc19oYXNoID0gbmd4X3BjYWxsb2MocG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfYXJyYXlfdCkgKiBOR1hfSFRUUF9DT05GSUdfSEFTSCk7CisgICAgaWYgKGN0eC5oYXNoLmRuc19oYXNoID09IE5VTEwpIHsKICAgICAgICAgbmd4X2Rlc3Ryb3lfcG9vbChwb29sKTsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAogICAgIGN0eC52YWx1ZXNfaGFzaCA9IG5neF9wY2FsbG9jKHBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9hcnJheV90KSAqIE5HWF9IVFRQX01BUF9IQVNIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2FycmF5X3QpICogTkdYX0hUVFBfQ09ORklHX0hBU0gpOwogICAgIGlmIChjdHgudmFsdWVzX2hhc2ggPT0gTlVMTCkgewogICAgICAgICBuZ3hfZGVzdHJveV9wb29sKHBvb2wpOwogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCi0gICAgY3R4LnBvb2wgPSBjZi0+cG9vbDsKKyAgICBjdHguaGFzaC5wb29sID0gY2YtPnBvb2w7CisgICAgY3R4Lmhhc2gudGVtcF9wb29sID0gcG9vbDsKICAgICBjdHguZGVmYXVsdF92YWx1ZSA9IE5VTEw7CiAgICAgY3R4Lmhvc3RuYW1lcyA9IDA7CiAKQEAgLTMxMiwxMSArMzA4LDEzIEBACiAgICAgaGFzaC5uYW1lID0gIm1hcF9oYXNoIjsKICAgICBoYXNoLnBvb2wgPSBjZi0+cG9vbDsKIAotICAgIGlmIChjdHgua2V5cy5uZWx0cykgeworICAgIGlmIChjdHguaGFzaC5rZXlzLm5lbHRzKSB7CiAgICAgICAgIGhhc2guaGFzaCA9ICZtYXAtPmhhc2g7CiAgICAgICAgIGhhc2gudGVtcF9wb29sID0gTlVMTDsKIAotICAgICAgICBpZiAobmd4X2hhc2hfaW5pdCgmaGFzaCwgY3R4LmtleXMuZWx0cywgY3R4LmtleXMubmVsdHMpICE9IE5HWF9PSykgeworICAgICAgICBpZiAobmd4X2hhc2hfaW5pdCgmaGFzaCwgY3R4Lmhhc2gua2V5cy5lbHRzLCBjdHguaGFzaC5rZXlzLm5lbHRzKQorICAgICAgICAgICAgIT0gTkdYX09LKQorICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMjQsMTYgKzMyMiwxNyBAQAogICAgIG1hcC0+ZGVmYXVsdF92YWx1ZSA9IGN0eC5kZWZhdWx0X3ZhbHVlID8gY3R4LmRlZmF1bHRfdmFsdWU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmd4X2h0dHBfdmFyaWFibGVfbnVsbF92YWx1ZTsKIAotICAgIGlmIChjdHguZG5zX3dpbGRjYXJkcy5uZWx0cykgeworICAgIGlmIChjdHguaGFzaC5kbnNfd2lsZGNhcmRzLm5lbHRzKSB7CiAKLSAgICAgICAgbmd4X3Fzb3J0KGN0eC5kbnNfd2lsZGNhcmRzLmVsdHMsIChzaXplX3QpIGN0eC5kbnNfd2lsZGNhcmRzLm5lbHRzLAorICAgICAgICBuZ3hfcXNvcnQoY3R4Lmhhc2guZG5zX3dpbGRjYXJkcy5lbHRzLAorICAgICAgICAgICAgICAgICAgKHNpemVfdCkgY3R4Lmhhc2guZG5zX3dpbGRjYXJkcy5uZWx0cywKICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaGFzaF9rZXlfdCksIG5neF9odHRwX21hcF9jbXBfZG5zX3dpbGRjYXJkcyk7CiAKICAgICAgICAgaGFzaC5oYXNoID0gTlVMTDsKICAgICAgICAgaGFzaC50ZW1wX3Bvb2wgPSBwb29sOwogCi0gICAgICAgIGlmIChuZ3hfaGFzaF93aWxkY2FyZF9pbml0KCZoYXNoLCBjdHguZG5zX3dpbGRjYXJkcy5lbHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguZG5zX3dpbGRjYXJkcy5uZWx0cykKKyAgICAgICAgaWYgKG5neF9oYXNoX3dpbGRjYXJkX2luaXQoJmhhc2gsIGN0eC5oYXNoLmRuc193aWxkY2FyZHMuZWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lmhhc2guZG5zX3dpbGRjYXJkcy5uZWx0cykKICAgICAgICAgICAgICE9IE5HWF9PSykKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwpAQCAtMzYzLDEzICszNjIsMTIgQEAKIHN0YXRpYyBjaGFyICoKIG5neF9odHRwX21hcChuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqZHVtbXksIHZvaWQgKmNvbmYpCiB7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgIGxlbjsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAqdmFsdWUsIGZpbGUsICpuYW1lOwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBpLCBuLCBrZXk7Ci0gICAgbmd4X2hhc2hfa2V5X3QgICAgICAgICAgICAgKm07CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgIGNoOworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICByYzsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAqdmFsdWUsIGZpbGU7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIGksIGtleSwgZmxhZ3M7CiAgICAgbmd4X2h0dHBfbWFwX2NvbmZfY3R4X3QgICAgKmN0eDsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdmFyLCAqb2xkLCAqKnZwOwotICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICBidWZbMjA0OF07CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnZhciwgKip2cDsKIAogICAgIGN0eCA9IGNmLT5jdHg7CiAKQEAgLTQxMCw3ICs0MDgsNyBAQAogICAgICAgICBrZXkgPSBuZ3hfaGFzaChrZXksIHZhbHVlWzFdLmRhdGFbaV0pOwogICAgIH0KIAotICAgIGtleSAlPSBOR1hfSFRUUF9NQVBfSEFTSDsKKyAgICBrZXkgJT0gTkdYX0hUVFBfQ09ORklHX0hBU0g7CiAKICAgICB2cCA9IGN0eC0+dmFsdWVzX2hhc2hba2V5XS5lbHRzOwogCkBAIC00MzUsMTMgKzQzMywxMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdmFyID0gbmd4X3BhbGxvYyhjdHgtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7CisgICAgdmFyID0gbmd4X3BhbGxvYyhjdHgtPmhhc2gucG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKICAgICBpZiAodmFyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAogICAgIHZhci0+bGVuID0gdmFsdWVbMV0ubGVuOwotICAgIHZhci0+ZGF0YSA9IG5neF9wc3RyZHVwKGN0eC0+cG9vbCwgJnZhbHVlWzFdKTsKKyAgICB2YXItPmRhdGEgPSBuZ3hfcHN0cmR1cChjdHgtPmhhc2gucG9vbCwgJnZhbHVlWzFdKTsKICAgICBpZiAodmFyLT5kYXRhID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KQEAgLTQ1OSwxNzkgKzQ1Nyw1NCBAQAogCiBmb3VuZDoKIAotICAgIGlmICh2YWx1ZVswXS5kYXRhWzBdICE9ICcqJyB8fCBjdHgtPmhvc3RuYW1lcyA9PSAwKSB7CisgICAgY2ggPSB2YWx1ZVswXS5kYXRhWzBdOwogCi0gICAgICAgIGlmIChuZ3hfc3RyY21wKHZhbHVlWzBdLmRhdGEsICJkZWZhdWx0IikgIT0gMCkgeworICAgIGlmICgoY2ggIT0gJyonICYmIGNoICE9ICcuJykgfHwgY3R4LT5ob3N0bmFtZXMgPT0gMCkgewogCi0gICAgICAgICAgICBpZiAodmFsdWVbMF0ubGVuICYmIHZhbHVlWzBdLmRhdGFbMF0gPT0gJyEnKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVbMF0ubGVuLS07Ci0gICAgICAgICAgICAgICAgdmFsdWVbMF0uZGF0YSsrOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAobmd4X3N0cmNtcCh2YWx1ZVswXS5kYXRhLCAiZGVmYXVsdCIpID09IDApIHsKIAotICAgICAgICAgICAga2V5ID0gMDsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHZhbHVlWzBdLmxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVbMF0uZGF0YVtpXSA9IG5neF90b2xvd2VyKHZhbHVlWzBdLmRhdGFbaV0pOwotICAgICAgICAgICAgICAgIGtleSA9IG5neF9oYXNoKGtleSwgdmFsdWVbMF0uZGF0YVtpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGtleSAlPSBOR1hfSFRUUF9NQVBfSEFTSDsKLQotICAgICAgICAgICAgbmFtZSA9IGN0eC0+a2V5c19oYXNoW2tleV0uZWx0czsKLQotICAgICAgICAgICAgaWYgKG5hbWUpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5rZXlzX2hhc2hba2V5XS5uZWx0czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVswXS5sZW4gIT0gbmFtZVtpXS5sZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5neF9zdHJuY21wKHZhbHVlWzBdLmRhdGEsIG5hbWVbaV0uZGF0YSwgdmFsdWVbMF0ubGVuKQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbSA9IGN0eC0+a2V5cy5lbHRzOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+a2V5cy5uZWx0czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5neF9zdHJjbXAodmFsdWVbMF0uZGF0YSwgbVtpXS5rZXkuZGF0YSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQgPSBtW2ldLnZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtW2ldLnZhbHVlID0gdmFyOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZHVwbGljYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobmd4X2FycmF5X2luaXQoJmN0eC0+a2V5c19oYXNoW2tleV0sIGNmLT5wb29sLCA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X3N0cl90KSkKLSAgICAgICAgICAgICAgICAgICAgIT0gTkdYX09LKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbmFtZSA9IG5neF9hcnJheV9wdXNoKCZjdHgtPmtleXNfaGFzaFtrZXldKTsKLSAgICAgICAgICAgIGlmIChuYW1lID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpuYW1lID0gdmFsdWVbMF07Ci0KLSAgICAgICAgICAgIG0gPSBuZ3hfYXJyYXlfcHVzaCgmY3R4LT5rZXlzKTsKLSAgICAgICAgICAgIGlmIChtID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG0tPmtleSA9IHZhbHVlWzBdOwotICAgICAgICAgICAgbS0+a2V5X2hhc2ggPSBuZ3hfaGFzaF9rZXkodmFsdWVbMF0uZGF0YSwgdmFsdWVbMF0ubGVuKTsKLSAgICAgICAgICAgIG0tPnZhbHVlID0gdmFyOwotCi0gICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoY3R4LT5kZWZhdWx0X3ZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgb2xkID0gY3R4LT5kZWZhdWx0X3ZhbHVlOwotICAgICAgICAgICAgICAgIGN0eC0+ZGVmYXVsdF92YWx1ZSA9IHZhcjsKLQotICAgICAgICAgICAgICAgIGdvdG8gZHVwbGljYXRlOworICAgICAgICAgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1cGxpY2F0ZSBkZWZhdWx0IG1hcCBwYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGN0eC0+ZGVmYXVsdF92YWx1ZSA9IHZhcjsKKworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKHZhbHVlWzBdLmxlbiAmJiBjaCA9PSAnIScpIHsKKyAgICAgICAgICAgIHZhbHVlWzBdLmxlbi0tOworICAgICAgICAgICAgdmFsdWVbMF0uZGF0YSsrOworICAgICAgICB9CisKKyAgICAgICAgZmxhZ3MgPSAwOworCiAgICAgfSBlbHNlIHsKIAotICAgICAgICBpZiAodmFsdWVbMF0ubGVuIDwgMyB8fCB2YWx1ZVswXS5kYXRhWzFdICE9ICcuJykgeworICAgICAgICBpZiAoKGNoID09ICcqJyAmJiAodmFsdWVbMF0ubGVuIDwgMyB8fCB2YWx1ZVswXS5kYXRhWzFdICE9ICcuJykpCisgICAgICAgICAgICB8fCAoY2ggPT0gJy4nICYmIHZhbHVlWzBdLmxlbiA8IDIpKQorICAgICAgICB7CiAgICAgICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgRE5TIHdpbGRjYXJkIFwiJVZcIiIsICZ2YWx1ZVswXSk7CisKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIGtleSA9IDA7Ci0KLSAgICAgICAgZm9yIChpID0gMjsgaSA8IHZhbHVlWzBdLmxlbjsgaSsrKSB7Ci0gICAgICAgICAgICB2YWx1ZVswXS5kYXRhW2ldID0gbmd4X3RvbG93ZXIodmFsdWVbMF0uZGF0YVtpXSk7Ci0gICAgICAgICAgICBrZXkgPSBuZ3hfaGFzaChrZXksIHZhbHVlWzBdLmRhdGFbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAga2V5ICU9IE5HWF9IVFRQX01BUF9IQVNIOwotCi0gICAgICAgIC8qIGNvbnZlcnQgIiouZXhhbXBsZS5jb20iIGludG8gImNvbS5leGFtcGxlLlwwIiAqLwotCi0gICAgICAgIGxlbiA9IDA7Ci0gICAgICAgIG4gPSAwOwotCi0gICAgICAgIGZvciAoaSA9IHZhbHVlWzBdLmxlbiAtIDE7IGk7IGktLSkgewotICAgICAgICAgICAgaWYgKHZhbHVlWzBdLmRhdGFbaV0gPT0gJy4nKSB7Ci0gICAgICAgICAgICAgICAgbmd4X21lbWNweSgmYnVmW25dLCAmdmFsdWVbMF0uZGF0YVtpICsgMV0sIGxlbik7Ci0gICAgICAgICAgICAgICAgbiArPSBsZW47Ci0gICAgICAgICAgICAgICAgYnVmW24rK10gPSAnLic7Ci0gICAgICAgICAgICAgICAgbGVuID0gMDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbGVuKys7Ci0gICAgICAgIH0KLQotICAgICAgICBidWZbbl0gPSAnXDAnOwotCi0gICAgICAgIG5hbWUgPSBjdHgtPmRuc19oYXNoW2tleV0uZWx0czsKLQotICAgICAgICBpZiAobmFtZSkgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+ZG5zX2hhc2hba2V5XS5uZWx0czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlWzBdLmxlbiAhPSBuYW1lW2ldLmxlbikgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmd4X3N0cm5jbXAodmFsdWVbMF0uZGF0YSwgbmFtZVtpXS5kYXRhLCB2YWx1ZVswXS5sZW4pCi0gICAgICAgICAgICAgICAgICAgID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtID0gY3R4LT5kbnNfd2lsZGNhcmRzLmVsdHM7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPmRuc193aWxkY2FyZHMubmVsdHM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5neF9zdHJjbXAoYnVmLCBtW2ldLmtleS5kYXRhKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkID0gbVtpXS52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtW2ldLnZhbHVlID0gdmFyOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkdXBsaWNhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmY3R4LT5kbnNfaGFzaFtrZXldLCBjZi0+cG9vbCwgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X3N0cl90KSkKLSAgICAgICAgICAgICAgICAhPSBOR1hfT0spCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbmFtZSA9IG5neF9hcnJheV9wdXNoKCZjdHgtPmRuc19oYXNoW2tleV0pOwotICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICAqbmFtZSA9IHZhbHVlWzBdOwotCi0gICAgICAgIG5neF9tZW1jcHkodmFsdWVbMF0uZGF0YSwgYnVmLCB2YWx1ZVswXS5sZW4pOwotICAgICAgICB2YWx1ZVswXS5sZW4tLTsKLQotICAgICAgICBtID0gbmd4X2FycmF5X3B1c2goJmN0eC0+ZG5zX3dpbGRjYXJkcyk7Ci0gICAgICAgIGlmIChtID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIG0tPmtleSA9IHZhbHVlWzBdOwotICAgICAgICBtLT5rZXlfaGFzaCA9IDA7Ci0gICAgICAgIG0tPnZhbHVlID0gdmFyOworICAgICAgICBmbGFncyA9IE5HWF9IVFRQX1dJTERDQVJEX0hBU0g7CiAgICAgfQogCi0gICAgcmV0dXJuIE5HWF9DT05GX09LOworICAgIHJjID0gbmd4X2h0dHBfY29uZmlnX2FkZF9oYXNoKCZjdHgtPmhhc2gsICZ2YWx1ZVswXSwgdmFyLCBmbGFncyk7CiAKLWR1cGxpY2F0ZToKKyAgICBpZiAocmMgPT0gTkdYX09LKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9PSzsKKyAgICB9CiAKLSAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19XQVJOLCBjZiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgImR1cGxpY2F0ZSBwYXJhbWV0ZXIgXCIlVlwiLCB2YWx1ZTogXCIlVlwiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICJvbGQgdmFsdWU6IFwiJVZcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZVswXSwgdmFyLCBvbGQpOworICAgIGlmIChyYyA9PSBOR1hfQlVTWSkgeworICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZmxpY3RpbmcgcGFyYW1ldGVyIFwiJVZcIiIsICZ2YWx1ZVswXSk7CisgICAgfQogCi0gICAgcmV0dXJuIE5HWF9DT05GX09LOworICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKIH0KZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcHJveHlfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Byb3h5X21vZHVsZS5jCmluZGV4IGMzOWYzMjAuLmMyYmUyYzQgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcHJveHlfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9wcm94eV9tb2R1bGUuYwpAQCAtMTkyNiw2ICsxOTI2LDcgQEAKIAogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgYWRkOwogICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAqdmFsdWUsICp1cmw7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICBwb3J0OwogICAgIG5neF9pbmV0X3Vwc3RyZWFtX3QgICAgICAgICAgaW5ldF91cHN0cmVhbTsKICAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICAgKmNsY2Y7CiAjaWYgKE5HWF9IVFRQX1NTTCkKQEAgLTE5NDUsMTIgKzE5NDYsMTQgQEAKIAogICAgIGlmIChuZ3hfc3RybmNhc2VjbXAodXJsLT5kYXRhLCAiaHR0cDovLyIsIDcpID09IDApIHsKICAgICAgICAgYWRkID0gNzsKKyAgICAgICAgcG9ydCA9IDgwOwogCiAgICAgfSBlbHNlIGlmIChuZ3hfc3RybmNhc2VjbXAodXJsLT5kYXRhLCAiaHR0cHM6Ly8iLCA4KSA9PSAwKSB7CiAKICNpZiAoTkdYX0hUVFBfU1NMKQogCiAgICAgICAgIGFkZCA9IDg7CisgICAgICAgIHBvcnQgPSA0NDM7CiAKICAgICAgICAgcGxjZi0+dXBzdHJlYW0uc3NsID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfc3NsX3QpKTsKICAgICAgICAgaWYgKHBsY2YtPnVwc3RyZWFtLnNzbCA9PSBOVUxMKSB7CkBAIC0yMDE5LDcgKzIwMjIsNyBAQAogICAgICAgICBpbmV0X3Vwc3RyZWFtLm5hbWUgPSAqdXJsOwogICAgICAgICBpbmV0X3Vwc3RyZWFtLnVybC5sZW4gPSB1cmwtPmxlbiAtIGFkZDsKICAgICAgICAgaW5ldF91cHN0cmVhbS51cmwuZGF0YSA9IHVybC0+ZGF0YSArIGFkZDsKLSAgICAgICAgaW5ldF91cHN0cmVhbS5kZWZhdWx0X3BvcnRfdmFsdWUgPSA4MDsKKyAgICAgICAgaW5ldF91cHN0cmVhbS5kZWZhdWx0X3BvcnRfdmFsdWUgPSBwb3J0OwogICAgICAgICBpbmV0X3Vwc3RyZWFtLnVyaV9wYXJ0ID0gMTsKIAogICAgICAgICBwbGNmLT5wZWVycyA9IG5neF9pbmV0X3Vwc3RyZWFtX3BhcnNlKGNmLCAmaW5ldF91cHN0cmVhbSk7CkBAIC0yMDMyLDggKzIwMzUsOCBAQAogICAgICAgICBwbGNmLT51cHN0cmVhbS51cmkgPSBpbmV0X3Vwc3RyZWFtLnVyaTsKICAgICB9CiAKLSAgICBwbGNmLT51cHN0cmVhbS5zY2hlbWEubGVuID0gc2l6ZW9mKCJodHRwOi8vIikgLSAxOwotICAgIHBsY2YtPnVwc3RyZWFtLnNjaGVtYS5kYXRhID0gKHVfY2hhciAqKSAiaHR0cDovLyI7CisgICAgcGxjZi0+dXBzdHJlYW0uc2NoZW1hLmxlbiA9IGFkZDsKKyAgICBwbGNmLT51cHN0cmVhbS5zY2hlbWEuZGF0YSA9IHVybC0+ZGF0YTsKIAogICAgIGNsY2YgPSBuZ3hfaHR0cF9jb25mX2dldF9tb2R1bGVfbG9jX2NvbmYoY2YsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfY29uZmlnLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjU2MjVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29uZmlnLmMKQEAgLTAsMCArMSwyMTQgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgSWdvciBTeXNvZXYKKyAqLworCisKKyNpbmNsdWRlIDxuZ3hfY29uZmlnLmg+CisjaW5jbHVkZSA8bmd4X2NvcmUuaD4KKyNpbmNsdWRlIDxuZ3hfZXZlbnQuaD4KKyNpbmNsdWRlIDxuZ3hfaHR0cC5oPgorCisKK25neF9pbnRfdAorbmd4X2h0dHBfY29uZmlnX2FkZF9oYXNoKG5neF9odHRwX2hhc2hfY29uZl90ICpoLCBuZ3hfc3RyX3QgKmtleSwgdm9pZCAqdmFsdWUsCisgICAgbmd4X3VpbnRfdCBmbGFncykKK3sKKyAgICBzaXplX3QgICAgICAgICAgIGxlbjsKKyAgICBuZ3hfc3RyX3QgICAgICAgKm5hbWU7CisgICAgbmd4X3VpbnRfdCAgICAgICBpLCBrLCBuLCBza2lwOworICAgIG5neF9oYXNoX2tleV90ICAqaGs7CisgICAgdV9jaGFyICAgICAgICAgICBidWZbMjA0OF07CisKKyAgICBpZiAoIShmbGFncyAmIE5HWF9IVFRQX1dJTERDQVJEX0hBU0gpKSB7CisKKyAgICAgICAgLyogZXhhY3QgaGFzaCAqLworCisgICAgICAgIGsgPSAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXktPmxlbjsgaSsrKSB7CisgICAgICAgICAgICBrZXktPmRhdGFbaV0gPSBuZ3hfdG9sb3dlcihrZXktPmRhdGFbaV0pOworICAgICAgICAgICAgayA9IG5neF9oYXNoKGssIGtleS0+ZGF0YVtpXSk7CisgICAgICAgIH0KKworICAgICAgICBrICU9IE5HWF9IVFRQX0NPTkZJR19IQVNIOworCisgICAgICAgIC8qIGNoZWNrIGNvbmZsaWN0cyBpbiBleGFjdCBoYXNoICovCisKKyAgICAgICAgbmFtZSA9IGgtPmtleXNfaGFzaFtrXS5lbHRzOworCisgICAgICAgIGlmIChuYW1lKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaC0+a2V5c19oYXNoW2tdLm5lbHRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoa2V5LT5sZW4gIT0gbmFtZVtpXS5sZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5neF9zdHJuY21wKGtleS0+ZGF0YSwgbmFtZVtpXS5kYXRhLCBrZXktPmxlbikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0JVU1k7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobmd4X2FycmF5X2luaXQoJmgtPmtleXNfaGFzaFtrXSwgaC0+dGVtcF9wb29sLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfc3RyX3QpKQorICAgICAgICAgICAgICAgICE9IE5HWF9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbmFtZSA9IG5neF9hcnJheV9wdXNoKCZoLT5rZXlzX2hhc2hba10pOworICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgKm5hbWUgPSAqa2V5OworCisgICAgICAgIGhrID0gbmd4X2FycmF5X3B1c2goJmgtPmtleXMpOworICAgICAgICBpZiAoaGsgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGhrLT5rZXkgPSAqa2V5OworICAgICAgICBoay0+a2V5X2hhc2ggPSBuZ3hfaGFzaF9rZXkoa2V5LT5kYXRhLCBrZXktPmxlbik7CisgICAgICAgIGhrLT52YWx1ZSA9IHZhbHVlOworCisgICAgfSBlbHNlIHsKKworICAgICAgICAvKiB3aWxkY2FyZCBoYXNoICovCisKKyAgICAgICAgc2tpcCA9IChrZXktPmRhdGFbMF0gPT0gJyonKSA/IDIgOiAxOworICAgICAgICBrID0gMDsKKworICAgICAgICBmb3IgKGkgPSBza2lwOyBpIDwga2V5LT5sZW47IGkrKykgeworICAgICAgICAgICAga2V5LT5kYXRhW2ldID0gbmd4X3RvbG93ZXIoa2V5LT5kYXRhW2ldKTsKKyAgICAgICAgICAgIGsgPSBuZ3hfaGFzaChrLCBrZXktPmRhdGFbaV0pOworICAgICAgICB9CisKKyAgICAgICAgayAlPSBOR1hfSFRUUF9DT05GSUdfSEFTSDsKKworICAgICAgICBpZiAoc2tpcCA9PSAxKSB7CisKKyAgICAgICAgICAgIC8qIGNoZWNrIGNvbmZsaWN0cyBpbiBleGFjdCBoYXNoIGZvciAiLmV4YW1wbGUuY29tIiAqLworCisgICAgICAgICAgICBuYW1lID0gaC0+a2V5c19oYXNoW2tdLmVsdHM7CisKKyAgICAgICAgICAgIGlmIChuYW1lKSB7CisgICAgICAgICAgICAgICAgbGVuID0ga2V5LT5sZW4gLSBza2lwOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGgtPmtleXNfaGFzaFtrXS5uZWx0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gIT0gbmFtZVtpXS5sZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5neF9zdHJuY21wKCZrZXktPmRhdGFbMV0sIG5hbWVbaV0uZGF0YSwgbGVuKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0JVU1k7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG5neF9hcnJheV9pbml0KCZoLT5rZXlzX2hhc2hba10sIGgtPnRlbXBfcG9vbCwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9zdHJfdCkpCisgICAgICAgICAgICAgICAgICAgICE9IE5HWF9PSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuYW1lID0gbmd4X2FycmF5X3B1c2goJmgtPmtleXNfaGFzaFtrXSk7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmFtZS0+bGVuID0ga2V5LT5sZW4gLSAxOworICAgICAgICAgICAgbmFtZS0+ZGF0YSA9IG5neF9wYWxsb2MoaC0+dGVtcF9wb29sLCBuYW1lLT5sZW4pOworICAgICAgICAgICAgaWYgKG5hbWUtPmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5neF9tZW1jcHkobmFtZS0+ZGF0YSwgJmtleS0+ZGF0YVsxXSwgbmFtZS0+bGVuKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogY29udmVydCAiKi5leGFtcGxlLmNvbSIgdG8gImNvbS5leGFtcGxlLlwwIgorICAgICAgICAgKiAgICAgIGFuZCAiLmV4YW1wbGUuY29tIiB0byAiY29tLmV4YW1wbGVcMCIKKyAgICAgICAgICovCisKKyAgICAgICAgbGVuID0gMDsKKyAgICAgICAgbiA9IDA7CisKKyAgICAgICAgZm9yIChpID0ga2V5LT5sZW4gLSAxOyBpOyBpLS0pIHsKKyAgICAgICAgICAgIGlmIChrZXktPmRhdGFbaV0gPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgbmd4X21lbWNweSgmYnVmW25dLCAma2V5LT5kYXRhW2kgKyAxXSwgbGVuKTsKKyAgICAgICAgICAgICAgICBuICs9IGxlbjsKKyAgICAgICAgICAgICAgICBidWZbbisrXSA9ICcuJzsKKyAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsZW4pIHsKKyAgICAgICAgICAgIG5neF9tZW1jcHkoJmJ1ZltuXSwgJmtleS0+ZGF0YVsxXSwgbGVuKTsKKyAgICAgICAgICAgIG4gKz0gbGVuOworICAgICAgICB9CisKKyAgICAgICAgYnVmW25dID0gJ1wwJzsKKworCisgICAgICAgIC8qIGNoZWNrIGNvbmZsaWN0cyBpbiB3aWxkY2FyZCBoYXNoICovCisKKyAgICAgICAgbmFtZSA9IGgtPmRuc19oYXNoW2tdLmVsdHM7CisKKyAgICAgICAgaWYgKG5hbWUpIHsKKyAgICAgICAgICAgIGxlbiA9IGtleS0+bGVuIC0gc2tpcDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGgtPmRuc19oYXNoW2tdLm5lbHRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobGVuICE9IG5hbWVbaV0ubGVuKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChuZ3hfc3RybmNtcChrZXktPmRhdGEgKyBza2lwLCBuYW1lW2ldLmRhdGEsIGxlbikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0JVU1k7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobmd4X2FycmF5X2luaXQoJmgtPmRuc19oYXNoW2tdLCBoLT50ZW1wX3Bvb2wsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9zdHJfdCkpCisgICAgICAgICAgICAgICAgIT0gTkdYX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBuYW1lID0gbmd4X2FycmF5X3B1c2goJmgtPmRuc19oYXNoW2tdKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIG5hbWUtPmxlbiA9IGtleS0+bGVuIC0gc2tpcDsKKyAgICAgICAgbmFtZS0+ZGF0YSA9IG5neF9wYWxsb2MoaC0+dGVtcF9wb29sLCBuYW1lLT5sZW4pOworICAgICAgICBpZiAobmFtZS0+ZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG5neF9tZW1jcHkobmFtZS0+ZGF0YSwga2V5LT5kYXRhICsgc2tpcCwgbmFtZS0+bGVuKTsKKworCisgICAgICAgIG5neF9tZW1jcHkoa2V5LT5kYXRhLCBidWYsIGtleS0+bGVuKTsKKyAgICAgICAga2V5LT5sZW4tLTsKKworICAgICAgICBoayA9IG5neF9hcnJheV9wdXNoKCZoLT5kbnNfd2lsZGNhcmRzKTsKKyAgICAgICAgaWYgKGhrID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBoay0+a2V5ID0gKmtleTsKKyAgICAgICAgaGstPmtleV9oYXNoID0gMDsKKyAgICAgICAgaGstPnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcmV0dXJuIE5HWF9PSzsKK30KZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX2NvbmZpZy5oIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29uZmlnLmgKaW5kZXggZDAzNDM1MS4uNDc2ODA4NSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfY29uZmlnLmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29uZmlnLmgKQEAgLTE0LDkgKzE0LDkgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgdm9pZCAgICoqbWFpbl9jb25mOwotICAgIHZvaWQgICAqKnNydl9jb25mOwotICAgIHZvaWQgICAqKmxvY19jb25mOworICAgIHZvaWQgICAgICAgICoqbWFpbl9jb25mOworICAgIHZvaWQgICAgICAgICoqc3J2X2NvbmY7CisgICAgdm9pZCAgICAgICAgKipsb2NfY29uZjsKIH0gbmd4X2h0dHBfY29uZl9jdHhfdDsKIAogCkBAIC03Miw1ICs3MiwyNSBAQAogICAgICAgICAgY3ljbGUtPmNvbmZfY3R4W25neF9odHRwX21vZHVsZS5pbmRleF0pLT5tYWluX2NvbmZbbW9kdWxlLmN0eF9pbmRleF0KIAogCisjZGVmaW5lIE5HWF9IVFRQX0NPTkZJR19IQVNIICAgIDEwMDA3CisKKyNkZWZpbmUgTkdYX0hUVFBfV0lMRENBUkRfSEFTSCAgMQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X3Bvb2xfdCAgICpwb29sOworICAgIG5neF9wb29sX3QgICAqdGVtcF9wb29sOworCisgICAgbmd4X2FycmF5X3QgICBrZXlzOworICAgIG5neF9hcnJheV90ICAqa2V5c19oYXNoOworCisgICAgbmd4X2FycmF5X3QgICBkbnNfd2lsZGNhcmRzOworICAgIG5neF9hcnJheV90ICAqZG5zX2hhc2g7Cit9IG5neF9odHRwX2hhc2hfY29uZl90OworCisKK25neF9pbnRfdCBuZ3hfaHR0cF9jb25maWdfYWRkX2hhc2gobmd4X2h0dHBfaGFzaF9jb25mX3QgKmgsIG5neF9zdHJfdCAqa2V5LAorICAgIHZvaWQgKnZhbHVlLCBuZ3hfdWludF90IGZsYWdzKTsKKworCiAKICNlbmRpZiAvKiBfTkdYX0hUVFBfQ09ORklHX0hfSU5DTFVERURfICovCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uYwppbmRleCBmYzU3ZmU0Li41NzExYjRhIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMKQEAgLTkwLDYgKzkwLDggQEAKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9jb3JlX2luaXRfbWFpbl9jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpjb25mKTsKIAogI2lmIChOR1hfSFRUUF9TU0wpCitzdGF0aWMgdm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9zc2xfaW5pdF9jb25uZWN0aW9uKG5neF9odHRwX3JlcXVlc3RfdCAqLAorICAgIG5neF9odHRwX3Vwc3RyZWFtX3QgKnUsIG5neF9jb25uZWN0aW9uX3QgKmMpOwogc3RhdGljIHZvaWQgbmd4X2h0dHBfdXBzdHJlYW1fc3NsX2hhbmRzaGFrZShuZ3hfY29ubmVjdGlvbl90ICpjKTsKIHN0YXRpYyB2b2lkIG5neF9odHRwX3Vwc3RyZWFtX3NzbF9zaHV0ZG93bihuZ3hfY29ubmVjdGlvbl90ICpjLAogICAgIG5neF9wZWVyX3QgKnBlZXIpOwpAQCAtNDk4LDkgKzUwMCw4IEBACiBzdGF0aWMgdm9pZAogbmd4X2h0dHBfdXBzdHJlYW1fY29ubmVjdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9odHRwX3Vwc3RyZWFtX3QgKnUpCiB7Ci0gICAgbmd4X2ludF90ICAgICAgICAgICAgcmM7Ci0gICAgbmd4X3BlZXJfdCAgICAgICAgICAqcGVlcjsKLSAgICBuZ3hfY29ubmVjdGlvbl90ICAgICpjOworICAgIG5neF9pbnRfdCAgICAgICAgICByYzsKKyAgICBuZ3hfY29ubmVjdGlvbl90ICAqYzsKIAogICAgIHItPmNvbm5lY3Rpb24tPmxvZy0+YWN0aW9uID0gImNvbm5lY3RpbmcgdG8gdXBzdHJlYW0iOwogCkBAIC01MTcsOCArNTE4LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHBlZXIgPSAmdS0+cGVlci5wZWVycy0+cGVlclt1LT5wZWVyLmN1cl9wZWVyXTsKLSAgICB1LT5zdGF0ZS0+cGVlciA9ICZwZWVyLT5uYW1lOworICAgIHUtPnN0YXRlLT5wZWVyID0gJnUtPnBlZXIucGVlcnMtPnBlZXJbdS0+cGVlci5jdXJfcGVlcl0ubmFtZTsKIAogICAgIGlmIChyYyA9PSBOR1hfQlVTWSkgewogICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsICJubyBsaXZlIHVwc3RyZWFtcyIpOwpAQCAtNTM0LDYgKzUzNCw3IEBACiAgICAgYyA9IHUtPnBlZXIuY29ubmVjdGlvbjsKIAogICAgIGMtPmRhdGEgPSByOworCiAgICAgYy0+d3JpdGUtPmhhbmRsZXIgPSBuZ3hfaHR0cF91cHN0cmVhbV9zZW5kX3JlcXVlc3RfaGFuZGxlcjsKICAgICBjLT5yZWFkLT5oYW5kbGVyID0gbmd4X2h0dHBfdXBzdHJlYW1fcHJvY2Vzc19oZWFkZXI7CiAKQEAgLTU4Nyw0MCArNTg4LDEwIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvKiByYyA9PSBOR1hfT0sgKi8KLQogI2lmIChOR1hfSFRUUF9TU0wpCiAKLSAgICBpZiAodS0+Y29uZi0+c3NsKSB7Ci0gICAgICAgIGlmIChjLT5zc2wgPT0gTlVMTCkgewotCi0gICAgICAgICAgICBpZiAobmd4X3NzbF9jcmVhdGVfY29ubmVjdGlvbih1LT5jb25mLT5zc2wsIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfU1NMX0JVRkZFUnxOR1hfU1NMX0NMSUVOVCkKLSAgICAgICAgICAgICAgICA9PSBOR1hfRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYy0+c2VuZGZpbGUgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5neF9zc2xfc2V0X3Nlc3Npb24oYywgcGVlci0+c3NsX3Nlc3Npb24pICE9IE5HWF9PSykgewotICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcmMgPSBuZ3hfc3NsX2hhbmRzaGFrZShjKTsKLQotICAgICAgICBpZiAocmMgPT0gTkdYX0FHQUlOKSB7Ci0gICAgICAgICAgICBjLT5zc2wtPmhhbmRsZXIgPSBuZ3hfaHR0cF91cHN0cmVhbV9zc2xfaGFuZHNoYWtlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fc3NsX2hhbmRzaGFrZShjKTsKLQorICAgIGlmICh1LT5jb25mLT5zc2wgJiYgYy0+c3NsID09IE5VTEwpIHsKKyAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fc3NsX2luaXRfY29ubmVjdGlvbihyLCB1LCBjKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNjMzLDYgKzYwNCw0MyBAQAogI2lmIChOR1hfSFRUUF9TU0wpCiAKIHN0YXRpYyB2b2lkCituZ3hfaHR0cF91cHN0cmVhbV9zc2xfaW5pdF9jb25uZWN0aW9uKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICp1LCBuZ3hfY29ubmVjdGlvbl90ICpjKQoreworICAgIG5neF9pbnRfdCAgICByYzsKKyAgICBuZ3hfcGVlcl90ICAqcGVlcjsKKworICAgIGlmIChuZ3hfc3NsX2NyZWF0ZV9jb25uZWN0aW9uKHUtPmNvbmYtPnNzbCwgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfU1NMX0JVRkZFUnxOR1hfU1NMX0NMSUVOVCkKKyAgICAgICAgPT0gTkdYX0VSUk9SKQorICAgIHsKKyAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjLT5zZW5kZmlsZSA9IDA7CisKKyAgICBwZWVyID0gJnUtPnBlZXIucGVlcnMtPnBlZXJbdS0+cGVlci5jdXJfcGVlcl07CisKKyAgICBpZiAobmd4X3NzbF9zZXRfc2Vzc2lvbihjLCBwZWVyLT5zc2xfc2Vzc2lvbikgIT0gTkdYX09LKSB7CisgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2ZpbmFsaXplX3JlcXVlc3QociwgdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmMgPSBuZ3hfc3NsX2hhbmRzaGFrZShjKTsKKworICAgIGlmIChyYyA9PSBOR1hfQUdBSU4pIHsKKyAgICAgICAgYy0+c3NsLT5oYW5kbGVyID0gbmd4X2h0dHBfdXBzdHJlYW1fc3NsX2hhbmRzaGFrZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG5neF9odHRwX3Vwc3RyZWFtX3NzbF9oYW5kc2hha2UoYyk7Cit9CisKKworc3RhdGljIHZvaWQKIG5neF9odHRwX3Vwc3RyZWFtX3NzbF9oYW5kc2hha2Uobmd4X2Nvbm5lY3Rpb25fdCAqYykKIHsKICAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAqcjsKQEAgLTY3MSw3ICs2NzksOCBAQAogICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF91cHN0cmVhbV9oZWFkZXJzX2luX3QpKTsKIAogICAgIGlmIChuZ3hfbGlzdF9pbml0KCZyLT51cHN0cmVhbS0+aGVhZGVyc19pbi5oZWFkZXJzLCByLT5wb29sLCA4LAotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfdGFibGVfZWx0X3QpKSAhPSBOR1hfT0spCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF90YWJsZV9lbHRfdCkpCisgICAgICAgICE9IE5HWF9PSykKICAgICB7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQpAQCAtODUxLDYgKzg2MCwxNSBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCisjaWYgKE5HWF9IVFRQX1NTTCkKKworICAgIGlmICh1LT5jb25mLT5zc2wgJiYgYy0+c3NsID09IE5VTEwpIHsKKyAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fc3NsX2luaXRfY29ubmVjdGlvbihyLCB1LCBjKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2VuZGlmCisKICAgICBuZ3hfaHR0cF91cHN0cmVhbV9zZW5kX3JlcXVlc3QociwgdSk7CiB9CiAK