LyoKICogaW50ZWxmYgogKgogKiBMaW51eCBmcmFtZWJ1ZmZlciBkcml2ZXIgZm9yIEludGVsKFIpIDgzME0vODQ1Ry84NTJHTS84NTVHTS84NjVHLzkxNUcvOTE1R00KICogaW50ZWdyYXRlZCBncmFwaGljcyBjaGlwcy4KICoKICogQ29weXJpZ2h0IKkgMjAwMiwgMjAwMyBEYXZpZCBEYXdlcyA8ZGF3ZXNAeGZyZWU4Ni5vcmc+CiAqICAgICAgICAgICAgICAgICAgIDIwMDQgU3lsdmFpbiBNZXllcgogKgogKiBUaGlzIGRyaXZlciBjb25zaXN0cyBvZiB0d28gcGFydHMuICBUaGUgZmlyc3QgcGFydCAoaW50ZWxmYmRydi5jKSBwcm92aWRlcwogKiB0aGUgYmFzaWMgZmJkZXYgaW50ZXJmYWNlcywgaXMgZGVyaXZlZCBpbiBwYXJ0IGZyb20gdGhlIHJhZGVvbmZiIGFuZAogKiB2ZXNhZmIgZHJpdmVycywgYW5kIGlzIGNvdmVyZWQgYnkgdGhlIEdQTC4gIFRoZSBzZWNvbmQgcGFydCAoaW50ZWxmYmh3LmMpCiAqIHByb3ZpZGVzIHRoZSBjb2RlIHRvIHByb2dyYW0gdGhlIGhhcmR3YXJlLiAgTW9zdCBvZiBpdCBpcyBkZXJpdmVkIGZyb20KICogdGhlIGk4MTAvaTgzMCBYRnJlZTg2IGRyaXZlci4gIFRoZSBIVy1zcGVjaWZpYyBjb2RlIGlzIGNvdmVyZWQgaGVyZQogKiB1bmRlciBhIGR1YWwgbGljZW5zZSAoR1BMIGFuZCBNSVQvWEZyZWU4NiBsaWNlbnNlKS4KICoKICogQXV0aG9yOiBEYXZpZCBEYXdlcwogKgogKi8KCi8qICRESEQ6IGludGVsZmIvaW50ZWxmYmRydi5jLHYgMS4yMCAyMDAzLzA2LzI3IDE1OjE3OjQwIGRhd2VzIEV4cCAkICovCgovKgogKiBDaGFuZ2VzOgogKiAgICAwMS8yMDAzIC0gSW5pdGlhbCBkcml2ZXIgKDAuMS4wKSwgbm8gbW9kZSBzd2l0Y2hpbmcsIG5vIGFjY2VsZXJhdGlvbi4KICoJCVRoaXMgaW5pdGlhbCB2ZXJzaW9uIGlzIGEgYmFzaWMgY29yZSB0aGF0IHdvcmtzIGEgbG90IGxpa2UKICoJCXRoZSB2ZXNhZmIgZHJpdmVyLiAgSXQgbXVzdCBiZSBidWlsdC1pbiB0byB0aGUga2VybmVsLAogKgkJYW5kIHRoZSBpbml0aWFsIHZpZGVvIG1vZGUgbXVzdCBiZSBzZXQgd2l0aCB2Z2E9WFhYIGF0CiAqCQlib290IHRpbWUuICAoRGF2aWQgRGF3ZXMpCiAqCiAqICAgIDAxLzIwMDMgLSBWZXJzaW9uIDAuMi4wOiBNb2RlIHN3aXRjaGluZyBhZGRlZCwgY29sb3JtYXAgc3VwcG9ydAogKgkJaW1wbGVtZW50ZWQsIFkgcGFubmluZywgYW5kIHNvZnQgc2NyZWVuIGJsYW5raW5nIGltcGxlbWVudGVkLgogKgkJTm8gYWNjZWxlcmF0aW9uIHlldC4gIChEYXZpZCBEYXdlcykKICoKICogICAgMDEvMjAwMyAtIFZlcnNpb24gMC4zLjA6IGZiY29uIGFjY2VsZXJhdGlvbiBzdXBwb3J0IGFkZGVkLiAgTW9kdWxlCiAqCQlvcHRpb24gaGFuZGxpbmcgYWRkZWQuICAoRGF2aWQgRGF3ZXMpCiAqCiAqICAgIDAxLzIwMDMgLSBWZXJzaW9uIDAuNC4wOiBmYmNvbiBIVyBjdXJzb3Igc3VwcG9ydCBhZGRlZC4gIChEYXZpZCBEYXdlcykKICoKICogICAgMDEvMjAwMyAtIFZlcnNpb24gMC40LjE6IEFkZCBhdXRvLWdlbmVyYXRpb24gb2YgYnVpbHQtaW4gbW9kZXMuCiAqCQkoRGF2aWQgRGF3ZXMpCiAqCiAqICAgIDAyLzIwMDMgLSBWZXJzaW9uIDAuNC4yOiBBZGQgY2hlY2sgZm9yIGFjdGl2ZSBub24tQ1JUIGRldmljZXMsIGFuZAogKgkJbW9kZSB2YWxpZGF0aW9uIGNoZWNrcy4gIChEYXZpZCBEYXdlcykKICoKICogICAgMDIvMjAwMyAtIFZlcnNpb24gMC40LjM6IENoZWNrIHdoZW4gdGhlIFZDIGlzIGluIGdyYXBoaWNzIG1vZGUgc28gdGhhdAogKgkJYWNjZWxlcmF0aW9uIGlzIGRpc2FibGVkIHdoaWxlIGFuIFhGcmVlODYgc2VydmVyIGlzIHJ1bm5pbmcuCiAqCQkoRGF2aWQgRGF3ZXMpCiAqCiAqICAgIDAyLzIwMDMgLSBWZXJzaW9uIDAuNC40OiBNb25pdG9yIERQTVMgc3VwcG9ydC4gIChEYXZpZCBEYXdlcykKICoKICogICAgMDIvMjAwMyAtIFZlcnNpb24gMC40LjU6IEJhc2ljIFhGcmVlODYgKyBmYmRldiB3b3JraW5nLiAgKERhdmlkIERhd2VzKQogKgogKiAgICAwMi8yMDAzIC0gVmVyc2lvbiAwLjUuMDogTW9kaWZ5IHRvIHdvcmsgd2l0aCB0aGUgMi41LjMyIGtlcm5lbCBhcyB3ZWxsCiAqCQlhcyAyLjQueCBrZXJuZWxzLiAgKERhdmlkIERhd2VzKQogKgogKiAgICAwMi8yMDAzIC0gVmVyc2lvbiAwLjYuMDogU3BsaXQgb3V0IEhXLXNwZWNpZmljcyBpbnRvIGEgc2VwYXJhdGUgZmlsZS4KICoJCShEYXZpZCBEYXdlcykKICoKICogICAgMDIvMjAwMyAtIFZlcnNpb24gMC43LjA6IFRlc3Qgb24gODUyR00vODU1R00uICBBY2NlbGVyYXRpb24gYW5kIEhXCiAqCQljdXJzb3IgYXJlIGRpc2FibGVkIG9uIHRoaXMgcGxhdGZvcm0uICAoRGF2aWQgRGF3ZXMpCiAqCiAqICAgIDAyLzIwMDMgLSBWZXJzaW9uIDAuNy4xOiBUZXN0IG9uIDg0NUcuICBBY2NlbGVyYXRpb24gaXMgZGlzYWJsZWQKICoJCW9uIHRoaXMgcGxhdGZvcm0uICAoRGF2aWQgRGF3ZXMpCiAqCiAqICAgIDAyLzIwMDMgLSBWZXJzaW9uIDAuNy4yOiBUZXN0IG9uIDgzME0uICBBY2NlbGVyYXRpb24gYW5kIEhXCiAqCQljdXJzb3IgYXJlIGRpc2FibGVkIG9uIHRoaXMgcGxhdGZvcm0uICAoRGF2aWQgRGF3ZXMpCiAqCiAqICAgIDAyLzIwMDMgLSBWZXJzaW9uIDAuNy4zOiBGaXggOC1iaXQgbW9kZXMgZm9yIG1vYmlsZSBwbGF0Zm9ybXMKICoJCShEYXZpZCBEYXdlcykKICoKICogICAgMDIvMjAwMyAtIFZlcnNpb24gMC43LjQ6IEFkZCBjaGVja3MgZm9yIEZCIGFuZCBGQkNPTl9IQVNfQ0ZCKiBjb25maWd1cmVkCiAqCQlpbiB0aGUga2VybmVsLCBhbmQgYWRkIG1vZGUgYnBwIHZlcmlmaWNhdGlvbiBhbmQgZGVmYXVsdAogKgkJYnBwIHNlbGVjdGlvbiBiYXNlZCBvbiB3aGljaCBGQkNPTl9IQVNfQ0ZCKiBhcmUgY29uZmlndXJlZC4KICoJCShEYXZpZCBEYXdlcykKICoKICogICAgMDIvMjAwMyAtIFZlcnNpb24gMC43LjU6IEFkZCBiYXNpYyBwYWNrYWdlL2luc3RhbGwgc2NyaXB0cyBiYXNlZCBvbiB0aGUKICoJCURSSSBwYWNrYWdpbmcgc2NyaXB0cy4gIChEYXZpZCBEYXdlcykKICoKICogICAgMDQvMjAwMyAtIFZlcnNpb24gMC43LjY6IEZpeCB0eXBvIHRoYXQgYWZmZWN0cyBidWlsZHMgd2l0aCBTTVAtZW5hYmxlZAogKgkJa2VybmVscy4gIChEYXZpZCBEYXdlcywgcmVwb3J0ZWQgYnkgQW51cGFtKS4KICoKICogICAgMDYvMjAwMyAtIFZlcnNpb24gMC43Ljc6CiAqICAgICAgICAgICAgICBGaXggTWFrZWZpbGUua2VybmVsIGJ1aWxkIHByb2JsZW0gKFRzdXRvbXUgWWFzdWRhKS4KICoJCUZpeCBtaXMtcGxhY2VkICNlbmRpZiAoMi40LjIxIGtlcm5lbCkuCiAqCiAqICAgIDA5LzIwMDQgLSBWZXJzaW9uIDAuOS4wIC0gYnkgU3lsdmFpbiBNZXllcgogKiAgICAgICAgICAgICAgUG9ydCB0byBsaW51eCAyLjYga2VybmVsIGZiZGV2CiAqICAgICAgICAgICAgICBGaXggSFcgYWNjZWwgYW5kIEhXIGN1cnNvciBvbiBpODQ1RwogKiAgICAgICAgICAgICAgVXNlIG9mIGFncGdhcnQgZm9yIGZiIG1lbW9yeSByZXNlcnZhdGlvbgogKiAgICAgICAgICAgICAgQWRkIG10cnIgc3VwcG9ydAogKgogKiAgICAxMC8yMDA0IC0gVmVyc2lvbiAwLjkuMQogKiAgICAgICAgICAgICAgVXNlIG1vZHVsZV9wYXJhbSBpbnN0ZWFkIG9mIG9sZCBNT0RVTEVfUEFSTQogKiAgICAgICAgICAgICAgU29tZSBjbGVhbnVwCiAqCiAqICAgIDExLzIwMDQgLSBWZXJzaW9uIDAuOS4yCiAqICAgICAgICAgICAgICBBZGQgdnJhbSBvcHRpb24gdG8gcmVzZXJ2ZSBtb3JlIG1lbW9yeSB0aGFuIHN0b2xlbiBieSBCSU9TCiAqICAgICAgICAgICAgICBGaXggaW50ZWxmYmh3X3Bhbl9kaXNwbGF5IHR5cG8KICogICAgICAgICAgICAgIEFkZCBfX2luaXRkYXRhIGFubm90YXRpb25zCiAqCiAqIFRPRE86CiAqCiAqCiAqIFdpc2ggTGlzdDoKICoKICoKICovCgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgojaW5jbHVkZSA8bGludXgvbW0uaD4KI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgojaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgoKI2luY2x1ZGUgPGFzbS9pby5oPgoKI2lmZGVmIENPTkZJR19NVFJSCiNpbmNsdWRlIDxhc20vbXRyci5oPgojZW5kaWYKCiNpbmNsdWRlICJpbnRlbGZiLmgiCiNpbmNsdWRlICJpbnRlbGZiaHcuaCIKCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBnZXRfaW5pdGlhbF9tb2RlKHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvKTsKc3RhdGljIHZvaWQgdXBkYXRlX2RpbmZvKHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvLAoJCQkgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpOwpzdGF0aWMgaW50IGludGVsZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAoJCQkgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKc3RhdGljIGludCBpbnRlbGZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pOwpzdGF0aWMgaW50IGludGVsZmJfc2V0Y29scmVnKHVuc2lnbmVkIHJlZ25vLCB1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLAoJCQkgICAgIHVuc2lnbmVkIGJsdWUsIHVuc2lnbmVkIHRyYW5zcCwKCQkJICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CgpzdGF0aWMgaW50IGludGVsZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgaW50ZWxmYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKCQkJICAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKCnN0YXRpYyB2b2lkIGludGVsZmJfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sCgkJCSAgICAgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KTsKc3RhdGljIHZvaWQgaW50ZWxmYl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKCQkJICAgICBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKnJlZ2lvbik7CnN0YXRpYyB2b2lkIGludGVsZmJfaW1hZ2VibGl0KHN0cnVjdCBmYl9pbmZvICppbmZvLAoJCQkgICAgICBjb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKmltYWdlKTsKc3RhdGljIGludCBpbnRlbGZiX2N1cnNvcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKCQkJICAgc3RydWN0IGZiX2N1cnNvciAqY3Vyc29yKTsKCnN0YXRpYyBpbnQgaW50ZWxmYl9zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKCnN0YXRpYyBpbnQgaW50ZWxmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKCnN0YXRpYyBpbnQgX19kZXZpbml0IGludGVsZmJfcGNpX3JlZ2lzdGVyKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAoJCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CnN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpbnRlbGZiX3BjaV91bnJlZ2lzdGVyKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKc3RhdGljIGludCBfX2RldmluaXQgaW50ZWxmYl9zZXRfZmJpbmZvKHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvKTsKCi8qCiAqIExpbWl0aW5nIHRoZSBjbGFzcyB0byBQQ0lfQ0xBU1NfRElTUExBWV9WR0EgcHJldmVudHMgZnVuY3Rpb24gMSBvZiB0aGUKICogbW9iaWxlIGNoaXBzZXRzIGZyb20gYmVpbmcgcmVnaXN0ZXJlZC4KICovCiNpZiBERVRFQ1RfVkdBX0NMQVNTX09OTFkKI2RlZmluZSBJTlRFTEZCX0NMQVNTX01BU0sgfjAgPDwgOAojZWxzZQojZGVmaW5lIElOVEVMRkJfQ0xBU1NfTUFTSyAwCiNlbmRpZgoKc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGludGVsZmJfcGNpX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MzBNLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQ0xBU1NfRElTUExBWV9WR0EgPDwgOCwgSU5URUxGQl9DTEFTU19NQVNLLCBJTlRFTF84MzBNIH0sCgl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODQ1RywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX0RJU1BMQVlfVkdBIDw8IDgsIElOVEVMRkJfQ0xBU1NfTUFTSywgSU5URUxfODQ1RyB9LAoJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzg1WEdNLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQ0xBU1NfRElTUExBWV9WR0EgPDwgOCwgSU5URUxGQl9DTEFTU19NQVNLLCBJTlRFTF84NVhHTSB9LAoJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzg2NUcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9DTEFTU19ESVNQTEFZX1ZHQSA8PCA4LCBJTlRFTEZCX0NMQVNTX01BU0ssIElOVEVMXzg2NUcgfSwKCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF85MTVHLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQ0xBU1NfRElTUExBWV9WR0EgPDwgOCwgSU5URUxGQl9DTEFTU19NQVNLLCBJTlRFTF85MTVHIH0sCgl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfOTE1R00sIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9DTEFTU19ESVNQTEFZX1ZHQSA8PCA4LCBJTlRFTEZCX0NMQVNTX01BU0ssIElOVEVMXzkxNUdNIH0sCgl7IDAsIH0KfTsKCi8qIEdsb2JhbCBkYXRhICovCnN0YXRpYyBpbnQgbnVtX3JlZ2lzdGVyZWQgPSAwOwoKLyogZmIgb3BzICovCnN0YXRpYyBzdHJ1Y3QgZmJfb3BzIGludGVsX2ZiX29wcyA9IHsKCS5vd25lciA9CQlUSElTX01PRFVMRSwKCS5mYl9jaGVja192YXIgPSAgICAgICAgIGludGVsZmJfY2hlY2tfdmFyLAoJLmZiX3NldF9wYXIgPSAgICAgICAgICAgaW50ZWxmYl9zZXRfcGFyLAoJLmZiX3NldGNvbHJlZyA9CQlpbnRlbGZiX3NldGNvbHJlZywKCS5mYl9ibGFuayA9CQlpbnRlbGZiX2JsYW5rLAoJLmZiX3Bhbl9kaXNwbGF5ID0gICAgICAgaW50ZWxmYl9wYW5fZGlzcGxheSwKCS5mYl9maWxscmVjdCAgPSAgICAgICAgIGludGVsZmJfZmlsbHJlY3QsCgkuZmJfY29weWFyZWEgID0gICAgICAgICBpbnRlbGZiX2NvcHlhcmVhLAoJLmZiX2ltYWdlYmxpdCA9ICAgICAgICAgaW50ZWxmYl9pbWFnZWJsaXQsCgkuZmJfY3Vyc29yID0gICAgICAgICAgICBpbnRlbGZiX2N1cnNvciwKCS5mYl9zeW5jID0gICAgICAgICAgICAgIGludGVsZmJfc3luYywKCS5mYl9pb2N0bCA9CQlpbnRlbGZiX2lvY3RsCn07CgovKiBQQ0kgZHJpdmVyIG1vZHVsZSB0YWJsZSAqLwpzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaW50ZWxmYl9kcml2ZXIgPSB7CgkubmFtZSA9CQkiaW50ZWxmYiIsCgkuaWRfdGFibGUgPQlpbnRlbGZiX3BjaV90YWJsZSwKCS5wcm9iZSA9CWludGVsZmJfcGNpX3JlZ2lzdGVyLAoJLnJlbW92ZSA9CV9fZGV2ZXhpdF9wKGludGVsZmJfcGNpX3VucmVnaXN0ZXIpCn07CgovKiBNb2R1bGUgZGVzY3JpcHRpb24vcGFyYW1ldGVycyAqLwpNT0RVTEVfQVVUSE9SKCJEYXZpZCBEYXdlcyA8ZGF3ZXNAdHVuZ3N0ZW5ncmFwaGljcy5jb20+LCAiCgkgICAgICAiU3lsdmFpbiBNZXllciA8c3lsdmFpbi5tZXllckB3b3JsZG9ubGluZS5mcj4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKAoJIkZyYW1lYnVmZmVyIGRyaXZlciBmb3IgSW50ZWwoUikgIiBTVVBQT1JURURfQ0hJUFNFVFMgIiBjaGlwc2V0cyIpOwpNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7Ck1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpbnRlbGZiX3BjaV90YWJsZSk7CgpzdGF0aWMgaW50IGFjY2VsICAgICAgICA9IDE7CnN0YXRpYyBpbnQgdnJhbSAgICAgICAgID0gNDsKc3RhdGljIGludCBod2N1cnNvciAgICAgPSAwOwpzdGF0aWMgaW50IG10cnIgICAgICAgICA9IDE7CnN0YXRpYyBpbnQgZml4ZWQgICAgICAgID0gMDsKc3RhdGljIGludCBub2luaXQgICAgICAgPSAwOwpzdGF0aWMgaW50IG5vcmVnaXN0ZXIgICA9IDA7CnN0YXRpYyBpbnQgcHJvYmVvbmx5ICAgID0gMDsKc3RhdGljIGludCBpZG9ubHkgICAgICAgPSAwOwpzdGF0aWMgaW50IGJhaWxlYXJseSAgICA9IDA7CnN0YXRpYyBpbnQgdm9mZnNldAk9IDQ4OwpzdGF0aWMgY2hhciAqbW9kZSAgICAgICA9IE5VTEw7Cgptb2R1bGVfcGFyYW0oYWNjZWwsIGJvb2wsIFNfSVJVR08pOwpNT0RVTEVfUEFSTV9ERVNDKGFjY2VsLCAiRW5hYmxlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiIpOwptb2R1bGVfcGFyYW0odnJhbSwgaW50LCBTX0lSVUdPKTsKTU9EVUxFX1BBUk1fREVTQyh2cmFtLCAiU3lzdGVtIFJBTSB0byBhbGxvY2F0ZSB0byBmcmFtZWJ1ZmZlciBpbiBNaUIiKTsKbW9kdWxlX3BhcmFtKHZvZmZzZXQsIGludCwgU19JUlVHTyk7Ck1PRFVMRV9QQVJNX0RFU0Modm9mZnNldCwgIk9mZnNldCBvZiBmcmFtZWJ1ZmZlciBpbiBNaUIiKTsKbW9kdWxlX3BhcmFtKGh3Y3Vyc29yLCBib29sLCBTX0lSVUdPKTsKTU9EVUxFX1BBUk1fREVTQyhod2N1cnNvciwgIkVuYWJsZSBIVyBjdXJzb3IiKTsKbW9kdWxlX3BhcmFtKG10cnIsIGJvb2wsIFNfSVJVR08pOwpNT0RVTEVfUEFSTV9ERVNDKG10cnIsICJFbmFibGUgTVRSUiBzdXBwb3J0Iik7Cm1vZHVsZV9wYXJhbShmaXhlZCwgYm9vbCwgU19JUlVHTyk7Ck1PRFVMRV9QQVJNX0RFU0MoZml4ZWQsICJEaXNhYmxlIG1vZGUgc3dpdGNoaW5nIik7Cm1vZHVsZV9wYXJhbShub2luaXQsIGJvb2wsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG5vaW5pdCwgIkRvbid0IGluaXRpYWxpc2UgZ3JhcGhpY3MgbW9kZSB3aGVuIGxvYWRpbmciKTsKbW9kdWxlX3BhcmFtKG5vcmVnaXN0ZXIsIGJvb2wsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG5vcmVnaXN0ZXIsICJEb24ndCByZWdpc3RlciwganVzdCBwcm9iZSBhbmQgZXhpdCAoZGVidWcpIik7Cm1vZHVsZV9wYXJhbShwcm9iZW9ubHksIGJvb2wsIDApOwpNT0RVTEVfUEFSTV9ERVNDKHByb2Jlb25seSwgIkRvIGEgbWluaW1hbCBwcm9iZSAoZGVidWcpIik7Cm1vZHVsZV9wYXJhbShpZG9ubHksIGJvb2wsIDApOwpNT0RVTEVfUEFSTV9ERVNDKGlkb25seSwgIkp1c3QgaWRlbnRpZnkgd2l0aG91dCBkb2luZyBhbnl0aGluZyBlbHNlIChkZWJ1ZykiKTsKbW9kdWxlX3BhcmFtKGJhaWxlYXJseSwgYm9vbCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoYmFpbGVhcmx5LCAiQmFpbCBvdXQgZWFybHksIGRlcGVuZGluZyBvbiB2YWx1ZSAoZGVidWcpIik7Cm1vZHVsZV9wYXJhbShtb2RlLCBjaGFycCwgU19JUlVHTyk7Ck1PRFVMRV9QQVJNX0RFU0MobW9kZSwKCQkgIkluaXRpYWwgdmlkZW8gbW9kZSBcIjx4cmVzPng8eXJlcz5bLTxkZXB0aD5dW0A8cmVmcmVzaD5dXCIiKTsKCiNpZm5kZWYgTU9EVUxFCiNkZWZpbmUgT1BUX0VRVUFMKG9wdCwgbmFtZSkgKCFzdHJuY21wKG9wdCwgbmFtZSwgc3RybGVuKG5hbWUpKSkKI2RlZmluZSBPUFRfSU5UVkFMKG9wdCwgbmFtZSkgc2ltcGxlX3N0cnRvdWwob3B0ICsgc3RybGVuKG5hbWUpLCBOVUxMLCAwKQojZGVmaW5lIE9QVF9TVFJWQUwob3B0LCBuYW1lKSAob3B0ICsgc3RybGVuKG5hbWUpKQoKc3RhdGljIF9faW5saW5lX18gY2hhciAqCmdldF9vcHRfc3RyaW5nKGNvbnN0IGNoYXIgKnRoaXNfb3B0LCBjb25zdCBjaGFyICpuYW1lKQp7Cgljb25zdCBjaGFyICpwOwoJaW50IGk7CgljaGFyICpyZXQ7CgoJcCA9IE9QVF9TVFJWQUwodGhpc19vcHQsIG5hbWUpOwoJaSA9IDA7Cgl3aGlsZSAocFtpXSAmJiBwW2ldICE9ICcgJyAmJiBwW2ldICE9ICcsJykKCQlpKys7CglyZXQgPSBrbWFsbG9jKGkgKyAxLCBHRlBfS0VSTkVMKTsKCWlmIChyZXQpIHsKCQlzdHJuY3B5KHJldCwgcCwgaSk7CgkJcmV0W2ldID0gJ1wwJzsKCX0KCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBfX2lubGluZV9fIGludApnZXRfb3B0X2ludChjb25zdCBjaGFyICp0aGlzX29wdCwgY29uc3QgY2hhciAqbmFtZSwgaW50ICpyZXQpCnsKCWlmICghcmV0KQoJCXJldHVybiAwOwoKCWlmICghT1BUX0VRVUFMKHRoaXNfb3B0LCBuYW1lKSkKCQlyZXR1cm4gMDsKCgkqcmV0ID0gT1BUX0lOVFZBTCh0aGlzX29wdCwgbmFtZSk7CglyZXR1cm4gMTsKfQoKc3RhdGljIF9faW5saW5lX18gaW50CmdldF9vcHRfYm9vbChjb25zdCBjaGFyICp0aGlzX29wdCwgY29uc3QgY2hhciAqbmFtZSwgaW50ICpyZXQpCnsKCWlmICghcmV0KQoJCXJldHVybiAwOwoKCWlmIChPUFRfRVFVQUwodGhpc19vcHQsIG5hbWUpKSB7CgkJaWYgKHRoaXNfb3B0W3N0cmxlbihuYW1lKV0gPT0gJz0nKQoJCQkqcmV0ID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyBzdHJsZW4obmFtZSkgKyAxLAoJCQkJCSAgICAgIE5VTEwsIDApOwoJCWVsc2UKCQkJKnJldCA9IDE7Cgl9IGVsc2UgewoJCWlmIChPUFRfRVFVQUwodGhpc19vcHQsICJubyIpICYmIE9QVF9FUVVBTCh0aGlzX29wdCArIDIsIG5hbWUpKQoJCQkqcmV0ID0gMDsKCQllbHNlCgkJCXJldHVybiAwOwoJfQoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgX19pbml0CmludGVsZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKewoJY2hhciAqdGhpc19vcHQ7CgoJREJHX01TRygiaW50ZWxmYl9zZXR1cFxuIik7CgoJaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykgewoJCURCR19NU0coIm5vIG9wdGlvbnNcbiIpOwoJCXJldHVybiAwOwoJfSBlbHNlCgkJREJHX01TRygib3B0aW9uczogJXNcbiIsIG9wdGlvbnMpOwoKCS8qCgkgKiBUaGVzZSBhcmUgdGhlIGJ1aWx0LWluIG9wdGlvbnMgYW5hbG9nb3VzIHRvIHRoZSBtb2R1bGUgcGFyYW1ldGVycwoJICogZGVmaW5lZCBhYm92ZS4KCSAqCgkgKiBUaGUgc3ludGF4IGlzOgoJICoKCSAqICAgIHZpZGVvPWludGVsZmI6W21vZGVdWyw8cGFyYW0+PTx2YWw+XSAuLi4KCSAqCgkgKiBlLmcuLAoJICoKCSAqICAgIHZpZGVvPWludGVsZmI6MTAyNHg3NjgtMTZANzUsYWNjZWw9MAoJICovCgoJd2hpbGUgKCh0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkpIHsKCQlpZiAoISp0aGlzX29wdCkKCQkJY29udGludWU7CgkJaWYgKGdldF9vcHRfYm9vbCh0aGlzX29wdCwgImFjY2VsIiwgJmFjY2VsKSkKCQkJOwogCQllbHNlIGlmIChnZXRfb3B0X2ludCh0aGlzX29wdCwgInZyYW0iLCAmdnJhbSkpCgkJCTsKCQllbHNlIGlmIChnZXRfb3B0X2Jvb2wodGhpc19vcHQsICJod2N1cnNvciIsICZod2N1cnNvcikpCgkJCTsKCQllbHNlIGlmIChnZXRfb3B0X2Jvb2wodGhpc19vcHQsICJtdHJyIiwgJm10cnIpKQoJCQk7CgkJZWxzZSBpZiAoZ2V0X29wdF9ib29sKHRoaXNfb3B0LCAiZml4ZWQiLCAmZml4ZWQpKQoJCQk7CgkJZWxzZSBpZiAoZ2V0X29wdF9ib29sKHRoaXNfb3B0LCAiaW5pdCIsICZub2luaXQpKQoJCQlub2luaXQgPSAhbm9pbml0OwoJCWVsc2UgaWYgKE9QVF9FUVVBTCh0aGlzX29wdCwgIm1vZGU9IikpCgkJCW1vZGUgPSBnZXRfb3B0X3N0cmluZyh0aGlzX29wdCwgIm1vZGU9Iik7CgkJZWxzZQoJCQltb2RlID0gdGhpc19vcHQ7Cgl9CgoJcmV0dXJuIDA7Cn0KCiNlbmRpZgoKc3RhdGljIGludCBfX2luaXQKaW50ZWxmYl9pbml0KHZvaWQpCnsKI2lmbmRlZiBNT0RVTEUKCWNoYXIgKm9wdGlvbiA9IE5VTEw7CiNlbmRpZgoKCURCR19NU0coImludGVsZmJfaW5pdFxuIik7CgoJSU5GX01TRygiRnJhbWVidWZmZXIgZHJpdmVyIGZvciAiCgkJIkludGVsKFIpICIgU1VQUE9SVEVEX0NISVBTRVRTICIgY2hpcHNldHNcbiIpOwoJSU5GX01TRygiVmVyc2lvbiAiIElOVEVMRkJfVkVSU0lPTiAiXG4iKTsKCglpZiAoaWRvbmx5KQoJCXJldHVybiAtRU5PREVWOwoKI2lmbmRlZiBNT0RVTEUKCWlmIChmYl9nZXRfb3B0aW9ucygiaW50ZWxmYiIsICZvcHRpb24pKQoJCXJldHVybiAtRU5PREVWOwoJaW50ZWxmYl9zZXR1cChvcHRpb24pOwojZW5kaWYKCglyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaW50ZWxmYl9kcml2ZXIpOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQKaW50ZWxmYl9leGl0KHZvaWQpCnsKCURCR19NU0coImludGVsZmJfZXhpdFxuIik7CglwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmludGVsZmJfZHJpdmVyKTsKfQoKbW9kdWxlX2luaXQoaW50ZWxmYl9pbml0KTsKbW9kdWxlX2V4aXQoaW50ZWxmYl9leGl0KTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgICAgICAgICBtdHJyIHN1cHBvcnQgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmZGVmIENPTkZJR19NVFJSCnN0YXRpYyBpbmxpbmUgdm9pZCBfX2RldmluaXQgc2V0X210cnIoc3RydWN0IGludGVsZmJfaW5mbyAqZGluZm8pCnsKCWRpbmZvLT5tdHJyX3JlZyA9IG10cnJfYWRkKGRpbmZvLT5hcGVydHVyZS5waHlzaWNhbCwKCQkJCSAgIGRpbmZvLT5hcGVydHVyZS5zaXplLCBNVFJSX1RZUEVfV1JDT01CLCAxKTsKCWlmIChkaW5mby0+bXRycl9yZWcgPCAwKSB7CgkJRVJSX01TRygidW5hYmxlIHRvIHNldCBNVFJSXG4iKTsKCQlyZXR1cm47Cgl9CglkaW5mby0+aGFzX210cnIgPSAxOwp9CnN0YXRpYyBpbmxpbmUgdm9pZCB1bnNldF9tdHJyKHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvKQp7CiAgCWlmIChkaW5mby0+aGFzX210cnIpCiAgCQltdHJyX2RlbChkaW5mby0+bXRycl9yZWcsIGRpbmZvLT5hcGVydHVyZS5waHlzaWNhbCwKCQkJIGRpbmZvLT5hcGVydHVyZS5zaXplKTsKfQojZWxzZQojZGVmaW5lIHNldF9tdHJyKHgpIFdSTl9NU0coIk1UUlIgaXMgZGlzYWJsZWQgaW4gdGhlIGtlcm5lbFxuIikKCiNkZWZpbmUgdW5zZXRfbXRycih4KSBkbyB7IH0gd2hpbGUgKDApCiNlbmRpZiAvKiBDT05GSUdfTVRSUiAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlciBpbml0IC8gY2xlYW51cCAgICAgICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZApjbGVhbnVwKHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvKQp7CglEQkdfTVNHKCJjbGVhbnVwXG4iKTsKCglpZiAoIWRpbmZvKQoJCXJldHVybjsKCglmYl9kZWFsbG9jX2NtYXAoJmRpbmZvLT5pbmZvLT5jbWFwKTsKCWtmcmVlKGRpbmZvLT5pbmZvLT5waXhtYXAuYWRkcik7CgoJaWYgKGRpbmZvLT5yZWdpc3RlcmVkKQoJCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoZGluZm8tPmluZm8pOwoKCXVuc2V0X210cnIoZGluZm8pOwoKCWlmIChkaW5mby0+ZmJtZW1fZ2FydCAmJiBkaW5mby0+Z3R0X2ZiX21lbSkgewoJCWFncF91bmJpbmRfbWVtb3J5KGRpbmZvLT5ndHRfZmJfbWVtKTsKCQlhZ3BfZnJlZV9tZW1vcnkoZGluZm8tPmd0dF9mYl9tZW0pOwoJfQoJaWYgKGRpbmZvLT5ndHRfY3Vyc29yX21lbSkgewoJCWFncF91bmJpbmRfbWVtb3J5KGRpbmZvLT5ndHRfY3Vyc29yX21lbSk7CgkJYWdwX2ZyZWVfbWVtb3J5KGRpbmZvLT5ndHRfY3Vyc29yX21lbSk7Cgl9CglpZiAoZGluZm8tPmd0dF9yaW5nX21lbSkgewoJCWFncF91bmJpbmRfbWVtb3J5KGRpbmZvLT5ndHRfcmluZ19tZW0pOwoJCWFncF9mcmVlX21lbW9yeShkaW5mby0+Z3R0X3JpbmdfbWVtKTsKCX0KCglpZiAoZGluZm8tPm1taW9fYmFzZSkKCQlpb3VubWFwKCh2b2lkIF9faW9tZW0gKilkaW5mby0+bW1pb19iYXNlKTsKCWlmIChkaW5mby0+YXBlcnR1cmUudmlydHVhbCkKCQlpb3VubWFwKCh2b2lkIF9faW9tZW0gKilkaW5mby0+YXBlcnR1cmUudmlydHVhbCk7CgoJaWYgKGRpbmZvLT5mbGFnICYgSU5URUxGQl9NTUlPX0FDUVVJUkVEKQoJCXJlbGVhc2VfbWVtX3JlZ2lvbihkaW5mby0+bW1pb19iYXNlX3BoeXMsIElOVEVMX1JFR19TSVpFKTsKCWlmIChkaW5mby0+ZmxhZyAmIElOVEVMRkJfRkJfQUNRVUlSRUQpCgkJcmVsZWFzZV9tZW1fcmVnaW9uKGRpbmZvLT5hcGVydHVyZS5waHlzaWNhbCwKCQkJCSAgIGRpbmZvLT5hcGVydHVyZS5zaXplKTsKCWZyYW1lYnVmZmVyX3JlbGVhc2UoZGluZm8tPmluZm8pOwp9CgojZGVmaW5lIGJhaWxvdXQoZGluZm8pIGRvIHsJCQkJCQlcCglEQkdfTVNHKCJiYWlsb3V0XG4iKTsJCQkJCQlcCgljbGVhbnVwKGRpbmZvKTsJCQkJCQkJXAoJSU5GX01TRygiTm90IGdvaW5nIHRvIHJlZ2lzdGVyIGZyYW1lYnVmZmVyLCBleGl0aW5nLi4uXG4iKTsJXAoJcmV0dXJuIC1FTk9ERVY7CQkJCQkJCVwKfSB3aGlsZSAoMCkKCgpzdGF0aWMgaW50IF9fZGV2aW5pdAppbnRlbGZiX3BjaV9yZWdpc3RlcihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKewoJc3RydWN0IGZiX2luZm8gKmluZm87CglzdHJ1Y3QgaW50ZWxmYl9pbmZvICpkaW5mbzsKCWludCBpLCBlcnIsIGR2bzsKCWludCBhcGVydHVyZV9zaXplLCBzdG9sZW5fc2l6ZTsKCXN0cnVjdCBhZ3Bfa2Vybl9pbmZvIGd0dF9pbmZvOwoJaW50IGFncF9tZW10eXBlOwoJY29uc3QgY2hhciAqczsKCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZTsKIAlpbnQgYXBlcnR1cmVfYmFyID0gMDsKIAlpbnQgbW1pb19iYXIgPSAxOwoJaW50IG9mZnNldDsKCglEQkdfTVNHKCJpbnRlbGZiX3BjaV9yZWdpc3RlclxuIik7CgoJbnVtX3JlZ2lzdGVyZWQrKzsKCWlmIChudW1fcmVnaXN0ZXJlZCAhPSAxKSB7CgkJRVJSX01TRygiQXR0ZW1wdGVkIHRvIHJlZ2lzdGVyICVkIGRldmljZXMgIgoJCQkiKHNob3VsZCBiZSBvbmx5IDEpLlxuIiwgbnVtX3JlZ2lzdGVyZWQpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGludGVsZmJfaW5mbyksICZwZGV2LT5kZXYpOwoJaWYgKCFpbmZvKSB7CgkJRVJSX01TRygiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgaW50ZWxmYl9pbmZvLlxuIik7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CglpZiAoZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAxKSA8IDApIHsKCQlFUlJfTVNHKCJDb3VsZCBub3QgYWxsb2NhdGUgY21hcCBmb3IgaW50ZWxmYl9pbmZvLlxuIik7CgkJZ290byBlcnJfb3V0X2NtYXA7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJZGluZm8gPSBpbmZvLT5wYXI7CglkaW5mby0+aW5mbyAgPSBpbmZvOwoJZGluZm8tPmZib3BzID0gJmludGVsX2ZiX29wczsKCWRpbmZvLT5wZGV2ICA9IHBkZXY7CgoJLyogUmVzZXJ2ZSBwaXhtYXAgc3BhY2UuICovCglpbmZvLT5waXhtYXAuYWRkciA9IGttYWxsb2MoNjQgKiAxMDI0LCBHRlBfS0VSTkVMKTsKCWlmIChpbmZvLT5waXhtYXAuYWRkciA9PSBOVUxMKSB7CgkJRVJSX01TRygiQ2Fubm90IHJlc2VydmUgcGl4bWFwIG1lbW9yeS5cbiIpOwoJCWdvdG8gZXJyX291dF9waXhtYXA7Cgl9CgltZW1zZXQoaW5mby0+cGl4bWFwLmFkZHIsIDAsIDY0ICogMTAyNCk7CgoJLyogc2V0IGVhcmx5IHRoaXMgb3B0aW9uIGJlY2F1c2UgaXQgY291bGQgYmUgY2hhbmdlZCBieSB0diBlbmNvZGVyCgkgICBkcml2ZXIgKi8KCWRpbmZvLT5maXhlZF9tb2RlID0gZml4ZWQ7CgoJLyogRW5hYmxlIGRldmljZS4gKi8KCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldikpKSB7CgkJRVJSX01TRygiQ2Fubm90IGVuYWJsZSBkZXZpY2UuXG4iKTsKCQljbGVhbnVwKGRpbmZvKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCgkvKiBTZXQgYmFzZSBhZGRyZXNzZXMuICovCglpZiAoKGVudC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfOTE1RykgfHwKCQkJKGVudC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfOTE1R00pKSB7CgkJYXBlcnR1cmVfYmFyID0gMjsKCQltbWlvX2JhciA9IDA7CgkJLyogRGlzYWJsZSBIVyBjdXJzb3Igb24gOTE1Ry9NIChub3QgaW1wbGVtZW50ZWQgeWV0KSAqLwoJCWh3Y3Vyc29yID0gMDsKCX0KCWRpbmZvLT5hcGVydHVyZS5waHlzaWNhbCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBhcGVydHVyZV9iYXIpOwoJZGluZm8tPmFwZXJ0dXJlLnNpemUgICAgID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCBhcGVydHVyZV9iYXIpOwoJZGluZm8tPm1taW9fYmFzZV9waHlzICAgID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIG1taW9fYmFyKTsKCURCR19NU0coImZiIGFwZXJ0dXJlOiAweCVsbHgvMHglbGx4LCBNTUlPIHJlZ2lvbjogMHglbGx4LzB4JWxseFxuIiwKCQkodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBhcGVydHVyZV9iYXIpLAoJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX2xlbihwZGV2LCBhcGVydHVyZV9iYXIpLAoJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIG1taW9fYmFyKSwKCQkodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgbW1pb19iYXIpKTsKCgkvKiBSZXNlcnZlIHRoZSBmYiBhbmQgTU1JTyByZWdpb25zICovCglpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihkaW5mby0+YXBlcnR1cmUucGh5c2ljYWwsIGRpbmZvLT5hcGVydHVyZS5zaXplLAoJCQkJSU5URUxGQl9NT0RVTEVfTkFNRSkpIHsKCQlFUlJfTVNHKCJDYW5ub3QgcmVzZXJ2ZSBGQiByZWdpb24uXG4iKTsKCQljbGVhbnVwKGRpbmZvKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglkaW5mby0+ZmxhZyB8PSBJTlRFTEZCX0ZCX0FDUVVJUkVEOwoKCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGRpbmZvLT5tbWlvX2Jhc2VfcGh5cywKCQkJCUlOVEVMX1JFR19TSVpFLAoJCQkJSU5URUxGQl9NT0RVTEVfTkFNRSkpIHsKCQlFUlJfTVNHKCJDYW5ub3QgcmVzZXJ2ZSBNTUlPIHJlZ2lvbi5cbiIpOwoJCWNsZWFudXAoZGluZm8pOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCWRpbmZvLT5mbGFnIHw9IElOVEVMRkJfTU1JT19BQ1FVSVJFRDsKCgkvKiBHZXQgdGhlIGNoaXBzZXQgaW5mby4gKi8KCWRpbmZvLT5wY2lfY2hpcHNldCA9IHBkZXYtPmRldmljZTsKCglpZiAoaW50ZWxmYmh3X2dldF9jaGlwc2V0KHBkZXYsICZkaW5mby0+bmFtZSwgJmRpbmZvLT5jaGlwc2V0LAoJCQkJICAmZGluZm8tPm1vYmlsZSkpIHsKCQljbGVhbnVwKGRpbmZvKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglpZiAoaW50ZWxmYmh3X2dldF9tZW1vcnkocGRldiwgJmFwZXJ0dXJlX3NpemUsJnN0b2xlbl9zaXplKSkgewoJCWNsZWFudXAoZGluZm8pOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCUlORl9NU0coIiUwMng6JTAyeC4lZDogJXMsIGFwZXJ0dXJlIHNpemUgJWRNQiwgIgoJCSJzdG9sZW4gbWVtb3J5ICVka0JcbiIsCgkJcGRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKHBkZXYtPmRldmZuKSwKCQlQQ0lfRlVOQyhwZGV2LT5kZXZmbiksIGRpbmZvLT5uYW1lLAoJCUJ0b01CKGFwZXJ0dXJlX3NpemUpLCBCdG9LQihzdG9sZW5fc2l6ZSkpOwoKCS8qIFNldCB0aGVzZSBmcm9tIHRoZSBvcHRpb25zLiAqLwoJZGluZm8tPmFjY2VsICAgID0gYWNjZWw7CglkaW5mby0+aHdjdXJzb3IgPSBod2N1cnNvcjsKCglpZiAoTk9BQ0NFTF9DSElQU0VUKGRpbmZvKSAmJiBkaW5mby0+YWNjZWwgPT0gMSkgewoJCUlORl9NU0coIkFjY2VsZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgJXMgY2hpcHNldC5cbiIsCgkJCWRpbmZvLT5uYW1lKTsKCQlkaW5mby0+YWNjZWwgPSAwOwoJfQoKCS8qIEZyYW1lYnVmZmVyIHBhcmFtZXRlcnMgLSBVc2UgYWxsIHRoZSBzdG9sZW4gbWVtb3J5IGlmID49IHZyYW0gKi8KCWlmIChST1VORF9VUF9UT19QQUdFKHN0b2xlbl9zaXplKSA+PSBNQih2cmFtKSkgewoJCWRpbmZvLT5mYi5zaXplID0gUk9VTkRfVVBfVE9fUEFHRShzdG9sZW5fc2l6ZSk7CgkJZGluZm8tPmZibWVtX2dhcnQgPSAwOwoJfSBlbHNlIHsKCQlkaW5mby0+ZmIuc2l6ZSA9ICBNQih2cmFtKTsKCQlkaW5mby0+ZmJtZW1fZ2FydCA9IDE7Cgl9CgoJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSByaW5nIGJ1ZmZlciBhbmQgSFcgY3Vyc29yIGlmIGVuYWJsZWQuICovCglpZiAoZGluZm8tPmFjY2VsKSB7CgkJZGluZm8tPnJpbmcuc2l6ZSA9IFJJTkdCVUZGRVJfU0laRTsKCQlkaW5mby0+cmluZ190YWlsX21hc2sgPSBkaW5mby0+cmluZy5zaXplIC0gMTsKCX0KCWlmIChkaW5mby0+aHdjdXJzb3IpIHsKCQlkaW5mby0+Y3Vyc29yLnNpemUgPSBIV19DVVJTT1JfU0laRTsKCX0KCgkvKiBVc2UgYWdwZ2FydCB0byBtYW5hZ2UgdGhlIEdBVFQgKi8KCWlmICghKGJyaWRnZSA9IGFncF9iYWNrZW5kX2FjcXVpcmUocGRldikpKSB7CgkJRVJSX01TRygiY2Fubm90IGFjcXVpcmUgYWdwXG4iKTsKCQljbGVhbnVwKGRpbmZvKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCgkvKiBnZXQgdGhlIGN1cnJlbnQgZ2F0dCBpbmZvICovCglpZiAoYWdwX2NvcHlfaW5mbyhicmlkZ2UsICZndHRfaW5mbykpIHsKCQlFUlJfTVNHKCJjYW5ub3QgZ2V0IGFncCBpbmZvXG4iKTsKCQlhZ3BfYmFja2VuZF9yZWxlYXNlKGJyaWRnZSk7CgkJY2xlYW51cChkaW5mbyk7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJaWYgKE1CKHZvZmZzZXQpIDwgc3RvbGVuX3NpemUpCgkJb2Zmc2V0ID0gKHN0b2xlbl9zaXplID4+IDEyKTsKCWVsc2UKCQlvZmZzZXQgPSBST1VORF9VUF9UT19QQUdFKE1CKHZvZmZzZXQpKS9HVFRfUEFHRV9TSVpFOwoKCS8qIHNldCB0aGUgbWVtIG9mZnNldHMgLSBzZXQgdGhlbSBhZnRlciB0aGUgYWxyZWFkeSB1c2VkIHBhZ2VzICovCglpZiAoZGluZm8tPmFjY2VsKSB7CgkJZGluZm8tPnJpbmcub2Zmc2V0ID0gb2Zmc2V0ICsgZ3R0X2luZm8uY3VycmVudF9tZW1vcnk7Cgl9CglpZiAoZGluZm8tPmh3Y3Vyc29yKSB7CgkJZGluZm8tPmN1cnNvci5vZmZzZXQgPSBvZmZzZXQgKwoJCQkrIGd0dF9pbmZvLmN1cnJlbnRfbWVtb3J5ICsgKGRpbmZvLT5yaW5nLnNpemUgPj4gMTIpOwoJfQoJaWYgKGRpbmZvLT5mYm1lbV9nYXJ0KSB7CgkJZGluZm8tPmZiLm9mZnNldCA9IG9mZnNldCArCgkJCSsgZ3R0X2luZm8uY3VycmVudF9tZW1vcnkgKyAoZGluZm8tPnJpbmcuc2l6ZSA+PiAxMikKCQkJKyAoZGluZm8tPmN1cnNvci5zaXplID4+IDEyKTsKCX0KCgkvKiBBbGxvY2F0ZSBtZW1vcmllcyAod2hpY2ggYXJlbid0IHN0b2xlbikgKi8KCS8qIE1hcCB0aGUgZmIgYW5kIE1NSU8gcmVnaW9ucyAqLwoJLyogaW9yZW1hcCBvbmx5IHVwIHRvIHRoZSBlbmQgb2YgdXNlZCBhcGVydHVyZSAqLwoJZGluZm8tPmFwZXJ0dXJlLnZpcnR1YWwgPSAodTggX19pb21lbSAqKWlvcmVtYXBfbm9jYWNoZQoJCShkaW5mby0+YXBlcnR1cmUucGh5c2ljYWwsICgob2Zmc2V0ICsgZGluZm8tPmZiLm9mZnNldCkgPDwgMTIpCgkJICsgZGluZm8tPmZiLnNpemUpOwoJaWYgKCFkaW5mby0+YXBlcnR1cmUudmlydHVhbCkgewoJCUVSUl9NU0coIkNhbm5vdCByZW1hcCBGQiByZWdpb24uXG4iKTsKCQljbGVhbnVwKGRpbmZvKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglkaW5mby0+bW1pb19iYXNlID0KCQkodTggX19pb21lbSAqKWlvcmVtYXBfbm9jYWNoZShkaW5mby0+bW1pb19iYXNlX3BoeXMsCgkJCQkJICAgICAgIElOVEVMX1JFR19TSVpFKTsKCWlmICghZGluZm8tPm1taW9fYmFzZSkgewoJCUVSUl9NU0coIkNhbm5vdCByZW1hcCBNTUlPIHJlZ2lvbi5cbiIpOwoJCWNsZWFudXAoZGluZm8pOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCWlmIChkaW5mby0+YWNjZWwpIHsKCQlpZiAoIShkaW5mby0+Z3R0X3JpbmdfbWVtID0KCQkgICAgICBhZ3BfYWxsb2NhdGVfbWVtb3J5KGJyaWRnZSwgZGluZm8tPnJpbmcuc2l6ZSA+PiAxMiwKCQkJCQkgIEFHUF9OT1JNQUxfTUVNT1JZKSkpIHsKCQkJRVJSX01TRygiY2Fubm90IGFsbG9jYXRlIHJpbmcgYnVmZmVyIG1lbW9yeVxuIik7CgkJCWFncF9iYWNrZW5kX3JlbGVhc2UoYnJpZGdlKTsKCQkJY2xlYW51cChkaW5mbyk7CgkJCXJldHVybiAtRU5PTUVNOwoJCX0KCQlpZiAoYWdwX2JpbmRfbWVtb3J5KGRpbmZvLT5ndHRfcmluZ19tZW0sCgkJCQkgICAgZGluZm8tPnJpbmcub2Zmc2V0KSkgewoJCQlFUlJfTVNHKCJjYW5ub3QgYmluZCByaW5nIGJ1ZmZlciBtZW1vcnlcbiIpOwoJCQlhZ3BfYmFja2VuZF9yZWxlYXNlKGJyaWRnZSk7CgkJCWNsZWFudXAoZGluZm8pOwoJCQlyZXR1cm4gLUVCVVNZOwoJCX0KCQlkaW5mby0+cmluZy5waHlzaWNhbCA9IGRpbmZvLT5hcGVydHVyZS5waHlzaWNhbAoJCQkrIChkaW5mby0+cmluZy5vZmZzZXQgPDwgMTIpOwoJCWRpbmZvLT5yaW5nLnZpcnR1YWwgID0gZGluZm8tPmFwZXJ0dXJlLnZpcnR1YWwKCQkJKyAoZGluZm8tPnJpbmcub2Zmc2V0IDw8IDEyKTsKCQlkaW5mby0+cmluZ19oZWFkID0gZGluZm8tPnJpbmcudmlydHVhbDsKCX0KCWlmIChkaW5mby0+aHdjdXJzb3IpIHsKCQlhZ3BfbWVtdHlwZSA9IGRpbmZvLT5tb2JpbGUgPyBBR1BfUEhZU0lDQUxfTUVNT1JZCgkJCTogQUdQX05PUk1BTF9NRU1PUlk7CgkJaWYgKCEoZGluZm8tPmd0dF9jdXJzb3JfbWVtID0KCQkgICAgICBhZ3BfYWxsb2NhdGVfbWVtb3J5KGJyaWRnZSwgZGluZm8tPmN1cnNvci5zaXplID4+IDEyLAoJCQkJCSAgYWdwX21lbXR5cGUpKSkgewoJCQlFUlJfTVNHKCJjYW5ub3QgYWxsb2NhdGUgY3Vyc29yIG1lbW9yeVxuIik7CgkJCWFncF9iYWNrZW5kX3JlbGVhc2UoYnJpZGdlKTsKCQkJY2xlYW51cChkaW5mbyk7CgkJCXJldHVybiAtRU5PTUVNOwoJCX0KCQlpZiAoYWdwX2JpbmRfbWVtb3J5KGRpbmZvLT5ndHRfY3Vyc29yX21lbSwKCQkJCSAgICBkaW5mby0+Y3Vyc29yLm9mZnNldCkpIHsKCQkJRVJSX01TRygiY2Fubm90IGJpbmQgY3Vyc29yIG1lbW9yeVxuIik7CgkJCWFncF9iYWNrZW5kX3JlbGVhc2UoYnJpZGdlKTsKCQkJY2xlYW51cChkaW5mbyk7CgkJCXJldHVybiAtRUJVU1k7CgkJfQoJCWlmIChkaW5mby0+bW9iaWxlKQoJCQlkaW5mby0+Y3Vyc29yLnBoeXNpY2FsCgkJCQk9IGRpbmZvLT5ndHRfY3Vyc29yX21lbS0+cGh5c2ljYWw7CgkJZWxzZQoJCQlkaW5mby0+Y3Vyc29yLnBoeXNpY2FsID0gZGluZm8tPmFwZXJ0dXJlLnBoeXNpY2FsCgkJCQkrIChkaW5mby0+Y3Vyc29yLm9mZnNldCA8PCAxMik7CgkJZGluZm8tPmN1cnNvci52aXJ0dWFsID0gZGluZm8tPmFwZXJ0dXJlLnZpcnR1YWwKCQkJKyAoZGluZm8tPmN1cnNvci5vZmZzZXQgPDwgMTIpOwoJfQoJaWYgKGRpbmZvLT5mYm1lbV9nYXJ0KSB7CgkJaWYgKCEoZGluZm8tPmd0dF9mYl9tZW0gPQoJCSAgICAgIGFncF9hbGxvY2F0ZV9tZW1vcnkoYnJpZGdlLCBkaW5mby0+ZmIuc2l6ZSA+PiAxMiwKCQkJCQkgIEFHUF9OT1JNQUxfTUVNT1JZKSkpIHsKCQkJV1JOX01TRygiY2Fubm90IGFsbG9jYXRlIGZyYW1lYnVmZmVyIG1lbW9yeSAtIHVzZSAiCgkJCQkidGhlIHN0b2xlbiBvbmVcbiIpOwoJCQlkaW5mby0+ZmJtZW1fZ2FydCA9IDA7CgkJfQoJCWlmIChhZ3BfYmluZF9tZW1vcnkoZGluZm8tPmd0dF9mYl9tZW0sCgkJCQkgICAgZGluZm8tPmZiLm9mZnNldCkpIHsKCQkJV1JOX01TRygiY2Fubm90IGJpbmQgZnJhbWVidWZmZXIgbWVtb3J5IC0gdXNlICIKCQkJCSJ0aGUgc3RvbGVuIG9uZVxuIik7CgkJCWRpbmZvLT5mYm1lbV9nYXJ0ID0gMDsKCQl9Cgl9CgoJLyogdXBkYXRlIGZyYW1lYnVmZmVyIG1lbW9yeSBwYXJhbWV0ZXJzICovCglpZiAoIWRpbmZvLT5mYm1lbV9nYXJ0KQoJCWRpbmZvLT5mYi5vZmZzZXQgPSAwOyAgIC8qIHN0YXJ0cyBhdCBvZmZzZXQgMCAqLwoJZGluZm8tPmZiLnBoeXNpY2FsID0gZGluZm8tPmFwZXJ0dXJlLnBoeXNpY2FsCgkJKyAoZGluZm8tPmZiLm9mZnNldCA8PCAxMik7CglkaW5mby0+ZmIudmlydHVhbCA9IGRpbmZvLT5hcGVydHVyZS52aXJ0dWFsICsgKGRpbmZvLT5mYi5vZmZzZXQgPDwgMTIpOwoJZGluZm8tPmZiX3N0YXJ0ID0gZGluZm8tPmZiLm9mZnNldCA8PCAxMjsKCgkvKiByZWxlYXNlIGFncGdhcnQgKi8KCWFncF9iYWNrZW5kX3JlbGVhc2UoYnJpZGdlKTsKCglpZiAobXRycikKCQlzZXRfbXRycihkaW5mbyk7CgoJREJHX01TRygiZmI6IDB4JXgoKyAweCV4KS8weCV4ICgweCV4KVxuIiwKCQlkaW5mby0+ZmIucGh5c2ljYWwsIGRpbmZvLT5mYi5vZmZzZXQsIGRpbmZvLT5mYi5zaXplLAoJCSh1MzIgX19pb21lbSApIGRpbmZvLT5mYi52aXJ0dWFsKTsKCURCR19NU0coIk1NSU86IDB4JXgvMHgleCAoMHgleClcbiIsCgkJZGluZm8tPm1taW9fYmFzZV9waHlzLCBJTlRFTF9SRUdfU0laRSwKCQkodTMyIF9faW9tZW0pIGRpbmZvLT5tbWlvX2Jhc2UpOwoJREJHX01TRygicmluZyBidWZmZXI6IDB4JXgvMHgleCAoMHgleClcbiIsCgkJZGluZm8tPnJpbmcucGh5c2ljYWwsIGRpbmZvLT5yaW5nLnNpemUsCgkJKHUzMiBfX2lvbWVtICkgZGluZm8tPnJpbmcudmlydHVhbCk7CglEQkdfTVNHKCJIVyBjdXJzb3I6IDB4JXgvMHgleCAoMHgleCkgKG9mZnNldCAweCV4KSAocGh5cyAweCV4KVxuIiwKCQlkaW5mby0+Y3Vyc29yLnBoeXNpY2FsLCBkaW5mby0+Y3Vyc29yLnNpemUsCgkJKHUzMiBfX2lvbWVtICkgZGluZm8tPmN1cnNvci52aXJ0dWFsLCBkaW5mby0+Y3Vyc29yLm9mZnNldCwKCQlkaW5mby0+Y3Vyc29yLnBoeXNpY2FsKTsKCglEQkdfTVNHKCJvcHRpb25zOiB2cmFtID0gJWQsIGFjY2VsID0gJWQsIGh3Y3Vyc29yID0gJWQsIGZpeGVkID0gJWQsICIKCQkibm9pbml0ID0gJWRcbiIsIHZyYW0sIGFjY2VsLCBod2N1cnNvciwgZml4ZWQsIG5vaW5pdCk7CglEQkdfTVNHKCJvcHRpb25zOiBtb2RlID0gXCIlc1wiXG4iLCBtb2RlID8gbW9kZSA6ICIiKTsKCglpZiAocHJvYmVvbmx5KQoJCWJhaWxvdXQoZGluZm8pOwoKCS8qCgkgKiBDaGVjayBpZiB0aGUgTFZEUyBwb3J0IG9yIGFueSBEVk8gcG9ydHMgYXJlIGVuYWJsZWQuICBJZiBzbywKCSAqIGRvbid0IGFsbG93IG1vZGUgc3dpdGNoaW5nCgkgKi8KCWR2byA9IGludGVsZmJod19jaGVja19ub25fY3J0KGRpbmZvKTsKCWlmIChkdm8pIHsKCQlkaW5mby0+Zml4ZWRfbW9kZSA9IDE7CgkJV1JOX01TRygiTm9uLUNSVCBkZXZpY2UgaXMgZW5hYmxlZCAoICIpOwoJCWkgPSAwOwoJCXdoaWxlIChkdm8pIHsKCQkJaWYgKGR2byAmIDEpIHsKCQkJCXMgPSBpbnRlbGZiaHdfZHZvX3RvX3N0cmluZygxIDw8IGkpOwoJCQkJaWYgKHMpCgkJCQkJcHJpbnRrKCIlcyAiLCBzKTsKCQkJfQoJCQlkdm8gPj49IDE7CgkJCSsraTsKCQl9CgkJcHJpbnRrKCIpLiAgRGlzYWJsaW5nIG1vZGUgc3dpdGNoaW5nLlxuIik7Cgl9CgoJaWYgKGJhaWxlYXJseSA9PSAxKQoJCWJhaWxvdXQoZGluZm8pOwoKCWlmIChGSVhFRF9NT0RFKGRpbmZvKSAmJiBPUklHX1ZJREVPX0lTVkdBICE9IFZJREVPX1RZUEVfVkxGQikgewoJCUVSUl9NU0coIlZpZGVvIG1vZGUgbXVzdCBiZSBwcm9ncmFtbWVkIGF0IGJvb3QgdGltZS5cbiIpOwoJCWNsZWFudXAoZGluZm8pOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCWlmIChiYWlsZWFybHkgPT0gMikKCQliYWlsb3V0KGRpbmZvKTsKCgkvKiBJbml0aWFsaXNlIGRpbmZvIGFuZCByZWxhdGVkIGRhdGEuICovCgkvKiBJZiBhbiBpbml0aWFsIG1vZGUgd2FzIHByb2dyYW1tZWQgYXQgYm9vdCB0aW1lLCBnZXQgaXRzIGRldGFpbHMuICovCglpZiAoT1JJR19WSURFT19JU1ZHQSA9PSBWSURFT19UWVBFX1ZMRkIpCgkJZ2V0X2luaXRpYWxfbW9kZShkaW5mbyk7CgoJaWYgKGJhaWxlYXJseSA9PSAzKQoJCWJhaWxvdXQoZGluZm8pOwoKCWlmIChGSVhFRF9NT0RFKGRpbmZvKSkgewoJCS8qIHJlbWFwIGZiIGFkZHJlc3MgKi8KCQl1cGRhdGVfZGluZm8oZGluZm8sICZkaW5mby0+aW5pdGlhbF92YXIpOwoJfQoKCWlmIChiYWlsZWFybHkgPT0gNCkKCQliYWlsb3V0KGRpbmZvKTsKCgoJaWYgKGludGVsZmJfc2V0X2ZiaW5mbyhkaW5mbykpIHsKCQljbGVhbnVwKGRpbmZvKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglpZiAoYmFpbGVhcmx5ID09IDUpCgkJYmFpbG91dChkaW5mbyk7CgoJaWYgKGJhaWxlYXJseSA9PSA2KQoJCWJhaWxvdXQoZGluZm8pOwoKCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkaW5mbyk7CgoJLyogU2F2ZSB0aGUgaW5pdGlhbCByZWdpc3RlciBzdGF0ZS4gKi8KCWkgPSBpbnRlbGZiaHdfcmVhZF9od19zdGF0ZShkaW5mbywgJmRpbmZvLT5zYXZlX3N0YXRlLAoJCQkJICAgIGJhaWxlYXJseSA+IDYgPyBiYWlsZWFybHkgLSA2IDogMCk7CglpZiAoaSAhPSAwKSB7CgkJREJHX01TRygiaW50ZWxmYmh3X3JlYWRfaHdfc3RhdGUgcmV0dXJuZWQgJWRcbiIsIGkpOwoJCWJhaWxvdXQoZGluZm8pOwoJfQoKCWludGVsZmJod19wcmludF9od19zdGF0ZShkaW5mbywgJmRpbmZvLT5zYXZlX3N0YXRlKTsKCglpZiAoYmFpbGVhcmx5ID09IDE4KQoJCWJhaWxvdXQoZGluZm8pOwoKCS8qIEN1cnNvciBpbml0aWFsaXNhdGlvbiAqLwoJaWYgKGRpbmZvLT5od2N1cnNvcikgewoJCWludGVsZmJod19jdXJzb3JfaW5pdChkaW5mbyk7CgkJaW50ZWxmYmh3X2N1cnNvcl9yZXNldChkaW5mbyk7Cgl9CgoJaWYgKGJhaWxlYXJseSA9PSAxOSkKCQliYWlsb3V0KGRpbmZvKTsKCgkvKiAyZCBhY2NlbGVyYXRpb24gaW5pdCAqLwoJaWYgKGRpbmZvLT5hY2NlbCkKCQlpbnRlbGZiaHdfMmRfc3RhcnQoZGluZm8pOwoKCWlmIChiYWlsZWFybHkgPT0gMjApCgkJYmFpbG91dChkaW5mbyk7CgoJaWYgKG5vcmVnaXN0ZXIpCgkJYmFpbG91dChkaW5mbyk7CgoJaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGRpbmZvLT5pbmZvKSA8IDApIHsKCQlFUlJfTVNHKCJDYW5ub3QgcmVnaXN0ZXIgZnJhbWVidWZmZXIuXG4iKTsKCQljbGVhbnVwKGRpbmZvKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglkaW5mby0+cmVnaXN0ZXJlZCA9IDE7CgoJcmV0dXJuIDA7CgplcnJfb3V0X3BpeG1hcDoKCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CmVycl9vdXRfY21hcDoKCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CglyZXR1cm4gLUVOT0RFVjsKfQoKc3RhdGljIHZvaWQgX19kZXZleGl0CmludGVsZmJfcGNpX3VucmVnaXN0ZXIoc3RydWN0IHBjaV9kZXYgKnBkZXYpCnsKCXN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwoKCURCR19NU0coImludGVsZmJfcGNpX3VucmVnaXN0ZXJcbiIpOwoKCWlmICghZGluZm8pCgkJcmV0dXJuOwoKCWNsZWFudXAoZGluZm8pOwoKCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgaGVscGVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgppbnQgX19pbmxpbmVfXwppbnRlbGZiX3Zhcl90b19kZXB0aChjb25zdCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKewoJREJHX01TRygiaW50ZWxmYl92YXJfdG9fZGVwdGg6IGJwcDogJWQsIGdyZWVuLmxlbmd0aCBpcyAlZFxuIiwKCQl2YXItPmJpdHNfcGVyX3BpeGVsLCB2YXItPmdyZWVuLmxlbmd0aCk7CgoJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CgljYXNlIDE2OgoJCXJldHVybiAodmFyLT5ncmVlbi5sZW5ndGggPT0gNikgPyAxNiA6IDE1OwoJY2FzZSAzMjoKCQlyZXR1cm4gMjQ7CglkZWZhdWx0OgoJCXJldHVybiB2YXItPmJpdHNfcGVyX3BpeGVsOwoJfQp9CgoKc3RhdGljIF9faW5saW5lX18gaW50CnZhcl90b19yZWZyZXNoKGNvbnN0IHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQp7CglpbnQgeHRvdCA9IHZhci0+eHJlcyArIHZhci0+bGVmdF9tYXJnaW4gKyB2YXItPnJpZ2h0X21hcmdpbiArCgkJICAgdmFyLT5oc3luY19sZW47CglpbnQgeXRvdCA9IHZhci0+eXJlcyArIHZhci0+dXBwZXJfbWFyZ2luICsgdmFyLT5sb3dlcl9tYXJnaW4gKwoJCSAgIHZhci0+dnN5bmNfbGVuOwoKCXJldHVybiAoMTAwMDAwMDAwMCAvIHZhci0+cGl4Y2xvY2sgKiAxMDAwICsgNTAwKSAvIHh0b3QgLyB5dG90Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICAgIFZhcmlvdXMgaW50aWFsaXNhdGlvbiBmdW5jdGlvbnMgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkIF9fZGV2aW5pdApnZXRfaW5pdGlhbF9tb2RlKHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvKQp7CglzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcjsKCWludCB4dG90LCB5dG90OwoKCURCR19NU0coImdldF9pbml0aWFsX21vZGVcbiIpOwoKCWRpbmZvLT5pbml0aWFsX3ZnYSA9IDE7CglkaW5mby0+aW5pdGlhbF9mYl9iYXNlID0gc2NyZWVuX2luZm8ubGZiX2Jhc2U7CglkaW5mby0+aW5pdGlhbF92aWRlb19yYW0gPSBzY3JlZW5faW5mby5sZmJfc2l6ZSAqIEtCKDY0KTsKCWRpbmZvLT5pbml0aWFsX3BpdGNoID0gc2NyZWVuX2luZm8ubGZiX2xpbmVsZW5ndGg7CgoJdmFyID0gJmRpbmZvLT5pbml0aWFsX3ZhcjsKCW1lbXNldCh2YXIsIDAsIHNpemVvZigqdmFyKSk7Cgl2YXItPnhyZXMgPSBzY3JlZW5faW5mby5sZmJfd2lkdGg7Cgl2YXItPnlyZXMgPSBzY3JlZW5faW5mby5sZmJfaGVpZ2h0OwoJdmFyLT5iaXRzX3Blcl9waXhlbCA9IHNjcmVlbl9pbmZvLmxmYl9kZXB0aDsKCXN3aXRjaCAoc2NyZWVuX2luZm8ubGZiX2RlcHRoKSB7CgljYXNlIDE1OgoJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAxNjsKCQlicmVhazsKCWNhc2UgMjQ6CgkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDMyOwoJCWJyZWFrOwoJfQoKCURCR19NU0coIkluaXRpYWwgaW5mbzogRkIgaXMgMHgleC8weCV4ICglZCBrQnl0ZSlcbiIsCgkJZGluZm8tPmluaXRpYWxfZmJfYmFzZSwgZGluZm8tPmluaXRpYWxfdmlkZW9fcmFtLAoJCUJ0b0tCKGRpbmZvLT5pbml0aWFsX3ZpZGVvX3JhbSkpOwoKCURCR19NU0coIkluaXRpYWwgaW5mbzogbW9kZSBpcyAlZHglZC0lZCAoJWQpXG4iLAoJCXZhci0+eHJlcywgdmFyLT55cmVzLCB2YXItPmJpdHNfcGVyX3BpeGVsLAoJCWRpbmZvLT5pbml0aWFsX3BpdGNoKTsKCgkvKiBEdW1teSB0aW1pbmcgdmFsdWVzIChhc3N1bWUgNjBIeikgKi8KCXZhci0+bGVmdF9tYXJnaW4gPSAodmFyLT54cmVzIC8gOCkgJiAweGY4OwoJdmFyLT5yaWdodF9tYXJnaW4gPSAzMjsKCXZhci0+dXBwZXJfbWFyZ2luID0gMTY7Cgl2YXItPmxvd2VyX21hcmdpbiA9IDQ7Cgl2YXItPmhzeW5jX2xlbiA9ICh2YXItPnhyZXMgLyA4KSAmIDB4Zjg7Cgl2YXItPnZzeW5jX2xlbiA9IDQ7CgoJeHRvdCA9IHZhci0+eHJlcyArIHZhci0+bGVmdF9tYXJnaW4gKwoJCXZhci0+cmlnaHRfbWFyZ2luICsgdmFyLT5oc3luY19sZW47Cgl5dG90ID0gdmFyLT55cmVzICsgdmFyLT51cHBlcl9tYXJnaW4gKwoJCXZhci0+bG93ZXJfbWFyZ2luICsgdmFyLT52c3luY19sZW47Cgl2YXItPnBpeGNsb2NrID0gMTAwMDAwMDAgLyB4dG90ICogMTAwMCAvIHl0b3QgKiAxMDAgLyA2MDsKCgl2YXItPmhlaWdodCA9IC0xOwoJdmFyLT53aWR0aCA9IC0xOwoKCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsID4gOCkgewoJCXZhci0+cmVkLm9mZnNldCA9IHNjcmVlbl9pbmZvLnJlZF9wb3M7CgkJdmFyLT5yZWQubGVuZ3RoID0gc2NyZWVuX2luZm8ucmVkX3NpemU7CgkJdmFyLT5ncmVlbi5vZmZzZXQgPSBzY3JlZW5faW5mby5ncmVlbl9wb3M7CgkJdmFyLT5ncmVlbi5sZW5ndGggPSBzY3JlZW5faW5mby5ncmVlbl9zaXplOwoJCXZhci0+Ymx1ZS5vZmZzZXQgPSBzY3JlZW5faW5mby5ibHVlX3BvczsKCQl2YXItPmJsdWUubGVuZ3RoID0gc2NyZWVuX2luZm8uYmx1ZV9zaXplOwoJCXZhci0+dHJhbnNwLm9mZnNldCA9IHNjcmVlbl9pbmZvLnJzdmRfcG9zOwoJCXZhci0+dHJhbnNwLmxlbmd0aCA9IHNjcmVlbl9pbmZvLnJzdmRfc2l6ZTsKCX0gZWxzZSB7CgkJdmFyLT5yZWQubGVuZ3RoID0gODsKCQl2YXItPmdyZWVuLmxlbmd0aCA9IDg7CgkJdmFyLT5ibHVlLmxlbmd0aCA9IDg7Cgl9Cn0KCnN0YXRpYyBpbnQgX19kZXZpbml0CmludGVsZmJfaW5pdF92YXIoc3RydWN0IGludGVsZmJfaW5mbyAqZGluZm8pCnsKCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyOwoJaW50IG1zcmMgPSAwOwoKCURCR19NU0coImludGVsZmJfaW5pdF92YXJcbiIpOwoKCXZhciA9ICZkaW5mby0+aW5mby0+dmFyOwoJaWYgKEZJWEVEX01PREUoZGluZm8pKSB7CgkgICAgICAgIG1lbWNweSh2YXIsICZkaW5mby0+aW5pdGlhbF92YXIsCgkJICAgICAgIHNpemVvZihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8pKTsKCQltc3JjID0gNTsKCX0gZWxzZSB7CgkJaWYgKG1vZGUpIHsKCQkJbXNyYyA9IGZiX2ZpbmRfbW9kZSh2YXIsIGRpbmZvLT5pbmZvLCBtb2RlLAoJCQkJCSAgICB2ZXNhX21vZGVzLCBWRVNBX01PREVEQl9TSVpFLAoJCQkJCSAgICBOVUxMLCAwKTsKCQkJaWYgKG1zcmMpCgkJCQltc3JjIHw9IDg7CgkJfQoJCWlmICghbXNyYykgewoJCQltc3JjID0gZmJfZmluZF9tb2RlKHZhciwgZGluZm8tPmluZm8sIFBSRUZFUlJFRF9NT0RFLAoJCQkJCSAgICB2ZXNhX21vZGVzLCBWRVNBX01PREVEQl9TSVpFLAoJCQkJCSAgICBOVUxMLCAwKTsKCQl9Cgl9CgoJaWYgKCFtc3JjKSB7CgkJRVJSX01TRygiQ2Fubm90IGZpbmQgYSBzdWl0YWJsZSB2aWRlbyBtb2RlLlxuIik7CgkJcmV0dXJuIDE7Cgl9CgoJSU5GX01TRygiSW5pdGlhbCB2aWRlbyBtb2RlIGlzICVkeCVkLSVkQCVkLlxuIiwgdmFyLT54cmVzLCB2YXItPnlyZXMsCgkJdmFyLT5iaXRzX3Blcl9waXhlbCwgdmFyX3RvX3JlZnJlc2godmFyKSk7CgoJREJHX01TRygiSW5pdGlhbCB2aWRlbyBtb2RlIGlzIGZyb20gJWQuXG4iLCBtc3JjKTsKCiNpZiBBTExPQ0FURV9GT1JfUEFOTklORwoJLyogQWxsb3cgdXNlIG9mIGhhbGYgb2YgdGhlIHZpZGVvIHJhbSBmb3IgcGFubmluZyAqLwoJdmFyLT54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXM7Cgl2YXItPnlyZXNfdmlydHVhbCA9CgkJZGluZm8tPmZiLnNpemUgLyAyIC8gKHZhci0+Yml0c19wZXJfcGl4ZWwgKiB2YXItPnhyZXMpOwoJaWYgKHZhci0+eXJlc192aXJ0dWFsIDwgdmFyLT55cmVzKQoJCXZhci0+eXJlc192aXJ0dWFsID0gdmFyLT55cmVzOwojZWxzZQoJdmFyLT55cmVzX3ZpcnR1YWwgPSB2YXItPnlyZXM7CiNlbmRpZgoKCWlmIChkaW5mby0+YWNjZWwpCgkJdmFyLT5hY2NlbF9mbGFncyB8PSBGQl9BQ0NFTEZfVEVYVDsKCWVsc2UKCQl2YXItPmFjY2VsX2ZsYWdzICY9IH5GQl9BQ0NFTEZfVEVYVDsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBfX2RldmluaXQKaW50ZWxmYl9zZXRfZmJpbmZvKHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvKQp7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRpbmZvLT5pbmZvOwoKCURCR19NU0coImludGVsZmJfc2V0X2ZiaW5mb1xuIik7CgoJaW5mby0+ZmxhZ3MgPSBGQklORk9fRkxBR19ERUZBVUxUOwoJaW5mby0+ZmJvcHMgPSAmaW50ZWxfZmJfb3BzOwoJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBkaW5mby0+cHNldWRvX3BhbGV0dGU7CgoJaW5mby0+cGl4bWFwLnNpemUgPSA2NCoxMDI0OwoJaW5mby0+cGl4bWFwLmJ1Zl9hbGlnbiA9IDg7CglpbmZvLT5waXhtYXAuYWNjZXNzX2FsaWduID0gMzI7CglpbmZvLT5waXhtYXAuZmxhZ3MgPSBGQl9QSVhNQVBfU1lTVEVNOwoKCWlmIChpbnRlbGZiX2luaXRfdmFyKGRpbmZvKSkKCQlyZXR1cm4gMTsKCglpbmZvLT5waXhtYXAuc2Nhbl9hbGlnbiA9IDE7CglzdHJjcHkoaW5mby0+Zml4LmlkLCBkaW5mby0+bmFtZSk7CglpbmZvLT5maXguc21lbV9zdGFydCA9IGRpbmZvLT5mYi5waHlzaWNhbDsKCWluZm8tPmZpeC5zbWVtX2xlbiA9IGRpbmZvLT5mYi5zaXplOwoJaW5mby0+Zml4LnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CglpbmZvLT5maXgudHlwZV9hdXggPSAwOwoJaW5mby0+Zml4LnhwYW5zdGVwID0gODsKCWluZm8tPmZpeC55cGFuc3RlcCA9IDE7CglpbmZvLT5maXgueXdyYXBzdGVwID0gMDsKCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gZGluZm8tPm1taW9fYmFzZV9waHlzOwoJaW5mby0+Zml4Lm1taW9fbGVuID0gSU5URUxfUkVHX1NJWkU7CglpbmZvLT5maXguYWNjZWwgPSBGQl9BQ0NFTF9JODMwOwoJdXBkYXRlX2RpbmZvKGRpbmZvLCAmaW5mby0+dmFyKTsKCglyZXR1cm4gMDsKfQoKLyogVXBkYXRlIGRpbmZvIHRvIG1hdGNoIHRoZSBhY3RpdmUgdmlkZW8gbW9kZS4gKi8Kc3RhdGljIHZvaWQKdXBkYXRlX2RpbmZvKHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKewoJREJHX01TRygidXBkYXRlX2RpbmZvXG4iKTsKCglkaW5mby0+YnBwID0gdmFyLT5iaXRzX3Blcl9waXhlbDsKCWRpbmZvLT5kZXB0aCA9IGludGVsZmJfdmFyX3RvX2RlcHRoKHZhcik7CglkaW5mby0+eHJlcyA9IHZhci0+eHJlczsKCWRpbmZvLT55cmVzID0gdmFyLT54cmVzOwoJZGluZm8tPnBpeGNsb2NrID0gdmFyLT5waXhjbG9jazsKCglkaW5mby0+aW5mby0+Zml4LnZpc3VhbCA9IGRpbmZvLT52aXN1YWw7CglkaW5mby0+aW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gZGluZm8tPnBpdGNoOwoKCXN3aXRjaCAoZGluZm8tPmJwcCkgewoJY2FzZSA4OgoJCWRpbmZvLT52aXN1YWwgPSBGQl9WSVNVQUxfUFNFVURPQ09MT1I7CgkJZGluZm8tPnBpdGNoID0gdmFyLT54cmVzX3ZpcnR1YWw7CgkJYnJlYWs7CgljYXNlIDE2OgoJCWRpbmZvLT52aXN1YWwgPSBGQl9WSVNVQUxfVFJVRUNPTE9SOwoJCWRpbmZvLT5waXRjaCA9IHZhci0+eHJlc192aXJ0dWFsICogMjsKCQlicmVhazsKCWNhc2UgMzI6CgkJZGluZm8tPnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CgkJZGluZm8tPnBpdGNoID0gdmFyLT54cmVzX3ZpcnR1YWwgKiA0OwoJCWJyZWFrOwoJfQoKCS8qIE1ha2Ugc3VyZSB0aGUgbGluZSBsZW5ndGggaXMgYSBhbGlnbmVkIGNvcnJlY3RseS4gKi8KCWRpbmZvLT5waXRjaCA9IFJPVU5EX1VQX1RPKGRpbmZvLT5waXRjaCwgU1RSSURFX0FMSUdOTUVOVCk7CgoJaWYgKEZJWEVEX01PREUoZGluZm8pKQoJCWRpbmZvLT5waXRjaCA9IGRpbmZvLT5pbml0aWFsX3BpdGNoOwoKCWRpbmZvLT5pbmZvLT5zY3JlZW5fYmFzZSA9IChjaGFyIF9faW9tZW0gKilkaW5mby0+ZmIudmlydHVhbDsKCWRpbmZvLT5pbmZvLT5maXgubGluZV9sZW5ndGggPSBkaW5mby0+cGl0Y2g7CglkaW5mby0+aW5mby0+Zml4LnZpc3VhbCA9IGRpbmZvLT52aXN1YWw7Cn0KCi8qIGZib3BzIGZ1bmN0aW9ucyAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgZmJkZXYgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgaW50CmludGVsZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJaW50IGNoYW5nZV92YXIgPSAwOwoJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHY7CglzdHJ1Y3QgaW50ZWxmYl9pbmZvICpkaW5mbzsKCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwoKCURCR19NU0coImludGVsZmJfY2hlY2tfdmFyOiBhY2NlbF9mbGFncyBpcyAlZFxuIiwgdmFyLT5hY2NlbF9mbGFncyk7CgoJZGluZm8gPSBHRVRfRElORk8oaW5mbyk7CgoJaWYgKGludGVsZmJod192YWxpZGF0ZV9tb2RlKGRpbmZvLCB2YXIpICE9IDApCgkJcmV0dXJuIC1FSU5WQUw7CgoJdiA9ICp2YXI7CgoJLyogQ2hlY2sgZm9yIGEgc3VwcG9ydGVkIGJwcC4gKi8KCWlmICh2LmJpdHNfcGVyX3BpeGVsIDw9IDgpIHsKCQl2LmJpdHNfcGVyX3BpeGVsID0gODsKCX0gZWxzZSBpZiAodi5iaXRzX3Blcl9waXhlbCA8PSAxNikgewoJCWlmICh2LmJpdHNfcGVyX3BpeGVsID09IDE2KQoJCQl2LmdyZWVuLmxlbmd0aCA9IDY7CgkJdi5iaXRzX3Blcl9waXhlbCA9IDE2OwoJfSBlbHNlIGlmICh2LmJpdHNfcGVyX3BpeGVsIDw9IDMyKSB7CgkJdi5iaXRzX3Blcl9waXhlbCA9IDMyOwoJfSBlbHNlCgkJcmV0dXJuIC1FSU5WQUw7CgoJY2hhbmdlX3ZhciA9ICgoaW5mby0+dmFyLnhyZXMgIT0gdmFyLT54cmVzKSB8fAoJCSAgICAgIChpbmZvLT52YXIueXJlcyAhPSB2YXItPnlyZXMpIHx8CgkJICAgICAgKGluZm8tPnZhci54cmVzX3ZpcnR1YWwgIT0gdmFyLT54cmVzX3ZpcnR1YWwpIHx8CgkJICAgICAgKGluZm8tPnZhci55cmVzX3ZpcnR1YWwgIT0gdmFyLT55cmVzX3ZpcnR1YWwpIHx8CgkJICAgICAgKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAhPSB2YXItPmJpdHNfcGVyX3BpeGVsKSB8fAoJCSAgICAgIG1lbWNtcCgmaW5mby0+dmFyLnJlZCwgJnZhci0+cmVkLCBzaXplb2YodmFyLT5yZWQpKSB8fAoJCSAgICAgIG1lbWNtcCgmaW5mby0+dmFyLmdyZWVuLCAmdmFyLT5ncmVlbiwKCQkJICAgICBzaXplb2YodmFyLT5ncmVlbikpIHx8CgkJICAgICAgbWVtY21wKCZpbmZvLT52YXIuYmx1ZSwgJnZhci0+Ymx1ZSwgc2l6ZW9mKHZhci0+Ymx1ZSkpKTsKCglpZiAoRklYRURfTU9ERShkaW5mbykgJiYKCSAgICAoY2hhbmdlX3ZhciB8fAoJICAgICB2YXItPnlyZXNfdmlydHVhbCA+IGRpbmZvLT5pbml0aWFsX3Zhci55cmVzX3ZpcnR1YWwgfHwKCSAgICAgdmFyLT55cmVzX3ZpcnR1YWwgPCBkaW5mby0+aW5pdGlhbF92YXIueXJlcyB8fAoJICAgICB2YXItPnhvZmZzZXQgfHwgdmFyLT5ub25zdGQpKSB7CgkJaWYgKGZpcnN0KSB7CgkJCUVSUl9NU0coIkNoYW5naW5nIHRoZSB2aWRlbyBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKCQkJZmlyc3QgPSAwOwoJCX0KCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglzd2l0Y2ggKGludGVsZmJfdmFyX3RvX2RlcHRoKCZ2KSkgewoJY2FzZSA4OgoJCXYucmVkLm9mZnNldCA9IHYuZ3JlZW4ub2Zmc2V0ID0gdi5ibHVlLm9mZnNldCA9IDA7CgkJdi5yZWQubGVuZ3RoID0gdi5ncmVlbi5sZW5ndGggPSB2LmJsdWUubGVuZ3RoID0gODsKCQl2LnRyYW5zcC5vZmZzZXQgPSB2LnRyYW5zcC5sZW5ndGggPSAwOwoJCWJyZWFrOwoJY2FzZSAxNToKCQl2LnJlZC5vZmZzZXQgPSAxMDsKCQl2LmdyZWVuLm9mZnNldCA9IDU7CgkJdi5ibHVlLm9mZnNldCA9IDA7CgkJdi5yZWQubGVuZ3RoID0gdi5ncmVlbi5sZW5ndGggPSB2LmJsdWUubGVuZ3RoID0gNTsKCQl2LnRyYW5zcC5vZmZzZXQgPSB2LnRyYW5zcC5sZW5ndGggPSAwOwoJCWJyZWFrOwoJY2FzZSAxNjoKCQl2LnJlZC5vZmZzZXQgPSAxMTsKCQl2LmdyZWVuLm9mZnNldCA9IDU7CgkJdi5ibHVlLm9mZnNldCA9IDA7CgkJdi5yZWQubGVuZ3RoID0gNTsKCQl2LmdyZWVuLmxlbmd0aCA9IDY7CgkJdi5ibHVlLmxlbmd0aCA9IDU7CgkJdi50cmFuc3Aub2Zmc2V0ID0gdi50cmFuc3AubGVuZ3RoID0gMDsKCQlicmVhazsKCWNhc2UgMjQ6CgkJdi5yZWQub2Zmc2V0ID0gMTY7CgkJdi5ncmVlbi5vZmZzZXQgPSA4OwoJCXYuYmx1ZS5vZmZzZXQgPSAwOwoJCXYucmVkLmxlbmd0aCA9IHYuZ3JlZW4ubGVuZ3RoID0gdi5ibHVlLmxlbmd0aCA9IDg7CgkJdi50cmFuc3Aub2Zmc2V0ID0gdi50cmFuc3AubGVuZ3RoID0gMDsKCQlicmVhazsKCWNhc2UgMzI6CgkJdi5yZWQub2Zmc2V0ID0gMTY7CgkJdi5ncmVlbi5vZmZzZXQgPSA4OwoJCXYuYmx1ZS5vZmZzZXQgPSAwOwoJCXYucmVkLmxlbmd0aCA9IHYuZ3JlZW4ubGVuZ3RoID0gdi5ibHVlLmxlbmd0aCA9IDg7CgkJdi50cmFuc3Aub2Zmc2V0ID0gMjQ7CgkJdi50cmFuc3AubGVuZ3RoID0gODsKCQlicmVhazsKCX0KCglpZiAodi54b2Zmc2V0IDwgMCkKCQl2LnhvZmZzZXQgPSAwOwoJaWYgKHYueW9mZnNldCA8IDApCgkJdi55b2Zmc2V0ID0gMDsKCglpZiAodi54b2Zmc2V0ID4gdi54cmVzX3ZpcnR1YWwgLSB2LnhyZXMpCgkJdi54b2Zmc2V0ID0gdi54cmVzX3ZpcnR1YWwgLSB2LnhyZXM7CglpZiAodi55b2Zmc2V0ID4gdi55cmVzX3ZpcnR1YWwgLSB2LnlyZXMpCgkJdi55b2Zmc2V0ID0gdi55cmVzX3ZpcnR1YWwgLSB2LnlyZXM7CgoJdi5yZWQubXNiX3JpZ2h0ID0gdi5ncmVlbi5tc2JfcmlnaHQgPSB2LmJsdWUubXNiX3JpZ2h0ID0KCQkJICB2LnRyYW5zcC5tc2JfcmlnaHQgPSAwOwoKICAgICAgICAqdmFyID0gdjsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludAppbnRlbGZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pCnsKIAlzdHJ1Y3QgaW50ZWxmYl9od3N0YXRlICpodzsKICAgICAgICBzdHJ1Y3QgaW50ZWxmYl9pbmZvICpkaW5mbyA9IEdFVF9ESU5GTyhpbmZvKTsKCglpZiAoRklYRURfTU9ERShkaW5mbykpIHsKCQlFUlJfTVNHKCJDaGFuZ2luZyB0aGUgdmlkZW8gbW9kZSBpcyBub3Qgc3VwcG9ydGVkLlxuIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgogCWh3ID0ga21hbGxvYyhzaXplb2YoKmh3KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFodykKIAkJcmV0dXJuIC1FTk9NRU07CgoJREJHX01TRygiaW50ZWxmYl9zZXRfcGFyICglZHglZC0lZClcbiIsIGluZm8tPnZhci54cmVzLAoJCWluZm8tPnZhci55cmVzLCBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpOwoKCWludGVsZmJfYmxhbmsoRkJfQkxBTktfUE9XRVJET1dOLCBpbmZvKTsKCglpZiAoQUNDRUwoZGluZm8sIGluZm8pKQoJCWludGVsZmJod18yZF9zdG9wKGRpbmZvKTsKCiAJbWVtY3B5KGh3LCAmZGluZm8tPnNhdmVfc3RhdGUsIHNpemVvZigqaHcpKTsKIAlpZiAoaW50ZWxmYmh3X21vZGVfdG9faHcoZGluZm8sIGh3LCAmaW5mby0+dmFyKSkKIAkJZ290byBpbnZhbGlkX21vZGU7CiAJaWYgKGludGVsZmJod19wcm9ncmFtX21vZGUoZGluZm8sIGh3LCAwKSkKIAkJZ290byBpbnZhbGlkX21vZGU7CgojaWYgUkVHRFVNUCA+IDAKIAlpbnRlbGZiaHdfcmVhZF9od19zdGF0ZShkaW5mbywgaHcsIDApOwogCWludGVsZmJod19wcmludF9od19zdGF0ZShkaW5mbywgaHcpOwojZW5kaWYKCgl1cGRhdGVfZGluZm8oZGluZm8sICZpbmZvLT52YXIpOwoKCWlmIChBQ0NFTChkaW5mbywgaW5mbykpCgkJaW50ZWxmYmh3XzJkX3N0YXJ0KGRpbmZvKTsKCglpbnRlbGZiX3Bhbl9kaXNwbGF5KCZpbmZvLT52YXIsIGluZm8pOwoKCWludGVsZmJfYmxhbmsoRkJfQkxBTktfVU5CTEFOSywgaW5mbyk7CgoJaWYgKEFDQ0VMKGRpbmZvLCBpbmZvKSkgewoJCWluZm8tPmZsYWdzID0gRkJJTkZPX0RFRkFVTFQgfCBGQklORk9fSFdBQ0NFTF9ZUEFOIHwKCQlGQklORk9fSFdBQ0NFTF9DT1BZQVJFQSB8IEZCSU5GT19IV0FDQ0VMX0ZJTExSRUNUIHwKCQlGQklORk9fSFdBQ0NFTF9JTUFHRUJMSVQ7Cgl9IGVsc2UgewoJCWluZm8tPmZsYWdzID0gRkJJTkZPX0RFRkFVTFQgfCBGQklORk9fSFdBQ0NFTF9ZUEFOOwoJfQoJa2ZyZWUoaHcpOwoJcmV0dXJuIDA7CmludmFsaWRfbW9kZToKCWtmcmVlKGh3KTsKCXJldHVybiAtRUlOVkFMOwp9CgpzdGF0aWMgaW50CmludGVsZmJfc2V0Y29scmVnKHVuc2lnbmVkIHJlZ25vLCB1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLAoJCSAgdW5zaWduZWQgYmx1ZSwgdW5zaWduZWQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJc3RydWN0IGludGVsZmJfaW5mbyAqZGluZm8gPSBHRVRfRElORk8oaW5mbyk7CgojaWYgVkVSQk9TRSA+IDAKCURCR19NU0coImludGVsZmJfc2V0Y29scmVnOiByZWdubyAlZCwgZGVwdGggJWRcbiIsIHJlZ25vLCBkaW5mby0+ZGVwdGgpOwojZW5kaWYKCglpZiAocmVnbm8gPiAyNTUpCgkJcmV0dXJuIDE7CgoJaWYgKGRpbmZvLT5kZXB0aCA9PSA4KSB7CgkJcmVkID4+PSA4OwoJCWdyZWVuID4+PSA4OwoJCWJsdWUgPj49IDg7CgoJCWludGVsZmJod19zZXRjb2xyZWcoZGluZm8sIHJlZ25vLCByZWQsIGdyZWVuLCBibHVlLAoJCQkJICAgIHRyYW5zcCk7Cgl9CgoJaWYgKHJlZ25vIDwgMTYpIHsKCQlzd2l0Y2ggKGRpbmZvLT5kZXB0aCkgewoJCWNhc2UgMTU6CgkJCWRpbmZvLT5wc2V1ZG9fcGFsZXR0ZVtyZWdub10gPSAoKHJlZCAmIDB4ZjgwMCkgPj4gIDEpIHwKCQkJCSgoZ3JlZW4gJiAweGY4MDApID4+ICA2KSB8CgkJCQkoKGJsdWUgJiAweGY4MDApID4+IDExKTsKCQkJYnJlYWs7CgkJY2FzZSAxNjoKCQkJZGluZm8tPnBzZXVkb19wYWxldHRlW3JlZ25vXSA9IChyZWQgJiAweGY4MDApIHwKCQkJCSgoZ3JlZW4gJiAweGZjMDApID4+ICA1KSB8CgkJCQkoKGJsdWUgICYgMHhmODAwKSA+PiAxMSk7CgkJCWJyZWFrOwoJCWNhc2UgMjQ6CgkJCWRpbmZvLT5wc2V1ZG9fcGFsZXR0ZVtyZWdub10gPSAoKHJlZCAmIDB4ZmYwMCkgPDwgOCkgfAoJCQkJKGdyZWVuICYgMHhmZjAwKSB8CgkJCQkoKGJsdWUgICYgMHhmZjAwKSA+PiA4KTsKCQkJYnJlYWs7CgkJfQoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CmludGVsZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJaW50ZWxmYmh3X2RvX2JsYW5rKGJsYW5rLCBpbmZvKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CmludGVsZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglpbnRlbGZiaHdfcGFuX2Rpc3BsYXkodmFyLCBpbmZvKTsKCXJldHVybiAwOwp9CgovKiBXaGVuL2lmIHdlIGhhdmUgb3VyIG93biBpb2N0bHMuICovCnN0YXRpYyBpbnQKaW50ZWxmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCnsKCWludCByZXR2YWwgPSAwOwoKCXJldHVybiByZXR2YWw7Cn0KCnN0YXRpYyB2b2lkCmludGVsZmJfZmlsbHJlY3QgKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlY3QpCnsKICAgICAgICBzdHJ1Y3QgaW50ZWxmYl9pbmZvICpkaW5mbyA9IEdFVF9ESU5GTyhpbmZvKTsKCXUzMiByb3AsIGNvbG9yOwoKI2lmIFZFUkJPU0UgPiAwCglEQkdfTVNHKCJpbnRlbGZiX2ZpbGxyZWN0XG4iKTsKI2VuZGlmCgoJaWYgKCFBQ0NFTChkaW5mbywgaW5mbykgfHwgZGluZm8tPmRlcHRoID09IDQpCgkJcmV0dXJuIGNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKCglpZiAocmVjdC0+cm9wID09IFJPUF9DT1BZKQoJCXJvcCA9IFBBVF9ST1BfR1hDT1BZOwoJZWxzZSAvLyBST1BfWE9SCgkJcm9wID0gUEFUX1JPUF9HWFhPUjsKCglpZiAoZGluZm8tPmRlcHRoICE9IDgpCgkJY29sb3IgPSBkaW5mby0+cHNldWRvX3BhbGV0dGVbcmVjdC0+Y29sb3JdOwoJZWxzZQoJCWNvbG9yID0gcmVjdC0+Y29sb3I7CgoJaW50ZWxmYmh3X2RvX2ZpbGxyZWN0KGRpbmZvLCByZWN0LT5keCwgcmVjdC0+ZHksCgkJCSAgICAgIHJlY3QtPndpZHRoLCByZWN0LT5oZWlnaHQsIGNvbG9yLAoJCQkgICAgICBkaW5mby0+cGl0Y2gsIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCwKCQkJICAgICAgcm9wKTsKfQoKc3RhdGljIHZvaWQKaW50ZWxmYl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICpyZWdpb24pCnsKICAgICAgICBzdHJ1Y3QgaW50ZWxmYl9pbmZvICpkaW5mbyA9IEdFVF9ESU5GTyhpbmZvKTsKCiNpZiBWRVJCT1NFID4gMAoJREJHX01TRygiaW50ZWxmYl9jb3B5YXJlYVxuIik7CiNlbmRpZgoKCWlmICghQUNDRUwoZGluZm8sIGluZm8pIHx8IGRpbmZvLT5kZXB0aCA9PSA0KQoJCXJldHVybiBjZmJfY29weWFyZWEoaW5mbywgcmVnaW9uKTsKCglpbnRlbGZiaHdfZG9fYml0Ymx0KGRpbmZvLCByZWdpb24tPnN4LCByZWdpb24tPnN5LCByZWdpb24tPmR4LAoJCQkgICAgcmVnaW9uLT5keSwgcmVnaW9uLT53aWR0aCwgcmVnaW9uLT5oZWlnaHQsCgkJCSAgICBkaW5mby0+cGl0Y2gsIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCk7Cn0KCnN0YXRpYyB2b2lkCmludGVsZmJfaW1hZ2VibGl0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKmltYWdlKQp7CiAgICAgICAgc3RydWN0IGludGVsZmJfaW5mbyAqZGluZm8gPSBHRVRfRElORk8oaW5mbyk7Cgl1MzIgZmdjb2xvciwgYmdjb2xvcjsKCiNpZiBWRVJCT1NFID4gMAoJREJHX01TRygiaW50ZWxmYl9pbWFnZWJsaXRcbiIpOwojZW5kaWYKCglpZiAoIUFDQ0VMKGRpbmZvLCBpbmZvKSB8fCBkaW5mby0+ZGVwdGggPT0gNAoJICAgIHx8IGltYWdlLT5kZXB0aCAhPSAxKQoJCXJldHVybiBjZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKCglpZiAoZGluZm8tPmRlcHRoICE9IDgpIHsKCQlmZ2NvbG9yID0gZGluZm8tPnBzZXVkb19wYWxldHRlW2ltYWdlLT5mZ19jb2xvcl07CgkJYmdjb2xvciA9IGRpbmZvLT5wc2V1ZG9fcGFsZXR0ZVtpbWFnZS0+YmdfY29sb3JdOwoJfSBlbHNlIHsKCQlmZ2NvbG9yID0gaW1hZ2UtPmZnX2NvbG9yOwoJCWJnY29sb3IgPSBpbWFnZS0+YmdfY29sb3I7Cgl9CgoJaWYgKCFpbnRlbGZiaHdfZG9fZHJhd2dseXBoKGRpbmZvLCBmZ2NvbG9yLCBiZ2NvbG9yLCBpbWFnZS0+d2lkdGgsCgkJCQkgICAgaW1hZ2UtPmhlaWdodCwgaW1hZ2UtPmRhdGEsCgkJCQkgICAgaW1hZ2UtPmR4LCBpbWFnZS0+ZHksCgkJCQkgICAgZGluZm8tPnBpdGNoLCBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpKQoJCXJldHVybiBjZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKfQoKc3RhdGljIGludAppbnRlbGZiX2N1cnNvcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZiX2N1cnNvciAqY3Vyc29yKQp7CiAgICAgICAgc3RydWN0IGludGVsZmJfaW5mbyAqZGluZm8gPSBHRVRfRElORk8oaW5mbyk7CgojaWYgVkVSQk9TRSA+IDAKCURCR19NU0coImludGVsZmJfY3Vyc29yXG4iKTsKI2VuZGlmCgoJaWYgKCFkaW5mby0+aHdjdXJzb3IpCgkJcmV0dXJuIC1FTk9ERVY7CgoJaW50ZWxmYmh3X2N1cnNvcl9oaWRlKGRpbmZvKTsKCgkvKiBJZiBYRnJlZSBraWxsZWQgdGhlIGN1cnNvciAtIHJlc3RvcmUgaXQgKi8KCWlmIChJTlJFRyhDVVJTT1JfQV9CQVNFQUREUikgIT0gZGluZm8tPmN1cnNvci5vZmZzZXQgPDwgMTIpIHsKCQl1MzIgZmcsIGJnOwoKCQlEQkdfTVNHKCJ0aGUgY3Vyc29yIHdhcyBraWxsZWQgLSByZXN0b3JlIGl0ICEhXG4iKTsKCQlEQkdfTVNHKCJzaXplICVkLCAlZCAgIHBvcyAlZCwgJWRcbiIsCgkJCWN1cnNvci0+aW1hZ2Uud2lkdGgsIGN1cnNvci0+aW1hZ2UuaGVpZ2h0LAoJCQljdXJzb3ItPmltYWdlLmR4LCBjdXJzb3ItPmltYWdlLmR5KTsKCgkJaW50ZWxmYmh3X2N1cnNvcl9pbml0KGRpbmZvKTsKCQlpbnRlbGZiaHdfY3Vyc29yX3Jlc2V0KGRpbmZvKTsKCQlpbnRlbGZiaHdfY3Vyc29yX3NldHBvcyhkaW5mbywgY3Vyc29yLT5pbWFnZS5keCwKCQkJCQljdXJzb3ItPmltYWdlLmR5KTsKCgkJaWYgKGRpbmZvLT5kZXB0aCAhPSA4KSB7CgkJCWZnID1kaW5mby0+cHNldWRvX3BhbGV0dGVbY3Vyc29yLT5pbWFnZS5mZ19jb2xvcl07CgkJCWJnID1kaW5mby0+cHNldWRvX3BhbGV0dGVbY3Vyc29yLT5pbWFnZS5iZ19jb2xvcl07CgkJfSBlbHNlIHsKCQkJZmcgPSBjdXJzb3ItPmltYWdlLmZnX2NvbG9yOwoJCQliZyA9IGN1cnNvci0+aW1hZ2UuYmdfY29sb3I7CgkJfQoJCWludGVsZmJod19jdXJzb3Jfc2V0Y29sb3IoZGluZm8sIGJnLCBmZyk7CgkJaW50ZWxmYmh3X2N1cnNvcl9sb2FkKGRpbmZvLCBjdXJzb3ItPmltYWdlLndpZHRoLAoJCQkJICAgICAgY3Vyc29yLT5pbWFnZS5oZWlnaHQsCgkJCQkgICAgICBkaW5mby0+Y3Vyc29yX3NyYyk7CgoJCWlmIChjdXJzb3ItPmVuYWJsZSkKCQkJaW50ZWxmYmh3X2N1cnNvcl9zaG93KGRpbmZvKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAoY3Vyc29yLT5zZXQgJiBGQl9DVVJfU0VUUE9TKSB7CgkJdTMyIGR4LCBkeTsKCgkJZHggPSBjdXJzb3ItPmltYWdlLmR4IC0gaW5mby0+dmFyLnhvZmZzZXQ7CgkJZHkgPSBjdXJzb3ItPmltYWdlLmR5IC0gaW5mby0+dmFyLnlvZmZzZXQ7CgoJCWludGVsZmJod19jdXJzb3Jfc2V0cG9zKGRpbmZvLCBkeCwgZHkpOwoJfQoKCWlmIChjdXJzb3ItPnNldCAmIEZCX0NVUl9TRVRTSVpFKSB7CgkJaWYgKGN1cnNvci0+aW1hZ2Uud2lkdGggPiA2NCB8fCBjdXJzb3ItPmltYWdlLmhlaWdodCA+IDY0KQoJCQlyZXR1cm4gLUVOWElPOwoKCQlpbnRlbGZiaHdfY3Vyc29yX3Jlc2V0KGRpbmZvKTsKCX0KCglpZiAoY3Vyc29yLT5zZXQgJiBGQl9DVVJfU0VUQ01BUCkgewoJCXUzMiBmZywgYmc7CgoJCWlmIChkaW5mby0+ZGVwdGggIT0gOCkgewoJCQlmZyA9IGRpbmZvLT5wc2V1ZG9fcGFsZXR0ZVtjdXJzb3ItPmltYWdlLmZnX2NvbG9yXTsKCQkJYmcgPSBkaW5mby0+cHNldWRvX3BhbGV0dGVbY3Vyc29yLT5pbWFnZS5iZ19jb2xvcl07CgkJfSBlbHNlIHsKCQkJZmcgPSBjdXJzb3ItPmltYWdlLmZnX2NvbG9yOwoJCQliZyA9IGN1cnNvci0+aW1hZ2UuYmdfY29sb3I7CgkJfQoKCQlpbnRlbGZiaHdfY3Vyc29yX3NldGNvbG9yKGRpbmZvLCBiZywgZmcpOwoJfQoKCWlmIChjdXJzb3ItPnNldCAmIChGQl9DVVJfU0VUU0hBUEUgfCBGQl9DVVJfU0VUSU1BR0UpKSB7CgkJdTMyIHNfcGl0Y2ggPSAoUk9VTkRfVVBfVE8oY3Vyc29yLT5pbWFnZS53aWR0aCwgOCkgLyA4KTsKCQl1MzIgc2l6ZSA9IHNfcGl0Y2ggKiBjdXJzb3ItPmltYWdlLmhlaWdodDsKCQl1OCAqZGF0ID0gKHU4ICopIGN1cnNvci0+aW1hZ2UuZGF0YTsKCQl1OCAqbXNrID0gKHU4ICopIGN1cnNvci0+bWFzazsKCQl1OCBzcmNbNjRdOwoJCXUzMiBpOwoKCQlpZiAoY3Vyc29yLT5pbWFnZS5kZXB0aCAhPSAxKQoJCQlyZXR1cm4gLUVOWElPOwoKCQlzd2l0Y2ggKGN1cnNvci0+cm9wKSB7CgkJY2FzZSBST1BfWE9SOgoJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQoJCQkJc3JjW2ldID0gZGF0W2ldIF4gbXNrW2ldOwoJCQlicmVhazsKCQljYXNlIFJPUF9DT1BZOgoJCWRlZmF1bHQ6CgkJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCgkJCQlzcmNbaV0gPSBkYXRbaV0gJiBtc2tbaV07CgkJCWJyZWFrOwoJCX0KCgkJLyogc2F2ZSB0aGUgYml0bWFwIHRvIHJlc3RvcmUgaXQgd2hlbiBYRnJlZSB3aWxsCgkJICAgbWFrZSB0aGUgY3Vyc29yIGRpcnR5ICovCgkJbWVtY3B5KGRpbmZvLT5jdXJzb3Jfc3JjLCBzcmMsIHNpemUpOwoKCQlpbnRlbGZiaHdfY3Vyc29yX2xvYWQoZGluZm8sIGN1cnNvci0+aW1hZ2Uud2lkdGgsCgkJCQkgICAgICBjdXJzb3ItPmltYWdlLmhlaWdodCwgc3JjKTsKCX0KCglpZiAoY3Vyc29yLT5lbmFibGUpCgkJaW50ZWxmYmh3X2N1cnNvcl9zaG93KGRpbmZvKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludAppbnRlbGZiX3N5bmMoc3RydWN0IGZiX2luZm8gKmluZm8pCnsKICAgICAgICBzdHJ1Y3QgaW50ZWxmYl9pbmZvICpkaW5mbyA9IEdFVF9ESU5GTyhpbmZvKTsKCiNpZiBWRVJCT1NFID4gMAoJREJHX01TRygiaW50ZWxmYl9zeW5jXG4iKTsKI2VuZGlmCgoJaWYgKGRpbmZvLT5yaW5nX2xvY2t1cCkKCQlyZXR1cm4gMDsKCglpbnRlbGZiaHdfZG9fc3luYyhkaW5mbyk7CglyZXR1cm4gMDsKfQoK