LyoKICogU2VydmVyLXNpZGUgc29ja2V0IG1hbmFnZW1lbnQKICoKICogQ29weXJpZ2h0IChDKSAxOTk5IE1hcmN1cyBNZWlzc25lciwgT3ZlIEvldmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKgogKiBGSVhNRTogd2UgdXNlIHJlYWR8d3JpdGUgYWNjZXNzIGluIGFsbCBjYXNlcy4gU2hvdWxkbid0IHdlIGRlcGVuZCB0aGF0CiAqIG9uIHRoZSBhY2Nlc3Mgb2YgdGhlIGN1cnJlbnQgaGFuZGxlPwogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2lmZGVmIEhBVkVfU1lTX0VSUk5PX0gKIyBpbmNsdWRlIDxzeXMvZXJybm8uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAojIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19JT0NUTF9ICiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19GSUxJT19ICiMgaW5jbHVkZSA8c3lzL2ZpbGlvLmg+CiNlbmRpZgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojaW5jbHVkZSAibnRzdGF0dXMuaCIKI2RlZmluZSBXSU4zMl9OT19TVEFUVVMKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2ludGVybmwuaCIKCiNpbmNsdWRlICJwcm9jZXNzLmgiCiNpbmNsdWRlICJmaWxlLmgiCiNpbmNsdWRlICJoYW5kbGUuaCIKI2luY2x1ZGUgInRocmVhZC5oIgojaW5jbHVkZSAicmVxdWVzdC5oIgojaW5jbHVkZSAidXNlci5oIgoKLyogVG8gYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIFVuaXggc29ja2V0IGhlYWRlcnMuIFBsdXMgd2Ugb25seSBuZWVkIGEgZmV3CiAqIG1hY3JvcyBhbnl3YXkuCiAqLwojZGVmaW5lIFVTRV9XU19QUkVGSVgKI2luY2x1ZGUgIndpbnNvY2syLmgiCgpzdHJ1Y3Qgc29jawp7CiAgICBzdHJ1Y3Qgb2JqZWN0ICAgICAgIG9iajsgICAgICAgICAvKiBvYmplY3QgaGVhZGVyICovCiAgICBzdHJ1Y3QgZmQgICAgICAgICAgKmZkOyAgICAgICAgICAvKiBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIHN0YXRlOyAgICAgICAvKiBzdGF0dXMgYml0cyAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBtYXNrOyAgICAgICAgLyogZXZlbnQgbWFzayAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBobWFzazsgICAgICAgLyogaGVsZCAoYmxvY2tlZCkgZXZlbnRzICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIHBtYXNrOyAgICAgICAvKiBwZW5kaW5nIGV2ZW50cyAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBmbGFnczsgICAgICAgLyogc29ja2V0IGZsYWdzICovCiAgICBpbnQgICAgICAgICAgICAgICAgIHBvbGxpbmc7ICAgICAvKiBpcyBzb2NrZXQgYmVpbmcgcG9sbGVkPyAqLwogICAgdW5zaWduZWQgc2hvcnQgICAgICB0eXBlOyAgICAgICAgLyogc29ja2V0IHR5cGUgKi8KICAgIHVuc2lnbmVkIHNob3J0ICAgICAgZmFtaWx5OyAgICAgIC8qIHNvY2tldCBmYW1pbHkgKi8KICAgIHN0cnVjdCBldmVudCAgICAgICAqZXZlbnQ7ICAgICAgIC8qIGV2ZW50IG9iamVjdCAqLwogICAgdXNlcl9oYW5kbGVfdCAgICAgICB3aW5kb3c7ICAgICAgLyogd2luZG93IHRvIHNlbmQgdGhlIG1lc3NhZ2UgdG8gKi8KICAgIHVuc2lnbmVkIGludCAgICAgICAgbWVzc2FnZTsgICAgIC8qIG1lc3NhZ2UgdG8gc2VuZCAqLwogICAgb2JqX2hhbmRsZV90ICAgICAgICB3cGFyYW07ICAgICAgLyogbWVzc2FnZSB3cGFyYW0gKHNvY2tldCBoYW5kbGUpICovCiAgICBpbnQgICAgICAgICAgICAgICAgIGVycm9yc1tGRF9NQVhfRVZFTlRTXTsgLyogZXZlbnQgZXJyb3JzICovCiAgICBzdHJ1Y3Qgc29jayAgICAgICAgKmRlZmVycmVkOyAgICAvKiBzb2NrZXQgdGhhdCB3YWl0cyBmb3IgYSBkZWZlcnJlZCBhY2NlcHQgKi8KICAgIHN0cnVjdCBhc3luY19xdWV1ZSAqcmVhZF9xOyAgICAgIC8qIHF1ZXVlIGZvciBhc3luY2hyb25vdXMgcmVhZHMgKi8KICAgIHN0cnVjdCBhc3luY19xdWV1ZSAqd3JpdGVfcTsgICAgIC8qIHF1ZXVlIGZvciBhc3luY2hyb25vdXMgd3JpdGVzICovCn07CgpzdGF0aWMgdm9pZCBzb2NrX2R1bXAoIHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHZlcmJvc2UgKTsKc3RhdGljIGludCBzb2NrX3NpZ25hbGVkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApOwpzdGF0aWMgc3RydWN0IGZkICpzb2NrX2dldF9mZCggc3RydWN0IG9iamVjdCAqb2JqICk7CnN0YXRpYyB2b2lkIHNvY2tfZGVzdHJveSggc3RydWN0IG9iamVjdCAqb2JqICk7CgpzdGF0aWMgaW50IHNvY2tfZ2V0X3BvbGxfZXZlbnRzKCBzdHJ1Y3QgZmQgKmZkICk7CnN0YXRpYyB2b2lkIHNvY2tfcG9sbF9ldmVudCggc3RydWN0IGZkICpmZCwgaW50IGV2ZW50ICk7CnN0YXRpYyBlbnVtIHNlcnZlcl9mZF90eXBlIHNvY2tfZ2V0X2ZkX3R5cGUoIHN0cnVjdCBmZCAqZmQgKTsKc3RhdGljIHZvaWQgc29ja19xdWV1ZV9hc3luYyggc3RydWN0IGZkICpmZCwgY29uc3QgYXN5bmNfZGF0YV90ICpkYXRhLCBpbnQgdHlwZSwgaW50IGNvdW50ICk7CnN0YXRpYyB2b2lkIHNvY2tfcmVzZWxlY3RfYXN5bmMoIHN0cnVjdCBmZCAqZmQsIHN0cnVjdCBhc3luY19xdWV1ZSAqcXVldWUgKTsKc3RhdGljIHZvaWQgc29ja19jYW5jZWxfYXN5bmMoIHN0cnVjdCBmZCAqZmQgKTsKCnN0YXRpYyBpbnQgc29ja19nZXRfZXJyb3IoIGludCBlcnIgKTsKc3RhdGljIHZvaWQgc29ja19zZXRfZXJyb3Iodm9pZCk7CgpzdGF0aWMgY29uc3Qgc3RydWN0IG9iamVjdF9vcHMgc29ja19vcHMgPQp7CiAgICBzaXplb2Yoc3RydWN0IHNvY2spLCAgICAgICAgICAvKiBzaXplICovCiAgICBzb2NrX2R1bXAsICAgICAgICAgICAgICAgICAgICAvKiBkdW1wICovCiAgICBhZGRfcXVldWUsICAgICAgICAgICAgICAgICAgICAvKiBhZGRfcXVldWUgKi8KICAgIHJlbW92ZV9xdWV1ZSwgICAgICAgICAgICAgICAgIC8qIHJlbW92ZV9xdWV1ZSAqLwogICAgc29ja19zaWduYWxlZCwgICAgICAgICAgICAgICAgLyogc2lnbmFsZWQgKi8KICAgIG5vX3NhdGlzZmllZCwgICAgICAgICAgICAgICAgIC8qIHNhdGlzZmllZCAqLwogICAgbm9fc2lnbmFsLCAgICAgICAgICAgICAgICAgICAgLyogc2lnbmFsICovCiAgICBzb2NrX2dldF9mZCwgICAgICAgICAgICAgICAgICAvKiBnZXRfZmQgKi8KICAgIGRlZmF1bHRfZmRfbWFwX2FjY2VzcywgICAgICAgIC8qIG1hcF9hY2Nlc3MgKi8KICAgIGRlZmF1bHRfZ2V0X3NkLCAgICAgICAgICAgICAgIC8qIGdldF9zZCAqLwogICAgZGVmYXVsdF9zZXRfc2QsICAgICAgICAgICAgICAgLyogc2V0X3NkICovCiAgICBub19sb29rdXBfbmFtZSwgICAgICAgICAgICAgICAvKiBsb29rdXBfbmFtZSAqLwogICAgbm9fb3Blbl9maWxlLCAgICAgICAgICAgICAgICAgLyogb3Blbl9maWxlICovCiAgICBmZF9jbG9zZV9oYW5kbGUsICAgICAgICAgICAgICAvKiBjbG9zZV9oYW5kbGUgKi8KICAgIHNvY2tfZGVzdHJveSAgICAgICAgICAgICAgICAgIC8qIGRlc3Ryb3kgKi8KfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgZmRfb3BzIHNvY2tfZmRfb3BzID0KewogICAgc29ja19nZXRfcG9sbF9ldmVudHMsICAgICAgICAgLyogZ2V0X3BvbGxfZXZlbnRzICovCiAgICBzb2NrX3BvbGxfZXZlbnQsICAgICAgICAgICAgICAvKiBwb2xsX2V2ZW50ICovCiAgICBub19mbHVzaCwgICAgICAgICAgICAgICAgICAgICAvKiBmbHVzaCAqLwogICAgc29ja19nZXRfZmRfdHlwZSwgICAgICAgICAgICAgLyogZ2V0X2ZpbGVfaW5mbyAqLwogICAgZGVmYXVsdF9mZF9pb2N0bCwgICAgICAgICAgICAgLyogaW9jdGwgKi8KICAgIHNvY2tfcXVldWVfYXN5bmMsICAgICAgICAgICAgIC8qIHF1ZXVlX2FzeW5jICovCiAgICBzb2NrX3Jlc2VsZWN0X2FzeW5jLCAgICAgICAgICAvKiByZXNlbGVjdF9hc3luYyAqLwogICAgc29ja19jYW5jZWxfYXN5bmMgICAgICAgICAgICAgLyogY2FuY2VsX2FzeW5jICovCn07CgoKLyogUGVybXV0YXRpb24gb2YgMC4uRkRfTUFYX0VWRU5UUyAtIDEgcmVwcmVzZW50aW5nIHRoZSBvcmRlciBpbiB3aGljaAogKiB3ZSBwb3N0IG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBldmVudHMuICBVc2VkIHRvIHNlbmQKICogbWVzc2FnZXMuICBUaGUgcHJvYmxlbSBpcyBpZiB0aGVyZSBpcyBib3RoIGEgRkRfQ09OTkVDVCBldmVudCBhbmQsCiAqIHNheSwgYW4gRkRfUkVBRCBldmVudCBhdmFpbGFibGUgb24gdGhlIHNhbWUgc29ja2V0LCB3ZSB3YW50IHRvCiAqIG5vdGlmeSB0aGUgYXBwIG9mIHRoZSBjb25uZWN0IGV2ZW50IGZpcnN0LiAgT3RoZXJ3aXNlIGl0IG1heQogKiBkaXNjYXJkIHRoZSByZWFkIGV2ZW50IGJlY2F1c2UgaXQgdGhpbmtzIGl0IGhhc24ndCBjb25uZWN0ZWQgeWV0LgogKi8Kc3RhdGljIGNvbnN0IGludCBldmVudF9iaXRvcmRlcltGRF9NQVhfRVZFTlRTXSA9CnsKICAgIEZEX0NPTk5FQ1RfQklULAogICAgRkRfQUNDRVBUX0JJVCwKICAgIEZEX09PQl9CSVQsCiAgICBGRF9XUklURV9CSVQsCiAgICBGRF9SRUFEX0JJVCwKICAgIEZEX0NMT1NFX0JJVCwKICAgIDYsIDcsIDgsIDkgIC8qIGxlZnRvdmVycyAqLwp9OwoKLyogRmxhZ3MgdGhhdCBtYWtlIHNlbnNlIG9ubHkgZm9yIFNPQ0tfU1RSRUFNIHNvY2tldHMgKi8KI2RlZmluZSBTVFJFQU1fRkxBR19NQVNLICgodW5zaWduZWQgaW50KSAoRkRfQ09OTkVDVCB8IEZEX0FDQ0VQVCB8IEZEX1dJTkVfTElTVEVOSU5HIHwgRkRfV0lORV9DT05ORUNURUQpKQoKdHlwZWRlZiBlbnVtIHsKICAgIFNPQ0tfU0hVVERPV05fRVJST1IgPSAtMSwKICAgIFNPQ0tfU0hVVERPV05fRU9GID0gMCwKICAgIFNPQ0tfU0hVVERPV05fUE9MTEhVUCA9IDEKfSBzb2NrX3NodXRkb3duX3Q7CgpzdGF0aWMgc29ja19zaHV0ZG93bl90IHNvY2tfc2h1dGRvd25fdHlwZSA9IFNPQ0tfU0hVVERPV05fRVJST1I7CgpzdGF0aWMgc29ja19zaHV0ZG93bl90IHNvY2tfY2hlY2tfcG9sbGh1cCh2b2lkKQp7CiAgICBzb2NrX3NodXRkb3duX3QgcmV0ID0gU09DS19TSFVURE9XTl9FUlJPUjsKICAgIGludCBmZFsyXSwgbjsKICAgIHN0cnVjdCBwb2xsZmQgcGZkOwogICAgY2hhciBkdW1teTsKCiAgICBpZiAoIHNvY2tldHBhaXIoIEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBmZCApICkgZ290byBvdXQ7CiAgICBpZiAoIHNodXRkb3duKCBmZFswXSwgMSApICkgZ290byBvdXQ7CgogICAgcGZkLmZkID0gZmRbMV07CiAgICBwZmQuZXZlbnRzID0gUE9MTElOOwogICAgcGZkLnJldmVudHMgPSAwOwoKICAgIG4gPSBwb2xsKCAmcGZkLCAxLCAwICk7CiAgICBpZiAoIG4gIT0gMSApIGdvdG8gb3V0OyAvKiBlcnJvciBvciB0aW1lb3V0ICovCiAgICBpZiAoIHBmZC5yZXZlbnRzICYgUE9MTEhVUCApCiAgICAgICAgcmV0ID0gU09DS19TSFVURE9XTl9QT0xMSFVQOwogICAgZWxzZSBpZiAoIHBmZC5yZXZlbnRzICYgUE9MTElOICYmCiAgICAgICAgICAgICAgcmVhZCggZmRbMV0sICZkdW1teSwgMSApID09IDAgKQogICAgICAgIHJldCA9IFNPQ0tfU0hVVERPV05fRU9GOwoKb3V0OgogICAgY2xvc2UoIGZkWzBdICk7CiAgICBjbG9zZSggZmRbMV0gKTsKICAgIHJldHVybiByZXQ7Cn0KCnZvaWQgc29ja19pbml0KHZvaWQpCnsKICAgIHNvY2tfc2h1dGRvd25fdHlwZSA9IHNvY2tfY2hlY2tfcG9sbGh1cCgpOwoKICAgIHN3aXRjaCAoIHNvY2tfc2h1dGRvd25fdHlwZSApCiAgICB7CiAgICBjYXNlIFNPQ0tfU0hVVERPV05fRU9GOgogICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgZnByaW50Ziggc3RkZXJyLCAic29ja19pbml0OiBzaHV0ZG93bigpIGNhdXNlcyBFT0ZcbiIgKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgU09DS19TSFVURE9XTl9QT0xMSFVQOgogICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgZnByaW50Ziggc3RkZXJyLCAic29ja19pbml0OiBzaHV0ZG93bigpIGNhdXNlcyBQT0xMSFVQXG4iICk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGZwcmludGYoIHN0ZGVyciwgInNvY2tfaW5pdDogRVJST1IgaW4gc29ja19jaGVja19wb2xsaHVwKClcbiIgKTsKICAgICAgICBzb2NrX3NodXRkb3duX3R5cGUgPSBTT0NLX1NIVVRET1dOX0VPRjsKICAgIH0KfQoKc3RhdGljIGludCBzb2NrX3Jlc2VsZWN0KCBzdHJ1Y3Qgc29jayAqc29jayApCnsKICAgIGludCBldiA9IHNvY2tfZ2V0X3BvbGxfZXZlbnRzKCBzb2NrLT5mZCApOwoKICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICBmcHJpbnRmKHN0ZGVyciwic29ja19yZXNlbGVjdCglcCk6IG5ldyBtYXNrICV4XG4iLCBzb2NrLCBldik7CgogICAgaWYgKCFzb2NrLT5wb2xsaW5nKSAgLyogRklYTUU6IHNob3VsZCBmaW5kIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzICovCiAgICB7CiAgICAgICAgLyogcHJldmlvdXNseSB1bmNvbm5lY3RlZCBzb2NrZXQsIGlzIHRoaXMgcmVzZWxlY3Qgc3VwcG9zZWQgdG8gY29ubmVjdCBpdD8gKi8KICAgICAgICBpZiAoIShzb2NrLT5zdGF0ZSAmIH5GRF9XSU5FX05PTkJMT0NLSU5HKSkgcmV0dXJuIDA7CiAgICAgICAgLyogb2ssIGl0IGlzLCBhdHRhY2ggaXQgdG8gdGhlIHdpbmVzZXJ2ZXIncyBtYWluIHBvbGwgbG9vcCAqLwogICAgICAgIHNvY2stPnBvbGxpbmcgPSAxOwogICAgfQogICAgLyogdXBkYXRlIGNvbmRpdGlvbiBtYXNrICovCiAgICBzZXRfZmRfZXZlbnRzKCBzb2NrLT5mZCwgZXYgKTsKICAgIHJldHVybiBldjsKfQoKLyogQWZ0ZXIgUE9MTEhVUCBpcyByZWNlaXZlZCwgdGhlIHNvY2tldCB3aWxsIG5vIGxvbmdlciBiZSBpbiB0aGUgbWFpbiBzZWxlY3QgbG9vcC4KICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNpZ25hbCBwZW5kaW5nIGV2ZW50cyBuZXZlcnRoZWxlc3MgKi8Kc3RhdGljIHZvaWQgc29ja190cnlfZXZlbnQoIHN0cnVjdCBzb2NrICpzb2NrLCBpbnQgZXZlbnQgKQp7CiAgICBldmVudCA9IGNoZWNrX2ZkX2V2ZW50cyggc29jay0+ZmQsIGV2ZW50ICk7CiAgICBpZiAoZXZlbnQpCiAgICB7CiAgICAgICAgaWYgKCBkZWJ1Z19sZXZlbCApIGZwcmludGYoIHN0ZGVyciwgInNvY2tfdHJ5X2V2ZW50OiAleFxuIiwgZXZlbnQgKTsKICAgICAgICBzb2NrX3BvbGxfZXZlbnQoIHNvY2stPmZkLCBldmVudCApOwogICAgfQp9CgovKiB3YWtlIGFueWJvZHkgd2FpdGluZyBvbiB0aGUgc29ja2V0IGV2ZW50IG9yIHNlbmQgdGhlIGFzc29jaWF0ZWQgbWVzc2FnZSAqLwpzdGF0aWMgdm9pZCBzb2NrX3dha2VfdXAoIHN0cnVjdCBzb2NrICpzb2NrLCBpbnQgcG9sbGV2ICkKewogICAgdW5zaWduZWQgaW50IGV2ZW50cyA9IHNvY2stPnBtYXNrICYgc29jay0+bWFzazsKICAgIGludCBpOwogICAgaW50IGFzeW5jX2FjdGl2ZSA9IDA7CgogICAgaWYgKCBwb2xsZXYgJiAoUE9MTElOfFBPTExQUkkpICYmIGFzeW5jX3dhaXRpbmcoIHNvY2stPnJlYWRfcSApKQogICAgewogICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgZnByaW50Ziggc3RkZXJyLCAiYWN0aXZhdGluZyByZWFkIHF1ZXVlIGZvciBzb2NrZXQgJXBcbiIsIHNvY2sgKTsKICAgICAgICBhc3luY193YWtlX3VwKCBzb2NrLT5yZWFkX3EsIFNUQVRVU19BTEVSVEVEICk7CiAgICAgICAgYXN5bmNfYWN0aXZlID0gMTsKICAgIH0KICAgIGlmICggcG9sbGV2ICYgUE9MTE9VVCAmJiBhc3luY193YWl0aW5nKCBzb2NrLT53cml0ZV9xICkpCiAgICB7CiAgICAgICAgaWYgKGRlYnVnX2xldmVsKSBmcHJpbnRmKCBzdGRlcnIsICJhY3RpdmF0aW5nIHdyaXRlIHF1ZXVlIGZvciBzb2NrZXQgJXBcbiIsIHNvY2sgKTsKICAgICAgICBhc3luY193YWtlX3VwKCBzb2NrLT53cml0ZV9xLCBTVEFUVVNfQUxFUlRFRCApOwogICAgICAgIGFzeW5jX2FjdGl2ZSA9IDE7CiAgICB9CgogICAgLyogRG8gbm90IHNpZ25hbCBldmVudHMgaWYgdGhlcmUgYXJlIHN0aWxsIHBlbmRpbmcgYXN5bmNocm9ub3VzIElPIHJlcXVlc3RzICovCiAgICAvKiBXZSBuZWVkIHRoaXMgdG8gZGVsYXkgRkRfQ0xPU0UgZXZlbnRzIHVudGlsIGFsbCBwZW5kaW5nIG92ZXJsYXBwZWQgcmVxdWVzdHMgYXJlIHByb2Nlc3NlZCAqLwogICAgaWYgKCAhZXZlbnRzIHx8IGFzeW5jX2FjdGl2ZSApIHJldHVybjsKCiAgICBpZiAoc29jay0+ZXZlbnQpCiAgICB7CiAgICAgICAgaWYgKGRlYnVnX2xldmVsKSBmcHJpbnRmKHN0ZGVyciwgInNpZ25hbGxpbmcgZXZlbnRzICV4IHB0ciAlcFxuIiwgZXZlbnRzLCBzb2NrLT5ldmVudCApOwogICAgICAgIHNldF9ldmVudCggc29jay0+ZXZlbnQgKTsKICAgIH0KICAgIGlmIChzb2NrLT53aW5kb3cpCiAgICB7CiAgICAgICAgaWYgKGRlYnVnX2xldmVsKSBmcHJpbnRmKHN0ZGVyciwgInNpZ25hbGxpbmcgZXZlbnRzICV4IHdpbiAlcFxuIiwgZXZlbnRzLCBzb2NrLT53aW5kb3cgKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRkRfTUFYX0VWRU5UUzsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaW50IGV2ZW50ID0gZXZlbnRfYml0b3JkZXJbaV07CiAgICAgICAgICAgIGlmIChzb2NrLT5wbWFzayAmICgxIDw8IGV2ZW50KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxwYXJhbSA9ICgxIDw8IGV2ZW50KSB8IChzb2NrLT5lcnJvcnNbZXZlbnRdIDw8IDE2KTsKICAgICAgICAgICAgICAgIHBvc3RfbWVzc2FnZSggc29jay0+d2luZG93LCBzb2NrLT5tZXNzYWdlLCAodW5zaWduZWQgbG9uZylzb2NrLT53cGFyYW0sIGxwYXJhbSApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNvY2stPnBtYXNrID0gMDsKICAgICAgICBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICB9Cn0KCnN0YXRpYyBpbmxpbmUgaW50IHNvY2tfZXJyb3IoIHN0cnVjdCBmZCAqZmQgKQp7CiAgICB1bnNpZ25lZCBpbnQgb3B0dmFsID0gMCwgb3B0bGVuOwoKICAgIG9wdGxlbiA9IHNpemVvZihvcHR2YWwpOwogICAgZ2V0c29ja29wdCggZ2V0X3VuaXhfZmQoZmQpLCBTT0xfU09DS0VULCBTT19FUlJPUiwgKHZvaWQgKikgJm9wdHZhbCwgJm9wdGxlbik7CiAgICByZXR1cm4gb3B0dmFsID8gc29ja19nZXRfZXJyb3Iob3B0dmFsKSA6IDA7Cn0KCnN0YXRpYyB2b2lkIHNvY2tfcG9sbF9ldmVudCggc3RydWN0IGZkICpmZCwgaW50IGV2ZW50ICkKewogICAgc3RydWN0IHNvY2sgKnNvY2sgPSBnZXRfZmRfdXNlciggZmQgKTsKICAgIGludCBoYW5ndXBfc2VlbiA9IDA7CgogICAgYXNzZXJ0KCBzb2NrLT5vYmoub3BzID09ICZzb2NrX29wcyApOwogICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVwIHNlbGVjdCBldmVudDogJXhcbiIsIHNvY2ssIGV2ZW50KTsKICAgIGlmIChzb2NrLT5zdGF0ZSAmIEZEX0NPTk5FQ1QpCiAgICB7CiAgICAgICAgLyogY29ubmVjdGluZyAqLwogICAgICAgIGlmIChldmVudCAmIFBPTExPVVQpCiAgICAgICAgewogICAgICAgICAgICAvKiB3ZSBnb3QgY29ubmVjdGVkICovCiAgICAgICAgICAgIHNvY2stPnN0YXRlIHw9IEZEX1dJTkVfQ09OTkVDVEVEfEZEX1JFQUR8RkRfV1JJVEU7CiAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH5GRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQ09OTkVDVF9CSVRdID0gMDsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJXAgY29ubmVjdGlvbiBzdWNjZXNzXG4iLCBzb2NrKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXZlbnQgJiAoUE9MTEVSUnxQT0xMSFVQKSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIHdlIGRpZG4ndCBnZXQgY29ubmVjdGVkPyAqLwogICAgICAgICAgICBzb2NrLT5zdGF0ZSAmPSB+RkRfQ09OTkVDVDsKICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQ09OTkVDVDsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX0NPTk5FQ1RfQklUXSA9IHNvY2tfZXJyb3IoIGZkICk7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVwIGNvbm5lY3Rpb24gZmFpbHVyZVxuIiwgc29jayk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoc29jay0+c3RhdGUgJiBGRF9XSU5FX0xJU1RFTklORykKICAgIHsKICAgICAgICAvKiBsaXN0ZW5pbmcgKi8KICAgICAgICBpZiAoZXZlbnQgJiBQT0xMSU4pCiAgICAgICAgewogICAgICAgICAgICAvKiBpbmNvbWluZyBjb25uZWN0aW9uICovCiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0FDQ0VQVDsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX0FDQ0VQVF9CSVRdID0gMDsKICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChldmVudCAmIChQT0xMRVJSfFBPTExIVVApKQogICAgICAgIHsKICAgICAgICAgICAgLyogZmFpbGVkIGluY29taW5nIGNvbm5lY3Rpb24/ICovCiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0FDQ0VQVDsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX0FDQ0VQVF9CSVRdID0gc29ja19lcnJvciggZmQgKTsKICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvKiBub3JtYWwgZGF0YSBmbG93ICovCiAgICAgICAgaWYgKCBzb2NrLT50eXBlID09IFNPQ0tfU1RSRUFNICYmICggZXZlbnQgJiBQT0xMSU4gKSApCiAgICAgICAgewogICAgICAgICAgICBjaGFyIGR1bW15OwogICAgICAgICAgICBpbnQgbnI7CgogICAgICAgICAgICAvKiBMaW51eCAyLjQgZG9lc24ndCByZXBvcnQgUE9MTEhVUCBpZiBvbmx5IG9uZSBzaWRlIG9mIHRoZSBzb2NrZXQKICAgICAgICAgICAgICogaGFzIGJlZW4gY2xvc2VkLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGZvciBpdCBleHBsaWNpdGx5IGhlcmUgKi8KICAgICAgICAgICAgbnIgID0gcmVjdiggZ2V0X3VuaXhfZmQoIGZkICksICZkdW1teSwgMSwgTVNHX1BFRUsgKTsKICAgICAgICAgICAgaWYgKCBuciA+IDAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBpbmNvbWluZyBkYXRhICovCiAgICAgICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9SRUFEOwogICAgICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gKEZEX1JFQUR8RkRfQ0xPU0UpOwogICAgICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX1JFQURfQklUXSA9IDA7CiAgICAgICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJXAgaXMgcmVhZGFibGVcbiIsIHNvY2sgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICggbnIgPT0gMCApCiAgICAgICAgICAgICAgICBoYW5ndXBfc2VlbiA9IDE7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogRUFHQUlOIGNhbiBoYXBwZW4gaWYgYW4gYXN5bmMgcmVjdigpIGZhbGxzIGJldHdlZW4gdGhlIHNlcnZlcidzIHBvbGwoKQogICAgICAgICAgICAgICAgICAgY2FsbCBhbmQgdGhlIGludm9jYXRpb24gb2YgdGhpcyByb3V0aW5lICovCiAgICAgICAgICAgICAgICBpZiAoIGVycm5vID09IEVBR0FJTiApCiAgICAgICAgICAgICAgICAgICAgZXZlbnQgJj0gflBPTExJTjsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlYnVnX2xldmVsICkKICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAicmVjdiBlcnJvciBvbiBzb2NrZXQgJXA6ICVkXG4iLCBzb2NrLCBlcnJubyApOwogICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gUE9MTEVSUjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoIHNvY2tfc2h1dGRvd25fdHlwZSA9PSBTT0NLX1NIVVRET1dOX1BPTExIVVAgJiYgKGV2ZW50ICYgUE9MTEhVUCkgKQogICAgICAgIHsKICAgICAgICAgICAgaGFuZ3VwX3NlZW4gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICggZXZlbnQgJiBQT0xMSU4gKSAvKiBQT0xMSU4gZm9yIG5vbi1zdHJlYW0gc29ja2V0ICovCiAgICAgICAgewogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9SRUFEOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSAoRkRfUkVBRHxGRF9DTE9TRSk7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9SRUFEX0JJVF0gPSAwOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlcCBpcyByZWFkYWJsZVxuIiwgc29jayApOwoKICAgICAgICB9CgogICAgICAgIGlmIChldmVudCAmIFBPTExPVVQpCiAgICAgICAgewogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9XUklURTsKICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gRkRfV1JJVEU7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9XUklURV9CSVRdID0gMDsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJXAgaXMgd3JpdGFibGVcbiIsIHNvY2spOwogICAgICAgIH0KICAgICAgICBpZiAoZXZlbnQgJiBQT0xMUFJJKQogICAgICAgIHsKICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfT09COwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9PT0I7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9PT0JfQklUXSA9IDA7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVwIGdvdCBPT0IgZGF0YVxuIiwgc29jayk7CiAgICAgICAgfQogICAgICAgIC8qIEFjY29yZGluZyB0byBXUzIgc3BlY3MsIEZEX0NMT1NFIGlzIG9ubHkgZGVsaXZlcmVkIHdoZW4gdGhlcmUgaXMKICAgICAgICAgICBubyBtb3JlIGRhdGEgdG8gYmUgcmVhZCAoaS5lLiBoYW5ndXBfc2VlbiA9IDEpICovCiAgICAgICAgZWxzZSBpZiAoIGhhbmd1cF9zZWVuICYmIChzb2NrLT5zdGF0ZSAmIChGRF9SRUFEfEZEX1dSSVRFKSApKQogICAgICAgIHsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX0NMT1NFX0JJVF0gPSBzb2NrX2Vycm9yKCBmZCApOwogICAgICAgICAgICBpZiAoIChldmVudCAmIFBPTExFUlIpIHx8ICggc29ja19zaHV0ZG93bl90eXBlID09IFNPQ0tfU0hVVERPV05fRU9GICYmIChldmVudCAmIFBPTExIVVApICkpCiAgICAgICAgICAgICAgICBzb2NrLT5zdGF0ZSAmPSB+RkRfV1JJVEU7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0NMT1NFOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9DTE9TRTsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJXAgYWJvcnRlZCBieSBlcnJvciAlZCwgZXZlbnQ6ICV4IC0gcmVtb3ZpbmcgZnJvbSBzZWxlY3QgbG9vcFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgc29jaywgc29jay0+ZXJyb3JzW0ZEX0NMT1NFX0JJVF0sIGV2ZW50KTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCBzb2NrLT5wbWFzayAmIEZEX0NMT1NFIHx8IGV2ZW50ICYgKFBPTExFUlJ8UE9MTEhVUCkgKQogICAgewogICAgICAgIGlmICggZGVidWdfbGV2ZWwgKQogICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJyZW1vdmluZyBzb2NrZXQgJXAgZnJvbSBzZWxlY3QgbG9vcFxuIiwgc29jayApOwogICAgICAgIHNldF9mZF9ldmVudHMoIHNvY2stPmZkLCAtMSApOwogICAgfQogICAgZWxzZQogICAgICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKCiAgICAvKiB3YWtlIHVwIGFueW9uZSB3YWl0aW5nIGZvciB3aGF0ZXZlciBqdXN0IGhhcHBlbmVkICovCiAgICBpZiAoIHNvY2stPnBtYXNrICYgc29jay0+bWFzayB8fCBzb2NrLT5mbGFncyAmIFdTQV9GTEFHX09WRVJMQVBQRUQgKSBzb2NrX3dha2VfdXAoIHNvY2ssIGV2ZW50ICk7CgogICAgLyogaWYgYW55b25lIGlzIHN0dXBpZCBlbm91Z2ggdG8gd2FpdCBvbiB0aGUgc29ja2V0IG9iamVjdCBpdHNlbGYsCiAgICAgKiBtYXliZSB3ZSBzaG91bGQgd2FrZSB0aGVtIHVwIHRvbywganVzdCBpbiBjYXNlPyAqLwogICAgd2FrZV91cCggJnNvY2stPm9iaiwgMCApOwp9CgpzdGF0aWMgdm9pZCBzb2NrX2R1bXAoIHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHZlcmJvc2UgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CiAgICBwcmludGYoICJTb2NrZXQgZmQ9JXAsIHN0YXRlPSV4LCBtYXNrPSV4LCBwZW5kaW5nPSV4LCBoZWxkPSV4XG4iLAogICAgICAgICAgICBzb2NrLT5mZCwgc29jay0+c3RhdGUsCiAgICAgICAgICAgIHNvY2stPm1hc2ssIHNvY2stPnBtYXNrLCBzb2NrLT5obWFzayApOwp9CgpzdGF0aWMgaW50IHNvY2tfc2lnbmFsZWQoIHN0cnVjdCBvYmplY3QgKm9iaiwgc3RydWN0IHRocmVhZCAqdGhyZWFkICkKewogICAgc3RydWN0IHNvY2sgKnNvY2sgPSAoc3RydWN0IHNvY2sgKilvYmo7CiAgICBhc3NlcnQoIG9iai0+b3BzID09ICZzb2NrX29wcyApOwoKICAgIHJldHVybiBjaGVja19mZF9ldmVudHMoIHNvY2stPmZkLCBzb2NrX2dldF9wb2xsX2V2ZW50cyggc29jay0+ZmQgKSApICE9IDA7Cn0KCnN0YXRpYyBpbnQgc29ja19nZXRfcG9sbF9ldmVudHMoIHN0cnVjdCBmZCAqZmQgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IGdldF9mZF91c2VyKCBmZCApOwogICAgdW5zaWduZWQgaW50IG1hc2sgPSBzb2NrLT5tYXNrICYgc29jay0+c3RhdGUgJiB+c29jay0+aG1hc2s7CiAgICBpbnQgZXYgPSAwOwoKICAgIGFzc2VydCggc29jay0+b2JqLm9wcyA9PSAmc29ja19vcHMgKTsKCiAgICBpZiAoc29jay0+c3RhdGUgJiBGRF9DT05ORUNUKQogICAgICAgIC8qIGNvbm5lY3RpbmcsIHdhaXQgZm9yIHdyaXRhYmxlICovCiAgICAgICAgcmV0dXJuIFBPTExPVVQ7CiAgICBpZiAoc29jay0+c3RhdGUgJiBGRF9XSU5FX0xJU1RFTklORykKICAgICAgICAvKiBsaXN0ZW5pbmcsIHdhaXQgZm9yIHJlYWRhYmxlICovCiAgICAgICAgcmV0dXJuIChzb2NrLT5obWFzayAmIEZEX0FDQ0VQVCkgPyAwIDogUE9MTElOOwoKICAgIGlmIChtYXNrICYgRkRfUkVBRCAgfHwgYXN5bmNfd2FpdGluZyggc29jay0+cmVhZF9xICkpIGV2IHw9IFBPTExJTiB8IFBPTExQUkk7CiAgICBpZiAobWFzayAmIEZEX1dSSVRFIHx8IGFzeW5jX3dhaXRpbmcoIHNvY2stPndyaXRlX3EgKSkgZXYgfD0gUE9MTE9VVDsKICAgIC8qIFdlIHVzZSBQT0xMSU4gd2l0aCAwIGJ5dGVzIHJlY3YoKSBhcyBGRF9DTE9TRSBpbmRpY2F0aW9uIGZvciBzdHJlYW0gc29ja2V0cy4gKi8KICAgIGlmICggc29jay0+dHlwZSA9PSBTT0NLX1NUUkVBTSAmJiAoIHNvY2stPm1hc2sgJiB+c29jay0+aG1hc2sgJiBGRF9DTE9TRSkgKQogICAgICAgIGV2IHw9IFBPTExJTjsKCiAgICByZXR1cm4gZXY7Cn0KCnN0YXRpYyBlbnVtIHNlcnZlcl9mZF90eXBlIHNvY2tfZ2V0X2ZkX3R5cGUoIHN0cnVjdCBmZCAqZmQgKQp7CiAgICByZXR1cm4gRkRfVFlQRV9TT0NLRVQ7Cn0KCnN0YXRpYyB2b2lkIHNvY2tfcXVldWVfYXN5bmMoIHN0cnVjdCBmZCAqZmQsIGNvbnN0IGFzeW5jX2RhdGFfdCAqZGF0YSwgaW50IHR5cGUsIGludCBjb3VudCApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gZ2V0X2ZkX3VzZXIoIGZkICk7CiAgICBzdHJ1Y3QgYXN5bmNfcXVldWUgKnF1ZXVlOwogICAgaW50IHBvbGxldjsKCiAgICBhc3NlcnQoIHNvY2stPm9iai5vcHMgPT0gJnNvY2tfb3BzICk7CgogICAgc3dpdGNoICh0eXBlKQogICAgewogICAgY2FzZSBBU1lOQ19UWVBFX1JFQUQ6CiAgICAgICAgaWYgKCFzb2NrLT5yZWFkX3EgJiYgIShzb2NrLT5yZWFkX3EgPSBjcmVhdGVfYXN5bmNfcXVldWUoIHNvY2stPmZkICkpKSByZXR1cm47CiAgICAgICAgcXVldWUgPSBzb2NrLT5yZWFkX3E7CiAgICAgICAgc29jay0+aG1hc2sgJj0gfkZEX0NMT1NFOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBBU1lOQ19UWVBFX1dSSVRFOgogICAgICAgIGlmICghc29jay0+d3JpdGVfcSAmJiAhKHNvY2stPndyaXRlX3EgPSBjcmVhdGVfYXN5bmNfcXVldWUoIHNvY2stPmZkICkpKSByZXR1cm47CiAgICAgICAgcXVldWUgPSBzb2NrLT53cml0ZV9xOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBzZXRfZXJyb3IoIFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUiApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICggISggc29jay0+c3RhdGUgJiBGRF9SRUFEICkgJiYgdHlwZSA9PSBBU1lOQ19UWVBFX1JFQUQgICkgfHwKICAgICAgICAgKCAhKCBzb2NrLT5zdGF0ZSAmIEZEX1dSSVRFICkgJiYgdHlwZSA9PSBBU1lOQ19UWVBFX1dSSVRFICkgKQogICAgewogICAgICAgIHNldF9lcnJvciggU1RBVFVTX1BJUEVfRElTQ09OTkVDVEVEICk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgc3RydWN0IGFzeW5jICphc3luYzsKICAgICAgICBpZiAoIShhc3luYyA9IGNyZWF0ZV9hc3luYyggY3VycmVudCwgcXVldWUsIGRhdGEgKSkpIHJldHVybjsKICAgICAgICByZWxlYXNlX29iamVjdCggYXN5bmMgKTsKICAgICAgICBzZXRfZXJyb3IoIFNUQVRVU19QRU5ESU5HICk7CiAgICB9CgogICAgcG9sbGV2ID0gc29ja19yZXNlbGVjdCggc29jayApOwogICAgaWYgKCBwb2xsZXYgKSBzb2NrX3RyeV9ldmVudCggc29jaywgcG9sbGV2ICk7Cn0KCnN0YXRpYyB2b2lkIHNvY2tfcmVzZWxlY3RfYXN5bmMoIHN0cnVjdCBmZCAqZmQsIHN0cnVjdCBhc3luY19xdWV1ZSAqcXVldWUgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IGdldF9mZF91c2VyKCBmZCApOwogICAgaW50IGV2ZW50cyA9IHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIGlmIChldmVudHMpIHNvY2tfdHJ5X2V2ZW50KCBzb2NrLCBldmVudHMgKTsKfQoKc3RhdGljIHZvaWQgc29ja19jYW5jZWxfYXN5bmMoIHN0cnVjdCBmZCAqZmQgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IGdldF9mZF91c2VyKCBmZCApOwogICAgYXNzZXJ0KCBzb2NrLT5vYmoub3BzID09ICZzb2NrX29wcyApOwoKICAgIGFzeW5jX3dha2VfdXAoIHNvY2stPnJlYWRfcSwgU1RBVFVTX0NBTkNFTExFRCApOwogICAgYXN5bmNfd2FrZV91cCggc29jay0+d3JpdGVfcSwgU1RBVFVTX0NBTkNFTExFRCApOwp9CgpzdGF0aWMgc3RydWN0IGZkICpzb2NrX2dldF9mZCggc3RydWN0IG9iamVjdCAqb2JqICkKewogICAgc3RydWN0IHNvY2sgKnNvY2sgPSAoc3RydWN0IHNvY2sgKilvYmo7CiAgICByZXR1cm4gKHN0cnVjdCBmZCAqKWdyYWJfb2JqZWN0KCBzb2NrLT5mZCApOwp9CgpzdGF0aWMgdm9pZCBzb2NrX2Rlc3Ryb3koIHN0cnVjdCBvYmplY3QgKm9iaiApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKCiAgICAvKiBGSVhNRTogc3BlY2lhbCBzb2NrZXQgc2h1dGRvd24gc3R1ZmY/ICovCgogICAgaWYgKCBzb2NrLT5kZWZlcnJlZCApCiAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2stPmRlZmVycmVkICk7CgogICAgZnJlZV9hc3luY19xdWV1ZSggc29jay0+cmVhZF9xICk7CiAgICBmcmVlX2FzeW5jX3F1ZXVlKCBzb2NrLT53cml0ZV9xICk7CiAgICBpZiAoc29jay0+ZXZlbnQpIHJlbGVhc2Vfb2JqZWN0KCBzb2NrLT5ldmVudCApOwogICAgaWYgKHNvY2stPmZkKQogICAgewogICAgICAgIC8qIHNodXQgdGhlIHNvY2tldCBkb3duIHRvIGZvcmNlIHBlbmRpbmcgcG9sbCgpIGNhbGxzIGluIHRoZSBjbGllbnQgdG8gcmV0dXJuICovCiAgICAgICAgc2h1dGRvd24oIGdldF91bml4X2ZkKHNvY2stPmZkKSwgU0hVVF9SRFdSICk7CiAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2stPmZkICk7CiAgICB9Cn0KCi8qIGNyZWF0ZSBhIG5ldyBhbmQgdW5jb25uZWN0ZWQgc29ja2V0ICovCnN0YXRpYyBzdHJ1Y3Qgb2JqZWN0ICpjcmVhdGVfc29ja2V0KCBpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvY29sLCB1bnNpZ25lZCBpbnQgZmxhZ3MgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKICAgIGludCBzb2NrZmQ7CgogICAgc29ja2ZkID0gc29ja2V0KCBmYW1pbHksIHR5cGUsIHByb3RvY29sICk7CiAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgZnByaW50ZihzdGRlcnIsInNvY2tldCglZCwlZCwlZCk9JWRcbiIsZmFtaWx5LHR5cGUscHJvdG9jb2wsc29ja2ZkKTsKICAgIGlmIChzb2NrZmQgPT0gLTEpCiAgICB7CiAgICAgICAgc29ja19zZXRfZXJyb3IoKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGZjbnRsKHNvY2tmZCwgRl9TRVRGTCwgT19OT05CTE9DSyk7IC8qIG1ha2Ugc29ja2V0IG5vbmJsb2NraW5nICovCiAgICBpZiAoIShzb2NrID0gYWxsb2Nfb2JqZWN0KCAmc29ja19vcHMgKSkpCiAgICB7CiAgICAgICAgY2xvc2UoIHNvY2tmZCApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgc29jay0+c3RhdGUgPSAodHlwZSAhPSBTT0NLX1NUUkVBTSkgPyAoRkRfUkVBRHxGRF9XUklURSkgOiAwOwogICAgc29jay0+bWFzayAgICA9IDA7CiAgICBzb2NrLT5obWFzayAgID0gMDsKICAgIHNvY2stPnBtYXNrICAgPSAwOwogICAgc29jay0+cG9sbGluZyA9IDA7CiAgICBzb2NrLT5mbGFncyAgID0gZmxhZ3M7CiAgICBzb2NrLT50eXBlICAgID0gdHlwZTsKICAgIHNvY2stPmZhbWlseSAgPSBmYW1pbHk7CiAgICBzb2NrLT5ldmVudCAgID0gTlVMTDsKICAgIHNvY2stPndpbmRvdyAgPSAwOwogICAgc29jay0+bWVzc2FnZSA9IDA7CiAgICBzb2NrLT53cGFyYW0gID0gMDsKICAgIHNvY2stPmRlZmVycmVkID0gTlVMTDsKICAgIHNvY2stPnJlYWRfcSAgPSBOVUxMOwogICAgc29jay0+d3JpdGVfcSA9IE5VTEw7CiAgICBpZiAoIShzb2NrLT5mZCA9IGNyZWF0ZV9hbm9ueW1vdXNfZmQoICZzb2NrX2ZkX29wcywgc29ja2ZkLCAmc29jay0+b2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgV1NBX0ZMQUdfT1ZFUkxBUFBFRCkgPyAwIDogRklMRV9TWU5DSFJPTk9VU19JT19OT05BTEVSVCApKSkKICAgIHsKICAgICAgICByZWxlYXNlX29iamVjdCggc29jayApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgY2xlYXJfZXJyb3IoKTsKICAgIHJldHVybiAmc29jay0+b2JqOwp9CgovKiBhY2NlcHQgYSBzb2NrZXQgKGNyZWF0ZXMgYSBuZXcgZmQpICovCnN0YXRpYyBzdHJ1Y3Qgc29jayAqYWNjZXB0X3NvY2tldCggb2JqX2hhbmRsZV90IGhhbmRsZSApCnsKICAgIHN0cnVjdCBzb2NrICphY2NlcHRzb2NrOwogICAgc3RydWN0IHNvY2sgKnNvY2s7CiAgICBpbnQJYWNjZXB0ZmQ7CiAgICBzdHJ1Y3Qgc29ja2FkZHIJc2FkZHI7CgogICAgc29jayA9IChzdHJ1Y3Qgc29jayAqKWdldF9oYW5kbGVfb2JqKCBjdXJyZW50LT5wcm9jZXNzLCBoYW5kbGUsIEZJTEVfUkVBRF9EQVRBLCAmc29ja19vcHMgKTsKICAgIGlmICghc29jaykKICAgIAlyZXR1cm4gTlVMTDsKCiAgICBpZiAoIHNvY2stPmRlZmVycmVkICkKICAgIHsKICAgICAgICBhY2NlcHRzb2NrID0gc29jay0+ZGVmZXJyZWQ7CiAgICAgICAgc29jay0+ZGVmZXJyZWQgPSBOVUxMOwogICAgfQogICAgZWxzZQogICAgewoKICAgICAgICAvKiBUcnkgdG8gYWNjZXB0KDIpLiBXZSBjYW4ndCBiZSBzYWZlIHRoYXQgdGhpcyBhbiBhbHJlYWR5IGNvbm5lY3RlZCBzb2NrZXQKICAgICAgICAgKiBvciB0aGF0IGFjY2VwdCgpIGlzIGFsbG93ZWQgb24gaXQuIEluIHRob3NlIGNhc2VzIHdlIHdpbGwgZ2V0IC0xL2Vycm5vCiAgICAgICAgICogcmV0dXJuLgogICAgICAgICAqLwogICAgICAgIHVuc2lnbmVkIGludCBzbGVuID0gc2l6ZW9mKHNhZGRyKTsKICAgICAgICBhY2NlcHRmZCA9IGFjY2VwdCggZ2V0X3VuaXhfZmQoc29jay0+ZmQpLCAmc2FkZHIsICZzbGVuKTsKICAgICAgICBpZiAoYWNjZXB0ZmQ9PS0xKQogICAgICAgIHsKICAgICAgICAgICAgc29ja19zZXRfZXJyb3IoKTsKICAgICAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIGlmICghKGFjY2VwdHNvY2sgPSBhbGxvY19vYmplY3QoICZzb2NrX29wcyApKSkKICAgICAgICB7CiAgICAgICAgICAgIGNsb3NlKCBhY2NlcHRmZCApOwogICAgICAgICAgICByZWxlYXNlX29iamVjdCggc29jayApOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CgogICAgICAgIC8qIG5ld2x5IGNyZWF0ZWQgc29ja2V0IGdldHMgdGhlIHNhbWUgcHJvcGVydGllcyBvZiB0aGUgbGlzdGVuaW5nIHNvY2tldCAqLwogICAgICAgIGZjbnRsKGFjY2VwdGZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsgLyogbWFrZSBzb2NrZXQgbm9uYmxvY2tpbmcgKi8KICAgICAgICBhY2NlcHRzb2NrLT5zdGF0ZSAgPSBGRF9XSU5FX0NPTk5FQ1RFRHxGRF9SRUFEfEZEX1dSSVRFOwogICAgICAgIGlmIChzb2NrLT5zdGF0ZSAmIEZEX1dJTkVfTk9OQkxPQ0tJTkcpCiAgICAgICAgICAgIGFjY2VwdHNvY2stPnN0YXRlIHw9IEZEX1dJTkVfTk9OQkxPQ0tJTkc7CiAgICAgICAgYWNjZXB0c29jay0+bWFzayAgICA9IHNvY2stPm1hc2s7CiAgICAgICAgYWNjZXB0c29jay0+aG1hc2sgICA9IDA7CiAgICAgICAgYWNjZXB0c29jay0+cG1hc2sgICA9IDA7CiAgICAgICAgYWNjZXB0c29jay0+cG9sbGluZyA9IDA7CiAgICAgICAgYWNjZXB0c29jay0+dHlwZSAgICA9IHNvY2stPnR5cGU7CiAgICAgICAgYWNjZXB0c29jay0+ZmFtaWx5ICA9IHNvY2stPmZhbWlseTsKICAgICAgICBhY2NlcHRzb2NrLT5ldmVudCAgID0gTlVMTDsKICAgICAgICBhY2NlcHRzb2NrLT53aW5kb3cgID0gc29jay0+d2luZG93OwogICAgICAgIGFjY2VwdHNvY2stPm1lc3NhZ2UgPSBzb2NrLT5tZXNzYWdlOwogICAgICAgIGFjY2VwdHNvY2stPndwYXJhbSAgPSAwOwogICAgICAgIGlmIChzb2NrLT5ldmVudCkgYWNjZXB0c29jay0+ZXZlbnQgPSAoc3RydWN0IGV2ZW50ICopZ3JhYl9vYmplY3QoIHNvY2stPmV2ZW50ICk7CiAgICAgICAgYWNjZXB0c29jay0+ZmxhZ3MgPSBzb2NrLT5mbGFnczsKICAgICAgICBhY2NlcHRzb2NrLT5kZWZlcnJlZCA9IE5VTEw7CiAgICAgICAgYWNjZXB0c29jay0+cmVhZF9xICA9IE5VTEw7CiAgICAgICAgYWNjZXB0c29jay0+d3JpdGVfcSA9IE5VTEw7CiAgICAgICAgaWYgKCEoYWNjZXB0c29jay0+ZmQgPSBjcmVhdGVfYW5vbnltb3VzX2ZkKCAmc29ja19mZF9vcHMsIGFjY2VwdGZkLCAmYWNjZXB0c29jay0+b2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ZkX29wdGlvbnMoIHNvY2stPmZkICkgKSkpCiAgICAgICAgewogICAgICAgICAgICByZWxlYXNlX29iamVjdCggYWNjZXB0c29jayApOwogICAgICAgICAgICByZWxlYXNlX29iamVjdCggc29jayApOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICB9CiAgICBjbGVhcl9lcnJvcigpOwogICAgc29jay0+cG1hc2sgJj0gfkZEX0FDQ0VQVDsKICAgIHNvY2stPmhtYXNrICY9IH5GRF9BQ0NFUFQ7CiAgICBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICByZWxlYXNlX29iamVjdCggc29jayApOwogICAgcmV0dXJuIGFjY2VwdHNvY2s7Cn0KCi8qIHNldCB0aGUgbGFzdCBlcnJvciBkZXBlbmRpbmcgb24gZXJybm8gKi8Kc3RhdGljIGludCBzb2NrX2dldF9lcnJvciggaW50IGVyciApCnsKICAgIHN3aXRjaCAoZXJyKQogICAgewogICAgICAgIGNhc2UgRUlOVFI6ICAgICAgICAgICAgIHJldHVybiBXU0FFSU5UUjsKICAgICAgICBjYXNlIEVCQURGOiAgICAgICAgICAgICByZXR1cm4gV1NBRUJBREY7CiAgICAgICAgY2FzZSBFUEVSTToKICAgICAgICBjYXNlIEVBQ0NFUzogICAgICAgICAgICByZXR1cm4gV1NBRUFDQ0VTOwogICAgICAgIGNhc2UgRUZBVUxUOiAgICAgICAgICAgIHJldHVybiBXU0FFRkFVTFQ7CiAgICAgICAgY2FzZSBFSU5WQUw6ICAgICAgICAgICAgcmV0dXJuIFdTQUVJTlZBTDsKICAgICAgICBjYXNlIEVNRklMRTogICAgICAgICAgICByZXR1cm4gV1NBRU1GSUxFOwogICAgICAgIGNhc2UgRVdPVUxEQkxPQ0s6ICAgICAgIHJldHVybiBXU0FFV09VTERCTE9DSzsKICAgICAgICBjYXNlIEVJTlBST0dSRVNTOiAgICAgICByZXR1cm4gV1NBRUlOUFJPR1JFU1M7CiAgICAgICAgY2FzZSBFQUxSRUFEWTogICAgICAgICAgcmV0dXJuIFdTQUVBTFJFQURZOwogICAgICAgIGNhc2UgRU5PVFNPQ0s6ICAgICAgICAgIHJldHVybiBXU0FFTk9UU09DSzsKICAgICAgICBjYXNlIEVERVNUQUREUlJFUTogICAgICByZXR1cm4gV1NBRURFU1RBRERSUkVROwogICAgICAgIGNhc2UgRU1TR1NJWkU6ICAgICAgICAgIHJldHVybiBXU0FFTVNHU0laRTsKICAgICAgICBjYXNlIEVQUk9UT1RZUEU6ICAgICAgICByZXR1cm4gV1NBRVBST1RPVFlQRTsKICAgICAgICBjYXNlIEVOT1BST1RPT1BUOiAgICAgICByZXR1cm4gV1NBRU5PUFJPVE9PUFQ7CiAgICAgICAgY2FzZSBFUFJPVE9OT1NVUFBPUlQ6ICAgcmV0dXJuIFdTQUVQUk9UT05PU1VQUE9SVDsKICAgICAgICBjYXNlIEVTT0NLVE5PU1VQUE9SVDogICByZXR1cm4gV1NBRVNPQ0tUTk9TVVBQT1JUOwogICAgICAgIGNhc2UgRU9QTk9UU1VQUDogICAgICAgIHJldHVybiBXU0FFT1BOT1RTVVBQOwogICAgICAgIGNhc2UgRVBGTk9TVVBQT1JUOiAgICAgIHJldHVybiBXU0FFUEZOT1NVUFBPUlQ7CiAgICAgICAgY2FzZSBFQUZOT1NVUFBPUlQ6ICAgICAgcmV0dXJuIFdTQUVBRk5PU1VQUE9SVDsKICAgICAgICBjYXNlIEVBRERSSU5VU0U6ICAgICAgICByZXR1cm4gV1NBRUFERFJJTlVTRTsKICAgICAgICBjYXNlIEVBRERSTk9UQVZBSUw6ICAgICByZXR1cm4gV1NBRUFERFJOT1RBVkFJTDsKICAgICAgICBjYXNlIEVORVRET1dOOiAgICAgICAgICByZXR1cm4gV1NBRU5FVERPV047CiAgICAgICAgY2FzZSBFTkVUVU5SRUFDSDogICAgICAgcmV0dXJuIFdTQUVORVRVTlJFQUNIOwogICAgICAgIGNhc2UgRU5FVFJFU0VUOiAgICAgICAgIHJldHVybiBXU0FFTkVUUkVTRVQ7CiAgICAgICAgY2FzZSBFQ09OTkFCT1JURUQ6ICAgICAgcmV0dXJuIFdTQUVDT05OQUJPUlRFRDsKICAgICAgICBjYXNlIEVQSVBFOgogICAgICAgIGNhc2UgRUNPTk5SRVNFVDogICAgICAgIHJldHVybiBXU0FFQ09OTlJFU0VUOwogICAgICAgIGNhc2UgRU5PQlVGUzogICAgICAgICAgIHJldHVybiBXU0FFTk9CVUZTOwogICAgICAgIGNhc2UgRUlTQ09OTjogICAgICAgICAgIHJldHVybiBXU0FFSVNDT05OOwogICAgICAgIGNhc2UgRU5PVENPTk46ICAgICAgICAgIHJldHVybiBXU0FFTk9UQ09OTjsKICAgICAgICBjYXNlIEVTSFVURE9XTjogICAgICAgICByZXR1cm4gV1NBRVNIVVRET1dOOwogICAgICAgIGNhc2UgRVRPT01BTllSRUZTOiAgICAgIHJldHVybiBXU0FFVE9PTUFOWVJFRlM7CiAgICAgICAgY2FzZSBFVElNRURPVVQ6ICAgICAgICAgcmV0dXJuIFdTQUVUSU1FRE9VVDsKICAgICAgICBjYXNlIEVDT05OUkVGVVNFRDogICAgICByZXR1cm4gV1NBRUNPTk5SRUZVU0VEOwogICAgICAgIGNhc2UgRUxPT1A6ICAgICAgICAgICAgIHJldHVybiBXU0FFTE9PUDsKICAgICAgICBjYXNlIEVOQU1FVE9PTE9ORzogICAgICByZXR1cm4gV1NBRU5BTUVUT09MT05HOwogICAgICAgIGNhc2UgRUhPU1RET1dOOiAgICAgICAgIHJldHVybiBXU0FFSE9TVERPV047CiAgICAgICAgY2FzZSBFSE9TVFVOUkVBQ0g6ICAgICAgcmV0dXJuIFdTQUVIT1NUVU5SRUFDSDsKICAgICAgICBjYXNlIEVOT1RFTVBUWTogICAgICAgICByZXR1cm4gV1NBRU5PVEVNUFRZOwojaWZkZWYgRVBST0NMSU0KICAgICAgICBjYXNlIEVQUk9DTElNOiAgICAgICAgICByZXR1cm4gV1NBRVBST0NMSU07CiNlbmRpZgojaWZkZWYgRVVTRVJTCiAgICAgICAgY2FzZSBFVVNFUlM6ICAgICAgICAgICAgcmV0dXJuIFdTQUVVU0VSUzsKI2VuZGlmCiNpZmRlZiBFRFFVT1QKICAgICAgICBjYXNlIEVEUVVPVDogICAgICAgICAgICByZXR1cm4gV1NBRURRVU9UOwojZW5kaWYKI2lmZGVmIEVTVEFMRQogICAgICAgIGNhc2UgRVNUQUxFOiAgICAgICAgICAgIHJldHVybiBXU0FFU1RBTEU7CiNlbmRpZgojaWZkZWYgRVJFTU9URQogICAgICAgIGNhc2UgRVJFTU9URTogICAgICAgICAgIHJldHVybiBXU0FFUkVNT1RFOwojZW5kaWYKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBlcnJubyA9IGVycjsKICAgICAgICAgICAgcGVycm9yKCJ3aW5lc2VydmVyOiBzb2NrX2dldF9lcnJvcigpIGNhbid0IG1hcCBlcnJvciIpOwogICAgICAgICAgICByZXR1cm4gV1NBRUZBVUxUOwogICAgfQp9CgovKiBzZXQgdGhlIGxhc3QgZXJyb3IgZGVwZW5kaW5nIG9uIGVycm5vICovCnN0YXRpYyB2b2lkIHNvY2tfc2V0X2Vycm9yKHZvaWQpCnsKICAgIHNldF9lcnJvciggc29ja19nZXRfZXJyb3IoIGVycm5vICkgKTsKfQoKLyogY3JlYXRlIGEgc29ja2V0ICovCkRFQ0xfSEFORExFUihjcmVhdGVfc29ja2V0KQp7CiAgICBzdHJ1Y3Qgb2JqZWN0ICpvYmo7CgogICAgcmVwbHktPmhhbmRsZSA9IDA7CiAgICBpZiAoKG9iaiA9IGNyZWF0ZV9zb2NrZXQoIHJlcS0+ZmFtaWx5LCByZXEtPnR5cGUsIHJlcS0+cHJvdG9jb2wsIHJlcS0+ZmxhZ3MgKSkgIT0gTlVMTCkKICAgIHsKICAgICAgICByZXBseS0+aGFuZGxlID0gYWxsb2NfaGFuZGxlKCBjdXJyZW50LT5wcm9jZXNzLCBvYmosIHJlcS0+YWNjZXNzLCByZXEtPmF0dHJpYnV0ZXMgKTsKICAgICAgICByZWxlYXNlX29iamVjdCggb2JqICk7CiAgICB9Cn0KCi8qIGFjY2VwdCBhIHNvY2tldCAqLwpERUNMX0hBTkRMRVIoYWNjZXB0X3NvY2tldCkKewogICAgc3RydWN0IHNvY2sgKnNvY2s7CgogICAgcmVwbHktPmhhbmRsZSA9IDA7CiAgICBpZiAoKHNvY2sgPSBhY2NlcHRfc29ja2V0KCByZXEtPmxoYW5kbGUgKSkgIT0gTlVMTCkKICAgIHsKICAgICAgICByZXBseS0+aGFuZGxlID0gYWxsb2NfaGFuZGxlKCBjdXJyZW50LT5wcm9jZXNzLCAmc29jay0+b2JqLCByZXEtPmFjY2VzcywgcmVxLT5hdHRyaWJ1dGVzICk7CiAgICAgICAgc29jay0+d3BhcmFtID0gcmVwbHktPmhhbmRsZTsgIC8qIHdwYXJhbSBmb3IgbWVzc2FnZSBpcyB0aGUgc29ja2V0IGhhbmRsZSAqLwogICAgICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgICAgICByZWxlYXNlX29iamVjdCggJnNvY2stPm9iaiApOwogICAgfQp9CgovKiBzZXQgc29ja2V0IGV2ZW50IHBhcmFtZXRlcnMgKi8KREVDTF9IQU5ETEVSKHNldF9zb2NrZXRfZXZlbnQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwogICAgc3RydWN0IGV2ZW50ICpvbGRfZXZlbnQ7CiAgICBpbnQgcG9sbGV2OwoKICAgIGlmICghKHNvY2sgPSAoc3RydWN0IHNvY2sgKilnZXRfaGFuZGxlX29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfV1JJVEVfQVRUUklCVVRFUywgJnNvY2tfb3BzKSkpIHJldHVybjsKICAgIG9sZF9ldmVudCA9IHNvY2stPmV2ZW50OwogICAgc29jay0+bWFzayAgICA9IHJlcS0+bWFzazsKICAgIHNvY2stPmhtYXNrICAgJj0gfnJlcS0+bWFzazsgLyogcmUtZW5hYmxlIGhlbGQgZXZlbnRzICovCiAgICBzb2NrLT5ldmVudCAgID0gTlVMTDsKICAgIHNvY2stPndpbmRvdyAgPSByZXEtPndpbmRvdzsKICAgIHNvY2stPm1lc3NhZ2UgPSByZXEtPm1zZzsKICAgIHNvY2stPndwYXJhbSAgPSByZXEtPmhhbmRsZTsgIC8qIHdwYXJhbSBpcyB0aGUgc29ja2V0IGhhbmRsZSAqLwogICAgaWYgKHJlcS0+ZXZlbnQpIHNvY2stPmV2ZW50ID0gZ2V0X2V2ZW50X29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5ldmVudCwgRVZFTlRfTU9ESUZZX1NUQVRFICk7CgogICAgaWYgKGRlYnVnX2xldmVsICYmIHNvY2stPmV2ZW50KSBmcHJpbnRmKHN0ZGVyciwgImV2ZW50IHB0cjogJXBcbiIsIHNvY2stPmV2ZW50KTsKCiAgICBwb2xsZXYgPSBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICBpZiAoIHBvbGxldiApIHNvY2tfdHJ5X2V2ZW50KCBzb2NrLCBwb2xsZXYgKTsKCiAgICBpZiAoc29jay0+bWFzaykKICAgICAgICBzb2NrLT5zdGF0ZSB8PSBGRF9XSU5FX05PTkJMT0NLSU5HOwoKICAgIC8qIGlmIGEgbmV0d29yayBldmVudCBpcyBwZW5kaW5nLCBzaWduYWwgdGhlIGV2ZW50IG9iamVjdAogICAgICAgaXQgaXMgcG9zc2libGUgdGhhdCBGRF9DT05ORUNUIG9yIEZEX0FDQ0VQVCBuZXR3b3JrIGV2ZW50cyBoYXMgaGFwcGVuZWQKICAgICAgIGJlZm9yZSBhIFdTQUV2ZW50U2VsZWN0KCkgd2FzIGRvbmUgb24gaXQuCiAgICAgICAod2hlbiBkZWFsaW5nIHdpdGggQXN5bmNocm9ub3VzIHNvY2tldCkgICovCiAgICBpZiAoc29jay0+cG1hc2sgJiBzb2NrLT5tYXNrKSBzb2NrX3dha2VfdXAoIHNvY2ssIHBvbGxldiApOwoKICAgIGlmIChvbGRfZXZlbnQpIHJlbGVhc2Vfb2JqZWN0KCBvbGRfZXZlbnQgKTsgLyogd2UncmUgdGhyb3VnaCB3aXRoIGl0ICovCiAgICByZWxlYXNlX29iamVjdCggJnNvY2stPm9iaiApOwp9CgovKiBnZXQgc29ja2V0IGV2ZW50IHBhcmFtZXRlcnMgKi8KREVDTF9IQU5ETEVSKGdldF9zb2NrZXRfZXZlbnQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwoKICAgIHNvY2sgPSAoc3RydWN0IHNvY2sgKilnZXRfaGFuZGxlX29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5oYW5kbGUsIEZJTEVfUkVBRF9BVFRSSUJVVEVTLCAmc29ja19vcHMgKTsKICAgIGlmICghc29jaykKICAgIHsKICAgICAgICByZXBseS0+bWFzayAgPSAwOwogICAgICAgIHJlcGx5LT5wbWFzayA9IDA7CiAgICAgICAgcmVwbHktPnN0YXRlID0gMDsKICAgICAgICBzZXRfZXJyb3IoIFdTQUVOT1RTT0NLICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcmVwbHktPm1hc2sgID0gc29jay0+bWFzazsKICAgIHJlcGx5LT5wbWFzayA9IHNvY2stPnBtYXNrOwogICAgcmVwbHktPnN0YXRlID0gc29jay0+c3RhdGU7CiAgICBzZXRfcmVwbHlfZGF0YSggc29jay0+ZXJyb3JzLCBtaW4oIGdldF9yZXBseV9tYXhfc2l6ZSgpLCBzaXplb2Yoc29jay0+ZXJyb3JzKSApKTsKCiAgICBpZiAocmVxLT5zZXJ2aWNlKQogICAgewogICAgICAgIGlmIChyZXEtPmNfZXZlbnQpCiAgICAgICAgewogICAgICAgICAgICBzdHJ1Y3QgZXZlbnQgKmNldmVudCA9IGdldF9ldmVudF9vYmooIGN1cnJlbnQtPnByb2Nlc3MsIHJlcS0+Y19ldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVkVOVF9NT0RJRllfU1RBVEUgKTsKICAgICAgICAgICAgaWYgKGNldmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzZXRfZXZlbnQoIGNldmVudCApOwogICAgICAgICAgICAgICAgcmVsZWFzZV9vYmplY3QoIGNldmVudCApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNvY2stPnBtYXNrID0gMDsKICAgICAgICBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICB9CiAgICByZWxlYXNlX29iamVjdCggJnNvY2stPm9iaiApOwp9CgovKiByZS1lbmFibGUgcGVuZGluZyBzb2NrZXQgZXZlbnRzICovCkRFQ0xfSEFORExFUihlbmFibGVfc29ja2V0X2V2ZW50KQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKICAgIGludCBwb2xsZXY7CgogICAgaWYgKCEoc29jayA9IChzdHJ1Y3Qgc29jayopZ2V0X2hhbmRsZV9vYmooIGN1cnJlbnQtPnByb2Nlc3MsIHJlcS0+aGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfV1JJVEVfQVRUUklCVVRFUywgJnNvY2tfb3BzKSkpCiAgICAgICAgcmV0dXJuOwoKICAgIHNvY2stPnBtYXNrICY9IH5yZXEtPm1hc2s7IC8qIGlzIHRoaXMgc2FmZT8gKi8KICAgIHNvY2stPmhtYXNrICY9IH5yZXEtPm1hc2s7CiAgICBpZiAoIHJlcS0+bWFzayAmIEZEX1JFQUQgKQogICAgICAgIHNvY2stPmhtYXNrICY9IH5GRF9DTE9TRTsKICAgIHNvY2stPnN0YXRlIHw9IHJlcS0+c3N0YXRlOwogICAgc29jay0+c3RhdGUgJj0gfnJlcS0+Y3N0YXRlOwogICAgaWYgKCBzb2NrLT50eXBlICE9IFNPQ0tfU1RSRUFNICkgc29jay0+c3RhdGUgJj0gflNUUkVBTV9GTEFHX01BU0s7CgogICAgcG9sbGV2ID0gc29ja19yZXNlbGVjdCggc29jayApOwogICAgaWYgKCBwb2xsZXYgKSBzb2NrX3RyeV9ldmVudCggc29jaywgcG9sbGV2ICk7CgogICAgcmVsZWFzZV9vYmplY3QoICZzb2NrLT5vYmogKTsKfQoKREVDTF9IQU5ETEVSKHNldF9zb2NrZXRfZGVmZXJyZWQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrLCAqYWNjZXB0c29jazsKCiAgICBzb2NrPShzdHJ1Y3Qgc29jayAqKWdldF9oYW5kbGVfb2JqKCBjdXJyZW50LT5wcm9jZXNzLCByZXEtPmhhbmRsZSwgRklMRV9XUklURV9BVFRSSUJVVEVTLCAmc29ja19vcHMgKTsKICAgIGlmICggIXNvY2sgKQogICAgewogICAgICAgIHNldF9lcnJvciggV1NBRU5PVFNPQ0sgKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBhY2NlcHRzb2NrID0gKHN0cnVjdCBzb2NrICopZ2V0X2hhbmRsZV9vYmooIGN1cnJlbnQtPnByb2Nlc3MsIHJlcS0+ZGVmZXJyZWQsIDAsICZzb2NrX29wcyApOwogICAgaWYgKCAhYWNjZXB0c29jayApCiAgICB7CiAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKICAgICAgICBzZXRfZXJyb3IoIFdTQUVOT1RTT0NLICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgc29jay0+ZGVmZXJyZWQgPSBhY2NlcHRzb2NrOwogICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKfQo=