LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgbmV0d2F2ZV9jcy5jCiAqIFZlcnNpb246ICAgICAgIDAuNC4xCiAqIERlc2NyaXB0aW9uOiAgIE5ldHdhdmUgQWlyU3VyZmVyIFdpcmVsZXNzIExBTiBQQyBDYXJkIGRyaXZlcgogKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCiAqIEF1dGhvcnM6ICAgICAgIEpvaG4gTWFya3VzIEJq+HJuZGFsZW4gPGpvaG5tQGNzLnVpdC5ubz4KICogICAgICAgICAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiAgICAgICAgICAgICAgICBEYXZpZCBIaW5kcyA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiAqIENyZWF0ZWQgYXQ6ICAgIEEgbG9uZyB0aW1lIGFnbyEKICogTW9kaWZpZWQgYXQ6ICAgTW9uIE5vdiAxMCAxMTo1NDozNyAxOTk3CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogCiAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTcgVW5pdmVyc2l0eSBvZiBUcm9tc/gsIE5vcndheQogKgogKiBSZXZpc2lvbiBIaXN0b3J5OgogKgogKiAgIDA4LU5vdi05NyAxNToxNDo0NyAgIEpvaG4gTWFya3VzIEJq+HJuZGFsZW4gPGpvaG5tQGNzLnVpdC5ubz4KICogICAgLSBGaXhlZCBzb21lIGJ1Z3MgaW4gbmV0d2F2ZV9yeCBhbmQgY2xlYW5lZCBpdCB1cCBhIGJpdC4gCiAqICAgICAgKE9uZSBvZiB0aGUgYnVncyB3b3VsZCBoYXZlIGRlc3Ryb3llZCBwYWNrZXRzIHdoZW4gcmVjZWl2aW5nCiAqICAgICAgbXVsdGlwbGUgcGFja2V0cyBwZXIgaW50ZXJydXB0KS4gCiAqICAgIC0gQ2xlYW5lZCB1cCBwYXJ0cyBvZiBuZXdhdmVfaHdfeG1pdC4gCiAqICAgIC0gQSBmZXcgZ2VuZXJhbCBjbGVhbnVwcy4gCiAqICAgMjQtT2N0LTk3IDEzOjE3OjM2ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiAgICAtIEZpeGVkIG5ldHdhdmVfcnggcmVjZWl2ZSBmdW5jdGlvbiAoZ290IHVwZGF0ZWQgZG9jcykKICogICBPdGhlcnM6CiAqICAgIC0gQ2hhbmdlZCBuYW1lIGZyb20geGlyY253IHRvIG5ldHdhdmUsIHRha2UgYSBsb29rIGF0IAogKiAgICAgIGh0dHA6Ly93d3cubmV0d2F2ZS13aXJlbGVzcy5jb20KICogICAgLSBTb21lIHJlb3JnYW5pemluZyBvZiB0aGUgY29kZQogKiAgICAtIFJlbW92ZWQgcG9zc2libGUgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgdHJhbnNtaXQKICogICAgICBmdW5jdGlvbgogKiAgICAtIFN0YXJ0ZWQgdG8gYWRkIHdpcmVsZXNzIGV4dGVuc2lvbnMsIGJ1dCBzdGlsbCBuZWVkcyBzb21lIGNvZGluZwogKiAgICAtIEFkZGVkIHdhdGNoZG9nIGZvciBiZXR0ZXIgaGFuZGxpbmcgb2YgdHJhbnNtaXNzaW9uIHRpbWVvdXRzIAogKiAgICAgIChob3BlZnVsbHkgdGhpcyB3b3JrcyBiZXR0ZXIpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIFRvIGhhdmUgc3RhdGlzdGljcyAoanVzdCBwYWNrZXRzIHNlbnQpIGRlZmluZSB0aGlzICovCiN1bmRlZiBORVRXQVZFX1NUQVRTCgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9pbi5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC90aW1lci5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgojaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiNpZmRlZiBDT05GSUdfTkVUX1JBRElPCiNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgojaWYgV0lSRUxFU1NfRVhUID4gMTIKI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CiNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiAxMiAqLwojZW5kaWYKCiNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgojaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgojaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgojaW5jbHVkZSA8cGNtY2lhL2RzLmg+CiNpbmNsdWRlIDxwY21jaWEvbWVtX29wLmg+CgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vZG1hLmg+CgojZGVmaW5lIE5FVFdBVkVfUkVHT0ZGICAgICAgICAgMHg4MDAwCi8qIFRoZSBOZXR3YXZlIElPIHJlZ2lzdGVycywgb2Zmc2V0cyB0byBpb2Jhc2UgKi8KI2RlZmluZSBORVRXQVZFX1JFR19DT1IgICAgICAgIDB4MAojZGVmaW5lIE5FVFdBVkVfUkVHX0NDU1IgICAgICAgMHgyCiNkZWZpbmUgTkVUV0FWRV9SRUdfQVNSICAgICAgICAweDQKI2RlZmluZSBORVRXQVZFX1JFR19JTVIgICAgICAgIDB4YQojZGVmaW5lIE5FVFdBVkVfUkVHX1BNUiAgICAgICAgMHhjCiNkZWZpbmUgTkVUV0FWRV9SRUdfSU9MT1cgICAgICAweDYKI2RlZmluZSBORVRXQVZFX1JFR19JT0hJICAgICAgIDB4NwojZGVmaW5lIE5FVFdBVkVfUkVHX0lPQ09OVFJPTCAgMHg4CiNkZWZpbmUgTkVUV0FWRV9SRUdfREFUQSAgICAgICAweGYKLyogVGhlIE5ldHdhdmUgRXh0ZW5kZWQgSU8gcmVnaXN0ZXJzLCBvZmZzZXRzIHRvIFJhbUJhc2UgKi8KI2RlZmluZSBORVRXQVZFX0VSRUdfQVNDQyAgICAgIDB4MTE0CiNkZWZpbmUgTkVUV0FWRV9FUkVHX1JTRVIgICAgICAweDEyMAojZGVmaW5lIE5FVFdBVkVfRVJFR19SU0VSVyAgICAgMHgxMjQKI2RlZmluZSBORVRXQVZFX0VSRUdfVFNFUiAgICAgIDB4MTMwCiNkZWZpbmUgTkVUV0FWRV9FUkVHX1RTRVJXICAgICAweDEzNAojZGVmaW5lIE5FVFdBVkVfRVJFR19DQiAgICAgICAgMHgxMDAKI2RlZmluZSBORVRXQVZFX0VSRUdfU1BDUSAgICAgIDB4MTU0CiNkZWZpbmUgTkVUV0FWRV9FUkVHX1NQVSAgICAgICAweDE1NQojZGVmaW5lIE5FVFdBVkVfRVJFR19MSUYgICAgICAgMHgxNGUKI2RlZmluZSBORVRXQVZFX0VSRUdfSVNQTFEgICAgIDB4MTU2CiNkZWZpbmUgTkVUV0FWRV9FUkVHX0hIQyAgICAgICAweDE1OAojZGVmaW5lIE5FVFdBVkVfRVJFR19OSSAgICAgICAgMHgxNmUKI2RlZmluZSBORVRXQVZFX0VSRUdfTUhTICAgICAgIDB4MTZiCiNkZWZpbmUgTkVUV0FWRV9FUkVHX1REUCAgICAgICAweDE0MAojZGVmaW5lIE5FVFdBVkVfRVJFR19SRFAgICAgICAgMHgxNTAKI2RlZmluZSBORVRXQVZFX0VSRUdfUEEgICAgICAgIDB4MTYwCiNkZWZpbmUgTkVUV0FWRV9FUkVHX0VDICAgICAgICAweDE4MAojZGVmaW5lIE5FVFdBVkVfRVJFR19DUkJQICAgICAgMHgxN2EKI2RlZmluZSBORVRXQVZFX0VSRUdfQVJXICAgICAgIDB4MTY2CgovKgogKiBDb21tYW5kcyB1c2VkIGluIHRoZSBleHRlbmRlZCBjb21tYW5kIGJ1ZmZlcgogKiBORVRXQVZFX0VSRUdfQ0IgKDB4MTAwLTB4MTBGKSAKICovCiNkZWZpbmUgTkVUV0FWRV9DTURfTk9QICAgICAgICAweDAwCiNkZWZpbmUgTkVUV0FWRV9DTURfU1JDICAgICAgICAweDAxCiNkZWZpbmUgTkVUV0FWRV9DTURfU1RDICAgICAgICAweDAyCiNkZWZpbmUgTkVUV0FWRV9DTURfQU1BICAgICAgICAweDAzCiNkZWZpbmUgTkVUV0FWRV9DTURfRE1BICAgICAgICAweDA0CiNkZWZpbmUgTkVUV0FWRV9DTURfU0FNQSAgICAgICAweDA1CiNkZWZpbmUgTkVUV0FWRV9DTURfRVIgICAgICAgICAweDA2CiNkZWZpbmUgTkVUV0FWRV9DTURfRFIgICAgICAgICAweDA3CiNkZWZpbmUgTkVUV0FWRV9DTURfVEwgICAgICAgICAweDA4CiNkZWZpbmUgTkVUV0FWRV9DTURfU1JQICAgICAgICAweDA5CiNkZWZpbmUgTkVUV0FWRV9DTURfU1NLICAgICAgICAweDBhCiNkZWZpbmUgTkVUV0FWRV9DTURfU01EICAgICAgICAweDBiCiNkZWZpbmUgTkVUV0FWRV9DTURfU0FQRCAgICAgICAweDBjCiNkZWZpbmUgTkVUV0FWRV9DTURfU1NTICAgICAgICAweDExCi8qIEVuZCBvZiBDb21tYW5kIG1hcmtlciAqLwojZGVmaW5lIE5FVFdBVkVfQ01EX0VPQyAgICAgICAgMHgwMAoKLyogQVNSIHJlZ2lzdGVyIGJpdHMgKi8KI2RlZmluZSBORVRXQVZFX0FTUl9SWFJEWSAgIDB4ODAKI2RlZmluZSBORVRXQVZFX0FTUl9UWEJBICAgIDB4MDEKCiNkZWZpbmUgVFhfVElNRU9VVAkJKCgzMipIWikvMTAwKQoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpbXJDb25mUkZVMSA9IDB4MTA7IC8qIFJGVSBpbnRlcnJ1cHQgbWFzaywga2VlcCBoaWdoICovCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaW1yQ29uZklFTkEgPSAweDAyOyAvKiBJbnRlcnJ1cHQgZW5hYmxlICovCgpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNvckNvbmZJRU5BICAgPSAweDAxOyAvKiBJbnRlcnJ1cHQgZW5hYmxlICovCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY29yQ29uZkxWTFJFUSA9IDB4NDA7IC8qIEtlZXAgaGlnaCAqLwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByeENvbmZSeEVuYSAgPSAweDgwOyAvKiBSZWNlaXZlIEVuYWJsZSAqLwpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ4Q29uZk1BQyAgICA9IDB4MjA7IC8qIE1BQyBob3N0IHJlY2VpdmUgbW9kZSovIApzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ4Q29uZlBybyAgICA9IDB4MTA7IC8qIFByb21pc2N1b3VzICovCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcnhDb25mQU1QICAgID0gMHgwODsgLyogQWNjZXB0IE11bHRpY2FzdCBQYWNrZXRzICovCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcnhDb25mQmNhc3QgID0gMHgwNDsgLyogQWNjZXB0IEJyb2FkY2FzdCBQYWNrZXRzICovCgpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHR4Q29uZlR4RW5hICA9IDB4ODA7IC8qIFRyYW5zbWl0IEVuYWJsZSAqLwpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHR4Q29uZk1BQyAgICA9IDB4MjA7IC8qIEhvc3Qgc2VuZHMgTUFDIG1vZGUgKi8Kc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0eENvbmZFVUQgICAgPSAweDEwOyAvKiBFbmFibGUgVW5pLURhdGEgcGFja2V0cyAqLwpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHR4Q29uZktleSAgICA9IDB4MDI7IC8qIFNjcmFtYmxlIGRhdGEgcGFja2V0cyAqLwpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHR4Q29uZkxvb3AgICA9IDB4MDE7IC8qIExvb3BiYWNrIG1vZGUgKi8KCi8qCiAgIEFsbCB0aGUgUENNQ0lBIG1vZHVsZXMgdXNlIFBDTUNJQV9ERUJVRyB0byBjb250cm9sIGRlYnVnZ2luZy4gIElmCiAgIHlvdSBkbyBub3QgZGVmaW5lIFBDTUNJQV9ERUJVRyBhdCBhbGwsIGFsbCB0aGUgZGVidWcgY29kZSB3aWxsIGJlCiAgIGxlZnQgb3V0LiAgSWYgeW91IGNvbXBpbGUgd2l0aCBQQ01DSUFfREVCVUc9MCwgdGhlIGRlYnVnIGNvZGUgd2lsbAogICBiZSBwcmVzZW50IGJ1dCBkaXNhYmxlZCAtLSBidXQgaXQgY2FuIHRoZW4gYmUgZW5hYmxlZCBmb3Igc3BlY2lmaWMKICAgbW9kdWxlcyBhdCBsb2FkIHRpbWUgd2l0aCBhICdwY19kZWJ1Zz0jJyBvcHRpb24gdG8gaW5zbW9kLgoqLwoKI2lmZGVmIFBDTUNJQV9ERUJVRwpzdGF0aWMgaW50IHBjX2RlYnVnID0gUENNQ0lBX0RFQlVHOwptb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMCk7CiNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKc3RhdGljIGNoYXIgKnZlcnNpb24gPQoibmV0d2F2ZV9jcy5jIDAuMy4wIFRodSBKdWwgMTcgMTQ6MzY6MDIgMTk5NyAoSm9obiBNYXJrdXMgQmr4cm5kYWxlbilcbiI7CiNlbHNlCiNkZWZpbmUgREVCVUcobiwgYXJncy4uLikKI2VuZGlmCgpzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJuZXR3YXZlX2NzIjsKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSBzZXQgd2l0aCAnaW5zbW9kJyAqLwoKLyogQ2hvb3NlIHRoZSBkb21haW4sIGRlZmF1bHQgaXMgMHgxMDAgKi8Kc3RhdGljIHVfaW50ICBkb21haW4gPSAweDEwMDsKCi8qIFNjcmFtYmxlIGtleSwgcmFuZ2UgZnJvbSAweDAgdG8gMHhmZmZmLiAgCiAqIDB4MCBpcyBubyBzY3JhbWJsaW5nLiAKICovCnN0YXRpYyB1X2ludCAgc2NyYW1ibGVfa2V5ID0gMHgwOwoKLyogU2hhcmVkIG1lbW9yeSBzcGVlZCwgaW4gbnMuIFRoZSBkb2N1bWVudGF0aW9uIHN0YXRlcyB0aGF0IAogKiB0aGUgY2FyZCBzaG91bGQgbm90IGJlIHJlYWQgZmFzdGVyIHRoYW4gZXZlcnkgNDAwbnMuIAogKiBUaGlzIHRpbWluZyBzaG91bGQgYmUgcHJvdmlkZWQgYnkgdGhlIEhCQS4gSWYgaXQgYmVjb21lcyBhIAogKiBwcm9ibGVtLCB0cnkgc2V0dGluZyBtZW1fc3BlZWQgdG8gNDAwLiAKICovCnN0YXRpYyBpbnQgbWVtX3NwZWVkOwoKbW9kdWxlX3BhcmFtKGRvbWFpbiwgaW50LCAwKTsKbW9kdWxlX3BhcmFtKHNjcmFtYmxlX2tleSwgaW50LCAwKTsKbW9kdWxlX3BhcmFtKG1lbV9zcGVlZCwgaW50LCAwKTsKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyogUENNQ0lBIChDYXJkIFNlcnZpY2VzKSByZWxhdGVkIGZ1bmN0aW9ucyAqLwpzdGF0aWMgdm9pZCBuZXR3YXZlX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluayk7ICAgICAvKiBDYXJkIHJlbW92YWwgKi8Kc3RhdGljIGludCAgbmV0d2F2ZV9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksIAoJCQkJCSAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CnN0YXRpYyB2b2lkIG5ldHdhdmVfcGNtY2lhX2NvbmZpZyhkZXZfbGlua190ICphcmcpOyAvKiBSdW5zIGFmdGVyIGNhcmQgCgkJCQkJCQkJCQkJCQkgICBpbnNlcnRpb24gKi8Kc3RhdGljIGRldl9saW5rX3QgKm5ldHdhdmVfYXR0YWNoKHZvaWQpOyAgICAgLyogQ3JlYXRlIGluc3RhbmNlICovCnN0YXRpYyB2b2lkIG5ldHdhdmVfZGV0YWNoKGRldl9saW5rX3QgKik7ICAgIC8qIERlc3Ryb3kgaW5zdGFuY2UgKi8KCi8qIEhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gKi8Kc3RhdGljIHZvaWQgbmV0d2F2ZV9kb3Jlc2V0KGtpb19hZGRyX3QgaW9iYXNlLCB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSk7CnN0YXRpYyB2b2lkIG5ldHdhdmVfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CgovKiBNaXNjIGRldmljZSBzdHVmZiAqLwpzdGF0aWMgaW50IG5ldHdhdmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsgIC8qIE9wZW4gdGhlIGRldmljZSAqLwpzdGF0aWMgaW50IG5ldHdhdmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7IC8qIENsb3NlIHRoZSBkZXZpY2UgKi8KCi8qIFBhY2tldCB0cmFuc21pc3Npb24gYW5kIFBhY2tldCByZWNlcHRpb24gKi8Kc3RhdGljIGludCBuZXR3YXZlX3N0YXJ0X3htaXQoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpzdGF0aWMgaW50IG5ldHdhdmVfcngoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwoKLyogSW50ZXJydXB0IHJvdXRpbmVzICovCnN0YXRpYyBpcnFyZXR1cm5fdCBuZXR3YXZlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKc3RhdGljIHZvaWQgbmV0d2F2ZV93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKCi8qIFN0YXRpc3RpY3MgKi8Kc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldHdhdmVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwoKLyogV2lyZWxlc3MgZXh0ZW5zaW9ucyAqLwojaWZkZWYgV0lSRUxFU1NfRVhUCnN0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyogbmV0d2F2ZV9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiNlbmRpZgpzdGF0aWMgaW50IG5ldHdhdmVfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICosIGludCk7CgpzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CgovKgogICBBIGxpbmtlZCBsaXN0IG9mICJpbnN0YW5jZXMiIG9mIHRoZSBza2VsZXRvbiBkZXZpY2UuICBFYWNoIGFjdHVhbAogICBQQ01DSUEgY2FyZCBjb3JyZXNwb25kcyB0byBvbmUgZGV2aWNlIGluc3RhbmNlLCBhbmQgaXMgZGVzY3JpYmVkCiAgIGJ5IG9uZSBkZXZfbGlua190IHN0cnVjdHVyZSAoZGVmaW5lZCBpbiBkcy5oKS4KCiAgIFlvdSBtYXkgbm90IHdhbnQgdG8gdXNlIGEgbGlua2VkIGxpc3QgZm9yIHRoaXMgLS0gZm9yIGV4YW1wbGUsIHRoZQogICBtZW1vcnkgY2FyZCBkcml2ZXIgdXNlcyBhbiBhcnJheSBvZiBkZXZfbGlua190IHBvaW50ZXJzLCB3aGVyZSBtaW5vcgogICBkZXZpY2UgbnVtYmVycyBhcmUgdXNlZCB0byBkZXJpdmUgdGhlIGNvcnJlc3BvbmRpbmcgYXJyYXkgaW5kZXguCiovCnN0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdDsKCi8qCiAgIEEgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgaGFzIGZpZWxkcyBmb3IgbW9zdCB0aGluZ3MgdGhhdCBhcmUgbmVlZGVkCiAgIHRvIGtlZXAgdHJhY2sgb2YgYSBzb2NrZXQsIGJ1dCB0aGVyZSB3aWxsIHVzdWFsbHkgYmUgc29tZSBkZXZpY2UKICAgc3BlY2lmaWMgaW5mb3JtYXRpb24gdGhhdCBhbHNvIG5lZWRzIHRvIGJlIGtlcHQgdHJhY2sgb2YuICBUaGUKICAgJ3ByaXYnIHBvaW50ZXIgaW4gYSBkZXZfbGlua190IHN0cnVjdHVyZSBjYW4gYmUgdXNlZCB0byBwb2ludCB0bwogICBhIGRldmljZS1zcGVjaWZpYyBwcml2YXRlIGRhdGEgc3RydWN0dXJlLCBsaWtlIHRoaXMuCgogICBBIGRyaXZlciBuZWVkcyB0byBwcm92aWRlIGEgZGV2X25vZGVfdCBzdHJ1Y3R1cmUgZm9yIGVhY2ggZGV2aWNlCiAgIG9uIGEgY2FyZC4gIEluIHNvbWUgY2FzZXMsIHRoZXJlIGlzIG9ubHkgb25lIGRldmljZSBwZXIgY2FyZCAoZm9yCiAgIGV4YW1wbGUsIGV0aGVybmV0IGNhcmRzLCBtb2RlbXMpLiAgSW4gb3RoZXIgY2FzZXMsIHRoZXJlIG1heSBiZQogICBtYW55IGFjdHVhbCBvciBsb2dpY2FsIGRldmljZXMgKFNDU0kgYWRhcHRlcnMsIG1lbW9yeSBjYXJkcyB3aXRoCiAgIG11bHRpcGxlIHBhcnRpdGlvbnMpLiAgVGhlIGRldl9ub2RlX3Qgc3RydWN0dXJlcyBuZWVkIHRvIGJlIGtlcHQKICAgaW4gYSBsaW5rZWQgbGlzdCBzdGFydGluZyBhdCB0aGUgJ2RldicgZmllbGQgb2YgYSBkZXZfbGlua190CiAgIHN0cnVjdHVyZS4gIFdlIGFsbG9jYXRlIHRoZW0gaW4gdGhlIGNhcmQncyBwcml2YXRlIGRhdGEgc3RydWN0dXJlLAogICBiZWNhdXNlIHRoZXkgZ2VuZXJhbGx5IGNhbid0IGJlIGFsbG9jYXRlZCBkeW5hbWljYWxseS4KKi8KCiNpZiBXSVJFTEVTU19FWFQgPD0gMTIKLyogV2lyZWxlc3MgZXh0ZW5zaW9ucyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCgovKiBQYXJ0IG9mIGl3X2hhbmRsZXIgcHJvdG90eXBlIHdlIG5lZWQgKi8Kc3RydWN0IGl3X3JlcXVlc3RfaW5mbwp7CglfX3UxNgkJY21kOwkJLyogV2lyZWxlc3MgRXh0ZW5zaW9uIGNvbW1hbmQgKi8KCV9fdTE2CQlmbGFnczsJCS8qIE1vcmUgdG8gY29tZSA7LSkgKi8KfTsKCi8qIFdpcmVsZXNzIEV4dGVuc2lvbiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IC0gSmVhbiBJSQogKiBJZiB0aGUgbmV3IHdpcmVsZXNzIGRldmljZSBwcml2YXRlIGlvY3RsIHJhbmdlIGlzIG5vdCBkZWZpbmVkLAogKiBkZWZhdWx0IHRvIHN0YW5kYXJkIGRldmljZSBwcml2YXRlIGlvY3RsIHJhbmdlICovCiNpZm5kZWYgU0lPQ0lXRklSU1RQUklWCiNkZWZpbmUgU0lPQ0lXRklSU1RQUklWCVNJT0NERVZQUklWQVRFCiNlbmRpZiAvKiBTSU9DSVdGSVJTVFBSSVYgKi8KCiNlbHNlCS8qIFdJUkVMRVNTX0VYVCA8PSAxMiAqLwpzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmCW5ldHdhdmVfaGFuZGxlcl9kZWY7CiNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPD0gMTIgKi8KCiNkZWZpbmUgU0lPQ0dJUFNOQVAJU0lPQ0lXRklSU1RQUklWCSsgMQkvKiBTaXRlIFN1cnZleSBTbmFwc2hvdCAqLwoKI2RlZmluZSBNQVhfRVNBIDEwCgp0eXBlZGVmIHN0cnVjdCBuZXRfYWRkciB7CiAgICB1X2NoYXIgYWRkcjQ4WzZdOwp9IG5ldF9hZGRyOwoKc3RydWN0IHNpdGVfc3VydmV5IHsKICAgIHVfc2hvcnQgbGVuZ3RoOwogICAgdV9jaGFyICBzdHJ1Y3RfcmV2aXNpb247CiAgICB1X2NoYXIgIHJvYW1pbmdfc3RhdGU7CgkKICAgIHVfY2hhciAgc3BfZXhpc3RzRmxhZzsKICAgIHVfY2hhciAgc3BfbGlua19xdWFsaXR5OwogICAgdV9jaGFyICBzcF9tYXhfbGlua19xdWFsaXR5OwogICAgdV9jaGFyICBsaW5rUXVhbGl0eUdvb2RGYWlyQm91bmRhcnk7CiAgICB1X2NoYXIgIGxpbmtRdWFsaXR5RmFpclBvb3JCb3VuZGFyeTsKICAgIHVfY2hhciAgc3BfdXRpbGl6YXRpb247CiAgICB1X2NoYXIgIHNwX2dvb2RuZXNzOwogICAgdV9jaGFyICBzcF9ob3RoZWFkY291bnQ7CiAgICB1X2NoYXIgIHJvYW1pbmdfY29uZGl0aW9uOwoJCiAgICBuZXRfYWRkciBzcDsKICAgIHVfY2hhciAgIG51bUFQczsKICAgIG5ldF9hZGRyIG5lYXJCeUFjY2Vzc1BvaW50c1tNQVhfRVNBXTsKfTsJCiAgIAp0eXBlZGVmIHN0cnVjdCBuZXR3YXZlX3ByaXZhdGUgewogICAgZGV2X2xpbmtfdCBsaW5rOwogICAgc3BpbmxvY2tfdAlzcGlubG9jazsJLyogU2VyaWFsaXplIGFjY2VzcyB0byB0aGUgaGFyZHdhcmUgKFNNUCkgKi8KICAgIGRldl9ub2RlX3Qgbm9kZTsKICAgIHVfY2hhciAgICAgX19pb21lbSAqcmFtQmFzZTsKICAgIGludCAgICAgICAgdGltZW91dENvdW50ZXI7CiAgICBpbnQgICAgICAgIGxhc3RFeGVjOwogICAgc3RydWN0IHRpbWVyX2xpc3QgICAgICB3YXRjaGRvZzsJLyogVG8gYXZvaWQgYmxvY2tpbmcgc3RhdGUgKi8KICAgIHN0cnVjdCBzaXRlX3N1cnZleSAgICAgbnNzOwogICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiNpZmRlZiBXSVJFTEVTU19FWFQKICAgIHN0cnVjdCBpd19zdGF0aXN0aWNzICAgaXdfc3RhdHM7ICAgIC8qIFdpcmVsZXNzIHN0YXRzICovCiNlbmRpZgp9IG5ldHdhdmVfcHJpdmF0ZTsKCiNpZmRlZiBORVRXQVZFX1NUQVRTCnN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0d2F2ZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiNlbmRpZgoKLyoKICogVGhlIE5ldHdhdmUgY2FyZCBpcyBsaXR0bGUtZW5kaWFuLCBzbyB3b24ndCB3b3JrIGZvciBiaWcgZW5kaWFuCiAqIHN5c3RlbXMuCiAqLwpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGdldF91aW50MTYodV9jaGFyIF9faW9tZW0gKnN0YWRkcikgCnsKICAgIHJldHVybiByZWFkdyhzdGFkZHIpOyAvKiBSZXR1cm4gb25seSAxNiBiaXRzICovCn0KCnN0YXRpYyBpbmxpbmUgc2hvcnQgZ2V0X2ludDE2KHVfY2hhciBfX2lvbWVtICogc3RhZGRyKQp7CiAgICByZXR1cm4gcmVhZHcoc3RhZGRyKTsKfQoKLyogCiAqIFdhaXQgdW50aWwgdGhlIFdPQyAoV3JpdGUgT3BlcmF0aW9uIENvbXBsZXRlKSBiaXQgaW4gdGhlIAogKiBBU1IgKEFkYXB0ZXIgU3RhdHVzIFJlZ2lzdGVyKSBpcyBhc3NlcnRlZC4gCiAqIFRoaXMgc2hvdWxkIGhhdmUgYWJvcnRlZCBpZiBpdCB0YWtlcyB0b28gbG9uZyB0aW1lLiAKICovCnN0YXRpYyBpbmxpbmUgdm9pZCB3YWl0X1dPQyh1bnNpZ25lZCBpbnQgaW9iYXNlKQp7CiAgICAvKiBTcGluIGxvY2sgKi8KICAgIHdoaWxlICgoaW5iKGlvYmFzZSArIE5FVFdBVkVfUkVHX0FTUikgJiAweDgpICE9IDB4OCkgOyAKfQoKI2lmZGVmIFdJUkVMRVNTX0VYVApzdGF0aWMgdm9pZCBuZXR3YXZlX3NuYXBzaG90KG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiwgdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UsIAoJCQkgICAgIGtpb19hZGRyX3QgaW9iYXNlKSB7CiAgICB1X3Nob3J0IHJlc3VsdEJ1ZmZlcjsKCiAgICAvKiBpZiB0aW1lIHNpbmNlIGxhc3Qgc25hcHNob3QgaXMgPiAxIHNlYy4gKDEwMCBqaWZmaWVzPykgIHRoZW4gdGFrZSAKICAgICAqIG5ldyBzbmFwc2hvdCwgZWxzZSByZXR1cm4gY2FjaGVkIGRhdGEuIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIHJhdGUuICAKICAgICAqLwogICAgaWYgKCBqaWZmaWVzIC0gcHJpdi0+bGFzdEV4ZWMgPiAxMDApIHsgCgkvKiBUYWtlIHNpdGUgc3VydmV5ICBzbmFwc2hvdCAqLyAKCS8qcHJpbnRrKCBLRVJOX0RFQlVHICJUYWtpbmcgbmV3IHNuYXBzaG90LiAlbGRcbiIsIGppZmZpZXMgLQoJICBwcml2LT5sYXN0RXhlYyk7ICovCgl3YWl0X1dPQyhpb2Jhc2UpOyAKCXdyaXRlYihORVRXQVZFX0NNRF9TU1MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsgCgl3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7IAoJd2FpdF9XT0MoaW9iYXNlKTsgCgoJLyogR2V0IHJlc3VsdCBhbmQgY29weSB0byBjYWNoICovIAoJcmVzdWx0QnVmZmVyID0gcmVhZHcocmFtQmFzZSArIE5FVFdBVkVfRVJFR19DUkJQKTsgCgljb3B5X2Zyb21fcGMoICZwcml2LT5uc3MsIHJhbUJhc2UrcmVzdWx0QnVmZmVyLCAKCQkgICAgICBzaXplb2Yoc3RydWN0IHNpdGVfc3VydmV5KSk7IAogICAgfSAKfQojZW5kaWYKCiNpZmRlZiBXSVJFTEVTU19FWFQKLyoKICogRnVuY3Rpb24gbmV0d2F2ZV9nZXRfd2lyZWxlc3Nfc3RhdHMgKGRldikKICoKICogICAgV2lyZWxlc3MgZXh0ZW5zaW9ucyBzdGF0aXN0aWNzCiAqCiAqLwpzdGF0aWMgc3RydWN0IGl3X3N0YXRpc3RpY3MgKm5ldHdhdmVfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsJCiAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogICAga2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAgICB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CiAgICBzdHJ1Y3QgaXdfc3RhdGlzdGljcyogd3N0YXRzOwoJCiAgICB3c3RhdHMgPSAmcHJpdi0+aXdfc3RhdHM7CgogICAgc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CgkKICAgIG5ldHdhdmVfc25hcHNob3QoIHByaXYsIHJhbUJhc2UsIGlvYmFzZSk7CgogICAgd3N0YXRzLT5zdGF0dXMgPSBwcml2LT5uc3Mucm9hbWluZ19zdGF0ZTsKICAgIHdzdGF0cy0+cXVhbC5xdWFsID0gcmVhZGIoIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfU1BDUSk7IAogICAgd3N0YXRzLT5xdWFsLmxldmVsID0gcmVhZGIoIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfSVNQTFEpOwogICAgd3N0YXRzLT5xdWFsLm5vaXNlID0gcmVhZGIoIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfU1BVKSAmIDB4M2Y7CiAgICB3c3RhdHMtPmRpc2NhcmQubndpZCA9IDBMOwogICAgd3N0YXRzLT5kaXNjYXJkLmNvZGUgPSAwTDsKICAgIHdzdGF0cy0+ZGlzY2FyZC5taXNjID0gMEw7CgogICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKICAgIAogICAgcmV0dXJuICZwcml2LT5pd19zdGF0czsKfQojZW5kaWYKCi8qCiAqIEZ1bmN0aW9uIG5ldHdhdmVfYXR0YWNoICh2b2lkKQogKgogKiAgICAgQ3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcgbG9jYWwgZGF0YSAKICogICAgIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQgd2l0aCBDYXJkIAogKiAgICAgU2VydmljZXMuCiAqCiAqICAgICBUaGUgZGV2X2xpbmsgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkKICogICAgIGNvbmZpZ3VyZSB0aGUgY2FyZCBhdCB0aGlzIHBvaW50IC0tIHdlIHdhaXQgdW50aWwgd2UgcmVjZWl2ZSBhCiAqICAgICBjYXJkIGluc2VydGlvbiBldmVudC4KICovCnN0YXRpYyBkZXZfbGlua190ICpuZXR3YXZlX2F0dGFjaCh2b2lkKQp7CiAgICBjbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKICAgIGRldl9saW5rX3QgKmxpbms7CiAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogICAgbmV0d2F2ZV9wcml2YXRlICpwcml2OwogICAgaW50IHJldDsKICAgIAogICAgREVCVUcoMCwgIm5ldHdhdmVfYXR0YWNoKClcbiIpOwogICAgCiAgICAvKiBJbml0aWFsaXplIHRoZSBkZXZfbGlua190IHN0cnVjdHVyZSAqLwogICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKG5ldHdhdmVfcHJpdmF0ZSkpOwogICAgaWYgKCFkZXYpCglyZXR1cm4gTlVMTDsKICAgIHByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogICAgbGluayA9ICZwcml2LT5saW5rOwogICAgbGluay0+cHJpdiA9IGRldjsKCiAgICAvKiBUaGUgaW8gc3RydWN0dXJlIGRlc2NyaWJlcyBJTyBwb3J0IG1hcHBpbmcgKi8KICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDE2OwogICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CiAgICAvKiBsaW5rLT5pby5OdW1Qb3J0czIgPSAxNjsgCiAgICAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsgKi8KICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gNTsKICAgIAogICAgLyogSW50ZXJydXB0IHNldHVwICovCiAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKICAgIGxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKICAgIGxpbmstPmlycS5IYW5kbGVyID0gJm5ldHdhdmVfaW50ZXJydXB0OwogICAgCiAgICAvKiBHZW5lcmFsIHNvY2tldCBjb25maWd1cmF0aW9uICovCiAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CiAgICBsaW5rLT5jb25mLlZjYyA9IDUwOwogICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CiAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMTsKICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IFBSRVNFTlRfT1BUSU9OOwoKICAgIC8qIE5ldHdhdmUgcHJpdmF0ZSBzdHJ1Y3QgaW5pdC4gbGluay9kZXYvbm9kZSBhbHJlYWR5IHRha2VuIGNhcmUgb2YsCiAgICAgKiBvdGhlciBzdHVmZiB6ZXJvJ2QgLSBKZWFuIElJICovCiAgICBzcGluX2xvY2tfaW5pdCgmcHJpdi0+c3BpbmxvY2spOwoKICAgIC8qIE5ldHdhdmUgc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZSAqLwogICAgU0VUX01PRFVMRV9PV05FUihkZXYpOwogICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmbmV0d2F2ZV9zdGFydF94bWl0OwogICAgZGV2LT5nZXRfc3RhdHMgID0gJm5ldHdhdmVfZ2V0X3N0YXRzOwogICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OwogICAgLyogd2lyZWxlc3MgZXh0ZW5zaW9ucyAqLwojaWZkZWYgV0lSRUxFU1NfRVhUCiAgICBkZXYtPmdldF93aXJlbGVzc19zdGF0cyA9ICZuZXR3YXZlX2dldF93aXJlbGVzc19zdGF0czsKI2lmIFdJUkVMRVNTX0VYVCA+IDEyCiAgICBkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZuZXR3YXZlX2hhbmRsZXJfZGVmOwojZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTIgKi8KI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCAqLwogICAgZGV2LT5kb19pb2N0bCA9ICZuZXR3YXZlX2lvY3RsOwoKICAgIGRldi0+dHhfdGltZW91dCA9ICZuZXR3YXZlX3dhdGNoZG9nOwogICAgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CgogICAgZGV2LT5vcGVuID0gJm5ldHdhdmVfb3BlbjsKICAgIGRldi0+c3RvcCA9ICZuZXR3YXZlX2Nsb3NlOwogICAgbGluay0+aXJxLkluc3RhbmNlID0gZGV2OwogICAgCiAgICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgIGRldl9saXN0ID0gbGluazsKICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CiAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CiAgICBpZiAocmV0ICE9IDApIHsKCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CgluZXR3YXZlX2RldGFjaChsaW5rKTsKCXJldHVybiBOVUxMOwogICAgfQoKICAgIHJldHVybiBsaW5rOwp9IC8qIG5ldHdhdmVfYXR0YWNoICovCgovKgogKiBGdW5jdGlvbiBuZXR3YXZlX2RldGFjaCAobGluaykKICoKICogICAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKICogICAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCiAqICAgIHN0cnVjdHVyZXMgYXJlIGZyZWVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkCiAqICAgIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KICovCnN0YXRpYyB2b2lkIG5ldHdhdmVfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCnsKICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OwogICAgZGV2X2xpbmtfdCAqKmxpbmtwOwoKICAgIERFQlVHKDAsICJuZXR3YXZlX2RldGFjaCgweCVwKVxuIiwgbGluayk7CiAgCiAgICAvKgoJICBJZiB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBjb25maWd1cmVkIGFuZCBhY3RpdmUsIHdlIHdvbid0CgkgIGFjdHVhbGx5IGRlbGV0ZSBpdCB5ZXQuICBJbnN0ZWFkLCBpdCBpcyBtYXJrZWQgc28gdGhhdCB3aGVuCgkgIHRoZSByZWxlYXNlKCkgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGF0IHdpbGwgdHJpZ2dlciBhIHByb3BlcgoJICBkZXRhY2goKS4KCSovCiAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQoJbmV0d2F2ZV9yZWxlYXNlKGxpbmspOwoJCiAgICAvKiBCcmVhayB0aGUgbGluayB3aXRoIENhcmQgU2VydmljZXMgKi8KICAgIGlmIChsaW5rLT5oYW5kbGUpCglwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKICAgIAogICAgLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KICAgIGZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCglpZiAoKmxpbmtwID09IGxpbmspIGJyZWFrOwogICAgaWYgKCpsaW5rcCA9PSBOVUxMKQogICAgICB7CglERUJVRygxLCAibmV0d2F2ZV9jczogZGV0YWNoIGZhaWwsICclcycgbm90IGluIGxpc3RcbiIsCgkgICAgICBsaW5rLT5kZXYtPmRldl9uYW1lKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIHBpZWNlcyAqLwogICAgKmxpbmtwID0gbGluay0+bmV4dDsKICAgIGlmIChsaW5rLT5kZXYpIAoJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKICAgIGZyZWVfbmV0ZGV2KGRldik7CiAgICAKfSAvKiBuZXR3YXZlX2RldGFjaCAqLwoKLyoKICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBwcm90b2NvbCBuYW1lCiAqLwpzdGF0aWMgaW50IG5ldHdhdmVfZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCgkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAoJCQkgICAgY2hhciAqZXh0cmEpCnsKCXN0cmNweSh3cnF1LT5uYW1lLCAiTmV0d2F2ZSIpOwoJcmV0dXJuIDA7Cn0KCi8qCiAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgTmV0d29yayBJRAogKi8Kc3RhdGljIGludCBuZXR3YXZlX3NldF9ud2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCgkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAoJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKCQkJICAgIGNoYXIgKmV4dHJhKQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJa2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKCW5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Cgl1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CgoJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICYgc2F2ZSBmbGFncyAqLwoJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CgojaWYgV0lSRUxFU1NfRVhUID4gOAoJaWYoIXdycXUtPm53aWQuZGlzYWJsZWQpIHsKCSAgICBkb21haW4gPSB3cnF1LT5ud2lkLnZhbHVlOwojZWxzZQkvKiBXSVJFTEVTU19FWFQgPiA4ICovCglpZih3cnF1LT5ud2lkLm9uKSB7CgkgICAgZG9tYWluID0gd3JxdS0+bndpZC5ud2lkOwojZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gOCAqLwoJICAgIHByaW50ayggS0VSTl9ERUJVRyAiU2V0dGluZyBkb21haW4gdG8gMHgleCUwMnhcbiIsIAoJCSAgICAoZG9tYWluID4+IDgpICYgMHgwMSwgZG9tYWluICYgMHhmZik7CgkgICAgd2FpdF9XT0MoaW9iYXNlKTsKCSAgICB3cml0ZWIoTkVUV0FWRV9DTURfU01ELCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CgkgICAgd3JpdGViKCBkb21haW4gJiAweGZmLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CgkgICAgd3JpdGViKChkb21haW4gPj44ICkgJiAweDAxLHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IrMik7CgkgICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDMpOwoJfQoKCS8qIFJlRW5hYmxlIGludGVycnVwdHMgJiByZXN0b3JlIGZsYWdzICovCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOwogICAgCglyZXR1cm4gMDsKfQoKLyoKICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBOZXR3b3JrIElECiAqLwpzdGF0aWMgaW50IG5ldHdhdmVfZ2V0X253aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCgkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAoJCQkgICAgY2hhciAqZXh0cmEpCnsKI2lmIFdJUkVMRVNTX0VYVCA+IDgKCXdycXUtPm53aWQudmFsdWUgPSBkb21haW47Cgl3cnF1LT5ud2lkLmRpc2FibGVkID0gMDsKCXdycXUtPm53aWQuZml4ZWQgPSAxOwojZWxzZQkvKiBXSVJFTEVTU19FWFQgPiA4ICovCgl3cnF1LT5ud2lkLm53aWQgPSBkb21haW47Cgl3cnF1LT5ud2lkLm9uID0gMTsKI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCA+IDggKi8KCglyZXR1cm4gMDsKfQoKLyoKICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBzY3JhbWJsZSBrZXkKICovCnN0YXRpYyBpbnQgbmV0d2F2ZV9zZXRfc2NyYW1ibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCgkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAoJCQkJY2hhciAqa2V5KQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJa2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKCW5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Cgl1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CgoJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICYgc2F2ZSBmbGFncyAqLwoJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CgoJc2NyYW1ibGVfa2V5ID0gKGtleVswXSA8PCA4KSB8IGtleVsxXTsKCXdhaXRfV09DKGlvYmFzZSk7Cgl3cml0ZWIoTkVUV0FWRV9DTURfU1NLLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7Cgl3cml0ZWIoc2NyYW1ibGVfa2V5ICYgMHhmZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOwoJd3JpdGViKChzY3JhbWJsZV9rZXk+PjgpICYgMHhmZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDIpOwoJd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDMpOwoKCS8qIFJlRW5hYmxlIGludGVycnVwdHMgJiByZXN0b3JlIGZsYWdzICovCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOwogICAgCglyZXR1cm4gMDsKfQoKLyoKICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBzY3JhbWJsZSBrZXkKICovCnN0YXRpYyBpbnQgbmV0d2F2ZV9nZXRfc2NyYW1ibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCgkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAoJCQkJY2hhciAqa2V5KQp7CglrZXlbMV0gPSBzY3JhbWJsZV9rZXkgJiAweGZmOwoJa2V5WzBdID0gKHNjcmFtYmxlX2tleT4+OCkgJiAweGZmOwojaWYgV0lSRUxFU1NfRVhUID4gOAoJd3JxdS0+ZW5jb2RpbmcuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRDsKCXdycXUtPmVuY29kaW5nLmxlbmd0aCA9IDI7CiNlbHNlIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KCXdycXUtPmVuY29kaW5nLm1ldGhvZCA9IDE7CiNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiA4ICovCgoJcmV0dXJuIDA7Cn0KCiNpZiBXSVJFTEVTU19FWFQgPiA4Ci8qCiAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgbW9kZQogKi8Kc3RhdGljIGludCBuZXR3YXZlX2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCgkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAoJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKCQkJICAgIGNoYXIgKmV4dHJhKQp7CglpZihkb21haW4gJiAweDEwMCkKCQl3cnF1LT5tb2RlID0gSVdfTU9ERV9JTkZSQTsKCWVsc2UKCQl3cnF1LT5tb2RlID0gSVdfTU9ERV9BREhPQzsKCglyZXR1cm4gMDsKfQojZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gOCAqLwoKLyoKICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCByYW5nZSBpbmZvCiAqLwpzdGF0aWMgaW50IG5ldHdhdmVfZ2V0X3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCgkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAoJCQkgICAgIGNoYXIgKmV4dHJhKQp7CglzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKCWludCByZXQgPSAwOwoKCS8qIFNldCB0aGUgbGVuZ3RoICh2ZXJ5IGltcG9ydGFudCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkgKi8KCXdycXUtPmRhdGEubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CgoJLyogU2V0IGFsbCB0aGUgaW5mbyB3ZSBkb24ndCBjYXJlIG9yIGRvbid0IGtub3cgYWJvdXQgdG8gemVybyAqLwoJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CgojaWYgV0lSRUxFU1NfRVhUID4gMTAKCS8qIFNldCB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9uIHZlcnNpb25zICovCglyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDk7CS8qIE5vdGhpbmcgZm9yIHVzIGluIHYxMCBhbmQgdjExICovCiNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMCAqLwoJCSAgIAoJLyogU2V0IGluZm9ybWF0aW9uIGluIHRoZSByYW5nZSBzdHJ1Y3QgKi8KCXJhbmdlLT50aHJvdWdocHV0ID0gNDUwICogMTAwMDsJLyogZG9uJ3QgYXJndWUgb24gdGhpcyAhICovCglyYW5nZS0+bWluX253aWQgPSAweDAwMDA7CglyYW5nZS0+bWF4X253aWQgPSAweDAxRkY7CgoJcmFuZ2UtPm51bV9jaGFubmVscyA9IHJhbmdlLT5udW1fZnJlcXVlbmN5ID0gMDsKCQkgICAKCXJhbmdlLT5zZW5zaXRpdml0eSA9IDB4M0Y7CglyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDI1NTsKCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDI1NTsKCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDA7CgkJICAgCiNpZiBXSVJFTEVTU19FWFQgPiA3CglyYW5nZS0+bnVtX2JpdHJhdGVzID0gMTsKCXJhbmdlLT5iaXRyYXRlWzBdID0gMTAwMDAwMDsJLyogMSBNYi9zICovCiNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA3ICovCgojaWYgV0lSRUxFU1NfRVhUID4gOAoJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSAyOwkJLyogMTYgYml0cyBzY3JhbWJsaW5nICovCglyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMTsKCXJhbmdlLT5tYXhfZW5jb2RpbmdfdG9rZW5zID0gMTsJLyogT25seSBvbmUga2V5IHBvc3NpYmxlICovCiNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCgoJcmV0dXJuIHJldDsKfQoKLyoKICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogZ2V0IHNuYXBzaG90CiAqLwpzdGF0aWMgaW50IG5ldHdhdmVfZ2V0X3NuYXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCgkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAoJCQkgICAgY2hhciAqZXh0cmEpCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOwoJbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKCXVfY2hhciBfX2lvbWVtICpyYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKCgkvKiBEaXNhYmxlIGludGVycnVwdHMgJiBzYXZlIGZsYWdzICovCglzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKCgkvKiBUYWtlIHNuYXBzaG90IG9mIGVudmlyb25tZW50ICovCgluZXR3YXZlX3NuYXBzaG90KCBwcml2LCByYW1CYXNlLCBpb2Jhc2UpOwoJd3JxdS0+ZGF0YS5sZW5ndGggPSBwcml2LT5uc3MubGVuZ3RoOwoJbWVtY3B5KGV4dHJhLCAodV9jaGFyICopICZwcml2LT5uc3MsIHNpemVvZiggc3RydWN0IHNpdGVfc3VydmV5KSk7CgoJcHJpdi0+bGFzdEV4ZWMgPSBqaWZmaWVzOwoKCS8qIFJlRW5hYmxlIGludGVycnVwdHMgJiByZXN0b3JlIGZsYWdzICovCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOwogICAgCglyZXR1cm4oMCk7Cn0KCi8qCiAqIFN0cnVjdHVyZXMgdG8gZXhwb3J0IHRoZSBXaXJlbGVzcyBIYW5kbGVycwogKiAgICAgVGhpcyBpcyB0aGUgc3R1ZmYgdGhhdCBhcmUgdHJlYXRlZCB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucyAoaXdjb25maWcpCiAqLwoKc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3MgbmV0d2F2ZV9wcml2YXRlX2FyZ3NbXSA9IHsKLyp7IGNtZCwgICAgICAgICBzZXRfYXJncywgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FyZ3MsIG5hbWUgfSAqLwogIHsgU0lPQ0dJUFNOQVAsIDAsIAogICAgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCBzaXplb2Yoc3RydWN0IHNpdGVfc3VydmV5KSwgCiAgICAiZ2V0c2l0ZXN1cnZleSIgfSwKfTsKCiNpZiBXSVJFTEVTU19FWFQgPiAxMgoKc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJCW5ldHdhdmVfaGFuZGxlcltdID0KewoJTlVMTCwJCQkJLyogU0lPQ1NJV05BTUUgKi8KCW5ldHdhdmVfZ2V0X25hbWUsCQkvKiBTSU9DR0lXTkFNRSAqLwoJbmV0d2F2ZV9zZXRfbndpZCwJCS8qIFNJT0NTSVdOV0lEICovCgluZXR3YXZlX2dldF9ud2lkLAkJLyogU0lPQ0dJV05XSUQgKi8KCU5VTEwsCQkJCS8qIFNJT0NTSVdGUkVRICovCglOVUxMLAkJCQkvKiBTSU9DR0lXRlJFUSAqLwoJTlVMTCwJCQkJLyogU0lPQ1NJV01PREUgKi8KCW5ldHdhdmVfZ2V0X21vZGUsCQkvKiBTSU9DR0lXTU9ERSAqLwoJTlVMTCwJCQkJLyogU0lPQ1NJV1NFTlMgKi8KCU5VTEwsCQkJCS8qIFNJT0NHSVdTRU5TICovCglOVUxMLAkJCQkvKiBTSU9DU0lXUkFOR0UgKi8KCW5ldHdhdmVfZ2V0X3JhbmdlLAkJLyogU0lPQ0dJV1JBTkdFICovCglOVUxMLAkJCQkvKiBTSU9DU0lXUFJJViAqLwoJTlVMTCwJCQkJLyogU0lPQ0dJV1BSSVYgKi8KCU5VTEwsCQkJCS8qIFNJT0NTSVdTVEFUUyAqLwoJTlVMTCwJCQkJLyogU0lPQ0dJV1NUQVRTICovCglOVUxMLAkJCQkvKiBTSU9DU0lXU1BZICovCglOVUxMLAkJCQkvKiBTSU9DR0lXU1BZICovCglOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCglOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCglOVUxMLAkJCQkvKiBTSU9DU0lXQVAgKi8KCU5VTEwsCQkJCS8qIFNJT0NHSVdBUCAqLwoJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLwoJTlVMTCwJCQkJLyogU0lPQ0dJV0FQTElTVCAqLwoJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLwoJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLwoJTlVMTCwJCQkJLyogU0lPQ1NJV0VTU0lEICovCglOVUxMLAkJCQkvKiBTSU9DR0lXRVNTSUQgKi8KCU5VTEwsCQkJCS8qIFNJT0NTSVdOSUNLTiAqLwoJTlVMTCwJCQkJLyogU0lPQ0dJV05JQ0tOICovCglOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCglOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCglOVUxMLAkJCQkvKiBTSU9DU0lXUkFURSAqLwoJTlVMTCwJCQkJLyogU0lPQ0dJV1JBVEUgKi8KCU5VTEwsCQkJCS8qIFNJT0NTSVdSVFMgKi8KCU5VTEwsCQkJCS8qIFNJT0NHSVdSVFMgKi8KCU5VTEwsCQkJCS8qIFNJT0NTSVdGUkFHICovCglOVUxMLAkJCQkvKiBTSU9DR0lXRlJBRyAqLwoJTlVMTCwJCQkJLyogU0lPQ1NJV1RYUE9XICovCglOVUxMLAkJCQkvKiBTSU9DR0lXVFhQT1cgKi8KCU5VTEwsCQkJCS8qIFNJT0NTSVdSRVRSWSAqLwoJTlVMTCwJCQkJLyogU0lPQ0dJV1JFVFJZICovCgluZXR3YXZlX3NldF9zY3JhbWJsZSwJCS8qIFNJT0NTSVdFTkNPREUgKi8KCW5ldHdhdmVfZ2V0X3NjcmFtYmxlLAkJLyogU0lPQ0dJV0VOQ09ERSAqLwp9OwoKc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJCW5ldHdhdmVfcHJpdmF0ZV9oYW5kbGVyW10gPQp7CglOVUxMLAkJCQkvKiBTSU9DSVdGSVJTVFBSSVYgKi8KCW5ldHdhdmVfZ2V0X3NuYXAsCQkvKiBTSU9DSVdGSVJTVFBSSVYgKyAxICovCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmCW5ldHdhdmVfaGFuZGxlcl9kZWYgPQp7CgkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKG5ldHdhdmVfaGFuZGxlcikvc2l6ZW9mKGl3X2hhbmRsZXIpLAoJLm51bV9wcml2YXRlCT0gc2l6ZW9mKG5ldHdhdmVfcHJpdmF0ZV9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCgkubnVtX3ByaXZhdGVfYXJncyA9IHNpemVvZihuZXR3YXZlX3ByaXZhdGVfYXJncykvc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLAoJLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKikgbmV0d2F2ZV9oYW5kbGVyLAoJLnByaXZhdGUJPSAoaXdfaGFuZGxlciAqKSBuZXR3YXZlX3ByaXZhdGVfaGFuZGxlciwKCS5wcml2YXRlX2FyZ3MJPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBuZXR3YXZlX3ByaXZhdGVfYXJncywKfTsKI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEyICovCgovKgogKiBGdW5jdGlvbiBuZXR3YXZlX2lvY3RsIChkZXYsIHJxLCBjbWQpCiAqCiAqICAgICBQZXJmb3JtIGlvY3RsIDogY29uZmlnICYgaW5mbyBzdHVmZgogKiAgICAgVGhpcyBpcyB0aGUgc3R1ZmYgdGhhdCBhcmUgdHJlYXRlZCB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucyAoaXdjb25maWcpCiAqCiAqLwpzdGF0aWMgaW50IG5ldHdhdmVfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgLyogaW9jdGwgZGV2aWNlICovCgkJCSBzdHJ1Y3QgaWZyZXEgKnJxLAkgLyogRGF0YSBwYXNzZWQgKi8KCQkJIGludAljbWQpCSAgICAgLyogSW9jdGwgbnVtYmVyICovCnsKICAgIGludAkJCXJldCA9IDA7CiNpZmRlZiBXSVJFTEVTU19FWFQKI2lmIFdJUkVMRVNTX0VYVCA8PSAxMgogICAgc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOwojZW5kaWYKI2VuZGlmCgkKICAgIERFQlVHKDAsICIlczogLT5uZXR3YXZlX2lvY3RsKGNtZD0weCVYKVxuIiwgZGV2LT5uYW1lLCBjbWQpOwoJCiAgICAvKiBMb29rIHdoYXQgaXMgdGhlIHJlcXVlc3QgKi8KICAgIHN3aXRjaChjbWQpIHsKCS8qIC0tLS0tLS0tLS0tLS0tLSBXSVJFTEVTUyBFWFRFTlNJT05TIC0tLS0tLS0tLS0tLS0tLSAqLwojaWZkZWYgV0lSRUxFU1NfRVhUCiNpZiBXSVJFTEVTU19FWFQgPD0gMTIKICAgIGNhc2UgU0lPQ0dJV05BTUU6CgluZXR3YXZlX2dldF9uYW1lKGRldiwgTlVMTCwgJih3cnEtPnUpLCBOVUxMKTsKCWJyZWFrOwogICAgY2FzZSBTSU9DU0lXTldJRDoKCXJldCA9IG5ldHdhdmVfc2V0X253aWQoZGV2LCBOVUxMLCAmKHdycS0+dSksIE5VTEwpOwoJYnJlYWs7CiAgICBjYXNlIFNJT0NHSVdOV0lEOgoJcmV0ID0gbmV0d2F2ZV9nZXRfbndpZChkZXYsIE5VTEwsICYod3JxLT51KSwgTlVMTCk7CglicmVhazsKI2lmIFdJUkVMRVNTX0VYVCA+IDgJLyogTm90ZSA6IFRoZSBBUEkgZGlkIGNoYW5nZS4uLiAqLwogICAgY2FzZSBTSU9DR0lXRU5DT0RFOgoJLyogR2V0IHNjcmFtYmxlIGtleSAqLwoJaWYod3JxLT51LmVuY29kaW5nLnBvaW50ZXIgIT0gKGNhZGRyX3QpIDApCgkgIHsKCSAgICBjaGFyCWtleVsyXTsKCSAgICByZXQgPSBuZXR3YXZlX2dldF9zY3JhbWJsZShkZXYsIE5VTEwsICYod3JxLT51KSwga2V5KTsKCSAgICBpZihjb3B5X3RvX3VzZXIod3JxLT51LmVuY29kaW5nLnBvaW50ZXIsIGtleSwgMikpCgkgICAgICByZXQgPSAtRUZBVUxUOwoJICB9CglicmVhazsKICAgIGNhc2UgU0lPQ1NJV0VOQ09ERToKCS8qIFNldCAgc2NyYW1ibGUga2V5ICovCglpZih3cnEtPnUuZW5jb2RpbmcucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkKCSAgewoJICAgIGNoYXIJa2V5WzJdOwoJICAgIGlmKGNvcHlfZnJvbV91c2VyKGtleSwgd3JxLT51LmVuY29kaW5nLnBvaW50ZXIsIDIpKQoJICAgICAgewoJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CgkgICAgICB9CgkgICAgcmV0ID0gbmV0d2F2ZV9zZXRfc2NyYW1ibGUoZGV2LCBOVUxMLCAmKHdycS0+dSksIGtleSk7CgkgIH0KCWJyZWFrOwogICAgY2FzZSBTSU9DR0lXTU9ERToKCS8qIE1vZGUgb2Ygb3BlcmF0aW9uICovCglyZXQgPSBuZXR3YXZlX2dldF9tb2RlKGRldiwgTlVMTCwgJih3cnEtPnUpLCBOVUxMKTsKCWJyZWFrOwojZWxzZSAvKiBXSVJFTEVTU19FWFQgPiA4ICovCiAgICBjYXNlIFNJT0NHSVdFTkNPREU6CgkvKiBHZXQgc2NyYW1ibGUga2V5ICovCglyZXQgPSBuZXR3YXZlX2dldF9zY3JhbWJsZShkZXYsIE5VTEwsICYod3JxLT51KSwKCQkJCSAgIChjaGFyICopICZ3cnEtPnUuZW5jb2RpbmcuY29kZSk7CglicmVhazsKICAgIGNhc2UgU0lPQ1NJV0VOQ09ERToKCS8qIFNldCAgc2NyYW1ibGUga2V5ICovCglyZXQgPSBuZXR3YXZlX3NldF9zY3JhbWJsZShkZXYsIE5VTEwsICYod3JxLT51KSwKCQkJCSAgIChjaGFyICopICZ3cnEtPnUuZW5jb2RpbmcuY29kZSk7CglicmVhazsKI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KICAgY2FzZSBTSU9DR0lXUkFOR0U6CiAgICAgICAvKiBCYXNpYyBjaGVja2luZy4uLiAqLwogICAgICAgaWYod3JxLT51LmRhdGEucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkgewogICAgICAgICAgIHN0cnVjdCBpd19yYW5nZSByYW5nZTsKCSAgIHJldCA9IG5ldHdhdmVfZ2V0X3JhbmdlKGRldiwgTlVMTCwgJih3cnEtPnUpLCAoY2hhciAqKSAmcmFuZ2UpOwoJICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcmFuZ2UsCgkJCSAgICBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSkpCgkgICAgICAgcmV0ID0gLUVGQVVMVDsKICAgICAgIH0KICAgICAgIGJyZWFrOwogICAgY2FzZSBTSU9DR0lXUFJJVjoKCS8qIEJhc2ljIGNoZWNraW5nLi4uICovCglpZih3cnEtPnUuZGF0YS5wb2ludGVyICE9IChjYWRkcl90KSAwKSB7CgkgICAgLyogU2V0IHRoZSBudW1iZXIgb2YgaW9jdGwgYXZhaWxhYmxlICovCgkgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKG5ldHdhdmVfcHJpdmF0ZV9hcmdzKSAvIHNpemVvZihuZXR3YXZlX3ByaXZhdGVfYXJnc1swXSk7CgkJCQoJICAgIC8qIENvcHkgc3RydWN0dXJlIHRvIHRoZSB1c2VyIGJ1ZmZlciAqLwoJICAgIGlmKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAoJCQkgICAgKHVfY2hhciAqKSBuZXR3YXZlX3ByaXZhdGVfYXJncywKCQkJICAgIHNpemVvZihuZXR3YXZlX3ByaXZhdGVfYXJncykpKQoJICAgICAgcmV0ID0gLUVGQVVMVDsKCX0gCglicmVhazsKICAgIGNhc2UgU0lPQ0dJUFNOQVA6CglpZih3cnEtPnUuZGF0YS5wb2ludGVyICE9IChjYWRkcl90KSAwKSB7CgkgICAgY2hhciBidWZmZXJbc2l6ZW9mKCBzdHJ1Y3Qgc2l0ZV9zdXJ2ZXkpXTsKCSAgICByZXQgPSBuZXR3YXZlX2dldF9zbmFwKGRldiwgTlVMTCwgJih3cnEtPnUpLCBidWZmZXIpOwoJICAgIC8qIENvcHkgc3RydWN0dXJlIHRvIHRoZSB1c2VyIGJ1ZmZlciAqLwoJICAgIGlmKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAKCQkJICAgIGJ1ZmZlciwKCQkJICAgIHNpemVvZiggc3RydWN0IHNpdGVfc3VydmV5KSkpCgkgICAgICB7CgkJcHJpbnRrKEtFUk5fREVCVUcgIkJhZCBidWZmZXIhXG4iKTsKCQlicmVhazsKCSAgICAgIH0KCX0KCWJyZWFrOwojZW5kaWYgLyogV0lSRUxFU1NfRVhUIDw9IDEyICovCiNlbmRpZiAvKiBXSVJFTEVTU19FWFQgKi8KICAgIGRlZmF1bHQ6CglyZXQgPSAtRU9QTk9UU1VQUDsKICAgIH0KCQogICAgcmV0dXJuIHJldDsKfQoKLyoKICogRnVuY3Rpb24gbmV0d2F2ZV9wY21jaWFfY29uZmlnIChsaW5rKQogKgogKiAgICAgbmV0d2F2ZV9wY21jaWFfY29uZmlnKCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIAogKiAgICAgZXZlbnQgaXMgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlCiAqICAgICBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uIAogKgogKi8KCiNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXApkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQoKc3RhdGljIHZvaWQgbmV0d2F2ZV9wY21jaWFfY29uZmlnKGRldl9saW5rX3QgKmxpbmspIHsKICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CiAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAgICB0dXBsZV90IHR1cGxlOwogICAgY2lzcGFyc2VfdCBwYXJzZTsKICAgIGludCBpLCBqLCBsYXN0X3JldCwgbGFzdF9mbjsKICAgIHVfY2hhciBidWZbNjRdOwogICAgd2luX3JlcV90IHJlcTsKICAgIG1lbXJlcV90IG1lbTsKICAgIHVfY2hhciBfX2lvbWVtICpyYW1CYXNlID0gTlVMTDsKCiAgICBERUJVRygwLCAibmV0d2F2ZV9wY21jaWFfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKCiAgICAvKgogICAgICBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KICAgICAgcmVnaXN0ZXJzLgogICAgKi8KICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOwogICAgdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKSBidWY7CiAgICB0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CiAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CiAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOwogICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwogICAgbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOwoKICAgIC8qIENvbmZpZ3VyZSBjYXJkICovCiAgICBsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOwoKICAgIC8qCiAgICAgKiAgVHJ5IGFsbG9jYXRpbmcgSU8gcG9ydHMuICBUaGlzIHRyaWVzIGEgZmV3IGZpeGVkIGFkZHJlc3Nlcy4KICAgICAqICBJZiB5b3Ugd2FudCwgeW91IGNhbiBhbHNvIHJlYWQgdGhlIGNhcmQncyBjb25maWcgdGFibGUgdG8KICAgICAqICBwaWNrIGFkZHJlc3NlcyAtLSBzZWUgdGhlIHNlcmlhbCBkcml2ZXIgZm9yIGFuIGV4YW1wbGUuCiAgICAgKi8KICAgIGZvciAoaSA9IGogPSAweDA7IGogPCAweDQwMDsgaiArPSAweDIwKSB7CglsaW5rLT5pby5CYXNlUG9ydDEgPSBqIF4gMHgzMDA7CglpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOwoJaWYgKGkgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7CiAgICB9CiAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSB7Cgljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlcXVlc3RJTywgaSk7Cglnb3RvIGZhaWxlZDsKICAgIH0KCiAgICAvKgogICAgICogIE5vdyBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90CiAgICAgKiAgYWN0dWFsbHkgYXNzaWduIGEgaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LgogICAgICovCiAgICBDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEoaGFuZGxlLCAmbGluay0+aXJxKSk7CgogICAgLyoKICAgICAqICBUaGlzIGFjdHVhbGx5IGNvbmZpZ3VyZXMgdGhlIFBDTUNJQSBzb2NrZXQgLS0gc2V0dGluZyB1cAogICAgICogIHRoZSBJL08gd2luZG93cyBhbmQgdGhlIGludGVycnVwdCBtYXBwaW5nLgogICAgICovCiAgICBDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihoYW5kbGUsICZsaW5rLT5jb25mKSk7CgogICAgLyoKICAgICAqICBBbGxvY2F0ZSBhIDMySyBtZW1vcnkgd2luZG93LiAgTm90ZSB0aGF0IHRoZSBkZXZfbGlua190CiAgICAgKiAgc3RydWN0dXJlIHByb3ZpZGVzIHNwYWNlIGZvciBvbmUgd2luZG93IGhhbmRsZSAtLSBpZiB5b3VyCiAgICAgKiAgZGV2aWNlIG5lZWRzIHNldmVyYWwgd2luZG93cywgeW91J2xsIG5lZWQgdG8ga2VlcCB0cmFjayBvZgogICAgICogIHRoZSBoYW5kbGVzIGluIHlvdXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSwgZGV2LT5wcml2LgogICAgICovCiAgICBERUJVRygxLCAiU2V0dGluZyBtZW0gc3BlZWQgb2YgJWRcbiIsIG1lbV9zcGVlZCk7CgogICAgcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF84fFdJTl9NRU1PUllfVFlQRV9DTXxXSU5fRU5BQkxFOwogICAgcmVxLkJhc2UgPSAwOyByZXEuU2l6ZSA9IDB4ODAwMDsKICAgIHJlcS5BY2Nlc3NTcGVlZCA9IG1lbV9zcGVlZDsKICAgIENTX0NIRUNLKFJlcXVlc3RXaW5kb3csIHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluay0+aGFuZGxlLCAmcmVxLCAmbGluay0+d2luKSk7CiAgICBtZW0uQ2FyZE9mZnNldCA9IDB4MjAwMDA7IG1lbS5QYWdlID0gMDsgCiAgICBDU19DSEVDSyhNYXBNZW1QYWdlLCBwY21jaWFfbWFwX21lbV9wYWdlKGxpbmstPndpbiwgJm1lbSkpOwoKICAgIC8qIFN0b3JlIGJhc2UgYWRkcmVzcyBvZiB0aGUgY29tbW9uIHdpbmRvdyBmcmFtZSAqLwogICAgcmFtQmFzZSA9IGlvcmVtYXAocmVxLkJhc2UsIDB4ODAwMCk7CiAgICBwcml2LT5yYW1CYXNlID0gcmFtQmFzZTsKCiAgICBkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKICAgIGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOwogICAgU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihoYW5kbGUpKTsKCiAgICBpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgewoJcHJpbnRrKEtFUk5fREVCVUcgIm5ldHdhdmVfY3M6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7Cglnb3RvIGZhaWxlZDsKICAgIH0KCiAgICBzdHJjcHkocHJpdi0+bm9kZS5kZXZfbmFtZSwgZGV2LT5uYW1lKTsKICAgIGxpbmstPmRldiA9ICZwcml2LT5ub2RlOwogICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKCiAgICAvKiBSZXNldCBjYXJkIGJlZm9yZSByZWFkaW5nIHBoeXNpY2FsIGFkZHJlc3MgKi8KICAgIG5ldHdhdmVfZG9yZXNldChkZXYtPmJhc2VfYWRkciwgcmFtQmFzZSk7CgogICAgLyogUmVhZCB0aGUgZXRoZXJuZXQgYWRkcmVzcyBhbmQgZmlsbCBpbiB0aGUgTmV0d2F2ZSByZWdpc3RlcnMuICovCiAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSAKCWRldi0+ZGV2X2FkZHJbaV0gPSByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1BBICsgaSk7CgogICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5ldHdhdmU6IHBvcnQgJSMzbHgsIGlycSAlZCwgbWVtICVseCBpZCAiCgkgICAiJWMlYywgaHdfYWRkciAiLCBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwKCSAgICh1X2xvbmcpIHJhbUJhc2UsIChpbnQpIHJlYWRiKHJhbUJhc2UrTkVUV0FWRV9FUkVHX05JKSwKCSAgIChpbnQpIHJlYWRiKHJhbUJhc2UrTkVUV0FWRV9FUkVHX05JKzEpKTsKICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCglwcmludGsoIiUwMlglcyIsIGRldi0+ZGV2X2FkZHJbaV0sICgoaTw1KSA/ICI6IiA6ICJcbiIpKTsKCiAgICAvKiBnZXQgcmV2aXNpb24gd29yZHMgKi8KICAgIHByaW50ayhLRVJOX0RFQlVHICJOZXR3YXZlX3Jlc2V0OiByZXZpc2lvbiAlMDR4ICUwNHhcbiIsIAoJICAgZ2V0X3VpbnQxNihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX0FSVyksCgkgICBnZXRfdWludDE2KHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQVJXKzIpKTsKICAgIHJldHVybjsKCmNzX2ZhaWxlZDoKICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOwpmYWlsZWQ6CiAgICBuZXR3YXZlX3JlbGVhc2UobGluayk7Cn0gLyogbmV0d2F2ZV9wY21jaWFfY29uZmlnICovCgovKgogKiBGdW5jdGlvbiBuZXR3YXZlX3JlbGVhc2UgKGFyZykKICoKICogICAgQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIG5ldHdhdmVfcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUgbmV0CiAqICAgIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcwogKiAgICBzdGlsbCBvcGVuLCB0aGlzIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0IGlzIGNsb3NlZC4KICovCnN0YXRpYyB2b2lkIG5ldHdhdmVfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQp7CiAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CgogICAgREVCVUcoMCwgIm5ldHdhdmVfcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CgogICAgLyogRG9uJ3QgYm90aGVyIGNoZWNraW5nIHRvIHNlZSBpZiB0aGVzZSBzdWNjZWVkIG9yIG5vdCAqLwogICAgaWYgKGxpbmstPndpbikgewoJaW91bm1hcChwcml2LT5yYW1CYXNlKTsKCXBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOwogICAgfQogICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOwogICAgcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOwogICAgcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CgogICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7Cn0KCi8qCiAqIEZ1bmN0aW9uIG5ldHdhdmVfZXZlbnQgKGV2ZW50LCBwcmlvcml0eSwgYXJncykKICoKICogICAgVGhlIGNhcmQgc3RhdHVzIGV2ZW50IGhhbmRsZXIuICBNb3N0bHksIHRoaXMgc2NoZWR1bGVzIG90aGVyCiAqICAgIHN0dWZmIHRvIHJ1biBhZnRlciBhbiBldmVudCBpcyByZWNlaXZlZC4gIEEgQ0FSRF9SRU1PVkFMIGV2ZW50CiAqICAgIGFsc28gc2V0cyBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nCiAqICAgIHRvIHRhbGsgdG8gdGhlIGNhcmQgYW55IG1vcmUuCiAqCiAqICAgIFdoZW4gYSBDQVJEX1JFTU9WQUwgZXZlbnQgaXMgcmVjZWl2ZWQsIHdlIGltbWVkaWF0ZWx5IHNldCBhIGZsYWcKICogICAgdG8gYmxvY2sgZnV0dXJlIGFjY2Vzc2VzIHRvIHRoaXMgZGV2aWNlLiAgQWxsIHRoZSBmdW5jdGlvbnMgdGhhdAogKiAgICBhY3R1YWxseSBhY2Nlc3MgdGhlIGRldmljZSBzaG91bGQgY2hlY2sgdGhpcyBmbGFnIHRvIG1ha2Ugc3VyZQogKiAgICB0aGUgY2FyZCBpcyBzdGlsbCBwcmVzZW50LgogKgogKi8Kc3RhdGljIGludCBuZXR3YXZlX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKCQkJIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKewogICAgZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOwogICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CgkKICAgIERFQlVHKDEsICJuZXR3YXZlX2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKICAKICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgIGNhc2UgQ1NfRVZFTlRfUkVHSVNUUkFUSU9OX0NPTVBMRVRFOgoJREVCVUcoMCwgIm5ldHdhdmVfY3M6IHJlZ2lzdHJhdGlvbiBjb21wbGV0ZVxuIik7CglicmVhazsKCiAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKCSAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CgkgICAgbmV0d2F2ZV9yZWxlYXNlKGxpbmspOwoJfQoJYnJlYWs7CiAgICBjYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgoJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CgluZXR3YXZlX3BjbWNpYV9jb25maWcoIGxpbmspOwoJYnJlYWs7CiAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CglsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKCS8qIEZhbGwgdGhyb3VnaC4uLiAqLwogICAgY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKCSAgICBpZiAobGluay0+b3BlbikKCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CgkgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOwoJfQoJYnJlYWs7CiAgICBjYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKCS8qIEZhbGwgdGhyb3VnaC4uLiAqLwogICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgoJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgewoJICAgIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CgkgICAgaWYgKGxpbmstPm9wZW4pIHsKCQluZXR3YXZlX3Jlc2V0KGRldik7CgkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOwoJICAgIH0KCX0KCWJyZWFrOwogICAgfQogICAgcmV0dXJuIDA7Cn0gLyogbmV0d2F2ZV9ldmVudCAqLwoKLyoKICogRnVuY3Rpb24gbmV0d2F2ZV9kb3Jlc2V0IChpb0Jhc2UsIHJhbUJhc2UpCiAqCiAqICAgIFByb3BlciBoYXJkd2FyZSByZXNldCBvZiB0aGUgY2FyZC4KICovCnN0YXRpYyB2b2lkIG5ldHdhdmVfZG9yZXNldChraW9fYWRkcl90IGlvQmFzZSwgdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UpCnsKICAgIC8qIFJlc2V0IGNhcmQgKi8KICAgIHdhaXRfV09DKGlvQmFzZSk7CiAgICBvdXRiKDB4ODAsIGlvQmFzZSArIE5FVFdBVkVfUkVHX1BNUik7CiAgICB3cml0ZWIoMHgwOCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19BU0NDKTsgLyogQml0IDMgaXMgV09DICovCiAgICBvdXRiKDB4MCwgaW9CYXNlICsgTkVUV0FWRV9SRUdfUE1SKTsgLyogcmVsZWFzZSByZXNldCAqLwp9CgovKgogKiBGdW5jdGlvbiBuZXR3YXZlX3Jlc2V0IChkZXYpCiAqCiAqICAgIFJlc2V0IGFuZCByZXN0b3JlIGFsbCBvZiB0aGUgbmV0d2F2ZSByZWdpc3RlcnMgCiAqLwpzdGF0aWMgdm9pZCBuZXR3YXZlX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKICAgIC8qIHVfY2hhciBzdGF0ZTsgKi8KICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAgICB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CiAgICBraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOwoKICAgIERFQlVHKDAsICJuZXR3YXZlX3Jlc2V0OiBEb25lIHdpdGggaGFyZHdhcmUgcmVzZXRcbiIpOwoKICAgIHByaXYtPnRpbWVvdXRDb3VudGVyID0gMDsKCiAgICAvKiBSZXNldCBjYXJkICovCiAgICBuZXR3YXZlX2RvcmVzZXQoaW9iYXNlLCByYW1CYXNlKTsKICAgIHByaW50ayhLRVJOX0RFQlVHICJuZXR3YXZlX3Jlc2V0OiBEb25lIHdpdGggaGFyZHdhcmUgcmVzZXRcbiIpOwoJCiAgICAvKiBXcml0ZSBhIE5PUCB0byBjaGVjayB0aGUgY2FyZCAqLwogICAgd2FpdF9XT0MoaW9iYXNlKTsKICAgIHdyaXRlYihORVRXQVZFX0NNRF9OT1AsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKCQogICAgLyogU2V0IHJlY2VpdmUgY29uZiAqLwogICAgd2FpdF9XT0MoaW9iYXNlKTsKICAgIHdyaXRlYihORVRXQVZFX0NNRF9TUkMsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKICAgIHdyaXRlYihyeENvbmZSeEVuYSArIHJ4Q29uZkJjYXN0LCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CiAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMik7CiAgICAKICAgIC8qIFNldCB0cmFuc21pdCBjb25mICovCiAgICB3YWl0X1dPQyhpb2Jhc2UpOwogICAgd3JpdGViKE5FVFdBVkVfQ01EX1NUQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOwogICAgd3JpdGViKHR4Q29uZlR4RW5hLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CiAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMik7CiAgICAKICAgIC8qIE5vdyBzZXQgdGhlIE1VIERvbWFpbiAqLwogICAgcHJpbnRrKEtFUk5fREVCVUcgIlNldHRpbmcgZG9tYWluIHRvIDB4JXglMDJ4XG4iLCAoZG9tYWluID4+IDgpICYgMHgwMSwgZG9tYWluICYgMHhmZik7CiAgICB3YWl0X1dPQyhpb2Jhc2UpOwogICAgd3JpdGViKE5FVFdBVkVfQ01EX1NNRCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOwogICAgd3JpdGViKGRvbWFpbiAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKICAgIHdyaXRlYigoZG9tYWluPj44KSAmIDB4MDEsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAzKTsKCQogICAgLyogU2V0IHNjcmFtYmxlIGtleSAqLwogICAgcHJpbnRrKEtFUk5fREVCVUcgIlNldHRpbmcgc2NyYW1ibGUga2V5IHRvIDB4JXhcbiIsIHNjcmFtYmxlX2tleSk7CiAgICB3YWl0X1dPQyhpb2Jhc2UpOwogICAgd3JpdGViKE5FVFdBVkVfQ01EX1NTSywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOwogICAgd3JpdGViKHNjcmFtYmxlX2tleSAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKICAgIHdyaXRlYigoc2NyYW1ibGVfa2V5Pj44KSAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAzKTsKCiAgICAvKiBFbmFibGUgaW50ZXJydXB0cywgYml0IDQgaGlnaCB0byBrZWVwIHVudXNlZAogICAgICogc291cmNlIGZyb20gaW50ZXJydXB0aW5nIHVzLCBiaXQgMiBoaWdoIHRvIAogICAgICogc2V0IGludGVycnVwdCBlbmFibGUsIDU2NyB0byBlbmFibGUgVHhETiwgCiAgICAgKiBSeEVyciBhbmQgUnhSZHkKICAgICAqLwogICAgd2FpdF9XT0MoaW9iYXNlKTsKICAgIG91dGIoaW1yQ29uZklFTkEraW1yQ29uZlJGVTEsIGlvYmFzZSArIE5FVFdBVkVfUkVHX0lNUik7CgogICAgLyogSGVudCA0IGJ5dGVzIGZyYSAweDE3MC4gU2thbCB2YWVyZSAwYSwyOSw4OCwzNgogICAgICogd2FpdFdPQwogICAgICogc2tyaXYgODAgdGlsIGQwMDA6MzY4OAogICAgICogc2pla2sgb20gZGV0IGJsZSA4MAogICAgICovCiAgICAKICAgIC8qIEVuYWJsZSBSZWNlaXZlciAqLwogICAgd2FpdF9XT0MoaW9iYXNlKTsKICAgIHdyaXRlYihORVRXQVZFX0NNRF9FUiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOwogICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOwoJCiAgICAvKiBTZXQgdGhlIElFTkEgYml0IGluIENPUiAqLwogICAgd2FpdF9XT0MoaW9iYXNlKTsKICAgIG91dGIoY29yQ29uZklFTkEgKyBjb3JDb25mTFZMUkVRLCBpb2Jhc2UgKyBORVRXQVZFX1JFR19DT1IpOwp9CgovKgogKiBGdW5jdGlvbiBuZXR3YXZlX2h3X3htaXQgKGRhdGEsIGxlbiwgZGV2KSAgICAKICovCnN0YXRpYyBpbnQgbmV0d2F2ZV9od194bWl0KHVuc2lnbmVkIGNoYXIqIGRhdGEsIGludCBsZW4sCgkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpIHsKICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgICB1bnNpZ25lZCBpbnQgVHhGcmVlTGlzdCwKCSAgICAgICAgIGN1ckJ1ZmYsCgkgICAgICAgICBNYXhEYXRhLCAKICAgICAgICAgICAgICAgICBEYXRhT2Zmc2V0OwogICAgaW50IHRtcGNvdW50OyAKCQogICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgIHVfY2hhciBfX2lvbWVtICogcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CiAgICBraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOwoKICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAmIHNhdmUgZmxhZ3MgKi8KICAgIHNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOwoKICAgIC8qIENoZWNrIGlmIHRoZXJlIGFyZSB0cmFuc21pdCBidWZmZXJzIGF2YWlsYWJsZSAqLwogICAgd2FpdF9XT0MoaW9iYXNlKTsKICAgIGlmICgoaW5iKGlvYmFzZStORVRXQVZFX1JFR19BU1IpICYgTkVUV0FWRV9BU1JfVFhCQSkgPT0gMCkgewoJLyogTm8gYnVmZmVycyBhdmFpbGFibGUgKi8KCXByaW50ayhLRVJOX0RFQlVHICJuZXR3YXZlX2h3X3htaXQ6ICVzIC0gbm8geG1pdCBidWZmZXJzIGF2YWlsYWJsZS5cbiIsCgkgICAgICAgZGV2LT5uYW1lKTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CglyZXR1cm4gMTsKICAgIH0KCiAgICBwcml2LT5zdGF0cy50eF9ieXRlcyArPSBsZW47CgogICAgREVCVUcoMywgIlRyYW5zbWl0dGluZyB3aXRoIFNQQ1EgJXggU1BVICV4IExJRiAleCBJU1BMUSAleFxuIiwKCSAgcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19TUENRKSwKCSAgcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19TUFUpLAoJICByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX0xJRiksCgkgIHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfSVNQTFEpKTsKCiAgICAvKiBOb3cgdHJ5IHRvIGluc2VydCBpdCBpbnRvIHRoZSBhZGFwdGVycyBmcmVlIG1lbW9yeSAqLwogICAgd2FpdF9XT0MoaW9iYXNlKTsKICAgIFR4RnJlZUxpc3QgPSBnZXRfdWludDE2KHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfVERQKTsKICAgIE1heERhdGEgICAgPSBnZXRfdWludDE2KHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfVERQKzIpOwogICAgRGF0YU9mZnNldCA9IGdldF91aW50MTYocmFtQmFzZSArIE5FVFdBVkVfRVJFR19URFArNCk7CgkKICAgIERFQlVHKDMsICJUeEZyZWVMaXN0ICV4LCBNYXhEYXRhICV4LCBEYXRhT2Zmc2V0ICV4XG4iLAoJICBUeEZyZWVMaXN0LCBNYXhEYXRhLCBEYXRhT2Zmc2V0KTsKCiAgICAvKiBDb3B5IHBhY2tldCB0byB0aGUgYWRhcHRlciBmcmFnbWVudCBidWZmZXJzICovCiAgICBjdXJCdWZmID0gVHhGcmVlTGlzdDsgCiAgICB0bXBjb3VudCA9IDA7IAogICAgd2hpbGUgKHRtcGNvdW50IDwgbGVuKSB7CglpbnQgdG1wbGVuID0gbGVuIC0gdG1wY291bnQ7IAoJY29weV90b19wYyhyYW1CYXNlICsgY3VyQnVmZiArIERhdGFPZmZzZXQsIGRhdGEgKyB0bXBjb3VudCwgCgkJICAgKHRtcGxlbiA8IE1heERhdGEpID8gdG1wbGVuIDogTWF4RGF0YSk7Cgl0bXBjb3VudCArPSBNYXhEYXRhOwoJCQkKCS8qIEFkdmFuY2UgdG8gbmV4dCBidWZmZXIgKi8KCWN1ckJ1ZmYgPSBnZXRfdWludDE2KHJhbUJhc2UgKyBjdXJCdWZmKTsKICAgIH0KICAgIAogICAgLyogTm93IGlzc3VlIHRyYW5zbWl0IGxpc3QgKi8KICAgIHdhaXRfV09DKGlvYmFzZSk7CiAgICB3cml0ZWIoTkVUV0FWRV9DTURfVEwsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKICAgIHdyaXRlYihsZW4gJiAweGZmLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CiAgICB3cml0ZWIoKGxlbj4+OCkgJiAweGZmLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMik7CiAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMyk7CgogICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IG5ldHdhdmVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CgkvKiBUaGlzIGZsYWcgaW5kaWNhdGUgdGhhdCB0aGUgaGFyZHdhcmUgY2FuJ3QgcGVyZm9ybSBhIHRyYW5zbWlzc2lvbi4KCSAqIFRoZW9yaXRpY2FsbHksIE5FVDMgY2hlY2sgaXQgYmVmb3JlIHNlbmRpbmcgYSBwYWNrZXQgdG8gdGhlIGRyaXZlciwKCSAqIGJ1dCBpbiBmYWN0IGl0IG5ldmVyIGRvIHRoYXQgYW5kIHBvb2wgY29udGludW91c2x5LgoJICogQXMgdGhlIHdhdGNoZG9nIHdpbGwgYWJvcnQgdG9vIGxvbmcgdHJhbnNtaXNzaW9ucywgd2UgYXJlIHF1aXRlIHNhZmUuLi4KCSAqLwoKICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKCiAgICB7CglzaG9ydCBsZW5ndGggPSBFVEhfWkxFTiA8IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKCXVuc2lnbmVkIGNoYXIqIGJ1ZiA9IHNrYi0+ZGF0YTsKCQoJaWYgKG5ldHdhdmVfaHdfeG1pdCggYnVmLCBsZW5ndGgsIGRldikgPT0gMSkgewoJICAgIC8qIFNvbWUgZXJyb3IsIGxldCdzIG1ha2UgdGhlbSBjYWxsIHVzIGFub3RoZXIgdGltZT8gKi8KCSAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOwoJfQoJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAgICB9CiAgICBkZXZfa2ZyZWVfc2tiKHNrYik7CiAgICAKICAgIHJldHVybiAwOwp9IC8qIG5ldHdhdmVfc3RhcnRfeG1pdCAqLwoKLyoKICogRnVuY3Rpb24gbmV0d2F2ZV9pbnRlcnJ1cHQgKGlycSwgZGV2X2lkLCByZWdzKQogKgogKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIE5ldHdhdmUgY2FyZC4gVGhpcwogKiAgICByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyOiAKICoJICAxLiBBIHBhY2tldCBpcyByZWNlaXZlZC4KICoJICAyLiBBIHBhY2tldCBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdHJhbnNmZXJyZWQgYW5kIHRoZSB1bml0IGlzCiAqCSAgICAgcmVhZHkgdG8gdHJhbnNtaXQgYW5vdGhlciBwYWNrZXQuCiAqCSAgMy4gQSBjb21tYW5kIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uLgogKi8Kc3RhdGljIGlycXJldHVybl90IG5ldHdhdmVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCnsKICAgIGtpb19hZGRyX3QgaW9iYXNlOwogICAgdV9jaGFyIF9faW9tZW0gKnJhbUJhc2U7CiAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOwogICAgc3RydWN0IG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAgICBkZXZfbGlua190ICpsaW5rID0gJnByaXYtPmxpbms7CiAgICBpbnQgaTsKICAgIAogICAgaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQoJcmV0dXJuIElSUV9OT05FOwogICAgCiAgICBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKICAgIHJhbUJhc2UgPSBwcml2LT5yYW1CYXNlOwoJCiAgICAvKiBOb3cgZmluZCB3aGF0IGNhdXNlZCB0aGUgaW50ZXJydXB0LCBjaGVjayB3aGlsZSBpbnRlcnJ1cHRzIHJlYWR5ICovCiAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewoJdV9jaGFyIHN0YXR1czsKCQkKCXdhaXRfV09DKGlvYmFzZSk7CQoJaWYgKCEoaW5iKGlvYmFzZStORVRXQVZFX1JFR19DQ1NSKSAmIDB4MDIpKQoJICAgIGJyZWFrOyAvKiBOb25lIG9mIHRoZSBpbnRlcnJ1cHQgc291cmNlcyBhc3NlcnRlZCAobm9ybWFsIGV4aXQpICovCgkKICAgICAgICBzdGF0dXMgPSBpbmIoaW9iYXNlICsgTkVUV0FWRV9SRUdfQVNSKTsKCQkKCWlmICghREVWX09LKGxpbmspKSB7CgkgICAgREVCVUcoMSwgIm5ldHdhdmVfaW50ZXJydXB0OiBJbnRlcnJ1cHQgd2l0aCBzdGF0dXMgMHgleCAiCgkJICAiZnJvbSByZW1vdmVkIG9yIHN1c3BlbmRlZCBjYXJkIVxuIiwgc3RhdHVzKTsKCSAgICBicmVhazsKCX0KCQkKCS8qIFJ4UmR5ICovCglpZiAoc3RhdHVzICYgMHg4MCkgewoJICAgIG5ldHdhdmVfcngoZGV2KTsKCSAgICAvKiB3YWl0X1dPQyhpb2Jhc2UpOyAqLwoJICAgIC8qIFJ4UmR5IGNhbm5vdCBiZSByZXNldCBkaXJlY3RseSBieSB0aGUgaG9zdCAqLwoJfQoJLyogUnhFcnIgKi8KCWlmIChzdGF0dXMgJiAweDQwKSB7CgkgICAgdV9jaGFyIHJzZXI7CgkJCQoJICAgIHJzZXIgPSByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1JTRVIpOwkJCQoJICAgIAoJICAgIGlmIChyc2VyICYgMHgwNCkgewoJCSsrcHJpdi0+c3RhdHMucnhfZHJvcHBlZDsgCgkJKytwcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzOwoJICAgIH0KCSAgICBpZiAocnNlciAmIDB4MDIpCgkJKytwcml2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnM7CgkJCQoJICAgIC8qIENsZWFyIHRoZSBSeEVyciBiaXQgaW4gUlNFUi4gUlNFUis0IGlzIHRoZQoJICAgICAqIHdyaXRlIHBhcnQuIEFsc28gY2xlYXIgdGhlIFJ4Q1JDICgweDA0KSBhbmQgCgkgICAgICogUnhCaWcgKDB4MDIpIGJpdHMgaWYgcHJlc2VudCAqLwoJICAgIHdhaXRfV09DKGlvYmFzZSk7CgkgICAgd3JpdGViKDB4NDAgfCAocnNlciAmIDB4MDYpLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX1JTRVIgKyA0KTsKCgkgICAgLyogV3JpdGUgYml0IDYgaGlnaCB0byBBU0NDIHRvIGNsZWFyIFJ4RXJyIGluIEFTUiwKCSAgICAgKiBXT0MgbXVzdCBiZSBzZXQgZmlyc3QhIAoJICAgICAqLwoJICAgIHdhaXRfV09DKGlvYmFzZSk7CgkgICAgd3JpdGViKDB4NDAsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQVNDQyk7CgoJICAgIC8qIFJlbWVtYmVyIHRvIGNvdW50IHVwIHByaXYtPnN0YXRzIG9uIGVycm9yIHBhY2tldHMgKi8KCSAgICArK3ByaXYtPnN0YXRzLnJ4X2Vycm9yczsKCX0KCS8qIFR4RE4gKi8KCWlmIChzdGF0dXMgJiAweDIwKSB7CgkgICAgaW50IHR4U3RhdHVzOwoKCSAgICB0eFN0YXR1cyA9IHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfVFNFUik7CgkgICAgREVCVUcoMywgIlRyYW5zbWl0IGRvbmUuIFRTRVIgPSAleCBpZCAleFxuIiwgCgkJICB0eFN0YXR1cywgcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19UU0VSICsgMSkpOwoJICAgIAoJICAgIGlmICh0eFN0YXR1cyAmIDB4MjApIHsKCQkvKiBUcmFuc21pdHRpbmcgd2FzIG9rYXksIGNsZWFyIGJpdHMgKi8KCQl3YWl0X1dPQyhpb2Jhc2UpOwoJCXdyaXRlYigweDJmLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX1RTRVIgKyA0KTsKCQkrK3ByaXYtPnN0YXRzLnR4X3BhY2tldHM7CgkgICAgfQoJCQkKCSAgICBpZiAodHhTdGF0dXMgJiAweGQwKSB7CgkJaWYgKHR4U3RhdHVzICYgMHg4MCkgewoJCSAgICArK3ByaXYtPnN0YXRzLmNvbGxpc2lvbnM7IC8qIEJlY2F1c2Ugb2YgL3Byb2MvbmV0L2RldiovCgkJICAgIC8qICsrcHJpdi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnM7ICovCgkJICAgIC8qIHByaW50aygiQ29sbGlzaW9uLiAlbGRcbiIsIGppZmZpZXMgLSBkZXYtPnRyYW5zX3N0YXJ0KTsgKi8KCQl9CgkJaWYgKHR4U3RhdHVzICYgMHg0MCkgCgkJICAgICsrcHJpdi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnM7CgkJLyogMHg4MCBUeEdVIFRyYW5zbWl0IGdpdmV1cCAtIG5pbmUgdGltZXMgYW5kIG5vIGx1Y2sKCQkgKiAweDQwIFR4Tk9BUCBObyBhY2Nlc3MgcG9pbnQuIERpc2NhcmRlZCBwYWNrZXQuCgkJICogMHgxMCBUeEVyciBUcmFuc21pdCBlcnJvci4gQWx3YXlzIHNldCB3aGVuIAoJCSAqICAgICAgVHhHVSBhbmQgVHhOT0FQIGlzIHNldC4gKFRob3NlIGFyZSB0aGUgb25seSBvbmVzCgkJICogICAgICB0byBzZXQgVHhFcnIpLgoJCSAqLwoJCURFQlVHKDMsICJuZXR3YXZlX2ludGVycnVwdDogVHhETiB3aXRoIGVycm9yIHN0YXR1cyAleFxuIiwgCgkJICAgICAgdHhTdGF0dXMpOwoJCQoJCS8qIENsZWFyIG91dCBUeEdVLCBUeE5PQVAsIFR4RXJyIGFuZCBUeFRyeXMgKi8KCQl3YWl0X1dPQyhpb2Jhc2UpOwoJCXdyaXRlYigweGRmICYgdHhTdGF0dXMsIHJhbUJhc2UrTkVUV0FWRV9FUkVHX1RTRVIrNCk7CgkJKytwcml2LT5zdGF0cy50eF9lcnJvcnM7CgkgICAgfQoJICAgIERFQlVHKDMsICJOZXcgc3RhdHVzIGlzIFRTRVIgJXggQVNSICV4XG4iLAoJCSAgcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19UU0VSKSwKCQkgIGluYihpb2Jhc2UgKyBORVRXQVZFX1JFR19BU1IpKTsKCgkgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwoJfQoJLyogVHhCQSwgdGhpcyB3b3VsZCB0cmlnZ2VyIG9uIGFsbCBlcnJvciBwYWNrZXRzIHJlY2VpdmVkICovCgkvKiBpZiAoc3RhdHVzICYgMHgwMSkgewoJICAgREVCVUcoNCwgIlRyYW5zbWl0IGJ1ZmZlcnMgYXZhaWxhYmxlLCAleFxuIiwgc3RhdHVzKTsKCSAgIH0KCSAgICovCiAgICB9CiAgICAvKiBIYW5kbGVkIGlmIHdlIGxvb3BlZCBhdCBsZWFzdCBvbmUgdGltZSAtIEplYW4gSUkgKi8KICAgIHJldHVybiBJUlFfUkVUVkFMKGkpOwp9IC8qIG5ldHdhdmVfaW50ZXJydXB0ICovCgovKgogKiBGdW5jdGlvbiBuZXR3YXZlX3dhdGNoZG9nIChhKQogKgogKiAgICBXYXRjaGRvZyA6IHdoZW4gd2Ugc3RhcnQgYSB0cmFuc21pc3Npb24sIHdlIHNldCBhIHRpbWVyIGluIHRoZQogKiAgICBrZXJuZWwuICBJZiB0aGUgdHJhbnNtaXNzaW9uIGNvbXBsZXRlLCB0aGlzIHRpbWVyIGlzIGRpc2FibGVkLiBJZgogKiAgICBpdCBleHBpcmUsIHdlIHJlc2V0IHRoZSBjYXJkLgogKgogKi8Kc3RhdGljIHZvaWQgbmV0d2F2ZV93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CgogICAgREVCVUcoMSwgIiVzOiBuZXR3YXZlX3dhdGNoZG9nOiB3YXRjaGRvZyB0aW1lciBleHBpcmVkXG4iLCBkZXYtPm5hbWUpOwogICAgbmV0d2F2ZV9yZXNldChkZXYpOwogICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7Cn0gLyogbmV0d2F2ZV93YXRjaGRvZyAqLwoKc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXR3YXZlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CiAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwoKICAgIHVwZGF0ZV9zdGF0cyhkZXYpOwoKICAgIERFQlVHKDIsICJuZXR3YXZlOiBTUENRICV4IFNQVSAleCBMSUYgJXggSVNQTFEgJXggTUhTICV4IHJ4dHggJXgiCgkgICIgJXggdHggJXggJXggJXggJXhcbiIsIAoJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX1NQQ1EpLAoJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX1NQVSksCgkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfTElGKSwKCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19JU1BMUSksCgkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfTUhTKSwKCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19FQyArIDB4ZSksCgkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfRUMgKyAweGYpLAoJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX0VDICsgMHgxOCksCgkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfRUMgKyAweDE5KSwKCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19FQyArIDB4MWEpLAoJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX0VDICsgMHgxYikpOwoKICAgIHJldHVybiAmcHJpdi0+c3RhdHM7Cn0KCnN0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CiAgICAvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7Ci8qICAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOyAqLwoKICAgIC8vc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CgovKiAgICBwcml2LT5zdGF0cy5yeF9wYWNrZXRzID0gcmVhZGIocHJpdi0+cmFtQmFzZSArIDB4MThlKTsgCiAgICBwcml2LT5zdGF0cy50eF9wYWNrZXRzID0gcmVhZGIocHJpdi0+cmFtQmFzZSArIDB4MThmKTsgKi8KCiAgICAvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7Cn0KCnN0YXRpYyBpbnQgbmV0d2F2ZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CiAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogICAgdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UgPSBwcml2LT5yYW1CYXNlOwogICAga2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKICAgIHVfY2hhciByeFN0YXR1czsKICAgIHN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogICAgdW5zaWduZWQgaW50IGN1ckJ1ZmZlciwKCQlyY3ZMaXN0OwogICAgaW50IHJjdkxlbjsKICAgIGludCB0bXBjb3VudCA9IDA7CiAgICBpbnQgZGF0YUNvdW50LCBkYXRhT2Zmc2V0OwogICAgaW50IGk7CiAgICB1X2NoYXIgKnB0cjsKCQogICAgREVCVUcoMywgInhpbndfcng6IFJlY2VpdmluZyAuLi4gXG4iKTsKCiAgICAvKiBSZWNlaXZlIG1heCAxMCBwYWNrZXRzIGZvciBub3cuICovCiAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewoJLyogQW55IHBhY2tldHM/ICovCgl3YWl0X1dPQyhpb2Jhc2UpOwoJcnhTdGF0dXMgPSByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1JTRVIpOwkJCglpZiAoICEoIHJ4U3RhdHVzICYgMHg4MCkpIC8qIE5vIG1vcmUgcGFja2V0cyAqLwoJICAgIGJyZWFrOwoJCQoJLyogQ2hlY2sgaWYgbXVsdGljYXN0L2Jyb2FkY2FzdCBvciBvdGhlciAqLwoJLyogbXVsdGljYXN0ID0gKHJ4U3RhdHVzICYgMHgyMCk7ICAqLwoJCQoJLyogVGhlIHJlY2VpdmUgbGlzdCBwb2ludGVyIGFuZCBsZW5ndGggb2YgdGhlIHBhY2tldCAqLwoJd2FpdF9XT0MoaW9iYXNlKTsKCXJjdkxlbiAgPSBnZXRfaW50MTYoIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfUkRQKTsKCXJjdkxpc3QgPSBnZXRfdWludDE2KCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX1JEUCArIDIpOwoJCQoJaWYgKHJjdkxlbiA8IDApIHsKCSAgICBwcmludGsoS0VSTl9ERUJVRyAibmV0d2F2ZV9yeDogUmVjZWl2ZSBwYWNrZXQgd2l0aCBsZW4gJWRcbiIsIAoJCSAgIHJjdkxlbik7CgkgICAgcmV0dXJuIDA7Cgl9CgkJCglza2IgPSBkZXZfYWxsb2Nfc2tiKHJjdkxlbis1KTsKCWlmIChza2IgPT0gTlVMTCkgewoJICAgIERFQlVHKDEsICJuZXR3YXZlX3J4OiBDb3VsZCBub3QgYWxsb2NhdGUgYW4gc2tfYnVmZiBvZiAiCgkJICAibGVuZ3RoICVkXG4iLCByY3ZMZW4pOwoJICAgICsrcHJpdi0+c3RhdHMucnhfZHJvcHBlZDsgCgkgICAgLyogVGVsbCB0aGUgYWRhcHRlciB0byBza2lwIHRoZSBwYWNrZXQgKi8KCSAgICB3YWl0X1dPQyhpb2Jhc2UpOwoJICAgIHdyaXRlYihORVRXQVZFX0NNRF9TUlAsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKCSAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CgkgICAgcmV0dXJuIDA7Cgl9CgoJc2tiX3Jlc2VydmUoIHNrYiwgMik7ICAvKiBBbGlnbiBJUCBvbiAxNiBieXRlICovCglza2JfcHV0KCBza2IsIHJjdkxlbik7Cglza2ItPmRldiA9IGRldjsKCgkvKiBDb3B5IHBhY2tldCBmcmFnbWVudHMgdG8gdGhlIHNrYiBkYXRhIGFyZWEgKi8KCXB0ciA9ICh1X2NoYXIqKSBza2ItPmRhdGE7CgljdXJCdWZmZXIgPSByY3ZMaXN0OwoJdG1wY291bnQgPSAwOyAKCXdoaWxlICggdG1wY291bnQgPCByY3ZMZW4pIHsKCSAgICAvKiBHZXQgbGVuZ3RoIGFuZCBvZmZzZXQgb2YgY3VycmVudCBidWZmZXIgKi8KCSAgICBkYXRhQ291bnQgID0gZ2V0X3VpbnQxNiggcmFtQmFzZStjdXJCdWZmZXIrMik7CgkgICAgZGF0YU9mZnNldCA9IGdldF91aW50MTYoIHJhbUJhc2UrY3VyQnVmZmVyKzQpOwoJCQoJICAgIGNvcHlfZnJvbV9wYyggcHRyICsgdG1wY291bnQsCgkJCSAgcmFtQmFzZStjdXJCdWZmZXIrZGF0YU9mZnNldCwgZGF0YUNvdW50KTsKCgkgICAgdG1wY291bnQgKz0gZGF0YUNvdW50OwoJCQoJICAgIC8qIFBvaW50IHRvIG5leHQgYnVmZmVyICovCgkgICAgY3VyQnVmZmVyID0gZ2V0X3VpbnQxNihyYW1CYXNlICsgY3VyQnVmZmVyKTsKCX0KCQoJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYixkZXYpOwoJLyogUXVldWUgcGFja2V0IGZvciBuZXR3b3JrIGxheWVyICovCgluZXRpZl9yeChza2IpOwoKCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7Cglwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7Cglwcml2LT5zdGF0cy5yeF9ieXRlcyArPSByY3ZMZW47CgoJLyogR290IHRoZSBwYWNrZXQsIHRlbGwgdGhlIGFkYXB0ZXIgdG8gc2tpcCBpdCAqLwoJd2FpdF9XT0MoaW9iYXNlKTsKCXdyaXRlYihORVRXQVZFX0NNRF9TUlAsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKCXdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKCURFQlVHKDMsICJQYWNrZXQgcmVjZXB0aW9uIG9rXG4iKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IG5ldHdhdmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CiAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogICAgZGV2X2xpbmtfdCAqbGluayA9ICZwcml2LT5saW5rOwoKICAgIERFQlVHKDEsICJuZXR3YXZlX29wZW46IHN0YXJ0aW5nLlxuIik7CiAgICAKICAgIGlmICghREVWX09LKGxpbmspKQoJcmV0dXJuIC1FTk9ERVY7CgogICAgbGluay0+b3BlbisrOwoKICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAgICBuZXR3YXZlX3Jlc2V0KGRldik7CgkKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IG5ldHdhdmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgewogICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgIGRldl9saW5rX3QgKmxpbmsgPSAmcHJpdi0+bGluazsKCiAgICBERUJVRygxLCAibmV0d2F2ZV9jbG9zZTogZmluaXNoaW5nLlxuIik7CgogICAgbGluay0+b3Blbi0tOwogICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwoKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgbmV0d2F2ZV9pZHNbXSA9IHsKCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJYaXJjb20iLCAiQ3JlZGl0Q2FyZCBOZXR3YXZlIiwgMHgyZTNlZTg0NSwgMHg1NGUyOGEyOCksCglQQ01DSUFfREVWSUNFX05VTEwsCn07Ck1PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBuZXR3YXZlX2lkcyk7CgpzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgbmV0d2F2ZV9kcml2ZXIgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkuZHJ2CQk9IHsKCQkubmFtZQk9ICJuZXR3YXZlX2NzIiwKCX0sCgkuYXR0YWNoCQk9IG5ldHdhdmVfYXR0YWNoLAoJLmV2ZW50CQk9IG5ldHdhdmVfZXZlbnQsCgkuZGV0YWNoCQk9IG5ldHdhdmVfZGV0YWNoLAoJLmlkX3RhYmxlICAgICAgID0gbmV0d2F2ZV9pZHMsCn07CgpzdGF0aWMgaW50IF9faW5pdCBpbml0X25ldHdhdmVfY3Modm9pZCkKewoJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJm5ldHdhdmVfZHJpdmVyKTsKfQoKc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmV0d2F2ZV9jcyh2b2lkKQp7CglwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJm5ldHdhdmVfZHJpdmVyKTsKCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKfQoKbW9kdWxlX2luaXQoaW5pdF9uZXR3YXZlX2NzKTsKbW9kdWxlX2V4aXQoZXhpdF9uZXR3YXZlX2NzKTsKCi8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgogICBudW1fYWRkcnMgPT0gLTEJUHJvbWlzY3VvdXMgbW9kZSwgcmVjZWl2ZSBhbGwgcGFja2V0cwogICBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKICAgbnVtX2FkZHJzID4gMAlNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsIGFuZCBkbwogICBiZXN0LWVmZm9ydCBmaWx0ZXJpbmcuCiAqLwpzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewogICAga2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAgICB1X2NoYXIgX19pb21lbSAqIHJhbUJhc2UgPSBwcml2LT5yYW1CYXNlOwogICAgdV9jaGFyICByY3ZNb2RlID0gMDsKICAgCiNpZmRlZiBQQ01DSUFfREVCVUcKICAgIGlmIChwY19kZWJ1ZyA+IDIpIHsKCXN0YXRpYyBpbnQgb2xkOwoJaWYgKG9sZCAhPSBkZXYtPm1jX2NvdW50KSB7CgkgICAgb2xkID0gZGV2LT5tY19jb3VudDsKCSAgICBERUJVRygwLCAiJXM6IHNldHRpbmcgUnggbW9kZSB0byAlZCBhZGRyZXNzZXMuXG4iLAoJCSAgZGV2LT5uYW1lLCBkZXYtPm1jX2NvdW50KTsKCX0KICAgIH0KI2VuZGlmCgkKICAgIGlmIChkZXYtPm1jX2NvdW50IHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgewoJLyogTXVsdGljYXN0IE1vZGUgKi8KCXJjdk1vZGUgPSByeENvbmZSeEVuYSArIHJ4Q29uZkFNUCArIHJ4Q29uZkJjYXN0OwogICAgfSBlbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKCS8qIFByb21pc2NvdXMgbW9kZSAqLwoJcmN2TW9kZSA9IHJ4Q29uZlJ4RW5hICsgcnhDb25mUHJvICsgcnhDb25mQU1QICsgcnhDb25mQmNhc3Q7CiAgICB9IGVsc2UgewoJLyogTm9ybWFsIG1vZGUgKi8KCXJjdk1vZGUgPSByeENvbmZSeEVuYSArIHJ4Q29uZkJjYXN0OwogICAgfQoJCiAgICAvKiBwcmludGsoIm5ldHdhdmUgc2V0X211bHRpY2FzdF9saXN0OiByY3ZNb2RlIHRvICV4XG4iLCByY3ZNb2RlKTsqLwogICAgLyogTm93IHNldCByZWNlaXZlIG1vZGUgKi8KICAgIHdhaXRfV09DKGlvYmFzZSk7CiAgICB3cml0ZWIoTkVUV0FWRV9DTURfU1JDLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CiAgICB3cml0ZWIocmN2TW9kZSwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOwogICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDIpOwp9Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsK