LyogJElkOiBic2Ruc3MuYyAxMTQgMjAwNy0wMi0wOCAxNjo0MjoyMlogbGVubmFydCAkICovCgovKioqCiAgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBuc3MtbWRucy4KtwogICAgbnNzLW1kbnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCiAgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLAogICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KtwogICAgbnNzLW1kbnMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0MQogICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQogICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgq3CiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggbnNzLW1kbnM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKICAgIFVTQS4KKioqLwoKLyogT3JpZ2luYWwgYXV0aG9yOiBCcnVjZSBNLiBTaW1wc29uIDxibXNARnJlZUJTRC5vcmc+ICovCgojaWZkZWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSA8Y29uZmlnLmg+CiNlbmRpZgoKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8c3lzL3Vpby5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojaW5jbHVkZSA8c3lzL2t0cmFjZS5oPgoKI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHB3ZC5oPgojaW5jbHVkZSA8Z3JwLmg+CiNpbmNsdWRlIDxuc3MuaD4KCiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNpbmNsdWRlIDxuZXRkYi5oPgoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2lmZGVmIE1ETlNfTUlOSU1BTAovKgogKiBGcmVlQlNEIHN1cHBvcnQgcHJlZmVycyBBdmFoaS4KICovCiNlbmRpZgoKI2lmIGRlZmluZWQoTlNTX0lQVjRfT05MWSkgfHwgZGVmaW5lZChOU1NfSVBWNl9PTkxZKQovKgogKiBGcmVlQlNEJ3MgbGliYyBpcyBhbHdheXMgYnVpbHQgd2l0aCBJUHY0IHN1cHBvcnQuCiAqIFRoZXJlIGlzIG5vIHdheSBvZiB0ZWxsaW5nIGF0IGNvbXBpbGUgdGltZSB3aXRoIGEgZGVmaW5lIGlmIGxpYmMKICogd2FzIGJ1aWx0IHdpdGggLURJTkVUNiBvciBub3Q7IGEgY29uZmlndXJlIHRlc3Qgd291bGQgYmUgcmVxdWlyZWQuCiAqIFRoZXJlZm9yZSwgZGlzdGluZ3Vpc2hpbmcgYmV0d2VlbiB0aGUgdHdvIG1ha2VzIG5vIHNlbnNlLgogKi8KI2RlZmluZSBOT19CVUlMRF9CU0RfTlNTCiNlbmRpZgoKI2lmbmRlZiBOT19CVUlMRF9CU0RfTlNTCi8qCiAqIFRvIHR1cm4gb24gdXRyYWNlKCkgcmVjb3JkcywgY29tcGlsZSB3aXRoIC1EREVCVUdfVVRSQUNFLgogKi8KI2lmZGVmIERFQlVHX1VUUkFDRQojZGVmaW5lIF9OU1NfVVRSQUNFKG1zZykJCQkJCQlcCglkbyB7CQkJCQkJCQlcCgkJc3RhdGljIGNvbnN0IGNoYXIgX19tc2dbXSA9IG1zZyA7CQkJXAoJCSh2b2lkKXV0cmFjZShfX21zZywgc2l6ZW9mKF9fbXNnKSk7CQkJXAoJfSB3aGlsZSAoMCkKI2Vsc2UKI2RlZmluZSBfTlNTX1VUUkFDRShtc2cpCiNlbmRpZgoKbnNfbXRhYiAqbnNzX21vZHVsZV9yZWdpc3Rlcihjb25zdCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCAqbXRhYnNpemUsCgkJCSAgICAgbnNzX21vZHVsZV91bnJlZ2lzdGVyX2ZuICp1bnJlZyk7CgpleHRlcm4gZW51bSBuc3Nfc3RhdHVzIF9uc3NfbWRuc19nZXRob3N0YnluYW1lX3IgKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBob3N0ZW50ICogcmVzdWx0LAoJCQkgICBjaGFyICpidWZmZXIsIHNpemVfdCBidWZsZW4sIGludCAqZXJybm9wLAoJCQkgICBpbnQgKmhfZXJybm9wKTsKCmV4dGVybiBlbnVtIG5zc19zdGF0dXMgX25zc19tZG5zX2dldGhvc3RieW5hbWUyX3IgKGNvbnN0IGNoYXIgKm5hbWUsIGludCBhZiwgc3RydWN0IGhvc3RlbnQgKiByZXN1bHQsCgkJCSAgICBjaGFyICpidWZmZXIsIHNpemVfdCBidWZsZW4sIGludCAqZXJybm9wLAoJCQkgICAgaW50ICpoX2Vycm5vcCk7CmV4dGVybiBlbnVtIG5zc19zdGF0dXMgX25zc19tZG5zX2dldGhvc3RieWFkZHJfciAoc3RydWN0IGluX2FkZHIgKiBhZGRyLCBpbnQgbGVuLCBpbnQgdHlwZSwKCQkJICAgc3RydWN0IGhvc3RlbnQgKiByZXN1bHQsIGNoYXIgKmJ1ZmZlciwKCQkJICAgc2l6ZV90IGJ1ZmxlbiwgaW50ICplcnJub3AsIGludCAqaF9lcnJub3ApOwpleHRlcm4gZW51bSBuc3Nfc3RhdHVzIF9uc3NfbWRuczRfZ2V0aG9zdGJ5bmFtZV9yIChjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgaG9zdGVudCAqIHJlc3VsdCwKCQkJICAgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmbGVuLCBpbnQgKmVycm5vcCwKCQkJICAgaW50ICpoX2Vycm5vcCk7CgpleHRlcm4gZW51bSBuc3Nfc3RhdHVzIF9uc3NfbWRuczRfZ2V0aG9zdGJ5bmFtZTJfciAoY29uc3QgY2hhciAqbmFtZSwgaW50IGFmLCBzdHJ1Y3QgaG9zdGVudCAqIHJlc3VsdCwKCQkJICAgIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmxlbiwgaW50ICplcnJub3AsCgkJCSAgICBpbnQgKmhfZXJybm9wKTsKZXh0ZXJuIGVudW0gbnNzX3N0YXR1cyBfbnNzX21kbnM0X2dldGhvc3RieWFkZHJfciAoc3RydWN0IGluX2FkZHIgKiBhZGRyLCBpbnQgbGVuLCBpbnQgdHlwZSwKCQkJICAgc3RydWN0IGhvc3RlbnQgKiByZXN1bHQsIGNoYXIgKmJ1ZmZlciwKCQkJICAgc2l6ZV90IGJ1ZmxlbiwgaW50ICplcnJub3AsIGludCAqaF9lcnJub3ApOwpleHRlcm4gZW51bSBuc3Nfc3RhdHVzIF9uc3NfbWRuczZfZ2V0aG9zdGJ5bmFtZV9yIChjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgaG9zdGVudCAqIHJlc3VsdCwKCQkJICAgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmbGVuLCBpbnQgKmVycm5vcCwKCQkJICAgaW50ICpoX2Vycm5vcCk7CgpleHRlcm4gZW51bSBuc3Nfc3RhdHVzIF9uc3NfbWRuczZfZ2V0aG9zdGJ5bmFtZTJfciAoY29uc3QgY2hhciAqbmFtZSwgaW50IGFmLCBzdHJ1Y3QgaG9zdGVudCAqIHJlc3VsdCwKCQkJICAgIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmxlbiwgaW50ICplcnJub3AsCgkJCSAgICBpbnQgKmhfZXJybm9wKTsKZXh0ZXJuIGVudW0gbnNzX3N0YXR1cyBfbnNzX21kbnM2X2dldGhvc3RieWFkZHJfciAoc3RydWN0IGluX2FkZHIgKiBhZGRyLCBpbnQgbGVuLCBpbnQgdHlwZSwKCQkJICAgc3RydWN0IGhvc3RlbnQgKiByZXN1bHQsIGNoYXIgKmJ1ZmZlciwKCQkJICAgc2l6ZV90IGJ1ZmxlbiwgaW50ICplcnJub3AsIGludCAqaF9lcnJub3ApOwoKdHlwZWRlZiBlbnVtIG5zc19zdGF0dXMgCSgqX2JzZF9uc3N0dWJfZm5fdCkoY29uc3QgY2hhciAqLCBzdHJ1Y3QgaG9zdGVudCAqLCBjaGFyICosIHNpemVfdCwgaW50ICosIGludCAqKTsKCi8qIFhYWDogRnJlZUJTRCA1LnggaXMgbm90IHN1cHBvcnRlZC4gKi8Kc3RhdGljIE5TU19NRVRIT0RfUFJPVE9UWVBFKF9fbnNzX2JzZGNvbXBhdF9nZXRhZGRyaW5mbyk7CnN0YXRpYyBOU1NfTUVUSE9EX1BST1RPVFlQRShfX25zc19ic2Rjb21wYXRfZ2V0aG9zdGJ5YWRkcl9yKTsKc3RhdGljIE5TU19NRVRIT0RfUFJPVE9UWVBFKF9fbnNzX2JzZGNvbXBhdF9nZXRob3N0YnluYW1lMl9yKTsKc3RhdGljIE5TU19NRVRIT0RfUFJPVE9UWVBFKF9fbnNzX2JzZGNvbXBhdF9naGJ5YWRkcik7CnN0YXRpYyBOU1NfTUVUSE9EX1BST1RPVFlQRShfX25zc19ic2Rjb21wYXRfZ2hieW5hbWUpOwoKc3RhdGljIG5zX210YWIgbWV0aG9kc1tdID0gewogICAgLyogZGF0YWJhc2UsIG5hbWUsIG1ldGhvZCwgbWRhdGEgKi8KICAgIHsgTlNEQl9IT1NUUywgImdldGFkZHJpbmZvIiwgX19uc3NfYnNkY29tcGF0X2dldGFkZHJpbmZvLCBOVUxMIH0sCiAgICB7IE5TREJfSE9TVFMsICJnZXRob3N0YnlhZGRyX3IiLCBfX25zc19ic2Rjb21wYXRfZ2V0aG9zdGJ5YWRkcl9yLCBOVUxMIH0sCiAgICB7IE5TREJfSE9TVFMsICJnZXRob3N0YnluYW1lMl9yIiwgX19uc3NfYnNkY29tcGF0X2dldGhvc3RieW5hbWUyX3IsIE5VTEwgfSwKICAgIHsgTlNEQl9IT1NUUywgImdoYnlhZGRyIiwgX19uc3NfYnNkY29tcGF0X2doYnlhZGRyLCBOVUxMIH0sCiAgICB7IE5TREJfSE9TVFMsICJnaGJ5bmFtZSIsIF9fbnNzX2JzZGNvbXBhdF9naGJ5bmFtZSwgTlVMTCB9LAp9OwoKbnNfbXRhYiAqCm5zc19tb2R1bGVfcmVnaXN0ZXIoY29uc3QgY2hhciAqc291cmNlLCB1bnNpZ25lZCBpbnQgKm10YWJzaXplLAogICAgbnNzX21vZHVsZV91bnJlZ2lzdGVyX2ZuICp1bnJlZykKewoKCSptdGFic2l6ZSA9IHNpemVvZihtZXRob2RzKS9zaXplb2YobWV0aG9kc1swXSk7CgkqdW5yZWcgPSBOVUxMOwoJcmV0dXJuIChtZXRob2RzKTsKfQoKLyoKICogQ2FsbGluZyBjb252ZW50aW9uOgogKiBhcDogY29uc3QgY2hhciAqbmFtZSAob3B0aW9uYWwpLCBzdHJ1Y3QgYWRkcmluZm8gKnBhaSAoaGludHMsIG9wdGlvbmFsKQogKiByZXR2YWw6IHN0cnVjdCBhZGRyaW5mbyAqKgogKgogKiBUT0RPOiBNYXAgYWxsIHJldHVybmVkIGhvc3RlbnRzLCBub3QganVzdCB0aGUgZmlyc3QgbWF0Y2guCiAqCiAqIG5hbWUgbXVzdCBhbHdheXMgYmUgc3BlY2lmaWVkIGJ5IGxpYmM7IHBhaSBpcyBhbGxvY2F0ZWQKICogYnkgbGliYyBhbmQgbXVzdCBhbHdheXMgYmUgc3BlY2lmaWVkLgogKgogKiBXZSBjYW4gbWFsbG9jKCkgYWRkcmluZm8gaW5zdGFuY2VzIGFuZCBoYW5nIHRoZW0gb2ZmIGFpLT5uZXh0OwogKiBjYW5vbm5hbWVzIG1heSBhbHNvIGJlIG1hbGxvYygpJ2QuCiAqIGxpYmMgaXMgcmVzcG9uc2libGUgZm9yIG1hcHBpbmcgb3VyIG5zIGVycm9yIHJldHVybiB0byBnYWlfc3RyZXJyb3IoKS4KICoKICogbGliYyBjYWxscyB1cyBvbmx5IHRvIGxvb2sgdXAgcXVhbGlmaWVkIGhvc3RuYW1lcy4gV2UgZG9uJ3QgbmVlZCB0bwogKiB3b3JyeSBhYm91dCBwb3J0IG51bWJlcnM7IGxpYmMgd2lsbCBjYWxsIGdldHNlcnZieW5hbWUoKSBhbmQgZXhwbG9yZQogKiB0aGUgYXBwcm9wcmlhdGUgbWFwcyBjb25maWd1cmVkIGluIG5zc3dpdGNoLmNvbmYoNSkuCiAqCiAqIF9lcnJubyBhbmQgX2hfZXJybm8gYXJlIHVudXNlZCBieSBnZXRhZGRyaW5mbygpLCBhcyBpdCBpcwogKiBbbW9zdGx5XSBPUyBpbmRlcGVuZGVudCBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgV2luMzIuCiAqLwpzdGF0aWMgaW50Cl9fbnNzX2JzZGNvbXBhdF9nZXRhZGRyaW5mbyh2b2lkICpyZXR2YWwsIHZvaWQgKm1kYXRhIF9fdW51c2VkLCB2YV9saXN0IGFwKQp7CglzdHJ1Y3QgYWRkcmluZm8JCSBzZW50aW5lbDsKCXN0cnVjdCBhZGRyaW5mbwkJKmFpOwoJY2hhcgkJCSpidWZmZXI7Cgl2b2lkIAkJCSpjYnVmcDsJLyogYnVmZmVyIGhhbmRlZCB0byBsaWJjICovCgljaGFyCQkJKmhhcDsKCXN0cnVjdCBob3N0ZW50CQkqaHA7Cgl2b2lkIAkJCSptYnVmcDsJLyogYnVmZmVyIGhhbmRlZCB0byBtZG5zICovCgljb25zdCBjaGFyIAkJKm5hbWU7Cgljb25zdCBzdHJ1Y3QgYWRkcmluZm8JKnBhaTsKCXN0cnVjdCBzb2NrYWRkcgkJKnBzYTsJLyogYWN0dWFsbHkgKnNvY2thZGRyX3N0b3JhZ2UgKi8KCXN0cnVjdCBhZGRyaW5mbwkJKipyZXN1bHRwOwoJaW50CQkJIF9lcnJubzsKCWludAkJCSBfaF9lcnJubzsKCXNpemVfdAkJCSBtYnVmbGVuID0gMTAyNDsKCWVudW0gbnNzX3N0YXR1cwkJIHN0YXR1czsKCglfTlNTX1VUUkFDRSgiX19uc3NfYnNkY29tcGF0X2dldGFkZHJpbmZvOiBjYWxsZWQiKTsKCglfaF9lcnJubyA9IF9lcnJubyA9IDA7CglzdGF0dXMgPSBOU1NfU1RBVFVTX1VOQVZBSUw7CgoJbmFtZSA9IHZhX2FyZyhhcCwgY29uc3QgY2hhciAqKTsKCXBhaSA9IHZhX2FyZyhhcCwgc3RydWN0IGFkZHJpbmZvICopOwoJcmVzdWx0cCA9IChzdHJ1Y3QgYWRkcmluZm8gKiopcmV0dmFsOwoKCS8qIFhYWDogV2lsbCBiZSB1c2VkIHRvIGhhbmcgb2ZmIG11bHRpcGxlIG1hdGNoZXMgbGF0ZXIuICovCgltZW1zZXQoJnNlbnRpbmVsLCAwLCBzaXplb2Yoc2VudGluZWwpKTsKCglpZiAobmFtZSA9PSBOVUxMIHx8IHBhaSA9PSBOVUxMKSB7CgkJKnJlc3VsdHAgPSBzZW50aW5lbC5haV9uZXh0OwoJCXJldHVybiAoTlNfVU5BVkFJTCk7Cgl9CgoJbWJ1ZnAgPSBtYWxsb2MoKHNpemVvZihzdHJ1Y3QgaG9zdGVudCkgKyBtYnVmbGVuKSk7CglpZiAobWJ1ZnAgPT0gTlVMTCkgewoJCSpyZXN1bHRwID0gc2VudGluZWwuYWlfbmV4dDsKCQlyZXR1cm4gKE5TX1VOQVZBSUwpOwoJfQoJaHAgPSAoc3RydWN0IGhvc3RlbnQgKiltYnVmcDsKCWJ1ZmZlciA9IChjaGFyICopKGhwICsgMSk7CgoJY2J1ZnAgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykgKwoJICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSkpOwoJaWYgKGNidWZwID09IE5VTEwpIHsKCQlmcmVlKG1idWZwKTsKCQkqcmVzdWx0cCA9IHNlbnRpbmVsLmFpX25leHQ7CgkJcmV0dXJuIChOU19VTkFWQUlMKTsKCX0KCWFpID0gKHN0cnVjdCBhZGRyaW5mbyAqKWNidWZwOwoJcHNhID0gKHN0cnVjdCBzb2NrYWRkciAqKShhaSArIDEpOwoKCS8qCgkgKiAxLiBTZWxlY3Qgd2hpY2ggZnVuY3Rpb24gdG8gY2FsbCBiYXNlZCBvbiB0aGUgYWRkcmVzcyBmYW1pbHkuCgkgKiAyLiBNYXAgaG9zdGVudCB0byBhZGRyaW5mby4KCSAqIDMuIEhhbmQtb2ZmIGJ1ZmZlciB0byBsaWJjLgoJICovCglzd2l0Y2ggKHBhaS0+YWlfZmFtaWx5KSB7CgljYXNlIEFGX1VOU1BFQzoKCQlzdGF0dXMgPSBfbnNzX21kbnNfZ2V0aG9zdGJ5bmFtZV9yKG5hbWUsIGhwLCBidWZmZXIsIG1idWZsZW4sCgkJCQkJCSAgICZfZXJybm8sICZfaF9lcnJubyk7CgkJYnJlYWs7CgljYXNlIEFGX0lORVQ6CgkJc3RhdHVzID0gX25zc19tZG5zNF9nZXRob3N0YnluYW1lX3IobmFtZSwgaHAsIGJ1ZmZlciwgbWJ1ZmxlbiwKCQkJCQkJICAgICZfZXJybm8sICZfaF9lcnJubyk7CgkJYnJlYWs7CgljYXNlIEFGX0lORVQ2OgoJCXN0YXR1cyA9IF9uc3NfbWRuczZfZ2V0aG9zdGJ5bmFtZV9yKG5hbWUsIGhwLCBidWZmZXIsIG1idWZsZW4sCgkJCQkJCSAgICAmX2Vycm5vLCAmX2hfZXJybm8pOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlicmVhazsKCX0KCXN0YXR1cyA9IF9fbnNzX2NvbXBhdF9yZXN1bHQoc3RhdHVzLCBfZXJybm8pOwoKCWlmIChzdGF0dXMgPT0gTlNfU1VDQ0VTUykgewoJCW1lbXNldChhaSwgMCwgc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykpOwoJCWFpLT5haV9mbGFncyA9IHBhaS0+YWlfZmxhZ3M7CgkJYWktPmFpX3NvY2t0eXBlID0gcGFpLT5haV9zb2NrdHlwZTsKCQlhaS0+YWlfcHJvdG9jb2wgPSBwYWktPmFpX3Byb3RvY29sOwoJCWFpLT5haV9mYW1pbHkgPSBocC0+aF9hZGRydHlwZTsKCQltZW1zZXQocHNhLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpKTsKCQlwc2EtPnNhX2xlbiA9IGFpLT5haV9hZGRybGVuOwoJCXBzYS0+c2FfZmFtaWx5ID0gYWktPmFpX2ZhbWlseTsKCQlhaS0+YWlfYWRkciA9IHBzYTsKCQloYXAgPSBocC0+aF9hZGRyX2xpc3RbMF07CgkJc3dpdGNoIChhaS0+YWlfZmFtaWx5KSB7CgkJY2FzZSBBRl9JTkVUOgoJCQlhaS0+YWlfYWRkcmxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOwoJCQltZW1jcHkoJigoc3RydWN0IHNvY2thZGRyX2luICopcHNhKS0+c2luX2FkZHIsIGhhcCwKCQkJICAgIGFpLT5haV9hZGRybGVuKTsKCQkJYnJlYWs7CgkJY2FzZSBBRl9JTkVUNjoKCQkJYWktPmFpX2FkZHJsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CgkJCW1lbWNweSgmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopcHNhKS0+c2luNl9hZGRyLCBoYXAsCgkJCSAgICBhaS0+YWlfYWRkcmxlbik7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWFpLT5haV9hZGRybGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKTsKCQkJbWVtY3B5KHBzYS0+c2FfZGF0YSwgaGFwLCBhaS0+YWlfYWRkcmxlbik7CgkJfQoJCXNlbnRpbmVsLmFpX25leHQgPSBhaTsKCQlmcmVlKG1idWZwKTsKCX0KCglpZiAoc2VudGluZWwuYWlfbmV4dCA9PSBOVUxMKSB7CgkJZnJlZShjYnVmcCk7CgkJZnJlZShtYnVmcCk7Cgl9CgoJKnJlc3VsdHAgPSBzZW50aW5lbC5haV9uZXh0OwoJcmV0dXJuIChzdGF0dXMpOwp9CgovKgogKiBDYWxsaW5nIGNvbnZlbnRpb246CiAqIGFwOiBjb25zdCB1X2NoYXIgKnVhZGRyLCBzb2NrbGVuX3QgbGVuLCBpbnQgYWYsIHN0cnVjdCBob3N0ZW50ICpocCwKICogICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbiwgaW50IHJldF9lcnJubywgaW50ICpoX2Vycm5vcAogKiByZXR2YWw6IHNob3VsZCBiZSBzZXQgdG8gTlVMTCBvciBocCBwYXNzZWQgaW4KICovCnN0YXRpYyBpbnQKX19uc3NfYnNkY29tcGF0X2dldGhvc3RieWFkZHJfcih2b2lkICpyZXR2YWwsIHZvaWQgKm1kYXRhIF9fdW51c2VkLCB2YV9saXN0IGFwKQp7Cgl2b2lkCQkqYWRkcjsKCWNoYXIJCSpidWY7CglpbnQJCSpoX2Vycm5vcDsKCXN0cnVjdCBob3N0ZW50CSpocDsKCXN0cnVjdCBob3N0ZW50CSoqcmVzdWx0cDsKCWludAkJIGFmOwoJc2l6ZV90CQkgYnVmbGVuOwoJaW50CQkgbGVuOwoJaW50CQkgcmV0X2Vycm5vOwoJZW51bSBuc3Nfc3RhdHVzCSBzdGF0dXM7CgoJYWRkciA9IHZhX2FyZyhhcCwgdm9pZCAqKTsKCWxlbiA9IHZhX2FyZyhhcCwgc29ja2xlbl90KTsKCWFmID0gdmFfYXJnKGFwLCBpbnQpOwoJaHAgPSB2YV9hcmcoYXAsIHN0cnVjdCBob3N0ZW50ICopOwoJYnVmID0gdmFfYXJnKGFwLCBjaGFyICopOwoJYnVmbGVuID0gdmFfYXJnKGFwLCBzaXplX3QpOwoJcmV0X2Vycm5vID0gdmFfYXJnKGFwLCBpbnQpOwoJaF9lcnJub3AgPSB2YV9hcmcoYXAsIGludCAqKTsKCXJlc3VsdHAgPSAoc3RydWN0IGhvc3RlbnQgKiopcmV0dmFsOwoKCSpyZXN1bHRwID0gTlVMTDsKCXN0YXR1cyA9IF9uc3NfbWRuc19nZXRob3N0YnlhZGRyX3IoYWRkciwgbGVuLCBhZiwgaHAsIGJ1ZiwgYnVmbGVuLAoJICAgICZyZXRfZXJybm8sIGhfZXJybm9wKTsKCglzdGF0dXMgPSBfX25zc19jb21wYXRfcmVzdWx0KHN0YXR1cywgKmhfZXJybm9wKTsKCWlmIChzdGF0dXMgPT0gTlNfU1VDQ0VTUykKCQkqcmVzdWx0cCA9IGhwOwoJcmV0dXJuIChzdGF0dXMpOwp9CgovKgogKiBDYWxsaW5nIGNvbnZlbnRpb246CiAqIGFwOiBjb25zdCBjaGFyICpuYW1lLCBpbnQgYWYsIHN0cnVjdCBob3N0ZW50ICpocCwgY2hhciAqYnVmLAogKiAgICAgc2l6ZV90IGJ1ZmxlbiwgaW50IHJldF9lcnJubywgaW50ICpoX2Vycm5vcAogKiByZXR2YWwgaXMgYSBzdHJ1Y3QgaG9zdGVudCAqKnJlc3VsdCBwYXNzZWQgaW4gYnkgdGhlIGxpYmMgY2xpZW50LAogKiB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZyBzdG9yYWdlLgogKi8Kc3RhdGljIGludApfX25zc19ic2Rjb21wYXRfZ2V0aG9zdGJ5bmFtZTJfcih2b2lkICpyZXR2YWwsIHZvaWQgKm1kYXRhIF9fdW51c2VkLAogICAgdmFfbGlzdCBhcCkKewoJY2hhcgkJKmJ1ZjsKCWNvbnN0IGNoYXIgCSpuYW1lOwoJaW50CQkqaF9lcnJub3A7CglzdHJ1Y3QgaG9zdGVudAkqaHA7CglzdHJ1Y3QgaG9zdGVudAkqKnJlc3VsdHA7CglpbnQJCSBhZjsKCXNpemVfdAkJIGJ1ZmxlbjsKCWludAkJIHJldF9lcnJubzsKCWVudW0gbnNzX3N0YXR1cwkgc3RhdHVzOwoKCW5hbWUgPSB2YV9hcmcoYXAsIGNoYXIgKik7CglhZiA9IHZhX2FyZyhhcCwgaW50KTsKCWhwID0gdmFfYXJnKGFwLCBzdHJ1Y3QgaG9zdGVudCAqKTsKCWJ1ZiA9IHZhX2FyZyhhcCwgY2hhciAqKTsKCWJ1ZmxlbiA9IHZhX2FyZyhhcCwgc2l6ZV90KTsKCXJldF9lcnJubyA9IHZhX2FyZyhhcCwgaW50KTsKCWhfZXJybm9wID0gdmFfYXJnKGFwLCBpbnQgKik7CglyZXN1bHRwID0gKHN0cnVjdCBob3N0ZW50ICoqKXJldHZhbDsKCgkqcmVzdWx0cCA9IE5VTEw7CglpZiAoaHAgPT0gTlVMTCkKCQlyZXR1cm4gKE5TX1VOQVZBSUwpOwoKCXN0YXR1cyA9IF9uc3NfbWRuc19nZXRob3N0YnluYW1lMl9yKG5hbWUsIGFmLCBocCwgYnVmLCBidWZsZW4sCgkgICAgJnJldF9lcnJubywgaF9lcnJub3ApOwoKCXN0YXR1cyA9IF9fbnNzX2NvbXBhdF9yZXN1bHQoc3RhdHVzLCAqaF9lcnJub3ApOwoJaWYgKHN0YXR1cyA9PSBOU19TVUNDRVNTKQoJCSpyZXN1bHRwID0gaHA7CglyZXR1cm4gKHN0YXR1cyk7Cn0KCi8qCiAqIFVzZWQgYnkgZ2V0aXBub2RlYnlhZGRyKDMpLgogKgogKiBDYWxsaW5nIGNvbnZlbnRpb246CiAqIGFwOiBzdHJ1Y3QgaW5bNl1fYWRkciAqc3JjLCBzaXplX3QgbGVuLCBpbnQgYWYsIGludCAqZXJycAogKiByZXR2YWw6IHBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIGFuIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGhvc3RlbnQsCiAqIGluIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBhIHNpbmdsZSBwb2ludGVyIHRvIG9uLWhlYXAgc3RvcmFnZS4KICoKICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZyBvbi1oZWFwIHN0b3JhZ2UuCiAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgZnJlZWhvc3RlbnQoKSBvbiB0aGUgcmV0dXJuZWQKICogc3RvcmFnZS4KICovCnN0YXRpYyBpbnQKX19uc3NfYnNkY29tcGF0X2doYnlhZGRyKHZvaWQgKnJldHZhbCwgdm9pZCAqbWRhdGEgX191bnVzZWQsIHZhX2xpc3QgYXApCnsKCWNoYXIJCSpidWZmZXI7Cgl2b2lkIAkJKmJ1ZnA7CglpbnQJCSplcnJwOwoJc3RydWN0IGhvc3RlbnQJKmhwOwoJc3RydWN0IGhvc3RlbnQJKipyZXN1bHRwOwoJdm9pZAkJKnNyYzsKCWludAkJIGFmOwoJc2l6ZV90CQkgYnVmbGVuID0gMTAyNDsKCXNpemVfdAkJIGxlbjsKCWludAkJIGhfZXJybm9wOwoJZW51bSBuc3Nfc3RhdHVzCSBzdGF0dXM7CgoJc3JjID0gdmFfYXJnKGFwLCB2b2lkICopOwoJbGVuID0gdmFfYXJnKGFwLCBzaXplX3QpOwoJYWYgPSB2YV9hcmcoYXAsIGludCk7CgllcnJwID0gdmFfYXJnKGFwLCBpbnQgKik7CglyZXN1bHRwID0gKHN0cnVjdCBob3N0ZW50ICoqKXJldHZhbDsKCglfTlNTX1VUUkFDRSgiX19uc3NfYnNkY29tcGF0X2doYnlhZGRyOiBjYWxsZWQiKTsKCglidWZwID0gbWFsbG9jKChzaXplb2Yoc3RydWN0IGhvc3RlbnQpICsgYnVmbGVuKSk7CglpZiAoYnVmcCA9PSBOVUxMKSB7CgkJKnJlc3VsdHAgPSBOVUxMOwoJCXJldHVybiAoTlNfVU5BVkFJTCk7Cgl9CglocCA9IChzdHJ1Y3QgaG9zdGVudCAqKWJ1ZnA7CglidWZmZXIgPSAoY2hhciAqKShocCArIDEpOwoKCXN0YXR1cyA9IF9uc3NfbWRuc19nZXRob3N0YnlhZGRyX3Ioc3JjLCBsZW4sIGFmLCBocCwgYnVmZmVyLAoJICAgIGJ1ZmxlbiwgZXJycCwgJmhfZXJybm9wKTsKCglzdGF0dXMgPSBfX25zc19jb21wYXRfcmVzdWx0KHN0YXR1cywgKmVycnApOwoJaWYgKHN0YXR1cyAhPSBOU19TVUNDRVNTKSB7CgkJZnJlZShidWZwKTsKCQlocCA9IE5VTEw7Cgl9CgkqcmVzdWx0cCA9IGhwOwoJcmV0dXJuIChzdGF0dXMpOwp9CgovKgogKiBVc2VkIGJ5IGdldGlwbm9kZWJ5bmFtZSgzKS4KICoKICogQ2FsbGluZyBjb252ZW50aW9uOgogKiBhcDogY29uc3QgY2hhciAqbmFtZSwgaW50IGFmLCBpbnQgKmVycnAKICogcmV0dmFsOiBwb2ludGVyIHRvIGEgcG9pbnRlciB0byBhbiB1bmluaXRpYWxpemVkIHN0cnVjdCBob3N0ZW50LgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIG9uLWhlYXAgc3RvcmFnZS4KICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBmcmVlaG9zdGVudCgpIG9uIHRoZSByZXR1cm5lZAogKiBzdG9yYWdlLgogKi8Kc3RhdGljIGludApfX25zc19ic2Rjb21wYXRfZ2hieW5hbWUodm9pZCAqcmV0dmFsLCB2b2lkICptZGF0YSBfX3VudXNlZCwgdmFfbGlzdCBhcCkKewoJY2hhcgkJKmJ1ZmZlcjsKCXZvaWQgCQkqYnVmcDsKCWludAkJKmVycnA7CglzdHJ1Y3QgaG9zdGVudAkqaHA7CglzdHJ1Y3QgaG9zdGVudAkqKnJlc3VsdHA7CgljaGFyCQkqbmFtZTsKCWludAkJIGFmOwoJc2l6ZV90CQkgYnVmbGVuID0gMTAyNDsKCWludAkJIGhfZXJybm9wOwoJZW51bSBuc3Nfc3RhdHVzCSBzdGF0dXM7CgoJbmFtZSA9IHZhX2FyZyhhcCwgY2hhciAqKTsKCWFmID0gdmFfYXJnKGFwLCBpbnQpOwoJZXJycCA9IHZhX2FyZyhhcCwgaW50ICopOwoJcmVzdWx0cCA9IChzdHJ1Y3QgaG9zdGVudCAqKilyZXR2YWw7CgoJYnVmcCA9IG1hbGxvYygoc2l6ZW9mKHN0cnVjdCBob3N0ZW50KSArIGJ1ZmxlbikpOwoJaWYgKGJ1ZnAgPT0gTlVMTCkgewoJCSpyZXN1bHRwID0gTlVMTDsKCQlyZXR1cm4gKE5TX1VOQVZBSUwpOwoJfQoJaHAgPSAoc3RydWN0IGhvc3RlbnQgKilidWZwOwoJYnVmZmVyID0gKGNoYXIgKikoaHAgKyAxKTsKCglzdGF0dXMgPSBfbnNzX21kbnNfZ2V0aG9zdGJ5bmFtZV9yKG5hbWUsIGhwLCBidWZmZXIsIGJ1ZmxlbiwgZXJycCwKCSAgICAmaF9lcnJub3ApOwoKCXN0YXR1cyA9IF9fbnNzX2NvbXBhdF9yZXN1bHQoc3RhdHVzLCAqZXJycCk7CglpZiAoc3RhdHVzICE9IE5TX1NVQ0NFU1MpIHsKCQlmcmVlKGJ1ZnApOwoJCWhwID0gTlVMTDsKCX0KCSpyZXN1bHRwID0gaHA7CglyZXR1cm4gKHN0YXR1cyk7Cn0KCiNlbmRpZiAvKiAhTk9fQlVJTERfQlNEX05TUyAqLwo=