LyoKICogU2VydmVyLXNpZGUgc29ja2V0IG1hbmFnZW1lbnQKICoKICogQ29weXJpZ2h0IChDKSAxOTk5IE1hcmN1cyBNZWlzc25lciwgT3ZlIEvldmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKiBGSVhNRTogd2UgdXNlIHJlYWR8d3JpdGUgYWNjZXNzIGluIGFsbCBjYXNlcy4gU2hvdWxkbid0IHdlIGRlcGVuZCB0aGF0CiAqIG9uIHRoZSBhY2Nlc3Mgb2YgdGhlIGN1cnJlbnQgaGFuZGxlPwogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpZmRlZiBIQVZFX1NZU19FUlJOT19ICiMgaW5jbHVkZSA8c3lzL2Vycm5vLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfSU9DVExfSAojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfRklMSU9fSAojIGluY2x1ZGUgPHN5cy9maWxpby5oPgojZW5kaWYKI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKI2luY2x1ZGUgIndpbmJhc2UuaCIKCiNpbmNsdWRlICJwcm9jZXNzLmgiCiNpbmNsdWRlICJmaWxlLmgiCiNpbmNsdWRlICJoYW5kbGUuaCIKI2luY2x1ZGUgInRocmVhZC5oIgojaW5jbHVkZSAicmVxdWVzdC5oIgojaW5jbHVkZSAidXNlci5oIgojaW5jbHVkZSAiYXN5bmMuaCIKCi8qIFRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBVbml4IHNvY2tldCBoZWFkZXJzLiBQbHVzIHdlIG9ubHkgbmVlZCBhIGZldwogKiBtYWNyb3MgYW55d2F5LgogKi8KI2RlZmluZSBVU0VfV1NfUFJFRklYCiNpbmNsdWRlICJ3aW5zb2NrMi5oIgoKc3RydWN0IHNvY2sKewogICAgc3RydWN0IG9iamVjdCAgICAgICBvYmo7ICAgICAgICAgLyogb2JqZWN0IGhlYWRlciAqLwogICAgc3RydWN0IGZkICAgICAgICAgICpmZDsgICAgICAgICAgLyogc29ja2V0IGZpbGUgZGVzY3JpcHRvciAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBzdGF0ZTsgICAgICAgLyogc3RhdHVzIGJpdHMgKi8KICAgIHVuc2lnbmVkIGludCAgICAgICAgbWFzazsgICAgICAgIC8qIGV2ZW50IG1hc2sgKi8KICAgIHVuc2lnbmVkIGludCAgICAgICAgaG1hc2s7ICAgICAgIC8qIGhlbGQgKGJsb2NrZWQpIGV2ZW50cyAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBwbWFzazsgICAgICAgLyogcGVuZGluZyBldmVudHMgKi8KICAgIHVuc2lnbmVkIGludCAgICAgICAgZmxhZ3M7ICAgICAgIC8qIHNvY2tldCBmbGFncyAqLwogICAgaW50ICAgICAgICAgICAgICAgICBwb2xsaW5nOyAgICAgLyogaXMgc29ja2V0IGJlaW5nIHBvbGxlZD8gKi8KICAgIHVuc2lnbmVkIHNob3J0ICAgICAgdHlwZTsgICAgICAgIC8qIHNvY2tldCB0eXBlICovCiAgICB1bnNpZ25lZCBzaG9ydCAgICAgIGZhbWlseTsgICAgICAvKiBzb2NrZXQgZmFtaWx5ICovCiAgICBzdHJ1Y3QgZXZlbnQgICAgICAgKmV2ZW50OyAgICAgICAvKiBldmVudCBvYmplY3QgKi8KICAgIHVzZXJfaGFuZGxlX3QgICAgICAgd2luZG93OyAgICAgIC8qIHdpbmRvdyB0byBzZW5kIHRoZSBtZXNzYWdlIHRvICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIG1lc3NhZ2U7ICAgICAvKiBtZXNzYWdlIHRvIHNlbmQgKi8KICAgIG9ial9oYW5kbGVfdCAgICAgICAgd3BhcmFtOyAgICAgIC8qIG1lc3NhZ2Ugd3BhcmFtIChzb2NrZXQgaGFuZGxlKSAqLwogICAgaW50ICAgICAgICAgICAgICAgICBlcnJvcnNbRkRfTUFYX0VWRU5UU107IC8qIGV2ZW50IGVycm9ycyAqLwogICAgc3RydWN0IHNvY2sqICAgICAgICBkZWZlcnJlZDsgICAgLyogc29ja2V0IHRoYXQgd2FpdHMgZm9yIGEgZGVmZXJyZWQgYWNjZXB0ICovCiAgICBzdHJ1Y3QgYXN5bmNfcXVldWUgIHJlYWRfcTsgICAgICAvKiBRdWV1ZSBmb3IgYXN5bmNocm9ub3VzIHJlYWRzICovCiAgICBzdHJ1Y3QgYXN5bmNfcXVldWUgIHdyaXRlX3E7ICAgICAvKiBRdWV1ZSBmb3IgYXN5bmNocm9ub3VzIHdyaXRlcyAqLwp9OwoKc3RhdGljIHZvaWQgc29ja19kdW1wKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCB2ZXJib3NlICk7CnN0YXRpYyBpbnQgc29ja19zaWduYWxlZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKTsKc3RhdGljIHN0cnVjdCBmZCAqc29ja19nZXRfZmQoIHN0cnVjdCBvYmplY3QgKm9iaiApOwpzdGF0aWMgdm9pZCBzb2NrX2Rlc3Ryb3koIHN0cnVjdCBvYmplY3QgKm9iaiApOwoKc3RhdGljIGludCBzb2NrX2dldF9wb2xsX2V2ZW50cyggc3RydWN0IGZkICpmZCApOwpzdGF0aWMgdm9pZCBzb2NrX3BvbGxfZXZlbnQoIHN0cnVjdCBmZCAqZmQsIGludCBldmVudCApOwpzdGF0aWMgaW50IHNvY2tfZ2V0X2luZm8oIHN0cnVjdCBmZCAqZmQsIHN0cnVjdCBnZXRfZmlsZV9pbmZvX3JlcGx5ICpyZXBseSwgaW50ICpmbGFncyApOwpzdGF0aWMgdm9pZCBzb2NrX3F1ZXVlX2FzeW5jKCBzdHJ1Y3QgZmQgKmZkLCB2b2lkICpwdHIsIHVuc2lnbmVkIGludCBzdGF0dXMsIGludCB0eXBlLCBpbnQgY291bnQgKTsKCnN0YXRpYyBpbnQgc29ja19nZXRfZXJyb3IoIGludCBlcnIgKTsKc3RhdGljIHZvaWQgc29ja19zZXRfZXJyb3Iodm9pZCk7CgpzdGF0aWMgY29uc3Qgc3RydWN0IG9iamVjdF9vcHMgc29ja19vcHMgPQp7CiAgICBzaXplb2Yoc3RydWN0IHNvY2spLCAgICAgICAgICAvKiBzaXplICovCiAgICBzb2NrX2R1bXAsICAgICAgICAgICAgICAgICAgICAvKiBkdW1wICovCiAgICBhZGRfcXVldWUsICAgICAgICAgICAgICAgICAgICAvKiBhZGRfcXVldWUgKi8KICAgIHJlbW92ZV9xdWV1ZSwgICAgICAgICAgICAgICAgIC8qIHJlbW92ZV9xdWV1ZSAqLwogICAgc29ja19zaWduYWxlZCwgICAgICAgICAgICAgICAgLyogc2lnbmFsZWQgKi8KICAgIG5vX3NhdGlzZmllZCwgICAgICAgICAgICAgICAgIC8qIHNhdGlzZmllZCAqLwogICAgc29ja19nZXRfZmQsICAgICAgICAgICAgICAgICAgLyogZ2V0X2ZkICovCiAgICBzb2NrX2Rlc3Ryb3kgICAgICAgICAgICAgICAgICAvKiBkZXN0cm95ICovCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IGZkX29wcyBzb2NrX2ZkX29wcyA9CnsKICAgIHNvY2tfZ2V0X3BvbGxfZXZlbnRzLCAgICAgICAgIC8qIGdldF9wb2xsX2V2ZW50cyAqLwogICAgc29ja19wb2xsX2V2ZW50LCAgICAgICAgICAgICAgLyogcG9sbF9ldmVudCAqLwogICAgbm9fZmx1c2gsICAgICAgICAgICAgICAgICAgICAgLyogZmx1c2ggKi8KICAgIHNvY2tfZ2V0X2luZm8sICAgICAgICAgICAgICAgIC8qIGdldF9maWxlX2luZm8gKi8KICAgIHNvY2tfcXVldWVfYXN5bmMgICAgICAgICAgICAgIC8qIHF1ZXVlX2FzeW5jICovCn07CgoKLyogUGVybXV0YXRpb24gb2YgMC4uRkRfTUFYX0VWRU5UUyAtIDEgcmVwcmVzZW50aW5nIHRoZSBvcmRlciBpbiB3aGljaAogKiB3ZSBwb3N0IG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBldmVudHMuICBVc2VkIHRvIHNlbmQKICogbWVzc2FnZXMuICBUaGUgcHJvYmxlbSBpcyBpZiB0aGVyZSBpcyBib3RoIGEgRkRfQ09OTkVDVCBldmVudCBhbmQsCiAqIHNheSwgYW4gRkRfUkVBRCBldmVudCBhdmFpbGFibGUgb24gdGhlIHNhbWUgc29ja2V0LCB3ZSB3YW50IHRvCiAqIG5vdGlmeSB0aGUgYXBwIG9mIHRoZSBjb25uZWN0IGV2ZW50IGZpcnN0LiAgT3RoZXJ3aXNlIGl0IG1heQogKiBkaXNjYXJkIHRoZSByZWFkIGV2ZW50IGJlY2F1c2UgaXQgdGhpbmtzIGl0IGhhc24ndCBjb25uZWN0ZWQgeWV0LgogKi8Kc3RhdGljIGNvbnN0IGludCBldmVudF9iaXRvcmRlcltGRF9NQVhfRVZFTlRTXSA9CnsKICAgIEZEX0NPTk5FQ1RfQklULAogICAgRkRfQUNDRVBUX0JJVCwKICAgIEZEX09PQl9CSVQsCiAgICBGRF9XUklURV9CSVQsCiAgICBGRF9SRUFEX0JJVCwKICAgIEZEX0NMT1NFX0JJVCwKICAgIDYsIDcsIDgsIDkgIC8qIGxlZnRvdmVycyAqLwp9OwoKLyogRmxhZ3MgdGhhdCBtYWtlIHNlbnNlIG9ubHkgZm9yIFNPQ0tfU1RSRUFNIHNvY2tldHMgKi8KI2RlZmluZSBTVFJFQU1fRkxBR19NQVNLICgodW5zaWduZWQgaW50KSAoRkRfQ09OTkVDVCB8IEZEX0FDQ0VQVCB8IEZEX1dJTkVfTElTVEVOSU5HIHwgRkRfV0lORV9DT05ORUNURUQpKQoKdHlwZWRlZiBlbnVtIHsKICAgIFNPQ0tfU0hVVERPV05fRVJST1IgPSAtMSwKICAgIFNPQ0tfU0hVVERPV05fRU9GID0gMCwKICAgIFNPQ0tfU0hVVERPV05fUE9MTEhVUCA9IDEKfSBzb2NrX3NodXRkb3duX3Q7CgpzdGF0aWMgc29ja19zaHV0ZG93bl90IHNvY2tfc2h1dGRvd25fdHlwZSA9IFNPQ0tfU0hVVERPV05fRVJST1I7CgpzdGF0aWMgc29ja19zaHV0ZG93bl90IHNvY2tfY2hlY2tfcG9sbGh1cCAodm9pZCkKewogICAgc29ja19zaHV0ZG93bl90IHJldCA9IFNPQ0tfU0hVVERPV05fRVJST1I7CiAgICBpbnQgZmRbMl0sIG47CiAgICBzdHJ1Y3QgcG9sbGZkIHBmZDsKICAgIGNoYXIgZHVtbXk7CgogICAgaWYgKCBzb2NrZXRwYWlyICggQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIGZkICkgKSBnb3RvIG91dDsKICAgIGlmICggc2h1dGRvd24gKCBmZFswXSwgMSApICkgZ290byBvdXQ7CgogICAgcGZkLmZkID0gZmRbMV07CiAgICBwZmQuZXZlbnRzID0gUE9MTElOOwogICAgcGZkLnJldmVudHMgPSAwOwoKICAgIG4gPSBwb2xsICggJnBmZCwgMSwgMCApOwogICAgaWYgKCBuICE9IDEgKSBnb3RvIG91dDsgLyogZXJyb3Igb3IgdGltZW91dCAqLwogICAgaWYgKCBwZmQucmV2ZW50cyAmIFBPTExIVVAgKQogICAgICAgIHJldCA9IFNPQ0tfU0hVVERPV05fUE9MTEhVUDsKICAgIGVsc2UgaWYgKCBwZmQucmV2ZW50cyAmIFBPTExJTiAmJgogICAgICAgICAgICAgIHJlYWQgKCBmZFsxXSwgJmR1bW15LCAxICkgPT0gMCApCiAgICAgICAgcmV0ID0gU09DS19TSFVURE9XTl9FT0Y7CgpvdXQ6CiAgICBjbG9zZSAoIGZkWzBdICk7CiAgICBjbG9zZSAoIGZkWzFdICk7CiAgICByZXR1cm4gcmV0Owp9Cgp2b2lkIHNvY2tfaW5pdCh2b2lkKQp7CiAgICBzb2NrX3NodXRkb3duX3R5cGUgPSBzb2NrX2NoZWNrX3BvbGxodXAgKCk7CgogICAgc3dpdGNoICggc29ja19zaHV0ZG93bl90eXBlICkKICAgIHsKICAgIGNhc2UgU09DS19TSFVURE9XTl9FT0Y6CiAgICAgICAgaWYgKGRlYnVnX2xldmVsKSBmcHJpbnRmICggc3RkZXJyLCAic29ja19pbml0OiBzaHV0ZG93bigpIGNhdXNlcyBFT0ZcbiIgKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgU09DS19TSFVURE9XTl9QT0xMSFVQOgogICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgZnByaW50ZiAoIHN0ZGVyciwgInNvY2tfaW5pdDogc2h1dGRvd24oKSBjYXVzZXMgUE9MTEhVUFxuIiApOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBmcHJpbnRmICggc3RkZXJyLCAic29ja19pbml0OiBFUlJPUiBpbiBzb2NrX2NoZWNrX3BvbGxodXAoKVxuIiApOwogICAgICAgIHNvY2tfc2h1dGRvd25fdHlwZSA9IFNPQ0tfU0hVVERPV05fRU9GOwogICAgfQp9CgpzdGF0aWMgaW50IHNvY2tfcmVzZWxlY3QoIHN0cnVjdCBzb2NrICpzb2NrICkKewogICAgaW50IGV2ID0gc29ja19nZXRfcG9sbF9ldmVudHMoIHNvY2stPmZkICk7CgogICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgIGZwcmludGYoc3RkZXJyLCJzb2NrX3Jlc2VsZWN0KCVwKTogbmV3IG1hc2sgJXhcbiIsIHNvY2ssIGV2KTsKCiAgICBpZiAoIXNvY2stPnBvbGxpbmcpICAvKiBGSVhNRTogc2hvdWxkIGZpbmQgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMgKi8KICAgIHsKICAgICAgICAvKiBwcmV2aW91c2x5IHVuY29ubmVjdGVkIHNvY2tldCwgaXMgdGhpcyByZXNlbGVjdCBzdXBwb3NlZCB0byBjb25uZWN0IGl0PyAqLwogICAgICAgIGlmICghKHNvY2stPnN0YXRlICYgfkZEX1dJTkVfTk9OQkxPQ0tJTkcpKSByZXR1cm4gMDsKICAgICAgICAvKiBvaywgaXQgaXMsIGF0dGFjaCBpdCB0byB0aGUgd2luZXNlcnZlcidzIG1haW4gcG9sbCBsb29wICovCiAgICAgICAgc29jay0+cG9sbGluZyA9IDE7CiAgICB9CiAgICAvKiB1cGRhdGUgY29uZGl0aW9uIG1hc2sgKi8KICAgIHNldF9mZF9ldmVudHMoIHNvY2stPmZkLCBldiApOwogICAgcmV0dXJuIGV2Owp9CgovKiBBZnRlciBQT0xMSFVQIGlzIHJlY2VpdmVkLCB0aGUgc29ja2V0IHdpbGwgbm8gbG9uZ2VyIGJlIGluIHRoZSBtYWluIHNlbGVjdCBsb29wLgogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2lnbmFsIHBlbmRpbmcgZXZlbnRzIG5ldmVydGhlbGVzcyAqLwpzdGF0aWMgdm9pZCBzb2NrX3RyeV9ldmVudCAoIHN0cnVjdCBzb2NrICpzb2NrLCBpbnQgZXZlbnQgKQp7CiAgICBldmVudCA9IGNoZWNrX2ZkX2V2ZW50cyggc29jay0+ZmQsIGV2ZW50ICk7CiAgICBpZiAoZXZlbnQpCiAgICB7CiAgICAgICAgaWYgKCBkZWJ1Z19sZXZlbCApIGZwcmludGYgKCBzdGRlcnIsICJzb2NrX3RyeV9ldmVudDogJXhcbiIsIGV2ZW50ICk7CiAgICAgICAgc29ja19wb2xsX2V2ZW50ICggc29jay0+ZmQsIGV2ZW50ICk7CiAgICB9Cn0KCi8qIHdha2UgYW55Ym9keSB3YWl0aW5nIG9uIHRoZSBzb2NrZXQgZXZlbnQgb3Igc2VuZCB0aGUgYXNzb2NpYXRlZCBtZXNzYWdlICovCnN0YXRpYyB2b2lkIHNvY2tfd2FrZV91cCggc3RydWN0IHNvY2sgKnNvY2ssIGludCBwb2xsZXYgKQp7CiAgICB1bnNpZ25lZCBpbnQgZXZlbnRzID0gc29jay0+cG1hc2sgJiBzb2NrLT5tYXNrOwogICAgaW50IGk7CiAgICBpbnQgYXN5bmNfYWN0aXZlID0gMDsKCiAgICBpZiAoIHNvY2stPmZsYWdzICYgRkRfRkxBR19PVkVSTEFQUEVEICkKICAgIHsKICAgICAgICBpZiggcG9sbGV2ICYgKFBPTExJTnxQT0xMUFJJKSAmJiBJU19SRUFEWSggc29jay0+cmVhZF9xICkgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKSBmcHJpbnRmICggc3RkZXJyLCAiYWN0aXZhdGluZyByZWFkIHF1ZXVlIGZvciBzb2NrZXQgJXBcbiIsIHNvY2sgKTsKICAgICAgICAgICAgYXN5bmNfbm90aWZ5KCBzb2NrLT5yZWFkX3EuaGVhZCwgU1RBVFVTX0FMRVJURUQgKTsKICAgICAgICAgICAgYXN5bmNfYWN0aXZlID0gMTsKICAgICAgICB9CiAgICAgICAgaWYoIHBvbGxldiAmIFBPTExPVVQgJiYgSVNfUkVBRFkoIHNvY2stPndyaXRlX3EgKSApCiAgICAgICAgewogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpIGZwcmludGYgKCBzdGRlcnIsICJhY3RpdmF0aW5nIHdyaXRlIHF1ZXVlIGZvciBzb2NrZXQgJXBcbiIsIHNvY2sgKTsKICAgICAgICAgICAgYXN5bmNfbm90aWZ5KCBzb2NrLT53cml0ZV9xLmhlYWQsIFNUQVRVU19BTEVSVEVEICk7CiAgICAgICAgICAgIGFzeW5jX2FjdGl2ZSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIC8qIERvIG5vdCBzaWduYWwgZXZlbnRzIGlmIHRoZXJlIGFyZSBzdGlsbCBwZW5kaW5nIGFzeW5jaHJvbm91cyBJTyByZXF1ZXN0cyAqLwogICAgLyogV2UgbmVlZCB0aGlzIHRvIGRlbGF5IEZEX0NMT1NFIGV2ZW50cyB1bnRpbCBhbGwgcGVuZGluZyBvdmVybGFwcGVkIHJlcXVlc3RzIGFyZSBwcm9jZXNzZWQgKi8KICAgIGlmICggIWV2ZW50cyB8fCBhc3luY19hY3RpdmUgKSByZXR1cm47CgogICAgaWYgKHNvY2stPmV2ZW50KQogICAgewogICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgZnByaW50ZihzdGRlcnIsICJzaWduYWxsaW5nIGV2ZW50cyAleCBwdHIgJXBcbiIsIGV2ZW50cywgc29jay0+ZXZlbnQgKTsKICAgICAgICBzZXRfZXZlbnQoIHNvY2stPmV2ZW50ICk7CiAgICB9CiAgICBpZiAoc29jay0+d2luZG93KQogICAgewogICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgZnByaW50ZihzdGRlcnIsICJzaWduYWxsaW5nIGV2ZW50cyAleCB3aW4gJXBcbiIsIGV2ZW50cywgc29jay0+d2luZG93ICk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IEZEX01BWF9FVkVOVFM7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGludCBldmVudCA9IGV2ZW50X2JpdG9yZGVyW2ldOwogICAgICAgICAgICBpZiAoc29jay0+cG1hc2sgJiAoMSA8PCBldmVudCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBscGFyYW0gPSAoMSA8PCBldmVudCkgfCAoc29jay0+ZXJyb3JzW2V2ZW50XSA8PCAxNik7CiAgICAgICAgICAgICAgICBwb3N0X21lc3NhZ2UoIHNvY2stPndpbmRvdywgc29jay0+bWVzc2FnZSwgKHVuc2lnbmVkIGludClzb2NrLT53cGFyYW0sIGxwYXJhbSApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNvY2stPnBtYXNrID0gMDsKICAgICAgICBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICB9Cn0KCmlubGluZSBzdGF0aWMgaW50IHNvY2tfZXJyb3IoIHN0cnVjdCBmZCAqZmQgKQp7CiAgICB1bnNpZ25lZCBpbnQgb3B0dmFsID0gMCwgb3B0bGVuOwoKICAgIG9wdGxlbiA9IHNpemVvZihvcHR2YWwpOwogICAgZ2V0c29ja29wdCggZ2V0X3VuaXhfZmQoZmQpLCBTT0xfU09DS0VULCBTT19FUlJPUiwgKHZvaWQgKikgJm9wdHZhbCwgJm9wdGxlbik7CiAgICByZXR1cm4gb3B0dmFsID8gc29ja19nZXRfZXJyb3Iob3B0dmFsKSA6IDA7Cn0KCnN0YXRpYyB2b2lkIHNvY2tfcG9sbF9ldmVudCggc3RydWN0IGZkICpmZCwgaW50IGV2ZW50ICkKewogICAgc3RydWN0IHNvY2sgKnNvY2sgPSBnZXRfZmRfdXNlciggZmQgKTsKICAgIGludCBoYW5ndXBfc2VlbiA9IDA7CgogICAgYXNzZXJ0KCBzb2NrLT5vYmoub3BzID09ICZzb2NrX29wcyApOwogICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVwIHNlbGVjdCBldmVudDogJXhcbiIsIHNvY2ssIGV2ZW50KTsKICAgIGlmIChzb2NrLT5zdGF0ZSAmIEZEX0NPTk5FQ1QpCiAgICB7CiAgICAgICAgLyogY29ubmVjdGluZyAqLwogICAgICAgIGlmIChldmVudCAmIFBPTExPVVQpCiAgICAgICAgewogICAgICAgICAgICAvKiB3ZSBnb3QgY29ubmVjdGVkICovCiAgICAgICAgICAgIHNvY2stPnN0YXRlIHw9IEZEX1dJTkVfQ09OTkVDVEVEfEZEX1JFQUR8RkRfV1JJVEU7CiAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH5GRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQ09OTkVDVF9CSVRdID0gMDsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJXAgY29ubmVjdGlvbiBzdWNjZXNzXG4iLCBzb2NrKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXZlbnQgJiAoUE9MTEVSUnxQT0xMSFVQKSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIHdlIGRpZG4ndCBnZXQgY29ubmVjdGVkPyAqLwogICAgICAgICAgICBzb2NrLT5zdGF0ZSAmPSB+RkRfQ09OTkVDVDsKICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQ09OTkVDVDsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX0NPTk5FQ1RfQklUXSA9IHNvY2tfZXJyb3IoIGZkICk7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVwIGNvbm5lY3Rpb24gZmFpbHVyZVxuIiwgc29jayk7CiAgICAgICAgfQogICAgfSBlbHNlCiAgICBpZiAoc29jay0+c3RhdGUgJiBGRF9XSU5FX0xJU1RFTklORykKICAgIHsKICAgICAgICAvKiBsaXN0ZW5pbmcgKi8KICAgICAgICBpZiAoZXZlbnQgJiBQT0xMSU4pCiAgICAgICAgewogICAgICAgICAgICAvKiBpbmNvbWluZyBjb25uZWN0aW9uICovCiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0FDQ0VQVDsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX0FDQ0VQVF9CSVRdID0gMDsKICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChldmVudCAmIChQT0xMRVJSfFBPTExIVVApKQogICAgICAgIHsKICAgICAgICAgICAgLyogZmFpbGVkIGluY29taW5nIGNvbm5lY3Rpb24/ICovCiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0FDQ0VQVDsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX0FDQ0VQVF9CSVRdID0gc29ja19lcnJvciggZmQgKTsKICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgIH0KICAgIH0gZWxzZQogICAgewogICAgICAgIC8qIG5vcm1hbCBkYXRhIGZsb3cgKi8KICAgICAgICBpZiAoIHNvY2stPnR5cGUgPT0gU09DS19TVFJFQU0gJiYgKCBldmVudCAmIFBPTExJTiApICkKICAgICAgICB7CiAgICAgICAgICAgIGNoYXIgZHVtbXk7CiAgICAgICAgICAgIGludCBucjsKCiAgICAgICAgICAgIC8qIExpbnV4IDIuNCBkb2Vzbid0IHJlcG9ydCBQT0xMSFVQIGlmIG9ubHkgb25lIHNpZGUgb2YgdGhlIHNvY2tldAogICAgICAgICAgICAgKiBoYXMgYmVlbiBjbG9zZWQsIHNvIHdlIG5lZWQgdG8gY2hlY2sgZm9yIGl0IGV4cGxpY2l0bHkgaGVyZSAqLwogICAgICAgICAgICBuciAgPSByZWN2KCBnZXRfdW5peF9mZCggZmQgKSwgJmR1bW15LCAxLCBNU0dfUEVFSyApOwogICAgICAgICAgICBpZiAoIG5yID4gMCApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIGluY29taW5nIGRhdGEgKi8KICAgICAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX1JFQUQ7CiAgICAgICAgICAgICAgICBzb2NrLT5obWFzayB8PSAoRkRfUkVBRHxGRF9DTE9TRSk7CiAgICAgICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfUkVBRF9CSVRdID0gMDsKICAgICAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlcCBpcyByZWFkYWJsZVxuIiwgc29jayApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBuciA9PSAwICkKICAgICAgICAgICAgICAgIGhhbmd1cF9zZWVuID0gMTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBFQUdBSU4gY2FuIGhhcHBlbiBpZiBhbiBhc3luYyByZWN2KCkgZmFsbHMgYmV0d2VlbiB0aGUgc2VydmVyJ3MgcG9sbCgpCiAgICAgICAgICAgICAgICAgICBjYWxsIGFuZCB0aGUgaW52b2NhdGlvbiBvZiB0aGlzIHJvdXRpbmUgKi8KICAgICAgICAgICAgICAgIGlmICggZXJybm8gPT0gRUFHQUlOICkKICAgICAgICAgICAgICAgICAgICBldmVudCAmPSB+UE9MTElOOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICggZGVidWdfbGV2ZWwgKQogICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmICggc3RkZXJyLCAicmVjdiBlcnJvciBvbiBzb2NrZXQgJXA6ICVkXG4iLCBzb2NrLCBlcnJubyApOwogICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gUE9MTEVSUjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoIHNvY2tfc2h1dGRvd25fdHlwZSA9PSBTT0NLX1NIVVRET1dOX1BPTExIVVAgJiYgKGV2ZW50ICYgUE9MTEhVUCkgKQogICAgICAgIHsKICAgICAgICAgICAgaGFuZ3VwX3NlZW4gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICggZXZlbnQgJiBQT0xMSU4gKSAvKiBQT0xMSU4gZm9yIG5vbi1zdHJlYW0gc29ja2V0ICovCiAgICAgICAgewogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9SRUFEOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSAoRkRfUkVBRHxGRF9DTE9TRSk7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9SRUFEX0JJVF0gPSAwOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlcCBpcyByZWFkYWJsZVxuIiwgc29jayApOwoKICAgICAgICB9CgogICAgICAgIGlmIChldmVudCAmIFBPTExPVVQpCiAgICAgICAgewogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9XUklURTsKICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gRkRfV1JJVEU7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9XUklURV9CSVRdID0gMDsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJXAgaXMgd3JpdGFibGVcbiIsIHNvY2spOwogICAgICAgIH0KICAgICAgICBpZiAoZXZlbnQgJiBQT0xMUFJJKQogICAgICAgIHsKICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfT09COwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9PT0I7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9PT0JfQklUXSA9IDA7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVwIGdvdCBPT0IgZGF0YVxuIiwgc29jayk7CiAgICAgICAgfQogICAgICAgIC8qIEFjY29yZGluZyB0byBXUzIgc3BlY3MsIEZEX0NMT1NFIGlzIG9ubHkgZGVsaXZlcmVkIHdoZW4gdGhlcmUgaXMKICAgICAgICAgICBubyBtb3JlIGRhdGEgdG8gYmUgcmVhZCAoaS5lLiBoYW5ndXBfc2VlbiA9IDEpICovCiAgICAgICAgZWxzZSBpZiAoIGhhbmd1cF9zZWVuICYmIChzb2NrLT5zdGF0ZSAmIChGRF9SRUFEfEZEX1dSSVRFKSApKQogICAgICAgIHsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX0NMT1NFX0JJVF0gPSBzb2NrX2Vycm9yKCBmZCApOwogICAgICAgICAgICBpZiAoIChldmVudCAmIFBPTExFUlIpIHx8ICggc29ja19zaHV0ZG93bl90eXBlID09IFNPQ0tfU0hVVERPV05fRU9GICYmIChldmVudCAmIFBPTExIVVApICkpCiAgICAgICAgICAgICAgICBzb2NrLT5zdGF0ZSAmPSB+RkRfV1JJVEU7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0NMT1NFOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9DTE9TRTsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJXAgYWJvcnRlZCBieSBlcnJvciAlZCwgZXZlbnQ6ICV4IC0gcmVtb3ZpbmcgZnJvbSBzZWxlY3QgbG9vcFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgc29jaywgc29jay0+ZXJyb3JzW0ZEX0NMT1NFX0JJVF0sIGV2ZW50KTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCBzb2NrLT5wbWFzayAmIEZEX0NMT1NFIHx8IGV2ZW50ICYgKFBPTExFUlJ8UE9MTEhVUCkgKQogICAgewogICAgICAgIGlmICggZGVidWdfbGV2ZWwgKQogICAgICAgICAgICBmcHJpbnRmICggc3RkZXJyLCAicmVtb3Zpbmcgc29ja2V0ICVwIGZyb20gc2VsZWN0IGxvb3BcbiIsIHNvY2sgKTsKICAgICAgICBzZXRfZmRfZXZlbnRzKCBzb2NrLT5mZCwgLTEgKTsKICAgIH0KICAgIGVsc2UKICAgICAgICBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CgogICAgLyogd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBmb3Igd2hhdGV2ZXIganVzdCBoYXBwZW5lZCAqLwogICAgaWYgKCBzb2NrLT5wbWFzayAmIHNvY2stPm1hc2sgfHwgc29jay0+ZmxhZ3MgJiBGRF9GTEFHX09WRVJMQVBQRUQgKSBzb2NrX3dha2VfdXAoIHNvY2ssIGV2ZW50ICk7CgogICAgLyogaWYgYW55b25lIGlzIHN0dXBpZCBlbm91Z2ggdG8gd2FpdCBvbiB0aGUgc29ja2V0IG9iamVjdCBpdHNlbGYsCiAgICAgKiBtYXliZSB3ZSBzaG91bGQgd2FrZSB0aGVtIHVwIHRvbywganVzdCBpbiBjYXNlPyAqLwogICAgd2FrZV91cCggJnNvY2stPm9iaiwgMCApOwp9CgpzdGF0aWMgdm9pZCBzb2NrX2R1bXAoIHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHZlcmJvc2UgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CiAgICBwcmludGYoICJTb2NrZXQgZmQ9JXAsIHN0YXRlPSV4LCBtYXNrPSV4LCBwZW5kaW5nPSV4LCBoZWxkPSV4XG4iLAogICAgICAgICAgICBzb2NrLT5mZCwgc29jay0+c3RhdGUsCiAgICAgICAgICAgIHNvY2stPm1hc2ssIHNvY2stPnBtYXNrLCBzb2NrLT5obWFzayApOwp9CgpzdGF0aWMgaW50IHNvY2tfc2lnbmFsZWQoIHN0cnVjdCBvYmplY3QgKm9iaiwgc3RydWN0IHRocmVhZCAqdGhyZWFkICkKewogICAgc3RydWN0IHNvY2sgKnNvY2sgPSAoc3RydWN0IHNvY2sgKilvYmo7CiAgICBhc3NlcnQoIG9iai0+b3BzID09ICZzb2NrX29wcyApOwoKICAgIHJldHVybiBjaGVja19mZF9ldmVudHMoIHNvY2stPmZkLCBzb2NrX2dldF9wb2xsX2V2ZW50cyggc29jay0+ZmQgKSApICE9IDA7Cn0KCnN0YXRpYyBpbnQgc29ja19nZXRfcG9sbF9ldmVudHMoIHN0cnVjdCBmZCAqZmQgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IGdldF9mZF91c2VyKCBmZCApOwogICAgdW5zaWduZWQgaW50IG1hc2sgPSBzb2NrLT5tYXNrICYgc29jay0+c3RhdGUgJiB+c29jay0+aG1hc2s7CiAgICBpbnQgZXYgPSAwOwoKICAgIGFzc2VydCggc29jay0+b2JqLm9wcyA9PSAmc29ja19vcHMgKTsKCiAgICBpZiAoc29jay0+c3RhdGUgJiBGRF9DT05ORUNUKQogICAgICAgIC8qIGNvbm5lY3RpbmcsIHdhaXQgZm9yIHdyaXRhYmxlICovCiAgICAgICAgcmV0dXJuIFBPTExPVVQ7CiAgICBpZiAoc29jay0+c3RhdGUgJiBGRF9XSU5FX0xJU1RFTklORykKICAgICAgICAvKiBsaXN0ZW5pbmcsIHdhaXQgZm9yIHJlYWRhYmxlICovCiAgICAgICAgcmV0dXJuIChzb2NrLT5obWFzayAmIEZEX0FDQ0VQVCkgPyAwIDogUE9MTElOOwoKICAgIGlmIChtYXNrICYgKEZEX1JFQUQpIHx8IChzb2NrLT5mbGFncyAmIFdTQV9GTEFHX09WRVJMQVBQRUQgJiYgSVNfUkVBRFkgKHNvY2stPnJlYWRfcSkpKQogICAgICAgIGV2IHw9IFBPTExJTiB8IFBPTExQUkk7CiAgICBpZiAobWFzayAmIEZEX1dSSVRFIHx8IChzb2NrLT5mbGFncyAmIFdTQV9GTEFHX09WRVJMQVBQRUQgJiYgSVNfUkVBRFkgKHNvY2stPndyaXRlX3EpKSkKICAgICAgICBldiB8PSBQT0xMT1VUOwogICAgLyogV2UgdXNlIFBPTExJTiB3aXRoIDAgYnl0ZXMgcmVjdigpIGFzIEZEX0NMT1NFIGluZGljYXRpb24gZm9yIHN0cmVhbSBzb2NrZXRzLiAqLwogICAgaWYgKCBzb2NrLT50eXBlID09IFNPQ0tfU1RSRUFNICYmICggc29jay0+bWFzayAmIH5zb2NrLT5obWFzayAmIEZEX0NMT1NFKSApCiAgICAgICAgZXYgfD0gUE9MTElOOwoKICAgIHJldHVybiBldjsKfQoKc3RhdGljIGludCBzb2NrX2dldF9pbmZvKCBzdHJ1Y3QgZmQgKmZkLCBzdHJ1Y3QgZ2V0X2ZpbGVfaW5mb19yZXBseSAqcmVwbHksIGludCAqZmxhZ3MgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IGdldF9mZF91c2VyKCBmZCApOwogICAgYXNzZXJ0ICggc29jay0+b2JqLm9wcyA9PSAmc29ja19vcHMgKTsKCiAgICBpZiAocmVwbHkpCiAgICB7CiAgICAgICAgcmVwbHktPnR5cGUgICAgICAgID0gRklMRV9UWVBFX1BJUEU7CiAgICAgICAgcmVwbHktPmF0dHIgICAgICAgID0gMDsKICAgICAgICByZXBseS0+YWNjZXNzX3RpbWUgPSAwOwogICAgICAgIHJlcGx5LT53cml0ZV90aW1lICA9IDA7CiAgICAgICAgcmVwbHktPnNpemVfaGlnaCAgID0gMDsKICAgICAgICByZXBseS0+c2l6ZV9sb3cgICAgPSAwOwogICAgICAgIHJlcGx5LT5saW5rcyAgICAgICA9IDA7CiAgICAgICAgcmVwbHktPmluZGV4X2hpZ2ggID0gMDsKICAgICAgICByZXBseS0+aW5kZXhfbG93ICAgPSAwOwogICAgICAgIHJlcGx5LT5zZXJpYWwgICAgICA9IDA7CiAgICB9CiAgICAqZmxhZ3MgPSAwOwogICAgaWYgKHNvY2stPmZsYWdzICYgV1NBX0ZMQUdfT1ZFUkxBUFBFRCkgKmZsYWdzIHw9IEZEX0ZMQUdfT1ZFUkxBUFBFRDsKICAgIGlmICggc29jay0+dHlwZSAhPSBTT0NLX1NUUkVBTSB8fCBzb2NrLT5zdGF0ZSAmIEZEX1dJTkVfQ09OTkVDVEVEICkKICAgIHsKICAgICAgICBpZiAoICEoc29jay0+c3RhdGUgJiBGRF9SRUFEICApICkgKmZsYWdzIHw9IEZEX0ZMQUdfUkVDVl9TSFVURE9XTjsKICAgICAgICBpZiAoICEoc29jay0+c3RhdGUgJiBGRF9XUklURSApICkgKmZsYWdzIHw9IEZEX0ZMQUdfU0VORF9TSFVURE9XTjsKICAgIH0KICAgIHJldHVybiBGRF9UWVBFX1NPQ0tFVDsKfQoKc3RhdGljIHZvaWQgc29ja19xdWV1ZV9hc3luYyhzdHJ1Y3QgZmQgKmZkLCB2b2lkICpwdHIsIHVuc2lnbmVkIGludCBzdGF0dXMsIGludCB0eXBlLCBpbnQgY291bnQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gZ2V0X2ZkX3VzZXIoIGZkICk7CiAgICBzdHJ1Y3QgYXN5bmNfcXVldWUgKnE7CiAgICBzdHJ1Y3QgYXN5bmMgKmFzeW5jOwogICAgaW50IHBvbGxldjsKCiAgICBhc3NlcnQoIHNvY2stPm9iai5vcHMgPT0gJnNvY2tfb3BzICk7CgogICAgaWYgKCAhKHNvY2stPmZsYWdzICYgV1NBX0ZMQUdfT1ZFUkxBUFBFRCkgKQogICAgewogICAgICAgIHNldF9lcnJvciAoIFNUQVRVU19JTlZBTElEX0hBTkRMRSApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBzd2l0Y2goIHR5cGUgKQogICAgewogICAgY2FzZSBBU1lOQ19UWVBFX1JFQUQ6CiAgICAgICAgcSA9ICZzb2NrLT5yZWFkX3E7CiAgICAgICAgc29jay0+aG1hc2sgJj0gfkZEX0NMT1NFOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBBU1lOQ19UWVBFX1dSSVRFOgogICAgICAgIHEgPSAmc29jay0+d3JpdGVfcTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgc2V0X2Vycm9yKCBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgYXN5bmMgPSBmaW5kX2FzeW5jICggcSwgY3VycmVudCwgcHRyICk7CgogICAgaWYgKCBzdGF0dXMgPT0gU1RBVFVTX1BFTkRJTkcgKQogICAgewogICAgICAgIGlmICggKCAhKCBzb2NrLT5zdGF0ZSAmIEZEX1JFQUQgKSAmJiB0eXBlID09IEFTWU5DX1RZUEVfUkVBRCAgKSB8fAogICAgICAgICAgICAgKCAhKCBzb2NrLT5zdGF0ZSAmIEZEX1dSSVRFICkgJiYgdHlwZSA9PSBBU1lOQ19UWVBFX1dSSVRFICkgKQogICAgICAgIHsKICAgICAgICAgICAgc2V0X2Vycm9yICggU1RBVFVTX1BJUEVfRElTQ09OTkVDVEVEICk7CiAgICAgICAgICAgIGlmICggYXN5bmMgKSBkZXN0cm95X2FzeW5jICggYXN5bmMgKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCAhYXN5bmMgKQogICAgICAgICAgICAgICAgYXN5bmMgPSBjcmVhdGVfYXN5bmMgKCAmc29jay0+b2JqLCBjdXJyZW50LCBwdHIgKTsKICAgICAgICAgICAgaWYgKCAhYXN5bmMgKQogICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgYXN5bmMtPnN0YXR1cyA9IFNUQVRVU19QRU5ESU5HOwogICAgICAgICAgICBpZiAoICFhc3luYy0+cSApCiAgICAgICAgICAgICAgICBhc3luY19pbnNlcnQgKCBxLCBhc3luYyApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKCBhc3luYyApIGRlc3Ryb3lfYXN5bmMgKCBhc3luYyApOwogICAgZWxzZSBzZXRfZXJyb3IgKCBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIgKTsKCiAgICBwb2xsZXYgPSBzb2NrX3Jlc2VsZWN0ICggc29jayApOwogICAgaWYgKCBwb2xsZXYgKSBzb2NrX3RyeV9ldmVudCAoIHNvY2ssIHBvbGxldiApOwp9CgpzdGF0aWMgc3RydWN0IGZkICpzb2NrX2dldF9mZCggc3RydWN0IG9iamVjdCAqb2JqICkKewogICAgc3RydWN0IHNvY2sgKnNvY2sgPSAoc3RydWN0IHNvY2sgKilvYmo7CiAgICByZXR1cm4gKHN0cnVjdCBmZCAqKWdyYWJfb2JqZWN0KCBzb2NrLT5mZCApOwp9CgpzdGF0aWMgdm9pZCBzb2NrX2Rlc3Ryb3koIHN0cnVjdCBvYmplY3QgKm9iaiApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKCiAgICAvKiBGSVhNRTogc3BlY2lhbCBzb2NrZXQgc2h1dGRvd24gc3R1ZmY/ICovCgogICAgaWYgKCBzb2NrLT5kZWZlcnJlZCApCiAgICAgICAgcmVsZWFzZV9vYmplY3QgKCBzb2NrLT5kZWZlcnJlZCApOwoKICAgIGlmICggc29jay0+ZmxhZ3MgJiBXU0FfRkxBR19PVkVSTEFQUEVEICkKICAgIHsKICAgICAgICBkZXN0cm95X2FzeW5jX3F1ZXVlICggJnNvY2stPnJlYWRfcSApOwogICAgICAgIGRlc3Ryb3lfYXN5bmNfcXVldWUgKCAmc29jay0+d3JpdGVfcSApOwogICAgfQogICAgaWYgKHNvY2stPmV2ZW50KSByZWxlYXNlX29iamVjdCggc29jay0+ZXZlbnQgKTsKICAgIGlmIChzb2NrLT5mZCkgcmVsZWFzZV9vYmplY3QoIHNvY2stPmZkICk7Cn0KCi8qIGNyZWF0ZSBhIG5ldyBhbmQgdW5jb25uZWN0ZWQgc29ja2V0ICovCnN0YXRpYyBzdHJ1Y3Qgb2JqZWN0ICpjcmVhdGVfc29ja2V0KCBpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvY29sLCB1bnNpZ25lZCBpbnQgZmxhZ3MgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKICAgIGludCBzb2NrZmQ7CgogICAgc29ja2ZkID0gc29ja2V0KCBmYW1pbHksIHR5cGUsIHByb3RvY29sICk7CiAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgZnByaW50ZihzdGRlcnIsInNvY2tldCglZCwlZCwlZCk9JWRcbiIsZmFtaWx5LHR5cGUscHJvdG9jb2wsc29ja2ZkKTsKICAgIGlmIChzb2NrZmQgPT0gLTEpIHsKICAgICAgICBzb2NrX3NldF9lcnJvcigpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgZmNudGwoc29ja2ZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsgLyogbWFrZSBzb2NrZXQgbm9uYmxvY2tpbmcgKi8KICAgIGlmICghKHNvY2sgPSBhbGxvY19vYmplY3QoICZzb2NrX29wcyApKSkKICAgIHsKICAgICAgICBjbG9zZSggc29ja2ZkICk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBzb2NrLT5zdGF0ZSA9ICh0eXBlICE9IFNPQ0tfU1RSRUFNKSA/IChGRF9SRUFEfEZEX1dSSVRFKSA6IDA7CiAgICBzb2NrLT5tYXNrICAgID0gMDsKICAgIHNvY2stPmhtYXNrICAgPSAwOwogICAgc29jay0+cG1hc2sgICA9IDA7CiAgICBzb2NrLT5wb2xsaW5nID0gMDsKICAgIHNvY2stPmZsYWdzICAgPSBmbGFnczsKICAgIHNvY2stPnR5cGUgICAgPSB0eXBlOwogICAgc29jay0+ZmFtaWx5ICA9IGZhbWlseTsKICAgIHNvY2stPmV2ZW50ICAgPSBOVUxMOwogICAgc29jay0+d2luZG93ICA9IDA7CiAgICBzb2NrLT5tZXNzYWdlID0gMDsKICAgIHNvY2stPndwYXJhbSAgPSAwOwogICAgc29jay0+ZGVmZXJyZWQgPSBOVUxMOwogICAgaWYgKCEoc29jay0+ZmQgPSBhbGxvY19mZCggJnNvY2tfZmRfb3BzLCBzb2NrZmQsICZzb2NrLT5vYmogKSkpCiAgICB7CiAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGlmIChzb2NrLT5mbGFncyAmIFdTQV9GTEFHX09WRVJMQVBQRUQpCiAgICB7CiAgICAgICAgaW5pdF9hc3luY19xdWV1ZSAoJnNvY2stPnJlYWRfcSk7CiAgICAgICAgaW5pdF9hc3luY19xdWV1ZSAoJnNvY2stPndyaXRlX3EpOwogICAgfQogICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgY2xlYXJfZXJyb3IoKTsKICAgIHJldHVybiAmc29jay0+b2JqOwp9CgovKiBhY2NlcHQgYSBzb2NrZXQgKGNyZWF0ZXMgYSBuZXcgZmQpICovCnN0YXRpYyBzdHJ1Y3Qgc29jayAqYWNjZXB0X3NvY2tldCggb2JqX2hhbmRsZV90IGhhbmRsZSApCnsKICAgIHN0cnVjdCBzb2NrICphY2NlcHRzb2NrOwogICAgc3RydWN0IHNvY2sgKnNvY2s7CiAgICBpbnQJYWNjZXB0ZmQ7CiAgICBzdHJ1Y3Qgc29ja2FkZHIJc2FkZHI7CiAgICBpbnQJCQlzbGVuOwoKICAgIHNvY2s9KHN0cnVjdCBzb2NrKilnZXRfaGFuZGxlX29iaihjdXJyZW50LT5wcm9jZXNzLGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURXxTWU5DSFJPTklaRSwmc29ja19vcHMpOwogICAgaWYgKCFzb2NrKQogICAgCXJldHVybiBOVUxMOwoKICAgIGlmICggc29jay0+ZGVmZXJyZWQgKSB7CiAgICAgICAgYWNjZXB0c29jayA9IHNvY2stPmRlZmVycmVkOwogICAgICAgIHNvY2stPmRlZmVycmVkID0gTlVMTDsKICAgIH0gZWxzZSB7CgogICAgICAgIC8qIFRyeSB0byBhY2NlcHQoMikuIFdlIGNhbid0IGJlIHNhZmUgdGhhdCB0aGlzIGFuIGFscmVhZHkgY29ubmVjdGVkIHNvY2tldAogICAgICAgICAqIG9yIHRoYXQgYWNjZXB0KCkgaXMgYWxsb3dlZCBvbiBpdC4gSW4gdGhvc2UgY2FzZXMgd2Ugd2lsbCBnZXQgLTEvZXJybm8KICAgICAgICAgKiByZXR1cm4uCiAgICAgICAgICovCiAgICAgICAgc2xlbiA9IHNpemVvZihzYWRkcik7CiAgICAgICAgYWNjZXB0ZmQgPSBhY2NlcHQoIGdldF91bml4X2ZkKHNvY2stPmZkKSwgJnNhZGRyLCAmc2xlbik7CiAgICAgICAgaWYgKGFjY2VwdGZkPT0tMSkgewogICAgICAgICAgICBzb2NrX3NldF9lcnJvcigpOwogICAgICAgICAgICByZWxlYXNlX29iamVjdCggc29jayApOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgaWYgKCEoYWNjZXB0c29jayA9IGFsbG9jX29iamVjdCggJnNvY2tfb3BzICkpKQogICAgICAgIHsKICAgICAgICAgICAgY2xvc2UoIGFjY2VwdGZkICk7CiAgICAgICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBzb2NrICk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KCiAgICAgICAgLyogbmV3bHkgY3JlYXRlZCBzb2NrZXQgZ2V0cyB0aGUgc2FtZSBwcm9wZXJ0aWVzIG9mIHRoZSBsaXN0ZW5pbmcgc29ja2V0ICovCiAgICAgICAgZmNudGwoYWNjZXB0ZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOyAvKiBtYWtlIHNvY2tldCBub25ibG9ja2luZyAqLwogICAgICAgIGFjY2VwdHNvY2stPnN0YXRlICA9IEZEX1dJTkVfQ09OTkVDVEVEfEZEX1JFQUR8RkRfV1JJVEU7CiAgICAgICAgaWYgKHNvY2stPnN0YXRlICYgRkRfV0lORV9OT05CTE9DS0lORykKICAgICAgICAgICAgYWNjZXB0c29jay0+c3RhdGUgfD0gRkRfV0lORV9OT05CTE9DS0lORzsKICAgICAgICBhY2NlcHRzb2NrLT5tYXNrICAgID0gc29jay0+bWFzazsKICAgICAgICBhY2NlcHRzb2NrLT5obWFzayAgID0gMDsKICAgICAgICBhY2NlcHRzb2NrLT5wbWFzayAgID0gMDsKICAgICAgICBhY2NlcHRzb2NrLT5wb2xsaW5nID0gMDsKICAgICAgICBhY2NlcHRzb2NrLT50eXBlICAgID0gc29jay0+dHlwZTsKICAgICAgICBhY2NlcHRzb2NrLT5mYW1pbHkgID0gc29jay0+ZmFtaWx5OwogICAgICAgIGFjY2VwdHNvY2stPmV2ZW50ICAgPSBOVUxMOwogICAgICAgIGFjY2VwdHNvY2stPndpbmRvdyAgPSBzb2NrLT53aW5kb3c7CiAgICAgICAgYWNjZXB0c29jay0+bWVzc2FnZSA9IHNvY2stPm1lc3NhZ2U7CiAgICAgICAgYWNjZXB0c29jay0+d3BhcmFtICA9IDA7CiAgICAgICAgaWYgKHNvY2stPmV2ZW50KSBhY2NlcHRzb2NrLT5ldmVudCA9IChzdHJ1Y3QgZXZlbnQgKilncmFiX29iamVjdCggc29jay0+ZXZlbnQgKTsKICAgICAgICBhY2NlcHRzb2NrLT5mbGFncyA9IHNvY2stPmZsYWdzOwogICAgICAgIGFjY2VwdHNvY2stPmRlZmVycmVkID0gMDsKICAgICAgICBpZiAoIShhY2NlcHRzb2NrLT5mZCA9IGFsbG9jX2ZkKCAmc29ja19mZF9vcHMsIGFjY2VwdGZkLCAmYWNjZXB0c29jay0+b2JqICkpKQogICAgICAgIHsKICAgICAgICAgICAgcmVsZWFzZV9vYmplY3QoIGFjY2VwdHNvY2sgKTsKICAgICAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIGlmICggYWNjZXB0c29jay0+ZmxhZ3MgJiBXU0FfRkxBR19PVkVSTEFQUEVEICkKICAgICAgICB7CiAgICAgICAgICAgIGluaXRfYXN5bmNfcXVldWUgKCAmYWNjZXB0c29jay0+cmVhZF9xICk7CiAgICAgICAgICAgIGluaXRfYXN5bmNfcXVldWUgKCAmYWNjZXB0c29jay0+d3JpdGVfcSApOwogICAgICAgIH0KICAgIH0KICAgIGNsZWFyX2Vycm9yKCk7CiAgICBzb2NrLT5wbWFzayAmPSB+RkRfQUNDRVBUOwogICAgc29jay0+aG1hc2sgJj0gfkZEX0FDQ0VQVDsKICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIHJlbGVhc2Vfb2JqZWN0KCBzb2NrICk7CiAgICByZXR1cm4gYWNjZXB0c29jazsKfQoKLyogc2V0IHRoZSBsYXN0IGVycm9yIGRlcGVuZGluZyBvbiBlcnJubyAqLwpzdGF0aWMgaW50IHNvY2tfZ2V0X2Vycm9yKCBpbnQgZXJyICkKewogICAgc3dpdGNoIChlcnIpCiAgICB7CiAgICAgICAgY2FzZSBFSU5UUjogICAgICAgICAgICAgcmV0dXJuIFdTQUVJTlRSOyBicmVhazsKICAgICAgICBjYXNlIEVCQURGOiAgICAgICAgICAgICByZXR1cm4gV1NBRUJBREY7IGJyZWFrOwogICAgICAgIGNhc2UgRVBFUk06CiAgICAgICAgY2FzZSBFQUNDRVM6ICAgICAgICAgICAgcmV0dXJuIFdTQUVBQ0NFUzsgYnJlYWs7CiAgICAgICAgY2FzZSBFRkFVTFQ6ICAgICAgICAgICAgcmV0dXJuIFdTQUVGQVVMVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFSU5WQUw6ICAgICAgICAgICAgcmV0dXJuIFdTQUVJTlZBTDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTUZJTEU6ICAgICAgICAgICAgcmV0dXJuIFdTQUVNRklMRTsgYnJlYWs7CiAgICAgICAgY2FzZSBFV09VTERCTE9DSzogICAgICAgcmV0dXJuIFdTQUVXT1VMREJMT0NLOyBicmVhazsKICAgICAgICBjYXNlIEVJTlBST0dSRVNTOiAgICAgICByZXR1cm4gV1NBRUlOUFJPR1JFU1M7IGJyZWFrOwogICAgICAgIGNhc2UgRUFMUkVBRFk6ICAgICAgICAgIHJldHVybiBXU0FFQUxSRUFEWTsgYnJlYWs7CiAgICAgICAgY2FzZSBFTk9UU09DSzogICAgICAgICAgcmV0dXJuIFdTQUVOT1RTT0NLOyBicmVhazsKICAgICAgICBjYXNlIEVERVNUQUREUlJFUTogICAgICByZXR1cm4gV1NBRURFU1RBRERSUkVROyBicmVhazsKICAgICAgICBjYXNlIEVNU0dTSVpFOiAgICAgICAgICByZXR1cm4gV1NBRU1TR1NJWkU7IGJyZWFrOwogICAgICAgIGNhc2UgRVBST1RPVFlQRTogICAgICAgIHJldHVybiBXU0FFUFJPVE9UWVBFOyBicmVhazsKICAgICAgICBjYXNlIEVOT1BST1RPT1BUOiAgICAgICByZXR1cm4gV1NBRU5PUFJPVE9PUFQ7IGJyZWFrOwogICAgICAgIGNhc2UgRVBST1RPTk9TVVBQT1JUOiAgIHJldHVybiBXU0FFUFJPVE9OT1NVUFBPUlQ7IGJyZWFrOwogICAgICAgIGNhc2UgRVNPQ0tUTk9TVVBQT1JUOiAgIHJldHVybiBXU0FFU09DS1ROT1NVUFBPUlQ7IGJyZWFrOwogICAgICAgIGNhc2UgRU9QTk9UU1VQUDogICAgICAgIHJldHVybiBXU0FFT1BOT1RTVVBQOyBicmVhazsKICAgICAgICBjYXNlIEVQRk5PU1VQUE9SVDogICAgICByZXR1cm4gV1NBRVBGTk9TVVBQT1JUOyBicmVhazsKICAgICAgICBjYXNlIEVBRk5PU1VQUE9SVDogICAgICByZXR1cm4gV1NBRUFGTk9TVVBQT1JUOyBicmVhazsKICAgICAgICBjYXNlIEVBRERSSU5VU0U6ICAgICAgICByZXR1cm4gV1NBRUFERFJJTlVTRTsgYnJlYWs7CiAgICAgICAgY2FzZSBFQUREUk5PVEFWQUlMOiAgICAgcmV0dXJuIFdTQUVBRERSTk9UQVZBSUw7IGJyZWFrOwogICAgICAgIGNhc2UgRU5FVERPV046ICAgICAgICAgIHJldHVybiBXU0FFTkVURE9XTjsgYnJlYWs7CiAgICAgICAgY2FzZSBFTkVUVU5SRUFDSDogICAgICAgcmV0dXJuIFdTQUVORVRVTlJFQUNIOyBicmVhazsKICAgICAgICBjYXNlIEVORVRSRVNFVDogICAgICAgICByZXR1cm4gV1NBRU5FVFJFU0VUOyBicmVhazsKICAgICAgICBjYXNlIEVDT05OQUJPUlRFRDogICAgICByZXR1cm4gV1NBRUNPTk5BQk9SVEVEOyBicmVhazsKICAgICAgICBjYXNlIEVQSVBFOgogICAgICAgIGNhc2UgRUNPTk5SRVNFVDogICAgICAgIHJldHVybiBXU0FFQ09OTlJFU0VUOyBicmVhazsKICAgICAgICBjYXNlIEVOT0JVRlM6ICAgICAgICAgICByZXR1cm4gV1NBRU5PQlVGUzsgYnJlYWs7CiAgICAgICAgY2FzZSBFSVNDT05OOiAgICAgICAgICAgcmV0dXJuIFdTQUVJU0NPTk47IGJyZWFrOwogICAgICAgIGNhc2UgRU5PVENPTk46ICAgICAgICAgIHJldHVybiBXU0FFTk9UQ09OTjsgYnJlYWs7CiAgICAgICAgY2FzZSBFU0hVVERPV046ICAgICAgICAgcmV0dXJuIFdTQUVTSFVURE9XTjsgYnJlYWs7CiAgICAgICAgY2FzZSBFVE9PTUFOWVJFRlM6ICAgICAgcmV0dXJuIFdTQUVUT09NQU5ZUkVGUzsgYnJlYWs7CiAgICAgICAgY2FzZSBFVElNRURPVVQ6ICAgICAgICAgcmV0dXJuIFdTQUVUSU1FRE9VVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFQ09OTlJFRlVTRUQ6ICAgICAgcmV0dXJuIFdTQUVDT05OUkVGVVNFRDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTE9PUDogICAgICAgICAgICAgcmV0dXJuIFdTQUVMT09QOyBicmVhazsKICAgICAgICBjYXNlIEVOQU1FVE9PTE9ORzogICAgICByZXR1cm4gV1NBRU5BTUVUT09MT05HOyBicmVhazsKICAgICAgICBjYXNlIEVIT1NURE9XTjogICAgICAgICByZXR1cm4gV1NBRUhPU1RET1dOOyBicmVhazsKICAgICAgICBjYXNlIEVIT1NUVU5SRUFDSDogICAgICByZXR1cm4gV1NBRUhPU1RVTlJFQUNIOyBicmVhazsKICAgICAgICBjYXNlIEVOT1RFTVBUWTogICAgICAgICByZXR1cm4gV1NBRU5PVEVNUFRZOyBicmVhazsKI2lmZGVmIEVQUk9DTElNCiAgICAgICAgY2FzZSBFUFJPQ0xJTTogICAgICAgICAgcmV0dXJuIFdTQUVQUk9DTElNOyBicmVhazsKI2VuZGlmCiNpZmRlZiBFVVNFUlMKICAgICAgICBjYXNlIEVVU0VSUzogICAgICAgICAgICByZXR1cm4gV1NBRVVTRVJTOyBicmVhazsKI2VuZGlmCiNpZmRlZiBFRFFVT1QKICAgICAgICBjYXNlIEVEUVVPVDogICAgICAgICAgICByZXR1cm4gV1NBRURRVU9UOyBicmVhazsKI2VuZGlmCiNpZmRlZiBFU1RBTEUKICAgICAgICBjYXNlIEVTVEFMRTogICAgICAgICAgICByZXR1cm4gV1NBRVNUQUxFOyBicmVhazsKI2VuZGlmCiNpZmRlZiBFUkVNT1RFCiAgICAgICAgY2FzZSBFUkVNT1RFOiAgICAgICAgICAgcmV0dXJuIFdTQUVSRU1PVEU7IGJyZWFrOwojZW5kaWYKICAgIGRlZmF1bHQ6IGVycm5vPWVycjsgcGVycm9yKCJzb2NrX3NldF9lcnJvciIpOyByZXR1cm4gRVJST1JfVU5LTk9XTjsgYnJlYWs7CiAgICB9Cn0KCi8qIHNldCB0aGUgbGFzdCBlcnJvciBkZXBlbmRpbmcgb24gZXJybm8gKi8Kc3RhdGljIHZvaWQgc29ja19zZXRfZXJyb3Iodm9pZCkKewogICAgc2V0X2Vycm9yKCBzb2NrX2dldF9lcnJvciggZXJybm8gKSApOwp9CgovKiBjcmVhdGUgYSBzb2NrZXQgKi8KREVDTF9IQU5ETEVSKGNyZWF0ZV9zb2NrZXQpCnsKICAgIHN0cnVjdCBvYmplY3QgKm9iajsKCiAgICByZXBseS0+aGFuZGxlID0gMDsKICAgIGlmICgob2JqID0gY3JlYXRlX3NvY2tldCggcmVxLT5mYW1pbHksIHJlcS0+dHlwZSwgcmVxLT5wcm90b2NvbCwgcmVxLT5mbGFncyApKSAhPSBOVUxMKQogICAgewogICAgICAgIHJlcGx5LT5oYW5kbGUgPSBhbGxvY19oYW5kbGUoIGN1cnJlbnQtPnByb2Nlc3MsIG9iaiwgcmVxLT5hY2Nlc3MsIHJlcS0+aW5oZXJpdCApOwogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBvYmogKTsKICAgIH0KfQoKLyogYWNjZXB0IGEgc29ja2V0ICovCkRFQ0xfSEFORExFUihhY2NlcHRfc29ja2V0KQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKCiAgICByZXBseS0+aGFuZGxlID0gMDsKICAgIGlmICgoc29jayA9IGFjY2VwdF9zb2NrZXQoIHJlcS0+bGhhbmRsZSApKSAhPSBOVUxMKQogICAgewogICAgICAgIHJlcGx5LT5oYW5kbGUgPSBhbGxvY19oYW5kbGUoIGN1cnJlbnQtPnByb2Nlc3MsICZzb2NrLT5vYmosIHJlcS0+YWNjZXNzLCByZXEtPmluaGVyaXQgKTsKICAgICAgICBzb2NrLT53cGFyYW0gPSByZXBseS0+aGFuZGxlOyAgLyogd3BhcmFtIGZvciBtZXNzYWdlIGlzIHRoZSBzb2NrZXQgaGFuZGxlICovCiAgICAgICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCAmc29jay0+b2JqICk7CiAgICB9Cn0KCi8qIHNldCBzb2NrZXQgZXZlbnQgcGFyYW1ldGVycyAqLwpERUNMX0hBTkRMRVIoc2V0X3NvY2tldF9ldmVudCkKewogICAgc3RydWN0IHNvY2sgKnNvY2s7CiAgICBzdHJ1Y3QgZXZlbnQgKm9sZF9ldmVudDsKICAgIGludCBwb2xsZXY7CgogICAgaWYgKCEoc29jayA9IChzdHJ1Y3Qgc29jayopZ2V0X2hhbmRsZV9vYmooIGN1cnJlbnQtPnByb2Nlc3MsIHJlcS0+aGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFfFNZTkNIUk9OSVpFLCAmc29ja19vcHMpKSkKICAgICAgICByZXR1cm47CiAgICBvbGRfZXZlbnQgPSBzb2NrLT5ldmVudDsKICAgIHNvY2stPm1hc2sgICAgPSByZXEtPm1hc2s7CiAgICBzb2NrLT5ldmVudCAgID0gTlVMTDsKICAgIHNvY2stPndpbmRvdyAgPSByZXEtPndpbmRvdzsKICAgIHNvY2stPm1lc3NhZ2UgPSByZXEtPm1zZzsKICAgIHNvY2stPndwYXJhbSAgPSByZXEtPmhhbmRsZTsgIC8qIHdwYXJhbSBpcyB0aGUgc29ja2V0IGhhbmRsZSAqLwogICAgaWYgKHJlcS0+ZXZlbnQpIHNvY2stPmV2ZW50ID0gZ2V0X2V2ZW50X29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5ldmVudCwgRVZFTlRfTU9ESUZZX1NUQVRFICk7CgogICAgaWYgKGRlYnVnX2xldmVsICYmIHNvY2stPmV2ZW50KSBmcHJpbnRmKHN0ZGVyciwgImV2ZW50IHB0cjogJXBcbiIsIHNvY2stPmV2ZW50KTsKCiAgICBwb2xsZXYgPSBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICBpZiAoIHBvbGxldiApIHNvY2tfdHJ5X2V2ZW50ICggc29jaywgcG9sbGV2ICk7CgogICAgaWYgKHNvY2stPm1hc2spCiAgICAgICAgc29jay0+c3RhdGUgfD0gRkRfV0lORV9OT05CTE9DS0lORzsKCiAgICAvKiBpZiBhIG5ldHdvcmsgZXZlbnQgaXMgcGVuZGluZywgc2lnbmFsIHRoZSBldmVudCBvYmplY3QKICAgICAgIGl0IGlzIHBvc3NpYmxlIHRoYXQgRkRfQ09OTkVDVCBvciBGRF9BQ0NFUFQgbmV0d29yayBldmVudHMgaGFzIGhhcHBlbmVkCiAgICAgICBiZWZvcmUgYSBXU0FFdmVudFNlbGVjdCgpIHdhcyBkb25lIG9uIGl0LgogICAgICAgKHdoZW4gZGVhbGluZyB3aXRoIEFzeW5jaHJvbm91cyBzb2NrZXQpICAqLwogICAgaWYgKHNvY2stPnBtYXNrICYgc29jay0+bWFzaykgc29ja193YWtlX3VwKCBzb2NrLCBwb2xsZXYgKTsKCiAgICBpZiAob2xkX2V2ZW50KSByZWxlYXNlX29iamVjdCggb2xkX2V2ZW50ICk7IC8qIHdlJ3JlIHRocm91Z2ggd2l0aCBpdCAqLwogICAgcmVsZWFzZV9vYmplY3QoICZzb2NrLT5vYmogKTsKfQoKLyogZ2V0IHNvY2tldCBldmVudCBwYXJhbWV0ZXJzICovCkRFQ0xfSEFORExFUihnZXRfc29ja2V0X2V2ZW50KQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKCiAgICBzb2NrPShzdHJ1Y3Qgc29jayopZ2V0X2hhbmRsZV9vYmooY3VycmVudC0+cHJvY2VzcyxyZXEtPmhhbmRsZSxHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURXxTWU5DSFJPTklaRSwmc29ja19vcHMpOwogICAgaWYgKCFzb2NrKQogICAgewogICAgICAgIHJlcGx5LT5tYXNrICA9IDA7CiAgICAgICAgcmVwbHktPnBtYXNrID0gMDsKICAgICAgICByZXBseS0+c3RhdGUgPSAwOwogICAgICAgIHNldF9lcnJvciggV1NBRU5PVFNPQ0sgKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICByZXBseS0+bWFzayAgPSBzb2NrLT5tYXNrOwogICAgcmVwbHktPnBtYXNrID0gc29jay0+cG1hc2s7CiAgICByZXBseS0+c3RhdGUgPSBzb2NrLT5zdGF0ZTsKICAgIHNldF9yZXBseV9kYXRhKCBzb2NrLT5lcnJvcnMsIG1pbiggZ2V0X3JlcGx5X21heF9zaXplKCksIHNpemVvZihzb2NrLT5lcnJvcnMpICkpOwoKICAgIGlmIChyZXEtPnNlcnZpY2UpCiAgICB7CiAgICAgICAgaWYgKHJlcS0+Y19ldmVudCkKICAgICAgICB7CiAgICAgICAgICAgIHN0cnVjdCBldmVudCAqY2V2ZW50ID0gZ2V0X2V2ZW50X29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5jX2V2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWRU5UX01PRElGWV9TVEFURSApOwogICAgICAgICAgICBpZiAoY2V2ZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXNldF9ldmVudCggY2V2ZW50ICk7CiAgICAgICAgICAgICAgICByZWxlYXNlX29iamVjdCggY2V2ZW50ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc29jay0+cG1hc2sgPSAwOwogICAgICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIH0KICAgIHJlbGVhc2Vfb2JqZWN0KCAmc29jay0+b2JqICk7Cn0KCi8qIHJlLWVuYWJsZSBwZW5kaW5nIHNvY2tldCBldmVudHMgKi8KREVDTF9IQU5ETEVSKGVuYWJsZV9zb2NrZXRfZXZlbnQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwogICAgaW50IHBvbGxldjsKCiAgICBpZiAoIShzb2NrID0gKHN0cnVjdCBzb2NrKilnZXRfaGFuZGxlX29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEV8U1lOQ0hST05JWkUsICZzb2NrX29wcykpKQogICAgICAgIHJldHVybjsKCiAgICBzb2NrLT5wbWFzayAmPSB+cmVxLT5tYXNrOyAvKiBpcyB0aGlzIHNhZmU/ICovCiAgICBzb2NrLT5obWFzayAmPSB+cmVxLT5tYXNrOwogICAgaWYgKCByZXEtPm1hc2sgJiBGRF9SRUFEICkKICAgICAgICBzb2NrLT5obWFzayAmPSB+RkRfQ0xPU0U7CiAgICBzb2NrLT5zdGF0ZSB8PSByZXEtPnNzdGF0ZTsKICAgIHNvY2stPnN0YXRlICY9IH5yZXEtPmNzdGF0ZTsKICAgIGlmICggc29jay0+dHlwZSAhPSBTT0NLX1NUUkVBTSApIHNvY2stPnN0YXRlICY9IH5TVFJFQU1fRkxBR19NQVNLOwoKICAgIHBvbGxldiA9IHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIGlmICggcG9sbGV2ICkgc29ja190cnlfZXZlbnQgKCBzb2NrLCBwb2xsZXYgKTsKCiAgICByZWxlYXNlX29iamVjdCggJnNvY2stPm9iaiApOwp9CgpERUNMX0hBTkRMRVIoc2V0X3NvY2tldF9kZWZlcnJlZCkKewogICAgc3RydWN0IHNvY2sgKnNvY2ssICphY2NlcHRzb2NrOwoKICAgIHNvY2s9KHN0cnVjdCBzb2NrKilnZXRfaGFuZGxlX29iaiggY3VycmVudC0+cHJvY2VzcyxyZXEtPmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEV8U1lOQ0hST05JWkUsJnNvY2tfb3BzICk7CiAgICBpZiAoICFzb2NrICkKICAgIHsKICAgICAgICBzZXRfZXJyb3IgKCBXU0FFTk9UU09DSyApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGFjY2VwdHNvY2sgPSAoc3RydWN0IHNvY2sqKWdldF9oYW5kbGVfb2JqKCBjdXJyZW50LT5wcm9jZXNzLHJlcS0+ZGVmZXJyZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEV8U1lOQ0hST05JWkUsJnNvY2tfb3BzICk7CiAgICBpZiAoICFhY2NlcHRzb2NrICkKICAgIHsKICAgICAgICByZWxlYXNlX29iamVjdCAoIHNvY2sgKTsKICAgICAgICBzZXRfZXJyb3IgKCBXU0FFTk9UU09DSyApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHNvY2stPmRlZmVycmVkID0gYWNjZXB0c29jazsKICAgIHJlbGVhc2Vfb2JqZWN0ICggc29jayApOwp9Cg==