ZGlmZiAtLWdpdCBhL0hlbHAvbWFudWFsL2NtYWtlLWxhbmd1YWdlLjcucnN0IGIvSGVscC9tYW51YWwvY21ha2UtbGFuZ3VhZ2UuNy5yc3QKaW5kZXggMjdiNWQzMC4uODdmOGY5ZCAxMDA2NDQKLS0tIGEvSGVscC9tYW51YWwvY21ha2UtbGFuZ3VhZ2UuNy5yc3QKKysrIGIvSGVscC9tYW51YWwvY21ha2UtbGFuZ3VhZ2UuNy5yc3QKQEAgLTE4MywxOCArMTgzLDE4IEBACiAKIC4uIHByb2R1Y3Rpb25saXN0OjoKICBicmFja2V0X2FyZ3VtZW50OiBgYnJhY2tldF9vcGVuYCBgYnJhY2tldF9jb250ZW50YCBgYnJhY2tldF9jbG9zZWAKLSBicmFja2V0X29wZW46ICdbJyAnPSd7bGVufSAnWycKLSBicmFja2V0X2NvbnRlbnQ6IDxhbnkgdGV4dCBub3QgY29udGFpbmluZyBhIGBicmFja2V0X2Nsb3NlYAotICAgICAgICAgICAgICAgIDogIG9mIHRoZSBzYW1lIHtsZW59IGFzIHRoZSBgYnJhY2tldF9vcGVuYD4KLSBicmFja2V0X2Nsb3NlOiAnXScgJz0ne2xlbn0gJ10nCisgYnJhY2tldF9vcGVuOiAnWycgJz0nKiAnWycKKyBicmFja2V0X2NvbnRlbnQ6IDxhbnkgdGV4dCBub3QgY29udGFpbmluZyBhIGBicmFja2V0X2Nsb3NlYCB3aXRoCisgICAgICAgICAgICAgICAgOiAgdGhlIHNhbWUgbnVtYmVyIG9mICc9JyBhcyB0aGUgYGJyYWNrZXRfb3BlbmA+CisgYnJhY2tldF9jbG9zZTogJ10nICc9JyogJ10nCiAKIC4uIHJhdzo6IGxhdGV4CiAKICAgIFxlbmR7c21hbGx9CiAKLUFuIG9wZW5pbmcgYnJhY2tldCBvZiBsZW5ndGggKmxlbiA+PSAwKiBpcyB3cml0dGVuIGBgW2BgIGZvbGxvd2VkCi1ieSAqbGVuKiBgYD1gYCBmb2xsb3dlZCBieSBgYFtgYCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY2xvc2luZwotYnJhY2tldCBpcyB3cml0dGVuIGBgXWBgIGZvbGxvd2VkIGJ5ICpsZW4qIGBgPWBgIGZvbGxvd2VkIGJ5IGBgXWBgLgorQW4gb3BlbmluZyBicmFja2V0IGlzIHdyaXR0ZW4gYGBbYGAgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIGBgPWBgIGZvbGxvd2VkCitieSBgYFtgYC4gIFRoZSBjb3JyZXNwb25kaW5nIGNsb3NpbmcgYnJhY2tldCBpcyB3cml0dGVuIGBgXWBgIGZvbGxvd2VkCitieSB0aGUgc2FtZSBudW1iZXIgb2YgYGA9YGAgZm9sbG93ZWQgYnkgYGBdYGAuCiBCcmFja2V0cyBkbyBub3QgbmVzdC4gIEEgdW5pcXVlIGxlbmd0aCBtYXkgYWx3YXlzIGJlIGNob3NlbgogZm9yIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIGJyYWNrZXRzIHRvIGNvbnRhaW4gY2xvc2luZyBicmFja2V0cwogb2Ygb3RoZXIgbGVuZ3Rocy4KQEAgLTMzNCw2ICszMzQsOCBAQAogIGJlZ2lubmluZyBvZiBhbiB1bnF1b3RlZCBhcmd1bWVudCwgYW5kIGFyZSB0cmVhdGVkIGFzIHBhcnQgb2YgdGhlCiAgY29udGVudC4gIEZvciBleGFtcGxlLCB0aGUgdW5xdW90ZWQgYXJndW1lbnRzIGBgLURhPSJiIGMiYGAsCiAgYGAtRGE9JCh2KWBgLCBhbmQgYGBhIiAiYiJjImRgYCBhcmUgZWFjaCBpbnRlcnByZXRlZCBsaXRlcmFsbHkuCisgVGhleSBtYXkgaW5zdGVhZCBiZSB3cml0dGVuIGFzIHF1b3RlZCBhcmd1bWVudHMgYGAiLURhPVwiYiBjXCIiYGAsCisgYGAiLURhPSQodikiYGAsIGFuZCBgYCJhXCIgXCJiXCJjXCJkImBgLCByZXNwZWN0aXZlbHkuCiAKICBNYWtlLXN0eWxlIHJlZmVyZW5jZXMgYXJlIHRyZWF0ZWQgbGl0ZXJhbGx5IGFzIHBhcnQgb2YgdGhlIGNvbnRlbnQKICBhbmQgZG8gbm90IHVuZGVyZ28gdmFyaWFibGUgZXhwYW5zaW9uLiAgVGhleSBhcmUgdHJlYXRlZCBhcyBwYXJ0CkBAIC01MTQsNyArNTE2LDcgQEAKICBjcmVhdGUgY29tbWFuZHMgdGhhdCwgd2hlbiBpbnZva2VkLCBwcm9jZXNzIHRoZSByZWNvcmRlZCBjb21tYW5kcwogIGluIGEgbmV3IHZhcmlhYmxlIGJpbmRpbmcgc2NvcGUuICBBIHZhcmlhYmxlICJzZXQiIG9yICJ1bnNldCIKICBiaW5kcyBpbiB0aGlzIHNjb3BlIGFuZCBpcyB2aXNpYmxlIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbiBhbmQKLSBhbnkgbmVzdGVkIGNhbGxzLCBidXQgbm90IGFmdGVyIHRoZSBmdW5jdGlvbiByZXR1cm5zLgorIGFueSBuZXN0ZWQgY2FsbHMgd2l0aGluIGl0LCBidXQgbm90IGFmdGVyIHRoZSBmdW5jdGlvbiByZXR1cm5zLgogCiBEaXJlY3RvcnkgU2NvcGUKICBFYWNoIG9mIHRoZSBgRGlyZWN0b3JpZXNgXyBpbiBhIHNvdXJjZSB0cmVlIGhhcyBpdHMgb3duIHZhcmlhYmxlCmRpZmYgLS1naXQgYS9IZWxwL3Byb3Bfc2YvQVVUT1JDQ19PUFRJT05TLnJzdCBiL0hlbHAvcHJvcF9zZi9BVVRPUkNDX09QVElPTlMucnN0CmluZGV4IGQ5ZGM0ZDMuLjJiZWMwMzMgMTAwNjQ0Ci0tLSBhL0hlbHAvcHJvcF9zZi9BVVRPUkNDX09QVElPTlMucnN0CisrKyBiL0hlbHAvcHJvcF9zZi9BVVRPUkNDX09QVElPTlMucnN0CkBAIC05LDUgKzksMTQgQEAKIAogQnkgZGVmYXVsdCBpdCBpcyBlbXB0eS4KIAotVGhlIG9wdGlvbnMgc2V0IG9uIHRoZSBgYC5xcmNgYCBzb3VyY2UgZmlsZSBtYXkgb3ZlcnJpZGUgOnByb3BfdGd0OmBBVVRPUkNDX09QVElPTlNgIHNldAotb24gdGhlIHRhcmdldC4KK1RoZSBvcHRpb25zIHNldCBvbiB0aGUgYGAucXJjYGAgc291cmNlIGZpbGUgbWF5IG92ZXJyaWRlCis6cHJvcF90Z3Q6YEFVVE9SQ0NfT1BUSU9OU2Agc2V0IG9uIHRoZSB0YXJnZXQuCisKK0VYQU1QTEUKK15eXl5eXl4KKworLi4gY29kZS1ibG9jazo6IGNtYWtlCisKKyAgIyAuLi4KKyAgc2V0X3Byb3BlcnR5KFNPVVJDRSByZXNvdXJjZXMucXJjIFBST1BFUlRZIEFVVE9SQ0NfT1BUSU9OUyAiLS1jb21wcmVzczs5IikKKyAgIyAuLi4KZGlmZiAtLWdpdCBhL0hlbHAvcHJvcF9zZi9BVVRPVUlDX09QVElPTlMucnN0IGIvSGVscC9wcm9wX3NmL0FVVE9VSUNfT1BUSU9OUy5yc3QKaW5kZXggYmI0OGRhOS4uZTJmNDdlYyAxMDA2NDQKLS0tIGEvSGVscC9wcm9wX3NmL0FVVE9VSUNfT1BUSU9OUy5yc3QKKysrIGIvSGVscC9wcm9wX3NmL0FVVE9VSUNfT1BUSU9OUy5yc3QKQEAgLTQsMTEgKzQsMjAgQEAKIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgYGB1aWNgYCB3aGVuIHVzaW5nIDpwcm9wX3RndDpgQVVUT1VJQ2AKIAogVGhpcyBwcm9wZXJ0eSBob2xkcyBhZGRpdGlvbmFsIGNvbW1hbmQgbGluZSBvcHRpb25zCi13aGljaCB3aWxsIGJlIHVzZWQgd2hlbiBgYHVpY2BgIGlzIGV4ZWN1dGVkIGR1cmluZyB0aGUgYnVpbGQgdmlhIDpwcm9wX3RndDpgQVVUT1VJQ2AsCi1pLmUuIGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIG9wdGlvbmFsIGBgT1BUSU9OU2BgIGFyZ3VtZW50IG9mIHRoZQotOm1vZHVsZTpgcXQ0X3dyYXBfdWkoKSA8RmluZFF0ND5gIG1hY3JvLgord2hpY2ggd2lsbCBiZSB1c2VkIHdoZW4gYGB1aWNgYCBpcyBleGVjdXRlZCBkdXJpbmcgdGhlIGJ1aWxkIHZpYQorOnByb3BfdGd0OmBBVVRPVUlDYCwgaS5lLiBpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBvcHRpb25hbCBgYE9QVElPTlNgYAorYXJndW1lbnQgb2YgdGhlIDptb2R1bGU6YHF0NF93cmFwX3VpKCkgPEZpbmRRdDQ+YCBtYWNyby4KIAogQnkgZGVmYXVsdCBpdCBpcyBlbXB0eS4KIAotVGhlIG9wdGlvbnMgc2V0IG9uIHRoZSBgYC51aWBgIHNvdXJjZSBmaWxlIG1heSBvdmVycmlkZSA6cHJvcF90Z3Q6YEFVVE9VSUNfT1BUSU9OU2Agc2V0Ci1vbiB0aGUgdGFyZ2V0LgorVGhlIG9wdGlvbnMgc2V0IG9uIHRoZSBgYC51aWBgIHNvdXJjZSBmaWxlIG1heSBvdmVycmlkZQorOnByb3BfdGd0OmBBVVRPVUlDX09QVElPTlNgIHNldCBvbiB0aGUgdGFyZ2V0LgorCitFWEFNUExFCiteXl5eXl5eCisKKy4uIGNvZGUtYmxvY2s6OiBjbWFrZQorCisgICMgLi4uCisgIHNldF9wcm9wZXJ0eShTT1VSQ0Ugd2lkZ2V0LnVpIFBST1BFUlRZIEFVVE9VSUNfT1BUSU9OUyAiLS1uby1wcm90ZWN0aW9uIikKKyAgIyAuLi4KZGlmZiAtLWdpdCBhL0hlbHAvcHJvcF9zZi9TS0lQX0FVVE9VSUMucnN0IGIvSGVscC9wcm9wX3NmL1NLSVBfQVVUT1VJQy5yc3QKaW5kZXggNGVkYTcyNi4uOGM5NjJkYiAxMDA2NDQKLS0tIGEvSGVscC9wcm9wX3NmL1NLSVBfQVVUT1VJQy5yc3QKKysrIGIvSGVscC9wcm9wX3NmL1NLSVBfQVVUT1VJQy5yc3QKQEAgLTMsNiArMyw5IEBACiAKIEV4Y2x1ZGUgdGhlIHNvdXJjZSBmaWxlIGZyb20gOnByb3BfdGd0OmBBVVRPVUlDYCBwcm9jZXNzaW5nIChmb3IgUXQgcHJvamVjdHMpLgogCis6cHJvcF9zZjpgU0tJUF9BVVRPVUlDYCBjYW4gYmUgc2V0IG9uIEMrKyBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlcyBhbmQgb24KK2BgLnVpYGAgZmlsZXMuCisKIEZvciBicm9hZGVyIGV4Y2x1c2lvbiBjb250cm9sIHNlZSA6cHJvcF9zZjpgU0tJUF9BVVRPR0VOYC4KIAogRVhBTVBMRQpAQCAtMTIsNCArMTUsNiBAQAogCiAgICMgLi4uCiAgIHNldF9wcm9wZXJ0eShTT1VSQ0UgZmlsZS5oIFBST1BFUlRZIFNLSVBfQVVUT1VJQyBPTikKKyAgc2V0X3Byb3BlcnR5KFNPVVJDRSBmaWxlLmNwcCBQUk9QRVJUWSBTS0lQX0FVVE9VSUMgT04pCisgIHNldF9wcm9wZXJ0eShTT1VSQ0Ugd2lkZ2V0LnVpIFBST1BFUlRZIFNLSVBfQVVUT1VJQyBPTikKICAgIyAuLi4KZGlmZiAtLWdpdCBhL0hlbHAvcHJvcF90Z3QvQVVUT01PQ19ERVBFTkRfRklMVEVSUy5yc3QgYi9IZWxwL3Byb3BfdGd0L0FVVE9NT0NfREVQRU5EX0ZJTFRFUlMucnN0CmluZGV4IDgxMGNiZjQuLmI3MzhlY2YgMTAwNjQ0Ci0tLSBhL0hlbHAvcHJvcF90Z3QvQVVUT01PQ19ERVBFTkRfRklMVEVSUy5yc3QKKysrIGIvSGVscC9wcm9wX3RndC9BVVRPTU9DX0RFUEVORF9GSUxURVJTLnJzdApAQCAtMjUsNyArMjUsNyBAQAogCiAKIEV4YW1wbGUKLS0tLS0tLS0KK15eXl5eXl4KIAogQ29uc2lkZXIgYSBmaWxlIGBgRk9PLmhwcGBgIGhvbGRzIGEgY3VzdG9tIG1hY3JvIGBgT0JKX0pTT05fRklMRWBgIGFuZCB3ZQogd2FudCB0aGUgYGBtb2NgYCBmaWxlIHRvIGRlcGVuZCBvbiB0aGUgbWFjcm9gcyBmaWxlIG5hbWUgYXJndW1lbnQ6OgpkaWZmIC0tZ2l0IGEvSGVscC9wcm9wX3RndC9BVVRPTU9DX01BQ1JPX05BTUVTLnJzdCBiL0hlbHAvcHJvcF90Z3QvQVVUT01PQ19NQUNST19OQU1FUy5yc3QKaW5kZXggMDUzNWZkZS4uYTVhZDlkNSAxMDA2NDQKLS0tIGEvSGVscC9wcm9wX3RndC9BVVRPTU9DX01BQ1JPX05BTUVTLnJzdAorKysgYi9IZWxwL3Byb3BfdGd0L0FVVE9NT0NfTUFDUk9fTkFNRVMucnN0CkBAIC0yMyw3ICsyMyw4IEBACiB3aXRoIFF0LgogCiBFeGFtcGxlCi0tLS0tLS0tCiteXl5eXl5eCisKIEluIHRoaXMgY2FzZSB0aGUgdGhlIGBgUV9PQkpFQ1RgYCBtYWNybyBpcyBoaWRkZW4gaW5zaWRlIGFuIG90aGVyIG1hY3JvCiBjYWxsZWQgYGBDVVNUT01fTUFDUk9gYC4gVG8gbGV0IENNYWtlIGtub3cgdGhhdCBzb3VyY2UgZmlsZXMsIHRoYXQgY29udGFpbgogYGBDVVNUT01fTUFDUk9gYCwgbmVlZCB0byBiZSBgYG1vY2BgIHByb2Nlc3NlZCwgd2UgY2FsbDo6CmRpZmYgLS1naXQgYS9IZWxwL3Byb3BfdGd0L0FVVE9SQ0NfT1BUSU9OUy5yc3QgYi9IZWxwL3Byb3BfdGd0L0FVVE9SQ0NfT1BUSU9OUy5yc3QKaW5kZXggOGEwZjYzMi4uZDZhZGU1YSAxMDA2NDQKLS0tIGEvSGVscC9wcm9wX3RndC9BVVRPUkNDX09QVElPTlMucnN0CisrKyBiL0hlbHAvcHJvcF90Z3QvQVVUT1JDQ19PUFRJT05TLnJzdApAQCAtMTksMyArMTksMTIgQEAKIAogU2VlIHRoZSA6bWFudWFsOmBjbWFrZS1xdCg3KWAgbWFudWFsIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHVzaW5nIENNYWtlCiB3aXRoIFF0LgorCitFWEFNUExFCiteXl5eXl5eCisKKy4uIGNvZGUtYmxvY2s6OiBjbWFrZQorCisgICMgLi4uCisgIHNldF9wcm9wZXJ0eShUQVJHRVQgdGd0IFBST1BFUlRZIEFVVE9SQ0NfT1BUSU9OUyAiLS1jb21wcmVzczs5IikKKyAgIyAuLi4KZGlmZiAtLWdpdCBhL0hlbHAvcHJvcF90Z3QvQVVUT1VJQ19PUFRJT05TLnJzdCBiL0hlbHAvcHJvcF90Z3QvQVVUT1VJQ19PUFRJT05TLnJzdAppbmRleCA5ZmIwNDJlLi4zZjYxM2I5IDEwMDY0NAotLS0gYS9IZWxwL3Byb3BfdGd0L0FVVE9VSUNfT1BUSU9OUy5yc3QKKysrIGIvSGVscC9wcm9wX3RndC9BVVRPVUlDX09QVElPTlMucnN0CkBAIC0yMywzICsyMywxMiBAQAogCiBTZWUgdGhlIDptYW51YWw6YGNtYWtlLXF0KDcpYCBtYW51YWwgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgQ01ha2UKIHdpdGggUXQuCisKK0VYQU1QTEUKK15eXl5eXl4KKworLi4gY29kZS1ibG9jazo6IGNtYWtlCisKKyAgIyAuLi4KKyAgc2V0X3Byb3BlcnR5KFRBUkdFVCB0Z3QgUFJPUEVSVFkgQVVUT1VJQ19PUFRJT05TICItLW5vLXByb3RlY3Rpb24iKQorICAjIC4uLgpkaWZmIC0tZ2l0IGEvSGVscC9wcm9wX3RndC9NQUNPU1hfQlVORExFLnJzdCBiL0hlbHAvcHJvcF90Z3QvTUFDT1NYX0JVTkRMRS5yc3QKaW5kZXggN2NkODA0Ni4uZjllMTFlZSAxMDA2NDQKLS0tIGEvSGVscC9wcm9wX3RndC9NQUNPU1hfQlVORExFLnJzdAorKysgYi9IZWxwL3Byb3BfdGd0L01BQ09TWF9CVU5ETEUucnN0CkBAIC02LDcgKzYsNyBAQAogV2hlbiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBgYFRSVUVgYCB0aGUgZXhlY3V0YWJsZSB3aGVuIGJ1aWx0IG9uIE9TIFgKIG9yIGlPUyB3aWxsIGJlIGNyZWF0ZWQgYXMgYW4gYXBwbGljYXRpb24gYnVuZGxlLiAgVGhpcyBtYWtlcyBpdAogYSBHVUkgZXhlY3V0YWJsZSB0aGF0IGNhbiBiZSBsYXVuY2hlZCBmcm9tIHRoZSBGaW5kZXIuICBTZWUgdGhlCi06cHJvcF90Z3Q6YE1BQ09TWF9GUkFNRVdPUktfSU5GT19QTElTVGAgdGFyZ2V0IHByb3BlcnR5IGZvciBpbmZvcm1hdGlvbiBhYm91dAorOnByb3BfdGd0OmBNQUNPU1hfQlVORExFX0lORk9fUExJU1RgIHRhcmdldCBwcm9wZXJ0eSBmb3IgaW5mb3JtYXRpb24gYWJvdXQKIGNyZWF0aW9uIG9mIHRoZSBgYEluZm8ucGxpc3RgYCBmaWxlIGZvciB0aGUgYXBwbGljYXRpb24gYnVuZGxlLgogVGhpcyBwcm9wZXJ0eSBpcyBpbml0aWFsaXplZCBieSB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlCiA6dmFyaWFibGU6YENNQUtFX01BQ09TWF9CVU5ETEVgIGlmIGl0IGlzIHNldCB3aGVuIGEgdGFyZ2V0IGlzIGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9IZWxwL3JlbGVhc2UvMy4xMC5yc3QgYi9IZWxwL3JlbGVhc2UvMy4xMC5yc3QKaW5kZXggMmUzMjQwMS4uMzVmZTYwMiAxMDA2NDQKLS0tIGEvSGVscC9yZWxlYXNlLzMuMTAucnN0CisrKyBiL0hlbHAvcmVsZWFzZS8zLjEwLnJzdApAQCAtMTYxLDI1ICsxNjEsMTYgQEAKIAogKiBXaGVuIHVzaW5nIDpwcm9wX3RndDpgQVVUT01PQ2AsIENNYWtlIHNlYXJjaGVzIGZvciB0aGUgc3RyaW5ncyBgYFFfT0JKRUNUYGAsCiAgIGBgUV9HQURHRVRgYCBvciBgYFFfTkFNRVNQQUNFYGAgaW4gYSBzb3VyY2UgZmlsZSB0byBkZXRlcm1pbmUgaWYgaXQgbmVlZHMKLSAgdG8gYmUgYGBtb2NgYCBwcm9jZXNzZWQuIFRoZSBuZXcgdmFyaWFibGUKLSAgOnZhcmlhYmxlOmBDTUFLRV9BVVRPTU9DX01BQ1JPX05BTUVTYCBhbGxvd3MgdG8gcmVnaXN0ZXIgYWRkaXRpb25hbAotICBzdHJpbmdzIChtYWNybyBuYW1lcykgc28gc2VhcmNoIGZvci4KKyAgdG8gYmUgYGBtb2NgYCBwcm9jZXNzZWQuICBUaGUgbmV3IDp2YXJpYWJsZTpgQ01BS0VfQVVUT01PQ19NQUNST19OQU1FU2AKKyAgdmFyaWFibGUgYW5kIDpwcm9wX3RndDpgQVVUT01PQ19NQUNST19OQU1FU2AgdGFyZ2V0IHByb3BlcnR5IG1heSBiZSBzZXQKKyAgdG8gcmVnaXN0ZXIgYWRkaXRpb25hbCBzdHJpbmdzIChtYWNybyBuYW1lcykgdG8gc2VhcmNoIGZvci4KIAotKiBXaGVuIHVzaW5nIDpwcm9wX3RndDpgQVVUT01PQ2AsIENNYWtlIHNlYXJjaGVzIGZvciB0aGUgc3RyaW5ncyBgYFFfT0JKRUNUYGAsCi0gIGBgUV9HQURHRVRgYCBvciBgYFFfTkFNRVNQQUNFYGAgaW4gYSBzb3VyY2UgZmlsZSB0byBkZXRlcm1pbmUgaWYgaXQgbmVlZHMKLSAgdG8gYmUgYGBtb2NgYCBwcm9jZXNzZWQuIFRoZSBuZXcgdGFyZ2V0IHByb3BlcnR5Ci0gIDpwcm9wX3RndDpgQVVUT01PQ19NQUNST19OQU1FU2AgYWxsb3dzIHRvIHJlZ2lzdGVyIGFkZGl0aW9uYWwgc3RyaW5ncwotICAobWFjcm8gbmFtZXMpIHNvIHNlYXJjaCBmb3IuCi0KLSogV2hlbiB1c2luZyA6cHJvcF90Z3Q6YEFVVE9NT0NgLCB0aGUgbmV3IHZhcmlhYmxlCi0gIDp2YXJpYWJsZTpgQ01BS0VfQVVUT01PQ19DT01QSUxFUl9QUkVERUZJTkVTYCBhbGxvd3MgdG8gZGVmYXVsdAotICBlbmFibGUgb3IgZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgY29tcGlsZXIgcHJlIGRlZmluaXRpb25zIGZpbGUKKyogV2hlbiB1c2luZyA6cHJvcF90Z3Q6YEFVVE9NT0NgLCB0aGUgbmV3CisgIDp2YXJpYWJsZTpgQ01BS0VfQVVUT01PQ19DT01QSUxFUl9QUkVERUZJTkVTYCB2YXJpYWJsZSBhbmQKKyAgOnByb3BfdGd0OmBBVVRPTU9DX0NPTVBJTEVSX1BSRURFRklORVNgIHRhcmdldCBwcm9wZXJ0eSBzcGVjaWZ5IHdoZXRoZXIKKyAgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGNvbXBpbGVyIHByZSBkZWZpbml0aW9ucyBmaWxlCiAgIGBgbW9jX3ByZWRlZnMuaGBgLgogCi0qIFdoZW4gdXNpbmcgOnByb3BfdGd0OmBBVVRPTU9DYCwgdGhlIG5ldyBib29sZWFuIHRhcmdldCBwcm9wZXJ0eQotICA6cHJvcF90Z3Q6YEFVVE9NT0NfQ09NUElMRVJfUFJFREVGSU5FU2AgYWxsb3dzIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZQotICBnZW5lcmF0aW9uIG9mIHRoZSBjb21waWxlciBwcmUgZGVmaW5pdGlvbnMgZmlsZSBgYG1vY19wcmVkZWZzLmhgYC4KLQogQ1Rlc3QKIC0tLS0tCiAKQEAgLTIxOCw4ICsyMDksOCBAQAogKiBUaGUgOm1vZHVsZTpgQ1BhY2tJRldgIG1vZHVsZSBnYWluZWQgbmV3CiAgIDp2YXJpYWJsZTpgQ1BBQ0tfSUZXX1JFUE9TSVRPUklFU19ESVJFQ1RPUklFU2AgdmFyaWFibGUgdG8gc3BlY2lmeQogICBhZGRpdGlvbmFsIHJlcG9zaXRvcmllcyBkaXJzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJlc29sdmUgYW5kCi0gIHJlcGFjayBkZXBlbmRlbnQgY29tcG9uZW50cy4gVGhpcyBmZWF0dXJlIGF2YWlsYWJsZSBvbmx5Ci0gIHNpbmNlIFF0SUZXIDMuMS4KKyAgcmVwYWNrIGRlcGVuZGVudCBjb21wb25lbnRzLiBUaGlzIGZlYXR1cmUgaXMgb25seSBhdmFpbGFibGUgd2hlbgorICB1c2luZyBRdElGVyAzLjEgb3IgbGF0ZXIuCiAKICogTW9kdWxlcyA6bW9kdWxlOmBDUGFja1JQTWAgYW5kIDptb2R1bGU6YENQYWNrRGViYCBsZWFybmVkIHRvIHNldCBwYWNrYWdlIGVwb2NoCiAgIHZlcnNpb24uCmRpZmYgLS1naXQgYS9IZWxwL3JlbGVhc2UvZGV2LzAtc2FtcGxlLXRvcGljLnJzdCBiL0hlbHAvcmVsZWFzZS9kZXYvMC1zYW1wbGUtdG9waWMucnN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGNjMDFlLi4wMDAwMDAwCi0tLSBhL0hlbHAvcmVsZWFzZS9kZXYvMC1zYW1wbGUtdG9waWMucnN0CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0wLXNhbXBsZS10b3BpYwotLS0tLS0tLS0tLS0tLS0KLQotKiBUaGlzIGlzIGEgc2FtcGxlIHJlbGVhc2Ugbm90ZSBmb3IgdGhlIGNoYW5nZSBpbiBhIHRvcGljLgotICBEZXZlbG9wZXJzIHNob3VsZCBhZGQgc2ltaWxhciBub3RlcyBmb3IgZWFjaCB0b3BpYyBicmFuY2gKLSAgbWFraW5nIGEgbm90ZXdvcnRoeSBjaGFuZ2UuICBFYWNoIGRvY3VtZW50IHNob3VsZCBiZSBuYW1lZAotICBhbmQgdGl0bGVkIHRvIG1hdGNoIHRoZSB0b3BpYyBuYW1lIHRvIGF2b2lkIG1lcmdlIGNvbmZsaWN0cy4KZGlmZiAtLWdpdCBhL0hlbHAvcmVsZWFzZS9pbmRleC5yc3QgYi9IZWxwL3JlbGVhc2UvaW5kZXgucnN0CmluZGV4IDY0NzJiNTEuLjBjNzU3MmYgMTAwNjQ0Ci0tLSBhL0hlbHAvcmVsZWFzZS9pbmRleC5yc3QKKysrIGIvSGVscC9yZWxlYXNlL2luZGV4LnJzdApAQCAtNyw4ICs3LDYgQEAKICAgVGhpcyBmaWxlIHNob3VsZCBpbmNsdWRlIHRoZSBhZGphY2VudCAiZGV2LnR4dCIgZmlsZQogICBpbiBkZXZlbG9wbWVudCB2ZXJzaW9ucyBidXQgbm90IGluIHJlbGVhc2UgdmVyc2lvbnMuCiAKLS4uIGluY2x1ZGU6OiBkZXYudHh0Ci0KIFJlbGVhc2VzCiA9PT09PT09PQogCmRpZmYgLS1naXQgYS9IZWxwL3ZhcmlhYmxlL0NNQUtFX0FVVE9SQ0NfT1BUSU9OUy5yc3QgYi9IZWxwL3ZhcmlhYmxlL0NNQUtFX0FVVE9SQ0NfT1BUSU9OUy5yc3QKaW5kZXggMjk4Y2I2Yi4uODE1ZDM5ZCAxMDA2NDQKLS0tIGEvSGVscC92YXJpYWJsZS9DTUFLRV9BVVRPUkNDX09QVElPTlMucnN0CisrKyBiL0hlbHAvdmFyaWFibGUvQ01BS0VfQVVUT1JDQ19PUFRJT05TLnJzdApAQCAtMSw3ICsxLDE2IEBACiBDTUFLRV9BVVRPUkNDX09QVElPTlMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGV0aGVyIHRvIGhhbmRsZSBgYHJjY2BgIGF1dG9tYXRpY2FsbHkgZm9yIFF0IHRhcmdldHMuCitBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIGBgcmNjYGAgd2hlbiB1c2luZyA6dmFyaWFibGU6YENNQUtFX0FVVE9SQ0NgLgogCiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgOnByb3BfdGd0OmBBVVRPUkNDX09QVElPTlNgIHByb3BlcnR5IG9uCiBhbGwgdGhlIHRhcmdldHMuICBTZWUgdGhhdCB0YXJnZXQgcHJvcGVydHkgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCisKK0VYQU1QTEUKK15eXl5eXl4KKworLi4gY29kZS1ibG9jazo6IGNtYWtlCisKKyAgIyAuLi4KKyAgc2V0KENNQUtFX0FVVE9SQ0NfT1BUSU9OUyAiLS1jb21wcmVzczs5IikKKyAgIyAuLi4KZGlmZiAtLWdpdCBhL0hlbHAvdmFyaWFibGUvQ01BS0VfQVVUT1VJQ19PUFRJT05TLnJzdCBiL0hlbHAvdmFyaWFibGUvQ01BS0VfQVVUT1VJQ19PUFRJT05TLnJzdAppbmRleCAzYzliOGM0Li4yOGZhOTJmIDEwMDY0NAotLS0gYS9IZWxwL3ZhcmlhYmxlL0NNQUtFX0FVVE9VSUNfT1BUSU9OUy5yc3QKKysrIGIvSGVscC92YXJpYWJsZS9DTUFLRV9BVVRPVUlDX09QVElPTlMucnN0CkBAIC0xLDcgKzEsMTYgQEAKIENNQUtFX0FVVE9VSUNfT1BUSU9OUwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVdoZXRoZXIgdG8gaGFuZGxlIGBgdWljYGAgYXV0b21hdGljYWxseSBmb3IgUXQgdGFyZ2V0cy4KK0FkZGl0aW9uYWwgb3B0aW9ucyBmb3IgYGB1aWNgYCB3aGVuIHVzaW5nIDp2YXJpYWJsZTpgQ01BS0VfQVVUT1VJQ2AuCiAKIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSA6cHJvcF90Z3Q6YEFVVE9VSUNfT1BUSU9OU2AgcHJvcGVydHkgb24KIGFsbCB0aGUgdGFyZ2V0cy4gIFNlZSB0aGF0IHRhcmdldCBwcm9wZXJ0eSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKworRVhBTVBMRQorXl5eXl5eXgorCisuLiBjb2RlLWJsb2NrOjogY21ha2UKKworICAjIC4uLgorICBzZXRfcHJvcGVydHkoQ01BS0VfQVVUT1VJQ19PUFRJT05TICItLW5vLXByb3RlY3Rpb24iKQorICAjIC4uLgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9DTWFrZURldGVybWluZUNDb21waWxlci5jbWFrZSBiL01vZHVsZXMvQ01ha2VEZXRlcm1pbmVDQ29tcGlsZXIuY21ha2UKaW5kZXggZmNiZGEyMC4uNGU1NmNlMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9DTWFrZURldGVybWluZUNDb21waWxlci5jbWFrZQorKysgYi9Nb2R1bGVzL0NNYWtlRGV0ZXJtaW5lQ0NvbXBpbGVyLmNtYWtlCkBAIC0xMTAsNiArMTEwLDcgQEAKIAogICBpbmNsdWRlKCR7Q01BS0VfUk9PVH0vTW9kdWxlcy9DTWFrZURldGVybWluZUNvbXBpbGVySWQuY21ha2UpCiAgIENNQUtFX0RFVEVSTUlORV9DT01QSUxFUl9JRChDIENGTEFHUyBDTWFrZUNDb21waWxlcklkLmMpCisgIENNQUtFX0RJQUdOT1NFX1VOU1VQUE9SVEVEX0NMQU5HKEMgQ0MpCiAKICAgIyBTZXQgb2xkIGNvbXBpbGVyIGFuZCBwbGF0Zm9ybSBpZCB2YXJpYWJsZXMuCiAgIGlmKENNQUtFX0NfQ09NUElMRVJfSUQgU1RSRVFVQUwgIkdOVSIpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL0NNYWtlRGV0ZXJtaW5lQ1hYQ29tcGlsZXIuY21ha2UgYi9Nb2R1bGVzL0NNYWtlRGV0ZXJtaW5lQ1hYQ29tcGlsZXIuY21ha2UKaW5kZXggOGMzM2ViNi4uNDU0MTg0NCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9DTWFrZURldGVybWluZUNYWENvbXBpbGVyLmNtYWtlCisrKyBiL01vZHVsZXMvQ01ha2VEZXRlcm1pbmVDWFhDb21waWxlci5jbWFrZQpAQCAtMTA1LDYgKzEwNSw3IEBACiAKICAgaW5jbHVkZSgke0NNQUtFX1JPT1R9L01vZHVsZXMvQ01ha2VEZXRlcm1pbmVDb21waWxlcklkLmNtYWtlKQogICBDTUFLRV9ERVRFUk1JTkVfQ09NUElMRVJfSUQoQ1hYIENYWEZMQUdTIENNYWtlQ1hYQ29tcGlsZXJJZC5jcHApCisgIENNQUtFX0RJQUdOT1NFX1VOU1VQUE9SVEVEX0NMQU5HKENYWCBDWFgpCiAKICAgIyBTZXQgb2xkIGNvbXBpbGVyIGFuZCBwbGF0Zm9ybSBpZCB2YXJpYWJsZXMuCiAgIGlmKENNQUtFX0NYWF9DT01QSUxFUl9JRCBTVFJFUVVBTCAiR05VIikKZGlmZiAtLWdpdCBhL01vZHVsZXMvQ01ha2VEZXRlcm1pbmVDb21waWxlcklkLmNtYWtlIGIvTW9kdWxlcy9DTWFrZURldGVybWluZUNvbXBpbGVySWQuY21ha2UKaW5kZXggN2VmZTczOS4uMzQ3MTA2ZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9DTWFrZURldGVybWluZUNvbXBpbGVySWQuY21ha2UKKysrIGIvTW9kdWxlcy9DTWFrZURldGVybWluZUNvbXBpbGVySWQuY21ha2UKQEAgLTczNSwzICs3MzUsMzggQEAKICAgICBzZXQoQ01BS0VfJHtsYW5nfV9DTF9TSE9XSU5DTFVERVNfUFJFRklYICIiIFBBUkVOVF9TQ09QRSkKICAgZW5kaWYoKQogZW5kZnVuY3Rpb24oKQorCitmdW5jdGlvbihDTUFLRV9ESUFHTk9TRV9VTlNVUFBPUlRFRF9DTEFORyBsYW5nIGVudnZhcikKKyAgaWYoTk9UIENNQUtFX0hPU1RfV0lOMzIgT1IgQ01BS0VfR0VORVJBVE9SIE1BVENIRVMgIlZpc3VhbCBTdHVkaW8iIE9SCisgICAgICBOT1QgIiR7Q01BS0VfJHtsYW5nfV9DT01QSUxFUl9JRH07JHtDTUFLRV8ke2xhbmd9X1NJTVVMQVRFX0lEfSIgU1RSRVFVQUwgIkNsYW5nO01TVkMiKQorICAgIHJldHVybigpCisgIGVuZGlmKCkKKworICAjIFRlc3Qgd2hldGhlciBhIEdOVS1saWtlIGNvbW1hbmQtbGluZSBvcHRpb24gd29ya3MuCisgIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICIke0NNQUtFXyR7bGFuZ31fQ09NUElMRVJ9IiAtLXZlcnNpb24KKyAgICBSRVNVTFRfVkFSSUFCTEUgX2NsYW5nX3Jlc3VsdAorICAgIE9VVFBVVF9WQVJJQUJMRSBfY2xhbmdfc3Rkb3V0CisgICAgRVJST1JfVkFSSUFCTEUgX2NsYW5nX3N0ZGVycikKKyAgaWYoTk9UIF9jbGFuZ19yZXN1bHQgRVFVQUwgMCkKKyAgICByZXR1cm4oKQorICBlbmRpZigpCisKKyAgIyBIZWxwIHRoZSB1c2VyIGNvbmZpZ3VyZSB0aGUgZW52aXJvbm1lbnQgdG8gdXNlIHRoZSBNU1ZDLWxpa2UgQ2xhbmcuCisgIHN0cmluZyhDT05DQVQgX21zZworICAgICJUaGUgQ2xhbmcgY29tcGlsZXIgdG9vbFxuIgorICAgICIgIFwiJHtDTUFLRV8ke2xhbmd9X0NPTVBJTEVSfVwiXG4iCisgICAgInRhcmdldHMgdGhlIE1TVkMgQUJJIGJ1dCBoYXMgYSBHTlUtbGlrZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlLiAgIgorICAgICJUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICAiCisgICAgIlVzZSAnY2xhbmctY2wnIGluc3RlYWQsIGUuZy4gYnkgc2V0dGluZyAnJHtlbnZ2YXJ9PWNsYW5nLWNsJyBpbiB0aGUgZW52aXJvbm1lbnQuIgorICAgICkKKyAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgcmMgLWhlbHAKKyAgICBSRVNVTFRfVkFSSUFCTEUgX3JjX3Jlc3VsdAorICAgIE9VVFBVVF9WQVJJQUJMRSBfcmNfc3Rkb3V0CisgICAgRVJST1JfVkFSSUFCTEUgX3JjX3N0ZGVycikKKyAgaWYoTk9UIF9yY19yZXN1bHQgRVFVQUwgMCkKKyAgICBzdHJpbmcoQVBQRU5EIF9tc2cgIiAgIgorICAgICAgIkZ1cnRoZXJtb3JlLCB1c2UgdGhlIE1TVkMgY29tbWFuZC1saW5lIGVudmlyb25tZW50LiIKKyAgICAgICkKKyAgZW5kaWYoKQorICBtZXNzYWdlKEZBVEFMX0VSUk9SICIke19tc2d9IikKK2VuZGZ1bmN0aW9uKCkKZGlmZiAtLWdpdCBhL01vZHVsZXMvQ1BhY2tEZWIuY21ha2UgYi9Nb2R1bGVzL0NQYWNrRGViLmNtYWtlCmluZGV4IDMzN2JlYzguLjE4Nzk4MjcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvQ1BhY2tEZWIuY21ha2UKKysrIGIvTW9kdWxlcy9DUGFja0RlYi5jbWFrZQpAQCAtMTEwLDYgKzExMCwxNCBAQAogIyAgOnZhcmlhYmxlOmBDUEFDS19ERUJJQU5fUEFDS0FHRV9SRUxFQVNFYCBpcyBub3Qgc2V0IHRoZW4gaHlwaGVucyBhcmUgbm90CiAjICBhbGxvd2VkLgogIworIyAgLi4gbm90ZTo6CisjCisjICAgIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggQ01ha2UgMy45IGFuZCBsb3dlciBhIGZhaWxlZCB0ZXN0IG9mIHRoaXMKKyMgICAgdmFyaWFibGUncyBjb250ZW50IGlzIG5vdCBhIGhhcmQgZXJyb3Igd2hlbiBib3RoCisjICAgIDp2YXJpYWJsZTpgQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfUkVMRUFTRWAgYW5kCisjICAgIDp2YXJpYWJsZTpgQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfRVBPQ0hgIHZhcmlhYmxlcyBhcmUgbm90IHNldC4gQW4gYXV0aG9yCisjICAgIHdhcm5pbmcgaXMgcmVwb3J0ZWQgaW5zdGVhZC4KKyMKICMgLi4gdmFyaWFibGU6OiBDUEFDS19ERUJJQU5fUEFDS0FHRV9SRUxFQVNFCiAjCiAjICBUaGUgRGViaWFuIHBhY2thZ2UgcmVsZWFzZSAtIERlYmlhbiByZXZpc2lvbiBudW1iZXIuCkBAIC03NTMsOSArNzYxLDIyIEBACiAgICAgc2V0KENQQUNLX0RFQklBTl9QQUNLQUdFX1ZFUlNJT04gJHtDUEFDS19QQUNLQUdFX1ZFUlNJT059KQogICBlbmRpZigpCiAKLSAgaWYoTk9UIENQQUNLX0RFQklBTl9QQUNLQUdFX1ZFUlNJT04gTUFUQ0hFUyAiXlswLTldW0EtWmEtejAtOS4rLX5dKiQiKQotICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IKLSAgICAgICJDUGFja0RlYjogRGViaWFuIHBhY2thZ2UgdmVyc2lvbiBtdXN0IGNvbmZpcm0gdG8gXCJeWzAtOV1bQS1aYS16MC05Listfl0qJFwiIHJlZ2V4ISIpCisgIGlmKERFRklORUQgQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfUkVMRUFTRSBPUiBERUZJTkVEIENQQUNLX0RFQklBTl9QQUNLQUdFX0VQT0NIKQorICAgICMgb25seSB0ZXN0IHRoZSB2ZXJzaW9uIGZvcm1hdCBpZiBDUEFDS19ERUJJQU5fUEFDS0FHRV9SRUxFQVNFIG9yCisgICAgIyBDUEFDS19ERUJJQU5fUEFDS0FHRV9FUE9DSCBpcyBzZXQKKyAgICBpZihOT1QgQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfVkVSU0lPTiBNQVRDSEVTICJeWzAtOV1bQS1aYS16MC05Lit+LV0qJCIpCisgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SCisgICAgICAgICJDUGFja0RlYjogRGViaWFuIHBhY2thZ2UgdmVyc2lvbiBtdXN0IGNvbmZpcm0gdG8gXCJeWzAtOV1bQS1aYS16MC05Lit+LV0qJFwiIHJlZ2V4ISIpCisgICAgZW5kaWYoKQorICBlbHNlKCkKKyAgICAjIGJlZm9yZSBDTWFrZSAzLjEwIHZlcnNpb24gZm9ybWF0IHdhcyBub3QgdGVzdGVkIHNvIG9ubHkgd2FybiB0byBwcmVzZXJ2ZQorICAgICMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgIGlmKE5PVCBDUEFDS19ERUJJQU5fUEFDS0FHRV9WRVJTSU9OIE1BVENIRVMgIl4oWzAtOV0rOik/WzAtOV1bQS1aYS16MC05Lit+LV0qJCIpCisgICAgICBtZXNzYWdlKEFVVEhPUl9XQVJOSU5HCisgICAgICAgICJDUGFja0RlYjogRGViaWFuIHBhY2thZ2UgdmVyc2lvbmluZyAoWzxlcG9jaD46XTx2ZXJzaW9uPlstPHJlbGVhc2U+XSkiCisgICAgICAgICIgc2hvdWxkIGNvbmZpcm0gdG8gXCJeKFswLTldKzopP1swLTldW0EtWmEtejAtOS4rfi1dKiRcIiByZWdleCBpbiIKKyAgICAgICAgIiBvcmRlciB0byBzYXRpc2Z5IERlYmlhbiBwYWNrYWdpbmcgcnVsZXMuIikKKyAgICBlbmRpZigpCiAgIGVuZGlmKCkKIAogICBpZihDUEFDS19ERUJJQU5fUEFDS0FHRV9SRUxFQVNFKQpAQCAtNzY1LDkgKzc4NiwxNSBAQAogICAgIGVuZGlmKCkKICAgICBzdHJpbmcoQVBQRU5EIENQQUNLX0RFQklBTl9QQUNLQUdFX1ZFUlNJT04KICAgICAgICItJHtDUEFDS19ERUJJQU5fUEFDS0FHRV9SRUxFQVNFfSIpCi0gIGVsc2VpZihDUEFDS19ERUJJQU5fUEFDS0FHRV9WRVJTSU9OIE1BVENIRVMgIi4qLS4qIikKLSAgICBtZXNzYWdlKEZBVEFMX0VSUk9SCi0gICAgICAiQ1BhY2tEZWI6IERlYmlhbiBwYWNrYWdlIHZlcnNpb24gbXVzdCBub3QgY29udGFpbiBoeXBoZW5zIHdoZW4gQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfUkVMRUFTRSBpcyBub3QgcHJvdmlkZWQhIikKKyAgZWxzZWlmKERFRklORUQgQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfRVBPQ0gpCisgICAgIyBvbmx5IHRlc3QgdGhlIHZlcnNpb24gZm9ybWF0IGlmIENQQUNLX0RFQklBTl9QQUNLQUdFX1JFTEVBU0Ugb3IKKyAgICAjIENQQUNLX0RFQklBTl9QQUNLQUdFX0VQT0NIIGlzIHNldCAtIHZlcnNpb25zIENQYWNrL0RlYiBnZW5lcmF0b3IgYmVmb3JlCisgICAgIyBDTWFrZSAzLjEwIGRpZCBub3QgY2hlY2sgZm9yIHZlcnNpb24gZm9ybWF0IHNvIHdlIGhhdmUgdG8gcHJlc2VydmUKKyAgICAjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAgICBpZihDUEFDS19ERUJJQU5fUEFDS0FHRV9WRVJTSU9OIE1BVENIRVMgIi4qLS4qIikKKyAgICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IKKyAgICAgICAgIkNQYWNrRGViOiBEZWJpYW4gcGFja2FnZSB2ZXJzaW9uIG11c3Qgbm90IGNvbnRhaW4gaHlwaGVucyB3aGVuIENQQUNLX0RFQklBTl9QQUNLQUdFX1JFTEVBU0UgaXMgbm90IHByb3ZpZGVkISIpCisgICAgZW5kaWYoKQogICBlbmRpZigpCiAKICAgaWYoQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfRVBPQ0gpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL0NvbXBpbGVyL0NsYW5nLmNtYWtlIGIvTW9kdWxlcy9Db21waWxlci9DbGFuZy5jbWFrZQppbmRleCA3ZDQ3NmY5Li45ZjVlOTIxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL0NvbXBpbGVyL0NsYW5nLmNtYWtlCisrKyBiL01vZHVsZXMvQ29tcGlsZXIvQ2xhbmcuY21ha2UKQEAgLTY5LDE1ICs2OSwxNSBAQAogICAgIGVuZGlmKCkKIAogICAgIHNldChDTUFLRV8ke2xhbmd9X0FSQ0hJVkVfQ1JFQVRFX0lQTwotICAgICAgIiR7X19hcn0gY3IgPFRBUkdFVD4gPExJTktfRkxBR1M+IDxPQkpFQ1RTPiIKKyAgICAgICJcIiR7X19hcn1cIiBjciA8VEFSR0VUPiA8TElOS19GTEFHUz4gPE9CSkVDVFM+IgogICAgICkKIAogICAgIHNldChDTUFLRV8ke2xhbmd9X0FSQ0hJVkVfQVBQRU5EX0lQTwotICAgICAgIiR7X19hcn0gciA8VEFSR0VUPiA8TElOS19GTEFHUz4gPE9CSkVDVFM+IgorICAgICAgIlwiJHtfX2FyfVwiIHIgPFRBUkdFVD4gPExJTktfRkxBR1M+IDxPQkpFQ1RTPiIKICAgICApCiAKICAgICBzZXQoQ01BS0VfJHtsYW5nfV9BUkNISVZFX0ZJTklTSF9JUE8KLSAgICAgICIke19fcmFubGlifSA8VEFSR0VUPiIKKyAgICAgICJcIiR7X19yYW5saWJ9XCIgPFRBUkdFVD4iCiAgICAgKQogICBlbmRtYWNybygpCiBlbmRpZigpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL0NvbXBpbGVyL0dOVS5jbWFrZSBiL01vZHVsZXMvQ29tcGlsZXIvR05VLmNtYWtlCmluZGV4IDY3NWU1MDUuLmQ5NjI2ODggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvQ29tcGlsZXIvR05VLmNtYWtlCisrKyBiL01vZHVsZXMvQ29tcGlsZXIvR05VLmNtYWtlCkBAIC03NSwxNSArNzUsMTUgQEAKICAgICAjCiAgICAgIyBbMV06IGh0dHBzOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MtNC45LjQvZ2NjL09wdGltaXplLU9wdGlvbnMuaHRtbAogICAgIHNldChDTUFLRV8ke2xhbmd9X0FSQ0hJVkVfQ1JFQVRFX0lQTwotICAgICAgIiR7Q01BS0VfJHtsYW5nfV9DT01QSUxFUl9BUn0gY3IgPFRBUkdFVD4gPExJTktfRkxBR1M+IDxPQkpFQ1RTPiIKKyAgICAgICJcIiR7Q01BS0VfJHtsYW5nfV9DT01QSUxFUl9BUn1cIiBjciA8VEFSR0VUPiA8TElOS19GTEFHUz4gPE9CSkVDVFM+IgogICAgICkKIAogICAgIHNldChDTUFLRV8ke2xhbmd9X0FSQ0hJVkVfQVBQRU5EX0lQTwotICAgICAgIiR7Q01BS0VfJHtsYW5nfV9DT01QSUxFUl9BUn0gciA8VEFSR0VUPiA8TElOS19GTEFHUz4gPE9CSkVDVFM+IgorICAgICAgIlwiJHtDTUFLRV8ke2xhbmd9X0NPTVBJTEVSX0FSfVwiIHIgPFRBUkdFVD4gPExJTktfRkxBR1M+IDxPQkpFQ1RTPiIKICAgICApCiAKICAgICBzZXQoQ01BS0VfJHtsYW5nfV9BUkNISVZFX0ZJTklTSF9JUE8KLSAgICAgICIke0NNQUtFXyR7bGFuZ31fQ09NUElMRVJfUkFOTElCfSA8VEFSR0VUPiIKKyAgICAgICJcIiR7Q01BS0VfJHtsYW5nfV9DT01QSUxFUl9SQU5MSUJ9XCIgPFRBUkdFVD4iCiAgICAgKQogICBlbmRpZigpCiBlbmRtYWNybygpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL0V4dGVybmFsUHJvamVjdC5jbWFrZSBiL01vZHVsZXMvRXh0ZXJuYWxQcm9qZWN0LmNtYWtlCmluZGV4IDc2ZjUwODAuLjQxOWM5ZDYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvRXh0ZXJuYWxQcm9qZWN0LmNtYWtlCisrKyBiL01vZHVsZXMvRXh0ZXJuYWxQcm9qZWN0LmNtYWtlCkBAIC04NTQsNiArODU0LDkgQEAKIAogI109PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PV0KIAorY21ha2VfcG9saWN5KFBVU0gpCitjbWFrZV9wb2xpY3koU0VUIENNUDAwNTQgTkVXKSAjIGlmKCkgcXVvdGVkIHZhcmlhYmxlcyBub3QgZGVyZWZlcmVuY2VkCisKICMgUHJlLWNvbXB1dGUgYSByZWdleCB0byBtYXRjaCBkb2N1bWVudGVkIGtleXdvcmRzIGZvciBlYWNoIGNvbW1hbmQuCiBtYXRoKEVYUFIgX2VwX2RvY3VtZW50YXRpb25fbGluZV9jb3VudCAiJHtDTUFLRV9DVVJSRU5UX0xJU1RfTElORX0gLSA0IikKIGZpbGUoU1RSSU5HUyAiJHtDTUFLRV9DVVJSRU5UX0xJU1RfRklMRX0iIGxpbmVzCkBAIC0zMDM1LDMgKzMwMzgsNSBAQAogICAjCiAgIF9lcF9hZGRfdGVzdF9jb21tYW5kKCR7bmFtZX0pCiBlbmRmdW5jdGlvbigpCisKK2NtYWtlX3BvbGljeShQT1ApCmRpZmYgLS1naXQgYS9Nb2R1bGVzL0ZpbmRDVURBLmNtYWtlIGIvTW9kdWxlcy9GaW5kQ1VEQS5jbWFrZQppbmRleCBiZDdkMGMwLi4xYzhhYzI2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL0ZpbmRDVURBLmNtYWtlCisrKyBiL01vZHVsZXMvRmluZENVREEuY21ha2UKQEAgLTMzOSw3ICszMzksMjcgQEAKICMgICBDVURBX25wcGNfTElCUkFSWSAgICAgLS0gTlZJRElBIFBlcmZvcm1hbmNlIFByaW1pdGl2ZXMgbGliIChjb3JlKS4KICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSBhdmFpbGFibGUgZm9yIENVREEgdmVyc2lvbiA1LjUrLgogIyAgIENVREFfbnBwaV9MSUJSQVJZICAgICAtLSBOVklESUEgUGVyZm9ybWFuY2UgUHJpbWl0aXZlcyBsaWIgKGltYWdlIHByb2Nlc3NpbmcpLgotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IGF2YWlsYWJsZSBmb3IgQ1VEQSB2ZXJzaW9uIDUuNSsuCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgYXZhaWxhYmxlIGZvciBDVURBIHZlcnNpb24gNS41IC0gOC4wLgorIyAgIENVREFfbnBwaWFsX0xJQlJBUlkgICAtLSBOVklESUEgUGVyZm9ybWFuY2UgUHJpbWl0aXZlcyBsaWIgKGltYWdlIHByb2Nlc3NpbmcpLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IGF2YWlsYWJsZSBmb3IgQ1VEQSB2ZXJzaW9uIDkuMC4KKyMgICBDVURBX25wcGljY19MSUJSQVJZICAgLS0gTlZJRElBIFBlcmZvcm1hbmNlIFByaW1pdGl2ZXMgbGliIChpbWFnZSBwcm9jZXNzaW5nKS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSBhdmFpbGFibGUgZm9yIENVREEgdmVyc2lvbiA5LjAuCisjICAgQ1VEQV9ucHBpY29tX0xJQlJBUlkgIC0tIE5WSURJQSBQZXJmb3JtYW5jZSBQcmltaXRpdmVzIGxpYiAoaW1hZ2UgcHJvY2Vzc2luZykuCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgYXZhaWxhYmxlIGZvciBDVURBIHZlcnNpb24gOS4wLgorIyAgIENVREFfbnBwaWRlaV9MSUJSQVJZICAtLSBOVklESUEgUGVyZm9ybWFuY2UgUHJpbWl0aXZlcyBsaWIgKGltYWdlIHByb2Nlc3NpbmcpLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IGF2YWlsYWJsZSBmb3IgQ1VEQSB2ZXJzaW9uIDkuMC4KKyMgICBDVURBX25wcGlmX0xJQlJBUlkgICAgLS0gTlZJRElBIFBlcmZvcm1hbmNlIFByaW1pdGl2ZXMgbGliIChpbWFnZSBwcm9jZXNzaW5nKS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSBhdmFpbGFibGUgZm9yIENVREEgdmVyc2lvbiA5LjAuCisjICAgQ1VEQV9ucHBpZ19MSUJSQVJZICAgIC0tIE5WSURJQSBQZXJmb3JtYW5jZSBQcmltaXRpdmVzIGxpYiAoaW1hZ2UgcHJvY2Vzc2luZykuCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgYXZhaWxhYmxlIGZvciBDVURBIHZlcnNpb24gOS4wLgorIyAgIENVREFfbnBwaW1fTElCUkFSWSAgICAtLSBOVklESUEgUGVyZm9ybWFuY2UgUHJpbWl0aXZlcyBsaWIgKGltYWdlIHByb2Nlc3NpbmcpLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IGF2YWlsYWJsZSBmb3IgQ1VEQSB2ZXJzaW9uIDkuMC4KKyMgICBDVURBX25wcGlzdF9MSUJSQVJZICAgLS0gTlZJRElBIFBlcmZvcm1hbmNlIFByaW1pdGl2ZXMgbGliIChpbWFnZSBwcm9jZXNzaW5nKS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSBhdmFpbGFibGUgZm9yIENVREEgdmVyc2lvbiA5LjAuCisjICAgQ1VEQV9ucHBpc3VfTElCUkFSWSAgIC0tIE5WSURJQSBQZXJmb3JtYW5jZSBQcmltaXRpdmVzIGxpYiAoaW1hZ2UgcHJvY2Vzc2luZykuCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgYXZhaWxhYmxlIGZvciBDVURBIHZlcnNpb24gOS4wLgorIyAgIENVREFfbnBwaXRjX0xJQlJBUlkgICAtLSBOVklESUEgUGVyZm9ybWFuY2UgUHJpbWl0aXZlcyBsaWIgKGltYWdlIHByb2Nlc3NpbmcpLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IGF2YWlsYWJsZSBmb3IgQ1VEQSB2ZXJzaW9uIDkuMC4KICMgICBDVURBX25wcHNfTElCUkFSWSAgICAgLS0gTlZJRElBIFBlcmZvcm1hbmNlIFByaW1pdGl2ZXMgbGliIChzaWduYWwgcHJvY2Vzc2luZykuCiAjICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgYXZhaWxhYmxlIGZvciBDVURBIHZlcnNpb24gNS41Ky4KICMgICBDVURBX252Y3V2ZW5jX0xJQlJBUlkgLS0gQ1VEQSBWaWRlbyBFbmNvZGVyIGxpYnJhcnkuCkBAIC05MzksNiArOTU5LDI0IEBACiBlbmRpZigpCiBpZihDVURBX1ZFUlNJT04gVkVSU0lPTl9HUkVBVEVSICI1LjAiKQogICBmaW5kX2N1ZGFfaGVscGVyX2xpYnMoY3VibGFzX2RldmljZSkKK2VuZGlmKCkKKworaWYoTk9UIENVREFfVkVSU0lPTiBWRVJTSU9OX0xFU1MgIjkuMCIpCisgICMgSW4gQ1VEQSA5LjAgTlBQIHdhcyBucHBpIHdhcyByZW1vdmVkCisgIGZpbmRfY3VkYV9oZWxwZXJfbGlicyhucHBjKQorICBmaW5kX2N1ZGFfaGVscGVyX2xpYnMobnBwaWFsKQorICBmaW5kX2N1ZGFfaGVscGVyX2xpYnMobnBwaWNjKQorICBmaW5kX2N1ZGFfaGVscGVyX2xpYnMobnBwaWNvbSkKKyAgZmluZF9jdWRhX2hlbHBlcl9saWJzKG5wcGlkZWkpCisgIGZpbmRfY3VkYV9oZWxwZXJfbGlicyhucHBpZikKKyAgZmluZF9jdWRhX2hlbHBlcl9saWJzKG5wcGlnKQorICBmaW5kX2N1ZGFfaGVscGVyX2xpYnMobnBwaW0pCisgIGZpbmRfY3VkYV9oZWxwZXJfbGlicyhucHBpc3QpCisgIGZpbmRfY3VkYV9oZWxwZXJfbGlicyhucHBpc3UpCisgIGZpbmRfY3VkYV9oZWxwZXJfbGlicyhucHBpdGMpCisgIGZpbmRfY3VkYV9oZWxwZXJfbGlicyhucHBzKQorICBzZXQoQ1VEQV9ucHBfTElCUkFSWSAiJHtDVURBX25wcGNfTElCUkFSWX07JHtDVURBX25wcGlhbF9MSUJSQVJZfTske0NVREFfbnBwaWNjX0xJQlJBUll9OyR7Q1VEQV9ucHBpY29tX0xJQlJBUll9OyR7Q1VEQV9ucHBpZGVpX0xJQlJBUll9OyR7Q1VEQV9ucHBpZl9MSUJSQVJZfTske0NVREFfbnBwaWdfTElCUkFSWX07JHtDVURBX25wcGltX0xJQlJBUll9OyR7Q1VEQV9ucHBpc3RfTElCUkFSWX07JHtDVURBX25wcGlzdV9MSUJSQVJZfTske0NVREFfbnBwaXRjX0xJQlJBUll9OyR7Q1VEQV9ucHBzX0xJQlJBUll9IikKK2Vsc2VpZihDVURBX1ZFUlNJT04gVkVSU0lPTl9HUkVBVEVSICI1LjAiKQogICAjIEluIENVREEgNS41IE5QUCB3YXMgc3BsaXR0ZWQgb250byAzIHNlcGFyYXRlIGxpYnJhcmllcy4KICAgZmluZF9jdWRhX2hlbHBlcl9saWJzKG5wcGMpCiAgIGZpbmRfY3VkYV9oZWxwZXJfbGlicyhucHBpKQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9GaW5kSmF2YS5jbWFrZSBiL01vZHVsZXMvRmluZEphdmEuY21ha2UKaW5kZXggZWIyMjQyYi4uYjkxM2UxNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9GaW5kSmF2YS5jbWFrZQorKysgYi9Nb2R1bGVzL0ZpbmRKYXZhLmNtYWtlCkBAIC0zOSw3ICszOSw3IEBACiAjICAgSmF2YV9WRVJTSU9OX01JTk9SICAgICAgICA9IFRoZSBtaW5vciB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlIGZvdW5kLgogIyAgIEphdmFfVkVSU0lPTl9QQVRDSCAgICAgICAgPSBUaGUgcGF0Y2ggdmVyc2lvbiBvZiB0aGUgcGFja2FnZSBmb3VuZC4KICMgICBKYXZhX1ZFUlNJT05fVFdFQUsgICAgICAgID0gVGhlIHR3ZWFrIHZlcnNpb24gb2YgdGhlIHBhY2thZ2UgZm91bmQgKGFmdGVyICdfJykKLSMgICBKYXZhX1ZFUlNJT04gICAgICAgICAgICAgID0gVGhpcyBpcyBzZXQgdG86ICRtYWpvci4kbWlub3IuJHBhdGNoKC4kdHdlYWspCisjICAgSmF2YV9WRVJTSU9OICAgICAgICAgICAgICA9IFRoaXMgaXMgc2V0IHRvOiAkbWFqb3JbLiRtaW5vclsuJHBhdGNoWy4kdHdlYWtdXV0KICMKICMKICMKQEAgLTEzMywzOSArMTMzLDU2IEBACiAgICAgICAgIG1lc3NhZ2UoIFNUQVRVUyAiV2FybmluZywgY291bGQgbm90IHJ1biBqYXZhIC12ZXJzaW9uIikKICAgICAgIGVuZGlmKCkKICAgICBlbHNlKCkKLSAgICAgICMgZXh0cmFjdCBtYWpvci9taW5vciB2ZXJzaW9uIGFuZCBwYXRjaCBsZXZlbCBmcm9tICJqYXZhIC12ZXJzaW9uIiBvdXRwdXQKLSAgICAgICMgVGVzdGVkIG9uIGxpbnV4IHVzaW5nCi0gICAgICAjIDEuIFN1biAvIFN1biBPRU0KLSAgICAgICMgMi4gT3BlbkpESyAxLjYKLSAgICAgICMgMy4gR0NKIDEuNQotICAgICAgIyA0LiBLYWZmZSAxLjQuMgotICAgICAgIyA1LiBPcGVuSkRLIDEuNy54IG9uIE9wZW5CU0QKLSAgICAgIGlmKHZhciBNQVRDSEVTICJqYXZhIHZlcnNpb24gXCIoWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV8uXSsuKilcIiIpCi0gICAgICAgICMgVGhpcyBpcyBtb3N0IGxpa2VseSBTdW4gLyBPcGVuSkRLLCBvciBtYXliZSBHQ0otamF2YSBjb21wYXQgbGF5ZXIKKyAgICAgICMgRXh0cmFjdCB2ZXJzaW9uIGNvbXBvbmVudHMgKHVwIHRvIDQgbGV2ZWxzKSBmcm9tICJqYXZhIC12ZXJzaW9uIiBvdXRwdXQuCisgICAgICBzZXQoX2phdmFfdmVyc2lvbl9yZWdleCBbWygoWzAtOV0rKShcLihbMC05XSspKFwuKFswLTldKykoXyhbMC05XSspKT8pPyk/LiopXV0pCisgICAgICBpZih2YXIgTUFUQ0hFUyAiamF2YSB2ZXJzaW9uIFwiJHtfamF2YV92ZXJzaW9uX3JlZ2V4fVwiIikKKyAgICAgICAgIyBTdW4sIEdDSiwgb2xkZXIgT3BlbkpESwogICAgICAgICBzZXQoSmF2YV9WRVJTSU9OX1NUUklORyAiJHtDTUFLRV9NQVRDSF8xfSIpCisgICAgICAgIHNldChKYXZhX1ZFUlNJT05fTUFKT1IgIiR7Q01BS0VfTUFUQ0hfMn0iKQorICAgICAgICBzZXQoSmF2YV9WRVJTSU9OX01JTk9SICIke0NNQUtFX01BVENIXzR9IikKKyAgICAgICAgc2V0KEphdmFfVkVSU0lPTl9QQVRDSCAiJHtDTUFLRV9NQVRDSF82fSIpCisgICAgICAgIHNldChKYXZhX1ZFUlNJT05fVFdFQUsgIiR7Q01BS0VfTUFUQ0hfOH0iKQorICAgICAgZWxzZWlmKHZhciBNQVRDSEVTICJvcGVuamRrIHZlcnNpb24gXCIke19qYXZhX3ZlcnNpb25fcmVnZXh9XCIiKQorICAgICAgICAjIE9wZW5KREsKKyAgICAgICAgc2V0KEphdmFfVkVSU0lPTl9TVFJJTkcgIiR7Q01BS0VfTUFUQ0hfMX0iKQorICAgICAgICBzZXQoSmF2YV9WRVJTSU9OX01BSk9SICIke0NNQUtFX01BVENIXzJ9IikKKyAgICAgICAgc2V0KEphdmFfVkVSU0lPTl9NSU5PUiAiJHtDTUFLRV9NQVRDSF80fSIpCisgICAgICAgIHNldChKYXZhX1ZFUlNJT05fUEFUQ0ggIiR7Q01BS0VfTUFUQ0hfNn0iKQorICAgICAgICBzZXQoSmF2YV9WRVJTSU9OX1RXRUFLICIke0NNQUtFX01BVENIXzh9IikKICAgICAgIGVsc2VpZih2YXIgTUFUQ0hFUyAib3BlbmpkayB2ZXJzaW9uIFwiKFswLTldKyktW0EtWmEtel0rXCIiKQogICAgICAgICAjIE9wZW5KREsgOSBlYXJseSBhY2Nlc3MgYnVpbGRzIG9yIGxvY2FsbHkgYnVpbHQKICAgICAgICAgc2V0KEphdmFfVkVSU0lPTl9TVFJJTkcgIjEuJHtDTUFLRV9NQVRDSF8xfS4wIikKLSAgICAgIGVsc2VpZih2YXIgTUFUQ0hFUyAiamF2YSBmdWxsIHZlcnNpb24gXCJrYWZmZS0oWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV9dKylcIiIpCisgICAgICAgIHNldChKYXZhX1ZFUlNJT05fTUFKT1IgIjEiKQorICAgICAgICBzZXQoSmF2YV9WRVJTSU9OX01JTk9SICIke0NNQUtFX01BVENIXzF9IikKKyAgICAgICAgc2V0KEphdmFfVkVSU0lPTl9QQVRDSCAiMCIpCisgICAgICAgIHNldChKYXZhX1ZFUlNJT05fVFdFQUsgIiIpCisgICAgICBlbHNlaWYodmFyIE1BVENIRVMgImphdmEgZnVsbCB2ZXJzaW9uIFwia2FmZmUtJHtfamF2YV92ZXJzaW9uX3JlZ2V4fVwiIikKICAgICAgICAgIyBLYWZmZSBzdHlsZQogICAgICAgICBzZXQoSmF2YV9WRVJTSU9OX1NUUklORyAiJHtDTUFLRV9NQVRDSF8xfSIpCi0gICAgICBlbHNlaWYodmFyIE1BVENIRVMgIm9wZW5qZGsgdmVyc2lvbiBcIihbMC05XStcXC5bMC05XStcXC5bMC05X10rLiopXCIiKQotICAgICAgICAjIE9wZW5KREsgdmVyIDEuNy54IG9uIE9wZW5CU0QKLSAgICAgICAgc2V0KEphdmFfVkVSU0lPTl9TVFJJTkcgIiR7Q01BS0VfTUFUQ0hfMX0iKQorICAgICAgICBzZXQoSmF2YV9WRVJTSU9OX01BSk9SICIke0NNQUtFX01BVENIXzJ9IikKKyAgICAgICAgc2V0KEphdmFfVkVSU0lPTl9NSU5PUiAiJHtDTUFLRV9NQVRDSF80fSIpCisgICAgICAgIHNldChKYXZhX1ZFUlNJT05fUEFUQ0ggIiR7Q01BS0VfTUFUQ0hfNn0iKQorICAgICAgICBzZXQoSmF2YV9WRVJTSU9OX1RXRUFLICIke0NNQUtFX01BVENIXzh9IikKICAgICAgIGVsc2UoKQogICAgICAgICBpZihOT1QgSmF2YV9GSU5EX1FVSUVUTFkpCi0gICAgICAgICAgbWVzc2FnZShXQVJOSU5HICJyZWdleCBub3Qgc3VwcG9ydGVkOiAke3Zhcn0uIFBsZWFzZSByZXBvcnQiKQorICAgICAgICAgIHN0cmluZyhSRVBMQUNFICJcbiIgIlxuICAiIHZlcl9tc2cgIlxuJHt2YXJ9IikKKyAgICAgICAgICBtZXNzYWdlKFdBUk5JTkcgIkphdmEgdmVyc2lvbiBub3QgcmVjb2duaXplZDoke3Zlcl9tc2d9XG5QbGVhc2UgcmVwb3J0LiIpCiAgICAgICAgIGVuZGlmKCkKKyAgICAgICAgc2V0KEphdmFfVkVSU0lPTl9TVFJJTkcgIiIpCisgICAgICAgIHNldChKYXZhX1ZFUlNJT05fTUFKT1IgIiIpCisgICAgICAgIHNldChKYXZhX1ZFUlNJT05fTUlOT1IgIiIpCisgICAgICAgIHNldChKYXZhX1ZFUlNJT05fUEFUQ0ggIiIpCisgICAgICAgIHNldChKYXZhX1ZFUlNJT05fVFdFQUsgIiIpCiAgICAgICBlbmRpZigpCi0gICAgICBzdHJpbmcoIFJFR0VYIFJFUExBQ0UgIihbMC05XSspLioiICJcXDEiIEphdmFfVkVSU0lPTl9NQUpPUiAiJHtKYXZhX1ZFUlNJT05fU1RSSU5HfSIgKQotICAgICAgc3RyaW5nKCBSRUdFWCBSRVBMQUNFICJbMC05XStcXC4oWzAtOV0rKS4qIiAiXFwxIiBKYXZhX1ZFUlNJT05fTUlOT1IgIiR7SmF2YV9WRVJTSU9OX1NUUklOR30iICkKLSAgICAgIHN0cmluZyggUkVHRVggUkVQTEFDRSAiWzAtOV0rXFwuWzAtOV0rXFwuKFswLTldKykuKiIgIlxcMSIgSmF2YV9WRVJTSU9OX1BBVENIICIke0phdmFfVkVSU0lPTl9TVFJJTkd9IiApCi0gICAgICAjIHdhcm5pbmcgdHdlYWsgdmVyc2lvbiBjYW4gYmUgZW1wdHk6Ci0gICAgICBzdHJpbmcoIFJFR0VYIFJFUExBQ0UgIlswLTldK1xcLlswLTldK1xcLlswLTldK1tfXFwuXT8oWzAtOV0qKS4qJCIgIlxcMSIgSmF2YV9WRVJTSU9OX1RXRUFLICIke0phdmFfVkVSU0lPTl9TVFJJTkd9IiApCi0gICAgICBpZiggSmF2YV9WRVJTSU9OX1RXRUFLIFNUUkVRVUFMICIiICkgIyBjaGVjayBjYXNlIHdoZXJlIHR3ZWFrIGlzIG5vdCBkZWZpbmVkCi0gICAgICAgIHNldChKYXZhX1ZFUlNJT04gJHtKYXZhX1ZFUlNJT05fTUFKT1J9LiR7SmF2YV9WRVJTSU9OX01JTk9SfS4ke0phdmFfVkVSU0lPTl9QQVRDSH0pCi0gICAgICBlbHNlKCkKLSAgICAgICAgc2V0KEphdmFfVkVSU0lPTiAke0phdmFfVkVSU0lPTl9NQUpPUn0uJHtKYXZhX1ZFUlNJT05fTUlOT1J9LiR7SmF2YV9WRVJTSU9OX1BBVENIfS4ke0phdmFfVkVSU0lPTl9UV0VBS30pCisgICAgICBzZXQoSmF2YV9WRVJTSU9OICIke0phdmFfVkVSU0lPTl9NQUpPUn0iKQorICAgICAgaWYoTk9UICJ4JHtKYXZhX1ZFUlNJT059IiBTVFJFUVVBTCAieCIpCisgICAgICAgIGZvcmVhY2goYyBNSU5PUiBQQVRDSCBUV0VBSykKKyAgICAgICAgICBpZihOT1QgIngke0phdmFfVkVSU0lPTl8ke2N9fSIgU1RSRVFVQUwgIngiKQorICAgICAgICAgICAgc3RyaW5nKEFQUEVORCBKYXZhX1ZFUlNJT04gIi4ke0phdmFfVkVSU0lPTl8ke2N9fSIpCisgICAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBicmVhaygpCisgICAgICAgICAgZW5kaWYoKQorICAgICAgICBlbmRmb3JlYWNoKCkKICAgICAgIGVuZGlmKCkKICAgICBlbmRpZigpCiAKQEAgLTI1NCw3ICsyNzEsNyBAQAogICBmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoSmF2YQogICAgIFJFUVVJUkVEX1ZBUlMgSmF2YV9KQVZBX0VYRUNVVEFCTEUgSmF2YV9KQVJfRVhFQ1VUQUJMRSBKYXZhX0pBVkFDX0VYRUNVVEFCTEUKICAgICAgICAgICAgICAgICAgIEphdmFfSkFWQUhfRVhFQ1VUQUJMRSBKYXZhX0pBVkFET0NfRVhFQ1VUQUJMRQotICAgIFZFUlNJT05fVkFSIEphdmFfVkVSU0lPTgorICAgIFZFUlNJT05fVkFSIEphdmFfVkVSU0lPTl9TVFJJTkcKICAgICApCiBlbmRpZigpCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvRmluZE9wZW5NUC5jbWFrZSBiL01vZHVsZXMvRmluZE9wZW5NUC5jbWFrZQppbmRleCAyNzJmNGRjLi4xZDZhMDM5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL0ZpbmRPcGVuTVAuY21ha2UKKysrIGIvTW9kdWxlcy9GaW5kT3Blbk1QLmNtYWtlCkBAIC0xNjYsMTQgKzE2NiwyMyBAQAogICBfT1BFTk1QX0ZMQUdfQ0FORElEQVRFUygiJHtMQU5HfSIpCiAgIF9PUEVOTVBfV1JJVEVfU09VUkNFX0ZJTEUoIiR7TEFOR30iICJURVNUX1NPVVJDRSIgT3Blbk1QVHJ5RmxhZyBfT1BFTk1QX1RFU1RfU1JDKQogCisgIHVuc2V0KE9wZW5NUF9WRVJCT1NFX0NPTVBJTEVfT1BUSU9OUykKKyAgc2VwYXJhdGVfYXJndW1lbnRzKE9wZW5NUF9WRVJCT1NFX09QVElPTlMgTkFUSVZFX0NPTU1BTkQgIiR7Q01BS0VfJHtMQU5HfV9WRVJCT1NFX0ZMQUd9IikKKyAgZm9yZWFjaChfVkVSQk9TRV9PUFRJT04gSU4gTElTVFMgT3Blbk1QX1ZFUkJPU0VfT1BUSU9OUykKKyAgICBpZihOT1QgX1ZFUkJPU0VfT1BUSU9OIE1BVENIRVMgIl4tV2wsIikKKyAgICAgIGxpc3QoQVBQRU5EIE9wZW5NUF9WRVJCT1NFX0NPTVBJTEVfT1BUSU9OUyAke19WRVJCT1NFX09QVElPTn0pCisgICAgZW5kaWYoKQorICBlbmRmb3JlYWNoKCkKKwogICBmb3JlYWNoKE9QRU5NUF9GTEFHIElOIExJU1RTIE9wZW5NUF8ke0xBTkd9X0ZMQUdfQ0FORElEQVRFUykKICAgICBzZXQoT1BFTk1QX0ZMQUdTX1RFU1QgIiR7T1BFTk1QX0ZMQUd9IikKLSAgICBpZihDTUFLRV8ke0xBTkd9X1ZFUkJPU0VfRkxBRykKLSAgICAgIHN0cmluZyhBUFBFTkQgT1BFTk1QX0ZMQUdTX1RFU1QgIiAke0NNQUtFXyR7TEFOR31fVkVSQk9TRV9GTEFHfSIpCisgICAgaWYoT3Blbk1QX1ZFUkJPU0VfQ09NUElMRV9PUFRJT05TKQorICAgICAgc3RyaW5nKEFQUEVORCBPUEVOTVBfRkxBR1NfVEVTVCAiICR7T3Blbk1QX1ZFUkJPU0VfQ09NUElMRV9PUFRJT05TfSIpCiAgICAgZW5kaWYoKQogICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICJbLS89K10iICIiIE9QRU5NUF9QTEFJTl9GTEFHICIke09QRU5NUF9GTEFHfSIpCiAgICAgdHJ5X2NvbXBpbGUoIE9wZW5NUF9DT01QSUxFX1JFU1VMVF8ke0ZMQUdfTU9ERX1fJHtPUEVOTVBfUExBSU5fRkxBR30gJHtDTUFLRV9CSU5BUllfRElSfSAke19PUEVOTVBfVEVTVF9TUkN9CiAgICAgICBDTUFLRV9GTEFHUyAiLURDT01QSUxFX0RFRklOSVRJT05TOlNUUklORz0ke09QRU5NUF9GTEFHU19URVNUfSIKKyAgICAgIExJTktfTElCUkFSSUVTICR7Q01BS0VfJHtMQU5HfV9WRVJCT1NFX0ZMQUd9CiAgICAgICBPVVRQVVRfVkFSSUFCTEUgT3Blbk1QX1RSWV9DT01QSUxFX09VVFBVVAogICAgICkKIApAQCAtMjMwLDYgKzIzOSw4IEBACiAgICAgc2V0KCIke09QRU5NUF9MSUJfTkFNRVNfVkFSfSIgIk5PVEZPVU5EIiBQQVJFTlRfU0NPUEUpCiAgICAgc2V0KCIke09QRU5NUF9GTEFHX1ZBUn0iICJOT1RGT1VORCIgUEFSRU5UX1NDT1BFKQogICBlbmRmb3JlYWNoKCkKKworICB1bnNldChPcGVuTVBfVkVSQk9TRV9DT01QSUxFX09QVElPTlMpCiBlbmRmdW5jdGlvbigpCiAKIHNldChPcGVuTVBfQ19DWFhfQ0hFQ0tfVkVSU0lPTl9TT1VSQ0UKZGlmZiAtLWdpdCBhL01vZHVsZXMvRmluZFByb3RvYnVmLmNtYWtlIGIvTW9kdWxlcy9GaW5kUHJvdG9idWYuY21ha2UKaW5kZXggNzI5MmFlYy4uZTFhNzE1ZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9GaW5kUHJvdG9idWYuY21ha2UKKysrIGIvTW9kdWxlcy9GaW5kUHJvdG9idWYuY21ha2UKQEAgLTEwMSw3ICsxMDEsNyBAQAogIyAgIGBgSERSU2BgCiAjICAgICBWYXJpYWJsZSB0byBkZWZpbmUgd2l0aCBhdXRvZ2VuZXJhdGVkIGhlYWRlciBmaWxlcwogIyAgIGBgREVTQ1JJUFRPUlNgYAotIyAgICAgVmFyaWFibGUgdG8gZGVmaW5lIHdpdGggYXVvdGdlbmVyYXRlZCBkZXNjcmlwdG9yIGZpbGVzLCBpZiByZXF1ZXN0ZWQuCisjICAgICBWYXJpYWJsZSB0byBkZWZpbmUgd2l0aCBhdXRvZ2VuZXJhdGVkIGRlc2NyaXB0b3IgZmlsZXMsIGlmIHJlcXVlc3RlZC4KICMgICBgYEVYUE9SVF9NQUNST2BgCiAjICAgICBpcyBhIG1hY3JvIHdoaWNoIHNob3VsZCBleHBhbmQgdG8gYGBfX2RlY2xzcGVjKGRsbGV4cG9ydClgYCBvcgogIyAgICAgYGBfX2RlY2xzcGVjKGRsbGltcG9ydClgYCBkZXBlbmRpbmcgb24gd2hhdCBpcyBiZWluZyBjb21waWxlZC4KZGlmZiAtLWdpdCBhL1NvdXJjZS9DTWFrZVZlcnNpb24uY21ha2UgYi9Tb3VyY2UvQ01ha2VWZXJzaW9uLmNtYWtlCmluZGV4IDQ3ZDgwMjUuLjRjZTY1NzUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9DTWFrZVZlcnNpb24uY21ha2UKKysrIGIvU291cmNlL0NNYWtlVmVyc2lvbi5jbWFrZQpAQCAtMSw1ICsxLDUgQEAKICMgQ01ha2UgdmVyc2lvbiBudW1iZXIgY29tcG9uZW50cy4KIHNldChDTWFrZV9WRVJTSU9OX01BSk9SIDMpCi1zZXQoQ01ha2VfVkVSU0lPTl9NSU5PUiA5KQotc2V0KENNYWtlX1ZFUlNJT05fUEFUQ0ggMjAxNzEwMDUpCi0jc2V0KENNYWtlX1ZFUlNJT05fUkMgMSkKK3NldChDTWFrZV9WRVJTSU9OX01JTk9SIDEwKQorc2V0KENNYWtlX1ZFUlNJT05fUEFUQ0ggMCkKK3NldChDTWFrZV9WRVJTSU9OX1JDIDEpCmRpZmYgLS1naXQgYS9Tb3VyY2UvQ1BhY2svY21DUGFja1BhY2thZ2VNYWtlckdlbmVyYXRvci5jeHggYi9Tb3VyY2UvQ1BhY2svY21DUGFja1BhY2thZ2VNYWtlckdlbmVyYXRvci5jeHgKaW5kZXggMDI5OTI3OS4uZGJjYjAyMiAxMDA2NDQKLS0tIGEvU291cmNlL0NQYWNrL2NtQ1BhY2tQYWNrYWdlTWFrZXJHZW5lcmF0b3IuY3h4CisrKyBiL1NvdXJjZS9DUGFjay9jbUNQYWNrUGFja2FnZU1ha2VyR2VuZXJhdG9yLmN4eApAQCAtMjg4LDggKzI4OCw4IEBACiAgIHRtcEZpbGUgKz0gIi9oZGl1dGlsT3V0cHV0LmxvZyI7CiAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBkbWdDbWQ7CiAgIGRtZ0NtZCA8PCAiXCIiIDw8IHRoaXMtPkdldE9wdGlvbigiQ1BBQ0tfSU5TVEFMTEVSX1BST0dSQU1fRElTS19JTUFHRSIpCi0gICAgICAgICA8PCAiXCIgY3JlYXRlIC1vdiAtZm9ybWF0IFVEWk8gLXNyY2ZvbGRlciBcIiIgPDwgcGFja2FnZURpckZpbGVOYW1lCi0gICAgICAgICA8PCAiXCIgXCIiIDw8IHBhY2thZ2VGaWxlTmFtZXNbMF0gPDwgIlwiIjsKKyAgICAgICAgIDw8ICJcIiBjcmVhdGUgLW92IC1mcyBIRlMrIC1mb3JtYXQgVURaTyAtc3JjZm9sZGVyIFwiIgorICAgICAgICAgPDwgcGFja2FnZURpckZpbGVOYW1lIDw8ICJcIiBcIiIgPDwgcGFja2FnZUZpbGVOYW1lc1swXSA8PCAiXCIiOwogICBzdGQ6OnN0cmluZyBvdXRwdXQ7CiAgIGludCByZXRWYWwgPSAxOwogICBpbnQgbnVtVHJpZXMgPSAxMDsKZGlmZiAtLWdpdCBhL1NvdXJjZS9jbUdlbmVyYXRvclRhcmdldC5jeHggYi9Tb3VyY2UvY21HZW5lcmF0b3JUYXJnZXQuY3h4CmluZGV4IGVhNDEyMDRlLi4xMDNkMDM0IDEwMDY0NAotLS0gYS9Tb3VyY2UvY21HZW5lcmF0b3JUYXJnZXQuY3h4CisrKyBiL1NvdXJjZS9jbUdlbmVyYXRvclRhcmdldC5jeHgKQEAgLTQ2NTQsNyArNDY1NCw3IEBACiAgICAgICAgICJJTlRFUkZBQ0VfTElOS19MSUJSQVJJRVM6XG4iCiAgICAgICAgICIgICIgPDwgbmV3RXhwbGljaXRMaWJyYXJpZXMgPDwgIlxuIiA8PAogICAgICAgICBsaW5rSWZhY2VQcm9wIDw8ICI6XG4iCi0gICAgICAgICIgICIgPDwgKGV4cGxpY2l0TGlicmFyaWVzID8gZXhwbGljaXRMaWJyYXJpZXMgOiAiKGVtcHR5KSIpIDw8ICJcbiI7CisgICAgICAgICIgICIgPDwgZXhwbGljaXRMaWJyYXJpZXMgPDwgIlxuIjsKICAgICAgIC8qIGNsYW5nLWZvcm1hdCBvbiAqLwogICAgICAgdGhpcy0+TG9jYWxHZW5lcmF0b3ItPklzc3VlTWVzc2FnZShjbWFrZTo6QVVUSE9SX1dBUk5JTkcsIHcuc3RyKCkpOwogICAgICAgdGhpcy0+UG9saWN5V2FybmVkQ01QMDAyMiA9IHRydWU7CmRpZmYgLS1naXQgYS9Tb3VyY2UvY21JbnN0YWxsQ29tbWFuZEFyZ3VtZW50cy5jeHggYi9Tb3VyY2UvY21JbnN0YWxsQ29tbWFuZEFyZ3VtZW50cy5jeHgKaW5kZXggZmY2NDIwZC4uMTJhYmFjOCAxMDA2NDQKLS0tIGEvU291cmNlL2NtSW5zdGFsbENvbW1hbmRBcmd1bWVudHMuY3h4CisrKyBiL1NvdXJjZS9jbUluc3RhbGxDb21tYW5kQXJndW1lbnRzLmN4eApAQCAtMzksNyArMzksNyBAQAogICBpZiAodGhpcy0+R2VuZXJpY0FyZ3VtZW50cyAhPSBudWxscHRyKSB7CiAgICAgcmV0dXJuIHRoaXMtPkdlbmVyaWNBcmd1bWVudHMtPkdldERlc3RpbmF0aW9uKCk7CiAgIH0KLSAgcmV0dXJuIHRoaXMtPkVtcHR5U3RyaW5nOworICByZXR1cm4gRW1wdHlTdHJpbmc7CiB9CiAKIGNvbnN0IHN0ZDo6c3RyaW5nJiBjbUluc3RhbGxDb21tYW5kQXJndW1lbnRzOjpHZXRDb21wb25lbnQoKSBjb25zdApAQCAtNjUsNyArNjUsNyBAQAogICBpZiAodGhpcy0+R2VuZXJpY0FyZ3VtZW50cyAhPSBudWxscHRyKSB7CiAgICAgcmV0dXJuIHRoaXMtPkdlbmVyaWNBcmd1bWVudHMtPkdldFJlbmFtZSgpOwogICB9Ci0gIHJldHVybiB0aGlzLT5FbXB0eVN0cmluZzsKKyAgcmV0dXJuIEVtcHR5U3RyaW5nOwogfQogCiBjb25zdCBzdGQ6OnN0cmluZyYgY21JbnN0YWxsQ29tbWFuZEFyZ3VtZW50czo6R2V0UGVybWlzc2lvbnMoKSBjb25zdApAQCAtNzYsNyArNzYsNyBAQAogICBpZiAodGhpcy0+R2VuZXJpY0FyZ3VtZW50cyAhPSBudWxscHRyKSB7CiAgICAgcmV0dXJuIHRoaXMtPkdlbmVyaWNBcmd1bWVudHMtPkdldFBlcm1pc3Npb25zKCk7CiAgIH0KLSAgcmV0dXJuIHRoaXMtPkVtcHR5U3RyaW5nOworICByZXR1cm4gRW1wdHlTdHJpbmc7CiB9CiAKIGJvb2wgY21JbnN0YWxsQ29tbWFuZEFyZ3VtZW50czo6R2V0T3B0aW9uYWwoKSBjb25zdApkaWZmIC0tZ2l0IGEvU291cmNlL2NtUHJvY2Vzc1Rvb2xzLmN4eCBiL1NvdXJjZS9jbVByb2Nlc3NUb29scy5jeHgKaW5kZXggMDViMWIwMC4uN2FiMWZhMyAxMDA2NDQKLS0tIGEvU291cmNlL2NtUHJvY2Vzc1Rvb2xzLmN4eAorKysgYi9Tb3VyY2UvY21Qcm9jZXNzVG9vbHMuY3h4CkBAIC0zOCw3ICszOCw3IEBACiAgIGlmIChlcnIpIHsKICAgICBwcm9jZXNzT3V0cHV0LkRlY29kZVRleHQoc3RkOjpzdHJpbmcoKSwgc3RyZGF0YSwgMik7CiAgICAgaWYgKCFzdHJkYXRhLmVtcHR5KCkpIHsKLSAgICAgIG91dC0+UHJvY2VzcyhzdHJkYXRhLmNfc3RyKCksIGludChzdHJkYXRhLnNpemUoKSkpOworICAgICAgZXJyLT5Qcm9jZXNzKHN0cmRhdGEuY19zdHIoKSwgaW50KHN0cmRhdGEuc2l6ZSgpKSk7CiAgICAgfQogICB9CiAgIGNtc3lzUHJvY2Vzc19XYWl0Rm9yRXhpdChjcCwgbnVsbHB0cik7CmRpZmYgLS1naXQgYS9Tb3VyY2UvY21RdEF1dG9HZW5lcmF0b3JJbml0aWFsaXplci5jeHggYi9Tb3VyY2UvY21RdEF1dG9HZW5lcmF0b3JJbml0aWFsaXplci5jeHgKaW5kZXggMjE3ODY1Yi4uZTcwODBjZCAxMDA2NDQKLS0tIGEvU291cmNlL2NtUXRBdXRvR2VuZXJhdG9ySW5pdGlhbGl6ZXIuY3h4CisrKyBiL1NvdXJjZS9jbVF0QXV0b0dlbmVyYXRvckluaXRpYWxpemVyLmN4eApAQCAtNDUyLDggKzQ1Miw2IEBACiAgIGNtR2VuZXJhdG9yVGFyZ2V0IGNvbnN0KiB0YXJnZXQgPSBkaWdlc3QuVGFyZ2V0OwogICBjbU1ha2VmaWxlKiBtYWtlZmlsZSA9IHRhcmdldC0+VGFyZ2V0LT5HZXRNYWtlZmlsZSgpOwogCi0gIEFkZERlZmluaXRpb25Fc2NhcGVkKG1ha2VmaWxlLCAiX3VpY19za2lwIiwgc2V0dXAuVWljU2tpcCk7Ci0KICAgLy8gVWljIHNlYXJjaCBwYXRocwogICB7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHVpY1NlYXJjaFBhdGhzOwpAQCAtNDg5LDIxICs0ODcsMjUgQEAKICAgICAgIH0KICAgICB9CiAgIH0KLSAgLy8gVWljIGZpbGVzIG9wdGlvbnMKKyAgLy8gLnVpIGZpbGVzIHNraXAgYW5kIG9wdGlvbnMKICAgewogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB1aUZpbGVGaWxlczsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+IHVpRmlsZU9wdGlvbnM7CiAgICAgewogICAgICAgc3RkOjpzdHJpbmcgY29uc3QgdWlFeHQgPSAidWkiOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y21Tb3VyY2VGaWxlKj4mIHNyY0ZpbGVzID0gbWFrZWZpbGUtPkdldFNvdXJjZUZpbGVzKCk7Ci0gICAgICBmb3IgKGNtU291cmNlRmlsZSogc2YgOiBzcmNGaWxlcykgeworICAgICAgZm9yIChjbVNvdXJjZUZpbGUqIHNmIDogbWFrZWZpbGUtPkdldFNvdXJjZUZpbGVzKCkpIHsKICAgICAgICAgLy8gc2YtPkdldEV4dGVuc2lvbigpIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgc2YtPkdldEZ1bGxQYXRoKCkgLi4uCiAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBmUGF0aCA9IHNmLT5HZXRGdWxsUGF0aCgpOwogICAgICAgICBpZiAoc2YtPkdldEV4dGVuc2lvbigpID09IHVpRXh0KSB7CisgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgYWJzRmlsZSA9IGNtU3lzdGVtVG9vbHM6OkdldFJlYWxQYXRoKGZQYXRoKTsKKyAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZmlsZSBzaG91bGQgYmUgc2tpcHBlZAorICAgICAgICAgIGlmIChzZi0+R2V0UHJvcGVydHlBc0Jvb2woIlNLSVBfQVVUT1VJQyIpIHx8CisgICAgICAgICAgICAgIHNmLT5HZXRQcm9wZXJ0eUFzQm9vbCgiU0tJUF9BVVRPR0VOIikpIHsKKyAgICAgICAgICAgIHNldHVwLlVpY1NraXAuaW5zZXJ0KGFic0ZpbGUpOworICAgICAgICAgIH0KICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZmlsZXMgaGFzIHVpYyBvcHRpb25zCiAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgdWljT3B0cyA9IEdldFNhZmVQcm9wZXJ0eShzZiwgIkFVVE9VSUNfT1BUSU9OUyIpOwogICAgICAgICAgIGlmICghdWljT3B0cy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCBhYnNGaWxlID0gY21TeXN0ZW1Ub29sczo6R2V0UmVhbFBhdGgoZlBhdGgpOwogICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZmlsZSBpc24ndCBza2lwcGVkCiAgICAgICAgICAgICBpZiAoc2V0dXAuVWljU2tpcC5jb3VudChhYnNGaWxlKSA9PSAwKSB7CiAgICAgICAgICAgICAgIHVpRmlsZUZpbGVzLnB1c2hfYmFjayhhYnNGaWxlKTsKQEAgLTUxOSw2ICs1MjEsOCBAQAogICAgIEFkZERlZmluaXRpb25Fc2NhcGVkKG1ha2VmaWxlLCAiX3F0X3VpY19vcHRpb25zX29wdGlvbnMiLCB1aUZpbGVPcHRpb25zKTsKICAgfQogCisgIEFkZERlZmluaXRpb25Fc2NhcGVkKG1ha2VmaWxlLCAiX3VpY19za2lwIiwgc2V0dXAuVWljU2tpcCk7CisKICAgLy8gVWljIGV4ZWN1dGFibGUKICAgewogICAgIHN0ZDo6c3RyaW5nIGVycjsKZGlmZiAtLWdpdCBhL1NvdXJjZS9jbWNtZC5jeHggYi9Tb3VyY2UvY21jbWQuY3h4CmluZGV4IGMwYzdkMDMuLmVkNTA3ZmQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9jbWNtZC5jeHgKKysrIGIvU291cmNlL2NtY21kLmN4eApAQCAtMTU1NiwxMSArMTU1NiwxMyBAQAogc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlckZvcm1hdHRlciBjb25zdCYgZm9ybWF0dGVyKQogeworICBhdXRvIGNvbnN0JiBmbGFncyA9IHN0cmVhbS5mbGFncygpOwogICBpZiAoZm9ybWF0dGVyLkZvcm1hdCA9PSBGT1JNQVRfREVDSU1BTCkgewotICAgIHN0cmVhbSA8PCBmb3JtYXR0ZXIuVmFsdWU7CisgICAgc3RyZWFtIDw8IHN0ZDo6ZGVjIDw8IGZvcm1hdHRlci5WYWx1ZTsKICAgfSBlbHNlIHsKICAgICBzdHJlYW0gPDwgIjB4IiA8PCBzdGQ6OmhleCA8PCBmb3JtYXR0ZXIuVmFsdWU7CiAgIH0KKyAgc3RyZWFtLmZsYWdzKGZsYWdzKTsKICAgcmV0dXJuIHN0cmVhbTsKIH0KIHN0YXRpYyBib29sIFJ1bkNvbW1hbmQoY29uc3QgY2hhciogY29tbWVudCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb21tYW5kLApkaWZmIC0tZ2l0IGEvVGVzdHMvUnVuQ01ha2UvQ1BhY2svUnVuQ01ha2VUZXN0LmNtYWtlIGIvVGVzdHMvUnVuQ01ha2UvQ1BhY2svUnVuQ01ha2VUZXN0LmNtYWtlCmluZGV4IDA0YWM1ODQuLmFhNTVjNDQgMTAwNjQ0Ci0tLSBhL1Rlc3RzL1J1bkNNYWtlL0NQYWNrL1J1bkNNYWtlVGVzdC5jbWFrZQorKysgYi9UZXN0cy9SdW5DTWFrZS9DUGFjay9SdW5DTWFrZVRlc3QuY21ha2UKQEAgLTI5LDMgKzI5LDQgQEAKIHJ1bl9jcGFja190ZXN0KFVTRVJfRklMRUxJU1QgIlJQTSIgZmFsc2UgIk1PTk9MSVRISUMiKQogcnVuX2NwYWNrX3Rlc3QoTUQ1U1VNUyAiREVCIiBmYWxzZSAiTU9OT0xJVEhJQztDT01QT05FTlQiKQogcnVuX2NwYWNrX3Rlc3QoQ1BBQ0tfSU5TVEFMTF9TQ1JJUFQgIlpJUCIgZmFsc2UgIk1PTk9MSVRISUMiKQorcnVuX2NwYWNrX3Rlc3QoREVCX1BBQ0tBR0VfVkVSU0lPTl9CQUNLX0NPTVBBVElCSUxJVFkgIkRFQiIgZmFsc2UgIk1PTk9MSVRISUM7Q09NUE9ORU5UIikKZGlmZiAtLWdpdCBhL1Rlc3RzL1J1bkNNYWtlL0NQYWNrL3Rlc3RzL0RFQl9QQUNLQUdFX1ZFUlNJT05fQkFDS19DT01QQVRJQklMSVRZL0V4cGVjdGVkRmlsZXMuY21ha2UgYi9UZXN0cy9SdW5DTWFrZS9DUGFjay90ZXN0cy9ERUJfUEFDS0FHRV9WRVJTSU9OX0JBQ0tfQ09NUEFUSUJJTElUWS9FeHBlY3RlZEZpbGVzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNDJlYjMKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0cy9SdW5DTWFrZS9DUGFjay90ZXN0cy9ERUJfUEFDS0FHRV9WRVJTSU9OX0JBQ0tfQ09NUEFUSUJJTElUWS9FeHBlY3RlZEZpbGVzLmNtYWtlCkBAIC0wLDAgKzEsMiBAQAorc2V0KEVYUEVDVEVEX0ZJTEVTX0NPVU5UICIxIikKK3NldChFWFBFQ1RFRF9GSUxFX0NPTlRFTlRfMV9MSVNUICIvdXNyOy91c3IvZm9vOy91c3IvZm9vL0NNYWtlTGlzdHMudHh0IikKZGlmZiAtLWdpdCBhL1Rlc3RzL1J1bkNNYWtlL0NQYWNrL3Rlc3RzL0RFQl9QQUNLQUdFX1ZFUlNJT05fQkFDS19DT01QQVRJQklMSVRZL1ZlcmlmeVJlc3VsdC5jbWFrZSBiL1Rlc3RzL1J1bkNNYWtlL0NQYWNrL3Rlc3RzL0RFQl9QQUNLQUdFX1ZFUlNJT05fQkFDS19DT01QQVRJQklMSVRZL1ZlcmlmeVJlc3VsdC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzFjYzEwCi0tLSAvZGV2L251bGwKKysrIGIvVGVzdHMvUnVuQ01ha2UvQ1BhY2svdGVzdHMvREVCX1BBQ0tBR0VfVkVSU0lPTl9CQUNLX0NPTVBBVElCSUxJVFkvVmVyaWZ5UmVzdWx0LmNtYWtlCkBAIC0wLDAgKzEsMTEgQEAKK2Z1bmN0aW9uKGNoZWNrUGFja2FnZUluZm9fIFRZUEUgRklMRSBSRUdFWCkKKyAgZ2V0UGFja2FnZUluZm8oIiR7RklMRX0iICJGSUxFX0lORk9fIikKKyAgaWYoTk9UIEZJTEVfSU5GT18gTUFUQ0hFUyAiJHtSRUdFWH0iKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIlVuZXhwZWN0ZWQgJHtUWVBFfSBpbiAnJHtGSUxFfScgJHtFWFBFQ1RFRF9GSUxFXzFfVkVSU0lPTn0gJHtFWFBFQ1RFRF9GSUxFXzFfUkVWSVNJT059OyBmaWxlIGluZm86ICcke0ZJTEVfSU5GT199JyIpCisgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworc2V0KHdoaXRlc3BhY2VzXyAiW1x0XG5cciBdKiIpCisKK2NoZWNrUGFja2FnZUluZm9fKCJ2ZXJzaW9uIiAiJHtGT1VORF9GSUxFXzF9IgorICAiLipWZXJzaW9uJHt3aGl0ZXNwYWNlc199OiR7d2hpdGVzcGFjZXNffTUuMC4xLTcxLWc4ODQ4NTJlIikKZGlmZiAtLWdpdCBhL1Rlc3RzL1J1bkNNYWtlL0NQYWNrL3Rlc3RzL0RFQl9QQUNLQUdFX1ZFUlNJT05fQkFDS19DT01QQVRJQklMSVRZL3Rlc3QuY21ha2UgYi9UZXN0cy9SdW5DTWFrZS9DUGFjay90ZXN0cy9ERUJfUEFDS0FHRV9WRVJTSU9OX0JBQ0tfQ09NUEFUSUJJTElUWS90ZXN0LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwM2U2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0cy9SdW5DTWFrZS9DUGFjay90ZXN0cy9ERUJfUEFDS0FHRV9WRVJTSU9OX0JBQ0tfQ09NUEFUSUJJTElUWS90ZXN0LmNtYWtlCkBAIC0wLDAgKzEsNyBAQAoraW5zdGFsbChGSUxFUyBDTWFrZUxpc3RzLnR4dCBERVNUSU5BVElPTiBmb28gQ09NUE9ORU5UIHRlc3QpCisKK3NldChDUEFDS19ERUJJQU5fUEFDS0FHRV9WRVJTSU9OICI1LjAuMS03MS1nODg0ODUyZSIpCisKK2lmKFBBQ0tBR0lOR19UWVBFIFNUUkVRVUFMICJDT01QT05FTlQiKQorICBzZXQoQ1BBQ0tfQ09NUE9ORU5UU19BTEwgdGVzdCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL1Rlc3RzL1J1bkNNYWtlL1hjb2RlUHJvamVjdC9SdW5DTWFrZVRlc3QuY21ha2UgYi9UZXN0cy9SdW5DTWFrZS9YY29kZVByb2plY3QvUnVuQ01ha2VUZXN0LmNtYWtlCmluZGV4IDU1NGFhMmYuLjdkNDM2YjYgMTAwNjQ0Ci0tLSBhL1Rlc3RzL1J1bkNNYWtlL1hjb2RlUHJvamVjdC9SdW5DTWFrZVRlc3QuY21ha2UKKysrIGIvVGVzdHMvUnVuQ01ha2UvWGNvZGVQcm9qZWN0L1J1bkNNYWtlVGVzdC5jbWFrZQpAQCAtMSw1ICsxLDkgQEAKIGluY2x1ZGUoUnVuQ01ha2UpCiAKK2lmKFhDT0RFX1ZFUlNJT04gVkVSU0lPTl9HUkVBVEVSX0VRVUFMIDkpCisgIHNldChJT1NfREVQTE9ZTUVOVF9UQVJHRVQgIi1EQ01BS0VfWENPREVfQVRUUklCVVRFX0lQSE9ORU9TX0RFUExPWU1FTlRfVEFSR0VUPTEwIikKK2VuZGlmKCkKKwogcnVuX2NtYWtlKFhjb2RlRmlsZVR5cGUpCiBydW5fY21ha2UoWGNvZGVBdHRyaWJ1dGVMb2NhdGlvbikKIHJ1bl9jbWFrZShYY29kZUF0dHJpYnV0ZUdlbmV4KQpAQCAtMjAsNyArMjQsOSBAQAogaWYoTk9UIFhDT0RFX1ZFUlNJT04gVkVSU0lPTl9MRVNTIDUpCiAgIHNldChSdW5DTWFrZV9URVNUX0JJTkFSWV9ESVIgJHtSdW5DTWFrZV9CSU5BUllfRElSfS9YY29kZUluc3RhbGxJT1MtYnVpbGQpCiAgIHNldChSdW5DTWFrZV9URVNUX05PX0NMRUFOIDEpCi0gIHNldChSdW5DTWFrZV9URVNUX09QVElPTlMgIi1EQ01BS0VfSU5TVEFMTF9QUkVGSVg6UEFUSD0ke1J1bkNNYWtlX0JJTkFSWV9ESVJ9L2lvc19pbnN0YWxsIikKKyAgc2V0KFJ1bkNNYWtlX1RFU1RfT1BUSU9OUworICAgICItRENNQUtFX0lOU1RBTExfUFJFRklYOlBBVEg9JHtSdW5DTWFrZV9CSU5BUllfRElSfS9pb3NfaW5zdGFsbCIKKyAgICAiJHtJT1NfREVQTE9ZTUVOVF9UQVJHRVR9IikKIAogICBmaWxlKFJFTU9WRV9SRUNVUlNFICIke1J1bkNNYWtlX1RFU1RfQklOQVJZX0RJUn0iKQogICBmaWxlKE1BS0VfRElSRUNUT1JZICIke1J1bkNNYWtlX1RFU1RfQklOQVJZX0RJUn0iKQpAQCAtNTMsNyArNTksOCBAQAogICBzZXQoUnVuQ01ha2VfVEVTVF9OT19DTEVBTiAxKQogICBzZXQoUnVuQ01ha2VfVEVTVF9PUFRJT05TCiAgICAgIi1EVEVTVF9JT1M9T04iCi0gICAgIi1EQ01BS0VfSU5TVEFMTF9QUkVGSVg6UEFUSD0ke1J1bkNNYWtlX1RFU1RfQklOQVJZX0RJUn0vX2luc3RhbGwiKQorICAgICItRENNQUtFX0lOU1RBTExfUFJFRklYOlBBVEg9JHtSdW5DTWFrZV9URVNUX0JJTkFSWV9ESVJ9L19pbnN0YWxsIgorICAgICIke0lPU19ERVBMT1lNRU5UX1RBUkdFVH0iKQogCiAgIGZpbGUoUkVNT1ZFX1JFQ1VSU0UgIiR7UnVuQ01ha2VfVEVTVF9CSU5BUllfRElSfSIpCiAgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgIiR7UnVuQ01ha2VfVEVTVF9CSU5BUllfRElSfSIpCkBAIC0xMTcsNyArMTI0LDggQEAKICAgc2V0KFJ1bkNNYWtlX1RFU1RfTk9fQ0xFQU4gMSkKICAgc2V0KFJ1bkNNYWtlX1RFU1RfT1BUSU9OUwogICAgICItRENNQUtFX0lOU1RBTExfUFJFRklYOlBBVEg9JHtSdW5DTWFrZV9URVNUX0JJTkFSWV9ESVJ9L19pbnN0YWxsIgotICAgICItRENNQUtFX0lPU19JTlNUQUxMX0NPTUJJTkVEPVlFUyIpCisgICAgIi1EQ01BS0VfSU9TX0lOU1RBTExfQ09NQklORUQ9WUVTIgorICAgICIke0lPU19ERVBMT1lNRU5UX1RBUkdFVH0iKQogCiAgIGZpbGUoUkVNT1ZFX1JFQ1VSU0UgIiR7UnVuQ01ha2VfVEVTVF9CSU5BUllfRElSfSIpCiAgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgIiR7UnVuQ01ha2VfVEVTVF9CSU5BUllfRElSfSIpCkBAIC0xMjksMTUgKzEzNywxNCBAQAogICB1bnNldChSdW5DTWFrZV9URVNUX0JJTkFSWV9ESVIpCiAgIHVuc2V0KFJ1bkNNYWtlX1RFU1RfTk9fQ0xFQU4pCiAgIHVuc2V0KFJ1bkNNYWtlX1RFU1RfT1BUSU9OUykKLWVuZGlmKCkKIAotaWYoWENPREVfVkVSU0lPTiBWRVJTSU9OX0dSRUFURVJfRVFVQUwgNiBBTkQgWENPREVfVkVSU0lPTiBWRVJTSU9OX0xFU1MgOSkKICAgIyBYY29kZUlPU0luc3RhbGxDb21iaW5lZFBydW5lCiAgIHNldChSdW5DTWFrZV9URVNUX0JJTkFSWV9ESVIgJHtSdW5DTWFrZV9CSU5BUllfRElSfS9YY29kZUlPU0luc3RhbGxDb21iaW5lZFBydW5lLWJ1aWxkKQogICBzZXQoUnVuQ01ha2VfVEVTVF9OT19DTEVBTiAxKQogICBzZXQoUnVuQ01ha2VfVEVTVF9PUFRJT05TCiAgICAgIi1EQ01BS0VfSU5TVEFMTF9QUkVGSVg6UEFUSD0ke1J1bkNNYWtlX1RFU1RfQklOQVJZX0RJUn0vX2luc3RhbGwiCi0gICAgIi1EQ01BS0VfSU9TX0lOU1RBTExfQ09NQklORUQ9WUVTIikKKyAgICAiLURDTUFLRV9JT1NfSU5TVEFMTF9DT01CSU5FRD1ZRVMiCisgICAgIiR7SU9TX0RFUExPWU1FTlRfVEFSR0VUfSIpCiAKICAgZmlsZShSRU1PVkVfUkVDVVJTRSAiJHtSdW5DTWFrZV9URVNUX0JJTkFSWV9ESVJ9IikKICAgZmlsZShNQUtFX0RJUkVDVE9SWSAiJHtSdW5DTWFrZV9URVNUX0JJTkFSWV9ESVJ9IikKQEAgLTE1NSw3ICsxNjIsOCBAQAogICBzZXQoUnVuQ01ha2VfVEVTVF9OT19DTEVBTiAxKQogICBzZXQoUnVuQ01ha2VfVEVTVF9PUFRJT05TCiAgICAgIi1EQ01BS0VfSU5TVEFMTF9QUkVGSVg6UEFUSD0ke1J1bkNNYWtlX1RFU1RfQklOQVJZX0RJUn0vX2luc3RhbGwiCi0gICAgIi1EQ01BS0VfSU9TX0lOU1RBTExfQ09NQklORUQ9WUVTIikKKyAgICAiLURDTUFLRV9JT1NfSU5TVEFMTF9DT01CSU5FRD1ZRVMiCisgICAgIiR7SU9TX0RFUExPWU1FTlRfVEFSR0VUfSIpCiAKICAgZmlsZShSRU1PVkVfUkVDVVJTRSAiJHtSdW5DTWFrZV9URVNUX0JJTkFSWV9ESVJ9IikKICAgZmlsZShNQUtFX0RJUkVDVE9SWSAiJHtSdW5DTWFrZV9URVNUX0JJTkFSWV9ESVJ9IikKQEAgLTE3Miw2ICsxODAsNyBAQAogaWYoTk9UIFhDT0RFX1ZFUlNJT04gVkVSU0lPTl9MRVNTIDUpCiAgIHNldChSdW5DTWFrZV9URVNUX0JJTkFSWV9ESVIgJHtSdW5DTWFrZV9CSU5BUllfRElSfS9YY29kZU11bHRpcGxhdGZvcm0tYnVpbGQpCiAgIHNldChSdW5DTWFrZV9URVNUX05PX0NMRUFOIDEpCisgIHNldChSdW5DTWFrZV9URVNUX09QVElPTlMgIiR7SU9TX0RFUExPWU1FTlRfVEFSR0VUfSIpCiAKICAgZmlsZShSRU1PVkVfUkVDVVJTRSAiJHtSdW5DTWFrZV9URVNUX0JJTkFSWV9ESVJ9IikKICAgZmlsZShNQUtFX0RJUkVDVE9SWSAiJHtSdW5DTWFrZV9URVNUX0JJTkFSWV9ESVJ9IikKZGlmZiAtLWdpdCBhL1Rlc3RzL1J1bkNNYWtlL1hjb2RlUHJvamVjdC9YY29kZUJ1bmRsZXMuY21ha2UgYi9UZXN0cy9SdW5DTWFrZS9YY29kZVByb2plY3QvWGNvZGVCdW5kbGVzLmNtYWtlCmluZGV4IGNlZTcxZmEuLjBiODU0ZDggMTAwNjQ0Ci0tLSBhL1Rlc3RzL1J1bkNNYWtlL1hjb2RlUHJvamVjdC9YY29kZUJ1bmRsZXMuY21ha2UKKysrIGIvVGVzdHMvUnVuQ01ha2UvWGNvZGVQcm9qZWN0L1hjb2RlQnVuZGxlcy5jbWFrZQpAQCAtNSwxMSArNSw3IEBACiAKIGlmKFRFU1RfSU9TKQogICBzZXQoQ01BS0VfT1NYX1NZU1JPT1QgaXBob25lb3MpCi0gIGlmKFhDT0RFX1ZFUlNJT04gVkVSU0lPTl9HUkVBVEVSX0VRVUFMIDkpCi0gICAgc2V0KENNQUtFX09TWF9BUkNISVRFQ1RVUkVTICJhcm02NCIpCi0gIGVsc2UoKQotICAgIHNldChDTUFLRV9PU1hfQVJDSElURUNUVVJFUyAiYXJtdjciKQotICBlbmRpZigpCisgIHNldChDTUFLRV9PU1hfQVJDSElURUNUVVJFUyAiYXJtdjciKQogICBzZXQoQ01BS0VfWENPREVfQVRUUklCVVRFX0NPREVfU0lHTklOR19SRVFVSVJFRCAiTk8iKQogICBzZXQoQ01BS0VfWENPREVfQVRUUklCVVRFX0VOQUJMRV9CSVRDT0RFICJOTyIpCiBlbmRpZihURVNUX0lPUykKZGlmZiAtLWdpdCBhL1Rlc3RzL1J1bkNNYWtlL1hjb2RlUHJvamVjdC9YY29kZUlPU0luc3RhbGxDb21iaW5lZC1pbnN0YWxsLWNoZWNrLmNtYWtlIGIvVGVzdHMvUnVuQ01ha2UvWGNvZGVQcm9qZWN0L1hjb2RlSU9TSW5zdGFsbENvbWJpbmVkLWluc3RhbGwtY2hlY2suY21ha2UKaW5kZXggY2Q3MTIwNS4uYTFjMDY3MSAxMDA2NDQKLS0tIGEvVGVzdHMvUnVuQ01ha2UvWGNvZGVQcm9qZWN0L1hjb2RlSU9TSW5zdGFsbENvbWJpbmVkLWluc3RhbGwtY2hlY2suY21ha2UKKysrIGIvVGVzdHMvUnVuQ01ha2UvWGNvZGVQcm9qZWN0L1hjb2RlSU9TSW5zdGFsbENvbWJpbmVkLWluc3RhbGwtY2hlY2suY21ha2UKQEAgLTEzLDExICsxMyw3IEBACiAgIHN0cmluZyhSRVBMQUNFICJhcmNoaXRlY3R1cmUgIiAiIiBhY3R1YWwgIiR7YXJjaGl0ZWN0dXJlc30iKQogICBsaXN0KFNPUlQgYWN0dWFsKQogCi0gIGlmKFhDT0RFX1ZFUlNJT04gVkVSU0lPTl9HUkVBVEVSX0VRVUFMIDkpCi0gICAgc2V0KGV4cGVjdGVkIGFybTY0IHg4Nl82NCkKLSAgZWxzZSgpCi0gICAgc2V0KGV4cGVjdGVkIGFybTY0IGFybXY3IGkzODYgeDg2XzY0KQotICBlbmRpZigpCisgIHNldChleHBlY3RlZCBhcm02NCBhcm12NyBpMzg2IHg4Nl82NCkKIAogICBpZihOT1QgYWN0dWFsIFNUUkVRVUFMIGV4cGVjdGVkKQogICAgIG1lc3NhZ2UoU0VORF9FUlJPUgpkaWZmIC0tZ2l0IGEvVGVzdHMvUnVuQ01ha2UvWGNvZGVQcm9qZWN0L1hjb2RlSU9TSW5zdGFsbENvbWJpbmVkLmNtYWtlIGIvVGVzdHMvUnVuQ01ha2UvWGNvZGVQcm9qZWN0L1hjb2RlSU9TSW5zdGFsbENvbWJpbmVkLmNtYWtlCmluZGV4IDZhYmJhNDkuLmZjODMwYjEgMTAwNjQ0Ci0tLSBhL1Rlc3RzL1J1bkNNYWtlL1hjb2RlUHJvamVjdC9YY29kZUlPU0luc3RhbGxDb21iaW5lZC5jbWFrZQorKysgYi9UZXN0cy9SdW5DTWFrZS9YY29kZVByb2plY3QvWGNvZGVJT1NJbnN0YWxsQ29tYmluZWQuY21ha2UKQEAgLTcsMTEgKzcsNyBAQAogc2V0KENNQUtFX1hDT0RFX0FUVFJJQlVURV9ERUJVR19JTkZPUk1BVElPTl9GT1JNQVQgImR3YXJmIikKIHNldChDTUFLRV9YQ09ERV9BVFRSSUJVVEVfRU5BQkxFX0JJVENPREUgIk5PIikKIAotaWYoWENPREVfVkVSU0lPTiBWRVJTSU9OX0dSRUFURVJfRVFVQUwgOSkKLSAgICBzZXQoQ01BS0VfT1NYX0FSQ0hJVEVDVFVSRVMgImFybTY0O3g4Nl82NCIpCi1lbHNlKCkKLSAgICBzZXQoQ01BS0VfT1NYX0FSQ0hJVEVDVFVSRVMgImFybXY3O2FybTY0O2kzODY7eDg2XzY0IikKLWVuZGlmKCkKK3NldChDTUFLRV9PU1hfQVJDSElURUNUVVJFUyAiYXJtdjc7YXJtNjQ7aTM4Njt4ODZfNjQiKQogCiBhZGRfZXhlY3V0YWJsZShmb29fYXBwIE1BQ09TWF9CVU5ETEUgbWFpbi5jcHApCiBpbnN0YWxsKFRBUkdFVFMgZm9vX2FwcCBCVU5ETEUgREVTVElOQVRJT04gYmluKQpkaWZmIC0tZ2l0IGEvVGVzdHMvUnVuQ01ha2UvWGNvZGVQcm9qZWN0L1hjb2RlSW5zdGFsbElPUy5jbWFrZSBiL1Rlc3RzL1J1bkNNYWtlL1hjb2RlUHJvamVjdC9YY29kZUluc3RhbGxJT1MuY21ha2UKaW5kZXggZjYyOWYyZS4uYTc5NzQxMCAxMDA2NDQKLS0tIGEvVGVzdHMvUnVuQ01ha2UvWGNvZGVQcm9qZWN0L1hjb2RlSW5zdGFsbElPUy5jbWFrZQorKysgYi9UZXN0cy9SdW5DTWFrZS9YY29kZVByb2plY3QvWGNvZGVJbnN0YWxsSU9TLmNtYWtlCkBAIC02LDExICs2LDcgQEAKIHNldChYQ09ERV9BVFRSSUJVVEVfQ09ERV9TSUdOSU5HX1JFUVVJUkVEICJOTyIpCiBzZXQoQ01BS0VfWENPREVfQVRUUklCVVRFX0VOQUJMRV9CSVRDT0RFICJOTyIpCiAKLWlmKFhDT0RFX1ZFUlNJT04gVkVSU0lPTl9HUkVBVEVSX0VRVUFMIDkpCi0gIHNldChDTUFLRV9PU1hfQVJDSElURUNUVVJFUyAiYXJtNjQ7eDg2XzY0IikKLWVsc2UoKQotICBzZXQoQ01BS0VfT1NYX0FSQ0hJVEVDVFVSRVMgImFybXY3O2kzODYiKQotZW5kaWYoKQorc2V0KENNQUtFX09TWF9BUkNISVRFQ1RVUkVTICJhcm12NztpMzg2IikKIAogYWRkX2xpYnJhcnkoZm9vIFNUQVRJQyBmb28uY3BwKQogaW5zdGFsbChUQVJHRVRTIGZvbyBBUkNISVZFIERFU1RJTkFUSU9OIGxpYikKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9SZWxlYXNlL3VwbG9hZF9yZWxlYXNlLmNtYWtlIGIvVXRpbGl0aWVzL1JlbGVhc2UvdXBsb2FkX3JlbGVhc2UuY21ha2UKaW5kZXggNWIyY2M1Ny4uM2M4Mzk1NyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL1JlbGVhc2UvdXBsb2FkX3JlbGVhc2UuY21ha2UKKysrIGIvVXRpbGl0aWVzL1JlbGVhc2UvdXBsb2FkX3JlbGVhc2UuY21ha2UKQEAgLTEsNiArMSw2IEBACiBzZXQoQ1RFU1RfUlVOX0NVUlJFTlRfU0NSSVBUIDApCiBpZihOT1QgVkVSU0lPTikKLSBzZXQoVkVSU0lPTiAzLjkpCisgc2V0KFZFUlNJT04gMy4xMCkKIGVuZGlmKCkKIGlmKE5PVCBERUZJTkVEIFBST0pFQ1RfUFJFRklYKQogICBzZXQoUFJPSkVDVF9QUkVGSVggY21ha2UtJHtWRVJTSU9OfSkKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9TY3JpcHRzL3VwZGF0ZS1jdXJsLmJhc2ggYi9VdGlsaXRpZXMvU2NyaXB0cy91cGRhdGUtY3VybC5iYXNoCmluZGV4IDQ2NTg0MWEuLmIyNDQ4MjcgMTAwNzU1Ci0tLSBhL1V0aWxpdGllcy9TY3JpcHRzL3VwZGF0ZS1jdXJsLmJhc2gKKysrIGIvVXRpbGl0aWVzL1NjcmlwdHMvdXBkYXRlLWN1cmwuYmFzaApAQCAtOCwxNCArOCwxMyBAQAogcmVhZG9ubHkgb3duZXJzaGlwPSJDdXJsIFVwc3RyZWFtIDxjdXJsLWxpYnJhcnlAY29vbC5oYXh4LnNlPiIKIHJlYWRvbmx5IHN1YnRyZWU9IlV0aWxpdGllcy9jbWN1cmwiCiByZWFkb25seSByZXBvPSJodHRwczovL2dpdGh1Yi5jb20vY3VybC9jdXJsLmdpdCIKLXJlYWRvbmx5IHRhZz0iY3VybC03XzU0XzEiCityZWFkb25seSB0YWc9ImN1cmwtN181Nl8wIgogcmVhZG9ubHkgc2hvcnRsb2c9ZmFsc2UKIHJlYWRvbmx5IHBhdGhzPSIKICAgQ01ha2UvKgogICBDTWFrZUxpc3RzLnR4dAogICBDT1BZSU5HCiAgIGluY2x1ZGUvY3VybC8qLmgKLSAgaW5jbHVkZS9jdXJsL2N1cmxidWlsZC5oLmNtYWtlCiAgIGxpYi8qLmMKICAgbGliLyouaAogICBsaWIvQ01ha2VMaXN0cy50eHQKQEAgLTMyLDYgKzMxLDE1IEBACiAgICAgZ2l0X2FyY2hpdmUKICAgICBwdXNoZCAiJHtleHRyYWN0ZGlyfS8ke25hbWV9LXJlZHVjZWQiCiAgICAgcm0gbGliL2NvbmZpZy0qLmgKKyAgICBjaG1vZCBhLXggbGliL2Nvbm5lY3QuYworICAgIGZvciBmIGluIFwKKyAgICAgIGxpYi9jb29raWUuYyBcCisgICAgICBsaWIva3JiNS5jIFwKKyAgICAgIGxpYi9zZWN1cml0eS5jIFwKKyAgICAgIDsgZG8KKyAgICAgICAgaWNvbnYgLWYgTEFUSU4xIC10IFVURjggJGYgLW8gJGYudXRmLTgKKyAgICAgICAgbXYgJGYudXRmLTggJGYKKyAgICBkb25lCiAgICAgZWNobyAiKiAtd2hpdGVzcGFjZSIgPiAuZ2l0YXR0cmlidXRlcwogICAgIHBvcGQKIH0KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvQ01ha2UvTWFjcm9zLmNtYWtlIGIvVXRpbGl0aWVzL2NtY3VybC9DTWFrZS9NYWNyb3MuY21ha2UKaW5kZXggZGFiMDA1Zi4uODJhYWRjYSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9DTWFrZS9NYWNyb3MuY21ha2UKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9DTWFrZS9NYWNyb3MuY21ha2UKQEAgLTkzLDMgKzkzLDMyIEBACiAgICAgZW5kaWYoJHtDVVJMX1RFU1R9X0NPTVBJTEUgQU5EIE5PVCAke0NVUkxfVEVTVH0pCiAgIGVuZGlmKCkKIGVuZG1hY3JvKENVUkxfSU5URVJOQUxfVEVTVF9SVU4pCisKK21hY3JvKENVUkxfTlJPRkZfQ0hFQ0spCisgIGZpbmRfcHJvZ3JhbShOUk9GRiBOQU1FUyBnbnJvZmYgbnJvZmYpCisgIGlmKE5ST0ZGKQorICAgICMgTmVlZCBhIHdheSB0byB3cml0ZSB0byBzdGRpbiwgdGhpcyB3aWxsIGRvCisgICAgZmlsZShXUklURSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L25yb2ZmLWlucHV0LnR4dCIgInRlc3QiKQorICAgICMgVGVzdHMgZm9yIGEgdmFsaWQgbnJvZmYgb3B0aW9uIHRvIGdlbmVyYXRlIGEgbWFucGFnZQorICAgIGZvcmVhY2goX01BTk9QVCAiLW1hbiIgIi1tYW5kb2MiKQorICAgICAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgIiR7TlJPRkZ9IiAke19NQU5PUFR9CisgICAgICAgIE9VVFBVVF9WQVJJQUJMRSBOUk9GRl9NQU5PUFRfT1VUUFVUCisgICAgICAgIElOUFVUX0ZJTEUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9ucm9mZi1pbnB1dC50eHQiCisgICAgICAgIEVSUk9SX1FVSUVUKQorICAgICAgIyBTYXZlIHRoZSBvcHRpb24gaWYgaXQgd2FzIHZhbGlkCisgICAgICBpZihOUk9GRl9NQU5PUFRfT1VUUFVUKQorICAgICAgICBtZXNzYWdlKCJGb3VuZCAqbnJvZmYgb3B0aW9uOiAtLSAke19NQU5PUFR9IikKKyAgICAgICAgc2V0KE5ST0ZGX01BTk9QVCAke19NQU5PUFR9KQorICAgICAgICBzZXQoTlJPRkZfVVNFRlVMIE9OKQorICAgICAgICBicmVhaygpCisgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCisgICAgIyBObyBuZWVkIGZvciB0aGUgdGVtcG9yYXJ5IGZpbGUKKyAgICBmaWxlKFJFTU9WRSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L25yb2ZmLWlucHV0LnR4dCIpCisgICAgaWYoTk9UIE5ST0ZGX1VTRUZVTCkKKyAgICAgIG1lc3NhZ2UoV0FSTklORyAiRm91bmQgbm8gKm5yb2ZmIG9wdGlvbiB0byBnZXQgcGxhaW50ZXh0IGZyb20gbWFuIHBhZ2VzIikKKyAgICBlbmRpZigpCisgIGVsc2UoKQorICAgIG1lc3NhZ2UoV0FSTklORyAiRm91bmQgbm8gKm5yb2ZmIHByb2dyYW0iKQorICBlbmRpZigpCitlbmRtYWNybyhDVVJMX05ST0ZGX0NIRUNLKQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9DTWFrZS9PdGhlclRlc3RzLmNtYWtlIGIvVXRpbGl0aWVzL2NtY3VybC9DTWFrZS9PdGhlclRlc3RzLmNtYWtlCmluZGV4IDNiMjAzYzUuLjk4OWYwNGUgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvQ01ha2UvT3RoZXJUZXN0cy5jbWFrZQorKysgYi9VdGlsaXRpZXMvY21jdXJsL0NNYWtlL090aGVyVGVzdHMuY21ha2UKQEAgLTMyLDkgKzMyLDkgQEAKIGlmKGN1cmxfY3ZfcmVjdikKICAgaWYoTk9UIERFRklORUQgY3VybF9jdl9mdW5jX3JlY3ZfYXJncyBPUiAiJHtjdXJsX2N2X2Z1bmNfcmVjdl9hcmdzfSIgU1RSRVFVQUwgInVua25vd24iKQogICAgIGZvcmVhY2gocmVjdl9yZXR2ICJpbnQiICJzc2l6ZV90IiApCi0gICAgICBmb3JlYWNoKHJlY3ZfYXJnMSAiaW50IiAic3NpemVfdCIgIlNPQ0tFVCIpCi0gICAgICAgIGZvcmVhY2gocmVjdl9hcmcyICJ2b2lkICoiICJjaGFyICoiKQotICAgICAgICAgIGZvcmVhY2gocmVjdl9hcmczICJzaXplX3QiICJpbnQiICJzb2NrbGVuX3QiICJ1bnNpZ25lZCBpbnQiKQorICAgICAgZm9yZWFjaChyZWN2X2FyZzEgIlNPQ0tFVCIgImludCIgKQorICAgICAgICBmb3JlYWNoKHJlY3ZfYXJnMiAiY2hhciAqIiAidm9pZCAqIiApCisgICAgICAgICAgZm9yZWFjaChyZWN2X2FyZzMgImludCIgInNpemVfdCIgInNvY2tsZW5fdCIgInVuc2lnbmVkIGludCIpCiAgICAgICAgICAgICBmb3JlYWNoKHJlY3ZfYXJnNCAiaW50IiAidW5zaWduZWQgaW50IikKICAgICAgICAgICAgICAgaWYoTk9UIGN1cmxfY3ZfZnVuY19yZWN2X2RvbmUpCiAgICAgICAgICAgICAgICAgdW5zZXQoY3VybF9jdl9mdW5jX3JlY3ZfdGVzdCBDQUNIRSkKQEAgLTk2LDkgKzk2LDkgQEAKIGlmKGN1cmxfY3Zfc2VuZCkKICAgaWYoTk9UIERFRklORUQgY3VybF9jdl9mdW5jX3NlbmRfYXJncyBPUiAiJHtjdXJsX2N2X2Z1bmNfc2VuZF9hcmdzfSIgU1RSRVFVQUwgInVua25vd24iKQogICAgIGZvcmVhY2goc2VuZF9yZXR2ICJpbnQiICJzc2l6ZV90IiApCi0gICAgICBmb3JlYWNoKHNlbmRfYXJnMSAiaW50IiAic3NpemVfdCIgIlNPQ0tFVCIpCi0gICAgICAgIGZvcmVhY2goc2VuZF9hcmcyICJjb25zdCB2b2lkICoiICJ2b2lkICoiICJjaGFyICoiICJjb25zdCBjaGFyICoiKQotICAgICAgICAgIGZvcmVhY2goc2VuZF9hcmczICJzaXplX3QiICJpbnQiICJzb2NrbGVuX3QiICJ1bnNpZ25lZCBpbnQiKQorICAgICAgZm9yZWFjaChzZW5kX2FyZzEgIlNPQ0tFVCIgImludCIgInNzaXplX3QiICkKKyAgICAgICAgZm9yZWFjaChzZW5kX2FyZzIgImNvbnN0IGNoYXIgKiIgImNvbnN0IHZvaWQgKiIgInZvaWQgKiIgImNoYXIgKiIpCisgICAgICAgICAgZm9yZWFjaChzZW5kX2FyZzMgImludCIgInNpemVfdCIgInNvY2tsZW5fdCIgInVuc2lnbmVkIGludCIpCiAgICAgICAgICAgICBmb3JlYWNoKHNlbmRfYXJnNCAiaW50IiAidW5zaWduZWQgaW50IikKICAgICAgICAgICAgICAgaWYoTk9UIGN1cmxfY3ZfZnVuY19zZW5kX2RvbmUpCiAgICAgICAgICAgICAgICAgdW5zZXQoY3VybF9jdl9mdW5jX3NlbmRfdGVzdCBDQUNIRSkKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvQ01ha2UvY21ha2VfdW5pbnN0YWxsLmNtYWtlLmluIGIvVXRpbGl0aWVzL2NtY3VybC9DTWFrZS9jbWFrZV91bmluc3RhbGwuY21ha2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwYTUxNgotLS0gL2Rldi9udWxsCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvQ01ha2UvY21ha2VfdW5pbnN0YWxsLmNtYWtlLmluCkBAIC0wLDAgKzEsMjYgQEAKK2lmKE5PVCBFWElTVFMgIkBDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJAL2luc3RhbGxfbWFuaWZlc3QudHh0IikKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAiQ2Fubm90IGZpbmQgaW5zdGFsbCBtYW5pZmVzdDogQENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUkAvaW5zdGFsbF9tYW5pZmVzdC50eHQiKQorZW5kaWYoTk9UIEVYSVNUUyAiQENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUkAvaW5zdGFsbF9tYW5pZmVzdC50eHQiKQorCitpZiAoTk9UIERFRklORUQgQ01BS0VfSU5TVEFMTF9QUkVGSVgpCisgIHNldCAoQ01BS0VfSU5TVEFMTF9QUkVGSVggIkBDTUFLRV9JTlNUQUxMX1BSRUZJWEAiKQorZW5kaWYgKCkKKyBtZXNzYWdlKCR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9KQorCitmaWxlKFJFQUQgIkBDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJAL2luc3RhbGxfbWFuaWZlc3QudHh0IiBmaWxlcykKK3N0cmluZyhSRUdFWCBSRVBMQUNFICJcbiIgIjsiIGZpbGVzICIke2ZpbGVzfSIpCitmb3JlYWNoKGZpbGUgJHtmaWxlc30pCisgIG1lc3NhZ2UoU1RBVFVTICJVbmluc3RhbGxpbmcgJEVOVntERVNURElSfSR7ZmlsZX0iKQorICBpZihJU19TWU1MSU5LICIkRU5We0RFU1RESVJ9JHtmaWxlfSIgT1IgRVhJU1RTICIkRU5We0RFU1RESVJ9JHtmaWxlfSIpCisgICAgZXhlY19wcm9ncmFtKAorICAgICAgIkBDTUFLRV9DT01NQU5EQCIgQVJHUyAiLUUgcmVtb3ZlIFwiJEVOVntERVNURElSfSR7ZmlsZX1cIiIKKyAgICAgIE9VVFBVVF9WQVJJQUJMRSBybV9vdXQKKyAgICAgIFJFVFVSTl9WQUxVRSBybV9yZXR2YWwKKyAgICAgICkKKyAgICBpZihOT1QgIiR7cm1fcmV0dmFsfSIgU1RSRVFVQUwgMCkKKyAgICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIlByb2JsZW0gd2hlbiByZW1vdmluZyAkRU5We0RFU1RESVJ9JHtmaWxlfSIpCisgICAgZW5kaWYoTk9UICIke3JtX3JldHZhbH0iIFNUUkVRVUFMIDApCisgIGVsc2UoSVNfU1lNTElOSyAiJEVOVntERVNURElSfSR7ZmlsZX0iIE9SIEVYSVNUUyAiJEVOVntERVNURElSfSR7ZmlsZX0iKQorICAgIG1lc3NhZ2UoU1RBVFVTICJGaWxlICRFTlZ7REVTVERJUn0ke2ZpbGV9IGRvZXMgbm90IGV4aXN0LiIpCisgIGVuZGlmKElTX1NZTUxJTksgIiRFTlZ7REVTVERJUn0ke2ZpbGV9IiBPUiBFWElTVFMgIiRFTlZ7REVTVERJUn0ke2ZpbGV9IikKK2VuZGZvcmVhY2goZmlsZSkKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvQ01ha2VMaXN0cy50eHQgYi9VdGlsaXRpZXMvY21jdXJsL0NNYWtlTGlzdHMudHh0CmluZGV4IGQ4NWYzNjYuLmE4MzFmN2YgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvQ01ha2VMaXN0cy50eHQKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9DTWFrZUxpc3RzLnR4dApAQCAtMjQsNiArMjQsNyBAQAogc2V0KENVUkxfRElTQUJMRV9WRVJCT1NFX1NUUklOR1MgT0ZGIENBQ0hFIElOVEVSTkFMICJEbyBub3QgZGlzYWJsZSBjdXJsIHZlcmJvc2l0eSIpCiBzZXQoQ1VSTF9ISURERU5fU1lNQk9MUyBPRkYgQ0FDSEUgSU5URVJOQUwgIk5vIGN1cmwgaGlkZGVuIHN5bWJvbHMiKQogc2V0KENVUkxfU1RBVElDTElCIE9OIENBQ0hFIElOVEVSTkFMICJTdGF0aWMgY3VybCIpCitzZXQoQ1VSTF9XRVJST1IgT0ZGIENBQ0hFIElOVEVSTkFMICJUdXJuIGNvbXBpbGVyIHdhcm5pbmdzIGludG8gZXJyb3JzIikKIHNldChESVNBQkxFRF9USFJFQURTQUZFIE9GRiBDQUNIRSBJTlRFUk5BTCAiQ3VybCBjYW4gdXNlIHRocmVhZC1zYWZlIGZ1bmN0aW9ucyIpCiBzZXQoRU5BQkxFX0FSRVMgT0ZGIENBQ0hFIElOVEVSTkFMICJObyBjdXJsIGMtYXJlcyBzdXBwb3J0IikKIHNldChFTkFCTEVfQ1VSTERFQlVHIE9GRiBDQUNIRSBJTlRFUk5BTCAiTm8gY3VybCBUcmFja01lbW9yeSBmZWF0dXJlcyIpCkBAIC0zMyw2ICszNCw3IEBACiBzZXQoRU5BQkxFX1RIUkVBREVEX1JFU09MVkVSIE9GRiBDQUNIRSBJTlRFUk5BTCAiTm8gY3VybCBQT1NJWCB0aHJlYWRlZCBETlMgbG9va3VwIikKIHNldChFTkFCTEVfVU5JWF9TT0NLRVRTIE9GRiBDQUNIRSBJTlRFUk5BTCAiTm8gY3VybCBVbml4IGRvbWFpbiBzb2NrZXRzIHN1cHBvcnQiKQogc2V0KEhUVFBfT05MWSBPRkYgQ0FDSEUgSU5URVJOQUwgIkN1cmwgaXMgbm90IGh0dHAtb25seSIpCitzZXQoUElDS1lfQ09NUElMRVIgT0ZGIENBQ0hFIElOVEVSTkFMICJFbmFibGUgcGlja3kgY29tcGlsZXIgb3B0aW9ucyIpCiBzZXQoVVNFX1dJTjMyX0xEQVAgT0ZGIENBQ0hFIElOVEVSTkFMICJObyBjdXJsIFdpbmRvd3MgTERBUCIpCiBpZihDTUFLRV9VU0VfT1BFTlNTTCkKIGVsc2VpZihXSU4zMikKQEAgLTg4LDcgKzkwLDcgQEAKICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAjCi0jIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisjIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAjCiAjIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAjIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTEyNiw2ICsxMjgsNyBAQAogaW5jbHVkZShVdGlsaXRpZXMpCiBpbmNsdWRlKE1hY3JvcykKIGluY2x1ZGUoQ01ha2VEZXBlbmRlbnRPcHRpb24pCitpbmNsdWRlKENoZWNrQ0NvbXBpbGVyRmxhZykKIAogcHJvamVjdCggQ1VSTCBDICkKIApAQCAtMTU5LDIwICsxNjIsMzYgQEAKIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2luY2x1ZGUvY3VybCkKIGluY2x1ZGVfZGlyZWN0b3JpZXMoICR7Q1VSTF9TT1VSQ0VfRElSfS9pbmNsdWRlICkKIAorb3B0aW9uKENVUkxfV0VSUk9SICJUdXJuIGNvbXBpbGVyIHdhcm5pbmdzIGludG8gZXJyb3JzIiBPRkYpCitvcHRpb24oUElDS1lfQ09NUElMRVIgIkVuYWJsZSBwaWNreSBjb21waWxlciBvcHRpb25zIiBPTikKIG9wdGlvbihCVUlMRF9DVVJMX0VYRSAiU2V0IHRvIE9OIHRvIGJ1aWxkIGN1cmwgZXhlY3V0YWJsZS4iIE9OKQogb3B0aW9uKENVUkxfU1RBVElDTElCICJTZXQgdG8gT04gdG8gYnVpbGQgbGliY3VybCB3aXRoIHN0YXRpYyBsaW5raW5nLiIgT0ZGKQogb3B0aW9uKEVOQUJMRV9BUkVTICJTZXQgdG8gT04gdG8gZW5hYmxlIGMtYXJlcyBzdXBwb3J0IiBPRkYpCiBpZihXSU4zMikKLSAgQ01BS0VfREVQRU5ERU5UX09QVElPTihFTkFCTEVfVEhSRUFERURfUkVTT0xWRVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRvIE9OIHRvIGVuYWJsZSB0aHJlYWRlZCBETlMgbG9va3VwIgotICAgICAgICAgICAgICAgICAgICAgICAgIE9OICJOT1QgRU5BQkxFX0FSRVMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgT0ZGKQotZWxzZSgpCi0gIG9wdGlvbihFTkFCTEVfVEhSRUFERURfUkVTT0xWRVIgIlNldCB0byBPTiB0byBlbmFibGUgUE9TSVggdGhyZWFkZWQgRE5TIGxvb2t1cCIgT0ZGKQorICBvcHRpb24oQ1VSTF9TVEFUSUNfQ1JUICJTZXQgdG8gT04gdG8gYnVpbGQgbGliY3VybCB3aXRoIHN0YXRpYyBDUlQgb24gV2luZG93cyAoL01UKS4iIE9GRikKKyAgb3B0aW9uKEVOQUJMRV9JTkVUX1BUT04gIlNldCB0byBPRkYgdG8gcHJldmVudCB1c2FnZSBvZiBpbmV0X3B0b24gd2hlbiBidWlsZGluZyBhZ2FpbnN0IG1vZGVybiBTREtzIHdoaWxlIHN0aWxsIHJlcXVpcmluZyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgV2luZG93cyB2ZXJzaW9ucywgc3VjaCBhcyBXaW5kb3dzIFhQLCBXaW5kb3dzIFNlcnZlciAyMDAzIGV0Yy4iIE9OKQogZW5kaWYoKQorCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEVOQUJMRV9USFJFQURFRF9SRVNPTFZFUiAiU2V0IHRvIE9OIHRvIGVuYWJsZSB0aHJlYWRlZCBETlMgbG9va3VwIgorICAgICAgICBPTiAiTk9UIEVOQUJMRV9BUkVTIgorICAgICAgICBPRkYpCisKIG9wdGlvbihFTkFCTEVfREVCVUcgIlNldCB0byBPTiB0byBlbmFibGUgY3VybCBkZWJ1ZyBmZWF0dXJlcyIgT0ZGKQogb3B0aW9uKEVOQUJMRV9DVVJMREVCVUcgIlNldCB0byBPTiB0byBidWlsZCB3aXRoIFRyYWNrTWVtb3J5IGZlYXR1cmUgZW5hYmxlZCIgT0ZGKQogCitpZihDTUFLRV9DT01QSUxFUl9JU19HTlVDQyBPUiBDTUFLRV9DT01QSUxFUl9JU19DTEFORykKKyAgaWYgKFBJQ0tZX0NPTVBJTEVSKQorICAgIGZvcmVhY2ggKF9DQ09QVCAtcGVkYW50aWMgLVdhbGwgLVcgLVdwb2ludGVyLWFyaXRoIC1Xd3JpdGUtc3RyaW5ncyAtV3VudXNlZCAtV3NoYWRvdyAtV2lubGluZSAtV25lc3RlZC1leHRlcm5zIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVduby1sb25nLWxvbmcgLVdmbG9hdC1lcXVhbCAtV25vLW11bHRpY2hhciAtV3NpZ24tY29tcGFyZSAtV3VuZGVmIC1Xbm8tZm9ybWF0LW5vbmxpdGVyYWwgLVdlbmRpZi1sYWJlbHMgLVdzdHJpY3QtcHJvdG90eXBlcyAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAtV3N0cmljdC1hbGlhc2luZz0zIC1XY2FzdC1hbGlnbiAtV3R5cGUtbGltaXRzIC1Xb2xkLXN0eWxlLWRlY2xhcmF0aW9uIC1XbWlzc2luZy1wYXJhbWV0ZXItdHlwZSAtV2VtcHR5LWJvZHkgLVdjbG9iYmVyZWQgLVdpZ25vcmVkLXF1YWxpZmllcnMgLVdjb252ZXJzaW9uIC1Xbm8tc2lnbi1jb252ZXJzaW9uIC1XdmxhIC1XZG91YmxlLXByb21vdGlvbiAtV25vLXN5c3RlbS1oZWFkZXJzKQorICAgICAgIyBzdXJwcmlzaW5nbHksIENIRUNLX0NfQ09NUElMRVJfRkxBRyBuZWVkcyBhIG5ldyB2YXJpYWJsZSB0byBzdG9yZSBlYWNoIG5ldworICAgICAgIyB0ZXN0IHJlc3VsdCBpbi4KKyAgICAgIENIRUNLX0NfQ09NUElMRVJfRkxBRygke19DQ09QVH0gT1BUJHtfQ0NPUFR9KQorICAgICAgaWYoT1BUJHtfQ0NPUFR9KQorICAgICAgICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAke19DQ09QVH0iKQorICAgICAgZW5kaWYoKQorICAgIGVuZGZvcmVhY2goKQorICBlbmRpZihQSUNLWV9DT01QSUxFUikKK2VuZGlmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIE9SIENNQUtFX0NPTVBJTEVSX0lTX0NMQU5HKQorCiBpZiAoRU5BQkxFX0RFQlVHKQogICAjIERFQlVHQlVJTEQgd2lsbCBiZSBkZWZpbmVkIG9ubHkgZm9yIERlYnVnIGJ1aWxkcwogICBpZihOT1QgQ01BS0VfVkVSU0lPTiBWRVJTSU9OX0xFU1MgMy4wKQpAQCAtMTg3LDEzICsyMDYsMTQgQEAKICAgc2V0X3Byb3BlcnR5KERJUkVDVE9SWSBBUFBFTkQgUFJPUEVSVFkgQ09NUElMRV9ERUZJTklUSU9OUyBDVVJMREVCVUcpCiBlbmRpZigpCiAKK2lmKDApICMgVGhpcyBjb2RlIG5vdCBuZWVkZWQgZm9yIGJ1aWxkaW5nIHdpdGhpbiBDTWFrZS4KKyMgRm9yIGRlYnVnIGxpYnMgYW5kIGV4ZXMsIGFkZCAiLWQiIHBvc3RmaXgKK3NldChDTUFLRV9ERUJVR19QT1NURklYICItZCIgQ0FDSEUgU1RSSU5HICJTZXQgZGVidWcgbGlicmFyeSBwb3N0Zml4IikKK2VuZGlmKCkKKwogIyBpbml0aWFsaXplIENVUkxfTElCUwogc2V0KENVUkxfTElCUyAiIikKIAotaWYoRU5BQkxFX1RIUkVBREVEX1JFU09MVkVSIEFORCBFTkFCTEVfQVJFUykKLSAgbWVzc2FnZShGQVRBTF9FUlJPUiAiT3B0aW9ucyBFTkFCTEVfVEhSRUFERURfUkVTT0xWRVIgYW5kIEVOQUJMRV9BUkVTIGFyZSBtdXR1YWxseSBleGNsdXNpdmUiKQotZW5kaWYoKQotCiBpZihFTkFCTEVfQVJFUykKICAgc2V0KFVTRV9BUkVTIDEpCiAgIGZpbmRfcGFja2FnZShDQVJFUyBSRVFVSVJFRCkKQEAgLTIwMSwxMSArMjIxLDYgQEAKICAgc2V0KENVUkxfTElCUyAke0NVUkxfTElCU30gJHtDQVJFU19MSUJSQVJZfSkKIGVuZGlmKCkKIAotaWYoTVNWQykKLSAgb3B0aW9uKEJVSUxEX1JFTEVBU0VfREVCVUdfRElSUyAiU2V0IE9GRiB0byBidWlsZCBlYWNoIGNvbmZpZ3VyYXRpb24gdG8gYSBzZXBhcmF0ZSBkaXJlY3RvcnkiIE9GRikKLSAgbWFya19hc19hZHZhbmNlZChCVUlMRF9SRUxFQVNFX0RFQlVHX0RJUlMpCi1lbmRpZigpCi0KIGlmKDApICMgVGhpcyBjb2RlIG5vdCBuZWVkZWQgZm9yIGJ1aWxkaW5nIHdpdGhpbiBDTWFrZS4KIGluY2x1ZGUoQ3VybFN5bWJvbEhpZGluZykKIGVuZGlmKCkKQEAgLTI2NSw4ICsyODAsNiBAQAogbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEgpCiBvcHRpb24oQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUyAidG8gZGlzYWJsZSB2ZXJib3NlIHN0cmluZ3MiIE9GRikKIG1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUykKLW9wdGlvbihESVNBQkxFRF9USFJFQURTQUZFICJTZXQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHdlIGRvbid0IHdhbnQgdG8gdXNlIHRocmVhZC1zYWZlIGZ1bmN0aW9ucyIgT0ZGKQotbWFya19hc19hZHZhbmNlZChESVNBQkxFRF9USFJFQURTQUZFKQogb3B0aW9uKEVOQUJMRV9JUFY2ICJEZWZpbmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIElQdjYgc3VwcG9ydCIgT04pCiBtYXJrX2FzX2FkdmFuY2VkKEVOQUJMRV9JUFY2KQogaWYoRU5BQkxFX0lQVjYgQU5EIE5PVCBXSU4zMikKQEAgLTI4Myw1MSArMjk2LDQ4IEBACiAgIGVuZGlmKCkKIGVuZGlmKCkKIAotb3B0aW9uKEVOQUJMRV9NQU5VQUwgInRvIHByb3ZpZGUgdGhlIGJ1aWx0LWluIG1hbnVhbCIgT04pCi11bnNldChVU0VfTUFOVUFMIENBQ0hFKSAjIFRPRE86IGNhY2hlIE5ST0ZGL05ST0ZGX01BTk9QVC9VU0VfTUFOVUFMIHZhcnM/Ci1pZihFTkFCTEVfTUFOVUFMKQotICBmaW5kX3Byb2dyYW0oTlJPRkYgTkFNRVMgZ25yb2ZmIG5yb2ZmKQotICBpZihOUk9GRikKLSAgICAjIE5lZWQgYSB3YXkgdG8gd3JpdGUgdG8gc3RkaW4sIHRoaXMgd2lsbCBkbwotICAgIGZpbGUoV1JJVEUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9ucm9mZi1pbnB1dC50eHQiICJ0ZXN0IikKLSAgICAjIFRlc3RzIGZvciBhIHZhbGlkIG5yb2ZmIG9wdGlvbiB0byBnZW5lcmF0ZSBhIG1hbnBhZ2UKLSAgICBmb3JlYWNoKF9NQU5PUFQgIi1tYW4iICItbWFuZG9jIikKLSAgICAgIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICIke05ST0ZGfSIgJHtfTUFOT1BUfQotICAgICAgICBPVVRQVVRfVkFSSUFCTEUgTlJPRkZfTUFOT1BUX09VVFBVVAotICAgICAgICBJTlBVVF9GSUxFICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbnJvZmYtaW5wdXQudHh0IgotICAgICAgICBFUlJPUl9RVUlFVCkKLSAgICAgICMgU2F2ZSB0aGUgb3B0aW9uIGlmIGl0IHdhcyB2YWxpZAotICAgICAgaWYoTlJPRkZfTUFOT1BUX09VVFBVVCkKLSAgICAgICAgbWVzc2FnZSgiRm91bmQgKm5yb2ZmIG9wdGlvbjogLS0gJHtfTUFOT1BUfSIpCi0gICAgICAgIHNldChOUk9GRl9NQU5PUFQgJHtfTUFOT1BUfSkKLSAgICAgICAgc2V0KFVTRV9NQU5VQUwgMSkKLSAgICAgICAgYnJlYWsoKQotICAgICAgZW5kaWYoKQotICAgIGVuZGZvcmVhY2goKQotICAgICMgTm8gbmVlZCBmb3IgdGhlIHRlbXBvcmFyeSBmaWxlCi0gICAgZmlsZShSRU1PVkUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9ucm9mZi1pbnB1dC50eHQiKQotICAgIGlmKE5PVCBVU0VfTUFOVUFMKQotICAgICAgbWVzc2FnZShXQVJOSU5HICJGb3VuZCBubyAqbnJvZmYgb3B0aW9uIHRvIGdldCBwbGFpbnRleHQgZnJvbSBtYW4gcGFnZXMiKQotICAgIGVuZGlmKCkKLSAgZWxzZSgpCi0gICAgbWVzc2FnZShXQVJOSU5HICJGb3VuZCBubyAqbnJvZmYgcHJvZ3JhbSIpCi0gIGVuZGlmKCkKLWVuZGlmKCkKLQogaWYoMCkgIyBUaGlzIGNvZGUgbm90IG5lZWRlZCBmb3IgYnVpbGRpbmcgd2l0aGluIENNYWtlLgorQ1VSTF9OUk9GRl9DSEVDSygpCiAjIFJlcXVpcmVkIGZvciBidWlsZGluZyBtYW51YWwsIGRvY3MsIHRlc3RzCi1maW5kX3BhY2thZ2UoUGVybCBSRVFVSVJFRCkKK2ZpbmRfcGFja2FnZShQZXJsKQorCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEVOQUJMRV9NQU5VQUwgInRvIHByb3ZpZGUgdGhlIGJ1aWx0LWluIG1hbnVhbCIKKyAgICBPTiAiTlJPRkZfVVNFRlVMO1BFUkxfRk9VTkQiCisgICAgT0ZGKQorCitpZihOT1QgUEVSTF9GT1VORCkKKyAgbWVzc2FnZShTVEFUVVMgIlBlcmwgbm90IGZvdW5kLCB0ZXN0aW5nIGRpc2FibGVkLiIpCisgIHNldChCVUlMRF9URVNUSU5HIE9GRikKK2VuZGlmKCkKK2lmKEVOQUJMRV9NQU5VQUwpCisgIHNldChVU0VfTUFOVUFMIE9OKQorZW5kaWYoKQogZW5kaWYoKQogCiAjIFdlIG5lZWQgYW5zaSBjLWZsYWdzLCBlc3BlY2lhbGx5IG9uIEhQCiBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9BTlNJX0NGTEFHU30gJHtDTUFLRV9DX0ZMQUdTfSIpCiBzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgJHtDTUFLRV9BTlNJX0NGTEFHU30pCiAKK2lmKENVUkxfU1RBVElDX0NSVCkKKyAgc2V0KENNQUtFX0NfRkxBR1NfUkVMRUFTRSAiJHtDTUFLRV9DX0ZMQUdTX1JFTEVBU0V9IC9NVCIpCisgIHNldChDTUFLRV9DX0ZMQUdTX0RFQlVHICIke0NNQUtFX0NfRkxBR1NfREVCVUd9IC9NVGQiKQorZW5kaWYoKQorCiAjIERpc2FibGUgd2FybmluZ3Mgb24gQm9ybGFuZCB0byBhdm9pZCBjaGFuZ2luZyAzcmQgcGFydHkgY29kZS4KIGlmKEJPUkxBTkQpCiAgIHNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IC13LSIpCiBlbmRpZihCT1JMQU5EKQogCitpZihDVVJMX1dFUlJPUikKKyAgaWYoTVNWQ19WRVJTSU9OKQorICAgIHNldChDTUFLRV9DX0ZMQUdTX1JFTEVBU0UgIiR7Q01BS0VfQ19GTEFHU19SRUxFQVNFfSAvV1giKQorICAgIHNldChDTUFLRV9DX0ZMQUdTX0RFQlVHICIke0NNQUtFX0NfRkxBR1NfREVCVUd9IC9XWCIpCisgIGVsc2UoKQorICAgICMgdGhpcyBhc3N1bWVzIGNsYW5nIG9yIGdjYyBzdHlsZSBvcHRpb25zCisgICAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gLVdlcnJvciIpCisgIGVuZGlmKCkKK2VuZGlmKENVUkxfV0VSUk9SKQorCiAjIElmIHdlIGFyZSBvbiBBSVgsIGRvIHRoZSBfQUxMX1NPVVJDRSBtYWdpYwogaWYoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyBBSVgpCiAgIHNldChfQUxMX1NPVVJDRSAxKQpAQCAtMzQ5LDE5ICszNTksMTQgQEAKIGVuZGlmKFdJTjMyKQogCiBpZihFTkFCTEVfVEhSRUFERURfUkVTT0xWRVIpCisgIGZpbmRfcGFja2FnZShUaHJlYWRzIFJFUVVJUkVEKQogICBpZihXSU4zMikKICAgICBzZXQoVVNFX1RIUkVBRFNfV0lOMzIgT04pCiAgIGVsc2UoKQotICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInB0aHJlYWQuaCIgSEFWRV9QVEhSRUFEX0gpCi0gICAgaWYoSEFWRV9QVEhSRUFEX0gpCi0gICAgICBzZXQoQ01BS0VfVEhSRUFEX1BSRUZFUl9QVEhSRUFEIDEpCi0gICAgICBmaW5kX3BhY2thZ2UoVGhyZWFkcykKLSAgICAgIGlmKENNQUtFX1VTRV9QVEhSRUFEU19JTklUKQotICAgICAgICBzZXQoQ1VSTF9MSUJTICR7Q1VSTF9MSUJTfSAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9KQotICAgICAgICBzZXQoVVNFX1RIUkVBRFNfUE9TSVggMSkKLSAgICAgIGVuZGlmKCkKLSAgICBlbmRpZigpCisgICAgc2V0KFVTRV9USFJFQURTX1BPU0lYICR7Q01BS0VfVVNFX1BUSFJFQURTX0lOSVR9KQorICAgIHNldChIQVZFX1BUSFJFQURfSCAke0NNQUtFX1VTRV9QVEhSRUFEU19JTklUfSkKICAgZW5kaWYoKQorICBzZXQoQ1VSTF9MSUJTICR7Q1VSTF9MSUJTfSAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9KQogZW5kaWYoKQogCiAjIENoZWNrIGZvciBhbGwgbmVlZGVkIGxpYnJhcmllcwpAQCAtOTExLDExICs5MTYsNiBAQAogY2hlY2tfdHlwZV9zaXplKCJfX2ludDY0IiAgU0laRU9GX19fSU5UNjQpCiBjaGVja190eXBlX3NpemUoInRpbWVfdCIgIFNJWkVPRl9USU1FX1QpCiAKLSMgTWFrZSBwdWJsaWMgdmVyc2lvbnMgb2Ygc29tZSB0eXBlIHNpemVzIGZvciBjdXJsYnVpbGQuaC4KLWZvcmVhY2godCBJTlQgTE9ORyBMT05HX0xPTkcgU1NJWkVfVCkKLSAgc3RyaW5nKFJFUExBQ0UgIlNJWkVPRl8iICJDVVJMX1NJWkVPRl8iIENVUkxfU0laRU9GXyR7dH1fQ09ERSAiJHtTSVpFT0ZfJHt0fV9DT0RFfSIpCi1lbmRmb3JlYWNoKCkKLQogaWYoSEFWRV9TSVpFT0ZfTE9OR19MT05HKQogICBzZXQoSEFWRV9MT05HTE9ORyAxKQogICBzZXQoSEFWRV9MTCAxKQpAQCAtMTAwMyw3ICsxMDAzLDE4IEBACiBjaGVja19zeW1ib2xfZXhpc3RzKHNldHNvY2tvcHQgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVFNPQ0tPUFQpCiAKICMgc3ltYm9sIGV4aXN0cyBpbiB3aW4zMiwgYnV0IGZ1bmN0aW9uIGRvZXMgbm90LgotY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGluZXRfcHRvbiBIQVZFX0lORVRfUFRPTikKK2lmKFdJTjMyKQorICBpZihFTkFCTEVfSU5FVF9QVE9OKQorICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhpbmV0X3B0b24gSEFWRV9JTkVUX1BUT04pCisgICAgIyBfV0lOMzJfV0lOTlRfVklTVEEgKDB4MDYwMCkKKyAgICBhZGRfZGVmaW5pdGlvbnMoLURfV0lOMzJfV0lOTlQ9MHgwNjAwKQorICBlbHNlKCkKKyAgICAjIF9XSU4zMl9XSU5OVF9XSU5YUCAoMHgwNTAxKQorICAgIGFkZF9kZWZpbml0aW9ucygtRF9XSU4zMl9XSU5OVD0weDA1MDEpCisgIGVuZGlmKCkKK2Vsc2UoKQorICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhpbmV0X3B0b24gSEFWRV9JTkVUX1BUT04pCitlbmRpZigpCiAKIGNoZWNrX3N5bWJvbF9leGlzdHMoZnNldHhhdHRyICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZTRVRYQVRUUikKIGlmKEhBVkVfRlNFVFhBVFRSKQpAQCAtMTA3NSw2ICsxMDg2LDEzIEBACiAgIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAiLURfRklMRV9PRkZTRVRfQklUUz02NCIpCiBlbmRpZihIQVZFX0ZJTEVfT0ZGU0VUX0JJVFMpCiBjaGVja190eXBlX3NpemUoIm9mZl90IiAgU0laRU9GX09GRl9UKQorCisjIGluY2x1ZGUgdGhpcyBoZWFkZXIgdG8gZ2V0IHRoZSB0eXBlCitzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgIiR7Q1VSTF9TT1VSQ0VfRElSfS9pbmNsdWRlIikKK3NldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICJjdXJsL3N5c3RlbS5oIikKK2NoZWNrX3R5cGVfc2l6ZSgiY3VybF9vZmZfdCIgIFNJWkVPRl9DVVJMX09GRl9UKQorc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgIiIpCisKIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUykKIAogZm9yZWFjaChDVVJMX1RFU1QKQEAgLTExOTAsNyArMTIwOCw3IEBACiAgIHNldChDVVJMX0hBVkVfU09DS0xFTl9UIDApCiBlbmRpZigpCiAKLSMgVE9ETyB0ZXN0IHdoaWNoIG9mIHRoZXNlIGhlYWRlcnMgYXJlIHJlcXVpcmVkIGZvciB0aGUgdHlwZWRlZnMgdXNlZCBpbiBjdXJsYnVpbGQuaAorIyBUT0RPIHRlc3Qgd2hpY2ggb2YgdGhlc2UgaGVhZGVycyBhcmUgcmVxdWlyZWQKIGlmKFdJTjMyKQogICBzZXQoQ1VSTF9QVUxMX1dTMlRDUElQX0ggJHtIQVZFX1dTMlRDUElQX0h9KQogZWxzZSgpCkBAIC0xMjA1LDExICsxMjIzLDYgQEAKIAogYWRkX2RlZmluaXRpb25zKC1ESEFWRV9DT05GSUdfSCkKIAotIyBGb3Igd2luZG93cywgZG8gbm90IGFsbG93IHRoZSBjb21waWxlciB0byB1c2UgZGVmYXVsdCB0YXJnZXQgKFZpc3RhKS4KLWlmKFdJTjMyKQotICBhZGRfZGVmaW5pdGlvbnMoLURfV0lOMzJfV0lOTlQ9MHgwNTAxKQotZW5kaWYoV0lOMzIpCi0KICMgRm9yIHdpbmRvd3MsIGFsbCBjb21waWxlcnMgdXNlZCBieSBjbWFrZSBzaG91bGQgc3VwcG9ydCBsYXJnZSBmaWxlcwogaWYoV0lOMzIpCiAgIHNldChVU0VfV0lOMzJfTEFSR0VfRklMRVMgT04pCkBAIC0xMjE3LDYgKzEyMzAsMTEgQEAKIAogaWYoTVNWQykKICAgYWRkX2RlZmluaXRpb25zKC1EX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIC1EX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURSkKKyAgaWYoQ01BS0VfQ19GTEFHUyBNQVRDSEVTICIvV1swLTRdIikKKyAgICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiL1dbMC00XSIgIi9XNCIgQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSIpCisgIGVsc2UoQ01BS0VfQ19GTEFHUyBNQVRDSEVTICIvV1swLTRdIikKKyAgICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAvVzQiKQorICBlbmRpZihDTUFLRV9DX0ZMQUdTIE1BVENIRVMgIi9XWzAtNF0iKQogZW5kaWYoTVNWQykKIAogIyBVZ2x5IChidXQgZnVuY3Rpb25hbCkgd2F5IHRvIGluY2x1ZGUgIk1ha2VmaWxlLmluYyIgYnkgdHJhbnNmb3JtaW5nIGl0ICg9IHJlZ2VuZXJhdGUgaXQpLgpAQCAtMTIzNSwxMCArMTI1MywxMiBAQAogCiBlbmRmdW5jdGlvbigpCiAKLWlmKDApICMgVGhpcyBjb2RlIG5vdCBuZWVkZWQgZm9yIGJ1aWxkaW5nIHdpdGhpbiBDTWFrZS4KLWFkZF9zdWJkaXJlY3RvcnkoZG9jcykKK2lmKFVTRV9NQU5VQUwpCisgIGFkZF9zdWJkaXJlY3RvcnkoZG9jcykKIGVuZGlmKCkKKwogYWRkX3N1YmRpcmVjdG9yeShsaWIpCisKIGlmKEJVSUxEX0NVUkxfRVhFKQogICBhZGRfc3ViZGlyZWN0b3J5KHNyYykKIGVuZGlmKCkKQEAgLTEzNTUsNyArMTM3NSw3IEBACiBzZXQoTElCQ1VSTF9MSUJTICAgICAgICAgICAgIiIpCiBzZXQobGliZGlyICAgICAgICAgICAgICAgICAgIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L2xpYiIpCiBmb3JlYWNoKF9saWIgJHtDTUFLRV9DX0lNUExJQ0lUX0xJTktfTElCUkFSSUVTfSAke0NVUkxfTElCU30pCi0gIGlmKF9saWIgTUFUQ0hFUyAiLiovLioiKQorICBpZihfbGliIE1BVENIRVMgIi4qLy4qIiBPUiBfbGliIE1BVENIRVMgIl4tIikKICAgICBzZXQoTElCQ1VSTF9MSUJTICAgICAgICAgICIke0xJQkNVUkxfTElCU30gJHtfbGlifSIpCiAgIGVsc2UoKQogICAgIHNldChMSUJDVVJMX0xJQlMgICAgICAgICAgIiR7TElCQ1VSTF9MSUJTfSAtbCR7X2xpYn0iKQpAQCAtMTM5MSwxNiArMTQxMSwxMCBAQAogICBzZXQoQ1VSTF9DT05GSUdfSEFTX0JFRU5fUlVOX0JFRk9SRSAxIENBQ0hFIElOVEVSTkFMICJGbGFnIHRvIHRyYWNrIHdoZXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSBydW5uaW5nIENNYWtlIG9yIGlmIENNYWtlIGhhcyBiZWVuIGNvbmZpZ3VyZWQgYmVmb3JlIikKIGVuZGlmKCkKIAotIyBJbnN0YWxsYXRpb24uCi0jIEZpcnN0LCBpbnN0YWxsIGdlbmVyYXRlZCBjdXJsYnVpbGQuaAotaW5zdGFsbChGSUxFUyAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2luY2x1ZGUvY3VybC9jdXJsYnVpbGQuaCIKLSAgICBERVNUSU5BVElPTiBpbmNsdWRlL2N1cmwgKQotIyBOZXh0LCBpbnN0YWxsIG90aGVyIGhlYWRlcnMgZXhjbHVkaW5nIGN1cmxidWlsZC5oCisjIGluc3RhbGwgaGVhZGVycwogaW5zdGFsbChESVJFQ1RPUlkgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pbmNsdWRlL2N1cmwiCiAgICAgREVTVElOQVRJT04gaW5jbHVkZQotICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIKLSAgICBQQVRURVJOICJjdXJsYnVpbGQuaCIgRVhDTFVERSkKLQorICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIpCiAKICMgV29ya2Fyb3VuZCBmb3IgTVNWUzEwIHRvIGF2b2lkIHRoZSBEaWFsb2cgSGVsbAogIyBGSVhNRTogVGhpcyBjb3VsZCBiZSByZW1vdmVkIHdpdGggZnV0dXJlIHZlcnNpb24gb2YgQ01ha2UuCkBAIC0xNDEwLDQgKzE0MjQsMTUgQEAKICAgICBmaWxlKEFQUEVORCAiJHtDVVJMX1NMTl9GSUxFTkFNRX0iICJcbiMgVGhpcyBzaG91bGQgYmUgcmVnZW5lcmF0ZWQhXG4iKQogICBlbmRpZigpCiBlbmRpZigpCisKK2lmKE5PVCBUQVJHRVQgdW5pbnN0YWxsKQorICBjb25maWd1cmVfZmlsZSgKKyAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9DTWFrZS9jbWFrZV91bmluc3RhbGwuY21ha2UuaW4KKyAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9DTWFrZS9jbWFrZV91bmluc3RhbGwuY21ha2UKKyAgICAgIElNTUVESUFURSBAT05MWSkKKworICBhZGRfY3VzdG9tX3RhcmdldCh1bmluc3RhbGwKKyAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtUAorICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L0NNYWtlL2NtYWtlX3VuaW5zdGFsbC5jbWFrZSkKK2VuZGlmKCkKIGVuZGlmKCkKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvaW5jbHVkZS9jdXJsL2N1cmwuaCBiL1V0aWxpdGllcy9jbWN1cmwvaW5jbHVkZS9jdXJsL2N1cmwuaAppbmRleCAzOTU1MjEyLi41YjRmZDBmIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2luY2x1ZGUvY3VybC9jdXJsLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvY3VybC5oCkBAIC0zNiw4ICszNiw2IEBACiAKICNpbmNsdWRlICJjdXJsdmVyLmgiICAgICAgICAgLyogbGliY3VybCB2ZXJzaW9uIGRlZmluZXMgICAqLwogI2luY2x1ZGUgInN5c3RlbS5oIiAgICAgICAgICAvKiBkZXRlcm1pbmUgdGhpbmdzIHJ1bi10aW1lICovCi0jaW5jbHVkZSAiY21jdXJsL2luY2x1ZGUvY3VybC9jdXJsYnVpbGQuaCIgLyogbGliY3VybCBidWlsZCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgImN1cmxydWxlcy5oIiAgICAgICAvKiBsaWJjdXJsIHJ1bGVzIGVuZm9yY2VtZW50ICovCiAKIC8qCiAgKiBEZWZpbmUgV0lOMzIgd2hlbiBidWlsZCB0YXJnZXQgaXMgV2luMzIgQVBJCkBAIC03Niw2ICs3NCw3IEBACiAjaWYgZGVmaW5lZChfQUlYKSB8fCBkZWZpbmVkKF9fTk9WRUxMX0xJQkNfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBcCiAgICAgZGVmaW5lZChfX21pbml4KSB8fCBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IGRlZmluZWQoX19JTlRFR1JJVFkpIHx8IFwKICAgICBkZWZpbmVkKEFORFJPSUQpIHx8IGRlZmluZWQoX19BTkRST0lEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pIHx8IFwKKyAgICBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IFwKICAgIChkZWZpbmVkKF9fRnJlZUJTRF92ZXJzaW9uKSAmJiAoX19GcmVlQlNEX3ZlcnNpb24gPCA4MDAwMDApKQogI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KICNlbmRpZgpAQCAtMTM0LDYgKzEzMywyNyBAQAogI2RlZmluZSBjdXJsX3NvY2tldF90eXBlZGVmCiAjZW5kaWYgLyogY3VybF9zb2NrZXRfdHlwZWRlZiAqLwogCisvKiBlbnVtIGZvciB0aGUgZGlmZmVyZW50IHN1cHBvcnRlZCBTU0wgYmFja2VuZHMgKi8KK3R5cGVkZWYgZW51bSB7CisgIENVUkxTU0xCQUNLRU5EX05PTkUgPSAwLAorICBDVVJMU1NMQkFDS0VORF9PUEVOU1NMID0gMSwKKyAgQ1VSTFNTTEJBQ0tFTkRfR05VVExTID0gMiwKKyAgQ1VSTFNTTEJBQ0tFTkRfTlNTID0gMywKKyAgQ1VSTFNTTEJBQ0tFTkRfT0JTT0xFVEU0ID0gNCwgIC8qIFdhcyBRU09TU0wuICovCisgIENVUkxTU0xCQUNLRU5EX0dTS0lUID0gNSwKKyAgQ1VSTFNTTEJBQ0tFTkRfUE9MQVJTU0wgPSA2LAorICBDVVJMU1NMQkFDS0VORF9XT0xGU1NMID0gNywKKyAgQ1VSTFNTTEJBQ0tFTkRfU0NIQU5ORUwgPSA4LAorICBDVVJMU1NMQkFDS0VORF9EQVJXSU5TU0wgPSA5LAorICBDVVJMU1NMQkFDS0VORF9BWFRMUyA9IDEwLAorICBDVVJMU1NMQkFDS0VORF9NQkVEVExTID0gMTEKK30gY3VybF9zc2xiYWNrZW5kOworCisvKiBhbGlhc2VzIGZvciBsaWJyYXJ5IGNsb25lcyBhbmQgcmVuYW1lcyAqLworI2RlZmluZSBDVVJMU1NMQkFDS0VORF9MSUJSRVNTTCBDVVJMU1NMQkFDS0VORF9PUEVOU1NMCisjZGVmaW5lIENVUkxTU0xCQUNLRU5EX0JPUklOR1NTTCBDVVJMU1NMQkFDS0VORF9PUEVOU1NMCisjZGVmaW5lIENVUkxTU0xCQUNLRU5EX0NZQVNTTCBDVVJMU1NMQkFDS0VORF9XT0xGU1NMCisKIHN0cnVjdCBjdXJsX2h0dHBwb3N0IHsKICAgc3RydWN0IGN1cmxfaHR0cHBvc3QgKm5leHQ7ICAgICAgIC8qIG5leHQgZW50cnkgaW4gdGhlIGxpc3QgKi8KICAgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYWxsb2NhdGVkIG5hbWUgKi8KQEAgLTMzNyw3ICszNTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgbml0ZW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICppbnN0cmVhbSk7CiAKLXR5cGVkZWYgZW51bSAgewordHlwZWRlZiBlbnVtIHsKICAgQ1VSTFNPQ0tUWVBFX0lQQ1hOLCAgLyogc29ja2V0IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgSVAgY29ubmVjdGlvbiAqLwogICBDVVJMU09DS1RZUEVfQUNDRVBULCAvKiBzb2NrZXQgY3JlYXRlZCBieSBhY2NlcHQoKSBjYWxsICovCiAgIENVUkxTT0NLVFlQRV9MQVNUICAgIC8qIG5ldmVyIHVzZSAqLwpAQCAtMzc5LDcgKzM5OSw3IEBACiAgIENVUkxJT0VfTEFTVCAgICAgICAgICAgLyogbmV2ZXIgdXNlICovCiB9IGN1cmxpb2VycjsKIAotdHlwZWRlZiBlbnVtICB7Cit0eXBlZGVmIGVudW0gewogICBDVVJMSU9DTURfTk9QLCAgICAgICAgIC8qIG5vIG9wZXJhdGlvbiAqLwogICBDVVJMSU9DTURfUkVTVEFSVFJFQUQsIC8qIHJlc3RhcnQgdGhlIHJlYWQgc3RyZWFtIGZyb20gc3RhcnQgKi8KICAgQ1VSTElPQ01EX0xBU1QgICAgICAgICAvKiBuZXZlciB1c2UgKi8KQEAgLTY3OSw2ICs2OTksOCBAQAogI2RlZmluZSBDVVJMQVVUSF9ORUdPVElBVEUgICAgKCgodW5zaWduZWQgbG9uZykxKTw8MikKIC8qIERlcHJlY2F0ZWQgc2luY2UgdGhlIGFkdmVudCBvZiBDVVJMQVVUSF9ORUdPVElBVEUgKi8KICNkZWZpbmUgQ1VSTEFVVEhfR1NTTkVHT1RJQVRFIENVUkxBVVRIX05FR09USUFURQorLyogVXNlZCBmb3IgQ1VSTE9QVF9TT0NLUzVfQVVUSCB0byBzdGF5IHRlcm1pbm9sb2dpY2FsbHkgY29ycmVjdCAqLworI2RlZmluZSBDVVJMQVVUSF9HU1NBUEkgQ1VSTEFVVEhfTkVHT1RJQVRFCiAjZGVmaW5lIENVUkxBVVRIX05UTE0gICAgICAgICAoKCh1bnNpZ25lZCBsb25nKTEpPDwzKQogI2RlZmluZSBDVVJMQVVUSF9ESUdFU1RfSUUgICAgKCgodW5zaWduZWQgbG9uZykxKTw8NCkKICNkZWZpbmUgQ1VSTEFVVEhfTlRMTV9XQiAgICAgICgoKHVuc2lnbmVkIGxvbmcpMSk8PDUpCkBAIC0xNzgyLDYgKzE4MDQsMTggQEAKICAgLyogU3VwcHJlc3MgcHJveHkgQ09OTkVDVCByZXNwb25zZSBoZWFkZXJzIGZyb20gdXNlciBjYWxsYmFja3MgKi8KICAgQ0lOSVQoU1VQUFJFU1NfQ09OTkVDVF9IRUFERVJTLCBMT05HLCAyNjUpLAogCisgIC8qIFRoZSByZXF1ZXN0IHRhcmdldCwgaW5zdGVhZCBvZiBleHRyYWN0ZWQgZnJvbSB0aGUgVVJMICovCisgIENJTklUKFJFUVVFU1RfVEFSR0VULCBTVFJJTkdQT0lOVCwgMjY2KSwKKworICAvKiBiaXRtYXNrIG9mIGFsbG93ZWQgYXV0aCBtZXRob2RzIGZvciBjb25uZWN0aW9ucyB0byBTT0NLUzUgcHJveGllcyAqLworICBDSU5JVChTT0NLUzVfQVVUSCwgTE9ORywgMjY3KSwKKworICAvKiBFbmFibGUvZGlzYWJsZSBTU0ggY29tcHJlc3Npb24gKi8KKyAgQ0lOSVQoU1NIX0NPTVBSRVNTSU9OLCBMT05HLCAyNjgpLAorCisgIC8qIFBvc3QgTUlNRSBkYXRhLiAqLworICBDSU5JVChNSU1FUE9TVCwgT0JKRUNUUE9JTlQsIDI2OSksCisKICAgQ1VSTE9QVF9MQVNURU5UUlkgLyogdGhlIGxhc3QgdW51c2VkICovCiB9IENVUkxvcHRpb247CiAKQEAgLTE5MjgsMTUgKzE5NjIsMTQwIEBACiAgIENVUkxfVElNRUNPTkRfTEFTVAogfSBjdXJsX1RpbWVDb25kOwogCisvKiBTcGVjaWFsIHNpemVfdCB2YWx1ZSBzaWduYWxpbmcgYSB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5nLiAqLworI2RlZmluZSBDVVJMX1pFUk9fVEVSTUlOQVRFRCAoKHNpemVfdCkgLTEpCiAKIC8qIGN1cmxfc3RyZXF1YWwoKSBhbmQgY3VybF9zdHJuZXF1YWwoKSBhcmUgc3ViamVjdCBmb3IgcmVtb3ZhbCBpbiBhIGZ1dHVyZQotICAgbGliY3VybCwgc2VlIGxpYi9SRUFETUUuY3VybHggZm9yIGRldGFpbHMKKyAgIHJlbGVhc2UgKi8KK0NVUkxfRVhURVJOIGludCBjdXJsX3N0cmVxdWFsKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CitDVVJMX0VYVEVSTiBpbnQgY3VybF9zdHJuZXF1YWwoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3Qgbik7CiAKLSAgICFjaGVja3NyYyEgZGlzYWJsZSBTUEFDRUJFRk9SRVBBUkVOIDIKLSovCi1DVVJMX0VYVEVSTiBpbnQgKGN1cmxfc3RyZXF1YWwpKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7Ci1DVVJMX0VYVEVSTiBpbnQgKGN1cmxfc3RybmVxdWFsKShjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKTsKKy8qIE1pbWUvZm9ybSBoYW5kbGluZyBzdXBwb3J0LiAqLwordHlwZWRlZiBzdHJ1Y3QgY3VybF9taW1lX3MgICAgICBjdXJsX21pbWU7ICAgICAgLyogTWltZSBjb250ZXh0LiAqLwordHlwZWRlZiBzdHJ1Y3QgY3VybF9taW1lcGFydF9zICBjdXJsX21pbWVwYXJ0OyAgLyogTWltZSBwYXJ0IGNvbnRleHQuICovCiAKKy8qCisgKiBOQU1FIGN1cmxfbWltZV9pbml0KCkKKyAqCisgKiBERVNDUklQVElPTgorICoKKyAqIENyZWF0ZSBhIG1pbWUgY29udGV4dCBhbmQgcmV0dXJuIGl0cyBoYW5kbGUuIFRoZSBlYXN5IHBhcmFtZXRlciBpcyB0aGUKKyAqIHRhcmdldCBoYW5kbGUuCisgKi8KK0NVUkxfRVhURVJOIGN1cmxfbWltZSAqY3VybF9taW1lX2luaXQoQ1VSTCAqZWFzeSk7CisKKy8qCisgKiBOQU1FIGN1cmxfbWltZV9mcmVlKCkKKyAqCisgKiBERVNDUklQVElPTgorICoKKyAqIHJlbGVhc2UgYSBtaW1lIGhhbmRsZSBhbmQgaXRzIHN1YnN0cnVjdHVyZXMuCisgKi8KK0NVUkxfRVhURVJOIHZvaWQgY3VybF9taW1lX2ZyZWUoY3VybF9taW1lICptaW1lKTsKKworLyoKKyAqIE5BTUUgY3VybF9taW1lX2FkZHBhcnQoKQorICoKKyAqIERFU0NSSVBUSU9OCisgKgorICogQXBwZW5kIGEgbmV3IGVtcHR5IHBhcnQgdG8gdGhlIGdpdmVuIG1pbWUgY29udGV4dCBhbmQgcmV0dXJuIGEgaGFuZGxlIHRvCisgKiB0aGUgY3JlYXRlZCBwYXJ0LgorICovCitDVVJMX0VYVEVSTiBjdXJsX21pbWVwYXJ0ICpjdXJsX21pbWVfYWRkcGFydChjdXJsX21pbWUgKm1pbWUpOworCisvKgorICogTkFNRSBjdXJsX21pbWVfbmFtZSgpCisgKgorICogREVTQ1JJUFRJT04KKyAqCisgKiBTZXQgbWltZS9mb3JtIHBhcnQgbmFtZS4KKyAqLworQ1VSTF9FWFRFUk4gQ1VSTGNvZGUgY3VybF9taW1lX25hbWUoY3VybF9taW1lcGFydCAqcGFydCwgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qCisgKiBOQU1FIGN1cmxfbWltZV9maWxlbmFtZSgpCisgKgorICogREVTQ1JJUFRJT04KKyAqCisgKiBTZXQgbWltZSBwYXJ0IHJlbW90ZSBmaWxlIG5hbWUuCisgKi8KK0NVUkxfRVhURVJOIENVUkxjb2RlIGN1cmxfbWltZV9maWxlbmFtZShjdXJsX21pbWVwYXJ0ICpwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKworLyoKKyAqIE5BTUUgY3VybF9taW1lX3R5cGUoKQorICoKKyAqIERFU0NSSVBUSU9OCisgKgorICogU2V0IG1pbWUgcGFydCB0eXBlLgorICovCitDVVJMX0VYVEVSTiBDVVJMY29kZSBjdXJsX21pbWVfdHlwZShjdXJsX21pbWVwYXJ0ICpwYXJ0LCBjb25zdCBjaGFyICptaW1ldHlwZSk7CisKKy8qCisgKiBOQU1FIGN1cmxfbWltZV9lbmNvZGVyKCkKKyAqCisgKiBERVNDUklQVElPTgorICoKKyAqIFNldCBtaW1lIGRhdGEgdHJhbnNmZXIgZW5jb2Rlci4KKyAqLworQ1VSTF9FWFRFUk4gQ1VSTGNvZGUgY3VybF9taW1lX2VuY29kZXIoY3VybF9taW1lcGFydCAqcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nKTsKKworLyoKKyAqIE5BTUUgY3VybF9taW1lX2RhdGEoKQorICoKKyAqIERFU0NSSVBUSU9OCisgKgorICogU2V0IG1pbWUgcGFydCBkYXRhIHNvdXJjZSBmcm9tIG1lbW9yeSBkYXRhLAorICovCitDVVJMX0VYVEVSTiBDVVJMY29kZSBjdXJsX21pbWVfZGF0YShjdXJsX21pbWVwYXJ0ICpwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGRhdGFzaXplKTsKKworLyoKKyAqIE5BTUUgY3VybF9taW1lX2ZpbGVkYXRhKCkKKyAqCisgKiBERVNDUklQVElPTgorICoKKyAqIFNldCBtaW1lIHBhcnQgZGF0YSBzb3VyY2UgZnJvbSBuYW1lZCBmaWxlLgorICovCitDVVJMX0VYVEVSTiBDVVJMY29kZSBjdXJsX21pbWVfZmlsZWRhdGEoY3VybF9taW1lcGFydCAqcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSk7CisKKy8qCisgKiBOQU1FIGN1cmxfbWltZV9kYXRhX2NiKCkKKyAqCisgKiBERVNDUklQVElPTgorICoKKyAqIFNldCBtaW1lIHBhcnQgZGF0YSBzb3VyY2UgZnJvbSBjYWxsYmFjayBmdW5jdGlvbi4KKyAqLworQ1VSTF9FWFRFUk4gQ1VSTGNvZGUgY3VybF9taW1lX2RhdGFfY2IoY3VybF9taW1lcGFydCAqcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfb2ZmX3QgZGF0YXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX3JlYWRfY2FsbGJhY2sgcmVhZGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX3NlZWtfY2FsbGJhY2sgc2Vla2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX2ZyZWVfY2FsbGJhY2sgZnJlZWZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpOworCisvKgorICogTkFNRSBjdXJsX21pbWVfc3VicGFydHMoKQorICoKKyAqIERFU0NSSVBUSU9OCisgKgorICogU2V0IG1pbWUgcGFydCBkYXRhIHNvdXJjZSBmcm9tIHN1YnBhcnRzLgorICovCitDVVJMX0VYVEVSTiBDVVJMY29kZSBjdXJsX21pbWVfc3VicGFydHMoY3VybF9taW1lcGFydCAqcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX21pbWUgKnN1YnBhcnRzKTsKKy8qCisgKiBOQU1FIGN1cmxfbWltZV9oZWFkZXJzKCkKKyAqCisgKiBERVNDUklQVElPTgorICoKKyAqIFNldCBtaW1lIHBhcnQgaGVhZGVycy4KKyAqLworQ1VSTF9FWFRFUk4gQ1VSTGNvZGUgY3VybF9taW1lX2hlYWRlcnMoY3VybF9taW1lcGFydCAqcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjdXJsX3NsaXN0ICpoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRha2Vfb3duZXJzaGlwKTsKKworLyogT2xkIGZvcm0gQVBJLiAqLwogLyogbmFtZSBpcyB1cHBlcmNhc2UgQ1VSTEZPUk1fPG5hbWU+ICovCiAjaWZkZWYgQ0ZJTklUCiAjdW5kZWYgQ0ZJTklUCkBAIC0yMTc5LDYgKzIzMzgsNDcgQEAKIH07CiAKIC8qCisgKiBOQU1FIGN1cmxfZ2xvYmFsX3NzbHNldCgpCisgKgorICogREVTQ1JJUFRJT04KKyAqCisgKiBXaGVuIGJ1aWx0IHdpdGggbXVsdGlwbGUgU1NMIGJhY2tlbmRzLCBjdXJsX2dsb2JhbF9zc2xzZXQoKSBhbGxvd3MgdG8KKyAqIGNob29zZSBvbmUuIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UsIGFuZCBpdCBtdXN0IGJlIGNhbGxlZAorICogKmJlZm9yZSogY3VybF9nbG9iYWxfaW5pdCgpLgorICoKKyAqIFRoZSBiYWNrZW5kIGNhbiBiZSBpZGVudGlmaWVkIGJ5IHRoZSBpZCAoZS5nLiBDVVJMU1NMQkFDS0VORF9PUEVOU1NMKS4gVGhlCisgKiBiYWNrZW5kIGNhbiBhbHNvIGJlIHNwZWNpZmllZCB2aWEgdGhlIG5hbWUgcGFyYW1ldGVyIChwYXNzaW5nIC0xIGFzIGlkKS4KKyAqIElmIGJvdGggaWQgYW5kIG5hbWUgYXJlIHNwZWNpZmllZCwgdGhlIG5hbWUgd2lsbCBiZSBpZ25vcmVkLiBJZiBuZWl0aGVyIGlkCisgKiBub3IgbmFtZSBhcmUgc3BlY2lmaWVkLCB0aGUgZnVuY3Rpb24gd2lsbCBmYWlsIHdpdGgKKyAqIENVUkxTU0xTRVRfVU5LTk9XTl9CQUNLRU5EIGFuZCBzZXQgdGhlICJhdmFpbCIgcG9pbnRlciB0byB0aGUKKyAqIE5VTEwtdGVybWluYXRlZCBsaXN0IG9mIGF2YWlsYWJsZSBiYWNrZW5kcy4KKyAqCisgKiBVcG9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIENVUkxTU0xTRVRfT0suCisgKgorICogSWYgdGhlIHNwZWNpZmllZCBTU0wgYmFja2VuZCBpcyBub3QgYXZhaWxhYmxlLCB0aGUgZnVuY3Rpb24gcmV0dXJucworICogQ1VSTFNTTFNFVF9VTktOT1dOX0JBQ0tFTkQgYW5kIHNldHMgdGhlICJhdmFpbCIgcG9pbnRlciB0byBhIE5VTEwtdGVybWluYXRlZAorICogbGlzdCBvZiBhdmFpbGFibGUgU1NMIGJhY2tlbmRzLgorICoKKyAqIFRoZSBTU0wgYmFja2VuZCBjYW4gYmUgc2V0IG9ubHkgb25jZS4gSWYgaXQgaGFzIGFscmVhZHkgYmVlbiBzZXQsIGEKKyAqIHN1YnNlcXVlbnQgYXR0ZW1wdCB0byBjaGFuZ2UgaXQgd2lsbCByZXN1bHQgaW4gYSBDVVJMU1NMU0VUX1RPT19MQVRFLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY3VybF9zc2xiYWNrZW5kIGlkOworICBjb25zdCBjaGFyICpuYW1lOworfSBjdXJsX3NzbF9iYWNrZW5kOworCit0eXBlZGVmIGVudW0geworICBDVVJMU1NMU0VUX09LID0gMCwKKyAgQ1VSTFNTTFNFVF9VTktOT1dOX0JBQ0tFTkQsCisgIENVUkxTU0xTRVRfVE9PX0xBVEUsCisgIENVUkxTU0xTRVRfTk9fQkFDS0VORFMgLyogbGliY3VybCB3YXMgYnVpbHQgd2l0aG91dCBhbnkgU1NMIHN1cHBvcnQgKi8KK30gQ1VSTHNzbHNldDsKKworQ1VSTF9FWFRFUk4gQ1VSTHNzbHNldCBjdXJsX2dsb2JhbF9zc2xzZXQoY3VybF9zc2xiYWNrZW5kIGlkLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VybF9zc2xfYmFja2VuZCAqKiphdmFpbCk7CisKKy8qCiAgKiBOQU1FIGN1cmxfc2xpc3RfYXBwZW5kKCkKICAqCiAgKiBERVNDUklQVElPTgpAQCAtMjIxOCwyNyArMjQxOCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCAibmFtZTogdmFsdWUiICovCiB9OwogCi0vKiBlbnVtIGZvciB0aGUgZGlmZmVyZW50IHN1cHBvcnRlZCBTU0wgYmFja2VuZHMgKi8KLXR5cGVkZWYgZW51bSB7Ci0gIENVUkxTU0xCQUNLRU5EX05PTkUgPSAwLAotICBDVVJMU1NMQkFDS0VORF9PUEVOU1NMID0gMSwKLSAgQ1VSTFNTTEJBQ0tFTkRfR05VVExTID0gMiwKLSAgQ1VSTFNTTEJBQ0tFTkRfTlNTID0gMywKLSAgQ1VSTFNTTEJBQ0tFTkRfT0JTT0xFVEU0ID0gNCwgIC8qIFdhcyBRU09TU0wuICovCi0gIENVUkxTU0xCQUNLRU5EX0dTS0lUID0gNSwKLSAgQ1VSTFNTTEJBQ0tFTkRfUE9MQVJTU0wgPSA2LAotICBDVVJMU1NMQkFDS0VORF9DWUFTU0wgPSA3LAotICBDVVJMU1NMQkFDS0VORF9TQ0hBTk5FTCA9IDgsCi0gIENVUkxTU0xCQUNLRU5EX0RBUldJTlNTTCA9IDksCi0gIENVUkxTU0xCQUNLRU5EX0FYVExTID0gMTAsCi0gIENVUkxTU0xCQUNLRU5EX01CRURUTFMgPSAxMQotfSBjdXJsX3NzbGJhY2tlbmQ7Ci0KLS8qIGFsaWFzZXMgZm9yIGxpYnJhcnkgY2xvbmVzIGFuZCByZW5hbWVzICovCi0jZGVmaW5lIENVUkxTU0xCQUNLRU5EX0xJQlJFU1NMIDEKLSNkZWZpbmUgQ1VSTFNTTEJBQ0tFTkRfQk9SSU5HU1NMIDEKLSNkZWZpbmUgQ1VSTFNTTEJBQ0tFTkRfV09MRlNTTCA2Ci0KIC8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBTU0wgbGlicmFyeSB1c2VkIGFuZCB0aGUgcmVzcGVjdGl2ZSBpbnRlcm5hbCBTU0wKICAgIGhhbmRsZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gb2J0YWluIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZQogICAgY29ubmVjdGlvbi4gQXNrZWQgZm9yIHdpdGggQ1VSTElORk9fVExTX1NTTF9QVFIgb3IgQ1VSTElORk9fVExTX1NFU1NJT04uICovCkBAIC0yMjUzLDYgKzI0MzIsNyBAQAogI2RlZmluZSBDVVJMSU5GT19TTElTVCAgICAweDQwMDAwMAogI2RlZmluZSBDVVJMSU5GT19QVFIgICAgICAweDQwMDAwMCAvKiBzYW1lIGFzIFNMSVNUICovCiAjZGVmaW5lIENVUkxJTkZPX1NPQ0tFVCAgIDB4NTAwMDAwCisjZGVmaW5lIENVUkxJTkZPX09GRl9UICAgIDB4NjAwMDAwCiAjZGVmaW5lIENVUkxJTkZPX01BU0sgICAgIDB4MGZmZmZmCiAjZGVmaW5lIENVUkxJTkZPX1RZUEVNQVNLIDB4ZjAwMDAwCiAKQEAgLTIyNjUsMTUgKzI0NDUsMjEgQEAKICAgQ1VSTElORk9fQ09OTkVDVF9USU1FICAgICA9IENVUkxJTkZPX0RPVUJMRSArIDUsCiAgIENVUkxJTkZPX1BSRVRSQU5TRkVSX1RJTUUgPSBDVVJMSU5GT19ET1VCTEUgKyA2LAogICBDVVJMSU5GT19TSVpFX1VQTE9BRCAgICAgID0gQ1VSTElORk9fRE9VQkxFICsgNywKKyAgQ1VSTElORk9fU0laRV9VUExPQURfVCAgICA9IENVUkxJTkZPX09GRl9UICArIDcsCiAgIENVUkxJTkZPX1NJWkVfRE9XTkxPQUQgICAgPSBDVVJMSU5GT19ET1VCTEUgKyA4LAorICBDVVJMSU5GT19TSVpFX0RPV05MT0FEX1QgID0gQ1VSTElORk9fT0ZGX1QgICsgOCwKICAgQ1VSTElORk9fU1BFRURfRE9XTkxPQUQgICA9IENVUkxJTkZPX0RPVUJMRSArIDksCisgIENVUkxJTkZPX1NQRUVEX0RPV05MT0FEX1QgPSBDVVJMSU5GT19PRkZfVCAgKyA5LAogICBDVVJMSU5GT19TUEVFRF9VUExPQUQgICAgID0gQ1VSTElORk9fRE9VQkxFICsgMTAsCisgIENVUkxJTkZPX1NQRUVEX1VQTE9BRF9UICAgPSBDVVJMSU5GT19PRkZfVCAgKyAxMCwKICAgQ1VSTElORk9fSEVBREVSX1NJWkUgICAgICA9IENVUkxJTkZPX0xPTkcgICArIDExLAogICBDVVJMSU5GT19SRVFVRVNUX1NJWkUgICAgID0gQ1VSTElORk9fTE9ORyAgICsgMTIsCiAgIENVUkxJTkZPX1NTTF9WRVJJRllSRVNVTFQgPSBDVVJMSU5GT19MT05HICAgKyAxMywKICAgQ1VSTElORk9fRklMRVRJTUUgICAgICAgICA9IENVUkxJTkZPX0xPTkcgICArIDE0LAogICBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCAgID0gQ1VSTElORk9fRE9VQkxFICsgMTUsCisgIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEX1QgPSBDVVJMSU5GT19PRkZfVCAgKyAxNSwKICAgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfVVBMT0FEICAgICA9IENVUkxJTkZPX0RPVUJMRSArIDE2LAorICBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9VUExPQURfVCAgID0gQ1VSTElORk9fT0ZGX1QgICsgMTYsCiAgIENVUkxJTkZPX1NUQVJUVFJBTlNGRVJfVElNRSA9IENVUkxJTkZPX0RPVUJMRSArIDE3LAogICBDVVJMSU5GT19DT05URU5UX1RZUEUgICAgID0gQ1VSTElORk9fU1RSSU5HICsgMTgsCiAgIENVUkxJTkZPX1JFRElSRUNUX1RJTUUgICAgPSBDVVJMSU5GT19ET1VCTEUgKyAxOSwKQEAgLTI0NzEsNiArMjY1Nyw3IEBACiAjZGVmaW5lIENVUkxfVkVSU0lPTl9QU0wgICAgICAgICAgKDE8PDIwKSAvKiBNb3ppbGxhJ3MgUHVibGljIFN1ZmZpeCBMaXN0LCB1c2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgY29va2llIGRvbWFpbiB2ZXJpZmljYXRpb24gKi8KICNkZWZpbmUgQ1VSTF9WRVJTSU9OX0hUVFBTX1BST1hZICAoMTw8MjEpIC8qIEhUVFBTLXByb3h5IHN1cHBvcnQgYnVpbHQtaW4gKi8KKyNkZWZpbmUgQ1VSTF9WRVJTSU9OX01VTFRJX1NTTCAgICAoMTw8MjIpIC8qIE11bHRpcGxlIFNTTCBiYWNrZW5kcyBhdmFpbGFibGUgKi8KIAogIC8qCiAgKiBOQU1FIGN1cmxfdmVyc2lvbl9pbmZvKCkKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvaW5jbHVkZS9jdXJsL2N1cmxidWlsZC5oLmNtYWtlIGIvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvY3VybGJ1aWxkLmguY21ha2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YjRmNTIuLjAwMDAwMDAKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvY3VybGJ1aWxkLmguY21ha2UKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotI2lmbmRlZiBfX0NVUkxfQ1VSTEJVSUxEX0gKLSNkZWZpbmUgX19DVVJMX0NVUkxCVUlMRF9ICi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfICAgXyBfX19fICBfCi0gKiAgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgIF9fX3wgfCB8IHwgIF8gXHwgfAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gX198IHwgfCB8IHxfKSB8IHwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDA4LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCi0gKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCi0gKiBhcmUgYWxzbyBhdmFpbGFibGUgYXQgaHR0cHM6Ly9jdXJsLmhheHguc2UvZG9jcy9jb3B5cmlnaHQuaHRtbC4KLSAqCi0gKiBZb3UgbWF5IG9wdCB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUgYW5kL29yIHNlbGwKLSAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwotICogZnVybmlzaGVkIHRvIGRvIHNvLCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENPUFlJTkcgZmlsZS4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICAgICAgICAgICAgICAgTk9URVMgRk9SIENPTkZJR1VSRSBDQVBBQkxFIFNZU1RFTVMgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotLyoKLSAqIE5PVEUgMToKLSAqIC0tLS0tLS0KLSAqCi0gKiBOb3RoaW5nIGluIHRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBtb2RpZmllZCBvciBhZGp1c3RlZCBieSB0aGUKLSAqIGN1cmwgbGlicmFyeSB1c2VyIG5vciBieSB0aGUgY3VybCBsaWJyYXJ5IGJ1aWxkZXIuCi0gKgotICogSWYgeW91IHRoaW5rIHRoYXQgc29tZXRoaW5nIGFjdHVhbGx5IG5lZWRzIHRvIGJlIGNoYW5nZWQsIGFkanVzdGVkCi0gKiBvciBmaXhlZCBpbiB0aGlzIGZpbGUsIHRoZW4sIHJlcG9ydCBpdCBvbiB0aGUgbGliY3VybCBkZXZlbG9wbWVudAotICogbWFpbGluZyBsaXN0OiBodHRwczovL2Nvb2wuaGF4eC5zZS9tYWlsbWFuL2xpc3RpbmZvL2N1cmwtbGlicmFyeS8KLSAqCi0gKiBUaGlzIGhlYWRlciBmaWxlIHNoYWxsIG9ubHkgZXhwb3J0IHN5bWJvbHMgd2hpY2ggYXJlICdjdXJsJyBvciAnQ1VSTCcKLSAqIHByZWZpeGVkLCBvdGhlcndpc2UgcHVibGljIG5hbWUgc3BhY2Ugd291bGQgYmUgcG9sbHV0ZWQuCi0gKgotICogTk9URSAyOgotICogLS0tLS0tLQotICoKLSAqIFJpZ2h0IG5vdyB5b3UgbWlnaHQgYmUgc3RhcmluZyBhdCBmaWxlIGluY2x1ZGUvY3VybC9jdXJsYnVpbGQuaC5pbiBvcgotICogYXQgZmlsZSBpbmNsdWRlL2N1cmwvY3VybGJ1aWxkLmgsIHRoaXMgaXMgZHVlIHRvIHRoZSBmb2xsb3dpbmcgcmVhc29uOgotICoKLSAqIE9uIHN5c3RlbXMgY2FwYWJsZSBvZiBydW5uaW5nIHRoZSBjb25maWd1cmUgc2NyaXB0LCB0aGUgY29uZmlndXJlIHByb2Nlc3MKLSAqIHdpbGwgb3ZlcndyaXRlIHRoZSBkaXN0cmlidXRlZCBpbmNsdWRlL2N1cmwvY3VybGJ1aWxkLmggZmlsZSB3aXRoIG9uZSB0aGF0Ci0gKiBpcyBzdWl0YWJsZSBhbmQgc3BlY2lmaWMgdG8gdGhlIGxpYnJhcnkgYmVpbmcgY29uZmlndXJlZCBhbmQgYnVpbHQsIHdoaWNoCi0gKiBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgaW5jbHVkZS9jdXJsL2N1cmxidWlsZC5oLmluIHRlbXBsYXRlIGZpbGUuCi0gKgotICovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBERUZJTklUSU9OIE9GIFRIRVNFIFNZTUJPTFMgU0hBTEwgTk9UIFRBS0UgUExBQ0UgQU5ZV0hFUkUgRUxTRSAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotI2lmZGVmIENVUkxfU0laRU9GX0xPTkcKLSNlcnJvciAiQ1VSTF9TSVpFT0ZfTE9ORyBzaGFsbCBub3QgYmUgZGVmaW5lZCBleGNlcHQgaW4gY3VybGJ1aWxkLmgiCi0gICBFcnJvciBDb21waWxhdGlvbl9hYm9ydGVkX0NVUkxfU0laRU9GX0xPTkdfYWxyZWFkeV9kZWZpbmVkCi0jZW5kaWYKLQotI2lmZGVmIENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UCi0jZXJyb3IgIkNVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UIHNoYWxsIG5vdCBiZSBkZWZpbmVkIGV4Y2VwdCBpbiBjdXJsYnVpbGQuaCIKLSAgIEVycm9yIENvbXBpbGF0aW9uX2Fib3J0ZWRfQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1RfYWxyZWFkeV9kZWZpbmVkCi0jZW5kaWYKLQotI2lmZGVmIENVUkxfU0laRU9GX0NVUkxfU09DS0xFTl9UCi0jZXJyb3IgIkNVUkxfU0laRU9GX0NVUkxfU09DS0xFTl9UIHNoYWxsIG5vdCBiZSBkZWZpbmVkIGV4Y2VwdCBpbiBjdXJsYnVpbGQuaCIKLSAgIEVycm9yIENvbXBpbGF0aW9uX2Fib3J0ZWRfQ1VSTF9TSVpFT0ZfQ1VSTF9TT0NLTEVOX1RfYWxyZWFkeV9kZWZpbmVkCi0jZW5kaWYKLQotI2lmZGVmIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QKLSNlcnJvciAiQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCBzaGFsbCBub3QgYmUgZGVmaW5lZCBleGNlcHQgaW4gY3VybGJ1aWxkLmgiCi0gICBFcnJvciBDb21waWxhdGlvbl9hYm9ydGVkX0NVUkxfVFlQRU9GX0NVUkxfT0ZGX1RfYWxyZWFkeV9kZWZpbmVkCi0jZW5kaWYKLQotI2lmZGVmIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QKLSNlcnJvciAiQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCBzaGFsbCBub3QgYmUgZGVmaW5lZCBleGNlcHQgaW4gY3VybGJ1aWxkLmgiCi0gICBFcnJvciBDb21waWxhdGlvbl9hYm9ydGVkX0NVUkxfRk9STUFUX0NVUkxfT0ZGX1RfYWxyZWFkeV9kZWZpbmVkCi0jZW5kaWYKLQotI2lmZGVmIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVCi0jZXJyb3IgIkNVUkxfRk9STUFUX0NVUkxfT0ZGX1RVIHNoYWxsIG5vdCBiZSBkZWZpbmVkIGV4Y2VwdCBpbiBjdXJsYnVpbGQuaCIKLSAgIEVycm9yIENvbXBpbGF0aW9uX2Fib3J0ZWRfQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFVfYWxyZWFkeV9kZWZpbmVkCi0jZW5kaWYKLQotI2lmZGVmIENVUkxfRk9STUFUX09GRl9UCi0jZXJyb3IgIkNVUkxfRk9STUFUX09GRl9UIHNoYWxsIG5vdCBiZSBkZWZpbmVkIGV4Y2VwdCBpbiBjdXJsYnVpbGQuaCIKLSAgIEVycm9yIENvbXBpbGF0aW9uX2Fib3J0ZWRfQ1VSTF9GT1JNQVRfT0ZGX1RfYWxyZWFkeV9kZWZpbmVkCi0jZW5kaWYKLQotI2lmZGVmIENVUkxfU0laRU9GX0NVUkxfT0ZGX1QKLSNlcnJvciAiQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCBzaGFsbCBub3QgYmUgZGVmaW5lZCBleGNlcHQgaW4gY3VybGJ1aWxkLmgiCi0gICBFcnJvciBDb21waWxhdGlvbl9hYm9ydGVkX0NVUkxfU0laRU9GX0NVUkxfT0ZGX1RfYWxyZWFkeV9kZWZpbmVkCi0jZW5kaWYKLQotI2lmZGVmIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QKLSNlcnJvciAiQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCBzaGFsbCBub3QgYmUgZGVmaW5lZCBleGNlcHQgaW4gY3VybGJ1aWxkLmgiCi0gICBFcnJvciBDb21waWxhdGlvbl9hYm9ydGVkX0NVUkxfU1VGRklYX0NVUkxfT0ZGX1RfYWxyZWFkeV9kZWZpbmVkCi0jZW5kaWYKLQotI2lmZGVmIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVCi0jZXJyb3IgIkNVUkxfU1VGRklYX0NVUkxfT0ZGX1RVIHNoYWxsIG5vdCBiZSBkZWZpbmVkIGV4Y2VwdCBpbiBjdXJsYnVpbGQuaCIKLSAgIEVycm9yIENvbXBpbGF0aW9uX2Fib3J0ZWRfQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFVfYWxyZWFkeV9kZWZpbmVkCi0jZW5kaWYKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEVYVEVSTkFMIElOVEVSRkFDRSBTRVRUSU5HUyBGT1IgQ09ORklHVVJFIENBUEFCTEUgU1lTVEVNUyBPTkxZICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0vKiBDb25maWd1cmUgcHJvY2VzcyBkZWZpbmVzIHRoaXMgdG8gMSB3aGVuIGl0IGZpbmRzIG91dCB0aGF0IHN5c3RlbSAgKi8KLS8qIGhlYWRlciBmaWxlIHdzMnRjcGlwLmggbXVzdCBiZSBpbmNsdWRlZCBieSB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlLiAqLwotI2NtYWtlZGVmaW5lIENVUkxfUFVMTF9XUzJUQ1BJUF9ICi0jaWZkZWYgQ1VSTF9QVUxMX1dTMlRDUElQX0gKLSMgIGlmbmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCi0jICAgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jICBlbmRpZgotIyAgaW5jbHVkZSA8d2luZG93cy5oPgotIyAgaW5jbHVkZSA8d2luc29jazIuaD4KLSMgIGluY2x1ZGUgPHdzMnRjcGlwLmg+Ci0jZW5kaWYKLQotLyogQ29uZmlndXJlIHByb2Nlc3MgZGVmaW5lcyB0aGlzIHRvIDEgd2hlbiBpdCBmaW5kcyBvdXQgdGhhdCBzeXN0ZW0gICAqLwotLyogaGVhZGVyIGZpbGUgc3lzL3R5cGVzLmggbXVzdCBiZSBpbmNsdWRlZCBieSB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlLiAqLwotI2NtYWtlZGVmaW5lIENVUkxfUFVMTF9TWVNfVFlQRVNfSAotI2lmZGVmIENVUkxfUFVMTF9TWVNfVFlQRVNfSAotIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLQotLyogQ29uZmlndXJlIHByb2Nlc3MgZGVmaW5lcyB0aGlzIHRvIDEgd2hlbiBpdCBmaW5kcyBvdXQgdGhhdCBzeXN0ZW0gKi8KLS8qIGhlYWRlciBmaWxlIHN0ZGludC5oIG11c3QgYmUgaW5jbHVkZWQgYnkgdGhlIGV4dGVybmFsIGludGVyZmFjZS4gICovCi0jY21ha2VkZWZpbmUgQ1VSTF9QVUxMX1NURElOVF9ICi0jaWZkZWYgQ1VSTF9QVUxMX1NURElOVF9ICi0jICBpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZgotCi0vKiBDb25maWd1cmUgcHJvY2VzcyBkZWZpbmVzIHRoaXMgdG8gMSB3aGVuIGl0IGZpbmRzIG91dCB0aGF0IHN5c3RlbSAgKi8KLS8qIGhlYWRlciBmaWxlIGludHR5cGVzLmggbXVzdCBiZSBpbmNsdWRlZCBieSB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlLiAqLwotI2NtYWtlZGVmaW5lIENVUkxfUFVMTF9JTlRUWVBFU19ICi0jaWZkZWYgQ1VSTF9QVUxMX0lOVFRZUEVTX0gKLSMgIGluY2x1ZGUgPGludHR5cGVzLmg+Ci0jZW5kaWYKLQotLyogQ29uZmlndXJlIHByb2Nlc3MgZGVmaW5lcyB0aGlzIHRvIDEgd2hlbiBpdCBmaW5kcyBvdXQgdGhhdCBzeXN0ZW0gICAgKi8KLS8qIGhlYWRlciBmaWxlIHN5cy9zb2NrZXQuaCBtdXN0IGJlIGluY2x1ZGVkIGJ5IHRoZSBleHRlcm5hbCBpbnRlcmZhY2UuICovCi0jY21ha2VkZWZpbmUgQ1VSTF9QVUxMX1NZU19TT0NLRVRfSAotI2lmZGVmIENVUkxfUFVMTF9TWVNfU09DS0VUX0gKLSMgIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNlbmRpZgotCi0vKiBDb25maWd1cmUgcHJvY2VzcyBkZWZpbmVzIHRoaXMgdG8gMSB3aGVuIGl0IGZpbmRzIG91dCB0aGF0IHN5c3RlbSAgKi8KLS8qIGhlYWRlciBmaWxlIHN5cy9wb2xsLmggbXVzdCBiZSBpbmNsdWRlZCBieSB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlLiAqLwotI2NtYWtlZGVmaW5lIENVUkxfUFVMTF9TWVNfUE9MTF9ICi0jaWZkZWYgQ1VSTF9QVUxMX1NZU19QT0xMX0gKLSMgIGluY2x1ZGUgPHN5cy9wb2xsLmg+Ci0jZW5kaWYKLQotLyogVGhlIHNpemUgb2YgYGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KLUBDVVJMX1NJWkVPRl9JTlRfQ09ERUAKLQotLyogVGhlIHNpemUgb2YgYGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCi1AQ1VSTF9TSVpFT0ZfTE9OR19DT0RFQAotCi0vKiBUaGUgc2l6ZSBvZiBgbG9uZyBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLwotQENVUkxfU0laRU9GX0xPTkdfTE9OR19DT0RFQAotCi0vKiBUaGUgc2l6ZSBvZiBgc3NpemVfdCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KLUBDVVJMX1NJWkVPRl9TU0laRV9UX0NPREVACi0KLSNkZWZpbmUgQ1VSTF9IQVZFX1NPQ0tMRU5fVCBAQ1VSTF9IQVZFX1NPQ0tMRU5fVEAKLSNpZiBDVVJMX0hBVkVfU09DS0xFTl9UCi0vKiBJbnRlZ3JhbCBkYXRhIHR5cGUgdXNlZCBmb3IgY3VybF9zb2NrbGVuX3QuICovCi0jZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UIHNvY2tsZW5fdAotCi0vKiBUaGUgc2l6ZSBvZiBgY3VybF9zb2NrbGVuX3QnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCi1AQ1VSTF9TSVpFT0ZfQ1VSTF9TT0NLTEVOX1RfQ09ERUAKLSNlbHNlCi0jIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKLSMgZGVmaW5lIENVUkxfU0laRU9GX0NVUkxfU09DS0xFTl9UIENVUkxfU0laRU9GX0lOVAotI2VuZGlmCi0KLS8qIERhdGEgdHlwZSBkZWZpbml0aW9uIG9mIGN1cmxfc29ja2xlbl90LiAqLwotdHlwZWRlZiBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBjdXJsX3NvY2tsZW5fdDsKLQotI2lmIENVUkxfU0laRU9GX0xPTkcgPT0gOAotIyBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCBsb25nCi0jIGRlZmluZSBDVVJMX1NJWkVPRl9DVVJMX09GRl9UIDgKLSMgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgImxkIgotIyBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImx1IgotIyBkZWZpbmUgQ1VSTF9GT1JNQVRfT0ZGX1QgIiVsZCIKLSMgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgTAotIyBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgVUwKLSNlbGlmIENVUkxfU0laRU9GX0xPTkdfTE9ORyA9PSA4Ci0jIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UIGxvbmcgbG9uZwotIyBkZWZpbmUgQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCA4Ci0jIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICJsbGQiCi0jIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibGx1IgotIyBkZWZpbmUgQ1VSTF9GT1JNQVRfT0ZGX1QgIiVsbGQiCi0jIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UIExMCi0jIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBVTEwKLSNlbHNlCi0jIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UIHNzaXplX3QKLSMgZGVmaW5lIENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgQ1VSTF9TSVpFT0ZfU1NJWkVfVAotLyogVE9ETzogbmVlZCBhZGp1c3RtZW50IGhlcmUuICovCi0jIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICJsZCIKLSMgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICJsdSIKLSMgZGVmaW5lIENVUkxfRk9STUFUX09GRl9UICIlbGQiCi0jIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UIEwKLSMgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVIFVMCi0jZW5kaWYKLQotLyogRGF0YSB0eXBlIGRlZmluaXRpb24gb2YgY3VybF9vZmZfdC4gKi8KLXR5cGVkZWYgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCBjdXJsX29mZl90OwotCi0jZW5kaWYgLyogX19DVVJMX0NVUkxCVUlMRF9IICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2luY2x1ZGUvY3VybC9jdXJscnVsZXMuaCBiL1V0aWxpdGllcy9jbWN1cmwvaW5jbHVkZS9jdXJsL2N1cmxydWxlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWJkOWY3Li4wMDAwMDAwCi0tLSBhL1V0aWxpdGllcy9jbWN1cmwvaW5jbHVkZS9jdXJsL2N1cmxydWxlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLSNpZm5kZWYgX19DVVJMX0NVUkxSVUxFU19ICi0jZGVmaW5lIF9fQ1VSTF9DVVJMUlVMRVNfSAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXyAgIF8gX19fXyAgXwotICogIFByb2plY3QgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198Ci0gKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAotICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwotICogYXJlIGFsc28gYXZhaWxhYmxlIGF0IGh0dHBzOi8vY3VybC5oYXh4LnNlL2RvY3MvY29weXJpZ2h0Lmh0bWwuCi0gKgotICogWW91IG1heSBvcHQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlIGFuZC9vciBzZWxsCi0gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKLSAqIGZ1cm5pc2hlZCB0byBkbyBzbywgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDT1BZSU5HIGZpbGUuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgICAgICAgICAgICAgICAgICAgQ09NUElMRSBUSU1FIFNBTklUWSBDSEVDS1MgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLS8qCi0gKiBOT1RFIDE6Ci0gKiAtLS0tLS0tCi0gKgotICogQWxsIGNoZWNrcyBkb25lIGluIHRoaXMgZmlsZSBhcmUgaW50ZW50aW9uYWxseSBwbGFjZWQgaW4gYSBwdWJsaWMKLSAqIGhlYWRlciBmaWxlIHdoaWNoIGlzIHB1bGxlZCBieSBjdXJsL2N1cmwuaCB3aGVuIGFuIGFwcGxpY2F0aW9uIGlzCi0gKiBiZWluZyBidWlsdCB1c2luZyBhbiBhbHJlYWR5IGJ1aWx0IGxpYmN1cmwgbGlicmFyeS4gQWRkaXRpb25hbGx5Ci0gKiB0aGlzIGZpbGUgaXMgYWxzbyBpbmNsdWRlZCBhbmQgdXNlZCB3aGVuIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5LgotICoKLSAqIElmIGNvbXBpbGF0aW9uIGZhaWxzIG9uIHRoaXMgZmlsZSBpdCBpcyBjZXJ0YWlubHkgc3VyZSB0aGF0IHRoZQotICogcHJvYmxlbSBpcyBlbHNld2hlcmUuIEl0IGNvdWxkIGJlIGEgcHJvYmxlbSBpbiB0aGUgY3VybGJ1aWxkLmgKLSAqIGhlYWRlciBmaWxlLCBvciBzaW1wbHkgdGhhdCB5b3UgYXJlIHVzaW5nIGRpZmZlcmVudCBjb21waWxhdGlvbgotICogc2V0dGluZ3MgdGhhbiB0aG9zZSB1c2VkIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LgotICoKLSAqIE5vdGhpbmcgaW4gdGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGJlIG1vZGlmaWVkIG9yIGFkanVzdGVkIGJ5IHRoZQotICogY3VybCBsaWJyYXJ5IHVzZXIgbm9yIGJ5IHRoZSBjdXJsIGxpYnJhcnkgYnVpbGRlci4KLSAqCi0gKiBEbyBub3QgZGVhY3RpdmF0ZSBhbnkgY2hlY2ssIHRoZXNlIGFyZSBkb25lIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQotICogbGlicmFyeSBpcyBwcm9wZXJseSBidWlsdCBhbmQgdXNlZC4KLSAqCi0gKiBZb3UgY2FuIGZpbmQgZnVydGhlciBoZWxwIG9uIHRoZSBsaWJjdXJsIGRldmVsb3BtZW50IG1haWxpbmcgbGlzdDoKLSAqIGh0dHBzOi8vY29vbC5oYXh4LnNlL21haWxtYW4vbGlzdGluZm8vY3VybC1saWJyYXJ5LwotICoKLSAqIE5PVEUgMgotICogLS0tLS0tCi0gKgotICogU29tZSBvZiB0aGUgZm9sbG93aW5nIGNvbXBpbGUgdGltZSBjaGVja3MgYXJlIGJhc2VkIG9uIHRoZSBmYWN0Ci0gKiB0aGF0IHRoZSBkaW1lbnNpb24gb2YgYSBjb25zdGFudCBhcnJheSBjYW4gbm90IGJlIGEgbmVnYXRpdmUgb25lLgotICogSW4gdGhpcyB3YXkgaWYgdGhlIGNvbXBpbGUgdGltZSB2ZXJpZmljYXRpb24gZmFpbHMsIHRoZSBjb21waWxhdGlvbgotICogd2lsbCBmYWlsIGlzc3VpbmcgYW4gZXJyb3IuIFRoZSBlcnJvciBkZXNjcmlwdGlvbiB3b3JkaW5nIGlzIGNvbXBpbGVyCi0gKiBkZXBlbmRlbnQgYnV0IGl0IHdpbGwgYmUgcXVpdGUgc2ltaWxhciB0byBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqCi0gKiAgICJuZWdhdGl2ZSBzdWJzY3JpcHQgb3Igc3Vic2NyaXB0IGlzIHRvbyBsYXJnZSIKLSAqICAgImFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudCIKLSAqICAgIi0xIGlzIGFuIGlsbGVnYWwgYXJyYXkgc2l6ZSIKLSAqICAgInNpemUgb2YgYXJyYXkgaXMgbmVnYXRpdmUiCi0gKgotICogSWYgeW91IGFyZSBidWlsZGluZyBhbiBhcHBsaWNhdGlvbiB3aGljaCB0cmllcyB0byB1c2UgYW4gYWxyZWFkeQotICogYnVpbHQgbGliY3VybCBsaWJyYXJ5IGFuZCB5b3UgYXJlIGdldHRpbmcgdGhpcyBraW5kIG9mIGVycm9ycyBvbgotICogdGhpcyBmaWxlLCBpdCBpcyBhIGNsZWFyIGluZGljYXRpb24gdGhhdCB0aGVyZSBpcyBhIG1pc21hdGNoIGJldHdlZW4KLSAqIGhvdyB0aGUgbGlicmFyeSB3YXMgYnVpbHQgYW5kIGhvdyB5b3UgYXJlIHRyeWluZyB0byB1c2UgaXQgZm9yIHlvdXIKLSAqIGFwcGxpY2F0aW9uLiBZb3VyIGFscmVhZHkgY29tcGlsZWQgb3IgYmluYXJ5IGxpYnJhcnkgcHJvdmlkZXIgaXMgdGhlCi0gKiBvbmx5IG9uZSB3aG8gY2FuIGdpdmUgeW91IHRoZSBkZXRhaWxzIHlvdSBuZWVkIHRvIHByb3Blcmx5IHVzZSBpdC4KLSAqLwotCi0vKgotICogVmVyaWZ5IHRoYXQgc29tZSBtYWNyb3MgYXJlIGFjdHVhbGx5IGRlZmluZWQuCi0gKi8KLQotI2lmbmRlZiBDVVJMX1NJWkVPRl9MT05HCi0jICBlcnJvciAiQ1VSTF9TSVpFT0ZfTE9ORyBkZWZpbml0aW9uIGlzIG1pc3NpbmchIgotICAgRXJyb3IgQ29tcGlsYXRpb25fYWJvcnRlZF9DVVJMX1NJWkVPRl9MT05HX2lzX21pc3NpbmcKLSNlbmRpZgotCi0jaWZuZGVmIENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UCi0jICBlcnJvciAiQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgZGVmaW5pdGlvbiBpcyBtaXNzaW5nISIKLSAgIEVycm9yIENvbXBpbGF0aW9uX2Fib3J0ZWRfQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1RfaXNfbWlzc2luZwotI2VuZGlmCi0KLSNpZm5kZWYgQ1VSTF9TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QKLSMgIGVycm9yICJDVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCBkZWZpbml0aW9uIGlzIG1pc3NpbmchIgotICAgRXJyb3IgQ29tcGlsYXRpb25fYWJvcnRlZF9DVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVF9pc19taXNzaW5nCi0jZW5kaWYKLQotI2lmbmRlZiBDVVJMX1RZUEVPRl9DVVJMX09GRl9UCi0jICBlcnJvciAiQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCBkZWZpbml0aW9uIGlzIG1pc3NpbmchIgotICAgRXJyb3IgQ29tcGlsYXRpb25fYWJvcnRlZF9DVVJMX1RZUEVPRl9DVVJMX09GRl9UX2lzX21pc3NpbmcKLSNlbmRpZgotCi0jaWZuZGVmIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QKLSMgIGVycm9yICJDVVJMX0ZPUk1BVF9DVVJMX09GRl9UIGRlZmluaXRpb24gaXMgbWlzc2luZyEiCi0gICBFcnJvciBDb21waWxhdGlvbl9hYm9ydGVkX0NVUkxfRk9STUFUX0NVUkxfT0ZGX1RfaXNfbWlzc2luZwotI2VuZGlmCi0KLSNpZm5kZWYgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUKLSMgIGVycm9yICJDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSBkZWZpbml0aW9uIGlzIG1pc3NpbmchIgotICAgRXJyb3IgQ29tcGlsYXRpb25fYWJvcnRlZF9DVVJMX0ZPUk1BVF9DVVJMX09GRl9UVV9pc19taXNzaW5nCi0jZW5kaWYKLQotI2lmbmRlZiBDVVJMX1NJWkVPRl9DVVJMX09GRl9UCi0jICBlcnJvciAiQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCBkZWZpbml0aW9uIGlzIG1pc3NpbmchIgotICAgRXJyb3IgQ29tcGlsYXRpb25fYWJvcnRlZF9DVVJMX1NJWkVPRl9DVVJMX09GRl9UX2lzX21pc3NpbmcKLSNlbmRpZgotCi0jaWZuZGVmIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QKLSMgIGVycm9yICJDVVJMX1NVRkZJWF9DVVJMX09GRl9UIGRlZmluaXRpb24gaXMgbWlzc2luZyEiCi0gICBFcnJvciBDb21waWxhdGlvbl9hYm9ydGVkX0NVUkxfU1VGRklYX0NVUkxfT0ZGX1RfaXNfbWlzc2luZwotI2VuZGlmCi0KLSNpZm5kZWYgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUKLSMgIGVycm9yICJDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBkZWZpbml0aW9uIGlzIG1pc3NpbmchIgotICAgRXJyb3IgQ29tcGlsYXRpb25fYWJvcnRlZF9DVVJMX1NVRkZJWF9DVVJMX09GRl9UVV9pc19taXNzaW5nCi0jZW5kaWYKLQotLyoKLSAqIE1hY3JvcyBwcml2YXRlIHRvIHRoaXMgaGVhZGVyIGZpbGUuCi0gKi8KLQotI2RlZmluZSBDdXJsY2hrc3pFUSh0LCBzKSBzaXplb2YodCkgPT0gcyA/IDEgOiAtMQotCi0jZGVmaW5lIEN1cmxjaGtzekdFKHQxLCB0Mikgc2l6ZW9mKHQxKSA+PSBzaXplb2YodDIpID8gMSA6IC0xCi0KLS8qCi0gKiBWZXJpZnkgdGhhdCB0aGUgc2l6ZSBwcmV2aW91c2x5IGRlZmluZWQgYW5kIGV4cGVjdGVkIGZvciBsb25nCi0gKiBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHJlcG9ydGVkIGJ5IHNpemVvZigpIGF0IGNvbXBpbGUgdGltZS4KLSAqLwotCi10eXBlZGVmIGNoYXIKLSAgX19jdXJsX3J1bGVfMDFfXwotICAgIFtDdXJsY2hrc3pFUShsb25nLCBDVVJMX1NJWkVPRl9MT05HKV07Ci0KLS8qCi0gKiBWZXJpZnkgdGhhdCB0aGUgc2l6ZSBwcmV2aW91c2x5IGRlZmluZWQgYW5kIGV4cGVjdGVkIGZvcgotICogY3VybF9vZmZfdCBpcyBhY3R1YWxseSB0aGUgdGhlIHNhbWUgYXMgdGhlIG9uZSByZXBvcnRlZAotICogYnkgc2l6ZW9mKCkgYXQgY29tcGlsZSB0aW1lLgotICovCi0KLXR5cGVkZWYgY2hhcgotICBfX2N1cmxfcnVsZV8wMl9fCi0gICAgW0N1cmxjaGtzekVRKGN1cmxfb2ZmX3QsIENVUkxfU0laRU9GX0NVUkxfT0ZGX1QpXTsKLQotLyoKLSAqIFZlcmlmeSBhdCBjb21waWxlIHRpbWUgdGhhdCB0aGUgc2l6ZSBvZiBjdXJsX29mZl90IGFzIHJlcG9ydGVkCi0gKiBieSBzaXplb2YoKSBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gdGhlIG9uZSByZXBvcnRlZCBmb3IgbG9uZwotICogZm9yIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uLgotICovCi0KLXR5cGVkZWYgY2hhcgotICBfX2N1cmxfcnVsZV8wM19fCi0gICAgW0N1cmxjaGtzekdFKGN1cmxfb2ZmX3QsIGxvbmcpXTsKLQotLyoKLSAqIFZlcmlmeSB0aGF0IHRoZSBzaXplIHByZXZpb3VzbHkgZGVmaW5lZCBhbmQgZXhwZWN0ZWQgZm9yCi0gKiBjdXJsX3NvY2tsZW5fdCBpcyBhY3R1YWxseSB0aGUgdGhlIHNhbWUgYXMgdGhlIG9uZSByZXBvcnRlZAotICogYnkgc2l6ZW9mKCkgYXQgY29tcGlsZSB0aW1lLgotICovCi0KLXR5cGVkZWYgY2hhcgotICBfX2N1cmxfcnVsZV8wNF9fCi0gICAgW0N1cmxjaGtzekVRKGN1cmxfc29ja2xlbl90LCBDVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCldOwotCi0vKgotICogVmVyaWZ5IGF0IGNvbXBpbGUgdGltZSB0aGF0IHRoZSBzaXplIG9mIGN1cmxfc29ja2xlbl90IGFzIHJlcG9ydGVkCi0gKiBieSBzaXplb2YoKSBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gdGhlIG9uZSByZXBvcnRlZCBmb3IgaW50IGZvcgotICogdGhlIGN1cnJlbnQgY29tcGlsYXRpb24uCi0gKi8KLQotdHlwZWRlZiBjaGFyCi0gIF9fY3VybF9ydWxlXzA1X18KLSAgICBbQ3VybGNoa3N6R0UoY3VybF9zb2NrbGVuX3QsIGludCldOwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgICAgICAgICBFWFRFUk5BTExZIEFORCBJTlRFUk5BTExZIFZJU0lCTEUgREVGSU5JVElPTlMgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLS8qCi0gKiBDVVJMX0lTT0NQUCBhbmQgQ1VSTF9PRkZfVF9DIGRlZmluaXRpb25zIGFyZSBkb25lIGhlcmUgaW4gb3JkZXIgdG8gYWxsb3cKLSAqIHRoZXNlIHRvIGJlIHZpc2libGUgYW5kIGV4cG9ydGVkIGJ5IHRoZSBleHRlcm5hbCBsaWJjdXJsIGludGVyZmFjZSBBUEksCi0gKiB3aGlsZSBhbHNvIG1ha2luZyB0aGVtIHZpc2libGUgdG8gdGhlIGxpYnJhcnkgaW50ZXJuYWxzLCBzaW1wbHkgaW5jbHVkaW5nCi0gKiBjdXJsX3NldHVwLmgsIHdpdGhvdXQgYWN0dWFsbHkgbmVlZGluZyB0byBpbmNsdWRlIGN1cmwuaCBpbnRlcm5hbGx5LgotICogSWYgc29tZSBkYXkgdGhpcyBzZWN0aW9uIHdvdWxkIGdyb3cgYmlnIGVub3VnaCwgYWxsIHRoaXMgc2hvdWxkIGJlIG1vdmVkCi0gKiB0byBpdHMgb3duIGhlYWRlciBmaWxlLgotICovCi0KLS8qCi0gKiBGaWd1cmUgb3V0IGlmIHdlIGNhbiB1c2UgdGhlICMjIHByZXByb2Nlc3NvciBvcGVyYXRvciwgd2hpY2ggaXMgc3VwcG9ydGVkCi0gKiBieSBJU08vQU5TSSBDIGFuZCBDKysuIFNvbWUgY29tcGlsZXJzIHN1cHBvcnQgaXQgd2l0aG91dCBzZXR0aW5nIF9fU1REQ19fCi0gKiBvciAgX19jcGx1c3BsdXMgc28gd2UgbmVlZCB0byBjYXJlZnVsbHkgY2hlY2sgZm9yIHRoZW0gdG9vLgotICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBcCi0gIGRlZmluZWQoX19IUF9hQ0MpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9fTENDX18pIHx8IFwKLSAgZGVmaW5lZChfX1BPQ0NfXykgfHwgZGVmaW5lZChfX1NBTEZPUkRDX18pIHx8IGRlZmluZWQoX19ISUdIQ19fKSB8fCBcCi0gIGRlZmluZWQoX19JTEVDNDAwX18pCi0gIC8qIFRoaXMgY29tcGlsZXIgaXMgYmVsaWV2ZWQgdG8gaGF2ZSBhbiBJU08gY29tcGF0aWJsZSBwcmVwcm9jZXNzb3IgKi8KLSNkZWZpbmUgQ1VSTF9JU09DUFAKLSNlbHNlCi0gIC8qIFRoaXMgY29tcGlsZXIgaXMgYmVsaWV2ZWQgTk9UIHRvIGhhdmUgYW4gSVNPIGNvbXBhdGlibGUgcHJlcHJvY2Vzc29yICovCi0jdW5kZWYgQ1VSTF9JU09DUFAKLSNlbmRpZgotCi0vKgotICogTWFjcm9zIGZvciBtaW5pbXVtLXdpZHRoIHNpZ25lZCBhbmQgdW5zaWduZWQgY3VybF9vZmZfdCBpbnRlZ2VyIGNvbnN0YW50cy4KLSAqLwotCi0jaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIChfX0JPUkxBTkRDX18gPT0gMHgwNTUxKQotIyAgZGVmaW5lIF9fQ1VSTF9PRkZfVF9DX0hMUFIyKHgpIHgKLSMgIGRlZmluZSBfX0NVUkxfT0ZGX1RfQ19ITFBSMSh4KSBfX0NVUkxfT0ZGX1RfQ19ITFBSMih4KQotIyAgZGVmaW5lIENVUkxfT0ZGX1RfQyhWYWwpICBfX0NVUkxfT0ZGX1RfQ19ITFBSMShWYWwpICMjIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19DVVJMX09GRl9UX0NfSExQUjEoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCkKLSMgIGRlZmluZSBDVVJMX09GRl9UVV9DKFZhbCkgX19DVVJMX09GRl9UX0NfSExQUjEoVmFsKSAjIyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQ1VSTF9PRkZfVF9DX0hMUFIxKENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVKQotI2Vsc2UKLSMgIGlmZGVmIENVUkxfSVNPQ1BQCi0jICAgIGRlZmluZSBfX0NVUkxfT0ZGX1RfQ19ITFBSMihWYWwsU3VmZml4KSBWYWwgIyMgU3VmZml4Ci0jICBlbHNlCi0jICAgIGRlZmluZSBfX0NVUkxfT0ZGX1RfQ19ITFBSMihWYWwsU3VmZml4KSBWYWwvKiovU3VmZml4Ci0jICBlbmRpZgotIyAgZGVmaW5lIF9fQ1VSTF9PRkZfVF9DX0hMUFIxKFZhbCxTdWZmaXgpIF9fQ1VSTF9PRkZfVF9DX0hMUFIyKFZhbCxTdWZmaXgpCi0jICBkZWZpbmUgQ1VSTF9PRkZfVF9DKFZhbCkgIF9fQ1VSTF9PRkZfVF9DX0hMUFIxKFZhbCxDVVJMX1NVRkZJWF9DVVJMX09GRl9UKQotIyAgZGVmaW5lIENVUkxfT0ZGX1RVX0MoVmFsKSBfX0NVUkxfT0ZGX1RfQ19ITFBSMShWYWwsQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUpCi0jZW5kaWYKLQotLyoKLSAqIEdldCByaWQgb2YgbWFjcm9zIHByaXZhdGUgdG8gdGhpcyBoZWFkZXIgZmlsZS4KLSAqLwotCi0jdW5kZWYgQ3VybGNoa3N6RVEKLSN1bmRlZiBDdXJsY2hrc3pHRQotCi0jZW5kaWYgLyogX19DVVJMX0NVUkxSVUxFU19IICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2luY2x1ZGUvY3VybC9jdXJsdmVyLmggYi9VdGlsaXRpZXMvY21jdXJsL2luY2x1ZGUvY3VybC9jdXJsdmVyLmgKaW5kZXggNjY3YjdlYi4uMThkYzM1NiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvY3VybHZlci5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvaW5jbHVkZS9jdXJsL2N1cmx2ZXIuaApAQCAtMzAsMTMgKzMwLDEzIEBACiAKIC8qIFRoaXMgaXMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBsaWJjdXJsIHBhY2thZ2UgZnJvbSB3aGljaCB0aGlzIGhlYWRlcgogICAgZmlsZSBvcmlnaW5zOiAqLwotI2RlZmluZSBMSUJDVVJMX1ZFUlNJT04gIjcuNTQuMSIKKyNkZWZpbmUgTElCQ1VSTF9WRVJTSU9OICI3LjU2LjAiCiAKIC8qIFRoZSBudW1lcmljIHZlcnNpb24gbnVtYmVyIGlzIGFsc28gYXZhaWxhYmxlICJpbiBwYXJ0cyIgYnkgdXNpbmcgdGhlc2UKICAgIGRlZmluZXM6ICovCiAjZGVmaW5lIExJQkNVUkxfVkVSU0lPTl9NQUpPUiA3Ci0jZGVmaW5lIExJQkNVUkxfVkVSU0lPTl9NSU5PUiA1NAotI2RlZmluZSBMSUJDVVJMX1ZFUlNJT05fUEFUQ0ggMQorI2RlZmluZSBMSUJDVVJMX1ZFUlNJT05fTUlOT1IgNTYKKyNkZWZpbmUgTElCQ1VSTF9WRVJTSU9OX1BBVENIIDAKIAogLyogVGhpcyBpcyB0aGUgbnVtZXJpYyB2ZXJzaW9uIG9mIHRoZSBsaWJjdXJsIHZlcnNpb24gbnVtYmVyLCBtZWFudCBmb3IgZWFzaWVyCiAgICBwYXJzaW5nIGFuZCBjb21wYXJpb25zIGJ5IHByb2dyYW1zLiBUaGUgTElCQ1VSTF9WRVJTSU9OX05VTSBkZWZpbmUgd2lsbApAQCAtNTcsNyArNTcsNyBAQAogICAgQ1VSTF9WRVJTSU9OX0JJVFMoKSBtYWNybyBzaW5jZSBjdXJsJ3Mgb3duIGNvbmZpZ3VyZSBzY3JpcHQgZ3JlcHMgZm9yIGl0CiAgICBhbmQgbmVlZHMgaXQgdG8gY29udGFpbiB0aGUgZnVsbCBudW1iZXIuCiAqLwotI2RlZmluZSBMSUJDVVJMX1ZFUlNJT05fTlVNIDB4MDczNjAxCisjZGVmaW5lIExJQkNVUkxfVkVSU0lPTl9OVU0gMHgwNzM4MDAKIAogLyoKICAqIFRoaXMgaXMgdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgZnVsbCBzb3VyY2UgcGFja2FnZSB3YXMgY3JlYXRlZC4gVGhlCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2luY2x1ZGUvY3VybC9tdWx0aS5oIGIvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvbXVsdGkuaAppbmRleCBmOTNlNTExLi45MTFjOTFkIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2luY2x1ZGUvY3VybC9tdWx0aS5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvaW5jbHVkZS9jdXJsL211bHRpLmgKQEAgLTcsNyArNyw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvaW5jbHVkZS9jdXJsL3N5c3RlbS5oIGIvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvc3lzdGVtLmgKaW5kZXggZWQzYTU1Yy4uMzlkYWU3NSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvc3lzdGVtLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvc3lzdGVtLmgKQEAgLTIzLDE0ICsyMyw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogVGhpcyBoZWFkZXIgaXMgc3VwcG9zZWQgdG8gZXZlbnR1YWxseSByZXBsYWNlIGN1cmxidWlsZC5oLiBUaGlzIGxpdHRsZSBvbmUKLSAqIGlzIHN0aWxsIGxlYXJuaW5nLiAgRHVyaW5nIHRoZSBleHBlcmltZW50YWwgcGhhc2UsIHRoaXMgaGVhZGVyIGZpbGVzCi0gKiBkZWZpbmVzIHN5bWJvbHMgdXNpbmcgdGhlIHByZWZpeGVzIENVUkxTWVNfIG9yIGN1cmxzeXNfLiBXaGVuIHdlIGZlZWwKLSAqIGNvbmZpZGVudCBlbm91Z2gsIHdlIHJlcGxhY2UgY3VybGJ1aWxkLmggd2l0aCB0aGlzIGZpbGUgYW5kIHJlbmFtZSBhbGwKLSAqIHByZWZpeGVzIHRvIENVUkxfIGFuZCBjdXJsXy4KLSAqLwotCi0vKgogICogVHJ5IHRvIGtlZXAgb25lIHNlY3Rpb24gcGVyIHBsYXRmb3JtLCBjb21waWxlciBhbmQgYXJjaGl0ZWN0dXJlLCBvdGhlcndpc2UsCiAgKiBpZiBhbiBleGlzdGluZyBzZWN0aW9uIGlzIHJldXNlZCBmb3IgYSBkaWZmZXJlbnQgb25lIGFuZCBsYXRlciBvbiB0aGUKICAqIG9yaWdpbmFsIGlzIGFkanVzdGVkLCBwcm9iYWJseSB0aGUgcGlnZ3liYWNraW5nIG9uZSBjYW4gYmUgYWR2ZXJzZWx5CkBAIC02MCwzMjMgKzUyLDI3MSBAQAogCiAjaWYgZGVmaW5lZChfX0RKR1BQX18pIHx8IGRlZmluZWQoX19HTzMyX18pCiAjICBpZiBkZWZpbmVkKF9fREpHUFBfXykgJiYgKF9fREpHUFBfXyA+IDEpCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9MT05HICAgICAgICAgICA0Ci0jICAgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nIGxvbmcKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsbGQiCi0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibGx1IgotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgOAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTEwKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMTAorIyAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZyBsb25nCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGxkIgorIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImxsdSIKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTEwKICMgIGVsc2UKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAogIyAgZW5kaWYKLSMgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCA0CisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgaW50CiAKICNlbGlmIGRlZmluZWQoX19TQUxGT1JEQ19fKQotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCi0jICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgotIyAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA0Ci0jICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAotIyAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCi0jICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgaW50Ci0jICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QgNAorIyAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKKyMgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCisjICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgorIyAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKKyMgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAorIyAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGludAogCiAjZWxpZiBkZWZpbmVkKF9fQk9STEFORENfXykKICMgIGlmIChfX0JPUkxBTkRDX18gPCAweDUyMCkKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAogIyAgZWxzZQotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgX19pbnQ2NAotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgIkk2NGQiCi0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAiSTY0dSIKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDgKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIGk2NAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgdWk2NAorIyAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgX19pbnQ2NAorIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgIkk2NGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAiSTY0dSIKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIGk2NAorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgdWk2NAogIyAgZW5kaWYKLSMgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCA0CisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgaW50CiAKICNlbGlmIGRlZmluZWQoX19UVVJCT0NfXykKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9MT05HICAgICAgICAgICA0Ci0jICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZwotIyAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKLSMgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCi0jICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgNAotIyAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKLSMgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAotIyAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGludAotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfU09DS0xFTl9UIDQKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCisjICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgorIyAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKKyMgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCisjICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUwKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKIAogI2VsaWYgZGVmaW5lZChfX1dBVENPTUNfXykKICMgIGlmIGRlZmluZWQoX18zODZfXykKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIF9faW50NjQKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJJNjRkIgotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgIkk2NHUiCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA4Ci0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBpNjQKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIHVpNjQKKyMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIF9faW50NjQKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJJNjRkIgorIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgIkk2NHUiCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBpNjQKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIHVpNjQKICMgIGVsc2UKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAogIyAgZW5kaWYKLSMgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCA0CisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgaW50CiAKICNlbGlmIGRlZmluZWQoX19QT0NDX18pCiAjICBpZiAoX19QT0NDX18gPCAyODApCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9MT05HICAgICAgICAgICA0Ci0jICAgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCi0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCi0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA0Ci0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCi0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAorIyAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZworIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgorIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUwKICMgIGVsaWYgZGVmaW5lZChfTVNDX1ZFUikKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIF9faW50NjQKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJJNjRkIgotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgIkk2NHUiCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA4Ci0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBpNjQKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIHVpNjQKKyMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIF9faW50NjQKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJJNjRkIgorIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgIkk2NHUiCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBpNjQKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIHVpNjQKICMgIGVsc2UKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcgbG9uZwotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA4Ci0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nIGxvbmcKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsbGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibGx1IgorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTEwKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMTAogIyAgZW5kaWYKLSMgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCA0CisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgaW50CiAKICNlbGlmIGRlZmluZWQoX19MQ0NfXykKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9MT05HICAgICAgICAgICA0Ci0jICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZwotIyAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKLSMgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCi0jICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgNAotIyAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKLSMgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAotIyAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGludAotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfU09DS0xFTl9UIDQKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCisjICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgorIyAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKKyMgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCisjICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUwKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKIAogI2VsaWYgZGVmaW5lZChfX1NZTUJJQU4zMl9fKQogIyAgaWYgZGVmaW5lZChfX0VBQklfXykgIC8qIFRyZWF0IGFsbCBBUk0gY29tcGlsZXJzIGVxdWFsbHkgKi8KLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcgbG9uZwotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA4Ci0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nIGxvbmcKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsbGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibGx1IgorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTEwKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMTAogIyAgZWxpZiBkZWZpbmVkKF9fQ1czMl9fKQogIyAgICBwcmFnbWEgbG9uZ2xvbmcgb24KLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcgbG9uZwotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA4Ci0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nIGxvbmcKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsbGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibGx1IgorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTEwKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMTAogIyAgZWxpZiBkZWZpbmVkKF9fVkMzMl9fKQotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgX19pbnQ2NAotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA4Ci0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBfX2ludDY0CisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGxkIgorIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImxsdSIKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTEwKICMgIGVuZGlmCi0jICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgdW5zaWduZWQgaW50Ci0jICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QgNAorIyAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UIHVuc2lnbmVkIGludAogCiAjZWxpZiBkZWZpbmVkKF9fTVdFUktTX18pCi0jICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAotIyAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcgbG9uZwotIyAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsbGQiCi0jICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImxsdSIKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA4Ci0jICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTEwKLSMgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTEwKLSMgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCA0CisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZyBsb25nCisjICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKKyMgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibGx1IgorIyAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCisjICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgaW50CiAKICNlbGlmIGRlZmluZWQoX1dJTjMyX1dDRSkKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9MT05HICAgICAgICAgICA0Ci0jICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgX19pbnQ2NAotIyAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJJNjRkIgotIyAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJJNjR1IgotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDgKLSMgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBpNjQKLSMgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICB1aTY0Ci0jICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgaW50Ci0jICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QgNAorIyAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIF9faW50NjQKKyMgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAiSTY0ZCIKKyMgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAiSTY0dSIKKyMgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBpNjQKKyMgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICB1aTY0CisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgaW50CiAKICNlbGlmIGRlZmluZWQoX19NSU5HVzMyX18pCi0jICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAotIyAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcgbG9uZwotIyAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJJNjRkIgotIyAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJJNjR1IgotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDgKLSMgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAotIyAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMTAotIyAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfU09DS0xFTl9UIHNvY2tsZW5fdAotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfU09DS0xFTl9UIDQKLSMgIGRlZmluZSBDVVJMU1lTX1BVTExfU1lTX1RZUEVTX0ggICAgICAxCi0jICBkZWZpbmUgQ1VSTFNZU19QVUxMX1dTMlRDUElQX0ggICAgICAgMQorIyAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcgbG9uZworIyAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJJNjRkIgorIyAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJJNjR1IgorIyAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCisjICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1Qgc29ja2xlbl90CisjICBkZWZpbmUgQ1VSTF9QVUxMX1NZU19UWVBFU19IICAgICAgMQorIyAgZGVmaW5lIENVUkxfUFVMTF9XUzJUQ1BJUF9IICAgICAgIDEKIAogI2VsaWYgZGVmaW5lZChfX1ZNUykKICMgIGlmIGRlZmluZWQoX19WQVgpCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9MT05HICAgICAgICAgICA0Ci0jICAgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCi0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCi0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA0Ci0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCi0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAorIyAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZworIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgorIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUwKICMgIGVsc2UKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcgbG9uZwotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA4Ci0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nIGxvbmcKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsbGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibGx1IgorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTEwKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMTAogIyAgZW5kaWYKLSMgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCB1bnNpZ25lZCBpbnQKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCA0CisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgdW5zaWduZWQgaW50CiAKICNlbGlmIGRlZmluZWQoX19PUzQwMF9fKQogIyAgaWYgZGVmaW5lZChfX0lMRUM0MDBfXykKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcgbG9uZwotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA4Ci0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCi0jICAgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBzb2NrbGVuX3QKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfU09DS0xFTl9UIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfUFVMTF9TWVNfVFlQRVNfSCAgICAgIDEKLSMgICAgZGVmaW5lIENVUkxTWVNfUFVMTF9TWVNfU09DS0VUX0ggICAgIDEKKyMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcgbG9uZworIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBzb2NrbGVuX3QKKyMgICAgZGVmaW5lIENVUkxfUFVMTF9TWVNfVFlQRVNfSCAgICAgIDEKKyMgICAgZGVmaW5lIENVUkxfUFVMTF9TWVNfU09DS0VUX0ggICAgIDEKICMgIGVuZGlmCiAKICNlbGlmIGRlZmluZWQoX19NVlNfXykKICMgIGlmIGRlZmluZWQoX19JQk1DX18pIHx8IGRlZmluZWQoX19JQk1DUFBfXykKICMgICAgaWYgZGVmaW5lZChfSUxQMzIpCi0jICAgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKICMgICAgZWxpZiBkZWZpbmVkKF9MUDY0KQotIyAgICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9MT05HICAgICAgICAgICA4CiAjICAgIGVuZGlmCiAjICAgIGlmIGRlZmluZWQoX0xPTkdfTE9ORykKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZyBsb25nCi0jICAgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsbGQiCi0jICAgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCi0jICAgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDgKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTEwKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCisjICAgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcgbG9uZworIyAgICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGxkIgorIyAgICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibGx1IgorIyAgICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAorIyAgICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTEwKICMgICAgZWxpZiBkZWZpbmVkKF9MUDY0KQotIyAgICAgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCi0jICAgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgotIyAgICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA4Ci0jICAgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUwKKyMgICAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZworIyAgICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCisjICAgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKKyMgICAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAorIyAgICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAogIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgotIyAgICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCi0jICAgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDQKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAotIyAgICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAorIyAgICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCisjICAgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKKyMgICAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgorIyAgICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCisjICAgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCiAjICAgIGVuZGlmCi0jICAgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBzb2NrbGVuX3QKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfU09DS0xFTl9UIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfUFVMTF9TWVNfVFlQRVNfSCAgICAgIDEKLSMgICAgZGVmaW5lIENVUkxTWVNfUFVMTF9TWVNfU09DS0VUX0ggICAgIDEKKyMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UIHNvY2tsZW5fdAorIyAgICBkZWZpbmUgQ1VSTF9QVUxMX1NZU19UWVBFU19IICAgICAgMQorIyAgICBkZWZpbmUgQ1VSTF9QVUxMX1NZU19TT0NLRVRfSCAgICAgMQogIyAgZW5kaWYKIAogI2VsaWYgZGVmaW5lZChfXzM3MF9fKQogIyAgaWYgZGVmaW5lZChfX0lCTUNfXykgfHwgZGVmaW5lZChfX0lCTUNQUF9fKQogIyAgICBpZiBkZWZpbmVkKF9JTFAzMikKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAogIyAgICBlbGlmIGRlZmluZWQoX0xQNjQpCi0jICAgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDgKICMgICAgZW5kaWYKICMgICAgaWYgZGVmaW5lZChfTE9OR19MT05HKQotIyAgICAgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nIGxvbmcKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImxsdSIKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgOAotIyAgICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAotIyAgICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTEwKKyMgICAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZyBsb25nCisjICAgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsbGQiCisjICAgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCisjICAgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCisjICAgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMTAogIyAgICBlbGlmIGRlZmluZWQoX0xQNjQpCi0jICAgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgotIyAgICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCi0jICAgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDgKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAotIyAgICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAorIyAgICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCisjICAgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKKyMgICAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgorIyAgICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCisjICAgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCiAjICAgIGVsc2UKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZwotIyAgICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCi0jICAgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgNAotIyAgICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCi0jICAgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCisjICAgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKKyMgICAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgorIyAgICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCisjICAgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKKyMgICAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUwKICMgICAgZW5kaWYKLSMgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfU09DS0xFTl9UIHNvY2tsZW5fdAotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19QVUxMX1NZU19UWVBFU19IICAgICAgMQotIyAgICBkZWZpbmUgQ1VSTFNZU19QVUxMX1NZU19TT0NLRVRfSCAgICAgMQorIyAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1Qgc29ja2xlbl90CisjICAgIGRlZmluZSBDVVJMX1BVTExfU1lTX1RZUEVTX0ggICAgICAxCisjICAgIGRlZmluZSBDVVJMX1BVTExfU1lTX1NPQ0tFVF9IICAgICAxCiAjICBlbmRpZgogCiAjZWxpZiBkZWZpbmVkKFRQRikKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9MT05HICAgICAgICAgICA4Ci0jICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZwotIyAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKLSMgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCi0jICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgOAotIyAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKLSMgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAotIyAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGludAotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfU09DS0xFTl9UIDQKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCisjICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgorIyAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKKyMgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCisjICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUwKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKIAogI2VsaWYgZGVmaW5lZChfX1RJTllDX18pIC8qIGFsc28ga25vd24gYXMgdGNjICovCiAKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9MT05HICAgICAgICAgICA0Ci0jICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZyBsb25nCi0jICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKLSMgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibGx1IgotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDgKLSMgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAotIyAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMTAotIyAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfU09DS0xFTl9UIHNvY2tsZW5fdAotIyAgZGVmaW5lIENVUkxTWVNfUFVMTF9TWVNfVFlQRVNfSCAgICAgIDEKLSMgIGRlZmluZSBDVVJMU1lTX1BVTExfU1lTX1NPQ0tFVF9IICAgICAxCisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZyBsb25nCisjICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKKyMgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibGx1IgorIyAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCisjICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1Qgc29ja2xlbl90CisjICBkZWZpbmUgQ1VSTF9QVUxMX1NZU19UWVBFU19IICAgICAgMQorIyAgZGVmaW5lIENVUkxfUFVMTF9TWVNfU09DS0VUX0ggICAgIDEKKworI2VsaWYgZGVmaW5lZChfX1NVTlBST19DKSAvKiBPcmFjbGUgU29sYXJpcyBTdHVkaW8gKi8KKyMgIGlmICFkZWZpbmVkKF9fTFA2NCkgJiYgKGRlZmluZWQoX19JTFAzMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9fc3BhcmN2OCkpCisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nIGxvbmcKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsbGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibGx1IgorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTEwKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMTAorIyAgZWxpZiBkZWZpbmVkKF9fTFA2NCkgfHwgXAorICAgICAgICBkZWZpbmVkKF9fYW1kNjQpIHx8IGRlZmluZWQoX19zcGFyY3Y5KQorIyAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZworIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgorIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUwKKyMgIGVuZGlmCisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1Qgc29ja2xlbl90CisjICBkZWZpbmUgQ1VSTF9QVUxMX1NZU19UWVBFU19IICAgICAgMQorIyAgZGVmaW5lIENVUkxfUFVMTF9TWVNfU09DS0VUX0ggICAgIDEKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgS0VFUCBNU1ZDIFRIRSBQRU5VTFRJTUFURSBFTlRSWSAgICAqLwpAQCAtMzg0LDEwMSArMzI0LDE0OCBAQAogCiAjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQogIyAgaWYgKF9NU0NfVkVSID49IDkwMCkgJiYgKF9JTlRFR1JBTF9NQVhfQklUUyA+PSA2NCkKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIF9faW50NjQKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJJNjRkIgotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgIkk2NHUiCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA4Ci0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBpNjQKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIHVpNjQKKyMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIF9faW50NjQKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJJNjRkIgorIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgIkk2NHUiCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBpNjQKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIHVpNjQKICMgIGVsc2UKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAogIyAgZW5kaWYKLSMgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCA0CisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgaW50CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgIEtFRVAgR0VORVJJQyBHQ0MgVEhFIExBU1QgRU5UUlkgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAogI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKLSMgIGlmICFkZWZpbmVkKF9fTFA2NF9fKSAmJiAoZGVmaW5lZChfX0lMUDMyX18pIHx8IFwKLSAgICAgIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19wcGNfXykgfHwgZGVmaW5lZChfX2FybV9fKSB8fCBcCi0gICAgICBkZWZpbmVkKF9fc3BhcmNfXykgfHwgZGVmaW5lZChfX21pcHNfXykgfHwgZGVmaW5lZChfX3NoX18pKQotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZyBsb25nCi0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGxkIgotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImxsdSIKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDgKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCi0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTEwKKyMgIGlmICFkZWZpbmVkKF9fTFA2NF9fKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGRlZmluZWQoX19JTFAzMl9fKSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9faHBwYV9fKSB8fCAgICAgIFwKKyAgIGRlZmluZWQoX19wcGNfXykgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX2FybV9fKSB8fCAgICAgIFwKKyAgIGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9fbWlwc19fKSB8fCBkZWZpbmVkKF9fc2hfXykgfHwgICAgICAgIFwKKyAgIGRlZmluZWQoX19YVEVOU0FfXykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIChkZWZpbmVkKF9fU0laRU9GX0xPTkdfXykgJiYgX19TSVpFT0ZfTE9OR19fID09IDQpKQorIyAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZyBsb25nCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGxkIgorIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImxsdSIKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTEwKICMgIGVsaWYgZGVmaW5lZChfX0xQNjRfXykgfHwgXAotICAgICAgICBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19wcGM2NF9fKSB8fCBkZWZpbmVkKF9fc3BhcmM2NF9fKQotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgOAotIyAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZwotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgOAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUwKKyAgICAgICAgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9fcHBjNjRfXykgfHwgZGVmaW5lZChfX3NwYXJjNjRfXykgfHwgXAorICAgICAgICAoZGVmaW5lZChfX1NJWkVPRl9MT05HX18pICYmIF9fU0laRU9GX0xPTkdfXyA9PSA4KQorIyAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZworIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgorIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUwKICMgIGVuZGlmCi0jICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9TT0NLTEVOX1Qgc29ja2xlbl90Ci0jICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QgNAotIyAgZGVmaW5lIENVUkxTWVNfUFVMTF9TWVNfVFlQRVNfSCAgICAgIDEKLSMgIGRlZmluZSBDVVJMU1lTX1BVTExfU1lTX1NPQ0tFVF9IICAgICAxCisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1Qgc29ja2xlbl90CisjICBkZWZpbmUgQ1VSTF9QVUxMX1NZU19UWVBFU19IICAgICAgMQorIyAgZGVmaW5lIENVUkxfUFVMTF9TWVNfU09DS0VUX0ggICAgIDEKIAogI2Vsc2UKIC8qIGdlbmVyaWMgInNhZmUgZ3Vlc3MiIG9uIG9sZCAzMiBiaXQgc3R5bGUgKi8KLSMgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgNAotIyBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QgNAotIyBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCA0Ci0jIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCi0jIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCi0jIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCi0jIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCi0jIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAotIyBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgaW50CisjIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCisjIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCisjIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCisjIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCisjIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAorIyBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgaW50CiAjZW5kaWYKIAotLyogQ1VSTFNZU19QVUxMX1dTMlRDUElQX0ggaXMgZGVmaW5lZCBhYm92ZSB3aGVuIGluY2x1c2lvbiBvZiBoZWFkZXIgZmlsZSAgKi8KKyNpZmRlZiBfQUlYCisvKiBBSVggbmVlZHMgPHN5cy9wb2xsLmg+ICovCisjZGVmaW5lIENVUkxfUFVMTF9TWVNfUE9MTF9ICisjZW5kaWYKKworCisvKiBDVVJMX1BVTExfV1MyVENQSVBfSCBpcyBkZWZpbmVkIGFib3ZlIHdoZW4gaW5jbHVzaW9uIG9mIGhlYWRlciBmaWxlICAqLwogLyogd3MydGNwaXAuaCBpcyByZXF1aXJlZCBoZXJlIHRvIHByb3Blcmx5IG1ha2UgdHlwZSBkZWZpbml0aW9ucyBiZWxvdy4gKi8KLSNpZmRlZiBDVVJMU1lTX1BVTExfV1MyVENQSVBfSAotIyAgaWZuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KLSMgICAgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSMgIGVuZGlmCi0jICBpbmNsdWRlIDx3aW5kb3dzLmg+CisjaWZkZWYgQ1VSTF9QVUxMX1dTMlRDUElQX0gKICMgIGluY2x1ZGUgPHdpbnNvY2syLmg+CisjICBpbmNsdWRlIDx3aW5kb3dzLmg+CiAjICBpbmNsdWRlIDx3czJ0Y3BpcC5oPgogI2VuZGlmCiAKLS8qIENVUkxTWVNfUFVMTF9TWVNfVFlQRVNfSCBpcyBkZWZpbmVkIGFib3ZlIHdoZW4gaW5jbHVzaW9uIG9mIGhlYWRlciBmaWxlICAqLworLyogQ1VSTF9QVUxMX1NZU19UWVBFU19IIGlzIGRlZmluZWQgYWJvdmUgd2hlbiBpbmNsdXNpb24gb2YgaGVhZGVyIGZpbGUgICovCiAvKiBzeXMvdHlwZXMuaCBpcyByZXF1aXJlZCBoZXJlIHRvIHByb3Blcmx5IG1ha2UgdHlwZSBkZWZpbml0aW9ucyBiZWxvdy4gKi8KLSNpZmRlZiBDVVJMU1lTX1BVTExfU1lTX1RZUEVTX0gKKyNpZmRlZiBDVVJMX1BVTExfU1lTX1RZUEVTX0gKICMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgogI2VuZGlmCiAKLS8qIENVUkxTWVNfUFVMTF9TWVNfU09DS0VUX0ggaXMgZGVmaW5lZCBhYm92ZSB3aGVuIGluY2x1c2lvbiBvZiBoZWFkZXIgZmlsZSAgKi8KKy8qIENVUkxfUFVMTF9TWVNfU09DS0VUX0ggaXMgZGVmaW5lZCBhYm92ZSB3aGVuIGluY2x1c2lvbiBvZiBoZWFkZXIgZmlsZSAgKi8KIC8qIHN5cy9zb2NrZXQuaCBpcyByZXF1aXJlZCBoZXJlIHRvIHByb3Blcmx5IG1ha2UgdHlwZSBkZWZpbml0aW9ucyBiZWxvdy4gKi8KLSNpZmRlZiBDVVJMU1lTX1BVTExfU1lTX1NPQ0tFVF9ICisjaWZkZWYgQ1VSTF9QVUxMX1NZU19TT0NLRVRfSAogIyAgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogI2VuZGlmCiAKKy8qIENVUkxfUFVMTF9TWVNfUE9MTF9IIGlzIGRlZmluZWQgYWJvdmUgd2hlbiBpbmNsdXNpb24gb2YgaGVhZGVyIGZpbGUgICAgKi8KKy8qIHN5cy9wb2xsLmggaXMgcmVxdWlyZWQgaGVyZSB0byBwcm9wZXJseSBtYWtlIHR5cGUgZGVmaW5pdGlvbnMgYmVsb3cuICAgKi8KKyNpZmRlZiBDVVJMX1BVTExfU1lTX1BPTExfSAorIyAgaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbmRpZgorCiAvKiBEYXRhIHR5cGUgZGVmaW5pdGlvbiBvZiBjdXJsX3NvY2tsZW5fdC4gKi8KLSNpZmRlZiBDVVJMU1lTX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVAotICB0eXBlZGVmIENVUkxTWVNfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGN1cmxzeXNfc29ja2xlbl90OworI2lmZGVmIENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UCisgIHR5cGVkZWYgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgY3VybF9zb2NrbGVuX3Q7CiAjZW5kaWYKIAogLyogRGF0YSB0eXBlIGRlZmluaXRpb24gb2YgY3VybF9vZmZfdC4gKi8KIAotI2lmZGVmIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QKLSAgdHlwZWRlZiBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UIGN1cmxzeXNfb2ZmX3Q7CisjaWZkZWYgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVAorICB0eXBlZGVmIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgY3VybF9vZmZfdDsKKyNlbmRpZgorCisvKgorICogQ1VSTF9JU09DUFAgYW5kIENVUkxfT0ZGX1RfQyBkZWZpbml0aW9ucyBhcmUgZG9uZSBoZXJlIGluIG9yZGVyIHRvIGFsbG93CisgKiB0aGVzZSB0byBiZSB2aXNpYmxlIGFuZCBleHBvcnRlZCBieSB0aGUgZXh0ZXJuYWwgbGliY3VybCBpbnRlcmZhY2UgQVBJLAorICogd2hpbGUgYWxzbyBtYWtpbmcgdGhlbSB2aXNpYmxlIHRvIHRoZSBsaWJyYXJ5IGludGVybmFscywgc2ltcGx5IGluY2x1ZGluZworICogY3VybF9zZXR1cC5oLCB3aXRob3V0IGFjdHVhbGx5IG5lZWRpbmcgdG8gaW5jbHVkZSBjdXJsLmggaW50ZXJuYWxseS4KKyAqIElmIHNvbWUgZGF5IHRoaXMgc2VjdGlvbiB3b3VsZCBncm93IGJpZyBlbm91Z2gsIGFsbCB0aGlzIHNob3VsZCBiZSBtb3ZlZAorICogdG8gaXRzIG93biBoZWFkZXIgZmlsZS4KKyAqLworCisvKgorICogRmlndXJlIG91dCBpZiB3ZSBjYW4gdXNlIHRoZSAjIyBwcmVwcm9jZXNzb3Igb3BlcmF0b3IsIHdoaWNoIGlzIHN1cHBvcnRlZAorICogYnkgSVNPL0FOU0kgQyBhbmQgQysrLiBTb21lIGNvbXBpbGVycyBzdXBwb3J0IGl0IHdpdGhvdXQgc2V0dGluZyBfX1NURENfXworICogb3IgIF9fY3BsdXNwbHVzIHNvIHdlIG5lZWQgdG8gY2FyZWZ1bGx5IGNoZWNrIGZvciB0aGVtIHRvby4KKyAqLworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgXAorICBkZWZpbmVkKF9fSFBfYUNDKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykgfHwgZGVmaW5lZChfX0xDQ19fKSB8fCBcCisgIGRlZmluZWQoX19QT0NDX18pIHx8IGRlZmluZWQoX19TQUxGT1JEQ19fKSB8fCBkZWZpbmVkKF9fSElHSENfXykgfHwgXAorICBkZWZpbmVkKF9fSUxFQzQwMF9fKQorICAvKiBUaGlzIGNvbXBpbGVyIGlzIGJlbGlldmVkIHRvIGhhdmUgYW4gSVNPIGNvbXBhdGlibGUgcHJlcHJvY2Vzc29yICovCisjZGVmaW5lIENVUkxfSVNPQ1BQCisjZWxzZQorICAvKiBUaGlzIGNvbXBpbGVyIGlzIGJlbGlldmVkIE5PVCB0byBoYXZlIGFuIElTTyBjb21wYXRpYmxlIHByZXByb2Nlc3NvciAqLworI3VuZGVmIENVUkxfSVNPQ1BQCisjZW5kaWYKKworLyoKKyAqIE1hY3JvcyBmb3IgbWluaW11bS13aWR0aCBzaWduZWQgYW5kIHVuc2lnbmVkIGN1cmxfb2ZmX3QgaW50ZWdlciBjb25zdGFudHMuCisgKi8KKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiAoX19CT1JMQU5EQ19fID09IDB4MDU1MSkKKyMgIGRlZmluZSBfX0NVUkxfT0ZGX1RfQ19ITFBSMih4KSB4CisjICBkZWZpbmUgX19DVVJMX09GRl9UX0NfSExQUjEoeCkgX19DVVJMX09GRl9UX0NfSExQUjIoeCkKKyMgIGRlZmluZSBDVVJMX09GRl9UX0MoVmFsKSAgX19DVVJMX09GRl9UX0NfSExQUjEoVmFsKSAjIyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQ1VSTF9PRkZfVF9DX0hMUFIxKENVUkxfU1VGRklYX0NVUkxfT0ZGX1QpCisjICBkZWZpbmUgQ1VSTF9PRkZfVFVfQyhWYWwpIF9fQ1VSTF9PRkZfVF9DX0hMUFIxKFZhbCkgIyMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0NVUkxfT0ZGX1RfQ19ITFBSMShDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSkKKyNlbHNlCisjICBpZmRlZiBDVVJMX0lTT0NQUAorIyAgICBkZWZpbmUgX19DVVJMX09GRl9UX0NfSExQUjIoVmFsLFN1ZmZpeCkgVmFsICMjIFN1ZmZpeAorIyAgZWxzZQorIyAgICBkZWZpbmUgX19DVVJMX09GRl9UX0NfSExQUjIoVmFsLFN1ZmZpeCkgVmFsLyoqL1N1ZmZpeAorIyAgZW5kaWYKKyMgIGRlZmluZSBfX0NVUkxfT0ZGX1RfQ19ITFBSMShWYWwsU3VmZml4KSBfX0NVUkxfT0ZGX1RfQ19ITFBSMihWYWwsU3VmZml4KQorIyAgZGVmaW5lIENVUkxfT0ZGX1RfQyhWYWwpICBfX0NVUkxfT0ZGX1RfQ19ITFBSMShWYWwsQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCkKKyMgIGRlZmluZSBDVVJMX09GRl9UVV9DKFZhbCkgX19DVVJMX09GRl9UX0NfSExQUjEoVmFsLENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVKQogI2VuZGlmCiAKICNlbmRpZiAvKiBfX0NVUkxfU1lTVEVNX0ggKi8KLQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvdHlwZWNoZWNrLWdjYy5oIGIvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvdHlwZWNoZWNrLWdjYy5oCmluZGV4IDEwYjVkZTIuLjEwYzc0YzcgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvaW5jbHVkZS9jdXJsL3R5cGVjaGVjay1nY2MuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2luY2x1ZGUvY3VybC90eXBlY2hlY2stZ2NjLmgKQEAgLTk2LDYgKzk2LDkgQEAKICAgICBpZigoX2N1cmxfb3B0KSA9PSBDVVJMT1BUX0hUVFBQT1NUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIGlmKCFfY3VybF9pc19hcnIoKHZhbHVlKSwgc3RydWN0IGN1cmxfaHR0cHBvc3QpKSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgX2N1cmxfZWFzeV9zZXRvcHRfZXJyX2N1cmxfaHR0cG9zdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZigoX2N1cmxfb3B0KSA9PSBDVVJMT1BUX01JTUVQT1NUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmKCFfY3VybF9pc19wdHIoKHZhbHVlKSwgY3VybF9taW1lKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX2N1cmxfZWFzeV9zZXRvcHRfZXJyX2N1cmxfbWltZXBvc3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBpZihfY3VybF9pc19zbGlzdF9vcHRpb24oX2N1cmxfb3B0KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIGlmKCFfY3VybF9pc19hcnIoKHZhbHVlKSwgc3RydWN0IGN1cmxfc2xpc3QpKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgX2N1cmxfZWFzeV9zZXRvcHRfZXJyX2N1cmxfc2xpc3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTExMCw3ICsxMTMsNyBAQAogLyogRklYTUU6IGRvbid0IGFsbG93IGNvbnN0IHBvaW50ZXJzICovCiAjZGVmaW5lIGN1cmxfZWFzeV9nZXRpbmZvKGhhbmRsZSwgaW5mbywgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiBfX2V4dGVuc2lvbl9fICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIF9fdHlwZW9mX18oaW5mbykgX2N1cmxfaW5mbyA9IGluZm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX190eXBlb2ZfXyhpbmZvKSBfY3VybF9pbmZvID0gaW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgaWYoX19idWlsdGluX2NvbnN0YW50X3AoX2N1cmxfaW5mbykpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBpZihfY3VybF9pc19zdHJpbmdfaW5mbyhfY3VybF9pbmZvKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIGlmKCFfY3VybF9pc19hcnIoKGFyZyksIGNoYXIgKikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTEzMCw5ICsxMzMsMTIgQEAKICAgICBpZihfY3VybF9pc19jZXJ0aW5mb19pbmZvKF9jdXJsX2luZm8pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIGlmKCFfY3VybF9pc19hcnIoKGFyZyksIHN0cnVjdCBjdXJsX2NlcnRpbmZvICopKSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgX2N1cmxfZWFzeV9nZXRpbmZvX2Vycl9jdXJsX2NlcnRpbmZvKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIGlmKF9jdXJsX2lzX3NvY2tldF9pbmZvKF9jdXJsX2luZm8pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZihfY3VybF9pc19zb2NrZXRfaW5mbyhfY3VybF9pbmZvKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIGlmKCFfY3VybF9pc19hcnIoKGFyZyksIGN1cmxfc29ja2V0X3QpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgX2N1cmxfZWFzeV9nZXRpbmZvX2Vycl9jdXJsX3NvY2tldCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZihfY3VybF9pc19vZmZfdF9pbmZvKF9jdXJsX2luZm8pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmKCFfY3VybF9pc19hcnIoKGFyZyksIGN1cmxfb2ZmX3QpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX2N1cmxfZWFzeV9nZXRpbmZvX2Vycl9jdXJsX29mZl90KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgY3VybF9lYXN5X2dldGluZm8oaGFuZGxlLCBfY3VybF9pbmZvLCBhcmcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0pCkBAIC0xOTcsNiArMjAzLDkgQEAKIF9DVVJMX1dBUk5JTkcoX2N1cmxfZWFzeV9zZXRvcHRfZXJyX2N1cmxfaHR0cG9zdCwKICAgICAgICAgICAgICAgImN1cmxfZWFzeV9zZXRvcHQgZXhwZWN0cyBhICdzdHJ1Y3QgY3VybF9odHRwcG9zdCAqJyAiCiAgICAgICAgICAgICAgICJhcmd1bWVudCBmb3IgdGhpcyBvcHRpb24iKQorX0NVUkxfV0FSTklORyhfY3VybF9lYXN5X3NldG9wdF9lcnJfY3VybF9taW1lcG9zdCwKKyAgICAgICAgICAgICAgImN1cmxfZWFzeV9zZXRvcHQgZXhwZWN0cyBhICdjdXJsX21pbWUgKicgIgorICAgICAgICAgICAgICAiYXJndW1lbnQgZm9yIHRoaXMgb3B0aW9uIikKIF9DVVJMX1dBUk5JTkcoX2N1cmxfZWFzeV9zZXRvcHRfZXJyX2N1cmxfc2xpc3QsCiAgICJjdXJsX2Vhc3lfc2V0b3B0IGV4cGVjdHMgYSAnc3RydWN0IGN1cmxfc2xpc3QgKicgYXJndW1lbnQgZm9yIHRoaXMgb3B0aW9uIikKIF9DVVJMX1dBUk5JTkcoX2N1cmxfZWFzeV9zZXRvcHRfZXJyX0NVUkxTSCwKQEAgLTIxOCw2ICsyMjcsOCBAQAogICAgICAgICAgICAgICAiJ3N0cnVjdCBjdXJsX2NlcnRpbmZvIConIGZvciB0aGlzIGluZm8iKQogX0NVUkxfV0FSTklORyhfY3VybF9lYXN5X2dldGluZm9fZXJyX2N1cmxfc29ja2V0LAogICAiY3VybF9lYXN5X2dldGluZm8gZXhwZWN0cyBhIHBvaW50ZXIgdG8gY3VybF9zb2NrZXRfdCBmb3IgdGhpcyBpbmZvIikKK19DVVJMX1dBUk5JTkcoX2N1cmxfZWFzeV9nZXRpbmZvX2Vycl9jdXJsX29mZl90LAorICAiY3VybF9lYXN5X2dldGluZm8gZXhwZWN0cyBhIHBvaW50ZXIgdG8gY3VybF9vZmZfdCBmb3IgdGhpcyBpbmZvIikKIAogLyogZ3JvdXBzIG9mIGN1cmxfZWFzeV9zZXRvcHMgb3B0aW9ucyB0aGF0IHRha2UgdGhlIHNhbWUgdHlwZSBvZiBhcmd1bWVudCAqLwogCkBAIC0zOTEsNyArNDAyLDExIEBACiAKIC8qIHRydWUgaWYgaW5mbyBleHBlY3RzIGEgcG9pbnRlciB0byBzdHJ1Y3QgY3VybF9zb2NrZXRfdCBhcmd1bWVudCAqLwogI2RlZmluZSBfY3VybF9pc19zb2NrZXRfaW5mbyhpbmZvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoQ1VSTElORk9fU09DS0VUIDwgKGluZm8pKQorICAoQ1VSTElORk9fU09DS0VUIDwgKGluZm8pICYmIChpbmZvKSA8IENVUkxJTkZPX09GRl9UKQorCisvKiB0cnVlIGlmIGluZm8gZXhwZWN0cyBhIHBvaW50ZXIgdG8gY3VybF9vZmZfdCBhcmd1bWVudCAqLworI2RlZmluZSBfY3VybF9pc19vZmZfdF9pbmZvKGluZm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQ1VSTElORk9fT0ZGX1QgPCAoaW5mbykpCiAKIAogLyogdHlwZWNoZWNrIGhlbHBlcnMgLS0gY2hlY2sgd2hldGhlciBnaXZlbiBleHByZXNzaW9uIGhhcyByZXF1ZXN0ZWQgdHlwZSovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9DTWFrZUxpc3RzLnR4dCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL0NNYWtlTGlzdHMudHh0CmluZGV4IDc2ZGQ2YzYuLmYzZDkwODQgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL0NNYWtlTGlzdHMudHh0CisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL0NNYWtlTGlzdHMudHh0CkBAIC0xLDcgKzEsNSBAQAogc2V0KExJQl9OQU1FIGNtY3VybCkKIAotY29uZmlndXJlX2ZpbGUoJHtDVVJMX1NPVVJDRV9ESVJ9L2luY2x1ZGUvY3VybC9jdXJsYnVpbGQuaC5jbWFrZQotICAke0NVUkxfQklOQVJZX0RJUn0vaW5jbHVkZS9jdXJsL2N1cmxidWlsZC5oKQogY29uZmlndXJlX2ZpbGUoY3VybF9jb25maWcuaC5jbWFrZQogICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vY3VybF9jb25maWcuaCkKIApAQCAtMTAsMTEgKzgsMTEgQEAKIAogbGlzdChBUFBFTkQgSEhFQURFUlMKICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2N1cmxfY29uZmlnLmgKLSAgJHtDVVJMX0JJTkFSWV9ESVJ9L2luY2x1ZGUvY3VybC9jdXJsYnVpbGQuaAogICApCiAKIGlmKE1TVkMgQU5EIE5PVCBDVVJMX1NUQVRJQ0xJQikKICAgbGlzdChBUFBFTkQgQ1NPVVJDRVMgbGliY3VybC5yYykKKyAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gL3dkNDEyNyIpCiBlbmRpZigpCiAKICMgU0VUKENTT1VSQ0VTCkBAIC0xMjQsNiArMTIyLDEzIEBACiAgIGlmKE5PVCBDVVJMX1NUQVRJQ0xJQikKICAgICAjIEFkZCAiX2ltcCIgYXMgYSBzdWZmaXggYmVmb3JlIHRoZSBleHRlbnNpb24gdG8gYXZvaWQgY29uZmxpY3Rpbmcgd2l0aCB0aGUgc3RhdGljYWxseSBsaW5rZWQgImxpYmN1cmwubGliIgogICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke0xJQl9OQU1FfSBQUk9QRVJUSUVTIElNUE9SVF9TVUZGSVggIl9pbXAubGliIikKKworICAgIHNldF90YXJnZXRfcHJvcGVydGllcyAoJHtMSUJfTkFNRX0gUFJPUEVSVElFUworICAgICAgIERFQlVHX1BPU1RGSVggIi1kIgorICAgICAgICMgTm90ZTogbm8gcG9zdGZpeCBmb3IgcmVsZWFzZSB2YXJpYW50cywgbGV0IHVzZXIgY2hvb3NlIHdoYXQgc3R5bGUgb2YgcmVsZWFzZSBoZSB3YW50cworICAgICAgICMgTUlOU0laRVJFTF9QT1NURklYICIteiIKKyAgICAgICAjIFJFTFdJVEhERUJJTkZPX1BPU1RGSVggIi1nIgorICAgICAgICkKICAgZW5kaWYoKQogZW5kaWYoKQogCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9NYWtlZmlsZS5pbmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9NYWtlZmlsZS5pbmMKaW5kZXggMTlmNTgwMC4uNWMwYjkzMCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvTWFrZWZpbGUuaW5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL01ha2VmaWxlLmluYwpAQCAtNTMsNyArNTMsOCBAQAogICBodHRwX3Byb3h5LmMgbm9uLWFzY2lpLmMgYXN5bi1hcmVzLmMgYXN5bi10aHJlYWQuYyBjdXJsX2dzc2FwaS5jICAgICAgXAogICBodHRwX250bG0uYyBjdXJsX250bG1fd2IuYyBjdXJsX250bG1fY29yZS5jIGN1cmxfc2FzbC5jIHJhbmQuYyAgICAgICAgXAogICBjdXJsX211bHRpYnl0ZS5jIGhvc3RjaGVjay5jIGNvbm5jYWNoZS5jIHBpcGVsaW5lLmMgZG90ZG90LmMgICAgICAgICAgXAotICB4NTA5YXNuMS5jIGh0dHAyLmMgc21iLmMgY3VybF9lbmRpYW4uYyBjdXJsX2Rlcy5jIHN5c3RlbV93aW4zMi5jCisgIHg1MDlhc24xLmMgaHR0cDIuYyBzbWIuYyBjdXJsX2VuZGlhbi5jIGN1cmxfZGVzLmMgc3lzdGVtX3dpbjMyLmMgICAgICBcCisgIG1pbWUuYwogCiBMSUJfSEZJTEVTID0gYXJwYV90ZWxuZXQuaCBuZXRyYy5oIGZpbGUuaCB0aW1ldmFsLmggaG9zdGlwLmggcHJvZ3Jlc3MuaCBcCiAgIGZvcm1kYXRhLmggY29va2llLmggaHR0cC5oIHNlbmRmLmggZnRwLmggdXJsLmggZGljdC5oIGlmMmlwLmggICAgICAgICBcCkBAIC03Miw3ICs3Myw3IEBACiAgIGN1cmxfc2FzbC5oIGN1cmxfbXVsdGlieXRlLmggaG9zdGNoZWNrLmggY29ubmNhY2hlLmggICAgICAgICAgICAgICAgICBcCiAgIGN1cmxfc2V0dXBfb25jZS5oIG11bHRpaGFuZGxlLmggc2V0dXAtdm1zLmggcGlwZWxpbmUuaCBkb3Rkb3QuaCAgICAgICBcCiAgIHg1MDlhc24xLmggaHR0cDIuaCBzaWdwaXBlLmggc21iLmggY3VybF9lbmRpYW4uaCBjdXJsX2Rlcy5oICAgICAgICAgICBcCi0gIGN1cmxfcHJpbnRmLmggc3lzdGVtX3dpbjMyLmggcmFuZC5oCisgIGN1cmxfcHJpbnRmLmggc3lzdGVtX3dpbjMyLmggcmFuZC5oIG1pbWUuaAogCiBMSUJfUkNGSUxFUyA9IGxpYmN1cmwucmMKIApkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvYXN5bi1hcmVzLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9hc3luLWFyZXMuYwppbmRleCAxMWE5MTRmLi44N2U3MGI0IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9hc3luLWFyZXMuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9hc3luLWFyZXMuYwpAQCAtMjYwLDcgKzI2MCw3IEBACiAgIGJpdG1hc2sgPSBhcmVzX2dldHNvY2soKGFyZXNfY2hhbm5lbClkYXRhLT5zdGF0ZS5yZXNvbHZlciwgc29ja3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgQVJFU19HRVRTT0NLX01BWE5VTSk7CiAKLSAgZm9yKGk9MDsgaSA8IEFSRVNfR0VUU09DS19NQVhOVU07IGkrKykgeworICBmb3IoaSA9IDA7IGkgPCBBUkVTX0dFVFNPQ0tfTUFYTlVNOyBpKyspIHsKICAgICBwZmRbaV0uZXZlbnRzID0gMDsKICAgICBwZmRbaV0ucmV2ZW50cyA9IDA7CiAgICAgaWYoQVJFU19HRVRTT0NLX1JFQURBQkxFKGJpdG1hc2ssIGkpKSB7CkBAIC0yODksNyArMjg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgQVJFU19TT0NLRVRfQkFEKTsKICAgZWxzZSB7CiAgICAgLyogbW92ZSB0aHJvdWdoIHRoZSBkZXNjcmlwdG9ycyBhbmQgYXNrIGZvciBwcm9jZXNzaW5nIG9uIHRoZW0gKi8KLSAgICBmb3IoaT0wOyBpIDwgbnVtOyBpKyspCisgICAgZm9yKGkgPSAwOyBpIDwgbnVtOyBpKyspCiAgICAgICBhcmVzX3Byb2Nlc3NfZmQoKGFyZXNfY2hhbm5lbClkYXRhLT5zdGF0ZS5yZXNvbHZlciwKICAgICAgICAgICAgICAgICAgICAgICBwZmRbaV0ucmV2ZW50cyAmIChQT0xMUkROT1JNfFBPTExJTik/CiAgICAgICAgICAgICAgICAgICAgICAgcGZkW2ldLmZkOkFSRVNfU09DS0VUX0JBRCwKQEAgLTM1NSw3ICszNTUsNyBAQAogICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIGxvbmcgdGltZW91dDsKLSAgc3RydWN0IHRpbWV2YWwgbm93ID0gQ3VybF90dm5vdygpOworICBzdHJ1Y3QgY3VybHRpbWUgbm93ID0gQ3VybF90dm5vdygpOwogICBzdHJ1Y3QgQ3VybF9kbnNfZW50cnkgKnRlbXBfZW50cnk7CiAKICAgaWYoZW50cnkpCkBAIC00MDAsNyArNDAwLDcgQEAKICAgICBpZihDdXJsX3BncnNVcGRhdGUoY29ubikpCiAgICAgICByZXN1bHQgPSBDVVJMRV9BQk9SVEVEX0JZX0NBTExCQUNLOwogICAgIGVsc2UgewotICAgICAgc3RydWN0IHRpbWV2YWwgbm93MiA9IEN1cmxfdHZub3coKTsKKyAgICAgIHN0cnVjdCBjdXJsdGltZSBub3cyID0gQ3VybF90dm5vdygpOwogICAgICAgdGltZV90IHRpbWVkaWZmID0gQ3VybF90dmRpZmYobm93Miwgbm93KTsgLyogc3BlbnQgdGltZSAqLwogICAgICAgaWYodGltZWRpZmYgPD0gMCkKICAgICAgICAgdGltZW91dCAtPSAxOyAvKiBhbHdheXMgZGVkdWN0IGF0IGxlYXN0IDEgKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2FzeW4tdGhyZWFkLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9hc3luLXRocmVhZC5jCmluZGV4IDY1ZmE2YzUuLmE4Njc3MjkgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2FzeW4tdGhyZWFkLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvYXN5bi10aHJlYWQuYwpAQCAtMjEwLDYgKzIxMCwxMCBAQAogCiAgIHRzZC0+dGQgPSB0ZDsKICAgdHNkLT5wb3J0ID0gcG9ydDsKKyAgLyogVHJlYXQgdGhlIHJlcXVlc3QgYXMgZG9uZSB1bnRpbCB0aGUgdGhyZWFkIGFjdHVhbGx5IHN0YXJ0cyBzbyBhbnkgZWFybHkKKyAgICogY2xlYW51cCBnZXRzIGRvbmUgcHJvcGVybHkuCisgICAqLworICB0c2QtPmRvbmUgPSAxOwogI2lmZGVmIEhBVkVfR0VUQUREUklORk8KICAgREVCVUdBU1NFUlQoaGludHMpOwogICB0c2QtPmhpbnRzID0gKmhpbnRzOwpAQCAtMzgwLDExICszODQsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGFkZHJpbmZvICpoaW50cykKIHsKICAgc3RydWN0IHRocmVhZF9kYXRhICp0ZCA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRocmVhZF9kYXRhKSk7Ci0gIGludCBlcnIgPSBSRVNPTFZFUl9FTk9NRU07CisgIGludCBlcnIgPSBFTk9NRU07CiAKICAgY29ubi0+YXN5bmMub3Nfc3BlY2lmaWMgPSAodm9pZCAqKXRkOwogICBpZighdGQpCi0gICAgZ290byBlcnJfZXhpdDsKKyAgICBnb3RvIGVycm5vX2V4aXQ7CiAKICAgY29ubi0+YXN5bmMucG9ydCA9IHBvcnQ7CiAgIGNvbm4tPmFzeW5jLmRvbmUgPSBGQUxTRTsKQEAgLTM5MiwxNCArMzk2LDIwIEBACiAgIGNvbm4tPmFzeW5jLmRucyA9IE5VTEw7CiAgIHRkLT50aHJlYWRfaG5kID0gY3VybF90aHJlYWRfdF9udWxsOwogCi0gIGlmKCFpbml0X3RocmVhZF9zeW5jX2RhdGEodGQsIGhvc3RuYW1lLCBwb3J0LCBoaW50cykpCi0gICAgZ290byBlcnJfZXhpdDsKKyAgaWYoIWluaXRfdGhyZWFkX3N5bmNfZGF0YSh0ZCwgaG9zdG5hbWUsIHBvcnQsIGhpbnRzKSkgeworICAgIGNvbm4tPmFzeW5jLm9zX3NwZWNpZmljID0gTlVMTDsKKyAgICBmcmVlKHRkKTsKKyAgICBnb3RvIGVycm5vX2V4aXQ7CisgIH0KIAogICBmcmVlKGNvbm4tPmFzeW5jLmhvc3RuYW1lKTsKICAgY29ubi0+YXN5bmMuaG9zdG5hbWUgPSBzdHJkdXAoaG9zdG5hbWUpOwogICBpZighY29ubi0+YXN5bmMuaG9zdG5hbWUpCiAgICAgZ290byBlcnJfZXhpdDsKIAorICAvKiBUaGUgdGhyZWFkIHdpbGwgc2V0IHRoaXMgdG8gMSB3aGVuIGNvbXBsZXRlLiAqLworICB0ZC0+dHNkLmRvbmUgPSAwOworCiAjaWZkZWYgSEFWRV9HRVRBRERSSU5GTwogICB0ZC0+dGhyZWFkX2huZCA9IEN1cmxfdGhyZWFkX2NyZWF0ZShnZXRhZGRyaW5mb190aHJlYWQsICZ0ZC0+dHNkKTsKICNlbHNlCkBAIC00MDcsOSArNDE3LDkgQEAKICNlbmRpZgogCiAgIGlmKCF0ZC0+dGhyZWFkX2huZCkgewotI2lmbmRlZiBfV0lOMzJfV0NFCisgICAgLyogVGhlIHRocmVhZCBuZXZlciBzdGFydGVkLCBzbyBtYXJrIGl0IGFzIGRvbmUgaGVyZSBmb3IgcHJvcGVyIGNsZWFudXAuICovCisgICAgdGQtPnRzZC5kb25lID0gMTsKICAgICBlcnIgPSBlcnJubzsKLSNlbmRpZgogICAgIGdvdG8gZXJyX2V4aXQ7CiAgIH0KIApAQCAtNDE4LDggKzQyOCw4IEBACiAgZXJyX2V4aXQ6CiAgIGRlc3Ryb3lfYXN5bmNfZGF0YSgmY29ubi0+YXN5bmMpOwogCi0gIFNFVF9FUlJOTyhlcnIpOwotCisgZXJybm9fZXhpdDoKKyAgZXJybm8gPSBlcnI7CiAgIHJldHVybiBGQUxTRTsKIH0KIApAQCAtNTk0LDI4ICs2MDQsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp3YWl0cCkKIHsKICAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOwotICBzdHJ1Y3QgaW5fYWRkciBpbjsKICAgQ3VybF9hZGRyaW5mbyAqcmVzOwogICBpbnQgZXJyb3I7CiAgIGNoYXIgc2J1ZlsxMl07CiAgIGludCBwZiA9IFBGX0lORVQ7Ci0jaWZkZWYgQ1VSTFJFU19JUFY2Ci0gIHN0cnVjdCBpbjZfYWRkciBpbjY7Ci0jZW5kaWYgLyogQ1VSTFJFU19JUFY2ICovCiAKICAgKndhaXRwID0gMDsgLyogZGVmYXVsdCB0byBzeW5jaHJvbm91cyByZXNwb25zZSAqLwogCiAjaWZuZGVmIFVTRV9SRVNPTFZFX09OX0lQUwotICAvKiBGaXJzdCBjaGVjayBpZiB0aGlzIGlzIGFuIElQdjQgYWRkcmVzcyBzdHJpbmcgKi8KLSAgaWYoQ3VybF9pbmV0X3B0b24oQUZfSU5FVCwgaG9zdG5hbWUsICZpbikgPiAwKQotICAgIC8qIFRoaXMgaXMgYSBkb3R0ZWQgSVAgYWRkcmVzcyAxMjMuMTIzLjEyMy4xMjMtc3R5bGUgKi8KLSAgICByZXR1cm4gQ3VybF9pcDJhZGRyKEFGX0lORVQsICZpbiwgaG9zdG5hbWUsIHBvcnQpOwotCisgIHsKKyAgICBzdHJ1Y3QgaW5fYWRkciBpbjsKKyAgICAvKiBGaXJzdCBjaGVjayBpZiB0aGlzIGlzIGFuIElQdjQgYWRkcmVzcyBzdHJpbmcgKi8KKyAgICBpZihDdXJsX2luZXRfcHRvbihBRl9JTkVULCBob3N0bmFtZSwgJmluKSA+IDApCisgICAgICAvKiBUaGlzIGlzIGEgZG90dGVkIElQIGFkZHJlc3MgMTIzLjEyMy4xMjMuMTIzLXN0eWxlICovCisgICAgICByZXR1cm4gQ3VybF9pcDJhZGRyKEFGX0lORVQsICZpbiwgaG9zdG5hbWUsIHBvcnQpOworICB9CiAjaWZkZWYgQ1VSTFJFU19JUFY2Ci0gIC8qIGNoZWNrIGlmIHRoaXMgaXMgYW4gSVB2NiBhZGRyZXNzIHN0cmluZyAqLwotICBpZihDdXJsX2luZXRfcHRvbihBRl9JTkVUNiwgaG9zdG5hbWUsICZpbjYpID4gMCkKLSAgICAvKiBUaGlzIGlzIGFuIElQdjYgYWRkcmVzcyBsaXRlcmFsICovCi0gICAgcmV0dXJuIEN1cmxfaXAyYWRkcihBRl9JTkVUNiwgJmluNiwgaG9zdG5hbWUsIHBvcnQpOworICB7CisgICAgc3RydWN0IGluNl9hZGRyIGluNjsKKyAgICAvKiBjaGVjayBpZiB0aGlzIGlzIGFuIElQdjYgYWRkcmVzcyBzdHJpbmcgKi8KKyAgICBpZihDdXJsX2luZXRfcHRvbihBRl9JTkVUNiwgaG9zdG5hbWUsICZpbjYpID4gMCkKKyAgICAgIC8qIFRoaXMgaXMgYW4gSVB2NiBhZGRyZXNzIGxpdGVyYWwgKi8KKyAgICAgIHJldHVybiBDdXJsX2lwMmFkZHIoQUZfSU5FVDYsICZpbjYsIGhvc3RuYW1lLCBwb3J0KTsKKyAgfQogI2VuZGlmIC8qIENVUkxSRVNfSVBWNiAqLwogI2VuZGlmIC8qICFVU0VfUkVTT0xWRV9PTl9JUFMgKi8KIApAQCAtNjU0LDcgKzY2NSw3IEBACiAKICAgLyogZmFsbC1iYWNrIHRvIGJsb2NraW5nIHZlcnNpb24gKi8KICAgaW5mb2YoY29ubi0+ZGF0YSwgImluaXRfcmVzb2x2ZV90aHJlYWQoKSBmYWlsZWQgZm9yICVzOyAlc1xuIiwKLSAgICAgICAgaG9zdG5hbWUsIEN1cmxfc3RyZXJyb3IoY29ubiwgRVJSTk8pKTsKKyAgICAgICAgaG9zdG5hbWUsIEN1cmxfc3RyZXJyb3IoY29ubiwgZXJybm8pKTsKIAogICBlcnJvciA9IEN1cmxfZ2V0YWRkcmluZm9fZXgoaG9zdG5hbWUsIHNidWYsICZoaW50cywgJnJlcyk7CiAgIGlmKGVycm9yKSB7CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jb25uY2FjaGUuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2Nvbm5jYWNoZS5oCmluZGV4IGY5NzZjZmQuLjE0YmU0ZTggMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2Nvbm5jYWNoZS5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2Nvbm5jYWNoZS5oCkBAIC0yNyw3ICsyNyw3IEBACiAgIHN0cnVjdCBjdXJsX2hhc2ggaGFzaDsKICAgc2l6ZV90IG51bV9jb25uZWN0aW9uczsKICAgbG9uZyBuZXh0X2Nvbm5lY3Rpb25faWQ7Ci0gIHN0cnVjdCB0aW1ldmFsIGxhc3RfY2xlYW51cDsKKyAgc3RydWN0IGN1cmx0aW1lIGxhc3RfY2xlYW51cDsKIH07CiAKICNkZWZpbmUgQlVORExFX05PX01VTFRJVVNFIC0xCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jb25uZWN0LmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9jb25uZWN0LmMKaW5kZXggZDRmZDUyYi4uYjdkMTBhZiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY29ubmVjdC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2Nvbm5lY3QuYwpAQCAtMTgwLDEyICsxODAsMTIgQEAKICAqIEB1bml0dGVzdDogMTMwMwogICovCiB0aW1lX3QgQ3VybF90aW1lbGVmdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgKm5vd3AsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY3VybHRpbWUgKm5vd3AsCiAgICAgICAgICAgICAgICAgICAgICBib29sIGR1cmluZ2Nvbm5lY3QpCiB7CiAgIGludCB0aW1lb3V0X3NldCA9IDA7CiAgIHRpbWVfdCB0aW1lb3V0X21zID0gZHVyaW5nY29ubmVjdD9ERUZBVUxUX0NPTk5FQ1RfVElNRU9VVDowOwotICBzdHJ1Y3QgdGltZXZhbCBub3c7CisgIHN0cnVjdCBjdXJsdGltZSBub3c7CiAKICAgLyogaWYgYSB0aW1lb3V0IGlzIHNldCwgdXNlIHRoZSBtb3N0IHJlc3RyaWN0aXZlIG9uZSAqLwogCkBAIC0yNDksNyArMjQ5LDcgQEAKICAgc3RydWN0IHNvY2thZGRyX2luNiAqc2k2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmc2E7CiAjZW5kaWYKIAotICBzdHJ1Y3QgQ3VybF9kbnNfZW50cnkgKmg9TlVMTDsKKyAgc3RydWN0IEN1cmxfZG5zX2VudHJ5ICpoID0gTlVMTDsKICAgdW5zaWduZWQgc2hvcnQgcG9ydCA9IGRhdGEtPnNldC5sb2NhbHBvcnQ7IC8qIHVzZSB0aGlzIHBvcnQgbnVtYmVyLCAwIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhbmRvbSIgKi8KICAgLyogaG93IG1hbnkgcG9ydCBudW1iZXJzIHRvIHRyeSB0byBiaW5kIHRvLCBpbmNyZWFzaW5nIG9uZSBhdCBhIHRpbWUgKi8KQEAgLTMxOSw3ICszMTksNyBAQAogICAgICAgICAgICAqIGFzIGEgaG9zdG5hbWUgb3IgaXAgYWRkcmVzcy4KICAgICAgICAgICAgKi8KICAgICAgICAgICBpZihzZXRzb2Nrb3B0KHNvY2tmZCwgU09MX1NPQ0tFVCwgU09fQklORFRPREVWSUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgZGV2LCAoY3VybF9zb2NrbGVuX3Qpc3RybGVuKGRldikrMSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2LCAoY3VybF9zb2NrbGVuX3Qpc3RybGVuKGRldikgKyAxKSAhPSAwKSB7CiAgICAgICAgICAgICBlcnJvciA9IFNPQ0tFUlJOTzsKICAgICAgICAgICAgIGluZm9mKGRhdGEsICJTT19CSU5EVE9ERVZJQ0UgJXMgZmFpbGVkIHdpdGggZXJybm8gJWQ6ICVzOyIKICAgICAgICAgICAgICAgICAgICIgd2lsbCBkbyByZWd1bGFyIGJpbmRcbiIsCkBAIC02MDcsNyArNjA3LDggQEAKICAgY29ubi0+ZGF0YS0+aW5mby5jb25uX2xvY2FsX3BvcnQgPSBjb25uLT5sb2NhbF9wb3J0OwogfQogCi0vKiByZXRyaWV2ZXMgaXAgYWRkcmVzcyBhbmQgcG9ydCBmcm9tIGEgc29ja2FkZHIgc3RydWN0dXJlICovCisvKiByZXRyaWV2ZXMgaXAgYWRkcmVzcyBhbmQgcG9ydCBmcm9tIGEgc29ja2FkZHIgc3RydWN0dXJlLgorICAgbm90ZSBpdCBjYWxscyBDdXJsX2luZXRfbnRvcCB3aGljaCBzZXRzIGVycm5vIG9uIGZhaWwsIG5vdCBTT0NLRVJSTk8uICovCiBzdGF0aWMgYm9vbCBnZXRhZGRyZXNzaW5mbyhzdHJ1Y3Qgc29ja2FkZHIgKnNhLCBjaGFyICphZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAqcG9ydCkKIHsKQEAgLTY1NCw3ICs2NTUsNyBAQAogCiAgIGFkZHJbMF0gPSAnXDAnOwogICAqcG9ydCA9IDA7Ci0KKyAgZXJybm8gPSBFQUZOT1NVUFBPUlQ7CiAgIHJldHVybiBGQUxTRTsKIH0KIApAQCAtNjcyLDExICs2NzMsOSBAQAogICAgIHJldHVybjsKIAogICBpZighY29ubi0+Yml0cy5yZXVzZSAmJiAhY29ubi0+Yml0cy50Y3BfZmFzdG9wZW4pIHsKLSAgICBpbnQgZXJyb3I7Ci0KICAgICBsZW4gPSBzaXplb2Yoc3RydWN0IEN1cmxfc29ja2FkZHJfc3RvcmFnZSk7CiAgICAgaWYoZ2V0cGVlcm5hbWUoc29ja2ZkLCAoc3RydWN0IHNvY2thZGRyKikgJnNzcmVtLCAmbGVuKSkgewotICAgICAgZXJyb3IgPSBTT0NLRVJSTk87CisgICAgICBpbnQgZXJyb3IgPSBTT0NLRVJSTk87CiAgICAgICBmYWlsZihkYXRhLCAiZ2V0cGVlcm5hbWUoKSBmYWlsZWQgd2l0aCBlcnJubyAlZDogJXMiLAogICAgICAgICAgICAgZXJyb3IsIEN1cmxfc3RyZXJyb3IoY29ubiwgZXJyb3IpKTsKICAgICAgIHJldHVybjsKQEAgLTY4NSw3ICs2ODQsNyBAQAogICAgIGxlbiA9IHNpemVvZihzdHJ1Y3QgQ3VybF9zb2NrYWRkcl9zdG9yYWdlKTsKICAgICBtZW1zZXQoJnNzbG9jLCAwLCBzaXplb2Yoc3Nsb2MpKTsKICAgICBpZihnZXRzb2NrbmFtZShzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSAmc3Nsb2MsICZsZW4pKSB7Ci0gICAgICBlcnJvciA9IFNPQ0tFUlJOTzsKKyAgICAgIGludCBlcnJvciA9IFNPQ0tFUlJOTzsKICAgICAgIGZhaWxmKGRhdGEsICJnZXRzb2NrbmFtZSgpIGZhaWxlZCB3aXRoIGVycm5vICVkOiAlcyIsCiAgICAgICAgICAgICBlcnJvciwgQ3VybF9zdHJlcnJvcihjb25uLCBlcnJvcikpOwogICAgICAgcmV0dXJuOwpAQCAtNjkzLDE4ICs2OTIsMTYgQEAKIAogICAgIGlmKCFnZXRhZGRyZXNzaW5mbygoc3RydWN0IHNvY2thZGRyKikmc3NyZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLT5wcmltYXJ5X2lwLCAmY29ubi0+cHJpbWFyeV9wb3J0KSkgewotICAgICAgZXJyb3IgPSBFUlJOTzsKICAgICAgIGZhaWxmKGRhdGEsICJzc3JlbSBpbmV0X250b3AoKSBmYWlsZWQgd2l0aCBlcnJubyAlZDogJXMiLAotICAgICAgICAgICAgZXJyb3IsIEN1cmxfc3RyZXJyb3IoY29ubiwgZXJyb3IpKTsKKyAgICAgICAgICAgIGVycm5vLCBDdXJsX3N0cmVycm9yKGNvbm4sIGVycm5vKSk7CiAgICAgICByZXR1cm47CiAgICAgfQogICAgIG1lbWNweShjb25uLT5pcF9hZGRyX3N0ciwgY29ubi0+cHJpbWFyeV9pcCwgTUFYX0lQQURSX0xFTik7CiAKICAgICBpZighZ2V0YWRkcmVzc2luZm8oKHN0cnVjdCBzb2NrYWRkciopJnNzbG9jLAogICAgICAgICAgICAgICAgICAgICAgICBjb25uLT5sb2NhbF9pcCwgJmNvbm4tPmxvY2FsX3BvcnQpKSB7Ci0gICAgICBlcnJvciA9IEVSUk5POwogICAgICAgZmFpbGYoZGF0YSwgInNzbG9jIGluZXRfbnRvcCgpIGZhaWxlZCB3aXRoIGVycm5vICVkOiAlcyIsCi0gICAgICAgICAgICBlcnJvciwgQ3VybF9zdHJlcnJvcihjb25uLCBlcnJvcikpOworICAgICAgICAgICAgZXJybm8sIEN1cmxfc3RyZXJyb3IoY29ubiwgZXJybm8pKTsKICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTcyNiw3ICs3MjMsNyBAQAogICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKICAgdGltZV90IGFsbG93OwogICBpbnQgZXJyb3IgPSAwOwotICBzdHJ1Y3QgdGltZXZhbCBub3c7CisgIHN0cnVjdCBjdXJsdGltZSBub3c7CiAgIGludCByYzsKICAgaW50IGk7CiAKQEAgLTc1MSw3ICs3NDgsNyBAQAogICAgIHJldHVybiBDVVJMRV9PUEVSQVRJT05fVElNRURPVVQ7CiAgIH0KIAotICBmb3IoaT0wOyBpPDI7IGkrKykgeworICBmb3IoaSA9IDA7IGk8MjsgaSsrKSB7CiAgICAgY29uc3QgaW50IG90aGVyID0gaSBeIDE7CiAgICAgaWYoY29ubi0+dGVtcHNvY2tbaV0gPT0gQ1VSTF9TT0NLRVRfQkFEKQogICAgICAgY29udGludWU7CkBAIC04NzksMTkgKzg3Niw2IEBACiAgIGN1cmxfc29ja2xlbl90IG9ub2ZmID0gKGN1cmxfc29ja2xlbl90KSAxOwogICBpbnQgbGV2ZWwgPSBJUFBST1RPX1RDUDsKIAotI2lmIDAKLSAgLyogVGhlIHVzZSBvZiBnZXRwcm90b2J5bmFtZSgpIGlzIGRpc2FibGVkIHNpbmNlIGl0IGlzbid0IHRocmVhZC1zYWZlIG9uCi0gICAgIG51bWVyb3VzIHN5c3RlbXMuIE9uIHRoZXNlIGdldHByb3RvYnluYW1lX3IoKSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLCBidXQKLSAgICAgdGhhdCBleGlzdHMgaW4gYXQgbGVhc3Qgb25lIDQgYXJnIHZlcnNpb24gYW5kIG9uZSA1IGFyZyB2ZXJzaW9uLCBhbmQKLSAgICAgc2luY2UgdGhlIHByb3RvIG51bWJlciByYXJlbHkgY2hhbmdlcyBhbnl3YXkgd2Ugbm93IGp1c3QgdXNlIHRoZSBoYXJkCi0gICAgIGNvZGVkIG51bWJlci4gVGhlICJwcm9wZXIiIGZpeCB3b3VsZCBuZWVkIGEgY29uZmlndXJlIGNoZWNrIGZvciB0aGUKLSAgICAgY29ycmVjdCBmdW5jdGlvbiBtdWNoIGluIHRoZSBzYW1lIHN0eWxlIHRoZSBnZXRob3N0YnluYW1lX3IgdmVyc2lvbnMgYXJlCi0gICAgIGRldGVjdGVkLiAqLwotICBzdHJ1Y3QgcHJvdG9lbnQgKnBlID0gZ2V0cHJvdG9ieW5hbWUoInRjcCIpOwotICBpZihwZSkKLSAgICBsZXZlbCA9IHBlLT5wX3Byb3RvOwotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENVUkxfRElTQUJMRV9WRVJCT1NFX1NUUklOR1MpCiAgICh2b2lkKSBjb25uOwogI2VuZGlmCkBAIC05MTYsNyArOTAwLDcgQEAKIHN0YXRpYyB2b2lkIG5vc2lncGlwZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCiAgICAgICAgICAgICAgICAgICAgICAgY3VybF9zb2NrZXRfdCBzb2NrZmQpCiB7Ci0gIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGE9IGNvbm4tPmRhdGE7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBpbnQgb25vZmYgPSAxOwogICBpZihzZXRzb2Nrb3B0KHNvY2tmZCwgU09MX1NPQ0tFVCwgU09fTk9TSUdQSVBFLCAodm9pZCAqKSZvbm9mZiwKICAgICAgICAgICAgICAgICBzaXplb2Yob25vZmYpKSA8IDApCkBAIC0xMDA4LDkgKzk5Miw4IEBACiAgIGlmKCFnZXRhZGRyZXNzaW5mbygoc3RydWN0IHNvY2thZGRyKikmYWRkci5zYV9hZGRyLAogICAgICAgICAgICAgICAgICAgICAgaXBhZGRyZXNzLCAmcG9ydCkpIHsKICAgICAvKiBtYWxmb3JtZWQgYWRkcmVzcyBvciBidWcgaW4gaW5ldF9udG9wLCB0cnkgbmV4dCBhZGRyZXNzICovCi0gICAgZXJyb3IgPSBFUlJOTzsKICAgICBmYWlsZihkYXRhLCAic2FfYWRkciBpbmV0X250b3AoKSBmYWlsZWQgd2l0aCBlcnJubyAlZDogJXMiLAotICAgICAgICAgIGVycm9yLCBDdXJsX3N0cmVycm9yKGNvbm4sIGVycm9yKSk7CisgICAgICAgICAgZXJybm8sIEN1cmxfc3RyZXJyb3IoY29ubiwgZXJybm8pKTsKICAgICBDdXJsX2Nsb3Nlc29ja2V0KGNvbm4sIHNvY2tmZCk7CiAgICAgcmV0dXJuIENVUkxFX09LOwogICB9CkBAIC0xMDc2LDE2ICsxMDU5LDI1IEBACiAgIGlmKCFpc2Nvbm5lY3RlZCAmJiAoY29ubi0+c29ja3R5cGUgPT0gU09DS19TVFJFQU0pKSB7CiAgICAgaWYoY29ubi0+Yml0cy50Y3BfZmFzdG9wZW4pIHsKICNpZiBkZWZpbmVkKENPTk5FQ1RfREFUQV9JREVNUE9URU5UKSAvKiBPUyBYICovCi0gICAgICBzYV9lbmRwb2ludHNfdCBlbmRwb2ludHM7Ci0gICAgICBlbmRwb2ludHMuc2FlX3NyY2lmID0gMDsKLSAgICAgIGVuZHBvaW50cy5zYWVfc3JjYWRkciA9IE5VTEw7Ci0gICAgICBlbmRwb2ludHMuc2FlX3NyY2FkZHJsZW4gPSAwOwotICAgICAgZW5kcG9pbnRzLnNhZV9kc3RhZGRyID0gJmFkZHIuc2FfYWRkcjsKLSAgICAgIGVuZHBvaW50cy5zYWVfZHN0YWRkcmxlbiA9IGFkZHIuYWRkcmxlbjsKKyNpZmRlZiBIQVZFX0JVSUxUSU5fQVZBSUxBQkxFCisgICAgICBpZihfX2J1aWx0aW5fYXZhaWxhYmxlKG1hY09TIDEwLjExLCBpT1MgOS4wLCB0dk9TIDkuMCwgd2F0Y2hPUyAyLjAsICopKSB7CisjZW5kaWYgLyogSEFWRV9CVUlMVElOX0FWQUlMQUJMRSAqLworICAgICAgICBzYV9lbmRwb2ludHNfdCBlbmRwb2ludHM7CisgICAgICAgIGVuZHBvaW50cy5zYWVfc3JjaWYgPSAwOworICAgICAgICBlbmRwb2ludHMuc2FlX3NyY2FkZHIgPSBOVUxMOworICAgICAgICBlbmRwb2ludHMuc2FlX3NyY2FkZHJsZW4gPSAwOworICAgICAgICBlbmRwb2ludHMuc2FlX2RzdGFkZHIgPSAmYWRkci5zYV9hZGRyOworICAgICAgICBlbmRwb2ludHMuc2FlX2RzdGFkZHJsZW4gPSBhZGRyLmFkZHJsZW47CiAKLSAgICAgIHJjID0gY29ubmVjdHgoc29ja2ZkLCAmZW5kcG9pbnRzLCBTQUVfQVNTT0NJRF9BTlksCi0gICAgICAgICAgICAgICAgICAgIENPTk5FQ1RfUkVTVU1FX09OX1JFQURfV1JJVEUgfCBDT05ORUNUX0RBVEFfSURFTVBPVEVOVCwKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisgICAgICAgIHJjID0gY29ubmVjdHgoc29ja2ZkLCAmZW5kcG9pbnRzLCBTQUVfQVNTT0NJRF9BTlksCisgICAgICAgICAgICAgICAgICAgICAgQ09OTkVDVF9SRVNVTUVfT05fUkVBRF9XUklURSB8IENPTk5FQ1RfREFUQV9JREVNUE9URU5ULAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworI2lmZGVmIEhBVkVfQlVJTFRJTl9BVkFJTEFCTEUKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICByYyA9IGNvbm5lY3Qoc29ja2ZkLCAmYWRkci5zYV9hZGRyLCBhZGRyLmFkZHJsZW4pOworICAgICAgfQorI2VuZGlmIC8qIEhBVkVfQlVJTFRJTl9BVkFJTEFCTEUgKi8KICNlbGlmIGRlZmluZWQoTVNHX0ZBU1RPUEVOKSAvKiBMaW51eCAqLwogICAgICAgaWYoY29ubi0+Z2l2ZW4tPmZsYWdzICYgUFJPVE9QVF9TU0wpCiAgICAgICAgIHJjID0gY29ubmVjdChzb2NrZmQsICZhZGRyLnNhX2FkZHIsIGFkZHIuYWRkcmxlbik7CkBAIC0xMTUzLDcgKzExNDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgQ3VybF9kbnNfZW50cnkgKnJlbW90ZWhvc3QpCiB7CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwotICBzdHJ1Y3QgdGltZXZhbCBiZWZvcmUgPSBDdXJsX3R2bm93KCk7CisgIHN0cnVjdCBjdXJsdGltZSBiZWZvcmUgPSBDdXJsX3R2bm93KCk7CiAgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX0NPVUxETlRfQ09OTkVDVDsKIAogICB0aW1lX3QgdGltZW91dF9tcyA9IEN1cmxfdGltZWxlZnQoZGF0YSwgJmJlZm9yZSwgVFJVRSk7CkBAIC0xMTY5LDcgKzExNjEsNiBAQAogICBjb25uLT50ZW1wYWRkclsxXSA9IE5VTEw7CiAgIGNvbm4tPnRlbXBzb2NrWzBdID0gQ1VSTF9TT0NLRVRfQkFEOwogICBjb25uLT50ZW1wc29ja1sxXSA9IENVUkxfU09DS0VUX0JBRDsKLSAgQ3VybF9leHBpcmUoY29ubi0+ZGF0YSwgSEFQUFlfRVlFQkFMTFNfVElNRU9VVCwgRVhQSVJFX0hBUFBZX0VZRUJBTExTKTsKIAogICAvKiBNYXggdGltZSBmb3IgdGhlIG5leHQgY29ubmVjdGlvbiBhdHRlbXB0ICovCiAgIGNvbm4tPnRpbWVvdXRtc19wZXJfYWRkciA9CkBAIC0xMTkwLDYgKzExODEsNyBAQAogICB9CiAKICAgZGF0YS0+aW5mby5udW1jb25uZWN0cysrOyAvKiB0byB0cmFjayB0aGUgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIG1hZGUgKi8KKyAgQ3VybF9leHBpcmUoY29ubi0+ZGF0YSwgSEFQUFlfRVlFQkFMTFNfVElNRU9VVCwgRVhQSVJFX0hBUFBZX0VZRUJBTExTKTsKIAogICByZXR1cm4gQ1VSTEVfT0s7CiB9CkBAIC0xMzQxLDcgKzEzMzMsNyBAQAogCiAgIGFkZHItPmZhbWlseSA9IGFpLT5haV9mYW1pbHk7CiAgIGFkZHItPnNvY2t0eXBlID0gY29ubi0+c29ja3R5cGU7Ci0gIGFkZHItPnByb3RvY29sID0gY29ubi0+c29ja3R5cGU9PVNPQ0tfREdSQU0/SVBQUk9UT19VRFA6YWktPmFpX3Byb3RvY29sOworICBhZGRyLT5wcm90b2NvbCA9IGNvbm4tPnNvY2t0eXBlID09IFNPQ0tfREdSQU0/SVBQUk9UT19VRFA6YWktPmFpX3Byb3RvY29sOwogICBhZGRyLT5hZGRybGVuID0gYWktPmFpX2FkZHJsZW47CiAKICAgaWYoYWRkci0+YWRkcmxlbiA+IHNpemVvZihzdHJ1Y3QgQ3VybF9zb2NrYWRkcl9zdG9yYWdlKSkKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2Nvbm5lY3QuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2Nvbm5lY3QuaAppbmRleCA0NGJkYjEwLi4zZjA1YzM5IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jb25uZWN0LmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY29ubmVjdC5oCkBAIC03LDcgKzcsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC0zNiw3ICszNiw3IEBACiAvKiBnZW5lcmljIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBob3cgbXVjaCB0aW1lIHRoZXJlJ3MgbGVmdCB0byBydW4sIGFjY29yZGluZwogICAgdG8gdGhlIHRpbWVvdXRzIHNldCAqLwogdGltZV90IEN1cmxfdGltZWxlZnQoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsICpub3dwLAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGN1cmx0aW1lICpub3dwLAogICAgICAgICAgICAgICAgICAgICAgYm9vbCBkdXJpbmdjb25uZWN0KTsKIAogI2RlZmluZSBERUZBVUxUX0NPTk5FQ1RfVElNRU9VVCAzMDAwMDAgLyogbWlsbGlzZWNvbmRzID09IGZpdmUgbWludXRlcyAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY29udGVudF9lbmNvZGluZy5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY29udGVudF9lbmNvZGluZy5jCmluZGV4IDY1MmVkOTcuLjExMDIyNjAgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2NvbnRlbnRfZW5jb2RpbmcuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9jb250ZW50X2VuY29kaW5nLmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTIyNyw3ICsyMjcsNyBAQAogCiAgICAgZXh0cmFfbGVuID0gKGRhdGFbMV0gPDwgOCkgfCBkYXRhWzBdOwogCi0gICAgaWYobGVuIDwgKGV4dHJhX2xlbisyKSkKKyAgICBpZihsZW4gPCAoZXh0cmFfbGVuICsgMikpCiAgICAgICByZXR1cm4gR1pJUF9VTkRFUkZMT1c7CiAKICAgICBsZW4gLT0gKGV4dHJhX2xlbiArIDIpOwpAQCAtMjg4LDcgKzI4OCw3IEBACiAKICAgICBpZihzdHJjbXAoemxpYlZlcnNpb24oKSwgIjEuMi4wLjQiKSA+PSAwKSB7CiAgICAgICAvKiB6bGliIHZlci4gPj0gMS4yLjAuNCBzdXBwb3J0cyB0cmFuc3BhcmVudCBnemlwIGRlY29tcHJlc3NpbmcgKi8KLSAgICAgIGlmKGluZmxhdGVJbml0Mih6LCBNQVhfV0JJVFMrMzIpICE9IFpfT0spIHsKKyAgICAgIGlmKGluZmxhdGVJbml0Mih6LCBNQVhfV0JJVFMgKyAzMikgIT0gWl9PSykgewogICAgICAgICByZXR1cm4gcHJvY2Vzc196bGliX2Vycm9yKGNvbm4sIHopOwogICAgICAgfQogICAgICAgay0+emxpYl9pbml0ID0gWkxJQl9JTklUX0daSVA7IC8qIFRyYW5zcGFyZW50IGd6aXAgZGVjb21wcmVzcyBzdGF0ZSAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY29va2llLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9jb29raWUuYwppbmRleCA2YjY3OGFlLi43ZmI1OTZhIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jb29raWUuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9jb29raWUuYwpAQCAtMTI1LDcgKzEyNSw3IEBACiAgIGlmKGhvc3RuYW1lX2xlbiA8IGNvb2tpZV9kb21haW5fbGVuKQogICAgIHJldHVybiBGQUxTRTsKIAotICBpZighc3RyY2FzZWNvbXBhcmUoY29va2VfZG9tYWluLCBob3N0bmFtZStob3N0bmFtZV9sZW4tY29va2llX2RvbWFpbl9sZW4pKQorICBpZighc3RyY2FzZWNvbXBhcmUoY29va2VfZG9tYWluLCBob3N0bmFtZSArIGhvc3RuYW1lX2xlbi1jb29raWVfZG9tYWluX2xlbikpCiAgICAgcmV0dXJuIEZBTFNFOwogCiAgIC8qIEEgbGVhZCBjaGFyIG9mIGNvb2tpZV9kb21haW4gaXMgbm90ICcuJy4KQEAgLTM3NSw5ICszNzUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5sZXNzIHNldCAqLwogewogICBzdHJ1Y3QgQ29va2llICpjbGlzdDsKLSAgY2hhciBuYW1lW01BWF9OQU1FXTsKICAgc3RydWN0IENvb2tpZSAqY287Ci0gIHN0cnVjdCBDb29raWUgKmxhc3RjPU5VTEw7CisgIHN0cnVjdCBDb29raWUgKmxhc3RjID0gTlVMTDsKICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CiAgIGJvb2wgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICAgYm9vbCBiYWRjb29raWUgPSBGQUxTRTsgLyogY29va2llcyBhcmUgZ29vZCBieSBkZWZhdWx0LiBtbW1tbSB5dW1teSAqLwpAQCAtMzk3LDE3ICszOTYsMTkgQEAKIAogICBpZihodHRwaGVhZGVyKSB7CiAgICAgLyogVGhpcyBsaW5lIHdhcyByZWFkIG9mZiBhIEhUVFAtaGVhZGVyICovCisgICAgY2hhciBuYW1lW01BWF9OQU1FXTsKKyAgICBjaGFyIHdoYXRbTUFYX05BTUVdOwogICAgIGNvbnN0IGNoYXIgKnB0cjsKICAgICBjb25zdCBjaGFyICpzZW1pcHRyOwotICAgIGNoYXIgKndoYXQ7CiAKLSAgICB3aGF0ID0gbWFsbG9jKE1BWF9DT09LSUVfTElORSk7Ci0gICAgaWYoIXdoYXQpIHsKKyAgICBzaXplX3QgbGluZWxlbmd0aCA9IHN0cmxlbihsaW5lcHRyKTsKKyAgICBpZihsaW5lbGVuZ3RoID4gTUFYX0NPT0tJRV9MSU5FKSB7CisgICAgICAvKiBkaXNjYXJkIG92ZXJseSBsb25nIGxpbmVzIGF0IG9uY2UgKi8KICAgICAgIGZyZWUoY28pOwogICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgc2VtaXB0cj1zdHJjaHIobGluZXB0ciwgJzsnKTsgLyogZmlyc3QsIGZpbmQgYSBzZW1pY29sb24gKi8KKyAgICBzZW1pcHRyID0gc3RyY2hyKGxpbmVwdHIsICc7Jyk7IC8qIGZpcnN0LCBmaW5kIGEgc2VtaWNvbG9uICovCiAKICAgICB3aGlsZSgqbGluZXB0ciAmJiBJU0JMQU5LKCpsaW5lcHRyKSkKICAgICAgIGxpbmVwdHIrKzsKQEAgLTQxNSw5ICs0MTYsOSBAQAogICAgIHB0ciA9IGxpbmVwdHI7CiAgICAgZG8gewogICAgICAgLyogd2UgaGF2ZSBhIDx3aGF0Pj08dGhpcz4gcGFpciBvciBhIHN0YW5kLWFsb25lIHdvcmQgaGVyZSAqLwotICAgICAgbmFtZVswXT13aGF0WzBdPTA7IC8qIGluaXQgdGhlIGJ1ZmZlcnMgKi8KKyAgICAgIG5hbWVbMF0gPSB3aGF0WzBdID0gMDsgLyogaW5pdCB0aGUgYnVmZmVycyAqLwogICAgICAgaWYoMSA8PSBzc2NhbmYocHRyLCAiJSIgTUFYX05BTUVfVFhUICJbXjtcclxuPV0gPSUiCi0gICAgICAgICAgICAgICAgICAgICBNQVhfQ09PS0lFX0xJTkVfVFhUICJbXjtcclxuXSIsCisgICAgICAgICAgICAgICAgICAgICBNQVhfTkFNRV9UWFQgIlteO1xyXG5dIiwKICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHdoYXQpKSB7CiAgICAgICAgIC8qIFVzZSBzdHJzdG9yZSgpIGJlbG93IHRvIHByb3Blcmx5IGRlYWwgd2l0aCByZWNlaXZlZCBjb29raWUKICAgICAgICAgICAgaGVhZGVycyB0aGF0IGhhdmUgdGhlIHNhbWUgc3RyaW5nIHByb3BlcnR5IHNldCBtb3JlIHRoYW4gb25jZSwKQEAgLTQyNSwxMCArNDI2LDI0IEBACiAgICAgICAgIGNvbnN0IGNoYXIgKndoYXRwdHI7CiAgICAgICAgIGJvb2wgZG9uZSA9IEZBTFNFOwogICAgICAgICBib29sIHNlcDsKLSAgICAgICAgc2l6ZV90IGxlbj1zdHJsZW4od2hhdCk7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4od2hhdCk7CiAgICAgICAgIHNpemVfdCBubGVuID0gc3RybGVuKG5hbWUpOwogICAgICAgICBjb25zdCBjaGFyICplbmRvZm4gPSAmcHRyWyBubGVuIF07CiAKKyAgICAgICAgaW5mb2YoZGF0YSwgImNvb2tpZSBzaXplOiBuYW1lL3ZhbCAlZCArICVkIGJ5dGVzXG4iLAorICAgICAgICAgICAgICBubGVuLCBsZW4pOworCisgICAgICAgIGlmKG5sZW4gPj0gKE1BWF9OQU1FLTEpIHx8IGxlbiA+PSAoTUFYX05BTUUtMSkgfHwKKyAgICAgICAgICAgKChubGVuICsgbGVuKSA+IE1BWF9OQU1FKSkgeworICAgICAgICAgIC8qIHRvbyBsb25nIGluZGl2aWR1YWwgbmFtZSBvciBjb250ZW50cywgb3IgdG9vIGxvbmcgY29tYmluYXRpb24gb2YKKyAgICAgICAgICAgICBuYW1lICsgY29udGVudHMuIENocm9tZSBhbmQgRmlyZWZveCBzdXBwb3J0IDQwOTUgb3IgNDA5NiBieXRlcworICAgICAgICAgICAgIGNvbWJvLiAqLworICAgICAgICAgIGZyZWVjb29raWUoY28pOworICAgICAgICAgIGluZm9mKGRhdGEsICJvdmVyc2l6ZWQgY29va2llIGRyb3BwZWQsIG5hbWUvdmFsICVkICsgJWQgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgbmxlbiwgbGVuKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCiAgICAgICAgIC8qIG5hbWUgZW5kcyB3aXRoIGEgJz0nID8gKi8KICAgICAgICAgc2VwID0gKCplbmRvZm4gPT0gJz0nKT9UUlVFOkZBTFNFOwogCkBAIC00NDAsMTggKzQ1NSwxOCBAQAogICAgICAgICAgICAgICBlbmRvZm4tLTsKICAgICAgICAgICAgICAgbmxlbi0tOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZVtubGVuXT0wOyAvKiBuZXcgZW5kIG9mIG5hbWUgKi8KKyAgICAgICAgICAgIG5hbWVbbmxlbl0gPSAwOyAvKiBuZXcgZW5kIG9mIG5hbWUgKi8KICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvKiBTdHJpcCBvZmYgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSAnd2hhdCcgKi8KICAgICAgICAgd2hpbGUobGVuICYmIElTQkxBTksod2hhdFtsZW4tMV0pKSB7Ci0gICAgICAgICAgd2hhdFtsZW4tMV09MDsKKyAgICAgICAgICB3aGF0W2xlbi0xXSA9IDA7CiAgICAgICAgICAgbGVuLS07CiAgICAgICAgIH0KIAogICAgICAgICAvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSAnd2hhdCcgKi8KLSAgICAgICAgd2hhdHB0cj13aGF0OworICAgICAgICB3aGF0cHRyID0gd2hhdDsKICAgICAgICAgd2hpbGUoKndoYXRwdHIgJiYgSVNCTEFOSygqd2hhdHB0cikpCiAgICAgICAgICAgd2hhdHB0cisrOwogCkBAIC00ODQsNiArNDk5LDcgQEAKICAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7IC8qIG91dCBvZiBtZW1vcnkgYmFkICovCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CisgICAgICAgICAgZnJlZShjby0+c3BhdGgpOyAvKiBpZiB0aGlzIGlzIHNldCBhZ2FpbiAqLwogICAgICAgICAgIGNvLT5zcGF0aCA9IHNhbml0aXplX2Nvb2tpZV9wYXRoKGNvLT5wYXRoKTsKICAgICAgICAgICBpZighY28tPnNwYXRoKSB7CiAgICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOyAvKiBvdXQgb2YgbWVtb3J5IGJhZCAqLwpAQCAtNTEwLDcgKzUyNiw3IEBACiAgICAgICAgICAgICAvKiBjaGVjayBmb3IgbW9yZSBkb3RzICovCiAgICAgICAgICAgICBkb3RwID0gc3RyY2hyKHdoYXRwdHIsICcuJyk7CiAgICAgICAgICAgICBpZighZG90cCAmJiAhc3RyY2FzZWNvbXBhcmUoImxvY2FsaG9zdCIsIHdoYXRwdHIpKQotICAgICAgICAgICAgICBkb21haW49IjoiOworICAgICAgICAgICAgICBkb21haW4gPSAiOiI7CiAgICAgICAgICAgfQogI2VuZGlmCiAKQEAgLTUyNSwxNCArNTQxLDE0IEBACiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYoIWlzX2lwKQotICAgICAgICAgICAgICBjby0+dGFpbG1hdGNoPVRSVUU7IC8qIHdlIGFsd2F5cyBkbyB0aGF0IGlmIHRoZSBkb21haW4gbmFtZSB3YXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiAqLworICAgICAgICAgICAgICBjby0+dGFpbG1hdGNoID0gVFJVRTsgLyogd2UgYWx3YXlzIGRvIHRoYXQgaWYgdGhlIGRvbWFpbiBuYW1lIHdhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gKi8KICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAvKiB3ZSBkaWQgbm90IGdldCBhIHRhaWxtYXRjaCBhbmQgdGhlbiB0aGUgYXR0ZW1wdGVkIHNldCBkb21haW4KICAgICAgICAgICAgICAgIGlzIG5vdCBhIGRvbWFpbiB0byB3aGljaCB0aGUgY3VycmVudCBob3N0IGJlbG9uZ3MuIE1hcmsgYXMKICAgICAgICAgICAgICAgIGJhZC4gKi8KLSAgICAgICAgICAgIGJhZGNvb2tpZT1UUlVFOworICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICAgICAgIGluZm9mKGRhdGEsICJza2lwcGVkIGNvb2tpZSB3aXRoIGJhZCB0YWlsbWF0Y2ggZG9tYWluOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgIHdoYXRwdHIpOwogICAgICAgICAgIH0KQEAgLTU4MSwyNiArNTk3LDMyIEBACiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogCi0gICAgICBwdHI9c2VtaXB0cisxOworICAgICAgcHRyID0gc2VtaXB0ciArIDE7CiAgICAgICB3aGlsZSgqcHRyICYmIElTQkxBTksoKnB0cikpCiAgICAgICAgIHB0cisrOwotICAgICAgc2VtaXB0cj1zdHJjaHIocHRyLCAnOycpOyAvKiBub3csIGZpbmQgdGhlIG5leHQgc2VtaWNvbG9uICovCisgICAgICBzZW1pcHRyID0gc3RyY2hyKHB0ciwgJzsnKTsgLyogbm93LCBmaW5kIHRoZSBuZXh0IHNlbWljb2xvbiAqLwogCiAgICAgICBpZighc2VtaXB0ciAmJiAqcHRyKQogICAgICAgICAvKiBUaGVyZSBhcmUgbm8gbW9yZSBzZW1pY29sb25zLCBidXQgdGhlcmUncyBhIGZpbmFsIG5hbWU9dmFsdWUgcGFpcgogICAgICAgICAgICBjb21pbmcgdXAgKi8KLSAgICAgICAgc2VtaXB0cj1zdHJjaHIocHRyLCAnXDAnKTsKKyAgICAgICAgc2VtaXB0ciA9IHN0cmNocihwdHIsICdcMCcpOwogICAgIH0gd2hpbGUoc2VtaXB0cik7CiAKICAgICBpZihjby0+bWF4YWdlKSB7Ci0gICAgICBjby0+ZXhwaXJlcyA9Ci0gICAgICAgIGN1cmx4X3N0cnRvb2ZmdCgoKmNvLT5tYXhhZ2U9PSdcIicpPwotICAgICAgICAgICAgICAgICAgICAgICAgJmNvLT5tYXhhZ2VbMV06JmNvLT5tYXhhZ2VbMF0sIE5VTEwsIDEwKTsKLSAgICAgIGlmKENVUkxfT0ZGX1RfTUFYIC0gbm93IDwgY28tPmV4cGlyZXMpCi0gICAgICAgIC8qIGF2b2lkIG92ZXJmbG93ICovCisgICAgICBDVVJMb2ZmdCBvZmZ0OworICAgICAgb2ZmdCA9IGN1cmx4X3N0cnRvb2ZmdCgoKmNvLT5tYXhhZ2UgPT0gJ1wiJyk/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjby0+bWF4YWdlWzFdOiZjby0+bWF4YWdlWzBdLCBOVUxMLCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvLT5leHBpcmVzKTsKKyAgICAgIGlmKG9mZnQgPT0gQ1VSTF9PRkZUX0ZMT1cpCisgICAgICAgIC8qIG92ZXJmbG93LCB1c2VkIG1heCB2YWx1ZSAqLwogICAgICAgICBjby0+ZXhwaXJlcyA9IENVUkxfT0ZGX1RfTUFYOwotICAgICAgZWxzZQotICAgICAgICBjby0+ZXhwaXJlcyArPSBub3c7CisgICAgICBlbHNlIGlmKCFvZmZ0KSB7CisgICAgICAgIGlmKENVUkxfT0ZGX1RfTUFYIC0gbm93IDwgY28tPmV4cGlyZXMpCisgICAgICAgICAgLyogd291bGQgb3ZlcmZsb3cgKi8KKyAgICAgICAgICBjby0+ZXhwaXJlcyA9IENVUkxfT0ZGX1RfTUFYOworICAgICAgICBlbHNlCisgICAgICAgICAgY28tPmV4cGlyZXMgKz0gbm93OworICAgICAgfQogICAgIH0KICAgICBlbHNlIGlmKGNvLT5leHBpcmVzdHIpIHsKICAgICAgIC8qIE5vdGUgdGhhdCBpZiB0aGUgZGF0ZSBjb3VsZG4ndCBnZXQgcGFyc2VkIGZvciB3aGF0ZXZlciByZWFzb24sCkBAIC02MTksNyArNjQxLDcgQEAKICAgICBpZighYmFkY29va2llICYmICFjby0+ZG9tYWluKSB7CiAgICAgICBpZihkb21haW4pIHsKICAgICAgICAgLyogbm8gZG9tYWluIHdhcyBnaXZlbiBpbiB0aGUgaGVhZGVyIGxpbmUsIHNldCB0aGUgZGVmYXVsdCAqLwotICAgICAgICBjby0+ZG9tYWluPXN0cmR1cChkb21haW4pOworICAgICAgICBjby0+ZG9tYWluID0gc3RyZHVwKGRvbWFpbik7CiAgICAgICAgIGlmKCFjby0+ZG9tYWluKQogICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICB9CkBAIC02MzksMTEgKzY2MSwxMSBAQAogICAgICAgZWxzZQogICAgICAgICBlbmRzbGFzaCA9IG1lbXJjaHIocGF0aCwgJy8nLCAoc2l6ZV90KShxdWVyeXAgLSBwYXRoKSk7CiAgICAgICBpZihlbmRzbGFzaCkgewotICAgICAgICBzaXplX3QgcGF0aGxlbiA9IChzaXplX3QpKGVuZHNsYXNoLXBhdGgrMSk7IC8qIGluY2x1ZGUgZW5kaW5nIHNsYXNoICovCi0gICAgICAgIGNvLT5wYXRoPW1hbGxvYyhwYXRobGVuKzEpOyAvKiBvbmUgZXh0cmEgZm9yIHRoZSB6ZXJvIGJ5dGUgKi8KKyAgICAgICAgc2l6ZV90IHBhdGhsZW4gPSAoc2l6ZV90KShlbmRzbGFzaC1wYXRoICsgMSk7IC8qIGluY2x1ZGUgZW5kIHNsYXNoICovCisgICAgICAgIGNvLT5wYXRoID0gbWFsbG9jKHBhdGhsZW4gKyAxKTsgLyogb25lIGV4dHJhIGZvciB0aGUgemVybyBieXRlICovCiAgICAgICAgIGlmKGNvLT5wYXRoKSB7CiAgICAgICAgICAgbWVtY3B5KGNvLT5wYXRoLCBwYXRoLCBwYXRobGVuKTsKLSAgICAgICAgICBjby0+cGF0aFtwYXRobGVuXT0wOyAvKiB6ZXJvIHRlcm1pbmF0ZSAqLworICAgICAgICAgIGNvLT5wYXRoW3BhdGhsZW5dID0gMDsgLyogemVybyB0ZXJtaW5hdGUgKi8KICAgICAgICAgICBjby0+c3BhdGggPSBzYW5pdGl6ZV9jb29raWVfcGF0aChjby0+cGF0aCk7CiAgICAgICAgICAgaWYoIWNvLT5zcGF0aCkKICAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7IC8qIG91dCBvZiBtZW1vcnkgYmFkICovCkBAIC02NTMsOCArNjc1LDYgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICBmcmVlKHdoYXQpOwotCiAgICAgaWYoYmFkY29va2llIHx8ICFjby0+bmFtZSkgewogICAgICAgLyogd2UgZGlkbid0IGdldCBhIGNvb2tpZSBuYW1lIG9yIGEgYmFkIG9uZSwKICAgICAgICAgIHRoaXMgaXMgYW4gaWxsZWdhbCBsaW5lLCBiYWlsIG91dCAqLwpAQCAtNjY4LDcgKzY4OCw3IEBACiAgICAgICAgcmVhZGluZyB0aGUgb2RkIG5ldHNjYXBlIGNvb2tpZXMtZmlsZSBmb3JtYXQgaGVyZSAqLwogICAgIGNoYXIgKnB0cjsKICAgICBjaGFyICpmaXJzdHB0cjsKLSAgICBjaGFyICp0b2tfYnVmPU5VTEw7CisgICAgY2hhciAqdG9rX2J1ZiA9IE5VTEw7CiAgICAgaW50IGZpZWxkczsKIAogICAgIC8qIElFIGludHJvZHVjZWQgSFRUUC1vbmx5IGNvb2tpZXMgdG8gcHJldmVudCBYU1MgYXR0YWNrcy4gQ29va2llcwpAQCAtNjg5LDE5ICs3MDksMTkgQEAKICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICAvKiBzdHJpcCBvZmYgdGhlIHBvc3NpYmxlIGVuZC1vZi1saW5lIGNoYXJhY3RlcnMgKi8KLSAgICBwdHI9c3RyY2hyKGxpbmVwdHIsICdccicpOworICAgIHB0ciA9IHN0cmNocihsaW5lcHRyLCAnXHInKTsKICAgICBpZihwdHIpCi0gICAgICAqcHRyPTA7IC8qIGNsZWFyIGl0ICovCi0gICAgcHRyPXN0cmNocihsaW5lcHRyLCAnXG4nKTsKKyAgICAgICpwdHIgPSAwOyAvKiBjbGVhciBpdCAqLworICAgIHB0ciA9IHN0cmNocihsaW5lcHRyLCAnXG4nKTsKICAgICBpZihwdHIpCi0gICAgICAqcHRyPTA7IC8qIGNsZWFyIGl0ICovCisgICAgICAqcHRyID0gMDsgLyogY2xlYXIgaXQgKi8KIAotICAgIGZpcnN0cHRyPXN0cnRva19yKGxpbmVwdHIsICJcdCIsICZ0b2tfYnVmKTsgLyogdG9rZW5pemUgaXQgb24gdGhlIFRBQiAqLworICAgIGZpcnN0cHRyID0gc3RydG9rX3IobGluZXB0ciwgIlx0IiwgJnRva19idWYpOyAvKiB0b2tlbml6ZSBpdCBvbiB0aGUgVEFCICovCiAKICAgICAvKiBOb3cgbG9vcCB0aHJvdWdoIHRoZSBmaWVsZHMgYW5kIGluaXQgdGhlIHN0cnVjdCB3ZSBhbHJlYWR5IGhhdmUKICAgICAgICBhbGxvY2F0ZWQgKi8KLSAgICBmb3IocHRyPWZpcnN0cHRyLCBmaWVsZHM9MDsgcHRyICYmICFiYWRjb29raWU7Ci0gICAgICAgIHB0cj1zdHJ0b2tfcihOVUxMLCAiXHQiLCAmdG9rX2J1ZiksIGZpZWxkcysrKSB7CisgICAgZm9yKHB0ciA9IGZpcnN0cHRyLCBmaWVsZHMgPSAwOyBwdHIgJiYgIWJhZGNvb2tpZTsKKyAgICAgICAgcHRyID0gc3RydG9rX3IoTlVMTCwgIlx0IiwgJnRva19idWYpLCBmaWVsZHMrKykgewogICAgICAgc3dpdGNoKGZpZWxkcykgewogICAgICAgY2FzZSAwOgogICAgICAgICBpZihwdHJbMF09PScuJykgLyogc2tpcCBwcmVjZWRpbmcgZG90cyAqLwpAQCAtNzEyLDcgKzczMiw3IEBACiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSAxOgogICAgICAgICAvKiBUaGlzIGZpZWxkIGdvdCBpdHMgZXhwbGFuYXRpb24gb24gdGhlIDIzcmQgb2YgTWF5IDIwMDEgYnkKLSAgICAgICAgICAgQW5kculzIEdhcmPtYToKKyAgICAgICAgICAgQW5kcsOpcyBHYXJjw61hOgogCiAgICAgICAgICAgIGZsYWc6IEEgVFJVRS9GQUxTRSB2YWx1ZSBpbmRpY2F0aW5nIGlmIGFsbCBtYWNoaW5lcyB3aXRoaW4gYSBnaXZlbgogICAgICAgICAgICBkb21haW4gY2FuIGFjY2VzcyB0aGUgdmFyaWFibGUuIFRoaXMgdmFsdWUgaXMgc2V0IGF1dG9tYXRpY2FsbHkgYnkKQEAgLTcyNiw3ICs3NDYsNyBAQAogICAgICAgY2FzZSAyOgogICAgICAgICAvKiBJdCB0dXJucyBvdXQsIHRoYXQgc29tZXRpbWVzIHRoZSBmaWxlIGZvcm1hdCBhbGxvd3MgdGhlIHBhdGgKICAgICAgICAgICAgZmllbGQgdG8gcmVtYWluIG5vdCBmaWxsZWQgaW4sIHdlIHRyeSB0byBkZXRlY3QgdGhpcyBhbmQgd29yawotICAgICAgICAgICBhcm91bmQgaXQhIEFuZHLpcyBHYXJj7WEgbWFkZSB1cyBhd2FyZSBvZiB0aGlzLi4uICovCisgICAgICAgICAgIGFyb3VuZCBpdCEgQW5kcsOpcyBHYXJjw61hIG1hZGUgdXMgYXdhcmUgb2YgdGhpcy4uLiAqLwogICAgICAgICBpZihzdHJjbXAoIlRSVUUiLCBwdHIpICYmIHN0cmNtcCgiRkFMU0UiLCBwdHIpKSB7CiAgICAgICAgICAgLyogb25seSBpZiB0aGUgcGF0aCBkb2Vzbid0IGxvb2sgbGlrZSBhIGJvb2xlYW4gb3B0aW9uISAqLwogICAgICAgICAgIGNvLT5wYXRoID0gc3RyZHVwKHB0cik7CkBAIC03NTMsNyArNzczLDggQEAKICAgICAgICAgY28tPnNlY3VyZSA9IHN0cmNhc2Vjb21wYXJlKHB0ciwgIlRSVUUiKT9UUlVFOkZBTFNFOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgNDoKLSAgICAgICAgY28tPmV4cGlyZXMgPSBjdXJseF9zdHJ0b29mZnQocHRyLCBOVUxMLCAxMCk7CisgICAgICAgIGlmKGN1cmx4X3N0cnRvb2ZmdChwdHIsIE5VTEwsIDEwLCAmY28tPmV4cGlyZXMpKQorICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSA1OgogICAgICAgICBjby0+bmFtZSA9IHN0cmR1cChwdHIpOwpAQCAtODI4LDcgKzg0OSw3IEBACiAgICAgICAgIGlmKHN0cmNhc2Vjb21wYXJlKGNsaXN0LT5kb21haW4sIGNvLT5kb21haW4pICYmCiAgICAgICAgICAgKGNsaXN0LT50YWlsbWF0Y2ggPT0gY28tPnRhaWxtYXRjaCkpCiAgICAgICAgICAgLyogVGhlIGRvbWFpbnMgYXJlIGlkZW50aWNhbCAqLwotICAgICAgICAgIHJlcGxhY2Vfb2xkPVRSVUU7CisgICAgICAgICAgcmVwbGFjZV9vbGQgPSBUUlVFOwogICAgICAgfQogICAgICAgZWxzZSBpZighY2xpc3QtPmRvbWFpbiAmJiAhY28tPmRvbWFpbikKICAgICAgICAgcmVwbGFjZV9vbGQgPSBUUlVFOwpAQCAtOTU3LDcgKzk3OCw3IEBACiB7CiAgIHN0cnVjdCBDb29raWVJbmZvICpjOwogICBGSUxFICpmcCA9IE5VTEw7Ci0gIGJvb2wgZnJvbWZpbGU9VFJVRTsKKyAgYm9vbCBmcm9tZmlsZSA9IFRSVUU7CiAgIGNoYXIgKmxpbmUgPSBOVUxMOwogCiAgIGlmKE5VTEwgPT0gaW5jKSB7CkBAIC05NzcsNyArOTk4LDcgQEAKIAogICBpZihmaWxlICYmICFzdHJjbXAoZmlsZSwgIi0iKSkgewogICAgIGZwID0gc3RkaW47Ci0gICAgZnJvbWZpbGU9RkFMU0U7CisgICAgZnJvbWZpbGUgPSBGQUxTRTsKICAgfQogICBlbHNlIGlmKGZpbGUgJiYgISpmaWxlKSB7CiAgICAgLyogcG9pbnRzIHRvIGEgIiIgc3RyaW5nICovCkBAIC05OTgsMTIgKzEwMTksMTIgQEAKICAgICB3aGlsZShnZXRfbGluZShsaW5lLCBNQVhfQ09PS0lFX0xJTkUsIGZwKSkgewogICAgICAgaWYoY2hlY2twcmVmaXgoIlNldC1Db29raWU6IiwgbGluZSkpIHsKICAgICAgICAgLyogVGhpcyBpcyBhIGNvb2tpZSBsaW5lLCBnZXQgaXQhICovCi0gICAgICAgIGxpbmVwdHI9JmxpbmVbMTFdOwotICAgICAgICBoZWFkZXJsaW5lPVRSVUU7CisgICAgICAgIGxpbmVwdHIgPSAmbGluZVsxMV07CisgICAgICAgIGhlYWRlcmxpbmUgPSBUUlVFOwogICAgICAgfQogICAgICAgZWxzZSB7Ci0gICAgICAgIGxpbmVwdHI9bGluZTsKLSAgICAgICAgaGVhZGVybGluZT1GQUxTRTsKKyAgICAgICAgbGluZXB0ciA9IGxpbmU7CisgICAgICAgIGhlYWRlcmxpbmUgPSBGQUxTRTsKICAgICAgIH0KICAgICAgIHdoaWxlKCpsaW5lcHRyICYmIElTQkxBTksoKmxpbmVwdHIpKQogICAgICAgICBsaW5lcHRyKys7CkBAIC0xMTEzLDcgKzExMzQsNyBAQAogICBzdHJ1Y3QgQ29va2llICpuZXdjbzsKICAgc3RydWN0IENvb2tpZSAqY287CiAgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwotICBzdHJ1Y3QgQ29va2llICptYWluY289TlVMTDsKKyAgc3RydWN0IENvb2tpZSAqbWFpbmNvID0gTlVMTDsKICAgc2l6ZV90IG1hdGNoZXMgPSAwOwogICBib29sIGlzX2lwOwogCkBAIC0xMTg1LDcgKzEyMDYsNyBAQAogCiAgICAgY28gPSBtYWluY287CiAKLSAgICBmb3IoaT0wOyBjbzsgY28gPSBjby0+bmV4dCkKKyAgICBmb3IoaSA9IDA7IGNvOyBjbyA9IGNvLT5uZXh0KQogICAgICAgYXJyYXlbaSsrXSA9IGNvOwogCiAgICAgLyogbm93IHNvcnQgdGhlIGNvb2tpZSBwb2ludGVycyBpbiBwYXRoIGxlbmd0aCBvcmRlciAqLwpAQCAtMTE5NCw4ICsxMjE1LDggQEAKICAgICAvKiByZW1ha2UgdGhlIGxpbmtlZCBsaXN0IG9yZGVyIGFjY29yZGluZyB0byB0aGUgbmV3IG9yZGVyICovCiAKICAgICBtYWluY28gPSBhcnJheVswXTsgLyogc3RhcnQgaGVyZSAqLwotICAgIGZvcihpPTA7IGk8bWF0Y2hlcy0xOyBpKyspCi0gICAgICBhcnJheVtpXS0+bmV4dCA9IGFycmF5W2krMV07CisgICAgZm9yKGkgPSAwOyBpPG1hdGNoZXMtMTsgaSsrKQorICAgICAgYXJyYXlbaV0tPm5leHQgPSBhcnJheVtpICsgMV07CiAgICAgYXJyYXlbbWF0Y2hlcy0xXS0+bmV4dCA9IE5VTEw7IC8qIHRlcm1pbmF0ZSB0aGUgbGlzdCAqLwogCiAgICAgZnJlZShhcnJheSk7IC8qIHJlbW92ZSB0aGUgdGVtcG9yYXJ5IGRhdGEgYWdhaW4gKi8KQEAgLTEzMzUsNyArMTM1Niw3IEBACiB7CiAgIHN0cnVjdCBDb29raWUgKmNvOwogICBGSUxFICpvdXQ7Ci0gIGJvb2wgdXNlX3N0ZG91dD1GQUxTRTsKKyAgYm9vbCB1c2Vfc3Rkb3V0ID0gRkFMU0U7CiAgIGNoYXIgKmZvcm1hdF9wdHI7CiAKICAgaWYoKE5VTEwgPT0gYykgfHwgKDAgPT0gYy0+bnVtY29va2llcykpCkBAIC0xMzQ5LDcgKzEzNzAsNyBAQAogICBpZighc3RyY21wKCItIiwgZHVtcGhlcmUpKSB7CiAgICAgLyogdXNlIHN0ZG91dCAqLwogICAgIG91dCA9IHN0ZG91dDsKLSAgICB1c2Vfc3Rkb3V0PVRSVUU7CisgICAgdXNlX3N0ZG91dCA9IFRSVUU7CiAgIH0KICAgZWxzZSB7CiAgICAgb3V0ID0gZm9wZW4oZHVtcGhlcmUsIEZPUEVOX1dSSVRFVEVYVCk7CkBAIC0xMzgyLDcgKzE0MDMsNyBAQAogICByZXR1cm4gMDsKIH0KIAotc3RydWN0IGN1cmxfc2xpc3QgKkN1cmxfY29va2llX2xpc3Qoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKK3N0YXRpYyBzdHJ1Y3QgY3VybF9zbGlzdCAqY29va2llX2xpc3Qoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKIHsKICAgc3RydWN0IGN1cmxfc2xpc3QgKmxpc3QgPSBOVUxMOwogICBzdHJ1Y3QgY3VybF9zbGlzdCAqYmVnOwpAQCAtMTQxMyw2ICsxNDM0LDE1IEBACiAgIHJldHVybiBsaXN0OwogfQogCitzdHJ1Y3QgY3VybF9zbGlzdCAqQ3VybF9jb29raWVfbGlzdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQoreworICBzdHJ1Y3QgY3VybF9zbGlzdCAqbGlzdDsKKyAgQ3VybF9zaGFyZV9sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSwgQ1VSTF9MT0NLX0FDQ0VTU19TSU5HTEUpOworICBsaXN0ID0gY29va2llX2xpc3QoZGF0YSk7CisgIEN1cmxfc2hhcmVfdW5sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSk7CisgIHJldHVybiBsaXN0OworfQorCiB2b2lkIEN1cmxfZmx1c2hfY29va2llcyhzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCBpbnQgY2xlYW51cCkKIHsKICAgaWYoZGF0YS0+c2V0LnN0cltTVFJJTkdfQ09PS0lFSkFSXSkgewpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY29va2llLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9jb29raWUuaAppbmRleCBhOWE0NTc4Li5jYjUwYjcxIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jb29raWUuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9jb29raWUuaApAQCAtNyw3ICs3LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtNjIsMTMgKzYyLDE2IEBACiAgICB0aGF0IGNvbXByaXNlIHRoZSBjb29raWUgbm9uLXRlcm1pbmFsIGluIHRoZSBzeW50YXggZGVzY3JpcHRpb24gb2YgdGhlCiAgICBTZXQtQ29va2llIGhlYWRlcikiCiAKKyAgIFdlIGFsbG93IG1heCA1MDAwIGJ5dGVzIGNvb2tpZSBoZWFkZXIuIE1heCA0MDk1IGJ5dGVzIGxlbmd0aCBwZXIgY29va2llCisgICBuYW1lIGFuZCB2YWx1ZS4gTmFtZSArIHZhbHVlIG1heSBub3QgZXhjZWVkIDQwOTYgYnl0ZXMuCisKICovCiAjZGVmaW5lIE1BWF9DT09LSUVfTElORSA1MDAwCiAjZGVmaW5lIE1BWF9DT09LSUVfTElORV9UWFQgIjQ5OTkiCiAKLS8qIFRoaXMgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29va2llIG5hbWUgd2UgZGVhbCB3aXRoOiAqLwotI2RlZmluZSBNQVhfTkFNRSAxMDI0Ci0jZGVmaW5lIE1BWF9OQU1FX1RYVCAiMTAyMyIKKy8qIFRoaXMgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29va2llIG5hbWUgb3IgY29udGVudCB3ZSBkZWFsIHdpdGg6ICovCisjZGVmaW5lIE1BWF9OQU1FIDQwOTYKKyNkZWZpbmUgTUFYX05BTUVfVFhUICI0MDk1IgogCiBzdHJ1Y3QgQ3VybF9lYXN5OwogLyoKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfYWRkcmluZm8uYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfYWRkcmluZm8uYwppbmRleCAxYWRmMzE5Li42ZWIyOGJiIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX2FkZHJpbmZvLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9hZGRyaW5mby5jCkBAIC0yODYsNyArMjg2LDcgQEAKIAogICBERUJVR0FTU0VSVCgoaGUtPmhfbmFtZSAhPSBOVUxMKSAmJiAoaGUtPmhfYWRkcl9saXN0ICE9IE5VTEwpKTsKIAotICBmb3IoaT0wOyAoY3VyciA9IGhlLT5oX2FkZHJfbGlzdFtpXSkgIT0gTlVMTDsgaSsrKSB7CisgIGZvcihpID0gMDsgKGN1cnIgPSBoZS0+aF9hZGRyX2xpc3RbaV0pICE9IE5VTEw7IGkrKykgewogCiAgICAgc2l6ZV90IHNzX3NpemU7CiAjaWZkZWYgRU5BQkxFX0lQVjYKQEAgLTU3MCw5ICs1NzAsOSBAQAogICAgICAgICAgICAgICAgICAgIGludCBsaW5lLCBjb25zdCBjaGFyICpzb3VyY2UpCiB7CiAjaWZkZWYgVVNFX0xXSVBTT0NLCi0gIGludCByZXM9bHdpcF9nZXRhZGRyaW5mbyhob3N0bmFtZSwgc2VydmljZSwgaGludHMsIHJlc3VsdCk7CisgIGludCByZXMgPSBsd2lwX2dldGFkZHJpbmZvKGhvc3RuYW1lLCBzZXJ2aWNlLCBoaW50cywgcmVzdWx0KTsKICNlbHNlCi0gIGludCByZXM9KGdldGFkZHJpbmZvKShob3N0bmFtZSwgc2VydmljZSwgaGludHMsIHJlc3VsdCk7CisgIGludCByZXMgPSAoZ2V0YWRkcmluZm8pKGhvc3RuYW1lLCBzZXJ2aWNlLCBoaW50cywgcmVzdWx0KTsKICNlbmRpZgogICBpZigwID09IHJlcykKICAgICAvKiBzdWNjZXNzICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX2NvbmZpZy5oLmNtYWtlIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9jb25maWcuaC5jbWFrZQppbmRleCBmOWQ1NGI0Li5hYmU5ZmZlIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX2NvbmZpZy5oLmNtYWtlCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfY29uZmlnLmguY21ha2UKQEAgLTQyLDkgKzQyLDYgQEAKIC8qIHRvIGRpc2FibGUgUlRTUCAqLwogI2NtYWtlZGVmaW5lIENVUkxfRElTQUJMRV9SVFNQIDEKIAotLyogdG8gZGlzYWJsZSBSVE1QICovCi0jY21ha2VkZWZpbmUgQ1VSTF9ESVNBQkxFX1JUTVAgMQotCiAvKiB0byBkaXNhYmxlIFNNQiAqLwogI2NtYWtlZGVmaW5lIENVUkxfRElTQUJMRV9TTUIgMQogCkBAIC03Myw5ICs3MCw2IEBACiAvKiB3aGVuIG5vdCBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5ICovCiAjY21ha2VkZWZpbmUgQ1VSTF9TVEFUSUNMSUIgMQogCi0vKiBTZXQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHdlIGRvbid0IHdhbnQgdG8gdXNlIHRocmVhZC1zYWZlIGZ1bmN0aW9ucyAqLwotI2NtYWtlZGVmaW5lIERJU0FCTEVEX1RIUkVBRFNBRkUgMQotCiAvKiB5b3VyIEVudHJvcHkgR2F0aGVyaW5nIERhZW1vbiBzb2NrZXQgcGF0aG5hbWUgKi8KICNjbWFrZWRlZmluZSBFR0RfU09DS0VUICR7RUdEX1NPQ0tFVH0KIApAQCAtODg1LDYgKzg3OSw5IEBACiAvKiBUaGUgc2l6ZSBvZiBgb2ZmX3QnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCiBAU0laRU9GX09GRl9UX0NPREVACiAKKy8qIFRoZSBzaXplIG9mIGBjdXJsX29mZl90JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworQFNJWkVPRl9DVVJMX09GRl9UX0NPREVACisKIC8qIFRoZSBzaXplIG9mIGBzaXplX3QnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCiBAU0laRU9GX1NJWkVfVF9DT0RFQAogCkBAIC05NjAsOSArOTU3LDYgQEAKIC8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KICNjbWFrZWRlZmluZSBWRVJTSU9OICR7VkVSU0lPTn0KIAotLyogRGVmaW5lIHRvIGF2b2lkIGF1dG9tYXRpYyBpbmNsdXNpb24gb2Ygd2luc29jay5oICovCi0jY21ha2VkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAxCi0KIC8qIERlZmluZSB0byAxIGlmIE9TIGlzIEFJWC4gKi8KICNpZm5kZWYgX0FMTF9TT1VSQ0UKICMgIHVuZGVmIF9BTExfU09VUkNFCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX2ZubWF0Y2guYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfZm5tYXRjaC5jCmluZGV4IDQ2ZDNhZGEuLjYzMTI2OGIgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfZm5tYXRjaC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfZm5tYXRjaC5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC0xNTEsNyArMTUxLDcgQEAKICAgICAgICAgKCpwKSsrOwogICAgICAgfQogICAgICAgZWxzZSBpZihjID09ICdbJykgewotICAgICAgICBjaGFyIGMyID0gKigoKnApKzEpOworICAgICAgICBjaGFyIGMyID0gKigoKnApICsgMSk7CiAgICAgICAgIGlmKGMyID09ICc6JykgeyAvKiB0aGVyZSBoYXMgdG8gYmUgYSBrZXl3b3JkICovCiAgICAgICAgICAgKCpwKSArPSAyOwogICAgICAgICAgIGlmKHBhcnNla2V5d29yZChwLCBjaGFyc2V0KSkgewpAQCAtMzE5LDkgKzMxOSw5IEBACiAgICAgc3dpdGNoKHN0YXRlKSB7CiAgICAgY2FzZSBDVVJMRk5NX0xPT1BfREVGQVVMVDoKICAgICAgIGlmKCpwID09ICcqJykgewotICAgICAgICB3aGlsZSgqKHArMSkgPT0gJyonKSAvKiBlbGltaW5hdGUgbXVsdGlwbGUgc3RhcnMgKi8KKyAgICAgICAgd2hpbGUoKihwICsgMSkgPT0gJyonKSAvKiBlbGltaW5hdGUgbXVsdGlwbGUgc3RhcnMgKi8KICAgICAgICAgICBwKys7Ci0gICAgICAgIGlmKCpzID09ICdcMCcgJiYgKihwKzEpID09ICdcMCcpCisgICAgICAgIGlmKCpzID09ICdcMCcgJiYgKihwICsgMSkgPT0gJ1wwJykKICAgICAgICAgICByZXR1cm4gQ1VSTF9GTk1BVENIX01BVENIOwogICAgICAgICByYyA9IGxvb3AocCArIDEsIHMpOyAvKiAqLnR4dCBtYXRjaGVzIC50eHQgPD0+IC50eHQgbWF0Y2hlcyAudHh0ICovCiAgICAgICAgIGlmKHJjID09IENVUkxfRk5NQVRDSF9NQVRDSCkKQEAgLTM1MSw3ICszNTEsNyBAQAogICAgICAgICBwKys7CiAgICAgICB9CiAgICAgICBlbHNlIGlmKCpwID09ICdbJykgewotICAgICAgICB1bnNpZ25lZCBjaGFyICpwcCA9IHArMTsgLyogY2Fubm90IGhhbmRsZSB3aXRoIHBvaW50ZXIgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAqcHAgPSBwICsgMTsgLyogY2Fubm90IGhhbmRsZSB3aXRoIHBvaW50ZXIgdG8gcmVnaXN0ZXIgKi8KICAgICAgICAgaWYoc2V0Y2hhcnNldCgmcHAsIGNoYXJzZXQpKSB7CiAgICAgICAgICAgaW50IGZvdW5kID0gRkFMU0U7CiAgICAgICAgICAgaWYoY2hhcnNldFsodW5zaWduZWQgaW50KSpzXSkKQEAgLTM4MSw3ICszODEsNyBAQAogICAgICAgICAgICAgZm91bmQgPSAhZm91bmQ7CiAKICAgICAgICAgICBpZihmb3VuZCkgewotICAgICAgICAgICAgcCA9IHBwKzE7CisgICAgICAgICAgICBwID0gcHAgKyAxOwogICAgICAgICAgICAgcysrOwogICAgICAgICAgICAgbWVtc2V0KGNoYXJzZXQsIDAsIENVUkxGTk1fQ0hTRVRfU0laRSk7CiAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9udGxtX2NvcmUuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfbnRsbV9jb3JlLmMKaW5kZXggYWVhNTQ1Mi4uNTE1NDk0OSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9udGxtX2NvcmUuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX250bG1fY29yZS5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC0zMSw2ICszMSwyNSBAQAogICogaHR0cHM6Ly93d3cuaW5ub3ZhdGlvbi5jaC9qYXZhL250bG0uaHRtbAogICovCiAKKy8qIFBsZWFzZSBrZWVwIHRoZSBTU0wgYmFja2VuZC1zcGVjaWZpYyAjaWYgYnJhbmNoZXMgaW4gdGhpcyBvcmRlcjoKKworICAgMS4gVVNFX09QRU5TU0wKKyAgIDIuIFVTRV9HTlVUTFNfTkVUVExFCisgICAzLiBVU0VfR05VVExTCisgICA0LiBVU0VfTlNTCisgICA1LiBVU0VfTUJFRFRMUworICAgNi4gVVNFX0RBUldJTlNTTAorICAgNy4gVVNFX09TNDAwQ1JZUFRPCisgICA4LiBVU0VfV0lOMzJfQ1JZUFRPCisKKyAgIFRoaXMgZW5zdXJlcyB0aGF0OgorICAgLSB0aGUgc2FtZSBTU0wgYnJhbmNoIGdldHMgYWN0aXZhdGVkIHRocm91Z2hvdXQgdGhpcyBzb3VyY2UKKyAgICAgZmlsZSBldmVuIGlmIG11bHRpcGxlIGJhY2tlbmRzIGFyZSBlbmFibGVkIGF0IHRoZSBzYW1lIHRpbWUuCisgICAtIE9wZW5TU0wgYW5kIE5TUyBoYXZlIGhpZ2hlciBwcmlvcml0eSB0aGFuIFdpbmRvd3MgQ3J5cHQsIGR1ZQorICAgICB0byBpc3N1ZXMgd2l0aCB0aGUgbGF0dGVyIHN1cHBvcnRpbmcgTlRMTTJTZXNzaW9uIHJlc3BvbnNlcworICAgICBpbiBOVExNIHR5cGUtMyBtZXNzYWdlcy4KKyAqLworCiAjaWYgIWRlZmluZWQoVVNFX1dJTkRPV1NfU1NQSSkgfHwgZGVmaW5lZChVU0VfV0lOMzJfQ1JZUFRPKQogCiAjaWZkZWYgVVNFX09QRU5TU0wKQEAgLTc2LDE0ICs5NSw2IEBACiAjICBkZWZpbmUgTUQ1X0RJR0VTVF9MRU5HVEggMTYKICMgIGRlZmluZSBNRDRfRElHRVNUX0xFTkdUSCAxNgogCi0jZWxpZiBkZWZpbmVkKFVTRV9NQkVEVExTKQotCi0jICBpbmNsdWRlIDxtYmVkdGxzL2Rlcy5oPgotIyAgaW5jbHVkZSA8bWJlZHRscy9tZDQuaD4KLSMgIGlmICFkZWZpbmVkKE1CRURUTFNfTUQ0X0MpCi0jICAgIGluY2x1ZGUgImN1cmxfbWQ0LmgiCi0jICBlbmRpZgotCiAjZWxpZiBkZWZpbmVkKFVTRV9OU1MpCiAKICMgIGluY2x1ZGUgPG5zcy5oPgpAQCAtOTIsNiArMTAzLDE0IEBACiAjICBpbmNsdWRlICJjdXJsX21kNC5oIgogIyAgZGVmaW5lIE1ENV9ESUdFU1RfTEVOR1RIIE1ENV9MRU5HVEgKIAorI2VsaWYgZGVmaW5lZChVU0VfTUJFRFRMUykKKworIyAgaW5jbHVkZSA8bWJlZHRscy9kZXMuaD4KKyMgIGluY2x1ZGUgPG1iZWR0bHMvbWQ0Lmg+CisjICBpZiAhZGVmaW5lZChNQkVEVExTX01ENF9DKQorIyAgICBpbmNsdWRlICJjdXJsX21kNC5oIgorIyAgZW5kaWYKKwogI2VsaWYgZGVmaW5lZChVU0VfREFSV0lOU1NMKQogCiAjICBpbmNsdWRlIDxDb21tb25DcnlwdG8vQ29tbW9uQ3J5cHRvci5oPgpAQCAtMTk2LDI2ICsyMTUsNiBAQAogICBnY3J5X2NpcGhlcl9zZXRrZXkoKmRlcywga2V5LCBzaXplb2Yoa2V5KSk7CiB9CiAKLSNlbGlmIGRlZmluZWQoVVNFX01CRURUTFMpCi0KLXN0YXRpYyBib29sIGVuY3J5cHRfZGVzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXlfNTYpCi17Ci0gIG1iZWR0bHNfZGVzX2NvbnRleHQgY3R4OwotICBjaGFyIGtleVs4XTsKLQotICAvKiBFeHBhbmQgdGhlIDU2LWJpdCBrZXkgdG8gNjQtYml0cyAqLwotICBleHRlbmRfa2V5XzU2X3RvXzY0KGtleV81Niwga2V5KTsKLQotICAvKiBTZXQgdGhlIGtleSBwYXJpdHkgdG8gb2RkICovCi0gIG1iZWR0bHNfZGVzX2tleV9zZXRfcGFyaXR5KCh1bnNpZ25lZCBjaGFyICopIGtleSk7Ci0KLSAgLyogUGVyZm9ybSB0aGUgZW5jcnlwdGlvbiAqLwotICBtYmVkdGxzX2Rlc19pbml0KCZjdHgpOwotICBtYmVkdGxzX2Rlc19zZXRrZXlfZW5jKCZjdHgsICh1bnNpZ25lZCBjaGFyICopIGtleSk7Ci0gIHJldHVybiBtYmVkdGxzX2Rlc19jcnlwdF9lY2IoJmN0eCwgaW4sIG91dCkgPT0gMDsKLX0KLQogI2VsaWYgZGVmaW5lZChVU0VfTlNTKQogCiAvKgpAQCAtMjgxLDYgKzI4MCwyNiBAQAogICByZXR1cm4gcnY7CiB9CiAKKyNlbGlmIGRlZmluZWQoVVNFX01CRURUTFMpCisKK3N0YXRpYyBib29sIGVuY3J5cHRfZGVzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXlfNTYpCit7CisgIG1iZWR0bHNfZGVzX2NvbnRleHQgY3R4OworICBjaGFyIGtleVs4XTsKKworICAvKiBFeHBhbmQgdGhlIDU2LWJpdCBrZXkgdG8gNjQtYml0cyAqLworICBleHRlbmRfa2V5XzU2X3RvXzY0KGtleV81Niwga2V5KTsKKworICAvKiBTZXQgdGhlIGtleSBwYXJpdHkgdG8gb2RkICovCisgIG1iZWR0bHNfZGVzX2tleV9zZXRfcGFyaXR5KCh1bnNpZ25lZCBjaGFyICopIGtleSk7CisKKyAgLyogUGVyZm9ybSB0aGUgZW5jcnlwdGlvbiAqLworICBtYmVkdGxzX2Rlc19pbml0KCZjdHgpOworICBtYmVkdGxzX2Rlc19zZXRrZXlfZW5jKCZjdHgsICh1bnNpZ25lZCBjaGFyICopIGtleSk7CisgIHJldHVybiBtYmVkdGxzX2Rlc19jcnlwdF9lY2IoJmN0eCwgaW4sIG91dCkgPT0gMDsKK30KKwogI2VsaWYgZGVmaW5lZChVU0VfREFSV0lOU1NMKQogCiBzdGF0aWMgYm9vbCBlbmNyeXB0X2Rlcyhjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LApAQCAtNDI4LDcgKzQ0Nyw3IEBACiAgIHNldHVwX2Rlc19rZXkoa2V5cyArIDE0LCAmZGVzKTsKICAgZ2NyeV9jaXBoZXJfZW5jcnlwdChkZXMsIHJlc3VsdHMgKyAxNiwgOCwgcGxhaW50ZXh0LCA4KTsKICAgZ2NyeV9jaXBoZXJfY2xvc2UoZGVzKTsKLSNlbGlmIGRlZmluZWQoVVNFX01CRURUTFMpIHx8IGRlZmluZWQoVVNFX05TUykgfHwgZGVmaW5lZChVU0VfREFSV0lOU1NMKSBcCisjZWxpZiBkZWZpbmVkKFVTRV9OU1MpIHx8IGRlZmluZWQoVVNFX01CRURUTFMpIHx8IGRlZmluZWQoVVNFX0RBUldJTlNTTCkgXAogICB8fCBkZWZpbmVkKFVTRV9PUzQwMENSWVBUTykgfHwgZGVmaW5lZChVU0VfV0lOMzJfQ1JZUFRPKQogICBlbmNyeXB0X2RlcyhwbGFpbnRleHQsIHJlc3VsdHMsIGtleXMpOwogICBlbmNyeXB0X2RlcyhwbGFpbnRleHQsIHJlc3VsdHMgKyA4LCBrZXlzICsgNyk7CkBAIC00OTIsNyArNTExLDcgQEAKICAgICBzZXR1cF9kZXNfa2V5KHB3ICsgNywgJmRlcyk7CiAgICAgZ2NyeV9jaXBoZXJfZW5jcnlwdChkZXMsIGxtYnVmZmVyICsgOCwgOCwgbWFnaWMsIDgpOwogICAgIGdjcnlfY2lwaGVyX2Nsb3NlKGRlcyk7Ci0jZWxpZiBkZWZpbmVkKFVTRV9NQkVEVExTKSB8fCBkZWZpbmVkKFVTRV9OU1MpIHx8IGRlZmluZWQoVVNFX0RBUldJTlNTTCkgXAorI2VsaWYgZGVmaW5lZChVU0VfTlNTKSB8fCBkZWZpbmVkKFVTRV9NQkVEVExTKSB8fCBkZWZpbmVkKFVTRV9EQVJXSU5TU0wpIFwKICAgfHwgZGVmaW5lZChVU0VfT1M0MDBDUllQVE8pIHx8IGRlZmluZWQoVVNFX1dJTjMyX0NSWVBUTykKICAgICBlbmNyeXB0X2RlcyhtYWdpYywgbG1idWZmZXIsIHB3KTsKICAgICBlbmNyeXB0X2RlcyhtYWdpYywgbG1idWZmZXIgKyA4LCBwdyArIDcpOwpAQCAtNTcxLDEzICs1OTAsMTggQEAKICAgICBnY3J5X21kX3dyaXRlKE1ENHB3LCBwdywgMiAqIGxlbik7CiAgICAgbWVtY3B5KG50YnVmZmVyLCBnY3J5X21kX3JlYWQoTUQ0cHcsIDApLCBNRDRfRElHRVNUX0xFTkdUSCk7CiAgICAgZ2NyeV9tZF9jbG9zZShNRDRwdyk7Ci0jZWxpZiBkZWZpbmVkKFVTRV9OU1MpIHx8IGRlZmluZWQoVVNFX09TNDAwQ1JZUFRPKSB8fCBcCi0gICAgKGRlZmluZWQoVVNFX01CRURUTFMpICYmICFkZWZpbmVkKE1CRURUTFNfTUQ0X0MpKQorI2VsaWYgZGVmaW5lZChVU0VfTlNTKQogICAgIEN1cmxfbWQ0aXQobnRidWZmZXIsIHB3LCAyICogbGVuKTsKICNlbGlmIGRlZmluZWQoVVNFX01CRURUTFMpCisjaWYgZGVmaW5lZChNQkVEVExTX01ENF9DKQogICAgIG1iZWR0bHNfbWQ0KHB3LCAyICogbGVuLCBudGJ1ZmZlcik7CisjZWxzZQorICAgIEN1cmxfbWQ0aXQobnRidWZmZXIsIHB3LCAyICogbGVuKTsKKyNlbmRpZgogI2VsaWYgZGVmaW5lZChVU0VfREFSV0lOU1NMKQogICAgICh2b2lkKUNDX01ENChwdywgKENDX0xPTkcpKDIgKiBsZW4pLCBudGJ1ZmZlcik7CisjZWxpZiBkZWZpbmVkKFVTRV9PUzQwMENSWVBUTykKKyAgICBDdXJsX21kNGl0KG50YnVmZmVyLCBwdywgMiAqIGxlbik7CiAjZWxpZiBkZWZpbmVkKFVTRV9XSU4zMl9DUllQVE8pCiAgICAgSENSWVBUUFJPViBocHJvdjsKICAgICBpZihDcnlwdEFjcXVpcmVDb250ZXh0KCZocHJvdiwgTlVMTCwgTlVMTCwgUFJPVl9SU0FfRlVMTCwKQEAgLTc4MCw3ICs4MDQsNyBAQAogCiAgIC8qIENvbmNhdGVuYXRlIHRoZSBITUFDIE1ENSBvdXRwdXQgIHdpdGggdGhlIGNsaWVudCBub25jZSAqLwogICBtZW1jcHkobG1yZXNwLCBobWFjX291dHB1dCwgMTYpOwotICBtZW1jcHkobG1yZXNwKzE2LCBjaGFsbGVuZ2VfY2xpZW50LCA4KTsKKyAgbWVtY3B5KGxtcmVzcCArIDE2LCBjaGFsbGVuZ2VfY2xpZW50LCA4KTsKIAogICByZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9udGxtX2NvcmUuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfbnRsbV9jb3JlLmgKaW5kZXggNGE4M2Q0MC4uMDdlZjVkZSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9udGxtX2NvcmUuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX250bG1fY29yZS5oCkBAIC0yNiwxMyArMjYsMTkgQEAKIAogI2lmIGRlZmluZWQoVVNFX05UTE0pCiAKKy8qIElmIE5TUyBpcyB0aGUgZmlyc3QgYXZhaWxhYmxlIFNTTCBiYWNrZW5kIChzZWUgb3JkZXIgaW4gY3VybF9udGxtX2NvcmUuYykKKyAgIHRoZW4gaXQgbXVzdCBiZSBpbml0aWFsaXplZCB0byBiZSB1c2VkIGJ5IE5UTE0uICovCisjaWYgIWRlZmluZWQoVVNFX09QRU5TU0wpICYmIFwKKyAgICAhZGVmaW5lZChVU0VfR05VVExTX05FVFRMRSkgJiYgXAorICAgICFkZWZpbmVkKFVTRV9HTlVUTFMpICYmIFwKKyAgICBkZWZpbmVkKFVTRV9OU1MpCisjZGVmaW5lIE5UTE1fTkVFRFNfTlNTX0lOSVQKKyNlbmRpZgorCiAjaWYgIWRlZmluZWQoVVNFX1dJTkRPV1NfU1NQSSkgfHwgZGVmaW5lZChVU0VfV0lOMzJfQ1JZUFRPKQogCiAjaWZkZWYgVVNFX09QRU5TU0wKLSMgIGlmICFkZWZpbmVkKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIpICYmIFwKLSAgICAgICFkZWZpbmVkKEhFQURFUl9TU0xfSCkgJiYgIWRlZmluZWQoSEVBREVSX01ENV9IKQotIyAgICBlcnJvciAiY3VybF9udGxtX2NvcmUuaCBzaGFsbCBub3QgYmUgaW5jbHVkZWQgYmVmb3JlIE9wZW5TU0wgaGVhZGVycy4iCi0jICBlbmRpZgorIyAgaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KICNlbmRpZgogCiAvKiBEZWZpbmUgVVNFX05UUkVTUE9OU0VTIGluIG9yZGVyIHRvIG1ha2UgdGhlIHR5cGUtMyBtZXNzYWdlIGluY2x1ZGUKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfbnRsbV93Yi5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9udGxtX3diLmMKaW5kZXggOWY1Yjg3Yi4uMDNmNDdhMyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9udGxtX3diLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9udGxtX3diLmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTQ4LDYgKzQ4LDcgQEAKICNpbmNsdWRlICJzZW5kZi5oIgogI2luY2x1ZGUgInNlbGVjdC5oIgogI2luY2x1ZGUgInZhdXRoL250bG0uaCIKKyNpbmNsdWRlICJjdXJsX250bG1fY29yZS5oIgogI2luY2x1ZGUgImN1cmxfbnRsbV93Yi5oIgogI2luY2x1ZGUgInVybC5oIgogI2luY2x1ZGUgInN0cmVycm9yLmgiCkBAIC0xMjMsNyArMTI0LDYgQEAKICAgc3RydWN0IHBhc3N3ZCBwdywgKnB3X3JlczsKICAgY2hhciBwd2J1ZlsxMDI0XTsKICNlbmRpZgotICBpbnQgZXJyb3I7CiAKICAgLyogUmV0dXJuIGlmIGNvbW11bmljYXRpb24gd2l0aCBudGxtX2F1dGggYWxyZWFkeSBzZXQgdXAgKi8KICAgaWYoY29ubi0+bnRsbV9hdXRoX2hscHJfc29ja2V0ICE9IENVUkxfU09DS0VUX0JBRCB8fApAQCAtMTc4LDI2ICsxNzgsMjMgQEAKICAgICBudGxtX2F1dGggPSBOVExNX1dCX0ZJTEU7CiAKICAgaWYoYWNjZXNzKG50bG1fYXV0aCwgWF9PSykgIT0gMCkgewotICAgIGVycm9yID0gRVJSTk87CiAgICAgZmFpbGYoY29ubi0+ZGF0YSwgIkNvdWxkIG5vdCBhY2Nlc3MgbnRsbV9hdXRoOiAlcyBlcnJubyAlZDogJXMiLAotICAgICAgICAgIG50bG1fYXV0aCwgZXJyb3IsIEN1cmxfc3RyZXJyb3IoY29ubiwgZXJyb3IpKTsKKyAgICAgICAgICBudGxtX2F1dGgsIGVycm5vLCBDdXJsX3N0cmVycm9yKGNvbm4sIGVycm5vKSk7CiAgICAgZ290byBkb25lOwogICB9CiAKICAgaWYoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgc29ja2ZkcykpIHsKLSAgICBlcnJvciA9IEVSUk5POwogICAgIGZhaWxmKGNvbm4tPmRhdGEsICJDb3VsZCBub3Qgb3BlbiBzb2NrZXQgcGFpci4gZXJybm8gJWQ6ICVzIiwKLSAgICAgICAgICBlcnJvciwgQ3VybF9zdHJlcnJvcihjb25uLCBlcnJvcikpOworICAgICAgICAgIGVycm5vLCBDdXJsX3N0cmVycm9yKGNvbm4sIGVycm5vKSk7CiAgICAgZ290byBkb25lOwogICB9CiAKICAgY2hpbGRfcGlkID0gZm9yaygpOwogICBpZihjaGlsZF9waWQgPT0gLTEpIHsKLSAgICBlcnJvciA9IEVSUk5POwogICAgIHNjbG9zZShzb2NrZmRzWzBdKTsKICAgICBzY2xvc2Uoc29ja2Zkc1sxXSk7CiAgICAgZmFpbGYoY29ubi0+ZGF0YSwgIkNvdWxkIG5vdCBmb3JrLiBlcnJubyAlZDogJXMiLAotICAgICAgICAgIGVycm9yLCBDdXJsX3N0cmVycm9yKGNvbm4sIGVycm9yKSk7CisgICAgICAgICAgZXJybm8sIEN1cmxfc3RyZXJyb3IoY29ubiwgZXJybm8pKTsKICAgICBnb3RvIGRvbmU7CiAgIH0KICAgZWxzZSBpZighY2hpbGRfcGlkKSB7CkBAIC0yMDgsMTYgKzIwNSwxNCBAQAogICAgIC8qIERvbid0IHVzZSBzY2xvc2UgaW4gdGhlIGNoaWxkIHNpbmNlIGl0IGZvb2xzIHRoZSBzb2NrZXQgbGVhayBkZXRlY3RvciAqLwogICAgIHNjbG9zZV9ub2xvZyhzb2NrZmRzWzBdKTsKICAgICBpZihkdXAyKHNvY2tmZHNbMV0sIFNURElOX0ZJTEVOTykgPT0gLTEpIHsKLSAgICAgIGVycm9yID0gRVJSTk87CiAgICAgICBmYWlsZihjb25uLT5kYXRhLCAiQ291bGQgbm90IHJlZGlyZWN0IGNoaWxkIHN0ZGluLiBlcnJubyAlZDogJXMiLAotICAgICAgICAgICAgZXJyb3IsIEN1cmxfc3RyZXJyb3IoY29ubiwgZXJyb3IpKTsKKyAgICAgICAgICAgIGVycm5vLCBDdXJsX3N0cmVycm9yKGNvbm4sIGVycm5vKSk7CiAgICAgICBleGl0KDEpOwogICAgIH0KIAogICAgIGlmKGR1cDIoc29ja2Zkc1sxXSwgU1RET1VUX0ZJTEVOTykgPT0gLTEpIHsKLSAgICAgIGVycm9yID0gRVJSTk87CiAgICAgICBmYWlsZihjb25uLT5kYXRhLCAiQ291bGQgbm90IHJlZGlyZWN0IGNoaWxkIHN0ZG91dC4gZXJybm8gJWQ6ICVzIiwKLSAgICAgICAgICAgIGVycm9yLCBDdXJsX3N0cmVycm9yKGNvbm4sIGVycm9yKSk7CisgICAgICAgICAgICBlcnJubywgQ3VybF9zdHJlcnJvcihjb25uLCBlcnJubykpOwogICAgICAgZXhpdCgxKTsKICAgICB9CiAKQEAgLTIzNSwxMCArMjMwLDkgQEAKICAgICAgICAgICAgICItLXVzZXJuYW1lIiwgdXNlcm5hbWUsCiAgICAgICAgICAgICBOVUxMKTsKIAotICAgIGVycm9yID0gRVJSTk87CiAgICAgc2Nsb3NlX25vbG9nKHNvY2tmZHNbMV0pOwogICAgIGZhaWxmKGNvbm4tPmRhdGEsICJDb3VsZCBub3QgZXhlY2woKS4gZXJybm8gJWQ6ICVzIiwKLSAgICAgICAgICBlcnJvciwgQ3VybF9zdHJlcnJvcihjb25uLCBlcnJvcikpOworICAgICAgICAgIGVycm5vLCBDdXJsX3N0cmVycm9yKGNvbm4sIGVycm5vKSk7CiAgICAgZXhpdCgxKTsKICAgfQogCkBAIC0zNjQsNyArMzU4LDcgQEAKIAogICAvKiBub3Qgc2V0IG1lYW5zIGVtcHR5ICovCiAgIGlmKCF1c2VycCkKLSAgICB1c2VycD0iIjsKKyAgICB1c2VycCA9ICIiOwogCiAgIHN3aXRjaChudGxtLT5zdGF0ZSkgewogICBjYXNlIE5UTE1TVEFURV9UWVBFMToKQEAgLTQyMCw3ICs0MTQsNyBAQAogICAgIC8qIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkLAogICAgICAqIGRvbid0IHNlbmQgYSBoZWFkZXIgaW4gZnV0dXJlIHJlcXVlc3RzICovCiAgICAgZnJlZSgqYWxsb2N1c2VycHdkKTsKLSAgICAqYWxsb2N1c2VycHdkPU5VTEw7CisgICAgKmFsbG9jdXNlcnB3ZCA9IE5VTEw7CiAgICAgYXV0aHAtPmRvbmUgPSBUUlVFOwogICAgIGJyZWFrOwogICB9CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX3J0bXAuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfcnRtcC5jCmluZGV4IDg3YTZjYWYuLjk3NDMwNjQgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfcnRtcC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfcnRtcC5jCkBAIC03NCw2ICs3NCw3IEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIHJ0bXBfZGlzY29ubmVjdCwgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9SVE1QLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19SVE1QLCAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyovCkBAIC05NCw2ICs5NSw3IEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIHJ0bXBfZGlzY29ubmVjdCwgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9SVE1QVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19SVE1QVCwgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyovCkBAIC0xMTQsNiArMTE2LDcgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgcnRtcF9kaXNjb25uZWN0LCAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICBQT1JUX1JUTVAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX1JUTVBFLCAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzKi8KQEAgLTEzNCw2ICsxMzcsNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBydG1wX2Rpc2Nvbm5lY3QsICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfUlRNUFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fUlRNUFRFLCAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MqLwpAQCAtMTU0LDYgKzE1OCw3IEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIHJ0bXBfZGlzY29ubmVjdCwgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9SVE1QUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19SVE1QUywgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyovCkBAIC0xNzQsNiArMTc5LDcgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgcnRtcF9kaXNjb25uZWN0LCAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICBQT1JUX1JUTVBTLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX1JUTVBUUywgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzKi8KQEAgLTIwMCw3ICsyMDYsNyBAQAogICBSVE1QICpyID0gY29ubi0+cHJvdG8uZ2VuZXJpYzsKICAgU0VUX1JDVlRJTUVPKHR2LCAxMCk7CiAKLSAgci0+bV9zYi5zYl9zb2NrZXQgPSBjb25uLT5zb2NrW0ZJUlNUU09DS0VUXTsKKyAgci0+bV9zYi5zYl9zb2NrZXQgPSAoaW50KWNvbm4tPnNvY2tbRklSU1RTT0NLRVRdOwogCiAgIC8qIFdlIGhhdmUgdG8ga25vdyBpZiBpdCdzIGEgd3JpdGUgYmVmb3JlIHdlIHNlbmQgdGhlCiAgICAqIGNvbm5lY3QgcmVxdWVzdCBwYWNrZXQKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfc2FzbC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9zYXNsLmMKaW5kZXggYmQ1NzRiNS4uNTUwNDMzZCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9zYXNsLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9zYXNsLmMKQEAgLTMzMSw3ICszMzEsOCBAQAogICAgICAgc2FzbC0+YXV0aHVzZWQgPSBTQVNMX01FQ0hfTlRMTTsKIAogICAgICAgaWYoZm9yY2VfaXIgfHwgZGF0YS0+c2V0LnNhc2xfaXIpCi0gICAgICAgIHJlc3VsdCA9IEN1cmxfYXV0aF9jcmVhdGVfbnRsbV90eXBlMV9tZXNzYWdlKGNvbm4tPnVzZXIsIGNvbm4tPnBhc3N3ZCwKKyAgICAgICAgcmVzdWx0ID0gQ3VybF9hdXRoX2NyZWF0ZV9udGxtX3R5cGUxX21lc3NhZ2UoZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubi0+dXNlciwgY29ubi0+cGFzc3dkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ubi0+bnRsbSwgJnJlc3AsICZsZW4pOwogICAgICAgfQogICAgIGVsc2UKQEAgLTQ5Myw3ICs0OTQsOCBAQAogI2lmZGVmIFVTRV9OVExNCiAgIGNhc2UgU0FTTF9OVExNOgogICAgIC8qIENyZWF0ZSB0aGUgdHlwZS0xIG1lc3NhZ2UgKi8KLSAgICByZXN1bHQgPSBDdXJsX2F1dGhfY3JlYXRlX250bG1fdHlwZTFfbWVzc2FnZShjb25uLT51c2VyLCBjb25uLT5wYXNzd2QsCisgICAgcmVzdWx0ID0gQ3VybF9hdXRoX2NyZWF0ZV9udGxtX3R5cGUxX21lc3NhZ2UoZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLT51c2VyLCBjb25uLT5wYXNzd2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbm4tPm50bG0sICZyZXNwLCAmbGVuKTsKICAgICBuZXdzdGF0ZSA9IFNBU0xfTlRMTV9UWVBFMk1TRzsKICAgICBicmVhazsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfc2V0dXAuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfc2V0dXAuaAppbmRleCBhNjI2OGFkLi41ODgwZGMwIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX3NldHVwLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9zZXR1cC5oCkBAIC03LDcgKzcsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC0yMiw2ICsyMiwxMCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZiBkZWZpbmVkKEJVSUxESU5HX0xJQkNVUkwpICYmICFkZWZpbmVkKENVUkxfTk9fT0xESUVTKQorI2RlZmluZSBDVVJMX05PX09MRElFUworI2VuZGlmCisKIC8qCiAgKiBEZWZpbmUgV0lOMzIgd2hlbiBidWlsZCB0YXJnZXQgaXMgV2luMzIgQVBJCiAgKi8KQEAgLTMxLDYgKzM1LDE3IEBACiAjZGVmaW5lIFdJTjMyCiAjZW5kaWYKIAorI2lmZGVmIFdJTjMyCisvKgorICogRG9uJ3QgaW5jbHVkZSB1bm5lZWRlZCBzdHVmZiBpbiBXaW5kb3dzIGhlYWRlcnMgdG8gYXZvaWQgY29tcGlsZXIKKyAqIHdhcm5pbmdzIGFuZCBtYWNybyBjbGFzaGVzLgorICogTWFrZSBzdXJlIHRvIGRlZmluZSB0aGlzIG1hY3JvIGJlZm9yZSBpbmNsdWRpbmcgYW55IFdpbmRvd3MgaGVhZGVycy4KKyAqLworIyAgaWZuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgICAgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgIGVuZGlmCisjZW5kaWYKKwogLyoKICAqIEluY2x1ZGUgY29uZmlndXJhdGlvbiBzY3JpcHQgcmVzdWx0cyBvciBoYW5kLWNyYWZ0ZWQKICAqIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgcGxhdGZvcm1zIHdoaWNoIGxhY2sgY29uZmlnIHRvb2wuCkBAIC0xMzAsMTQgKzE0NSw3IEBACiAKICNpbmNsdWRlIDxjdXJsL2N1cmwuaD4KIAotLyoKLSAqIEVuc3VyZSB0aGF0IG5vIG9uZSBpcyB1c2luZyB0aGUgb2xkIFNJWkVPRl9DVVJMX09GRl9UIG1hY3JvCi0gKi8KLQotI2lmZGVmIFNJWkVPRl9DVVJMX09GRl9UCi0jICBlcnJvciAiU0laRU9GX0NVUkxfT0ZGX1Qgc2hhbGwgbm90IGJlIGRlZmluZWQhIgotICAgRXJyb3IgQ29tcGlsYXRpb25fYWJvcnRlZF9TSVpFT0ZfQ1VSTF9PRkZfVF9zaGFsbF9ub3RfYmVfZGVmaW5lZAotI2VuZGlmCisjZGVmaW5lIENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgU0laRU9GX0NVUkxfT0ZGX1QKIAogLyoKICAqIERpc2FibGUgb3RoZXIgcHJvdG9jb2xzIHdoZW4gaHR0cCBpcyB0aGUgb25seSBvbmUgZGVzaXJlZC4KQEAgLTE3NCw5ICsxODIsNiBAQAogIyAgaWZuZGVmIENVUkxfRElTQUJMRV9TTVRQCiAjICAgIGRlZmluZSBDVVJMX0RJU0FCTEVfU01UUAogIyAgZW5kaWYKLSMgIGlmbmRlZiBDVVJMX0RJU0FCTEVfUlRNUAotIyAgICBkZWZpbmUgQ1VSTF9ESVNBQkxFX1JUTVAKLSMgIGVuZGlmCiAjICBpZm5kZWYgQ1VSTF9ESVNBQkxFX0dPUEhFUgogIyAgICBkZWZpbmUgQ1VSTF9ESVNBQkxFX0dPUEhFUgogIyAgZW5kaWYKQEAgLTE5NSw3ICsyMDAsNyBAQAogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiBObyBzeXN0ZW0gaGVhZGVyIGZpbGUgc2hhbGwgYmUgaW5jbHVkZWQgaW4gdGhpcyBmaWxlIGJlZm9yZSB0aGlzICovCi0vKiBwb2ludC4gVGhlIG9ubHkgYWxsb3dlZCBvbmVzIGFyZSB0aG9zZSBpbmNsdWRlZCBmcm9tIGN1cmxidWlsZC5oICovCisvKiBwb2ludC4gVGhlIG9ubHkgYWxsb3dlZCBvbmVzIGFyZSB0aG9zZSBpbmNsdWRlZCBmcm9tIGN1cmwvc3lzdGVtLmggKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAogLyoKQEAgLTI0MSw5ICsyNDYsNiBAQAogIyAgaWYgZGVmaW5lZChfVU5JQ09ERSkgJiYgIWRlZmluZWQoVU5JQ09ERSkKICMgICAgZGVmaW5lIFVOSUNPREUKICMgIGVuZGlmCi0jICBpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgotIyAgICBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotIyAgZW5kaWYKICMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KICMgIGlmZGVmIEhBVkVfV0lOU09DSzJfSAogIyAgICBpbmNsdWRlIDx3aW5zb2NrMi5oPgpAQCAtNjU1LDkgKzY1Nyw4IEBACiAjZW5kaWYKICNlbmRpZgogCi0vKiBub24tY29uZmlndXJlIGJ1aWxkcyBtYXkgZGVmaW5lIENVUkxfV0FOVFNfQ0FfQlVORExFX0VOViAqLwotI2lmIGRlZmluZWQoQ1VSTF9XQU5UU19DQV9CVU5ETEVfRU5WKSAmJiAhZGVmaW5lZChDVVJMX0NBX0JVTkRMRSkKLSNkZWZpbmUgQ1VSTF9DQV9CVU5ETEUgZ2V0ZW52KCJDVVJMX0NBX0JVTkRMRSIpCisjaWZkZWYgQ1VSTF9XQU5UU19DQV9CVU5ETEVfRU5WCisjZXJyb3IgIk5vIGxvbmdlciBzdXBwb3J0ZWQuIFNldCBDVVJMT1BUX0NBSU5GTyBhdCBydW50aW1lIGluc3RlYWQuIgogI2VuZGlmCiAKIC8qCkBAIC03MzEsNiArNzMyLDcgQEAKICNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKE1TRE9TKQogI2RlZmluZSBGT1BFTl9SRUFEVEVYVCAicnQiCiAjZGVmaW5lIEZPUEVOX1dSSVRFVEVYVCAid3QiCisjZGVmaW5lIEZPUEVOX0FQUEVORFRFWFQgImF0IgogI2VsaWYgZGVmaW5lZChfX0NZR1dJTl9fKQogLyogQ3lnd2luIGhhcyBzcGVjaWZpYyBiZWhhdmlvciB3ZSBuZWVkIHRvIGFkZHJlc3Mgd2hlbiBXSU4zMiBpcyBub3QgZGVmaW5lZC4KIGh0dHBzOi8vY3lnd2luLmNvbS9jeWd3aW4tdWctbmV0L3VzaW5nLXRleHRiaW5hcnkuaHRtbApAQCAtNzQwLDkgKzc0MiwxMSBAQAogKi8KICNkZWZpbmUgRk9QRU5fUkVBRFRFWFQgInJ0IgogI2RlZmluZSBGT1BFTl9XUklURVRFWFQgInciCisjZGVmaW5lIEZPUEVOX0FQUEVORFRFWFQgImEiCiAjZWxzZQogI2RlZmluZSBGT1BFTl9SRUFEVEVYVCAiciIKICNkZWZpbmUgRk9QRU5fV1JJVEVURVhUICJ3IgorI2RlZmluZSBGT1BFTl9BUFBFTkRURVhUICJhIgogI2VuZGlmCiAKIC8qIFdpblNvY2sgZGVzdHJveXMgcmVjdigpIGJ1ZmZlciB3aGVuIHNlbmQoKSBmYWlsZWQuCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX3NldHVwX29uY2UuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfc2V0dXBfb25jZS5oCmluZGV4IDY4NDE4N2MuLmE1YjU0MmMgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfc2V0dXBfb25jZS5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfc2V0dXBfb25jZS5oCkBAIC00MzYsMjAgKzQzNiw2IEBACiAKIAogLyoKLSAqIE1hY3JvIEVSUk5PIC8gU0VUX0VSUk5PKCkgcmV0dXJucyAvIHNldHMgdGhlIE5PVCAqc29ja2V0LXJlbGF0ZWQqIGVycm5vCi0gKiAob3IgZXF1aXZhbGVudCkgb24gdGhpcyBwbGF0Zm9ybSB0byBoaWRlIHBsYXRmb3JtIGRldGFpbHMgdG8gY29kZSB1c2luZyBpdC4KLSAqLwotCi0jaWYgZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoVVNFX0xXSVBTT0NLKQotI2RlZmluZSBFUlJOTyAgICAgICAgICgoaW50KUdldExhc3RFcnJvcigpKQotI2RlZmluZSBTRVRfRVJSTk8oeCkgIChTZXRMYXN0RXJyb3IoKERXT1JEKSh4KSkpCi0jZWxzZQotI2RlZmluZSBFUlJOTyAgICAgICAgIChlcnJubykKLSNkZWZpbmUgU0VUX0VSUk5PKHgpICAoZXJybm8gPSAoeCkpCi0jZW5kaWYKLQotCi0vKgogICogUG9ydGFibGUgZXJyb3IgbnVtYmVyIHN5bWJvbGljIG5hbWVzIGRlZmluZWQgdG8gV2luc29jayBlcnJvciBjb2Rlcy4KICAqLwogCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX3RocmVhZHMuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfdGhyZWFkcy5jCmluZGV4IGE3OGVmZjUuLmMxNjI0YTkgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfdGhyZWFkcy5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfdGhyZWFkcy5jCkBAIC0xMDQsMTUgKzEwNCwyMiBAQAogY3VybF90aHJlYWRfdCBDdXJsX3RocmVhZF9jcmVhdGUodW5zaWduZWQgaW50IChDVVJMX1NURENBTEwgKmZ1bmMpICh2b2lkICopLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKQogewotI2lmZGVmIF9XSU4zMl9XQ0UKLSAgcmV0dXJuIENyZWF0ZVRocmVhZChOVUxMLCAwLCBmdW5jLCBhcmcsIDAsIE5VTEwpOwotI2Vsc2UKICAgY3VybF90aHJlYWRfdCB0OworI2lmZGVmIF9XSU4zMl9XQ0UKKyAgdCA9IENyZWF0ZVRocmVhZChOVUxMLCAwLCBmdW5jLCBhcmcsIDAsIE5VTEwpOworI2Vsc2UKICAgdCA9IChjdXJsX3RocmVhZF90KV9iZWdpbnRocmVhZGV4KE5VTEwsIDAsIGZ1bmMsIGFyZywgMCwgTlVMTCk7Ci0gIGlmKCh0ID09IDApIHx8ICh0ID09IChjdXJsX3RocmVhZF90KS0xTCkpCi0gICAgcmV0dXJuIGN1cmxfdGhyZWFkX3RfbnVsbDsKLSAgcmV0dXJuIHQ7CiAjZW5kaWYKKyAgaWYoKHQgPT0gMCkgfHwgKHQgPT0gTG9uZ1RvSGFuZGxlKC0xTCkpKSB7CisjaWZkZWYgX1dJTjMyX1dDRQorICAgIERXT1JEIGdsZSA9IEdldExhc3RFcnJvcigpOworICAgIGVycm5vID0gKChnbGUgPT0gRVJST1JfQUNDRVNTX0RFTklFRCB8fAorICAgICAgICAgICAgICBnbGUgPT0gRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpID8KKyAgICAgICAgICAgICBFQUNDRVMgOiBFSU5WQUwpOworI2VuZGlmCisgICAgcmV0dXJuIGN1cmxfdGhyZWFkX3RfbnVsbDsKKyAgfQorICByZXR1cm4gdDsKIH0KIAogdm9pZCBDdXJsX3RocmVhZF9kZXN0cm95KGN1cmxfdGhyZWFkX3QgaG5kKQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvZGljdC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvZGljdC5jCmluZGV4IDQ1MWVjMzguLjRmYzg1NTIgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2RpY3QuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9kaWN0LmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTg1LDYgKzg1LDcgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICBQT1JUX0RJQ1QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX0RJQ1QsICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX05PTkUgfCBQUk9UT1BUX05PVVJMUVVFUlkgICAgICAvKiBmbGFncyAqLwpAQCAtOTcsNyArOTgsNyBAQAogICBjaGFyICpwdHI7CiAgIHNpemVfdCBsZW47CiAgIGNoYXIgY2g7Ci0gIGludCBvbGVuPTA7CisgIGludCBvbGVuID0gMDsKIAogICBDVVJMY29kZSByZXN1bHQgPSBDdXJsX3VybGRlY29kZShkYXRhLCBpbnB1dGJ1ZmYsIDAsICZuZXdwLCAmbGVuLCBGQUxTRSk7CiAgIGlmKCFuZXdwIHx8IHJlc3VsdCkKQEAgLTExNiw3ICsxMTcsNyBAQAogICAgICAgfQogICAgICAgZGljdHBbb2xlbisrXSA9IGNoOwogICAgIH0KLSAgICBkaWN0cFtvbGVuXT0wOworICAgIGRpY3RwW29sZW5dID0gMDsKICAgfQogICBmcmVlKG5ld3ApOwogICByZXR1cm4gZGljdHA7CkBAIC0xMzEsOCArMTMyLDggQEAKICAgY2hhciAqc3RyYXRlZ3kgPSBOVUxMOwogICBjaGFyICpudGhkZWYgPSBOVUxMOyAvKiBUaGlzIGlzIG5vdCBwYXJ0IG9mIHRoZSBwcm90b2NvbCwgYnV0IHJlcXVpcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IFJGQyAyMjI5ICovCi0gIENVUkxjb2RlIHJlc3VsdD1DVVJMRV9PSzsKLSAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YT1jb25uLT5kYXRhOworICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKKyAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIGN1cmxfc29ja2V0X3Qgc29ja2ZkID0gY29ubi0+c29ja1tGSVJTVFNPQ0tFVF07CiAKICAgY2hhciAqcGF0aCA9IGRhdGEtPnN0YXRlLnBhdGg7CkBAIC0xNjcsNyArMTY4LDcgQEAKIAogICAgIGlmKCh3b3JkID09IE5VTEwpIHx8ICgqd29yZCA9PSAoY2hhcikwKSkgewogICAgICAgaW5mb2YoZGF0YSwgImxvb2t1cCB3b3JkIGlzIG1pc3NpbmdcbiIpOwotICAgICAgd29yZD0oY2hhciAqKSJkZWZhdWx0IjsKKyAgICAgIHdvcmQgPSAoY2hhciAqKSJkZWZhdWx0IjsKICAgICB9CiAgICAgaWYoKGRhdGFiYXNlID09IE5VTEwpIHx8ICgqZGF0YWJhc2UgPT0gKGNoYXIpMCkpIHsKICAgICAgIGRhdGFiYXNlID0gKGNoYXIgKikiISI7CkBAIC0yMjEsNyArMjIyLDcgQEAKIAogICAgIGlmKCh3b3JkID09IE5VTEwpIHx8ICgqd29yZCA9PSAoY2hhcikwKSkgewogICAgICAgaW5mb2YoZGF0YSwgImxvb2t1cCB3b3JkIGlzIG1pc3NpbmdcbiIpOwotICAgICAgd29yZD0oY2hhciAqKSJkZWZhdWx0IjsKKyAgICAgIHdvcmQgPSAoY2hhciAqKSJkZWZhdWx0IjsKICAgICB9CiAgICAgaWYoKGRhdGFiYXNlID09IE5VTEwpIHx8ICgqZGF0YWJhc2UgPT0gKGNoYXIpMCkpIHsKICAgICAgIGRhdGFiYXNlID0gKGNoYXIgKikiISI7CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9kb3Rkb3QuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2RvdGRvdC5jCmluZGV4IDIwNjAzYmMuLmNiYjMwOGQgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2RvdGRvdC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2RvdGRvdC5jCkBAIC01NSw3ICs1NSw3IEBACiAgIHNpemVfdCBpbmxlbiA9IHN0cmxlbihpbnB1dCk7CiAgIGNoYXIgKmNsb25lOwogICBzaXplX3QgY2xlbiA9IGlubGVuOyAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBjbG9uZWQgaW5wdXQgKi8KLSAgY2hhciAqb3V0ID0gbWFsbG9jKGlubGVuKzEpOworICBjaGFyICpvdXQgPSBtYWxsb2MoaW5sZW4gKyAxKTsKICAgY2hhciAqb3V0cHRyOwogICBjaGFyICpvcmdjbG9uZTsKICAgY2hhciAqcXVlcnlwOwpAQCAtOTIsMjUgKzkyLDI1IEBACiAgICAgICAgIHJlbW92ZSB0aGF0IHByZWZpeCBmcm9tIHRoZSBpbnB1dCBidWZmZXI7IG90aGVyd2lzZSwgKi8KIAogICAgIGlmKCFzdHJuY21wKCIuLyIsIGNsb25lLCAyKSkgewotICAgICAgY2xvbmUrPTI7Ci0gICAgICBjbGVuLT0yOworICAgICAgY2xvbmUgKz0gMjsKKyAgICAgIGNsZW4gLT0gMjsKICAgICB9CiAgICAgZWxzZSBpZighc3RybmNtcCgiLi4vIiwgY2xvbmUsIDMpKSB7Ci0gICAgICBjbG9uZSs9MzsKLSAgICAgIGNsZW4tPTM7CisgICAgICBjbG9uZSArPSAzOworICAgICAgY2xlbiAtPSAzOwogICAgIH0KIAogICAgIC8qICBCLiAgaWYgdGhlIGlucHV0IGJ1ZmZlciBiZWdpbnMgd2l0aCBhIHByZWZpeCBvZiAiLy4vIiBvciAiLy4iLCB3aGVyZQogICAgICAgICAiLiIgIGlzIGEgY29tcGxldGUgcGF0aCBzZWdtZW50LCB0aGVuIHJlcGxhY2UgdGhhdCBwcmVmaXggd2l0aCAiLyIgaW4KICAgICAgICAgdGhlIGlucHV0IGJ1ZmZlcjsgb3RoZXJ3aXNlLCAqLwogICAgIGVsc2UgaWYoIXN0cm5jbXAoIi8uLyIsIGNsb25lLCAzKSkgewotICAgICAgY2xvbmUrPTI7Ci0gICAgICBjbGVuLT0yOworICAgICAgY2xvbmUgKz0gMjsKKyAgICAgIGNsZW4gLT0gMjsKICAgICB9CiAgICAgZWxzZSBpZighc3RyY21wKCIvLiIsIGNsb25lKSkgewogICAgICAgY2xvbmVbMV09Jy8nOwogICAgICAgY2xvbmUrKzsKLSAgICAgIGNsZW4tPTE7CisgICAgICBjbGVuIC09IDE7CiAgICAgfQogCiAgICAgLyogIEMuICBpZiB0aGUgaW5wdXQgYnVmZmVyIGJlZ2lucyB3aXRoIGEgcHJlZml4IG9mICIvLi4vIiBvciAiLy4uIiwgd2hlcmUKQEAgLTExOSw4ICsxMTksOCBAQAogICAgICAgICBhbnkpIGZyb20gdGhlIG91dHB1dCBidWZmZXI7IG90aGVyd2lzZSwgKi8KIAogICAgIGVsc2UgaWYoIXN0cm5jbXAoIi8uLi8iLCBjbG9uZSwgNCkpIHsKLSAgICAgIGNsb25lKz0zOwotICAgICAgY2xlbi09MzsKKyAgICAgIGNsb25lICs9IDM7CisgICAgICBjbGVuIC09IDM7CiAgICAgICAvKiByZW1vdmUgdGhlIGxhc3Qgc2VnbWVudCBmcm9tIHRoZSBvdXRwdXQgYnVmZmVyICovCiAgICAgICB3aGlsZShvdXRwdHIgPiBvdXQpIHsKICAgICAgICAgb3V0cHRyLS07CkBAIC0xMzEsOCArMTMxLDggQEAKICAgICB9CiAgICAgZWxzZSBpZighc3RyY21wKCIvLi4iLCBjbG9uZSkpIHsKICAgICAgIGNsb25lWzJdPScvJzsKLSAgICAgIGNsb25lKz0yOwotICAgICAgY2xlbi09MjsKKyAgICAgIGNsb25lICs9IDI7CisgICAgICBjbGVuIC09IDI7CiAgICAgICAvKiByZW1vdmUgdGhlIGxhc3Qgc2VnbWVudCBmcm9tIHRoZSBvdXRwdXQgYnVmZmVyICovCiAgICAgICB3aGlsZShvdXRwdHIgPiBvdXQpIHsKICAgICAgICAgb3V0cHRyLS07CkBAIC0xNDYsOCArMTQ2LDggQEAKICAgICAgICAgdGhhdCBmcm9tIHRoZSBpbnB1dCBidWZmZXI7IG90aGVyd2lzZSwgKi8KIAogICAgIGVsc2UgaWYoIXN0cmNtcCgiLiIsIGNsb25lKSB8fCAhc3RyY21wKCIuLiIsIGNsb25lKSkgewotICAgICAgKmNsb25lPTA7Ci0gICAgICAqb3V0PTA7CisgICAgICAqY2xvbmUgPSAwOworICAgICAgKm91dCA9IDA7CiAgICAgfQogCiAgICAgZWxzZSB7CkBAIC0xNzIsNyArMTcyLDcgQEAKICAgICAgICBmcm9tIHRoZSBjb3JyZWN0IGluZGV4LiAqLwogICAgIHNpemVfdCBvaW5kZXggPSBxdWVyeXAgLSBvcmdjbG9uZTsKICAgICBxbGVuID0gc3RybGVuKCZpbnB1dFtvaW5kZXhdKTsKLSAgICBtZW1jcHkob3V0cHRyLCAmaW5wdXRbb2luZGV4XSwgcWxlbisxKTsgLyogaW5jbHVkZSB0aGUgZW5kaW5nIHplcm8gYnl0ZSAqLworICAgIG1lbWNweShvdXRwdHIsICZpbnB1dFtvaW5kZXhdLCBxbGVuICsgMSk7IC8qIGluY2x1ZGUgdGhlIGVuZCB6ZXJvIGJ5dGUgKi8KICAgfQogCiAgIGZyZWUob3JnY2xvbmUpOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvZWFzeS5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvZWFzeS5jCmluZGV4IDJiMWNlOWUuLjUzMjhmOWMgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2Vhc3kuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9lYXN5LmMKQEAgLTQzMyw3ICs0MzMsNyBAQAogICovCiBzdGF0aWMgaW50IHBvbGwyY3NlbGVjdChpbnQgcG9sbG1hc2spCiB7Ci0gIGludCBvbWFzaz0wOworICBpbnQgb21hc2sgPSAwOwogICBpZihwb2xsbWFzayAmIFBPTExJTikKICAgICBvbWFzayB8PSBDVVJMX0NTRUxFQ1RfSU47CiAgIGlmKHBvbGxtYXNrICYgUE9MTE9VVCkKQEAgLTQ1MCw3ICs0NTAsNyBAQAogICovCiBzdGF0aWMgc2hvcnQgc29ja2V0Y2IycG9sbChpbnQgcG9sbG1hc2spCiB7Ci0gIHNob3J0IG9tYXNrPTA7CisgIHNob3J0IG9tYXNrID0gMDsKICAgaWYocG9sbG1hc2sgJiBDVVJMX1BPTExfSU4pCiAgICAgb21hc2sgfD0gUE9MTElOOwogICBpZihwb2xsbWFzayAmIENVUkxfUE9MTF9PVVQpCkBAIC00NzMsNyArNDczLDcgQEAKIHsKICAgc3RydWN0IGV2ZW50cyAqZXYgPSB1c2VycDsKICAgc3RydWN0IHNvY2tldG1vbml0b3IgKm07Ci0gIHN0cnVjdCBzb2NrZXRtb25pdG9yICpwcmV2PU5VTEw7CisgIHN0cnVjdCBzb2NrZXRtb25pdG9yICpwcmV2ID0gTlVMTDsKIAogI2lmIGRlZmluZWQoQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUykKICAgKHZvaWQpIGVhc3k7CkBAIC01NjksMTQgKzU2OSwxNCBAQAogICAgIHN0cnVjdCBzb2NrZXRtb25pdG9yICptOwogICAgIHN0cnVjdCBwb2xsZmQgKmY7CiAgICAgc3RydWN0IHBvbGxmZCBmZHNbNF07Ci0gICAgaW50IG51bWZkcz0wOworICAgIGludCBudW1mZHMgPSAwOwogICAgIGludCBwb2xscmM7CiAgICAgaW50IGk7Ci0gICAgc3RydWN0IHRpbWV2YWwgYmVmb3JlOwotICAgIHN0cnVjdCB0aW1ldmFsIGFmdGVyOworICAgIHN0cnVjdCBjdXJsdGltZSBiZWZvcmU7CisgICAgc3RydWN0IGN1cmx0aW1lIGFmdGVyOwogCiAgICAgLyogcG9wdWxhdGUgdGhlIGZkc1tdIGFycmF5ICovCi0gICAgZm9yKG0gPSBldi0+bGlzdCwgZj0mZmRzWzBdOyBtOyBtID0gbS0+bmV4dCkgeworICAgIGZvcihtID0gZXYtPmxpc3QsIGYgPSAmZmRzWzBdOyBtOyBtID0gbS0+bmV4dCkgewogICAgICAgZi0+ZmQgPSBtLT5zb2NrZXQuZmQ7CiAgICAgICBmLT5ldmVudHMgPSBtLT5zb2NrZXQuZXZlbnRzOwogICAgICAgZi0+cmV2ZW50cyA9IDA7CkBAIC02NTMsNyArNjUzLDkgQEAKICAqLwogc3RhdGljIENVUkxjb2RlIGVhc3lfZXZlbnRzKHN0cnVjdCBDdXJsX211bHRpICptdWx0aSkKIHsKLSAgc3RydWN0IGV2ZW50cyBldnM9IHsyLCBGQUxTRSwgMCwgTlVMTCwgMH07CisgIC8qIHRoaXMgc3RydWN0IGlzIG1hZGUgc3RhdGljIHRvIGFsbG93IGl0IHRvIGJlIHVzZWQgYWZ0ZXIgdGhpcyBmdW5jdGlvbgorICAgICByZXR1cm5zIGFuZCBjdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoKSBpcyBjYWxsZWQgKi8KKyAgc3RhdGljIHN0cnVjdCBldmVudHMgZXZzID0gezIsIEZBTFNFLCAwLCBOVUxMLCAwfTsKIAogICAvKiBpZiBydW5uaW5nIGV2ZW50LWJhc2VkLCBkbyBzb21lIGZ1cnRoZXIgbXVsdGkgaW5pdHMgKi8KICAgZXZlbnRzX3NldHVwKG11bHRpLCAmZXZzKTsKQEAgLTY3MCw3ICs2NzIsNyBAQAogICBib29sIGRvbmUgPSBGQUxTRTsKICAgQ1VSTE1jb2RlIG1jb2RlID0gQ1VSTE1fT0s7CiAgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOwotICBzdHJ1Y3QgdGltZXZhbCBiZWZvcmU7CisgIHN0cnVjdCBjdXJsdGltZSBiZWZvcmU7CiAgIGludCB3aXRob3V0X2ZkcyA9IDA7ICAvKiBjb3VudCBudW1iZXIgb2YgY29uc2VjdXRpdmUgcmV0dXJucyBmcm9tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX211bHRpX3dhaXQoKSB3aXRob3V0IGFueSBmaWxlZGVzY3JpcHRvcnMgKi8KIApAQCAtNjgzLDcgKzY4NSw3IEBACiAKICAgICBpZighbWNvZGUpIHsKICAgICAgIGlmKCFyYykgewotICAgICAgICBzdHJ1Y3QgdGltZXZhbCBhZnRlciA9IGN1cmx4X3R2bm93KCk7CisgICAgICAgIHN0cnVjdCBjdXJsdGltZSBhZnRlciA9IGN1cmx4X3R2bm93KCk7CiAKICAgICAgICAgLyogSWYgaXQgcmV0dXJucyB3aXRob3V0IGFueSBmaWxlZGVzY3JpcHRvciBpbnN0YW50bHksIHdlIG5lZWQgdG8KICAgICAgICAgICAgYXZvaWQgYnVzeS1sb29waW5nIGR1cmluZyBwZXJpb2RzIHdoZXJlIGl0IGhhcyBub3RoaW5nIHBhcnRpY3VsYXIKQEAgLTEwMjUsMTMgKzEwMjcsMTMgQEAKICAgICBzdHJ1Y3QgdGVtcGJ1ZiB3cml0ZWJ1ZlszXTsgLyogdGhlcmUgY2FuIG9ubHkgYmUgdGhyZWUgKi8KIAogICAgIC8qIGNvcHkgdGhlIHN0cnVjdHMgdG8gYWxsb3cgZm9yIGltbWVkaWF0ZSByZS1wYXVzaW5nICovCi0gICAgZm9yKGk9MDsgaSA8IGRhdGEtPnN0YXRlLnRlbXBjb3VudDsgaSsrKSB7CisgICAgZm9yKGkgPSAwOyBpIDwgZGF0YS0+c3RhdGUudGVtcGNvdW50OyBpKyspIHsKICAgICAgIHdyaXRlYnVmW2ldID0gZGF0YS0+c3RhdGUudGVtcHdyaXRlW2ldOwogICAgICAgZGF0YS0+c3RhdGUudGVtcHdyaXRlW2ldLmJ1ZiA9IE5VTEw7CiAgICAgfQogICAgIGRhdGEtPnN0YXRlLnRlbXBjb3VudCA9IDA7CiAKLSAgICBmb3IoaT0wOyBpIDwgY291bnQ7IGkrKykgeworICAgIGZvcihpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgIC8qIGV2ZW4gaWYgb25lIGZ1bmN0aW9uIHJldHVybnMgZXJyb3IsIHRoaXMgbG9vcHMgdGhyb3VnaCBhbmQgZnJlZXMgYWxsCiAgICAgICAgICBidWZmZXJzICovCiAgICAgICBpZighcmVzdWx0KQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvZXNjYXBlLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9lc2NhcGUuYwppbmRleCA5NzNhZWI2Li5iN2UyZDMyIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9lc2NhcGUuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9lc2NhcGUuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtODQsMTQgKzg0LDE0IEBACiAgIGNoYXIgKnRlc3RpbmdfcHRyID0gTlVMTDsKICAgdW5zaWduZWQgY2hhciBpbjsgLyogd2UgbmVlZCB0byB0cmVhdCB0aGUgY2hhcmFjdGVycyB1bnNpZ25lZCAqLwogICBzaXplX3QgbmV3bGVuOwotICBzaXplX3Qgc3RyaW5kZXg9MDsKKyAgc2l6ZV90IHN0cmluZGV4ID0gMDsKICAgc2l6ZV90IGxlbmd0aDsKICAgQ1VSTGNvZGUgcmVzdWx0OwogCiAgIGlmKGlubGVuZ3RoIDwgMCkKICAgICByZXR1cm4gTlVMTDsKIAotICBhbGxvYyA9IChpbmxlbmd0aD8oc2l6ZV90KWlubGVuZ3RoOnN0cmxlbihzdHJpbmcpKSsxOworICBhbGxvYyA9IChpbmxlbmd0aD8oc2l6ZV90KWlubGVuZ3RoOnN0cmxlbihzdHJpbmcpKSArIDE7CiAgIG5ld2xlbiA9IGFsbG9jOwogCiAgIG5zID0gbWFsbG9jKGFsbG9jKTsKQEAgLTEwNCw3ICsxMDQsNyBAQAogCiAgICAgaWYoQ3VybF9pc3VucmVzZXJ2ZWQoaW4pKQogICAgICAgLyoganVzdCBjb3B5IHRoaXMgKi8KLSAgICAgIG5zW3N0cmluZGV4KytdPWluOworICAgICAgbnNbc3RyaW5kZXgrK10gPSBpbjsKICAgICBlbHNlIHsKICAgICAgIC8qIGVuY29kZSBpdCAqLwogICAgICAgbmV3bGVuICs9IDI7IC8qIHRoZSBzaXplIGdyb3dzIHdpdGggdHdvLCBzaW5jZSB0aGlzJ2xsIGJlY29tZSBhICVYWCAqLwpAQCAtMTE2LDcgKzExNiw3IEBACiAgICAgICAgIG5zID0gdGVzdGluZ19wdHI7CiAgICAgICB9CiAKLSAgICAgIHJlc3VsdCA9IEN1cmxfY29udmVydF90b19uZXR3b3JrKGRhdGEsICZpbiwgMSk7CisgICAgICByZXN1bHQgPSBDdXJsX2NvbnZlcnRfdG9fbmV0d29yayhkYXRhLCAoY2hhciAqKSZpbiwgMSk7CiAgICAgICBpZihyZXN1bHQpIHsKICAgICAgICAgLyogQ3VybF9jb252ZXJ0X3RvX25ldHdvcmsgY2FsbHMgZmFpbGYgaWYgdW5zdWNjZXNzZnVsICovCiAgICAgICAgIGZyZWUobnMpOwpAQCAtMTI1LDExICsxMjUsMTEgQEAKIAogICAgICAgc25wcmludGYoJm5zW3N0cmluZGV4XSwgNCwgIiUlJTAyWCIsIGluKTsKIAotICAgICAgc3RyaW5kZXgrPTM7CisgICAgICBzdHJpbmRleCArPSAzOwogICAgIH0KICAgICBzdHJpbmcrKzsKICAgfQotICBuc1tzdHJpbmRleF09MDsgLyogdGVybWluYXRlIGl0ICovCisgIG5zW3N0cmluZGV4XSA9IDA7IC8qIHRlcm1pbmF0ZSBpdCAqLwogICByZXR1cm4gbnM7CiB9CiAKQEAgLTE0OCwxMCArMTQ4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqb3N0cmluZywgc2l6ZV90ICpvbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWplY3RfY3RybCkKIHsKLSAgc2l6ZV90IGFsbG9jID0gKGxlbmd0aD9sZW5ndGg6c3RybGVuKHN0cmluZykpKzE7CisgIHNpemVfdCBhbGxvYyA9IChsZW5ndGg/bGVuZ3RoOnN0cmxlbihzdHJpbmcpKSArIDE7CiAgIGNoYXIgKm5zID0gbWFsbG9jKGFsbG9jKTsKICAgdW5zaWduZWQgY2hhciBpbjsKLSAgc2l6ZV90IHN0cmluZGV4PTA7CisgIHNpemVfdCBzdHJpbmRleCA9IDA7CiAgIHVuc2lnbmVkIGxvbmcgaGV4OwogICBDVVJMY29kZSByZXN1bHQ7CiAKQEAgLTE3MywxNSArMTczLDE1IEBACiAKICAgICAgIGluID0gY3VybHhfdWx0b3VjKGhleCk7IC8qIHRoaXMgbG9uZyBpcyBuZXZlciBiaWdnZXIgdGhhbiAyNTUgYW55d2F5ICovCiAKLSAgICAgIHJlc3VsdCA9IEN1cmxfY29udmVydF9mcm9tX25ldHdvcmsoZGF0YSwgJmluLCAxKTsKKyAgICAgIHJlc3VsdCA9IEN1cmxfY29udmVydF9mcm9tX25ldHdvcmsoZGF0YSwgKGNoYXIgKikmaW4sIDEpOwogICAgICAgaWYocmVzdWx0KSB7CiAgICAgICAgIC8qIEN1cmxfY29udmVydF9mcm9tX25ldHdvcmsgY2FsbHMgZmFpbGYgaWYgdW5zdWNjZXNzZnVsICovCiAgICAgICAgIGZyZWUobnMpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgfQogCi0gICAgICBzdHJpbmcrPTI7Ci0gICAgICBhbGxvYy09MjsKKyAgICAgIHN0cmluZyArPSAyOworICAgICAgYWxsb2MgLT0gMjsKICAgICB9CiAKICAgICBpZihyZWplY3RfY3RybCAmJiAoaW4gPCAweDIwKSkgewpAQCAtMTkyLDcgKzE5Miw3IEBACiAgICAgbnNbc3RyaW5kZXgrK10gPSBpbjsKICAgICBzdHJpbmcrKzsKICAgfQotICBuc1tzdHJpbmRleF09MDsgLyogdGVybWluYXRlIGl0ICovCisgIG5zW3N0cmluZGV4XSA9IDA7IC8qIHRlcm1pbmF0ZSBpdCAqLwogCiAgIGlmKG9sZW4pCiAgICAgLyogc3RvcmUgb3V0cHV0IHNpemUgKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2ZpbGUuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2ZpbGUuYwppbmRleCBjODA0ZDc1Li43Y2ZkYWIxIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9maWxlLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvZmlsZS5jCkBAIC0xMDgsNiArMTA4LDcgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgZmlsZV9kaXNjb25uZWN0LCAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX0ZJTEUsICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX05PTkVUV09SSyB8IFBST1RPUFRfTk9VUkxRVUVSWSAvKiBmbGFncyAqLwpAQCAtMTMyLDM3ICsxMzMsNDIgQEAKIHN0YXRpYyBDVVJMY29kZSBmaWxlX3JhbmdlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKIHsKICAgY3VybF9vZmZfdCBmcm9tLCB0bzsKLSAgY3VybF9vZmZfdCB0b3RhbHNpemU9LTE7CisgIGN1cmxfb2ZmX3QgdG90YWxzaXplID0gLTE7CiAgIGNoYXIgKnB0cjsKICAgY2hhciAqcHRyMjsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAKICAgaWYoZGF0YS0+c3RhdGUudXNlX3JhbmdlICYmIGRhdGEtPnN0YXRlLnJhbmdlKSB7Ci0gICAgZnJvbT1jdXJseF9zdHJ0b29mZnQoZGF0YS0+c3RhdGUucmFuZ2UsICZwdHIsIDApOwotICAgIHdoaWxlKCpwdHIgJiYgKElTU1BBQ0UoKnB0cikgfHwgKCpwdHI9PSctJykpKQorICAgIENVUkxvZmZ0IGZyb21fdDsKKyAgICBDVVJMb2ZmdCB0b190OworICAgIGZyb21fdCA9IGN1cmx4X3N0cnRvb2ZmdChkYXRhLT5zdGF0ZS5yYW5nZSwgJnB0ciwgMCwgJmZyb20pOworICAgIGlmKGZyb21fdCA9PSBDVVJMX09GRlRfRkxPVykKKyAgICAgIHJldHVybiBDVVJMRV9SQU5HRV9FUlJPUjsKKyAgICB3aGlsZSgqcHRyICYmIChJU1NQQUNFKCpwdHIpIHx8ICgqcHRyID09ICctJykpKQogICAgICAgcHRyKys7Ci0gICAgdG89Y3VybHhfc3RydG9vZmZ0KHB0ciwgJnB0cjIsIDApOwotICAgIGlmKHB0ciA9PSBwdHIyKSB7Ci0gICAgICAvKiB3ZSBkaWRuJ3QgZ2V0IGFueSBkaWdpdCAqLwotICAgICAgdG89LTE7Ci0gICAgfQotICAgIGlmKCgtMSA9PSB0bykgJiYgKGZyb20+PTApKSB7CisgICAgdG9fdCA9IGN1cmx4X3N0cnRvb2ZmdChwdHIsICZwdHIyLCAwLCAmdG8pOworICAgIGlmKHRvX3QgPT0gQ1VSTF9PRkZUX0ZMT1cpCisgICAgICByZXR1cm4gQ1VSTEVfUkFOR0VfRVJST1I7CisgICAgaWYoKHRvX3QgPT0gQ1VSTF9PRkZUX0lOVkFMKSAmJiAhZnJvbV90KSB7CiAgICAgICAvKiBYIC0gKi8KICAgICAgIGRhdGEtPnN0YXRlLnJlc3VtZV9mcm9tID0gZnJvbTsKICAgICAgIERFQlVHRihpbmZvZihkYXRhLCAiUkFOR0UgJSIgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAiIHRvIGVuZCBvZiBmaWxlXG4iLAogICAgICAgICAgICAgICAgICAgIGZyb20pKTsKICAgICB9Ci0gICAgZWxzZSBpZihmcm9tIDwgMCkgeworICAgIGVsc2UgaWYoKGZyb21fdCA9PSBDVVJMX09GRlRfSU5WQUwpICYmICF0b190KSB7CiAgICAgICAvKiAtWSAqLwotICAgICAgZGF0YS0+cmVxLm1heGRvd25sb2FkID0gLWZyb207Ci0gICAgICBkYXRhLT5zdGF0ZS5yZXN1bWVfZnJvbSA9IGZyb207CisgICAgICBkYXRhLT5yZXEubWF4ZG93bmxvYWQgPSB0bzsKKyAgICAgIGRhdGEtPnN0YXRlLnJlc3VtZV9mcm9tID0gLXRvOwogICAgICAgREVCVUdGKGluZm9mKGRhdGEsICJSQU5HRSB0aGUgbGFzdCAlIiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICIgYnl0ZXNcbiIsCi0gICAgICAgICAgICAgICAgICAgLWZyb20pKTsKKyAgICAgICAgICAgICAgICAgICB0bykpOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgIC8qIFgtWSAqLwogICAgICAgdG90YWxzaXplID0gdG8tZnJvbTsKLSAgICAgIGRhdGEtPnJlcS5tYXhkb3dubG9hZCA9IHRvdGFsc2l6ZSsxOyAvKiBpbmNsdWRlIGxhc3QgYnl0ZSAqLworICAgICAgaWYodG90YWxzaXplID09IENVUkxfT0ZGX1RfTUFYKQorICAgICAgICAvKiB0aGlzIGlzIHRvbyBiaWcgdG8gaW5jcmVhc2UsIHNvIGJhaWwgb3V0ICovCisgICAgICAgIHJldHVybiBDVVJMRV9SQU5HRV9FUlJPUjsKKyAgICAgIGRhdGEtPnJlcS5tYXhkb3dubG9hZCA9IHRvdGFsc2l6ZSArIDE7IC8qIGluY2x1ZGUgbGFzdCBieXRlICovCiAgICAgICBkYXRhLT5zdGF0ZS5yZXN1bWVfZnJvbSA9IGZyb207CiAgICAgICBERUJVR0YoaW5mb2YoZGF0YSwgIlJBTkdFIGZyb20gJSIgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVAogICAgICAgICAgICAgICAgICAgICIgZ2V0dGluZyAlIiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICIgYnl0ZXNcbiIsCkBAIC0yMjUsNyArMjMxLDcgQEAKICAgfQogCiAgIC8qIGNoYW5nZSBwYXRoIHNlcGFyYXRvcnMgZnJvbSAnLycgdG8gJ1xcJyBmb3IgRE9TLCBXaW5kb3dzIGFuZCBPUy8yICovCi0gIGZvcihpPTA7IGkgPCByZWFsX3BhdGhfbGVuOyArK2kpCisgIGZvcihpID0gMDsgaSA8IHJlYWxfcGF0aF9sZW47ICsraSkKICAgICBpZihhY3R1YWxfcGF0aFtpXSA9PSAnLycpCiAgICAgICBhY3R1YWxfcGF0aFtpXSA9ICdcXCc7CiAgICAgZWxzZSBpZighYWN0dWFsX3BhdGhbaV0pIHsgLyogYmluYXJ5IHplcm8gKi8KQEAgLTQyNyw5ICs0MzMsOSBAQAogICBzdHJ1Y3Rfc3RhdCBzdGF0YnVmOyAvKiBzdHJ1Y3Rfc3RhdCBpbnN0ZWFkIG9mIHN0cnVjdCBzdGF0IGp1c3QgdG8gYWxsb3cgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd3MgdmVyc2lvbiB0byBoYXZlIGEgZGlmZmVyZW50IHN0cnVjdCB3aXRob3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmluZyB0byByZWRlZmluZSB0aGUgc2ltcGxlIHdvcmQgJ3N0YXQnICovCi0gIGN1cmxfb2ZmX3QgZXhwZWN0ZWRfc2l6ZT0wOworICBjdXJsX29mZl90IGV4cGVjdGVkX3NpemUgPSAwOwogICBib29sIHNpemVfa25vd247Ci0gIGJvb2wgZnN0YXRlZD1GQUxTRTsKKyAgYm9vbCBmc3RhdGVkID0gRkFMU0U7CiAgIHNzaXplX3QgbnJlYWQ7CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBjaGFyICpidWYgPSBkYXRhLT5zdGF0ZS5idWZmZXI7CkBAIC01MDAsNyArNTA2LDcgQEAKICAgICAgICAgICAgICB0bS0+dG1faG91ciwKICAgICAgICAgICAgICB0bS0+dG1fbWluLAogICAgICAgICAgICAgIHRtLT50bV9zZWMpOwotICAgIHJlc3VsdCA9IEN1cmxfY2xpZW50X3dyaXRlKGNvbm4sIENMSUVOVFdSSVRFX0JPVEgsIGJ1ZiwgMCk7CisgICAgcmVzdWx0ID0gQ3VybF9jbGllbnRfd3JpdGUoY29ubiwgQ0xJRU5UV1JJVEVfQk9USCwgaGVhZGVyLCAwKTsKICAgICBpZighcmVzdWx0KQogICAgICAgLyogc2V0IHRoZSBmaWxlIHNpemUgdG8gbWFrZSBpdCBhdmFpbGFibGUgcG9zdCB0cmFuc2ZlciAqLwogICAgICAgQ3VybF9wZ3JzU2V0RG93bmxvYWRTaXplKGRhdGEsIGV4cGVjdGVkX3NpemUpOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvZm9ybWRhdGEuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2Zvcm1kYXRhLmMKaW5kZXggZTQ4YTYyNy4uMzU2OGFjNSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvZm9ybWRhdGEuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9mb3JtZGF0YS5jCkBAIC0zMiw2ICszMiw4IEBACiAKICNpbmNsdWRlICJ1cmxkYXRhLmgiIC8qIGZvciBzdHJ1Y3QgQ3VybF9lYXN5ICovCiAjaW5jbHVkZSAiZm9ybWRhdGEuaCIKKyNpbmNsdWRlICJtaW1lLmgiCisjaW5jbHVkZSAibm9uLWFzY2lpLmgiCiAjaW5jbHVkZSAidnRscy92dGxzLmgiCiAjaW5jbHVkZSAic3RyY2FzZS5oIgogI2luY2x1ZGUgInNlbmRmLmgiCkBAIC00MiwxMyArNDQsNiBAQAogI2luY2x1ZGUgImN1cmxfbWVtb3J5LmgiCiAjaW5jbHVkZSAibWVtZGVidWcuaCIKIAotI2lmbmRlZiBIQVZFX0JBU0VOQU1FCi1zdGF0aWMgY2hhciAqQ3VybF9iYXNlbmFtZShjaGFyICpwYXRoKTsKLSNkZWZpbmUgYmFzZW5hbWUoeCkgIEN1cmxfYmFzZW5hbWUoKHgpKQotI2VuZGlmCi0KLXN0YXRpYyBzaXplX3QgcmVhZGZyb21maWxlKHN0cnVjdCBGb3JtICpmb3JtLCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKTsKLXN0YXRpYyBDVVJMY29kZSBmb3JtYm91bmRhcnkoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuKTsKIAogLyogV2hhdCBraW5kIG9mIENvbnRlbnQtVHlwZSB0byB1c2Ugb24gdW4tc3BlY2lmaWVkIGZpbGVzIHdpdGggdW5yZWNvZ25pemVkCiAgICBleHRlbnNpb25zLiAqLwpAQCAtMTk3LDcgKzE5Miw3IEBACiAgICAgY29udGVudHR5cGUgPSBIVFRQUE9TVF9DT05URU5UVFlQRV9ERUZBVUxUOwogCiAgIGlmKGZpbGVuYW1lKSB7IC8qIGluIGNhc2UgYSBOVUxMIHdhcyBwYXNzZWQgaW4gKi8KLSAgICBmb3IoaT0wOyBpPHNpemVvZihjdHRzKS9zaXplb2YoY3R0c1swXSk7IGkrKykgeworICAgIGZvcihpID0gMDsgaTxzaXplb2YoY3R0cykvc2l6ZW9mKGN0dHNbMF0pOyBpKyspIHsKICAgICAgIGlmKHN0cmxlbihmaWxlbmFtZSkgPj0gc3RybGVuKGN0dHNbaV0uZXh0ZW5zaW9uKSkgewogICAgICAgICBpZihzdHJjYXNlY29tcGFyZShmaWxlbmFtZSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihmaWxlbmFtZSkgLSBzdHJsZW4oY3R0c1tpXS5leHRlbnNpb24pLApAQCAtMjcyLDcgKzI2Nyw3IEBACiAgIHN0cnVjdCBjdXJsX2h0dHBwb3N0ICpwb3N0ID0gTlVMTDsKICAgQ1VSTGZvcm1vcHRpb24gb3B0aW9uOwogICBzdHJ1Y3QgY3VybF9mb3JtcyAqZm9ybXMgPSBOVUxMOwotICBjaGFyICphcnJheV92YWx1ZT1OVUxMOyAvKiB2YWx1ZSByZWFkIGZyb20gYW4gYXJyYXkgKi8KKyAgY2hhciAqYXJyYXlfdmFsdWUgPSBOVUxMOyAvKiB2YWx1ZSByZWFkIGZyb20gYW4gYXJyYXkgKi8KIAogICAvKiBUaGlzIGlzIGEgc3RhdGUgdmFyaWFibGUsIHRoYXQgaWYgVFJVRSBtZWFucyB0aGF0IHdlJ3JlIHBhcnNpbmcgYW4KICAgICAgYXJyYXkgdGhhdCB3ZSBnb3QgcGFzc2VkIHRvIHVzLiBJZiBGQUxTRSB3ZSdyZSBwYXJzaW5nIHRoZSBpbnB1dApAQCAtNjQxLDE1ICs2MzYsMjYgQEAKICAgICAgICAgfQogICAgICAgICBmb3JtLT5jb250ZW50dHlwZV9hbGxvYyA9IFRSVUU7CiAgICAgICB9CisgICAgICBpZihmb3JtLT5uYW1lICYmIGZvcm0tPm5hbWVsZW5ndGgpIHsKKyAgICAgICAgLyogTmFtZSBzaG91bGQgbm90IGNvbnRhaW4gbnVsIGJ5dGVzLiAqLworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgZm9ybS0+bmFtZWxlbmd0aDsgaSsrKQorICAgICAgICAgIGlmKCFmb3JtLT5uYW1lW2ldKSB7CisgICAgICAgICAgICByZXR1cm5fdmFsdWUgPSBDVVJMX0ZPUk1BRERfTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgaWYocmV0dXJuX3ZhbHVlICE9IENVUkxfRk9STUFERF9PSykKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICAgIGlmKCEoZm9ybS0+ZmxhZ3MgJiBIVFRQUE9TVF9QVFJOQU1FKSAmJgogICAgICAgICAgKGZvcm0gPT0gZmlyc3RfZm9ybSkgKSB7CiAgICAgICAgIC8qIE5vdGUgdGhhdCB0aGVyZSdzIHNtYWxsIHJpc2sgdGhhdCBmb3JtLT5uYW1lIGlzIE5VTEwgaGVyZSBpZiB0aGUKICAgICAgICAgICAgYXBwIHBhc3NlZCBpbiBhIGJhZCBjb21ibywgc28gd2UgYmV0dGVyIGNoZWNrIGZvciB0aGF0IGZpcnN0LiAqLwogICAgICAgICBpZihmb3JtLT5uYW1lKSB7Ci0gICAgICAgICAgLyogY29weSBuYW1lICh3aXRob3V0IHN0cmR1cDsgcG9zc2libHkgY29udGFpbnMgbnVsbCBjaGFyYWN0ZXJzKSAqLworICAgICAgICAgIC8qIGNvcHkgbmFtZSAod2l0aG91dCBzdHJkdXA7IHBvc3NpYmx5IG5vdCBudWwtdGVybWluYXRlZCkgKi8KICAgICAgICAgICBmb3JtLT5uYW1lID0gQ3VybF9tZW1kdXAoZm9ybS0+bmFtZSwgZm9ybS0+bmFtZWxlbmd0aD8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS0+bmFtZWxlbmd0aDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGZvcm0tPm5hbWUpKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oZm9ybS0+bmFtZSkgKyAxKTsKICAgICAgICAgfQogICAgICAgICBpZighZm9ybS0+bmFtZSkgewogICAgICAgICAgIHJldHVybl92YWx1ZSA9IENVUkxfRk9STUFERF9NRU1PUlk7CkBAIC02NjMsNyArNjY5LDcgQEAKICAgICAgICAgLyogY29weSB2YWx1ZSAod2l0aG91dCBzdHJkdXA7IHBvc3NpYmx5IGNvbnRhaW5zIG51bGwgY2hhcmFjdGVycykgKi8KICAgICAgICAgc2l6ZV90IGNsZW4gID0gKHNpemVfdCkgZm9ybS0+Y29udGVudHNsZW5ndGg7CiAgICAgICAgIGlmKCFjbGVuKQotICAgICAgICAgIGNsZW4gPSBzdHJsZW4oZm9ybS0+dmFsdWUpKzE7CisgICAgICAgICAgY2xlbiA9IHN0cmxlbihmb3JtLT52YWx1ZSkgKyAxOwogCiAgICAgICAgIGZvcm0tPnZhbHVlID0gQ3VybF9tZW1kdXAoZm9ybS0+dmFsdWUsIGNsZW4pOwogCkBAIC03NDYsMjExICs3NTIsNiBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCi0jaWZkZWYgX19WTVMKLSNpbmNsdWRlIDxmYWJkZWYuaD4KLS8qCi0gKiBnZXRfdm1zX2ZpbGVfc2l6ZSBkb2VzIHdoYXQgaXQgdGFrZXMgdG8gZ2V0IHRoZSByZWFsIHNpemUgb2YgdGhlIGZpbGUKLSAqCi0gKiBGb3IgZml4ZWQgZmlsZXMsIGZpbmQgb3V0IHRoZSBzaXplIG9mIHRoZSBFT0YgYmxvY2sgYW5kIGFkanVzdC4KLSAqCi0gKiBGb3IgYWxsIG90aGVycywgaGF2ZSB0byByZWFkIHRoZSBlbnRpcmUgZmlsZSBpbiwgZGlzY2FyZGluZyB0aGUgY29udGVudHMuCi0gKiBNb3N0IHBvc3RlZCB0ZXh0IGZpbGVzIHdpbGwgYmUgc21hbGwsIGFuZCBiaW5hcnkgZmlsZXMgbGlrZSB6bGliIGFyY2hpdmVzCi0gKiBhbmQgQ0QvRFZEIGltYWdlcyBzaG91bGQgYmUgZWl0aGVyIGEgU1RSRUFNX0xGIGZvcm1hdCBvciBhIGZpeGVkIGZvcm1hdC4KLSAqCi0gKi8KLWN1cmxfb2ZmX3QgVm1zUmVhbEZpbGVTaXplKGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Rfc3RhdCAqc3RhdF9idWYpCi17Ci0gIGNoYXIgYnVmZmVyWzgxOTJdOwotICBjdXJsX29mZl90IGNvdW50OwotICBpbnQgcmV0X3N0YXQ7Ci0gIEZJTEUgKiBmaWxlOwotCi0gIGZpbGUgPSBmb3BlbihuYW1lLCBGT1BFTl9SRUFEVEVYVCk7IC8qIFZNUyAqLwotICBpZihmaWxlID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgY291bnQgPSAwOwotICByZXRfc3RhdCA9IDE7Ci0gIHdoaWxlKHJldF9zdGF0ID4gMCkgewotICAgIHJldF9zdGF0ID0gZnJlYWQoYnVmZmVyLCAxLCBzaXplb2YoYnVmZmVyKSwgZmlsZSk7Ci0gICAgaWYocmV0X3N0YXQgIT0gMCkKLSAgICAgIGNvdW50ICs9IHJldF9zdGF0OwotICB9Ci0gIGZjbG9zZShmaWxlKTsKLQotICByZXR1cm4gY291bnQ7Ci19Ci0KLS8qCi0gKgotICogIFZtc1NwZWNpYWxTaXplIGNoZWNrcyB0byBzZWUgaWYgdGhlIHN0YXQgc3Rfc2l6ZSBjYW4gYmUgdHJ1c3RlZCBhbmQKLSAqICBpZiBub3QgdG8gY2FsbCBhIHJvdXRpbmUgdG8gZ2V0IHRoZSBjb3JyZWN0IHNpemUuCi0gKgotICovCi1zdGF0aWMgY3VybF9vZmZfdCBWbXNTcGVjaWFsU2l6ZShjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0X3N0YXQgKnN0YXRfYnVmKQotewotICBzd2l0Y2goc3RhdF9idWYtPnN0X2ZhYl9yZm0pIHsKLSAgY2FzZSBGQUIkQ19WQVI6Ci0gIGNhc2UgRkFCJENfVkZDOgotICAgIHJldHVybiBWbXNSZWFsRmlsZVNpemUobmFtZSwgc3RhdF9idWYpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIHJldHVybiBzdGF0X2J1Zi0+c3Rfc2l6ZTsKLSAgfQotfQotCi0jZW5kaWYKLQotI2lmbmRlZiBfX1ZNUwotI2RlZmluZSBmaWxlc2l6ZShuYW1lLCBzdGF0X2RhdGEpIChzdGF0X2RhdGEuc3Rfc2l6ZSkKLSNlbHNlCi0gICAgLyogR2V0dGluZyB0aGUgZXhwZWN0ZWQgZmlsZSBzaXplIG5lZWRzIGhlbHAgb24gVk1TICovCi0jZGVmaW5lIGZpbGVzaXplKG5hbWUsIHN0YXRfZGF0YSkgVm1zU3BlY2lhbFNpemUobmFtZSwgJnN0YXRfZGF0YSkKLSNlbmRpZgotCi0vKgotICogQWRkRm9ybURhdGEoKSBhZGRzIGEgY2h1bmsgb2YgZGF0YSB0byB0aGUgRm9ybURhdGEgbGlua2VkIGxpc3QuCi0gKgotICogc2l6ZSBpcyBpbmNyZW1lbnRlZCBieSB0aGUgY2h1bmsgbGVuZ3RoLCB1bmxlc3MgaXQgaXMgTlVMTAotICovCi1zdGF0aWMgQ1VSTGNvZGUgQWRkRm9ybURhdGEoc3RydWN0IEZvcm1EYXRhICoqZm9ybXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBmb3JtdHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9vZmZfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9vZmZfdCAqc2l6ZSkKLXsKLSAgc3RydWN0IEZvcm1EYXRhICpuZXdmb3JtOwotICBjaGFyICphbGxvYzIgPSBOVUxMOwotICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKLSAgaWYobGVuZ3RoIDwgMCB8fCAoc2l6ZSAmJiAqc2l6ZSA8IDApKQotICAgIHJldHVybiBDVVJMRV9CQURfRlVOQ1RJT05fQVJHVU1FTlQ7Ci0KLSAgbmV3Zm9ybSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IEZvcm1EYXRhKSk7Ci0gIGlmKCFuZXdmb3JtKQotICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwotICBuZXdmb3JtLT5uZXh0ID0gTlVMTDsKLQotICBpZih0eXBlIDw9IEZPUk1fQ09OVEVOVCkgewotICAgIC8qIHdlIG1ha2UgaXQgZWFzaWVyIGZvciBwbGFpbiBzdHJpbmdzOiAqLwotICAgIGlmKCFsZW5ndGgpCi0gICAgICBsZW5ndGggPSBzdHJsZW4oKGNoYXIgKilsaW5lKTsKLSNpZiAoU0laRU9GX1NJWkVfVCA8IENVUkxfU0laRU9GX0NVUkxfT0ZGX1QpCi0gICAgZWxzZSBpZihsZW5ndGggPj0gKGN1cmxfb2ZmX3QpKHNpemVfdCktMSkgewotICAgICAgcmVzdWx0ID0gQ1VSTEVfQkFEX0ZVTkNUSU9OX0FSR1VNRU5UOwotICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0jZW5kaWYKLSAgICBpZih0eXBlICE9IEZPUk1fREFUQU1FTSkgewotICAgICAgbmV3Zm9ybS0+bGluZSA9IG1hbGxvYygoc2l6ZV90KWxlbmd0aCsxKTsKLSAgICAgIGlmKCFuZXdmb3JtLT5saW5lKSB7Ci0gICAgICAgIHJlc3VsdCA9IENVUkxFX09VVF9PRl9NRU1PUlk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICB9Ci0gICAgICBhbGxvYzIgPSBuZXdmb3JtLT5saW5lOwotICAgICAgbWVtY3B5KG5ld2Zvcm0tPmxpbmUsIGxpbmUsIChzaXplX3QpbGVuZ3RoKTsKLQotICAgICAgLyogemVybyB0ZXJtaW5hdGUgZm9yIGVhc2llciBkZWJ1Z2dpbmcgKi8KLSAgICAgIG5ld2Zvcm0tPmxpbmVbKHNpemVfdClsZW5ndGhdPTA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgbmV3Zm9ybS0+bGluZSA9IChjaGFyICopbGluZTsKLSAgICAgIHR5cGUgPSBGT1JNX0RBVEE7IC8qIGluIGFsbCBvdGhlciBhc3BlY3RzIHRoaXMgaXMganVzdCBGT1JNX0RBVEEgKi8KLSAgICB9Ci0gICAgbmV3Zm9ybS0+bGVuZ3RoID0gKHNpemVfdClsZW5ndGg7Ci0gIH0KLSAgZWxzZQotICAgIC8qIEZvciBjYWxsYmFja3MgYW5kIGZpbGVzIHdlIGRvbid0IGhhdmUgYW55IGFjdHVhbCBkYXRhIHNvIHdlIGp1c3Qga2VlcCBhCi0gICAgICAgcG9pbnRlciB0byB3aGF0ZXZlciB0aGlzIHBvaW50cyB0byAqLwotICAgIG5ld2Zvcm0tPmxpbmUgPSAoY2hhciAqKWxpbmU7Ci0KLSAgbmV3Zm9ybS0+dHlwZSA9IHR5cGU7Ci0KLSAgaWYoc2l6ZSkgewotICAgIGlmKHR5cGUgIT0gRk9STV9GSUxFKQotICAgICAgLyogZm9yIHN0YXRpYyBjb250ZW50IGFzIHdlbGwgYXMgY2FsbGJhY2sgZGF0YSB3ZSBhZGQgdGhlIHNpemUgZ2l2ZW4KLSAgICAgICAgIGFzIGlucHV0IGFyZ3VtZW50ICovCi0gICAgICAqc2l6ZSArPSBsZW5ndGg7Ci0gICAgZWxzZSB7Ci0gICAgICAvKiBTaW5jZSB0aGlzIGlzIGEgZmlsZSB0byBiZSB1cGxvYWRlZCBoZXJlLCBhZGQgdGhlIHNpemUgb2YgdGhlIGFjdHVhbAotICAgICAgICAgZmlsZSAqLwotICAgICAgaWYoc3RyY21wKCItIiwgbmV3Zm9ybS0+bGluZSkpIHsKLSAgICAgICAgc3RydWN0X3N0YXQgZmlsZTsKLSAgICAgICAgaWYoIXN0YXQobmV3Zm9ybS0+bGluZSwgJmZpbGUpICYmICFTX0lTRElSKGZpbGUuc3RfbW9kZSkpCi0gICAgICAgICAgKnNpemUgKz0gZmlsZXNpemUobmV3Zm9ybS0+bGluZSwgZmlsZSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIHJlc3VsdCA9IENVUkxFX0JBRF9GVU5DVElPTl9BUkdVTUVOVDsKLSAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYoKmZvcm1wKSB7Ci0gICAgKCpmb3JtcCktPm5leHQgPSBuZXdmb3JtOwotICAgICpmb3JtcCA9IG5ld2Zvcm07Ci0gIH0KLSAgZWxzZQotICAgICpmb3JtcCA9IG5ld2Zvcm07Ci0KLSAgcmV0dXJuIENVUkxFX09LOwotICBlcnJvcjoKLSAgaWYobmV3Zm9ybSkKLSAgICBmcmVlKG5ld2Zvcm0pOwotICBpZihhbGxvYzIpCi0gICAgZnJlZShhbGxvYzIpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKgotICogQWRkRm9ybURhdGFmKCkgYWRkcyBwcmludGYoKS1zdHlsZSBmb3JtYXR0ZWQgZGF0YSB0byB0aGUgZm9ybWRhdGEgY2hhaW4uCi0gKi8KLQotc3RhdGljIENVUkxjb2RlIEFkZEZvcm1EYXRhZihzdHJ1Y3QgRm9ybURhdGEgKipmb3JtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9vZmZfdCAqc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gIGNoYXIgKnM7Ci0gIENVUkxjb2RlIHJlc3VsdDsKLSAgdmFfbGlzdCBhcDsKLSAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gIHMgPSBjdXJsX212YXByaW50ZihmbXQsIGFwKTsKLSAgdmFfZW5kKGFwKTsKLQotICBpZighcykKLSAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKLQotICByZXN1bHQgPSBBZGRGb3JtRGF0YShmb3JtcCwgRk9STV9EQVRBTUVNLCBzLCAwLCBzaXplKTsKLSAgaWYocmVzdWx0KQotICAgIGZyZWUocyk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLSAqIEN1cmxfZm9ybWNsZWFuKCkgaXMgdXNlZCBmcm9tIGh0dHAuYywgdGhpcyBjbGVhbnMgYSBidWlsdCBGb3JtRGF0YSBsaW5rZWQKLSAqIGxpc3QKLSAqLwotdm9pZCBDdXJsX2Zvcm1jbGVhbihzdHJ1Y3QgRm9ybURhdGEgKipmb3JtX3B0cikKLXsKLSAgc3RydWN0IEZvcm1EYXRhICpuZXh0LCAqZm9ybTsKLQotICBmb3JtID0gKmZvcm1fcHRyOwotICBpZighZm9ybSkKLSAgICByZXR1cm47Ci0KLSAgZG8gewotICAgIG5leHQ9Zm9ybS0+bmV4dDsgIC8qIHRoZSBmb2xsb3dpbmcgZm9ybSBsaW5lICovCi0gICAgaWYoZm9ybS0+dHlwZSA8PSBGT1JNX0NPTlRFTlQpCi0gICAgICBmcmVlKGZvcm0tPmxpbmUpOyAvKiBmcmVlIHRoZSBsaW5lICovCi0gICAgZnJlZShmb3JtKTsgICAgICAgLyogZnJlZSB0aGUgc3RydWN0ICovCi0gICAgZm9ybSA9IG5leHQ7Ci0gIH0gd2hpbGUoZm9ybSk7IC8qIGNvbnRpbnVlICovCi0KLSAgKmZvcm1fcHRyID0gTlVMTDsKLX0KLQogLyoKICAqIGN1cmxfZm9ybWdldCgpCiAgKiBTZXJpYWxpemUgYSBjdXJsX2h0dHBwb3N0IHN0cnVjdC4KQEAgLTk2Miw0MiArNzYzLDM0IEBACiAgICAgICAgICAgICAgICAgIGN1cmxfZm9ybWdldF9jYWxsYmFjayBhcHBlbmQpCiB7CiAgIENVUkxjb2RlIHJlc3VsdDsKLSAgY3VybF9vZmZfdCBzaXplOwotICBzdHJ1Y3QgRm9ybURhdGEgKmRhdGEsICpwdHI7CisgIGN1cmxfbWltZXBhcnQgdG9wcGFydDsKIAotICByZXN1bHQgPSBDdXJsX2dldGZvcm1kYXRhKE5VTEwsICZkYXRhLCBmb3JtLCBOVUxMLCAmc2l6ZSk7Ci0gIGlmKHJlc3VsdCkKLSAgICByZXR1cm4gKGludClyZXN1bHQ7CisgIEN1cmxfbWltZV9pbml0cGFydCgmdG9wcGFydCwgTlVMTCk7IC8qIGRlZmF1bHQgZm9ybSBpcyBlbXB0eSAqLworICByZXN1bHQgPSBDdXJsX2dldGZvcm1kYXRhKE5VTEwsICZ0b3BwYXJ0LCBmb3JtLCBOVUxMKTsKKyAgaWYoIXJlc3VsdCkKKyAgICByZXN1bHQgPSBDdXJsX21pbWVfcHJlcGFyZV9oZWFkZXJzKCZ0b3BwYXJ0LCAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBNSU1FU1RSQVRFR1lfRk9STSk7CiAKLSAgZm9yKHB0ciA9IGRhdGE7IHB0cjsgcHRyID0gcHRyLT5uZXh0KSB7Ci0gICAgaWYoKHB0ci0+dHlwZSA9PSBGT1JNX0ZJTEUpIHx8IChwdHItPnR5cGUgPT0gRk9STV9DQUxMQkFDSykpIHsKLSAgICAgIGNoYXIgYnVmZmVyWzgxOTJdOwotICAgICAgc2l6ZV90IG5yZWFkOwotICAgICAgc3RydWN0IEZvcm0gdGVtcDsKKyAgd2hpbGUoIXJlc3VsdCkgeworICAgIGNoYXIgYnVmZmVyWzgxOTJdOworICAgIHNpemVfdCBucmVhZCA9IEN1cmxfbWltZV9yZWFkKGJ1ZmZlciwgMSwgc2l6ZW9mIGJ1ZmZlciwgJnRvcHBhcnQpOwogCi0gICAgICBDdXJsX0Zvcm1Jbml0KCZ0ZW1wLCBwdHIpOworICAgIGlmKCFucmVhZCkKKyAgICAgIGJyZWFrOwogCi0gICAgICBkbyB7Ci0gICAgICAgIG5yZWFkID0gcmVhZGZyb21maWxlKCZ0ZW1wLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKLSAgICAgICAgaWYoKG5yZWFkID09IChzaXplX3QpIC0xKSB8fAotICAgICAgICAgICAobnJlYWQgPiBzaXplb2YoYnVmZmVyKSkgfHwKLSAgICAgICAgICAgKG5yZWFkICE9IGFwcGVuZChhcmcsIGJ1ZmZlciwgbnJlYWQpKSkgewotICAgICAgICAgIGlmKHRlbXAuZnApCi0gICAgICAgICAgICBmY2xvc2UodGVtcC5mcCk7Ci0gICAgICAgICAgQ3VybF9mb3JtY2xlYW4oJmRhdGEpOwotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgfSB3aGlsZShucmVhZCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgaWYocHRyLT5sZW5ndGggIT0gYXBwZW5kKGFyZywgcHRyLT5saW5lLCBwdHItPmxlbmd0aCkpIHsKLSAgICAgICAgQ3VybF9mb3JtY2xlYW4oJmRhdGEpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9CisgICAgc3dpdGNoKG5yZWFkKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmKGFwcGVuZChhcmcsIGJ1ZmZlciwgbnJlYWQpICE9IG5yZWFkKQorICAgICAgICByZXN1bHQgPSBDVVJMRV9SRUFEX0VSUk9SOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDVVJMX1JFQURGVU5DX0FCT1JUOgorICAgIGNhc2UgQ1VSTF9SRUFERlVOQ19QQVVTRToKKyAgICAgIGJyZWFrOwogICAgIH0KICAgfQotICBDdXJsX2Zvcm1jbGVhbigmZGF0YSk7Ci0gIHJldHVybiAwOworCisgIEN1cmxfbWltZV9jbGVhbnBhcnQoJnRvcHBhcnQpOworICByZXR1cm4gKGludCkgcmVzdWx0OwogfQogCiAvKgpAQCAtMTAxMyw3ICs4MDYsNyBAQAogICAgIHJldHVybjsKIAogICBkbyB7Ci0gICAgbmV4dD1mb3JtLT5uZXh0OyAgLyogdGhlIGZvbGxvd2luZyBmb3JtIGxpbmUgKi8KKyAgICBuZXh0ID0gZm9ybS0+bmV4dDsgIC8qIHRoZSBmb2xsb3dpbmcgZm9ybSBsaW5lICovCiAKICAgICAvKiByZWN1cnNlIHRvIHN1Yi1jb250ZW50cyAqLwogICAgIGN1cmxfZm9ybWZyZWUoZm9ybS0+bW9yZSk7CkBAIC0xMDMxLDExOCArODI0LDI5IEBACiAgIH0gd2hpbGUoZm9ybSk7IC8qIGNvbnRpbnVlICovCiB9CiAKLSNpZm5kZWYgSEFWRV9CQVNFTkFNRQotLyoKLSAgKFF1b3RlIGZyb20gVGhlIE9wZW4gR3JvdXAgQmFzZSBTcGVjaWZpY2F0aW9ucyBJc3N1ZSA2IElFRUUgU3RkIDEwMDMuMSwgMjAwNAotICBFZGl0aW9uKQogCi0gIFRoZSBiYXNlbmFtZSgpIGZ1bmN0aW9uIHNoYWxsIHRha2UgdGhlIHBhdGhuYW1lIHBvaW50ZWQgdG8gYnkgcGF0aCBhbmQKLSAgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZmluYWwgY29tcG9uZW50IG9mIHRoZSBwYXRobmFtZSwgZGVsZXRpbmcgYW55Ci0gIHRyYWlsaW5nICcvJyBjaGFyYWN0ZXJzLgotCi0gIElmIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBwYXRoIGNvbnNpc3RzIGVudGlyZWx5IG9mIHRoZSAnLycgY2hhcmFjdGVyLAotICBiYXNlbmFtZSgpIHNoYWxsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyAiLyIuIElmIHRoZSBzdHJpbmcgcG9pbnRlZAotICB0byBieSBwYXRoIGlzIGV4YWN0bHkgIi8vIiwgaXQgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZCB3aGV0aGVyICcvJyBvciAiLy8iCi0gIGlzIHJldHVybmVkLgotCi0gIElmIHBhdGggaXMgYSBudWxsIHBvaW50ZXIgb3IgcG9pbnRzIHRvIGFuIGVtcHR5IHN0cmluZywgYmFzZW5hbWUoKSBzaGFsbAotICByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgIi4iLgotCi0gIFRoZSBiYXNlbmFtZSgpIGZ1bmN0aW9uIG1heSBtb2RpZnkgdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IHBhdGgsIGFuZCBtYXkKLSAgcmV0dXJuIGEgcG9pbnRlciB0byBzdGF0aWMgc3RvcmFnZSB0aGF0IG1heSB0aGVuIGJlIG92ZXJ3cml0dGVuIGJ5IGEKLSAgc3Vic2VxdWVudCBjYWxsIHRvIGJhc2VuYW1lKCkuCi0KLSAgVGhlIGJhc2VuYW1lKCkgZnVuY3Rpb24gbmVlZCBub3QgYmUgcmVlbnRyYW50LiBBIGZ1bmN0aW9uIHRoYXQgaXMgbm90Ci0gIHJlcXVpcmVkIHRvIGJlIHJlZW50cmFudCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgdGhyZWFkLXNhZmUuCi0KLSovCi1zdGF0aWMgY2hhciAqQ3VybF9iYXNlbmFtZShjaGFyICpwYXRoKQorLyogU2V0IG1pbWUgcGFydCBuYW1lLCB0YWtpbmcgY2FyZSBvZiBub24gbnVsLXRlcm1pbmF0ZWQgbmFtZSBzdHJpbmcuICovCitzdGF0aWMgQ1VSTGNvZGUgc2V0bmFtZShjdXJsX21pbWVwYXJ0ICpwYXJ0LCBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKQogewotICAvKiBJZ25vcmUgYWxsIHRoZSBkZXRhaWxzIGFib3ZlIGZvciBub3cgYW5kIG1ha2UgYSBxdWljayBhbmQgc2ltcGxlCi0gICAgIGltcGxlbWVudGFpb24gaGVyZSAqLwotICBjaGFyICpzMTsKLSAgY2hhciAqczI7CisgIGNoYXIgKnpuYW1lOworICBDVVJMY29kZSByZXM7CiAKLSAgczE9c3RycmNocihwYXRoLCAnLycpOwotICBzMj1zdHJyY2hyKHBhdGgsICdcXCcpOwotCi0gIGlmKHMxICYmIHMyKSB7Ci0gICAgcGF0aCA9IChzMSA+IHMyPyBzMSA6IHMyKSsxOwotICB9Ci0gIGVsc2UgaWYoczEpCi0gICAgcGF0aCA9IHMxICsgMTsKLSAgZWxzZSBpZihzMikKLSAgICBwYXRoID0gczIgKyAxOwotCi0gIHJldHVybiBwYXRoOwotfQotI2VuZGlmCi0KLXN0YXRpYyBjaGFyICpzdHJpcHBhdGgoY29uc3QgY2hhciAqZnVsbGZpbGUpCi17Ci0gIGNoYXIgKmZpbGVuYW1lOwotICBjaGFyICpiYXNlOwotICBmaWxlbmFtZSA9IHN0cmR1cChmdWxsZmlsZSk7IC8qIGR1cGxpY2F0ZSBzaW5jZSBiYXNlbmFtZSgpIG1heSBydWluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBpdCB3b3JrcyBvbiAqLwotICBpZighZmlsZW5hbWUpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGJhc2UgPSBzdHJkdXAoYmFzZW5hbWUoZmlsZW5hbWUpKTsKLQotICBmcmVlKGZpbGVuYW1lKTsgLyogZnJlZSB0ZW1wb3JhcnkgYnVmZmVyICovCi0KLSAgcmV0dXJuIGJhc2U7IC8qIHJldHVybnMgYW4gYWxsb2NhdGVkIHN0cmluZyBvciBOVUxMICEgKi8KLX0KLQotc3RhdGljIENVUkxjb2RlIGZvcm1kYXRhX2FkZF9maWxlbmFtZShjb25zdCBzdHJ1Y3QgY3VybF9odHRwcG9zdCAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEZvcm1EYXRhICoqZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9vZmZfdCAqc2l6ZSkKLXsKLSAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7Ci0gIGNoYXIgKmZpbGVuYW1lID0gZmlsZS0+c2hvd2ZpbGVuYW1lOwotICBjaGFyICpmaWxlYmFzZW5hbWUgPSBOVUxMOwotICBjaGFyICpmaWxlbmFtZV9lc2NhcGVkID0gTlVMTDsKLQotICBpZighZmlsZW5hbWUpIHsKLSAgICBmaWxlYmFzZW5hbWUgPSBzdHJpcHBhdGgoZmlsZS0+Y29udGVudHMpOwotICAgIGlmKCFmaWxlYmFzZW5hbWUpCi0gICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKLSAgICBmaWxlbmFtZSA9IGZpbGViYXNlbmFtZTsKLSAgfQotCi0gIGlmKHN0cmNocihmaWxlbmFtZSwgJ1xcJykgfHwgc3RyY2hyKGZpbGVuYW1lLCAnIicpKSB7Ci0gICAgY2hhciAqcDAsICpwMTsKLQotICAgIC8qIGZpbGVuYW1lIG5lZWQgYmUgZXNjYXBlZCAqLwotICAgIGZpbGVuYW1lX2VzY2FwZWQgPSBtYWxsb2Moc3RybGVuKGZpbGVuYW1lKSoyKzEpOwotICAgIGlmKCFmaWxlbmFtZV9lc2NhcGVkKSB7Ci0gICAgICBmcmVlKGZpbGViYXNlbmFtZSk7Ci0gICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKLSAgICB9Ci0gICAgcDAgPSBmaWxlbmFtZV9lc2NhcGVkOwotICAgIHAxID0gZmlsZW5hbWU7Ci0gICAgd2hpbGUoKnAxKSB7Ci0gICAgICBpZigqcDEgPT0gJ1xcJyB8fCAqcDEgPT0gJyInKQotICAgICAgICAqcDArKyA9ICdcXCc7Ci0gICAgICAqcDArKyA9ICpwMSsrOwotICAgIH0KLSAgICAqcDAgPSAnXDAnOwotICAgIGZpbGVuYW1lID0gZmlsZW5hbWVfZXNjYXBlZDsKLSAgfQotICByZXN1bHQgPSBBZGRGb3JtRGF0YWYoZm9ybSwgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICI7IGZpbGVuYW1lPVwiJXNcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSk7Ci0gIGZyZWUoZmlsZW5hbWVfZXNjYXBlZCk7Ci0gIGZyZWUoZmlsZWJhc2VuYW1lKTsKLSAgcmV0dXJuIHJlc3VsdDsKKyAgaWYoIW5hbWUgfHwgIWxlbikKKyAgICByZXR1cm4gY3VybF9taW1lX25hbWUocGFydCwgbmFtZSk7CisgIHpuYW1lID0gbWFsbG9jKGxlbiArIDEpOworICBpZighem5hbWUpCisgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CisgIG1lbWNweSh6bmFtZSwgbmFtZSwgbGVuKTsKKyAgem5hbWVbbGVuXSA9ICdcMCc7CisgIHJlcyA9IGN1cmxfbWltZV9uYW1lKHBhcnQsIHpuYW1lKTsKKyAgZnJlZSh6bmFtZSk7CisgIHJldHVybiByZXM7CiB9CiAKIC8qCi0gKiBDdXJsX2dldGZvcm1kYXRhKCkgY29udmVydHMgYSBsaW5rZWQgbGlzdCBvZiAibWV0YSBkYXRhIiBpbnRvIGEgY29tcGxldGUKLSAqIChwb3NzaWJseSBodWdlKSBtdWx0aXBhcnQgZm9ybWRhdGEuIFRoZSBpbnB1dCBsaXN0IGlzIGluICdwb3N0Jywgd2hpbGUgdGhlCi0gKiBvdXRwdXQgcmVzdWx0aW5nIGxpbmtlZCBsaXN0cyBnZXRzIHN0b3JlZCBpbiAnKmZpbmFsZm9ybScuICpzaXplcCB3aWxsIGdldAotICogdGhlIHRvdGFsIHNpemUgb2YgdGhlIHdob2xlIFBPU1QuCi0gKiBBIG11bHRpcGFydC9mb3JtX2RhdGEgY29udGVudC10eXBlIGlzIGJ1aWx0LCB1bmxlc3MgYSBjdXN0b20gY29udGVudC10eXBlCi0gKiBpcyBwYXNzZWQgaW4gJ2N1c3RvbV9jb250ZW50X3R5cGUnLgorICogQ3VybF9nZXRmb3JtZGF0YSgpIGNvbnZlcnRzIGEgbGlua2VkIGxpc3Qgb2YgIm1ldGEgZGF0YSIgaW50byBhIG1pbWUKKyAqIHN0cnVjdHVyZS4gVGhlIGlucHV0IGxpc3QgaXMgaW4gJ3Bvc3QnLCB3aGlsZSB0aGUgb3V0cHV0IGlzIHN0b3JlZCBpbgorICogbWltZSBwYXJ0IGF0ICcqZmluYWxmb3JtJy4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IGRvIGEgZmFpbGYoKSBmb3IgdGhlIHBvdGVudGlhbCBtZW1vcnkgZmFpbHVyZXMgYnV0CiAgKiBzaG91bGQgZm9yIGFsbCBvdGhlciBlcnJvcnMgaXQgc3BvdHMuIEp1c3Qgbm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gTUFZIGdldApAQCAtMTE1MCw0MjIgKzg1NCwxMjMgQEAKICAqLwogCiBDVVJMY29kZSBDdXJsX2dldGZvcm1kYXRhKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBGb3JtRGF0YSAqKmZpbmFsZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9taW1lcGFydCAqZmluYWxmb3JtLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY3VybF9odHRwcG9zdCAqcG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY3VzdG9tX2NvbnRlbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9vZmZfdCAqc2l6ZXApCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfcmVhZF9jYWxsYmFjayBmcmVhZF9mdW5jKQogewotICBzdHJ1Y3QgRm9ybURhdGEgKmZvcm0gPSBOVUxMOwotICBzdHJ1Y3QgRm9ybURhdGEgKmZpcnN0Zm9ybTsKLSAgc3RydWN0IGN1cmxfaHR0cHBvc3QgKmZpbGU7CiAgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOwotICBjdXJsX29mZl90IHNpemUgPSAwOyAvKiBzdXBwb3J0IHBvdGVudGlhbGx5IEVOT1JNT1VTIGZvcm1wb3N0cyAqLwotICBjaGFyIGZpbGVib3VuZGFyeVs0Ml07Ci0gIHN0cnVjdCBjdXJsX3NsaXN0ICpjdXJMaXN0OwotICBjaGFyIGJvdW5kYXJ5WzQyXTsKKyAgY3VybF9taW1lICpmb3JtID0gTlVMTDsKKyAgY3VybF9taW1lICptdWx0aXBhcnQ7CisgIGN1cmxfbWltZXBhcnQgKnBhcnQ7CisgIHN0cnVjdCBjdXJsX2h0dHBwb3N0ICpmaWxlOwogCi0gICpmaW5hbGZvcm0gPSBOVUxMOyAvKiBkZWZhdWx0IGZvcm0gaXMgZW1wdHkgKi8KKyAgQ3VybF9taW1lX2NsZWFucGFydChmaW5hbGZvcm0pOyAvKiBkZWZhdWx0IGZvcm0gaXMgZW1wdHkgKi8KIAogICBpZighcG9zdCkKICAgICByZXR1cm4gcmVzdWx0OyAvKiBubyBpbnB1dCA9PiBubyBvdXRwdXQhICovCiAKLSAgcmVzdWx0ID0gZm9ybWJvdW5kYXJ5KGRhdGEsIGJvdW5kYXJ5LCBzaXplb2YoYm91bmRhcnkpKTsKLSAgaWYocmVzdWx0KQotICAgIHJldHVybiByZXN1bHQ7CisgIGZvcm0gPSBjdXJsX21pbWVfaW5pdChkYXRhKTsKKyAgaWYoIWZvcm0pCisgICAgcmVzdWx0ID0gQ1VSTEVfT1VUX09GX01FTU9SWTsKIAotICAvKiBNYWtlIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBvdXRwdXQgKi8KLSAgcmVzdWx0ID0gQWRkRm9ybURhdGFmKCZmb3JtLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgIiVzOyBib3VuZGFyeT0lc1xyXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tX2NvbnRlbnRfdHlwZT9jdXN0b21fY29udGVudF90eXBlOgotICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2Zvcm0tZGF0YSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSk7Ci0KLSAgaWYocmVzdWx0KSB7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAvKiB3ZSBETyBOT1QgaW5jbHVkZSB0aGF0IGxpbmUgaW4gdGhlIHRvdGFsIHNpemUgb2YgdGhlIFBPU1QsIHNpbmNlIGl0J2xsIGJlCi0gICAgIHBhcnQgb2YgdGhlIGhlYWRlciEgKi8KLQotICBmaXJzdGZvcm0gPSBmb3JtOwotCi0gIGRvIHsKLQotICAgIGlmKHNpemUpIHsKLSAgICAgIHJlc3VsdCA9IEFkZEZvcm1EYXRhZigmZm9ybSwgJnNpemUsICJcclxuIik7Ci0gICAgICBpZihyZXN1bHQpCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIGJvdW5kYXJ5ICovCi0gICAgcmVzdWx0ID0gQWRkRm9ybURhdGFmKCZmb3JtLCAmc2l6ZSwgIi0tJXNcclxuIiwgYm91bmRhcnkpOwotICAgIGlmKHJlc3VsdCkKLSAgICAgIGJyZWFrOwotCi0gICAgLyogTWF5YmUgbGF0ZXIgdGhpcyBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiBhIGN1c3RvbV9jb250ZW50X3R5cGUgaXMKLSAgICAgICBwYXNzZWQsIHNpbmNlIENvbnRlbnQtRGlzcG9zaXRpb24gaXMgbm90IG1lYW5pbmdmdWwgZm9yIGFsbCBtdWx0aXBhcnQKLSAgICAgICB0eXBlcy4KLSAgICAqLwotICAgIHJlc3VsdCA9IEFkZEZvcm1EYXRhZigmZm9ybSwgJnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCIiKTsKLSAgICBpZihyZXN1bHQpCi0gICAgICBicmVhazsKLQotICAgIHJlc3VsdCA9IEFkZEZvcm1EYXRhKCZmb3JtLCBGT1JNX0RBVEEsIHBvc3QtPm5hbWUsIHBvc3QtPm5hbWVsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOwotICAgIGlmKHJlc3VsdCkKLSAgICAgIGJyZWFrOwotCi0gICAgcmVzdWx0ID0gQWRkRm9ybURhdGFmKCZmb3JtLCAmc2l6ZSwgIlwiIik7Ci0gICAgaWYocmVzdWx0KQotICAgICAgYnJlYWs7Ci0KLSAgICBpZihwb3N0LT5tb3JlKSB7Ci0gICAgICAvKiBJZiB1c2VkLCB0aGlzIGlzIGEgbGluayB0byBtb3JlIGZpbGUgbmFtZXMsIHdlIG11c3QgdGhlbiBkbwotICAgICAgICAgdGhlIG1hZ2ljIHRvIGluY2x1ZGUgc2V2ZXJhbCBmaWxlcyB3aXRoIHRoZSBzYW1lIGZpZWxkIG5hbWUgKi8KLQotICAgICAgcmVzdWx0ID0gZm9ybWJvdW5kYXJ5KGRhdGEsIGZpbGVib3VuZGFyeSwgc2l6ZW9mKGZpbGVib3VuZGFyeSkpOwotICAgICAgaWYocmVzdWx0KSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICByZXN1bHQgPSBBZGRGb3JtRGF0YWYoJmZvcm0sICZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcclxuQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYm91bmRhcnk9JXNcclxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlYm91bmRhcnkpOwotICAgICAgaWYocmVzdWx0KQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBmaWxlID0gcG9zdDsKLQotICAgIGRvIHsKLQotICAgICAgLyogSWYgJ3Nob3dmaWxlbmFtZScgaXMgc2V0LCB0aGF0IGlzIGEgZmFrZWQgbmFtZSBwYXNzZWQgb24gdG8gdXMKLSAgICAgICAgIHRvIHVzZSB0byBpbiB0aGUgZm9ybXBvc3QuIElmIHRoYXQgaXMgbm90IHNldCwgdGhlIGFjdHVhbGx5IHVzZWQKLSAgICAgICAgIGxvY2FsIGZpbGUgbmFtZSBzaG91bGQgYmUgYWRkZWQuICovCi0KLSAgICAgIGlmKHBvc3QtPm1vcmUpIHsKLSAgICAgICAgLyogaWYgbXVsdGlwbGUtZmlsZSAqLwotICAgICAgICByZXN1bHQgPSBBZGRGb3JtRGF0YWYoJmZvcm0sICZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxyXG4tLSVzXHJcbkNvbnRlbnQtRGlzcG9zaXRpb246ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRhY2htZW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVib3VuZGFyeSk7Ci0gICAgICAgIGlmKHJlc3VsdCkKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgcmVzdWx0ID0gZm9ybWRhdGFfYWRkX2ZpbGVuYW1lKGZpbGUsICZmb3JtLCAmc2l6ZSk7Ci0gICAgICAgIGlmKHJlc3VsdCkKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYocG9zdC0+ZmxhZ3MgJiAoSFRUUFBPU1RfRklMRU5BTUV8SFRUUFBPU1RfQlVGRkVSfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQUE9TVF9DQUxMQkFDSykpIHsKLSAgICAgICAgLyogaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgZm9yIHRoZSBIVFRQUE9TVF9GSUxFTkFNRSBhbmQKLSAgICAgICAgICAgSFRUUFBPU1RfQ0FMTEJBQ0sgY2FzZXMgdGhlIC0+c2hvd2ZpbGVuYW1lIHN0cnVjdCBtZW1iZXIgaXMgYWx3YXlzCi0gICAgICAgICAgIGFzc2lnbmVkIGF0IHRoaXMgcG9pbnQgKi8KLSAgICAgICAgaWYocG9zdC0+c2hvd2ZpbGVuYW1lIHx8IChwb3N0LT5mbGFncyAmIEhUVFBQT1NUX0ZJTEVOQU1FKSkgewotICAgICAgICAgIHJlc3VsdCA9IGZvcm1kYXRhX2FkZF9maWxlbmFtZShwb3N0LCAmZm9ybSwgJnNpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocmVzdWx0KQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBpZihmaWxlLT5jb250ZW50dHlwZSkgewotICAgICAgICAvKiB3ZSBoYXZlIGEgc3BlY2lmaWVkIHR5cGUgKi8KLSAgICAgICAgcmVzdWx0ID0gQWRkRm9ybURhdGFmKCZmb3JtLCAmc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcclxuQ29udGVudC1UeXBlOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLT5jb250ZW50dHlwZSk7Ci0gICAgICAgIGlmKHJlc3VsdCkKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY3VyTGlzdCA9IGZpbGUtPmNvbnRlbnRoZWFkZXI7Ci0gICAgICB3aGlsZShjdXJMaXN0KSB7Ci0gICAgICAgIC8qIFByb2Nlc3MgdGhlIGFkZGl0aW9uYWwgaGVhZGVycyBzcGVjaWZpZWQgZm9yIHRoaXMgZm9ybSAqLwotICAgICAgICByZXN1bHQgPSBBZGRGb3JtRGF0YWYoJmZvcm0sICZzaXplLCAiXHJcbiVzIiwgY3VyTGlzdC0+ZGF0YSk7Ci0gICAgICAgIGlmKHJlc3VsdCkKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY3VyTGlzdCA9IGN1ckxpc3QtPm5leHQ7Ci0gICAgICB9Ci0gICAgICBpZihyZXN1bHQpCi0gICAgICAgIGJyZWFrOwotCi0gICAgICByZXN1bHQgPSBBZGRGb3JtRGF0YWYoJmZvcm0sICZzaXplLCAiXHJcblxyXG4iKTsKLSAgICAgIGlmKHJlc3VsdCkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmKChwb3N0LT5mbGFncyAmIEhUVFBQT1NUX0ZJTEVOQU1FKSB8fAotICAgICAgICAgKHBvc3QtPmZsYWdzICYgSFRUUFBPU1RfUkVBREZJTEUpKSB7Ci0gICAgICAgIC8qIHdlIHNob3VsZCBpbmNsdWRlIHRoZSBjb250ZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSAqLwotICAgICAgICBGSUxFICpmaWxlcmVhZDsKLQotICAgICAgICBmaWxlcmVhZCA9ICFzdHJjbXAoIi0iLCBmaWxlLT5jb250ZW50cyk/Ci0gICAgICAgICAgc3RkaW46Zm9wZW4oZmlsZS0+Y29udGVudHMsICJyYiIpOyAvKiBiaW5hcnkgcmVhZCBmb3Igd2luMzIgICovCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogVk1TOiBUaGlzIG9ubHkgYWxsb3dzIGZvciBzdHJlYW0gZmlsZXMgb24gVk1TLiAgU3RyZWFtIGZpbGVzIGFyZQotICAgICAgICAgKiBPSywgYXMgYXJlIEZJWEVEICYgVkFSIGZpbGVzIFdJVEhPVVQgaW1wbGllZCBDQyBGb3IgaW1wbGllZCBDQywKLSAgICAgICAgICogZXZlcnkgcmVjb3JkIG5lZWRzIHRvIGhhdmUgYSBcbiBhcHBlbmRlZCAmIDEgYWRkZWQgdG8gU0laRQotICAgICAgICAgKi8KLQotICAgICAgICBpZihmaWxlcmVhZCkgewotICAgICAgICAgIGlmKGZpbGVyZWFkICE9IHN0ZGluKSB7Ci0gICAgICAgICAgICAvKiBjbG9zZSB0aGUgZmlsZSAqLwotICAgICAgICAgICAgZmNsb3NlKGZpbGVyZWFkKTsKLSAgICAgICAgICAgIC8qIGFkZCB0aGUgZmlsZSBuYW1lIG9ubHkgLSBmb3IgbGF0ZXIgcmVhZGluZyBmcm9tIHRoaXMgKi8KLSAgICAgICAgICAgIHJlc3VsdCA9IEFkZEZvcm1EYXRhKCZmb3JtLCBGT1JNX0ZJTEUsIGZpbGUtPmNvbnRlbnRzLCAwLCAmc2l6ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyogV2hlbiB1cGxvYWRpbmcgZnJvbSBzdGRpbiwgd2UgY2FuJ3Qga25vdyB0aGUgc2l6ZSBvZiB0aGUgZmlsZSwKLSAgICAgICAgICAgICAqIHRodXMgbXVzdCByZWFkIHRoZSBmdWxsIGZpbGUgYXMgYmVmb3JlLiBXZSAqY291bGQqIHVzZSBjaHVua2VkCi0gICAgICAgICAgICAgKiB0cmFuc2Zlci1lbmNvZGluZywgYnV0IHRoYXQgb25seSB3b3JrcyBmb3IgSFRUUCAxLjEgYW5kIHdlCi0gICAgICAgICAgICAgKiBjYW4ndCBiZSBzdXJlIHdlIHdvcmsgd2l0aCBzdWNoIGEgc2VydmVyLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzaXplX3QgbnJlYWQ7Ci0gICAgICAgICAgICBjaGFyIGJ1ZmZlcls1MTJdOwotICAgICAgICAgICAgd2hpbGUoKG5yZWFkID0gZnJlYWQoYnVmZmVyLCAxLCBzaXplb2YoYnVmZmVyKSwgZmlsZXJlYWQpKSAhPSAwKSB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IEFkZEZvcm1EYXRhKCZmb3JtLCBGT1JNX0NPTlRFTlQsIGJ1ZmZlciwgbnJlYWQsICZzaXplKTsKLSAgICAgICAgICAgICAgaWYocmVzdWx0IHx8IGZlb2YoZmlsZXJlYWQpIHx8IGZlcnJvcihmaWxlcmVhZCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGlmKGRhdGEpCi0gICAgICAgICAgICBmYWlsZihkYXRhLCAiY291bGRuJ3Qgb3BlbiBmaWxlIFwiJXNcIiIsIGZpbGUtPmNvbnRlbnRzKTsKLSAgICAgICAgICAqZmluYWxmb3JtID0gTlVMTDsKLSAgICAgICAgICByZXN1bHQgPSBDVVJMRV9SRUFEX0VSUk9SOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKHBvc3QtPmZsYWdzICYgSFRUUFBPU1RfQlVGRkVSKQotICAgICAgICAvKiBpbmNsdWRlIGNvbnRlbnRzIG9mIGJ1ZmZlciAqLwotICAgICAgICByZXN1bHQgPSBBZGRGb3JtRGF0YSgmZm9ybSwgRk9STV9DT05URU5ULCBwb3N0LT5idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3QtPmJ1ZmZlcmxlbmd0aCwgJnNpemUpOwotICAgICAgZWxzZSBpZihwb3N0LT5mbGFncyAmIEhUVFBQT1NUX0NBTExCQUNLKQotICAgICAgICAvKiB0aGUgY29udGVudHMgc2hvdWxkIGJlIHJlYWQgd2l0aCB0aGUgY2FsbGJhY2sgYW5kIHRoZSBzaXplIGlzIHNldAotICAgICAgICAgICB3aXRoIHRoZSBjb250ZW50c2xlbmd0aCAqLwotICAgICAgICByZXN1bHQgPSBBZGRGb3JtRGF0YSgmZm9ybSwgRk9STV9DQUxMQkFDSywgcG9zdC0+dXNlcnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3QtPmZsYWdzJkNVUkxfSFRUUFBPU1RfTEFSR0U/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3QtPmNvbnRlbnRsZW46cG9zdC0+Y29udGVudHNsZW5ndGgsICZzaXplKTsKLSAgICAgIGVsc2UKLSAgICAgICAgLyogaW5jbHVkZSB0aGUgY29udGVudHMgd2UgZ290ICovCi0gICAgICAgIHJlc3VsdCA9IEFkZEZvcm1EYXRhKCZmb3JtLCBGT1JNX0NPTlRFTlQsIHBvc3QtPmNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0LT5mbGFncyZDVVJMX0hUVFBQT1NUX0xBUkdFPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0LT5jb250ZW50bGVuOnBvc3QtPmNvbnRlbnRzbGVuZ3RoLCAmc2l6ZSk7Ci0gICAgICBmaWxlID0gZmlsZS0+bW9yZTsKLSAgICB9IHdoaWxlKGZpbGUgJiYgIXJlc3VsdCk7IC8qIGZvciBlYWNoIHNwZWNpZmllZCBmaWxlIGZvciB0aGlzIGZpZWxkICovCi0KLSAgICBpZihyZXN1bHQpCi0gICAgICBicmVhazsKLQotICAgIGlmKHBvc3QtPm1vcmUpIHsKLSAgICAgIC8qIHRoaXMgd2FzIGEgbXVsdGlwbGUtZmlsZSBpbmNsdXNpb24sIG1ha2UgYSB0ZXJtaW5hdGlvbiBmaWxlCi0gICAgICAgICBib3VuZGFyeTogKi8KLSAgICAgIHJlc3VsdCA9IEFkZEZvcm1EYXRhZigmZm9ybSwgJnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiXHJcbi0tJXMtLSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlYm91bmRhcnkpOwotICAgICAgaWYocmVzdWx0KQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcG9zdCA9IHBvc3QtPm5leHQ7Ci0gIH0gd2hpbGUocG9zdCk7IC8qIGZvciBlYWNoIGZpZWxkICovCi0KLSAgLyogZW5kLWJvdW5kYXJ5IGZvciBldmVyeXRoaW5nICovCiAgIGlmKCFyZXN1bHQpCi0gICAgcmVzdWx0ID0gQWRkRm9ybURhdGFmKCZmb3JtLCAmc2l6ZSwgIlxyXG4tLSVzLS1cclxuIiwgYm91bmRhcnkpOworICAgIHJlc3VsdCA9IGN1cmxfbWltZV9zdWJwYXJ0cyhmaW5hbGZvcm0sIGZvcm0pOwogCi0gIGlmKHJlc3VsdCkgewotICAgIEN1cmxfZm9ybWNsZWFuKCZmaXJzdGZvcm0pOwotICAgIHJldHVybiByZXN1bHQ7CisgIC8qIFByb2Nlc3MgZWFjaCB0b3AgcGFydC4gKi8KKyAgZm9yKDsgIXJlc3VsdCAmJiBwb3N0OyBwb3N0ID0gcG9zdC0+bmV4dCkgeworICAgIC8qIElmIHdlIGhhdmUgbW9yZSB0aGFuIGEgZmlsZSBoZXJlLCBjcmVhdGUgYSBtaW1lIHN1YnBhcnQgYW5kIGZpbGwgaXQuICovCisgICAgbXVsdGlwYXJ0ID0gZm9ybTsKKyAgICBpZihwb3N0LT5tb3JlKSB7CisgICAgICBwYXJ0ID0gY3VybF9taW1lX2FkZHBhcnQoZm9ybSk7CisgICAgICBpZighcGFydCkKKyAgICAgICAgcmVzdWx0ID0gQ1VSTEVfT1VUX09GX01FTU9SWTsKKyAgICAgIGlmKCFyZXN1bHQpCisgICAgICAgIHJlc3VsdCA9IHNldG5hbWUocGFydCwgcG9zdC0+bmFtZSwgcG9zdC0+bmFtZWxlbmd0aCk7CisgICAgICBpZighcmVzdWx0KSB7CisgICAgICAgIG11bHRpcGFydCA9IGN1cmxfbWltZV9pbml0KGRhdGEpOworICAgICAgICBpZighbXVsdGlwYXJ0KQorICAgICAgICAgIHJlc3VsdCA9IENVUkxFX09VVF9PRl9NRU1PUlk7CisgICAgICB9CisgICAgICBpZighcmVzdWx0KQorICAgICAgICByZXN1bHQgPSBjdXJsX21pbWVfc3VicGFydHMocGFydCwgbXVsdGlwYXJ0KTsKKyAgICB9CisKKyAgICAvKiBHZW5lcmF0ZSBhbGwgdGhlIHBhcnQgY29udGVudHMuICovCisgICAgZm9yKGZpbGUgPSBwb3N0OyAhcmVzdWx0ICYmIGZpbGU7IGZpbGUgPSBmaWxlLT5tb3JlKSB7CisgICAgICAvKiBDcmVhdGUgdGhlIHBhcnQuICovCisgICAgICBwYXJ0ID0gY3VybF9taW1lX2FkZHBhcnQobXVsdGlwYXJ0KTsKKyAgICAgIGlmKCFwYXJ0KQorICAgICAgICByZXN1bHQgPSBDVVJMRV9PVVRfT0ZfTUVNT1JZOworCisgICAgICAvKiBTZXQgdGhlIGhlYWRlcnMuICovCisgICAgICBpZighcmVzdWx0KQorICAgICAgICByZXN1bHQgPSBjdXJsX21pbWVfaGVhZGVycyhwYXJ0LCBmaWxlLT5jb250ZW50aGVhZGVyLCAwKTsKKworICAgICAgLyogU2V0IHRoZSBjb250ZW50IHR5cGUuICovCisgICAgICBpZighcmVzdWx0ICYmZmlsZS0+Y29udGVudHR5cGUpCisgICAgICAgIHJlc3VsdCA9IGN1cmxfbWltZV90eXBlKHBhcnQsIGZpbGUtPmNvbnRlbnR0eXBlKTsKKworICAgICAgLyogU2V0IGZpZWxkIG5hbWUuICovCisgICAgICBpZighcmVzdWx0ICYmICFwb3N0LT5tb3JlKQorICAgICAgICByZXN1bHQgPSBzZXRuYW1lKHBhcnQsIHBvc3QtPm5hbWUsIHBvc3QtPm5hbWVsZW5ndGgpOworCisgICAgICAvKiBQcm9jZXNzIGNvbnRlbnRzLiAqLworICAgICAgaWYoIXJlc3VsdCkgeworICAgICAgICBjdXJsX29mZl90IGNsZW4gPSBwb3N0LT5jb250ZW50c2xlbmd0aDsKKworICAgICAgICBpZihwb3N0LT5mbGFncyAmIENVUkxfSFRUUFBPU1RfTEFSR0UpCisgICAgICAgICAgY2xlbiA9IHBvc3QtPmNvbnRlbnRsZW47CisgICAgICAgIGlmKCFjbGVuKQorICAgICAgICAgIGNsZW4gPSAtMTsKKworICAgICAgICBpZihwb3N0LT5mbGFncyAmIChIVFRQUE9TVF9GSUxFTkFNRSB8IEhUVFBQT1NUX1JFQURGSUxFKSkgeworICAgICAgICAgIGlmKCFzdHJjbXAoZmlsZS0+Y29udGVudHMsICItIikpIHsKKyAgICAgICAgICAgIC8qIFRoZXJlIGFyZSBhIGZldyBjYXNlcyB3aGVyZSB0aGUgY29kZSBiZWxvdyB3b24ndCB3b3JrOyBpbgorICAgICAgICAgICAgICAgcGFydGljdWxhciwgZnJlb3BlbihzdGRpbikgYnkgdGhlIGNhbGxlciBpcyBub3QgZ3VhcmFudGVlZAorICAgICAgICAgICAgICAgdG8gcmVzdWx0IGFzIGV4cGVjdGVkLiBUaGlzIGZlYXR1cmUgaGFzIGJlZW4ga2VwdCBmb3IgYmFja3dhcmQKKyAgICAgICAgICAgICAgIGNvbXBhdGliaWxpdHk6IHVzZSBvZiAiLSIgcHNldWRvIGZpbGUgbmFtZSBzaG91bGQgYmUgYXZvaWRlZC4gKi8KKyAgICAgICAgICAgIHJlc3VsdCA9IGN1cmxfbWltZV9kYXRhX2NiKHBhcnQsIChjdXJsX29mZl90KSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJsX3JlYWRfY2FsbGJhY2spIGZyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cmxfc2Vla19jYWxsYmFjaykgZnNlZWssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAodm9pZCAqKSBzdGRpbik7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IGN1cmxfbWltZV9maWxlZGF0YShwYXJ0LCBmaWxlLT5jb250ZW50cyk7CisgICAgICAgICAgaWYoIXJlc3VsdCAmJiAocG9zdC0+ZmxhZ3MgJiBIVFRQUE9TVF9SRUFERklMRSkpCisgICAgICAgICAgICByZXN1bHQgPSBjdXJsX21pbWVfZmlsZW5hbWUocGFydCwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihwb3N0LT5mbGFncyAmIEhUVFBQT1NUX0JVRkZFUikKKyAgICAgICAgICByZXN1bHQgPSBjdXJsX21pbWVfZGF0YShwYXJ0LCBwb3N0LT5idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdC0+YnVmZmVybGVuZ3RoPyBwb3N0LT5idWZmZXJsZW5ndGg6IC0xKTsKKyAgICAgICAgZWxzZSBpZihwb3N0LT5mbGFncyAmIEhUVFBQT1NUX0NBTExCQUNLKQorICAgICAgICAgIC8qIHRoZSBjb250ZW50cyBzaG91bGQgYmUgcmVhZCB3aXRoIHRoZSBjYWxsYmFjayBhbmQgdGhlIHNpemUgaXMgc2V0CisgICAgICAgICAgICAgd2l0aCB0aGUgY29udGVudHNsZW5ndGggKi8KKyAgICAgICAgICByZXN1bHQgPSBjdXJsX21pbWVfZGF0YV9jYihwYXJ0LCBjbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWFkX2Z1bmMsIE5VTEwsIE5VTEwsIHBvc3QtPnVzZXJwKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgcmVzdWx0ID0gY3VybF9taW1lX2RhdGEocGFydCwgcG9zdC0+Y29udGVudHMsIChzc2l6ZV90KSBjbGVuKTsKKyNpZmRlZiBDVVJMX0RPRVNfQ09OVkVSU0lPTlMKKyAgICAgICAgICAvKiBDb252ZXJ0IHRleHR1YWwgY29udGVudHMgbm93LiAqLworICAgICAgICAgIGlmKCFyZXN1bHQgJiYgZGF0YSAmJiBwYXJ0LT5kYXRhc2l6ZSkKKyAgICAgICAgICAgIHJlc3VsdCA9IEN1cmxfY29udmVydF90b19uZXR3b3JrKGRhdGEsIHBhcnQtPmRhdGEsIHBhcnQtPmRhdGFzaXplKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIFNldCBmYWtlIGZpbGUgbmFtZS4gKi8KKyAgICAgIGlmKCFyZXN1bHQgJiYgcG9zdC0+c2hvd2ZpbGVuYW1lKQorICAgICAgICBpZihwb3N0LT5tb3JlIHx8IChwb3N0LT5mbGFncyAmIChIVFRQUE9TVF9GSUxFTkFNRSB8IEhUVFBQT1NUX0JVRkZFUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUFBPU1RfQ0FMTEJBQ0spKSkKKyAgICAgICAgICByZXN1bHQgPSBjdXJsX21pbWVfZmlsZW5hbWUocGFydCwgcG9zdC0+c2hvd2ZpbGVuYW1lKTsKKyAgICB9CiAgIH0KIAotICAqc2l6ZXAgPSBzaXplOwotICAqZmluYWxmb3JtID0gZmlyc3Rmb3JtOworICBpZihyZXN1bHQpCisgICAgQ3VybF9taW1lX2NsZWFucGFydChmaW5hbGZvcm0pOwogCiAgIHJldHVybiByZXN1bHQ7CiB9CiAKLS8qCi0gKiBDdXJsX0Zvcm1Jbml0KCkgaW5pdHMgdGhlIHN0cnVjdCAnZm9ybScgcG9pbnRzIHRvIHdpdGggdGhlICdmb3JtZGF0YScKLSAqIGFuZCByZXNldHMgdGhlICdzZW50JyBjb3VudGVyLgotICovCi1pbnQgQ3VybF9Gb3JtSW5pdChzdHJ1Y3QgRm9ybSAqZm9ybSwgc3RydWN0IEZvcm1EYXRhICpmb3JtZGF0YSkKLXsKLSAgaWYoIWZvcm1kYXRhKQotICAgIHJldHVybiAxOyAvKiBlcnJvciAqLwotCi0gIGZvcm0tPmRhdGEgPSBmb3JtZGF0YTsKLSAgZm9ybS0+c2VudCA9IDA7Ci0gIGZvcm0tPmZwID0gTlVMTDsKLSAgZm9ybS0+ZnJlYWRfZnVuYyA9IFpFUk9fTlVMTDsKLQotICByZXR1cm4gMDsKLX0KLQotI2lmbmRlZiBfX1ZNUwotIyBkZWZpbmUgZm9wZW5fcmVhZCBmb3BlbgotI2Vsc2UKLSAgLyoKLSAgICogdm1zZm9wZW5yZWFkCi0gICAqCi0gICAqIEZvciB1cGxvYWQgdG8gd29yayBhcyBleHBlY3RlZCBvbiBWTVMsIGRpZmZlcmVudCBvcHRpb25hbAotICAgKiBwYXJhbWV0ZXJzIG11c3QgYmUgYWRkZWQgdG8gdGhlIGZvcGVuIGNvbW1hbmQgYmFzZWQgb24KLSAgICogcmVjb3JkIGZvcm1hdCBvZiB0aGUgZmlsZS4KLSAgICoKLSAgICovCi0jIGRlZmluZSBmb3Blbl9yZWFkIHZtc2ZvcGVucmVhZAotc3RhdGljIEZJTEUgKiB2bXNmb3BlbnJlYWQoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqbW9kZSkKLXsKLSAgc3RydWN0X3N0YXQgc3RhdGJ1ZjsKLSAgaW50IHJlc3VsdDsKLQotICByZXN1bHQgPSBzdGF0KGZpbGUsICZzdGF0YnVmKTsKLQotICBzd2l0Y2goc3RhdGJ1Zi5zdF9mYWJfcmZtKSB7Ci0gIGNhc2UgRkFCJENfVkFSOgotICBjYXNlIEZBQiRDX1ZGQzoKLSAgY2FzZSBGQUIkQ19TVE1DUjoKLSAgICByZXR1cm4gZm9wZW4oZmlsZSwgRk9QRU5fUkVBRFRFWFQpOyAvKiBWTVMgKi8KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gZm9wZW4oZmlsZSwgRk9QRU5fUkVBRFRFWFQsICJyZm09c3RtbGYiLCAiY3R4PXN0bSIpOwotICB9Ci19Ci0jZW5kaWYKLQotLyoKLSAqIHJlYWRmcm9tZmlsZSgpCi0gKgotICogVGhlIHJlYWQgY2FsbGJhY2sgdGhhdCB0aGlzIGZ1bmN0aW9uIG1heSB1c2UgY2FuIHJldHVybiBhIHZhbHVlIGxhcmdlciB0aGFuCi0gKiAnc2l6ZScgKHdoaWNoIHRoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zKSB0aGF0IGluZGljYXRlcyBhIHByb2JsZW0gYW5kIGl0Ci0gKiBtdXN0IGJlIHByb3Blcmx5IGRlYWx0IHdpdGgKLSAqLwotc3RhdGljIHNpemVfdCByZWFkZnJvbWZpbGUoc3RydWN0IEZvcm0gKmZvcm0sIGNoYXIgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKQotewotICBzaXplX3QgbnJlYWQ7Ci0gIGJvb2wgY2FsbGJhY2sgPSAoZm9ybS0+ZGF0YS0+dHlwZSA9PSBGT1JNX0NBTExCQUNLKT9UUlVFOkZBTFNFOwotCi0gIGlmKGNhbGxiYWNrKSB7Ci0gICAgaWYoZm9ybS0+ZnJlYWRfZnVuYyA9PSBaRVJPX05VTEwpCi0gICAgICByZXR1cm4gMDsKLSAgICBucmVhZCA9IGZvcm0tPmZyZWFkX2Z1bmMoYnVmZmVyLCAxLCBzaXplLCBmb3JtLT5kYXRhLT5saW5lKTsKLSAgfQotICBlbHNlIHsKLSAgICBpZighZm9ybS0+ZnApIHsKLSAgICAgIC8qIHRoaXMgZmlsZSBoYXNuJ3QgeWV0IGJlZW4gb3BlbmVkICovCi0gICAgICBmb3JtLT5mcCA9IGZvcGVuX3JlYWQoZm9ybS0+ZGF0YS0+bGluZSwgInJiIik7IC8qIGIgaXMgZm9yIGJpbmFyeSAqLwotICAgICAgaWYoIWZvcm0tPmZwKQotICAgICAgICByZXR1cm4gKHNpemVfdCktMTsgLyogZmFpbHVyZSAqLwotICAgIH0KLSAgICBucmVhZCA9IGZyZWFkKGJ1ZmZlciwgMSwgc2l6ZSwgZm9ybS0+ZnApOwotICB9Ci0gIGlmKCFucmVhZCkgewotICAgIC8qIHRoaXMgaXMgdGhlIGxhc3QgY2h1bmsgZnJvbSB0aGUgZmlsZSwgbW92ZSBvbiAqLwotICAgIGlmKGZvcm0tPmZwKSB7Ci0gICAgICBmY2xvc2UoZm9ybS0+ZnApOwotICAgICAgZm9ybS0+ZnAgPSBOVUxMOwotICAgIH0KLSAgICBmb3JtLT5kYXRhID0gZm9ybS0+ZGF0YS0+bmV4dDsKLSAgfQotCi0gIHJldHVybiBucmVhZDsKLX0KLQotLyoKLSAqIEN1cmxfRm9ybVJlYWRlcigpIGlzIHRoZSBmcmVhZCgpIGVtdWxhdGlvbiBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0bwotICogZGVsaXZlciB0aGUgZm9ybWRhdGEgdG8gdGhlIHRyYW5zZmVyIGxvb3AgYW5kIHRoZW4gc2VudCBhd2F5IHRvIHRoZSBwZWVyLgotICovCi1zaXplX3QgQ3VybF9Gb3JtUmVhZGVyKGNoYXIgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuaXRlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZJTEUgKm15ZGF0YSkKLXsKLSAgc3RydWN0IEZvcm0gKmZvcm07Ci0gIHNpemVfdCB3YW50ZWRzaXplOwotICBzaXplX3QgZ290c2l6ZSA9IDA7Ci0KLSAgZm9ybT0oc3RydWN0IEZvcm0gKilteWRhdGE7Ci0KLSAgd2FudGVkc2l6ZSA9IHNpemUgKiBuaXRlbXM7Ci0KLSAgaWYoIWZvcm0tPmRhdGEpCi0gICAgcmV0dXJuIDA7IC8qIG5vdGhpbmcsIGVycm9yLCBlbXB0eSAqLwotCi0gIGlmKChmb3JtLT5kYXRhLT50eXBlID09IEZPUk1fRklMRSkgfHwKLSAgICAgKGZvcm0tPmRhdGEtPnR5cGUgPT0gRk9STV9DQUxMQkFDSykpIHsKLSAgICBnb3RzaXplID0gcmVhZGZyb21maWxlKGZvcm0sIGJ1ZmZlciwgd2FudGVkc2l6ZSk7Ci0KLSAgICBpZihnb3RzaXplKQotICAgICAgLyogSWYgcG9zaXRpdmUgb3IgLTEsIHJldHVybi4gSWYgemVybywgY29udGludWUhICovCi0gICAgICByZXR1cm4gZ290c2l6ZTsKLSAgfQotICBkbyB7Ci0KLSAgICBpZigoZm9ybS0+ZGF0YS0+bGVuZ3RoIC0gZm9ybS0+c2VudCkgPiB3YW50ZWRzaXplIC0gZ290c2l6ZSkgewotCi0gICAgICBtZW1jcHkoYnVmZmVyICsgZ290c2l6ZSwgZm9ybS0+ZGF0YS0+bGluZSArIGZvcm0tPnNlbnQsCi0gICAgICAgICAgICAgd2FudGVkc2l6ZSAtIGdvdHNpemUpOwotCi0gICAgICBmb3JtLT5zZW50ICs9IHdhbnRlZHNpemUtZ290c2l6ZTsKLQotICAgICAgcmV0dXJuIHdhbnRlZHNpemU7Ci0gICAgfQotCi0gICAgbWVtY3B5KGJ1ZmZlcitnb3RzaXplLAotICAgICAgICAgICBmb3JtLT5kYXRhLT5saW5lICsgZm9ybS0+c2VudCwKLSAgICAgICAgICAgKGZvcm0tPmRhdGEtPmxlbmd0aCAtIGZvcm0tPnNlbnQpICk7Ci0gICAgZ290c2l6ZSArPSBmb3JtLT5kYXRhLT5sZW5ndGggLSBmb3JtLT5zZW50OwotCi0gICAgZm9ybS0+c2VudCA9IDA7Ci0KLSAgICBmb3JtLT5kYXRhID0gZm9ybS0+ZGF0YS0+bmV4dDsgLyogYWR2YW5jZSAqLwotCi0gIH0gd2hpbGUoZm9ybS0+ZGF0YSAmJiAoZm9ybS0+ZGF0YS0+dHlwZSA8IEZPUk1fQ0FMTEJBQ0spKTsKLSAgLyogSWYgd2UgZ290IGFuIGVtcHR5IGxpbmUgYW5kIHdlIGhhdmUgbW9yZSBkYXRhLCB3ZSBwcm9jZWVkIHRvIHRoZSBuZXh0Ci0gICAgIGxpbmUgaW1tZWRpYXRlbHkgdG8gYXZvaWQgcmV0dXJuaW5nIHplcm8gYmVmb3JlIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZC4gKi8KLQotICByZXR1cm4gZ290c2l6ZTsKLX0KLQotLyoKLSAqIEN1cmxfZm9ybXBvc3RoZWFkZXIoKSByZXR1cm5zIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBmb3JtcG9zdCwgdGhlCi0gKiByZXF1ZXN0LWhlYWRlciBwYXJ0ICh3aGljaCBpcyBub3QgcGFydCBvZiB0aGUgcmVxdWVzdC1ib2R5IGxpa2UgdGhlIHJlc3Qgb2YKLSAqIHRoZSBwb3N0KS4KLSAqLwotY2hhciAqQ3VybF9mb3JtcG9zdGhlYWRlcih2b2lkICpmb3JtcCwgc2l6ZV90ICpsZW4pCi17Ci0gIGNoYXIgKmhlYWRlcjsKLSAgc3RydWN0IEZvcm0gKmZvcm09KHN0cnVjdCBGb3JtICopZm9ybXA7Ci0KLSAgaWYoIWZvcm0tPmRhdGEpCi0gICAgcmV0dXJuIE5VTEw7IC8qIG5vdGhpbmcsIEVSUk9SISAqLwotCi0gIGhlYWRlciA9IGZvcm0tPmRhdGEtPmxpbmU7Ci0gICpsZW4gPSBmb3JtLT5kYXRhLT5sZW5ndGg7Ci0KLSAgZm9ybS0+ZGF0YSA9IGZvcm0tPmRhdGEtPm5leHQ7IC8qIGFkdmFuY2UgKi8KLQotICByZXR1cm4gaGVhZGVyOwotfQotCi0vKgotICogZm9ybWJvdW5kYXJ5KCkgY3JlYXRlcyBhIHN1aXRhYmxlIGJvdW5kYXJ5IHN0cmluZyBhbmQgcmV0dXJucyBhbiBhbGxvY2F0ZWQKLSAqIG9uZS4KLSAqLwotc3RhdGljIENVUkxjb2RlIGZvcm1ib3VuZGFyeShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpidWZmZXIsIHNpemVfdCBidWZsZW4pCi17Ci0gIC8qIDI0IGRhc2hlcyBhbmQgMTYgaGV4YWRlY2ltYWwgZGlnaXRzIG1ha2VzIDY0IGJpdCAoMTg0NDY3NDQwNzM3MDk1NTE2MTUpCi0gICAgIGNvbWJpbmF0aW9ucyAqLwotICBpZihidWZsZW4gPCA0MSkKLSAgICByZXR1cm4gQ1VSTEVfQkFEX0ZVTkNUSU9OX0FSR1VNRU5UOwotCi0gIG1lbXNldChidWZmZXIsICctJywgMjQpOwotICBDdXJsX3JhbmRfaGV4KGRhdGEsICh1bnNpZ25lZCBjaGFyICopJmJ1ZmZlclsyNF0sIDE3KTsKLQotICByZXR1cm4gQ1VSTEVfT0s7Ci19Ci0KICNlbHNlICAvKiBDVVJMX0RJU0FCTEVfSFRUUCAqLwogQ1VSTEZPUk1jb2RlIGN1cmxfZm9ybWFkZChzdHJ1Y3QgY3VybF9odHRwcG9zdCAqKmh0dHBwb3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY3VybF9odHRwcG9zdCAqKmxhc3RfcG9zdCwKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2Zvcm1kYXRhLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9mb3JtZGF0YS5oCmluZGV4IDY5NjI5ZjYuLjEyNDZjMmIgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2Zvcm1kYXRhLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvZm9ybWRhdGEuaApAQCAtNyw3ICs3LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtMjIsMzIgKzIyLDYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1lbnVtIGZvcm10eXBlIHsKLSAgRk9STV9EQVRBTUVNLCAvKiBhbHJlYWR5IGFsbG9jYXRlZCBGT1JNX0RBVEEgbWVtb3J5ICovCi0gIEZPUk1fREFUQSwgICAgLyogZm9ybSBtZXRhZGF0YSAoY29udmVydCB0byBuZXR3b3JrIGVuY29kaW5nIGlmIG5lY2Vzc2FyeSkgKi8KLSAgRk9STV9DT05URU5ULCAvKiBmb3JtIGNvbnRlbnQgIChuZXZlciBjb252ZXJ0KSAqLwotICBGT1JNX0NBTExCQUNLLCAvKiAnbGluZScgcG9pbnRzIHRvIHRoZSBjdXN0b20gcG9pbnRlciB3ZSBwYXNzIHRvIHRoZSBjYWxsYmFjawotICAgICAgICAgICAgICAgICAgKi8KLSAgRk9STV9GSUxFICAgICAvKiAnbGluZScgcG9pbnRzIHRvIGEgZmlsZSBuYW1lIHdlIHNob3VsZCByZWFkIGZyb20KLSAgICAgICAgICAgICAgICAgICB0byBjcmVhdGUgdGhlIGZvcm0gZGF0YSAobmV2ZXIgY29udmVydCkgKi8KLX07Ci0KLS8qIHBsYWluIGFuZCBzaW1wbGUgbGlua2VkIGxpc3Qgd2l0aCBsaW5lcyB0byBzZW5kICovCi1zdHJ1Y3QgRm9ybURhdGEgewotICBzdHJ1Y3QgRm9ybURhdGEgKm5leHQ7Ci0gIGVudW0gZm9ybXR5cGUgdHlwZTsKLSAgY2hhciAqbGluZTsKLSAgc2l6ZV90IGxlbmd0aDsKLX07Ci0KLXN0cnVjdCBGb3JtIHsKLSAgc3RydWN0IEZvcm1EYXRhICpkYXRhOyAvKiBjdXJyZW50IGZvcm0gbGluZSB0byBzZW5kICovCi0gIHNpemVfdCBzZW50OyAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBjdXJyZW50IGxpbmUgdGhhdCBoYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gc2VudCBpbiBhIHByZXZpb3VzIGludm9rZSAqLwotICBGSUxFICpmcDsgICAgICAgICAgICAgIC8qIGZpbGUgdG8gcmVhZCBmcm9tICovCi0gIGN1cmxfcmVhZF9jYWxsYmFjayBmcmVhZF9mdW5jOyAvKiBmcmVhZCBjYWxsYmFjayBwb2ludGVyICovCi19OwotCiAvKiB1c2VkIGJ5IEZvcm1BZGQgZm9yIHRlbXBvcmFyeSBzdG9yYWdlICovCiB0eXBlZGVmIHN0cnVjdCBGb3JtSW5mbyB7CiAgIGNoYXIgKm5hbWU7CkBAIC02OSwzMSArNDMsOSBAQAogICBzdHJ1Y3QgRm9ybUluZm8gKm1vcmU7CiB9IEZvcm1JbmZvOwogCi1pbnQgQ3VybF9Gb3JtSW5pdChzdHJ1Y3QgRm9ybSAqZm9ybSwgc3RydWN0IEZvcm1EYXRhICpmb3JtZGF0YSk7Ci0KIENVUkxjb2RlIEN1cmxfZ2V0Zm9ybWRhdGEoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEZvcm1EYXRhICoqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX21pbWVwYXJ0ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjdXJsX2h0dHBwb3N0ICpwb3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjdXN0b21fY29udGVudHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfb2ZmX3QgKnNpemUpOwotCi0vKiBmcmVhZCgpIGVtdWxhdGlvbiAqLwotc2l6ZV90IEN1cmxfRm9ybVJlYWRlcihjaGFyICpidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgbml0ZW1zLAotICAgICAgICAgICAgICAgICAgICAgICBGSUxFICpteWRhdGEpOwotCi0vKgotICogQ3VybF9mb3JtcG9zdGhlYWRlcigpIHJldHVybnMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGZvcm1wb3N0LCB0aGUKLSAqIHJlcXVlc3QtaGVhZGVyIHBhcnQgKHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoZSByZXF1ZXN0LWJvZHkgbGlrZSB0aGUgcmVzdCBvZgotICogdGhlIHBvc3QpLgotICovCi1jaGFyICpDdXJsX2Zvcm1wb3N0aGVhZGVyKHZvaWQgKmZvcm1wLCBzaXplX3QgKmxlbik7Ci0KLWNoYXIgKkN1cmxfRm9ybUJvdW5kYXJ5KHZvaWQpOwotCi12b2lkIEN1cmxfZm9ybWNsZWFuKHN0cnVjdCBGb3JtRGF0YSAqKik7Ci0KLUNVUkxjb2RlIEN1cmxfZm9ybWNvbnZlcnQoc3RydWN0IEN1cmxfZWFzeSAqLCBzdHJ1Y3QgRm9ybURhdGEgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfcmVhZF9jYWxsYmFjayBmcmVhZF9mdW5jKTsKIAogI2VuZGlmIC8qIEhFQURFUl9DVVJMX0ZPUk1EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2Z0cC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvZnRwLmMKaW5kZXggNzgzZGJlMS4uODRhZTM3YiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvZnRwLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvZnRwLmMKQEAgLTE3OCwxMCArMTc4LDExIEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBmdHBfZGlzY29ubmVjdCwgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfRlRQLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX0ZUUCwgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KLSAgUFJPVE9QVF9EVUFMIHwgUFJPVE9QVF9DTE9TRUFDVElPTiB8IFBST1RPUFRfTkVFRFNQV0QKLSAgfCBQUk9UT1BUX05PVVJMUVVFUlkgLyogZmxhZ3MgKi8KKyAgUFJPVE9QVF9EVUFMIHwgUFJPVE9QVF9DTE9TRUFDVElPTiB8IFBST1RPUFRfTkVFRFNQV0QgfAorICBQUk9UT1BUX05PVVJMUVVFUlkgfCBQUk9UT1BUX1BST1hZX0FTX0hUVFAgLyogZmxhZ3MgKi8KIH07CiAKIApAQCAtMjA1LDYgKzIwNiw3IEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBmdHBfZGlzY29ubmVjdCwgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfRlRQUywgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX0ZUUFMsICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9TU0wgfCBQUk9UT1BUX0RVQUwgfCBQUk9UT1BUX0NMT1NFQUNUSU9OIHwKQEAgLTIxMiw1OSArMjE0LDYgQEAKIH07CiAjZW5kaWYKIAotI2lmbmRlZiBDVVJMX0RJU0FCTEVfSFRUUAotLyoKLSAqIEhUVFAtcHJveHllZCBGVFAgcHJvdG9jb2wgaGFuZGxlci4KLSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IEN1cmxfaGFuZGxlciBDdXJsX2hhbmRsZXJfZnRwX3Byb3h5ID0gewotICAiRlRQIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjaGVtZSAqLwotICBDdXJsX2h0dHBfc2V0dXBfY29ubiwgICAgICAgICAgICAgICAgIC8qIHNldHVwX2Nvbm5lY3Rpb24gKi8KLSAgQ3VybF9odHRwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb19pdCAqLwotICBDdXJsX2h0dHBfZG9uZSwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb19tb3JlICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdF9pdCAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3RpbmcgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2luZyAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2luZ19nZXRzb2NrICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9tb3JlX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCi0gIFBPUlRfRlRQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwotICBDVVJMUFJPVE9fSFRUUCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCi0gIFBST1RPUFRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8KLX07Ci0KLQotI2lmZGVmIFVTRV9TU0wKLS8qCi0gKiBIVFRQLXByb3h5ZWQgRlRQUyBwcm90b2NvbCBoYW5kbGVyLgotICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgQ3VybF9oYW5kbGVyIEN1cmxfaGFuZGxlcl9mdHBzX3Byb3h5ID0gewotICAiRlRQUyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjaGVtZSAqLwotICBDdXJsX2h0dHBfc2V0dXBfY29ubiwgICAgICAgICAgICAgICAgIC8qIHNldHVwX2Nvbm5lY3Rpb24gKi8KLSAgQ3VybF9odHRwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb19pdCAqLwotICBDdXJsX2h0dHBfZG9uZSwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb19tb3JlICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdF9pdCAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3RpbmcgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2luZyAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2luZ19nZXRzb2NrICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9tb3JlX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCi0gIFBPUlRfRlRQUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwotICBDVVJMUFJPVE9fSFRUUCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCi0gIFBST1RPUFRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8KLX07Ci0jZW5kaWYKLSNlbmRpZgotCiBzdGF0aWMgdm9pZCBjbG9zZV9zZWNvbmRhcnlzb2NrZXQoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKQogewogICBpZihDVVJMX1NPQ0tFVF9CQUQgIT0gY29ubi0+c29ja1tTRUNPTkRBUllTT0NLRVRdKSB7CkBAIC0yNzIsNyArMjIxLDYgQEAKICAgICBjb25uLT5zb2NrW1NFQ09OREFSWVNPQ0tFVF0gPSBDVVJMX1NPQ0tFVF9CQUQ7CiAgIH0KICAgY29ubi0+Yml0cy50Y3Bjb25uZWN0W1NFQ09OREFSWVNPQ0tFVF0gPSBGQUxTRTsKLSAgY29ubi0+dHVubmVsX3N0YXRlW1NFQ09OREFSWVNPQ0tFVF0gPSBUVU5ORUxfSU5JVDsKIH0KIAogLyoKQEAgLTI5MSw5ICsyMzksOSBAQAogewogICBpbnQgaTsKICAgaWYoZnRwYy0+ZGlycykgewotICAgIGZvcihpPTA7IGkgPCBmdHBjLT5kaXJkZXB0aDsgaSsrKSB7CisgICAgZm9yKGkgPSAwOyBpIDwgZnRwYy0+ZGlyZGVwdGg7IGkrKykgewogICAgICAgZnJlZShmdHBjLT5kaXJzW2ldKTsKLSAgICAgIGZ0cGMtPmRpcnNbaV09TlVMTDsKKyAgICAgIGZ0cGMtPmRpcnNbaV0gPSBOVUxMOwogICAgIH0KICAgICBmcmVlKGZ0cGMtPmRpcnMpOwogICAgIGZ0cGMtPmRpcnMgPSBOVUxMOwpAQCAtMzQwLDcgKzI4OCw3IEBACiAgIGlmKDAgPT0gZ2V0c29ja25hbWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkLCAmc2l6ZSkpIHsKICAgICBzaXplID0gc2l6ZW9mKGFkZCk7CiAKLSAgICBzPWFjY2VwdChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZhZGQsICZzaXplKTsKKyAgICBzID0gYWNjZXB0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZCwgJnNpemUpOwogICB9CiAgIEN1cmxfY2xvc2Vzb2NrZXQoY29ubiwgc29jayk7IC8qIGNsb3NlIHRoZSBmaXJzdCBzb2NrZXQgKi8KIApAQCAtMzg4LDcgKzMzNiw3IEBACiB7CiAgIHRpbWVfdCB0aW1lb3V0X21zID0gREVGQVVMVF9BQ0NFUFRfVElNRU9VVDsKICAgdGltZV90IG90aGVyOwotICBzdHJ1Y3QgdGltZXZhbCBub3c7CisgIHN0cnVjdCBjdXJsdGltZSBub3c7CiAKICAgaWYoZGF0YS0+c2V0LmFjY2VwdHRpbWVvdXQgPiAwKQogICAgIHRpbWVvdXRfbXMgPSBkYXRhLT5zZXQuYWNjZXB0dGltZW91dDsKQEAgLTUwOSw3ICs0NTcsNyBAQAogICB9CiAKICAgaWYoY29ubi0+cHJvdG8uZnRwYy5zdGF0ZV9zYXZlZCA9PSBGVFBfU1RPUikgewotICAgICooZnRwLT5ieXRlY291bnRwKT0wOworICAgICooZnRwLT5ieXRlY291bnRwKSA9IDA7CiAKICAgICAvKiBXaGVuIHdlIGtub3cgd2UncmUgdXBsb2FkaW5nIGEgc3BlY2lmaWVkIGZpbGUsIHdlIGNhbiBnZXQgdGhlIGZpbGUKICAgICAgICBzaXplIHByaW9yIHRvIHRoZSBhY3R1YWwgdXBsb2FkLiAqLwpAQCAtNjQ0LDcgKzU5Miw3IEBACiAjZW5kaWYKIAogICAvKiBzdG9yZSB0aGUgbGF0ZXN0IGNvZGUgZm9yIGxhdGVyIHJldHJpZXZhbCAqLwotICBkYXRhLT5pbmZvLmh0dHBjb2RlPWNvZGU7CisgIGRhdGEtPmluZm8uaHR0cGNvZGUgPSBjb2RlOwogCiAgIGlmKGZ0cGNvZGUpCiAgICAgKmZ0cGNvZGUgPSBjb2RlOwpAQCAtNjkyLDggKzY0MCw4IEBACiAgIHN0cnVjdCBmdHBfY29ubiAqZnRwYyA9ICZjb25uLT5wcm90by5mdHBjOwogICBzdHJ1Y3QgcGluZ3BvbmcgKnBwID0gJmZ0cGMtPnBwOwogICBzaXplX3QgbnJlYWQ7Ci0gIGludCBjYWNoZV9za2lwPTA7Ci0gIGludCB2YWx1ZV90b19iZV9pZ25vcmVkPTA7CisgIGludCBjYWNoZV9za2lwID0gMDsKKyAgaW50IHZhbHVlX3RvX2JlX2lnbm9yZWQgPSAwOwogCiAgIGlmKGZ0cGNvZGUpCiAgICAgKmZ0cGNvZGUgPSAwOyAvKiAwIGZvciBlcnJvcnMgKi8KQEAgLTcwMSwxMyArNjQ5LDEzIEBACiAgICAgLyogbWFrZSB0aGUgcG9pbnRlciBwb2ludCB0byBzb21ldGhpbmcgZm9yIHRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gKi8KICAgICBmdHBjb2RlID0gJnZhbHVlX3RvX2JlX2lnbm9yZWQ7CiAKLSAgKm5yZWFkcD0wOworICAqbnJlYWRwID0gMDsKIAogICB3aGlsZSghKmZ0cGNvZGUgJiYgIXJlc3VsdCkgewogICAgIC8qIGNoZWNrIGFuZCByZXNldCB0aW1lb3V0IHZhbHVlIGV2ZXJ5IGxhcCAqLwogICAgIHRpbWVvdXQgPSBDdXJsX3BwX3N0YXRlX3RpbWVvdXQocHApOwogCi0gICAgaWYodGltZW91dCA8PTApIHsKKyAgICBpZih0aW1lb3V0IDw9IDApIHsKICAgICAgIGZhaWxmKGRhdGEsICJGVFAgcmVzcG9uc2UgdGltZW91dCIpOwogICAgICAgcmV0dXJuIENVUkxFX09QRVJBVElPTl9USU1FRE9VVDsgLyogYWxyZWFkeSB0b28gbGl0dGxlIHRpbWUgKi8KICAgICB9CkBAIC03NjUsNyArNzEzLDcgQEAKICAgICBlbHNlCiAgICAgICAvKiB3aGVuIHdlIGdvdCBkYXRhIG9yIHRoZXJlIGlzIG5vIGNhY2hlIGxlZnQsIHdlIHJlc2V0IHRoZSBjYWNoZSBza2lwCiAgICAgICAgICBjb3VudGVyICovCi0gICAgICBjYWNoZV9za2lwPTA7CisgICAgICBjYWNoZV9za2lwID0gMDsKIAogICAgICpucmVhZHAgKz0gbnJlYWQ7CiAKQEAgLTkwMCw3ICs4NDgsNyBAQAogICAgICAgaW50IGk7CiAgICAgICAvKiBQT1JUIGlzIHVzZWQgdG8gdGVsbCB0aGUgc2VydmVyIHRvIGNvbm5lY3QgdG8gdXMsIGFuZCBkdXJpbmcgdGhhdCB3ZQogICAgICAgICAgZG9uJ3QgZG8gaGFwcHkgZXllYmFsbHMsIGJ1dCB3ZSBkbyBpZiB3ZSBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIgKi8KLSAgICAgIGZvcihzPTEsIGk9MDsgaTwyOyBpKyspIHsKKyAgICAgIGZvcihzID0gMSwgaSA9IDA7IGk8MjsgaSsrKSB7CiAgICAgICAgIGlmKGNvbm4tPnRlbXBzb2NrW2ldICE9IENVUkxfU09DS0VUX0JBRCkgewogICAgICAgICAgIHNvY2tzW3NdID0gY29ubi0+dGVtcHNvY2tbaV07CiAgICAgICAgICAgYml0cyB8PSBHRVRTT0NLX1dSSVRFU09DSyhzKyspOwpAQCAtOTM3LDIzICs4ODUsMjYgQEAKICAgICAvKiBjb3VudDMgaXMgc2V0IHRvIGFsbG93IGEgTUtEIHRvIGZhaWwgb25jZS4gSW4gdGhlIGNhc2Ugd2hlbiBmaXJzdCBDV0QKICAgICAgICBmYWlscyBhbmQgdGhlbiBNS0QgZmFpbHMgKGR1ZSB0byBhbm90aGVyIHNlc3Npb24gcmFjZWQgaXQgdG8gY3JlYXRlIHRoZQogICAgICAgIGRpcikgdGhpcyB0aGVuIGFsbG93cyBmb3IgYSBzZWNvbmQgdHJ5IHRvIENXRCB0byBpdCAqLwotICAgIGZ0cGMtPmNvdW50MyA9IChjb25uLT5kYXRhLT5zZXQuZnRwX2NyZWF0ZV9taXNzaW5nX2RpcnM9PTIpPzE6MDsKKyAgICBmdHBjLT5jb3VudDMgPSAoY29ubi0+ZGF0YS0+c2V0LmZ0cF9jcmVhdGVfbWlzc2luZ19kaXJzID09IDIpPzE6MDsKIAotICAgIGlmKGNvbm4tPmJpdHMucmV1c2UgJiYgZnRwYy0+ZW50cnlwYXRoKSB7CisgICAgaWYoKGNvbm4tPmRhdGEtPnNldC5mdHBfZmlsZW1ldGhvZCA9PSBGVFBGSUxFX05PQ1dEKSAmJiAhZnRwYy0+Y3dkY291bnQpCisgICAgICAvKiBObyBDV0QgbmVjZXNzYXJ5ICovCisgICAgICByZXN1bHQgPSBmdHBfc3RhdGVfbWR0bShjb25uKTsKKyAgICBlbHNlIGlmKGNvbm4tPmJpdHMucmV1c2UgJiYgZnRwYy0+ZW50cnlwYXRoKSB7CiAgICAgICAvKiBUaGlzIGlzIGEgcmUtdXNlZCBjb25uZWN0aW9uLiBTaW5jZSB3ZSBjaGFuZ2UgZGlyZWN0b3J5IHRvIHdoZXJlIHRoZQogICAgICAgICAgdHJhbnNmZXIgaXMgdGFraW5nIHBsYWNlLCB3ZSBtdXN0IGZpcnN0IGdldCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBkaXIKICAgICAgICAgIHdoZXJlIHdlIGVuZGVkIHVwIGFmdGVyIGxvZ2luOiAqLwotICAgICAgZnRwYy0+Y291bnQxID0gMDsgLyogd2UgY291bnQgdGhpcyBhcyB0aGUgZmlyc3QgcGF0aCwgdGhlbiB3ZSBhZGQgb25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbGwgdXBjb21pbmcgb25lcyBpbiB0aGUgZnRwLT5kaXJzW10gYXJyYXkgKi8KKyAgICAgIGZ0cGMtPmN3ZGNvdW50ID0gMDsgLyogd2UgY291bnQgdGhpcyBhcyB0aGUgZmlyc3QgcGF0aCwgdGhlbiB3ZSBhZGQgb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbGwgdXBjb21pbmcgb25lcyBpbiB0aGUgZnRwLT5kaXJzW10gYXJyYXkgKi8KICAgICAgIFBQU0VOREYoJmNvbm4tPnByb3RvLmZ0cGMucHAsICJDV0QgJXMiLCBmdHBjLT5lbnRyeXBhdGgpOwogICAgICAgc3RhdGUoY29ubiwgRlRQX0NXRCk7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgaWYoZnRwYy0+ZGlyZGVwdGgpIHsKLSAgICAgICAgZnRwYy0+Y291bnQxID0gMTsKKyAgICAgICAgZnRwYy0+Y3dkY291bnQgPSAxOwogICAgICAgICAvKiBpc3N1ZSB0aGUgZmlyc3QgQ1dELCB0aGUgcmVzdCBpcyBzZW50IHdoZW4gdGhlIENXRCByZXNwb25zZXMgYXJlCiAgICAgICAgICAgIHJlY2VpdmVkLi4uICovCi0gICAgICAgIFBQU0VOREYoJmNvbm4tPnByb3RvLmZ0cGMucHAsICJDV0QgJXMiLCBmdHBjLT5kaXJzW2Z0cGMtPmNvdW50MSAtMV0pOworICAgICAgICBQUFNFTkRGKCZjb25uLT5wcm90by5mdHBjLnBwLCAiQ1dEICVzIiwgZnRwYy0+ZGlyc1tmdHBjLT5jd2Rjb3VudCAtMV0pOwogICAgICAgICBzdGF0ZShjb25uLCBGVFBfQ1dEKTsKICAgICAgIH0KICAgICAgIGVsc2UgewpAQCAtOTc3LDE1ICs5MjgsMTUgQEAKIHsKICAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7CiAgIHN0cnVjdCBmdHBfY29ubiAqZnRwYyA9ICZjb25uLT5wcm90by5mdHBjOwotICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhPWNvbm4tPmRhdGE7Ci0gIGN1cmxfc29ja2V0X3QgcG9ydHNvY2s9IENVUkxfU09DS0VUX0JBRDsKKyAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CisgIGN1cmxfc29ja2V0X3QgcG9ydHNvY2sgPSBDVVJMX1NPQ0tFVF9CQUQ7CiAgIGNoYXIgbXlob3N0WzI1Nl0gPSAiIjsKIAogICBzdHJ1Y3QgQ3VybF9zb2NrYWRkcl9zdG9yYWdlIHNzOwogICBDdXJsX2FkZHJpbmZvICpyZXMsICphaTsKICAgY3VybF9zb2NrbGVuX3Qgc3NsZW47CiAgIGNoYXIgaGJ1ZltOSV9NQVhIT1NUXTsKLSAgc3RydWN0IHNvY2thZGRyICpzYT0oc3RydWN0IHNvY2thZGRyICopJnNzOworICBzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSZzczsKICAgc3RydWN0IHNvY2thZGRyX2luICogY29uc3Qgc2E0ID0gKHZvaWQgKilzYTsKICNpZmRlZiBFTkFCTEVfSVBWNgogICBzdHJ1Y3Qgc29ja2FkZHJfaW42ICogY29uc3Qgc2E2ID0gKHZvaWQgKilzYTsKQEAgLTk5Niw3ICs5NDcsNyBAQAogICBpbnQgZXJyb3I7CiAgIGNoYXIgKmhvc3QgPSBOVUxMOwogICBjaGFyICpzdHJpbmdfZnRwcG9ydCA9IGRhdGEtPnNldC5zdHJbU1RSSU5HX0ZUUFBPUlRdOwotICBzdHJ1Y3QgQ3VybF9kbnNfZW50cnkgKmg9TlVMTDsKKyAgc3RydWN0IEN1cmxfZG5zX2VudHJ5ICpoID0gTlVMTDsKICAgdW5zaWduZWQgc2hvcnQgcG9ydF9taW4gPSAwOwogICB1bnNpZ25lZCBzaG9ydCBwb3J0X21heCA9IDA7CiAgIHVuc2lnbmVkIHNob3J0IHBvcnQ7CkBAIC0xMDI0LDcgKzk3NSw3IEBACiAgICAgY2hhciAqcG9ydF9zdGFydCA9IE5VTEw7CiAgICAgY2hhciAqcG9ydF9zZXAgPSBOVUxMOwogCi0gICAgYWRkciA9IGNhbGxvYyhhZGRybGVuKzEsIDEpOworICAgIGFkZHIgPSBjYWxsb2MoYWRkcmxlbiArIDEsIDEpOwogICAgIGlmKCFhZGRyKQogICAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CiAKQEAgLTEwNjcsNyArMTAxOCw3IEBACiAgICAgaWYoaXBfZW5kICE9IE5VTEwpIHsKICAgICAgIHBvcnRfc3RhcnQgPSBzdHJjaHIoaXBfZW5kLCAnOicpOwogICAgICAgaWYocG9ydF9zdGFydCkgewotICAgICAgICBwb3J0X21pbiA9IGN1cmx4X3VsdG91cyhzdHJ0b3VsKHBvcnRfc3RhcnQrMSwgTlVMTCwgMTApKTsKKyAgICAgICAgcG9ydF9taW4gPSBjdXJseF91bHRvdXMoc3RydG91bChwb3J0X3N0YXJ0ICsgMSwgTlVMTCwgMTApKTsKICAgICAgICAgcG9ydF9zZXAgPSBzdHJjaHIocG9ydF9zdGFydCwgJy0nKTsKICAgICAgICAgaWYocG9ydF9zZXApIHsKICAgICAgICAgICBwb3J0X21heCA9IGN1cmx4X3VsdG91cyhzdHJ0b3VsKHBvcnRfc2VwICsgMSwgTlVMTCwgMTApKTsKQEAgLTEzMTEsNyArMTI2Miw3IEBACiAgICAgICAvKiB0cmFuc2xhdGUgeC54LngueCB0byB4LHgseCx4ICovCiAgICAgICB3aGlsZShzb3VyY2UgJiYgKnNvdXJjZSkgewogICAgICAgICBpZigqc291cmNlID09ICcuJykKLSAgICAgICAgICAqZGVzdD0nLCc7CisgICAgICAgICAgKmRlc3QgPSAnLCc7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAqZGVzdCA9ICpzb3VyY2U7CiAgICAgICAgIGRlc3QrKzsKQEAgLTE1MTgsMTIgKzE0NjksMTIgQEAKICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogCiAgICAgLyogQ2hlY2sgaWYgcGF0aCBkb2VzIG5vdCBlbmQgd2l0aCAvLCBhcyB0aGVuIHdlIGN1dCBvZmYgdGhlIGZpbGUgcGFydCAqLwotICAgIGlmKGxzdEFyZ1tzdHJsZW4obHN0QXJnKSAtIDFdICE9ICcvJykgIHsKKyAgICBpZihsc3RBcmdbc3RybGVuKGxzdEFyZykgLSAxXSAhPSAnLycpIHsKIAogICAgICAgLyogY2hvcCBvZmYgdGhlIGZpbGUgcGFydCBpZiBmb3JtYXQgaXMgZGlyL2Rpci9maWxlICovCiAgICAgICBzbGFzaFBvcyA9IHN0cnJjaHIobHN0QXJnLCAnLycpOwogICAgICAgaWYoc2xhc2hQb3MpCi0gICAgICAgICooc2xhc2hQb3MrMSkgPSAnXDAnOworICAgICAgICAqKHNsYXNoUG9zICsgMSkgPSAnXDAnOwogICAgIH0KICAgfQogCkBAIC0xNjcxLDcgKzE2MjIsNyBAQAogICAgIH0KIAogICAgIGlmKHNlZWtlcnIgIT0gQ1VSTF9TRUVLRlVOQ19PSykgewotICAgICAgY3VybF9vZmZfdCBwYXNzZWQ9MDsKKyAgICAgIGN1cmxfb2ZmX3QgcGFzc2VkID0gMDsKICAgICAgIGlmKHNlZWtlcnIgIT0gQ1VSTF9TRUVLRlVOQ19DQU5UU0VFSykgewogICAgICAgICBmYWlsZihkYXRhLCAiQ291bGQgbm90IHNlZWsgc3RyZWFtIik7CiAgICAgICAgIHJldHVybiBDVVJMRV9GVFBfQ09VTEROVF9VU0VfUkVTVDsKQEAgLTE3MzMsNyArMTY4NCw3IEBACiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBzdHJ1Y3QgRlRQICpmdHAgPSBkYXRhLT5yZXEucHJvdG9wOwogICBzdHJ1Y3QgZnRwX2Nvbm4gKmZ0cGMgPSAmY29ubi0+cHJvdG8uZnRwYzsKLSAgYm9vbCBxdW90ZT1GQUxTRTsKKyAgYm9vbCBxdW90ZSA9IEZBTFNFOwogICBzdHJ1Y3QgY3VybF9zbGlzdCAqaXRlbTsKIAogICBzd2l0Y2goaW5zdGF0ZSkgewpAQCAtMTg3MCwxMSArMTgyMSwxMSBAQAogewogICBzdHJ1Y3QgZnRwX2Nvbm4gKmZ0cGMgPSAmY29ubi0+cHJvdG8uZnRwYzsKICAgQ1VSTGNvZGUgcmVzdWx0OwotICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhPWNvbm4tPmRhdGE7Ci0gIHN0cnVjdCBDdXJsX2Ruc19lbnRyeSAqYWRkcj1OVUxMOworICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKKyAgc3RydWN0IEN1cmxfZG5zX2VudHJ5ICphZGRyID0gTlVMTDsKICAgaW50IHJjOwogICB1bnNpZ25lZCBzaG9ydCBjb25uZWN0cG9ydDsgLyogdGhlIGxvY2FsIHBvcnQgY29ubmVjdCgpIHNob3VsZCB1c2UhICovCi0gIGNoYXIgKnN0cj0mZGF0YS0+c3RhdGUuYnVmZmVyWzRdOyAgLyogc3RhcnQgb24gdGhlIGZpcnN0IGxldHRlciAqLworICBjaGFyICpzdHIgPSAmZGF0YS0+c3RhdGUuYnVmZmVyWzRdOyAgLyogc3RhcnQgb24gdGhlIGZpcnN0IGxldHRlciAqLwogCiAgIC8qIGlmIHdlIGNvbWUgaGVyZSBhZ2FpbiwgbWFrZSBzdXJlIHRoZSBmb3JtZXIgbmFtZSBpcyBjbGVhcmVkICovCiAgIEN1cmxfc2FmZWZyZWUoZnRwYy0+bmV3aG9zdCk7CkBAIC0xODk4LDkgKzE4NDksOSBAQAogCiAgICAgICAgIC8qIFRoZSBmb3VyIHNlcGFyYXRvcnMgc2hvdWxkIGJlIGlkZW50aWNhbCwgb3IgZWxzZSB0aGlzIGlzIGFuIG9kZGx5CiAgICAgICAgICAgIGZvcm1hdHRlZCByZXBseSBhbmQgd2UgYmFpbCBvdXQgaW1tZWRpYXRlbHkuICovCi0gICAgICAgIGZvcihpPTE7IGk8NDsgaSsrKSB7CisgICAgICAgIGZvcihpID0gMTsgaTw0OyBpKyspIHsKICAgICAgICAgICBpZihzZXBhcmF0b3JbaV0gIT0gc2VwMSkgewotICAgICAgICAgICAgcHRyPU5VTEw7IC8qIHNldCB0byBOVUxMIHRvIHNpZ25hbCBlcnJvciAqLworICAgICAgICAgICAgcHRyID0gTlVMTDsgLyogc2V0IHRvIE5VTEwgdG8gc2lnbmFsIGVycm9yICovCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE5MTYsNyArMTg2Nyw3IEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIGVsc2UKLSAgICAgICAgcHRyPU5VTEw7CisgICAgICAgIHB0ciA9IE5VTEw7CiAgICAgfQogICAgIGlmKCFwdHIpIHsKICAgICAgIGZhaWxmKGRhdGEsICJXZWlyZGx5IGZvcm1hdHRlZCBFUFNWIHJlcGx5Iik7CkBAIC0yMDkwLDcgKzIwNDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZ0cGNvZGUpCiB7CiAgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOwotICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhPWNvbm4tPmRhdGE7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBzdHJ1Y3QgRlRQICpmdHAgPSBkYXRhLT5yZXEucHJvdG9wOwogICBzdHJ1Y3QgZnRwX2Nvbm4gKmZ0cGMgPSAmY29ubi0+cHJvdG8uZnRwYzsKIApAQCAtMjEwNCw3ICsyMDU1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICZ5ZWFyLCAmbW9udGgsICZkYXksICZob3VyLCAmbWludXRlLCAmc2Vjb25kKSkgewogICAgICAgICAvKiB3ZSBoYXZlIGEgdGltZSwgcmVmb3JtYXQgaXQgKi8KICAgICAgICAgY2hhciB0aW1lYnVmWzI0XTsKLSAgICAgICAgdGltZV90IHNlY3M9dGltZShOVUxMKTsKKyAgICAgICAgdGltZV90IHNlY3MgPSB0aW1lKE5VTEwpOwogCiAgICAgICAgIHNucHJpbnRmKHRpbWVidWYsIHNpemVvZih0aW1lYnVmKSwKICAgICAgICAgICAgICAgICAgIiUwNGQlMDJkJTAyZCAlMDJkOiUwMmQ6JTAyZCBHTVQiLApAQCAtMjEyMCw3ICsyMDcxLDcgQEAKICAgICAgIGlmKGRhdGEtPnNldC5vcHRfbm9fYm9keSAmJgogICAgICAgICAgZnRwYy0+ZmlsZSAmJgogICAgICAgICAgZGF0YS0+c2V0LmdldF9maWxldGltZSAmJgotICAgICAgICAgKGRhdGEtPmluZm8uZmlsZXRpbWU+PTApICkgeworICAgICAgICAgKGRhdGEtPmluZm8uZmlsZXRpbWUgPj0gMCkgKSB7CiAgICAgICAgIGNoYXIgaGVhZGVyYnVmWzEyOF07CiAgICAgICAgIHRpbWVfdCBmaWxldGltZSA9ICh0aW1lX3QpZGF0YS0+aW5mby5maWxldGltZTsKICAgICAgICAgc3RydWN0IHRtIGJ1ZmZlcjsKQEAgLTIxOTYsNyArMjE0Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHBzdGF0ZSBpbnN0YXRlKQogewogICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKLSAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YT1jb25uLT5kYXRhOworICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKIAogICBpZihmdHBjb2RlLzEwMCAhPSAyKSB7CiAgICAgLyogInNhc3NlcmZ0cGQiIGFuZCAiKHUpcih4KWJvdCBmdHBkIiBib3RoIHJlc3BvbmRzIHdpdGggMjI2IGFmdGVyIGEKQEAgLTIyMjUsNyArMjE3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfb2ZmX3QgZmlsZXNpemUpCiB7CiAgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOwotICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhPWNvbm4tPmRhdGE7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBzdHJ1Y3QgRlRQICpmdHAgPSBkYXRhLT5yZXEucHJvdG9wOwogICBzdHJ1Y3QgZnRwX2Nvbm4gKmZ0cGMgPSAmY29ubi0+cHJvdG8uZnRwYzsKIApAQCAtMjMwOCwxMiArMjI1OSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwc3RhdGUgaW5zdGF0ZSkKIHsKICAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7Ci0gIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGE9Y29ubi0+ZGF0YTsKLSAgY3VybF9vZmZfdCBmaWxlc2l6ZTsKKyAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CisgIGN1cmxfb2ZmX3QgZmlsZXNpemUgPSAtMTsKICAgY2hhciAqYnVmID0gZGF0YS0+c3RhdGUuYnVmZmVyOwogCiAgIC8qIGdldCB0aGUgc2l6ZSBmcm9tIHRoZSBhc2NpaSBzdHJpbmc6ICovCi0gIGZpbGVzaXplID0gKGZ0cGNvZGUgPT0gMjEzKT9jdXJseF9zdHJ0b29mZnQoYnVmKzQsIE5VTEwsIDApOi0xOworICBpZihmdHBjb2RlID09IDIxMykKKyAgICAvKiBpZ25vcmVzIHBhcnNpbmcgZXJyb3JzLCB3aGljaCB3aWxsIG1ha2UgdGhlIHNpemUgcmVtYWluIHVua25vd24gKi8KKyAgICAodm9pZCljdXJseF9zdHJ0b29mZnQoYnVmICsgNCwgTlVMTCwgMCwgJmZpbGVzaXplKTsKIAogICBpZihpbnN0YXRlID09IEZUUF9TSVpFKSB7CiAjaWZkZWYgQ1VSTF9GVFBfSFRUUFNUWUxFX0hFQUQKQEAgLTIzODMsNyArMjMzNiw3IEBACiAgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKIAotICBpZihmdHBjb2RlPj00MDApIHsKKyAgaWYoZnRwY29kZSA+PSA0MDApIHsKICAgICBmYWlsZihkYXRhLCAiRmFpbGVkIEZUUCB1cGxvYWQ6ICUwZCIsIGZ0cGNvZGUpOwogICAgIHN0YXRlKGNvbm4sIEZUUF9TVE9QKTsKICAgICAvKiBvb3BzLCB3ZSBuZXZlciBjbG9zZSB0aGUgc29ja2V0cyEgKi8KQEAgLTI0NDEsNyArMjM5NCw3IEBACiAgICAgICBFOgogICAgICAgMTI1IERhdGEgY29ubmVjdGlvbiBhbHJlYWR5IG9wZW47IFRyYW5zZmVyIHN0YXJ0aW5nLiAqLwogCi0gICAgY3VybF9vZmZfdCBzaXplPS0xOyAvKiBkZWZhdWx0IHVua25vd24gc2l6ZSAqLworICAgIGN1cmxfb2ZmX3Qgc2l6ZSA9IC0xOyAvKiBkZWZhdWx0IHVua25vd24gc2l6ZSAqLwogCiAKICAgICAvKgpAQCAtMjQ2NSw5ICsyNDE4LDkgQEAKICAgICAgICAqIEV4YW1wbGUgRCBhYm92ZSBtYWtlcyB0aGlzIHBhcnNpbmcgYSBsaXR0bGUgdHJpY2t5ICovCiAgICAgICBjaGFyICpieXRlczsKICAgICAgIGNoYXIgKmJ1ZiA9IGRhdGEtPnN0YXRlLmJ1ZmZlcjsKLSAgICAgIGJ5dGVzPXN0cnN0cihidWYsICIgYnl0ZXMiKTsKKyAgICAgIGJ5dGVzID0gc3Ryc3RyKGJ1ZiwgIiBieXRlcyIpOwogICAgICAgaWYoYnl0ZXMtLSkgewotICAgICAgICBsb25nIGluPShsb25nKShieXRlcy1idWYpOworICAgICAgICBsb25nIGluID0gKGxvbmcpKGJ5dGVzLWJ1Zik7CiAgICAgICAgIC8qIHRoaXMgaXMgYSBoaW50IHRoZXJlIGlzIHNpemUgaW5mb3JtYXRpb24gaW4gdGhlcmUhIDstKSAqLwogICAgICAgICB3aGlsZSgtLWluKSB7CiAgICAgICAgICAgLyogc2NhbiBmb3IgdGhlIGxlZnQgcGFyZW50aGVzaXMgYW5kIGJyZWFrIHRoZXJlICovCkBAIC0yNDc1LDcgKzI0MjgsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgLyogc2tpcCBvbmx5IGRpZ2l0cyAqLwogICAgICAgICAgIGlmKCFJU0RJR0lUKCpieXRlcykpIHsKLSAgICAgICAgICAgIGJ5dGVzPU5VTEw7CisgICAgICAgICAgICBieXRlcyA9IE5VTEw7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAgICAgICAgICAgLyogb25lIG1vcmUgZXN0ZXAgYmFja3dhcmRzICovCkBAIC0yNDg0LDcgKzI0MzcsNyBAQAogICAgICAgICAvKiBpZiB3ZSBoYXZlIG5vdGhpbmcgYnV0IGRpZ2l0czogKi8KICAgICAgICAgaWYoYnl0ZXMrKykgewogICAgICAgICAgIC8qIGdldCB0aGUgbnVtYmVyISAqLwotICAgICAgICAgIHNpemUgPSBjdXJseF9zdHJ0b29mZnQoYnl0ZXMsIE5VTEwsIDApOworICAgICAgICAgICh2b2lkKWN1cmx4X3N0cnRvb2ZmdChieXRlcywgTlVMTCwgMCwgJnNpemUpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtMjY0Nyw3ICsyNjAwLDcgQEAKIHsKICAgQ1VSTGNvZGUgcmVzdWx0OwogICBjdXJsX3NvY2tldF90IHNvY2sgPSBjb25uLT5zb2NrW0ZJUlNUU09DS0VUXTsKLSAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YT1jb25uLT5kYXRhOworICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKICAgaW50IGZ0cGNvZGU7CiAgIHN0cnVjdCBmdHBfY29ubiAqZnRwYyA9ICZjb25uLT5wcm90by5mdHBjOwogICBzdHJ1Y3QgcGluZ3BvbmcgKnBwID0gJmZ0cGMtPnBwOwpAQCAtMjY5OSw3ICsyNjUyLDcgQEAKICAgICAgICAgLyogV2UgZG9uJ3QgaGF2ZSBhIFNTTC9UTFMgY29ubmVjdGlvbiB5ZXQsIGJ1dCBGVFBTIGlzCiAgICAgICAgICAgIHJlcXVlc3RlZC4gVHJ5IGEgRlRQUyBjb25uZWN0aW9uIG5vdyAqLwogCi0gICAgICAgIGZ0cGMtPmNvdW50Mz0wOworICAgICAgICBmdHBjLT5jb3VudDMgPSAwOwogICAgICAgICBzd2l0Y2goZGF0YS0+c2V0LmZ0cHNzbGF1dGgpIHsKICAgICAgICAgY2FzZSBDVVJMRlRQQVVUSF9ERUZBVUxUOgogICAgICAgICBjYXNlIENVUkxGVFBBVVRIX1NTTDoKQEAgLTI4MjIsMTAgKzI3NzUsMTEgQEAKIAogICAgIGNhc2UgRlRQX1BXRDoKICAgICAgIGlmKGZ0cGNvZGUgPT0gMjU3KSB7Ci0gICAgICAgIGNoYXIgKnB0cj0mZGF0YS0+c3RhdGUuYnVmZmVyWzRdOyAgLyogc3RhcnQgb24gdGhlIGZpcnN0IGxldHRlciAqLworICAgICAgICBjaGFyICpwdHIgPSAmZGF0YS0+c3RhdGUuYnVmZmVyWzRdOyAgLyogc3RhcnQgb24gdGhlIGZpcnN0IGxldHRlciAqLwogICAgICAgICBjb25zdCBzaXplX3QgYnVmX3NpemUgPSBkYXRhLT5zZXQuYnVmZmVyX3NpemU7CiAgICAgICAgIGNoYXIgKmRpcjsKICAgICAgICAgY2hhciAqc3RvcmU7CisgICAgICAgIGJvb2wgZW50cnlfZXh0cmFjdGVkID0gRkFMU0U7CiAKICAgICAgICAgZGlyID0gbWFsbG9jKG5yZWFkICsgMSk7CiAgICAgICAgIGlmKCFkaXIpCkBAIC0yODU3LDcgKzI4MTEsNyBAQAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBwYXRoICovCi0gICAgICAgICAgICAgICAgKnN0b3JlID0gJ1wwJzsgLyogemVybyB0ZXJtaW5hdGUgKi8KKyAgICAgICAgICAgICAgICBlbnRyeV9leHRyYWN0ZWQgPSBUUlVFOwogICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBnZXQgb3V0IG9mIHRoaXMgbG9vcCAqLwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yODY2LDcgKzI4MjAsOSBAQAogICAgICAgICAgICAgc3RvcmUrKzsKICAgICAgICAgICAgIHB0cisrOwogICAgICAgICAgIH0KLQorICAgICAgICAgICpzdG9yZSA9ICdcMCc7IC8qIHplcm8gdGVybWluYXRlICovCisgICAgICAgIH0KKyAgICAgICAgaWYoZW50cnlfZXh0cmFjdGVkKSB7CiAgICAgICAgICAgLyogSWYgdGhlIHBhdGggbmFtZSBkb2VzIG5vdCBsb29rIGxpa2UgYW4gYWJzb2x1dGUgcGF0aCAoaS5lLjogaXQKICAgICAgICAgICAgICBkb2VzIG5vdCBzdGFydCB3aXRoIGEgJy8nKSwgd2UgcHJvYmFibHkgbmVlZCBzb21lIHNlcnZlci1kZXBlbmRlbnQKICAgICAgICAgICAgICBhZGp1c3RtZW50cy4gRm9yIGV4YW1wbGUsIHRoaXMgaXMgdGhlIGNhc2Ugd2hlbiBjb25uZWN0aW5nIHRvCkBAIC0yOTEzLDcgKzI4NjksNyBAQAogCiAgICAgY2FzZSBGVFBfU1lTVDoKICAgICAgIGlmKGZ0cGNvZGUgPT0gMjE1KSB7Ci0gICAgICAgIGNoYXIgKnB0cj0mZGF0YS0+c3RhdGUuYnVmZmVyWzRdOyAgLyogc3RhcnQgb24gdGhlIGZpcnN0IGxldHRlciAqLworICAgICAgICBjaGFyICpwdHIgPSAmZGF0YS0+c3RhdGUuYnVmZmVyWzRdOyAgLyogc3RhcnQgb24gdGhlIGZpcnN0IGxldHRlciAqLwogICAgICAgICBjaGFyICpvczsKICAgICAgICAgY2hhciAqc3RvcmU7CiAKQEAgLTI5ODgsMTAgKzI5NDQsMTAgQEAKICAgICAgIGlmKGZ0cGNvZGUvMTAwICE9IDIpIHsKICAgICAgICAgLyogZmFpbHVyZSB0byBDV0QgdGhlcmUgKi8KICAgICAgICAgaWYoY29ubi0+ZGF0YS0+c2V0LmZ0cF9jcmVhdGVfbWlzc2luZ19kaXJzICYmCi0gICAgICAgICAgIGZ0cGMtPmNvdW50MSAmJiAhZnRwYy0+Y291bnQyKSB7CisgICAgICAgICAgIGZ0cGMtPmN3ZGNvdW50ICYmICFmdHBjLT5jb3VudDIpIHsKICAgICAgICAgICAvKiB0cnkgbWFraW5nIGl0ICovCiAgICAgICAgICAgZnRwYy0+Y291bnQyKys7IC8qIGNvdW50ZXIgdG8gcHJldmVudCBDV0QtTUtEIGxvb3BzICovCi0gICAgICAgICAgUFBTRU5ERigmZnRwYy0+cHAsICJNS0QgJXMiLCBmdHBjLT5kaXJzW2Z0cGMtPmNvdW50MSAtIDFdKTsKKyAgICAgICAgICBQUFNFTkRGKCZmdHBjLT5wcCwgIk1LRCAlcyIsIGZ0cGMtPmRpcnNbZnRwYy0+Y3dkY291bnQgLSAxXSk7CiAgICAgICAgICAgc3RhdGUoY29ubiwgRlRQX01LRCk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CkBAIC0zMDA0LDEwICsyOTYwLDEwIEBACiAgICAgICB9CiAgICAgICBlbHNlIHsKICAgICAgICAgLyogc3VjY2VzcyAqLwotICAgICAgICBmdHBjLT5jb3VudDI9MDsKLSAgICAgICAgaWYoKytmdHBjLT5jb3VudDEgPD0gZnRwYy0+ZGlyZGVwdGgpIHsKKyAgICAgICAgZnRwYy0+Y291bnQyID0gMDsKKyAgICAgICAgaWYoKytmdHBjLT5jd2Rjb3VudCA8PSBmdHBjLT5kaXJkZXB0aCkgewogICAgICAgICAgIC8qIHNlbmQgbmV4dCBDV0QgKi8KLSAgICAgICAgICBQUFNFTkRGKCZmdHBjLT5wcCwgIkNXRCAlcyIsIGZ0cGMtPmRpcnNbZnRwYy0+Y291bnQxIC0gMV0pOworICAgICAgICAgIFBQU0VOREYoJmZ0cGMtPnBwLCAiQ1dEICVzIiwgZnRwYy0+ZGlyc1tmdHBjLT5jd2Rjb3VudCAtIDFdKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICByZXN1bHQgPSBmdHBfc3RhdGVfbWR0bShjb25uKTsKQEAgLTMwMjUsNyArMjk4MSw3IEBACiAgICAgICB9CiAgICAgICBzdGF0ZShjb25uLCBGVFBfQ1dEKTsKICAgICAgIC8qIHNlbmQgQ1dEICovCi0gICAgICBQUFNFTkRGKCZmdHBjLT5wcCwgIkNXRCAlcyIsIGZ0cGMtPmRpcnNbZnRwYy0+Y291bnQxIC0gMV0pOworICAgICAgUFBTRU5ERigmZnRwYy0+cHAsICJDV0QgJXMiLCBmdHBjLT5kaXJzW2Z0cGMtPmN3ZGNvdW50IC0gMV0pOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEZUUF9NRFRNOgpAQCAtMzI0NCwxNSArMzIwMCwxNiBAQAogICAgIHNpemVfdCBmbGVuID0gZnRwYy0+ZmlsZT9zdHJsZW4oZnRwYy0+ZmlsZSk6MDsgLyogZmlsZSBpcyAicmF3IiBhbHJlYWR5ICovCiAgICAgc2l6ZV90IGRsZW4gPSBzdHJsZW4ocGF0aCktZmxlbjsKICAgICBpZighZnRwYy0+Y3dkZmFpbCkgeworICAgICAgZnRwYy0+cHJldm1ldGhvZCA9IGRhdGEtPnNldC5mdHBfZmlsZW1ldGhvZDsKICAgICAgIGlmKGRsZW4gJiYgKGRhdGEtPnNldC5mdHBfZmlsZW1ldGhvZCAhPSBGVFBGSUxFX05PQ1dEKSkgewogICAgICAgICBmdHBjLT5wcmV2cGF0aCA9IHBhdGg7CiAgICAgICAgIGlmKGZsZW4pCiAgICAgICAgICAgLyogaWYgJ3BhdGgnIGlzIG5vdCB0aGUgd2hvbGUgc3RyaW5nICovCi0gICAgICAgICAgZnRwYy0+cHJldnBhdGhbZGxlbl09MDsgLyogdGVybWluYXRlICovCisgICAgICAgICAgZnRwYy0+cHJldnBhdGhbZGxlbl0gPSAwOyAvKiB0ZXJtaW5hdGUgKi8KICAgICAgIH0KICAgICAgIGVsc2UgewogICAgICAgICAvKiB3ZSBuZXZlciBjaGFuZ2VkIGRpciAqLwotICAgICAgICBmdHBjLT5wcmV2cGF0aD1zdHJkdXAoIiIpOworICAgICAgICBmdHBjLT5wcmV2cGF0aCA9IHN0cmR1cCgiIik7CiAgICAgICAgIGZyZWUocGF0aCk7CiAgICAgICB9CiAgICAgICBpZihmdHBjLT5wcmV2cGF0aCkKQEAgLTM1MTUsMzUgKzM0NzIsMzYgQEAKIHsKICAgY3VybF9vZmZfdCBmcm9tLCB0bzsKICAgY2hhciAqcHRyOwotICBjaGFyICpwdHIyOwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKICAgc3RydWN0IGZ0cF9jb25uICpmdHBjID0gJmNvbm4tPnByb3RvLmZ0cGM7CiAKICAgaWYoZGF0YS0+c3RhdGUudXNlX3JhbmdlICYmIGRhdGEtPnN0YXRlLnJhbmdlKSB7Ci0gICAgZnJvbT1jdXJseF9zdHJ0b29mZnQoZGF0YS0+c3RhdGUucmFuZ2UsICZwdHIsIDApOwotICAgIHdoaWxlKCpwdHIgJiYgKElTU1BBQ0UoKnB0cikgfHwgKCpwdHI9PSctJykpKQorICAgIENVUkxvZmZ0IGZyb21fdDsKKyAgICBDVVJMb2ZmdCB0b190OworICAgIGZyb21fdCA9IGN1cmx4X3N0cnRvb2ZmdChkYXRhLT5zdGF0ZS5yYW5nZSwgJnB0ciwgMCwgJmZyb20pOworICAgIGlmKGZyb21fdCA9PSBDVVJMX09GRlRfRkxPVykKKyAgICAgIHJldHVybiBDVVJMRV9SQU5HRV9FUlJPUjsKKyAgICB3aGlsZSgqcHRyICYmIChJU1NQQUNFKCpwdHIpIHx8ICgqcHRyID09ICctJykpKQogICAgICAgcHRyKys7Ci0gICAgdG89Y3VybHhfc3RydG9vZmZ0KHB0ciwgJnB0cjIsIDApOwotICAgIGlmKHB0ciA9PSBwdHIyKSB7Ci0gICAgICAvKiB3ZSBkaWRuJ3QgZ2V0IGFueSBkaWdpdCAqLwotICAgICAgdG89LTE7Ci0gICAgfQotICAgIGlmKCgtMSA9PSB0bykgJiYgKGZyb20+PTApKSB7CisgICAgdG9fdCA9IGN1cmx4X3N0cnRvb2ZmdChwdHIsIE5VTEwsIDAsICZ0byk7CisgICAgaWYodG9fdCA9PSBDVVJMX09GRlRfRkxPVykKKyAgICAgIHJldHVybiBDVVJMRV9SQU5HRV9FUlJPUjsKKyAgICBpZigodG9fdCA9PSBDVVJMX09GRlRfSU5WQUwpICYmICFmcm9tX3QpIHsKICAgICAgIC8qIFggLSAqLwogICAgICAgZGF0YS0+c3RhdGUucmVzdW1lX2Zyb20gPSBmcm9tOwogICAgICAgREVCVUdGKGluZm9mKGNvbm4tPmRhdGEsICJGVFAgUkFOR0UgJSIgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVAogICAgICAgICAgICAgICAgICAgICIgdG8gZW5kIG9mIGZpbGVcbiIsIGZyb20pKTsKICAgICB9Ci0gICAgZWxzZSBpZihmcm9tIDwgMCkgeworICAgIGVsc2UgaWYoIXRvX3QgJiYgKGZyb21fdCA9PSBDVVJMX09GRlRfSU5WQUwpKSB7CiAgICAgICAvKiAtWSAqLwotICAgICAgZGF0YS0+cmVxLm1heGRvd25sb2FkID0gLWZyb207Ci0gICAgICBkYXRhLT5zdGF0ZS5yZXN1bWVfZnJvbSA9IGZyb207CisgICAgICBkYXRhLT5yZXEubWF4ZG93bmxvYWQgPSB0bzsKKyAgICAgIGRhdGEtPnN0YXRlLnJlc3VtZV9mcm9tID0gLXRvOwogICAgICAgREVCVUdGKGluZm9mKGNvbm4tPmRhdGEsICJGVFAgUkFOR0UgdGhlIGxhc3QgJSIgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVAotICAgICAgICAgICAgICAgICAgICIgYnl0ZXNcbiIsIC1mcm9tKSk7CisgICAgICAgICAgICAgICAgICAgIiBieXRlc1xuIiwgdG8pKTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAvKiBYLVkgKi8KLSAgICAgIGRhdGEtPnJlcS5tYXhkb3dubG9hZCA9ICh0by1mcm9tKSsxOyAvKiBpbmNsdWRlIGxhc3QgYnl0ZSAqLworICAgICAgZGF0YS0+cmVxLm1heGRvd25sb2FkID0gKHRvIC0gZnJvbSkgKyAxOyAvKiBpbmNsdWRlIGxhc3QgYnl0ZSAqLwogICAgICAgZGF0YS0+c3RhdGUucmVzdW1lX2Zyb20gPSBmcm9tOwogICAgICAgREVCVUdGKGluZm9mKGNvbm4tPmRhdGEsICJGVFAgUkFOR0UgZnJvbSAlIiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UCiAgICAgICAgICAgICAgICAgICAgIiBnZXR0aW5nICUiIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgIiBieXRlc1xuIiwKQEAgLTM1NzQsNyArMzUzMiw3IEBACiAKIHN0YXRpYyBDVVJMY29kZSBmdHBfZG9fbW9yZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCAqY29tcGxldGVwKQogewotICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhPWNvbm4tPmRhdGE7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBzdHJ1Y3QgZnRwX2Nvbm4gKmZ0cGMgPSAmY29ubi0+cHJvdG8uZnRwYzsKICAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7CiAgIGJvb2wgY29ubmVjdGVkID0gRkFMU0U7CkBAIC0zNTg1LDcgKzM1NDMsNyBAQAogCiAgIC8qIGlmIHRoZSBzZWNvbmQgY29ubmVjdGlvbiBpc24ndCBkb25lIHlldCwgd2FpdCBmb3IgaXQgKi8KICAgaWYoIWNvbm4tPmJpdHMudGNwY29ubmVjdFtTRUNPTkRBUllTT0NLRVRdKSB7Ci0gICAgaWYoY29ubi0+dHVubmVsX3N0YXRlW1NFQ09OREFSWVNPQ0tFVF0gPT0gVFVOTkVMX0NPTk5FQ1QpIHsKKyAgICBpZihDdXJsX2Nvbm5lY3Rfb25nb2luZyhjb25uKSkgewogICAgICAgLyogQXMgd2UncmUgaW4gVFVOTkVMX0NPTk5FQ1Qgc3RhdGUgbm93LCB3ZSBrbm93IHRoZSBwcm94eSBuYW1lIGFuZCBwb3J0CiAgICAgICAgICBhcmVuJ3QgdXNlZCBzbyB3ZSBibGFuayB0aGVpciBhcmd1bWVudHMuIFRPRE86IG1ha2UgdGhpcyBuaWNlciAqLwogICAgICAgcmVzdWx0ID0gQ3VybF9wcm94eUNPTk5FQ1QoY29ubiwgU0VDT05EQVJZU09DS0VULCBOVUxMLCAwKTsKQEAgLTM2MTcsNyArMzU3NSw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIAogICBpZihjb25uLT5iaXRzLnR1bm5lbF9wcm94eSAmJiBjb25uLT5iaXRzLmh0dHBwcm94eSAmJgotICAgICBjb25uLT50dW5uZWxfc3RhdGVbU0VDT05EQVJZU09DS0VUXSAhPSBUVU5ORUxfQ09NUExFVEUpCisgICAgIEN1cmxfY29ubmVjdF9vbmdvaW5nKGNvbm4pKQogICAgIHJldHVybiByZXN1bHQ7CiAKIApAQCAtMzc0MSw3ICszNjk5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmRvcGhhc2VfZG9uZSkKIHsKICAgLyogdGhpcyBpcyBGVFAgYW5kIG5vIHByb3h5ICovCi0gIENVUkxjb2RlIHJlc3VsdD1DVVJMRV9PSzsKKyAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7CiAKICAgREVCVUdGKGluZm9mKGNvbm4tPmRhdGEsICJETyBwaGFzZSBzdGFydHNcbiIpKTsKIApAQCAtNDAzNSw3ICszOTkzLDcgQEAKICNkZWZpbmUgU0JVRl9TSVpFIDEwMjQKICAgY2hhciBzW1NCVUZfU0laRV07CiAgIHNpemVfdCB3cml0ZV9sZW47Ci0gIGNoYXIgKnNwdHI9czsKKyAgY2hhciAqc3B0ciA9IHM7CiAgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOwogI2lmZGVmIEhBVkVfR1NTQVBJCiAgIGVudW0gcHJvdGVjdGlvbl9sZXZlbCBkYXRhX3NlYyA9IGNvbm4tPmRhdGFfcHJvdDsKQEAgLTQwNDYsOSArNDAwNCw4IEBACiAgICAgcmV0dXJuIENVUkxFX0JBRF9GVU5DVElPTl9BUkdVTUVOVDsKIAogICBzdHJjcHkoJnNbd3JpdGVfbGVuXSwgIlxyXG4iKTsgLyogYXBwZW5kIGEgdHJhaWxpbmcgQ1JMRiAqLwotICB3cml0ZV9sZW4gKz0yOwotCi0gIGJ5dGVzX3dyaXR0ZW49MDsKKyAgd3JpdGVfbGVuICs9IDI7CisgIGJ5dGVzX3dyaXR0ZW4gPSAwOwogCiAgIHJlc3VsdCA9IEN1cmxfY29udmVydF90b19uZXR3b3JrKGNvbm4tPmRhdGEsIHMsIHdyaXRlX2xlbik7CiAgIC8qIEN1cmxfY29udmVydF90b19uZXR3b3JrIGNhbGxzIGZhaWxmIGlmIHVuc3VjY2Vzc2Z1bCAqLwpAQCAtNDEyNiw3ICs0MDgzLDcgQEAKICAqLwogc3RhdGljIENVUkxjb2RlIGZ0cF9kaXNjb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgYm9vbCBkZWFkX2Nvbm5lY3Rpb24pCiB7Ci0gIHN0cnVjdCBmdHBfY29ubiAqZnRwYz0gJmNvbm4tPnByb3RvLmZ0cGM7CisgIHN0cnVjdCBmdHBfY29ubiAqZnRwYyA9ICZjb25uLT5wcm90by5mdHBjOwogICBzdHJ1Y3QgcGluZ3BvbmcgKnBwID0gJmZ0cGMtPnBwOwogCiAgIC8qIFdlIGNhbm5vdCBzZW5kIHF1aXQgdW5jb25kaXRpb25hbGx5LiBJZiB0aGlzIGNvbm5lY3Rpb24gaXMgc3RhbGUgb3IKQEAgLTQyMjIsNyArNDE3OSw3IEBACiAgICAgICBmdHBjLT5kaXJkZXB0aCA9IDA7CiAgICAgICBicmVhazsKICAgICB9Ci0gICAgc2xhc2hfcG9zPXN0cnJjaHIoY3VyX3BvcywgJy8nKTsKKyAgICBzbGFzaF9wb3MgPSBzdHJyY2hyKGN1cl9wb3MsICcvJyk7CiAgICAgaWYoc2xhc2hfcG9zIHx8ICEqY3VyX3BvcykgewogICAgICAgc2l6ZV90IGRpcmxlbiA9IHNsYXNoX3Bvcy1jdXJfcG9zOwogICAgICAgQ1VSTGNvZGUgcmVzdWx0OwpAQCAtNDI0Myw3ICs0MjAwLDcgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgIH0KICAgICAgIGZ0cGMtPmRpcmRlcHRoID0gMTsgLyogd2UgY29uc2lkZXIgaXQgdG8gYmUgYSBzaW5nbGUgZGlyICovCi0gICAgICBmaWxlbmFtZSA9IHNsYXNoX3BvcyA/IHNsYXNoX3BvcysxIDogY3VyX3BvczsgLyogcmVzdCBpcyBmaWxlIG5hbWUgKi8KKyAgICAgIGZpbGVuYW1lID0gc2xhc2hfcG9zID8gc2xhc2hfcG9zICsgMSA6IGN1cl9wb3M7IC8qIHJlc3QgaXMgZmlsZSBuYW1lICovCiAgICAgfQogICAgIGVsc2UKICAgICAgIGZpbGVuYW1lID0gY3VyX3BvczsgIC8qIHRoaXMgaXMgYSBmaWxlIG5hbWUgb25seSAqLwpAQCAtNDMyNyw4ICs0Mjg0LDggQEAKICAgICB9CiAgIH0KICAgZWxzZQotICAgIGZ0cGMtPmZpbGU9TlVMTDsgLyogaW5zdGVhZCBvZiBwb2ludCB0byBhIHplcm8gYnl0ZSwgd2UgbWFrZSBpdCBhIE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciAqLworICAgIGZ0cGMtPmZpbGUgPSBOVUxMOyAvKiBpbnN0ZWFkIG9mIHBvaW50IHRvIGEgemVybyBieXRlLCB3ZSBtYWtlIGl0IGEgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyICovCiAKICAgaWYoZGF0YS0+c2V0LnVwbG9hZCAmJiAhZnRwYy0+ZmlsZSAmJiAoZnRwLT50cmFuc2ZlciA9PSBGVFBUUkFOU0ZFUl9CT0RZKSkgewogICAgIC8qIFdlIG5lZWQgYSBmaWxlIG5hbWUgd2hlbiB1cGxvYWRpbmcuIFJldHVybiBlcnJvciEgKi8KQEAgLTQzNTIsNyArNDMwOSw4IEBACiAKICAgICBkbGVuIC09IGZ0cGMtPmZpbGU/c3RybGVuKGZ0cGMtPmZpbGUpOjA7CiAgICAgaWYoKGRsZW4gPT0gc3RybGVuKGZ0cGMtPnByZXZwYXRoKSkgJiYKLSAgICAgICAhc3RybmNtcChwYXRoLCBmdHBjLT5wcmV2cGF0aCwgZGxlbikpIHsKKyAgICAgICAhc3RybmNtcChwYXRoLCBmdHBjLT5wcmV2cGF0aCwgZGxlbikgJiYKKyAgICAgICAoZnRwYy0+cHJldm1ldGhvZCA9PSBkYXRhLT5zZXQuZnRwX2ZpbGVtZXRob2QpKSB7CiAgICAgICBpbmZvZihkYXRhLCAiUmVxdWVzdCBoYXMgc2FtZSBwYXRoIGFzIHByZXZpb3VzIHRyYW5zZmVyXG4iKTsKICAgICAgIGZ0cGMtPmN3ZGRvbmUgPSBUUlVFOwogICAgIH0KQEAgLTQ0MjMsOCArNDM4MSw4IEBACiBDVVJMY29kZSBmdHBfcmVndWxhcl90cmFuc2ZlcihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpkb3BoYXNlX2RvbmUpCiB7Ci0gIENVUkxjb2RlIHJlc3VsdD1DVVJMRV9PSzsKLSAgYm9vbCBjb25uZWN0ZWQ9RkFMU0U7CisgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOworICBib29sIGNvbm5lY3RlZCA9IEZBTFNFOwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKICAgc3RydWN0IGZ0cF9jb25uICpmdHBjID0gJmNvbm4tPnByb3RvLmZ0cGM7CiAgIGRhdGEtPnJlcS5zaXplID0gLTE7IC8qIG1ha2Ugc3VyZSB0aGlzIGlzIHVua25vd24gYXQgdGhpcyBwb2ludCAqLwpAQCAtNDQ2NCwyOCArNDQyMiw2IEBACiAgIGNoYXIgY29tbWFuZDsKICAgc3RydWN0IEZUUCAqZnRwOwogCi0gIGlmKGNvbm4tPmJpdHMuaHR0cHByb3h5ICYmICFkYXRhLT5zZXQudHVubmVsX3RocnVfaHR0cHByb3h5KSB7Ci0gICAgLyogVW5sZXNzIHdlIGhhdmUgYXNrZWQgdG8gdHVubmVsIGZ0cCBvcGVyYXRpb25zIHRocm91Z2ggdGhlIHByb3h5LCB3ZQotICAgICAgIHN3aXRjaCBhbmQgdXNlIEhUVFAgb3BlcmF0aW9ucyBvbmx5ICovCi0jaWZuZGVmIENVUkxfRElTQUJMRV9IVFRQCi0gICAgaWYoY29ubi0+aGFuZGxlciA9PSAmQ3VybF9oYW5kbGVyX2Z0cCkKLSAgICAgIGNvbm4tPmhhbmRsZXIgPSAmQ3VybF9oYW5kbGVyX2Z0cF9wcm94eTsKLSAgICBlbHNlIHsKLSNpZmRlZiBVU0VfU1NMCi0gICAgICBjb25uLT5oYW5kbGVyID0gJkN1cmxfaGFuZGxlcl9mdHBzX3Byb3h5OwotI2Vsc2UKLSAgICAgIGZhaWxmKGRhdGEsICJGVFBTIG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgICByZXR1cm4gQ1VSTEVfVU5TVVBQT1JURURfUFJPVE9DT0w7Ci0jZW5kaWYKLSAgICB9Ci0gICAgLyogc2V0IGl0IHVwIGFzIGEgSFRUUCBjb25uZWN0aW9uIGluc3RlYWQgKi8KLSAgICByZXR1cm4gY29ubi0+aGFuZGxlci0+c2V0dXBfY29ubmVjdGlvbihjb25uKTsKLSNlbHNlCi0gICAgZmFpbGYoZGF0YSwgIkZUUCBvdmVyIGh0dHAgcHJveHkgcmVxdWlyZXMgSFRUUCBzdXBwb3J0IGJ1aWx0LWluISIpOwotICAgIHJldHVybiBDVVJMRV9VTlNVUFBPUlRFRF9QUk9UT0NPTDsKLSNlbmRpZgotICB9Ci0KICAgY29ubi0+ZGF0YS0+cmVxLnByb3RvcCA9IGZ0cCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IEZUUCkpOwogICBpZihOVUxMID09IGZ0cCkKICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2Z0cC5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvZnRwLmgKaW5kZXggM2JiZjI2Mi4uZTRhYTYzZiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvZnRwLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvZnRwLmgKQEAgLTcsNyArNyw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTEzMCwxMCArMTMwLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBGQUxTRSB3aGVuIGl0IGdldHMgdG8gQ3VybF9mdHBfcXVpdCgpICovCiAgIGJvb2wgY3dkZG9uZTsgICAgIC8qIGlmIGl0IGhhcyBiZWVuIGRldGVybWluZWQgdGhhdCB0aGUgcHJvcGVyIENXRCBjb21ibwogICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGhhcyBiZWVuIGRvbmUgKi8KKyAgaW50IGN3ZGNvdW50OyAgICAgLyogbnVtYmVyIG9mIENXRCBjb21tYW5kcyBpc3N1ZWQgKi8KICAgYm9vbCBjd2RmYWlsOyAgICAgLyogc2V0IFRSVUUgaWYgYSBDV0QgY29tbWFuZCBmYWlscywgYXMgdGhlbiB3ZSBtdXN0IHByZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGluZyB0aGUgY3VycmVudCBkaXJlY3RvcnkgKi8KICAgYm9vbCB3YWl0X2RhdGFfY29ubjsgLyogdGhpcyBpcyBzZXQgVFJVRSBpZiBkYXRhIGNvbm5lY3Rpb24gaXMgd2FpdGVkICovCiAgIGNoYXIgKnByZXZwYXRoOyAgIC8qIGNvbm4tPnBhdGggZnJvbSB0aGUgcHJldmlvdXMgdHJhbnNmZXIgKi8KKyAgY3VybF9mdHBmaWxlIHByZXZtZXRob2Q7IC8qIGZ0cCBtZXRob2QgaW4gcHJldmlvdXMgdHJhbnNmZXIgICovCiAgIGNoYXIgdHJhbnNmZXJ0eXBlOyAvKiBzZXQgYnkgZnRwX3RyYW5zZmVydHlwZSBmb3IgdXNlIGJ5IEN1cmxfY2xpZW50X3dyaXRlKClhCiAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgb3RoZXJzIChBL0kgb3IgemVybykgKi8KICAgaW50IGNvdW50MTsgLyogZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIgZm9yIHRoZSBzdGF0ZSBtYWNoaW5lICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9mdHBsaXN0cGFyc2VyLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9mdHBsaXN0cGFyc2VyLmMKaW5kZXggMmFjY2UzMS4uYjJhOGMwZiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvZnRwbGlzdHBhcnNlci5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2Z0cGxpc3RwYXJzZXIuYwpAQCAtNDIxLDcgKzQyMSw3IEBACiAgICAgICAgICAgZWxzZSBpZihjID09ICdcbicpIHsKICAgICAgICAgICAgIGZpbmZvLT5iX2RhdGFbcGFyc2VyLT5pdGVtX2xlbmd0aCAtIDFdID0gMDsKICAgICAgICAgICAgIGlmKHN0cm5jbXAoInRvdGFsICIsIGZpbmZvLT5iX2RhdGEsIDYpID09IDApIHsKLSAgICAgICAgICAgICAgY2hhciAqZW5kcHRyID0gZmluZm8tPmJfZGF0YSs2OworICAgICAgICAgICAgICBjaGFyICplbmRwdHIgPSBmaW5mby0+Yl9kYXRhICsgNjsKICAgICAgICAgICAgICAgLyogaGVyZSB3ZSBjYW4gZGVhbCB3aXRoIGRpcmVjdG9yeSBzaXplLCBwYXNzIHRoZSBsZWFkaW5nIHdoaXRlCiAgICAgICAgICAgICAgICAgIHNwYWNlcyBhbmQgdGhlbiB0aGUgZGlnaXRzICovCiAgICAgICAgICAgICAgIHdoaWxlKElTU1BBQ0UoKmVuZHB0cikpCkBAIC02MDksMTYgKzYwOSwxOCBAQAogICAgICAgICAgICAgY2hhciAqcDsKICAgICAgICAgICAgIGN1cmxfb2ZmX3QgZnNpemU7CiAgICAgICAgICAgICBmaW5mby0+Yl9kYXRhW3BhcnNlci0+aXRlbV9vZmZzZXQgKyBwYXJzZXItPml0ZW1fbGVuZ3RoIC0gMV0gPSAwOwotICAgICAgICAgICAgZnNpemUgPSBjdXJseF9zdHJ0b29mZnQoZmluZm8tPmJfZGF0YStwYXJzZXItPml0ZW1fb2Zmc2V0LCAmcCwgMTApOwotICAgICAgICAgICAgaWYocFswXSA9PSAnXDAnICYmIGZzaXplICE9IENVUkxfT0ZGX1RfTUFYICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNpemUgIT0gQ1VSTF9PRkZfVF9NSU4pIHsKLSAgICAgICAgICAgICAgcGFyc2VyLT5maWxlX2RhdGEtPmluZm8uZmxhZ3MgfD0gQ1VSTEZJTkZPRkxBR19LTk9XTl9TSVpFOwotICAgICAgICAgICAgICBwYXJzZXItPmZpbGVfZGF0YS0+aW5mby5zaXplID0gZnNpemU7CisgICAgICAgICAgICBpZighY3VybHhfc3RydG9vZmZ0KGZpbmZvLT5iX2RhdGEgKyBwYXJzZXItPml0ZW1fb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcCwgMTAsICZmc2l6ZSkpIHsKKyAgICAgICAgICAgICAgaWYocFswXSA9PSAnXDAnICYmIGZzaXplICE9IENVUkxfT0ZGX1RfTUFYICYmCisgICAgICAgICAgICAgICAgIGZzaXplICE9IENVUkxfT0ZGX1RfTUlOKSB7CisgICAgICAgICAgICAgICAgcGFyc2VyLT5maWxlX2RhdGEtPmluZm8uZmxhZ3MgfD0gQ1VSTEZJTkZPRkxBR19LTk9XTl9TSVpFOworICAgICAgICAgICAgICAgIHBhcnNlci0+ZmlsZV9kYXRhLT5pbmZvLnNpemUgPSBmc2l6ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBwYXJzZXItPml0ZW1fbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgcGFyc2VyLT5pdGVtX29mZnNldCA9IDA7CisgICAgICAgICAgICAgIHBhcnNlci0+c3RhdGUuVU5JWC5tYWluID0gUExfVU5JWF9USU1FOworICAgICAgICAgICAgICBwYXJzZXItPnN0YXRlLlVOSVguc3ViLnRpbWUgPSBQTF9VTklYX1RJTUVfUFJFUEFSVDE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJzZXItPml0ZW1fbGVuZ3RoID0gMDsKLSAgICAgICAgICAgIHBhcnNlci0+aXRlbV9vZmZzZXQgPSAwOwotICAgICAgICAgICAgcGFyc2VyLT5zdGF0ZS5VTklYLm1haW4gPSBQTF9VTklYX1RJTUU7Ci0gICAgICAgICAgICBwYXJzZXItPnN0YXRlLlVOSVguc3ViLnRpbWUgPSBQTF9VTklYX1RJTUVfUFJFUEFSVDE7CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UgaWYoIUlTRElHSVQoYykpIHsKICAgICAgICAgICAgIFBMX0VSUk9SKGNvbm4sIENVUkxFX0ZUUF9CQURfRklMRV9MSVNUKTsKQEAgLTkzNSwxOSArOTM3LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICBjaGFyICplbmRwdHI7Ci0gICAgICAgICAgICAgIGZpbmZvLT5zaXplID0gY3VybHhfc3RydG9vZmZ0KGZpbmZvLT5iX2RhdGEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXItPml0ZW1fb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5kcHRyLCAxMCk7Ci0gICAgICAgICAgICAgIGlmKCEqZW5kcHRyKSB7Ci0gICAgICAgICAgICAgICAgaWYoZmluZm8tPnNpemUgPT0gQ1VSTF9PRkZfVF9NQVggfHwKLSAgICAgICAgICAgICAgICAgICBmaW5mby0+c2l6ZSA9PSBDVVJMX09GRl9UX01JTikgewotICAgICAgICAgICAgICAgICAgaWYoZXJybm8gPT0gRVJBTkdFKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBMX0VSUk9SKGNvbm4sIENVUkxFX0ZUUF9CQURfRklMRV9MSVNUKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZsZW47Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBpZihjdXJseF9zdHJ0b29mZnQoZmluZm8tPmJfZGF0YSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXItPml0ZW1fb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuZHB0ciwgMTAsICZmaW5mby0+c2l6ZSkpIHsKICAgICAgICAgICAgICAgICBQTF9FUlJPUihjb25uLCBDVVJMRV9GVFBfQkFEX0ZJTEVfTElTVCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZsZW47CiAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2dldGluZm8uYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2dldGluZm8uYwppbmRleCBhMWNlNTA1Li44NjJjZWQwIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9nZXRpbmZvLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvZ2V0aW5mby5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC01NCw2ICs1NCw3IEBACiAgIHByby0+dF9zdGFydHRyYW5zZmVyID0gMDsKICAgcHJvLT50aW1lc3BlbnQgPSAwOwogICBwcm8tPnRfcmVkaXJlY3QgPSAwOworICBwcm8tPmlzX3Rfc3RhcnRyYW5zZmVyX3NldCA9IGZhbHNlOwogCiAgIGluZm8tPmh0dHBjb2RlID0gMDsKICAgaW5mby0+aHR0cHByb3h5Y29kZSA9IDA7CkBAIC0yNDYsMjcgKzI0Nyw2MCBAQAogICByZXR1cm4gQ1VSTEVfT0s7CiB9CiAKKyNkZWZpbmUgRE9VQkxFX1NFQ1MoeCkgKGRvdWJsZSkoeCkvMTAwMDAwMAorCitzdGF0aWMgQ1VSTGNvZGUgZ2V0aW5mb19vZmZ0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsIENVUkxJTkZPIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfb2ZmX3QgKnBhcmFtX29mZnQpCit7CisgIHN3aXRjaChpbmZvKSB7CisgIGNhc2UgQ1VSTElORk9fU0laRV9VUExPQURfVDoKKyAgICAqcGFyYW1fb2ZmdCA9IGRhdGEtPnByb2dyZXNzLnVwbG9hZGVkOworICAgIGJyZWFrOworICBjYXNlIENVUkxJTkZPX1NJWkVfRE9XTkxPQURfVDoKKyAgICAqcGFyYW1fb2ZmdCA9IGRhdGEtPnByb2dyZXNzLmRvd25sb2FkZWQ7CisgICAgYnJlYWs7CisgIGNhc2UgQ1VSTElORk9fU1BFRURfRE9XTkxPQURfVDoKKyAgICAqcGFyYW1fb2ZmdCA9ICBkYXRhLT5wcm9ncmVzcy5kbHNwZWVkOworICAgIGJyZWFrOworICBjYXNlIENVUkxJTkZPX1NQRUVEX1VQTE9BRF9UOgorICAgICpwYXJhbV9vZmZ0ID0gZGF0YS0+cHJvZ3Jlc3MudWxzcGVlZDsKKyAgICBicmVhazsKKyAgY2FzZSBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRF9UOgorICAgICpwYXJhbV9vZmZ0ID0gKGRhdGEtPnByb2dyZXNzLmZsYWdzICYgUEdSU19ETF9TSVpFX0tOT1dOKT8KKyAgICAgIGRhdGEtPnByb2dyZXNzLnNpemVfZGw6LTE7CisgICAgYnJlYWs7CisgIGNhc2UgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfVVBMT0FEX1Q6CisgICAgKnBhcmFtX29mZnQgPSAoZGF0YS0+cHJvZ3Jlc3MuZmxhZ3MgJiBQR1JTX1VMX1NJWkVfS05PV04pPworICAgICAgZGF0YS0+cHJvZ3Jlc3Muc2l6ZV91bDotMTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gQ1VSTEVfVU5LTk9XTl9PUFRJT047CisgIH0KKworICByZXR1cm4gQ1VSTEVfT0s7Cit9CisKIHN0YXRpYyBDVVJMY29kZSBnZXRpbmZvX2RvdWJsZShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCBDVVJMSU5GTyBpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqcGFyYW1fZG91YmxlcCkKIHsKICAgc3dpdGNoKGluZm8pIHsKICAgY2FzZSBDVVJMSU5GT19UT1RBTF9USU1FOgotICAgICpwYXJhbV9kb3VibGVwID0gZGF0YS0+cHJvZ3Jlc3MudGltZXNwZW50OworICAgICpwYXJhbV9kb3VibGVwID0gRE9VQkxFX1NFQ1MoZGF0YS0+cHJvZ3Jlc3MudGltZXNwZW50KTsKICAgICBicmVhazsKICAgY2FzZSBDVVJMSU5GT19OQU1FTE9PS1VQX1RJTUU6Ci0gICAgKnBhcmFtX2RvdWJsZXAgPSBkYXRhLT5wcm9ncmVzcy50X25zbG9va3VwOworICAgICpwYXJhbV9kb3VibGVwID0gRE9VQkxFX1NFQ1MoZGF0YS0+cHJvZ3Jlc3MudF9uc2xvb2t1cCk7CiAgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTElORk9fQ09OTkVDVF9USU1FOgotICAgICpwYXJhbV9kb3VibGVwID0gZGF0YS0+cHJvZ3Jlc3MudF9jb25uZWN0OworICAgICpwYXJhbV9kb3VibGVwID0gRE9VQkxFX1NFQ1MoZGF0YS0+cHJvZ3Jlc3MudF9jb25uZWN0KTsKICAgICBicmVhazsKICAgY2FzZSBDVVJMSU5GT19BUFBDT05ORUNUX1RJTUU6Ci0gICAgKnBhcmFtX2RvdWJsZXAgPSBkYXRhLT5wcm9ncmVzcy50X2FwcGNvbm5lY3Q7CisgICAgKnBhcmFtX2RvdWJsZXAgPSBET1VCTEVfU0VDUyhkYXRhLT5wcm9ncmVzcy50X2FwcGNvbm5lY3QpOwogICAgIGJyZWFrOwogICBjYXNlIENVUkxJTkZPX1BSRVRSQU5TRkVSX1RJTUU6Ci0gICAgKnBhcmFtX2RvdWJsZXAgPSAgZGF0YS0+cHJvZ3Jlc3MudF9wcmV0cmFuc2ZlcjsKKyAgICAqcGFyYW1fZG91YmxlcCA9IERPVUJMRV9TRUNTKGRhdGEtPnByb2dyZXNzLnRfcHJldHJhbnNmZXIpOwogICAgIGJyZWFrOwogICBjYXNlIENVUkxJTkZPX1NUQVJUVFJBTlNGRVJfVElNRToKLSAgICAqcGFyYW1fZG91YmxlcCA9IGRhdGEtPnByb2dyZXNzLnRfc3RhcnR0cmFuc2ZlcjsKKyAgICAqcGFyYW1fZG91YmxlcCA9IERPVUJMRV9TRUNTKGRhdGEtPnByb2dyZXNzLnRfc3RhcnR0cmFuc2Zlcik7CiAgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTElORk9fU0laRV9VUExPQUQ6CiAgICAgKnBhcmFtX2RvdWJsZXAgPSAgKGRvdWJsZSlkYXRhLT5wcm9ncmVzcy51cGxvYWRlZDsKQEAgLTI4OSw3ICszMjMsNyBAQAogICAgICAgKGRvdWJsZSlkYXRhLT5wcm9ncmVzcy5zaXplX3VsOi0xOwogICAgIGJyZWFrOwogICBjYXNlIENVUkxJTkZPX1JFRElSRUNUX1RJTUU6Ci0gICAgKnBhcmFtX2RvdWJsZXAgPSAgZGF0YS0+cHJvZ3Jlc3MudF9yZWRpcmVjdDsKKyAgICAqcGFyYW1fZG91YmxlcCA9IERPVUJMRV9TRUNTKGRhdGEtPnByb2dyZXNzLnRfcmVkaXJlY3QpOwogICAgIGJyZWFrOwogCiAgIGRlZmF1bHQ6CkBAIC0zMjYsNDYgKzM2MCwyNSBAQAogICAgICAgc3RydWN0IGN1cmxfdGxzc2Vzc2lvbmluZm8gKip0c2lwID0gKHN0cnVjdCBjdXJsX3Rsc3Nlc3Npb25pbmZvICoqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc2xpc3RwOwogICAgICAgc3RydWN0IGN1cmxfdGxzc2Vzc2lvbmluZm8gKnRzaSA9ICZkYXRhLT50c2k7CisjaWZkZWYgVVNFX1NTTAogICAgICAgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uID0gZGF0YS0+ZWFzeV9jb25uOworI2VuZGlmCiAKICAgICAgICp0c2lwID0gdHNpOwogICAgICAgdHNpLT5iYWNrZW5kID0gQ3VybF9zc2xfYmFja2VuZCgpOwogICAgICAgdHNpLT5pbnRlcm5hbHMgPSBOVUxMOwogCisjaWZkZWYgVVNFX1NTTAogICAgICAgaWYoY29ubiAmJiB0c2ktPmJhY2tlbmQgIT0gQ1VSTFNTTEJBQ0tFTkRfTk9ORSkgewogICAgICAgICB1bnNpZ25lZCBpbnQgaTsKICAgICAgICAgZm9yKGkgPSAwOyBpIDwgKHNpemVvZihjb25uLT5zc2wpIC8gc2l6ZW9mKGNvbm4tPnNzbFswXSkpOyArK2kpIHsKICAgICAgICAgICBpZihjb25uLT5zc2xbaV0udXNlKSB7Ci0jaWYgZGVmaW5lZChVU0VfQVhUTFMpCi0gICAgICAgICAgICB0c2ktPmludGVybmFscyA9ICh2b2lkICopY29ubi0+c3NsW2ldLnNzbDsKLSNlbGlmIGRlZmluZWQoVVNFX0NZQVNTTCkKLSAgICAgICAgICAgIHRzaS0+aW50ZXJuYWxzID0gKHZvaWQgKiljb25uLT5zc2xbaV0uaGFuZGxlOwotI2VsaWYgZGVmaW5lZChVU0VfREFSV0lOU1NMKQotICAgICAgICAgICAgdHNpLT5pbnRlcm5hbHMgPSAodm9pZCAqKWNvbm4tPnNzbFtpXS5zc2xfY3R4OwotI2VsaWYgZGVmaW5lZChVU0VfR05VVExTKQotICAgICAgICAgICAgdHNpLT5pbnRlcm5hbHMgPSAodm9pZCAqKWNvbm4tPnNzbFtpXS5zZXNzaW9uOwotI2VsaWYgZGVmaW5lZChVU0VfR1NLSVQpCi0gICAgICAgICAgICB0c2ktPmludGVybmFscyA9ICh2b2lkICopY29ubi0+c3NsW2ldLmhhbmRsZTsKLSNlbGlmIGRlZmluZWQoVVNFX01CRURUTFMpCi0gICAgICAgICAgICB0c2ktPmludGVybmFscyA9ICh2b2lkICopJmNvbm4tPnNzbFtpXS5zc2w7Ci0jZWxpZiBkZWZpbmVkKFVTRV9OU1MpCi0gICAgICAgICAgICB0c2ktPmludGVybmFscyA9ICh2b2lkICopY29ubi0+c3NsW2ldLmhhbmRsZTsKLSNlbGlmIGRlZmluZWQoVVNFX09QRU5TU0wpCi0gICAgICAgICAgICAvKiBMZWdhY3k6IENVUkxJTkZPX1RMU19TRVNTSU9OIG11c3QgcmV0dXJuIGFuIFNTTF9DVFggcG9pbnRlci4gKi8KLSAgICAgICAgICAgIHRzaS0+aW50ZXJuYWxzID0gKChpbmZvID09IENVUkxJTkZPX1RMU19TRVNTSU9OKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNvbm4tPnNzbFtpXS5jdHggOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljb25uLT5zc2xbaV0uaGFuZGxlKTsKLSNlbGlmIGRlZmluZWQoVVNFX1BPTEFSU1NMKQotICAgICAgICAgICAgdHNpLT5pbnRlcm5hbHMgPSAodm9pZCAqKSZjb25uLT5zc2xbaV0uc3NsOwotI2VsaWYgZGVmaW5lZChVU0VfU0NIQU5ORUwpCi0gICAgICAgICAgICB0c2ktPmludGVybmFscyA9ICh2b2lkICopJmNvbm4tPnNzbFtpXS5jdHh0LT5jdHh0X2hhbmRsZTsKLSNlbGlmIGRlZmluZWQoVVNFX1NTTCkKLSNlcnJvciAiU1NMIGJhY2tlbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24gbWlzc2luZyBmb3IgQ1VSTElORk9fVExTX1NTTF9QVFIiCi0jZW5kaWYKKyAgICAgICAgICAgIHRzaS0+aW50ZXJuYWxzID0gQ3VybF9zc2wtPmdldF9pbnRlcm5hbHMoJmNvbm4tPnNzbFtpXSwgaW5mbyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KKyNlbmRpZgogICAgIH0KICAgICBicmVhazsKICAgZGVmYXVsdDoKQEAgLTM5NCw2ICs0MDcsNyBAQAogICB2YV9saXN0IGFyZzsKICAgbG9uZyAqcGFyYW1fbG9uZ3AgPSBOVUxMOwogICBkb3VibGUgKnBhcmFtX2RvdWJsZXAgPSBOVUxMOworICBjdXJsX29mZl90ICpwYXJhbV9vZmZ0ID0gTlVMTDsKICAgY29uc3QgY2hhciAqKnBhcmFtX2NoYXJwID0gTlVMTDsKICAgc3RydWN0IGN1cmxfc2xpc3QgKipwYXJhbV9zbGlzdHAgPSBOVUxMOwogICBjdXJsX3NvY2tldF90ICpwYXJhbV9zb2NrZXRwID0gTlVMTDsKQEAgLTQyMiw2ICs0MzYsMTEgQEAKICAgICBpZihwYXJhbV9kb3VibGVwKQogICAgICAgcmVzdWx0ID0gZ2V0aW5mb19kb3VibGUoZGF0YSwgaW5mbywgcGFyYW1fZG91YmxlcCk7CiAgICAgYnJlYWs7CisgIGNhc2UgQ1VSTElORk9fT0ZGX1Q6CisgICAgcGFyYW1fb2ZmdCA9IHZhX2FyZyhhcmcsIGN1cmxfb2ZmX3QgKik7CisgICAgaWYocGFyYW1fb2ZmdCkKKyAgICAgIHJlc3VsdCA9IGdldGluZm9fb2ZmdChkYXRhLCBpbmZvLCBwYXJhbV9vZmZ0KTsKKyAgICBicmVhazsKICAgY2FzZSBDVVJMSU5GT19TTElTVDoKICAgICBwYXJhbV9zbGlzdHAgPSB2YV9hcmcoYXJnLCBzdHJ1Y3QgY3VybF9zbGlzdCAqKik7CiAgICAgaWYocGFyYW1fc2xpc3RwKQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvZ29waGVyLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9nb3BoZXIuYwppbmRleCBlNmQyNzQ2Li5iN2MzMWI2IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9nb3BoZXIuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9nb3BoZXIuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtNjUsNiArNjUsNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfR09QSEVSLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fR09QSEVSLCAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8KQEAgLTcyLDggKzczLDggQEAKIAogc3RhdGljIENVUkxjb2RlIGdvcGhlcl9kbyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGJvb2wgKmRvbmUpCiB7Ci0gIENVUkxjb2RlIHJlc3VsdD1DVVJMRV9PSzsKLSAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YT1jb25uLT5kYXRhOworICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKKyAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIGN1cmxfc29ja2V0X3Qgc29ja2ZkID0gY29ubi0+c29ja1tGSVJTVFNPQ0tFVF07CiAKICAgY3VybF9vZmZfdCAqYnl0ZWNvdW50ID0gJmRhdGEtPnJlcS5ieXRlY291bnQ7CkBAIC05NiwxMSArOTcsMTEgQEAKIAogICAgIC8qIE90aGVyd2lzZSwgZHJvcCAvIGFuZCB0aGUgZmlyc3QgY2hhcmFjdGVyIChpLmUuLCBpdGVtIHR5cGUpIC4uLiAqLwogICAgIG5ld3AgPSBwYXRoOwotICAgIG5ld3ArPTI7CisgICAgbmV3cCArPSAyOwogCiAgICAgLyogLi4uIHRoZW4gdHVybiA/IGludG8gVEFCIGZvciBzZWFyY2ggc2VydmVycywgVmVyb25pY2EsIGV0Yy4gLi4uICovCiAgICAgaiA9IHN0cmxlbihuZXdwKTsKLSAgICBmb3IoaT0wOyBpPGo7IGkrKykKKyAgICBmb3IoaSA9IDA7IGk8ajsgaSsrKQogICAgICAgaWYobmV3cFtpXSA9PSAnPycpCiAgICAgICAgIG5ld3BbaV0gPSAnXHgwOSc7CiAKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2hhc2guYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2hhc2guYwppbmRleCA2YWZlYWExLi5jOTliMWI2IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9oYXNoLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaGFzaC5jCkBAIC0zMDAsMTAgKzMwMCwxMCBAQAogCiAgIC8qIElmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsaXN0LCBmaW5kIHRoZSBuZXh0IG9uZSAqLwogICBpZighaXRlci0+Y3VycmVudF9lbGVtZW50KSB7Ci0gICAgZm9yKGkgPSBpdGVyLT5zbG90X2luZGV4O2kgPCBoLT5zbG90cztpKyspIHsKKyAgICBmb3IoaSA9IGl0ZXItPnNsb3RfaW5kZXg7IGkgPCBoLT5zbG90czsgaSsrKSB7CiAgICAgICBpZihoLT50YWJsZVtpXS5oZWFkKSB7CiAgICAgICAgIGl0ZXItPmN1cnJlbnRfZWxlbWVudCA9IGgtPnRhYmxlW2ldLmhlYWQ7Ci0gICAgICAgIGl0ZXItPnNsb3RfaW5kZXggPSBpKzE7CisgICAgICAgIGl0ZXItPnNsb3RfaW5kZXggPSBpICsgMTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaG9zdGNoZWNrLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9ob3N0Y2hlY2suYwppbmRleCAxNTYwOTFjLi4yM2RjM2QyIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9ob3N0Y2hlY2suYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9ob3N0Y2hlY2suYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtNzMsMTAgKzczLDEwIEBACiAgIC8qIG5vcm1hbGl6ZSBwYXR0ZXJuIGFuZCBob3N0bmFtZSBieSBzdHJpcHBpbmcgb2ZmIHRyYWlsaW5nIGRvdHMgKi8KICAgc2l6ZV90IGxlbiA9IHN0cmxlbihob3N0bmFtZSk7CiAgIGlmKGhvc3RuYW1lW2xlbi0xXT09Jy4nKQotICAgIGhvc3RuYW1lW2xlbi0xXT0wOworICAgIGhvc3RuYW1lW2xlbi0xXSA9IDA7CiAgIGxlbiA9IHN0cmxlbihwYXR0ZXJuKTsKICAgaWYocGF0dGVybltsZW4tMV09PScuJykKLSAgICBwYXR0ZXJuW2xlbi0xXT0wOworICAgIHBhdHRlcm5bbGVuLTFdID0gMDsKIAogICBwYXR0ZXJuX3dpbGRjYXJkID0gc3RyY2hyKHBhdHRlcm4sICcqJyk7CiAgIGlmKHBhdHRlcm5fd2lsZGNhcmQgPT0gTlVMTCkKQEAgLTk1LDcgKzk1LDcgQEAKICAgICAgbWF0Y2guICovCiAgIHdpbGRjYXJkX2VuYWJsZWQgPSAxOwogICBwYXR0ZXJuX2xhYmVsX2VuZCA9IHN0cmNocihwYXR0ZXJuLCAnLicpOwotICBpZihwYXR0ZXJuX2xhYmVsX2VuZCA9PSBOVUxMIHx8IHN0cmNocihwYXR0ZXJuX2xhYmVsX2VuZCsxLCAnLicpID09IE5VTEwgfHwKKyAgaWYocGF0dGVybl9sYWJlbF9lbmQgPT0gTlVMTCB8fCBzdHJjaHIocGF0dGVybl9sYWJlbF9lbmQgKyAxLCAnLicpID09IE5VTEwgfHwKICAgICAgcGF0dGVybl93aWxkY2FyZCA+IHBhdHRlcm5fbGFiZWxfZW5kIHx8CiAgICAgIHN0cm5jYXNlY29tcGFyZShwYXR0ZXJuLCAieG4tLSIsIDQpKSB7CiAgICAgd2lsZGNhcmRfZW5hYmxlZCA9IDA7CkBAIC0xMTYsOSArMTE2LDkgQEAKICAgICByZXR1cm4gQ1VSTF9IT1NUX05PTUFUQ0g7CiAKICAgcHJlZml4bGVuID0gcGF0dGVybl93aWxkY2FyZCAtIHBhdHRlcm47Ci0gIHN1ZmZpeGxlbiA9IHBhdHRlcm5fbGFiZWxfZW5kIC0gKHBhdHRlcm5fd2lsZGNhcmQrMSk7CisgIHN1ZmZpeGxlbiA9IHBhdHRlcm5fbGFiZWxfZW5kIC0gKHBhdHRlcm5fd2lsZGNhcmQgKyAxKTsKICAgcmV0dXJuIHN0cm5jYXNlY29tcGFyZShwYXR0ZXJuLCBob3N0bmFtZSwgcHJlZml4bGVuKSAmJgotICAgIHN0cm5jYXNlY29tcGFyZShwYXR0ZXJuX3dpbGRjYXJkKzEsIGhvc3RuYW1lX2xhYmVsX2VuZCAtIHN1ZmZpeGxlbiwKKyAgICBzdHJuY2FzZWNvbXBhcmUocGF0dGVybl93aWxkY2FyZCArIDEsIGhvc3RuYW1lX2xhYmVsX2VuZCAtIHN1ZmZpeGxlbiwKICAgICAgICAgICAgICAgICAgICAgc3VmZml4bGVuKSA/CiAgICAgQ1VSTF9IT1NUX01BVENIIDogQ1VSTF9IT1NUX05PTUFUQ0g7CiB9CkBAIC0xMzcsNyArMTM3LDcgQEAKICAgICAgIGhvc3RwID0gc3RyZHVwKGhvc3RuYW1lKTsKICAgICAgIGlmKGhvc3RwKSB7CiAgICAgICAgIGlmKGhvc3RtYXRjaChob3N0cCwgbWF0Y2hwKSA9PSBDVVJMX0hPU1RfTUFUQ0gpCi0gICAgICAgICAgcmVzPSAxOworICAgICAgICAgIHJlcyA9IDE7CiAgICAgICAgIGZyZWUoaG9zdHApOwogICAgICAgfQogICAgICAgZnJlZShtYXRjaHApOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaG9zdGlwLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9ob3N0aXAuYwppbmRleCA2MTllYzg0Li4xYTE4YTNlIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9ob3N0aXAuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9ob3N0aXAuYwpAQCAtMzA0LDkgKzMwNCw5IEBACiAgIGVudHJ5X2xlbiA9IHN0cmxlbihlbnRyeV9pZCk7CiAKICAgLyogU2VlIGlmIGl0cyBhbHJlYWR5IGluIG91ciBkbnMgY2FjaGUgKi8KLSAgZG5zID0gQ3VybF9oYXNoX3BpY2soZGF0YS0+ZG5zLmhvc3RjYWNoZSwgZW50cnlfaWQsIGVudHJ5X2xlbisxKTsKKyAgZG5zID0gQ3VybF9oYXNoX3BpY2soZGF0YS0+ZG5zLmhvc3RjYWNoZSwgZW50cnlfaWQsIGVudHJ5X2xlbiArIDEpOwogCi0gIGlmKGRucyAmJiAoZGF0YS0+c2V0LmRuc19jYWNoZV90aW1lb3V0ICE9IC0xKSkgIHsKKyAgaWYoZG5zICYmIChkYXRhLT5zZXQuZG5zX2NhY2hlX3RpbWVvdXQgIT0gLTEpKSB7CiAgICAgLyogU2VlIHdoZXRoZXIgdGhlIHJldHVybmVkIGVudHJ5IGlzIHN0YWxlLiBEb25lIGJlZm9yZSB3ZSByZWxlYXNlIGxvY2sgKi8KICAgICBzdHJ1Y3QgaG9zdGNhY2hlX3BydW5lX2RhdGEgdXNlcjsKIApAQCAtMzE2LDcgKzMxNiw3IEBACiAgICAgaWYoaG9zdGNhY2hlX3RpbWVzdGFtcF9yZW1vdmUoJnVzZXIsIGRucykpIHsKICAgICAgIGluZm9mKGRhdGEsICJIb3N0bmFtZSBpbiBETlMgY2FjaGUgd2FzIHN0YWxlLCB6YXBwZWRcbiIpOwogICAgICAgZG5zID0gTlVMTDsgLyogdGhlIG1lbW9yeSBkZWFsbG9jYXRpb24gaXMgYmVpbmcgaGFuZGxlZCBieSB0aGUgaGFzaCAqLwotICAgICAgQ3VybF9oYXNoX2RlbGV0ZShkYXRhLT5kbnMuaG9zdGNhY2hlLCBlbnRyeV9pZCwgZW50cnlfbGVuKzEpOworICAgICAgQ3VybF9oYXNoX2RlbGV0ZShkYXRhLT5kbnMuaG9zdGNhY2hlLCBlbnRyeV9pZCwgZW50cnlfbGVuICsgMSk7CiAgICAgfQogICB9CiAKQEAgLTQwMyw3ICs0MDMsNyBAQAogICAgIGRucy0+dGltZXN0YW1wID0gMTsgICAvKiB6ZXJvIGluZGljYXRlcyBDVVJMT1BUX1JFU09MVkUgZW50cnkgKi8KIAogICAvKiBTdG9yZSB0aGUgcmVzb2x2ZWQgZGF0YSBpbiBvdXIgRE5TIGNhY2hlLiAqLwotICBkbnMyID0gQ3VybF9oYXNoX2FkZChkYXRhLT5kbnMuaG9zdGNhY2hlLCBlbnRyeV9pZCwgZW50cnlfbGVuKzEsCisgIGRuczIgPSBDdXJsX2hhc2hfYWRkKGRhdGEtPmRucy5ob3N0Y2FjaGUsIGVudHJ5X2lkLCBlbnRyeV9sZW4gKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWRucyk7CiAgIGlmKCFkbnMyKSB7CiAgICAgZnJlZShkbnMpOwpAQCAtODA3LDcgKzgwNyw3IEBACiAgICAgICAgIEN1cmxfc2hhcmVfbG9jayhkYXRhLCBDVVJMX0xPQ0tfREFUQV9ETlMsIENVUkxfTE9DS19BQ0NFU1NfU0lOR0xFKTsKIAogICAgICAgLyogZGVsZXRlIGVudHJ5LCBpZ25vcmUgaWYgaXQgZGlkbid0IGV4aXN0ICovCi0gICAgICBDdXJsX2hhc2hfZGVsZXRlKGRhdGEtPmRucy5ob3N0Y2FjaGUsIGVudHJ5X2lkLCBlbnRyeV9sZW4rMSk7CisgICAgICBDdXJsX2hhc2hfZGVsZXRlKGRhdGEtPmRucy5ob3N0Y2FjaGUsIGVudHJ5X2lkLCBlbnRyeV9sZW4gKyAxKTsKIAogICAgICAgaWYoZGF0YS0+c2hhcmUpCiAgICAgICAgIEN1cmxfc2hhcmVfdW5sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0ROUyk7CkBAIC04NDgsNyArODQ4LDcgQEAKICAgICAgICAgQ3VybF9zaGFyZV9sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0ROUywgQ1VSTF9MT0NLX0FDQ0VTU19TSU5HTEUpOwogCiAgICAgICAvKiBTZWUgaWYgaXRzIGFscmVhZHkgaW4gb3VyIGRucyBjYWNoZSAqLwotICAgICAgZG5zID0gQ3VybF9oYXNoX3BpY2soZGF0YS0+ZG5zLmhvc3RjYWNoZSwgZW50cnlfaWQsIGVudHJ5X2xlbisxKTsKKyAgICAgIGRucyA9IEN1cmxfaGFzaF9waWNrKGRhdGEtPmRucy5ob3N0Y2FjaGUsIGVudHJ5X2lkLCBlbnRyeV9sZW4gKyAxKTsKIAogICAgICAgLyogZnJlZSB0aGUgYWxsb2NhdGVkIGVudHJ5X2lkIGFnYWluICovCiAgICAgICBmcmVlKGVudHJ5X2lkKTsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2hvc3RpcDQuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2hvc3RpcDQuYwppbmRleCBlNDU5MzI4Li42YTdjNmU1IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9ob3N0aXA0LmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaG9zdGlwNC5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC0yNDksNyArMjQ5LDcgQEAKICAgICAgKi8KIAogICAgIGlmKENVUkxfSE9TVEVOVF9TSVpFID49Ci0gICAgICAgKHNpemVvZihzdHJ1Y3QgaG9zdGVudCkrc2l6ZW9mKHN0cnVjdCBob3N0ZW50X2RhdGEpKSkgeworICAgICAgIChzaXplb2Yoc3RydWN0IGhvc3RlbnQpICsgc2l6ZW9mKHN0cnVjdCBob3N0ZW50X2RhdGEpKSkgewogCiAgICAgICAvKiBBdWd1c3QgMjJuZCwgMjAwMDogQWxiZXJ0IENoaW4tQS1Zb3VuZyBicm91Z2h0IGFuIHVwZGF0ZWQgdmVyc2lvbgogICAgICAgICogdGhhdCBzaG91bGQgd29yayEgU2VwdGVtYmVyIDIwOiBSaWNoYXJkIFByZXNjb3R0IHdvcmtlZCBvbiB0aGUgYnVmZmVyCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9ob3N0aXA2LmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9ob3N0aXA2LmMKaW5kZXggNGViZmMyZC4uZWRlZWJlYyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaG9zdGlwNi5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2hvc3RpcDYuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtMjEyLDcgKzIxMiw3IEBACiAKICAgaWYocG9ydCkgewogICAgIHNucHJpbnRmKHNidWYsIHNpemVvZihzYnVmKSwgIiVkIiwgcG9ydCk7Ci0gICAgc2J1ZnB0cj1zYnVmOworICAgIHNidWZwdHIgPSBzYnVmOwogICB9CiAKICAgZXJyb3IgPSBDdXJsX2dldGFkZHJpbmZvX2V4KGhvc3RuYW1lLCBzYnVmcHRyLCAmaGludHMsICZyZXMpOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cC5jCmluZGV4IDIxNTc0ZTIuLjM4MjI3ZWIgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHAuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwLmMKQEAgLTUwLDYgKzUwLDcgQEAKICNpbmNsdWRlICJ0cmFuc2Zlci5oIgogI2luY2x1ZGUgInNlbmRmLmgiCiAjaW5jbHVkZSAiZm9ybWRhdGEuaCIKKyNpbmNsdWRlICJtaW1lLmgiCiAjaW5jbHVkZSAicHJvZ3Jlc3MuaCIKICNpbmNsdWRlICJjdXJsX2Jhc2U2NC5oIgogI2luY2x1ZGUgImNvb2tpZS5oIgpAQCAtMTE5LDYgKzEyMCw3IEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9IVFRQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19IVFRQLCAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9DUkVEU1BFUlJFUVVFU1QgICAgICAgICAgICAgICAvKiBmbGFncyAqLwpAQCAtMTQzLDYgKzE0NSw3IEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9IVFRQUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19IVFRQUywgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9TU0wgfCBQUk9UT1BUX0NSRURTUEVSUkVRVUVTVCB8IFBST1RPUFRfQUxQTl9OUE4gLyogZmxhZ3MgKi8KQEAgLTE2MCw2ICsxNjMsNyBAQAogICBpZighaHR0cCkKICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKIAorICBDdXJsX21pbWVfaW5pdHBhcnQoJmh0dHAtPmZvcm0sIGNvbm4tPmRhdGEpOwogICBjb25uLT5kYXRhLT5yZXEucHJvdG9wID0gaHR0cDsKIAogICBDdXJsX2h0dHAyX3NldHVwX2Nvbm4oY29ubik7CkBAIC0xNjgsMjYgKzE3Miw2IEBACiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIAotLyoKLSAqIGNoZWNraGVhZGVycygpIGNoZWNrcyB0aGUgbGlua2VkIGxpc3Qgb2YgY3VzdG9tIEhUVFAgaGVhZGVycyBmb3IgYQotICogcGFydGljdWxhciBoZWFkZXIgKHByZWZpeCkuCi0gKgotICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG1hdGNoaW5nIGhlYWRlciBvciBOVUxMIGlmIG5vbmUgbWF0Y2hlZC4KLSAqLwotY2hhciAqQ3VybF9jaGVja2hlYWRlcnMoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGhpc2hlYWRlcikKLXsKLSAgc3RydWN0IGN1cmxfc2xpc3QgKmhlYWQ7Ci0gIHNpemVfdCB0aGlzbGVuID0gc3RybGVuKHRoaXNoZWFkZXIpOwotICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKLQotICBmb3IoaGVhZCA9IGRhdGEtPnNldC5oZWFkZXJzO2hlYWQ7IGhlYWQ9aGVhZC0+bmV4dCkgewotICAgIGlmKHN0cm5jYXNlY29tcGFyZShoZWFkLT5kYXRhLCB0aGlzaGVhZGVyLCB0aGlzbGVuKSkKLSAgICAgIHJldHVybiBoZWFkLT5kYXRhOwotICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19CiAKIC8qCiAgKiBjaGVja1Byb3h5SGVhZGVycygpIGNoZWNrcyB0aGUgbGlua2VkIGxpc3Qgb2YgY3VzdG9tIHByb3h5IGhlYWRlcnMKQEAgLTIwNyw3ICsxOTEsNyBAQAogCiAgIGZvcihoZWFkID0gKGNvbm4tPmJpdHMucHJveHkgJiYgZGF0YS0+c2V0LnNlcF9oZWFkZXJzKSA/CiAgICAgICAgIGRhdGEtPnNldC5wcm94eWhlYWRlcnMgOiBkYXRhLT5zZXQuaGVhZGVyczsKLSAgICAgIGhlYWQ7IGhlYWQ9aGVhZC0+bmV4dCkgeworICAgICAgaGVhZDsgaGVhZCA9IGhlYWQtPm5leHQpIHsKICAgICBpZihzdHJuY2FzZWNvbXBhcmUoaGVhZC0+ZGF0YSwgdGhpc2hlYWRlciwgdGhpc2xlbikpCiAgICAgICByZXR1cm4gaGVhZC0+ZGF0YTsKICAgfQpAQCAtNDI1LDYgKzQwOSw3IEBACiAgICAgICAgIGV4cGVjdHNlbmQgPSBkYXRhLT5zdGF0ZS5pbmZpbGVzaXplOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBIVFRQUkVRX1BPU1RfRk9STToKKyAgICBjYXNlIEhUVFBSRVFfUE9TVF9NSU1FOgogICAgICAgZXhwZWN0c2VuZCA9IGh0dHAtPnBvc3RzaXplOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKQEAgLTYwOCw3ICs1OTMsNyBAQAogI2VuZGlmCiAjaWYgZGVmaW5lZChVU0VfTlRMTSkgJiYgZGVmaW5lZChOVExNX1dCX0VOQUJMRUQpCiAgIGlmKGF1dGhzdGF0dXMtPnBpY2tlZCA9PSBDVVJMQVVUSF9OVExNX1dCKSB7Ci0gICAgYXV0aD0iTlRMTV9XQiI7CisgICAgYXV0aCA9ICJOVExNX1dCIjsKICAgICByZXN1bHQgPSBDdXJsX291dHB1dF9udGxtX3diKGNvbm4sIHByb3h5KTsKICAgICBpZihyZXN1bHQpCiAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTAyMCw3ICsxMDA1LDcgQEAKIAogICAgICAgaHR0cC0+c2VuZGluZysrOyAvKiBtb3ZlIG9uZSBzdGVwIHVwICovCiAKLSAgICAgIGh0dHAtPmJhY2t1cC5wb3N0c2l6ZT0wOworICAgICAgaHR0cC0+YmFja3VwLnBvc3RzaXplID0gMDsKICAgICB9CiAgICAgZWxzZQogICAgICAgaHR0cC0+cG9zdHNpemUgPSAwOwpAQCAtMTE0OCw3ICsxMTMzLDcgQEAKICAgICAgICAgLyogdGhlcmUgd2FzIGJvZHkgZGF0YSBzZW50IGJleW9uZCB0aGUgaW5pdGlhbCBoZWFkZXIgcGFydCwgcGFzcyB0aGF0CiAgICAgICAgICAgIG9uIHRvIHRoZSBkZWJ1ZyBjYWxsYmFjayB0b28gKi8KICAgICAgICAgQ3VybF9kZWJ1Zyhjb25uLT5kYXRhLCBDVVJMSU5GT19EQVRBX09VVCwKLSAgICAgICAgICAgICAgICAgICBwdHIraGVhZGxlbiwgYm9keWxlbiwgY29ubik7CisgICAgICAgICAgICAgICAgICAgcHRyICsgaGVhZGxlbiwgYm9keWxlbiwgY29ubik7CiAgICAgICB9CiAgICAgfQogCkBAIC0xMjYwLDcgKzEyNDUsNyBAQAogICAgICAgICh+KHNpemUgKiAyKSA8IChpbi0+c2l6ZV91c2VkICogMikpKQogICAgICAgbmV3X3NpemUgPSAoc2l6ZV90KS0xOwogICAgIGVsc2UKLSAgICAgIG5ld19zaXplID0gKGluLT5zaXplX3VzZWQrc2l6ZSkgKiAyOworICAgICAgbmV3X3NpemUgPSAoaW4tPnNpemVfdXNlZCArIHNpemUpICogMjsKIAogICAgIGlmKGluLT5idWZmZXIpCiAgICAgICAvKiB3ZSBoYXZlIGEgYnVmZmVyLCBlbmxhcmdlIHRoZSBleGlzdGluZyBvbmUgKi8KQEAgLTEzMzcsNyArMTMyMiw3IEBACiAgIGNsZW4gPSBzdHJsZW4oY29udGVudCk7IC8qIGxlbmd0aCBvZiB0aGUgd29yZCB0byBmaW5kICovCiAKICAgLyogZmluZCB0aGUgY29udGVudCBzdHJpbmcgaW4gdGhlIHJlc3Qgb2YgdGhlIGxpbmUgKi8KLSAgZm9yKDtsZW4+PWNsZW47bGVuLS0sIHN0YXJ0KyspIHsKKyAgZm9yKDsgbGVuID49IGNsZW47IGxlbi0tLCBzdGFydCsrKSB7CiAgICAgaWYoc3RybmNhc2Vjb21wYXJlKHN0YXJ0LCBjb250ZW50LCBjbGVuKSkKICAgICAgIHJldHVybiBUUlVFOyAvKiBtYXRjaCEgKi8KICAgfQpAQCAtMTM2OSw3ICsxMzU0LDcgQEAKICAgaWYoQ09OTkVDVF9GSVJTVFNPQ0tFVF9QUk9YWV9TU0woKSkKICAgICByZXR1cm4gQ1VSTEVfT0s7IC8qIHdhaXQgZm9yIEhUVFBTIHByb3h5IFNTTCBpbml0aWFsaXphdGlvbiB0byBjb21wbGV0ZSAqLwogCi0gIGlmKGNvbm4tPnR1bm5lbF9zdGF0ZVtGSVJTVFNPQ0tFVF0gPT0gVFVOTkVMX0NPTk5FQ1QpCisgIGlmKEN1cmxfY29ubmVjdF9vbmdvaW5nKGNvbm4pKQogICAgIC8qIG5vdGhpbmcgZWxzZSB0byBkbyBleGNlcHQgd2FpdCByaWdodCBub3cgLSB3ZSdyZSBub3QgZG9uZSBoZXJlLiAqLwogICAgIHJldHVybiBDVVJMRV9PSzsKIApAQCAtMTQ2OCwxOCArMTQ1MywxNyBAQAogCiAgIEN1cmxfaHR0cDJfZG9uZShjb25uLCBwcmVtYXR1cmUpOwogCi0gIGlmKEhUVFBSRVFfUE9TVF9GT1JNID09IGRhdGEtPnNldC5odHRwcmVxKSB7Ci0gICAgZGF0YS0+cmVxLmJ5dGVjb3VudCA9IGh0dHAtPnJlYWRieXRlY291bnQgKyBodHRwLT53cml0ZWJ5dGVjb3VudDsKKyAgQ3VybF9taW1lX2NsZWFucGFydCgmaHR0cC0+Zm9ybSk7CiAKLSAgICBDdXJsX2Zvcm1jbGVhbigmaHR0cC0+c2VuZGl0KTsgLyogTm93IGZyZWUgdGhhdCB3aG9sZSBsb3QgKi8KLSAgICBpZihodHRwLT5mb3JtLmZwKSB7Ci0gICAgICAvKiBhIGZpbGUgYmVpbmcgdXBsb2FkZWQgd2FzIGxlZnQgb3BlbmVkLCBjbG9zZSBpdCEgKi8KLSAgICAgIGZjbG9zZShodHRwLT5mb3JtLmZwKTsKLSAgICAgIGh0dHAtPmZvcm0uZnAgPSBOVUxMOwotICAgIH0KLSAgfQotICBlbHNlIGlmKEhUVFBSRVFfUFVUID09IGRhdGEtPnNldC5odHRwcmVxKQorICBzd2l0Y2goZGF0YS0+c2V0Lmh0dHByZXEpIHsKKyAgY2FzZSBIVFRQUkVRX1BVVDoKKyAgY2FzZSBIVFRQUkVRX1BPU1RfRk9STToKKyAgY2FzZSBIVFRQUkVRX1BPU1RfTUlNRToKICAgICBkYXRhLT5yZXEuYnl0ZWNvdW50ID0gaHR0cC0+cmVhZGJ5dGVjb3VudCArIGh0dHAtPndyaXRlYnl0ZWNvdW50OworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CiAKICAgaWYoc3RhdHVzKQogICAgIHJldHVybiBzdGF0dXM7CkBAIC0xNTc5LDcgKzE1NjMsNyBAQAogICBjaGFyICpwdHI7CiAgIHN0cnVjdCBjdXJsX3NsaXN0ICpoWzJdOwogICBzdHJ1Y3QgY3VybF9zbGlzdCAqaGVhZGVyczsKLSAgaW50IG51bWxpc3RzPTE7IC8qIGJ5IGRlZmF1bHQgKi8KKyAgaW50IG51bWxpc3RzID0gMTsgLyogYnkgZGVmYXVsdCAqLwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKICAgaW50IGk7CiAKQEAgLTE2MTEsNyArMTU5NSw3IEBACiAgIH0KIAogICAvKiBsb29wIHRocm91Z2ggb25lIG9yIHR3byBsaXN0cyAqLwotICBmb3IoaT0wOyBpIDwgbnVtbGlzdHM7IGkrKykgeworICBmb3IoaSA9IDA7IGkgPCBudW1saXN0czsgaSsrKSB7CiAgICAgaGVhZGVycyA9IGhbaV07CiAKICAgICB3aGlsZShoZWFkZXJzKSB7CkBAIC0xNjM1LDE1ICsxNjE5LDE5IEBACiAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGhlYWRlciAoZXh0ZW5kZWQgYnkgZm9ybWRhdGEuYykgaXMgc2VudCBsYXRlciAqLwogICAgICAgICAgICAgICAgICAgY2hlY2twcmVmaXgoIkNvbnRlbnQtVHlwZToiLCBoZWFkZXJzLT5kYXRhKSkKICAgICAgICAgICAgIDsKKyAgICAgICAgICBlbHNlIGlmKGRhdGEtPnNldC5odHRwcmVxID09IEhUVFBSRVFfUE9TVF9NSU1FICYmCisgICAgICAgICAgICAgICAgICAvKiB0aGlzIGhlYWRlciBpcyBzZW50IGxhdGVyICovCisgICAgICAgICAgICAgICAgICBjaGVja3ByZWZpeCgiQ29udGVudC1UeXBlOiIsIGhlYWRlcnMtPmRhdGEpKQorICAgICAgICAgICAgOwogICAgICAgICAgIGVsc2UgaWYoY29ubi0+Yml0cy5hdXRobmVnICYmCiAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSBkb2luZyBhdXRoIG5lZywgZG9uJ3QgYWxsb3cgdGhlIGN1c3RvbSBsZW5ndGggc2luY2UKICAgICAgICAgICAgICAgICAgICAgIHdlIHdpbGwgZm9yY2UgbGVuZ3RoIHplcm8gdGhlbiAqLwotICAgICAgICAgICAgICAgICAgY2hlY2twcmVmaXgoIkNvbnRlbnQtTGVuZ3RoIiwgaGVhZGVycy0+ZGF0YSkpCisgICAgICAgICAgICAgICAgICBjaGVja3ByZWZpeCgiQ29udGVudC1MZW5ndGg6IiwgaGVhZGVycy0+ZGF0YSkpCiAgICAgICAgICAgICA7CiAgICAgICAgICAgZWxzZSBpZihjb25uLT5hbGxvY3B0ci50ZSAmJgogICAgICAgICAgICAgICAgICAgLyogd2hlbiBhc2tpbmcgZm9yIFRyYW5zZmVyLUVuY29kaW5nLCBkb24ndCBwYXNzIG9uIGEgY3VzdG9tCiAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uOiAqLwotICAgICAgICAgICAgICAgICAgY2hlY2twcmVmaXgoIkNvbm5lY3Rpb24iLCBoZWFkZXJzLT5kYXRhKSkKKyAgICAgICAgICAgICAgICAgIGNoZWNrcHJlZml4KCJDb25uZWN0aW9uOiIsIGhlYWRlcnMtPmRhdGEpKQogICAgICAgICAgICAgOwogICAgICAgICAgIGVsc2UgaWYoKGNvbm4tPmh0dHB2ZXJzaW9uID09IDIwKSAmJgogICAgICAgICAgICAgICAgICAgY2hlY2twcmVmaXgoIlRyYW5zZmVyLUVuY29kaW5nOiIsIGhlYWRlcnMtPmRhdGEpKQpAQCAtMTY3Niw2ICsxNjY0LDEwIEBACiAgICAgICAgICAgICAgICpwdHIgPSAnOic7CiAgICAgICAgICAgICAgIHJlc3VsdCA9IEN1cmxfYWRkX2J1ZmZlcmYocmVxX2J1ZmZlciwgIiVzXHJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycy0+ZGF0YSk7CisKKyAgICAgICAgICAgICAgLyogcmVzdG9yZSB0aGUgcHJldmlvdXMgdmFsdWUgKi8KKyAgICAgICAgICAgICAgKnB0ciA9ICc7JzsKKwogICAgICAgICAgICAgICBpZihyZXN1bHQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgIH0KQEAgLTE3NzMsNyArMTc2NSw3IEBACiAgIGNvbnN0IGNoYXIgKmh0dHBzdHJpbmc7CiAgIEN1cmxfc2VuZF9idWZmZXIgKnJlcV9idWZmZXI7CiAgIGN1cmxfb2ZmX3QgcG9zdHNpemUgPSAwOyAvKiBjdXJsX29mZl90IHRvIGhhbmRsZSBsYXJnZSBmaWxlIHNpemVzICovCi0gIGludCBzZWVrZXJyID0gQ1VSTF9TRUVLRlVOQ19PSzsKKyAgaW50IHNlZWtlcnIgPSBDVVJMX1NFRUtGVU5DX0NBTlRTRUVLOwogCiAgIC8qIEFsd2F5cyBjb25zaWRlciB0aGUgRE8gcGhhc2UgZG9uZSBhZnRlciB0aGlzIGZ1bmN0aW9uIGNhbGwsIGV2ZW4gaWYgdGhlcmUKICAgICAgbWF5IGJlIHBhcnRzIG9mIHRoZSByZXF1ZXN0IHRoYXQgaXMgbm90IHlldCBzZW50LCBzaW5jZSB3ZSBjYW4gZGVhbCB3aXRoCkBAIC0xODQ2LDExICsxODM4LDE1IEBACiAgICAgICBzd2l0Y2goaHR0cHJlcSkgewogICAgICAgY2FzZSBIVFRQUkVRX1BPU1Q6CiAgICAgICBjYXNlIEhUVFBSRVFfUE9TVF9GT1JNOgorICAgICAgY2FzZSBIVFRQUkVRX1BPU1RfTUlNRToKICAgICAgICAgcmVxdWVzdCA9ICJQT1NUIjsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIEhUVFBSRVFfUFVUOgogICAgICAgICByZXF1ZXN0ID0gIlBVVCI7CiAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBIVFRQUkVRX09QVElPTlM6CisgICAgICAgIHJlcXVlc3QgPSAiT1BUSU9OUyI7CisgICAgICAgIGJyZWFrOwogICAgICAgZGVmYXVsdDogLyogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCiAgICAgICBjYXNlIEhUVFBSRVFfR0VUOgogICAgICAgICByZXF1ZXN0ID0gIkdFVCI7CkBAIC0xODY4LDcgKzE4NjQsNyBAQAogICAgICBoZXJlLiAqLwogICBpZihDdXJsX2NoZWNraGVhZGVycyhjb25uLCAiVXNlci1BZ2VudDoiKSkgewogICAgIGZyZWUoY29ubi0+YWxsb2NwdHIudWFnZW50KTsKLSAgICBjb25uLT5hbGxvY3B0ci51YWdlbnQ9TlVMTDsKKyAgICBjb25uLT5hbGxvY3B0ci51YWdlbnQgPSBOVUxMOwogICB9CiAKICAgLyogc2V0dXAgdGhlIGF1dGhlbnRpY2F0aW9uIGhlYWRlcnMgKi8KQEAgLTE5MzcsNiArMTkzMyw0OCBAQAogICB9CiAjZW5kaWYKIAorICBzd2l0Y2goaHR0cHJlcSkgeworICBjYXNlIEhUVFBSRVFfUE9TVF9NSU1FOgorICAgIGh0dHAtPnNlbmRpdCA9ICZkYXRhLT5zZXQubWltZXBvc3Q7CisgICAgYnJlYWs7CisgIGNhc2UgSFRUUFJFUV9QT1NUX0ZPUk06CisgICAgLyogQ29udmVydCB0aGUgZm9ybSBzdHJ1Y3R1cmUgaW50byBhIG1pbWUgc3RydWN0dXJlLiAqLworICAgIEN1cmxfbWltZV9jbGVhbnBhcnQoJmh0dHAtPmZvcm0pOworICAgIHJlc3VsdCA9IEN1cmxfZ2V0Zm9ybWRhdGEoZGF0YSwgJmh0dHAtPmZvcm0sIGRhdGEtPnNldC5odHRwcG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnN0YXRlLmZyZWFkX2Z1bmMpOworICAgIGlmKHJlc3VsdCkKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgaHR0cC0+c2VuZGl0ID0gJmh0dHAtPmZvcm07CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgaHR0cC0+c2VuZGl0ID0gTlVMTDsKKyAgfQorCisgIGlmKGh0dHAtPnNlbmRpdCkgeworICAgIGNvbnN0IGNoYXIgKmN0aGRyID0gQ3VybF9jaGVja2hlYWRlcnMoY29ubiwgIkNvbnRlbnQtVHlwZToiKTsKKworICAgIC8qIFJlYWQgYW5kIHNlZWsgYm9keSBvbmx5LiAqLworICAgIGh0dHAtPnNlbmRpdC0+ZmxhZ3MgfD0gTUlNRV9CT0RZX09OTFk7CisKKyAgICAvKiBQcmVwYXJlIHRoZSBtaW1lIHN0cnVjdHVyZSBoZWFkZXJzICYgc2V0IGNvbnRlbnQgdHlwZS4gKi8KKworICAgIGlmKGN0aGRyKQorICAgICAgZm9yKGN0aGRyICs9IDEzOyAqY3RoZHIgPT0gJyAnOyBjdGhkcisrKQorICAgICAgICA7CisgICAgZWxzZSBpZihodHRwLT5zZW5kaXQtPmtpbmQgPT0gTUlNRUtJTkRfTVVMVElQQVJUKQorICAgICAgY3RoZHIgPSAibXVsdGlwYXJ0L2Zvcm0tZGF0YSI7CisKKyAgICBjdXJsX21pbWVfaGVhZGVycyhodHRwLT5zZW5kaXQsIGRhdGEtPnNldC5oZWFkZXJzLCAwKTsKKyAgICByZXN1bHQgPSBDdXJsX21pbWVfcHJlcGFyZV9oZWFkZXJzKGh0dHAtPnNlbmRpdCwgY3RoZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBNSU1FU1RSQVRFR1lfRk9STSk7CisgICAgY3VybF9taW1lX2hlYWRlcnMoaHR0cC0+c2VuZGl0LCBOVUxMLCAwKTsKKyAgICBpZighcmVzdWx0KQorICAgICAgcmVzdWx0ID0gQ3VybF9taW1lX3Jld2luZChodHRwLT5zZW5kaXQpOworICAgIGlmKHJlc3VsdCkKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgaHR0cC0+cG9zdHNpemUgPSBDdXJsX21pbWVfc2l6ZShodHRwLT5zZW5kaXQpOworICB9CisKICAgcHRyID0gQ3VybF9jaGVja2hlYWRlcnMoY29ubiwgIlRyYW5zZmVyLUVuY29kaW5nOiIpOwogICBpZihwdHIpIHsKICAgICAvKiBTb21lIGtpbmQgb2YgVEUgaXMgcmVxdWVzdGVkLCBjaGVjayBpZiAnY2h1bmtlZCcgaXMgY2hvc2VuICovCkBAIC0xOTQ0LDkgKzE5ODIsMTAgQEAKICAgICAgIEN1cmxfY29tcGFyZWhlYWRlcihwdHIsICJUcmFuc2Zlci1FbmNvZGluZzoiLCAiY2h1bmtlZCIpOwogICB9CiAgIGVsc2UgewotICAgIGlmKChjb25uLT5oYW5kbGVyLT5wcm90b2NvbCZQUk9UT19GQU1JTFlfSFRUUCkgJiYKLSAgICAgICBkYXRhLT5zZXQudXBsb2FkICYmCi0gICAgICAgKGRhdGEtPnN0YXRlLmluZmlsZXNpemUgPT0gLTEpKSB7CisgICAgaWYoKGNvbm4tPmhhbmRsZXItPnByb3RvY29sICYgUFJPVE9fRkFNSUxZX0hUVFApICYmCisgICAgICAgKCgoaHR0cHJlcSA9PSBIVFRQUkVRX1BPU1RfTUlNRSB8fCBodHRwcmVxID09IEhUVFBSRVFfUE9TVF9GT1JNKSAmJgorICAgICAgIGh0dHAtPnBvc3RzaXplIDwgMCkgfHwKKyAgICAgICAoZGF0YS0+c2V0LnVwbG9hZCAmJiBkYXRhLT5zdGF0ZS5pbmZpbGVzaXplID09IC0xKSkpIHsKICAgICAgIGlmKGNvbm4tPmJpdHMuYXV0aG5lZykKICAgICAgICAgLyogZG9uJ3QgZW5hYmxlIGNodW5rZWQgZHVyaW5nIGF1dGggbmVnICovCiAgICAgICAgIDsKQEAgLTIwNDQsNyArMjA4Myw3IEBACiAgIH0KIAogI2lmbmRlZiBDVVJMX0RJU0FCTEVfUFJPWFkKLSAgaWYoY29ubi0+Yml0cy5odHRwcHJveHkgJiYgIWNvbm4tPmJpdHMudHVubmVsX3Byb3h5KSAgeworICBpZihjb25uLT5iaXRzLmh0dHBwcm94eSAmJiAhY29ubi0+Yml0cy50dW5uZWxfcHJveHkpIHsKICAgICAvKiBVc2luZyBhIHByb3h5IGJ1dCBkb2VzIG5vdCB0dW5uZWwgdGhyb3VnaCBpdCAqLwogCiAgICAgLyogVGhlIHBhdGggc2VudCB0byB0aGUgcHJveHkgaXMgaW4gZmFjdCB0aGUgZW50aXJlIFVSTC4gQnV0IGlmIHRoZSByZW1vdGUKQEAgLTIxMTgsMjEgKzIxNTcsOSBAQAogICB9CiAjZW5kaWYgLyogQ1VSTF9ESVNBQkxFX1BST1hZICovCiAKLSAgaWYoSFRUUFJFUV9QT1NUX0ZPUk0gPT0gaHR0cHJlcSkgewotICAgIC8qIHdlIG11c3QgYnVpbGQgdGhlIHdob2xlIHBvc3Qgc2VxdWVuY2UgZmlyc3QsIHNvIHRoYXQgd2UgaGF2ZSBhIHNpemUgb2YKLSAgICAgICB0aGUgd2hvbGUgdHJhbnNmZXIgYmVmb3JlIHdlIHN0YXJ0IHRvIHNlbmQgaXQgKi8KLSAgICByZXN1bHQgPSBDdXJsX2dldGZvcm1kYXRhKGRhdGEsICZodHRwLT5zZW5kaXQsIGRhdGEtPnNldC5odHRwcG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cmxfY2hlY2toZWFkZXJzKGNvbm4sICJDb250ZW50LVR5cGU6IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaHR0cC0+cG9zdHNpemUpOwotICAgIGlmKHJlc3VsdCkKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQogICBodHRwLT5wX2FjY2VwdCA9IEN1cmxfY2hlY2toZWFkZXJzKGNvbm4sICJBY2NlcHQ6Iik/TlVMTDoiQWNjZXB0OiAqLypcclxuIjsKIAotICBpZigoIChIVFRQUkVRX1BPU1QgPT0gaHR0cHJlcSkgfHwKLSAgICAgICAoSFRUUFJFUV9QT1NUX0ZPUk0gPT0gaHR0cHJlcSkgfHwKLSAgICAgICAoSFRUUFJFUV9QVVQgPT0gaHR0cHJlcSkgKSAmJgorICBpZigoSFRUUFJFUV9QT1NUID09IGh0dHByZXEgfHwgSFRUUFJFUV9QVVQgPT0gaHR0cHJlcSkgJiYKICAgICAgZGF0YS0+c3RhdGUucmVzdW1lX2Zyb20pIHsKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAqIFJlc3VtaW5nIHVwbG9hZCBpbiBIVFRQIG1lYW5zIHRoYXQgd2UgUFVUIG9yIFBPU1QgYW5kIHRoYXQgd2UgaGF2ZQpAQCAtMjE0MCw2ICsyMTY3LDcgQEAKICAgICAgKiBhIFJhbmdlOiBoZWFkZXIgdGhhdCB3aWxsIGJlIHBhc3NlZCBhbG9uZy4gV2UgbmVlZCB0byAiZmFzdCBmb3J3YXJkIgogICAgICAqIHRoZSBmaWxlIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgYW5kIGRlY3JlYXNlIHRoZSBhc3N1bWUgdXBsb2FkCiAgICAgICogZmlsZSBzaXplIGJlZm9yZSB3ZSBjb250aW51ZSB0aGlzIHZlbnR1cmUgaW4gdGhlIGRhcmsgbGFuZHMgb2YgSFRUUC4KKyAgICAgKiBSZXN1bWluZyBtaW1lL2Zvcm0gcG9zdGluZyBhdCBhbiBvZmZzZXQgPiAwIGhhcyBubyBzZW5zZSBhbmQgaXMgaWdub3JlZC4KICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAgICAgaWYoZGF0YS0+c3RhdGUucmVzdW1lX2Zyb20gPCAwKSB7CkBAIC0yMTYxLDcgKzIxODksNyBAQAogICAgICAgfQogCiAgICAgICBpZihzZWVrZXJyICE9IENVUkxfU0VFS0ZVTkNfT0spIHsKLSAgICAgICAgY3VybF9vZmZfdCBwYXNzZWQ9MDsKKyAgICAgICAgY3VybF9vZmZfdCBwYXNzZWQgPSAwOwogCiAgICAgICAgIGlmKHNlZWtlcnIgIT0gQ1VSTF9TRUVLRlVOQ19DQU5UU0VFSykgewogICAgICAgICAgIGZhaWxmKGRhdGEsICJDb3VsZCBub3Qgc2VlayBzdHJlYW0iKTsKQEAgLTIyMTQsNyArMjI0Miw3IEBACiAgICAgICBjb25uLT5hbGxvY3B0ci5yYW5nZWxpbmUgPSBhcHJpbnRmKCJSYW5nZTogYnl0ZXM9JXNcclxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+c3RhdGUucmFuZ2UpOwogICAgIH0KLSAgICBlbHNlIGlmKChodHRwcmVxICE9IEhUVFBSRVFfR0VUKSAmJgorICAgIGVsc2UgaWYoKGh0dHByZXEgPT0gSFRUUFJFUV9QT1NUIHx8IGh0dHByZXEgPT0gSFRUUFJFUV9QVVQpICYmCiAgICAgICAgICAgICAhQ3VybF9jaGVja2hlYWRlcnMoY29ubiwgIkNvbnRlbnQtUmFuZ2U6IikpIHsKIAogICAgICAgLyogaWYgYSBsaW5lIGxpa2UgdGhpcyB3YXMgYWxyZWFkeSBhbGxvY2F0ZWQsIGZyZWUgdGhlIHByZXZpb3VzIG9uZSAqLwpAQCAtMjIzMiw3ICsyMjYwLDcgQEAKICAgICAgIH0KICAgICAgIGVsc2UgaWYoZGF0YS0+c3RhdGUucmVzdW1lX2Zyb20pIHsKICAgICAgICAgLyogVGhpcyBpcyBiZWNhdXNlICJyZXN1bWUiIHdhcyBzZWxlY3RlZCAqLwotICAgICAgICBjdXJsX29mZl90IHRvdGFsX2V4cGVjdGVkX3NpemU9CisgICAgICAgIGN1cmxfb2ZmX3QgdG90YWxfZXhwZWN0ZWRfc2l6ZSA9CiAgICAgICAgICAgZGF0YS0+c3RhdGUucmVzdW1lX2Zyb20gKyBkYXRhLT5zdGF0ZS5pbmZpbGVzaXplOwogICAgICAgICBjb25uLT5hbGxvY3B0ci5yYW5nZWxpbmUgPQogICAgICAgICAgIGFwcmludGYoIkNvbnRlbnQtUmFuZ2U6IGJ5dGVzICVzJSIgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVApAQCAtMjI2Niw2ICsyMjk0LDkgQEAKICAgaWYocmVzdWx0KQogICAgIHJldHVybiByZXN1bHQ7CiAKKyAgaWYoZGF0YS0+c2V0LnN0cltTVFJJTkdfVEFSR0VUXSkKKyAgICBwcGF0aCA9IGRhdGEtPnNldC5zdHJbU1RSSU5HX1RBUkdFVF07CisKICAgLyogdXJsICovCiAgIGlmKHBhc3RlX2Z0cF91c2VycHdkKQogICAgIHJlc3VsdCA9IEN1cmxfYWRkX2J1ZmZlcmYocmVxX2J1ZmZlciwgImZ0cDovLyVzOiVzQCVzIiwKQEAgLTIzMzksOCArMjM3MCw4IEBACiAKICNpZiAhZGVmaW5lZChDVVJMX0RJU0FCTEVfQ09PS0lFUykKICAgaWYoZGF0YS0+Y29va2llcyB8fCBhZGRjb29raWVzKSB7Ci0gICAgc3RydWN0IENvb2tpZSAqY289TlVMTDsgLyogbm8gY29va2llcyBmcm9tIHN0YXJ0ICovCi0gICAgaW50IGNvdW50PTA7CisgICAgc3RydWN0IENvb2tpZSAqY28gPSBOVUxMOyAvKiBubyBjb29raWVzIGZyb20gc3RhcnQgKi8KKyAgICBpbnQgY291bnQgPSAwOwogCiAgICAgaWYoZGF0YS0+Y29va2llcykgewogICAgICAgQ3VybF9zaGFyZV9sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSwgQ1VSTF9MT0NLX0FDQ0VTU19TSU5HTEUpOwpAQCAtMjM1Myw3ICsyMzg0LDcgQEAKICAgICAgIEN1cmxfc2hhcmVfdW5sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSk7CiAgICAgfQogICAgIGlmKGNvKSB7Ci0gICAgICBzdHJ1Y3QgQ29va2llICpzdG9yZT1jbzsKKyAgICAgIHN0cnVjdCBDb29raWUgKnN0b3JlID0gY287CiAgICAgICAvKiBub3cgbG9vcCB0aHJvdWdoIGFsbCBjb29raWVzIHRoYXQgbWF0Y2hlZCAqLwogICAgICAgd2hpbGUoY28pIHsKICAgICAgICAgaWYoY28tPnZhbHVlKSB7CkBAIC0yNDA3LDEwNyArMjQzOCw2IEBACiAKICAgc3dpdGNoKGh0dHByZXEpIHsKIAotICBjYXNlIEhUVFBSRVFfUE9TVF9GT1JNOgotICAgIGlmKCFodHRwLT5zZW5kaXQgfHwgY29ubi0+Yml0cy5hdXRobmVnKSB7Ci0gICAgICAvKiBub3RoaW5nIHRvIHBvc3QhICovCi0gICAgICByZXN1bHQgPSBDdXJsX2FkZF9idWZmZXJmKHJlcV9idWZmZXIsICJDb250ZW50LUxlbmd0aDogMFxyXG5cclxuIik7Ci0gICAgICBpZihyZXN1bHQpCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAgIHJlc3VsdCA9IEN1cmxfYWRkX2J1ZmZlcl9zZW5kKHJlcV9idWZmZXIsIGNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+aW5mby5yZXF1ZXN0X3NpemUsIDAsIEZJUlNUU09DS0VUKTsKLSAgICAgIGlmKHJlc3VsdCkKLSAgICAgICAgZmFpbGYoZGF0YSwgIkZhaWxlZCBzZW5kaW5nIFBPU1QgcmVxdWVzdCIpOwotICAgICAgZWxzZQotICAgICAgICAvKiBzZXR1cCB2YXJpYWJsZXMgZm9yIHRoZSB1cGNvbWluZyB0cmFuc2ZlciAqLwotICAgICAgICBDdXJsX3NldHVwX3RyYW5zZmVyKGNvbm4sIEZJUlNUU09DS0VULCAtMSwgVFJVRSwgJmh0dHAtPnJlYWRieXRlY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIE5VTEwpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYoQ3VybF9Gb3JtSW5pdCgmaHR0cC0+Zm9ybSwgaHR0cC0+c2VuZGl0KSkgewotICAgICAgZmFpbGYoZGF0YSwgIkludGVybmFsIEhUVFAgUE9TVCBlcnJvciEiKTsKLSAgICAgIHJldHVybiBDVVJMRV9IVFRQX1BPU1RfRVJST1I7Ci0gICAgfQotCi0gICAgLyogR2V0IHRoZSBjdXJyZW50bHkgc2V0IGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIgYW5kIHN0b3JlIHRoYXQgaW4gdGhlCi0gICAgICAgZm9ybSBzdHJ1Y3Qgc2luY2Ugd2UgbWlnaHQgd2FudCB0aGUgYWN0dWFsIHVzZXItcHJvdmlkZWQgY2FsbGJhY2sgbGF0ZXIKLSAgICAgICBvbi4gVGhlIGRhdGEtPnNldC5mcmVhZF9mdW5jIHBvaW50ZXIgaXRzZWxmIHdpbGwgYmUgY2hhbmdlZCBmb3IgdGhlCi0gICAgICAgbXVsdGlwYXJ0IGNhc2UgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIG11bHRpcGFydCBmb3JtYXR0ZWQKLSAgICAgICBzdHJlYW0uICovCi0gICAgaHR0cC0+Zm9ybS5mcmVhZF9mdW5jID0gZGF0YS0+c3RhdGUuZnJlYWRfZnVuYzsKLQotICAgIC8qIFNldCB0aGUgcmVhZCBmdW5jdGlvbiB0byByZWFkIGZyb20gdGhlIGdlbmVyYXRlZCBmb3JtIGRhdGEgKi8KLSAgICBkYXRhLT5zdGF0ZS5mcmVhZF9mdW5jID0gKGN1cmxfcmVhZF9jYWxsYmFjaylDdXJsX0Zvcm1SZWFkZXI7Ci0gICAgZGF0YS0+c3RhdGUuaW4gPSAmaHR0cC0+Zm9ybTsKLQotICAgIGh0dHAtPnNlbmRpbmcgPSBIVFRQU0VORF9CT0RZOwotCi0gICAgaWYoIWRhdGEtPnJlcS51cGxvYWRfY2h1bmt5ICYmCi0gICAgICAgIUN1cmxfY2hlY2toZWFkZXJzKGNvbm4sICJDb250ZW50LUxlbmd0aDoiKSkgewotICAgICAgLyogb25seSBhZGQgQ29udGVudC1MZW5ndGggaWYgbm90IHVwbG9hZGluZyBjaHVua2VkICovCi0gICAgICByZXN1bHQgPSBDdXJsX2FkZF9idWZmZXJmKHJlcV9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb250ZW50LUxlbmd0aDogJSIgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHJcbiIsIGh0dHAtPnBvc3RzaXplKTsKLSAgICAgIGlmKHJlc3VsdCkKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICByZXN1bHQgPSBleHBlY3QxMDAoZGF0YSwgY29ubiwgcmVxX2J1ZmZlcik7Ci0gICAgaWYocmVzdWx0KQotICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgIHsKLQotICAgICAgLyogR2V0IENvbnRlbnQtVHlwZTogbGluZSBmcm9tIEN1cmxfZm9ybXBvc3RoZWFkZXIuCi0gICAgICAgKi8KLSAgICAgIGNoYXIgKmNvbnRlbnRUeXBlOwotICAgICAgc2l6ZV90IGxpbmVsZW5ndGg9MDsKLSAgICAgIGNvbnRlbnRUeXBlID0gQ3VybF9mb3JtcG9zdGhlYWRlcigodm9pZCAqKSZodHRwLT5mb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW5lbGVuZ3RoKTsKLSAgICAgIGlmKCFjb250ZW50VHlwZSkgewotICAgICAgICBmYWlsZihkYXRhLCAiQ291bGQgbm90IGdldCBDb250ZW50LVR5cGUgaGVhZGVyIGxpbmUhIik7Ci0gICAgICAgIHJldHVybiBDVVJMRV9IVFRQX1BPU1RfRVJST1I7Ci0gICAgICB9Ci0KLSAgICAgIHJlc3VsdCA9IEN1cmxfYWRkX2J1ZmZlcihyZXFfYnVmZmVyLCBjb250ZW50VHlwZSwgbGluZWxlbmd0aCk7Ci0gICAgICBpZihyZXN1bHQpCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyogbWFrZSB0aGUgcmVxdWVzdCBlbmQgaW4gYSB0cnVlIENSTEYgKi8KLSAgICByZXN1bHQgPSBDdXJsX2FkZF9idWZmZXIocmVxX2J1ZmZlciwgIlxyXG4iLCAyKTsKLSAgICBpZihyZXN1bHQpCi0gICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgLyogc2V0IHVwbG9hZCBzaXplIHRvIHRoZSBwcm9ncmVzcyBtZXRlciAqLwotICAgIEN1cmxfcGdyc1NldFVwbG9hZFNpemUoZGF0YSwgaHR0cC0+cG9zdHNpemUpOwotCi0gICAgLyogZmlyZSBhd2F5IHRoZSB3aG9sZSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgKi8KLSAgICByZXN1bHQgPSBDdXJsX2FkZF9idWZmZXJfc2VuZChyZXFfYnVmZmVyLCBjb25uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLT5pbmZvLnJlcXVlc3Rfc2l6ZSwgMCwgRklSU1RTT0NLRVQpOwotICAgIGlmKHJlc3VsdCkKLSAgICAgIGZhaWxmKGRhdGEsICJGYWlsZWQgc2VuZGluZyBQT1NUIHJlcXVlc3QiKTsKLSAgICBlbHNlCi0gICAgICAvKiBzZXR1cCB2YXJpYWJsZXMgZm9yIHRoZSB1cGNvbWluZyB0cmFuc2ZlciAqLwotICAgICAgQ3VybF9zZXR1cF90cmFuc2Zlcihjb25uLCBGSVJTVFNPQ0tFVCwgLTEsIFRSVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZodHRwLT5yZWFkYnl0ZWNvdW50LCBGSVJTVFNPQ0tFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmh0dHAtPndyaXRlYnl0ZWNvdW50KTsKLQotICAgIGlmKHJlc3VsdCkgewotICAgICAgQ3VybF9mb3JtY2xlYW4oJmh0dHAtPnNlbmRpdCk7IC8qIGZyZWUgdGhhdCB3aG9sZSBsb3QgKi8KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyogY29udmVydCB0aGUgZm9ybSBkYXRhICovCi0gICAgcmVzdWx0ID0gQ3VybF9jb252ZXJ0X2Zvcm0oZGF0YSwgaHR0cC0+c2VuZGl0KTsKLSAgICBpZihyZXN1bHQpIHsKLSAgICAgIEN1cmxfZm9ybWNsZWFuKCZodHRwLT5zZW5kaXQpOyAvKiBmcmVlIHRoYXQgd2hvbGUgbG90ICovCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIGJyZWFrOwotCiAgIGNhc2UgSFRUUFJFUV9QVVQ6IC8qIExldCdzIFBVVCB0aGUgZGF0YSB0byB0aGUgc2VydmVyISAqLwogCiAgICAgaWYoY29ubi0+Yml0cy5hdXRobmVnKQpAQCAtMjU1Miw2ICsyNDgyLDk4IEBACiAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIGJyZWFrOwogCisgIGNhc2UgSFRUUFJFUV9QT1NUX0ZPUk06CisgIGNhc2UgSFRUUFJFUV9QT1NUX01JTUU6CisgICAgLyogVGhpcyBpcyBmb3JtIHBvc3RpbmcgdXNpbmcgbWltZSBkYXRhLiAqLworICAgIGlmKGNvbm4tPmJpdHMuYXV0aG5lZykgeworICAgICAgLyogbm90aGluZyB0byBwb3N0ISAqLworICAgICAgcmVzdWx0ID0gQ3VybF9hZGRfYnVmZmVyZihyZXFfYnVmZmVyLCAiQ29udGVudC1MZW5ndGg6IDBcclxuXHJcbiIpOworICAgICAgaWYocmVzdWx0KQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgICByZXN1bHQgPSBDdXJsX2FkZF9idWZmZXJfc2VuZChyZXFfYnVmZmVyLCBjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEtPmluZm8ucmVxdWVzdF9zaXplLCAwLCBGSVJTVFNPQ0tFVCk7CisgICAgICBpZihyZXN1bHQpCisgICAgICAgIGZhaWxmKGRhdGEsICJGYWlsZWQgc2VuZGluZyBQT1NUIHJlcXVlc3QiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgLyogc2V0dXAgdmFyaWFibGVzIGZvciB0aGUgdXBjb21pbmcgdHJhbnNmZXIgKi8KKyAgICAgICAgQ3VybF9zZXR1cF90cmFuc2Zlcihjb25uLCBGSVJTVFNPQ0tFVCwgLTEsIFRSVUUsICZodHRwLT5yZWFkYnl0ZWNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHBvc3RzaXplID0gaHR0cC0+cG9zdHNpemU7CisKKyAgICAvKiBXZSBvbmx5IHNldCBDb250ZW50LUxlbmd0aCBhbmQgYWxsb3cgYSBjdXN0b20gQ29udGVudC1MZW5ndGggaWYKKyAgICAgICB3ZSBkb24ndCB1cGxvYWQgZGF0YSBjaHVua2VkLCBhcyBSRkMyNjE2IGZvcmJpZHMgdXMgdG8gc2V0IGJvdGgKKyAgICAgICBraW5kcyBvZiBoZWFkZXJzIChUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCBhbmQgQ29udGVudC1MZW5ndGgpICovCisgICAgaWYocG9zdHNpemUgIT0gLTEgJiYgIWRhdGEtPnJlcS51cGxvYWRfY2h1bmt5ICYmCisgICAgICAgKGNvbm4tPmJpdHMuYXV0aG5lZyB8fCAhQ3VybF9jaGVja2hlYWRlcnMoY29ubiwgIkNvbnRlbnQtTGVuZ3RoOiIpKSkgeworICAgICAgLyogd2UgYWxsb3cgcmVwbGFjaW5nIHRoaXMgaGVhZGVyIGlmIG5vdCBkdXJpbmcgYXV0aCBuZWdvdGlhdGlvbiwKKyAgICAgICAgIGFsdGhvdWdoIGl0IGlzbid0IHZlcnkgd2lzZSB0byBhY3R1YWxseSBzZXQgeW91ciBvd24gKi8KKyAgICAgIHJlc3VsdCA9IEN1cmxfYWRkX2J1ZmZlcmYocmVxX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAlIiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcclxuIiwgcG9zdHNpemUpOworICAgICAgaWYocmVzdWx0KQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qIE91dHB1dCBtaW1lLWdlbmVyYXRlZCBoZWFkZXJzLiAqLworICAgIHsKKyAgICAgIHN0cnVjdCBjdXJsX3NsaXN0ICpoZHI7CisKKyAgICAgIGZvcihoZHIgPSBodHRwLT5zZW5kaXQtPmN1cmxoZWFkZXJzOyBoZHI7IGhkciA9IGhkci0+bmV4dCkgeworICAgICAgICByZXN1bHQgPSBDdXJsX2FkZF9idWZmZXJmKHJlcV9idWZmZXIsICIlc1xyXG4iLCBoZHItPmRhdGEpOworICAgICAgICBpZihyZXN1bHQpCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGb3IgcmVhbGx5IHNtYWxsIHBvc3RzIHdlIGRvbid0IHVzZSBFeHBlY3Q6IGhlYWRlcnMgYXQgYWxsLCBhbmQgZm9yCisgICAgICAgdGhlIHNvbWV3aGF0IGJpZ2dlciBvbmVzIHdlIGFsbG93IHRoZSBhcHAgdG8gZGlzYWJsZSBpdC4gSnVzdCBtYWtlCisgICAgICAgc3VyZSB0aGF0IHRoZSBleHBlY3QxMDBoZWFkZXIgaXMgYWx3YXlzIHNldCB0byB0aGUgcHJlZmVycmVkIHZhbHVlCisgICAgICAgaGVyZS4gKi8KKyAgICBwdHIgPSBDdXJsX2NoZWNraGVhZGVycyhjb25uLCAiRXhwZWN0OiIpOworICAgIGlmKHB0cikgeworICAgICAgZGF0YS0+c3RhdGUuZXhwZWN0MTAwaGVhZGVyID0KKyAgICAgICAgQ3VybF9jb21wYXJlaGVhZGVyKHB0ciwgIkV4cGVjdDoiLCAiMTAwLWNvbnRpbnVlIik7CisgICAgfQorICAgIGVsc2UgaWYocG9zdHNpemUgPiBFWFBFQ1RfMTAwX1RIUkVTSE9MRCB8fCBwb3N0c2l6ZSA8IDApIHsKKyAgICAgIHJlc3VsdCA9IGV4cGVjdDEwMChkYXRhLCBjb25uLCByZXFfYnVmZmVyKTsKKyAgICAgIGlmKHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgZWxzZQorICAgICAgZGF0YS0+c3RhdGUuZXhwZWN0MTAwaGVhZGVyID0gRkFMU0U7CisKKyAgICAvKiBtYWtlIHRoZSByZXF1ZXN0IGVuZCBpbiBhIHRydWUgQ1JMRiAqLworICAgIHJlc3VsdCA9IEN1cmxfYWRkX2J1ZmZlcihyZXFfYnVmZmVyLCAiXHJcbiIsIDIpOworICAgIGlmKHJlc3VsdCkKKyAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAvKiBzZXQgdGhlIHVwbG9hZCBzaXplIHRvIHRoZSBwcm9ncmVzcyBtZXRlciAqLworICAgIEN1cmxfcGdyc1NldFVwbG9hZFNpemUoZGF0YSwgcG9zdHNpemUpOworCisgICAgLyogUmVhZCBmcm9tIG1pbWUgc3RydWN0dXJlLiAqLworICAgIGRhdGEtPnN0YXRlLmZyZWFkX2Z1bmMgPSAoY3VybF9yZWFkX2NhbGxiYWNrKSBDdXJsX21pbWVfcmVhZDsKKyAgICBkYXRhLT5zdGF0ZS5pbiA9ICh2b2lkICopIGh0dHAtPnNlbmRpdDsKKyAgICBodHRwLT5zZW5kaW5nID0gSFRUUFNFTkRfQk9EWTsKKworICAgIC8qIHRoaXMgc2VuZHMgdGhlIGJ1ZmZlciBhbmQgZnJlZXMgYWxsIHRoZSBidWZmZXIgcmVzb3VyY2VzICovCisgICAgcmVzdWx0ID0gQ3VybF9hZGRfYnVmZmVyX3NlbmQocmVxX2J1ZmZlciwgY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+aW5mby5yZXF1ZXN0X3NpemUsIDAsIEZJUlNUU09DS0VUKTsKKyAgICBpZihyZXN1bHQpCisgICAgICBmYWlsZihkYXRhLCAiRmFpbGVkIHNlbmRpbmcgUE9TVCByZXF1ZXN0Iik7CisgICAgZWxzZQorICAgICAgLyogcHJlcGFyZSBmb3IgdHJhbnNmZXIgKi8KKyAgICAgIEN1cmxfc2V0dXBfdHJhbnNmZXIoY29ubiwgRklSU1RTT0NLRVQsIC0xLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaHR0cC0+cmVhZGJ5dGVjb3VudCwgcG9zdHNpemU/RklSU1RTT0NLRVQ6LTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RzaXplPyZodHRwLT53cml0ZWJ5dGVjb3VudDpOVUxMKTsKKyAgICBpZihyZXN1bHQpCisgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgYnJlYWs7CisKICAgY2FzZSBIVFRQUkVRX1BPU1Q6CiAgICAgLyogdGhpcyBpcyB0aGUgc2ltcGxlIFBPU1QsIHVzaW5nIHgtd3d3LWZvcm0tdXJsZW5jb2RlZCBzdHlsZSAqLwogCkBAIC0yNTkyLDcgKzI2MTQsNyBAQAogICAgICAgZGF0YS0+c3RhdGUuZXhwZWN0MTAwaGVhZGVyID0KICAgICAgICAgQ3VybF9jb21wYXJlaGVhZGVyKHB0ciwgIkV4cGVjdDoiLCAiMTAwLWNvbnRpbnVlIik7CiAgICAgfQotICAgIGVsc2UgaWYocG9zdHNpemUgPiBUSU5ZX0lOSVRJQUxfUE9TVF9TSVpFIHx8IHBvc3RzaXplIDwgMCkgeworICAgIGVsc2UgaWYocG9zdHNpemUgPiBFWFBFQ1RfMTAwX1RIUkVTSE9MRCB8fCBwb3N0c2l6ZSA8IDApIHsKICAgICAgIHJlc3VsdCA9IGV4cGVjdDEwMChkYXRhLCBjb25uLCByZXFfYnVmZmVyKTsKICAgICAgIGlmKHJlc3VsdCkKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTI2MDYsNyArMjYyOCw3IEBACiAgICAgICAgICBpdHMgc2l6ZS4gKi8KICAgICAgIGlmKGNvbm4tPmh0dHB2ZXJzaW9uICE9IDIwICYmCiAgICAgICAgICAhZGF0YS0+c3RhdGUuZXhwZWN0MTAwaGVhZGVyICYmCi0gICAgICAgICAocG9zdHNpemUgPCBNQVhfSU5JVElBTF9QT1NUX1NJWkUpKSAgeworICAgICAgICAgKHBvc3RzaXplIDwgTUFYX0lOSVRJQUxfUE9TVF9TSVpFKSkgewogICAgICAgICAvKiBpZiB3ZSBkb24ndCB1c2UgZXhwZWN0OiAxMDAgIEFORAogICAgICAgICAgICBwb3N0c2l6ZSBpcyBsZXNzIHRoYW4gTUFYX0lOSVRJQUxfUE9TVF9TSVpFCiAKQEAgLTI3NzEsNyArMjc5Myw3IEBACiAgICAgZmFpbGYoZGF0YSwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbnZlcnNpb24hIik7CiAgICAgcmV0dXJuIEZBTFNFOyAvKiBjYW4ndCByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWSBzbyByZXR1cm4gRkFMU0UgKi8KICAgfQotICBpZihDVVJMRV9PSyAhPSBDdXJsX2NvbnZlcnRfZnJvbV9uZXR3b3JrKGRhdGEsIHNjcmF0Y2gsIHN0cmxlbihzKSsxKSkgeworICBpZihDVVJMRV9PSyAhPSBDdXJsX2NvbnZlcnRfZnJvbV9uZXR3b3JrKGRhdGEsIHNjcmF0Y2gsIHN0cmxlbihzKSArIDEpKSB7CiAgICAgLyogQ3VybF9jb252ZXJ0X2Zyb21fbmV0d29yayBjYWxscyBmYWlsZiBpZiB1bnN1Y2Nlc3NmdWwgKi8KICAgICBmcmVlKHNjcmF0Y2gpOwogICAgIHJldHVybiBGQUxTRTsgLyogY2FuJ3QgcmV0dXJuIENVUkxFX2Zvb2JhciBzbyByZXR1cm4gRkFMU0UgKi8KQEAgLTI4MDEsNiArMjgyMyw3IEBACiBjaGVja3J0c3BwcmVmaXgoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzKQogeworICBib29sIHJlc3VsdCA9IEZBTFNFOwogCiAjaWZkZWYgQ1VSTF9ET0VTX0NPTlZFUlNJT05TCiAgIC8qIGNvbnZlcnQgZnJvbSB0aGUgbmV0d29yayBlbmNvZGluZyB1c2luZyBhIHNjcmF0Y2ggYXJlYSAqLwpAQCAtMjgwOSwxOCArMjgzMiwxOSBAQAogICAgIGZhaWxmKGRhdGEsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBjb252ZXJzaW9uISIpOwogICAgIHJldHVybiBGQUxTRTsgLyogY2FuJ3QgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlkgc28gcmV0dXJuIEZBTFNFICovCiAgIH0KLSAgaWYoQ1VSTEVfT0sgIT0gQ3VybF9jb252ZXJ0X2Zyb21fbmV0d29yayhkYXRhLCBzY3JhdGNoLCBzdHJsZW4ocykrMSkpIHsKKyAgaWYoQ1VSTEVfT0sgIT0gQ3VybF9jb252ZXJ0X2Zyb21fbmV0d29yayhkYXRhLCBzY3JhdGNoLCBzdHJsZW4ocykgKyAxKSkgewogICAgIC8qIEN1cmxfY29udmVydF9mcm9tX25ldHdvcmsgY2FsbHMgZmFpbGYgaWYgdW5zdWNjZXNzZnVsICovCi0gICAgZnJlZShzY3JhdGNoKTsKLSAgICByZXR1cm4gRkFMU0U7IC8qIGNhbid0IHJldHVybiBDVVJMRV9mb29iYXIgc28gcmV0dXJuIEZBTFNFICovCisgICAgcmVzdWx0ID0gRkFMU0U7IC8qIGNhbid0IHJldHVybiBDVVJMRV9mb29iYXIgc28gcmV0dXJuIEZBTFNFICovCiAgIH0KLSAgcyA9IHNjcmF0Y2g7CisgIGVsc2UKKyAgICByZXN1bHQgPSBjaGVja3ByZWZpeCgiUlRTUC8iLCBzY3JhdGNoKT8gVFJVRTogRkFMU0U7CisgIGZyZWUoc2NyYXRjaCk7CiAjZWxzZQogICAodm9pZClkYXRhOyAvKiB1bnVzZWQgKi8KKyAgcmVzdWx0ID0gY2hlY2twcmVmaXgoIlJUU1AvIiwgcyk/IFRSVUU6IEZBTFNFOwogI2VuZGlmIC8qIENVUkxfRE9FU19DT05WRVJTSU9OUyAqLwotICBpZihjaGVja3ByZWZpeCgiUlRTUC8iLCBzKSkKLSAgICByZXR1cm4gVFJVRTsKLSAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiByZXN1bHQ7CiB9CiAjZW5kaWYgLyogQ1VSTF9ESVNBQkxFX1JUU1AgKi8KIApAQCAtMjg2MiwxNCArMjg4NiwxNCBAQAogICAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CiAgICAgfQogCi0gICAgbmV3c2l6ZT1DVVJMTUFYKChrLT5oYnVmbGVuKyBsZW5ndGgpKjMvMiwgZGF0YS0+c3RhdGUuaGVhZGVyc2l6ZSoyKTsKKyAgICBuZXdzaXplID0gQ1VSTE1BWCgoay0+aGJ1ZmxlbiArIGxlbmd0aCkgKiAzIC8gMiwgZGF0YS0+c3RhdGUuaGVhZGVyc2l6ZSoyKTsKICAgICBoYnVmcF9pbmRleCA9IGstPmhidWZwIC0gZGF0YS0+c3RhdGUuaGVhZGVyYnVmZjsKICAgICBuZXdidWZmID0gcmVhbGxvYyhkYXRhLT5zdGF0ZS5oZWFkZXJidWZmLCBuZXdzaXplKTsKICAgICBpZighbmV3YnVmZikgewogICAgICAgZmFpbGYoZGF0YSwgIkZhaWxlZCB0byBhbGxvYyBtZW1vcnkgZm9yIGJpZyBoZWFkZXIhIik7CiAgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgICB9Ci0gICAgZGF0YS0+c3RhdGUuaGVhZGVyc2l6ZT1uZXdzaXplOworICAgIGRhdGEtPnN0YXRlLmhlYWRlcnNpemUgPSBuZXdzaXplOwogICAgIGRhdGEtPnN0YXRlLmhlYWRlcmJ1ZmYgPSBuZXdidWZmOwogICAgIGstPmhidWZwID0gZGF0YS0+c3RhdGUuaGVhZGVyYnVmZiArIGhidWZwX2luZGV4OwogICB9CkBAIC0yOTYyLDcgKzI5ODYsNyBAQAogICAgIH0KIAogICAgIC8qIGRlY3JlYXNlIHRoZSBzaXplIG9mIHRoZSByZW1haW5pbmcgKHN1cHBvc2VkKSBoZWFkZXIgbGluZSAqLwotICAgIHJlc3RfbGVuZ3RoID0gKGstPmVuZF9wdHIgLSBrLT5zdHIpKzE7CisgICAgcmVzdF9sZW5ndGggPSAoay0+ZW5kX3B0ciAtIGstPnN0cikgKyAxOwogICAgICpucmVhZCAtPSAoc3NpemVfdClyZXN0X2xlbmd0aDsKIAogICAgIGstPnN0ciA9IGstPmVuZF9wdHIgKyAxOyAvKiBtb3ZlIHBhc3QgbmV3IGxpbmUgKi8KQEAgLTMxNjEsNiArMzE4NSw3IEBACiAgICAgICAgICAgY2FzZSBIVFRQUkVRX1BVVDoKICAgICAgICAgICBjYXNlIEhUVFBSRVFfUE9TVDoKICAgICAgICAgICBjYXNlIEhUVFBSRVFfUE9TVF9GT1JNOgorICAgICAgICAgIGNhc2UgSFRUUFJFUV9QT1NUX01JTUU6CiAgICAgICAgICAgICAvKiBXZSBnb3QgYW4gZXJyb3IgcmVzcG9uc2UuIElmIHRoaXMgaGFwcGVuZWQgYmVmb3JlIHRoZSB3aG9sZQogICAgICAgICAgICAgICogcmVxdWVzdCBib2R5IGhhcyBiZWVuIHNlbnQgd2Ugc3RvcCBzZW5kaW5nIGFuZCBtYXJrIHRoZQogICAgICAgICAgICAgICogY29ubmVjdGlvbiBmb3IgY2xvc3VyZSBhZnRlciB3ZSd2ZSByZWFkIHRoZSBlbnRpcmUgcmVzcG9uc2UuCkBAIC0zMjg4LDcgKzMzMTMsNyBAQAogI2RlZmluZSBIRUFERVIxIHNjcmF0Y2gKICNkZWZpbmUgU0NSQVRDSFNJWkUgMjEKICAgICAgIENVUkxjb2RlIHJlczsKLSAgICAgIGNoYXIgc2NyYXRjaFtTQ1JBVENIU0laRSsxXTsgLyogIkhUVFAvbWFqb3IubWlub3IgMTIzIiAqLworICAgICAgY2hhciBzY3JhdGNoW1NDUkFUQ0hTSVpFICsgMV07IC8qICJIVFRQL21ham9yLm1pbm9yIDEyMyIgKi8KICAgICAgIC8qIFdlIGNhbid0IHJlYWxseSBjb252ZXJ0IHRoaXMgeWV0IGJlY2F1c2Ugd2UKICAgICAgICAgIGRvbid0IGtub3cgaWYgaXQncyB0aGUgMXN0IGhlYWRlciBsaW5lIG9yIHRoZSBib2R5LgogICAgICAgICAgU28gd2UgZG8gYSBwYXJ0aWFsIGNvbnZlcnNpb24gaW50byBhIHNjcmF0Y2ggYXJlYSwKQEAgLTMzMTQsMTkgKzMzMzksMjIgQEAKICAgICAgICAgICogc2F5cy4gV2UgdHJ5IHRvIGFsbG93IGFueSBudW1iZXIgaGVyZSwgYnV0IHdlIGNhbm5vdCBtYWtlCiAgICAgICAgICAqIGd1YXJhbnRlZXMgb24gZnV0dXJlIGJlaGF2aW9ycyBzaW5jZSBpdCBpc24ndCB3aXRoaW4gdGhlIHByb3RvY29sLgogICAgICAgICAgKi8KKyAgICAgICAgY2hhciBzZXBhcmF0b3I7CiAgICAgICAgIG5jID0gc3NjYW5mKEhFQURFUjEsCi0gICAgICAgICAgICAgICAgICAgICIgSFRUUC8lZC4lZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICIgSFRUUC8lMWQuJTFkJWMlM2QiLAogICAgICAgICAgICAgICAgICAgICAmaHR0cHZlcnNpb25fbWFqb3IsCiAgICAgICAgICAgICAgICAgICAgICZjb25uLT5odHRwdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgJnNlcGFyYXRvciwKICAgICAgICAgICAgICAgICAgICAgJmstPmh0dHBjb2RlKTsKIAogICAgICAgICBpZihuYyA9PSAxICYmIGh0dHB2ZXJzaW9uX21ham9yID09IDIgJiYKICAgICAgICAgICAgMSA9PSBzc2NhbmYoSEVBREVSMSwgIiBIVFRQLzIgJWQiLCAmay0+aHR0cGNvZGUpKSB7CiAgICAgICAgICAgY29ubi0+aHR0cHZlcnNpb24gPSAwOwotICAgICAgICAgIG5jID0gMzsKKyAgICAgICAgICBuYyA9IDQ7CisgICAgICAgICAgc2VwYXJhdG9yID0gJyAnOwogICAgICAgICB9CiAKLSAgICAgICAgaWYobmM9PTMpIHsKKyAgICAgICAgaWYoKG5jID09IDQpICYmICgnICcgPT0gc2VwYXJhdG9yKSkgewogICAgICAgICAgIGNvbm4tPmh0dHB2ZXJzaW9uICs9IDEwICogaHR0cHZlcnNpb25fbWFqb3I7CiAKICAgICAgICAgICBpZihrLT51cGdyMTAxID09IFVQR1IxMDFfUkVDRUlWRUQpIHsKQEAgLTMzMzUsMTEgKzMzNjMsMTEgQEAKICAgICAgICAgICAgICAgaW5mb2YoZGF0YSwgIkx5aW5nIHNlcnZlciwgbm90IHNlcnZpbmcgSFRUUC8yXG4iKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgIGVsc2UgaWYoIW5jKSB7CiAgICAgICAgICAgLyogdGhpcyBpcyB0aGUgcmVhbCB3b3JsZCwgbm90IGEgTmlydmFuYQogICAgICAgICAgICAgIE5DU0EgMS41LnggcmV0dXJucyB0aGlzIGNyYXAgd2hlbiBhc2tlZCBmb3IgSFRUUC8xLjEKICAgICAgICAgICAqLwotICAgICAgICAgIG5jPXNzY2FuZihIRUFERVIxLCAiIEhUVFAgJTNkIiwgJmstPmh0dHBjb2RlKTsKKyAgICAgICAgICBuYyA9IHNzY2FuZihIRUFERVIxLCAiIEhUVFAgJTNkIiwgJmstPmh0dHBjb2RlKTsKICAgICAgICAgICBjb25uLT5odHRwdmVyc2lvbiA9IDEwOwogCiAgICAgICAgICAgLyogSWYgdXNlciBoYXMgc2V0IG9wdGlvbiBIVFRQMjAwQUxJQVNFUywKQEAgLTMzNTMsNiArMzM4MSwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBmYWlsZihkYXRhLCAiVW5zdXBwb3J0ZWQgSFRUUCB2ZXJzaW9uIGluIHJlc3BvbnNlXG4iKTsKKyAgICAgICAgICByZXR1cm4gQ1VSTEVfVU5TVVBQT1JURURfUFJPVE9DT0w7CisgICAgICAgIH0KICAgICAgIH0KICAgICAgIGVsc2UgaWYoY29ubi0+aGFuZGxlci0+cHJvdG9jb2wgJiBDVVJMUFJPVE9fUlRTUCkgewogICAgICAgICBuYyA9IHNzY2FuZihIRUFERVIxLApAQCAtMzM2MCw3ICszMzkyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgJnJ0c3B2ZXJzaW9uX21ham9yLAogICAgICAgICAgICAgICAgICAgICAmY29ubi0+cnRzcHZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICZrLT5odHRwY29kZSk7Ci0gICAgICAgIGlmKG5jPT0zKSB7CisgICAgICAgIGlmKG5jID09IDMpIHsKICAgICAgICAgICBjb25uLT5ydHNwdmVyc2lvbiArPSAxMCAqIHJ0c3B2ZXJzaW9uX21ham9yOwogICAgICAgICAgIGNvbm4tPmh0dHB2ZXJzaW9uID0gMTE7IC8qIEZvciB1cywgUlRTUCBhY3RzIGxpa2UgSFRUUCAxLjEgKi8KICAgICAgICAgfQpAQCAtMzM5Miw3ICszNDI0LDcgQEAKICAgICAgICAgICAgKChrLT5odHRwY29kZSAhPSA0MDcpIHx8ICFjb25uLT5iaXRzLnByb3h5X3VzZXJfcGFzc3dkKSApIHsKIAogICAgICAgICAgIGlmKGRhdGEtPnN0YXRlLnJlc3VtZV9mcm9tICYmCi0gICAgICAgICAgICAgKGRhdGEtPnNldC5odHRwcmVxPT1IVFRQUkVRX0dFVCkgJiYKKyAgICAgICAgICAgICAoZGF0YS0+c2V0Lmh0dHByZXEgPT0gSFRUUFJFUV9HRVQpICYmCiAgICAgICAgICAgICAgKGstPmh0dHBjb2RlID09IDQxNikpIHsKICAgICAgICAgICAgIC8qICJSZXF1ZXN0ZWQgUmFuZ2UgTm90IFNhdGlzZmlhYmxlIiwganVzdCBwcm9jZWVkIGFuZAogICAgICAgICAgICAgICAgcHJldGVuZCB0aGlzIGlzIG5vIGVycm9yICovCkBAIC0zNDQ4LDggKzM0ODAsOCBAQAogICAgICAgICAgICAqIGZpZWxkcy4gICovCiAgICAgICAgICAgaWYoZGF0YS0+c2V0LnRpbWVjb25kaXRpb24pCiAgICAgICAgICAgICBkYXRhLT5pbmZvLnRpbWVjb25kID0gVFJVRTsKLSAgICAgICAgICBrLT5zaXplPTA7Ci0gICAgICAgICAgay0+bWF4ZG93bmxvYWQ9MDsKKyAgICAgICAgICBrLT5zaXplID0gMDsKKyAgICAgICAgICBrLT5tYXhkb3dubG9hZCA9IDA7CiAgICAgICAgICAgay0+aWdub3JlY2wgPSBUUlVFOyAvKiBpZ25vcmUgQ29udGVudC1MZW5ndGggaGVhZGVycyAqLwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtMzQ3MSwyOCArMzUwMywzMiBAQAogICAgIC8qIENoZWNrIGZvciBDb250ZW50LUxlbmd0aDogaGVhZGVyIGxpbmVzIHRvIGdldCBzaXplICovCiAgICAgaWYoIWstPmlnbm9yZWNsICYmICFkYXRhLT5zZXQuaWdub3JlY2wgJiYKICAgICAgICBjaGVja3ByZWZpeCgiQ29udGVudC1MZW5ndGg6Iiwgay0+cCkpIHsKLSAgICAgIGN1cmxfb2ZmX3QgY29udGVudGxlbmd0aCA9IGN1cmx4X3N0cnRvb2ZmdChrLT5wKzE1LCBOVUxMLCAxMCk7Ci0gICAgICBpZihkYXRhLT5zZXQubWF4X2ZpbGVzaXplICYmCi0gICAgICAgICBjb250ZW50bGVuZ3RoID4gZGF0YS0+c2V0Lm1heF9maWxlc2l6ZSkgewotICAgICAgICBmYWlsZihkYXRhLCAiTWF4aW11bSBmaWxlIHNpemUgZXhjZWVkZWQiKTsKLSAgICAgICAgcmV0dXJuIENVUkxFX0ZJTEVTSVpFX0VYQ0VFREVEOworICAgICAgY3VybF9vZmZfdCBjb250ZW50bGVuZ3RoOworICAgICAgaWYoIWN1cmx4X3N0cnRvb2ZmdChrLT5wICsgMTUsIE5VTEwsIDEwLCAmY29udGVudGxlbmd0aCkpIHsKKyAgICAgICAgaWYoZGF0YS0+c2V0Lm1heF9maWxlc2l6ZSAmJgorICAgICAgICAgICBjb250ZW50bGVuZ3RoID4gZGF0YS0+c2V0Lm1heF9maWxlc2l6ZSkgeworICAgICAgICAgIGZhaWxmKGRhdGEsICJNYXhpbXVtIGZpbGUgc2l6ZSBleGNlZWRlZCIpOworICAgICAgICAgIHJldHVybiBDVVJMRV9GSUxFU0laRV9FWENFRURFRDsKKyAgICAgICAgfQorICAgICAgICBpZihjb250ZW50bGVuZ3RoID49IDApIHsKKyAgICAgICAgICBrLT5zaXplID0gY29udGVudGxlbmd0aDsKKyAgICAgICAgICBrLT5tYXhkb3dubG9hZCA9IGstPnNpemU7CisgICAgICAgICAgLyogd2Ugc2V0IHRoZSBwcm9ncmVzcyBkb3dubG9hZCBzaXplIGFscmVhZHkgYXQgdGhpcyBwb2ludAorICAgICAgICAgICAgIGp1c3QgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIGFwcHMvY2FsbGJhY2tzIHRvIGV4dHJhY3QgdGhpcworICAgICAgICAgICAgIGluZm8gYXMgc29vbiBhcyBwb3NzaWJsZSAqLworICAgICAgICAgIEN1cmxfcGdyc1NldERvd25sb2FkU2l6ZShkYXRhLCBrLT5zaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvKiBOZWdhdGl2ZSBDb250ZW50LUxlbmd0aCBpcyByZWFsbHkgb2RkLCBhbmQgd2Uga25vdyBpdAorICAgICAgICAgICAgIGhhcHBlbnMgZm9yIGV4YW1wbGUgd2hlbiBvbGRlciBBcGFjaGUgc2VydmVycyBzZW5kIGxhcmdlCisgICAgICAgICAgICAgZmlsZXMgKi8KKyAgICAgICAgICBzdHJlYW1jbG9zZShjb25uLCAibmVnYXRpdmUgY29udGVudC1sZW5ndGgiKTsKKyAgICAgICAgICBpbmZvZihkYXRhLCAiTmVnYXRpdmUgY29udGVudC1sZW5ndGg6ICUiIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QKKyAgICAgICAgICAgICAgICAiLCBjbG9zaW5nIGFmdGVyIHRyYW5zZmVyXG4iLCBjb250ZW50bGVuZ3RoKTsKKyAgICAgICAgfQogICAgICAgfQotICAgICAgaWYoY29udGVudGxlbmd0aCA+PSAwKSB7Ci0gICAgICAgIGstPnNpemUgPSBjb250ZW50bGVuZ3RoOwotICAgICAgICBrLT5tYXhkb3dubG9hZCA9IGstPnNpemU7Ci0gICAgICAgIC8qIHdlIHNldCB0aGUgcHJvZ3Jlc3MgZG93bmxvYWQgc2l6ZSBhbHJlYWR5IGF0IHRoaXMgcG9pbnQKLSAgICAgICAgICAganVzdCB0byBtYWtlIGl0IGVhc2llciBmb3IgYXBwcy9jYWxsYmFja3MgdG8gZXh0cmFjdCB0aGlzCi0gICAgICAgICAgIGluZm8gYXMgc29vbiBhcyBwb3NzaWJsZSAqLwotICAgICAgICBDdXJsX3BncnNTZXREb3dubG9hZFNpemUoZGF0YSwgay0+c2l6ZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgLyogTmVnYXRpdmUgQ29udGVudC1MZW5ndGggaXMgcmVhbGx5IG9kZCwgYW5kIHdlIGtub3cgaXQKLSAgICAgICAgICAgaGFwcGVucyBmb3IgZXhhbXBsZSB3aGVuIG9sZGVyIEFwYWNoZSBzZXJ2ZXJzIHNlbmQgbGFyZ2UKLSAgICAgICAgICAgZmlsZXMgKi8KLSAgICAgICAgc3RyZWFtY2xvc2UoY29ubiwgIm5lZ2F0aXZlIGNvbnRlbnQtbGVuZ3RoIik7Ci0gICAgICAgIGluZm9mKGRhdGEsICJOZWdhdGl2ZSBjb250ZW50LWxlbmd0aDogJSIgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVAotICAgICAgICAgICAgICAiLCBjbG9zaW5nIGFmdGVyIHRyYW5zZmVyXG4iLCBjb250ZW50bGVuZ3RoKTsKLSAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgaW5mb2YoZGF0YSwgIklsbGVnYWwgQ29udGVudC1MZW5ndGg6IGhlYWRlclxuIik7CiAgICAgfQogICAgIC8qIGNoZWNrIGZvciBDb250ZW50LVR5cGU6IGhlYWRlciBsaW5lcyB0byBnZXQgdGhlIE1JTUUtdHlwZSAqLwogICAgIGVsc2UgaWYoY2hlY2twcmVmaXgoIkNvbnRlbnQtVHlwZToiLCBrLT5wKSkgewpAQCAtMzY2NywxMSArMzcwMywxMSBAQAogCiAgICAgICAvKiBpZiBpdCB0cnVseSBzdG9wcGVkIG9uIGEgZGlnaXQgKi8KICAgICAgIGlmKElTRElHSVQoKnB0cikpIHsKLSAgICAgICAgay0+b2Zmc2V0ID0gY3VybHhfc3RydG9vZmZ0KHB0ciwgTlVMTCwgMTApOwotCi0gICAgICAgIGlmKGRhdGEtPnN0YXRlLnJlc3VtZV9mcm9tID09IGstPm9mZnNldCkKLSAgICAgICAgICAvKiB3ZSBhc2tlZCBmb3IgYSByZXN1bWUgYW5kIHdlIGdvdCBpdCAqLwotICAgICAgICAgIGstPmNvbnRlbnRfcmFuZ2UgPSBUUlVFOworICAgICAgICBpZighY3VybHhfc3RydG9vZmZ0KHB0ciwgTlVMTCwgMTAsICZrLT5vZmZzZXQpKSB7CisgICAgICAgICAgaWYoZGF0YS0+c3RhdGUucmVzdW1lX2Zyb20gPT0gay0+b2Zmc2V0KQorICAgICAgICAgICAgLyogd2UgYXNrZWQgZm9yIGEgcmVzdW1lIGFuZCB3ZSBnb3QgaXQgKi8KKyAgICAgICAgICAgIGstPmNvbnRlbnRfcmFuZ2UgPSBUUlVFOworICAgICAgICB9CiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICAgIGRhdGEtPnN0YXRlLnJlc3VtZV9mcm9tID0gMDsgLyogZ2V0IGV2ZXJ5dGhpbmcgKi8KQEAgLTM2ODIsNyArMzcxOCw3IEBACiAgICAgICBDdXJsX3NoYXJlX2xvY2soZGF0YSwgQ1VSTF9MT0NLX0RBVEFfQ09PS0lFLAogICAgICAgICAgICAgICAgICAgICAgIENVUkxfTE9DS19BQ0NFU1NfU0lOR0xFKTsKICAgICAgIEN1cmxfY29va2llX2FkZChkYXRhLAotICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPmNvb2tpZXMsIFRSVUUsIGstPnArMTEsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+Y29va2llcywgVFJVRSwgay0+cCArIDExLAogICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIGEgY3VzdG9tLXNldCBIb3N0OiBuYW1lLCB1c2UgaXQKICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlLCBvciBlbHNlIHVzZSByZWFsIHBlZXIgaG9zdCBuYW1lLiAqLwogICAgICAgICAgICAgICAgICAgICAgIGNvbm4tPmFsbG9jcHRyLmNvb2tpZWhvc3Q/CkBAIC0zNjkzLDggKzM3MjksOCBAQAogI2VuZGlmCiAgICAgZWxzZSBpZihjaGVja3ByZWZpeCgiTGFzdC1Nb2RpZmllZDoiLCBrLT5wKSAmJgogICAgICAgICAgICAgKGRhdGEtPnNldC50aW1lY29uZGl0aW9uIHx8IGRhdGEtPnNldC5nZXRfZmlsZXRpbWUpICkgewotICAgICAgdGltZV90IHNlY3M9dGltZShOVUxMKTsKLSAgICAgIGstPnRpbWVvZmRvYyA9IGN1cmxfZ2V0ZGF0ZShrLT5wK3N0cmxlbigiTGFzdC1Nb2RpZmllZDoiKSwKKyAgICAgIHRpbWVfdCBzZWNzID0gdGltZShOVUxMKTsKKyAgICAgIGstPnRpbWVvZmRvYyA9IGN1cmxfZ2V0ZGF0ZShrLT5wICsgc3RybGVuKCJMYXN0LU1vZGlmaWVkOiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWNzKTsKICAgICAgIGlmKGRhdGEtPnNldC5nZXRfZmlsZXRpbWUpCiAgICAgICAgIGRhdGEtPmluZm8uZmlsZXRpbWUgPSAobG9uZylrLT50aW1lb2Zkb2M7CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwLmgKaW5kZXggN2NlNGJkOS4uZDI3ODFiYyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cC5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHAuaApAQCAtNyw3ICs3LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE1LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtNDAsOCArNDAsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGVhZGVyLCAgIC8qIGhlYWRlciBrZXl3b3JkIF93aXRoXyBjb2xvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29udGVudCk7IC8qIGNvbnRlbnQgc3RyaW5nIHRvIGZpbmQgKi8KIAotY2hhciAqQ3VybF9jaGVja2hlYWRlcnMoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGhpc2hlYWRlcik7CiBjaGFyICpDdXJsX2NvcHlfaGVhZGVyX3ZhbHVlKGNvbnN0IGNoYXIgKmhlYWRlcik7CiAKIGNoYXIgKkN1cmxfY2hlY2tQcm94eWhlYWRlcnMoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLApAQCAtMTE1LDggKzExMywxMyBAQAogI2RlZmluZSBNQVhfSU5JVElBTF9QT1NUX1NJWkUgKDY0KjEwMjQpCiAjZW5kaWYKIAotI2lmbmRlZiBUSU5ZX0lOSVRJQUxfUE9TVF9TSVpFCi0jZGVmaW5lIFRJTllfSU5JVElBTF9QT1NUX1NJWkUgMTAyNAorLyogRVhQRUNUXzEwMF9USFJFU0hPTEQgaXMgdGhlIHJlcXVlc3QgYm9keSBzaXplIGxpbWl0IGZvciB3aGVuIGxpYmN1cmwgd2lsbAorICogYXV0b21hdGljYWxseSBhZGQgYW4gIkV4cGVjdDogMTAwLWNvbnRpbnVlIiBoZWFkZXIgaW4gSFRUUCByZXF1ZXN0cy4gV2hlbgorICogdGhlIHNpemUgaXMgdW5rbm93biwgaXQgd2lsbCBhbHdheXMgYWRkIGl0LgorICoKKyAqLworI2lmbmRlZiBFWFBFQ1RfMTAwX1RIUkVTSE9MRAorI2RlZmluZSBFWFBFQ1RfMTAwX1RIUkVTSE9MRCAxMDI0CiAjZW5kaWYKIAogI2VuZGlmIC8qIENVUkxfRElTQUJMRV9IVFRQICovCkBAIC0xMjUsNyArMTI4LDcgQEAKICAqIEhUVFAgdW5pcXVlIHNldHVwCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RydWN0IEhUVFAgewotICBzdHJ1Y3QgRm9ybURhdGEgKnNlbmRpdDsKKyAgY3VybF9taW1lcGFydCAqc2VuZGl0OwogICBjdXJsX29mZl90IHBvc3RzaXplOyAvKiBvZmZfdCB0byBoYW5kbGUgbGFyZ2UgZmlsZSBzaXplcyAqLwogICBjb25zdCBjaGFyICpwb3N0ZGF0YTsKIApAQCAtMTM1LDcgKzEzOCw3IEBACiAgIGN1cmxfb2ZmX3Qgd3JpdGVieXRlY291bnQ7CiAKICAgLyogRm9yIEZPUk0gcG9zdGluZyAqLwotICBzdHJ1Y3QgRm9ybSBmb3JtOworICBjdXJsX21pbWVwYXJ0IGZvcm07CiAKICAgc3RydWN0IGJhY2sgewogICAgIGN1cmxfcmVhZF9jYWxsYmFjayBmcmVhZF9mdW5jOyAvKiBiYWNrdXAgc3RvcmFnZSBmb3IgZnJlYWQgcG9pbnRlciAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cDIuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHAyLmMKaW5kZXggZjhlMjNjNS4uOWEyYTFkZCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cDIuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwMi5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSAiaHR0cDIuaCIKICNpbmNsdWRlICJodHRwLmgiCiAjaW5jbHVkZSAic2VuZGYuaCIKKyNpbmNsdWRlICJzZWxlY3QuaCIKICNpbmNsdWRlICJjdXJsX2Jhc2U2NC5oIgogI2luY2x1ZGUgInN0cmNhc2UuaCIKICNpbmNsdWRlICJtdWx0aWlmLmgiCkBAIC0xNTEsNiArMTUyLDQ5IEBACiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIAorLyoKKyAqIFRoZSBzZXJ2ZXIgbWF5IHNlbmQgdXMgZGF0YSBhdCBhbnkgcG9pbnQgKGUuZy4gUElORyBmcmFtZXMpLiBUaGVyZWZvcmUsCisgKiB3ZSBjYW5ub3QgYXNzdW1lIHRoYXQgYW4gSFRUUC8yIHNvY2tldCBpcyBkZWFkIGp1c3QgYmVjYXVzZSBpdCBpcyByZWFkYWJsZS4KKyAqCisgKiBJbnN0ZWFkLCBpZiBpdCBpcyByZWFkYWJsZSwgcnVuIEN1cmxfY29ubmFsaXZlKCkgdG8gcGVlayBhdCB0aGUgc29ja2V0CisgKiBhbmQgZGlzdGluZ3Vpc2ggYmV0d2VlbiBjbG9zZWQgYW5kIGRhdGEuCisgKi8KK3N0YXRpYyBib29sIGh0dHAyX2Nvbm5pc2RlYWQoc3RydWN0IGNvbm5lY3RkYXRhICpjaGVjaykKK3sKKyAgaW50IHN2YWw7CisgIGJvb2wgcmV0X3ZhbCA9IFRSVUU7CisKKyAgc3ZhbCA9IFNPQ0tFVF9SRUFEQUJMRShjaGVjay0+c29ja1tGSVJTVFNPQ0tFVF0sIDApOworICBpZihzdmFsID09IDApIHsKKyAgICAvKiB0aW1lb3V0ICovCisgICAgcmV0X3ZhbCA9IEZBTFNFOworICB9CisgIGVsc2UgaWYoc3ZhbCAmIENVUkxfQ1NFTEVDVF9FUlIpIHsKKyAgICAvKiBzb2NrZXQgaXMgaW4gYW4gZXJyb3Igc3RhdGUgKi8KKyAgICByZXRfdmFsID0gVFJVRTsKKyAgfQorICBlbHNlIGlmKHN2YWwgJiBDVVJMX0NTRUxFQ1RfSU4pIHsKKyAgICAvKiByZWFkYWJsZSB3aXRoIG5vIGVycm9yLiBjb3VsZCBzdGlsbCBiZSBjbG9zZWQgKi8KKyAgICByZXRfdmFsID0gIUN1cmxfY29ubmFsaXZlKGNoZWNrKTsKKyAgfQorCisgIHJldHVybiByZXRfdmFsOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaHR0cDJfY29ubmNoZWNrKHN0cnVjdCBjb25uZWN0ZGF0YSAqY2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2hlY2tzX3RvX3BlcmZvcm0pCit7CisgIHVuc2lnbmVkIGludCByZXRfdmFsID0gQ09OTlJFU1VMVF9OT05FOworCisgIGlmKGNoZWNrc190b19wZXJmb3JtICYgQ09OTkNIRUNLX0lTREVBRCkgeworICAgIGlmKGh0dHAyX2Nvbm5pc2RlYWQoY2hlY2spKQorICAgICAgcmV0X3ZhbCB8PSBDT05OUkVTVUxUX0RFQUQ7CisgIH0KKworICByZXR1cm4gcmV0X3ZhbDsKK30KKwogLyogY2FsbGVkIGZyb20gQ3VybF9odHRwX3NldHVwX2Nvbm4gKi8KIHZvaWQgQ3VybF9odHRwMl9zZXR1cF9yZXEoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKIHsKQEAgLTE5Niw2ICsyNDAsNyBAQAogICBodHRwMl9wZXJmb3JtX2dldHNvY2ssICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBodHRwMl9kaXNjb25uZWN0LCAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgaHR0cDJfY29ubmNoZWNrLCAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfSFRUUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fSFRUUCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfU1RSRUFNICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8KQEAgLTIxNiw2ICsyNjEsNyBAQAogICBodHRwMl9wZXJmb3JtX2dldHNvY2ssICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBodHRwMl9kaXNjb25uZWN0LCAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgaHR0cDJfY29ubmNoZWNrLCAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfSFRUUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fSFRUUFMsICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfU1NMIHwgUFJPVE9QVF9TVFJFQU0gICAgICAgICAgLyogZmxhZ3MgKi8KQEAgLTMzOCwxMiArMzg0LDEyIEBACiAgICAgc3RydWN0IEhUVFAgKnN0cmVhbSA9IGgtPmRhdGEtPnJlcS5wcm90b3A7CiAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihoZWFkZXIpOwogICAgIHNpemVfdCBpOwotICAgIGZvcihpPTA7IGk8c3RyZWFtLT5wdXNoX2hlYWRlcnNfdXNlZDsgaSsrKSB7CisgICAgZm9yKGkgPSAwOyBpPHN0cmVhbS0+cHVzaF9oZWFkZXJzX3VzZWQ7IGkrKykgewogICAgICAgaWYoIXN0cm5jbXAoaGVhZGVyLCBzdHJlYW0tPnB1c2hfaGVhZGVyc1tpXSwgbGVuKSkgewogICAgICAgICAvKiBzdWItbWF0Y2gsIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIGZvbGxvd2VkIGJ5IGEgY29sb24gKi8KICAgICAgICAgaWYoc3RyZWFtLT5wdXNoX2hlYWRlcnNbaV1bbGVuXSAhPSAnOicpCiAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIHJldHVybiAmc3RyZWFtLT5wdXNoX2hlYWRlcnNbaV1bbGVuKzFdOworICAgICAgICByZXR1cm4gJnN0cmVhbS0+cHVzaF9oZWFkZXJzW2ldW2xlbiArIDFdOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtNDE4LDcgKzQ2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tdWx0aS0+cHVzaF91c2VycCk7CiAKICAgICAvKiBmcmVlIHRoZSBoZWFkZXJzIGFnYWluICovCi0gICAgZm9yKGk9MDsgaTxzdHJlYW0tPnB1c2hfaGVhZGVyc191c2VkOyBpKyspCisgICAgZm9yKGkgPSAwOyBpPHN0cmVhbS0+cHVzaF9oZWFkZXJzX3VzZWQ7IGkrKykKICAgICAgIGZyZWUoc3RyZWFtLT5wdXNoX2hlYWRlcnNbaV0pOwogICAgIGZyZWUoc3RyZWFtLT5wdXNoX2hlYWRlcnMpOwogICAgIHN0cmVhbS0+cHVzaF9oZWFkZXJzID0gTlVMTDsKQEAgLTE1MzYsNyArMTU4Miw3IEBACiAgICAgICBmYWlsZihkYXRhLCAibmdodHRwMl9zZXNzaW9uX21lbV9yZWN2KCkgcmV0dXJuZWQgJWQ6JXNcbiIsCiAgICAgICAgICAgICBydiwgbmdodHRwMl9zdHJlcnJvcigoaW50KXJ2KSk7CiAgICAgICAqZXJyID0gQ1VSTEVfUkVDVl9FUlJPUjsKLSAgICAgIHJldHVybiAwOworICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBERUJVR0YoaW5mb2YoZGF0YSwgIm5naHR0cDJfc2Vzc2lvbl9tZW1fcmVjdigpIHJldHVybnMgJXpkXG4iLCBydikpOwogICAgIGlmKG5yZWFkID09IHJ2KSB7CkBAIC0xNTU0LDcgKzE2MDAsNyBAQAogICAgIHJ2ID0gaDJfc2Vzc2lvbl9zZW5kKGRhdGEsIGh0dHBjLT5oMik7CiAgICAgaWYocnYgIT0gMCkgewogICAgICAgKmVyciA9IENVUkxFX1NFTkRfRVJST1I7Ci0gICAgICByZXR1cm4gMDsKKyAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICBpZihzaG91bGRfY2xvc2Vfc2Vzc2lvbihodHRwYykpIHsKQEAgLTE5MDksNiArMTk1NSw3IEBACiAgIHN3aXRjaChjb25uLT5kYXRhLT5zZXQuaHR0cHJlcSkgewogICBjYXNlIEhUVFBSRVFfUE9TVDoKICAgY2FzZSBIVFRQUkVRX1BPU1RfRk9STToKKyAgY2FzZSBIVFRQUkVRX1BPU1RfTUlNRToKICAgY2FzZSBIVFRQUkVRX1BVVDoKICAgICBpZihjb25uLT5kYXRhLT5zdGF0ZS5pbmZpbGVzaXplICE9IC0xKQogICAgICAgc3RyZWFtLT51cGxvYWRfbGVmdCA9IGNvbm4tPmRhdGEtPnN0YXRlLmluZmlsZXNpemU7CkBAIC0yMTM0LDEyICsyMTgxLDE1IEBACiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIAotdm9pZCBDdXJsX2h0dHAyX2FkZF9jaGlsZChzdHJ1Y3QgQ3VybF9lYXN5ICpwYXJlbnQsIHN0cnVjdCBDdXJsX2Vhc3kgKmNoaWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4Y2x1c2l2ZSkKK0NVUkxjb2RlIEN1cmxfaHR0cDJfYWRkX2NoaWxkKHN0cnVjdCBDdXJsX2Vhc3kgKnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDdXJsX2Vhc3kgKmNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleGNsdXNpdmUpCiB7CiAgIGlmKHBhcmVudCkgewogICAgIHN0cnVjdCBDdXJsX2h0dHAyX2RlcCAqKnRhaWw7CiAgICAgc3RydWN0IEN1cmxfaHR0cDJfZGVwICpkZXAgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBDdXJsX2h0dHAyX2RlcCkpOworICAgIGlmKCFkZXApCisgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgICBkZXAtPmRhdGEgPSBjaGlsZDsKIAogICAgIGlmKHBhcmVudC0+c2V0LnN0cmVhbV9kZXBlbmRlbnRzICYmIGV4Y2x1c2l2ZSkgewpAQCAtMjE3MCw2ICsyMjIwLDcgQEAKIAogICBjaGlsZC0+c2V0LnN0cmVhbV9kZXBlbmRzX29uID0gcGFyZW50OwogICBjaGlsZC0+c2V0LnN0cmVhbV9kZXBlbmRzX2UgPSBleGNsdXNpdmU7CisgIHJldHVybiBDVVJMRV9PSzsKIH0KIAogdm9pZCBDdXJsX2h0dHAyX3JlbW92ZV9jaGlsZChzdHJ1Y3QgQ3VybF9lYXN5ICpwYXJlbnQsIHN0cnVjdCBDdXJsX2Vhc3kgKmNoaWxkKQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cDIuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHAyLmgKaW5kZXggZjQwNWIzYS4uZjU5N2M4MCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cDIuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwMi5oCkBAIC03LDcgKzcsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC01Myw4ICs1Myw5IEBACiB2b2lkIEN1cmxfaHR0cDJfc2V0dXBfcmVxKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpOwogdm9pZCBDdXJsX2h0dHAyX2RvbmUoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBib29sIHByZW1hdHVyZSk7CiBDVVJMY29kZSBDdXJsX2h0dHAyX2RvbmVfc2VuZGluZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pOwotdm9pZCBDdXJsX2h0dHAyX2FkZF9jaGlsZChzdHJ1Y3QgQ3VybF9lYXN5ICpwYXJlbnQsIHN0cnVjdCBDdXJsX2Vhc3kgKmNoaWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4Y2x1c2l2ZSk7CitDVVJMY29kZSBDdXJsX2h0dHAyX2FkZF9jaGlsZChzdHJ1Y3QgQ3VybF9lYXN5ICpwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF9lYXN5ICpjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXhjbHVzaXZlKTsKIHZvaWQgQ3VybF9odHRwMl9yZW1vdmVfY2hpbGQoc3RydWN0IEN1cmxfZWFzeSAqcGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF9lYXN5ICpjaGlsZCk7CiB2b2lkIEN1cmxfaHR0cDJfY2xlYW51cF9kZXBlbmRlbmNpZXMoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSk7CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwX2NodW5rcy5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cF9jaHVua3MuYwppbmRleCAxYmRmNjk3Li45MmQ3NzMxIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwX2NodW5rcy5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHBfY2h1bmtzLmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTg2LDggKzg2LDggQEAKIHZvaWQgQ3VybF9odHRwY2h1bmtfaW5pdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCiB7CiAgIHN0cnVjdCBDdXJsX2NodW5rZXIgKmNodW5rID0gJmNvbm4tPmNodW5rOwotICBjaHVuay0+aGV4aW5kZXg9MDsgICAgICAgIC8qIHN0YXJ0IGF0IDAgKi8KLSAgY2h1bmstPmRhdGFsZWZ0PTA7ICAgICAgICAvKiBubyBkYXRhIGxlZnQgeWV0ISAqLworICBjaHVuay0+aGV4aW5kZXggPSAwOyAgICAgIC8qIHN0YXJ0IGF0IDAgKi8KKyAgY2h1bmstPmRhdGFsZWZ0ID0gMDsgICAgICAvKiBubyBkYXRhIGxlZnQgeWV0ISAqLwogICBjaHVuay0+c3RhdGUgPSBDSFVOS19IRVg7IC8qIHdlIGdldCBoZXggZmlyc3QhICovCiB9CiAKQEAgLTEwNyw3ICsxMDcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBkYXRhbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCAqd3JvdGVwKQogewotICBDVVJMY29kZSByZXN1bHQ9Q1VSTEVfT0s7CisgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKICAgc3RydWN0IEN1cmxfY2h1bmtlciAqY2ggPSAmY29ubi0+Y2h1bms7CiAgIHN0cnVjdCBTaW5nbGVSZXF1ZXN0ICprID0gJmRhdGEtPnJlcTsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgICAgICAgIHJldHVybiBDSFVOS0VfSUxMRUdBTF9IRVg7CiAKICAgICAgICAgLyogbGVuZ3RoIGFuZCBkYXRhcCBhcmUgdW5tb2RpZmllZCAqLwotICAgICAgICBjaC0+aGV4YnVmZmVyW2NoLT5oZXhpbmRleF09MDsKKyAgICAgICAgY2gtPmhleGJ1ZmZlcltjaC0+aGV4aW5kZXhdID0gMDsKIAogICAgICAgICAvKiBjb252ZXJ0IHRvIGhvc3QgZW5jb2RpbmcgYmVmb3JlIGNhbGxpbmcgc3RydG91bCAqLwogICAgICAgICByZXN1bHQgPSBDdXJsX2NvbnZlcnRfZnJvbV9uZXR3b3JrKGNvbm4tPmRhdGEsIGNoLT5oZXhidWZmZXIsCkBAIC0xNTgsOSArMTU4LDcgQEAKICAgICAgICAgICByZXR1cm4gQ0hVTktFX0lMTEVHQUxfSEVYOwogICAgICAgICB9CiAKLSAgICAgICAgY2gtPmRhdGFzaXplPWN1cmx4X3N0cnRvb2ZmdChjaC0+aGV4YnVmZmVyLCAmZW5kcHRyLCAxNik7Ci0gICAgICAgIGlmKChjaC0+ZGF0YXNpemUgPT0gQ1VSTF9PRkZfVF9NQVgpICYmIChlcnJubyA9PSBFUkFOR0UpKQotICAgICAgICAgIC8qIG92ZXJmbG93IGlzIGFuIGVycm9yICovCisgICAgICAgIGlmKGN1cmx4X3N0cnRvb2ZmdChjaC0+aGV4YnVmZmVyLCAmZW5kcHRyLCAxNiwgJmNoLT5kYXRhc2l6ZSkpCiAgICAgICAgICAgcmV0dXJuIENIVU5LRV9JTExFR0FMX0hFWDsKICAgICAgICAgY2gtPnN0YXRlID0gQ0hVTktfTEY7IC8qIG5vdyB3YWl0IGZvciB0aGUgQ1JMRiAqLwogICAgICAgfQpAQCAtMTcyLDcgKzE3MCw3IEBACiAgICAgICAgIC8qIHdlJ3JlIG5vdyBleHBlY3RpbmcgZGF0YSB0byBjb21lLCB1bmxlc3Mgc2l6ZSB3YXMgemVybyEgKi8KICAgICAgICAgaWYoMCA9PSBjaC0+ZGF0YXNpemUpIHsKICAgICAgICAgICBjaC0+c3RhdGUgPSBDSFVOS19UUkFJTEVSOyAvKiBub3cgY2hlY2sgZm9yIHRyYWlsZXJzICovCi0gICAgICAgICAgY29ubi0+dHJsUG9zPTA7CisgICAgICAgICAgY29ubi0+dHJsUG9zID0gMDsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgICAgY2gtPnN0YXRlID0gQ0hVTktfREFUQTsKQEAgLTI1OSw5ICsyNTcsOSBAQAogCiAgICAgICAgIGlmKGNvbm4tPnRybFBvcykgewogICAgICAgICAgIC8qIHdlIGFsbG9jYXRlIHRyYWlsZXIgd2l0aCAzIGJ5dGVzIGV4dHJhIHJvb20gdG8gZml0IHRoaXMgKi8KLSAgICAgICAgICBjb25uLT50cmFpbGVyW2Nvbm4tPnRybFBvcysrXT0weDBkOwotICAgICAgICAgIGNvbm4tPnRyYWlsZXJbY29ubi0+dHJsUG9zKytdPTB4MGE7Ci0gICAgICAgICAgY29ubi0+dHJhaWxlcltjb25uLT50cmxQb3NdPTA7CisgICAgICAgICAgY29ubi0+dHJhaWxlcltjb25uLT50cmxQb3MrK10gPSAweDBkOworICAgICAgICAgIGNvbm4tPnRyYWlsZXJbY29ubi0+dHJsUG9zKytdID0gMHgwYTsKKyAgICAgICAgICBjb25uLT50cmFpbGVyW2Nvbm4tPnRybFBvc10gPSAwOwogCiAgICAgICAgICAgLyogQ29udmVydCB0byBob3N0IGVuY29kaW5nIGJlZm9yZSBjYWxsaW5nIEN1cmxfY2xpZW50X3dyaXRlICovCiAgICAgICAgICAgcmVzdWx0ID0gQ3VybF9jb252ZXJ0X2Zyb21fbmV0d29yayhjb25uLT5kYXRhLCBjb25uLT50cmFpbGVyLApAQCAtMjc3LDcgKzI3NSw3IEBACiAgICAgICAgICAgICBpZihyZXN1bHQpCiAgICAgICAgICAgICAgIHJldHVybiBDSFVOS0VfV1JJVEVfRVJST1I7CiAgICAgICAgICAgfQotICAgICAgICAgIGNvbm4tPnRybFBvcz0wOworICAgICAgICAgIGNvbm4tPnRybFBvcyA9IDA7CiAgICAgICAgICAgY2gtPnN0YXRlID0gQ0hVTktfVFJBSUxFUl9DUjsKICAgICAgICAgICBpZigqZGF0YXAgPT0gMHgwYSkKICAgICAgICAgICAgIC8qIGFscmVhZHkgb24gdGhlIExGICovCkBAIC0zMDEsNyArMjk5LDcgQEAKICAgICAgICAgICAgIHB0ciA9IHJlYWxsb2MoY29ubi0+dHJhaWxlciwgY29ubi0+dHJsTWF4ICsgMyk7CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29ubi0+dHJsTWF4PTEyODsKKyAgICAgICAgICAgIGNvbm4tPnRybE1heCA9IDEyODsKICAgICAgICAgICAgIHB0ciA9IG1hbGxvYyhjb25uLT50cmxNYXggKyAzKTsKICAgICAgICAgICB9CiAgICAgICAgICAgaWYoIXB0cikKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHBfbnRsbS5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cF9udGxtLmMKaW5kZXggOGE3OGJkMi4uMGYxZWRjZiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cF9udGxtLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cF9udGxtLmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTM3LDExICszNywxNCBAQAogI2luY2x1ZGUgInNlbmRmLmgiCiAjaW5jbHVkZSAic3RyY2FzZS5oIgogI2luY2x1ZGUgImh0dHBfbnRsbS5oIgorI2luY2x1ZGUgImN1cmxfbnRsbV9jb3JlLmgiCiAjaW5jbHVkZSAiY3VybF9udGxtX3diLmgiCiAjaW5jbHVkZSAidmF1dGgvdmF1dGguaCIKICNpbmNsdWRlICJ1cmwuaCIKIAotI2lmIGRlZmluZWQoVVNFX05TUykKKy8qIFNTTCBiYWNrZW5kLXNwZWNpZmljICNpZiBicmFuY2hlcyBpbiB0aGlzIGZpbGUgbXVzdCBiZSBrZXB0IGluIHRoZSBvcmRlcgorICAgZG9jdW1lbnRlZCBpbiBjdXJsX250bG1fY29yZS4gKi8KKyNpZiBkZWZpbmVkKE5UTE1fTkVFRFNfTlNTX0lOSVQpCiAjaW5jbHVkZSAidnRscy9uc3NnLmgiCiAjZWxpZiBkZWZpbmVkKFVTRV9XSU5ET1dTX1NTUEkpCiAjaW5jbHVkZSAiY3VybF9zc3BpLmgiCkBAIC0xMjksNyArMTMyLDcgQEAKICAgREVCVUdBU1NFUlQoY29ubik7CiAgIERFQlVHQVNTRVJUKGNvbm4tPmRhdGEpOwogCi0jaWZkZWYgVVNFX05TUworI2lmIGRlZmluZWQoTlRMTV9ORUVEU19OU1NfSU5JVCkKICAgaWYoQ1VSTEVfT0sgIT0gQ3VybF9uc3NfZm9yY2VfaW5pdChjb25uLT5kYXRhKSkKICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICNlbmRpZgpAQCAtMTcwLDggKzE3Myw4IEBACiAgIGNhc2UgTlRMTVNUQVRFX1RZUEUxOgogICBkZWZhdWx0OiAvKiBmb3IgdGhlIHdlaXJkIGNhc2VzIHdlIChyZSlzdGFydCBoZXJlICovCiAgICAgLyogQ3JlYXRlIGEgdHlwZS0xIG1lc3NhZ2UgKi8KLSAgICByZXN1bHQgPSBDdXJsX2F1dGhfY3JlYXRlX250bG1fdHlwZTFfbWVzc2FnZSh1c2VycCwgcGFzc3dkcCwgbnRsbSwgJmJhc2U2NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuKTsKKyAgICByZXN1bHQgPSBDdXJsX2F1dGhfY3JlYXRlX250bG1fdHlwZTFfbWVzc2FnZShjb25uLT5kYXRhLCB1c2VycCwgcGFzc3dkcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudGxtLCAmYmFzZTY0LCAmbGVuKTsKICAgICBpZihyZXN1bHQpCiAgICAgICByZXR1cm4gcmVzdWx0OwogCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwX3Byb3h5LmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwX3Byb3h5LmMKaW5kZXggOTg5NGUyZS4uZGZmOWQyMyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cF9wcm94eS5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHBfcHJveHkuYwpAQCAtMjIsMTEgKzIyLDExIEBACiAKICNpbmNsdWRlICJjdXJsX3NldHVwLmgiCiAKKyNpbmNsdWRlICJodHRwX3Byb3h5LmgiCisKICNpZiAhZGVmaW5lZChDVVJMX0RJU0FCTEVfUFJPWFkpICYmICFkZWZpbmVkKENVUkxfRElTQUJMRV9IVFRQKQogCi0jaW5jbHVkZSAidXJsZGF0YS5oIgogI2luY2x1ZGUgPGN1cmwvY3VybC5oPgotI2luY2x1ZGUgImh0dHBfcHJveHkuaCIKICNpbmNsdWRlICJzZW5kZi5oIgogI2luY2x1ZGUgImh0dHAuaCIKICNpbmNsdWRlICJ1cmwuaCIKQEAgLTEzNSwzNSArMTM1LDczIEBACiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIAotI2RlZmluZSBDT05ORUNUX0JVRkZFUl9TSVpFIDE2Mzg0Citib29sIEN1cmxfY29ubmVjdF9jb21wbGV0ZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCit7CisgIHJldHVybiAhY29ubi0+Y29ubmVjdF9zdGF0ZSB8fAorICAgIChjb25uLT5jb25uZWN0X3N0YXRlLT50dW5uZWxfc3RhdGUgPT0gVFVOTkVMX0NPTVBMRVRFKTsKK30KKworYm9vbCBDdXJsX2Nvbm5lY3Rfb25nb2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCit7CisgIHJldHVybiBjb25uLT5jb25uZWN0X3N0YXRlICYmCisgICAgKGNvbm4tPmNvbm5lY3Rfc3RhdGUtPnR1bm5lbF9zdGF0ZSAhPSBUVU5ORUxfQ09NUExFVEUpOworfQorCitzdGF0aWMgQ1VSTGNvZGUgY29ubmVjdF9pbml0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgYm9vbCByZWluaXQpCit7CisgIHN0cnVjdCBodHRwX2Nvbm5lY3Rfc3RhdGUgKnM7CisgIGlmKCFyZWluaXQpIHsKKyAgICBERUJVR0FTU0VSVCghY29ubi0+Y29ubmVjdF9zdGF0ZSk7CisgICAgcyA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGh0dHBfY29ubmVjdF9zdGF0ZSkpOworICAgIGlmKCFzKQorICAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CisgICAgaW5mb2YoY29ubi0+ZGF0YSwgImFsbG9jYXRlIGNvbm5lY3QgYnVmZmVyIVxuIik7CisgICAgY29ubi0+Y29ubmVjdF9zdGF0ZSA9IHM7CisgIH0KKyAgZWxzZSB7CisgICAgREVCVUdBU1NFUlQoY29ubi0+Y29ubmVjdF9zdGF0ZSk7CisgICAgcyA9IGNvbm4tPmNvbm5lY3Rfc3RhdGU7CisgIH0KKyAgcy0+dHVubmVsX3N0YXRlID0gVFVOTkVMX0lOSVQ7CisgIHMtPmtlZXBvbiA9IFRSVUU7CisgIHMtPmxpbmVfc3RhcnQgPSBzLT5jb25uZWN0X2J1ZmZlcjsKKyAgcy0+cHRyID0gcy0+bGluZV9zdGFydDsKKyAgcy0+Y2wgPSAwOworICByZXR1cm4gQ1VSTEVfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGNvbm5lY3RfZG9uZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCit7CisgIHN0cnVjdCBodHRwX2Nvbm5lY3Rfc3RhdGUgKnMgPSBjb25uLT5jb25uZWN0X3N0YXRlOworICBzLT50dW5uZWxfc3RhdGUgPSBUVU5ORUxfQ09NUExFVEU7CisgIGluZm9mKGNvbm4tPmRhdGEsICJDT05ORUNUIHBoYXNlIGNvbXBsZXRlZCFcbiIpOworfQogCiBzdGF0aWMgQ1VSTGNvZGUgQ09OTkVDVChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVtb3RlX3BvcnQpCiB7Ci0gIGludCBzdWJ2ZXJzaW9uPTA7Ci0gIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGE9Y29ubi0+ZGF0YTsKKyAgaW50IHN1YnZlcnNpb24gPSAwOworICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKICAgc3RydWN0IFNpbmdsZVJlcXVlc3QgKmsgPSAmZGF0YS0+cmVxOwogICBDVVJMY29kZSByZXN1bHQ7CiAgIGN1cmxfc29ja2V0X3QgdHVubmVsc29ja2V0ID0gY29ubi0+c29ja1tzb2NraW5kZXhdOwotICBjdXJsX29mZl90IGNsPTA7CiAgIGJvb2wgY2xvc2VDb25uZWN0aW9uID0gRkFMU0U7Ci0gIGJvb2wgY2h1bmtlZF9lbmNvZGluZyA9IEZBTFNFOwogICB0aW1lX3QgY2hlY2s7CisgIHN0cnVjdCBodHRwX2Nvbm5lY3Rfc3RhdGUgKnMgPSBjb25uLT5jb25uZWN0X3N0YXRlOwogCiAjZGVmaW5lIFNFTEVDVF9PSyAgICAgIDAKICNkZWZpbmUgU0VMRUNUX0VSUk9SICAgMQogI2RlZmluZSBTRUxFQ1RfVElNRU9VVCAyCi0gIGludCBlcnJvciA9IFNFTEVDVF9PSzsKIAotICBpZihjb25uLT50dW5uZWxfc3RhdGVbc29ja2luZGV4XSA9PSBUVU5ORUxfQ09NUExFVEUpCisgIGlmKEN1cmxfY29ubmVjdF9jb21wbGV0ZShjb25uKSkKICAgICByZXR1cm4gQ1VSTEVfT0s7IC8qIENPTk5FQ1QgaXMgYWxyZWFkeSBjb21wbGV0ZWQgKi8KIAogICBjb25uLT5iaXRzLnByb3h5X2Nvbm5lY3RfY2xvc2VkID0gRkFMU0U7CiAKICAgZG8gewotICAgIGlmKFRVTk5FTF9JTklUID09IGNvbm4tPnR1bm5lbF9zdGF0ZVtzb2NraW5kZXhdKSB7CisgICAgaWYoVFVOTkVMX0lOSVQgPT0gcy0+dHVubmVsX3N0YXRlKSB7CiAgICAgICAvKiBCRUdJTiBDT05ORUNUIFBIQVNFICovCiAgICAgICBjaGFyICpob3N0X3BvcnQ7CiAgICAgICBDdXJsX3NlbmRfYnVmZmVyICpyZXFfYnVmZmVyOwpAQCAtMTk2LDggKzIzNCw4IEBACiAKICAgICAgIGlmKCFyZXN1bHQpIHsKICAgICAgICAgY2hhciAqaG9zdCA9IE5VTEw7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnByb3h5Y29ubj0iIjsKLSAgICAgICAgY29uc3QgY2hhciAqdXNlcmFnZW50PSIiOworICAgICAgICBjb25zdCBjaGFyICpwcm94eWNvbm4gPSAiIjsKKyAgICAgICAgY29uc3QgY2hhciAqdXNlcmFnZW50ID0gIiI7CiAgICAgICAgIGNvbnN0IGNoYXIgKmh0dHAgPSAoY29ubi0+aHR0cF9wcm94eS5wcm94eXR5cGUgPT0gQ1VSTFBST1hZX0hUVFBfMV8wKSA/CiAgICAgICAgICAgIjEuMCIgOiAiMS4xIjsKICAgICAgICAgYm9vbCBpcHY2X2lwID0gY29ubi0+Yml0cy5pcHY2X2lwOwpAQCAtMjA2LDcgKzI0NCw3IEBACiAgICAgICAgIC8qIHRoZSBob3N0bmFtZSBtYXkgYmUgZGlmZmVyZW50ICovCiAgICAgICAgIGlmKGhvc3RuYW1lICE9IGNvbm4tPmhvc3QubmFtZSkKICAgICAgICAgICBpcHY2X2lwID0gKHN0cmNocihob3N0bmFtZSwgJzonKSAhPSBOVUxMKTsKLSAgICAgICAgaG9zdGhlYWRlcj0gLyogaG9zdDpwb3J0IHdpdGggSVB2NiBzdXBwb3J0ICovCisgICAgICAgIGhvc3RoZWFkZXIgPSAvKiBob3N0OnBvcnQgd2l0aCBJUHY2IHN1cHBvcnQgKi8KICAgICAgICAgICBhcHJpbnRmKCIlcyVzJXM6JWh1IiwgaXB2Nl9pcD8iWyI6IiIsIGhvc3RuYW1lLCBpcHY2X2lwPyJdIjoiIiwKICAgICAgICAgICAgICAgICAgIHJlbW90ZV9wb3J0KTsKICAgICAgICAgaWYoIWhvc3RoZWFkZXIpIHsKQEAgLTI3MSw2NSArMzA5LDQ2IEBACiAgICAgICBpZihyZXN1bHQpCiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAKLSAgICAgIGNvbm4tPnR1bm5lbF9zdGF0ZVtzb2NraW5kZXhdID0gVFVOTkVMX0NPTk5FQ1Q7CisgICAgICBzLT50dW5uZWxfc3RhdGUgPSBUVU5ORUxfQ09OTkVDVDsKKyAgICAgIHMtPnBlcmxpbmUgPSAwOwogICAgIH0gLyogRU5EIENPTk5FQ1QgUEhBU0UgKi8KIAogICAgIGNoZWNrID0gQ3VybF90aW1lbGVmdChkYXRhLCBOVUxMLCBUUlVFKTsKICAgICBpZihjaGVjayA8PSAwKSB7CiAgICAgICBmYWlsZihkYXRhLCAiUHJveHkgQ09OTkVDVCBhYm9ydGVkIGR1ZSB0byB0aW1lb3V0Iik7Ci0gICAgICByZXR1cm4gQ1VSTEVfUkVDVl9FUlJPUjsKKyAgICAgIHJldHVybiBDVVJMRV9PUEVSQVRJT05fVElNRURPVVQ7CiAgICAgfQogCiAgICAgaWYoIUN1cmxfY29ubl9kYXRhX3BlbmRpbmcoY29ubiwgc29ja2luZGV4KSkKICAgICAgIC8qIHJldHVybiBzbyB3ZSdsbCBiZSBjYWxsZWQgYWdhaW4gcG9sbGluZy1zdHlsZSAqLwogICAgICAgcmV0dXJuIENVUkxFX09LOwotICAgIERFQlVHRihpbmZvZihkYXRhLCAiUmVhZCByZXNwb25zZSBpbW1lZGlhdGVseSBmcm9tIHByb3h5IENPTk5FQ1RcbiIpKTsKIAogICAgIC8qIGF0IHRoaXMgcG9pbnQsIHRoZSB0dW5uZWxfY29ubmVjdGluZyBwaGFzZSBpcyBvdmVyLiAqLwogCiAgICAgeyAvKiBSRUFESU5HIFJFU1BPTlNFIFBIQVNFICovCi0gICAgICBzaXplX3QgbnJlYWQ7ICAgLyogdG90YWwgc2l6ZSByZWFkICovCi0gICAgICBpbnQgcGVybGluZTsgLyogY291bnQgYnl0ZXMgcGVyIGxpbmUgKi8KLSAgICAgIGludCBrZWVwb249VFJVRTsKLSAgICAgIHNzaXplX3QgZ290Ynl0ZXM7Ci0gICAgICBjaGFyICpwdHI7Ci0gICAgICBjaGFyICpsaW5lX3N0YXJ0OworICAgICAgaW50IGVycm9yID0gU0VMRUNUX09LOwogCi0gICAgICBwdHIgPSBjb25uLT5jb25uZWN0X2J1ZmZlcjsKLSAgICAgIGxpbmVfc3RhcnQgPSBwdHI7CisgICAgICB3aGlsZShzLT5rZWVwb24gJiYgIWVycm9yKSB7CisgICAgICAgIHNzaXplX3QgZ290Ynl0ZXM7CiAKLSAgICAgIG5yZWFkID0gMDsKLSAgICAgIHBlcmxpbmUgPSAwOwotCi0gICAgICB3aGlsZShucmVhZCA8IChzaXplX3QpQ09OTkVDVF9CVUZGRVJfU0laRSAmJiBrZWVwb24gJiYgIWVycm9yKSB7Ci0gICAgICAgIGlmKEN1cmxfcGdyc1VwZGF0ZShjb25uKSkKLSAgICAgICAgICByZXR1cm4gQ1VSTEVfQUJPUlRFRF9CWV9DQUxMQkFDSzsKLQotICAgICAgICBpZihwdHIgPj0gJmNvbm4tPmNvbm5lY3RfYnVmZmVyW0NPTk5FQ1RfQlVGRkVSX1NJWkVdKSB7CisgICAgICAgIC8qIG1ha2Ugc3VyZSB3ZSBoYXZlIHNwYWNlIHRvIHJlYWQgbW9yZSBkYXRhICovCisgICAgICAgIGlmKHMtPnB0ciA+PSAmcy0+Y29ubmVjdF9idWZmZXJbQ09OTkVDVF9CVUZGRVJfU0laRV0pIHsKICAgICAgICAgICBmYWlsZihkYXRhLCAiQ09OTkVDVCByZXNwb25zZSB0b28gbGFyZ2UhIik7CiAgICAgICAgICAgcmV0dXJuIENVUkxFX1JFQ1ZfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBjaGVjayA9IEN1cmxfdGltZWxlZnQoZGF0YSwgTlVMTCwgVFJVRSk7Ci0gICAgICAgIGlmKGNoZWNrIDw9IDApIHsKLSAgICAgICAgICBmYWlsZihkYXRhLCAiUHJveHkgQ09OTkVDVCBhYm9ydGVkIGR1ZSB0byB0aW1lb3V0Iik7Ci0gICAgICAgICAgZXJyb3IgPSBTRUxFQ1RfVElNRU9VVDsgLyogYWxyZWFkeSB0b28gbGl0dGxlIHRpbWUgKi8KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCiAgICAgICAgIC8qIFJlYWQgb25lIGJ5dGUgYXQgYSB0aW1lIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24uIFdhaXQgYXQgbW9zdCBvbmUKICAgICAgICAgICAgc2Vjb25kIGJlZm9yZSBsb29waW5nIHRvIGVuc3VyZSBjb250aW51b3VzIHBncnNVcGRhdGVzLiAqLwotICAgICAgICByZXN1bHQgPSBDdXJsX3JlYWQoY29ubiwgdHVubmVsc29ja2V0LCBwdHIsIDEsICZnb3RieXRlcyk7Ci0gICAgICAgIGlmKHJlc3VsdCA9PSBDVVJMRV9BR0FJTikgewotICAgICAgICAgIGlmKFNPQ0tFVF9SRUFEQUJMRSh0dW5uZWxzb2NrZXQsIGNoZWNrPDEwMDBMP2NoZWNrOjEwMDApID09IC0xKSB7Ci0gICAgICAgICAgICBlcnJvciA9IFNFTEVDVF9FUlJPUjsKLSAgICAgICAgICAgIGZhaWxmKGRhdGEsICJQcm94eSBDT05ORUNUIGFib3J0ZWQgZHVlIHRvIHNlbGVjdC9wb2xsIGVycm9yIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gQ3VybF9yZWFkKGNvbm4sIHR1bm5lbHNvY2tldCwgcy0+cHRyLCAxLCAmZ290Ynl0ZXMpOworICAgICAgICBpZihyZXN1bHQgPT0gQ1VSTEVfQUdBSU4pCisgICAgICAgICAgLyogc29ja2V0IGJ1ZmZlciBkcmFpbmVkLCByZXR1cm4gKi8KKyAgICAgICAgICByZXR1cm4gQ1VSTEVfT0s7CisKKyAgICAgICAgaWYoQ3VybF9wZ3JzVXBkYXRlKGNvbm4pKQorICAgICAgICAgIHJldHVybiBDVVJMRV9BQk9SVEVEX0JZX0NBTExCQUNLOworCiAgICAgICAgIGlmKHJlc3VsdCkgewotICAgICAgICAgIGtlZXBvbiA9IEZBTFNFOworICAgICAgICAgIHMtPmtlZXBvbiA9IEZBTFNFOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYoZ290Ynl0ZXMgPD0gMCkgewpAQCAtMzQzLDI0ICszNjIsMjIgQEAKICAgICAgICAgICAgIGVycm9yID0gU0VMRUNUX0VSUk9SOwogICAgICAgICAgICAgZmFpbGYoZGF0YSwgIlByb3h5IENPTk5FQ1QgYWJvcnRlZCIpOwogICAgICAgICAgIH0KLSAgICAgICAgICBrZWVwb24gPSBGQUxTRTsKKyAgICAgICAgICBzLT5rZWVwb24gPSBGQUxTRTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIC8qIFdlIGdvdCBhIGJ5dGUgb2YgZGF0YSAqLwotICAgICAgICBucmVhZCsrOwogCi0gICAgICAgIGlmKGtlZXBvbiA+IFRSVUUpIHsKKyAgICAgICAgaWYocy0+a2VlcG9uID4gVFJVRSkgewogICAgICAgICAgIC8qIFRoaXMgbWVhbnMgd2UgYXJlIGN1cnJlbnRseSBpZ25vcmluZyBhIHJlc3BvbnNlLWJvZHkgKi8KIAotICAgICAgICAgIG5yZWFkID0gMDsgLyogbWFrZSBuZXh0IHJlYWQgc3RhcnQgb3ZlciBpbiB0aGUgcmVhZCBidWZmZXIgKi8KLSAgICAgICAgICBwdHIgPSBjb25uLT5jb25uZWN0X2J1ZmZlcjsKLSAgICAgICAgICBpZihjbCkgeworICAgICAgICAgIHMtPnB0ciA9IHMtPmNvbm5lY3RfYnVmZmVyOworICAgICAgICAgIGlmKHMtPmNsKSB7CiAgICAgICAgICAgICAvKiBBIENvbnRlbnQtTGVuZ3RoIGJhc2VkIGJvZHk6IHNpbXBseSBjb3VudCBkb3duIHRoZSBjb3VudGVyCiAgICAgICAgICAgICAgICBhbmQgbWFrZSBzdXJlIHRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcCB3aGVuIHdlJ3JlIGRvbmUhICovCi0gICAgICAgICAgICBjbC0tOwotICAgICAgICAgICAgaWYoY2wgPD0gMCkgewotICAgICAgICAgICAgICBrZWVwb24gPSBGQUxTRTsKKyAgICAgICAgICAgIHMtPmNsLS07CisgICAgICAgICAgICBpZihzLT5jbCA8PSAwKSB7CisgICAgICAgICAgICAgIHMtPmtlZXBvbiA9IEZBTFNFOworICAgICAgICAgICAgICBzLT50dW5uZWxfc3RhdGUgPSBUVU5ORUxfQ09NUExFVEU7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KQEAgLTM3MiwyOCArMzg5LDI5IEBACiAKICAgICAgICAgICAgIC8qIG5vdyBwYXJzZSB0aGUgY2h1bmtlZCBwaWVjZSBvZiBkYXRhIHNvIHRoYXQgd2UgY2FuCiAgICAgICAgICAgICAgICBwcm9wZXJseSB0ZWxsIHdoZW4gdGhlIHN0cmVhbSBlbmRzICovCi0gICAgICAgICAgICByID0gQ3VybF9odHRwY2h1bmtfcmVhZChjb25uLCBwdHIsIDEsICZ0b29rY2FyZW9mKTsKKyAgICAgICAgICAgIHIgPSBDdXJsX2h0dHBjaHVua19yZWFkKGNvbm4sIHMtPnB0ciwgMSwgJnRvb2tjYXJlb2YpOwogICAgICAgICAgICAgaWYociA9PSBDSFVOS0VfU1RPUCkgewogICAgICAgICAgICAgICAvKiB3ZSdyZSBkb25lIHJlYWRpbmcgY2h1bmtzISAqLwogICAgICAgICAgICAgICBpbmZvZihkYXRhLCAiY2h1bmsgcmVhZGluZyBET05FXG4iKTsKLSAgICAgICAgICAgICAga2VlcG9uID0gRkFMU0U7CisgICAgICAgICAgICAgIHMtPmtlZXBvbiA9IEZBTFNFOwogICAgICAgICAgICAgICAvKiB3ZSBkaWQgdGhlIGZ1bGwgQ09OTkVDVCB0cmVhdG1lbnQsIGdvIENPTVBMRVRFICovCi0gICAgICAgICAgICAgIGNvbm4tPnR1bm5lbF9zdGF0ZVtzb2NraW5kZXhdID0gVFVOTkVMX0NPTVBMRVRFOworICAgICAgICAgICAgICBzLT50dW5uZWxfc3RhdGUgPSBUVU5ORUxfQ09NUExFVEU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgcGVybGluZSsrOyAvKiBhbW91bnQgb2YgYnl0ZXMgaW4gdGhpcyBsaW5lIHNvIGZhciAqLworICAgICAgICBzLT5wZXJsaW5lKys7IC8qIGFtb3VudCBvZiBieXRlcyBpbiB0aGlzIGxpbmUgc28gZmFyICovCiAKICAgICAgICAgLyogaWYgdGhpcyBpcyBub3QgdGhlIGVuZCBvZiBhIGhlYWRlciBsaW5lIHRoZW4gY29udGludWUgKi8KLSAgICAgICAgaWYoKnB0ciAhPSAweDBhKSB7Ci0gICAgICAgICAgcHRyKys7CisgICAgICAgIGlmKCpzLT5wdHIgIT0gMHgwYSkgeworICAgICAgICAgIHMtPnB0cisrOwogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgLyogY29udmVydCBmcm9tIHRoZSBuZXR3b3JrIGVuY29kaW5nICovCi0gICAgICAgIHJlc3VsdCA9IEN1cmxfY29udmVydF9mcm9tX25ldHdvcmsoZGF0YSwgbGluZV9zdGFydCwgcGVybGluZSk7CisgICAgICAgIHJlc3VsdCA9IEN1cmxfY29udmVydF9mcm9tX25ldHdvcmsoZGF0YSwgcy0+bGluZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KXMtPnBlcmxpbmUpOwogICAgICAgICAvKiBDdXJsX2NvbnZlcnRfZnJvbV9uZXR3b3JrIGNhbGxzIGZhaWxmIGlmIHVuc3VjY2Vzc2Z1bCAqLwogICAgICAgICBpZihyZXN1bHQpCiAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTQwMSw3ICs0MTksNyBAQAogICAgICAgICAvKiBvdXRwdXQgZGVidWcgaWYgdGhhdCBpcyByZXF1ZXN0ZWQgKi8KICAgICAgICAgaWYoZGF0YS0+c2V0LnZlcmJvc2UpCiAgICAgICAgICAgQ3VybF9kZWJ1ZyhkYXRhLCBDVVJMSU5GT19IRUFERVJfSU4sCi0gICAgICAgICAgICAgICAgICAgICBsaW5lX3N0YXJ0LCAoc2l6ZV90KXBlcmxpbmUsIGNvbm4pOworICAgICAgICAgICAgICAgICAgICAgcy0+bGluZV9zdGFydCwgKHNpemVfdClzLT5wZXJsaW5lLCBjb25uKTsKIAogICAgICAgICBpZighZGF0YS0+c2V0LnN1cHByZXNzX2Nvbm5lY3RfaGVhZGVycykgewogICAgICAgICAgIC8qIHNlbmQgdGhlIGhlYWRlciB0byB0aGUgY2FsbGJhY2sgKi8KQEAgLTQwOSwzNSArNDI3LDM0IEBACiAgICAgICAgICAgaWYoZGF0YS0+c2V0LmluY2x1ZGVfaGVhZGVyKQogICAgICAgICAgICAgd3JpdGV0eXBlIHw9IENMSUVOVFdSSVRFX0JPRFk7CiAKLSAgICAgICAgICByZXN1bHQgPSBDdXJsX2NsaWVudF93cml0ZShjb25uLCB3cml0ZXR5cGUsIGxpbmVfc3RhcnQsIHBlcmxpbmUpOworICAgICAgICAgIHJlc3VsdCA9IEN1cmxfY2xpZW50X3dyaXRlKGNvbm4sIHdyaXRldHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5saW5lX3N0YXJ0LCBzLT5wZXJsaW5lKTsKICAgICAgICAgICBpZihyZXN1bHQpCiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAKLSAgICAgICAgZGF0YS0+aW5mby5oZWFkZXJfc2l6ZSArPSAobG9uZylwZXJsaW5lOwotICAgICAgICBkYXRhLT5yZXEuaGVhZGVyYnl0ZWNvdW50ICs9IChsb25nKXBlcmxpbmU7CisgICAgICAgIGRhdGEtPmluZm8uaGVhZGVyX3NpemUgKz0gKGxvbmcpcy0+cGVybGluZTsKKyAgICAgICAgZGF0YS0+cmVxLmhlYWRlcmJ5dGVjb3VudCArPSAobG9uZylzLT5wZXJsaW5lOwogCiAgICAgICAgIC8qIE5ld2xpbmVzIGFyZSBDUkxGLCBzbyB0aGUgQ1IgaXMgaWdub3JlZCBhcyB0aGUgbGluZSBpc24ndAogICAgICAgICAgICByZWFsbHkgdGVybWluYXRlZCB1bnRpbCB0aGUgTEYgY29tZXMuIFRyZWF0IGEgZm9sbG93aW5nIENSCiAgICAgICAgICAgIGFzIGVuZC1vZi1oZWFkZXJzIGFzIHdlbGwuKi8KIAotICAgICAgICBpZigoJ1xyJyA9PSBsaW5lX3N0YXJ0WzBdKSB8fAotICAgICAgICAgICAoJ1xuJyA9PSBsaW5lX3N0YXJ0WzBdKSkgeworICAgICAgICBpZigoJ1xyJyA9PSBzLT5saW5lX3N0YXJ0WzBdKSB8fAorICAgICAgICAgICAoJ1xuJyA9PSBzLT5saW5lX3N0YXJ0WzBdKSkgewogICAgICAgICAgIC8qIGVuZCBvZiByZXNwb25zZS1oZWFkZXJzIGZyb20gdGhlIHByb3h5ICovCi0gICAgICAgICAgbnJlYWQgPSAwOyAvKiBtYWtlIG5leHQgcmVhZCBzdGFydCBvdmVyIGluIHRoZSByZWFkCi0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgKi8KLSAgICAgICAgICBwdHIgPSBjb25uLT5jb25uZWN0X2J1ZmZlcjsKKyAgICAgICAgICBzLT5wdHIgPSBzLT5jb25uZWN0X2J1ZmZlcjsKICAgICAgICAgICBpZigoNDA3ID09IGstPmh0dHBjb2RlKSAmJiAhZGF0YS0+c3RhdGUuYXV0aHByb2JsZW0pIHsKICAgICAgICAgICAgIC8qIElmIHdlIGdldCBhIDQwNyByZXNwb25zZSBjb2RlIHdpdGggY29udGVudCBsZW5ndGgKICAgICAgICAgICAgICAgIHdoZW4gd2UgaGF2ZSBubyBhdXRoIHByb2JsZW0sIHdlIG11c3QgaWdub3JlIHRoZQogICAgICAgICAgICAgICAgd2hvbGUgcmVzcG9uc2UtYm9keSAqLwotICAgICAgICAgICAga2VlcG9uID0gMjsKKyAgICAgICAgICAgIHMtPmtlZXBvbiA9IDI7CiAKLSAgICAgICAgICAgIGlmKGNsKSB7CisgICAgICAgICAgICBpZihzLT5jbCkgewogICAgICAgICAgICAgICBpbmZvZihkYXRhLCAiSWdub3JlICUiIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QKLSAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBvZiByZXNwb25zZS1ib2R5XG4iLCBjbCk7CisgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgb2YgcmVzcG9uc2UtYm9keVxuIiwgcy0+Y2wpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihjaHVua2VkX2VuY29kaW5nKSB7CisgICAgICAgICAgICBlbHNlIGlmKHMtPmNodW5rZWRfZW5jb2RpbmcpIHsKICAgICAgICAgICAgICAgQ0hVTktjb2RlIHI7CiAKICAgICAgICAgICAgICAgaW5mb2YoZGF0YSwgIklnbm9yZSBjaHVua2VkIHJlc3BvbnNlLWJvZHlcbiIpOwpAQCAtNDQ4LDQ2ICs0NjUsNDYgQEAKICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcmV0dXJucyEgKi8KICAgICAgICAgICAgICAgay0+aWdub3JlYm9keSA9IFRSVUU7CiAKLSAgICAgICAgICAgICAgaWYobGluZV9zdGFydFsxXSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgIGlmKHMtPmxpbmVfc3RhcnRbMV0gPT0gJ1xuJykgewogICAgICAgICAgICAgICAgIC8qIHRoaXMgY2FuIG9ubHkgYmUgYSBMRiBpZiB0aGUgbGV0dGVyIGF0IGluZGV4IDAKICAgICAgICAgICAgICAgICAgICB3YXMgYSBDUiAqLwotICAgICAgICAgICAgICAgIGxpbmVfc3RhcnQrKzsKKyAgICAgICAgICAgICAgICBzLT5saW5lX3N0YXJ0Kys7CiAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAvKiBub3cgcGFyc2UgdGhlIGNodW5rZWQgcGllY2Ugb2YgZGF0YSBzbyB0aGF0IHdlIGNhbgogICAgICAgICAgICAgICAgICBwcm9wZXJseSB0ZWxsIHdoZW4gdGhlIHN0cmVhbSBlbmRzICovCi0gICAgICAgICAgICAgIHIgPSBDdXJsX2h0dHBjaHVua19yZWFkKGNvbm4sIGxpbmVfc3RhcnQgKyAxLCAxLCAmZ290Ynl0ZXMpOworICAgICAgICAgICAgICByID0gQ3VybF9odHRwY2h1bmtfcmVhZChjb25uLCBzLT5saW5lX3N0YXJ0ICsgMSwgMSwgJmdvdGJ5dGVzKTsKICAgICAgICAgICAgICAgaWYociA9PSBDSFVOS0VfU1RPUCkgewogICAgICAgICAgICAgICAgIC8qIHdlJ3JlIGRvbmUgcmVhZGluZyBjaHVua3MhICovCiAgICAgICAgICAgICAgICAgaW5mb2YoZGF0YSwgImNodW5rIHJlYWRpbmcgRE9ORVxuIik7Ci0gICAgICAgICAgICAgICAga2VlcG9uID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgLyogd2UgZGlkIHRoZSBmdWxsIENPTk5FQ1QgdHJlYXRtZW50LCBnbyB0bwotICAgICAgICAgICAgICAgICAgIENPTVBMRVRFICovCi0gICAgICAgICAgICAgICAgY29ubi0+dHVubmVsX3N0YXRlW3NvY2tpbmRleF0gPSBUVU5ORUxfQ09NUExFVEU7CisgICAgICAgICAgICAgICAgcy0+a2VlcG9uID0gRkFMU0U7CisgICAgICAgICAgICAgICAgLyogd2UgZGlkIHRoZSBmdWxsIENPTk5FQ1QgdHJlYXRtZW50LCBnbyB0byBDT01QTEVURSAqLworICAgICAgICAgICAgICAgIHMtPnR1bm5lbF9zdGF0ZSA9IFRVTk5FTF9DT01QTEVURTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgIC8qIHdpdGhvdXQgY29udGVudC1sZW5ndGggb3IgY2h1bmtlZCBlbmNvZGluZywgd2UKICAgICAgICAgICAgICAgICAgY2FuJ3Qga2VlcCB0aGUgY29ubmVjdGlvbiBhbGl2ZSBzaW5jZSB0aGUgY2xvc2UgaXMKICAgICAgICAgICAgICAgICAgdGhlIGVuZCBzaWduYWwgc28gd2UgYmFpbCBvdXQgYXQgb25jZSBpbnN0ZWFkICovCi0gICAgICAgICAgICAgIGtlZXBvbiA9IEZBTFNFOworICAgICAgICAgICAgICBzLT5rZWVwb24gPSBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZQotICAgICAgICAgICAga2VlcG9uID0gRkFMU0U7Ci0gICAgICAgICAgLyogd2UgZGlkIHRoZSBmdWxsIENPTk5FQ1QgdHJlYXRtZW50LCBnbyB0byBDT01QTEVURSAqLwotICAgICAgICAgIGNvbm4tPnR1bm5lbF9zdGF0ZVtzb2NraW5kZXhdID0gVFVOTkVMX0NPTVBMRVRFOworICAgICAgICAgICAgcy0+a2VlcG9uID0gRkFMU0U7CisgICAgICAgICAgaWYoIXMtPmNsKQorICAgICAgICAgICAgLyogd2UgZGlkIHRoZSBmdWxsIENPTk5FQ1QgdHJlYXRtZW50LCBnbyB0byBDT01QTEVURSAqLworICAgICAgICAgICAgcy0+dHVubmVsX3N0YXRlID0gVFVOTkVMX0NPTVBMRVRFOwogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgbGluZV9zdGFydFtwZXJsaW5lXSA9IDA7IC8qIHplcm8gdGVybWluYXRlIHRoZSBidWZmZXIgKi8KLSAgICAgICAgaWYoKGNoZWNrcHJlZml4KCJXV1ctQXV0aGVudGljYXRlOiIsIGxpbmVfc3RhcnQpICYmCisgICAgICAgIHMtPmxpbmVfc3RhcnRbcy0+cGVybGluZV0gPSAwOyAvKiB6ZXJvIHRlcm1pbmF0ZSB0aGUgYnVmZmVyICovCisgICAgICAgIGlmKChjaGVja3ByZWZpeCgiV1dXLUF1dGhlbnRpY2F0ZToiLCBzLT5saW5lX3N0YXJ0KSAmJgogICAgICAgICAgICAgKDQwMSA9PSBrLT5odHRwY29kZSkpIHx8Ci0gICAgICAgICAgIChjaGVja3ByZWZpeCgiUHJveHktYXV0aGVudGljYXRlOiIsIGxpbmVfc3RhcnQpICYmCisgICAgICAgICAgIChjaGVja3ByZWZpeCgiUHJveHktYXV0aGVudGljYXRlOiIsIHMtPmxpbmVfc3RhcnQpICYmCiAgICAgICAgICAgICAoNDA3ID09IGstPmh0dHBjb2RlKSkpIHsKIAogICAgICAgICAgIGJvb2wgcHJveHkgPSAoay0+aHR0cGNvZGUgPT0gNDA3KSA/IFRSVUUgOiBGQUxTRTsKLSAgICAgICAgICBjaGFyICphdXRoID0gQ3VybF9jb3B5X2hlYWRlcl92YWx1ZShsaW5lX3N0YXJ0KTsKKyAgICAgICAgICBjaGFyICphdXRoID0gQ3VybF9jb3B5X2hlYWRlcl92YWx1ZShzLT5saW5lX3N0YXJ0KTsKICAgICAgICAgICBpZighYXV0aCkKICAgICAgICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogCkBAIC00OTgsNyArNTE1LDcgQEAKICAgICAgICAgICBpZihyZXN1bHQpCiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoY2hlY2twcmVmaXgoIkNvbnRlbnQtTGVuZ3RoOiIsIGxpbmVfc3RhcnQpKSB7CisgICAgICAgIGVsc2UgaWYoY2hlY2twcmVmaXgoIkNvbnRlbnQtTGVuZ3RoOiIsIHMtPmxpbmVfc3RhcnQpKSB7CiAgICAgICAgICAgaWYoay0+aHR0cGNvZGUvMTAwID09IDIpIHsKICAgICAgICAgICAgIC8qIEEgY2xpZW50IE1VU1QgaWdub3JlIGFueSBDb250ZW50LUxlbmd0aCBvciBUcmFuc2Zlci1FbmNvZGluZwogICAgICAgICAgICAgICAgaGVhZGVyIGZpZWxkcyByZWNlaXZlZCBpbiBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgdG8gQ09OTkVDVC4KQEAgLTUwNywxMyArNTI0LDEzIEBACiAgICAgICAgICAgICAgICAgICBrLT5odHRwY29kZSk7CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgY2wgPSBjdXJseF9zdHJ0b29mZnQobGluZV9zdGFydCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oIkNvbnRlbnQtTGVuZ3RoOiIpLCBOVUxMLCAxMCk7CisgICAgICAgICAgICAodm9pZCljdXJseF9zdHJ0b29mZnQocy0+bGluZV9zdGFydCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKCJDb250ZW50LUxlbmd0aDoiKSwgTlVMTCwgMTAsICZzLT5jbCk7CiAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoQ3VybF9jb21wYXJlaGVhZGVyKGxpbmVfc3RhcnQsICJDb25uZWN0aW9uOiIsICJjbG9zZSIpKQorICAgICAgICBlbHNlIGlmKEN1cmxfY29tcGFyZWhlYWRlcihzLT5saW5lX3N0YXJ0LCAiQ29ubmVjdGlvbjoiLCAiY2xvc2UiKSkKICAgICAgICAgICBjbG9zZUNvbm5lY3Rpb24gPSBUUlVFOwotICAgICAgICBlbHNlIGlmKGNoZWNrcHJlZml4KCJUcmFuc2Zlci1FbmNvZGluZzoiLCBsaW5lX3N0YXJ0KSkgeworICAgICAgICBlbHNlIGlmKGNoZWNrcHJlZml4KCJUcmFuc2Zlci1FbmNvZGluZzoiLCBzLT5saW5lX3N0YXJ0KSkgewogICAgICAgICAgIGlmKGstPmh0dHBjb2RlLzEwMCA9PSAyKSB7CiAgICAgICAgICAgICAvKiBBIGNsaWVudCBNVVNUIGlnbm9yZSBhbnkgQ29udGVudC1MZW5ndGggb3IgVHJhbnNmZXItRW5jb2RpbmcKICAgICAgICAgICAgICAgIGhlYWRlciBmaWVsZHMgcmVjZWl2ZWQgaW4gYSBzdWNjZXNzZnVsIHJlc3BvbnNlIHRvIENPTk5FQ1QuCkBAIC01MjEsMjYgKzUzOCwyNyBAQAogICAgICAgICAgICAgaW5mb2YoZGF0YSwgIklnbm9yaW5nIFRyYW5zZmVyLUVuY29kaW5nIGluICIKICAgICAgICAgICAgICAgICAgICJDT05ORUNUICUwM2QgcmVzcG9uc2VcbiIsIGstPmh0dHBjb2RlKTsKICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZihDdXJsX2NvbXBhcmVoZWFkZXIobGluZV9zdGFydCwKKyAgICAgICAgICBlbHNlIGlmKEN1cmxfY29tcGFyZWhlYWRlcihzLT5saW5lX3N0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcmFuc2Zlci1FbmNvZGluZzoiLCAiY2h1bmtlZCIpKSB7CiAgICAgICAgICAgICBpbmZvZihkYXRhLCAiQ09OTkVDVCByZXNwb25kZWQgY2h1bmtlZFxuIik7Ci0gICAgICAgICAgICBjaHVua2VkX2VuY29kaW5nID0gVFJVRTsKKyAgICAgICAgICAgIHMtPmNodW5rZWRfZW5jb2RpbmcgPSBUUlVFOwogICAgICAgICAgICAgLyogaW5pdCBvdXIgY2h1bmt5IGVuZ2luZSAqLwogICAgICAgICAgICAgQ3VybF9odHRwY2h1bmtfaW5pdChjb25uKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihDdXJsX2NvbXBhcmVoZWFkZXIobGluZV9zdGFydCwgIlByb3h5LUNvbm5lY3Rpb246IiwgImNsb3NlIikpCisgICAgICAgIGVsc2UgaWYoQ3VybF9jb21wYXJlaGVhZGVyKHMtPmxpbmVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm94eS1Db25uZWN0aW9uOiIsICJjbG9zZSIpKQogICAgICAgICAgIGNsb3NlQ29ubmVjdGlvbiA9IFRSVUU7Ci0gICAgICAgIGVsc2UgaWYoMiA9PSBzc2NhbmYobGluZV9zdGFydCwgIkhUVFAvMS4lZCAlZCIsCisgICAgICAgIGVsc2UgaWYoMiA9PSBzc2NhbmYocy0+bGluZV9zdGFydCwgIkhUVFAvMS4lZCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1YnZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmstPmh0dHBjb2RlKSkgewogICAgICAgICAgIC8qIHN0b3JlIHRoZSBIVFRQIGNvZGUgZnJvbSB0aGUgcHJveHkgKi8KICAgICAgICAgICBkYXRhLT5pbmZvLmh0dHBwcm94eWNvZGUgPSBrLT5odHRwY29kZTsKICAgICAgICAgfQogCi0gICAgICAgIHBlcmxpbmUgPSAwOyAvKiBsaW5lIHN0YXJ0cyBvdmVyIGhlcmUgKi8KLSAgICAgICAgcHRyID0gY29ubi0+Y29ubmVjdF9idWZmZXI7Ci0gICAgICAgIGxpbmVfc3RhcnQgPSBwdHI7CisgICAgICAgIHMtPnBlcmxpbmUgPSAwOyAvKiBsaW5lIHN0YXJ0cyBvdmVyIGhlcmUgKi8KKyAgICAgICAgcy0+cHRyID0gcy0+Y29ubmVjdF9idWZmZXI7CisgICAgICAgIHMtPmxpbmVfc3RhcnQgPSBzLT5wdHI7CiAgICAgICB9IC8qIHdoaWxlIHRoZXJlJ3MgYnVmZmVyIGxlZnQgYW5kIGxvb3AgaXMgcmVxdWVzdGVkICovCiAKICAgICAgIGlmKEN1cmxfcGdyc1VwZGF0ZShjb25uKSkKQEAgLTU0OSw3ICs1NjcsNyBAQAogICAgICAgaWYoZXJyb3IpCiAgICAgICAgIHJldHVybiBDVVJMRV9SRUNWX0VSUk9SOwogCi0gICAgICBpZihkYXRhLT5pbmZvLmh0dHBwcm94eWNvZGUgIT0gMjAwKSB7CisgICAgICBpZihkYXRhLT5pbmZvLmh0dHBwcm94eWNvZGUvMTAwICE9IDIpIHsKICAgICAgICAgLyogRGVhbCB3aXRoIHRoZSBwb3NzaWJseSBhbHJlYWR5IHJlY2VpdmVkIGF1dGhlbnRpY2F0ZQogICAgICAgICAgICBoZWFkZXJzLiAnbmV3dXJsJyBpcyBzZXQgdG8gYSBuZXcgVVJMIGlmIHdlIG11c3QgbG9vcC4gKi8KICAgICAgICAgcmVzdWx0ID0gQ3VybF9odHRwX2F1dGhfYWN0KGNvbm4pOwpAQCAtNTc0LDE5ICs1OTIsMTcgQEAKICAgICAvKiBJZiB3ZSBhcmUgc3VwcG9zZWQgdG8gY29udGludWUgYW5kIHJlcXVlc3QgYSBuZXcgVVJMLCB3aGljaCBiYXNpY2FsbHkKICAgICAgKiBtZWFucyB0aGUgSFRUUCBhdXRoZW50aWNhdGlvbiBpcyBzdGlsbCBnb2luZyBvbiBzbyBpZiB0aGUgdHVubmVsCiAgICAgICogaXMgY29tcGxldGUgd2Ugc3RhcnQgb3ZlciBpbiBJTklUIHN0YXRlICovCi0gICAgaWYoZGF0YS0+cmVxLm5ld3VybCAmJgotICAgICAgIChUVU5ORUxfQ09NUExFVEUgPT0gY29ubi0+dHVubmVsX3N0YXRlW3NvY2tpbmRleF0pKSB7Ci0gICAgICBjb25uLT50dW5uZWxfc3RhdGVbc29ja2luZGV4XSA9IFRVTk5FTF9JTklUOwotICAgICAgaW5mb2YoZGF0YSwgIlRVTk5FTF9TVEFURSBzd2l0Y2hlZCB0bzogJWRcbiIsCi0gICAgICAgICAgICBjb25uLT50dW5uZWxfc3RhdGVbc29ja2luZGV4XSk7CisgICAgaWYoZGF0YS0+cmVxLm5ld3VybCAmJiAoVFVOTkVMX0NPTVBMRVRFID09IHMtPnR1bm5lbF9zdGF0ZSkpIHsKKyAgICAgIGNvbm5lY3RfaW5pdChjb25uLCBUUlVFKTsgLyogcmVpbml0ICovCiAgICAgfQogCiAgIH0gd2hpbGUoZGF0YS0+cmVxLm5ld3VybCk7CiAKLSAgaWYoMjAwICE9IGRhdGEtPnJlcS5odHRwY29kZSkgeworICBpZihkYXRhLT5pbmZvLmh0dHBwcm94eWNvZGUvMTAwICE9IDIpIHsKICAgICBpZihjbG9zZUNvbm5lY3Rpb24gJiYgZGF0YS0+cmVxLm5ld3VybCkgewogICAgICAgY29ubi0+Yml0cy5wcm94eV9jb25uZWN0X2Nsb3NlZCA9IFRSVUU7CiAgICAgICBpbmZvZihkYXRhLCAiQ29ubmVjdCBtZSBhZ2FpbiBwbGVhc2VcbiIpOworICAgICAgY29ubmVjdF9kb25lKGNvbm4pOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgIGZyZWUoZGF0YS0+cmVxLm5ld3VybCk7CkBAIC01OTgsNyArNjE0LDcgQEAKICAgICB9CiAKICAgICAvKiB0byBiYWNrIHRvIGluaXQgc3RhdGUgKi8KLSAgICBjb25uLT50dW5uZWxfc3RhdGVbc29ja2luZGV4XSA9IFRVTk5FTF9JTklUOworICAgIHMtPnR1bm5lbF9zdGF0ZSA9IFRVTk5FTF9JTklUOwogCiAgICAgaWYoY29ubi0+Yml0cy5wcm94eV9jb25uZWN0X2Nsb3NlZCkKICAgICAgIC8qIHRoaXMgaXMgbm90IGFuIGVycm9yLCBqdXN0IHBhcnQgb2YgdGhlIGNvbm5lY3Rpb24gbmVnb3RpYXRpb24gKi8KQEAgLTYwOCw3ICs2MjQsNyBAQAogICAgIHJldHVybiBDVVJMRV9SRUNWX0VSUk9SOwogICB9CiAKLSAgY29ubi0+dHVubmVsX3N0YXRlW3NvY2tpbmRleF0gPSBUVU5ORUxfQ09NUExFVEU7CisgIHMtPnR1bm5lbF9zdGF0ZSA9IFRVTk5FTF9DT01QTEVURTsKIAogICAvKiBJZiBhIHByb3h5LWF1dGhvcml6YXRpb24gaGVhZGVyIHdhcyB1c2VkIGZvciB0aGUgcHJveHksIHRoZW4gd2Ugc2hvdWxkCiAgICAgIG1ha2Ugc3VyZSB0aGF0IGl0IGlzbid0IGFjY2lkZW50YWxseSB1c2VkIGZvciB0aGUgZG9jdW1lbnQgcmVxdWVzdApAQCAtNjE4LDEzICs2MzQsMjQgQEAKIAogICBkYXRhLT5zdGF0ZS5hdXRocHJveHkuZG9uZSA9IFRSVUU7CiAKLSAgaW5mb2YoZGF0YSwgIlByb3h5IHJlcGxpZWQgT0sgdG8gQ09OTkVDVCByZXF1ZXN0XG4iKTsKKyAgaW5mb2YoZGF0YSwgIlByb3h5IHJlcGxpZWQgJWQgdG8gQ09OTkVDVCByZXF1ZXN0XG4iLAorICAgICAgICBkYXRhLT5pbmZvLmh0dHBwcm94eWNvZGUpOwogICBkYXRhLT5yZXEuaWdub3JlYm9keSA9IEZBTFNFOyAvKiBwdXQgaXQgKGJhY2spIHRvIG5vbi1pZ25vcmUgc3RhdGUgKi8KICAgY29ubi0+Yml0cy5yZXdpbmRhZnRlcnNlbmQgPSBGQUxTRTsgLyogbWFrZSBzdXJlIHRoaXMgaXNuJ3Qgc2V0IGZvciB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQgcmVxdWVzdCAgKi8KICAgcmV0dXJuIENVUkxFX09LOwogfQogCit2b2lkIEN1cmxfY29ubmVjdF9mcmVlKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCit7CisgIHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiA9IGRhdGEtPmVhc3lfY29ubjsKKyAgc3RydWN0IGh0dHBfY29ubmVjdF9zdGF0ZSAqcyA9IGNvbm4tPmNvbm5lY3Rfc3RhdGU7CisgIGlmKHMpIHsKKyAgICBmcmVlKHMpOworICAgIGNvbm4tPmNvbm5lY3Rfc3RhdGUgPSBOVUxMOworICB9Cit9CisKIC8qCiAgKiBDdXJsX3Byb3h5Q09OTkVDVCgpIHJlcXVpcmVzIHRoYXQgd2UncmUgY29ubmVjdGVkIHRvIGEgSFRUUCBwcm94eS4gVGhpcwogICogZnVuY3Rpb24gd2lsbCBpc3N1ZSB0aGUgbmVjZXNzYXJ5IGNvbW1hbmRzIHRvIGdldCBhIHNlYW1sZXNzIHR1bm5lbCB0aHJvdWdoCkBAIC02MzcsMjAgKzY2NCwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlbW90ZV9wb3J0KQogewogICBDVVJMY29kZSByZXN1bHQ7Ci0gIGlmKFRVTk5FTF9JTklUID09IGNvbm4tPnR1bm5lbF9zdGF0ZVtzb2NraW5kZXhdKSB7Ci0gICAgaWYoIWNvbm4tPmNvbm5lY3RfYnVmZmVyKSB7Ci0gICAgICBjb25uLT5jb25uZWN0X2J1ZmZlciA9IG1hbGxvYyhDT05ORUNUX0JVRkZFUl9TSVpFKTsKLSAgICAgIGlmKCFjb25uLT5jb25uZWN0X2J1ZmZlcikKLSAgICAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7Ci0gICAgfQorICBpZighY29ubi0+Y29ubmVjdF9zdGF0ZSkgeworICAgIHJlc3VsdCA9IGNvbm5lY3RfaW5pdChjb25uLCBGQUxTRSk7CisgICAgaWYocmVzdWx0KQorICAgICAgcmV0dXJuIHJlc3VsdDsKICAgfQogICByZXN1bHQgPSBDT05ORUNUKGNvbm4sIHNvY2tpbmRleCwgaG9zdG5hbWUsIHJlbW90ZV9wb3J0KTsKIAotICBpZihyZXN1bHQgfHwgKFRVTk5FTF9DT01QTEVURSA9PSBjb25uLT50dW5uZWxfc3RhdGVbc29ja2luZGV4XSkpCi0gICAgQ3VybF9zYWZlZnJlZShjb25uLT5jb25uZWN0X2J1ZmZlcik7CisgIGlmKHJlc3VsdCB8fCBDdXJsX2Nvbm5lY3RfY29tcGxldGUoY29ubikpCisgICAgY29ubmVjdF9kb25lKGNvbm4pOwogCiAgIHJldHVybiByZXN1bHQ7CiB9CiAKKyNlbHNlCit2b2lkIEN1cmxfY29ubmVjdF9mcmVlKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCit7CisgICh2b2lkKWRhdGE7Cit9CiAKICNlbmRpZiAvKiBDVVJMX0RJU0FCTEVfUFJPWFkgKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHBfcHJveHkuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHBfcHJveHkuaAppbmRleCBjYmIxYWI0Li5lMTlmYTg1IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwX3Byb3h5LmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cF9wcm94eS5oCkBAIC0yMiw2ICsyMiw5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgImN1cmxfc2V0dXAuaCIKKyNpbmNsdWRlICJ1cmxkYXRhLmgiCisKICNpZiAhZGVmaW5lZChDVVJMX0RJU0FCTEVfUFJPWFkpICYmICFkZWZpbmVkKENVUkxfRElTQUJMRV9IVFRQKQogLyogZnRwIGNhbiB1c2UgdGhpcyBhcyB3ZWxsICovCiBDVVJMY29kZSBDdXJsX3Byb3h5Q09OTkVDVChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCkBAIC0zMyw5ICszNiwxNiBAQAogCiBDVVJMY29kZSBDdXJsX3Byb3h5X2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKIAorYm9vbCBDdXJsX2Nvbm5lY3RfY29tcGxldGUoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKTsKK2Jvb2wgQ3VybF9jb25uZWN0X29uZ29pbmcoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKTsKKwogI2Vsc2UKICNkZWZpbmUgQ3VybF9wcm94eUNPTk5FQ1QoeCx5LHosdykgQ1VSTEVfTk9UX0JVSUxUX0lOCiAjZGVmaW5lIEN1cmxfcHJveHlfY29ubmVjdCh4LHkpIENVUkxFX09LCisjZGVmaW5lIEN1cmxfY29ubmVjdF9jb21wbGV0ZSh4KSBDVVJMRV9PSworI2RlZmluZSBDdXJsX2Nvbm5lY3Rfb25nb2luZyh4KSBGQUxTRQogI2VuZGlmCiAKK3ZvaWQgQ3VybF9jb25uZWN0X2ZyZWUoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSk7CisKICNlbmRpZiAvKiBIRUFERVJfQ1VSTF9IVFRQX1BST1hZX0ggKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2lmMmlwLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9pZjJpcC5jCmluZGV4IDRkZTgxYmUuLmNlMzhlYTEgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2lmMmlwLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaWYyaXAuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtNzEsNiArNzEsOCBAQAogICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmIgPSBzYTYtPnNpbjZfYWRkci5zNl9hZGRyOwogICAgIHVuc2lnbmVkIHNob3J0IHcgPSAodW5zaWduZWQgc2hvcnQpICgoYlswXSA8PCA4KSB8IGJbMV0pOwogCisgICAgaWYoKGJbMF0gJiAweEZFKSA9PSAweEZDKSAvKiBIYW5kbGUgVUxBcyAqLworICAgICAgcmV0dXJuIElQVjZfU0NPUEVfVU5JUVVFTE9DQUw7CiAgICAgc3dpdGNoKHcgJiAweEZGQzApIHsKICAgICBjYXNlIDB4RkU4MDoKICAgICAgIHJldHVybiBJUFY2X1NDT1BFX0xJTktMT0NBTDsKQEAgLTEwMSw3ICsxMDMsNyBAQAogICBzdHJ1Y3QgaWZhZGRycyAqaWZhY2UsICpoZWFkOwogCiAgIGlmKGdldGlmYWRkcnMoJmhlYWQpID49IDApIHsKLSAgICBmb3IoaWZhY2U9aGVhZDsgaWZhY2UgIT0gTlVMTDsgaWZhY2U9aWZhY2UtPmlmYV9uZXh0KSB7CisgICAgZm9yKGlmYWNlID0gaGVhZDsgaWZhY2UgIT0gTlVMTDsgaWZhY2UgPSBpZmFjZS0+aWZhX25leHQpIHsKICAgICAgIGlmKHN0cmNhc2Vjb21wYXJlKGlmYWNlLT5pZmFfbmFtZSwgaW50ZXJmKSkgewogICAgICAgICByZXN1bHQgPSBUUlVFOwogICAgICAgICBicmVhazsKQEAgLTEyMSwxNSArMTIzLDE1IEBACiAKICNpZm5kZWYgRU5BQkxFX0lQVjYKICAgKHZvaWQpIHJlbW90ZV9zY29wZTsKKyNlbmRpZgogCi0jaWZuZGVmIEhBVkVfU09DS0FERFJfSU42X1NJTjZfU0NPUEVfSUQKKyNpZiAhZGVmaW5lZChIQVZFX1NPQ0tBRERSX0lONl9TSU42X1NDT1BFX0lEKSB8fCBcCisgICAgIWRlZmluZWQoRU5BQkxFX0lQVjYpCiAgICh2b2lkKSByZW1vdGVfc2NvcGVfaWQ7CiAjZW5kaWYKIAotI2VuZGlmCi0KICAgaWYoZ2V0aWZhZGRycygmaGVhZCkgPj0gMCkgewotICAgIGZvcihpZmFjZSA9IGhlYWQ7IGlmYWNlICE9IE5VTEw7IGlmYWNlPWlmYWNlLT5pZmFfbmV4dCkgeworICAgIGZvcihpZmFjZSA9IGhlYWQ7IGlmYWNlICE9IE5VTEw7IGlmYWNlID0gaWZhY2UtPmlmYV9uZXh0KSB7CiAgICAgICBpZihpZmFjZS0+aWZhX2FkZHIgIT0gTlVMTCkgewogICAgICAgICBpZihpZmFjZS0+aWZhX2FkZHItPnNhX2ZhbWlseSA9PSBhZikgewogICAgICAgICAgIGlmKHN0cmNhc2Vjb21wYXJlKGlmYWNlLT5pZmFfbmFtZSwgaW50ZXJmKSkgewpAQCAtMjI4LDcgKzIzMCw3IEBACiAgICAgcmV0dXJuIElGMklQX05PVF9GT1VORDsKIAogICBtZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOwotICBtZW1jcHkocmVxLmlmcl9uYW1lLCBpbnRlcmYsIGxlbisxKTsKKyAgbWVtY3B5KHJlcS5pZnJfbmFtZSwgaW50ZXJmLCBsZW4gKyAxKTsKICAgcmVxLmlmcl9hZGRyLnNhX2ZhbWlseSA9IEFGX0lORVQ7CiAKICAgaWYoaW9jdGwoZHVtbXksIFNJT0NHSUZBRERSLCAmcmVxKSA8IDApIHsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2lmMmlwLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9pZjJpcC5oCmluZGV4IGYzYTdmZjAuLmE5MGU2NjIgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2lmMmlwLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaWYyaXAuaApAQCAtNyw3ICs3LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE0LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtMjcsNyArMjcsOCBAQAogI2RlZmluZSBJUFY2X1NDT1BFX0dMT0JBTCAgICAgICAwICAgICAgIC8qIEdsb2JhbCBzY29wZS4gKi8KICNkZWZpbmUgSVBWNl9TQ09QRV9MSU5LTE9DQUwgICAgMSAgICAgICAvKiBMaW5rLWxvY2FsIHNjb3BlLiAqLwogI2RlZmluZSBJUFY2X1NDT1BFX1NJVEVMT0NBTCAgICAyICAgICAgIC8qIFNpdGUtbG9jYWwgc2NvcGUgKGRlcHJlY2F0ZWQpLiAqLwotI2RlZmluZSBJUFY2X1NDT1BFX05PREVMT0NBTCAgICAzICAgICAgIC8qIExvb3BiYWNrLiAqLworI2RlZmluZSBJUFY2X1NDT1BFX1VOSVFVRUxPQ0FMICAzICAgICAgIC8qIFVuaXF1ZSBsb2NhbCAqLworI2RlZmluZSBJUFY2X1NDT1BFX05PREVMT0NBTCAgICA0ICAgICAgIC8qIExvb3BiYWNrLiAqLwogCiB1bnNpZ25lZCBpbnQgQ3VybF9pcHY2X3Njb3BlKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EpOwogCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9pbWFwLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9pbWFwLmMKaW5kZXggYjUyOGY3Ny4uOTU0ZDE4ZiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaW1hcC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2ltYXAuYwpAQCAtNjgsNiArNjgsNyBAQAogI2luY2x1ZGUgImh0dHAuaCIgLyogZm9yIEhUVFAgcHJveHkgdHVubmVsIHN0dWZmICovCiAjaW5jbHVkZSAic29ja3MuaCIKICNpbmNsdWRlICJpbWFwLmgiCisjaW5jbHVkZSAibWltZS5oIgogI2luY2x1ZGUgInN0cnRvb2ZmdC5oIgogI2luY2x1ZGUgInN0cmNhc2UuaCIKICNpbmNsdWRlICJ2dGxzL3Z0bHMuaCIKQEAgLTEyOCw2ICsxMjksNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIGltYXBfZGlzY29ubmVjdCwgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9JTUFQLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX0lNQVAsICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfQ0xPU0VBQ1RJT058ICAgICAgICAgICAgICAvKiBmbGFncyAqLwpAQCAtMTU0LDY5ICsxNTYsMjIgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBpbWFwX2Rpc2Nvbm5lY3QsICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfSU1BUFMsICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19JTUFQUywgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX0NMT1NFQUNUSU9OIHwgUFJPVE9QVF9TU0wgLyogZmxhZ3MgKi8KIH07CiAjZW5kaWYKIAotI2lmbmRlZiBDVVJMX0RJU0FCTEVfSFRUUAotLyoKLSAqIEhUVFAtcHJveHllZCBJTUFQIHByb3RvY29sIGhhbmRsZXIuCi0gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBDdXJsX2hhbmRsZXIgQ3VybF9oYW5kbGVyX2ltYXBfcHJveHkgPSB7Ci0gICJJTUFQIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NoZW1lICovCi0gIEN1cmxfaHR0cF9zZXR1cF9jb25uLCAgICAgICAgICAgICAgICAgLyogc2V0dXBfY29ubmVjdGlvbiAqLwotICBDdXJsX2h0dHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvX2l0ICovCi0gIEN1cmxfaHR0cF9kb25lLCAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvX21vcmUgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0X2l0ICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGluZyAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvaW5nICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9fZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvaW5nX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb21vcmVfZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KLSAgUE9SVF9JTUFQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCi0gIENVUkxQUk9UT19IVFRQLCAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KLSAgUFJPVE9QVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyAqLwotfTsKLQotI2lmZGVmIFVTRV9TU0wKLS8qCi0gKiBIVFRQLXByb3h5ZWQgSU1BUFMgcHJvdG9jb2wgaGFuZGxlci4KLSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IEN1cmxfaGFuZGxlciBDdXJsX2hhbmRsZXJfaW1hcHNfcHJveHkgPSB7Ci0gICJJTUFQUyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NoZW1lICovCi0gIEN1cmxfaHR0cF9zZXR1cF9jb25uLCAgICAgICAgICAgICAgICAgLyogc2V0dXBfY29ubmVjdGlvbiAqLwotICBDdXJsX2h0dHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvX2l0ICovCi0gIEN1cmxfaHR0cF9kb25lLCAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvX21vcmUgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0X2l0ICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGluZyAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvaW5nICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9fZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvaW5nX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb21vcmVfZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KLSAgUE9SVF9JTUFQUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCi0gIENVUkxQUk9UT19IVFRQLCAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KLSAgUFJPVE9QVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyAqLwotfTsKLSNlbmRpZgotI2VuZGlmCisjZGVmaW5lIElNQVBfUkVTUF9PSyAgICAgICAxCisjZGVmaW5lIElNQVBfUkVTUF9OT1RfT0sgICAyCisjZGVmaW5lIElNQVBfUkVTUF9QUkVBVVRIICAzCiAKIC8qIFNBU0wgcGFyYW1ldGVycyBmb3IgdGhlIGltYXAgcHJvdG9jb2wgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgU0FTTHByb3RvIHNhc2xpbWFwID0gewogICAiaW1hcCIsICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHNlcnZpY2UgbmFtZSAqLwogICAnKycsICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSByZWNlaXZlZCB3aGVuIGNvbnRpbnVhdGlvbiBpcyBleHBlY3RlZCAqLwotICAnTycsICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSB0byByZWNlaXZlIHVwb24gYXV0aGVudGljYXRpb24gc3VjY2VzcyAqLworICBJTUFQX1JFU1BfT0ssICAgICAgICAgICAgICAgLyogQ29kZSB0byByZWNlaXZlIHVwb24gYXV0aGVudGljYXRpb24gc3VjY2VzcyAqLwogICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBpbml0aWFsIHJlc3BvbnNlIGxlbmd0aCAobm8gbWF4KSAqLwogICBpbWFwX3BlcmZvcm1fYXV0aGVudGljYXRlLCAgLyogU2VuZCBhdXRoZW50aWNhdGlvbiBjb21tYW5kICovCiAgIGltYXBfY29udGludWVfYXV0aGVudGljYXRlLCAvKiBTZW5kIGF1dGhlbnRpY2F0aW9uIGNvbnRpbnVhdGlvbiAqLwpAQCAtMjk5LDE1ICsyNTQsMTEgQEAKICAgICBsZW4gLT0gaWRfbGVuICsgMTsKIAogICAgIGlmKGxlbiA+PSAyICYmICFtZW1jbXAobGluZSwgIk9LIiwgMikpCi0gICAgICAqcmVzcCA9ICdPJzsKLSAgICBlbHNlIGlmKGxlbiA+PSAyICYmICFtZW1jbXAobGluZSwgIk5PIiwgMikpCi0gICAgICAqcmVzcCA9ICdOJzsKLSAgICBlbHNlIGlmKGxlbiA+PSAzICYmICFtZW1jbXAobGluZSwgIkJBRCIsIDMpKQotICAgICAgKnJlc3AgPSAnQic7Ci0gICAgZWxzZSB7Ci0gICAgICBmYWlsZihjb25uLT5kYXRhLCAiQmFkIHRhZ2dlZCByZXNwb25zZSIpOwotICAgICAgKnJlc3AgPSAtMTsKLSAgICB9CisgICAgICAqcmVzcCA9IElNQVBfUkVTUF9PSzsKKyAgICBlbHNlIGlmKGxlbiA+PSA3ICYmICFtZW1jbXAobGluZSwgIlBSRUFVVEgiLCA3KSkKKyAgICAgICpyZXNwID0gSU1BUF9SRVNQX1BSRUFVVEg7CisgICAgZWxzZQorICAgICAgKnJlc3AgPSBJTUFQX1JFU1BfTk9UX09LOwogCiAgICAgcmV0dXJuIFRSVUU7CiAgIH0KQEAgLTYxMyw5ICs1NjQsMTAgQEAKICAgc3RydWN0IGltYXBfY29ubiAqaW1hcGMgPSAmY29ubi0+cHJvdG8uaW1hcGM7CiAgIHNhc2xwcm9ncmVzcyBwcm9ncmVzczsKIAotICAvKiBDaGVjayB3ZSBoYXZlIGVub3VnaCBkYXRhIHRvIGF1dGhlbnRpY2F0ZSB3aXRoIGFuZCBlbmQgdGhlCi0gICAgIGNvbm5lY3QgcGhhc2UgaWYgd2UgZG9uJ3QgKi8KLSAgaWYoIUN1cmxfc2FzbF9jYW5fYXV0aGVudGljYXRlKCZpbWFwYy0+c2FzbCwgY29ubikpIHsKKyAgLyogQ2hlY2sgaWYgYWxyZWFkeSBhdXRoZW50aWNhdGVkIE9SIGlmIHRoZXJlIGlzIGVub3VnaCBkYXRhIHRvIGF1dGhlbnRpY2F0ZQorICAgICB3aXRoIGFuZCBlbmQgdGhlIGNvbm5lY3QgcGhhc2UgaWYgd2UgZG9uJ3QgKi8KKyAgaWYoaW1hcGMtPnByZWF1dGggfHwKKyAgICAgIUN1cmxfc2FzbF9jYW5fYXV0aGVudGljYXRlKCZpbWFwYy0+c2FzbCwgY29ubikpIHsKICAgICBzdGF0ZShjb25uLCBJTUFQX1NUT1ApOwogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KQEAgLTc1NywxOCArNzA5LDQ4IEBACiBzdGF0aWMgQ1VSTGNvZGUgaW1hcF9wZXJmb3JtX2FwcGVuZChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCiB7CiAgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOwotICBzdHJ1Y3QgSU1BUCAqaW1hcCA9IGNvbm4tPmRhdGEtPnJlcS5wcm90b3A7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOworICBzdHJ1Y3QgSU1BUCAqaW1hcCA9IGRhdGEtPnJlcS5wcm90b3A7CiAgIGNoYXIgKm1haWxib3g7CiAKICAgLyogQ2hlY2sgd2UgaGF2ZSBhIG1haWxib3ggKi8KICAgaWYoIWltYXAtPm1haWxib3gpIHsKLSAgICBmYWlsZihjb25uLT5kYXRhLCAiQ2Fubm90IEFQUEVORCB3aXRob3V0IGEgbWFpbGJveC4iKTsKKyAgICBmYWlsZihkYXRhLCAiQ2Fubm90IEFQUEVORCB3aXRob3V0IGEgbWFpbGJveC4iKTsKICAgICByZXR1cm4gQ1VSTEVfVVJMX01BTEZPUk1BVDsKICAgfQogCisgIC8qIFByZXBhcmUgdGhlIG1pbWUgZGF0YSBpZiBzb21lLiAqLworICBpZihkYXRhLT5zZXQubWltZXBvc3Qua2luZCAhPSBNSU1FS0lORF9OT05FKSB7CisgICAgLyogVXNlIHRoZSB3aG9sZSBzdHJ1Y3R1cmUgYXMgZGF0YS4gKi8KKyAgICBkYXRhLT5zZXQubWltZXBvc3QuZmxhZ3MgJj0gfk1JTUVfQk9EWV9PTkxZOworCisgICAgLyogQWRkIGV4dGVybmFsIGhlYWRlcnMgYW5kIG1pbWUgdmVyc2lvbi4gKi8KKyAgICBjdXJsX21pbWVfaGVhZGVycygmZGF0YS0+c2V0Lm1pbWVwb3N0LCBkYXRhLT5zZXQuaGVhZGVycywgMCk7CisgICAgcmVzdWx0ID0gQ3VybF9taW1lX3ByZXBhcmVfaGVhZGVycygmZGF0YS0+c2V0Lm1pbWVwb3N0LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTUlNRVNUUkFURUdZX01BSUwpOworCisgICAgaWYoIXJlc3VsdCkKKyAgICAgIGlmKCFDdXJsX2NoZWNraGVhZGVycyhjb25uLCAiTWltZS1WZXJzaW9uIikpCisgICAgICAgIHJlc3VsdCA9IEN1cmxfbWltZV9hZGRfaGVhZGVyKCZkYXRhLT5zZXQubWltZXBvc3QuY3VybGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaW1lLVZlcnNpb246IDEuMCIpOworCisgICAgLyogTWFrZSBzdXJlIHdlIHdpbGwgcmVhZCB0aGUgZW50aXJlIG1pbWUgc3RydWN0dXJlLiAqLworICAgIGlmKCFyZXN1bHQpCisgICAgICByZXN1bHQgPSBDdXJsX21pbWVfcmV3aW5kKCZkYXRhLT5zZXQubWltZXBvc3QpOworCisgICAgaWYocmVzdWx0KQorICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGRhdGEtPnN0YXRlLmluZmlsZXNpemUgPSBDdXJsX21pbWVfc2l6ZSgmZGF0YS0+c2V0Lm1pbWVwb3N0KTsKKworICAgIC8qIFJlYWQgZnJvbSBtaW1lIHN0cnVjdHVyZS4gKi8KKyAgICBkYXRhLT5zdGF0ZS5mcmVhZF9mdW5jID0gKGN1cmxfcmVhZF9jYWxsYmFjaykgQ3VybF9taW1lX3JlYWQ7CisgICAgZGF0YS0+c3RhdGUuaW4gPSAodm9pZCAqKSAmZGF0YS0+c2V0Lm1pbWVwb3N0OworICB9CisKICAgLyogQ2hlY2sgd2Uga25vdyB0aGUgc2l6ZSBvZiB0aGUgdXBsb2FkICovCi0gIGlmKGNvbm4tPmRhdGEtPnN0YXRlLmluZmlsZXNpemUgPCAwKSB7Ci0gICAgZmFpbGYoY29ubi0+ZGF0YSwgIkNhbm5vdCBBUFBFTkQgd2l0aCB1bmtub3duIGlucHV0IGZpbGUgc2l6ZVxuIik7CisgIGlmKGRhdGEtPnN0YXRlLmluZmlsZXNpemUgPCAwKSB7CisgICAgZmFpbGYoZGF0YSwgIkNhbm5vdCBBUFBFTkQgd2l0aCB1bmtub3duIGlucHV0IGZpbGUgc2l6ZVxuIik7CiAgICAgcmV0dXJuIENVUkxFX1VQTE9BRF9GQUlMRUQ7CiAgIH0KIApAQCAtNzc5LDcgKzc2MSw3IEBACiAKICAgLyogU2VuZCB0aGUgQVBQRU5EIGNvbW1hbmQgKi8KICAgcmVzdWx0ID0gaW1hcF9zZW5kZihjb25uLCAiQVBQRU5EICVzIChcXFNlZW4pIHslIiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICJ9IiwKLSAgICAgICAgICAgICAgICAgICAgICBtYWlsYm94LCBjb25uLT5kYXRhLT5zdGF0ZS5pbmZpbGVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICBtYWlsYm94LCBkYXRhLT5zdGF0ZS5pbmZpbGVzaXplKTsKIAogICBmcmVlKG1haWxib3gpOwogCkBAIC04MzksMTkgKzgyMSwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hcGNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYXBzdGF0ZSBpbnN0YXRlKQogewotICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7Ci0KICAgKHZvaWQpaW5zdGF0ZTsgLyogbm8gdXNlIGZvciB0aGlzIHlldCAqLwogCi0gIGlmKGltYXBjb2RlICE9ICdPJykgewotICAgIGZhaWxmKGRhdGEsICJHb3QgdW5leHBlY3RlZCBpbWFwLXNlcnZlciByZXNwb25zZSIpOwotICAgIHJlc3VsdCA9IENVUkxFX1dFSVJEX1NFUlZFUl9SRVBMWTsKKyAgaWYoaW1hcGNvZGUgPT0gSU1BUF9SRVNQX1BSRUFVVEgpIHsKKyAgICAvKiBQUkVBVVRIICovCisgICAgc3RydWN0IGltYXBfY29ubiAqaW1hcGMgPSAmY29ubi0+cHJvdG8uaW1hcGM7CisgICAgaW1hcGMtPnByZWF1dGggPSBUUlVFOworICAgIGluZm9mKGRhdGEsICJQUkVBVVRIIGNvbm5lY3Rpb24sIGFscmVhZHkgYXV0aGVudGljYXRlZCFcbiIpOwogICB9Ci0gIGVsc2UKLSAgICByZXN1bHQgPSBpbWFwX3BlcmZvcm1fY2FwYWJpbGl0eShjb25uKTsKKyAgZWxzZSBpZihpbWFwY29kZSAhPSBJTUFQX1JFU1BfT0spIHsKKyAgICBmYWlsZihkYXRhLCAiR290IHVuZXhwZWN0ZWQgaW1hcC1zZXJ2ZXIgcmVzcG9uc2UiKTsKKyAgICByZXR1cm4gQ1VSTEVfV0VJUkRfU0VSVkVSX1JFUExZOworICB9CiAKLSAgcmV0dXJuIHJlc3VsdDsKKyAgcmV0dXJuIGltYXBfcGVyZm9ybV9jYXBhYmlsaXR5KGNvbm4pOwogfQogCiAvKiBGb3IgQ0FQQUJJTElUWSByZXNwb25zZXMgKi8KQEAgLTkxOCw3ICs5MDIsNyBAQAogICAgICAgbGluZSArPSB3b3JkbGVuOwogICAgIH0KICAgfQotICBlbHNlIGlmKGltYXBjb2RlID09ICdPJykgeworICBlbHNlIGlmKGltYXBjb2RlID09IElNQVBfUkVTUF9PSykgewogICAgIGlmKGRhdGEtPnNldC51c2Vfc3NsICYmICFjb25uLT5zc2xbRklSU1RTT0NLRVRdLnVzZSkgewogICAgICAgLyogV2UgZG9uJ3QgaGF2ZSBhIFNTTC9UTFMgY29ubmVjdGlvbiB5ZXQsIGJ1dCBTU0wgaXMgcmVxdWVzdGVkICovCiAgICAgICBpZihpbWFwYy0+dGxzX3N1cHBvcnRlZCkKQEAgLTk1MSw3ICs5MzUsNyBAQAogCiAgICh2b2lkKWluc3RhdGU7IC8qIG5vIHVzZSBmb3IgdGhpcyB5ZXQgKi8KIAotICBpZihpbWFwY29kZSAhPSAnTycpIHsKKyAgaWYoaW1hcGNvZGUgIT0gSU1BUF9SRVNQX09LKSB7CiAgICAgaWYoZGF0YS0+c2V0LnVzZV9zc2wgIT0gQ1VSTFVTRVNTTF9UUlkpIHsKICAgICAgIGZhaWxmKGRhdGEsICJTVEFSVFRMUyBkZW5pZWQiKTsKICAgICAgIHJlc3VsdCA9IENVUkxFX1VTRV9TU0xfRkFJTEVEOwpAQCAtMTAwOSw3ICs5OTMsNyBAQAogCiAgICh2b2lkKWluc3RhdGU7IC8qIG5vIHVzZSBmb3IgdGhpcyB5ZXQgKi8KIAotICBpZihpbWFwY29kZSAhPSAnTycpIHsKKyAgaWYoaW1hcGNvZGUgIT0gSU1BUF9SRVNQX09LKSB7CiAgICAgZmFpbGYoZGF0YSwgIkFjY2VzcyBkZW5pZWQuICVjIiwgaW1hcGNvZGUpOwogICAgIHJlc3VsdCA9IENVUkxFX0xPR0lOX0RFTklFRDsKICAgfQpAQCAtMTAzNyw3ICsxMDIxLDcgQEAKICAgICByZXN1bHQgPSBDdXJsX2NsaWVudF93cml0ZShjb25uLCBDTElFTlRXUklURV9CT0RZLCBsaW5lLCBsZW4gKyAxKTsKICAgICBsaW5lW2xlbl0gPSAnXDAnOwogICB9Ci0gIGVsc2UgaWYoaW1hcGNvZGUgIT0gJ08nKQorICBlbHNlIGlmKGltYXBjb2RlICE9IElNQVBfUkVTUF9PSykKICAgICByZXN1bHQgPSBDVVJMRV9RVU9URV9FUlJPUjsgLyogVE9ETzogRml4IGVycm9yIGNvZGUgKi8KICAgZWxzZQogICAgIC8qIEVuZCBvZiBETyBwaGFzZSAqLwpAQCAtMTA2Niw3ICsxMDUwLDcgQEAKICAgICAgIGltYXBjLT5tYWlsYm94X3VpZHZhbGlkaXR5ID0gc3RyZHVwKHRtcCk7CiAgICAgfQogICB9Ci0gIGVsc2UgaWYoaW1hcGNvZGUgPT0gJ08nKSB7CisgIGVsc2UgaWYoaW1hcGNvZGUgPT0gSU1BUF9SRVNQX09LKSB7CiAgICAgLyogQ2hlY2sgaWYgdGhlIFVJRFZBTElESVRZIGhhcyBiZWVuIHNwZWNpZmllZCBhbmQgbWF0Y2hlcyAqLwogICAgIGlmKGltYXAtPnVpZHZhbGlkaXR5ICYmIGltYXBjLT5tYWlsYm94X3VpZHZhbGlkaXR5ICYmCiAgICAgICAgc3RyY21wKGltYXAtPnVpZHZhbGlkaXR5LCBpbWFwYy0+bWFpbGJveF91aWR2YWxpZGl0eSkpIHsKQEAgLTExMjAsMTAgKzExMDQsMTEgQEAKIAogICBpZigqcHRyID09ICd7JykgewogICAgIGNoYXIgKmVuZHB0cjsKLSAgICBzaXplID0gY3VybHhfc3RydG9vZmZ0KHB0ciArIDEsICZlbmRwdHIsIDEwKTsKLSAgICBpZihlbmRwdHIgLSBwdHIgPiAxICYmIGVuZHB0clswXSA9PSAnfScgJiYKLSAgICAgICBlbmRwdHJbMV0gPT0gJ1xyJyAmJiBlbmRwdHJbMl0gPT0gJ1wwJykKLSAgICAgIHBhcnNlZCA9IFRSVUU7CisgICAgaWYoIWN1cmx4X3N0cnRvb2ZmdChwdHIgKyAxLCAmZW5kcHRyLCAxMCwgJnNpemUpKSB7CisgICAgICBpZihlbmRwdHIgLSBwdHIgPiAxICYmIGVuZHB0clswXSA9PSAnfScgJiYKKyAgICAgICAgIGVuZHB0clsxXSA9PSAnXHInICYmIGVuZHB0clsyXSA9PSAnXDAnKQorICAgICAgICBwYXJzZWQgPSBUUlVFOworICAgIH0KICAgfQogCiAgIGlmKHBhcnNlZCkgewpAQCAtMTE5Nyw3ICsxMTgyLDcgQEAKIAogICAodm9pZClpbnN0YXRlOyAvKiBObyB1c2UgZm9yIHRoaXMgeWV0ICovCiAKLSAgaWYoaW1hcGNvZGUgIT0gJ08nKQorICBpZihpbWFwY29kZSAhPSBJTUFQX1JFU1BfT0spCiAgICAgcmVzdWx0ID0gQ1VSTEVfV0VJUkRfU0VSVkVSX1JFUExZOwogICBlbHNlCiAgICAgLyogRW5kIG9mIERPTkUgcGhhc2UgKi8KQEAgLTEyNDEsNyArMTIyNiw3IEBACiAKICAgKHZvaWQpaW5zdGF0ZTsgLyogTm8gdXNlIGZvciB0aGlzIHlldCAqLwogCi0gIGlmKGltYXBjb2RlICE9ICdPJykKKyAgaWYoaW1hcGNvZGUgIT0gSU1BUF9SRVNQX09LKQogICAgIHJlc3VsdCA9IENVUkxFX1VQTE9BRF9GQUlMRUQ7CiAgIGVsc2UKICAgICAvKiBFbmQgb2YgRE9ORSBwaGFzZSAqLwpAQCAtMTQ2OSw5ICsxNDU0LDEwIEBACiAgICAgcmVzdWx0ID0gc3RhdHVzOyAgICAgICAgIC8qIHVzZSB0aGUgYWxyZWFkeSBzZXQgZXJyb3IgY29kZSAqLwogICB9CiAgIGVsc2UgaWYoIWRhdGEtPnNldC5jb25uZWN0X29ubHkgJiYgIWltYXAtPmN1c3RvbSAmJgotICAgICAgICAgIChpbWFwLT51aWQgfHwgZGF0YS0+c2V0LnVwbG9hZCkpIHsKKyAgICAgICAgICAoaW1hcC0+dWlkIHx8IGRhdGEtPnNldC51cGxvYWQgfHwKKyAgICAgICAgICBkYXRhLT5zZXQubWltZXBvc3Qua2luZCAhPSBNSU1FS0lORF9OT05FKSkgewogICAgIC8qIEhhbmRsZSByZXNwb25zZXMgYWZ0ZXIgRkVUQ0ggb3IgQVBQRU5EIHRyYW5zZmVyIGhhcyBmaW5pc2hlZCAqLwotICAgIGlmKCFkYXRhLT5zZXQudXBsb2FkKQorICAgIGlmKCFkYXRhLT5zZXQudXBsb2FkICYmIGRhdGEtPnNldC5taW1lcG9zdC5raW5kID09IE1JTUVLSU5EX05PTkUpCiAgICAgICBzdGF0ZShjb25uLCBJTUFQX0ZFVENIX0ZJTkFMKTsKICAgICBlbHNlIHsKICAgICAgIC8qIEVuZCB0aGUgQVBQRU5EIGNvbW1hbmQgZmlyc3QgYnkgc2VuZGluZyBhbiBlbXB0eSBsaW5lICovCkBAIC0xNTQxLDcgKzE1MjcsNyBAQAogICAgIHNlbGVjdGVkID0gVFJVRTsKIAogICAvKiBTdGFydCB0aGUgZmlyc3QgY29tbWFuZCBpbiB0aGUgRE8gcGhhc2UgKi8KLSAgaWYoY29ubi0+ZGF0YS0+c2V0LnVwbG9hZCkKKyAgaWYoY29ubi0+ZGF0YS0+c2V0LnVwbG9hZCB8fCBkYXRhLT5zZXQubWltZXBvc3Qua2luZCAhPSBNSU1FS0lORF9OT05FKQogICAgIC8qIEFQUEVORCBjYW4gYmUgZXhlY3V0ZWQgZGlyZWN0bHkgKi8KICAgICByZXN1bHQgPSBpbWFwX3BlcmZvcm1fYXBwZW5kKGNvbm4pOwogICBlbHNlIGlmKGltYXAtPmN1c3RvbSAmJiAoc2VsZWN0ZWQgfHwgIWltYXAtPm1haWxib3gpKQpAQCAtMTcxNSwzMSArMTcwMSw2IEBACiAKICAgLyogQ2xlYXIgdGhlIFRMUyB1cGdyYWRlZCBmbGFnICovCiAgIGNvbm4tPnRsc191cGdyYWRlZCA9IEZBTFNFOwotCi0gIC8qIFNldCB1cCB0aGUgcHJveHkgaWYgbmVjZXNzYXJ5ICovCi0gIGlmKGNvbm4tPmJpdHMuaHR0cHByb3h5ICYmICFkYXRhLT5zZXQudHVubmVsX3RocnVfaHR0cHByb3h5KSB7Ci0gICAgLyogVW5sZXNzIHdlIGhhdmUgYXNrZWQgdG8gdHVubmVsIElNQVAgb3BlcmF0aW9ucyB0aHJvdWdoIHRoZSBwcm94eSwgd2UKLSAgICAgICBzd2l0Y2ggYW5kIHVzZSBIVFRQIG9wZXJhdGlvbnMgb25seSAqLwotI2lmbmRlZiBDVVJMX0RJU0FCTEVfSFRUUAotICAgIGlmKGNvbm4tPmhhbmRsZXIgPT0gJkN1cmxfaGFuZGxlcl9pbWFwKQotICAgICAgY29ubi0+aGFuZGxlciA9ICZDdXJsX2hhbmRsZXJfaW1hcF9wcm94eTsKLSAgICBlbHNlIHsKLSNpZmRlZiBVU0VfU1NMCi0gICAgICBjb25uLT5oYW5kbGVyID0gJkN1cmxfaGFuZGxlcl9pbWFwc19wcm94eTsKLSNlbHNlCi0gICAgICBmYWlsZihkYXRhLCAiSU1BUFMgbm90IHN1cHBvcnRlZCEiKTsKLSAgICAgIHJldHVybiBDVVJMRV9VTlNVUFBPUlRFRF9QUk9UT0NPTDsKLSNlbmRpZgotICAgIH0KLQotICAgIC8qIHNldCBpdCB1cCBhcyBhbiBIVFRQIGNvbm5lY3Rpb24gaW5zdGVhZCAqLwotICAgIHJldHVybiBjb25uLT5oYW5kbGVyLT5zZXR1cF9jb25uZWN0aW9uKGNvbm4pOwotI2Vsc2UKLSAgICBmYWlsZihkYXRhLCAiSU1BUCBvdmVyIGh0dHAgcHJveHkgcmVxdWlyZXMgSFRUUCBzdXBwb3J0IGJ1aWx0LWluISIpOwotICAgIHJldHVybiBDVVJMRV9VTlNVUFBPUlRFRF9QUk9UT0NPTDsKLSNlbmRpZgotICB9Ci0KICAgZGF0YS0+c3RhdGUucGF0aCsrOyAgIC8qIGRvbid0IGluY2x1ZGUgdGhlIGluaXRpYWwgc2xhc2ggKi8KIAogICByZXR1cm4gQ1VSTEVfT0s7CkBAIC0xODM2LDcgKzE3OTcsNyBAQAogICAgIHJldHVybiBzdHJkdXAoc3RyKTsKIAogICAvKiBDYWxjdWxhdGUgdGhlIG5ldyBzdHJpbmcgbGVuZ3RoICovCi0gIG5ld2xlbiA9IHN0cmxlbihzdHIpICsgYmFja3NwX2NvdW50ICsgcXVvdGVfY291bnQgKyAob3RoZXJzX2V4aXN0cyA/IDIgOiAwKTsKKyAgbmV3bGVuID0gc3RybGVuKHN0cikgKyBiYWNrc3BfY291bnQgKyBxdW90ZV9jb3VudCArIChlc2NhcGVfb25seSA/IDAgOiAyKTsKIAogICAvKiBBbGxvY2F0ZSB0aGUgbmV3IHN0cmluZyAqLwogICBuZXdzdHIgPSAoY2hhciAqKSBtYWxsb2MoKG5ld2xlbiArIDEpICogc2l6ZW9mKGNoYXIpKTsKQEAgLTE4NDUsNyArMTgwNiw3IEBACiAKICAgLyogU3Vycm91bmQgdGhlIHN0cmluZyBpbiBxdW90ZXMgaWYgbmVjZXNzYXJ5ICovCiAgIHAyID0gbmV3c3RyOwotICBpZihvdGhlcnNfZXhpc3RzKSB7CisgIGlmKCFlc2NhcGVfb25seSkgewogICAgIG5ld3N0clswXSA9ICciJzsKICAgICBuZXdzdHJbbmV3bGVuIC0gMV0gPSAnIic7CiAgICAgcDIrKzsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2ltYXAuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2ltYXAuaAppbmRleCA1ZTBlMjI4Li45ZmM0ZmY1IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9pbWFwLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaW1hcC5oCkBAIC03LDcgKzcsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSAtIDIwMTUsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC03MSw2ICs3MSw3IEBACiAgIHN0cnVjdCBwaW5ncG9uZyBwcDsKICAgaW1hcHN0YXRlIHN0YXRlOyAgICAgICAgICAgIC8qIEFsd2F5cyB1c2UgaW1hcC5jOnN0YXRlKCkgdG8gY2hhbmdlIHN0YXRlISAqLwogICBib29sIHNzbGRvbmU7ICAgICAgICAgICAgICAgLyogSXMgY29ubmVjdCgpIG92ZXIgU1NMIGRvbmU/ICovCisgIGJvb2wgcHJlYXV0aDsgICAgICAgICAgICAgICAvKiBJcyB0aGlzIGNvbm5lY3Rpb24gUFJFQVVUSD8gKi8KICAgc3RydWN0IFNBU0wgc2FzbDsgICAgICAgICAgIC8qIFNBU0wtcmVsYXRlZCBwYXJhbWV0ZXJzICovCiAgIHVuc2lnbmVkIGludCBwcmVmdHlwZTsgICAgICAvKiBQcmVmZXJyZWQgYXV0aGVudGljYXRpb24gdHlwZSAqLwogICBpbnQgY21kaWQ7ICAgICAgICAgICAgICAgICAgLyogTGFzdCB1c2VkIGNvbW1hbmQgSUQgKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2luZXRfbnRvcC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaW5ldF9udG9wLmMKaW5kZXggOWFmYmRiYi4uZmI5MWE1MCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaW5ldF9udG9wLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaW5ldF9udG9wLmMKQEAgLTYzLDcgKzYzLDcgQEAKIAogICBsZW4gPSBzdHJsZW4odG1wKTsKICAgaWYobGVuID09IDAgfHwgbGVuID49IHNpemUpIHsKLSAgICBTRVRfRVJSTk8oRU5PU1BDKTsKKyAgICBlcnJubyA9IEVOT1NQQzsKICAgICByZXR1cm4gKE5VTEwpOwogICB9CiAgIHN0cmNweShkc3QsIHRtcCk7CkBAIC0xNDEsOCArMTQxLDggQEAKICAgICAgKi8KICAgICBpZihpID09IDYgJiYgYmVzdC5iYXNlID09IDAgJiYKICAgICAgICAgKGJlc3QubGVuID09IDYgfHwgKGJlc3QubGVuID09IDUgJiYgd29yZHNbNV0gPT0gMHhmZmZmKSkpIHsKLSAgICAgIGlmKCFpbmV0X250b3A0KHNyYysxMiwgdHAsIHNpemVvZih0bXApIC0gKHRwIC0gdG1wKSkpIHsKLSAgICAgICAgU0VUX0VSUk5PKEVOT1NQQyk7CisgICAgICBpZighaW5ldF9udG9wNChzcmMgKyAxMiwgdHAsIHNpemVvZih0bXApIC0gKHRwIC0gdG1wKSkpIHsKKyAgICAgICAgZXJybm8gPSBFTk9TUEM7CiAgICAgICAgIHJldHVybiAoTlVMTCk7CiAgICAgICB9CiAgICAgICB0cCArPSBzdHJsZW4odHApOwpAQCAtMTYwLDcgKzE2MCw3IEBACiAgIC8qIENoZWNrIGZvciBvdmVyZmxvdywgY29weSwgYW5kIHdlJ3JlIGRvbmUuCiAgICAqLwogICBpZigoc2l6ZV90KSh0cCAtIHRtcCkgPiBzaXplKSB7Ci0gICAgU0VUX0VSUk5PKEVOT1NQQyk7CisgICAgZXJybm8gPSBFTk9TUEM7CiAgICAgcmV0dXJuIChOVUxMKTsKICAgfQogICBzdHJjcHkoZHN0LCB0bXApOwpAQCAtMTc3LDggKzE3Nyw4IEBACiAgKgogICogT24gV2luZG93cyB3ZSBzdG9yZSB0aGUgZXJyb3IgaW4gdGhlIHRocmVhZCBlcnJubywgbm90CiAgKiBpbiB0aGUgd2luc29jayBlcnJvciBjb2RlLiBUaGlzIGlzIHRvIGF2b2lkIGxvc2luZyB0aGUKLSAqIGFjdHVhbCBsYXN0IHdpbnNvY2sgZXJyb3IuIFNvIHVzZSBtYWNybyBFUlJOTyB0byBmZXRjaCB0aGUKLSAqIGVycm5vIHRoaXMgZnVuY3Rpb24gc2V0cyB3aGVuIHJldHVybmluZyBOVUxMLCBub3QgU09DS0VSUk5PLgorICogYWN0dWFsIGxhc3Qgd2luc29jayBlcnJvci4gU28gd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAqIE5VTEwsIGNoZWNrIGVycm5vIG5vdCBTT0NLRVJSTk8uCiAgKi8KIGNoYXIgKkN1cmxfaW5ldF9udG9wKGludCBhZiwgY29uc3Qgdm9pZCAqc3JjLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewpAQCAtMTkwLDcgKzE5MCw3IEBACiAgICAgcmV0dXJuIGluZXRfbnRvcDYoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzcmMsIGJ1Ziwgc2l6ZSk7CiAjZW5kaWYKICAgZGVmYXVsdDoKLSAgICBTRVRfRVJSTk8oRUFGTk9TVVBQT1JUKTsKKyAgICBlcnJubyA9IEVBRk5PU1VQUE9SVDsKICAgICByZXR1cm4gTlVMTDsKICAgfQogfQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaW5ldF9wdG9uLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9pbmV0X3B0b24uYwppbmRleCA0NzVmNDRhLi5mZWY5NjEwIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9pbmV0X3B0b24uYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9pbmV0X3B0b24uYwpAQCAtNTcsOCArNTcsOCBAQAogICogbm90aWNlOgogICogICAgICBPbiBXaW5kb3dzIHdlIHN0b3JlIHRoZSBlcnJvciBpbiB0aGUgdGhyZWFkIGVycm5vLCBub3QKICAqICAgICAgaW4gdGhlIHdpbnNvY2sgZXJyb3IgY29kZS4gVGhpcyBpcyB0byBhdm9pZCBsb3NpbmcgdGhlCi0gKiAgICAgIGFjdHVhbCBsYXN0IHdpbnNvY2sgZXJyb3IuIFNvIHVzZSBtYWNybyBFUlJOTyB0byBmZXRjaCB0aGUKLSAqICAgICAgZXJybm8gdGhpcyBmdW5jdGlvbiBzZXRzIHdoZW4gcmV0dXJuaW5nICgtMSksIG5vdCBTT0NLRVJSTk8uCisgKiAgICAgIGFjdHVhbCBsYXN0IHdpbnNvY2sgZXJyb3IuIFNvIHdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgKiAgICAgIC0xLCBjaGVjayBlcnJubyBub3QgU09DS0VSUk5PLgogICogYXV0aG9yOgogICogICAgICBQYXVsIFZpeGllLCAxOTk2LgogICovCkBAIC03Myw3ICs3Myw3IEBACiAgICAgcmV0dXJuIChpbmV0X3B0b242KHNyYywgKHVuc2lnbmVkIGNoYXIgKilkc3QpKTsKICNlbmRpZgogICBkZWZhdWx0OgotICAgIFNFVF9FUlJOTyhFQUZOT1NVUFBPUlQpOworICAgIGVycm5vID0gRUFGTk9TVVBQT1JUOwogICAgIHJldHVybiAoLTEpOwogICB9CiAgIC8qIE5PVFJFQUNIRUQgKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2luZXRfcHRvbi5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaW5ldF9wdG9uLmgKaW5kZXggOTE4OGQ5NS4uZTIxNmY0ZSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaW5ldF9wdG9uLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaW5ldF9wdG9uLmgKQEAgLTcsNyArNyw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAwNSwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTI5LDYgKzI5LDkgQEAKICNpZmRlZiBIQVZFX0lORVRfUFRPTgogI2lmZGVmIEhBVkVfQVJQQV9JTkVUX0gKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNlbGlmIGRlZmluZWQoSEFWRV9XUzJUQ1BJUF9IKQorLyogaW5ldF9wdG9uKCkgZXhpc3RzIGluIFZpc3RhIG9yIGxhdGVyICovCisjaW5jbHVkZSA8d3MydGNwaXAuaD4KICNlbmRpZgogI2RlZmluZSBDdXJsX2luZXRfcHRvbih4LHkseikgaW5ldF9wdG9uKHgseSx6KQogI2VuZGlmCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9rcmI1LmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9rcmI1LmMKaW5kZXggNjlhMzU5Ny4uYWYyNWU5MiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIva3JiNS5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2tyYjUuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIEdTU0FQSS9rcmI1IHN1cHBvcnQgZm9yIEZUUCAtIGxvb3NlbHkgYmFzZWQgb24gb2xkIGtyYjQuYwogICoKLSAqIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KKyAqIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBLdW5nbGlnYSBUZWtuaXNrYSBIw7Znc2tvbGFuCiAgKiAoUm95YWwgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIFN0b2NraG9sbSwgU3dlZGVuKS4KICAqIENvcHlyaWdodCAoYykgMjAwNCAtIDIwMTYgRGFuaWVsIFN0ZW5iZXJnCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvbGRhcC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvbGRhcC5jCmluZGV4IDc5ZTg0ZDkuLjA0MDY0MWMgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2xkYXAuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9sZGFwLmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTE1MCw2ICsxNTAsNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfTERBUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fTERBUCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8KQEAgLTE3NSw2ICsxNzYsNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfTERBUFMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fTERBUFMsICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfU1NMICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8KQEAgLTIzMyw3ICsyMzUsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVzZXIsIGNvbnN0IGNoYXIgKnBhc3N3ZCkKIHsKICAgaW50IHJjID0gTERBUF9JTlZBTElEX0NSRURFTlRJQUxTOwotICBVTE9ORyBtZXRob2QgPSBMREFQX0FVVEhfU0lNUExFOwogCiAgIFBUQ0hBUiBpbnVzZXIgPSBOVUxMOwogICBQVENIQVIgaW5wYXNzID0gTlVMTDsKQEAgLTI0Miw3ICsyNDMsNyBAQAogICAgIGludXNlciA9IEN1cmxfY29udmVydF9VVEY4X3RvX3RjaGFyKChjaGFyICopIHVzZXIpOwogICAgIGlucGFzcyA9IEN1cmxfY29udmVydF9VVEY4X3RvX3RjaGFyKChjaGFyICopIHBhc3N3ZCk7CiAKLSAgICByYyA9IGxkYXBfYmluZF9zKHNlcnZlciwgaW51c2VyLCBpbnBhc3MsIG1ldGhvZCk7CisgICAgcmMgPSBsZGFwX3NpbXBsZV9iaW5kX3Moc2VydmVyLCBpbnVzZXIsIGlucGFzcyk7CiAKICAgICBDdXJsX3VuaWNvZGVmcmVlKGludXNlcik7CiAgICAgQ3VybF91bmljb2RlZnJlZShpbnBhc3MpOwpAQCAtMjY2LDcgKzI2Nyw3IEBACiAgIExEQVBNZXNzYWdlICpsZGFwbXNnID0gTlVMTDsKICAgTERBUE1lc3NhZ2UgKmVudHJ5SXRlcmF0b3I7CiAgIGludCBudW0gPSAwOwotICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhPWNvbm4tPmRhdGE7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBpbnQgbGRhcF9wcm90byA9IExEQVBfVkVSU0lPTjM7CiAgIGludCBsZGFwX3NzbCA9IDA7CiAgIGNoYXIgKnZhbF9iNjQgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvbWVtZGVidWcuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL21lbWRlYnVnLmMKaW5kZXggMmI4ODA4YS4uMGViMjQ5YyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvbWVtZGVidWcuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9tZW1kZWJ1Zy5jCkBAIC0xMTUsNyArMTE1LDggQEAKICAgICAgIGxvZ2ZpbGUgPSBzdGRlcnI7CiAjaWZkZWYgTUVNREVCVUdfTE9HX1NZTkMKICAgICAvKiBGbHVzaCB0aGUgbG9nIGZpbGUgYWZ0ZXIgZXZlcnkgbGluZSBzbyB0aGUgbG9nIGlzbid0IGxvc3QgaW4gYSBjcmFzaCAqLwotICAgIHNldGJ1Zihsb2dmaWxlLCAoY2hhciAqKU5VTEwpOworICAgIGlmKGxvZ2ZpbGUpCisgICAgICBzZXRidWYobG9nZmlsZSwgKGNoYXIgKilOVUxMKTsKICNlbmRpZgogICB9CiB9CkBAIC0xNDYsNyArMTQ3LDcgQEAKICAgICAgICAgICAgICAgICBzb3VyY2UsIGxpbmUsIGZ1bmMpOwogICAgICAgICBmZmx1c2gobG9nZmlsZSk7IC8qIGJlY2F1c2UgaXQgbWlnaHQgY3Jhc2ggbm93ICovCiAgICAgICB9Ci0gICAgICBTRVRfRVJSTk8oRU5PTUVNKTsKKyAgICAgIGVycm5vID0gRU5PTUVNOwogICAgICAgcmV0dXJuIFRSVUU7IC8qIFJFVFVSTiBFUlJPUiEgKi8KICAgICB9CiAgICAgZWxzZQpAQCAtMTY5LDcgKzE3MCw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiAKICAgLyogYWxsb2MgYXQgbGVhc3QgNjQgYnl0ZXMgKi8KLSAgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbWVtZGVidWcpK3dhbnRlZHNpemU7CisgIHNpemUgPSBzaXplb2Yoc3RydWN0IG1lbWRlYnVnKSArIHdhbnRlZHNpemU7CiAKICAgbWVtID0gKEN1cmxfY21hbGxvYykoc2l6ZSk7CiAgIGlmKG1lbSkgewpAQCAtMjI0LDkgKzIyNSw5IEBACiAgIGlmKGNvdW50Y2hlY2soInN0cmR1cCIsIGxpbmUsIHNvdXJjZSkpCiAgICAgcmV0dXJuIE5VTEw7CiAKLSAgbGVuPXN0cmxlbihzdHIpKzE7CisgIGxlbiA9IHN0cmxlbihzdHIpICsgMTsKIAotICBtZW09Y3VybF9kb21hbGxvYyhsZW4sIDAsIE5VTEwpOyAvKiBOVUxMIHByZXZlbnRzIGxvZ2dpbmcgKi8KKyAgbWVtID0gY3VybF9kb21hbGxvYyhsZW4sIDAsIE5VTEwpOyAvKiBOVUxMIHByZXZlbnRzIGxvZ2dpbmcgKi8KICAgaWYobWVtKQogICAgIG1lbWNweShtZW0sIHN0ciwgbGVuKTsKIApAQCAtMjY4LDkgKzI2OSw5IEBACiB2b2lkICpjdXJsX2RvcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCB3YW50ZWRzaXplLAogICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUsIGNvbnN0IGNoYXIgKnNvdXJjZSkKIHsKLSAgc3RydWN0IG1lbWRlYnVnICptZW09TlVMTDsKKyAgc3RydWN0IG1lbWRlYnVnICptZW0gPSBOVUxMOwogCi0gIHNpemVfdCBzaXplID0gc2l6ZW9mKHN0cnVjdCBtZW1kZWJ1Zykrd2FudGVkc2l6ZTsKKyAgc2l6ZV90IHNpemUgPSBzaXplb2Yoc3RydWN0IG1lbWRlYnVnKSArIHdhbnRlZHNpemU7CiAKICAgREVCVUdBU1NFUlQod2FudGVkc2l6ZSAhPSAwKTsKIApAQCAtNDA2LDcgKzQwNyw3IEBACiAvKiB0aGlzIGlzIG91ciBvd24gZGVmaW5lZCB3YXkgdG8gY2xvc2Ugc29ja2V0cyBvbiAqQUxMKiBwbGF0Zm9ybXMgKi8KIGludCBjdXJsX3NjbG9zZShjdXJsX3NvY2tldF90IHNvY2tmZCwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKnNvdXJjZSkKIHsKLSAgaW50IHJlcz1zY2xvc2Uoc29ja2ZkKTsKKyAgaW50IHJlcyA9IHNjbG9zZShzb2NrZmQpOwogICBjdXJsX21hcmtfc2Nsb3NlKHNvY2tmZCwgbGluZSwgc291cmNlKTsKICAgcmV0dXJuIHJlczsKIH0KQEAgLTQxNCw3ICs0MTUsNyBAQAogRklMRSAqY3VybF9mb3Blbihjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICptb2RlLAogICAgICAgICAgICAgICAgICBpbnQgbGluZSwgY29uc3QgY2hhciAqc291cmNlKQogewotICBGSUxFICpyZXM9Zm9wZW4oZmlsZSwgbW9kZSk7CisgIEZJTEUgKnJlcyA9IGZvcGVuKGZpbGUsIG1vZGUpOwogCiAgIGlmKHNvdXJjZSkKICAgICBjdXJsX21lbWxvZygiRklMRSAlczolZCBmb3BlbihcIiVzXCIsXCIlc1wiKSA9ICVwXG4iLApAQCAtNDI3LDcgKzQyOCw3IEBACiBGSUxFICpjdXJsX2Zkb3BlbihpbnQgZmlsZWRlcywgY29uc3QgY2hhciAqbW9kZSwKICAgICAgICAgICAgICAgICAgIGludCBsaW5lLCBjb25zdCBjaGFyICpzb3VyY2UpCiB7Ci0gIEZJTEUgKnJlcz1mZG9wZW4oZmlsZWRlcywgbW9kZSk7CisgIEZJTEUgKnJlcyA9IGZkb3BlbihmaWxlZGVzLCBtb2RlKTsKIAogICBpZihzb3VyY2UpCiAgICAgY3VybF9tZW1sb2coIkZJTEUgJXM6JWQgZmRvcGVuKFwiJWRcIixcIiVzXCIpID0gJXBcbiIsCkBAIC00NDMsNyArNDQ0LDcgQEAKIAogICBERUJVR0FTU0VSVChmaWxlICE9IE5VTEwpOwogCi0gIHJlcz1mY2xvc2UoZmlsZSk7CisgIHJlcyA9IGZjbG9zZShmaWxlKTsKIAogICBpZihzb3VyY2UpCiAgICAgY3VybF9tZW1sb2coIkZJTEUgJXM6JWQgZmNsb3NlKCVwKVxuIiwKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL21pbWUuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL21pbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTZmNWU2Ci0tLSAvZGV2L251bGwKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvbWltZS5jCkBAIC0wLDAgKzEsMTg2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXyAgIF8gX19fXyAgXworICogIFByb2plY3QgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAorICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcworICogYXJlIGFsc28gYXZhaWxhYmxlIGF0IGh0dHBzOi8vY3VybC5oYXh4LnNlL2RvY3MvY29weXJpZ2h0Lmh0bWwuCisgKgorICogWW91IG1heSBvcHQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDT1BZSU5HIGZpbGUuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiY3VybF9zZXR1cC5oIgorCisjaW5jbHVkZSA8Y3VybC9jdXJsLmg+CisKKyNpbmNsdWRlICJtaW1lLmgiCisjaW5jbHVkZSAibm9uLWFzY2lpLmgiCisKKyNpZiAhZGVmaW5lZChDVVJMX0RJU0FCTEVfSFRUUCkgfHwgIWRlZmluZWQoQ1VSTF9ESVNBQkxFX1NNVFApIHx8IFwKKyAgICAhZGVmaW5lZChDVVJMX0RJU0FCTEVfSU1BUCkKKworI2lmIGRlZmluZWQoSEFWRV9MSUJHRU5fSCkgJiYgZGVmaW5lZChIQVZFX0JBU0VOQU1FKQorI2luY2x1ZGUgPGxpYmdlbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJyYW5kLmgiCisjaW5jbHVkZSAic2xpc3QuaCIKKyNpbmNsdWRlICJzdHJjYXNlLmgiCisvKiBUaGUgbGFzdCAzICNpbmNsdWRlIGZpbGVzIHNob3VsZCBiZSBpbiB0aGlzIG9yZGVyICovCisjaW5jbHVkZSAiY3VybF9wcmludGYuaCIKKyNpbmNsdWRlICJjdXJsX21lbW9yeS5oIgorI2luY2x1ZGUgIm1lbWRlYnVnLmgiCisKKyNpZmRlZiBXSU4zMgorIyBpZm5kZWYgUl9PSworIyAgZGVmaW5lIFJfT0sgNAorIyBlbmRpZgorI2VuZGlmCisKKworI2RlZmluZSBGSUxFX0NPTlRFTlRUWVBFX0RFRkFVTFQgICAgICAgICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iCisjZGVmaW5lIE1VTFRJUEFSVF9DT05URU5UVFlQRV9ERUZBVUxUICAgIm11bHRpcGFydC9taXhlZCIKKyNkZWZpbmUgRElTUE9TSVRJT05fREVGQVVMVCAgICAgICAgICAgICAiYXR0YWNobWVudCIKKworI2RlZmluZSBSRUFEX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICgoc2l6ZV90KSAtMSkKKworLyogRW5jb2RlcnMuICovCitzdGF0aWMgc2l6ZV90IGVuY29kZXJfbm9wX3JlYWQoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhdGVvZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9taW1lcGFydCAqcGFydCk7CitzdGF0aWMgY3VybF9vZmZfdCBlbmNvZGVyX25vcF9zaXplKGN1cmxfbWltZXBhcnQgKnBhcnQpOworc3RhdGljIHNpemVfdCBlbmNvZGVyXzdiaXRfcmVhZChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGF0ZW9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX21pbWVwYXJ0ICpwYXJ0KTsKK3N0YXRpYyBzaXplX3QgZW5jb2Rlcl9iYXNlNjRfcmVhZChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGF0ZW9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX21pbWVwYXJ0ICpwYXJ0KTsKK3N0YXRpYyBjdXJsX29mZl90IGVuY29kZXJfYmFzZTY0X3NpemUoY3VybF9taW1lcGFydCAqcGFydCk7CitzdGF0aWMgc2l6ZV90IGVuY29kZXJfcXBfcmVhZChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGF0ZW9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9taW1lcGFydCAqcGFydCk7CitzdGF0aWMgY3VybF9vZmZfdCBlbmNvZGVyX3FwX3NpemUoY3VybF9taW1lcGFydCAqcGFydCk7CisKK3N0YXRpYyBjb25zdCBtaW1lX2VuY29kZXIgZW5jb2RlcnNbXSA9IHsKKyAgeyJiaW5hcnkiLCBlbmNvZGVyX25vcF9yZWFkLCBlbmNvZGVyX25vcF9zaXplfSwKKyAgeyI4Yml0IiwgZW5jb2Rlcl9ub3BfcmVhZCwgZW5jb2Rlcl9ub3Bfc2l6ZX0sCisgIHsiN2JpdCIsIGVuY29kZXJfN2JpdF9yZWFkLCBlbmNvZGVyX25vcF9zaXplfSwKKyAgeyJiYXNlNjQiLCBlbmNvZGVyX2Jhc2U2NF9yZWFkLCBlbmNvZGVyX2Jhc2U2NF9zaXplfSwKKyAgeyJxdW90ZWQtcHJpbnRhYmxlIiwgZW5jb2Rlcl9xcF9yZWFkLCBlbmNvZGVyX3FwX3NpemV9LAorICB7WkVST19OVUxMLCBaRVJPX05VTEwsIFpFUk9fTlVMTH0KK307CisKKy8qIEJhc2U2NCBlbmNvZGluZyB0YWJsZSAqLworc3RhdGljIGNvbnN0IGNoYXIgYmFzZTY0W10gPQorICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CisKKy8qIFF1b3RlZC1wcmludGFibGUgY2hhcmFjdGVyIGNsYXNzIHRhYmxlLgorICoKKyAqIFdlIGNhbm5vdCByZWx5IG9uIGN0eXBlIGZ1bmN0aW9ucyBzaW5jZSBxdW90ZWQtcHJpbnRhYmxlIGlucHV0IGRhdGEKKyAqIGlzIGFzc3VtZWQgdG8gYmUgYXNjaWktY29tcGF0aWJsZSwgZXZlbiBvbiBub24tYXNjaWkgcGxhdGZvcm1zLiAqLworI2RlZmluZSBRUF9PSyAgICAgICAgICAgMSAgICAgICAvKiBDYW4gYmUgcmVwcmVzZW50ZWQgYnkgaXRzZWxmLiAqLworI2RlZmluZSBRUF9TUCAgICAgICAgICAgMiAgICAgICAvKiBTcGFjZSBvciB0YWIuICovCisjZGVmaW5lIFFQX0NSICAgICAgICAgICAzICAgICAgIC8qIENhcnJpYWdlIHJldHVybi4gKi8KKyNkZWZpbmUgUVBfTEYgICAgICAgICAgIDQgICAgICAgLyogTGluZS1mZWVkLiAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcXBfY2xhc3NbXSA9IHsKKyAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgICAgICAgICAvKiAwMCAtIDA3ICovCisgMCwgICAgIFFQX1NQLCBRUF9MRiwgMCwgICAgIDAsICAgICBRUF9DUiwgMCwgICAgIDAsICAgICAgICAgICAgLyogMDggLSAwRiAqLworIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgICAgICAgIC8qIDEwIC0gMTcgKi8KKyAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgICAgICAgICAvKiAxOCAtIDFGICovCisgUVBfU1AsIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCAgICAgICAgLyogMjAgLSAyNyAqLworIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgICAgICAgIC8qIDI4IC0gMkYgKi8KKyBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssICAgICAgICAvKiAzMCAtIDM3ICovCisgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCAwICAgICwgUVBfT0ssIFFQX09LLCAgICAgICAgLyogMzggLSAzRiAqLworIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgICAgICAgIC8qIDQwIC0gNDcgKi8KKyBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssICAgICAgICAvKiA0OCAtIDRGICovCisgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCAgICAgICAgLyogNTAgLSA1NyAqLworIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgICAgICAgIC8qIDU4IC0gNUYgKi8KKyBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssICAgICAgICAvKiA2MCAtIDY3ICovCisgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCAgICAgICAgLyogNjggLSA2RiAqLworIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgICAgICAgIC8qIDcwIC0gNzcgKi8KKyBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgMCwgICAgICAgICAgICAvKiA3OCAtIDdGICovCisgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgLyogODAgLSA4RiAqLworIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgIC8qIDkwIC0gOUYgKi8KKyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAvKiBBMCAtIEFGICovCisgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgLyogQjAgLSBCRiAqLworIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgIC8qIEMwIC0gQ0YgKi8KKyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAvKiBEMCAtIERGICovCisgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgLyogRTAgLSBFRiAqLworIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgIC8qIEYwIC0gRkYgKi8KK307CisKKworLyogQmluYXJ5IC0tPiBoZXhhZGVjaW1hbCBBU0NJSSB0YWJsZS4gKi8KK3N0YXRpYyBjb25zdCBjaGFyIGFzY2hleFtdID0KKyAgIlx4MzBceDMxXHgzMlx4MzNceDM0XHgzNVx4MzZceDM3XHgzOFx4MzlceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDYiOworCisKKworI2lmbmRlZiBfX1ZNUworI2RlZmluZSBmaWxlc2l6ZShuYW1lLCBzdGF0X2RhdGEpIChzdGF0X2RhdGEuc3Rfc2l6ZSkKKyNkZWZpbmUgZm9wZW5fcmVhZCBmb3BlbgorCisjZWxzZQorCisjaW5jbHVkZSA8ZmFiZGVmLmg+CisvKgorICogZ2V0X3Ztc19maWxlX3NpemUgZG9lcyB3aGF0IGl0IHRha2VzIHRvIGdldCB0aGUgcmVhbCBzaXplIG9mIHRoZSBmaWxlCisgKgorICogRm9yIGZpeGVkIGZpbGVzLCBmaW5kIG91dCB0aGUgc2l6ZSBvZiB0aGUgRU9GIGJsb2NrIGFuZCBhZGp1c3QuCisgKgorICogRm9yIGFsbCBvdGhlcnMsIGhhdmUgdG8gcmVhZCB0aGUgZW50aXJlIGZpbGUgaW4sIGRpc2NhcmRpbmcgdGhlIGNvbnRlbnRzLgorICogTW9zdCBwb3N0ZWQgdGV4dCBmaWxlcyB3aWxsIGJlIHNtYWxsLCBhbmQgYmluYXJ5IGZpbGVzIGxpa2UgemxpYiBhcmNoaXZlcworICogYW5kIENEL0RWRCBpbWFnZXMgc2hvdWxkIGJlIGVpdGhlciBhIFNUUkVBTV9MRiBmb3JtYXQgb3IgYSBmaXhlZCBmb3JtYXQuCisgKgorICovCitjdXJsX29mZl90IFZtc1JlYWxGaWxlU2l6ZShjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0X3N0YXQgKnN0YXRfYnVmKQoreworICBjaGFyIGJ1ZmZlcls4MTkyXTsKKyAgY3VybF9vZmZfdCBjb3VudDsKKyAgaW50IHJldF9zdGF0OworICBGSUxFICogZmlsZTsKKworICBmaWxlID0gZm9wZW4obmFtZSwgRk9QRU5fUkVBRFRFWFQpOyAvKiBWTVMgKi8KKyAgaWYoZmlsZSA9PSBOVUxMKQorICAgIHJldHVybiAwOworCisgIGNvdW50ID0gMDsKKyAgcmV0X3N0YXQgPSAxOworICB3aGlsZShyZXRfc3RhdCA+IDApIHsKKyAgICByZXRfc3RhdCA9IGZyZWFkKGJ1ZmZlciwgMSwgc2l6ZW9mKGJ1ZmZlciksIGZpbGUpOworICAgIGlmKHJldF9zdGF0ICE9IDApCisgICAgICBjb3VudCArPSByZXRfc3RhdDsKKyAgfQorICBmY2xvc2UoZmlsZSk7CisKKyAgcmV0dXJuIGNvdW50OworfQorCisvKgorICoKKyAqICBWbXNTcGVjaWFsU2l6ZSBjaGVja3MgdG8gc2VlIGlmIHRoZSBzdGF0IHN0X3NpemUgY2FuIGJlIHRydXN0ZWQgYW5kCisgKiAgaWYgbm90IHRvIGNhbGwgYSByb3V0aW5lIHRvIGdldCB0aGUgY29ycmVjdCBzaXplLgorICoKKyAqLworc3RhdGljIGN1cmxfb2ZmX3QgVm1zU3BlY2lhbFNpemUoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdF9zdGF0ICpzdGF0X2J1ZikKK3sKKyAgc3dpdGNoKHN0YXRfYnVmLT5zdF9mYWJfcmZtKSB7CisgIGNhc2UgRkFCJENfVkFSOgorICBjYXNlIEZBQiRDX1ZGQzoKKyAgICByZXR1cm4gVm1zUmVhbEZpbGVTaXplKG5hbWUsIHN0YXRfYnVmKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gc3RhdF9idWYtPnN0X3NpemU7CisgIH0KK30KKworI2RlZmluZSBmaWxlc2l6ZShuYW1lLCBzdGF0X2RhdGEpIFZtc1NwZWNpYWxTaXplKG5hbWUsICZzdGF0X2RhdGEpCisKKy8qCisgKiB2bXNmb3BlbnJlYWQKKyAqCisgKiBGb3IgdXBsb2FkIHRvIHdvcmsgYXMgZXhwZWN0ZWQgb24gVk1TLCBkaWZmZXJlbnQgb3B0aW9uYWwKKyAqIHBhcmFtZXRlcnMgbXVzdCBiZSBhZGRlZCB0byB0aGUgZm9wZW4gY29tbWFuZCBiYXNlZCBvbgorICogcmVjb3JkIGZvcm1hdCBvZiB0aGUgZmlsZS4KKyAqCisgKi8KK3N0YXRpYyBGSUxFICogdm1zZm9wZW5yZWFkKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm1vZGUpCit7CisgIHN0cnVjdF9zdGF0IHN0YXRidWY7CisgIGludCByZXN1bHQ7CisKKyAgcmVzdWx0ID0gc3RhdChmaWxlLCAmc3RhdGJ1Zik7CisKKyAgc3dpdGNoKHN0YXRidWYuc3RfZmFiX3JmbSkgeworICBjYXNlIEZBQiRDX1ZBUjoKKyAgY2FzZSBGQUIkQ19WRkM6CisgIGNhc2UgRkFCJENfU1RNQ1I6CisgICAgcmV0dXJuIGZvcGVuKGZpbGUsIEZPUEVOX1JFQURURVhUKTsgLyogVk1TICovCisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGZvcGVuKGZpbGUsIEZPUEVOX1JFQURURVhULCAicmZtPXN0bWxmIiwgImN0eD1zdG0iKTsKKyAgfQorfQorCisjZGVmaW5lIGZvcGVuX3JlYWQgdm1zZm9wZW5yZWFkCisjZW5kaWYKKworCisjaWZuZGVmIEhBVkVfQkFTRU5BTUUKKy8qCisgIChRdW90ZSBmcm9tIFRoZSBPcGVuIEdyb3VwIEJhc2UgU3BlY2lmaWNhdGlvbnMgSXNzdWUgNiBJRUVFIFN0ZCAxMDAzLjEsIDIwMDQKKyAgRWRpdGlvbikKKworICBUaGUgYmFzZW5hbWUoKSBmdW5jdGlvbiBzaGFsbCB0YWtlIHRoZSBwYXRobmFtZSBwb2ludGVkIHRvIGJ5IHBhdGggYW5kCisgIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpbmFsIGNvbXBvbmVudCBvZiB0aGUgcGF0aG5hbWUsIGRlbGV0aW5nIGFueQorICB0cmFpbGluZyAnLycgY2hhcmFjdGVycy4KKworICBJZiB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgcGF0aCBjb25zaXN0cyBlbnRpcmVseSBvZiB0aGUgJy8nIGNoYXJhY3RlciwKKyAgYmFzZW5hbWUoKSBzaGFsbCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgIi8iLiBJZiB0aGUgc3RyaW5nIHBvaW50ZWQKKyAgdG8gYnkgcGF0aCBpcyBleGFjdGx5ICIvLyIsIGl0IGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQgd2hldGhlciAnLycgb3IgIi8vIgorICBpcyByZXR1cm5lZC4KKworICBJZiBwYXRoIGlzIGEgbnVsbCBwb2ludGVyIG9yIHBvaW50cyB0byBhbiBlbXB0eSBzdHJpbmcsIGJhc2VuYW1lKCkgc2hhbGwKKyAgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nICIuIi4KKworICBUaGUgYmFzZW5hbWUoKSBmdW5jdGlvbiBtYXkgbW9kaWZ5IHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBwYXRoLCBhbmQgbWF5CisgIHJldHVybiBhIHBvaW50ZXIgdG8gc3RhdGljIHN0b3JhZ2UgdGhhdCBtYXkgdGhlbiBiZSBvdmVyd3JpdHRlbiBieSBhCisgIHN1YnNlcXVlbnQgY2FsbCB0byBiYXNlbmFtZSgpLgorCisgIFRoZSBiYXNlbmFtZSgpIGZ1bmN0aW9uIG5lZWQgbm90IGJlIHJlZW50cmFudC4gQSBmdW5jdGlvbiB0aGF0IGlzIG5vdAorICByZXF1aXJlZCB0byBiZSByZWVudHJhbnQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIHRocmVhZC1zYWZlLgorCisqLworc3RhdGljIGNoYXIgKkN1cmxfYmFzZW5hbWUoY2hhciAqcGF0aCkKK3sKKyAgLyogSWdub3JlIGFsbCB0aGUgZGV0YWlscyBhYm92ZSBmb3Igbm93IGFuZCBtYWtlIGEgcXVpY2sgYW5kIHNpbXBsZQorICAgICBpbXBsZW1lbnRhaW9uIGhlcmUgKi8KKyAgY2hhciAqczE7CisgIGNoYXIgKnMyOworCisgIHMxID0gc3RycmNocihwYXRoLCAnLycpOworICBzMiA9IHN0cnJjaHIocGF0aCwgJ1xcJyk7CisKKyAgaWYoczEgJiYgczIpIHsKKyAgICBwYXRoID0gKHMxID4gczI/IHMxIDogczIpICsgMTsKKyAgfQorICBlbHNlIGlmKHMxKQorICAgIHBhdGggPSBzMSArIDE7CisgIGVsc2UgaWYoczIpCisgICAgcGF0aCA9IHMyICsgMTsKKworICByZXR1cm4gcGF0aDsKK30KKworI2RlZmluZSBiYXNlbmFtZSh4KSAgQ3VybF9iYXNlbmFtZSgoeCkpCisjZW5kaWYKKworCisvKiBTZXQgcmVhZGJhY2sgc3RhdGUuICovCitzdGF0aWMgdm9pZCBtaW1lc2V0c3RhdGUobWltZV9zdGF0ZSAqc3RhdGUsIGVudW0gbWltZXN0YXRlIHRvaywgdm9pZCAqcHRyKQoreworICBzdGF0ZS0+c3RhdGUgPSB0b2s7CisgIHN0YXRlLT5wdHIgPSBwdHI7CisgIHN0YXRlLT5vZmZzZXQgPSAwOworfQorCisKKy8qIEVzY2FwZSBoZWFkZXIgc3RyaW5nIGludG8gYWxsb2NhdGVkIG1lbW9yeS4gKi8KK3N0YXRpYyBjaGFyICplc2NhcGVfc3RyaW5nKGNvbnN0IGNoYXIgKnNyYykKK3sKKyAgc2l6ZV90IGJ5dGVjb3VudCA9IDA7CisgIHNpemVfdCBpOworICBjaGFyICpkc3Q7CisKKyAgZm9yKGkgPSAwOyBzcmNbaV07IGkrKykKKyAgICBpZihzcmNbaV0gPT0gJyInIHx8IHNyY1tpXSA9PSAnXFwnKQorICAgICAgYnl0ZWNvdW50Kys7CisKKyAgYnl0ZWNvdW50ICs9IGk7CisgIGRzdCA9IG1hbGxvYyhieXRlY291bnQgKyAxKTsKKyAgaWYoIWRzdCkKKyAgICByZXR1cm4gTlVMTDsKKworICBmb3IoaSA9IDA7ICpzcmM7IHNyYysrKSB7CisgICAgaWYoKnNyYyA9PSAnIicgfHwgKnNyYyA9PSAnXFwnKQorICAgICAgZHN0W2krK10gPSAnXFwnOworICAgIGRzdFtpKytdID0gKnNyYzsKKyAgfQorCisgIGRzdFtpXSA9ICdcMCc7CisgIHJldHVybiBkc3Q7Cit9CisKKy8qIENoZWNrIGlmIGhlYWRlciBtYXRjaGVzLiAqLworc3RhdGljIGNoYXIgKm1hdGNoX2hlYWRlcihzdHJ1Y3QgY3VybF9zbGlzdCAqaGRyLCBjb25zdCBjaGFyICpsYmwsIHNpemVfdCBsZW4pCit7CisgIGNoYXIgKnZhbHVlID0gTlVMTDsKKworICBpZihzdHJuY2FzZWNvbXBhcmUoaGRyLT5kYXRhLCBsYmwsIGxlbikgJiYgaGRyLT5kYXRhW2xlbl0gPT0gJzonKQorICAgIGZvcih2YWx1ZSA9IGhkci0+ZGF0YSArIGxlbiArIDE7ICp2YWx1ZSA9PSAnICc7IHZhbHVlKyspCisgICAgICA7CisgIHJldHVybiB2YWx1ZTsKK30KKworLyogR2V0IGEgaGVhZGVyIGZyb20gYW4gc2xpc3QuICovCitzdGF0aWMgY2hhciAqc2VhcmNoX2hlYWRlcihzdHJ1Y3QgY3VybF9zbGlzdCAqaGRybGlzdCwgY29uc3QgY2hhciAqaGRyKQoreworICBzaXplX3QgbGVuID0gc3RybGVuKGhkcik7CisgIGNoYXIgKnZhbHVlID0gTlVMTDsKKworICBmb3IoOyAhdmFsdWUgJiYgaGRybGlzdDsgaGRybGlzdCA9IGhkcmxpc3QtPm5leHQpCisgICAgdmFsdWUgPSBtYXRjaF9oZWFkZXIoaGRybGlzdCwgaGRyLCBsZW4pOworCisgIHJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGNoYXIgKnN0cmlwcGF0aChjb25zdCBjaGFyICpmdWxsZmlsZSkKK3sKKyAgY2hhciAqZmlsZW5hbWU7CisgIGNoYXIgKmJhc2U7CisgIGZpbGVuYW1lID0gc3RyZHVwKGZ1bGxmaWxlKTsgLyogZHVwbGljYXRlIHNpbmNlIGJhc2VuYW1lKCkgbWF5IHJ1aW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGl0IHdvcmtzIG9uICovCisgIGlmKCFmaWxlbmFtZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgYmFzZSA9IHN0cmR1cChiYXNlbmFtZShmaWxlbmFtZSkpOworCisgIGZyZWUoZmlsZW5hbWUpOyAvKiBmcmVlIHRlbXBvcmFyeSBidWZmZXIgKi8KKworICByZXR1cm4gYmFzZTsgLyogcmV0dXJucyBhbiBhbGxvY2F0ZWQgc3RyaW5nIG9yIE5VTEwgISAqLworfQorCisvKiBJbml0aWFsaXplIGRhdGEgZW5jb2RlciBzdGF0ZS4gKi8KK3N0YXRpYyB2b2lkIGNsZWFudXBfZW5jb2Rlcl9zdGF0ZShtaW1lX2VuY29kZXJfc3RhdGUgKnApCit7CisgIHAtPnBvcyA9IDA7CisgIHAtPmJ1ZmJlZyA9IDA7CisgIHAtPmJ1ZmVuZCA9IDA7Cit9CisKKworLyogRHVtbXkgZW5jb2Rlci4gVGhpcyBpcyB1c2VkIGZvciA4Yml0IGFuZCBiaW5hcnkgY29udGVudCBlbmNvZGluZ3MuICovCitzdGF0aWMgc2l6ZV90IGVuY29kZXJfbm9wX3JlYWQoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhdGVvZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX21pbWVwYXJ0ICpwYXJ0KQoreworICBtaW1lX2VuY29kZXJfc3RhdGUgKnN0ID0gJnBhcnQtPmVuY3N0YXRlOworICBzaXplX3QgaW5zaXplID0gc3QtPmJ1ZmVuZCAtIHN0LT5idWZiZWc7CisKKyAgKHZvaWQpIGF0ZW9mOworCisgIGlmKHNpemUgPiBpbnNpemUpCisgICAgc2l6ZSA9IGluc2l6ZTsKKyAgaWYoc2l6ZSkKKyAgICBtZW1jcHkoYnVmZmVyLCBzdC0+YnVmLCBzaXplKTsKKyAgc3QtPmJ1ZmJlZyArPSBzaXplOworICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGN1cmxfb2ZmX3QgZW5jb2Rlcl9ub3Bfc2l6ZShjdXJsX21pbWVwYXJ0ICpwYXJ0KQoreworICByZXR1cm4gcGFydC0+ZGF0YXNpemU7Cit9CisKKworLyogN2JpdCBlbmNvZGVyOiB0aGUgZW5jb2RlciBpcyBqdXN0IGEgZGF0YSB2YWxpZGl0eSBjaGVjay4gKi8KK3N0YXRpYyBzaXplX3QgZW5jb2Rlcl83Yml0X3JlYWQoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhdGVvZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9taW1lcGFydCAqcGFydCkKK3sKKyAgbWltZV9lbmNvZGVyX3N0YXRlICpzdCA9ICZwYXJ0LT5lbmNzdGF0ZTsKKyAgc2l6ZV90IGN1cnNpemUgPSBzdC0+YnVmZW5kIC0gc3QtPmJ1ZmJlZzsKKworICAodm9pZCkgYXRlb2Y7CisKKyAgaWYoc2l6ZSA+IGN1cnNpemUpCisgICAgc2l6ZSA9IGN1cnNpemU7CisKKyAgZm9yKGN1cnNpemUgPSAwOyBjdXJzaXplIDwgc2l6ZTsgY3Vyc2l6ZSsrKSB7CisgICAgKmJ1ZmZlciA9IHN0LT5idWZbc3QtPmJ1ZmJlZ107CisgICAgaWYoKmJ1ZmZlcisrICYgMHg4MCkKKyAgICAgIHJldHVybiBjdXJzaXplPyBjdXJzaXplOiBSRUFEX0VSUk9SOworICAgIHN0LT5idWZiZWcrKzsKKyAgfQorCisgIHJldHVybiBjdXJzaXplOworfQorCisKKy8qIEJhc2U2NCBjb250ZW50IGVuY29kZXIuICovCitzdGF0aWMgc2l6ZV90IGVuY29kZXJfYmFzZTY0X3JlYWQoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhdGVvZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9taW1lcGFydCAqcGFydCkKK3sKKyAgbWltZV9lbmNvZGVyX3N0YXRlICpzdCA9ICZwYXJ0LT5lbmNzdGF0ZTsKKyAgc2l6ZV90IGN1cnNpemUgPSAwOworICBpbnQgaTsKKyAgY2hhciAqcHRyID0gYnVmZmVyOworCisgIHdoaWxlKHN0LT5idWZiZWcgPCBzdC0+YnVmZW5kKSB7CisgICAgLyogTGluZSBmdWxsID8gKi8KKyAgICBpZihzdC0+cG9zID49IE1BWF9FTkNPREVEX0xJTkVfTEVOR1RIIC0gNCkgeworICAgICAgLyogWWVzLCB3ZSBuZWVkIDIgY2hhcmFjdGVycyBmb3IgQ1JMRi4gKi8KKyAgICAgIGlmKHNpemUgPCAyKQorICAgICAgICBicmVhazsKKyAgICAgICpwdHIrKyA9ICdccic7CisgICAgICAqcHRyKysgPSAnXG4nOworICAgICAgc3QtPnBvcyA9IDA7CisgICAgICBjdXJzaXplICs9IDI7CisgICAgICBzaXplIC09IDI7CisgICAgfQorCisgICAgLyogQmUgc3VyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgYW5kIGlucHV0IGRhdGEgZm9yIGEgYmFzZTY0IGdyb3VwLiAqLworICAgIGlmKHNpemUgPCA0IHx8IHN0LT5idWZlbmQgLSBzdC0+YnVmYmVnIDwgMykKKyAgICAgIGJyZWFrOworCisgICAgLyogRW5jb2RlIHRocmVlIGJ5dGVzIGEgZm91ciBjaGFyYWN0ZXJzLiAqLworICAgIGkgPSBzdC0+YnVmW3N0LT5idWZiZWcrK10gJiAweEZGOworICAgIGkgPSAoaSA8PCA4KSB8IChzdC0+YnVmW3N0LT5idWZiZWcrK10gJiAweEZGKTsKKyAgICBpID0gKGkgPDwgOCkgfCAoc3QtPmJ1ZltzdC0+YnVmYmVnKytdICYgMHhGRik7CisgICAgKnB0cisrID0gYmFzZTY0WyhpID4+IDE4KSAmIDB4M0ZdOworICAgICpwdHIrKyA9IGJhc2U2NFsoaSA+PiAxMikgJiAweDNGXTsKKyAgICAqcHRyKysgPSBiYXNlNjRbKGkgPj4gNikgJiAweDNGXTsKKyAgICAqcHRyKysgPSBiYXNlNjRbaSAmIDB4M0ZdOworICAgIGN1cnNpemUgKz0gNDsKKyAgICBzdC0+cG9zICs9IDQ7CisgICAgc2l6ZSAtPSA0OworICB9CisKKyAgLyogSWYgYXQgZW9mLCB3ZSBoYXZlIHRvIGZsdXNoIHRoZSBidWZmZXJlZCBkYXRhLiAqLworICBpZihhdGVvZiAmJiBzaXplID49IDQpIHsKKyAgICAvKiBCdWZmZXJlZCBkYXRhIHNpemUgY2FuIG9ubHkgYmUgMCwgMSBvciAyLiAqLworICAgIHB0clsyXSA9IHB0clszXSA9ICc9JzsKKyAgICBpID0gMDsKKyAgICBzd2l0Y2goc3QtPmJ1ZmVuZCAtIHN0LT5idWZiZWcpIHsKKyAgICBjYXNlIDI6CisgICAgICBpID0gKHN0LT5idWZbc3QtPmJ1ZmJlZyArIDFdICYgMHhGRikgPDwgODsKKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgY2FzZSAxOgorICAgICAgaSB8PSAoc3QtPmJ1ZltzdC0+YnVmYmVnXSAmIDB4RkYpIDw8IDE2OworICAgICAgcHRyWzBdID0gYmFzZTY0WyhpID4+IDE4KSAmIDB4M0ZdOworICAgICAgcHRyWzFdID0gYmFzZTY0WyhpID4+IDEyKSAmIDB4M0ZdOworICAgICAgaWYoKytzdC0+YnVmYmVnICE9IHN0LT5idWZlbmQpIHsKKyAgICAgICAgcHRyWzJdID0gYmFzZTY0WyhpID4+IDYpICYgMHgzRl07CisgICAgICAgIHN0LT5idWZiZWcrKzsKKyAgICAgIH0KKyAgICAgIGN1cnNpemUgKz0gNDsKKyAgICAgIHN0LT5wb3MgKz0gNDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisjaWZkZWYgQ1VSTF9ET0VTX0NPTlZFUlNJT05TCisgIC8qIFRoaXMgaXMgbm93IHRleHR1YWwgZGF0YSwgQ29udmVydCBjaGFyYWN0ZXIgY29kZXMuICovCisgIGlmKHBhcnQtPmVhc3kgJiYgY3Vyc2l6ZSkgeworICAgIENVUkxjb2RlIHJlc3VsdCA9IEN1cmxfY29udmVydF90b19uZXR3b3JrKHBhcnQtPmVhc3ksIGJ1ZmZlciwgY3Vyc2l6ZSk7CisgICAgaWYocmVzdWx0KQorICAgICAgcmV0dXJuIFJFQURfRVJST1I7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBjdXJzaXplOworfQorCitzdGF0aWMgY3VybF9vZmZfdCBlbmNvZGVyX2Jhc2U2NF9zaXplKGN1cmxfbWltZXBhcnQgKnBhcnQpCit7CisgIGN1cmxfb2ZmX3Qgc2l6ZSA9IHBhcnQtPmRhdGFzaXplOworCisgIGlmKHNpemUgPD0gMCkKKyAgICByZXR1cm4gc2l6ZTsgICAgLyogVW5rbm93biBzaXplIG9yIG5vIGRhdGEuICovCisKKyAgLyogQ29tcHV0ZSBiYXNlNjQgY2hhcmFjdGVyIGNvdW50LiAqLworICBzaXplID0gNCAqICgxICsgKHNpemUgLSAxKSAvIDMpOworCisgIC8qIEVmZmVjdGl2ZSBjaGFyYWN0ZXIgY291bnQgbXVzdCBpbmNsdWRlIENSTEZzLiAqLworICByZXR1cm4gc2l6ZSArIDIgKiAoKHNpemUgLSAxKSAvIE1BWF9FTkNPREVEX0xJTkVfTEVOR1RIKTsKK30KKworCisvKiBRdW90ZWQtcHJpbnRhYmxlIGxvb2thaGVhZC4KKyAqCisgKiBDaGVjayBpZiBhIENSTEYgb3IgZW5kIG9mIGRhdGEgaXMgaW4gaW5wdXQgYnVmZmVyIGF0IGN1cnJlbnQgcG9zaXRpb24gKyBuLgorICogUmV0dXJuIC0xIGlmIG1vcmUgZGF0YSBuZWVkZWQsIDEgaWYgQ1JMRiBvciBlbmQgb2YgZGF0YSwgZWxzZSAwLgorICovCitzdGF0aWMgaW50IHFwX2xvb2thaGVhZF9lb2wobWltZV9lbmNvZGVyX3N0YXRlICpzdCwgaW50IGF0ZW9mLCBzaXplX3QgbikKK3sKKyAgbiArPSBzdC0+YnVmYmVnOworICBpZihuID49IHN0LT5idWZlbmQgJiYgYXRlb2YpCisgICAgcmV0dXJuIDE7CisgIGlmKG4gKyAyID4gc3QtPmJ1ZmVuZCkKKyAgICByZXR1cm4gYXRlb2Y/IDA6IC0xOworICBpZihxcF9jbGFzc1tzdC0+YnVmW25dICYgMHhGRl0gPT0gUVBfQ1IgJiYKKyAgICAgcXBfY2xhc3Nbc3QtPmJ1ZltuICsgMV0gJiAweEZGXSA9PSBRUF9MRikKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFF1b3RlZC1wcmludGFibGUgZW5jb2Rlci4gKi8KK3N0YXRpYyBzaXplX3QgZW5jb2Rlcl9xcF9yZWFkKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYXRlb2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX21pbWVwYXJ0ICpwYXJ0KQoreworICBtaW1lX2VuY29kZXJfc3RhdGUgKnN0ID0gJnBhcnQtPmVuY3N0YXRlOworICBjaGFyICpwdHIgPSBidWZmZXI7CisgIHNpemVfdCBjdXJzaXplID0gMDsKKyAgaW50IGk7CisgIHNpemVfdCBsZW47CisgIHNpemVfdCBjb25zdW1lZDsKKyAgaW50IHNvZnRsaW5lYnJlYWs7CisgIGNoYXIgYnVmWzRdOworCisgIC8qIE9uIGFsbCBwbGF0Zm9ybXMsIGlucHV0IGlzIHN1cHBvc2VkIHRvIGJlIEFTQ0lJIGNvbXBhdGlibGU6IGZvciB0aGlzCisgICAgIHJlYXNvbiwgd2UgdXNlIGhleGFkZWNpbWFsIEFTQ0lJIGNvZGVzIGluIHRoaXMgZnVuY3Rpb24gcmF0aGVyIHRoYW4KKyAgICAgY2hhcmFjdGVyIGNvbnN0YW50cyB0aGF0IGNhbiBiZSBpbnRlcnByZXRlZCBhcyBub24tYXNjaWkgb24gc29tZQorICAgICBwbGF0Zm9ybXMuIFByZXNlcnZlIEFTQ0lJIGVuY29kaW5nIG9uIG91dHB1dCB0b28uICovCisgIHdoaWxlKHN0LT5idWZiZWcgPCBzdC0+YnVmZW5kKSB7CisgICAgbGVuID0gMTsKKyAgICBjb25zdW1lZCA9IDE7CisgICAgaSA9IHN0LT5idWZbc3QtPmJ1ZmJlZ107CisgICAgYnVmWzBdID0gKGNoYXIpIGk7CisgICAgYnVmWzFdID0gYXNjaGV4WyhpID4+IDQpICYgMHhGXTsKKyAgICBidWZbMl0gPSBhc2NoZXhbaSAmIDB4Rl07CisKKyAgICBzd2l0Y2gocXBfY2xhc3Nbc3QtPmJ1ZltzdC0+YnVmYmVnXSAmIDB4RkZdKSB7CisgICAgY2FzZSBRUF9PSzogICAgICAgICAgLyogTm90IGEgc3BlY2lhbCBjaGFyYWN0ZXIuICovCisgICAgICBicmVhazsKKyAgICBjYXNlIFFQX1NQOiAgICAgICAgICAvKiBTcGFjZSBvciB0YWIuICovCisgICAgICAvKiBTcGFjaW5nIG11c3QgYmUgZXNjYXBlZCBpZiBmb2xsb3dlZCBieSBDUkxGLiAqLworICAgICAgc3dpdGNoKHFwX2xvb2thaGVhZF9lb2woc3QsIGF0ZW9mLCAxKSkgeworICAgICAgY2FzZSAtMTogICAgICAgICAgLyogTW9yZSBpbnB1dCBkYXRhIG5lZWRlZC4gKi8KKyAgICAgICAgcmV0dXJuIGN1cnNpemU7CisgICAgICBjYXNlIDA6ICAgICAgICAgICAvKiBObyBlbmNvZGluZyBuZWVkZWQuICovCisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogICAgICAgICAgLyogQ1JMRiBhZnRlciBzcGFjZSBvciB0YWIuICovCisgICAgICAgIGJ1ZlswXSA9ICdceDNEJzsgICAgLyogJz0nICovCisgICAgICAgIGxlbiA9IDM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBRUF9DUjogICAgICAgICAvKiBDYXJyaWFnZSByZXR1cm4uICovCisgICAgICAvKiBJZiBmb2xsb3dlZCBieSBhIGxpbmUtZmVlZCwgb3V0cHV0IHRoZSBDUkxGIHBhaXIuCisgICAgICAgICBFbHNlIGVzY2FwZSBpdC4gKi8KKyAgICAgIHN3aXRjaChxcF9sb29rYWhlYWRfZW9sKHN0LCBhdGVvZiwgMCkpIHsKKyAgICAgIGNhc2UgLTE6ICAgICAgICAgIC8qIE5lZWQgbW9yZSBkYXRhLiAqLworICAgICAgICByZXR1cm4gY3Vyc2l6ZTsKKyAgICAgIGNhc2UgMTogICAgICAgICAgIC8qIENSTEYgZm91bmQuICovCisgICAgICAgIGJ1ZltsZW4rK10gPSAnXHgwQSc7ICAgIC8qIEFwcGVuZCAnXG4nLiAqLworICAgICAgICBjb25zdW1lZCA9IDI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogICAgICAgICAgLyogTm90IGZvbGxvd2VkIGJ5IExGOiBlc2NhcGUuICovCisgICAgICAgIGJ1ZlswXSA9ICdceDNEJzsgICAgLyogJz0nICovCisgICAgICAgIGxlbiA9IDM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAvKiBDaGFyYWN0ZXIgbXVzdCBiZSBlc2NhcGVkLiAqLworICAgICAgYnVmWzBdID0gJ1x4M0QnOyAgICAvKiAnPScgKi8KKyAgICAgIGxlbiA9IDM7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBCZSBzdXJlIHRoZSBlbmNvZGVkIGNoYXJhY3RlciBmaXRzIHdpdGhpbiBtYXhpbXVtIGxpbmUgbGVuZ3RoLiAqLworICAgIGlmKGJ1ZltsZW4gLSAxXSAhPSAnXHgwQScpIHsgICAgLyogJ1xuJyAqLworICAgICAgc29mdGxpbmVicmVhayA9IHN0LT5wb3MgKyBsZW4gPiBNQVhfRU5DT0RFRF9MSU5FX0xFTkdUSDsKKyAgICAgIGlmKCFzb2Z0bGluZWJyZWFrICYmIHN0LT5wb3MgKyBsZW4gPT0gTUFYX0VOQ09ERURfTElORV9MRU5HVEgpIHsKKyAgICAgICAgLyogV2UgbWF5IHVzZSB0aGUgY3VycmVudCBsaW5lIG9ubHkgaWYgZW5kIG9mIGRhdGEgb3IgZm9sbG93ZWQgYnkKKyAgICAgICAgICAgYSBDUkxGLiAqLworICAgICAgICBzd2l0Y2gocXBfbG9va2FoZWFkX2VvbChzdCwgYXRlb2YsIGNvbnN1bWVkKSkgeworICAgICAgICBjYXNlIC0xOiAgICAgICAgLyogTmVlZCBtb3JlIGRhdGEuICovCisgICAgICAgICAgcmV0dXJuIGN1cnNpemU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMDogICAgICAgICAvKiBOb3QgZm9sbG93ZWQgYnkgYSBDUkxGLiAqLworICAgICAgICAgIHNvZnRsaW5lYnJlYWsgPSAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZihzb2Z0bGluZWJyZWFrKSB7CisgICAgICAgIHN0cmNweShidWYsICJceDNEXHgwRFx4MEEiKTsgICAgLyogIj1cclxuIiAqLworICAgICAgICBsZW4gPSAzOworICAgICAgICBjb25zdW1lZCA9IDA7CisgICAgICB9CisgICAgfQorCisgICAgLyogSWYgdGhlIG91dHB1dCBidWZmZXIgd291bGQgb3ZlcmZsb3csIGRvIG5vdCBzdG9yZS4gKi8KKyAgICBpZihsZW4gPiBzaXplKQorICAgICAgYnJlYWs7CisKKyAgICAvKiBBcHBlbmQgdG8gb3V0cHV0IGJ1ZmZlci4gKi8KKyAgICBtZW1jcHkocHRyLCBidWYsIGxlbik7CisgICAgY3Vyc2l6ZSArPSBsZW47CisgICAgcHRyICs9IGxlbjsKKyAgICBzaXplIC09IGxlbjsKKyAgICBzdC0+cG9zICs9IGxlbjsKKyAgICBpZihidWZbbGVuIC0gMV0gPT0gJ1x4MEEnKSAgICAvKiAnXG4nICovCisgICAgICBzdC0+cG9zID0gMDsKKyAgICBzdC0+YnVmYmVnICs9IGNvbnN1bWVkOworICB9CisKKyAgcmV0dXJuIGN1cnNpemU7Cit9CisKK3N0YXRpYyBjdXJsX29mZl90IGVuY29kZXJfcXBfc2l6ZShjdXJsX21pbWVwYXJ0ICpwYXJ0KQoreworICAvKiBEZXRlcm1pbmluZyB0aGUgc2l6ZSBjYW4gb25seSBiZSBkb25lIGJ5IHJlYWRpbmcgdGhlIGRhdGE6IHVubGVzcyB0aGUKKyAgICAgZGF0YSBzaXplIGlzIDAsIHdlIHJldHVybiBpdCBhcyB1bmtub3duICgtMSkuICovCisgIHJldHVybiBwYXJ0LT5kYXRhc2l6ZT8gLTE6IDA7Cit9CisKKworLyogSW4tbWVtb3J5IGRhdGEgY2FsbGJhY2tzLiAqLworLyogQXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIHRoZSBtaW1lIHBhcnQuICovCitzdGF0aWMgc2l6ZV90IG1pbWVfbWVtX3JlYWQoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5pdGVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICppbnN0cmVhbSkKK3sKKyAgY3VybF9taW1lcGFydCAqcGFydCA9IChjdXJsX21pbWVwYXJ0ICopIGluc3RyZWFtOworICBzaXplX3Qgc3ogPSAoc2l6ZV90KSBwYXJ0LT5kYXRhc2l6ZSAtIHBhcnQtPnN0YXRlLm9mZnNldDsKKworICAodm9pZCkgc2l6ZTsgICAvKiBBbHdheXMgMS4qLworCisgIGlmKHN6ID4gbml0ZW1zKQorICAgIHN6ID0gbml0ZW1zOworCisgIGlmKHN6KQorICAgIG1lbWNweShidWZmZXIsIChjaGFyICopIHBhcnQtPmRhdGEsIHN6KTsKKworICBwYXJ0LT5zdGF0ZS5vZmZzZXQgKz0gc3o7CisgIHJldHVybiBzejsKK30KKworc3RhdGljIGludCBtaW1lX21lbV9zZWVrKHZvaWQgKmluc3RyZWFtLCBjdXJsX29mZl90IG9mZnNldCwgaW50IHdoZW5jZSkKK3sKKyAgY3VybF9taW1lcGFydCAqcGFydCA9IChjdXJsX21pbWVwYXJ0ICopIGluc3RyZWFtOworCisgIHN3aXRjaCh3aGVuY2UpIHsKKyAgY2FzZSBTRUVLX0NVUjoKKyAgICBvZmZzZXQgKz0gcGFydC0+c3RhdGUub2Zmc2V0OworICAgIGJyZWFrOworICBjYXNlIFNFRUtfRU5EOgorICAgIG9mZnNldCArPSBwYXJ0LT5kYXRhc2l6ZTsKKyAgICBicmVhazsKKyAgfQorCisgIGlmKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gcGFydC0+ZGF0YXNpemUpCisgICAgcmV0dXJuIENVUkxfU0VFS0ZVTkNfRkFJTDsKKworICBwYXJ0LT5zdGF0ZS5vZmZzZXQgPSAoc2l6ZV90KSBvZmZzZXQ7CisgIHJldHVybiBDVVJMX1NFRUtGVU5DX09LOworfQorCitzdGF0aWMgdm9pZCBtaW1lX21lbV9mcmVlKHZvaWQgKnB0cikKK3sKKyAgQ3VybF9zYWZlZnJlZSgoKGN1cmxfbWltZXBhcnQgKikgcHRyKS0+ZGF0YSk7Cit9CisKKworLyogTmFtZWQgZmlsZSBjYWxsYmFja3MuICovCisvKiBBcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gdGhlIG1pbWUgcGFydC4gKi8KK3N0YXRpYyBpbnQgbWltZV9vcGVuX2ZpbGUoY3VybF9taW1lcGFydCAqIHBhcnQpCit7CisgIC8qIE9wZW4gYSBNSU1FS0lORF9GSUxFIHBhcnQuICovCisKKyAgaWYocGFydC0+ZnApCisgICAgcmV0dXJuIDA7CisgIHBhcnQtPmZwID0gZm9wZW5fcmVhZChwYXJ0LT5kYXRhLCAicmIiKTsKKyAgcmV0dXJuIHBhcnQtPmZwPyAwOiAtMTsKK30KKworc3RhdGljIHNpemVfdCBtaW1lX2ZpbGVfcmVhZChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLCBzaXplX3Qgbml0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICppbnN0cmVhbSkKK3sKKyAgY3VybF9taW1lcGFydCAqcGFydCA9IChjdXJsX21pbWVwYXJ0ICopIGluc3RyZWFtOworCisgIGlmKG1pbWVfb3Blbl9maWxlKHBhcnQpKQorICAgIHJldHVybiBSRUFEX0VSUk9SOworCisgIHJldHVybiBmcmVhZChidWZmZXIsIHNpemUsIG5pdGVtcywgcGFydC0+ZnApOworfQorCitzdGF0aWMgaW50IG1pbWVfZmlsZV9zZWVrKHZvaWQgKmluc3RyZWFtLCBjdXJsX29mZl90IG9mZnNldCwgaW50IHdoZW5jZSkKK3sKKyAgY3VybF9taW1lcGFydCAqcGFydCA9IChjdXJsX21pbWVwYXJ0ICopIGluc3RyZWFtOworCisgIGlmKHdoZW5jZSA9PSBTRUVLX1NFVCAmJiAhb2Zmc2V0ICYmICFwYXJ0LT5mcCkKKyAgICByZXR1cm4gQ1VSTF9TRUVLRlVOQ19PSzsgICAvKiBOb3Qgb3BlbjogaW1wbGljaXRseSBhbHJlYWR5IGF0IEJPRi4gKi8KKworICBpZihtaW1lX29wZW5fZmlsZShwYXJ0KSkKKyAgICByZXR1cm4gQ1VSTF9TRUVLRlVOQ19GQUlMOworCisgIHJldHVybiBmc2VlayhwYXJ0LT5mcCwgKGxvbmcpIG9mZnNldCwgd2hlbmNlKT8KKyAgICAgICAgICAgICAgIENVUkxfU0VFS0ZVTkNfQ0FOVFNFRUs6IENVUkxfU0VFS0ZVTkNfT0s7Cit9CisKK3N0YXRpYyB2b2lkIG1pbWVfZmlsZV9mcmVlKHZvaWQgKnB0cikKK3sKKyAgY3VybF9taW1lcGFydCAqcGFydCA9IChjdXJsX21pbWVwYXJ0ICopIHB0cjsKKworICBpZihwYXJ0LT5mcCkgeworICAgIGZjbG9zZShwYXJ0LT5mcCk7CisgICAgcGFydC0+ZnAgPSBOVUxMOworICB9CisgIEN1cmxfc2FmZWZyZWUocGFydC0+ZGF0YSk7CisgIHBhcnQtPmRhdGEgPSBOVUxMOworfQorCisKKy8qIFN1YnBhcnRzIGNhbGxiYWNrcy4gKi8KKy8qIEFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byB0aGUgbWltZSBzdHJ1Y3R1cmUuICovCisKKy8qIFJlYWRiYWNrIGEgYnl0ZSBzdHJpbmcgc2VnbWVudC4gKi8KK3N0YXRpYyBzaXplX3QgcmVhZGJhY2tfYnl0ZXMobWltZV9zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ5dGVzLCBzaXplX3QgbnVtYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRyYWlsKQoreworICBzaXplX3Qgc3o7CisKKyAgc3ogPSBudW1ieXRlcyAtIHN0YXRlLT5vZmZzZXQ7CisKKyAgaWYobnVtYnl0ZXMgPiBzdGF0ZS0+b2Zmc2V0KSB7CisgICAgc3ogPSBudW1ieXRlcyAtIHN0YXRlLT5vZmZzZXQ7CisgICAgYnl0ZXMgKz0gc3RhdGUtPm9mZnNldDsKKyAgfQorICBlbHNlIHsKKyAgICBzaXplX3QgdHN6ID0gc3RybGVuKHRyYWlsKTsKKworICAgIHN6ID0gc3RhdGUtPm9mZnNldCAtIG51bWJ5dGVzOworICAgIGlmKHN6ID49IHRzeikKKyAgICAgIHJldHVybiAwOworICAgIGJ5dGVzID0gdHJhaWwgKyBzejsKKyAgICBzeiA9IHRzeiAtIHN6OworICB9CisKKyAgaWYoc3ogPiBidWZzaXplKQorICAgIHN6ID0gYnVmc2l6ZTsKKworICBtZW1jcHkoYnVmZmVyLCBieXRlcywgc3opOworICBzdGF0ZS0+b2Zmc2V0ICs9IHN6OworICByZXR1cm4gc3o7Cit9CisKKy8qIFJlYWQgYSBub24tZW5jb2RlZCBwYXJ0IGNvbnRlbnQuICovCitzdGF0aWMgc2l6ZV90IHJlYWRfcGFydF9jb250ZW50KGN1cmxfbWltZXBhcnQgKnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZnNpemUpCit7CisgIHNpemVfdCBzeiA9IDA7CisKKyAgaWYocGFydC0+cmVhZGZ1bmMpCisgICAgc3ogPSBwYXJ0LT5yZWFkZnVuYyhidWZmZXIsIDEsIGJ1ZnNpemUsIHBhcnQtPmFyZyk7CisgIHJldHVybiBzejsKK30KKworLyogUmVhZCBhbmQgZW5jb2RlIHBhcnQgY29udGVudC4gKi8KK3N0YXRpYyBzaXplX3QgcmVhZF9lbmNvZGVkX3BhcnRfY29udGVudChjdXJsX21pbWVwYXJ0ICpwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZnNpemUpCit7CisgIG1pbWVfZW5jb2Rlcl9zdGF0ZSAqc3QgPSAmcGFydC0+ZW5jc3RhdGU7CisgIHNpemVfdCBjdXJzaXplID0gMDsKKyAgc2l6ZV90IHN6OworICBib29sIGF0ZW9mID0gRkFMU0U7CisKKyAgd2hpbGUoYnVmc2l6ZSkgeworICAgIGlmKHN0LT5idWZiZWcgPCBzdC0+YnVmZW5kIHx8IGF0ZW9mKSB7CisgICAgICAvKiBFbmNvZGUgYnVmZmVyZWQgZGF0YS4gKi8KKyAgICAgIHN6ID0gcGFydC0+ZW5jb2Rlci0+ZW5jb2RlZnVuYyhidWZmZXIsIGJ1ZnNpemUsIGF0ZW9mLCBwYXJ0KTsKKyAgICAgIHN3aXRjaChzeikgeworICAgICAgY2FzZSAwOgorICAgICAgICBpZihhdGVvZikKKyAgICAgICAgICByZXR1cm4gY3Vyc2l6ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENVUkxfUkVBREZVTkNfQUJPUlQ6CisgICAgICBjYXNlIENVUkxfUkVBREZVTkNfUEFVU0U6CisgICAgICBjYXNlIFJFQURfRVJST1I6CisgICAgICAgIHJldHVybiBjdXJzaXplPyBjdXJzaXplOiBzejsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGN1cnNpemUgKz0gc3o7CisgICAgICAgIGJ1ZmZlciArPSBzejsKKyAgICAgICAgYnVmc2l6ZSAtPSBzejsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorCisgICAgLyogV2UgbmVlZCBtb3JlIGRhdGEgaW4gaW5wdXQgYnVmZmVyLiAqLworICAgIGlmKHN0LT5idWZiZWcpIHsKKyAgICAgIHNpemVfdCBsZW4gPSBzdC0+YnVmZW5kIC0gc3QtPmJ1ZmJlZzsKKworICAgICAgaWYobGVuKQorICAgICAgICBtZW1tb3ZlKHN0LT5idWYsIHN0LT5idWYgKyBzdC0+YnVmYmVnLCBsZW4pOworICAgICAgc3QtPmJ1ZmJlZyA9IDA7CisgICAgICBzdC0+YnVmZW5kID0gbGVuOworICAgIH0KKyAgICBpZihzdC0+YnVmZW5kID49IHNpemVvZiBzdC0+YnVmKQorICAgICAgcmV0dXJuIGN1cnNpemU/IGN1cnNpemU6IFJFQURfRVJST1I7ICAgIC8qIEJ1ZmZlciBmdWxsLiAqLworICAgIHN6ID0gcmVhZF9wYXJ0X2NvbnRlbnQocGFydCwgc3QtPmJ1ZiArIHN0LT5idWZlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Ygc3QtPmJ1ZiAtIHN0LT5idWZlbmQpOworICAgIHN3aXRjaChzeikgeworICAgIGNhc2UgMDoKKyAgICAgIGF0ZW9mID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1VSTF9SRUFERlVOQ19BQk9SVDoKKyAgICBjYXNlIENVUkxfUkVBREZVTkNfUEFVU0U6CisgICAgY2FzZSBSRUFEX0VSUk9SOgorICAgICAgcmV0dXJuIGN1cnNpemU/IGN1cnNpemU6IHN6OworICAgIGRlZmF1bHQ6CisgICAgICBzdC0+YnVmZW5kICs9IHN6OworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGN1cnNpemU7Cit9CisKKy8qIFJlYWRiYWNrIGEgbWltZSBwYXJ0LiAqLworc3RhdGljIHNpemVfdCByZWFkYmFja19wYXJ0KGN1cmxfbWltZXBhcnQgKnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSkKK3sKKyAgc2l6ZV90IGN1cnNpemUgPSAwOworICBzaXplX3Qgc3o7CisgIHN0cnVjdCBjdXJsX3NsaXN0ICpoZHI7CisjaWZkZWYgQ1VSTF9ET0VTX0NPTlZFUlNJT05TCisgIGNoYXIgKmNvbnZidWYgPSBidWZmZXI7CisjZW5kaWYKKworICAvKiBSZWFkYmFjayBmcm9tIHBhcnQuICovCisKKyAgd2hpbGUoYnVmc2l6ZSkgeworICAgIHN6ID0gMDsKKyAgICBoZHIgPSAoc3RydWN0IGN1cmxfc2xpc3QgKikgcGFydC0+c3RhdGUucHRyOworICAgIHN3aXRjaChwYXJ0LT5zdGF0ZS5zdGF0ZSkgeworICAgIGNhc2UgTUlNRVNUQVRFX0JFR0lOOgorICAgICAgbWltZXNldHN0YXRlKCZwYXJ0LT5zdGF0ZSwgcGFydC0+ZmxhZ3MgJiBNSU1FX0JPRFlfT05MWT8gTUlNRVNUQVRFX0JPRFk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU1FU1RBVEVfQ1VSTEhFQURFUlMsIHBhcnQtPmN1cmxoZWFkZXJzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTUlNRVNUQVRFX1VTRVJIRUFERVJTOgorICAgICAgaWYoIWhkcikgeworICAgICAgICBtaW1lc2V0c3RhdGUoJnBhcnQtPnN0YXRlLCBNSU1FU1RBVEVfRU9ILCBOVUxMKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZihtYXRjaF9oZWFkZXIoaGRyLCAiQ29udGVudC1UeXBlIiwgMTIpKSB7CisgICAgICAgIG1pbWVzZXRzdGF0ZSgmcGFydC0+c3RhdGUsIE1JTUVTVEFURV9VU0VSSEVBREVSUywgaGRyLT5uZXh0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgIGNhc2UgTUlNRVNUQVRFX0NVUkxIRUFERVJTOgorICAgICAgaWYoIWhkcikKKyAgICAgICAgbWltZXNldHN0YXRlKCZwYXJ0LT5zdGF0ZSwgTUlNRVNUQVRFX1VTRVJIRUFERVJTLCBwYXJ0LT51c2VyaGVhZGVycyk7CisgICAgICBlbHNlIHsKKyAgICAgICAgc3ogPSByZWFkYmFja19ieXRlcygmcGFydC0+c3RhdGUsIGJ1ZmZlciwgYnVmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZHItPmRhdGEsIHN0cmxlbihoZHItPmRhdGEpLCAiXHJcbiIpOworICAgICAgICBpZighc3opCisgICAgICAgICAgbWltZXNldHN0YXRlKCZwYXJ0LT5zdGF0ZSwgcGFydC0+c3RhdGUuc3RhdGUsIGhkci0+bmV4dCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIE1JTUVTVEFURV9FT0g6CisgICAgICBzeiA9IHJlYWRiYWNrX2J5dGVzKCZwYXJ0LT5zdGF0ZSwgYnVmZmVyLCBidWZzaXplLCAiXHJcbiIsIDIsICIiKTsKKyAgICAgIGlmKCFzeikKKyAgICAgICAgbWltZXNldHN0YXRlKCZwYXJ0LT5zdGF0ZSwgTUlNRVNUQVRFX0JPRFksIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNSU1FU1RBVEVfQk9EWToKKyNpZmRlZiBDVVJMX0RPRVNfQ09OVkVSU0lPTlMKKyAgICAgIGlmKHBhcnQtPmVhc3kgJiYgY29udmJ1ZiA8IGJ1ZmZlcikgeworICAgICAgICBDVVJMY29kZSByZXN1bHQgPSBDdXJsX2NvbnZlcnRfdG9fbmV0d29yayhwYXJ0LT5lYXN5LCBjb252YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgLSBjb252YnVmKTsKKyAgICAgICAgaWYocmVzdWx0KQorICAgICAgICAgIHJldHVybiBSRUFEX0VSUk9SOworICAgICAgICBjb252YnVmID0gYnVmZmVyOworICAgICAgfQorI2VuZGlmCisgICAgICBjbGVhbnVwX2VuY29kZXJfc3RhdGUoJnBhcnQtPmVuY3N0YXRlKTsKKyAgICAgIG1pbWVzZXRzdGF0ZSgmcGFydC0+c3RhdGUsIE1JTUVTVEFURV9DT05URU5ULCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTUlNRVNUQVRFX0NPTlRFTlQ6CisgICAgICBpZihwYXJ0LT5lbmNvZGVyKQorICAgICAgICBzeiA9IHJlYWRfZW5jb2RlZF9wYXJ0X2NvbnRlbnQocGFydCwgYnVmZmVyLCBidWZzaXplKTsKKyAgICAgIGVsc2UKKyAgICAgICAgc3ogPSByZWFkX3BhcnRfY29udGVudChwYXJ0LCBidWZmZXIsIGJ1ZnNpemUpOworICAgICAgc3dpdGNoKHN6KSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIG1pbWVzZXRzdGF0ZSgmcGFydC0+c3RhdGUsIE1JTUVTVEFURV9FTkQsIE5VTEwpOworICAgICAgICAvKiBUcnkgc3BhcmluZyBvcGVuIGZpbGUgZGVzY3JpcHRvcnMuICovCisgICAgICAgIGlmKHBhcnQtPmtpbmQgPT0gTUlNRUtJTkRfRklMRSAmJiBwYXJ0LT5mcCkgeworICAgICAgICAgIGZjbG9zZShwYXJ0LT5mcCk7CisgICAgICAgICAgcGFydC0+ZnAgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgICBjYXNlIENVUkxfUkVBREZVTkNfQUJPUlQ6CisgICAgICBjYXNlIENVUkxfUkVBREZVTkNfUEFVU0U6CisgICAgICBjYXNlIFJFQURfRVJST1I6CisgICAgICAgIHJldHVybiBjdXJzaXplPyBjdXJzaXplOiBzejsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTUlNRVNUQVRFX0VORDoKKyAgICAgIHJldHVybiBjdXJzaXplOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsgICAgLyogT3RoZXIgdmFsdWVzIG5vdCBpbiBwYXJ0IHN0YXRlLiAqLworICAgIH0KKworICAgIC8qIEJ1bXAgYnVmZmVyIGFuZCBjb3VudGVycyBhY2NvcmRpbmcgdG8gcmVhZCBzaXplLiAqLworICAgIGN1cnNpemUgKz0gc3o7CisgICAgYnVmZmVyICs9IHN6OworICAgIGJ1ZnNpemUgLT0gc3o7CisgIH0KKworI2lmZGVmIENVUkxfRE9FU19DT05WRVJTSU9OUworICAgICAgaWYocGFydC0+ZWFzeSAmJiBjb252YnVmIDwgYnVmZmVyICYmCisgICAgICAgICBwYXJ0LT5zdGF0ZS5zdGF0ZSA8IE1JTUVTVEFURV9CT0RZKSB7CisgICAgICAgIENVUkxjb2RlIHJlc3VsdCA9IEN1cmxfY29udmVydF90b19uZXR3b3JrKHBhcnQtPmVhc3ksIGNvbnZidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAtIGNvbnZidWYpOworICAgICAgICBpZihyZXN1bHQpCisgICAgICAgICAgcmV0dXJuIFJFQURfRVJST1I7CisgICAgICB9CisjZW5kaWYKKworICByZXR1cm4gY3Vyc2l6ZTsKK30KKworLyogUmVhZGJhY2sgZnJvbSBtaW1lLiAqLworc3RhdGljIHNpemVfdCBtaW1lX3N1YnBhcnRzX3JlYWQoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5pdGVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmluc3RyZWFtKQoreworICBjdXJsX21pbWUgKm1pbWUgPSAoY3VybF9taW1lICopIGluc3RyZWFtOworICBzaXplX3QgY3Vyc2l6ZSA9IDA7CisgIHNpemVfdCBzejsKKyAgY3VybF9taW1lcGFydCAqcGFydDsKKyNpZmRlZiBDVVJMX0RPRVNfQ09OVkVSU0lPTlMKKyAgY2hhciAqY29udmJ1ZiA9IGJ1ZmZlcjsKKyNlbmRpZgorCisgICh2b2lkKSBzaXplOyAgIC8qIEFsd2F5cyAxLiAqLworCisgIHdoaWxlKG5pdGVtcykgeworICAgIHN6ID0gMDsKKyAgICBwYXJ0ID0gbWltZS0+c3RhdGUucHRyOworICAgIHN3aXRjaChtaW1lLT5zdGF0ZS5zdGF0ZSkgeworICAgIGNhc2UgTUlNRVNUQVRFX0JFR0lOOgorICAgIGNhc2UgTUlNRVNUQVRFX0JPRFk6CisjaWZkZWYgQ1VSTF9ET0VTX0NPTlZFUlNJT05TCisgICAgICBjb252YnVmID0gYnVmZmVyOworI2VuZGlmCisgICAgICBtaW1lc2V0c3RhdGUoJm1pbWUtPnN0YXRlLCBNSU1FU1RBVEVfQk9VTkRBUlkxLCBtaW1lLT5maXJzdHBhcnQpOworICAgICAgLyogVGhlIGZpcnN0IGJvdW5kYXJ5IGFsd2F5cyBmb2xsb3dzIHRoZSBoZWFkZXIgdGVybWluYXRpb24gZW1wdHkgbGluZSwKKyAgICAgICAgIHNvIGlzIGFsd2F5cyBwcmVjZWRlZCBieSBhIENSTEsuIFdlIGNhbiB0aGVuIHNwYXJlIDIgY2hhcmFjdGVycworICAgICAgICAgYnkgc2tpcHBpbmcgdGhlIGxlYWRpbmcgQ1JMRiBpbiBib3VuZGFyeS4gKi8KKyAgICAgIG1pbWUtPnN0YXRlLm9mZnNldCArPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNSU1FU1RBVEVfQk9VTkRBUlkxOgorICAgICAgc3ogPSByZWFkYmFja19ieXRlcygmbWltZS0+c3RhdGUsIGJ1ZmZlciwgbml0ZW1zLCAiXHJcbi0tIiwgNCwgIiIpOworICAgICAgaWYoIXN6KQorICAgICAgICBtaW1lc2V0c3RhdGUoJm1pbWUtPnN0YXRlLCBNSU1FU1RBVEVfQk9VTkRBUlkyLCBwYXJ0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTUlNRVNUQVRFX0JPVU5EQVJZMjoKKyAgICAgIHN6ID0gcmVhZGJhY2tfYnl0ZXMoJm1pbWUtPnN0YXRlLCBidWZmZXIsIG5pdGVtcywgbWltZS0+Ym91bmRhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihtaW1lLT5ib3VuZGFyeSksIHBhcnQ/ICJcclxuIjogIi0tXHJcbiIpOworICAgICAgaWYoIXN6KSB7CisjaWZkZWYgQ1VSTF9ET0VTX0NPTlZFUlNJT05TCisgICAgICAgIGlmKG1pbWUtPmVhc3kgJiYgY29udmJ1ZiA8IGJ1ZmZlcikgeworICAgICAgICAgIENVUkxjb2RlIHJlc3VsdCA9IEN1cmxfY29udmVydF90b19uZXR3b3JrKG1pbWUtPmVhc3ksIGNvbnZidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIC0gY29udmJ1Zik7CisgICAgICAgICAgaWYocmVzdWx0KQorICAgICAgICAgICAgcmV0dXJuIFJFQURfRVJST1I7CisgICAgICAgICAgY29udmJ1ZiA9IGJ1ZmZlcjsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIG1pbWVzZXRzdGF0ZSgmbWltZS0+c3RhdGUsIE1JTUVTVEFURV9DT05URU5ULCBwYXJ0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTUlNRVNUQVRFX0NPTlRFTlQ6CisgICAgICBpZighcGFydCkgeworICAgICAgICBtaW1lc2V0c3RhdGUoJm1pbWUtPnN0YXRlLCBNSU1FU1RBVEVfRU5ELCBOVUxMKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBzeiA9IHJlYWRiYWNrX3BhcnQocGFydCwgYnVmZmVyLCBuaXRlbXMpOworICAgICAgc3dpdGNoKHN6KSB7CisgICAgICBjYXNlIENVUkxfUkVBREZVTkNfQUJPUlQ6CisgICAgICBjYXNlIENVUkxfUkVBREZVTkNfUEFVU0U6CisgICAgICBjYXNlIFJFQURfRVJST1I6CisgICAgICAgIHJldHVybiBjdXJzaXplPyBjdXJzaXplOiBzejsKKyAgICAgIGNhc2UgMDoKKyNpZmRlZiBDVVJMX0RPRVNfQ09OVkVSU0lPTlMKKyAgICAgICAgY29udmJ1ZiA9IGJ1ZmZlcjsKKyNlbmRpZgorICAgICAgICBtaW1lc2V0c3RhdGUoJm1pbWUtPnN0YXRlLCBNSU1FU1RBVEVfQk9VTkRBUlkxLCBwYXJ0LT5uZXh0cGFydCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBNSU1FU1RBVEVfRU5EOgorICAgICAgcmV0dXJuIGN1cnNpemU7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOyAgICAvKiBvdGhlciB2YWx1ZXMgbm90IHVzZWQgaW4gbWltZSBzdGF0ZS4gKi8KKyAgICB9CisKKyAgICAvKiBCdW1wIGJ1ZmZlciBhbmQgY291bnRlcnMgYWNjb3JkaW5nIHRvIHJlYWQgc2l6ZS4gKi8KKyAgICBjdXJzaXplICs9IHN6OworICAgIGJ1ZmZlciArPSBzejsKKyAgICBuaXRlbXMgLT0gc3o7CisgIH0KKworI2lmZGVmIENVUkxfRE9FU19DT05WRVJTSU9OUworICAgICAgaWYobWltZS0+ZWFzeSAmJiBjb252YnVmIDwgYnVmZmVyICYmCisgICAgICAgICBtaW1lLT5zdGF0ZS5zdGF0ZSA8PSBNSU1FU1RBVEVfQ09OVEVOVCkgeworICAgICAgICBDVVJMY29kZSByZXN1bHQgPSBDdXJsX2NvbnZlcnRfdG9fbmV0d29yayhtaW1lLT5lYXN5LCBjb252YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgLSBjb252YnVmKTsKKyAgICAgICAgaWYocmVzdWx0KQorICAgICAgICAgIHJldHVybiBSRUFEX0VSUk9SOworICAgICAgfQorI2VuZGlmCisKKyAgcmV0dXJuIGN1cnNpemU7Cit9CisKK3N0YXRpYyBpbnQgbWltZV9wYXJ0X3Jld2luZChjdXJsX21pbWVwYXJ0ICpwYXJ0KQoreworICBpbnQgcmVzID0gQ1VSTF9TRUVLRlVOQ19PSzsKKyAgZW51bSBtaW1lc3RhdGUgdGFyZ2V0c3RhdGUgPSBNSU1FU1RBVEVfQkVHSU47CisKKyAgaWYocGFydC0+ZmxhZ3MgJiBNSU1FX0JPRFlfT05MWSkKKyAgICB0YXJnZXRzdGF0ZSA9IE1JTUVTVEFURV9CT0RZOworICBjbGVhbnVwX2VuY29kZXJfc3RhdGUoJnBhcnQtPmVuY3N0YXRlKTsKKyAgaWYocGFydC0+c3RhdGUuc3RhdGUgPiB0YXJnZXRzdGF0ZSkgeworICAgIHJlcyA9IENVUkxfU0VFS0ZVTkNfQ0FOVFNFRUs7CisgICAgaWYocGFydC0+c2Vla2Z1bmMpIHsKKyAgICAgIHJlcyA9IHBhcnQtPnNlZWtmdW5jKHBhcnQtPmFyZywgKGN1cmxfb2ZmX3QpIDAsIFNFRUtfU0VUKTsKKyAgICAgIHN3aXRjaChyZXMpIHsKKyAgICAgIGNhc2UgQ1VSTF9TRUVLRlVOQ19PSzoKKyAgICAgIGNhc2UgQ1VSTF9TRUVLRlVOQ19GQUlMOgorICAgICAgY2FzZSBDVVJMX1NFRUtGVU5DX0NBTlRTRUVLOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgLTE6ICAgIC8qIEZvciBmc2VlaygpIGVycm9yLiAqLworICAgICAgICByZXMgPSBDVVJMX1NFRUtGVU5DX0NBTlRTRUVLOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJlcyA9IENVUkxfU0VFS0ZVTkNfRkFJTDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYocmVzID09IENVUkxfU0VFS0ZVTkNfT0spCisgICAgbWltZXNldHN0YXRlKCZwYXJ0LT5zdGF0ZSwgdGFyZ2V0c3RhdGUsIE5VTEwpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgbWltZV9zdWJwYXJ0c19zZWVrKHZvaWQgKmluc3RyZWFtLCBjdXJsX29mZl90IG9mZnNldCwgaW50IHdoZW5jZSkKK3sKKyAgY3VybF9taW1lICptaW1lID0gKGN1cmxfbWltZSAqKSBpbnN0cmVhbTsKKyAgY3VybF9taW1lcGFydCAqcGFydDsKKyAgaW50IHJlc3VsdCA9IENVUkxfU0VFS0ZVTkNfT0s7CisgIGludCByZXM7CisKKyAgaWYod2hlbmNlICE9IFNFRUtfU0VUIHx8IG9mZnNldCkKKyAgICByZXR1cm4gQ1VSTF9TRUVLRlVOQ19DQU5UU0VFSzsgICAgLyogT25seSBzdXBwb3J0IGZ1bGwgcmV3aW5kLiAqLworCisgIGlmKG1pbWUtPnN0YXRlLnN0YXRlID09IE1JTUVTVEFURV9CRUdJTikKKyAgIHJldHVybiBDVVJMX1NFRUtGVU5DX09LOyAgICAgICAgICAgLyogQWxyZWFkeSByZXdvdW5kLiAqLworCisgIGZvcihwYXJ0ID0gbWltZS0+Zmlyc3RwYXJ0OyBwYXJ0OyBwYXJ0ID0gcGFydC0+bmV4dHBhcnQpIHsKKyAgICByZXMgPSBtaW1lX3BhcnRfcmV3aW5kKHBhcnQpOworICAgIGlmKHJlcyAhPSBDVVJMX1NFRUtGVU5DX09LKQorICAgICAgcmVzdWx0ID0gcmVzOworICB9CisKKyAgaWYocmVzdWx0ID09IENVUkxfU0VFS0ZVTkNfT0spCisgICAgbWltZXNldHN0YXRlKCZtaW1lLT5zdGF0ZSwgTUlNRVNUQVRFX0JFR0lOLCBOVUxMKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBtaW1lX3N1YnBhcnRzX2ZyZWUodm9pZCAqcHRyKQoreworICBjdXJsX21pbWUgKm1pbWUgPSAoY3VybF9taW1lICopIHB0cjsKKyAgY3VybF9taW1lX2ZyZWUobWltZSk7Cit9CisKKworLyogUmVsZWFzZSBwYXJ0IGNvbnRlbnQuICovCitzdGF0aWMgdm9pZCBjbGVhbnVwX3BhcnRfY29udGVudChjdXJsX21pbWVwYXJ0ICpwYXJ0KQoreworICBpZihwYXJ0LT5mcmVlZnVuYykKKyAgICBwYXJ0LT5mcmVlZnVuYyhwYXJ0LT5hcmcpOworCisgIHBhcnQtPnJlYWRmdW5jID0gTlVMTDsKKyAgcGFydC0+c2Vla2Z1bmMgPSBOVUxMOworICBwYXJ0LT5mcmVlZnVuYyA9IE5VTEw7CisgIHBhcnQtPmFyZyA9ICh2b2lkICopIHBhcnQ7ICAgICAgICAgIC8qIERlZmF1bHRzIHRvIHBhcnQgaXRzZWxmLiAqLworICBwYXJ0LT5kYXRhID0gTlVMTDsKKyAgcGFydC0+ZnAgPSBOVUxMOworICBwYXJ0LT5kYXRhc2l6ZSA9IChjdXJsX29mZl90KSAwOyAgICAvKiBObyBzaXplIHlldC4gKi8KKyAgcGFydC0+ZW5jb2RlciA9IE5VTEw7CisgIGNsZWFudXBfZW5jb2Rlcl9zdGF0ZSgmcGFydC0+ZW5jc3RhdGUpOworICBwYXJ0LT5raW5kID0gTUlNRUtJTkRfTk9ORTsKK30KKwordm9pZCBDdXJsX21pbWVfY2xlYW5wYXJ0KGN1cmxfbWltZXBhcnQgKnBhcnQpCit7CisgIGNsZWFudXBfcGFydF9jb250ZW50KHBhcnQpOworICBjdXJsX3NsaXN0X2ZyZWVfYWxsKHBhcnQtPmN1cmxoZWFkZXJzKTsKKyAgaWYocGFydC0+ZmxhZ3MgJiBNSU1FX1VTRVJIRUFERVJTX09XTkVSKQorICAgIGN1cmxfc2xpc3RfZnJlZV9hbGwocGFydC0+dXNlcmhlYWRlcnMpOworICBDdXJsX3NhZmVmcmVlKHBhcnQtPm1pbWV0eXBlKTsKKyAgQ3VybF9zYWZlZnJlZShwYXJ0LT5uYW1lKTsKKyAgQ3VybF9zYWZlZnJlZShwYXJ0LT5maWxlbmFtZSk7CisgIEN1cmxfbWltZV9pbml0cGFydChwYXJ0LCBwYXJ0LT5lYXN5KTsKK30KKworLyogUmVjdXJzaXZlbHkgZGVsZXRlIGEgbWltZSBoYW5kbGUgYW5kIGl0cyBwYXJ0cy4gKi8KK3ZvaWQgY3VybF9taW1lX2ZyZWUoY3VybF9taW1lICptaW1lKQoreworICBjdXJsX21pbWVwYXJ0ICpwYXJ0OworCisgIGlmKG1pbWUpIHsKKyAgICB3aGlsZShtaW1lLT5maXJzdHBhcnQpIHsKKyAgICAgIHBhcnQgPSBtaW1lLT5maXJzdHBhcnQ7CisgICAgICBtaW1lLT5maXJzdHBhcnQgPSBwYXJ0LT5uZXh0cGFydDsKKyAgICAgIEN1cmxfbWltZV9jbGVhbnBhcnQocGFydCk7CisgICAgICBmcmVlKHBhcnQpOworICAgIH0KKworICAgIGZyZWUobWltZS0+Ym91bmRhcnkpOworICAgIGZyZWUobWltZSk7CisgIH0KK30KKworLyoKKyAqIE1pbWUgYnVpbGQgZnVuY3Rpb25zLgorICovCisKKy8qIENyZWF0ZSBhIG1pbWUgaGFuZGxlLiAqLworY3VybF9taW1lICpjdXJsX21pbWVfaW5pdChzdHJ1Y3QgQ3VybF9lYXN5ICplYXN5KQoreworICBjdXJsX21pbWUgKm1pbWU7CisKKyAgbWltZSA9IChjdXJsX21pbWUgKikgbWFsbG9jKHNpemVvZiAqbWltZSk7CisKKyAgaWYobWltZSkgeworICAgIG1pbWUtPmVhc3kgPSBlYXN5OworICAgIG1pbWUtPnBhcmVudCA9IE5VTEw7CisgICAgbWltZS0+Zmlyc3RwYXJ0ID0gTlVMTDsKKyAgICBtaW1lLT5sYXN0cGFydCA9IE5VTEw7CisKKyAgICAvKiBHZXQgYSBwYXJ0IGJvdW5kYXJ5LiAqLworICAgIG1pbWUtPmJvdW5kYXJ5ID0gbWFsbG9jKDI0ICsgTUlNRV9SQU5EX0JPVU5EQVJZX0NIQVJTICsgMSk7CisgICAgaWYoIW1pbWUtPmJvdW5kYXJ5KSB7CisgICAgICBmcmVlKG1pbWUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbWVtc2V0KG1pbWUtPmJvdW5kYXJ5LCAnLScsIDI0KTsKKyAgICBDdXJsX3JhbmRfaGV4KGVhc3ksICh1bnNpZ25lZCBjaGFyICopIG1pbWUtPmJvdW5kYXJ5ICsgMjQsCisgICAgICAgICAgICAgICAgICBNSU1FX1JBTkRfQk9VTkRBUllfQ0hBUlMgKyAxKTsKKyAgICBtaW1lc2V0c3RhdGUoJm1pbWUtPnN0YXRlLCBNSU1FU1RBVEVfQkVHSU4sIE5VTEwpOworICB9CisKKyAgcmV0dXJuIG1pbWU7Cit9CisKKy8qIEluaXRpYWxpemUgYSBtaW1lIHBhcnQuICovCit2b2lkIEN1cmxfbWltZV9pbml0cGFydChjdXJsX21pbWVwYXJ0ICpwYXJ0LCBzdHJ1Y3QgQ3VybF9lYXN5ICplYXN5KQoreworICBtZW1zZXQoKGNoYXIgKikgcGFydCwgMCwgc2l6ZW9mICpwYXJ0KTsKKyAgcGFydC0+ZWFzeSA9IGVhc3k7CisgIG1pbWVzZXRzdGF0ZSgmcGFydC0+c3RhdGUsIE1JTUVTVEFURV9CRUdJTiwgTlVMTCk7Cit9CisKKy8qIENyZWF0ZSBhIG1pbWUgcGFydCBhbmQgYXBwZW5kIGl0IHRvIGEgbWltZSBoYW5kbGUncyBwYXJ0IGxpc3QuICovCitjdXJsX21pbWVwYXJ0ICpjdXJsX21pbWVfYWRkcGFydChjdXJsX21pbWUgKm1pbWUpCit7CisgIGN1cmxfbWltZXBhcnQgKnBhcnQ7CisKKyAgaWYoIW1pbWUpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcGFydCA9IChjdXJsX21pbWVwYXJ0ICopIG1hbGxvYyhzaXplb2YgKnBhcnQpOworCisgIGlmKHBhcnQpIHsKKyAgICBDdXJsX21pbWVfaW5pdHBhcnQocGFydCwgbWltZS0+ZWFzeSk7CisgICAgcGFydC0+cGFyZW50ID0gbWltZTsKKworICAgIGlmKG1pbWUtPmxhc3RwYXJ0KQorICAgICAgbWltZS0+bGFzdHBhcnQtPm5leHRwYXJ0ID0gcGFydDsKKyAgICBlbHNlCisgICAgICBtaW1lLT5maXJzdHBhcnQgPSBwYXJ0OworCisgICAgbWltZS0+bGFzdHBhcnQgPSBwYXJ0OworICB9CisKKyAgcmV0dXJuIHBhcnQ7Cit9CisKKy8qIFNldCBtaW1lIHBhcnQgbmFtZS4gKi8KK0NVUkxjb2RlIGN1cmxfbWltZV9uYW1lKGN1cmxfbWltZXBhcnQgKnBhcnQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGlmKCFwYXJ0KQorICAgIHJldHVybiBDVVJMRV9CQURfRlVOQ1RJT05fQVJHVU1FTlQ7CisKKyAgQ3VybF9zYWZlZnJlZShwYXJ0LT5uYW1lKTsKKyAgcGFydC0+bmFtZSA9IE5VTEw7CisKKyAgaWYobmFtZSkgeworICAgIHBhcnQtPm5hbWUgPSBzdHJkdXAobmFtZSk7CisgICAgaWYoIXBhcnQtPm5hbWUpCisgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKKyAgfQorCisgIHJldHVybiBDVVJMRV9PSzsKK30KKworLyogU2V0IG1pbWUgcGFydCByZW1vdGUgZmlsZSBuYW1lLiAqLworQ1VSTGNvZGUgY3VybF9taW1lX2ZpbGVuYW1lKGN1cmxfbWltZXBhcnQgKnBhcnQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICBpZighcGFydCkKKyAgICByZXR1cm4gQ1VSTEVfQkFEX0ZVTkNUSU9OX0FSR1VNRU5UOworCisgIEN1cmxfc2FmZWZyZWUocGFydC0+ZmlsZW5hbWUpOworICBwYXJ0LT5maWxlbmFtZSA9IE5VTEw7CisKKyAgaWYoZmlsZW5hbWUpIHsKKyAgICBwYXJ0LT5maWxlbmFtZSA9IHN0cmR1cChmaWxlbmFtZSk7CisgICAgaWYoIXBhcnQtPmZpbGVuYW1lKQorICAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CisgIH0KKworICByZXR1cm4gQ1VSTEVfT0s7Cit9CisKKy8qIFNldCBtaW1lIHBhcnQgY29udGVudCBmcm9tIG1lbW9yeSBkYXRhLiAqLworQ1VSTGNvZGUgY3VybF9taW1lX2RhdGEoY3VybF9taW1lcGFydCAqcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBkYXRhc2l6ZSkKK3sKKyAgaWYoIXBhcnQpCisgICAgcmV0dXJuIENVUkxFX0JBRF9GVU5DVElPTl9BUkdVTUVOVDsKKworICBjbGVhbnVwX3BhcnRfY29udGVudChwYXJ0KTsKKworICBpZihkYXRhKSB7CisgICAgaWYoZGF0YXNpemUgPT0gQ1VSTF9aRVJPX1RFUk1JTkFURUQpCisgICAgICBkYXRhc2l6ZSA9IHN0cmxlbihkYXRhKTsKKworICAgIHBhcnQtPmRhdGEgPSBtYWxsb2MoZGF0YXNpemUgKyAxKTsKKyAgICBpZighcGFydC0+ZGF0YSkKKyAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOworCisgICAgcGFydC0+ZGF0YXNpemUgPSBkYXRhc2l6ZTsKKworICAgIGlmKGRhdGFzaXplKQorICAgICAgbWVtY3B5KHBhcnQtPmRhdGEsIGRhdGEsIGRhdGFzaXplKTsKKyAgICBwYXJ0LT5kYXRhW2RhdGFzaXplXSA9ICdcMCc7ICAgIC8qIFNldCBhIG51bCB0ZXJtaW5hdG9yIGFzIHNlbnRpbmVsLiAqLworCisgICAgcGFydC0+cmVhZGZ1bmMgPSBtaW1lX21lbV9yZWFkOworICAgIHBhcnQtPnNlZWtmdW5jID0gbWltZV9tZW1fc2VlazsKKyAgICBwYXJ0LT5mcmVlZnVuYyA9IG1pbWVfbWVtX2ZyZWU7CisgICAgcGFydC0+a2luZCA9IE1JTUVLSU5EX0RBVEE7CisgIH0KKworICByZXR1cm4gQ1VSTEVfT0s7Cit9CisKKy8qIFNldCBtaW1lIHBhcnQgY29udGVudCBmcm9tIG5hbWVkIGxvY2FsIGZpbGUuICovCitDVVJMY29kZSBjdXJsX21pbWVfZmlsZWRhdGEoY3VybF9taW1lcGFydCAqcGFydCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOworICBjaGFyICpiYXNlOworCisgIGlmKCFwYXJ0KQorICAgIHJldHVybiBDVVJMRV9CQURfRlVOQ1RJT05fQVJHVU1FTlQ7CisKKyAgY2xlYW51cF9wYXJ0X2NvbnRlbnQocGFydCk7CisKKyAgaWYoZmlsZW5hbWUpIHsKKyAgICBzdHJ1Y3Rfc3RhdCBzYnVmOworCisgICAgaWYoc3RhdChmaWxlbmFtZSwgJnNidWYpIHx8IGFjY2VzcyhmaWxlbmFtZSwgUl9PSykpCisgICAgICByZXN1bHQgPSBDVVJMRV9SRUFEX0VSUk9SOworCisgICAgcGFydC0+ZGF0YSA9IHN0cmR1cChmaWxlbmFtZSk7CisgICAgaWYoIXBhcnQtPmRhdGEpCisgICAgICByZXN1bHQgPSBDVVJMRV9PVVRfT0ZfTUVNT1JZOworCisgICAgcGFydC0+ZGF0YXNpemUgPSAtMTsKKyAgICBpZighcmVzdWx0ICYmIFNfSVNSRUcoc2J1Zi5zdF9tb2RlKSkgeworICAgICAgcGFydC0+ZGF0YXNpemUgPSBmaWxlc2l6ZShmaWxlbmFtZSwgc2J1Zik7CisgICAgICBwYXJ0LT5zZWVrZnVuYyA9IG1pbWVfZmlsZV9zZWVrOworICAgIH0KKworICAgIHBhcnQtPnJlYWRmdW5jID0gbWltZV9maWxlX3JlYWQ7CisgICAgcGFydC0+ZnJlZWZ1bmMgPSBtaW1lX2ZpbGVfZnJlZTsKKyAgICBwYXJ0LT5raW5kID0gTUlNRUtJTkRfRklMRTsKKworICAgIC8qIEFzIGEgc2lkZSBlZmZlY3QsIHNldCB0aGUgZmlsZW5hbWUgdG8gdGhlIGN1cnJlbnQgZmlsZSdzIGJhc2UgbmFtZS4KKyAgICAgICBJdCBpcyBwb3NzaWJsZSB0byB3aXRoZHJhdyB0aGlzIGJ5IGV4cGxpY2l0bHkgY2FsbGluZworICAgICAgIGN1cmxfbWltZV9maWxlbmFtZSgpIHdpdGggYSBOVUxMIGZpbGVuYW1lIGFyZ3VtZW50IGFmdGVyIHRoZSBjdXJyZW50CisgICAgICAgY2FsbC4gKi8KKyAgICBiYXNlID0gc3RyaXBwYXRoKGZpbGVuYW1lKTsKKyAgICBpZighYmFzZSkKKyAgICAgIHJlc3VsdCA9IENVUkxFX09VVF9PRl9NRU1PUlk7CisgICAgZWxzZSB7CisgICAgICBDVVJMY29kZSByZXMgPSBjdXJsX21pbWVfZmlsZW5hbWUocGFydCwgYmFzZSk7CisKKyAgICAgIGlmKHJlcykKKyAgICAgICAgcmVzdWx0ID0gcmVzOworICAgICAgZnJlZShiYXNlKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogU2V0IG1pbWUgcGFydCB0eXBlLiAqLworQ1VSTGNvZGUgY3VybF9taW1lX3R5cGUoY3VybF9taW1lcGFydCAqcGFydCwgY29uc3QgY2hhciAqbWltZXR5cGUpCit7CisgIGlmKCFwYXJ0KQorICAgIHJldHVybiBDVVJMRV9CQURfRlVOQ1RJT05fQVJHVU1FTlQ7CisKKyAgQ3VybF9zYWZlZnJlZShwYXJ0LT5taW1ldHlwZSk7CisgIHBhcnQtPm1pbWV0eXBlID0gTlVMTDsKKworICBpZihtaW1ldHlwZSkgeworICAgIHBhcnQtPm1pbWV0eXBlID0gc3RyZHVwKG1pbWV0eXBlKTsKKyAgICBpZighcGFydC0+bWltZXR5cGUpCisgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKKyAgfQorCisgIHJldHVybiBDVVJMRV9PSzsKK30KKworLyogU2V0IG1pbWUgZGF0YSB0cmFuc2ZlciBlbmNvZGVyLiAqLworQ1VSTGNvZGUgY3VybF9taW1lX2VuY29kZXIoY3VybF9taW1lcGFydCAqcGFydCwgY29uc3QgY2hhciAqZW5jb2RpbmcpCit7CisgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX0JBRF9GVU5DVElPTl9BUkdVTUVOVDsKKyAgY29uc3QgbWltZV9lbmNvZGVyICptZXA7CisKKyAgaWYoIXBhcnQpCisgICAgcmV0dXJuIHJlc3VsdDsKKworICBwYXJ0LT5lbmNvZGVyID0gTlVMTDsKKworICBpZighZW5jb2RpbmcpCisgICAgcmV0dXJuIENVUkxFX09LOyAgICAvKiBSZW1vdmluZyBjdXJyZW50IGVuY29kZXIuICovCisKKyAgZm9yKG1lcCA9IGVuY29kZXJzOyBtZXAtPm5hbWU7IG1lcCsrKQorICAgIGlmKHN0cmNhc2Vjb21wYXJlKGVuY29kaW5nLCBtZXAtPm5hbWUpKSB7CisgICAgICBwYXJ0LT5lbmNvZGVyID0gbWVwOworICAgICAgcmVzdWx0ID0gQ1VSTEVfT0s7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIFNldCBtaW1lIHBhcnQgaGVhZGVycy4gKi8KK0NVUkxjb2RlIGN1cmxfbWltZV9oZWFkZXJzKGN1cmxfbWltZXBhcnQgKnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY3VybF9zbGlzdCAqaGVhZGVycywgaW50IHRha2Vfb3duZXJzaGlwKQoreworICBpZighcGFydCkKKyAgICByZXR1cm4gQ1VSTEVfQkFEX0ZVTkNUSU9OX0FSR1VNRU5UOworCisgIGlmKHBhcnQtPmZsYWdzICYgTUlNRV9VU0VSSEVBREVSU19PV05FUikgeworICAgIGN1cmxfc2xpc3RfZnJlZV9hbGwocGFydC0+dXNlcmhlYWRlcnMpOworICAgIHBhcnQtPmZsYWdzICY9IH5NSU1FX1VTRVJIRUFERVJTX09XTkVSOworICB9CisgIHBhcnQtPnVzZXJoZWFkZXJzID0gaGVhZGVyczsKKyAgaWYoaGVhZGVycyAmJiB0YWtlX293bmVyc2hpcCkKKyAgICBwYXJ0LT5mbGFncyB8PSBNSU1FX1VTRVJIRUFERVJTX09XTkVSOworICByZXR1cm4gQ1VSTEVfT0s7Cit9CisKKy8qIFNldCBtaW1lIHBhcnQgY29udGVudCBmcm9tIGNhbGxiYWNrLiAqLworQ1VSTGNvZGUgY3VybF9taW1lX2RhdGFfY2IoY3VybF9taW1lcGFydCAqcGFydCwgY3VybF9vZmZfdCBkYXRhc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfcmVhZF9jYWxsYmFjayByZWFkZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfc2Vla19jYWxsYmFjayBzZWVrZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfZnJlZV9jYWxsYmFjayBmcmVlZnVuYywgdm9pZCAqYXJnKQoreworICBpZighcGFydCkKKyAgICByZXR1cm4gQ1VSTEVfQkFEX0ZVTkNUSU9OX0FSR1VNRU5UOworCisgIGNsZWFudXBfcGFydF9jb250ZW50KHBhcnQpOworCisgIGlmKHJlYWRmdW5jKSB7CisgICAgcGFydC0+cmVhZGZ1bmMgPSByZWFkZnVuYzsKKyAgICBwYXJ0LT5zZWVrZnVuYyA9IHNlZWtmdW5jOworICAgIHBhcnQtPmZyZWVmdW5jID0gZnJlZWZ1bmM7CisgICAgcGFydC0+YXJnID0gYXJnOworICAgIHBhcnQtPmRhdGFzaXplID0gZGF0YXNpemU7CisgICAgcGFydC0+a2luZCA9IE1JTUVLSU5EX0NBTExCQUNLOworICB9CisKKyAgcmV0dXJuIENVUkxFX09LOworfQorCisvKiBTZXQgbWltZSBwYXJ0IGNvbnRlbnQgZnJvbSBzdWJwYXJ0cy4gKi8KK0NVUkxjb2RlIGN1cmxfbWltZV9zdWJwYXJ0cyhjdXJsX21pbWVwYXJ0ICpwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfbWltZSAqc3VicGFydHMpCit7CisgIGlmKCFwYXJ0KQorICAgIHJldHVybiBDVVJMRV9CQURfRlVOQ1RJT05fQVJHVU1FTlQ7CisKKyAgLyogQWNjZXB0IHNldHRpbmcgdHdpY2UgdGhlIHNhbWUgc3VicGFydHMuICovCisgIGlmKHBhcnQtPmtpbmQgPT0gTUlNRUtJTkRfTVVMVElQQVJUICYmIHBhcnQtPmFyZyA9PSBzdWJwYXJ0cykKKyAgICByZXR1cm4gQ1VSTEVfT0s7CisKKyAgY2xlYW51cF9wYXJ0X2NvbnRlbnQocGFydCk7CisKKyAgaWYoc3VicGFydHMpIHsKKyAgICAvKiBNdXN0IGJlbG9uZyB0byB0aGUgc2FtZSBkYXRhIGhhbmRsZS4gKi8KKyAgICBpZihwYXJ0LT5lYXN5ICYmIHN1YnBhcnRzLT5lYXN5ICYmIHBhcnQtPmVhc3kgIT0gc3VicGFydHMtPmVhc3kpCisgICAgICByZXR1cm4gQ1VSTEVfQkFEX0ZVTkNUSU9OX0FSR1VNRU5UOworCisgICAgLyogU2hvdWxkIG5vdCBoYXZlIGJlZW4gYXR0YWNoZWQgYWxyZWFkeS4gKi8KKyAgICBpZihzdWJwYXJ0cy0+cGFyZW50KQorICAgICAgcmV0dXJuIENVUkxFX0JBRF9GVU5DVElPTl9BUkdVTUVOVDsKKworICAgIHN1YnBhcnRzLT5wYXJlbnQgPSBwYXJ0OworICAgIHBhcnQtPnJlYWRmdW5jID0gbWltZV9zdWJwYXJ0c19yZWFkOworICAgIHBhcnQtPnNlZWtmdW5jID0gbWltZV9zdWJwYXJ0c19zZWVrOworICAgIHBhcnQtPmZyZWVmdW5jID0gbWltZV9zdWJwYXJ0c19mcmVlOworICAgIHBhcnQtPmFyZyA9IHN1YnBhcnRzOworICAgIHBhcnQtPmRhdGFzaXplID0gLTE7CisgICAgcGFydC0+a2luZCA9IE1JTUVLSU5EX01VTFRJUEFSVDsKKyAgfQorCisgIHJldHVybiBDVVJMRV9PSzsKK30KKworCisvKiBSZWFkYmFjayBmcm9tIHRvcCBtaW1lLiAqLworLyogQXJndW1lbnQgaXMgdGhlIGR1bW15IHRvcCBwYXJ0LiAqLworc2l6ZV90IEN1cmxfbWltZV9yZWFkKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIHNpemVfdCBuaXRlbXMsIHZvaWQgKmluc3RyZWFtKQoreworICBjdXJsX21pbWVwYXJ0ICpwYXJ0ID0gKGN1cmxfbWltZXBhcnQgKikgaW5zdHJlYW07CisKKyAgKHZvaWQpIHNpemU7ICAgLyogQWx3YXlzIDEuICovCisgIHJldHVybiByZWFkYmFja19wYXJ0KHBhcnQsIGJ1ZmZlciwgbml0ZW1zKTsKK30KKworLyogUmV3aW5kIG1pbWUgc3RyZWFtLiAqLworQ1VSTGNvZGUgQ3VybF9taW1lX3Jld2luZChjdXJsX21pbWVwYXJ0ICpwYXJ0KQoreworICByZXR1cm4gbWltZV9wYXJ0X3Jld2luZChwYXJ0KSA9PSBDVVJMX1NFRUtGVU5DX09LPworICAgICAgICAgQ1VSTEVfT0s6IENVUkxFX1NFTkRfRkFJTF9SRVdJTkQ7Cit9CisKKy8qIENvbXB1dGUgaGVhZGVyIGxpc3Qgc2l6ZS4gKi8KK3N0YXRpYyBzaXplX3Qgc2xpc3Rfc2l6ZShzdHJ1Y3QgY3VybF9zbGlzdCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3ZlcmhlYWQsIGNvbnN0IGNoYXIgKnNraXApCit7CisgIHNpemVfdCBzaXplID0gMDsKKyAgc2l6ZV90IHNraXBsZW4gPSBza2lwPyBzdHJsZW4oc2tpcCk6IDA7CisKKyAgZm9yKDsgczsgcyA9IHMtPm5leHQpCisgICAgaWYoIXNraXAgfHwgIW1hdGNoX2hlYWRlcihzLCBza2lwLCBza2lwbGVuKSkKKyAgICAgIHNpemUgKz0gc3RybGVuKHMtPmRhdGEpICsgb3ZlcmhlYWQ7CisgIHJldHVybiBzaXplOworfQorCisvKiBHZXQvY29tcHV0ZSBtdWx0aXBhcnQgc2l6ZS4gKi8KK3N0YXRpYyBjdXJsX29mZl90IG11bHRpcGFydF9zaXplKGN1cmxfbWltZSAqbWltZSkKK3sKKyAgY3VybF9vZmZfdCBzaXplOworICBjdXJsX29mZl90IHN6OworICBzaXplX3QgYm91bmRhcnlzaXplOworICBjdXJsX21pbWVwYXJ0ICpwYXJ0OworCisgIGlmKCFtaW1lKQorICAgIHJldHVybiAwOyAgICAgICAgICAgLyogTm90IHByZXNlbnQgLT4gZW1wdHkuICovCisKKyAgYm91bmRhcnlzaXplID0gNCArIHN0cmxlbihtaW1lLT5ib3VuZGFyeSkgKyAyOworICBzaXplID0gYm91bmRhcnlzaXplOyAgLyogRmluYWwgYm91bmRhcnkgLSBDUkxGIGFmdGVyIGhlYWRlcnMuICovCisKKyAgZm9yKHBhcnQgPSBtaW1lLT5maXJzdHBhcnQ7IHBhcnQ7IHBhcnQgPSBwYXJ0LT5uZXh0cGFydCkgeworICAgIHN6ID0gQ3VybF9taW1lX3NpemUocGFydCk7CisKKyAgICBpZihzeiA8IDApCisgICAgICBzaXplID0gc3o7CisKKyAgICBpZihzaXplID49IDApCisgICAgICBzaXplICs9IGJvdW5kYXJ5c2l6ZSArIHN6OworICB9CisKKyAgcmV0dXJuIHNpemU7Cit9CisKKy8qIEdldC9jb21wdXRlIG1pbWUgc2l6ZS4gKi8KK2N1cmxfb2ZmX3QgQ3VybF9taW1lX3NpemUoY3VybF9taW1lcGFydCAqcGFydCkKK3sKKyAgY3VybF9vZmZfdCBzaXplOworCisgIGlmKHBhcnQtPmRhdGFzaXplIDwgMCAmJiBwYXJ0LT5raW5kID09IE1JTUVLSU5EX01VTFRJUEFSVCkKKyAgICBwYXJ0LT5kYXRhc2l6ZSA9IG11bHRpcGFydF9zaXplKHBhcnQtPmFyZyk7CisKKyAgc2l6ZSA9IHBhcnQtPmRhdGFzaXplOworCisgIGlmKHBhcnQtPmVuY29kZXIpCisgICAgc2l6ZSA9IHBhcnQtPmVuY29kZXItPnNpemVmdW5jKHBhcnQpOworCisgIGlmKHNpemUgPj0gMCAmJiAhKHBhcnQtPmZsYWdzICYgTUlNRV9CT0RZX09OTFkpKSB7CisgICAgLyogQ29tcHV0ZSB0b3RhbCBwYXJ0IHNpemUuICovCisgICAgc2l6ZSArPSBzbGlzdF9zaXplKHBhcnQtPmN1cmxoZWFkZXJzLCAyLCBOVUxMKTsKKyAgICBzaXplICs9IHNsaXN0X3NpemUocGFydC0+dXNlcmhlYWRlcnMsIDIsICJDb250ZW50LVR5cGUiKTsKKyAgICBzaXplICs9IDI7ICAgIC8qIENSTEYgYWZ0ZXIgaGVhZGVycy4gKi8KKyAgfQorICByZXR1cm4gc2l6ZTsKK30KKworLyogQWRkIGEgaGVhZGVyLiAqLworLyogVkFSQVJHUzIgKi8KK0NVUkxjb2RlIEN1cmxfbWltZV9hZGRfaGVhZGVyKHN0cnVjdCBjdXJsX3NsaXN0ICoqc2xwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgc3RydWN0IGN1cmxfc2xpc3QgKmhkciA9IE5VTEw7CisgIGNoYXIgKnMgPSBOVUxMOworICB2YV9saXN0IGFwOworCisgIHZhX3N0YXJ0KGFwLCBmbXQpOworICBzID0gY3VybF9tdmFwcmludGYoZm10LCBhcCk7CisgIHZhX2VuZChhcCk7CisKKyAgaWYocykgeworICAgIGhkciA9IEN1cmxfc2xpc3RfYXBwZW5kX25vZHVwKCpzbHAsIHMpOworICAgIGlmKGhkcikKKyAgICAgICpzbHAgPSBoZHI7CisgICAgZWxzZQorICAgICAgZnJlZShzKTsKKyAgfQorCisgIHJldHVybiBoZHI/IENVUkxFX09LOiBDVVJMRV9PVVRfT0ZfTUVNT1JZOworfQorCisvKiBBZGQgYSBjb250ZW50IHR5cGUgaGVhZGVyLiAqLworc3RhdGljIENVUkxjb2RlIGFkZF9jb250ZW50X3R5cGUoc3RydWN0IGN1cmxfc2xpc3QgKipzbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpib3VuZGFyeSkKK3sKKyAgcmV0dXJuIEN1cmxfbWltZV9hZGRfaGVhZGVyKHNscCwgIkNvbnRlbnQtVHlwZTogJXMlcyVzIiwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5PyAiOyBib3VuZGFyeT0iOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5PyBib3VuZGFyeTogIiIpOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpDb250ZW50VHlwZUZvckZpbGVuYW1lKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICB1bnNpZ25lZCBpbnQgaTsKKworICAvKgorICAgKiBJZiBubyBjb250ZW50IHR5cGUgd2FzIHNwZWNpZmllZCwgd2Ugc2NhbiB0aHJvdWdoIGEgZmV3IHdlbGwta25vd24KKyAgICogZXh0ZW5zaW9ucyBhbmQgcGljayB0aGUgZmlyc3Qgd2UgbWF0Y2ghCisgICAqLworICBzdHJ1Y3QgQ29udGVudFR5cGUgeworICAgIGNvbnN0IGNoYXIgKmV4dGVuc2lvbjsKKyAgICBjb25zdCBjaGFyICp0eXBlOworICB9OworICBzdGF0aWMgY29uc3Qgc3RydWN0IENvbnRlbnRUeXBlIGN0dHNbXSA9IHsKKyAgICB7Ii5naWYiLCAgImltYWdlL2dpZiJ9LAorICAgIHsiLmpwZyIsICAiaW1hZ2UvanBlZyJ9LAorICAgIHsiLmpwZWciLCAiaW1hZ2UvanBlZyJ9LAorICAgIHsiLnBuZyIsICAiaW1hZ2UvcG5nIn0sCisgICAgeyIuc3ZnIiwgICJpbWFnZS9zdmcreG1sIn0sCisgICAgeyIudHh0IiwgICJ0ZXh0L3BsYWluIn0sCisgICAgeyIuaHRtIiwgICJ0ZXh0L2h0bWwifSwKKyAgICB7Ii5odG1sIiwgInRleHQvaHRtbCJ9LAorICAgIHsiLnBkZiIsICAiYXBwbGljYXRpb24vcGRmIn0sCisgICAgeyIueG1sIiwgICJhcHBsaWNhdGlvbi94bWwifQorICB9OworCisgIGlmKGZpbGVuYW1lKSB7CisgICAgc2l6ZV90IGxlbjEgPSBzdHJsZW4oZmlsZW5hbWUpOworICAgIGNvbnN0IGNoYXIgKm5hbWVlbmQgPSBmaWxlbmFtZSArIGxlbjE7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBzaXplb2YgY3R0cyAvIHNpemVvZiBjdHRzWzBdOyBpKyspIHsKKyAgICAgIHNpemVfdCBsZW4yID0gc3RybGVuKGN0dHNbaV0uZXh0ZW5zaW9uKTsKKworICAgICAgaWYobGVuMSA+PSBsZW4yICYmIHN0cmNhc2Vjb21wYXJlKG5hbWVlbmQgLSBsZW4yLCBjdHRzW2ldLmV4dGVuc2lvbikpCisgICAgICAgICAgcmV0dXJuIGN0dHNbaV0udHlwZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK0NVUkxjb2RlIEN1cmxfbWltZV9wcmVwYXJlX2hlYWRlcnMoY3VybF9taW1lcGFydCAqcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29udGVudHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRpc3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIG1pbWVzdHJhdGVneSBzdHJhdGVneSkKK3sKKyAgY3VybF9taW1lICptaW1lID0gTlVMTDsKKyAgY29uc3QgY2hhciAqYm91bmRhcnkgPSBOVUxMOworICBjaGFyICpzOworICBjb25zdCBjaGFyICpjdGUgPSBOVUxMOworICBDVVJMY29kZSByZXQgPSBDVVJMRV9PSzsKKworICAvKiBHZXQgcmlkIG9mIHByZXZpb3VzbHkgcHJlcGFyZWQgaGVhZGVycy4gKi8KKyAgY3VybF9zbGlzdF9mcmVlX2FsbChwYXJ0LT5jdXJsaGVhZGVycyk7CisgIHBhcnQtPmN1cmxoZWFkZXJzID0gTlVMTDsKKworICAvKiBCZSBzdXJlIHdlIHdvbid0IGFjY2VzcyBvbGQgaGVhZGVycyBsYXRlci4gKi8KKyAgaWYocGFydC0+c3RhdGUuc3RhdGUgPT0gTUlNRVNUQVRFX0NVUkxIRUFERVJTKQorICAgIG1pbWVzZXRzdGF0ZSgmcGFydC0+c3RhdGUsIE1JTUVTVEFURV9DVVJMSEVBREVSUywgTlVMTCk7CisKKyAgLyogQnVpbGQgdGhlIGNvbnRlbnQtdHlwZSBoZWFkZXIuICovCisgIHMgPSBzZWFyY2hfaGVhZGVyKHBhcnQtPnVzZXJoZWFkZXJzLCAiQ29udGVudC1UeXBlIik7CisgIGlmKHMpCisgICAgY29udGVudHR5cGUgPSBzOworICBpZihwYXJ0LT5taW1ldHlwZSkKKyAgICBjb250ZW50dHlwZSA9IHBhcnQtPm1pbWV0eXBlOworICBpZighY29udGVudHR5cGUpIHsKKyAgICBzd2l0Y2gocGFydC0+a2luZCkgeworICAgIGNhc2UgTUlNRUtJTkRfTVVMVElQQVJUOgorICAgICAgY29udGVudHR5cGUgPSBNVUxUSVBBUlRfQ09OVEVOVFRZUEVfREVGQVVMVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTUlNRUtJTkRfRklMRToKKyAgICAgIGNvbnRlbnR0eXBlID0gQ29udGVudFR5cGVGb3JGaWxlbmFtZShwYXJ0LT5maWxlbmFtZSk7CisgICAgICBpZighY29udGVudHR5cGUpCisgICAgICAgIGNvbnRlbnR0eXBlID0gQ29udGVudFR5cGVGb3JGaWxlbmFtZShwYXJ0LT5kYXRhKTsKKyAgICAgIGlmKCFjb250ZW50dHlwZSAmJiBwYXJ0LT5maWxlbmFtZSkKKyAgICAgICAgY29udGVudHR5cGUgPSBGSUxFX0NPTlRFTlRUWVBFX0RFRkFVTFQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgY29udGVudHR5cGUgPSBDb250ZW50VHlwZUZvckZpbGVuYW1lKHBhcnQtPmZpbGVuYW1lKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmKHBhcnQtPmtpbmQgPT0gTUlNRUtJTkRfTVVMVElQQVJUKSB7CisgICAgbWltZSA9IChjdXJsX21pbWUgKikgcGFydC0+YXJnOworICAgIGlmKG1pbWUpCisgICAgICBib3VuZGFyeSA9IG1pbWUtPmJvdW5kYXJ5OworICB9CisgIGVsc2UgaWYoY29udGVudHR5cGUgJiYgc3RyY2FzZWNvbXBhcmUoY29udGVudHR5cGUsICJ0ZXh0L3BsYWluIikpCisgICAgaWYoc3RyYXRlZ3kgPT0gTUlNRVNUUkFURUdZX01BSUwgfHwgIXBhcnQtPmZpbGVuYW1lKQorICAgICAgY29udGVudHR5cGUgPSBOVUxMOworCisgIC8qIElzc3VlIGNvbnRlbnQtZGlzcG9zaXRpb24gaGVhZGVyIG9ubHkgaWYgbm90IGFscmVhZHkgc2V0IGJ5IGNhbGxlci4gKi8KKyAgaWYoIXNlYXJjaF9oZWFkZXIocGFydC0+dXNlcmhlYWRlcnMsICJDb250ZW50LURpc3Bvc2l0aW9uIikpIHsKKyAgICBpZighZGlzcG9zaXRpb24pCisgICAgICBpZihwYXJ0LT5maWxlbmFtZSB8fCBwYXJ0LT5uYW1lIHx8CisgICAgICAgIChjb250ZW50dHlwZSAmJiAhc3RybmNhc2Vjb21wYXJlKGNvbnRlbnR0eXBlLCAibXVsdGlwYXJ0LyIsIDEwKSkpCisgICAgICAgICAgZGlzcG9zaXRpb24gPSBESVNQT1NJVElPTl9ERUZBVUxUOworICAgIGlmKGRpc3Bvc2l0aW9uICYmIGN1cmxfc3RyZXF1YWwoZGlzcG9zaXRpb24sICJhdHRhY2htZW50IikgJiYKKyAgICAgIXBhcnQtPm5hbWUgJiYgIXBhcnQtPmZpbGVuYW1lKQorICAgICAgZGlzcG9zaXRpb24gPSBOVUxMOworICAgIGlmKGRpc3Bvc2l0aW9uKSB7CisgICAgICBjaGFyICpuYW1lID0gTlVMTDsKKyAgICAgIGNoYXIgKmZpbGVuYW1lID0gTlVMTDsKKworICAgICAgaWYocGFydC0+bmFtZSkgeworICAgICAgICBuYW1lID0gZXNjYXBlX3N0cmluZyhwYXJ0LT5uYW1lKTsKKyAgICAgICAgaWYoIW5hbWUpCisgICAgICAgICAgcmV0ID0gQ1VSTEVfT1VUX09GX01FTU9SWTsKKyAgICAgIH0KKyAgICAgIGlmKCFyZXQgJiYgcGFydC0+ZmlsZW5hbWUpIHsKKyAgICAgICAgZmlsZW5hbWUgPSBlc2NhcGVfc3RyaW5nKHBhcnQtPmZpbGVuYW1lKTsKKyAgICAgICAgaWYoIWZpbGVuYW1lKQorICAgICAgICAgIHJldCA9IENVUkxFX09VVF9PRl9NRU1PUlk7CisgICAgICB9CisgICAgICBpZighcmV0KQorICAgICAgICByZXQgPSBDdXJsX21pbWVfYWRkX2hlYWRlcigmcGFydC0+Y3VybGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb250ZW50LURpc3Bvc2l0aW9uOiAlcyVzJXMlcyVzJXMlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPyAiOyBuYW1lPVwiIjogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU/IG5hbWU6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPyAiXCIiOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU/ICI7IGZpbGVuYW1lPVwiIjogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPyBmaWxlbmFtZTogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPyAiXCIiOiAiIik7CisgICAgICBDdXJsX3NhZmVmcmVlKG5hbWUpOworICAgICAgQ3VybF9zYWZlZnJlZShmaWxlbmFtZSk7CisgICAgICBpZihyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgICB9CisgICAgfQorCisgIC8qIElzc3VlIENvbnRlbnQtVHlwZSBoZWFkZXIuICovCisgIGlmKGNvbnRlbnR0eXBlKSB7CisgICAgcmV0ID0gYWRkX2NvbnRlbnRfdHlwZSgmcGFydC0+Y3VybGhlYWRlcnMsIGNvbnRlbnR0eXBlLCBib3VuZGFyeSk7CisgICAgaWYocmV0KQorICAgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIC8qIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcgaGVhZGVyLiAqLworICBpZighc2VhcmNoX2hlYWRlcihwYXJ0LT51c2VyaGVhZGVycywgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmciKSkgeworICAgIGlmKHBhcnQtPmVuY29kZXIpCisgICAgICBjdGUgPSBwYXJ0LT5lbmNvZGVyLT5uYW1lOworICAgIGVsc2UgaWYoY29udGVudHR5cGUgJiYgc3RyYXRlZ3kgPT0gTUlNRVNUUkFURUdZX01BSUwgJiYKKyAgICAgcGFydC0+a2luZCAhPSBNSU1FS0lORF9NVUxUSVBBUlQpCisgICAgICBjdGUgPSAiOGJpdCI7CisgICAgaWYoY3RlKSB7CisgICAgICByZXQgPSBDdXJsX21pbWVfYWRkX2hlYWRlcigmcGFydC0+Y3VybGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogJXMiLCBjdGUpOworICAgICAgaWYocmV0KQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgfQorCisgIC8qIElmIHdlIHdlcmUgcmVhZGluZyBjdXJsLWdlbmVyYXRlZCBoZWFkZXJzLCByZXN0YXJ0IHdpdGggbmV3IG9uZXMgKHRoaXMKKyAgICAgc2hvdWxkIG5vdCBvY2N1cikuICovCisgIGlmKHBhcnQtPnN0YXRlLnN0YXRlID09IE1JTUVTVEFURV9DVVJMSEVBREVSUykKKyAgICBtaW1lc2V0c3RhdGUoJnBhcnQtPnN0YXRlLCBNSU1FU1RBVEVfQ1VSTEhFQURFUlMsIHBhcnQtPmN1cmxoZWFkZXJzKTsKKworICAvKiBQcm9jZXNzIHN1YnBhcnRzLiAqLworICBpZihwYXJ0LT5raW5kID09IE1JTUVLSU5EX01VTFRJUEFSVCAmJiBtaW1lKSB7CisgICAgY3VybF9taW1lcGFydCAqc3VicGFydDsKKworICAgIGRpc3Bvc2l0aW9uID0gTlVMTDsKKyAgICBpZihzdHJjYXNlY29tcGFyZShjb250ZW50dHlwZSwgIm11bHRpcGFydC9mb3JtLWRhdGEiKSkKKyAgICAgIGRpc3Bvc2l0aW9uID0gImZvcm0tZGF0YSI7CisgICAgZm9yKHN1YnBhcnQgPSBtaW1lLT5maXJzdHBhcnQ7IHN1YnBhcnQ7IHN1YnBhcnQgPSBzdWJwYXJ0LT5uZXh0cGFydCkgeworICAgICAgcmV0ID0gQ3VybF9taW1lX3ByZXBhcmVfaGVhZGVycyhzdWJwYXJ0LCBOVUxMLCBkaXNwb3NpdGlvbiwgc3RyYXRlZ3kpOworICAgICAgaWYocmV0KQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgfQorICByZXR1cm4gcmV0OworfQorCisjZWxzZSAvKiAhQ1VSTF9ESVNBQkxFX0hUVFAgfHwgIUNVUkxfRElTQUJMRV9TTVRQIHx8ICFDVVJMX0RJU0FCTEVfSU1BUCAqLworCisvKiBNaW1lIG5vdCBjb21waWxlZCBpbjogZGVmaW5lIHN0dWJzIGZvciBleHRlcm5hbGx5LXJlZmVyZW5jZWQgZnVuY3Rpb25zLiAqLworY3VybF9taW1lICpjdXJsX21pbWVfaW5pdChDVVJMICplYXN5KQoreworICAodm9pZCkgZWFzeTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgY3VybF9taW1lX2ZyZWUoY3VybF9taW1lICptaW1lKQoreworICAodm9pZCkgbWltZTsKK30KKworY3VybF9taW1lcGFydCAqY3VybF9taW1lX2FkZHBhcnQoY3VybF9taW1lICptaW1lKQoreworICAodm9pZCkgbWltZTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK0NVUkxjb2RlIGN1cmxfbWltZV9uYW1lKGN1cmxfbWltZXBhcnQgKnBhcnQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICh2b2lkKSBwYXJ0OworICAodm9pZCkgbmFtZTsKKyAgcmV0dXJuIENVUkxFX05PVF9CVUlMVF9JTjsKK30KKworQ1VSTGNvZGUgY3VybF9taW1lX2ZpbGVuYW1lKGN1cmxfbWltZXBhcnQgKnBhcnQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAodm9pZCkgcGFydDsKKyAgKHZvaWQpIGZpbGVuYW1lOworICByZXR1cm4gQ1VSTEVfTk9UX0JVSUxUX0lOOworfQorCitDVVJMY29kZSBjdXJsX21pbWVfdHlwZShjdXJsX21pbWVwYXJ0ICpwYXJ0LCBjb25zdCBjaGFyICptaW1ldHlwZSkKK3sKKyAgKHZvaWQpIHBhcnQ7CisgICh2b2lkKSBtaW1ldHlwZTsKKyAgcmV0dXJuIENVUkxFX05PVF9CVUlMVF9JTjsKK30KKworQ1VSTGNvZGUgY3VybF9taW1lX2VuY29kZXIoY3VybF9taW1lcGFydCAqcGFydCwgY29uc3QgY2hhciAqZW5jb2RpbmcpCit7CisgICh2b2lkKSBwYXJ0OworICAodm9pZCkgZW5jb2Rpbmc7CisgIHJldHVybiBDVVJMRV9OT1RfQlVJTFRfSU47Cit9CisKK0NVUkxjb2RlIGN1cmxfbWltZV9kYXRhKGN1cmxfbWltZXBhcnQgKnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgZGF0YXNpemUpCit7CisgICh2b2lkKSBwYXJ0OworICAodm9pZCkgZGF0YTsKKyAgKHZvaWQpIGRhdGFzaXplOworICByZXR1cm4gQ1VSTEVfTk9UX0JVSUxUX0lOOworfQorCitDVVJMY29kZSBjdXJsX21pbWVfZmlsZWRhdGEoY3VybF9taW1lcGFydCAqcGFydCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICh2b2lkKSBwYXJ0OworICAodm9pZCkgZmlsZW5hbWU7CisgIHJldHVybiBDVVJMRV9OT1RfQlVJTFRfSU47Cit9CisKK0NVUkxjb2RlIGN1cmxfbWltZV9kYXRhX2NiKGN1cmxfbWltZXBhcnQgKnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX29mZl90IGRhdGFzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9yZWFkX2NhbGxiYWNrIHJlYWRmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9zZWVrX2NhbGxiYWNrIHNlZWtmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9mcmVlX2NhbGxiYWNrIGZyZWVmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKQoreworICAodm9pZCkgcGFydDsKKyAgKHZvaWQpIGRhdGFzaXplOworICAodm9pZCkgcmVhZGZ1bmM7CisgICh2b2lkKSBzZWVrZnVuYzsKKyAgKHZvaWQpIGZyZWVmdW5jOworICAodm9pZCkgYXJnOworICByZXR1cm4gQ1VSTEVfTk9UX0JVSUxUX0lOOworfQorCitDVVJMY29kZSBjdXJsX21pbWVfc3VicGFydHMoY3VybF9taW1lcGFydCAqcGFydCwgY3VybF9taW1lICpzdWJwYXJ0cykKK3sKKyAgKHZvaWQpIHBhcnQ7CisgICh2b2lkKSBzdWJwYXJ0czsKKyAgcmV0dXJuIENVUkxFX05PVF9CVUlMVF9JTjsKK30KKworQ1VSTGNvZGUgY3VybF9taW1lX2hlYWRlcnMoY3VybF9taW1lcGFydCAqcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjdXJsX3NsaXN0ICpoZWFkZXJzLCBpbnQgdGFrZV9vd25lcnNoaXApCit7CisgICh2b2lkKSBwYXJ0OworICAodm9pZCkgaGVhZGVyczsKKyAgKHZvaWQpIHRha2Vfb3duZXJzaGlwOworICByZXR1cm4gQ1VSTEVfTk9UX0JVSUxUX0lOOworfQorCit2b2lkIEN1cmxfbWltZV9pbml0cGFydChjdXJsX21pbWVwYXJ0ICpwYXJ0LCBzdHJ1Y3QgQ3VybF9lYXN5ICplYXN5KQoreworICAodm9pZCkgcGFydDsKKyAgKHZvaWQpIGVhc3k7Cit9CisKK3ZvaWQgQ3VybF9taW1lX2NsZWFucGFydChjdXJsX21pbWVwYXJ0ICpwYXJ0KQoreworICAodm9pZCkgcGFydDsKK30KKworQ1VSTGNvZGUgQ3VybF9taW1lX3ByZXBhcmVfaGVhZGVycyhjdXJsX21pbWVwYXJ0ICpwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb250ZW50dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGlzcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbWltZXN0cmF0ZWd5IHN0cmF0ZWd5KQoreworICAodm9pZCkgcGFydDsKKyAgKHZvaWQpIGNvbnRlbnR0eXBlOworICAodm9pZCkgZGlzcG9zaXRpb247CisgICh2b2lkKSBzdHJhdGVneTsKKyAgcmV0dXJuIENVUkxFX05PVF9CVUlMVF9JTjsKK30KKworY3VybF9vZmZfdCBDdXJsX21pbWVfc2l6ZShjdXJsX21pbWVwYXJ0ICpwYXJ0KQoreworICAodm9pZCkgcGFydDsKKyAgcmV0dXJuIChjdXJsX29mZl90KSAtMTsKK30KKworc2l6ZV90IEN1cmxfbWltZV9yZWFkKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIHNpemVfdCBuaXRlbXMsIHZvaWQgKmluc3RyZWFtKQoreworICAodm9pZCkgYnVmZmVyOworICAodm9pZCkgc2l6ZTsKKyAgKHZvaWQpIG5pdGVtczsKKyAgKHZvaWQpIGluc3RyZWFtOworICByZXR1cm4gMDsKK30KKworQ1VSTGNvZGUgQ3VybF9taW1lX3Jld2luZChjdXJsX21pbWVwYXJ0ICpwYXJ0KQoreworICAodm9pZCkgcGFydDsKKyAgcmV0dXJuIENVUkxFX05PVF9CVUlMVF9JTjsKK30KKworLyogVkFSQVJHUzIgKi8KK0NVUkxjb2RlIEN1cmxfbWltZV9hZGRfaGVhZGVyKHN0cnVjdCBjdXJsX3NsaXN0ICoqc2xwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgKHZvaWQpIHNscDsKKyAgKHZvaWQpIGZtdDsKKyAgcmV0dXJuIENVUkxFX05PVF9CVUlMVF9JTjsKK30KKworI2VuZGlmIC8qICFDVVJMX0RJU0FCTEVfSFRUUCB8fCAhQ1VSTF9ESVNBQkxFX1NNVFAgfHwgIUNVUkxfRElTQUJMRV9JTUFQICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9taW1lLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9taW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0NDg1NwotLS0gL2Rldi9udWxsCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL21pbWUuaApAQCAtMCwwICsxLDEzNSBAQAorI2lmbmRlZiBIRUFERVJfQ1VSTF9NSU1FX0gKKyNkZWZpbmUgSEVBREVSX0NVUkxfTUlNRV9ICisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfICAgXyBfX19fICBfCisgKiAgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgIF9fX3wgfCB8IHwgIF8gXHwgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gX198IHwgfCB8IHxfKSB8IHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCisgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCisgKiBhcmUgYWxzbyBhdmFpbGFibGUgYXQgaHR0cHM6Ly9jdXJsLmhheHguc2UvZG9jcy9jb3B5cmlnaHQuaHRtbC4KKyAqCisgKiBZb3UgbWF5IG9wdCB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENPUFlJTkcgZmlsZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTUlNRV9SQU5EX0JPVU5EQVJZX0NIQVJTICAgICAgICAxNiAgLyogTmIuIG9mIHJhbmRvbSBib3VuZGFyeSBjaGFycy4gKi8KKyNkZWZpbmUgTUFYX0VOQ09ERURfTElORV9MRU5HVEggICAgICAgICA3NiAgLyogTWF4aW11bSBlbmNvZGVkIGxpbmUgbGVuZ3RoLiAqLworI2RlZmluZSBFTkNPRElOR19CVUZGRVJfU0laRSAgICAgICAgICAgIDI1NiAvKiBFbmNvZGluZyB0ZW1wIGJ1ZmZlcnMgc2l6ZS4gKi8KKworLyogUGFydCBmbGFncy4gKi8KKyNkZWZpbmUgTUlNRV9VU0VSSEVBREVSU19PV05FUiAgKDEgPDwgMCkKKyNkZWZpbmUgTUlNRV9CT0RZX09OTFkgICAgICAgICAgKDEgPDwgMSkKKworLyogUGFydCBzb3VyY2Uga2luZHMuICovCitlbnVtIG1pbWVraW5kIHsKKyAgTUlNRUtJTkRfTk9ORSA9IDAsICAgICAgICAgICAgLyogUGFydCBub3Qgc2V0LiAqLworICBNSU1FS0lORF9EQVRBLCAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZWQgbWltZSBkYXRhLiAqLworICBNSU1FS0lORF9GSUxFLCAgICAgICAgICAgICAgICAvKiBEYXRhIGZyb20gZmlsZS4gKi8KKyAgTUlNRUtJTkRfQ0FMTEJBQ0ssICAgICAgICAgICAgLyogRGF0YSBmcm9tIGByZWFkJyBjYWxsYmFjay4gKi8KKyAgTUlNRUtJTkRfTVVMVElQQVJULCAgICAgICAgICAgLyogRGF0YSBpcyBhIG1pbWUgc3VicGFydC4gKi8KKyAgTUlNRUtJTkRfTEFTVAorfTsKKworLyogUmVhZGJhY2sgc3RhdGUgdG9rZW5zLiAqLworZW51bSBtaW1lc3RhdGUgeworICBNSU1FU1RBVEVfQkVHSU4sICAgICAgICAgICAgICAvKiBSZWFkYmFjayBoYXMgbm90IHlldCBzdGFydGVkLiAqLworICBNSU1FU1RBVEVfQ1VSTEhFQURFUlMsICAgICAgICAvKiBJbiBjdXJsLWdlbmVyYXRlZCBoZWFkZXJzLiAqLworICBNSU1FU1RBVEVfVVNFUkhFQURFUlMsICAgICAgICAvKiBJbiBjYWxsZXIncyBzdXBwbGllZCBoZWFkZXJzLiAqLworICBNSU1FU1RBVEVfRU9ILCAgICAgICAgICAgICAgICAvKiBFbmQgb2YgaGVhZGVycy4gKi8KKyAgTUlNRVNUQVRFX0JPRFksICAgICAgICAgICAgICAgLyogUGxhY2Vob2xkZXIuICovCisgIE1JTUVTVEFURV9CT1VOREFSWTEsICAgICAgICAgIC8qIEluIGJvdW5kYXJ5IHByZWZpeC4gKi8KKyAgTUlNRVNUQVRFX0JPVU5EQVJZMiwgICAgICAgICAgLyogSW4gYm91bmRhcnkuICovCisgIE1JTUVTVEFURV9DT05URU5ULCAgICAgICAgICAgIC8qIEluIGNvbnRlbnQuICovCisgIE1JTUVTVEFURV9FTkQsICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBwYXJ0IHJlYWNoZWQuICovCisgIE1JTUVTVEFURV9MQVNUCit9OworCisvKiBNaW1lIGhlYWRlcnMgc3RyYXRlZ2llcy4gKi8KK2VudW0gbWltZXN0cmF0ZWd5IHsKKyAgTUlNRVNUUkFURUdZX01BSUwsICAgICAgICAgICAgLyogTWltZSBtYWlsLiAqLworICBNSU1FU1RSQVRFR1lfRk9STSwgICAgICAgICAgICAvKiBIVFRQIHBvc3QgZm9ybS4gKi8KKyAgTUlNRVNUUkFURUdZX0xBU1QKK307CisKKy8qIENvbnRlbnQgdHJhbnNmZXIgZW5jb2Rlci4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqICAgbmFtZTsgICAgICAgICAgLyogRW5jb2RpbmcgbmFtZS4gKi8KKyAgc2l6ZV90ICAgICAgICAgKCplbmNvZGVmdW5jKShjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGF0ZW9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX21pbWVwYXJ0ICpwYXJ0KTsgIC8qIEVuY29kZWQgcmVhZC4gKi8KKyAgY3VybF9vZmZfdCAgICAgKCpzaXplZnVuYykoY3VybF9taW1lcGFydCAqcGFydCk7ICAvKiBFbmNvZGVkIHNpemUuICovCit9ICBtaW1lX2VuY29kZXI7CisKKy8qIENvbnRlbnQgdHJhbnNmZXIgZW5jb2RlciBzdGF0ZS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgc2l6ZV90ICAgICAgICAgcG9zOyAgICAgICAgICAgLyogUG9zaXRpb24gb24gb3V0cHV0IGxpbmUuICovCisgIHNpemVfdCAgICAgICAgIGJ1ZmJlZzsgICAgICAgIC8qIE5leHQgZGF0YSBpbmRleCBpbiBpbnB1dCBidWZmZXIuICovCisgIHNpemVfdCAgICAgICAgIGJ1ZmVuZDsgICAgICAgIC8qIEZpcnN0IHVudXNlZCBieXRlIGluZGV4IGluIGlucHV0IGJ1ZmZlci4gKi8KKyAgY2hhciAgICAgICAgICAgYnVmW0VOQ09ESU5HX0JVRkZFUl9TSVpFXTsgLyogSW5wdXQgYnVmZmVyLiAqLworfSAgbWltZV9lbmNvZGVyX3N0YXRlOworCisvKiBNaW1lIHJlYWRiYWNrIHN0YXRlLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBlbnVtIG1pbWVzdGF0ZSBzdGF0ZTsgICAgICAgLyogQ3VycmVudCBzdGF0ZSB0b2tlbi4gKi8KKyAgdm9pZCAqcHRyOyAgICAgICAgICAgICAgICAgIC8qIFN0YXRlLWRlcGVuZGVudCBwb2ludGVyLiAqLworICBzaXplX3Qgb2Zmc2V0OyAgICAgICAgICAgICAgLyogU3RhdGUtZGVwZW5kZW50IG9mZnNldC4gKi8KK30gIG1pbWVfc3RhdGU7CisKKy8qIEEgbWltZSBtdWx0aXBhcnQuICovCitzdHJ1Y3QgY3VybF9taW1lX3MgeworICBzdHJ1Y3QgQ3VybF9lYXN5ICplYXN5OyAgICAgICAgICAvKiBUaGUgYXNzb2NpYXRlZCBlYXN5IGhhbmRsZS4gKi8KKyAgY3VybF9taW1lcGFydCAqcGFyZW50OyAgICAgICAgICAgLyogUGFyZW50IHBhcnQuICovCisgIGN1cmxfbWltZXBhcnQgKmZpcnN0cGFydDsgICAgICAgIC8qIEZpcnN0IHBhcnQuICovCisgIGN1cmxfbWltZXBhcnQgKmxhc3RwYXJ0OyAgICAgICAgIC8qIExhc3QgcGFydC4gKi8KKyAgY2hhciAqYm91bmRhcnk7ICAgICAgICAgICAgICAgICAgLyogVGhlIHBhcnQgYm91bmRhcnkuICovCisgIG1pbWVfc3RhdGUgc3RhdGU7ICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgcmVhZGJhY2sgc3RhdGUuICovCit9OworCisvKiBBIG1pbWUgcGFydC4gKi8KK3N0cnVjdCBjdXJsX21pbWVwYXJ0X3MgeworICBzdHJ1Y3QgQ3VybF9lYXN5ICplYXN5OyAgICAgICAgICAvKiBUaGUgYXNzb2NpYXRlZCBlYXN5IGhhbmRsZS4gKi8KKyAgY3VybF9taW1lICpwYXJlbnQ7ICAgICAgICAgICAgICAgLyogUGFyZW50IG1pbWUgc3RydWN0dXJlLiAqLworICBjdXJsX21pbWVwYXJ0ICpuZXh0cGFydDsgICAgICAgICAvKiBGb3J3YXJkIGxpbmtlZCBsaXN0LiAqLworICBlbnVtIG1pbWVraW5kIGtpbmQ7ICAgICAgICAgICAgICAvKiBUaGUgcGFydCBraW5kLiAqLworICBjaGFyICpkYXRhOyAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgZGF0YSBvciBmaWxlIG5hbWUuICovCisgIGN1cmxfcmVhZF9jYWxsYmFjayByZWFkZnVuYzsgICAgIC8qIFJlYWQgZnVuY3Rpb24uICovCisgIGN1cmxfc2Vla19jYWxsYmFjayBzZWVrZnVuYzsgICAgIC8qIFNlZWsgZnVuY3Rpb24uICovCisgIGN1cmxfZnJlZV9jYWxsYmFjayBmcmVlZnVuYzsgICAgIC8qIEFyZ3VtZW50IGZyZWUgZnVuY3Rpb24uICovCisgIHZvaWQgKmFyZzsgICAgICAgICAgICAgICAgICAgICAgIC8qIEFyZ3VtZW50IHRvIGNhbGxiYWNrIGZ1bmN0aW9ucy4gKi8KKyAgRklMRSAqZnA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSBwb2ludGVyLiAqLworICBzdHJ1Y3QgY3VybF9zbGlzdCAqY3VybGhlYWRlcnM7ICAvKiBQYXJ0IGhlYWRlcnMuICovCisgIHN0cnVjdCBjdXJsX3NsaXN0ICp1c2VyaGVhZGVyczsgIC8qIFBhcnQgaGVhZGVycy4gKi8KKyAgY2hhciAqbWltZXR5cGU7ICAgICAgICAgICAgICAgICAgLyogUGFydCBtaW1lIHR5cGUuICovCisgIGNoYXIgKmZpbGVuYW1lOyAgICAgICAgICAgICAgICAgIC8qIFJlbW90ZSBmaWxlIG5hbWUuICovCisgIGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgICAgIC8qIERhdGEgbmFtZS4gKi8KKyAgY3VybF9vZmZfdCBkYXRhc2l6ZTsgICAgICAgICAgICAgLyogRXhwZWN0ZWQgZGF0YSBzaXplLiAqLworICB1bnNpZ25lZCBpbnQgZmxhZ3M7ICAgICAgICAgICAgICAvKiBGbGFncy4gKi8KKyAgbWltZV9zdGF0ZSBzdGF0ZTsgICAgICAgICAgICAgICAgLyogQ3VycmVudCByZWFkYmFjayBzdGF0ZS4gKi8KKyAgY29uc3QgbWltZV9lbmNvZGVyICplbmNvZGVyOyAgICAgLyogQ29udGVudCBkYXRhIGVuY29kZXIuICovCisgIG1pbWVfZW5jb2Rlcl9zdGF0ZSBlbmNzdGF0ZTsgICAgIC8qIERhdGEgZW5jb2RlciBzdGF0ZS4gKi8KK307CisKKworLyogUHJvdG90eXBlcy4gKi8KK3ZvaWQgQ3VybF9taW1lX2luaXRwYXJ0KGN1cmxfbWltZXBhcnQgKnBhcnQsIHN0cnVjdCBDdXJsX2Vhc3kgKmVhc3kpOwordm9pZCBDdXJsX21pbWVfY2xlYW5wYXJ0KGN1cmxfbWltZXBhcnQgKnBhcnQpOworQ1VSTGNvZGUgQ3VybF9taW1lX3ByZXBhcmVfaGVhZGVycyhjdXJsX21pbWVwYXJ0ICpwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb250ZW50dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGlzcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbWltZXN0cmF0ZWd5IHN0cmF0ZWd5KTsKK2N1cmxfb2ZmX3QgQ3VybF9taW1lX3NpemUoY3VybF9taW1lcGFydCAqcGFydCk7CitzaXplX3QgQ3VybF9taW1lX3JlYWQoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5pdGVtcywKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICppbnN0cmVhbSk7CitDVVJMY29kZSBDdXJsX21pbWVfcmV3aW5kKGN1cmxfbWltZXBhcnQgKnBhcnQpOworQ1VSTGNvZGUgQ3VybF9taW1lX2FkZF9oZWFkZXIoc3RydWN0IGN1cmxfc2xpc3QgKipzbHAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKworI2VuZGlmIC8qIEhFQURFUl9DVVJMX01JTUVfSCAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvbXByaW50Zi5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvbXByaW50Zi5jCmluZGV4IGViN2VlMGMuLmQyZDkxZDcgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL21wcmludGYuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9tcHJpbnRmLmMKQEAgLTQ2LDEwICs0Niw2IEBACiAgKiBJZiBTSVpFT0ZfU0laRV9UIGhhcyBub3QgYmVlbiBkZWZpbmVkLCBkZWZhdWx0IHRvIHRoZSBzaXplIG9mIGxvbmcuCiAgKi8KIAotI2lmbmRlZiBTSVpFT0ZfU0laRV9UCi0jICBkZWZpbmUgU0laRU9GX1NJWkVfVCBDVVJMX1NJWkVPRl9MT05HCi0jZW5kaWYKLQogI2lmZGVmIEhBVkVfTE9OR0xPTkcKICMgIGRlZmluZSBMT05HX0xPTkdfVFlQRSBsb25nIGxvbmcKICMgIGRlZmluZSBIQVZFX0xPTkdfTE9OR19UWVBFCkBAIC0xMTEsNyArMTA3LDcgQEAKICAgfSBXSElMRV9GQUxTRQogCiAvKiBEYXRhIHR5cGUgdG8gcmVhZCBmcm9tIHRoZSBhcmdsaXN0ICovCi10eXBlZGVmIGVudW0gIHsKK3R5cGVkZWYgZW51bSB7CiAgIEZPUk1BVF9VTktOT1dOID0gMCwKICAgRk9STUFUX1NUUklORywKICAgRk9STUFUX1BUUiwKQEAgLTE4MSw3ICsxNzcsNyBAQAogCiBzdGF0aWMgbG9uZyBkcHJpbnRmX0RvbGxhclN0cmluZyhjaGFyICppbnB1dCwgY2hhciAqKmVuZCkKIHsKLSAgaW50IG51bWJlcj0wOworICBpbnQgbnVtYmVyID0gMDsKICAgd2hpbGUoSVNESUdJVCgqaW5wdXQpKSB7CiAgICAgbnVtYmVyICo9IDEwOwogICAgIG51bWJlciArPSAqaW5wdXQtJzAnOwpAQCAtMjM3LDcgKzIzMyw3IEBACiAgIGxvbmcgd2lkdGg7CiAgIGxvbmcgcHJlY2lzaW9uOwogICBpbnQgZmxhZ3M7Ci0gIGxvbmcgbWF4X3BhcmFtPTA7CisgIGxvbmcgbWF4X3BhcmFtID0gMDsKICAgbG9uZyBpOwogCiAgIHdoaWxlKCpmbXQpIHsKQEAgLTMyNiw3ICszMjIsNyBAQAogICAgICAgICAgIGJyZWFrOwogI2lmIGRlZmluZWQoTVBfSEFWRV9JTlRfRVhURU5TSU9OUykKICAgICAgICAgY2FzZSAnSSc6Ci0jaWYgKENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgPiBDVVJMX1NJWkVPRl9MT05HKQorI2lmIChTSVpFT0ZfQ1VSTF9PRkZfVCA+IFNJWkVPRl9MT05HKQogICAgICAgICAgIGZsYWdzIHw9IEZMQUdTX0xPTkdMT05HOwogI2Vsc2UKICAgICAgICAgICBmbGFncyB8PSBGTEFHU19MT05HOwpAQCAtMzQ4LDE0ICszNDQsMTQgQEAKICAgICAgICAgY2FzZSAneic6CiAgICAgICAgICAgLyogdGhlIGNvZGUgYmVsb3cgZ2VuZXJhdGVzIGEgd2FybmluZyBpZiAtV3VucmVhY2hhYmxlLWNvZGUgaXMKICAgICAgICAgICAgICB1c2VkICovCi0jaWYgKFNJWkVPRl9TSVpFX1QgPiBDVVJMX1NJWkVPRl9MT05HKQorI2lmIChTSVpFT0ZfU0laRV9UID4gU0laRU9GX0xPTkcpCiAgICAgICAgICAgZmxhZ3MgfD0gRkxBR1NfTE9OR0xPTkc7CiAjZWxzZQogICAgICAgICAgIGZsYWdzIHw9IEZMQUdTX0xPTkc7CiAjZW5kaWYKICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAnTyc6Ci0jaWYgKENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgPiBDVVJMX1NJWkVPRl9MT05HKQorI2lmIChTSVpFT0ZfQ1VSTF9PRkZfVCA+IFNJWkVPRl9MT05HKQogICAgICAgICAgIGZsYWdzIHw9IEZMQUdTX0xPTkdMT05HOwogI2Vsc2UKICAgICAgICAgICBmbGFncyB8PSBGTEFHU19MT05HOwpAQCAtMzgwLDcgKzM3Niw3IEBACiAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgd2lkdGggPSBwYXJhbV9udW07CiAgICAgICAgICAgaWYod2lkdGggPiBtYXhfcGFyYW0pCi0gICAgICAgICAgICBtYXhfcGFyYW09d2lkdGg7CisgICAgICAgICAgICBtYXhfcGFyYW0gPSB3aWR0aDsKICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICBicmVhazsKQEAgLTQ4Niw3ICs0ODIsNyBAQAogICB9CiAKICAgLyogUmVhZCB0aGUgYXJnIGxpc3QgcGFyYW1ldGVycyBpbnRvIG91ciBkYXRhIGxpc3QgKi8KLSAgZm9yKGk9MDsgaTxtYXhfcGFyYW07IGkrKykgeworICBmb3IoaSA9IDA7IGk8bWF4X3BhcmFtOyBpKyspIHsKICAgICAvKiBXaWR0aC9wcmVjaXNpb24gYXJndW1lbnRzIG11c3QgYmUgcmVhZCBiZWZvcmUgdGhlIG1haW4gYXJndW1lbnQKICAgICAgICB0aGV5IGFyZSBhdHRhY2hlZCB0byAqLwogICAgIGlmKHZ0b1tpXS5mbGFncyAmIEZMQUdTX1dJRFRIUEFSQU0pIHsKQEAgLTU3Myw3ICs1NjksNyBAQAogICBpbnQgZG9uZSA9IDA7CiAKICAgbG9uZyBwYXJhbTsgLyogY3VycmVudCBwYXJhbWV0ZXIgdG8gcmVhZCAqLwotICBsb25nIHBhcmFtX251bT0wOyAvKiBwYXJhbWV0ZXIgY291bnRlciAqLworICBsb25nIHBhcmFtX251bSA9IDA7IC8qIHBhcmFtZXRlciBjb3VudGVyICovCiAKICAgdmFfc3RhY2tfdCB2dG9bTUFYX1BBUkFNRVRFUlNdOwogICBjaGFyICplbmRwb3NbTUFYX1BBUkFNRVRFUlNdOwpAQCAtNjQzLDcgKzYzOSw3IEBACiAKICAgICAvKiBJZiB0aGlzIGlzIGEgcG9zaXRpb25hbCBwYXJhbWV0ZXIsIHRoZSBwb3NpdGlvbiBtdXN0IGZvbGxvdyBpbW1lZGlhdGVseQogICAgICAgIGFmdGVyIHRoZSAlLCB0aHVzIGNyZWF0ZSBhICU8bnVtPiQgc2VxdWVuY2UgKi8KLSAgICBwYXJhbT1kcHJpbnRmX0RvbGxhclN0cmluZyhmLCAmZik7CisgICAgcGFyYW0gPSBkcHJpbnRmX0RvbGxhclN0cmluZyhmLCAmZik7CiAKICAgICBpZighcGFyYW0pCiAgICAgICBwYXJhbSA9IHBhcmFtX251bTsKQEAgLTk1Miw3ICs5NDgsNyBAQAogICAgICAgICAgICBvdXRwdXQgY2hhcmFjdGVycyAqLwogICAgICAgICAoc3ByaW50Zikod29yaywgZm9ybWF0YnVmLCBwLT5kYXRhLmRudW0pOwogICAgICAgICBERUJVR0FTU0VSVChzdHJsZW4od29yaykgPD0gc2l6ZW9mKHdvcmspKTsKLSAgICAgICAgZm9yKGZwdHI9d29yazsgKmZwdHI7IGZwdHIrKykKKyAgICAgICAgZm9yKGZwdHIgPSB3b3JrOyAqZnB0cjsgZnB0cisrKQogICAgICAgICAgIE9VVENIQVIoKmZwdHIpOwogICAgICAgfQogICAgICAgYnJlYWs7CkBAIC05ODQsNyArOTgwLDcgQEAKIC8qIGZwdXRjKCkgbG9vay1hbGlrZSAqLwogc3RhdGljIGludCBhZGRieXRlcihpbnQgb3V0cHV0LCBGSUxFICpkYXRhKQogewotICBzdHJ1Y3QgbnNwcmludGYgKmluZm9wPShzdHJ1Y3QgbnNwcmludGYgKilkYXRhOworICBzdHJ1Y3QgbnNwcmludGYgKmluZm9wID0gKHN0cnVjdCBuc3ByaW50ZiAqKWRhdGE7CiAgIHVuc2lnbmVkIGNoYXIgb3V0YyA9ICh1bnNpZ25lZCBjaGFyKW91dHB1dDsKIAogICBpZihpbmZvcC0+bGVuZ3RoIDwgaW5mb3AtPm1heCkgewpAQCAtMTAzMiw3ICsxMDI4LDcgQEAKIC8qIGZwdXRjKCkgbG9vay1hbGlrZSAqLwogc3RhdGljIGludCBhbGxvY19hZGRieXRlcihpbnQgb3V0cHV0LCBGSUxFICpkYXRhKQogewotICBzdHJ1Y3QgYXNwcmludGYgKmluZm9wPShzdHJ1Y3QgYXNwcmludGYgKilkYXRhOworICBzdHJ1Y3QgYXNwcmludGYgKmluZm9wID0gKHN0cnVjdCBhc3ByaW50ZiAqKWRhdGE7CiAgIHVuc2lnbmVkIGNoYXIgb3V0YyA9ICh1bnNpZ25lZCBjaGFyKW91dHB1dDsKIAogICBpZighaW5mb3AtPmJ1ZmZlcikgewpAQCAtMTA0Miw5ICsxMDM4LDkgQEAKICAgICAgIHJldHVybiAtMTsgLyogZmFpbCAqLwogICAgIH0KICAgICBpbmZvcC0+YWxsb2MgPSAzMjsKLSAgICBpbmZvcC0+bGVuID0wOworICAgIGluZm9wLT5sZW4gPSAwOwogICB9Ci0gIGVsc2UgaWYoaW5mb3AtPmxlbisxID49IGluZm9wLT5hbGxvYykgeworICBlbHNlIGlmKGluZm9wLT5sZW4gKyAxID49IGluZm9wLT5hbGxvYykgewogICAgIGNoYXIgKm5ld3B0ciA9IE5VTEw7CiAgICAgc2l6ZV90IG5ld3NpemUgPSBpbmZvcC0+YWxsb2MqMjsKIApAQCAtMTEzMyw3ICsxMTI5LDcgQEAKICAgdmFfc3RhcnQoYXBfc2F2ZSwgZm9ybWF0KTsKICAgcmV0Y29kZSA9IGRwcmludGZfZm9ybWF0ZigmYnVmZmVyLCBzdG9yZWJ1ZmZlciwgZm9ybWF0LCBhcF9zYXZlKTsKICAgdmFfZW5kKGFwX3NhdmUpOwotICAqYnVmZmVyPTA7IC8qIHdlIHRlcm1pbmF0ZSB0aGlzIHdpdGggYSB6ZXJvIGJ5dGUgKi8KKyAgKmJ1ZmZlciA9IDA7IC8qIHdlIHRlcm1pbmF0ZSB0aGlzIHdpdGggYSB6ZXJvIGJ5dGUgKi8KICAgcmV0dXJuIHJldGNvZGU7CiB9CiAKQEAgLTExNjIsNyArMTE1OCw3IEBACiB7CiAgIGludCByZXRjb2RlOwogICByZXRjb2RlID0gZHByaW50Zl9mb3JtYXRmKCZidWZmZXIsIHN0b3JlYnVmZmVyLCBmb3JtYXQsIGFwX3NhdmUpOwotICAqYnVmZmVyPTA7IC8qIHdlIHRlcm1pbmF0ZSB0aGlzIHdpdGggYSB6ZXJvIGJ5dGUgKi8KKyAgKmJ1ZmZlciA9IDA7IC8qIHdlIHRlcm1pbmF0ZSB0aGlzIHdpdGggYSB6ZXJvIGJ5dGUgKi8KICAgcmV0dXJuIHJldGNvZGU7CiB9CiAKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL211bHRpLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9tdWx0aS5jCmluZGV4IGMzYTBkMTIuLjcwYWE2YmMgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL211bHRpLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvbXVsdGkuYwpAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUgInNpZ3BpcGUuaCIKICNpbmNsdWRlICJ2dGxzL3Z0bHMuaCIKICNpbmNsdWRlICJjb25uZWN0LmgiCisjaW5jbHVkZSAiaHR0cF9wcm94eS5oIgogLyogVGhlIGxhc3QgMyAjaW5jbHVkZSBmaWxlcyBzaG91bGQgYmUgaW4gdGhpcyBvcmRlciAqLwogI2luY2x1ZGUgImN1cmxfcHJpbnRmLmgiCiAjaW5jbHVkZSAiY3VybF9tZW1vcnkuaCIKQEAgLTY5LDcgKzcwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKTsKIHN0YXRpYyBpbnQgdXBkYXRlX3RpbWVyKHN0cnVjdCBDdXJsX211bHRpICptdWx0aSk7CiAKLXN0YXRpYyBDVVJMTWNvZGUgYWRkX25leHRfdGltZW91dChzdHJ1Y3QgdGltZXZhbCBub3csCitzdGF0aWMgQ1VSTE1jb2RlIGFkZF9uZXh0X3RpbWVvdXQoc3RydWN0IGN1cmx0aW1lIG5vdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF9tdWx0aSAqbXVsdGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEN1cmxfZWFzeSAqZCk7CiBzdGF0aWMgQ1VSTE1jb2RlIG11bHRpX3RpbWVvdXQoc3RydWN0IEN1cmxfbXVsdGkgKm11bHRpLApAQCAtMTE0LDYgKzExNSwxMyBAQAogICAgIE5VTEwsCiAgICAgTlVMTCwKICAgICBDdXJsX2luaXRfQ09OTkVDVCwgLyogQ09OTkVDVCAqLworICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIEN1cmxfY29ubmVjdF9mcmVlIC8qIERPICovCiAgICAgLyogdGhlIHJlc3QgaXMgTlVMTCB0b28gKi8KICAgfTsKIApAQCAtNTg0LDcgKzU5Miw3IEBACiAKICAgLyogaWYgdGhlIHRyYW5zZmVyIHdhcyBjb21wbGV0ZWQgaW4gYSBwYXVzZWQgc3RhdGUgdGhlcmUgY2FuIGJlIGJ1ZmZlcmVkCiAgICAgIGRhdGEgbGVmdCB0byBmcmVlICovCi0gIGZvcihpPTA7IGkgPCBkYXRhLT5zdGF0ZS50ZW1wY291bnQ7IGkrKykgeworICBmb3IoaSA9IDA7IGkgPCBkYXRhLT5zdGF0ZS50ZW1wY291bnQ7IGkrKykgewogICAgIGZyZWUoZGF0YS0+c3RhdGUudGVtcHdyaXRlW2ldLmJ1Zik7CiAgIH0KICAgZGF0YS0+c3RhdGUudGVtcGNvdW50ID0gMDsKQEAgLTc5NCw4ICs4MDIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1zb2NrcykKIHsKICAgaW50IGk7Ci0gIGludCBzPTA7Ci0gIGludCByYz0wOworICBpbnQgcyA9IDA7CisgIGludCByYyA9IDA7CiAKICAgaWYoIW51bXNvY2tzKQogICAgIHJldHVybiBHRVRTT0NLX0JMQU5LOwpAQCAtODA1LDcgKzgxMyw3IEBACiAgICAgcmV0dXJuIEN1cmxfc3NsX2dldHNvY2soY29ubiwgc29jaywgbnVtc29ja3MpOwogI2VuZGlmCiAKLSAgZm9yKGk9MDsgaTwyOyBpKyspIHsKKyAgZm9yKGkgPSAwOyBpPDI7IGkrKykgewogICAgIGlmKGNvbm4tPnRlbXBzb2NrW2ldICE9IENVUkxfU09DS0VUX0JBRCkgewogICAgICAgc29ja1tzXSA9IGNvbm4tPnRlbXBzb2NrW2ldOwogICAgICAgcmMgfD0gR0VUU09DS19XUklURVNPQ0socysrKTsKQEAgLTgyNiw3ICs4MzQsNyBAQAogCiAgIC8qIHdoZW4gd2UndmUgc2VudCBhIENPTk5FQ1QgdG8gYSBwcm94eSwgd2Ugc2hvdWxkIHJhdGhlciB3YWl0IGZvciB0aGUKICAgICAgc29ja2V0IHRvIGJlY29tZSByZWFkYWJsZSB0byBiZSBhYmxlIHRvIGdldCB0aGUgcmVzcG9uc2UgaGVhZGVycyAqLwotICBpZihjb25uLT50dW5uZWxfc3RhdGVbRklSU1RTT0NLRVRdID09IFRVTk5FTF9DT05ORUNUKQorICBpZihjb25uLT5jb25uZWN0X3N0YXRlKQogICAgIHJldHVybiBHRVRTT0NLX1JFQURTT0NLKDApOwogCiAgIHJldHVybiBHRVRTT0NLX1dSSVRFU09DSygwKTsKQEAgLTkxNiw3ICs5MjQsNyBAQAogICAgICBTb21lIGVhc3kgaGFuZGxlcyBtYXkgbm90IGhhdmUgY29ubmVjdGVkIHRvIHRoZSByZW1vdGUgaG9zdCB5ZXQsCiAgICAgIGFuZCB0aGVuIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgaXMgZG9uZS4gKi8KICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YTsKLSAgaW50IHRoaXNfbWF4X2ZkPS0xOworICBpbnQgdGhpc19tYXhfZmQgPSAtMTsKICAgY3VybF9zb2NrZXRfdCBzb2NrYnVuY2hbTUFYX1NPQ0tTUEVSRUFTWUhBTkRMRV07CiAgIGludCBiaXRtYXA7CiAgIGludCBpOwpAQCAtOTI1LDExICs5MzMsMTEgQEAKICAgaWYoIUdPT0RfTVVMVElfSEFORExFKG11bHRpKSkKICAgICByZXR1cm4gQ1VSTE1fQkFEX0hBTkRMRTsKIAotICBkYXRhPW11bHRpLT5lYXN5cDsKKyAgZGF0YSA9IG11bHRpLT5lYXN5cDsKICAgd2hpbGUoZGF0YSkgewogICAgIGJpdG1hcCA9IG11bHRpX2dldHNvY2soZGF0YSwgc29ja2J1bmNoLCBNQVhfU09DS1NQRVJFQVNZSEFORExFKTsKIAotICAgIGZvcihpPTA7IGk8IE1BWF9TT0NLU1BFUkVBU1lIQU5ETEU7IGkrKykgeworICAgIGZvcihpID0gMDsgaTwgTUFYX1NPQ0tTUEVSRUFTWUhBTkRMRTsgaSsrKSB7CiAgICAgICBjdXJsX3NvY2tldF90IHMgPSBDVVJMX1NPQ0tFVF9CQUQ7CiAKICAgICAgIGlmKChiaXRtYXAgJiBHRVRTT0NLX1JFQURTT0NLKGkpKSAmJiBWQUxJRF9TT0NLKChzb2NrYnVuY2hbaV0pKSkgewpAQCAtOTg2LDExICs5OTQsMTEgQEAKICAgICB0aW1lb3V0X21zID0gKGludCl0aW1lb3V0X2ludGVybmFsOwogCiAgIC8qIENvdW50IHVwIGhvdyBtYW55IGZkcyB3ZSBoYXZlIGZyb20gdGhlIG11bHRpIGhhbmRsZSAqLwotICBkYXRhPW11bHRpLT5lYXN5cDsKKyAgZGF0YSA9IG11bHRpLT5lYXN5cDsKICAgd2hpbGUoZGF0YSkgewogICAgIGJpdG1hcCA9IG11bHRpX2dldHNvY2soZGF0YSwgc29ja2J1bmNoLCBNQVhfU09DS1NQRVJFQVNZSEFORExFKTsKIAotICAgIGZvcihpPTA7IGk8IE1BWF9TT0NLU1BFUkVBU1lIQU5ETEU7IGkrKykgeworICAgIGZvcihpID0gMDsgaTwgTUFYX1NPQ0tTUEVSRUFTWUhBTkRMRTsgaSsrKSB7CiAgICAgICBjdXJsX3NvY2tldF90IHMgPSBDVVJMX1NPQ0tFVF9CQUQ7CiAKICAgICAgIGlmKGJpdG1hcCAmIEdFVFNPQ0tfUkVBRFNPQ0soaSkpIHsKQEAgLTEwMTQsNiArMTAyMiwxMCBAQAogCiAgIGlmKG5mZHMpIHsKICAgICBpZihuZmRzID4gTlVNX1BPTExTX09OX1NUQUNLKSB7CisgICAgICAvKiAnbmZkcycgaXMgYSAzMiBiaXQgdmFsdWUgYW5kICdzdHJ1Y3QgcG9sbGZkJyBpcyB0eXBpY2FsbHkgOCBieXRlcworICAgICAgICAgYmlnLCBzbyBhdCAyXjI5IHNvY2tldHMgdGhpcyB2YWx1ZSBtaWdodCB3cmFwLiBXaGVuIGEgcHJvY2VzcyBnZXRzCisgICAgICAgICB0aGUgY2FwYWJpbGl0eSB0byBhY3R1YWxseSBoYW5kbGUgb3ZlciA1MDAgbWlsbGlvbiBzb2NrZXRzIHRoaXMKKyAgICAgICAgIGNhbGN1bGF0aW9uIG5lZWRzIGEgaW50ZWdlciBvdmVyZmxvdyBjaGVjay4gKi8KICAgICAgIHVmZHMgPSBtYWxsb2MobmZkcyAqIHNpemVvZihzdHJ1Y3QgcG9sbGZkKSk7CiAgICAgICBpZighdWZkcykKICAgICAgICAgcmV0dXJuIENVUkxNX09VVF9PRl9NRU1PUlk7CkBAIC0xMDI5LDExICsxMDQxLDExIEBACiAKICAgaWYoY3VybGZkcykgewogICAgIC8qIEFkZCB0aGUgY3VybCBoYW5kbGVzIHRvIG91ciBwb2xsZmRzIGZpcnN0ICovCi0gICAgZGF0YT1tdWx0aS0+ZWFzeXA7CisgICAgZGF0YSA9IG11bHRpLT5lYXN5cDsKICAgICB3aGlsZShkYXRhKSB7CiAgICAgICBiaXRtYXAgPSBtdWx0aV9nZXRzb2NrKGRhdGEsIHNvY2tidW5jaCwgTUFYX1NPQ0tTUEVSRUFTWUhBTkRMRSk7CiAKLSAgICAgIGZvcihpPTA7IGk8IE1BWF9TT0NLU1BFUkVBU1lIQU5ETEU7IGkrKykgeworICAgICAgZm9yKGkgPSAwOyBpPCBNQVhfU09DS1NQRVJFQVNZSEFORExFOyBpKyspIHsKICAgICAgICAgY3VybF9zb2NrZXRfdCBzID0gQ1VSTF9TT0NLRVRfQkFEOwogCiAgICAgICAgIGlmKGJpdG1hcCAmIEdFVFNPQ0tfUkVBRFNPQ0soaSkpIHsKQEAgLTEyMTcsMTUgKzEyMjksMTUgQEAKICAqLwogc3RhdGljIHZvaWQgZG9fY29tcGxldGUoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKQogewotICBjb25uLT5kYXRhLT5yZXEuY2h1bms9RkFMU0U7CisgIGNvbm4tPmRhdGEtPnJlcS5jaHVuayA9IEZBTFNFOwogICBjb25uLT5kYXRhLT5yZXEubWF4ZmQgPSAoY29ubi0+c29ja2ZkPmNvbm4tPndyaXRlc29ja2ZkPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubi0+c29ja2ZkOmNvbm4tPndyaXRlc29ja2ZkKSsxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubi0+c29ja2ZkOmNvbm4tPndyaXRlc29ja2ZkKSArIDE7CiAgIEN1cmxfcGdyc1RpbWUoY29ubi0+ZGF0YSwgVElNRVJfUFJFVFJBTlNGRVIpOwogfQogCiBzdGF0aWMgQ1VSTGNvZGUgbXVsdGlfZG8oc3RydWN0IGNvbm5lY3RkYXRhICoqY29ubnAsIGJvb2wgKmRvbmUpCiB7Ci0gIENVUkxjb2RlIHJlc3VsdD1DVVJMRV9PSzsKKyAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7CiAgIHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiA9ICpjb25ucDsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAKQEAgLTEyNzQsNyArMTI4Niw3IEBACiAKIHN0YXRpYyBDVVJMY29kZSBtdWx0aV9kb19tb3JlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50ICpjb21wbGV0ZSkKIHsKLSAgQ1VSTGNvZGUgcmVzdWx0PUNVUkxFX09LOworICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKIAogICAqY29tcGxldGUgPSAwOwogCkBAIC0xMjg5LDcgKzEzMDEsNyBAQAogfQogCiBzdGF0aWMgQ1VSTE1jb2RlIG11bHRpX3J1bnNpbmdsZShzdHJ1Y3QgQ3VybF9tdWx0aSAqbXVsdGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCBub3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY3VybHRpbWUgbm93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKIHsKICAgc3RydWN0IEN1cmxfbWVzc2FnZSAqbXNnID0gTlVMTDsKQEAgLTE0MDMsNyArMTQxNSw3IEBACiAgICAgc3dpdGNoKGRhdGEtPm1zdGF0ZSkgewogICAgIGNhc2UgQ1VSTE1fU1RBVEVfSU5JVDoKICAgICAgIC8qIGluaXQgdGhpcyB0cmFuc2Zlci4gKi8KLSAgICAgIHJlc3VsdD1DdXJsX3ByZXRyYW5zZmVyKGRhdGEpOworICAgICAgcmVzdWx0ID0gQ3VybF9wcmV0cmFuc2ZlcihkYXRhKTsKIAogICAgICAgaWYoIXJlc3VsdCkgewogICAgICAgICAvKiBhZnRlciBpbml0LCBnbyBDT05ORUNUICovCkBAIC0xNDU1LDcgKzE0NjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxNX1NUQVRFX1dBSVRETzpDVVJMTV9TVEFURV9ETyk7CiAgICAgICAgICAgICBlbHNlIHsKICNpZm5kZWYgQ1VSTF9ESVNBQkxFX0hUVFAKLSAgICAgICAgICAgICAgaWYoZGF0YS0+ZWFzeV9jb25uLT50dW5uZWxfc3RhdGVbRklSU1RTT0NLRVRdID09IFRVTk5FTF9DT05ORUNUKQorICAgICAgICAgICAgICBpZihDdXJsX2Nvbm5lY3Rfb25nb2luZyhkYXRhLT5lYXN5X2Nvbm4pKQogICAgICAgICAgICAgICAgIG11bHRpc3RhdGUoZGF0YSwgQ1VSTE1fU1RBVEVfV0FJVFBST1hZQ09OTkVDVCk7CiAgICAgICAgICAgICAgIGVsc2UKICNlbmRpZgpAQCAtMTUyMCw3ICsxNTMyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE1fU1RBVEVfV0FJVERPOkNVUkxNX1NUQVRFX0RPKTsKICAgICAgICAgICBlbHNlIHsKICNpZm5kZWYgQ1VSTF9ESVNBQkxFX0hUVFAKLSAgICAgICAgICAgIGlmKGRhdGEtPmVhc3lfY29ubi0+dHVubmVsX3N0YXRlW0ZJUlNUU09DS0VUXSA9PSBUVU5ORUxfQ09OTkVDVCkKKyAgICAgICAgICAgIGlmKEN1cmxfY29ubmVjdF9vbmdvaW5nKGRhdGEtPmVhc3lfY29ubikpCiAgICAgICAgICAgICAgIG11bHRpc3RhdGUoZGF0YSwgQ1VSTE1fU1RBVEVfV0FJVFBST1hZQ09OTkVDVCk7CiAgICAgICAgICAgICBlbHNlCiAjZW5kaWYKQEAgLTE1NTIsNyArMTU2NCw3IEBACiAgICAgICBlbHNlIGlmKCFyZXN1bHQpIHsKICAgICAgICAgaWYoKGRhdGEtPmVhc3lfY29ubi0+aHR0cF9wcm94eS5wcm94eXR5cGUgIT0gQ1VSTFBST1hZX0hUVFBTIHx8CiAgICAgICAgICAgIGRhdGEtPmVhc3lfY29ubi0+Yml0cy5wcm94eV9zc2xfY29ubmVjdGVkW0ZJUlNUU09DS0VUXSkgJiYKLSAgICAgICAgICAgKGRhdGEtPmVhc3lfY29ubi0+dHVubmVsX3N0YXRlW0ZJUlNUU09DS0VUXSAhPSBUVU5ORUxfQ09OTkVDVCkpIHsKKyAgICAgICAgICAgQ3VybF9jb25uZWN0X2NvbXBsZXRlKGRhdGEtPmVhc3lfY29ubikpIHsKICAgICAgICAgICByYyA9IENVUkxNX0NBTExfTVVMVElfUEVSRk9STTsKICAgICAgICAgICAvKiBpbml0aWF0ZSBwcm90b2NvbCBjb25uZWN0IHBoYXNlICovCiAgICAgICAgICAgbXVsdGlzdGF0ZShkYXRhLCBDVVJMTV9TVEFURV9TRU5EUFJPVE9DT05ORUNUKTsKQEAgLTE1NjgsNyArMTU4MCw3IEBACiAjaWZuZGVmIENVUkxfRElTQUJMRV9IVFRQCiAgICAgICAgIGlmKChkYXRhLT5lYXN5X2Nvbm4tPmh0dHBfcHJveHkucHJveHl0eXBlID09IENVUkxQUk9YWV9IVFRQUyAmJgogICAgICAgICAgICAgIWRhdGEtPmVhc3lfY29ubi0+Yml0cy5wcm94eV9zc2xfY29ubmVjdGVkW0ZJUlNUU09DS0VUXSkgfHwKLSAgICAgICAgICAgIChkYXRhLT5lYXN5X2Nvbm4tPnR1bm5lbF9zdGF0ZVtGSVJTVFNPQ0tFVF0gPT0gVFVOTkVMX0NPTk5FQ1QpKSB7CisgICAgICAgICAgIEN1cmxfY29ubmVjdF9vbmdvaW5nKGRhdGEtPmVhc3lfY29ubikpIHsKICAgICAgICAgICBtdWx0aXN0YXRlKGRhdGEsIENVUkxNX1NUQVRFX1dBSVRQUk9YWUNPTk5FQ1QpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNjg1LDcgKzE2OTcsNyBAQAogICAgICAgICAgICAqIGJhY2sgdG8gdGhlIENPTk5FQ1QgcGhhc2Ugc28gd2UgY2FuIHRyeSBhZ2Fpbi4KICAgICAgICAgICAgKi8KICAgICAgICAgICBjaGFyICpuZXd1cmwgPSBOVUxMOwotICAgICAgICAgIGZvbGxvd3R5cGUgZm9sbG93PUZPTExPV19OT05FOworICAgICAgICAgIGZvbGxvd3R5cGUgZm9sbG93ID0gRk9MTE9XX05PTkU7CiAgICAgICAgICAgQ1VSTGNvZGUgZHJjOwogICAgICAgICAgIGJvb2wgcmV0cnkgPSBGQUxTRTsKIApAQCAtMTc3MSw3ICsxNzgzLDcgQEAKICAgICAgICAgaWYoY29udHJvbCkgewogICAgICAgICAgIC8qIGlmIHBvc2l0aXZlLCBhZHZhbmNlIHRvIERPX0RPTkUKICAgICAgICAgICAgICBpZiBuZWdhdGl2ZSwgZ28gYmFjayB0byBET0lORyAqLwotICAgICAgICAgIG11bHRpc3RhdGUoZGF0YSwgY29udHJvbD09MT8KKyAgICAgICAgICBtdWx0aXN0YXRlKGRhdGEsIGNvbnRyb2wgPT0gMT8KICAgICAgICAgICAgICAgICAgICAgIENVUkxNX1NUQVRFX0RPX0RPTkU6CiAgICAgICAgICAgICAgICAgICAgICBDVVJMTV9TVEFURV9ET0lORyk7CiAgICAgICAgICAgcmMgPSBDVVJMTV9DQUxMX01VTFRJX1BFUkZPUk07CkBAIC0xOTI2LDcgKzE5MzgsNyBAQAogICAgICAgICBtdWx0aV9kb25lKCZkYXRhLT5lYXN5X2Nvbm4sIHJlc3VsdCwgVFJVRSk7CiAgICAgICB9CiAgICAgICBlbHNlIGlmKGRvbmUpIHsKLSAgICAgICAgZm9sbG93dHlwZSBmb2xsb3c9Rk9MTE9XX05PTkU7CisgICAgICAgIGZvbGxvd3R5cGUgZm9sbG93ID0gRk9MTE9XX05PTkU7CiAKICAgICAgICAgLyogY2FsbCB0aGlzIGV2ZW4gaWYgdGhlIHJlYWR3cml0ZSBmdW5jdGlvbiByZXR1cm5lZCBlcnJvciAqLwogICAgICAgICBDdXJsX3Bvc3R0cmFuc2ZlcihkYXRhKTsKQEAgLTIxMzIsMTQgKzIxNDQsMTQgQEAKIENVUkxNY29kZSBjdXJsX211bHRpX3BlcmZvcm0oc3RydWN0IEN1cmxfbXVsdGkgKm11bHRpLCBpbnQgKnJ1bm5pbmdfaGFuZGxlcykKIHsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YTsKLSAgQ1VSTE1jb2RlIHJldHVybmNvZGU9Q1VSTE1fT0s7CisgIENVUkxNY29kZSByZXR1cm5jb2RlID0gQ1VSTE1fT0s7CiAgIHN0cnVjdCBDdXJsX3RyZWUgKnQ7Ci0gIHN0cnVjdCB0aW1ldmFsIG5vdyA9IEN1cmxfdHZub3coKTsKKyAgc3RydWN0IGN1cmx0aW1lIG5vdyA9IEN1cmxfdHZub3coKTsKIAogICBpZighR09PRF9NVUxUSV9IQU5ETEUobXVsdGkpKQogICAgIHJldHVybiBDVVJMTV9CQURfSEFORExFOwogCi0gIGRhdGE9bXVsdGktPmVhc3lwOworICBkYXRhID0gbXVsdGktPmVhc3lwOwogICB3aGlsZShkYXRhKSB7CiAgICAgQ1VSTE1jb2RlIHJlc3VsdDsKICAgICBTSUdQSVBFX1ZBUklBQkxFKHBpcGVfc3QpOwpAQCAtMjIzNCw3ICsyMjQ2LDcgQEAKICAgICAvKiByZW1vdmUgYWxsIGVhc3kgaGFuZGxlcyAqLwogICAgIGRhdGEgPSBtdWx0aS0+ZWFzeXA7CiAgICAgd2hpbGUoZGF0YSkgewotICAgICAgbmV4dGRhdGE9ZGF0YS0+bmV4dDsKKyAgICAgIG5leHRkYXRhID0gZGF0YS0+bmV4dDsKICAgICAgIGlmKGRhdGEtPmRucy5ob3N0Y2FjaGV0eXBlID09IEhDQUNIRV9NVUxUSSkgewogICAgICAgICAvKiBjbGVhciBvdXQgdGhlIHVzYWdlIG9mIHRoZSBzaGFyZWQgRE5TIGNhY2hlICovCiAgICAgICAgIEN1cmxfaG9zdGNhY2hlX2NsZWFuKGRhdGEsIGRhdGEtPmRucy5ob3N0Y2FjaGUpOwpAQCAtMjMxNCw3ICsyMzI2LDcgQEAKICAgaW50IG51bTsKICAgdW5zaWduZWQgaW50IGN1cnJhY3Rpb247CiAKLSAgZm9yKGk9MDsgaTwgTUFYX1NPQ0tTUEVSRUFTWUhBTkRMRTsgaSsrKQorICBmb3IoaSA9IDA7IGk8IE1BWF9TT0NLU1BFUkVBU1lIQU5ETEU7IGkrKykKICAgICBzb2Nrc1tpXSA9IENVUkxfU09DS0VUX0JBRDsKIAogICAvKiBGaWxsIGluIHRoZSAnY3VycmVudCcgc3RydWN0IHdpdGggdGhlIHN0YXRlIGFzIGl0IGlzIG5vdzogd2hhdCBzb2NrZXRzIHRvCkBAIC0yMzI2LDcgKzIzMzgsNyBAQAogICAgICBsb25nZXIgc3VwZXJ2aXNlZCBvbmVzIGFuZCBhZGQgbmV3IG9uZXMgKi8KIAogICAvKiB3YWxrIG92ZXIgdGhlIHNvY2tldHMgd2UgZ290IHJpZ2h0IG5vdyAqLwotICBmb3IoaT0wOyAoaTwgTUFYX1NPQ0tTUEVSRUFTWUhBTkRMRSkgJiYKKyAgZm9yKGkgPSAwOyAoaTwgTUFYX1NPQ0tTUEVSRUFTWUhBTkRMRSkgJiYKICAgICAgICAgKGN1cnJhY3Rpb24gJiAoR0VUU09DS19SRUFEU09DSyhpKSB8IEdFVFNPQ0tfV1JJVEVTT0NLKGkpKSk7CiAgICAgICBpKyspIHsKICAgICBpbnQgYWN0aW9uID0gQ1VSTF9QT0xMX05PTkU7CkBAIC0yMzcwLDEwICsyMzgyLDEwIEBACiAKICAgLyogd2hlbiB3ZSd2ZSB3YWxrZWQgb3ZlciBhbGwgdGhlIHNvY2tldHMgd2Ugc2hvdWxkIGhhdmUgcmlnaHQgbm93LCB3ZSBtdXN0CiAgICAgIG1ha2Ugc3VyZSB0byBkZXRlY3Qgc29ja2V0cyB0aGF0IGFyZSByZW1vdmVkICovCi0gIGZvcihpPTA7IGk8IGRhdGEtPm51bXNvY2tzOyBpKyspIHsKKyAgZm9yKGkgPSAwOyBpPCBkYXRhLT5udW1zb2NrczsgaSsrKSB7CiAgICAgaW50IGo7CiAgICAgcyA9IGRhdGEtPnNvY2tldHNbaV07Ci0gICAgZm9yKGo9MDsgajxudW07IGorKykgeworICAgIGZvcihqID0gMDsgajxudW07IGorKykgewogICAgICAgaWYocyA9PSBzb2Nrc1tqXSkgewogICAgICAgICAvKiB0aGlzIGlzIHN0aWxsIHN1cGVydmlzZWQgKi8KICAgICAgICAgcyA9IENVUkxfU09DS0VUX0JBRDsKQEAgLTI0ODQsMTEgKzI0OTYsMTEgQEAKICAqIFRoZSBzcGxheSB0cmVlIG9ubHkgaGFzIGVhY2ggc2Vzc2lvbmhhbmRsZSBhcyBhIHNpbmdsZSBub2RlIGFuZCB0aGUgbmVhcmVzdAogICogdGltZW91dCBpcyB1c2VkIHRvIHNvcnQgaXQgb24uCiAgKi8KLXN0YXRpYyBDVVJMTWNvZGUgYWRkX25leHRfdGltZW91dChzdHJ1Y3QgdGltZXZhbCBub3csCitzdGF0aWMgQ1VSTE1jb2RlIGFkZF9uZXh0X3RpbWVvdXQoc3RydWN0IGN1cmx0aW1lIG5vdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF9tdWx0aSAqbXVsdGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEN1cmxfZWFzeSAqZCkKIHsKLSAgc3RydWN0IHRpbWV2YWwgKnR2ID0gJmQtPnN0YXRlLmV4cGlyZXRpbWU7CisgIHN0cnVjdCBjdXJsdGltZSAqdHYgPSAmZC0+c3RhdGUuZXhwaXJldGltZTsKICAgc3RydWN0IGN1cmxfbGxpc3QgKmxpc3QgPSAmZC0+c3RhdGUudGltZW91dGxpc3Q7CiAgIHN0cnVjdCBjdXJsX2xsaXN0X2VsZW1lbnQgKmU7CiAgIHN0cnVjdCB0aW1lX25vZGUgKm5vZGUgPSBOVUxMOwpAQCAtMjUyMCwxMCArMjUzMiw4IEBACiAgICAgLyogY29weSB0aGUgZmlyc3QgZW50cnkgdG8gJ3R2JyAqLwogICAgIG1lbWNweSh0diwgJm5vZGUtPnRpbWUsIHNpemVvZigqdHYpKTsKIAotICAgIC8qIHJlbW92ZSBmaXJzdCBlbnRyeSBmcm9tIGxpc3QgKi8KLSAgICBDdXJsX2xsaXN0X3JlbW92ZShsaXN0LCBlLCBOVUxMKTsKLQotICAgIC8qIGluc2VydCB0aGlzIG5vZGUgYWdhaW4gaW50byB0aGUgc3BsYXkgKi8KKyAgICAvKiBJbnNlcnQgdGhpcyBub2RlIGFnYWluIGludG8gdGhlIHNwbGF5LiAgS2VlcCB0aGUgdGltZXIgaW4gdGhlIGxpc3QgaW4KKyAgICAgICBjYXNlIHdlIG5lZWQgdG8gcmVjb21wdXRlIGZ1dHVyZSB0aW1lcnMuICovCiAgICAgbXVsdGktPnRpbWV0cmVlID0gQ3VybF9zcGxheWluc2VydCgqdHYsIG11bHRpLT50aW1ldHJlZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkLT5zdGF0ZS50aW1lbm9kZSk7CiAgIH0KQEAgLTI1MzksNyArMjU0OSw3IEBACiAgIENVUkxNY29kZSByZXN1bHQgPSBDVVJMTV9PSzsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IE5VTEw7CiAgIHN0cnVjdCBDdXJsX3RyZWUgKnQ7Ci0gIHN0cnVjdCB0aW1ldmFsIG5vdyA9IEN1cmxfdHZub3coKTsKKyAgc3RydWN0IGN1cmx0aW1lIG5vdyA9IEN1cmxfdHZub3coKTsKIAogICBpZihjaGVja2FsbCkgewogICAgIC8qICpwZXJmb3JtKCkgZGVhbHMgd2l0aCBydW5uaW5nX2hhbmRsZXMgb24gaXRzIG93biAqLwpAQCAtMjU0OCw3ICsyNTU4LDcgQEAKICAgICAvKiB3YWxrIHRocm91Z2ggZWFjaCBlYXN5IGhhbmRsZSBhbmQgZG8gdGhlIHNvY2tldCBzdGF0ZSBjaGFuZ2UgbWFnaWMKICAgICAgICBhbmQgY2FsbGJhY2tzICovCiAgICAgaWYocmVzdWx0ICE9IENVUkxNX0JBRF9IQU5ETEUpIHsKLSAgICAgIGRhdGE9bXVsdGktPmVhc3lwOworICAgICAgZGF0YSA9IG11bHRpLT5lYXN5cDsKICAgICAgIHdoaWxlKGRhdGEpIHsKICAgICAgICAgc2luZ2xlc29ja2V0KG11bHRpLCBkYXRhKTsKICAgICAgICAgZGF0YSA9IGRhdGEtPm5leHQ7CkBAIC0yNzY1LDExICsyNzc1LDExIEBACiBzdGF0aWMgQ1VSTE1jb2RlIG11bHRpX3RpbWVvdXQoc3RydWN0IEN1cmxfbXVsdGkgKm11bHRpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgKnRpbWVvdXRfbXMpCiB7Ci0gIHN0YXRpYyBzdHJ1Y3QgdGltZXZhbCB0dl96ZXJvID0gezAsIDB9OworICBzdGF0aWMgc3RydWN0IGN1cmx0aW1lIHR2X3plcm8gPSB7MCwgMH07CiAKICAgaWYobXVsdGktPnRpbWV0cmVlKSB7CiAgICAgLyogd2UgaGF2ZSBhIHRyZWUgb2YgZXhwaXJlIHRpbWVzICovCi0gICAgc3RydWN0IHRpbWV2YWwgbm93ID0gQ3VybF90dm5vdygpOworICAgIHN0cnVjdCBjdXJsdGltZSBub3cgPSBDdXJsX3R2bm93KCk7CiAKICAgICAvKiBzcGxheSB0aGUgbG93ZXN0IHRvIHRoZSBib3R0b20gKi8KICAgICBtdWx0aS0+dGltZXRyZWUgPSBDdXJsX3NwbGF5KHR2X3plcm8sIG11bHRpLT50aW1ldHJlZSk7CkBAIC0yNzg1LDcgKzI3OTUsNyBAQAogICAgICAgICAgKiBwcm9jZXNzb3JzIHdoaWxlIHRoZSBkaWZmIGlzIHN0aWxsIHByZXNlbnQgYnV0IGxlc3MgdGhhbiBvbmUKICAgICAgICAgICogbWlsbGlzZWNvbmQhIGluc3RlYWQgd2UgcmV0dXJuIDEgdW50aWwgdGhlIHRpbWUgaXMgcmlwZS4KICAgICAgICAgICovCi0gICAgICAgICp0aW1lb3V0X21zPTE7CisgICAgICAgICp0aW1lb3V0X21zID0gMTsKICAgICB9CiAgICAgZWxzZQogICAgICAgLyogMCBtZWFucyBpbW1lZGlhdGVseSAqLwpAQCAtMjgyMSw3ICsyODMxLDcgQEAKICAgICByZXR1cm4gLTE7CiAgIH0KICAgaWYodGltZW91dF9tcyA8IDApIHsKLSAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHRpbWV2YWwgbm9uZT17MCwgMH07CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBjdXJsdGltZSBub25lID0gezAsIDB9OwogICAgIGlmKEN1cmxfc3BsYXljb21wYXJla2V5cyhub25lLCBtdWx0aS0+dGltZXJfbGFzdGNhbGwpKSB7CiAgICAgICBtdWx0aS0+dGltZXJfbGFzdGNhbGwgPSBub25lOwogICAgICAgLyogdGhlcmUncyBubyB0aW1lb3V0IG5vdyBidXQgdGhlcmUgd2FzIG9uZSBwcmV2aW91c2x5LCB0ZWxsIHRoZSBhcHAgdG8KQEAgLTI4NzIsNyArMjg4Miw3IEBACiAgKi8KIHN0YXRpYyBDVVJMTWNvZGUKIG11bHRpX2FkZHRpbWVvdXQoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKLSAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgKnN0YW1wLAorICAgICAgICAgICAgICAgICBzdHJ1Y3QgY3VybHRpbWUgKnN0YW1wLAogICAgICAgICAgICAgICAgICBleHBpcmVfaWQgZWlkKQogewogICBzdHJ1Y3QgY3VybF9sbGlzdF9lbGVtZW50ICplOwpAQCAtMjkyMCw5ICsyOTMwLDkgQEAKIHZvaWQgQ3VybF9leHBpcmUoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgdGltZV90IG1pbGxpLCBleHBpcmVfaWQgaWQpCiB7CiAgIHN0cnVjdCBDdXJsX211bHRpICptdWx0aSA9IGRhdGEtPm11bHRpOwotICBzdHJ1Y3QgdGltZXZhbCAqbm93cCA9ICZkYXRhLT5zdGF0ZS5leHBpcmV0aW1lOworICBzdHJ1Y3QgY3VybHRpbWUgKm5vd3AgPSAmZGF0YS0+c3RhdGUuZXhwaXJldGltZTsKICAgaW50IHJjOwotICBzdHJ1Y3QgdGltZXZhbCBzZXQ7CisgIHN0cnVjdCBjdXJsdGltZSBzZXQ7CiAKICAgLyogdGhpcyBpcyBvbmx5IGludGVyZXN0aW5nIHdoaWxlIHRoZXJlIGlzIHN0aWxsIGFuIGFzc29jaWF0ZWQgbXVsdGkgc3RydWN0CiAgICAgIHJlbWFpbmluZyEgKi8KQEAgLTI5MzIsMzQgKzI5NDIsMzMgQEAKICAgREVCVUdBU1NFUlQoaWQgPCBFWFBJUkVfTEFTVCk7CiAKICAgc2V0ID0gQ3VybF90dm5vdygpOwotICBzZXQudHZfc2VjICs9IChsb25nKShtaWxsaS8xMDAwKTsKLSAgc2V0LnR2X3VzZWMgKz0gKGxvbmcpKG1pbGxpJTEwMDApKjEwMDA7CisgIHNldC50dl9zZWMgKz0gbWlsbGkvMTAwMDsKKyAgc2V0LnR2X3VzZWMgKz0gKHVuc2lnbmVkIGludCkobWlsbGklMTAwMCkqMTAwMDsKIAogICBpZihzZXQudHZfdXNlYyA+PSAxMDAwMDAwKSB7CiAgICAgc2V0LnR2X3NlYysrOwogICAgIHNldC50dl91c2VjIC09IDEwMDAwMDA7CiAgIH0KIAorICAvKiBSZW1vdmUgYW55IHRpbWVyIHdpdGggdGhlIHNhbWUgaWQganVzdCBpbiBjYXNlLiAqLworICBtdWx0aV9kZWx0aW1lb3V0KGRhdGEsIGlkKTsKKworICAvKiBBZGQgaXQgdG8gdGhlIHRpbWVyIGxpc3QuICBJdCBtdXN0IHN0YXkgaW4gdGhlIGxpc3QgdW50aWwgaXQgaGFzIGV4cGlyZWQKKyAgICAgaW4gY2FzZSB3ZSBuZWVkIHRvIHJlY29tcHV0ZSB0aGUgbWluaW11bSB0aW1lciBsYXRlci4gKi8KKyAgbXVsdGlfYWRkdGltZW91dChkYXRhLCAmc2V0LCBpZCk7CisKICAgaWYobm93cC0+dHZfc2VjIHx8IG5vd3AtPnR2X3VzZWMpIHsKICAgICAvKiBUaGlzIG1lYW5zIHRoYXQgdGhlIHN0cnVjdCBpcyBhZGRlZCBhcyBhIG5vZGUgaW4gdGhlIHNwbGF5IHRyZWUuCiAgICAgICAgQ29tcGFyZSBpZiB0aGUgbmV3IHRpbWUgaXMgZWFybGllciwgYW5kIG9ubHkgcmVtb3ZlLW9sZC9hZGQtbmV3IGlmIGl0CiAgICAgICAgaXMuICovCiAgICAgdGltZV90IGRpZmYgPSBjdXJseF90dmRpZmYoc2V0LCAqbm93cCk7CiAKLSAgICAvKiByZW1vdmUgdGhlIHByZXZpb3VzIHRpbWVyIGZpcnN0LCBpZiB0aGVyZSAqLwotICAgIG11bHRpX2RlbHRpbWVvdXQoZGF0YSwgaWQpOwotCiAgICAgaWYoZGlmZiA+IDApIHsKLSAgICAgIC8qIHRoZSBuZXcgZXhwaXJlIHRpbWUgd2FzIGxhdGVyIHNvIGp1c3QgYWRkIGl0IHRvIHRoZSBxdWV1ZQotICAgICAgICAgYW5kIGdldCBvdXQgKi8KLSAgICAgIG11bHRpX2FkZHRpbWVvdXQoZGF0YSwgJnNldCwgaWQpOworICAgICAgLyogVGhlIGN1cnJlbnQgc3BsYXkgdHJlZSBlbnRyeSBpcyBzb29uZXIgdGhhbiB0aGlzIG5ldyBleHBpcnkgdGltZS4KKyAgICAgICAgIFdlIGRvbid0IG5lZWQgdG8gdXBkYXRlIG91ciBzcGxheSB0cmVlIGVudHJ5LiAqLwogICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8qIHRoZSBuZXcgdGltZSBpcyBuZXdlciB0aGFuIHRoZSBwcmVzZW50bHkgc2V0IG9uZSwgc28gYWRkIHRoZSBjdXJyZW50Ci0gICAgICAgdG8gdGhlIHF1ZXVlIGFuZCB1cGRhdGUgdGhlIGhlYWQgKi8KLSAgICBtdWx0aV9hZGR0aW1lb3V0KGRhdGEsIG5vd3AsIGlkKTsKLQogICAgIC8qIFNpbmNlIHRoaXMgaXMgYW4gdXBkYXRlZCB0aW1lLCB3ZSBtdXN0IHJlbW92ZSB0aGUgcHJldmlvdXMgZW50cnkgZnJvbQogICAgICAgIHRoZSBzcGxheSB0cmVlIGZpcnN0IGFuZCB0aGVuIHJlLWFkZCB0aGUgbmV3IHZhbHVlICovCiAgICAgcmMgPSBDdXJsX3NwbGF5cmVtb3ZlYnlhZGRyKG11bHRpLT50aW1ldHJlZSwKQEAgLTI5NjksNiArMjk3OCw4IEBACiAgICAgICBpbmZvZihkYXRhLCAiSW50ZXJuYWwgZXJyb3IgcmVtb3Zpbmcgc3BsYXkgbm9kZSA9ICVkXG4iLCByYyk7CiAgIH0KIAorICAvKiBJbmRpY2F0ZSB0aGF0IHdlIGFyZSBpbiB0aGUgc3BsYXkgdHJlZSBhbmQgaW5zZXJ0IHRoZSBuZXcgdGltZXIgZXhwaXJ5CisgICAgIHZhbHVlIHNpbmNlIGl0IGlzIG91ciBsb2NhbCBtaW5pbXVtLiAqLwogICAqbm93cCA9IHNldDsKICAgZGF0YS0+c3RhdGUudGltZW5vZGUucGF5bG9hZCA9IGRhdGE7CiAgIG11bHRpLT50aW1ldHJlZSA9IEN1cmxfc3BsYXlpbnNlcnQoKm5vd3AsIG11bHRpLT50aW1ldHJlZSwKQEAgLTI5OTUsNyArMzAwNiw3IEBACiB2b2lkIEN1cmxfZXhwaXJlX2NsZWFyKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCiB7CiAgIHN0cnVjdCBDdXJsX211bHRpICptdWx0aSA9IGRhdGEtPm11bHRpOwotICBzdHJ1Y3QgdGltZXZhbCAqbm93cCA9ICZkYXRhLT5zdGF0ZS5leHBpcmV0aW1lOworICBzdHJ1Y3QgY3VybHRpbWUgKm5vd3AgPSAmZGF0YS0+c3RhdGUuZXhwaXJldGltZTsKICAgaW50IHJjOwogCiAgIC8qIHRoaXMgaXMgb25seSBpbnRlcmVzdGluZyB3aGlsZSB0aGVyZSBpcyBzdGlsbCBhbiBhc3NvY2lhdGVkIG11bHRpIHN0cnVjdApAQCAtMzEwNCwxMyArMzExNSwxMyBAQAogICBpbnQgaTsKICAgZnByaW50ZihzdGRlcnIsICIqIE11bHRpIHN0YXR1czogJWQgaGFuZGxlcywgJWQgYWxpdmVcbiIsCiAgICAgICAgICAgbXVsdGktPm51bV9lYXN5LCBtdWx0aS0+bnVtX2FsaXZlKTsKLSAgZm9yKGRhdGE9bXVsdGktPmVhc3lwOyBkYXRhOyBkYXRhID0gZGF0YS0+bmV4dCkgeworICBmb3IoZGF0YSA9IG11bHRpLT5lYXN5cDsgZGF0YTsgZGF0YSA9IGRhdGEtPm5leHQpIHsKICAgICBpZihkYXRhLT5tc3RhdGUgPCBDVVJMTV9TVEFURV9DT01QTEVURUQpIHsKICAgICAgIC8qIG9ubHkgZGlzcGxheSBoYW5kbGVzIHRoYXQgYXJlIG5vdCBjb21wbGV0ZWQgKi8KICAgICAgIGZwcmludGYoc3RkZXJyLCAiaGFuZGxlICVwLCBzdGF0ZSAlcywgJWQgc29ja2V0c1xuIiwKICAgICAgICAgICAgICAgKHZvaWQgKilkYXRhLAogICAgICAgICAgICAgICBzdGF0ZW5hbWVbZGF0YS0+bXN0YXRlXSwgZGF0YS0+bnVtc29ja3MpOwotICAgICAgZm9yKGk9MDsgaSA8IGRhdGEtPm51bXNvY2tzOyBpKyspIHsKKyAgICAgIGZvcihpID0gMDsgaSA8IGRhdGEtPm51bXNvY2tzOyBpKyspIHsKICAgICAgICAgY3VybF9zb2NrZXRfdCBzID0gZGF0YS0+c29ja2V0c1tpXTsKICAgICAgICAgc3RydWN0IEN1cmxfc2hfZW50cnkgKmVudHJ5ID0gc2hfZ2V0ZW50cnkoJm11bHRpLT5zb2NraGFzaCwgcyk7CiAKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL211bHRpaGFuZGxlLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9tdWx0aWhhbmRsZS5oCmluZGV4IGU2ZmZiZjUuLjQwNTc1MzkgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL211bHRpaGFuZGxlLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvbXVsdGloYW5kbGUuaApAQCAtMTQ4LDcgKzE0OCw3IEBACiAgIC8qIHRpbWVyIGNhbGxiYWNrIGFuZCB1c2VyIGRhdGEgcG9pbnRlciBmb3IgdGhlICpzb2NrZXQoKSBBUEkgKi8KICAgY3VybF9tdWx0aV90aW1lcl9jYWxsYmFjayB0aW1lcl9jYjsKICAgdm9pZCAqdGltZXJfdXNlcnA7Ci0gIHN0cnVjdCB0aW1ldmFsIHRpbWVyX2xhc3RjYWxsOyAvKiB0aGUgZml4ZWQgdGltZSBmb3IgdGhlIHRpbWVvdXQgZm9yIHRoZQorICBzdHJ1Y3QgY3VybHRpbWUgdGltZXJfbGFzdGNhbGw7IC8qIHRoZSBmaXhlZCB0aW1lIGZvciB0aGUgdGltZW91dCBmb3IgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyBjYWxsYmFjayAqLwogfTsKIApkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvbmV0cmMuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL25ldHJjLmMKaW5kZXggOTk2NzExZC4uZGJjYzU5YSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvbmV0cmMuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9uZXRyYy5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC01NiwxNCArNTYsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgY2hhciAqbmV0cmNmaWxlKQogewogICBGSUxFICpmaWxlOwotICBpbnQgcmV0Y29kZT0xOworICBpbnQgcmV0Y29kZSA9IDE7CiAgIGludCBzcGVjaWZpY19sb2dpbiA9ICgqbG9naW5wICYmICoqbG9naW5wICE9IDApOwogICBib29sIG5ldHJjX2FsbG9jID0gRkFMU0U7Ci0gIGVudW0gaG9zdF9sb29rdXBfc3RhdGUgc3RhdGU9Tk9USElORzsKKyAgZW51bSBob3N0X2xvb2t1cF9zdGF0ZSBzdGF0ZSA9IE5PVEhJTkc7CiAKLSAgY2hhciBzdGF0ZV9sb2dpbj0wOyAgICAgIC8qIEZvdW5kIGEgbG9naW4ga2V5d29yZCAqLwotICBjaGFyIHN0YXRlX3Bhc3N3b3JkPTA7ICAgLyogRm91bmQgYSBwYXNzd29yZCBrZXl3b3JkICovCi0gIGludCBzdGF0ZV9vdXJfbG9naW49RkFMU0U7ICAvKiBXaXRoIHNwZWNpZmljX2xvZ2luLCBmb3VuZCAqb3VyKiBsb2dpbiBuYW1lICovCisgIGNoYXIgc3RhdGVfbG9naW4gPSAwOyAgICAgIC8qIEZvdW5kIGEgbG9naW4ga2V5d29yZCAqLworICBjaGFyIHN0YXRlX3Bhc3N3b3JkID0gMDsgICAvKiBGb3VuZCBhIHBhc3N3b3JkIGtleXdvcmQgKi8KKyAgaW50IHN0YXRlX291cl9sb2dpbiA9IEZBTFNFOyAgLyogV2l0aCBzcGVjaWZpY19sb2dpbiwgZm91bmQgKm91ciogbG9naW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSAqLwogCiAjZGVmaW5lIE5FVFJDIERPVF9DSEFSICJuZXRyYyIKIApAQCAtODgsNyArODksNyBAQAogICAgIH0KICAgICBlbHNlIHsKICAgICAgIHN0cnVjdCBwYXNzd2QgKnB3OwotICAgICAgcHc9IGdldHB3dWlkKGdldGV1aWQoKSk7CisgICAgICBwdyA9IGdldHB3dWlkKGdldGV1aWQoKSk7CiAgICAgICBpZihwdykgewogICAgICAgICBob21lID0gcHctPnB3X2RpcjsKICAgICAgIH0KQEAgLTExMywxNiArMTE0LDE5IEBACiAgIGlmKGZpbGUpIHsKICAgICBjaGFyICp0b2s7CiAgICAgY2hhciAqdG9rX2J1ZjsKLSAgICBib29sIGRvbmU9RkFMU0U7CisgICAgYm9vbCBkb25lID0gRkFMU0U7CiAgICAgY2hhciBuZXRyY2J1ZmZlclsyNTZdOwogICAgIGludCAgbmV0cmNidWZmc2l6ZSA9IChpbnQpc2l6ZW9mKG5ldHJjYnVmZmVyKTsKIAogICAgIHdoaWxlKCFkb25lICYmIGZnZXRzKG5ldHJjYnVmZmVyLCBuZXRyY2J1ZmZzaXplLCBmaWxlKSkgewotICAgICAgdG9rPXN0cnRva19yKG5ldHJjYnVmZmVyLCAiIFx0XG4iLCAmdG9rX2J1Zik7CisgICAgICB0b2sgPSBzdHJ0b2tfcihuZXRyY2J1ZmZlciwgIiBcdFxuIiwgJnRva19idWYpOworICAgICAgaWYodG9rICYmICp0b2sgPT0gJyMnKQorICAgICAgICAvKiB0cmVhdCBhbiBpbml0aWFsIGhhc2ggYXMgYSBjb21tZW50IGxpbmUgKi8KKyAgICAgICAgY29udGludWU7CiAgICAgICB3aGlsZSghZG9uZSAmJiB0b2spIHsKIAogICAgICAgICBpZigoKmxvZ2lucCAmJiAqKmxvZ2lucCkgJiYgKCpwYXNzd29yZHAgJiYgKipwYXNzd29yZHApKSB7Ci0gICAgICAgICAgZG9uZT1UUlVFOworICAgICAgICAgIGRvbmUgPSBUUlVFOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTEzMywyMiArMTM3LDIyIEBACiAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgdGhhdCBzdGFydHMgdGhlIHN0dWZmIGVudGVyZWQgZm9yIHRoaXMgbWFjaGluZSwKICAgICAgICAgICAgICAgIGFmdGVyIHRoaXMgd2UgbmVlZCB0byBzZWFyY2ggZm9yICdsb2dpbicgYW5kCiAgICAgICAgICAgICAgICAncGFzc3dvcmQnLiAqLwotICAgICAgICAgICAgc3RhdGU9SE9TVEZPVU5EOworICAgICAgICAgICAgc3RhdGUgPSBIT1NURk9VTkQ7CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UgaWYoc3RyY2FzZWNvbXBhcmUoImRlZmF1bHQiLCB0b2spKSB7Ci0gICAgICAgICAgICBzdGF0ZT1IT1NUVkFMSUQ7Ci0gICAgICAgICAgICByZXRjb2RlPTA7IC8qIHdlIGRpZCBmaW5kIG91ciBob3N0ICovCisgICAgICAgICAgICBzdGF0ZSA9IEhPU1RWQUxJRDsKKyAgICAgICAgICAgIHJldGNvZGUgPSAwOyAvKiB3ZSBkaWQgZmluZCBvdXIgaG9zdCAqLwogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBIT1NURk9VTkQ6CiAgICAgICAgICAgaWYoc3RyY2FzZWNvbXBhcmUoaG9zdCwgdG9rKSkgewogICAgICAgICAgICAgLyogYW5kIHllcywgdGhpcyBpcyBvdXIgaG9zdCEgKi8KLSAgICAgICAgICAgIHN0YXRlPUhPU1RWQUxJRDsKLSAgICAgICAgICAgIHJldGNvZGU9MDsgLyogd2UgZGlkIGZpbmQgb3VyIGhvc3QgKi8KKyAgICAgICAgICAgIHN0YXRlID0gSE9TVFZBTElEOworICAgICAgICAgICAgcmV0Y29kZSA9IDA7IC8qIHdlIGRpZCBmaW5kIG91ciBob3N0ICovCiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIC8qIG5vdCBvdXIgaG9zdCAqLwotICAgICAgICAgICAgc3RhdGU9Tk9USElORzsKKyAgICAgICAgICAgIHN0YXRlID0gTk9USElORzsKICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBIT1NUVkFMSUQ6CiAgICAgICAgICAgLyogd2UgYXJlIG5vdyBwYXJzaW5nIHN1Yi1rZXl3b3JkcyBjb25jZXJuaW5nICJvdXIiIGhvc3QgKi8KQEAgLTE2NCw3ICsxNjgsNyBAQAogICAgICAgICAgICAgICAgIGdvdG8gb3V0OwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZV9sb2dpbj0wOworICAgICAgICAgICAgc3RhdGVfbG9naW4gPSAwOwogICAgICAgICAgIH0KICAgICAgICAgICBlbHNlIGlmKHN0YXRlX3Bhc3N3b3JkKSB7CiAgICAgICAgICAgICBpZihzdGF0ZV9vdXJfbG9naW4gfHwgIXNwZWNpZmljX2xvZ2luKSB7CkBAIC0xNzUsMTIgKzE3OSwxMiBAQAogICAgICAgICAgICAgICAgIGdvdG8gb3V0OwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZV9wYXNzd29yZD0wOworICAgICAgICAgICAgc3RhdGVfcGFzc3dvcmQgPSAwOwogICAgICAgICAgIH0KICAgICAgICAgICBlbHNlIGlmKHN0cmNhc2Vjb21wYXJlKCJsb2dpbiIsIHRvaykpCi0gICAgICAgICAgICBzdGF0ZV9sb2dpbj0xOworICAgICAgICAgICAgc3RhdGVfbG9naW4gPSAxOwogICAgICAgICAgIGVsc2UgaWYoc3RyY2FzZWNvbXBhcmUoInBhc3N3b3JkIiwgdG9rKSkKLSAgICAgICAgICAgIHN0YXRlX3Bhc3N3b3JkPTE7CisgICAgICAgICAgICBzdGF0ZV9wYXNzd29yZCA9IDE7CiAgICAgICAgICAgZWxzZSBpZihzdHJjYXNlY29tcGFyZSgibWFjaGluZSIsIHRvaykpIHsKICAgICAgICAgICAgIC8qIG9rLCB0aGVyZSdzIG1hY2hpbmUgaGVyZSBnbyA9PiAqLwogICAgICAgICAgICAgc3RhdGUgPSBIT1NURk9VTkQ7CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9ub24tYXNjaWkuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL25vbi1hc2NpaS5jCmluZGV4IDJmNWRlNGMuLjkyYjJmOGQgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL25vbi1hc2NpaS5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL25vbi1hc2NpaS5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC04Miw3ICs4Miw3IEBACiBDVVJMY29kZSBDdXJsX2NvbnZlcnRfdG9fbmV0d29yayhzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQogewotICBpZihkYXRhLT5zZXQuY29udnRvbmV0d29yaykgeworICBpZihkYXRhICYmIGRhdGEtPnNldC5jb252dG9uZXR3b3JrKSB7CiAgICAgLyogdXNlIHRyYW5zbGF0aW9uIGNhbGxiYWNrICovCiAgICAgQ1VSTGNvZGUgcmVzdWx0ID0gZGF0YS0+c2V0LmNvbnZ0b25ldHdvcmsoYnVmZmVyLCBsZW5ndGgpOwogICAgIGlmKHJlc3VsdCkgewpAQCAtOTYsMzQgKzk2LDM3IEBACiAgIGVsc2UgewogI2lmZGVmIEhBVkVfSUNPTlYKICAgICAvKiBkbyB0aGUgdHJhbnNsYXRpb24gb3Vyc2VsdmVzICovCisgICAgaWNvbnZfdCB0bXBjZCA9IChpY29udl90KSAtMTsKKyAgICBpY29udl90ICpjZCA9ICZ0bXBjZDsKICAgICBjaGFyICppbnB1dF9wdHIsICpvdXRwdXRfcHRyOwogICAgIHNpemVfdCBpbl9ieXRlcywgb3V0X2J5dGVzLCByYzsKLSAgICBpbnQgZXJyb3I7CiAKICAgICAvKiBvcGVuIGFuIGljb252IGNvbnZlcnNpb24gZGVzY3JpcHRvciBpZiBuZWNlc3NhcnkgKi8KLSAgICBpZihkYXRhLT5vdXRib3VuZF9jZCA9PSAoaWNvbnZfdCktMSkgewotICAgICAgZGF0YS0+b3V0Ym91bmRfY2QgPSBpY29udl9vcGVuKENVUkxfSUNPTlZfQ09ERVNFVF9PRl9ORVRXT1JLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxfSUNPTlZfQ09ERVNFVF9PRl9IT1NUKTsKLSAgICAgIGlmKGRhdGEtPm91dGJvdW5kX2NkID09IChpY29udl90KS0xKSB7Ci0gICAgICAgIGVycm9yID0gRVJSTk87CisgICAgaWYoZGF0YSkKKyAgICAgIGNkID0gJmRhdGEtPm91dGJvdW5kX2NkOworICAgIGlmKCpjZCA9PSAoaWNvbnZfdCktMSkgeworICAgICAgKmNkID0gaWNvbnZfb3BlbihDVVJMX0lDT05WX0NPREVTRVRfT0ZfTkVUV09SSywKKyAgICAgICAgICAgICAgICAgICAgICAgQ1VSTF9JQ09OVl9DT0RFU0VUX09GX0hPU1QpOworICAgICAgaWYoKmNkID09IChpY29udl90KS0xKSB7CiAgICAgICAgIGZhaWxmKGRhdGEsCiAgICAgICAgICAgICAgICJUaGUgaWNvbnZfb3BlbihcIiVzXCIsIFwiJXNcIikgY2FsbCBmYWlsZWQgd2l0aCBlcnJubyAlaTogJXMiLAogICAgICAgICAgICAgICBDVVJMX0lDT05WX0NPREVTRVRfT0ZfTkVUV09SSywKICAgICAgICAgICAgICAgQ1VSTF9JQ09OVl9DT0RFU0VUX09GX0hPU1QsCi0gICAgICAgICAgICAgIGVycm9yLCBzdHJlcnJvcihlcnJvcikpOworICAgICAgICAgICAgICBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgcmV0dXJuIENVUkxFX0NPTlZfRkFJTEVEOwogICAgICAgfQogICAgIH0KICAgICAvKiBjYWxsIGljb252ICovCiAgICAgaW5wdXRfcHRyID0gb3V0cHV0X3B0ciA9IGJ1ZmZlcjsKICAgICBpbl9ieXRlcyA9IG91dF9ieXRlcyA9IGxlbmd0aDsKLSAgICByYyA9IGljb252KGRhdGEtPm91dGJvdW5kX2NkLCAoY29uc3QgY2hhciAqKikmaW5wdXRfcHRyLCAmaW5fYnl0ZXMsCisgICAgcmMgPSBpY29udigqY2QsICZpbnB1dF9wdHIsICZpbl9ieXRlcywKICAgICAgICAgICAgICAgICZvdXRwdXRfcHRyLCAmb3V0X2J5dGVzKTsKKyAgICBpZighZGF0YSkKKyAgICAgIGljb252X2Nsb3NlKHRtcGNkKTsKICAgICBpZigocmMgPT0gSUNPTlZfRVJST1IpIHx8IChpbl9ieXRlcyAhPSAwKSkgewotICAgICAgZXJyb3IgPSBFUlJOTzsKICAgICAgIGZhaWxmKGRhdGEsCiAgICAgICAgICAgICAiVGhlIEN1cmxfY29udmVydF90b19uZXR3b3JrIGljb252IGNhbGwgZmFpbGVkIHdpdGggZXJybm8gJWk6ICVzIiwKLSAgICAgICAgICAgIGVycm9yLCBzdHJlcnJvcihlcnJvcikpOworICAgICAgICAgICAgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICByZXR1cm4gQ1VSTEVfQ09OVl9GQUlMRUQ7CiAgICAgfQogI2Vsc2UKQEAgLTE0Miw3ICsxNDUsNyBAQAogQ1VSTGNvZGUgQ3VybF9jb252ZXJ0X2Zyb21fbmV0d29yayhzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCiB7Ci0gIGlmKGRhdGEtPnNldC5jb252ZnJvbW5ldHdvcmspIHsKKyAgaWYoZGF0YSAmJiBkYXRhLT5zZXQuY29udmZyb21uZXR3b3JrKSB7CiAgICAgLyogdXNlIHRyYW5zbGF0aW9uIGNhbGxiYWNrICovCiAgICAgQ1VSTGNvZGUgcmVzdWx0ID0gZGF0YS0+c2V0LmNvbnZmcm9tbmV0d29yayhidWZmZXIsIGxlbmd0aCk7CiAgICAgaWYocmVzdWx0KSB7CkBAIC0xNTYsMzQgKzE1OSwzNyBAQAogICBlbHNlIHsKICNpZmRlZiBIQVZFX0lDT05WCiAgICAgLyogZG8gdGhlIHRyYW5zbGF0aW9uIG91cnNlbHZlcyAqLworICAgIGljb252X3QgdG1wY2QgPSAoaWNvbnZfdCkgLTE7CisgICAgaWNvbnZfdCAqY2QgPSAmdG1wY2Q7CiAgICAgY2hhciAqaW5wdXRfcHRyLCAqb3V0cHV0X3B0cjsKICAgICBzaXplX3QgaW5fYnl0ZXMsIG91dF9ieXRlcywgcmM7Ci0gICAgaW50IGVycm9yOwogCiAgICAgLyogb3BlbiBhbiBpY29udiBjb252ZXJzaW9uIGRlc2NyaXB0b3IgaWYgbmVjZXNzYXJ5ICovCi0gICAgaWYoZGF0YS0+aW5ib3VuZF9jZCA9PSAoaWNvbnZfdCktMSkgewotICAgICAgZGF0YS0+aW5ib3VuZF9jZCA9IGljb252X29wZW4oQ1VSTF9JQ09OVl9DT0RFU0VUX09GX0hPU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMX0lDT05WX0NPREVTRVRfT0ZfTkVUV09SSyk7Ci0gICAgICBpZihkYXRhLT5pbmJvdW5kX2NkID09IChpY29udl90KS0xKSB7Ci0gICAgICAgIGVycm9yID0gRVJSTk87CisgICAgaWYoZGF0YSkKKyAgICAgIGNkID0gJmRhdGEtPmluYm91bmRfY2Q7CisgICAgaWYoKmNkID09IChpY29udl90KS0xKSB7CisgICAgICAqY2QgPSBpY29udl9vcGVuKENVUkxfSUNPTlZfQ09ERVNFVF9PRl9IT1NULAorICAgICAgICAgICAgICAgICAgICAgICBDVVJMX0lDT05WX0NPREVTRVRfT0ZfTkVUV09SSyk7CisgICAgICBpZigqY2QgPT0gKGljb252X3QpLTEpIHsKICAgICAgICAgZmFpbGYoZGF0YSwKICAgICAgICAgICAgICAgIlRoZSBpY29udl9vcGVuKFwiJXNcIiwgXCIlc1wiKSBjYWxsIGZhaWxlZCB3aXRoIGVycm5vICVpOiAlcyIsCiAgICAgICAgICAgICAgIENVUkxfSUNPTlZfQ09ERVNFVF9PRl9IT1NULAogICAgICAgICAgICAgICBDVVJMX0lDT05WX0NPREVTRVRfT0ZfTkVUV09SSywKLSAgICAgICAgICAgICAgZXJyb3IsIHN0cmVycm9yKGVycm9yKSk7CisgICAgICAgICAgICAgIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICByZXR1cm4gQ1VSTEVfQ09OVl9GQUlMRUQ7CiAgICAgICB9CiAgICAgfQogICAgIC8qIGNhbGwgaWNvbnYgKi8KICAgICBpbnB1dF9wdHIgPSBvdXRwdXRfcHRyID0gYnVmZmVyOwogICAgIGluX2J5dGVzID0gb3V0X2J5dGVzID0gbGVuZ3RoOwotICAgIHJjID0gaWNvbnYoZGF0YS0+aW5ib3VuZF9jZCwgKGNvbnN0IGNoYXIgKiopJmlucHV0X3B0ciwgJmluX2J5dGVzLAorICAgIHJjID0gaWNvbnYoKmNkLCAmaW5wdXRfcHRyLCAmaW5fYnl0ZXMsCiAgICAgICAgICAgICAgICAmb3V0cHV0X3B0ciwgJm91dF9ieXRlcyk7CisgICAgaWYoIWRhdGEpCisgICAgICBpY29udl9jbG9zZSh0bXBjZCk7CiAgICAgaWYoKHJjID09IElDT05WX0VSUk9SKSB8fCAoaW5fYnl0ZXMgIT0gMCkpIHsKLSAgICAgIGVycm9yID0gRVJSTk87CiAgICAgICBmYWlsZihkYXRhLAogICAgICAgICAgICAgIkN1cmxfY29udmVydF9mcm9tX25ldHdvcmsgaWNvbnYgY2FsbCBmYWlsZWQgd2l0aCBlcnJubyAlaTogJXMiLAotICAgICAgICAgICAgZXJyb3IsIHN0cmVycm9yKGVycm9yKSk7CisgICAgICAgICAgICBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgIHJldHVybiBDVVJMRV9DT05WX0ZBSUxFRDsKICAgICB9CiAjZWxzZQpAQCAtMjAyLDcgKzIwOCw3IEBACiBDVVJMY29kZSBDdXJsX2NvbnZlcnRfZnJvbV91dGY4KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkKIHsKLSAgaWYoZGF0YS0+c2V0LmNvbnZmcm9tdXRmOCkgeworICBpZihkYXRhICYmIGRhdGEtPnNldC5jb252ZnJvbXV0ZjgpIHsKICAgICAvKiB1c2UgdHJhbnNsYXRpb24gY2FsbGJhY2sgKi8KICAgICBDVVJMY29kZSByZXN1bHQgPSBkYXRhLT5zZXQuY29udmZyb211dGY4KGJ1ZmZlciwgbGVuZ3RoKTsKICAgICBpZihyZXN1bHQpIHsKQEAgLTIxNiwzNSArMjIyLDM4IEBACiAgIGVsc2UgewogI2lmZGVmIEhBVkVfSUNPTlYKICAgICAvKiBkbyB0aGUgdHJhbnNsYXRpb24gb3Vyc2VsdmVzICovCi0gICAgY29uc3QgY2hhciAqaW5wdXRfcHRyOworICAgIGljb252X3QgdG1wY2QgPSAoaWNvbnZfdCkgLTE7CisgICAgaWNvbnZfdCAqY2QgPSAmdG1wY2Q7CisgICAgY2hhciAqaW5wdXRfcHRyOwogICAgIGNoYXIgKm91dHB1dF9wdHI7CiAgICAgc2l6ZV90IGluX2J5dGVzLCBvdXRfYnl0ZXMsIHJjOwotICAgIGludCBlcnJvcjsKIAogICAgIC8qIG9wZW4gYW4gaWNvbnYgY29udmVyc2lvbiBkZXNjcmlwdG9yIGlmIG5lY2Vzc2FyeSAqLwotICAgIGlmKGRhdGEtPnV0ZjhfY2QgPT0gKGljb252X3QpLTEpIHsKLSAgICAgIGRhdGEtPnV0ZjhfY2QgPSBpY29udl9vcGVuKENVUkxfSUNPTlZfQ09ERVNFVF9PRl9IT1NULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTF9JQ09OVl9DT0RFU0VUX0ZPUl9VVEY4KTsKLSAgICAgIGlmKGRhdGEtPnV0ZjhfY2QgPT0gKGljb252X3QpLTEpIHsKLSAgICAgICAgZXJyb3IgPSBFUlJOTzsKKyAgICBpZihkYXRhKQorICAgICAgY2QgPSAmZGF0YS0+dXRmOF9jZDsKKyAgICBpZigqY2QgPT0gKGljb252X3QpLTEpIHsKKyAgICAgICpjZCA9IGljb252X29wZW4oQ1VSTF9JQ09OVl9DT0RFU0VUX09GX0hPU1QsCisgICAgICAgICAgICAgICAgICAgICAgIENVUkxfSUNPTlZfQ09ERVNFVF9GT1JfVVRGOCk7CisgICAgICBpZigqY2QgPT0gKGljb252X3QpLTEpIHsKICAgICAgICAgZmFpbGYoZGF0YSwKICAgICAgICAgICAgICAgIlRoZSBpY29udl9vcGVuKFwiJXNcIiwgXCIlc1wiKSBjYWxsIGZhaWxlZCB3aXRoIGVycm5vICVpOiAlcyIsCiAgICAgICAgICAgICAgIENVUkxfSUNPTlZfQ09ERVNFVF9PRl9IT1NULAogICAgICAgICAgICAgICBDVVJMX0lDT05WX0NPREVTRVRfRk9SX1VURjgsCi0gICAgICAgICAgICAgIGVycm9yLCBzdHJlcnJvcihlcnJvcikpOworICAgICAgICAgICAgICBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgcmV0dXJuIENVUkxFX0NPTlZfRkFJTEVEOwogICAgICAgfQogICAgIH0KICAgICAvKiBjYWxsIGljb252ICovCiAgICAgaW5wdXRfcHRyID0gb3V0cHV0X3B0ciA9IGJ1ZmZlcjsKICAgICBpbl9ieXRlcyA9IG91dF9ieXRlcyA9IGxlbmd0aDsKLSAgICByYyA9IGljb252KGRhdGEtPnV0ZjhfY2QsICZpbnB1dF9wdHIsICZpbl9ieXRlcywKKyAgICByYyA9IGljb252KCpjZCwgJmlucHV0X3B0ciwgJmluX2J5dGVzLAogICAgICAgICAgICAgICAgJm91dHB1dF9wdHIsICZvdXRfYnl0ZXMpOworICAgIGlmKCFkYXRhKQorICAgICAgaWNvbnZfY2xvc2UodG1wY2QpOwogICAgIGlmKChyYyA9PSBJQ09OVl9FUlJPUikgfHwgKGluX2J5dGVzICE9IDApKSB7Ci0gICAgICBlcnJvciA9IEVSUk5POwogICAgICAgZmFpbGYoZGF0YSwKICAgICAgICAgICAgICJUaGUgQ3VybF9jb252ZXJ0X2Zyb21fdXRmOCBpY29udiBjYWxsIGZhaWxlZCB3aXRoIGVycm5vICVpOiAlcyIsCi0gICAgICAgICAgICBlcnJvciwgc3RyZXJyb3IoZXJyb3IpKTsKKyAgICAgICAgICAgIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgcmV0dXJuIENVUkxFX0NPTlZfRkFJTEVEOwogICAgIH0KICAgICBpZihvdXRwdXRfcHRyIDwgaW5wdXRfcHRyKSB7CkBAIC0zMTAsMjkgKzMxOSw0IEBACiAjZW5kaWYgLyogSEFWRV9JQ09OViAqLwogfQogCi0vKgotICogQ3VybF9jb252ZXJ0X2Zvcm0oKSBpcyB1c2VkIGZyb20gaHR0cC5jLCB0aGlzIGNvbnZlcnRzIGFueSBmb3JtIGl0ZW1zIHRoYXQKLSAgIG5lZWQgdG8gYmUgc2VudCBpbiB0aGUgbmV0d29yayBlbmNvZGluZy4gIFJldHVybnMgQ1VSTEVfT0sgb24gc3VjY2Vzcy4KLSAqLwotQ1VSTGNvZGUgQ3VybF9jb252ZXJ0X2Zvcm0oc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgc3RydWN0IEZvcm1EYXRhICpmb3JtKQotewotICBDVVJMY29kZSByZXN1bHQ7Ci0KLSAgaWYoIWRhdGEpCi0gICAgcmV0dXJuIENVUkxFX0JBRF9GVU5DVElPTl9BUkdVTUVOVDsKLQotICB3aGlsZShmb3JtKSB7Ci0gICAgaWYoZm9ybS0+dHlwZSA9PSBGT1JNX0RBVEEpIHsKLSAgICAgIHJlc3VsdCA9IEN1cmxfY29udmVydF90b19uZXR3b3JrKGRhdGEsIGZvcm0tPmxpbmUsIGZvcm0tPmxlbmd0aCk7Ci0gICAgICAvKiBDdXJsX2NvbnZlcnRfdG9fbmV0d29yayBjYWxscyBmYWlsZiBpZiB1bnN1Y2Nlc3NmdWwgKi8KLSAgICAgIGlmKHJlc3VsdCkKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBmb3JtID0gZm9ybS0+bmV4dDsKLSAgfQotCi0gIHJldHVybiBDVVJMRV9PSzsKLX0KLQogI2VuZGlmIC8qIENVUkxfRE9FU19DT05WRVJTSU9OUyAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvbm9uLWFzY2lpLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9ub24tYXNjaWkuaAppbmRleCBlMjdmMWY0Li41ZmI1NzcxIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9ub24tYXNjaWkuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9ub24tYXNjaWkuaApAQCAtNyw3ICs3LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDExLCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtNDgsNyArNDgsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKIENVUkxjb2RlIEN1cmxfY29udmVydF9mcm9tX3V0Zjgoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCk7Ci1DVVJMY29kZSBDdXJsX2NvbnZlcnRfZm9ybShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCBzdHJ1Y3QgRm9ybURhdGEgKmZvcm0pOwogI2Vsc2UKICNkZWZpbmUgQ3VybF9jb252ZXJ0X2Nsb25lKGEsYixjLGQpICgodm9pZClhLCBDVVJMRV9PSykKICNkZWZpbmUgQ3VybF9jb252ZXJ0X2luaXQoeCkgQ3VybF9ub3Bfc3RtdApAQCAtNTcsNyArNTYsNiBAQAogI2RlZmluZSBDdXJsX2NvbnZlcnRfdG9fbmV0d29yayhhLGIsYykgKCh2b2lkKWEsIENVUkxFX09LKQogI2RlZmluZSBDdXJsX2NvbnZlcnRfZnJvbV9uZXR3b3JrKGEsYixjKSAoKHZvaWQpYSwgQ1VSTEVfT0spCiAjZGVmaW5lIEN1cmxfY29udmVydF9mcm9tX3V0ZjgoYSxiLGMpICgodm9pZClhLCBDVVJMRV9PSykKLSNkZWZpbmUgQ3VybF9jb252ZXJ0X2Zvcm0oYSxiKSBDVVJMRV9PSwogI2VuZGlmCiAKICNlbmRpZiAvKiBIRUFERVJfQ1VSTF9OT05fQVNDSUlfSCAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvb3BlbmxkYXAuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL29wZW5sZGFwLmMKaW5kZXggNGI4Y2ZiOS4uZjI5NDQwMyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvb3BlbmxkYXAuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9vcGVubGRhcC5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCwgSG93YXJkIENodSwgPGh5Y0BvcGVubGRhcC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTcsIEhvd2FyZCBDaHUsIDxoeWNAb3BlbmxkYXAub3JnPgogICogQ29weXJpZ2h0IChDKSAyMDExIC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaApAQCAtODUsNiArODUsNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBsZGFwX2Rpc2Nvbm5lY3QsICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfTERBUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fTERBUCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8KQEAgLTExMCw2ICsxMTEsNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBsZGFwX2Rpc2Nvbm5lY3QsICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfTERBUFMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fTERBUCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfU1NMICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8KQEAgLTE1MCw3ICsxNTIsNyBAQAogewogICBsZGFwY29ubmluZm8gKmxpOwogICBMREFQVVJMRGVzYyAqbHVkOwotICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhPWNvbm4tPmRhdGE7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBpbnQgcmMsIHByb3RvOwogICBDVVJMY29kZSBzdGF0dXM7CiAKQEAgLTE5Niw3ICsxOTgsNyBAQAogICAodm9pZClkb25lOwogCiAgIHN0cmNweShob3N0dXJsLCAibGRhcCIpOwotICBwdHIgPSBob3N0dXJsKzQ7CisgIHB0ciA9IGhvc3R1cmwgKyA0OwogICBpZihjb25uLT5oYW5kbGVyLT5mbGFncyAmIFBST1RPUFRfU1NMKQogICAgICpwdHIrKyA9ICdzJzsKICAgc25wcmludGYocHRyLCBzaXplb2YoaG9zdHVybCktKHB0ci1ob3N0dXJsKSwgIjovLyVzOiVkIiwKQEAgLTM1Miw3ICszNTQsNyBAQAogICBpbnQgcmMgPSAwOwogICBMREFQVVJMRGVzYyAqbHVkcCA9IE5VTEw7CiAgIGludCBtc2dpZDsKLSAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YT1jb25uLT5kYXRhOworICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKIAogICBjb25ua2VlcChjb25uLCAiT3BlbkxEQVAgZG8iKTsKIApAQCAtNTE3LDcgKzUxOSw3IEBACiAgICAgICBlbHNlCiAgICAgICAgIGJpbmFyeSA9IDA7CiAKLSAgICAgIGZvcihpPTA7IGJ2YWxzW2ldLmJ2X3ZhbCAhPSBOVUxMOyBpKyspIHsKKyAgICAgIGZvcihpID0gMDsgYnZhbHNbaV0uYnZfdmFsICE9IE5VTEw7IGkrKykgewogICAgICAgICBpbnQgYmludmFsID0gMDsKICAgICAgICAgd3JpdGVlcnIgPSBDdXJsX2NsaWVudF93cml0ZShjb25uLCBDTElFTlRXUklURV9CT0RZLCAoY2hhciAqKSJcdCIsIDEpOwogICAgICAgICBpZih3cml0ZWVycikgewpAQCAtNTQ3LDcgKzU0OSw3IEBACiAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAvKiBjaGVjayBmb3IgdW5wcmludGFibGUgY2hhcmFjdGVycyAqLwogICAgICAgICAgICAgdW5zaWduZWQgaW50IGo7Ci0gICAgICAgICAgICBmb3Ioaj0wOyBqPGJ2YWxzW2ldLmJ2X2xlbjsgaisrKQorICAgICAgICAgICAgZm9yKGogPSAwOyBqPGJ2YWxzW2ldLmJ2X2xlbjsgaisrKQogICAgICAgICAgICAgICBpZighSVNQUklOVChidmFsc1tpXS5idl92YWxbal0pKSB7CiAgICAgICAgICAgICAgICAgYmludmFsID0gMTsKICAgICAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3BhcnNlZGF0ZS5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvcGFyc2VkYXRlLmMKaW5kZXggM2M3ODNiZS4uYjgyNjA1YiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvcGFyc2VkYXRlLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvcGFyc2VkYXRlLmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTE2NywyMCArMTY3LDIwIEBACiAgICAgIFJGQyAxMTIzKSBoYWQgdGhlaXIgc2lnbnMgd3JvbmcuIEhlcmUgd2UgdXNlIHRoZSBjb3JyZWN0IHNpZ25zIHRvIG1hdGNoCiAgICAgIGFjdHVhbCBtaWxpdGFyeSB1c2FnZS4KICAgICovCi0gIHsiQSIsICArMSAqIDYwfSwgICAgICAgICAvKiBBbHBoYSAqLwotICB7IkIiLCAgKzIgKiA2MH0sICAgICAgICAgLyogQnJhdm8gKi8KLSAgeyJDIiwgICszICogNjB9LCAgICAgICAgIC8qIENoYXJsaWUgKi8KLSAgeyJEIiwgICs0ICogNjB9LCAgICAgICAgIC8qIERlbHRhICovCi0gIHsiRSIsICArNSAqIDYwfSwgICAgICAgICAvKiBFY2hvICovCi0gIHsiRiIsICArNiAqIDYwfSwgICAgICAgICAvKiBGb3h0cm90ICovCi0gIHsiRyIsICArNyAqIDYwfSwgICAgICAgICAvKiBHb2xmICovCi0gIHsiSCIsICArOCAqIDYwfSwgICAgICAgICAvKiBIb3RlbCAqLwotICB7IkkiLCAgKzkgKiA2MH0sICAgICAgICAgLyogSW5kaWEgKi8KKyAgeyJBIiwgIDEgKiA2MH0sICAgICAgICAgLyogQWxwaGEgKi8KKyAgeyJCIiwgIDIgKiA2MH0sICAgICAgICAgLyogQnJhdm8gKi8KKyAgeyJDIiwgIDMgKiA2MH0sICAgICAgICAgLyogQ2hhcmxpZSAqLworICB7IkQiLCAgNCAqIDYwfSwgICAgICAgICAvKiBEZWx0YSAqLworICB7IkUiLCAgNSAqIDYwfSwgICAgICAgICAvKiBFY2hvICovCisgIHsiRiIsICA2ICogNjB9LCAgICAgICAgIC8qIEZveHRyb3QgKi8KKyAgeyJHIiwgIDcgKiA2MH0sICAgICAgICAgLyogR29sZiAqLworICB7IkgiLCAgOCAqIDYwfSwgICAgICAgICAvKiBIb3RlbCAqLworICB7IkkiLCAgOSAqIDYwfSwgICAgICAgICAvKiBJbmRpYSAqLwogICAvKiAiSiIsIEp1bGlldCBpcyBub3QgdXNlZCBhcyBhIHRpbWV6b25lLCB0byBpbmRpY2F0ZSB0aGUgb2JzZXJ2ZXIncyBsb2NhbAogICAgICB0aW1lICovCi0gIHsiSyIsICsxMCAqIDYwfSwgICAgICAgICAvKiBLaWxvICovCi0gIHsiTCIsICsxMSAqIDYwfSwgICAgICAgICAvKiBMaW1hICovCi0gIHsiTSIsICsxMiAqIDYwfSwgICAgICAgICAvKiBNaWtlICovCisgIHsiSyIsIDEwICogNjB9LCAgICAgICAgIC8qIEtpbG8gKi8KKyAgeyJMIiwgMTEgKiA2MH0sICAgICAgICAgLyogTGltYSAqLworICB7Ik0iLCAxMiAqIDYwfSwgICAgICAgICAvKiBNaWtlICovCiAgIHsiTiIsICAtMSAqIDYwfSwgICAgICAgICAvKiBOb3ZlbWJlciAqLwogICB7Ik8iLCAgLTIgKiA2MH0sICAgICAgICAgLyogT3NjYXIgKi8KICAgeyJQIiwgIC0zICogNjB9LCAgICAgICAgIC8qIFBhcGEgKi8KQEAgLTIwNSwxNCArMjA1LDE0IEBACiB7CiAgIGludCBpOwogICBjb25zdCBjaGFyICogY29uc3QgKndoYXQ7Ci0gIGJvb2wgZm91bmQ9IEZBTFNFOworICBib29sIGZvdW5kID0gRkFMU0U7CiAgIGlmKGxlbiA+IDMpCiAgICAgd2hhdCA9ICZ3ZWVrZGF5WzBdOwogICBlbHNlCiAgICAgd2hhdCA9ICZDdXJsX3drZGF5WzBdOwotICBmb3IoaT0wOyBpPDc7IGkrKykgeworICBmb3IoaSA9IDA7IGk8NzsgaSsrKSB7CiAgICAgaWYoc3RyY2FzZWNvbXBhcmUoY2hlY2ssIHdoYXRbMF0pKSB7Ci0gICAgICBmb3VuZD1UUlVFOworICAgICAgZm91bmQgPSBUUlVFOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIHdoYXQrKzsKQEAgLTIyNCwxMiArMjI0LDEyIEBACiB7CiAgIGludCBpOwogICBjb25zdCBjaGFyICogY29uc3QgKndoYXQ7Ci0gIGJvb2wgZm91bmQ9IEZBTFNFOworICBib29sIGZvdW5kID0gRkFMU0U7CiAKICAgd2hhdCA9ICZDdXJsX21vbnRoWzBdOwotICBmb3IoaT0wOyBpPDEyOyBpKyspIHsKKyAgZm9yKGkgPSAwOyBpPDEyOyBpKyspIHsKICAgICBpZihzdHJjYXNlY29tcGFyZShjaGVjaywgd2hhdFswXSkpIHsKLSAgICAgIGZvdW5kPVRSVUU7CisgICAgICBmb3VuZCA9IFRSVUU7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgd2hhdCsrOwpAQCAtMjQ0LDEyICsyNDQsMTIgQEAKIHsKICAgdW5zaWduZWQgaW50IGk7CiAgIGNvbnN0IHN0cnVjdCB0emluZm8gKndoYXQ7Ci0gIGJvb2wgZm91bmQ9IEZBTFNFOworICBib29sIGZvdW5kID0gRkFMU0U7CiAKICAgd2hhdCA9IHR6OwotICBmb3IoaT0wOyBpPCBzaXplb2YodHopL3NpemVvZih0elswXSk7IGkrKykgeworICBmb3IoaSA9IDA7IGk8IHNpemVvZih0eikvc2l6ZW9mKHR6WzBdKTsgaSsrKSB7CiAgICAgaWYoc3RyY2FzZWNvbXBhcmUoY2hlY2ssIHdoYXQtPm5hbWUpKSB7Ci0gICAgICBmb3VuZD1UUlVFOworICAgICAgZm91bmQgPSBUUlVFOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIHdoYXQrKzsKQEAgLTMzMSwyMSArMzMxLDIxIEBACiBzdGF0aWMgaW50IHBhcnNlZGF0ZShjb25zdCBjaGFyICpkYXRlLCB0aW1lX3QgKm91dHB1dCkKIHsKICAgdGltZV90IHQgPSAwOwotICBpbnQgd2RheW51bT0tMTsgIC8qIGRheSBvZiB0aGUgd2VlayBudW1iZXIsIDAtNiAobW9uLXN1bikgKi8KLSAgaW50IG1vbm51bT0tMTsgICAvKiBtb250aCBvZiB0aGUgeWVhciBudW1iZXIsIDAtMTEgKi8KLSAgaW50IG1kYXludW09LTE7IC8qIGRheSBvZiBtb250aCwgMSAtIDMxICovCi0gIGludCBob3VybnVtPS0xOwotICBpbnQgbWlubnVtPS0xOwotICBpbnQgc2VjbnVtPS0xOwotICBpbnQgeWVhcm51bT0tMTsKLSAgaW50IHR6b2ZmPS0xOworICBpbnQgd2RheW51bSA9IC0xOyAgLyogZGF5IG9mIHRoZSB3ZWVrIG51bWJlciwgMC02IChtb24tc3VuKSAqLworICBpbnQgbW9ubnVtID0gLTE7ICAgLyogbW9udGggb2YgdGhlIHllYXIgbnVtYmVyLCAwLTExICovCisgIGludCBtZGF5bnVtID0gLTE7IC8qIGRheSBvZiBtb250aCwgMSAtIDMxICovCisgIGludCBob3VybnVtID0gLTE7CisgIGludCBtaW5udW0gPSAtMTsKKyAgaW50IHNlY251bSA9IC0xOworICBpbnQgeWVhcm51bSA9IC0xOworICBpbnQgdHpvZmYgPSAtMTsKICAgc3RydWN0IG15X3RtIHRtOwogICBlbnVtIGFzc3VtZSBkaWduZXh0ID0gREFURV9NREFZOwogICBjb25zdCBjaGFyICppbmRhdGUgPSBkYXRlOyAvKiBzYXZlIHRoZSBvcmlnaW5hbCBwb2ludGVyICovCiAgIGludCBwYXJ0ID0gMDsgLyogbWF4IDYgcGFydHMgKi8KIAogICB3aGlsZSgqZGF0ZSAmJiAocGFydCA8IDYpKSB7Ci0gICAgYm9vbCBmb3VuZD1GQUxTRTsKKyAgICBib29sIGZvdW5kID0gRkFMU0U7CiAKICAgICBza2lwKCZkYXRlKTsKIApAQCAtMzg2LDcgKzM4Niw3IEBACiAgICAgICAvKiBhIGRpZ2l0ICovCiAgICAgICBpbnQgdmFsOwogICAgICAgY2hhciAqZW5kOwotICAgICAgaW50IGxlbj0wOworICAgICAgaW50IGxlbiA9IDA7CiAgICAgICBpZigoc2VjbnVtID09IC0xKSAmJgogICAgICAgICAgKDMgPT0gc3NjYW5mKGRhdGUsICIlMDJkOiUwMmQ6JTAyZCVuIiwKICAgICAgICAgICAgICAgICAgICAgICAmaG91cm51bSwgJm1pbm51bSwgJnNlY251bSwgJmxlbikpKSB7CkBAIC00MDQsMTIgKzQwNCwxMiBAQAogICAgICAgICBpbnQgZXJyb3I7CiAgICAgICAgIGludCBvbGRfZXJybm87CiAKLSAgICAgICAgb2xkX2Vycm5vID0gRVJSTk87Ci0gICAgICAgIFNFVF9FUlJOTygwKTsKKyAgICAgICAgb2xkX2Vycm5vID0gZXJybm87CisgICAgICAgIGVycm5vID0gMDsKICAgICAgICAgbHZhbCA9IHN0cnRvbChkYXRlLCAmZW5kLCAxMCk7Ci0gICAgICAgIGVycm9yID0gRVJSTk87Ci0gICAgICAgIGlmKGVycm9yICE9IG9sZF9lcnJubykKLSAgICAgICAgICBTRVRfRVJSTk8ob2xkX2Vycm5vKTsKKyAgICAgICAgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgaWYoZXJybm8gIT0gb2xkX2Vycm5vKQorICAgICAgICAgIGVycm5vID0gb2xkX2Vycm5vOwogCiAgICAgICAgIGlmKGVycm9yKQogICAgICAgICAgIHJldHVybiBQQVJTRURBVEVfRkFJTDsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Bpbmdwb25nLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9waW5ncG9uZy5jCmluZGV4IDVlZDc5YjcuLmI4ZjIxNDAgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Bpbmdwb25nLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvcGluZ3BvbmcuYwpAQCAtNDcsMTAgKzQ3LDEwIEBACiB0aW1lX3QgQ3VybF9wcF9zdGF0ZV90aW1lb3V0KHN0cnVjdCBwaW5ncG9uZyAqcHApCiB7CiAgIHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiA9IHBwLT5jb25uOwotICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhPWNvbm4tPmRhdGE7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICB0aW1lX3QgdGltZW91dF9tczsgLyogaW4gbWlsbGlzZWNvbmRzICovCiAgIHRpbWVfdCB0aW1lb3V0Ml9tczsgLyogaW4gbWlsbGlzZWNvbmRzICovCi0gIGxvbmcgcmVzcG9uc2VfdGltZT0gKGRhdGEtPnNldC5zZXJ2ZXJfcmVzcG9uc2VfdGltZW91dCk/CisgIGxvbmcgcmVzcG9uc2VfdGltZSA9IChkYXRhLT5zZXQuc2VydmVyX3Jlc3BvbnNlX3RpbWVvdXQpPwogICAgIGRhdGEtPnNldC5zZXJ2ZXJfcmVzcG9uc2VfdGltZW91dDogcHAtPnJlc3BvbnNlX3RpbWU7CiAKICAgLyogaWYgQ1VSTE9QVF9TRVJWRVJfUkVTUE9OU0VfVElNRU9VVCBpcyBzZXQsIHVzZSB0aGF0IHRvIGRldGVybWluZQpAQCAtODUsMTAgKzg1LDEwIEBACiAgIGludCByYzsKICAgdGltZV90IGludGVydmFsX21zOwogICB0aW1lX3QgdGltZW91dF9tcyA9IEN1cmxfcHBfc3RhdGVfdGltZW91dChwcCk7Ci0gIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGE9Y29ubi0+ZGF0YTsKKyAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOwogCi0gIGlmKHRpbWVvdXRfbXMgPD0wKSB7CisgIGlmKHRpbWVvdXRfbXMgPD0gMCkgewogICAgIGZhaWxmKGRhdGEsICJzZXJ2ZXIgcmVzcG9uc2UgdGltZW91dCIpOwogICAgIHJldHVybiBDVVJMRV9PUEVSQVRJT05fVElNRURPVVQ7IC8qIGFscmVhZHkgdG9vIGxpdHRsZSB0aW1lICovCiAgIH0KQEAgLTI3MCw3ICsyNzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnNpemUpIC8qIHNpemUgb2YgdGhlIHJlc3BvbnNlICovCiB7CiAgIHNzaXplX3QgcGVybGluZTsgLyogY291bnQgYnl0ZXMgcGVyIGxpbmUgKi8KLSAgYm9vbCBrZWVwb249VFJVRTsKKyAgYm9vbCBrZWVwb24gPSBUUlVFOwogICBzc2l6ZV90IGdvdGJ5dGVzOwogICBjaGFyICpwdHI7CiAgIHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiA9IHBwLT5jb25uOwpAQCAtMjgxLDcgKzI4MSw3IEBACiAgICpjb2RlID0gMDsgLyogMCBmb3IgZXJyb3JzIG9yIG5vdCBkb25lICovCiAgICpzaXplID0gMDsKIAotICBwdHI9YnVmICsgcHAtPm5yZWFkX3Jlc3A7CisgIHB0ciA9IGJ1ZiArIHBwLT5ucmVhZF9yZXNwOwogCiAgIC8qIG51bWJlciBvZiBieXRlcyBpbiB0aGUgY3VycmVudCBsaW5lLCBzbyBmYXIgKi8KICAgcGVybGluZSA9IChzc2l6ZV90KShwdHItcHAtPmxpbmVzdGFydF9yZXNwKTsKQEAgLTI5Nyw3ICsyOTcsNyBAQAogICAgICAgICogaXQgd291bGQgaGF2ZSBiZWVuIHBvcHVsYXRlZCB3aXRoIHNvbWV0aGluZyBvZiBzaXplIGludCB0byBiZWdpbgogICAgICAgICogd2l0aCwgZXZlbiB0aG91Z2ggaXRzIGRhdGF0eXBlIG1heSBiZSBsYXJnZXIgdGhhbiBhbiBpbnQuCiAgICAgICAgKi8KLSAgICAgIERFQlVHQVNTRVJUKChwdHIrcHAtPmNhY2hlX3NpemUpIDw9IChidWYrZGF0YS0+c2V0LmJ1ZmZlcl9zaXplKzEpKTsKKyAgICAgIERFQlVHQVNTRVJUKChwdHIgKyBwcC0+Y2FjaGVfc2l6ZSkgPD0gKGJ1ZiArIGRhdGEtPnNldC5idWZmZXJfc2l6ZSArIDEpKTsKICAgICAgIG1lbWNweShwdHIsIHBwLT5jYWNoZSwgcHAtPmNhY2hlX3NpemUpOwogICAgICAgZ290Ynl0ZXMgPSAoc3NpemVfdClwcC0+Y2FjaGVfc2l6ZTsKICAgICAgIGZyZWUocHAtPmNhY2hlKTsgICAgLyogZnJlZSB0aGUgY2FjaGUgKi8KQEAgLTM1MSw3ICszNTEsNyBAQAogICAgICAgcHAtPm5yZWFkX3Jlc3AgKz0gZ290Ynl0ZXM7CiAgICAgICBmb3IoaSA9IDA7IGkgPCBnb3RieXRlczsgcHRyKyssIGkrKykgewogICAgICAgICBwZXJsaW5lKys7Ci0gICAgICAgIGlmKCpwdHI9PSdcbicpIHsKKyAgICAgICAgaWYoKnB0ciA9PSAnXG4nKSB7CiAgICAgICAgICAgLyogYSBuZXdsaW5lIGlzIENSTEYgaW4gcHAtdGFsaywgc28gdGhlIENSIGlzIGlnbm9yZWQgYXMKICAgICAgICAgICAgICB0aGUgbGluZSBpc24ndCByZWFsbHkgdGVybWluYXRlZCB1bnRpbCB0aGUgTEYgY29tZXMgKi8KIApAQCAtMzc4LDE3ICszNzgsMTcgQEAKICAgICAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBidWZmZXIgYW5kIHplcm8gdGVybWluYXRlLCBmb3Igb2xkIHRpbWVzIHNha2UgKi8KICAgICAgICAgICAgIHNpemVfdCBuID0gcHRyIC0gcHAtPmxpbmVzdGFydF9yZXNwOwogICAgICAgICAgICAgbWVtbW92ZShidWYsIHBwLT5saW5lc3RhcnRfcmVzcCwgbik7Ci0gICAgICAgICAgICBidWZbbl09MDsgLyogemVybyB0ZXJtaW5hdGUgKi8KLSAgICAgICAgICAgIGtlZXBvbj1GQUxTRTsKLSAgICAgICAgICAgIHBwLT5saW5lc3RhcnRfcmVzcCA9IHB0cisxOyAvKiBhZHZhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIGJ1ZltuXSA9IDA7IC8qIHplcm8gdGVybWluYXRlICovCisgICAgICAgICAgICBrZWVwb24gPSBGQUxTRTsKKyAgICAgICAgICAgIHBwLT5saW5lc3RhcnRfcmVzcCA9IHB0ciArIDE7IC8qIGFkdmFuY2UgcG9pbnRlciAqLwogICAgICAgICAgICAgaSsrOyAvKiBza2lwIHRoaXMgYmVmb3JlIGdldHRpbmcgb3V0ICovCiAKICAgICAgICAgICAgICpzaXplID0gcHAtPm5yZWFkX3Jlc3A7IC8qIHNpemUgb2YgdGhlIHJlc3BvbnNlICovCiAgICAgICAgICAgICBwcC0+bnJlYWRfcmVzcCA9IDA7IC8qIHJlc3RhcnQgKi8KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KLSAgICAgICAgICBwZXJsaW5lPTA7IC8qIGxpbmUgc3RhcnRzIG92ZXIgaGVyZSAqLwotICAgICAgICAgIHBwLT5saW5lc3RhcnRfcmVzcCA9IHB0cisxOworICAgICAgICAgIHBlcmxpbmUgPSAwOyAvKiBsaW5lIHN0YXJ0cyBvdmVyIGhlcmUgKi8KKyAgICAgICAgICBwcC0+bGluZXN0YXJ0X3Jlc3AgPSBwdHIgKyAxOwogICAgICAgICB9CiAgICAgICB9CiAKQEAgLTQ5MCw3ICs0OTAsNyBAQAogICB9CiAgIGVsc2UgewogICAgIGZyZWUocHAtPnNlbmR0aGlzKTsKLSAgICBwcC0+c2VuZHRoaXM9TlVMTDsKKyAgICBwcC0+c2VuZHRoaXMgPSBOVUxMOwogICAgIHBwLT5zZW5kbGVmdCA9IHBwLT5zZW5kc2l6ZSA9IDA7CiAgICAgcHAtPnJlc3BvbnNlID0gQ3VybF90dm5vdygpOwogICB9CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9waW5ncG9uZy5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvcGluZ3BvbmcuaAppbmRleCBlZTFhNTliLi5hMmM4ZmY1IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9waW5ncG9uZy5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Bpbmdwb25nLmgKQEAgLTU4LDcgKzU4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciAqLwogICBzaXplX3Qgc2VuZGxlZnQ7IC8qIG51bWJlciBvZiBieXRlcyBsZWZ0IHRvIHNlbmQgZnJvbSB0aGUgc2VuZHRoaXMgYnVmZmVyICovCiAgIHNpemVfdCBzZW5kc2l6ZTsgLyogdG90YWwgc2l6ZSBvZiB0aGUgc2VuZHRoaXMgYnVmZmVyICovCi0gIHN0cnVjdCB0aW1ldmFsIHJlc3BvbnNlOyAvKiBzZXQgdG8gQ3VybF90dm5vdygpIHdoZW4gYSBjb21tYW5kIGhhcyBiZWVuIHNlbnQKKyAgc3RydWN0IGN1cmx0aW1lIHJlc3BvbnNlOyAvKiBzZXQgdG8gQ3VybF90dm5vdygpIHdoZW4gYSBjb21tYW5kIGhhcyBiZWVuIHNlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiwgdXNlZCB0byB0aW1lLW91dCByZXNwb25zZSByZWFkaW5nICovCiAgIGxvbmcgcmVzcG9uc2VfdGltZTsgLyogV2hlbiBubyB0aW1lb3V0IGlzIGdpdmVuLCB0aGlzIGlzIHRoZSBhbW91bnQgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHMgd2UgYXdhaXQgZm9yIGEgc2VydmVyIHJlc3BvbnNlLiAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvcGlwZWxpbmUuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3BpcGVsaW5lLmMKaW5kZXggYjhkMjAzNy4uNGQ0MWIwNCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvcGlwZWxpbmUuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9waXBlbGluZS5jCkBAIC0yMzAsMjggKzIzMCwyNyBAQAogICByZXR1cm4gQ1VSTE1fT0s7CiB9CiAKK3N0cnVjdCBibGFja2xpc3Rfbm9kZSB7CisgIHN0cnVjdCBjdXJsX2xsaXN0X2VsZW1lbnQgbGlzdDsKKyAgY2hhciBzZXJ2ZXJfbmFtZVsxXTsKK307CisKIGJvb2wgQ3VybF9waXBlbGluZV9zZXJ2ZXJfYmxhY2tsaXN0ZWQoc3RydWN0IEN1cmxfZWFzeSAqaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzZXJ2ZXJfbmFtZSkKIHsKICAgaWYoaGFuZGxlLT5tdWx0aSAmJiBzZXJ2ZXJfbmFtZSkgewotICAgIHN0cnVjdCBjdXJsX2xsaXN0ICpibGFja2xpc3QgPQorICAgIHN0cnVjdCBjdXJsX2xsaXN0ICpsaXN0ID0KICAgICAgIEN1cmxfbXVsdGlfcGlwZWxpbmluZ19zZXJ2ZXJfYmwoaGFuZGxlLT5tdWx0aSk7CiAKLSAgICBpZihibGFja2xpc3QpIHsKLSAgICAgIHN0cnVjdCBjdXJsX2xsaXN0X2VsZW1lbnQgKmN1cnI7Ci0KLSAgICAgIGN1cnIgPSBibGFja2xpc3QtPmhlYWQ7Ci0gICAgICB3aGlsZShjdXJyKSB7Ci0gICAgICAgIGNoYXIgKmJsX3NlcnZlcl9uYW1lOwotCi0gICAgICAgIGJsX3NlcnZlcl9uYW1lID0gY3Vyci0+cHRyOwotICAgICAgICBpZihzdHJuY2FzZWNvbXBhcmUoYmxfc2VydmVyX25hbWUsIHNlcnZlcl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGJsX3NlcnZlcl9uYW1lKSkpIHsKLSAgICAgICAgICBpbmZvZihoYW5kbGUsICJTZXJ2ZXIgJXMgaXMgYmxhY2tsaXN0ZWRcbiIsIHNlcnZlcl9uYW1lKTsKLSAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBjdXJyID0gY3Vyci0+bmV4dDsKKyAgICBzdHJ1Y3QgY3VybF9sbGlzdF9lbGVtZW50ICplID0gbGlzdC0+aGVhZDsKKyAgICB3aGlsZShlKSB7CisgICAgICBzdHJ1Y3QgYmxhY2tsaXN0X25vZGUgKmJsID0gKHN0cnVjdCBibGFja2xpc3Rfbm9kZSAqKWU7CisgICAgICBpZihzdHJuY2FzZWNvbXBhcmUoYmwtPnNlcnZlcl9uYW1lLCBzZXJ2ZXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oYmwtPnNlcnZlcl9uYW1lKSkpIHsKKyAgICAgICAgaW5mb2YoaGFuZGxlLCAiU2VydmVyICVzIGlzIGJsYWNrbGlzdGVkXG4iLCBzZXJ2ZXJfbmFtZSk7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgfQorICAgICAgZSA9IGUtPm5leHQ7CiAgICAgfQogCiAgICAgREVCVUdGKGluZm9mKGhhbmRsZSwgIlNlcnZlciAlcyBpcyBub3QgYmxhY2tsaXN0ZWRcbiIsIHNlcnZlcl9uYW1lKSk7CkBAIC0yNTksMTEgKzI1OCw2IEBACiAgIHJldHVybiBGQUxTRTsKIH0KIAotc3RydWN0IGJsYWNrbGlzdF9ub2RlIHsKLSAgc3RydWN0IGN1cmxfbGxpc3RfZWxlbWVudCBsaXN0OwotICBjaGFyIHNlcnZlcl9uYW1lWzFdOwotfTsKLQogQ1VSTE1jb2RlIEN1cmxfcGlwZWxpbmVfc2V0X3NlcnZlcl9ibGFja2xpc3QoY2hhciAqKnNlcnZlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY3VybF9sbGlzdCAqbGlzdCkKIHsKQEAgLTI4Niw4ICsyODAsNyBAQAogICAgICAgfQogICAgICAgc3RyY3B5KG4tPnNlcnZlcl9uYW1lLCAqc2VydmVycyk7CiAKLSAgICAgIEN1cmxfbGxpc3RfaW5zZXJ0X25leHQobGlzdCwgbGlzdC0+dGFpbCwgbi0+c2VydmVyX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuLT5saXN0KTsKKyAgICAgIEN1cmxfbGxpc3RfaW5zZXJ0X25leHQobGlzdCwgbGlzdC0+dGFpbCwgbiwgJm4tPmxpc3QpOwogICAgICAgc2VydmVycysrOwogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvcG9wMy5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvcG9wMy5jCmluZGV4IDNmZWIzYmUuLjU3OTJhNGEgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3BvcDMuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9wb3AzLmMKQEAgLTEyNSw2ICsxMjUsNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIHBvcDNfZGlzY29ubmVjdCwgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9QT1AzLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX1BPUDMsICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfQ0xPU0VBQ1RJT04gfCBQUk9UT1BUX05PVVJMUVVFUlkgfCAvKiBmbGFncyAqLwpAQCAtMTUxLDYgKzE1Miw3IEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgcG9wM19kaXNjb25uZWN0LCAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICBQT1JUX1BPUDNTLCAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fUE9QM1MsICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9DTE9TRUFDVElPTiB8IFBST1RPUFRfU1NMCkBAIC0xNTgsNTggKzE2MCw2IEBACiB9OwogI2VuZGlmCiAKLSNpZm5kZWYgQ1VSTF9ESVNBQkxFX0hUVFAKLS8qCi0gKiBIVFRQLXByb3h5ZWQgUE9QMyBwcm90b2NvbCBoYW5kbGVyLgotICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgQ3VybF9oYW5kbGVyIEN1cmxfaGFuZGxlcl9wb3AzX3Byb3h5ID0gewotICAiUE9QMyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjaGVtZSAqLwotICBDdXJsX2h0dHBfc2V0dXBfY29ubiwgICAgICAgICAgICAgICAgIC8qIHNldHVwX2Nvbm5lY3Rpb24gKi8KLSAgQ3VybF9odHRwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb19pdCAqLwotICBDdXJsX2h0dHBfZG9uZSwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb19tb3JlICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdF9pdCAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3RpbmcgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2luZyAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2luZ19nZXRzb2NrICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9tb3JlX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCi0gIFBPUlRfUE9QMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwotICBDVVJMUFJPVE9fSFRUUCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCi0gIFBST1RPUFRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8KLX07Ci0KLSNpZmRlZiBVU0VfU1NMCi0vKgotICogSFRUUC1wcm94eWVkIFBPUDNTIHByb3RvY29sIGhhbmRsZXIuCi0gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBDdXJsX2hhbmRsZXIgQ3VybF9oYW5kbGVyX3BvcDNzX3Byb3h5ID0gewotICAiUE9QM1MiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjaGVtZSAqLwotICBDdXJsX2h0dHBfc2V0dXBfY29ubiwgICAgICAgICAgICAgICAgIC8qIHNldHVwX2Nvbm5lY3Rpb24gKi8KLSAgQ3VybF9odHRwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb19pdCAqLwotICBDdXJsX2h0dHBfZG9uZSwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb19tb3JlICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdF9pdCAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3RpbmcgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2luZyAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2luZ19nZXRzb2NrICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9tb3JlX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCi0gIFBPUlRfUE9QM1MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwotICBDVVJMUFJPVE9fSFRUUCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCi0gIFBST1RPUFRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8KLX07Ci0jZW5kaWYKLSNlbmRpZgotCiAvKiBTQVNMIHBhcmFtZXRlcnMgZm9yIHRoZSBwb3AzIHByb3RvY29sICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IFNBU0xwcm90byBzYXNscG9wMyA9IHsKICAgInBvcCIsICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBzZXJ2aWNlIG5hbWUgKi8KQEAgLTEzNTUsMzEgKzEzMDUsNiBAQAogCiAgIC8qIENsZWFyIHRoZSBUTFMgdXBncmFkZWQgZmxhZyAqLwogICBjb25uLT50bHNfdXBncmFkZWQgPSBGQUxTRTsKLQotICAvKiBTZXQgdXAgdGhlIHByb3h5IGlmIG5lY2Vzc2FyeSAqLwotICBpZihjb25uLT5iaXRzLmh0dHBwcm94eSAmJiAhZGF0YS0+c2V0LnR1bm5lbF90aHJ1X2h0dHBwcm94eSkgewotICAgIC8qIFVubGVzcyB3ZSBoYXZlIGFza2VkIHRvIHR1bm5lbCBQT1AzIG9wZXJhdGlvbnMgdGhyb3VnaCB0aGUgcHJveHksIHdlCi0gICAgICAgc3dpdGNoIGFuZCB1c2UgSFRUUCBvcGVyYXRpb25zIG9ubHkgKi8KLSNpZm5kZWYgQ1VSTF9ESVNBQkxFX0hUVFAKLSAgICBpZihjb25uLT5oYW5kbGVyID09ICZDdXJsX2hhbmRsZXJfcG9wMykKLSAgICAgIGNvbm4tPmhhbmRsZXIgPSAmQ3VybF9oYW5kbGVyX3BvcDNfcHJveHk7Ci0gICAgZWxzZSB7Ci0jaWZkZWYgVVNFX1NTTAotICAgICAgY29ubi0+aGFuZGxlciA9ICZDdXJsX2hhbmRsZXJfcG9wM3NfcHJveHk7Ci0jZWxzZQotICAgICAgZmFpbGYoZGF0YSwgIlBPUDNTIG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgICByZXR1cm4gQ1VSTEVfVU5TVVBQT1JURURfUFJPVE9DT0w7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICAvKiBzZXQgaXQgdXAgYXMgYW4gSFRUUCBjb25uZWN0aW9uIGluc3RlYWQgKi8KLSAgICByZXR1cm4gY29ubi0+aGFuZGxlci0+c2V0dXBfY29ubmVjdGlvbihjb25uKTsKLSNlbHNlCi0gICAgZmFpbGYoZGF0YSwgIlBPUDMgb3ZlciBodHRwIHByb3h5IHJlcXVpcmVzIEhUVFAgc3VwcG9ydCBidWlsdC1pbiEiKTsKLSAgICByZXR1cm4gQ1VSTEVfVU5TVVBQT1JURURfUFJPVE9DT0w7Ci0jZW5kaWYKLSAgfQotCiAgIGRhdGEtPnN0YXRlLnBhdGgrKzsgICAvKiBkb24ndCBpbmNsdWRlIHRoZSBpbml0aWFsIHNsYXNoICovCiAKICAgcmV0dXJuIENVUkxFX09LOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvcHJvZ3Jlc3MuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Byb2dyZXNzLmMKaW5kZXggY2ZhZjQwNC4uMDA2MDlkOSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvcHJvZ3Jlc3MuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9wcm9ncmVzcy5jCkBAIC0xMzQsNyArMTM0LDcgQEAKIHsKICAgaW50IHJjOwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKLSAgZGF0YS0+cHJvZ3Jlc3MubGFzdHNob3c9MDsKKyAgZGF0YS0+cHJvZ3Jlc3MubGFzdHNob3cgPSAwOwogICByYyA9IEN1cmxfcGdyc1VwZGF0ZShjb25uKTsgLyogdGhlIGZpbmFsIChmb3JjZWQpIHVwZGF0ZSAqLwogICBpZihyYykKICAgICByZXR1cm4gcmM7CkBAIC0xNDksMjEgKzE0OSwyMCBAQAogICByZXR1cm4gMDsKIH0KIAotLyogcmVzZXQgYWxsIHRpbWVzIGV4Y2VwdCByZWRpcmVjdCwgYW5kIHJlc2V0IHRoZSBrbm93biB0cmFuc2ZlciBzaXplcyAqLwotdm9pZCBDdXJsX3BncnNSZXNldFRpbWVzU2l6ZXMoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKKy8qIHJlc2V0IHRoZSBrbm93biB0cmFuc2ZlciBzaXplcyAqLwordm9pZCBDdXJsX3BncnNSZXNldFRyYW5zZmVyU2l6ZXMoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKIHsKLSAgZGF0YS0+cHJvZ3Jlc3MudF9uc2xvb2t1cCA9IDAuMDsKLSAgZGF0YS0+cHJvZ3Jlc3MudF9jb25uZWN0ID0gMC4wOwotICBkYXRhLT5wcm9ncmVzcy50X3ByZXRyYW5zZmVyID0gMC4wOwotICBkYXRhLT5wcm9ncmVzcy50X3N0YXJ0dHJhbnNmZXIgPSAwLjA7Ci0KICAgQ3VybF9wZ3JzU2V0RG93bmxvYWRTaXplKGRhdGEsIC0xKTsKICAgQ3VybF9wZ3JzU2V0VXBsb2FkU2l6ZShkYXRhLCAtMSk7CiB9CiAKKy8qCisgKiBAdW5pdHRlc3Q6IDEzOTkKKyAqLwogdm9pZCBDdXJsX3BncnNUaW1lKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsIHRpbWVyaWQgdGltZXIpCiB7Ci0gIHN0cnVjdCB0aW1ldmFsIG5vdyA9IEN1cmxfdHZub3coKTsKKyAgc3RydWN0IGN1cmx0aW1lIG5vdyA9IEN1cmxfdHZub3coKTsKKyAgdGltZV90ICpkZWx0YSA9IE5VTEw7CiAKICAgc3dpdGNoKHRpbWVyKSB7CiAgIGRlZmF1bHQ6CkBAIC0xNzcsNDUgKzE3Niw1OCBAQAogICBjYXNlIFRJTUVSX1NUQVJUU0lOR0xFOgogICAgIC8qIFRoaXMgaXMgc2V0IGF0IHRoZSBzdGFydCBvZiBlYWNoIHNpbmdsZSBmZXRjaCAqLwogICAgIGRhdGEtPnByb2dyZXNzLnRfc3RhcnRzaW5nbGUgPSBub3c7CisgICAgZGF0YS0+cHJvZ3Jlc3MuaXNfdF9zdGFydHJhbnNmZXJfc2V0ID0gZmFsc2U7CiAgICAgYnJlYWs7Ci0KICAgY2FzZSBUSU1FUl9TVEFSVEFDQ0VQVDoKLSAgICBkYXRhLT5wcm9ncmVzcy50X2FjY2VwdGRhdGEgPSBDdXJsX3R2bm93KCk7CisgICAgZGF0YS0+cHJvZ3Jlc3MudF9hY2NlcHRkYXRhID0gbm93OwogICAgIGJyZWFrOwotCiAgIGNhc2UgVElNRVJfTkFNRUxPT0tVUDoKLSAgICBkYXRhLT5wcm9ncmVzcy50X25zbG9va3VwID0KLSAgICAgIEN1cmxfdHZkaWZmX3NlY3Mobm93LCBkYXRhLT5wcm9ncmVzcy50X3N0YXJ0c2luZ2xlKTsKKyAgICBkZWx0YSA9ICZkYXRhLT5wcm9ncmVzcy50X25zbG9va3VwOwogICAgIGJyZWFrOwogICBjYXNlIFRJTUVSX0NPTk5FQ1Q6Ci0gICAgZGF0YS0+cHJvZ3Jlc3MudF9jb25uZWN0ID0KLSAgICAgIEN1cmxfdHZkaWZmX3NlY3Mobm93LCBkYXRhLT5wcm9ncmVzcy50X3N0YXJ0c2luZ2xlKTsKKyAgICBkZWx0YSA9ICZkYXRhLT5wcm9ncmVzcy50X2Nvbm5lY3Q7CiAgICAgYnJlYWs7CiAgIGNhc2UgVElNRVJfQVBQQ09OTkVDVDoKLSAgICBkYXRhLT5wcm9ncmVzcy50X2FwcGNvbm5lY3QgPQotICAgICAgQ3VybF90dmRpZmZfc2Vjcyhub3csIGRhdGEtPnByb2dyZXNzLnRfc3RhcnRzaW5nbGUpOworICAgIGRlbHRhID0gJmRhdGEtPnByb2dyZXNzLnRfYXBwY29ubmVjdDsKICAgICBicmVhazsKICAgY2FzZSBUSU1FUl9QUkVUUkFOU0ZFUjoKLSAgICBkYXRhLT5wcm9ncmVzcy50X3ByZXRyYW5zZmVyID0KLSAgICAgIEN1cmxfdHZkaWZmX3NlY3Mobm93LCBkYXRhLT5wcm9ncmVzcy50X3N0YXJ0c2luZ2xlKTsKKyAgICBkZWx0YSA9ICZkYXRhLT5wcm9ncmVzcy50X3ByZXRyYW5zZmVyOwogICAgIGJyZWFrOwogICBjYXNlIFRJTUVSX1NUQVJUVFJBTlNGRVI6Ci0gICAgZGF0YS0+cHJvZ3Jlc3MudF9zdGFydHRyYW5zZmVyID0KLSAgICAgIEN1cmxfdHZkaWZmX3NlY3Mobm93LCBkYXRhLT5wcm9ncmVzcy50X3N0YXJ0c2luZ2xlKTsKLSAgICBicmVhazsKKyAgICBkZWx0YSA9ICZkYXRhLT5wcm9ncmVzcy50X3N0YXJ0dHJhbnNmZXI7CisgICAgLyogcHJldmVudCB1cGRhdGluZyB0X3N0YXJ0dHJhbnNmZXIgdW5sZXNzOgorICAgICAqICAgMSkgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSdyZSBzZXR0aW5nIHRfc3RhcnR0cmFuc2ZlcgorICAgICAqICAgMikgYSByZWRpcmVjdCBoYXMgb2NjdXJyZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0X3N0YXJ0dHJhbnNmZXIgd2FzIHNldAorICAgICAqIFRoaXMgcHJldmVudHMgcmVwZWF0ZWQgaW52b2NhdGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGZyb20gaW5jb3JyZWN0bHkKKyAgICAgKiBjaGFuZ2luZyB0aGUgdF9zdGFydHRyYW5zZmVyIHRpbWUuCisgICAgICovCisgICAgaWYoZGF0YS0+cHJvZ3Jlc3MuaXNfdF9zdGFydHJhbnNmZXJfc2V0KSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgeworICAgICAgZGF0YS0+cHJvZ3Jlc3MuaXNfdF9zdGFydHJhbnNmZXJfc2V0ID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgY2FzZSBUSU1FUl9QT1NUUkFOU0ZFUjoKICAgICAvKiB0aGlzIGlzIHRoZSBub3JtYWwgZW5kLW9mLXRyYW5zZmVyIHRoaW5nICovCiAgICAgYnJlYWs7CiAgIGNhc2UgVElNRVJfUkVESVJFQ1Q6Ci0gICAgZGF0YS0+cHJvZ3Jlc3MudF9yZWRpcmVjdCA9IEN1cmxfdHZkaWZmX3NlY3Mobm93LCBkYXRhLT5wcm9ncmVzcy5zdGFydCk7CisgICAgZGF0YS0+cHJvZ3Jlc3MudF9yZWRpcmVjdCA9IEN1cmxfdHZkaWZmX3VzKG5vdywgZGF0YS0+cHJvZ3Jlc3Muc3RhcnQpOwogICAgIGJyZWFrOwogICB9CisgIGlmKGRlbHRhKSB7CisgICAgdGltZV90IHVzID0gQ3VybF90dmRpZmZfdXMobm93LCBkYXRhLT5wcm9ncmVzcy50X3N0YXJ0c2luZ2xlKTsKKyAgICBpZighdXMpCisgICAgICB1cysrOyAvKiBtYWtlIHN1cmUgYXQgbGVhc3Qgb25lIG1pY3Jvc2Vjb25kIHBhc3NlZCAqLworICAgICpkZWx0YSArPSB1czsKKyAgfQogfQogCiB2b2lkIEN1cmxfcGdyc1N0YXJ0Tm93KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCiB7CiAgIGRhdGEtPnByb2dyZXNzLnNwZWVkZXJfYyA9IDA7IC8qIHJlc2V0IHRoZSBwcm9ncmVzcyBtZXRlciBkaXNwbGF5ICovCiAgIGRhdGEtPnByb2dyZXNzLnN0YXJ0ID0gQ3VybF90dm5vdygpOworICBkYXRhLT5wcm9ncmVzcy5pc190X3N0YXJ0cmFuc2Zlcl9zZXQgPSBmYWxzZTsKICAgZGF0YS0+cHJvZ3Jlc3MudWxfbGltaXRfc3RhcnQudHZfc2VjID0gMDsKICAgZGF0YS0+cHJvZ3Jlc3MudWxfbGltaXRfc3RhcnQudHZfdXNlYyA9IDA7CiAgIGRhdGEtPnByb2dyZXNzLmRsX2xpbWl0X3N0YXJ0LnR2X3NlYyA9IDA7CkBAIC0yNDYsOCArMjU4LDggQEAKIGxvbmcgQ3VybF9wZ3JzTGltaXRXYWl0VGltZShjdXJsX29mZl90IGN1cnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9vZmZfdCBzdGFydHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9vZmZfdCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCBub3cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGN1cmx0aW1lIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjdXJsdGltZSBub3cpCiB7CiAgIGN1cmxfb2ZmX3Qgc2l6ZSA9IGN1cnNpemUgLSBzdGFydHNpemU7CiAgIHRpbWVfdCBtaW5pbXVtOwpAQCAtMjczLDcgKzI4NSw3IEBACiAKIHZvaWQgQ3VybF9wZ3JzU2V0RG93bmxvYWRDb3VudGVyKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsIGN1cmxfb2ZmX3Qgc2l6ZSkKIHsKLSAgc3RydWN0IHRpbWV2YWwgbm93ID0gQ3VybF90dm5vdygpOworICBzdHJ1Y3QgY3VybHRpbWUgbm93ID0gQ3VybF90dm5vdygpOwogCiAgIGRhdGEtPnByb2dyZXNzLmRvd25sb2FkZWQgPSBzaXplOwogCkBAIC0yOTEsNyArMzAzLDcgQEAKIAogdm9pZCBDdXJsX3BncnNTZXRVcGxvYWRDb3VudGVyKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsIGN1cmxfb2ZmX3Qgc2l6ZSkKIHsKLSAgc3RydWN0IHRpbWV2YWwgbm93ID0gQ3VybF90dm5vdygpOworICBzdHJ1Y3QgY3VybHRpbWUgbm93ID0gQ3VybF90dm5vdygpOwogCiAgIGRhdGEtPnByb2dyZXNzLnVwbG9hZGVkID0gc2l6ZTsKIApAQCAtMzM3LDEyICszNDksMTIgQEAKICAqLwogaW50IEN1cmxfcGdyc1VwZGF0ZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCiB7Ci0gIHN0cnVjdCB0aW1ldmFsIG5vdzsKKyAgc3RydWN0IGN1cmx0aW1lIG5vdzsKICAgaW50IHJlc3VsdDsKICAgY2hhciBtYXg1WzZdWzEwXTsKLSAgY3VybF9vZmZfdCBkbHBlcmNlbj0wOwotICBjdXJsX29mZl90IHVscGVyY2VuPTA7Ci0gIGN1cmxfb2ZmX3QgdG90YWxfcGVyY2VuPTA7CisgIGN1cmxfb2ZmX3QgZGxwZXJjZW4gPSAwOworICBjdXJsX29mZl90IHVscGVyY2VuID0gMDsKKyAgY3VybF9vZmZfdCB0b3RhbF9wZXJjZW4gPSAwOwogICBjdXJsX29mZl90IHRvdGFsX3RyYW5zZmVyOwogICBjdXJsX29mZl90IHRvdGFsX2V4cGVjdGVkX3RyYW5zZmVyOwogICBjdXJsX29mZl90IHRpbWVzcGVudDsKQEAgLTM1MywyNiArMzY1LDI2IEBACiAgIGNoYXIgdGltZV9sZWZ0WzEwXTsKICAgY2hhciB0aW1lX3RvdGFsWzEwXTsKICAgY2hhciB0aW1lX3NwZW50WzEwXTsKLSAgY3VybF9vZmZfdCB1bGVzdGltYXRlPTA7Ci0gIGN1cmxfb2ZmX3QgZGxlc3RpbWF0ZT0wOworICBjdXJsX29mZl90IHVsZXN0aW1hdGUgPSAwOworICBjdXJsX29mZl90IGRsZXN0aW1hdGUgPSAwOwogICBjdXJsX29mZl90IHRvdGFsX2VzdGltYXRlOwotICBib29sIHNob3dub3c9RkFMU0U7CisgIGJvb2wgc2hvd25vdyA9IEZBTFNFOwogCiAgIG5vdyA9IEN1cmxfdHZub3coKTsgLyogd2hhdCB0aW1lIGlzIGl0ICovCiAKICAgLyogVGhlIHRpbWUgc3BlbnQgc28gZmFyIChmcm9tIHRoZSBzdGFydCkgKi8KLSAgZGF0YS0+cHJvZ3Jlc3MudGltZXNwZW50ID0gY3VybHhfdHZkaWZmX3NlY3Mobm93LCBkYXRhLT5wcm9ncmVzcy5zdGFydCk7Ci0gIHRpbWVzcGVudCA9IChjdXJsX29mZl90KWRhdGEtPnByb2dyZXNzLnRpbWVzcGVudDsKKyAgZGF0YS0+cHJvZ3Jlc3MudGltZXNwZW50ID0gQ3VybF90dmRpZmZfdXMobm93LCBkYXRhLT5wcm9ncmVzcy5zdGFydCk7CisgIHRpbWVzcGVudCA9IChjdXJsX29mZl90KWRhdGEtPnByb2dyZXNzLnRpbWVzcGVudC8xMDAwMDAwOyAvKiBzZWNvbmRzICovCiAKICAgLyogVGhlIGF2ZXJhZ2UgZG93bmxvYWQgc3BlZWQgdGhpcyBmYXIgKi8KICAgZGF0YS0+cHJvZ3Jlc3MuZGxzcGVlZCA9IChjdXJsX29mZl90KQotICAgICgoZG91YmxlKWRhdGEtPnByb2dyZXNzLmRvd25sb2FkZWQvCi0gICAgIChkYXRhLT5wcm9ncmVzcy50aW1lc3BlbnQ+MD9kYXRhLT5wcm9ncmVzcy50aW1lc3BlbnQ6MSkpOworICAgIChkYXRhLT5wcm9ncmVzcy5kb3dubG9hZGVkLworICAgICAodGltZXNwZW50PjA/dGltZXNwZW50OjEpKTsKIAogICAvKiBUaGUgYXZlcmFnZSB1cGxvYWQgc3BlZWQgdGhpcyBmYXIgKi8KICAgZGF0YS0+cHJvZ3Jlc3MudWxzcGVlZCA9IChjdXJsX29mZl90KQotICAgICgoZG91YmxlKWRhdGEtPnByb2dyZXNzLnVwbG9hZGVkLwotICAgICAoZGF0YS0+cHJvZ3Jlc3MudGltZXNwZW50PjA/ZGF0YS0+cHJvZ3Jlc3MudGltZXNwZW50OjEpKTsKKyAgICAoZGF0YS0+cHJvZ3Jlc3MudXBsb2FkZWQvCisgICAgICh0aW1lc3BlbnQ+MD90aW1lc3BlbnQ6MSkpOwogCiAgIC8qIENhbGN1bGF0aW9ucyBkb25lIGF0IG1vc3Qgb25jZSBhIHNlY29uZCwgdW5sZXNzIGVuZCBpcyByZWFjaGVkICovCiAgIGlmKGRhdGEtPnByb2dyZXNzLmxhc3RzaG93ICE9IG5vdy50dl9zZWMpIHsKQEAgLTM4MCwxMSArMzkyLDEwIEBACiAKICAgICBkYXRhLT5wcm9ncmVzcy5sYXN0c2hvdyA9IG5vdy50dl9zZWM7CiAKLSAgICAvKiBMZXQncyBkbyB0aGUgImN1cnJlbnQgc3BlZWQiIHRoaW5nLCB3aGljaCBzaG91bGQgdXNlIHRoZSBmYXN0ZXN0Ci0gICAgICAgb2YgdGhlIGRsL3VsIHNwZWVkcy4gU3RvcmUgdGhlIGZhc3RlciBzcGVlZCBhdCBlbnRyeSAnbm93aW5kZXgnLiAqLworICAgIC8qIExldCdzIGRvIHRoZSAiY3VycmVudCBzcGVlZCIgdGhpbmcsIHdpdGggdGhlIGRsICsgdWwgc3BlZWRzCisgICAgICAgY29tYmluZWQuIFN0b3JlIHRoZSBzcGVlZCBhdCBlbnRyeSAnbm93aW5kZXgnLiAqLwogICAgIGRhdGEtPnByb2dyZXNzLnNwZWVkZXJbIG5vd2luZGV4IF0gPQotICAgICAgZGF0YS0+cHJvZ3Jlc3MuZG93bmxvYWRlZD5kYXRhLT5wcm9ncmVzcy51cGxvYWRlZD8KLSAgICAgIGRhdGEtPnByb2dyZXNzLmRvd25sb2FkZWQ6ZGF0YS0+cHJvZ3Jlc3MudXBsb2FkZWQ7CisgICAgICBkYXRhLT5wcm9ncmVzcy5kb3dubG9hZGVkICsgZGF0YS0+cHJvZ3Jlc3MudXBsb2FkZWQ7CiAKICAgICAvKiByZW1lbWJlciB0aGUgZXhhY3QgdGltZSBmb3IgdGhpcyBtb21lbnQgKi8KICAgICBkYXRhLT5wcm9ncmVzcy5zcGVlZGVyX3RpbWUgWyBub3dpbmRleCBdID0gbm93OwpAQCAtMzk3LDcgKzQwOCw3IEBACiAgICAgICAgYXJyYXkuIFdpdGggTl9FTlRSSUVTIGZpbGxlZCBpbiwgd2UgaGF2ZSBhYm91dCBOX0VOVFJJRVMtMSBzZWNvbmRzIG9mCiAgICAgICAgdHJhbnNmZXIuIEltYWdpbmUsIGFmdGVyIG9uZSBzZWNvbmQgd2UgaGF2ZSBmaWxsZWQgaW4gdHdvIGVudHJpZXMsCiAgICAgICAgYWZ0ZXIgdHdvIHNlY29uZHMgd2UndmUgZmlsbGVkIGluIHRocmVlIGVudHJpZXMgZXRjLiAqLwotICAgIGNvdW50aW5kZXggPSAoKGRhdGEtPnByb2dyZXNzLnNwZWVkZXJfYz49Q1VSUl9USU1FKT8KKyAgICBjb3VudGluZGV4ID0gKChkYXRhLT5wcm9ncmVzcy5zcGVlZGVyX2MgPj0gQ1VSUl9USU1FKT8KICAgICAgICAgICAgICAgICAgIENVUlJfVElNRTpkYXRhLT5wcm9ncmVzcy5zcGVlZGVyX2MpIC0gMTsKIAogICAgIC8qIGZpcnN0IG9mIGFsbCwgd2UgZG9uJ3QgZG8gdGhpcyBpZiB0aGVyZSdzIG5vIGNvdW50ZWQgc2Vjb25kcyB5ZXQgKi8KQEAgLTQwNywxNCArNDE4LDE0IEBACiAgICAgICAvKiBHZXQgdGhlIGluZGV4IHBvc2l0aW9uIHRvIGNvbXBhcmUgd2l0aCB0aGUgJ25vd2luZGV4JyBwb3NpdGlvbi4KICAgICAgICAgIEdldCB0aGUgb2xkZXN0IGVudHJ5IHBvc3NpYmxlLiBXaGlsZSB3ZSBoYXZlIGxlc3MgdGhhbiBDVVJSX1RJTUUKICAgICAgICAgIGVudHJpZXMsIHRoZSBmaXJzdCBlbnRyeSB3aWxsIHJlbWFpbiB0aGUgb2xkZXN0LiAqLwotICAgICAgY2hlY2tpbmRleCA9IChkYXRhLT5wcm9ncmVzcy5zcGVlZGVyX2M+PUNVUlJfVElNRSk/CisgICAgICBjaGVja2luZGV4ID0gKGRhdGEtPnByb2dyZXNzLnNwZWVkZXJfYyA+PSBDVVJSX1RJTUUpPwogICAgICAgICBkYXRhLT5wcm9ncmVzcy5zcGVlZGVyX2MlQ1VSUl9USU1FOjA7CiAKICAgICAgIC8qIEZpZ3VyZSBvdXQgdGhlIGV4YWN0IHRpbWUgZm9yIHRoZSB0aW1lIHNwYW4gKi8KICAgICAgIHNwYW5fbXMgPSBDdXJsX3R2ZGlmZihub3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+cHJvZ3Jlc3Muc3BlZWRlcl90aW1lW2NoZWNraW5kZXhdKTsKICAgICAgIGlmKDAgPT0gc3Bhbl9tcykKLSAgICAgICAgc3Bhbl9tcz0xOyAvKiBhdCBsZWFzdCBvbmUgbWlsbGlzZWNvbmQgTVVTVCBoYXZlIHBhc3NlZCAqLworICAgICAgICBzcGFuX21zID0gMTsgLyogYXQgbGVhc3Qgb25lIG1pbGxpc2Vjb25kIE1VU1QgaGF2ZSBwYXNzZWQgKi8KIAogICAgICAgLyogQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIHNwZWVkIHRoZSBsYXN0ICdzcGFuX21zJyBtaWxsaXNlY29uZHMgKi8KICAgICAgIHsKQEAgLTQzMywxMCArNDQ0LDkgQEAKICAgICAgIH0KICAgICB9CiAgICAgZWxzZQotICAgICAgLyogdGhlIGZpcnN0IHNlY29uZCB3ZSB1c2UgdGhlIG1haW4gYXZlcmFnZSAqLworICAgICAgLyogdGhlIGZpcnN0IHNlY29uZCB3ZSB1c2UgdGhlIGF2ZXJhZ2UgKi8KICAgICAgIGRhdGEtPnByb2dyZXNzLmN1cnJlbnRfc3BlZWQgPQotICAgICAgICAoZGF0YS0+cHJvZ3Jlc3MudWxzcGVlZD5kYXRhLT5wcm9ncmVzcy5kbHNwZWVkKT8KLSAgICAgICAgZGF0YS0+cHJvZ3Jlc3MudWxzcGVlZDpkYXRhLT5wcm9ncmVzcy5kbHNwZWVkOworICAgICAgICBkYXRhLT5wcm9ncmVzcy51bHNwZWVkICsgZGF0YS0+cHJvZ3Jlc3MuZGxzcGVlZDsKIAogICB9IC8qIENhbGN1bGF0aW9ucyBlbmQgKi8KIApAQCAtNDQ1LDIyICs0NTUsMjIgQEAKIAogICAgIGlmKGRhdGEtPnNldC5meGZlcmluZm8pIHsKICAgICAgIC8qIFRoZXJlJ3MgYSBjYWxsYmFjayBzZXQsIGNhbGwgdGhhdCAqLwotICAgICAgcmVzdWx0PSBkYXRhLT5zZXQuZnhmZXJpbmZvKGRhdGEtPnNldC5wcm9ncmVzc19jbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+cHJvZ3Jlc3Muc2l6ZV9kbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5wcm9ncmVzcy5kb3dubG9hZGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnByb2dyZXNzLnNpemVfdWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+cHJvZ3Jlc3MudXBsb2FkZWQpOworICAgICAgcmVzdWx0ID0gZGF0YS0+c2V0LmZ4ZmVyaW5mbyhkYXRhLT5zZXQucHJvZ3Jlc3NfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5wcm9ncmVzcy5zaXplX2RsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5wcm9ncmVzcy5kb3dubG9hZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5wcm9ncmVzcy5zaXplX3VsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5wcm9ncmVzcy51cGxvYWRlZCk7CiAgICAgICBpZihyZXN1bHQpCiAgICAgICAgIGZhaWxmKGRhdGEsICJDYWxsYmFjayBhYm9ydGVkIik7CiAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KICAgICBpZihkYXRhLT5zZXQuZnByb2dyZXNzKSB7CiAgICAgICAvKiBUaGUgb2xkZXIgZGVwcmVjYXRlZCBjYWxsYmFjayBpcyBzZXQsIGNhbGwgdGhhdCAqLwotICAgICAgcmVzdWx0PSBkYXRhLT5zZXQuZnByb2dyZXNzKGRhdGEtPnNldC5wcm9ncmVzc19jbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlkYXRhLT5wcm9ncmVzcy5zaXplX2RsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpZGF0YS0+cHJvZ3Jlc3MuZG93bmxvYWRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKWRhdGEtPnByb2dyZXNzLnNpemVfdWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlkYXRhLT5wcm9ncmVzcy51cGxvYWRlZCk7CisgICAgICByZXN1bHQgPSBkYXRhLT5zZXQuZnByb2dyZXNzKGRhdGEtPnNldC5wcm9ncmVzc19jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpZGF0YS0+cHJvZ3Jlc3Muc2l6ZV9kbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlkYXRhLT5wcm9ncmVzcy5kb3dubG9hZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKWRhdGEtPnByb2dyZXNzLnNpemVfdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpZGF0YS0+cHJvZ3Jlc3MudXBsb2FkZWQpOwogICAgICAgaWYocmVzdWx0KQogICAgICAgICBmYWlsZihkYXRhLCAiQ2FsbGJhY2sgYWJvcnRlZCIpOwogICAgICAgcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Byb2dyZXNzLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9wcm9ncmVzcy5oCmluZGV4IDE1NWZmMDQuLjkzMzNhYjIgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Byb2dyZXNzLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvcHJvZ3Jlc3MuaApAQCAtNyw3ICs3LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE0LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtNDcsMTMgKzQ3LDEzIEBACiB2b2lkIEN1cmxfcGdyc1NldERvd25sb2FkQ291bnRlcihzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCBjdXJsX29mZl90IHNpemUpOwogdm9pZCBDdXJsX3BncnNTZXRVcGxvYWRDb3VudGVyKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsIGN1cmxfb2ZmX3Qgc2l6ZSk7CiBpbnQgQ3VybF9wZ3JzVXBkYXRlKHN0cnVjdCBjb25uZWN0ZGF0YSAqKTsKLXZvaWQgQ3VybF9wZ3JzUmVzZXRUaW1lc1NpemVzKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpOwordm9pZCBDdXJsX3BncnNSZXNldFRyYW5zZmVyU2l6ZXMoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSk7CiB2b2lkIEN1cmxfcGdyc1RpbWUoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgdGltZXJpZCB0aW1lcik7CiBsb25nIEN1cmxfcGdyc0xpbWl0V2FpdFRpbWUoY3VybF9vZmZfdCBjdXJzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfb2ZmX3Qgc3RhcnRzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfb2ZmX3QgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgbm93KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY3VybHRpbWUgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGN1cmx0aW1lIG5vdyk7CiAKIC8qIERvbid0IHNob3cgcHJvZ3Jlc3MgZm9yIHNpemVzIHNtYWxsZXIgdGhhbjogKi8KICNkZWZpbmUgTEVBU1RfU0laRV9QUk9HUkVTUyBCVUZTSVpFCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9yYW5kLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9yYW5kLmMKaW5kZXggYjZmNDBhYy4uMjcxM2EwYSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvcmFuZC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3JhbmQuYwpAQCAtODYsNyArODYsNyBAQAogI2VuZGlmCiAKICAgaWYoIXNlZWRlZCkgewotICAgIHN0cnVjdCB0aW1ldmFsIG5vdyA9IGN1cmx4X3R2bm93KCk7CisgICAgc3RydWN0IGN1cmx0aW1lIG5vdyA9IGN1cmx4X3R2bm93KCk7CiAgICAgaW5mb2YoZGF0YSwgIldBUk5JTkc6IFVzaW5nIHdlYWsgcmFuZG9tIHNlZWRcbiIpOwogICAgIHJhbmRzZWVkICs9ICh1bnNpZ25lZCBpbnQpbm93LnR2X3VzZWMgKyAodW5zaWduZWQgaW50KW5vdy50dl9zZWM7CiAgICAgcmFuZHNlZWQgPSByYW5kc2VlZCAqIDExMDM1MTUyNDUgKyAxMjM0NTsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3J0c3AuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3J0c3AuYwppbmRleCAxODEwY2RhLi45MjVkYTJjIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9ydHNwLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvcnRzcC5jCkBAIC04MSw2ICs4MSw5IEBACiAKIHN0YXRpYyBDVVJMY29kZSBydHNwX3NldHVwX2Nvbm5lY3Rpb24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKTsKIAorYm9vbCBydHNwX2Nvbm5pc2RlYWQoc3RydWN0IGNvbm5lY3RkYXRhICpjaGVjayk7CitzdGF0aWMgdW5zaWduZWQgaW50IHJ0c3BfY29ubmNoZWNrKHN0cnVjdCBjb25uZWN0ZGF0YSAqY2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjaGVja3NfdG9fcGVyZm9ybSk7CiAKIC8qIHRoaXMgcmV0dXJucyB0aGUgc29ja2V0IHRvIHdhaXQgZm9yIGluIHRoZSBETyBhbmQgRE9JTkcgc3RhdGUgZm9yIHRoZSBtdWx0aQogICAgaW50ZXJmYWNlIGFuZCB0aGVuIHdlJ3JlIGFsd2F5cyBfc2VuZGluZ18gYSByZXF1ZXN0IGFuZCB0aHVzIHdlIHdhaXQgZm9yCkBAIC0xMTcsNiArMTIwLDcgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgcnRzcF9kaXNjb25uZWN0LCAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIHJ0c3BfcnRwX3JlYWR3cml0ZSwgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIHJ0c3BfY29ubmNoZWNrLCAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICBQT1JUX1JUU1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX1JUU1AsICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzICovCkBAIC0xNDMsNyArMTQ3LDcgQEAKICAqIEluc3RlYWQsIGlmIGl0IGlzIHJlYWRhYmxlLCBydW4gQ3VybF9jb25uYWxpdmUoKSB0byBwZWVrIGF0IHRoZSBzb2NrZXQKICAqIGFuZCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGNsb3NlZCBhbmQgZGF0YS4KICAqLwotYm9vbCBDdXJsX3J0c3BfY29ubmlzZGVhZChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNoZWNrKQorYm9vbCBydHNwX2Nvbm5pc2RlYWQoc3RydWN0IGNvbm5lY3RkYXRhICpjaGVjaykKIHsKICAgaW50IHN2YWw7CiAgIGJvb2wgcmV0X3ZhbCA9IFRSVUU7CkBAIC0xNjUsNiArMTY5LDIzIEBACiAgIHJldHVybiByZXRfdmFsOwogfQogCisvKgorICogRnVuY3Rpb24gdG8gY2hlY2sgb24gdmFyaW91cyBhc3BlY3RzIG9mIGEgY29ubmVjdGlvbi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBydHNwX2Nvbm5jaGVjayhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2hlY2tzX3RvX3BlcmZvcm0pCit7CisgIHVuc2lnbmVkIGludCByZXRfdmFsID0gQ09OTlJFU1VMVF9OT05FOworCisgIGlmKGNoZWNrc190b19wZXJmb3JtICYgQ09OTkNIRUNLX0lTREVBRCkgeworICAgIGlmKHJ0c3BfY29ubmlzZGVhZChjaGVjaykpCisgICAgICByZXRfdmFsIHw9IENPTk5SRVNVTFRfREVBRDsKKyAgfQorCisgIHJldHVybiByZXRfdmFsOworfQorCisKIHN0YXRpYyBDVVJMY29kZSBydHNwX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBib29sICpkb25lKQogewogICBDVVJMY29kZSBodHRwU3RhdHVzOwpAQCAtMjI5LDcgKzI1MCw3IEBACiBzdGF0aWMgQ1VSTGNvZGUgcnRzcF9kbyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGJvb2wgKmRvbmUpCiB7CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwotICBDVVJMY29kZSByZXN1bHQ9Q1VSTEVfT0s7CisgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOwogICBDdXJsX1J0c3BSZXEgcnRzcHJlcSA9IGRhdGEtPnNldC5ydHNwcmVxOwogICBzdHJ1Y3QgUlRTUCAqcnRzcCA9IGRhdGEtPnJlcS5wcm90b3A7CiAgIHN0cnVjdCBIVFRQICpodHRwOwpAQCAtNzI4LDE0ICs3NDksMjggQEAKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIHNpemVfdCB3cm90ZTsKICAgY3VybF93cml0ZV9jYWxsYmFjayB3cml0ZWl0OworICB2b2lkICp1c2VyX3B0cjsKIAogICBpZihsZW4gPT0gMCkgewogICAgIGZhaWxmKGRhdGEsICJDYW5ub3Qgd3JpdGUgYSAwIHNpemUgUlRQIHBhY2tldC4iKTsKICAgICByZXR1cm4gQ1VSTEVfV1JJVEVfRVJST1I7CiAgIH0KIAotICB3cml0ZWl0ID0gZGF0YS0+c2V0LmZ3cml0ZV9ydHA/ZGF0YS0+c2V0LmZ3cml0ZV9ydHA6ZGF0YS0+c2V0LmZ3cml0ZV9mdW5jOwotICB3cm90ZSA9IHdyaXRlaXQocHRyLCAxLCBsZW4sIGRhdGEtPnNldC5ydHBfb3V0KTsKKyAgLyogSWYgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgQ1VSTE9QVF9JTlRFUkxFQVZFRlVOQ1RJT04gdGhlbiB1c2UgdGhhdAorICAgICBmdW5jdGlvbiBhbmQgYW55IGNvbmZpZ3VyZWQgQ1VSTE9QVF9JTlRFUkxFQVZFREFUQSB0byB3cml0ZSBvdXQgdGhlIFJUUAorICAgICBkYXRhLiBPdGhlcndpc2UsIHVzZSB0aGUgQ1VSTE9QVF9XUklURUZVTkNUSU9OIHdpdGggdGhlIENVUkxPUFRfV1JJVEVEQVRBCisgICAgIHBvaW50ZXIgdG8gd3JpdGUgb3V0IHRoZSBSVFAgZGF0YS4gKi8KKyAgaWYoZGF0YS0+c2V0LmZ3cml0ZV9ydHApIHsKKyAgICB3cml0ZWl0ID0gZGF0YS0+c2V0LmZ3cml0ZV9ydHA7CisgICAgdXNlcl9wdHIgPSBkYXRhLT5zZXQucnRwX291dDsKKyAgfQorICBlbHNlCisgIHsKKyAgICB3cml0ZWl0ID0gZGF0YS0+c2V0LmZ3cml0ZV9mdW5jOworICAgIHVzZXJfcHRyID0gZGF0YS0+c2V0Lm91dDsKKyAgfQorCisgIHdyb3RlID0gd3JpdGVpdChwdHIsIDEsIGxlbiwgdXNlcl9wdHIpOwogCiAgIGlmKENVUkxfV1JJVEVGVU5DX1BBVVNFID09IHdyb3RlKSB7CiAgICAgZmFpbGYoZGF0YSwgIkNhbm5vdCBwYXVzZSBSVFAiKTsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3J0c3AuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3J0c3AuaAppbmRleCA1YThkNTU1Li44Mzc1YTUzIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9ydHNwLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvcnRzcC5oCkBAIC0yNSwxMyArMjUsMTEgQEAKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBDdXJsX2hhbmRsZXIgQ3VybF9oYW5kbGVyX3J0c3A7CiAKLWJvb2wgQ3VybF9ydHNwX2Nvbm5pc2RlYWQoc3RydWN0IGNvbm5lY3RkYXRhICpjaGVjayk7CiBDVVJMY29kZSBDdXJsX3J0c3BfcGFyc2VoZWFkZXIoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBjaGFyICpoZWFkZXIpOwogCiAjZWxzZQogLyogZGlzYWJsZWQgKi8KICNkZWZpbmUgQ3VybF9ydHNwX3BhcnNlaGVhZGVyKHgseSkgQ1VSTEVfTk9UX0JVSUxUX0lOCi0jZGVmaW5lIEN1cmxfcnRzcF9jb25uaXNkZWFkKHgpIFRSVUUKIAogI2VuZGlmIC8qIENVUkxfRElTQUJMRV9SVFNQICovCiAKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NlY3VyaXR5LmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zZWN1cml0eS5jCmluZGV4IGY0YTg3NjMuLmEyZTRhMzUgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NlY3VyaXR5LmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc2VjdXJpdHkuYwpAQCAtNyw3ICs3LDcgQEAKICAqIHJld3JpdGUgdG8gd29yayBhcm91bmQgdGhlIHBhcmFncmFwaCAyIGluIHRoZSBCU0QgbGljZW5zZXMgYXMgZXhwbGFpbmVkCiAgKiBiZWxvdy4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMTcgS3VuZ2xpZ2EgVGVrbmlza2EgSMO2Z3Nrb2xhbgogICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAxNSwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KQEAgLTExNSw3ICsxMTUsNyBAQAogc3RhdGljIGludCBmdHBfc2VuZF9jb21tYW5kKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKQogewogICBpbnQgZnRwX2NvZGU7Ci0gIHNzaXplX3QgbnJlYWQ9MDsKKyAgc3NpemVfdCBucmVhZCA9IDA7CiAgIHZhX2xpc3QgYXJnczsKICAgY2hhciBwcmludF9idWZmZXJbNTBdOwogCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zZWxlY3QuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3NlbGVjdC5jCmluZGV4IDQ0MzAwNzIuLmI4ZTE4NjggMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NlbGVjdC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3NlbGVjdC5jCkBAIC03OCw3ICs3OCw3IEBACiAjaWZuZGVmIEhBVkVfUE9MTF9GSU5FCiAgIHN0cnVjdCB0aW1ldmFsIHBlbmRpbmdfdHY7CiAjZW5kaWYKLSAgc3RydWN0IHRpbWV2YWwgaW5pdGlhbF90djsKKyAgc3RydWN0IGN1cmx0aW1lIGluaXRpYWxfdHY7CiAgIGludCBwZW5kaW5nX21zOwogICBpbnQgZXJyb3I7CiAjZW5kaWYKQEAgLTE1OCw3ICsxNTgsNyBAQAogICBmZF9zZXQgZmRzX2VycjsKICAgY3VybF9zb2NrZXRfdCBtYXhmZDsKICNlbmRpZgotICBzdHJ1Y3QgdGltZXZhbCBpbml0aWFsX3R2ID0gezAsIDB9OworICBzdHJ1Y3QgY3VybHRpbWUgaW5pdGlhbF90diA9IHswLCAwfTsKICAgaW50IHBlbmRpbmdfbXMgPSAwOwogICBpbnQgZXJyb3I7CiAgIGludCByOwpAQCAtMzk4LDcgKzM5OCw3IEBACiAgIGZkX3NldCBmZHNfZXJyOwogICBjdXJsX3NvY2tldF90IG1heGZkOwogI2VuZGlmCi0gIHN0cnVjdCB0aW1ldmFsIGluaXRpYWxfdHYgPSB7MCwgMH07CisgIHN0cnVjdCBjdXJsdGltZSBpbml0aWFsX3R2ID0gezAsIDB9OwogICBib29sIGZkc19ub25lID0gVFJVRTsKICAgdW5zaWduZWQgaW50IGk7CiAgIGludCBwZW5kaW5nX21zID0gMDsKQEAgLTU3MSw4ICs1NzEsOCBAQAogICoKICAqIFJldHVybiB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFzIHNlbGVjdCdzLgogICovCi1pbnQgdHBmX3NlbGVjdF9saWJjdXJsKGludCBtYXhmZHMsIGZkX3NldCogcmVhZHMsIGZkX3NldCogd3JpdGVzLAotICAgICAgICAgICAgICAgICAgICAgICBmZF9zZXQqIGV4Y2VwdHMsIHN0cnVjdCB0aW1ldmFsKiB0dikKK2ludCB0cGZfc2VsZWN0X2xpYmN1cmwoaW50IG1heGZkcywgZmRfc2V0ICpyZWFkcywgZmRfc2V0ICp3cml0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGZkX3NldCAqZXhjZXB0cywgc3RydWN0IHRpbWV2YWwgKnR2KQogewogICAgaW50IHJjOwogCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zZWxlY3QuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3NlbGVjdC5oCmluZGV4IDRlZDVkZDIuLjQzNTE3ODYgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NlbGVjdC5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3NlbGVjdC5oCkBAIC03LDcgKzcsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC0zNiw3ICszNiw4IEBACiAKICNpZiAhZGVmaW5lZChIQVZFX1NUUlVDVF9QT0xMRkQpICYmIFwKICAgICAhZGVmaW5lZChIQVZFX1NZU19QT0xMX0gpICYmIFwKLSAgICAhZGVmaW5lZChIQVZFX1BPTExfSCkKKyAgICAhZGVmaW5lZChIQVZFX1BPTExfSCkgJiYgXAorICAgICFkZWZpbmVkKFBPTExJTikKIAogI2RlZmluZSBQT0xMSU4gICAgICAweDAxCiAjZGVmaW5lIFBPTExQUkkgICAgIDB4MDIKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NlbmRmLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zZW5kZi5jCmluZGV4IDU5NWMzNjEuLjc1NjRjYjMgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NlbmRmLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc2VuZGYuYwpAQCAtNjMsNyArNjMsNyBAQAogICAgIGlmKCpzdGFydFB0ciA9PSAnXG4nKSB7CiAgICAgICAvKiBUaGlzIGJsb2NrIG9mIGluY29taW5nIGRhdGEgc3RhcnRzIHdpdGggdGhlCiAgICAgICAgICBwcmV2aW91cyBibG9jaydzIExGIHNvIGdldCByaWQgb2YgaXQgKi8KLSAgICAgIG1lbW1vdmUoc3RhcnRQdHIsIHN0YXJ0UHRyKzEsIHNpemUtMSk7CisgICAgICBtZW1tb3ZlKHN0YXJ0UHRyLCBzdGFydFB0ciArIDEsIHNpemUtMSk7CiAgICAgICBzaXplLS07CiAgICAgICAvKiBhbmQgaXQgd2Fzbid0IGEgYmFyZSBDUiBidXQgYSBDUkxGIGNvbnZlcnNpb24gaW5zdGVhZCAqLwogICAgICAgZGF0YS0+c3RhdGUuY3JsZl9jb252ZXJzaW9ucysrOwpAQCAtNzUsNyArNzUsNyBAQAogICBpblB0ciA9IG91dFB0ciA9IG1lbWNocihzdGFydFB0ciwgJ1xyJywgc2l6ZSk7CiAgIGlmKGluUHRyKSB7CiAgICAgLyogYXQgbGVhc3Qgb25lIENSLCBub3cgbG9vayBmb3IgQ1JMRiAqLwotICAgIHdoaWxlKGluUHRyIDwgKHN0YXJ0UHRyK3NpemUtMSkpIHsKKyAgICB3aGlsZShpblB0ciA8IChzdGFydFB0ciArIHNpemUtMSkpIHsKICAgICAgIC8qIG5vdGUgdGhhdCBpdCdzIHNpemUtMSwgc28gd2UnbGwgbmV2ZXIgbG9vayBwYXN0IHRoZSBsYXN0IGJ5dGUgKi8KICAgICAgIGlmKG1lbWNtcChpblB0ciwgIlxyXG4iLCAyKSA9PSAwKSB7CiAgICAgICAgIC8qIENSTEYgZm91bmQsIGJ1bXAgcGFzdCB0aGUgQ1IgYW5kIGNvcHkgdGhlIE5MICovCkBAIC05OCw3ICs5OCw3IEBACiAgICAgICBpblB0cisrOwogICAgIH0gLyogZW5kIG9mIHdoaWxlIGxvb3AgKi8KIAotICAgIGlmKGluUHRyIDwgc3RhcnRQdHIrc2l6ZSkgeworICAgIGlmKGluUHRyIDwgc3RhcnRQdHIgKyBzaXplKSB7CiAgICAgICAvKiBoYW5kbGUgbGFzdCBieXRlICovCiAgICAgICBpZigqaW5QdHIgPT0gJ1xyJykgewogICAgICAgICAvKiBkZWFsIHdpdGggYSBDUiBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KQEAgLTExMiw3ICsxMTIsNyBAQAogICAgICAgfQogICAgICAgb3V0UHRyKys7CiAgICAgfQotICAgIGlmKG91dFB0ciA8IHN0YXJ0UHRyK3NpemUpCisgICAgaWYob3V0UHRyIDwgc3RhcnRQdHIgKyBzaXplKQogICAgICAgLyogdGlkeSB1cCBieSBudWxsIHRlcm1pbmF0aW5nIHRoZSBub3cgc2hvcnRlciBkYXRhICovCiAgICAgICAqb3V0UHRyID0gJ1wwJzsKIApAQCAtMjc5LDcgKzI3OSw3IEBACiAgIGlmKCFzKQogICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOyAvKiBmYWlsdXJlICovCiAKLSAgYnl0ZXNfd3JpdHRlbj0wOworICBieXRlc193cml0dGVuID0gMDsKICAgd3JpdGVfbGVuID0gc3RybGVuKHMpOwogICBzcHRyID0gczsKIApAQCAtMzg3LDcgKzM4Nyw3IEBACiAjZW5kaWYKICAgICAgICkgewogICAgICAgLyogdGhpcyBpcyBqdXN0IGEgY2FzZSBvZiBFV09VTERCTE9DSyAqLwotICAgICAgYnl0ZXNfd3JpdHRlbj0wOworICAgICAgYnl0ZXNfd3JpdHRlbiA9IDA7CiAgICAgICAqY29kZSA9IENVUkxFX0FHQUlOOwogICAgIH0KICAgICBlbHNlIHsKQEAgLTQ4MCw3ICs0ODAsNyBAQAogICBib29sIG5ld3R5cGUgPSBUUlVFOwogCiAgIGlmKHMtPnRlbXBjb3VudCkgewotICAgIGZvcihpPTA7IGk8IHMtPnRlbXBjb3VudDsgaSsrKSB7CisgICAgZm9yKGkgPSAwOyBpPCBzLT50ZW1wY291bnQ7IGkrKykgewogICAgICAgaWYocy0+dGVtcHdyaXRlW2ldLnR5cGUgPT0gdHlwZSkgewogICAgICAgICAvKiBkYXRhIGZvciB0aGlzIHR5cGUgZXhpc3RzICovCiAgICAgICAgIG5ld3R5cGUgPSBGQUxTRTsKQEAgLTcwNCw3ICs3MDQsNyBAQAogICAgICB1cyB1c2UgdGhlIGNvcnJlY3Qgc3NsIGhhbmRsZS4gKi8KICAgaW50IG51bSA9IChzb2NrZmQgPT0gY29ubi0+c29ja1tTRUNPTkRBUllTT0NLRVRdKTsKIAotICAqbj0wOyAvKiByZXNldCBhbW91bnQgdG8gemVybyAqLworICAqbiA9IDA7IC8qIHJlc2V0IGFtb3VudCB0byB6ZXJvICovCiAKICAgLyogSWYgc2Vzc2lvbiBjYW4gcGlwZWxpbmUsIGNoZWNrIGNvbm5lY3Rpb24gYnVmZmVyICAqLwogICBpZihwaXBlbGluaW5nKSB7CkBAIC04MjMsOCArODIzLDggQEAKICAgaW50IHJjOwogICBpZihkYXRhLT5zZXQucHJpbnRob3N0ICYmIGNvbm4gJiYgY29ubi0+aG9zdC5kaXNwbmFtZSkgewogICAgIGNoYXIgYnVmZmVyWzE2MF07Ci0gICAgY29uc3QgY2hhciAqdD1OVUxMOwotICAgIGNvbnN0IGNoYXIgKnc9IkRhdGEiOworICAgIGNvbnN0IGNoYXIgKnQgPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKncgPSAiRGF0YSI7CiAgICAgc3dpdGNoKHR5cGUpIHsKICAgICBjYXNlIENVUkxJTkZPX0hFQURFUl9JTjoKICAgICAgIHcgPSAiSGVhZGVyIjsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NtYi5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc21iLmMKaW5kZXggNWIxZmZhOS4uMTNkZmQ1MSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc21iLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc21iLmMKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxwcm9jZXNzLmg+CiAjaWZkZWYgQ1VSTF9XSU5ET1dTX0FQUAogI2RlZmluZSBnZXRwaWQgR2V0Q3VycmVudFByb2Nlc3NJZAotI2Vsc2UKKyNlbGlmICFkZWZpbmVkKE1TRE9TKQogI2RlZmluZSBnZXRwaWQgX2dldHBpZAogI2VuZGlmCiAjZW5kaWYKQEAgLTg1LDYgKzg1LDcgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgc21iX2Rpc2Nvbm5lY3QsICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICBQT1JUX1NNQiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX1NNQiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzICovCkBAIC0xMDksNiArMTEwLDcgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgc21iX2Rpc2Nvbm5lY3QsICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICBQT1JUX1NNQlMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX1NNQlMsICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX1NTTCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzICovCkBAIC03MTMsNiArNzE1LDIzIEBACiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIAorLyoKKyAqIENvbnZlcnQgYSB0aW1lc3RhbXAgZnJvbSB0aGUgV2luZG93cyB3b3JsZCAoMTAwIG5zZWMgdW5pdHMgZnJvbQorICogMSBKYW4gMTYwMSkgdG8gUG9zaXggdGltZS4KKyAqLworc3RhdGljIHZvaWQgZ2V0X3Bvc2l4X3RpbWUobG9uZyAqX291dCwgY29uc3Qgdm9pZCAqX2luKQoreworI2lmZGVmIEhBVkVfTE9OR0xPTkcKKyAgbG9uZyBsb25nIHRpbWVzdGFtcCA9ICoobG9uZyBsb25nICopIF9pbjsKKyNlbHNlCisgIHVuc2lnbmVkIF9faW50NjQgdGltZXN0YW1wID0gKih1bnNpZ25lZCBfX2ludDY0ICopIF9pbjsKKyNlbmRpZgorCisgIHRpbWVzdGFtcCAtPSAxMTY0NDQ3MzYwMDAwMDAwMDBVTEw7CisgIHRpbWVzdGFtcCAvPSAxMDAwMDAwMDsKKyAgKl9vdXQgPSAobG9uZykgdGltZXN0YW1wOworfQorCiBzdGF0aWMgQ1VSTGNvZGUgc21iX3JlcXVlc3Rfc3RhdGUoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBib29sICpkb25lKQogewogICBzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSA9IGNvbm4tPmRhdGEtPnJlcS5wcm90b3A7CkBAIC03MjMsNiArNzQyLDcgQEAKICAgdW5zaWduZWQgc2hvcnQgb2ZmOwogICBDVVJMY29kZSByZXN1bHQ7CiAgIHZvaWQgKm1zZyA9IE5VTEw7CisgIGNvbnN0IHN0cnVjdCBzbWJfbnRfY3JlYXRlX3Jlc3BvbnNlICpzbWJfbTsKIAogICAvKiBTdGFydCB0aGUgcmVxdWVzdCAqLwogICBpZihyZXEtPnN0YXRlID09IFNNQl9SRVFVRVNUSU5HKSB7CkBAIC03NjUsNyArNzg1LDggQEAKICAgICAgIG5leHRfc3RhdGUgPSBTTUJfVFJFRV9ESVNDT05ORUNUOwogICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJlcS0+ZmlkID0gc21iX3N3YXAxNigoKHN0cnVjdCBzbWJfbnRfY3JlYXRlX3Jlc3BvbnNlICopbXNnKS0+ZmlkKTsKKyAgICBzbWJfbSA9IChjb25zdCBzdHJ1Y3Qgc21iX250X2NyZWF0ZV9yZXNwb25zZSopIG1zZzsKKyAgICByZXEtPmZpZCA9IHNtYl9zd2FwMTYoc21iX20tPmZpZCk7CiAgICAgY29ubi0+ZGF0YS0+cmVxLm9mZnNldCA9IDA7CiAgICAgaWYoY29ubi0+ZGF0YS0+c2V0LnVwbG9hZCkgewogICAgICAgY29ubi0+ZGF0YS0+cmVxLnNpemUgPSBjb25uLT5kYXRhLT5zdGF0ZS5pbmZpbGVzaXplOwpAQCAtNzczLDkgKzc5NCwxMSBAQAogICAgICAgbmV4dF9zdGF0ZSA9IFNNQl9VUExPQUQ7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgY29ubi0+ZGF0YS0+cmVxLnNpemUgPQotICAgICAgICBzbWJfc3dhcDY0KCgoc3RydWN0IHNtYl9udF9jcmVhdGVfcmVzcG9uc2UgKiltc2cpLT5lbmRfb2ZfZmlsZSk7CisgICAgICBzbWJfbSA9IChjb25zdCBzdHJ1Y3Qgc21iX250X2NyZWF0ZV9yZXNwb25zZSopIG1zZzsKKyAgICAgIGNvbm4tPmRhdGEtPnJlcS5zaXplID0gc21iX3N3YXA2NChzbWJfbS0+ZW5kX29mX2ZpbGUpOwogICAgICAgQ3VybF9wZ3JzU2V0RG93bmxvYWRTaXplKGNvbm4tPmRhdGEsIGNvbm4tPmRhdGEtPnJlcS5zaXplKTsKKyAgICAgIGlmKGNvbm4tPmRhdGEtPnNldC5nZXRfZmlsZXRpbWUpCisgICAgICAgIGdldF9wb3NpeF90aW1lKCZjb25uLT5kYXRhLT5pbmZvLmZpbGV0aW1lLCAmc21iX20tPmxhc3RfY2hhbmdlX3RpbWUpOwogICAgICAgbmV4dF9zdGF0ZSA9IFNNQl9ET1dOTE9BRDsKICAgICB9CiAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zbXRwLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zbXRwLmMKaW5kZXggZmUwNjRjYi4uZGUyZGQzMyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc210cC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3NtdHAuYwpAQCAtNjcsNiArNjcsNyBAQAogI2luY2x1ZGUgInRyYW5zZmVyLmgiCiAjaW5jbHVkZSAiZXNjYXBlLmgiCiAjaW5jbHVkZSAiaHR0cC5oIiAvKiBmb3IgSFRUUCBwcm94eSB0dW5uZWwgc3R1ZmYgKi8KKyNpbmNsdWRlICJtaW1lLmgiCiAjaW5jbHVkZSAic29ja3MuaCIKICNpbmNsdWRlICJzbXRwLmgiCiAjaW5jbHVkZSAic3RydG9vZmZ0LmgiCkBAIC0xMjQsNiArMTI1LDcgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBzbXRwX2Rpc2Nvbm5lY3QsICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfU01UUCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19TTVRQLCAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX0NMT1NFQUNUSU9OIHwgUFJPVE9QVF9OT1VSTFFVRVJZIHwgLyogZmxhZ3MgKi8KQEAgLTE1MCw2ICsxNTIsNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIHNtdHBfZGlzY29ubmVjdCwgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9TTVRQUywgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX1NNVFBTLCAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfQ0xPU0VBQ1RJT04gfCBQUk9UT1BUX1NTTApAQCAtMTU3LDU4ICsxNjAsNiBAQAogfTsKICNlbmRpZgogCi0jaWZuZGVmIENVUkxfRElTQUJMRV9IVFRQCi0vKgotICogSFRUUC1wcm94eWVkIFNNVFAgcHJvdG9jb2wgaGFuZGxlci4KLSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IEN1cmxfaGFuZGxlciBDdXJsX2hhbmRsZXJfc210cF9wcm94eSA9IHsKLSAgIlNNVFAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2hlbWUgKi8KLSAgQ3VybF9odHRwX3NldHVwX2Nvbm4sICAgICAgICAgICAgICAgICAvKiBzZXR1cF9jb25uZWN0aW9uICovCi0gIEN1cmxfaHR0cCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9faXQgKi8KLSAgQ3VybF9odHRwX2RvbmUsICAgICAgICAgICAgICAgICAgICAgICAvKiBkb25lICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9fbW9yZSAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3RfaXQgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW5nICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9pbmcgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b19nZXRzb2NrICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9pbmdfZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbW9yZV9nZXRzb2NrICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLwotICBQT1JUX1NNVFAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KLSAgQ1VSTFBST1RPX0hUVFAsICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwotICBQUk9UT1BUX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzICovCi19OwotCi0jaWZkZWYgVVNFX1NTTAotLyoKLSAqIEhUVFAtcHJveHllZCBTTVRQUyBwcm90b2NvbCBoYW5kbGVyLgotICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgQ3VybF9oYW5kbGVyIEN1cmxfaGFuZGxlcl9zbXRwc19wcm94eSA9IHsKLSAgIlNNVFBTIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2hlbWUgKi8KLSAgQ3VybF9odHRwX3NldHVwX2Nvbm4sICAgICAgICAgICAgICAgICAvKiBzZXR1cF9jb25uZWN0aW9uICovCi0gIEN1cmxfaHR0cCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9faXQgKi8KLSAgQ3VybF9odHRwX2RvbmUsICAgICAgICAgICAgICAgICAgICAgICAvKiBkb25lICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9fbW9yZSAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3RfaXQgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW5nICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9pbmcgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b19nZXRzb2NrICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9pbmdfZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbW9yZV9nZXRzb2NrICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLwotICBQT1JUX1NNVFBTLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KLSAgQ1VSTFBST1RPX0hUVFAsICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwotICBQUk9UT1BUX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzICovCi19OwotI2VuZGlmCi0jZW5kaWYKLQogLyogU0FTTCBwYXJhbWV0ZXJzIGZvciB0aGUgc210cCBwcm90b2NvbCAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBTQVNMcHJvdG8gc2FzbHNtdHAgPSB7CiAgICJzbXRwIiwgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc2VydmljZSBuYW1lICovCkBAIC01ODAsOCArNTMxLDQwIEBACiAgICAgfQogICB9CiAKKyAgLyogUHJlcGFyZSB0aGUgbWltZSBkYXRhIGlmIHNvbWUuICovCisgIGlmKGRhdGEtPnNldC5taW1lcG9zdC5raW5kICE9IE1JTUVLSU5EX05PTkUpIHsKKyAgICAvKiBVc2UgdGhlIHdob2xlIHN0cnVjdHVyZSBhcyBkYXRhLiAqLworICAgIGRhdGEtPnNldC5taW1lcG9zdC5mbGFncyAmPSB+TUlNRV9CT0RZX09OTFk7CisKKyAgICAvKiBBZGQgZXh0ZXJuYWwgaGVhZGVycyBhbmQgbWltZSB2ZXJzaW9uLiAqLworICAgIGN1cmxfbWltZV9oZWFkZXJzKCZkYXRhLT5zZXQubWltZXBvc3QsIGRhdGEtPnNldC5oZWFkZXJzLCAwKTsKKyAgICByZXN1bHQgPSBDdXJsX21pbWVfcHJlcGFyZV9oZWFkZXJzKCZkYXRhLT5zZXQubWltZXBvc3QsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBNSU1FU1RSQVRFR1lfTUFJTCk7CisKKyAgICBpZighcmVzdWx0KQorICAgICAgaWYoIUN1cmxfY2hlY2toZWFkZXJzKGNvbm4sICJNaW1lLVZlcnNpb24iKSkKKyAgICAgICAgcmVzdWx0ID0gQ3VybF9taW1lX2FkZF9oZWFkZXIoJmRhdGEtPnNldC5taW1lcG9zdC5jdXJsaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbWUtVmVyc2lvbjogMS4wIik7CisKKyAgICAvKiBNYWtlIHN1cmUgd2Ugd2lsbCByZWFkIHRoZSBlbnRpcmUgbWltZSBzdHJ1Y3R1cmUuICovCisgICAgaWYoIXJlc3VsdCkKKyAgICAgIHJlc3VsdCA9IEN1cmxfbWltZV9yZXdpbmQoJmRhdGEtPnNldC5taW1lcG9zdCk7CisKKyAgICBpZihyZXN1bHQpIHsKKyAgICAgIGZyZWUoZnJvbSk7CisgICAgICBmcmVlKGF1dGgpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBkYXRhLT5zdGF0ZS5pbmZpbGVzaXplID0gQ3VybF9taW1lX3NpemUoJmRhdGEtPnNldC5taW1lcG9zdCk7CisKKyAgICAvKiBSZWFkIGZyb20gbWltZSBzdHJ1Y3R1cmUuICovCisgICAgZGF0YS0+c3RhdGUuZnJlYWRfZnVuYyA9IChjdXJsX3JlYWRfY2FsbGJhY2spIEN1cmxfbWltZV9yZWFkOworICAgIGRhdGEtPnN0YXRlLmluID0gKHZvaWQgKikgJmRhdGEtPnNldC5taW1lcG9zdDsKKyAgfQorCiAgIC8qIENhbGN1bGF0ZSB0aGUgb3B0aW9uYWwgU0laRSBwYXJhbWV0ZXIgKi8KLSAgaWYoY29ubi0+cHJvdG8uc210cGMuc2l6ZV9zdXBwb3J0ZWQgJiYgY29ubi0+ZGF0YS0+c3RhdGUuaW5maWxlc2l6ZSA+IDApIHsKKyAgaWYoY29ubi0+cHJvdG8uc210cGMuc2l6ZV9zdXBwb3J0ZWQgJiYgZGF0YS0+c3RhdGUuaW5maWxlc2l6ZSA+IDApIHsKICAgICBzaXplID0gYXByaW50ZigiJSIgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCwgZGF0YS0+c3RhdGUuaW5maWxlc2l6ZSk7CiAKICAgICBpZighc2l6ZSkgewpAQCAtMTIwOSw3ICsxMTkyLDggQEAKICAgICBjb25uY2xvc2UoY29ubiwgIlNNVFAgZG9uZSB3aXRoIGJhZCBzdGF0dXMiKTsgLyogbWFya2VkIGZvciBjbG9zdXJlICovCiAgICAgcmVzdWx0ID0gc3RhdHVzOyAgICAgICAgIC8qIHVzZSB0aGUgYWxyZWFkeSBzZXQgZXJyb3IgY29kZSAqLwogICB9Ci0gIGVsc2UgaWYoIWRhdGEtPnNldC5jb25uZWN0X29ubHkgJiYgZGF0YS0+c2V0LnVwbG9hZCAmJiBkYXRhLT5zZXQubWFpbF9yY3B0KSB7CisgIGVsc2UgaWYoIWRhdGEtPnNldC5jb25uZWN0X29ubHkgJiYgZGF0YS0+c2V0Lm1haWxfcmNwdCAmJgorICAgICAgICAgIChkYXRhLT5zZXQudXBsb2FkIHx8IGRhdGEtPnNldC5taW1lcG9zdC5raW5kKSkgewogICAgIC8qIENhbGN1bGF0ZSB0aGUgRU9CIHRha2luZyBpbnRvIGFjY291bnQgYW55IHRlcm1pbmF0aW5nIENSTEYgZnJvbSB0aGUKICAgICAgICBwcmV2aW91cyBsaW5lIG9mIHRoZSBlbWFpbCBvciB0aGUgQ1JMRiBvZiB0aGUgREFUQSBjb21tYW5kIHdoZW4gdGhlcmUKICAgICAgICBpcyAibm8gbWFpbCBkYXRhIi4gUkZDLTUzMjEsIHNlY3QuIDQuMS4xLjQuCkBAIC0xMjk5LDcgKzEyODMsNyBAQAogICBzbXRwLT5yY3B0ID0gZGF0YS0+c2V0Lm1haWxfcmNwdDsKIAogICAvKiBTdGFydCB0aGUgZmlyc3QgY29tbWFuZCBpbiB0aGUgRE8gcGhhc2UgKi8KLSAgaWYoZGF0YS0+c2V0LnVwbG9hZCAmJiBkYXRhLT5zZXQubWFpbF9yY3B0KQorICBpZigoZGF0YS0+c2V0LnVwbG9hZCB8fCBkYXRhLT5zZXQubWltZXBvc3Qua2luZCkgJiYgZGF0YS0+c2V0Lm1haWxfcmNwdCkKICAgICAvKiBNQUlMIHRyYW5zZmVyICovCiAgICAgcmVzdWx0ID0gc210cF9wZXJmb3JtX21haWwoY29ubik7CiAgIGVsc2UKQEAgLTE0NTEsMzAgKzE0MzUsNiBAQAogICAvKiBDbGVhciB0aGUgVExTIHVwZ3JhZGVkIGZsYWcgKi8KICAgY29ubi0+dGxzX3VwZ3JhZGVkID0gRkFMU0U7CiAKLSAgLyogU2V0IHVwIHRoZSBwcm94eSBpZiBuZWNlc3NhcnkgKi8KLSAgaWYoY29ubi0+Yml0cy5odHRwcHJveHkgJiYgIWRhdGEtPnNldC50dW5uZWxfdGhydV9odHRwcHJveHkpIHsKLSAgICAvKiBVbmxlc3Mgd2UgaGF2ZSBhc2tlZCB0byB0dW5uZWwgU01UUCBvcGVyYXRpb25zIHRocm91Z2ggdGhlIHByb3h5LCB3ZQotICAgICAgIHN3aXRjaCBhbmQgdXNlIEhUVFAgb3BlcmF0aW9ucyBvbmx5ICovCi0jaWZuZGVmIENVUkxfRElTQUJMRV9IVFRQCi0gICAgaWYoY29ubi0+aGFuZGxlciA9PSAmQ3VybF9oYW5kbGVyX3NtdHApCi0gICAgICBjb25uLT5oYW5kbGVyID0gJkN1cmxfaGFuZGxlcl9zbXRwX3Byb3h5OwotICAgIGVsc2UgewotI2lmZGVmIFVTRV9TU0wKLSAgICAgIGNvbm4tPmhhbmRsZXIgPSAmQ3VybF9oYW5kbGVyX3NtdHBzX3Byb3h5OwotI2Vsc2UKLSAgICAgIGZhaWxmKGRhdGEsICJTTVRQUyBub3Qgc3VwcG9ydGVkISIpOwotICAgICAgcmV0dXJuIENVUkxFX1VOU1VQUE9SVEVEX1BST1RPQ09MOwotI2VuZGlmCi0gICAgfQotICAgIC8qIHNldCBpdCB1cCBhcyBhIEhUVFAgY29ubmVjdGlvbiBpbnN0ZWFkICovCi0gICAgcmV0dXJuIGNvbm4tPmhhbmRsZXItPnNldHVwX2Nvbm5lY3Rpb24oY29ubik7Ci0KLSNlbHNlCi0gICAgZmFpbGYoZGF0YSwgIlNNVFAgb3ZlciBodHRwIHByb3h5IHJlcXVpcmVzIEhUVFAgc3VwcG9ydCBidWlsdC1pbiEiKTsKLSAgICByZXR1cm4gQ1VSTEVfVU5TVVBQT1JURURfUFJPVE9DT0w7Ci0jZW5kaWYKLSAgfQotCiAgIC8qIEluaXRpYWxpc2UgdGhlIFNNVFAgbGF5ZXIgKi8KICAgcmVzdWx0ID0gc210cF9pbml0KGNvbm4pOwogICBpZihyZXN1bHQpCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zb2Nrcy5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc29ja3MuYwppbmRleCA5N2E0NGIyLi5lNjRjYjk4IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zb2Nrcy5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3NvY2tzLmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTEwNSw3ICsxMDUsNyBAQAogKiAgIFNldCBwcm90b2NvbDRhPXRydWUgZm9yICAiU09DS1MgNEEgKFNpbXBsZSBFeHRlbnNpb24gdG8gU09DS1MgNCBQcm90b2NvbCkiCiAqICAgTm9uc3VwcG9ydCAiSWRlbnRpZmljYXRpb24gUHJvdG9jb2wgKFJGQzE0MTMpIgogKi8KLUNVUkxjb2RlIEN1cmxfU09DS1M0KGNvbnN0IGNoYXIgKnByb3h5X25hbWUsCitDVVJMY29kZSBDdXJsX1NPQ0tTNChjb25zdCBjaGFyICpwcm94eV91c2VyLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVtb3RlX3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LApAQCAtMTU0LDcgKzE1NCw3IEBACiAgIC8qIEROUyByZXNvbHZlIG9ubHkgZm9yIFNPQ0tTNCwgbm90IFNPQ0tTNGEgKi8KICAgaWYoIXByb3RvY29sNGEpIHsKICAgICBzdHJ1Y3QgQ3VybF9kbnNfZW50cnkgKmRuczsKLSAgICBDdXJsX2FkZHJpbmZvICpocD1OVUxMOworICAgIEN1cmxfYWRkcmluZm8gKmhwID0gTlVMTDsKICAgICBpbnQgcmM7CiAKICAgICByYyA9IEN1cmxfcmVzb2x2KGNvbm4sIGhvc3RuYW1lLCByZW1vdGVfcG9ydCwgJmRucyk7CkBAIC0xNzEsNyArMTcxLDcgQEAKICAgICAgKiByZXR1cm5zIGEgQ3VybF9hZGRyaW5mbyBwb2ludGVyIHRoYXQgbWF5IG5vdCBhbHdheXMgbG9vayB0aGUgc2FtZS4KICAgICAgKi8KICAgICBpZihkbnMpCi0gICAgICBocD1kbnMtPmFkZHI7CisgICAgICBocCA9IGRucy0+YWRkcjsKICAgICBpZihocCkgewogICAgICAgY2hhciBidWZbNjRdOwogICAgICAgQ3VybF9wcmludGFibGVfYWRkcmVzcyhocCwgYnVmLCBzaXplb2YoYnVmKSk7CkBAIC0yMDYsMTQgKzIwNiwxNCBAQAogICAgKiBUaGlzIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGluZyAiSWRlbnRpZmljYXRpb24gUHJvdG9jb2wgKFJGQzE0MTMpIi4KICAgICovCiAgIHNvY2tzcmVxWzhdID0gMDsgLyogZW5zdXJlIGVtcHR5IHVzZXJpZCBpcyBOVUwtdGVybWluYXRlZCAqLwotICBpZihwcm94eV9uYW1lKSB7Ci0gICAgc2l6ZV90IHBsZW4gPSBzdHJsZW4ocHJveHlfbmFtZSk7CisgIGlmKHByb3h5X3VzZXIpIHsKKyAgICBzaXplX3QgcGxlbiA9IHN0cmxlbihwcm94eV91c2VyKTsKICAgICBpZihwbGVuID49IHNpemVvZihzb2Nrc3JlcSkgLSA4KSB7CiAgICAgICBmYWlsZihkYXRhLCAiVG9vIGxvbmcgU09DS1MgcHJveHkgbmFtZSwgY2FuJ3QgdXNlIVxuIik7CiAgICAgICByZXR1cm4gQ1VSTEVfQ09VTEROVF9DT05ORUNUOwogICAgIH0KICAgICAvKiBjb3B5IHRoZSBwcm94eSBuYW1lIFdJVEggdHJhaWxpbmcgemVybyAqLwotICAgIG1lbWNweShzb2Nrc3JlcSArIDgsIHByb3h5X25hbWUsIHBsZW4rMSk7CisgICAgbWVtY3B5KHNvY2tzcmVxICsgOCwgcHJveHlfdXNlciwgcGxlbiArIDEpOwogICB9CiAKICAgLyoKQEAgLTMwNiw3ICszMDYsNyBAQAogICAgICAgICAgICAgIiwgcmVxdWVzdCByZWplY3RlZCBvciBmYWlsZWQuIiwKICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzRdLCAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVs1XSwKICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzZdLCAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVs3XSwKLSAgICAgICAgICAgICgoKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbOF0gPDwgOCkgfCAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVs5XSksCisgICAgICAgICAgICAoKCh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzJdIDw8IDgpIHwgKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbM10pLAogICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbMV0pOwogICAgICAgcmV0dXJuIENVUkxFX0NPVUxETlRfQ09OTkVDVDsKICAgICBjYXNlIDkyOgpAQCAtMzE2LDcgKzMxNiw3IEBACiAgICAgICAgICAgICAiaWRlbnRkIG9uIHRoZSBjbGllbnQuIiwKICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzRdLCAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVs1XSwKICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzZdLCAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVs3XSwKLSAgICAgICAgICAgICgoKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbOF0gPDwgOCkgfCAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVs5XSksCisgICAgICAgICAgICAoKCh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzJdIDw8IDgpIHwgKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbM10pLAogICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbMV0pOwogICAgICAgcmV0dXJuIENVUkxFX0NPVUxETlRfQ09OTkVDVDsKICAgICBjYXNlIDkzOgpAQCAtMzI2LDcgKzMyNiw3IEBACiAgICAgICAgICAgICAicmVwb3J0IGRpZmZlcmVudCB1c2VyLWlkcy4iLAogICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbNF0sICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzVdLAogICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbNl0sICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzddLAotICAgICAgICAgICAgKCgodW5zaWduZWQgY2hhcilzb2Nrc3JlcVs4XSA8PCA4KSB8ICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzldKSwKKyAgICAgICAgICAgICgoKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbMl0gPDwgOCkgfCAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVszXSksCiAgICAgICAgICAgICAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVsxXSk7CiAgICAgICByZXR1cm4gQ1VSTEVfQ09VTEROVF9DT05ORUNUOwogICAgIGRlZmF1bHQ6CkBAIC0zMzUsNyArMzM1LDcgQEAKICAgICAgICAgICAgICIsIFVua25vd24uIiwKICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzRdLCAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVs1XSwKICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzZdLCAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVs3XSwKLSAgICAgICAgICAgICgoKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbOF0gPDwgOCkgfCAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVs5XSksCisgICAgICAgICAgICAoKCh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzJdIDw8IDgpIHwgKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbM10pLAogICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbMV0pOwogICAgICAgcmV0dXJuIENVUkxFX0NPVUxETlRfQ09OTkVDVDsKICAgICB9CkBAIC0zNTAsNyArMzUwLDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gbG9ncyBpbiB0byBhIFNPQ0tTNSBwcm94eSBhbmQgc2VuZHMgdGhlIHNwZWNpZmljcyB0byB0aGUgZmluYWwKICAqIGRlc3RpbmF0aW9uIHNlcnZlci4KICAqLwotQ1VSTGNvZGUgQ3VybF9TT0NLUzUoY29uc3QgY2hhciAqcHJveHlfbmFtZSwKK0NVUkxjb2RlIEN1cmxfU09DS1M1KGNvbnN0IGNoYXIgKnByb3h5X3VzZXIsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm94eV9wYXNzd29yZCwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAogICAgICAgICAgICAgICAgICAgICAgaW50IHJlbW90ZV9wb3J0LApAQCAtMzc1LDYgKzM3NSw3IEBACiAgICovCiAKICAgdW5zaWduZWQgY2hhciBzb2Nrc3JlcVs2MDBdOyAvKiByb29tIGZvciBsYXJnZSB1c2VyL3B3ICgyNTUgbWF4IGVhY2gpICovCisgIGludCBpZHg7CiAgIHNzaXplX3QgYWN0dWFscmVhZDsKICAgc3NpemVfdCB3cml0dGVuOwogICBpbnQgcmVzdWx0OwpAQCAtMzg2LDYgKzM4Nyw4IEBACiAgICAgKGNvbm4tPnNvY2tzX3Byb3h5LnByb3h5dHlwZSA9PSBDVVJMUFJPWFlfU09DS1M1KSA/IFRSVUUgOiBGQUxTRTsKICAgY29uc3Qgc2l6ZV90IGhvc3RuYW1lX2xlbiA9IHN0cmxlbihob3N0bmFtZSk7CiAgIHNzaXplX3QgbGVuID0gMDsKKyAgY29uc3QgdW5zaWduZWQgbG9uZyBhdXRoID0gZGF0YS0+c2V0LnNvY2tzNWF1dGg7CisgIGJvb2wgYWxsb3dfZ3NzYXBpID0gRkFMU0U7CiAKICAgaWYoY29ubi0+Yml0cy5odHRwcHJveHkpCiAgICAgaW5mb2YoY29ubi0+ZGF0YSwgIlNPQ0tTNTogY29ubmVjdGluZyB0byBIVFRQIHByb3h5ICVzIHBvcnQgJWRcbiIsCkBAIC00MjYsMTggKzQyOSwyOSBAQAogICAgIHJldHVybiBDVVJMRV9DT1VMRE5UX0NPTk5FQ1Q7CiAgIH0KIAotICBzb2Nrc3JlcVswXSA9IDU7IC8qIHZlcnNpb24gKi8KKyAgaWYoYXV0aCAmIH4oQ1VSTEFVVEhfQkFTSUMgfCBDVVJMQVVUSF9HU1NBUEkpKQorICAgIGluZm9mKGNvbm4tPmRhdGEsCisgICAgICAgICJ3YXJuaW5nOiB1bnN1cHBvcnRlZCB2YWx1ZSBwYXNzZWQgdG8gQ1VSTE9QVF9TT0NLUzVfQVVUSDogJWx1XG4iLAorICAgICAgICBhdXRoKTsKKyAgaWYoIShhdXRoICYgQ1VSTEFVVEhfQkFTSUMpKQorICAgIC8qIGRpc2FibGUgdXNlcm5hbWUvcGFzc3dvcmQgYXV0aCAqLworICAgIHByb3h5X3VzZXIgPSBOVUxMOwogI2lmIGRlZmluZWQoSEFWRV9HU1NBUEkpIHx8IGRlZmluZWQoVVNFX1dJTkRPV1NfU1NQSSkKLSAgc29ja3NyZXFbMV0gPSAoY2hhcikocHJveHlfbmFtZSA/IDMgOiAyKTsgLyogbnVtYmVyIG9mIG1ldGhvZHMgKGJlbG93KSAqLwotICBzb2Nrc3JlcVsyXSA9IDA7IC8qIG5vIGF1dGhlbnRpY2F0aW9uICovCi0gIHNvY2tzcmVxWzNdID0gMTsgLyogR1NTLUFQSSAqLwotICBzb2Nrc3JlcVs0XSA9IDI7IC8qIHVzZXJuYW1lL3Bhc3N3b3JkICovCi0jZWxzZQotICBzb2Nrc3JlcVsxXSA9IChjaGFyKShwcm94eV9uYW1lID8gMiA6IDEpOyAvKiBudW1iZXIgb2YgbWV0aG9kcyAoYmVsb3cpICovCi0gIHNvY2tzcmVxWzJdID0gMDsgLyogbm8gYXV0aGVudGljYXRpb24gKi8KLSAgc29ja3NyZXFbM10gPSAyOyAvKiB1c2VybmFtZS9wYXNzd29yZCAqLworICBpZihhdXRoICYgQ1VSTEFVVEhfR1NTQVBJKQorICAgIGFsbG93X2dzc2FwaSA9IFRSVUU7CiAjZW5kaWYKIAorICBpZHggPSAwOworICBzb2Nrc3JlcVtpZHgrK10gPSA1OyAgIC8qIHZlcnNpb24gKi8KKyAgaWR4Kys7ICAgICAgICAgICAgICAgICAvKiByZXNlcnZlIGZvciB0aGUgbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgKi8KKyAgc29ja3NyZXFbaWR4KytdID0gMDsgICAvKiBubyBhdXRoZW50aWNhdGlvbiAqLworICBpZihhbGxvd19nc3NhcGkpCisgICAgc29ja3NyZXFbaWR4KytdID0gMTsgLyogR1NTLUFQSSAqLworICBpZihwcm94eV91c2VyKQorICAgIHNvY2tzcmVxW2lkeCsrXSA9IDI7IC8qIHVzZXJuYW1lL3Bhc3N3b3JkICovCisgIC8qIHdyaXRlIHRoZSBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kcyAqLworICBzb2Nrc3JlcVsxXSA9ICh1bnNpZ25lZCBjaGFyKSAoaWR4IC0gMik7CisKICAgKHZvaWQpY3VybHhfbm9uYmxvY2soc29jaywgRkFMU0UpOwogCiAgIGluZm9mKGRhdGEsICJTT0NLUzUgY29tbXVuaWNhdGlvbiB0byAlczolZFxuIiwgaG9zdG5hbWUsIHJlbW90ZV9wb3J0KTsKQEAgLTQ2OSw3ICs0ODMsNyBAQAogCiAgICh2b2lkKWN1cmx4X25vbmJsb2NrKHNvY2ssIEZBTFNFKTsKIAotICByZXN1bHQ9Q3VybF9ibG9ja3JlYWRfYWxsKGNvbm4sIHNvY2ssIChjaGFyICopc29ja3NyZXEsIDIsICZhY3R1YWxyZWFkKTsKKyAgcmVzdWx0ID0gQ3VybF9ibG9ja3JlYWRfYWxsKGNvbm4sIHNvY2ssIChjaGFyICopc29ja3NyZXEsIDIsICZhY3R1YWxyZWFkKTsKICAgaWYocmVzdWx0IHx8IChhY3R1YWxyZWFkICE9IDIpKSB7CiAgICAgZmFpbGYoZGF0YSwgIlVuYWJsZSB0byByZWNlaXZlIGluaXRpYWwgU09DS1M1IHJlc3BvbnNlLiIpOwogICAgIHJldHVybiBDVVJMRV9DT1VMRE5UX0NPTk5FQ1Q7CkBAIC00ODQsNyArNDk4LDcgQEAKICAgICA7CiAgIH0KICNpZiBkZWZpbmVkKEhBVkVfR1NTQVBJKSB8fCBkZWZpbmVkKFVTRV9XSU5ET1dTX1NTUEkpCi0gIGVsc2UgaWYoc29ja3NyZXFbMV0gPT0gMSkgeworICBlbHNlIGlmKGFsbG93X2dzc2FwaSAmJiAoc29ja3NyZXFbMV0gPT0gMSkpIHsKICAgICBjb2RlID0gQ3VybF9TT0NLUzVfZ3NzYXBpX25lZ290aWF0ZShzb2NraW5kZXgsIGNvbm4pOwogICAgIGlmKGNvZGUpIHsKICAgICAgIGZhaWxmKGRhdGEsICJVbmFibGUgdG8gbmVnb3RpYXRlIFNPQ0tTNSBHU1MtQVBJIGNvbnRleHQuIik7CkBAIC00OTQsMTMgKzUwOCwxMyBAQAogI2VuZGlmCiAgIGVsc2UgaWYoc29ja3NyZXFbMV0gPT0gMikgewogICAgIC8qIE5lZWRzIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgKi8KLSAgICBzaXplX3QgcHJveHlfbmFtZV9sZW4sIHByb3h5X3Bhc3N3b3JkX2xlbjsKLSAgICBpZihwcm94eV9uYW1lICYmIHByb3h5X3Bhc3N3b3JkKSB7Ci0gICAgICBwcm94eV9uYW1lX2xlbiA9IHN0cmxlbihwcm94eV9uYW1lKTsKKyAgICBzaXplX3QgcHJveHlfdXNlcl9sZW4sIHByb3h5X3Bhc3N3b3JkX2xlbjsKKyAgICBpZihwcm94eV91c2VyICYmIHByb3h5X3Bhc3N3b3JkKSB7CisgICAgICBwcm94eV91c2VyX2xlbiA9IHN0cmxlbihwcm94eV91c2VyKTsKICAgICAgIHByb3h5X3Bhc3N3b3JkX2xlbiA9IHN0cmxlbihwcm94eV9wYXNzd29yZCk7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgcHJveHlfbmFtZV9sZW4gPSAwOworICAgICAgcHJveHlfdXNlcl9sZW4gPSAwOwogICAgICAgcHJveHlfcGFzc3dvcmRfbGVuID0gMDsKICAgICB9CiAKQEAgLTUxMywxMCArNTI3LDEwIEBACiAgICAgICovCiAgICAgbGVuID0gMDsKICAgICBzb2Nrc3JlcVtsZW4rK10gPSAxOyAgICAvKiB1c2VybmFtZS9wdyBzdWJuZWdvdGlhdGlvbiB2ZXJzaW9uICovCi0gICAgc29ja3NyZXFbbGVuKytdID0gKHVuc2lnbmVkIGNoYXIpIHByb3h5X25hbWVfbGVuOwotICAgIGlmKHByb3h5X25hbWUgJiYgcHJveHlfbmFtZV9sZW4pCi0gICAgICBtZW1jcHkoc29ja3NyZXEgKyBsZW4sIHByb3h5X25hbWUsIHByb3h5X25hbWVfbGVuKTsKLSAgICBsZW4gKz0gcHJveHlfbmFtZV9sZW47CisgICAgc29ja3NyZXFbbGVuKytdID0gKHVuc2lnbmVkIGNoYXIpIHByb3h5X3VzZXJfbGVuOworICAgIGlmKHByb3h5X3VzZXIgJiYgcHJveHlfdXNlcl9sZW4pCisgICAgICBtZW1jcHkoc29ja3NyZXEgKyBsZW4sIHByb3h5X3VzZXIsIHByb3h5X3VzZXJfbGVuKTsKKyAgICBsZW4gKz0gcHJveHlfdXNlcl9sZW47CiAgICAgc29ja3NyZXFbbGVuKytdID0gKHVuc2lnbmVkIGNoYXIpIHByb3h5X3Bhc3N3b3JkX2xlbjsKICAgICBpZihwcm94eV9wYXNzd29yZCAmJiBwcm94eV9wYXNzd29yZF9sZW4pCiAgICAgICBtZW1jcHkoc29ja3NyZXEgKyBsZW4sIHByb3h5X3Bhc3N3b3JkLCBwcm94eV9wYXNzd29yZF9sZW4pOwpAQCAtNTI4LDcgKzU0Miw3IEBACiAgICAgICByZXR1cm4gQ1VSTEVfQ09VTEROVF9DT05ORUNUOwogICAgIH0KIAotICAgIHJlc3VsdD1DdXJsX2Jsb2NrcmVhZF9hbGwoY29ubiwgc29jaywgKGNoYXIgKilzb2Nrc3JlcSwgMiwgJmFjdHVhbHJlYWQpOworICAgIHJlc3VsdCA9IEN1cmxfYmxvY2tyZWFkX2FsbChjb25uLCBzb2NrLCAoY2hhciAqKXNvY2tzcmVxLCAyLCAmYWN0dWFscmVhZCk7CiAgICAgaWYocmVzdWx0IHx8IChhY3R1YWxyZWFkICE9IDIpKSB7CiAgICAgICBmYWlsZihkYXRhLCAiVW5hYmxlIHRvIHJlY2VpdmUgU09DS1M1IHN1Yi1uZWdvdGlhdGlvbiByZXNwb25zZS4iKTsKICAgICAgIHJldHVybiBDVVJMRV9DT1VMRE5UX0NPTk5FQ1Q7CkBAIC01NDUsMTcgKzU1OSwxMyBAQAogICB9CiAgIGVsc2UgewogICAgIC8qIGVycm9yICovCi0jaWYgZGVmaW5lZChIQVZFX0dTU0FQSSkgfHwgZGVmaW5lZChVU0VfV0lORE9XU19TU1BJKQotICAgIGlmKHNvY2tzcmVxWzFdID09IDI1NSkgewotI2Vsc2UKLSAgICBpZihzb2Nrc3JlcVsxXSA9PSAxKSB7CisgICAgaWYoIWFsbG93X2dzc2FwaSAmJiAoc29ja3NyZXFbMV0gPT0gMSkpIHsKICAgICAgIGZhaWxmKGRhdGEsCiAgICAgICAgICAgICAiU09DS1M1IEdTU0FQSSBwZXItbWVzc2FnZSBhdXRoZW50aWNhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiIpOwogICAgICAgcmV0dXJuIENVUkxFX0NPVUxETlRfQ09OTkVDVDsKICAgICB9CiAgICAgaWYoc29ja3NyZXFbMV0gPT0gMjU1KSB7Ci0jZW5kaWYKLSAgICAgIGlmKCFwcm94eV9uYW1lIHx8ICEqcHJveHlfbmFtZSkgeworICAgICAgaWYoIXByb3h5X3VzZXIgfHwgISpwcm94eV91c2VyKSB7CiAgICAgICAgIGZhaWxmKGRhdGEsCiAgICAgICAgICAgICAgICJObyBhdXRoZW50aWNhdGlvbiBtZXRob2Qgd2FzIGFjY2VwdGFibGUuIChJdCBpcyBxdWl0ZSBsaWtlbHkiCiAgICAgICAgICAgICAgICIgdGhhdCB0aGUgU09DS1M1IHNlcnZlciB3YW50ZWQgYSB1c2VybmFtZS9wYXNzd29yZCwgc2luY2Ugbm9uZSIKQEAgLTYwNSw3ICs2MTUsNyBAQAogICAgICAqIHJldHVybnMgYSBDdXJsX2FkZHJpbmZvIHBvaW50ZXIgdGhhdCBtYXkgbm90IGFsd2F5cyBsb29rIHRoZSBzYW1lLgogICAgICAqLwogICAgIGlmKGRucykKLSAgICAgIGhwPWRucy0+YWRkcjsKKyAgICAgIGhwID0gZG5zLT5hZGRyOwogICAgIGlmKGhwKSB7CiAgICAgICBpbnQgaTsKICAgICAgIGNoYXIgYnVmWzY0XTsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NvY2tzX2dzc2FwaS5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc29ja3NfZ3NzYXBpLmMKaW5kZXggNTRkMDYzNS4uOTY5NDhhYyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc29ja3NfZ3NzYXBpLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc29ja3NfZ3NzYXBpLmMKQEAgLTUsOCArNSw4IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDExLCBNYXJrdXMgTW9lbGxlciwgPG1hcmt1c19tb2VsbGVyQGNvbXB1c2VydmUuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDEyIC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSwgTWFya3VzIE1vZWxsZXIsIDxtYXJrdXNfbW9lbGxlckBjb21wdXNlcnZlLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTY1LDcgKzY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2dfY3R4LCAmc3RhdHVzX3N0cmluZyk7CiAgICAgICBpZihtYWpfc3RhdCA9PSBHU1NfU19DT01QTEVURSkgewogICAgICAgICBpZihzaXplb2YoYnVmKSA+IGxlbiArIHN0YXR1c19zdHJpbmcubGVuZ3RoICsgMSkgewotICAgICAgICAgIHN0cmNweShidWYrbGVuLCAoY2hhciAqKSBzdGF0dXNfc3RyaW5nLnZhbHVlKTsKKyAgICAgICAgICBzdHJjcHkoYnVmICsgbGVuLCAoY2hhciAqKSBzdGF0dXNfc3RyaW5nLnZhbHVlKTsKICAgICAgICAgICBsZW4gKz0gc3RhdHVzX3N0cmluZy5sZW5ndGg7CiAgICAgICAgIH0KICAgICAgICAgZ3NzX3JlbGVhc2VfYnVmZmVyKCZtaW5fc3RhdCwgJnN0YXR1c19zdHJpbmcpOwpAQCAtNzQsNyArNzQsNyBAQAogICAgICAgZ3NzX3JlbGVhc2VfYnVmZmVyKCZtaW5fc3RhdCwgJnN0YXR1c19zdHJpbmcpOwogICAgIH0KICAgICBpZihzaXplb2YoYnVmKSA+IGxlbiArIDMpIHsKLSAgICAgIHN0cmNweShidWYrbGVuLCAiLlxuIik7CisgICAgICBzdHJjcHkoYnVmICsgbGVuLCAiLlxuIik7CiAgICAgICBsZW4gKz0gMjsKICAgICB9CiAgICAgbXNnX2N0eCA9IDA7CkBAIC04Niw3ICs4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXNnX2N0eCwgJnN0YXR1c19zdHJpbmcpOwogICAgICAgaWYobWFqX3N0YXQgPT0gR1NTX1NfQ09NUExFVEUpIHsKICAgICAgICAgaWYoc2l6ZW9mKGJ1ZikgPiBsZW4gKyBzdGF0dXNfc3RyaW5nLmxlbmd0aCkKLSAgICAgICAgICBzdHJjcHkoYnVmK2xlbiwgKGNoYXIgKikgc3RhdHVzX3N0cmluZy52YWx1ZSk7CisgICAgICAgICAgc3RyY3B5KGJ1ZiArIGxlbiwgKGNoYXIgKikgc3RhdHVzX3N0cmluZy52YWx1ZSk7CiAgICAgICAgIGdzc19yZWxlYXNlX2J1ZmZlcigmbWluX3N0YXQsICZzdGF0dXNfc3RyaW5nKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC0xMTksNyArMTE5LDcgQEAKICAgZ3NzX25hbWVfdCAgICAgICBzZXJ2ZXIgPSBHU1NfQ19OT19OQU1FOwogICBnc3NfbmFtZV90ICAgICAgIGdzc19jbGllbnRfbmFtZSA9IEdTU19DX05PX05BTUU7CiAgIHVuc2lnbmVkIHNob3J0ICAgdXNfbGVuZ3RoOwotICBjaGFyICAgICAgICAgICAgICp1c2VyPU5VTEw7CisgIGNoYXIgICAgICAgICAgICAgKnVzZXIgPSBOVUxMOwogICB1bnNpZ25lZCBjaGFyIHNvY2tzcmVxWzRdOyAvKiByb29tIGZvciBHU1MtQVBJIGV4Y2hhbmdlIGhlYWRlciBvbmx5ICovCiAgIGNvbnN0IGNoYXIgKnNlcnZpY2VwdHIgPSBkYXRhLT5zZXQuc3RyW1NUUklOR19QUk9YWV9TRVJWSUNFX05BTUVdID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnNldC5zdHJbU1RSSU5HX1BST1hZX1NFUlZJQ0VfTkFNRV0gOiAicmNtZCI7CkBAIC0xNDYsMTEgKzE0NiwxMiBAQAogICB9CiAgIGVsc2UgewogICAgIHNlcnZpY2UudmFsdWUgPSBtYWxsb2Moc2VydmljZXB0cl9sZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGNvbm4tPnNvY2tzX3Byb3h5Lmhvc3QubmFtZSkrMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oY29ubi0+c29ja3NfcHJveHkuaG9zdC5uYW1lKSArIDIpOwogICAgIGlmKCFzZXJ2aWNlLnZhbHVlKQogICAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7Ci0gICAgc2VydmljZS5sZW5ndGggPSBzZXJ2aWNlcHRyX2xlbmd0aCArIHN0cmxlbihjb25uLT5zb2Nrc19wcm94eS5ob3N0Lm5hbWUpKzE7Ci0gICAgc25wcmludGYoc2VydmljZS52YWx1ZSwgc2VydmljZS5sZW5ndGgrMSwgIiVzQCVzIiwKKyAgICBzZXJ2aWNlLmxlbmd0aCA9IHNlcnZpY2VwdHJfbGVuZ3RoICsKKyAgICAgIHN0cmxlbihjb25uLT5zb2Nrc19wcm94eS5ob3N0Lm5hbWUpICsgMTsKKyAgICBzbnByaW50ZihzZXJ2aWNlLnZhbHVlLCBzZXJ2aWNlLmxlbmd0aCArIDEsICIlc0AlcyIsCiAgICAgICAgICAgICAgc2VydmljZXB0ciwgY29ubi0+c29ja3NfcHJveHkuaG9zdC5uYW1lKTsKIAogICAgIGdzc19tYWpvcl9zdGF0dXMgPSBnc3NfaW1wb3J0X25hbWUoJmdzc19taW5vcl9zdGF0dXMsICZzZXJ2aWNlLApAQCAtMTk2LDcgKzE5Nyw3IEBACiAgICAgICBzb2Nrc3JlcVswXSA9IDE7ICAgIC8qIEdTUy1BUEkgc3VibmVnb3RpYXRpb24gdmVyc2lvbiAqLwogICAgICAgc29ja3NyZXFbMV0gPSAxOyAgICAvKiBhdXRoZW50aWNhdGlvbiBtZXNzYWdlIHR5cGUgKi8KICAgICAgIHVzX2xlbmd0aCA9IGh0b25zKChzaG9ydClnc3Nfc2VuZF90b2tlbi5sZW5ndGgpOwotICAgICAgbWVtY3B5KHNvY2tzcmVxKzIsICZ1c19sZW5ndGgsIHNpemVvZihzaG9ydCkpOworICAgICAgbWVtY3B5KHNvY2tzcmVxICsgMiwgJnVzX2xlbmd0aCwgc2l6ZW9mKHNob3J0KSk7CiAKICAgICAgIGNvZGUgPSBDdXJsX3dyaXRlX3BsYWluKGNvbm4sIHNvY2ssIChjaGFyICopc29ja3NyZXEsIDQsICZ3cml0dGVuKTsKICAgICAgIGlmKGNvZGUgfHwgKDQgIT0gd3JpdHRlbikpIHsKQEAgLTIzNiw3ICsyMzcsNyBAQAogICAgICAqICstLS0tKy0tLS0tLSstLS0tLSstLS0tLS0tLS0tLS0tLS0tKwogICAgICAqLwogCi0gICAgcmVzdWx0PUN1cmxfYmxvY2tyZWFkX2FsbChjb25uLCBzb2NrLCAoY2hhciAqKXNvY2tzcmVxLCA0LCAmYWN0dWFscmVhZCk7CisgICAgcmVzdWx0ID0gQ3VybF9ibG9ja3JlYWRfYWxsKGNvbm4sIHNvY2ssIChjaGFyICopc29ja3NyZXEsIDQsICZhY3R1YWxyZWFkKTsKICAgICBpZihyZXN1bHQgfHwgKGFjdHVhbHJlYWQgIT0gNCkpIHsKICAgICAgIGZhaWxmKGRhdGEsICJGYWlsZWQgdG8gcmVjZWl2ZSBHU1MtQVBJIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlLiIpOwogICAgICAgZ3NzX3JlbGVhc2VfbmFtZSgmZ3NzX3N0YXR1cywgJnNlcnZlcik7CkBAIC0yNjEsMTEgKzI2MiwxMSBAQAogICAgICAgcmV0dXJuIENVUkxFX0NPVUxETlRfQ09OTkVDVDsKICAgICB9CiAKLSAgICBtZW1jcHkoJnVzX2xlbmd0aCwgc29ja3NyZXErMiwgc2l6ZW9mKHNob3J0KSk7CisgICAgbWVtY3B5KCZ1c19sZW5ndGgsIHNvY2tzcmVxICsgMiwgc2l6ZW9mKHNob3J0KSk7CiAgICAgdXNfbGVuZ3RoID0gbnRvaHModXNfbGVuZ3RoKTsKIAotICAgIGdzc19yZWN2X3Rva2VuLmxlbmd0aD11c19sZW5ndGg7Ci0gICAgZ3NzX3JlY3ZfdG9rZW4udmFsdWU9bWFsbG9jKHVzX2xlbmd0aCk7CisgICAgZ3NzX3JlY3ZfdG9rZW4ubGVuZ3RoID0gdXNfbGVuZ3RoOworICAgIGdzc19yZWN2X3Rva2VuLnZhbHVlID0gbWFsbG9jKHVzX2xlbmd0aCk7CiAgICAgaWYoIWdzc19yZWN2X3Rva2VuLnZhbHVlKSB7CiAgICAgICBmYWlsZihkYXRhLAogICAgICAgICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIEdTUy1BUEkgYXV0aGVudGljYXRpb24gIgpAQCAtMjc1LDggKzI3Niw4IEBACiAgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgICB9CiAKLSAgICByZXN1bHQ9Q3VybF9ibG9ja3JlYWRfYWxsKGNvbm4sIHNvY2ssIChjaGFyICopZ3NzX3JlY3ZfdG9rZW4udmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3NfcmVjdl90b2tlbi5sZW5ndGgsICZhY3R1YWxyZWFkKTsKKyAgICByZXN1bHQgPSBDdXJsX2Jsb2NrcmVhZF9hbGwoY29ubiwgc29jaywgKGNoYXIgKilnc3NfcmVjdl90b2tlbi52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NzX3JlY3ZfdG9rZW4ubGVuZ3RoLCAmYWN0dWFscmVhZCk7CiAKICAgICBpZihyZXN1bHQgfHwgKGFjdHVhbHJlYWQgIT0gdXNfbGVuZ3RoKSkgewogICAgICAgZmFpbGYoZGF0YSwgIkZhaWxlZCB0byByZWNlaXZlIEdTUy1BUEkgYXV0aGVudGljYXRpb24gdG9rZW4uIik7CkBAIC0zMTIsNyArMzEzLDcgQEAKICAgICBmYWlsZihkYXRhLCAiRmFpbGVkIHRvIGRldGVybWluZSB1c2VyIG5hbWUuIik7CiAgICAgcmV0dXJuIENVUkxFX0NPVUxETlRfQ09OTkVDVDsKICAgfQotICB1c2VyPW1hbGxvYyhnc3Nfc2VuZF90b2tlbi5sZW5ndGgrMSk7CisgIHVzZXIgPSBtYWxsb2MoZ3NzX3NlbmRfdG9rZW4ubGVuZ3RoICsgMSk7CiAgIGlmKCF1c2VyKSB7CiAgICAgZ3NzX2RlbGV0ZV9zZWNfY29udGV4dCgmZ3NzX3N0YXR1cywgJmdzc19jb250ZXh0LCBOVUxMKTsKICAgICBnc3NfcmVsZWFzZV9uYW1lKCZnc3Nfc3RhdHVzLCAmZ3NzX2NsaWVudF9uYW1lKTsKQEAgLTMyNiw3ICszMjcsNyBAQAogICBnc3NfcmVsZWFzZV9idWZmZXIoJmdzc19zdGF0dXMsICZnc3Nfc2VuZF90b2tlbik7CiAgIGluZm9mKGRhdGEsICJTT0NLUzUgc2VydmVyIGF1dGhlbmN0aWNhdGVkIHVzZXIgJXMgd2l0aCBHU1MtQVBJLlxuIix1c2VyKTsKICAgZnJlZSh1c2VyKTsKLSAgdXNlcj1OVUxMOworICB1c2VyID0gTlVMTDsKIAogICAvKiBEbyBlbmNyeXB0aW9uICovCiAgIHNvY2tzcmVxWzBdID0gMTsgICAgLyogR1NTLUFQSSBzdWJuZWdvdGlhdGlvbiB2ZXJzaW9uICovCkBAIC0zNDEsNyArMzQyLDcgQEAKICAgICBnc3NfZW5jID0gMTsKIAogICBpbmZvZihkYXRhLCAiU09DS1M1IHNlcnZlciBzdXBwb3J0cyBHU1MtQVBJICVzIGRhdGEgcHJvdGVjdGlvbi5cbiIsCi0gICAgICAgIChnc3NfZW5jPT0wKT8ibm8iOigoZ3NzX2VuYz09MSk/ImludGVncml0eSI6ImNvbmZpZGVudGlhbGl0eSIpKTsKKyAgICAgICAgKGdzc19lbmMgPT0gMCk/Im5vIjooKGdzc19lbmM9PTEpPyJpbnRlZ3JpdHkiOiJjb25maWRlbnRpYWxpdHkiKSk7CiAgIC8qIGZvcmNlIGZvciB0aGUgbW9tZW50IHRvIG5vIGRhdGEgcHJvdGVjdGlvbiAqLwogICBnc3NfZW5jID0gMDsKICAgLyoKQEAgLTM3Niw3ICszNzcsNyBAQAogICAgKi8KICAgaWYoZGF0YS0+c2V0LnNvY2tzNV9nc3NhcGlfbmVjKSB7CiAgICAgdXNfbGVuZ3RoID0gaHRvbnMoKHNob3J0KTEpOwotICAgIG1lbWNweShzb2Nrc3JlcSsyLCAmdXNfbGVuZ3RoLCBzaXplb2Yoc2hvcnQpKTsKKyAgICBtZW1jcHkoc29ja3NyZXEgKyAyLCAmdXNfbGVuZ3RoLCBzaXplb2Yoc2hvcnQpKTsKICAgfQogICBlbHNlIHsKICAgICBnc3Nfc2VuZF90b2tlbi5sZW5ndGggPSAxOwpAQCAtNDAxLDcgKzQwMiw3IEBACiAgICAgZ3NzX3JlbGVhc2VfYnVmZmVyKCZnc3Nfc3RhdHVzLCAmZ3NzX3NlbmRfdG9rZW4pOwogCiAgICAgdXNfbGVuZ3RoID0gaHRvbnMoKHNob3J0KWdzc193X3Rva2VuLmxlbmd0aCk7Ci0gICAgbWVtY3B5KHNvY2tzcmVxKzIsICZ1c19sZW5ndGgsIHNpemVvZihzaG9ydCkpOworICAgIG1lbWNweShzb2Nrc3JlcSArIDIsICZ1c19sZW5ndGgsIHNpemVvZihzaG9ydCkpOwogICB9CiAKICAgY29kZSA9IEN1cmxfd3JpdGVfcGxhaW4oY29ubiwgc29jaywgKGNoYXIgKilzb2Nrc3JlcSwgNCwgJndyaXR0ZW4pOwpAQCAtNDMzLDcgKzQzNCw3IEBACiAgICAgZ3NzX3JlbGVhc2VfYnVmZmVyKCZnc3Nfc3RhdHVzLCAmZ3NzX3dfdG9rZW4pOwogICB9CiAKLSAgcmVzdWx0PUN1cmxfYmxvY2tyZWFkX2FsbChjb25uLCBzb2NrLCAoY2hhciAqKXNvY2tzcmVxLCA0LCAmYWN0dWFscmVhZCk7CisgIHJlc3VsdCA9IEN1cmxfYmxvY2tyZWFkX2FsbChjb25uLCBzb2NrLCAoY2hhciAqKXNvY2tzcmVxLCA0LCAmYWN0dWFscmVhZCk7CiAgIGlmKHJlc3VsdCB8fCAoYWN0dWFscmVhZCAhPSA0KSkgewogICAgIGZhaWxmKGRhdGEsICJGYWlsZWQgdG8gcmVjZWl2ZSBHU1MtQVBJIGVuY3J5cHRpb24gcmVzcG9uc2UuIik7CiAgICAgZ3NzX2RlbGV0ZV9zZWNfY29udGV4dCgmZ3NzX3N0YXR1cywgJmdzc19jb250ZXh0LCBOVUxMKTsKQEAgLTQ1NSwxNyArNDU2LDE3IEBACiAgICAgcmV0dXJuIENVUkxFX0NPVUxETlRfQ09OTkVDVDsKICAgfQogCi0gIG1lbWNweSgmdXNfbGVuZ3RoLCBzb2Nrc3JlcSsyLCBzaXplb2Yoc2hvcnQpKTsKKyAgbWVtY3B5KCZ1c19sZW5ndGgsIHNvY2tzcmVxICsgMiwgc2l6ZW9mKHNob3J0KSk7CiAgIHVzX2xlbmd0aCA9IG50b2hzKHVzX2xlbmd0aCk7CiAKLSAgZ3NzX3JlY3ZfdG9rZW4ubGVuZ3RoPSB1c19sZW5ndGg7Ci0gIGdzc19yZWN2X3Rva2VuLnZhbHVlPW1hbGxvYyhnc3NfcmVjdl90b2tlbi5sZW5ndGgpOworICBnc3NfcmVjdl90b2tlbi5sZW5ndGggPSB1c19sZW5ndGg7CisgIGdzc19yZWN2X3Rva2VuLnZhbHVlID0gbWFsbG9jKGdzc19yZWN2X3Rva2VuLmxlbmd0aCk7CiAgIGlmKCFnc3NfcmVjdl90b2tlbi52YWx1ZSkgewogICAgIGdzc19kZWxldGVfc2VjX2NvbnRleHQoJmdzc19zdGF0dXMsICZnc3NfY29udGV4dCwgTlVMTCk7CiAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CiAgIH0KLSAgcmVzdWx0PUN1cmxfYmxvY2tyZWFkX2FsbChjb25uLCBzb2NrLCAoY2hhciAqKWdzc19yZWN2X3Rva2VuLnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzc19yZWN2X3Rva2VuLmxlbmd0aCwgJmFjdHVhbHJlYWQpOworICByZXN1bHQgPSBDdXJsX2Jsb2NrcmVhZF9hbGwoY29ubiwgc29jaywgKGNoYXIgKilnc3NfcmVjdl90b2tlbi52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzc19yZWN2X3Rva2VuLmxlbmd0aCwgJmFjdHVhbHJlYWQpOwogCiAgIGlmKHJlc3VsdCB8fCAoYWN0dWFscmVhZCAhPSB1c19sZW5ndGgpKSB7CiAgICAgZmFpbGYoZGF0YSwgIkZhaWxlZCB0byByZWNlaXZlIEdTUy1BUEkgZW5jcnlwdHJpb24gdHlwZS4iKTsKQEAgLTUxMyw4ICs1MTQsOCBAQAogICB9CiAKICAgaW5mb2YoZGF0YSwgIlNPQ0tTNSBhY2Nlc3Mgd2l0aCVzIHByb3RlY3Rpb24gZ3JhbnRlZC5cbiIsCi0gICAgICAgIChzb2Nrc3JlcVswXT09MCk/Im91dCBHU1MtQVBJIGRhdGEiOgotICAgICAgICAoKHNvY2tzcmVxWzBdPT0xKT8iIEdTUy1BUEkgaW50ZWdyaXR5IjoiIEdTUy1BUEkgY29uZmlkZW50aWFsaXR5IikpOworICAgICAgICAoc29ja3NyZXFbMF0gPT0gMCk/Im91dCBHU1MtQVBJIGRhdGEiOgorICAgICAgICAoKHNvY2tzcmVxWzBdID09IDEpPyIgR1NTLUFQSSBpbnRlZ3JpdHkiOiIgR1NTLUFQSSBjb25maWRlbnRpYWxpdHkiKSk7CiAKICAgY29ubi0+c29ja3M1X2dzc2FwaV9lbmN0eXBlID0gc29ja3NyZXFbMF07CiAgIGlmKHNvY2tzcmVxWzBdID09IDApCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zb2Nrc19zc3BpLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zb2Nrc19zc3BpLmMKaW5kZXggZWRjNzNhZC4uMzQ2OTlkMyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc29ja3Nfc3NwaS5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3NvY2tzX3NzcGkuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAyMDEyIC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMSwgTWFya3VzIE1vZWxsZXIsIDxtYXJrdXNfbW9lbGxlckBjb21wdXNlcnZlLmNvbT4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaApAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgaWYoIXNlcnZpY2VfbmFtZSkKICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICAgIHNucHJpbnRmKHNlcnZpY2VfbmFtZSwgc2VydmljZV9sZW5ndGggKwotICAgICAgICAgICAgIHN0cmxlbihjb25uLT5zb2Nrc19wcm94eS5ob3N0Lm5hbWUpKzIsICIlcy8lcyIsCisgICAgICAgICAgICAgc3RybGVuKGNvbm4tPnNvY2tzX3Byb3h5Lmhvc3QubmFtZSkgKyAyLCAiJXMvJXMiLAogICAgICAgICAgICAgIHNlcnZpY2UsIGNvbm4tPnNvY2tzX3Byb3h5Lmhvc3QubmFtZSk7CiAgIH0KIApAQCAtMTk5LDcgKzE5OSw3IEBACiAgICAgICBzb2Nrc3JlcVswXSA9IDE7ICAgIC8qIEdTUy1BUEkgc3VibmVnb3RpYXRpb24gdmVyc2lvbiAqLwogICAgICAgc29ja3NyZXFbMV0gPSAxOyAgICAvKiBhdXRoZW50aWNhdGlvbiBtZXNzYWdlIHR5cGUgKi8KICAgICAgIHVzX2xlbmd0aCA9IGh0b25zKChzaG9ydClzc3BpX3NlbmRfdG9rZW4uY2JCdWZmZXIpOwotICAgICAgbWVtY3B5KHNvY2tzcmVxKzIsICZ1c19sZW5ndGgsIHNpemVvZihzaG9ydCkpOworICAgICAgbWVtY3B5KHNvY2tzcmVxICsgMiwgJnVzX2xlbmd0aCwgc2l6ZW9mKHNob3J0KSk7CiAKICAgICAgIGNvZGUgPSBDdXJsX3dyaXRlX3BsYWluKGNvbm4sIHNvY2ssIChjaGFyICopc29ja3NyZXEsIDQsICZ3cml0dGVuKTsKICAgICAgIGlmKGNvZGUgfHwgKDQgIT0gd3JpdHRlbikpIHsKQEAgLTI4Myw3ICsyODMsNyBAQAogICAgICAgcmV0dXJuIENVUkxFX0NPVUxETlRfQ09OTkVDVDsKICAgICB9CiAKLSAgICBtZW1jcHkoJnVzX2xlbmd0aCwgc29ja3NyZXErMiwgc2l6ZW9mKHNob3J0KSk7CisgICAgbWVtY3B5KCZ1c19sZW5ndGgsIHNvY2tzcmVxICsgMiwgc2l6ZW9mKHNob3J0KSk7CiAgICAgdXNfbGVuZ3RoID0gbnRvaHModXNfbGVuZ3RoKTsKIAogICAgIHNzcGlfcmVjdl90b2tlbi5jYkJ1ZmZlciA9IHVzX2xlbmd0aDsKQEAgLTM0MSw3ICszNDEsNyBAQAogICAgIGdzc19lbmMgPSAxOwogCiAgIGluZm9mKGRhdGEsICJTT0NLUzUgc2VydmVyIHN1cHBvcnRzIEdTUy1BUEkgJXMgZGF0YSBwcm90ZWN0aW9uLlxuIiwKLSAgICAgICAgKGdzc19lbmM9PTApPyJubyI6KChnc3NfZW5jPT0xKT8iaW50ZWdyaXR5IjoiY29uZmlkZW50aWFsaXR5IikgKTsKKyAgICAgICAgKGdzc19lbmMgPT0gMCk/Im5vIjooKGdzc19lbmMgPT0gMSk/ImludGVncml0eSI6ImNvbmZpZGVudGlhbGl0eSIpICk7CiAgIC8qIGZvcmNlIHRvIG5vIGRhdGEgcHJvdGVjdGlvbiwgYXZvaWQgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIGZvciBub3cgKi8KICAgZ3NzX2VuYyA9IDA7CiAgIC8qCkBAIC0zNzcsNyArMzc3LDcgQEAKIAogICBpZihkYXRhLT5zZXQuc29ja3M1X2dzc2FwaV9uZWMpIHsKICAgICB1c19sZW5ndGggPSBodG9ucygoc2hvcnQpMSk7Ci0gICAgbWVtY3B5KHNvY2tzcmVxKzIsICZ1c19sZW5ndGgsIHNpemVvZihzaG9ydCkpOworICAgIG1lbWNweShzb2Nrc3JlcSArIDIsICZ1c19sZW5ndGgsIHNpemVvZihzaG9ydCkpOwogICB9CiAgIGVsc2UgewogICAgIHN0YXR1cyA9IHNfcFNlY0ZuLT5RdWVyeUNvbnRleHRBdHRyaWJ1dGVzKCZzc3BpX2NvbnRleHQsCkBAIC00NDUsOCArNDQ1LDggQEAKICAgICBtZW1jcHkoKFBVQ0hBUikgc3NwaV9zZW5kX3Rva2VuLnB2QnVmZmVyICsoaW50KXNzcGlfd190b2tlblswXS5jYkJ1ZmZlciwKICAgICAgICAgICAgc3NwaV93X3Rva2VuWzFdLnB2QnVmZmVyLCBzc3BpX3dfdG9rZW5bMV0uY2JCdWZmZXIpOwogICAgIG1lbWNweSgoUFVDSEFSKSBzc3BpX3NlbmRfdG9rZW4ucHZCdWZmZXIKLSAgICAgICAgICAgK3NzcGlfd190b2tlblswXS5jYkJ1ZmZlcgotICAgICAgICAgICArc3NwaV93X3Rva2VuWzFdLmNiQnVmZmVyLAorICAgICAgICAgICArIHNzcGlfd190b2tlblswXS5jYkJ1ZmZlcgorICAgICAgICAgICArIHNzcGlfd190b2tlblsxXS5jYkJ1ZmZlciwKICAgICAgICAgICAgc3NwaV93X3Rva2VuWzJdLnB2QnVmZmVyLCBzc3BpX3dfdG9rZW5bMl0uY2JCdWZmZXIpOwogCiAgICAgc19wU2VjRm4tPkZyZWVDb250ZXh0QnVmZmVyKHNzcGlfd190b2tlblswXS5wdkJ1ZmZlcik7CkBAIC00NjAsNyArNDYwLDcgQEAKICAgICBzc3BpX3dfdG9rZW5bMl0uY2JCdWZmZXIgPSAwOwogCiAgICAgdXNfbGVuZ3RoID0gaHRvbnMoKHNob3J0KXNzcGlfc2VuZF90b2tlbi5jYkJ1ZmZlcik7Ci0gICAgbWVtY3B5KHNvY2tzcmVxKzIsICZ1c19sZW5ndGgsIHNpemVvZihzaG9ydCkpOworICAgIG1lbWNweShzb2Nrc3JlcSArIDIsICZ1c19sZW5ndGgsIHNpemVvZihzaG9ydCkpOwogICB9CiAKICAgY29kZSA9IEN1cmxfd3JpdGVfcGxhaW4oY29ubiwgc29jaywgKGNoYXIgKilzb2Nrc3JlcSwgNCwgJndyaXR0ZW4pOwpAQCAtNTE3LDcgKzUxNyw3IEBACiAgICAgcmV0dXJuIENVUkxFX0NPVUxETlRfQ09OTkVDVDsKICAgfQogCi0gIG1lbWNweSgmdXNfbGVuZ3RoLCBzb2Nrc3JlcSsyLCBzaXplb2Yoc2hvcnQpKTsKKyAgbWVtY3B5KCZ1c19sZW5ndGgsIHNvY2tzcmVxICsgMiwgc2l6ZW9mKHNob3J0KSk7CiAgIHVzX2xlbmd0aCA9IG50b2hzKHVzX2xlbmd0aCk7CiAKICAgc3NwaV93X3Rva2VuWzBdLmNiQnVmZmVyID0gdXNfbGVuZ3RoOwpAQCAtNTg4LDggKzU4OCw4IEBACiAgIH0KIAogICBpbmZvZihkYXRhLCAiU09DS1M1IGFjY2VzcyB3aXRoJXMgcHJvdGVjdGlvbiBncmFudGVkLlxuIiwKLSAgICAgICAgKHNvY2tzcmVxWzBdPT0wKT8ib3V0IEdTUy1BUEkgZGF0YSI6Ci0gICAgICAgICgoc29ja3NyZXFbMF09PTEpPyIgR1NTLUFQSSBpbnRlZ3JpdHkiOiIgR1NTLUFQSSBjb25maWRlbnRpYWxpdHkiKSk7CisgICAgICAgIChzb2Nrc3JlcVswXSA9PSAwKT8ib3V0IEdTUy1BUEkgZGF0YSI6CisgICAgICAgICgoc29ja3NyZXFbMF0gPT0gMSk/IiBHU1MtQVBJIGludGVncml0eSI6IiBHU1MtQVBJIGNvbmZpZGVudGlhbGl0eSIpKTsKIAogICAvKiBGb3IgbGF0ZXIgdXNlIGlmIGVuY3J5cHRpb24gaXMgcmVxdWlyZWQKICAgICAgY29ubi0+c29ja3M1X2dzc2FwaV9lbmN0eXBlID0gc29ja3NyZXFbMF07CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zcGVlZGNoZWNrLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zcGVlZGNoZWNrLmMKaW5kZXggOGFkZGVkZC4uZmU2NjlmMSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc3BlZWRjaGVjay5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3NwZWVkY2hlY2suYwpAQCAtMzAsMTQgKzMwLDE0IEBACiAKIHZvaWQgQ3VybF9zcGVlZGluaXQoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKIHsKLSAgbWVtc2V0KCZkYXRhLT5zdGF0ZS5rZWVwc19zcGVlZCwgMCwgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSk7CisgIG1lbXNldCgmZGF0YS0+c3RhdGUua2VlcHNfc3BlZWQsIDAsIHNpemVvZihzdHJ1Y3QgY3VybHRpbWUpKTsKIH0KIAogLyoKICAqIEB1bml0dGVzdDogMTYwNgogICovCiBDVVJMY29kZSBDdXJsX3NwZWVkY2hlY2soc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCBub3cpCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGN1cmx0aW1lIG5vdykKIHsKICAgaWYoKGRhdGEtPnByb2dyZXNzLmN1cnJlbnRfc3BlZWQgPj0gMCkgJiYgZGF0YS0+c2V0Lmxvd19zcGVlZF90aW1lKSB7CiAgICAgaWYoZGF0YS0+cHJvZ3Jlc3MuY3VycmVudF9zcGVlZCA8IGRhdGEtPnNldC5sb3dfc3BlZWRfbGltaXQpIHsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NwZWVkY2hlY2suaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3NwZWVkY2hlY2suaAppbmRleCA3ZGJlM2Q2Li41YzJkYzlhIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zcGVlZGNoZWNrLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc3BlZWRjaGVjay5oCkBAIC03LDcgKzcsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTAsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC0yOCw2ICsyOCw2IEBACiAKIHZvaWQgQ3VybF9zcGVlZGluaXQoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSk7CiBDVVJMY29kZSBDdXJsX3NwZWVkY2hlY2soc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCBub3cpOworICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjdXJsdGltZSBub3cpOwogCiAjZW5kaWYgLyogSEVBREVSX0NVUkxfU1BFRURDSEVDS19IICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zcGxheS5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc3BsYXkuYwppbmRleCAxYjMwMWY5Li42OWFmNDQ2IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zcGxheS5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3NwbGF5LmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk3IC0gMjAxNSwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5NyAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTM3LDcgKzM3LDcgQEAKICAqIFNwbGF5IHVzaW5nIHRoZSBrZXkgaSAod2hpY2ggbWF5IG9yIG1heSBub3QgYmUgaW4gdGhlIHRyZWUuKSBUaGUgc3RhcnRpbmcKICAqIHJvb3QgaXMgdC4KICAqLwotc3RydWN0IEN1cmxfdHJlZSAqQ3VybF9zcGxheShzdHJ1Y3QgdGltZXZhbCBpLAorc3RydWN0IEN1cmxfdHJlZSAqQ3VybF9zcGxheShzdHJ1Y3QgY3VybHRpbWUgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEN1cmxfdHJlZSAqdCkKIHsKICAgc3RydWN0IEN1cmxfdHJlZSBOLCAqbCwgKnIsICp5OwpAQCAtOTcsMjQgKzk3LDI2IEBACiAgKgogICogQHVuaXR0ZXN0OiAxMzA5CiAgKi8KLXN0cnVjdCBDdXJsX3RyZWUgKkN1cmxfc3BsYXlpbnNlcnQoc3RydWN0IHRpbWV2YWwgaSwKK3N0cnVjdCBDdXJsX3RyZWUgKkN1cmxfc3BsYXlpbnNlcnQoc3RydWN0IGN1cmx0aW1lIGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDdXJsX3RyZWUgKnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDdXJsX3RyZWUgKm5vZGUpCiB7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdGltZXZhbCBLRVlfTk9UVVNFRCA9IHstMSwgLTF9OyAvKiB3aWxsICpORVZFUiogYXBwZWFyICovCisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY3VybHRpbWUgS0VZX05PVFVTRUQgPSB7CisgICAgKHRpbWVfdCktMSwgKHVuc2lnbmVkIGludCktMQorICB9OyAvKiB3aWxsICpORVZFUiogYXBwZWFyICovCiAKICAgaWYobm9kZSA9PSBOVUxMKQogICAgIHJldHVybiB0OwogCiAgIGlmKHQgIT0gTlVMTCkgewogICAgIHQgPSBDdXJsX3NwbGF5KGksIHQpOwotICAgIGlmKGNvbXBhcmUoaSwgdC0+a2V5KT09MCkgeworICAgIGlmKGNvbXBhcmUoaSwgdC0+a2V5KSA9PSAwKSB7CiAgICAgICAvKiBUaGVyZSBhbHJlYWR5IGV4aXN0cyBhIG5vZGUgaW4gdGhlIHRyZWUgd2l0aCB0aGUgdmVyeSBzYW1lIGtleS4gQnVpbGQKICAgICAgICAgIGEgZG91Ymx5LWxpbmtlZCBjaXJjdWxhciBsaXN0IG9mIG5vZGVzLiBXZSBhZGQgdGhlIG5ldyAnbm9kZScgc3RydWN0CiAgICAgICAgICB0byB0aGUgZW5kIG9mIHRoaXMgbGlzdC4gKi8KIAogICAgICAgbm9kZS0+a2V5ID0gS0VZX05PVFVTRUQ7IC8qIHdlIHNldCB0aGUga2V5IGluIHRoZSBzdWIgbm9kZSB0byBOT1RVU0VECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcXVpY2tseSBpZGVudGlmeSB0aGlzIG5vZGUgYXMgYSBzdWJub2RlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcXVpY2tseSBpZGVudGlmeSB0aGlzIG5vZGUgYXMgYSBzdWJub2RlICovCiAgICAgICBub2RlLT5zYW1lbiA9IHQ7CiAgICAgICBub2RlLT5zYW1lcCA9IHQtPnNhbWVwOwogICAgICAgdC0+c2FtZXAtPnNhbWVuID0gbm9kZTsKQEAgLTE0OSwxMSArMTUxLDExIEBACiAvKiBGaW5kcyBhbmQgZGVsZXRlcyB0aGUgYmVzdC1maXQgbm9kZSBmcm9tIHRoZSB0cmVlLiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZQogICAgcmVzdWx0aW5nIHRyZWUuICBiZXN0LWZpdCBtZWFucyB0aGUgc21hbGxlc3Qgbm9kZSBpZiBpdCBpcyBub3QgbGFyZ2VyIHRoYW4KICAgIHRoZSBrZXkgKi8KLXN0cnVjdCBDdXJsX3RyZWUgKkN1cmxfc3BsYXlnZXRiZXN0KHN0cnVjdCB0aW1ldmFsIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF90cmVlICp0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEN1cmxfdHJlZSAqKnJlbW92ZWQpCitzdHJ1Y3QgQ3VybF90cmVlICpDdXJsX3NwbGF5Z2V0YmVzdChzdHJ1Y3QgY3VybHRpbWUgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDdXJsX3RyZWUgKnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF90cmVlICoqcmVtb3ZlZCkKIHsKLSAgc3RhdGljIHN0cnVjdCB0aW1ldmFsIHR2X3plcm8gPSB7MCwgMH07CisgIHN0YXRpYyBzdHJ1Y3QgY3VybHRpbWUgdHZfemVybyA9IHswLCAwfTsKICAgc3RydWN0IEN1cmxfdHJlZSAqeDsKIAogICBpZighdCkgewpAQCAtMjA5LDcgKzIxMSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF90cmVlICpyZW1vdmVub2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEN1cmxfdHJlZSAqKm5ld3Jvb3QpCiB7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdGltZXZhbCBLRVlfTk9UVVNFRCA9IHstMSwgLTF9OyAvKiB3aWxsICpORVZFUiogYXBwZWFyICovCisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY3VybHRpbWUgS0VZX05PVFVTRUQgPSB7CisgICAgKHRpbWVfdCktMSwgKHVuc2lnbmVkIGludCktMQorICB9OyAvKiB3aWxsICpORVZFUiogYXBwZWFyICovCiAgIHN0cnVjdCBDdXJsX3RyZWUgKng7CiAKICAgaWYoIXQgfHwgIXJlbW92ZW5vZGUpCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zcGxheS5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc3BsYXkuaAppbmRleCBkYTgxODk0Li40NjEyZWMyIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zcGxheS5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3NwbGF5LmgKQEAgLTcsNyArNyw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk3IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5NyAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTIyLDMwICsyMiwzMSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSAiY3VybF9zZXR1cC5oIgorI2luY2x1ZGUgInRpbWV2YWwuaCIKIAogc3RydWN0IEN1cmxfdHJlZSB7CiAgIHN0cnVjdCBDdXJsX3RyZWUgKnNtYWxsZXI7IC8qIHNtYWxsZXIgbm9kZSAqLwogICBzdHJ1Y3QgQ3VybF90cmVlICpsYXJnZXI7ICAvKiBsYXJnZXIgbm9kZSAqLwogICBzdHJ1Y3QgQ3VybF90cmVlICpzYW1lbjsgICAvKiBwb2ludHMgdG8gdGhlIG5leHQgbm9kZSB3aXRoIGlkZW50aWNhbCBrZXkgKi8KICAgc3RydWN0IEN1cmxfdHJlZSAqc2FtZXA7ICAgLyogcG9pbnRzIHRvIHRoZSBwcmV2IG5vZGUgd2l0aCBpZGVudGljYWwga2V5ICovCi0gIHN0cnVjdCB0aW1ldmFsIGtleTsgICAgICAgIC8qIHRoaXMgbm9kZSdzICJzb3J0IiBrZXkgKi8KKyAgc3RydWN0IGN1cmx0aW1lIGtleTsgICAgICAgIC8qIHRoaXMgbm9kZSdzICJzb3J0IiBrZXkgKi8KICAgdm9pZCAqcGF5bG9hZDsgICAgICAgICAgICAgLyogZGF0YSB0aGUgc3BsYXkgY29kZSBkb2Vzbid0IGNhcmUgYWJvdXQgKi8KIH07CiAKLXN0cnVjdCBDdXJsX3RyZWUgKkN1cmxfc3BsYXkoc3RydWN0IHRpbWV2YWwgaSwKK3N0cnVjdCBDdXJsX3RyZWUgKkN1cmxfc3BsYXkoc3RydWN0IGN1cmx0aW1lIGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDdXJsX3RyZWUgKnQpOwogCi1zdHJ1Y3QgQ3VybF90cmVlICpDdXJsX3NwbGF5aW5zZXJ0KHN0cnVjdCB0aW1ldmFsIGtleSwKK3N0cnVjdCBDdXJsX3RyZWUgKkN1cmxfc3BsYXlpbnNlcnQoc3RydWN0IGN1cmx0aW1lIGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEN1cmxfdHJlZSAqdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEN1cmxfdHJlZSAqbmV3bm9kZSk7CiAKICNpZiAwCi1zdHJ1Y3QgQ3VybF90cmVlICpDdXJsX3NwbGF5cmVtb3ZlKHN0cnVjdCB0aW1ldmFsIGtleSwKK3N0cnVjdCBDdXJsX3RyZWUgKkN1cmxfc3BsYXlyZW1vdmUoc3RydWN0IGN1cmx0aW1lIGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEN1cmxfdHJlZSAqdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEN1cmxfdHJlZSAqKnJlbW92ZWQpOwogI2VuZGlmCiAKLXN0cnVjdCBDdXJsX3RyZWUgKkN1cmxfc3BsYXlnZXRiZXN0KHN0cnVjdCB0aW1ldmFsIGtleSwKK3N0cnVjdCBDdXJsX3RyZWUgKkN1cmxfc3BsYXlnZXRiZXN0KHN0cnVjdCBjdXJsdGltZSBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF90cmVlICp0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEN1cmxfdHJlZSAqKnJlbW92ZWQpOwogCkBAIC01Myw4ICs1NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF90cmVlICpyZW1vdmVub2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEN1cmxfdHJlZSAqKm5ld3Jvb3QpOwogCi0jZGVmaW5lIEN1cmxfc3BsYXljb21wYXJla2V5cyhpLGopICggKChpLnR2X3NlYykgIDwgKGoudHZfc2VjKSkgID8gLTEgOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKChpLnR2X3NlYykgID4gKGoudHZfc2VjKSkgID8gIDEgOiBcCisjZGVmaW5lIEN1cmxfc3BsYXljb21wYXJla2V5cyhpLGopICggKChpLnR2X3NlYykgIDwgKGoudHZfc2VjKSkgPyAtMSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoKGkudHZfc2VjKSAgPiAoai50dl9zZWMpKSA/ICAxIDogXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICgoaS50dl91c2VjKSA8IChqLnR2X3VzZWMpKSA/IC0xIDogXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICgoaS50dl91c2VjKSA+IChqLnR2X3VzZWMpKSA/ICAxIDogMCkpKSkKIApkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc3NoLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zc2guYwppbmRleCAwMGFlY2E5Li41NDA2YmYwIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zc2guYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zc2guYwpAQCAtMTc3LDYgKzE3Nyw3IEBACiAgIHNzaF9wZXJmb3JtX2dldHNvY2ssICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIHNjcF9kaXNjb25uZWN0LCAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9TU0gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19TQ1AsICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9ESVJMT0NLIHwgUFJPVE9QVF9DTE9TRUFDVElPTgpAQCAtMjAzLDYgKzIwNCw3IEBACiAgIHNzaF9wZXJmb3JtX2dldHNvY2ssICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIHNmdHBfZGlzY29ubmVjdCwgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9TU0gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19TRlRQLCAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9ESVJMT0NLIHwgUFJPVE9QVF9DTE9TRUFDVElPTgpAQCAtNDI2LDE0ICs0MjgsMTQgQEAKIAogICAvKiBDaGVjayBmb3IgL34vLCBpbmRpY2F0aW5nIHJlbGF0aXZlIHRvIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgKi8KICAgaWYoY29ubi0+aGFuZGxlci0+cHJvdG9jb2wgJiBDVVJMUFJPVE9fU0NQKSB7Ci0gICAgcmVhbF9wYXRoID0gbWFsbG9jKHdvcmtpbmdfcGF0aF9sZW4rMSk7CisgICAgcmVhbF9wYXRoID0gbWFsbG9jKHdvcmtpbmdfcGF0aF9sZW4gKyAxKTsKICAgICBpZihyZWFsX3BhdGggPT0gTlVMTCkgewogICAgICAgZnJlZSh3b3JraW5nX3BhdGgpOwogICAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CiAgICAgfQogICAgIGlmKCh3b3JraW5nX3BhdGhfbGVuID4gMykgJiYgKCFtZW1jbXAod29ya2luZ19wYXRoLCAiL34vIiwgMykpKQogICAgICAgLyogSXQgaXMgcmVmZXJlbmNlZCB0byB0aGUgaG9tZSBkaXJlY3RvcnksIHNvIHN0cmlwIHRoZSBsZWFkaW5nICcvfi8nICovCi0gICAgICBtZW1jcHkocmVhbF9wYXRoLCB3b3JraW5nX3BhdGgrMywgNCArIHdvcmtpbmdfcGF0aF9sZW4tMyk7CisgICAgICBtZW1jcHkocmVhbF9wYXRoLCB3b3JraW5nX3BhdGggKyAzLCA0ICsgd29ya2luZ19wYXRoX2xlbi0zKTsKICAgICBlbHNlCiAgICAgICBtZW1jcHkocmVhbF9wYXRoLCB3b3JraW5nX3BhdGgsIDEgKyB3b3JraW5nX3BhdGhfbGVuKTsKICAgfQpAQCAtNDQ5LDE5ICs0NTEsMTkgQEAKICAgICAgICAgIGxlYWRpbmcgJy8nICovCiAgICAgICBtZW1jcHkocmVhbF9wYXRoLCBob21lZGlyLCBob21lbGVuKTsKICAgICAgIHJlYWxfcGF0aFtob21lbGVuXSA9ICcvJzsKLSAgICAgIHJlYWxfcGF0aFtob21lbGVuKzFdID0gJ1wwJzsKKyAgICAgIHJlYWxfcGF0aFtob21lbGVuICsgMV0gPSAnXDAnOwogICAgICAgaWYod29ya2luZ19wYXRoX2xlbiA+IDMpIHsKLSAgICAgICAgbWVtY3B5KHJlYWxfcGF0aCtob21lbGVuKzEsIHdvcmtpbmdfcGF0aCArIDMsCisgICAgICAgIG1lbWNweShyZWFsX3BhdGggKyBob21lbGVuICsgMSwgd29ya2luZ19wYXRoICsgMywKICAgICAgICAgICAgICAgIDEgKyB3b3JraW5nX3BhdGhfbGVuIC0zKTsKICAgICAgIH0KICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICByZWFsX3BhdGggPSBtYWxsb2Mod29ya2luZ19wYXRoX2xlbisxKTsKKyAgICAgIHJlYWxfcGF0aCA9IG1hbGxvYyh3b3JraW5nX3BhdGhfbGVuICsgMSk7CiAgICAgICBpZihyZWFsX3BhdGggPT0gTlVMTCkgewogICAgICAgICBmcmVlKHdvcmtpbmdfcGF0aCk7CiAgICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICAgICAgfQotICAgICAgbWVtY3B5KHJlYWxfcGF0aCwgd29ya2luZ19wYXRoLCAxK3dvcmtpbmdfcGF0aF9sZW4pOworICAgICAgbWVtY3B5KHJlYWxfcGF0aCwgd29ya2luZ19wYXRoLCAxICsgd29ya2luZ19wYXRoX2xlbik7CiAgICAgfQogICB9CiAKQEAgLTE4MTEsNyArMTgxMyw3IEBACiAgICAgICAgICAgICAgemVybyBldmVuIHRob3VnaCBsaWJzc2gyX3NmdHBfb3BlbigpIGZhaWxlZCBwcmV2aW91c2x5ISBXZSBuZWVkCiAgICAgICAgICAgICAgdG8gd29yayBhcm91bmQgdGhhdCEgKi8KICAgICAgICAgICBzc2hjLT5hY3R1YWxjb2RlID0gQ1VSTEVfU1NIOwotICAgICAgICAgIGVycj0tMTsKKyAgICAgICAgICBlcnIgPSAtMTsKICAgICAgICAgfQogICAgICAgICBmYWlsZihkYXRhLCAiVXBsb2FkIGZhaWxlZDogJXMgKCVkLyVkKSIsCiAgICAgICAgICAgICAgIGVycj49IExJQlNTSDJfRlhfT0s/c2Z0cF9saWJzc2gyX3N0cmVycm9yKGVycik6InNzaCBlcnJvciIsCkBAIC0xODI5LDcgKzE4MzEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYoc2Vla2VyciAhPSBDVVJMX1NFRUtGVU5DX09LKSB7Ci0gICAgICAgICAgY3VybF9vZmZfdCBwYXNzZWQ9MDsKKyAgICAgICAgICBjdXJsX29mZl90IHBhc3NlZCA9IDA7CiAKICAgICAgICAgICBpZihzZWVrZXJyICE9IENVUkxfU0VFS0ZVTkNfQ0FOVFNFRUspIHsKICAgICAgICAgICAgIGZhaWxmKGRhdGEsICJDb3VsZCBub3Qgc2VlayBzdHJlYW0iKTsKQEAgLTE5ODEsMTMgKzE5ODMsMTMgQEAKICAgICAgICAgc3NoYy0+YWN0dWFsY29kZSA9IHJlc3VsdD9yZXN1bHQ6Q1VSTEVfU1NIOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIHNzaGMtPnJlYWRkaXJfZmlsZW5hbWUgPSBtYWxsb2MoUEFUSF9NQVgrMSk7CisgICAgICBzc2hjLT5yZWFkZGlyX2ZpbGVuYW1lID0gbWFsbG9jKFBBVEhfTUFYICsgMSk7CiAgICAgICBpZighc3NoYy0+cmVhZGRpcl9maWxlbmFtZSkgewogICAgICAgICBzdGF0ZShjb25uLCBTU0hfU0ZUUF9DTE9TRSk7CiAgICAgICAgIHNzaGMtPmFjdHVhbGNvZGUgPSBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIHNzaGMtPnJlYWRkaXJfbG9uZ2VudHJ5ID0gbWFsbG9jKFBBVEhfTUFYKzEpOworICAgICAgc3NoYy0+cmVhZGRpcl9sb25nZW50cnkgPSBtYWxsb2MoUEFUSF9NQVggKyAxKTsKICAgICAgIGlmKCFzc2hjLT5yZWFkZGlyX2xvbmdlbnRyeSkgewogICAgICAgICBDdXJsX3NhZmVmcmVlKHNzaGMtPnJlYWRkaXJfZmlsZW5hbWUpOwogICAgICAgICBzdGF0ZShjb25uLCBTU0hfU0ZUUF9DTE9TRSk7CkBAIC0yMDIxLDcgKzIwMjMsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQogICAgICAgICAgIHJlc3VsdCA9IEN1cmxfY2xpZW50X3dyaXRlKGNvbm4sIENMSUVOVFdSSVRFX0JPRFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wTGluZSwgc3NoYy0+cmVhZGRpcl9sZW4rMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wTGluZSwgc3NoYy0+cmVhZGRpcl9sZW4gKyAxKTsKICAgICAgICAgICBmcmVlKHRtcExpbmUpOwogCiAgICAgICAgICAgaWYocmVzdWx0KSB7CkBAIC0yMDMwLDcgKzIwMzIsNyBAQAogICAgICAgICAgIH0KICAgICAgICAgICAvKiBzaW5jZSB0aGlzIGNvdW50cyB3aGF0IHdlIHNlbmQgdG8gdGhlIGNsaWVudCwgd2UgaW5jbHVkZSB0aGUKICAgICAgICAgICAgICBuZXdsaW5lIGluIHRoaXMgY291bnRlciAqLwotICAgICAgICAgIGRhdGEtPnJlcS5ieXRlY291bnQgKz0gc3NoYy0+cmVhZGRpcl9sZW4rMTsKKyAgICAgICAgICBkYXRhLT5yZXEuYnl0ZWNvdW50ICs9IHNzaGMtPnJlYWRkaXJfbGVuICsgMTsKIAogICAgICAgICAgIC8qIG91dHB1dCBkZWJ1ZyBvdXRwdXQgaWYgdGhhdCBpcyByZXF1ZXN0ZWQgKi8KICAgICAgICAgICBpZihkYXRhLT5zZXQudmVyYm9zZSkgewpAQCAtMjIzMSwxOCArMjIzMywyNSBAQAogICAgICAgICAgIGN1cmxfb2ZmX3QgZnJvbSwgdG87CiAgICAgICAgICAgY2hhciAqcHRyOwogICAgICAgICAgIGNoYXIgKnB0cjI7CisgICAgICAgICAgQ1VSTG9mZnQgdG9fdDsKKyAgICAgICAgICBDVVJMb2ZmdCBmcm9tX3Q7CiAKLSAgICAgICAgICBmcm9tPWN1cmx4X3N0cnRvb2ZmdChjb25uLT5kYXRhLT5zdGF0ZS5yYW5nZSwgJnB0ciwgMCk7Ci0gICAgICAgICAgd2hpbGUoKnB0ciAmJiAoSVNTUEFDRSgqcHRyKSB8fCAoKnB0cj09Jy0nKSkpCisgICAgICAgICAgZnJvbV90ID0gY3VybHhfc3RydG9vZmZ0KGNvbm4tPmRhdGEtPnN0YXRlLnJhbmdlLCAmcHRyLCAwLCAmZnJvbSk7CisgICAgICAgICAgaWYoZnJvbV90ID09IENVUkxfT0ZGVF9GTE9XKQorICAgICAgICAgICAgcmV0dXJuIENVUkxFX1JBTkdFX0VSUk9SOworICAgICAgICAgIHdoaWxlKCpwdHIgJiYgKElTU1BBQ0UoKnB0cikgfHwgKCpwdHIgPT0gJy0nKSkpCiAgICAgICAgICAgICBwdHIrKzsKLSAgICAgICAgICB0bz1jdXJseF9zdHJ0b29mZnQocHRyLCAmcHRyMiwgMCk7Ci0gICAgICAgICAgaWYoKHB0ciA9PSBwdHIyKSAvKiBubyAidG8iIHZhbHVlIGdpdmVuICovCisgICAgICAgICAgdG9fdCA9IGN1cmx4X3N0cnRvb2ZmdChwdHIsICZwdHIyLCAwLCAmdG8pOworICAgICAgICAgIGlmKHRvX3QgPT0gQ1VSTF9PRkZUX0ZMT1cpCisgICAgICAgICAgICByZXR1cm4gQ1VSTEVfUkFOR0VfRVJST1I7CisgICAgICAgICAgaWYoKHRvX3QgPT0gQ1VSTF9PRkZUX0lOVkFMKSAvKiBubyAidG8iIHZhbHVlIGdpdmVuICovCiAgICAgICAgICAgICAgfHwgKHRvID49IHNpemUpKSB7CiAgICAgICAgICAgICB0byA9IHNpemUgLSAxOwogICAgICAgICAgIH0KLSAgICAgICAgICBpZihmcm9tIDwgMCkgeworICAgICAgICAgIGlmKGZyb21fdCkgewogICAgICAgICAgICAgLyogZnJvbSBpcyByZWxhdGl2ZSB0byBlbmQgb2YgZmlsZSAqLwotICAgICAgICAgICAgZnJvbSArPSBzaXplOworICAgICAgICAgICAgZnJvbSA9IHNpemUgLSB0bzsKKyAgICAgICAgICAgIHRvID0gc2l6ZSAtIDE7CiAgICAgICAgICAgfQogICAgICAgICAgIGlmKGZyb20gPiBzaXplKSB7CiAgICAgICAgICAgICBmYWlsZihkYXRhLCAiT2Zmc2V0ICglIgpAQCAtMjgyNSw3ICsyODM0LDcgQEAKICAgd2hpbGUoKHNzaGMtPnN0YXRlICE9IFNTSF9TVE9QKSAmJiAhcmVzdWx0KSB7CiAgICAgYm9vbCBibG9jazsKICAgICB0aW1lX3QgbGVmdCA9IDEwMDA7Ci0gICAgc3RydWN0IHRpbWV2YWwgbm93ID0gQ3VybF90dm5vdygpOworICAgIHN0cnVjdCBjdXJsdGltZSBub3cgPSBDdXJsX3R2bm93KCk7CiAKICAgICByZXN1bHQgPSBzc2hfc3RhdGVtYWNoX2FjdChjb25uLCAmYmxvY2spOwogICAgIGlmKHJlc3VsdCkKQEAgLTI5MzMsNiArMjk0MiwxMyBAQAogICAgIHJldHVybiBDVVJMRV9GQUlMRURfSU5JVDsKICAgfQogCisgIGlmKGRhdGEtPnNldC5zc2hfY29tcHJlc3Npb24pIHsKKyNpZiBMSUJTU0gyX1ZFUlNJT05fTlVNID49IDB4MDEwMjA4CisgICAgaWYobGlic3NoMl9zZXNzaW9uX2ZsYWcoc3NoLT5zc2hfc2Vzc2lvbiwgTElCU1NIMl9GTEFHX0NPTVBSRVNTLCAxKSA8IDApCisjZW5kaWYKKyAgICAgIGluZm9mKGRhdGEsICJGYWlsZWQgdG8gZW5hYmxlIGNvbXByZXNzaW9uIGZvciBzc2ggc2Vzc2lvblxuIik7CisgIH0KKwogI2lmZGVmIEhBVkVfTElCU1NIMl9LTk9XTkhPU1RfQVBJCiAgIGlmKGRhdGEtPnNldC5zdHJbU1RSSU5HX1NTSF9LTk9XTkhPU1RTXSkgewogICAgIGludCByYzsKQEAgLTMwMjksOCArMzA0NSw4IEBACiAgIGRhdGEtPnJlcS5zaXplID0gLTE7IC8qIG1ha2Ugc3VyZSB0aGlzIGlzIHVua25vd24gYXQgdGhpcyBwb2ludCAqLwogCiAgIHNzaGMtPmFjdHVhbGNvZGUgPSBDVVJMRV9PSzsgLyogcmVzZXQgZXJyb3IgY29kZSAqLwotICBzc2hjLT5zZWNvbmRDcmVhdGVEaXJzID0wOyAgIC8qIHJlc2V0IHRoZSBjcmVhdGUgZGlyIGF0dGVtcHQgc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSAqLworICBzc2hjLT5zZWNvbmRDcmVhdGVEaXJzID0gMDsgICAvKiByZXNldCB0aGUgY3JlYXRlIGRpciBhdHRlbXB0IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlICovCiAKICAgQ3VybF9wZ3JzU2V0VXBsb2FkQ291bnRlcihkYXRhLCAwKTsKICAgQ3VybF9wZ3JzU2V0RG93bmxvYWRDb3VudGVyKGRhdGEsIDApOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc3RyY2FzZS5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc3RyY2FzZS5jCmluZGV4IGE3NGE0YmUuLjI0YmNjYTkgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3N0cmNhc2UuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zdHJjYXNlLmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTk0LDEwICs5NCwxMSBAQAogfQogCiAvKgotICogQ3VybF9yYXdfZXF1YWwoKSBpcyBmb3IgZG9pbmcgInJhdyIgY2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmdzLiBUaGlzIGlzIG1lYW50Ci0gKiB0byBiZSBsb2NhbGUgaW5kZXBlbmRlbnQgYW5kIG9ubHkgY29tcGFyZSBzdHJpbmdzIHdlIGtub3cgYXJlIHNhZmUgZm9yCi0gKiB0aGlzLiAgU2VlIGh0dHBzOi8vZGFuaWVsLmhheHguc2UvYmxvZy8yMDA4LzEwLzE1L3N0cmNhc2VjbXAtaW4tdHVya2lzaC8gZm9yCi0gKiBzb21lIGZ1cnRoZXIgZXhwbGFuYXRpb24gdG8gd2h5IHRoaXMgZnVuY3Rpb24gaXMgbmVjZXNzYXJ5LgorICogQ3VybF9zdHJjYXNlY29tcGFyZSgpIGlzIGZvciBkb2luZyAicmF3IiBjYXNlIGluc2Vuc2l0aXZlIHN0cmluZ3MuIFRoaXMgaXMKKyAqIG1lYW50IHRvIGJlIGxvY2FsZSBpbmRlcGVuZGVudCBhbmQgb25seSBjb21wYXJlIHN0cmluZ3Mgd2Uga25vdyBhcmUgc2FmZQorICogZm9yIHRoaXMuICBTZWUKKyAqIGh0dHBzOi8vZGFuaWVsLmhheHguc2UvYmxvZy8yMDA4LzEwLzE1L3N0cmNhc2VjbXAtaW4tdHVya2lzaC8gZm9yIHNvbWUKKyAqIGZ1cnRoZXIgZXhwbGFuYXRpb24gdG8gd2h5IHRoaXMgZnVuY3Rpb24gaXMgbmVjZXNzYXJ5LgogICoKICAqIFRoZSBmdW5jdGlvbiBpcyBjYXBhYmxlIG9mIGNvbXBhcmluZyBhLXogY2FzZSBpbnNlbnNpdGl2ZWx5IGV2ZW4gZm9yCiAgKiBub24tYXNjaWkuCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zdHJkdXAuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3N0cmR1cC5jCmluZGV4IDEzNmI2OTMuLjE5Y2IwNDQgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3N0cmR1cC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3N0cmR1cC5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC00NCwxMSArNDQsMTEgQEAKICAgaWYobGVuID49ICgoc2l6ZV90KS0xKSAvIHNpemVvZihjaGFyKSkKICAgICByZXR1cm4gKGNoYXIgKilOVUxMOwogCi0gIG5ld3N0ciA9IG1hbGxvYygobGVuKzEpKnNpemVvZihjaGFyKSk7CisgIG5ld3N0ciA9IG1hbGxvYygobGVuICsgMSkqc2l6ZW9mKGNoYXIpKTsKICAgaWYoIW5ld3N0cikKICAgICByZXR1cm4gKGNoYXIgKilOVUxMOwogCi0gIG1lbWNweShuZXdzdHIsIHN0ciwgKGxlbisxKSpzaXplb2YoY2hhcikpOworICBtZW1jcHkobmV3c3RyLCBzdHIsIChsZW4gKyAxKSpzaXplb2YoY2hhcikpOwogCiAgIHJldHVybiBuZXdzdHI7CiAKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3N0cmVycm9yLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zdHJlcnJvci5jCmluZGV4IDdlNWNkZTQuLjgzYTk2ZGQgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3N0cmVycm9yLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc3RyZXJyb3IuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAyMDA0IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtNDksNiArNDksMTAgQEAKICNpbmNsdWRlICJjdXJsX21lbW9yeS5oIgogI2luY2x1ZGUgIm1lbWRlYnVnLmgiCiAKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpCisjZGVmaW5lIFBSRVNFUlZFX1dJTkRPV1NfRVJST1JfQ09ERQorI2VuZGlmCisKIGNvbnN0IGNoYXIgKgogY3VybF9lYXN5X3N0cmVycm9yKENVUkxjb2RlIGVycm9yKQogewpAQCAtNDMyLDYgKzQzNiwxMCBAQAogc3RhdGljIGNvbnN0IGNoYXIgKgogZ2V0X3dpbnNvY2tfZXJyb3IgKGludCBlcnIsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKIHsKKyNpZmRlZiBQUkVTRVJWRV9XSU5ET1dTX0VSUk9SX0NPREUKKyAgRFdPUkQgb2xkX3dpbl9lcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyNlbmRpZgorICBpbnQgb2xkX2Vycm5vID0gZXJybm87CiAgIGNvbnN0IGNoYXIgKnA7CiAKICNpZm5kZWYgQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUwpAQCAtNjExLDYgKzYxOSwxNSBAQAogI2VuZGlmCiAgIHN0cm5jcHkoYnVmLCBwLCBsZW4pOwogICBidWYgW2xlbi0xXSA9ICdcMCc7CisKKyAgaWYoZXJybm8gIT0gb2xkX2Vycm5vKQorICAgIGVycm5vID0gb2xkX2Vycm5vOworCisjaWZkZWYgUFJFU0VSVkVfV0lORE9XU19FUlJPUl9DT0RFCisgIGlmKG9sZF93aW5fZXJyICE9IEdldExhc3RFcnJvcigpKQorICAgIFNldExhc3RFcnJvcihvbGRfd2luX2Vycik7CisjZW5kaWYKKwogICByZXR1cm4gYnVmOwogfQogI2VuZGlmICAgLyogVVNFX1dJTlNPQ0sgKi8KQEAgLTYyOCw5ICs2NDUsMTIgQEAKICAqLwogY29uc3QgY2hhciAqQ3VybF9zdHJlcnJvcihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBlcnIpCiB7CisjaWZkZWYgUFJFU0VSVkVfV0lORE9XU19FUlJPUl9DT0RFCisgIERXT1JEIG9sZF93aW5fZXJyID0gR2V0TGFzdEVycm9yKCk7CisjZW5kaWYKKyAgaW50IG9sZF9lcnJubyA9IGVycm5vOwogICBjaGFyICpidWYsICpwOwogICBzaXplX3QgbWF4OwotICBpbnQgb2xkX2Vycm5vID0gRVJSTk87CiAKICAgREVCVUdBU1NFUlQoY29ubik7CiAgIERFQlVHQVNTRVJUKGVyciA+PSAwKTsKQEAgLTcyMiw4ICs3NDIsMTMgQEAKICAgaWYocCAmJiAocCAtIGJ1ZikgPj0gMSkKICAgICAqcCA9ICdcMCc7CiAKLSAgaWYob2xkX2Vycm5vICE9IEVSUk5PKQotICAgIFNFVF9FUlJOTyhvbGRfZXJybm8pOworICBpZihlcnJubyAhPSBvbGRfZXJybm8pCisgICAgZXJybm8gPSBvbGRfZXJybm87CisKKyNpZmRlZiBQUkVTRVJWRV9XSU5ET1dTX0VSUk9SX0NPREUKKyAgaWYob2xkX3dpbl9lcnIgIT0gR2V0TGFzdEVycm9yKCkpCisgICAgU2V0TGFzdEVycm9yKG9sZF93aW5fZXJyKTsKKyNlbmRpZgogCiAgIHJldHVybiBidWY7CiB9CkBAIC03MzEsMTYgKzc1NiwxOSBAQAogI2lmZGVmIFVTRV9XSU5ET1dTX1NTUEkKIGNvbnN0IGNoYXIgKkN1cmxfc3NwaV9zdHJlcnJvciAoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgZXJyKQogeworI2lmZGVmIFBSRVNFUlZFX1dJTkRPV1NfRVJST1JfQ09ERQorICBEV09SRCBvbGRfd2luX2VyciA9IEdldExhc3RFcnJvcigpOworI2VuZGlmCisgIGludCBvbGRfZXJybm8gPSBlcnJubzsKKyAgY29uc3QgY2hhciAqdHh0OworICBjaGFyICpvdXRidWY7CisgIHNpemVfdCBvdXRtYXg7CiAjaWZuZGVmIENVUkxfRElTQUJMRV9WRVJCT1NFX1NUUklOR1MKICAgY2hhciB0eHRidWZbODBdOwogICBjaGFyIG1zZ2J1ZltzaXplb2YoY29ubi0+c3lzZXJyX2J1ZildOwogICBjaGFyICpwLCAqc3RyLCAqbXNnID0gTlVMTDsKICAgYm9vbCBtc2dfZm9ybWF0dGVkID0gRkFMU0U7Ci0gIGludCBvbGRfZXJybm87CiAjZW5kaWYKLSAgY29uc3QgY2hhciAqdHh0OwotICBjaGFyICpvdXRidWY7Ci0gIHNpemVfdCBvdXRtYXg7CiAKICAgREVCVUdBU1NFUlQoY29ubik7CiAKQEAgLTc1MCw4ICs3NzgsNiBAQAogCiAjaWZuZGVmIENVUkxfRElTQUJMRV9WRVJCT1NFX1NUUklOR1MKIAotICBvbGRfZXJybm8gPSBFUlJOTzsKLQogICBzd2l0Y2goZXJyKSB7CiAgICAgY2FzZSBTRUNfRV9PSzoKICAgICAgIHR4dCA9ICJObyBlcnJvciI7CkBAIC0xMDUxLDkgKzEwNzcsNiBAQAogICAgICAgc3RybmNweShvdXRidWYsIHN0ciwgb3V0bWF4KTsKICAgfQogCi0gIGlmKG9sZF9lcnJubyAhPSBFUlJOTykKLSAgICBTRVRfRVJSTk8ob2xkX2Vycm5vKTsKLQogI2Vsc2UKIAogICBpZihlcnIgPT0gU0VDX0VfT0spCkBAIC0xMDY3LDYgKzEwOTAsMTQgQEAKIAogICBvdXRidWZbb3V0bWF4XSA9ICdcMCc7CiAKKyAgaWYoZXJybm8gIT0gb2xkX2Vycm5vKQorICAgIGVycm5vID0gb2xkX2Vycm5vOworCisjaWZkZWYgUFJFU0VSVkVfV0lORE9XU19FUlJPUl9DT0RFCisgIGlmKG9sZF93aW5fZXJyICE9IEdldExhc3RFcnJvcigpKQorICAgIFNldExhc3RFcnJvcihvbGRfd2luX2Vycik7CisjZW5kaWYKKwogICByZXR1cm4gb3V0YnVmOwogfQogI2VuZGlmIC8qIFVTRV9XSU5ET1dTX1NTUEkgKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3N0cnRvb2ZmdC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc3RydG9vZmZ0LmMKaW5kZXggYjg1NGJmNC4uODA3ZmM1NCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc3RydG9vZmZ0LmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc3RydG9vZmZ0LmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTIwLDYgKzIwLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlICJjdXJsX3NldHVwLmgiCiAKICNpbmNsdWRlICJzdHJ0b29mZnQuaCIKQEAgLTI5LDEwICszMCwzMiBAQAogICoKICAqIEluIHRoZSBJU08gQyBzdGFuZGFyZCAoSUVFRSBTdGQgMTAwMy4xKSwgdGhlcmUgaXMgYSBzdHJ0b2ltYXgoKSBmdW5jdGlvbiB3ZQogICogY291bGQgdXNlIGluIGNhc2Ugc3RydG9sbCgpIGRvZXNuJ3QgZXhpc3QuLi4gIFNlZQotICogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L2Z1bmN0aW9ucy9zdHJ0b2ltYXguaHRtbAorICogaHR0cHM6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS9mdW5jdGlvbnMvc3RydG9pbWF4Lmh0bWwKICAqLwogCi0jaWZkZWYgTkVFRF9DVVJMX1NUUlRPTEwKKyNpZiAoU0laRU9GX0NVUkxfT0ZGX1QgPiBTSVpFT0ZfTE9ORykKKyMgIGlmZGVmIEhBVkVfU1RSVE9MTAorIyAgICBkZWZpbmUgc3RydG9vZmYgc3RydG9sbAorIyAgZWxzZQorIyAgICBpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTMwMCkgJiYgKF9JTlRFR1JBTF9NQVhfQklUUyA+PSA2NCkKKyMgICAgICBpZiBkZWZpbmVkKF9TQUxfVkVSU0lPTikKKyAgICAgICAgIF9DaGVja19yZXR1cm5fIF9DUlRJTVAgX19pbnQ2NCBfX2NkZWNsIF9zdHJ0b2k2NCgKKyAgICAgICAgICAgICBfSW5fel8gY29uc3QgY2hhciAqX1N0cmluZywKKyAgICAgICAgICAgICBfT3V0X29wdF8gX0RlcmVmX3Bvc3Rfel8gY2hhciAqKl9FbmRQdHIsIF9Jbl8gaW50IF9SYWRpeCk7CisjICAgICAgZWxzZQorICAgICAgICAgX0NSVElNUCBfX2ludDY0IF9fY2RlY2wgX3N0cnRvaTY0KGNvbnN0IGNoYXIgKl9TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKl9FbmRQdHIsIGludCBfUmFkaXgpOworIyAgICAgIGVuZGlmCisjICAgICAgZGVmaW5lIHN0cnRvb2ZmIF9zdHJ0b2k2NAorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIFBSSVZBVEVfU1RSVE9PRkYgMQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgc3RydG9vZmYgc3RydG9sCisjZW5kaWYKKworI2lmZGVmIFBSSVZBVEVfU1RSVE9PRkYKIAogLyogUmFuZ2UgdGVzdHMgY2FuIGJlIHVzZWQgZm9yIGFscGhhbnVtIGRlY29kaW5nIGlmIGNoYXJhY3RlcnMgYXJlIGNvbnNlY3V0aXZlLAogICAgbGlrZSBpbiBBU0NJSS4gRWxzZSBhbiBhcnJheSBpcyBzY2FubmVkLiBEZXRlcm1pbmUgdGhpcyBjb25kaXRpb24gbm93LiAqLwpAQCAtNDgsMTEgKzcxLDEwIEBACiBzdGF0aWMgaW50IGdldF9jaGFyKGNoYXIgYywgaW50IGJhc2UpOwogCiAvKioKLSAqIEVtdWxhdGVkIHZlcnNpb24gb2YgdGhlIHN0cnRvbGwgZnVuY3Rpb24uICBUaGlzIGV4dHJhY3RzIGEgbG9uZyBsb25nCisgKiBDdXN0b20gdmVyc2lvbiBvZiB0aGUgc3RydG9vZmYgZnVuY3Rpb24uICBUaGlzIGV4dHJhY3RzIGEgY3VybF9vZmZfdAogICogdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgc3RyaW5nIGFuZCByZXR1cm5zIGl0LgogICovCi1jdXJsX29mZl90Ci1jdXJseF9zdHJ0b2xsKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKQorc3RhdGljIGN1cmxfb2ZmX3Qgc3RydG9vZmYoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UpCiB7CiAgIGNoYXIgKmVuZDsKICAgaW50IGlzX25lZ2F0aXZlID0gMDsKQEAgLTEzMiw3ICsxNTQsNyBAQAogICAgIGVsc2UKICAgICAgIHZhbHVlID0gQ1VSTF9PRkZfVF9NQVg7CiAKLSAgICBTRVRfRVJSTk8oRVJBTkdFKTsKKyAgICBlcnJubyA9IEVSQU5HRTsKICAgfQogCiAgIGlmKGVuZHB0cikKQEAgLTE4NiwzICsyMDgsMzQgQEAKICAgcmV0dXJuIHZhbHVlOwogfQogI2VuZGlmICAvKiBPbmx5IHByZXNlbnQgaWYgd2UgbmVlZCBzdHJ0b2xsLCBidXQgZG9uJ3QgaGF2ZSBpdC4gKi8KKworLyoKKyAqIFBhcnNlIGEgKnBvc2l0aXZlKiB1cCB0byA2NCBiaXQgbnVtYmVyIHdyaXR0ZW4gaW4gYXNjaWkuCisgKi8KK0NVUkxvZmZ0IGN1cmx4X3N0cnRvb2ZmdChjb25zdCBjaGFyICpzdHIsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX29mZl90ICpudW0pCit7CisgIGNoYXIgKmVuZDsKKyAgY3VybF9vZmZfdCBudW1iZXI7CisgIGVycm5vID0gMDsKKyAgKm51bSA9IDA7IC8qIGNsZWFyIGJ5IGRlZmF1bHQgKi8KKyAgd2hpbGUoc3RyICYmICpzdHIgJiYgSVNTUEFDRSgqc3RyKSkKKyAgICBzdHIrKzsKKyAgaWYoJy0nID09ICpzdHIpIHsKKyAgICBpZihlbmRwKQorICAgICAgKmVuZHAgPSAoY2hhciAqKXN0cjsgLyogZGlkbid0IGFjdHVhbGx5IG1vdmUgKi8KKyAgICByZXR1cm4gQ1VSTF9PRkZUX0lOVkFMOyAvKiBub3RoaW5nIHBhcnNlZCAqLworICB9CisgIG51bWJlciA9IHN0cnRvb2ZmKHN0ciwgJmVuZCwgYmFzZSk7CisgIGlmKGVuZHApCisgICAgKmVuZHAgPSBlbmQ7CisgIGlmKGVycm5vID09IEVSQU5HRSkKKyAgICAvKiBvdmVyZmxvdy91bmRlcmZsb3cgKi8KKyAgICByZXR1cm4gQ1VSTF9PRkZUX0ZMT1c7CisgIGVsc2UgaWYoc3RyID09IGVuZCkKKyAgICAvKiBub3RoaW5nIHBhcnNlZCAqLworICAgIHJldHVybiBDVVJMX09GRlRfSU5WQUw7CisKKyAgKm51bSA9IG51bWJlcjsKKyAgcmV0dXJuIENVUkxfT0ZGVF9PSzsKK30KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3N0cnRvb2ZmdC5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc3RydG9vZmZ0LmgKaW5kZXggZjQwMzlmMy4uMjQ0NDExYSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc3RydG9vZmZ0LmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc3RydG9vZmZ0LmgKQEAgLTcsNyArNyw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNCwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTQwLDMxICs0MCw3IEBACiAgKiBvZiAnbG9uZycgdGhlIGNvbnZlcnNpb24gZnVuY3Rpb24gdG8gdXNlIGlzIHN0cnRvbCgpLgogICovCiAKLSNpZiAoQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCA+IENVUkxfU0laRU9GX0xPTkcpCi0jICBpZmRlZiBIQVZFX1NUUlRPTEwKLSMgICAgZGVmaW5lIGN1cmx4X3N0cnRvb2ZmdCBzdHJ0b2xsCi0jICBlbHNlCi0jICAgIGlmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMzAwKSAmJiAoX0lOVEVHUkFMX01BWF9CSVRTID49IDY0KQotIyAgICAgIGlmIGRlZmluZWQoX1NBTF9WRVJTSU9OKQotICAgICAgICAgX0NoZWNrX3JldHVybl8gX0NSVElNUCBfX2ludDY0IF9fY2RlY2wgX3N0cnRvaTY0KAotICAgICAgICAgICAgIF9Jbl96XyBjb25zdCBjaGFyICpfU3RyaW5nLAotICAgICAgICAgICAgIF9PdXRfb3B0XyBfRGVyZWZfcG9zdF96XyBjaGFyICoqX0VuZFB0ciwgX0luXyBpbnQgX1JhZGl4KTsKLSMgICAgICBlbHNlCi0gICAgICAgICBfQ1JUSU1QIF9faW50NjQgX19jZGVjbCBfc3RydG9pNjQoY29uc3QgY2hhciAqX1N0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqX0VuZFB0ciwgaW50IF9SYWRpeCk7Ci0jICAgICAgZW5kaWYKLSMgICAgICBkZWZpbmUgY3VybHhfc3RydG9vZmZ0IF9zdHJ0b2k2NAotIyAgICBlbHNlCi0gICAgICAgY3VybF9vZmZfdCBjdXJseF9zdHJ0b2xsKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKTsKLSMgICAgICBkZWZpbmUgY3VybHhfc3RydG9vZmZ0IGN1cmx4X3N0cnRvbGwKLSMgICAgICBkZWZpbmUgTkVFRF9DVVJMX1NUUlRPTEwgMQotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbHNlCi0jICBkZWZpbmUgY3VybHhfc3RydG9vZmZ0IHN0cnRvbAotI2VuZGlmCi0KLSNpZiAoQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCA9PSA0KQorI2lmIChTSVpFT0ZfQ1VSTF9PRkZfVCA9PSA0KQogIyAgZGVmaW5lIENVUkxfT0ZGX1RfTUFYIENVUkxfT0ZGX1RfQygweDdGRkZGRkZGKQogI2Vsc2UKICAgIC8qIGFzc3VtZSBDVVJMX1NJWkVPRl9DVVJMX09GRl9UID09IDggKi8KQEAgLTcyLDQgKzQ4LDEzIEBACiAjZW5kaWYKICNkZWZpbmUgQ1VSTF9PRkZfVF9NSU4gKC1DVVJMX09GRl9UX01BWCAtIENVUkxfT0ZGX1RfQygxKSkKIAordHlwZWRlZiBlbnVtIHsKKyAgQ1VSTF9PRkZUX09LLCAgICAvKiBwYXJzZWQgZmluZSAqLworICBDVVJMX09GRlRfRkxPVywgIC8qIG92ZXIgb3IgdW5kZXJmbG93ICovCisgIENVUkxfT0ZGVF9JTlZBTCAgLyogbm90aGluZyB3YXMgcGFyc2VkICovCit9IENVUkxvZmZ0OworCitDVVJMb2ZmdCBjdXJseF9zdHJ0b29mZnQoY29uc3QgY2hhciAqc3RyLCBjaGFyICoqZW5kcCwgaW50IGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9vZmZfdCAqbnVtKTsKKwogI2VuZGlmIC8qIEhFQURFUl9DVVJMX1NUUlRPT0ZGVF9IICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi90ZWxuZXQuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3RlbG5ldC5jCmluZGV4IDE1NWQ0YjIuLmE3YmVkM2QgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3RlbG5ldC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3RlbG5ldC5jCkBAIC03Niw3ICs3Niw3IEBACiAgIH0gV0hJTEVfRkFMU0UKICNkZWZpbmUgQ1VSTF9TQl9BQ0NVTSh4LGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmKHgtPnN1YnBvaW50ZXIgPCAoeC0+c3ViYnVmZmVyK3NpemVvZiB4LT5zdWJidWZmZXIpKSAgIFwKKyAgICBpZih4LT5zdWJwb2ludGVyIDwgKHgtPnN1YmJ1ZmZlciArIHNpemVvZiB4LT5zdWJidWZmZXIpKSBcCiAgICAgICAqeC0+c3VicG9pbnRlcisrID0gKGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9IFdISUxFX0ZBTFNFCiAKQEAgLTE5Miw2ICsxOTIsNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfVEVMTkVULCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fVEVMTkVULCAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfTk9ORSB8IFBST1RPUFRfTk9VUkxRVUVSWSAgICAgLyogZmxhZ3MgKi8KQEAgLTI5NCw4ICsyOTUsOCBAQAogICBpbnQgaTsKICAgc3RydWN0IFRFTE5FVCAqdG4gPSAoc3RydWN0IFRFTE5FVCAqKSBjb25uLT5kYXRhLT5yZXEucHJvdG9wOwogCi0gIGZvcihpID0gMDtpIDwgQ1VSTF9OVEVMT1BUUztpKyspIHsKLSAgICBpZihpPT1DVVJMX1RFTE9QVF9FQ0hPKQorICBmb3IoaSA9IDA7IGkgPCBDVVJMX05URUxPUFRTOyBpKyspIHsKKyAgICBpZihpID09IENVUkxfVEVMT1BUX0VDSE8pCiAgICAgICBjb250aW51ZTsKIAogICAgIGlmKHRuLT51c19wcmVmZXJyZWRbaV0gPT0gQ1VSTF9ZRVMpCkBAIC03OTEsNyArNzkyLDcgQEAKICAgICAgIGNhc2UgQ1VSTF9URUxPUFRfTkVXX0VOVklST046CiAgICAgICAgIGlmKHBvaW50ZXJbMV0gPT0gQ1VSTF9URUxRVUFMX0lTKSB7CiAgICAgICAgICAgaW5mb2YoZGF0YSwgIiAiKTsKLSAgICAgICAgICBmb3IoaSA9IDM7aSA8IGxlbmd0aDtpKyspIHsKKyAgICAgICAgICBmb3IoaSA9IDM7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgc3dpdGNoKHBvaW50ZXJbaV0pIHsKICAgICAgICAgICAgIGNhc2UgQ1VSTF9ORVdfRU5WX1ZBUjoKICAgICAgICAgICAgICAgaW5mb2YoZGF0YSwgIiwgIik7CkBAIC04NDIsNyArODQzLDcgQEAKICAgICB0bi0+dXNfcHJlZmVycmVkW0NVUkxfVEVMT1BUX05FV19FTlZJUk9OXSA9IENVUkxfWUVTOwogICB9CiAKLSAgZm9yKGhlYWQgPSBkYXRhLT5zZXQudGVsbmV0X29wdGlvbnM7IGhlYWQ7IGhlYWQ9aGVhZC0+bmV4dCkgeworICBmb3IoaGVhZCA9IGRhdGEtPnNldC50ZWxuZXRfb3B0aW9uczsgaGVhZDsgaGVhZCA9IGhlYWQtPm5leHQpIHsKICAgICBpZihzc2NhbmYoaGVhZC0+ZGF0YSwgIiUxMjdbXj0gXSUqWyA9XSUyNTVzIiwKICAgICAgICAgICAgICAgb3B0aW9uX2tleXdvcmQsIG9wdGlvbl9hcmcpID09IDIpIHsKIApAQCAtODg5LDggKzg5MCw4IEBACiAKICAgICAgIC8qIFRvIHRha2UgY2FyZSBvciBub3Qgb2YgdGhlIDh0aCBiaXQgaW4gZGF0YSBleGNoYW5nZSAqLwogICAgICAgaWYoc3RyY2FzZWNvbXBhcmUob3B0aW9uX2tleXdvcmQsICJCSU5BUlkiKSkgewotICAgICAgICBiaW5hcnlfb3B0aW9uPWF0b2kob3B0aW9uX2FyZyk7Ci0gICAgICAgIGlmKGJpbmFyeV9vcHRpb24hPTEpIHsKKyAgICAgICAgYmluYXJ5X29wdGlvbiA9IGF0b2kob3B0aW9uX2FyZyk7CisgICAgICAgIGlmKGJpbmFyeV9vcHRpb24gIT0gMSkgewogICAgICAgICAgIHRuLT51c19wcmVmZXJyZWRbQ1VSTF9URUxPUFRfQklOQVJZXSA9IENVUkxfTk87CiAgICAgICAgICAgdG4tPmhpbV9wcmVmZXJyZWRbQ1VSTF9URUxPUFRfQklOQVJZXSA9IENVUkxfTk87CiAgICAgICAgIH0KQEAgLTg5OCw3ICs4OTksNyBAQAogICAgICAgfQogCiAgICAgICBmYWlsZihkYXRhLCAiVW5rbm93biB0ZWxuZXQgb3B0aW9uICVzIiwgaGVhZC0+ZGF0YSk7Ci0gICAgICByZXN1bHQgPSBDVVJMRV9VTktOT1dOX1RFTE5FVF9PUFRJT047CisgICAgICByZXN1bHQgPSBDVVJMRV9VTktOT1dOX09QVElPTjsKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBmYWlsZihkYXRhLCAiU3ludGF4IGVycm9yIGluIHRlbG5ldCBvcHRpb246ICVzIiwgaGVhZC0+ZGF0YSk7CkBAIC05MzQsNyArOTM1LDcgQEAKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIHN0cnVjdCBURUxORVQgKnRuID0gKHN0cnVjdCBURUxORVQgKilkYXRhLT5yZXEucHJvdG9wOwogCi0gIHByaW50c3ViKGRhdGEsICc8JywgKHVuc2lnbmVkIGNoYXIgKil0bi0+c3ViYnVmZmVyLCBDVVJMX1NCX0xFTih0bikrMik7CisgIHByaW50c3ViKGRhdGEsICc8JywgKHVuc2lnbmVkIGNoYXIgKil0bi0+c3ViYnVmZmVyLCBDVVJMX1NCX0xFTih0bikgKyAyKTsKICAgc3dpdGNoKENVUkxfU0JfR0VUKHRuKSkgewogICAgIGNhc2UgQ1VSTF9URUxPUFRfVFRZUEU6CiAgICAgICBsZW4gPSBzdHJsZW4odG4tPnN1Ym9wdF90dHlwZSkgKyA0ICsgMjsKQEAgLTk2Niw3ICs5NjcsNyBAQAogICAgICAgICAgICAgICAgQ1VSTF9URUxRVUFMX0lTKTsKICAgICAgIGxlbiA9IDQ7CiAKLSAgICAgIGZvcih2ID0gdG4tPnRlbG5ldF92YXJzO3Y7diA9IHYtPm5leHQpIHsKKyAgICAgIGZvcih2ID0gdG4tPnRlbG5ldF92YXJzOyB2OyB2ID0gdi0+bmV4dCkgewogICAgICAgICB0bXBsZW4gPSAoc3RybGVuKHYtPmRhdGEpICsgMSk7CiAgICAgICAgIC8qIEFkZCB0aGUgdmFyaWFibGUgb25seSBpZiBpdCBmaXRzICovCiAgICAgICAgIGlmKGxlbiArIHRtcGxlbiA8IChpbnQpc2l6ZW9mKHRlbXApLTYpIHsKQEAgLTEwMTgsOCArMTAxOSw4IEBACiAgICAgQ1VSTF9TQl9BQ0NVTSh0biwgQ1VSTF9URUxPUFRfTkFXUyk7CiAgICAgLyogV2UgbXVzdCBkZWFsIGVpdGhlciB3aXRoIGxpdHRlIG9yIGJpZyBlbmRpYW4gcHJvY2Vzc29ycyAqLwogICAgIC8qIFdpbmRvdyBzaXplIG11c3QgYmUgc2VudCBhY2NvcmRpbmcgdG8gdGhlICduZXR3b3JrIG9yZGVyJyAqLwotICAgIHg9aHRvbnModG4tPnN1Ym9wdF93c3gpOwotICAgIHk9aHRvbnModG4tPnN1Ym9wdF93c3kpOworICAgIHggPSBodG9ucyh0bi0+c3Vib3B0X3dzeCk7CisgICAgeSA9IGh0b25zKHRuLT5zdWJvcHRfd3N5KTsKICAgICB1YzEgPSAodW5zaWduZWQgY2hhciAqKSZ4OwogICAgIHVjMiA9ICh1bnNpZ25lZCBjaGFyICopJnk7CiAgICAgQ1VSTF9TQl9BQ0NVTSh0biwgdWMxWzBdKTsKQEAgLTEwMzIsNyArMTAzMyw3IEBACiAgICAgQ1VSTF9TQl9URVJNKHRuKTsKICAgICAvKiBkYXRhIHN1Ym9wdGlvbiBpcyBub3cgcmVhZHkgKi8KIAotICAgIHByaW50c3ViKGRhdGEsICc+JywgKHVuc2lnbmVkIGNoYXIgKil0bi0+c3ViYnVmZmVyKzIsCisgICAgcHJpbnRzdWIoZGF0YSwgJz4nLCAodW5zaWduZWQgY2hhciAqKXRuLT5zdWJidWZmZXIgKyAyLAogICAgICAgICAgICAgIENVUkxfU0JfTEVOKHRuKS0yKTsKIAogICAgIC8qIHdlIHNlbmQgdGhlIGhlYWRlciBvZiB0aGUgc3Vib3B0aW9uLi4uICovCkBAIC0xMDQzLDkgKzEwNDQsOSBAQAogICAgIH0KICAgICAvKiAuLi4gdGhlbiB0aGUgd2luZG93IHNpemUgd2l0aCB0aGUgc2VuZF90ZWxuZXRfZGF0YSgpIGZ1bmN0aW9uCiAgICAgICAgdG8gZGVhbCB3aXRoIDB4RkYgY2FzZXMgLi4uICovCi0gICAgc2VuZF90ZWxuZXRfZGF0YShjb25uLCAoY2hhciAqKXRuLT5zdWJidWZmZXIrMywgNCk7CisgICAgc2VuZF90ZWxuZXRfZGF0YShjb25uLCAoY2hhciAqKXRuLT5zdWJidWZmZXIgKyAzLCA0KTsKICAgICAvKiAuLi4gYW5kIHRoZSBmb290ZXIgKi8KLSAgICBieXRlc193cml0dGVuID0gc3dyaXRlKGNvbm4tPnNvY2tbRklSU1RTT0NLRVRdLCB0bi0+c3ViYnVmZmVyKzcsIDIpOworICAgIGJ5dGVzX3dyaXR0ZW4gPSBzd3JpdGUoY29ubi0+c29ja1tGSVJTVFNPQ0tFVF0sIHRuLT5zdWJidWZmZXIgKyA3LCAyKTsKICAgICBpZihieXRlc193cml0dGVuIDwgMCkgewogICAgICAgZXJyID0gU09DS0VSUk5POwogICAgICAgZmFpbGYoZGF0YSwgIlNlbmRpbmcgZGF0YSBmYWlsZWQgKCVkKSIsIGVycik7CkBAIC0xMDYzLDcgKzEwNjQsNyBAQAogICB1bnNpZ25lZCBjaGFyIGM7CiAgIENVUkxjb2RlIHJlc3VsdDsKICAgaW50IGluID0gMDsKLSAgaW50IHN0YXJ0d3JpdGU9LTE7CisgIGludCBzdGFydHdyaXRlID0gLTE7CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBzdHJ1Y3QgVEVMTkVUICp0biA9IChzdHJ1Y3QgVEVMTkVUICopZGF0YS0+cmVxLnByb3RvcDsKIApAQCAtMTMyNiw3ICsxMzI3LDcgQEAKICAgY3VybF9vZmZfdCB0b3RhbF91bCA9IDA7CiAjZW5kaWYKICAgc3NpemVfdCBucmVhZDsKLSAgc3RydWN0IHRpbWV2YWwgbm93OworICBzdHJ1Y3QgY3VybHRpbWUgbm93OwogICBib29sIGtlZXBvbiA9IFRSVUU7CiAgIGNoYXIgKmJ1ZiA9IGRhdGEtPnN0YXRlLmJ1ZmZlcjsKICAgc3RydWN0IFRFTE5FVCAqdG47CkBAIC0xMzU2LDE0ICsxMzU3LDE0IEBACiAgIC8qIGxvYWQgd3MyXzMyLmRsbCBhbmQgZ2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyB3ZSBuZWVkLiAqLwogICB3c29jazIgPSBDdXJsX2xvYWRfbGlicmFyeShURVhUKCJXUzJfMzIuRExMIikpOwogICBpZih3c29jazIgPT0gTlVMTCkgewotICAgIGZhaWxmKGRhdGEsICJmYWlsZWQgdG8gbG9hZCBXUzJfMzIuRExMICglZCkiLCBFUlJOTyk7CisgICAgZmFpbGYoZGF0YSwgImZhaWxlZCB0byBsb2FkIFdTMl8zMi5ETEwgKCV1KSIsIEdldExhc3RFcnJvcigpKTsKICAgICByZXR1cm4gQ1VSTEVfRkFJTEVEX0lOSVQ7CiAgIH0KIAogICAvKiBHcmFiIGEgcG9pbnRlciB0byBXU0FDcmVhdGVFdmVudCAqLwogICBjcmVhdGVfZXZlbnRfZnVuYyA9IEdldFByb2NBZGRyZXNzKHdzb2NrMiwgIldTQUNyZWF0ZUV2ZW50Iik7CiAgIGlmKGNyZWF0ZV9ldmVudF9mdW5jID09IE5VTEwpIHsKLSAgICBmYWlsZihkYXRhLCAiZmFpbGVkIHRvIGZpbmQgV1NBQ3JlYXRlRXZlbnQgZnVuY3Rpb24gKCVkKSIsIEVSUk5PKTsKKyAgICBmYWlsZihkYXRhLCAiZmFpbGVkIHRvIGZpbmQgV1NBQ3JlYXRlRXZlbnQgZnVuY3Rpb24gKCV1KSIsIEdldExhc3RFcnJvcigpKTsKICAgICBGcmVlTGlicmFyeSh3c29jazIpOwogICAgIHJldHVybiBDVVJMRV9GQUlMRURfSU5JVDsKICAgfQpAQCAtMTM3MSw3ICsxMzcyLDcgQEAKICAgLyogQW5kIFdTQUNsb3NlRXZlbnQgKi8KICAgY2xvc2VfZXZlbnRfZnVuYyA9IEdldFByb2NBZGRyZXNzKHdzb2NrMiwgIldTQUNsb3NlRXZlbnQiKTsKICAgaWYoY2xvc2VfZXZlbnRfZnVuYyA9PSBOVUxMKSB7Ci0gICAgZmFpbGYoZGF0YSwgImZhaWxlZCB0byBmaW5kIFdTQUNsb3NlRXZlbnQgZnVuY3Rpb24gKCVkKSIsIEVSUk5PKTsKKyAgICBmYWlsZihkYXRhLCAiZmFpbGVkIHRvIGZpbmQgV1NBQ2xvc2VFdmVudCBmdW5jdGlvbiAoJXUpIiwgR2V0TGFzdEVycm9yKCkpOwogICAgIEZyZWVMaWJyYXJ5KHdzb2NrMik7CiAgICAgcmV0dXJuIENVUkxFX0ZBSUxFRF9JTklUOwogICB9CkBAIC0xMzc5LDcgKzEzODAsNyBAQAogICAvKiBBbmQgV1NBRXZlbnRTZWxlY3QgKi8KICAgZXZlbnRfc2VsZWN0X2Z1bmMgPSBHZXRQcm9jQWRkcmVzcyh3c29jazIsICJXU0FFdmVudFNlbGVjdCIpOwogICBpZihldmVudF9zZWxlY3RfZnVuYyA9PSBOVUxMKSB7Ci0gICAgZmFpbGYoZGF0YSwgImZhaWxlZCB0byBmaW5kIFdTQUV2ZW50U2VsZWN0IGZ1bmN0aW9uICglZCkiLCBFUlJOTyk7CisgICAgZmFpbGYoZGF0YSwgImZhaWxlZCB0byBmaW5kIFdTQUV2ZW50U2VsZWN0IGZ1bmN0aW9uICgldSkiLCBHZXRMYXN0RXJyb3IoKSk7CiAgICAgRnJlZUxpYnJhcnkod3NvY2syKTsKICAgICByZXR1cm4gQ1VSTEVfRkFJTEVEX0lOSVQ7CiAgIH0KQEAgLTEzODcsNyArMTM4OCw4IEBACiAgIC8qIEFuZCBXU0FFbnVtTmV0d29ya0V2ZW50cyAqLwogICBlbnVtX25ldGV2ZW50c19mdW5jID0gR2V0UHJvY0FkZHJlc3Mod3NvY2syLCAiV1NBRW51bU5ldHdvcmtFdmVudHMiKTsKICAgaWYoZW51bV9uZXRldmVudHNfZnVuYyA9PSBOVUxMKSB7Ci0gICAgZmFpbGYoZGF0YSwgImZhaWxlZCB0byBmaW5kIFdTQUVudW1OZXR3b3JrRXZlbnRzIGZ1bmN0aW9uICglZCkiLCBFUlJOTyk7CisgICAgZmFpbGYoZGF0YSwgImZhaWxlZCB0byBmaW5kIFdTQUVudW1OZXR3b3JrRXZlbnRzIGZ1bmN0aW9uICgldSkiLAorICAgICAgICAgIEdldExhc3RFcnJvcigpKTsKICAgICBGcmVlTGlicmFyeSh3c29jazIpOwogICAgIHJldHVybiBDVVJMRV9GQUlMRURfSU5JVDsKICAgfQpAQCAtMTU4MCw3ICsxNTgyLDcgQEAKIAogICAvKiBXZSBjYWxsZWQgTG9hZExpYnJhcnksIHNvIGNhbGwgRnJlZUxpYnJhcnkgKi8KICAgaWYoIUZyZWVMaWJyYXJ5KHdzb2NrMikpCi0gICAgaW5mb2YoZGF0YSwgIkZyZWVMaWJyYXJ5KHdzb2NrMikgZmFpbGVkICglZCkiLCBFUlJOTyk7CisgICAgaW5mb2YoZGF0YSwgIkZyZWVMaWJyYXJ5KHdzb2NrMikgZmFpbGVkICgldSkiLCBHZXRMYXN0RXJyb3IoKSk7CiAjZWxzZQogICBwZmRbMF0uZmQgPSBzb2NrZmQ7CiAgIHBmZFswXS5ldmVudHMgPSBQT0xMSU47CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi90ZnRwLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi90ZnRwLmMKaW5kZXggYjJiM2VmZS4uNGU1OTlmZCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdGZ0cC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3RmdHAuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtNzYsMTIgKzc2LDEyIEBACiAjZGVmaW5lIFRGVFBfT1BUSU9OX0lOVEVSVkFMICJ0aW1lb3V0IgogCiB0eXBlZGVmIGVudW0gewotICBURlRQX01PREVfTkVUQVNDSUk9MCwKKyAgVEZUUF9NT0RFX05FVEFTQ0lJID0gMCwKICAgVEZUUF9NT0RFX09DVEVUCiB9IHRmdHBfbW9kZV90OwogCiB0eXBlZGVmIGVudW0gewotICBURlRQX1NUQVRFX1NUQVJUPTAsCisgIFRGVFBfU1RBVEVfU1RBUlQgPSAwLAogICBURlRQX1NUQVRFX1JYLAogICBURlRQX1NUQVRFX1RYLAogICBURlRQX1NUQVRFX0ZJTgpAQCAtMTAwLDcgKzEwMCw3IEBACiB9IHRmdHBfZXZlbnRfdDsKIAogdHlwZWRlZiBlbnVtIHsKLSAgVEZUUF9FUlJfVU5ERUY9MCwKKyAgVEZUUF9FUlJfVU5ERUYgPSAwLAogICBURlRQX0VSUl9OT1RGT1VORCwKICAgVEZUUF9FUlJfUEVSTSwKICAgVEZUUF9FUlJfRElTS0ZVTEwsCkBAIC0xODEsNiArMTgxLDcgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgdGZ0cF9kaXNjb25uZWN0LCAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICBQT1JUX1RGVFAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX1RGVFAsICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX05PTkUgfCBQUk9UT1BUX05PVVJMUVVFUlkgICAgIC8qIGZsYWdzICovCkBAIC0yMTYsNyArMjE3LDcgQEAKICAgaWYoc3RhcnQpIHsKIAogICAgIG1heHRpbWUgPSAodGltZV90KSh0aW1lb3V0X21zICsgNTAwKSAvIDEwMDA7Ci0gICAgc3RhdGUtPm1heF90aW1lID0gc3RhdGUtPnN0YXJ0X3RpbWUrbWF4dGltZTsKKyAgICBzdGF0ZS0+bWF4X3RpbWUgPSBzdGF0ZS0+c3RhcnRfdGltZSArIG1heHRpbWU7CiAKICAgICAvKiBTZXQgcGVyLWJsb2NrIHRpbWVvdXQgdG8gdG90YWwgKi8KICAgICB0aW1lb3V0ID0gbWF4dGltZTsKQEAgLTIzMSw3ICsyMzIsNyBAQAogICAgIC8qIENvbXB1dGUgdGhlIHJlLXN0YXJ0IGludGVydmFsIHRvIHN1aXQgdGhlIHRpbWVvdXQgKi8KICAgICBzdGF0ZS0+cmV0cnlfdGltZSA9IChpbnQpdGltZW91dC9zdGF0ZS0+cmV0cnlfbWF4OwogICAgIGlmKHN0YXRlLT5yZXRyeV90aW1lPDEpCi0gICAgICBzdGF0ZS0+cmV0cnlfdGltZT0xOworICAgICAgc3RhdGUtPnJldHJ5X3RpbWUgPSAxOwogCiAgIH0KICAgZWxzZSB7CkBAIC0yNDAsNyArMjQxLDcgQEAKICAgICBlbHNlCiAgICAgICBtYXh0aW1lID0gMzYwMDsKIAotICAgIHN0YXRlLT5tYXhfdGltZSA9IHN0YXRlLT5zdGFydF90aW1lK21heHRpbWU7CisgICAgc3RhdGUtPm1heF90aW1lID0gc3RhdGUtPnN0YXJ0X3RpbWUgKyBtYXh0aW1lOwogCiAgICAgLyogU2V0IHBlci1ibG9jayB0aW1lb3V0IHRvIHRvdGFsICovCiAgICAgdGltZW91dCA9IG1heHRpbWU7CkBAIC0yNTAsMTUgKzI1MSwxNSBAQAogICB9CiAgIC8qIEJ1dCBib3VuZCB0aGUgdG90YWwgbnVtYmVyICovCiAgIGlmKHN0YXRlLT5yZXRyeV9tYXg8MykKLSAgICBzdGF0ZS0+cmV0cnlfbWF4PTM7CisgICAgc3RhdGUtPnJldHJ5X21heCA9IDM7CiAKICAgaWYoc3RhdGUtPnJldHJ5X21heD41MCkKLSAgICBzdGF0ZS0+cmV0cnlfbWF4PTUwOworICAgIHN0YXRlLT5yZXRyeV9tYXggPSA1MDsKIAogICAvKiBDb21wdXRlIHRoZSByZS1BQ0sgaW50ZXJ2YWwgdG8gc3VpdCB0aGUgdGltZW91dCAqLwogICBzdGF0ZS0+cmV0cnlfdGltZSA9IChpbnQpKHRpbWVvdXQvc3RhdGUtPnJldHJ5X21heCk7CiAgIGlmKHN0YXRlLT5yZXRyeV90aW1lPDEpCi0gICAgc3RhdGUtPnJldHJ5X3RpbWU9MTsKKyAgICBzdGF0ZS0+cmV0cnlfdGltZSA9IDE7CiAKICAgaW5mb2Yoc3RhdGUtPmNvbm4tPmRhdGEsCiAgICAgICAgICJzZXQgdGltZW91dHMgZm9yIHN0YXRlICVkOyBUb3RhbCAlbGQsIHJldHJ5ICVkIG1heHRyeSAlZFxuIiwKQEAgLTMyMCw3ICszMjEsNyBAQAogICAgIHJldHVybiBOVUxMOwogICAqb3B0aW9uID0gYnVmOwogCi0gIGxvYyArPSBDdXJsX3N0cm5sZW4oYnVmK2xvYywgbGVuLWxvYyk7CisgIGxvYyArPSBDdXJsX3N0cm5sZW4oYnVmICsgbG9jLCBsZW4tbG9jKTsKICAgbG9jKys7IC8qIE5VTEwgdGVybSAqLwogCiAgIGlmKGxvYyA+IGxlbikKQEAgLTQ3NCw3ICs0NzUsNyBAQAogICAgICAgLyogSWYgd2UgYXJlIHVwbG9hZGluZywgc2VuZCBhbiBXUlEgKi8KICAgICAgIHNldHBhY2tldGV2ZW50KCZzdGF0ZS0+c3BhY2tldCwgVEZUUF9FVkVOVF9XUlEpOwogICAgICAgc3RhdGUtPmNvbm4tPmRhdGEtPnJlcS51cGxvYWRfZnJvbWhlcmUgPQotICAgICAgICAoY2hhciAqKXN0YXRlLT5zcGFja2V0LmRhdGErNDsKKyAgICAgICAgKGNoYXIgKilzdGF0ZS0+c3BhY2tldC5kYXRhICsgNDsKICAgICAgIGlmKGRhdGEtPnN0YXRlLmluZmlsZXNpemUgIT0gLTEpCiAgICAgICAgIEN1cmxfcGdyc1NldFVwbG9hZFNpemUoZGF0YSwgZGF0YS0+c3RhdGUuaW5maWxlc2l6ZSk7CiAgICAgfQpAQCAtNDkwLDcgKzQ5MSwxMyBAQAogICAgIGlmKHJlc3VsdCkKICAgICAgIHJldHVybiByZXN1bHQ7CiAKLSAgICBzbnByaW50ZigoY2hhciAqKXN0YXRlLT5zcGFja2V0LmRhdGErMiwKKyAgICBpZihzdHJsZW4oZmlsZW5hbWUpID4gKHN0YXRlLT5ibGtzaXplIC0gc3RybGVuKG1vZGUpIC0gNCkpIHsKKyAgICAgIGZhaWxmKGRhdGEsICJURlRQIGZpbGUgbmFtZSB0b28gbG9uZ1xuIik7CisgICAgICBmcmVlKGZpbGVuYW1lKTsKKyAgICAgIHJldHVybiBDVVJMRV9URlRQX0lMTEVHQUw7IC8qIHRvbyBsb25nIGZpbGUgbmFtZSBmaWVsZCAqLworICAgIH0KKworICAgIHNucHJpbnRmKChjaGFyICopc3RhdGUtPnNwYWNrZXQuZGF0YSArIDIsCiAgICAgICAgICAgICAgc3RhdGUtPmJsa3NpemUsCiAgICAgICAgICAgICAgIiVzJWMlcyVjIiwgZmlsZW5hbWUsICdcMCcsICBtb2RlLCAnXDAnKTsKICAgICBzYnl0ZXMgPSA0ICsgc3RybGVuKGZpbGVuYW1lKSArIHN0cmxlbihtb2RlKTsKQEAgLTUwNSwyNSArNTEyLDI1IEBACiAgICAgICAgIHN0cmNweShidWYsICIwIik7IC8qIHRoZSBkZXN0aW5hdGlvbiBpcyBsYXJnZSBlbm91Z2ggKi8KIAogICAgICAgc2J5dGVzICs9IHRmdHBfb3B0aW9uX2FkZChzdGF0ZSwgc2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXN0YXRlLT5zcGFja2V0LmRhdGErc2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXN0YXRlLT5zcGFja2V0LmRhdGEgKyBzYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRGVFBfT1BUSU9OX1RTSVpFKTsKICAgICAgIHNieXRlcyArPSB0ZnRwX29wdGlvbl9hZGQoc3RhdGUsIHNieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilzdGF0ZS0+c3BhY2tldC5kYXRhK3NieXRlcywgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilzdGF0ZS0+c3BhY2tldC5kYXRhICsgc2J5dGVzLCBidWYpOwogICAgICAgLyogYWRkIGJsa3NpemUgb3B0aW9uICovCiAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQiLCBzdGF0ZS0+cmVxdWVzdGVkX2Jsa3NpemUpOwogICAgICAgc2J5dGVzICs9IHRmdHBfb3B0aW9uX2FkZChzdGF0ZSwgc2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXN0YXRlLT5zcGFja2V0LmRhdGErc2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXN0YXRlLT5zcGFja2V0LmRhdGEgKyBzYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRGVFBfT1BUSU9OX0JMS1NJWkUpOwogICAgICAgc2J5dGVzICs9IHRmdHBfb3B0aW9uX2FkZChzdGF0ZSwgc2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXN0YXRlLT5zcGFja2V0LmRhdGErc2J5dGVzLCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXN0YXRlLT5zcGFja2V0LmRhdGEgKyBzYnl0ZXMsIGJ1Zik7CiAKICAgICAgIC8qIGFkZCB0aW1lb3V0IG9wdGlvbiAqLwogICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkIiwgc3RhdGUtPnJldHJ5X3RpbWUpOwogICAgICAgc2J5dGVzICs9IHRmdHBfb3B0aW9uX2FkZChzdGF0ZSwgc2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXN0YXRlLT5zcGFja2V0LmRhdGErc2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXN0YXRlLT5zcGFja2V0LmRhdGEgKyBzYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRGVFBfT1BUSU9OX0lOVEVSVkFMKTsKICAgICAgIHNieXRlcyArPSB0ZnRwX29wdGlvbl9hZGQoc3RhdGUsIHNieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilzdGF0ZS0+c3BhY2tldC5kYXRhK3NieXRlcywgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilzdGF0ZS0+c3BhY2tldC5kYXRhICsgc2J5dGVzLCBidWYpOwogICAgIH0KIAogICAgIC8qIHRoZSB0eXBlY2FzZSBmb3IgdGhlIDNyZCBhcmd1bWVudCBpcyBtb3N0bHkgZm9yIHN5c3RlbXMgdGhhdCBkbwpAQCAtNTY5LDcgKzU3Niw3IEBACiAKIC8qIHRoZSBuZXh0IGJsb2NrbnVtIGlzIHggKyAxIGJ1dCBpdCBuZWVkcyB0byB3cmFwIGF0IGFuIHVuc2lnbmVkIDE2Yml0CiAgICBib3VuZGFyeSAqLwotI2RlZmluZSBORVhUX0JMT0NLTlVNKHgpICgoKHgpKzEpJjB4ZmZmZikKKyNkZWZpbmUgTkVYVF9CTE9DS05VTSh4KSAoKCh4KSArIDEpJjB4ZmZmZikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02MjAsNyArNjI3LDcgQEAKICAgICB9CiAKICAgICAvKiBDaGVjayBpZiBjb21wbGV0ZWQgKFRoYXQgaXMsIGEgbGVzcyB0aGFuIGZ1bGwgcGFja2V0IGlzIHJlY2VpdmVkKSAqLwotICAgIGlmKHN0YXRlLT5yYnl0ZXMgPCAoc3NpemVfdClzdGF0ZS0+Ymxrc2l6ZSs0KSB7CisgICAgaWYoc3RhdGUtPnJieXRlcyA8IChzc2l6ZV90KXN0YXRlLT5ibGtzaXplICsgNCkgewogICAgICAgc3RhdGUtPnN0YXRlID0gVEZUUF9TVEFURV9GSU47CiAgICAgfQogICAgIGVsc2UgewpAQCAtNzM2LDcgKzc0Myw3IEBACiAgICAgICAgIGVsc2UgewogICAgICAgICAgIC8qIFJlLXNlbmQgdGhlIGRhdGEgcGFja2V0ICovCiAgICAgICAgICAgc2J5dGVzID0gc2VuZHRvKHN0YXRlLT5zb2NrZmQsICh2b2lkICopc3RhdGUtPnNwYWNrZXQuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgNCtzdGF0ZS0+c2J5dGVzLCBTRU5EXzRUSF9BUkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKyBzdGF0ZS0+c2J5dGVzLCBTRU5EXzRUSF9BUkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3RhdGUtPnJlbW90ZV9hZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+cmVtb3RlX2FkZHJsZW4pOwogICAgICAgICAgIC8qIENoZWNrIGFsbCBzYnl0ZXMgd2VyZSBzZW50ICovCkBAIC03NjksNyArNzc2LDcgQEAKICAgICAgKiBkYXRhIGJsb2NrLgogICAgICAqICovCiAgICAgc3RhdGUtPnNieXRlcyA9IDA7Ci0gICAgc3RhdGUtPmNvbm4tPmRhdGEtPnJlcS51cGxvYWRfZnJvbWhlcmUgPSAoY2hhciAqKXN0YXRlLT5zcGFja2V0LmRhdGErNDsKKyAgICBzdGF0ZS0+Y29ubi0+ZGF0YS0+cmVxLnVwbG9hZF9mcm9taGVyZSA9IChjaGFyICopc3RhdGUtPnNwYWNrZXQuZGF0YSArIDQ7CiAgICAgZG8gewogICAgICAgcmVzdWx0ID0gQ3VybF9maWxscmVhZGJ1ZmZlcihzdGF0ZS0+Y29ubiwgc3RhdGUtPmJsa3NpemUgLSBzdGF0ZS0+c2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2IpOwpAQCAtODA2LDcgKzgxMyw3IEBACiAgICAgZWxzZSB7CiAgICAgICAvKiBSZS1zZW5kIHRoZSBkYXRhIHBhY2tldCAqLwogICAgICAgc2J5dGVzID0gc2VuZHRvKHN0YXRlLT5zb2NrZmQsICh2b2lkICopc3RhdGUtPnNwYWNrZXQuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICA0K3N0YXRlLT5zYnl0ZXMsIFNFTkRfNFRIX0FSRywKKyAgICAgICAgICAgICAgICAgICAgICA0ICsgc3RhdGUtPnNieXRlcywgU0VORF80VEhfQVJHLAogICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3RhdGUtPnJlbW90ZV9hZGRyLAogICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5yZW1vdGVfYWRkcmxlbik7CiAgICAgICAvKiBDaGVjayBhbGwgc2J5dGVzIHdlcmUgc2VudCAqLwpAQCAtMTEwMiwxMSArMTEwOSwxMSBAQAogICBmcm9tbGVuID0gc2l6ZW9mKGZyb21hZGRyKTsKICAgc3RhdGUtPnJieXRlcyA9IChpbnQpcmVjdmZyb20oc3RhdGUtPnNvY2tmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdGF0ZS0+cnBhY2tldC5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+Ymxrc2l6ZSs0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+Ymxrc2l6ZSArIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmZnJvbWFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcm9tbGVuKTsKLSAgaWYoc3RhdGUtPnJlbW90ZV9hZGRybGVuPT0wKSB7CisgIGlmKHN0YXRlLT5yZW1vdGVfYWRkcmxlbiA9PSAwKSB7CiAgICAgbWVtY3B5KCZzdGF0ZS0+cmVtb3RlX2FkZHIsICZmcm9tYWRkciwgZnJvbWxlbik7CiAgICAgc3RhdGUtPnJlbW90ZV9hZGRybGVuID0gZnJvbWxlbjsKICAgfQpAQCAtMTEyOCw3ICsxMTM1LDcgQEAKICAgICAgIGlmKHN0YXRlLT5yYnl0ZXMgPiA0ICYmCiAgICAgICAgICAoTkVYVF9CTE9DS05VTShzdGF0ZS0+YmxvY2spID09IGdldHJwYWNrZXRibG9jaygmc3RhdGUtPnJwYWNrZXQpKSkgewogICAgICAgICByZXN1bHQgPSBDdXJsX2NsaWVudF93cml0ZShjb25uLCBDTElFTlRXUklURV9CT0RZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXN0YXRlLT5ycGFja2V0LmRhdGErNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilzdGF0ZS0+cnBhY2tldC5kYXRhICsgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPnJieXRlcy00KTsKICAgICAgICAgaWYocmVzdWx0KSB7CiAgICAgICAgICAgdGZ0cF9zdGF0ZV9tYWNoaW5lKHN0YXRlLCBURlRQX0VWRU5UX0VSUk9SKTsKQEAgLTExNDIsMTQgKzExNDksMTQgQEAKICAgICB7CiAgICAgICB1bnNpZ25lZCBzaG9ydCBlcnJvciA9IGdldHJwYWNrZXRibG9jaygmc3RhdGUtPnJwYWNrZXQpOwogICAgICAgc3RhdGUtPmVycm9yID0gKHRmdHBfZXJyb3JfdCllcnJvcjsKLSAgICAgIGluZm9mKGRhdGEsICIlc1xuIiwgKGNvbnN0IGNoYXIgKilzdGF0ZS0+cnBhY2tldC5kYXRhKzQpOworICAgICAgaW5mb2YoZGF0YSwgIiVzXG4iLCAoY29uc3QgY2hhciAqKXN0YXRlLT5ycGFja2V0LmRhdGEgKyA0KTsKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIFRGVFBfRVZFTlRfQUNLOgogICAgICAgYnJlYWs7CiAgICAgY2FzZSBURlRQX0VWRU5UX09BQ0s6CiAgICAgICByZXN1bHQgPSB0ZnRwX3BhcnNlX29wdGlvbl9hY2soc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilzdGF0ZS0+cnBhY2tldC5kYXRhKzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilzdGF0ZS0+cnBhY2tldC5kYXRhICsgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+cmJ5dGVzLTIpOwogICAgICAgaWYocmVzdWx0KQogICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTE5Myw3ICsxMjAwLDcgQEAKICAgICBzdGF0ZS0+c3RhdGUgPSBURlRQX1NUQVRFX0ZJTjsKICAgICByZXR1cm4gMDsKICAgfQotICBpZihjdXJyZW50ID4gc3RhdGUtPnJ4X3RpbWUrc3RhdGUtPnJldHJ5X3RpbWUpIHsKKyAgaWYoY3VycmVudCA+IHN0YXRlLT5yeF90aW1lICsgc3RhdGUtPnJldHJ5X3RpbWUpIHsKICAgICBpZihldmVudCkKICAgICAgICpldmVudCA9IFRGVFBfRVZFTlRfVElNRU9VVDsKICAgICB0aW1lKCZzdGF0ZS0+cnhfdGltZSk7IC8qIHVwZGF0ZSBldmVuIHRob3VnaCB3ZSByZWNlaXZlZCBub3RoaW5nICovCkBAIC0xMzQ0LDcgKzEzNTEsNyBAQAogCiAgIHN0YXRlID0gKHRmdHBfc3RhdGVfZGF0YV90ICopY29ubi0+cHJvdG8udGZ0cGM7CiAgIGlmKCFzdGF0ZSkKLSAgICByZXR1cm4gQ1VSTEVfQkFEX0NBTExJTkdfT1JERVI7CisgICAgcmV0dXJuIENVUkxFX1RGVFBfSUxMRUdBTDsKIAogICByZXN1bHQgPSB0ZnRwX3BlcmZvcm0oY29ubiwgZG9uZSk7CiAKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3RpbWV2YWwuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3RpbWV2YWwuYwppbmRleCBiZWQ0NGM1Li5kNzIwN2IzIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi90aW1ldmFsLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdGltZXZhbC5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC0yNCwxNCArMjQsMTQgQEAKIAogI2lmIGRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKE1TRE9TKQogCi1zdHJ1Y3QgdGltZXZhbCBjdXJseF90dm5vdyh2b2lkKQorc3RydWN0IGN1cmx0aW1lIGN1cmx4X3R2bm93KHZvaWQpCiB7CiAgIC8qCiAgICoqIEdldFRpY2tDb3VudCgpIGlzIGF2YWlsYWJsZSBvbiBfYWxsXyBXaW5kb3dzIHZlcnNpb25zIGZyb20gVzk1IHVwCiAgICoqIHRvIG5vd2FkYXlzLiBSZXR1cm5zIG1pbGxpc2Vjb25kcyBlbGFwc2VkIHNpbmNlIGxhc3Qgc3lzdGVtIGJvb3QsCiAgICoqIGluY3JlYXNlcyBtb25vdG9uaWNhbGx5IGFuZCB3cmFwcyBvbmNlIDQ5LjcgZGF5cyBoYXZlIGVsYXBzZWQuCiAgICovCi0gIHN0cnVjdCB0aW1ldmFsIG5vdzsKKyAgc3RydWN0IGN1cmx0aW1lIG5vdzsKICNpZiAhZGVmaW5lZChfV0lOMzJfV0lOTlQpIHx8ICFkZWZpbmVkKF9XSU4zMl9XSU5OVF9WSVNUQSkgfHwgXAogICAgIChfV0lOMzJfV0lOTlQgPCBfV0lOMzJfV0lOTlRfVklTVEEpCiAgIERXT1JEIG1pbGxpc2Vjb25kcyA9IEdldFRpY2tDb3VudCgpOwpAQCAtMzksOCArMzksOCBAQAogICBub3cudHZfdXNlYyA9IChtaWxsaXNlY29uZHMgJSAxMDAwKSAqIDEwMDA7CiAjZWxzZQogICBVTE9OR0xPTkcgbWlsbGlzZWNvbmRzID0gR2V0VGlja0NvdW50NjQoKTsKLSAgbm93LnR2X3NlYyA9IChsb25nKSAobWlsbGlzZWNvbmRzIC8gMTAwMCk7Ci0gIG5vdy50dl91c2VjID0gKGxvbmcpIChtaWxsaXNlY29uZHMgJSAxMDAwKSAqIDEwMDA7CisgIG5vdy50dl9zZWMgPSAodGltZV90KSAobWlsbGlzZWNvbmRzIC8gMTAwMCk7CisgIG5vdy50dl91c2VjID0gKHVuc2lnbmVkIGludCkgKG1pbGxpc2Vjb25kcyAlIDEwMDApICogMTAwMDsKICNlbmRpZgogCiAgIHJldHVybiBub3c7CkBAIC00OCw3ICs0OCw3IEBACiAKICNlbGlmIGRlZmluZWQoSEFWRV9DTE9DS19HRVRUSU1FX01PTk9UT05JQykKIAotc3RydWN0IHRpbWV2YWwgY3VybHhfdHZub3codm9pZCkKK3N0cnVjdCBjdXJsdGltZSBjdXJseF90dm5vdyh2b2lkKQogewogICAvKgogICAqKiBjbG9ja19nZXR0aW1lKCkgaXMgZ3JhbnRlZCB0byBiZSBpbmNyZWFzZWQgbW9ub3RvbmljYWxseSB3aGVuIHRoZQpAQCAtNTgsMTAgKzU4LDExIEBACiAgICoqIHN5c3RlbSBoYXMgc3RhcnRlZCB1cC4KICAgKi8KICAgc3RydWN0IHRpbWV2YWwgbm93OworICBzdHJ1Y3QgY3VybHRpbWUgY25vdzsKICAgc3RydWN0IHRpbWVzcGVjIHRzbm93OwogICBpZigwID09IGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHNub3cpKSB7Ci0gICAgbm93LnR2X3NlYyA9IHRzbm93LnR2X3NlYzsKLSAgICBub3cudHZfdXNlYyA9IHRzbm93LnR2X25zZWMgLyAxMDAwOworICAgIGNub3cudHZfc2VjID0gdHNub3cudHZfc2VjOworICAgIGNub3cudHZfdXNlYyA9ICh1bnNpZ25lZCBpbnQpKHRzbm93LnR2X25zZWMgLyAxMDAwKTsKICAgfQogICAvKgogICAqKiBFdmVuIHdoZW4gdGhlIGNvbmZpZ3VyZSBwcm9jZXNzIGhhcyB0cnVseSBkZXRlY3RlZCBtb25vdG9uaWMgY2xvY2sKQEAgLTY5LDIwICs3MCwyMyBAQAogICAqKiBydW4tdGltZS4gV2hlbiB0aGlzIG9jY3VycyBzaW1wbHkgZmFsbGJhY2sgdG8gb3RoZXIgdGltZSBzb3VyY2UuCiAgICovCiAjaWZkZWYgSEFWRV9HRVRUSU1FT0ZEQVkKLSAgZWxzZQorICBlbHNlIHsKICAgICAodm9pZClnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7CisgICAgY25vdy50dl9zZWMgPSBub3cudHZfc2VjOworICAgIGNub3cudHZfdXNlYyA9ICh1bnNpZ25lZCBpbnQpbm93LnR2X3VzZWM7CisgIH0KICNlbHNlCiAgIGVsc2UgewotICAgIG5vdy50dl9zZWMgPSAobG9uZyl0aW1lKE5VTEwpOwotICAgIG5vdy50dl91c2VjID0gMDsKKyAgICBjbm93LnR2X3NlYyA9IHRpbWUoTlVMTCk7CisgICAgY25vdy50dl91c2VjID0gMDsKICAgfQogI2VuZGlmCi0gIHJldHVybiBub3c7CisgIHJldHVybiBjbm93OwogfQogCiAjZWxpZiBkZWZpbmVkKEhBVkVfR0VUVElNRU9GREFZKQogCi1zdHJ1Y3QgdGltZXZhbCBjdXJseF90dm5vdyh2b2lkKQorc3RydWN0IGN1cmx0aW1lIGN1cmx4X3R2bm93KHZvaWQpCiB7CiAgIC8qCiAgICoqIGdldHRpbWVvZmRheSgpIGlzIG5vdCBncmFudGVkIHRvIGJlIGluY3JlYXNlZCBtb25vdG9uaWNhbGx5LCBkdWUgdG8KQEAgLTkwLDE5ICs5NCwyMiBAQAogICAqKiBmb3J3YXJkIG9yIGJhY2t3YXJkIGluIHRpbWUuCiAgICovCiAgIHN0cnVjdCB0aW1ldmFsIG5vdzsKKyAgc3RydWN0IGN1cmx0aW1lIHJldDsKICAgKHZvaWQpZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOwotICByZXR1cm4gbm93OworICByZXQudHZfc2VjID0gbm93LnR2X3NlYzsKKyAgcmV0LnR2X3VzZWMgPSBub3cudHZfdXNlYzsKKyAgcmV0dXJuIHJldDsKIH0KIAogI2Vsc2UKIAotc3RydWN0IHRpbWV2YWwgY3VybHhfdHZub3codm9pZCkKK3N0cnVjdCBjdXJsdGltZSBjdXJseF90dm5vdyh2b2lkKQogewogICAvKgogICAqKiB0aW1lKCkgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGltZSBpbiBzZWNvbmRzIHNpbmNlIHRoZSBFcG9jaC4KICAgKi8KLSAgc3RydWN0IHRpbWV2YWwgbm93OwotICBub3cudHZfc2VjID0gKGxvbmcpdGltZShOVUxMKTsKKyAgc3RydWN0IGN1cmx0aW1lIG5vdzsKKyAgbm93LnR2X3NlYyA9IHRpbWUoTlVMTCk7CiAgIG5vdy50dl91c2VjID0gMDsKICAgcmV0dXJuIG5vdzsKIH0KQEAgLTExNSw4ICsxMjIsMTAgQEAKICAqCiAgKiBSZXR1cm5zOiB0aGUgdGltZSBkaWZmZXJlbmNlIGluIG51bWJlciBvZiBtaWxsaXNlY29uZHMuIEZvciBsYXJnZSBkaWZmcyBpdAogICogcmV0dXJucyAweDdmZmZmZmZmIG9uIDMyYml0IHRpbWVfdCBzeXN0ZW1zLgorICoKKyAqIEB1bml0dGVzdDogMTMyMwogICovCi10aW1lX3QgY3VybHhfdHZkaWZmKHN0cnVjdCB0aW1ldmFsIG5ld2VyLCBzdHJ1Y3QgdGltZXZhbCBvbGRlcikKK3RpbWVfdCBjdXJseF90dmRpZmYoc3RydWN0IGN1cmx0aW1lIG5ld2VyLCBzdHJ1Y3QgY3VybHRpbWUgb2xkZXIpCiB7CiAjaWYgU0laRU9GX1RJTUVfVCA8IDgKICAgLyogZm9yIDMyYml0IHRpbWVfdCBzeXN0ZW1zLCBhZGQgYSBwcmVjYXV0aW9uIHRvIGF2b2lkIG92ZXJmbG93IGZvciByZWFsbHkKQEAgLTEyNiwxOCArMTM1LDI4IEBACiAgICAgcmV0dXJuIDB4N2ZmZmZmZmY7CiAjZW5kaWYKICAgcmV0dXJuIChuZXdlci50dl9zZWMtb2xkZXIudHZfc2VjKSoxMDAwKwotICAgICh0aW1lX3QpKG5ld2VyLnR2X3VzZWMtb2xkZXIudHZfdXNlYykvMTAwMDsKKyAgICAoaW50KShuZXdlci50dl91c2VjLW9sZGVyLnR2X3VzZWMpLzEwMDA7CiB9CiAKIC8qCi0gKiBTYW1lIGFzIGN1cmx4X3R2ZGlmZiBidXQgd2l0aCBmdWxsIHVzZWMgcmVzb2x1dGlvbi4KKyAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgbW9yZSByZWNlbnQgdGltZSwgYXMgb3RoZXJ3aXNlCisgKiB3ZSdsbCBnZXQgYSB3ZWlyZCBuZWdhdGl2ZSB0aW1lLWRpZmYgYmFjay4uLgogICoKLSAqIFJldHVybnM6IHRoZSB0aW1lIGRpZmZlcmVuY2UgaW4gc2Vjb25kcyB3aXRoIHN1YnNlY29uZCByZXNvbHV0aW9uLgorICogUmV0dXJuczogdGhlIHRpbWUgZGlmZmVyZW5jZSBpbiBudW1iZXIgb2YgbWljcm9zZWNvbmRzLiBGb3IgdG9vIGxhcmdlIGRpZmZzCisgKiBpdCByZXR1cm5zIG1heCB2YWx1ZS4KICAqLwotZG91YmxlIGN1cmx4X3R2ZGlmZl9zZWNzKHN0cnVjdCB0aW1ldmFsIG5ld2VyLCBzdHJ1Y3QgdGltZXZhbCBvbGRlcikKK3RpbWVfdCBDdXJsX3R2ZGlmZl91cyhzdHJ1Y3QgY3VybHRpbWUgbmV3ZXIsIHN0cnVjdCBjdXJsdGltZSBvbGRlcikKIHsKLSAgaWYobmV3ZXIudHZfc2VjICE9IG9sZGVyLnR2X3NlYykKLSAgICByZXR1cm4gKGRvdWJsZSkobmV3ZXIudHZfc2VjLW9sZGVyLnR2X3NlYykrCi0gICAgICAoZG91YmxlKShuZXdlci50dl91c2VjLW9sZGVyLnR2X3VzZWMpLzEwMDAwMDAuMDsKLSAgcmV0dXJuIChkb3VibGUpKG5ld2VyLnR2X3VzZWMtb2xkZXIudHZfdXNlYykvMTAwMDAwMC4wOworICB0aW1lX3QgZGlmZiA9IG5ld2VyLnR2X3NlYy1vbGRlci50dl9zZWM7CisjaWYgU0laRU9GX1RJTUVfVCA8IDgKKyAgLyogZm9yIDMyYml0IHRpbWVfdCBzeXN0ZW1zICovCisgIGlmKGRpZmYgPj0gKDB4N2ZmZmZmZmYvMTAwMDAwMCkpCisgICAgcmV0dXJuIDB4N2ZmZmZmZmY7CisjZWxzZQorICAvKiBmb3IgNjRiaXQgdGltZV90IHN5c3RlbXMgKi8KKyAgaWYoZGlmZiA+PSAoMHg3ZmZmZmZmZmZmZmZmZmZmTEwvMTAwMDAwMCkpCisgICAgcmV0dXJuIDB4N2ZmZmZmZmZmZmZmZmZmZkxMOworI2VuZGlmCisgIHJldHVybiAobmV3ZXIudHZfc2VjLW9sZGVyLnR2X3NlYykqMTAwMDAwMCsKKyAgICAoaW50KShuZXdlci50dl91c2VjLW9sZGVyLnR2X3VzZWMpOwogfQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdGltZXZhbC5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdGltZXZhbC5oCmluZGV4IDMzOTY5MzUuLjFlZTRiMzAgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3RpbWV2YWwuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi90aW1ldmFsLmgKQEAgLTcsNyArNyw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTI5LDcgKzI5LDEyIEBACiAKICNpbmNsdWRlICJjdXJsX3NldHVwLmgiCiAKLXN0cnVjdCB0aW1ldmFsIGN1cmx4X3R2bm93KHZvaWQpOworc3RydWN0IGN1cmx0aW1lIHsKKyAgdGltZV90ICAgICAgIHR2X3NlYzsgICAgIC8qIHNlY29uZHMgKi8KKyAgdW5zaWduZWQgaW50IHR2X3VzZWM7ICAgIC8qIG1pY3Jvc2Vjb25kcyAqLworfTsKKworc3RydWN0IGN1cmx0aW1lIGN1cmx4X3R2bm93KHZvaWQpOwogCiAvKgogICogTWFrZSBzdXJlIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50ICh0MSkgaXMgdGhlIG1vcmUgcmVjZW50IHRpbWUgYW5kIHQyIGlzCkBAIC0zNywyMCArNDIsMjAgQEAKICAqCiAgKiBSZXR1cm5zOiB0aGUgdGltZSBkaWZmZXJlbmNlIGluIG51bWJlciBvZiBtaWxsaXNlY29uZHMuCiAgKi8KLXRpbWVfdCBjdXJseF90dmRpZmYoc3RydWN0IHRpbWV2YWwgdDEsIHN0cnVjdCB0aW1ldmFsIHQyKTsKK3RpbWVfdCBjdXJseF90dmRpZmYoc3RydWN0IGN1cmx0aW1lIHQxLCBzdHJ1Y3QgY3VybHRpbWUgdDIpOwogCiAvKgotICogU2FtZSBhcyBjdXJseF90dmRpZmYgYnV0IHdpdGggZnVsbCB1c2VjIHJlc29sdXRpb24uCisgKiBNYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQgKHQxKSBpcyB0aGUgbW9yZSByZWNlbnQgdGltZSBhbmQgdDIgaXMKKyAqIHRoZSBvbGRlciB0aW1lLCBhcyBvdGhlcndpc2UgeW91IGdldCBhIHdlaXJkIG5lZ2F0aXZlIHRpbWUtZGlmZiBiYWNrLi4uCiAgKgotICogUmV0dXJuczogdGhlIHRpbWUgZGlmZmVyZW5jZSBpbiBzZWNvbmRzIHdpdGggc3Vic2Vjb25kIHJlc29sdXRpb24uCisgKiBSZXR1cm5zOiB0aGUgdGltZSBkaWZmZXJlbmNlIGluIG51bWJlciBvZiBtaWNyb3NlY29uZHMuCiAgKi8KLWRvdWJsZSBjdXJseF90dmRpZmZfc2VjcyhzdHJ1Y3QgdGltZXZhbCB0MSwgc3RydWN0IHRpbWV2YWwgdDIpOwordGltZV90IEN1cmxfdHZkaWZmX3VzKHN0cnVjdCBjdXJsdGltZSBuZXdlciwgc3RydWN0IGN1cmx0aW1lIG9sZGVyKTsKIAogLyogVGhlc2UgdHdvIGRlZmluZXMgYmVsb3cgZXhpc3QgdG8gcHJvdmlkZSB0aGUgb2xkZXIgQVBJIGZvciBsaWJyYXJ5CiAgICBpbnRlcm5hbHMgb25seS4gKi8KICNkZWZpbmUgQ3VybF90dm5vdygpIGN1cmx4X3R2bm93KCkKICNkZWZpbmUgQ3VybF90dmRpZmYoeCx5KSBjdXJseF90dmRpZmYoeCx5KQotI2RlZmluZSBDdXJsX3R2ZGlmZl9zZWNzKHgseSkgY3VybHhfdHZkaWZmX3NlY3MoeCx5KQogCiAjZW5kaWYgLyogSEVBREVSX0NVUkxfVElNRVZBTF9IICovCiAKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3RyYW5zZmVyLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi90cmFuc2Zlci5jCmluZGV4IDQzZThmNjQuLjhlNjZkMGQgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3RyYW5zZmVyLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdHJhbnNmZXIuYwpAQCAtNzMsMTIgKzczLDM4IEBACiAjaW5jbHVkZSAiY29ubmVjdC5oIgogI2luY2x1ZGUgIm5vbi1hc2NpaS5oIgogI2luY2x1ZGUgImh0dHAyLmgiCisjaW5jbHVkZSAibWltZS5oIgorI2luY2x1ZGUgInN0cmNhc2UuaCIKIAogLyogVGhlIGxhc3QgMyAjaW5jbHVkZSBmaWxlcyBzaG91bGQgYmUgaW4gdGhpcyBvcmRlciAqLwogI2luY2x1ZGUgImN1cmxfcHJpbnRmLmgiCiAjaW5jbHVkZSAiY3VybF9tZW1vcnkuaCIKICNpbmNsdWRlICJtZW1kZWJ1Zy5oIgogCisjaWYgIWRlZmluZWQoQ1VSTF9ESVNBQkxFX0hUVFApIHx8ICFkZWZpbmVkKENVUkxfRElTQUJMRV9TTVRQKSB8fCBcCisgICAgIWRlZmluZWQoQ1VSTF9ESVNBQkxFX0lNQVApCisvKgorICogY2hlY2toZWFkZXJzKCkgY2hlY2tzIHRoZSBsaW5rZWQgbGlzdCBvZiBjdXN0b20gaGVhZGVycyBmb3IgYQorICogcGFydGljdWxhciBoZWFkZXIgKHByZWZpeCkuCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG1hdGNoaW5nIGhlYWRlciBvciBOVUxMIGlmIG5vbmUgbWF0Y2hlZC4KKyAqLworY2hhciAqQ3VybF9jaGVja2hlYWRlcnMoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGhpc2hlYWRlcikKK3sKKyAgc3RydWN0IGN1cmxfc2xpc3QgKmhlYWQ7CisgIHNpemVfdCB0aGlzbGVuID0gc3RybGVuKHRoaXNoZWFkZXIpOworICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKKworICBmb3IoaGVhZCA9IGRhdGEtPnNldC5oZWFkZXJzOyBoZWFkOyBoZWFkID0gaGVhZC0+bmV4dCkgeworICAgIGlmKHN0cm5jYXNlY29tcGFyZShoZWFkLT5kYXRhLCB0aGlzaGVhZGVyLCB0aGlzbGVuKSkKKyAgICAgIHJldHVybiBoZWFkLT5kYXRhOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKwogLyoKICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxsIHRoZSByZWFkIGNhbGxiYWNrIHRvIGZpbGwgb3VyIGJ1ZmZlciB3aXRoIGRhdGEKICAqIHRvIHVwbG9hZC4KQEAgLTE5NSwyNyArMjIxLDI4IEBACiAgICAgICAgICAgIHN0cmxlbihlbmRvZmxpbmVfbmV0d29yaykpOwogCiAjaWZkZWYgQ1VSTF9ET0VTX0NPTlZFUlNJT05TCi0gICAgQ1VSTGNvZGUgcmVzdWx0OwotICAgIGludCBsZW5ndGg7Ci0gICAgaWYoZGF0YS0+c2V0LnByZWZlcl9hc2NpaSkgewotICAgICAgLyogdHJhbnNsYXRlIHRoZSBwcm90b2NvbCBhbmQgZGF0YSAqLwotICAgICAgbGVuZ3RoID0gbnJlYWQ7CisgICAgeworICAgICAgQ1VSTGNvZGUgcmVzdWx0OworICAgICAgaW50IGxlbmd0aDsKKyAgICAgIGlmKGRhdGEtPnNldC5wcmVmZXJfYXNjaWkpCisgICAgICAgIC8qIHRyYW5zbGF0ZSB0aGUgcHJvdG9jb2wgYW5kIGRhdGEgKi8KKyAgICAgICAgbGVuZ3RoID0gbnJlYWQ7CisgICAgICBlbHNlCisgICAgICAgIC8qIGp1c3QgdHJhbnNsYXRlIHRoZSBwcm90b2NvbCBwb3J0aW9uICovCisgICAgICAgIGxlbmd0aCA9IChpbnQpc3RybGVuKGhleGJ1ZmZlcik7CisgICAgICByZXN1bHQgPSBDdXJsX2NvbnZlcnRfdG9fbmV0d29yayhkYXRhLCBkYXRhLT5yZXEudXBsb2FkX2Zyb21oZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKKyAgICAgIC8qIEN1cmxfY29udmVydF90b19uZXR3b3JrIGNhbGxzIGZhaWxmIGlmIHVuc3VjY2Vzc2Z1bCAqLworICAgICAgaWYocmVzdWx0KQorICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8qIGp1c3QgdHJhbnNsYXRlIHRoZSBwcm90b2NvbCBwb3J0aW9uICovCi0gICAgICBsZW5ndGggPSBzdHJsZW4oaGV4YnVmZmVyKTsKLSAgICB9Ci0gICAgcmVzdWx0ID0gQ3VybF9jb252ZXJ0X3RvX25ldHdvcmsoZGF0YSwgZGF0YS0+cmVxLnVwbG9hZF9mcm9taGVyZSwgbGVuZ3RoKTsKLSAgICAvKiBDdXJsX2NvbnZlcnRfdG9fbmV0d29yayBjYWxscyBmYWlsZiBpZiB1bnN1Y2Nlc3NmdWwgKi8KLSAgICBpZihyZXN1bHQpCi0gICAgICByZXR1cm4gcmVzdWx0OwogI2VuZGlmIC8qIENVUkxfRE9FU19DT05WRVJTSU9OUyAqLwogCiAgICAgaWYoKG5yZWFkIC0gaGV4bGVuKSA9PSAwKQogICAgICAgLyogbWFyayB0aGlzIGFzIGRvbmUgb25jZSB0aGlzIGNodW5rIGlzIHRyYW5zZmVycmVkICovCiAgICAgICBkYXRhLT5yZXEudXBsb2FkX2RvbmUgPSBUUlVFOwogCi0gICAgbnJlYWQrPShpbnQpc3RybGVuKGVuZG9mbGluZV9uYXRpdmUpOyAvKiBmb3IgdGhlIGFkZGVkIGVuZCBvZiBsaW5lICovCisgICAgbnJlYWQgKz0gKGludClzdHJsZW4oZW5kb2ZsaW5lX25hdGl2ZSk7IC8qIGZvciB0aGUgYWRkZWQgZW5kIG9mIGxpbmUgKi8KICAgfQogI2lmZGVmIENVUkxfRE9FU19DT05WRVJTSU9OUwogICBlbHNlIGlmKChkYXRhLT5zZXQucHJlZmVyX2FzY2lpKSAmJiAoIXNlbmRpbmdfaHR0cF9oZWFkZXJzKSkgewpAQCAtMjQxLDYgKzI2OCw3IEBACiBDVVJMY29kZSBDdXJsX3JlYWRyZXdpbmQoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKQogewogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKKyAgY3VybF9taW1lcGFydCAqbWltZXBhcnQgPSAmZGF0YS0+c2V0Lm1pbWVwb3N0OwogCiAgIGNvbm4tPmJpdHMucmV3aW5kYWZ0ZXJzZW5kID0gRkFMU0U7IC8qIHdlIHJld2luZCBub3cgKi8KIApAQCAtMjUzLDkgKzI4MSwyMSBAQAogICAvKiBXZSBoYXZlIHNlbnQgYXdheSBkYXRhLiBJZiBub3QgdXNpbmcgQ1VSTE9QVF9QT1NURklFTERTIG9yCiAgICAgIENVUkxPUFRfSFRUUFBPU1QsIGNhbGwgYXBwIHRvIHJld2luZAogICAqLwotICBpZihkYXRhLT5zZXQucG9zdGZpZWxkcyB8fAotICAgICAoZGF0YS0+c2V0Lmh0dHByZXEgPT0gSFRUUFJFUV9QT1NUX0ZPUk0pKQorICBpZihjb25uLT5oYW5kbGVyLT5wcm90b2NvbCAmIFBST1RPX0ZBTUlMWV9IVFRQKSB7CisgICAgc3RydWN0IEhUVFAgKmh0dHAgPSBkYXRhLT5yZXEucHJvdG9wOworCisgICAgaWYoaHR0cC0+c2VuZGl0KQorICAgICAgbWltZXBhcnQgPSBodHRwLT5zZW5kaXQ7CisgIH0KKyAgaWYoZGF0YS0+c2V0LnBvc3RmaWVsZHMpCiAgICAgOyAvKiBkbyBub3RoaW5nICovCisgIGVsc2UgaWYoZGF0YS0+c2V0Lmh0dHByZXEgPT0gSFRUUFJFUV9QT1NUX01JTUUgfHwKKyAgICAgICAgICBkYXRhLT5zZXQuaHR0cHJlcSA9PSBIVFRQUkVRX1BPU1RfRk9STSkgeworICAgIGlmKEN1cmxfbWltZV9yZXdpbmQobWltZXBhcnQpKSB7CisgICAgICBmYWlsZihkYXRhLCAiQ2Fubm90IHJld2luZCBtaW1lL3Bvc3QgZGF0YSIpOworICAgICAgcmV0dXJuIENVUkxFX1NFTkRfRkFJTF9SRVdJTkQ7CisgICAgfQorICB9CiAgIGVsc2UgewogICAgIGlmKGRhdGEtPnNldC5zZWVrX2Z1bmMpIHsKICAgICAgIGludCBlcnI7CkBAIC01NjAsNyArNjAwLDcgQEAKICAgICAgICAgICAgIGluZm9mKGRhdGEsICJJZ25vcmluZyB0aGUgcmVzcG9uc2UtYm9keVxuIik7CiAgICAgICAgICAgfQogICAgICAgICAgIGlmKGRhdGEtPnN0YXRlLnJlc3VtZV9mcm9tICYmICFrLT5jb250ZW50X3JhbmdlICYmCi0gICAgICAgICAgICAgKGRhdGEtPnNldC5odHRwcmVxPT1IVFRQUkVRX0dFVCkgJiYKKyAgICAgICAgICAgICAoZGF0YS0+c2V0Lmh0dHByZXEgPT0gSFRUUFJFUV9HRVQpICYmCiAgICAgICAgICAgICAgIWstPmlnbm9yZWJvZHkpIHsKIAogICAgICAgICAgICAgaWYoay0+c2l6ZSA9PSBkYXRhLT5zdGF0ZS5yZXN1bWVfZnJvbSkgewpAQCAtOTE1LDcgKzk1NSw3IEBACiAgICAgICAgIC8qIHRoaXMgaXMgYSBwYXVzZWQgdHJhbnNmZXIgKi8KICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICBpZihucmVhZDw9MCkgeworICAgICAgaWYobnJlYWQgPD0gMCkgewogICAgICAgICByZXN1bHQgPSBkb25lX3NlbmRpbmcoY29ubiwgayk7CiAgICAgICAgIGlmKHJlc3VsdCkKICAgICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTA1NSw3ICsxMDk1LDcgQEAKIHsKICAgc3RydWN0IFNpbmdsZVJlcXVlc3QgKmsgPSAmZGF0YS0+cmVxOwogICBDVVJMY29kZSByZXN1bHQ7Ci0gIGludCBkaWR3aGF0PTA7CisgIGludCBkaWR3aGF0ID0gMDsKIAogICBjdXJsX3NvY2tldF90IGZkX3JlYWQ7CiAgIGN1cmxfc29ja2V0X3QgZmRfd3JpdGU7CkBAIC0xMjg4LDYgKzEzMjgsMTMgQEAKICAgICBmYWlsZihkYXRhLCAiTm8gVVJMIHNldCEiKTsKICAgICByZXR1cm4gQ1VSTEVfVVJMX01BTEZPUk1BVDsKICAgfQorICAvKiBzaW5jZSB0aGUgVVJMIG1heSBoYXZlIGJlZW4gcmVkaXJlY3RlZCBpbiBhIHByZXZpb3VzIHVzZSBvZiB0aGlzIGhhbmRsZSAqLworICBpZihkYXRhLT5jaGFuZ2UudXJsX2FsbG9jKSB7CisgICAgLyogdGhlIGFscmVhZHkgc2V0IFVSTCBpcyBhbGxvY2F0ZWQsIGZyZWUgaXQgZmlyc3QhICovCisgICAgQ3VybF9zYWZlZnJlZShkYXRhLT5jaGFuZ2UudXJsKTsKKyAgICBkYXRhLT5jaGFuZ2UudXJsX2FsbG9jID0gRkFMU0U7CisgIH0KKyAgZGF0YS0+Y2hhbmdlLnVybCA9IGRhdGEtPnNldC5zdHJbU1RSSU5HX1NFVF9VUkxdOwogCiAgIC8qIEluaXQgdGhlIFNTTCBzZXNzaW9uIElEIGNhY2hlIGhlcmUuIFdlIGRvIGl0IGhlcmUgc2luY2Ugd2Ugd2FudCB0byBkbyBpdAogICAgICBhZnRlciB0aGUgKl9zZXRvcHQoKSBjYWxscyAodGhhdCBjb3VsZCBzcGVjaWZ5IHRoZSBzaXplIG9mIHRoZSBjYWNoZSkgYnV0CkBAIC0xMjk2LDcgKzEzNDMsNyBAQAogICBpZihyZXN1bHQpCiAgICAgcmV0dXJuIHJlc3VsdDsKIAotICBkYXRhLT5zZXQuZm9sbG93bG9jYXRpb249MDsgLyogcmVzZXQgdGhlIGxvY2F0aW9uLWZvbGxvdyBjb3VudGVyICovCisgIGRhdGEtPnNldC5mb2xsb3dsb2NhdGlvbiA9IDA7IC8qIHJlc2V0IHRoZSBsb2NhdGlvbi1mb2xsb3cgY291bnRlciAqLwogICBkYXRhLT5zdGF0ZS50aGlzX2lzX2FfZm9sbG93ID0gRkFMU0U7IC8qIHJlc2V0IHRoaXMgKi8KICAgZGF0YS0+c3RhdGUuZXJyb3JidWYgPSBGQUxTRTsgLyogbm8gZXJyb3IgaGFzIG9jY3VycmVkICovCiAgIGRhdGEtPnN0YXRlLmh0dHB2ZXJzaW9uID0gMDsgLyogZG9uJ3QgYXNzdW1lIGFueSBwYXJ0aWN1bGFyIHNlcnZlciB2ZXJzaW9uICovCkBAIC0xMzM4LDcgKzEzODUsNyBAQAogI2VuZGlmCiAKICAgICBDdXJsX2luaXRpbmZvKGRhdGEpOyAvKiByZXNldCBzZXNzaW9uLXNwZWNpZmljIGluZm9ybWF0aW9uICJ2YXJpYWJsZXMiICovCi0gICAgQ3VybF9wZ3JzUmVzZXRUaW1lc1NpemVzKGRhdGEpOworICAgIEN1cmxfcGdyc1Jlc2V0VHJhbnNmZXJTaXplcyhkYXRhKTsKICAgICBDdXJsX3BncnNTdGFydE5vdyhkYXRhKTsKIAogICAgIGlmKGRhdGEtPnNldC50aW1lb3V0KQpAQCAtMTM4NCwxOSArMTQzMSw1OSBAQAogCiAjaWZuZGVmIENVUkxfRElTQUJMRV9IVFRQCiAvKgorICogRmluZCB0aGUgc2VwYXJhdG9yIGF0IHRoZSBlbmQgb2YgdGhlIGhvc3QgbmFtZSwgb3IgdGhlICc/JyBpbiBjYXNlcyBsaWtlCisgKiBodHRwOi8vd3d3LnVybC5jb20/aWQ9MjM4MAorICovCitzdGF0aWMgY29uc3QgY2hhciAqZmluZF9ob3N0X3NlcChjb25zdCBjaGFyICp1cmwpCit7CisgIGNvbnN0IGNoYXIgKnNlcDsKKyAgY29uc3QgY2hhciAqcXVlcnk7CisKKyAgLyogRmluZCB0aGUgc3RhcnQgb2YgdGhlIGhvc3RuYW1lICovCisgIHNlcCA9IHN0cnN0cih1cmwsICIvLyIpOworICBpZighc2VwKQorICAgIHNlcCA9IHVybDsKKyAgZWxzZQorICAgIHNlcCArPSAyOworCisgIHF1ZXJ5ID0gc3RyY2hyKHNlcCwgJz8nKTsKKyAgc2VwID0gc3RyY2hyKHNlcCwgJy8nKTsKKworICBpZighc2VwKQorICAgIHNlcCA9IHVybCArIHN0cmxlbih1cmwpOworCisgIGlmKCFxdWVyeSkKKyAgICBxdWVyeSA9IHVybCArIHN0cmxlbih1cmwpOworCisgIHJldHVybiBzZXAgPCBxdWVyeSA/IHNlcCA6IHF1ZXJ5OworfQorCisvKgogICogc3RybGVuX3VybCgpIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gVVJMIGlmIHRoZSBzcGFjZXMgd2l0aGluIHRoZQogICogVVJMIHdlcmUgcHJvcGVybHkgVVJMIGVuY29kZWQuCisgKiBVUkwgZW5jb2Rpbmcgc2hvdWxkIGJlIHNraXBwZWQgZm9yIGhvc3QgbmFtZXMsIG90aGVyd2lzZSBJRE4gcmVzb2x1dGlvbgorICogd2lsbCBmYWlsLgogICovCi1zdGF0aWMgc2l6ZV90IHN0cmxlbl91cmwoY29uc3QgY2hhciAqdXJsKQorc3RhdGljIHNpemVfdCBzdHJsZW5fdXJsKGNvbnN0IGNoYXIgKnVybCwgYm9vbCByZWxhdGl2ZSkKIHsKICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHRyOwotICBzaXplX3QgbmV3bGVuPTA7Ci0gIGJvb2wgbGVmdD1UUlVFOyAvKiBsZWZ0IHNpZGUgb2YgdGhlID8gKi8KKyAgc2l6ZV90IG5ld2xlbiA9IDA7CisgIGJvb2wgbGVmdCA9IFRSVUU7IC8qIGxlZnQgc2lkZSBvZiB0aGUgPyAqLworICBjb25zdCB1bnNpZ25lZCBjaGFyICpob3N0X3NlcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHVybDsKIAotICBmb3IocHRyPSh1bnNpZ25lZCBjaGFyICopdXJsOyAqcHRyOyBwdHIrKykgeworICBpZighcmVsYXRpdmUpCisgICAgaG9zdF9zZXAgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBmaW5kX2hvc3Rfc2VwKHVybCk7CisKKyAgZm9yKHB0ciA9ICh1bnNpZ25lZCBjaGFyICopdXJsOyAqcHRyOyBwdHIrKykgeworCisgICAgaWYocHRyIDwgaG9zdF9zZXApIHsKKyAgICAgICsrbmV3bGVuOworICAgICAgY29udGludWU7CisgICAgfQorCiAgICAgc3dpdGNoKCpwdHIpIHsKICAgICBjYXNlICc/JzoKLSAgICAgIGxlZnQ9RkFMU0U7CisgICAgICBsZWZ0ID0gRkFMU0U7CiAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KICAgICBkZWZhdWx0OgogICAgICAgaWYoKnB0ciA+PSAweDgwKQpAQCAtMTQwNSw3ICsxNDkyLDcgQEAKICAgICAgIGJyZWFrOwogICAgIGNhc2UgJyAnOgogICAgICAgaWYobGVmdCkKLSAgICAgICAgbmV3bGVuKz0zOworICAgICAgICBuZXdsZW4gKz0gMzsKICAgICAgIGVsc2UKICAgICAgICAgbmV3bGVuKys7CiAgICAgICBicmVhazsKQEAgLTE0MTYsMTkgKzE1MDMsMzIgQEAKIAogLyogc3RyY3B5X3VybCgpIGNvcGllcyBhIHVybCB0byBhIG91dHB1dCBidWZmZXIgYW5kIFVSTC1lbmNvZGVzIHRoZSBzcGFjZXMgaW4KICAqIHRoZSBzb3VyY2UgVVJMIGFjY29yZGluZ2x5LgorICogVVJMIGVuY29kaW5nIHNob3VsZCBiZSBza2lwcGVkIGZvciBob3N0IG5hbWVzLCBvdGhlcndpc2UgSUROIHJlc29sdXRpb24KKyAqIHdpbGwgZmFpbC4KICAqLwotc3RhdGljIHZvaWQgc3RyY3B5X3VybChjaGFyICpvdXRwdXQsIGNvbnN0IGNoYXIgKnVybCkKK3N0YXRpYyB2b2lkIHN0cmNweV91cmwoY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICp1cmwsIGJvb2wgcmVsYXRpdmUpCiB7CiAgIC8qIHdlIG11c3QgYWRkIHRoaXMgd2l0aCB3aGl0ZXNwYWNlLXJlcGxhY2luZyAqLwotICBib29sIGxlZnQ9VFJVRTsKKyAgYm9vbCBsZWZ0ID0gVFJVRTsKICAgY29uc3QgdW5zaWduZWQgY2hhciAqaXB0cjsKICAgY2hhciAqb3B0ciA9IG91dHB1dDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqaG9zdF9zZXAgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSB1cmw7CisKKyAgaWYoIXJlbGF0aXZlKQorICAgIGhvc3Rfc2VwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgZmluZF9ob3N0X3NlcCh1cmwpOworCiAgIGZvcihpcHRyID0gKHVuc2lnbmVkIGNoYXIgKil1cmw7ICAgIC8qIHJlYWQgZnJvbSBoZXJlICovCiAgICAgICAqaXB0cjsgICAgICAgICAvKiB1bnRpbCB6ZXJvIGJ5dGUgKi8KICAgICAgIGlwdHIrKykgeworCisgICAgaWYoaXB0ciA8IGhvc3Rfc2VwKSB7CisgICAgICAqb3B0cisrID0gKmlwdHI7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKICAgICBzd2l0Y2goKmlwdHIpIHsKICAgICBjYXNlICc/JzoKLSAgICAgIGxlZnQ9RkFMU0U7CisgICAgICBsZWZ0ID0gRkFMU0U7CiAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KICAgICBkZWZhdWx0OgogICAgICAgaWYoKmlwdHIgPj0gMHg4MCkgewpAQCAtMTQ0OSw3ICsxNTQ5LDcgQEAKICAgICAgIGJyZWFrOwogICAgIH0KICAgfQotICAqb3B0cj0wOyAvKiB6ZXJvIHRlcm1pbmF0ZSBvdXRwdXQgYnVmZmVyICovCisgICpvcHRyID0gMDsgLyogemVybyB0ZXJtaW5hdGUgb3V0cHV0IGJ1ZmZlciAqLwogCiB9CiAKQEAgLTE0ODEsMzIgKzE1ODEsMzMgQEAKICAgY2hhciAqcHJvdHNlcDsKICAgY2hhciAqcGF0aHNlcDsKICAgc2l6ZV90IG5ld2xlbjsKKyAgYm9vbCBob3N0X2NoYW5nZWQgPSBGQUxTRTsKIAogICBjb25zdCBjaGFyICp1c2V1cmwgPSByZWx1cmw7CiAgIHNpemVfdCB1cmxsZW47CiAKICAgLyogd2UgbXVzdCBtYWtlIG91ciBvd24gY29weSBvZiB0aGUgVVJMIHRvIHBsYXkgd2l0aCwgYXMgaXQgbWF5CiAgICAgIHBvaW50IHRvIHJlYWQtb25seSBkYXRhICovCi0gIGNoYXIgKnVybF9jbG9uZT1zdHJkdXAoYmFzZSk7CisgIGNoYXIgKnVybF9jbG9uZSA9IHN0cmR1cChiYXNlKTsKIAogICBpZighdXJsX2Nsb25lKQogICAgIHJldHVybiBOVUxMOyAvKiBza2lwIG91dCBvZiB0aGlzIE5PVyAqLwogCiAgIC8qIHByb3RzZXAgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgaG9zdCBuYW1lICovCi0gIHByb3RzZXA9c3Ryc3RyKHVybF9jbG9uZSwgIi8vIik7CisgIHByb3RzZXAgPSBzdHJzdHIodXJsX2Nsb25lLCAiLy8iKTsKICAgaWYoIXByb3RzZXApCi0gICAgcHJvdHNlcD11cmxfY2xvbmU7CisgICAgcHJvdHNlcCA9IHVybF9jbG9uZTsKICAgZWxzZQotICAgIHByb3RzZXArPTI7IC8qIHBhc3MgdGhlIHNsYXNoZXMgKi8KKyAgICBwcm90c2VwICs9IDI7IC8qIHBhc3MgdGhlIHNsYXNoZXMgKi8KIAogICBpZignLycgIT0gcmVsdXJsWzBdKSB7Ci0gICAgaW50IGxldmVsPTA7CisgICAgaW50IGxldmVsID0gMDsKIAogICAgIC8qIEZpcnN0IHdlIG5lZWQgdG8gZmluZCBvdXQgaWYgdGhlcmUncyBhID8tbGV0dGVyIGluIHRoZSBVUkwsCiAgICAgICAgYW5kIGN1dCBpdCBhbmQgdGhlIHJpZ2h0LXNpZGUgb2YgdGhhdCBvZmYgKi8KICAgICBwYXRoc2VwID0gc3RyY2hyKHByb3RzZXAsICc/Jyk7CiAgICAgaWYocGF0aHNlcCkKLSAgICAgICpwYXRoc2VwPTA7CisgICAgICAqcGF0aHNlcCA9IDA7CiAKICAgICAvKiB3ZSBoYXZlIGEgcmVsYXRpdmUgcGF0aCB0byBhcHBlbmQgdG8gdGhlIGxhc3Qgc2xhc2ggaWYgdGhlcmUncyBvbmUKICAgICAgICBhdmFpbGFibGUsIG9yIGlmIHRoZSBuZXcgVVJMIGlzIGp1c3QgYSBxdWVyeSBzdHJpbmcgKHN0YXJ0cyB3aXRoIGEKQEAgLTE1MTUsMTQgKzE2MTYsMTQgQEAKICAgICBpZih1c2V1cmxbMF0gIT0gJz8nKSB7CiAgICAgICBwYXRoc2VwID0gc3RycmNocihwcm90c2VwLCAnLycpOwogICAgICAgaWYocGF0aHNlcCkKLSAgICAgICAgKnBhdGhzZXA9MDsKKyAgICAgICAgKnBhdGhzZXAgPSAwOwogICAgIH0KIAogICAgIC8qIENoZWNrIGlmIHRoZXJlJ3MgYW55IHNsYXNoIGFmdGVyIHRoZSBob3N0IG5hbWUsIGFuZCBpZiBzbywgcmVtZW1iZXIKICAgICAgICB0aGF0IHBvc2l0aW9uIGluc3RlYWQgKi8KICAgICBwYXRoc2VwID0gc3RyY2hyKHByb3RzZXAsICcvJyk7CiAgICAgaWYocGF0aHNlcCkKLSAgICAgIHByb3RzZXAgPSBwYXRoc2VwKzE7CisgICAgICBwcm90c2VwID0gcGF0aHNlcCArIDE7CiAgICAgZWxzZQogICAgICAgcHJvdHNlcCA9IE5VTEw7CiAKQEAgLTE1MzAsMTMgKzE2MzEsMTMgQEAKICAgICAgICBhbmQgYWN0IGFjY29yZGluZ2x5ICovCiAKICAgICBpZigodXNldXJsWzBdID09ICcuJykgJiYgKHVzZXVybFsxXSA9PSAnLycpKQotICAgICAgdXNldXJsKz0yOyAvKiBqdXN0IHNraXAgdGhlICIuLyIgKi8KKyAgICAgIHVzZXVybCArPSAyOyAvKiBqdXN0IHNraXAgdGhlICIuLyIgKi8KIAogICAgIHdoaWxlKCh1c2V1cmxbMF0gPT0gJy4nKSAmJgogICAgICAgICAgICh1c2V1cmxbMV0gPT0gJy4nKSAmJgogICAgICAgICAgICh1c2V1cmxbMl0gPT0gJy8nKSkgewogICAgICAgbGV2ZWwrKzsKLSAgICAgIHVzZXVybCs9MzsgLyogcGFzcyB0aGUgIi4uLyIgKi8KKyAgICAgIHVzZXVybCArPSAzOyAvKiBwYXNzIHRoZSAiLi4vIiAqLwogICAgIH0KIAogICAgIGlmKHByb3RzZXApIHsKQEAgLTE1NDQsOSArMTY0NSw5IEBACiAgICAgICAgIC8qIGN1dCBvZmYgb25lIG1vcmUgbGV2ZWwgZnJvbSB0aGUgcmlnaHQgb2YgdGhlIG9yaWdpbmFsIFVSTCAqLwogICAgICAgICBwYXRoc2VwID0gc3RycmNocihwcm90c2VwLCAnLycpOwogICAgICAgICBpZihwYXRoc2VwKQotICAgICAgICAgICpwYXRoc2VwPTA7CisgICAgICAgICAgKnBhdGhzZXAgPSAwOwogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAqcHJvdHNlcD0wOworICAgICAgICAgICpwcm90c2VwID0gMDsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgfQpAQCAtMTU1OCw5ICsxNjU5LDEwIEBACiAgICAgaWYoKHJlbHVybFswXSA9PSAnLycpICYmIChyZWx1cmxbMV0gPT0gJy8nKSkgewogICAgICAgLyogdGhlIG5ldyBVUkwgc3RhcnRzIHdpdGggLy8sIGp1c3Qga2VlcCB0aGUgcHJvdG9jb2wgcGFydCBmcm9tIHRoZQogICAgICAgICAgb3JpZ2luYWwgb25lICovCi0gICAgICAqcHJvdHNlcD0wOworICAgICAgKnByb3RzZXAgPSAwOwogICAgICAgdXNldXJsID0gJnJlbHVybFsyXTsgLyogd2Uga2VlcCB0aGUgc2xhc2hlcyBmcm9tIHRoZSBvcmlnaW5hbCwgc28gd2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgdGhlIG5ldyBvbmVzICovCisgICAgICBob3N0X2NoYW5nZWQgPSBUUlVFOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgIC8qIGN1dCBvZmYgdGhlIG9yaWdpbmFsIFVSTCBmcm9tIHRoZSBmaXJzdCBzbGFzaCwgb3IgZGVhbCB3aXRoIFVSTHMKQEAgLTE1NzMsNyArMTY3NSw3IEBACiAgICAgICAgIGNoYXIgKnNlcCA9IHN0cmNocihwcm90c2VwLCAnPycpOwogICAgICAgICBpZihzZXAgJiYgKHNlcCA8IHBhdGhzZXApKQogICAgICAgICAgIHBhdGhzZXAgPSBzZXA7Ci0gICAgICAgICpwYXRoc2VwPTA7CisgICAgICAgICpwYXRoc2VwID0gMDsKICAgICAgIH0KICAgICAgIGVsc2UgewogICAgICAgICAvKiBUaGVyZSB3YXMgbm8gc2xhc2guIE5vdywgc2luY2Ugd2UgbWlnaHQgYmUgb3BlcmF0aW5nIG9uIGEgYmFkbHkKQEAgLTE1ODIsNyArMTY4NCw3IEBACiAgICAgICAgICAgID8tbGV0dGVyIGFzIHdlbGwhICovCiAgICAgICAgIHBhdGhzZXAgPSBzdHJjaHIocHJvdHNlcCwgJz8nKTsKICAgICAgICAgaWYocGF0aHNlcCkKLSAgICAgICAgICAqcGF0aHNlcD0wOworICAgICAgICAgICpwYXRoc2VwID0gMDsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTE1OTIsNyArMTY5NCw3IEBACiAgICAgIGxldHRlciB3ZSByZXBsYWNlIGVhY2ggc3BhY2Ugd2l0aCAlMjAgd2hpbGUgaXQgaXMgcmVwbGFjZWQgd2l0aCAnKycKICAgICAgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlICc/JyBsZXR0ZXIuCiAgICovCi0gIG5ld2xlbiA9IHN0cmxlbl91cmwodXNldXJsKTsKKyAgbmV3bGVuID0gc3RybGVuX3VybCh1c2V1cmwsICFob3N0X2NoYW5nZWQpOwogCiAgIHVybGxlbiA9IHN0cmxlbih1cmxfY2xvbmUpOwogCkBAIC0xNjE0LDcgKzE3MTYsNyBAQAogICAgIG5ld2VzdFt1cmxsZW4rK109Jy8nOwogCiAgIC8qIHRoZW4gYXBwZW5kIHRoZSBuZXcgcGllY2Ugb24gdGhlIHJpZ2h0IHNpZGUgKi8KLSAgc3RyY3B5X3VybCgmbmV3ZXN0W3VybGxlbl0sIHVzZXVybCk7CisgIHN0cmNweV91cmwoJm5ld2VzdFt1cmxsZW5dLCB1c2V1cmwsICFob3N0X2NoYW5nZWQpOwogCiAgIGZyZWUodXJsX2Nsb25lKTsKIApAQCAtMTY3Myw3ICsxNzc1LDcgQEAKICAgICB9CiAgIH0KIAotICBpZighaXNfYWJzb2x1dGVfdXJsKG5ld3VybCkpICB7CisgIGlmKCFpc19hYnNvbHV0ZV91cmwobmV3dXJsKSkgewogICAgIC8qKioKICAgICAgKkRBTkcqIHRoaXMgaXMgYW4gUkZDIDIwNjggdmlvbGF0aW9uLiBUaGUgVVJMIGlzIHN1cHBvc2VkCiAgICAgIHRvIGJlIGFic29sdXRlIGFuZCB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBiZSB0aGF0IQpAQCAtMTY4NywxNSArMTc4OSwxNiBAQAogICAgIC8qIFRoZSBuZXcgVVJMIE1BWSBjb250YWluIHNwYWNlIG9yIGhpZ2ggYnl0ZSB2YWx1ZXMsIHRoYXQgbWVhbnMgYSBtaWdodHkKICAgICAgICBzdHVwaWQgcmVkaXJlY3QgVVJMIGJ1dCB3ZSBzdGlsbCBtYWtlIGFuIGVmZm9ydCB0byBkbyAicmlnaHQiLiAqLwogICAgIGNoYXIgKm5ld2VzdDsKLSAgICBzaXplX3QgbmV3bGVuID0gc3RybGVuX3VybChuZXd1cmwpOworICAgIHNpemVfdCBuZXdsZW4gPSBzdHJsZW5fdXJsKG5ld3VybCwgRkFMU0UpOwogCiAgICAgLyogVGhpcyBpcyBhbiBhYnNvbHV0ZSBVUkwsIGRvbid0IGFsbG93IHRoZSBjdXN0b20gcG9ydCBudW1iZXIgKi8KICAgICBkaXNhbGxvd3BvcnQgPSBUUlVFOwogCi0gICAgbmV3ZXN0ID0gbWFsbG9jKG5ld2xlbisxKTsgLyogZ2V0IG1lbW9yeSBmb3IgdGhpcyAqLworICAgIG5ld2VzdCA9IG1hbGxvYyhuZXdsZW4gKyAxKTsgLyogZ2V0IG1lbW9yeSBmb3IgdGhpcyAqLwogICAgIGlmKCFuZXdlc3QpCiAgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKLSAgICBzdHJjcHlfdXJsKG5ld2VzdCwgbmV3dXJsKTsgLyogY3JlYXRlIGEgc3BhY2UtZnJlZSBVUkwgKi8KKworICAgIHN0cmNweV91cmwobmV3ZXN0LCBuZXd1cmwsIEZBTFNFKTsgLyogY3JlYXRlIGEgc3BhY2UtZnJlZSBVUkwgKi8KICAgICBuZXd1cmwgPSBuZXdlc3Q7IC8qIHVzZSB0aGlzIGluc3RlYWQgbm93ICovCiAKICAgfQpAQCAtMTc2Myw3ICsxODY2LDggQEAKICAgICAgKiBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIENVUkxPUFRfUE9TVFJFRElSLgogICAgICAqLwogICAgIGlmKChkYXRhLT5zZXQuaHR0cHJlcSA9PSBIVFRQUkVRX1BPU1QKLSAgICAgICAgfHwgZGF0YS0+c2V0Lmh0dHByZXEgPT0gSFRUUFJFUV9QT1NUX0ZPUk0pCisgICAgICAgIHx8IGRhdGEtPnNldC5odHRwcmVxID09IEhUVFBSRVFfUE9TVF9GT1JNCisgICAgICAgIHx8IGRhdGEtPnNldC5odHRwcmVxID09IEhUVFBSRVFfUE9TVF9NSU1FKQogICAgICAgICYmICEoZGF0YS0+c2V0LmtlZXBfcG9zdCAmIENVUkxfUkVESVJfUE9TVF8zMDEpKSB7CiAgICAgICBpbmZvZihkYXRhLCAiU3dpdGNoIGZyb20gUE9TVCB0byBHRVRcbiIpOwogICAgICAgZGF0YS0+c2V0Lmh0dHByZXEgPSBIVFRQUkVRX0dFVDsKQEAgLTE3ODcsNyArMTg5MSw4IEBACiAgICAgICogY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBDVVJMT1BUX1BPU1RSRURJUi4KICAgICAgKi8KICAgICBpZigoZGF0YS0+c2V0Lmh0dHByZXEgPT0gSFRUUFJFUV9QT1NUCi0gICAgICAgIHx8IGRhdGEtPnNldC5odHRwcmVxID09IEhUVFBSRVFfUE9TVF9GT1JNKQorICAgICAgICB8fCBkYXRhLT5zZXQuaHR0cHJlcSA9PSBIVFRQUkVRX1BPU1RfRk9STQorICAgICAgICB8fCBkYXRhLT5zZXQuaHR0cHJlcSA9PSBIVFRQUkVRX1BPU1RfTUlNRSkKICAgICAgICAmJiAhKGRhdGEtPnNldC5rZWVwX3Bvc3QgJiBDVVJMX1JFRElSX1BPU1RfMzAyKSkgewogICAgICAgaW5mb2YoZGF0YSwgIlN3aXRjaCBmcm9tIFBPU1QgdG8gR0VUXG4iKTsKICAgICAgIGRhdGEtPnNldC5odHRwcmVxID0gSFRUUFJFUV9HRVQ7CkBAIC0xODIwLDcgKzE5MjUsNyBAQAogICAgIGJyZWFrOwogICB9CiAgIEN1cmxfcGdyc1RpbWUoZGF0YSwgVElNRVJfUkVESVJFQ1QpOwotICBDdXJsX3BncnNSZXNldFRpbWVzU2l6ZXMoZGF0YSk7CisgIEN1cmxfcGdyc1Jlc2V0VHJhbnNmZXJTaXplcyhkYXRhKTsKIAogICByZXR1cm4gQ1VSTEVfT0s7CiAjZW5kaWYgLyogQ1VSTF9ESVNBQkxFX0hUVFAgKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3RyYW5zZmVyLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi90cmFuc2Zlci5oCmluZGV4IDUxODk2NzIuLjcyNTI2YTggMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3RyYW5zZmVyLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdHJhbnNmZXIuaApAQCAtNyw3ICs3LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtMjIsNiArMjIsOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKK2NoYXIgKkN1cmxfY2hlY2toZWFkZXJzKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRoaXNoZWFkZXIpOworCiB2b2lkIEN1cmxfaW5pdF9DT05ORUNUKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpOwogCiBDVVJMY29kZSBDdXJsX3ByZXRyYW5zZmVyKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdXJsLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi91cmwuYwppbmRleCA4NzQ0NmRiLi41ODQ2MzViIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi91cmwuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi91cmwuYwpAQCAtNzEsNiArNzEsNyBAQAogI2luY2x1ZGUgIm5ldHJjLmgiCiAKICNpbmNsdWRlICJmb3JtZGF0YS5oIgorI2luY2x1ZGUgIm1pbWUuaCIKICNpbmNsdWRlICJ2dGxzL3Z0bHMuaCIKICNpbmNsdWRlICJob3N0aXAuaCIKICNpbmNsdWRlICJ0cmFuc2Zlci5oIgpAQCAtMjc0LDYgKzI3NSw3IEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyAqLwpAQCAtMjgzLDcgKzI4NSw3IEBACiB7CiAgIC8qIEZyZWUgYWxsIGR5bmFtaWMgc3RyaW5ncyBzdG9yZWQgaW4gdGhlIGRhdGEtPnNldCBzdWJzdHJ1Y3R1cmUuICovCiAgIGVudW0gZHVwc3RyaW5nIGk7Ci0gIGZvcihpPShlbnVtIGR1cHN0cmluZykwOyBpIDwgU1RSSU5HX0xBU1Q7IGkrKykgeworICBmb3IoaSA9IChlbnVtIGR1cHN0cmluZykwOyBpIDwgU1RSSU5HX0xBU1Q7IGkrKykgewogICAgIEN1cmxfc2FmZWZyZWUoZGF0YS0+c2V0LnN0cltpXSk7CiAgIH0KIApAQCAtMzcwLDcgKzM3Miw3IEBACiAgIG1lbXNldChkc3QtPnNldC5zdHIsIDAsIFNUUklOR19MQVNUICogc2l6ZW9mKGNoYXIgKikpOwogCiAgIC8qIGR1cGxpY2F0ZSBhbGwgc3RyaW5ncyAqLwotICBmb3IoaT0oZW51bSBkdXBzdHJpbmcpMDsgaTwgU1RSSU5HX0xBU1RaRVJPVEVSTUlOQVRFRDsgaSsrKSB7CisgIGZvcihpID0gKGVudW0gZHVwc3RyaW5nKTA7IGk8IFNUUklOR19MQVNUWkVST1RFUk1JTkFURUQ7IGkrKykgewogICAgIHJlc3VsdCA9IHNldHN0cm9wdCgmZHN0LT5zZXQuc3RyW2ldLCBzcmMtPnNldC5zdHJbaV0pOwogICAgIGlmKHJlc3VsdCkKICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC00NzgsNiArNDgwLDggQEAKICAgQ3VybF9odHRwMl9jbGVhbnVwX2RlcGVuZGVuY2llcyhkYXRhKTsKICAgQ3VybF9jb252ZXJ0X2Nsb3NlKGRhdGEpOwogCisgIEN1cmxfbWltZV9jbGVhbnBhcnQoJmRhdGEtPnNldC5taW1lcG9zdCk7CisKICAgLyogTm8gbG9uZ2VyIGEgZGlydHkgc2hhcmUsIGlmIGl0IGV4aXN0cyAqLwogICBpZihkYXRhLT5zaGFyZSkgewogICAgIEN1cmxfc2hhcmVfbG9jayhkYXRhLCBDVVJMX0xPQ0tfREFUQV9TSEFSRSwgQ1VSTF9MT0NLX0FDQ0VTU19TSU5HTEUpOwpAQCAtNTQ1LDYgKzU0OSw5IEBACiAgIHNldC0+aHR0cGF1dGggPSBDVVJMQVVUSF9CQVNJQzsgIC8qIGRlZmF1bHRzIHRvIGJhc2ljICovCiAgIHNldC0+cHJveHlhdXRoID0gQ1VSTEFVVEhfQkFTSUM7IC8qIGRlZmF1bHRzIHRvIGJhc2ljICovCiAKKyAgLyogU09DS1M1IHByb3h5IGF1dGggZGVmYXVsdHMgdG8gdXNlcm5hbWUvcGFzc3dvcmQgKyBHU1MtQVBJICovCisgIHNldC0+c29ja3M1YXV0aCA9IENVUkxBVVRIX0JBU0lDIHwgQ1VSTEFVVEhfR1NTQVBJOworCiAgIC8qIG1ha2UgbGliY3VybCBxdWlldCBieSBkZWZhdWx0OiAqLwogICBzZXQtPmhpZGVfcHJvZ3Jlc3MgPSBUUlVFOyAgLyogQ1VSTE9QVF9OT1BST0dSRVNTIGNoYW5nZXMgdGhlc2UgKi8KIApAQCAtNjY0LDYgKzY3MSw4IEBACiAgICAgcmVzdWx0ID0gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgfQogCisgIEN1cmxfbWltZV9pbml0cGFydCgmZGF0YS0+c2V0Lm1pbWVwb3N0LCBkYXRhKTsKKwogICBkYXRhLT5zdGF0ZS5oZWFkZXJidWZmID0gbWFsbG9jKEhFQURFUlNJWkUpOwogICBpZighZGF0YS0+c3RhdGUuaGVhZGVyYnVmZikgewogICAgIERFQlVHRihmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBtYWxsb2Mgb2YgaGVhZGVyYnVmZiBmYWlsZWRcbiIpKTsKQEAgLTY3Miw3ICs2ODEsNyBAQAogICBlbHNlIHsKICAgICByZXN1bHQgPSBDdXJsX2luaXRfdXNlcmRlZmluZWQoJmRhdGEtPnNldCk7CiAKLSAgICBkYXRhLT5zdGF0ZS5oZWFkZXJzaXplPUhFQURFUlNJWkU7CisgICAgZGF0YS0+c3RhdGUuaGVhZGVyc2l6ZSA9IEhFQURFUlNJWkU7CiAKICAgICBDdXJsX2NvbnZlcnRfaW5pdChkYXRhKTsKIApAQCAtODI5LDYgKzgzOCwxMCBAQAogICAgICAgICAgdGhlbiB0aGlzIGNhbiBiZSBjaGFuZ2VkIHRvIEhFQUQgbGF0ZXIgb24pICovCiAgICAgICBkYXRhLT5zZXQuaHR0cHJlcSA9IEhUVFBSRVFfR0VUOwogICAgIGJyZWFrOworICBjYXNlIENVUkxPUFRfUkVRVUVTVF9UQVJHRVQ6CisgICAgcmVzdWx0ID0gc2V0c3Ryb3B0KCZkYXRhLT5zZXQuc3RyW1NUUklOR19UQVJHRVRdLAorICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcocGFyYW0sIGNoYXIgKikpOworICAgIGJyZWFrOwogICBjYXNlIENVUkxPUFRfRklMRVRJTUU6CiAgICAgLyoKICAgICAgKiBUcnkgdG8gZ2V0IHRoZSBmaWxlIHRpbWUgb2YgdGhlIHJlbW90ZSBkb2N1bWVudC4gVGhlIHRpbWUgd2lsbApAQCAtMTEzOSw2ICsxMTUyLDIwIEBACiAgICAgZGF0YS0+c2V0Lmh0dHByZXEgPSBIVFRQUkVRX1BPU1RfRk9STTsKICAgICBkYXRhLT5zZXQub3B0X25vX2JvZHkgPSBGQUxTRTsgLyogdGhpcyBpcyBpbXBsaWVkICovCiAgICAgYnJlYWs7CisjZW5kaWYgICAvKiBDVVJMX0RJU0FCTEVfSFRUUCAqLworCisgIGNhc2UgQ1VSTE9QVF9NSU1FUE9TVDoKKyAgICAvKgorICAgICAqIFNldCB0byBtYWtlIHVzIGRvIE1JTUUvZm9ybSBQT1NUCisgICAgICovCisgICAgcmVzdWx0ID0gY3VybF9taW1lX3N1YnBhcnRzKCZkYXRhLT5zZXQubWltZXBvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyhwYXJhbSwgY3VybF9taW1lICopKTsKKyAgICBpZighcmVzdWx0KSB7CisgICAgICBkYXRhLT5zZXQubWltZXBvc3QuZnJlZWZ1bmMgPSBOVUxMOyAvKiBBdm9pZCBmcmVlIHVwb24gZWFzeSBjbGVhbnVwLiAqLworICAgICAgZGF0YS0+c2V0Lmh0dHByZXEgPSBIVFRQUkVRX1BPU1RfTUlNRTsKKyAgICAgIGRhdGEtPnNldC5vcHRfbm9fYm9keSA9IEZBTFNFOyAvKiB0aGlzIGlzIGltcGxpZWQgKi8KKyAgICB9CisgICAgYnJlYWs7CiAKICAgY2FzZSBDVVJMT1BUX1JFRkVSRVI6CiAgICAgLyoKQEAgLTExNjgsNiArMTE5NSw3IEBACiAgICAgZGF0YS0+c2V0LmhlYWRlcnMgPSB2YV9hcmcocGFyYW0sIHN0cnVjdCBjdXJsX3NsaXN0ICopOwogICAgIGJyZWFrOwogCisjaWZuZGVmIENVUkxfRElTQUJMRV9IVFRQCiAgIGNhc2UgQ1VSTE9QVF9QUk9YWUhFQURFUjoKICAgICAvKgogICAgICAqIFNldCBhIGxpc3Qgd2l0aCBwcm94eSBoZWFkZXJzIHRvIHVzZSAob3IgcmVwbGFjZSBpbnRlcm5hbHMgd2l0aCkKQEAgLTEzMTksNyArMTM0Nyw3IEBACiAgICAgfQogCiAgICAgYnJlYWs7Ci0jZW5kaWYgLyogQ1VSTF9ESVNBQkxFX0NPT0tJRVMgKi8KKyNlbmRpZiAvKiAhQ1VSTF9ESVNBQkxFX0NPT0tJRVMgKi8KIAogICBjYXNlIENVUkxPUFRfSFRUUEdFVDoKICAgICAvKgpAQCAtMTM0NSw2ICsxMzczLDE2IEBACiAgICAgZGF0YS0+c2V0Lmh0dHB2ZXJzaW9uID0gYXJnOwogICAgIGJyZWFrOwogCisgIGNhc2UgQ1VSTE9QVF9FWFBFQ1RfMTAwX1RJTUVPVVRfTVM6CisgICAgLyoKKyAgICAgKiBUaW1lIHRvIHdhaXQgZm9yIGEgcmVzcG9uc2UgdG8gYSBIVFRQIHJlcXVlc3QgY29udGFpbmluZyBhbgorICAgICAqIEV4cGVjdDogMTAwLWNvbnRpbnVlIGhlYWRlciBiZWZvcmUgc2VuZGluZyB0aGUgZGF0YSBhbnl3YXkuCisgICAgICovCisgICAgZGF0YS0+c2V0LmV4cGVjdF8xMDBfdGltZW91dCA9IHZhX2FyZyhwYXJhbSwgbG9uZyk7CisgICAgYnJlYWs7CisKKyNlbmRpZiAgIC8qIENVUkxfRElTQUJMRV9IVFRQICovCisKICAgY2FzZSBDVVJMT1BUX0hUVFBBVVRIOgogICAgIC8qCiAgICAgICogU2V0IEhUVFAgQXV0aGVudGljYXRpb24gdHlwZSBCSVRNQVNLLgpAQCAtMTM5NiwxNiArMTQzNCw2IEBACiAgIH0KICAgYnJlYWs7CiAKLSAgY2FzZSBDVVJMT1BUX0VYUEVDVF8xMDBfVElNRU9VVF9NUzoKLSAgICAvKgotICAgICAqIFRpbWUgdG8gd2FpdCBmb3IgYSByZXNwb25zZSB0byBhIEhUVFAgcmVxdWVzdCBjb250YWluaW5nIGFuCi0gICAgICogRXhwZWN0OiAxMDAtY29udGludWUgaGVhZGVyIGJlZm9yZSBzZW5kaW5nIHRoZSBkYXRhIGFueXdheS4KLSAgICAgKi8KLSAgICBkYXRhLT5zZXQuZXhwZWN0XzEwMF90aW1lb3V0ID0gdmFfYXJnKHBhcmFtLCBsb25nKTsKLSAgICBicmVhazsKLQotI2VuZGlmICAgLyogQ1VSTF9ESVNBQkxFX0hUVFAgKi8KLQogICBjYXNlIENVUkxPUFRfQ1VTVE9NUkVRVUVTVDoKICAgICAvKgogICAgICAqIFNldCBhIGN1c3RvbSBzdHJpbmcgdG8gdXNlIGFzIHJlcXVlc3QKQEAgLTE1MzcsNiArMTU2NSwxMSBAQAogICAgIGJyZWFrOwogI2VuZGlmICAgLyogQ1VSTF9ESVNBQkxFX1BST1hZICovCiAKKyAgY2FzZSBDVVJMT1BUX1NPQ0tTNV9BVVRIOgorICAgIGRhdGEtPnNldC5zb2NrczVhdXRoID0gdmFfYXJnKHBhcmFtLCB1bnNpZ25lZCBsb25nKTsKKyAgICBpZihkYXRhLT5zZXQuc29ja3M1YXV0aCAmIH4oQ1VSTEFVVEhfQkFTSUMgfCBDVVJMQVVUSF9HU1NBUEkpKQorICAgICAgcmVzdWx0ID0gQ1VSTEVfTk9UX0JVSUxUX0lOOworICAgIGJyZWFrOwogI2lmIGRlZmluZWQoSEFWRV9HU1NBUEkpIHx8IGRlZmluZWQoVVNFX1dJTkRPV1NfU1NQSSkKICAgY2FzZSBDVVJMT1BUX1NPQ0tTNV9HU1NBUElfTkVDOgogICAgIC8qCkBAIC0xNjQ2LDI4ICsxNjc5LDI4IEBACiAgICAgICogVGhlIGxvdyBzcGVlZCBsaW1pdCB0aGF0IGlmIHRyYW5zZmVycyBhcmUgYmVsb3cgdGhpcyBmb3IKICAgICAgKiBDVVJMT1BUX0xPV19TUEVFRF9USU1FLCB0aGUgdHJhbnNmZXIgaXMgYWJvcnRlZC4KICAgICAgKi8KLSAgICBkYXRhLT5zZXQubG93X3NwZWVkX2xpbWl0PXZhX2FyZyhwYXJhbSwgbG9uZyk7CisgICAgZGF0YS0+c2V0Lmxvd19zcGVlZF9saW1pdCA9IHZhX2FyZyhwYXJhbSwgbG9uZyk7CiAgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTE9QVF9NQVhfU0VORF9TUEVFRF9MQVJHRToKICAgICAvKgogICAgICAqIFdoZW4gdHJhbnNmZXIgdXBsb2FkcyBhcmUgZmFzdGVyIHRoZW4gQ1VSTE9QVF9NQVhfU0VORF9TUEVFRF9MQVJHRQogICAgICAqIGJ5dGVzIHBlciBzZWNvbmQgdGhlIHRyYW5zZmVyIGlzIHRocm90dGxlZC4uCiAgICAgICovCi0gICAgZGF0YS0+c2V0Lm1heF9zZW5kX3NwZWVkPXZhX2FyZyhwYXJhbSwgY3VybF9vZmZfdCk7CisgICAgZGF0YS0+c2V0Lm1heF9zZW5kX3NwZWVkID0gdmFfYXJnKHBhcmFtLCBjdXJsX29mZl90KTsKICAgICBicmVhazsKICAgY2FzZSBDVVJMT1BUX01BWF9SRUNWX1NQRUVEX0xBUkdFOgogICAgIC8qCiAgICAgICogV2hlbiByZWNlaXZpbmcgZGF0YSBmYXN0ZXIgdGhhbiBDVVJMT1BUX01BWF9SRUNWX1NQRUVEX0xBUkdFIGJ5dGVzIHBlcgogICAgICAqIHNlY29uZCB0aGUgdHJhbnNmZXIgaXMgdGhyb3R0bGVkLi4KICAgICAgKi8KLSAgICBkYXRhLT5zZXQubWF4X3JlY3Zfc3BlZWQ9dmFfYXJnKHBhcmFtLCBjdXJsX29mZl90KTsKKyAgICBkYXRhLT5zZXQubWF4X3JlY3Zfc3BlZWQgPSB2YV9hcmcocGFyYW0sIGN1cmxfb2ZmX3QpOwogICAgIGJyZWFrOwogICBjYXNlIENVUkxPUFRfTE9XX1NQRUVEX1RJTUU6CiAgICAgLyoKICAgICAgKiBUaGUgbG93IHNwZWVkIHRpbWUgdGhhdCBpZiB0cmFuc2ZlcnMgYXJlIGJlbG93IHRoZSBzZXQKICAgICAgKiBDVVJMT1BUX0xPV19TUEVFRF9MSU1JVCBkdXJpbmcgdGhpcyB0aW1lLCB0aGUgdHJhbnNmZXIgaXMgYWJvcnRlZC4KICAgICAgKi8KLSAgICBkYXRhLT5zZXQubG93X3NwZWVkX3RpbWU9dmFfYXJnKHBhcmFtLCBsb25nKTsKKyAgICBkYXRhLT5zZXQubG93X3NwZWVkX3RpbWUgPSB2YV9hcmcocGFyYW0sIGxvbmcpOwogICAgIGJyZWFrOwogICBjYXNlIENVUkxPUFRfVVJMOgogICAgIC8qCkBAIC0xODYyLDEzICsxODk1LDEzIEBACiAgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTE9QVF9SRVNVTUVfRlJPTToKICAgICAvKgotICAgICAqIFJlc3VtZSB0cmFuc2ZlciBhdCB0aGUgZ2l2ZSBmaWxlIHBvc2l0aW9uCisgICAgICogUmVzdW1lIHRyYW5zZmVyIGF0IHRoZSBnaXZlbiBmaWxlIHBvc2l0aW9uCiAgICAgICovCiAgICAgZGF0YS0+c2V0LnNldF9yZXN1bWVfZnJvbSA9IHZhX2FyZyhwYXJhbSwgbG9uZyk7CiAgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTE9QVF9SRVNVTUVfRlJPTV9MQVJHRToKICAgICAvKgotICAgICAqIFJlc3VtZSB0cmFuc2ZlciBhdCB0aGUgZ2l2ZSBmaWxlIHBvc2l0aW9uCisgICAgICogUmVzdW1lIHRyYW5zZmVyIGF0IHRoZSBnaXZlbiBmaWxlIHBvc2l0aW9uCiAgICAgICovCiAgICAgZGF0YS0+c2V0LnNldF9yZXN1bWVfZnJvbSA9IHZhX2FyZyhwYXJhbSwgY3VybF9vZmZfdCk7CiAgICAgYnJlYWs7CkBAIC0yMTY2LDI0ICsyMTk5LDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgOiBGQUxTRTsKICAgICBicmVhazsKICAgY2FzZSBDVVJMT1BUX1NTTF9DVFhfRlVOQ1RJT046Ci0jaWZkZWYgaGF2ZV9jdXJsc3NsX3NzbF9jdHgKICAgICAvKgogICAgICAqIFNldCBhIFNTTF9DVFggY2FsbGJhY2sKICAgICAgKi8KLSAgICBkYXRhLT5zZXQuc3NsLmZzc2xjdHggPSB2YV9hcmcocGFyYW0sIGN1cmxfc3NsX2N0eF9jYWxsYmFjayk7Ci0jZWxzZQotICAgIHJlc3VsdCA9IENVUkxFX05PVF9CVUlMVF9JTjsKKyNpZmRlZiBVU0VfU1NMCisgICAgaWYoQ3VybF9zc2wtPmhhdmVfc3NsX2N0eCkKKyAgICAgIGRhdGEtPnNldC5zc2wuZnNzbGN0eCA9IHZhX2FyZyhwYXJhbSwgY3VybF9zc2xfY3R4X2NhbGxiYWNrKTsKKyAgICBlbHNlCiAjZW5kaWYKKyAgICAgIHJlc3VsdCA9IENVUkxFX05PVF9CVUlMVF9JTjsKICAgICBicmVhazsKICAgY2FzZSBDVVJMT1BUX1NTTF9DVFhfREFUQToKLSNpZmRlZiBoYXZlX2N1cmxzc2xfc3NsX2N0eAogICAgIC8qCiAgICAgICogU2V0IGEgU1NMX0NUWCBjYWxsYmFjayBwYXJhbWV0ZXIgcG9pbnRlcgogICAgICAqLwotICAgIGRhdGEtPnNldC5zc2wuZnNzbGN0eHAgPSB2YV9hcmcocGFyYW0sIHZvaWQgKik7Ci0jZWxzZQotICAgIHJlc3VsdCA9IENVUkxFX05PVF9CVUlMVF9JTjsKKyNpZmRlZiBVU0VfU1NMCisgICAgaWYoQ3VybF9zc2wtPmhhdmVfc3NsX2N0eCkKKyAgICAgIGRhdGEtPnNldC5zc2wuZnNzbGN0eHAgPSB2YV9hcmcocGFyYW0sIHZvaWQgKik7CisgICAgZWxzZQogI2VuZGlmCisgICAgICByZXN1bHQgPSBDVVJMRV9OT1RfQlVJTFRfSU47CiAgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTE9QVF9TU0xfRkFMU0VTVEFSVDoKICAgICAvKgpAQCAtMjE5NywzNSArMjIzMiwzOCBAQAogICAgIGRhdGEtPnNldC5zc2wuZmFsc2VzdGFydCA9ICgwICE9IHZhX2FyZyhwYXJhbSwgbG9uZykpID8gVFJVRSA6IEZBTFNFOwogICAgIGJyZWFrOwogICBjYXNlIENVUkxPUFRfQ0VSVElORk86Ci0jaWZkZWYgaGF2ZV9jdXJsc3NsX2NlcnRpbmZvCi0gICAgZGF0YS0+c2V0LnNzbC5jZXJ0aW5mbyA9ICgwICE9IHZhX2FyZyhwYXJhbSwgbG9uZykpID8gVFJVRSA6IEZBTFNFOwotI2Vsc2UKLSAgICByZXN1bHQgPSBDVVJMRV9OT1RfQlVJTFRfSU47CisjaWZkZWYgVVNFX1NTTAorICAgIGlmKEN1cmxfc3NsLT5oYXZlX2NlcnRpbmZvKQorICAgICAgZGF0YS0+c2V0LnNzbC5jZXJ0aW5mbyA9ICgwICE9IHZhX2FyZyhwYXJhbSwgbG9uZykpID8gVFJVRSA6IEZBTFNFOworICAgIGVsc2UKICNlbmRpZgorICAgICAgcmVzdWx0ID0gQ1VSTEVfTk9UX0JVSUxUX0lOOwogICAgIGJyZWFrOwogICBjYXNlIENVUkxPUFRfUElOTkVEUFVCTElDS0VZOgotI2lmZGVmIGhhdmVfY3VybHNzbF9waW5uZWRwdWJrZXkgLyogb25seSBieSBzdXBwb3J0ZWQgYmFja2VuZHMgKi8KICAgICAvKgogICAgICAqIFNldCBwaW5uZWQgcHVibGljIGtleSBmb3IgU1NMIGNvbm5lY3Rpb24uCiAgICAgICogU3BlY2lmeSBmaWxlIG5hbWUgb2YgdGhlIHB1YmxpYyBrZXkgaW4gREVSIGZvcm1hdC4KICAgICAgKi8KLSAgICByZXN1bHQgPSBzZXRzdHJvcHQoJmRhdGEtPnNldC5zdHJbU1RSSU5HX1NTTF9QSU5ORURQVUJMSUNLRVlfT1JJR10sCi0gICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyhwYXJhbSwgY2hhciAqKSk7Ci0jZWxzZQotICAgIHJlc3VsdCA9IENVUkxFX05PVF9CVUlMVF9JTjsKKyNpZmRlZiBVU0VfU1NMCisgICAgaWYoQ3VybF9zc2wtPmhhdmVfcGlubmVkcHVia2V5KQorICAgICAgcmVzdWx0ID0gc2V0c3Ryb3B0KCZkYXRhLT5zZXQuc3RyW1NUUklOR19TU0xfUElOTkVEUFVCTElDS0VZX09SSUddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyhwYXJhbSwgY2hhciAqKSk7CisgICAgZWxzZQogI2VuZGlmCisgICAgICByZXN1bHQgPSBDVVJMRV9OT1RfQlVJTFRfSU47CiAgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTE9QVF9QUk9YWV9QSU5ORURQVUJMSUNLRVk6Ci0jaWZkZWYgaGF2ZV9jdXJsc3NsX3Bpbm5lZHB1YmtleSAvKiBvbmx5IGJ5IHN1cHBvcnRlZCBiYWNrZW5kcyAqLwogICAgIC8qCiAgICAgICogU2V0IHBpbm5lZCBwdWJsaWMga2V5IGZvciBTU0wgY29ubmVjdGlvbi4KICAgICAgKiBTcGVjaWZ5IGZpbGUgbmFtZSBvZiB0aGUgcHVibGljIGtleSBpbiBERVIgZm9ybWF0LgogICAgICAqLwotICAgIHJlc3VsdCA9IHNldHN0cm9wdCgmZGF0YS0+c2V0LnN0cltTVFJJTkdfU1NMX1BJTk5FRFBVQkxJQ0tFWV9QUk9YWV0sCi0gICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyhwYXJhbSwgY2hhciAqKSk7Ci0jZWxzZQotICAgIHJlc3VsdCA9IENVUkxFX05PVF9CVUlMVF9JTjsKKyNpZmRlZiBVU0VfU1NMCisgICAgaWYoQ3VybF9zc2wtPmhhdmVfcGlubmVkcHVia2V5KQorICAgICAgcmVzdWx0ID0gc2V0c3Ryb3B0KCZkYXRhLT5zZXQuc3RyW1NUUklOR19TU0xfUElOTkVEUFVCTElDS0VZX1BST1hZXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcocGFyYW0sIGNoYXIgKikpOworICAgIGVsc2UKICNlbmRpZgorICAgICAgcmVzdWx0ID0gQ1VSTEVfTk9UX0JVSUxUX0lOOwogICAgIGJyZWFrOwogICBjYXNlIENVUkxPUFRfQ0FJTkZPOgogICAgIC8qCkBAIC0yMjQzLDMwICsyMjgxLDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyhwYXJhbSwgY2hhciAqKSk7CiAgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTE9QVF9DQVBBVEg6Ci0jaWZkZWYgaGF2ZV9jdXJsc3NsX2NhX3BhdGggLyogbm90IHN1cHBvcnRlZCBieSBhbGwgYmFja2VuZHMgKi8KICAgICAvKgogICAgICAqIFNldCBDQSBwYXRoIGluZm8gZm9yIFNTTCBjb25uZWN0aW9uLiBTcGVjaWZ5IGRpcmVjdG9yeSBuYW1lIG9mIHRoZSBDQQogICAgICAqIGNlcnRpZmljYXRlcyB3aGljaCBoYXZlIGJlZW4gcHJlcGFyZWQgdXNpbmcgb3BlbnNzbCBjX3JlaGFzaCB1dGlsaXR5LgogICAgICAqLwotICAgIC8qIFRoaXMgZG9lcyBub3Qgd29yayBvbiB3aW5kb3dzLiAqLwotICAgIHJlc3VsdCA9IHNldHN0cm9wdCgmZGF0YS0+c2V0LnN0cltTVFJJTkdfU1NMX0NBUEFUSF9PUklHXSwKLSAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHBhcmFtLCBjaGFyICopKTsKLSNlbHNlCi0gICAgcmVzdWx0ID0gQ1VSTEVfTk9UX0JVSUxUX0lOOworI2lmZGVmIFVTRV9TU0wKKyAgICBpZihDdXJsX3NzbC0+aGF2ZV9jYV9wYXRoKQorICAgICAgLyogVGhpcyBkb2VzIG5vdCB3b3JrIG9uIHdpbmRvd3MuICovCisgICAgICByZXN1bHQgPSBzZXRzdHJvcHQoJmRhdGEtPnNldC5zdHJbU1RSSU5HX1NTTF9DQVBBVEhfT1JJR10sCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHBhcmFtLCBjaGFyICopKTsKKyAgICBlbHNlCiAjZW5kaWYKKyAgICAgIHJlc3VsdCA9IENVUkxFX05PVF9CVUlMVF9JTjsKICAgICBicmVhazsKICAgY2FzZSBDVVJMT1BUX1BST1hZX0NBUEFUSDoKLSNpZmRlZiBoYXZlX2N1cmxzc2xfY2FfcGF0aCAvKiBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBiYWNrZW5kcyAqLwogICAgIC8qCiAgICAgICogU2V0IENBIHBhdGggaW5mbyBmb3IgU1NMIGNvbm5lY3Rpb24gcHJveHkuIFNwZWNpZnkgZGlyZWN0b3J5IG5hbWUgb2YgdGhlCiAgICAgICogQ0EgY2VydGlmaWNhdGVzIHdoaWNoIGhhdmUgYmVlbiBwcmVwYXJlZCB1c2luZyBvcGVuc3NsIGNfcmVoYXNoIHV0aWxpdHkuCiAgICAgICovCi0gICAgLyogVGhpcyBkb2VzIG5vdCB3b3JrIG9uIHdpbmRvd3MuICovCi0gICAgcmVzdWx0ID0gc2V0c3Ryb3B0KCZkYXRhLT5zZXQuc3RyW1NUUklOR19TU0xfQ0FQQVRIX1BST1hZXSwKLSAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHBhcmFtLCBjaGFyICopKTsKLSNlbHNlCi0gICAgcmVzdWx0ID0gQ1VSTEVfTk9UX0JVSUxUX0lOOworI2lmZGVmIFVTRV9TU0wKKyAgICBpZihDdXJsX3NzbC0+aGF2ZV9jYV9wYXRoKQorICAgICAgLyogVGhpcyBkb2VzIG5vdCB3b3JrIG9uIHdpbmRvd3MuICovCisgICAgICByZXN1bHQgPSBzZXRzdHJvcHQoJmRhdGEtPnNldC5zdHJbU1RSSU5HX1NTTF9DQVBBVEhfUFJPWFldLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyhwYXJhbSwgY2hhciAqKSk7CisgICAgZWxzZQogI2VuZGlmCisgICAgICByZXN1bHQgPSBDVVJMRV9OT1RfQlVJTFRfSU47CiAgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTE9QVF9DUkxGSUxFOgogICAgIC8qCkBAIC0yODk3LDcgKzI5MzcsNyBAQAogICAgIHJldHVybiBDVVJMRV9OT1RfQlVJTFRfSU47CiAjZWxzZQogICAgIGFyZyA9IHZhX2FyZyhwYXJhbSwgbG9uZyk7Ci0gICAgaWYoKGFyZz49MSkgJiYgKGFyZyA8PSAyNTYpKQorICAgIGlmKChhcmcgPj0gMSkgJiYgKGFyZyA8PSAyNTYpKQogICAgICAgZGF0YS0+c2V0LnN0cmVhbV93ZWlnaHQgPSAoaW50KWFyZzsKICAgICBicmVhazsKICNlbmRpZgpAQCAtMjkyMyw2ICsyOTYzLDkgQEAKICAgY2FzZSBDVVJMT1BUX1NVUFBSRVNTX0NPTk5FQ1RfSEVBREVSUzoKICAgICBkYXRhLT5zZXQuc3VwcHJlc3NfY29ubmVjdF9oZWFkZXJzID0gKDAgIT0gdmFfYXJnKHBhcmFtLCBsb25nKSk/VFJVRTpGQUxTRTsKICAgICBicmVhazsKKyAgY2FzZSBDVVJMT1BUX1NTSF9DT01QUkVTU0lPTjoKKyAgICBkYXRhLT5zZXQuc3NoX2NvbXByZXNzaW9uID0gKDAgIT0gdmFfYXJnKHBhcmFtLCBsb25nKSk/VFJVRTpGQUxTRTsKKyAgICBicmVhazsKICAgZGVmYXVsdDoKICAgICAvKiB1bmtub3duIHRhZyBhbmQgaXRzIGNvbXBhbmlvbiwganVzdCBpZ25vcmU6ICovCiAgICAgcmVzdWx0ID0gQ1VSTEVfVU5LTk9XTl9PUFRJT047CkBAIC0zMDIzLDcgKzMwNjYsNyBAQAogICBDdXJsX3NhZmVmcmVlKGNvbm4tPmh0dHBfcHJveHkuaG9zdC5yYXdhbGxvYyk7IC8qIGh0dHAgcHJveHkgbmFtZSBidWZmZXIgKi8KICAgQ3VybF9zYWZlZnJlZShjb25uLT5zb2Nrc19wcm94eS5ob3N0LnJhd2FsbG9jKTsgLyogc29ja3MgcHJveHkgbmFtZSBidWZmZXIgKi8KICAgQ3VybF9zYWZlZnJlZShjb25uLT5tYXN0ZXJfYnVmZmVyKTsKLSAgQ3VybF9zYWZlZnJlZShjb25uLT5jb25uZWN0X2J1ZmZlcik7CisgIEN1cmxfc2FmZWZyZWUoY29ubi0+Y29ubmVjdF9zdGF0ZSk7CiAKICAgY29ubl9yZXNldF9hbGxfcG9zdHBvbmVkX2RhdGEoY29ubik7CiAKQEAgLTMyNjAsOSArMzMwMyw5IEBACiAgIHN0cnVjdCBjdXJsX2hhc2hfaXRlcmF0b3IgaXRlcjsKICAgc3RydWN0IGN1cmxfbGxpc3RfZWxlbWVudCAqY3VycjsKICAgc3RydWN0IGN1cmxfaGFzaF9lbGVtZW50ICpoZTsKLSAgdGltZV90IGhpZ2hzY29yZT0tMTsKKyAgdGltZV90IGhpZ2hzY29yZSA9LSAxOwogICB0aW1lX3Qgc2NvcmU7Ci0gIHN0cnVjdCB0aW1ldmFsIG5vdzsKKyAgc3RydWN0IGN1cmx0aW1lIG5vdzsKICAgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uX2NhbmRpZGF0ZSA9IE5VTEw7CiAgIHN0cnVjdCBjb25uZWN0YnVuZGxlICpidW5kbGU7CiAKQEAgLTMzMjMsOSArMzM2Niw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb25uZWN0YnVuZGxlICpidW5kbGUpCiB7CiAgIHN0cnVjdCBjdXJsX2xsaXN0X2VsZW1lbnQgKmN1cnI7Ci0gIHRpbWVfdCBoaWdoc2NvcmU9LTE7CisgIHRpbWVfdCBoaWdoc2NvcmUgPSAtMTsKICAgdGltZV90IHNjb3JlOwotICBzdHJ1Y3QgdGltZXZhbCBub3c7CisgIHN0cnVjdCBjdXJsdGltZSBub3c7CiAgIHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubl9jYW5kaWRhdGUgPSBOVUxMOwogICBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm47CiAKQEAgLTMzNjcsMTEgKzM0MTAsMTkgQEAKICAgICAgICBoYW5kbGVzIGluIHBpcGVsaW5lIGFuZCB0aGUgY29ubmVjdGlvbiBpc24ndCBhbHJlYWR5IG1hcmtlZCBpbgogICAgICAgIHVzZSAqLwogICAgIGJvb2wgZGVhZDsKLSAgICBpZihjb25uLT5oYW5kbGVyLT5wcm90b2NvbCAmIENVUkxQUk9UT19SVFNQKQotICAgICAgLyogUlRTUCBpcyBhIHNwZWNpYWwgY2FzZSBkdWUgdG8gUlRQIGludGVybGVhdmluZyAqLwotICAgICAgZGVhZCA9IEN1cmxfcnRzcF9jb25uaXNkZWFkKGNvbm4pOwotICAgIGVsc2UKKworICAgIGlmKGNvbm4tPmhhbmRsZXItPmNvbm5lY3Rpb25fY2hlY2spIHsKKyAgICAgIC8qIFRoZSBwcm90b2NvbCBoYXMgYSBzcGVjaWFsIG1ldGhvZCBmb3IgY2hlY2tpbmcgdGhlIHN0YXRlIG9mIHRoZQorICAgICAgICAgY29ubmVjdGlvbi4gVXNlIGl0IHRvIGNoZWNrIGlmIHRoZSBjb25uZWN0aW9uIGlzIGRlYWQuICovCisgICAgICB1bnNpZ25lZCBpbnQgc3RhdGU7CisKKyAgICAgIHN0YXRlID0gY29ubi0+aGFuZGxlci0+Y29ubmVjdGlvbl9jaGVjayhjb25uLCBDT05OQ0hFQ0tfSVNERUFEKTsKKyAgICAgIGRlYWQgPSAoc3RhdGUgJiBDT05OUkVTVUxUX0RFQUQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8qIFVzZSB0aGUgZ2VuZXJhbCBtZXRob2QgZm9yIGRldGVybWluaW5nIHRoZSBkZWF0aCBvZiBhIGNvbm5lY3Rpb24gKi8KICAgICAgIGRlYWQgPSBTb2NrZXRJc0RlYWQoY29ubi0+c29ja1tGSVJTVFNPQ0tFVF0pOworICAgIH0KIAogICAgIGlmKGRlYWQpIHsKICAgICAgIGNvbm4tPmRhdGEgPSBkYXRhOwpAQCAtMzQwNSw3ICszNDU2LDcgQEAKICAqLwogc3RhdGljIHZvaWQgcHJ1bmVfZGVhZF9jb25uZWN0aW9ucyhzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQogewotICBzdHJ1Y3QgdGltZXZhbCBub3cgPSBDdXJsX3R2bm93KCk7CisgIHN0cnVjdCBjdXJsdGltZSBub3cgPSBDdXJsX3R2bm93KCk7CiAgIHRpbWVfdCBlbGFwc2VkID0gQ3VybF90dmRpZmYobm93LCBkYXRhLT5zdGF0ZS5jb25uX2NhY2hlLT5sYXN0X2NsZWFudXApOwogCiAgIGlmKGVsYXBzZWQgPj0gMTAwMEwpIHsKQEAgLTM5NDYsNyArMzk5Nyw3IEBACiBDVVJMY29kZSBDdXJsX3Byb3RvY29sX2Nvbm5lY3Rpbmcoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmRvbmUpCiB7Ci0gIENVUkxjb2RlIHJlc3VsdD1DVVJMRV9PSzsKKyAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7CiAKICAgaWYoY29ubiAmJiBjb25uLT5oYW5kbGVyLT5jb25uZWN0aW5nKSB7CiAgICAgKmRvbmUgPSBGQUxTRTsKQEAgLTM5NjUsNyArNDAxNiw3IEBACiAKIENVUkxjb2RlIEN1cmxfcHJvdG9jb2xfZG9pbmcoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBib29sICpkb25lKQogewotICBDVVJMY29kZSByZXN1bHQ9Q1VSTEVfT0s7CisgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOwogCiAgIGlmKGNvbm4gJiYgY29ubi0+aGFuZGxlci0+ZG9pbmcpIHsKICAgICAqZG9uZSA9IEZBTFNFOwpAQCAtMzk4NSw3ICs0MDM2LDcgQEAKIENVUkxjb2RlIEN1cmxfcHJvdG9jb2xfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqcHJvdG9jb2xfZG9uZSkKIHsKLSAgQ1VSTGNvZGUgcmVzdWx0PUNVUkxFX09LOworICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKIAogICAqcHJvdG9jb2xfZG9uZSA9IEZBTFNFOwogCkBAIC00MDEzLDcgKzQwNjQsNyBAQAogICAgICAgcmV0dXJuIENVUkxFX09LOwogCiAgICAgaWYoY29ubi0+Yml0cy50dW5uZWxfcHJveHkgJiYgY29ubi0+Yml0cy5odHRwcHJveHkgJiYKLSAgICAgICAoY29ubi0+dHVubmVsX3N0YXRlW0ZJUlNUU09DS0VUXSAhPSBUVU5ORUxfQ09NUExFVEUpKQorICAgICAgIEN1cmxfY29ubmVjdF9vbmdvaW5nKGNvbm4pKQogICAgICAgLyogd2hlbiB1c2luZyBhbiBIVFRQIHR1bm5lbCBwcm94eSwgYXdhaXQgY29tcGxldGUgdHVubmVsIGVzdGFibGlzaG1lbnQKICAgICAgICAgIGJlZm9yZSBwcm9jZWVkaW5nIGZ1cnRoZXIuIFJldHVybiBDVVJMRV9PSyBzbyB3ZSdsbCBiZSBjYWxsZWQgYWdhaW4gKi8KICAgICAgIHJldHVybiBDVVJMRV9PSzsKQEAgLTQwNzIsNyArNDEyMyw3IEBACiAgIGlmKGxlbiAmJiAoaG9zdC0+bmFtZVtsZW4tMV0gPT0gJy4nKSkKICAgICAvKiBzdHJpcCBvZmYgYSBzaW5nbGUgdHJhaWxpbmcgZG90IGlmIHByZXNlbnQsIHByaW1hcmlseSBmb3IgU05JIGJ1dAogICAgICAgIHRoZXJlJ3Mgbm8gdXNlIGZvciBpdCAqLwotICAgIGhvc3QtPm5hbWVbbGVuLTFdPTA7CisgICAgaG9zdC0+bmFtZVtsZW4tMV0gPSAwOwogCiAgIC8qIENoZWNrIG5hbWUgZm9yIG5vbi1BU0NJSSBhbmQgY29udmVydCBob3N0bmFtZSB0byBBQ0UgZm9ybSBpZiB3ZSBjYW4gKi8KICAgaWYoIWlzX0FTQ0lJX25hbWUoaG9zdC0+bmFtZSkpIHsKQEAgLTQxMjUsNyArNDE3Niw3IEBACiAgICAgaG9zdC0+ZW5jYWxsb2MgPSBOVUxMOwogICB9CiAjZWxpZiBkZWZpbmVkKFVTRV9XSU4zMl9JRE4pCi0gIGZyZWUoaG9zdC0+ZW5jYWxsb2MpOyAvKiBtdXN0IGJlIGZyZWVkIHdpdGhpZG5fZnJlZSgpIHNpbmNlIHRoaXMgd2FzCisgIGZyZWUoaG9zdC0+ZW5jYWxsb2MpOyAvKiBtdXN0IGJlIGZyZWVkIHdpdGggZnJlZSgpIHNpbmNlIHRoaXMgd2FzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYnkgY3VybF93aW4zMl9pZG5fdG9fYXNjaWkgKi8KICAgaG9zdC0+ZW5jYWxsb2MgPSBOVUxMOwogI2Vsc2UKQEAgLTQxNDUsNyArNDE5NiwxMiBAQAogICovCiBzdGF0aWMgc3RydWN0IGNvbm5lY3RkYXRhICphbGxvY2F0ZV9jb25uKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCiB7Ci0gIHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGNvbm5lY3RkYXRhKSk7CisjaWZkZWYgVVNFX1NTTAorI2RlZmluZSBTU0xfRVhUUkEgKyA0ICogQ3VybF9zc2wtPnNpemVvZl9zc2xfYmFja2VuZF9kYXRhIC0gc2l6ZW9mKGxvbmcgbG9uZykKKyNlbHNlCisjZGVmaW5lIFNTTF9FWFRSQSAwCisjZW5kaWYKKyAgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgY29ubmVjdGRhdGEpICsgU1NMX0VYVFJBKTsKICAgaWYoIWNvbm4pCiAgICAgcmV0dXJuIE5VTEw7CiAKQEAgLTQyMjgsNiArNDI4NCwyMyBAQAogCiAgIGNvbm4tPmlwX3ZlcnNpb24gPSBkYXRhLT5zZXQuaXB2ZXI7CiAKKyNpZmRlZiBVU0VfU1NMCisgIC8qCisgICAqIFRvIHNhdmUgb24gbWFsbG9jKClzLCB0aGUgU1NMIGJhY2tlbmQtc3BlY2lmaWMgZGF0YSBoYXMgYmVlbiBhbGxvY2F0ZWQKKyAgICogYXQgdGhlIGVuZCBvZiB0aGUgY29ubmVjdGRhdGEgc3RydWN0LgorICAgKi8KKyAgeworICAgIGNoYXIgKnAgPSAoY2hhciAqKSZjb25uLT5hbGlnbl9kYXRhX19kb19ub3RfdXNlOworICAgIGNvbm4tPnNzbFswXS5iYWNrZW5kID0gKHN0cnVjdCBzc2xfYmFja2VuZF9kYXRhICopcDsKKyAgICBjb25uLT5zc2xbMV0uYmFja2VuZCA9CisgICAgICAoc3RydWN0IHNzbF9iYWNrZW5kX2RhdGEgKikocCArIEN1cmxfc3NsLT5zaXplb2Zfc3NsX2JhY2tlbmRfZGF0YSk7CisgICAgY29ubi0+cHJveHlfc3NsWzBdLmJhY2tlbmQgPQorICAgICAgKHN0cnVjdCBzc2xfYmFja2VuZF9kYXRhICopKHAgKyBDdXJsX3NzbC0+c2l6ZW9mX3NzbF9iYWNrZW5kX2RhdGEgKiAyKTsKKyAgICBjb25uLT5wcm94eV9zc2xbMV0uYmFja2VuZCA9CisgICAgICAoc3RydWN0IHNzbF9iYWNrZW5kX2RhdGEgKikocCArIEN1cmxfc3NsLT5zaXplb2Zfc3NsX2JhY2tlbmRfZGF0YSAqIDMpOworICB9CisjZW5kaWYKKwogI2lmICFkZWZpbmVkKENVUkxfRElTQUJMRV9IVFRQKSAmJiBkZWZpbmVkKFVTRV9OVExNKSAmJiBcCiAgICAgZGVmaW5lZChOVExNX1dCX0VOQUJMRUQpCiAgIGNvbm4tPm50bG1fYXV0aF9obHByX3NvY2tldCA9IENVUkxfU09DS0VUX0JBRDsKQEAgLTQzNjMsMTEgKzQ0MzYsMTYgQEAKICAgICByZXR1cm4gQ1VSTEVfVVJMX01BTEZPUk1BVDsKICAgfQogCi0gIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBtaXN0YWtlIGEgZHJpdmUgbGV0dGVyIGZvciBhIHNjaGVtZSwgZm9yIGV4YW1wbGU6CisgIC8qIE1TRE9TL1dpbmRvd3Mgc3R5bGUgZHJpdmUgcHJlZml4LCBlZyBjOiBpbiBjOmZvbyAqLworI2RlZmluZSBTVEFSVFNfV0lUSF9EUklWRV9QUkVGSVgoc3RyKSBcCisgICgoKCdhJyA8PSBzdHJbMF0gJiYgc3RyWzBdIDw9ICd6JykgfHwgXAorICAgICgnQScgPD0gc3RyWzBdICYmIHN0clswXSA8PSAnWicpKSAmJiBcCisgICAoc3RyWzFdID09ICc6JykpCisKKyAgLyogRG9uJ3QgbWlzdGFrZSBhIGRyaXZlIGxldHRlciBmb3IgYSBzY2hlbWUgaWYgdGhlIGRlZmF1bHQgcHJvdG9jb2wgaXMgZmlsZS4KICAgICAgY3VybGQgLS1wcm90by1kZWZhdWx0IGZpbGUgYzovZm9vL2Jhci50eHQgKi8KLSAgaWYoKCgnYScgPD0gZGF0YS0+Y2hhbmdlLnVybFswXSAmJiBkYXRhLT5jaGFuZ2UudXJsWzBdIDw9ICd6JykgfHwKLSAgICAgICgnQScgPD0gZGF0YS0+Y2hhbmdlLnVybFswXSAmJiBkYXRhLT5jaGFuZ2UudXJsWzBdIDw9ICdaJykpICYmCi0gICAgIGRhdGEtPmNoYW5nZS51cmxbMV0gPT0gJzonICYmIGRhdGEtPnNldC5zdHJbU1RSSU5HX0RFRkFVTFRfUFJPVE9DT0xdICYmCisgIGlmKFNUQVJUU19XSVRIX0RSSVZFX1BSRUZJWChkYXRhLT5jaGFuZ2UudXJsKSAmJgorICAgICBkYXRhLT5zZXQuc3RyW1NUUklOR19ERUZBVUxUX1BST1RPQ09MXSAmJgogICAgICBzdHJjYXNlY29tcGFyZShkYXRhLT5zZXQuc3RyW1NUUklOR19ERUZBVUxUX1BST1RPQ09MXSwgImZpbGUiKSkgewogICAgIDsgLyogZG8gbm90aGluZyAqLwogICB9CkBAIC00Mzg2LDggKzQ0NjQsNiBAQAogICBpZigodXJsX2hhc19zY2hlbWUgJiYgc3RybmNhc2Vjb21wYXJlKGRhdGEtPmNoYW5nZS51cmwsICJmaWxlOiIsIDUpKSB8fAogICAgICAoIXVybF9oYXNfc2NoZW1lICYmIGRhdGEtPnNldC5zdHJbU1RSSU5HX0RFRkFVTFRfUFJPVE9DT0xdICYmCiAgICAgICBzdHJjYXNlY29tcGFyZShkYXRhLT5zZXQuc3RyW1NUUklOR19ERUZBVUxUX1BST1RPQ09MXSwgImZpbGUiKSkpIHsKLSAgICBib29sIHBhdGhfaGFzX2RyaXZlID0gRkFMU0U7Ci0KICAgICBpZih1cmxfaGFzX3NjaGVtZSkKICAgICAgIHJjID0gc3NjYW5mKGRhdGEtPmNoYW5nZS51cmwsICIlKjE1W15cbi86XTolW15cbl0iLCBwYXRoKTsKICAgICBlbHNlCkBAIC00NDA2LDIwICs0NDgyLDE1IEBACiAKICAgICAgIC8qIFRoaXMgY2Fubm90IGJlIGRvbmUgd2l0aCBzdHJjcHkoKSBpbiBhIHBvcnRhYmxlIG1hbm5lciwgc2luY2UgdGhlCiAgICAgICAgICBtZW1vcnkgYXJlYXMgb3ZlcmxhcCEgKi8KLSAgICAgIG1lbW1vdmUocGF0aCwgcGF0aCArIDIsIHN0cmxlbihwYXRoICsgMikrMSk7CisgICAgICBtZW1tb3ZlKHBhdGgsIHBhdGggKyAyLCBzdHJsZW4ocGF0aCArIDIpICsgMSk7CiAgICAgfQogCi0gICAgLyogdGhlIHBhdGggbWF5IHN0YXJ0IHdpdGggYSBkcml2ZSBsZXR0ZXIuIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQotICAgICAgIHdlIHNraXAgc29tZSBwcm9jZXNzaW5nIG9uIHRob3NlIHBhdGhzLiAqLwotICAgIHBhdGhfaGFzX2RyaXZlID0gKCgnYScgPD0gcGF0aFswXSAmJiBwYXRoWzBdIDw9ICd6JykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAoJ0EnIDw9IHBhdGhbMF0gJiYgcGF0aFswXSA8PSAnWicpKSAmJiBwYXRoWzFdID09ICc6JzsKLQogICAgIC8qCiAgICAgICogd2UgZGVhbCB3aXRoIGZpbGU6Ly88aG9zdD4vPHBhdGg+IGRpZmZlcmVudGx5IHNpbmNlIGl0IHN1cHBvcnRzIG5vCiAgICAgICogaG9zdG5hbWUgb3RoZXIgdGhhbiAibG9jYWxob3N0IiBhbmQgIjEyNy4wLjAuMSIsIHdoaWNoIGlzIHVuaXF1ZSBhbW9uZwogICAgICAqIHRoZSBVUkwgcHJvdG9jb2xzIHNwZWNpZmllZCBpbiBSRkMgMTczOAogICAgICAqLwotICAgIGlmKHBhdGhbMF0gIT0gJy8nICYmICFwYXRoX2hhc19kcml2ZSkgeworICAgIGlmKHBhdGhbMF0gIT0gJy8nICYmICFTVEFSVFNfV0lUSF9EUklWRV9QUkVGSVgocGF0aCkpIHsKICAgICAgIC8qIHRoZSBVUkwgaW5jbHVkZXMgYSBob3N0IG5hbWUsIGl0IG11c3QgbWF0Y2ggImxvY2FsaG9zdCIgb3IKICAgICAgICAgICIxMjcuMC4wLjEiIHRvIGJlIHZhbGlkICovCiAgICAgICBjaGFyICpwdHI7CkBAIC00NDUyLDE0ICs0NTIzLDExIEBACiAgICAgICAgIHB0cisrOwogCiAgICAgICAvKiBUaGlzIGNhbm5vdCBiZSBtYWRlIHdpdGggc3RyY3B5LCBhcyB0aGUgbWVtb3J5IGNodW5rcyBvdmVybGFwISAqLwotICAgICAgbWVtbW92ZShwYXRoLCBwdHIsIHN0cmxlbihwdHIpKzEpOwotCi0gICAgICBwYXRoX2hhc19kcml2ZSA9ICgoJ2EnIDw9IHBhdGhbMF0gJiYgcGF0aFswXSA8PSAneicpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoJ0EnIDw9IHBhdGhbMF0gJiYgcGF0aFswXSA8PSAnWicpKSAmJiBwYXRoWzFdID09ICc6JzsKKyAgICAgIG1lbW1vdmUocGF0aCwgcHRyLCBzdHJsZW4ocHRyKSArIDEpOwogICAgIH0KIAogI2lmICFkZWZpbmVkKE1TRE9TKSAmJiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLSAgICBpZihwYXRoX2hhc19kcml2ZSkgeworICAgIGlmKFNUQVJUU19XSVRIX0RSSVZFX1BSRUZJWChwYXRoKSkgewogICAgICAgZmFpbGYoZGF0YSwgIkZpbGUgZHJpdmUgbGV0dGVycyBhcmUgb25seSBhY2NlcHRlZCBpbiBNU0RPUy9XaW5kb3dzLiIpOwogICAgICAgcmV0dXJuIENVUkxFX1VSTF9NQUxGT1JNQVQ7CiAgICAgfQpAQCAtNDQ3MSw3ICs0NTM5LDcgQEAKICAgZWxzZSB7CiAgICAgLyogY2xlYXIgcGF0aCAqLwogICAgIGNoYXIgc2xhc2hidWZbNF07Ci0gICAgcGF0aFswXT0wOworICAgIHBhdGhbMF0gPSAwOwogCiAgICAgcmMgPSBzc2NhbmYoZGF0YS0+Y2hhbmdlLnVybCwKICAgICAgICAgICAgICAgICAiJTE1W15cbi86XTolM1svXSVbXlxuLz8jXSVbXlxuXSIsCkBAIC00NTU2LDcgKzQ2MjQsNyBAQAogICAgKi8KICAgYXQgPSBzdHJjaHIoY29ubi0+aG9zdC5uYW1lLCAnQCcpOwogICBpZihhdCkKLSAgICBxdWVyeSA9IHN0cmNocihhdCsxLCAnPycpOworICAgIHF1ZXJ5ID0gc3RyY2hyKGF0ICsgMSwgJz8nKTsKICAgZWxzZQogICAgIHF1ZXJ5ID0gc3RyY2hyKGNvbm4tPmhvc3QubmFtZSwgJz8nKTsKIApAQCAtNDU3NCwxNSArNDY0MiwxNSBAQAogCiAgICAgLyogbW92ZSB0aGUgZXhpc3RpbmcgcGF0aCBwbHVzIHRoZSB6ZXJvIGJ5dGUgZm9yd2FyZCwgdG8gbWFrZSByb29tIGZvcgogICAgICAgIHRoZSBob3N0LW5hbWUgcGFydCAqLwotICAgIG1lbW1vdmUocGF0aCtob3N0bGVuKzEsIHBhdGgsIHBhdGhsZW4rMSk7CisgICAgbWVtbW92ZShwYXRoICsgaG9zdGxlbiArIDEsIHBhdGgsIHBhdGhsZW4gKyAxKTsKIAogICAgICAvKiBub3cgY29weSB0aGUgdHJhaWxpbmcgaG9zdCBwYXJ0IGluIGZyb250IG9mIHRoZSBleGlzdGluZyBwYXRoICovCi0gICAgbWVtY3B5KHBhdGgrMSwgcXVlcnksIGhvc3RsZW4pOworICAgIG1lbWNweShwYXRoICsgMSwgcXVlcnksIGhvc3RsZW4pOwogCiAgICAgcGF0aFswXT0nLyc7IC8qIHByZXBlbmQgdGhlIG1pc3Npbmcgc2xhc2ggKi8KICAgICByZWJ1aWxkX3VybCA9IFRSVUU7CiAKLSAgICAqcXVlcnk9MDsgLyogbm93IGN1dCBvZmYgdGhlIGhvc3RuYW1lIGF0IHRoZSA/ICovCisgICAgKnF1ZXJ5ID0gMDsgLyogbm93IGN1dCBvZmYgdGhlIGhvc3RuYW1lIGF0IHRoZSA/ICovCiAgIH0KICAgZWxzZSBpZighcGF0aFswXSkgewogICAgIC8qIGlmIHRoZXJlJ3Mgbm8gcGF0aCBzZXQsIHVzZSBhIHNpbmdsZSBzbGFzaCAqLwpAQCAtNDU5OCw3ICs0NjY2LDcgQEAKICAgICAvKiBXZSBuZWVkIHRoaXMgZnVuY3Rpb24gdG8gZGVhbCB3aXRoIG92ZXJsYXBwaW5nIG1lbW9yeSBhcmVhcy4gV2Uga25vdwogICAgICAgIHRoYXQgdGhlIG1lbW9yeSBhcmVhICdwYXRoJyBwb2ludHMgdG8gaXMgJ3VybGxlbicgYnl0ZXMgYmlnIGFuZCB0aGF0CiAgICAgICAgaXMgYmlnZ2VyIHRoYW4gdGhlIHBhdGguIFVzZSArMSB0byBtb3ZlIHRoZSB6ZXJvIGJ5dGUgdG9vLiAqLwotICAgIG1lbW1vdmUoJnBhdGhbMV0sIHBhdGgsIHN0cmxlbihwYXRoKSsxKTsKKyAgICBtZW1tb3ZlKCZwYXRoWzFdLCBwYXRoLCBzdHJsZW4ocGF0aCkgKyAxKTsKICAgICBwYXRoWzBdID0gJy8nOwogICAgIHJlYnVpbGRfdXJsID0gVFJVRTsKICAgfQpAQCAtNDcwNCw3ICs0NzcyLDcgQEAKICAgICAgIGlmKCplbmRwID09ICddJykgewogICAgICAgICAvKiBUaGUgYWRkcmVzcyBzY29wZSB3YXMgd2VsbCBmb3JtZWQuICBLbm9jayBpdCBvdXQgb2YgdGhlCiAgICAgICAgICAgIGhvc3RuYW1lLiAqLwotICAgICAgICBtZW1tb3ZlKHBlcmNlbnQsIGVuZHAsIHN0cmxlbihlbmRwKSsxKTsKKyAgICAgICAgbWVtbW92ZShwZXJjZW50LCBlbmRwLCBzdHJsZW4oZW5kcCkgKyAxKTsKICAgICAgICAgY29ubi0+c2NvcGVfaWQgPSAodW5zaWduZWQgaW50KXNjb3BlOwogICAgICAgfQogICAgICAgZWxzZSB7CkBAIC00OTc0LDcgKzUwNDIsNyBAQAogICBzdHJjcHkoZW52cCwgIl9wcm94eSIpOwogCiAgIC8qIHJlYWQgdGhlIHByb3RvY29sIHByb3h5OiAqLwotICBwcm94PWN1cmxfZ2V0ZW52KHByb3h5X2Vudik7CisgIHByb3ggPSBjdXJsX2dldGVudihwcm94eV9lbnYpOwogCiAgIC8qCiAgICAqIFdlIGRvbid0IHRyeSB0aGUgdXBwZXJjYXNlIHZlcnNpb24gb2YgSFRUUF9QUk9YWSBiZWNhdXNlIG9mCkBAIC00OTkxLDcgKzUwNTksNyBAQAogICBpZighcHJveCAmJiAhc3RyY2FzZWNvbXBhcmUoImh0dHBfcHJveHkiLCBwcm94eV9lbnYpKSB7CiAgICAgLyogVGhlcmUgd2FzIG5vIGxvd2VyY2FzZSB2YXJpYWJsZSwgdHJ5IHRoZSB1cHBlcmNhc2UgdmVyc2lvbjogKi8KICAgICBDdXJsX3N0cm50b3VwcGVyKHByb3h5X2VudiwgcHJveHlfZW52LCBzaXplb2YocHJveHlfZW52KSk7Ci0gICAgcHJveD1jdXJsX2dldGVudihwcm94eV9lbnYpOworICAgIHByb3ggPSBjdXJsX2dldGVudihwcm94eV9lbnYpOwogICB9CiAKICAgaWYocHJveCkKQEAgLTQ5OTksNyArNTA2Nyw3IEBACiAgIGVsc2UgewogICAgIHByb3h5ID0gY3VybF9nZXRlbnYoImFsbF9wcm94eSIpOyAvKiBkZWZhdWx0IHByb3h5IHRvIHVzZSAqLwogICAgIGlmKCFwcm94eSkKLSAgICAgIHByb3h5PWN1cmxfZ2V0ZW52KCJBTExfUFJPWFkiKTsKKyAgICAgIHByb3h5ID0gY3VybF9nZXRlbnYoIkFMTF9QUk9YWSIpOwogICB9CiAKICAgcmV0dXJuIHByb3h5OwpAQCAtNTAzNCw3ICs1MTAyLDcgQEAKICAgLyogUGFyc2UgdGhlIHByb3RvY29sIHBhcnQgaWYgcHJlc2VudCAqLwogICBlbmRvZnByb3QgPSBzdHJzdHIocHJveHksICI6Ly8iKTsKICAgaWYoZW5kb2Zwcm90KSB7Ci0gICAgcHJveHlwdHIgPSBlbmRvZnByb3QrMzsKKyAgICBwcm94eXB0ciA9IGVuZG9mcHJvdCArIDM7CiAgICAgaWYoY2hlY2twcmVmaXgoImh0dHBzIiwgcHJveHkpKQogICAgICAgcHJveHl0eXBlID0gQ1VSTFBST1hZX0hUVFBTOwogICAgIGVsc2UgaWYoY2hlY2twcmVmaXgoInNvY2tzNWgiLCBwcm94eSkpCkBAIC01MDU2LDEzICs1MTI0LDE0IEBACiAgIGVsc2UKICAgICBwcm94eXB0ciA9IHByb3h5OyAvKiBObyB4eHg6Ly8gaGVhZDogSXQncyBhIEhUVFAgcHJveHkgKi8KIAotI2lmbmRlZiBIVFRQU19QUk9YWV9TVVBQT1JUCi0gIGlmKHByb3h5dHlwZSA9PSBDVVJMUFJPWFlfSFRUUFMpIHsKLSAgICBmYWlsZihkYXRhLCAiVW5zdXBwb3J0ZWQgcHJveHkgXCclc1wnIgotICAgICAgICAgICAgICAgICIsIGxpYmN1cmwgaXMgYnVpbHQgd2l0aG91dCB0aGUgSFRUUFMtcHJveHkgc3VwcG9ydC4iLCBwcm94eSk7Ci0gICAgcmV0dXJuIENVUkxFX05PVF9CVUlMVF9JTjsKLSAgfQorI2lmZGVmIFVTRV9TU0wKKyAgaWYoIUN1cmxfc3NsLT5zdXBwb3J0X2h0dHBzX3Byb3h5KQogI2VuZGlmCisgICAgaWYocHJveHl0eXBlID09IENVUkxQUk9YWV9IVFRQUykgeworICAgICAgZmFpbGYoZGF0YSwgIlVuc3VwcG9ydGVkIHByb3h5IFwnJXNcJywgbGliY3VybCBpcyBidWlsdCB3aXRob3V0IHRoZSAiCisgICAgICAgICAgICAgICAgICAiSFRUUFMtcHJveHkgc3VwcG9ydC4iLCBwcm94eSk7CisgICAgICByZXR1cm4gQ1VSTEVfTk9UX0JVSUxUX0lOOworICAgIH0KIAogICBzb2Nrc3R5cGUgPSBwcm94eXR5cGUgPT0gQ1VSTFBST1hZX1NPQ0tTNV9IT1NUTkFNRSB8fAogICAgICAgICAgICAgICBwcm94eXR5cGUgPT0gQ1VSTFBST1hZX1NPQ0tTNSB8fApAQCAtNTEzMywxMSArNTIwMiwxNCBAQAogICAgICAgY29ubi0+cG9ydCA9IHBvcnQ7CiAgIH0KICAgZWxzZSB7Ci0gICAgaWYocHJveHlwdHJbMF09PScvJykKKyAgICBpZihwcm94eXB0clswXT09Jy8nKSB7CiAgICAgICAvKiBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBwcm94eSBzdHJpbmcgaXMgYSBzbGFzaCwgZmFpbAogICAgICAgICAgaW1tZWRpYXRlbHkuIFRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIG90aGVyd2lzZSBjbGVhciB0aGUgc3RyaW5nIHdoaWNoCiAgICAgICAgICB3aWxsIGxlYWQgdG8gY29kZSBydW5uaW5nIGFzIGlmIG5vIHByb3h5IHdhcyBzZXQhICovCisgICAgICBDdXJsX3NhZmVmcmVlKHByb3h5dXNlcik7CisgICAgICBDdXJsX3NhZmVmcmVlKHByb3h5cGFzc3dkKTsKICAgICAgIHJldHVybiBDVVJMRV9DT1VMRE5UX1JFU09MVkVfUFJPWFk7CisgICAgfQogCiAgICAgLyogd2l0aG91dCBhIHBvcnQgbnVtYmVyIGFmdGVyIHRoZSBob3N0IG5hbWUsIHNvbWUgcGVvcGxlIHNlZW0gdG8gdXNlCiAgICAgICAgYSBzbGFzaCBzbyB3ZSBzdHJpcCBldmVyeXRoaW5nIGZyb20gdGhlIGZpcnN0IHNsYXNoICovCkBAIC01MjgwLDIyICs1MzUyLDIxIEBACiAgICAgfQogICB9CiAKLSAgbm9fcHJveHkgPSBjdXJsX2dldGVudigibm9fcHJveHkiKTsKLSAgaWYoIW5vX3Byb3h5KQotICAgIG5vX3Byb3h5ID0gY3VybF9nZXRlbnYoIk5PX1BST1hZIik7CisgIGlmKCFkYXRhLT5zZXQuc3RyW1NUUklOR19OT1BST1hZXSkgeworICAgIG5vX3Byb3h5ID0gY3VybF9nZXRlbnYoIm5vX3Byb3h5Iik7CisgICAgaWYoIW5vX3Byb3h5KQorICAgICAgbm9fcHJveHkgPSBjdXJsX2dldGVudigiTk9fUFJPWFkiKTsKKyAgfQogCi0gIGlmKGNoZWNrX25vcHJveHkoY29ubi0+aG9zdC5uYW1lLCBkYXRhLT5zZXQuc3RyW1NUUklOR19OT1BST1hZXSkgfHwKLSAgICAgKCFkYXRhLT5zZXQuc3RyW1NUUklOR19OT1BST1hZXSAmJgotICAgICAgY2hlY2tfbm9wcm94eShjb25uLT5ob3N0Lm5hbWUsIG5vX3Byb3h5KSkpIHsKKyAgaWYoY2hlY2tfbm9wcm94eShjb25uLT5ob3N0Lm5hbWUsIGRhdGEtPnNldC5zdHJbU1RSSU5HX05PUFJPWFldID8KKyAgICAgIGRhdGEtPnNldC5zdHJbU1RSSU5HX05PUFJPWFldIDogbm9fcHJveHkpKSB7CiAgICAgQ3VybF9zYWZlZnJlZShwcm94eSk7CiAgICAgQ3VybF9zYWZlZnJlZShzb2Nrc3Byb3h5KTsKICAgfQotICBlbHNlIGlmKCFwcm94eSAmJiAhc29ja3Nwcm94eSkKICNpZm5kZWYgQ1VSTF9ESVNBQkxFX0hUVFAKKyAgZWxzZSBpZighcHJveHkgJiYgIXNvY2tzcHJveHkpCiAgICAgLyogaWYgdGhlIGhvc3QgaXMgbm90IGluIHRoZSBub3Byb3h5IGxpc3QsIGRldGVjdCBwcm94eS4gKi8KICAgICBwcm94eSA9IGRldGVjdF9wcm94eShjb25uKTsKLSNlbHNlICAvKiAhQ1VSTF9ESVNBQkxFX0hUVFAgKi8KLSAgICBwcm94eSA9IE5VTEw7CiAjZW5kaWYgLyogQ1VSTF9ESVNBQkxFX0hUVFAgKi8KIAogICBDdXJsX3NhZmVmcmVlKG5vX3Byb3h5KTsKQEAgLTUzNDgsMTIgKzU0MTksMTUgQEAKICAgICAgIHJlc3VsdCA9IENVUkxFX1VOU1VQUE9SVEVEX1BST1RPQ09MOwogICAgICAgZ290byBvdXQ7CiAjZWxzZQotICAgICAgLyogZm9yY2UgdGhpcyBjb25uZWN0aW9uJ3MgcHJvdG9jb2wgdG8gYmVjb21lIEhUVFAgaWYgbm90IGFscmVhZHkKLSAgICAgICAgIGNvbXBhdGlibGUgLSBpZiBpdCBpc24ndCB0dW5uZWxpbmcgdGhyb3VnaCAqLwotICAgICAgaWYoIShjb25uLT5oYW5kbGVyLT5wcm90b2NvbCAmIFBST1RPX0ZBTUlMWV9IVFRQKSAmJgotICAgICAgICAgIWNvbm4tPmJpdHMudHVubmVsX3Byb3h5KQotICAgICAgICBjb25uLT5oYW5kbGVyID0gJkN1cmxfaGFuZGxlcl9odHRwOwotCisgICAgICAvKiBmb3JjZSB0aGlzIGNvbm5lY3Rpb24ncyBwcm90b2NvbCB0byBiZWNvbWUgSFRUUCBpZiBjb21wYXRpYmxlICovCisgICAgICBpZighKGNvbm4tPmhhbmRsZXItPnByb3RvY29sICYgUFJPVE9fRkFNSUxZX0hUVFApKSB7CisgICAgICAgIGlmKChjb25uLT5oYW5kbGVyLT5mbGFncyAmIFBST1RPUFRfUFJPWFlfQVNfSFRUUCkgJiYKKyAgICAgICAgICAgIWNvbm4tPmJpdHMudHVubmVsX3Byb3h5KQorICAgICAgICAgIGNvbm4tPmhhbmRsZXIgPSAmQ3VybF9oYW5kbGVyX2h0dHA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAvKiBpZiBub3QgY29udmVydGluZyB0byBIVFRQIG92ZXIgdGhlIHByb3h5LCBlbmZvcmNlIHR1bm5lbGluZyAqLworICAgICAgICAgIGNvbm4tPmJpdHMudHVubmVsX3Byb3h5ID0gVFJVRTsKKyAgICAgIH0KICAgICAgIGNvbm4tPmJpdHMuaHR0cHByb3h5ID0gVFJVRTsKICNlbmRpZgogICAgIH0KQEAgLTU3NDAsNyArNTgxNCw3IEBACiAgICAgY2hhciAqcmVzdDsKICAgICBsb25nIHBvcnQ7CiAKLSAgICBwb3J0PXN0cnRvbChwb3J0cHRyKzEsICZyZXN0LCAxMCk7ICAvKiBQb3J0IG51bWJlciBtdXN0IGJlIGRlY2ltYWwgKi8KKyAgICBwb3J0ID0gc3RydG9sKHBvcnRwdHIgKyAxLCAmcmVzdCwgMTApOyAgLyogUG9ydCBudW1iZXIgbXVzdCBiZSBkZWNpbWFsICovCiAKICAgICBpZigocG9ydCA8IDApIHx8IChwb3J0ID4gMHhmZmZmKSkgewogICAgICAgLyogU2luZ2xlIHVuaXggc3RhbmRhcmQgc2F5cyBwb3J0IG51bWJlcnMgYXJlIDE2IGJpdHMgbG9uZyAqLwpAQCAtNjA5Niw3ICs2MTcwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqYXN5bmMpCiB7Ci0gIENVUkxjb2RlIHJlc3VsdD1DVVJMRV9PSzsKKyAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7CiAgIHRpbWVfdCB0aW1lb3V0X21zID0gQ3VybF90aW1lbGVmdChkYXRhLCBOVUxMLCBUUlVFKTsKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjI1OSwxMSArNjMzMywxMCBAQAogICBmcmVlX2ZpeGVkX2hvc3RuYW1lKCZjb25uLT5jb25uX3RvX2hvc3QpOwogICBDdXJsX3NhZmVmcmVlKGNvbm4tPmhvc3QucmF3YWxsb2MpOwogICBDdXJsX3NhZmVmcmVlKGNvbm4tPmNvbm5fdG9faG9zdC5yYXdhbGxvYyk7Ci0gIGNvbm4tPmhvc3Q9b2xkX2Nvbm4tPmhvc3Q7Ci0gIGNvbm4tPmJpdHMuY29ubl90b19ob3N0ID0gb2xkX2Nvbm4tPmJpdHMuY29ubl90b19ob3N0OworICBjb25uLT5ob3N0ID0gb2xkX2Nvbm4tPmhvc3Q7CiAgIGNvbm4tPmNvbm5fdG9faG9zdCA9IG9sZF9jb25uLT5jb25uX3RvX2hvc3Q7Ci0gIGNvbm4tPmJpdHMuY29ubl90b19wb3J0ID0gb2xkX2Nvbm4tPmJpdHMuY29ubl90b19wb3J0OwogICBjb25uLT5jb25uX3RvX3BvcnQgPSBvbGRfY29ubi0+Y29ubl90b19wb3J0OworICBjb25uLT5yZW1vdGVfcG9ydCA9IG9sZF9jb25uLT5yZW1vdGVfcG9ydDsKIAogICAvKiBwZXJzaXN0IGNvbm5lY3Rpb24gaW5mbyBpbiBzZXNzaW9uIGhhbmRsZSAqLwogICBDdXJsX3BlcnNpc3Rjb25uaW5mbyhjb25uKTsKQEAgLTYzNjIsOSArNjQzNSw5IEBACiAgICAqIG90aGVyIHBhcnRzIG9mIHRoZSBjb2RlIHdpbGwgcmVseSBvbiB0aGlzIGZhY3QKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBMRUFTVF9QQVRIX0FMTE9DIDI1NgotICB1cmxsZW49c3RybGVuKGRhdGEtPmNoYW5nZS51cmwpOworICB1cmxsZW4gPSBzdHJsZW4oZGF0YS0+Y2hhbmdlLnVybCk7CiAgIGlmKHVybGxlbiA8IExFQVNUX1BBVEhfQUxMT0MpCi0gICAgdXJsbGVuPUxFQVNUX1BBVEhfQUxMT0M7CisgICAgdXJsbGVuID0gTEVBU1RfUEFUSF9BTExPQzsKIAogICAvKgogICAgKiBXZSBtYWxsb2MoKSB0aGUgYnVmZmVycyBiZWxvdyB1cmxsZW4rMiB0byBtYWtlIHJvb20gZm9yIDIgcG9zc2liaWxpdGllczoKQEAgLTYzNzUsMTQgKzY0NDgsMTQgQEAKICAgQ3VybF9zYWZlZnJlZShkYXRhLT5zdGF0ZS5wYXRoYnVmZmVyKTsKICAgZGF0YS0+c3RhdGUucGF0aCA9IE5VTEw7CiAKLSAgZGF0YS0+c3RhdGUucGF0aGJ1ZmZlciA9IG1hbGxvYyh1cmxsZW4rMik7CisgIGRhdGEtPnN0YXRlLnBhdGhidWZmZXIgPSBtYWxsb2ModXJsbGVuICsgMik7CiAgIGlmKE5VTEwgPT0gZGF0YS0+c3RhdGUucGF0aGJ1ZmZlcikgewogICAgIHJlc3VsdCA9IENVUkxFX09VVF9PRl9NRU1PUlk7IC8qIHJlYWxseSBiYWQgZXJyb3IgKi8KICAgICBnb3RvIG91dDsKICAgfQogICBkYXRhLT5zdGF0ZS5wYXRoID0gZGF0YS0+c3RhdGUucGF0aGJ1ZmZlcjsKIAotICBjb25uLT5ob3N0LnJhd2FsbG9jID0gbWFsbG9jKHVybGxlbisyKTsKKyAgY29ubi0+aG9zdC5yYXdhbGxvYyA9IG1hbGxvYyh1cmxsZW4gKyAyKTsKICAgaWYoTlVMTCA9PSBjb25uLT5ob3N0LnJhd2FsbG9jKSB7CiAgICAgQ3VybF9zYWZlZnJlZShkYXRhLT5zdGF0ZS5wYXRoYnVmZmVyKTsKICAgICBkYXRhLT5zdGF0ZS5wYXRoID0gTlVMTDsKQEAgLTcwMTUsNyArNzA4OCw3IEBACiAKICAgay0+YnVmID0gZGF0YS0+c3RhdGUuYnVmZmVyOwogICBrLT5oYnVmcCA9IGRhdGEtPnN0YXRlLmhlYWRlcmJ1ZmY7Ci0gIGstPmlnbm9yZWJvZHk9RkFMU0U7CisgIGstPmlnbm9yZWJvZHkgPSBGQUxTRTsKIAogICBDdXJsX3NwZWVkaW5pdChkYXRhKTsKIApkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdXJsZGF0YS5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdXJsZGF0YS5oCmluZGV4IGQ0YTRhOTguLjY2ZTQ1OTYgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3VybGRhdGEuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi91cmxkYXRhLmgKQEAgLTgyLDc1ICs4Miw2IEBACiAjaW5jbHVkZSAiY29va2llLmgiCiAjaW5jbHVkZSAiZm9ybWRhdGEuaCIKIAotI2lmZGVmIFVTRV9PUEVOU1NMCi0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KLSNpZmRlZiBIQVZFX09QRU5TU0xfRU5HSU5FX0gKLSNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgotI2VuZGlmCi0jZW5kaWYgLyogVVNFX09QRU5TU0wgKi8KLQotI2lmZGVmIFVTRV9HTlVUTFMKLSNpbmNsdWRlIDxnbnV0bHMvZ251dGxzLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9NQkVEVExTCi0KLSNpbmNsdWRlIDxtYmVkdGxzL3NzbC5oPgotI2luY2x1ZGUgPG1iZWR0bHMvdmVyc2lvbi5oPgotI2luY2x1ZGUgPG1iZWR0bHMvZW50cm9weS5oPgotI2luY2x1ZGUgPG1iZWR0bHMvY3RyX2RyYmcuaD4KLQotI2VsaWYgZGVmaW5lZCBVU0VfUE9MQVJTU0wKLQotI2luY2x1ZGUgPHBvbGFyc3NsL3NzbC5oPgotI2luY2x1ZGUgPHBvbGFyc3NsL3ZlcnNpb24uaD4KLSNpZiBQT0xBUlNTTF9WRVJTSU9OX05VTUJFUjwweDAxMDEwMDAwCi0jaW5jbHVkZSA8cG9sYXJzc2wvaGF2ZWdlLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHBvbGFyc3NsL2VudHJvcHkuaD4KLSNpbmNsdWRlIDxwb2xhcnNzbC9jdHJfZHJiZy5oPgotI2VuZGlmIC8qIFBPTEFSU1NMX1ZFUlNJT05fTlVNQkVSPDB4MDEwMTAwMDAgKi8KLQotI2VuZGlmIC8qIFVTRV9QT0xBUlNTTCAqLwotCi0jaWZkZWYgVVNFX0NZQVNTTAotI3VuZGVmIE9DU1BfUkVRVUVTVCAgLyogYXZvaWQgY3lhc3NsL29wZW5zc2wvc3NsLmggY2xhc2ggd2l0aCB3aW5jcnlwdC5oICovCi0jdW5kZWYgT0NTUF9SRVNQT05TRSAvKiBhdm9pZCBjeWFzc2wvb3BlbnNzbC9zc2wuaCBjbGFzaCB3aXRoIHdpbmNyeXB0LmggKi8KLSNpbmNsdWRlIDxjeWFzc2wvb3BlbnNzbC9zc2wuaD4KLSNlbmRpZgotCi0jaWZkZWYgVVNFX05TUwotI2luY2x1ZGUgPG5zcHIuaD4KLSNpbmNsdWRlIDxwazExcHViLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9HU0tJVAotI2luY2x1ZGUgPGdza3NzbC5oPgotI2VuZGlmCi0KLSNpZmRlZiBVU0VfQVhUTFMKLSNpbmNsdWRlIDxheFRMUy9jb25maWcuaD4KLSNpbmNsdWRlIDxheFRMUy9zc2wuaD4KLSN1bmRlZiBtYWxsb2MKLSN1bmRlZiBjYWxsb2MKLSN1bmRlZiByZWFsbG9jCi0jZW5kaWYgLyogVVNFX0FYVExTICovCi0KLSNpZiBkZWZpbmVkKFVTRV9TQ0hBTk5FTCkgfHwgZGVmaW5lZChVU0VfV0lORE9XU19TU1BJKQotI2luY2x1ZGUgImN1cmxfc3NwaS5oIgotI2VuZGlmCi0jaWZkZWYgVVNFX1NDSEFOTkVMCi0jaW5jbHVkZSA8c2NobmxzcC5oPgotI2luY2x1ZGUgPHNjaGFubmVsLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9EQVJXSU5TU0wKLSNpbmNsdWRlIDxTZWN1cml0eS9TZWN1cml0eS5oPgotLyogRm9yIHNvbWUgcmVhc29uLCB3aGVuIGJ1aWxkaW5nIGZvciBpT1MsIHRoZSBvbW5pYnVzIGhlYWRlciBhYm92ZSBkb2VzCi0gKiBub3QgaW5jbHVkZSBTZWN1cmVUcmFuc3BvcnQuaCBhcyBvZiBpT1MgU0RLIDUuMS4gKi8KLSNpbmNsdWRlIDxTZWN1cml0eS9TZWN1cmVUcmFuc3BvcnQuaD4KLSNlbmRpZgotCiAjaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiAjZW5kaWYKQEAgLTE3Miw2ICsxMDMsNyBAQAogI2luY2x1ZGUgImhhc2guaCIKICNpbmNsdWRlICJzcGxheS5oIgogCisjaW5jbHVkZSAibWltZS5oIgogI2luY2x1ZGUgImltYXAuaCIKICNpbmNsdWRlICJwb3AzLmgiCiAjaW5jbHVkZSAic210cC5oIgpAQCAtMjQwLDIwICsxNzIsNiBAQAogfTsKICNlbmRpZgogCi0jaWZkZWYgVVNFX1NDSEFOTkVMCi0vKiBTdHJ1Y3RzIHRvIHN0b3JlIFNjaGFubmVsIGhhbmRsZXMgKi8KLXN0cnVjdCBjdXJsX3NjaGFubmVsX2NyZWQgewotICBDcmVkSGFuZGxlIGNyZWRfaGFuZGxlOwotICBUaW1lU3RhbXAgdGltZV9zdGFtcDsKLSAgaW50IHJlZmNvdW50OwotfTsKLQotc3RydWN0IGN1cmxfc2NoYW5uZWxfY3R4dCB7Ci0gIEN0eHRIYW5kbGUgY3R4dF9oYW5kbGU7Ci0gIFRpbWVTdGFtcCB0aW1lX3N0YW1wOwotfTsKLSNlbmRpZgotCiAvKiBlbnVtIGZvciB0aGUgbm9uYmxvY2tpbmcgU1NMIGNvbm5lY3Rpb24gc3RhdGUgbWFjaGluZSAqLwogdHlwZWRlZiBlbnVtIHsKICAgc3NsX2Nvbm5lY3RfMSwKQEAgLTI3MCw2ICsxODgsOSBAQAogICBzc2xfY29ubmVjdGlvbl9jb21wbGV0ZQogfSBzc2xfY29ubmVjdGlvbl9zdGF0ZTsKIAorLyogU1NMIGJhY2tlbmQtc3BlY2lmaWMgZGF0YTsgZGVjbGFyZWQgZGlmZmVyZW50bHkgYnkgZWFjaCBTU0wgYmFja2VuZCAqLworc3RydWN0IHNzbF9iYWNrZW5kX2RhdGE7CisKIC8qIHN0cnVjdCBmb3IgZGF0YSByZWxhdGVkIHRvIGVhY2ggU1NMIGNvbm5lY3Rpb24gKi8KIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhIHsKICAgLyogVXNlIHNzbCBlbmNyeXB0ZWQgY29tbXVuaWNhdGlvbnMgVFJVRS9GQUxTRSwgbm90IG5lY2Vzc2FyaWx5IHVzaW5nIGl0IGF0bQpAQCAtMjc4LDc4ICsxOTksOCBAQAogICBib29sIHVzZTsKICAgc3NsX2Nvbm5lY3Rpb25fc3RhdGUgc3RhdGU7CiAgIHNzbF9jb25uZWN0X3N0YXRlIGNvbm5lY3Rpbmdfc3RhdGU7Ci0jaWYgZGVmaW5lZChVU0VfT1BFTlNTTCkKLSAgLyogdGhlc2Ugb25lcyByZXF1aXJlcyBzcGVjaWZpYyBTU0wtdHlwZXMgKi8KLSAgU1NMX0NUWCogY3R4OwotICBTU0wqICAgICBoYW5kbGU7Ci0gIFg1MDkqICAgIHNlcnZlcl9jZXJ0OwotI2VsaWYgZGVmaW5lZChVU0VfR05VVExTKQotICBnbnV0bHNfc2Vzc2lvbl90IHNlc3Npb247Ci0gIGdudXRsc19jZXJ0aWZpY2F0ZV9jcmVkZW50aWFsc190IGNyZWQ7Ci0jaWZkZWYgVVNFX1RMU19TUlAKLSAgZ251dGxzX3NycF9jbGllbnRfY3JlZGVudGlhbHNfdCBzcnBfY2xpZW50X2NyZWQ7Ci0jZW5kaWYKLSNlbGlmIGRlZmluZWQoVVNFX01CRURUTFMpCi0gIG1iZWR0bHNfY3RyX2RyYmdfY29udGV4dCBjdHJfZHJiZzsKLSAgbWJlZHRsc19lbnRyb3B5X2NvbnRleHQgZW50cm9weTsKLSAgbWJlZHRsc19zc2xfY29udGV4dCBzc2w7Ci0gIGludCBzZXJ2ZXJfZmQ7Ci0gIG1iZWR0bHNfeDUwOV9jcnQgY2FjZXJ0OwotICBtYmVkdGxzX3g1MDlfY3J0IGNsaWNlcnQ7Ci0gIG1iZWR0bHNfeDUwOV9jcmwgY3JsOwotICBtYmVkdGxzX3BrX2NvbnRleHQgcGs7Ci0gIG1iZWR0bHNfc3NsX2NvbmZpZyBjb25maWc7Ci0gIGNvbnN0IGNoYXIgKnByb3RvY29sc1szXTsKLSNlbGlmIGRlZmluZWQoVVNFX1BPTEFSU1NMKQotICBjdHJfZHJiZ19jb250ZXh0IGN0cl9kcmJnOwotICBlbnRyb3B5X2NvbnRleHQgZW50cm9weTsKLSAgc3NsX2NvbnRleHQgc3NsOwotICBpbnQgc2VydmVyX2ZkOwotICB4NTA5X2NydCBjYWNlcnQ7Ci0gIHg1MDlfY3J0IGNsaWNlcnQ7Ci0gIHg1MDlfY3JsIGNybDsKLSAgcnNhX2NvbnRleHQgcnNhOwotI2VsaWYgZGVmaW5lZChVU0VfQ1lBU1NMKQotICBTU0xfQ1RYKiBjdHg7Ci0gIFNTTCogICAgIGhhbmRsZTsKLSNlbGlmIGRlZmluZWQoVVNFX05TUykKLSAgUFJGaWxlRGVzYyAqaGFuZGxlOwotICBjaGFyICpjbGllbnRfbmlja25hbWU7Ci0gIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGE7Ci0gIHN0cnVjdCBjdXJsX2xsaXN0IG9ial9saXN0OwotICBQSzExR2VuZXJpY09iamVjdCAqb2JqX2NsaWNlcnQ7Ci0jZWxpZiBkZWZpbmVkKFVTRV9HU0tJVCkKLSAgZ3NrX2hhbmRsZSBoYW5kbGU7Ci0gIGludCBpb2Nwb3J0OwotICBpbnQgbG9jYWxmZDsKLSAgaW50IHJlbW90ZWZkOwotI2VsaWYgZGVmaW5lZChVU0VfQVhUTFMpCi0gIFNTTF9DVFgqIHNzbF9jdHg7Ci0gIFNTTCogICAgIHNzbDsKLSNlbGlmIGRlZmluZWQoVVNFX1NDSEFOTkVMKQotICBzdHJ1Y3QgY3VybF9zY2hhbm5lbF9jcmVkICpjcmVkOwotICBzdHJ1Y3QgY3VybF9zY2hhbm5lbF9jdHh0ICpjdHh0OwotICBTZWNQa2dDb250ZXh0X1N0cmVhbVNpemVzIHN0cmVhbV9zaXplczsKLSAgc2l6ZV90IGVuY2RhdGFfbGVuZ3RoLCBkZWNkYXRhX2xlbmd0aDsKLSAgc2l6ZV90IGVuY2RhdGFfb2Zmc2V0LCBkZWNkYXRhX29mZnNldDsKLSAgdW5zaWduZWQgY2hhciAqZW5jZGF0YV9idWZmZXIsICpkZWNkYXRhX2J1ZmZlcjsKLSAgLyogZW5jZGF0YV9pc19pbmNvbXBsZXRlOiBpZiBlbmNkYXRhIGNvbnRhaW5zIG9ubHkgYSBwYXJ0aWFsIHJlY29yZCB0aGF0Ci0gICAgIGNhbid0IGJlIGRlY3J5cHRlZCB3aXRob3V0IGFub3RoZXIgQ3VybF9yZWFkX3BsYWluICh0aGF0IGlzLCBzdGF0dXMgaXMKLSAgICAgU0VDX0VfSU5DT01QTEVURV9NRVNTQUdFKSB0aGVuIHNldCB0aGlzIHRydWUuIGFmdGVyIEN1cmxfcmVhZF9wbGFpbiB3cml0ZXMKLSAgICAgbW9yZSBieXRlcyBpbnRvIGVuY2RhdGEgdGhlbiBzZXQgdGhpcyBiYWNrIHRvIGZhbHNlLiAqLwotICBib29sIGVuY2RhdGFfaXNfaW5jb21wbGV0ZTsKLSAgdW5zaWduZWQgbG9uZyByZXFfZmxhZ3MsIHJldF9mbGFnczsKLSAgQ1VSTGNvZGUgcmVjdl91bnJlY292ZXJhYmxlX2VycjsgLyogc2NoYW5uZWxfcmVjdiBoYWQgYW4gdW5yZWNvdmVyYWJsZSBlcnIgKi8KLSAgYm9vbCByZWN2X3NzcGlfY2xvc2Vfbm90aWZ5OyAvKiB0cnVlIGlmIGNvbm5lY3Rpb24gY2xvc2VkIGJ5IGNsb3NlX25vdGlmeSAqLwotICBib29sIHJlY3ZfY29ubmVjdGlvbl9jbG9zZWQ7IC8qIHRydWUgaWYgY29ubmVjdGlvbiBjbG9zZWQsIHJlZ2FyZGxlc3MgaG93ICovCi0gIGJvb2wgdXNlX2FscG47IC8qIHRydWUgaWYgQUxQTiBpcyB1c2VkIGZvciB0aGlzIGNvbm5lY3Rpb24gKi8KLSNlbGlmIGRlZmluZWQoVVNFX0RBUldJTlNTTCkKLSAgU1NMQ29udGV4dFJlZiBzc2xfY3R4OwotICBjdXJsX3NvY2tldF90IHNzbF9zb2NrZmQ7Ci0gIGJvb2wgc3NsX2RpcmVjdGlvbjsgLyogdHJ1ZSBpZiB3cml0aW5nLCBmYWxzZSBpZiByZWFkaW5nICovCi0gIHNpemVfdCBzc2xfd3JpdGVfYnVmZmVyZWRfbGVuZ3RoOwotI2VsaWYgZGVmaW5lZChVU0VfU1NMKQotI2Vycm9yICJTU0wgYmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBtaXNzaW5nIGZyb20gc3NsX2Nvbm5lY3RfZGF0YSIKKyNpZiBkZWZpbmVkKFVTRV9TU0wpCisgIHN0cnVjdCBzc2xfYmFja2VuZF9kYXRhICpiYWNrZW5kOwogI2VuZGlmCiB9OwogCkBAIC0zNTksMTMgKzIxMCwxMyBAQAogICBib29sIHZlcmlmeXBlZXI7ICAgICAgIC8qIHNldCBUUlVFIGlmIHRoaXMgaXMgZGVzaXJlZCAqLwogICBib29sIHZlcmlmeWhvc3Q7ICAgICAgIC8qIHNldCBUUlVFIGlmIENOL1NBTiBtdXN0IG1hdGNoIGhvc3RuYW1lICovCiAgIGJvb2wgdmVyaWZ5c3RhdHVzOyAgICAgLyogc2V0IFRSVUUgaWYgY2VydGlmaWNhdGUgc3RhdHVzIG11c3QgYmUgY2hlY2tlZCAqLworICBib29sIHNlc3Npb25pZDsgICAgICAgIC8qIGNhY2hlIHNlc3Npb24gSURzIG9yIG5vdCAqLwogICBjaGFyICpDQXBhdGg7ICAgICAgICAgIC8qIGNlcnRpZmljYXRlIGRpciAoZG9lc24ndCB3b3JrIG9uIHdpbmRvd3MpICovCiAgIGNoYXIgKkNBZmlsZTsgICAgICAgICAgLyogY2VydGlmaWNhdGUgdG8gdmVyaWZ5IHBlZXIgYWdhaW5zdCAqLwogICBjaGFyICpjbGllbnRjZXJ0OwogICBjaGFyICpyYW5kb21fZmlsZTsgICAgIC8qIHBhdGggdG8gZmlsZSBjb250YWluaW5nICJyYW5kb20iIGRhdGEgKi8KICAgY2hhciAqZWdkc29ja2V0OyAgICAgICAvKiBwYXRoIHRvIGZpbGUgY29udGFpbmluZyB0aGUgRUdEIGRhZW1vbiBzb2NrZXQgKi8KICAgY2hhciAqY2lwaGVyX2xpc3Q7ICAgICAvKiBsaXN0IG9mIGNpcGhlcnMgdG8gdXNlICovCi0gIGJvb2wgc2Vzc2lvbmlkOyAgICAgICAgLyogY2FjaGUgc2Vzc2lvbiBJRHMgb3Igbm90ICovCiB9OwogCiBzdHJ1Y3Qgc3NsX2NvbmZpZ19kYXRhIHsKQEAgLTQxMSwxMiArMjYyLDIwIEBACiAgIHN0cnVjdCBzc2xfcHJpbWFyeV9jb25maWcgc3NsX2NvbmZpZzsgLyogc2V0dXAgZm9yIHRoaXMgc2Vzc2lvbiAqLwogfTsKIAorI2lmZGVmIFVTRV9XSU5ET1dTX1NTUEkKKyNpbmNsdWRlICJjdXJsX3NzcGkuaCIKKyNlbmRpZgorCiAvKiBTdHJ1Y3QgdXNlZCBmb3IgRGlnZXN0IGNoYWxsZW5nZS1yZXNwb25zZSBhdXRoZW50aWNhdGlvbiAqLwogc3RydWN0IGRpZ2VzdGRhdGEgewogI2lmIGRlZmluZWQoVVNFX1dJTkRPV1NfU1NQSSkKICAgQllURSAqaW5wdXRfdG9rZW47CiAgIHNpemVfdCBpbnB1dF90b2tlbl9sZW47CiAgIEN0eHRIYW5kbGUgKmh0dHBfY29udGV4dDsKKyAgLyogY29weSBvZiB1c2VyL3Bhc3N3ZCB1c2VkIHRvIG1ha2UgdGhlIGlkZW50aXR5IGZvciBodHRwX2NvbnRleHQuCisgICAgIGVpdGhlciBtYXkgYmUgTlVMTC4gKi8KKyAgY2hhciAqdXNlcjsKKyAgY2hhciAqcGFzc3dkOwogI2Vsc2UKICAgY2hhciAqbm9uY2U7CiAgIGNoYXIgKmNub25jZTsKQEAgLTQzOCwxMCArMjk3LDYgQEAKICAgTlRMTVNUQVRFX0xBU1QKIH0gY3VybG50bG07CiAKLSNpZmRlZiBVU0VfV0lORE9XU19TU1BJCi0jaW5jbHVkZSAiY3VybF9zc3BpLmgiCi0jZW5kaWYKLQogI2lmIGRlZmluZWQoQ1VSTF9ET0VTX0NPTlZFUlNJT05TKSAmJiBkZWZpbmVkKEhBVkVfSUNPTlYpCiAjaW5jbHVkZSA8aWNvbnYuaD4KICNlbmRpZgpAQCAtNjc4LDggKzUzMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCByZXBseSAod2l0aG91dCBhIGZvbGxvd2luZyBzZWNvbmQgcmVzcG9uc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSkgcmVzdWx0IGluIGEgQ1VSTEVfR09UX05PVEhJTkcgZXJyb3IgY29kZSAqLwogCi0gIHN0cnVjdCB0aW1ldmFsIHN0YXJ0OyAgICAgICAgIC8qIHRyYW5zZmVyIHN0YXJ0ZWQgYXQgdGhpcyB0aW1lICovCi0gIHN0cnVjdCB0aW1ldmFsIG5vdzsgICAgICAgICAgIC8qIGN1cnJlbnQgdGltZSAqLworICBzdHJ1Y3QgY3VybHRpbWUgc3RhcnQ7ICAgICAgICAgLyogdHJhbnNmZXIgc3RhcnRlZCBhdCB0aGlzIHRpbWUgKi8KKyAgc3RydWN0IGN1cmx0aW1lIG5vdzsgICAgICAgICAgIC8qIGN1cnJlbnQgdGltZSAqLwogICBib29sIGhlYWRlcjsgICAgICAgICAgICAgICAgICAvKiBpbmNvbWluZyBkYXRhIGhhcyBIVFRQIGhlYWRlciAqLwogICBlbnVtIHsKICAgICBIRUFERVJfTk9STUFMLCAgICAgICAgICAgICAgLyogbm8gYmFkIGhlYWRlciBhdCBhbGwgKi8KQEAgLTcwMSw3ICs1NTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50LVJhbmdlOiBoZWFkZXIgKi8KICAgaW50IGh0dHBjb2RlOyAgICAgICAgICAgICAgICAgLyogZXJyb3IgY29kZSBmcm9tIHRoZSAnSFRUUC8xLj8gWFhYJyBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUlRTUC8xLj8gWFhYJyBsaW5lICovCi0gIHN0cnVjdCB0aW1ldmFsIHN0YXJ0MTAwOyAgICAgIC8qIHRpbWUgc3RhbXAgdG8gd2FpdCBmb3IgdGhlIDEwMCBjb2RlIGZyb20gKi8KKyAgc3RydWN0IGN1cmx0aW1lIHN0YXJ0MTAwOyAgICAgIC8qIHRpbWUgc3RhbXAgdG8gd2FpdCBmb3IgdGhlIDEwMCBjb2RlIGZyb20gKi8KICAgZW51bSBleHBlY3QxMDAgZXhwMTAwOyAgICAgICAgLyogZXhwZWN0IDEwMCBjb250aW51ZSBzdGF0ZSAqLwogICBlbnVtIHVwZ3JhZGUxMDEgdXBncjEwMTsgICAgICAvKiAxMDEgdXBncmFkZSBzdGF0ZSAqLwogCkBAIC04MjksNiArNjg0LDEyIEBACiAgIENVUkxjb2RlICgqcmVhZHdyaXRlKShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCiAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90ICpucmVhZCwgYm9vbCAqcmVhZG1vcmUpOwogCisgIC8qIFRoaXMgZnVuY3Rpb24gY2FuIHBlcmZvcm0gdmFyaW91cyBjaGVja3Mgb24gdGhlIGNvbm5lY3Rpb24uIFNlZQorICAgICBDT05OQ0hFQ0tfKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hlY2tzIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCwKKyAgICAgYW5kIENPTk5SRVNVTFRfKiBmb3IgdGhlIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0dXJuZWQuICovCisgIHVuc2lnbmVkIGludCAoKmNvbm5lY3Rpb25fY2hlY2spKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNoZWNrc190b19wZXJmb3JtKTsKKwogICBsb25nIGRlZnBvcnQ7ICAgICAgICAgICAvKiBEZWZhdWx0IHBvcnQuICovCiAgIHVuc2lnbmVkIGludCBwcm90b2NvbDsgIC8qIFNlZSBDVVJMUFJPVE9fKiAtIHRoaXMgbmVlZHMgdG8gYmUgdGhlIHNpbmdsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyBwcm90b2NvbCBiaXQgKi8KQEAgLTg1NSw2ICs3MTYsMTUgQEAKICNkZWZpbmUgUFJPVE9QVF9TVFJFQU0gKDE8PDkpIC8qIGEgcHJvdG9jb2wgd2l0aCBpbmRpdmlkdWFsIGxvZ2ljYWwgc3RyZWFtcyAqLwogI2RlZmluZSBQUk9UT1BUX1VSTE9QVElPTlMgKDE8PDEwKSAvKiBhbGxvdyBvcHRpb25zIHBhcnQgaW4gdGhlIHVzZXJpbmZvIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBVUkwgKi8KKyNkZWZpbmUgUFJPVE9QVF9QUk9YWV9BU19IVFRQICgxPDwxMSkgLyogYWxsb3cgdGhpcyBub24tSFRUUCBzY2hlbWUgb3ZlciBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFAgcHJveHkgYXMgSFRUUCBwcm94aWVzIG1heSBrbm93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcHJvdG9jb2wgYW5kIGFjdCBhcyBhIGdhdGV3YXkgKi8KKworI2RlZmluZSBDT05OQ0hFQ0tfTk9ORSAwICAgICAgICAgICAgICAgICAvKiBObyBjaGVja3MgKi8KKyNkZWZpbmUgQ09OTkNIRUNLX0lTREVBRCAoMTw8MCkgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gaXMgZGVhZC4gKi8KKworI2RlZmluZSBDT05OUkVTVUxUX05PTkUgMCAgICAgICAgICAgICAgICAvKiBObyBleHRyYSBpbmZvcm1hdGlvbi4gKi8KKyNkZWZpbmUgQ09OTlJFU1VMVF9ERUFEICgxPDwwKSAgICAgICAgICAgLyogVGhlIGNvbm5lY3Rpb24gaXMgZGVhZC4gKi8KIAogLyogcmV0dXJuIHRoZSBjb3VudCBvZiBieXRlcyBzZW50LCBvciAtMSBvbiBlcnJvciAqLwogdHlwZWRlZiBzc2l6ZV90IChDdXJsX3NlbmQpKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgLyogY29ubmVjdGlvbiBkYXRhICovCkBAIC04OTIsNiArNzYyLDI0IEBACiAgIGNoYXIgKnBhc3N3ZDsgIC8qIHByb3h5IHBhc3N3b3JkIHN0cmluZywgYWxsb2NhdGVkICovCiB9OwogCisjZGVmaW5lIENPTk5FQ1RfQlVGRkVSX1NJWkUgMTYzODQKKworLyogc3RydWN0IGZvciBIVFRQIENPTk5FQ1Qgc3RhdGUgZGF0YSAqLworc3RydWN0IGh0dHBfY29ubmVjdF9zdGF0ZSB7CisgIGNoYXIgY29ubmVjdF9idWZmZXJbQ09OTkVDVF9CVUZGRVJfU0laRV07CisgIGludCBwZXJsaW5lOyAvKiBjb3VudCBieXRlcyBwZXIgbGluZSAqLworICBpbnQga2VlcG9uOworICBjaGFyICpsaW5lX3N0YXJ0OworICBjaGFyICpwdHI7IC8qIHdoZXJlIHRvIHN0b3JlIG1vcmUgZGF0YSAqLworICBjdXJsX29mZl90IGNsOyAvKiBzaXplIG9mIGNvbnRlbnQgdG8gcmVhZCBhbmQgaWdub3JlICovCisgIGJvb2wgY2h1bmtlZF9lbmNvZGluZzsKKyAgZW51bSB7CisgICAgVFVOTkVMX0lOSVQsICAgIC8qIGluaXQvZGVmYXVsdC9ubyB0dW5uZWwgc3RhdGUgKi8KKyAgICBUVU5ORUxfQ09OTkVDVCwgLyogQ09OTkVDVCBoYXMgYmVlbiBzZW50IG9mZiAqLworICAgIFRVTk5FTF9DT01QTEVURSAvKiBDT05ORUNUIHJlc3BvbnNlIHJlY2VpdmVkIGNvbXBsZXRlbHkgKi8KKyAgfSB0dW5uZWxfc3RhdGU7Cit9OworCiAvKgogICogVGhlIGNvbm5lY3RkYXRhIHN0cnVjdCBjb250YWlucyBhbGwgZmllbGRzIGFuZCB2YXJpYWJsZXMgdGhhdCBzaG91bGQgYmUKICAqIHVuaXF1ZSBmb3IgYW4gZW50aXJlIGNvbm5lY3Rpb24uCkBAIC05ODMsOCArODcxLDggQEAKICAgaW50IGh0dHB2ZXJzaW9uOyAgICAgICAgLyogdGhlIEhUVFAgdmVyc2lvbioxMCByZXBvcnRlZCBieSB0aGUgc2VydmVyICovCiAgIGludCBydHNwdmVyc2lvbjsgICAgICAgIC8qIHRoZSBSVFNQIHZlcnNpb24qMTAgcmVwb3J0ZWQgYnkgdGhlIHNlcnZlciAqLwogCi0gIHN0cnVjdCB0aW1ldmFsIG5vdzsgICAgIC8qICJjdXJyZW50IiB0aW1lICovCi0gIHN0cnVjdCB0aW1ldmFsIGNyZWF0ZWQ7IC8qIGNyZWF0aW9uIHRpbWUgKi8KKyAgc3RydWN0IGN1cmx0aW1lIG5vdzsgICAgIC8qICJjdXJyZW50IiB0aW1lICovCisgIHN0cnVjdCBjdXJsdGltZSBjcmVhdGVkOyAvKiBjcmVhdGlvbiB0aW1lICovCiAgIGN1cmxfc29ja2V0X3Qgc29ja1syXTsgLyogdHdvIHNvY2tldHMsIHRoZSBzZWNvbmQgaXMgdXNlZCBmb3IgdGhlIGRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlciB3aGVuIGRvaW5nIEZUUCAqLwogICBjdXJsX3NvY2tldF90IHRlbXBzb2NrWzJdOyAvKiB0ZW1wb3Jhcnkgc29ja2V0cyBmb3IgaGFwcHkgZXllYmFsbHMgKi8KQEAgLTEwMDcsNyArODk1LDcgQEAKICAvKiBjb25uZWN0dGltZTogd2hlbiBjb25uZWN0KCkgaXMgY2FsbGVkIG9uIHRoZSBjdXJyZW50IElQIGFkZHJlc3MuIFVzZWQgdG8KICAgICBiZSBhYmxlIHRvIHRyYWNrIHdoZW4gdG8gbW92ZSBvbiB0byB0cnkgbmV4dCBJUCAtIGJ1dCBvbmx5IHdoZW4gdGhlIG11bHRpCiAgICAgaW50ZXJmYWNlIGlzIHVzZWQuICovCi0gIHN0cnVjdCB0aW1ldmFsIGNvbm5lY3R0aW1lOworICBzdHJ1Y3QgY3VybHRpbWUgY29ubmVjdHRpbWU7CiAgIC8qIFRoZSB0d28gZmllbGRzIGJlbG93IGdldCBzZXQgaW4gQ3VybF9jb25uZWN0aG9zdCAqLwogICBpbnQgbnVtX2FkZHI7IC8qIG51bWJlciBvZiBhZGRyZXNzZXMgdG8gdHJ5IHRvIGNvbm5lY3QgdG8gKi8KICAgdGltZV90IHRpbWVvdXRtc19wZXJfYWRkcjsgLyogaG93IGxvbmcgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gc3BlbmQgb24KQEAgLTExMzQsMjIgKzEwMjIsMjQgQEAKICAgY2hhciAqbG9jYWxkZXY7CiAgIHVuc2lnbmVkIHNob3J0IGxvY2FscG9ydDsKICAgaW50IGxvY2FscG9ydHJhbmdlOwotCi0gIC8qIHR1bm5lbCBhcyBpbiB0dW5uZWwgdGhyb3VnaCBhIEhUVFAgcHJveHkgd2l0aCBDT05ORUNUICovCi0gIGVudW0gewotICAgIFRVTk5FTF9JTklULCAgICAvKiBpbml0L2RlZmF1bHQvbm8gdHVubmVsIHN0YXRlICovCi0gICAgVFVOTkVMX0NPTk5FQ1QsIC8qIENPTk5FQ1QgaGFzIGJlZW4gc2VudCBvZmYgKi8KLSAgICBUVU5ORUxfQ09NUExFVEUgLyogQ09OTkVDVCByZXNwb25zZSByZWNlaXZlZCBjb21wbGV0ZWx5ICovCi0gIH0gdHVubmVsX3N0YXRlWzJdOyAvKiB0d28gc2VwYXJhdGUgb25lcyB0byBhbGxvdyBGVFAgKi8KKyAgc3RydWN0IGh0dHBfY29ubmVjdF9zdGF0ZSAqY29ubmVjdF9zdGF0ZTsgLyogZm9yIEhUVFAgQ09OTkVDVCAqLwogICBzdHJ1Y3QgY29ubmVjdGJ1bmRsZSAqYnVuZGxlOyAvKiBUaGUgYnVuZGxlIHdlIGFyZSBtZW1iZXIgb2YgKi8KLQogICBpbnQgbmVnbnBuOyAvKiBBUExOIG9yIE5QTiBUTFMgbmVnb3RpYXRlZCBwcm90b2NvbCwgQ1VSTF9IVFRQX1ZFUlNJT04qICovCi0gIGNoYXIgKmNvbm5lY3RfYnVmZmVyOyAvKiBmb3IgQ09OTkVDVCBidXNpbmVzcyAqLwogCiAjaWZkZWYgVVNFX1VOSVhfU09DS0VUUwogICBjaGFyICp1bml4X2RvbWFpbl9zb2NrZXQ7CiAgIGJvb2wgYWJzdHJhY3RfdW5peF9zb2NrZXQ7CiAjZW5kaWYKKworI2lmZGVmIFVTRV9TU0wKKyAgLyoKKyAgICogVG8gYXZvaWQgbXVsdGlwbGUgbWFsbG9jKCkgY2FsbHMsIHRoZSBzc2xfY29ubmVjdF9kYXRhIHN0cnVjdHVyZXMKKyAgICogYXNzb2NpYXRlZCB3aXRoIGEgY29ubmVjdGRhdGEgc3RydWN0IGFyZSBhbGxvY2F0ZWQgaW4gdGhlIHNhbWUgYmxvY2sKKyAgICogYXMgdGhlIGxhdHRlci4gVGhpcyBmaWVsZCBmb3JjZXMgYWxpZ25tZW50IHRvIGFuIDgtYnl0ZSBib3VuZGFyeSBzbworICAgKiB0aGF0IHRoaXMgYWxsIHdvcmtzLgorICAgKi8KKyAgbG9uZyBsb25nICphbGlnbl9kYXRhX19kb19ub3RfdXNlOworI2VuZGlmCiB9OwogCiAvKiBUaGUgZW5kIG9mIGNvbm5lY3RkYXRhLiAqLwpAQCAtMTIxMywzNCArMTEwMywzNiBAQAogICBpbnQgd2lkdGg7IC8qIHNjcmVlbiB3aWR0aCBhdCBkb3dubG9hZCBzdGFydCAqLwogICBpbnQgZmxhZ3M7IC8qIHNlZSBwcm9ncmVzcy5oICovCiAKLSAgZG91YmxlIHRpbWVzcGVudDsKKyAgdGltZV90IHRpbWVzcGVudDsKIAogICBjdXJsX29mZl90IGRsc3BlZWQ7CiAgIGN1cmxfb2ZmX3QgdWxzcGVlZDsKIAotICBkb3VibGUgdF9uc2xvb2t1cDsKLSAgZG91YmxlIHRfY29ubmVjdDsKLSAgZG91YmxlIHRfYXBwY29ubmVjdDsKLSAgZG91YmxlIHRfcHJldHJhbnNmZXI7Ci0gIGRvdWJsZSB0X3N0YXJ0dHJhbnNmZXI7Ci0gIGRvdWJsZSB0X3JlZGlyZWN0OworICB0aW1lX3QgdF9uc2xvb2t1cDsKKyAgdGltZV90IHRfY29ubmVjdDsKKyAgdGltZV90IHRfYXBwY29ubmVjdDsKKyAgdGltZV90IHRfcHJldHJhbnNmZXI7CisgIHRpbWVfdCB0X3N0YXJ0dHJhbnNmZXI7CisgIHRpbWVfdCB0X3JlZGlyZWN0OwogCi0gIHN0cnVjdCB0aW1ldmFsIHN0YXJ0OwotICBzdHJ1Y3QgdGltZXZhbCB0X3N0YXJ0c2luZ2xlOwotICBzdHJ1Y3QgdGltZXZhbCB0X3N0YXJ0b3A7Ci0gIHN0cnVjdCB0aW1ldmFsIHRfYWNjZXB0ZGF0YTsKKyAgc3RydWN0IGN1cmx0aW1lIHN0YXJ0OworICBzdHJ1Y3QgY3VybHRpbWUgdF9zdGFydHNpbmdsZTsKKyAgc3RydWN0IGN1cmx0aW1lIHRfc3RhcnRvcDsKKyAgc3RydWN0IGN1cmx0aW1lIHRfYWNjZXB0ZGF0YTsKKworICBib29sIGlzX3Rfc3RhcnRyYW5zZmVyX3NldDsKIAogICAvKiB1cGxvYWQgc3BlZWQgbGltaXQgKi8KLSAgc3RydWN0IHRpbWV2YWwgdWxfbGltaXRfc3RhcnQ7CisgIHN0cnVjdCBjdXJsdGltZSB1bF9saW1pdF9zdGFydDsKICAgY3VybF9vZmZfdCB1bF9saW1pdF9zaXplOwogICAvKiBkb3dubG9hZCBzcGVlZCBsaW1pdCAqLwotICBzdHJ1Y3QgdGltZXZhbCBkbF9saW1pdF9zdGFydDsKKyAgc3RydWN0IGN1cmx0aW1lIGRsX2xpbWl0X3N0YXJ0OwogICBjdXJsX29mZl90IGRsX2xpbWl0X3NpemU7CiAKLSNkZWZpbmUgQ1VSUl9USU1FICg1KzEpIC8qIDYgZW50cmllcyBmb3IgNSBzZWNvbmRzICovCisjZGVmaW5lIENVUlJfVElNRSAoNSArIDEpIC8qIDYgZW50cmllcyBmb3IgNSBzZWNvbmRzICovCiAKICAgY3VybF9vZmZfdCBzcGVlZGVyWyBDVVJSX1RJTUUgXTsKLSAgc3RydWN0IHRpbWV2YWwgc3BlZWRlcl90aW1lWyBDVVJSX1RJTUUgXTsKKyAgc3RydWN0IGN1cmx0aW1lIHNwZWVkZXJfdGltZVsgQ1VSUl9USU1FIF07CiAgIGludCBzcGVlZGVyX2M7CiB9OwogCkBAIC0xMjQ5LDggKzExNDEsMTAgQEAKICAgSFRUUFJFUV9HRVQsCiAgIEhUVFBSRVFfUE9TVCwKICAgSFRUUFJFUV9QT1NUX0ZPUk0sIC8qIHdlIG1ha2UgYSBkaWZmZXJlbmNlIGludGVybmFsbHkgKi8KKyAgSFRUUFJFUV9QT1NUX01JTUUsIC8qIHdlIG1ha2UgYSBkaWZmZXJlbmNlIGludGVybmFsbHkgKi8KICAgSFRUUFJFUV9QVVQsCiAgIEhUVFBSRVFfSEVBRCwKKyAgSFRUUFJFUV9PUFRJT05TLAogICBIVFRQUkVRX0NVU1RPTSwKICAgSFRUUFJFUV9MQVNUIC8qIGxhc3QgaW4gbGlzdCAqLwogfSBDdXJsX0h0dHBSZXE7CkBAIC0xMzM0LDcgKzEyMjgsNyBAQAogICovCiBzdHJ1Y3QgdGltZV9ub2RlIHsKICAgc3RydWN0IGN1cmxfbGxpc3RfZWxlbWVudCBsaXN0OwotICBzdHJ1Y3QgdGltZXZhbCB0aW1lOworICBzdHJ1Y3QgY3VybHRpbWUgdGltZTsKICAgZXhwaXJlX2lkIGVpZDsKIH07CiAKQEAgLTEzNDksNyArMTI0Myw3IEBACiAgIGJvb2wgbXVsdGlfb3duZWRfYnlfZWFzeTsKIAogICAvKiBidWZmZXJzIHRvIHN0b3JlIGF1dGhlbnRpY2F0aW9uIGRhdGEgaW4sIGFzIHBhcnNlZCBmcm9tIGlucHV0IG9wdGlvbnMgKi8KLSAgc3RydWN0IHRpbWV2YWwga2VlcHNfc3BlZWQ7IC8qIGZvciB0aGUgcHJvZ3Jlc3MgbWV0ZXIgcmVhbGx5ICovCisgIHN0cnVjdCBjdXJsdGltZSBrZWVwc19zcGVlZDsgLyogZm9yIHRoZSBwcm9ncmVzcyBtZXRlciByZWFsbHkgKi8KIAogICBzdHJ1Y3QgY29ubmVjdGRhdGEgKmxhc3Rjb25uZWN0OyAvKiBUaGUgbGFzdCBjb25uZWN0aW9uLCBOVUxMIGlmIHVuZGVmaW5lZCAqLwogCkBAIC0xMzU3LDcgKzEyNTEsNyBAQAogICBzaXplX3QgaGVhZGVyc2l6ZTsgICAvKiBzaXplIG9mIHRoZSBhbGxvY2F0aW9uICovCiAKICAgY2hhciAqYnVmZmVyOyAvKiBkb3dubG9hZCBidWZmZXIgKi8KLSAgY2hhciB1cGxvYWRidWZmZXJbVVBMT0FEX0JVRlNJWkUrMV07IC8qIHVwbG9hZCBidWZmZXIgKi8KKyAgY2hhciB1cGxvYWRidWZmZXJbVVBMT0FEX0JVRlNJWkUgKyAxXTsgLyogdXBsb2FkIGJ1ZmZlciAqLwogICBjdXJsX29mZl90IGN1cnJlbnRfc3BlZWQ7ICAvKiB0aGUgUHJvZ3Jlc3NTaG93KCkgZnVuY3Rpb24gc2V0cyB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyAvIHNlY29uZCAqLwogICBib29sIHRoaXNfaXNfYV9mb2xsb3c7IC8qIHRoaXMgaXMgYSBmb2xsb3dlZCBMb2NhdGlvbjogcmVxdWVzdCAqLwpAQCAtMTQwMSw5ICsxMjk1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICBhcmVzX2NoYW5uZWwgZi5lLiAqLwogCiAjaWYgZGVmaW5lZChVU0VfT1BFTlNTTCkgJiYgZGVmaW5lZChIQVZFX09QRU5TU0xfRU5HSU5FX0gpCi0gIEVOR0lORSAqZW5naW5lOworICAvKiB2b2lkIGluc3RlYWQgb2YgRU5HSU5FIHRvIGF2b2lkIGJsZWVkaW5nIE9wZW5TU0wgaW50byB0aGlzIGhlYWRlciAqLworICB2b2lkICplbmdpbmU7CiAjZW5kaWYgLyogVVNFX09QRU5TU0wgKi8KLSAgc3RydWN0IHRpbWV2YWwgZXhwaXJldGltZTsgLyogc2V0IHRoaXMgd2l0aCBDdXJsX2V4cGlyZSgpIG9ubHkgKi8KKyAgc3RydWN0IGN1cmx0aW1lIGV4cGlyZXRpbWU7IC8qIHNldCB0aGlzIHdpdGggQ3VybF9leHBpcmUoKSBvbmx5ICovCiAgIHN0cnVjdCBDdXJsX3RyZWUgdGltZW5vZGU7IC8qIGZvciB0aGUgc3BsYXkgc3R1ZmYgKi8KICAgc3RydWN0IGN1cmxfbGxpc3QgdGltZW91dGxpc3Q7IC8qIGxpc3Qgb2YgcGVuZGluZyB0aW1lb3V0cyAqLwogICBzdHJ1Y3QgdGltZV9ub2RlIGV4cGlyZXNbRVhQSVJFX0xBU1RdOyAvKiBub2RlcyBmb3IgZWFjaCBleHBpcmUgdHlwZSAqLwpAQCAtMTU3NCw3ICsxNDY5LDcgQEAKICNpZmRlZiBVU0VfVU5JWF9TT0NLRVRTCiAgIFNUUklOR19VTklYX1NPQ0tFVF9QQVRILCAgICAgIC8qIHBhdGggdG8gVW5peCBzb2NrZXQsIGlmIHVzZWQgKi8KICNlbmRpZgotCisgIFNUUklOR19UQVJHRVQsICAgICAgICAgICAgICAgIC8qIENVUkxPUFRfUkVRVUVTVF9UQVJHRVQgKi8KICAgLyogLS0gZW5kIG9mIHplcm8tdGVybWluYXRlZCBzdHJpbmdzIC0tICovCiAKICAgU1RSSU5HX0xBU1RaRVJPVEVSTUlOQVRFRCwKQEAgLTE2MDEsNiArMTQ5Niw3IEBACiAgIGxvbmcgdXNlX3BvcnQ7ICAgICAvKiB3aGljaCBwb3J0IHRvIHVzZSAod2hlbiBub3QgdXNpbmcgZGVmYXVsdCkgKi8KICAgdW5zaWduZWQgbG9uZyBodHRwYXV0aDsgIC8qIGtpbmQgb2YgSFRUUCBhdXRoZW50aWNhdGlvbiB0byB1c2UgKGJpdG1hc2spICovCiAgIHVuc2lnbmVkIGxvbmcgcHJveHlhdXRoOyAvKiBraW5kIG9mIHByb3h5IGF1dGhlbnRpY2F0aW9uIHRvIHVzZSAoYml0bWFzaykgKi8KKyAgdW5zaWduZWQgbG9uZyBzb2NrczVhdXRoOy8qIGtpbmQgb2YgU09DS1M1IGF1dGhlbnRpY2F0aW9uIHRvIHVzZSAoYml0bWFzaykgKi8KICAgbG9uZyBmb2xsb3dsb2NhdGlvbjsgLyogYXMgaW4gSFRUUCBMb2NhdGlvbjogKi8KICAgbG9uZyBtYXhyZWRpcnM7ICAgIC8qIG1heGltdW0gbm8uIG9mIGh0dHAocykgcmVkaXJlY3RzIHRvIGZvbGxvdywgc2V0IHRvIC0xCiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaW5maW5pdHkgKi8KQEAgLTE2NjMsNyArMTU1OSw4IEBACiAgIGN1cmxfb2ZmX3Qgc2V0X3Jlc3VtZV9mcm9tOyAgLyogY29udGludWUgW2Z0cF0gdHJhbnNmZXIgZnJvbSBoZXJlICovCiAgIHN0cnVjdCBjdXJsX3NsaXN0ICpoZWFkZXJzOyAvKiBsaW5rZWQgbGlzdCBvZiBleHRyYSBoZWFkZXJzICovCiAgIHN0cnVjdCBjdXJsX3NsaXN0ICpwcm94eWhlYWRlcnM7IC8qIGxpbmtlZCBsaXN0IG9mIGV4dHJhIENPTk5FQ1QgaGVhZGVycyAqLwotICBzdHJ1Y3QgY3VybF9odHRwcG9zdCAqaHR0cHBvc3Q7ICAvKiBsaW5rZWQgbGlzdCBvZiBQT1NUIGRhdGEgKi8KKyAgc3RydWN0IGN1cmxfaHR0cHBvc3QgKmh0dHBwb3N0OyAgLyogbGlua2VkIGxpc3Qgb2Ygb2xkIFBPU1QgZGF0YSAqLworICBjdXJsX21pbWVwYXJ0IG1pbWVwb3N0OyAgLyogTUlNRS9QT1NUIGRhdGEuICovCiAgIGJvb2wgc2VwX2hlYWRlcnM7ICAgICAvKiBoYW5kbGUgaG9zdCBhbmQgcHJveHkgaGVhZGVycyBzZXBhcmF0ZWx5ICovCiAgIGJvb2wgY29va2llc2Vzc2lvbjsgICAvKiBuZXcgY29va2llIHNlc3Npb24/ICovCiAgIGJvb2wgY3JsZjsgICAgICAgICAgICAvKiBjb252ZXJ0IGNybGYgb24gZnRwIHVwbG9hZCg/KSAqLwpAQCAtMTY4NSw2ICsxNTgyLDcgQEAKICAgQ3VybF9IdHRwUmVxIGh0dHByZXE7ICAgLyogd2hhdCBraW5kIG9mIEhUVFAgcmVxdWVzdCAoaWYgYW55KSBpcyB0aGlzICovCiAgIGxvbmcgaHR0cHZlcnNpb247IC8qIHdoZW4gbm9uLXplcm8sIGEgc3BlY2lmaWMgSFRUUCB2ZXJzaW9uIHJlcXVlc3RlZCB0bwogICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIGluIHRoZSBsaWJyYXJ5J3MgcmVxdWVzdChzKSAqLworICBib29sIHN0cmlwX3BhdGhfc2xhc2g7IC8qIHN0cmlwIG9mZiBpbml0aWFsIHNsYXNoIGZyb20gcGF0aCAqLwogICBzdHJ1Y3Qgc3NsX2NvbmZpZ19kYXRhIHNzbDsgIC8qIHVzZXIgZGVmaW5lZCBTU0wgc3R1ZmYgKi8KICAgc3RydWN0IHNzbF9jb25maWdfZGF0YSBwcm94eV9zc2w7ICAvKiB1c2VyIGRlZmluZWQgU1NMIHN0dWZmIGZvciBwcm94eSAqLwogICBzdHJ1Y3Qgc3NsX2dlbmVyYWxfY29uZmlnIGdlbmVyYWxfc3NsOyAvKiBnZW5lcmFsIHVzZXIgZGVmaW5lZCBTU0wgc3R1ZmYgKi8KQEAgLTE3MDgsNiArMTYwNiw3IEBACiAKICAgY3VybF9zc2hrZXljYWxsYmFjayBzc2hfa2V5ZnVuYzsgLyoga2V5IG1hdGNoaW5nIGNhbGxiYWNrICovCiAgIHZvaWQgKnNzaF9rZXlmdW5jX3VzZXJwOyAgICAgICAgIC8qIGN1c3RvbSBwb2ludGVyIHRvIGNhbGxiYWNrICovCisgIGJvb2wgc3NoX2NvbXByZXNzaW9uOyAgICAgICAgICAgIC8qIGVuYWJsZSBTU0ggY29tcHJlc3Npb24gKi8KIAogLyogSGVyZSBmb2xsb3dzIGJvb2xlYW4gc2V0dGluZ3MgdGhhdCBkZWZpbmUgaG93IHRvIGJlaGF2ZSBkdXJpbmcKICAgIHRoaXMgc2Vzc2lvbi4gVGhleSBhcmUgU1RBVElDLCBzZXQgYnkgbGliY3VybCB1c2VycyBvciBhdCBsZWFzdCBpbml0aWFsbHkKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3ZhdXRoL2RpZ2VzdF9zc3BpLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92YXV0aC9kaWdlc3Rfc3NwaS5jCmluZGV4IDBiZDk0NDQuLmEzZjk2ZWQgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3ZhdXRoL2RpZ2VzdF9zc3BpLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdmF1dGgvZGlnZXN0X3NzcGkuYwpAQCAtMzUyLDggKzM1Miw4IEBACiAgICAgICBpZighQ3VybF9hdXRoX2RpZ2VzdF9nZXRfcGFpcihwLCB2YWx1ZSwgY29udGVudCwgJnApKQogICAgICAgICBicmVhazsKIAotICAgICAgaWYoQ3VybF9zdHJjYXNlY29tcGFyZSh2YWx1ZSwgInN0YWxlIikKLSAgICAgICAgICYmIEN1cmxfc3RyY2FzZWNvbXBhcmUoY29udGVudCwgInRydWUiKSkgeworICAgICAgaWYoc3RyY2FzZWNvbXBhcmUodmFsdWUsICJzdGFsZSIpICYmCisgICAgICAgICBzdHJjYXNlY29tcGFyZShjb250ZW50LCAidHJ1ZSIpKSB7CiAgICAgICAgIHN0YWxlID0gdHJ1ZTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC00MzgsNiArNDM4LDIwIEBACiAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CiAgIH0KIAorICAvKiBJZiB0aGUgdXNlci9wYXNzd2QgdGhhdCB3YXMgdXNlZCB0byBtYWtlIHRoZSBpZGVudGl0eSBmb3IgaHR0cF9jb250ZXh0CisgICAgIGhhcyBjaGFuZ2VkIHRoZW4gZGVsZXRlIHRoYXQgY29udGV4dC4gKi8KKyAgaWYoKHVzZXJwICYmICFkaWdlc3QtPnVzZXIpIHx8ICghdXNlcnAgJiYgZGlnZXN0LT51c2VyKSB8fAorICAgICAocGFzc3dkcCAmJiAhZGlnZXN0LT5wYXNzd2QpIHx8ICghcGFzc3dkcCAmJiBkaWdlc3QtPnBhc3N3ZCkgfHwKKyAgICAgKHVzZXJwICYmIGRpZ2VzdC0+dXNlciAmJiBzdHJjbXAodXNlcnAsIGRpZ2VzdC0+dXNlcikpIHx8CisgICAgIChwYXNzd2RwICYmIGRpZ2VzdC0+cGFzc3dkICYmIHN0cmNtcChwYXNzd2RwLCBkaWdlc3QtPnBhc3N3ZCkpKSB7CisgICAgaWYoZGlnZXN0LT5odHRwX2NvbnRleHQpIHsKKyAgICAgIHNfcFNlY0ZuLT5EZWxldGVTZWN1cml0eUNvbnRleHQoZGlnZXN0LT5odHRwX2NvbnRleHQpOworICAgICAgQ3VybF9zYWZlZnJlZShkaWdlc3QtPmh0dHBfY29udGV4dCk7CisgICAgfQorICAgIEN1cmxfc2FmZWZyZWUoZGlnZXN0LT51c2VyKTsKKyAgICBDdXJsX3NhZmVmcmVlKGRpZ2VzdC0+cGFzc3dkKTsKKyAgfQorCiAgIGlmKGRpZ2VzdC0+aHR0cF9jb250ZXh0KSB7CiAgICAgY2hsZ19kZXNjLnVsVmVyc2lvbiAgICA9IFNFQ0JVRkZFUl9WRVJTSU9OOwogICAgIGNobGdfZGVzYy5jQnVmZmVycyAgICAgPSA1OwpAQCAtNDc5LDYgKzQ5MywxMCBAQAogICAgIFRpbWVTdGFtcCBleHBpcnk7IC8qIEZvciBXaW5kb3dzIDl4IGNvbXBhdGliaWxpdHkgb2YgU1NQSSBjYWxscyAqLwogICAgIFRDSEFSICpzcG47CiAKKyAgICAvKiBmcmVlIHRoZSBjb3B5IG9mIHVzZXIvcGFzc3dkIHVzZWQgdG8gbWFrZSB0aGUgcHJldmlvdXMgaWRlbnRpdHkgKi8KKyAgICBDdXJsX3NhZmVmcmVlKGRpZ2VzdC0+dXNlcik7CisgICAgQ3VybF9zYWZlZnJlZShkaWdlc3QtPnBhc3N3ZCk7CisKICAgICBpZih1c2VycCAmJiAqdXNlcnApIHsKICAgICAgIC8qIFBvcHVsYXRlIG91ciBpZGVudGl0eSBzdHJ1Y3R1cmUgKi8KICAgICAgIGlmKEN1cmxfY3JlYXRlX3NzcGlfaWRlbnRpdHkodXNlcnAsIHBhc3N3ZHAsICZpZGVudGl0eSkpIHsKQEAgLTUwMCw2ICs1MTgsMjUgQEAKICAgICAgIC8qIFVzZSB0aGUgY3VycmVudCBXaW5kb3dzIHVzZXIgKi8KICAgICAgIHBfaWRlbnRpdHkgPSBOVUxMOwogCisgICAgaWYodXNlcnApIHsKKyAgICAgIGRpZ2VzdC0+dXNlciA9IHN0cmR1cCh1c2VycCk7CisKKyAgICAgIGlmKCFkaWdlc3QtPnVzZXIpIHsKKyAgICAgICAgZnJlZShvdXRwdXRfdG9rZW4pOworICAgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZihwYXNzd2RwKSB7CisgICAgICBkaWdlc3QtPnBhc3N3ZCA9IHN0cmR1cChwYXNzd2RwKTsKKworICAgICAgaWYoIWRpZ2VzdC0+cGFzc3dkKSB7CisgICAgICAgIGZyZWUob3V0cHV0X3Rva2VuKTsKKyAgICAgICAgQ3VybF9zYWZlZnJlZShkaWdlc3QtPnVzZXIpOworICAgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKKyAgICAgIH0KKyAgICB9CisKICAgICAvKiBBY3F1aXJlIG91ciBjcmVkZW50aWFscyBoYW5kbGUgKi8KICAgICBzdGF0dXMgPSBzX3BTZWNGbi0+QWNxdWlyZUNyZWRlbnRpYWxzSGFuZGxlKE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVENIQVIgKikgVEVYVChTUF9OQU1FX0RJR0VTVCksCkBAIC02MjMsNiArNjYwLDEwIEBACiAgICAgc19wU2VjRm4tPkRlbGV0ZVNlY3VyaXR5Q29udGV4dChkaWdlc3QtPmh0dHBfY29udGV4dCk7CiAgICAgQ3VybF9zYWZlZnJlZShkaWdlc3QtPmh0dHBfY29udGV4dCk7CiAgIH0KKworICAvKiBGcmVlIHRoZSBjb3B5IG9mIHVzZXIvcGFzc3dkIHVzZWQgdG8gbWFrZSB0aGUgaWRlbnRpdHkgZm9yIGh0dHBfY29udGV4dCAqLworICBDdXJsX3NhZmVmcmVlKGRpZ2VzdC0+dXNlcik7CisgIEN1cmxfc2FmZWZyZWUoZGlnZXN0LT5wYXNzd2QpOwogfQogCiAjZW5kaWYgLyogVVNFX1dJTkRPV1NfU1NQSSAmJiAhQ1VSTF9ESVNBQkxFX0NSWVBUT19BVVRIICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92YXV0aC9udGxtLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92YXV0aC9udGxtLmMKaW5kZXggNDIxOTY0NS4uNTBkOTIyMiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdmF1dGgvbnRsbS5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3ZhdXRoL250bG0uYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtNDQsNyArNDQsOSBAQAogI2luY2x1ZGUgInJhbmQuaCIKICNpbmNsdWRlICJ2dGxzL3Z0bHMuaCIKIAotI2lmZGVmIFVTRV9OU1MKKy8qIFNTTCBiYWNrZW5kLXNwZWNpZmljICNpZiBicmFuY2hlcyBpbiB0aGlzIGZpbGUgbXVzdCBiZSBrZXB0IGluIHRoZSBvcmRlcgorICAgZG9jdW1lbnRlZCBpbiBjdXJsX250bG1fY29yZS4gKi8KKyNpZiBkZWZpbmVkKE5UTE1fTkVFRFNfTlNTX0lOSVQpCiAjaW5jbHVkZSAidnRscy9uc3NnLmgiIC8qIGZvciBDdXJsX25zc19mb3JjZV9pbml0KCkgKi8KICNlbmRpZgogCkBAIC0yNzIsNyArMjc0LDcgQEAKICAgdW5zaWduZWQgY2hhciAqdHlwZTIgPSBOVUxMOwogICBzaXplX3QgdHlwZTJfbGVuID0gMDsKIAotI2lmIGRlZmluZWQoVVNFX05TUykKKyNpZiBkZWZpbmVkKE5UTE1fTkVFRFNfTlNTX0lOSVQpCiAgIC8qIE1ha2Ugc3VyZSB0aGUgY3J5cHRvIGJhY2tlbmQgaXMgaW5pdGlhbGl6ZWQgKi8KICAgcmVzdWx0ID0gQ3VybF9uc3NfZm9yY2VfaW5pdChkYXRhKTsKICAgaWYocmVzdWx0KQpAQCAtMzUwLDYgKzM1Miw3IEBACiAgKgogICogUGFyYW1ldGVyczoKICAqCisgKiBkYXRhICAgIFtpbl0gICAgIC0gVGhlIHNlc3Npb24gaGFuZGxlLgogICogdXNlcnAgICBbaW5dICAgICAtIFRoZSB1c2VyIG5hbWUgaW4gdGhlIGZvcm1hdCBVc2VyIG9yIERvbWFpblxVc2VyLgogICogcGFzc2R3cCBbaW5dICAgICAtIFRoZSB1c2VyJ3MgcGFzc3dvcmQuCiAgKiBudGxtICAgIFtpbi9vdXRdIC0gVGhlIE5UTE0gZGF0YSBzdHJ1Y3QgYmVpbmcgdXNlZCBhbmQgbW9kaWZpZWQuCkBAIC0zNTksNyArMzYyLDggQEAKICAqCiAgKiBSZXR1cm5zIENVUkxFX09LIG9uIHN1Y2Nlc3MuCiAgKi8KLUNVUkxjb2RlIEN1cmxfYXV0aF9jcmVhdGVfbnRsbV90eXBlMV9tZXNzYWdlKGNvbnN0IGNoYXIgKnVzZXJwLAorQ1VSTGNvZGUgQ3VybF9hdXRoX2NyZWF0ZV9udGxtX3R5cGUxX21lc3NhZ2Uoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVzZXJwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGFzc3dkcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBudGxtZGF0YSAqbnRsbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipvdXRwdHIsIHNpemVfdCAqb3V0bGVuKQpAQCAtNDU4LDcgKzQ2Miw3IEBACiAgIH0pOwogCiAgIC8qIFJldHVybiB3aXRoIGJpbmFyeSBibG9iIGVuY29kZWQgaW50byBiYXNlNjQgKi8KLSAgcmV0dXJuIEN1cmxfYmFzZTY0X2VuY29kZShOVUxMLCAoY2hhciAqKW50bG1idWYsIHNpemUsIG91dHB0ciwgb3V0bGVuKTsKKyAgcmV0dXJuIEN1cmxfYmFzZTY0X2VuY29kZShkYXRhLCAoY2hhciAqKW50bG1idWYsIHNpemUsIG91dHB0ciwgb3V0bGVuKTsKIH0KIAogLyoKQEAgLTgyNyw3ICs4MzEsNyBAQAogICAgIHJldHVybiBDVVJMRV9DT05WX0ZBSUxFRDsKIAogICAvKiBSZXR1cm4gd2l0aCBiaW5hcnkgYmxvYiBlbmNvZGVkIGludG8gYmFzZTY0ICovCi0gIHJlc3VsdCA9IEN1cmxfYmFzZTY0X2VuY29kZShOVUxMLCAoY2hhciAqKW50bG1idWYsIHNpemUsIG91dHB0ciwgb3V0bGVuKTsKKyAgcmVzdWx0ID0gQ3VybF9iYXNlNjRfZW5jb2RlKGRhdGEsIChjaGFyICopbnRsbWJ1Ziwgc2l6ZSwgb3V0cHRyLCBvdXRsZW4pOwogCiAgIEN1cmxfYXV0aF9udGxtX2NsZWFudXAobnRsbSk7CiAKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3ZhdXRoL250bG1fc3NwaS5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdmF1dGgvbnRsbV9zc3BpLmMKaW5kZXggYzMzMDUxNy4uZTc0OGNlMyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdmF1dGgvbnRsbV9zc3BpLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdmF1dGgvbnRsbV9zc3BpLmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJ2YXV0aC92YXV0aC5oIgogI2luY2x1ZGUgInVybGRhdGEuaCIKICNpbmNsdWRlICJjdXJsX2Jhc2U2NC5oIgorI2luY2x1ZGUgImN1cmxfbnRsbV9jb3JlLmgiCiAjaW5jbHVkZSAid2Fybmxlc3MuaCIKICNpbmNsdWRlICJjdXJsX211bHRpYnl0ZS5oIgogI2luY2x1ZGUgInNlbmRmLmgiCkBAIC02Niw2ICs2Nyw3IEBACiAgKgogICogUGFyYW1ldGVyczoKICAqCisgKiBkYXRhICAgIFtpbl0gICAgIC0gVGhlIHNlc3Npb24gaGFuZGxlLgogICogdXNlcnAgICBbaW5dICAgICAtIFRoZSB1c2VyIG5hbWUgaW4gdGhlIGZvcm1hdCBVc2VyIG9yIERvbWFpblxVc2VyLgogICogcGFzc2R3cCBbaW5dICAgICAtIFRoZSB1c2VyJ3MgcGFzc3dvcmQuCiAgKiBudGxtICAgIFtpbi9vdXRdIC0gVGhlIE5UTE0gZGF0YSBzdHJ1Y3QgYmVpbmcgdXNlZCBhbmQgbW9kaWZpZWQuCkBAIC03NSw3ICs3Nyw4IEBACiAgKgogICogUmV0dXJucyBDVVJMRV9PSyBvbiBzdWNjZXNzLgogICovCi1DVVJMY29kZSBDdXJsX2F1dGhfY3JlYXRlX250bG1fdHlwZTFfbWVzc2FnZShjb25zdCBjaGFyICp1c2VycCwKK0NVUkxjb2RlIEN1cmxfYXV0aF9jcmVhdGVfbnRsbV90eXBlMV9tZXNzYWdlKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1c2VycCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhc3N3ZHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbnRsbWRhdGEgKm50bG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqb3V0cHRyLCBzaXplX3QgKm91dGxlbikKQEAgLTE2Niw3ICsxNjksNyBAQAogICAgIHJldHVybiBDVVJMRV9SRUNWX0VSUk9SOwogCiAgIC8qIEJhc2U2NCBlbmNvZGUgdGhlIHJlc3BvbnNlICovCi0gIHJldHVybiBDdXJsX2Jhc2U2NF9lbmNvZGUoTlVMTCwgKGNoYXIgKikgbnRsbS0+b3V0cHV0X3Rva2VuLAorICByZXR1cm4gQ3VybF9iYXNlNjRfZW5jb2RlKGRhdGEsIChjaGFyICopIG50bG0tPm91dHB1dF90b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlXzFfYnVmLmNiQnVmZmVyLCBvdXRwdHIsIG91dGxlbik7CiB9CiAKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3ZhdXRoL3NwbmVnb19nc3NhcGkuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3ZhdXRoL3NwbmVnb19nc3NhcGkuYwppbmRleCA4ODQwZGI4Li41MTk2YzI3IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92YXV0aC9zcG5lZ29fZ3NzYXBpLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdmF1dGgvc3BuZWdvX2dzc2FwaS5jCkBAIC0xODAsNiArMTgwLDEwIEBACiAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CiAgIH0KIAorICAvKiBGcmVlIHByZXZpb3VzIHRva2VuICovCisgIGlmKG5lZ28tPm91dHB1dF90b2tlbi5sZW5ndGggJiYgbmVnby0+b3V0cHV0X3Rva2VuLnZhbHVlKQorICAgIGdzc19yZWxlYXNlX2J1ZmZlcigmdW51c2VkX3N0YXR1cywgJm5lZ28tPm91dHB1dF90b2tlbik7CisKICAgbmVnby0+b3V0cHV0X3Rva2VuID0gb3V0cHV0X3Rva2VuOwogCiAgIHJldHVybiBDVVJMRV9PSzsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3ZhdXRoL3ZhdXRoLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92YXV0aC92YXV0aC5oCmluZGV4IDlkNjEyMjguLmRmYWY5ODUgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3ZhdXRoL3ZhdXRoLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdmF1dGgvdmF1dGguaApAQCAtNyw3ICs3LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgLSAyMDE2LCBTdGV2ZSBIb2xtZSwgPHN0ZXZlX2hvbG1lQGhvdG1haWwuY29tPi4KKyAqIENvcHlyaWdodCAoQykgMjAxNCAtIDIwMTcsIFN0ZXZlIEhvbG1lLCA8c3RldmVfaG9sbWVAaG90bWFpbC5jb20+LgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC0xMTksNyArMTE5LDggQEAKIGJvb2wgQ3VybF9hdXRoX2lzX250bG1fc3VwcG9ydGVkKHZvaWQpOwogCiAvKiBUaGlzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgYSBiYXNlNjQgZW5jb2RlZCBOVExNIHR5cGUtMSBtZXNzYWdlICovCi1DVVJMY29kZSBDdXJsX2F1dGhfY3JlYXRlX250bG1fdHlwZTFfbWVzc2FnZShjb25zdCBjaGFyICp1c2VycCwKK0NVUkxjb2RlIEN1cmxfYXV0aF9jcmVhdGVfbnRsbV90eXBlMV9tZXNzYWdlKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1c2VycCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhc3N3ZHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbnRsbWRhdGEgKm50bG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqb3V0cHRyLApkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdmVyc2lvbi5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdmVyc2lvbi5jCmluZGV4IDNkMTc3NjguLmViZDYwMDYgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3ZlcnNpb24uYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92ZXJzaW9uLmMKQEAgLTMyNCw4ICszMjQsOCBAQAogI2lmIGRlZmluZWQoVVNFX0xJQlBTTCkKICAgfCBDVVJMX1ZFUlNJT05fUFNMCiAjZW5kaWYKLSNpZiBkZWZpbmVkKEhUVFBTX1BST1hZX1NVUFBPUlQpCi0gIHwgQ1VSTF9WRVJTSU9OX0hUVFBTX1BST1hZCisjaWYgZGVmaW5lZChDVVJMX1dJVEhfTVVMVElfU1NMKQorICB8IENVUkxfVkVSU0lPTl9NVUxUSV9TU0wKICNlbmRpZgogICAsCiAgIE5VTEwsIC8qIHNzbF92ZXJzaW9uICovCkBAIC0zNTUsNiArMzU1LDEwIEBACiAjaWZkZWYgVVNFX1NTTAogICBDdXJsX3NzbF92ZXJzaW9uKHNzbF9idWZmZXIsIHNpemVvZihzc2xfYnVmZmVyKSk7CiAgIHZlcnNpb25faW5mby5zc2xfdmVyc2lvbiA9IHNzbF9idWZmZXI7CisgIGlmKEN1cmxfc3NsLT5zdXBwb3J0X2h0dHBzX3Byb3h5KQorICAgIHZlcnNpb25faW5mby5mZWF0dXJlcyB8PSBDVVJMX1ZFUlNJT05fSFRUUFNfUFJPWFk7CisgIGVsc2UKKyAgICB2ZXJzaW9uX2luZm8uZmVhdHVyZXMgJj0gfkNVUkxfVkVSU0lPTl9IVFRQU19QUk9YWTsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9MSUJaCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2F4dGxzLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2F4dGxzLmMKaW5kZXggZjBlMzc2Ni4uNmI0MjcwOCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9heHRscy5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvYXh0bHMuYwpAQCAtNDcsMjEgKzQ3LDEyIEBACiAjaW5jbHVkZSAiY3VybF9tZW1vcnkuaCIKICNpbmNsdWRlICJtZW1kZWJ1Zy5oIgogCitzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSB7CisgIFNTTF9DVFgqIHNzbF9jdHg7CisgIFNTTCogICAgIHNzbDsKK307CiAKLS8qIEdsb2JhbCBheFRMUyBpbml0LCBjYWxsZWQgZnJvbSBDdXJsX3NzbF9pbml0KCkgKi8KLWludCBDdXJsX2F4dGxzX2luaXQodm9pZCkKLXsKLS8qIGF4VExTIGhhcyBubyBnbG9iYWwgaW5pdC4gIEV2ZXJ5dGhpbmcgaXMgZG9uZSB0aHJvdWdoIFNTTCBhbmQgU1NMX0NUWAotICogc3RydWN0cyBzdG9yZWQgaW4gY29ubmVjdGRhdGEgc3RydWN0dXJlLiAgUGVyaGFwcyBjYW4gbW92ZSB0byBheHRscy5oLgotICovCi0gIHJldHVybiAxOwotfQotCi1pbnQgQ3VybF9heHRsc19jbGVhbnVwKHZvaWQpCi17Ci0gIC8qIGF4VExTIGhhcyBubyBnbG9iYWwgY2xlYW51cC4gIFBlcmhhcHMgY2FuIG1vdmUgdGhpcyB0byBheHRscy5oLiAqLwotICByZXR1cm4gMTsKLX0KKyNkZWZpbmUgQkFDS0VORCBjb25uc3NsLT5iYWNrZW5kCiAKIHN0YXRpYyBDVVJMY29kZSBtYXBfZXJyb3JfdG9fY3VybChpbnQgYXh0bHNfZXJyKQogewpAQCAtMTIwLDEzICsxMTEsMTMgQEAKIAogc3RhdGljIHZvaWQgZnJlZV9zc2xfc3RydWN0cyhzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCkKIHsKLSAgaWYoY29ubnNzbC0+c3NsKSB7Ci0gICAgc3NsX2ZyZWUoY29ubnNzbC0+c3NsKTsKLSAgICBjb25uc3NsLT5zc2wgPSBOVUxMOworICBpZihCQUNLRU5ELT5zc2wpIHsKKyAgICBzc2xfZnJlZShCQUNLRU5ELT5zc2wpOworICAgIEJBQ0tFTkQtPnNzbCA9IE5VTEw7CiAgIH0KLSAgaWYoY29ubnNzbC0+c3NsX2N0eCkgewotICAgIHNzbF9jdHhfZnJlZShjb25uc3NsLT5zc2xfY3R4KTsKLSAgICBjb25uc3NsLT5zc2xfY3R4ID0gTlVMTDsKKyAgaWYoQkFDS0VORC0+c3NsX2N0eCkgeworICAgIHNzbF9jdHhfZnJlZShCQUNLRU5ELT5zc2xfY3R4KTsKKyAgICBCQUNLRU5ELT5zc2xfY3R4ID0gTlVMTDsKICAgfQogfQogCkBAIC0xMzcsNiArMTI4LDcgQEAKICAqLwogc3RhdGljIENVUkxjb2RlIGNvbm5lY3RfcHJlcChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKICAgU1NMX0NUWCAqc3NsX2N0eDsKICAgU1NMICpzc2wgPSBOVUxMOwpAQCAtMTUxLDcgKzE0Myw3IEBACiAgICAgU1NMX1NFUlZFUl9WRVJJRllfTEFURVIgfAogICAgIFNTTF9DT05ORUNUX0lOX1BBUlRTOwogCi0gIGlmKGNvbm4tPnNzbFtzb2NraW5kZXhdLnN0YXRlID09IHNzbF9jb25uZWN0aW9uX2NvbXBsZXRlKQorICBpZihjb25uc3NsLT5zdGF0ZSA9PSBzc2xfY29ubmVjdGlvbl9jb21wbGV0ZSkKICAgICAvKiB0byBtYWtlIHVzIHRvbGVyYW50IGFnYWluc3QgYmVpbmcgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGZvciB0aGUKICAgICAgICBzYW1lIGNvbm5lY3Rpb24gKi8KICAgICByZXR1cm4gQ1VSTEVfT0s7CkBAIC0xODUsOCArMTc3LDggQEAKICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CiAgIH0KIAotICBjb25uLT5zc2xbc29ja2luZGV4XS5zc2xfY3R4ID0gc3NsX2N0eDsKLSAgY29ubi0+c3NsW3NvY2tpbmRleF0uc3NsID0gTlVMTDsKKyAgQkFDS0VORC0+c3NsX2N0eCA9IHNzbF9jdHg7CisgIEJBQ0tFTkQtPnNzbCA9IE5VTEw7CiAKICAgLyogTG9hZCB0aGUgdHJ1c3RlZCBDQSBjZXJ0IGJ1bmRsZSBmaWxlICovCiAgIGlmKFNTTF9DT05OX0NPTkZJRyhDQWZpbGUpKSB7CkBAIC0yMTIsNyArMjA0LDcgQEAKIAogICAvKiBMb2FkIGNsaWVudCBjZXJ0aWZpY2F0ZSAqLwogICBpZihTU0xfU0VUX09QVElPTihjZXJ0KSkgewotICAgIGk9MDsKKyAgICBpID0gMDsKICAgICAvKiBJbnN0ZWFkIG9mIHRyeWluZyB0byBhbmFseXplIGNlcnQgdHlwZSBoZXJlLCBsZXQgYXhUTFMgdHJ5IHRoZW0gYWxsLiAqLwogICAgIHdoaWxlKGNlcnRfdHlwZXNbaV0gIT0gMCkgewogICAgICAgc3NsX2Zjbl9yZXR1cm4gPSBzc2xfb2JqX2xvYWQoc3NsX2N0eCwgY2VydF90eXBlc1tpXSwKQEAgLTIzNiw3ICsyMjgsNyBAQAogICAgICBJZiBhIHBrY3MxMiBmaWxlIHN1Y2Nlc3NmdWxseSBsb2FkZWQgYSBjZXJ0LCB0aGVuIHRoZXJlJ3Mgbm90aGluZyB0byBkbwogICAgICBiZWNhdXNlIHRoZSBrZXkgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQuICovCiAgIGlmKFNTTF9TRVRfT1BUSU9OKGtleSkgJiYgY2VydF90eXBlc1tpXSAhPSBTU0xfT0JKX1BLQ1MxMikgewotICAgIGk9MDsKKyAgICBpID0gMDsKICAgICAvKiBJbnN0ZWFkIG9mIHRyeWluZyB0byBhbmFseXplIGtleSB0eXBlIGhlcmUsIGxldCBheFRMUyB0cnkgdGhlbSBhbGwuICovCiAgICAgd2hpbGUoa2V5X3R5cGVzW2ldICE9IDApIHsKICAgICAgIHNzbF9mY25fcmV0dXJuID0gc3NsX29ial9sb2FkKHNzbF9jdHgsIGtleV90eXBlc1tpXSwKQEAgLTI4MSwxMCArMjczLDI2IEBACiAgIGlmKCFzc2wpCiAgICAgc3NsID0gc3NsX2NsaWVudF9uZXcoc3NsX2N0eCwgY29ubi0+c29ja1tzb2NraW5kZXhdLCBOVUxMLCAwLCBOVUxMKTsKIAotICBjb25uLT5zc2xbc29ja2luZGV4XS5zc2wgPSBzc2w7CisgIEJBQ0tFTkQtPnNzbCA9IHNzbDsKICAgcmV0dXJuIENVUkxFX09LOwogfQogCitzdGF0aWMgdm9pZCBDdXJsX2F4dGxzX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKK3sKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CisKKyAgaW5mb2YoY29ubi0+ZGF0YSwgIiAgQ3VybF9heHRsc19jbG9zZVxuIik7CisKKyAgICAvKiBsaW5lIGZyb20gb3BlbnNzbC5jOiAodm9pZClTU0xfc2h1dGRvd24oQkFDS0VORC0+c3NsKTsKKyAgICAgICBheFRMUyBjb21wYXQgbGF5ZXIgZG9lcyBub3RoaW5nIGZvciBTU0xfc2h1dGRvd24gKi8KKworICAgIC8qIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBmcm9tIG9wZW5zc2wuYy4gIFRoZXJlIHNlZW1zIHRvIGJlIG5vIGF4VExTCisgICAgICAgZXF1aXZhbGVudC4gIHNzbF9mcmVlIGFuZCBzc2xfY3R4X2ZyZWUgY2xvc2UgdGhpbmdzLgorICAgICAgIFNTTF9zZXRfY29ubmVjdF9zdGF0ZShjb25uc3NsLT5oYW5kbGUpOyAqLworCisgIGZyZWVfc3NsX3N0cnVjdHMoY29ubnNzbCk7Cit9CisKIC8qCiAgKiBGb3IgYm90aCBibG9ja2luZyBhbmQgbm9uLWJsb2NraW5nIGNvbm5lY3RzLCB0aGlzIGZ1bmN0aW9uIGZpbmFsaXplcyB0aGUKICAqIFNTTCBjb25uZWN0aW9uLgpAQCAtMjkyLDcgKzMwMCw4IEBACiBzdGF0aWMgQ1VSTGNvZGUgY29ubmVjdF9maW5pc2goc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQogewogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKLSAgU1NMICpzc2wgPSBjb25uLT5zc2xbc29ja2luZGV4XS5zc2w7CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOworICBTU0wgKnNzbCA9IEJBQ0tFTkQtPnNzbDsKICAgY29uc3QgY2hhciAqcGVlcl9DTjsKICAgdWludDMyX3QgZG5zX2FsdG5hbWVfaW5kZXg7CiAgIGNvbnN0IGNoYXIgKmRuc19hbHRuYW1lOwpAQCAtMzg3LDcgKzM5Niw3IEBACiAgIH0KIAogICAvKiBHZW5lcmFsIGhvdXNla2VlcGluZyAqLwotICBjb25uLT5zc2xbc29ja2luZGV4XS5zdGF0ZSA9IHNzbF9jb25uZWN0aW9uX2NvbXBsZXRlOworICBjb25uc3NsLT5zdGF0ZSA9IHNzbF9jb25uZWN0aW9uX2NvbXBsZXRlOwogICBjb25uLT5yZWN2W3NvY2tpbmRleF0gPSBheHRsc19yZWN2OwogICBjb25uLT5zZW5kW3NvY2tpbmRleF0gPSBheHRsc19zZW5kOwogCkBAIC00MDksMTEgKzQxOCwxMCBAQAogICogVXNlIGF4VExTJ3Mgbm9uLWJsb2NraW5nIGNvbm5lY3Rpb24gZmVhdHVyZSB0byBvcGVuIGFuIFNTTCBjb25uZWN0aW9uLgogICogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYSBUQ1AgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGVzdGFibGlzaGVkLgogICovCi1DVVJMY29kZSBDdXJsX2F4dGxzX2Nvbm5lY3Rfbm9uYmxvY2tpbmcoCi0gICAgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgIGludCBzb2NraW5kZXgsCi0gICAgYm9vbCAqZG9uZSkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX2F4dGxzX2Nvbm5lY3Rfbm9uYmxvY2tpbmcoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LCBib29sICpkb25lKQogeworICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKICAgQ1VSTGNvZGUgY29ubl9zdGVwOwogICBpbnQgc3NsX2Zjbl9yZXR1cm47CiAgIGludCBpOwpAQCAtNDIxLDIzICs0MjksMjMgQEAKICAqZG9uZSA9IEZBTFNFOwogICAvKiBjb25uZWN0ZGF0YSBpcyBjYWxsb2MnZCBhbmQgY29ubmVjdGluZ19zdGF0ZSBpcyBvbmx5IGNoYW5nZWQgaW4gdGhpcwogICAgICBmdW5jdGlvbiwgc28gdGhpcyBpcyBzYWZlLCBhcyB0aGUgc3RhdGUgaXMgZWZmZWN0aXZlbHkgaW5pdGlhbGl6ZWQuICovCi0gIGlmKGNvbm4tPnNzbFtzb2NraW5kZXhdLmNvbm5lY3Rpbmdfc3RhdGUgPT0gc3NsX2Nvbm5lY3RfMSkgeworICBpZihjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID09IHNzbF9jb25uZWN0XzEpIHsKICAgICBjb25uX3N0ZXAgPSBjb25uZWN0X3ByZXAoY29ubiwgc29ja2luZGV4KTsKICAgICBpZihjb25uX3N0ZXAgIT0gQ1VSTEVfT0spIHsKICAgICAgIEN1cmxfYXh0bHNfY2xvc2UoY29ubiwgc29ja2luZGV4KTsKICAgICAgIHJldHVybiBjb25uX3N0ZXA7CiAgICAgfQotICAgIGNvbm4tPnNzbFtzb2NraW5kZXhdLmNvbm5lY3Rpbmdfc3RhdGUgPSBzc2xfY29ubmVjdF8yOworICAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPSBzc2xfY29ubmVjdF8yOwogICB9CiAKLSAgaWYoY29ubi0+c3NsW3NvY2tpbmRleF0uY29ubmVjdGluZ19zdGF0ZSA9PSBzc2xfY29ubmVjdF8yKSB7CisgIGlmKGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPT0gc3NsX2Nvbm5lY3RfMikgewogICAgIC8qIENoZWNrIHRvIG1ha2Ugc3VyZSBoYW5kc2hha2Ugd2FzIG9rLiAqLwotICAgIGlmKHNzbF9oYW5kc2hha2Vfc3RhdHVzKGNvbm4tPnNzbFtzb2NraW5kZXhdLnNzbCkgIT0gU1NMX09LKSB7CisgICAgaWYoc3NsX2hhbmRzaGFrZV9zdGF0dXMoQkFDS0VORC0+c3NsKSAhPSBTU0xfT0spIHsKICAgICAgIC8qIExvb3AgdG8gcGVyZm9ybSBtb3JlIHdvcmsgaW4gYmV0d2VlbiBzbGVlcHMuIFRoaXMgaXMgd29yayBhcm91bmQgdGhlCiAgICAgICAgICBmYWN0IHRoYXQgYXh0bHMgZG9lcyBub3QgZXhwb3NlIGFueSBrbm93bGVkZ2UgYWJvdXQgd2hlbiB3b3JrIG5lZWRzCiAgICAgICAgICB0byBiZSBwZXJmb3JtZWQuIFRoaXMgY2FuIHNhdmUgfjI1JSBvZiB0aW1lIG9uIFNTTCBoYW5kc2hha2VzLiAqLwotICAgICAgZm9yKGk9MDsgaTw1OyBpKyspIHsKLSAgICAgICAgc3NsX2Zjbl9yZXR1cm4gPSBzc2xfcmVhZChjb25uLT5zc2xbc29ja2luZGV4XS5zc2wsIE5VTEwpOworICAgICAgZm9yKGkgPSAwOyBpPDU7IGkrKykgeworICAgICAgICBzc2xfZmNuX3JldHVybiA9IHNzbF9yZWFkKEJBQ0tFTkQtPnNzbCwgTlVMTCk7CiAgICAgICAgIGlmKHNzbF9mY25fcmV0dXJuIDwgMCkgewogICAgICAgICAgIEN1cmxfYXh0bHNfY2xvc2UoY29ubiwgc29ja2luZGV4KTsKICAgICAgICAgICBzc2xfZGlzcGxheV9lcnJvcihzc2xfZmNuX3JldHVybik7IC8qIGdvZXMgdG8gc3Rkb3V0LiAqLwpAQCAtNDQ3LDEwICs0NTUsMTAgQEAKICAgICAgIH0KICAgICB9CiAgICAgaW5mb2YoY29ubi0+ZGF0YSwgImhhbmRzaGFrZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKLSAgICBjb25uLT5zc2xbc29ja2luZGV4XS5jb25uZWN0aW5nX3N0YXRlID0gc3NsX2Nvbm5lY3RfMzsKKyAgICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID0gc3NsX2Nvbm5lY3RfMzsKICAgfQogCi0gIGlmKGNvbm4tPnNzbFtzb2NraW5kZXhdLmNvbm5lY3Rpbmdfc3RhdGUgPT0gc3NsX2Nvbm5lY3RfMykgeworICBpZihjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID09IHNzbF9jb25uZWN0XzMpIHsKICAgICBjb25uX3N0ZXAgPSBjb25uZWN0X2ZpbmlzaChjb25uLCBzb2NraW5kZXgpOwogICAgIGlmKGNvbm5fc3RlcCAhPSBDVVJMRV9PSykgewogICAgICAgQ3VybF9heHRsc19jbG9zZShjb25uLCBzb2NraW5kZXgpOwpAQCAtNDU4LDE1ICs0NjYsMTUgQEAKICAgICB9CiAKICAgICAvKiBSZXNldCBjb25uZWN0IHN0YXRlICovCi0gICAgY29ubi0+c3NsW3NvY2tpbmRleF0uY29ubmVjdGluZ19zdGF0ZSA9IHNzbF9jb25uZWN0XzE7CisgICAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9IHNzbF9jb25uZWN0XzE7CiAKICAgICAqZG9uZSA9IFRSVUU7CiAgICAgcmV0dXJuIENVUkxFX09LOwogICB9CiAKICAgLyogVW5yZWNvZ25pemVkIHN0YXRlLiAgVGhpbmdzIGFyZSB2ZXJ5IGJhZC4gKi8KLSAgY29ubi0+c3NsW3NvY2tpbmRleF0uc3RhdGUgID0gc3NsX2Nvbm5lY3Rpb25fbm9uZTsKLSAgY29ubi0+c3NsW3NvY2tpbmRleF0uY29ubmVjdGluZ19zdGF0ZSA9IHNzbF9jb25uZWN0XzE7CisgIGNvbm5zc2wtPnN0YXRlICA9IHNzbF9jb25uZWN0aW9uX25vbmU7CisgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPSBzc2xfY29ubmVjdF8xOwogICAvKiBSZXR1cm4gdmFsdWUgcGVyaGFwcyBub3Qgc3RyaWN0bHkgY29ycmVjdCwgYnV0IGRpc3Rpbmd1aXNoZXMgdGhlIGlzc3VlLiovCiAgIHJldHVybiBDVVJMRV9CQURfRlVOQ1RJT05fQVJHVU1FTlQ7CiB9CkBAIC00NzYsMTUgKzQ4NCwxMyBAQAogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIFRDUCBjb25uZWN0IGhhcyBjb21wbGV0ZWQuIFNldHVwIHRoZSBUTFMKICAqIGxheWVyIGFuZCBkbyBhbGwgbmVjZXNzYXJ5IG1hZ2ljIGZvciBhIGJsb2NraW5nIGNvbm5lY3QuCiAgKi8KLUNVUkxjb2RlCi1DdXJsX2F4dGxzX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCkKLQorc3RhdGljIENVUkxjb2RlIEN1cmxfYXh0bHNfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBDVVJMY29kZSBjb25uX3N0ZXAgPSBjb25uZWN0X3ByZXAoY29ubiwgc29ja2luZGV4KTsKICAgaW50IHNzbF9mY25fcmV0dXJuOwotICBTU0wgKnNzbCA9IGNvbm4tPnNzbFtzb2NraW5kZXhdLnNzbDsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CisgIFNTTCAqc3NsID0gQkFDS0VORC0+c3NsOwogICBsb25nIHRpbWVvdXRfbXM7CiAKICAgaWYoY29ubl9zdGVwICE9IENVUkxFX09LKSB7CkBAIC01MzAsOCArNTM2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTGNvZGUgKmVycikKIHsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CiAgIC8qIHNzbF93cml0ZSgpIHJldHVybnMgJ2ludCcgd2hpbGUgd3JpdGUoKSBhbmQgc2VuZCgpIHJldHVybnMgJ3NpemVfdCcgKi8KLSAgaW50IHJjID0gc3NsX3dyaXRlKGNvbm4tPnNzbFtzb2NraW5kZXhdLnNzbCwgbWVtLCAoaW50KWxlbik7CisgIGludCByYyA9IHNzbF93cml0ZShCQUNLRU5ELT5zc2wsIG1lbSwgKGludClsZW4pOwogCiAgIGluZm9mKGNvbm4tPmRhdGEsICIgIGF4dGxzX3NlbmRcbiIpOwogCkBAIC01NDQsMjcgKzU1MSwxMSBAQAogICByZXR1cm4gcmM7CiB9CiAKLXZvaWQgQ3VybF9heHRsc19jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCi17Ci0gIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwotCi0gIGluZm9mKGNvbm4tPmRhdGEsICIgIEN1cmxfYXh0bHNfY2xvc2VcbiIpOwotCi0gICAgLyogbGluZSBmcm9tIG9wZW5zc2wuYzogKHZvaWQpU1NMX3NodXRkb3duKGNvbm5zc2wtPnNzbCk7Ci0gICAgICAgYXhUTFMgY29tcGF0IGxheWVyIGRvZXMgbm90aGluZyBmb3IgU1NMX3NodXRkb3duICovCi0KLSAgICAvKiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgZnJvbSBvcGVuc3NsLmMuICBUaGVyZSBzZWVtcyB0byBiZSBubyBheFRMUwotICAgICAgIGVxdWl2YWxlbnQuICBzc2xfZnJlZSBhbmQgc3NsX2N0eF9mcmVlIGNsb3NlIHRoaW5ncy4KLSAgICAgICBTU0xfc2V0X2Nvbm5lY3Rfc3RhdGUoY29ubnNzbC0+aGFuZGxlKTsgKi8KLQotICBmcmVlX3NzbF9zdHJ1Y3RzKGNvbm5zc2wpOwotfQotCiAvKgogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2h1dCBkb3duIHRoZSBTU0wgbGF5ZXIgYnV0IGtlZXAgdGhlCiAgKiBzb2NrZXQgb3BlbiAoQ0NDIC0gQ2xlYXIgQ29tbWFuZCBDaGFubmVsKQogICovCi1pbnQgQ3VybF9heHRsc19zaHV0ZG93bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCitzdGF0aWMgaW50IEN1cmxfYXh0bHNfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQogewogICAvKiBPdXRsaW5lIHRha2VuIGZyb20gb3BlbnNzbC5jIHNpbmNlIGZ1bmN0aW9ucyBhcmUgaW4gYXhUTFMgY29tcGF0IGxheWVyLgogICAgICBheFRMUydzIGVycm9yIHNldCBpcyBtdWNoIHNtYWxsZXIsIHNvIGEgbG90IG9mIGVycm9yLWhhbmRsaW5nIHdhcyByZW1vdmVkLgpAQCAtNTg0LDE3ICs1NzUsMTcgQEAKIAogICAvKiBheFRMUyBjb21wYXQgbGF5ZXIgZG9lcyBub3RoaW5nIGZvciBTU0xfc2h1dGRvd24sIHNvIHdlIGRvIG5vdGhpbmcgdG9vCiAgIGlmKGRhdGEtPnNldC5mdHBfY2NjID09IENVUkxGVFBTU0xfQ0NDX0FDVElWRSkKLSAgICAgICh2b2lkKVNTTF9zaHV0ZG93bihjb25uc3NsLT5zc2wpOworICAgICAgKHZvaWQpU1NMX3NodXRkb3duKEJBQ0tFTkQtPnNzbCk7CiAgICovCiAKLSAgaWYoY29ubnNzbC0+c3NsKSB7CisgIGlmKEJBQ0tFTkQtPnNzbCkgewogICAgIGludCB3aGF0ID0gU09DS0VUX1JFQURBQkxFKGNvbm4tPnNvY2tbc29ja2luZGV4XSwgU1NMX1NIVVRET1dOX1RJTUVPVVQpOwogICAgIGlmKHdoYXQgPiAwKSB7CiAgICAgICAvKiBTb21ldGhpbmcgdG8gcmVhZCwgbGV0J3MgZG8gaXQgYW5kIGhvcGUgdGhhdCBpdCBpcyB0aGUgY2xvc2UKICAgICAgICAgIG5vdGlmeSBhbGVydCBmcm9tIHRoZSBzZXJ2ZXIuICBidWYgaXMgbWFuYWdlZCBpbnRlcm5hbGx5IGJ5CiAgICAgICAgICBheFRMUyBhbmQgd2lsbCBiZSByZWxlYXNlZCB1cG9uIGNhbGxpbmcgc3NsX2ZyZWUgdmlhCiAgICAgICAgICBmcmVlX3NzbF9zdHJ1Y3RzLiAqLwotICAgICAgbnJlYWQgPSAoc3NpemVfdClzc2xfcmVhZChjb25uc3NsLT5zc2wsICZidWYpOworICAgICAgbnJlYWQgPSAoc3NpemVfdClzc2xfcmVhZChCQUNLRU5ELT5zc2wsICZidWYpOwogCiAgICAgICBpZihucmVhZCA8IFNTTF9PSykgewogICAgICAgICBmYWlsZihkYXRhLCAiY2xvc2Ugbm90aWZ5IGFsZXJ0IG5vdCByZWNlaXZlZCBkdXJpbmcgc2h1dGRvd24iKTsKQEAgLTYzMCw3ICs2MjEsNyBAQAogCiAgICplcnIgPSBDVVJMRV9PSzsKICAgaWYoY29ubnNzbCkgewotICAgIHJldCA9IHNzbF9yZWFkKGNvbm5zc2wtPnNzbCwgJnJlYWRfYnVmKTsKKyAgICByZXQgPSBzc2xfcmVhZChCQUNLRU5ELT5zc2wsICZyZWFkX2J1Zik7CiAgICAgaWYocmV0ID4gU1NMX09LKSB7CiAgICAgICAvKiBzc2xfcmVhZCByZXR1cm5zIFNTTF9PSyBpZiB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gcmVhZCwgc28gaWYgaXQgaXMKICAgICAgICAgIGxhcmdlciwgdGhlbiBhbGwgZGF0YSBoYXMgYmVlbiByZWFkIGFscmVhZHkuICAqLwpAQCAtNjYzLDkgKzY1NCwxMCBAQAogICogICAgIDAgbWVhbnMgdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkCiAgKiAgICAtMSBtZWFucyB0aGUgY29ubmVjdGlvbiBzdGF0dXMgaXMgdW5rbm93bgogICovCi1pbnQgQ3VybF9heHRsc19jaGVja19jeG4oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKQorc3RhdGljIGludCBDdXJsX2F4dGxzX2NoZWNrX2N4bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCiB7Ci0gIC8qIG9wZW5zc2wuYyBsaW5lOiByYyA9IFNTTF9wZWVrKGNvbm4tPnNzbFtGSVJTVFNPQ0tFVF0uc3NsLCAodm9pZCopJmJ1ZiwgMSk7CisgIC8qIG9wZW5zc2wuYyBsaW5lOgorICAgICByYyA9IFNTTF9wZWVrKGNvbm4tPnNzbFtGSVJTVFNPQ0tFVF0uYmFja2VuZC0+c3NsLCAodm9pZCopJmJ1ZiwgMSk7CiAgICAgIGF4VExTIGNvbXBhdCBsYXllciBhbHdheXMgcmV0dXJucyB0aGUgbGFzdCBhcmd1bWVudCwgc28gY29ubmVjdGlvbiBpcwogICAgICBhbHdheXMgYWxpdmU/ICovCiAKQEAgLTY3Myw3ICs2NjUsNyBAQAogICAgcmV0dXJuIDE7IC8qIGNvbm5lY3Rpb24gc3RpbGwgaW4gcGxhY2UgKi8KIH0KIAotdm9pZCBDdXJsX2F4dGxzX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpCitzdGF0aWMgdm9pZCBDdXJsX2F4dGxzX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpCiB7CiAgICh2b2lkKXB0cjsKICAgLyogZnJlZSB0aGUgSUQgKi8KQEAgLTY4MSwxNCArNjczLDEzIEBACiAgICAgIGNvbXBhdGliaWxpdHkgbGF5ZXIgZG9lcyBub3RoaW5nLCBzbyB3ZSBkbyBub3RoaW5nIHRvby4gKi8KIH0KIAotc2l6ZV90IEN1cmxfYXh0bHNfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQorc3RhdGljIHNpemVfdCBDdXJsX2F4dGxzX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKICAgcmV0dXJuIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgImF4VExTLyVzIiwgc3NsX3ZlcnNpb24oKSk7CiB9CiAKLUNVUkxjb2RlIEN1cmxfYXh0bHNfcmFuZG9tKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbnRyb3B5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX2F4dGxzX3JhbmRvbShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVudHJvcHksIHNpemVfdCBsZW5ndGgpCiB7CiAgIHN0YXRpYyBib29sIHNzbF9zZWVkZWQgPSBGQUxTRTsKICAgKHZvaWQpZGF0YTsKQEAgLTcwMyw0ICs2OTQsNDkgQEAKICAgcmV0dXJuIENVUkxFX09LOwogfQogCitzdGF0aWMgdm9pZCAqQ3VybF9heHRsc19nZXRfaW50ZXJuYWxzKHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMSU5GTyBpbmZvIFVOVVNFRF9QQVJBTSkKK3sKKyAgKHZvaWQpaW5mbzsKKyAgcmV0dXJuIEJBQ0tFTkQtPnNzbDsKK30KKworY29uc3Qgc3RydWN0IEN1cmxfc3NsIEN1cmxfc3NsX2F4dGxzID0geworICB7IENVUkxTU0xCQUNLRU5EX0FYVExTLCAiYXh0bHMiIH0sIC8qIGluZm8gKi8KKworICAwLCAvKiBoYXZlX2NhX3BhdGggKi8KKyAgMCwgLyogaGF2ZV9jZXJ0aW5mbyAqLworICAwLCAvKiBoYXZlX3Bpbm5lZHB1YmtleSAqLworICAwLCAvKiBoYXZlX3NzbF9jdHggKi8KKyAgMCwgLyogc3VwcG9ydF9odHRwc19wcm94eSAqLworCisgIHNpemVvZihzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSksCisKKyAgLyoKKyAgICogYXhUTFMgaGFzIG5vIGdsb2JhbCBpbml0LiAgRXZlcnl0aGluZyBpcyBkb25lIHRocm91Z2ggU1NMIGFuZCBTU0xfQ1RYCisgICAqIHN0cnVjdHMgc3RvcmVkIGluIGNvbm5lY3RkYXRhIHN0cnVjdHVyZS4KKyAgICovCisgIEN1cmxfbm9uZV9pbml0LCAgICAgICAgICAgICAgICAgLyogaW5pdCAqLworICAvKiBheFRMUyBoYXMgbm8gZ2xvYmFsIGNsZWFudXAuICovCisgIEN1cmxfbm9uZV9jbGVhbnVwLCAgICAgICAgICAgICAgLyogY2xlYW51cCAqLworICBDdXJsX2F4dGxzX3ZlcnNpb24sICAgICAgICAgICAgIC8qIHZlcnNpb24gKi8KKyAgQ3VybF9heHRsc19jaGVja19jeG4sICAgICAgICAgICAvKiBjaGVja19jeG4gKi8KKyAgQ3VybF9heHRsc19zaHV0ZG93biwgICAgICAgICAgICAvKiBzaHV0ZG93biAqLworICBDdXJsX25vbmVfZGF0YV9wZW5kaW5nLCAgICAgICAgIC8qIGRhdGFfcGVuZGluZyAqLworICBDdXJsX2F4dGxzX3JhbmRvbSwgICAgICAgICAgICAgIC8qIHJhbmRvbSAqLworICBDdXJsX25vbmVfY2VydF9zdGF0dXNfcmVxdWVzdCwgIC8qIGNlcnRfc3RhdHVzX3JlcXVlc3QgKi8KKyAgQ3VybF9heHRsc19jb25uZWN0LCAgICAgICAgICAgICAvKiBjb25uZWN0ICovCisgIEN1cmxfYXh0bHNfY29ubmVjdF9ub25ibG9ja2luZywgLyogY29ubmVjdF9ub25ibG9ja2luZyAqLworICBDdXJsX2F4dGxzX2dldF9pbnRlcm5hbHMsICAgICAgIC8qIGdldF9pbnRlcm5hbHMgKi8KKyAgQ3VybF9heHRsc19jbG9zZSwgICAgICAgICAgICAgICAvKiBjbG9zZSAqLworICBDdXJsX25vbmVfY2xvc2VfYWxsLCAgICAgICAgICAgIC8qIGNsb3NlX2FsbCAqLworICBDdXJsX2F4dGxzX3Nlc3Npb25fZnJlZSwgICAgICAgIC8qIHNlc3Npb25fZnJlZSAqLworICBDdXJsX25vbmVfc2V0X2VuZ2luZSwgICAgICAgICAgIC8qIHNldF9lbmdpbmUgKi8KKyAgQ3VybF9ub25lX3NldF9lbmdpbmVfZGVmYXVsdCwgICAvKiBzZXRfZW5naW5lX2RlZmF1bHQgKi8KKyAgQ3VybF9ub25lX2VuZ2luZXNfbGlzdCwgICAgICAgICAvKiBlbmdpbmVzX2xpc3QgKi8KKyAgQ3VybF9ub25lX2ZhbHNlX3N0YXJ0LCAgICAgICAgICAvKiBmYWxzZV9zdGFydCAqLworICBDdXJsX25vbmVfbWQ1c3VtLCAgICAgICAgICAgICAgIC8qIG1kNXN1bSAqLworICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoYTI1NnN1bSAqLworfTsKKwogI2VuZGlmIC8qIFVTRV9BWFRMUyAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9heHRscy5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9heHRscy5oCmluZGV4IDUzNzk3ZWEuLjNmMWUxMjkgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvYXh0bHMuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2F4dGxzLmgKQEAgLTI3LDQ0ICsyNyw3IEBACiAjaW5jbHVkZSAiY3VybC9jdXJsLmgiCiAjaW5jbHVkZSAidXJsZGF0YS5oIgogCi1pbnQgQ3VybF9heHRsc19pbml0KHZvaWQpOwotaW50IEN1cmxfYXh0bHNfY2xlYW51cCh2b2lkKTsKLUNVUkxjb2RlIEN1cmxfYXh0bHNfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotQ1VSTGNvZGUgQ3VybF9heHRsc19jb25uZWN0X25vbmJsb2NraW5nKAotICAgIHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICBpbnQgc29ja2luZGV4LAotICAgIGJvb2wgKmRvbmUpOwotCi0gLyogY2xvc2UgYSBTU0wgY29ubmVjdGlvbiAqLwotdm9pZCBDdXJsX2F4dGxzX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci0KLXZvaWQgQ3VybF9heHRsc19zZXNzaW9uX2ZyZWUodm9pZCAqcHRyKTsKLXNpemVfdCBDdXJsX2F4dGxzX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci1pbnQgQ3VybF9heHRsc19zaHV0ZG93bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotaW50IEN1cmxfYXh0bHNfY2hlY2tfY3huKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubik7Ci1DVVJMY29kZSBDdXJsX2F4dGxzX3JhbmRvbShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW50cm9weSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpOwotCi0vKiBTZXQgdGhlIEFQSSBiYWNrZW5kIGRlZmluaXRpb24gdG8gYXhUTFMgKi8KLSNkZWZpbmUgQ1VSTF9TU0xfQkFDS0VORCBDVVJMU1NMQkFDS0VORF9BWFRMUwotCi0vKiBBUEkgc2V0dXAgZm9yIGF4VExTICovCi0jZGVmaW5lIGN1cmxzc2xfaW5pdCBDdXJsX2F4dGxzX2luaXQKLSNkZWZpbmUgY3VybHNzbF9jbGVhbnVwIEN1cmxfYXh0bHNfY2xlYW51cAotI2RlZmluZSBjdXJsc3NsX2Nvbm5lY3QgQ3VybF9heHRsc19jb25uZWN0Ci0jZGVmaW5lIGN1cmxzc2xfY29ubmVjdF9ub25ibG9ja2luZyBDdXJsX2F4dGxzX2Nvbm5lY3Rfbm9uYmxvY2tpbmcKLSNkZWZpbmUgY3VybHNzbF9zZXNzaW9uX2ZyZWUoeCkgIEN1cmxfYXh0bHNfc2Vzc2lvbl9mcmVlKHgpCi0jZGVmaW5lIGN1cmxzc2xfY2xvc2VfYWxsKHgpICgodm9pZCl4KQotI2RlZmluZSBjdXJsc3NsX2Nsb3NlIEN1cmxfYXh0bHNfY2xvc2UKLSNkZWZpbmUgY3VybHNzbF9zaHV0ZG93bih4LHkpIEN1cmxfYXh0bHNfc2h1dGRvd24oeCx5KQotI2RlZmluZSBjdXJsc3NsX3NldF9lbmdpbmUoeCx5KSAoKHZvaWQpeCwgKHZvaWQpeSwgQ1VSTEVfTk9UX0JVSUxUX0lOKQotI2RlZmluZSBjdXJsc3NsX3NldF9lbmdpbmVfZGVmYXVsdCh4KSAoKHZvaWQpeCwgQ1VSTEVfTk9UX0JVSUxUX0lOKQotI2RlZmluZSBjdXJsc3NsX2VuZ2luZXNfbGlzdCh4KSAoKHZvaWQpeCwgKHN0cnVjdCBjdXJsX3NsaXN0ICopTlVMTCkKLSNkZWZpbmUgY3VybHNzbF92ZXJzaW9uIEN1cmxfYXh0bHNfdmVyc2lvbgotI2RlZmluZSBjdXJsc3NsX2NoZWNrX2N4bih4KSBDdXJsX2F4dGxzX2NoZWNrX2N4bih4KQotI2RlZmluZSBjdXJsc3NsX2RhdGFfcGVuZGluZyh4LHkpICgodm9pZCl4LCAodm9pZCl5LCAwKQotI2RlZmluZSBjdXJsc3NsX3JhbmRvbSh4LHkseikgQ3VybF9heHRsc19yYW5kb20oeCx5LHopCitleHRlcm4gY29uc3Qgc3RydWN0IEN1cmxfc3NsIEN1cmxfc3NsX2F4dGxzOwogCiAjZW5kaWYgLyogVVNFX0FYVExTICovCiAjZW5kaWYgLyogSEVBREVSX0NVUkxfQVhUTFNfSCAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9jeWFzc2wuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvY3lhc3NsLmMKaW5kZXggMDFiZmRhYi4uYmE1ZWUxNSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9jeWFzc2wuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2N5YXNzbC5jCkBAIC05MSw2ICs5MSw3IEBACiAjaW5jbHVkZSAieDUwOWFzbjEuaCIKICNpbmNsdWRlICJjdXJsX3ByaW50Zi5oIgogCisjaW5jbHVkZSA8Y3lhc3NsL29wZW5zc2wvc3NsLmg+CiAjaW5jbHVkZSA8Y3lhc3NsL3NzbC5oPgogI2lmZGVmIEhBVkVfQ1lBU1NMX0VSUk9SX1NTTF9ICiAjaW5jbHVkZSA8Y3lhc3NsL2Vycm9yLXNzbC5oPgpAQCAtMTEwLDYgKzExMSwyNSBAQAogI2RlZmluZSBDWUFTU0xfTUFYX0VSUk9SX1NaIDgwCiAjZW5kaWYKIAorLyogS0VFUF9QRUVSX0NFUlQgaXMgYSBwcm9kdWN0IG9mIHRoZSBwcmVzZW5jZSBvZiBidWlsZCB0aW1lIHN5bWJvbAorICAgT1BFTlNTTF9FWFRSQSB3aXRob3V0IE5PX0NFUlRTLCBkZXBlbmRpbmcgb24gdGhlIHZlcnNpb24uIEtFRVBfUEVFUl9DRVJUIGlzCisgICBpbiB3b2xmU1NMJ3Mgc2V0dGluZ3MuaCwgYW5kIHRoZSBsYXR0ZXIgdHdvIGFyZSBidWlsZCB0aW1lIHN5bWJvbHMgaW4KKyAgIG9wdGlvbnMuaC4gKi8KKyNpZm5kZWYgS0VFUF9QRUVSX0NFUlQKKyNpZiBkZWZpbmVkKEhBVkVfQ1lBU1NMX0dFVF9QRUVSX0NFUlRJRklDQVRFKSB8fCBcCisgICAgZGVmaW5lZChIQVZFX1dPTEZTU0xfR0VUX1BFRVJfQ0VSVElGSUNBVEUpIHx8IFwKKyAgICAoZGVmaW5lZChPUEVOU1NMX0VYVFJBKSAmJiAhZGVmaW5lZChOT19DRVJUUykpCisjZGVmaW5lIEtFRVBfUEVFUl9DRVJUCisjZW5kaWYKKyNlbmRpZgorCitzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSB7CisgIFNTTF9DVFgqIGN0eDsKKyAgU1NMKiAgICAgaGFuZGxlOworfTsKKworI2RlZmluZSBCQUNLRU5EIGNvbm5zc2wtPmJhY2tlbmQKKwogc3RhdGljIEN1cmxfcmVjdiBjeWFzc2xfcmVjdjsKIHN0YXRpYyBDdXJsX3NlbmQgY3lhc3NsX3NlbmQ7CiAKQEAgLTEzNiw3ICsxNTYsNyBAQAogICBjaGFyIGVycm9yX2J1ZmZlcltDWUFTU0xfTUFYX0VSUk9SX1NaXTsKICAgY2hhciAqY2lwaGVyczsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7Ci0gIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhKiBjb25zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhKiBjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwogICBTU0xfTUVUSE9EKiByZXFfbWV0aG9kID0gTlVMTDsKICAgY3VybF9zb2NrZXRfdCBzb2NrZmQgPSBjb25uLT5zb2NrW3NvY2tpbmRleF07CiAjaWZkZWYgSEFWRV9TTkkKQEAgLTE0Niw3ICsxNjYsNyBAQAogI2RlZmluZSB1c2Vfc25pKHgpICBDdXJsX25vcF9zdG10CiAjZW5kaWYKIAotICBpZihjb25zc2wtPnN0YXRlID09IHNzbF9jb25uZWN0aW9uX2NvbXBsZXRlKQorICBpZihjb25uc3NsLT5zdGF0ZSA9PSBzc2xfY29ubmVjdGlvbl9jb21wbGV0ZSkKICAgICByZXR1cm4gQ1VSTEVfT0s7CiAKICAgaWYoU1NMX0NPTk5fQ09ORklHKHZlcnNpb25fbWF4KSAhPSBDVVJMX1NTTFZFUlNJT05fTUFYX05PTkUpIHsKQEAgLTIwNSwxMSArMjI1LDExIEBACiAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CiAgIH0KIAotICBpZihjb25zc2wtPmN0eCkKLSAgICBTU0xfQ1RYX2ZyZWUoY29uc3NsLT5jdHgpOwotICBjb25zc2wtPmN0eCA9IFNTTF9DVFhfbmV3KHJlcV9tZXRob2QpOworICBpZihCQUNLRU5ELT5jdHgpCisgICAgU1NMX0NUWF9mcmVlKEJBQ0tFTkQtPmN0eCk7CisgIEJBQ0tFTkQtPmN0eCA9IFNTTF9DVFhfbmV3KHJlcV9tZXRob2QpOwogCi0gIGlmKCFjb25zc2wtPmN0eCkgeworICBpZighQkFDS0VORC0+Y3R4KSB7CiAgICAgZmFpbGYoZGF0YSwgIlNTTDogY291bGRuJ3QgY3JlYXRlIGEgY29udGV4dCEiKTsKICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgfQpAQCAtMjI1LDkgKzI0NSw5IEBACiAgICAgdmVyc2lvbi4gV2UgdXNlIHdvbGZTU0xfQ1RYX1NldE1pblZlcnNpb24gYW5kIG5vdCBDeWFTU0xfU2V0TWluVmVyc2lvbgogICAgIGJlY2F1c2Ugb25seSB0aGUgZm9ybWVyIHdpbGwgd29yayBiZWZvcmUgdGhlIHVzZXIncyBDVFggY2FsbGJhY2sgaXMgY2FsbGVkLgogICAgICovCi0gICAgaWYoKHdvbGZTU0xfQ1RYX1NldE1pblZlcnNpb24oY29uc3NsLT5jdHgsIFdPTEZTU0xfVExTVjEpICE9IDEpICYmCi0gICAgICAgKHdvbGZTU0xfQ1RYX1NldE1pblZlcnNpb24oY29uc3NsLT5jdHgsIFdPTEZTU0xfVExTVjFfMSkgIT0gMSkgJiYKLSAgICAgICAod29sZlNTTF9DVFhfU2V0TWluVmVyc2lvbihjb25zc2wtPmN0eCwgV09MRlNTTF9UTFNWMV8yKSAhPSAxKSkgeworICAgIGlmKCh3b2xmU1NMX0NUWF9TZXRNaW5WZXJzaW9uKEJBQ0tFTkQtPmN0eCwgV09MRlNTTF9UTFNWMSkgIT0gMSkgJiYKKyAgICAgICAod29sZlNTTF9DVFhfU2V0TWluVmVyc2lvbihCQUNLRU5ELT5jdHgsIFdPTEZTU0xfVExTVjFfMSkgIT0gMSkgJiYKKyAgICAgICAod29sZlNTTF9DVFhfU2V0TWluVmVyc2lvbihCQUNLRU5ELT5jdHgsIFdPTEZTU0xfVExTVjFfMikgIT0gMSkpIHsKICAgICAgIGZhaWxmKGRhdGEsICJTU0w6IGNvdWxkbid0IHNldCB0aGUgbWluaW11bSBwcm90b2NvbCB2ZXJzaW9uIik7CiAgICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CiAgICAgfQpAQCAtMjM3LDcgKzI1Nyw3IEBACiAKICAgY2lwaGVycyA9IFNTTF9DT05OX0NPTkZJRyhjaXBoZXJfbGlzdCk7CiAgIGlmKGNpcGhlcnMpIHsKLSAgICBpZighU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoY29uc3NsLT5jdHgsIGNpcGhlcnMpKSB7CisgICAgaWYoIVNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KEJBQ0tFTkQtPmN0eCwgY2lwaGVycykpIHsKICAgICAgIGZhaWxmKGRhdGEsICJmYWlsZWQgc2V0dGluZyBjaXBoZXIgbGlzdDogJXMiLCBjaXBoZXJzKTsKICAgICAgIHJldHVybiBDVVJMRV9TU0xfQ0lQSEVSOwogICAgIH0KQEAgLTI0Nyw3ICsyNjcsNyBAQAogI2lmbmRlZiBOT19GSUxFU1lTVEVNCiAgIC8qIGxvYWQgdHJ1c3RlZCBjYWNlcnQgKi8KICAgaWYoU1NMX0NPTk5fQ09ORklHKENBZmlsZSkpIHsKLSAgICBpZigxICE9IFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKGNvbnNzbC0+Y3R4LAorICAgIGlmKDEgIT0gU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoQkFDS0VORC0+Y3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ09OTl9DT05GSUcoQ0FmaWxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NPTk5fQ09ORklHKENBcGF0aCkpKSB7CiAgICAgICBpZihTU0xfQ09OTl9DT05GSUcodmVyaWZ5cGVlcikpIHsKQEAgLTI4NCw3ICszMDQsNyBAQAogICBpZihTU0xfU0VUX09QVElPTihjZXJ0KSAmJiBTU0xfU0VUX09QVElPTihrZXkpKSB7CiAgICAgaW50IGZpbGVfdHlwZSA9IGRvX2ZpbGVfdHlwZShTU0xfU0VUX09QVElPTihjZXJ0X3R5cGUpKTsKIAotICAgIGlmKFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2ZpbGUoY29uc3NsLT5jdHgsIFNTTF9TRVRfT1BUSU9OKGNlcnQpLAorICAgIGlmKFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2ZpbGUoQkFDS0VORC0+Y3R4LCBTU0xfU0VUX09QVElPTihjZXJ0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3R5cGUpICE9IDEpIHsKICAgICAgIGZhaWxmKGRhdGEsICJ1bmFibGUgdG8gdXNlIGNsaWVudCBjZXJ0aWZpY2F0ZSAobm8ga2V5IG9yIHdyb25nIHBhc3MiCiAgICAgICAgICAgICAiIHBocmFzZT8pIik7CkBAIC0yOTIsNyArMzEyLDcgQEAKICAgICB9CiAKICAgICBmaWxlX3R5cGUgPSBkb19maWxlX3R5cGUoU1NMX1NFVF9PUFRJT04oa2V5X3R5cGUpKTsKLSAgICBpZihTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoY29uc3NsLT5jdHgsIFNTTF9TRVRfT1BUSU9OKGtleSksCisgICAgaWYoU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKEJBQ0tFTkQtPmN0eCwgU1NMX1NFVF9PUFRJT04oa2V5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfdHlwZSkgIT0gMSkgewogICAgICAgZmFpbGYoZGF0YSwgInVuYWJsZSB0byBzZXQgcHJpdmF0ZSBrZXkiKTsKICAgICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKQEAgLTMwNCw3ICszMjQsNyBAQAogICAgKiBmYWlsIHRvIGNvbm5lY3QgaWYgdGhlIHZlcmlmaWNhdGlvbiBmYWlscywgb3IgaWYgaXQgc2hvdWxkIGNvbnRpbnVlCiAgICAqIGFueXdheS4gSW4gdGhlIGxhdHRlciBjYXNlIHRoZSByZXN1bHQgb2YgdGhlIHZlcmlmaWNhdGlvbiBpcyBjaGVja2VkIHdpdGgKICAgICogU1NMX2dldF92ZXJpZnlfcmVzdWx0KCkgYmVsb3cuICovCi0gIFNTTF9DVFhfc2V0X3ZlcmlmeShjb25zc2wtPmN0eCwKKyAgU1NMX0NUWF9zZXRfdmVyaWZ5KEJBQ0tFTkQtPmN0eCwKICAgICAgICAgICAgICAgICAgICAgIFNTTF9DT05OX0NPTkZJRyh2ZXJpZnlwZWVyKT9TU0xfVkVSSUZZX1BFRVI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1ZFUklGWV9OT05FLAogICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CkBAIC0zMjMsNyArMzQzLDcgQEAKICNpZmRlZiBFTkFCTEVfSVBWNgogICAgICAgICgwID09IEN1cmxfaW5ldF9wdG9uKEFGX0lORVQ2LCBob3N0bmFtZSwgJmFkZHI2KSkgJiYKICNlbmRpZgotICAgICAgIChDeWFTU0xfQ1RYX1VzZVNOSShjb25zc2wtPmN0eCwgQ1lBU1NMX1NOSV9IT1NUX05BTUUsIGhvc3RuYW1lLAorICAgICAgIChDeWFTU0xfQ1RYX1VzZVNOSShCQUNLRU5ELT5jdHgsIENZQVNTTF9TTklfSE9TVF9OQU1FLCBob3N0bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIHNob3J0KWhvc3RuYW1lX2xlbikgIT0gMSkpIHsKICAgICAgIGluZm9mKGRhdGEsICJXQVJOSU5HOiBmYWlsZWQgdG8gY29uZmlndXJlIHNlcnZlciBuYW1lIGluZGljYXRpb24gKFNOSSkgIgogICAgICAgICAgICAgIlRMUyBleHRlbnNpb25cbiIpOwpAQCAtMzM2LDE1ICszNTYsMTUgQEAKICAgICAgaHR0cHM6Ly9naXRodWIuY29tL3dvbGZTU0wvd29sZnNzbC9pc3N1ZXMvMzY2CiAgICAgIFRoZSBzdXBwb3J0ZWQgY3VydmVzIGJlbG93IGFyZSB0aG9zZSBhbHNvIHN1cHBvcnRlZCBieSBPcGVuU1NMIDEuMC4yIGFuZAogICAgICBpbiB0aGUgc2FtZSBvcmRlci4gKi8KLSAgQ3lhU1NMX0NUWF9Vc2VTdXBwb3J0ZWRDdXJ2ZShjb25zc2wtPmN0eCwgMHgxNyk7IC8qIHNlY3AyNTZyMSAqLwotICBDeWFTU0xfQ1RYX1VzZVN1cHBvcnRlZEN1cnZlKGNvbnNzbC0+Y3R4LCAweDE5KTsgLyogc2VjcDUyMXIxICovCi0gIEN5YVNTTF9DVFhfVXNlU3VwcG9ydGVkQ3VydmUoY29uc3NsLT5jdHgsIDB4MTgpOyAvKiBzZWNwMzg0cjEgKi8KKyAgQ3lhU1NMX0NUWF9Vc2VTdXBwb3J0ZWRDdXJ2ZShCQUNLRU5ELT5jdHgsIDB4MTcpOyAvKiBzZWNwMjU2cjEgKi8KKyAgQ3lhU1NMX0NUWF9Vc2VTdXBwb3J0ZWRDdXJ2ZShCQUNLRU5ELT5jdHgsIDB4MTkpOyAvKiBzZWNwNTIxcjEgKi8KKyAgQ3lhU1NMX0NUWF9Vc2VTdXBwb3J0ZWRDdXJ2ZShCQUNLRU5ELT5jdHgsIDB4MTgpOyAvKiBzZWNwMzg0cjEgKi8KICNlbmRpZgogCiAgIC8qIGdpdmUgYXBwbGljYXRpb24gYSBjaGFuY2UgdG8gaW50ZXJmZXJlIHdpdGggU1NMIHNldCB1cC4gKi8KICAgaWYoZGF0YS0+c2V0LnNzbC5mc3NsY3R4KSB7CiAgICAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7Ci0gICAgcmVzdWx0ID0gKCpkYXRhLT5zZXQuc3NsLmZzc2xjdHgpKGRhdGEsIGNvbnNzbC0+Y3R4LAorICAgIHJlc3VsdCA9ICgqZGF0YS0+c2V0LnNzbC5mc3NsY3R4KShkYXRhLCBCQUNLRU5ELT5jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnNldC5zc2wuZnNzbGN0eHApOwogICAgIGlmKHJlc3VsdCkgewogICAgICAgZmFpbGYoZGF0YSwgImVycm9yIHNpZ25hbGVkIGJ5IHNzbCBjdHggY2FsbGJhY2siKTsKQEAgLTM2MiwxMCArMzgyLDEwIEBACiAjZW5kaWYKIAogICAvKiBMZXQncyBtYWtlIGFuIFNTTCBzdHJ1Y3R1cmUgKi8KLSAgaWYoY29uc3NsLT5oYW5kbGUpCi0gICAgU1NMX2ZyZWUoY29uc3NsLT5oYW5kbGUpOwotICBjb25zc2wtPmhhbmRsZSA9IFNTTF9uZXcoY29uc3NsLT5jdHgpOwotICBpZighY29uc3NsLT5oYW5kbGUpIHsKKyAgaWYoQkFDS0VORC0+aGFuZGxlKQorICAgIFNTTF9mcmVlKEJBQ0tFTkQtPmhhbmRsZSk7CisgIEJBQ0tFTkQtPmhhbmRsZSA9IFNTTF9uZXcoQkFDS0VORC0+Y3R4KTsKKyAgaWYoIUJBQ0tFTkQtPmhhbmRsZSkgewogICAgIGZhaWxmKGRhdGEsICJTU0w6IGNvdWxkbid0IGNyZWF0ZSBhIGNvbnRleHQgKGhhbmRsZSkhIik7CiAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CiAgIH0KQEAgLTM4OCw3ICs0MDgsNyBAQAogICAgIHN0cmNweShwcm90b2NvbHMgKyBzdHJsZW4ocHJvdG9jb2xzKSwgQUxQTl9IVFRQXzFfMSk7CiAgICAgaW5mb2YoZGF0YSwgIkFMUE4sIG9mZmVyaW5nICVzXG4iLCBBTFBOX0hUVFBfMV8xKTsKIAotICAgIGlmKHdvbGZTU0xfVXNlQUxQTihjb25zc2wtPmhhbmRsZSwgcHJvdG9jb2xzLAorICAgIGlmKHdvbGZTU0xfVXNlQUxQTihCQUNLRU5ELT5oYW5kbGUsIHByb3RvY29scywKICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXN0cmxlbihwcm90b2NvbHMpLAogICAgICAgICAgICAgICAgICAgICAgICBXT0xGU1NMX0FMUE5fQ09OVElOVUVfT05fTUlTTUFUQ0gpICE9IFNTTF9TVUNDRVNTKSB7CiAgICAgICBmYWlsZihkYXRhLCAiU1NMOiBmYWlsZWQgc2V0dGluZyBBTFBOIHByb3RvY29scyIpOwpAQCAtNDA0LDEwICs0MjQsMTAgQEAKICAgICBDdXJsX3NzbF9zZXNzaW9uaWRfbG9jayhjb25uKTsKICAgICBpZighQ3VybF9zc2xfZ2V0c2Vzc2lvbmlkKGNvbm4sICZzc2xfc2Vzc2lvbmlkLCBOVUxMLCBzb2NraW5kZXgpKSB7CiAgICAgICAvKiB3ZSBnb3QgYSBzZXNzaW9uIGlkLCB1c2UgaXQhICovCi0gICAgICBpZighU1NMX3NldF9zZXNzaW9uKGNvbnNzbC0+aGFuZGxlLCBzc2xfc2Vzc2lvbmlkKSkgeworICAgICAgaWYoIVNTTF9zZXRfc2Vzc2lvbihCQUNLRU5ELT5oYW5kbGUsIHNzbF9zZXNzaW9uaWQpKSB7CiAgICAgICAgIEN1cmxfc3NsX3Nlc3Npb25pZF91bmxvY2soY29ubik7CiAgICAgICAgIGZhaWxmKGRhdGEsICJTU0w6IFNTTF9zZXRfc2Vzc2lvbiBmYWlsZWQ6ICVzIiwKLSAgICAgICAgICAgICAgRVJSX2Vycm9yX3N0cmluZyhTU0xfZ2V0X2Vycm9yKGNvbnNzbC0+aGFuZGxlLCAwKSwKKyAgICAgICAgICAgICAgRVJSX2Vycm9yX3N0cmluZyhTU0xfZ2V0X2Vycm9yKEJBQ0tFTkQtPmhhbmRsZSwgMCksCiAgICAgICAgICAgICAgIGVycm9yX2J1ZmZlcikpOwogICAgICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CiAgICAgICB9CkBAIC00MTgsMTIgKzQzOCwxMiBAQAogICB9CiAKICAgLyogcGFzcyB0aGUgcmF3IHNvY2tldCBpbnRvIHRoZSBTU0wgbGF5ZXIgKi8KLSAgaWYoIVNTTF9zZXRfZmQoY29uc3NsLT5oYW5kbGUsIChpbnQpc29ja2ZkKSkgeworICBpZighU1NMX3NldF9mZChCQUNLRU5ELT5oYW5kbGUsIChpbnQpc29ja2ZkKSkgewogICAgIGZhaWxmKGRhdGEsICJTU0w6IFNTTF9zZXRfZmQgZmFpbGVkIik7CiAgICAgcmV0dXJuIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SOwogICB9CiAKLSAgY29uc3NsLT5jb25uZWN0aW5nX3N0YXRlID0gc3NsX2Nvbm5lY3RfMjsKKyAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9IHNzbF9jb25uZWN0XzI7CiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIApAQCAtNDM0LDcgKzQ1NCw3IEBACiB7CiAgIGludCByZXQgPSAtMTsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7Ci0gIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhKiBjb25zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhKiBjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwogICBjb25zdCBjaGFyICogY29uc3QgaG9zdG5hbWUgPSBTU0xfSVNfUFJPWFkoKSA/IGNvbm4tPmh0dHBfcHJveHkuaG9zdC5uYW1lIDoKICAgICBjb25uLT5ob3N0Lm5hbWU7CiAgIGNvbnN0IGNoYXIgKiBjb25zdCBkaXNwbmFtZSA9IFNTTF9JU19QUk9YWSgpID8KQEAgLTQ0OCwyMiArNDY4LDIyIEBACiAKICAgLyogRW5hYmxlIFJGQzI4MTggY2hlY2tzICovCiAgIGlmKFNTTF9DT05OX0NPTkZJRyh2ZXJpZnlob3N0KSkgewotICAgIHJldCA9IEN5YVNTTF9jaGVja19kb21haW5fbmFtZShjb25zc2wtPmhhbmRsZSwgaG9zdG5hbWUpOworICAgIHJldCA9IEN5YVNTTF9jaGVja19kb21haW5fbmFtZShCQUNLRU5ELT5oYW5kbGUsIGhvc3RuYW1lKTsKICAgICBpZihyZXQgPT0gU1NMX0ZBSUxVUkUpCiAgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgfQogCi0gIHJldCA9IFNTTF9jb25uZWN0KGNvbnNzbC0+aGFuZGxlKTsKKyAgcmV0ID0gU1NMX2Nvbm5lY3QoQkFDS0VORC0+aGFuZGxlKTsKICAgaWYocmV0ICE9IDEpIHsKICAgICBjaGFyIGVycm9yX2J1ZmZlcltDWUFTU0xfTUFYX0VSUk9SX1NaXTsKLSAgICBpbnQgIGRldGFpbCA9IFNTTF9nZXRfZXJyb3IoY29uc3NsLT5oYW5kbGUsIHJldCk7CisgICAgaW50ICBkZXRhaWwgPSBTU0xfZ2V0X2Vycm9yKEJBQ0tFTkQtPmhhbmRsZSwgcmV0KTsKIAogICAgIGlmKFNTTF9FUlJPUl9XQU5UX1JFQUQgPT0gZGV0YWlsKSB7Ci0gICAgICBjb25zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPSBzc2xfY29ubmVjdF8yX3JlYWRpbmc7CisgICAgICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID0gc3NsX2Nvbm5lY3RfMl9yZWFkaW5nOwogICAgICAgcmV0dXJuIENVUkxFX09LOwogICAgIH0KICAgICBlbHNlIGlmKFNTTF9FUlJPUl9XQU5UX1dSSVRFID09IGRldGFpbCkgewotICAgICAgY29uc3NsLT5jb25uZWN0aW5nX3N0YXRlID0gc3NsX2Nvbm5lY3RfMl93cml0aW5nOworICAgICAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9IHNzbF9jb25uZWN0XzJfd3JpdGluZzsKICAgICAgIHJldHVybiBDVVJMRV9PSzsKICAgICB9CiAgICAgLyogVGhlcmUgaXMgbm8gZWFzeSB3YXkgdG8gb3ZlcnJpZGUgb25seSB0aGUgQ04gbWF0Y2hpbmcuCkBAIC01MjQsNyArNTQ0LDcgQEAKICAgICBjdXJsX2FzbjFFbGVtZW50ICpwdWJrZXk7CiAgICAgQ1VSTGNvZGUgcmVzdWx0OwogCi0gICAgeDUwOSA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShjb25zc2wtPmhhbmRsZSk7CisgICAgeDUwOSA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShCQUNLRU5ELT5oYW5kbGUpOwogICAgIGlmKCF4NTA5KSB7CiAgICAgICBmYWlsZihkYXRhLCAiU1NMOiBmYWlsZWQgcmV0cmlldmluZyBzZXJ2ZXIgY2VydGlmaWNhdGUiKTsKICAgICAgIHJldHVybiBDVVJMRV9TU0xfUElOTkVEUFVCS0VZTk9UTUFUQ0g7CkBAIC01NjYsNyArNTg2LDcgQEAKICAgICBjaGFyICpwcm90b2NvbCA9IE5VTEw7CiAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG9jb2xfbGVuID0gMDsKIAotICAgIHJjID0gd29sZlNTTF9BTFBOX0dldFByb3RvY29sKGNvbnNzbC0+aGFuZGxlLCAmcHJvdG9jb2wsICZwcm90b2NvbF9sZW4pOworICAgIHJjID0gd29sZlNTTF9BTFBOX0dldFByb3RvY29sKEJBQ0tFTkQtPmhhbmRsZSwgJnByb3RvY29sLCAmcHJvdG9jb2xfbGVuKTsKIAogICAgIGlmKHJjID09IFNTTF9TVUNDRVNTKSB7CiAgICAgICBpbmZvZihkYXRhLCAiQUxQTiwgc2VydmVyIGFjY2VwdGVkIHRvIHVzZSAlLipzXG4iLCBwcm90b2NvbF9sZW4sCkBAIC01OTUsMTEgKzYxNSwxMSBAQAogICB9CiAjZW5kaWYgLyogSEFWRV9BTFBOICovCiAKLSAgY29uc3NsLT5jb25uZWN0aW5nX3N0YXRlID0gc3NsX2Nvbm5lY3RfMzsKKyAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9IHNzbF9jb25uZWN0XzM7CiAjaWYgKExJQkNZQVNTTF9WRVJTSU9OX0hFWCA+PSAweDAzMDA5MDEwKQogICBpbmZvZihkYXRhLCAiU1NMIGNvbm5lY3Rpb24gdXNpbmcgJXMgLyAlc1xuIiwKLSAgICAgICAgd29sZlNTTF9nZXRfdmVyc2lvbihjb25zc2wtPmhhbmRsZSksCi0gICAgICAgIHdvbGZTU0xfZ2V0X2NpcGhlcl9uYW1lKGNvbnNzbC0+aGFuZGxlKSk7CisgICAgICAgIHdvbGZTU0xfZ2V0X3ZlcnNpb24oQkFDS0VORC0+aGFuZGxlKSwKKyAgICAgICAgd29sZlNTTF9nZXRfY2lwaGVyX25hbWUoQkFDS0VORC0+aGFuZGxlKSk7CiAjZWxzZQogICBpbmZvZihkYXRhLCAiU1NMIGNvbm5lY3RlZFxuIik7CiAjZW5kaWYKQEAgLTYyMyw3ICs2NDMsNyBAQAogICAgIFNTTF9TRVNTSU9OICpvdXJfc3NsX3Nlc3Npb25pZDsKICAgICB2b2lkICpvbGRfc3NsX3Nlc3Npb25pZCA9IE5VTEw7CiAKLSAgICBvdXJfc3NsX3Nlc3Npb25pZCA9IFNTTF9nZXRfc2Vzc2lvbihjb25uc3NsLT5oYW5kbGUpOworICAgIG91cl9zc2xfc2Vzc2lvbmlkID0gU1NMX2dldF9zZXNzaW9uKEJBQ0tFTkQtPmhhbmRsZSk7CiAKICAgICBDdXJsX3NzbF9zZXNzaW9uaWRfbG9jayhjb25uKTsKICAgICBpbmNhY2hlID0gIShDdXJsX3NzbF9nZXRzZXNzaW9uaWQoY29ubiwgJm9sZF9zc2xfc2Vzc2lvbmlkLCBOVUxMLApAQCAtNjYwLDEyICs2ODAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMY29kZSAqY3VybGNvZGUpCiB7CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwogICBjaGFyIGVycm9yX2J1ZmZlcltDWUFTU0xfTUFYX0VSUk9SX1NaXTsKICAgaW50ICBtZW1sZW4gPSAobGVuID4gKHNpemVfdClJTlRfTUFYKSA/IElOVF9NQVggOiAoaW50KWxlbjsKLSAgaW50ICByYyAgICAgPSBTU0xfd3JpdGUoY29ubi0+c3NsW3NvY2tpbmRleF0uaGFuZGxlLCBtZW0sIG1lbWxlbik7CisgIGludCAgcmMgICAgID0gU1NMX3dyaXRlKEJBQ0tFTkQtPmhhbmRsZSwgbWVtLCBtZW1sZW4pOwogCiAgIGlmKHJjIDwgMCkgewotICAgIGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKGNvbm4tPnNzbFtzb2NraW5kZXhdLmhhbmRsZSwgcmMpOworICAgIGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKEJBQ0tFTkQtPmhhbmRsZSwgcmMpOwogCiAgICAgc3dpdGNoKGVycikgewogICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKQEAgLTY4NCwxOCArNzA1LDE4IEBACiAgIHJldHVybiByYzsKIH0KIAotdm9pZCBDdXJsX2N5YXNzbF9jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCitzdGF0aWMgdm9pZCBDdXJsX2N5YXNzbF9jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7Ci0gIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwogCi0gIGlmKGNvbnNzbC0+aGFuZGxlKSB7Ci0gICAgKHZvaWQpU1NMX3NodXRkb3duKGNvbnNzbC0+aGFuZGxlKTsKLSAgICBTU0xfZnJlZShjb25zc2wtPmhhbmRsZSk7Ci0gICAgY29uc3NsLT5oYW5kbGUgPSBOVUxMOworICBpZihCQUNLRU5ELT5oYW5kbGUpIHsKKyAgICAodm9pZClTU0xfc2h1dGRvd24oQkFDS0VORC0+aGFuZGxlKTsKKyAgICBTU0xfZnJlZShCQUNLRU5ELT5oYW5kbGUpOworICAgIEJBQ0tFTkQtPmhhbmRsZSA9IE5VTEw7CiAgIH0KLSAgaWYoY29uc3NsLT5jdHgpIHsKLSAgICBTU0xfQ1RYX2ZyZWUoY29uc3NsLT5jdHgpOwotICAgIGNvbnNzbC0+Y3R4ID0gTlVMTDsKKyAgaWYoQkFDS0VORC0+Y3R4KSB7CisgICAgU1NMX0NUWF9mcmVlKEJBQ0tFTkQtPmN0eCk7CisgICAgQkFDS0VORC0+Y3R4ID0gTlVMTDsKICAgfQogfQogCkBAIC03MDUsMTIgKzcyNiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMY29kZSAqY3VybGNvZGUpCiB7CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtudW1dOwogICBjaGFyIGVycm9yX2J1ZmZlcltDWUFTU0xfTUFYX0VSUk9SX1NaXTsKICAgaW50ICBidWZmc2l6ZSA9IChidWZmZXJzaXplID4gKHNpemVfdClJTlRfTUFYKSA/IElOVF9NQVggOiAoaW50KWJ1ZmZlcnNpemU7Ci0gIGludCAgbnJlYWQgICAgPSBTU0xfcmVhZChjb25uLT5zc2xbbnVtXS5oYW5kbGUsIGJ1ZiwgYnVmZnNpemUpOworICBpbnQgIG5yZWFkICAgID0gU1NMX3JlYWQoQkFDS0VORC0+aGFuZGxlLCBidWYsIGJ1ZmZzaXplKTsKIAogICBpZihucmVhZCA8IDApIHsKLSAgICBpbnQgZXJyID0gU1NMX2dldF9lcnJvcihjb25uLT5zc2xbbnVtXS5oYW5kbGUsIG5yZWFkKTsKKyAgICBpbnQgZXJyID0gU1NMX2dldF9lcnJvcihCQUNLRU5ELT5oYW5kbGUsIG5yZWFkKTsKIAogICAgIHN3aXRjaChlcnIpIHsKICAgICBjYXNlIFNTTF9FUlJPUl9aRVJPX1JFVFVSTjogLyogbm8gbW9yZSBkYXRhICovCkBAIC03MzIsMTQgKzc1NCwxNCBAQAogfQogCiAKLXZvaWQgQ3VybF9jeWFzc2xfc2Vzc2lvbl9mcmVlKHZvaWQgKnB0cikKK3N0YXRpYyB2b2lkIEN1cmxfY3lhc3NsX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpCiB7CiAgICh2b2lkKXB0cjsKICAgLyogQ3lhU1NMIHJldXNlcyBzZXNzaW9ucyBvbiBvd24sIG5vIGZyZWUgKi8KIH0KIAogCi1zaXplX3QgQ3VybF9jeWFzc2xfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQorc3RhdGljIHNpemVfdCBDdXJsX2N5YXNzbF92ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7CiAjaWYgTElCQ1lBU1NMX1ZFUlNJT05fSEVYID49IDB4MDMwMDYwMDAKICAgcmV0dXJuIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIndvbGZTU0wvJXMiLCB3b2xmU1NMX2xpYl92ZXJzaW9uKCkpOwpAQCAtNzUzLDE2ICs3NzUsMTggQEAKIH0KIAogCi1pbnQgQ3VybF9jeWFzc2xfaW5pdCh2b2lkKQorc3RhdGljIGludCBDdXJsX2N5YXNzbF9pbml0KHZvaWQpCiB7CiAgIHJldHVybiAoQ3lhU1NMX0luaXQoKSA9PSBTU0xfU1VDQ0VTUyk7CiB9CiAKIAotYm9vbCBDdXJsX2N5YXNzbF9kYXRhX3BlbmRpbmcoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhKiBjb25uLCBpbnQgY29ubmluZGV4KQorc3RhdGljIGJvb2wgQ3VybF9jeWFzc2xfZGF0YV9wZW5kaW5nKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSogY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29ubmluZGV4KQogewotICBpZihjb25uLT5zc2xbY29ubmluZGV4XS5oYW5kbGUpICAgLyogU1NMIGlzIGluIHVzZSAqLwotICAgIHJldHVybiAoMCAhPSBTU0xfcGVuZGluZyhjb25uLT5zc2xbY29ubmluZGV4XS5oYW5kbGUpKSA/IFRSVUUgOiBGQUxTRTsKKyAgY29uc3Qgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW2Nvbm5pbmRleF07CisgIGlmKEJBQ0tFTkQtPmhhbmRsZSkgICAvKiBTU0wgaXMgaW4gdXNlICovCisgICAgcmV0dXJuICgwICE9IFNTTF9wZW5kaW5nKEJBQ0tFTkQtPmhhbmRsZSkpID8gVFJVRSA6IEZBTFNFOwogICBlbHNlCiAgICAgcmV0dXJuIEZBTFNFOwogfQpAQCAtNzcyLDE0ICs3OTYsMTQgQEAKICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNodXQgZG93biB0aGUgU1NMIGxheWVyIGJ1dCBrZWVwIHRoZQogICogc29ja2V0IG9wZW4gKENDQyAtIENsZWFyIENvbW1hbmQgQ2hhbm5lbCkKICAqLwotaW50IEN1cmxfY3lhc3NsX3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKK3N0YXRpYyBpbnQgQ3VybF9jeWFzc2xfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQogewogICBpbnQgcmV0dmFsID0gMDsKICAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CiAKLSAgaWYoY29ubnNzbC0+aGFuZGxlKSB7Ci0gICAgU1NMX2ZyZWUoY29ubnNzbC0+aGFuZGxlKTsKLSAgICBjb25uc3NsLT5oYW5kbGUgPSBOVUxMOworICBpZihCQUNLRU5ELT5oYW5kbGUpIHsKKyAgICBTU0xfZnJlZShCQUNLRU5ELT5oYW5kbGUpOworICAgIEJBQ0tFTkQtPmhhbmRsZSA9IE5VTEw7CiAgIH0KICAgcmV0dXJuIHJldHZhbDsKIH0KQEAgLTgwNCw3ICs4MjgsNyBAQAogICAgIHJldHVybiBDVVJMRV9PSzsKICAgfQogCi0gIGlmKHNzbF9jb25uZWN0XzE9PWNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUpIHsKKyAgaWYoc3NsX2Nvbm5lY3RfMSA9PSBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlKSB7CiAgICAgLyogRmluZCBvdXQgaG93IG11Y2ggbW9yZSB0aW1lIHdlJ3JlIGFsbG93ZWQgKi8KICAgICB0aW1lb3V0X21zID0gQ3VybF90aW1lbGVmdChkYXRhLCBOVUxMLCBUUlVFKTsKIApAQCAtODM2LDkgKzg2MCw5IEBACiAgICAgaWYoY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9PSBzc2xfY29ubmVjdF8yX3JlYWRpbmcKICAgICAgICB8fCBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID09IHNzbF9jb25uZWN0XzJfd3JpdGluZykgewogCi0gICAgICBjdXJsX3NvY2tldF90IHdyaXRlZmQgPSBzc2xfY29ubmVjdF8yX3dyaXRpbmc9PQorICAgICAgY3VybF9zb2NrZXRfdCB3cml0ZWZkID0gc3NsX2Nvbm5lY3RfMl93cml0aW5nID09CiAgICAgICAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGU/c29ja2ZkOkNVUkxfU09DS0VUX0JBRDsKLSAgICAgIGN1cmxfc29ja2V0X3QgcmVhZGZkID0gc3NsX2Nvbm5lY3RfMl9yZWFkaW5nPT0KKyAgICAgIGN1cmxfc29ja2V0X3QgcmVhZGZkID0gc3NsX2Nvbm5lY3RfMl9yZWFkaW5nID09CiAgICAgICAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGU/c29ja2ZkOkNVUkxfU09DS0VUX0JBRDsKIAogICAgICAgd2hhdCA9IEN1cmxfc29ja2V0X2NoZWNrKHJlYWRmZCwgQ1VSTF9TT0NLRVRfQkFELCB3cml0ZWZkLApAQCAtODk5LDE4ICs5MjMsMTQgQEAKIH0KIAogCi1DVVJMY29kZQotQ3VybF9jeWFzc2xfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmRvbmUpCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9jeWFzc2xfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LCBib29sICpkb25lKQogewogICByZXR1cm4gY3lhc3NsX2Nvbm5lY3RfY29tbW9uKGNvbm4sIHNvY2tpbmRleCwgVFJVRSwgZG9uZSk7CiB9CiAKIAotQ1VSTGNvZGUKLUN1cmxfY3lhc3NsX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4KQorc3RhdGljIENVUkxjb2RlIEN1cmxfY3lhc3NsX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQogewogICBDVVJMY29kZSByZXN1bHQ7CiAgIGJvb2wgZG9uZSA9IEZBTFNFOwpAQCAtOTI0LDkgKzk0NCw4IEBACiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIAotQ1VSTGNvZGUgQ3VybF9jeWFzc2xfcmFuZG9tKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW50cm9weSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKQorc3RhdGljIENVUkxjb2RlIEN1cmxfY3lhc3NsX3JhbmRvbShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbnRyb3B5LCBzaXplX3QgbGVuZ3RoKQogewogICBSTkcgcm5nOwogICAodm9pZClkYXRhOwpAQCAtOTM5LDEwICs5NTgsMTAgQEAKICAgcmV0dXJuIENVUkxFX09LOwogfQogCi12b2lkIEN1cmxfY3lhc3NsX3NoYTI1NnN1bShjb25zdCB1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzaGEyNTZzdW0gLyogb3V0cHV0ICovLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB1bnVzZWQpCitzdGF0aWMgdm9pZCBDdXJsX2N5YXNzbF9zaGEyNTZzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0bXBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc2hhMjU2c3VtIC8qIG91dHB1dCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdW51c2VkKQogewogICBTaGEyNTYgU0hBMjU2cHc7CiAgICh2b2lkKXVudXNlZDsKQEAgLTk1MSw0ICs5NzAsNDggQEAKICAgU2hhMjU2RmluYWwoJlNIQTI1NnB3LCBzaGEyNTZzdW0pOwogfQogCitzdGF0aWMgdm9pZCAqQ3VybF9jeWFzc2xfZ2V0X2ludGVybmFscyhzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxJTkZPIGluZm8gVU5VU0VEX1BBUkFNKQoreworICAodm9pZClpbmZvOworICByZXR1cm4gQkFDS0VORC0+aGFuZGxlOworfQorCitjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgQ3VybF9zc2xfY3lhc3NsID0geworICB7IENVUkxTU0xCQUNLRU5EX1dPTEZTU0wsICJXb2xmU1NMIiB9LCAvKiBpbmZvICovCisKKyAgMCwgLyogaGF2ZV9jYV9wYXRoICovCisgIDAsIC8qIGhhdmVfY2VydGluZm8gKi8KKyNpZmRlZiBLRUVQX1BFRVJfQ0VSVAorICAxLCAvKiBoYXZlX3Bpbm5lZHB1YmtleSAqLworI2Vsc2UKKyAgMCwgLyogaGF2ZV9waW5uZWRwdWJrZXkgKi8KKyNlbmRpZgorICAxLCAvKiBoYXZlX3NzbF9jdHggKi8KKyAgMCwgLyogc3VwcG9ydF9odHRwc19wcm94eSAqLworCisgIHNpemVvZihzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSksCisKKyAgQ3VybF9jeWFzc2xfaW5pdCwgICAgICAgICAgICAgICAgLyogaW5pdCAqLworICBDdXJsX25vbmVfY2xlYW51cCwgICAgICAgICAgICAgICAvKiBjbGVhbnVwICovCisgIEN1cmxfY3lhc3NsX3ZlcnNpb24sICAgICAgICAgICAgIC8qIHZlcnNpb24gKi8KKyAgQ3VybF9ub25lX2NoZWNrX2N4biwgICAgICAgICAgICAgLyogY2hlY2tfY3huICovCisgIEN1cmxfY3lhc3NsX3NodXRkb3duLCAgICAgICAgICAgIC8qIHNodXRkb3duICovCisgIEN1cmxfY3lhc3NsX2RhdGFfcGVuZGluZywgICAgICAgIC8qIGRhdGFfcGVuZGluZyAqLworICBDdXJsX2N5YXNzbF9yYW5kb20sICAgICAgICAgICAgICAvKiByYW5kb20gKi8KKyAgQ3VybF9ub25lX2NlcnRfc3RhdHVzX3JlcXVlc3QsICAgLyogY2VydF9zdGF0dXNfcmVxdWVzdCAqLworICBDdXJsX2N5YXNzbF9jb25uZWN0LCAgICAgICAgICAgICAvKiBjb25uZWN0ICovCisgIEN1cmxfY3lhc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcsIC8qIGNvbm5lY3Rfbm9uYmxvY2tpbmcgKi8KKyAgQ3VybF9jeWFzc2xfZ2V0X2ludGVybmFscywgICAgICAgLyogZ2V0X2ludGVybmFscyAqLworICBDdXJsX2N5YXNzbF9jbG9zZSwgICAgICAgICAgICAgICAvKiBjbG9zZSAqLworICBDdXJsX25vbmVfY2xvc2VfYWxsLCAgICAgICAgICAgICAvKiBjbG9zZV9hbGwgKi8KKyAgQ3VybF9jeWFzc2xfc2Vzc2lvbl9mcmVlLCAgICAgICAgLyogc2Vzc2lvbl9mcmVlICovCisgIEN1cmxfbm9uZV9zZXRfZW5naW5lLCAgICAgICAgICAgIC8qIHNldF9lbmdpbmUgKi8KKyAgQ3VybF9ub25lX3NldF9lbmdpbmVfZGVmYXVsdCwgICAgLyogc2V0X2VuZ2luZV9kZWZhdWx0ICovCisgIEN1cmxfbm9uZV9lbmdpbmVzX2xpc3QsICAgICAgICAgIC8qIGVuZ2luZXNfbGlzdCAqLworICBDdXJsX25vbmVfZmFsc2Vfc3RhcnQsICAgICAgICAgICAvKiBmYWxzZV9zdGFydCAqLworICBDdXJsX25vbmVfbWQ1c3VtLCAgICAgICAgICAgICAgICAvKiBtZDVzdW0gKi8KKyAgQ3VybF9jeWFzc2xfc2hhMjU2c3VtICAgICAgICAgICAgLyogc2hhMjU2c3VtICovCit9OworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvY3lhc3NsLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2N5YXNzbC5oCmluZGV4IGY0NzcxOWUuLjAxZTExY2MgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvY3lhc3NsLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9jeWFzc2wuaApAQCAtMjUsNjggKzI1LDcgQEAKIAogI2lmZGVmIFVTRV9DWUFTU0wKIAotLyogS0VFUF9QRUVSX0NFUlQgaXMgYSBwcm9kdWN0IG9mIHRoZSBwcmVzZW5jZSBvZiBidWlsZCB0aW1lIHN5bWJvbAotICAgT1BFTlNTTF9FWFRSQSB3aXRob3V0IE5PX0NFUlRTLCBkZXBlbmRpbmcgb24gdGhlIHZlcnNpb24uIEtFRVBfUEVFUl9DRVJUIGlzCi0gICBpbiB3b2xmU1NMJ3Mgc2V0dGluZ3MuaCwgYW5kIHRoZSBsYXR0ZXIgdHdvIGFyZSBidWlsZCB0aW1lIHN5bWJvbHMgaW4KLSAgIG9wdGlvbnMuaC4gKi8KLSNpZm5kZWYgS0VFUF9QRUVSX0NFUlQKLSNpZiBkZWZpbmVkKEhBVkVfQ1lBU1NMX0dFVF9QRUVSX0NFUlRJRklDQVRFKSB8fCBcCi0gICAgZGVmaW5lZChIQVZFX1dPTEZTU0xfR0VUX1BFRVJfQ0VSVElGSUNBVEUpIHx8IFwKLSAgICAoZGVmaW5lZChPUEVOU1NMX0VYVFJBKSAmJiAhZGVmaW5lZChOT19DRVJUUykpCi0jZGVmaW5lIEtFRVBfUEVFUl9DRVJUCi0jZW5kaWYKLSNlbmRpZgotCi1DVVJMY29kZSBDdXJsX2N5YXNzbF9jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci1ib29sIEN1cmxfY3lhc3NsX2RhdGFfcGVuZGluZyhjb25zdCBzdHJ1Y3QgY29ubmVjdGRhdGEqIGNvbm4sIGludCBjb25uaW5kZXgpOwotaW50IEN1cmxfY3lhc3NsX3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSogY29ubiwgaW50IHNvY2tpbmRleCk7Ci0KLSAvKiBjbG9zZSBhIFNTTCBjb25uZWN0aW9uICovCi12b2lkIEN1cmxfY3lhc3NsX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci0KLXZvaWQgQ3VybF9jeWFzc2xfc2Vzc2lvbl9mcmVlKHZvaWQgKnB0cik7Ci1zaXplX3QgQ3VybF9jeWFzc2xfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKTsKLWludCBDdXJsX2N5YXNzbF9zaHV0ZG93bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotaW50IEN1cmxfY3lhc3NsX2luaXQodm9pZCk7Ci1DVVJMY29kZSBDdXJsX2N5YXNzbF9jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqZG9uZSk7Ci1DVVJMY29kZSBDdXJsX2N5YXNzbF9yYW5kb20oc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbnRyb3B5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpOwotdm9pZCBDdXJsX2N5YXNzbF9zaGEyNTZzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTI1NnN1bSwgLyogb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICBzaXplX3QgdW51c2VkKTsKLQotLyogU2V0IHRoZSBBUEkgYmFja2VuZCBkZWZpbml0aW9uIHRvIEN5YVNTTCAqLwotI2RlZmluZSBDVVJMX1NTTF9CQUNLRU5EIENVUkxTU0xCQUNLRU5EX0NZQVNTTAotCi0vKiB0aGlzIGJhY2tlbmQgc3VwcG9ydHMgQ1VSTE9QVF9TU0xfQ1RYXyogKi8KLSNkZWZpbmUgaGF2ZV9jdXJsc3NsX3NzbF9jdHggMQotCi0jaWZkZWYgS0VFUF9QRUVSX0NFUlQKLS8qIHRoaXMgYmFja2VuZCBzdXBwb3J0cyBDVVJMT1BUX1BJTk5FRFBVQkxJQ0tFWSAqLwotI2RlZmluZSBoYXZlX2N1cmxzc2xfcGlubmVkcHVia2V5IDEKLSNlbmRpZgotCi0vKiBBUEkgc2V0dXAgZm9yIEN5YVNTTCAqLwotI2RlZmluZSBjdXJsc3NsX2luaXQgQ3VybF9jeWFzc2xfaW5pdAotI2RlZmluZSBjdXJsc3NsX2NsZWFudXAoKSBDdXJsX25vcF9zdG10Ci0jZGVmaW5lIGN1cmxzc2xfY29ubmVjdCBDdXJsX2N5YXNzbF9jb25uZWN0Ci0jZGVmaW5lIGN1cmxzc2xfY29ubmVjdF9ub25ibG9ja2luZyBDdXJsX2N5YXNzbF9jb25uZWN0X25vbmJsb2NraW5nCi0jZGVmaW5lIGN1cmxzc2xfc2Vzc2lvbl9mcmVlKHgpICBDdXJsX2N5YXNzbF9zZXNzaW9uX2ZyZWUoeCkKLSNkZWZpbmUgY3VybHNzbF9jbG9zZV9hbGwoeCkgKCh2b2lkKXgpCi0jZGVmaW5lIGN1cmxzc2xfY2xvc2UgQ3VybF9jeWFzc2xfY2xvc2UKLSNkZWZpbmUgY3VybHNzbF9zaHV0ZG93bih4LHkpIEN1cmxfY3lhc3NsX3NodXRkb3duKHgseSkKLSNkZWZpbmUgY3VybHNzbF9zZXRfZW5naW5lKHgseSkgKCh2b2lkKXgsICh2b2lkKXksIENVUkxFX05PVF9CVUlMVF9JTikKLSNkZWZpbmUgY3VybHNzbF9zZXRfZW5naW5lX2RlZmF1bHQoeCkgKCh2b2lkKXgsIENVUkxFX05PVF9CVUlMVF9JTikKLSNkZWZpbmUgY3VybHNzbF9lbmdpbmVzX2xpc3QoeCkgKCh2b2lkKXgsIChzdHJ1Y3QgY3VybF9zbGlzdCAqKU5VTEwpCi0jZGVmaW5lIGN1cmxzc2xfdmVyc2lvbiBDdXJsX2N5YXNzbF92ZXJzaW9uCi0jZGVmaW5lIGN1cmxzc2xfY2hlY2tfY3huKHgpICgodm9pZCl4LCAtMSkKLSNkZWZpbmUgY3VybHNzbF9kYXRhX3BlbmRpbmcoeCx5KSBDdXJsX2N5YXNzbF9kYXRhX3BlbmRpbmcoeCx5KQotI2RlZmluZSBjdXJsc3NsX3JhbmRvbSh4LHkseikgQ3VybF9jeWFzc2xfcmFuZG9tKHgseSx6KQotI2RlZmluZSBjdXJsc3NsX3NoYTI1NnN1bShhLGIsYyxkKSBDdXJsX2N5YXNzbF9zaGEyNTZzdW0oYSxiLGMsZCkKK2V4dGVybiBjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgQ3VybF9zc2xfY3lhc3NsOwogCiAjZW5kaWYgLyogVVNFX0NZQVNTTCAqLwogI2VuZGlmIC8qIEhFQURFUl9DVVJMX0NZQVNTTF9IICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2RhcndpbnNzbC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9kYXJ3aW5zc2wuYwppbmRleCAwNDE3NjY1Li5hOThmNDMzIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2RhcndpbnNzbC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvZGFyd2luc3NsLmMKQEAgLTM0LDExICszNCwxOCBAQAogCiAjaWZkZWYgVVNFX0RBUldJTlNTTAogCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdGF1dG9sb2dpY2FsLXBvaW50ZXItY29tcGFyZSIKKyNlbmRpZiAvKiBfX2NsYW5nX18gKi8KKwogI2lmZGVmIEhBVkVfTElNSVRTX0gKICNpbmNsdWRlIDxsaW1pdHMuaD4KICNlbmRpZgogCiAjaW5jbHVkZSA8U2VjdXJpdHkvU2VjdXJpdHkuaD4KKy8qIEZvciBzb21lIHJlYXNvbiwgd2hlbiBidWlsZGluZyBmb3IgaU9TLCB0aGUgb21uaWJ1cyBoZWFkZXIgYWJvdmUgZG9lcworICogbm90IGluY2x1ZGUgU2VjdXJlVHJhbnNwb3J0LmggYXMgb2YgaU9TIFNESyA1LjEuICovCiAjaW5jbHVkZSA8U2VjdXJpdHkvU2VjdXJlVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ29yZUZvdW5kYXRpb24uaD4KICNpbmNsdWRlIDxDb21tb25DcnlwdG8vQ29tbW9uRGlnZXN0Lmg+CkBAIC0xMTMsNiArMTIwLDMzIEBACiAjZGVmaW5lIGlvRXJyIC0zNgogI2RlZmluZSBwYXJhbUVyciAtNTAKIAorc3RydWN0IHNzbF9iYWNrZW5kX2RhdGEgeworICBTU0xDb250ZXh0UmVmIHNzbF9jdHg7CisgIGN1cmxfc29ja2V0X3Qgc3NsX3NvY2tmZDsKKyAgYm9vbCBzc2xfZGlyZWN0aW9uOyAvKiB0cnVlIGlmIHdyaXRpbmcsIGZhbHNlIGlmIHJlYWRpbmcgKi8KKyAgc2l6ZV90IHNzbF93cml0ZV9idWZmZXJlZF9sZW5ndGg7Cit9OworCisjZGVmaW5lIEJBQ0tFTkQgY29ubnNzbC0+YmFja2VuZAorCisvKiBwaW5uZWQgcHVibGljIGtleSBzdXBwb3J0IHRlc3RzICovCisKKy8qIHZlcnNpb24gMSBzdXBwb3J0cyBtYWNPUyAxMC4xMisgYW5kIGlPUyAxMCsgKi8KKyNpZiAoKFRBUkdFVF9PU19JUEhPTkUgJiYgX19JUEhPTkVfT1NfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPj0gMTAwMDAwKSB8fCBcCisgICAgKCFUQVJHRVRfT1NfSVBIT05FICYmIF9fTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgID49IDEwMTIwMCkpCisjZGVmaW5lIERBUldJTl9TU0xfUElOTkVEUFVCS0VZX1YxIDEKKyNlbmRpZgorCisvKiB2ZXJzaW9uIDIgc3VwcG9ydHMgTWFjT1NYIDEwLjcrICovCisjaWYgKCFUQVJHRVRfT1NfSVBIT05FICYmIF9fTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPj0gMTA3MCkKKyNkZWZpbmUgREFSV0lOX1NTTF9QSU5ORURQVUJLRVlfVjIgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERBUldJTl9TU0xfUElOTkVEUFVCS0VZX1YxKSB8fCBkZWZpbmVkKERBUldJTl9TU0xfUElOTkVEUFVCS0VZX1YyKQorLyogdGhpcyBiYWNrZW5kIHN1cHBvcnRzIENVUkxPUFRfUElOTkVEUFVCTElDS0VZICovCisjZGVmaW5lIERBUldJTl9TU0xfUElOTkVEUFVCS0VZIDEKKyNlbmRpZiAvKiBEQVJXSU5fU1NMX1BJTk5FRFBVQktFWSAqLworCiAjaWZkZWYgREFSV0lOX1NTTF9QSU5ORURQVUJLRVkKIC8qIGJvdGggbmV3IGFuZCBvbGQgQVBJcyByZXR1cm4gcnNhIGtleXMgbWlzc2luZyB0aGUgc3BraSBoZWFkZXIgKG5vdCBERVIpICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciByc2E0MDk2U3BraUhlYWRlcltdID0gewpAQCAtMTU2LDcgKzE5MCw3IEBACiAgIFVJbnQ4ICpjdXJyRGF0YSA9IChVSW50OCAqKWRhdGE7CiAgIC8qaW50IHNvY2sgPSAqKGludCAqKWNvbm5lY3Rpb247Ki8KICAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAoc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKiljb25uZWN0aW9uOwotICBpbnQgc29jayA9IGNvbm5zc2wtPnNzbF9zb2NrZmQ7CisgIGludCBzb2NrID0gQkFDS0VORC0+c3NsX3NvY2tmZDsKICAgT1NTdGF0dXMgcnRuID0gbm9FcnI7CiAgIHNpemVfdCBieXRlc1JlYWQ7CiAgIHNzaXplX3QgcnJ0bjsKQEAgLTE4NSw3ICsyMTksNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgY2FzZSBFQUdBSU46CiAgICAgICAgICAgICBydG4gPSBlcnJTU0xXb3VsZEJsb2NrOwotICAgICAgICAgICAgY29ubnNzbC0+c3NsX2RpcmVjdGlvbiA9IGZhbHNlOworICAgICAgICAgICAgQkFDS0VORC0+c3NsX2RpcmVjdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJ0biA9IGlvRXJyOwpAQCAtMjE2LDcgKzI1MCw3IEBACiAgIHNpemVfdCBieXRlc1NlbnQgPSAwOwogICAvKmludCBzb2NrID0gKihpbnQgKiljb25uZWN0aW9uOyovCiAgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gKHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICopY29ubmVjdGlvbjsKLSAgaW50IHNvY2sgPSBjb25uc3NsLT5zc2xfc29ja2ZkOworICBpbnQgc29jayA9IEJBQ0tFTkQtPnNzbF9zb2NrZmQ7CiAgIHNzaXplX3QgbGVuZ3RoOwogICBzaXplX3QgZGF0YUxlbiA9ICpkYXRhTGVuZ3RoOwogICBjb25zdCBVSW50OCAqZGF0YVB0ciA9IChVSW50OCAqKWRhdGE7CkBAIC0yMzYsNyArMjcwLDcgQEAKICAgICB0aGVFcnIgPSBlcnJubzsKICAgICBpZih0aGVFcnIgPT0gRUFHQUlOKSB7CiAgICAgICBvcnRuID0gZXJyU1NMV291bGRCbG9jazsKLSAgICAgIGNvbm5zc2wtPnNzbF9kaXJlY3Rpb24gPSB0cnVlOworICAgICAgQkFDS0VORC0+c3NsX2RpcmVjdGlvbiA9IHRydWU7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgb3J0biA9IGlvRXJyOwpAQCAtODQ0LDcgKzg3OCw3IEBACiAgICBpbnRvIGEgc3RyaW5nLiBTb21lIGFyZW4ndCBhdmFpbGFibGUgdW5kZXIgaU9TIG9yIG5ld2VyIGNhdHMuIFNvIGhlcmUncwogICAgYSB1bmlmaWVkIGZ1bmN0aW9uIGZvciBnZXR0aW5nIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNlcnRpZmljYXRlIHRoYXQKICAgIG91Z2h0IHRvIHdvcmsgaW4gYWxsIGNhdHMgc3RhcnRpbmcgd2l0aCBMZW9wYXJkLiAqLwotQ0ZfSU5MSU5FIENGU3RyaW5nUmVmIENvcHlDZXJ0U3ViamVjdChTZWNDZXJ0aWZpY2F0ZVJlZiBjZXJ0KQorQ0ZfSU5MSU5FIENGU3RyaW5nUmVmIGdldHN1YmplY3QoU2VjQ2VydGlmaWNhdGVSZWYgY2VydCkKIHsKICAgQ0ZTdHJpbmdSZWYgc2VydmVyX2NlcnRfc3VtbWFyeSA9IENGU1RSKCIobnVsbCkiKTsKIApAQCAtODcxLDYgKzkwNSw1NCBAQAogICByZXR1cm4gc2VydmVyX2NlcnRfc3VtbWFyeTsKIH0KIAorc3RhdGljIENVUkxjb2RlIENvcHlDZXJ0U3ViamVjdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWNDZXJ0aWZpY2F0ZVJlZiBjZXJ0LCBjaGFyICoqY2VydHApCit7CisgIENGU3RyaW5nUmVmIGMgPSBnZXRzdWJqZWN0KGNlcnQpOworICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKKyAgY29uc3QgY2hhciAqZGlyZWN0OworICBjaGFyICpjYnVmID0gTlVMTDsKKyAgKmNlcnRwID0gTlVMTDsKKworICBpZighYykgeworICAgIGZhaWxmKGRhdGEsICJTU0w6IGludmFsaWQgQ0EgY2VydGlmaWNhdGUgc3ViamVjdCIpOworICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOworICB9CisKKyAgLyogSWYgdGhlIHN1YmplY3QgaXMgYWxyZWFkeSBhdmFpbGFibGUgYXMgVVRGLTggZW5jb2RlZCAoaWUgJ2RpcmVjdCcpIHRoZW4KKyAgICAgdXNlIHRoYXQsIGVsc2UgY29udmVydCBpdC4gKi8KKyAgZGlyZWN0ID0gQ0ZTdHJpbmdHZXRDU3RyaW5nUHRyKGMsIGtDRlN0cmluZ0VuY29kaW5nVVRGOCk7CisgIGlmKGRpcmVjdCkgeworICAgICpjZXJ0cCA9IHN0cmR1cChkaXJlY3QpOworICAgIGlmKCEqY2VydHApIHsKKyAgICAgIGZhaWxmKGRhdGEsICJTU0w6IG91dCBvZiBtZW1vcnkiKTsKKyAgICAgIHJlc3VsdCA9IENVUkxFX09VVF9PRl9NRU1PUlk7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIHNpemVfdCBjYnVmX3NpemUgPSAoKHNpemVfdClDRlN0cmluZ0dldExlbmd0aChjKSAqIDQpICsgMTsKKyAgICBjYnVmID0gY2FsbG9jKGNidWZfc2l6ZSwgMSk7CisgICAgaWYoY2J1ZikgeworICAgICAgaWYoIUNGU3RyaW5nR2V0Q1N0cmluZyhjLCBjYnVmLCBjYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmluZ0VuY29kaW5nVVRGOCkpIHsKKyAgICAgICAgZmFpbGYoZGF0YSwgIlNTTDogaW52YWxpZCBDQSBjZXJ0aWZpY2F0ZSBzdWJqZWN0Iik7CisgICAgICAgIHJlc3VsdCA9IENVUkxFX1NTTF9DQUNFUlQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIC8qIHBhc3MgYmFjayB0aGUgYnVmZmVyICovCisgICAgICAgICpjZXJ0cCA9IGNidWY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZmFpbGYoZGF0YSwgIlNTTDogY291bGRuJ3QgYWxsb2NhdGUgJXp1IGJ5dGVzIG9mIG1lbW9yeSIsIGNidWZfc2l6ZSk7CisgICAgICByZXN1bHQgPSBDVVJMRV9PVVRfT0ZfTUVNT1JZOworICAgIH0KKyAgfQorICBpZihyZXN1bHQpCisgICAgZnJlZShjYnVmKTsKKyAgQ0ZSZWxlYXNlKGMpOworICByZXR1cm4gcmVzdWx0OworfQorCiAjaWYgQ1VSTF9TVVBQT1JUX01BQ18xMF82CiAvKiBUaGUgU2VjS2V5Y2hhaW5TZWFyY2ggQVBJIHdhcyBkZXByZWNhdGVkIGluIExpb24sIGFuZCB1c2luZyBpdCB3aWxsIHJhaXNlCiAgICBkZXByZWNhdGlvbiB3YXJuaW5ncywgc28gbGV0J3Mgbm90IGNvbXBpbGUgdGhpcyB1bmxlc3MgaXQncyBuZWNlc3Nhcnk6ICovCkBAIC05NjMsNyArMTA0NSw3IEBACiAgICAgICBrZXlzX2xpc3RfY291bnQgPSBDRkFycmF5R2V0Q291bnQoa2V5c19saXN0KTsKICAgICAgICpvdXRfY2VydF9hbmRfa2V5ID0gTlVMTDsKICAgICAgIHN0YXR1cyA9IDE7Ci0gICAgICBmb3IoaT0wOyBpPGtleXNfbGlzdF9jb3VudDsgaSsrKSB7CisgICAgICBmb3IoaSA9IDA7IGk8a2V5c19saXN0X2NvdW50OyBpKyspIHsKICAgICAgICAgT1NTdGF0dXMgZXJyID0gbm9FcnI7CiAgICAgICAgIFNlY0NlcnRpZmljYXRlUmVmIGNlcnQgPSBOVUxMOwogICAgICAgICBTZWNJZGVudGl0eVJlZiBpZGVudGl0eSA9CkBAIC0xMDc1LDcgKzExNTcsOCBAQAogfQogCiAjaWYgQ1VSTF9CVUlMRF9NQUNfMTBfOCB8fCBDVVJMX0JVSUxEX0lPUwotc3RhdGljIENVUkxjb2RlIGRhcndpbnNzbF92ZXJzaW9uX2Zyb21fY3VybChsb25nICpkYXJ3aW52ZXIsIGxvbmcgc3NsX3ZlcnNpb24pCitzdGF0aWMgQ1VSTGNvZGUgZGFyd2luc3NsX3ZlcnNpb25fZnJvbV9jdXJsKFNTTFByb3RvY29sICpkYXJ3aW52ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgc3NsX3ZlcnNpb24pCiB7CiAgIHN3aXRjaChzc2xfdmVyc2lvbikgewogICAgIGNhc2UgQ1VSTF9TU0xWRVJTSU9OX1RMU3YxXzA6CkBAIC0xMTM2LDMwICsxMjE5LDMwIEBACiAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAotICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbk1pbihjb25uc3NsLT5zc2xfY3R4LCBkYXJ3aW5fdmVyX21pbik7Ci0gICAgKHZvaWQpU1NMU2V0UHJvdG9jb2xWZXJzaW9uTWF4KGNvbm5zc2wtPnNzbF9jdHgsIGRhcndpbl92ZXJfbWF4KTsKKyAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25NaW4oQkFDS0VORC0+c3NsX2N0eCwgZGFyd2luX3Zlcl9taW4pOworICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbk1heChCQUNLRU5ELT5zc2xfY3R4LCBkYXJ3aW5fdmVyX21heCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKICAgfQogICBlbHNlIHsKICNpZiBDVVJMX1NVUFBPUlRfTUFDXzEwXzgKICAgICBsb25nIGkgPSBzc2xfdmVyc2lvbjsKLSAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKGNvbm5zc2wtPnNzbF9jdHgsCisgICAgKHZvaWQpU1NMU2V0UHJvdG9jb2xWZXJzaW9uRW5hYmxlZChCQUNLRU5ELT5zc2xfY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NTTFByb3RvY29sQWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgIGZvcig7IGkgPD0gKHNzbF92ZXJzaW9uX21heCA+PiAxNik7IGkrKykgewogICAgICAgc3dpdGNoKGkpIHsKICAgICAgICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fVExTdjFfMDoKLSAgICAgICAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKGNvbm5zc2wtPnNzbF9jdHgsCisgICAgICAgICAgKHZvaWQpU1NMU2V0UHJvdG9jb2xWZXJzaW9uRW5hYmxlZChCQUNLRU5ELT5zc2xfY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVExTUHJvdG9jb2wxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fVExTdjFfMToKLSAgICAgICAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKGNvbm5zc2wtPnNzbF9jdHgsCisgICAgICAgICAgKHZvaWQpU1NMU2V0UHJvdG9jb2xWZXJzaW9uRW5hYmxlZChCQUNLRU5ELT5zc2xfY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVExTUHJvdG9jb2wxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQ1VSTF9TU0xWRVJTSU9OX1RMU3YxXzI6Ci0gICAgICAgICAgKHZvaWQpU1NMU2V0UHJvdG9jb2xWZXJzaW9uRW5hYmxlZChjb25uc3NsLT5zc2xfY3R4LAorICAgICAgICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbkVuYWJsZWQoQkFDS0VORC0+c3NsX2N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RMU1Byb3RvY29sMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwogICAgICAgICAgIGJyZWFrOwpAQCAtMTIwNSwxMCArMTI4OCwxMCBAQAogCiAjaWYgQ1VSTF9CVUlMRF9NQUNfMTBfOCB8fCBDVVJMX0JVSUxEX0lPUwogICBpZihTU0xDcmVhdGVDb250ZXh0ICE9IE5VTEwpIHsgIC8qIHVzZSB0aGUgbmV3ZXIgQVBJIGlmIGF2YWlhbGJsZSAqLwotICAgIGlmKGNvbm5zc2wtPnNzbF9jdHgpCi0gICAgICBDRlJlbGVhc2UoY29ubnNzbC0+c3NsX2N0eCk7Ci0gICAgY29ubnNzbC0+c3NsX2N0eCA9IFNTTENyZWF0ZUNvbnRleHQoTlVMTCwga1NTTENsaWVudFNpZGUsIGtTU0xTdHJlYW1UeXBlKTsKLSAgICBpZighY29ubnNzbC0+c3NsX2N0eCkgeworICAgIGlmKEJBQ0tFTkQtPnNzbF9jdHgpCisgICAgICBDRlJlbGVhc2UoQkFDS0VORC0+c3NsX2N0eCk7CisgICAgQkFDS0VORC0+c3NsX2N0eCA9IFNTTENyZWF0ZUNvbnRleHQoTlVMTCwga1NTTENsaWVudFNpZGUsIGtTU0xTdHJlYW1UeXBlKTsKKyAgICBpZighQkFDS0VORC0+c3NsX2N0eCkgewogICAgICAgZmFpbGYoZGF0YSwgIlNTTDogY291bGRuJ3QgY3JlYXRlIGEgY29udGV4dCEiKTsKICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICAgIH0KQEAgLTEyMTYsOSArMTI5OSw5IEBACiAgIGVsc2UgewogICAvKiBUaGUgb2xkIFNUIEFQSSBkb2VzIG5vdCBleGlzdCB1bmRlciBpT1MsIHNvIGRvbid0IGNvbXBpbGUgaXQ6ICovCiAjaWYgQ1VSTF9TVVBQT1JUX01BQ18xMF84Ci0gICAgaWYoY29ubnNzbC0+c3NsX2N0eCkKLSAgICAgICh2b2lkKVNTTERpc3Bvc2VDb250ZXh0KGNvbm5zc2wtPnNzbF9jdHgpOwotICAgIGVyciA9IFNTTE5ld0NvbnRleHQoZmFsc2UsICYoY29ubnNzbC0+c3NsX2N0eCkpOworICAgIGlmKEJBQ0tFTkQtPnNzbF9jdHgpCisgICAgICAodm9pZClTU0xEaXNwb3NlQ29udGV4dChCQUNLRU5ELT5zc2xfY3R4KTsKKyAgICBlcnIgPSBTU0xOZXdDb250ZXh0KGZhbHNlLCAmKEJBQ0tFTkQtPnNzbF9jdHgpKTsKICAgICBpZihlcnIgIT0gbm9FcnIpIHsKICAgICAgIGZhaWxmKGRhdGEsICJTU0w6IGNvdWxkbid0IGNyZWF0ZSBhIGNvbnRleHQ6IE9TU3RhdHVzICVkIiwgZXJyKTsKICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwpAQCAtMTIyNiwxNSArMTMwOSwxNSBAQAogI2VuZGlmIC8qIENVUkxfU1VQUE9SVF9NQUNfMTBfOCAqLwogICB9CiAjZWxzZQotICBpZihjb25uc3NsLT5zc2xfY3R4KQotICAgICh2b2lkKVNTTERpc3Bvc2VDb250ZXh0KGNvbm5zc2wtPnNzbF9jdHgpOwotICBlcnIgPSBTU0xOZXdDb250ZXh0KGZhbHNlLCAmKGNvbm5zc2wtPnNzbF9jdHgpKTsKKyAgaWYoQkFDS0VORC0+c3NsX2N0eCkKKyAgICAodm9pZClTU0xEaXNwb3NlQ29udGV4dChCQUNLRU5ELT5zc2xfY3R4KTsKKyAgZXJyID0gU1NMTmV3Q29udGV4dChmYWxzZSwgJihCQUNLRU5ELT5zc2xfY3R4KSk7CiAgIGlmKGVyciAhPSBub0VycikgewogICAgIGZhaWxmKGRhdGEsICJTU0w6IGNvdWxkbid0IGNyZWF0ZSBhIGNvbnRleHQ6IE9TU3RhdHVzICVkIiwgZXJyKTsKICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgfQogI2VuZGlmIC8qIENVUkxfQlVJTERfTUFDXzEwXzggfHwgQ1VSTF9CVUlMRF9JT1MgKi8KLSAgY29ubnNzbC0+c3NsX3dyaXRlX2J1ZmZlcmVkX2xlbmd0aCA9IDBVTDsgLyogcmVzZXQgYnVmZmVyZWQgd3JpdGUgbGVuZ3RoICovCisgIEJBQ0tFTkQtPnNzbF93cml0ZV9idWZmZXJlZF9sZW5ndGggPSAwVUw7IC8qIHJlc2V0IGJ1ZmZlcmVkIHdyaXRlIGxlbmd0aCAqLwogCiAgIC8qIGNoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBiZWVuIHRvbGQgdG8gdXNlIGFuIGV4cGxpY2l0IFNTTC9UTFMgdmVyc2lvbiAqLwogI2lmIENVUkxfQlVJTERfTUFDXzEwXzggfHwgQ1VSTF9CVUlMRF9JT1MKQEAgLTEyNDIsOCArMTMyNSw4IEBACiAgICAgc3dpdGNoKGNvbm4tPnNzbF9jb25maWcudmVyc2lvbikgewogICAgIGNhc2UgQ1VSTF9TU0xWRVJTSU9OX0RFRkFVTFQ6CiAgICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fVExTdjE6Ci0gICAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25NaW4oY29ubnNzbC0+c3NsX2N0eCwga1RMU1Byb3RvY29sMSk7Ci0gICAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25NYXgoY29ubnNzbC0+c3NsX2N0eCwga1RMU1Byb3RvY29sMTIpOworICAgICAgKHZvaWQpU1NMU2V0UHJvdG9jb2xWZXJzaW9uTWluKEJBQ0tFTkQtPnNzbF9jdHgsIGtUTFNQcm90b2NvbDEpOworICAgICAgKHZvaWQpU1NMU2V0UHJvdG9jb2xWZXJzaW9uTWF4KEJBQ0tFTkQtPnNzbF9jdHgsIGtUTFNQcm90b2NvbDEyKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgQ1VSTF9TU0xWRVJTSU9OX1RMU3YxXzA6CiAgICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fVExTdjFfMToKQEAgLTEyNTYsMjAgKzEzMzksMjAgQEAKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fU1NMdjM6Ci0gICAgICBlcnIgPSBTU0xTZXRQcm90b2NvbFZlcnNpb25NaW4oY29ubnNzbC0+c3NsX2N0eCwga1NTTFByb3RvY29sMyk7CisgICAgICBlcnIgPSBTU0xTZXRQcm90b2NvbFZlcnNpb25NaW4oQkFDS0VORC0+c3NsX2N0eCwga1NTTFByb3RvY29sMyk7CiAgICAgICBpZihlcnIgIT0gbm9FcnIpIHsKICAgICAgICAgZmFpbGYoZGF0YSwgIllvdXIgdmVyc2lvbiBvZiB0aGUgT1MgZG9lcyBub3Qgc3VwcG9ydCBTU0x2MyIpOwogICAgICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CiAgICAgICB9Ci0gICAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25NYXgoY29ubnNzbC0+c3NsX2N0eCwga1NTTFByb3RvY29sMyk7CisgICAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25NYXgoQkFDS0VORC0+c3NsX2N0eCwga1NTTFByb3RvY29sMyk7CiAgICAgICBicmVhazsKICAgICBjYXNlIENVUkxfU1NMVkVSU0lPTl9TU0x2MjoKLSAgICAgIGVyciA9IFNTTFNldFByb3RvY29sVmVyc2lvbk1pbihjb25uc3NsLT5zc2xfY3R4LCBrU1NMUHJvdG9jb2wyKTsKKyAgICAgIGVyciA9IFNTTFNldFByb3RvY29sVmVyc2lvbk1pbihCQUNLRU5ELT5zc2xfY3R4LCBrU1NMUHJvdG9jb2wyKTsKICAgICAgIGlmKGVyciAhPSBub0VycikgewogICAgICAgICBmYWlsZihkYXRhLCAiWW91ciB2ZXJzaW9uIG9mIHRoZSBPUyBkb2VzIG5vdCBzdXBwb3J0IFNTTHYyIik7CiAgICAgICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKICAgICAgIH0KLSAgICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbk1heChjb25uc3NsLT5zc2xfY3R4LCBrU1NMUHJvdG9jb2wyKTsKKyAgICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbk1heChCQUNLRU5ELT5zc2xfY3R4LCBrU1NMUHJvdG9jb2wyKTsKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICBmYWlsZihkYXRhLCAiVW5yZWNvZ25pemVkIHBhcmFtZXRlciBwYXNzZWQgdmlhIENVUkxPUFRfU1NMVkVSU0lPTiIpOwpAQCAtMTI3OCwxOSArMTM2MSwxOSBAQAogICB9CiAgIGVsc2UgewogI2lmIENVUkxfU1VQUE9SVF9NQUNfMTBfOAotICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbkVuYWJsZWQoY29ubnNzbC0+c3NsX2N0eCwKKyAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKEJBQ0tFTkQtPnNzbF9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU1NMUHJvdG9jb2xBbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CiAgICAgc3dpdGNoKGNvbm4tPnNzbF9jb25maWcudmVyc2lvbikgewogICAgIGNhc2UgQ1VSTF9TU0xWRVJTSU9OX0RFRkFVTFQ6CiAgICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fVExTdjE6Ci0gICAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKGNvbm5zc2wtPnNzbF9jdHgsCisgICAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKEJBQ0tFTkQtPnNzbF9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUTFNQcm90b2NvbDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgKHZvaWQpU1NMU2V0UHJvdG9jb2xWZXJzaW9uRW5hYmxlZChjb25uc3NsLT5zc2xfY3R4LAorICAgICAgKHZvaWQpU1NMU2V0UHJvdG9jb2xWZXJzaW9uRW5hYmxlZChCQUNLRU5ELT5zc2xfY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVExTUHJvdG9jb2wxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKGNvbm5zc2wtPnNzbF9jdHgsCisgICAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKEJBQ0tFTkQtPnNzbF9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUTFNQcm90b2NvbDEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKICAgICAgIGJyZWFrOwpAQCAtMTMwNSw3ICsxMzg4LDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fU1NMdjM6Ci0gICAgICBlcnIgPSBTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKGNvbm5zc2wtPnNzbF9jdHgsCisgICAgICBlcnIgPSBTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKEJBQ0tFTkQtPnNzbF9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTU0xQcm90b2NvbDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwogICAgICAgaWYoZXJyICE9IG5vRXJyKSB7CkBAIC0xMzE0LDcgKzEzOTcsNyBAQAogICAgICAgfQogICAgICAgYnJlYWs7CiAgICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fU1NMdjI6Ci0gICAgICBlcnIgPSBTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKGNvbm5zc2wtPnNzbF9jdHgsCisgICAgICBlcnIgPSBTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKEJBQ0tFTkQtPnNzbF9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTU0xQcm90b2NvbDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwogICAgICAgaWYoZXJyICE9IG5vRXJyKSB7CkBAIC0xMzM0LDEyICsxNDE3LDEyIEBACiAgICAgICAgICAgICAgICAgIiBTU0wvVExTIHZlcnNpb24iKTsKICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CiAgIH0KLSAgKHZvaWQpU1NMU2V0UHJvdG9jb2xWZXJzaW9uRW5hYmxlZChjb25uc3NsLT5zc2xfY3R4LCBrU1NMUHJvdG9jb2xBbGwsIGZhbHNlKTsKKyAgKHZvaWQpU1NMU2V0UHJvdG9jb2xWZXJzaW9uRW5hYmxlZChCQUNLRU5ELT5zc2xfY3R4LCBrU1NMUHJvdG9jb2xBbGwsIGZhbHNlKTsKICAgc3dpdGNoKGNvbm4tPnNzbF9jb25maWcudmVyc2lvbikgewogICBjYXNlIENVUkxfU1NMVkVSU0lPTl9ERUZBVUxUOgogICBjYXNlIENVUkxfU1NMVkVSU0lPTl9UTFN2MToKICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fVExTdjFfMDoKLSAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKGNvbm5zc2wtPnNzbF9jdHgsCisgICAgKHZvaWQpU1NMU2V0UHJvdG9jb2xWZXJzaW9uRW5hYmxlZChCQUNLRU5ELT5zc2xfY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RMU1Byb3RvY29sMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwogICAgIGJyZWFrOwpAQCAtMTM1Myw3ICsxNDM2LDcgQEAKICAgICBmYWlsZihkYXRhLCAiWW91ciB2ZXJzaW9uIG9mIHRoZSBPUyBkb2VzIG5vdCBzdXBwb3J0IFRMU3YxLjMiKTsKICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CiAgIGNhc2UgQ1VSTF9TU0xWRVJTSU9OX1NTTHYyOgotICAgIGVyciA9IFNTTFNldFByb3RvY29sVmVyc2lvbkVuYWJsZWQoY29ubnNzbC0+c3NsX2N0eCwKKyAgICBlcnIgPSBTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKEJBQ0tFTkQtPnNzbF9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU1NMUHJvdG9jb2wyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CiAgICAgaWYoZXJyICE9IG5vRXJyKSB7CkBAIC0xMzYyLDcgKzE0NDUsNyBAQAogICAgIH0KICAgICBicmVhazsKICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fU1NMdjM6Ci0gICAgZXJyID0gU1NMU2V0UHJvdG9jb2xWZXJzaW9uRW5hYmxlZChjb25uc3NsLT5zc2xfY3R4LAorICAgIGVyciA9IFNTTFNldFByb3RvY29sVmVyc2lvbkVuYWJsZWQoQkFDS0VORC0+c3NsX2N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTU0xQcm90b2NvbDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKICAgICBpZihlcnIgIT0gbm9FcnIpIHsKQEAgLTE0MTIsMjUgKzE0OTUsMjEgQEAKICAgICAgIC8qIElmIHdlIGZvdW5kIG9uZSwgcHJpbnQgaXQgb3V0OiAqLwogICAgICAgZXJyID0gU2VjSWRlbnRpdHlDb3B5Q2VydGlmaWNhdGUoY2VydF9hbmRfa2V5LCAmY2VydCk7CiAgICAgICBpZihlcnIgPT0gbm9FcnIpIHsKLSAgICAgICAgQ0ZTdHJpbmdSZWYgY2VydF9zdW1tYXJ5ID0gQ29weUNlcnRTdWJqZWN0KGNlcnQpOwotICAgICAgICBjaGFyIGNlcnRfc3VtbWFyeV9jWzEyOF07Ci0KLSAgICAgICAgaWYoY2VydF9zdW1tYXJ5KSB7Ci0gICAgICAgICAgbWVtc2V0KGNlcnRfc3VtbWFyeV9jLCAwLCAxMjgpOwotICAgICAgICAgIGlmKENGU3RyaW5nR2V0Q1N0cmluZyhjZXJ0X3N1bW1hcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfc3VtbWFyeV9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmluZ0VuY29kaW5nVVRGOCkpIHsKLSAgICAgICAgICAgIGluZm9mKGRhdGEsICJDbGllbnQgY2VydGlmaWNhdGU6ICVzXG4iLCBjZXJ0X3N1bW1hcnlfYyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIENGUmVsZWFzZShjZXJ0X3N1bW1hcnkpOwotICAgICAgICAgIENGUmVsZWFzZShjZXJ0KTsKKyAgICAgICAgY2hhciAqY2VydHA7CisgICAgICAgIENVUkxjb2RlIHJlc3VsdCA9IENvcHlDZXJ0U3ViamVjdChkYXRhLCBjZXJ0LCAmY2VydHApOworICAgICAgICBpZighcmVzdWx0KSB7CisgICAgICAgICAgaW5mb2YoZGF0YSwgIkNsaWVudCBjZXJ0aWZpY2F0ZTogJXNcbiIsIGNlcnRwKTsKKyAgICAgICAgICBmcmVlKGNlcnRwKTsKICAgICAgICAgfQorCisgICAgICAgIENGUmVsZWFzZShjZXJ0KTsKKyAgICAgICAgaWYocmVzdWx0KQorICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICB9CiAgICAgICBjZXJ0c19jWzBdID0gY2VydF9hbmRfa2V5OwogICAgICAgY2VydHMgPSBDRkFycmF5Q3JlYXRlKE5VTEwsIChjb25zdCB2b2lkICoqKWNlcnRzX2MsIDFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlQXJyYXlDYWxsQmFja3MpOwotICAgICAgZXJyID0gU1NMU2V0Q2VydGlmaWNhdGUoY29ubnNzbC0+c3NsX2N0eCwgY2VydHMpOworICAgICAgZXJyID0gU1NMU2V0Q2VydGlmaWNhdGUoQkFDS0VORC0+c3NsX2N0eCwgY2VydHMpOwogICAgICAgaWYoY2VydHMpCiAgICAgICAgIENGUmVsZWFzZShjZXJ0cyk7CiAgICAgICBpZihlcnIgIT0gbm9FcnIpIHsKQEAgLTE0OTMsNyArMTU3Miw3IEBACiAgIGlmKFNTTFNldFNlc3Npb25PcHRpb24gIT0gTlVMTCkgewogI2VuZGlmIC8qIENVUkxfQlVJTERfTUFDICovCiAgICAgYm9vbCBicmVha19vbl9hdXRoID0gIWNvbm4tPnNzbF9jb25maWcudmVyaWZ5cGVlciB8fCBzc2xfY2FmaWxlOwotICAgIGVyciA9IFNTTFNldFNlc3Npb25PcHRpb24oY29ubnNzbC0+c3NsX2N0eCwKKyAgICBlcnIgPSBTU0xTZXRTZXNzaW9uT3B0aW9uKEJBQ0tFTkQtPnNzbF9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU1NMU2Vzc2lvbk9wdGlvbkJyZWFrT25TZXJ2ZXJBdXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtfb25fYXV0aCk7CiAgICAgaWYoZXJyICE9IG5vRXJyKSB7CkBAIC0xNTAzLDcgKzE1ODIsNyBAQAogICB9CiAgIGVsc2UgewogI2lmIENVUkxfU1VQUE9SVF9NQUNfMTBfOAotICAgIGVyciA9IFNTTFNldEVuYWJsZUNlcnRWZXJpZnkoY29ubnNzbC0+c3NsX2N0eCwKKyAgICBlcnIgPSBTU0xTZXRFbmFibGVDZXJ0VmVyaWZ5KEJBQ0tFTkQtPnNzbF9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLT5zc2xfY29uZmlnLnZlcmlmeXBlZXI/dHJ1ZTpmYWxzZSk7CiAgICAgaWYoZXJyICE9IG5vRXJyKSB7CiAgICAgICBmYWlsZihkYXRhLCAiU1NMOiBTU0xTZXRFbmFibGVDZXJ0VmVyaWZ5KCkgZmFpbGVkOiBPU1N0YXR1cyAlZCIsIGVycik7CkBAIC0xNTEyLDcgKzE1OTEsNyBAQAogI2VuZGlmIC8qIENVUkxfU1VQUE9SVF9NQUNfMTBfOCAqLwogICB9CiAjZWxzZQotICBlcnIgPSBTU0xTZXRFbmFibGVDZXJ0VmVyaWZ5KGNvbm5zc2wtPnNzbF9jdHgsCisgIGVyciA9IFNTTFNldEVuYWJsZUNlcnRWZXJpZnkoQkFDS0VORC0+c3NsX2N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLT5zc2xfY29uZmlnLnZlcmlmeXBlZXI/dHJ1ZTpmYWxzZSk7CiAgIGlmKGVyciAhPSBub0VycikgewogICAgIGZhaWxmKGRhdGEsICJTU0w6IFNTTFNldEVuYWJsZUNlcnRWZXJpZnkoKSBmYWlsZWQ6IE9TU3RhdHVzICVkIiwgZXJyKTsKQEAgLTE1MzMsNyArMTYxMiw3IEBACiAgICAqIEJvdGggaG9zdG5hbWUgY2hlY2sgYW5kIFNOSSByZXF1aXJlIFNTTFNldFBlZXJEb21haW5OYW1lKCkuCiAgICAqIEFsc286IHRoZSB2ZXJpZnlob3N0IHNldHRpbmcgaW5mbHVlbmNlcyBTTkkgdXNhZ2UgKi8KICAgaWYoY29ubi0+c3NsX2NvbmZpZy52ZXJpZnlob3N0KSB7Ci0gICAgZXJyID0gU1NMU2V0UGVlckRvbWFpbk5hbWUoY29ubnNzbC0+c3NsX2N0eCwgaG9zdG5hbWUsCisgICAgZXJyID0gU1NMU2V0UGVlckRvbWFpbk5hbWUoQkFDS0VORC0+c3NsX2N0eCwgaG9zdG5hbWUsCiAgICAgc3RybGVuKGhvc3RuYW1lKSk7CiAKICAgICBpZihlcnIgIT0gbm9FcnIpIHsKQEAgLTE1NTksMTEgKzE2MzgsMTEgQEAKICAgICAgaGlnaGVyIHByaW9yaXR5LCBidXQgaXQncyBwcm9iYWJseSBiZXR0ZXIgdGhhdCB3ZSBub3QgY29ubmVjdCBhdCBhbGwgdGhhbgogICAgICB0byBnaXZlIHRoZSB1c2VyIGEgZmFsc2Ugc2Vuc2Ugb2Ygc2VjdXJpdHkgaWYgdGhlIHNlcnZlciBvbmx5IHN1cHBvcnRzCiAgICAgIGluc2VjdXJlIGNpcGhlcnMuIChOb3RlOiBXZSBkb24ndCBjYXJlIGFib3V0IFNTTHYyLW9ubHkgY2lwaGVycy4pICovCi0gICh2b2lkKVNTTEdldE51bWJlclN1cHBvcnRlZENpcGhlcnMoY29ubnNzbC0+c3NsX2N0eCwgJmFsbF9jaXBoZXJzX2NvdW50KTsKKyAgKHZvaWQpU1NMR2V0TnVtYmVyU3VwcG9ydGVkQ2lwaGVycyhCQUNLRU5ELT5zc2xfY3R4LCAmYWxsX2NpcGhlcnNfY291bnQpOwogICBhbGxfY2lwaGVycyA9IG1hbGxvYyhhbGxfY2lwaGVyc19jb3VudCpzaXplb2YoU1NMQ2lwaGVyU3VpdGUpKTsKICAgYWxsb3dlZF9jaXBoZXJzID0gbWFsbG9jKGFsbF9jaXBoZXJzX2NvdW50KnNpemVvZihTU0xDaXBoZXJTdWl0ZSkpOwogICBpZihhbGxfY2lwaGVycyAmJiBhbGxvd2VkX2NpcGhlcnMgJiYKLSAgICAgU1NMR2V0U3VwcG9ydGVkQ2lwaGVycyhjb25uc3NsLT5zc2xfY3R4LCBhbGxfY2lwaGVycywKKyAgICAgU1NMR2V0U3VwcG9ydGVkQ2lwaGVycyhCQUNLRU5ELT5zc2xfY3R4LCBhbGxfY2lwaGVycywKICAgICAgICAmYWxsX2NpcGhlcnNfY291bnQpID09IG5vRXJyKSB7CiAgICAgZm9yKGkgPSAwVUwgOyBpIDwgYWxsX2NpcGhlcnNfY291bnQgOyBpKyspIHsKICNpZiBDVVJMX0JVSUxEX01BQwpAQCAtMTY0NSw3ICsxNzI0LDcgQEAKICAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9Ci0gICAgZXJyID0gU1NMU2V0RW5hYmxlZENpcGhlcnMoY29ubnNzbC0+c3NsX2N0eCwgYWxsb3dlZF9jaXBoZXJzLAorICAgIGVyciA9IFNTTFNldEVuYWJsZWRDaXBoZXJzKEJBQ0tFTkQtPnNzbF9jdHgsIGFsbG93ZWRfY2lwaGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkX2NpcGhlcnNfY291bnQpOwogICAgIGlmKGVyciAhPSBub0VycikgewogICAgICAgZmFpbGYoZGF0YSwgIlNTTDogU1NMU2V0RW5hYmxlZENpcGhlcnMoKSBmYWlsZWQ6IE9TU3RhdHVzICVkIiwgZXJyKTsKQEAgLTE2NjYsOSArMTc0NSw5IEBACiAgICAgIHNwZWNpZmljYWxseSBkb2Vzbid0IHdhbnQgdXMgZG9pbmcgdGhhdDogKi8KICAgaWYoU1NMU2V0U2Vzc2lvbk9wdGlvbiAhPSBOVUxMKSB7CiAgICAgLyogVE9ETyBzL2RhdGEtPnNldC5zc2wuZW5hYmxlX2JlYXN0L1NTTF9TRVRfT1BUSU9OKGVuYWJsZV9iZWFzdCkvZyAqLwotICAgIFNTTFNldFNlc3Npb25PcHRpb24oY29ubnNzbC0+c3NsX2N0eCwga1NTTFNlc3Npb25PcHRpb25TZW5kT25lQnl0ZVJlY29yZCwKKyAgICBTU0xTZXRTZXNzaW9uT3B0aW9uKEJBQ0tFTkQtPnNzbF9jdHgsIGtTU0xTZXNzaW9uT3B0aW9uU2VuZE9uZUJ5dGVSZWNvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgIWRhdGEtPnNldC5zc2wuZW5hYmxlX2JlYXN0KTsKLSAgICBTU0xTZXRTZXNzaW9uT3B0aW9uKGNvbm5zc2wtPnNzbF9jdHgsIGtTU0xTZXNzaW9uT3B0aW9uRmFsc2VTdGFydCwKKyAgICBTU0xTZXRTZXNzaW9uT3B0aW9uKEJBQ0tFTkQtPnNzbF9jdHgsIGtTU0xTZXNzaW9uT3B0aW9uRmFsc2VTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5zZXQuc3NsLmZhbHNlc3RhcnQpOyAvKiBmYWxzZSBzdGFydCBzdXBwb3J0ICovCiAgIH0KICNlbmRpZiAvKiBDVVJMX0JVSUxEX01BQ18xMF85IHx8IENVUkxfQlVJTERfSU9TXzcgKi8KQEAgLTE2ODIsNyArMTc2MSw3IEBACiAgICAgaWYoIUN1cmxfc3NsX2dldHNlc3Npb25pZChjb25uLCAodm9pZCAqKikmc3NsX3Nlc3Npb25pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzc2xfc2Vzc2lvbmlkX2xlbiwgc29ja2luZGV4KSkgewogICAgICAgLyogd2UgZ290IGEgc2Vzc2lvbiBpZCwgdXNlIGl0ISAqLwotICAgICAgZXJyID0gU1NMU2V0UGVlcklEKGNvbm5zc2wtPnNzbF9jdHgsIHNzbF9zZXNzaW9uaWQsIHNzbF9zZXNzaW9uaWRfbGVuKTsKKyAgICAgIGVyciA9IFNTTFNldFBlZXJJRChCQUNLRU5ELT5zc2xfY3R4LCBzc2xfc2Vzc2lvbmlkLCBzc2xfc2Vzc2lvbmlkX2xlbik7CiAgICAgICBDdXJsX3NzbF9zZXNzaW9uaWRfdW5sb2NrKGNvbm4pOwogICAgICAgaWYoZXJyICE9IG5vRXJyKSB7CiAgICAgICAgIGZhaWxmKGRhdGEsICJTU0w6IFNTTFNldFBlZXJJRCgpIGZhaWxlZDogT1NTdGF0dXMgJWQiLCBlcnIpOwpAQCAtMTcwMCw3ICsxNzc5LDcgQEAKICAgICAgICAgICAgICAgICB2ZXJpZnlwZWVyLCBTU0xfQ09OTl9DT05GSUcodmVyaWZ5aG9zdCksIGhvc3RuYW1lLCBwb3J0KTsKICAgICAgIHNzbF9zZXNzaW9uaWRfbGVuID0gc3RybGVuKHNzbF9zZXNzaW9uaWQpOwogCi0gICAgICBlcnIgPSBTU0xTZXRQZWVySUQoY29ubnNzbC0+c3NsX2N0eCwgc3NsX3Nlc3Npb25pZCwgc3NsX3Nlc3Npb25pZF9sZW4pOworICAgICAgZXJyID0gU1NMU2V0UGVlcklEKEJBQ0tFTkQtPnNzbF9jdHgsIHNzbF9zZXNzaW9uaWQsIHNzbF9zZXNzaW9uaWRfbGVuKTsKICAgICAgIGlmKGVyciAhPSBub0VycikgewogICAgICAgICBDdXJsX3NzbF9zZXNzaW9uaWRfdW5sb2NrKGNvbm4pOwogICAgICAgICBmYWlsZihkYXRhLCAiU1NMOiBTU0xTZXRQZWVySUQoKSBmYWlsZWQ6IE9TU3RhdHVzICVkIiwgZXJyKTsKQEAgLTE3MTcsNyArMTc5Niw3IEBACiAgICAgfQogICB9CiAKLSAgZXJyID0gU1NMU2V0SU9GdW5jcyhjb25uc3NsLT5zc2xfY3R4LCBTb2NrZXRSZWFkLCBTb2NrZXRXcml0ZSk7CisgIGVyciA9IFNTTFNldElPRnVuY3MoQkFDS0VORC0+c3NsX2N0eCwgU29ja2V0UmVhZCwgU29ja2V0V3JpdGUpOwogICBpZihlcnIgIT0gbm9FcnIpIHsKICAgICBmYWlsZihkYXRhLCAiU1NMOiBTU0xTZXRJT0Z1bmNzKCkgZmFpbGVkOiBPU1N0YXR1cyAlZCIsIGVycik7CiAgICAgcmV0dXJuIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SOwpAQCAtMTcyNyw4ICsxODA2LDggQEAKICAgLyogV2UgbmVlZCB0byBzdG9yZSB0aGUgRkQgaW4gYSBjb25zdGFudCBtZW1vcnkgYWRkcmVzcywgYmVjYXVzZQogICAgKiBTU0xTZXRDb25uZWN0aW9uKCkgd2lsbCBub3QgY29weSB0aGF0IGFkZHJlc3MuIEkndmUgZm91bmQgdGhhdAogICAgKiBjb25uLT5zb2NrW3NvY2tpbmRleF0gbWF5IGNoYW5nZSBvbiBpdHMgb3duLiAqLwotICBjb25uc3NsLT5zc2xfc29ja2ZkID0gc29ja2ZkOwotICBlcnIgPSBTU0xTZXRDb25uZWN0aW9uKGNvbm5zc2wtPnNzbF9jdHgsIGNvbm5zc2wpOworICBCQUNLRU5ELT5zc2xfc29ja2ZkID0gc29ja2ZkOworICBlcnIgPSBTU0xTZXRDb25uZWN0aW9uKEJBQ0tFTkQtPnNzbF9jdHgsIGNvbm5zc2wpOwogICBpZihlcnIgIT0gbm9FcnIpIHsKICAgICBmYWlsZihkYXRhLCAiU1NMOiBTU0xTZXRDb25uZWN0aW9uKCkgZmFpbGVkOiAlZCIsIGVycik7CiAgICAgcmV0dXJuIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SOwpAQCAtMTc5MSw3ICsxODcwLDcgQEAKIHsKICAgaW50IGZkOwogICBzc2l6ZV90IG4sIGxlbiA9IDAsIGNhcCA9IDUxMjsKLSAgdW5zaWduZWQgY2hhciBidWZbY2FwXSwgKmRhdGE7CisgIHVuc2lnbmVkIGNoYXIgYnVmWzUxMl0sICpkYXRhOwogCiAgIGZkID0gb3BlbihmaWxlLCAwKTsKICAgaWYoZmQgPCAwKQpAQCAtMTg2OSw2ICsxOTQ4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlQXJyYXlSZWYgYXJyYXkpCiB7CiAgICAgQ0ZEYXRhUmVmIGNlcnRkYXRhID0gQ0ZEYXRhQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIGJ1ZiwgYnVmbGVuKTsKKyAgICBjaGFyICpjZXJ0cDsKKyAgICBDVVJMY29kZSByZXN1bHQ7CiAgICAgaWYoIWNlcnRkYXRhKSB7CiAgICAgICBmYWlsZihkYXRhLCAiU1NMOiBmYWlsZWQgdG8gYWxsb2NhdGUgYXJyYXkgZm9yIENBIGNlcnRpZmljYXRlIik7CiAgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKQEAgLTE4ODMsMjUgKzE5NjQsMTAgQEAKICAgICB9CiAKICAgICAvKiBDaGVjayBpZiBjYWNlcnQgaXMgdmFsaWQuICovCi0gICAgQ0ZTdHJpbmdSZWYgc3ViamVjdCA9IENvcHlDZXJ0U3ViamVjdChjYWNlcnQpOwotICAgIGlmKHN1YmplY3QpIHsKLSAgICAgIGNoYXIgc3ViamVjdF9jYnVmWzEyOF07Ci0gICAgICBtZW1zZXQoc3ViamVjdF9jYnVmLCAwLCAxMjgpOwotICAgICAgaWYoIUNGU3RyaW5nR2V0Q1N0cmluZyhzdWJqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3RfY2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyaW5nRW5jb2RpbmdVVEY4KSkgewotICAgICAgICBDRlJlbGVhc2UoY2FjZXJ0KTsKLSAgICAgICAgZmFpbGYoZGF0YSwgIlNTTDogaW52YWxpZCBDQSBjZXJ0aWZpY2F0ZSBzdWJqZWN0Iik7Ci0gICAgICAgIHJldHVybiBDVVJMRV9TU0xfQ0FDRVJUOwotICAgICAgfQotICAgICAgQ0ZSZWxlYXNlKHN1YmplY3QpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIENGUmVsZWFzZShjYWNlcnQpOwotICAgICAgZmFpbGYoZGF0YSwgIlNTTDogaW52YWxpZCBDQSBjZXJ0aWZpY2F0ZSIpOwotICAgICAgcmV0dXJuIENVUkxFX1NTTF9DQUNFUlQ7Ci0gICAgfQorICAgIHJlc3VsdCA9IENvcHlDZXJ0U3ViamVjdChkYXRhLCBjYWNlcnQsICZjZXJ0cCk7CisgICAgaWYocmVzdWx0KQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICBmcmVlKGNlcnRwKTsKIAogICAgIENGQXJyYXlBcHBlbmRWYWx1ZShhcnJheSwgY2FjZXJ0KTsKICAgICBDRlJlbGVhc2UoY2FjZXJ0KTsKQEAgLTIwMjcsMTIgKzIwOTMsMTMgQEAKIH0KIAogI2lmZGVmIERBUldJTl9TU0xfUElOTkVEUFVCS0VZCi1zdGF0aWMgQ1VSTGNvZGUgcGtwX3Bpbl9wZWVyX3B1YmtleShzdHJ1Y3QgU2Vzc2lvbkhhbmRsZSAqZGF0YSwKK3N0YXRpYyBDVVJMY29kZSBwa3BfcGluX3BlZXJfcHVia2V5KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xDb250ZXh0UmVmIGN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBpbm5lZHB1YmtleSkKIHsgIC8qIFNjcmF0Y2ggKi8KICAgc2l6ZV90IHB1YmtleWxlbiwgcmVhbHB1YmtleWxlbiwgc3BraUhlYWRlckxlbmd0aCA9IDI0OwotICB1bnNpZ25lZCBjaGFyICpwdWJrZXkgPSBOVUxMLCAqcmVhbHB1YmtleSA9IE5VTEwsICpzcGtpSGVhZGVyID0gTlVMTDsKKyAgdW5zaWduZWQgY2hhciAqcHVia2V5ID0gTlVMTCwgKnJlYWxwdWJrZXkgPSBOVUxMOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcGtpSGVhZGVyID0gTlVMTDsKICAgQ0ZEYXRhUmVmIHB1YmxpY0tleUJpdHMgPSBOVUxMOwogCiAgIC8qIFJlc3VsdCBpcyByZXR1cm5lZCB0byBjYWxsZXIgKi8KQEAgLTIwNzUsNyArMjE0Miw3IEBACiAjZW5kaWYgLyogREFSV0lOX1NTTF9QSU5ORURQVUJLRVlfVjIgKi8KIAogICAgIHB1YmtleWxlbiA9IENGRGF0YUdldExlbmd0aChwdWJsaWNLZXlCaXRzKTsKLSAgICBwdWJrZXkgPSBDRkRhdGFHZXRCeXRlUHRyKHB1YmxpY0tleUJpdHMpOworICAgIHB1YmtleSA9ICh1bnNpZ25lZCBjaGFyICopQ0ZEYXRhR2V0Qnl0ZVB0cihwdWJsaWNLZXlCaXRzKTsKIAogICAgIHN3aXRjaChwdWJrZXlsZW4pIHsKICAgICAgIGNhc2UgNTI2OgpAQCAtMjE0OCwxMiArMjIxNSwxMiBAQAogICAgICAgICAgICAgICB8fCBzc2xfY29ubmVjdF8yX3dyaXRpbmcgPT0gY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSk7CiAKICAgLyogSGVyZSBnb2VzIG5vdGhpbmc6ICovCi0gIGVyciA9IFNTTEhhbmRzaGFrZShjb25uc3NsLT5zc2xfY3R4KTsKKyAgZXJyID0gU1NMSGFuZHNoYWtlKEJBQ0tFTkQtPnNzbF9jdHgpOwogCiAgIGlmKGVyciAhPSBub0VycikgewogICAgIHN3aXRjaChlcnIpIHsKICAgICAgIGNhc2UgZXJyU1NMV291bGRCbG9jazogIC8qIHRoZXkncmUgbm90IGRvbmUgd2l0aCB1cyB5ZXQgKi8KLSAgICAgICAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9IGNvbm5zc2wtPnNzbF9kaXJlY3Rpb24gPworICAgICAgICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID0gQkFDS0VORC0+c3NsX2RpcmVjdGlvbiA/CiAgICAgICAgICAgICBzc2xfY29ubmVjdF8yX3dyaXRpbmcgOiBzc2xfY29ubmVjdF8yX3JlYWRpbmc7CiAgICAgICAgIHJldHVybiBDVVJMRV9PSzsKIApAQCAtMjE2Miw3ICsyMjI5LDcgQEAKICAgICAgIGNhc2UgLTk4NDE6CiAgICAgICAgIGlmKFNTTF9DT05OX0NPTkZJRyhDQWZpbGUpICYmIFNTTF9DT05OX0NPTkZJRyh2ZXJpZnlwZWVyKSkgewogICAgICAgICAgIGludCByZXMgPSB2ZXJpZnlfY2VydChTU0xfQ09OTl9DT05GSUcoQ0FmaWxlKSwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubnNzbC0+c3NsX2N0eCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBQ0tFTkQtPnNzbF9jdHgpOwogICAgICAgICAgIGlmKHJlcyAhPSBDVVJMRV9PSykKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KQEAgLTIyNDAsNyArMjMwNyw3IEBACiAKICNpZmRlZiBEQVJXSU5fU1NMX1BJTk5FRFBVQktFWQogICAgIGlmKGRhdGEtPnNldC5zdHJbU1RSSU5HX1NTTF9QSU5ORURQVUJMSUNLRVlfT1JJR10pIHsKLSAgICAgIENVUkxjb2RlIHJlc3VsdCA9IHBrcF9waW5fcGVlcl9wdWJrZXkoZGF0YSwgY29ubnNzbC0+c3NsX2N0eCwKKyAgICAgIENVUkxjb2RlIHJlc3VsdCA9IHBrcF9waW5fcGVlcl9wdWJrZXkoZGF0YSwgQkFDS0VORC0+c3NsX2N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5zZXQuc3RyW1NUUklOR19TU0xfUElOTkVEUFVCTElDS0VZX09SSUddKTsKICAgICAgIGlmKHJlc3VsdCkgewogICAgICAgICBmYWlsZihkYXRhLCAiU1NMOiBwdWJsaWMga2V5IGRvZXMgbm90IG1hdGNoIHBpbm5lZCBwdWJsaWMga2V5ISIpOwpAQCAtMjI1MCw4ICsyMzE3LDggQEAKICNlbmRpZiAvKiBEQVJXSU5fU1NMX1BJTk5FRFBVQktFWSAqLwogCiAgICAgLyogSW5mb3JtYXRpb25hbCBtZXNzYWdlICovCi0gICAgKHZvaWQpU1NMR2V0TmVnb3RpYXRlZENpcGhlcihjb25uc3NsLT5zc2xfY3R4LCAmY2lwaGVyKTsKLSAgICAodm9pZClTU0xHZXROZWdvdGlhdGVkUHJvdG9jb2xWZXJzaW9uKGNvbm5zc2wtPnNzbF9jdHgsICZwcm90b2NvbCk7CisgICAgKHZvaWQpU1NMR2V0TmVnb3RpYXRlZENpcGhlcihCQUNLRU5ELT5zc2xfY3R4LCAmY2lwaGVyKTsKKyAgICAodm9pZClTU0xHZXROZWdvdGlhdGVkUHJvdG9jb2xWZXJzaW9uKEJBQ0tFTkQtPnNzbF9jdHgsICZwcm90b2NvbCk7CiAgICAgc3dpdGNoKHByb3RvY29sKSB7CiAgICAgICBjYXNlIGtTU0xQcm90b2NvbDI6CiAgICAgICAgIGluZm9mKGRhdGEsICJTU0wgMi4wIGNvbm5lY3Rpb24gdXNpbmcgJXNcbiIsCkBAIC0yMjkyLDM2ICsyMzU5LDMyIEBACiB7CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKLSAgQ0ZTdHJpbmdSZWYgc2VydmVyX2NlcnRfc3VtbWFyeTsKLSAgY2hhciBzZXJ2ZXJfY2VydF9zdW1tYXJ5X2NbMTI4XTsKICAgQ0ZBcnJheVJlZiBzZXJ2ZXJfY2VydHMgPSBOVUxMOwogICBTZWNDZXJ0aWZpY2F0ZVJlZiBzZXJ2ZXJfY2VydDsKICAgT1NTdGF0dXMgZXJyOwogICBDRkluZGV4IGksIGNvdW50OwogICBTZWNUcnVzdFJlZiB0cnVzdCA9IE5VTEw7CiAKLSAgaWYoIWNvbm5zc2wtPnNzbF9jdHgpCisgIGlmKCFCQUNLRU5ELT5zc2xfY3R4KQogICAgIHJldHVybjsKIAogI2lmIENVUkxfQlVJTERfTUFDXzEwXzcgfHwgQ1VSTF9CVUlMRF9JT1MKICNpZiBDVVJMX0JVSUxEX0lPUwogI3ByYWdtYSB1bnVzZWQoc2VydmVyX2NlcnRzKQotICBlcnIgPSBTU0xDb3B5UGVlclRydXN0KGNvbm5zc2wtPnNzbF9jdHgsICZ0cnVzdCk7CisgIGVyciA9IFNTTENvcHlQZWVyVHJ1c3QoQkFDS0VORC0+c3NsX2N0eCwgJnRydXN0KTsKICAgLyogRm9yIHNvbWUgcmVhc29uLCBTU0xDb3B5UGVlclRydXN0KCkgY2FuIHJldHVybiBub0VyciBhbmQgeWV0IHJldHVybgogICAgICBhIG51bGwgdHJ1c3QsIHNvIGJlIG9uIGd1YXJkIGZvciB0aGF0OiAqLwogICBpZihlcnIgPT0gbm9FcnIgJiYgdHJ1c3QpIHsKICAgICBjb3VudCA9IFNlY1RydXN0R2V0Q2VydGlmaWNhdGVDb3VudCh0cnVzdCk7CiAgICAgZm9yKGkgPSAwTCA7IGkgPCBjb3VudCA7IGkrKykgeworICAgICAgQ1VSTGNvZGUgcmVzdWx0OworICAgICAgY2hhciAqY2VydHA7CiAgICAgICBzZXJ2ZXJfY2VydCA9IFNlY1RydXN0R2V0Q2VydGlmaWNhdGVBdEluZGV4KHRydXN0LCBpKTsKLSAgICAgIHNlcnZlcl9jZXJ0X3N1bW1hcnkgPSBDb3B5Q2VydFN1YmplY3Qoc2VydmVyX2NlcnQpOwotICAgICAgbWVtc2V0KHNlcnZlcl9jZXJ0X3N1bW1hcnlfYywgMCwgMTI4KTsKLSAgICAgIGlmKENGU3RyaW5nR2V0Q1N0cmluZyhzZXJ2ZXJfY2VydF9zdW1tYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9jZXJ0X3N1bW1hcnlfYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyaW5nRW5jb2RpbmdVVEY4KSkgewotICAgICAgICBpbmZvZihkYXRhLCAiU2VydmVyIGNlcnRpZmljYXRlOiAlc1xuIiwgc2VydmVyX2NlcnRfc3VtbWFyeV9jKTsKKyAgICAgIHJlc3VsdCA9IENvcHlDZXJ0U3ViamVjdChkYXRhLCBzZXJ2ZXJfY2VydCwgJmNlcnRwKTsKKyAgICAgIGlmKCFyZXN1bHQpIHsKKyAgICAgICAgaW5mb2YoZGF0YSwgIlNlcnZlciBjZXJ0aWZpY2F0ZTogJXNcbiIsIGNlcnRwKTsKKyAgICAgICAgZnJlZShjZXJ0cCk7CiAgICAgICB9Ci0gICAgICBDRlJlbGVhc2Uoc2VydmVyX2NlcnRfc3VtbWFyeSk7CiAgICAgfQogICAgIENGUmVsZWFzZSh0cnVzdCk7CiAgIH0KQEAgLTIzMzQsNDUgKzIzOTcsNDAgQEAKICAgICAgTGlvbiBvciBsYXRlci4gKi8KICAgaWYoU2VjVHJ1c3RFdmFsdWF0ZUFzeW5jICE9IE5VTEwpIHsKICNwcmFnbWEgdW51c2VkKHNlcnZlcl9jZXJ0cykKLSAgICBlcnIgPSBTU0xDb3B5UGVlclRydXN0KGNvbm5zc2wtPnNzbF9jdHgsICZ0cnVzdCk7CisgICAgZXJyID0gU1NMQ29weVBlZXJUcnVzdChCQUNLRU5ELT5zc2xfY3R4LCAmdHJ1c3QpOwogICAgIC8qIEZvciBzb21lIHJlYXNvbiwgU1NMQ29weVBlZXJUcnVzdCgpIGNhbiByZXR1cm4gbm9FcnIgYW5kIHlldCByZXR1cm4KICAgICAgICBhIG51bGwgdHJ1c3QsIHNvIGJlIG9uIGd1YXJkIGZvciB0aGF0OiAqLwogICAgIGlmKGVyciA9PSBub0VyciAmJiB0cnVzdCkgewogICAgICAgY291bnQgPSBTZWNUcnVzdEdldENlcnRpZmljYXRlQ291bnQodHJ1c3QpOwogICAgICAgZm9yKGkgPSAwTCA7IGkgPCBjb3VudCA7IGkrKykgeworICAgICAgICBjaGFyICpjZXJ0cDsKKyAgICAgICAgQ1VSTGNvZGUgcmVzdWx0OwogICAgICAgICBzZXJ2ZXJfY2VydCA9IFNlY1RydXN0R2V0Q2VydGlmaWNhdGVBdEluZGV4KHRydXN0LCBpKTsKLSAgICAgICAgc2VydmVyX2NlcnRfc3VtbWFyeSA9IENvcHlDZXJ0U3ViamVjdChzZXJ2ZXJfY2VydCk7Ci0gICAgICAgIG1lbXNldChzZXJ2ZXJfY2VydF9zdW1tYXJ5X2MsIDAsIDEyOCk7Ci0gICAgICAgIGlmKENGU3RyaW5nR2V0Q1N0cmluZyhzZXJ2ZXJfY2VydF9zdW1tYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2NlcnRfc3VtbWFyeV9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyaW5nRW5jb2RpbmdVVEY4KSkgewotICAgICAgICAgIGluZm9mKGRhdGEsICJTZXJ2ZXIgY2VydGlmaWNhdGU6ICVzXG4iLCBzZXJ2ZXJfY2VydF9zdW1tYXJ5X2MpOworICAgICAgICByZXN1bHQgPSBDb3B5Q2VydFN1YmplY3QoZGF0YSwgc2VydmVyX2NlcnQsICZjZXJ0cCk7CisgICAgICAgIGlmKCFyZXN1bHQpIHsKKyAgICAgICAgICBpbmZvZihkYXRhLCAiU2VydmVyIGNlcnRpZmljYXRlOiAlc1xuIiwgY2VydHApOworICAgICAgICAgIGZyZWUoY2VydHApOwogICAgICAgICB9Ci0gICAgICAgIENGUmVsZWFzZShzZXJ2ZXJfY2VydF9zdW1tYXJ5KTsKICAgICAgIH0KICAgICAgIENGUmVsZWFzZSh0cnVzdCk7CiAgICAgfQogICB9CiAgIGVsc2UgewogI2lmIENVUkxfU1VQUE9SVF9NQUNfMTBfOAotICAgIGVyciA9IFNTTENvcHlQZWVyQ2VydGlmaWNhdGVzKGNvbm5zc2wtPnNzbF9jdHgsICZzZXJ2ZXJfY2VydHMpOworICAgIGVyciA9IFNTTENvcHlQZWVyQ2VydGlmaWNhdGVzKEJBQ0tFTkQtPnNzbF9jdHgsICZzZXJ2ZXJfY2VydHMpOwogICAgIC8qIEp1c3QgaW4gY2FzZSBTU0xDb3B5UGVlckNlcnRpZmljYXRlcygpIHJldHVybnMgbnVsbCB0b28uLi4gKi8KICAgICBpZihlcnIgPT0gbm9FcnIgJiYgc2VydmVyX2NlcnRzKSB7CiAgICAgICBjb3VudCA9IENGQXJyYXlHZXRDb3VudChzZXJ2ZXJfY2VydHMpOwogICAgICAgZm9yKGkgPSAwTCA7IGkgPCBjb3VudCA7IGkrKykgeworICAgICAgICBjaGFyICpjZXJ0cDsKKyAgICAgICAgQ1VSTGNvZGUgcmVzdWx0OwogICAgICAgICBzZXJ2ZXJfY2VydCA9IChTZWNDZXJ0aWZpY2F0ZVJlZilDRkFycmF5R2V0VmFsdWVBdEluZGV4KHNlcnZlcl9jZXJ0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsKLQotICAgICAgICBzZXJ2ZXJfY2VydF9zdW1tYXJ5ID0gQ29weUNlcnRTdWJqZWN0KHNlcnZlcl9jZXJ0KTsKLSAgICAgICAgbWVtc2V0KHNlcnZlcl9jZXJ0X3N1bW1hcnlfYywgMCwgMTI4KTsKLSAgICAgICAgaWYoQ0ZTdHJpbmdHZXRDU3RyaW5nKHNlcnZlcl9jZXJ0X3N1bW1hcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfY2VydF9zdW1tYXJ5X2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpKSB7Ci0gICAgICAgICAgaW5mb2YoZGF0YSwgIlNlcnZlciBjZXJ0aWZpY2F0ZTogJXNcbiIsIHNlcnZlcl9jZXJ0X3N1bW1hcnlfYyk7CisgICAgICAgIHJlc3VsdCA9IENvcHlDZXJ0U3ViamVjdChkYXRhLCBzZXJ2ZXJfY2VydCwgJmNlcnRwKTsKKyAgICAgICAgaWYoIXJlc3VsdCkgeworICAgICAgICAgIGluZm9mKGRhdGEsICJTZXJ2ZXIgY2VydGlmaWNhdGU6ICVzXG4iLCBjZXJ0cCk7CisgICAgICAgICAgZnJlZShjZXJ0cCk7CiAgICAgICAgIH0KLSAgICAgICAgQ0ZSZWxlYXNlKHNlcnZlcl9jZXJ0X3N1bW1hcnkpOwogICAgICAgfQogICAgICAgQ0ZSZWxlYXNlKHNlcnZlcl9jZXJ0cyk7CiAgICAgfQpAQCAtMjM4MSwyMCArMjQzOSwxOCBAQAogI2VuZGlmIC8qIENVUkxfQlVJTERfSU9TICovCiAjZWxzZQogI3ByYWdtYSB1bnVzZWQodHJ1c3QpCi0gIGVyciA9IFNTTENvcHlQZWVyQ2VydGlmaWNhdGVzKGNvbm5zc2wtPnNzbF9jdHgsICZzZXJ2ZXJfY2VydHMpOworICBlcnIgPSBTU0xDb3B5UGVlckNlcnRpZmljYXRlcyhCQUNLRU5ELT5zc2xfY3R4LCAmc2VydmVyX2NlcnRzKTsKICAgaWYoZXJyID09IG5vRXJyKSB7CiAgICAgY291bnQgPSBDRkFycmF5R2V0Q291bnQoc2VydmVyX2NlcnRzKTsKICAgICBmb3IoaSA9IDBMIDsgaSA8IGNvdW50IDsgaSsrKSB7CisgICAgICBDVVJMY29kZSByZXN1bHQ7CisgICAgICBjaGFyICpjZXJ0cDsKICAgICAgIHNlcnZlcl9jZXJ0ID0gKFNlY0NlcnRpZmljYXRlUmVmKUNGQXJyYXlHZXRWYWx1ZUF0SW5kZXgoc2VydmVyX2NlcnRzLCBpKTsKLSAgICAgIHNlcnZlcl9jZXJ0X3N1bW1hcnkgPSBDb3B5Q2VydFN1YmplY3Qoc2VydmVyX2NlcnQpOwotICAgICAgbWVtc2V0KHNlcnZlcl9jZXJ0X3N1bW1hcnlfYywgMCwgMTI4KTsKLSAgICAgIGlmKENGU3RyaW5nR2V0Q1N0cmluZyhzZXJ2ZXJfY2VydF9zdW1tYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9jZXJ0X3N1bW1hcnlfYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyaW5nRW5jb2RpbmdVVEY4KSkgewotICAgICAgICBpbmZvZihkYXRhLCAiU2VydmVyIGNlcnRpZmljYXRlOiAlc1xuIiwgc2VydmVyX2NlcnRfc3VtbWFyeV9jKTsKKyAgICAgIHJlc3VsdCA9IENvcHlDZXJ0U3ViamVjdChkYXRhLCBzZXJ2ZXJfY2VydCwgJmNlcnRwKTsKKyAgICAgIGlmKCFyZXN1bHQpIHsKKyAgICAgICAgaW5mb2YoZGF0YSwgIlNlcnZlciBjZXJ0aWZpY2F0ZTogJXNcbiIsIGNlcnRwKTsKKyAgICAgICAgZnJlZShjZXJ0cCk7CiAgICAgICB9Ci0gICAgICBDRlJlbGVhc2Uoc2VydmVyX2NlcnRfc3VtbWFyeSk7CiAgICAgfQogICAgIENGUmVsZWFzZShzZXJ2ZXJfY2VydHMpOwogICB9CkBAIC0yNDQzLDcgKzI0OTksNyBAQAogICAgIHJldHVybiBDVVJMRV9PSzsKICAgfQogCi0gIGlmKHNzbF9jb25uZWN0XzE9PWNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUpIHsKKyAgaWYoc3NsX2Nvbm5lY3RfMSA9PSBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlKSB7CiAgICAgLyogRmluZCBvdXQgaG93IG11Y2ggbW9yZSB0aW1lIHdlJ3JlIGFsbG93ZWQgKi8KICAgICB0aW1lb3V0X21zID0gQ3VybF90aW1lbGVmdChkYXRhLCBOVUxMLCBUUlVFKTsKIApAQCAtMjUzOCwxNyArMjU5NCwxMyBAQAogICByZXR1cm4gQ1VSTEVfT0s7CiB9CiAKLUNVUkxjb2RlCi1DdXJsX2RhcndpbnNzbF9jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqZG9uZSkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX2RhcndpbnNzbF9jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsIGJvb2wgKmRvbmUpCiB7CiAgIHJldHVybiBkYXJ3aW5zc2xfY29ubmVjdF9jb21tb24oY29ubiwgc29ja2luZGV4LCBUUlVFLCBkb25lKTsKIH0KIAotQ1VSTGNvZGUKLUN1cmxfZGFyd2luc3NsX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4KQorc3RhdGljIENVUkxjb2RlIEN1cmxfZGFyd2luc3NsX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQogewogICBDVVJMY29kZSByZXN1bHQ7CiAgIGJvb2wgZG9uZSA9IEZBTFNFOwpAQCAtMjU2MywyOCArMjYxNSwyOCBAQAogICByZXR1cm4gQ1VSTEVfT0s7CiB9CiAKLXZvaWQgQ3VybF9kYXJ3aW5zc2xfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQorc3RhdGljIHZvaWQgQ3VybF9kYXJ3aW5zc2xfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQogewogICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKIAotICBpZihjb25uc3NsLT5zc2xfY3R4KSB7Ci0gICAgKHZvaWQpU1NMQ2xvc2UoY29ubnNzbC0+c3NsX2N0eCk7CisgIGlmKEJBQ0tFTkQtPnNzbF9jdHgpIHsKKyAgICAodm9pZClTU0xDbG9zZShCQUNLRU5ELT5zc2xfY3R4KTsKICNpZiBDVVJMX0JVSUxEX01BQ18xMF84IHx8IENVUkxfQlVJTERfSU9TCiAgICAgaWYoU1NMQ3JlYXRlQ29udGV4dCAhPSBOVUxMKQotICAgICAgQ0ZSZWxlYXNlKGNvbm5zc2wtPnNzbF9jdHgpOworICAgICAgQ0ZSZWxlYXNlKEJBQ0tFTkQtPnNzbF9jdHgpOwogI2lmIENVUkxfU1VQUE9SVF9NQUNfMTBfOAogICAgIGVsc2UKLSAgICAgICh2b2lkKVNTTERpc3Bvc2VDb250ZXh0KGNvbm5zc2wtPnNzbF9jdHgpOworICAgICAgKHZvaWQpU1NMRGlzcG9zZUNvbnRleHQoQkFDS0VORC0+c3NsX2N0eCk7CiAjZW5kaWYgIC8qIENVUkxfU1VQUE9SVF9NQUNfMTBfOCAqLwogI2Vsc2UKLSAgICAodm9pZClTU0xEaXNwb3NlQ29udGV4dChjb25uc3NsLT5zc2xfY3R4KTsKKyAgICAodm9pZClTU0xEaXNwb3NlQ29udGV4dChCQUNLRU5ELT5zc2xfY3R4KTsKICNlbmRpZiAvKiBDVVJMX0JVSUxEX01BQ18xMF84IHx8IENVUkxfQlVJTERfSU9TICovCi0gICAgY29ubnNzbC0+c3NsX2N0eCA9IE5VTEw7CisgICAgQkFDS0VORC0+c3NsX2N0eCA9IE5VTEw7CiAgIH0KLSAgY29ubnNzbC0+c3NsX3NvY2tmZCA9IDA7CisgIEJBQ0tFTkQtPnNzbF9zb2NrZmQgPSAwOwogfQogCi1pbnQgQ3VybF9kYXJ3aW5zc2xfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQorc3RhdGljIGludCBDdXJsX2RhcndpbnNzbF9zaHV0ZG93bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CiAgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKQEAgLTI1OTMsNyArMjY0NSw3IEBACiAgIGludCByYzsKICAgY2hhciBidWZbMTIwXTsKIAotICBpZighY29ubnNzbC0+c3NsX2N0eCkKKyAgaWYoIUJBQ0tFTkQtPnNzbF9jdHgpCiAgICAgcmV0dXJuIDA7CiAKICAgaWYoZGF0YS0+c2V0LmZ0cF9jY2MgIT0gQ1VSTEZUUFNTTF9DQ0NfQUNUSVZFKQpAQCAtMjYzNyw3ICsyNjg5LDcgQEAKICAgcmV0dXJuIHJjOwogfQogCi12b2lkIEN1cmxfZGFyd2luc3NsX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpCitzdGF0aWMgdm9pZCBDdXJsX2RhcndpbnNzbF9zZXNzaW9uX2ZyZWUodm9pZCAqcHRyKQogewogICAvKiBTVCwgYXMgb2YgaU9TIDUgYW5kIE1vdW50YWluIExpb24sIGhhcyBubyBwdWJsaWMgbWV0aG9kIG9mIGRlbGV0aW5nIGEKICAgICAgY2FjaGVkIHNlc3Npb24gSUQgaW5zaWRlIHRoZSBTZWN1cml0eSBmcmFtZXdvcmsuIFRoZXJlIGlzIGEgcHJpdmF0ZQpAQCAtMjY0OCw3ICsyNzAwLDcgQEAKICAgQ3VybF9zYWZlZnJlZShwdHIpOwogfQogCi1zaXplX3QgQ3VybF9kYXJ3aW5zc2xfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQorc3RhdGljIHNpemVfdCBDdXJsX2RhcndpbnNzbF92ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7CiAgIHJldHVybiBzbnByaW50ZihidWZmZXIsIHNpemUsICJTZWN1cmVUcmFuc3BvcnQiKTsKIH0KQEAgLTI2NjEsMTQgKzI3MTMsMTQgQEAKICAqICAgICAwIG1lYW5zIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZAogICogICAgLTEgbWVhbnMgdGhlIGNvbm5lY3Rpb24gc3RhdHVzIGlzIHVua25vd24KICAqLwotaW50IEN1cmxfZGFyd2luc3NsX2NoZWNrX2N4bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCitzdGF0aWMgaW50IEN1cmxfZGFyd2luc3NsX2NoZWNrX2N4bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCiB7CiAgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtGSVJTVFNPQ0tFVF07CiAgIE9TU3RhdHVzIGVycjsKICAgU1NMU2Vzc2lvblN0YXRlIHN0YXRlOwogCi0gIGlmKGNvbm5zc2wtPnNzbF9jdHgpIHsKLSAgICBlcnIgPSBTU0xHZXRTZXNzaW9uU3RhdGUoY29ubnNzbC0+c3NsX2N0eCwgJnN0YXRlKTsKKyAgaWYoQkFDS0VORC0+c3NsX2N0eCkgeworICAgIGVyciA9IFNTTEdldFNlc3Npb25TdGF0ZShCQUNLRU5ELT5zc2xfY3R4LCAmc3RhdGUpOwogICAgIGlmKGVyciA9PSBub0VycikKICAgICAgIHJldHVybiBzdGF0ZSA9PSBrU1NMQ29ubmVjdGVkIHx8IHN0YXRlID09IGtTU0xIYW5kc2hha2U7CiAgICAgcmV0dXJuIC0xOwpAQCAtMjY3NiwxNSArMjcyOCwxNSBAQAogICByZXR1cm4gMDsKIH0KIAotYm9vbCBDdXJsX2RhcndpbnNzbF9kYXRhX3BlbmRpbmcoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5pbmRleCkKK3N0YXRpYyBib29sIEN1cmxfZGFyd2luc3NsX2RhdGFfcGVuZGluZyhjb25zdCBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5pbmRleCkKIHsKICAgY29uc3Qgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW2Nvbm5pbmRleF07CiAgIE9TU3RhdHVzIGVycjsKICAgc2l6ZV90IGJ1ZmZlcjsKIAotICBpZihjb25uc3NsLT5zc2xfY3R4KSB7ICAvKiBTU0wgaXMgaW4gdXNlICovCi0gICAgZXJyID0gU1NMR2V0QnVmZmVyZWRSZWFkU2l6ZShjb25uc3NsLT5zc2xfY3R4LCAmYnVmZmVyKTsKKyAgaWYoQkFDS0VORC0+c3NsX2N0eCkgeyAgLyogU1NMIGlzIGluIHVzZSAqLworICAgIGVyciA9IFNTTEdldEJ1ZmZlcmVkUmVhZFNpemUoQkFDS0VORC0+c3NsX2N0eCwgJmJ1ZmZlcik7CiAgICAgaWYoZXJyID09IG5vRXJyKQogICAgICAgcmV0dXJuIGJ1ZmZlciA+IDBVTDsKICAgICByZXR1cm4gZmFsc2U7CkBAIC0yNjkzLDE0ICsyNzQ1LDE2IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1DVVJMY29kZSBDdXJsX2RhcndpbnNzbF9yYW5kb20odW5zaWduZWQgY2hhciAqZW50cm9weSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKQorc3RhdGljIENVUkxjb2RlIEN1cmxfZGFyd2luc3NsX3JhbmRvbShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhIFVOVVNFRF9QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW50cm9weSwgc2l6ZV90IGxlbmd0aCkKIHsKICAgLyogYXJjNHJhbmRvbV9idWYoKSBpc24ndCBhdmFpbGFibGUgb24gY2F0cyBvbGRlciB0aGFuIExpb24sIHNvIGxldCdzCiAgICAgIGRvIHRoaXMgbWFudWFsbHkgZm9yIHRoZSBiZW5lZml0IG9mIHRoZSBvbGRlciBjYXRzLiAqLwogICBzaXplX3QgaTsKICAgdV9pbnQzMl90IHJhbmRvbV9udW1iZXIgPSAwOwogCisgICh2b2lkKWRhdGE7CisKICAgZm9yKGkgPSAwIDsgaSA8IGxlbmd0aCA7IGkrKykgewogICAgIGlmKGkgJSBzaXplb2YodV9pbnQzMl90KSA9PSAwKQogICAgICAgcmFuZG9tX251bWJlciA9IGFyYzRyYW5kb20oKTsKQEAgLTI3MTEsMjUgKzI3NjUsMjYgQEAKICAgcmV0dXJuIENVUkxFX09LOwogfQogCi12b2lkIEN1cmxfZGFyd2luc3NsX21kNXN1bSh1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbWQ1c3VtLCAvKiBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtZDVsZW4pCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9kYXJ3aW5zc2xfbWQ1c3VtKHVuc2lnbmVkIGNoYXIgKnRtcCwgLyogaW5wdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbWQ1c3VtLCAvKiBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1kNWxlbikKIHsKICAgKHZvaWQpbWQ1bGVuOwogICAodm9pZClDQ19NRDUodG1wLCAoQ0NfTE9ORyl0bXBsZW4sIG1kNXN1bSk7CisgIHJldHVybiBDVVJMRV9PSzsKIH0KIAotdm9pZCBDdXJsX2RhcndpbnNzbF9zaGEyNTZzdW0odW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTI1NnN1bSwgLyogb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2hhMjU2bGVuKQorc3RhdGljIHZvaWQgQ3VybF9kYXJ3aW5zc2xfc2hhMjU2c3VtKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRtcCwgLyogaW5wdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTI1NnN1bSwgLyogb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNoYTI1NmxlbikKIHsKLSAgYXNzZXJ0KHNoYTI1NmxlbiA+PSBTSEEyNTZfRElHRVNUX0xFTkdUSCk7CisgIGFzc2VydChzaGEyNTZsZW4gPj0gQ1VSTF9TSEEyNTZfRElHRVNUX0xFTkdUSCk7CiAgICh2b2lkKUNDX1NIQTI1Nih0bXAsIChDQ19MT05HKXRtcGxlbiwgc2hhMjU2c3VtKTsKIH0KIAotYm9vbCBDdXJsX2RhcndpbnNzbF9mYWxzZV9zdGFydCh2b2lkKQorc3RhdGljIGJvb2wgQ3VybF9kYXJ3aW5zc2xfZmFsc2Vfc3RhcnQodm9pZCkKIHsKICNpZiBDVVJMX0JVSUxEX01BQ18xMF85IHx8IENVUkxfQlVJTERfSU9TXzcKICAgaWYoU1NMU2V0U2Vzc2lvbk9wdGlvbiAhPSBOVUxMKQpAQCAtMjc2NCwxNSArMjgxOSwxNSBAQAogICAgICBvdmVyIGFnYWluIHdpdGggbm8gbmV3IGRhdGEgdW50aWwgaXQgcXVpdHMgcmV0dXJuaW5nIGVyclNTTFdvdWxkQmxvY2suICovCiAKICAgLyogRG8gd2UgaGF2ZSBidWZmZXJlZCBkYXRhIHRvIHdyaXRlIGZyb20gdGhlIGxhc3QgdGltZSB3ZSB3ZXJlIGNhbGxlZD8gKi8KLSAgaWYoY29ubnNzbC0+c3NsX3dyaXRlX2J1ZmZlcmVkX2xlbmd0aCkgeworICBpZihCQUNLRU5ELT5zc2xfd3JpdGVfYnVmZmVyZWRfbGVuZ3RoKSB7CiAgICAgLyogV3JpdGUgdGhlIGJ1ZmZlcmVkIGRhdGE6ICovCi0gICAgZXJyID0gU1NMV3JpdGUoY29ubnNzbC0+c3NsX2N0eCwgTlVMTCwgMFVMLCAmcHJvY2Vzc2VkKTsKKyAgICBlcnIgPSBTU0xXcml0ZShCQUNLRU5ELT5zc2xfY3R4LCBOVUxMLCAwVUwsICZwcm9jZXNzZWQpOwogICAgIHN3aXRjaChlcnIpIHsKICAgICAgIGNhc2Ugbm9FcnI6CiAgICAgICAgIC8qIHByb2Nlc3NlZCBpcyBhbHdheXMgZ29pbmcgdG8gYmUgMCBiZWNhdXNlIHdlIGRpZG4ndCB3cml0ZSB0bwogICAgICAgICAgICB0aGUgYnVmZmVyLCBzbyByZXR1cm4gaG93IG11Y2ggd2FzIHdyaXR0ZW4gdG8gdGhlIHNvY2tldCAqLwotICAgICAgICBwcm9jZXNzZWQgPSBjb25uc3NsLT5zc2xfd3JpdGVfYnVmZmVyZWRfbGVuZ3RoOwotICAgICAgICBjb25uc3NsLT5zc2xfd3JpdGVfYnVmZmVyZWRfbGVuZ3RoID0gMFVMOworICAgICAgICBwcm9jZXNzZWQgPSBCQUNLRU5ELT5zc2xfd3JpdGVfYnVmZmVyZWRfbGVuZ3RoOworICAgICAgICBCQUNLRU5ELT5zc2xfd3JpdGVfYnVmZmVyZWRfbGVuZ3RoID0gMFVMOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgZXJyU1NMV291bGRCbG9jazogLyogYXJnaCwgdHJ5IGFnYWluICovCiAgICAgICAgICpjdXJsY29kZSA9IENVUkxFX0FHQUlOOwpAQCAtMjc4NSwxMyArMjg0MCwxMyBAQAogICB9CiAgIGVsc2UgewogICAgIC8qIFdlJ3ZlIGdvdCBuZXcgZGF0YSB0byB3cml0ZTogKi8KLSAgICBlcnIgPSBTU0xXcml0ZShjb25uc3NsLT5zc2xfY3R4LCBtZW0sIGxlbiwgJnByb2Nlc3NlZCk7CisgICAgZXJyID0gU1NMV3JpdGUoQkFDS0VORC0+c3NsX2N0eCwgbWVtLCBsZW4sICZwcm9jZXNzZWQpOwogICAgIGlmKGVyciAhPSBub0VycikgewogICAgICAgc3dpdGNoKGVycikgewogICAgICAgICBjYXNlIGVyclNTTFdvdWxkQmxvY2s6CiAgICAgICAgICAgLyogRGF0YSB3YXMgYnVmZmVyZWQgYnV0IG5vdCBzZW50LCB3ZSBoYXZlIHRvIHRlbGwgdGhlIGNhbGxlcgogICAgICAgICAgICAgIHRvIHRyeSBzZW5kaW5nIGFnYWluLCBhbmQgcmVtZW1iZXIgaG93IG11Y2ggd2FzIGJ1ZmZlcmVkICovCi0gICAgICAgICAgY29ubnNzbC0+c3NsX3dyaXRlX2J1ZmZlcmVkX2xlbmd0aCA9IGxlbjsKKyAgICAgICAgICBCQUNLRU5ELT5zc2xfd3JpdGVfYnVmZmVyZWRfbGVuZ3RoID0gbGVuOwogICAgICAgICAgICpjdXJsY29kZSA9IENVUkxFX0FHQUlOOwogICAgICAgICAgIHJldHVybiAtMUw7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC0yODEzLDcgKzI4NjgsNyBAQAogICAvKnN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOyovCiAgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtudW1dOwogICBzaXplX3QgcHJvY2Vzc2VkID0gMFVMOwotICBPU1N0YXR1cyBlcnIgPSBTU0xSZWFkKGNvbm5zc2wtPnNzbF9jdHgsIGJ1ZiwgYnVmZmVyc2l6ZSwgJnByb2Nlc3NlZCk7CisgIE9TU3RhdHVzIGVyciA9IFNTTFJlYWQoQkFDS0VORC0+c3NsX2N0eCwgYnVmLCBidWZmZXJzaXplLCAmcHJvY2Vzc2VkKTsKIAogICBpZihlcnIgIT0gbm9FcnIpIHsKICAgICBzd2l0Y2goZXJyKSB7CkBAIC0yODQ0LDQgKzI4OTksNTIgQEAKICAgcmV0dXJuIChzc2l6ZV90KXByb2Nlc3NlZDsKIH0KIAorc3RhdGljIHZvaWQgKkN1cmxfZGFyd2luc3NsX2dldF9pbnRlcm5hbHMoc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMSU5GTyBpbmZvIFVOVVNFRF9QQVJBTSkKK3sKKyAgKHZvaWQpaW5mbzsKKyAgcmV0dXJuIEJBQ0tFTkQtPnNzbF9jdHg7Cit9CisKK2NvbnN0IHN0cnVjdCBDdXJsX3NzbCBDdXJsX3NzbF9kYXJ3aW5zc2wgPSB7CisgIHsgQ1VSTFNTTEJBQ0tFTkRfREFSV0lOU1NMLCAiZGFyd2luc3NsIiB9LCAvKiBpbmZvICovCisKKyAgMCwgLyogaGF2ZV9jYV9wYXRoICovCisgIDAsIC8qIGhhdmVfY2VydGluZm8gKi8KKyNpZmRlZiBEQVJXSU5fU1NMX1BJTk5FRFBVQktFWQorICAxLCAvKiBoYXZlX3Bpbm5lZHB1YmtleSAqLworI2Vsc2UKKyAgMCwgLyogaGF2ZV9waW5uZWRwdWJrZXkgKi8KKyNlbmRpZiAvKiBEQVJXSU5fU1NMX1BJTk5FRFBVQktFWSAqLworICAwLCAvKiBoYXZlX3NzbF9jdHggKi8KKyAgMCwgLyogc3VwcG9ydF9odHRwc19wcm94eSAqLworCisgIHNpemVvZihzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSksCisKKyAgQ3VybF9ub25lX2luaXQsICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCAqLworICBDdXJsX25vbmVfY2xlYW51cCwgICAgICAgICAgICAgICAgICAvKiBjbGVhbnVwICovCisgIEN1cmxfZGFyd2luc3NsX3ZlcnNpb24sICAgICAgICAgICAgIC8qIHZlcnNpb24gKi8KKyAgQ3VybF9kYXJ3aW5zc2xfY2hlY2tfY3huLCAgICAgICAgICAgLyogY2hlY2tfY3huICovCisgIEN1cmxfZGFyd2luc3NsX3NodXRkb3duLCAgICAgICAgICAgIC8qIHNodXRkb3duICovCisgIEN1cmxfZGFyd2luc3NsX2RhdGFfcGVuZGluZywgICAgICAgIC8qIGRhdGFfcGVuZGluZyAqLworICBDdXJsX2RhcndpbnNzbF9yYW5kb20sICAgICAgICAgICAgICAvKiByYW5kb20gKi8KKyAgQ3VybF9ub25lX2NlcnRfc3RhdHVzX3JlcXVlc3QsICAgICAgLyogY2VydF9zdGF0dXNfcmVxdWVzdCAqLworICBDdXJsX2RhcndpbnNzbF9jb25uZWN0LCAgICAgICAgICAgICAvKiBjb25uZWN0ICovCisgIEN1cmxfZGFyd2luc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcsIC8qIGNvbm5lY3Rfbm9uYmxvY2tpbmcgKi8KKyAgQ3VybF9kYXJ3aW5zc2xfZ2V0X2ludGVybmFscywgICAgICAgLyogZ2V0X2ludGVybmFscyAqLworICBDdXJsX2RhcndpbnNzbF9jbG9zZSwgICAgICAgICAgICAgICAvKiBjbG9zZSAqLworICBDdXJsX25vbmVfY2xvc2VfYWxsLCAgICAgICAgICAgICAgICAvKiBjbG9zZV9hbGwgKi8KKyAgQ3VybF9kYXJ3aW5zc2xfc2Vzc2lvbl9mcmVlLCAgICAgICAgLyogc2Vzc2lvbl9mcmVlICovCisgIEN1cmxfbm9uZV9zZXRfZW5naW5lLCAgICAgICAgICAgICAgIC8qIHNldF9lbmdpbmUgKi8KKyAgQ3VybF9ub25lX3NldF9lbmdpbmVfZGVmYXVsdCwgICAgICAgLyogc2V0X2VuZ2luZV9kZWZhdWx0ICovCisgIEN1cmxfbm9uZV9lbmdpbmVzX2xpc3QsICAgICAgICAgICAgIC8qIGVuZ2luZXNfbGlzdCAqLworICBDdXJsX2RhcndpbnNzbF9mYWxzZV9zdGFydCwgICAgICAgICAvKiBmYWxzZV9zdGFydCAqLworICBDdXJsX2RhcndpbnNzbF9tZDVzdW0sICAgICAgICAgICAgICAvKiBtZDVzdW0gKi8KKyAgQ3VybF9kYXJ3aW5zc2xfc2hhMjU2c3VtICAgICAgICAgICAgLyogc2hhMjU2c3VtICovCit9OworCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKwogI2VuZGlmIC8qIFVTRV9EQVJXSU5TU0wgKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvZGFyd2luc3NsLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2RhcndpbnNzbC5oCmluZGV4IGZkMzcyZmYuLjIzYzdmNzAgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvZGFyd2luc3NsLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9kYXJ3aW5zc2wuaApAQCAtMjYsNzUgKzI2LDcgQEAKIAogI2lmZGVmIFVTRV9EQVJXSU5TU0wKIAotQ1VSTGNvZGUgQ3VybF9kYXJ3aW5zc2xfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotCi1DVVJMY29kZSBDdXJsX2RhcndpbnNzbF9jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqZG9uZSk7Ci0KLS8qIGNsb3NlIGEgU1NMIGNvbm5lY3Rpb24gKi8KLXZvaWQgQ3VybF9kYXJ3aW5zc2xfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLQotdm9pZCBDdXJsX2RhcndpbnNzbF9zZXNzaW9uX2ZyZWUodm9pZCAqcHRyKTsKLXNpemVfdCBDdXJsX2RhcndpbnNzbF92ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwotaW50IEN1cmxfZGFyd2luc3NsX3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci1pbnQgQ3VybF9kYXJ3aW5zc2xfY2hlY2tfY3huKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubik7Ci1ib29sIEN1cmxfZGFyd2luc3NsX2RhdGFfcGVuZGluZyhjb25zdCBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29ubmluZGV4KTsKLQotQ1VSTGNvZGUgQ3VybF9kYXJ3aW5zc2xfcmFuZG9tKHVuc2lnbmVkIGNoYXIgKmVudHJvcHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCk7Ci12b2lkIEN1cmxfZGFyd2luc3NsX21kNXN1bSh1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbWQ1c3VtLCAvKiBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtZDVsZW4pOwotdm9pZCBDdXJsX2RhcndpbnNzbF9zaGEyNTZzdW0odW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTI1NnN1bSwgLyogb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2hhMjU2bGVuKTsKLWJvb2wgQ3VybF9kYXJ3aW5zc2xfZmFsc2Vfc3RhcnQodm9pZCk7Ci0KLS8qIFNldCB0aGUgQVBJIGJhY2tlbmQgZGVmaW5pdGlvbiB0byBTZWN1cmVUcmFuc3BvcnQgKi8KLSNkZWZpbmUgQ1VSTF9TU0xfQkFDS0VORCBDVVJMU1NMQkFDS0VORF9EQVJXSU5TU0wKLQotLyogcGlubmVkIHB1YmxpYyBrZXkgc3VwcG9ydCB0ZXN0cyAqLwotCi0vKiB2ZXJzaW9uIDEgc3VwcG9ydHMgbWFjT1MgMTAuMTIrIGFuZCBpT1MgMTArICovCi0jaWYgKChUQVJHRVRfT1NfSVBIT05FICYmIF9fSVBIT05FX09TX1ZFUlNJT05fTUlOX1JFUVVJUkVEID49IDEwMDAwMCkgfHwgXAotICAgICghVEFSR0VUX09TX0lQSE9ORSAmJiBfX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEICA+PSAxMDEyMDApKQotI2RlZmluZSBEQVJXSU5fU1NMX1BJTk5FRFBVQktFWV9WMSAxCi0jZW5kaWYKLQotLyogdmVyc2lvbiAyIHN1cHBvcnRzIE1hY09TWCAxMC43KyAqLwotI2lmICghVEFSR0VUX09TX0lQSE9ORSAmJiBfX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEID49IDEwNzApCi0jZGVmaW5lIERBUldJTl9TU0xfUElOTkVEUFVCS0VZX1YyIDEKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChEQVJXSU5fU1NMX1BJTk5FRFBVQktFWV9WMSkgfHwgZGVmaW5lZChEQVJXSU5fU1NMX1BJTk5FRFBVQktFWV9WMikKLS8qIHRoaXMgYmFja2VuZCBzdXBwb3J0cyBDVVJMT1BUX1BJTk5FRFBVQkxJQ0tFWSAqLwotI2RlZmluZSBEQVJXSU5fU1NMX1BJTk5FRFBVQktFWSAxCi0jZGVmaW5lIGhhdmVfY3VybHNzbF9waW5uZWRwdWJrZXkgMQotI2VuZGlmIC8qIERBUldJTl9TU0xfUElOTkVEUFVCS0VZICovCi0KLS8qIEFQSSBzZXR1cCBmb3IgU2VjdXJlVHJhbnNwb3J0ICovCi0jZGVmaW5lIGN1cmxzc2xfaW5pdCgpICgxKQotI2RlZmluZSBjdXJsc3NsX2NsZWFudXAoKSBDdXJsX25vcF9zdG10Ci0jZGVmaW5lIGN1cmxzc2xfY29ubmVjdCBDdXJsX2RhcndpbnNzbF9jb25uZWN0Ci0jZGVmaW5lIGN1cmxzc2xfY29ubmVjdF9ub25ibG9ja2luZyBDdXJsX2RhcndpbnNzbF9jb25uZWN0X25vbmJsb2NraW5nCi0jZGVmaW5lIGN1cmxzc2xfc2Vzc2lvbl9mcmVlKHgpIEN1cmxfZGFyd2luc3NsX3Nlc3Npb25fZnJlZSh4KQotI2RlZmluZSBjdXJsc3NsX2Nsb3NlX2FsbCh4KSAoKHZvaWQpeCkKLSNkZWZpbmUgY3VybHNzbF9jbG9zZSBDdXJsX2RhcndpbnNzbF9jbG9zZQotI2RlZmluZSBjdXJsc3NsX3NodXRkb3duKHgseSkgMAotI2RlZmluZSBjdXJsc3NsX3NldF9lbmdpbmUoeCx5KSAoKHZvaWQpeCwgKHZvaWQpeSwgQ1VSTEVfTk9UX0JVSUxUX0lOKQotI2RlZmluZSBjdXJsc3NsX3NldF9lbmdpbmVfZGVmYXVsdCh4KSAoKHZvaWQpeCwgQ1VSTEVfTk9UX0JVSUxUX0lOKQotI2RlZmluZSBjdXJsc3NsX2VuZ2luZXNfbGlzdCh4KSAoKHZvaWQpeCwgKHN0cnVjdCBjdXJsX3NsaXN0ICopTlVMTCkKLSNkZWZpbmUgY3VybHNzbF92ZXJzaW9uIEN1cmxfZGFyd2luc3NsX3ZlcnNpb24KLSNkZWZpbmUgY3VybHNzbF9jaGVja19jeG4gQ3VybF9kYXJ3aW5zc2xfY2hlY2tfY3huCi0jZGVmaW5lIGN1cmxzc2xfZGF0YV9wZW5kaW5nKHgseSkgQ3VybF9kYXJ3aW5zc2xfZGF0YV9wZW5kaW5nKHgsIHkpCi0jZGVmaW5lIGN1cmxzc2xfcmFuZG9tKHgseSx6KSAoKHZvaWQpeCwgQ3VybF9kYXJ3aW5zc2xfcmFuZG9tKHkseikpCi0jZGVmaW5lIGN1cmxzc2xfbWQ1c3VtKGEsYixjLGQpIEN1cmxfZGFyd2luc3NsX21kNXN1bShhLGIsYyxkKQotI2RlZmluZSBjdXJsc3NsX3NoYTI1NnN1bShhLGIsYyxkKSBDdXJsX2RhcndpbnNzbF9zaGEyNTZzdW0oYSxiLGMsZCkKLSNkZWZpbmUgY3VybHNzbF9mYWxzZV9zdGFydCgpIEN1cmxfZGFyd2luc3NsX2ZhbHNlX3N0YXJ0KCkKK2V4dGVybiBjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgQ3VybF9zc2xfZGFyd2luc3NsOwogCiAjZW5kaWYgLyogVVNFX0RBUldJTlNTTCAqLwogI2VuZGlmIC8qIEhFQURFUl9DVVJMX0RBUldJTlNTTF9IICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2dza2l0LmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2dza2l0LmMKaW5kZXggYmY3NWJkZC4uYmE1ZmFlZiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9nc2tpdC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvZ3NraXQuYwpAQCAtOTgsNiArOTgsMTQgQEAKICNkZWZpbmUgQ1VSTF9HU0tQUk9UT19UTFNWMTJfTUFTSyAgICAgICAgKDEgPDwgQ1VSTF9HU0tQUk9UT19UTFNWMTIpCiAjZGVmaW5lIENVUkxfR1NLUFJPVE9fTEFTVCAgICAgIDUKIAorc3RydWN0IHNzbF9iYWNrZW5kX2RhdGEgeworICBnc2tfaGFuZGxlIGhhbmRsZTsKKyAgaW50IGlvY3BvcnQ7CisgIGludCBsb2NhbGZkOworICBpbnQgcmVtb3RlZmQ7Cit9OworCisjZGVmaW5lIEJBQ0tFTkQgY29ubnNzbC0+YmFja2VuZAogCiAvKiBTdXBwb3J0ZWQgY2lwaGVycy4gKi8KIHR5cGVkZWYgc3RydWN0IHsKQEAgLTQyNyw3ICs0MzUsNyBAQAogfQogCiAKLWludCBDdXJsX2dza2l0X2luaXQodm9pZCkKK3N0YXRpYyBpbnQgQ3VybF9nc2tpdF9pbml0KHZvaWQpCiB7CiAgIC8qIE5vIGluaXRpYWxpc2F0aW9uIG5lZWRlZC4gKi8KIApAQCAtNDM1LDcgKzQ0Myw3IEBACiB9CiAKIAotdm9pZCBDdXJsX2dza2l0X2NsZWFudXAodm9pZCkKK3N0YXRpYyB2b2lkIEN1cmxfZ3NraXRfY2xlYW51cCh2b2lkKQogewogICAvKiBOb3RoaW5nIHRvIGRvLiAqLwogfQpAQCAtNDk1LDE0ICs1MDMsMTQgQEAKICAgUXNvX092ZXJsYXBwZWRJT190IGNzdGF0OwogCiAgIGlmKFFzb0NhbmNlbE9wZXJhdGlvbihjb25uLT5zb2NrW3NvY2tpbmRleF0sIDApID4gMCkKLSAgICBRc29XYWl0Rm9ySU9Db21wbGV0aW9uKGNvbm5zc2wtPmlvY3BvcnQsICZjc3RhdCwgKHN0cnVjdCB0aW1ldmFsICopIE5VTEwpOworICAgIFFzb1dhaXRGb3JJT0NvbXBsZXRpb24oQkFDS0VORC0+aW9jcG9ydCwgJmNzdGF0LCAoc3RydWN0IHRpbWV2YWwgKikgTlVMTCk7CiB9CiAKIAogc3RhdGljIHZvaWQgY2xvc2VfYXN5bmNfaGFuZHNoYWtlKHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsKQogewotICBRc29EZXN0cm95SU9Db21wbGV0aW9uUG9ydChjb25uc3NsLT5pb2Nwb3J0KTsKLSAgY29ubnNzbC0+aW9jcG9ydCA9IC0xOworICBRc29EZXN0cm95SU9Db21wbGV0aW9uUG9ydChCQUNLRU5ELT5pb2Nwb3J0KTsKKyAgQkFDS0VORC0+aW9jcG9ydCA9IC0xOwogfQogCiAvKiBTU0wgb3ZlciBTU0wKQEAgLTYyMCwxMiArNjI4LDEyIEBACiAgIEZEX1pFUk8oJmZkc193cml0ZSk7CiAgIG4gPSAtMTsKICAgaWYoZGlyZWN0aW9ucyAmIFNPU19SRUFEKSB7Ci0gICAgRkRfU0VUKGNvbm5zc2wtPnJlbW90ZWZkLCAmZmRzX3dyaXRlKTsKLSAgICBuID0gY29ubnNzbC0+cmVtb3RlZmQ7CisgICAgRkRfU0VUKEJBQ0tFTkQtPnJlbW90ZWZkLCAmZmRzX3dyaXRlKTsKKyAgICBuID0gQkFDS0VORC0+cmVtb3RlZmQ7CiAgIH0KICAgaWYoZGlyZWN0aW9ucyAmIFNPU19XUklURSkgewotICAgIEZEX1NFVChjb25uc3NsLT5yZW1vdGVmZCwgJmZkc19yZWFkKTsKLSAgICBuID0gY29ubnNzbC0+cmVtb3RlZmQ7CisgICAgRkRfU0VUKEJBQ0tFTkQtPnJlbW90ZWZkLCAmZmRzX3JlYWQpOworICAgIG4gPSBCQUNLRU5ELT5yZW1vdGVmZDsKICAgICBGRF9TRVQoY29ubi0+c29ja1tzb2NraW5kZXhdLCAmZmRzX3dyaXRlKTsKICAgICBpZihuIDwgY29ubi0+c29ja1tzb2NraW5kZXhdKQogICAgICAgbiA9IGNvbm4tPnNvY2tbc29ja2luZGV4XTsKQEAgLTYzNCwxNCArNjQyLDE1IEBACiAgIGlmKGkgPCAwKQogICAgIHJldHVybiAtMTsgIC8qIFNlbGVjdCBlcnJvci4gKi8KIAotICBpZihGRF9JU1NFVChjb25uc3NsLT5yZW1vdGVmZCwgJmZkc193cml0ZSkpIHsKKyAgaWYoRkRfSVNTRVQoQkFDS0VORC0+cmVtb3RlZmQsICZmZHNfd3JpdGUpKSB7CiAgICAgLyogVHJ5IGdldHRpbmcgZGF0YSBmcm9tIEhUVFBTIHByb3h5IGFuZCBwaXBlIGl0IHVwc3RyZWFtLiAqLwogICAgIG4gPSAwOwotICAgIGkgPSBnc2tfc2VjdXJlX3NvY19yZWFkKGNvbm5wcm94eXNzbC0+aGFuZGxlLCBidWYsIHNpemVvZiBidWYsICZuKTsKKyAgICBpID0gZ3NrX3NlY3VyZV9zb2NfcmVhZChjb25ucHJveHlzc2wtPmJhY2tlbmQtPmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIHNpemVvZiBidWYsICZuKTsKICAgICBzd2l0Y2goaSkgewogICAgIGNhc2UgR1NLX09LOgogICAgICAgaWYobikgewotICAgICAgICBpID0gd3JpdGUoY29ubnNzbC0+cmVtb3RlZmQsIGJ1Ziwgbik7CisgICAgICAgIGkgPSB3cml0ZShCQUNLRU5ELT5yZW1vdGVmZCwgYnVmLCBuKTsKICAgICAgICAgaWYoaSA8IDApCiAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICByZXQgPSAxOwpAQCAtNjU1LDE0ICs2NjQsMTQgQEAKICAgICB9CiAgIH0KIAotICBpZihGRF9JU1NFVChjb25uc3NsLT5yZW1vdGVmZCwgJmZkc19yZWFkKSAmJgorICBpZihGRF9JU1NFVChCQUNLRU5ELT5yZW1vdGVmZCwgJmZkc19yZWFkKSAmJgogICAgICBGRF9JU1NFVChjb25uLT5zb2NrW3NvY2tpbmRleF0sICZmZHNfd3JpdGUpKSB7CiAgICAgLyogUGlwZSBkYXRhIHRvIEhUVFBTIHByb3h5LiAqLwotICAgIG4gPSByZWFkKGNvbm5zc2wtPnJlbW90ZWZkLCBidWYsIHNpemVvZiBidWYpOworICAgIG4gPSByZWFkKEJBQ0tFTkQtPnJlbW90ZWZkLCBidWYsIHNpemVvZiBidWYpOwogICAgIGlmKG4gPCAwKQogICAgICAgcmV0dXJuIC0xOwogICAgIGlmKG4pIHsKLSAgICAgIGkgPSBnc2tfc2VjdXJlX3NvY193cml0ZShjb25ucHJveHlzc2wtPmhhbmRsZSwgYnVmLCBuLCAmbSk7CisgICAgICBpID0gZ3NrX3NlY3VyZV9zb2Nfd3JpdGUoY29ubnByb3h5c3NsLT5iYWNrZW5kLT5oYW5kbGUsIGJ1ZiwgbiwgJm0pOwogICAgICAgaWYoaSAhPSBHU0tfT0sgfHwgbiAhPSBtKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgICByZXQgPSAxOwpAQCAtNjc2LDIzICs2ODUsMjMgQEAKIHN0YXRpYyB2b2lkIGNsb3NlX29uZShzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCwKICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7Ci0gIGlmKGNvbm5zc2wtPmhhbmRsZSkgewotICAgIGdza2l0X3N0YXR1cyhjb25uLT5kYXRhLCBnc2tfc2VjdXJlX3NvY19jbG9zZSgmY29ubnNzbC0+aGFuZGxlKSwKKyAgaWYoQkFDS0VORC0+aGFuZGxlKSB7CisgICAgZ3NraXRfc3RhdHVzKGNvbm4tPmRhdGEsIGdza19zZWN1cmVfc29jX2Nsb3NlKCZCQUNLRU5ELT5oYW5kbGUpLAogICAgICAgICAgICAgICAiZ3NrX3NlY3VyZV9zb2NfY2xvc2UoKSIsIDApOwogICAgIC8qIExhc3QgY2hhbmNlIHRvIGRyYWluIG91dHB1dC4gKi8KICAgICB3aGlsZShwaXBlX3NzbG92ZXJzc2woY29ubiwgc29ja2luZGV4LCBTT1NfV1JJVEUpID4gMCkKICAgICAgIDsKLSAgICBjb25uc3NsLT5oYW5kbGUgPSAoZ3NrX2hhbmRsZSkgTlVMTDsKLSAgICBpZihjb25uc3NsLT5sb2NhbGZkID49IDApIHsKLSAgICAgIGNsb3NlKGNvbm5zc2wtPmxvY2FsZmQpOwotICAgICAgY29ubnNzbC0+bG9jYWxmZCA9IC0xOworICAgIEJBQ0tFTkQtPmhhbmRsZSA9IChnc2tfaGFuZGxlKSBOVUxMOworICAgIGlmKEJBQ0tFTkQtPmxvY2FsZmQgPj0gMCkgeworICAgICAgY2xvc2UoQkFDS0VORC0+bG9jYWxmZCk7CisgICAgICBCQUNLRU5ELT5sb2NhbGZkID0gLTE7CiAgICAgfQotICAgIGlmKGNvbm5zc2wtPnJlbW90ZWZkID49IDApIHsKLSAgICAgIGNsb3NlKGNvbm5zc2wtPnJlbW90ZWZkKTsKLSAgICAgIGNvbm5zc2wtPnJlbW90ZWZkID0gLTE7CisgICAgaWYoQkFDS0VORC0+cmVtb3RlZmQgPj0gMCkgeworICAgICAgY2xvc2UoQkFDS0VORC0+cmVtb3RlZmQpOworICAgICAgQkFDS0VORC0+cmVtb3RlZmQgPSAtMTsKICAgICB9CiAgIH0KLSAgaWYoY29ubnNzbC0+aW9jcG9ydCA+PSAwKQorICBpZihCQUNLRU5ELT5pb2Nwb3J0ID49IDApCiAgICAgY2xvc2VfYXN5bmNfaGFuZHNoYWtlKGNvbm5zc2wpOwogfQogCkBAIC03MDAsMTMgKzcwOSwxNCBAQAogc3RhdGljIHNzaXplX3QgZ3NraXRfc2VuZChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICptZW0sIHNpemVfdCBsZW4sIENVUkxjb2RlICpjdXJsY29kZSkKIHsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBDVVJMY29kZSBjYyA9IENVUkxFX1NFTkRfRVJST1I7CiAgIGludCB3cml0dGVuOwogCiAgIGlmKHBpcGVfc3Nsb3ZlcnNzbChjb25uLCBzb2NraW5kZXgsIFNPU19XUklURSkgPj0gMCkgewogICAgIGNjID0gZ3NraXRfc3RhdHVzKGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgZ3NrX3NlY3VyZV9zb2Nfd3JpdGUoY29ubi0+c3NsW3NvY2tpbmRleF0uaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgIGdza19zZWN1cmVfc29jX3dyaXRlKEJBQ0tFTkQtPmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtZW0sIChpbnQpIGxlbiwgJndyaXR0ZW4pLAogICAgICAgICAgICAgICAgICAgICAgICJnc2tfc2VjdXJlX3NvY193cml0ZSgpIiwgQ1VSTEVfU0VORF9FUlJPUik7CiAgICAgaWYoY2MgPT0gQ1VSTEVfT0spCkBAIC03MjQsNiArNzM0LDcgQEAKIHN0YXRpYyBzc2l6ZV90IGdza2l0X3JlY3Yoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgbnVtLCBjaGFyICpidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyc2l6ZSwgQ1VSTGNvZGUgKmN1cmxjb2RlKQogeworICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbbnVtXTsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIGludCBidWZmc2l6ZTsKICAgaW50IG5yZWFkOwpAQCAtNzMxLDcgKzc0Miw3IEBACiAKICAgaWYocGlwZV9zc2xvdmVyc3NsKGNvbm4sIG51bSwgU09TX1JFQUQpID49IDApIHsKICAgICBidWZmc2l6ZSA9IGJ1ZmZlcnNpemUgPiAoc2l6ZV90KSBJTlRfTUFYPyBJTlRfTUFYOiAoaW50KSBidWZmZXJzaXplOwotICAgIGNjID0gZ3NraXRfc3RhdHVzKGRhdGEsIGdza19zZWN1cmVfc29jX3JlYWQoY29ubi0+c3NsW251bV0uaGFuZGxlLAorICAgIGNjID0gZ3NraXRfc3RhdHVzKGRhdGEsIGdza19zZWN1cmVfc29jX3JlYWQoQkFDS0VORC0+aGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBidWZmc2l6ZSwgJm5yZWFkKSwKICAgICAgICAgICAgICAgICAgICAgICAiZ3NrX3NlY3VyZV9zb2NfcmVhZCgpIiwgQ1VSTEVfUkVDVl9FUlJPUik7CiAgIH0KQEAgLTgwNiwxMCArODE3LDEwIEBACiAKICAgLyogQ3JlYXRlIFNTTCBlbnZpcm9ubWVudCwgc3RhcnQgKHByZWZlcmFibHkgYXN5bmNocm9ub3VzKSBoYW5kc2hha2UuICovCiAKLSAgY29ubnNzbC0+aGFuZGxlID0gKGdza19oYW5kbGUpIE5VTEw7Ci0gIGNvbm5zc2wtPmlvY3BvcnQgPSAtMTsKLSAgY29ubnNzbC0+bG9jYWxmZCA9IC0xOwotICBjb25uc3NsLT5yZW1vdGVmZCA9IC0xOworICBCQUNLRU5ELT5oYW5kbGUgPSAoZ3NrX2hhbmRsZSkgTlVMTDsKKyAgQkFDS0VORC0+aW9jcG9ydCA9IC0xOworICBCQUNLRU5ELT5sb2NhbGZkID0gLTE7CisgIEJBQ0tFTkQtPnJlbW90ZWZkID0gLTE7CiAKICAgLyogR1NLaXQgc3VwcG9ydHMgdHdvIHdheXMgb2Ygc3BlY2lmeWluZyBhbiBTU0wgY29udGV4dDogZWl0aGVyIGJ5CiAgICAqICBhcHBsaWNhdGlvbiBpZGVudGlmaWVyICh0aGF0IHNob3VsZCBoYXZlIGJlZW4gZGVmaW5lZCBhdCB0aGUgc3lzdGVtCkBAIC04NDIsNyArODUzLDcgQEAKICAgfQogCiAgIC8qIENyZWF0ZSBzZWN1cmUgc2Vzc2lvbi4gKi8KLSAgcmVzdWx0ID0gZ3NraXRfc3RhdHVzKGRhdGEsIGdza19zZWN1cmVfc29jX29wZW4oZW52aXIsICZjb25uc3NsLT5oYW5kbGUpLAorICByZXN1bHQgPSBnc2tpdF9zdGF0dXMoZGF0YSwgZ3NrX3NlY3VyZV9zb2Nfb3BlbihlbnZpciwgJkJBQ0tFTkQtPmhhbmRsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAiZ3NrX3NlY3VyZV9zb2Nfb3BlbigpIiwgQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1IpOwogICBnc2tfZW52aXJvbm1lbnRfY2xvc2UoJmVudmlyKTsKICAgaWYocmVzdWx0KQpAQCAtODUyLDE4ICs4NjMsMTggQEAKICAgaWYoY29ubi0+cHJveHlfc3NsW3NvY2tpbmRleF0udXNlKSB7CiAgICAgaWYoaW5ldHNvY2tldHBhaXIoc29ja3BhaXIpKQogICAgICAgcmV0dXJuIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SOwotICAgIGNvbm5zc2wtPmxvY2FsZmQgPSBzb2NrcGFpclswXTsKLSAgICBjb25uc3NsLT5yZW1vdGVmZCA9IHNvY2twYWlyWzFdOwotICAgIHNldHNvY2tvcHQoY29ubnNzbC0+bG9jYWxmZCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLAorICAgIEJBQ0tFTkQtPmxvY2FsZmQgPSBzb2NrcGFpclswXTsKKyAgICBCQUNLRU5ELT5yZW1vdGVmZCA9IHNvY2twYWlyWzFdOworICAgIHNldHNvY2tvcHQoQkFDS0VORC0+bG9jYWxmZCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLAogICAgICAgICAgICAgICAgKHZvaWQgKikgc29idWZzaXplLCBzaXplb2Ygc29idWZzaXplKTsKLSAgICBzZXRzb2Nrb3B0KGNvbm5zc2wtPnJlbW90ZWZkLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsCisgICAgc2V0c29ja29wdChCQUNLRU5ELT5yZW1vdGVmZCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLAogICAgICAgICAgICAgICAgKHZvaWQgKikgc29idWZzaXplLCBzaXplb2Ygc29idWZzaXplKTsKLSAgICBzZXRzb2Nrb3B0KGNvbm5zc2wtPmxvY2FsZmQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwKKyAgICBzZXRzb2Nrb3B0KEJBQ0tFTkQtPmxvY2FsZmQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwKICAgICAgICAgICAgICAgICh2b2lkICopIHNvYnVmc2l6ZSwgc2l6ZW9mIHNvYnVmc2l6ZSk7Ci0gICAgc2V0c29ja29wdChjb25uc3NsLT5yZW1vdGVmZCwgU09MX1NPQ0tFVCwgU09fU05EQlVGLAorICAgIHNldHNvY2tvcHQoQkFDS0VORC0+cmVtb3RlZmQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwKICAgICAgICAgICAgICAgICh2b2lkICopIHNvYnVmc2l6ZSwgc2l6ZW9mIHNvYnVmc2l6ZSk7Ci0gICAgY3VybHhfbm9uYmxvY2soY29ubnNzbC0+bG9jYWxmZCwgVFJVRSk7Ci0gICAgY3VybHhfbm9uYmxvY2soY29ubnNzbC0+cmVtb3RlZmQsIFRSVUUpOworICAgIGN1cmx4X25vbmJsb2NrKEJBQ0tFTkQtPmxvY2FsZmQsIFRSVUUpOworICAgIGN1cmx4X25vbmJsb2NrKEJBQ0tFTkQtPnJlbW90ZWZkLCBUUlVFKTsKICAgfQogCiAgIC8qIERldGVybWluZSB3aGljaCBTU0wvVExTIHZlcnNpb24gc2hvdWxkIGJlIGVuYWJsZWQuICovCkBAIC04OTcsNyArOTA4LDcgQEAKIAogICAvKiBQcm9jZXNzIFNOSS4gSWdub3JlIGlmIG5vdCBzdXBwb3J0ZWQgKG9uIE9TNDAwIDwgVjdSMSkuICovCiAgIGlmKHNuaSkgewotICAgIHJlc3VsdCA9IHNldF9idWZmZXIoZGF0YSwgY29ubnNzbC0+aGFuZGxlLAorICAgIHJlc3VsdCA9IHNldF9idWZmZXIoZGF0YSwgQkFDS0VORC0+aGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgR1NLX1NTTF9FWFROX1NFUlZFUk5BTUVfUkVRVUVTVCwgc25pLCBUUlVFKTsKICAgICBpZihyZXN1bHQgPT0gQ1VSTEVfVU5TVVBQT1JURURfUFJPVE9DT0wpCiAgICAgICByZXN1bHQgPSBDVVJMRV9PSzsKQEAgLTkxMSwzNCArOTIyLDM0IEBACiAgICAgaWYodGltZW91dCA8IDApCiAgICAgICByZXN1bHQgPSBDVVJMRV9PUEVSQVRJT05fVElNRURPVVQ7CiAgICAgZWxzZQotICAgICAgcmVzdWx0ID0gc2V0X251bWVyaWMoZGF0YSwgY29ubnNzbC0+aGFuZGxlLCBHU0tfSEFORFNIQUtFX1RJTUVPVVQsCisgICAgICByZXN1bHQgPSBzZXRfbnVtZXJpYyhkYXRhLCBCQUNLRU5ELT5oYW5kbGUsIEdTS19IQU5EU0hBS0VfVElNRU9VVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aW1lb3V0ICsgOTk5KSAvIDEwMDApOwogICB9CiAgIGlmKCFyZXN1bHQpCi0gICAgcmVzdWx0ID0gc2V0X251bWVyaWMoZGF0YSwgY29ubnNzbC0+aGFuZGxlLCBHU0tfT1M0MDBfUkVBRF9USU1FT1VULCAxKTsKKyAgICByZXN1bHQgPSBzZXRfbnVtZXJpYyhkYXRhLCBCQUNLRU5ELT5oYW5kbGUsIEdTS19PUzQwMF9SRUFEX1RJTUVPVVQsIDEpOwogICBpZighcmVzdWx0KQotICAgIHJlc3VsdCA9IHNldF9udW1lcmljKGRhdGEsIGNvbm5zc2wtPmhhbmRsZSwgR1NLX0ZELCBjb25uc3NsLT5sb2NhbGZkID49IDA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgY29ubnNzbC0+bG9jYWxmZDogY29ubi0+c29ja1tzb2NraW5kZXhdKTsKKyAgICByZXN1bHQgPSBzZXRfbnVtZXJpYyhkYXRhLCBCQUNLRU5ELT5oYW5kbGUsIEdTS19GRCwgQkFDS0VORC0+bG9jYWxmZCA+PSAwPworICAgICAgICAgICAgICAgICAgICAgICAgIEJBQ0tFTkQtPmxvY2FsZmQ6IGNvbm4tPnNvY2tbc29ja2luZGV4XSk7CiAgIGlmKCFyZXN1bHQpCi0gICAgcmVzdWx0ID0gc2V0X2NpcGhlcnMoY29ubiwgY29ubnNzbC0+aGFuZGxlLCAmcHJvdG9mbGFncyk7CisgICAgcmVzdWx0ID0gc2V0X2NpcGhlcnMoY29ubiwgQkFDS0VORC0+aGFuZGxlLCAmcHJvdG9mbGFncyk7CiAgIGlmKCFwcm90b2ZsYWdzKSB7CiAgICAgZmFpbGYoZGF0YSwgIk5vIFNTTCBwcm90b2NvbC9jaXBoZXIgY29tYmluYXRpb24gZW5hYmxlZCIpOwogICAgIHJlc3VsdCA9IENVUkxFX1NTTF9DSVBIRVI7CiAgIH0KICAgaWYoIXJlc3VsdCkKLSAgICByZXN1bHQgPSBzZXRfZW51bShkYXRhLCBjb25uc3NsLT5oYW5kbGUsIEdTS19QUk9UT0NPTF9TU0xWMiwKKyAgICByZXN1bHQgPSBzZXRfZW51bShkYXRhLCBCQUNLRU5ELT5oYW5kbGUsIEdTS19QUk9UT0NPTF9TU0xWMiwKICAgICAgICAgICAgICAgICAgICAgICAocHJvdG9mbGFncyAmIENVUkxfR1NLUFJPVE9fU1NMVjJfTUFTSyk/CiAgICAgICAgICAgICAgICAgICAgICAgR1NLX1BST1RPQ09MX1NTTFYyX09OOiBHU0tfUFJPVE9DT0xfU1NMVjJfT0ZGLCBGQUxTRSk7CiAgIGlmKCFyZXN1bHQpCi0gICAgcmVzdWx0ID0gc2V0X2VudW0oZGF0YSwgY29ubnNzbC0+aGFuZGxlLCBHU0tfUFJPVE9DT0xfU1NMVjMsCisgICAgcmVzdWx0ID0gc2V0X2VudW0oZGF0YSwgQkFDS0VORC0+aGFuZGxlLCBHU0tfUFJPVE9DT0xfU1NMVjMsCiAgICAgICAgICAgICAgICAgICAgICAgKHByb3RvZmxhZ3MgJiBDVVJMX0dTS1BST1RPX1NTTFYzX01BU0spPwogICAgICAgICAgICAgICAgICAgICAgIEdTS19QUk9UT0NPTF9TU0xWM19PTjogR1NLX1BST1RPQ09MX1NTTFYzX09GRiwgRkFMU0UpOwogICBpZighcmVzdWx0KQotICAgIHJlc3VsdCA9IHNldF9lbnVtKGRhdGEsIGNvbm5zc2wtPmhhbmRsZSwgR1NLX1BST1RPQ09MX1RMU1YxLAorICAgIHJlc3VsdCA9IHNldF9lbnVtKGRhdGEsIEJBQ0tFTkQtPmhhbmRsZSwgR1NLX1BST1RPQ09MX1RMU1YxLAogICAgICAgICAgICAgICAgICAgICAgIChwcm90b2ZsYWdzICYgQ1VSTF9HU0tQUk9UT19UTFNWMTBfTUFTSyk/CiAgICAgICAgICAgICAgICAgICAgICAgR1NLX1BST1RPQ09MX1RMU1YxX09OOiBHU0tfUFJPVE9DT0xfVExTVjFfT0ZGLCBGQUxTRSk7CiAgIGlmKCFyZXN1bHQpIHsKLSAgICByZXN1bHQgPSBzZXRfZW51bShkYXRhLCBjb25uc3NsLT5oYW5kbGUsIEdTS19QUk9UT0NPTF9UTFNWMTEsCisgICAgcmVzdWx0ID0gc2V0X2VudW0oZGF0YSwgQkFDS0VORC0+aGFuZGxlLCBHU0tfUFJPVE9DT0xfVExTVjExLAogICAgICAgICAgICAgICAgICAgICAgIChwcm90b2ZsYWdzICYgQ1VSTF9HU0tQUk9UT19UTFNWMTFfTUFTSyk/CiAgICAgICAgICAgICAgICAgICAgICAgR1NLX1RSVUU6IEdTS19GQUxTRSwgVFJVRSk7CiAgICAgaWYocmVzdWx0ID09IENVUkxFX1VOU1VQUE9SVEVEX1BST1RPQ09MKSB7CkBAIC05NTAsNyArOTYxLDcgQEAKICAgICB9CiAgIH0KICAgaWYoIXJlc3VsdCkgewotICAgIHJlc3VsdCA9IHNldF9lbnVtKGRhdGEsIGNvbm5zc2wtPmhhbmRsZSwgR1NLX1BST1RPQ09MX1RMU1YxMiwKKyAgICByZXN1bHQgPSBzZXRfZW51bShkYXRhLCBCQUNLRU5ELT5oYW5kbGUsIEdTS19QUk9UT0NPTF9UTFNWMTIsCiAgICAgICAgICAgICAgICAgICAgICAgKHByb3RvZmxhZ3MgJiBDVVJMX0dTS1BST1RPX1RMU1YxMl9NQVNLKT8KICAgICAgICAgICAgICAgICAgICAgICBHU0tfVFJVRTogR1NLX0ZBTFNFLCBUUlVFKTsKICAgICBpZihyZXN1bHQgPT0gQ1VSTEVfVU5TVVBQT1JURURfUFJPVE9DT0wpIHsKQEAgLTk2MiwxOCArOTczLDE4IEBACiAgICAgfQogICB9CiAgIGlmKCFyZXN1bHQpCi0gICAgcmVzdWx0ID0gc2V0X2VudW0oZGF0YSwgY29ubnNzbC0+aGFuZGxlLCBHU0tfU0VSVkVSX0FVVEhfVFlQRSwKKyAgICByZXN1bHQgPSBzZXRfZW51bShkYXRhLCBCQUNLRU5ELT5oYW5kbGUsIEdTS19TRVJWRVJfQVVUSF9UWVBFLAogICAgICAgICAgICAgICAgICAgICAgIHZlcmlmeXBlZXI/IEdTS19TRVJWRVJfQVVUSF9GVUxMOgogICAgICAgICAgICAgICAgICAgICAgIEdTS19TRVJWRVJfQVVUSF9QQVNTVEhSVSwgRkFMU0UpOwogCiAgIGlmKCFyZXN1bHQpIHsKICAgICAvKiBTdGFydCBoYW5kc2hha2UuIFRyeSBhc3luY2hyb25vdXMgZmlyc3QuICovCiAgICAgbWVtc2V0KCZjb21tYXJlYSwgMCwgc2l6ZW9mIGNvbW1hcmVhKTsKLSAgICBjb25uc3NsLT5pb2Nwb3J0ID0gUXNvQ3JlYXRlSU9Db21wbGV0aW9uUG9ydCgpOwotICAgIGlmKGNvbm5zc2wtPmlvY3BvcnQgIT0gLTEpIHsKKyAgICBCQUNLRU5ELT5pb2Nwb3J0ID0gUXNvQ3JlYXRlSU9Db21wbGV0aW9uUG9ydCgpOworICAgIGlmKEJBQ0tFTkQtPmlvY3BvcnQgIT0gLTEpIHsKICAgICAgIHJlc3VsdCA9IGdza2l0X3N0YXR1cyhkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdza19zZWN1cmVfc29jX3N0YXJ0SW5pdChjb25uc3NsLT5oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5zc2wtPmlvY3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NrX3NlY3VyZV9zb2Nfc3RhcnRJbml0KEJBQ0tFTkQtPmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFDS0VORC0+aW9jcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hcmVhKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3NrX3NlY3VyZV9zb2Nfc3RhcnRJbml0KCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SKTsKQEAgLTk5Myw3ICsxMDA0LDcgQEAKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAvKiBObyBtb3JlIGNvbXBsZXRpb24gcG9ydCBhdmFpbGFibGUuIFVzZSBzeW5jaHJvbm91cyBJTy4gKi8KLSAgICAgIHJlc3VsdCA9IGdza2l0X3N0YXR1cyhkYXRhLCBnc2tfc2VjdXJlX3NvY19pbml0KGNvbm5zc2wtPmhhbmRsZSksCisgICAgICByZXN1bHQgPSBnc2tpdF9zdGF0dXMoZGF0YSwgZ3NrX3NlY3VyZV9zb2NfaW5pdChCQUNLRU5ELT5oYW5kbGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnc2tfc2VjdXJlX3NvY19pbml0KCkiLCBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUik7CiAgICAgICBpZighcmVzdWx0KSB7CiAgICAgICAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPSBzc2xfY29ubmVjdF8zOwpAQCAtMTAyNiw3ICsxMDM3LDcgQEAKICAgICAgIHRpbWVvdXRfbXMgPSAwOwogICAgIHN0bXYudHZfc2VjID0gdGltZW91dF9tcyAvIDEwMDA7CiAgICAgc3Rtdi50dl91c2VjID0gKHRpbWVvdXRfbXMgLSBzdG12LnR2X3NlYyAqIDEwMDApICogMTAwMDsKLSAgICBzd2l0Y2goUXNvV2FpdEZvcklPQ29tcGxldGlvbihjb25uc3NsLT5pb2Nwb3J0LCAmY3N0YXQsICZzdG12KSkgeworICAgIHN3aXRjaChRc29XYWl0Rm9ySU9Db21wbGV0aW9uKEJBQ0tFTkQtPmlvY3BvcnQsICZjc3RhdCwgJnN0bXYpKSB7CiAgICAgY2FzZSAxOiAgICAgICAgICAgICAvKiBPcGVyYXRpb24gY29tcGxldGUuICovCiAgICAgICBicmVhazsKICAgICBjYXNlIC0xOiAgICAgICAgICAgIC8qIEFuIGVycm9yIG9jY3VycmVkOiBoYW5kc2hha2Ugc3RpbGwgaW4gcHJvZ3Jlc3MuICovCkBAIC0xMDc1LDcgKzEwODYsNyBAQAogCiAgIC8qIFNTTCBoYW5kc2hha2UgZG9uZTogZ2F0aGVyIGNlcnRpZmljYXRlIGluZm8gYW5kIHZlcmlmeSBob3N0LiAqLwogCi0gIGlmKGdza2l0X3N0YXR1cyhkYXRhLCBnc2tfYXR0cmlidXRlX2dldF9jZXJ0X2luZm8oY29ubnNzbC0+aGFuZGxlLAorICBpZihnc2tpdF9zdGF0dXMoZGF0YSwgZ3NrX2F0dHJpYnV0ZV9nZXRfY2VydF9pbmZvKEJBQ0tFTkQtPmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU0tfUEFSVE5FUl9DRVJUX0lORk8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNkZXYsICZjZGVjKSwKICAgICAgICAgICAgICAgICAgICJnc2tfYXR0cmlidXRlX2dldF9jZXJ0X2luZm8oKSIsIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SKSA9PQpAQCAtMTIxNiw5ICsxMjI3LDggQEAKIH0KIAogCi1DVVJMY29kZSBDdXJsX2dza2l0X2Nvbm5lY3Rfbm9uYmxvY2tpbmcoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqZG9uZSkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX2dza2l0X2Nvbm5lY3Rfbm9uYmxvY2tpbmcoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LCBib29sICpkb25lKQogewogICBDVVJMY29kZSByZXN1bHQ7CiAKQEAgLTEyMjksNyArMTIzOSw3IEBACiB9CiAKIAotQ1VSTGNvZGUgQ3VybF9nc2tpdF9jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX2dza2l0X2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQogewogICBDVVJMY29kZSByZXN1bHQ7CiAgIGJvb2wgZG9uZTsKQEAgLTEyNDUsMTQgKzEyNTUsMTQgQEAKIH0KIAogCi12b2lkIEN1cmxfZ3NraXRfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQorc3RhdGljIHZvaWQgQ3VybF9nc2tpdF9jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CiAgIGNsb3NlX29uZSgmY29ubi0+c3NsW3NvY2tpbmRleF0sIGNvbm4sIHNvY2tpbmRleCk7CiAgIGNsb3NlX29uZSgmY29ubi0+cHJveHlfc3NsW3NvY2tpbmRleF0sIGNvbm4sIHNvY2tpbmRleCk7CiB9CiAKIAotaW50IEN1cmxfZ3NraXRfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQorc3RhdGljIGludCBDdXJsX2dza2l0X3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKICAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwpAQCAtMTI2MSw3ICsxMjcxLDcgQEAKICAgaW50IHJjOwogICBjaGFyIGJ1ZlsxMjBdOwogCi0gIGlmKCFjb25uc3NsLT5oYW5kbGUpCisgIGlmKCFCQUNLRU5ELT5oYW5kbGUpCiAgICAgcmV0dXJuIDA7CiAKICAgaWYoZGF0YS0+c2V0LmZ0cF9jY2MgIT0gQ1VSTEZUUFNTTF9DQ0NfQUNUSVZFKQpAQCAtMTMwNiwyMSArMTMxNiwyMiBAQAogfQogCiAKLXNpemVfdCBDdXJsX2dza2l0X3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBzaXplX3QgQ3VybF9nc2tpdF92ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7CiAgIHN0cm5jcHkoYnVmZmVyLCAiR1NLaXQiLCBzaXplKTsKICAgcmV0dXJuIHN0cmxlbihidWZmZXIpOwogfQogCiAKLWludCBDdXJsX2dza2l0X2NoZWNrX2N4bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmN4bikKK3N0YXRpYyBpbnQgQ3VybF9nc2tpdF9jaGVja19jeG4oc3RydWN0IGNvbm5lY3RkYXRhICpjeG4pCiB7CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmN4bi0+c3NsW0ZJUlNUU09DS0VUXTsKICAgaW50IGVycjsKICAgaW50IGVycmxlbjsKIAogICAvKiBUaGUgb25seSB0aGluZyB0aGF0IGNhbiBiZSB0ZXN0ZWQgaGVyZSBpcyBhdCB0aGUgc29ja2V0IGxldmVsLiAqLwogCi0gIGlmKCFjeG4tPnNzbFtGSVJTVFNPQ0tFVF0uaGFuZGxlKQorICBpZighQkFDS0VORC0+aGFuZGxlKQogICAgIHJldHVybiAwOyAvKiBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZCAqLwogCiAgIGVyciA9IDA7CkBAIC0xMzM0LDQgKzEzNDUsNDYgQEAKICAgcmV0dXJuIC0xOyAgLyogY29ubmVjdGlvbiBzdGF0dXMgdW5rbm93biAqLwogfQogCitzdGF0aWMgdm9pZCAqQ3VybF9nc2tpdF9nZXRfaW50ZXJuYWxzKHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMSU5GTyBpbmZvIFVOVVNFRF9QQVJBTSkKK3sKKyAgKHZvaWQpaW5mbzsKKyAgcmV0dXJuIEJBQ0tFTkQtPmhhbmRsZTsKK30KKworY29uc3Qgc3RydWN0IEN1cmxfc3NsIEN1cmxfc3NsX2dza2l0ID0geworICB7IENVUkxTU0xCQUNLRU5EX0dTS0lULCAiZ3NraXQiIH0sIC8qIGluZm8gKi8KKworICAwLCAvKiBoYXZlX2NhX3BhdGggKi8KKyAgMSwgLyogaGF2ZV9jZXJ0aW5mbyAqLworICAwLCAvKiBoYXZlX3Bpbm5lZHB1YmtleSAqLworICAwLCAvKiBoYXZlX3NzbF9jdHggKi8KKyAgLyogVE9ETzogY29udmVydCB0byAxIGFuZCBmaXggdGVzdCAjMTAxNCAoaWYgbmVlZCkgKi8KKyAgMCwgLyogc3VwcG9ydF9odHRwc19wcm94eSAqLworCisgIHNpemVvZihzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSksCisKKyAgQ3VybF9nc2tpdF9pbml0LCAgICAgICAgICAgICAgICAvKiBpbml0ICovCisgIEN1cmxfZ3NraXRfY2xlYW51cCwgICAgICAgICAgICAgLyogY2xlYW51cCAqLworICBDdXJsX2dza2l0X3ZlcnNpb24sICAgICAgICAgICAgIC8qIHZlcnNpb24gKi8KKyAgQ3VybF9nc2tpdF9jaGVja19jeG4sICAgICAgICAgICAvKiBjaGVja19jeG4gKi8KKyAgQ3VybF9nc2tpdF9zaHV0ZG93biwgICAgICAgICAgICAvKiBzaHV0ZG93biAqLworICBDdXJsX25vbmVfZGF0YV9wZW5kaW5nLCAgICAgICAgIC8qIGRhdGFfcGVuZGluZyAqLworICBDdXJsX25vbmVfcmFuZG9tLCAgICAgICAgICAgICAgIC8qIHJhbmRvbSAqLworICBDdXJsX25vbmVfY2VydF9zdGF0dXNfcmVxdWVzdCwgIC8qIGNlcnRfc3RhdHVzX3JlcXVlc3QgKi8KKyAgQ3VybF9nc2tpdF9jb25uZWN0LCAgICAgICAgICAgICAvKiBjb25uZWN0ICovCisgIEN1cmxfZ3NraXRfY29ubmVjdF9ub25ibG9ja2luZywgLyogY29ubmVjdF9ub25ibG9ja2luZyAqLworICBDdXJsX2dza2l0X2dldF9pbnRlcm5hbHMsICAgICAgIC8qIGdldF9pbnRlcm5hbHMgKi8KKyAgQ3VybF9nc2tpdF9jbG9zZSwgICAgICAgICAgICAgICAvKiBjbG9zZSAqLworICBDdXJsX25vbmVfY2xvc2VfYWxsLCAgICAgICAgICAgIC8qIGNsb3NlX2FsbCAqLworICAvKiBObyBzZXNzaW9uIGhhbmRsaW5nIGZvciBHU0tpdCAqLworICBDdXJsX25vbmVfc2Vzc2lvbl9mcmVlLCAgICAgICAgIC8qIHNlc3Npb25fZnJlZSAqLworICBDdXJsX25vbmVfc2V0X2VuZ2luZSwgICAgICAgICAgIC8qIHNldF9lbmdpbmUgKi8KKyAgQ3VybF9ub25lX3NldF9lbmdpbmVfZGVmYXVsdCwgICAvKiBzZXRfZW5naW5lX2RlZmF1bHQgKi8KKyAgQ3VybF9ub25lX2VuZ2luZXNfbGlzdCwgICAgICAgICAvKiBlbmdpbmVzX2xpc3QgKi8KKyAgQ3VybF9ub25lX2ZhbHNlX3N0YXJ0LCAgICAgICAgICAvKiBmYWxzZV9zdGFydCAqLworICBDdXJsX25vbmVfbWQ1c3VtLCAgICAgICAgICAgICAgIC8qIG1kNXN1bSAqLworICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoYTI1NnN1bSAqLworfTsKKwogI2VuZGlmIC8qIFVTRV9HU0tJVCAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9nc2tpdC5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9nc2tpdC5oCmluZGV4IDIyOTc1OTIuLjQ2NmVlNGQgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvZ3NraXQuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2dza2l0LmgKQEAgLTMwLDQ0ICszMCw4IEBACiAjaW5jbHVkZSAidXJsZGF0YS5oIgogCiAjaWZkZWYgVVNFX0dTS0lUCi1pbnQgQ3VybF9nc2tpdF9pbml0KHZvaWQpOwotdm9pZCBDdXJsX2dza2l0X2NsZWFudXAodm9pZCk7Ci1DVVJMY29kZSBDdXJsX2dza2l0X2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLUNVUkxjb2RlIEN1cmxfZ3NraXRfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwgYm9vbCAqZG9uZSk7Ci12b2lkIEN1cmxfZ3NraXRfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLWludCBDdXJsX2dza2l0X3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7CiAKLXNpemVfdCBDdXJsX2dza2l0X3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci1pbnQgQ3VybF9nc2tpdF9jaGVja19jeG4oc3RydWN0IGNvbm5lY3RkYXRhICpjeG4pOwotCi0vKiBTdXBwb3J0IEhUVFBTLXByb3h5ICovCi0vKiBUT0RPOiBhZGQgJyNkZWZpbmUgSFRUUFNfUFJPWFlfU1VQUE9SVCAxJyBhbmQgZml4IHRlc3QgIzEwMTQgKGlmIG5lZWQpICovCi0KLS8qIFNldCB0aGUgQVBJIGJhY2tlbmQgZGVmaW5pdGlvbiB0byBHU0tpdCAqLwotI2RlZmluZSBDVVJMX1NTTF9CQUNLRU5EIENVUkxTU0xCQUNLRU5EX0dTS0lUCi0KLS8qIHRoaXMgYmFja2VuZCBzdXBwb3J0cyBDVVJMT1BUX0NFUlRJTkZPICovCi0jZGVmaW5lIGhhdmVfY3VybHNzbF9jZXJ0aW5mbyAxCi0KLS8qIEFQSSBzZXR1cCBmb3IgR1NLaXQgKi8KLSNkZWZpbmUgY3VybHNzbF9pbml0IEN1cmxfZ3NraXRfaW5pdAotI2RlZmluZSBjdXJsc3NsX2NsZWFudXAgQ3VybF9nc2tpdF9jbGVhbnVwCi0jZGVmaW5lIGN1cmxzc2xfY29ubmVjdCBDdXJsX2dza2l0X2Nvbm5lY3QKLSNkZWZpbmUgY3VybHNzbF9jb25uZWN0X25vbmJsb2NraW5nIEN1cmxfZ3NraXRfY29ubmVjdF9ub25ibG9ja2luZwotCi0vKiAgTm8gc2Vzc2lvbiBoYW5kbGluZyBmb3IgR1NLaXQgKi8KLSNkZWZpbmUgY3VybHNzbF9zZXNzaW9uX2ZyZWUoeCkgQ3VybF9ub3Bfc3RtdAotI2RlZmluZSBjdXJsc3NsX2Nsb3NlX2FsbCh4KSAoKHZvaWQpeCkKLSNkZWZpbmUgY3VybHNzbF9jbG9zZSBDdXJsX2dza2l0X2Nsb3NlCi0jZGVmaW5lIGN1cmxzc2xfc2h1dGRvd24oeCx5KSBDdXJsX2dza2l0X3NodXRkb3duKHgseSkKLSNkZWZpbmUgY3VybHNzbF9zZXRfZW5naW5lKHgseSkgQ1VSTEVfTk9UX0JVSUxUX0lOCi0jZGVmaW5lIGN1cmxzc2xfc2V0X2VuZ2luZV9kZWZhdWx0KHgpIENVUkxFX05PVF9CVUlMVF9JTgotI2RlZmluZSBjdXJsc3NsX2VuZ2luZXNfbGlzdCh4KSBOVUxMCi0jZGVmaW5lIGN1cmxzc2xfdmVyc2lvbiBDdXJsX2dza2l0X3ZlcnNpb24KLSNkZWZpbmUgY3VybHNzbF9jaGVja19jeG4oeCkgQ3VybF9nc2tpdF9jaGVja19jeG4oeCkKLSNkZWZpbmUgY3VybHNzbF9kYXRhX3BlbmRpbmcoeCx5KSAwCi0jZGVmaW5lIGN1cmxzc2xfcmFuZG9tKHgseSx6KSAoeD14LCB5PXksIHo9eiwgQ1VSTEVfTk9UX0JVSUxUX0lOKQorZXh0ZXJuIGNvbnN0IHN0cnVjdCBDdXJsX3NzbCBDdXJsX3NzbF9nc2tpdDsKIAogI2VuZGlmIC8qIFVTRV9HU0tJVCAqLwogCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2d0bHMuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvZ3Rscy5jCmluZGV4IDg0NGJlMmQuLmE4NDQ5MTUgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvZ3Rscy5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvZ3Rscy5jCkBAIC02MCwxNSArNjAsMTMgQEAKIC8qIFRoZSBsYXN0ICNpbmNsdWRlIGZpbGUgc2hvdWxkIGJlOiAqLwogI2luY2x1ZGUgIm1lbWRlYnVnLmgiCiAKLS8qCi0gU29tZSBoYWNraXNoIGNhc3QgbWFjcm9zIGJhc2VkIG9uOgotIGh0dHBzOi8vZGV2ZWxvcGVyLmdub21lLm9yZy9nbGliL3Vuc3RhYmxlL2dsaWItVHlwZS1Db252ZXJzaW9uLU1hY3Jvcy5odG1sCi0qLwotI2lmbmRlZiBHTlVUTFNfUE9JTlRFUl9UT19JTlRfQ0FTVAotI2RlZmluZSBHTlVUTFNfUE9JTlRFUl9UT19JTlRfQ0FTVChwKSAoKGludCkgKGxvbmcpIChwKSkKKyNpZm5kZWYgR05VVExTX1BPSU5URVJfVE9fU09DS0VUX0NBU1QKKyNkZWZpbmUgR05VVExTX1BPSU5URVJfVE9fU09DS0VUX0NBU1QocCkgXAorICAoKGN1cmxfc29ja2V0X3QpICgoY2hhciAqKShwKSAtIChjaGFyICopTlVMTCkpCiAjZW5kaWYKLSNpZm5kZWYgR05VVExTX0lOVF9UT19QT0lOVEVSX0NBU1QKLSNkZWZpbmUgR05VVExTX0lOVF9UT19QT0lOVEVSX0NBU1QoaSkgKCh2b2lkICopIChsb25nKSAoaSkpCisjaWZuZGVmIEdOVVRMU19TT0NLRVRfVE9fUE9JTlRFUl9DQVNUCisjZGVmaW5lIEdOVVRMU19TT0NLRVRfVE9fUE9JTlRFUl9DQVNUKHMpIFwKKyAgKCh2b2lkICopICgoY2hhciAqKU5VTEwgKyAocykpKQogI2VuZGlmCiAKIC8qIEVuYWJsZSBHbnVUTFMgZGVidWdnaW5nIGJ5IGRlZmluaW5nIEdUTFNERUJVRyAqLwpAQCAtMTA5LDYgKzEwNywxNiBAQAogIyBpbmNsdWRlIDxnbnV0bHMvb2NzcC5oPgogI2VuZGlmCiAKK3N0cnVjdCBzc2xfYmFja2VuZF9kYXRhIHsKKyAgZ251dGxzX3Nlc3Npb25fdCBzZXNzaW9uOworICBnbnV0bHNfY2VydGlmaWNhdGVfY3JlZGVudGlhbHNfdCBjcmVkOworI2lmZGVmIFVTRV9UTFNfU1JQCisgIGdudXRsc19zcnBfY2xpZW50X2NyZWRlbnRpYWxzX3Qgc3JwX2NsaWVudF9jcmVkOworI2VuZGlmCit9OworCisjZGVmaW5lIEJBQ0tFTkQgY29ubnNzbC0+YmFja2VuZAorCiAvKgogICogQ3VzdG9tIHB1c2ggYW5kIHB1bGwgY2FsbGJhY2sgZnVuY3Rpb25zIHVzZWQgYnkgR05VIFRMUyB0byByZWFkIGFuZCB3cml0ZQogICogdG8gdGhlIHNvY2tldC4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgc2ltcGxlIHdyYXBwZXJzIHRvIHNlbmQoKSBhbmQgcmVjdigpCkBAIC0xNTMsNyArMTYxLDcgQEAKIAogc3RhdGljIHNzaXplX3QgQ3VybF9ndGxzX3B1c2godm9pZCAqcywgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQogewotICBzc2l6ZV90IHJldCA9IHN3cml0ZShHTlVUTFNfUE9JTlRFUl9UT19JTlRfQ0FTVChzKSwgYnVmLCBsZW4pOworICBzc2l6ZV90IHJldCA9IHN3cml0ZShHTlVUTFNfUE9JTlRFUl9UT19TT0NLRVRfQ0FTVChzKSwgYnVmLCBsZW4pOwogI2lmIGRlZmluZWQoVVNFX1dJTlNPQ0spICYmICFkZWZpbmVkKEdOVVRMU19NQVBTX1dJTlNPQ0tfRVJST1JTKQogICBpZihyZXQgPCAwKQogICAgIGdudXRsc190cmFuc3BvcnRfc2V0X2dsb2JhbF9lcnJubyhndGxzX21hcHBlZF9zb2NrZXJybm8oKSk7CkBAIC0xNjMsNyArMTcxLDcgQEAKIAogc3RhdGljIHNzaXplX3QgQ3VybF9ndGxzX3B1bGwodm9pZCAqcywgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQogewotICBzc2l6ZV90IHJldCA9IHNyZWFkKEdOVVRMU19QT0lOVEVSX1RPX0lOVF9DQVNUKHMpLCBidWYsIGxlbik7CisgIHNzaXplX3QgcmV0ID0gc3JlYWQoR05VVExTX1BPSU5URVJfVE9fU09DS0VUX0NBU1QocyksIGJ1ZiwgbGVuKTsKICNpZiBkZWZpbmVkKFVTRV9XSU5TT0NLKSAmJiAhZGVmaW5lZChHTlVUTFNfTUFQU19XSU5TT0NLX0VSUk9SUykKICAgaWYocmV0IDwgMCkKICAgICBnbnV0bHNfdHJhbnNwb3J0X3NldF9nbG9iYWxfZXJybm8oZ3Rsc19tYXBwZWRfc29ja2Vycm5vKCkpOwpAQCAtMTg4LDcgKzE5Niw3IEBACiAgKiBtdXN0IG9ubHkgYmUgY2FsbGVkIGZyb20gd2l0aGluIGN1cmxfZ2xvYmFsX2luaXQoKSB0byBrZWVwIHRoZSB0aHJlYWQKICAqIHNpdHVhdGlvbiB1bmRlciBjb250cm9sIQogICovCi1pbnQgQ3VybF9ndGxzX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgQ3VybF9ndGxzX2luaXQodm9pZCkKIHsKICAgaW50IHJldCA9IDE7CiAgIGlmKCFndGxzX2luaXRlZCkgewpAQCAtMjAyLDEzICsyMTAsMTIgQEAKICAgcmV0dXJuIHJldDsKIH0KIAotaW50IEN1cmxfZ3Rsc19jbGVhbnVwKHZvaWQpCitzdGF0aWMgdm9pZCBDdXJsX2d0bHNfY2xlYW51cCh2b2lkKQogewogICBpZihndGxzX2luaXRlZCkgewogICAgIGdudXRsc19nbG9iYWxfZGVpbml0KCk7CiAgICAgZ3Rsc19pbml0ZWQgPSBGQUxTRTsKICAgfQotICByZXR1cm4gMTsKIH0KIAogI2lmbmRlZiBDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTCkBAIC0yNzksNyArMjg2LDcgQEAKIHsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwotICBnbnV0bHNfc2Vzc2lvbl90IHNlc3Npb24gPSBjb25uLT5zc2xbc29ja2luZGV4XS5zZXNzaW9uOworICBnbnV0bHNfc2Vzc2lvbl90IHNlc3Npb24gPSBCQUNLRU5ELT5zZXNzaW9uOwogICBjdXJsX3NvY2tldF90IHNvY2tmZCA9IGNvbm4tPnNvY2tbc29ja2luZGV4XTsKICAgdGltZV90IHRpbWVvdXRfbXM7CiAgIGludCByYzsKQEAgLTI5OSw5ICszMDYsOSBAQAogICAgIGlmKGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPT0gc3NsX2Nvbm5lY3RfMl9yZWFkaW5nCiAgICAgICAgfHwgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9PSBzc2xfY29ubmVjdF8yX3dyaXRpbmcpIHsKIAotICAgICAgY3VybF9zb2NrZXRfdCB3cml0ZWZkID0gc3NsX2Nvbm5lY3RfMl93cml0aW5nPT0KKyAgICAgIGN1cmxfc29ja2V0X3Qgd3JpdGVmZCA9IHNzbF9jb25uZWN0XzJfd3JpdGluZyA9PQogICAgICAgICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlP3NvY2tmZDpDVVJMX1NPQ0tFVF9CQUQ7Ci0gICAgICBjdXJsX3NvY2tldF90IHJlYWRmZCA9IHNzbF9jb25uZWN0XzJfcmVhZGluZz09CisgICAgICBjdXJsX3NvY2tldF90IHJlYWRmZCA9IHNzbF9jb25uZWN0XzJfcmVhZGluZyA9PQogICAgICAgICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlP3NvY2tmZDpDVVJMX1NPQ0tFVF9CQUQ7CiAKICAgICAgIHdoYXQgPSBDdXJsX3NvY2tldF9jaGVjayhyZWFkZmQsIENVUkxfU09DS0VUX0JBRCwgd3JpdGVmZCwKQEAgLTQ3Nyw2ICs0ODQsNyBAQAogICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgpCiB7CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOworICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKICAgdW5zaWduZWQgaW50IGluaXRfZmxhZ3M7CiAgIGdudXRsc19zZXNzaW9uX3Qgc2Vzc2lvbjsKICAgaW50IHJjOwpAQCAtNTEyLDcgKzUyMCw3IEBACiAgIGNvbnN0IGNoYXIgKiBjb25zdCBob3N0bmFtZSA9IFNTTF9JU19QUk9YWSgpID8gY29ubi0+aHR0cF9wcm94eS5ob3N0Lm5hbWUgOgogICAgIGNvbm4tPmhvc3QubmFtZTsKIAotICBpZihjb25uLT5zc2xbc29ja2luZGV4XS5zdGF0ZSA9PSBzc2xfY29ubmVjdGlvbl9jb21wbGV0ZSkKKyAgaWYoY29ubnNzbC0+c3RhdGUgPT0gc3NsX2Nvbm5lY3Rpb25fY29tcGxldGUpCiAgICAgLyogdG8gbWFrZSB1cyB0b2xlcmFudCBhZ2FpbnN0IGJlaW5nIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBmb3IgdGhlCiAgICAgICAgc2FtZSBjb25uZWN0aW9uICovCiAgICAgcmV0dXJuIENVUkxFX09LOwpAQCAtNTI4LDcgKzUzNiw3IEBACiAgICAgc25pID0gRkFMU0U7IC8qIFNTTHYzIGhhcyBubyBTTkkgKi8KIAogICAvKiBhbGxvY2F0ZSBhIGNyZWQgc3RydWN0ICovCi0gIHJjID0gZ251dGxzX2NlcnRpZmljYXRlX2FsbG9jYXRlX2NyZWRlbnRpYWxzKCZjb25uLT5zc2xbc29ja2luZGV4XS5jcmVkKTsKKyAgcmMgPSBnbnV0bHNfY2VydGlmaWNhdGVfYWxsb2NhdGVfY3JlZGVudGlhbHMoJkJBQ0tFTkQtPmNyZWQpOwogICBpZihyYyAhPSBHTlVUTFNfRV9TVUNDRVNTKSB7CiAgICAgZmFpbGYoZGF0YSwgImdudXRsc19jZXJ0X2FsbF9jcmVkKCkgZmFpbGVkOiAlcyIsIGdudXRsc19zdHJlcnJvcihyYykpOwogICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKQEAgLTUzOSwxNSArNTQ3LDE0IEBACiAgICAgaW5mb2YoZGF0YSwgIlVzaW5nIFRMUy1TUlAgdXNlcm5hbWU6ICVzXG4iLCBTU0xfU0VUX09QVElPTih1c2VybmFtZSkpOwogCiAgICAgcmMgPSBnbnV0bHNfc3JwX2FsbG9jYXRlX2NsaWVudF9jcmVkZW50aWFscygKLSAgICAgICAgICAgJmNvbm4tPnNzbFtzb2NraW5kZXhdLnNycF9jbGllbnRfY3JlZCk7CisgICAgICAgICAgICZCQUNLRU5ELT5zcnBfY2xpZW50X2NyZWQpOwogICAgIGlmKHJjICE9IEdOVVRMU19FX1NVQ0NFU1MpIHsKICAgICAgIGZhaWxmKGRhdGEsICJnbnV0bHNfc3JwX2FsbG9jYXRlX2NsaWVudF9jcmVkKCkgZmFpbGVkOiAlcyIsCiAgICAgICAgICAgICBnbnV0bHNfc3RyZXJyb3IocmMpKTsKICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICAgIH0KIAotICAgIHJjID0gZ251dGxzX3NycF9zZXRfY2xpZW50X2NyZWRlbnRpYWxzKGNvbm4tPnNzbFtzb2NraW5kZXhdLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNycF9jbGllbnRfY3JlZCwKKyAgICByYyA9IGdudXRsc19zcnBfc2V0X2NsaWVudF9jcmVkZW50aWFscyhCQUNLRU5ELT5zcnBfY2xpZW50X2NyZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1NFVF9PUFRJT04odXNlcm5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9TRVRfT1BUSU9OKHBhc3N3b3JkKSk7CiAgICAgaWYocmMgIT0gR05VVExTX0VfU1VDQ0VTUykgewpAQCAtNTYwLDEwICs1NjcsMTAgQEAKIAogICBpZihTU0xfQ09OTl9DT05GSUcoQ0FmaWxlKSkgewogICAgIC8qIHNldCB0aGUgdHJ1c3RlZCBDQSBjZXJ0IGJ1bmRsZSBmaWxlICovCi0gICAgZ251dGxzX2NlcnRpZmljYXRlX3NldF92ZXJpZnlfZmxhZ3MoY29ubi0+c3NsW3NvY2tpbmRleF0uY3JlZCwKKyAgICBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3ZlcmlmeV9mbGFncyhCQUNLRU5ELT5jcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdOVVRMU19WRVJJRllfQUxMT1dfWDUwOV9WMV9DQV9DUlQpOwogCi0gICAgcmMgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfdHJ1c3RfZmlsZShjb25uLT5zc2xbc29ja2luZGV4XS5jcmVkLAorICAgIHJjID0gZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X3RydXN0X2ZpbGUoQkFDS0VORC0+Y3JlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9DT05OX0NPTkZJRyhDQWZpbGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR05VVExTX1g1MDlfRk1UX1BFTSk7CiAgICAgaWYocmMgPCAwKSB7CkBAIC01ODAsNyArNTg3LDcgQEAKICNpZmRlZiBIQVNfQ0FQQVRICiAgIGlmKFNTTF9DT05OX0NPTkZJRyhDQXBhdGgpKSB7CiAgICAgLyogc2V0IHRoZSB0cnVzdGVkIENBIGNlcnQgZGlyZWN0b3J5ICovCi0gICAgcmMgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfdHJ1c3RfZGlyKGNvbm4tPnNzbFtzb2NraW5kZXhdLmNyZWQsCisgICAgcmMgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfdHJ1c3RfZGlyKEJBQ0tFTkQtPmNyZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9DT05OX0NPTkZJRyhDQXBhdGgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTlVUTFNfWDUwOV9GTVRfUEVNKTsKICAgICBpZihyYyA8IDApIHsKQEAgLTU5OSwxMyArNjA2LDEzIEBACiAgIC8qIHVzZSBzeXN0ZW0gY2EgY2VydGlmaWNhdGUgc3RvcmUgYXMgZmFsbGJhY2sgKi8KICAgaWYoU1NMX0NPTk5fQ09ORklHKHZlcmlmeXBlZXIpICYmCiAgICAgICEoU1NMX0NPTk5fQ09ORklHKENBZmlsZSkgfHwgU1NMX0NPTk5fQ09ORklHKENBcGF0aCkpKSB7Ci0gICAgZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X3N5c3RlbV90cnVzdChjb25uLT5zc2xbc29ja2luZGV4XS5jcmVkKTsKKyAgICBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfc3lzdGVtX3RydXN0KEJBQ0tFTkQtPmNyZWQpOwogICB9CiAjZW5kaWYKIAogICBpZihTU0xfU0VUX09QVElPTihDUkxmaWxlKSkgewogICAgIC8qIHNldCB0aGUgQ1JMIGxpc3QgZmlsZSAqLwotICAgIHJjID0gZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X2NybF9maWxlKGNvbm4tPnNzbFtzb2NraW5kZXhdLmNyZWQsCisgICAgcmMgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfY3JsX2ZpbGUoQkFDS0VORC0+Y3JlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfU0VUX09QVElPTihDUkxmaWxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTlVUTFNfWDUwOV9GTVRfUEVNKTsKICAgICBpZihyYyA8IDApIHsKQEAgLTYyNiwxNCArNjMzLDE0IEBACiAgIGluaXRfZmxhZ3MgfD0gR05VVExTX05PX1RJQ0tFVFM7CiAjZW5kaWYKIAotICByYyA9IGdudXRsc19pbml0KCZjb25uLT5zc2xbc29ja2luZGV4XS5zZXNzaW9uLCBpbml0X2ZsYWdzKTsKKyAgcmMgPSBnbnV0bHNfaW5pdCgmQkFDS0VORC0+c2Vzc2lvbiwgaW5pdF9mbGFncyk7CiAgIGlmKHJjICE9IEdOVVRMU19FX1NVQ0NFU1MpIHsKICAgICBmYWlsZihkYXRhLCAiZ251dGxzX2luaXQoKSBmYWlsZWQ6ICVkIiwgcmMpOwogICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKICAgfQogCiAgIC8qIGNvbnZlbmllbnQgYXNzaWduICovCi0gIHNlc3Npb24gPSBjb25uLT5zc2xbc29ja2luZGV4XS5zZXNzaW9uOworICBzZXNzaW9uID0gQkFDS0VORC0+c2Vzc2lvbjsKIAogICBpZigoMCA9PSBDdXJsX2luZXRfcHRvbihBRl9JTkVULCBob3N0bmFtZSwgJmFkZHIpKSAmJgogI2lmZGVmIEVOQUJMRV9JUFY2CkBAIC03NjMsNyArNzcwLDggQEAKICAgICBnbnV0bHNfZGF0dW1fdCBwcm90b2NvbHNbMl07CiAKICNpZmRlZiBVU0VfTkdIVFRQMgotICAgIGlmKGRhdGEtPnNldC5odHRwdmVyc2lvbiA+PSBDVVJMX0hUVFBfVkVSU0lPTl8yKSB7CisgICAgaWYoZGF0YS0+c2V0Lmh0dHB2ZXJzaW9uID49IENVUkxfSFRUUF9WRVJTSU9OXzIgJiYKKyAgICAgICAoIVNTTF9JU19QUk9YWSgpIHx8ICFjb25uLT5iaXRzLnR1bm5lbF9wcm94eSkpIHsKICAgICAgIHByb3RvY29sc1tjdXJdLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKU5HSFRUUDJfUFJPVE9fVkVSU0lPTl9JRDsKICAgICAgIHByb3RvY29sc1tjdXJdLnNpemUgPSBOR0hUVFAyX1BST1RPX1ZFUlNJT05fSURfTEVOOwogICAgICAgY3VyKys7CkBAIC03ODksNyArNzk3LDcgQEAKICAgICAgICAgR05VVExTX1BLQ1NfVVNFX1BCRVMyX0FFU18xMjggfCBHTlVUTFNfUEtDU19VU0VfUEJFUzJfQUVTXzE5MiB8CiAgICAgICAgIEdOVVRMU19QS0NTX1VTRV9QQkVTMl9BRVNfMjU2OwogICAgICAgcmMgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfa2V5X2ZpbGUyKAotICAgICAgICAgICBjb25uLT5zc2xbc29ja2luZGV4XS5jcmVkLAorICAgICAgICAgICBCQUNLRU5ELT5jcmVkLAogICAgICAgICAgICBTU0xfU0VUX09QVElPTihjZXJ0KSwKICAgICAgICAgICAgU1NMX1NFVF9PUFRJT04oa2V5KSA/CiAgICAgICAgICAgIFNTTF9TRVRfT1BUSU9OKGtleSkgOiBTU0xfU0VUX09QVElPTihjZXJ0KSwKQEAgLTgwOSw3ICs4MTcsNyBAQAogICAgIH0KICAgICBlbHNlIHsKICAgICAgIGlmKGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV9rZXlfZmlsZSgKLSAgICAgICAgICAgY29ubi0+c3NsW3NvY2tpbmRleF0uY3JlZCwKKyAgICAgICAgICAgQkFDS0VORC0+Y3JlZCwKICAgICAgICAgICAgU1NMX1NFVF9PUFRJT04oY2VydCksCiAgICAgICAgICAgIFNTTF9TRVRfT1BUSU9OKGtleSkgPwogICAgICAgICAgICBTU0xfU0VUX09QVElPTihrZXkpIDogU1NMX1NFVF9PUFRJT04oY2VydCksCkBAIC04MjUsNyArODMzLDcgQEAKICAgLyogcHV0IHRoZSBjcmVkZW50aWFscyB0byB0aGUgY3VycmVudCBzZXNzaW9uICovCiAgIGlmKFNTTF9TRVRfT1BUSU9OKGF1dGh0eXBlKSA9PSBDVVJMX1RMU0FVVEhfU1JQKSB7CiAgICAgcmMgPSBnbnV0bHNfY3JlZGVudGlhbHNfc2V0KHNlc3Npb24sIEdOVVRMU19DUkRfU1JQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLT5zc2xbc29ja2luZGV4XS5zcnBfY2xpZW50X2NyZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUNLRU5ELT5zcnBfY2xpZW50X2NyZWQpOwogICAgIGlmKHJjICE9IEdOVVRMU19FX1NVQ0NFU1MpIHsKICAgICAgIGZhaWxmKGRhdGEsICJnbnV0bHNfY3JlZGVudGlhbHNfc2V0KCkgZmFpbGVkOiAlcyIsIGdudXRsc19zdHJlcnJvcihyYykpOwogICAgICAgcmV0dXJuIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SOwpAQCAtODM1LDcgKzg0Myw3IEBACiAjZW5kaWYKICAgewogICAgIHJjID0gZ251dGxzX2NyZWRlbnRpYWxzX3NldChzZXNzaW9uLCBHTlVUTFNfQ1JEX0NFUlRJRklDQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLT5zc2xbc29ja2luZGV4XS5jcmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFDS0VORC0+Y3JlZCk7CiAgICAgaWYocmMgIT0gR05VVExTX0VfU1VDQ0VTUykgewogICAgICAgZmFpbGYoZGF0YSwgImdudXRsc19jcmVkZW50aWFsc19zZXQoKSBmYWlsZWQ6ICVzIiwgZ251dGxzX3N0cmVycm9yKHJjKSk7CiAgICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CkBAIC04NDMsMTMgKzg1MSwxMyBAQAogICB9CiAKICAgaWYoY29ubi0+cHJveHlfc3NsW3NvY2tpbmRleF0udXNlKSB7Ci0gICAgdHJhbnNwb3J0X3B0ciA9IGNvbm4tPnByb3h5X3NzbFtzb2NraW5kZXhdLnNlc3Npb247CisgICAgdHJhbnNwb3J0X3B0ciA9IGNvbm4tPnByb3h5X3NzbFtzb2NraW5kZXhdLmJhY2tlbmQtPnNlc3Npb247CiAgICAgZ251dGxzX3RyYW5zcG9ydF9wdXNoID0gQ3VybF9ndGxzX3B1c2hfc3NsOwogICAgIGdudXRsc190cmFuc3BvcnRfcHVsbCA9IEN1cmxfZ3Rsc19wdWxsX3NzbDsKICAgfQogICBlbHNlIHsKICAgICAvKiBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBzb2NrZXQgKi8KLSAgICB0cmFuc3BvcnRfcHRyID0gR05VVExTX0lOVF9UT19QT0lOVEVSX0NBU1QoY29ubi0+c29ja1tzb2NraW5kZXhdKTsKKyAgICB0cmFuc3BvcnRfcHRyID0gR05VVExTX1NPQ0tFVF9UT19QT0lOVEVSX0NBU1QoY29ubi0+c29ja1tzb2NraW5kZXhdKTsKICAgICBnbnV0bHNfdHJhbnNwb3J0X3B1c2ggPSBDdXJsX2d0bHNfcHVzaDsKICAgICBnbnV0bHNfdHJhbnNwb3J0X3B1bGwgPSBDdXJsX2d0bHNfcHVsbDsKICAgfQpAQCAtOTY4LDcgKzk3Niw4IEBACiAgIHRpbWVfdCBjZXJ0Y2xvY2s7CiAgIGNvbnN0IGNoYXIgKnB0cjsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7Ci0gIGdudXRsc19zZXNzaW9uX3Qgc2Vzc2lvbiA9IGNvbm4tPnNzbFtzb2NraW5kZXhdLnNlc3Npb247CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOworICBnbnV0bHNfc2Vzc2lvbl90IHNlc3Npb24gPSBCQUNLRU5ELT5zZXNzaW9uOwogICBpbnQgcmM7CiAjaWZkZWYgSEFTX0FMUE4KICAgZ251dGxzX2RhdHVtX3QgcHJvdG87CkBAIC0xMTk5LDcgKzEyMDgsNyBAQAogICAgICAgICAgIFNTTF9TRVRfT1BUSU9OKGlzc3VlcmNlcnQpP1NTTF9TRVRfT1BUSU9OKGlzc3VlcmNlcnQpOiJub25lIik7CiAgIH0KIAotICBzaXplPXNpemVvZihjZXJ0YnVmKTsKKyAgc2l6ZSA9IHNpemVvZihjZXJ0YnVmKTsKICAgcmMgPSBnbnV0bHNfeDUwOV9jcnRfZ2V0X2RuX2J5X29pZCh4NTA5X2NlcnQsIEdOVVRMU19PSURfWDUyMF9DT01NT05fTkFNRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiB0aGUgZmlyc3QgYW5kIG9ubHkgb25lICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCkBAIC0xMjM5LDcgKzEyNDgsNyBAQAogI2VuZGlmCiAKICAgICBpZihhZGRybGVuKSB7Ci0gICAgICBmb3IoaT0wOyA7IGkrKykgeworICAgICAgZm9yKGkgPSAwOyA7IGkrKykgewogICAgICAgICBjZXJ0YWRkcmxlbiA9IHNpemVvZihjZXJ0YWRkcik7CiAgICAgICAgIHJldCA9IGdudXRsc194NTA5X2NydF9nZXRfc3ViamVjdF9hbHRfbmFtZSh4NTA5X2NlcnQsIGksIGNlcnRhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNlcnRhZGRybGVuLCBOVUxMKTsKQEAgLTE0NzIsNyArMTQ4MSw3IEBACiAgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwogCiAgIC8qIEluaXRpYXRlIHRoZSBjb25uZWN0aW9uLCBpZiBub3QgYWxyZWFkeSBkb25lICovCi0gIGlmKHNzbF9jb25uZWN0XzE9PWNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUpIHsKKyAgaWYoc3NsX2Nvbm5lY3RfMSA9PSBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlKSB7CiAgICAgcmMgPSBndGxzX2Nvbm5lY3Rfc3RlcDEoY29ubiwgc29ja2luZGV4KTsKICAgICBpZihyYykKICAgICAgIHJldHVybiByYzsKQEAgLTE0ODQsMjkgKzE0OTMsMjQgQEAKICAgICByZXR1cm4gcmM7CiAKICAgLyogRmluaXNoIGNvbm5lY3Rpbmcgb25jZSB0aGUgaGFuZHNoYWtlIGlzIGRvbmUgKi8KLSAgaWYoc3NsX2Nvbm5lY3RfMT09Y29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSkgeworICBpZihzc2xfY29ubmVjdF8xID09IGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUpIHsKICAgICByYyA9IGd0bHNfY29ubmVjdF9zdGVwMyhjb25uLCBzb2NraW5kZXgpOwogICAgIGlmKHJjKQogICAgICAgcmV0dXJuIHJjOwogICB9CiAKLSAgKmRvbmUgPSBzc2xfY29ubmVjdF8xPT1jb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlOworICAqZG9uZSA9IHNzbF9jb25uZWN0XzEgPT0gY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZTsKIAogICByZXR1cm4gQ1VSTEVfT0s7CiB9CiAKLUNVUkxjb2RlCi1DdXJsX2d0bHNfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqZG9uZSkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX2d0bHNfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwgYm9vbCAqZG9uZSkKIHsKICAgcmV0dXJuIGd0bHNfY29ubmVjdF9jb21tb24oY29ubiwgc29ja2luZGV4LCBUUlVFLCBkb25lKTsKIH0KIAotQ1VSTGNvZGUKLUN1cmxfZ3Rsc19jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgpCi0KK3N0YXRpYyBDVVJMY29kZSBDdXJsX2d0bHNfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CiAgIENVUkxjb2RlIHJlc3VsdDsKICAgYm9vbCBkb25lID0gRkFMU0U7CkBAIC0xNTIwLDE1ICsxNTI0LDE4IEBACiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIAotYm9vbCBDdXJsX2d0bHNfZGF0YV9wZW5kaW5nKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IGNvbm5pbmRleCkKK3N0YXRpYyBib29sIEN1cmxfZ3Rsc19kYXRhX3BlbmRpbmcoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29ubmluZGV4KQogeworICBjb25zdCBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbY29ubmluZGV4XTsKICAgYm9vbCByZXMgPSBGQUxTRTsKLSAgaWYoY29ubi0+c3NsW2Nvbm5pbmRleF0uc2Vzc2lvbiAmJgotICAgICAwICE9IGdudXRsc19yZWNvcmRfY2hlY2tfcGVuZGluZyhjb25uLT5zc2xbY29ubmluZGV4XS5zZXNzaW9uKSkKKyAgaWYoQkFDS0VORC0+c2Vzc2lvbiAmJgorICAgICAwICE9IGdudXRsc19yZWNvcmRfY2hlY2tfcGVuZGluZyhCQUNLRU5ELT5zZXNzaW9uKSkKICAgICByZXMgPSBUUlVFOwogCi0gIGlmKGNvbm4tPnByb3h5X3NzbFtjb25uaW5kZXhdLnNlc3Npb24gJiYKLSAgICAgMCAhPSBnbnV0bHNfcmVjb3JkX2NoZWNrX3BlbmRpbmcoY29ubi0+cHJveHlfc3NsW2Nvbm5pbmRleF0uc2Vzc2lvbikpCisgIGNvbm5zc2wgPSAmY29ubi0+cHJveHlfc3NsW2Nvbm5pbmRleF07CisgIGlmKEJBQ0tFTkQtPnNlc3Npb24gJiYKKyAgICAgMCAhPSBnbnV0bHNfcmVjb3JkX2NoZWNrX3BlbmRpbmcoQkFDS0VORC0+c2Vzc2lvbikpCiAgICAgcmVzID0gVFJVRTsKIAogICByZXR1cm4gcmVzOwpAQCAtMTU0MCw3ICsxNTQ3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxjb2RlICpjdXJsY29kZSkKIHsKLSAgc3NpemVfdCByYyA9IGdudXRsc19yZWNvcmRfc2VuZChjb25uLT5zc2xbc29ja2luZGV4XS5zZXNzaW9uLCBtZW0sIGxlbik7CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOworICBzc2l6ZV90IHJjID0gZ251dGxzX3JlY29yZF9zZW5kKEJBQ0tFTkQtPnNlc3Npb24sIG1lbSwgbGVuKTsKIAogICBpZihyYyA8IDApIHsKICAgICAqY3VybGNvZGUgPSAocmMgPT0gR05VVExTX0VfQUdBSU4pCkBAIC0xNTUzLDI2ICsxNTYxLDI2IEBACiAgIHJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQgY2xvc2Vfb25lKHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpzc2wpCitzdGF0aWMgdm9pZCBjbG9zZV9vbmUoc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wpCiB7Ci0gIGlmKHNzbC0+c2Vzc2lvbikgewotICAgIGdudXRsc19ieWUoc3NsLT5zZXNzaW9uLCBHTlVUTFNfU0hVVF9SRFdSKTsKLSAgICBnbnV0bHNfZGVpbml0KHNzbC0+c2Vzc2lvbik7Ci0gICAgc3NsLT5zZXNzaW9uID0gTlVMTDsKKyAgaWYoQkFDS0VORC0+c2Vzc2lvbikgeworICAgIGdudXRsc19ieWUoQkFDS0VORC0+c2Vzc2lvbiwgR05VVExTX1NIVVRfUkRXUik7CisgICAgZ251dGxzX2RlaW5pdChCQUNLRU5ELT5zZXNzaW9uKTsKKyAgICBCQUNLRU5ELT5zZXNzaW9uID0gTlVMTDsKICAgfQotICBpZihzc2wtPmNyZWQpIHsKLSAgICBnbnV0bHNfY2VydGlmaWNhdGVfZnJlZV9jcmVkZW50aWFscyhzc2wtPmNyZWQpOwotICAgIHNzbC0+Y3JlZCA9IE5VTEw7CisgIGlmKEJBQ0tFTkQtPmNyZWQpIHsKKyAgICBnbnV0bHNfY2VydGlmaWNhdGVfZnJlZV9jcmVkZW50aWFscyhCQUNLRU5ELT5jcmVkKTsKKyAgICBCQUNLRU5ELT5jcmVkID0gTlVMTDsKICAgfQogI2lmZGVmIFVTRV9UTFNfU1JQCi0gIGlmKHNzbC0+c3JwX2NsaWVudF9jcmVkKSB7Ci0gICAgZ251dGxzX3NycF9mcmVlX2NsaWVudF9jcmVkZW50aWFscyhzc2wtPnNycF9jbGllbnRfY3JlZCk7Ci0gICAgc3NsLT5zcnBfY2xpZW50X2NyZWQgPSBOVUxMOworICBpZihCQUNLRU5ELT5zcnBfY2xpZW50X2NyZWQpIHsKKyAgICBnbnV0bHNfc3JwX2ZyZWVfY2xpZW50X2NyZWRlbnRpYWxzKEJBQ0tFTkQtPnNycF9jbGllbnRfY3JlZCk7CisgICAgQkFDS0VORC0+c3JwX2NsaWVudF9jcmVkID0gTlVMTDsKICAgfQogI2VuZGlmCiB9CiAKLXZvaWQgQ3VybF9ndGxzX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKK3N0YXRpYyB2b2lkIEN1cmxfZ3Rsc19jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CiAgIGNsb3NlX29uZSgmY29ubi0+c3NsW3NvY2tpbmRleF0pOwogICBjbG9zZV9vbmUoJmNvbm4tPnByb3h5X3NzbFtzb2NraW5kZXhdKTsKQEAgLTE1ODIsOCArMTU5MCw5IEBACiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzaHV0IGRvd24gdGhlIFNTTCBsYXllciBidXQga2VlcCB0aGUKICAqIHNvY2tldCBvcGVuIChDQ0MgLSBDbGVhciBDb21tYW5kIENoYW5uZWwpCiAgKi8KLWludCBDdXJsX2d0bHNfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQorc3RhdGljIGludCBDdXJsX2d0bHNfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQogeworICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKICAgc3NpemVfdCByZXN1bHQ7CiAgIGludCByZXR2YWwgPSAwOwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKQEAgLTE1OTYsMTYgKzE2MDUsMTYgQEAKICAgICAgd2UgZG8gbm90IHNlbmQgb25lLiBMZXQncyBob3BlIG90aGVyIHNlcnZlcnMgZG8gdGhlIHNhbWUuLi4gKi8KIAogICBpZihkYXRhLT5zZXQuZnRwX2NjYyA9PSBDVVJMRlRQU1NMX0NDQ19BQ1RJVkUpCi0gICAgICBnbnV0bHNfYnllKGNvbm4tPnNzbFtzb2NraW5kZXhdLnNlc3Npb24sIEdOVVRMU19TSFVUX1dSKTsKKyAgICAgIGdudXRsc19ieWUoQkFDS0VORC0+c2Vzc2lvbiwgR05VVExTX1NIVVRfV1IpOwogCi0gIGlmKGNvbm4tPnNzbFtzb2NraW5kZXhdLnNlc3Npb24pIHsKKyAgaWYoQkFDS0VORC0+c2Vzc2lvbikgewogICAgIHdoaWxlKCFkb25lKSB7CiAgICAgICBpbnQgd2hhdCA9IFNPQ0tFVF9SRUFEQUJMRShjb25uLT5zb2NrW3NvY2tpbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfU0hVVERPV05fVElNRU9VVCk7CiAgICAgICBpZih3aGF0ID4gMCkgewogICAgICAgICAvKiBTb21ldGhpbmcgdG8gcmVhZCwgbGV0J3MgZG8gaXQgYW5kIGhvcGUgdGhhdCBpdCBpcyB0aGUgY2xvc2UKICAgICAgICAgICAgbm90aWZ5IGFsZXJ0IGZyb20gdGhlIHNlcnZlciAqLwotICAgICAgICByZXN1bHQgPSBnbnV0bHNfcmVjb3JkX3JlY3YoY29ubi0+c3NsW3NvY2tpbmRleF0uc2Vzc2lvbiwKKyAgICAgICAgcmVzdWx0ID0gZ251dGxzX3JlY29yZF9yZWN2KEJBQ0tFTkQtPnNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIHNpemVvZihidWYpKTsKICAgICAgICAgc3dpdGNoKHJlc3VsdCkgewogICAgICAgICBjYXNlIDA6CkBAIC0xNjM2LDE4ICsxNjQ1LDE4IEBACiAgICAgICAgIGRvbmUgPSAxOwogICAgICAgfQogICAgIH0KLSAgICBnbnV0bHNfZGVpbml0KGNvbm4tPnNzbFtzb2NraW5kZXhdLnNlc3Npb24pOworICAgIGdudXRsc19kZWluaXQoQkFDS0VORC0+c2Vzc2lvbik7CiAgIH0KLSAgZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfY3JlZGVudGlhbHMoY29ubi0+c3NsW3NvY2tpbmRleF0uY3JlZCk7CisgIGdudXRsc19jZXJ0aWZpY2F0ZV9mcmVlX2NyZWRlbnRpYWxzKEJBQ0tFTkQtPmNyZWQpOwogCiAjaWZkZWYgVVNFX1RMU19TUlAKICAgaWYoU1NMX1NFVF9PUFRJT04oYXV0aHR5cGUpID09IENVUkxfVExTQVVUSF9TUlAKICAgICAgJiYgU1NMX1NFVF9PUFRJT04odXNlcm5hbWUpICE9IE5VTEwpCi0gICAgZ251dGxzX3NycF9mcmVlX2NsaWVudF9jcmVkZW50aWFscyhjb25uLT5zc2xbc29ja2luZGV4XS5zcnBfY2xpZW50X2NyZWQpOworICAgIGdudXRsc19zcnBfZnJlZV9jbGllbnRfY3JlZGVudGlhbHMoQkFDS0VORC0+c3JwX2NsaWVudF9jcmVkKTsKICNlbmRpZgogCi0gIGNvbm4tPnNzbFtzb2NraW5kZXhdLmNyZWQgPSBOVUxMOwotICBjb25uLT5zc2xbc29ja2luZGV4XS5zZXNzaW9uID0gTlVMTDsKKyAgQkFDS0VORC0+Y3JlZCA9IE5VTEw7CisgIEJBQ0tFTkQtPnNlc3Npb24gPSBOVUxMOwogCiAgIHJldHVybiByZXR2YWw7CiB9CkBAIC0xNjU4LDkgKzE2NjcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyc2l6ZSwgICAgICAgIC8qIG1heCBhbW91bnQgdG8gcmVhZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxjb2RlICpjdXJsY29kZSkKIHsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW251bV07CiAgIHNzaXplX3QgcmV0OwogCi0gIHJldCA9IGdudXRsc19yZWNvcmRfcmVjdihjb25uLT5zc2xbbnVtXS5zZXNzaW9uLCBidWYsIGJ1ZmZlcnNpemUpOworICByZXQgPSBnbnV0bHNfcmVjb3JkX3JlY3YoQkFDS0VORC0+c2Vzc2lvbiwgYnVmLCBidWZmZXJzaXplKTsKICAgaWYoKHJldCA9PSBHTlVUTFNfRV9BR0FJTikgfHwgKHJldCA9PSBHTlVUTFNfRV9JTlRFUlJVUFRFRCkpIHsKICAgICAqY3VybGNvZGUgPSBDVVJMRV9BR0FJTjsKICAgICByZXR1cm4gLTE7CkBAIC0xNjgwLDYgKzE2OTAsNyBAQAogCiAgIGlmKHJldCA8IDApIHsKICAgICBmYWlsZihjb25uLT5kYXRhLCAiR251VExTIHJlY3YgZXJyb3IgKCVkKTogJXMiLAorCiAgICAgICAgICAgKGludClyZXQsIGdudXRsc19zdHJlcnJvcigoaW50KXJldCkpOwogICAgICpjdXJsY29kZSA9IENVUkxFX1JFQ1ZfRVJST1I7CiAgICAgcmV0dXJuIC0xOwpAQCAtMTY4OCwxMiArMTY5OSwxMiBAQAogICByZXR1cm4gcmV0OwogfQogCi12b2lkIEN1cmxfZ3Rsc19zZXNzaW9uX2ZyZWUodm9pZCAqcHRyKQorc3RhdGljIHZvaWQgQ3VybF9ndGxzX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpCiB7CiAgIGZyZWUocHRyKTsKIH0KIAotc2l6ZV90IEN1cmxfZ3Rsc192ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCitzdGF0aWMgc2l6ZV90IEN1cmxfZ3Rsc192ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7CiAgIHJldHVybiBzbnByaW50ZihidWZmZXIsIHNpemUsICJHbnVUTFMvJXMiLCBnbnV0bHNfY2hlY2tfdmVyc2lvbihOVUxMKSk7CiB9CkBAIC0xNzIzLDkgKzE3MzQsOCBAQAogI2VuZGlmCiAKIC8qIGRhdGEgbWlnaHQgYmUgTlVMTCEgKi8KLUNVUkxjb2RlIEN1cmxfZ3Rsc19yYW5kb20oc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW50cm9weSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX2d0bHNfcmFuZG9tKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbnRyb3B5LCBzaXplX3QgbGVuZ3RoKQogewogI2lmIGRlZmluZWQoVVNFX0dOVVRMU19ORVRUTEUpCiAgIGludCByYzsKQEAgLTE3NDAsMTAgKzE3NTAsMTAgQEAKICAgcmV0dXJuIENVUkxFX09LOwogfQogCi12b2lkIEN1cmxfZ3Rsc19tZDVzdW0odW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0bXBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbWQ1c3VtLCAvKiBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWQ1bGVuKQorc3RhdGljIENVUkxjb2RlIEN1cmxfZ3Rsc19tZDVzdW0odW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm1kNXN1bSwgLyogb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWQ1bGVuKQogewogI2lmIGRlZmluZWQoVVNFX0dOVVRMU19ORVRUTEUpCiAgIHN0cnVjdCBtZDVfY3R4IE1ENXB3OwpAQCAtMTc1NywxMiArMTc2NywxMyBAQAogICBtZW1jcHkobWQ1c3VtLCBnY3J5X21kX3JlYWQoTUQ1cHcsIDApLCBtZDVsZW4pOwogICBnY3J5X21kX2Nsb3NlKE1ENXB3KTsKICNlbmRpZgorICByZXR1cm4gQ1VSTEVfT0s7CiB9CiAKLXZvaWQgQ3VybF9ndGxzX3NoYTI1NnN1bShjb25zdCB1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzaGEyNTZzdW0sIC8qIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaGEyNTZsZW4pCitzdGF0aWMgdm9pZCBDdXJsX2d0bHNfc2hhMjU2c3VtKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRtcCwgLyogaW5wdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc2hhMjU2c3VtLCAvKiBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNoYTI1NmxlbikKIHsKICNpZiBkZWZpbmVkKFVTRV9HTlVUTFNfTkVUVExFKQogICBzdHJ1Y3Qgc2hhMjU2X2N0eCBTSEEyNTZwdzsKQEAgLTE3NzgsNyArMTc4OSw3IEBACiAjZW5kaWYKIH0KIAotYm9vbCBDdXJsX2d0bHNfY2VydF9zdGF0dXNfcmVxdWVzdCh2b2lkKQorc3RhdGljIGJvb2wgQ3VybF9ndGxzX2NlcnRfc3RhdHVzX3JlcXVlc3Qodm9pZCkKIHsKICNpZmRlZiBIQVNfT0NTUAogICByZXR1cm4gVFJVRTsKQEAgLTE3ODcsNCArMTc5OCw0NCBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyB2b2lkICpDdXJsX2d0bHNfZ2V0X2ludGVybmFscyhzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMSU5GTyBpbmZvIFVOVVNFRF9QQVJBTSkKK3sKKyAgKHZvaWQpaW5mbzsKKyAgcmV0dXJuIEJBQ0tFTkQtPnNlc3Npb247Cit9CisKK2NvbnN0IHN0cnVjdCBDdXJsX3NzbCBDdXJsX3NzbF9nbnV0bHMgPSB7CisgIHsgQ1VSTFNTTEJBQ0tFTkRfR05VVExTLCAiZ251dGxzIiB9LCAvKiBpbmZvICovCisKKyAgMSwgLyogaGF2ZV9jYV9wYXRoICovCisgIDEsIC8qIGhhdmVfY2VydGluZm8gKi8KKyAgMSwgLyogaGF2ZV9waW5uZWRwdWJrZXkgKi8KKyAgMCwgLyogaGF2ZV9zc2xfY3R4ICovCisgIDEsIC8qIHN1cHBvcnRfaHR0cHNfcHJveHkgKi8KKworICBzaXplb2Yoc3RydWN0IHNzbF9iYWNrZW5kX2RhdGEpLAorCisgIEN1cmxfZ3Rsc19pbml0LCAgICAgICAgICAgICAgICAvKiBpbml0ICovCisgIEN1cmxfZ3Rsc19jbGVhbnVwLCAgICAgICAgICAgICAvKiBjbGVhbnVwICovCisgIEN1cmxfZ3Rsc192ZXJzaW9uLCAgICAgICAgICAgICAvKiB2ZXJzaW9uICovCisgIEN1cmxfbm9uZV9jaGVja19jeG4sICAgICAgICAgICAvKiBjaGVja19jeG4gKi8KKyAgQ3VybF9ndGxzX3NodXRkb3duLCAgICAgICAgICAgIC8qIHNodXRkb3duICovCisgIEN1cmxfZ3Rsc19kYXRhX3BlbmRpbmcsICAgICAgICAvKiBkYXRhX3BlbmRpbmcgKi8KKyAgQ3VybF9ndGxzX3JhbmRvbSwgICAgICAgICAgICAgIC8qIHJhbmRvbSAqLworICBDdXJsX2d0bHNfY2VydF9zdGF0dXNfcmVxdWVzdCwgLyogY2VydF9zdGF0dXNfcmVxdWVzdCAqLworICBDdXJsX2d0bHNfY29ubmVjdCwgICAgICAgICAgICAgLyogY29ubmVjdCAqLworICBDdXJsX2d0bHNfY29ubmVjdF9ub25ibG9ja2luZywgLyogY29ubmVjdF9ub25ibG9ja2luZyAqLworICBDdXJsX2d0bHNfZ2V0X2ludGVybmFscywgICAgICAgLyogZ2V0X2ludGVybmFscyAqLworICBDdXJsX2d0bHNfY2xvc2UsICAgICAgICAgICAgICAgLyogY2xvc2UgKi8KKyAgQ3VybF9ub25lX2Nsb3NlX2FsbCwgICAgICAgICAgIC8qIGNsb3NlX2FsbCAqLworICBDdXJsX2d0bHNfc2Vzc2lvbl9mcmVlLCAgICAgICAgLyogc2Vzc2lvbl9mcmVlICovCisgIEN1cmxfbm9uZV9zZXRfZW5naW5lLCAgICAgICAgICAvKiBzZXRfZW5naW5lICovCisgIEN1cmxfbm9uZV9zZXRfZW5naW5lX2RlZmF1bHQsICAvKiBzZXRfZW5naW5lX2RlZmF1bHQgKi8KKyAgQ3VybF9ub25lX2VuZ2luZXNfbGlzdCwgICAgICAgIC8qIGVuZ2luZXNfbGlzdCAqLworICBDdXJsX25vbmVfZmFsc2Vfc3RhcnQsICAgICAgICAgLyogZmFsc2Vfc3RhcnQgKi8KKyAgQ3VybF9ndGxzX21kNXN1bSwgICAgICAgICAgICAgIC8qIG1kNXN1bSAqLworICBDdXJsX2d0bHNfc2hhMjU2c3VtICAgICAgICAgICAgLyogc2hhMjU2c3VtICovCit9OworCiAjZW5kaWYgLyogVVNFX0dOVVRMUyAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9ndGxzLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2d0bHMuaAppbmRleCA0NjJjMDQ4Li43ODBmYzEwIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2d0bHMuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2d0bHMuaApAQCAtMjgsNjkgKzI4LDcgQEAKIAogI2luY2x1ZGUgInVybGRhdGEuaCIKIAotaW50IEN1cmxfZ3Rsc19pbml0KHZvaWQpOwotaW50IEN1cmxfZ3Rsc19jbGVhbnVwKHZvaWQpOwotQ1VSTGNvZGUgQ3VybF9ndGxzX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLUNVUkxjb2RlIEN1cmxfZ3Rsc19jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpkb25lKTsKLWJvb2wgQ3VybF9ndGxzX2RhdGFfcGVuZGluZyhjb25zdCBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5pbmRleCk7Ci0KLSAvKiBjbG9zZSBhIFNTTCBjb25uZWN0aW9uICovCi12b2lkIEN1cmxfZ3Rsc19jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotCi12b2lkIEN1cmxfZ3Rsc19zZXNzaW9uX2ZyZWUodm9pZCAqcHRyKTsKLXNpemVfdCBDdXJsX2d0bHNfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKTsKLWludCBDdXJsX2d0bHNfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLUNVUkxjb2RlIEN1cmxfZ3Rsc19yYW5kb20oc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW50cm9weSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCk7Ci12b2lkIEN1cmxfZ3Rsc19tZDVzdW0odW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0bXBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbWQ1c3VtLCAvKiBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWQ1bGVuKTsKLXZvaWQgQ3VybF9ndGxzX3NoYTI1NnN1bShjb25zdCB1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzaGEyNTZzdW0sIC8qIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaGEyNTZsZW4pOwotCi1ib29sIEN1cmxfZ3Rsc19jZXJ0X3N0YXR1c19yZXF1ZXN0KHZvaWQpOwotCi0vKiBTdXBwb3J0IEhUVFBTLXByb3h5ICovCi0jZGVmaW5lIEhUVFBTX1BST1hZX1NVUFBPUlQgMQotCi0vKiBTZXQgdGhlIEFQSSBiYWNrZW5kIGRlZmluaXRpb24gdG8gR251VExTICovCi0jZGVmaW5lIENVUkxfU1NMX0JBQ0tFTkQgQ1VSTFNTTEJBQ0tFTkRfR05VVExTCi0KLS8qIHRoaXMgYmFja2VuZCBzdXBwb3J0cyB0aGUgQ0FQQVRIIG9wdGlvbiAqLwotI2RlZmluZSBoYXZlX2N1cmxzc2xfY2FfcGF0aCAxCi0KLS8qIHRoaXMgYmFja2VuZCBzdXBwb3J0cyBDVVJMT1BUX0NFUlRJTkZPICovCi0jZGVmaW5lIGhhdmVfY3VybHNzbF9jZXJ0aW5mbyAxCi0KLS8qIHRoaXMgYmFja2VuZCBzdXBwb3J0cyBDVVJMT1BUX1BJTk5FRFBVQkxJQ0tFWSAqLwotI2RlZmluZSBoYXZlX2N1cmxzc2xfcGlubmVkcHVia2V5IDEKLQotLyogQVBJIHNldHVwIGZvciBHbnVUTFMgKi8KLSNkZWZpbmUgY3VybHNzbF9pbml0IEN1cmxfZ3Rsc19pbml0Ci0jZGVmaW5lIGN1cmxzc2xfY2xlYW51cCBDdXJsX2d0bHNfY2xlYW51cAotI2RlZmluZSBjdXJsc3NsX2Nvbm5lY3QgQ3VybF9ndGxzX2Nvbm5lY3QKLSNkZWZpbmUgY3VybHNzbF9jb25uZWN0X25vbmJsb2NraW5nIEN1cmxfZ3Rsc19jb25uZWN0X25vbmJsb2NraW5nCi0jZGVmaW5lIGN1cmxzc2xfc2Vzc2lvbl9mcmVlKHgpICBDdXJsX2d0bHNfc2Vzc2lvbl9mcmVlKHgpCi0jZGVmaW5lIGN1cmxzc2xfY2xvc2VfYWxsKHgpICgodm9pZCl4KQotI2RlZmluZSBjdXJsc3NsX2Nsb3NlIEN1cmxfZ3Rsc19jbG9zZQotI2RlZmluZSBjdXJsc3NsX3NodXRkb3duKHgseSkgQ3VybF9ndGxzX3NodXRkb3duKHgseSkKLSNkZWZpbmUgY3VybHNzbF9zZXRfZW5naW5lKHgseSkgKCh2b2lkKXgsICh2b2lkKXksIENVUkxFX05PVF9CVUlMVF9JTikKLSNkZWZpbmUgY3VybHNzbF9zZXRfZW5naW5lX2RlZmF1bHQoeCkgKCh2b2lkKXgsIENVUkxFX05PVF9CVUlMVF9JTikKLSNkZWZpbmUgY3VybHNzbF9lbmdpbmVzX2xpc3QoeCkgKCh2b2lkKXgsIChzdHJ1Y3QgY3VybF9zbGlzdCAqKU5VTEwpCi0jZGVmaW5lIGN1cmxzc2xfdmVyc2lvbiBDdXJsX2d0bHNfdmVyc2lvbgotI2RlZmluZSBjdXJsc3NsX2NoZWNrX2N4bih4KSAoKHZvaWQpeCwgLTEpCi0jZGVmaW5lIGN1cmxzc2xfZGF0YV9wZW5kaW5nKHgseSkgQ3VybF9ndGxzX2RhdGFfcGVuZGluZyh4LHkpCi0jZGVmaW5lIGN1cmxzc2xfcmFuZG9tKHgseSx6KSBDdXJsX2d0bHNfcmFuZG9tKHgseSx6KQotI2RlZmluZSBjdXJsc3NsX21kNXN1bShhLGIsYyxkKSBDdXJsX2d0bHNfbWQ1c3VtKGEsYixjLGQpCi0jZGVmaW5lIGN1cmxzc2xfc2hhMjU2c3VtKGEsYixjLGQpIEN1cmxfZ3Rsc19zaGEyNTZzdW0oYSxiLGMsZCkKLSNkZWZpbmUgY3VybHNzbF9jZXJ0X3N0YXR1c19yZXF1ZXN0KCkgQ3VybF9ndGxzX2NlcnRfc3RhdHVzX3JlcXVlc3QoKQorZXh0ZXJuIGNvbnN0IHN0cnVjdCBDdXJsX3NzbCBDdXJsX3NzbF9nbnV0bHM7CiAKICNlbmRpZiAvKiBVU0VfR05VVExTICovCiAjZW5kaWYgLyogSEVBREVSX0NVUkxfR1RMU19IICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL21iZWR0bHMuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvbWJlZHRscy5jCmluZGV4IDAzN2JhYmUuLmNlMWY4ZWIgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvbWJlZHRscy5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvbWJlZHRscy5jCkBAIC02MSw2ICs2MSwyMSBAQAogI2luY2x1ZGUgImN1cmxfbWVtb3J5LmgiCiAjaW5jbHVkZSAibWVtZGVidWcuaCIKIAorc3RydWN0IHNzbF9iYWNrZW5kX2RhdGEgeworICBtYmVkdGxzX2N0cl9kcmJnX2NvbnRleHQgY3RyX2RyYmc7CisgIG1iZWR0bHNfZW50cm9weV9jb250ZXh0IGVudHJvcHk7CisgIG1iZWR0bHNfc3NsX2NvbnRleHQgc3NsOworICBpbnQgc2VydmVyX2ZkOworICBtYmVkdGxzX3g1MDlfY3J0IGNhY2VydDsKKyAgbWJlZHRsc194NTA5X2NydCBjbGljZXJ0OworICBtYmVkdGxzX3g1MDlfY3JsIGNybDsKKyAgbWJlZHRsc19wa19jb250ZXh0IHBrOworICBtYmVkdGxzX3NzbF9jb25maWcgY29uZmlnOworICBjb25zdCBjaGFyICpwcm90b2NvbHNbM107Cit9OworCisjZGVmaW5lIEJBQ0tFTkQgY29ubnNzbC0+YmFja2VuZAorCiAvKiBhcHBseSB0aHJlYWRpbmc/ICovCiAjaWYgZGVmaW5lZChVU0VfVEhSRUFEU19QT1NJWCkgfHwgZGVmaW5lZChVU0VfVEhSRUFEU19XSU4zMikKICNkZWZpbmUgVEhSRUFESU5HX1NVUFBPUlQKQEAgLTIxNCw5ICsyMjksOSBAQAogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIAotICBtYmVkdGxzX3NzbF9jb25mX21pbl92ZXJzaW9uKCZjb25uc3NsLT5jb25maWcsIE1CRURUTFNfU1NMX01BSk9SX1ZFUlNJT05fMywKKyAgbWJlZHRsc19zc2xfY29uZl9taW5fdmVyc2lvbigmQkFDS0VORC0+Y29uZmlnLCBNQkVEVExTX1NTTF9NQUpPUl9WRVJTSU9OXzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJlZHRsc192ZXJfbWluKTsKLSAgbWJlZHRsc19zc2xfY29uZl9tYXhfdmVyc2lvbigmY29ubnNzbC0+Y29uZmlnLCBNQkVEVExTX1NTTF9NQUpPUl9WRVJTSU9OXzMsCisgIG1iZWR0bHNfc3NsX2NvbmZfbWF4X3ZlcnNpb24oJkJBQ0tFTkQtPmNvbmZpZywgTUJFRFRMU19TU0xfTUFKT1JfVkVSU0lPTl8zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iZWR0bHNfdmVyX21heCk7CiAKICAgcmV0dXJuIHJlc3VsdDsKQEAgLTIzOCw3ICsyNTMsNyBAQAogICBjb25zdCBsb25nIGludCBwb3J0ID0gU1NMX0lTX1BST1hZKCkgPyBjb25uLT5wb3J0IDogY29ubi0+cmVtb3RlX3BvcnQ7CiAgIGludCByZXQgPSAtMTsKICAgY2hhciBlcnJvcmJ1ZlsxMjhdOwotICBlcnJvcmJ1ZlswXT0wOworICBlcnJvcmJ1ZlswXSA9IDA7CiAKICAgLyogbWJlZFRMUyBvbmx5IHN1cHBvcnRzIFNTTHYzIGFuZCBUTFN2MSAqLwogICBpZihTU0xfQ09OTl9DT05GSUcodmVyc2lvbikgPT0gQ1VSTF9TU0xWRVJTSU9OX1NTTHYyKSB7CkBAIC0yNDgsOSArMjYzLDkgQEAKIAogI2lmZGVmIFRIUkVBRElOR19TVVBQT1JUCiAgIGVudHJvcHlfaW5pdF9tdXRleCgmdHNfZW50cm9weSk7Ci0gIG1iZWR0bHNfY3RyX2RyYmdfaW5pdCgmY29ubnNzbC0+Y3RyX2RyYmcpOworICBtYmVkdGxzX2N0cl9kcmJnX2luaXQoJkJBQ0tFTkQtPmN0cl9kcmJnKTsKIAotICByZXQgPSBtYmVkdGxzX2N0cl9kcmJnX3NlZWQoJmNvbm5zc2wtPmN0cl9kcmJnLCBlbnRyb3B5X2Z1bmNfbXV0ZXgsCisgIHJldCA9IG1iZWR0bHNfY3RyX2RyYmdfc2VlZCgmQkFDS0VORC0+Y3RyX2RyYmcsIGVudHJvcHlfZnVuY19tdXRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0c19lbnRyb3B5LCBOVUxMLCAwKTsKICAgaWYocmV0KSB7CiAjaWZkZWYgTUJFRFRMU19FUlJPUl9DCkBAIC0yNjAsMTEgKzI3NSwxMSBAQAogICAgICAgICAgIC1yZXQsIGVycm9yYnVmKTsKICAgfQogI2Vsc2UKLSAgbWJlZHRsc19lbnRyb3B5X2luaXQoJmNvbm5zc2wtPmVudHJvcHkpOwotICBtYmVkdGxzX2N0cl9kcmJnX2luaXQoJmNvbm5zc2wtPmN0cl9kcmJnKTsKKyAgbWJlZHRsc19lbnRyb3B5X2luaXQoJkJBQ0tFTkQtPmVudHJvcHkpOworICBtYmVkdGxzX2N0cl9kcmJnX2luaXQoJkJBQ0tFTkQtPmN0cl9kcmJnKTsKIAotICByZXQgPSBtYmVkdGxzX2N0cl9kcmJnX3NlZWQoJmNvbm5zc2wtPmN0cl9kcmJnLCBtYmVkdGxzX2VudHJvcHlfZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25uc3NsLT5lbnRyb3B5LCBOVUxMLCAwKTsKKyAgcmV0ID0gbWJlZHRsc19jdHJfZHJiZ19zZWVkKCZCQUNLRU5ELT5jdHJfZHJiZywgbWJlZHRsc19lbnRyb3B5X2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQkFDS0VORC0+ZW50cm9weSwgTlVMTCwgMCk7CiAgIGlmKHJldCkgewogI2lmZGVmIE1CRURUTFNfRVJST1JfQwogICAgIG1iZWR0bHNfc3RyZXJyb3IocmV0LCBlcnJvcmJ1Ziwgc2l6ZW9mKGVycm9yYnVmKSk7CkBAIC0yNzUsMTAgKzI5MCwxMCBAQAogI2VuZGlmIC8qIFRIUkVBRElOR19TVVBQT1JUICovCiAKICAgLyogTG9hZCB0aGUgdHJ1c3RlZCBDQSAqLwotICBtYmVkdGxzX3g1MDlfY3J0X2luaXQoJmNvbm5zc2wtPmNhY2VydCk7CisgIG1iZWR0bHNfeDUwOV9jcnRfaW5pdCgmQkFDS0VORC0+Y2FjZXJ0KTsKIAogICBpZihzc2xfY2FmaWxlKSB7Ci0gICAgcmV0ID0gbWJlZHRsc194NTA5X2NydF9wYXJzZV9maWxlKCZjb25uc3NsLT5jYWNlcnQsIHNzbF9jYWZpbGUpOworICAgIHJldCA9IG1iZWR0bHNfeDUwOV9jcnRfcGFyc2VfZmlsZSgmQkFDS0VORC0+Y2FjZXJ0LCBzc2xfY2FmaWxlKTsKIAogICAgIGlmKHJldDwwKSB7CiAjaWZkZWYgTUJFRFRMU19FUlJPUl9DCkBAIC0yOTMsNyArMzA4LDcgQEAKICAgfQogCiAgIGlmKHNzbF9jYXBhdGgpIHsKLSAgICByZXQgPSBtYmVkdGxzX3g1MDlfY3J0X3BhcnNlX3BhdGgoJmNvbm5zc2wtPmNhY2VydCwgc3NsX2NhcGF0aCk7CisgICAgcmV0ID0gbWJlZHRsc194NTA5X2NydF9wYXJzZV9wYXRoKCZCQUNLRU5ELT5jYWNlcnQsIHNzbF9jYXBhdGgpOwogCiAgICAgaWYocmV0PDApIHsKICNpZmRlZiBNQkVEVExTX0VSUk9SX0MKQEAgLTMwOCwxMCArMzIzLDEwIEBACiAgIH0KIAogICAvKiBMb2FkIHRoZSBjbGllbnQgY2VydGlmaWNhdGUgKi8KLSAgbWJlZHRsc194NTA5X2NydF9pbml0KCZjb25uc3NsLT5jbGljZXJ0KTsKKyAgbWJlZHRsc194NTA5X2NydF9pbml0KCZCQUNLRU5ELT5jbGljZXJ0KTsKIAogICBpZihzc2xfY2VydCkgewotICAgIHJldCA9IG1iZWR0bHNfeDUwOV9jcnRfcGFyc2VfZmlsZSgmY29ubnNzbC0+Y2xpY2VydCwgc3NsX2NlcnQpOworICAgIHJldCA9IG1iZWR0bHNfeDUwOV9jcnRfcGFyc2VfZmlsZSgmQkFDS0VORC0+Y2xpY2VydCwgc3NsX2NlcnQpOwogCiAgICAgaWYocmV0KSB7CiAjaWZkZWYgTUJFRFRMU19FUlJPUl9DCkBAIC0zMjUsMTIgKzM0MCwxMiBAQAogICB9CiAKICAgLyogTG9hZCB0aGUgY2xpZW50IHByaXZhdGUga2V5ICovCi0gIG1iZWR0bHNfcGtfaW5pdCgmY29ubnNzbC0+cGspOworICBtYmVkdGxzX3BrX2luaXQoJkJBQ0tFTkQtPnBrKTsKIAogICBpZihTU0xfU0VUX09QVElPTihrZXkpKSB7Ci0gICAgcmV0ID0gbWJlZHRsc19wa19wYXJzZV9rZXlmaWxlKCZjb25uc3NsLT5waywgU1NMX1NFVF9PUFRJT04oa2V5KSwKKyAgICByZXQgPSBtYmVkdGxzX3BrX3BhcnNlX2tleWZpbGUoJkJBQ0tFTkQtPnBrLCBTU0xfU0VUX09QVElPTihrZXkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfU0VUX09QVElPTihrZXlfcGFzc3dkKSk7Ci0gICAgaWYocmV0ID09IDAgJiYgIW1iZWR0bHNfcGtfY2FuX2RvKCZjb25uc3NsLT5waywgTUJFRFRMU19QS19SU0EpKQorICAgIGlmKHJldCA9PSAwICYmICFtYmVkdGxzX3BrX2Nhbl9kbygmQkFDS0VORC0+cGssIE1CRURUTFNfUEtfUlNBKSkKICAgICAgIHJldCA9IE1CRURUTFNfRVJSX1BLX1RZUEVfTUlTTUFUQ0g7CiAKICAgICBpZihyZXQpIHsKQEAgLTM0NSwxMCArMzYwLDEwIEBACiAgIH0KIAogICAvKiBMb2FkIHRoZSBDUkwgKi8KLSAgbWJlZHRsc194NTA5X2NybF9pbml0KCZjb25uc3NsLT5jcmwpOworICBtYmVkdGxzX3g1MDlfY3JsX2luaXQoJkJBQ0tFTkQtPmNybCk7CiAKICAgaWYoc3NsX2NybGZpbGUpIHsKLSAgICByZXQgPSBtYmVkdGxzX3g1MDlfY3JsX3BhcnNlX2ZpbGUoJmNvbm5zc2wtPmNybCwgc3NsX2NybGZpbGUpOworICAgIHJldCA9IG1iZWR0bHNfeDUwOV9jcmxfcGFyc2VfZmlsZSgmQkFDS0VORC0+Y3JsLCBzc2xfY3JsZmlsZSk7CiAKICAgICBpZihyZXQpIHsKICNpZmRlZiBNQkVEVExTX0VSUk9SX0MKQEAgLTM2MywxNCArMzc4LDE0IEBACiAKICAgaW5mb2YoZGF0YSwgIm1iZWRUTFM6IENvbm5lY3RpbmcgdG8gJXM6JWRcbiIsIGhvc3RuYW1lLCBwb3J0KTsKIAotICBtYmVkdGxzX3NzbF9jb25maWdfaW5pdCgmY29ubnNzbC0+Y29uZmlnKTsKKyAgbWJlZHRsc19zc2xfY29uZmlnX2luaXQoJkJBQ0tFTkQtPmNvbmZpZyk7CiAKLSAgbWJlZHRsc19zc2xfaW5pdCgmY29ubnNzbC0+c3NsKTsKLSAgaWYobWJlZHRsc19zc2xfc2V0dXAoJmNvbm5zc2wtPnNzbCwgJmNvbm5zc2wtPmNvbmZpZykpIHsKKyAgbWJlZHRsc19zc2xfaW5pdCgmQkFDS0VORC0+c3NsKTsKKyAgaWYobWJlZHRsc19zc2xfc2V0dXAoJkJBQ0tFTkQtPnNzbCwgJkJBQ0tFTkQtPmNvbmZpZykpIHsKICAgICBmYWlsZihkYXRhLCAibWJlZFRMUzogc3NsX2luaXQgZmFpbGVkIik7CiAgICAgcmV0dXJuIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SOwogICB9Ci0gIHJldCA9IG1iZWR0bHNfc3NsX2NvbmZpZ19kZWZhdWx0cygmY29ubnNzbC0+Y29uZmlnLAorICByZXQgPSBtYmVkdGxzX3NzbF9jb25maWdfZGVmYXVsdHMoJkJBQ0tFTkQtPmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRURUTFNfU1NMX0lTX0NMSUVOVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRURUTFNfU1NMX1RSQU5TUE9SVF9TVFJFQU0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkVEVExTX1NTTF9QUkVTRVRfREVGQVVMVCk7CkBAIC0zODAsMjAgKzM5NSwyMCBAQAogICB9CiAKICAgLyogbmV3IHByb2ZpbGUgd2l0aCBSU0EgbWluIGtleSBsZW4gPSAxMDI0IC4uLiAqLwotICBtYmVkdGxzX3NzbF9jb25mX2NlcnRfcHJvZmlsZSgmY29ubnNzbC0+Y29uZmlnLAorICBtYmVkdGxzX3NzbF9jb25mX2NlcnRfcHJvZmlsZSgmQkFDS0VORC0+Y29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWJlZHRsc194NTA5X2NydF9wcm9maWxlX2ZyKTsKIAogICBzd2l0Y2goU1NMX0NPTk5fQ09ORklHKHZlcnNpb24pKSB7CiAgIGNhc2UgQ1VSTF9TU0xWRVJTSU9OX0RFRkFVTFQ6CiAgIGNhc2UgQ1VSTF9TU0xWRVJTSU9OX1RMU3YxOgotICAgIG1iZWR0bHNfc3NsX2NvbmZfbWluX3ZlcnNpb24oJmNvbm5zc2wtPmNvbmZpZywgTUJFRFRMU19TU0xfTUFKT1JfVkVSU0lPTl8zLAorICAgIG1iZWR0bHNfc3NsX2NvbmZfbWluX3ZlcnNpb24oJkJBQ0tFTkQtPmNvbmZpZywgTUJFRFRMU19TU0xfTUFKT1JfVkVSU0lPTl8zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJFRFRMU19TU0xfTUlOT1JfVkVSU0lPTl8xKTsKICAgICBpbmZvZihkYXRhLCAibWJlZFRMUzogU2V0IG1pbiBTU0wgdmVyc2lvbiB0byBUTFMgMS4wXG4iKTsKICAgICBicmVhazsKICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fU1NMdjM6Ci0gICAgbWJlZHRsc19zc2xfY29uZl9taW5fdmVyc2lvbigmY29ubnNzbC0+Y29uZmlnLCBNQkVEVExTX1NTTF9NQUpPUl9WRVJTSU9OXzMsCisgICAgbWJlZHRsc19zc2xfY29uZl9taW5fdmVyc2lvbigmQkFDS0VORC0+Y29uZmlnLCBNQkVEVExTX1NTTF9NQUpPUl9WRVJTSU9OXzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkVEVExTX1NTTF9NSU5PUl9WRVJTSU9OXzApOwotICAgIG1iZWR0bHNfc3NsX2NvbmZfbWF4X3ZlcnNpb24oJmNvbm5zc2wtPmNvbmZpZywgTUJFRFRMU19TU0xfTUFKT1JfVkVSU0lPTl8zLAorICAgIG1iZWR0bHNfc3NsX2NvbmZfbWF4X3ZlcnNpb24oJkJBQ0tFTkQtPmNvbmZpZywgTUJFRFRMU19TU0xfTUFKT1JfVkVSU0lPTl8zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJFRFRMU19TU0xfTUlOT1JfVkVSU0lPTl8wKTsKICAgICBpbmZvZihkYXRhLCAibWJlZFRMUzogU2V0IFNTTCB2ZXJzaW9uIHRvIFNTTHYzXG4iKTsKICAgICBicmVhazsKQEAgLTQxMiwyNSArNDI3LDI1IEBACiAgICAgcmV0dXJuIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SOwogICB9CiAKLSAgbWJlZHRsc19zc2xfY29uZl9hdXRobW9kZSgmY29ubnNzbC0+Y29uZmlnLCBNQkVEVExTX1NTTF9WRVJJRllfT1BUSU9OQUwpOworICBtYmVkdGxzX3NzbF9jb25mX2F1dGhtb2RlKCZCQUNLRU5ELT5jb25maWcsIE1CRURUTFNfU1NMX1ZFUklGWV9PUFRJT05BTCk7CiAKLSAgbWJlZHRsc19zc2xfY29uZl9ybmcoJmNvbm5zc2wtPmNvbmZpZywgbWJlZHRsc19jdHJfZHJiZ19yYW5kb20sCi0gICAgICAgICAgICAgICAgICAgICAgICZjb25uc3NsLT5jdHJfZHJiZyk7Ci0gIG1iZWR0bHNfc3NsX3NldF9iaW8oJmNvbm5zc2wtPnNzbCwgJmNvbm4tPnNvY2tbc29ja2luZGV4XSwKKyAgbWJlZHRsc19zc2xfY29uZl9ybmcoJkJBQ0tFTkQtPmNvbmZpZywgbWJlZHRsc19jdHJfZHJiZ19yYW5kb20sCisgICAgICAgICAgICAgICAgICAgICAgICZCQUNLRU5ELT5jdHJfZHJiZyk7CisgIG1iZWR0bHNfc3NsX3NldF9iaW8oJkJBQ0tFTkQtPnNzbCwgJmNvbm4tPnNvY2tbc29ja2luZGV4XSwKICAgICAgICAgICAgICAgICAgICAgICBtYmVkdGxzX25ldF9zZW5kLAogICAgICAgICAgICAgICAgICAgICAgIG1iZWR0bHNfbmV0X3JlY3YsCiAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiAgcmV2X3RpbWVvdXQoKSAqLyk7CiAKLSAgbWJlZHRsc19zc2xfY29uZl9jaXBoZXJzdWl0ZXMoJmNvbm5zc2wtPmNvbmZpZywKKyAgbWJlZHRsc19zc2xfY29uZl9jaXBoZXJzdWl0ZXMoJkJBQ0tFTkQtPmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJlZHRsc19zc2xfbGlzdF9jaXBoZXJzdWl0ZXMoKSk7CiAKICNpZiBkZWZpbmVkKE1CRURUTFNfU1NMX1JFTkVHT1RJQVRJT04pCi0gIG1iZWR0bHNfc3NsX2NvbmZfcmVuZWdvdGlhdGlvbigmY29ubnNzbC0+Y29uZmlnLAorICBtYmVkdGxzX3NzbF9jb25mX3JlbmVnb3RpYXRpb24oJkJBQ0tFTkQtPmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRURUTFNfU1NMX1JFTkVHT1RJQVRJT05fRU5BQkxFRCk7CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoTUJFRFRMU19TU0xfU0VTU0lPTl9USUNLRVRTKQotICBtYmVkdGxzX3NzbF9jb25mX3Nlc3Npb25fdGlja2V0cygmY29ubnNzbC0+Y29uZmlnLAorICBtYmVkdGxzX3NzbF9jb25mX3Nlc3Npb25fdGlja2V0cygmQkFDS0VORC0+Y29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkVEVExTX1NTTF9TRVNTSU9OX1RJQ0tFVFNfRElTQUJMRUQpOwogI2VuZGlmCiAKQEAgLTQ0MCw3ICs0NTUsNyBAQAogCiAgICAgQ3VybF9zc2xfc2Vzc2lvbmlkX2xvY2soY29ubik7CiAgICAgaWYoIUN1cmxfc3NsX2dldHNlc3Npb25pZChjb25uLCAmb2xkX3Nlc3Npb24sIE5VTEwsIHNvY2tpbmRleCkpIHsKLSAgICAgIHJldCA9IG1iZWR0bHNfc3NsX3NldF9zZXNzaW9uKCZjb25uc3NsLT5zc2wsIG9sZF9zZXNzaW9uKTsKKyAgICAgIHJldCA9IG1iZWR0bHNfc3NsX3NldF9zZXNzaW9uKCZCQUNLRU5ELT5zc2wsIG9sZF9zZXNzaW9uKTsKICAgICAgIGlmKHJldCkgewogICAgICAgICBDdXJsX3NzbF9zZXNzaW9uaWRfdW5sb2NrKGNvbm4pOwogICAgICAgICBmYWlsZihkYXRhLCAibWJlZHRsc19zc2xfc2V0X3Nlc3Npb24gcmV0dXJuZWQgLTB4JXgiLCAtcmV0KTsKQEAgLTQ1MSwxNSArNDY2LDE1IEBACiAgICAgQ3VybF9zc2xfc2Vzc2lvbmlkX3VubG9jayhjb25uKTsKICAgfQogCi0gIG1iZWR0bHNfc3NsX2NvbmZfY2FfY2hhaW4oJmNvbm5zc2wtPmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ubnNzbC0+Y2FjZXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25uc3NsLT5jcmwpOworICBtYmVkdGxzX3NzbF9jb25mX2NhX2NoYWluKCZCQUNLRU5ELT5jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJBQ0tFTkQtPmNhY2VydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQkFDS0VORC0+Y3JsKTsKIAogICBpZihTU0xfU0VUX09QVElPTihrZXkpKSB7Ci0gICAgbWJlZHRsc19zc2xfY29uZl9vd25fY2VydCgmY29ubnNzbC0+Y29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbm5zc2wtPmNsaWNlcnQsICZjb25uc3NsLT5wayk7CisgICAgbWJlZHRsc19zc2xfY29uZl9vd25fY2VydCgmQkFDS0VORC0+Y29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJBQ0tFTkQtPmNsaWNlcnQsICZCQUNLRU5ELT5wayk7CiAgIH0KLSAgaWYobWJlZHRsc19zc2xfc2V0X2hvc3RuYW1lKCZjb25uc3NsLT5zc2wsIGhvc3RuYW1lKSkgeworICBpZihtYmVkdGxzX3NzbF9zZXRfaG9zdG5hbWUoJkJBQ0tFTkQtPnNzbCwgaG9zdG5hbWUpKSB7CiAgICAgLyogbWJlZHRsc19zc2xfc2V0X2hvc3RuYW1lKCkgc2V0cyB0aGUgbmFtZSB0byB1c2UgaW4gQ04vU0FOIGNoZWNrcyAqYW5kKgogICAgICAgIHRoZSBuYW1lIHRvIHNldCBpbiB0aGUgU05JIGV4dGVuc2lvbi4gU28gZXZlbiBpZiBjdXJsIGNvbm5lY3RzIHRvIGEKICAgICAgICBob3N0IHNwZWNpZmllZCBhcyBhbiBJUCBhZGRyZXNzLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZC4gKi8KQEAgLTQ2OSw3ICs0ODQsNyBAQAogCiAjaWZkZWYgSEFTX0FMUE4KICAgaWYoY29ubi0+Yml0cy50bHNfZW5hYmxlX2FscG4pIHsKLSAgICBjb25zdCBjaGFyICoqcCA9ICZjb25uc3NsLT5wcm90b2NvbHNbMF07CisgICAgY29uc3QgY2hhciAqKnAgPSAmQkFDS0VORC0+cHJvdG9jb2xzWzBdOwogI2lmZGVmIFVTRV9OR0hUVFAyCiAgICAgaWYoZGF0YS0+c2V0Lmh0dHB2ZXJzaW9uID49IENVUkxfSFRUUF9WRVJTSU9OXzIpCiAgICAgICAqcCsrID0gTkdIVFRQMl9QUk9UT19WRVJTSU9OX0lEOwpAQCAtNDc4LDE5ICs0OTMsMTkgQEAKICAgICAqcCA9IE5VTEw7CiAgICAgLyogdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNsb25lIHRoZSBwcm90b2NvbHMgYXJyYXksIHdoaWNoIGlzIHdoeSB3ZSBuZWVkCiAgICAgICAgdG8ga2VlcCBpdCBhcm91bmQgKi8KLSAgICBpZihtYmVkdGxzX3NzbF9jb25mX2FscG5fcHJvdG9jb2xzKCZjb25uc3NsLT5jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ubnNzbC0+cHJvdG9jb2xzWzBdKSkgeworICAgIGlmKG1iZWR0bHNfc3NsX2NvbmZfYWxwbl9wcm90b2NvbHMoJkJBQ0tFTkQtPmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCQUNLRU5ELT5wcm90b2NvbHNbMF0pKSB7CiAgICAgICBmYWlsZihkYXRhLCAiRmFpbGVkIHNldHRpbmcgQUxQTiBwcm90b2NvbHMiKTsKICAgICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKICAgICB9Ci0gICAgZm9yKHAgPSAmY29ubnNzbC0+cHJvdG9jb2xzWzBdOyAqcDsgKytwKQorICAgIGZvcihwID0gJkJBQ0tFTkQtPnByb3RvY29sc1swXTsgKnA7ICsrcCkKICAgICAgIGluZm9mKGRhdGEsICJBTFBOLCBvZmZlcmluZyAlc1xuIiwgKnApOwogICB9CiAjZW5kaWYKIAogI2lmZGVmIE1CRURUTFNfREVCVUcKICAgLyogSW4gb3JkZXIgdG8gbWFrZSB0aGF0IHdvcmsgaW4gbWJlZHRscyBNQkVEVExTX0RFQlVHX0MgbXVzdCBiZSBkZWZpbmVkLiAqLwotICBtYmVkdGxzX3NzbF9jb25mX2RiZygmY29ubnNzbC0+Y29uZmlnLCBtYmVkX2RlYnVnLCBkYXRhKTsKKyAgbWJlZHRsc19zc2xfY29uZl9kYmcoJkJBQ0tFTkQtPmNvbmZpZywgbWJlZF9kZWJ1ZywgZGF0YSk7CiAgIC8qIC0gMCBObyBkZWJ1ZwogICAgKiAtIDEgRXJyb3IKICAgICogLSAyIFN0YXRlIGNoYW5nZQpAQCAtNTAyLDcgKzUxNyw3IEBACiAKICAgLyogZ2l2ZSBhcHBsaWNhdGlvbiBhIGNoYW5jZSB0byBpbnRlcmZlcmUgd2l0aCBtYmVkVExTIHNldCB1cC4gKi8KICAgaWYoZGF0YS0+c2V0LnNzbC5mc3NsY3R4KSB7Ci0gICAgcmV0ID0gKCpkYXRhLT5zZXQuc3NsLmZzc2xjdHgpKGRhdGEsICZjb25uc3NsLT5jb25maWcsCisgICAgcmV0ID0gKCpkYXRhLT5zZXQuc3NsLmZzc2xjdHgpKGRhdGEsICZCQUNLRU5ELT5jb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnNldC5zc2wuZnNzbGN0eHApOwogICAgIGlmKHJldCkgewogICAgICAgZmFpbGYoZGF0YSwgImVycm9yIHNpZ25hbGVkIGJ5IHNzbCBjdHggY2FsbGJhY2siKTsKQEAgLTUzNyw3ICs1NTIsNyBAQAogICBjb25uLT5yZWN2W3NvY2tpbmRleF0gPSBtYmVkX3JlY3Y7CiAgIGNvbm4tPnNlbmRbc29ja2luZGV4XSA9IG1iZWRfc2VuZDsKIAotICByZXQgPSBtYmVkdGxzX3NzbF9oYW5kc2hha2UoJmNvbm5zc2wtPnNzbCk7CisgIHJldCA9IG1iZWR0bHNfc3NsX2hhbmRzaGFrZSgmQkFDS0VORC0+c3NsKTsKIAogICBpZihyZXQgPT0gTUJFRFRMU19FUlJfU1NMX1dBTlRfUkVBRCkgewogICAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPSBzc2xfY29ubmVjdF8yX3JlYWRpbmc7CkBAIC01NTcsMTAgKzU3MiwxMCBAQAogICB9CiAKICAgaW5mb2YoZGF0YSwgIm1iZWRUTFM6IEhhbmRzaGFrZSBjb21wbGV0ZSwgY2lwaGVyIGlzICVzXG4iLAotICAgICAgICBtYmVkdGxzX3NzbF9nZXRfY2lwaGVyc3VpdGUoJmNvbm4tPnNzbFtzb2NraW5kZXhdLnNzbCkKKyAgICAgICAgbWJlZHRsc19zc2xfZ2V0X2NpcGhlcnN1aXRlKCZCQUNLRU5ELT5zc2wpCiAgICAgKTsKIAotICByZXQgPSBtYmVkdGxzX3NzbF9nZXRfdmVyaWZ5X3Jlc3VsdCgmY29ubi0+c3NsW3NvY2tpbmRleF0uc3NsKTsKKyAgcmV0ID0gbWJlZHRsc19zc2xfZ2V0X3ZlcmlmeV9yZXN1bHQoJkJBQ0tFTkQtPnNzbCk7CiAKICAgaWYocmV0ICYmIFNTTF9DT05OX0NPTkZJRyh2ZXJpZnlwZWVyKSkgewogICAgIGlmKHJldCAmIE1CRURUTFNfWDUwOV9CQURDRVJUX0VYUElSRUQpCkBAIC01ODAsNyArNTk1LDcgQEAKICAgICByZXR1cm4gQ1VSTEVfUEVFUl9GQUlMRURfVkVSSUZJQ0FUSU9OOwogICB9CiAKLSAgcGVlcmNlcnQgPSBtYmVkdGxzX3NzbF9nZXRfcGVlcl9jZXJ0KCZjb25uc3NsLT5zc2wpOworICBwZWVyY2VydCA9IG1iZWR0bHNfc3NsX2dldF9wZWVyX2NlcnQoJkJBQ0tFTkQtPnNzbCk7CiAKICAgaWYocGVlcmNlcnQgJiYgZGF0YS0+c2V0LnZlcmJvc2UpIHsKICAgICBjb25zdCBzaXplX3QgYnVmc2l6ZSA9IDE2Mzg0OwpAQCAtNjUwLDcgKzY2NSw3IEBACiAKICNpZmRlZiBIQVNfQUxQTgogICBpZihjb25uLT5iaXRzLnRsc19lbmFibGVfYWxwbikgewotICAgIG5leHRfcHJvdG9jb2wgPSBtYmVkdGxzX3NzbF9nZXRfYWxwbl9wcm90b2NvbCgmY29ubnNzbC0+c3NsKTsKKyAgICBuZXh0X3Byb3RvY29sID0gbWJlZHRsc19zc2xfZ2V0X2FscG5fcHJvdG9jb2woJkJBQ0tFTkQtPnNzbCk7CiAKICAgICBpZihuZXh0X3Byb3RvY29sKSB7CiAgICAgICBpbmZvZihkYXRhLCAiQUxQTiwgc2VydmVyIGFjY2VwdGVkIHRvIHVzZSAlc1xuIiwgbmV4dF9wcm90b2NvbCk7CkBAIC03MDAsNyArNzE1LDcgQEAKIAogICAgIG1iZWR0bHNfc3NsX3Nlc3Npb25faW5pdChvdXJfc3NsX3Nlc3Npb25pZCk7CiAKLSAgICByZXQgPSBtYmVkdGxzX3NzbF9nZXRfc2Vzc2lvbigmY29ubnNzbC0+c3NsLCBvdXJfc3NsX3Nlc3Npb25pZCk7CisgICAgcmV0ID0gbWJlZHRsc19zc2xfZ2V0X3Nlc3Npb24oJkJBQ0tFTkQtPnNzbCwgb3VyX3NzbF9zZXNzaW9uaWQpOwogICAgIGlmKHJldCkgewogICAgICAgZnJlZShvdXJfc3NsX3Nlc3Npb25pZCk7CiAgICAgICBmYWlsZihkYXRhLCAibWJlZHRsc19zc2xfZ2V0X3Nlc3Npb24gcmV0dXJuZWQgLTB4JXgiLCAtcmV0KTsKQEAgLTczMCw5ICs3NDUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICptZW0sIHNpemVfdCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTGNvZGUgKmN1cmxjb2RlKQogeworICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKICAgaW50IHJldCA9IC0xOwogCi0gIHJldCA9IG1iZWR0bHNfc3NsX3dyaXRlKCZjb25uLT5zc2xbc29ja2luZGV4XS5zc2wsCisgIHJldCA9IG1iZWR0bHNfc3NsX3dyaXRlKCZCQUNLRU5ELT5zc2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopbWVtLCBsZW4pOwogCiAgIGlmKHJldCA8IDApIHsKQEAgLTc0NCwyMiArNzYwLDIzIEBACiAgIHJldHVybiByZXQ7CiB9CiAKLXZvaWQgQ3VybF9tYmVkdGxzX2Nsb3NlX2FsbChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQorc3RhdGljIHZvaWQgQ3VybF9tYmVkdGxzX2Nsb3NlX2FsbChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQogewogICAodm9pZClkYXRhOwogfQogCi12b2lkIEN1cmxfbWJlZHRsc19jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCitzdGF0aWMgdm9pZCBDdXJsX21iZWR0bHNfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQogewotICBtYmVkdGxzX3BrX2ZyZWUoJmNvbm4tPnNzbFtzb2NraW5kZXhdLnBrKTsKLSAgbWJlZHRsc194NTA5X2NydF9mcmVlKCZjb25uLT5zc2xbc29ja2luZGV4XS5jbGljZXJ0KTsKLSAgbWJlZHRsc194NTA5X2NydF9mcmVlKCZjb25uLT5zc2xbc29ja2luZGV4XS5jYWNlcnQpOwotICBtYmVkdGxzX3g1MDlfY3JsX2ZyZWUoJmNvbm4tPnNzbFtzb2NraW5kZXhdLmNybCk7Ci0gIG1iZWR0bHNfc3NsX2NvbmZpZ19mcmVlKCZjb25uLT5zc2xbc29ja2luZGV4XS5jb25maWcpOwotICBtYmVkdGxzX3NzbF9mcmVlKCZjb25uLT5zc2xbc29ja2luZGV4XS5zc2wpOwotICBtYmVkdGxzX2N0cl9kcmJnX2ZyZWUoJmNvbm4tPnNzbFtzb2NraW5kZXhdLmN0cl9kcmJnKTsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CisgIG1iZWR0bHNfcGtfZnJlZSgmQkFDS0VORC0+cGspOworICBtYmVkdGxzX3g1MDlfY3J0X2ZyZWUoJkJBQ0tFTkQtPmNsaWNlcnQpOworICBtYmVkdGxzX3g1MDlfY3J0X2ZyZWUoJkJBQ0tFTkQtPmNhY2VydCk7CisgIG1iZWR0bHNfeDUwOV9jcmxfZnJlZSgmQkFDS0VORC0+Y3JsKTsKKyAgbWJlZHRsc19zc2xfY29uZmlnX2ZyZWUoJkJBQ0tFTkQtPmNvbmZpZyk7CisgIG1iZWR0bHNfc3NsX2ZyZWUoJkJBQ0tFTkQtPnNzbCk7CisgIG1iZWR0bHNfY3RyX2RyYmdfZnJlZSgmQkFDS0VORC0+Y3RyX2RyYmcpOwogI2lmbmRlZiBUSFJFQURJTkdfU1VQUE9SVAotICBtYmVkdGxzX2VudHJvcHlfZnJlZSgmY29ubi0+c3NsW3NvY2tpbmRleF0uZW50cm9weSk7CisgIG1iZWR0bHNfZW50cm9weV9mcmVlKCZCQUNLRU5ELT5lbnRyb3B5KTsKICNlbmRpZiAvKiBUSFJFQURJTkdfU1VQUE9SVCAqLwogfQogCkBAIC03NjcsMTEgKzc4NCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmZlcnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTGNvZGUgKmN1cmxjb2RlKQogeworICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbbnVtXTsKICAgaW50IHJldCA9IC0xOwogICBzc2l6ZV90IGxlbiA9IC0xOwogCiAgIG1lbXNldChidWYsIDAsIGJ1ZmZlcnNpemUpOwotICByZXQgPSBtYmVkdGxzX3NzbF9yZWFkKCZjb25uLT5zc2xbbnVtXS5zc2wsICh1bnNpZ25lZCBjaGFyICopYnVmLAorICByZXQgPSBtYmVkdGxzX3NzbF9yZWFkKCZCQUNLRU5ELT5zc2wsICh1bnNpZ25lZCBjaGFyICopYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNpemUpOwogCiAgIGlmKHJldCA8PSAwKSB7CkBAIC03ODgsMjEgKzgwNiwyMSBAQAogICByZXR1cm4gbGVuOwogfQogCi12b2lkIEN1cmxfbWJlZHRsc19zZXNzaW9uX2ZyZWUodm9pZCAqcHRyKQorc3RhdGljIHZvaWQgQ3VybF9tYmVkdGxzX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpCiB7CiAgIG1iZWR0bHNfc3NsX3Nlc3Npb25fZnJlZShwdHIpOwogICBmcmVlKHB0cik7CiB9CiAKLXNpemVfdCBDdXJsX21iZWR0bHNfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQorc3RhdGljIHNpemVfdCBDdXJsX21iZWR0bHNfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQogewogICB1bnNpZ25lZCBpbnQgdmVyc2lvbiA9IG1iZWR0bHNfdmVyc2lvbl9nZXRfbnVtYmVyKCk7CiAgIHJldHVybiBzbnByaW50ZihidWZmZXIsIHNpemUsICJtYmVkVExTLyVkLiVkLiVkIiwgdmVyc2lvbj4+MjQsCiAgICAgICAgICAgICAgICAgICAodmVyc2lvbj4+MTYpJjB4ZmYsICh2ZXJzaW9uPj44KSYweGZmKTsKIH0KIAotQ1VSTGNvZGUgQ3VybF9tYmVkdGxzX3JhbmRvbShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCB1bnNpZ25lZCBjaGFyICplbnRyb3B5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKQorc3RhdGljIENVUkxjb2RlIEN1cmxfbWJlZHRsc19yYW5kb20oc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVudHJvcHksIHNpemVfdCBsZW5ndGgpCiB7CiAjaWYgZGVmaW5lZChNQkVEVExTX0NUUl9EUkJHX0MpCiAgIGludCByZXQgPSAtMTsKQEAgLTgxMSw3ICs4MjksNyBAQAogICBtYmVkdGxzX2N0cl9kcmJnX2NvbnRleHQgY3RyX2RyYmc7CiAgIG1iZWR0bHNfZW50cm9weV9pbml0KCZjdHJfZW50cm9weSk7CiAgIG1iZWR0bHNfY3RyX2RyYmdfaW5pdCgmY3RyX2RyYmcpOwotICBlcnJvcmJ1ZlswXT0wOworICBlcnJvcmJ1ZlswXSA9IDA7CiAKICAgcmV0ID0gbWJlZHRsc19jdHJfZHJiZ19zZWVkKCZjdHJfZHJiZywgbWJlZHRsc19lbnRyb3B5X2Z1bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3RyX2VudHJvcHksIE5VTEwsIDApOwpAQCAtODY5LDcgKzg4Nyw3IEBACiAgICAgcmV0dXJuIENVUkxFX09LOwogICB9CiAKLSAgaWYoc3NsX2Nvbm5lY3RfMT09Y29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSkgeworICBpZihzc2xfY29ubmVjdF8xID09IGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUpIHsKICAgICAvKiBGaW5kIG91dCBob3cgbXVjaCBtb3JlIHRpbWUgd2UncmUgYWxsb3dlZCAqLwogICAgIHRpbWVvdXRfbXMgPSBDdXJsX3RpbWVsZWZ0KGRhdGEsIE5VTEwsIFRSVUUpOwogCkBAIC05MDAsOSArOTE4LDkgQEAKICAgICBpZihjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID09IHNzbF9jb25uZWN0XzJfcmVhZGluZwogICAgICAgIHx8IGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPT0gc3NsX2Nvbm5lY3RfMl93cml0aW5nKSB7CiAKLSAgICAgIGN1cmxfc29ja2V0X3Qgd3JpdGVmZCA9IHNzbF9jb25uZWN0XzJfd3JpdGluZz09CisgICAgICBjdXJsX3NvY2tldF90IHdyaXRlZmQgPSBzc2xfY29ubmVjdF8yX3dyaXRpbmcgPT0KICAgICAgICAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZT9zb2NrZmQ6Q1VSTF9TT0NLRVRfQkFEOwotICAgICAgY3VybF9zb2NrZXRfdCByZWFkZmQgPSBzc2xfY29ubmVjdF8yX3JlYWRpbmc9PQorICAgICAgY3VybF9zb2NrZXRfdCByZWFkZmQgPSBzc2xfY29ubmVjdF8yX3JlYWRpbmcgPT0KICAgICAgICAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZT9zb2NrZmQ6Q1VSTF9TT0NLRVRfQkFEOwogCiAgICAgICB3aGF0ID0gQ3VybF9zb2NrZXRfY2hlY2socmVhZGZkLCBDVVJMX1NPQ0tFVF9CQUQsIHdyaXRlZmQsCkBAIC05NDIsMTMgKzk2MCwxMyBAQAogCiAgIH0gLyogcmVwZWF0IHN0ZXAyIHVudGlsIGFsbCB0cmFuc2FjdGlvbnMgYXJlIGRvbmUuICovCiAKLSAgaWYoc3NsX2Nvbm5lY3RfMz09Y29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSkgeworICBpZihzc2xfY29ubmVjdF8zID09IGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUpIHsKICAgICByZXRjb2RlID0gbWJlZF9jb25uZWN0X3N0ZXAzKGNvbm4sIHNvY2tpbmRleCk7CiAgICAgaWYocmV0Y29kZSkKICAgICAgIHJldHVybiByZXRjb2RlOwogICB9CiAKLSAgaWYoc3NsX2Nvbm5lY3RfZG9uZT09Y29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSkgeworICBpZihzc2xfY29ubmVjdF9kb25lID09IGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUpIHsKICAgICBjb25uc3NsLT5zdGF0ZSA9IHNzbF9jb25uZWN0aW9uX2NvbXBsZXRlOwogICAgIGNvbm4tPnJlY3Zbc29ja2luZGV4XSA9IG1iZWRfcmVjdjsKICAgICBjb25uLT5zZW5kW3NvY2tpbmRleF0gPSBtYmVkX3NlbmQ7CkBAIC05NjMsMTggKzk4MSwxNCBAQAogICByZXR1cm4gQ1VSTEVfT0s7CiB9CiAKLUNVUkxjb2RlCi1DdXJsX21iZWR0bHNfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqZG9uZSkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX21iZWR0bHNfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwgYm9vbCAqZG9uZSkKIHsKICAgcmV0dXJuIG1iZWRfY29ubmVjdF9jb21tb24oY29ubiwgc29ja2luZGV4LCBUUlVFLCBkb25lKTsKIH0KIAogCi1DVVJMY29kZQotQ3VybF9tYmVkdGxzX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX21iZWR0bHNfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CiAgIENVUkxjb2RlIHJldGNvZGU7CiAgIGJvb2wgZG9uZSA9IEZBTFNFOwpAQCAtOTkyLDE5ICsxMDA2LDcwIEBACiAgKiByZXR1cm4gMCBlcnJvciBpbml0aWFsaXppbmcgU1NMCiAgKiByZXR1cm4gMSBTU0wgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5CiAgKi8KLWludCBDdXJsX21iZWR0bHNfaW5pdCh2b2lkKQorc3RhdGljIGludCBDdXJsX21iZWR0bHNfaW5pdCh2b2lkKQogewogICByZXR1cm4gQ3VybF9wb2xhcnNzbHRocmVhZGxvY2tfdGhyZWFkX3NldHVwKCk7CiB9CiAKLXZvaWQgQ3VybF9tYmVkdGxzX2NsZWFudXAodm9pZCkKK3N0YXRpYyB2b2lkIEN1cmxfbWJlZHRsc19jbGVhbnVwKHZvaWQpCiB7CiAgICh2b2lkKUN1cmxfcG9sYXJzc2x0aHJlYWRsb2NrX3RocmVhZF9jbGVhbnVwKCk7CiB9CiAKLWludCBDdXJsX21iZWR0bHNfZGF0YV9wZW5kaW5nKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKK3N0YXRpYyBib29sIEN1cmxfbWJlZHRsc19kYXRhX3BlbmRpbmcoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4KQogewotICByZXR1cm4gbWJlZHRsc19zc2xfZ2V0X2J5dGVzX2F2YWlsKCZjb25uLT5zc2xbc29ja2luZGV4XS5zc2wpICE9IDA7CisgIGNvbnN0IHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOworICByZXR1cm4gbWJlZHRsc19zc2xfZ2V0X2J5dGVzX2F2YWlsKCZCQUNLRU5ELT5zc2wpICE9IDA7CiB9CiAKK3N0YXRpYyB2b2lkIEN1cmxfbWJlZHRsc19zaGEyNTZzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5wdXRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzaGEyNTZzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2hhMjU2bGVuIFVOVVNFRF9QQVJBTSkKK3sKKyAgKHZvaWQpc2hhMjU2bGVuOworICBtYmVkdGxzX3NoYTI1NihpbnB1dCwgaW5wdXRsZW4sIHNoYTI1NnN1bSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkICpDdXJsX21iZWR0bHNfZ2V0X2ludGVybmFscyhzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMSU5GTyBpbmZvIFVOVVNFRF9QQVJBTSkKK3sKKyAgKHZvaWQpaW5mbzsKKyAgcmV0dXJuICZCQUNLRU5ELT5zc2w7Cit9CisKK2NvbnN0IHN0cnVjdCBDdXJsX3NzbCBDdXJsX3NzbF9tYmVkdGxzID0geworICB7IENVUkxTU0xCQUNLRU5EX01CRURUTFMsICJtYmVkdGxzIiB9LCAvKiBpbmZvICovCisKKyAgMSwgLyogaGF2ZV9jYV9wYXRoICovCisgIDAsIC8qIGhhdmVfY2VydGluZm8gKi8KKyAgMSwgLyogaGF2ZV9waW5uZWRwdWJrZXkgKi8KKyAgMSwgLyogaGF2ZV9zc2xfY3R4ICovCisgIDAsIC8qIHN1cHBvcnRfaHR0cHNfcHJveHkgKi8KKworICBzaXplb2Yoc3RydWN0IHNzbF9iYWNrZW5kX2RhdGEpLAorCisgIEN1cmxfbWJlZHRsc19pbml0LCAgICAgICAgICAgICAgICAvKiBpbml0ICovCisgIEN1cmxfbWJlZHRsc19jbGVhbnVwLCAgICAgICAgICAgICAvKiBjbGVhbnVwICovCisgIEN1cmxfbWJlZHRsc192ZXJzaW9uLCAgICAgICAgICAgICAvKiB2ZXJzaW9uICovCisgIEN1cmxfbm9uZV9jaGVja19jeG4sICAgICAgICAgICAgICAvKiBjaGVja19jeG4gKi8KKyAgQ3VybF9ub25lX3NodXRkb3duLCAgICAgICAgICAgICAgIC8qIHNodXRkb3duICovCisgIEN1cmxfbWJlZHRsc19kYXRhX3BlbmRpbmcsICAgICAgICAvKiBkYXRhX3BlbmRpbmcgKi8KKyAgQ3VybF9tYmVkdGxzX3JhbmRvbSwgICAgICAgICAgICAgIC8qIHJhbmRvbSAqLworICBDdXJsX25vbmVfY2VydF9zdGF0dXNfcmVxdWVzdCwgICAgLyogY2VydF9zdGF0dXNfcmVxdWVzdCAqLworICBDdXJsX21iZWR0bHNfY29ubmVjdCwgICAgICAgICAgICAgLyogY29ubmVjdCAqLworICBDdXJsX21iZWR0bHNfY29ubmVjdF9ub25ibG9ja2luZywgLyogY29ubmVjdF9ub25ibG9ja2luZyAqLworICBDdXJsX21iZWR0bHNfZ2V0X2ludGVybmFscywgICAgICAgLyogZ2V0X2ludGVybmFscyAqLworICBDdXJsX21iZWR0bHNfY2xvc2UsICAgICAgICAgICAgICAgLyogY2xvc2UgKi8KKyAgQ3VybF9tYmVkdGxzX2Nsb3NlX2FsbCwgICAgICAgICAgIC8qIGNsb3NlX2FsbCAqLworICBDdXJsX21iZWR0bHNfc2Vzc2lvbl9mcmVlLCAgICAgICAgLyogc2Vzc2lvbl9mcmVlICovCisgIEN1cmxfbm9uZV9zZXRfZW5naW5lLCAgICAgICAgICAgICAvKiBzZXRfZW5naW5lICovCisgIEN1cmxfbm9uZV9zZXRfZW5naW5lX2RlZmF1bHQsICAgICAvKiBzZXRfZW5naW5lX2RlZmF1bHQgKi8KKyAgQ3VybF9ub25lX2VuZ2luZXNfbGlzdCwgICAgICAgICAgIC8qIGVuZ2luZXNfbGlzdCAqLworICBDdXJsX25vbmVfZmFsc2Vfc3RhcnQsICAgICAgICAgICAgLyogZmFsc2Vfc3RhcnQgKi8KKyAgQ3VybF9ub25lX21kNXN1bSwgICAgICAgICAgICAgICAgIC8qIG1kNXN1bSAqLworICBDdXJsX21iZWR0bHNfc2hhMjU2c3VtICAgICAgICAgICAgLyogc2hhMjU2c3VtICovCit9OworCiAjZW5kaWYgLyogVVNFX01CRURUTFMgKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvbWJlZHRscy5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9tYmVkdGxzLmgKaW5kZXggNzFkMTdhNC4uNGE5Mzg2MCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9tYmVkdGxzLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9tYmVkdGxzLmgKQEAgLTI2LDU3ICsyNiw3IEBACiAKICNpZmRlZiBVU0VfTUJFRFRMUwogCi0jaW5jbHVkZSA8bWJlZHRscy9zaGEyNTYuaD4KLQotLyogQ2FsbGVkIG9uIGZpcnN0IHVzZSBtYmVkVExTLCBzZXR1cCB0aHJlYWRpbmcgaWYgc3VwcG9ydGVkICovCi1pbnQgIEN1cmxfbWJlZHRsc19pbml0KHZvaWQpOwotdm9pZCBDdXJsX21iZWR0bHNfY2xlYW51cCh2b2lkKTsKLWludCBDdXJsX21iZWR0bHNfZGF0YV9wZW5kaW5nKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci0KLUNVUkxjb2RlIEN1cmxfbWJlZHRsc19jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci0KLUNVUkxjb2RlIEN1cmxfbWJlZHRsc19jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmRvbmUpOwotCi0vKiB0ZWxsIG1iZWRUTFMgdG8gY2xvc2UgZG93biBhbGwgb3BlbiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29ubmVjdGlvbnMgKGFuZAotICAgdGh1cyBzZXNzaW9uIElEIGNhY2hpbmcgZXRjKSAqLwotdm9pZCBDdXJsX21iZWR0bHNfY2xvc2VfYWxsKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpOwotCi0gLyogY2xvc2UgYSBTU0wgY29ubmVjdGlvbiAqLwotdm9pZCBDdXJsX21iZWR0bHNfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLQotdm9pZCBDdXJsX21iZWR0bHNfc2Vzc2lvbl9mcmVlKHZvaWQgKnB0cik7Ci1zaXplX3QgQ3VybF9tYmVkdGxzX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci1pbnQgQ3VybF9tYmVkdGxzX3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci0KLUNVUkxjb2RlIEN1cmxfbWJlZHRsc19yYW5kb20oc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgdW5zaWduZWQgY2hhciAqZW50cm9weSwKLSAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpOwotCi0vKiB0aGlzIGJhY2tlbmRzIHN1cHBvcnRzIENVUkxPUFRfUElOTkVEUFVCTElDS0VZICovCi0jZGVmaW5lIGhhdmVfY3VybHNzbF9waW5uZWRwdWJrZXkgMQotCi0vKiB0aGlzIGJhY2tlbmQgc3VwcG9ydHMgQ1VSTE9QVF9TU0xfQ1RYXyogKi8KLSNkZWZpbmUgaGF2ZV9jdXJsc3NsX3NzbF9jdHggMQotCi0vKiBBUEkgc2V0dXAgZm9yIG1iZWRUTFMgKi8KLSNkZWZpbmUgY3VybHNzbF9pbml0KCkgQ3VybF9tYmVkdGxzX2luaXQoKQotI2RlZmluZSBjdXJsc3NsX2NsZWFudXAoKSBDdXJsX21iZWR0bHNfY2xlYW51cCgpCi0jZGVmaW5lIGN1cmxzc2xfY29ubmVjdCBDdXJsX21iZWR0bHNfY29ubmVjdAotI2RlZmluZSBjdXJsc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcgQ3VybF9tYmVkdGxzX2Nvbm5lY3Rfbm9uYmxvY2tpbmcKLSNkZWZpbmUgY3VybHNzbF9zZXNzaW9uX2ZyZWUoeCkgIEN1cmxfbWJlZHRsc19zZXNzaW9uX2ZyZWUoeCkKLSNkZWZpbmUgY3VybHNzbF9jbG9zZV9hbGwgQ3VybF9tYmVkdGxzX2Nsb3NlX2FsbAotI2RlZmluZSBjdXJsc3NsX2Nsb3NlIEN1cmxfbWJlZHRsc19jbG9zZQotI2RlZmluZSBjdXJsc3NsX3NodXRkb3duKHgseSkgMAotI2RlZmluZSBjdXJsc3NsX3NldF9lbmdpbmUoeCx5KSAoeD14LCB5PXksIENVUkxFX05PVF9CVUlMVF9JTikKLSNkZWZpbmUgY3VybHNzbF9zZXRfZW5naW5lX2RlZmF1bHQoeCkgKHg9eCwgQ1VSTEVfTk9UX0JVSUxUX0lOKQotI2RlZmluZSBjdXJsc3NsX2VuZ2luZXNfbGlzdCh4KSAoeD14LCAoc3RydWN0IGN1cmxfc2xpc3QgKilOVUxMKQotI2RlZmluZSBjdXJsc3NsX3ZlcnNpb24gQ3VybF9tYmVkdGxzX3ZlcnNpb24KLSNkZWZpbmUgY3VybHNzbF9jaGVja19jeG4oeCkgKHg9eCwgLTEpCi0jZGVmaW5lIGN1cmxzc2xfZGF0YV9wZW5kaW5nKHgseSkgQ3VybF9tYmVkdGxzX2RhdGFfcGVuZGluZyh4LCB5KQotI2RlZmluZSBDVVJMX1NTTF9CQUNLRU5EIENVUkxTU0xCQUNLRU5EX01CRURUTFMKLSNkZWZpbmUgY3VybHNzbF9zaGEyNTZzdW0oYSxiLGMsZCkgbWJlZHRsc19zaGEyNTYoYSxiLGMsMCkKLSNkZWZpbmUgY3VybHNzbF9yYW5kb20oeCx5LHopIEN1cmxfbWJlZHRsc19yYW5kb20oeCwgeSwgeikKK2V4dGVybiBjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgQ3VybF9zc2xfbWJlZHRsczsKIAogI2VuZGlmIC8qIFVTRV9NQkVEVExTICovCiAjZW5kaWYgLyogSEVBREVSX0NVUkxfTUJFRFRMU19IICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL25zcy5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9uc3MuYwppbmRleCBjZDAxMzg5Li5jMGI3ZTYzIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL25zcy5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvbnNzLmMKQEAgLTc4LDYgKzc4LDE2IEBACiAvKiBlbm91Z2ggdG8gZml0IHRoZSBzdHJpbmcgIlBFTSBUb2tlbiAjWzB8MV0iICovCiAjZGVmaW5lIFNMT1RTSVpFIDEzCiAKK3N0cnVjdCBzc2xfYmFja2VuZF9kYXRhIHsKKyAgUFJGaWxlRGVzYyAqaGFuZGxlOworICBjaGFyICpjbGllbnRfbmlja25hbWU7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGE7CisgIHN0cnVjdCBjdXJsX2xsaXN0IG9ial9saXN0OworICBQSzExR2VuZXJpY09iamVjdCAqb2JqX2NsaWNlcnQ7Cit9OworCisjZGVmaW5lIEJBQ0tFTkQgY29ubnNzbC0+YmFja2VuZAorCiBzdGF0aWMgUFJMb2NrICpuc3NfaW5pdGxvY2sgPSBOVUxMOwogc3RhdGljIFBSTG9jayAqbnNzX2NybGxvY2sgPSBOVUxMOwogc3RhdGljIFBSTG9jayAqbnNzX2ZpbmRzbG90X2xvY2sgPSBOVUxMOwpAQCAtMjcxLDcgKzI4MSw3IEBACiAKICAgICBmb3VuZCA9IFBSX0ZBTFNFOwogCi0gICAgZm9yKGk9MDsgaTxOVU1fT0ZfQ0lQSEVSUzsgaSsrKSB7CisgICAgZm9yKGkgPSAwOyBpPE5VTV9PRl9DSVBIRVJTOyBpKyspIHsKICAgICAgIGlmKHN0cmNhc2Vjb21wYXJlKGNpcGhlciwgY2lwaGVybGlzdFtpXS5uYW1lKSkgewogICAgICAgICBjaXBoZXJfc3RhdGVbaV0gPSBQUl9UUlVFOwogICAgICAgICBmb3VuZCA9IFBSX1RSVUU7CkBAIC0yOTAsNyArMzAwLDcgQEAKICAgfQogCiAgIC8qIEZpbmFsbHkgYWN0dWFsbHkgZW5hYmxlIHRoZSBzZWxlY3RlZCBjaXBoZXJzICovCi0gIGZvcihpPTA7IGk8TlVNX09GX0NJUEhFUlM7IGkrKykgeworICBmb3IoaSA9IDA7IGk8TlVNX09GX0NJUEhFUlM7IGkrKykgewogICAgIGlmKCFjaXBoZXJfc3RhdGVbaV0pCiAgICAgICBjb250aW51ZTsKIApAQCAtMzExLDcgKzMyMSw3IEBACiB7CiAgIHVuc2lnbmVkIGludCBpOwogCi0gIGZvcihpPTA7IGk8TlVNX09GX0NJUEhFUlM7IGkrKykgeworICBmb3IoaSA9IDA7IGk8TlVNX09GX0NJUEhFUlM7IGkrKykgewogICAgIFBSSW50MzIgcG9saWN5ID0gMDsKICAgICBTU0xfQ2lwaGVyUG9saWN5R2V0KGNpcGhlcmxpc3RbaV0ubnVtLCAmcG9saWN5KTsKICAgICBpZihwb2xpY3kpCkBAIC0zOTYsNyArNDA2LDcgQEAKIC8qIENhbGwgUEsxMV9DcmVhdGVHZW5lcmljT2JqZWN0KCkgd2l0aCB0aGUgZ2l2ZW4gb2JqX2NsYXNzIGFuZCBmaWxlbmFtZS4gIElmCiAgKiB0aGUgY2FsbCBzdWNjZWVkcywgYXBwZW5kIHRoZSBvYmplY3QgaGFuZGxlIHRvIHRoZSBsaXN0IG9mIG9iamVjdHMgc28gdGhhdAogICogdGhlIG9iamVjdCBjYW4gYmUgZGVzdHJveWVkIGluIEN1cmxfbnNzX2Nsb3NlKCkuICovCi1zdGF0aWMgQ1VSTGNvZGUgbnNzX2NyZWF0ZV9vYmplY3Qoc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKnNzbCwKK3N0YXRpYyBDVVJMY29kZSBuc3NfY3JlYXRlX29iamVjdChzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDS19PQkpFQ1RfQ0xBU1Mgb2JqX2NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBib29sIGNhY2VydCkKIHsKQEAgLTQzNSwxNCArNDQ1LDE0IEBACiAgIGlmKCFvYmopCiAgICAgcmV0dXJuIHJlc3VsdDsKIAotICBpZihpbnNlcnRfd3JhcHBlZF9wdHIoJnNzbC0+b2JqX2xpc3QsIG9iaikgIT0gQ1VSTEVfT0spIHsKKyAgaWYoaW5zZXJ0X3dyYXBwZWRfcHRyKCZCQUNLRU5ELT5vYmpfbGlzdCwgb2JqKSAhPSBDVVJMRV9PSykgewogICAgIFBLMTFfRGVzdHJveUdlbmVyaWNPYmplY3Qob2JqKTsKICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgfQogCiAgIGlmKCFjYWNlcnQgJiYgQ0tPX0NFUlRJRklDQVRFID09IG9ial9jbGFzcykKICAgICAvKiBzdG9yZSByZWZlcmVuY2UgdG8gYSBjbGllbnQgY2VydGlmaWNhdGUgKi8KLSAgICBzc2wtPm9ial9jbGljZXJ0ID0gb2JqOworICAgIEJBQ0tFTkQtPm9ial9jbGljZXJ0ID0gb2JqOwogCiAgIHJldHVybiBDVVJMRV9PSzsKIH0KQEAgLTk5Miw3ICsxMDAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqaXNzdWVyX25pY2tuYW1lKQogewogICBDRVJUQ2VydGlmaWNhdGUgKmNlcnQsICpjZXJ0X2lzc3VlciwgKmlzc3VlcjsKLSAgU0VDU3RhdHVzIHJlcz1TRUNTdWNjZXNzOworICBTRUNTdGF0dXMgcmVzID0gU0VDU3VjY2VzczsKICAgdm9pZCAqcHJvdG9fd2luID0gTlVMTDsKIAogICBjZXJ0ID0gU1NMX1BlZXJDZXJ0aWZpY2F0ZShzb2NrKTsKQEAgLTEwMDQsNyArMTAxNCw3IEBACiAgIGlmKCghY2VydF9pc3N1ZXIpIHx8ICghaXNzdWVyKSkKICAgICByZXMgPSBTRUNGYWlsdXJlOwogICBlbHNlIGlmKFNFQ0lURU1fQ29tcGFyZUl0ZW0oJmNlcnRfaXNzdWVyLT5kZXJDZXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzc3Vlci0+ZGVyQ2VydCkhPVNFQ0VxdWFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzc3Vlci0+ZGVyQ2VydCkgIT0gU0VDRXF1YWwpCiAgICAgcmVzID0gU0VDRmFpbHVyZTsKIAogICBDRVJUX0Rlc3Ryb3lDZXJ0aWZpY2F0ZShjZXJ0KTsKQEAgLTEwMTcsNyArMTAyNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBpbm5lZHB1YmtleSkKIHsKICAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfU1NMX1BJTk5FRFBVQktFWU5PVE1BVENIOwotICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubnNzbC0+ZGF0YTsKKyAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IEJBQ0tFTkQtPmRhdGE7CiAgIENFUlRDZXJ0aWZpY2F0ZSAqY2VydDsKIAogICBpZighcGlubmVkcHVia2V5KQpAQCAtMTAyNSw3ICsxMDM1LDcgQEAKICAgICByZXR1cm4gQ1VSTEVfT0s7CiAKICAgLyogZ2V0IHBlZXIgY2VydGlmaWNhdGUgKi8KLSAgY2VydCA9IFNTTF9QZWVyQ2VydGlmaWNhdGUoY29ubnNzbC0+aGFuZGxlKTsKKyAgY2VydCA9IFNTTF9QZWVyQ2VydGlmaWNhdGUoQkFDS0VORC0+aGFuZGxlKTsKICAgaWYoY2VydCkgewogICAgIC8qIGV4dHJhY3QgcHVibGljIGtleSBmcm9tIHBlZXIgY2VydGlmaWNhdGUgKi8KICAgICBTRUNLRVlQdWJsaWNLZXkgKnB1YmtleSA9IENFUlRfRXh0cmFjdFB1YmxpY0tleShjZXJ0KTsKQEAgLTEwNjksMTEgKzEwNzksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgU0VDS0VZUHJpdmF0ZUtleVN0ciAqKnBSZXRLZXkpCiB7CiAgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gKHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICopYXJnOwotICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubnNzbC0+ZGF0YTsKLSAgY29uc3QgY2hhciAqbmlja25hbWUgPSBjb25uc3NsLT5jbGllbnRfbmlja25hbWU7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBCQUNLRU5ELT5kYXRhOworICBjb25zdCBjaGFyICpuaWNrbmFtZSA9IEJBQ0tFTkQtPmNsaWVudF9uaWNrbmFtZTsKICAgc3RhdGljIGNvbnN0IGNoYXIgcGVtX3Nsb3RuYW1lW10gPSAiUEVNIFRva2VuICMxIjsKIAotICBpZihjb25uc3NsLT5vYmpfY2xpY2VydCkgeworICBpZihCQUNLRU5ELT5vYmpfY2xpY2VydCkgewogICAgIC8qIHVzZSB0aGUgY2VydC9rZXkgcHJvdmlkZWQgYnkgUEVNIHJlYWRlciAqLwogICAgIFNFQ0l0ZW0gY2VydF9kZXIgPSB7IDAsIE5VTEwsIDAgfTsKICAgICB2b2lkICpwcm90b193aW4gPSBTU0xfUmV2ZWFsUGluQXJnKHNvY2spOwpAQCAtMTA4Niw3ICsxMDk2LDcgQEAKICAgICAgIHJldHVybiBTRUNGYWlsdXJlOwogICAgIH0KIAotICAgIGlmKFBLMTFfUmVhZFJhd0F0dHJpYnV0ZShQSzExX1R5cGVHZW5lcmljLCBjb25uc3NsLT5vYmpfY2xpY2VydCwgQ0tBX1ZBTFVFLAorICAgIGlmKFBLMTFfUmVhZFJhd0F0dHJpYnV0ZShQSzExX1R5cGVHZW5lcmljLCBCQUNLRU5ELT5vYmpfY2xpY2VydCwgQ0tBX1ZBTFVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2VydF9kZXIpICE9IFNFQ1N1Y2Nlc3MpIHsKICAgICAgIGZhaWxmKGRhdGEsICJOU1M6IENLQV9WQUxVRSBub3QgZm91bmQgaW4gUEsxMSBnZW5lcmljIG9iamVjdCIpOwogICAgICAgUEsxMV9GcmVlU2xvdChzbG90KTsKQEAgLTEzNTEsNyArMTM2MSw3IEBACiAgKiBAcmV0dmFsIDAgZXJyb3IgaW5pdGlhbGl6aW5nIFNTTAogICogQHJldHZhbCAxIFNTTCBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkKICAqLwotaW50IEN1cmxfbnNzX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgQ3VybF9uc3NfaW5pdCh2b2lkKQogewogICAvKiBjdXJsX2dsb2JhbF9pbml0KCkgaXMgbm90IHRocmVhZC1zYWZlIHNvIHRoaXMgdGVzdCBpcyBvayAqLwogICBpZihuc3NfaW5pdGxvY2sgPT0gTlVMTCkgewpAQCAtMTM4Niw3ICsxMzk2LDcgQEAKIH0KIAogLyogR2xvYmFsIGNsZWFudXAgKi8KLXZvaWQgQ3VybF9uc3NfY2xlYW51cCh2b2lkKQorc3RhdGljIHZvaWQgQ3VybF9uc3NfY2xlYW51cCh2b2lkKQogewogICAvKiBUaGlzIGZ1bmN0aW9uIGlzbid0IHJlcXVpcmVkIHRvIGJlIHRocmVhZHNhZmUgYW5kIHRoaXMgaXMgb25seSBkb25lCiAgICAqIGFzIGEgc2FmZXR5IGZlYXR1cmUuCkBAIC0xNDI2LDE0ICsxNDM2LDE0IEBACiAgKiAgICAgMCBtZWFucyB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQKICAqICAgIC0xIG1lYW5zIHRoZSBjb25uZWN0aW9uIHN0YXR1cyBpcyB1bmtub3duCiAgKi8KLWludAotQ3VybF9uc3NfY2hlY2tfY3huKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKK3N0YXRpYyBpbnQgQ3VybF9uc3NfY2hlY2tfY3huKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKIHsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW0ZJUlNUU09DS0VUXTsKICAgaW50IHJjOwogICBjaGFyIGJ1ZjsKIAogICByYyA9Ci0gICAgUFJfUmVjdihjb25uLT5zc2xbRklSU1RTT0NLRVRdLmhhbmRsZSwgKHZvaWQgKikmYnVmLCAxLCBQUl9NU0dfUEVFSywKKyAgICBQUl9SZWN2KEJBQ0tFTkQtPmhhbmRsZSwgKHZvaWQgKikmYnVmLCAxLCBQUl9NU0dfUEVFSywKICAgICAgICAgICAgIFBSX1NlY29uZHNUb0ludGVydmFsKDEpKTsKICAgaWYocmMgPiAwKQogICAgIHJldHVybiAxOyAvKiBjb25uZWN0aW9uIHN0aWxsIGluIHBsYWNlICovCkBAIC0xNDQ3LDQ4ICsxNDU3LDQ5IEBACiBzdGF0aWMgdm9pZCBuc3NfY2xvc2Uoc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wpCiB7CiAgIC8qIGJlZm9yZSB0aGUgY2xlYW51cCwgY2hlY2sgd2hldGhlciB3ZSBhcmUgdXNpbmcgYSBjbGllbnQgY2VydGlmaWNhdGUgKi8KLSAgY29uc3QgYm9vbCBjbGllbnRfY2VydCA9IChjb25uc3NsLT5jbGllbnRfbmlja25hbWUgIT0gTlVMTCkKLSAgICB8fCAoY29ubnNzbC0+b2JqX2NsaWNlcnQgIT0gTlVMTCk7CisgIGNvbnN0IGJvb2wgY2xpZW50X2NlcnQgPSAoQkFDS0VORC0+Y2xpZW50X25pY2tuYW1lICE9IE5VTEwpCisgICAgfHwgKEJBQ0tFTkQtPm9ial9jbGljZXJ0ICE9IE5VTEwpOwogCi0gIGZyZWUoY29ubnNzbC0+Y2xpZW50X25pY2tuYW1lKTsKLSAgY29ubnNzbC0+Y2xpZW50X25pY2tuYW1lID0gTlVMTDsKKyAgZnJlZShCQUNLRU5ELT5jbGllbnRfbmlja25hbWUpOworICBCQUNLRU5ELT5jbGllbnRfbmlja25hbWUgPSBOVUxMOwogCiAgIC8qIGRlc3Ryb3kgYWxsIE5TUyBvYmplY3RzIGluIG9yZGVyIHRvIGF2b2lkIGZhaWx1cmUgb2YgTlNTIHNodXRkb3duICovCi0gIEN1cmxfbGxpc3RfZGVzdHJveSgmY29ubnNzbC0+b2JqX2xpc3QsIE5VTEwpOwotICBjb25uc3NsLT5vYmpfY2xpY2VydCA9IE5VTEw7CisgIEN1cmxfbGxpc3RfZGVzdHJveSgmQkFDS0VORC0+b2JqX2xpc3QsIE5VTEwpOworICBCQUNLRU5ELT5vYmpfY2xpY2VydCA9IE5VTEw7CiAKLSAgaWYoY29ubnNzbC0+aGFuZGxlKSB7CisgIGlmKEJBQ0tFTkQtPmhhbmRsZSkgewogICAgIGlmKGNsaWVudF9jZXJ0KQogICAgICAgLyogQSBzZXJ2ZXIgbWlnaHQgcmVxdWlyZSBkaWZmZXJlbnQgYXV0aGVudGljYXRpb24gYmFzZWQgb24gdGhlCiAgICAgICAgKiBwYXJ0aWN1bGFyIHBhdGggYmVpbmcgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuICBUbyBzdXBwb3J0IHRoaXMKICAgICAgICAqIHNjZW5hcmlvLCB3ZSBtdXN0IGVuc3VyZSB0aGF0IGEgY29ubmVjdGlvbiB3aWxsIG5ldmVyIHJldXNlIHRoZQogICAgICAgICogYXV0aGVudGljYXRpb24gZGF0YSBmcm9tIGEgcHJldmlvdXMgY29ubmVjdGlvbi4gKi8KLSAgICAgIFNTTF9JbnZhbGlkYXRlU2Vzc2lvbihjb25uc3NsLT5oYW5kbGUpOworICAgICAgU1NMX0ludmFsaWRhdGVTZXNzaW9uKEJBQ0tFTkQtPmhhbmRsZSk7CiAKLSAgICBQUl9DbG9zZShjb25uc3NsLT5oYW5kbGUpOwotICAgIGNvbm5zc2wtPmhhbmRsZSA9IE5VTEw7CisgICAgUFJfQ2xvc2UoQkFDS0VORC0+aGFuZGxlKTsKKyAgICBCQUNLRU5ELT5oYW5kbGUgPSBOVUxMOwogICB9CiB9CiAKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIFNTTCBjb25uZWN0aW9uIGlzIGNsb3NlZC4KICAqLwotdm9pZCBDdXJsX25zc19jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCitzdGF0aWMgdm9pZCBDdXJsX25zc19jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CiAgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwogICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbF9wcm94eSA9ICZjb25uLT5wcm94eV9zc2xbc29ja2luZGV4XTsKIAotICBpZihjb25uc3NsLT5oYW5kbGUgfHwgY29ubnNzbF9wcm94eS0+aGFuZGxlKSB7CisgIGlmKEJBQ0tFTkQtPmhhbmRsZSB8fCBjb25uc3NsX3Byb3h5LT5iYWNrZW5kLT5oYW5kbGUpIHsKICAgICAvKiBOU1MgY2xvc2VzIHRoZSBzb2NrZXQgd2UgcHJldmlvdXNseSBoYW5kZWQgdG8gaXQsIHNvIHdlIG11c3QgbWFyayBpdAogICAgICAgIGFzIGNsb3NlZCB0byBhdm9pZCBkb3VibGUgY2xvc2UgKi8KICAgICBmYWtlX3NjbG9zZShjb25uLT5zb2NrW3NvY2tpbmRleF0pOwogICAgIGNvbm4tPnNvY2tbc29ja2luZGV4XSA9IENVUkxfU09DS0VUX0JBRDsKICAgfQogCi0gIGlmKGNvbm5zc2wtPmhhbmRsZSkKLSAgICAvKiBuc3NfY2xvc2UoY29ubnNzbCkgd2lsbCB0cmFuc2l0aXZlbHkgY2xvc2UgYWxzbyBjb25uc3NsX3Byb3h5LT5oYW5kbGUKLSAgICAgICBpZiBib3RoIGFyZSB1c2VkLiBDbGVhciBpdCB0byBhdm9pZCBhIGRvdWJsZSBjbG9zZSBsZWFkaW5nIHRvIGNyYXNoLiAqLwotICAgIGNvbm5zc2xfcHJveHktPmhhbmRsZSA9IE5VTEw7CisgIGlmKEJBQ0tFTkQtPmhhbmRsZSkKKyAgICAvKiBuc3NfY2xvc2UoY29ubnNzbCkgd2lsbCB0cmFuc2l0aXZlbHkgY2xvc2UgYWxzbworICAgICAgIGNvbm5zc2xfcHJveHktPmJhY2tlbmQtPmhhbmRsZSBpZiBib3RoIGFyZSB1c2VkLiBDbGVhciBpdCB0byBhdm9pZAorICAgICAgIGEgZG91YmxlIGNsb3NlIGxlYWRpbmcgdG8gY3Jhc2guICovCisgICAgY29ubnNzbF9wcm94eS0+YmFja2VuZC0+aGFuZGxlID0gTlVMTDsKIAogICBuc3NfY2xvc2UoY29ubnNzbCk7CiAgIG5zc19jbG9zZShjb25uc3NsX3Byb3h5KTsKQEAgLTE3MzIsNyArMTc0Myw3IEBACiAgIH0KIAogICAvKiBjbGVhbnVwIG9uIGNvbm5lY3Rpb24gZmFpbHVyZSAqLwotICBDdXJsX2xsaXN0X2Rlc3Ryb3koJmNvbm5zc2wtPm9ial9saXN0LCBOVUxMKTsKKyAgQ3VybF9sbGlzdF9kZXN0cm95KCZCQUNLRU5ELT5vYmpfbGlzdCwgTlVMTCk7CiAKICAgcmV0dXJuIGN1cmxlcnI7CiB9CkBAIC0xNzQ2LDcgKzE3NTcsNyBAQAogICBzb2NrX29wdC5vcHRpb24gPSBQUl9Tb2NrT3B0X05vbmJsb2NraW5nOwogICBzb2NrX29wdC52YWx1ZS5ub25fYmxvY2tpbmcgPSAhYmxvY2tpbmc7CiAKLSAgaWYoUFJfU2V0U29ja2V0T3B0aW9uKGNvbm5zc2wtPmhhbmRsZSwgJnNvY2tfb3B0KSAhPSBQUl9TVUNDRVNTKQorICBpZihQUl9TZXRTb2NrZXRPcHRpb24oQkFDS0VORC0+aGFuZGxlLCAmc29ja19vcHQpICE9IFBSX1NVQ0NFU1MpCiAgICAgcmV0dXJuIG5zc19mYWlsX2Nvbm5lY3QoY29ubnNzbCwgZGF0YSwgQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1IpOwogCiAgIHJldHVybiBDVVJMRV9PSzsKQEAgLTE3NzAsMTAgKzE3ODEsMTAgQEAKICAgICBTU0xfTElCUkFSWV9WRVJTSU9OX1RMU18xXzAgICAvKiBtYXggKi8KICAgfTsKIAotICBjb25uc3NsLT5kYXRhID0gZGF0YTsKKyAgQkFDS0VORC0+ZGF0YSA9IGRhdGE7CiAKICAgLyogbGlzdCBvZiBhbGwgTlNTIG9iamVjdHMgd2UgbmVlZCB0byBkZXN0cm95IGluIEN1cmxfbnNzX2Nsb3NlKCkgKi8KLSAgQ3VybF9sbGlzdF9pbml0KCZjb25uc3NsLT5vYmpfbGlzdCwgbnNzX2Rlc3Ryb3lfb2JqZWN0KTsKKyAgQ3VybF9sbGlzdF9pbml0KCZCQUNLRU5ELT5vYmpfbGlzdCwgbnNzX2Rlc3Ryb3lfb2JqZWN0KTsKIAogICAvKiBGSVhNRS4gTlNTIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aXBsZSBkYXRhYmFzZXMgb3BlbiBhdCB0aGUgc2FtZSB0aW1lLiAqLwogICBQUl9Mb2NrKG5zc19pbml0bG9jayk7CkBAIC0xODgyLDcgKzE4OTMsNyBAQAogICAgIGNoYXIgKm5pY2tuYW1lID0gZHVwX25pY2tuYW1lKGRhdGEsIFNTTF9TRVRfT1BUSU9OKGNlcnQpKTsKICAgICBpZihuaWNrbmFtZSkgewogICAgICAgLyogd2UgYXJlIG5vdCBnb2luZyB0byB1c2UgbGlibnNzcGVtLnNvIHRvIHJlYWQgdGhlIGNsaWVudCBjZXJ0ICovCi0gICAgICBjb25uc3NsLT5vYmpfY2xpY2VydCA9IE5VTEw7CisgICAgICBCQUNLRU5ELT5vYmpfY2xpY2VydCA9IE5VTEw7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgQ1VSTGNvZGUgcnYgPSBjZXJ0X3N0dWZmKGNvbm4sIHNvY2tpbmRleCwgU1NMX1NFVF9PUFRJT04oY2VydCksCkBAIC0xODk1LDEwICsxOTA2LDEwIEBACiAgICAgfQogCiAgICAgLyogc3RvcmUgdGhlIG5pY2tuYW1lIGZvciBTZWxlY3RDbGllbnRDZXJ0KCkgY2FsbGVkIGR1cmluZyBoYW5kc2hha2UgKi8KLSAgICBjb25uc3NsLT5jbGllbnRfbmlja25hbWUgPSBuaWNrbmFtZTsKKyAgICBCQUNLRU5ELT5jbGllbnRfbmlja25hbWUgPSBuaWNrbmFtZTsKICAgfQogICBlbHNlCi0gICAgY29ubnNzbC0+Y2xpZW50X25pY2tuYW1lID0gTlVMTDsKKyAgICBCQUNLRU5ELT5jbGllbnRfbmlja25hbWUgPSBOVUxMOwogCiAgIGlmKFNTTF9HZXRDbGllbnRBdXRoRGF0YUhvb2sobW9kZWwsIFNlbGVjdENsaWVudENlcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljb25uc3NsKSAhPSBTRUNTdWNjZXNzKSB7CkBAIC0xOTA4LDggKzE5MTksOCBAQAogCiAgIGlmKGNvbm4tPnByb3h5X3NzbFtzb2NraW5kZXhdLnVzZSkgewogICAgIERFQlVHQVNTRVJUKHNzbF9jb25uZWN0aW9uX2NvbXBsZXRlID09IGNvbm4tPnByb3h5X3NzbFtzb2NraW5kZXhdLnN0YXRlKTsKLSAgICBERUJVR0FTU0VSVChjb25uLT5wcm94eV9zc2xbc29ja2luZGV4XS5oYW5kbGUgIT0gTlVMTCk7Ci0gICAgbnNwcl9pbyA9IGNvbm4tPnByb3h5X3NzbFtzb2NraW5kZXhdLmhhbmRsZTsKKyAgICBERUJVR0FTU0VSVChjb25uLT5wcm94eV9zc2xbc29ja2luZGV4XS5iYWNrZW5kLT5oYW5kbGUgIT0gTlVMTCk7CisgICAgbnNwcl9pbyA9IGNvbm4tPnByb3h5X3NzbFtzb2NraW5kZXhdLmJhY2tlbmQtPmhhbmRsZTsKICAgICBzZWNvbmRfbGF5ZXIgPSBUUlVFOwogICB9CiAgIGVsc2UgewpAQCAtMTkzOSw4ICsxOTUwLDggQEAKICAgfQogCiAgIC8qIGltcG9ydCBvdXIgbW9kZWwgc29ja2V0IG9udG8gdGhlIGN1cnJlbnQgSS9PIHN0YWNrICovCi0gIGNvbm5zc2wtPmhhbmRsZSA9IFNTTF9JbXBvcnRGRChtb2RlbCwgbnNwcl9pbyk7Ci0gIGlmKCFjb25uc3NsLT5oYW5kbGUpIHsKKyAgQkFDS0VORC0+aGFuZGxlID0gU1NMX0ltcG9ydEZEKG1vZGVsLCBuc3ByX2lvKTsKKyAgaWYoIUJBQ0tFTkQtPmhhbmRsZSkgewogICAgIGlmKCFzZWNvbmRfbGF5ZXIpCiAgICAgICBQUl9DbG9zZShuc3ByX2lvKTsKICAgICBnb3RvIGVycm9yOwpAQCAtMTk1MSwzNiArMTk2MiwzNiBAQAogCiAgIC8qIFRoaXMgaXMgdGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2VydCB0aGF0IHdlJ3JlIHVzaW5nICovCiAgIGlmKFNTTF9TRVRfT1BUSU9OKGtleV9wYXNzd2QpKSB7Ci0gICAgU1NMX1NldFBLQ1MxMVBpbkFyZyhjb25uc3NsLT5oYW5kbGUsIFNTTF9TRVRfT1BUSU9OKGtleV9wYXNzd2QpKTsKKyAgICBTU0xfU2V0UEtDUzExUGluQXJnKEJBQ0tFTkQtPmhhbmRsZSwgU1NMX1NFVF9PUFRJT04oa2V5X3Bhc3N3ZCkpOwogICB9CiAKICNpZmRlZiBTU0xfRU5BQkxFX09DU1BfU1RBUExJTkcKICAgaWYoU1NMX0NPTk5fQ09ORklHKHZlcmlmeXN0YXR1cykpIHsKLSAgICBpZihTU0xfT3B0aW9uU2V0KGNvbm5zc2wtPmhhbmRsZSwgU1NMX0VOQUJMRV9PQ1NQX1NUQVBMSU5HLCBQUl9UUlVFKQorICAgIGlmKFNTTF9PcHRpb25TZXQoQkFDS0VORC0+aGFuZGxlLCBTU0xfRU5BQkxFX09DU1BfU1RBUExJTkcsIFBSX1RSVUUpCiAgICAgICAgICE9IFNFQ1N1Y2Nlc3MpCiAgICAgICBnb3RvIGVycm9yOwogICB9CiAjZW5kaWYKIAogI2lmZGVmIFNTTF9FTkFCTEVfTlBOCi0gIGlmKFNTTF9PcHRpb25TZXQoY29ubnNzbC0+aGFuZGxlLCBTU0xfRU5BQkxFX05QTiwgY29ubi0+Yml0cy50bHNfZW5hYmxlX25wbgorICBpZihTU0xfT3B0aW9uU2V0KEJBQ0tFTkQtPmhhbmRsZSwgU1NMX0VOQUJMRV9OUE4sIGNvbm4tPmJpdHMudGxzX2VuYWJsZV9ucG4KICAgICAgICAgICAgICAgICAgICA/IFBSX1RSVUUgOiBQUl9GQUxTRSkgIT0gU0VDU3VjY2VzcykKICAgICBnb3RvIGVycm9yOwogI2VuZGlmCiAKICNpZmRlZiBTU0xfRU5BQkxFX0FMUE4KLSAgaWYoU1NMX09wdGlvblNldChjb25uc3NsLT5oYW5kbGUsIFNTTF9FTkFCTEVfQUxQTiwgY29ubi0+Yml0cy50bHNfZW5hYmxlX2FscG4KKyAgaWYoU1NMX09wdGlvblNldChCQUNLRU5ELT5oYW5kbGUsIFNTTF9FTkFCTEVfQUxQTiwgY29ubi0+Yml0cy50bHNfZW5hYmxlX2FscG4KICAgICAgICAgICAgICAgICAgICA/IFBSX1RSVUUgOiBQUl9GQUxTRSkgIT0gU0VDU3VjY2VzcykKICAgICBnb3RvIGVycm9yOwogI2VuZGlmCiAKICNpZiBOU1NWRVJOVU0gPj0gMHgwMzBmMDQgLyogMy4xNS40ICovCiAgIGlmKGRhdGEtPnNldC5zc2wuZmFsc2VzdGFydCkgewotICAgIGlmKFNTTF9PcHRpb25TZXQoY29ubnNzbC0+aGFuZGxlLCBTU0xfRU5BQkxFX0ZBTFNFX1NUQVJULCBQUl9UUlVFKQorICAgIGlmKFNTTF9PcHRpb25TZXQoQkFDS0VORC0+aGFuZGxlLCBTU0xfRU5BQkxFX0ZBTFNFX1NUQVJULCBQUl9UUlVFKQogICAgICAgICAhPSBTRUNTdWNjZXNzKQogICAgICAgZ290byBlcnJvcjsKIAotICAgIGlmKFNTTF9TZXRDYW5GYWxzZVN0YXJ0Q2FsbGJhY2soY29ubnNzbC0+aGFuZGxlLCBDYW5GYWxzZVN0YXJ0Q2FsbGJhY2ssCisgICAgaWYoU1NMX1NldENhbkZhbHNlU3RhcnRDYWxsYmFjayhCQUNLRU5ELT5oYW5kbGUsIENhbkZhbHNlU3RhcnRDYWxsYmFjaywKICAgICAgICAgY29ubikgIT0gU0VDU3VjY2VzcykKICAgICAgIGdvdG8gZXJyb3I7CiAgIH0KQEAgLTE5OTIsNyArMjAwMyw4IEBACiAgICAgdW5zaWduZWQgY2hhciBwcm90b2NvbHNbMTI4XTsKIAogI2lmZGVmIFVTRV9OR0hUVFAyCi0gICAgaWYoZGF0YS0+c2V0Lmh0dHB2ZXJzaW9uID49IENVUkxfSFRUUF9WRVJTSU9OXzIpIHsKKyAgICBpZihkYXRhLT5zZXQuaHR0cHZlcnNpb24gPj0gQ1VSTF9IVFRQX1ZFUlNJT05fMiAmJgorICAgICAgICghU1NMX0lTX1BST1hZKCkgfHwgIWNvbm4tPmJpdHMudHVubmVsX3Byb3h5KSkgewogICAgICAgcHJvdG9jb2xzW2N1cisrXSA9IE5HSFRUUDJfUFJPVE9fVkVSU0lPTl9JRF9MRU47CiAgICAgICBtZW1jcHkoJnByb3RvY29sc1tjdXJdLCBOR0hUVFAyX1BST1RPX1ZFUlNJT05fSUQsCiAgICAgICAgICAgTkdIVFRQMl9QUk9UT19WRVJTSU9OX0lEX0xFTik7CkBAIC0yMDAzLDI0ICsyMDE1LDI0IEBACiAgICAgbWVtY3B5KCZwcm90b2NvbHNbY3VyXSwgQUxQTl9IVFRQXzFfMSwgQUxQTl9IVFRQXzFfMV9MRU5HVEgpOwogICAgIGN1ciArPSBBTFBOX0hUVFBfMV8xX0xFTkdUSDsKIAotICAgIGlmKFNTTF9TZXROZXh0UHJvdG9OZWdvKGNvbm5zc2wtPmhhbmRsZSwgcHJvdG9jb2xzLCBjdXIpICE9IFNFQ1N1Y2Nlc3MpCisgICAgaWYoU1NMX1NldE5leHRQcm90b05lZ28oQkFDS0VORC0+aGFuZGxlLCBwcm90b2NvbHMsIGN1cikgIT0gU0VDU3VjY2VzcykKICAgICAgIGdvdG8gZXJyb3I7CiAgIH0KICNlbmRpZgogCiAKICAgLyogRm9yY2UgaGFuZHNoYWtlIG9uIG5leHQgSS9PICovCi0gIGlmKFNTTF9SZXNldEhhbmRzaGFrZShjb25uc3NsLT5oYW5kbGUsIC8qIGFzU2VydmVyICovIFBSX0ZBTFNFKQorICBpZihTU0xfUmVzZXRIYW5kc2hha2UoQkFDS0VORC0+aGFuZGxlLCAvKiBhc1NlcnZlciAqLyBQUl9GQUxTRSkKICAgICAgICE9IFNFQ1N1Y2Nlc3MpCiAgICAgZ290byBlcnJvcjsKIAogICAvKiBwcm9wYWdhdGUgaG9zdG5hbWUgdG8gdGhlIFRMUyBsYXllciAqLwotICBpZihTU0xfU2V0VVJMKGNvbm5zc2wtPmhhbmRsZSwgU1NMX0lTX1BST1hZKCkgPyBjb25uLT5odHRwX3Byb3h5Lmhvc3QubmFtZSA6CisgIGlmKFNTTF9TZXRVUkwoQkFDS0VORC0+aGFuZGxlLCBTU0xfSVNfUFJPWFkoKSA/IGNvbm4tPmh0dHBfcHJveHkuaG9zdC5uYW1lIDoKICAgICAgICAgICAgICAgICBjb25uLT5ob3N0Lm5hbWUpICE9IFNFQ1N1Y2Nlc3MpCiAgICAgZ290byBlcnJvcjsKIAogICAvKiBwcmV2ZW50IE5TUyBmcm9tIHJlLXVzaW5nIHRoZSBzZXNzaW9uIGZvciBhIGRpZmZlcmVudCBob3N0bmFtZSAqLwotICBpZihTU0xfU2V0U29ja1BlZXJJRChjb25uc3NsLT5oYW5kbGUsIFNTTF9JU19QUk9YWSgpID8KKyAgaWYoU1NMX1NldFNvY2tQZWVySUQoQkFDS0VORC0+aGFuZGxlLCBTU0xfSVNfUFJPWFkoKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4tPmh0dHBfcHJveHkuaG9zdC5uYW1lIDogY29ubi0+aG9zdC5uYW1lKQogICAgICAhPSBTRUNTdWNjZXNzKQogICAgIGdvdG8gZXJyb3I7CkBAIC0yMDU3LDcgKzIwNjksNyBAQAogCiAgIC8qIEZvcmNlIHRoZSBoYW5kc2hha2Ugbm93ICovCiAgIHRpbWVvdXQgPSBQUl9NaWxsaXNlY29uZHNUb0ludGVydmFsKChQUlVpbnQzMikgdGltZV9sZWZ0KTsKLSAgaWYoU1NMX0ZvcmNlSGFuZHNoYWtlV2l0aFRpbWVvdXQoY29ubnNzbC0+aGFuZGxlLCB0aW1lb3V0KSAhPSBTRUNTdWNjZXNzKSB7CisgIGlmKFNTTF9Gb3JjZUhhbmRzaGFrZVdpdGhUaW1lb3V0KEJBQ0tFTkQtPmhhbmRsZSwgdGltZW91dCkgIT0gU0VDU3VjY2VzcykgewogICAgIGlmKFBSX0dldEVycm9yKCkgPT0gUFJfV09VTERfQkxPQ0tfRVJST1IpCiAgICAgICAvKiBibG9ja2luZyBkaXJlY3Rpb24gaXMgdXBkYXRlZCBieSBuc3NfdXBkYXRlX2Nvbm5lY3Rpbmdfc3RhdGUoKSAqLwogICAgICAgcmV0dXJuIENVUkxFX0FHQUlOOwpAQCAtMjA2OCw3ICsyMDgwLDcgQEAKICAgICBnb3RvIGVycm9yOwogICB9CiAKLSAgcmVzdWx0ID0gZGlzcGxheV9jb25uX2luZm8oY29ubiwgY29ubnNzbC0+aGFuZGxlKTsKKyAgcmVzdWx0ID0gZGlzcGxheV9jb25uX2luZm8oY29ubiwgQkFDS0VORC0+aGFuZGxlKTsKICAgaWYocmVzdWx0KQogICAgIGdvdG8gZXJyb3I7CiAKQEAgLTIwNzcsNyArMjA4OSw3IEBACiAgICAgY2hhciAqbmlja25hbWUgPSBkdXBfbmlja25hbWUoZGF0YSwgU1NMX1NFVF9PUFRJT04oaXNzdWVyY2VydCkpOwogICAgIGlmKG5pY2tuYW1lKSB7CiAgICAgICAvKiB3ZSBzdXBwb3J0IG9ubHkgbmlja25hbWVzIGluIGNhc2Ugb2YgaXNzdWVyY2VydCBmb3Igbm93ICovCi0gICAgICByZXQgPSBjaGVja19pc3N1ZXJfY2VydChjb25uc3NsLT5oYW5kbGUsIG5pY2tuYW1lKTsKKyAgICAgIHJldCA9IGNoZWNrX2lzc3Vlcl9jZXJ0KEJBQ0tFTkQtPmhhbmRsZSwgbmlja25hbWUpOwogICAgICAgZnJlZShuaWNrbmFtZSk7CiAgICAgfQogCkBAIC0yMTYzLDEzICsyMTc1LDEzIEBACiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIAotQ1VSTGNvZGUgQ3VybF9uc3NfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9uc3NfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CiAgIHJldHVybiBuc3NfY29ubmVjdF9jb21tb24oY29ubiwgc29ja2luZGV4LCAvKiBibG9ja2luZyAqLyBOVUxMKTsKIH0KIAotQ1VSTGNvZGUgQ3VybF9uc3NfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsIGJvb2wgKmRvbmUpCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9uc3NfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LCBib29sICpkb25lKQogewogICByZXR1cm4gbnNzX2Nvbm5lY3RfY29tbW9uKGNvbm4sIHNvY2tpbmRleCwgZG9uZSk7CiB9CkBAIC0yMTgwLDggKzIxOTIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sICAgICAgICAgICAgICAgIC8qIGFtb3VudCB0byB3cml0ZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTGNvZGUgKmN1cmxjb2RlKQogewotICBzc2l6ZV90IHJjID0gUFJfU2VuZChjb25uLT5zc2xbc29ja2luZGV4XS5oYW5kbGUsIG1lbSwgKGludClsZW4sIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIFBSX0lOVEVSVkFMX05PX1dBSVQpOworICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKKyAgc3NpemVfdCByYzsKKworICAvKiBUaGUgU2VsZWN0Q2xpZW50Q2VydCgpIGhvb2sgdXNlcyB0aGlzIGZvciBpbmZvZigpIGFuZCBmYWlsZigpIGJ1dCB0aGUKKyAgICAgaGFuZGxlIHN0b3JlZCBpbiBuc3Nfc2V0dXBfY29ubmVjdCgpIGNvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGZyZWVkLiAqLworICBCQUNLRU5ELT5kYXRhID0gY29ubi0+ZGF0YTsKKworICByYyA9IFBSX1NlbmQoQkFDS0VORC0+aGFuZGxlLCBtZW0sIChpbnQpbGVuLCAwLCBQUl9JTlRFUlZBTF9OT19XQUlUKTsKICAgaWYocmMgPCAwKSB7CiAgICAgUFJJbnQzMiBlcnIgPSBQUl9HZXRFcnJvcigpOwogICAgIGlmKGVyciA9PSBQUl9XT1VMRF9CTE9DS19FUlJPUikKQEAgLTIyMDUsMTQgKzIyMjMsMjEgQEAKICAgcmV0dXJuIHJjOyAvKiBudW1iZXIgb2YgYnl0ZXMgKi8KIH0KIAotc3RhdGljIHNzaXplX3QgbnNzX3JlY3Yoc3RydWN0IGNvbm5lY3RkYXRhICogY29ubiwgLyogY29ubmVjdGlvbiBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtLCAgICAgICAgICAgICAgICAgICAvKiBzb2NrZXRpbmRleCAqLworc3RhdGljIHNzaXplX3QgbnNzX3JlY3Yoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCAgLyogY29ubmVjdGlvbiBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LCAgICAgICAgICAgICAvKiBzb2NrZXRpbmRleCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmLCAgICAgICAgICAgICAgICAgLyogc3RvcmUgcmVhZCBkYXRhIGhlcmUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJzaXplLCAgICAgICAgIC8qIG1heCBhbW91bnQgdG8gcmVhZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTGNvZGUgKmN1cmxjb2RlKQogewotICBzc2l6ZV90IG5yZWFkID0gUFJfUmVjdihjb25uLT5zc2xbbnVtXS5oYW5kbGUsIGJ1ZiwgKGludClidWZmZXJzaXplLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQUl9JTlRFUlZBTF9OT19XQUlUKTsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CisgIHNzaXplX3QgbnJlYWQ7CisKKyAgLyogVGhlIFNlbGVjdENsaWVudENlcnQoKSBob29rIHVzZXMgdGhpcyBmb3IgaW5mb2YoKSBhbmQgZmFpbGYoKSBidXQgdGhlCisgICAgIGhhbmRsZSBzdG9yZWQgaW4gbnNzX3NldHVwX2Nvbm5lY3QoKSBjb3VsZCBoYXZlIGFscmVhZHkgYmVlbiBmcmVlZC4gKi8KKyAgQkFDS0VORC0+ZGF0YSA9IGNvbm4tPmRhdGE7CisKKyAgbnJlYWQgPSBQUl9SZWN2KEJBQ0tFTkQtPmhhbmRsZSwgYnVmLCAoaW50KWJ1ZmZlcnNpemUsIDAsCisgICAgICAgICAgICAgICAgICBQUl9JTlRFUlZBTF9OT19XQUlUKTsKICAgaWYobnJlYWQgPCAwKSB7CiAgICAgLyogZmFpbGVkIFNTTCByZWFkICovCiAgICAgUFJJbnQzMiBlcnIgPSBQUl9HZXRFcnJvcigpOwpAQCAtMjIzOCwyMiArMjI2MywyMiBAQAogICByZXR1cm4gbnJlYWQ7CiB9CiAKLXNpemVfdCBDdXJsX25zc192ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCitzdGF0aWMgc2l6ZV90IEN1cmxfbnNzX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKICAgcmV0dXJuIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIk5TUy8lcyIsIE5TU19WRVJTSU9OKTsKIH0KIAogLyogZGF0YSBtaWdodCBiZSBOVUxMICovCi1pbnQgQ3VybF9uc3Nfc2VlZChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQorc3RhdGljIGludCBDdXJsX25zc19zZWVkKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCiB7CiAgIC8qIG1ha2Ugc3VyZSB0aGF0IE5TUyBpcyBpbml0aWFsaXplZCAqLwogICByZXR1cm4gISFDdXJsX25zc19mb3JjZV9pbml0KGRhdGEpOwogfQogCiAvKiBkYXRhIG1pZ2h0IGJlIE5VTEwgKi8KLUNVUkxjb2RlIEN1cmxfbnNzX3JhbmRvbShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVudHJvcHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX25zc19yYW5kb20oc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW50cm9weSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkKIHsKICAgQ3VybF9uc3Nfc2VlZChkYXRhKTsgIC8qIEluaXRpYXRlIHRoZSBzZWVkIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KIApAQCAtMjI2NCwxMCArMjI4OSwxMCBAQAogICByZXR1cm4gQ1VSTEVfT0s7CiB9CiAKLXZvaWQgQ3VybF9uc3NfbWQ1c3VtKHVuc2lnbmVkIGNoYXIgKnRtcCwgLyogaW5wdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0bXBsZW4sCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICptZDVzdW0sIC8qIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1kNWxlbikKK3N0YXRpYyBDVVJMY29kZSBDdXJsX25zc19tZDVzdW0odW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICptZDVzdW0sIC8qIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWQ1bGVuKQogewogICBQSzExQ29udGV4dCAqTUQ1cHcgPSBQSzExX0NyZWF0ZURpZ2VzdENvbnRleHQoU0VDX09JRF9NRDUpOwogICB1bnNpZ25lZCBpbnQgTUQ1b3V0OwpAQCAtMjI3NSwxMiArMjMwMCwxNCBAQAogICBQSzExX0RpZ2VzdE9wKE1ENXB3LCB0bXAsIGN1cmx4X3V6dG91aSh0bXBsZW4pKTsKICAgUEsxMV9EaWdlc3RGaW5hbChNRDVwdywgbWQ1c3VtLCAmTUQ1b3V0LCBjdXJseF91enRvdWkobWQ1bGVuKSk7CiAgIFBLMTFfRGVzdHJveUNvbnRleHQoTUQ1cHcsIFBSX1RSVUUpOworCisgIHJldHVybiBDVVJMRV9PSzsKIH0KIAotdm9pZCBDdXJsX25zc19zaGEyNTZzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTI1NnN1bSwgLyogb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2hhMjU2bGVuKQorc3RhdGljIHZvaWQgQ3VybF9uc3Nfc2hhMjU2c3VtKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRtcCwgLyogaW5wdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTI1NnN1bSwgLyogb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNoYTI1NmxlbikKIHsKICAgUEsxMUNvbnRleHQgKlNIQTI1NnB3ID0gUEsxMV9DcmVhdGVEaWdlc3RDb250ZXh0KFNFQ19PSURfU0hBMjU2KTsKICAgdW5zaWduZWQgaW50IFNIQTI1Nm91dDsKQEAgLTIyOTAsNyArMjMxNyw3IEBACiAgIFBLMTFfRGVzdHJveUNvbnRleHQoU0hBMjU2cHcsIFBSX1RSVUUpOwogfQogCi1ib29sIEN1cmxfbnNzX2NlcnRfc3RhdHVzX3JlcXVlc3Qodm9pZCkKK3N0YXRpYyBib29sIEN1cmxfbnNzX2NlcnRfc3RhdHVzX3JlcXVlc3Qodm9pZCkKIHsKICNpZmRlZiBTU0xfRU5BQkxFX09DU1BfU1RBUExJTkcKICAgcmV0dXJuIFRSVUU7CkBAIC0yMjk5LDcgKzIzMjYsNyBAQAogI2VuZGlmCiB9CiAKLWJvb2wgQ3VybF9uc3NfZmFsc2Vfc3RhcnQodm9pZCkKK3N0YXRpYyBib29sIEN1cmxfbnNzX2ZhbHNlX3N0YXJ0KHZvaWQpCiB7CiAjaWYgTlNTVkVSTlVNID49IDB4MDMwZjA0IC8qIDMuMTUuNCAqLwogICByZXR1cm4gVFJVRTsKQEAgLTIzMDgsNCArMjMzNSw0NiBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyB2b2lkICpDdXJsX25zc19nZXRfaW50ZXJuYWxzKHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTElORk8gaW5mbyBVTlVTRURfUEFSQU0pCit7CisgICh2b2lkKWluZm87CisgIHJldHVybiBCQUNLRU5ELT5oYW5kbGU7Cit9CisKK2NvbnN0IHN0cnVjdCBDdXJsX3NzbCBDdXJsX3NzbF9uc3MgPSB7CisgIHsgQ1VSTFNTTEJBQ0tFTkRfTlNTLCAibnNzIiB9LCAvKiBpbmZvICovCisKKyAgMSwgLyogaGF2ZV9jYV9wYXRoICovCisgIDEsIC8qIGhhdmVfY2VydGluZm8gKi8KKyAgMSwgLyogaGF2ZV9waW5uZWRwdWJrZXkgKi8KKyAgMCwgLyogaGF2ZV9zc2xfY3R4ICovCisgIDEsIC8qIHN1cHBvcnRfaHR0cHNfcHJveHkgKi8KKworICBzaXplb2Yoc3RydWN0IHNzbF9iYWNrZW5kX2RhdGEpLAorCisgIEN1cmxfbnNzX2luaXQsICAgICAgICAgICAgICAgIC8qIGluaXQgKi8KKyAgQ3VybF9uc3NfY2xlYW51cCwgICAgICAgICAgICAgLyogY2xlYW51cCAqLworICBDdXJsX25zc192ZXJzaW9uLCAgICAgICAgICAgICAvKiB2ZXJzaW9uICovCisgIEN1cmxfbnNzX2NoZWNrX2N4biwgICAgICAgICAgIC8qIGNoZWNrX2N4biAqLworICAvKiBOU1MgaGFzIG5vIHNodXRkb3duIGZ1bmN0aW9uIHByb3ZpZGVkIGFuZCB0aHVzIGFsd2F5cyBmYWlsICovCisgIEN1cmxfbm9uZV9zaHV0ZG93biwgICAgICAgICAgIC8qIHNodXRkb3duICovCisgIEN1cmxfbm9uZV9kYXRhX3BlbmRpbmcsICAgICAgIC8qIGRhdGFfcGVuZGluZyAqLworICBDdXJsX25zc19yYW5kb20sICAgICAgICAgICAgICAvKiByYW5kb20gKi8KKyAgQ3VybF9uc3NfY2VydF9zdGF0dXNfcmVxdWVzdCwgLyogY2VydF9zdGF0dXNfcmVxdWVzdCAqLworICBDdXJsX25zc19jb25uZWN0LCAgICAgICAgICAgICAvKiBjb25uZWN0ICovCisgIEN1cmxfbnNzX2Nvbm5lY3Rfbm9uYmxvY2tpbmcsIC8qIGNvbm5lY3Rfbm9uYmxvY2tpbmcgKi8KKyAgQ3VybF9uc3NfZ2V0X2ludGVybmFscywgICAgICAgLyogZ2V0X2ludGVybmFscyAqLworICBDdXJsX25zc19jbG9zZSwgICAgICAgICAgICAgICAvKiBjbG9zZSAqLworICBDdXJsX25vbmVfY2xvc2VfYWxsLCAgICAgICAgICAvKiBjbG9zZV9hbGwgKi8KKyAgLyogTlNTIGhhcyBpdHMgb3duIHNlc3Npb24gSUQgY2FjaGUgKi8KKyAgQ3VybF9ub25lX3Nlc3Npb25fZnJlZSwgICAgICAgLyogc2Vzc2lvbl9mcmVlICovCisgIEN1cmxfbm9uZV9zZXRfZW5naW5lLCAgICAgICAgIC8qIHNldF9lbmdpbmUgKi8KKyAgQ3VybF9ub25lX3NldF9lbmdpbmVfZGVmYXVsdCwgLyogc2V0X2VuZ2luZV9kZWZhdWx0ICovCisgIEN1cmxfbm9uZV9lbmdpbmVzX2xpc3QsICAgICAgIC8qIGVuZ2luZXNfbGlzdCAqLworICBDdXJsX25zc19mYWxzZV9zdGFydCwgICAgICAgICAvKiBmYWxzZV9zdGFydCAqLworICBDdXJsX25zc19tZDVzdW0sICAgICAgICAgICAgICAvKiBtZDVzdW0gKi8KKyAgQ3VybF9uc3Nfc2hhMjU2c3VtICAgICAgICAgICAgLyogc2hhMjU2c3VtICovCit9OworCiAjZW5kaWYgLyogVVNFX05TUyAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9uc3NnLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL25zc2cuaAppbmRleCA4YzQ2OTI5Li40MWU1MWIwIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL25zc2cuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL25zc2cuaApAQCAtMzAsNzkgKzMwLDEwIEBACiAKICNpbmNsdWRlICJ1cmxkYXRhLmgiCiAKLUNVUkxjb2RlIEN1cmxfbnNzX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLUNVUkxjb2RlIEN1cmxfbnNzX2Nvbm5lY3Rfbm9uYmxvY2tpbmcoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpkb25lKTsKLS8qIGNsb3NlIGEgU1NMIGNvbm5lY3Rpb24gKi8KLXZvaWQgQ3VybF9uc3NfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLQotaW50IEN1cmxfbnNzX2luaXQodm9pZCk7Ci12b2lkIEN1cmxfbnNzX2NsZWFudXAodm9pZCk7Ci0KLXNpemVfdCBDdXJsX25zc192ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwotaW50IEN1cmxfbnNzX2NoZWNrX2N4bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmN4bik7Ci1pbnQgQ3VybF9uc3Nfc2VlZChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKTsKLQogLyogaW5pdGlhbGl6ZSBOU1MgbGlicmFyeSBpZiBub3QgYWxyZWFkeSAqLwogQ1VSTGNvZGUgQ3VybF9uc3NfZm9yY2VfaW5pdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKTsKIAotQ1VSTGNvZGUgQ3VybF9uc3NfcmFuZG9tKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW50cm9weSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKLQotdm9pZCBDdXJsX25zc19tZDVzdW0odW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm1kNXN1bSwgLyogb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWQ1bGVuKTsKLQotdm9pZCBDdXJsX25zc19zaGEyNTZzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTI1NnN1bSwgLyogb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2hhMjU2bGVuKTsKLQotYm9vbCBDdXJsX25zc19jZXJ0X3N0YXR1c19yZXF1ZXN0KHZvaWQpOwotCi1ib29sIEN1cmxfbnNzX2ZhbHNlX3N0YXJ0KHZvaWQpOwotCi0vKiBTdXBwb3J0IEhUVFBTLXByb3h5ICovCi0jZGVmaW5lIEhUVFBTX1BST1hZX1NVUFBPUlQgMQotCi0vKiBTZXQgdGhlIEFQSSBiYWNrZW5kIGRlZmluaXRpb24gdG8gTlNTICovCi0jZGVmaW5lIENVUkxfU1NMX0JBQ0tFTkQgQ1VSTFNTTEJBQ0tFTkRfTlNTCi0KLS8qIHRoaXMgYmFja2VuZCBzdXBwb3J0cyB0aGUgQ0FQQVRIIG9wdGlvbiAqLwotI2RlZmluZSBoYXZlX2N1cmxzc2xfY2FfcGF0aCAxCi0KLS8qIHRoaXMgYmFja2VuZCBzdXBwb3J0cyBDVVJMT1BUX0NFUlRJTkZPICovCi0jZGVmaW5lIGhhdmVfY3VybHNzbF9jZXJ0aW5mbyAxCi0KLS8qIHRoaXMgYmFja2VuZHMgc3VwcG9ydHMgQ1VSTE9QVF9QSU5ORURQVUJMSUNLRVkgKi8KLSNkZWZpbmUgaGF2ZV9jdXJsc3NsX3Bpbm5lZHB1YmtleSAxCi0KLS8qIEFQSSBzZXR1cCBmb3IgTlNTICovCi0jZGVmaW5lIGN1cmxzc2xfaW5pdCBDdXJsX25zc19pbml0Ci0jZGVmaW5lIGN1cmxzc2xfY2xlYW51cCBDdXJsX25zc19jbGVhbnVwCi0jZGVmaW5lIGN1cmxzc2xfY29ubmVjdCBDdXJsX25zc19jb25uZWN0Ci0jZGVmaW5lIGN1cmxzc2xfY29ubmVjdF9ub25ibG9ja2luZyBDdXJsX25zc19jb25uZWN0X25vbmJsb2NraW5nCi0KLS8qIE5TUyBoYXMgaXRzIG93biBzZXNzaW9uIElEIGNhY2hlICovCi0jZGVmaW5lIGN1cmxzc2xfc2Vzc2lvbl9mcmVlKHgpIEN1cmxfbm9wX3N0bXQKLSNkZWZpbmUgY3VybHNzbF9jbG9zZV9hbGwoeCkgKCh2b2lkKXgpCi0jZGVmaW5lIGN1cmxzc2xfY2xvc2UgQ3VybF9uc3NfY2xvc2UKLS8qIE5TUyBoYXMgbm8gc2h1dGRvd24gZnVuY3Rpb24gcHJvdmlkZWQgYW5kIHRodXMgYWx3YXlzIGZhaWwgKi8KLSNkZWZpbmUgY3VybHNzbF9zaHV0ZG93bih4LHkpICgodm9pZCl4LCAodm9pZCl5LCAxKQotI2RlZmluZSBjdXJsc3NsX3NldF9lbmdpbmUoeCx5KSAoKHZvaWQpeCwgKHZvaWQpeSwgQ1VSTEVfTk9UX0JVSUxUX0lOKQotI2RlZmluZSBjdXJsc3NsX3NldF9lbmdpbmVfZGVmYXVsdCh4KSAoKHZvaWQpeCwgQ1VSTEVfTk9UX0JVSUxUX0lOKQotI2RlZmluZSBjdXJsc3NsX2VuZ2luZXNfbGlzdCh4KSAoKHZvaWQpeCwgKHN0cnVjdCBjdXJsX3NsaXN0ICopTlVMTCkKLSNkZWZpbmUgY3VybHNzbF92ZXJzaW9uIEN1cmxfbnNzX3ZlcnNpb24KLSNkZWZpbmUgY3VybHNzbF9jaGVja19jeG4oeCkgQ3VybF9uc3NfY2hlY2tfY3huKHgpCi0jZGVmaW5lIGN1cmxzc2xfZGF0YV9wZW5kaW5nKHgseSkgKCh2b2lkKXgsICh2b2lkKXksIDApCi0jZGVmaW5lIGN1cmxzc2xfcmFuZG9tKHgseSx6KSBDdXJsX25zc19yYW5kb20oeCx5LHopCi0jZGVmaW5lIGN1cmxzc2xfbWQ1c3VtKGEsYixjLGQpIEN1cmxfbnNzX21kNXN1bShhLGIsYyxkKQotI2RlZmluZSBjdXJsc3NsX3NoYTI1NnN1bShhLGIsYyxkKSBDdXJsX25zc19zaGEyNTZzdW0oYSxiLGMsZCkKLSNkZWZpbmUgY3VybHNzbF9jZXJ0X3N0YXR1c19yZXF1ZXN0KCkgQ3VybF9uc3NfY2VydF9zdGF0dXNfcmVxdWVzdCgpCi0jZGVmaW5lIGN1cmxzc2xfZmFsc2Vfc3RhcnQoKSBDdXJsX25zc19mYWxzZV9zdGFydCgpCitleHRlcm4gY29uc3Qgc3RydWN0IEN1cmxfc3NsIEN1cmxfc3NsX25zczsKIAogI2VuZGlmIC8qIFVTRV9OU1MgKi8KICNlbmRpZiAvKiBIRUFERVJfQ1VSTF9OU1NHX0ggKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvb3BlbnNzbC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9vcGVuc3NsLmMKaW5kZXggZGJlZTM2OS4uNDI1MzE2MCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9vcGVuc3NsLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9vcGVuc3NsLmMKQEAgLTUxLDggKzUxLDEwIEBACiAjaW5jbHVkZSAic3RyY2FzZS5oIgogI2luY2x1ZGUgImhvc3RjaGVjay5oIgogI2luY2x1ZGUgImN1cmxfcHJpbnRmLmgiCi0KICNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2lmZGVmIEhBVkVfT1BFTlNTTF9FTkdJTkVfSAorI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+CisjZW5kaWYKICNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KICNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgogI2lmbmRlZiBPUEVOU1NMX05PX0RTQQpAQCAtNjQsNiArNjYsOCBAQAogI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KICNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KIAogI2lmZGVmIEhBVkVfT1BFTlNTTF9QS0NTMTJfSAogI2luY2x1ZGUgPG9wZW5zc2wvcGtjczEyLmg+CkBAIC0xMTEsNyArMTE1LDYgQEAKICNkZWZpbmUgSEFWRV9PUEFRVUVfRVZQX1BLRVkgMSAvKiBzaW5jZSAxLjEuMCAtcHJlMyAqLwogI2RlZmluZSBIQVZFX09QQVFVRV9SU0FfRFNBX0RIIDEgLyogc2luY2UgMS4xLjAgLXByZTUgKi8KICNkZWZpbmUgQ09OU1RfRVhUUyBjb25zdAotI2RlZmluZSBDT05TVF9BU04xX0JJVF9TVFJJTkcgY29uc3QKICNkZWZpbmUgSEFWRV9FUlJfUkVNT1ZFX1RIUkVBRF9TVEFURV9ERVBSRUNBVEVEIDEKICNlbHNlCiAvKiBGb3IgT3BlblNTTCBiZWZvcmUgMS4xLjAgKi8KQEAgLTExOSw3ICsxMjIsNiBAQAogI2RlZmluZSBYNTA5X2dldDBfbm90QmVmb3JlKHgpIFg1MDlfZ2V0X25vdEJlZm9yZSh4KQogI2RlZmluZSBYNTA5X2dldDBfbm90QWZ0ZXIoeCkgWDUwOV9nZXRfbm90QWZ0ZXIoeCkKICNkZWZpbmUgQ09OU1RfRVhUUyAvKiBub3BlICovCi0jZGVmaW5lIENPTlNUX0FTTjFfQklUX1NUUklORyAvKiBub3BlICovCiAjaWZkZWYgTElCUkVTU0xfVkVSU0lPTl9OVU1CRVIKIHN0YXRpYyB1bnNpZ25lZCBsb25nIE9wZW5TU0xfdmVyc2lvbl9udW0odm9pZCkKIHsKQEAgLTE0Niw2ICsxNDgsMjAgQEAKICNkZWZpbmUgT1BFTlNTTF9sb2FkX2J1aWx0aW5fbW9kdWxlcyh4KQogI2VuZGlmCiAKKy8qCisgKiBXaGV0aGVyIFNTTF9DVFhfc2V0X2tleWxvZ19jYWxsYmFjayBpcyBhdmFpbGFibGUuCisgKiBPcGVuU1NMOiBzdXBwb3J0ZWQgc2luY2UgMS4xLjEgaHR0cHM6Ly9naXRodWIuY29tL29wZW5zc2wvb3BlbnNzbC9wdWxsLzIyODcKKyAqIEJvcmluZ1NTTDogc3VwcG9ydGVkIHNpbmNlIGQyOGY1OWMyN2JhYyAoY29tbWl0dGVkIDIwMTUtMTEtMTkpLCB0aGUKKyAqICAgICAgICAgICAgQk9SSU5HU1NMXzIwMTUxMiBtYWNybyBmcm9tIDIwMTYtMDEtMjEgc2hvdWxkIGJlIGNsb3NlIGVub3VnaC4KKyAqIExpYnJlU1NMOiB1bnN1cHBvcnRlZCBpbiBhdCBsZWFzdCAyLjUuMSAoZXhwbGljaXRseSBjaGVjayBmb3IgaXQgc2luY2UgaXQKKyAqICAgICAgICAgICBsaWVzIGFuZCBwcmV0ZW5kcyB0byBiZSBPcGVuU1NMIDIuMC4wKS4KKyAqLworI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MTAxMDEwMDBMICYmIFwKKyAgICAgIWRlZmluZWQoTElCUkVTU0xfVkVSU0lPTl9OVU1CRVIpKSB8fCBcCisgICAgZGVmaW5lZChCT1JJTkdTU0xfMjAxNTEyKQorI2RlZmluZSBIQVZFX0tFWUxPR19DQUxMQkFDSworI2VuZGlmCisKICNpZiBkZWZpbmVkKExJQlJFU1NMX1ZFUlNJT05fTlVNQkVSKQogI2RlZmluZSBPU1NMX1BBQ0tBR0UgIkxpYnJlU1NMIgogI2VsaWYgZGVmaW5lZChPUEVOU1NMX0lTX0JPUklOR1NTTCkKQEAgLTE1NCw2ICsxNzAsMzggQEAKICNkZWZpbmUgT1NTTF9QQUNLQUdFICJPcGVuU1NMIgogI2VuZGlmCiAKKyNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDEwMTAwMDAwTCkKKy8qIHVwMmRhdGUgdmVyc2lvbnMgb2YgT3BlblNTTCBtYWludGFpbiB0aGUgZGVmYXVsdCByZWFzb25hYmx5IHNlY3VyZSB3aXRob3V0CisgKiBicmVha2luZyBjb21wYXRpYmlsaXR5LCBzbyBpdCBpcyBiZXR0ZXIgbm90IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJ5IGN1cmwKKyAqLworI2RlZmluZSBERUZBVUxUX0NJUEhFUl9TRUxFQ1RJT04gTlVMTAorI2Vsc2UKKy8qIC4uLiBidXQgaXQgaXMgbm90IHRoZSBjYXNlIHdpdGggb2xkIHZlcnNpb25zIG9mIE9wZW5TU0wgKi8KKyNkZWZpbmUgREVGQVVMVF9DSVBIRVJfU0VMRUNUSU9OIFwKKyAgIkFMTDohRVhQT1JUOiFFWFBPUlQ0MDohRVhQT1JUNTY6IWFOVUxMOiFMT1c6IVJDNDpAU1RSRU5HVEgiCisjZW5kaWYKKworI2lmZGVmIEVOQUJMRV9TU0xLRVlMT0dGSUxFCit0eXBlZGVmIHN0cnVjdCBzc2xfdGFwX3N0YXRlIHsKKyAgaW50IG1hc3Rlcl9rZXlfbGVuZ3RoOworICB1bnNpZ25lZCBjaGFyIG1hc3Rlcl9rZXlbU1NMX01BWF9NQVNURVJfS0VZX0xFTkdUSF07CisgIHVuc2lnbmVkIGNoYXIgY2xpZW50X3JhbmRvbVtTU0wzX1JBTkRPTV9TSVpFXTsKK30gc3NsX3RhcF9zdGF0ZV90OworI2VuZGlmIC8qIEVOQUJMRV9TU0xLRVlMT0dGSUxFICovCisKK3N0cnVjdCBzc2xfYmFja2VuZF9kYXRhIHsKKyAgLyogdGhlc2Ugb25lcyByZXF1aXJlcyBzcGVjaWZpYyBTU0wtdHlwZXMgKi8KKyAgU1NMX0NUWCogY3R4OworICBTU0wqICAgICBoYW5kbGU7CisgIFg1MDkqICAgIHNlcnZlcl9jZXJ0OworI2lmZGVmIEVOQUJMRV9TU0xLRVlMT0dGSUxFCisgIC8qIHRhcF9zdGF0ZSBob2xkcyB0aGUgbGFzdCBzZWVuIG1hc3RlciBrZXkgaWYgd2UncmUgbG9nZ2luZyB0aGVtICovCisgIHNzbF90YXBfc3RhdGVfdCB0YXBfc3RhdGU7CisjZW5kaWYKK307CisKKyNkZWZpbmUgQkFDS0VORCBjb25uc3NsLT5iYWNrZW5kCisKIC8qCiAgKiBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZSByYW5kb20gbnVtYmVyIHNlZWQgZmlsZS4gVGhpcyBtdXN0IGJlCiAgKiBhIGZpbml0ZSB2YWx1ZSAoYmVjYXVzZSBzb21lIGVudHJvcHkgImZpbGVzIiBsaWtlIC9kZXYvdXJhbmRvbSBoYXZlCkBAIC0xNjIsNiArMjEwLDExMiBAQAogICovCiAjZGVmaW5lIFJBTkRfTE9BRF9MRU5HVEggMTAyNAogCisjaWZkZWYgRU5BQkxFX1NTTEtFWUxPR0ZJTEUKKy8qIFRoZSBmcCBmb3IgdGhlIG9wZW4gU1NMS0VZTE9HRklMRSwgb3IgTlVMTCBpZiBub3Qgb3BlbiAqLworc3RhdGljIEZJTEUgKmtleWxvZ19maWxlX2ZwOworCisjaWZkZWYgSEFWRV9LRVlMT0dfQ0FMTEJBQ0sKK3N0YXRpYyB2b2lkIG9zc2xfa2V5bG9nX2NhbGxiYWNrKGNvbnN0IFNTTCAqc3NsLCBjb25zdCBjaGFyICpsaW5lKQoreworICAodm9pZClzc2w7CisKKyAgLyogVXNpbmcgZnB1dHMgaGVyZSBpbnN0ZWFkIG9mIGZwcmludGYgc2luY2UgbGliY3VybCdzIGZwcmludGYgcmVwbGFjZW1lbnQKKyAgICAgbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS4gKi8KKyAgaWYoa2V5bG9nX2ZpbGVfZnAgJiYgbGluZSAmJiAqbGluZSkgeworICAgIGNoYXIgc3RhY2tidWZbMjU2XTsKKyAgICBjaGFyICpidWY7CisgICAgc2l6ZV90IGxpbmVsZW4gPSBzdHJsZW4obGluZSk7CisKKyAgICBpZihsaW5lbGVuIDw9IHNpemVvZihzdGFja2J1ZikgLSAyKQorICAgICAgYnVmID0gc3RhY2tidWY7CisgICAgZWxzZSB7CisgICAgICBidWYgPSBtYWxsb2MobGluZWxlbiArIDIpOworICAgICAgaWYoIWJ1ZikKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdHJuY3B5KGJ1ZiwgbGluZSwgbGluZWxlbik7CisgICAgYnVmW2xpbmVsZW5dID0gJ1xuJzsKKyAgICBidWZbbGluZWxlbiArIDFdID0gJ1wwJzsKKworICAgIGZwdXRzKGJ1Ziwga2V5bG9nX2ZpbGVfZnApOworICAgIGlmKGJ1ZiAhPSBzdGFja2J1ZikKKyAgICAgIGZyZWUoYnVmKTsKKyAgfQorfQorI2Vsc2UKKyNkZWZpbmUgS0VZTE9HX1BSRUZJWCAgICAgICJDTElFTlRfUkFORE9NICIKKyNkZWZpbmUgS0VZTE9HX1BSRUZJWF9MRU4gIChzaXplb2YoS0VZTE9HX1BSRUZJWCkgLSAxKQorLyoKKyAqIHRhcF9zc2xfa2V5IGlzIGNhbGxlZCBieSBsaWJjdXJsIHRvIG1ha2UgdGhlIENMSUVOVF9SQU5ET01zIGlmIHRoZSBPcGVuU1NMCisgKiBiZWluZyB1c2VkIGRvZXNuJ3QgaGF2ZSBuYXRpdmUgc3VwcG9ydCBmb3IgZG9pbmcgdGhhdC4KKyAqLworc3RhdGljIHZvaWQgdGFwX3NzbF9rZXkoY29uc3QgU1NMICpzc2wsIHNzbF90YXBfc3RhdGVfdCAqc3RhdGUpCit7CisgIGNvbnN0IGNoYXIgKmhleCA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKyAgaW50IHBvcywgaTsKKyAgY2hhciBsaW5lW0tFWUxPR19QUkVGSVhfTEVOICsgMiAqIFNTTDNfUkFORE9NX1NJWkUgKyAxICsKKyAgICAgICAgICAgIDIgKiBTU0xfTUFYX01BU1RFUl9LRVlfTEVOR1RIICsgMSArIDFdOworICBjb25zdCBTU0xfU0VTU0lPTiAqc2Vzc2lvbiA9IFNTTF9nZXRfc2Vzc2lvbihzc2wpOworICB1bnNpZ25lZCBjaGFyIGNsaWVudF9yYW5kb21bU1NMM19SQU5ET01fU0laRV07CisgIHVuc2lnbmVkIGNoYXIgbWFzdGVyX2tleVtTU0xfTUFYX01BU1RFUl9LRVlfTEVOR1RIXTsKKyAgaW50IG1hc3Rlcl9rZXlfbGVuZ3RoID0gMDsKKworICBpZighc2Vzc2lvbiB8fCAha2V5bG9nX2ZpbGVfZnApCisgICAgcmV0dXJuOworCisjaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDEwMTAwMDAwTAorICAvKiBzc2wtPnMzIGlzIG5vdCBjaGVja2VkIGluIG9wZW5zc2wgMS4xLjAtcHJlNiwgYnV0IGxldCdzIGFzc3VtZSB0aGF0CisgICAqIHdlIGhhdmUgYSB2YWxpZCBTU0wgY29udGV4dCBpZiB3ZSBoYXZlIGEgbm9uLU5VTEwgc2Vzc2lvbi4gKi8KKyAgU1NMX2dldF9jbGllbnRfcmFuZG9tKHNzbCwgY2xpZW50X3JhbmRvbSwgU1NMM19SQU5ET01fU0laRSk7CisgIG1hc3Rlcl9rZXlfbGVuZ3RoID0KKyAgICBTU0xfU0VTU0lPTl9nZXRfbWFzdGVyX2tleShzZXNzaW9uLCBtYXN0ZXJfa2V5LCBTU0xfTUFYX01BU1RFUl9LRVlfTEVOR1RIKTsKKyNlbHNlCisgIGlmKHNzbC0+czMgJiYgc2Vzc2lvbi0+bWFzdGVyX2tleV9sZW5ndGggPiAwKSB7CisgICAgbWFzdGVyX2tleV9sZW5ndGggPSBzZXNzaW9uLT5tYXN0ZXJfa2V5X2xlbmd0aDsKKyAgICBtZW1jcHkobWFzdGVyX2tleSwgc2Vzc2lvbi0+bWFzdGVyX2tleSwgc2Vzc2lvbi0+bWFzdGVyX2tleV9sZW5ndGgpOworICAgIG1lbWNweShjbGllbnRfcmFuZG9tLCBzc2wtPnMzLT5jbGllbnRfcmFuZG9tLCBTU0wzX1JBTkRPTV9TSVpFKTsKKyAgfQorI2VuZGlmCisKKyAgaWYobWFzdGVyX2tleV9sZW5ndGggPD0gMCkKKyAgICByZXR1cm47CisKKyAgLyogU2tpcCB3cml0aW5nIGtleXMgaWYgdGhlcmUgaXMgbm8ga2V5IG9yIGl0IGRpZCBub3QgY2hhbmdlLiAqLworICBpZihzdGF0ZS0+bWFzdGVyX2tleV9sZW5ndGggPT0gbWFzdGVyX2tleV9sZW5ndGggJiYKKyAgICAgIW1lbWNtcChzdGF0ZS0+bWFzdGVyX2tleSwgbWFzdGVyX2tleSwgbWFzdGVyX2tleV9sZW5ndGgpICYmCisgICAgICFtZW1jbXAoc3RhdGUtPmNsaWVudF9yYW5kb20sIGNsaWVudF9yYW5kb20sIFNTTDNfUkFORE9NX1NJWkUpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RhdGUtPm1hc3Rlcl9rZXlfbGVuZ3RoID0gbWFzdGVyX2tleV9sZW5ndGg7CisgIG1lbWNweShzdGF0ZS0+bWFzdGVyX2tleSwgbWFzdGVyX2tleSwgbWFzdGVyX2tleV9sZW5ndGgpOworICBtZW1jcHkoc3RhdGUtPmNsaWVudF9yYW5kb20sIGNsaWVudF9yYW5kb20sIFNTTDNfUkFORE9NX1NJWkUpOworCisgIG1lbWNweShsaW5lLCBLRVlMT0dfUFJFRklYLCBLRVlMT0dfUFJFRklYX0xFTik7CisgIHBvcyA9IEtFWUxPR19QUkVGSVhfTEVOOworCisgIC8qIENsaWVudCBSYW5kb20gZm9yIFNTTHYzL1RMUyAqLworICBmb3IoaSA9IDA7IGkgPCBTU0wzX1JBTkRPTV9TSVpFOyBpKyspIHsKKyAgICBsaW5lW3BvcysrXSA9IGhleFtjbGllbnRfcmFuZG9tW2ldID4+IDRdOworICAgIGxpbmVbcG9zKytdID0gaGV4W2NsaWVudF9yYW5kb21baV0gJiAweEZdOworICB9CisgIGxpbmVbcG9zKytdID0gJyAnOworCisgIC8qIE1hc3RlciBTZWNyZXQgKHNpemUgaXMgYXQgbW9zdCBTU0xfTUFYX01BU1RFUl9LRVlfTEVOR1RIKSAqLworICBmb3IoaSA9IDA7IGkgPCBtYXN0ZXJfa2V5X2xlbmd0aDsgaSsrKSB7CisgICAgbGluZVtwb3MrK10gPSBoZXhbbWFzdGVyX2tleVtpXSA+PiA0XTsKKyAgICBsaW5lW3BvcysrXSA9IGhleFttYXN0ZXJfa2V5W2ldICYgMHhGXTsKKyAgfQorICBsaW5lW3BvcysrXSA9ICdcbic7CisgIGxpbmVbcG9zXSA9ICdcMCc7CisKKyAgLyogVXNpbmcgZnB1dHMgaGVyZSBpbnN0ZWFkIG9mIGZwcmludGYgc2luY2UgbGliY3VybCdzIGZwcmludGYgcmVwbGFjZW1lbnQKKyAgICAgbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS4gKi8KKyAgZnB1dHMobGluZSwga2V5bG9nX2ZpbGVfZnApOworfQorI2VuZGlmIC8qICFIQVZFX0tFWUxPR19DQUxMQkFDSyAqLworI2VuZGlmIC8qIEVOQUJMRV9TU0xLRVlMT0dGSUxFICovCisKIHN0YXRpYyBjb25zdCBjaGFyICpTU0xfRVJST1JfdG9fc3RyKGludCBlcnIpCiB7CiAgIHN3aXRjaChlcnIpIHsKQEAgLTIxNiw3ICszNzAsNyBAQAogICBpZighZW5jcnlwdGluZykgewogICAgIGludCBrbGVuID0gY3VybHhfdXp0b3NpKHN0cmxlbigoY2hhciAqKWdsb2JhbF9wYXNzd2QpKTsKICAgICBpZihudW0gPiBrbGVuKSB7Ci0gICAgICBtZW1jcHkoYnVmLCBnbG9iYWxfcGFzc3dkLCBrbGVuKzEpOworICAgICAgbWVtY3B5KGJ1ZiwgZ2xvYmFsX3Bhc3N3ZCwga2xlbiArIDEpOwogICAgICAgcmV0dXJuIGtsZW47CiAgICAgfQogICB9CkBAIC0yMzYsNyArMzkwLDYgQEAKICAgLyogd2UgaGF2ZSB0aGUgIlNTTCBpcyBzZWVkZWQiIGJvb2xlYW4gc3RhdGljIHRvIHByZXZlbnQgbXVsdGlwbGUKICAgICAgdGltZS1jb25zdW1pbmcgc2VlZGluZ3MgaW4gdmFpbiAqLwogICBzdGF0aWMgYm9vbCBzc2xfc2VlZGVkID0gRkFMU0U7Ci0gIGludCBucmVhZD0wOwogICBjaGFyIGZuYW1lWzI1Nl07CiAKICAgaWYoc3NsX3NlZWRlZCkKQEAgLTI1NiwxMiArNDA5LDEyIEBACiAjZW5kaWYKICAgewogICAgIC8qIGxldCB0aGUgb3B0aW9uIG92ZXJyaWRlIHRoZSBkZWZpbmUgKi8KLSAgICBucmVhZCArPSBSQU5EX2xvYWRfZmlsZSgoZGF0YS0+c2V0LnN0cltTVFJJTkdfU1NMX1JBTkRPTV9GSUxFXT8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+c2V0LnN0cltTVFJJTkdfU1NMX1JBTkRPTV9GSUxFXToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFORE9NX0ZJTEUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBTkRfTE9BRF9MRU5HVEgpOworICAgIFJBTkRfbG9hZF9maWxlKChkYXRhLT5zZXQuc3RyW1NUUklOR19TU0xfUkFORE9NX0ZJTEVdPworICAgICAgICAgICAgICAgICAgICBkYXRhLT5zZXQuc3RyW1NUUklOR19TU0xfUkFORE9NX0ZJTEVdOgorICAgICAgICAgICAgICAgICAgICBSQU5ET01fRklMRSksCisgICAgICAgICAgICAgICAgICAgUkFORF9MT0FEX0xFTkdUSCk7CiAgICAgaWYocmFuZF9lbm91Z2goKSkKLSAgICAgIHJldHVybiBucmVhZDsKKyAgICAgIHJldHVybiBDVVJMRV9PSzsKICAgfQogCiAjaWYgZGVmaW5lZChIQVZFX1JBTkRfRUdEKQpAQCAtMjc5LDM1ICs0MzIsNDcgQEAKICAgICBpbnQgcmV0ID0gUkFORF9lZ2QoZGF0YS0+c2V0LnN0cltTVFJJTkdfU1NMX0VHRFNPQ0tFVF0/CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnNldC5zdHJbU1RSSU5HX1NTTF9FR0RTT0NLRVRdOkVHRF9TT0NLRVQpOwogICAgIGlmKC0xICE9IHJldCkgewotICAgICAgbnJlYWQgKz0gcmV0OwogICAgICAgaWYocmFuZF9lbm91Z2goKSkKLSAgICAgICAgcmV0dXJuIG5yZWFkOworICAgICAgICByZXR1cm4gQ1VSTEVfT0s7CiAgICAgfQogICB9CiAjZW5kaWYKIAotICAvKiBJZiB3ZSBnZXQgaGVyZSwgaXQgbWVhbnMgd2UgbmVlZCB0byBzZWVkIHRoZSBQUk5HIHVzaW5nIGEgInNpbGx5IgotICAgICBhcHByb2FjaCEgKi8KKyAgLyogZmFsbGJhY2sgdG8gYSBjdXN0b20gc2VlZGluZyBvZiB0aGUgUFJORyB1c2luZyBhIGhhc2ggYmFzZWQgb24gYSBjdXJyZW50CisgICAgIHRpbWUgKi8KICAgZG8gewogICAgIHVuc2lnbmVkIGNoYXIgcmFuZGJbNjRdOwotICAgIGludCBsZW4gPSBzaXplb2YocmFuZGIpOwotICAgIGlmKCFSQU5EX2J5dGVzKHJhbmRiLCBsZW4pKQotICAgICAgYnJlYWs7Ci0gICAgUkFORF9hZGQocmFuZGIsIGxlbiwgKGxlbiA+PiAxKSk7CisgICAgc2l6ZV90IGxlbiA9IHNpemVvZihyYW5kYik7CisgICAgc2l6ZV90IGksIGlfbWF4OworICAgIGZvcihpID0gMCwgaV9tYXggPSBsZW4gLyBzaXplb2Yoc3RydWN0IGN1cmx0aW1lKTsgaSA8IGlfbWF4OyArK2kpIHsKKyAgICAgIHN0cnVjdCBjdXJsdGltZSB0diA9IGN1cmx4X3R2bm93KCk7CisgICAgICBDdXJsX3dhaXRfbXMoMSk7CisgICAgICB0di50dl9zZWMgKj0gaSArIDE7CisgICAgICB0di50dl91c2VjICo9ICh1bnNpZ25lZCBpbnQpaSArIDI7CisgICAgICB0di50dl9zZWMgXj0gKChjdXJseF90dm5vdygpLnR2X3NlYyArIGN1cmx4X3R2bm93KCkudHZfdXNlYykgKgorICAgICAgICAgICAgICAgICAgICAoaSArIDMpKSA8PCA4OworICAgICAgdHYudHZfdXNlYyBePSAodW5zaWduZWQgaW50KSAoKGN1cmx4X3R2bm93KCkudHZfc2VjICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJseF90dm5vdygpLnR2X3VzZWMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICsgNCkpIDw8IDE2OworICAgICAgbWVtY3B5KCZyYW5kYltpICogc2l6ZW9mKHN0cnVjdCBjdXJsdGltZSldLCAmdHYsCisgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBjdXJsdGltZSkpOworICAgIH0KKyAgICBSQU5EX2FkZChyYW5kYiwgKGludClsZW4sIChkb3VibGUpbGVuLzIpOwogICB9IHdoaWxlKCFyYW5kX2Vub3VnaCgpKTsKIAogICAvKiBnZW5lcmF0ZXMgYSBkZWZhdWx0IHBhdGggZm9yIHRoZSByYW5kb20gc2VlZCBmaWxlICovCi0gIGZuYW1lWzBdPTA7IC8qIGJsYW5rIGl0IGZpcnN0ICovCisgIGZuYW1lWzBdID0gMDsgLyogYmxhbmsgaXQgZmlyc3QgKi8KICAgUkFORF9maWxlX25hbWUoZm5hbWUsIHNpemVvZihmbmFtZSkpOwogICBpZihmbmFtZVswXSkgewogICAgIC8qIHdlIGdvdCBhIGZpbGUgbmFtZSB0byB0cnkgKi8KLSAgICBucmVhZCArPSBSQU5EX2xvYWRfZmlsZShmbmFtZSwgUkFORF9MT0FEX0xFTkdUSCk7CisgICAgUkFORF9sb2FkX2ZpbGUoZm5hbWUsIFJBTkRfTE9BRF9MRU5HVEgpOwogICAgIGlmKHJhbmRfZW5vdWdoKCkpCi0gICAgICByZXR1cm4gbnJlYWQ7CisgICAgICByZXR1cm4gQ1VSTEVfT0s7CiAgIH0KIAogICBpbmZvZihkYXRhLCAibGliY3VybCBpcyBub3cgdXNpbmcgYSB3ZWFrIHJhbmRvbSBzZWVkIVxuIik7Ci0gIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsgLyogY29uZnVzaW5nIGVycm9yIGNvZGUgKi8KKyAgcmV0dXJuIChyYW5kX2Vub3VnaCgpID8gQ1VSTEVfT0sgOgorICAgIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SIC8qIGNvbmZ1c2luZyBlcnJvciBjb2RlICovKTsKIH0KIAogI2lmbmRlZiBTU0xfRklMRVRZUEVfRU5HSU5FCkBAIC0zODQsNiArNTQ5LDcgQEAKIHsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIGNoYXIgZXJyb3JfYnVmZmVyWzI1Nl07CisgIGJvb2wgY2hlY2tfcHJpdmtleSA9IFRSVUU7CiAKICAgaW50IGZpbGVfdHlwZSA9IGRvX2ZpbGVfdHlwZShjZXJ0X3R5cGUpOwogCkBAIC01OTIsNyArNzU4LDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgICBpZigha2V5X2ZpbGUpCiAgICAgICAgIC8qIGNlcnQgJiBrZXkgY2FuIG9ubHkgYmUgaW4gUEVNIGNhc2UgaW4gdGhlIHNhbWUgZmlsZSAqLwotICAgICAgICBrZXlfZmlsZT1jZXJ0X2ZpbGU7CisgICAgICAgIGtleV9maWxlID0gY2VydF9maWxlOwogICAgICAgLyogRkFMTFRIUk9VR0ggKi8KICAgICBjYXNlIFNTTF9GSUxFVFlQRV9BU04xOgogICAgICAgaWYoU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKGN0eCwga2V5X2ZpbGUsIGZpbGVfdHlwZSkgIT0gMSkgewpAQCAtNjU1LDEzICs4MjEsMTMgQEAKICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIHNzbD1TU0xfbmV3KGN0eCk7CisgICAgc3NsID0gU1NMX25ldyhjdHgpOwogICAgIGlmKCFzc2wpIHsKICAgICAgIGZhaWxmKGRhdGEsICJ1bmFibGUgdG8gY3JlYXRlIGFuIFNTTCBzdHJ1Y3R1cmUiKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIHg1MDk9U1NMX2dldF9jZXJ0aWZpY2F0ZShzc2wpOworICAgIHg1MDkgPSBTU0xfZ2V0X2NlcnRpZmljYXRlKHNzbCk7CiAKICAgICAvKiBUaGlzIHZlcnNpb24gd2FzIHByb3ZpZGVkIGJ5IEV2YW4gSm9yZGFuIGFuZCBpcyBzdXBwb3NlZCB0byBub3QKICAgICAgICBsZWFrIG1lbW9yeSBhcyB0aGUgcHJldmlvdXMgdmVyc2lvbjogKi8KQEAgLTY3MSwxNyArODM3LDMyIEBACiAgICAgICBFVlBfUEtFWV9mcmVlKHBrdG1wKTsKICAgICB9CiAKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKyAgICB7CisgICAgICAvKiBJZiBSU0EgaXMgdXNlZCwgZG9uJ3QgY2hlY2sgdGhlIHByaXZhdGUga2V5IGlmIGl0cyBmbGFncyBpbmRpY2F0ZQorICAgICAgICogaXQgZG9lc24ndCBzdXBwb3J0IGl0LiAqLworICAgICAgRVZQX1BLRVkgKnByaXZfa2V5ID0gU1NMX2dldF9wcml2YXRla2V5KHNzbCk7CisgICAgICBpZihFVlBfUEtFWV9pZChwcml2X2tleSkgPT0gRVZQX1BLRVlfUlNBKSB7CisgICAgICAgIFJTQSAqcnNhID0gRVZQX1BLRVlfZ2V0MV9SU0EocHJpdl9rZXkpOworICAgICAgICBpZihSU0FfZmxhZ3MocnNhKSAmIFJTQV9NRVRIT0RfRkxBR19OT19DSEVDSykKKyAgICAgICAgICBjaGVja19wcml2a2V5ID0gRkFMU0U7CisgICAgICAgIFJTQV9mcmVlKHJzYSk7IC8qIERlY3JlbWVudCByZWZlcmVuY2UgY291bnQgKi8KKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKwogICAgIFNTTF9mcmVlKHNzbCk7CiAKICAgICAvKiBJZiB3ZSBhcmUgdXNpbmcgRFNBLCB3ZSBjYW4gY29weSB0aGUgcGFyYW1ldGVycyBmcm9tCiAgICAgICogdGhlIHByaXZhdGUga2V5ICovCiAKLQotICAgIC8qIE5vdyB3ZSBrbm93IHRoYXQgYSBrZXkgYW5kIGNlcnQgaGF2ZSBiZWVuIHNldCBhZ2FpbnN0Ci0gICAgICogdGhlIFNTTCBjb250ZXh0ICovCi0gICAgaWYoIVNTTF9DVFhfY2hlY2tfcHJpdmF0ZV9rZXkoY3R4KSkgewotICAgICAgZmFpbGYoZGF0YSwgIlByaXZhdGUga2V5IGRvZXMgbm90IG1hdGNoIHRoZSBjZXJ0aWZpY2F0ZSBwdWJsaWMga2V5Iik7Ci0gICAgICByZXR1cm4gMDsKKyAgICBpZihjaGVja19wcml2a2V5ID09IFRSVUUpIHsKKyAgICAgIC8qIE5vdyB3ZSBrbm93IHRoYXQgYSBrZXkgYW5kIGNlcnQgaGF2ZSBiZWVuIHNldCBhZ2FpbnN0CisgICAgICAgKiB0aGUgU1NMIGNvbnRleHQgKi8KKyAgICAgIGlmKCFTU0xfQ1RYX2NoZWNrX3ByaXZhdGVfa2V5KGN0eCkpIHsKKyAgICAgICAgZmFpbGYoZGF0YSwgIlByaXZhdGUga2V5IGRvZXMgbm90IG1hdGNoIHRoZSBjZXJ0aWZpY2F0ZSBwdWJsaWMga2V5Iik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQogICAgIH0KICAgfQogICByZXR1cm4gMTsKQEAgLTcwOSw3ICs4OTAsNyBAQAogICAgIHNpemUtLTsgLyogZG9uJ3Qgb3ZlcndyaXRlIHRoZSBidWZmZXIgZW5kICovCiAKICAgbWVtY3B5KGJ1ZiwgYmlvbWVtLT5kYXRhLCBzaXplKTsKLSAgYnVmW3NpemVdPTA7CisgIGJ1ZltzaXplXSA9IDA7CiAKICAgQklPX2ZyZWUoYmlvX291dCk7CiAKQEAgLTcyMyw4ICs5MDQsMTIgQEAKICAqIEByZXR2YWwgMCBlcnJvciBpbml0aWFsaXppbmcgU1NMCiAgKiBAcmV0dmFsIDEgU1NMIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseQogICovCi1pbnQgQ3VybF9vc3NsX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgQ3VybF9vc3NsX2luaXQodm9pZCkKIHsKKyNpZmRlZiBFTkFCTEVfU1NMS0VZTE9HRklMRQorICBjb25zdCBjaGFyICprZXlsb2dfZmlsZV9uYW1lOworI2VuZGlmCisKICAgT1BFTlNTTF9sb2FkX2J1aWx0aW5fbW9kdWxlcygpOwogCiAjaWZkZWYgSEFWRV9FTkdJTkVfTE9BRF9CVUlMVElOX0VOR0lORVMKQEAgLTc2MSwxMSArOTQ2LDI0IEBACiAgIE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCk7CiAjZW5kaWYKIAorI2lmZGVmIEVOQUJMRV9TU0xLRVlMT0dGSUxFCisgIGtleWxvZ19maWxlX25hbWUgPSBjdXJsX2dldGVudigiU1NMS0VZTE9HRklMRSIpOworICBpZihrZXlsb2dfZmlsZV9uYW1lICYmICFrZXlsb2dfZmlsZV9mcCkgeworICAgIGtleWxvZ19maWxlX2ZwID0gZm9wZW4oa2V5bG9nX2ZpbGVfbmFtZSwgRk9QRU5fQVBQRU5EVEVYVCk7CisgICAgaWYoa2V5bG9nX2ZpbGVfZnApIHsKKyAgICAgIGlmKHNldHZidWYoa2V5bG9nX2ZpbGVfZnAsIE5VTEwsIF9JT0xCRiwgNDA5NikpIHsKKyAgICAgICAgZmNsb3NlKGtleWxvZ19maWxlX2ZwKTsKKyAgICAgICAga2V5bG9nX2ZpbGVfZnAgPSBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisKICAgcmV0dXJuIDE7CiB9CiAKIC8qIEdsb2JhbCBjbGVhbnVwICovCi12b2lkIEN1cmxfb3NzbF9jbGVhbnVwKHZvaWQpCitzdGF0aWMgdm9pZCBDdXJsX29zc2xfY2xlYW51cCh2b2lkKQogewogI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MTAxMDAwMDBMKSAmJiBcCiAgICAgIWRlZmluZWQoTElCUkVTU0xfVkVSU0lPTl9OVU1CRVIpCkBAIC03OTcsNiArOTk1LDEzIEBACiAgIFNTTF9DT01QX2ZyZWVfY29tcHJlc3Npb25fbWV0aG9kcygpOwogI2VuZGlmCiAjZW5kaWYKKworI2lmZGVmIEVOQUJMRV9TU0xLRVlMT0dGSUxFCisgIGlmKGtleWxvZ19maWxlX2ZwKSB7CisgICAgZmNsb3NlKGtleWxvZ19maWxlX2ZwKTsKKyAgICBrZXlsb2dfZmlsZV9mcCA9IE5VTEw7CisgIH0KKyNlbmRpZgogfQogCiAvKgpAQCAtODA3LDcgKzEwMTIsNyBAQAogICogICAgIDAgbWVhbnMgdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkCiAgKiAgICAtMSBtZWFucyB0aGUgY29ubmVjdGlvbiBzdGF0dXMgaXMgdW5rbm93bgogICovCi1pbnQgQ3VybF9vc3NsX2NoZWNrX2N4bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCitzdGF0aWMgaW50IEN1cmxfb3NzbF9jaGVja19jeG4oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKQogewogICAvKiBTU0xfcGVlayB0YWtlcyBkYXRhIG91dCBvZiB0aGUgcmF3IHJlY3YgYnVmZmVyIHdpdGhvdXQgcGVla2luZyBzbyB3ZSB1c2UKICAgICAgcmVjdiBNU0dfUEVFSyBpbnN0ZWFkLiBCdWcgIzc5NSAqLwpAQCAtODUzLDcgKzEwNTgsOCBAQAogCiAvKiBTZWxlY3RzIGFuIE9wZW5TU0wgY3J5cHRvIGVuZ2luZQogICovCi1DVVJMY29kZSBDdXJsX29zc2xfc2V0X2VuZ2luZShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCBjb25zdCBjaGFyICplbmdpbmUpCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9vc3NsX3NldF9lbmdpbmUoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmdpbmUpCiB7CiAjaWYgZGVmaW5lZChVU0VfT1BFTlNTTCkgJiYgZGVmaW5lZChIQVZFX09QRU5TU0xfRU5HSU5FX0gpCiAgIEVOR0lORSAqZTsKQEAgLTg5OCw3ICsxMTA0LDcgQEAKIAogLyogU2V0cyBlbmdpbmUgYXMgZGVmYXVsdCBmb3IgYWxsIFNTTCBvcGVyYXRpb25zCiAgKi8KLUNVUkxjb2RlIEN1cmxfb3NzbF9zZXRfZW5naW5lX2RlZmF1bHQoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX29zc2xfc2V0X2VuZ2luZV9kZWZhdWx0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCiB7CiAjaWZkZWYgSEFWRV9PUEVOU1NMX0VOR0lORV9ICiAgIGlmKGRhdGEtPnN0YXRlLmVuZ2luZSkgewpAQCAtOTIwLDcgKzExMjYsNyBAQAogCiAvKiBSZXR1cm4gbGlzdCBvZiBPcGVuU1NMIGNyeXB0byBlbmdpbmUgbmFtZXMuCiAgKi8KLXN0cnVjdCBjdXJsX3NsaXN0ICpDdXJsX29zc2xfZW5naW5lc19saXN0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCitzdGF0aWMgc3RydWN0IGN1cmxfc2xpc3QgKkN1cmxfb3NzbF9lbmdpbmVzX2xpc3Qoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKIHsKICAgc3RydWN0IGN1cmxfc2xpc3QgKmxpc3QgPSBOVUxMOwogI2lmIGRlZmluZWQoVVNFX09QRU5TU0wpICYmIGRlZmluZWQoSEFWRV9PUEVOU1NMX0VOR0lORV9IKQpAQCAtOTQzLDIzICsxMTQ5LDIzIEBACiAKIHN0YXRpYyB2b2lkIG9zc2xfY2xvc2Uoc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wpCiB7Ci0gIGlmKGNvbm5zc2wtPmhhbmRsZSkgewotICAgICh2b2lkKVNTTF9zaHV0ZG93bihjb25uc3NsLT5oYW5kbGUpOwotICAgIFNTTF9zZXRfY29ubmVjdF9zdGF0ZShjb25uc3NsLT5oYW5kbGUpOworICBpZihCQUNLRU5ELT5oYW5kbGUpIHsKKyAgICAodm9pZClTU0xfc2h1dGRvd24oQkFDS0VORC0+aGFuZGxlKTsKKyAgICBTU0xfc2V0X2Nvbm5lY3Rfc3RhdGUoQkFDS0VORC0+aGFuZGxlKTsKIAotICAgIFNTTF9mcmVlKGNvbm5zc2wtPmhhbmRsZSk7Ci0gICAgY29ubnNzbC0+aGFuZGxlID0gTlVMTDsKKyAgICBTU0xfZnJlZShCQUNLRU5ELT5oYW5kbGUpOworICAgIEJBQ0tFTkQtPmhhbmRsZSA9IE5VTEw7CiAgIH0KLSAgaWYoY29ubnNzbC0+Y3R4KSB7Ci0gICAgU1NMX0NUWF9mcmVlKGNvbm5zc2wtPmN0eCk7Ci0gICAgY29ubnNzbC0+Y3R4ID0gTlVMTDsKKyAgaWYoQkFDS0VORC0+Y3R4KSB7CisgICAgU1NMX0NUWF9mcmVlKEJBQ0tFTkQtPmN0eCk7CisgICAgQkFDS0VORC0+Y3R4ID0gTlVMTDsKICAgfQogfQogCiAvKgogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhbiBTU0wgY29ubmVjdGlvbiBpcyBjbG9zZWQuCiAgKi8KLXZvaWQgQ3VybF9vc3NsX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKK3N0YXRpYyB2b2lkIEN1cmxfb3NzbF9jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CiAgIG9zc2xfY2xvc2UoJmNvbm4tPnNzbFtzb2NraW5kZXhdKTsKICAgb3NzbF9jbG9zZSgmY29ubi0+cHJveHlfc3NsW3NvY2tpbmRleF0pOwpAQCAtOTY5LDcgKzExNzUsNyBAQAogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2h1dCBkb3duIHRoZSBTU0wgbGF5ZXIgYnV0IGtlZXAgdGhlCiAgKiBzb2NrZXQgb3BlbiAoQ0NDIC0gQ2xlYXIgQ29tbWFuZCBDaGFubmVsKQogICovCi1pbnQgQ3VybF9vc3NsX3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKK3N0YXRpYyBpbnQgQ3VybF9vc3NsX3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKICAgaW50IHJldHZhbCA9IDA7CiAgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwpAQCAtOTg4LDkgKzExOTQsOSBAQAogICAgICB3ZSBkbyBub3Qgc2VuZCBvbmUuIExldCdzIGhvcGUgb3RoZXIgc2VydmVycyBkbyB0aGUgc2FtZS4uLiAqLwogCiAgIGlmKGRhdGEtPnNldC5mdHBfY2NjID09IENVUkxGVFBTU0xfQ0NDX0FDVElWRSkKLSAgICAgICh2b2lkKVNTTF9zaHV0ZG93bihjb25uc3NsLT5oYW5kbGUpOworICAgICAgKHZvaWQpU1NMX3NodXRkb3duKEJBQ0tFTkQtPmhhbmRsZSk7CiAKLSAgaWYoY29ubnNzbC0+aGFuZGxlKSB7CisgIGlmKEJBQ0tFTkQtPmhhbmRsZSkgewogICAgIGJ1ZmZzaXplID0gKGludClzaXplb2YoYnVmKTsKICAgICB3aGlsZSghZG9uZSkgewogICAgICAgaW50IHdoYXQgPSBTT0NLRVRfUkVBREFCTEUoY29ubi0+c29ja1tzb2NraW5kZXhdLApAQCAtMTAwMCw5ICsxMjA2LDggQEAKIAogICAgICAgICAvKiBTb21ldGhpbmcgdG8gcmVhZCwgbGV0J3MgZG8gaXQgYW5kIGhvcGUgdGhhdCBpdCBpcyB0aGUgY2xvc2UKICAgICAgICAgICAgbm90aWZ5IGFsZXJ0IGZyb20gdGhlIHNlcnZlciAqLwotICAgICAgICBucmVhZCA9IChzc2l6ZV90KVNTTF9yZWFkKGNvbm4tPnNzbFtzb2NraW5kZXhdLmhhbmRsZSwgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZzaXplKTsKLSAgICAgICAgZXJyID0gU1NMX2dldF9lcnJvcihjb25uLT5zc2xbc29ja2luZGV4XS5oYW5kbGUsIChpbnQpbnJlYWQpOworICAgICAgICBucmVhZCA9IChzc2l6ZV90KVNTTF9yZWFkKEJBQ0tFTkQtPmhhbmRsZSwgYnVmLCBidWZmc2l6ZSk7CisgICAgICAgIGVyciA9IFNTTF9nZXRfZXJyb3IoQkFDS0VORC0+aGFuZGxlLCAoaW50KW5yZWFkKTsKIAogICAgICAgICBzd2l0Y2goZXJyKSB7CiAgICAgICAgIGNhc2UgU1NMX0VSUk9SX05PTkU6IC8qIHRoaXMgaXMgbm90IGFuIGVycm9yICovCkBAIC0xMDQ3LDcgKzEyNTIsNyBAQAogCiAgICAgaWYoZGF0YS0+c2V0LnZlcmJvc2UpIHsKICNpZmRlZiBIQVZFX1NTTF9HRVRfU0hVVERPV04KLSAgICAgIHN3aXRjaChTU0xfZ2V0X3NodXRkb3duKGNvbm5zc2wtPmhhbmRsZSkpIHsKKyAgICAgIHN3aXRjaChTU0xfZ2V0X3NodXRkb3duKEJBQ0tFTkQtPmhhbmRsZSkpIHsKICAgICAgIGNhc2UgU1NMX1NFTlRfU0hVVERPV046CiAgICAgICAgIGluZm9mKGRhdGEsICJTU0xfZ2V0X3NodXRkb3duKCkgcmV0dXJuZWQgU1NMX1NFTlRfU0hVVERPV05cbiIpOwogICAgICAgICBicmVhazsKQEAgLTEwNjIsMTMgKzEyNjcsMTMgQEAKICNlbmRpZgogICAgIH0KIAotICAgIFNTTF9mcmVlKGNvbm5zc2wtPmhhbmRsZSk7Ci0gICAgY29ubnNzbC0+aGFuZGxlID0gTlVMTDsKKyAgICBTU0xfZnJlZShCQUNLRU5ELT5oYW5kbGUpOworICAgIEJBQ0tFTkQtPmhhbmRsZSA9IE5VTEw7CiAgIH0KICAgcmV0dXJuIHJldHZhbDsKIH0KIAotdm9pZCBDdXJsX29zc2xfc2Vzc2lvbl9mcmVlKHZvaWQgKnB0cikKK3N0YXRpYyB2b2lkIEN1cmxfb3NzbF9zZXNzaW9uX2ZyZWUodm9pZCAqcHRyKQogewogICAvKiBmcmVlIHRoZSBJRCAqLwogICBTU0xfU0VTU0lPTl9mcmVlKHB0cik7CkBAIC0xMDc4LDcgKzEyODMsNyBAQAogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgJ2RhdGEnIHN0cnVjdCBpcyBnb2luZyBhd2F5LiBDbG9zZQogICogZG93biBldmVyeXRoaW5nIGFuZCBmcmVlIGFsbCByZXNvdXJjZXMhCiAgKi8KLXZvaWQgQ3VybF9vc3NsX2Nsb3NlX2FsbChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQorc3RhdGljIHZvaWQgQ3VybF9vc3NsX2Nsb3NlX2FsbChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQogewogI2lmZGVmIEhBVkVfT1BFTlNTTF9FTkdJTkVfSAogICBpZihkYXRhLT5zdGF0ZS5lbmdpbmUpIHsKQEAgLTExNzAsNyArMTM3NSw3IEBACiAgICAgbnVtYWx0cyA9IHNrX0dFTkVSQUxfTkFNRV9udW0oYWx0bmFtZXMpOwogCiAgICAgLyogbG9vcCB0aHJvdWdoIGFsbCBhbHRlcm5hdGl2ZXMgLSB1bnRpbCBhIGRuc21hdGNoICovCi0gICAgZm9yKGk9MDsgKGkgPCBudW1hbHRzKSAmJiAhZG5zbWF0Y2hlZDsgaSsrKSB7CisgICAgZm9yKGkgPSAwOyAoaSA8IG51bWFsdHMpICYmICFkbnNtYXRjaGVkOyBpKyspIHsKICAgICAgIC8qIGdldCBhIGhhbmRsZSB0byBhbHRlcm5hdGl2ZSBuYW1lIG51bWJlciBpICovCiAgICAgICBjb25zdCBHRU5FUkFMX05BTUUgKmNoZWNrID0gc2tfR0VORVJBTF9OQU1FX3ZhbHVlKGFsdG5hbWVzLCBpKTsKIApAQCAtMTIzOSw3ICsxNDQ0LDcgQEAKICAgZWxzZSB7CiAgICAgLyogd2UgaGF2ZSB0byBsb29rIHRvIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgYSBjb21tb25OYW1lIGluIHRoZQogICAgICAgIGRpc3Rpbmd1aXNoZWQgb25lIHRvIGdldCB0aGUgbW9zdCBzaWduaWZpY2FudCBvbmUuICovCi0gICAgaW50IGosIGk9LTE7CisgICAgaW50IGosIGkgPSAtMTsKIAogICAgIC8qIFRoZSBmb2xsb3dpbmcgaXMgZG9uZSBiZWNhdXNlIG9mIGEgYnVnIGluIDAuOS42YiAqLwogCkBAIC0xMjQ4LDE0ICsxNDUzLDE0IEBACiAKICAgICBYNTA5X05BTUUgKm5hbWUgPSBYNTA5X2dldF9zdWJqZWN0X25hbWUoc2VydmVyX2NlcnQpOwogICAgIGlmKG5hbWUpCi0gICAgICB3aGlsZSgoaiA9IFg1MDlfTkFNRV9nZXRfaW5kZXhfYnlfTklEKG5hbWUsIE5JRF9jb21tb25OYW1lLCBpKSk+PTApCi0gICAgICAgIGk9ajsKKyAgICAgIHdoaWxlKChqID0gWDUwOV9OQU1FX2dldF9pbmRleF9ieV9OSUQobmFtZSwgTklEX2NvbW1vbk5hbWUsIGkpKSA+PSAwKQorICAgICAgICBpID0gajsKIAogICAgIC8qIHdlIGhhdmUgdGhlIG5hbWUgZW50cnkgYW5kIHdlIHdpbGwgbm93IGNvbnZlcnQgdGhpcyB0byBhIHN0cmluZwogICAgICAgIHRoYXQgd2UgY2FuIHVzZSBmb3IgY29tcGFyaXNvbi4gRG9pbmcgdGhpcyB3ZSBzdXBwb3J0IEJNUHN0cmluZywKICAgICAgICBVVEY4IGV0Yy4gKi8KIAotICAgIGlmKGk+PTApIHsKKyAgICBpZihpID49IDApIHsKICAgICAgIEFTTjFfU1RSSU5HICp0bXAgPQogICAgICAgICBYNTA5X05BTUVfRU5UUllfZ2V0X2RhdGEoWDUwOV9OQU1FX2dldF9lbnRyeShuYW1lLCBpKSk7CiAKQEAgLTEyNjgsNyArMTQ3Myw3IEBACiAgICAgICAgIGlmKEFTTjFfU1RSSU5HX3R5cGUodG1wKSA9PSBWX0FTTjFfVVRGOFNUUklORykgewogICAgICAgICAgIGogPSBBU04xX1NUUklOR19sZW5ndGgodG1wKTsKICAgICAgICAgICBpZihqID49IDApIHsKLSAgICAgICAgICAgIHBlZXJfQ04gPSBPUEVOU1NMX21hbGxvYyhqKzEpOworICAgICAgICAgICAgcGVlcl9DTiA9IE9QRU5TU0xfbWFsbG9jKGogKyAxKTsKICAgICAgICAgICAgIGlmKHBlZXJfQ04pIHsKICAgICAgICAgICAgICAgbWVtY3B5KHBlZXJfQ04sIEFTTjFfU1RSSU5HX2dldDBfZGF0YSh0bXApLCBqKTsKICAgICAgICAgICAgICAgcGVlcl9DTltqXSA9ICdcMCc7CkBAIC0xMjkxLDcgKzE0OTYsOCBAQAogICAgICAgIHBlZXJfQ04gPSBOVUxMOwogICAgIGVsc2UgewogICAgICAgLyogY29udmVydCBwZWVyX0NOIGZyb20gVVRGOCAqLwotICAgICAgQ1VSTGNvZGUgcmMgPSBDdXJsX2NvbnZlcnRfZnJvbV91dGY4KGRhdGEsIHBlZXJfQ04sIHN0cmxlbihwZWVyX0NOKSk7CisgICAgICBDVVJMY29kZSByYyA9IEN1cmxfY29udmVydF9mcm9tX3V0ZjgoZGF0YSwgKGNoYXIgKilwZWVyX0NOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbigoY2hhciAqKXBlZXJfQ04pKTsKICAgICAgIC8qIEN1cmxfY29udmVydF9mcm9tX3V0ZjggY2FsbHMgZmFpbGYgaWYgdW5zdWNjZXNzZnVsICovCiAgICAgICBpZihyYykgewogICAgICAgICBPUEVOU1NMX2ZyZWUocGVlcl9DTik7CkBAIC0xMzM3LDcgKzE1NDMsNyBAQAogICBYNTA5X1NUT1JFICAgICAqc3QgPSBOVUxMOwogICBTVEFDS19PRihYNTA5KSAqY2ggPSBOVUxMOwogCi0gIGxvbmcgbGVuID0gU1NMX2dldF90bHNleHRfc3RhdHVzX29jc3BfcmVzcChjb25uc3NsLT5oYW5kbGUsICZwKTsKKyAgbG9uZyBsZW4gPSBTU0xfZ2V0X3Rsc2V4dF9zdGF0dXNfb2NzcF9yZXNwKEJBQ0tFTkQtPmhhbmRsZSwgJnApOwogCiAgIGlmKCFwKSB7CiAgICAgZmFpbGYoZGF0YSwgIk5vIE9DU1AgcmVzcG9uc2UgcmVjZWl2ZWQiKTsKQEAgLTEzNjcsOCArMTU3Myw4IEBACiAgICAgZ290byBlbmQ7CiAgIH0KIAotICBjaCA9IFNTTF9nZXRfcGVlcl9jZXJ0X2NoYWluKGNvbm5zc2wtPmhhbmRsZSk7Ci0gIHN0ID0gU1NMX0NUWF9nZXRfY2VydF9zdG9yZShjb25uc3NsLT5jdHgpOworICBjaCA9IFNTTF9nZXRfcGVlcl9jZXJ0X2NoYWluKEJBQ0tFTkQtPmhhbmRsZSk7CisgIHN0ID0gU1NMX0NUWF9nZXRfY2VydF9zdG9yZShCQUNLRU5ELT5jdHgpOwogCiAjaWYgKChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDw9IDB4MTAwMDIwMWZMKSAvKiBGaXhlZCBhZnRlciAxLjAuMmEgKi8gfHwgXAogICAgICAoZGVmaW5lZChMSUJSRVNTTF9WRVJTSU9OX05VTUJFUikgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTc1OSw3ICsxOTY1LDcgQEAKICNpZmRlZiBUTFMxXzNfVkVSU0lPTgogICAgIHsKICAgICAgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwotICAgICAgU1NMX0NUWF9zZXRfbWF4X3Byb3RvX3ZlcnNpb24oY29ubnNzbC0+Y3R4LCBUTFMxXzNfVkVSU0lPTik7CisgICAgICBTU0xfQ1RYX3NldF9tYXhfcHJvdG9fdmVyc2lvbihCQUNLRU5ELT5jdHgsIFRMUzFfM19WRVJTSU9OKTsKICAgICAgICpjdHhfb3B0aW9ucyB8PSBTU0xfT1BfTk9fVExTdjFfMjsKICAgICB9CiAjZWxzZQpAQCAtMTc2Nyw2ICsxOTczLDcgQEAKICAgICAgIGZhaWxmKGRhdGEsIE9TU0xfUEFDS0FHRSAiIHdhcyBidWlsdCB3aXRob3V0IFRMUyAxLjMgc3VwcG9ydCIpOwogICAgICAgcmV0dXJuIENVUkxFX05PVF9CVUlMVF9JTjsKICNlbmRpZgorICAgICAgLyogRkFMTFRIUk9VR0ggKi8KICAgICBjYXNlIENVUkxfU1NMVkVSU0lPTl9UTFN2MV8yOgogI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgxMDAwMTAwRkwKICAgICAgICpjdHhfb3B0aW9ucyB8PSBTU0xfT1BfTk9fVExTdjFfMTsKQEAgLTE5MDksMjUgKzIxMTYsMjUgQEAKICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CiAgIH0KIAotICBpZihjb25uc3NsLT5jdHgpCi0gICAgU1NMX0NUWF9mcmVlKGNvbm5zc2wtPmN0eCk7Ci0gIGNvbm5zc2wtPmN0eCA9IFNTTF9DVFhfbmV3KHJlcV9tZXRob2QpOworICBpZihCQUNLRU5ELT5jdHgpCisgICAgU1NMX0NUWF9mcmVlKEJBQ0tFTkQtPmN0eCk7CisgIEJBQ0tFTkQtPmN0eCA9IFNTTF9DVFhfbmV3KHJlcV9tZXRob2QpOwogCi0gIGlmKCFjb25uc3NsLT5jdHgpIHsKKyAgaWYoIUJBQ0tFTkQtPmN0eCkgewogICAgIGZhaWxmKGRhdGEsICJTU0w6IGNvdWxkbid0IGNyZWF0ZSBhIGNvbnRleHQ6ICVzIiwKICAgICAgICAgICBvc3NsX3N0cmVycm9yKEVSUl9wZWVrX2Vycm9yKCksIGVycm9yX2J1ZmZlciwgc2l6ZW9mKGVycm9yX2J1ZmZlcikpKTsKICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgfQogCiAjaWZkZWYgU1NMX01PREVfUkVMRUFTRV9CVUZGRVJTCi0gIFNTTF9DVFhfc2V0X21vZGUoY29ubnNzbC0+Y3R4LCBTU0xfTU9ERV9SRUxFQVNFX0JVRkZFUlMpOworICBTU0xfQ1RYX3NldF9tb2RlKEJBQ0tFTkQtPmN0eCwgU1NMX01PREVfUkVMRUFTRV9CVUZGRVJTKTsKICNlbmRpZgogCiAjaWZkZWYgU1NMX0NUUkxfU0VUX01TR19DQUxMQkFDSwogICBpZihkYXRhLT5zZXQuZmRlYnVnICYmIGRhdGEtPnNldC52ZXJib3NlKSB7CiAgICAgLyogdGhlIFNTTCB0cmFjZSBjYWxsYmFjayBpcyBvbmx5IHVzZWQgZm9yIHZlcmJvc2UgbG9nZ2luZyAqLwotICAgIFNTTF9DVFhfc2V0X21zZ19jYWxsYmFjayhjb25uc3NsLT5jdHgsIHNzbF90bHNfdHJhY2UpOwotICAgIFNTTF9DVFhfc2V0X21zZ19jYWxsYmFja19hcmcoY29ubnNzbC0+Y3R4LCBjb25uKTsKKyAgICBTU0xfQ1RYX3NldF9tc2dfY2FsbGJhY2soQkFDS0VORC0+Y3R4LCBzc2xfdGxzX3RyYWNlKTsKKyAgICBTU0xfQ1RYX3NldF9tc2dfY2FsbGJhY2tfYXJnKEJBQ0tFTkQtPmN0eCwgY29ubik7CiAgIH0KICNlbmRpZgogCkBAIC0yMDQ0LDExICsyMjUxLDExIEBACiAgICAgcmV0dXJuIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SOwogICB9CiAKLSAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjb25uc3NsLT5jdHgsIGN0eF9vcHRpb25zKTsKKyAgU1NMX0NUWF9zZXRfb3B0aW9ucyhCQUNLRU5ELT5jdHgsIGN0eF9vcHRpb25zKTsKIAogI2lmZGVmIEhBU19OUE4KICAgaWYoY29ubi0+Yml0cy50bHNfZW5hYmxlX25wbikKLSAgICBTU0xfQ1RYX3NldF9uZXh0X3Byb3RvX3NlbGVjdF9jYihjb25uc3NsLT5jdHgsIHNlbGVjdF9uZXh0X3Byb3RvX2NiLCBjb25uKTsKKyAgICBTU0xfQ1RYX3NldF9uZXh0X3Byb3RvX3NlbGVjdF9jYihCQUNLRU5ELT5jdHgsIHNlbGVjdF9uZXh0X3Byb3RvX2NiLCBjb25uKTsKICNlbmRpZgogCiAjaWZkZWYgSEFTX0FMUE4KQEAgLTIwNTcsNyArMjI2NCw4IEBACiAgICAgdW5zaWduZWQgY2hhciBwcm90b2NvbHNbMTI4XTsKIAogI2lmZGVmIFVTRV9OR0hUVFAyCi0gICAgaWYoZGF0YS0+c2V0Lmh0dHB2ZXJzaW9uID49IENVUkxfSFRUUF9WRVJTSU9OXzIpIHsKKyAgICBpZihkYXRhLT5zZXQuaHR0cHZlcnNpb24gPj0gQ1VSTF9IVFRQX1ZFUlNJT05fMiAmJgorICAgICAgICghU1NMX0lTX1BST1hZKCkgfHwgIWNvbm4tPmJpdHMudHVubmVsX3Byb3h5KSkgewogICAgICAgcHJvdG9jb2xzW2N1cisrXSA9IE5HSFRUUDJfUFJPVE9fVkVSU0lPTl9JRF9MRU47CiAKICAgICAgIG1lbWNweSgmcHJvdG9jb2xzW2N1cl0sIE5HSFRUUDJfUFJPVE9fVkVSU0lPTl9JRCwKQEAgLTIwNzUsMTIgKzIyODMsMTIgQEAKICAgICAvKiBleHBlY3RzIGxlbmd0aCBwcmVmaXhlZCBwcmVmZXJlbmNlIG9yZGVyZWQgbGlzdCBvZiBwcm90b2NvbHMgaW4gd2lyZQogICAgICAqIGZvcm1hdAogICAgICAqLwotICAgIFNTTF9DVFhfc2V0X2FscG5fcHJvdG9zKGNvbm5zc2wtPmN0eCwgcHJvdG9jb2xzLCBjdXIpOworICAgIFNTTF9DVFhfc2V0X2FscG5fcHJvdG9zKEJBQ0tFTkQtPmN0eCwgcHJvdG9jb2xzLCBjdXIpOwogICB9CiAjZW5kaWYKIAogICBpZihzc2xfY2VydCB8fCBzc2xfY2VydF90eXBlKSB7Ci0gICAgaWYoIWNlcnRfc3R1ZmYoY29ubiwgY29ubnNzbC0+Y3R4LCBzc2xfY2VydCwgc3NsX2NlcnRfdHlwZSwKKyAgICBpZighY2VydF9zdHVmZihjb25uLCBCQUNLRU5ELT5jdHgsIHNzbF9jZXJ0LCBzc2xfY2VydF90eXBlLAogICAgICAgICAgICAgICAgICAgIFNTTF9TRVRfT1BUSU9OKGtleSksIFNTTF9TRVRfT1BUSU9OKGtleV90eXBlKSwKICAgICAgICAgICAgICAgICAgICBTU0xfU0VUX09QVElPTihrZXlfcGFzc3dkKSkpIHsKICAgICAgIC8qIGZhaWxmKCkgaXMgYWxyZWFkeSBkb25lIGluIGNlcnRfc3R1ZmYoKSAqLwpAQCAtMjA5MSwxMSArMjI5OSwxMyBAQAogICBjaXBoZXJzID0gU1NMX0NPTk5fQ09ORklHKGNpcGhlcl9saXN0KTsKICAgaWYoIWNpcGhlcnMpCiAgICAgY2lwaGVycyA9IChjaGFyICopREVGQVVMVF9DSVBIRVJfU0VMRUNUSU9OOwotICBpZighU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoY29ubnNzbC0+Y3R4LCBjaXBoZXJzKSkgewotICAgIGZhaWxmKGRhdGEsICJmYWlsZWQgc2V0dGluZyBjaXBoZXIgbGlzdDogJXMiLCBjaXBoZXJzKTsKLSAgICByZXR1cm4gQ1VSTEVfU1NMX0NJUEhFUjsKKyAgaWYoY2lwaGVycykgeworICAgIGlmKCFTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdChCQUNLRU5ELT5jdHgsIGNpcGhlcnMpKSB7CisgICAgICBmYWlsZihkYXRhLCAiZmFpbGVkIHNldHRpbmcgY2lwaGVyIGxpc3Q6ICVzIiwgY2lwaGVycyk7CisgICAgICByZXR1cm4gQ1VSTEVfU1NMX0NJUEhFUjsKKyAgICB9CisgICAgaW5mb2YoZGF0YSwgIkNpcGhlciBzZWxlY3Rpb246ICVzXG4iLCBjaXBoZXJzKTsKICAgfQotICBpbmZvZihkYXRhLCAiQ2lwaGVyIHNlbGVjdGlvbjogJXNcbiIsIGNpcGhlcnMpOwogCiAjaWZkZWYgVVNFX1RMU19TUlAKICAgaWYoc3NsX2F1dGh0eXBlID09IENVUkxfVExTQVVUSF9TUlApIHsKQEAgLTIxMDMsMTggKzIzMTMsMTggQEAKIAogICAgIGluZm9mKGRhdGEsICJVc2luZyBUTFMtU1JQIHVzZXJuYW1lOiAlc1xuIiwgc3NsX3VzZXJuYW1lKTsKIAotICAgIGlmKCFTU0xfQ1RYX3NldF9zcnBfdXNlcm5hbWUoY29ubnNzbC0+Y3R4LCBzc2xfdXNlcm5hbWUpKSB7CisgICAgaWYoIVNTTF9DVFhfc2V0X3NycF91c2VybmFtZShCQUNLRU5ELT5jdHgsIHNzbF91c2VybmFtZSkpIHsKICAgICAgIGZhaWxmKGRhdGEsICJVbmFibGUgdG8gc2V0IFNSUCB1c2VyIG5hbWUiKTsKICAgICAgIHJldHVybiBDVVJMRV9CQURfRlVOQ1RJT05fQVJHVU1FTlQ7CiAgICAgfQotICAgIGlmKCFTU0xfQ1RYX3NldF9zcnBfcGFzc3dvcmQoY29ubnNzbC0+Y3R4LCBTU0xfU0VUX09QVElPTihwYXNzd29yZCkpKSB7CisgICAgaWYoIVNTTF9DVFhfc2V0X3NycF9wYXNzd29yZChCQUNLRU5ELT5jdHgsIFNTTF9TRVRfT1BUSU9OKHBhc3N3b3JkKSkpIHsKICAgICAgIGZhaWxmKGRhdGEsICJmYWlsZWQgc2V0dGluZyBTUlAgcGFzc3dvcmQiKTsKICAgICAgIHJldHVybiBDVVJMRV9CQURfRlVOQ1RJT05fQVJHVU1FTlQ7CiAgICAgfQogICAgIGlmKCFTU0xfQ09OTl9DT05GSUcoY2lwaGVyX2xpc3QpKSB7CiAgICAgICBpbmZvZihkYXRhLCAiU2V0dGluZyBjaXBoZXIgbGlzdCBTUlBcbiIpOwogCi0gICAgICBpZighU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoY29ubnNzbC0+Y3R4LCAiU1JQIikpIHsKKyAgICAgIGlmKCFTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdChCQUNLRU5ELT5jdHgsICJTUlAiKSkgewogICAgICAgICBmYWlsZihkYXRhLCAiZmFpbGVkIHNldHRpbmcgU1JQIGNpcGhlciBsaXN0Iik7CiAgICAgICAgIHJldHVybiBDVVJMRV9TU0xfQ0lQSEVSOwogICAgICAgfQpAQCAtMjEyNSw3ICsyMzM1LDcgQEAKICAgaWYoc3NsX2NhZmlsZSB8fCBzc2xfY2FwYXRoKSB7CiAgICAgLyogdGVsbCBTU0wgd2hlcmUgdG8gZmluZCBDQSBjZXJ0aWZpY2F0ZXMgdGhhdCBhcmUgdXNlZCB0byB2ZXJpZnkKICAgICAgICB0aGUgc2VydmVycyBjZXJ0aWZpY2F0ZS4gKi8KLSAgICBpZighU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY29ubnNzbC0+Y3R4LCBzc2xfY2FmaWxlLCBzc2xfY2FwYXRoKSkgeworICAgIGlmKCFTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhCQUNLRU5ELT5jdHgsIHNzbF9jYWZpbGUsIHNzbF9jYXBhdGgpKSB7CiAgICAgICBpZih2ZXJpZnlwZWVyKSB7CiAgICAgICAgIC8qIEZhaWwgaWYgd2UgaW5zaXN0IG9uIHN1Y2Nlc3NmdWxseSB2ZXJpZnlpbmcgdGhlIHNlcnZlci4gKi8KICAgICAgICAgZmFpbGYoZGF0YSwgImVycm9yIHNldHRpbmcgY2VydGlmaWNhdGUgdmVyaWZ5IGxvY2F0aW9uczpcbiIKQEAgLTIxNTMsMTQgKzIzNjMsMTQgQEAKICAgZWxzZSBpZih2ZXJpZnlwZWVyKSB7CiAgICAgLyogdmVyZnlpbmcgdGhlIHBlZXIgd2l0aG91dCBhbnkgQ0EgY2VydGlmaWNhdGVzIHdvbid0CiAgICAgICAgd29yayBzbyB1c2Ugb3BlbnNzbCdzIGJ1aWx0IGluIGRlZmF1bHQgYXMgZmFsbGJhY2sgKi8KLSAgICBTU0xfQ1RYX3NldF9kZWZhdWx0X3ZlcmlmeV9wYXRocyhjb25uc3NsLT5jdHgpOworICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKEJBQ0tFTkQtPmN0eCk7CiAgIH0KICNlbmRpZgogCiAgIGlmKHNzbF9jcmxmaWxlKSB7CiAgICAgLyogdGVsbCBTU0wgd2hlcmUgdG8gZmluZCBDUkwgZmlsZSB0aGF0IGlzIHVzZWQgdG8gY2hlY2sgY2VydGlmaWNhdGUKICAgICAgKiByZXZvY2F0aW9uICovCi0gICAgbG9va3VwPVg1MDlfU1RPUkVfYWRkX2xvb2t1cChTU0xfQ1RYX2dldF9jZXJ0X3N0b3JlKGNvbm5zc2wtPmN0eCksCisgICAgbG9va3VwID0gWDUwOV9TVE9SRV9hZGRfbG9va3VwKFNTTF9DVFhfZ2V0X2NlcnRfc3RvcmUoQkFDS0VORC0+Y3R4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfTE9PS1VQX2ZpbGUoKSk7CiAgICAgaWYoIWxvb2t1cCB8fAogICAgICAgICghWDUwOV9sb2FkX2NybF9maWxlKGxvb2t1cCwgc3NsX2NybGZpbGUsIFg1MDlfRklMRVRZUEVfUEVNKSkgKSB7CkBAIC0yMTY5LDcgKzIzNzksNyBAQAogICAgIH0KICAgICAvKiBFdmVyeXRoaW5nIGlzIGZpbmUuICovCiAgICAgaW5mb2YoZGF0YSwgInN1Y2Nlc3NmdWxseSBsb2FkIENSTCBmaWxlOlxuIik7Ci0gICAgWDUwOV9TVE9SRV9zZXRfZmxhZ3MoU1NMX0NUWF9nZXRfY2VydF9zdG9yZShjb25uc3NsLT5jdHgpLAorICAgIFg1MDlfU1RPUkVfc2V0X2ZsYWdzKFNTTF9DVFhfZ2V0X2NlcnRfc3RvcmUoQkFDS0VORC0+Y3R4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBYNTA5X1ZfRkxBR19DUkxfQ0hFQ0t8WDUwOV9WX0ZMQUdfQ1JMX0NIRUNLX0FMTCk7CiAKICAgICBpbmZvZihkYXRhLCAiICBDUkxmaWxlOiAlc1xuIiwgc3NsX2NybGZpbGUpOwpAQCAtMjE4NCw3ICsyMzk0LDcgQEAKICAgKi8KICNpZiBkZWZpbmVkKFg1MDlfVl9GTEFHX1RSVVNURURfRklSU1QpICYmICFkZWZpbmVkKFg1MDlfVl9GTEFHX05PX0FMVF9DSEFJTlMpCiAgIGlmKHZlcmlmeXBlZXIpIHsKLSAgICBYNTA5X1NUT1JFX3NldF9mbGFncyhTU0xfQ1RYX2dldF9jZXJ0X3N0b3JlKGNvbm5zc2wtPmN0eCksCisgICAgWDUwOV9TVE9SRV9zZXRfZmxhZ3MoU1NMX0NUWF9nZXRfY2VydF9zdG9yZShCQUNLRU5ELT5jdHgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfVl9GTEFHX1RSVVNURURfRklSU1QpOwogICB9CiAjZW5kaWYKQEAgLTIxOTMsMTIgKzI0MDMsMTkgQEAKICAgICogZmFpbCB0byBjb25uZWN0IGlmIHRoZSB2ZXJpZmljYXRpb24gZmFpbHMsIG9yIGlmIGl0IHNob3VsZCBjb250aW51ZQogICAgKiBhbnl3YXkuIEluIHRoZSBsYXR0ZXIgY2FzZSB0aGUgcmVzdWx0IG9mIHRoZSB2ZXJpZmljYXRpb24gaXMgY2hlY2tlZCB3aXRoCiAgICAqIFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdCgpIGJlbG93LiAqLwotICBTU0xfQ1RYX3NldF92ZXJpZnkoY29ubnNzbC0+Y3R4LAorICBTU0xfQ1RYX3NldF92ZXJpZnkoQkFDS0VORC0+Y3R4LAogICAgICAgICAgICAgICAgICAgICAgdmVyaWZ5cGVlciA/IFNTTF9WRVJJRllfUEVFUiA6IFNTTF9WRVJJRllfTk9ORSwgTlVMTCk7CiAKKyAgLyogRW5hYmxlIGxvZ2dpbmcgb2Ygc2VjcmV0cyB0byB0aGUgZmlsZSBzcGVjaWZpZWQgaW4gZW52IFNTTEtFWUxPR0ZJTEUuICovCisjaWYgZGVmaW5lZChFTkFCTEVfU1NMS0VZTE9HRklMRSkgJiYgZGVmaW5lZChIQVZFX0tFWUxPR19DQUxMQkFDSykKKyAgaWYoa2V5bG9nX2ZpbGUpIHsKKyAgICBTU0xfQ1RYX3NldF9rZXlsb2dfY2FsbGJhY2soY29ubnNzbC0+Y3R4LCBvc3NsX2tleWxvZ19jYWxsYmFjayk7CisgIH0KKyNlbmRpZgorCiAgIC8qIGdpdmUgYXBwbGljYXRpb24gYSBjaGFuY2UgdG8gaW50ZXJmZXJlIHdpdGggU1NMIHNldCB1cC4gKi8KICAgaWYoZGF0YS0+c2V0LnNzbC5mc3NsY3R4KSB7Ci0gICAgcmVzdWx0ID0gKCpkYXRhLT5zZXQuc3NsLmZzc2xjdHgpKGRhdGEsIGNvbm5zc2wtPmN0eCwKKyAgICByZXN1bHQgPSAoKmRhdGEtPnNldC5zc2wuZnNzbGN0eCkoZGF0YSwgQkFDS0VORC0+Y3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5zZXQuc3NsLmZzc2xjdHhwKTsKICAgICBpZihyZXN1bHQpIHsKICAgICAgIGZhaWxmKGRhdGEsICJlcnJvciBzaWduYWxlZCBieSBzc2wgY3R4IGNhbGxiYWNrIik7CkBAIC0yMjA3LDEwICsyNDI0LDEwIEBACiAgIH0KIAogICAvKiBMZXRzIG1ha2UgYW4gU1NMIHN0cnVjdHVyZSAqLwotICBpZihjb25uc3NsLT5oYW5kbGUpCi0gICAgU1NMX2ZyZWUoY29ubnNzbC0+aGFuZGxlKTsKLSAgY29ubnNzbC0+aGFuZGxlID0gU1NMX25ldyhjb25uc3NsLT5jdHgpOwotICBpZighY29ubnNzbC0+aGFuZGxlKSB7CisgIGlmKEJBQ0tFTkQtPmhhbmRsZSkKKyAgICBTU0xfZnJlZShCQUNLRU5ELT5oYW5kbGUpOworICBCQUNLRU5ELT5oYW5kbGUgPSBTU0xfbmV3KEJBQ0tFTkQtPmN0eCk7CisgIGlmKCFCQUNLRU5ELT5oYW5kbGUpIHsKICAgICBmYWlsZihkYXRhLCAiU1NMOiBjb3VsZG4ndCBjcmVhdGUgYSBjb250ZXh0IChoYW5kbGUpISIpOwogICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICB9CkBAIC0yMjE4LDE5ICsyNDM1LDE5IEBACiAjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwODA4ZkwpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fVExTRVhUKSAmJiBcCiAgICAgIWRlZmluZWQoT1BFTlNTTF9OT19PQ1NQKQogICBpZihTU0xfQ09OTl9DT05GSUcodmVyaWZ5c3RhdHVzKSkKLSAgICBTU0xfc2V0X3Rsc2V4dF9zdGF0dXNfdHlwZShjb25uc3NsLT5oYW5kbGUsIFRMU0VYVF9TVEFUVVNUWVBFX29jc3ApOworICAgIFNTTF9zZXRfdGxzZXh0X3N0YXR1c190eXBlKEJBQ0tFTkQtPmhhbmRsZSwgVExTRVhUX1NUQVRVU1RZUEVfb2NzcCk7CiAjZW5kaWYKIAotICBTU0xfc2V0X2Nvbm5lY3Rfc3RhdGUoY29ubnNzbC0+aGFuZGxlKTsKKyAgU1NMX3NldF9jb25uZWN0X3N0YXRlKEJBQ0tFTkQtPmhhbmRsZSk7CiAKLSAgY29ubnNzbC0+c2VydmVyX2NlcnQgPSAweDA7CisgIEJBQ0tFTkQtPnNlcnZlcl9jZXJ0ID0gMHgwOwogI2lmZGVmIFNTTF9DVFJMX1NFVF9UTFNFWFRfSE9TVE5BTUUKICAgaWYoKDAgPT0gQ3VybF9pbmV0X3B0b24oQUZfSU5FVCwgaG9zdG5hbWUsICZhZGRyKSkgJiYKICNpZmRlZiBFTkFCTEVfSVBWNgogICAgICAoMCA9PSBDdXJsX2luZXRfcHRvbihBRl9JTkVUNiwgaG9zdG5hbWUsICZhZGRyKSkgJiYKICNlbmRpZgogICAgICBzbmkgJiYKLSAgICAgIVNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZShjb25uc3NsLT5oYW5kbGUsIGhvc3RuYW1lKSkKKyAgICAgIVNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZShCQUNLRU5ELT5oYW5kbGUsIGhvc3RuYW1lKSkKICAgICBpbmZvZihkYXRhLCAiV0FSTklORzogZmFpbGVkIHRvIGNvbmZpZ3VyZSBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIChTTkkpICIKICAgICAgICAgICAiVExTIGV4dGVuc2lvblxuIik7CiAjZW5kaWYKQEAgLTIyNDIsNyArMjQ1OSw3IEBACiAgICAgQ3VybF9zc2xfc2Vzc2lvbmlkX2xvY2soY29ubik7CiAgICAgaWYoIUN1cmxfc3NsX2dldHNlc3Npb25pZChjb25uLCAmc3NsX3Nlc3Npb25pZCwgTlVMTCwgc29ja2luZGV4KSkgewogICAgICAgLyogd2UgZ290IGEgc2Vzc2lvbiBpZCwgdXNlIGl0ISAqLwotICAgICAgaWYoIVNTTF9zZXRfc2Vzc2lvbihjb25uc3NsLT5oYW5kbGUsIHNzbF9zZXNzaW9uaWQpKSB7CisgICAgICBpZighU1NMX3NldF9zZXNzaW9uKEJBQ0tFTkQtPmhhbmRsZSwgc3NsX3Nlc3Npb25pZCkpIHsKICAgICAgICAgQ3VybF9zc2xfc2Vzc2lvbmlkX3VubG9jayhjb25uKTsKICAgICAgICAgZmFpbGYoZGF0YSwgIlNTTDogU1NMX3NldF9zZXNzaW9uIGZhaWxlZDogJXMiLAogICAgICAgICAgICAgICBvc3NsX3N0cmVycm9yKEVSUl9nZXRfZXJyb3IoKSwgZXJyb3JfYnVmZmVyLApAQCAtMjI1NywxMyArMjQ3NCwxNCBAQAogCiAgIGlmKGNvbm4tPnByb3h5X3NzbFtzb2NraW5kZXhdLnVzZSkgewogICAgIEJJTyAqY29uc3QgYmlvID0gQklPX25ldyhCSU9fZl9zc2woKSk7CisgICAgU1NMICpoYW5kbGUgPSBjb25uLT5wcm94eV9zc2xbc29ja2luZGV4XS5iYWNrZW5kLT5oYW5kbGU7CiAgICAgREVCVUdBU1NFUlQoc3NsX2Nvbm5lY3Rpb25fY29tcGxldGUgPT0gY29ubi0+cHJveHlfc3NsW3NvY2tpbmRleF0uc3RhdGUpOwotICAgIERFQlVHQVNTRVJUKGNvbm4tPnByb3h5X3NzbFtzb2NraW5kZXhdLmhhbmRsZSAhPSBOVUxMKTsKKyAgICBERUJVR0FTU0VSVChoYW5kbGUgIT0gTlVMTCk7CiAgICAgREVCVUdBU1NFUlQoYmlvICE9IE5VTEwpOwotICAgIEJJT19zZXRfc3NsKGJpbywgY29ubi0+cHJveHlfc3NsW3NvY2tpbmRleF0uaGFuZGxlLCBGQUxTRSk7Ci0gICAgU1NMX3NldF9iaW8oY29ubnNzbC0+aGFuZGxlLCBiaW8sIGJpbyk7CisgICAgQklPX3NldF9zc2woYmlvLCBoYW5kbGUsIEZBTFNFKTsKKyAgICBTU0xfc2V0X2JpbyhCQUNLRU5ELT5oYW5kbGUsIGJpbywgYmlvKTsKICAgfQotICBlbHNlIGlmKCFTU0xfc2V0X2ZkKGNvbm5zc2wtPmhhbmRsZSwgKGludClzb2NrZmQpKSB7CisgIGVsc2UgaWYoIVNTTF9zZXRfZmQoQkFDS0VORC0+aGFuZGxlLCAoaW50KXNvY2tmZCkpIHsKICAgICAvKiBwYXNzIHRoZSByYXcgc29ja2V0IGludG8gdGhlIFNTTCBsYXllcnMgKi8KICAgICBmYWlsZihkYXRhLCAiU1NMOiBTU0xfc2V0X2ZkIGZhaWxlZDogJXMiLAogICAgICAgICAgIG9zc2xfc3RyZXJyb3IoRVJSX2dldF9lcnJvcigpLCBlcnJvcl9idWZmZXIsIHNpemVvZihlcnJvcl9idWZmZXIpKSk7CkBAIC0yMjg4LDEzICsyNTA2LDE4IEBACiAKICAgRVJSX2NsZWFyX2Vycm9yKCk7CiAKLSAgZXJyID0gU1NMX2Nvbm5lY3QoY29ubnNzbC0+aGFuZGxlKTsKKyAgZXJyID0gU1NMX2Nvbm5lY3QoQkFDS0VORC0+aGFuZGxlKTsKKyAgLyogSWYga2V5bG9nZ2luZyBpcyBlbmFibGVkIGJ1dCB0aGUga2V5bG9nIGNhbGxiYWNrIGlzIG5vdCBzdXBwb3J0ZWQgdGhlbiBsb2cKKyAgICAgc2VjcmV0cyBoZXJlLCBpbW1lZGlhdGVseSBhZnRlciBTU0xfY29ubmVjdCBieSB1c2luZyB0YXBfc3NsX2tleS4gKi8KKyNpZiBkZWZpbmVkKEVOQUJMRV9TU0xLRVlMT0dGSUxFKSAmJiAhZGVmaW5lZChIQVZFX0tFWUxPR19DQUxMQkFDSykKKyAgdGFwX3NzbF9rZXkoQkFDS0VORC0+aGFuZGxlLCAmQkFDS0VORC0+dGFwX3N0YXRlKTsKKyNlbmRpZgogCiAgIC8qIDEgIGlzIGZpbmUKICAgICAgMCAgaXMgIm5vdCBzdWNjZXNzZnVsIGJ1dCB3YXMgc2h1dCBkb3duIGNvbnRyb2xsZWQiCiAgICAgIDwwIGlzICJoYW5kc2hha2Ugd2FzIG5vdCBzdWNjZXNzZnVsLCBiZWNhdXNlIGEgZmF0YWwgZXJyb3Igb2NjdXJyZWQiICovCiAgIGlmKDEgIT0gZXJyKSB7Ci0gICAgaW50IGRldGFpbCA9IFNTTF9nZXRfZXJyb3IoY29ubnNzbC0+aGFuZGxlLCBlcnIpOworICAgIGludCBkZXRhaWwgPSBTU0xfZ2V0X2Vycm9yKEJBQ0tFTkQtPmhhbmRsZSwgZXJyKTsKIAogICAgIGlmKFNTTF9FUlJPUl9XQU5UX1JFQUQgPT0gZGV0YWlsKSB7CiAgICAgICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID0gc3NsX2Nvbm5lY3RfMl9yZWFkaW5nOwpAQCAtMjMyOCw3ICsyNTUxLDcgQEAKICAgICAgICAgIChyZWFzb24gPT0gU1NMX1JfQ0VSVElGSUNBVEVfVkVSSUZZX0ZBSUxFRCkpIHsKICAgICAgICAgcmVzdWx0ID0gQ1VSTEVfU1NMX0NBQ0VSVDsKIAotICAgICAgICBsZXJyID0gU1NMX2dldF92ZXJpZnlfcmVzdWx0KGNvbm5zc2wtPmhhbmRsZSk7CisgICAgICAgIGxlcnIgPSBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoQkFDS0VORC0+aGFuZGxlKTsKICAgICAgICAgaWYobGVyciAhPSBYNTA5X1ZfT0spIHsKICAgICAgICAgICAqY2VydHZlcmlmeXJlc3VsdCA9IGxlcnI7CiAgICAgICAgICAgc25wcmludGYoZXJyb3JfYnVmZmVyLCBzaXplb2YoZXJyb3JfYnVmZmVyKSwKQEAgLTIzNzIsOCArMjU5NSw4IEBACiAKICAgICAvKiBJbmZvcm1hdGlvbmFsIG1lc3NhZ2UgKi8KICAgICBpbmZvZihkYXRhLCAiU1NMIGNvbm5lY3Rpb24gdXNpbmcgJXMgLyAlc1xuIiwKLSAgICAgICAgICBnZXRfc3NsX3ZlcnNpb25fdHh0KGNvbm5zc2wtPmhhbmRsZSksCi0gICAgICAgICAgU1NMX2dldF9jaXBoZXIoY29ubnNzbC0+aGFuZGxlKSk7CisgICAgICAgICAgZ2V0X3NzbF92ZXJzaW9uX3R4dChCQUNLRU5ELT5oYW5kbGUpLAorICAgICAgICAgIFNTTF9nZXRfY2lwaGVyKEJBQ0tFTkQtPmhhbmRsZSkpOwogCiAjaWZkZWYgSEFTX0FMUE4KICAgICAvKiBTZXRzIGRhdGEgYW5kIGxlbiB0byBuZWdvdGlhdGVkIHByb3RvY29sLCBsZW4gaXMgMCBpZiBubyBwcm90b2NvbCB3YXMKQEAgLTIzODIsNyArMjYwNSw3IEBACiAgICAgaWYoY29ubi0+Yml0cy50bHNfZW5hYmxlX2FscG4pIHsKICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5lZ19wcm90b2NvbDsKICAgICAgIHVuc2lnbmVkIGludCBsZW47Ci0gICAgICBTU0xfZ2V0MF9hbHBuX3NlbGVjdGVkKGNvbm5zc2wtPmhhbmRsZSwgJm5lZ19wcm90b2NvbCwgJmxlbik7CisgICAgICBTU0xfZ2V0MF9hbHBuX3NlbGVjdGVkKEJBQ0tFTkQtPmhhbmRsZSwgJm5lZ19wcm90b2NvbCwgJmxlbik7CiAgICAgICBpZihsZW4gIT0gMCkgewogICAgICAgICBpbmZvZihkYXRhLCAiQUxQTiwgc2VydmVyIGFjY2VwdGVkIHRvIHVzZSAlLipzXG4iLCBsZW4sIG5lZ19wcm90b2NvbCk7CiAKQEAgLTI0MjcsNyArMjY1MCw3IEBACiBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBsb25nIGluZm9fbGVuID0gQklPX2dldF9tZW1fZGF0YShtZW0sICZwdHIpOyBcCiAgIEN1cmxfc3NsX3B1c2hfY2VydGluZm9fbGVuKGRhdGEsIF9udW0sIF9sYWJlbCwgcHRyLCBpbmZvX2xlbik7IFwKLSAgaWYoMSE9QklPX3Jlc2V0KG1lbSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZigxICE9IEJJT19yZXNldChtZW0pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0gV0hJTEVfRkFMU0UKIApAQCAtMjQ3NSwxMiArMjY5OCwxMiBAQAogICAgIC8qIG5vIGV4dGVuc2lvbnMsIGJhaWwgb3V0ICovCiAgICAgcmV0dXJuIDE7CiAKLSAgZm9yKGk9MDsgaSA8IChpbnQpc2tfWDUwOV9FWFRFTlNJT05fbnVtKGV4dHMpOyBpKyspIHsKKyAgZm9yKGkgPSAwOyBpIDwgKGludClza19YNTA5X0VYVEVOU0lPTl9udW0oZXh0cyk7IGkrKykgewogICAgIEFTTjFfT0JKRUNUICpvYmo7CiAgICAgWDUwOV9FWFRFTlNJT04gKmV4dCA9IHNrX1g1MDlfRVhURU5TSU9OX3ZhbHVlKGV4dHMsIGkpOwogICAgIEJVRl9NRU0gKmJpb21lbTsKICAgICBjaGFyIGJ1Zls1MTJdOwotICAgIGNoYXIgKnB0cj1idWY7CisgICAgY2hhciAqcHRyID0gYnVmOwogICAgIGNoYXIgbmFtZWJ1ZlsxMjhdOwogICAgIEJJTyAqYmlvX291dCA9IEJJT19uZXcoQklPX3NfbWVtKCkpOwogCkBAIC0yNDk3LDE2ICsyNzIwLDE2IEBACiAgICAgQklPX2dldF9tZW1fcHRyKGJpb19vdXQsICZiaW9tZW0pOwogCiAgICAgZm9yKGogPSAwOyBqIDwgKHNpemVfdCliaW9tZW0tPmxlbmd0aDsgaisrKSB7Ci0gICAgICBjb25zdCBjaGFyICpzZXA9IiI7CisgICAgICBjb25zdCBjaGFyICpzZXAgPSAiIjsKICAgICAgIGlmKGJpb21lbS0+ZGF0YVtqXSA9PSAnXG4nKSB7Ci0gICAgICAgIHNlcD0iLCAiOworICAgICAgICBzZXAgPSAiLCAiOwogICAgICAgICBqKys7IC8qIHNraXAgdGhlIG5ld2xpbmUgKi8KICAgICAgIH07CiAgICAgICB3aGlsZSgoajwoc2l6ZV90KWJpb21lbS0+bGVuZ3RoKSAmJiAoYmlvbWVtLT5kYXRhW2pdID09ICcgJykpCiAgICAgICAgIGorKzsKICAgICAgIGlmKGo8KHNpemVfdCliaW9tZW0tPmxlbmd0aCkKLSAgICAgICAgcHRyKz1zbnByaW50ZihwdHIsIHNpemVvZihidWYpLShwdHItYnVmKSwgIiVzJWMiLCBzZXAsCi0gICAgICAgICAgICAgICAgICAgICAgYmlvbWVtLT5kYXRhW2pdKTsKKyAgICAgICAgcHRyICs9IHNucHJpbnRmKHB0ciwgc2l6ZW9mKGJ1ZiktKHB0ci1idWYpLCAiJXMlYyIsIHNlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpb21lbS0+ZGF0YVtqXSk7CiAgICAgfQogCiAgICAgQ3VybF9zc2xfcHVzaF9jZXJ0aW5mbyhkYXRhLCBjZXJ0bnVtLCBuYW1lYnVmLCBidWYpOwpAQCAtMjUyOCw3ICsyNzUxLDcgQEAKICAgaW50IG51bWNlcnRzOwogICBCSU8gKm1lbTsKIAotICBzayA9IFNTTF9nZXRfcGVlcl9jZXJ0X2NoYWluKGNvbm5zc2wtPmhhbmRsZSk7CisgIHNrID0gU1NMX2dldF9wZWVyX2NlcnRfY2hhaW4oQkFDS0VORC0+aGFuZGxlKTsKICAgaWYoIXNrKSB7CiAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CiAgIH0KQEAgLTI1NDUsMTAgKzI3NjgsMTAgQEAKICAgZm9yKGkgPSAwOyBpIDwgbnVtY2VydHM7IGkrKykgewogICAgIEFTTjFfSU5URUdFUiAqbnVtOwogICAgIFg1MDkgKnggPSBza19YNTA5X3ZhbHVlKHNrLCBpKTsKLSAgICBFVlBfUEtFWSAqcHVia2V5PU5VTEw7CisgICAgRVZQX1BLRVkgKnB1YmtleSA9IE5VTEw7CiAgICAgaW50IGo7CiAgICAgY2hhciAqcHRyOwotICAgIENPTlNUX0FTTjFfQklUX1NUUklORyBBU04xX0JJVF9TVFJJTkcgKnBzaWcgPSBOVUxMOworICAgIGNvbnN0IEFTTjFfQklUX1NUUklORyAqcHNpZyA9IE5VTEw7CiAKICAgICBYNTA5X05BTUVfcHJpbnRfZXgobWVtLCBYNTA5X2dldF9zdWJqZWN0X25hbWUoeCksIDAsIFhOX0ZMQUdfT05FTElORSk7CiAgICAgcHVzaF9jZXJ0aW5mbygiU3ViamVjdCIsIGkpOwpAQCAtMjgxOCw4ICszMDQxLDggQEAKICAgICAvKiB3ZSd2ZSBiZWVuIGFza2VkIHRvIGdhdGhlciBjZXJ0aWZpY2F0ZSBpbmZvISAqLwogICAgICh2b2lkKWdldF9jZXJ0X2NoYWluKGNvbm4sIGNvbm5zc2wpOwogCi0gIGNvbm5zc2wtPnNlcnZlcl9jZXJ0ID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKGNvbm5zc2wtPmhhbmRsZSk7Ci0gIGlmKCFjb25uc3NsLT5zZXJ2ZXJfY2VydCkgeworICBCQUNLRU5ELT5zZXJ2ZXJfY2VydCA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShCQUNLRU5ELT5oYW5kbGUpOworICBpZighQkFDS0VORC0+c2VydmVyX2NlcnQpIHsKICAgICBCSU9fZnJlZShtZW0pOwogICAgIGlmKCFzdHJpY3QpCiAgICAgICByZXR1cm4gQ1VSTEVfT0s7CkBAIC0yODMwLDE2ICszMDUzLDE2IEBACiAKICAgaW5mb2YoZGF0YSwgIiVzIGNlcnRpZmljYXRlOlxuIiwgU1NMX0lTX1BST1hZKCkgPyAiUHJveHkiIDogIlNlcnZlciIpOwogCi0gIHJjID0geDUwOV9uYW1lX29uZWxpbmUoWDUwOV9nZXRfc3ViamVjdF9uYW1lKGNvbm5zc2wtPnNlcnZlcl9jZXJ0KSwKKyAgcmMgPSB4NTA5X25hbWVfb25lbGluZShYNTA5X2dldF9zdWJqZWN0X25hbWUoQkFDS0VORC0+c2VydmVyX2NlcnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwogICBpbmZvZihkYXRhLCAiIHN1YmplY3Q6ICVzXG4iLCByYz8iW05PTkVdIjpidWZmZXIpOwogCi0gIEFTTjFfVElNRV9wcmludChtZW0sIFg1MDlfZ2V0MF9ub3RCZWZvcmUoY29ubnNzbC0+c2VydmVyX2NlcnQpKTsKKyAgQVNOMV9USU1FX3ByaW50KG1lbSwgWDUwOV9nZXQwX25vdEJlZm9yZShCQUNLRU5ELT5zZXJ2ZXJfY2VydCkpOwogICBsZW4gPSBCSU9fZ2V0X21lbV9kYXRhKG1lbSwgKGNoYXIgKiopICZwdHIpOwogICBpbmZvZihkYXRhLCAiIHN0YXJ0IGRhdGU6ICUuKnNcbiIsIGxlbiwgcHRyKTsKICAgcmMgPSBCSU9fcmVzZXQobWVtKTsKIAotICBBU04xX1RJTUVfcHJpbnQobWVtLCBYNTA5X2dldDBfbm90QWZ0ZXIoY29ubnNzbC0+c2VydmVyX2NlcnQpKTsKKyAgQVNOMV9USU1FX3ByaW50KG1lbSwgWDUwOV9nZXQwX25vdEFmdGVyKEJBQ0tFTkQtPnNlcnZlcl9jZXJ0KSk7CiAgIGxlbiA9IEJJT19nZXRfbWVtX2RhdGEobWVtLCAoY2hhciAqKikgJnB0cik7CiAgIGluZm9mKGRhdGEsICIgZXhwaXJlIGRhdGU6ICUuKnNcbiIsIGxlbiwgcHRyKTsKICAgcmMgPSBCSU9fcmVzZXQobWVtKTsKQEAgLTI4NDcsMTUgKzMwNzAsMTUgQEAKICAgQklPX2ZyZWUobWVtKTsKIAogICBpZihTU0xfQ09OTl9DT05GSUcodmVyaWZ5aG9zdCkpIHsKLSAgICByZXN1bHQgPSB2ZXJpZnlob3N0KGNvbm4sIGNvbm5zc2wtPnNlcnZlcl9jZXJ0KTsKKyAgICByZXN1bHQgPSB2ZXJpZnlob3N0KGNvbm4sIEJBQ0tFTkQtPnNlcnZlcl9jZXJ0KTsKICAgICBpZihyZXN1bHQpIHsKLSAgICAgIFg1MDlfZnJlZShjb25uc3NsLT5zZXJ2ZXJfY2VydCk7Ci0gICAgICBjb25uc3NsLT5zZXJ2ZXJfY2VydCA9IE5VTEw7CisgICAgICBYNTA5X2ZyZWUoQkFDS0VORC0+c2VydmVyX2NlcnQpOworICAgICAgQkFDS0VORC0+c2VydmVyX2NlcnQgPSBOVUxMOwogICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgIH0KIAotICByYyA9IHg1MDlfbmFtZV9vbmVsaW5lKFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKGNvbm5zc2wtPnNlcnZlcl9jZXJ0KSwKKyAgcmMgPSB4NTA5X25hbWVfb25lbGluZShYNTA5X2dldF9pc3N1ZXJfbmFtZShCQUNLRU5ELT5zZXJ2ZXJfY2VydCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CiAgIGlmKHJjKSB7CiAgICAgaWYoc3RyaWN0KQpAQCAtMjg3NSw4ICszMDk4LDggQEAKICAgICAgICAgaWYoc3RyaWN0KQogICAgICAgICAgIGZhaWxmKGRhdGEsICJTU0w6IFVuYWJsZSB0byBvcGVuIGlzc3VlciBjZXJ0ICglcykiLAogICAgICAgICAgICAgICAgIFNTTF9TRVRfT1BUSU9OKGlzc3VlcmNlcnQpKTsKLSAgICAgICAgWDUwOV9mcmVlKGNvbm5zc2wtPnNlcnZlcl9jZXJ0KTsKLSAgICAgICAgY29ubnNzbC0+c2VydmVyX2NlcnQgPSBOVUxMOworICAgICAgICBYNTA5X2ZyZWUoQkFDS0VORC0+c2VydmVyX2NlcnQpOworICAgICAgICBCQUNLRU5ELT5zZXJ2ZXJfY2VydCA9IE5VTEw7CiAgICAgICAgIHJldHVybiBDVVJMRV9TU0xfSVNTVUVSX0VSUk9SOwogICAgICAgfQogCkBAIC0yODg1LDcgKzMxMDgsNyBAQAogICAgICAgICBpZihzdHJpY3QpCiAgICAgICAgICAgZmFpbGYoZGF0YSwgIlNTTDogVW5hYmxlIHRvIHJlYWQgaXNzdWVyIGNlcnQgKCVzKSIsCiAgICAgICAgICAgICAgICAgU1NMX1NFVF9PUFRJT04oaXNzdWVyY2VydCkpOwotICAgICAgICBYNTA5X2ZyZWUoY29ubnNzbC0+c2VydmVyX2NlcnQpOworICAgICAgICBYNTA5X2ZyZWUoQkFDS0VORC0+c2VydmVyX2NlcnQpOwogICAgICAgICBYNTA5X2ZyZWUoaXNzdWVyKTsKICAgICAgICAgZmNsb3NlKGZwKTsKICAgICAgICAgcmV0dXJuIENVUkxFX1NTTF9JU1NVRVJfRVJST1I7CkBAIC0yODkzLDEzICszMTE2LDEzIEBACiAKICAgICAgIGZjbG9zZShmcCk7CiAKLSAgICAgIGlmKFg1MDlfY2hlY2tfaXNzdWVkKGlzc3VlciwgY29ubnNzbC0+c2VydmVyX2NlcnQpICE9IFg1MDlfVl9PSykgeworICAgICAgaWYoWDUwOV9jaGVja19pc3N1ZWQoaXNzdWVyLCBCQUNLRU5ELT5zZXJ2ZXJfY2VydCkgIT0gWDUwOV9WX09LKSB7CiAgICAgICAgIGlmKHN0cmljdCkKICAgICAgICAgICBmYWlsZihkYXRhLCAiU1NMOiBDZXJ0aWZpY2F0ZSBpc3N1ZXIgY2hlY2sgZmFpbGVkICglcykiLAogICAgICAgICAgICAgICAgIFNTTF9TRVRfT1BUSU9OKGlzc3VlcmNlcnQpKTsKLSAgICAgICAgWDUwOV9mcmVlKGNvbm5zc2wtPnNlcnZlcl9jZXJ0KTsKKyAgICAgICAgWDUwOV9mcmVlKEJBQ0tFTkQtPnNlcnZlcl9jZXJ0KTsKICAgICAgICAgWDUwOV9mcmVlKGlzc3Vlcik7Ci0gICAgICAgIGNvbm5zc2wtPnNlcnZlcl9jZXJ0ID0gTlVMTDsKKyAgICAgICAgQkFDS0VORC0+c2VydmVyX2NlcnQgPSBOVUxMOwogICAgICAgICByZXR1cm4gQ1VSTEVfU1NMX0lTU1VFUl9FUlJPUjsKICAgICAgIH0KIApAQCAtMjkwOCw3ICszMTMxLDcgQEAKICAgICAgIFg1MDlfZnJlZShpc3N1ZXIpOwogICAgIH0KIAotICAgIGxlcnIgPSAqY2VydHZlcmlmeXJlc3VsdCA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChjb25uc3NsLT5oYW5kbGUpOworICAgIGxlcnIgPSAqY2VydHZlcmlmeXJlc3VsdCA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChCQUNLRU5ELT5oYW5kbGUpOwogCiAgICAgaWYoKmNlcnR2ZXJpZnlyZXN1bHQgIT0gWDUwOV9WX09LKSB7CiAgICAgICBpZihTU0xfQ09OTl9DT05GSUcodmVyaWZ5cGVlcikpIHsKQEAgLTI5MzMsOCArMzE1Niw4IEBACiAgIGlmKFNTTF9DT05OX0NPTkZJRyh2ZXJpZnlzdGF0dXMpKSB7CiAgICAgcmVzdWx0ID0gdmVyaWZ5c3RhdHVzKGNvbm4sIGNvbm5zc2wpOwogICAgIGlmKHJlc3VsdCkgewotICAgICAgWDUwOV9mcmVlKGNvbm5zc2wtPnNlcnZlcl9jZXJ0KTsKLSAgICAgIGNvbm5zc2wtPnNlcnZlcl9jZXJ0ID0gTlVMTDsKKyAgICAgIFg1MDlfZnJlZShCQUNLRU5ELT5zZXJ2ZXJfY2VydCk7CisgICAgICBCQUNLRU5ELT5zZXJ2ZXJfY2VydCA9IE5VTEw7CiAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KICAgfQpAQCAtMjk0NywxMyArMzE3MCwxMyBAQAogICBwdHIgPSBTU0xfSVNfUFJPWFkoKSA/IGRhdGEtPnNldC5zdHJbU1RSSU5HX1NTTF9QSU5ORURQVUJMSUNLRVlfUFJPWFldIDoKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5zZXQuc3RyW1NUUklOR19TU0xfUElOTkVEUFVCTElDS0VZX09SSUddOwogICBpZighcmVzdWx0ICYmIHB0cikgewotICAgIHJlc3VsdCA9IHBrcF9waW5fcGVlcl9wdWJrZXkoZGF0YSwgY29ubnNzbC0+c2VydmVyX2NlcnQsIHB0cik7CisgICAgcmVzdWx0ID0gcGtwX3Bpbl9wZWVyX3B1YmtleShkYXRhLCBCQUNLRU5ELT5zZXJ2ZXJfY2VydCwgcHRyKTsKICAgICBpZihyZXN1bHQpCiAgICAgICBmYWlsZihkYXRhLCAiU1NMOiBwdWJsaWMga2V5IGRvZXMgbm90IG1hdGNoIHBpbm5lZCBwdWJsaWMga2V5ISIpOwogICB9CiAKLSAgWDUwOV9mcmVlKGNvbm5zc2wtPnNlcnZlcl9jZXJ0KTsKLSAgY29ubnNzbC0+c2VydmVyX2NlcnQgPSBOVUxMOworICBYNTA5X2ZyZWUoQkFDS0VORC0+c2VydmVyX2NlcnQpOworICBCQUNLRU5ELT5zZXJ2ZXJfY2VydCA9IE5VTEw7CiAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPSBzc2xfY29ubmVjdF9kb25lOwogCiAgIHJldHVybiByZXN1bHQ7CkBAIC0yOTcyLDcgKzMxOTUsNyBAQAogICAgIFNTTF9TRVNTSU9OICpvdXJfc3NsX3Nlc3Npb25pZDsKICAgICB2b2lkICpvbGRfc3NsX3Nlc3Npb25pZCA9IE5VTEw7CiAKLSAgICBvdXJfc3NsX3Nlc3Npb25pZCA9IFNTTF9nZXQxX3Nlc3Npb24oY29ubnNzbC0+aGFuZGxlKTsKKyAgICBvdXJfc3NsX3Nlc3Npb25pZCA9IFNTTF9nZXQxX3Nlc3Npb24oQkFDS0VORC0+aGFuZGxlKTsKIAogICAgIC8qIFNTTF9nZXQxX3Nlc3Npb24oKSB3aWxsIGluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IGFuZCB0aGUgc2Vzc2lvbgogICAgICAgICB3aWxsIHN0YXkgaW4gbWVtb3J5IHVudGlsIGV4cGxpY2l0bHkgZnJlZWQgd2l0aCBTU0xfU0VTU0lPTl9mcmVlKDMpLApAQCAtMzA3Nyw5ICszMzAwLDkgQEAKICAgICBpZihjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID09IHNzbF9jb25uZWN0XzJfcmVhZGluZyB8fAogICAgICAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPT0gc3NsX2Nvbm5lY3RfMl93cml0aW5nKSB7CiAKLSAgICAgIGN1cmxfc29ja2V0X3Qgd3JpdGVmZCA9IHNzbF9jb25uZWN0XzJfd3JpdGluZz09CisgICAgICBjdXJsX3NvY2tldF90IHdyaXRlZmQgPSBzc2xfY29ubmVjdF8yX3dyaXRpbmcgPT0KICAgICAgICAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZT9zb2NrZmQ6Q1VSTF9TT0NLRVRfQkFEOwotICAgICAgY3VybF9zb2NrZXRfdCByZWFkZmQgPSBzc2xfY29ubmVjdF8yX3JlYWRpbmc9PQorICAgICAgY3VybF9zb2NrZXRfdCByZWFkZmQgPSBzc2xfY29ubmVjdF8yX3JlYWRpbmcgPT0KICAgICAgICAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZT9zb2NrZmQ6Q1VSTF9TT0NLRVRfQkFEOwogCiAgICAgICB3aGF0ID0gQ3VybF9zb2NrZXRfY2hlY2socmVhZGZkLCBDVVJMX1NPQ0tFVF9CQUQsIHdyaXRlZmQsCkBAIC0zMTM3LDE0ICszMzYwLDE0IEBACiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIAotQ1VSTGNvZGUgQ3VybF9vc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmRvbmUpCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9vc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqZG9uZSkKIHsKICAgcmV0dXJuIG9zc2xfY29ubmVjdF9jb21tb24oY29ubiwgc29ja2luZGV4LCBUUlVFLCBkb25lKTsKIH0KIAotQ1VSTGNvZGUgQ3VybF9vc3NsX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQorc3RhdGljIENVUkxjb2RlIEN1cmxfb3NzbF9jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKICAgQ1VSTGNvZGUgcmVzdWx0OwogICBib29sIGRvbmUgPSBGQUxTRTsKQEAgLTMxNTgsMTcgKzMzODEsMjIgQEAKICAgcmV0dXJuIENVUkxFX09LOwogfQogCi1ib29sIEN1cmxfb3NzbF9kYXRhX3BlbmRpbmcoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgY29ubmluZGV4KQorc3RhdGljIGJvb2wgQ3VybF9vc3NsX2RhdGFfcGVuZGluZyhjb25zdCBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uaW5kZXgpCiB7Ci0gIGlmKGNvbm4tPnNzbFtjb25uaW5kZXhdLmhhbmRsZSkKKyAgY29uc3Qgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW2Nvbm5pbmRleF07CisgIGNvbnN0IHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpwcm94eXNzbCA9ICZjb25uLT5wcm94eV9zc2xbY29ubmluZGV4XTsKKyAgaWYoQkFDS0VORC0+aGFuZGxlKQogICAgIC8qIFNTTCBpcyBpbiB1c2UgKi8KLSAgICByZXR1cm4gKDAgIT0gU1NMX3BlbmRpbmcoY29ubi0+c3NsW2Nvbm5pbmRleF0uaGFuZGxlKSB8fAotICAgICAgICAgICAoY29ubi0+cHJveHlfc3NsW2Nvbm5pbmRleF0uaGFuZGxlICYmCi0gICAgICAgICAgICAwICE9IFNTTF9wZW5kaW5nKGNvbm4tPnByb3h5X3NzbFtjb25uaW5kZXhdLmhhbmRsZSkpKSA/CisgICAgcmV0dXJuICgwICE9IFNTTF9wZW5kaW5nKEJBQ0tFTkQtPmhhbmRsZSkgfHwKKyAgICAgICAgICAgKHByb3h5c3NsLT5iYWNrZW5kLT5oYW5kbGUgJiYKKyAgICAgICAgICAgIDAgIT0gU1NMX3BlbmRpbmcocHJveHlzc2wtPmJhY2tlbmQtPmhhbmRsZSkpKSA/CiAgICAgICAgICAgIFRSVUUgOiBGQUxTRTsKICAgcmV0dXJuIEZBTFNFOwogfQogCitzdGF0aWMgc2l6ZV90IEN1cmxfb3NzbF92ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworCiBzdGF0aWMgc3NpemVfdCBvc3NsX3NlbmQoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqbWVtLApAQCAtMzE4MiwxNCArMzQxMCwxNSBAQAogICB1bnNpZ25lZCBsb25nIHNzbGVycm9yOwogICBpbnQgbWVtbGVuOwogICBpbnQgcmM7CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwogCiAgIEVSUl9jbGVhcl9lcnJvcigpOwogCiAgIG1lbWxlbiA9IChsZW4gPiAoc2l6ZV90KUlOVF9NQVgpID8gSU5UX01BWCA6IChpbnQpbGVuOwotICByYyA9IFNTTF93cml0ZShjb25uLT5zc2xbc29ja2luZGV4XS5oYW5kbGUsIG1lbSwgbWVtbGVuKTsKKyAgcmMgPSBTU0xfd3JpdGUoQkFDS0VORC0+aGFuZGxlLCBtZW0sIG1lbWxlbik7CiAKICAgaWYocmMgPD0gMCkgewotICAgIGVyciA9IFNTTF9nZXRfZXJyb3IoY29ubi0+c3NsW3NvY2tpbmRleF0uaGFuZGxlLCByYyk7CisgICAgZXJyID0gU1NMX2dldF9lcnJvcihCQUNLRU5ELT5oYW5kbGUsIHJjKTsKIAogICAgIHN3aXRjaChlcnIpIHsKICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CkBAIC0zMjQzLDE0ICszNDcyLDE1IEBACiAgIHVuc2lnbmVkIGxvbmcgc3NsZXJyb3I7CiAgIHNzaXplX3QgbnJlYWQ7CiAgIGludCBidWZmc2l6ZTsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW251bV07CiAKICAgRVJSX2NsZWFyX2Vycm9yKCk7CiAKICAgYnVmZnNpemUgPSAoYnVmZmVyc2l6ZSA+IChzaXplX3QpSU5UX01BWCkgPyBJTlRfTUFYIDogKGludClidWZmZXJzaXplOwotICBucmVhZCA9IChzc2l6ZV90KVNTTF9yZWFkKGNvbm4tPnNzbFtudW1dLmhhbmRsZSwgYnVmLCBidWZmc2l6ZSk7CisgIG5yZWFkID0gKHNzaXplX3QpU1NMX3JlYWQoQkFDS0VORC0+aGFuZGxlLCBidWYsIGJ1ZmZzaXplKTsKICAgaWYobnJlYWQgPD0gMCkgewogICAgIC8qIGZhaWxlZCBTU0xfcmVhZCAqLwotICAgIGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKGNvbm4tPnNzbFtudW1dLmhhbmRsZSwgKGludClucmVhZCk7CisgICAgaW50IGVyciA9IFNTTF9nZXRfZXJyb3IoQkFDS0VORC0+aGFuZGxlLCAoaW50KW5yZWFkKTsKIAogICAgIHN3aXRjaChlcnIpIHsKICAgICBjYXNlIFNTTF9FUlJPUl9OT05FOiAvKiB0aGlzIGlzIG5vdCBhbiBlcnJvciAqLwpAQCAtMzI4Miw3ICszNTEyLDcgQEAKICAgcmV0dXJuIG5yZWFkOwogfQogCi1zaXplX3QgQ3VybF9vc3NsX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBzaXplX3QgQ3VybF9vc3NsX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKICNpZmRlZiBPUEVOU1NMX0lTX0JPUklOR1NTTAogICByZXR1cm4gc25wcmludGYoYnVmZmVyLCBzaXplLCBPU1NMX1BBQ0tBR0UpOwpAQCAtMzI5MSw5ICszNTIxLDkgQEAKICAgdW5zaWduZWQgbG9uZyBzc2xlYXlfdmFsdWU7CiAgIHN1YlsyXT0nXDAnOwogICBzdWJbMV09J1wwJzsKLSAgc3NsZWF5X3ZhbHVlPU9wZW5TU0xfdmVyc2lvbl9udW0oKTsKKyAgc3NsZWF5X3ZhbHVlID0gT3BlblNTTF92ZXJzaW9uX251bSgpOwogICBpZihzc2xlYXlfdmFsdWUgPCAweDkwNjAwMCkgewotICAgIHNzbGVheV92YWx1ZT1TU0xFQVlfVkVSU0lPTl9OVU1CRVI7CisgICAgc3NsZWF5X3ZhbHVlID0gU1NMRUFZX1ZFUlNJT05fTlVNQkVSOwogICAgIHN1YlswXT0nXDAnOwogICB9CiAgIGVsc2UgewpAQCAtMzMyMiw4ICszNTUyLDggQEAKIH0KIAogLyogY2FuIGJlIGNhbGxlZCB3aXRoIGRhdGEgPT0gTlVMTCAqLwotQ1VSTGNvZGUgQ3VybF9vc3NsX3JhbmRvbShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCB1bnNpZ25lZCBjaGFyICplbnRyb3B5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKQorc3RhdGljIENVUkxjb2RlIEN1cmxfb3NzbF9yYW5kb20oc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVudHJvcHksIHNpemVfdCBsZW5ndGgpCiB7CiAgIGludCByYzsKICAgaWYoZGF0YSkgewpAQCAtMzMzOSwyMyArMzU2OSwyNCBAQAogICByZXR1cm4gKHJjID09IDEgPyBDVVJMRV9PSyA6IENVUkxFX0ZBSUxFRF9JTklUKTsKIH0KIAotdm9pZCBDdXJsX29zc2xfbWQ1c3VtKHVuc2lnbmVkIGNoYXIgKnRtcCwgLyogaW5wdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm1kNXN1bSAvKiBvdXRwdXQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHVudXNlZCkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX29zc2xfbWQ1c3VtKHVuc2lnbmVkIGNoYXIgKnRtcCwgLyogaW5wdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0bXBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICptZDVzdW0gLyogb3V0cHV0ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHVudXNlZCkKIHsKICAgTUQ1X0NUWCBNRDVwdzsKICAgKHZvaWQpdW51c2VkOwogICBNRDVfSW5pdCgmTUQ1cHcpOwogICBNRDVfVXBkYXRlKCZNRDVwdywgdG1wLCB0bXBsZW4pOwogICBNRDVfRmluYWwobWQ1c3VtLCAmTUQ1cHcpOworICByZXR1cm4gQ1VSTEVfT0s7CiB9CiAKICNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA4MDBmTCkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19TSEEyNTYpCi12b2lkIEN1cmxfb3NzbF9zaGEyNTZzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0bXBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc2hhMjU2c3VtIC8qIG91dHB1dCAqLywKLSAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdW51c2VkKQorc3RhdGljIHZvaWQgQ3VybF9vc3NsX3NoYTI1NnN1bShjb25zdCB1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0bXBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTI1NnN1bSAvKiBvdXRwdXQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB1bnVzZWQpCiB7CiAgIFNIQTI1Nl9DVFggU0hBMjU2cHc7CiAgICh2b2lkKXVudXNlZDsKQEAgLTMzNjUsNyArMzU5Niw3IEBACiB9CiAjZW5kaWYKIAotYm9vbCBDdXJsX29zc2xfY2VydF9zdGF0dXNfcmVxdWVzdCh2b2lkKQorc3RhdGljIGJvb2wgQ3VybF9vc3NsX2NlcnRfc3RhdHVzX3JlcXVlc3Qodm9pZCkKIHsKICNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA4MDhmTCkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19UTFNFWFQpICYmIFwKICAgICAhZGVmaW5lZChPUEVOU1NMX05PX09DU1ApCkBAIC0zMzc0LDQgKzM2MDUsNTAgQEAKICAgcmV0dXJuIEZBTFNFOwogI2VuZGlmCiB9CisKK3N0YXRpYyB2b2lkICpDdXJsX29zc2xfZ2V0X2ludGVybmFscyhzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMSU5GTyBpbmZvKQoreworICAvKiBMZWdhY3k6IENVUkxJTkZPX1RMU19TRVNTSU9OIG11c3QgcmV0dXJuIGFuIFNTTF9DVFggcG9pbnRlci4gKi8KKyAgcmV0dXJuIGluZm8gPT0gQ1VSTElORk9fVExTX1NFU1NJT04gPworICAgICAgICAgKHZvaWQgKilCQUNLRU5ELT5jdHggOiAodm9pZCAqKUJBQ0tFTkQtPmhhbmRsZTsKK30KKworY29uc3Qgc3RydWN0IEN1cmxfc3NsIEN1cmxfc3NsX29wZW5zc2wgPSB7CisgIHsgQ1VSTFNTTEJBQ0tFTkRfT1BFTlNTTCwgIm9wZW5zc2wiIH0sIC8qIGluZm8gKi8KKworICAxLCAvKiBoYXZlX2NhX3BhdGggKi8KKyAgMSwgLyogaGF2ZV9jZXJ0aW5mbyAqLworICAxLCAvKiBoYXZlX3Bpbm5lZHB1YmtleSAqLworICAxLCAvKiBoYXZlX3NzbF9jdHggKi8KKyAgMSwgLyogc3VwcG9ydF9odHRwc19wcm94eSAqLworCisgIHNpemVvZihzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSksCisKKyAgQ3VybF9vc3NsX2luaXQsICAgICAgICAgICAgICAgIC8qIGluaXQgKi8KKyAgQ3VybF9vc3NsX2NsZWFudXAsICAgICAgICAgICAgIC8qIGNsZWFudXAgKi8KKyAgQ3VybF9vc3NsX3ZlcnNpb24sICAgICAgICAgICAgIC8qIHZlcnNpb24gKi8KKyAgQ3VybF9vc3NsX2NoZWNrX2N4biwgICAgICAgICAgIC8qIGNoZWNrX2N4biAqLworICBDdXJsX29zc2xfc2h1dGRvd24sICAgICAgICAgICAgLyogc2h1dGRvd24gKi8KKyAgQ3VybF9vc3NsX2RhdGFfcGVuZGluZywgICAgICAgIC8qIGRhdGFfcGVuZGluZyAqLworICBDdXJsX29zc2xfcmFuZG9tLCAgICAgICAgICAgICAgLyogcmFuZG9tICovCisgIEN1cmxfb3NzbF9jZXJ0X3N0YXR1c19yZXF1ZXN0LCAvKiBjZXJ0X3N0YXR1c19yZXF1ZXN0ICovCisgIEN1cmxfb3NzbF9jb25uZWN0LCAgICAgICAgICAgICAvKiBjb25uZWN0ICovCisgIEN1cmxfb3NzbF9jb25uZWN0X25vbmJsb2NraW5nLCAvKiBjb25uZWN0X25vbmJsb2NraW5nICovCisgIEN1cmxfb3NzbF9nZXRfaW50ZXJuYWxzLCAgICAgICAvKiBnZXRfaW50ZXJuYWxzICovCisgIEN1cmxfb3NzbF9jbG9zZSwgICAgICAgICAgICAgICAvKiBjbG9zZSAqLworICBDdXJsX29zc2xfY2xvc2VfYWxsLCAgICAgICAgICAgLyogY2xvc2VfYWxsICovCisgIEN1cmxfb3NzbF9zZXNzaW9uX2ZyZWUsICAgICAgICAvKiBzZXNzaW9uX2ZyZWUgKi8KKyAgQ3VybF9vc3NsX3NldF9lbmdpbmUsICAgICAgICAgIC8qIHNldF9lbmdpbmUgKi8KKyAgQ3VybF9vc3NsX3NldF9lbmdpbmVfZGVmYXVsdCwgIC8qIHNldF9lbmdpbmVfZGVmYXVsdCAqLworICBDdXJsX29zc2xfZW5naW5lc19saXN0LCAgICAgICAgLyogZW5naW5lc19saXN0ICovCisgIEN1cmxfbm9uZV9mYWxzZV9zdGFydCwgICAgICAgICAvKiBmYWxzZV9zdGFydCAqLworICBDdXJsX29zc2xfbWQ1c3VtLCAgICAgICAgICAgICAgLyogbWQ1c3VtICovCisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwODAwZkwpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fU0hBMjU2KQorICBDdXJsX29zc2xfc2hhMjU2c3VtICAgICAgICAgICAgLyogc2hhMjU2c3VtICovCisjZWxzZQorICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhMjU2c3VtICovCisjZW5kaWYKK307CisKICNlbmRpZiAvKiBVU0VfT1BFTlNTTCAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9vcGVuc3NsLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL29wZW5zc2wuaAppbmRleCBiOTY0OGQ1Li4xMTRkYzRiIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL29wZW5zc2wuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL29wZW5zc2wuaApAQCAtMzEsOTYgKzMxLDcgQEAKIAogI2luY2x1ZGUgInVybGRhdGEuaCIKIAotQ1VSTGNvZGUgQ3VybF9vc3NsX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLUNVUkxjb2RlIEN1cmxfb3NzbF9jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpkb25lKTsKLQotLyogY2xvc2UgYSBTU0wgY29ubmVjdGlvbiAqLwotdm9pZCBDdXJsX29zc2xfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLQotLyogdGVsbCBPcGVuU1NMIHRvIGNsb3NlIGRvd24gYWxsIG9wZW4gaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvbm5lY3Rpb25zIChhbmQKLSAgIHRodXMgc2Vzc2lvbiBJRCBjYWNoaW5nIGV0YykgKi8KLXZvaWQgQ3VybF9vc3NsX2Nsb3NlX2FsbChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKTsKLQotLyogU2V0cyBhbiBPcGVuU1NMIGVuZ2luZSAqLwotQ1VSTGNvZGUgQ3VybF9vc3NsX3NldF9lbmdpbmUoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgY29uc3QgY2hhciAqZW5naW5lKTsKLQotLyogZnVuY3Rpb24gcHJvdmlkZWQgZm9yIHRoZSBnZW5lcmljIFNTTC1sYXllciwgY2FsbGVkIHdoZW4gYSBzZXNzaW9uIGlkCi0gICBzaG91bGQgYmUgZnJlZWQgKi8KLXZvaWQgQ3VybF9vc3NsX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpOwotCi0vKiBTZXRzIGVuZ2luZSBhcyBkZWZhdWx0IGZvciBhbGwgU1NMIG9wZXJhdGlvbnMgKi8KLUNVUkxjb2RlIEN1cmxfb3NzbF9zZXRfZW5naW5lX2RlZmF1bHQoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSk7Ci0KLS8qIEJ1aWxkIGxpc3Qgb2YgT3BlblNTTCBlbmdpbmVzICovCi1zdHJ1Y3QgY3VybF9zbGlzdCAqQ3VybF9vc3NsX2VuZ2luZXNfbGlzdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKTsKLQotaW50IEN1cmxfb3NzbF9pbml0KHZvaWQpOwotdm9pZCBDdXJsX29zc2xfY2xlYW51cCh2b2lkKTsKLQotc2l6ZV90IEN1cmxfb3NzbF92ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwotaW50IEN1cmxfb3NzbF9jaGVja19jeG4oc3RydWN0IGNvbm5lY3RkYXRhICpjeG4pOwotaW50IEN1cmxfb3NzbF9zaHV0ZG93bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotYm9vbCBDdXJsX29zc2xfZGF0YV9wZW5kaW5nKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29ubmluZGV4KTsKLQotLyogcmV0dXJuIDAgaWYgYSBmaW5kIHJhbmRvbSBpcyBmaWxsZWQgaW4gKi8KLUNVUkxjb2RlIEN1cmxfb3NzbF9yYW5kb20oc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgdW5zaWduZWQgY2hhciAqZW50cm9weSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCk7Ci12b2lkIEN1cmxfb3NzbF9tZDVzdW0odW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0bXBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbWQ1c3VtIC8qIG91dHB1dCAqLywKLSAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdW51c2VkKTsKLXZvaWQgQ3VybF9vc3NsX3NoYTI1NnN1bShjb25zdCB1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzaGEyNTZzdW0gLyogb3V0cHV0ICovLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB1bnVzZWQpOwotCi1ib29sIEN1cmxfb3NzbF9jZXJ0X3N0YXR1c19yZXF1ZXN0KHZvaWQpOwotCi0vKiBTdXBwb3J0IEhUVFBTLXByb3h5ICovCi0jZGVmaW5lIEhUVFBTX1BST1hZX1NVUFBPUlQgMQotCi0vKiBTZXQgdGhlIEFQSSBiYWNrZW5kIGRlZmluaXRpb24gdG8gT3BlblNTTCAqLwotI2RlZmluZSBDVVJMX1NTTF9CQUNLRU5EIENVUkxTU0xCQUNLRU5EX09QRU5TU0wKLQotLyogdGhpcyBiYWNrZW5kIHN1cHBvcnRzIHRoZSBDQVBBVEggb3B0aW9uICovCi0jZGVmaW5lIGhhdmVfY3VybHNzbF9jYV9wYXRoIDEKLQotLyogdGhpcyBiYWNrZW5kIHN1cHBvcnRzIENVUkxPUFRfQ0VSVElORk8gKi8KLSNkZWZpbmUgaGF2ZV9jdXJsc3NsX2NlcnRpbmZvIDEKLQotLyogdGhpcyBiYWNrZW5kIHN1cHBvcnRzIENVUkxPUFRfU1NMX0NUWF8qICovCi0jZGVmaW5lIGhhdmVfY3VybHNzbF9zc2xfY3R4IDEKLQotLyogdGhpcyBiYWNrZW5kIHN1cHBvcnRzIENVUkxPUFRfUElOTkVEUFVCTElDS0VZICovCi0jZGVmaW5lIGhhdmVfY3VybHNzbF9waW5uZWRwdWJrZXkgMQotCi0vKiBBUEkgc2V0dXAgZm9yIE9wZW5TU0wgKi8KLSNkZWZpbmUgY3VybHNzbF9pbml0IEN1cmxfb3NzbF9pbml0Ci0jZGVmaW5lIGN1cmxzc2xfY2xlYW51cCBDdXJsX29zc2xfY2xlYW51cAotI2RlZmluZSBjdXJsc3NsX2Nvbm5lY3QgQ3VybF9vc3NsX2Nvbm5lY3QKLSNkZWZpbmUgY3VybHNzbF9jb25uZWN0X25vbmJsb2NraW5nIEN1cmxfb3NzbF9jb25uZWN0X25vbmJsb2NraW5nCi0jZGVmaW5lIGN1cmxzc2xfc2Vzc2lvbl9mcmVlKHgpIEN1cmxfb3NzbF9zZXNzaW9uX2ZyZWUoeCkKLSNkZWZpbmUgY3VybHNzbF9jbG9zZV9hbGwgQ3VybF9vc3NsX2Nsb3NlX2FsbAotI2RlZmluZSBjdXJsc3NsX2Nsb3NlIEN1cmxfb3NzbF9jbG9zZQotI2RlZmluZSBjdXJsc3NsX3NodXRkb3duKHgseSkgQ3VybF9vc3NsX3NodXRkb3duKHgseSkKLSNkZWZpbmUgY3VybHNzbF9zZXRfZW5naW5lKHgseSkgQ3VybF9vc3NsX3NldF9lbmdpbmUoeCx5KQotI2RlZmluZSBjdXJsc3NsX3NldF9lbmdpbmVfZGVmYXVsdCh4KSBDdXJsX29zc2xfc2V0X2VuZ2luZV9kZWZhdWx0KHgpCi0jZGVmaW5lIGN1cmxzc2xfZW5naW5lc19saXN0KHgpIEN1cmxfb3NzbF9lbmdpbmVzX2xpc3QoeCkKLSNkZWZpbmUgY3VybHNzbF92ZXJzaW9uIEN1cmxfb3NzbF92ZXJzaW9uCi0jZGVmaW5lIGN1cmxzc2xfY2hlY2tfY3huIEN1cmxfb3NzbF9jaGVja19jeG4KLSNkZWZpbmUgY3VybHNzbF9kYXRhX3BlbmRpbmcoeCx5KSBDdXJsX29zc2xfZGF0YV9wZW5kaW5nKHgseSkKLSNkZWZpbmUgY3VybHNzbF9yYW5kb20oeCx5LHopIEN1cmxfb3NzbF9yYW5kb20oeCx5LHopCi0jZGVmaW5lIGN1cmxzc2xfbWQ1c3VtKGEsYixjLGQpIEN1cmxfb3NzbF9tZDVzdW0oYSxiLGMsZCkKLSNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA4MDBmTCkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19TSEEyNTYpCi0jZGVmaW5lIGN1cmxzc2xfc2hhMjU2c3VtKGEsYixjLGQpIEN1cmxfb3NzbF9zaGEyNTZzdW0oYSxiLGMsZCkKLSNlbmRpZgotI2RlZmluZSBjdXJsc3NsX2NlcnRfc3RhdHVzX3JlcXVlc3QoKSBDdXJsX29zc2xfY2VydF9zdGF0dXNfcmVxdWVzdCgpCi0KLSNkZWZpbmUgREVGQVVMVF9DSVBIRVJfU0VMRUNUSU9OIFwKLSAgIkFMTDohRVhQT1JUOiFFWFBPUlQ0MDohRVhQT1JUNTY6IWFOVUxMOiFMT1c6IVJDNDpAU1RSRU5HVEgiCitleHRlcm4gY29uc3Qgc3RydWN0IEN1cmxfc3NsIEN1cmxfc3NsX29wZW5zc2w7CiAKICNlbmRpZiAvKiBVU0VfT1BFTlNTTCAqLwogI2VuZGlmIC8qIEhFQURFUl9DVVJMX1NTTFVTRV9IICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3BvbGFyc3NsLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3BvbGFyc3NsLmMKaW5kZXggNjY5MDkxYy4uZmMwNjQ0ZiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9wb2xhcnNzbC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvcG9sYXJzc2wuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAyMDEyIC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqIENvcHlyaWdodCAoQykgMjAxMCAtIDIwMTEsIEhvaS1IbyBDaGFuLCA8aG9paG8uY2hhbkBnbWFpbC5jb20+CiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlICJjdXJsX3NldHVwLmgiCiAKICNpZmRlZiBVU0VfUE9MQVJTU0wKLQogI2luY2x1ZGUgPHBvbGFyc3NsL25ldC5oPgogI2luY2x1ZGUgPHBvbGFyc3NsL3NzbC5oPgogI2luY2x1ZGUgPHBvbGFyc3NsL2NlcnRzLmg+CkBAIC03MCw2ICs2OSwxOSBAQAogI2RlZmluZSBQVUJfREVSX01BWF9CWVRFUyAgIChSU0FfUFVCX0RFUl9NQVhfQllURVMgPiBFQ1BfUFVCX0RFUl9NQVhfQllURVMgPyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTQV9QVUJfREVSX01BWF9CWVRFUyA6IEVDUF9QVUJfREVSX01BWF9CWVRFUykKIAorc3RydWN0IHNzbF9iYWNrZW5kX2RhdGEgeworICBjdHJfZHJiZ19jb250ZXh0IGN0cl9kcmJnOworICBlbnRyb3B5X2NvbnRleHQgZW50cm9weTsKKyAgc3NsX2NvbnRleHQgc3NsOworICBpbnQgc2VydmVyX2ZkOworICB4NTA5X2NydCBjYWNlcnQ7CisgIHg1MDlfY3J0IGNsaWNlcnQ7CisgIHg1MDlfY3JsIGNybDsKKyAgcnNhX2NvbnRleHQgcnNhOworfTsKKworI2RlZmluZSBCQUNLRU5EIGNvbm5zc2wtPmJhY2tlbmQKKwogLyogYXBwbHkgdGhyZWFkaW5nPyAqLwogI2lmIGRlZmluZWQoVVNFX1RIUkVBRFNfUE9TSVgpIHx8IGRlZmluZWQoVVNFX1RIUkVBRFNfV0lOMzIpCiAjZGVmaW5lIFRIUkVBRElOR19TVVBQT1JUCkBAIC0xOTcsOCArMjA5LDggQEAKICAgICByZXR1cm4gcmVzdWx0OwogICB9CiAKLSAgc3NsX3NldF9taW5fdmVyc2lvbigmY29ubnNzbC0+c3NsLCBTU0xfTUFKT1JfVkVSU0lPTl8zLCBzc2xfbWluX3Zlcik7Ci0gIHNzbF9zZXRfbWF4X3ZlcnNpb24oJmNvbm5zc2wtPnNzbCwgU1NMX01BSk9SX1ZFUlNJT05fMywgc3NsX21heF92ZXIpOworICBzc2xfc2V0X21pbl92ZXJzaW9uKCZCQUNLRU5ELT5zc2wsIFNTTF9NQUpPUl9WRVJTSU9OXzMsIHNzbF9taW5fdmVyKTsKKyAgc3NsX3NldF9tYXhfdmVyc2lvbigmQkFDS0VORC0+c3NsLCBTU0xfTUFKT1JfVkVSU0lPTl8zLCBzc2xfbWF4X3Zlcik7CiAKICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTIxNSw3ICsyMjcsNyBAQAogICBjb25zdCBsb25nIGludCBwb3J0ID0gU1NMX0lTX1BST1hZKCkgPyBjb25uLT5wb3J0IDogY29ubi0+cmVtb3RlX3BvcnQ7CiAgIGludCByZXQgPSAtMTsKICAgY2hhciBlcnJvcmJ1ZlsxMjhdOwotICBlcnJvcmJ1ZlswXT0wOworICBlcnJvcmJ1ZlswXSA9IDA7CiAKICAgLyogUG9sYXJTU0wgb25seSBzdXBwb3J0cyBTU0x2MyBhbmQgVExTdjEgKi8KICAgaWYoU1NMX0NPTk5fQ09ORklHKHZlcnNpb24pID09IENVUkxfU1NMVkVSU0lPTl9TU0x2MikgewpAQCAtMjI2LDE2ICsyMzgsMTYgQEAKICNpZmRlZiBUSFJFQURJTkdfU1VQUE9SVAogICBlbnRyb3B5X2luaXRfbXV0ZXgoJmVudHJvcHkpOwogCi0gIGlmKChyZXQgPSBjdHJfZHJiZ19pbml0KCZjb25uc3NsLT5jdHJfZHJiZywgZW50cm9weV9mdW5jX211dGV4LCAmZW50cm9weSwKKyAgaWYoKHJldCA9IGN0cl9kcmJnX2luaXQoJkJBQ0tFTkQtPmN0cl9kcmJnLCBlbnRyb3B5X2Z1bmNfbXV0ZXgsICZlbnRyb3B5LAogICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwKSkgIT0gMCkgewogICAgIGVycm9yX3N0cmVycm9yKHJldCwgZXJyb3JidWYsIHNpemVvZihlcnJvcmJ1ZikpOwogICAgIGZhaWxmKGRhdGEsICJGYWlsZWQgLSBQb2xhclNTTDogY3RyX2RyYmdfaW5pdCByZXR1cm5lZCAoLTB4JTA0WCkgJXNcbiIsCiAgICAgICAgICAgLXJldCwgZXJyb3JidWYpOwogICB9CiAjZWxzZQotICBlbnRyb3B5X2luaXQoJmNvbm5zc2wtPmVudHJvcHkpOworICBlbnRyb3B5X2luaXQoJkJBQ0tFTkQtPmVudHJvcHkpOwogCi0gIGlmKChyZXQgPSBjdHJfZHJiZ19pbml0KCZjb25uc3NsLT5jdHJfZHJiZywgZW50cm9weV9mdW5jLCAmY29ubnNzbC0+ZW50cm9weSwKKyAgaWYoKHJldCA9IGN0cl9kcmJnX2luaXQoJkJBQ0tFTkQtPmN0cl9kcmJnLCBlbnRyb3B5X2Z1bmMsICZCQUNLRU5ELT5lbnRyb3B5LAogICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwKSkgIT0gMCkgewogICAgIGVycm9yX3N0cmVycm9yKHJldCwgZXJyb3JidWYsIHNpemVvZihlcnJvcmJ1ZikpOwogICAgIGZhaWxmKGRhdGEsICJGYWlsZWQgLSBQb2xhclNTTDogY3RyX2RyYmdfaW5pdCByZXR1cm5lZCAoLTB4JTA0WCkgJXNcbiIsCkBAIC0yNDQsMTAgKzI1NiwxMCBAQAogI2VuZGlmIC8qIFRIUkVBRElOR19TVVBQT1JUICovCiAKICAgLyogTG9hZCB0aGUgdHJ1c3RlZCBDQSAqLwotICBtZW1zZXQoJmNvbm5zc2wtPmNhY2VydCwgMCwgc2l6ZW9mKHg1MDlfY3J0KSk7CisgIG1lbXNldCgmQkFDS0VORC0+Y2FjZXJ0LCAwLCBzaXplb2YoeDUwOV9jcnQpKTsKIAogICBpZihTU0xfQ09OTl9DT05GSUcoQ0FmaWxlKSkgewotICAgIHJldCA9IHg1MDlfY3J0X3BhcnNlX2ZpbGUoJmNvbm5zc2wtPmNhY2VydCwKKyAgICByZXQgPSB4NTA5X2NydF9wYXJzZV9maWxlKCZCQUNLRU5ELT5jYWNlcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ09OTl9DT05GSUcoQ0FmaWxlKSk7CiAKICAgICBpZihyZXQ8MCkgewpAQCAtMjYxLDcgKzI3Myw3IEBACiAgIH0KIAogICBpZihjYXBhdGgpIHsKLSAgICByZXQgPSB4NTA5X2NydF9wYXJzZV9wYXRoKCZjb25uc3NsLT5jYWNlcnQsIGNhcGF0aCk7CisgICAgcmV0ID0geDUwOV9jcnRfcGFyc2VfcGF0aCgmQkFDS0VORC0+Y2FjZXJ0LCBjYXBhdGgpOwogCiAgICAgaWYocmV0PDApIHsKICAgICAgIGVycm9yX3N0cmVycm9yKHJldCwgZXJyb3JidWYsIHNpemVvZihlcnJvcmJ1ZikpOwpAQCAtMjc0LDEwICsyODYsMTAgQEAKICAgfQogCiAgIC8qIExvYWQgdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZSAqLwotICBtZW1zZXQoJmNvbm5zc2wtPmNsaWNlcnQsIDAsIHNpemVvZih4NTA5X2NydCkpOworICBtZW1zZXQoJkJBQ0tFTkQtPmNsaWNlcnQsIDAsIHNpemVvZih4NTA5X2NydCkpOwogCiAgIGlmKFNTTF9TRVRfT1BUSU9OKGNlcnQpKSB7Ci0gICAgcmV0ID0geDUwOV9jcnRfcGFyc2VfZmlsZSgmY29ubnNzbC0+Y2xpY2VydCwKKyAgICByZXQgPSB4NTA5X2NydF9wYXJzZV9maWxlKCZCQUNLRU5ELT5jbGljZXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1NFVF9PUFRJT04oY2VydCkpOwogCiAgICAgaWYocmV0KSB7CkBAIC0yOTgsOSArMzEwLDkgQEAKICAgICBpZihyZXQgPT0gMCAmJiAhcGtfY2FuX2RvKCZwaywgUE9MQVJTU0xfUEtfUlNBKSkKICAgICAgIHJldCA9IFBPTEFSU1NMX0VSUl9QS19UWVBFX01JU01BVENIOwogICAgIGlmKHJldCA9PSAwKQotICAgICAgcnNhX2NvcHkoJmNvbm5zc2wtPnJzYSwgcGtfcnNhKHBrKSk7CisgICAgICByc2FfY29weSgmQkFDS0VORC0+cnNhLCBwa19yc2EocGspKTsKICAgICBlbHNlCi0gICAgICByc2FfZnJlZSgmY29ubnNzbC0+cnNhKTsKKyAgICAgIHJzYV9mcmVlKCZCQUNLRU5ELT5yc2EpOwogICAgIHBrX2ZyZWUoJnBrKTsKIAogICAgIGlmKHJldCkgewpAQCAtMzEzLDEwICszMjUsMTAgQEAKICAgfQogCiAgIC8qIExvYWQgdGhlIENSTCAqLwotICBtZW1zZXQoJmNvbm5zc2wtPmNybCwgMCwgc2l6ZW9mKHg1MDlfY3JsKSk7CisgIG1lbXNldCgmQkFDS0VORC0+Y3JsLCAwLCBzaXplb2YoeDUwOV9jcmwpKTsKIAogICBpZihTU0xfU0VUX09QVElPTihDUkxmaWxlKSkgewotICAgIHJldCA9IHg1MDlfY3JsX3BhcnNlX2ZpbGUoJmNvbm5zc2wtPmNybCwKKyAgICByZXQgPSB4NTA5X2NybF9wYXJzZV9maWxlKCZCQUNLRU5ELT5jcmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfU0VUX09QVElPTihDUkxmaWxlKSk7CiAKICAgICBpZihyZXQpIHsKQEAgLTMzMCw3ICszNDIsNyBAQAogCiAgIGluZm9mKGRhdGEsICJQb2xhclNTTDogQ29ubmVjdGluZyB0byAlczolZFxuIiwgaG9zdG5hbWUsIHBvcnQpOwogCi0gIGlmKHNzbF9pbml0KCZjb25uc3NsLT5zc2wpKSB7CisgIGlmKHNzbF9pbml0KCZCQUNLRU5ELT5zc2wpKSB7CiAgICAgZmFpbGYoZGF0YSwgIlBvbGFyU1NMOiBzc2xfaW5pdCBmYWlsZWQiKTsKICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CiAgIH0KQEAgLTMzOCwxMyArMzUwLDEzIEBACiAgIHN3aXRjaChTU0xfQ09OTl9DT05GSUcodmVyc2lvbikpIHsKICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fREVGQVVMVDoKICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fVExTdjE6Ci0gICAgc3NsX3NldF9taW5fdmVyc2lvbigmY29ubnNzbC0+c3NsLCBTU0xfTUFKT1JfVkVSU0lPTl8zLAorICAgIHNzbF9zZXRfbWluX3ZlcnNpb24oJkJBQ0tFTkQtPnNzbCwgU1NMX01BSk9SX1ZFUlNJT05fMywKICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9NSU5PUl9WRVJTSU9OXzEpOwogICAgIGJyZWFrOwogICBjYXNlIENVUkxfU1NMVkVSU0lPTl9TU0x2MzoKLSAgICBzc2xfc2V0X21pbl92ZXJzaW9uKCZjb25uc3NsLT5zc2wsIFNTTF9NQUpPUl9WRVJTSU9OXzMsCisgICAgc3NsX3NldF9taW5fdmVyc2lvbigmQkFDS0VORC0+c3NsLCBTU0xfTUFKT1JfVkVSU0lPTl8zLAogICAgICAgICAgICAgICAgICAgICAgICAgU1NMX01JTk9SX1ZFUlNJT05fMCk7Ci0gICAgc3NsX3NldF9tYXhfdmVyc2lvbigmY29ubnNzbC0+c3NsLCBTU0xfTUFKT1JfVkVSU0lPTl8zLAorICAgIHNzbF9zZXRfbWF4X3ZlcnNpb24oJkJBQ0tFTkQtPnNzbCwgU1NMX01BSk9SX1ZFUlNJT05fMywKICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9NSU5PUl9WRVJTSU9OXzApOwogICAgIGluZm9mKGRhdGEsICJQb2xhclNTTDogRm9yY2VkIG1pbi4gU1NMIFZlcnNpb24gdG8gYmUgU1NMdjNcbiIpOwogICAgIGJyZWFrOwpAQCAtMzYzLDE2ICszNzUsMTYgQEAKICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CiAgIH0KIAotICBzc2xfc2V0X2VuZHBvaW50KCZjb25uc3NsLT5zc2wsIFNTTF9JU19DTElFTlQpOwotICBzc2xfc2V0X2F1dGhtb2RlKCZjb25uc3NsLT5zc2wsIFNTTF9WRVJJRllfT1BUSU9OQUwpOworICBzc2xfc2V0X2VuZHBvaW50KCZCQUNLRU5ELT5zc2wsIFNTTF9JU19DTElFTlQpOworICBzc2xfc2V0X2F1dGhtb2RlKCZCQUNLRU5ELT5zc2wsIFNTTF9WRVJJRllfT1BUSU9OQUwpOwogCi0gIHNzbF9zZXRfcm5nKCZjb25uc3NsLT5zc2wsIGN0cl9kcmJnX3JhbmRvbSwKLSAgICAgICAgICAgICAgJmNvbm5zc2wtPmN0cl9kcmJnKTsKLSAgc3NsX3NldF9iaW8oJmNvbm5zc2wtPnNzbCwKKyAgc3NsX3NldF9ybmcoJkJBQ0tFTkQtPnNzbCwgY3RyX2RyYmdfcmFuZG9tLAorICAgICAgICAgICAgICAmQkFDS0VORC0+Y3RyX2RyYmcpOworICBzc2xfc2V0X2JpbygmQkFDS0VORC0+c3NsLAogICAgICAgICAgICAgICBuZXRfcmVjdiwgJmNvbm4tPnNvY2tbc29ja2luZGV4XSwKICAgICAgICAgICAgICAgbmV0X3NlbmQsICZjb25uLT5zb2NrW3NvY2tpbmRleF0pOwogCi0gIHNzbF9zZXRfY2lwaGVyc3VpdGVzKCZjb25uc3NsLT5zc2wsIHNzbF9saXN0X2NpcGhlcnN1aXRlcygpKTsKKyAgc3NsX3NldF9jaXBoZXJzdWl0ZXMoJkJBQ0tFTkQtPnNzbCwgc3NsX2xpc3RfY2lwaGVyc3VpdGVzKCkpOwogCiAgIC8qIENoZWNrIGlmIHRoZXJlJ3MgYSBjYWNoZWQgSUQgd2UgY2FuL3Nob3VsZCB1c2UgaGVyZSEgKi8KICAgaWYoU1NMX1NFVF9PUFRJT04ocHJpbWFyeS5zZXNzaW9uaWQpKSB7CkBAIC0zODAsNyArMzkyLDcgQEAKIAogICAgIEN1cmxfc3NsX3Nlc3Npb25pZF9sb2NrKGNvbm4pOwogICAgIGlmKCFDdXJsX3NzbF9nZXRzZXNzaW9uaWQoY29ubiwgJm9sZF9zZXNzaW9uLCBOVUxMLCBzb2NraW5kZXgpKSB7Ci0gICAgICByZXQgPSBzc2xfc2V0X3Nlc3Npb24oJmNvbm5zc2wtPnNzbCwgb2xkX3Nlc3Npb24pOworICAgICAgcmV0ID0gc3NsX3NldF9zZXNzaW9uKCZCQUNLRU5ELT5zc2wsIG9sZF9zZXNzaW9uKTsKICAgICAgIGlmKHJldCkgewogICAgICAgICBDdXJsX3NzbF9zZXNzaW9uaWRfdW5sb2NrKGNvbm4pOwogICAgICAgICBmYWlsZihkYXRhLCAic3NsX3NldF9zZXNzaW9uIHJldHVybmVkIC0weCV4IiwgLXJldCk7CkBAIC0zOTEsMTUgKzQwMywxNSBAQAogICAgIEN1cmxfc3NsX3Nlc3Npb25pZF91bmxvY2soY29ubik7CiAgIH0KIAotICBzc2xfc2V0X2NhX2NoYWluKCZjb25uc3NsLT5zc2wsCi0gICAgICAgICAgICAgICAgICAgJmNvbm5zc2wtPmNhY2VydCwKLSAgICAgICAgICAgICAgICAgICAmY29ubnNzbC0+Y3JsLAorICBzc2xfc2V0X2NhX2NoYWluKCZCQUNLRU5ELT5zc2wsCisgICAgICAgICAgICAgICAgICAgJkJBQ0tFTkQtPmNhY2VydCwKKyAgICAgICAgICAgICAgICAgICAmQkFDS0VORC0+Y3JsLAogICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lKTsKIAotICBzc2xfc2V0X293bl9jZXJ0X3JzYSgmY29ubnNzbC0+c3NsLAotICAgICAgICAgICAgICAgICAgICAgICAmY29ubnNzbC0+Y2xpY2VydCwgJmNvbm5zc2wtPnJzYSk7CisgIHNzbF9zZXRfb3duX2NlcnRfcnNhKCZCQUNLRU5ELT5zc2wsCisgICAgICAgICAgICAgICAgICAgICAgICZCQUNLRU5ELT5jbGljZXJ0LCAmQkFDS0VORC0+cnNhKTsKIAotICBpZihzc2xfc2V0X2hvc3RuYW1lKCZjb25uc3NsLT5zc2wsIGhvc3RuYW1lKSkgeworICBpZihzc2xfc2V0X2hvc3RuYW1lKCZCQUNLRU5ELT5zc2wsIGhvc3RuYW1lKSkgewogICAgIC8qIHNzbF9zZXRfaG9zdG5hbWUoKSBzZXRzIHRoZSBuYW1lIHRvIHVzZSBpbiBDTi9TQU4gY2hlY2tzICphbmQqIHRoZSBuYW1lCiAgICAgICAgdG8gc2V0IGluIHRoZSBTTkkgZXh0ZW5zaW9uLiBTbyBldmVuIGlmIGN1cmwgY29ubmVjdHMgdG8gYSBob3N0CiAgICAgICAgc3BlY2lmaWVkIGFzIGFuIElQIGFkZHJlc3MsIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkLiAqLwpAQCAtNDI0LDEyICs0MzYsMTIgQEAKIAogICAgIHByb3RvY29sc1tjdXJdID0gTlVMTDsKIAotICAgIHNzbF9zZXRfYWxwbl9wcm90b2NvbHMoJmNvbm5zc2wtPnNzbCwgcHJvdG9jb2xzKTsKKyAgICBzc2xfc2V0X2FscG5fcHJvdG9jb2xzKCZCQUNLRU5ELT5zc2wsIHByb3RvY29scyk7CiAgIH0KICNlbmRpZgogCiAjaWZkZWYgUE9MQVJTU0xfREVCVUcKLSAgc3NsX3NldF9kYmcoJmNvbm5zc2wtPnNzbCwgcG9sYXJzc2xfZGVidWcsIGRhdGEpOworICBzc2xfc2V0X2RiZygmQkFDS0VORC0+c3NsLCBwb2xhcnNzbF9kZWJ1ZywgZGF0YSk7CiAjZW5kaWYKIAogICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID0gc3NsX2Nvbm5lY3RfMjsKQEAgLTQ1Niw3ICs0NjgsNyBAQAogICBjb25uLT5yZWN2W3NvY2tpbmRleF0gPSBwb2xhcnNzbF9yZWN2OwogICBjb25uLT5zZW5kW3NvY2tpbmRleF0gPSBwb2xhcnNzbF9zZW5kOwogCi0gIHJldCA9IHNzbF9oYW5kc2hha2UoJmNvbm5zc2wtPnNzbCk7CisgIHJldCA9IHNzbF9oYW5kc2hha2UoJkJBQ0tFTkQtPnNzbCk7CiAKICAgc3dpdGNoKHJldCkgewogICBjYXNlIDA6CkBAIC00NzgsOSArNDkwLDkgQEAKICAgfQogCiAgIGluZm9mKGRhdGEsICJQb2xhclNTTDogSGFuZHNoYWtlIGNvbXBsZXRlLCBjaXBoZXIgaXMgJXNcbiIsCi0gICAgICAgIHNzbF9nZXRfY2lwaGVyc3VpdGUoJmNvbm4tPnNzbFtzb2NraW5kZXhdLnNzbCkgKTsKKyAgICAgICAgc3NsX2dldF9jaXBoZXJzdWl0ZSgmQkFDS0VORC0+c3NsKSApOwogCi0gIHJldCA9IHNzbF9nZXRfdmVyaWZ5X3Jlc3VsdCgmY29ubi0+c3NsW3NvY2tpbmRleF0uc3NsKTsKKyAgcmV0ID0gc3NsX2dldF92ZXJpZnlfcmVzdWx0KCZCQUNLRU5ELT5zc2wpOwogCiAgIGlmKHJldCAmJiBTU0xfQ09OTl9DT05GSUcodmVyaWZ5cGVlcikpIHsKICAgICBpZihyZXQgJiBCQURDRVJUX0VYUElSRUQpCkBAIC01MDAsMTIgKzUxMiwxMiBAQAogICAgIHJldHVybiBDVVJMRV9QRUVSX0ZBSUxFRF9WRVJJRklDQVRJT047CiAgIH0KIAotICBpZihzc2xfZ2V0X3BlZXJfY2VydCgmKGNvbm5zc2wtPnNzbCkpKSB7CisgIGlmKHNzbF9nZXRfcGVlcl9jZXJ0KCYoQkFDS0VORC0+c3NsKSkpIHsKICAgICAvKiBJZiB0aGUgc2Vzc2lvbiB3YXMgcmVzdW1lZCwgdGhlcmUgd2lsbCBiZSBubyBwZWVyIGNlcnRzICovCiAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKGJ1ZmZlcikpOwogCiAgICAgaWYoeDUwOV9jcnRfaW5mbyhidWZmZXIsIHNpemVvZihidWZmZXIpLCAoY2hhciAqKSIqICIsCi0gICAgICAgICAgICAgICAgICAgICBzc2xfZ2V0X3BlZXJfY2VydCgmKGNvbm5zc2wtPnNzbCkpKSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgIHNzbF9nZXRfcGVlcl9jZXJ0KCYoQkFDS0VORC0+c3NsKSkpICE9IC0xKQogICAgICAgaW5mb2YoZGF0YSwgIkR1bXBpbmcgY2VydCBpbmZvOlxuJXNcbiIsIGJ1ZmZlcik7CiAgIH0KIApAQCAtNTE3LDcgKzUyOSw3IEBACiAgICAgdW5zaWduZWQgY2hhciBwdWJrZXlbUFVCX0RFUl9NQVhfQllURVNdOwogICAgIGNvbnN0IHg1MDlfY3J0ICpwZWVyY2VydDsKIAotICAgIHBlZXJjZXJ0ID0gc3NsX2dldF9wZWVyX2NlcnQoJmNvbm5zc2wtPnNzbCk7CisgICAgcGVlcmNlcnQgPSBzc2xfZ2V0X3BlZXJfY2VydCgmQkFDS0VORC0+c3NsKTsKIAogICAgIGlmKCFwZWVyY2VydCB8fCAhcGVlcmNlcnQtPnJhdy5wIHx8ICFwZWVyY2VydC0+cmF3LmxlbikgewogICAgICAgZmFpbGYoZGF0YSwgIkZhaWxlZCBkdWUgdG8gbWlzc2luZyBwZWVyIGNlcnRpZmljYXRlIik7CkBAIC01NjYsNyArNTc4LDcgQEAKIAogI2lmZGVmIEhBU19BTFBOCiAgIGlmKGNvbm4tPmJpdHMudGxzX2VuYWJsZV9hbHBuKSB7Ci0gICAgY29uc3QgY2hhciAqbmV4dF9wcm90b2NvbCA9IHNzbF9nZXRfYWxwbl9wcm90b2NvbCgmY29ubnNzbC0+c3NsKTsKKyAgICBjb25zdCBjaGFyICpuZXh0X3Byb3RvY29sID0gc3NsX2dldF9hbHBuX3Byb3RvY29sKCZCQUNLRU5ELT5zc2wpOwogCiAgICAgaWYobmV4dF9wcm90b2NvbCAhPSBOVUxMKSB7CiAgICAgICBpbmZvZihkYXRhLCAiQUxQTiwgc2VydmVyIGFjY2VwdGVkIHRvIHVzZSAlc1xuIiwgbmV4dF9wcm90b2NvbCk7CkBAIC02MTQsNyArNjI2LDcgQEAKIAogICAgIG1lbXNldChvdXJfc3NsX3Nlc3Npb25pZCwgMCwgc2l6ZW9mKHNzbF9zZXNzaW9uKSk7CiAKLSAgICByZXQgPSBzc2xfZ2V0X3Nlc3Npb24oJmNvbm5zc2wtPnNzbCwgb3VyX3NzbF9zZXNzaW9uaWQpOworICAgIHJldCA9IHNzbF9nZXRfc2Vzc2lvbigmQkFDS0VORC0+c3NsLCBvdXJfc3NsX3Nlc3Npb25pZCk7CiAgICAgaWYocmV0KSB7CiAgICAgICBmYWlsZihkYXRhLCAic3NsX2dldF9zZXNzaW9uIHJldHVybmVkIC0weCV4IiwgLXJldCk7CiAgICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CkBAIC02NDUsOSArNjU3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxjb2RlICpjdXJsY29kZSkKIHsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CiAgIGludCByZXQgPSAtMTsKIAotICByZXQgPSBzc2xfd3JpdGUoJmNvbm4tPnNzbFtzb2NraW5kZXhdLnNzbCwKKyAgcmV0ID0gc3NsX3dyaXRlKCZCQUNLRU5ELT5zc2wsCiAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKW1lbSwgbGVuKTsKIAogICBpZihyZXQgPCAwKSB7CkBAIC02NTksMTMgKzY3MiwxNCBAQAogICByZXR1cm4gcmV0OwogfQogCi12b2lkIEN1cmxfcG9sYXJzc2xfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQorc3RhdGljIHZvaWQgQ3VybF9wb2xhcnNzbF9jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7Ci0gIHJzYV9mcmVlKCZjb25uLT5zc2xbc29ja2luZGV4XS5yc2EpOwotICB4NTA5X2NydF9mcmVlKCZjb25uLT5zc2xbc29ja2luZGV4XS5jbGljZXJ0KTsKLSAgeDUwOV9jcnRfZnJlZSgmY29ubi0+c3NsW3NvY2tpbmRleF0uY2FjZXJ0KTsKLSAgeDUwOV9jcmxfZnJlZSgmY29ubi0+c3NsW3NvY2tpbmRleF0uY3JsKTsKLSAgc3NsX2ZyZWUoJmNvbm4tPnNzbFtzb2NraW5kZXhdLnNzbCk7CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOworICByc2FfZnJlZSgmQkFDS0VORC0+cnNhKTsKKyAgeDUwOV9jcnRfZnJlZSgmQkFDS0VORC0+Y2xpY2VydCk7CisgIHg1MDlfY3J0X2ZyZWUoJkJBQ0tFTkQtPmNhY2VydCk7CisgIHg1MDlfY3JsX2ZyZWUoJkJBQ0tFTkQtPmNybCk7CisgIHNzbF9mcmVlKCZCQUNLRU5ELT5zc2wpOwogfQogCiBzdGF0aWMgc3NpemVfdCBwb2xhcnNzbF9yZWN2KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKQEAgLTY3NCwxMSArNjg4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMY29kZSAqY3VybGNvZGUpCiB7CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtudW1dOwogICBpbnQgcmV0ID0gLTE7CiAgIHNzaXplX3QgbGVuID0gLTE7CiAKICAgbWVtc2V0KGJ1ZiwgMCwgYnVmZmVyc2l6ZSk7Ci0gIHJldCA9IHNzbF9yZWFkKCZjb25uLT5zc2xbbnVtXS5zc2wsICh1bnNpZ25lZCBjaGFyICopYnVmLCBidWZmZXJzaXplKTsKKyAgcmV0ID0gc3NsX3JlYWQoJkJBQ0tFTkQtPnNzbCwgKHVuc2lnbmVkIGNoYXIgKilidWYsIGJ1ZmZlcnNpemUpOwogCiAgIGlmKHJldCA8PSAwKSB7CiAgICAgaWYocmV0ID09IFBPTEFSU1NMX0VSUl9TU0xfUEVFUl9DTE9TRV9OT1RJRlkpCkBAIC02OTQsNyArNzA5LDcgQEAKICAgcmV0dXJuIGxlbjsKIH0KIAotdm9pZCBDdXJsX3BvbGFyc3NsX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpCitzdGF0aWMgdm9pZCBDdXJsX3BvbGFyc3NsX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpCiB7CiAgIHNzbF9zZXNzaW9uX2ZyZWUocHRyKTsKICAgZnJlZShwdHIpOwpAQCAtNzAzLDcgKzcxOCw3IEBACiAvKiAxLjMuMTAgd2FzIHRoZSBmaXJzdCByZWJyYW5kZWQgdmVyc2lvbi4gQWxsIG5ldyByZWxlYXNlcyAoaW4gMS4zIGJyYW5jaCBhbmQKICAgIGhpZ2hlcikgd2lsbCBiZSBtYmVkIFRMUyBicmFuZGVkLi4gKi8KIAotc2l6ZV90IEN1cmxfcG9sYXJzc2xfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQorc3RhdGljIHNpemVfdCBDdXJsX3BvbGFyc3NsX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKICAgdW5zaWduZWQgaW50IHZlcnNpb24gPSB2ZXJzaW9uX2dldF9udW1iZXIoKTsKICAgcmV0dXJuIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiVzLyVkLiVkLiVkIiwKQEAgLTc2Miw5ICs3NzcsOSBAQAogICAgIGlmKGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPT0gc3NsX2Nvbm5lY3RfMl9yZWFkaW5nIHx8CiAgICAgICAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9PSBzc2xfY29ubmVjdF8yX3dyaXRpbmcpIHsKIAotICAgICAgY3VybF9zb2NrZXRfdCB3cml0ZWZkID0gc3NsX2Nvbm5lY3RfMl93cml0aW5nPT0KKyAgICAgIGN1cmxfc29ja2V0X3Qgd3JpdGVmZCA9IHNzbF9jb25uZWN0XzJfd3JpdGluZyA9PQogICAgICAgICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlP3NvY2tmZDpDVVJMX1NPQ0tFVF9CQUQ7Ci0gICAgICBjdXJsX3NvY2tldF90IHJlYWRmZCA9IHNzbF9jb25uZWN0XzJfcmVhZGluZz09CisgICAgICBjdXJsX3NvY2tldF90IHJlYWRmZCA9IHNzbF9jb25uZWN0XzJfcmVhZGluZyA9PQogICAgICAgICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlP3NvY2tmZDpDVVJMX1NPQ0tFVF9CQUQ7CiAKICAgICAgIHdoYXQgPSBDdXJsX3NvY2tldF9jaGVjayhyZWFkZmQsIENVUkxfU09DS0VUX0JBRCwgd3JpdGVmZCwKQEAgLTgyNSwxOCArODQwLDE0IEBACiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIAotQ1VSTGNvZGUKLUN1cmxfcG9sYXJzc2xfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpkb25lKQorc3RhdGljIENVUkxjb2RlIEN1cmxfcG9sYXJzc2xfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsIGJvb2wgKmRvbmUpCiB7CiAgIHJldHVybiBwb2xhcnNzbF9jb25uZWN0X2NvbW1vbihjb25uLCBzb2NraW5kZXgsIFRSVUUsIGRvbmUpOwogfQogCiAKLUNVUkxjb2RlCi1DdXJsX3BvbGFyc3NsX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgpCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9wb2xhcnNzbF9jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKICAgQ1VSTGNvZGUgcmVzdWx0OwogICBib29sIGRvbmUgPSBGQUxTRTsKQEAgLTg1NCwyMCArODY1LDczIEBACiAgKiByZXR1cm4gMCBlcnJvciBpbml0aWFsaXppbmcgU1NMCiAgKiByZXR1cm4gMSBTU0wgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5CiAgKi8KLWludCBDdXJsX3BvbGFyc3NsX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgQ3VybF9wb2xhcnNzbF9pbml0KHZvaWQpCiB7CiAgIHJldHVybiBDdXJsX3BvbGFyc3NsdGhyZWFkbG9ja190aHJlYWRfc2V0dXAoKTsKIH0KIAotdm9pZCBDdXJsX3BvbGFyc3NsX2NsZWFudXAodm9pZCkKK3N0YXRpYyB2b2lkIEN1cmxfcG9sYXJzc2xfY2xlYW51cCh2b2lkKQogewogICAodm9pZClDdXJsX3BvbGFyc3NsdGhyZWFkbG9ja190aHJlYWRfY2xlYW51cCgpOwogfQogCi0KLWludCBDdXJsX3BvbGFyc3NsX2RhdGFfcGVuZGluZyhjb25zdCBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCitzdGF0aWMgYm9vbCBDdXJsX3BvbGFyc3NsX2RhdGFfcGVuZGluZyhjb25zdCBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4KQogewotICByZXR1cm4gc3NsX2dldF9ieXRlc19hdmFpbCgmY29ubi0+c3NsW3NvY2tpbmRleF0uc3NsKSAhPSAwOworICBjb25zdCBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKKyAgcmV0dXJuIHNzbF9nZXRfYnl0ZXNfYXZhaWwoJkJBQ0tFTkQtPnNzbCkgIT0gMDsKIH0KIAorc3RhdGljIHZvaWQgQ3VybF9wb2xhcnNzbF9zaGEyNTZzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5wdXRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzaGEyNTZzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2hhMjU2bGVuIFVOVVNFRF9QQVJBTSkKK3sKKyAgKHZvaWQpc2hhMjU2bGVuOworICBzaGEyNTYoaW5wdXQsIGlucHV0bGVuLCBzaGEyNTZzdW0sIDApOworfQorCitzdGF0aWMgdm9pZCAqQ3VybF9wb2xhcnNzbF9nZXRfaW50ZXJuYWxzKHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMSU5GTyBpbmZvIFVOVVNFRF9QQVJBTSkKK3sKKyAgKHZvaWQpaW5mbzsKKyAgcmV0dXJuICZCQUNLRU5ELT5zc2w7Cit9CisKK2NvbnN0IHN0cnVjdCBDdXJsX3NzbCBDdXJsX3NzbF9wb2xhcnNzbCA9IHsKKyAgeyBDVVJMU1NMQkFDS0VORF9QT0xBUlNTTCwgInBvbGFyc3NsIiB9LCAvKiBpbmZvICovCisKKyAgMSwgLyogaGF2ZV9jYV9wYXRoICovCisgIDAsIC8qIGhhdmVfY2VydGluZm8gKi8KKyAgMSwgLyogaGF2ZV9waW5uZWRwdWJrZXkgKi8KKyAgMCwgLyogaGF2ZV9zc2xfY3R4ICovCisgIDAsIC8qIHN1cHBvcnRfaHR0cHNfcHJveHkgKi8KKworICBzaXplb2Yoc3RydWN0IHNzbF9iYWNrZW5kX2RhdGEpLAorCisgIEN1cmxfcG9sYXJzc2xfaW5pdCwgICAgICAgICAgICAgICAgLyogaW5pdCAqLworICBDdXJsX3BvbGFyc3NsX2NsZWFudXAsICAgICAgICAgICAgIC8qIGNsZWFudXAgKi8KKyAgQ3VybF9wb2xhcnNzbF92ZXJzaW9uLCAgICAgICAgICAgICAvKiB2ZXJzaW9uICovCisgIEN1cmxfbm9uZV9jaGVja19jeG4sICAgICAgICAgICAgICAgLyogY2hlY2tfY3huICovCisgIEN1cmxfbm9uZV9zaHV0ZG93biwgICAgICAgICAgICAgICAgLyogc2h1dGRvd24gKi8KKyAgQ3VybF9wb2xhcnNzbF9kYXRhX3BlbmRpbmcsICAgICAgICAvKiBkYXRhX3BlbmRpbmcgKi8KKyAgLyogVGhpcyBtaWdodCBjYXVzZSBsaWJjdXJsIHRvIHVzZSBhIHdlZWtlciByYW5kb20hCisgICAqIFRPRE86IHVzZSBQb2xhcnNzbCdzIENUUi1EUkJHIG9yIEhNQUMtRFJCRworICAqLworICBDdXJsX25vbmVfcmFuZG9tLCAgICAgICAgICAgICAgICAgIC8qIHJhbmRvbSAqLworICBDdXJsX25vbmVfY2VydF9zdGF0dXNfcmVxdWVzdCwgICAgIC8qIGNlcnRfc3RhdHVzX3JlcXVlc3QgKi8KKyAgQ3VybF9wb2xhcnNzbF9jb25uZWN0LCAgICAgICAgICAgICAvKiBjb25uZWN0ICovCisgIEN1cmxfcG9sYXJzc2xfY29ubmVjdF9ub25ibG9ja2luZywgLyogY29ubmVjdF9ub25ibG9ja2luZyAqLworICBDdXJsX3BvbGFyc3NsX2dldF9pbnRlcm5hbHMsICAgICAgIC8qIGdldF9pbnRlcm5hbHMgKi8KKyAgQ3VybF9wb2xhcnNzbF9jbG9zZSwgICAgICAgICAgICAgICAvKiBjbG9zZSAqLworICBDdXJsX25vbmVfY2xvc2VfYWxsLCAgICAgICAgICAgICAgIC8qIGNsb3NlX2FsbCAqLworICBDdXJsX3BvbGFyc3NsX3Nlc3Npb25fZnJlZSwgICAgICAgIC8qIHNlc3Npb25fZnJlZSAqLworICBDdXJsX25vbmVfc2V0X2VuZ2luZSwgICAgICAgICAgICAgIC8qIHNldF9lbmdpbmUgKi8KKyAgQ3VybF9ub25lX3NldF9lbmdpbmVfZGVmYXVsdCwgICAgICAvKiBzZXRfZW5naW5lX2RlZmF1bHQgKi8KKyAgQ3VybF9ub25lX2VuZ2luZXNfbGlzdCwgICAgICAgICAgICAvKiBlbmdpbmVzX2xpc3QgKi8KKyAgQ3VybF9ub25lX2ZhbHNlX3N0YXJ0LCAgICAgICAgICAgICAvKiBmYWxzZV9zdGFydCAqLworICBDdXJsX25vbmVfbWQ1c3VtLCAgICAgICAgICAgICAgICAgIC8qIG1kNXN1bSAqLworICBDdXJsX3BvbGFyc3NsX3NoYTI1NnN1bSAgICAgICAgICAgIC8qIHNoYTI1NnN1bSAqLworfTsKKwogI2VuZGlmIC8qIFVTRV9QT0xBUlNTTCAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9wb2xhcnNzbC5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9wb2xhcnNzbC5oCmluZGV4IDQ3YWY3YjQuLjIzYzM2MzYgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvcG9sYXJzc2wuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3BvbGFyc3NsLmgKQEAgLTI2LDU3ICsyNiw3IEBACiAKICNpZmRlZiBVU0VfUE9MQVJTU0wKIAotI2luY2x1ZGUgPHBvbGFyc3NsL3NoYTI1Ni5oPgotCi0vKiBDYWxsZWQgb24gZmlyc3QgdXNlIFBvbGFyU1NMLCBzZXR1cCB0aHJlYWRpbmcgaWYgc3VwcG9ydGVkICovCi1pbnQgIEN1cmxfcG9sYXJzc2xfaW5pdCh2b2lkKTsKLXZvaWQgQ3VybF9wb2xhcnNzbF9jbGVhbnVwKHZvaWQpOwotaW50IEN1cmxfcG9sYXJzc2xfZGF0YV9wZW5kaW5nKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci0KLQotQ1VSTGNvZGUgQ3VybF9wb2xhcnNzbF9jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci0KLUNVUkxjb2RlIEN1cmxfcG9sYXJzc2xfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpkb25lKTsKLQotIC8qIGNsb3NlIGEgU1NMIGNvbm5lY3Rpb24gKi8KLXZvaWQgQ3VybF9wb2xhcnNzbF9jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotCi12b2lkIEN1cmxfcG9sYXJzc2xfc2Vzc2lvbl9mcmVlKHZvaWQgKnB0cik7Ci1zaXplX3QgQ3VybF9wb2xhcnNzbF92ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwotaW50IEN1cmxfcG9sYXJzc2xfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLQotLyogU2V0IHRoZSBBUEkgYmFja2VuZCBkZWZpbml0aW9uIHRvIFBvbGFyU1NMICovCi0jZGVmaW5lIENVUkxfU1NMX0JBQ0tFTkQgQ1VSTFNTTEJBQ0tFTkRfUE9MQVJTU0wKLQotLyogdGhpcyBiYWNrZW5kIHN1cHBvcnRzIHRoZSBDQVBBVEggb3B0aW9uICovCi0jZGVmaW5lIGhhdmVfY3VybHNzbF9jYV9wYXRoIDEKLQotLyogdGhpcyBiYWNrZW5kcyBzdXBwb3J0cyBDVVJMT1BUX1BJTk5FRFBVQkxJQ0tFWSAqLwotI2RlZmluZSBoYXZlX2N1cmxzc2xfcGlubmVkcHVia2V5IDEKLQotLyogQVBJIHNldHVwIGZvciBQb2xhclNTTCAqLwotI2RlZmluZSBjdXJsc3NsX2luaXQoKSBDdXJsX3BvbGFyc3NsX2luaXQoKQotI2RlZmluZSBjdXJsc3NsX2NsZWFudXAoKSBDdXJsX3BvbGFyc3NsX2NsZWFudXAoKQotI2RlZmluZSBjdXJsc3NsX2Nvbm5lY3QgQ3VybF9wb2xhcnNzbF9jb25uZWN0Ci0jZGVmaW5lIGN1cmxzc2xfY29ubmVjdF9ub25ibG9ja2luZyBDdXJsX3BvbGFyc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcKLSNkZWZpbmUgY3VybHNzbF9zZXNzaW9uX2ZyZWUoeCkgIEN1cmxfcG9sYXJzc2xfc2Vzc2lvbl9mcmVlKHgpCi0jZGVmaW5lIGN1cmxzc2xfY2xvc2VfYWxsKHgpICgodm9pZCl4KQotI2RlZmluZSBjdXJsc3NsX2Nsb3NlIEN1cmxfcG9sYXJzc2xfY2xvc2UKLSNkZWZpbmUgY3VybHNzbF9zaHV0ZG93bih4LHkpIDAKLSNkZWZpbmUgY3VybHNzbF9zZXRfZW5naW5lKHgseSkgKCh2b2lkKXgsICh2b2lkKXksIENVUkxFX05PVF9CVUlMVF9JTikKLSNkZWZpbmUgY3VybHNzbF9zZXRfZW5naW5lX2RlZmF1bHQoeCkgKCh2b2lkKXgsIENVUkxFX05PVF9CVUlMVF9JTikKLSNkZWZpbmUgY3VybHNzbF9lbmdpbmVzX2xpc3QoeCkgKCh2b2lkKXgsIChzdHJ1Y3QgY3VybF9zbGlzdCAqKU5VTEwpCi0jZGVmaW5lIGN1cmxzc2xfdmVyc2lvbiBDdXJsX3BvbGFyc3NsX3ZlcnNpb24KLSNkZWZpbmUgY3VybHNzbF9jaGVja19jeG4oeCkgKCh2b2lkKXgsIC0xKQotI2RlZmluZSBjdXJsc3NsX2RhdGFfcGVuZGluZyh4LHkpIEN1cmxfcG9sYXJzc2xfZGF0YV9wZW5kaW5nKHgsIHkpCi0jZGVmaW5lIGN1cmxzc2xfc2hhMjU2c3VtKGEsYixjLGQpIHNoYTI1NihhLGIsYywwKQotCi0vKiBUaGlzIG1pZ2h0IGNhdXNlIGxpYmN1cmwgdG8gdXNlIGEgd2Vla2VyIHJhbmRvbSEKLSAgIFRPRE86IGltcGxlbWVudCBwcm9wZXIgdXNlIG9mIFBvbGFyc3NsJ3MgQ1RSLURSQkcgb3IgSE1BQy1EUkJHIGFuZCB1c2UgdGhhdAotKi8KLSNkZWZpbmUgY3VybHNzbF9yYW5kb20oeCx5LHopICgodm9pZCl4LCAodm9pZCl5LCAodm9pZCl6LCBDVVJMRV9OT1RfQlVJTFRfSU4pCitleHRlcm4gY29uc3Qgc3RydWN0IEN1cmxfc3NsIEN1cmxfc3NsX3BvbGFyc3NsOwogCiAjZW5kaWYgLyogVVNFX1BPTEFSU1NMICovCiAjZW5kaWYgLyogSEVBREVSX0NVUkxfUE9MQVJTU0xfSCAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9wb2xhcnNzbF90aHJlYWRsb2NrLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3BvbGFyc3NsX3RocmVhZGxvY2suYwppbmRleCBiMWViN2I3Li5kZDVmYmQ3IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3BvbGFyc3NsX3RocmVhZGxvY2suYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3BvbGFyc3NsX3RocmVhZGxvY2suYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExLCBIb2ktSG8gQ2hhbiwgPGhvaWhvLmNoYW5AZ21haWwuY29tPgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCkBAIC0xMTQsNyArMTE0LDcgQEAKICAgfQogI2VsaWYgZGVmaW5lZChIQVZFX1BST0NFU1NfSCkKICAgaWYobiA8IE5VTVQpIHsKLSAgICByZXQgPSAoV2FpdEZvclNpbmdsZU9iamVjdChtdXRleF9idWZbbl0sIElORklOSVRFKT09V0FJVF9GQUlMRUQ/MTowKTsKKyAgICByZXQgPSAoV2FpdEZvclNpbmdsZU9iamVjdChtdXRleF9idWZbbl0sIElORklOSVRFKSA9PSBXQUlUX0ZBSUxFRD8xOjApOwogICAgIGlmKHJldCkgewogICAgICAgREVCVUdGKGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICAgICAgICAgIkVycm9yOiBwb2xhcnNzbHRocmVhZGxvY2tfbG9ja19mdW5jdGlvbiBmYWlsZWRcbiIpKTsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvc2NoYW5uZWwuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvc2NoYW5uZWwuYwppbmRleCA5NDYwMzAxLi45Y2ExNDMxIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3NjaGFubmVsLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9zY2hhbm5lbC5jCkBAIC00Niw2ICs0Niw4IEBACiAjICBlcnJvciAiQ2FuJ3QgY29tcGlsZSBTQ0hBTk5FTCBzdXBwb3J0IHdpdGhvdXQgU1NQSS4iCiAjZW5kaWYKIAorI2luY2x1ZGUgPHNjaG5sc3AuaD4KKyNpbmNsdWRlIDxzY2hhbm5lbC5oPgogI2luY2x1ZGUgImN1cmxfc3NwaS5oIgogI2luY2x1ZGUgInNjaGFubmVsLmgiCiAjaW5jbHVkZSAidnRscy5oIgpAQCAtNzQsMTEgKzc2LDkyIEBACiAjICBkZWZpbmUgSEFTX0FMUE4gMQogI2VuZGlmCiAKKyNpZm5kZWYgVU5JU1BfTkFNRV9BCisjZGVmaW5lIFVOSVNQX05BTUVfQSAiTWljcm9zb2Z0IFVuaWZpZWQgU2VjdXJpdHkgUHJvdG9jb2wgUHJvdmlkZXIiCisjZW5kaWYKKworI2lmbmRlZiBVTklTUF9OQU1FX1cKKyNkZWZpbmUgVU5JU1BfTkFNRV9XIEwiTWljcm9zb2Z0IFVuaWZpZWQgU2VjdXJpdHkgUHJvdG9jb2wgUHJvdmlkZXIiCisjZW5kaWYKKworI2lmbmRlZiBVTklTUF9OQU1FCisjaWZkZWYgVU5JQ09ERQorI2RlZmluZSBVTklTUF9OQU1FICBVTklTUF9OQU1FX1cKKyNlbHNlCisjZGVmaW5lIFVOSVNQX05BTUUgIFVOSVNQX05BTUVfQQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTUF9QUk9UX1NTTDJfQ0xJRU5UCisjZGVmaW5lIFNQX1BST1RfU1NMMl9DTElFTlQgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2VuZGlmCisKKyNpZm5kZWYgU1BfUFJPVF9TU0wzX0NMSUVOVAorI2RlZmluZSBTUF9QUk9UX1NTTDNfQ0xJRU5UICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNlbmRpZgorCisjaWZuZGVmIFNQX1BST1RfVExTMV9DTElFTlQKKyNkZWZpbmUgU1BfUFJPVF9UTFMxX0NMSUVOVCAgICAgICAgICAgICAweDAwMDAwMDgwCisjZW5kaWYKKworI2lmbmRlZiBTUF9QUk9UX1RMUzFfMF9DTElFTlQKKyNkZWZpbmUgU1BfUFJPVF9UTFMxXzBfQ0xJRU5UICAgICAgICAgICBTUF9QUk9UX1RMUzFfQ0xJRU5UCisjZW5kaWYKKworI2lmbmRlZiBTUF9QUk9UX1RMUzFfMV9DTElFTlQKKyNkZWZpbmUgU1BfUFJPVF9UTFMxXzFfQ0xJRU5UICAgICAgICAgICAweDAwMDAwMjAwCisjZW5kaWYKKworI2lmbmRlZiBTUF9QUk9UX1RMUzFfMl9DTElFTlQKKyNkZWZpbmUgU1BfUFJPVF9UTFMxXzJfQ0xJRU5UICAgICAgICAgICAweDAwMDAwODAwCisjZW5kaWYKKworI2lmbmRlZiBTRUNCVUZGRVJfQUxFUlQKKyNkZWZpbmUgU0VDQlVGRkVSX0FMRVJUICAgICAgICAgICAgICAgICAxNworI2VuZGlmCisKKy8qIEJvdGggc2NoYW5uZWwgYnVmZmVyIHNpemVzIG11c3QgYmUgPiAwICovCisjZGVmaW5lIENVUkxfU0NIQU5ORUxfQlVGRkVSX0lOSVRfU0laRSAgIDQwOTYKKyNkZWZpbmUgQ1VSTF9TQ0hBTk5FTF9CVUZGRVJfRlJFRV9TSVpFICAgMTAyNAorCiAvKiBVbmNvbW1lbnQgdG8gZm9yY2UgdmVyYm9zZSBvdXRwdXQKICAqICNkZWZpbmUgaW5mb2YoeCwgeSwgLi4uKSBwcmludGYoeSwgX19WQV9BUkdTX18pCiAgKiAjZGVmaW5lIGZhaWxmKHgsIHksIC4uLikgcHJpbnRmKHksIF9fVkFfQVJHU19fKQogICovCiAKKy8qIFN0cnVjdHMgdG8gc3RvcmUgU2NoYW5uZWwgaGFuZGxlcyAqLworc3RydWN0IGN1cmxfc2NoYW5uZWxfY3JlZCB7CisgIENyZWRIYW5kbGUgY3JlZF9oYW5kbGU7CisgIFRpbWVTdGFtcCB0aW1lX3N0YW1wOworICBpbnQgcmVmY291bnQ7Cit9OworCitzdHJ1Y3QgY3VybF9zY2hhbm5lbF9jdHh0IHsKKyAgQ3R4dEhhbmRsZSBjdHh0X2hhbmRsZTsKKyAgVGltZVN0YW1wIHRpbWVfc3RhbXA7Cit9OworCitzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSB7CisgIHN0cnVjdCBjdXJsX3NjaGFubmVsX2NyZWQgKmNyZWQ7CisgIHN0cnVjdCBjdXJsX3NjaGFubmVsX2N0eHQgKmN0eHQ7CisgIFNlY1BrZ0NvbnRleHRfU3RyZWFtU2l6ZXMgc3RyZWFtX3NpemVzOworICBzaXplX3QgZW5jZGF0YV9sZW5ndGgsIGRlY2RhdGFfbGVuZ3RoOworICBzaXplX3QgZW5jZGF0YV9vZmZzZXQsIGRlY2RhdGFfb2Zmc2V0OworICB1bnNpZ25lZCBjaGFyICplbmNkYXRhX2J1ZmZlciwgKmRlY2RhdGFfYnVmZmVyOworICAvKiBlbmNkYXRhX2lzX2luY29tcGxldGU6IGlmIGVuY2RhdGEgY29udGFpbnMgb25seSBhIHBhcnRpYWwgcmVjb3JkIHRoYXQKKyAgICAgY2FuJ3QgYmUgZGVjcnlwdGVkIHdpdGhvdXQgYW5vdGhlciBDdXJsX3JlYWRfcGxhaW4gKHRoYXQgaXMsIHN0YXR1cyBpcworICAgICBTRUNfRV9JTkNPTVBMRVRFX01FU1NBR0UpIHRoZW4gc2V0IHRoaXMgdHJ1ZS4gYWZ0ZXIgQ3VybF9yZWFkX3BsYWluIHdyaXRlcworICAgICBtb3JlIGJ5dGVzIGludG8gZW5jZGF0YSB0aGVuIHNldCB0aGlzIGJhY2sgdG8gZmFsc2UuICovCisgIGJvb2wgZW5jZGF0YV9pc19pbmNvbXBsZXRlOworICB1bnNpZ25lZCBsb25nIHJlcV9mbGFncywgcmV0X2ZsYWdzOworICBDVVJMY29kZSByZWN2X3VucmVjb3ZlcmFibGVfZXJyOyAvKiBzY2hhbm5lbF9yZWN2IGhhZCBhbiB1bnJlY292ZXJhYmxlIGVyciAqLworICBib29sIHJlY3Zfc3NwaV9jbG9zZV9ub3RpZnk7IC8qIHRydWUgaWYgY29ubmVjdGlvbiBjbG9zZWQgYnkgY2xvc2Vfbm90aWZ5ICovCisgIGJvb2wgcmVjdl9jb25uZWN0aW9uX2Nsb3NlZDsgLyogdHJ1ZSBpZiBjb25uZWN0aW9uIGNsb3NlZCwgcmVnYXJkbGVzcyBob3cgKi8KKyAgYm9vbCB1c2VfYWxwbjsgLyogdHJ1ZSBpZiBBTFBOIGlzIHVzZWQgZm9yIHRoaXMgY29ubmVjdGlvbiAqLworfTsKKworI2RlZmluZSBCQUNLRU5EIGNvbm5zc2wtPmJhY2tlbmQKKwogc3RhdGljIEN1cmxfcmVjdiBzY2hhbm5lbF9yZWN2Owogc3RhdGljIEN1cmxfc2VuZCBzY2hhbm5lbF9zZW5kOwogCkBAIC0xNzYsMzMgKzI1OSwzMyBAQAogI2lmZGVmIEhBU19BTFBOCiAgIC8qIEFMUE4gaXMgb25seSBzdXBwb3J0ZWQgb24gV2luZG93cyA4LjEgLyBTZXJ2ZXIgMjAxMiBSMiBhbmQgYWJvdmUuCiAgICAgIEFsc28gaXQgZG9lc24ndCBzZWVtIHRvIGJlIHN1cHBvcnRlZCBmb3IgV2luZSwgc2VlIGN1cmwgYnVnICM5ODMuICovCi0gIGNvbm5zc2wtPnVzZV9hbHBuID0gY29ubi0+Yml0cy50bHNfZW5hYmxlX2FscG4gJiYKKyAgQkFDS0VORC0+dXNlX2FscG4gPSBjb25uLT5iaXRzLnRsc19lbmFibGVfYWxwbiAmJgogICAgICAgICAgICAgICAgICAgICAgICFHZXRQcm9jQWRkcmVzcyhHZXRNb2R1bGVIYW5kbGVBKCJudGRsbCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2luZV9nZXRfdmVyc2lvbiIpICYmCiAgICAgICAgICAgICAgICAgICAgICAgQ3VybF92ZXJpZnlfd2luZG93c192ZXJzaW9uKDYsIDMsIFBMQVRGT1JNX1dJTk5ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJTSU9OX0dSRUFURVJfVEhBTl9FUVVBTCk7CiAjZWxzZQotICBjb25uc3NsLT51c2VfYWxwbiA9IGZhbHNlOworICBCQUNLRU5ELT51c2VfYWxwbiA9IGZhbHNlOwogI2VuZGlmCiAKLSAgY29ubnNzbC0+Y3JlZCA9IE5VTEw7CisgIEJBQ0tFTkQtPmNyZWQgPSBOVUxMOwogCiAgIC8qIGNoZWNrIGZvciBhbiBleGlzdGluZyByZS11c2FibGUgY3JlZGVudGlhbCBoYW5kbGUgKi8KICAgaWYoU1NMX1NFVF9PUFRJT04ocHJpbWFyeS5zZXNzaW9uaWQpKSB7CiAgICAgQ3VybF9zc2xfc2Vzc2lvbmlkX2xvY2soY29ubik7CiAgICAgaWYoIUN1cmxfc3NsX2dldHNlc3Npb25pZChjb25uLCAodm9pZCAqKikmb2xkX2NyZWQsIE5VTEwsIHNvY2tpbmRleCkpIHsKLSAgICAgIGNvbm5zc2wtPmNyZWQgPSBvbGRfY3JlZDsKKyAgICAgIEJBQ0tFTkQtPmNyZWQgPSBvbGRfY3JlZDsKICAgICAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogcmUtdXNpbmcgZXhpc3RpbmcgY3JlZGVudGlhbCBoYW5kbGVcbiIpOwogCiAgICAgICAvKiBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudGVyIG9mIHRoZSBjcmVkZW50aWFsL3Nlc3Npb24gaGFuZGxlICovCi0gICAgICBjb25uc3NsLT5jcmVkLT5yZWZjb3VudCsrOworICAgICAgQkFDS0VORC0+Y3JlZC0+cmVmY291bnQrKzsKICAgICAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogaW5jcmVtZW50ZWQgY3JlZGVudGlhbCBoYW5kbGUgcmVmY291bnQgPSAlZFxuIiwKLSAgICAgICAgICAgIGNvbm5zc2wtPmNyZWQtPnJlZmNvdW50KTsKKyAgICAgICAgICAgIEJBQ0tFTkQtPmNyZWQtPnJlZmNvdW50KTsKICAgICB9CiAgICAgQ3VybF9zc2xfc2Vzc2lvbmlkX3VubG9jayhjb25uKTsKICAgfQogCi0gIGlmKCFjb25uc3NsLT5jcmVkKSB7CisgIGlmKCFCQUNLRU5ELT5jcmVkKSB7CiAgICAgLyogc2V0dXAgU2NoYW5uZWwgQVBJIG9wdGlvbnMgKi8KICAgICBtZW1zZXQoJnNjaGFubmVsX2NyZWQsIDAsIHNpemVvZihzY2hhbm5lbF9jcmVkKSk7CiAgICAgc2NoYW5uZWxfY3JlZC5kd1ZlcnNpb24gPSBTQ0hBTk5FTF9DUkVEX1ZFUlNJT047CkBAIC0yNzIsMTQgKzM1NSwxNCBAQAogICAgIH0KIAogICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHJlLXVzYWJsZSBjcmVkZW50aWFsIGhhbmRsZSAqLwotICAgIGNvbm5zc2wtPmNyZWQgPSAoc3RydWN0IGN1cmxfc2NoYW5uZWxfY3JlZCAqKQorICAgIEJBQ0tFTkQtPmNyZWQgPSAoc3RydWN0IGN1cmxfc2NoYW5uZWxfY3JlZCAqKQogICAgICAgbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3VybF9zY2hhbm5lbF9jcmVkKSk7Ci0gICAgaWYoIWNvbm5zc2wtPmNyZWQpIHsKKyAgICBpZighQkFDS0VORC0+Y3JlZCkgewogICAgICAgZmFpbGYoZGF0YSwgInNjaGFubmVsOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5Iik7CiAgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgICB9Ci0gICAgbWVtc2V0KGNvbm5zc2wtPmNyZWQsIDAsIHNpemVvZihzdHJ1Y3QgY3VybF9zY2hhbm5lbF9jcmVkKSk7Ci0gICAgY29ubnNzbC0+Y3JlZC0+cmVmY291bnQgPSAxOworICAgIG1lbXNldChCQUNLRU5ELT5jcmVkLCAwLCBzaXplb2Yoc3RydWN0IGN1cmxfc2NoYW5uZWxfY3JlZCkpOworICAgIEJBQ0tFTkQtPmNyZWQtPnJlZmNvdW50ID0gMTsKIAogICAgIC8qIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL2FhMzc0NzE2LmFzcHgKICAgICAgICAqLwpAQCAtMjg3LDggKzM3MCw4IEBACiAgICAgICBzX3BTZWNGbi0+QWNxdWlyZUNyZWRlbnRpYWxzSGFuZGxlKE5VTEwsIChUQ0hBUiAqKVVOSVNQX05BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1BLR19DUkVEX09VVEJPVU5ELCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NoYW5uZWxfY3JlZCwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbm5zc2wtPmNyZWQtPmNyZWRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ubnNzbC0+Y3JlZC0+dGltZV9zdGFtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCQUNLRU5ELT5jcmVkLT5jcmVkX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJBQ0tFTkQtPmNyZWQtPnRpbWVfc3RhbXApOwogCiAgICAgaWYoc3NwaV9zdGF0dXMgIT0gU0VDX0VfT0spIHsKICAgICAgIGlmKHNzcGlfc3RhdHVzID09IFNFQ19FX1dST05HX1BSSU5DSVBBTCkKQEAgLTI5Nyw3ICszODAsNyBAQAogICAgICAgZWxzZQogICAgICAgICBmYWlsZihkYXRhLCAic2NoYW5uZWw6IEFjcXVpcmVDcmVkZW50aWFsc0hhbmRsZSBmYWlsZWQ6ICVzIiwKICAgICAgICAgICAgICAgQ3VybF9zc3BpX3N0cmVycm9yKGNvbm4sIHNzcGlfc3RhdHVzKSk7Ci0gICAgICBDdXJsX3NhZmVmcmVlKGNvbm5zc2wtPmNyZWQpOworICAgICAgQ3VybF9zYWZlZnJlZShCQUNLRU5ELT5jcmVkKTsKICAgICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKICAgICB9CiAgIH0KQEAgLTMxMiw3ICszOTUsNyBAQAogICB9CiAKICNpZmRlZiBIQVNfQUxQTgotICBpZihjb25uc3NsLT51c2VfYWxwbikgeworICBpZihCQUNLRU5ELT51c2VfYWxwbikgewogICAgIGludCBjdXIgPSAwOwogICAgIGludCBsaXN0X3N0YXJ0X2luZGV4ID0gMDsKICAgICB1bnNpZ25lZCBpbnQgKmV4dGVuc2lvbl9sZW4gPSBOVUxMOwpAQCAtMzcwLDE4ICs0NTMsMTggQEAKICAgSW5pdFNlY0J1ZmZlckRlc2MoJm91dGJ1Zl9kZXNjLCAmb3V0YnVmLCAxKTsKIAogICAvKiBzZXR1cCByZXF1ZXN0IGZsYWdzICovCi0gIGNvbm5zc2wtPnJlcV9mbGFncyA9IElTQ19SRVFfU0VRVUVOQ0VfREVURUNUIHwgSVNDX1JFUV9SRVBMQVlfREVURUNUIHwKKyAgQkFDS0VORC0+cmVxX2ZsYWdzID0gSVNDX1JFUV9TRVFVRU5DRV9ERVRFQ1QgfCBJU0NfUkVRX1JFUExBWV9ERVRFQ1QgfAogICAgIElTQ19SRVFfQ09ORklERU5USUFMSVRZIHwgSVNDX1JFUV9BTExPQ0FURV9NRU1PUlkgfAogICAgIElTQ19SRVFfU1RSRUFNOwogCiAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3VyaXR5IGNvbnRleHQgaGFuZGxlICovCi0gIGNvbm5zc2wtPmN0eHQgPSAoc3RydWN0IGN1cmxfc2NoYW5uZWxfY3R4dCAqKQorICBCQUNLRU5ELT5jdHh0ID0gKHN0cnVjdCBjdXJsX3NjaGFubmVsX2N0eHQgKikKICAgICBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjdXJsX3NjaGFubmVsX2N0eHQpKTsKLSAgaWYoIWNvbm5zc2wtPmN0eHQpIHsKKyAgaWYoIUJBQ0tFTkQtPmN0eHQpIHsKICAgICBmYWlsZihkYXRhLCAic2NoYW5uZWw6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiKTsKICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgfQotICBtZW1zZXQoY29ubnNzbC0+Y3R4dCwgMCwgc2l6ZW9mKHN0cnVjdCBjdXJsX3NjaGFubmVsX2N0eHQpKTsKKyAgbWVtc2V0KEJBQ0tFTkQtPmN0eHQsIDAsIHNpemVvZihzdHJ1Y3QgY3VybF9zY2hhbm5lbF9jdHh0KSk7CiAKICAgaG9zdF9uYW1lID0gQ3VybF9jb252ZXJ0X1VURjhfdG9fdGNoYXIoaG9zdG5hbWUpOwogICBpZighaG9zdF9uYW1lKQpAQCAtMzk1LDEwICs0NzgsMTAgQEAKICAgICAgdXMgcHJvYmxlbXMgd2l0aCBpbmJ1ZiByZWdhcmRsZXNzLiBodHRwczovL2dpdGh1Yi5jb20vY3VybC9jdXJsL2lzc3Vlcy85ODMKICAgKi8KICAgc3NwaV9zdGF0dXMgPSBzX3BTZWNGbi0+SW5pdGlhbGl6ZVNlY3VyaXR5Q29udGV4dCgKLSAgICAmY29ubnNzbC0+Y3JlZC0+Y3JlZF9oYW5kbGUsIE5VTEwsIGhvc3RfbmFtZSwgY29ubnNzbC0+cmVxX2ZsYWdzLCAwLCAwLAotICAgIChjb25uc3NsLT51c2VfYWxwbiA/ICZpbmJ1Zl9kZXNjIDogTlVMTCksCi0gICAgMCwgJmNvbm5zc2wtPmN0eHQtPmN0eHRfaGFuZGxlLAotICAgICZvdXRidWZfZGVzYywgJmNvbm5zc2wtPnJldF9mbGFncywgJmNvbm5zc2wtPmN0eHQtPnRpbWVfc3RhbXApOworICAgICZCQUNLRU5ELT5jcmVkLT5jcmVkX2hhbmRsZSwgTlVMTCwgaG9zdF9uYW1lLCBCQUNLRU5ELT5yZXFfZmxhZ3MsIDAsIDAsCisgICAgKEJBQ0tFTkQtPnVzZV9hbHBuID8gJmluYnVmX2Rlc2MgOiBOVUxMKSwKKyAgICAwLCAmQkFDS0VORC0+Y3R4dC0+Y3R4dF9oYW5kbGUsCisgICAgJm91dGJ1Zl9kZXNjLCAmQkFDS0VORC0+cmV0X2ZsYWdzLCAmQkFDS0VORC0+Y3R4dC0+dGltZV9zdGFtcCk7CiAKICAgQ3VybF91bmljb2RlZnJlZShob3N0X25hbWUpOwogCkBAIC00MDksNyArNDkyLDcgQEAKICAgICBlbHNlCiAgICAgICBmYWlsZihkYXRhLCAic2NoYW5uZWw6IGluaXRpYWwgSW5pdGlhbGl6ZVNlY3VyaXR5Q29udGV4dCBmYWlsZWQ6ICVzIiwKICAgICAgICAgICAgIEN1cmxfc3NwaV9zdHJlcnJvcihjb25uLCBzc3BpX3N0YXR1cykpOwotICAgIEN1cmxfc2FmZWZyZWUoY29ubnNzbC0+Y3R4dCk7CisgICAgQ3VybF9zYWZlZnJlZShCQUNLRU5ELT5jdHh0KTsKICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CiAgIH0KIApAQCAtNDI5LDEwICs1MTIsMTAgQEAKICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBzZW50IGluaXRpYWwgaGFuZHNoYWtlIGRhdGE6ICIKICAgICAgICAgInNlbnQgJXpkIGJ5dGVzXG4iLCB3cml0dGVuKTsKIAotICBjb25uc3NsLT5yZWN2X3VucmVjb3ZlcmFibGVfZXJyID0gQ1VSTEVfT0s7Ci0gIGNvbm5zc2wtPnJlY3Zfc3NwaV9jbG9zZV9ub3RpZnkgPSBmYWxzZTsKLSAgY29ubnNzbC0+cmVjdl9jb25uZWN0aW9uX2Nsb3NlZCA9IGZhbHNlOwotICBjb25uc3NsLT5lbmNkYXRhX2lzX2luY29tcGxldGUgPSBmYWxzZTsKKyAgQkFDS0VORC0+cmVjdl91bnJlY292ZXJhYmxlX2VyciA9IENVUkxFX09LOworICBCQUNLRU5ELT5yZWN2X3NzcGlfY2xvc2Vfbm90aWZ5ID0gZmFsc2U7CisgIEJBQ0tFTkQtPnJlY3ZfY29ubmVjdGlvbl9jbG9zZWQgPSBmYWxzZTsKKyAgQkFDS0VORC0+ZW5jZGF0YV9pc19pbmNvbXBsZXRlID0gZmFsc2U7CiAKICAgLyogY29udGludWUgdG8gc2Vjb25kIGhhbmRzaGFrZSBzdGVwICovCiAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPSBzc2xfY29ubmVjdF8yOwpAQCAtNDY1LDM5ICs1NDgsMzkgQEAKICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBTU0wvVExTIGNvbm5lY3Rpb24gd2l0aCAlcyBwb3J0ICVodSAoc3RlcCAyLzMpXG4iLAogICAgICAgICBob3N0bmFtZSwgY29ubi0+cmVtb3RlX3BvcnQpOwogCi0gIGlmKCFjb25uc3NsLT5jcmVkIHx8ICFjb25uc3NsLT5jdHh0KQorICBpZighQkFDS0VORC0+Y3JlZCB8fCAhQkFDS0VORC0+Y3R4dCkKICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CiAKICAgLyogYnVmZmVyIHRvIHN0b3JlIHByZXZpb3VzbHkgcmVjZWl2ZWQgYW5kIGRlY3J5cHRlZCBkYXRhICovCi0gIGlmKGNvbm5zc2wtPmRlY2RhdGFfYnVmZmVyID09IE5VTEwpIHsKLSAgICBjb25uc3NsLT5kZWNkYXRhX29mZnNldCA9IDA7Ci0gICAgY29ubnNzbC0+ZGVjZGF0YV9sZW5ndGggPSBDVVJMX1NDSEFOTkVMX0JVRkZFUl9JTklUX1NJWkU7Ci0gICAgY29ubnNzbC0+ZGVjZGF0YV9idWZmZXIgPSBtYWxsb2MoY29ubnNzbC0+ZGVjZGF0YV9sZW5ndGgpOwotICAgIGlmKGNvbm5zc2wtPmRlY2RhdGFfYnVmZmVyID09IE5VTEwpIHsKKyAgaWYoQkFDS0VORC0+ZGVjZGF0YV9idWZmZXIgPT0gTlVMTCkgeworICAgIEJBQ0tFTkQtPmRlY2RhdGFfb2Zmc2V0ID0gMDsKKyAgICBCQUNLRU5ELT5kZWNkYXRhX2xlbmd0aCA9IENVUkxfU0NIQU5ORUxfQlVGRkVSX0lOSVRfU0laRTsKKyAgICBCQUNLRU5ELT5kZWNkYXRhX2J1ZmZlciA9IG1hbGxvYyhCQUNLRU5ELT5kZWNkYXRhX2xlbmd0aCk7CisgICAgaWYoQkFDS0VORC0+ZGVjZGF0YV9idWZmZXIgPT0gTlVMTCkgewogICAgICAgZmFpbGYoZGF0YSwgInNjaGFubmVsOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5Iik7CiAgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgICB9CiAgIH0KIAogICAvKiBidWZmZXIgdG8gc3RvcmUgcHJldmlvdXNseSByZWNlaXZlZCBhbmQgZW5jcnlwdGVkIGRhdGEgKi8KLSAgaWYoY29ubnNzbC0+ZW5jZGF0YV9idWZmZXIgPT0gTlVMTCkgewotICAgIGNvbm5zc2wtPmVuY2RhdGFfaXNfaW5jb21wbGV0ZSA9IGZhbHNlOwotICAgIGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0ID0gMDsKLSAgICBjb25uc3NsLT5lbmNkYXRhX2xlbmd0aCA9IENVUkxfU0NIQU5ORUxfQlVGRkVSX0lOSVRfU0laRTsKLSAgICBjb25uc3NsLT5lbmNkYXRhX2J1ZmZlciA9IG1hbGxvYyhjb25uc3NsLT5lbmNkYXRhX2xlbmd0aCk7Ci0gICAgaWYoY29ubnNzbC0+ZW5jZGF0YV9idWZmZXIgPT0gTlVMTCkgeworICBpZihCQUNLRU5ELT5lbmNkYXRhX2J1ZmZlciA9PSBOVUxMKSB7CisgICAgQkFDS0VORC0+ZW5jZGF0YV9pc19pbmNvbXBsZXRlID0gZmFsc2U7CisgICAgQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQgPSAwOworICAgIEJBQ0tFTkQtPmVuY2RhdGFfbGVuZ3RoID0gQ1VSTF9TQ0hBTk5FTF9CVUZGRVJfSU5JVF9TSVpFOworICAgIEJBQ0tFTkQtPmVuY2RhdGFfYnVmZmVyID0gbWFsbG9jKEJBQ0tFTkQtPmVuY2RhdGFfbGVuZ3RoKTsKKyAgICBpZihCQUNLRU5ELT5lbmNkYXRhX2J1ZmZlciA9PSBOVUxMKSB7CiAgICAgICBmYWlsZihkYXRhLCAic2NoYW5uZWw6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiKTsKICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICAgIH0KICAgfQogCiAgIC8qIGlmIHdlIG5lZWQgYSBiaWdnZXIgYnVmZmVyIHRvIHJlYWQgYSBmdWxsIG1lc3NhZ2UsIGluY3JlYXNlIGJ1ZmZlciBub3cgKi8KLSAgaWYoY29ubnNzbC0+ZW5jZGF0YV9sZW5ndGggLSBjb25uc3NsLT5lbmNkYXRhX29mZnNldCA8CisgIGlmKEJBQ0tFTkQtPmVuY2RhdGFfbGVuZ3RoIC0gQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQgPAogICAgICBDVVJMX1NDSEFOTkVMX0JVRkZFUl9GUkVFX1NJWkUpIHsKICAgICAvKiBpbmNyZWFzZSBpbnRlcm5hbCBlbmNyeXB0ZWQgZGF0YSBidWZmZXIgKi8KLSAgICByZWFsbG9jYXRlZF9sZW5ndGggPSBjb25uc3NsLT5lbmNkYXRhX29mZnNldCArCisgICAgcmVhbGxvY2F0ZWRfbGVuZ3RoID0gQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQgKwogICAgICAgQ1VSTF9TQ0hBTk5FTF9CVUZGRVJfRlJFRV9TSVpFOwotICAgIHJlYWxsb2NhdGVkX2J1ZmZlciA9IHJlYWxsb2MoY29ubnNzbC0+ZW5jZGF0YV9idWZmZXIsCisgICAgcmVhbGxvY2F0ZWRfYnVmZmVyID0gcmVhbGxvYyhCQUNLRU5ELT5lbmNkYXRhX2J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxsb2NhdGVkX2xlbmd0aCk7CiAKICAgICBpZihyZWFsbG9jYXRlZF9idWZmZXIgPT0gTlVMTCkgewpAQCAtNTA1LDggKzU4OCw4IEBACiAgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICBjb25uc3NsLT5lbmNkYXRhX2J1ZmZlciA9IHJlYWxsb2NhdGVkX2J1ZmZlcjsKLSAgICAgIGNvbm5zc2wtPmVuY2RhdGFfbGVuZ3RoID0gcmVhbGxvY2F0ZWRfbGVuZ3RoOworICAgICAgQkFDS0VORC0+ZW5jZGF0YV9idWZmZXIgPSByZWFsbG9jYXRlZF9idWZmZXI7CisgICAgICBCQUNLRU5ELT5lbmNkYXRhX2xlbmd0aCA9IHJlYWxsb2NhdGVkX2xlbmd0aDsKICAgICB9CiAgIH0KIApAQCAtNTE0LDEwICs1OTcsMTAgQEAKICAgICBpZihkb3JlYWQpIHsKICAgICAgIC8qIHJlYWQgZW5jcnlwdGVkIGhhbmRzaGFrZSBkYXRhIGZyb20gc29ja2V0ICovCiAgICAgICByZXN1bHQgPSBDdXJsX3JlYWRfcGxhaW4oY29ubi0+c29ja1tzb2NraW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIChjb25uc3NsLT5lbmNkYXRhX2J1ZmZlciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uc3NsLT5lbmNkYXRhX2xlbmd0aCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgKEJBQ0tFTkQtPmVuY2RhdGFfYnVmZmVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBQ0tFTkQtPmVuY2RhdGFfbGVuZ3RoIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUNLRU5ELT5lbmNkYXRhX29mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnJlYWQpOwogICAgICAgaWYocmVzdWx0ID09IENVUkxFX0FHQUlOKSB7CiAgICAgICAgIGlmKGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgIT0gc3NsX2Nvbm5lY3RfMl93cml0aW5nKQpAQCAtNTMzLDE3ICs2MTYsMTcgQEAKICAgICAgIH0KIAogICAgICAgLyogaW5jcmVhc2UgZW5jcnlwdGVkIGRhdGEgYnVmZmVyIG9mZnNldCAqLwotICAgICAgY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQgKz0gbnJlYWQ7Ci0gICAgICBjb25uc3NsLT5lbmNkYXRhX2lzX2luY29tcGxldGUgPSBmYWxzZTsKKyAgICAgIEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0ICs9IG5yZWFkOworICAgICAgQkFDS0VORC0+ZW5jZGF0YV9pc19pbmNvbXBsZXRlID0gZmFsc2U7CiAgICAgICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IGVuY3J5cHRlZCBkYXRhIGdvdCAlemRcbiIsIG5yZWFkKTsKICAgICB9CiAKICAgICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IGVuY3J5cHRlZCBkYXRhIGJ1ZmZlcjogb2Zmc2V0ICV6dSBsZW5ndGggJXp1XG4iLAotICAgICAgICAgIGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0LCBjb25uc3NsLT5lbmNkYXRhX2xlbmd0aCk7CisgICAgICAgICAgQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQsIEJBQ0tFTkQtPmVuY2RhdGFfbGVuZ3RoKTsKIAogICAgIC8qIHNldHVwIGlucHV0IGJ1ZmZlcnMgKi8KLSAgICBJbml0U2VjQnVmZmVyKCZpbmJ1ZlswXSwgU0VDQlVGRkVSX1RPS0VOLCBtYWxsb2MoY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQpLAotICAgICAgICAgICAgICAgICAgY3VybHhfdXp0b3VsKGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0KSk7CisgICAgSW5pdFNlY0J1ZmZlcigmaW5idWZbMF0sIFNFQ0JVRkZFUl9UT0tFTiwgbWFsbG9jKEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgIGN1cmx4X3V6dG91bChCQUNLRU5ELT5lbmNkYXRhX29mZnNldCkpOwogICAgIEluaXRTZWNCdWZmZXIoJmluYnVmWzFdLCBTRUNCVUZGRVJfRU1QVFksIE5VTEwsIDApOwogICAgIEluaXRTZWNCdWZmZXJEZXNjKCZpbmJ1Zl9kZXNjLCBpbmJ1ZiwgMik7CiAKQEAgLTU1OSw4ICs2NDIsOCBAQAogICAgIH0KIAogICAgIC8qIGNvcHkgcmVjZWl2ZWQgaGFuZHNoYWtlIGRhdGEgaW50byBpbnB1dCBidWZmZXIgKi8KLSAgICBtZW1jcHkoaW5idWZbMF0ucHZCdWZmZXIsIGNvbm5zc2wtPmVuY2RhdGFfYnVmZmVyLAotICAgICAgICAgICBjb25uc3NsLT5lbmNkYXRhX29mZnNldCk7CisgICAgbWVtY3B5KGluYnVmWzBdLnB2QnVmZmVyLCBCQUNLRU5ELT5lbmNkYXRhX2J1ZmZlciwKKyAgICAgICAgICAgQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQpOwogCiAgICAgaG9zdF9uYW1lID0gQ3VybF9jb252ZXJ0X1VURjhfdG9fdGNoYXIoaG9zdG5hbWUpOwogICAgIGlmKCFob3N0X25hbWUpCkBAIC01NjksOSArNjUyLDkgQEAKICAgICAvKiBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9hYTM3NTkyNC5hc3B4CiAgICAgICAgKi8KICAgICBzc3BpX3N0YXR1cyA9IHNfcFNlY0ZuLT5Jbml0aWFsaXplU2VjdXJpdHlDb250ZXh0KAotICAgICAgJmNvbm5zc2wtPmNyZWQtPmNyZWRfaGFuZGxlLCAmY29ubnNzbC0+Y3R4dC0+Y3R4dF9oYW5kbGUsCi0gICAgICBob3N0X25hbWUsIGNvbm5zc2wtPnJlcV9mbGFncywgMCwgMCwgJmluYnVmX2Rlc2MsIDAsIE5VTEwsCi0gICAgICAmb3V0YnVmX2Rlc2MsICZjb25uc3NsLT5yZXRfZmxhZ3MsICZjb25uc3NsLT5jdHh0LT50aW1lX3N0YW1wKTsKKyAgICAgICZCQUNLRU5ELT5jcmVkLT5jcmVkX2hhbmRsZSwgJkJBQ0tFTkQtPmN0eHQtPmN0eHRfaGFuZGxlLAorICAgICAgaG9zdF9uYW1lLCBCQUNLRU5ELT5yZXFfZmxhZ3MsIDAsIDAsICZpbmJ1Zl9kZXNjLCAwLCBOVUxMLAorICAgICAgJm91dGJ1Zl9kZXNjLCAmQkFDS0VORC0+cmV0X2ZsYWdzLCAmQkFDS0VORC0+Y3R4dC0+dGltZV9zdGFtcCk7CiAKICAgICBDdXJsX3VuaWNvZGVmcmVlKGhvc3RfbmFtZSk7CiAKQEAgLTU4MCw3ICs2NjMsNyBAQAogCiAgICAgLyogY2hlY2sgaWYgdGhlIGhhbmRzaGFrZSB3YXMgaW5jb21wbGV0ZSAqLwogICAgIGlmKHNzcGlfc3RhdHVzID09IFNFQ19FX0lOQ09NUExFVEVfTUVTU0FHRSkgewotICAgICAgY29ubnNzbC0+ZW5jZGF0YV9pc19pbmNvbXBsZXRlID0gdHJ1ZTsKKyAgICAgIEJBQ0tFTkQtPmVuY2RhdGFfaXNfaW5jb21wbGV0ZSA9IHRydWU7CiAgICAgICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID0gc3NsX2Nvbm5lY3RfMl9yZWFkaW5nOwogICAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiByZWNlaXZlZCBpbmNvbXBsZXRlIG1lc3NhZ2UsIG5lZWQgbW9yZSBkYXRhXG4iKTsKICAgICAgIHJldHVybiBDVVJMRV9PSzsKQEAgLTU5MCw4ICs2NzMsOCBAQAogICAgICAgIHRoZSBoYW5kc2hha2Ugd2l0aG91dCBvbmUuIFRoaXMgd2lsbCBhbGxvdyBjb25uZWN0aW9ucyB0byBzZXJ2ZXJzIHdoaWNoCiAgICAgICAgcmVxdWVzdCBhIGNsaWVudCBjZXJ0aWZpY2F0ZSBidXQgZG8gbm90IHJlcXVpcmUgaXQuICovCiAgICAgaWYoc3NwaV9zdGF0dXMgPT0gU0VDX0lfSU5DT01QTEVURV9DUkVERU5USUFMUyAmJgotICAgICAgICEoY29ubnNzbC0+cmVxX2ZsYWdzICYgSVNDX1JFUV9VU0VfU1VQUExJRURfQ1JFRFMpKSB7Ci0gICAgICBjb25uc3NsLT5yZXFfZmxhZ3MgfD0gSVNDX1JFUV9VU0VfU1VQUExJRURfQ1JFRFM7CisgICAgICAgIShCQUNLRU5ELT5yZXFfZmxhZ3MgJiBJU0NfUkVRX1VTRV9TVVBQTElFRF9DUkVEUykpIHsKKyAgICAgIEJBQ0tFTkQtPnJlcV9mbGFncyB8PSBJU0NfUkVRX1VTRV9TVVBQTElFRF9DUkVEUzsKICAgICAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPSBzc2xfY29ubmVjdF8yX3dyaXRpbmc7CiAgICAgICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IGEgY2xpZW50IGNlcnRpZmljYXRlIGhhcyBiZWVuIHJlcXVlc3RlZFxuIik7CiAgICAgICByZXR1cm4gQ1VSTEVfT0s7CkBAIC02MzEsNyArNzE0LDcgQEAKICAgICAgICAgZmFpbGYoZGF0YSwgInNjaGFubmVsOiBuZXh0IEluaXRpYWxpemVTZWN1cml0eUNvbnRleHQgZmFpbGVkOiAlcyIsCiAgICAgICAgICAgICAgIEN1cmxfc3NwaV9zdHJlcnJvcihjb25uLCBzc3BpX3N0YXR1cykpOwogICAgICAgcmV0dXJuIHNzcGlfc3RhdHVzID09IFNFQ19FX1VOVFJVU1RFRF9ST09UID8KLSAgICAgICAgICBDVVJMRV9TU0xfQ0FDRVJUX0JBREZJTEUgOiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKKyAgICAgICAgICBDVVJMRV9TU0xfQ0FDRVJUIDogQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CiAgICAgfQogCiAgICAgLyogY2hlY2sgaWYgdGhlcmUgd2FzIGFkZGl0aW9uYWwgcmVtYWluaW5nIGVuY3J5cHRlZCBkYXRhICovCkBAIC02NDksMTEgKzczMiwxMSBAQAogICAgICAgKi8KICAgICAgIC8qIGNoZWNrIGlmIHRoZSByZW1haW5pbmcgZGF0YSBpcyBsZXNzIHRoYW4gdGhlIHRvdGFsIGFtb3VudAogICAgICAgICAgYW5kIHRoZXJlZm9yZSBiZWdpbnMgYWZ0ZXIgdGhlIGFscmVhZHkgcHJvY2Vzc2VkIGRhdGEgKi8KLSAgICAgIGlmKGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0ID4gaW5idWZbMV0uY2JCdWZmZXIpIHsKLSAgICAgICAgbWVtbW92ZShjb25uc3NsLT5lbmNkYXRhX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAoY29ubnNzbC0+ZW5jZGF0YV9idWZmZXIgKyBjb25uc3NsLT5lbmNkYXRhX29mZnNldCkgLQorICAgICAgaWYoQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQgPiBpbmJ1ZlsxXS5jYkJ1ZmZlcikgeworICAgICAgICBtZW1tb3ZlKEJBQ0tFTkQtPmVuY2RhdGFfYnVmZmVyLAorICAgICAgICAgICAgICAgIChCQUNLRU5ELT5lbmNkYXRhX2J1ZmZlciArIEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0KSAtCiAgICAgICAgICAgICAgICAgaW5idWZbMV0uY2JCdWZmZXIsIGluYnVmWzFdLmNiQnVmZmVyKTsKLSAgICAgICAgY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQgPSBpbmJ1ZlsxXS5jYkJ1ZmZlcjsKKyAgICAgICAgQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQgPSBpbmJ1ZlsxXS5jYkJ1ZmZlcjsKICAgICAgICAgaWYoc3NwaV9zdGF0dXMgPT0gU0VDX0lfQ09OVElOVUVfTkVFREVEKSB7CiAgICAgICAgICAgZG9yZWFkID0gRkFMU0U7CiAgICAgICAgICAgY29udGludWU7CkBAIC02NjEsNyArNzQ0LDcgQEAKICAgICAgIH0KICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICBjb25uc3NsLT5lbmNkYXRhX29mZnNldCA9IDA7CisgICAgICBCQUNLRU5ELT5lbmNkYXRhX29mZnNldCA9IDA7CiAgICAgfQogICAgIGJyZWFrOwogICB9CkBAIC03MDksMjcgKzc5MiwyNyBAQAogICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IFNTTC9UTFMgY29ubmVjdGlvbiB3aXRoICVzIHBvcnQgJWh1IChzdGVwIDMvMylcbiIsCiAgICAgICAgIGhvc3RuYW1lLCBjb25uLT5yZW1vdGVfcG9ydCk7CiAKLSAgaWYoIWNvbm5zc2wtPmNyZWQpCisgIGlmKCFCQUNLRU5ELT5jcmVkKQogICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKIAogICAvKiBjaGVjayBpZiB0aGUgcmVxdWlyZWQgY29udGV4dCBhdHRyaWJ1dGVzIGFyZSBtZXQgKi8KLSAgaWYoY29ubnNzbC0+cmV0X2ZsYWdzICE9IGNvbm5zc2wtPnJlcV9mbGFncykgewotICAgIGlmKCEoY29ubnNzbC0+cmV0X2ZsYWdzICYgSVNDX1JFVF9TRVFVRU5DRV9ERVRFQ1QpKQorICBpZihCQUNLRU5ELT5yZXRfZmxhZ3MgIT0gQkFDS0VORC0+cmVxX2ZsYWdzKSB7CisgICAgaWYoIShCQUNLRU5ELT5yZXRfZmxhZ3MgJiBJU0NfUkVUX1NFUVVFTkNFX0RFVEVDVCkpCiAgICAgICBmYWlsZihkYXRhLCAic2NoYW5uZWw6IGZhaWxlZCB0byBzZXR1cCBzZXF1ZW5jZSBkZXRlY3Rpb24iKTsKLSAgICBpZighKGNvbm5zc2wtPnJldF9mbGFncyAmIElTQ19SRVRfUkVQTEFZX0RFVEVDVCkpCisgICAgaWYoIShCQUNLRU5ELT5yZXRfZmxhZ3MgJiBJU0NfUkVUX1JFUExBWV9ERVRFQ1QpKQogICAgICAgZmFpbGYoZGF0YSwgInNjaGFubmVsOiBmYWlsZWQgdG8gc2V0dXAgcmVwbGF5IGRldGVjdGlvbiIpOwotICAgIGlmKCEoY29ubnNzbC0+cmV0X2ZsYWdzICYgSVNDX1JFVF9DT05GSURFTlRJQUxJVFkpKQorICAgIGlmKCEoQkFDS0VORC0+cmV0X2ZsYWdzICYgSVNDX1JFVF9DT05GSURFTlRJQUxJVFkpKQogICAgICAgZmFpbGYoZGF0YSwgInNjaGFubmVsOiBmYWlsZWQgdG8gc2V0dXAgY29uZmlkZW50aWFsaXR5Iik7Ci0gICAgaWYoIShjb25uc3NsLT5yZXRfZmxhZ3MgJiBJU0NfUkVUX0FMTE9DQVRFRF9NRU1PUlkpKQorICAgIGlmKCEoQkFDS0VORC0+cmV0X2ZsYWdzICYgSVNDX1JFVF9BTExPQ0FURURfTUVNT1JZKSkKICAgICAgIGZhaWxmKGRhdGEsICJzY2hhbm5lbDogZmFpbGVkIHRvIHNldHVwIG1lbW9yeSBhbGxvY2F0aW9uIik7Ci0gICAgaWYoIShjb25uc3NsLT5yZXRfZmxhZ3MgJiBJU0NfUkVUX1NUUkVBTSkpCisgICAgaWYoIShCQUNLRU5ELT5yZXRfZmxhZ3MgJiBJU0NfUkVUX1NUUkVBTSkpCiAgICAgICBmYWlsZihkYXRhLCAic2NoYW5uZWw6IGZhaWxlZCB0byBzZXR1cCBzdHJlYW0gb3JpZW50YXRpb24iKTsKICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CiAgIH0KIAogI2lmZGVmIEhBU19BTFBOCi0gIGlmKGNvbm5zc2wtPnVzZV9hbHBuKSB7Ci0gICAgc3NwaV9zdGF0dXMgPSBzX3BTZWNGbi0+UXVlcnlDb250ZXh0QXR0cmlidXRlcygmY29ubnNzbC0+Y3R4dC0+Y3R4dF9oYW5kbGUsCisgIGlmKEJBQ0tFTkQtPnVzZV9hbHBuKSB7CisgICAgc3NwaV9zdGF0dXMgPSBzX3BTZWNGbi0+UXVlcnlDb250ZXh0QXR0cmlidXRlcygmQkFDS0VORC0+Y3R4dC0+Y3R4dF9oYW5kbGUsCiAgICAgICBTRUNQS0dfQVRUUl9BUFBMSUNBVElPTl9QUk9UT0NPTCwgJmFscG5fcmVzdWx0KTsKIAogICAgIGlmKHNzcGlfc3RhdHVzICE9IFNFQ19FX09LKSB7CkBAIC03NzEsNyArODU0LDcgQEAKICAgICBpbmNhY2hlID0gIShDdXJsX3NzbF9nZXRzZXNzaW9uaWQoY29ubiwgKHZvaWQgKiopJm9sZF9jcmVkLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NraW5kZXgpKTsKICAgICBpZihpbmNhY2hlKSB7Ci0gICAgICBpZihvbGRfY3JlZCAhPSBjb25uc3NsLT5jcmVkKSB7CisgICAgICBpZihvbGRfY3JlZCAhPSBCQUNLRU5ELT5jcmVkKSB7CiAgICAgICAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogb2xkIGNyZWRlbnRpYWwgaGFuZGxlIGlzIHN0YWxlLCByZW1vdmluZ1xuIik7CiAgICAgICAgIC8qIHdlJ3JlIG5vdCB0YWtpbmcgb2xkX2NyZWQgb3duZXJzaGlwIGhlcmUsIG5vIHJlZmNvdW50KysgaXMgbmVlZGVkICovCiAgICAgICAgIEN1cmxfc3NsX2RlbHNlc3Npb25pZChjb25uLCAodm9pZCAqKW9sZF9jcmVkKTsKQEAgLTc3OSw3ICs4NjIsNyBAQAogICAgICAgfQogICAgIH0KICAgICBpZighaW5jYWNoZSkgewotICAgICAgcmVzdWx0ID0gQ3VybF9zc2xfYWRkc2Vzc2lvbmlkKGNvbm4sICh2b2lkICopY29ubnNzbC0+Y3JlZCwKKyAgICAgIHJlc3VsdCA9IEN1cmxfc3NsX2FkZHNlc3Npb25pZChjb25uLCAodm9pZCAqKUJBQ0tFTkQtPmNyZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBjdXJsX3NjaGFubmVsX2NyZWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tpbmRleCk7CiAgICAgICBpZihyZXN1bHQpIHsKQEAgLTc4OSw3ICs4NzIsNyBAQAogICAgICAgfQogICAgICAgZWxzZSB7CiAgICAgICAgIC8qIHRoaXMgY3JlZCBzZXNzaW9uIGlzIG5vdyBhbHNvIHJlZmVyZW5jZWQgYnkgc2Vzc2lvbmlkIGNhY2hlICovCi0gICAgICAgIGNvbm5zc2wtPmNyZWQtPnJlZmNvdW50Kys7CisgICAgICAgIEJBQ0tFTkQtPmNyZWQtPnJlZmNvdW50Kys7CiAgICAgICAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogc3RvcmVkIGNyZWRlbnRpYWwgaGFuZGxlIGluIHNlc3Npb24gY2FjaGVcbiIpOwogICAgICAgfQogICAgIH0KQEAgLTc5Nyw3ICs4ODAsNyBAQAogICB9CiAKICAgaWYoZGF0YS0+c2V0LnNzbC5jZXJ0aW5mbykgewotICAgIHNzcGlfc3RhdHVzID0gc19wU2VjRm4tPlF1ZXJ5Q29udGV4dEF0dHJpYnV0ZXMoJmNvbm5zc2wtPmN0eHQtPmN0eHRfaGFuZGxlLAorICAgIHNzcGlfc3RhdHVzID0gc19wU2VjRm4tPlF1ZXJ5Q29udGV4dEF0dHJpYnV0ZXMoJkJBQ0tFTkQtPmN0eHQtPmN0eHRfaGFuZGxlLAogICAgICAgU0VDUEtHX0FUVFJfUkVNT1RFX0NFUlRfQ09OVEVYVCwgJmNjZXJ0X2NvbnRleHQpOwogCiAgICAgaWYoKHNzcGlfc3RhdHVzICE9IFNFQ19FX09LKSB8fCAoY2NlcnRfY29udGV4dCA9PSBOVUxMKSkgewpAQCAtOTUxLDExICsxMDM0LDExIEBACiAgIENVUkxjb2RlIHJlc3VsdDsKIAogICAvKiBjaGVjayBpZiB0aGUgbWF4aW11bSBzdHJlYW0gc2l6ZXMgd2VyZSBxdWVyaWVkICovCi0gIGlmKGNvbm5zc2wtPnN0cmVhbV9zaXplcy5jYk1heGltdW1NZXNzYWdlID09IDApIHsKKyAgaWYoQkFDS0VORC0+c3RyZWFtX3NpemVzLmNiTWF4aW11bU1lc3NhZ2UgPT0gMCkgewogICAgIHNzcGlfc3RhdHVzID0gc19wU2VjRm4tPlF1ZXJ5Q29udGV4dEF0dHJpYnV0ZXMoCi0gICAgICAmY29ubnNzbC0+Y3R4dC0+Y3R4dF9oYW5kbGUsCisgICAgICAmQkFDS0VORC0+Y3R4dC0+Y3R4dF9oYW5kbGUsCiAgICAgICBTRUNQS0dfQVRUUl9TVFJFQU1fU0laRVMsCi0gICAgICAmY29ubnNzbC0+c3RyZWFtX3NpemVzKTsKKyAgICAgICZCQUNLRU5ELT5zdHJlYW1fc2l6ZXMpOwogICAgIGlmKHNzcGlfc3RhdHVzICE9IFNFQ19FX09LKSB7CiAgICAgICAqZXJyID0gQ1VSTEVfU0VORF9FUlJPUjsKICAgICAgIHJldHVybiAtMTsKQEAgLTk2MywxNCArMTA0NiwxMyBAQAogICB9CiAKICAgLyogY2hlY2sgaWYgdGhlIGJ1ZmZlciBpcyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBtZXNzYWdlIGxlbmd0aCAqLwotICBpZihsZW4gPiBjb25uc3NsLT5zdHJlYW1fc2l6ZXMuY2JNYXhpbXVtTWVzc2FnZSkgewotICAgICplcnIgPSBDVVJMRV9TRU5EX0VSUk9SOwotICAgIHJldHVybiAtMTsKKyAgaWYobGVuID4gQkFDS0VORC0+c3RyZWFtX3NpemVzLmNiTWF4aW11bU1lc3NhZ2UpIHsKKyAgICBsZW4gPSBCQUNLRU5ELT5zdHJlYW1fc2l6ZXMuY2JNYXhpbXVtTWVzc2FnZTsKICAgfQogCiAgIC8qIGNhbGN1bGF0ZSB0aGUgY29tcGxldGUgbWVzc2FnZSBsZW5ndGggYW5kIGFsbG9jYXRlIGEgYnVmZmVyIGZvciBpdCAqLwotICBkYXRhX2xlbiA9IGNvbm5zc2wtPnN0cmVhbV9zaXplcy5jYkhlYWRlciArIGxlbiArCi0gICAgY29ubnNzbC0+c3RyZWFtX3NpemVzLmNiVHJhaWxlcjsKKyAgZGF0YV9sZW4gPSBCQUNLRU5ELT5zdHJlYW1fc2l6ZXMuY2JIZWFkZXIgKyBsZW4gKworICAgIEJBQ0tFTkQtPnN0cmVhbV9zaXplcy5jYlRyYWlsZXI7CiAgIGRhdGEgPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MoZGF0YV9sZW4pOwogICBpZihkYXRhID09IE5VTEwpIHsKICAgICAqZXJyID0gQ1VSTEVfT1VUX09GX01FTU9SWTsKQEAgLTk3OSwxMiArMTA2MSwxMiBAQAogCiAgIC8qIHNldHVwIG91dHB1dCBidWZmZXJzIChoZWFkZXIsIGRhdGEsIHRyYWlsZXIsIGVtcHR5KSAqLwogICBJbml0U2VjQnVmZmVyKCZvdXRidWZbMF0sIFNFQ0JVRkZFUl9TVFJFQU1fSEVBREVSLAotICAgICAgICAgICAgICAgIGRhdGEsIGNvbm5zc2wtPnN0cmVhbV9zaXplcy5jYkhlYWRlcik7CisgICAgICAgICAgICAgICAgZGF0YSwgQkFDS0VORC0+c3RyZWFtX3NpemVzLmNiSGVhZGVyKTsKICAgSW5pdFNlY0J1ZmZlcigmb3V0YnVmWzFdLCBTRUNCVUZGRVJfREFUQSwKLSAgICAgICAgICAgICAgICBkYXRhICsgY29ubnNzbC0+c3RyZWFtX3NpemVzLmNiSGVhZGVyLCBjdXJseF91enRvdWwobGVuKSk7CisgICAgICAgICAgICAgICAgZGF0YSArIEJBQ0tFTkQtPnN0cmVhbV9zaXplcy5jYkhlYWRlciwgY3VybHhfdXp0b3VsKGxlbikpOwogICBJbml0U2VjQnVmZmVyKCZvdXRidWZbMl0sIFNFQ0JVRkZFUl9TVFJFQU1fVFJBSUxFUiwKLSAgICAgICAgICAgICAgICBkYXRhICsgY29ubnNzbC0+c3RyZWFtX3NpemVzLmNiSGVhZGVyICsgbGVuLAotICAgICAgICAgICAgICAgIGNvbm5zc2wtPnN0cmVhbV9zaXplcy5jYlRyYWlsZXIpOworICAgICAgICAgICAgICAgIGRhdGEgKyBCQUNLRU5ELT5zdHJlYW1fc2l6ZXMuY2JIZWFkZXIgKyBsZW4sCisgICAgICAgICAgICAgICAgQkFDS0VORC0+c3RyZWFtX3NpemVzLmNiVHJhaWxlcik7CiAgIEluaXRTZWNCdWZmZXIoJm91dGJ1ZlszXSwgU0VDQlVGRkVSX0VNUFRZLCBOVUxMLCAwKTsKICAgSW5pdFNlY0J1ZmZlckRlc2MoJm91dGJ1Zl9kZXNjLCBvdXRidWYsIDQpOwogCkBAIC05OTIsNyArMTA3NCw3IEBACiAgIG1lbWNweShvdXRidWZbMV0ucHZCdWZmZXIsIGJ1ZiwgbGVuKTsKIAogICAvKiBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9hYTM3NTM5MC5hc3B4ICovCi0gIHNzcGlfc3RhdHVzID0gc19wU2VjRm4tPkVuY3J5cHRNZXNzYWdlKCZjb25uc3NsLT5jdHh0LT5jdHh0X2hhbmRsZSwgMCwKKyAgc3NwaV9zdGF0dXMgPSBzX3BTZWNGbi0+RW5jcnlwdE1lc3NhZ2UoJkJBQ0tFTkQtPmN0eHQtPmN0eHRfaGFuZGxlLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0YnVmX2Rlc2MsIDApOwogCiAgIC8qIGNoZWNrIGlmIHRoZSBtZXNzYWdlIHdhcyBlbmNyeXB0ZWQgKi8KQEAgLTExMDIsNyArMTE4NCw3IEBACiAgIHNpemVfdCBtaW5fZW5jZGF0YV9sZW5ndGggPSBsZW4gKyBDVVJMX1NDSEFOTkVMX0JVRkZFUl9GUkVFX1NJWkU7CiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogRG9uJ3QgcmV0dXJuIG9yIHNldCBjb25uc3NsLT5yZWN2X3VucmVjb3ZlcmFibGVfZXJyIHVubGVzcyBpbiB0aGUgY2xlYW51cC4KKyAgICogRG9uJ3QgcmV0dXJuIG9yIHNldCBCQUNLRU5ELT5yZWN2X3VucmVjb3ZlcmFibGVfZXJyIHVubGVzcyBpbiB0aGUgY2xlYW51cC4KICAgICogVGhlIHBhdHRlcm4gZm9yIHJldHVybiBlcnJvciBpcyBzZXQgKmVyciwgb3B0aW9uYWwgaW5mb2YsIGdvdG8gY2xlYW51cC4KICAgICoKICAgICogT3VyIHByaW9yaXR5IGlzIHRvIGFsd2F5cyByZXR1cm4gYXMgbXVjaCBkZWNyeXB0ZWQgZGF0YSB0byB0aGUgY2FsbGVyIGFzCkBAIC0xMTE0LDE2ICsxMTk2LDE2IEBACiAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogY2xpZW50IHdhbnRzIHRvIHJlYWQgJXp1IGJ5dGVzXG4iLCBsZW4pOwogICAqZXJyID0gQ1VSTEVfT0s7CiAKLSAgaWYobGVuICYmIGxlbiA8PSBjb25uc3NsLT5kZWNkYXRhX29mZnNldCkgeworICBpZihsZW4gJiYgbGVuIDw9IEJBQ0tFTkQtPmRlY2RhdGFfb2Zmc2V0KSB7CiAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBlbm91Z2ggZGVjcnlwdGVkIGRhdGEgaXMgYWxyZWFkeSBhdmFpbGFibGVcbiIpOwogICAgIGdvdG8gY2xlYW51cDsKICAgfQotICBlbHNlIGlmKGNvbm5zc2wtPnJlY3ZfdW5yZWNvdmVyYWJsZV9lcnIpIHsKLSAgICAqZXJyID0gY29ubnNzbC0+cmVjdl91bnJlY292ZXJhYmxlX2VycjsKKyAgZWxzZSBpZihCQUNLRU5ELT5yZWN2X3VucmVjb3ZlcmFibGVfZXJyKSB7CisgICAgKmVyciA9IEJBQ0tFTkQtPnJlY3ZfdW5yZWNvdmVyYWJsZV9lcnI7CiAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBhbiB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VycmVkIGluIGEgcHJpb3IgY2FsbFxuIik7CiAgICAgZ290byBjbGVhbnVwOwogICB9Ci0gIGVsc2UgaWYoY29ubnNzbC0+cmVjdl9zc3BpX2Nsb3NlX25vdGlmeSkgeworICBlbHNlIGlmKEJBQ0tFTkQtPnJlY3Zfc3NwaV9jbG9zZV9ub3RpZnkpIHsKICAgICAvKiBvbmNlIGEgc2VydmVyIGhhcyBpbmRpY2F0ZWQgc2h1dGRvd24gdGhlcmUgaXMgbm8gbW9yZSBlbmNyeXB0ZWQgZGF0YSAqLwogICAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogc2VydmVyIGluZGljYXRlZCBzaHV0ZG93biBpbiBhIHByaW9yIGNhbGxcbiIpOwogICAgIGdvdG8gY2xlYW51cDsKQEAgLTExMzUsMTcgKzEyMTcsMTcgQEAKICAgICAqLwogICAgIDsgLyogZG8gbm90aGluZyAqLwogICB9Ci0gIGVsc2UgaWYoIWNvbm5zc2wtPnJlY3ZfY29ubmVjdGlvbl9jbG9zZWQpIHsKKyAgZWxzZSBpZighQkFDS0VORC0+cmVjdl9jb25uZWN0aW9uX2Nsb3NlZCkgewogICAgIC8qIGluY3JlYXNlIGVuYyBidWZmZXIgaW4gb3JkZXIgdG8gZml0IHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEgKi8KLSAgICBzaXplID0gY29ubnNzbC0+ZW5jZGF0YV9sZW5ndGggLSBjb25uc3NsLT5lbmNkYXRhX29mZnNldDsKKyAgICBzaXplID0gQkFDS0VORC0+ZW5jZGF0YV9sZW5ndGggLSBCQUNLRU5ELT5lbmNkYXRhX29mZnNldDsKICAgICBpZihzaXplIDwgQ1VSTF9TQ0hBTk5FTF9CVUZGRVJfRlJFRV9TSVpFIHx8Ci0gICAgICAgY29ubnNzbC0+ZW5jZGF0YV9sZW5ndGggPCBtaW5fZW5jZGF0YV9sZW5ndGgpIHsKLSAgICAgIHJlYWxsb2NhdGVkX2xlbmd0aCA9IGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0ICsKKyAgICAgICBCQUNLRU5ELT5lbmNkYXRhX2xlbmd0aCA8IG1pbl9lbmNkYXRhX2xlbmd0aCkgeworICAgICAgcmVhbGxvY2F0ZWRfbGVuZ3RoID0gQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTF9TQ0hBTk5FTF9CVUZGRVJfRlJFRV9TSVpFOwogICAgICAgaWYocmVhbGxvY2F0ZWRfbGVuZ3RoIDwgbWluX2VuY2RhdGFfbGVuZ3RoKSB7CiAgICAgICAgIHJlYWxsb2NhdGVkX2xlbmd0aCA9IG1pbl9lbmNkYXRhX2xlbmd0aDsKICAgICAgIH0KLSAgICAgIHJlYWxsb2NhdGVkX2J1ZmZlciA9IHJlYWxsb2MoY29ubnNzbC0+ZW5jZGF0YV9idWZmZXIsCisgICAgICByZWFsbG9jYXRlZF9idWZmZXIgPSByZWFsbG9jKEJBQ0tFTkQtPmVuY2RhdGFfYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsbG9jYXRlZF9sZW5ndGgpOwogICAgICAgaWYocmVhbGxvY2F0ZWRfYnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgKmVyciA9IENVUkxFX09VVF9PRl9NRU1PUlk7CkBAIC0xMTUzLDIwICsxMjM1LDIwIEBACiAgICAgICAgIGdvdG8gY2xlYW51cDsKICAgICAgIH0KIAotICAgICAgY29ubnNzbC0+ZW5jZGF0YV9idWZmZXIgPSByZWFsbG9jYXRlZF9idWZmZXI7Ci0gICAgICBjb25uc3NsLT5lbmNkYXRhX2xlbmd0aCA9IHJlYWxsb2NhdGVkX2xlbmd0aDsKLSAgICAgIHNpemUgPSBjb25uc3NsLT5lbmNkYXRhX2xlbmd0aCAtIGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0OworICAgICAgQkFDS0VORC0+ZW5jZGF0YV9idWZmZXIgPSByZWFsbG9jYXRlZF9idWZmZXI7CisgICAgICBCQUNLRU5ELT5lbmNkYXRhX2xlbmd0aCA9IHJlYWxsb2NhdGVkX2xlbmd0aDsKKyAgICAgIHNpemUgPSBCQUNLRU5ELT5lbmNkYXRhX2xlbmd0aCAtIEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0OwogICAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBlbmNkYXRhX2J1ZmZlciByZXNpemVkICV6dVxuIiwKLSAgICAgICAgICAgIGNvbm5zc2wtPmVuY2RhdGFfbGVuZ3RoKTsKKyAgICAgICAgICAgIEJBQ0tFTkQtPmVuY2RhdGFfbGVuZ3RoKTsKICAgICB9CiAKICAgICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IGVuY3J5cHRlZCBkYXRhIGJ1ZmZlcjogb2Zmc2V0ICV6dSBsZW5ndGggJXp1XG4iLAotICAgICAgICAgIGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0LCBjb25uc3NsLT5lbmNkYXRhX2xlbmd0aCk7CisgICAgICAgICAgQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQsIEJBQ0tFTkQtPmVuY2RhdGFfbGVuZ3RoKTsKIAogICAgIC8qIHJlYWQgZW5jcnlwdGVkIGRhdGEgZnJvbSBzb2NrZXQgKi8KICAgICAqZXJyID0gQ3VybF9yZWFkX3BsYWluKGNvbm4tPnNvY2tbc29ja2luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopKGNvbm5zc2wtPmVuY2RhdGFfYnVmZmVyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopKEJBQ0tFTkQtPmVuY2RhdGFfYnVmZmVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsICZucmVhZCk7CiAgICAgaWYoKmVycikgewogICAgICAgbnJlYWQgPSAtMTsKQEAgLTExNzgsMjYgKzEyNjAsMjYgQEAKICAgICAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBDdXJsX3JlYWRfcGxhaW4gcmV0dXJuZWQgZXJyb3IgJWRcbiIsICplcnIpOwogICAgIH0KICAgICBlbHNlIGlmKG5yZWFkID09IDApIHsKLSAgICAgIGNvbm5zc2wtPnJlY3ZfY29ubmVjdGlvbl9jbG9zZWQgPSB0cnVlOworICAgICAgQkFDS0VORC0+cmVjdl9jb25uZWN0aW9uX2Nsb3NlZCA9IHRydWU7CiAgICAgICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb25cbiIpOwogICAgIH0KICAgICBlbHNlIGlmKG5yZWFkID4gMCkgewotICAgICAgY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQgKz0gKHNpemVfdClucmVhZDsKLSAgICAgIGNvbm5zc2wtPmVuY2RhdGFfaXNfaW5jb21wbGV0ZSA9IGZhbHNlOworICAgICAgQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQgKz0gKHNpemVfdClucmVhZDsKKyAgICAgIEJBQ0tFTkQtPmVuY2RhdGFfaXNfaW5jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBlbmNyeXB0ZWQgZGF0YSBnb3QgJXpkXG4iLCBucmVhZCk7CiAgICAgfQogICB9CiAKICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBlbmNyeXB0ZWQgZGF0YSBidWZmZXI6IG9mZnNldCAlenUgbGVuZ3RoICV6dVxuIiwKLSAgICAgICAgY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQsIGNvbm5zc2wtPmVuY2RhdGFfbGVuZ3RoKTsKKyAgICAgICAgQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQsIEJBQ0tFTkQtPmVuY2RhdGFfbGVuZ3RoKTsKIAogICAvKiBkZWNyeXB0IGxvb3AgKi8KLSAgd2hpbGUoY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQgPiAwICYmIHNzcGlfc3RhdHVzID09IFNFQ19FX09LICYmCi0gICAgICAgICghbGVuIHx8IGNvbm5zc2wtPmRlY2RhdGFfb2Zmc2V0IDwgbGVuIHx8Ci0gICAgICAgICBjb25uc3NsLT5yZWN2X2Nvbm5lY3Rpb25fY2xvc2VkKSkgeworICB3aGlsZShCQUNLRU5ELT5lbmNkYXRhX29mZnNldCA+IDAgJiYgc3NwaV9zdGF0dXMgPT0gU0VDX0VfT0sgJiYKKyAgICAgICAgKCFsZW4gfHwgQkFDS0VORC0+ZGVjZGF0YV9vZmZzZXQgPCBsZW4gfHwKKyAgICAgICAgIEJBQ0tFTkQtPnJlY3ZfY29ubmVjdGlvbl9jbG9zZWQpKSB7CiAgICAgLyogcHJlcGFyZSBkYXRhIGJ1ZmZlciBmb3IgRGVjcnlwdE1lc3NhZ2UgY2FsbCAqLwotICAgIEluaXRTZWNCdWZmZXIoJmluYnVmWzBdLCBTRUNCVUZGRVJfREFUQSwgY29ubnNzbC0+ZW5jZGF0YV9idWZmZXIsCi0gICAgICAgICAgICAgICAgICBjdXJseF91enRvdWwoY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQpKTsKKyAgICBJbml0U2VjQnVmZmVyKCZpbmJ1ZlswXSwgU0VDQlVGRkVSX0RBVEEsIEJBQ0tFTkQtPmVuY2RhdGFfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgY3VybHhfdXp0b3VsKEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0KSk7CiAKICAgICAvKiB3ZSBuZWVkIDMgbW9yZSBlbXB0eSBpbnB1dCBidWZmZXJzIGZvciBwb3NzaWJsZSBvdXRwdXQgKi8KICAgICBJbml0U2VjQnVmZmVyKCZpbmJ1ZlsxXSwgU0VDQlVGRkVSX0VNUFRZLCBOVUxMLCAwKTsKQEAgLTEyMDcsNyArMTI4OSw3IEBACiAKICAgICAvKiBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9hYTM3NTM0OC5hc3B4CiAgICAgICAgKi8KLSAgICBzc3BpX3N0YXR1cyA9IHNfcFNlY0ZuLT5EZWNyeXB0TWVzc2FnZSgmY29ubnNzbC0+Y3R4dC0+Y3R4dF9oYW5kbGUsCisgICAgc3NwaV9zdGF0dXMgPSBzX3BTZWNGbi0+RGVjcnlwdE1lc3NhZ2UoJkJBQ0tFTkQtPmN0eHQtPmN0eHRfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmJ1Zl9kZXNjLCAwLCBOVUxMKTsKIAogICAgIC8qIGNoZWNrIGlmIGV2ZXJ5dGhpbmcgd2VudCBmaW5lIChzZXJ2ZXIgbWF5IHdhbnQgdG8gcmVuZWdvdGlhdGUKQEAgLTEyMjMsMzYgKzEzMDUsMzYgQEAKICAgICAgICAgLyogaW5jcmVhc2UgYnVmZmVyIGluIG9yZGVyIHRvIGZpdCB0aGUgcmVjZWl2ZWQgYW1vdW50IG9mIGRhdGEgKi8KICAgICAgICAgc2l6ZSA9IGluYnVmWzFdLmNiQnVmZmVyID4gQ1VSTF9TQ0hBTk5FTF9CVUZGRVJfRlJFRV9TSVpFID8KICAgICAgICAgICAgICAgIGluYnVmWzFdLmNiQnVmZmVyIDogQ1VSTF9TQ0hBTk5FTF9CVUZGRVJfRlJFRV9TSVpFOwotICAgICAgICBpZihjb25uc3NsLT5kZWNkYXRhX2xlbmd0aCAtIGNvbm5zc2wtPmRlY2RhdGFfb2Zmc2V0IDwgc2l6ZSB8fAotICAgICAgICAgICBjb25uc3NsLT5kZWNkYXRhX2xlbmd0aCA8IGxlbikgeworICAgICAgICBpZihCQUNLRU5ELT5kZWNkYXRhX2xlbmd0aCAtIEJBQ0tFTkQtPmRlY2RhdGFfb2Zmc2V0IDwgc2l6ZSB8fAorICAgICAgICAgICBCQUNLRU5ELT5kZWNkYXRhX2xlbmd0aCA8IGxlbikgewogICAgICAgICAgIC8qIGluY3JlYXNlIGludGVybmFsIGRlY3J5cHRlZCBkYXRhIGJ1ZmZlciAqLwotICAgICAgICAgIHJlYWxsb2NhdGVkX2xlbmd0aCA9IGNvbm5zc2wtPmRlY2RhdGFfb2Zmc2V0ICsgc2l6ZTsKKyAgICAgICAgICByZWFsbG9jYXRlZF9sZW5ndGggPSBCQUNLRU5ELT5kZWNkYXRhX29mZnNldCArIHNpemU7CiAgICAgICAgICAgLyogbWFrZSBzdXJlIHRoYXQgdGhlIHJlcXVlc3RlZCBhbW91bnQgb2YgZGF0YSBmaXRzICovCiAgICAgICAgICAgaWYocmVhbGxvY2F0ZWRfbGVuZ3RoIDwgbGVuKSB7CiAgICAgICAgICAgICByZWFsbG9jYXRlZF9sZW5ndGggPSBsZW47CiAgICAgICAgICAgfQotICAgICAgICAgIHJlYWxsb2NhdGVkX2J1ZmZlciA9IHJlYWxsb2MoY29ubnNzbC0+ZGVjZGF0YV9idWZmZXIsCisgICAgICAgICAgcmVhbGxvY2F0ZWRfYnVmZmVyID0gcmVhbGxvYyhCQUNLRU5ELT5kZWNkYXRhX2J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxsb2NhdGVkX2xlbmd0aCk7CiAgICAgICAgICAgaWYocmVhbGxvY2F0ZWRfYnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgICAgICplcnIgPSBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICAgICAgICAgICAgZmFpbGYoZGF0YSwgInNjaGFubmVsOiB1bmFibGUgdG8gcmUtYWxsb2NhdGUgbWVtb3J5Iik7CiAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CiAgICAgICAgICAgfQotICAgICAgICAgIGNvbm5zc2wtPmRlY2RhdGFfYnVmZmVyID0gcmVhbGxvY2F0ZWRfYnVmZmVyOwotICAgICAgICAgIGNvbm5zc2wtPmRlY2RhdGFfbGVuZ3RoID0gcmVhbGxvY2F0ZWRfbGVuZ3RoOworICAgICAgICAgIEJBQ0tFTkQtPmRlY2RhdGFfYnVmZmVyID0gcmVhbGxvY2F0ZWRfYnVmZmVyOworICAgICAgICAgIEJBQ0tFTkQtPmRlY2RhdGFfbGVuZ3RoID0gcmVhbGxvY2F0ZWRfbGVuZ3RoOwogICAgICAgICB9CiAKICAgICAgICAgLyogY29weSBkZWNyeXB0ZWQgZGF0YSB0byBpbnRlcm5hbCBidWZmZXIgKi8KICAgICAgICAgc2l6ZSA9IGluYnVmWzFdLmNiQnVmZmVyOwogICAgICAgICBpZihzaXplKSB7Ci0gICAgICAgICAgbWVtY3B5KGNvbm5zc2wtPmRlY2RhdGFfYnVmZmVyICsgY29ubnNzbC0+ZGVjZGF0YV9vZmZzZXQsCisgICAgICAgICAgbWVtY3B5KEJBQ0tFTkQtPmRlY2RhdGFfYnVmZmVyICsgQkFDS0VORC0+ZGVjZGF0YV9vZmZzZXQsCiAgICAgICAgICAgICAgICAgIGluYnVmWzFdLnB2QnVmZmVyLCBzaXplKTsKLSAgICAgICAgICBjb25uc3NsLT5kZWNkYXRhX29mZnNldCArPSBzaXplOworICAgICAgICAgIEJBQ0tFTkQtPmRlY2RhdGFfb2Zmc2V0ICs9IHNpemU7CiAgICAgICAgIH0KIAogICAgICAgICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IGRlY3J5cHRlZCBkYXRhIGFkZGVkOiAlenVcbiIsIHNpemUpOwogICAgICAgICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IGRlY3J5cHRlZCBkYXRhIGNhY2hlZDogb2Zmc2V0ICV6dSBsZW5ndGggJXp1XG4iLAotICAgICAgICAgICAgICBjb25uc3NsLT5kZWNkYXRhX29mZnNldCwgY29ubnNzbC0+ZGVjZGF0YV9sZW5ndGgpOworICAgICAgICAgICAgICBCQUNLRU5ELT5kZWNkYXRhX29mZnNldCwgQkFDS0VORC0+ZGVjZGF0YV9sZW5ndGgpOwogICAgICAgfQogCiAgICAgICAvKiBjaGVjayBmb3IgcmVtYWluaW5nIGVuY3J5cHRlZCBkYXRhICovCkBAIC0xMjYzLDIxICsxMzQ1LDIxIEBACiAgICAgICAgIC8qIGNoZWNrIGlmIHRoZSByZW1haW5pbmcgZGF0YSBpcyBsZXNzIHRoYW4gdGhlIHRvdGFsIGFtb3VudAogICAgICAgICAgKiBhbmQgdGhlcmVmb3JlIGJlZ2lucyBhZnRlciB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgZGF0YQogICAgICAgICAgKi8KLSAgICAgICAgaWYoY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQgPiBpbmJ1ZlszXS5jYkJ1ZmZlcikgeworICAgICAgICBpZihCQUNLRU5ELT5lbmNkYXRhX29mZnNldCA+IGluYnVmWzNdLmNiQnVmZmVyKSB7CiAgICAgICAgICAgLyogbW92ZSByZW1haW5pbmcgZW5jcnlwdGVkIGRhdGEgZm9yd2FyZCB0byB0aGUgYmVnaW5uaW5nIG9mCiAgICAgICAgICAgICAgYnVmZmVyICovCi0gICAgICAgICAgbWVtbW92ZShjb25uc3NsLT5lbmNkYXRhX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgIChjb25uc3NsLT5lbmNkYXRhX2J1ZmZlciArIGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0KSAtCisgICAgICAgICAgbWVtbW92ZShCQUNLRU5ELT5lbmNkYXRhX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgIChCQUNLRU5ELT5lbmNkYXRhX2J1ZmZlciArIEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0KSAtCiAgICAgICAgICAgICAgICAgICBpbmJ1ZlszXS5jYkJ1ZmZlciwgaW5idWZbM10uY2JCdWZmZXIpOwotICAgICAgICAgIGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0ID0gaW5idWZbM10uY2JCdWZmZXI7CisgICAgICAgICAgQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQgPSBpbmJ1ZlszXS5jYkJ1ZmZlcjsKICAgICAgICAgfQogCiAgICAgICAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogZW5jcnlwdGVkIGRhdGEgY2FjaGVkOiBvZmZzZXQgJXp1IGxlbmd0aCAlenVcbiIsCi0gICAgICAgICAgICAgIGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0LCBjb25uc3NsLT5lbmNkYXRhX2xlbmd0aCk7CisgICAgICAgICAgICAgIEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0LCBCQUNLRU5ELT5lbmNkYXRhX2xlbmd0aCk7CiAgICAgICB9CiAgICAgICBlbHNlIHsKICAgICAgICAgLyogcmVzZXQgZW5jcnlwdGVkIGJ1ZmZlciBvZmZzZXQsIGJlY2F1c2UgdGhlcmUgaXMgbm8gZGF0YSByZW1haW5pbmcgKi8KLSAgICAgICAgY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQgPSAwOworICAgICAgICBCQUNLRU5ELT5lbmNkYXRhX29mZnNldCA9IDA7CiAgICAgICB9CiAKICAgICAgIC8qIGNoZWNrIGlmIHNlcnZlciB3YW50cyB0byByZW5lZ290aWF0ZSB0aGUgY29ubmVjdGlvbiBjb250ZXh0ICovCkBAIC0xMjg3LDcgKzEzNjksNyBAQAogICAgICAgICAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogY2FuJ3QgcmVub2dvdGlhdGUsIGFuIGVycm9yIGlzIHBlbmRpbmdcbiIpOwogICAgICAgICAgIGdvdG8gY2xlYW51cDsKICAgICAgICAgfQotICAgICAgICBpZihjb25uc3NsLT5lbmNkYXRhX29mZnNldCkgeworICAgICAgICBpZihCQUNLRU5ELT5lbmNkYXRhX29mZnNldCkgewogICAgICAgICAgICplcnIgPSBDVVJMRV9SRUNWX0VSUk9SOwogICAgICAgICAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogY2FuJ3QgcmVub2dvdGlhdGUsICIKICAgICAgICAgICAgICAgICAgICAgICAiZW5jcnlwdGVkIGRhdGEgYXZhaWxhYmxlXG4iKTsKQEAgLTEzMTEsMTYgKzEzOTMsMTYgQEAKICAgICAgIGVsc2UgaWYoc3NwaV9zdGF0dXMgPT0gU0VDX0lfQ09OVEVYVF9FWFBJUkVEKSB7CiAgICAgICAgIC8qIEluIFdpbmRvd3MgMjAwMCBTRUNfSV9DT05URVhUX0VYUElSRUQgKGNsb3NlX25vdGlmeSkgaXMgbm90CiAgICAgICAgICAgIHJldHVybmVkIHNvIHdlIGhhdmUgdG8gd29yayBhcm91bmQgdGhhdCBpbiBjbGVhbnVwLiAqLwotICAgICAgICBjb25uc3NsLT5yZWN2X3NzcGlfY2xvc2Vfbm90aWZ5ID0gdHJ1ZTsKLSAgICAgICAgaWYoIWNvbm5zc2wtPnJlY3ZfY29ubmVjdGlvbl9jbG9zZWQpIHsKLSAgICAgICAgICBjb25uc3NsLT5yZWN2X2Nvbm5lY3Rpb25fY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgQkFDS0VORC0+cmVjdl9zc3BpX2Nsb3NlX25vdGlmeSA9IHRydWU7CisgICAgICAgIGlmKCFCQUNLRU5ELT5yZWN2X2Nvbm5lY3Rpb25fY2xvc2VkKSB7CisgICAgICAgICAgQkFDS0VORC0+cmVjdl9jb25uZWN0aW9uX2Nsb3NlZCA9IHRydWU7CiAgICAgICAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uXG4iKTsKICAgICAgICAgfQogICAgICAgICBnb3RvIGNsZWFudXA7CiAgICAgICB9CiAgICAgfQogICAgIGVsc2UgaWYoc3NwaV9zdGF0dXMgPT0gU0VDX0VfSU5DT01QTEVURV9NRVNTQUdFKSB7Ci0gICAgICBjb25uc3NsLT5lbmNkYXRhX2lzX2luY29tcGxldGUgPSB0cnVlOworICAgICAgQkFDS0VORC0+ZW5jZGF0YV9pc19pbmNvbXBsZXRlID0gdHJ1ZTsKICAgICAgIGlmKCEqZXJyKQogICAgICAgICAqZXJyID0gQ1VSTEVfQUdBSU47CiAgICAgICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IGZhaWxlZCB0byBkZWNyeXB0IGRhdGEsIG5lZWQgbW9yZSBkYXRhXG4iKTsKQEAgLTEzMzUsMTAgKzE0MTcsMTAgQEAKICAgfQogCiAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogZW5jcnlwdGVkIGRhdGEgYnVmZmVyOiBvZmZzZXQgJXp1IGxlbmd0aCAlenVcbiIsCi0gICAgICAgIGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0LCBjb25uc3NsLT5lbmNkYXRhX2xlbmd0aCk7CisgICAgICAgIEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0LCBCQUNLRU5ELT5lbmNkYXRhX2xlbmd0aCk7CiAKICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBkZWNyeXB0ZWQgZGF0YSBidWZmZXI6IG9mZnNldCAlenUgbGVuZ3RoICV6dVxuIiwKLSAgICAgICAgY29ubnNzbC0+ZGVjZGF0YV9vZmZzZXQsIGNvbm5zc2wtPmRlY2RhdGFfbGVuZ3RoKTsKKyAgICAgICAgQkFDS0VORC0+ZGVjZGF0YV9vZmZzZXQsIEJBQ0tFTkQtPmRlY2RhdGFfbGVuZ3RoKTsKIAogY2xlYW51cDoKICAgLyogV2FybmluZy0gdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoZSBlbmNkYXRhIHN0YXRlIGlzIHZhbGlkIGF0IHRoaXMgcG9pbnQgKi8KQEAgLTEzNTIsMTMgKzE0MzQsMTMgQEAKICAgcmV0dXJuIGNsb3NlX25vdGlmeS4gSW4gdGhhdCBjYXNlIGlmIHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgd2UgYXNzdW1lIGl0CiAgIHdhcyBncmFjZWZ1bCAoY2xvc2Vfbm90aWZ5KSBzaW5jZSB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSB3YXkgdG8gdGVsbC4KICAgKi8KLSAgaWYobGVuICYmICFjb25uc3NsLT5kZWNkYXRhX29mZnNldCAmJiBjb25uc3NsLT5yZWN2X2Nvbm5lY3Rpb25fY2xvc2VkICYmCi0gICAgICFjb25uc3NsLT5yZWN2X3NzcGlfY2xvc2Vfbm90aWZ5KSB7CisgIGlmKGxlbiAmJiAhQkFDS0VORC0+ZGVjZGF0YV9vZmZzZXQgJiYgQkFDS0VORC0+cmVjdl9jb25uZWN0aW9uX2Nsb3NlZCAmJgorICAgICAhQkFDS0VORC0+cmVjdl9zc3BpX2Nsb3NlX25vdGlmeSkgewogICAgIGJvb2wgaXNXaW4yayA9IEN1cmxfdmVyaWZ5X3dpbmRvd3NfdmVyc2lvbig1LCAwLCBQTEFURk9STV9XSU5OVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSU0lPTl9FUVVBTCk7CiAKICAgICBpZihpc1dpbjJrICYmIHNzcGlfc3RhdHVzID09IFNFQ19FX09LKQotICAgICAgY29ubnNzbC0+cmVjdl9zc3BpX2Nsb3NlX25vdGlmeSA9IHRydWU7CisgICAgICBCQUNLRU5ELT5yZWN2X3NzcGlfY2xvc2Vfbm90aWZ5ID0gdHJ1ZTsKICAgICBlbHNlIHsKICAgICAgICplcnIgPSBDVVJMRV9SRUNWX0VSUk9SOwogICAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBzZXJ2ZXIgY2xvc2VkIGFicnVwdGx5IChtaXNzaW5nIGNsb3NlX25vdGlmeSlcbiIpOwpAQCAtMTM2NywyMyArMTQ0OSwyMyBAQAogCiAgIC8qIEFueSBlcnJvciBvdGhlciB0aGFuIENVUkxFX0FHQUlOIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuICovCiAgIGlmKCplcnIgJiYgKmVyciAhPSBDVVJMRV9BR0FJTikKLSAgICAgIGNvbm5zc2wtPnJlY3ZfdW5yZWNvdmVyYWJsZV9lcnIgPSAqZXJyOworICAgICAgQkFDS0VORC0+cmVjdl91bnJlY292ZXJhYmxlX2VyciA9ICplcnI7CiAKLSAgc2l6ZSA9IGxlbiA8IGNvbm5zc2wtPmRlY2RhdGFfb2Zmc2V0ID8gbGVuIDogY29ubnNzbC0+ZGVjZGF0YV9vZmZzZXQ7CisgIHNpemUgPSBsZW4gPCBCQUNLRU5ELT5kZWNkYXRhX29mZnNldCA/IGxlbiA6IEJBQ0tFTkQtPmRlY2RhdGFfb2Zmc2V0OwogICBpZihzaXplKSB7Ci0gICAgbWVtY3B5KGJ1ZiwgY29ubnNzbC0+ZGVjZGF0YV9idWZmZXIsIHNpemUpOwotICAgIG1lbW1vdmUoY29ubnNzbC0+ZGVjZGF0YV9idWZmZXIsIGNvbm5zc2wtPmRlY2RhdGFfYnVmZmVyICsgc2l6ZSwKLSAgICAgICAgICAgIGNvbm5zc2wtPmRlY2RhdGFfb2Zmc2V0IC0gc2l6ZSk7Ci0gICAgY29ubnNzbC0+ZGVjZGF0YV9vZmZzZXQgLT0gc2l6ZTsKKyAgICBtZW1jcHkoYnVmLCBCQUNLRU5ELT5kZWNkYXRhX2J1ZmZlciwgc2l6ZSk7CisgICAgbWVtbW92ZShCQUNLRU5ELT5kZWNkYXRhX2J1ZmZlciwgQkFDS0VORC0+ZGVjZGF0YV9idWZmZXIgKyBzaXplLAorICAgICAgICAgICAgQkFDS0VORC0+ZGVjZGF0YV9vZmZzZXQgLSBzaXplKTsKKyAgICBCQUNLRU5ELT5kZWNkYXRhX29mZnNldCAtPSBzaXplOwogCiAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBkZWNyeXB0ZWQgZGF0YSByZXR1cm5lZCAlenVcbiIsIHNpemUpOwogICAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogZGVjcnlwdGVkIGRhdGEgYnVmZmVyOiBvZmZzZXQgJXp1IGxlbmd0aCAlenVcbiIsCi0gICAgICAgICAgY29ubnNzbC0+ZGVjZGF0YV9vZmZzZXQsIGNvbm5zc2wtPmRlY2RhdGFfbGVuZ3RoKTsKKyAgICAgICAgICBCQUNLRU5ELT5kZWNkYXRhX29mZnNldCwgQkFDS0VORC0+ZGVjZGF0YV9sZW5ndGgpOwogICAgICplcnIgPSBDVVJMRV9PSzsKICAgICByZXR1cm4gKHNzaXplX3Qpc2l6ZTsKICAgfQogCi0gIGlmKCEqZXJyICYmICFjb25uc3NsLT5yZWN2X2Nvbm5lY3Rpb25fY2xvc2VkKQorICBpZighKmVyciAmJiAhQkFDS0VORC0+cmVjdl9jb25uZWN0aW9uX2Nsb3NlZCkKICAgICAgICplcnIgPSBDVVJMRV9BR0FJTjsKIAogICAvKiBJdCdzIGRlYmF0YWJsZSB3aGF0IHRvIHJldHVybiB3aGVuICFsZW4uIFdlIGNvdWxkIHJldHVybiB3aGF0ZXZlciBlcnJvciB3ZQpAQCAtMTM5NSwxNSArMTQ3NywxMyBAQAogICByZXR1cm4gKmVyciA/IC0xIDogMDsKIH0KIAotQ1VSTGNvZGUKLUN1cmxfc2NoYW5uZWxfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqZG9uZSkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX3NjaGFubmVsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LCBib29sICpkb25lKQogewogICByZXR1cm4gc2NoYW5uZWxfY29ubmVjdF9jb21tb24oY29ubiwgc29ja2luZGV4LCBUUlVFLCBkb25lKTsKIH0KIAotQ1VSTGNvZGUKLUN1cmxfc2NoYW5uZWxfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9zY2hhbm5lbF9jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKICAgQ1VSTGNvZGUgcmVzdWx0OwogICBib29sIGRvbmUgPSBGQUxTRTsKQEAgLTE0MTcsMjUgKzE0OTcsMzggQEAKICAgcmV0dXJuIENVUkxFX09LOwogfQogCi1ib29sIEN1cmxfc2NoYW5uZWxfZGF0YV9wZW5kaW5nKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKK3N0YXRpYyBib29sIEN1cmxfc2NoYW5uZWxfZGF0YV9wZW5kaW5nKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgpCiB7CiAgIGNvbnN0IHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwogCiAgIGlmKGNvbm5zc2wtPnVzZSkgLyogU1NML1RMUyBpcyBpbiB1c2UgKi8KLSAgICByZXR1cm4gKGNvbm5zc2wtPmRlY2RhdGFfb2Zmc2V0ID4gMCB8fAotICAgICAgICAgICAgKGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0ID4gMCAmJiAhY29ubnNzbC0+ZW5jZGF0YV9pc19pbmNvbXBsZXRlKSk7CisgICAgcmV0dXJuIChCQUNLRU5ELT5kZWNkYXRhX29mZnNldCA+IDAgfHwKKyAgICAgICAgICAgIChCQUNLRU5ELT5lbmNkYXRhX29mZnNldCA+IDAgJiYgIUJBQ0tFTkQtPmVuY2RhdGFfaXNfaW5jb21wbGV0ZSkpOwogICBlbHNlCiAgICAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIEN1cmxfc2NoYW5uZWxfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQorc3RhdGljIHZvaWQgQ3VybF9zY2hhbm5lbF9jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CiAgIGlmKGNvbm4tPnNzbFtzb2NraW5kZXhdLnVzZSkKICAgICAvKiBpZiB0aGUgU1NML1RMUyBjaGFubmVsIGhhc24ndCBiZWVuIHNodXQgZG93biB5ZXQsIGRvIHRoYXQgbm93LiAqLwogICAgIEN1cmxfc3NsX3NodXRkb3duKGNvbm4sIHNvY2tpbmRleCk7CiB9CiAKLWludCBDdXJsX3NjaGFubmVsX3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKK3N0YXRpYyB2b2lkIEN1cmxfc2NoYW5uZWxfc2Vzc2lvbl9mcmVlKHZvaWQgKnB0cikKK3sKKyAgLyogdGhpcyBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQgdW5kZXIgc2Vzc2lvbmlkIGxvY2sgKi8KKyAgc3RydWN0IGN1cmxfc2NoYW5uZWxfY3JlZCAqY3JlZCA9IHB0cjsKKworICBjcmVkLT5yZWZjb3VudC0tOworICBpZihjcmVkLT5yZWZjb3VudCA9PSAwKSB7CisgICAgc19wU2VjRm4tPkZyZWVDcmVkZW50aWFsc0hhbmRsZSgmY3JlZC0+Y3JlZF9oYW5kbGUpOworICAgIEN1cmxfc2FmZWZyZWUoY3JlZCk7CisgIH0KK30KKworc3RhdGljIGludCBDdXJsX3NjaGFubmVsX3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKICAgLyogU2VlIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL2FhMzgwMTM4LmFzcHgKICAgICogU2h1dHRpbmcgRG93biBhbiBTY2hhbm5lbCBDb25uZWN0aW9uCkBAIC0xNDQ4LDcgKzE1NDEsNyBAQAogICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IHNodXR0aW5nIGRvd24gU1NML1RMUyBjb25uZWN0aW9uIHdpdGggJXMgcG9ydCAlaHVcbiIsCiAgICAgICAgIGhvc3RuYW1lLCBjb25uLT5yZW1vdGVfcG9ydCk7CiAKLSAgaWYoY29ubnNzbC0+Y3JlZCAmJiBjb25uc3NsLT5jdHh0KSB7CisgIGlmKEJBQ0tFTkQtPmNyZWQgJiYgQkFDS0VORC0+Y3R4dCkgewogICAgIFNlY0J1ZmZlckRlc2MgQnVmZkRlc2M7CiAgICAgU2VjQnVmZmVyIEJ1ZmZlcjsKICAgICBTRUNVUklUWV9TVEFUVVMgc3NwaV9zdGF0dXM7CkBAIC0xNDYxLDcgKzE1NTQsNyBAQAogICAgIEluaXRTZWNCdWZmZXIoJkJ1ZmZlciwgU0VDQlVGRkVSX1RPS0VOLCAmZHdzaHV0LCBzaXplb2YoZHdzaHV0KSk7CiAgICAgSW5pdFNlY0J1ZmZlckRlc2MoJkJ1ZmZEZXNjLCAmQnVmZmVyLCAxKTsKIAotICAgIHNzcGlfc3RhdHVzID0gc19wU2VjRm4tPkFwcGx5Q29udHJvbFRva2VuKCZjb25uc3NsLT5jdHh0LT5jdHh0X2hhbmRsZSwKKyAgICBzc3BpX3N0YXR1cyA9IHNfcFNlY0ZuLT5BcHBseUNvbnRyb2xUb2tlbigmQkFDS0VORC0+Y3R4dC0+Y3R4dF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJ1ZmZEZXNjKTsKIAogICAgIGlmKHNzcGlfc3RhdHVzICE9IFNFQ19FX09LKQpAQCAtMTQ3NywxOCArMTU3MCwxOCBAQAogICAgIEluaXRTZWNCdWZmZXJEZXNjKCZvdXRidWZfZGVzYywgJm91dGJ1ZiwgMSk7CiAKICAgICBzc3BpX3N0YXR1cyA9IHNfcFNlY0ZuLT5Jbml0aWFsaXplU2VjdXJpdHlDb250ZXh0KAotICAgICAgJmNvbm5zc2wtPmNyZWQtPmNyZWRfaGFuZGxlLAotICAgICAgJmNvbm5zc2wtPmN0eHQtPmN0eHRfaGFuZGxlLAorICAgICAgJkJBQ0tFTkQtPmNyZWQtPmNyZWRfaGFuZGxlLAorICAgICAgJkJBQ0tFTkQtPmN0eHQtPmN0eHRfaGFuZGxlLAogICAgICAgaG9zdF9uYW1lLAotICAgICAgY29ubnNzbC0+cmVxX2ZsYWdzLAorICAgICAgQkFDS0VORC0+cmVxX2ZsYWdzLAogICAgICAgMCwKICAgICAgIDAsCiAgICAgICBOVUxMLAogICAgICAgMCwKLSAgICAgICZjb25uc3NsLT5jdHh0LT5jdHh0X2hhbmRsZSwKKyAgICAgICZCQUNLRU5ELT5jdHh0LT5jdHh0X2hhbmRsZSwKICAgICAgICZvdXRidWZfZGVzYywKLSAgICAgICZjb25uc3NsLT5yZXRfZmxhZ3MsCi0gICAgICAmY29ubnNzbC0+Y3R4dC0+dGltZV9zdGFtcCk7CisgICAgICAmQkFDS0VORC0+cmV0X2ZsYWdzLAorICAgICAgJkJBQ0tFTkQtPmN0eHQtPnRpbWVfc3RhbXApOwogCiAgICAgQ3VybF91bmljb2RlZnJlZShob3N0X25hbWUpOwogCkBAIC0xNTA3LDcxICsxNjAwLDYyIEBACiAgIH0KIAogICAvKiBmcmVlIFNTUEkgU2NoYW5uZWwgQVBJIHNlY3VyaXR5IGNvbnRleHQgaGFuZGxlICovCi0gIGlmKGNvbm5zc2wtPmN0eHQpIHsKKyAgaWYoQkFDS0VORC0+Y3R4dCkgewogICAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogY2xlYXIgc2VjdXJpdHkgY29udGV4dCBoYW5kbGVcbiIpOwotICAgIHNfcFNlY0ZuLT5EZWxldGVTZWN1cml0eUNvbnRleHQoJmNvbm5zc2wtPmN0eHQtPmN0eHRfaGFuZGxlKTsKLSAgICBDdXJsX3NhZmVmcmVlKGNvbm5zc2wtPmN0eHQpOworICAgIHNfcFNlY0ZuLT5EZWxldGVTZWN1cml0eUNvbnRleHQoJkJBQ0tFTkQtPmN0eHQtPmN0eHRfaGFuZGxlKTsKKyAgICBDdXJsX3NhZmVmcmVlKEJBQ0tFTkQtPmN0eHQpOwogICB9CiAKICAgLyogZnJlZSBTU1BJIFNjaGFubmVsIEFQSSBjcmVkZW50aWFsIGhhbmRsZSAqLwotICBpZihjb25uc3NsLT5jcmVkKSB7CisgIGlmKEJBQ0tFTkQtPmNyZWQpIHsKICAgICBDdXJsX3NzbF9zZXNzaW9uaWRfbG9jayhjb25uKTsKLSAgICBDdXJsX3NjaGFubmVsX3Nlc3Npb25fZnJlZShjb25uc3NsLT5jcmVkKTsKKyAgICBDdXJsX3NjaGFubmVsX3Nlc3Npb25fZnJlZShCQUNLRU5ELT5jcmVkKTsKICAgICBDdXJsX3NzbF9zZXNzaW9uaWRfdW5sb2NrKGNvbm4pOwotICAgIGNvbm5zc2wtPmNyZWQgPSBOVUxMOworICAgIEJBQ0tFTkQtPmNyZWQgPSBOVUxMOwogICB9CiAKICAgLyogZnJlZSBpbnRlcm5hbCBidWZmZXIgZm9yIHJlY2VpdmVkIGVuY3J5cHRlZCBkYXRhICovCi0gIGlmKGNvbm5zc2wtPmVuY2RhdGFfYnVmZmVyICE9IE5VTEwpIHsKLSAgICBDdXJsX3NhZmVmcmVlKGNvbm5zc2wtPmVuY2RhdGFfYnVmZmVyKTsKLSAgICBjb25uc3NsLT5lbmNkYXRhX2xlbmd0aCA9IDA7Ci0gICAgY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQgPSAwOwotICAgIGNvbm5zc2wtPmVuY2RhdGFfaXNfaW5jb21wbGV0ZSA9IGZhbHNlOworICBpZihCQUNLRU5ELT5lbmNkYXRhX2J1ZmZlciAhPSBOVUxMKSB7CisgICAgQ3VybF9zYWZlZnJlZShCQUNLRU5ELT5lbmNkYXRhX2J1ZmZlcik7CisgICAgQkFDS0VORC0+ZW5jZGF0YV9sZW5ndGggPSAwOworICAgIEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0ID0gMDsKKyAgICBCQUNLRU5ELT5lbmNkYXRhX2lzX2luY29tcGxldGUgPSBmYWxzZTsKICAgfQogCiAgIC8qIGZyZWUgaW50ZXJuYWwgYnVmZmVyIGZvciByZWNlaXZlZCBkZWNyeXB0ZWQgZGF0YSAqLwotICBpZihjb25uc3NsLT5kZWNkYXRhX2J1ZmZlciAhPSBOVUxMKSB7Ci0gICAgQ3VybF9zYWZlZnJlZShjb25uc3NsLT5kZWNkYXRhX2J1ZmZlcik7Ci0gICAgY29ubnNzbC0+ZGVjZGF0YV9sZW5ndGggPSAwOwotICAgIGNvbm5zc2wtPmRlY2RhdGFfb2Zmc2V0ID0gMDsKKyAgaWYoQkFDS0VORC0+ZGVjZGF0YV9idWZmZXIgIT0gTlVMTCkgeworICAgIEN1cmxfc2FmZWZyZWUoQkFDS0VORC0+ZGVjZGF0YV9idWZmZXIpOworICAgIEJBQ0tFTkQtPmRlY2RhdGFfbGVuZ3RoID0gMDsKKyAgICBCQUNLRU5ELT5kZWNkYXRhX29mZnNldCA9IDA7CiAgIH0KIAogICByZXR1cm4gQ1VSTEVfT0s7CiB9CiAKLXZvaWQgQ3VybF9zY2hhbm5lbF9zZXNzaW9uX2ZyZWUodm9pZCAqcHRyKQotewotICAvKiB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCB1bmRlciBzZXNzaW9uaWQgbG9jayAqLwotICBzdHJ1Y3QgY3VybF9zY2hhbm5lbF9jcmVkICpjcmVkID0gcHRyOwotCi0gIGNyZWQtPnJlZmNvdW50LS07Ci0gIGlmKGNyZWQtPnJlZmNvdW50ID09IDApIHsKLSAgICBzX3BTZWNGbi0+RnJlZUNyZWRlbnRpYWxzSGFuZGxlKCZjcmVkLT5jcmVkX2hhbmRsZSk7Ci0gICAgQ3VybF9zYWZlZnJlZShjcmVkKTsKLSAgfQotfQotCi1pbnQgQ3VybF9zY2hhbm5lbF9pbml0KHZvaWQpCitzdGF0aWMgaW50IEN1cmxfc2NoYW5uZWxfaW5pdCh2b2lkKQogewogICByZXR1cm4gKEN1cmxfc3NwaV9nbG9iYWxfaW5pdCgpID09IENVUkxFX09LID8gMSA6IDApOwogfQogCi12b2lkIEN1cmxfc2NoYW5uZWxfY2xlYW51cCh2b2lkKQorc3RhdGljIHZvaWQgQ3VybF9zY2hhbm5lbF9jbGVhbnVwKHZvaWQpCiB7CiAgIEN1cmxfc3NwaV9nbG9iYWxfY2xlYW51cCgpOwogfQogCi1zaXplX3QgQ3VybF9zY2hhbm5lbF92ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCitzdGF0aWMgc2l6ZV90IEN1cmxfc2NoYW5uZWxfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQogewogICBzaXplID0gc25wcmludGYoYnVmZmVyLCBzaXplLCAiV2luU1NMIik7CiAKICAgcmV0dXJuIHNpemU7CiB9CiAKLUNVUkxjb2RlIEN1cmxfc2NoYW5uZWxfcmFuZG9tKHVuc2lnbmVkIGNoYXIgKmVudHJvcHksIHNpemVfdCBsZW5ndGgpCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9zY2hhbm5lbF9yYW5kb20oc3RydWN0IEN1cmxfZWFzeSAqZGF0YSBVTlVTRURfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW50cm9weSwgc2l6ZV90IGxlbmd0aCkKIHsKICAgSENSWVBUUFJPViBoQ3J5cHRQcm92ID0gMDsKIAorICAodm9pZClkYXRhOworCiAgIGlmKCFDcnlwdEFjcXVpcmVDb250ZXh0KCZoQ3J5cHRQcm92LCBOVUxMLCBOVUxMLCBQUk9WX1JTQV9GVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVF9WRVJJRllDT05URVhUIHwgQ1JZUFRfU0lMRU5UKSkKICAgICByZXR1cm4gQ1VSTEVfRkFJTEVEX0lOSVQ7CkBAIC0xNTk4LDcgKzE2ODIsNyBAQAogICAgIGNvbm4tPmh0dHBfcHJveHkuaG9zdC5uYW1lIDoKICAgICBjb25uLT5ob3N0Lm5hbWU7CiAKLSAgc3RhdHVzID0gc19wU2VjRm4tPlF1ZXJ5Q29udGV4dEF0dHJpYnV0ZXMoJmNvbm5zc2wtPmN0eHQtPmN0eHRfaGFuZGxlLAorICBzdGF0dXMgPSBzX3BTZWNGbi0+UXVlcnlDb250ZXh0QXR0cmlidXRlcygmQkFDS0VORC0+Y3R4dC0+Y3R4dF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1BLR19BVFRSX1JFTU9URV9DRVJUX0NPTlRFWFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ2VydENvbnRleHRTZXJ2ZXIpOwogCkBAIC0xNzI1LDQgKzE4MDksNDQgQEAKIH0KICNlbmRpZiAvKiBfV0lOMzJfV0NFICovCiAKK3N0YXRpYyB2b2lkICpDdXJsX3NjaGFubmVsX2dldF9pbnRlcm5hbHMoc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxJTkZPIGluZm8gVU5VU0VEX1BBUkFNKQoreworICAodm9pZClpbmZvOworICByZXR1cm4gJkJBQ0tFTkQtPmN0eHQtPmN0eHRfaGFuZGxlOworfQorCitjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgQ3VybF9zc2xfc2NoYW5uZWwgPSB7CisgIHsgQ1VSTFNTTEJBQ0tFTkRfU0NIQU5ORUwsICJzY2hhbm5lbCIgfSwgLyogaW5mbyAqLworCisgIDAsIC8qIGhhdmVfY2FfcGF0aCAqLworICAxLCAvKiBoYXZlX2NlcnRpbmZvICovCisgIDAsIC8qIGhhdmVfcGlubmVkcHVia2V5ICovCisgIDAsIC8qIGhhdmVfc3NsX2N0eCAqLworICAwLCAvKiBzdXBwb3J0X2h0dHBzX3Byb3h5ICovCisKKyAgc2l6ZW9mKHN0cnVjdCBzc2xfYmFja2VuZF9kYXRhKSwKKworICBDdXJsX3NjaGFubmVsX2luaXQsICAgICAgICAgICAgICAgIC8qIGluaXQgKi8KKyAgQ3VybF9zY2hhbm5lbF9jbGVhbnVwLCAgICAgICAgICAgICAvKiBjbGVhbnVwICovCisgIEN1cmxfc2NoYW5uZWxfdmVyc2lvbiwgICAgICAgICAgICAgLyogdmVyc2lvbiAqLworICBDdXJsX25vbmVfY2hlY2tfY3huLCAgICAgICAgICAgICAgIC8qIGNoZWNrX2N4biAqLworICBDdXJsX3NjaGFubmVsX3NodXRkb3duLCAgICAgICAgICAgIC8qIHNodXRkb3duICovCisgIEN1cmxfc2NoYW5uZWxfZGF0YV9wZW5kaW5nLCAgICAgICAgLyogZGF0YV9wZW5kaW5nICovCisgIEN1cmxfc2NoYW5uZWxfcmFuZG9tLCAgICAgICAgICAgICAgLyogcmFuZG9tICovCisgIEN1cmxfbm9uZV9jZXJ0X3N0YXR1c19yZXF1ZXN0LCAgICAgLyogY2VydF9zdGF0dXNfcmVxdWVzdCAqLworICBDdXJsX3NjaGFubmVsX2Nvbm5lY3QsICAgICAgICAgICAgIC8qIGNvbm5lY3QgKi8KKyAgQ3VybF9zY2hhbm5lbF9jb25uZWN0X25vbmJsb2NraW5nLCAvKiBjb25uZWN0X25vbmJsb2NraW5nICovCisgIEN1cmxfc2NoYW5uZWxfZ2V0X2ludGVybmFscywgICAgICAgLyogZ2V0X2ludGVybmFscyAqLworICBDdXJsX3NjaGFubmVsX2Nsb3NlLCAgICAgICAgICAgICAgIC8qIGNsb3NlICovCisgIEN1cmxfbm9uZV9jbG9zZV9hbGwsICAgICAgICAgICAgICAgLyogY2xvc2VfYWxsICovCisgIEN1cmxfc2NoYW5uZWxfc2Vzc2lvbl9mcmVlLCAgICAgICAgLyogc2Vzc2lvbl9mcmVlICovCisgIEN1cmxfbm9uZV9zZXRfZW5naW5lLCAgICAgICAgICAgICAgLyogc2V0X2VuZ2luZSAqLworICBDdXJsX25vbmVfc2V0X2VuZ2luZV9kZWZhdWx0LCAgICAgIC8qIHNldF9lbmdpbmVfZGVmYXVsdCAqLworICBDdXJsX25vbmVfZW5naW5lc19saXN0LCAgICAgICAgICAgIC8qIGVuZ2luZXNfbGlzdCAqLworICBDdXJsX25vbmVfZmFsc2Vfc3RhcnQsICAgICAgICAgICAgIC8qIGZhbHNlX3N0YXJ0ICovCisgIEN1cmxfbm9uZV9tZDVzdW0sICAgICAgICAgICAgICAgICAgLyogbWQ1c3VtICovCisgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhMjU2c3VtICovCit9OworCiAjZW5kaWYgLyogVVNFX1NDSEFOTkVMICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3NjaGFubmVsLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3NjaGFubmVsLmgKaW5kZXggODYyN2M2My4uOTMyMTAzZCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9zY2hhbm5lbC5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvc2NoYW5uZWwuaApAQCAtMjgsOTQgKzI4LDcgQEAKIAogI2luY2x1ZGUgInVybGRhdGEuaCIKIAotI2lmbmRlZiBVTklTUF9OQU1FX0EKLSNkZWZpbmUgVU5JU1BfTkFNRV9BICJNaWNyb3NvZnQgVW5pZmllZCBTZWN1cml0eSBQcm90b2NvbCBQcm92aWRlciIKLSNlbmRpZgotCi0jaWZuZGVmIFVOSVNQX05BTUVfVwotI2RlZmluZSBVTklTUF9OQU1FX1cgTCJNaWNyb3NvZnQgVW5pZmllZCBTZWN1cml0eSBQcm90b2NvbCBQcm92aWRlciIKLSNlbmRpZgotCi0jaWZuZGVmIFVOSVNQX05BTUUKLSNpZmRlZiBVTklDT0RFCi0jZGVmaW5lIFVOSVNQX05BTUUgIFVOSVNQX05BTUVfVwotI2Vsc2UKLSNkZWZpbmUgVU5JU1BfTkFNRSAgVU5JU1BfTkFNRV9BCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFNQX1BST1RfU1NMMl9DTElFTlQKLSNkZWZpbmUgU1BfUFJPVF9TU0wyX0NMSUVOVCAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZW5kaWYKLQotI2lmbmRlZiBTUF9QUk9UX1NTTDNfQ0xJRU5UCi0jZGVmaW5lIFNQX1BST1RfU1NMM19DTElFTlQgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2VuZGlmCi0KLSNpZm5kZWYgU1BfUFJPVF9UTFMxX0NMSUVOVAotI2RlZmluZSBTUF9QUk9UX1RMUzFfQ0xJRU5UICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNlbmRpZgotCi0jaWZuZGVmIFNQX1BST1RfVExTMV8wX0NMSUVOVAotI2RlZmluZSBTUF9QUk9UX1RMUzFfMF9DTElFTlQgICAgICAgICAgIFNQX1BST1RfVExTMV9DTElFTlQKLSNlbmRpZgotCi0jaWZuZGVmIFNQX1BST1RfVExTMV8xX0NMSUVOVAotI2RlZmluZSBTUF9QUk9UX1RMUzFfMV9DTElFTlQgICAgICAgICAgIDB4MDAwMDAyMDAKLSNlbmRpZgotCi0jaWZuZGVmIFNQX1BST1RfVExTMV8yX0NMSUVOVAotI2RlZmluZSBTUF9QUk9UX1RMUzFfMl9DTElFTlQgICAgICAgICAgIDB4MDAwMDA4MDAKLSNlbmRpZgotCi0jaWZuZGVmIFNFQ0JVRkZFUl9BTEVSVAotI2RlZmluZSBTRUNCVUZGRVJfQUxFUlQgICAgICAgICAgICAgICAgIDE3Ci0jZW5kaWYKLQotLyogQm90aCBzY2hhbm5lbCBidWZmZXIgc2l6ZXMgbXVzdCBiZSA+IDAgKi8KLSNkZWZpbmUgQ1VSTF9TQ0hBTk5FTF9CVUZGRVJfSU5JVF9TSVpFICAgNDA5NgotI2RlZmluZSBDVVJMX1NDSEFOTkVMX0JVRkZFUl9GUkVFX1NJWkUgICAxMDI0Ci0KLQotQ1VSTGNvZGUgQ3VybF9zY2hhbm5lbF9jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci0KLUNVUkxjb2RlIEN1cmxfc2NoYW5uZWxfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpkb25lKTsKLQotYm9vbCBDdXJsX3NjaGFubmVsX2RhdGFfcGVuZGluZyhjb25zdCBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotdm9pZCBDdXJsX3NjaGFubmVsX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci1pbnQgQ3VybF9zY2hhbm5lbF9zaHV0ZG93bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotdm9pZCBDdXJsX3NjaGFubmVsX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpOwotCi1pbnQgQ3VybF9zY2hhbm5lbF9pbml0KHZvaWQpOwotdm9pZCBDdXJsX3NjaGFubmVsX2NsZWFudXAodm9pZCk7Ci1zaXplX3QgQ3VybF9zY2hhbm5lbF92ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwotCi1DVVJMY29kZSBDdXJsX3NjaGFubmVsX3JhbmRvbSh1bnNpZ25lZCBjaGFyICplbnRyb3B5LCBzaXplX3QgbGVuZ3RoKTsKLQotLyogU2V0IHRoZSBBUEkgYmFja2VuZCBkZWZpbml0aW9uIHRvIFNjaGFubmVsICovCi0jZGVmaW5lIENVUkxfU1NMX0JBQ0tFTkQgQ1VSTFNTTEJBQ0tFTkRfU0NIQU5ORUwKLQotLyogdGhpcyBiYWNrZW5kIHN1cHBvcnRzIENVUkxPUFRfQ0VSVElORk8gKi8KLSNkZWZpbmUgaGF2ZV9jdXJsc3NsX2NlcnRpbmZvIDEKLQotLyogQVBJIHNldHVwIGZvciBTY2hhbm5lbCAqLwotI2RlZmluZSBjdXJsc3NsX2luaXQgQ3VybF9zY2hhbm5lbF9pbml0Ci0jZGVmaW5lIGN1cmxzc2xfY2xlYW51cCBDdXJsX3NjaGFubmVsX2NsZWFudXAKLSNkZWZpbmUgY3VybHNzbF9jb25uZWN0IEN1cmxfc2NoYW5uZWxfY29ubmVjdAotI2RlZmluZSBjdXJsc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcgQ3VybF9zY2hhbm5lbF9jb25uZWN0X25vbmJsb2NraW5nCi0jZGVmaW5lIGN1cmxzc2xfc2Vzc2lvbl9mcmVlIEN1cmxfc2NoYW5uZWxfc2Vzc2lvbl9mcmVlCi0jZGVmaW5lIGN1cmxzc2xfY2xvc2VfYWxsKHgpICgodm9pZCl4KQotI2RlZmluZSBjdXJsc3NsX2Nsb3NlIEN1cmxfc2NoYW5uZWxfY2xvc2UKLSNkZWZpbmUgY3VybHNzbF9zaHV0ZG93biBDdXJsX3NjaGFubmVsX3NodXRkb3duCi0jZGVmaW5lIGN1cmxzc2xfc2V0X2VuZ2luZSh4LHkpICgodm9pZCl4LCAodm9pZCl5LCBDVVJMRV9OT1RfQlVJTFRfSU4pCi0jZGVmaW5lIGN1cmxzc2xfc2V0X2VuZ2luZV9kZWZhdWx0KHgpICgodm9pZCl4LCBDVVJMRV9OT1RfQlVJTFRfSU4pCi0jZGVmaW5lIGN1cmxzc2xfZW5naW5lc19saXN0KHgpICgodm9pZCl4LCAoc3RydWN0IGN1cmxfc2xpc3QgKilOVUxMKQotI2RlZmluZSBjdXJsc3NsX3ZlcnNpb24gQ3VybF9zY2hhbm5lbF92ZXJzaW9uCi0jZGVmaW5lIGN1cmxzc2xfY2hlY2tfY3huKHgpICgodm9pZCl4LCAtMSkKLSNkZWZpbmUgY3VybHNzbF9kYXRhX3BlbmRpbmcgQ3VybF9zY2hhbm5lbF9kYXRhX3BlbmRpbmcKLSNkZWZpbmUgY3VybHNzbF9yYW5kb20oeCx5LHopICgodm9pZCl4LCBDdXJsX3NjaGFubmVsX3JhbmRvbSh5LHopKQorZXh0ZXJuIGNvbnN0IHN0cnVjdCBDdXJsX3NzbCBDdXJsX3NzbF9zY2hhbm5lbDsKIAogI2VuZGlmIC8qIFVTRV9TQ0hBTk5FTCAqLwogI2VuZGlmIC8qIEhFQURFUl9DVVJMX1NDSEFOTkVMX0ggKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvdnRscy5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy92dGxzLmMKaW5kZXggZDVkMDk3MS4uYmI4ZmRhNCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy92dGxzLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy92dGxzLmMKQEAgLTI4LDE3ICsyOCw5IEBACiAgICB0byBhbnkgc3BlY2lmaWMgU1NMLWxheWVyLgogCiAgICBDdXJsX3NzbF8gLSBwcmVmaXggZm9yIGdlbmVyaWMgb25lcwotICAgQ3VybF9vc3NsXyAtIHByZWZpeCBmb3IgT3BlblNTTCBvbmVzCi0gICBDdXJsX2d0bHNfIC0gcHJlZml4IGZvciBHbnVUTFMgb25lcwotICAgQ3VybF9uc3NfIC0gcHJlZml4IGZvciBOU1Mgb25lcwotICAgQ3VybF9nc2tpdF8gLSBwcmVmaXggZm9yIEdTS2l0IG9uZXMKLSAgIEN1cmxfcG9sYXJzc2xfIC0gcHJlZml4IGZvciBQb2xhclNTTCBvbmVzCi0gICBDdXJsX2N5YXNzbF8gLSBwcmVmaXggZm9yIEN5YVNTTCBvbmVzCi0gICBDdXJsX3NjaGFubmVsXyAtIHByZWZpeCBmb3IgU2NoYW5uZWwgU1NQSSBvbmVzCi0gICBDdXJsX2RhcndpbnNzbF8gLSBwcmVmaXggZm9yIFNlY3VyZVRyYW5zcG9ydCAoRGFyd2luKSBvbmVzCiAKLSAgIE5vdGUgdGhhdCB0aGlzIHNvdXJjZSBjb2RlIHVzZXMgY3VybHNzbF8qIGZ1bmN0aW9ucywgYW5kIHRoZXkgYXJlIGFsbAotICAgZGVmaW5lcy9tYWNyb3MgI2RlZmluZWQgYnkgdGhlIGxpYi1zcGVjaWZpYyBoZWFkZXIgZmlsZXMuCisgICBOb3RlIHRoYXQgdGhpcyBzb3VyY2UgY29kZSB1c2VzIHRoZSBmdW5jdGlvbnMgb2YgdGhlIGNvbmZpZ3VyZWQgU1NMCisgICBiYWNrZW5kIHZpYSB0aGUgZ2xvYmFsIEN1cmxfc3NsIGluc3RhbmNlLgogCiAgICAiU1NML1RMUyBTdHJvbmcgRW5jcnlwdGlvbjogQW4gSW50cm9kdWN0aW9uIgogICAgaHR0cHM6Ly9odHRwZC5hcGFjaGUub3JnL2RvY3MvMi4wL3NzbC9zc2xfaW50cm8uaHRtbApAQCAtOTgsOSArOTAsMTIgQEAKICAgICAgKGRhdGEtPnZlcnNpb25fbWF4ID09IG5lZWRsZS0+dmVyc2lvbl9tYXgpICYmCiAgICAgIChkYXRhLT52ZXJpZnlwZWVyID09IG5lZWRsZS0+dmVyaWZ5cGVlcikgJiYKICAgICAgKGRhdGEtPnZlcmlmeWhvc3QgPT0gbmVlZGxlLT52ZXJpZnlob3N0KSAmJgorICAgICAoZGF0YS0+dmVyaWZ5c3RhdHVzID09IG5lZWRsZS0+dmVyaWZ5c3RhdHVzKSAmJgogICAgICBDdXJsX3NhZmVfc3RyY2FzZWNvbXBhcmUoZGF0YS0+Q0FwYXRoLCBuZWVkbGUtPkNBcGF0aCkgJiYKICAgICAgQ3VybF9zYWZlX3N0cmNhc2Vjb21wYXJlKGRhdGEtPkNBZmlsZSwgbmVlZGxlLT5DQWZpbGUpICYmCiAgICAgIEN1cmxfc2FmZV9zdHJjYXNlY29tcGFyZShkYXRhLT5jbGllbnRjZXJ0LCBuZWVkbGUtPmNsaWVudGNlcnQpICYmCisgICAgIEN1cmxfc2FmZV9zdHJjYXNlY29tcGFyZShkYXRhLT5yYW5kb21fZmlsZSwgbmVlZGxlLT5yYW5kb21fZmlsZSkgJiYKKyAgICAgQ3VybF9zYWZlX3N0cmNhc2Vjb21wYXJlKGRhdGEtPmVnZHNvY2tldCwgbmVlZGxlLT5lZ2Rzb2NrZXQpICYmCiAgICAgIEN1cmxfc2FmZV9zdHJjYXNlY29tcGFyZShkYXRhLT5jaXBoZXJfbGlzdCwgbmVlZGxlLT5jaXBoZXJfbGlzdCkpCiAgICAgcmV0dXJuIFRSVUU7CiAKQEAgLTExMSw0MiArMTA2LDUxIEBACiBDdXJsX2Nsb25lX3ByaW1hcnlfc3NsX2NvbmZpZyhzdHJ1Y3Qgc3NsX3ByaW1hcnlfY29uZmlnICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3NsX3ByaW1hcnlfY29uZmlnICpkZXN0KQogewotICBkZXN0LT52ZXJpZnlob3N0ID0gc291cmNlLT52ZXJpZnlob3N0OwotICBkZXN0LT52ZXJpZnlwZWVyID0gc291cmNlLT52ZXJpZnlwZWVyOwogICBkZXN0LT52ZXJzaW9uID0gc291cmNlLT52ZXJzaW9uOwogICBkZXN0LT52ZXJzaW9uX21heCA9IHNvdXJjZS0+dmVyc2lvbl9tYXg7CisgIGRlc3QtPnZlcmlmeXBlZXIgPSBzb3VyY2UtPnZlcmlmeXBlZXI7CisgIGRlc3QtPnZlcmlmeWhvc3QgPSBzb3VyY2UtPnZlcmlmeWhvc3Q7CisgIGRlc3QtPnZlcmlmeXN0YXR1cyA9IHNvdXJjZS0+dmVyaWZ5c3RhdHVzOworICBkZXN0LT5zZXNzaW9uaWQgPSBzb3VyY2UtPnNlc3Npb25pZDsKIAotICBDTE9ORV9TVFJJTkcoQ0FmaWxlKTsKICAgQ0xPTkVfU1RSSU5HKENBcGF0aCk7Ci0gIENMT05FX1NUUklORyhjaXBoZXJfbGlzdCk7Ci0gIENMT05FX1NUUklORyhlZ2Rzb2NrZXQpOwotICBDTE9ORV9TVFJJTkcocmFuZG9tX2ZpbGUpOworICBDTE9ORV9TVFJJTkcoQ0FmaWxlKTsKICAgQ0xPTkVfU1RSSU5HKGNsaWVudGNlcnQpOworICBDTE9ORV9TVFJJTkcocmFuZG9tX2ZpbGUpOworICBDTE9ORV9TVFJJTkcoZWdkc29ja2V0KTsKKyAgQ0xPTkVfU1RSSU5HKGNpcGhlcl9saXN0KTsKIAotICAvKiBEaXNhYmxlIGRlc3Qgc2Vzc2lvbmlkIGNhY2hlIGlmIGEgY2xpZW50IGNlcnQgaXMgdXNlZCwgQ1ZFLTIwMTYtNTQxOS4gKi8KLSAgZGVzdC0+c2Vzc2lvbmlkID0gKGRlc3QtPmNsaWVudGNlcnQgPyBmYWxzZSA6IHNvdXJjZS0+c2Vzc2lvbmlkKTsKICAgcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgQ3VybF9mcmVlX3ByaW1hcnlfc3NsX2NvbmZpZyhzdHJ1Y3Qgc3NsX3ByaW1hcnlfY29uZmlnKiBzc2xjKQogewotICBDdXJsX3NhZmVmcmVlKHNzbGMtPkNBZmlsZSk7CiAgIEN1cmxfc2FmZWZyZWUoc3NsYy0+Q0FwYXRoKTsKLSAgQ3VybF9zYWZlZnJlZShzc2xjLT5jaXBoZXJfbGlzdCk7Ci0gIEN1cmxfc2FmZWZyZWUoc3NsYy0+ZWdkc29ja2V0KTsKLSAgQ3VybF9zYWZlZnJlZShzc2xjLT5yYW5kb21fZmlsZSk7CisgIEN1cmxfc2FmZWZyZWUoc3NsYy0+Q0FmaWxlKTsKICAgQ3VybF9zYWZlZnJlZShzc2xjLT5jbGllbnRjZXJ0KTsKKyAgQ3VybF9zYWZlZnJlZShzc2xjLT5yYW5kb21fZmlsZSk7CisgIEN1cmxfc2FmZWZyZWUoc3NsYy0+ZWdkc29ja2V0KTsKKyAgQ3VybF9zYWZlZnJlZShzc2xjLT5jaXBoZXJfbGlzdCk7CiB9CiAKKyNpZmRlZiBVU0VfU1NMCitzdGF0aWMgaW50IG11bHRpc3NsX2luaXQoY29uc3Qgc3RydWN0IEN1cmxfc3NsICpiYWNrZW5kKTsKKyNlbmRpZgorCiBpbnQgQ3VybF9zc2xfYmFja2VuZCh2b2lkKQogewotICByZXR1cm4gKGludClDVVJMX1NTTF9CQUNLRU5EOworI2lmZGVmIFVTRV9TU0wKKyAgbXVsdGlzc2xfaW5pdChOVUxMKTsKKyAgcmV0dXJuIEN1cmxfc3NsLT5pbmZvLmlkOworI2Vsc2UKKyAgcmV0dXJuIChpbnQpQ1VSTFNTTEJBQ0tFTkRfTk9ORTsKKyNlbmRpZgogfQogCiAjaWZkZWYgVVNFX1NTTAogCiAvKiAiZ2xvYmFsIiBpbml0IGRvbmU/ICovCi1zdGF0aWMgYm9vbCBpbml0X3NzbD1GQUxTRTsKK3N0YXRpYyBib29sIGluaXRfc3NsID0gRkFMU0U7CiAKIC8qKgogICogR2xvYmFsIFNTTCBpbml0CkBAIC0xNjEsNyArMTY1LDcgQEAKICAgICByZXR1cm4gMTsKICAgaW5pdF9zc2wgPSBUUlVFOyAvKiBuZXZlciBhZ2FpbiAqLwogCi0gIHJldHVybiBjdXJsc3NsX2luaXQoKTsKKyAgcmV0dXJuIEN1cmxfc3NsLT5pbml0KCk7CiB9CiAKIApAQCAtMTcwLDcgKzE3NCw3IEBACiB7CiAgIGlmKGluaXRfc3NsKSB7CiAgICAgLyogb25seSBjbGVhbnVwIGlmIHdlIGRpZCBhIHByZXZpb3VzIGluaXQgKi8KLSAgICBjdXJsc3NsX2NsZWFudXAoKTsKKyAgICBDdXJsX3NzbC0+Y2xlYW51cCgpOwogICAgIGluaXRfc3NsID0gRkFMU0U7CiAgIH0KIH0KQEAgLTIwNSwxMiArMjA5LDIwIEBACiAgIERFQlVHQVNTRVJUKGNvbm4tPmJpdHMucHJveHlfc3NsX2Nvbm5lY3RlZFtzb2NraW5kZXhdKTsKICAgaWYoc3NsX2Nvbm5lY3Rpb25fY29tcGxldGUgPT0gY29ubi0+c3NsW3NvY2tpbmRleF0uc3RhdGUgJiYKICAgICAgIWNvbm4tPnByb3h5X3NzbFtzb2NraW5kZXhdLnVzZSkgewotI2lmIGRlZmluZWQoSFRUUFNfUFJPWFlfU1VQUE9SVCkKKyAgICBzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSAqcGJkYXRhOworCisgICAgaWYoIUN1cmxfc3NsLT5zdXBwb3J0X2h0dHBzX3Byb3h5KQorICAgICAgcmV0dXJuIENVUkxFX05PVF9CVUlMVF9JTjsKKworICAgIC8qIFRoZSBwb2ludGVycyB0byB0aGUgc3NsIGJhY2tlbmQgZGF0YSwgd2hpY2ggaXMgb3BhcXVlIGhlcmUsIGFyZSBzd2FwcGVkCisgICAgICAgcmF0aGVyIHRoYW4gbW92ZSB0aGUgY29udGVudHMuICovCisgICAgcGJkYXRhID0gY29ubi0+cHJveHlfc3NsW3NvY2tpbmRleF0uYmFja2VuZDsKICAgICBjb25uLT5wcm94eV9zc2xbc29ja2luZGV4XSA9IGNvbm4tPnNzbFtzb2NraW5kZXhdOworCiAgICAgbWVtc2V0KCZjb25uLT5zc2xbc29ja2luZGV4XSwgMCwgc2l6ZW9mKGNvbm4tPnNzbFtzb2NraW5kZXhdKSk7Ci0jZWxzZQotICAgIHJldHVybiBDVVJMRV9OT1RfQlVJTFRfSU47Ci0jZW5kaWYKKyAgICBtZW1zZXQocGJkYXRhLCAwLCBDdXJsX3NzbC0+c2l6ZW9mX3NzbF9iYWNrZW5kX2RhdGEpOworCisgICAgY29ubi0+c3NsW3NvY2tpbmRleF0uYmFja2VuZCA9IHBiZGF0YTsKICAgfQogICByZXR1cm4gQ1VSTEVfT0s7CiB9CkBAIC0yMzMsNyArMjQ1LDcgQEAKICAgY29ubi0+c3NsW3NvY2tpbmRleF0udXNlID0gVFJVRTsKICAgY29ubi0+c3NsW3NvY2tpbmRleF0uc3RhdGUgPSBzc2xfY29ubmVjdGlvbl9uZWdvdGlhdGluZzsKIAotICByZXN1bHQgPSBjdXJsc3NsX2Nvbm5lY3QoY29ubiwgc29ja2luZGV4KTsKKyAgcmVzdWx0ID0gQ3VybF9zc2wtPmNvbm5lY3QoY29ubiwgc29ja2luZGV4KTsKIAogICBpZighcmVzdWx0KQogICAgIEN1cmxfcGdyc1RpbWUoY29ubi0+ZGF0YSwgVElNRVJfQVBQQ09OTkVDVCk7IC8qIFNTTCBpcyBjb25uZWN0ZWQgKi8KQEAgLTI1NywxMiArMjY5LDcgQEAKIAogICAvKiBtYXJrIHRoaXMgaXMgYmVpbmcgc3NsIHJlcXVlc3RlZCBmcm9tIGhlcmUgb24uICovCiAgIGNvbm4tPnNzbFtzb2NraW5kZXhdLnVzZSA9IFRSVUU7Ci0jaWZkZWYgY3VybHNzbF9jb25uZWN0X25vbmJsb2NraW5nCi0gIHJlc3VsdCA9IGN1cmxzc2xfY29ubmVjdF9ub25ibG9ja2luZyhjb25uLCBzb2NraW5kZXgsIGRvbmUpOwotI2Vsc2UKLSAgKmRvbmUgPSBUUlVFOyAvKiBmYWxsYmFjayB0byBCTE9DS0lORyAqLwotICByZXN1bHQgPSBjdXJsc3NsX2Nvbm5lY3QoY29ubiwgc29ja2luZGV4KTsKLSNlbmRpZiAvKiBub24tYmxvY2tpbmcgY29ubmVjdCBzdXBwb3J0ICovCisgIHJlc3VsdCA9IEN1cmxfc3NsLT5jb25uZWN0X25vbmJsb2NraW5nKGNvbm4sIHNvY2tpbmRleCwgZG9uZSk7CiAgIGlmKCFyZXN1bHQgJiYgKmRvbmUpCiAgICAgQ3VybF9wZ3JzVGltZShjb25uLT5kYXRhLCBUSU1FUl9BUFBDT05ORUNUKTsgLyogU1NMIGlzIGNvbm5lY3RlZCAqLwogICByZXR1cm4gcmVzdWx0OwpAQCAtMzYxLDcgKzM2OCw3IEBACiAgICAgLyogZGVmZW5zaXZlIGNoZWNrICovCiAKICAgICAvKiBmcmVlIHRoZSBJRCB0aGUgU1NMLWxheWVyIHNwZWNpZmljIHdheSAqLwotICAgIGN1cmxzc2xfc2Vzc2lvbl9mcmVlKHNlc3Npb24tPnNlc3Npb25pZCk7CisgICAgQ3VybF9zc2wtPnNlc3Npb25fZnJlZShzZXNzaW9uLT5zZXNzaW9uaWQpOwogCiAgICAgc2Vzc2lvbi0+c2Vzc2lvbmlkID0gTlVMTDsKICAgICBzZXNzaW9uLT5hZ2UgPSAwOyAvKiBmcmVzaCAqLwpAQCAtMzc5LDcgKzM4Niw3IEBACiB2b2lkIEN1cmxfc3NsX2RlbHNlc3Npb25pZChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIHZvaWQgKnNzbF9zZXNzaW9uaWQpCiB7CiAgIHNpemVfdCBpOwotICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhPWNvbm4tPmRhdGE7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogCiAgIGZvcihpID0gMDsgaSA8IGRhdGEtPnNldC5nZW5lcmFsX3NzbC5tYXhfc3NsX3Nlc3Npb25zOyBpKyspIHsKICAgICBzdHJ1Y3QgY3VybF9zc2xfc2Vzc2lvbiAqY2hlY2sgPSAmZGF0YS0+c3RhdGUuc2Vzc2lvbltpXTsKQEAgLTQwMyw5ICs0MTAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgpCiB7CiAgIHNpemVfdCBpOwotICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhPWNvbm4tPmRhdGE7IC8qIHRoZSBtb3RoZXIgb2YgYWxsIHN0cnVjdHMgKi8KKyAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7IC8qIHRoZSBtb3RoZXIgb2YgYWxsIHN0cnVjdHMgKi8KICAgc3RydWN0IGN1cmxfc3NsX3Nlc3Npb24gKnN0b3JlID0gJmRhdGEtPnN0YXRlLnNlc3Npb25bMF07Ci0gIGxvbmcgb2xkZXN0X2FnZT1kYXRhLT5zdGF0ZS5zZXNzaW9uWzBdLmFnZTsgLyogemVybyBpZiB1bnVzZWQgKi8KKyAgbG9uZyBvbGRlc3RfYWdlID0gZGF0YS0+c3RhdGUuc2Vzc2lvblswXS5hZ2U7IC8qIHplcm8gaWYgdW51c2VkICovCiAgIGNoYXIgKmNsb25lX2hvc3Q7CiAgIGNoYXIgKmNsb25lX2Nvbm5fdG9faG9zdDsKICAgaW50IGNvbm5fdG9fcG9ydDsKQEAgLTQ5OSw3ICs1MDYsNyBAQAogICAgIEN1cmxfc2FmZWZyZWUoZGF0YS0+c3RhdGUuc2Vzc2lvbik7CiAgIH0KIAotICBjdXJsc3NsX2Nsb3NlX2FsbChkYXRhKTsKKyAgQ3VybF9zc2wtPmNsb3NlX2FsbChkYXRhKTsKIH0KIAogI2lmIGRlZmluZWQoVVNFX09QRU5TU0wpIHx8IGRlZmluZWQoVVNFX0dOVVRMUykgfHwgZGVmaW5lZChVU0VfU0NIQU5ORUwpIHx8IFwKQEAgLTU0MiwxMiArNTQ5LDEyIEBACiB2b2lkIEN1cmxfc3NsX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKICAgREVCVUdBU1NFUlQoKHNvY2tpbmRleCA8PSAxKSAmJiAoc29ja2luZGV4ID49IC0xKSk7Ci0gIGN1cmxzc2xfY2xvc2UoY29ubiwgc29ja2luZGV4KTsKKyAgQ3VybF9zc2wtPmNsb3NlKGNvbm4sIHNvY2tpbmRleCk7CiB9CiAKIENVUkxjb2RlIEN1cmxfc3NsX3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKLSAgaWYoY3VybHNzbF9zaHV0ZG93bihjb25uLCBzb2NraW5kZXgpKQorICBpZihDdXJsX3NzbC0+c2h1dGRvd24oY29ubiwgc29ja2luZGV4KSkKICAgICByZXR1cm4gQ1VSTEVfU1NMX1NIVVRET1dOX0ZBSUxFRDsKIAogICBjb25uLT5zc2xbc29ja2luZGV4XS51c2UgPSBGQUxTRTsgLyogZ2V0IGJhY2sgdG8gb3JkaW5hcnkgc29ja2V0IHVzYWdlICovCkBAIC01NjMsMjAgKzU3MCwyMCBAQAogICovCiBDVVJMY29kZSBDdXJsX3NzbF9zZXRfZW5naW5lKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsIGNvbnN0IGNoYXIgKmVuZ2luZSkKIHsKLSAgcmV0dXJuIGN1cmxzc2xfc2V0X2VuZ2luZShkYXRhLCBlbmdpbmUpOworICByZXR1cm4gQ3VybF9zc2wtPnNldF9lbmdpbmUoZGF0YSwgZW5naW5lKTsKIH0KIAogLyogU2VsZWN0cyB0aGUgZGVmYXVsdCBTU0wgY3J5cHRvIGVuZ2luZQogICovCiBDVVJMY29kZSBDdXJsX3NzbF9zZXRfZW5naW5lX2RlZmF1bHQoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKIHsKLSAgcmV0dXJuIGN1cmxzc2xfc2V0X2VuZ2luZV9kZWZhdWx0KGRhdGEpOworICByZXR1cm4gQ3VybF9zc2wtPnNldF9lbmdpbmVfZGVmYXVsdChkYXRhKTsKIH0KIAogLyogUmV0dXJuIGxpc3Qgb2YgT3BlblNTTCBjcnlwdG8gZW5naW5lIG5hbWVzLiAqLwogc3RydWN0IGN1cmxfc2xpc3QgKkN1cmxfc3NsX2VuZ2luZXNfbGlzdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQogewotICByZXR1cm4gY3VybHNzbF9lbmdpbmVzX2xpc3QoZGF0YSk7CisgIHJldHVybiBDdXJsX3NzbC0+ZW5naW5lc19saXN0KGRhdGEpOwogfQogCiAvKgpAQCAtNjAyLDkgKzYwOSwxNSBAQAogICByZXR1cm4gQ1VSTEVfT0s7CiB9CiAKK3N0YXRpYyBzaXplX3QgQ3VybF9tdWx0aXNzbF92ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworCiBzaXplX3QgQ3VybF9zc2xfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQogewotICByZXR1cm4gY3VybHNzbF92ZXJzaW9uKGJ1ZmZlciwgc2l6ZSk7CisjaWZkZWYgQ1VSTF9XSVRIX01VTFRJX1NTTAorICByZXR1cm4gQ3VybF9tdWx0aXNzbF92ZXJzaW9uKGJ1ZmZlciwgc2l6ZSk7CisjZWxzZQorICByZXR1cm4gQ3VybF9zc2wtPnZlcnNpb24oYnVmZmVyLCBzaXplKTsKKyNlbmRpZgogfQogCiAvKgpAQCAtNjE3LDEzICs2MzAsMTMgQEAKICAqLwogaW50IEN1cmxfc3NsX2NoZWNrX2N4bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCiB7Ci0gIHJldHVybiBjdXJsc3NsX2NoZWNrX2N4bihjb25uKTsKKyAgcmV0dXJuIEN1cmxfc3NsLT5jaGVja19jeG4oY29ubik7CiB9CiAKIGJvb2wgQ3VybF9zc2xfZGF0YV9wZW5kaW5nKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uaW5kZXgpCiB7Ci0gIHJldHVybiBjdXJsc3NsX2RhdGFfcGVuZGluZyhjb25uLCBjb25uaW5kZXgpOworICByZXR1cm4gQ3VybF9zc2wtPmRhdGFfcGVuZGluZyhjb25uLCBjb25uaW5kZXgpOwogfQogCiB2b2lkIEN1cmxfc3NsX2ZyZWVfY2VydGluZm8oc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKQEAgLTYzMyw3ICs2NDYsNyBAQAogCiAgIGlmKGNpLT5udW1fb2ZfY2VydHMpIHsKICAgICAvKiBmcmVlIGFsbCBpbmRpdmlkdWFsIGxpc3RzIHVzZWQgKi8KLSAgICBmb3IoaT0wOyBpPGNpLT5udW1fb2ZfY2VydHM7IGkrKykgeworICAgIGZvcihpID0gMDsgaTxjaS0+bnVtX29mX2NlcnRzOyBpKyspIHsKICAgICAgIGN1cmxfc2xpc3RfZnJlZV9hbGwoY2ktPmNlcnRpbmZvW2ldKTsKICAgICAgIGNpLT5jZXJ0aW5mb1tpXSA9IE5VTEw7CiAgICAgfQpAQCAtNjg3LDcgKzcwMCw3IEBACiAgIHNucHJpbnRmKG91dHB1dCwgb3V0bGVuLCAiJXM6IiwgbGFiZWwpOwogCiAgIC8qIG1lbWNweSB0aGUgdmFsdWUgKGl0IG1pZ2h0IG5vdCBiZSB6ZXJvIHRlcm1pbmF0ZWQpICovCi0gIG1lbWNweSgmb3V0cHV0W2xhYmVsbGVuKzFdLCB2YWx1ZSwgdmFsdWVsZW4pOworICBtZW1jcHkoJm91dHB1dFtsYWJlbGxlbiArIDFdLCB2YWx1ZSwgdmFsdWVsZW4pOwogCiAgIC8qIHplcm8gdGVybWluYXRlIHRoZSBvdXRwdXQgKi8KICAgb3V0cHV0W2xhYmVsbGVuICsgMSArIHZhbHVlbGVuXSA9IDA7CkBAIC03MjEsNyArNzM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbnRyb3B5LAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpCiB7Ci0gIHJldHVybiBjdXJsc3NsX3JhbmRvbShkYXRhLCBlbnRyb3B5LCBsZW5ndGgpOworICByZXR1cm4gQ3VybF9zc2wtPnJhbmRvbShkYXRhLCBlbnRyb3B5LCBsZW5ndGgpOwogfQogCiAvKgpAQCAtNzk2LDEyICs4MDksMTAgQEAKICAgc2l6ZV90IHNpemUsIHBlbV9sZW47CiAgIENVUkxjb2RlIHBlbV9yZWFkOwogICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9TU0xfUElOTkVEUFVCS0VZTk9UTUFUQ0g7Ci0jaWZkZWYgY3VybHNzbF9zaGEyNTZzdW0KICAgQ1VSTGNvZGUgZW5jb2RlOwogICBzaXplX3QgZW5jb2RlZGxlbiwgcGlua2V5bGVuOwogICBjaGFyICplbmNvZGVkLCAqcGlua2V5Y29weSwgKmJlZ2luX3BvcywgKmVuZF9wb3M7CiAgIHVuc2lnbmVkIGNoYXIgKnNoYTI1NnN1bWRpZ2VzdCA9IE5VTEw7Ci0jZW5kaWYKIAogICAvKiBpZiBhIHBhdGggd2Fzbid0IHNwZWNpZmllZCwgZG9uJ3QgcGluICovCiAgIGlmKCFwaW5uZWRwdWJrZXkpCkBAIC04MTEsMTUgKzgyMiwyMCBAQAogCiAgIC8qIG9ubHkgZG8gdGhpcyBpZiBwaW5uZWRwdWJrZXkgc3RhcnRzIHdpdGggInNoYTI1Ni8vIiwgbGVuZ3RoIDggKi8KICAgaWYoc3RybmNtcChwaW5uZWRwdWJrZXksICJzaGEyNTYvLyIsIDgpID09IDApIHsKLSNpZmRlZiBjdXJsc3NsX3NoYTI1NnN1bQorICAgIGlmKCFDdXJsX3NzbC0+c2hhMjU2c3VtKSB7CisgICAgICAvKiB3aXRob3V0IHNoYTI1NiBzdXBwb3J0LCB0aGlzIGNhbm5vdCBtYXRjaCAqLworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKICAgICAvKiBjb21wdXRlIHNoYTI1NnN1bSBvZiBwdWJsaWMga2V5ICovCi0gICAgc2hhMjU2c3VtZGlnZXN0ID0gbWFsbG9jKFNIQTI1Nl9ESUdFU1RfTEVOR1RIKTsKKyAgICBzaGEyNTZzdW1kaWdlc3QgPSBtYWxsb2MoQ1VSTF9TSEEyNTZfRElHRVNUX0xFTkdUSCk7CiAgICAgaWYoIXNoYTI1NnN1bWRpZ2VzdCkKICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwotICAgIGN1cmxzc2xfc2hhMjU2c3VtKHB1YmtleSwgcHVia2V5bGVuLAotICAgICAgICAgICAgICAgICAgICAgIHNoYTI1NnN1bWRpZ2VzdCwgU0hBMjU2X0RJR0VTVF9MRU5HVEgpOworICAgIEN1cmxfc3NsLT5zaGEyNTZzdW0ocHVia2V5LCBwdWJrZXlsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBzaGEyNTZzdW1kaWdlc3QsIENVUkxfU0hBMjU2X0RJR0VTVF9MRU5HVEgpOwogICAgIGVuY29kZSA9IEN1cmxfYmFzZTY0X2VuY29kZShkYXRhLCAoY2hhciAqKXNoYTI1NnN1bWRpZ2VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hBMjU2X0RJR0VTVF9MRU5HVEgsICZlbmNvZGVkLCAmZW5jb2RlZGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxfU0hBMjU2X0RJR0VTVF9MRU5HVEgsICZlbmNvZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RlZGxlbik7CiAgICAgQ3VybF9zYWZlZnJlZShzaGEyNTZzdW1kaWdlc3QpOwogCiAgICAgaWYoZW5jb2RlKQpAQCAtODY0LDEwICs4ODAsNiBAQAogICAgIH0gd2hpbGUoZW5kX3BvcyAmJiBiZWdpbl9wb3MpOwogICAgIEN1cmxfc2FmZWZyZWUoZW5jb2RlZCk7CiAgICAgQ3VybF9zYWZlZnJlZShwaW5rZXljb3B5KTsKLSNlbHNlCi0gICAgLyogd2l0aG91dCBzaGEyNTYgc3VwcG9ydCwgdGhpcyBjYW5ub3QgbWF0Y2ggKi8KLSAgICAodm9pZClkYXRhOwotI2VuZGlmCiAgICAgcmV0dXJuIHJlc3VsdDsKICAgfQogCkBAIC05NDMsMjAgKzk1NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbWQ1c3VtLCAvKiBvdXRwdXQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWQ1bGVuKQogewotI2lmZGVmIGN1cmxzc2xfbWQ1c3VtCi0gIGN1cmxzc2xfbWQ1c3VtKHRtcCwgdG1wbGVuLCBtZDVzdW0sIG1kNWxlbik7Ci0jZWxzZQotICBNRDVfY29udGV4dCAqTUQ1cHc7Ci0KLSAgKHZvaWQpIG1kNWxlbjsKLQotICBNRDVwdyA9IEN1cmxfTUQ1X2luaXQoQ3VybF9ESUdFU1RfTUQ1KTsKLSAgaWYoIU1ENXB3KQotICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwotICBDdXJsX01ENV91cGRhdGUoTUQ1cHcsIHRtcCwgY3VybHhfdXp0b3VpKHRtcGxlbikpOwotICBDdXJsX01ENV9maW5hbChNRDVwdywgbWQ1c3VtKTsKLSNlbmRpZgotICByZXR1cm4gQ1VSTEVfT0s7CisgIHJldHVybiBDdXJsX3NzbC0+bWQ1c3VtKHRtcCwgdG1wbGVuLCBtZDVzdW0sIG1kNWxlbik7CiB9CiAjZW5kaWYKIApAQCAtOTY1LDExICs5NjQsNyBAQAogICovCiBib29sIEN1cmxfc3NsX2NlcnRfc3RhdHVzX3JlcXVlc3Qodm9pZCkKIHsKLSNpZmRlZiBjdXJsc3NsX2NlcnRfc3RhdHVzX3JlcXVlc3QKLSAgcmV0dXJuIGN1cmxzc2xfY2VydF9zdGF0dXNfcmVxdWVzdCgpOwotI2Vsc2UKLSAgcmV0dXJuIEZBTFNFOwotI2VuZGlmCisgIHJldHVybiBDdXJsX3NzbC0+Y2VydF9zdGF0dXNfcmVxdWVzdCgpOwogfQogCiAvKgpAQCAtOTc3LDExICs5NzIsMzQxIEBACiAgKi8KIGJvb2wgQ3VybF9zc2xfZmFsc2Vfc3RhcnQodm9pZCkKIHsKLSNpZmRlZiBjdXJsc3NsX2ZhbHNlX3N0YXJ0Ci0gIHJldHVybiBjdXJsc3NsX2ZhbHNlX3N0YXJ0KCk7Ci0jZWxzZQotICByZXR1cm4gRkFMU0U7Ci0jZW5kaWYKKyAgcmV0dXJuIEN1cmxfc3NsLT5mYWxzZV9zdGFydCgpOwogfQogCi0jZW5kaWYgLyogVVNFX1NTTCAqLworLyoKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciB1bnN1cHBvcnRlZCBmdW5jdGlvbnMuCisgKi8KKworaW50IEN1cmxfbm9uZV9pbml0KHZvaWQpCit7CisgIHJldHVybiAxOworfQorCit2b2lkIEN1cmxfbm9uZV9jbGVhbnVwKHZvaWQpCit7IH0KKworaW50IEN1cmxfbm9uZV9zaHV0ZG93bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4gVU5VU0VEX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4IFVOVVNFRF9QQVJBTSkKK3sKKyAgKHZvaWQpY29ubjsKKyAgKHZvaWQpc29ja2luZGV4OworICByZXR1cm4gMDsKK30KKworaW50IEN1cmxfbm9uZV9jaGVja19jeG4oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uIFVOVVNFRF9QQVJBTSkKK3sKKyAgKHZvaWQpY29ubjsKKyAgcmV0dXJuIC0xOworfQorCitDVVJMY29kZSBDdXJsX25vbmVfcmFuZG9tKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgVU5VU0VEX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbnRyb3B5IFVOVVNFRF9QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCBVTlVTRURfUEFSQU0pCit7CisgICh2b2lkKWRhdGE7CisgICh2b2lkKWVudHJvcHk7CisgICh2b2lkKWxlbmd0aDsKKyAgcmV0dXJuIENVUkxFX05PVF9CVUlMVF9JTjsKK30KKwordm9pZCBDdXJsX25vbmVfY2xvc2VfYWxsKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgVU5VU0VEX1BBUkFNKQoreworICAodm9pZClkYXRhOworfQorCit2b2lkIEN1cmxfbm9uZV9zZXNzaW9uX2ZyZWUodm9pZCAqcHRyIFVOVVNFRF9QQVJBTSkKK3sKKyAgKHZvaWQpcHRyOworfQorCitib29sIEN1cmxfbm9uZV9kYXRhX3BlbmRpbmcoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uIFVOVVNFRF9QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29ubmluZGV4IFVOVVNFRF9QQVJBTSkKK3sKKyAgKHZvaWQpY29ubjsKKyAgKHZvaWQpY29ubmluZGV4OworICByZXR1cm4gMDsKK30KKworYm9vbCBDdXJsX25vbmVfY2VydF9zdGF0dXNfcmVxdWVzdCh2b2lkKQoreworICByZXR1cm4gRkFMU0U7Cit9CisKK0NVUkxjb2RlIEN1cmxfbm9uZV9zZXRfZW5naW5lKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgVU5VU0VEX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5naW5lIFVOVVNFRF9QQVJBTSkKK3sKKyAgKHZvaWQpZGF0YTsKKyAgKHZvaWQpZW5naW5lOworICByZXR1cm4gQ1VSTEVfTk9UX0JVSUxUX0lOOworfQorCitDVVJMY29kZSBDdXJsX25vbmVfc2V0X2VuZ2luZV9kZWZhdWx0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgVU5VU0VEX1BBUkFNKQoreworICAodm9pZClkYXRhOworICByZXR1cm4gQ1VSTEVfTk9UX0JVSUxUX0lOOworfQorCitzdHJ1Y3QgY3VybF9zbGlzdCAqQ3VybF9ub25lX2VuZ2luZXNfbGlzdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhIFVOVVNFRF9QQVJBTSkKK3sKKyAgKHZvaWQpZGF0YTsKKyAgcmV0dXJuIChzdHJ1Y3QgY3VybF9zbGlzdCAqKU5VTEw7Cit9CisKK2Jvb2wgQ3VybF9ub25lX2ZhbHNlX3N0YXJ0KHZvaWQpCit7CisgIHJldHVybiBGQUxTRTsKK30KKworQ1VSTGNvZGUgQ3VybF9ub25lX21kNXN1bSh1bnNpZ25lZCBjaGFyICppbnB1dCwgc2l6ZV90IGlucHV0bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICptZDVzdW0sIHNpemVfdCBtZDVsZW4gVU5VU0VEX1BBUkFNKQoreworICBNRDVfY29udGV4dCAqTUQ1cHc7CisKKyAgKHZvaWQpbWQ1bGVuOworCisgIE1ENXB3ID0gQ3VybF9NRDVfaW5pdChDdXJsX0RJR0VTVF9NRDUpOworICBpZighTUQ1cHcpCisgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CisgIEN1cmxfTUQ1X3VwZGF0ZShNRDVwdywgaW5wdXQsIGN1cmx4X3V6dG91aShpbnB1dGxlbikpOworICBDdXJsX01ENV9maW5hbChNRDVwdywgbWQ1c3VtKTsKKyAgcmV0dXJuIENVUkxFX09LOworfQorCitzdGF0aWMgaW50IEN1cmxfbXVsdGlzc2xfaW5pdCh2b2lkKQoreworICBpZihtdWx0aXNzbF9pbml0KE5VTEwpKQorICAgIHJldHVybiAxOworICByZXR1cm4gQ3VybF9zc2wtPmluaXQoKTsKK30KKworc3RhdGljIENVUkxjb2RlIEN1cmxfbXVsdGlzc2xfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCit7CisgIGlmKG11bHRpc3NsX2luaXQoTlVMTCkpCisgICAgcmV0dXJuIENVUkxFX0ZBSUxFRF9JTklUOworICByZXR1cm4gQ3VybF9zc2wtPmNvbm5lY3QoY29ubiwgc29ja2luZGV4KTsKK30KKworc3RhdGljIENVUkxjb2RlIEN1cmxfbXVsdGlzc2xfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsIGJvb2wgKmRvbmUpCit7CisgIGlmKG11bHRpc3NsX2luaXQoTlVMTCkpCisgICAgcmV0dXJuIENVUkxFX0ZBSUxFRF9JTklUOworICByZXR1cm4gQ3VybF9zc2wtPmNvbm5lY3Rfbm9uYmxvY2tpbmcoY29ubiwgc29ja2luZGV4LCBkb25lKTsKK30KKworc3RhdGljIHZvaWQgKkN1cmxfbXVsdGlzc2xfZ2V0X2ludGVybmFscyhzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTElORk8gaW5mbykKK3sKKyAgaWYobXVsdGlzc2xfaW5pdChOVUxMKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIEN1cmxfc3NsLT5nZXRfaW50ZXJuYWxzKGNvbm5zc2wsIGluZm8pOworfQorCitzdGF0aWMgdm9pZCBDdXJsX211bHRpc3NsX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKK3sKKyAgaWYobXVsdGlzc2xfaW5pdChOVUxMKSkKKyAgICByZXR1cm47CisgIEN1cmxfc3NsLT5jbG9zZShjb25uLCBzb2NraW5kZXgpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IEN1cmxfc3NsIEN1cmxfc3NsX211bHRpID0geworICB7IENVUkxTU0xCQUNLRU5EX05PTkUsICJtdWx0aSIgfSwgIC8qIGluZm8gKi8KKworICAwLCAvKiBoYXZlX2NhX3BhdGggKi8KKyAgMCwgLyogaGF2ZV9jZXJ0aW5mbyAqLworICAwLCAvKiBoYXZlX3Bpbm5lZHB1YmtleSAqLworICAwLCAvKiBoYXZlX3NzbF9jdHggKi8KKyAgMCwgLyogc3VwcG9ydF9odHRwc19wcm94eSAqLworCisgIChzaXplX3QpLTEsIC8qIHNvbWV0aGluZyBpbnNhbmVseSBsYXJnZSB0byBiZSBvbiB0aGUgc2FmZSBzaWRlICovCisKKyAgQ3VybF9tdWx0aXNzbF9pbml0LCAgICAgICAgICAgICAgICAvKiBpbml0ICovCisgIEN1cmxfbm9uZV9jbGVhbnVwLCAgICAgICAgICAgICAgICAgLyogY2xlYW51cCAqLworICBDdXJsX211bHRpc3NsX3ZlcnNpb24sICAgICAgICAgICAgIC8qIHZlcnNpb24gKi8KKyAgQ3VybF9ub25lX2NoZWNrX2N4biwgICAgICAgICAgICAgICAvKiBjaGVja19jeG4gKi8KKyAgQ3VybF9ub25lX3NodXRkb3duLCAgICAgICAgICAgICAgICAvKiBzaHV0ZG93biAqLworICBDdXJsX25vbmVfZGF0YV9wZW5kaW5nLCAgICAgICAgICAgIC8qIGRhdGFfcGVuZGluZyAqLworICBDdXJsX25vbmVfcmFuZG9tLCAgICAgICAgICAgICAgICAgIC8qIHJhbmRvbSAqLworICBDdXJsX25vbmVfY2VydF9zdGF0dXNfcmVxdWVzdCwgICAgIC8qIGNlcnRfc3RhdHVzX3JlcXVlc3QgKi8KKyAgQ3VybF9tdWx0aXNzbF9jb25uZWN0LCAgICAgICAgICAgICAvKiBjb25uZWN0ICovCisgIEN1cmxfbXVsdGlzc2xfY29ubmVjdF9ub25ibG9ja2luZywgLyogY29ubmVjdF9ub25ibG9ja2luZyAqLworICBDdXJsX211bHRpc3NsX2dldF9pbnRlcm5hbHMsICAgICAgIC8qIGdldF9pbnRlcm5hbHMgKi8KKyAgQ3VybF9tdWx0aXNzbF9jbG9zZSwgICAgICAgICAgICAgICAvKiBjbG9zZSAqLworICBDdXJsX25vbmVfY2xvc2VfYWxsLCAgICAgICAgICAgICAgIC8qIGNsb3NlX2FsbCAqLworICBDdXJsX25vbmVfc2Vzc2lvbl9mcmVlLCAgICAgICAgICAgIC8qIHNlc3Npb25fZnJlZSAqLworICBDdXJsX25vbmVfc2V0X2VuZ2luZSwgICAgICAgICAgICAgIC8qIHNldF9lbmdpbmUgKi8KKyAgQ3VybF9ub25lX3NldF9lbmdpbmVfZGVmYXVsdCwgICAgICAvKiBzZXRfZW5naW5lX2RlZmF1bHQgKi8KKyAgQ3VybF9ub25lX2VuZ2luZXNfbGlzdCwgICAgICAgICAgICAvKiBlbmdpbmVzX2xpc3QgKi8KKyAgQ3VybF9ub25lX2ZhbHNlX3N0YXJ0LCAgICAgICAgICAgICAvKiBmYWxzZV9zdGFydCAqLworICBDdXJsX25vbmVfbWQ1c3VtLCAgICAgICAgICAgICAgICAgIC8qIG1kNXN1bSAqLworICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoYTI1NnN1bSAqLworfTsKKworY29uc3Qgc3RydWN0IEN1cmxfc3NsICpDdXJsX3NzbCA9CisjaWYgZGVmaW5lZChDVVJMX1dJVEhfTVVMVElfU1NMKQorICAmQ3VybF9zc2xfbXVsdGk7CisjZWxpZiBkZWZpbmVkKFVTRV9BWFRMUykKKyAgJkN1cmxfc3NsX2F4dGxzOworI2VsaWYgZGVmaW5lZChVU0VfQ1lBU1NMKQorICAmQ3VybF9zc2xfY3lhc3NsOworI2VsaWYgZGVmaW5lZChVU0VfREFSV0lOU1NMKQorICAmQ3VybF9zc2xfZGFyd2luc3NsOworI2VsaWYgZGVmaW5lZChVU0VfR05VVExTKQorICAmQ3VybF9zc2xfZ251dGxzOworI2VsaWYgZGVmaW5lZChVU0VfR1NLSVQpCisgICZDdXJsX3NzbF9nc2tpdDsKKyNlbGlmIGRlZmluZWQoVVNFX01CRURUTFMpCisgICZDdXJsX3NzbF9tYmVkdGxzOworI2VsaWYgZGVmaW5lZChVU0VfTlNTKQorICAmQ3VybF9zc2xfbnNzOworI2VsaWYgZGVmaW5lZChVU0VfT1BFTlNTTCkKKyAgJkN1cmxfc3NsX29wZW5zc2w7CisjZWxpZiBkZWZpbmVkKFVTRV9QT0xBUlNTTCkKKyAgJkN1cmxfc3NsX3BvbGFyc3NsOworI2VsaWYgZGVmaW5lZChVU0VfU0NIQU5ORUwpCisgICZDdXJsX3NzbF9zY2hhbm5lbDsKKyNlbHNlCisjZXJyb3IgIk1pc3Npbmcgc3RydWN0IEN1cmxfc3NsIGZvciBzZWxlY3RlZCBTU0wgYmFja2VuZCIKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IEN1cmxfc3NsICphdmFpbGFibGVfYmFja2VuZHNbXSA9IHsKKyNpZiBkZWZpbmVkKFVTRV9BWFRMUykKKyAgJkN1cmxfc3NsX2F4dGxzLAorI2VuZGlmCisjaWYgZGVmaW5lZChVU0VfQ1lBU1NMKQorICAmQ3VybF9zc2xfY3lhc3NsLAorI2VuZGlmCisjaWYgZGVmaW5lZChVU0VfREFSV0lOU1NMKQorICAmQ3VybF9zc2xfZGFyd2luc3NsLAorI2VuZGlmCisjaWYgZGVmaW5lZChVU0VfR05VVExTKQorICAmQ3VybF9zc2xfZ251dGxzLAorI2VuZGlmCisjaWYgZGVmaW5lZChVU0VfR1NLSVQpCisgICZDdXJsX3NzbF9nc2tpdCwKKyNlbmRpZgorI2lmIGRlZmluZWQoVVNFX01CRURUTFMpCisgICZDdXJsX3NzbF9tYmVkdGxzLAorI2VuZGlmCisjaWYgZGVmaW5lZChVU0VfTlNTKQorICAmQ3VybF9zc2xfbnNzLAorI2VuZGlmCisjaWYgZGVmaW5lZChVU0VfT1BFTlNTTCkKKyAgJkN1cmxfc3NsX29wZW5zc2wsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTRV9QT0xBUlNTTCkKKyAgJkN1cmxfc3NsX3BvbGFyc3NsLAorI2VuZGlmCisjaWYgZGVmaW5lZChVU0VfU0NIQU5ORUwpCisgICZDdXJsX3NzbF9zY2hhbm5lbCwKKyNlbmRpZgorICBOVUxMCit9OworCitzdGF0aWMgc2l6ZV90IEN1cmxfbXVsdGlzc2xfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IEN1cmxfc3NsICpzZWxlY3RlZDsKKyAgc3RhdGljIGNoYXIgYmFja2VuZHNbMjAwXTsKKyAgc3RhdGljIHNpemVfdCB0b3RhbDsKKyAgY29uc3Qgc3RydWN0IEN1cmxfc3NsICpjdXJyZW50OworCisgIGN1cnJlbnQgPSBDdXJsX3NzbCA9PSAmQ3VybF9zc2xfbXVsdGkgPyBhdmFpbGFibGVfYmFja2VuZHNbMF0gOiBDdXJsX3NzbDsKKworICBpZihjdXJyZW50ICE9IHNlbGVjdGVkKSB7CisgICAgY2hhciAqcCA9IGJhY2tlbmRzOworICAgIGludCBpOworCisgICAgc2VsZWN0ZWQgPSBjdXJyZW50OworCisgICAgZm9yKGkgPSAwOyBhdmFpbGFibGVfYmFja2VuZHNbaV07IGkrKykgeworICAgICAgaWYoaSkKKyAgICAgICAgKihwKyspID0gJyAnOworICAgICAgaWYoc2VsZWN0ZWQgIT0gYXZhaWxhYmxlX2JhY2tlbmRzW2ldKQorICAgICAgICAqKHArKykgPSAnKCc7CisgICAgICBwICs9IGF2YWlsYWJsZV9iYWNrZW5kc1tpXS0+dmVyc2lvbihwLCBiYWNrZW5kcyArIHNpemVvZihiYWNrZW5kcykgLSBwKTsKKyAgICAgIGlmKHNlbGVjdGVkICE9IGF2YWlsYWJsZV9iYWNrZW5kc1tpXSkKKyAgICAgICAgKihwKyspID0gJyknOworICAgIH0KKyAgICAqcCA9ICdcMCc7CisgICAgdG90YWwgPSBwIC0gYmFja2VuZHM7CisgIH0KKworICBpZihzaXplIDwgdG90YWwpCisgICAgbWVtY3B5KGJ1ZmZlciwgYmFja2VuZHMsIHRvdGFsICsgMSk7CisgIGVsc2UgeworICAgIG1lbWNweShidWZmZXIsIGJhY2tlbmRzLCBzaXplIC0gMSk7CisgICAgYnVmZmVyW3NpemUgLSAxXSA9ICdcMCc7CisgIH0KKworICByZXR1cm4gdG90YWw7Cit9CisKK3N0YXRpYyBpbnQgbXVsdGlzc2xfaW5pdChjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgKmJhY2tlbmQpCit7CisgIGNvbnN0IGNoYXIgKmVudjsKKyAgaW50IGk7CisKKyAgaWYoQ3VybF9zc2wgIT0gJkN1cmxfc3NsX211bHRpKQorICAgIHJldHVybiAxOworCisgIGlmKGJhY2tlbmQpIHsKKyAgICBDdXJsX3NzbCA9IGJhY2tlbmQ7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZighYXZhaWxhYmxlX2JhY2tlbmRzWzBdKQorICAgIHJldHVybiAxOworCisgIGVudiA9IGdldGVudigiQ1VSTF9TU0xfQkFDS0VORCIpOworI2lmZGVmIENVUkxfREVGQVVMVF9TU0xfQkFDS0VORAorICBpZighZW52KQorICAgIGVudiA9IENVUkxfREVGQVVMVF9TU0xfQkFDS0VORDsKKyNlbmRpZgorICBpZihlbnYpIHsKKyAgICBmb3IoaSA9IDA7IGF2YWlsYWJsZV9iYWNrZW5kc1tpXTsgaSsrKSB7CisgICAgICBpZihzdHJjYXNlY29tcGFyZShlbnYsIGF2YWlsYWJsZV9iYWNrZW5kc1tpXS0+aW5mby5uYW1lKSkgeworICAgICAgICBDdXJsX3NzbCA9IGF2YWlsYWJsZV9iYWNrZW5kc1tpXTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogRmFsbCBiYWNrIHRvIGZpcnN0IGF2YWlsYWJsZSBiYWNrZW5kICovCisgIEN1cmxfc3NsID0gYXZhaWxhYmxlX2JhY2tlbmRzWzBdOworICByZXR1cm4gMDsKK30KKworQ1VSTHNzbHNldCBjdXJsX2dsb2JhbF9zc2xzZXQoY3VybF9zc2xiYWNrZW5kIGlkLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VybF9zc2xfYmFja2VuZCAqKiphdmFpbCkKK3sKKyAgaW50IGk7CisKKyAgaWYoQ3VybF9zc2wgIT0gJkN1cmxfc3NsX211bHRpKQorICAgIHJldHVybiBpZCA9PSBDdXJsX3NzbC0+aW5mby5pZCA/IENVUkxTU0xTRVRfT0sgOiBDVVJMU1NMU0VUX1RPT19MQVRFOworCisgIGZvcihpID0gMDsgYXZhaWxhYmxlX2JhY2tlbmRzW2ldOyBpKyspIHsKKyAgICBpZihhdmFpbGFibGVfYmFja2VuZHNbaV0tPmluZm8uaWQgPT0gaWQgfHwKKyAgICAgICAobmFtZSAmJiBzdHJjYXNlY29tcGFyZShhdmFpbGFibGVfYmFja2VuZHNbaV0tPmluZm8ubmFtZSwgbmFtZSkpKSB7CisgICAgICBtdWx0aXNzbF9pbml0KGF2YWlsYWJsZV9iYWNrZW5kc1tpXSk7CisgICAgICByZXR1cm4gQ1VSTFNTTFNFVF9PSzsKKyAgICB9CisgIH0KKworICBpZihhdmFpbCkKKyAgICAqYXZhaWwgPSAoY29uc3QgY3VybF9zc2xfYmFja2VuZCAqKikmYXZhaWxhYmxlX2JhY2tlbmRzOworICByZXR1cm4gQ1VSTFNTTFNFVF9VTktOT1dOX0JBQ0tFTkQ7Cit9CisKKyNlbHNlIC8qIFVTRV9TU0wgKi8KK0NVUkxzc2xzZXQgY3VybF9nbG9iYWxfc3Nsc2V0KGN1cmxfc3NsYmFja2VuZCBpZCwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cmxfc3NsX2JhY2tlbmQgKioqYXZhaWwpCit7CisgICh2b2lkKWlkOworICAodm9pZCluYW1lOworICAodm9pZClhdmFpbDsKKyAgcmV0dXJuIENVUkxTU0xTRVRfTk9fQkFDS0VORFM7Cit9CisKKyNlbmRpZiAvKiAhVVNFX1NTTCAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy92dGxzLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3Z0bHMuaAppbmRleCAyYWFiZWRhLi5mMWExMWVhIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3Z0bHMuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3Z0bHMuaApAQCAtNyw3ICs3LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtMjMsNiArMjMsODAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSAiY3VybF9zZXR1cC5oIgogCitzdHJ1Y3QgY29ubmVjdGRhdGE7CitzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YTsKKworc3RydWN0IEN1cmxfc3NsIHsKKyAgLyoKKyAgICogVGhpcyAqbXVzdCogYmUgdGhlIGZpcnN0IGVudHJ5IHRvIGFsbG93IHJldHVybmluZyB0aGUgbGlzdCBvZiBhdmFpbGFibGUKKyAgICogYmFja2VuZHMgaW4gY3VybF9nbG9iYWxfc3Nsc2V0KCkuCisgICAqLworICBjdXJsX3NzbF9iYWNrZW5kIGluZm87CisKKyAgdW5zaWduZWQgaGF2ZV9jYV9wYXRoOjE7ICAgICAgLyogc3VwcG9ydHMgQ0FQQVRIICovCisgIHVuc2lnbmVkIGhhdmVfY2VydGluZm86MTsgICAgIC8qIHN1cHBvcnRzIENVUkxPUFRfQ0VSVElORk8gKi8KKyAgdW5zaWduZWQgaGF2ZV9waW5uZWRwdWJrZXk6MTsgLyogc3VwcG9ydHMgQ1VSTE9QVF9QSU5ORURQVUJMSUNLRVkgKi8KKyAgdW5zaWduZWQgaGF2ZV9zc2xfY3R4OjE7ICAgICAgLyogc3VwcG9ydHMgQ1VSTE9QVF9TU0xfQ1RYXyogKi8KKworICB1bnNpZ25lZCBzdXBwb3J0X2h0dHBzX3Byb3h5OjE7IC8qIHN1cHBvcnRzIGFjY2VzcyB2aWEgSFRUUFMgcHJveGllcyAqLworCisgIHNpemVfdCBzaXplb2Zfc3NsX2JhY2tlbmRfZGF0YTsKKworICBpbnQgKCppbml0KSh2b2lkKTsKKyAgdm9pZCAoKmNsZWFudXApKHZvaWQpOworCisgIHNpemVfdCAoKnZlcnNpb24pKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworICBpbnQgKCpjaGVja19jeG4pKHN0cnVjdCBjb25uZWN0ZGF0YSAqY3huKTsKKyAgaW50ICgqc2h1dGRvd24pKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7CisgIGJvb2wgKCpkYXRhX3BlbmRpbmcpKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5pbmRleCk7CisKKyAgLyogcmV0dXJuIDAgaWYgYSBmaW5kIHJhbmRvbSBpcyBmaWxsZWQgaW4gKi8KKyAgQ1VSTGNvZGUgKCpyYW5kb20pKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsIHVuc2lnbmVkIGNoYXIgKmVudHJvcHksCisgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKKyAgYm9vbCAoKmNlcnRfc3RhdHVzX3JlcXVlc3QpKHZvaWQpOworCisgIENVUkxjb2RlICgqY29ubmVjdCkoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKKyAgQ1VSTGNvZGUgKCpjb25uZWN0X25vbmJsb2NraW5nKShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqZG9uZSk7CisgIHZvaWQgKigqZ2V0X2ludGVybmFscykoc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wsIENVUkxJTkZPIGluZm8pOworICB2b2lkICgqY2xvc2UpKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7CisgIHZvaWQgKCpjbG9zZV9hbGwpKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpOworICB2b2lkICgqc2Vzc2lvbl9mcmVlKSh2b2lkICpwdHIpOworCisgIENVUkxjb2RlICgqc2V0X2VuZ2luZSkoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgY29uc3QgY2hhciAqZW5naW5lKTsKKyAgQ1VSTGNvZGUgKCpzZXRfZW5naW5lX2RlZmF1bHQpKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpOworICBzdHJ1Y3QgY3VybF9zbGlzdCAqKCplbmdpbmVzX2xpc3QpKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpOworCisgIGJvb2wgKCpmYWxzZV9zdGFydCkodm9pZCk7CisKKyAgQ1VSTGNvZGUgKCptZDVzdW0pKHVuc2lnbmVkIGNoYXIgKmlucHV0LCBzaXplX3QgaW5wdXRsZW4sCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICptZDVzdW0sIHNpemVfdCBtZDVzdW1sZW4pOworICB2b2lkICgqc2hhMjU2c3VtKShjb25zdCB1bnNpZ25lZCBjaGFyICppbnB1dCwgc2l6ZV90IGlucHV0bGVuLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzaGEyNTZzdW0sIHNpemVfdCBzaGEyNTZzdW1sZW4pOworfTsKKworI2lmZGVmIFVTRV9TU0wKK2V4dGVybiBjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgKkN1cmxfc3NsOworI2VuZGlmCisKK2ludCBDdXJsX25vbmVfaW5pdCh2b2lkKTsKK3ZvaWQgQ3VybF9ub25lX2NsZWFudXAodm9pZCk7CitpbnQgQ3VybF9ub25lX3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7CitpbnQgQ3VybF9ub25lX2NoZWNrX2N4bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pOworQ1VSTGNvZGUgQ3VybF9ub25lX3JhbmRvbShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCB1bnNpZ25lZCBjaGFyICplbnRyb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKK3ZvaWQgQ3VybF9ub25lX2Nsb3NlX2FsbChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKTsKK3ZvaWQgQ3VybF9ub25lX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpOworYm9vbCBDdXJsX25vbmVfZGF0YV9wZW5kaW5nKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IGNvbm5pbmRleCk7Citib29sIEN1cmxfbm9uZV9jZXJ0X3N0YXR1c19yZXF1ZXN0KHZvaWQpOworQ1VSTGNvZGUgQ3VybF9ub25lX3NldF9lbmdpbmUoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgY29uc3QgY2hhciAqZW5naW5lKTsKK0NVUkxjb2RlIEN1cmxfbm9uZV9zZXRfZW5naW5lX2RlZmF1bHQoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSk7CitzdHJ1Y3QgY3VybF9zbGlzdCAqQ3VybF9ub25lX2VuZ2luZXNfbGlzdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKTsKK2Jvb2wgQ3VybF9ub25lX2ZhbHNlX3N0YXJ0KHZvaWQpOworQ1VSTGNvZGUgQ3VybF9ub25lX21kNXN1bSh1bnNpZ25lZCBjaGFyICppbnB1dCwgc2l6ZV90IGlucHV0bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICptZDVzdW0sIHNpemVfdCBtZDVsZW4pOworCiAjaW5jbHVkZSAib3BlbnNzbC5oIiAgICAgICAgLyogT3BlblNTTCB2ZXJzaW9ucyAqLwogI2luY2x1ZGUgImd0bHMuaCIgICAgICAgICAgIC8qIEdudVRMUyB2ZXJzaW9ucyAqLwogI2luY2x1ZGUgIm5zc2cuaCIgICAgICAgICAgIC8qIE5TUyB2ZXJzaW9ucyAqLwpAQCAtNDIsOCArMTE2LDggQEAKICNkZWZpbmUgTUQ1X0RJR0VTVF9MRU5HVEggMTYgLyogZml4ZWQgc2l6ZSAqLwogI2VuZGlmCiAKLSNpZm5kZWYgU0hBMjU2X0RJR0VTVF9MRU5HVEgKLSNkZWZpbmUgU0hBMjU2X0RJR0VTVF9MRU5HVEggMzIgLyogZml4ZWQgc2l6ZSAqLworI2lmbmRlZiBDVVJMX1NIQTI1Nl9ESUdFU1RfTEVOR1RICisjZGVmaW5lIENVUkxfU0hBMjU2X0RJR0VTVF9MRU5HVEggMzIgLyogZml4ZWQgc2l6ZSAqLwogI2VuZGlmCiAKIC8qIHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi10bHMtYXBwbGF5ZXJwcm90b25lZy0wNCAqLwpAQCAtMTcyLDggKzI0Niw2IEBACiAjZGVmaW5lIFNTTF9TSFVURE9XTl9USU1FT1VUIDEwMDAwIC8qIG1zICovCiAKICNlbHNlCi0vKiBTZXQgdGhlIEFQSSBiYWNrZW5kIGRlZmluaXRpb24gdG8gbm9uZSAqLwotI2RlZmluZSBDVVJMX1NTTF9CQUNLRU5EIENVUkxTU0xCQUNLRU5EX05PTkUKIAogLyogV2hlbiBTU0wgc3VwcG9ydCBpcyBub3QgcHJlc2VudCwganVzdCBkZWZpbmUgYXdheSB0aGVzZSBmdW5jdGlvbiBjYWxscyAqLwogI2RlZmluZSBDdXJsX3NzbF9pbml0KCkgMQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvd2Fybmxlc3MuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3dhcm5sZXNzLmMKaW5kZXggZmIwODVjOC4uMDVkOTAzOCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvd2Fybmxlc3MuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi93YXJubGVzcy5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC02OSwzNiArNjksMzYgQEAKICMgIGVycm9yICJTSVpFT0ZfSU5UIG5vdCBkZWZpbmVkIgogI2VuZGlmCiAKLSNpZiAoQ1VSTF9TSVpFT0ZfTE9ORyA9PSAyKQorI2lmIChTSVpFT0ZfTE9ORyA9PSAyKQogIyAgZGVmaW5lIENVUkxfTUFTS19TTE9ORyAgMHg3RkZGTAogIyAgZGVmaW5lIENVUkxfTUFTS19VTE9ORyAgMHhGRkZGVUwKLSNlbGlmIChDVVJMX1NJWkVPRl9MT05HID09IDQpCisjZWxpZiAoU0laRU9GX0xPTkcgPT0gNCkKICMgIGRlZmluZSBDVVJMX01BU0tfU0xPTkcgIDB4N0ZGRkZGRkZMCiAjICBkZWZpbmUgQ1VSTF9NQVNLX1VMT05HICAweEZGRkZGRkZGVUwKLSNlbGlmIChDVVJMX1NJWkVPRl9MT05HID09IDgpCisjZWxpZiAoU0laRU9GX0xPTkcgPT0gOCkKICMgIGRlZmluZSBDVVJMX01BU0tfU0xPTkcgIDB4N0ZGRkZGRkZGRkZGRkZGRkwKICMgIGRlZmluZSBDVVJMX01BU0tfVUxPTkcgIDB4RkZGRkZGRkZGRkZGRkZGRlVMCi0jZWxpZiAoQ1VSTF9TSVpFT0ZfTE9ORyA9PSAxNikKKyNlbGlmIChTSVpFT0ZfTE9ORyA9PSAxNikKICMgIGRlZmluZSBDVVJMX01BU0tfU0xPTkcgIDB4N0ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZMCiAjICBkZWZpbmUgQ1VSTF9NQVNLX1VMT05HICAweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGVUwKICNlbHNlCi0jICBlcnJvciAiQ1VSTF9TSVpFT0ZfTE9ORyBub3QgZGVmaW5lZCIKKyMgIGVycm9yICJTSVpFT0ZfTE9ORyBub3QgZGVmaW5lZCIKICNlbmRpZgogCi0jaWYgKENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgPT0gMikKKyNpZiAoU0laRU9GX0NVUkxfT0ZGX1QgPT0gMikKICMgIGRlZmluZSBDVVJMX01BU0tfU0NPRkZUICBDVVJMX09GRl9UX0MoMHg3RkZGKQogIyAgZGVmaW5lIENVUkxfTUFTS19VQ09GRlQgIENVUkxfT0ZGX1RVX0MoMHhGRkZGKQotI2VsaWYgKENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgPT0gNCkKKyNlbGlmIChTSVpFT0ZfQ1VSTF9PRkZfVCA9PSA0KQogIyAgZGVmaW5lIENVUkxfTUFTS19TQ09GRlQgIENVUkxfT0ZGX1RfQygweDdGRkZGRkZGKQogIyAgZGVmaW5lIENVUkxfTUFTS19VQ09GRlQgIENVUkxfT0ZGX1RVX0MoMHhGRkZGRkZGRikKLSNlbGlmIChDVVJMX1NJWkVPRl9DVVJMX09GRl9UID09IDgpCisjZWxpZiAoU0laRU9GX0NVUkxfT0ZGX1QgPT0gOCkKICMgIGRlZmluZSBDVVJMX01BU0tfU0NPRkZUICBDVVJMX09GRl9UX0MoMHg3RkZGRkZGRkZGRkZGRkZGKQogIyAgZGVmaW5lIENVUkxfTUFTS19VQ09GRlQgIENVUkxfT0ZGX1RVX0MoMHhGRkZGRkZGRkZGRkZGRkZGKQotI2VsaWYgKENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgPT0gMTYpCisjZWxpZiAoU0laRU9GX0NVUkxfT0ZGX1QgPT0gMTYpCiAjICBkZWZpbmUgQ1VSTF9NQVNLX1NDT0ZGVCAgQ1VSTF9PRkZfVF9DKDB4N0ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYpCiAjICBkZWZpbmUgQ1VSTF9NQVNLX1VDT0ZGVCAgQ1VSTF9PRkZfVFVfQygweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGKQogI2Vsc2UKLSMgIGVycm9yICJDVVJMX1NJWkVPRl9DVVJMX09GRl9UIG5vdCBkZWZpbmVkIgorIyAgZXJyb3IgIlNJWkVPRl9DVVJMX09GRl9UIG5vdCBkZWZpbmVkIgogI2VuZGlmCiAKICNpZiAoU0laRU9GX1NJWkVfVCA9PSBTSVpFT0ZfU0hPUlQpCkBAIC0xMDcsMTAgKzEwNywxMCBAQAogI2VsaWYgKFNJWkVPRl9TSVpFX1QgPT0gU0laRU9GX0lOVCkKICMgIGRlZmluZSBDVVJMX01BU0tfU1NJWkVfVCAgQ1VSTF9NQVNLX1NJTlQKICMgIGRlZmluZSBDVVJMX01BU0tfVVNJWkVfVCAgQ1VSTF9NQVNLX1VJTlQKLSNlbGlmIChTSVpFT0ZfU0laRV9UID09IENVUkxfU0laRU9GX0xPTkcpCisjZWxpZiAoU0laRU9GX1NJWkVfVCA9PSBTSVpFT0ZfTE9ORykKICMgIGRlZmluZSBDVVJMX01BU0tfU1NJWkVfVCAgQ1VSTF9NQVNLX1NMT05HCiAjICBkZWZpbmUgQ1VSTF9NQVNLX1VTSVpFX1QgIENVUkxfTUFTS19VTE9ORwotI2VsaWYgKFNJWkVPRl9TSVpFX1QgPT0gQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCkKKyNlbGlmIChTSVpFT0ZfU0laRV9UID09IFNJWkVPRl9DVVJMX09GRl9UKQogIyAgZGVmaW5lIENVUkxfTUFTS19TU0laRV9UICBDVVJMX01BU0tfU0NPRkZUCiAjICBkZWZpbmUgQ1VSTF9NQVNLX1VTSVpFX1QgIENVUkxfTUFTS19VQ09GRlQKICNlbHNlCkBAIC0yMjYsNyArMjI2LDcgQEAKICMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo4MTApIC8qIGNvbnZlcnNpb24gbWF5IGxvc2Ugc2lnbmlmaWNhbnQgYml0cyAqLwogI2VuZGlmCiAKLSNpZiAoQ1VSTF9TSVpFT0ZfTE9ORyA8IFNJWkVPRl9TSVpFX1QpCisjaWYgKFNJWkVPRl9MT05HIDwgU0laRU9GX1NJWkVfVCkKICAgREVCVUdBU1NFUlQodXpudW0gPD0gKHNpemVfdCkgQ1VSTF9NQVNLX1VMT05HKTsKICNlbmRpZgogICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpKHV6bnVtICYgKHNpemVfdCkgQ1VSTF9NQVNLX1VMT05HKTsKQEAgLTI2OSw3ICsyNjksNyBAQAogI2VuZGlmCiAKICAgREVCVUdBU1NFUlQoc2xudW0gPj0gMCk7Ci0jaWYgKFNJWkVPRl9JTlQgPCBDVVJMX1NJWkVPRl9MT05HKQorI2lmIChTSVpFT0ZfSU5UIDwgU0laRU9GX0xPTkcpCiAgIERFQlVHQVNTRVJUKCh1bnNpZ25lZCBsb25nKSBzbG51bSA8PSAodW5zaWduZWQgbG9uZykgQ1VSTF9NQVNLX1NJTlQpOwogI2VuZGlmCiAgIHJldHVybiAoaW50KShzbG51bSAmIChsb25nKSBDVVJMX01BU0tfU0lOVCk7CkBAIC0yOTEsNyArMjkxLDcgQEAKICNlbmRpZgogCiAgIERFQlVHQVNTRVJUKHNsbnVtID49IDApOwotI2lmIChTSVpFT0ZfSU5UIDwgQ1VSTF9TSVpFT0ZfTE9ORykKKyNpZiAoU0laRU9GX0lOVCA8IFNJWkVPRl9MT05HKQogICBERUJVR0FTU0VSVCgodW5zaWduZWQgbG9uZykgc2xudW0gPD0gKHVuc2lnbmVkIGxvbmcpIENVUkxfTUFTS19VSU5UKTsKICNlbmRpZgogICByZXR1cm4gKHVuc2lnbmVkIGludCkoc2xudW0gJiAobG9uZykgQ1VSTF9NQVNLX1VJTlQpOwo=