LyoKICogQ1RDIC8gRVNDT04gbmV0d29yayBkcml2ZXIKICoKICogQ29weXJpZ2h0IChDKSAyMDAxIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KICogQXV0aG9yKHMpOiBGcml0eiBFbGZlcnQgKGVsZmVydEBkZS5pYm0uY29tLCBmZWxmZXJ0QG1pbGxlbnV4LmNvbSkKICogRml4ZXMgYnkgOiBKb2NoZW4gUvZocmlnIChyb2VocmlnQGRlLmlibS5jb20pCiAqICAgICAgICAgICAgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CgkgICAgICBQZXRlciBUaWVkZW1hbm4gKHB0aWVkZW1AZGUuaWJtLmNvbSkKICogRHJpdmVyIE1vZGVsIHN0dWZmIGJ5IDogQ29ybmVsaWEgSHVjayA8Y29ybmVsaWEuaHVja0BkZS5pYm0uY29tPgogKgogKiBEb2N1bWVudGF0aW9uIHVzZWQ6CiAqICAtIFByaW5jaXBsZXMgb2YgT3BlcmF0aW9uIChJQk0gZG9jIzogU0EyMi03MjAxLTA2KQogKiAgLSBDb21tb24gSU8vLURldmljZSBDb21tYW5kcyBhbmQgU2VsZiBEZXNjcmlwdGlvbiAoSUJNIGRvYyM6IFNBMjItNzIwNC0wMikKICogIC0gQ29tbW9uIElPLy1EZXZpY2UgQ29tbWFuZHMgYW5kIFNlbGYgRGVzY3JpcHRpb24gKElCTSBkb2MjOiBTTjIyLTU1MzUpCiAqICAtIEVTQ09OIENoYW5uZWwtdG8tQ2hhbm5lbCBBZGFwdGVyIChJQk0gZG9jIzogU0EyMi03MjAzLTAwKQogKiAgLSBFU0NPTiBJL08gSW50ZXJmYWNlIChJQk0gZG9jIzogU0EyMi03MjAyLTAyOQogKgogKiBhbmQgdGhlIHNvdXJjZSBvZiB0aGUgb3JpZ2luYWwgQ1RDIGRyaXZlciBieToKICogIERpZXRlciBXZWxsZXJkaWVrICh3ZWxAZGUuaWJtLmNvbSkKICogIE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSkKICogIERlbmlzIEpvc2VwaCBCYXJyb3cgKGRqYmFycm93QGRlLmlibS5jb20sYmFycm93X2RqQHlhaG9vLmNvbSkKICogIEpvY2hlbiBS9mhyaWcgKHJvZWhyaWdAZGUuaWJtLmNvbSkKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqCiAqLwojdW5kZWYgREVCVUcKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvdGltZXIuaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KCiNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgoKI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgojaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgojaW5jbHVkZSA8bmV0L2RzdC5oPgoKI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2Njd2Rldi5oPgojaW5jbHVkZSA8YXNtL2Njd2dyb3VwLmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgoKI2luY2x1ZGUgPGFzbS9pZGFscy5oPgoKI2luY2x1ZGUgImZzbS5oIgojaW5jbHVkZSAiY3UzMDg4LmgiCgojaW5jbHVkZSAiY3RjZGJ1Zy5oIgojaW5jbHVkZSAiY3RjbWFpbi5oIgoKTU9EVUxFX0FVVEhPUigiKEMpIDIwMDAgSUJNIENvcnAuIGJ5IEZyaXR6IEVsZmVydCAoZmVsZmVydEBtaWxsZW51eC5jb20pIik7Ck1PRFVMRV9ERVNDUklQVElPTigiTGludXggZm9yIFMvMzkwIENUQy9Fc2NvbiBEcml2ZXIiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwovKioKICogU3RhdGVzIG9mIHRoZSBpbnRlcmZhY2Ugc3RhdGVtYWNoaW5lLgogKi8KZW51bSBkZXZfc3RhdGVzIHsKCURFVl9TVEFURV9TVE9QUEVELAoJREVWX1NUQVRFX1NUQVJUV0FJVF9SWFRYLAoJREVWX1NUQVRFX1NUQVJUV0FJVF9SWCwKCURFVl9TVEFURV9TVEFSVFdBSVRfVFgsCglERVZfU1RBVEVfU1RPUFdBSVRfUlhUWCwKCURFVl9TVEFURV9TVE9QV0FJVF9SWCwKCURFVl9TVEFURV9TVE9QV0FJVF9UWCwKCURFVl9TVEFURV9SVU5OSU5HLAoJLyoqCgkgKiBNVVNUIGJlIGFsd2F5cyB0aGUgbGFzdCBlbGVtZW50ISEKCSAqLwoJQ1RDX05SX0RFVl9TVEFURVMKfTsKCnN0YXRpYyBjb25zdCBjaGFyICpkZXZfc3RhdGVfbmFtZXNbXSA9IHsKCSJTdG9wcGVkIiwKCSJTdGFydFdhaXQgUlhUWCIsCgkiU3RhcnRXYWl0IFJYIiwKCSJTdGFydFdhaXQgVFgiLAoJIlN0b3BXYWl0IFJYVFgiLAoJIlN0b3BXYWl0IFJYIiwKCSJTdG9wV2FpdCBUWCIsCgkiUnVubmluZyIsCn07CgovKioKICogRXZlbnRzIG9mIHRoZSBpbnRlcmZhY2Ugc3RhdGVtYWNoaW5lLgogKi8KZW51bSBkZXZfZXZlbnRzIHsKCURFVl9FVkVOVF9TVEFSVCwKCURFVl9FVkVOVF9TVE9QLAoJREVWX0VWRU5UX1JYVVAsCglERVZfRVZFTlRfVFhVUCwKCURFVl9FVkVOVF9SWERPV04sCglERVZfRVZFTlRfVFhET1dOLAoJREVWX0VWRU5UX1JFU1RBUlQsCgkvKioKCSAqIE1VU1QgYmUgYWx3YXlzIHRoZSBsYXN0IGVsZW1lbnQhIQoJICovCglDVENfTlJfREVWX0VWRU5UUwp9OwoKc3RhdGljIGNvbnN0IGNoYXIgKmRldl9ldmVudF9uYW1lc1tdID0gewoJIlN0YXJ0IiwKCSJTdG9wIiwKCSJSWCB1cCIsCgkiVFggdXAiLAoJIlJYIGRvd24iLAoJIlRYIGRvd24iLAoJIlJlc3RhcnQiLAp9OwoKLyoqCiAqIEV2ZW50cyBvZiB0aGUgY2hhbm5lbCBzdGF0ZW1hY2hpbmUKICovCmVudW0gY2hfZXZlbnRzIHsKCS8qKgoJICogRXZlbnRzLCByZXByZXNlbnRpbmcgcmV0dXJuIGNvZGUgb2YKCSAqIEkvTyBvcGVyYXRpb25zIChjY3dfZGV2aWNlX3N0YXJ0LCBjY3dfZGV2aWNlX2hhbHQgZXQgYWwuKQoJICovCglDSF9FVkVOVF9JT19TVUNDRVNTLAoJQ0hfRVZFTlRfSU9fRUJVU1ksCglDSF9FVkVOVF9JT19FTk9ERVYsCglDSF9FVkVOVF9JT19FSU8sCglDSF9FVkVOVF9JT19VTktOT1dOLAoKCUNIX0VWRU5UX0FUVE5CVVNZLAoJQ0hfRVZFTlRfQVRUTiwKCUNIX0VWRU5UX0JVU1ksCgoJLyoqCgkgKiBFdmVudHMsIHJlcHJlc2VudGluZyB1bml0LWNoZWNrCgkgKi8KCUNIX0VWRU5UX1VDX1JDUkVTRVQsCglDSF9FVkVOVF9VQ19SU1JFU0VULAoJQ0hfRVZFTlRfVUNfVFhUSU1FT1VULAoJQ0hfRVZFTlRfVUNfVFhQQVJJVFksCglDSF9FVkVOVF9VQ19IV0ZBSUwsCglDSF9FVkVOVF9VQ19SWFBBUklUWSwKCUNIX0VWRU5UX1VDX1pFUk8sCglDSF9FVkVOVF9VQ19VTktOT1dOLAoKCS8qKgoJICogRXZlbnRzLCByZXByZXNlbnRpbmcgc3ViY2hhbm5lbC1jaGVjawoJICovCglDSF9FVkVOVF9TQ19VTktOT1dOLAoKCS8qKgoJICogRXZlbnRzLCByZXByZXNlbnRpbmcgbWFjaGluZSBjaGVja3MKCSAqLwoJQ0hfRVZFTlRfTUNfRkFJTCwKCUNIX0VWRU5UX01DX0dPT0QsCgoJLyoqCgkgKiBFdmVudCwgcmVwcmVzZW50aW5nIG5vcm1hbCBJUlEKCSAqLwoJQ0hfRVZFTlRfSVJRLAoJQ0hfRVZFTlRfRklOU1RBVCwKCgkvKioKCSAqIEV2ZW50LCByZXByZXNlbnRpbmcgdGltZXIgZXhwaXJ5LgoJICovCglDSF9FVkVOVF9USU1FUiwKCgkvKioKCSAqIEV2ZW50cywgcmVwcmVzZW50aW5nIGNvbW1hbmRzIGZyb20gdXBwZXIgbGV2ZWxzLgoJICovCglDSF9FVkVOVF9TVEFSVCwKCUNIX0VWRU5UX1NUT1AsCgoJLyoqCgkgKiBNVVNUIGJlIGFsd2F5cyB0aGUgbGFzdCBlbGVtZW50ISEKCSAqLwoJTlJfQ0hfRVZFTlRTLAp9OwoKLyoqCiAqIFN0YXRlcyBvZiB0aGUgY2hhbm5lbCBzdGF0ZW1hY2hpbmUuCiAqLwplbnVtIGNoX3N0YXRlcyB7CgkvKioKCSAqIENoYW5uZWwgbm90IGFzc2lnbmVkIHRvIGFueSBkZXZpY2UsCgkgKiBpbml0aWFsIHN0YXRlLCBkaXJlY3Rpb24gaW52YWxpZAoJICovCglDSF9TVEFURV9JRExFLAoKCS8qKgoJICogQ2hhbm5lbCBhc3NpZ25lZCBidXQgbm90IG9wZXJhdGluZwoJICovCglDSF9TVEFURV9TVE9QUEVELAoJQ0hfU1RBVEVfU1RBUlRXQUlULAoJQ0hfU1RBVEVfU1RBUlRSRVRSWSwKCUNIX1NUQVRFX1NFVFVQV0FJVCwKCUNIX1NUQVRFX1JYSU5JVCwKCUNIX1NUQVRFX1RYSU5JVCwKCUNIX1NUQVRFX1JYLAoJQ0hfU1RBVEVfVFgsCglDSF9TVEFURV9SWElETEUsCglDSF9TVEFURV9UWElETEUsCglDSF9TVEFURV9SWEVSUiwKCUNIX1NUQVRFX1RYRVJSLAoJQ0hfU1RBVEVfVEVSTSwKCUNIX1NUQVRFX0RURVJNLAoJQ0hfU1RBVEVfTk9UT1AsCgoJLyoqCgkgKiBNVVNUIGJlIGFsd2F5cyB0aGUgbGFzdCBlbGVtZW50ISEKCSAqLwoJTlJfQ0hfU1RBVEVTLAp9OwoKc3RhdGljIGludCBsb2dsZXZlbCA9IENUQ19MT0dMRVZFTF9ERUZBVUxUOwoKLyoqCiAqIExpbmtlZCBsaXN0IG9mIGFsbCBkZXRlY3RlZCBjaGFubmVscy4KICovCnN0YXRpYyBzdHJ1Y3QgY2hhbm5lbCAqY2hhbm5lbHMgPSBOVUxMOwoKLyoqCiAqIFByaW50IEJhbm5lci4KICovCnN0YXRpYyB2b2lkCnByaW50X2Jhbm5lcih2b2lkKQp7CglzdGF0aWMgaW50IHByaW50ZWQgPSAwOwoKCWlmIChwcmludGVkKQoJCXJldHVybjsKCglwcmludGsoS0VSTl9JTkZPICJDVEMgZHJpdmVyIGluaXRpYWxpemVkXG4iKTsKCXByaW50ZWQgPSAxOwp9CgovKioKICogUmV0dXJuIHR5cGUgb2YgYSBkZXRlY3RlZCBkZXZpY2UuCiAqLwpzdGF0aWMgZW51bSBjaGFubmVsX3R5cGVzCmdldF9jaGFubmVsX3R5cGUoc3RydWN0IGNjd19kZXZpY2VfaWQgKmlkKQp7CgllbnVtIGNoYW5uZWxfdHlwZXMgdHlwZSA9IChlbnVtIGNoYW5uZWxfdHlwZXMpIGlkLT5kcml2ZXJfaW5mbzsKCglpZiAodHlwZSA9PSBjaGFubmVsX3R5cGVfZmljb24pCgkJdHlwZSA9IGNoYW5uZWxfdHlwZV9lc2NvbjsKCglyZXR1cm4gdHlwZTsKfQoKc3RhdGljIGNvbnN0IGNoYXIgKmNoX2V2ZW50X25hbWVzW10gPSB7CgkiY2N3X2RldmljZSBzdWNjZXNzIiwKCSJjY3dfZGV2aWNlIGJ1c3kiLAoJImNjd19kZXZpY2UgZW5vZGV2IiwKCSJjY3dfZGV2aWNlIGlvZXJyIiwKCSJjY3dfZGV2aWNlIHVua25vd24iLAoKCSJTdGF0dXMgQVRUTiAmIEJVU1kiLAoJIlN0YXR1cyBBVFROIiwKCSJTdGF0dXMgQlVTWSIsCgoJIlVuaXQgY2hlY2sgcmVtb3RlIHJlc2V0IiwKCSJVbml0IGNoZWNrIHJlbW90ZSBzeXN0ZW0gcmVzZXQiLAoJIlVuaXQgY2hlY2sgVFggdGltZW91dCIsCgkiVW5pdCBjaGVjayBUWCBwYXJpdHkiLAoJIlVuaXQgY2hlY2sgSGFyZHdhcmUgZmFpbHVyZSIsCgkiVW5pdCBjaGVjayBSWCBwYXJpdHkiLAoJIlVuaXQgY2hlY2sgWkVSTyIsCgkiVW5pdCBjaGVjayBVbmtub3duIiwKCgkiU3ViQ2hhbm5lbCBjaGVjayBVbmtub3duIiwKCgkiTWFjaGluZSBjaGVjayBmYWlsdXJlIiwKCSJNYWNoaW5lIGNoZWNrIG9wZXJhdGlvbmFsIiwKCgkiSVJRIG5vcm1hbCIsCgkiSVJRIGZpbmFsIiwKCgkiVGltZXIiLAoKCSJTdGFydCIsCgkiU3RvcCIsCn07CgpzdGF0aWMgY29uc3QgY2hhciAqY2hfc3RhdGVfbmFtZXNbXSA9IHsKCSJJZGxlIiwKCSJTdG9wcGVkIiwKCSJTdGFydFdhaXQiLAoJIlN0YXJ0UmV0cnkiLAoJIlNldHVwV2FpdCIsCgkiUlggaW5pdCIsCgkiVFggaW5pdCIsCgkiUlgiLAoJIlRYIiwKCSJSWCBpZGxlIiwKCSJUWCBpZGxlIiwKCSJSWCBlcnJvciIsCgkiVFggZXJyb3IiLAoJIlRlcm1pbmF0aW5nIiwKCSJSZXN0YXJ0aW5nIiwKCSJOb3Qgb3BlcmF0aW9uYWwiLAp9OwoKI2lmZGVmIERFQlVHCi8qKgogKiBEdW1wIGhlYWRlciBhbmQgZmlyc3QgMTYgYnl0ZXMgb2YgYW4gc2tfYnVmZiBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgogKgogKiBAcGFyYW0gc2tiICAgIFRoZSBza19idWZmIHRvIGR1bXAuCiAqIEBwYXJhbSBvZmZzZXQgT2Zmc2V0IHJlbGF0aXZlIHRvIHNrYi1kYXRhLCB3aGVyZSB0byBzdGFydCB0aGUgZHVtcC4KICovCnN0YXRpYyB2b2lkCmN0Y19kdW1wX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0KQp7Cgl1bnNpZ25lZCBjaGFyICpwID0gc2tiLT5kYXRhOwoJX191MTYgYmw7CglzdHJ1Y3QgbGxfaGVhZGVyICpoZWFkZXI7CglpbnQgaTsKCglpZiAoIShsb2dsZXZlbCAmIENUQ19MT0dMRVZFTF9ERUJVRykpCgkJcmV0dXJuOwoJcCArPSBvZmZzZXQ7CglibCA9ICooKF9fdTE2ICopIHApOwoJcCArPSAyOwoJaGVhZGVyID0gKHN0cnVjdCBsbF9oZWFkZXIgKikgcDsKCXAgLT0gMjsKCglwcmludGsoS0VSTl9ERUJVRyAiZHVtcDpcbiIpOwoJcHJpbnRrKEtFUk5fREVCVUcgImJsb2NrbGVuPSVkICUwNHhcbiIsIGJsLCBibCk7CgoJcHJpbnRrKEtFUk5fREVCVUcgImgtPmxlbmd0aD0lZCAlMDR4XG4iLCBoZWFkZXItPmxlbmd0aCwKCSAgICAgICBoZWFkZXItPmxlbmd0aCk7CglwcmludGsoS0VSTl9ERUJVRyAiaC0+dHlwZT0lMDR4XG4iLCBoZWFkZXItPnR5cGUpOwoJcHJpbnRrKEtFUk5fREVCVUcgImgtPnVudXNlZD0lMDR4XG4iLCBoZWFkZXItPnVudXNlZCk7CglpZiAoYmwgPiAxNikKCQlibCA9IDE2OwoJcHJpbnRrKEtFUk5fREVCVUcgImRhdGE6ICIpOwoJZm9yIChpID0gMDsgaSA8IGJsOyBpKyspCgkJcHJpbnRrKCIlMDJ4JXMiLCAqcCsrLCAoaSAlIDE2KSA/ICIgIiA6ICJcbjw3PiIpOwoJcHJpbnRrKCJcbiIpOwp9CiNlbHNlCnN0YXRpYyBpbmxpbmUgdm9pZApjdGNfZHVtcF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCkKewp9CiNlbmRpZgoKLyoqCiAqIFVucGFjayBhIGp1c3QgcmVjZWl2ZWQgc2tiIGFuZCBoYW5kIGl0IG92ZXIgdG8KICogdXBwZXIgbGF5ZXJzLgogKgogKiBAcGFyYW0gY2ggVGhlIGNoYW5uZWwgd2hlcmUgdGhpcyBza2IgaGFzIGJlZW4gcmVjZWl2ZWQuCiAqIEBwYXJhbSBwc2tiIFRoZSByZWNlaXZlZCBza2IuCiAqLwpzdGF0aWMgX19pbmxpbmVfXyB2b2lkCmN0Y191bnBhY2tfc2tiKHN0cnVjdCBjaGFubmVsICpjaCwgc3RydWN0IHNrX2J1ZmYgKnBza2IpCnsKCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjaC0+bmV0ZGV2OwoJc3RydWN0IGN0Y19wcml2ICpwcml2cHRyID0gKHN0cnVjdCBjdGNfcHJpdiAqKSBkZXYtPnByaXY7CglfX3UxNiBsZW4gPSAqKChfX3UxNiAqKSBwc2tiLT5kYXRhKTsKCglEQkZfVEVYVCh0cmFjZSwgNCwgX19GVU5DVElPTl9fKTsKCXNrYl9wdXQocHNrYiwgMiArIExMX0hFQURFUl9MRU5HVEgpOwoJc2tiX3B1bGwocHNrYiwgMik7Cglwc2tiLT5kZXYgPSBkZXY7Cglwc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKCXdoaWxlIChsZW4gPiAwKSB7CgkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCQlzdHJ1Y3QgbGxfaGVhZGVyICpoZWFkZXIgPSAoc3RydWN0IGxsX2hlYWRlciAqKSBwc2tiLT5kYXRhOwoKCQlza2JfcHVsbChwc2tiLCBMTF9IRUFERVJfTEVOR1RIKTsKCQlpZiAoKGNoLT5wcm90b2NvbCA9PSBDVENfUFJPVE9fUzM5MCkgJiYKCQkgICAgKGhlYWRlci0+dHlwZSAhPSBFVEhfUF9JUCkpIHsKCiNpZm5kZWYgREVCVUcKCQkgICAgICAgIGlmICghKGNoLT5sb2dmbGFncyAmIExPR19GTEFHX0lMTEVHQUxQS1QpKSB7CiNlbmRpZgoJCQkJLyoqCgkJCQkgKiBDaGVjayBwYWNrZXQgdHlwZSBvbmx5IGlmIHdlIHN0aWNrIHN0cmljdGx5CgkJCQkgKiB0byBTLzM5MCdzIHByb3RvY29sIG9mIE9TMzkwLiBUaGlzIG9ubHkKCQkJCSAqIHN1cHBvcnRzIElQLiBPdGhlcndpc2UgYWxsb3cgYW55IHBhY2tldAoJCQkJICogdHlwZS4KCQkJCSAqLwoJCQkJY3RjX3ByX3dhcm4oCgkJCQkJIiVzIElsbGVnYWwgcGFja2V0IHR5cGUgMHglMDR4IHJlY2VpdmVkLCBkcm9wcGluZ1xuIiwKCQkJCQlkZXYtPm5hbWUsIGhlYWRlci0+dHlwZSk7CgkJCQljaC0+bG9nZmxhZ3MgfD0gTE9HX0ZMQUdfSUxMRUdBTFBLVDsKI2lmbmRlZiBERUJVRwoJCQl9CiNlbmRpZgojaWZkZWYgREVCVUcKCQkJY3RjX2R1bXBfc2tiKHBza2IsIC02KTsKI2VuZGlmCgkJCXByaXZwdHItPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKCQkJcHJpdnB0ci0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CgkJCXJldHVybjsKCQl9CgkJcHNrYi0+cHJvdG9jb2wgPSBudG9ocyhoZWFkZXItPnR5cGUpOwoJCWlmIChoZWFkZXItPmxlbmd0aCA8PSBMTF9IRUFERVJfTEVOR1RIKSB7CiNpZm5kZWYgREVCVUcKCQkgICAgICAgIGlmICghKGNoLT5sb2dmbGFncyAmIExPR19GTEFHX0lMTEVHQUxTSVpFKSkgewojZW5kaWYKCQkJCWN0Y19wcl93YXJuKAoJCQkJICAgICAgICIlcyBJbGxlZ2FsIHBhY2tldCBzaXplICVkICIKCQkJCSAgICAgICAicmVjZWl2ZWQgKE1UVT0lZCBibG9ja2xlbj0lZCksICIKCQkJCSAgICAgICAiZHJvcHBpbmdcbiIsIGRldi0+bmFtZSwgaGVhZGVyLT5sZW5ndGgsCgkJCQkgICAgICAgZGV2LT5tdHUsIGxlbik7CgkJCQljaC0+bG9nZmxhZ3MgfD0gTE9HX0ZMQUdfSUxMRUdBTFNJWkU7CiNpZm5kZWYgREVCVUcKCQkJfQojZW5kaWYKI2lmZGVmIERFQlVHCgkJCWN0Y19kdW1wX3NrYihwc2tiLCAtNik7CiNlbmRpZgoJCQlwcml2cHRyLT5zdGF0cy5yeF9kcm9wcGVkKys7CgkJCXByaXZwdHItPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKCQkJcmV0dXJuOwoJCX0KCQloZWFkZXItPmxlbmd0aCAtPSBMTF9IRUFERVJfTEVOR1RIOwoJCWxlbiAtPSBMTF9IRUFERVJfTEVOR1RIOwoJCWlmICgoaGVhZGVyLT5sZW5ndGggPiBza2JfdGFpbHJvb20ocHNrYikpIHx8CgkJICAgIChoZWFkZXItPmxlbmd0aCA+IGxlbikpIHsKI2lmbmRlZiBERUJVRwoJCSAgICAgICAgaWYgKCEoY2gtPmxvZ2ZsYWdzICYgTE9HX0ZMQUdfT1ZFUlJVTikpIHsKI2VuZGlmCgkJCQljdGNfcHJfd2FybigKCQkJCQkiJXMgSWxsZWdhbCBwYWNrZXQgc2l6ZSAlZCAiCgkJCQkJIihiZXlvbmQgdGhlIGVuZCBvZiByZWNlaXZlZCBkYXRhKSwgIgoJCQkJCSJkcm9wcGluZ1xuIiwgZGV2LT5uYW1lLCBoZWFkZXItPmxlbmd0aCk7CgkJCQljaC0+bG9nZmxhZ3MgfD0gTE9HX0ZMQUdfT1ZFUlJVTjsKI2lmbmRlZiBERUJVRwoJCQl9CiNlbmRpZgojaWZkZWYgREVCVUcKCQkJY3RjX2R1bXBfc2tiKHBza2IsIC02KTsKI2VuZGlmCgkJCXByaXZwdHItPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKCQkJcHJpdnB0ci0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwoJCQlyZXR1cm47CgkJfQoJCXNrYl9wdXQocHNrYiwgaGVhZGVyLT5sZW5ndGgpOwoJCXBza2ItPm1hYy5yYXcgPSBwc2tiLT5kYXRhOwoJCWxlbiAtPSBoZWFkZXItPmxlbmd0aDsKCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBza2ItPmxlbik7CgkJaWYgKCFza2IpIHsKI2lmbmRlZiBERUJVRwoJCSAgICAgICAgaWYgKCEoY2gtPmxvZ2ZsYWdzICYgTE9HX0ZMQUdfTk9NRU0pKSB7CiNlbmRpZgoJCQkJY3RjX3ByX3dhcm4oCgkJCQkJIiVzIE91dCBvZiBtZW1vcnkgaW4gY3RjX3VucGFja19za2JcbiIsCgkJCQkJZGV2LT5uYW1lKTsKCQkJCWNoLT5sb2dmbGFncyB8PSBMT0dfRkxBR19OT01FTTsKI2lmbmRlZiBERUJVRwoJCQl9CiNlbmRpZgoJCQlwcml2cHRyLT5zdGF0cy5yeF9kcm9wcGVkKys7CgkJCXJldHVybjsKCQl9CgkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwc2tiLT5sZW4pLCBwc2tiLT5kYXRhLCBwc2tiLT5sZW4pOwoJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKCQlza2ItPmRldiA9IHBza2ItPmRldjsKCQlza2ItPnByb3RvY29sID0gcHNrYi0+cHJvdG9jb2w7CgkJcHNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CgkJbmV0aWZfcnhfbmkoc2tiKTsKCQkvKioKCQkgKiBTdWNjZXNzZnVsIHJ4OyByZXNldCBsb2dmbGFncwoJCSAqLwoJCWNoLT5sb2dmbGFncyA9IDA7CgkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKCQlwcml2cHRyLT5zdGF0cy5yeF9wYWNrZXRzKys7CgkJcHJpdnB0ci0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CgkJaWYgKGxlbiA+IDApIHsKCQkJc2tiX3B1bGwocHNrYiwgaGVhZGVyLT5sZW5ndGgpOwoJCQlpZiAoc2tiX3RhaWxyb29tKHBza2IpIDwgTExfSEVBREVSX0xFTkdUSCkgewojaWZuZGVmIERFQlVHCgkJCQlpZiAoIShjaC0+bG9nZmxhZ3MgJiBMT0dfRkxBR19PVkVSUlVOKSkgewojZW5kaWYKCQkJCQljdGNfcHJfd2FybigKCQkJCQkJIiVzIE92ZXJydW4gaW4gY3RjX3VucGFja19za2JcbiIsCgkJCQkJCWRldi0+bmFtZSk7CgkJCQkJY2gtPmxvZ2ZsYWdzIHw9IExPR19GTEFHX09WRVJSVU47CiNpZm5kZWYgREVCVUcKCQkJCX0KI2VuZGlmCgkJCQlyZXR1cm47CgkJCX0KCQkJc2tiX3B1dChwc2tiLCBMTF9IRUFERVJfTEVOR1RIKTsKCQl9Cgl9Cn0KCi8qKgogKiBDaGVjayByZXR1cm4gY29kZSBvZiBhIHByZWNlZWRpbmcgY2N3X2RldmljZSBjYWxsLCBoYWx0X0lPIGV0Yy4uLgogKgogKiBAcGFyYW0gY2ggICAgICAgICAgVGhlIGNoYW5uZWwsIHRoZSBlcnJvciBiZWxvbmdzIHRvLgogKiBAcGFyYW0gcmV0dXJuX2NvZGUgVGhlIGVycm9yIGNvZGUgdG8gaW5zcGVjdC4KICovCnN0YXRpYyB2b2lkIGlubGluZQpjY3dfY2hlY2tfcmV0dXJuX2NvZGUoc3RydWN0IGNoYW5uZWwgKmNoLCBpbnQgcmV0dXJuX2NvZGUsIGNoYXIgKm1zZykKewoJREJGX1RFWFQodHJhY2UsIDUsIF9fRlVOQ1RJT05fXyk7Cglzd2l0Y2ggKHJldHVybl9jb2RlKSB7CgkJY2FzZSAwOgoJCQlmc21fZXZlbnQoY2gtPmZzbSwgQ0hfRVZFTlRfSU9fU1VDQ0VTUywgY2gpOwoJCQlicmVhazsKCQljYXNlIC1FQlVTWToKCQkJY3RjX3ByX3dhcm4oIiVzICglcyk6IEJ1c3kgIVxuIiwgY2gtPmlkLCBtc2cpOwoJCQlmc21fZXZlbnQoY2gtPmZzbSwgQ0hfRVZFTlRfSU9fRUJVU1ksIGNoKTsKCQkJYnJlYWs7CgkJY2FzZSAtRU5PREVWOgoJCQljdGNfcHJfZW1lcmcoIiVzICglcyk6IEludmFsaWQgZGV2aWNlIGNhbGxlZCBmb3IgSU9cbiIsCgkJCQkgICAgIGNoLT5pZCwgbXNnKTsKCQkJZnNtX2V2ZW50KGNoLT5mc20sIENIX0VWRU5UX0lPX0VOT0RFViwgY2gpOwoJCQlicmVhazsKCQljYXNlIC1FSU86CgkJCWN0Y19wcl9lbWVyZygiJXMgKCVzKTogU3RhdHVzIHBlbmRpbmcuLi4gXG4iLAoJCQkJICAgICBjaC0+aWQsIG1zZyk7CgkJCWZzbV9ldmVudChjaC0+ZnNtLCBDSF9FVkVOVF9JT19FSU8sIGNoKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJY3RjX3ByX2VtZXJnKCIlcyAoJXMpOiBVbmtub3duIGVycm9yIGluIGRvX0lPICUwNHhcbiIsCgkJCQkgICAgIGNoLT5pZCwgbXNnLCByZXR1cm5fY29kZSk7CgkJCWZzbV9ldmVudChjaC0+ZnNtLCBDSF9FVkVOVF9JT19VTktOT1dOLCBjaCk7Cgl9Cn0KCi8qKgogKiBDaGVjayBzZW5zZSBvZiBhIHVuaXQgY2hlY2suCiAqCiAqIEBwYXJhbSBjaCAgICBUaGUgY2hhbm5lbCwgdGhlIHNlbnNlIGNvZGUgYmVsb25ncyB0by4KICogQHBhcmFtIHNlbnNlIFRoZSBzZW5zZSBjb2RlIHRvIGluc3BlY3QuCiAqLwpzdGF0aWMgdm9pZCBpbmxpbmUKY2N3X3VuaXRfY2hlY2soc3RydWN0IGNoYW5uZWwgKmNoLCB1bnNpZ25lZCBjaGFyIHNlbnNlKQp7CglEQkZfVEVYVCh0cmFjZSwgNSwgX19GVU5DVElPTl9fKTsKCWlmIChzZW5zZSAmIFNOUzBfSU5URVJWRU5USU9OX1JFUSkgewoJCWlmIChzZW5zZSAmIDB4MDEpIHsKCQkJY3RjX3ByX2RlYnVnKCIlczogSW50ZXJmYWNlIGRpc2MuIG9yIFNlbC4gcmVzZXQgIgoJCQkJCSIocmVtb3RlKVxuIiwgY2gtPmlkKTsKCQkJZnNtX2V2ZW50KGNoLT5mc20sIENIX0VWRU5UX1VDX1JDUkVTRVQsIGNoKTsKCQl9IGVsc2UgewoJCQljdGNfcHJfZGVidWcoIiVzOiBTeXN0ZW0gcmVzZXQgKHJlbW90ZSlcbiIsIGNoLT5pZCk7CgkJCWZzbV9ldmVudChjaC0+ZnNtLCBDSF9FVkVOVF9VQ19SU1JFU0VULCBjaCk7CgkJfQoJfSBlbHNlIGlmIChzZW5zZSAmIFNOUzBfRVFVSVBNRU5UX0NIRUNLKSB7CgkJaWYgKHNlbnNlICYgU05TMF9CVVNfT1VUX0NIRUNLKSB7CgkJCWN0Y19wcl93YXJuKCIlczogSGFyZHdhcmUgbWFsZnVuY3Rpb24gKHJlbW90ZSlcbiIsCgkJCQkgICAgY2gtPmlkKTsKCQkJZnNtX2V2ZW50KGNoLT5mc20sIENIX0VWRU5UX1VDX0hXRkFJTCwgY2gpOwoJCX0gZWxzZSB7CgkJCWN0Y19wcl93YXJuKCIlczogUmVhZC1kYXRhIHBhcml0eSBlcnJvciAocmVtb3RlKVxuIiwKCQkJCSAgICBjaC0+aWQpOwoJCQlmc21fZXZlbnQoY2gtPmZzbSwgQ0hfRVZFTlRfVUNfUlhQQVJJVFksIGNoKTsKCQl9Cgl9IGVsc2UgaWYgKHNlbnNlICYgU05TMF9CVVNfT1VUX0NIRUNLKSB7CgkJaWYgKHNlbnNlICYgMHgwNCkgewoJCQljdGNfcHJfd2FybigiJXM6IERhdGEtc3RyZWFtaW5nIHRpbWVvdXQpXG4iLCBjaC0+aWQpOwoJCQlmc21fZXZlbnQoY2gtPmZzbSwgQ0hfRVZFTlRfVUNfVFhUSU1FT1VULCBjaCk7CgkJfSBlbHNlIHsKCQkJY3RjX3ByX3dhcm4oIiVzOiBEYXRhLXRyYW5zZmVyIHBhcml0eSBlcnJvclxuIiwgY2gtPmlkKTsKCQkJZnNtX2V2ZW50KGNoLT5mc20sIENIX0VWRU5UX1VDX1RYUEFSSVRZLCBjaCk7CgkJfQoJfSBlbHNlIGlmIChzZW5zZSAmIFNOUzBfQ01EX1JFSkVDVCkgewoJCWN0Y19wcl93YXJuKCIlczogQ29tbWFuZCByZWplY3RcbiIsIGNoLT5pZCk7Cgl9IGVsc2UgaWYgKHNlbnNlID09IDApIHsKCQljdGNfcHJfZGVidWcoIiVzOiBVbml0IGNoZWNrIFpFUk9cbiIsIGNoLT5pZCk7CgkJZnNtX2V2ZW50KGNoLT5mc20sIENIX0VWRU5UX1VDX1pFUk8sIGNoKTsKCX0gZWxzZSB7CgkJY3RjX3ByX3dhcm4oIiVzOiBVbml0IENoZWNrIHdpdGggc2Vuc2UgY29kZTogJTAyeFxuIiwKCQkJICAgIGNoLT5pZCwgc2Vuc2UpOwoJCWZzbV9ldmVudChjaC0+ZnNtLCBDSF9FVkVOVF9VQ19VTktOT1dOLCBjaCk7Cgl9Cn0KCnN0YXRpYyB2b2lkCmN0Y19wdXJnZV9za2JfcXVldWUoc3RydWN0IHNrX2J1ZmZfaGVhZCAqcSkKewoJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCglEQkZfVEVYVCh0cmFjZSwgNSwgX19GVU5DVElPTl9fKTsKCgl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKHEpKSkgewoJCWF0b21pY19kZWMoJnNrYi0+dXNlcnMpOwoJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7Cgl9Cn0KCnN0YXRpYyBfX2lubGluZV9fIGludApjdGNfY2hlY2thbGxvY19idWZmZXIoc3RydWN0IGNoYW5uZWwgKmNoLCBpbnQgd2FybikKewoJREJGX1RFWFQodHJhY2UsIDUsIF9fRlVOQ1RJT05fXyk7CglpZiAoKGNoLT50cmFuc19za2IgPT0gTlVMTCkgfHwKCSAgICAoY2gtPmZsYWdzICYgQ0hBTk5FTF9GTEFHU19CVUZTSVpFX0NIQU5HRUQpKSB7CgkJaWYgKGNoLT50cmFuc19za2IgIT0gTlVMTCkKCQkJZGV2X2tmcmVlX3NrYihjaC0+dHJhbnNfc2tiKTsKCQljbGVhcl9ub3JtYWxpemVkX2NkYSgmY2gtPmNjd1sxXSk7CgkJY2gtPnRyYW5zX3NrYiA9IF9fZGV2X2FsbG9jX3NrYihjaC0+bWF4X2J1ZnNpemUsCgkJCQkJCUdGUF9BVE9NSUMgfCBHRlBfRE1BKTsKCQlpZiAoY2gtPnRyYW5zX3NrYiA9PSBOVUxMKSB7CgkJCWlmICh3YXJuKQoJCQkJY3RjX3ByX3dhcm4oCgkJCQkJIiVzOiBDb3VsZG4ndCBhbGxvYyAlcyB0cmFuc19za2JcbiIsCgkJCQkJY2gtPmlkLAoJCQkJCShDSEFOTkVMX0RJUkVDVElPTihjaC0+ZmxhZ3MpID09IFJFQUQpID8KCQkJCQkiUlgiIDogIlRYIik7CgkJCXJldHVybiAtRU5PTUVNOwoJCX0KCQljaC0+Y2N3WzFdLmNvdW50ID0gY2gtPm1heF9idWZzaXplOwoJCWlmIChzZXRfbm9ybWFsaXplZF9jZGEoJmNoLT5jY3dbMV0sIGNoLT50cmFuc19za2ItPmRhdGEpKSB7CgkJCWRldl9rZnJlZV9za2IoY2gtPnRyYW5zX3NrYik7CgkJCWNoLT50cmFuc19za2IgPSBOVUxMOwoJCQlpZiAod2FybikKCQkJCWN0Y19wcl93YXJuKAoJCQkJCSIlczogc2V0X25vcm1hbGl6ZWRfY2RhIGZvciAlcyAiCgkJCQkJInRyYW5zX3NrYiBmYWlsZWQsIGRyb3BwaW5nIHBhY2tldHNcbiIsCgkJCQkJY2gtPmlkLAoJCQkJCShDSEFOTkVMX0RJUkVDVElPTihjaC0+ZmxhZ3MpID09IFJFQUQpID8KCQkJCQkiUlgiIDogIlRYIik7CgkJCXJldHVybiAtRU5PTUVNOwoJCX0KCQljaC0+Y2N3WzFdLmNvdW50ID0gMDsKCQljaC0+dHJhbnNfc2tiX2RhdGEgPSBjaC0+dHJhbnNfc2tiLT5kYXRhOwoJCWNoLT5mbGFncyAmPSB+Q0hBTk5FTF9GTEFHU19CVUZTSVpFX0NIQU5HRUQ7Cgl9CglyZXR1cm4gMDsKfQoKLyoqCiAqIER1bW15IE5PUCBhY3Rpb24gZm9yIHN0YXRlbWFjaGluZXMKICovCnN0YXRpYyB2b2lkCmZzbV9hY3Rpb25fbm9wKGZzbV9pbnN0YW5jZSAqIGZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKewp9CgovKioKICogQWN0aW9ucyBmb3IgY2hhbm5lbCAtIHN0YXRlbWFjaGluZXMuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKgogKiBOb3JtYWwgZGF0YSBoYXMgYmVlbiBzZW5kLiBGcmVlIHRoZSBjb3JyZXNwb25kaW5nCiAqIHNrYiAoaXQncyBpbiBpb19xdWV1ZSksIHJlc2V0IGRldi0+dGJ1c3kgYW5kCiAqIHJldmVydCB0byBpZGxlIHN0YXRlLgogKgogKiBAcGFyYW0gZmkgICAgQW4gaW5zdGFuY2Ugb2YgYSBjaGFubmVsIHN0YXRlbWFjaGluZS4KICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCwganVzdCBoYXBwZW5lZC4KICogQHBhcmFtIGFyZyAgIEdlbmVyaWMgcG9pbnRlciwgY2FzdGVkIGZyb20gY2hhbm5lbCAqIHVwb24gY2FsbC4KICovCnN0YXRpYyB2b2lkCmNoX2FjdGlvbl90eGRvbmUoZnNtX2luc3RhbmNlICogZmksIGludCBldmVudCwgdm9pZCAqYXJnKQp7CglzdHJ1Y3QgY2hhbm5lbCAqY2ggPSAoc3RydWN0IGNoYW5uZWwgKikgYXJnOwoJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNoLT5uZXRkZXY7CglzdHJ1Y3QgY3RjX3ByaXYgKnByaXZwdHIgPSBkZXYtPnByaXY7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJaW50IGZpcnN0ID0gMTsKCWludCBpOwoJdW5zaWduZWQgbG9uZyBkdXJhdGlvbjsKCXN0cnVjdCB0aW1lc3BlYyBkb25lX3N0YW1wID0geHRpbWU7CgoJREJGX1RFWFQodHJhY2UsIDQsIF9fRlVOQ1RJT05fXyk7CgoJZHVyYXRpb24gPQoJICAgIChkb25lX3N0YW1wLnR2X3NlYyAtIGNoLT5wcm9mLnNlbmRfc3RhbXAudHZfc2VjKSAqIDEwMDAwMDAgKwoJICAgIChkb25lX3N0YW1wLnR2X25zZWMgLSBjaC0+cHJvZi5zZW5kX3N0YW1wLnR2X25zZWMpIC8gMTAwMDsKCWlmIChkdXJhdGlvbiA+IGNoLT5wcm9mLnR4X3RpbWUpCgkJY2gtPnByb2YudHhfdGltZSA9IGR1cmF0aW9uOwoKCWlmIChjaC0+aXJiLT5zY3N3LmNvdW50ICE9IDApCgkJY3RjX3ByX2RlYnVnKCIlczogVFggbm90IGNvbXBsZXRlLCByZW1haW5pbmcgJWQgYnl0ZXNcbiIsCgkJCSAgICAgZGV2LT5uYW1lLCBjaC0+aXJiLT5zY3N3LmNvdW50KTsKCWZzbV9kZWx0aW1lcigmY2gtPnRpbWVyKTsKCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmNoLT5pb19xdWV1ZSkpKSB7CgkJcHJpdnB0ci0+c3RhdHMudHhfcGFja2V0cysrOwoJCXByaXZwdHItPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuIC0gTExfSEVBREVSX0xFTkdUSDsKCQlpZiAoZmlyc3QpIHsKCQkJcHJpdnB0ci0+c3RhdHMudHhfYnl0ZXMgKz0gMjsKCQkJZmlyc3QgPSAwOwoJCX0KCQlhdG9taWNfZGVjKCZza2ItPnVzZXJzKTsKCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwoJfQoJc3Bpbl9sb2NrKCZjaC0+Y29sbGVjdF9sb2NrKTsKCWNsZWFyX25vcm1hbGl6ZWRfY2RhKCZjaC0+Y2N3WzRdKTsKCWlmIChjaC0+Y29sbGVjdF9sZW4gPiAwKSB7CgkJaW50IHJjOwoKCQlpZiAoY3RjX2NoZWNrYWxsb2NfYnVmZmVyKGNoLCAxKSkgewoJCQlzcGluX3VubG9jaygmY2gtPmNvbGxlY3RfbG9jayk7CgkJCXJldHVybjsKCQl9CgkJY2gtPnRyYW5zX3NrYi0+dGFpbCA9IGNoLT50cmFuc19za2ItPmRhdGEgPSBjaC0+dHJhbnNfc2tiX2RhdGE7CgkJY2gtPnRyYW5zX3NrYi0+bGVuID0gMDsKCQlpZiAoY2gtPnByb2YubWF4bXVsdGkgPCAoY2gtPmNvbGxlY3RfbGVuICsgMikpCgkJCWNoLT5wcm9mLm1heG11bHRpID0gY2gtPmNvbGxlY3RfbGVuICsgMjsKCQlpZiAoY2gtPnByb2YubWF4Y3F1ZXVlIDwgc2tiX3F1ZXVlX2xlbigmY2gtPmNvbGxlY3RfcXVldWUpKQoJCQljaC0+cHJvZi5tYXhjcXVldWUgPSBza2JfcXVldWVfbGVuKCZjaC0+Y29sbGVjdF9xdWV1ZSk7CgkJKigoX191MTYgKikgc2tiX3B1dChjaC0+dHJhbnNfc2tiLCAyKSkgPSBjaC0+Y29sbGVjdF9sZW4gKyAyOwoJCWkgPSAwOwoJCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmNoLT5jb2xsZWN0X3F1ZXVlKSkpIHsKCQkJbWVtY3B5KHNrYl9wdXQoY2gtPnRyYW5zX3NrYiwgc2tiLT5sZW4pLCBza2ItPmRhdGEsCgkJCSAgICAgICBza2ItPmxlbik7CgkJCXByaXZwdHItPnN0YXRzLnR4X3BhY2tldHMrKzsKCQkJcHJpdnB0ci0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW4gLSBMTF9IRUFERVJfTEVOR1RIOwoJCQlhdG9taWNfZGVjKCZza2ItPnVzZXJzKTsKCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKCQkJaSsrOwoJCX0KCQljaC0+Y29sbGVjdF9sZW4gPSAwOwoJCXNwaW5fdW5sb2NrKCZjaC0+Y29sbGVjdF9sb2NrKTsKCQljaC0+Y2N3WzFdLmNvdW50ID0gY2gtPnRyYW5zX3NrYi0+bGVuOwoJCWZzbV9hZGR0aW1lcigmY2gtPnRpbWVyLCBDVENfVElNRU9VVF81U0VDLCBDSF9FVkVOVF9USU1FUiwgY2gpOwoJCWNoLT5wcm9mLnNlbmRfc3RhbXAgPSB4dGltZTsKCQlyYyA9IGNjd19kZXZpY2Vfc3RhcnQoY2gtPmNkZXYsICZjaC0+Y2N3WzBdLAoJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGNoLCAweGZmLCAwKTsKCQljaC0+cHJvZi5kb2lvc19tdWx0aSsrOwoJCWlmIChyYyAhPSAwKSB7CgkJCXByaXZwdHItPnN0YXRzLnR4X2Ryb3BwZWQgKz0gaTsKCQkJcHJpdnB0ci0+c3RhdHMudHhfZXJyb3JzICs9IGk7CgkJCWZzbV9kZWx0aW1lcigmY2gtPnRpbWVyKTsKCQkJY2N3X2NoZWNrX3JldHVybl9jb2RlKGNoLCByYywgImNoYWluZWQgVFgiKTsKCQl9Cgl9IGVsc2UgewoJCXNwaW5fdW5sb2NrKCZjaC0+Y29sbGVjdF9sb2NrKTsKCQlmc21fbmV3c3RhdGUoZmksIENIX1NUQVRFX1RYSURMRSk7Cgl9CgljdGNfY2xlYXJfYnVzeShkZXYpOwp9CgovKioKICogSW5pdGlhbCBkYXRhIGlzIHNlbnQuCiAqIE5vdGlmeSBkZXZpY2Ugc3RhdGVtYWNoaW5lIHRoYXQgd2UgYXJlIHVwIGFuZAogKiBydW5uaW5nLgogKgogKiBAcGFyYW0gZmkgICAgQW4gaW5zdGFuY2Ugb2YgYSBjaGFubmVsIHN0YXRlbWFjaGluZS4KICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCwganVzdCBoYXBwZW5lZC4KICogQHBhcmFtIGFyZyAgIEdlbmVyaWMgcG9pbnRlciwgY2FzdGVkIGZyb20gY2hhbm5lbCAqIHVwb24gY2FsbC4KICovCnN0YXRpYyB2b2lkCmNoX2FjdGlvbl90eGlkbGUoZnNtX2luc3RhbmNlICogZmksIGludCBldmVudCwgdm9pZCAqYXJnKQp7CglzdHJ1Y3QgY2hhbm5lbCAqY2ggPSAoc3RydWN0IGNoYW5uZWwgKikgYXJnOwoKCURCRl9URVhUKHRyYWNlLCA0LCBfX0ZVTkNUSU9OX18pOwoJZnNtX2RlbHRpbWVyKCZjaC0+dGltZXIpOwoJZnNtX25ld3N0YXRlKGZpLCBDSF9TVEFURV9UWElETEUpOwoJZnNtX2V2ZW50KCgoc3RydWN0IGN0Y19wcml2ICopIGNoLT5uZXRkZXYtPnByaXYpLT5mc20sIERFVl9FVkVOVF9UWFVQLAoJCSAgY2gtPm5ldGRldik7Cn0KCi8qKgogKiBHb3Qgbm9ybWFsIGRhdGEsIGNoZWNrIGZvciBzYW5pdHksIHF1ZXVlIGl0IHVwLCBhbGxvY2F0ZSBuZXcgYnVmZmVyCiAqIHRyaWdnZXIgYm90dG9tIGhhbGYsIGFuZCBpbml0aWF0ZSBuZXh0IHJlYWQuCiAqCiAqIEBwYXJhbSBmaSAgICBBbiBpbnN0YW5jZSBvZiBhIGNoYW5uZWwgc3RhdGVtYWNoaW5lLgogKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50LCBqdXN0IGhhcHBlbmVkLgogKiBAcGFyYW0gYXJnICAgR2VuZXJpYyBwb2ludGVyLCBjYXN0ZWQgZnJvbSBjaGFubmVsICogdXBvbiBjYWxsLgogKi8Kc3RhdGljIHZvaWQKY2hfYWN0aW9uX3J4KGZzbV9pbnN0YW5jZSAqIGZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKewoJc3RydWN0IGNoYW5uZWwgKmNoID0gKHN0cnVjdCBjaGFubmVsICopIGFyZzsKCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjaC0+bmV0ZGV2OwoJc3RydWN0IGN0Y19wcml2ICpwcml2cHRyID0gZGV2LT5wcml2OwoJaW50IGxlbiA9IGNoLT5tYXhfYnVmc2l6ZSAtIGNoLT5pcmItPnNjc3cuY291bnQ7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gY2gtPnRyYW5zX3NrYjsKCV9fdTE2IGJsb2NrX2xlbiA9ICooKF9fdTE2ICopIHNrYi0+ZGF0YSk7CglpbnQgY2hlY2tfbGVuOwoJaW50IHJjOwoKCURCRl9URVhUKHRyYWNlLCA0LCBfX0ZVTkNUSU9OX18pOwoJZnNtX2RlbHRpbWVyKCZjaC0+dGltZXIpOwoJaWYgKGxlbiA8IDgpIHsKCQljdGNfcHJfZGVidWcoIiVzOiBnb3QgcGFja2V0IHdpdGggbGVuZ3RoICVkIDwgOFxuIiwKCQkJICAgICBkZXYtPm5hbWUsIGxlbik7CgkJcHJpdnB0ci0+c3RhdHMucnhfZHJvcHBlZCsrOwoJCXByaXZwdHItPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKCQlnb3RvIGFnYWluOwoJfQoJaWYgKGxlbiA+IGNoLT5tYXhfYnVmc2l6ZSkgewoJCWN0Y19wcl9kZWJ1ZygiJXM6IGdvdCBwYWNrZXQgd2l0aCBsZW5ndGggJWQgPiAlZFxuIiwKCQkJICAgICBkZXYtPm5hbWUsIGxlbiwgY2gtPm1heF9idWZzaXplKTsKCQlwcml2cHRyLT5zdGF0cy5yeF9kcm9wcGVkKys7CgkJcHJpdnB0ci0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwoJCWdvdG8gYWdhaW47Cgl9CgoJLyoqCgkgKiBWTSBUQ1Agc2VlbXMgdG8gaGF2ZSBhIGJ1ZyBzZW5kaW5nIDIgdHJhaWxpbmcgYnl0ZXMgb2YgZ2FyYmFnZS4KCSAqLwoJc3dpdGNoIChjaC0+cHJvdG9jb2wpIHsKCQljYXNlIENUQ19QUk9UT19TMzkwOgoJCWNhc2UgQ1RDX1BST1RPX09TMzkwOgoJCQljaGVja19sZW4gPSBibG9ja19sZW4gKyAyOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQljaGVja19sZW4gPSBibG9ja19sZW47CgkJCWJyZWFrOwoJfQoJaWYgKChsZW4gPCBibG9ja19sZW4pIHx8IChsZW4gPiBjaGVja19sZW4pKSB7CgkJY3RjX3ByX2RlYnVnKCIlczogZ290IGJsb2NrIGxlbmd0aCAlZCAhPSByeCBsZW5ndGggJWRcbiIsCgkJCSAgICAgZGV2LT5uYW1lLCBibG9ja19sZW4sIGxlbik7CiNpZmRlZiBERUJVRwoJCWN0Y19kdW1wX3NrYihza2IsIDApOwojZW5kaWYKCQkqKChfX3UxNiAqKSBza2ItPmRhdGEpID0gbGVuOwoJCXByaXZwdHItPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKCQlwcml2cHRyLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CgkJZ290byBhZ2FpbjsKCX0KCWJsb2NrX2xlbiAtPSAyOwoJaWYgKGJsb2NrX2xlbiA+IDApIHsKCQkqKChfX3UxNiAqKSBza2ItPmRhdGEpID0gYmxvY2tfbGVuOwoJCWN0Y191bnBhY2tfc2tiKGNoLCBza2IpOwoJfQogYWdhaW46Cglza2ItPmRhdGEgPSBza2ItPnRhaWwgPSBjaC0+dHJhbnNfc2tiX2RhdGE7Cglza2ItPmxlbiA9IDA7CglpZiAoY3RjX2NoZWNrYWxsb2NfYnVmZmVyKGNoLCAxKSkKCQlyZXR1cm47CgljaC0+Y2N3WzFdLmNvdW50ID0gY2gtPm1heF9idWZzaXplOwoJcmMgPSBjY3dfZGV2aWNlX3N0YXJ0KGNoLT5jZGV2LCAmY2gtPmNjd1swXSwgKHVuc2lnbmVkIGxvbmcpIGNoLCAweGZmLCAwKTsKCWlmIChyYyAhPSAwKQoJCWNjd19jaGVja19yZXR1cm5fY29kZShjaCwgcmMsICJub3JtYWwgUlgiKTsKfQoKc3RhdGljIHZvaWQgY2hfYWN0aW9uX3J4aWRsZShmc21faW5zdGFuY2UgKiBmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpOwoKLyoqCiAqIEluaXRpYWxpemUgY29ubmVjdGlvbiBieSBzZW5kaW5nIGEgX191MTYgb2YgdmFsdWUgMC4KICoKICogQHBhcmFtIGZpICAgIEFuIGluc3RhbmNlIG9mIGEgY2hhbm5lbCBzdGF0ZW1hY2hpbmUuCiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQsIGp1c3QgaGFwcGVuZWQuCiAqIEBwYXJhbSBhcmcgICBHZW5lcmljIHBvaW50ZXIsIGNhc3RlZCBmcm9tIGNoYW5uZWwgKiB1cG9uIGNhbGwuCiAqLwpzdGF0aWMgdm9pZApjaF9hY3Rpb25fZmlyc3Rpbyhmc21faW5zdGFuY2UgKiBmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCnsKCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKSBhcmc7CglpbnQgcmM7CgoJREJGX1RFWFQodHJhY2UsIDQsIF9fRlVOQ1RJT05fXyk7CgoJaWYgKGZzbV9nZXRzdGF0ZShmaSkgPT0gQ0hfU1RBVEVfVFhJRExFKQoJCWN0Y19wcl9kZWJ1ZygiJXM6IHJlbW90ZSBzaWRlIGlzc3VlZCBSRUFEPywgaW5pdCAuLi5cbiIsIGNoLT5pZCk7Cglmc21fZGVsdGltZXIoJmNoLT50aW1lcik7CglpZiAoY3RjX2NoZWNrYWxsb2NfYnVmZmVyKGNoLCAxKSkKCQlyZXR1cm47CglpZiAoKGZzbV9nZXRzdGF0ZShmaSkgPT0gQ0hfU1RBVEVfU0VUVVBXQUlUKSAmJgoJICAgIChjaC0+cHJvdG9jb2wgPT0gQ1RDX1BST1RPX09TMzkwKSkgewoJCS8qIE9TLzM5MCByZXNwLiB6L09TICovCgkJaWYgKENIQU5ORUxfRElSRUNUSU9OKGNoLT5mbGFncykgPT0gUkVBRCkgewoJCQkqKChfX3UxNiAqKSBjaC0+dHJhbnNfc2tiLT5kYXRhKSA9IENUQ19JTklUSUFMX0JMT0NLTEVOOwoJCQlmc21fYWRkdGltZXIoJmNoLT50aW1lciwgQ1RDX1RJTUVPVVRfNVNFQywKCQkJCSAgICAgQ0hfRVZFTlRfVElNRVIsIGNoKTsKCQkJY2hfYWN0aW9uX3J4aWRsZShmaSwgZXZlbnQsIGFyZyk7CgkJfSBlbHNlIHsKCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNoLT5uZXRkZXY7CgkJCWZzbV9uZXdzdGF0ZShmaSwgQ0hfU1RBVEVfVFhJRExFKTsKCQkJZnNtX2V2ZW50KCgoc3RydWN0IGN0Y19wcml2ICopIGRldi0+cHJpdiktPmZzbSwKCQkJCSAgREVWX0VWRU5UX1RYVVAsIGRldik7CgkJfQoJCXJldHVybjsKCX0KCgkvKioKCSAqIERvbrR0IHNldHVwIGEgdGltZXIgZm9yIHJlY2VpdmluZyB0aGUgaW5pdGlhbCBSWCBmcmFtZQoJICogaWYgaW4gY29tcGF0aWJpbGl0eSBtb2RlLCBzaW5jZSBWTSBUQ1AgZGVsYXlzIHRoZSBpbml0aWFsCgkgKiBmcmFtZSB1bnRpbCBpdCBoYXMgc29tZSBkYXRhIHRvIHNlbmQuCgkgKi8KCWlmICgoQ0hBTk5FTF9ESVJFQ1RJT04oY2gtPmZsYWdzKSA9PSBXUklURSkgfHwKCSAgICAoY2gtPnByb3RvY29sICE9IENUQ19QUk9UT19TMzkwKSkKCQlmc21fYWRkdGltZXIoJmNoLT50aW1lciwgQ1RDX1RJTUVPVVRfNVNFQywgQ0hfRVZFTlRfVElNRVIsIGNoKTsKCgkqKChfX3UxNiAqKSBjaC0+dHJhbnNfc2tiLT5kYXRhKSA9IENUQ19JTklUSUFMX0JMT0NLTEVOOwoJY2gtPmNjd1sxXS5jb3VudCA9IDI7CS8qIFRyYW5zZmVyIG9ubHkgbGVuZ3RoICovCgoJZnNtX25ld3N0YXRlKGZpLCAoQ0hBTk5FTF9ESVJFQ1RJT04oY2gtPmZsYWdzKSA9PSBSRUFEKQoJCSAgICAgPyBDSF9TVEFURV9SWElOSVQgOiBDSF9TVEFURV9UWElOSVQpOwoJcmMgPSBjY3dfZGV2aWNlX3N0YXJ0KGNoLT5jZGV2LCAmY2gtPmNjd1swXSwgKHVuc2lnbmVkIGxvbmcpIGNoLCAweGZmLCAwKTsKCWlmIChyYyAhPSAwKSB7CgkJZnNtX2RlbHRpbWVyKCZjaC0+dGltZXIpOwoJCWZzbV9uZXdzdGF0ZShmaSwgQ0hfU1RBVEVfU0VUVVBXQUlUKTsKCQljY3dfY2hlY2tfcmV0dXJuX2NvZGUoY2gsIHJjLCAiaW5pdCBJTyIpOwoJfQoJLyoqCgkgKiBJZiBpbiBjb21wYXRpYmlsaXR5IG1vZGUgc2luY2Ugd2UgZG9utHQgc2V0dXAgYSB0aW1lciwgd2UKCSAqIGFsc28gc2lnbmFsIFJYIGNoYW5uZWwgdXAgaW1tZWRpYXRlbHkuIFRoaXMgZW5hYmxlcyB1cwoJICogdG8gc2VuZCBwYWNrZXRzIGVhcmx5IHdoaWNoIGluIHR1cm4gdXN1YWxseSB0cmlnZ2VycyBzb21lCgkgKiByZXBseSBmcm9tIFZNIFRDUCB3aGljaCBicmluZ3MgdXAgdGhlIFJYIGNoYW5uZWwgdG8gaXS0cwoJICogZmluYWwgc3RhdGUuCgkgKi8KCWlmICgoQ0hBTk5FTF9ESVJFQ1RJT04oY2gtPmZsYWdzKSA9PSBSRUFEKSAmJgoJICAgIChjaC0+cHJvdG9jb2wgPT0gQ1RDX1BST1RPX1MzOTApKSB7CgkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNoLT5uZXRkZXY7CgkJZnNtX2V2ZW50KCgoc3RydWN0IGN0Y19wcml2ICopIGRldi0+cHJpdiktPmZzbSwgREVWX0VWRU5UX1JYVVAsCgkJCSAgZGV2KTsKCX0KfQoKLyoqCiAqIEdvdCBpbml0aWFsIGRhdGEsIGNoZWNrIGl0LiBJZiBPSywKICogbm90aWZ5IGRldmljZSBzdGF0ZW1hY2hpbmUgdGhhdCB3ZSBhcmUgdXAgYW5kCiAqIHJ1bm5pbmcuCiAqCiAqIEBwYXJhbSBmaSAgICBBbiBpbnN0YW5jZSBvZiBhIGNoYW5uZWwgc3RhdGVtYWNoaW5lLgogKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50LCBqdXN0IGhhcHBlbmVkLgogKiBAcGFyYW0gYXJnICAgR2VuZXJpYyBwb2ludGVyLCBjYXN0ZWQgZnJvbSBjaGFubmVsICogdXBvbiBjYWxsLgogKi8Kc3RhdGljIHZvaWQKY2hfYWN0aW9uX3J4aWRsZShmc21faW5zdGFuY2UgKiBmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCnsKCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKSBhcmc7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2gtPm5ldGRldjsKCV9fdTE2IGJ1ZmxlbjsKCWludCByYzsKCglEQkZfVEVYVCh0cmFjZSwgNCwgX19GVU5DVElPTl9fKTsKCWZzbV9kZWx0aW1lcigmY2gtPnRpbWVyKTsKCWJ1ZmxlbiA9ICooKF9fdTE2ICopIGNoLT50cmFuc19za2ItPmRhdGEpOwojaWZkZWYgREVCVUcKCWN0Y19wcl9kZWJ1ZygiJXM6IEluaXRpYWwgUlggY291bnQgJWRcbiIsIGRldi0+bmFtZSwgYnVmbGVuKTsKI2VuZGlmCglpZiAoYnVmbGVuID49IENUQ19JTklUSUFMX0JMT0NLTEVOKSB7CgkJaWYgKGN0Y19jaGVja2FsbG9jX2J1ZmZlcihjaCwgMSkpCgkJCXJldHVybjsKCQljaC0+Y2N3WzFdLmNvdW50ID0gY2gtPm1heF9idWZzaXplOwoJCWZzbV9uZXdzdGF0ZShmaSwgQ0hfU1RBVEVfUlhJRExFKTsKCQlyYyA9IGNjd19kZXZpY2Vfc3RhcnQoY2gtPmNkZXYsICZjaC0+Y2N3WzBdLAoJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGNoLCAweGZmLCAwKTsKCQlpZiAocmMgIT0gMCkgewoJCQlmc21fbmV3c3RhdGUoZmksIENIX1NUQVRFX1JYSU5JVCk7CgkJCWNjd19jaGVja19yZXR1cm5fY29kZShjaCwgcmMsICJpbml0aWFsIFJYIik7CgkJfSBlbHNlCgkJCWZzbV9ldmVudCgoKHN0cnVjdCBjdGNfcHJpdiAqKSBkZXYtPnByaXYpLT5mc20sCgkJCQkgIERFVl9FVkVOVF9SWFVQLCBkZXYpOwoJfSBlbHNlIHsKCQljdGNfcHJfZGVidWcoIiVzOiBJbml0aWFsIFJYIGNvdW50ICVkIG5vdCAlZFxuIiwKCQkJICAgICBkZXYtPm5hbWUsIGJ1ZmxlbiwgQ1RDX0lOSVRJQUxfQkxPQ0tMRU4pOwoJCWNoX2FjdGlvbl9maXJzdGlvKGZpLCBldmVudCwgYXJnKTsKCX0KfQoKLyoqCiAqIFNldCBjaGFubmVsIGludG8gZXh0ZW5kZWQgbW9kZS4KICoKICogQHBhcmFtIGZpICAgIEFuIGluc3RhbmNlIG9mIGEgY2hhbm5lbCBzdGF0ZW1hY2hpbmUuCiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQsIGp1c3QgaGFwcGVuZWQuCiAqIEBwYXJhbSBhcmcgICBHZW5lcmljIHBvaW50ZXIsIGNhc3RlZCBmcm9tIGNoYW5uZWwgKiB1cG9uIGNhbGwuCiAqLwpzdGF0aWMgdm9pZApjaF9hY3Rpb25fc2V0bW9kZShmc21faW5zdGFuY2UgKiBmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCnsKCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKSBhcmc7CglpbnQgcmM7Cgl1bnNpZ25lZCBsb25nIHNhdmVmbGFnczsKCglEQkZfVEVYVCh0cmFjZSwgNCwgX19GVU5DVElPTl9fKTsKCWZzbV9kZWx0aW1lcigmY2gtPnRpbWVyKTsKCWZzbV9hZGR0aW1lcigmY2gtPnRpbWVyLCBDVENfVElNRU9VVF81U0VDLCBDSF9FVkVOVF9USU1FUiwgY2gpOwoJZnNtX25ld3N0YXRlKGZpLCBDSF9TVEFURV9TRVRVUFdBSVQpOwoJc2F2ZWZsYWdzID0gMDsJLyogYXZvaWRzIGNvbXBpbGVyIHdhcm5pbmcgd2l0aAoJCQkgICBzcGluX3VubG9ja19pcnFyZXN0b3JlICovCglpZiAoZXZlbnQgPT0gQ0hfRVZFTlRfVElNRVIpCS8vIG9ubHkgZm9yIHRpbWVyIG5vdCB5ZXQgbG9ja2VkCgkJc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKGNoLT5jZGV2KSwgc2F2ZWZsYWdzKTsKCXJjID0gY2N3X2RldmljZV9zdGFydChjaC0+Y2RldiwgJmNoLT5jY3dbNl0sICh1bnNpZ25lZCBsb25nKSBjaCwgMHhmZiwgMCk7CglpZiAoZXZlbnQgPT0gQ0hfRVZFTlRfVElNRVIpCgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2soY2gtPmNkZXYpLCBzYXZlZmxhZ3MpOwoJaWYgKHJjICE9IDApIHsKCQlmc21fZGVsdGltZXIoJmNoLT50aW1lcik7CgkJZnNtX25ld3N0YXRlKGZpLCBDSF9TVEFURV9TVEFSVFdBSVQpOwoJCWNjd19jaGVja19yZXR1cm5fY29kZShjaCwgcmMsICJzZXQgTW9kZSIpOwoJfSBlbHNlCgkJY2gtPnJldHJ5ID0gMDsKfQoKLyoqCiAqIFNldHVwIGNoYW5uZWwuCiAqCiAqIEBwYXJhbSBmaSAgICBBbiBpbnN0YW5jZSBvZiBhIGNoYW5uZWwgc3RhdGVtYWNoaW5lLgogKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50LCBqdXN0IGhhcHBlbmVkLgogKiBAcGFyYW0gYXJnICAgR2VuZXJpYyBwb2ludGVyLCBjYXN0ZWQgZnJvbSBjaGFubmVsICogdXBvbiBjYWxsLgogKi8Kc3RhdGljIHZvaWQKY2hfYWN0aW9uX3N0YXJ0KGZzbV9pbnN0YW5jZSAqIGZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKewoJc3RydWN0IGNoYW5uZWwgKmNoID0gKHN0cnVjdCBjaGFubmVsICopIGFyZzsKCXVuc2lnbmVkIGxvbmcgc2F2ZWZsYWdzOwoJaW50IHJjOwoJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKCglEQkZfVEVYVCh0cmFjZSwgNCwgX19GVU5DVElPTl9fKTsKCWlmIChjaCA9PSBOVUxMKSB7CgkJY3RjX3ByX3dhcm4oImNoX2FjdGlvbl9zdGFydCBjaD1OVUxMXG4iKTsKCQlyZXR1cm47Cgl9CglpZiAoY2gtPm5ldGRldiA9PSBOVUxMKSB7CgkJY3RjX3ByX3dhcm4oImNoX2FjdGlvbl9zdGFydCBkZXY9TlVMTCwgaWQ9JXNcbiIsIGNoLT5pZCk7CgkJcmV0dXJuOwoJfQoJZGV2ID0gY2gtPm5ldGRldjsKCiNpZmRlZiBERUJVRwoJY3RjX3ByX2RlYnVnKCIlczogJXMgY2hhbm5lbCBzdGFydFxuIiwgZGV2LT5uYW1lLAoJCSAgICAgKENIQU5ORUxfRElSRUNUSU9OKGNoLT5mbGFncykgPT0gUkVBRCkgPyAiUlgiIDogIlRYIik7CiNlbmRpZgoKCWlmIChjaC0+dHJhbnNfc2tiICE9IE5VTEwpIHsKCQljbGVhcl9ub3JtYWxpemVkX2NkYSgmY2gtPmNjd1sxXSk7CgkJZGV2X2tmcmVlX3NrYihjaC0+dHJhbnNfc2tiKTsKCQljaC0+dHJhbnNfc2tiID0gTlVMTDsKCX0KCWlmIChDSEFOTkVMX0RJUkVDVElPTihjaC0+ZmxhZ3MpID09IFJFQUQpIHsKCQljaC0+Y2N3WzFdLmNtZF9jb2RlID0gQ0NXX0NNRF9SRUFEOwoJCWNoLT5jY3dbMV0uZmxhZ3MgPSBDQ1dfRkxBR19TTEk7CgkJY2gtPmNjd1sxXS5jb3VudCA9IDA7Cgl9IGVsc2UgewoJCWNoLT5jY3dbMV0uY21kX2NvZGUgPSBDQ1dfQ01EX1dSSVRFOwoJCWNoLT5jY3dbMV0uZmxhZ3MgPSBDQ1dfRkxBR19TTEkgfCBDQ1dfRkxBR19DQzsKCQljaC0+Y2N3WzFdLmNvdW50ID0gMDsKCX0KCWlmIChjdGNfY2hlY2thbGxvY19idWZmZXIoY2gsIDApKSB7CgkJY3RjX3ByX25vdGljZSgKCQkJIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgJXMgdHJhbnNfc2tiLCBkZWxheWluZyAiCgkJCSJhbGxvY2F0aW9uIHVudGlsIGZpcnN0IHRyYW5zZmVyXG4iLAoJCQlkZXYtPm5hbWUsCgkJCShDSEFOTkVMX0RJUkVDVElPTihjaC0+ZmxhZ3MpID09IFJFQUQpID8gIlJYIiA6ICJUWCIpOwoJfQoKCWNoLT5jY3dbMF0uY21kX2NvZGUgPSBDQ1dfQ01EX1BSRVBBUkU7CgljaC0+Y2N3WzBdLmZsYWdzID0gQ0NXX0ZMQUdfU0xJIHwgQ0NXX0ZMQUdfQ0M7CgljaC0+Y2N3WzBdLmNvdW50ID0gMDsKCWNoLT5jY3dbMF0uY2RhID0gMDsKCWNoLT5jY3dbMl0uY21kX2NvZGUgPSBDQ1dfQ01EX05PT1A7CS8qIGpvaW50ZWQgQ0UgKyBERSAqLwoJY2gtPmNjd1syXS5mbGFncyA9IENDV19GTEFHX1NMSTsKCWNoLT5jY3dbMl0uY291bnQgPSAwOwoJY2gtPmNjd1syXS5jZGEgPSAwOwoJbWVtY3B5KCZjaC0+Y2N3WzNdLCAmY2gtPmNjd1swXSwgc2l6ZW9mIChzdHJ1Y3QgY2N3MSkgKiAzKTsKCWNoLT5jY3dbNF0uY2RhID0gMDsKCWNoLT5jY3dbNF0uZmxhZ3MgJj0gfkNDV19GTEFHX0lEQTsKCglmc21fbmV3c3RhdGUoZmksIENIX1NUQVRFX1NUQVJUV0FJVCk7Cglmc21fYWRkdGltZXIoJmNoLT50aW1lciwgMTAwMCwgQ0hfRVZFTlRfVElNRVIsIGNoKTsKCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhjaC0+Y2RldiksIHNhdmVmbGFncyk7CglyYyA9IGNjd19kZXZpY2VfaGFsdChjaC0+Y2RldiwgKHVuc2lnbmVkIGxvbmcpIGNoKTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKGNoLT5jZGV2KSwgc2F2ZWZsYWdzKTsKCWlmIChyYyAhPSAwKSB7CgkJaWYgKHJjICE9IC1FQlVTWSkKCQkgICAgZnNtX2RlbHRpbWVyKCZjaC0+dGltZXIpOwoJCWNjd19jaGVja19yZXR1cm5fY29kZShjaCwgcmMsICJpbml0aWFsIEhhbHRJTyIpOwoJfQojaWZkZWYgREVCVUcKCWN0Y19wcl9kZWJ1ZygiY3RjOiAlcygpOiBsZWF2aW5nXG4iLCBfX2Z1bmNfXyk7CiNlbmRpZgp9CgovKioKICogU2h1dGRvd24gYSBjaGFubmVsLgogKgogKiBAcGFyYW0gZmkgICAgQW4gaW5zdGFuY2Ugb2YgYSBjaGFubmVsIHN0YXRlbWFjaGluZS4KICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCwganVzdCBoYXBwZW5lZC4KICogQHBhcmFtIGFyZyAgIEdlbmVyaWMgcG9pbnRlciwgY2FzdGVkIGZyb20gY2hhbm5lbCAqIHVwb24gY2FsbC4KICovCnN0YXRpYyB2b2lkCmNoX2FjdGlvbl9oYWx0aW8oZnNtX2luc3RhbmNlICogZmksIGludCBldmVudCwgdm9pZCAqYXJnKQp7CglzdHJ1Y3QgY2hhbm5lbCAqY2ggPSAoc3RydWN0IGNoYW5uZWwgKikgYXJnOwoJdW5zaWduZWQgbG9uZyBzYXZlZmxhZ3M7CglpbnQgcmM7CglpbnQgb2xkc3RhdGU7CgoJREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7Cglmc21fZGVsdGltZXIoJmNoLT50aW1lcik7Cglmc21fYWRkdGltZXIoJmNoLT50aW1lciwgQ1RDX1RJTUVPVVRfNVNFQywgQ0hfRVZFTlRfVElNRVIsIGNoKTsKCXNhdmVmbGFncyA9IDA7CS8qIGF2b2lkcyBjb21wIHdhcm5pbmcgd2l0aAoJCQkgICBzcGluX3VubG9ja19pcnFyZXN0b3JlICovCglpZiAoZXZlbnQgPT0gQ0hfRVZFTlRfU1RPUCkJLy8gb25seSBmb3IgU1RPUCBub3QgeWV0IGxvY2tlZAoJCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhjaC0+Y2RldiksIHNhdmVmbGFncyk7CglvbGRzdGF0ZSA9IGZzbV9nZXRzdGF0ZShmaSk7Cglmc21fbmV3c3RhdGUoZmksIENIX1NUQVRFX1RFUk0pOwoJcmMgPSBjY3dfZGV2aWNlX2hhbHQoY2gtPmNkZXYsICh1bnNpZ25lZCBsb25nKSBjaCk7CglpZiAoZXZlbnQgPT0gQ0hfRVZFTlRfU1RPUCkKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhjaC0+Y2RldiksIHNhdmVmbGFncyk7CglpZiAocmMgIT0gMCkgewoJCWlmIChyYyAhPSAtRUJVU1kpIHsKCQkgICAgZnNtX2RlbHRpbWVyKCZjaC0+dGltZXIpOwoJCSAgICBmc21fbmV3c3RhdGUoZmksIG9sZHN0YXRlKTsKCQl9CgkJY2N3X2NoZWNrX3JldHVybl9jb2RlKGNoLCByYywgIkhhbHRJTyBpbiBjaF9hY3Rpb25faGFsdGlvIik7Cgl9Cn0KCi8qKgogKiBBIGNoYW5uZWwgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGhhbHRlZC4KICogQ2xlYW51cCBpdCdzIHF1ZXVlIGFuZCBub3RpZnkgaW50ZXJmYWNlIHN0YXRlbWFjaGluZS4KICoKICogQHBhcmFtIGZpICAgIEFuIGluc3RhbmNlIG9mIGEgY2hhbm5lbCBzdGF0ZW1hY2hpbmUuCiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQsIGp1c3QgaGFwcGVuZWQuCiAqIEBwYXJhbSBhcmcgICBHZW5lcmljIHBvaW50ZXIsIGNhc3RlZCBmcm9tIGNoYW5uZWwgKiB1cG9uIGNhbGwuCiAqLwpzdGF0aWMgdm9pZApjaF9hY3Rpb25fc3RvcHBlZChmc21faW5zdGFuY2UgKiBmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCnsKCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKSBhcmc7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2gtPm5ldGRldjsKCglEQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKCWZzbV9kZWx0aW1lcigmY2gtPnRpbWVyKTsKCWZzbV9uZXdzdGF0ZShmaSwgQ0hfU1RBVEVfU1RPUFBFRCk7CglpZiAoY2gtPnRyYW5zX3NrYiAhPSBOVUxMKSB7CgkJY2xlYXJfbm9ybWFsaXplZF9jZGEoJmNoLT5jY3dbMV0pOwoJCWRldl9rZnJlZV9za2IoY2gtPnRyYW5zX3NrYik7CgkJY2gtPnRyYW5zX3NrYiA9IE5VTEw7Cgl9CglpZiAoQ0hBTk5FTF9ESVJFQ1RJT04oY2gtPmZsYWdzKSA9PSBSRUFEKSB7CgkJc2tiX3F1ZXVlX3B1cmdlKCZjaC0+aW9fcXVldWUpOwoJCWZzbV9ldmVudCgoKHN0cnVjdCBjdGNfcHJpdiAqKSBkZXYtPnByaXYpLT5mc20sCgkJCSAgREVWX0VWRU5UX1JYRE9XTiwgZGV2KTsKCX0gZWxzZSB7CgkJY3RjX3B1cmdlX3NrYl9xdWV1ZSgmY2gtPmlvX3F1ZXVlKTsKCQlzcGluX2xvY2soJmNoLT5jb2xsZWN0X2xvY2spOwoJCWN0Y19wdXJnZV9za2JfcXVldWUoJmNoLT5jb2xsZWN0X3F1ZXVlKTsKCQljaC0+Y29sbGVjdF9sZW4gPSAwOwoJCXNwaW5fdW5sb2NrKCZjaC0+Y29sbGVjdF9sb2NrKTsKCQlmc21fZXZlbnQoKChzdHJ1Y3QgY3RjX3ByaXYgKikgZGV2LT5wcml2KS0+ZnNtLAoJCQkgIERFVl9FVkVOVF9UWERPV04sIGRldik7Cgl9Cn0KCi8qKgogKiBBIHN0b3AgY29tbWFuZCBmcm9tIGRldmljZSBzdGF0ZW1hY2hpbmUgYXJyaXZlZCBhbmQgd2UgYXJlIGluCiAqIG5vdCBvcGVyYXRpb25hbCBtb2RlLiBTZXQgc3RhdGUgdG8gc3RvcHBlZC4KICoKICogQHBhcmFtIGZpICAgIEFuIGluc3RhbmNlIG9mIGEgY2hhbm5lbCBzdGF0ZW1hY2hpbmUuCiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQsIGp1c3QgaGFwcGVuZWQuCiAqIEBwYXJhbSBhcmcgICBHZW5lcmljIHBvaW50ZXIsIGNhc3RlZCBmcm9tIGNoYW5uZWwgKiB1cG9uIGNhbGwuCiAqLwpzdGF0aWMgdm9pZApjaF9hY3Rpb25fc3RvcChmc21faW5zdGFuY2UgKiBmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCnsKCWZzbV9uZXdzdGF0ZShmaSwgQ0hfU1RBVEVfU1RPUFBFRCk7Cn0KCi8qKgogKiBBIG1hY2hpbmUgY2hlY2sgZm9yIG5vIHBhdGgsIG5vdCBvcGVyYXRpb25hbCBzdGF0dXMgb3IgZ29uZSBkZXZpY2UgaGFzCiAqIGhhcHBlbmVkLgogKiBDbGVhbnVwIHF1ZXVlIGFuZCBub3RpZnkgaW50ZXJmYWNlIHN0YXRlbWFjaGluZS4KICoKICogQHBhcmFtIGZpICAgIEFuIGluc3RhbmNlIG9mIGEgY2hhbm5lbCBzdGF0ZW1hY2hpbmUuCiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQsIGp1c3QgaGFwcGVuZWQuCiAqIEBwYXJhbSBhcmcgICBHZW5lcmljIHBvaW50ZXIsIGNhc3RlZCBmcm9tIGNoYW5uZWwgKiB1cG9uIGNhbGwuCiAqLwpzdGF0aWMgdm9pZApjaF9hY3Rpb25fZmFpbChmc21faW5zdGFuY2UgKiBmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCnsKCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKSBhcmc7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2gtPm5ldGRldjsKCglEQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKCWZzbV9kZWx0aW1lcigmY2gtPnRpbWVyKTsKCWZzbV9uZXdzdGF0ZShmaSwgQ0hfU1RBVEVfTk9UT1ApOwoJaWYgKENIQU5ORUxfRElSRUNUSU9OKGNoLT5mbGFncykgPT0gUkVBRCkgewoJCXNrYl9xdWV1ZV9wdXJnZSgmY2gtPmlvX3F1ZXVlKTsKCQlmc21fZXZlbnQoKChzdHJ1Y3QgY3RjX3ByaXYgKikgZGV2LT5wcml2KS0+ZnNtLAoJCQkgIERFVl9FVkVOVF9SWERPV04sIGRldik7Cgl9IGVsc2UgewoJCWN0Y19wdXJnZV9za2JfcXVldWUoJmNoLT5pb19xdWV1ZSk7CgkJc3Bpbl9sb2NrKCZjaC0+Y29sbGVjdF9sb2NrKTsKCQljdGNfcHVyZ2Vfc2tiX3F1ZXVlKCZjaC0+Y29sbGVjdF9xdWV1ZSk7CgkJY2gtPmNvbGxlY3RfbGVuID0gMDsKCQlzcGluX3VubG9jaygmY2gtPmNvbGxlY3RfbG9jayk7CgkJZnNtX2V2ZW50KCgoc3RydWN0IGN0Y19wcml2ICopIGRldi0+cHJpdiktPmZzbSwKCQkJICBERVZfRVZFTlRfVFhET1dOLCBkZXYpOwoJfQp9CgovKioKICogSGFuZGxlIGVycm9yIGR1cmluZyBzZXR1cCBvZiBjaGFubmVsLgogKgogKiBAcGFyYW0gZmkgICAgQW4gaW5zdGFuY2Ugb2YgYSBjaGFubmVsIHN0YXRlbWFjaGluZS4KICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCwganVzdCBoYXBwZW5lZC4KICogQHBhcmFtIGFyZyAgIEdlbmVyaWMgcG9pbnRlciwgY2FzdGVkIGZyb20gY2hhbm5lbCAqIHVwb24gY2FsbC4KICovCnN0YXRpYyB2b2lkCmNoX2FjdGlvbl9zZXR1cGVycihmc21faW5zdGFuY2UgKiBmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCnsKCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKSBhcmc7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2gtPm5ldGRldjsKCglEQkZfVEVYVChzZXR1cCwgMywgX19GVU5DVElPTl9fKTsKCS8qKgoJICogU3BlY2lhbCBjYXNlOiBHb3QgVUNfUkNSRVNFVCBvbiBzZXRtb2RlLgoJICogVGhpcyBtZWFucyB0aGF0IHJlbW90ZSBzaWRlIGlzbid0IHNldHVwLiBJbiB0aGlzIGNhc2UKCSAqIHNpbXBseSByZXRyeSBhZnRlciBzb21lIDEwIHNlY3MuLi4KCSAqLwoJaWYgKChmc21fZ2V0c3RhdGUoZmkpID09IENIX1NUQVRFX1NFVFVQV0FJVCkgJiYKCSAgICAoKGV2ZW50ID09IENIX0VWRU5UX1VDX1JDUkVTRVQpIHx8CgkgICAgIChldmVudCA9PSBDSF9FVkVOVF9VQ19SU1JFU0VUKSkpIHsKCQlmc21fbmV3c3RhdGUoZmksIENIX1NUQVRFX1NUQVJUUkVUUlkpOwoJCWZzbV9kZWx0aW1lcigmY2gtPnRpbWVyKTsKCQlmc21fYWRkdGltZXIoJmNoLT50aW1lciwgQ1RDX1RJTUVPVVRfNVNFQywgQ0hfRVZFTlRfVElNRVIsIGNoKTsKCQlpZiAoQ0hBTk5FTF9ESVJFQ1RJT04oY2gtPmZsYWdzKSA9PSBSRUFEKSB7CgkJCWludCByYyA9IGNjd19kZXZpY2VfaGFsdChjaC0+Y2RldiwgKHVuc2lnbmVkIGxvbmcpIGNoKTsKCQkJaWYgKHJjICE9IDApCgkJCQljY3dfY2hlY2tfcmV0dXJuX2NvZGUoCgkJCQkJY2gsIHJjLCAiSGFsdElPIGluIGNoX2FjdGlvbl9zZXR1cGVyciIpOwoJCX0KCQlyZXR1cm47Cgl9CgoJY3RjX3ByX2RlYnVnKCIlczogRXJyb3IgJXMgZHVyaW5nICVzIGNoYW5uZWwgc2V0dXAgc3RhdGU9JXNcbiIsCgkJICAgICBkZXYtPm5hbWUsIGNoX2V2ZW50X25hbWVzW2V2ZW50XSwKCQkgICAgIChDSEFOTkVMX0RJUkVDVElPTihjaC0+ZmxhZ3MpID09IFJFQUQpID8gIlJYIiA6ICJUWCIsCgkJICAgICBmc21fZ2V0c3RhdGVfc3RyKGZpKSk7CglpZiAoQ0hBTk5FTF9ESVJFQ1RJT04oY2gtPmZsYWdzKSA9PSBSRUFEKSB7CgkJZnNtX25ld3N0YXRlKGZpLCBDSF9TVEFURV9SWEVSUik7CgkJZnNtX2V2ZW50KCgoc3RydWN0IGN0Y19wcml2ICopIGRldi0+cHJpdiktPmZzbSwKCQkJICBERVZfRVZFTlRfUlhET1dOLCBkZXYpOwoJfSBlbHNlIHsKCQlmc21fbmV3c3RhdGUoZmksIENIX1NUQVRFX1RYRVJSKTsKCQlmc21fZXZlbnQoKChzdHJ1Y3QgY3RjX3ByaXYgKikgZGV2LT5wcml2KS0+ZnNtLAoJCQkgIERFVl9FVkVOVF9UWERPV04sIGRldik7Cgl9Cn0KCi8qKgogKiBSZXN0YXJ0IGEgY2hhbm5lbCBhZnRlciBhbiBlcnJvci4KICoKICogQHBhcmFtIGZpICAgIEFuIGluc3RhbmNlIG9mIGEgY2hhbm5lbCBzdGF0ZW1hY2hpbmUuCiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQsIGp1c3QgaGFwcGVuZWQuCiAqIEBwYXJhbSBhcmcgICBHZW5lcmljIHBvaW50ZXIsIGNhc3RlZCBmcm9tIGNoYW5uZWwgKiB1cG9uIGNhbGwuCiAqLwpzdGF0aWMgdm9pZApjaF9hY3Rpb25fcmVzdGFydChmc21faW5zdGFuY2UgKiBmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCnsKCXVuc2lnbmVkIGxvbmcgc2F2ZWZsYWdzOwoJaW50IG9sZHN0YXRlOwoJaW50IHJjOwoKCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKSBhcmc7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2gtPm5ldGRldjsKCglEQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKCWZzbV9kZWx0aW1lcigmY2gtPnRpbWVyKTsKCWN0Y19wcl9kZWJ1ZygiJXM6ICVzIGNoYW5uZWwgcmVzdGFydFxuIiwgZGV2LT5uYW1lLAoJCSAgICAgKENIQU5ORUxfRElSRUNUSU9OKGNoLT5mbGFncykgPT0gUkVBRCkgPyAiUlgiIDogIlRYIik7Cglmc21fYWRkdGltZXIoJmNoLT50aW1lciwgQ1RDX1RJTUVPVVRfNVNFQywgQ0hfRVZFTlRfVElNRVIsIGNoKTsKCW9sZHN0YXRlID0gZnNtX2dldHN0YXRlKGZpKTsKCWZzbV9uZXdzdGF0ZShmaSwgQ0hfU1RBVEVfU1RBUlRXQUlUKTsKCXNhdmVmbGFncyA9IDA7CS8qIGF2b2lkcyBjb21waWxlciB3YXJuaW5nIHdpdGgKCQkJICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAqLwoJaWYgKGV2ZW50ID09IENIX0VWRU5UX1RJTUVSKQkvLyBvbmx5IGZvciB0aW1lciBub3QgeWV0IGxvY2tlZAoJCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhjaC0+Y2RldiksIHNhdmVmbGFncyk7CglyYyA9IGNjd19kZXZpY2VfaGFsdChjaC0+Y2RldiwgKHVuc2lnbmVkIGxvbmcpIGNoKTsKCWlmIChldmVudCA9PSBDSF9FVkVOVF9USU1FUikKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhjaC0+Y2RldiksIHNhdmVmbGFncyk7CglpZiAocmMgIT0gMCkgewoJCWlmIChyYyAhPSAtRUJVU1kpIHsKCQkgICAgZnNtX2RlbHRpbWVyKCZjaC0+dGltZXIpOwoJCSAgICBmc21fbmV3c3RhdGUoZmksIG9sZHN0YXRlKTsKCQl9CgkJY2N3X2NoZWNrX3JldHVybl9jb2RlKGNoLCByYywgIkhhbHRJTyBpbiBjaF9hY3Rpb25fcmVzdGFydCIpOwoJfQp9CgovKioKICogSGFuZGxlIGVycm9yIGR1cmluZyBSWCBpbml0aWFsIGhhbmRzaGFrZSAoZXhjaGFuZ2Ugb2YKICogMC1sZW5ndGggYmxvY2sgaGVhZGVyKQogKgogKiBAcGFyYW0gZmkgICAgQW4gaW5zdGFuY2Ugb2YgYSBjaGFubmVsIHN0YXRlbWFjaGluZS4KICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCwganVzdCBoYXBwZW5lZC4KICogQHBhcmFtIGFyZyAgIEdlbmVyaWMgcG9pbnRlciwgY2FzdGVkIGZyb20gY2hhbm5lbCAqIHVwb24gY2FsbC4KICovCnN0YXRpYyB2b2lkCmNoX2FjdGlvbl9yeGluaXRlcnIoZnNtX2luc3RhbmNlICogZmksIGludCBldmVudCwgdm9pZCAqYXJnKQp7CglzdHJ1Y3QgY2hhbm5lbCAqY2ggPSAoc3RydWN0IGNoYW5uZWwgKikgYXJnOwoJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNoLT5uZXRkZXY7CgoJREJGX1RFWFQoc2V0dXAsIDMsIF9fRlVOQ1RJT05fXyk7CglpZiAoZXZlbnQgPT0gQ0hfRVZFTlRfVElNRVIpIHsKCQlmc21fZGVsdGltZXIoJmNoLT50aW1lcik7CgkJY3RjX3ByX2RlYnVnKCIlczogVGltZW91dCBkdXJpbmcgUlggaW5pdCBoYW5kc2hha2VcbiIsIGRldi0+bmFtZSk7CgkJaWYgKGNoLT5yZXRyeSsrIDwgMykKCQkJY2hfYWN0aW9uX3Jlc3RhcnQoZmksIGV2ZW50LCBhcmcpOwoJCWVsc2UgewoJCQlmc21fbmV3c3RhdGUoZmksIENIX1NUQVRFX1JYRVJSKTsKCQkJZnNtX2V2ZW50KCgoc3RydWN0IGN0Y19wcml2ICopIGRldi0+cHJpdiktPmZzbSwKCQkJCSAgREVWX0VWRU5UX1JYRE9XTiwgZGV2KTsKCQl9Cgl9IGVsc2UKCQljdGNfcHJfd2FybigiJXM6IEVycm9yIGR1cmluZyBSWCBpbml0IGhhbmRzaGFrZVxuIiwgZGV2LT5uYW1lKTsKfQoKLyoqCiAqIE5vdGlmeSBkZXZpY2Ugc3RhdGVtYWNoaW5lIGlmIHdlIGdhdmUgdXAgaW5pdGlhbGl6YXRpb24KICogb2YgUlggY2hhbm5lbC4KICoKICogQHBhcmFtIGZpICAgIEFuIGluc3RhbmNlIG9mIGEgY2hhbm5lbCBzdGF0ZW1hY2hpbmUuCiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQsIGp1c3QgaGFwcGVuZWQuCiAqIEBwYXJhbSBhcmcgICBHZW5lcmljIHBvaW50ZXIsIGNhc3RlZCBmcm9tIGNoYW5uZWwgKiB1cG9uIGNhbGwuCiAqLwpzdGF0aWMgdm9pZApjaF9hY3Rpb25fcnhpbml0ZmFpbChmc21faW5zdGFuY2UgKiBmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCnsKCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKSBhcmc7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2gtPm5ldGRldjsKCglEQkZfVEVYVChzZXR1cCwgMywgX19GVU5DVElPTl9fKTsKCWZzbV9uZXdzdGF0ZShmaSwgQ0hfU1RBVEVfUlhFUlIpOwoJY3RjX3ByX3dhcm4oIiVzOiBSWCBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CgljdGNfcHJfd2FybigiJXM6IFJYIDwtPiBSWCBjb25uZWN0aW9uIGRldGVjdGVkXG4iLCBkZXYtPm5hbWUpOwoJZnNtX2V2ZW50KCgoc3RydWN0IGN0Y19wcml2ICopIGRldi0+cHJpdiktPmZzbSwgREVWX0VWRU5UX1JYRE9XTiwgZGV2KTsKfQoKLyoqCiAqIEhhbmRsZSBSWCBVbml0IGNoZWNrIHJlbW90ZSByZXNldCAocmVtb3RlIGRpc2Nvbm5lY3RlZCkKICoKICogQHBhcmFtIGZpICAgIEFuIGluc3RhbmNlIG9mIGEgY2hhbm5lbCBzdGF0ZW1hY2hpbmUuCiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQsIGp1c3QgaGFwcGVuZWQuCiAqIEBwYXJhbSBhcmcgICBHZW5lcmljIHBvaW50ZXIsIGNhc3RlZCBmcm9tIGNoYW5uZWwgKiB1cG9uIGNhbGwuCiAqLwpzdGF0aWMgdm9pZApjaF9hY3Rpb25fcnhkaXNjKGZzbV9pbnN0YW5jZSAqIGZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKewoJc3RydWN0IGNoYW5uZWwgKmNoID0gKHN0cnVjdCBjaGFubmVsICopIGFyZzsKCXN0cnVjdCBjaGFubmVsICpjaDI7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2gtPm5ldGRldjsKCglEQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKCWZzbV9kZWx0aW1lcigmY2gtPnRpbWVyKTsKCWN0Y19wcl9kZWJ1ZygiJXM6IEdvdCByZW1vdGUgZGlzY29ubmVjdCwgcmUtaW5pdGlhbGl6aW5nIC4uLlxuIiwKCQkgICAgIGRldi0+bmFtZSk7CgoJLyoqCgkgKiBOb3RpZnkgZGV2aWNlIHN0YXRlbWFjaGluZQoJICovCglmc21fZXZlbnQoKChzdHJ1Y3QgY3RjX3ByaXYgKikgZGV2LT5wcml2KS0+ZnNtLCBERVZfRVZFTlRfUlhET1dOLCBkZXYpOwoJZnNtX2V2ZW50KCgoc3RydWN0IGN0Y19wcml2ICopIGRldi0+cHJpdiktPmZzbSwgREVWX0VWRU5UX1RYRE9XTiwgZGV2KTsKCglmc21fbmV3c3RhdGUoZmksIENIX1NUQVRFX0RURVJNKTsKCWNoMiA9ICgoc3RydWN0IGN0Y19wcml2ICopIGRldi0+cHJpdiktPmNoYW5uZWxbV1JJVEVdOwoJZnNtX25ld3N0YXRlKGNoMi0+ZnNtLCBDSF9TVEFURV9EVEVSTSk7CgoJY2N3X2RldmljZV9oYWx0KGNoLT5jZGV2LCAodW5zaWduZWQgbG9uZykgY2gpOwoJY2N3X2RldmljZV9oYWx0KGNoMi0+Y2RldiwgKHVuc2lnbmVkIGxvbmcpIGNoMik7Cn0KCi8qKgogKiBIYW5kbGUgZXJyb3IgZHVyaW5nIFRYIGNoYW5uZWwgaW5pdGlhbGl6YXRpb24uCiAqCiAqIEBwYXJhbSBmaSAgICBBbiBpbnN0YW5jZSBvZiBhIGNoYW5uZWwgc3RhdGVtYWNoaW5lLgogKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50LCBqdXN0IGhhcHBlbmVkLgogKiBAcGFyYW0gYXJnICAgR2VuZXJpYyBwb2ludGVyLCBjYXN0ZWQgZnJvbSBjaGFubmVsICogdXBvbiBjYWxsLgogKi8Kc3RhdGljIHZvaWQKY2hfYWN0aW9uX3R4aW5pdGVycihmc21faW5zdGFuY2UgKiBmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCnsKCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKSBhcmc7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2gtPm5ldGRldjsKCglEQkZfVEVYVChzZXR1cCwgMiwgX19GVU5DVElPTl9fKTsKCWlmIChldmVudCA9PSBDSF9FVkVOVF9USU1FUikgewoJCWZzbV9kZWx0aW1lcigmY2gtPnRpbWVyKTsKCQljdGNfcHJfZGVidWcoIiVzOiBUaW1lb3V0IGR1cmluZyBUWCBpbml0IGhhbmRzaGFrZVxuIiwgZGV2LT5uYW1lKTsKCQlpZiAoY2gtPnJldHJ5KysgPCAzKQoJCQljaF9hY3Rpb25fcmVzdGFydChmaSwgZXZlbnQsIGFyZyk7CgkJZWxzZSB7CgkJCWZzbV9uZXdzdGF0ZShmaSwgQ0hfU1RBVEVfVFhFUlIpOwoJCQlmc21fZXZlbnQoKChzdHJ1Y3QgY3RjX3ByaXYgKikgZGV2LT5wcml2KS0+ZnNtLAoJCQkJICBERVZfRVZFTlRfVFhET1dOLCBkZXYpOwoJCX0KCX0gZWxzZQoJCWN0Y19wcl93YXJuKCIlczogRXJyb3IgZHVyaW5nIFRYIGluaXQgaGFuZHNoYWtlXG4iLCBkZXYtPm5hbWUpOwp9CgovKioKICogSGFuZGxlIFRYIHRpbWVvdXQgYnkgcmV0cnlpbmcgb3BlcmF0aW9uLgogKgogKiBAcGFyYW0gZmkgICAgQW4gaW5zdGFuY2Ugb2YgYSBjaGFubmVsIHN0YXRlbWFjaGluZS4KICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCwganVzdCBoYXBwZW5lZC4KICogQHBhcmFtIGFyZyAgIEdlbmVyaWMgcG9pbnRlciwgY2FzdGVkIGZyb20gY2hhbm5lbCAqIHVwb24gY2FsbC4KICovCnN0YXRpYyB2b2lkCmNoX2FjdGlvbl90eHJldHJ5KGZzbV9pbnN0YW5jZSAqIGZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKewoJc3RydWN0IGNoYW5uZWwgKmNoID0gKHN0cnVjdCBjaGFubmVsICopIGFyZzsKCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjaC0+bmV0ZGV2OwoJdW5zaWduZWQgbG9uZyBzYXZlZmxhZ3M7CgoJREJGX1RFWFQodHJhY2UsIDQsIF9fRlVOQ1RJT05fXyk7Cglmc21fZGVsdGltZXIoJmNoLT50aW1lcik7CglpZiAoY2gtPnJldHJ5KysgPiAzKSB7CgkJY3RjX3ByX2RlYnVnKCIlczogVFggcmV0cnkgZmFpbGVkLCByZXN0YXJ0aW5nIGNoYW5uZWxcbiIsCgkJCSAgICAgZGV2LT5uYW1lKTsKCQlmc21fZXZlbnQoKChzdHJ1Y3QgY3RjX3ByaXYgKikgZGV2LT5wcml2KS0+ZnNtLAoJCQkgIERFVl9FVkVOVF9UWERPV04sIGRldik7CgkJY2hfYWN0aW9uX3Jlc3RhcnQoZmksIGV2ZW50LCBhcmcpOwoJfSBlbHNlIHsKCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoKCQljdGNfcHJfZGVidWcoIiVzOiBUWCByZXRyeSAlZFxuIiwgZGV2LT5uYW1lLCBjaC0+cmV0cnkpOwoJCWlmICgoc2tiID0gc2tiX3BlZWsoJmNoLT5pb19xdWV1ZSkpKSB7CgkJCWludCByYyA9IDA7CgoJCQljbGVhcl9ub3JtYWxpemVkX2NkYSgmY2gtPmNjd1s0XSk7CgkJCWNoLT5jY3dbNF0uY291bnQgPSBza2ItPmxlbjsKCQkJaWYgKHNldF9ub3JtYWxpemVkX2NkYSgmY2gtPmNjd1s0XSwgc2tiLT5kYXRhKSkgewoJCQkJY3RjX3ByX2RlYnVnKAoJCQkJCSIlczogSURBTCBhbGxvYyBmYWlsZWQsIGNoYW4gcmVzdGFydFxuIiwKCQkJCQlkZXYtPm5hbWUpOwoJCQkJZnNtX2V2ZW50KCgoc3RydWN0IGN0Y19wcml2ICopIGRldi0+cHJpdiktPmZzbSwKCQkJCQkgIERFVl9FVkVOVF9UWERPV04sIGRldik7CgkJCQljaF9hY3Rpb25fcmVzdGFydChmaSwgZXZlbnQsIGFyZyk7CgkJCQlyZXR1cm47CgkJCX0KCQkJZnNtX2FkZHRpbWVyKCZjaC0+dGltZXIsIDEwMDAsIENIX0VWRU5UX1RJTUVSLCBjaCk7CgkJCXNhdmVmbGFncyA9IDA7CS8qIGF2b2lkcyBjb21waWxlciB3YXJuaW5nIHdpdGgKCQkJCQkgICBzcGluX3VubG9ja19pcnFyZXN0b3JlICovCgkJCWlmIChldmVudCA9PSBDSF9FVkVOVF9USU1FUikgLy8gb25seSBmb3IgVElNRVIgbm90IHlldCBsb2NrZWQKCQkJCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhjaC0+Y2RldiksCgkJCQkJCSAgc2F2ZWZsYWdzKTsKCQkJcmMgPSBjY3dfZGV2aWNlX3N0YXJ0KGNoLT5jZGV2LCAmY2gtPmNjd1szXSwKCQkJCQkgICAgICAodW5zaWduZWQgbG9uZykgY2gsIDB4ZmYsIDApOwoJCQlpZiAoZXZlbnQgPT0gQ0hfRVZFTlRfVElNRVIpCgkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhjaC0+Y2RldiksCgkJCQkJCSAgICAgICBzYXZlZmxhZ3MpOwoJCQlpZiAocmMgIT0gMCkgewoJCQkJZnNtX2RlbHRpbWVyKCZjaC0+dGltZXIpOwoJCQkJY2N3X2NoZWNrX3JldHVybl9jb2RlKGNoLCByYywgIlRYIGluIGNoX2FjdGlvbl90eHJldHJ5Iik7CgkJCQljdGNfcHVyZ2Vfc2tiX3F1ZXVlKCZjaC0+aW9fcXVldWUpOwoJCQl9CgkJfQoJfQoKfQoKLyoqCiAqIEhhbmRsZSBmYXRhbCBlcnJvcnMgZHVyaW5nIGFuIEkvTyBjb21tYW5kLgogKgogKiBAcGFyYW0gZmkgICAgQW4gaW5zdGFuY2Ugb2YgYSBjaGFubmVsIHN0YXRlbWFjaGluZS4KICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCwganVzdCBoYXBwZW5lZC4KICogQHBhcmFtIGFyZyAgIEdlbmVyaWMgcG9pbnRlciwgY2FzdGVkIGZyb20gY2hhbm5lbCAqIHVwb24gY2FsbC4KICovCnN0YXRpYyB2b2lkCmNoX2FjdGlvbl9pb2ZhdGFsKGZzbV9pbnN0YW5jZSAqIGZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKewoJc3RydWN0IGNoYW5uZWwgKmNoID0gKHN0cnVjdCBjaGFubmVsICopIGFyZzsKCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjaC0+bmV0ZGV2OwoKCURCRl9URVhUKHRyYWNlLCAzLCBfX0ZVTkNUSU9OX18pOwoJZnNtX2RlbHRpbWVyKCZjaC0+dGltZXIpOwoJaWYgKENIQU5ORUxfRElSRUNUSU9OKGNoLT5mbGFncykgPT0gUkVBRCkgewoJCWN0Y19wcl9kZWJ1ZygiJXM6IFJYIEkvTyBlcnJvclxuIiwgZGV2LT5uYW1lKTsKCQlmc21fbmV3c3RhdGUoZmksIENIX1NUQVRFX1JYRVJSKTsKCQlmc21fZXZlbnQoKChzdHJ1Y3QgY3RjX3ByaXYgKikgZGV2LT5wcml2KS0+ZnNtLAoJCQkgIERFVl9FVkVOVF9SWERPV04sIGRldik7Cgl9IGVsc2UgewoJCWN0Y19wcl9kZWJ1ZygiJXM6IFRYIEkvTyBlcnJvclxuIiwgZGV2LT5uYW1lKTsKCQlmc21fbmV3c3RhdGUoZmksIENIX1NUQVRFX1RYRVJSKTsKCQlmc21fZXZlbnQoKChzdHJ1Y3QgY3RjX3ByaXYgKikgZGV2LT5wcml2KS0+ZnNtLAoJCQkgIERFVl9FVkVOVF9UWERPV04sIGRldik7Cgl9Cn0KCnN0YXRpYyB2b2lkCmNoX2FjdGlvbl9yZWluaXQoZnNtX2luc3RhbmNlICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCnsKIAlzdHJ1Y3QgY2hhbm5lbCAqY2ggPSAoc3RydWN0IGNoYW5uZWwgKilhcmc7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNoLT5uZXRkZXY7CiAJc3RydWN0IGN0Y19wcml2ICpwcml2cHRyID0gZGV2LT5wcml2OwoKCURCRl9URVhUKHRyYWNlLCA0LCBfX0ZVTkNUSU9OX18pOwogCWNoX2FjdGlvbl9pb2ZhdGFsKGZpLCBldmVudCwgYXJnKTsKIAlmc21fYWRkdGltZXIoJnByaXZwdHItPnJlc3RhcnRfdGltZXIsIDEwMDAsIERFVl9FVkVOVF9SRVNUQVJULCBkZXYpOwp9CgovKioKICogVGhlIHN0YXRlbWFjaGluZSBmb3IgYSBjaGFubmVsLgogKi8Kc3RhdGljIGNvbnN0IGZzbV9ub2RlIGNoX2ZzbVtdID0gewoJe0NIX1NUQVRFX1NUT1BQRUQsICAgIENIX0VWRU5UX1NUT1AsICAgICAgIGZzbV9hY3Rpb25fbm9wICAgICAgIH0sCgl7Q0hfU1RBVEVfU1RPUFBFRCwgICAgQ0hfRVZFTlRfU1RBUlQsICAgICAgY2hfYWN0aW9uX3N0YXJ0ICAgICAgfSwKCXtDSF9TVEFURV9TVE9QUEVELCAgICBDSF9FVkVOVF9GSU5TVEFULCAgICBmc21fYWN0aW9uX25vcCAgICAgICB9LAoJe0NIX1NUQVRFX1NUT1BQRUQsICAgIENIX0VWRU5UX01DX0ZBSUwsICAgIGZzbV9hY3Rpb25fbm9wICAgICAgIH0sCgoJe0NIX1NUQVRFX05PVE9QLCAgICAgIENIX0VWRU5UX1NUT1AsICAgICAgIGNoX2FjdGlvbl9zdG9wICAgICAgIH0sCgl7Q0hfU1RBVEVfTk9UT1AsICAgICAgQ0hfRVZFTlRfU1RBUlQsICAgICAgZnNtX2FjdGlvbl9ub3AgICAgICAgfSwKCXtDSF9TVEFURV9OT1RPUCwgICAgICBDSF9FVkVOVF9GSU5TVEFULCAgICBmc21fYWN0aW9uX25vcCAgICAgICB9LAoJe0NIX1NUQVRFX05PVE9QLCAgICAgIENIX0VWRU5UX01DX0ZBSUwsICAgIGZzbV9hY3Rpb25fbm9wICAgICAgIH0sCgl7Q0hfU1RBVEVfTk9UT1AsICAgICAgQ0hfRVZFTlRfTUNfR09PRCwgICAgY2hfYWN0aW9uX3N0YXJ0ICAgICAgfSwKCgl7Q0hfU1RBVEVfU1RBUlRXQUlULCAgQ0hfRVZFTlRfU1RPUCwgICAgICAgY2hfYWN0aW9uX2hhbHRpbyAgICAgfSwKCXtDSF9TVEFURV9TVEFSVFdBSVQsICBDSF9FVkVOVF9TVEFSVCwgICAgICBmc21fYWN0aW9uX25vcCAgICAgICB9LAoJe0NIX1NUQVRFX1NUQVJUV0FJVCwgIENIX0VWRU5UX0ZJTlNUQVQsICAgIGNoX2FjdGlvbl9zZXRtb2RlICAgIH0sCgl7Q0hfU1RBVEVfU1RBUlRXQUlULCAgQ0hfRVZFTlRfVElNRVIsICAgICAgY2hfYWN0aW9uX3NldHVwZXJyICAgfSwKCXtDSF9TVEFURV9TVEFSVFdBSVQsICBDSF9FVkVOVF9JT19FTk9ERVYsICBjaF9hY3Rpb25faW9mYXRhbCAgICB9LAoJe0NIX1NUQVRFX1NUQVJUV0FJVCwgIENIX0VWRU5UX0lPX0VJTywgICAgIGNoX2FjdGlvbl9yZWluaXQgICAgIH0sCgl7Q0hfU1RBVEVfU1RBUlRXQUlULCAgQ0hfRVZFTlRfTUNfRkFJTCwgICAgY2hfYWN0aW9uX2ZhaWwgICAgICAgfSwKCgl7Q0hfU1RBVEVfU1RBUlRSRVRSWSwgQ0hfRVZFTlRfU1RPUCwgICAgICAgY2hfYWN0aW9uX2hhbHRpbyAgICAgfSwKCXtDSF9TVEFURV9TVEFSVFJFVFJZLCBDSF9FVkVOVF9USU1FUiwgICAgICBjaF9hY3Rpb25fc2V0bW9kZSAgICB9LAoJe0NIX1NUQVRFX1NUQVJUUkVUUlksIENIX0VWRU5UX0ZJTlNUQVQsICAgIGZzbV9hY3Rpb25fbm9wICAgICAgIH0sCgl7Q0hfU1RBVEVfU1RBUlRSRVRSWSwgQ0hfRVZFTlRfTUNfRkFJTCwgICAgY2hfYWN0aW9uX2ZhaWwgICAgICAgfSwKCgl7Q0hfU1RBVEVfU0VUVVBXQUlULCAgQ0hfRVZFTlRfU1RPUCwgICAgICAgY2hfYWN0aW9uX2hhbHRpbyAgICAgfSwKCXtDSF9TVEFURV9TRVRVUFdBSVQsICBDSF9FVkVOVF9TVEFSVCwgICAgICBmc21fYWN0aW9uX25vcCAgICAgICB9LAoJe0NIX1NUQVRFX1NFVFVQV0FJVCwgIENIX0VWRU5UX0ZJTlNUQVQsICAgIGNoX2FjdGlvbl9maXJzdGlvICAgIH0sCgl7Q0hfU1RBVEVfU0VUVVBXQUlULCAgQ0hfRVZFTlRfVUNfUkNSRVNFVCwgY2hfYWN0aW9uX3NldHVwZXJyICAgfSwKCXtDSF9TVEFURV9TRVRVUFdBSVQsICBDSF9FVkVOVF9VQ19SU1JFU0VULCBjaF9hY3Rpb25fc2V0dXBlcnIgICB9LAoJe0NIX1NUQVRFX1NFVFVQV0FJVCwgIENIX0VWRU5UX1RJTUVSLCAgICAgIGNoX2FjdGlvbl9zZXRtb2RlICAgIH0sCgl7Q0hfU1RBVEVfU0VUVVBXQUlULCAgQ0hfRVZFTlRfSU9fRU5PREVWLCAgY2hfYWN0aW9uX2lvZmF0YWwgICAgfSwKCXtDSF9TVEFURV9TRVRVUFdBSVQsICBDSF9FVkVOVF9JT19FSU8sICAgICBjaF9hY3Rpb25fcmVpbml0ICAgICB9LAoJe0NIX1NUQVRFX1NFVFVQV0FJVCwgIENIX0VWRU5UX01DX0ZBSUwsICAgIGNoX2FjdGlvbl9mYWlsICAgICAgIH0sCgoJe0NIX1NUQVRFX1JYSU5JVCwgICAgIENIX0VWRU5UX1NUT1AsICAgICAgIGNoX2FjdGlvbl9oYWx0aW8gICAgIH0sCgl7Q0hfU1RBVEVfUlhJTklULCAgICAgQ0hfRVZFTlRfU1RBUlQsICAgICAgZnNtX2FjdGlvbl9ub3AgICAgICAgfSwKCXtDSF9TVEFURV9SWElOSVQsICAgICBDSF9FVkVOVF9GSU5TVEFULCAgICBjaF9hY3Rpb25fcnhpZGxlICAgICB9LAoJe0NIX1NUQVRFX1JYSU5JVCwgICAgIENIX0VWRU5UX1VDX1JDUkVTRVQsIGNoX2FjdGlvbl9yeGluaXRlcnIgIH0sCgl7Q0hfU1RBVEVfUlhJTklULCAgICAgQ0hfRVZFTlRfVUNfUlNSRVNFVCwgY2hfYWN0aW9uX3J4aW5pdGVyciAgfSwKCXtDSF9TVEFURV9SWElOSVQsICAgICBDSF9FVkVOVF9USU1FUiwgICAgICBjaF9hY3Rpb25fcnhpbml0ZXJyICB9LAoJe0NIX1NUQVRFX1JYSU5JVCwgICAgIENIX0VWRU5UX0FUVE5CVVNZLCAgIGNoX2FjdGlvbl9yeGluaXRmYWlsIH0sCgl7Q0hfU1RBVEVfUlhJTklULCAgICAgQ0hfRVZFTlRfSU9fRU5PREVWLCAgY2hfYWN0aW9uX2lvZmF0YWwgICAgfSwKCXtDSF9TVEFURV9SWElOSVQsICAgICBDSF9FVkVOVF9JT19FSU8sICAgICBjaF9hY3Rpb25fcmVpbml0ICAgICB9LAoJe0NIX1NUQVRFX1JYSU5JVCwgICAgIENIX0VWRU5UX1VDX1pFUk8sICAgIGNoX2FjdGlvbl9maXJzdGlvICAgIH0sCgl7Q0hfU1RBVEVfUlhJTklULCAgICAgQ0hfRVZFTlRfTUNfRkFJTCwgICAgY2hfYWN0aW9uX2ZhaWwgICAgICAgfSwKCgl7Q0hfU1RBVEVfUlhJRExFLCAgICAgQ0hfRVZFTlRfU1RPUCwgICAgICAgY2hfYWN0aW9uX2hhbHRpbyAgICAgfSwKCXtDSF9TVEFURV9SWElETEUsICAgICBDSF9FVkVOVF9TVEFSVCwgICAgICBmc21fYWN0aW9uX25vcCAgICAgICB9LAoJe0NIX1NUQVRFX1JYSURMRSwgICAgIENIX0VWRU5UX0ZJTlNUQVQsICAgIGNoX2FjdGlvbl9yeCAgICAgICAgIH0sCgl7Q0hfU1RBVEVfUlhJRExFLCAgICAgQ0hfRVZFTlRfVUNfUkNSRVNFVCwgY2hfYWN0aW9uX3J4ZGlzYyAgICAgfSwKLy8gICAgICB7Q0hfU1RBVEVfUlhJRExFLCAgICAgQ0hfRVZFTlRfVUNfUlNSRVNFVCwgY2hfYWN0aW9uX3J4cmV0cnkgICAgfSwKCXtDSF9TVEFURV9SWElETEUsICAgICBDSF9FVkVOVF9JT19FTk9ERVYsICBjaF9hY3Rpb25faW9mYXRhbCAgICB9LAoJe0NIX1NUQVRFX1JYSURMRSwgICAgIENIX0VWRU5UX0lPX0VJTywgICAgIGNoX2FjdGlvbl9yZWluaXQgICAgIH0sCgl7Q0hfU1RBVEVfUlhJRExFLCAgICAgQ0hfRVZFTlRfTUNfRkFJTCwgICAgY2hfYWN0aW9uX2ZhaWwgICAgICAgfSwKCXtDSF9TVEFURV9SWElETEUsICAgICBDSF9FVkVOVF9VQ19aRVJPLCAgICBjaF9hY3Rpb25fcnggICAgICAgICB9LAoKCXtDSF9TVEFURV9UWElOSVQsICAgICBDSF9FVkVOVF9TVE9QLCAgICAgICBjaF9hY3Rpb25faGFsdGlvICAgICB9LAoJe0NIX1NUQVRFX1RYSU5JVCwgICAgIENIX0VWRU5UX1NUQVJULCAgICAgIGZzbV9hY3Rpb25fbm9wICAgICAgIH0sCgl7Q0hfU1RBVEVfVFhJTklULCAgICAgQ0hfRVZFTlRfRklOU1RBVCwgICAgY2hfYWN0aW9uX3R4aWRsZSAgICAgfSwKCXtDSF9TVEFURV9UWElOSVQsICAgICBDSF9FVkVOVF9VQ19SQ1JFU0VULCBjaF9hY3Rpb25fdHhpbml0ZXJyICB9LAoJe0NIX1NUQVRFX1RYSU5JVCwgICAgIENIX0VWRU5UX1VDX1JTUkVTRVQsIGNoX2FjdGlvbl90eGluaXRlcnIgIH0sCgl7Q0hfU1RBVEVfVFhJTklULCAgICAgQ0hfRVZFTlRfVElNRVIsICAgICAgY2hfYWN0aW9uX3R4aW5pdGVyciAgfSwKCXtDSF9TVEFURV9UWElOSVQsICAgICBDSF9FVkVOVF9JT19FTk9ERVYsICBjaF9hY3Rpb25faW9mYXRhbCAgICB9LAoJe0NIX1NUQVRFX1RYSU5JVCwgICAgIENIX0VWRU5UX0lPX0VJTywgICAgIGNoX2FjdGlvbl9yZWluaXQgICAgIH0sCgl7Q0hfU1RBVEVfVFhJTklULCAgICAgQ0hfRVZFTlRfTUNfRkFJTCwgICAgY2hfYWN0aW9uX2ZhaWwgICAgICAgfSwKCgl7Q0hfU1RBVEVfVFhJRExFLCAgICAgQ0hfRVZFTlRfU1RPUCwgICAgICAgY2hfYWN0aW9uX2hhbHRpbyAgICAgfSwKCXtDSF9TVEFURV9UWElETEUsICAgICBDSF9FVkVOVF9TVEFSVCwgICAgICBmc21fYWN0aW9uX25vcCAgICAgICB9LAoJe0NIX1NUQVRFX1RYSURMRSwgICAgIENIX0VWRU5UX0ZJTlNUQVQsICAgIGNoX2FjdGlvbl9maXJzdGlvICAgIH0sCgl7Q0hfU1RBVEVfVFhJRExFLCAgICAgQ0hfRVZFTlRfVUNfUkNSRVNFVCwgZnNtX2FjdGlvbl9ub3AgICAgICAgfSwKCXtDSF9TVEFURV9UWElETEUsICAgICBDSF9FVkVOVF9VQ19SU1JFU0VULCBmc21fYWN0aW9uX25vcCAgICAgICB9LAoJe0NIX1NUQVRFX1RYSURMRSwgICAgIENIX0VWRU5UX0lPX0VOT0RFViwgIGNoX2FjdGlvbl9pb2ZhdGFsICAgIH0sCgl7Q0hfU1RBVEVfVFhJRExFLCAgICAgQ0hfRVZFTlRfSU9fRUlPLCAgICAgY2hfYWN0aW9uX3JlaW5pdCAgICAgfSwKCXtDSF9TVEFURV9UWElETEUsICAgICBDSF9FVkVOVF9NQ19GQUlMLCAgICBjaF9hY3Rpb25fZmFpbCAgICAgICB9LAoKCXtDSF9TVEFURV9URVJNLCAgICAgICBDSF9FVkVOVF9TVE9QLCAgICAgICBmc21fYWN0aW9uX25vcCAgICAgICB9LAoJe0NIX1NUQVRFX1RFUk0sICAgICAgIENIX0VWRU5UX1NUQVJULCAgICAgIGNoX2FjdGlvbl9yZXN0YXJ0ICAgIH0sCgl7Q0hfU1RBVEVfVEVSTSwgICAgICAgQ0hfRVZFTlRfRklOU1RBVCwgICAgY2hfYWN0aW9uX3N0b3BwZWQgICAgfSwKCXtDSF9TVEFURV9URVJNLCAgICAgICBDSF9FVkVOVF9VQ19SQ1JFU0VULCBmc21fYWN0aW9uX25vcCAgICAgICB9LAoJe0NIX1NUQVRFX1RFUk0sICAgICAgIENIX0VWRU5UX1VDX1JTUkVTRVQsIGZzbV9hY3Rpb25fbm9wICAgICAgIH0sCgl7Q0hfU1RBVEVfVEVSTSwgICAgICAgQ0hfRVZFTlRfTUNfRkFJTCwgICAgY2hfYWN0aW9uX2ZhaWwgICAgICAgfSwKCgl7Q0hfU1RBVEVfRFRFUk0sICAgICAgQ0hfRVZFTlRfU1RPUCwgICAgICAgY2hfYWN0aW9uX2hhbHRpbyAgICAgfSwKCXtDSF9TVEFURV9EVEVSTSwgICAgICBDSF9FVkVOVF9TVEFSVCwgICAgICBjaF9hY3Rpb25fcmVzdGFydCAgICB9LAoJe0NIX1NUQVRFX0RURVJNLCAgICAgIENIX0VWRU5UX0ZJTlNUQVQsICAgIGNoX2FjdGlvbl9zZXRtb2RlICAgIH0sCgl7Q0hfU1RBVEVfRFRFUk0sICAgICAgQ0hfRVZFTlRfVUNfUkNSRVNFVCwgZnNtX2FjdGlvbl9ub3AgICAgICAgfSwKCXtDSF9TVEFURV9EVEVSTSwgICAgICBDSF9FVkVOVF9VQ19SU1JFU0VULCBmc21fYWN0aW9uX25vcCAgICAgICB9LAoJe0NIX1NUQVRFX0RURVJNLCAgICAgIENIX0VWRU5UX01DX0ZBSUwsICAgIGNoX2FjdGlvbl9mYWlsICAgICAgIH0sCgoJe0NIX1NUQVRFX1RYLCAgICAgICAgIENIX0VWRU5UX1NUT1AsICAgICAgIGNoX2FjdGlvbl9oYWx0aW8gICAgIH0sCgl7Q0hfU1RBVEVfVFgsICAgICAgICAgQ0hfRVZFTlRfU1RBUlQsICAgICAgZnNtX2FjdGlvbl9ub3AgICAgICAgfSwKCXtDSF9TVEFURV9UWCwgICAgICAgICBDSF9FVkVOVF9GSU5TVEFULCAgICBjaF9hY3Rpb25fdHhkb25lICAgICB9LAoJe0NIX1NUQVRFX1RYLCAgICAgICAgIENIX0VWRU5UX1VDX1JDUkVTRVQsIGNoX2FjdGlvbl90eHJldHJ5ICAgIH0sCgl7Q0hfU1RBVEVfVFgsICAgICAgICAgQ0hfRVZFTlRfVUNfUlNSRVNFVCwgY2hfYWN0aW9uX3R4cmV0cnkgICAgfSwKCXtDSF9TVEFURV9UWCwgICAgICAgICBDSF9FVkVOVF9USU1FUiwgICAgICBjaF9hY3Rpb25fdHhyZXRyeSAgICB9LAoJe0NIX1NUQVRFX1RYLCAgICAgICAgIENIX0VWRU5UX0lPX0VOT0RFViwgIGNoX2FjdGlvbl9pb2ZhdGFsICAgIH0sCgl7Q0hfU1RBVEVfVFgsICAgICAgICAgQ0hfRVZFTlRfSU9fRUlPLCAgICAgY2hfYWN0aW9uX3JlaW5pdCAgICAgfSwKCXtDSF9TVEFURV9UWCwgICAgICAgICBDSF9FVkVOVF9NQ19GQUlMLCAgICBjaF9hY3Rpb25fZmFpbCAgICAgICB9LAoKCXtDSF9TVEFURV9SWEVSUiwgICAgICBDSF9FVkVOVF9TVE9QLCAgICAgICBjaF9hY3Rpb25faGFsdGlvICAgICB9LAoJe0NIX1NUQVRFX1RYRVJSLCAgICAgIENIX0VWRU5UX1NUT1AsICAgICAgIGNoX2FjdGlvbl9oYWx0aW8gICAgIH0sCgl7Q0hfU1RBVEVfVFhFUlIsICAgICAgQ0hfRVZFTlRfTUNfRkFJTCwgICAgY2hfYWN0aW9uX2ZhaWwgICAgICAgfSwKCXtDSF9TVEFURV9SWEVSUiwgICAgICBDSF9FVkVOVF9NQ19GQUlMLCAgICBjaF9hY3Rpb25fZmFpbCAgICAgICB9LAp9OwoKc3RhdGljIGNvbnN0IGludCBDSF9GU01fTEVOID0gc2l6ZW9mIChjaF9mc20pIC8gc2l6ZW9mIChmc21fbm9kZSk7CgovKioKICogRnVuY3Rpb25zIHJlbGF0ZWQgdG8gc2V0dXAgYW5kIGRldmljZSBkZXRlY3Rpb24uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBpbmxpbmUgaW50Cmxlc3NfdGhhbihjaGFyICppZDEsIGNoYXIgKmlkMikKewoJaW50IGRldjEsIGRldjIsIGk7CgoJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewoJCWlkMSsrOwoJCWlkMisrOwoJfQoJZGV2MSA9IHNpbXBsZV9zdHJ0b3VsKGlkMSwgJmlkMSwgMTYpOwoJZGV2MiA9IHNpbXBsZV9zdHJ0b3VsKGlkMiwgJmlkMiwgMTYpOwoKCXJldHVybiAoZGV2MSA8IGRldjIpOwp9CgovKioKICogQWRkIGEgbmV3IGNoYW5uZWwgdG8gdGhlIGxpc3Qgb2YgY2hhbm5lbHMuCiAqIEtlZXBzIHRoZSBjaGFubmVsIGxpc3Qgc29ydGVkLgogKgogKiBAcGFyYW0gY2RldiAgVGhlIGNjd19kZXZpY2UgdG8gYmUgYWRkZWQuCiAqIEBwYXJhbSB0eXBlICBUaGUgdHlwZSBjbGFzcyBvZiB0aGUgbmV3IGNoYW5uZWwuCiAqCiAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAhMCBvbiBlcnJvci4KICovCnN0YXRpYyBpbnQKYWRkX2NoYW5uZWwoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIGVudW0gY2hhbm5lbF90eXBlcyB0eXBlKQp7CglzdHJ1Y3QgY2hhbm5lbCAqKmMgPSAmY2hhbm5lbHM7CglzdHJ1Y3QgY2hhbm5lbCAqY2g7CgoJREJGX1RFWFQodHJhY2UsIDIsIF9fRlVOQ1RJT05fXyk7CglpZiAoKGNoID0KCSAgICAgKHN0cnVjdCBjaGFubmVsICopIGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2hhbm5lbCksCgkJCQkJR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKCQljdGNfcHJfd2FybigiY3RjOiBPdXQgb2YgbWVtb3J5IGluIGFkZF9jaGFubmVsXG4iKTsKCQlyZXR1cm4gLTE7Cgl9CgltZW1zZXQoY2gsIDAsIHNpemVvZiAoc3RydWN0IGNoYW5uZWwpKTsKCWlmICgoY2gtPmNjdyA9IChzdHJ1Y3QgY2N3MSAqKSBrbWFsbG9jKDgqc2l6ZW9mKHN0cnVjdCBjY3cxKSwKCQkJCQkgICAgICAgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpKSA9PSBOVUxMKSB7CgkJa2ZyZWUoY2gpOwoJCWN0Y19wcl93YXJuKCJjdGM6IE91dCBvZiBtZW1vcnkgaW4gYWRkX2NoYW5uZWxcbiIpOwoJCXJldHVybiAtMTsKCX0KCgltZW1zZXQoY2gtPmNjdywgMCwgOCpzaXplb2Yoc3RydWN0IGNjdzEpKTsJLy8gYXNzdXJlIGFsbCBmbGFncyBhbmQgY291bnRlcnMgYXJlIHJlc2V0CgoJLyoqCgkgKiAic3RhdGljIiBjY3dzIGFyZSB1c2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5OgoJICoKCSAqIGNjd1swLi4yXSAoQ2hhbm5lbCBwcm9ncmFtIGZvciBnZW5lcmljIEkvTyk6CgkgKiAgICAgICAgICAgMDogcHJlcGFyZQoJICogICAgICAgICAgIDE6IHJlYWQgb3Igd3JpdGUgKGRlcGVuZGluZyBvbiBkaXJlY3Rpb24pIHdpdGggZml4ZWQKCSAqICAgICAgICAgICAgICBidWZmZXIgKGlkYWwgYWxsb2NhdGVkIG9uY2Ugd2hlbiBidWZmZXIgaXMgYWxsb2NhdGVkKQoJICogICAgICAgICAgIDI6IG5vcAoJICogY2N3WzMuLjVdIChDaGFubmVsIHByb2dyYW0gZm9yIGRpcmVjdCB3cml0ZSBvZiBwYWNrZXRzKQoJICogICAgICAgICAgIDM6IHByZXBhcmUKCSAqICAgICAgICAgICA0OiB3cml0ZSAoaWRhbCBhbGxvY2F0ZWQgb24gZXZlcnkgd3JpdGUpLgoJICogICAgICAgICAgIDU6IG5vcAoJICogY2N3WzYuLjddIChDaGFubmVsIHByb2dyYW0gZm9yIGluaXRpYWwgY2hhbm5lbCBzZXR1cCk6CgkgKiAgICAgICAgICAgNjogc2V0IGV4dGVuZGVkIG1vZGUKCSAqICAgICAgICAgICA3OiBub3AKCSAqCgkgKiBjaC0+Y2N3WzAuLjVdIGFyZSBpbml0aWFsaXplZCBpbiBjaF9hY3Rpb25fc3RhcnQgYmVjYXVzZQoJICogdGhlIGNoYW5uZWwncyBkaXJlY3Rpb24gaXMgeWV0IHVua25vd24gaGVyZS4KCSAqLwoJY2gtPmNjd1s2XS5jbWRfY29kZSA9IENDV19DTURfU0VUX0VYVEVOREVEOwoJY2gtPmNjd1s2XS5mbGFncyA9IENDV19GTEFHX1NMSTsKCgljaC0+Y2N3WzddLmNtZF9jb2RlID0gQ0NXX0NNRF9OT09QOwoJY2gtPmNjd1s3XS5mbGFncyA9IENDV19GTEFHX1NMSTsKCgljaC0+Y2RldiA9IGNkZXY7CglzbnByaW50ZihjaC0+aWQsIENUQ19JRF9TSVpFLCAiY2gtJXMiLCBjZGV2LT5kZXYuYnVzX2lkKTsKCWNoLT50eXBlID0gdHlwZTsKCWNoLT5mc20gPSBpbml0X2ZzbShjaC0+aWQsIGNoX3N0YXRlX25hbWVzLAoJCQkgICBjaF9ldmVudF9uYW1lcywgTlJfQ0hfU1RBVEVTLCBOUl9DSF9FVkVOVFMsCgkJCSAgIGNoX2ZzbSwgQ0hfRlNNX0xFTiwgR0ZQX0tFUk5FTCk7CglpZiAoY2gtPmZzbSA9PSBOVUxMKSB7CgkJY3RjX3ByX3dhcm4oImN0YzogQ291bGQgbm90IGNyZWF0ZSBGU00gaW4gYWRkX2NoYW5uZWxcbiIpOwoJCWtmcmVlKGNoLT5jY3cpOwoJCWtmcmVlKGNoKTsKCQlyZXR1cm4gLTE7Cgl9Cglmc21fbmV3c3RhdGUoY2gtPmZzbSwgQ0hfU1RBVEVfSURMRSk7CglpZiAoKGNoLT5pcmIgPSAoc3RydWN0IGlyYiAqKSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGlyYiksCgkJCQkJICAgICAgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKCQljdGNfcHJfd2FybigiY3RjOiBPdXQgb2YgbWVtb3J5IGluIGFkZF9jaGFubmVsXG4iKTsKCQlrZnJlZV9mc20oY2gtPmZzbSk7CgkJa2ZyZWUoY2gtPmNjdyk7CgkJa2ZyZWUoY2gpOwoJCXJldHVybiAtMTsKCX0KCW1lbXNldChjaC0+aXJiLCAwLCBzaXplb2YgKHN0cnVjdCBpcmIpKTsKCXdoaWxlICgqYyAmJiBsZXNzX3RoYW4oKCpjKS0+aWQsIGNoLT5pZCkpCgkJYyA9ICYoKmMpLT5uZXh0OwoJaWYgKCpjICYmICghc3RybmNtcCgoKmMpLT5pZCwgY2gtPmlkLCBDVENfSURfU0laRSkpKSB7CgkJY3RjX3ByX2RlYnVnKAoJCQkiY3RjOiBhZGRfY2hhbm5lbDogZGV2aWNlICVzIGFscmVhZHkgaW4gbGlzdCwgIgoJCQkidXNpbmcgb2xkIGVudHJ5XG4iLCAoKmMpLT5pZCk7CgkJa2ZyZWUoY2gtPmlyYik7CgkJa2ZyZWVfZnNtKGNoLT5mc20pOwoJCWtmcmVlKGNoLT5jY3cpOwoJCWtmcmVlKGNoKTsKCQlyZXR1cm4gMDsKCX0KCglzcGluX2xvY2tfaW5pdCgmY2gtPmNvbGxlY3RfbG9jayk7CgoJZnNtX3NldHRpbWVyKGNoLT5mc20sICZjaC0+dGltZXIpOwoJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY2gtPmlvX3F1ZXVlKTsKCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNoLT5jb2xsZWN0X3F1ZXVlKTsKCWNoLT5uZXh0ID0gKmM7CgkqYyA9IGNoOwoJcmV0dXJuIDA7Cn0KCi8qKgogKiBSZWxlYXNlIGEgc3BlY2lmaWMgY2hhbm5lbCBpbiB0aGUgY2hhbm5lbCBsaXN0LgogKgogKiBAcGFyYW0gY2ggUG9pbnRlciB0byBjaGFubmVsIHN0cnVjdCB0byBiZSByZWxlYXNlZC4KICovCnN0YXRpYyB2b2lkCmNoYW5uZWxfZnJlZShzdHJ1Y3QgY2hhbm5lbCAqY2gpCnsKCWNoLT5mbGFncyAmPSB+Q0hBTk5FTF9GTEFHU19JTlVTRTsKCWZzbV9uZXdzdGF0ZShjaC0+ZnNtLCBDSF9TVEFURV9JRExFKTsKfQoKLyoqCiAqIFJlbW92ZSBhIHNwZWNpZmljIGNoYW5uZWwgaW4gdGhlIGNoYW5uZWwgbGlzdC4KICoKICogQHBhcmFtIGNoIFBvaW50ZXIgdG8gY2hhbm5lbCBzdHJ1Y3QgdG8gYmUgcmVsZWFzZWQuCiAqLwpzdGF0aWMgdm9pZApjaGFubmVsX3JlbW92ZShzdHJ1Y3QgY2hhbm5lbCAqY2gpCnsKCXN0cnVjdCBjaGFubmVsICoqYyA9ICZjaGFubmVsczsKCglEQkZfVEVYVCh0cmFjZSwgMiwgX19GVU5DVElPTl9fKTsKCWlmIChjaCA9PSBOVUxMKQoJCXJldHVybjsKCgljaGFubmVsX2ZyZWUoY2gpOwoJd2hpbGUgKCpjKSB7CgkJaWYgKCpjID09IGNoKSB7CgkJCSpjID0gY2gtPm5leHQ7CgkJCWZzbV9kZWx0aW1lcigmY2gtPnRpbWVyKTsKCQkJa2ZyZWVfZnNtKGNoLT5mc20pOwoJCQljbGVhcl9ub3JtYWxpemVkX2NkYSgmY2gtPmNjd1s0XSk7CgkJCWlmIChjaC0+dHJhbnNfc2tiICE9IE5VTEwpIHsKCQkJCWNsZWFyX25vcm1hbGl6ZWRfY2RhKCZjaC0+Y2N3WzFdKTsKCQkJCWRldl9rZnJlZV9za2IoY2gtPnRyYW5zX3NrYik7CgkJCX0KCQkJa2ZyZWUoY2gtPmNjdyk7CgkJCWtmcmVlKGNoLT5pcmIpOwoJCQlrZnJlZShjaCk7CgkJCXJldHVybjsKCQl9CgkJYyA9ICYoKCpjKS0+bmV4dCk7Cgl9Cn0KCi8qKgogKiBHZXQgYSBzcGVjaWZpYyBjaGFubmVsIGZyb20gdGhlIGNoYW5uZWwgbGlzdC4KICoKICogQHBhcmFtIHR5cGUgVHlwZSBvZiBjaGFubmVsIHdlIGFyZSBpbnRlcmVzdGVkIGluLgogKiBAcGFyYW0gaWQgSWQgb2YgY2hhbm5lbCB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4KICogQHBhcmFtIGRpcmVjdGlvbiBEaXJlY3Rpb24gd2Ugd2FudCB0byB1c2UgdGhpcyBjaGFubmVsIGZvci4KICoKICogQHJldHVybiBQb2ludGVyIHRvIGEgY2hhbm5lbCBvciBOVUxMIGlmIG5vIG1hdGNoaW5nIGNoYW5uZWwgYXZhaWxhYmxlLgogKi8Kc3RhdGljIHN0cnVjdCBjaGFubmVsCioKY2hhbm5lbF9nZXQoZW51bSBjaGFubmVsX3R5cGVzIHR5cGUsIGNoYXIgKmlkLCBpbnQgZGlyZWN0aW9uKQp7CglzdHJ1Y3QgY2hhbm5lbCAqY2ggPSBjaGFubmVsczsKCglEQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKI2lmZGVmIERFQlVHCgljdGNfcHJfZGVidWcoImN0YzogJXMoKTogc2VhcmNoaW5nIGZvciBjaCB3aXRoIGlkICVzIGFuZCB0eXBlICVkXG4iLAoJCSAgICAgX19mdW5jX18sIGlkLCB0eXBlKTsKI2VuZGlmCgoJd2hpbGUgKGNoICYmICgoc3RybmNtcChjaC0+aWQsIGlkLCBDVENfSURfU0laRSkpIHx8IChjaC0+dHlwZSAhPSB0eXBlKSkpIHsKI2lmZGVmIERFQlVHCgkJY3RjX3ByX2RlYnVnKCJjdGM6ICVzKCk6IGNoPTB4JXAgKGlkPSVzLCB0eXBlPSVkXG4iLAoJCQkgICAgIF9fZnVuY19fLCBjaCwgY2gtPmlkLCBjaC0+dHlwZSk7CiNlbmRpZgoJCWNoID0gY2gtPm5leHQ7Cgl9CiNpZmRlZiBERUJVRwoJY3RjX3ByX2RlYnVnKCJjdGM6ICVzKCk6IGNoPTB4JXBxIChpZD0lcywgdHlwZT0lZFxuIiwKCQkgICAgIF9fZnVuY19fLCBjaCwgY2gtPmlkLCBjaC0+dHlwZSk7CiNlbmRpZgoJaWYgKCFjaCkgewoJCWN0Y19wcl93YXJuKCJjdGM6ICVzKCk6IGNoYW5uZWwgd2l0aCBpZCAlcyAiCgkJCSAgICAiYW5kIHR5cGUgJWQgbm90IGZvdW5kIGluIGNoYW5uZWwgbGlzdFxuIiwKCQkJICAgIF9fZnVuY19fLCBpZCwgdHlwZSk7Cgl9IGVsc2UgewoJCWlmIChjaC0+ZmxhZ3MgJiBDSEFOTkVMX0ZMQUdTX0lOVVNFKQoJCQljaCA9IE5VTEw7CgkJZWxzZSB7CgkJCWNoLT5mbGFncyB8PSBDSEFOTkVMX0ZMQUdTX0lOVVNFOwoJCQljaC0+ZmxhZ3MgJj0gfkNIQU5ORUxfRkxBR1NfUldNQVNLOwoJCQljaC0+ZmxhZ3MgfD0gKGRpcmVjdGlvbiA9PSBXUklURSkKCQkJICAgID8gQ0hBTk5FTF9GTEFHU19XUklURSA6IENIQU5ORUxfRkxBR1NfUkVBRDsKCQkJZnNtX25ld3N0YXRlKGNoLT5mc20sIENIX1NUQVRFX1NUT1BQRUQpOwoJCX0KCX0KCXJldHVybiBjaDsKfQoKLyoqCiAqIFJldHVybiB0aGUgY2hhbm5lbCB0eXBlIGJ5IG5hbWUuCiAqCiAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgbmV0d29yayBpbnRlcmZhY2UuCiAqCiAqIEByZXR1cm4gVHlwZSBjbGFzcyBvZiBjaGFubmVsIHRvIGJlIHVzZWQgZm9yIHRoYXQgaW50ZXJmYWNlLgogKi8Kc3RhdGljIGVudW0gY2hhbm5lbF90eXBlcyBpbmxpbmUKZXh0cmFjdF9jaGFubmVsX21lZGlhKGNoYXIgKm5hbWUpCnsKCWVudW0gY2hhbm5lbF90eXBlcyByZXQgPSBjaGFubmVsX3R5cGVfdW5rbm93bjsKCglpZiAobmFtZSAhPSBOVUxMKSB7CgkJaWYgKHN0cm5jbXAobmFtZSwgImN0YyIsIDMpID09IDApCgkJCXJldCA9IGNoYW5uZWxfdHlwZV9wYXJhbGxlbDsKCQlpZiAoc3RybmNtcChuYW1lLCAiZXNjb24iLCA1KSA9PSAwKQoJCQlyZXQgPSBjaGFubmVsX3R5cGVfZXNjb247Cgl9CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgbG9uZwpfX2N0Y19jaGVja19pcmJfZXJyb3Ioc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHN0cnVjdCBpcmIgKmlyYikKewoJaWYgKCFJU19FUlIoaXJiKSkKCQlyZXR1cm4gMDsKCglzd2l0Y2ggKFBUUl9FUlIoaXJiKSkgewoJY2FzZSAtRUlPOgoJCWN0Y19wcl93YXJuKCJpL28tZXJyb3Igb24gZGV2aWNlICVzXG4iLCBjZGV2LT5kZXYuYnVzX2lkKTsKLy8JCUNUQ19EQkZfVEVYVCh0cmFjZSwgMiwgImNraXJiZXJyIik7Ci8vCQlDVENfREJGX1RFWFRfKHRyYWNlLCAyLCAiICByYyVkIiwgLUVJTyk7CgkJYnJlYWs7CgljYXNlIC1FVElNRURPVVQ6CgkJY3RjX3ByX3dhcm4oInRpbWVvdXQgb24gZGV2aWNlICVzXG4iLCBjZGV2LT5kZXYuYnVzX2lkKTsKLy8JCUNUQ19EQkZfVEVYVCh0cmFjZSwgMiwgImNraXJiZXJyIik7Ci8vCQlDVENfREJGX1RFWFRfKHRyYWNlLCAyLCAiICByYyVkIiwgLUVUSU1FRE9VVCk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWN0Y19wcl93YXJuKCJ1bmtub3duIGVycm9yICVsZCBvbiBkZXZpY2UgJXNcbiIsIFBUUl9FUlIoaXJiKSwKCQkJICAgY2Rldi0+ZGV2LmJ1c19pZCk7Ci8vCQlDVENfREJGX1RFWFQodHJhY2UsIDIsICJja2lyYmVyciIpOwovLwkJQ1RDX0RCRl9URVhUKHRyYWNlLCAyLCAiICByYz8/PyIpOwoJfQoJcmV0dXJuIFBUUl9FUlIoaXJiKTsKfQoKLyoqCiAqIE1haW4gSVJRIGhhbmRsZXIuCiAqCiAqIEBwYXJhbSBjZGV2ICAgIFRoZSBjY3dfZGV2aWNlIHRoZSBpbnRlcnJ1cHQgaXMgZm9yLgogKiBAcGFyYW0gaW50cGFybSBpbnRlcnJ1cHRpb24gcGFyYW1ldGVyLgogKiBAcGFyYW0gaXJiICAgICBpbnRlcnJ1cHRpb24gcmVzcG9uc2UgYmxvY2suCiAqLwpzdGF0aWMgdm9pZApjdGNfaXJxX2hhbmRsZXIoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHVuc2lnbmVkIGxvbmcgaW50cGFybSwgc3RydWN0IGlyYiAqaXJiKQp7CglzdHJ1Y3QgY2hhbm5lbCAqY2g7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwoJc3RydWN0IGN0Y19wcml2ICpwcml2OwoKCURCRl9URVhUKHRyYWNlLCA1LCBfX0ZVTkNUSU9OX18pOwoJaWYgKF9fY3RjX2NoZWNrX2lyYl9lcnJvcihjZGV2LCBpcmIpKQoJCXJldHVybjsKCgkvKiBDaGVjayBmb3IgdW5zb2xpY2l0ZWQgaW50ZXJydXB0cy4gKi8KCWlmICghY2Rldi0+ZGV2LmRyaXZlcl9kYXRhKSB7CgkJY3RjX3ByX3dhcm4oImN0YzogR290IHVuc29saWNpdGVkIGlycTogJXMgYy0lMDJ4IGQtJTAyeFxuIiwKCQkJICAgIGNkZXYtPmRldi5idXNfaWQsIGlyYi0+c2Nzdy5jc3RhdCwKCQkJICAgIGlyYi0+c2Nzdy5kc3RhdCk7CgkJcmV0dXJuOwoJfQoKCXByaXYgPSAoKHN0cnVjdCBjY3dncm91cF9kZXZpY2UgKiljZGV2LT5kZXYuZHJpdmVyX2RhdGEpCgkJLT5kZXYuZHJpdmVyX2RhdGE7CgoJLyogVHJ5IHRvIGV4dHJhY3QgY2hhbm5lbCBmcm9tIGRyaXZlciBkYXRhLiAqLwoJaWYgKHByaXYtPmNoYW5uZWxbUkVBRF0tPmNkZXYgPT0gY2RldikKCQljaCA9IHByaXYtPmNoYW5uZWxbUkVBRF07CgllbHNlIGlmIChwcml2LT5jaGFubmVsW1dSSVRFXS0+Y2RldiA9PSBjZGV2KQoJCWNoID0gcHJpdi0+Y2hhbm5lbFtXUklURV07CgllbHNlIHsKCQljdGNfcHJfZXJyKCJjdGM6IENhbid0IGRldGVybWluZSBjaGFubmVsIGZvciBpbnRlcnJ1cHQsICIKCQkJICAgImRldmljZSAlc1xuIiwgY2Rldi0+ZGV2LmJ1c19pZCk7CgkJcmV0dXJuOwoJfQoKCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSAoY2gtPm5ldGRldik7CglpZiAoZGV2ID09IE5VTEwpIHsKCQljdGNfcHJfY3JpdCgiY3RjOiBjdGNfaXJxX2hhbmRsZXIgZGV2PU5VTEwgYnVzX2lkPSVzLCBjaD0weCVwXG4iLAoJCQkgICAgY2Rldi0+ZGV2LmJ1c19pZCwgY2gpOwoJCXJldHVybjsKCX0KCiNpZmRlZiBERUJVRwoJY3RjX3ByX2RlYnVnKCIlczogaW50ZXJydXB0IGZvciBkZXZpY2U6ICVzIHJlY2VpdmVkIGMtJTAyeCBkLSUwMnhcbiIsCgkJICAgICBkZXYtPm5hbWUsIGNoLT5pZCwgaXJiLT5zY3N3LmNzdGF0LCBpcmItPnNjc3cuZHN0YXQpOwojZW5kaWYKCgkvKiBDb3B5IGludGVycnVwdGlvbiByZXNwb25zZSBibG9jay4gKi8KCW1lbWNweShjaC0+aXJiLCBpcmIsIHNpemVvZihzdHJ1Y3QgaXJiKSk7CgoJLyogQ2hlY2sgZm9yIGdvb2Qgc3ViY2hhbm5lbCByZXR1cm4gY29kZSwgb3RoZXJ3aXNlIGVycm9yIG1lc3NhZ2UgKi8KCWlmIChjaC0+aXJiLT5zY3N3LmNzdGF0KSB7CgkJZnNtX2V2ZW50KGNoLT5mc20sIENIX0VWRU5UX1NDX1VOS05PV04sIGNoKTsKCQljdGNfcHJfd2FybigiJXM6IHN1YmNoYW5uZWwgY2hlY2sgZm9yIGRldmljZTogJXMgLSAlMDJ4ICUwMnhcbiIsCgkJCSAgICBkZXYtPm5hbWUsIGNoLT5pZCwgY2gtPmlyYi0+c2Nzdy5jc3RhdCwKCQkJICAgIGNoLT5pcmItPnNjc3cuZHN0YXQpOwoJCXJldHVybjsKCX0KCgkvKiBDaGVjayB0aGUgcmVhc29uLWNvZGUgb2YgYSB1bml0IGNoZWNrICovCglpZiAoY2gtPmlyYi0+c2Nzdy5kc3RhdCAmIERFVl9TVEFUX1VOSVRfQ0hFQ0spIHsKCQljY3dfdW5pdF9jaGVjayhjaCwgY2gtPmlyYi0+ZWN3WzBdKTsKCQlyZXR1cm47Cgl9CglpZiAoY2gtPmlyYi0+c2Nzdy5kc3RhdCAmIERFVl9TVEFUX0JVU1kpIHsKCQlpZiAoY2gtPmlyYi0+c2Nzdy5kc3RhdCAmIERFVl9TVEFUX0FUVEVOVElPTikKCQkJZnNtX2V2ZW50KGNoLT5mc20sIENIX0VWRU5UX0FUVE5CVVNZLCBjaCk7CgkJZWxzZQoJCQlmc21fZXZlbnQoY2gtPmZzbSwgQ0hfRVZFTlRfQlVTWSwgY2gpOwoJCXJldHVybjsKCX0KCWlmIChjaC0+aXJiLT5zY3N3LmRzdGF0ICYgREVWX1NUQVRfQVRURU5USU9OKSB7CgkJZnNtX2V2ZW50KGNoLT5mc20sIENIX0VWRU5UX0FUVE4sIGNoKTsKCQlyZXR1cm47Cgl9CglpZiAoKGNoLT5pcmItPnNjc3cuc3RjdGwgJiBTQ1NXX1NUQ1RMX1NFQ19TVEFUVVMpIHx8CgkgICAgKGNoLT5pcmItPnNjc3cuc3RjdGwgPT0gU0NTV19TVENUTF9TVEFUVVNfUEVORCkgfHwKCSAgICAoY2gtPmlyYi0+c2Nzdy5zdGN0bCA9PQoJICAgICAoU0NTV19TVENUTF9BTEVSVF9TVEFUVVMgfCBTQ1NXX1NUQ1RMX1NUQVRVU19QRU5EKSkpCgkJZnNtX2V2ZW50KGNoLT5mc20sIENIX0VWRU5UX0ZJTlNUQVQsIGNoKTsKCWVsc2UKCQlmc21fZXZlbnQoY2gtPmZzbSwgQ0hfRVZFTlRfSVJRLCBjaCk7Cgp9CgovKioKICogQWN0aW9ucyBmb3IgaW50ZXJmYWNlIC0gc3RhdGVtYWNoaW5lLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioKICogU3RhcnR1cCBjaGFubmVscyBieSBzZW5kaW5nIENIX0VWRU5UX1NUQVJUIHRvIGVhY2ggY2hhbm5lbC4KICoKICogQHBhcmFtIGZpICAgIEFuIGluc3RhbmNlIG9mIGFuIGludGVyZmFjZSBzdGF0ZW1hY2hpbmUuCiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQsIGp1c3QgaGFwcGVuZWQuCiAqIEBwYXJhbSBhcmcgICBHZW5lcmljIHBvaW50ZXIsIGNhc3RlZCBmcm9tIHN0cnVjdCBuZXRfZGV2aWNlICogdXBvbiBjYWxsLgogKi8Kc3RhdGljIHZvaWQKZGV2X2FjdGlvbl9zdGFydChmc21faW5zdGFuY2UgKiBmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCnsKCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgYXJnOwoJc3RydWN0IGN0Y19wcml2ICpwcml2cHRyID0gZGV2LT5wcml2OwoJaW50IGRpcmVjdGlvbjsKCglEQkZfVEVYVChzZXR1cCwgMywgX19GVU5DVElPTl9fKTsKCWZzbV9kZWx0aW1lcigmcHJpdnB0ci0+cmVzdGFydF90aW1lcik7Cglmc21fbmV3c3RhdGUoZmksIERFVl9TVEFURV9TVEFSVFdBSVRfUlhUWCk7Cglmb3IgKGRpcmVjdGlvbiA9IFJFQUQ7IGRpcmVjdGlvbiA8PSBXUklURTsgZGlyZWN0aW9uKyspIHsKCQlzdHJ1Y3QgY2hhbm5lbCAqY2ggPSBwcml2cHRyLT5jaGFubmVsW2RpcmVjdGlvbl07CgkJZnNtX2V2ZW50KGNoLT5mc20sIENIX0VWRU5UX1NUQVJULCBjaCk7Cgl9Cn0KCi8qKgogKiBTaHV0ZG93biBjaGFubmVscyBieSBzZW5kaW5nIENIX0VWRU5UX1NUT1AgdG8gZWFjaCBjaGFubmVsLgogKgogKiBAcGFyYW0gZmkgICAgQW4gaW5zdGFuY2Ugb2YgYW4gaW50ZXJmYWNlIHN0YXRlbWFjaGluZS4KICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCwganVzdCBoYXBwZW5lZC4KICogQHBhcmFtIGFyZyAgIEdlbmVyaWMgcG9pbnRlciwgY2FzdGVkIGZyb20gc3RydWN0IG5ldF9kZXZpY2UgKiB1cG9uIGNhbGwuCiAqLwpzdGF0aWMgdm9pZApkZXZfYWN0aW9uX3N0b3AoZnNtX2luc3RhbmNlICogZmksIGludCBldmVudCwgdm9pZCAqYXJnKQp7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGFyZzsKCXN0cnVjdCBjdGNfcHJpdiAqcHJpdnB0ciA9IGRldi0+cHJpdjsKCWludCBkaXJlY3Rpb247CgoJREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7Cglmc21fbmV3c3RhdGUoZmksIERFVl9TVEFURV9TVE9QV0FJVF9SWFRYKTsKCWZvciAoZGlyZWN0aW9uID0gUkVBRDsgZGlyZWN0aW9uIDw9IFdSSVRFOyBkaXJlY3Rpb24rKykgewoJCXN0cnVjdCBjaGFubmVsICpjaCA9IHByaXZwdHItPmNoYW5uZWxbZGlyZWN0aW9uXTsKCQlmc21fZXZlbnQoY2gtPmZzbSwgQ0hfRVZFTlRfU1RPUCwgY2gpOwoJfQp9CnN0YXRpYyB2b2lkCmRldl9hY3Rpb25fcmVzdGFydChmc21faW5zdGFuY2UgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKewoJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWFyZzsKCXN0cnVjdCBjdGNfcHJpdiAqcHJpdnB0ciA9IGRldi0+cHJpdjsKCglEQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKCWN0Y19wcl9kZWJ1ZygiJXM6IFJlc3RhcnRpbmdcbiIsIGRldi0+bmFtZSk7CglkZXZfYWN0aW9uX3N0b3AoZmksIGV2ZW50LCBhcmcpOwoJZnNtX2V2ZW50KHByaXZwdHItPmZzbSwgREVWX0VWRU5UX1NUT1AsIGRldik7Cglmc21fYWRkdGltZXIoJnByaXZwdHItPnJlc3RhcnRfdGltZXIsIENUQ19USU1FT1VUXzVTRUMsCgkJICAgICBERVZfRVZFTlRfU1RBUlQsIGRldik7Cn0KCi8qKgogKiBDYWxsZWQgZnJvbSBjaGFubmVsIHN0YXRlbWFjaGluZQogKiB3aGVuIGEgY2hhbm5lbCBpcyB1cCBhbmQgcnVubmluZy4KICoKICogQHBhcmFtIGZpICAgIEFuIGluc3RhbmNlIG9mIGFuIGludGVyZmFjZSBzdGF0ZW1hY2hpbmUuCiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQsIGp1c3QgaGFwcGVuZWQuCiAqIEBwYXJhbSBhcmcgICBHZW5lcmljIHBvaW50ZXIsIGNhc3RlZCBmcm9tIHN0cnVjdCBuZXRfZGV2aWNlICogdXBvbiBjYWxsLgogKi8Kc3RhdGljIHZvaWQKZGV2X2FjdGlvbl9jaHVwKGZzbV9pbnN0YW5jZSAqIGZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKewoJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBhcmc7CgoJREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7Cglzd2l0Y2ggKGZzbV9nZXRzdGF0ZShmaSkpIHsKCQljYXNlIERFVl9TVEFURV9TVEFSVFdBSVRfUlhUWDoKCQkJaWYgKGV2ZW50ID09IERFVl9FVkVOVF9SWFVQKQoJCQkJZnNtX25ld3N0YXRlKGZpLCBERVZfU1RBVEVfU1RBUlRXQUlUX1RYKTsKCQkJZWxzZQoJCQkJZnNtX25ld3N0YXRlKGZpLCBERVZfU1RBVEVfU1RBUlRXQUlUX1JYKTsKCQkJYnJlYWs7CgkJY2FzZSBERVZfU1RBVEVfU1RBUlRXQUlUX1JYOgoJCQlpZiAoZXZlbnQgPT0gREVWX0VWRU5UX1JYVVApIHsKCQkJCWZzbV9uZXdzdGF0ZShmaSwgREVWX1NUQVRFX1JVTk5JTkcpOwoJCQkJY3RjX3ByX2luZm8oIiVzOiBjb25uZWN0ZWQgd2l0aCByZW1vdGUgc2lkZVxuIiwKCQkJCQkgICAgZGV2LT5uYW1lKTsKCQkJCWN0Y19jbGVhcl9idXN5KGRldik7CgkJCX0KCQkJYnJlYWs7CgkJY2FzZSBERVZfU1RBVEVfU1RBUlRXQUlUX1RYOgoJCQlpZiAoZXZlbnQgPT0gREVWX0VWRU5UX1RYVVApIHsKCQkJCWZzbV9uZXdzdGF0ZShmaSwgREVWX1NUQVRFX1JVTk5JTkcpOwoJCQkJY3RjX3ByX2luZm8oIiVzOiBjb25uZWN0ZWQgd2l0aCByZW1vdGUgc2lkZVxuIiwKCQkJCQkgICAgZGV2LT5uYW1lKTsKCQkJCWN0Y19jbGVhcl9idXN5KGRldik7CgkJCX0KCQkJYnJlYWs7CgkJY2FzZSBERVZfU1RBVEVfU1RPUFdBSVRfVFg6CgkJCWlmIChldmVudCA9PSBERVZfRVZFTlRfUlhVUCkKCQkJCWZzbV9uZXdzdGF0ZShmaSwgREVWX1NUQVRFX1NUT1BXQUlUX1JYVFgpOwoJCQlicmVhazsKCQljYXNlIERFVl9TVEFURV9TVE9QV0FJVF9SWDoKCQkJaWYgKGV2ZW50ID09IERFVl9FVkVOVF9UWFVQKQoJCQkJZnNtX25ld3N0YXRlKGZpLCBERVZfU1RBVEVfU1RPUFdBSVRfUlhUWCk7CgkJCWJyZWFrOwoJfQp9CgovKioKICogQ2FsbGVkIGZyb20gY2hhbm5lbCBzdGF0ZW1hY2hpbmUKICogd2hlbiBhIGNoYW5uZWwgaGFzIGJlZW4gc2h1dGRvd24uCiAqCiAqIEBwYXJhbSBmaSAgICBBbiBpbnN0YW5jZSBvZiBhbiBpbnRlcmZhY2Ugc3RhdGVtYWNoaW5lLgogKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50LCBqdXN0IGhhcHBlbmVkLgogKiBAcGFyYW0gYXJnICAgR2VuZXJpYyBwb2ludGVyLCBjYXN0ZWQgZnJvbSBzdHJ1Y3QgbmV0X2RldmljZSAqIHVwb24gY2FsbC4KICovCnN0YXRpYyB2b2lkCmRldl9hY3Rpb25fY2hkb3duKGZzbV9pbnN0YW5jZSAqIGZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKewoKCURCRl9URVhUKHRyYWNlLCAzLCBfX0ZVTkNUSU9OX18pOwoJc3dpdGNoIChmc21fZ2V0c3RhdGUoZmkpKSB7CgkJY2FzZSBERVZfU1RBVEVfUlVOTklORzoKCQkJaWYgKGV2ZW50ID09IERFVl9FVkVOVF9UWERPV04pCgkJCQlmc21fbmV3c3RhdGUoZmksIERFVl9TVEFURV9TVEFSVFdBSVRfVFgpOwoJCQllbHNlCgkJCQlmc21fbmV3c3RhdGUoZmksIERFVl9TVEFURV9TVEFSVFdBSVRfUlgpOwoJCQlicmVhazsKCQljYXNlIERFVl9TVEFURV9TVEFSVFdBSVRfUlg6CgkJCWlmIChldmVudCA9PSBERVZfRVZFTlRfVFhET1dOKQoJCQkJZnNtX25ld3N0YXRlKGZpLCBERVZfU1RBVEVfU1RBUlRXQUlUX1JYVFgpOwoJCQlicmVhazsKCQljYXNlIERFVl9TVEFURV9TVEFSVFdBSVRfVFg6CgkJCWlmIChldmVudCA9PSBERVZfRVZFTlRfUlhET1dOKQoJCQkJZnNtX25ld3N0YXRlKGZpLCBERVZfU1RBVEVfU1RBUlRXQUlUX1JYVFgpOwoJCQlicmVhazsKCQljYXNlIERFVl9TVEFURV9TVE9QV0FJVF9SWFRYOgoJCQlpZiAoZXZlbnQgPT0gREVWX0VWRU5UX1RYRE9XTikKCQkJCWZzbV9uZXdzdGF0ZShmaSwgREVWX1NUQVRFX1NUT1BXQUlUX1JYKTsKCQkJZWxzZQoJCQkJZnNtX25ld3N0YXRlKGZpLCBERVZfU1RBVEVfU1RPUFdBSVRfVFgpOwoJCQlicmVhazsKCQljYXNlIERFVl9TVEFURV9TVE9QV0FJVF9SWDoKCQkJaWYgKGV2ZW50ID09IERFVl9FVkVOVF9SWERPV04pCgkJCQlmc21fbmV3c3RhdGUoZmksIERFVl9TVEFURV9TVE9QUEVEKTsKCQkJYnJlYWs7CgkJY2FzZSBERVZfU1RBVEVfU1RPUFdBSVRfVFg6CgkJCWlmIChldmVudCA9PSBERVZfRVZFTlRfVFhET1dOKQoJCQkJZnNtX25ld3N0YXRlKGZpLCBERVZfU1RBVEVfU1RPUFBFRCk7CgkJCWJyZWFrOwoJfQp9CgpzdGF0aWMgY29uc3QgZnNtX25vZGUgZGV2X2ZzbVtdID0gewoJe0RFVl9TVEFURV9TVE9QUEVELCBERVZfRVZFTlRfU1RBUlQsIGRldl9hY3Rpb25fc3RhcnR9LAoKCXtERVZfU1RBVEVfU1RPUFdBSVRfUlhUWCwgIERFVl9FVkVOVF9TVEFSVCwgICBkZXZfYWN0aW9uX3N0YXJ0ICAgfSwKCXtERVZfU1RBVEVfU1RPUFdBSVRfUlhUWCwgIERFVl9FVkVOVF9SWERPV04sICBkZXZfYWN0aW9uX2NoZG93biAgfSwKCXtERVZfU1RBVEVfU1RPUFdBSVRfUlhUWCwgIERFVl9FVkVOVF9UWERPV04sICBkZXZfYWN0aW9uX2NoZG93biAgfSwKIAl7REVWX1NUQVRFX1NUT1BXQUlUX1JYVFgsICBERVZfRVZFTlRfUkVTVEFSVCwgZGV2X2FjdGlvbl9yZXN0YXJ0IH0sCgoJe0RFVl9TVEFURV9TVE9QV0FJVF9SWCwgICAgREVWX0VWRU5UX1NUQVJULCAgIGRldl9hY3Rpb25fc3RhcnQgICB9LAoJe0RFVl9TVEFURV9TVE9QV0FJVF9SWCwgICAgREVWX0VWRU5UX1JYVVAsICAgIGRldl9hY3Rpb25fY2h1cCAgICB9LAoJe0RFVl9TVEFURV9TVE9QV0FJVF9SWCwgICAgREVWX0VWRU5UX1RYVVAsICAgIGRldl9hY3Rpb25fY2h1cCAgICB9LAoJe0RFVl9TVEFURV9TVE9QV0FJVF9SWCwgICAgREVWX0VWRU5UX1JYRE9XTiwgIGRldl9hY3Rpb25fY2hkb3duICB9LAogCXtERVZfU1RBVEVfU1RPUFdBSVRfUlgsICAgIERFVl9FVkVOVF9SRVNUQVJULCBkZXZfYWN0aW9uX3Jlc3RhcnQgfSwKCgl7REVWX1NUQVRFX1NUT1BXQUlUX1RYLCAgICBERVZfRVZFTlRfU1RBUlQsICAgZGV2X2FjdGlvbl9zdGFydCAgIH0sCgl7REVWX1NUQVRFX1NUT1BXQUlUX1RYLCAgICBERVZfRVZFTlRfUlhVUCwgICAgZGV2X2FjdGlvbl9jaHVwICAgIH0sCgl7REVWX1NUQVRFX1NUT1BXQUlUX1RYLCAgICBERVZfRVZFTlRfVFhVUCwgICAgZGV2X2FjdGlvbl9jaHVwICAgIH0sCgl7REVWX1NUQVRFX1NUT1BXQUlUX1RYLCAgICBERVZfRVZFTlRfVFhET1dOLCAgZGV2X2FjdGlvbl9jaGRvd24gIH0sCiAJe0RFVl9TVEFURV9TVE9QV0FJVF9UWCwgICAgREVWX0VWRU5UX1JFU1RBUlQsIGRldl9hY3Rpb25fcmVzdGFydCB9LAoKCXtERVZfU1RBVEVfU1RBUlRXQUlUX1JYVFgsIERFVl9FVkVOVF9TVE9QLCAgICBkZXZfYWN0aW9uX3N0b3AgICAgfSwKCXtERVZfU1RBVEVfU1RBUlRXQUlUX1JYVFgsIERFVl9FVkVOVF9SWFVQLCAgICBkZXZfYWN0aW9uX2NodXAgICAgfSwKCXtERVZfU1RBVEVfU1RBUlRXQUlUX1JYVFgsIERFVl9FVkVOVF9UWFVQLCAgICBkZXZfYWN0aW9uX2NodXAgICAgfSwKCXtERVZfU1RBVEVfU1RBUlRXQUlUX1JYVFgsIERFVl9FVkVOVF9SWERPV04sICBkZXZfYWN0aW9uX2NoZG93biAgfSwKCXtERVZfU1RBVEVfU1RBUlRXQUlUX1JYVFgsIERFVl9FVkVOVF9UWERPV04sICBkZXZfYWN0aW9uX2NoZG93biAgfSwKIAl7REVWX1NUQVRFX1NUQVJUV0FJVF9SWFRYLCBERVZfRVZFTlRfUkVTVEFSVCwgZGV2X2FjdGlvbl9yZXN0YXJ0IH0sCgoJe0RFVl9TVEFURV9TVEFSVFdBSVRfVFgsICAgREVWX0VWRU5UX1NUT1AsICAgIGRldl9hY3Rpb25fc3RvcCAgICB9LAoJe0RFVl9TVEFURV9TVEFSVFdBSVRfVFgsICAgREVWX0VWRU5UX1JYVVAsICAgIGRldl9hY3Rpb25fY2h1cCAgICB9LAoJe0RFVl9TVEFURV9TVEFSVFdBSVRfVFgsICAgREVWX0VWRU5UX1RYVVAsICAgIGRldl9hY3Rpb25fY2h1cCAgICB9LAoJe0RFVl9TVEFURV9TVEFSVFdBSVRfVFgsICAgREVWX0VWRU5UX1JYRE9XTiwgIGRldl9hY3Rpb25fY2hkb3duICB9LAogCXtERVZfU1RBVEVfU1RBUlRXQUlUX1RYLCAgIERFVl9FVkVOVF9SRVNUQVJULCBkZXZfYWN0aW9uX3Jlc3RhcnQgfSwKCgl7REVWX1NUQVRFX1NUQVJUV0FJVF9SWCwgICBERVZfRVZFTlRfU1RPUCwgICAgZGV2X2FjdGlvbl9zdG9wICAgIH0sCgl7REVWX1NUQVRFX1NUQVJUV0FJVF9SWCwgICBERVZfRVZFTlRfUlhVUCwgICAgZGV2X2FjdGlvbl9jaHVwICAgIH0sCgl7REVWX1NUQVRFX1NUQVJUV0FJVF9SWCwgICBERVZfRVZFTlRfVFhVUCwgICAgZGV2X2FjdGlvbl9jaHVwICAgIH0sCgl7REVWX1NUQVRFX1NUQVJUV0FJVF9SWCwgICBERVZfRVZFTlRfVFhET1dOLCAgZGV2X2FjdGlvbl9jaGRvd24gIH0sCiAJe0RFVl9TVEFURV9TVEFSVFdBSVRfUlgsICAgREVWX0VWRU5UX1JFU1RBUlQsIGRldl9hY3Rpb25fcmVzdGFydCB9LAoKCXtERVZfU1RBVEVfUlVOTklORywgICAgICAgIERFVl9FVkVOVF9TVE9QLCAgICBkZXZfYWN0aW9uX3N0b3AgICAgfSwKCXtERVZfU1RBVEVfUlVOTklORywgICAgICAgIERFVl9FVkVOVF9SWERPV04sICBkZXZfYWN0aW9uX2NoZG93biAgfSwKCXtERVZfU1RBVEVfUlVOTklORywgICAgICAgIERFVl9FVkVOVF9UWERPV04sICBkZXZfYWN0aW9uX2NoZG93biAgfSwKCXtERVZfU1RBVEVfUlVOTklORywgICAgICAgIERFVl9FVkVOVF9UWFVQLCAgICBmc21fYWN0aW9uX25vcCAgICAgfSwKCXtERVZfU1RBVEVfUlVOTklORywgICAgICAgIERFVl9FVkVOVF9SWFVQLCAgICBmc21fYWN0aW9uX25vcCAgICAgfSwKIAl7REVWX1NUQVRFX1JVTk5JTkcsICAgICAgICBERVZfRVZFTlRfUkVTVEFSVCwgZGV2X2FjdGlvbl9yZXN0YXJ0IH0sCn07CgpzdGF0aWMgY29uc3QgaW50IERFVl9GU01fTEVOID0gc2l6ZW9mIChkZXZfZnNtKSAvIHNpemVvZiAoZnNtX25vZGUpOwoKLyoqCiAqIFRyYW5zbWl0IGEgcGFja2V0LgogKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciBjdGNfdHgoKS4KICoKICogQHBhcmFtIGNoIENoYW5uZWwgdG8gYmUgdXNlZCBmb3Igc2VuZGluZy4KICogQHBhcmFtIHNrYiBQb2ludGVyIHRvIHN0cnVjdCBza19idWZmIG9mIHBhY2tldCB0byBzZW5kLgogKiAgICAgICAgICAgIFRoZSBsaW5rbGV2ZWwgaGVhZGVyIGhhcyBhbHJlYWR5IGJlZW4gc2V0IHVwCiAqICAgICAgICAgICAgYnkgY3RjX3R4KCkuCiAqCiAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAtRVJSTk8gb24gZmFpbHVyZS4gKE5ldmVyIGZhaWxzLikKICovCnN0YXRpYyBpbnQKdHJhbnNtaXRfc2tiKHN0cnVjdCBjaGFubmVsICpjaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJdW5zaWduZWQgbG9uZyBzYXZlZmxhZ3M7CglzdHJ1Y3QgbGxfaGVhZGVyIGhlYWRlcjsKCWludCByYyA9IDA7CgoJREJGX1RFWFQodHJhY2UsIDUsIF9fRlVOQ1RJT05fXyk7CgkvKiB3ZSBuZWVkIHRvIGFjcXVpcmUgdGhlIGxvY2sgZm9yIHRlc3RpbmcgdGhlIHN0YXRlCgkgKiBvdGhlcndpc2Ugd2UgY2FuIGhhdmUgYW4gSVJRIGNoYW5naW5nIHRoZSBzdGF0ZSB0bwoJICogVFhJRExFIGFmdGVyIHRoZSB0ZXN0IGJ1dCBiZWZvcmUgYWNxdWlyaW5nIHRoZSBsb2NrLgoJICovCglzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNvbGxlY3RfbG9jaywgc2F2ZWZsYWdzKTsKCWlmIChmc21fZ2V0c3RhdGUoY2gtPmZzbSkgIT0gQ0hfU1RBVEVfVFhJRExFKSB7CgkJaW50IGwgPSBza2ItPmxlbiArIExMX0hFQURFUl9MRU5HVEg7CgoJCWlmIChjaC0+Y29sbGVjdF9sZW4gKyBsID4gY2gtPm1heF9idWZzaXplIC0gMikgewoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y29sbGVjdF9sb2NrLCBzYXZlZmxhZ3MpOwoJCQlyZXR1cm4gLUVCVVNZOwoJCX0gZWxzZSB7CgkJCWF0b21pY19pbmMoJnNrYi0+dXNlcnMpOwoJCQloZWFkZXIubGVuZ3RoID0gbDsKCQkJaGVhZGVyLnR5cGUgPSBza2ItPnByb3RvY29sOwoJCQloZWFkZXIudW51c2VkID0gMDsKCQkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgTExfSEVBREVSX0xFTkdUSCksICZoZWFkZXIsCgkJCSAgICAgICBMTF9IRUFERVJfTEVOR1RIKTsKCQkJc2tiX3F1ZXVlX3RhaWwoJmNoLT5jb2xsZWN0X3F1ZXVlLCBza2IpOwoJCQljaC0+Y29sbGVjdF9sZW4gKz0gbDsKCQl9CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNvbGxlY3RfbG9jaywgc2F2ZWZsYWdzKTsKCX0gZWxzZSB7CgkJX191MTYgYmxvY2tfbGVuOwoJCWludCBjY3dfaWR4OwoJCXN0cnVjdCBza19idWZmICpuc2tiOwoJCXVuc2lnbmVkIGxvbmcgaGk7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNvbGxlY3RfbG9jaywgc2F2ZWZsYWdzKTsKCQkvKioKCQkgKiBQcm90ZWN0IHNrYiBhZ2FpbnN0IGJlZWluZyBmcmVlJ2QgYnkgdXBwZXIKCQkgKiBsYXllcnMuCgkJICovCgkJYXRvbWljX2luYygmc2tiLT51c2Vycyk7CgkJY2gtPnByb2YudHhsZW4gKz0gc2tiLT5sZW47CgkJaGVhZGVyLmxlbmd0aCA9IHNrYi0+bGVuICsgTExfSEVBREVSX0xFTkdUSDsKCQloZWFkZXIudHlwZSA9IHNrYi0+cHJvdG9jb2w7CgkJaGVhZGVyLnVudXNlZCA9IDA7CgkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgTExfSEVBREVSX0xFTkdUSCksICZoZWFkZXIsCgkJICAgICAgIExMX0hFQURFUl9MRU5HVEgpOwoJCWJsb2NrX2xlbiA9IHNrYi0+bGVuICsgMjsKCQkqKChfX3UxNiAqKSBza2JfcHVzaChza2IsIDIpKSA9IGJsb2NrX2xlbjsKCgkJLyoqCgkJICogSURBTCBzdXBwb3J0IGluIENUQyBpcyBicm9rZW4sIHNvIHdlIGhhdmUgdG8KCQkgKiBjYXJlIGFib3V0IHNrYidzIGFib3ZlIDJHIG91cnNlbHZlcy4KCQkgKi8KCQloaSA9ICgodW5zaWduZWQgbG9uZykgc2tiLT50YWlsICsgTExfSEVBREVSX0xFTkdUSCkgPj4gMzE7CgkJaWYgKGhpKSB7CgkJCW5za2IgPSBhbGxvY19za2Ioc2tiLT5sZW4sIEdGUF9BVE9NSUMgfCBHRlBfRE1BKTsKCQkJaWYgKCFuc2tiKSB7CgkJCQlhdG9taWNfZGVjKCZza2ItPnVzZXJzKTsKCQkJCXNrYl9wdWxsKHNrYiwgTExfSEVBREVSX0xFTkdUSCArIDIpOwoJCQkJY3RjX2NsZWFyX2J1c3koY2gtPm5ldGRldik7CgkJCQlyZXR1cm4gLUVOT01FTTsKCQkJfSBlbHNlIHsKCQkJCW1lbWNweShza2JfcHV0KG5za2IsIHNrYi0+bGVuKSwKCQkJCSAgICAgICBza2ItPmRhdGEsIHNrYi0+bGVuKTsKCQkJCWF0b21pY19pbmMoJm5za2ItPnVzZXJzKTsKCQkJCWF0b21pY19kZWMoJnNrYi0+dXNlcnMpOwoJCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKCQkJCXNrYiA9IG5za2I7CgkJCX0KCQl9CgoJCWNoLT5jY3dbNF0uY291bnQgPSBibG9ja19sZW47CgkJaWYgKHNldF9ub3JtYWxpemVkX2NkYSgmY2gtPmNjd1s0XSwgc2tiLT5kYXRhKSkgewoJCQkvKioKCQkJICogaWRhbCBhbGxvY2F0aW9uIGZhaWxlZCwgdHJ5IHZpYSBjb3B5aW5nIHRvCgkJCSAqIHRyYW5zX3NrYi4gdHJhbnNfc2tiIHVzdWFsbHkgaGFzIGEgcHJlLWFsbG9jYXRlZAoJCQkgKiBpZGFsLgoJCQkgKi8KCQkJaWYgKGN0Y19jaGVja2FsbG9jX2J1ZmZlcihjaCwgMSkpIHsKCQkJCS8qKgoJCQkJICogUmVtb3ZlIG91ciBoZWFkZXIuIEl0IGdldHMgYWRkZWQKCQkJCSAqIGFnYWluIG9uIHJldHJhbnNtaXQuCgkJCQkgKi8KCQkJCWF0b21pY19kZWMoJnNrYi0+dXNlcnMpOwoJCQkJc2tiX3B1bGwoc2tiLCBMTF9IRUFERVJfTEVOR1RIICsgMik7CgkJCQljdGNfY2xlYXJfYnVzeShjaC0+bmV0ZGV2KTsKCQkJCXJldHVybiAtRUJVU1k7CgkJCX0KCgkJCWNoLT50cmFuc19za2ItPnRhaWwgPSBjaC0+dHJhbnNfc2tiLT5kYXRhOwoJCQljaC0+dHJhbnNfc2tiLT5sZW4gPSAwOwoJCQljaC0+Y2N3WzFdLmNvdW50ID0gc2tiLT5sZW47CgkJCW1lbWNweShza2JfcHV0KGNoLT50cmFuc19za2IsIHNrYi0+bGVuKSwgc2tiLT5kYXRhLAoJCQkgICAgICAgc2tiLT5sZW4pOwoJCQlhdG9taWNfZGVjKCZza2ItPnVzZXJzKTsKCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKCQkJY2N3X2lkeCA9IDA7CgkJfSBlbHNlIHsKCQkJc2tiX3F1ZXVlX3RhaWwoJmNoLT5pb19xdWV1ZSwgc2tiKTsKCQkJY2N3X2lkeCA9IDM7CgkJfQoJCWNoLT5yZXRyeSA9IDA7CgkJZnNtX25ld3N0YXRlKGNoLT5mc20sIENIX1NUQVRFX1RYKTsKCQlmc21fYWRkdGltZXIoJmNoLT50aW1lciwgQ1RDX1RJTUVPVVRfNVNFQywgQ0hfRVZFTlRfVElNRVIsIGNoKTsKCQlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soY2gtPmNkZXYpLCBzYXZlZmxhZ3MpOwoJCWNoLT5wcm9mLnNlbmRfc3RhbXAgPSB4dGltZTsKCQlyYyA9IGNjd19kZXZpY2Vfc3RhcnQoY2gtPmNkZXYsICZjaC0+Y2N3W2Njd19pZHhdLAoJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGNoLCAweGZmLCAwKTsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhjaC0+Y2RldiksIHNhdmVmbGFncyk7CgkJaWYgKGNjd19pZHggPT0gMykKCQkJY2gtPnByb2YuZG9pb3Nfc2luZ2xlKys7CgkJaWYgKHJjICE9IDApIHsKCQkJZnNtX2RlbHRpbWVyKCZjaC0+dGltZXIpOwoJCQljY3dfY2hlY2tfcmV0dXJuX2NvZGUoY2gsIHJjLCAic2luZ2xlIHNrYiBUWCIpOwoJCQlpZiAoY2N3X2lkeCA9PSAzKQoJCQkJc2tiX2RlcXVldWVfdGFpbCgmY2gtPmlvX3F1ZXVlKTsKCQkJLyoqCgkJCSAqIFJlbW92ZSBvdXIgaGVhZGVyLiBJdCBnZXRzIGFkZGVkCgkJCSAqIGFnYWluIG9uIHJldHJhbnNtaXQuCgkJCSAqLwoJCQlza2JfcHVsbChza2IsIExMX0hFQURFUl9MRU5HVEggKyAyKTsKCQl9IGVsc2UgewoJCQlpZiAoY2N3X2lkeCA9PSAwKSB7CgkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2gtPm5ldGRldjsKCQkJCXN0cnVjdCBjdGNfcHJpdiAqcHJpdnB0ciA9IGRldi0+cHJpdjsKCQkJCXByaXZwdHItPnN0YXRzLnR4X3BhY2tldHMrKzsKCQkJCXByaXZwdHItPnN0YXRzLnR4X2J5dGVzICs9CgkJCQkgICAgc2tiLT5sZW4gLSBMTF9IRUFERVJfTEVOR1RIOwoJCQl9CgkJfQoJfQoKCWN0Y19jbGVhcl9idXN5KGNoLT5uZXRkZXYpOwoJcmV0dXJuIHJjOwp9CgovKioKICogSW50ZXJmYWNlIEFQSSBmb3IgdXBwZXIgbmV0d29yayBsYXllcnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqCiAqIE9wZW4gYW4gaW50ZXJmYWNlLgogKiBDYWxsZWQgZnJvbSBnZW5lcmljIG5ldHdvcmsgbGF5ZXIgd2hlbiBpZmNvbmZpZyB1cCBpcyBydW4uCiAqCiAqIEBwYXJhbSBkZXYgUG9pbnRlciB0byBpbnRlcmZhY2Ugc3RydWN0LgogKgogKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgLUVSUk5PIG9uIGZhaWx1cmUuIChOZXZlciBmYWlscy4pCiAqLwpzdGF0aWMgaW50CmN0Y19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQp7CglEQkZfVEVYVCh0cmFjZSwgNSwgX19GVU5DVElPTl9fKTsKCWZzbV9ldmVudCgoKHN0cnVjdCBjdGNfcHJpdiAqKSBkZXYtPnByaXYpLT5mc20sIERFVl9FVkVOVF9TVEFSVCwgZGV2KTsKCXJldHVybiAwOwp9CgovKioKICogQ2xvc2UgYW4gaW50ZXJmYWNlLgogKiBDYWxsZWQgZnJvbSBnZW5lcmljIG5ldHdvcmsgbGF5ZXIgd2hlbiBpZmNvbmZpZyBkb3duIGlzIHJ1bi4KICoKICogQHBhcmFtIGRldiBQb2ludGVyIHRvIGludGVyZmFjZSBzdHJ1Y3QuCiAqCiAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAtRVJSTk8gb24gZmFpbHVyZS4gKE5ldmVyIGZhaWxzLikKICovCnN0YXRpYyBpbnQKY3RjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQp7CglEQkZfVEVYVCh0cmFjZSwgNSwgX19GVU5DVElPTl9fKTsKCWZzbV9ldmVudCgoKHN0cnVjdCBjdGNfcHJpdiAqKSBkZXYtPnByaXYpLT5mc20sIERFVl9FVkVOVF9TVE9QLCBkZXYpOwoJcmV0dXJuIDA7Cn0KCi8qKgogKiBTdGFydCB0cmFuc21pc3Npb24gb2YgYSBwYWNrZXQuCiAqIENhbGxlZCBmcm9tIGdlbmVyaWMgbmV0d29yayBkZXZpY2UgbGF5ZXIuCiAqCiAqIEBwYXJhbSBza2IgUG9pbnRlciB0byBidWZmZXIgY29udGFpbmluZyB0aGUgcGFja2V0LgogKiBAcGFyYW0gZGV2IFBvaW50ZXIgdG8gaW50ZXJmYWNlIHN0cnVjdC4KICoKICogQHJldHVybiAwIGlmIHBhY2tldCBjb25zdW1lZCwgITAgaWYgcGFja2V0IHJlamVjdGVkLgogKiAgICAgICAgIE5vdGU6IElmIHdlIHJldHVybiAhMCwgdGhlbiB0aGUgcGFja2V0IGlzIGZyZWUnZCBieQogKiAgICAgICAgICAgICAgIHRoZSBnZW5lcmljIG5ldHdvcmsgbGF5ZXIuCiAqLwpzdGF0aWMgaW50CmN0Y190eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKewoJaW50IHJjID0gMDsKCXN0cnVjdCBjdGNfcHJpdiAqcHJpdnB0ciA9IChzdHJ1Y3QgY3RjX3ByaXYgKikgZGV2LT5wcml2OwoKCURCRl9URVhUKHRyYWNlLCA1LCBfX0ZVTkNUSU9OX18pOwoJLyoqCgkgKiBTb21lIHNhbml0eSBjaGVja3MgLi4uCgkgKi8KCWlmIChza2IgPT0gTlVMTCkgewoJCWN0Y19wcl93YXJuKCIlczogTlVMTCBza19idWZmIHBhc3NlZFxuIiwgZGV2LT5uYW1lKTsKCQlwcml2cHRyLT5zdGF0cy50eF9kcm9wcGVkKys7CgkJcmV0dXJuIDA7Cgl9CglpZiAoc2tiX2hlYWRyb29tKHNrYikgPCAoTExfSEVBREVSX0xFTkdUSCArIDIpKSB7CgkJY3RjX3ByX3dhcm4oIiVzOiBHb3Qgc2tfYnVmZiB3aXRoIGhlYWQgcm9vbSA8ICVsZCBieXRlc1xuIiwKCQkJICAgIGRldi0+bmFtZSwgTExfSEVBREVSX0xFTkdUSCArIDIpOwoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCQlwcml2cHRyLT5zdGF0cy50eF9kcm9wcGVkKys7CgkJcmV0dXJuIDA7Cgl9CgoJLyoqCgkgKiBJZiBjaGFubmVscyBhcmUgbm90IHJ1bm5pbmcsIHRyeSB0byByZXN0YXJ0IHRoZW0KCSAqIGFuZCB0aHJvdyBhd2F5IHBhY2tldC4KCSAqLwoJaWYgKGZzbV9nZXRzdGF0ZShwcml2cHRyLT5mc20pICE9IERFVl9TVEFURV9SVU5OSU5HKSB7CgkJZnNtX2V2ZW50KHByaXZwdHItPmZzbSwgREVWX0VWRU5UX1NUQVJULCBkZXYpOwoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCQlwcml2cHRyLT5zdGF0cy50eF9kcm9wcGVkKys7CgkJcHJpdnB0ci0+c3RhdHMudHhfZXJyb3JzKys7CgkJcHJpdnB0ci0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKCQlyZXR1cm4gMDsKCX0KCglpZiAoY3RjX3Rlc3RfYW5kX3NldF9idXN5KGRldikpCgkJcmV0dXJuIC1FQlVTWTsKCglkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKCWlmICh0cmFuc21pdF9za2IocHJpdnB0ci0+Y2hhbm5lbFtXUklURV0sIHNrYikgIT0gMCkKCQlyYyA9IDE7CglyZXR1cm4gcmM7Cn0KCi8qKgogKiBTZXRzIE1UVSBvZiBhbiBpbnRlcmZhY2UuCiAqCiAqIEBwYXJhbSBkZXYgICAgIFBvaW50ZXIgdG8gaW50ZXJmYWNlIHN0cnVjdC4KICogQHBhcmFtIG5ld19tdHUgVGhlIG5ldyBNVFUgdG8gdXNlIGZvciB0aGlzIGludGVyZmFjZS4KICoKICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgTVRVIGlzIG91dCBvZiB2YWxpZCByYW5nZS4KICogICAgICAgICAodmFsaWQgcmFuZ2UgaXMgNTc2IC4uIDY1NTI3KS4gSWYgVk0gaXMgb24gdGhlCiAqICAgICAgICAgcmVtb3RlIHNpZGUsIG1heGltdW0gTVRVIGlzIDMyNzYwLCBob3dldmVyIHRoaXMgaXMKICogICAgICAgICA8ZW0+bm90PC9lbT4gY2hlY2tlZCBoZXJlLgogKi8Kc3RhdGljIGludApjdGNfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IG5ld19tdHUpCnsKCXN0cnVjdCBjdGNfcHJpdiAqcHJpdnB0ciA9IChzdHJ1Y3QgY3RjX3ByaXYgKikgZGV2LT5wcml2OwoKCURCRl9URVhUKHRyYWNlLCAzLCBfX0ZVTkNUSU9OX18pOwoJaWYgKChuZXdfbXR1IDwgNTc2KSB8fCAobmV3X210dSA+IDY1NTI3KSB8fAoJICAgIChuZXdfbXR1ID4gKHByaXZwdHItPmNoYW5uZWxbUkVBRF0tPm1heF9idWZzaXplIC0KCQkJTExfSEVBREVSX0xFTkdUSCAtIDIpKSkKCQlyZXR1cm4gLUVJTlZBTDsKCWRldi0+bXR1ID0gbmV3X210dTsKCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gTExfSEVBREVSX0xFTkdUSCArIDI7CglyZXR1cm4gMDsKfQoKLyoqCiAqIFJldHVybnMgaW50ZXJmYWNlIHN0YXRpc3RpY3Mgb2YgYSBkZXZpY2UuCiAqCiAqIEBwYXJhbSBkZXYgUG9pbnRlciB0byBpbnRlcmZhY2Ugc3RydWN0LgogKgogKiBAcmV0dXJuIFBvaW50ZXIgdG8gc3RhdHMgc3RydWN0IG9mIHRoaXMgaW50ZXJmYWNlLgogKi8Kc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKY3RjX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQp7CglyZXR1cm4gJigoc3RydWN0IGN0Y19wcml2ICopIGRldi0+cHJpdiktPnN0YXRzOwp9CgovKgogKiBzeXNmcyBhdHRyaWJ1dGVzCiAqLwoKc3RhdGljIHNzaXplX3QKYnVmZmVyX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQp7CglzdHJ1Y3QgY3RjX3ByaXYgKnByaXY7CgoJcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CglpZiAoIXByaXYpCgkJcmV0dXJuIC1FTk9ERVY7CglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKCQkJcHJpdi0+YnVmZmVyX3NpemUpOwp9CgpzdGF0aWMgc3NpemVfdApidWZmZXJfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCnsKCXN0cnVjdCBjdGNfcHJpdiAqcHJpdjsKCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwoJaW50IGJzMTsKCWNoYXIgYnVmZmVyWzE2XTsKCglEQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKCURCRl9URVhUKHRyYWNlLCAzLCBidWYpOwoJcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CglpZiAoIXByaXYpIHsKCQlEQkZfVEVYVCh0cmFjZSwgMywgImJmbm9wcml2Iik7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJc3NjYW5mKGJ1ZiwgIiV1IiwgJmJzMSk7CglpZiAoYnMxID4gQ1RDX0JVRlNJWkVfTElNSVQpCgkJZ290byBlaW52YWw7CglpZiAoYnMxIDwgKDU3NiArIExMX0hFQURFUl9MRU5HVEggKyAyKSkKCQlnb3RvIGVpbnZhbDsKCXByaXYtPmJ1ZmZlcl9zaXplID0gYnMxOwkvLyBqdXN0IHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdAoKCW5kZXYgPSBwcml2LT5jaGFubmVsW1JFQURdLT5uZXRkZXY7CglpZiAoIW5kZXYpIHsKCQlEQkZfVEVYVCh0cmFjZSwgMywgImJmbm9uZGV2Iik7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJaWYgKChuZGV2LT5mbGFncyAmIElGRl9SVU5OSU5HKSAmJgoJICAgIChiczEgPCAobmRldi0+bXR1ICsgTExfSEVBREVSX0xFTkdUSCArIDIpKSkKCQlnb3RvIGVpbnZhbDsKCglwcml2LT5jaGFubmVsW1JFQURdLT5tYXhfYnVmc2l6ZSA9IGJzMTsKCXByaXYtPmNoYW5uZWxbV1JJVEVdLT5tYXhfYnVmc2l6ZSA9IGJzMTsKCWlmICghKG5kZXYtPmZsYWdzICYgSUZGX1JVTk5JTkcpKQoJCW5kZXYtPm10dSA9IGJzMSAtIExMX0hFQURFUl9MRU5HVEggLSAyOwoJcHJpdi0+Y2hhbm5lbFtSRUFEXS0+ZmxhZ3MgfD0gQ0hBTk5FTF9GTEFHU19CVUZTSVpFX0NIQU5HRUQ7Cglwcml2LT5jaGFubmVsW1dSSVRFXS0+ZmxhZ3MgfD0gQ0hBTk5FTF9GTEFHU19CVUZTSVpFX0NIQU5HRUQ7CgoJc3ByaW50ZihidWZmZXIsICIlZCIscHJpdi0+YnVmZmVyX3NpemUpOwoJREJGX1RFWFQodHJhY2UsIDMsIGJ1ZmZlcik7CglyZXR1cm4gY291bnQ7CgplaW52YWw6CglEQkZfVEVYVCh0cmFjZSwgMywgImJ1ZmZfZXJyIik7CglyZXR1cm4gLUVJTlZBTDsKfQoKc3RhdGljIHNzaXplX3QKbG9nbGV2ZWxfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCnsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBsb2dsZXZlbCk7Cn0KCnN0YXRpYyBzc2l6ZV90CmxvZ2xldmVsX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQp7CglpbnQgbGwxOwoKCURCRl9URVhUKHRyYWNlLCA1LCBfX0ZVTkNUSU9OX18pOwoJc3NjYW5mKGJ1ZiwgIiVpIiwgJmxsMSk7CgoJaWYgKChsbDEgPiBDVENfTE9HTEVWRUxfTUFYKSB8fCAobGwxIDwgMCkpCgkJcmV0dXJuIC1FSU5WQUw7Cglsb2dsZXZlbCA9IGxsMTsKCXJldHVybiBjb3VudDsKfQoKc3RhdGljIHZvaWQKY3RjX3ByaW50X3N0YXRpc3RpY3Moc3RydWN0IGN0Y19wcml2ICpwcml2KQp7CgljaGFyICpzYnVmOwoJY2hhciAqcDsKCglEQkZfVEVYVCh0cmFjZSwgNCwgX19GVU5DVElPTl9fKTsKCWlmICghcHJpdikKCQlyZXR1cm47CglzYnVmID0gKGNoYXIgKilrbWFsbG9jKDIwNDgsIEdGUF9LRVJORUwpOwoJaWYgKHNidWYgPT0gTlVMTCkKCQlyZXR1cm47CglwID0gc2J1ZjsKCglwICs9IHNwcmludGYocCwgIiAgRGV2aWNlIEZTTSBzdGF0ZTogJXNcbiIsCgkJICAgICBmc21fZ2V0c3RhdGVfc3RyKHByaXYtPmZzbSkpOwoJcCArPSBzcHJpbnRmKHAsICIgIFJYIGNoYW5uZWwgRlNNIHN0YXRlOiAlc1xuIiwKCQkgICAgIGZzbV9nZXRzdGF0ZV9zdHIocHJpdi0+Y2hhbm5lbFtSRUFEXS0+ZnNtKSk7CglwICs9IHNwcmludGYocCwgIiAgVFggY2hhbm5lbCBGU00gc3RhdGU6ICVzXG4iLAoJCSAgICAgZnNtX2dldHN0YXRlX3N0cihwcml2LT5jaGFubmVsW1dSSVRFXS0+ZnNtKSk7CglwICs9IHNwcmludGYocCwgIiAgTWF4LiBUWCBidWZmZXIgdXNlZDogJWxkXG4iLAoJCSAgICAgcHJpdi0+Y2hhbm5lbFtXUklURV0tPnByb2YubWF4bXVsdGkpOwoJcCArPSBzcHJpbnRmKHAsICIgIE1heC4gY2hhaW5lZCBTS0JzOiAlbGRcbiIsCgkJICAgICBwcml2LT5jaGFubmVsW1dSSVRFXS0+cHJvZi5tYXhjcXVldWUpOwoJcCArPSBzcHJpbnRmKHAsICIgIFRYIHNpbmdsZSB3cml0ZSBvcHM6ICVsZFxuIiwKCQkgICAgIHByaXYtPmNoYW5uZWxbV1JJVEVdLT5wcm9mLmRvaW9zX3NpbmdsZSk7CglwICs9IHNwcmludGYocCwgIiAgVFggbXVsdGkgd3JpdGUgb3BzOiAlbGRcbiIsCgkJICAgICBwcml2LT5jaGFubmVsW1dSSVRFXS0+cHJvZi5kb2lvc19tdWx0aSk7CglwICs9IHNwcmludGYocCwgIiAgTmV0dG8gYnl0ZXMgd3JpdHRlbjogJWxkXG4iLAoJCSAgICAgcHJpdi0+Y2hhbm5lbFtXUklURV0tPnByb2YudHhsZW4pOwoJcCArPSBzcHJpbnRmKHAsICIgIE1heC4gVFggSU8tdGltZTogJWxkXG4iLAoJCSAgICAgcHJpdi0+Y2hhbm5lbFtXUklURV0tPnByb2YudHhfdGltZSk7CgoJY3RjX3ByX2RlYnVnKCJTdGF0aXN0aWNzIGZvciAlczpcbiVzIiwKCQkgICAgIHByaXYtPmNoYW5uZWxbV1JJVEVdLT5uZXRkZXYtPm5hbWUsIHNidWYpOwoJa2ZyZWUoc2J1Zik7CglyZXR1cm47Cn0KCnN0YXRpYyBzc2l6ZV90CnN0YXRzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQp7CglzdHJ1Y3QgY3RjX3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwoJaWYgKCFwcml2KQoJCXJldHVybiAtRU5PREVWOwoJY3RjX3ByaW50X3N0YXRpc3RpY3MocHJpdik7CglyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKfQoKc3RhdGljIHNzaXplX3QKc3RhdHNfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCnsKCXN0cnVjdCBjdGNfcHJpdiAqcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CglpZiAoIXByaXYpCgkJcmV0dXJuIC1FTk9ERVY7CgkvKiBSZXNldCBzdGF0aXN0aWNzICovCgltZW1zZXQoJnByaXYtPmNoYW5uZWxbV1JJVEVdLT5wcm9mLCAwLAoJCQlzaXplb2YocHJpdi0+Y2hhbm5lbFtXUklURV0tPnByb2YpKTsKCXJldHVybiBjb3VudDsKfQoKc3RhdGljIHZvaWQKY3RjX25ldGRldl91bnJlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQp7CglzdHJ1Y3QgY3RjX3ByaXYgKnByaXZwdHI7CgoJaWYgKCFkZXYpCgkJcmV0dXJuOwoJcHJpdnB0ciA9IChzdHJ1Y3QgY3RjX3ByaXYgKikgZGV2LT5wcml2OwoJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKfQoKc3RhdGljIGludApjdGNfbmV0ZGV2X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQp7CglyZXR1cm4gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Cn0KCnN0YXRpYyB2b2lkCmN0Y19mcmVlX25ldGRldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IGZyZWVfZGV2KQp7CglzdHJ1Y3QgY3RjX3ByaXYgKnByaXZwdHI7CglpZiAoIWRldikKCQlyZXR1cm47Cglwcml2cHRyID0gZGV2LT5wcml2OwoJaWYgKHByaXZwdHIpIHsKCQlpZiAocHJpdnB0ci0+ZnNtKQoJCQlrZnJlZV9mc20ocHJpdnB0ci0+ZnNtKTsKCQlrZnJlZShwcml2cHRyKTsKCX0KI2lmZGVmIE1PRFVMRQoJaWYgKGZyZWVfZGV2KQoJCWZyZWVfbmV0ZGV2KGRldik7CiNlbmRpZgp9CgpzdGF0aWMgc3NpemVfdApjdGNfcHJvdG9fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCnsKCXN0cnVjdCBjdGNfcHJpdiAqcHJpdjsKCglwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKCWlmICghcHJpdikKCQlyZXR1cm4gLUVOT0RFVjsKCglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcHJpdi0+cHJvdG9jb2wpOwp9CgpzdGF0aWMgc3NpemVfdApjdGNfcHJvdG9fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCnsKCXN0cnVjdCBjdGNfcHJpdiAqcHJpdjsKCWludCB2YWx1ZTsKCglEQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKCXByX2RlYnVnKCIlcygpIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKCglwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKCWlmICghcHJpdikKCQlyZXR1cm4gLUVOT0RFVjsKCXNzY2FuZihidWYsICIldSIsICZ2YWx1ZSk7CglpZiAoISgodmFsdWUgPT0gQ1RDX1BST1RPX1MzOTApICB8fAoJICAgICAgKHZhbHVlID09IENUQ19QUk9UT19MSU5VWCkgfHwKCSAgICAgICh2YWx1ZSA9PSBDVENfUFJPVE9fT1MzOTApKSkKCQlyZXR1cm4gLUVJTlZBTDsKCXByaXYtPnByb3RvY29sID0gdmFsdWU7CgoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgc3NpemVfdApjdGNfdHlwZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKewoJc3RydWN0IGNjd2dyb3VwX2RldmljZSAqY2dkZXY7CgoJY2dkZXYgPSB0b19jY3dncm91cGRldihkZXYpOwoJaWYgKCFjZ2RldikKCQlyZXR1cm4gLUVOT0RFVjsKCglyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY3UzMDg4X3R5cGVbY2dkZXYtPmNkZXZbMF0tPmlkLmRyaXZlcl9pbmZvXSk7Cn0KCnN0YXRpYyBERVZJQ0VfQVRUUihidWZmZXIsIDA2NDQsIGJ1ZmZlcl9zaG93LCBidWZmZXJfd3JpdGUpOwpzdGF0aWMgREVWSUNFX0FUVFIocHJvdG9jb2wsIDA2NDQsIGN0Y19wcm90b19zaG93LCBjdGNfcHJvdG9fc3RvcmUpOwpzdGF0aWMgREVWSUNFX0FUVFIodHlwZSwgMDQ0NCwgY3RjX3R5cGVfc2hvdywgTlVMTCk7CgpzdGF0aWMgREVWSUNFX0FUVFIobG9nbGV2ZWwsIDA2NDQsIGxvZ2xldmVsX3Nob3csIGxvZ2xldmVsX3dyaXRlKTsKc3RhdGljIERFVklDRV9BVFRSKHN0YXRzLCAwNjQ0LCBzdGF0c19zaG93LCBzdGF0c193cml0ZSk7CgpzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY3RjX2F0dHJbXSA9IHsKCSZkZXZfYXR0cl9wcm90b2NvbC5hdHRyLAoJJmRldl9hdHRyX3R5cGUuYXR0ciwKCSZkZXZfYXR0cl9idWZmZXIuYXR0ciwKCU5VTEwsCn07CgpzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjdGNfYXR0cl9ncm91cCA9IHsKCS5hdHRycyA9IGN0Y19hdHRyLAp9OwoKc3RhdGljIGludApjdGNfYWRkX2F0dHJpYnV0ZXMoc3RydWN0IGRldmljZSAqZGV2KQp7CglpbnQgcmM7CgoJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbG9nbGV2ZWwpOwoJaWYgKHJjKQoJCWdvdG8gb3V0OwoJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3RhdHMpOwoJaWYgKCFyYykKCQlnb3RvIG91dDsKCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9sb2dsZXZlbCk7Cm91dDoKCXJldHVybiByYzsKfQoKc3RhdGljIHZvaWQKY3RjX3JlbW92ZV9hdHRyaWJ1dGVzKHN0cnVjdCBkZXZpY2UgKmRldikKewoJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3N0YXRzKTsKCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9sb2dsZXZlbCk7Cn0KCnN0YXRpYyBpbnQKY3RjX2FkZF9maWxlcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCnsKCXByX2RlYnVnKCIlcygpIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKCglyZXR1cm4gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosICZjdGNfYXR0cl9ncm91cCk7Cn0KCnN0YXRpYyB2b2lkCmN0Y19yZW1vdmVfZmlsZXMoc3RydWN0IGRldmljZSAqZGV2KQp7Cglwcl9kZWJ1ZygiJXMoKSBjYWxsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CgoJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosICZjdGNfYXR0cl9ncm91cCk7Cn0KCi8qKgogKiBBZGQgY3RjIHNwZWNpZmljIGF0dHJpYnV0ZXMuCiAqIEFkZCBjdGMgcHJpdmF0ZSBkYXRhLgogKgogKiBAcGFyYW0gY2dkZXYgcG9pbnRlciB0byBjY3dncm91cF9kZXZpY2UganVzdCBhZGRlZAogKgogKiBAcmV0dXJucyAwIG9uIHN1Y2Nlc3MsICEwIG9uIGZhaWx1cmUuCiAqLwpzdGF0aWMgaW50CmN0Y19wcm9iZV9kZXZpY2Uoc3RydWN0IGNjd2dyb3VwX2RldmljZSAqY2dkZXYpCnsKCXN0cnVjdCBjdGNfcHJpdiAqcHJpdjsKCWludCByYzsKCWNoYXIgYnVmZmVyWzE2XTsKCglwcl9kZWJ1ZygiJXMoKSBjYWxsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CglEQkZfVEVYVChzZXR1cCwgMywgX19GVU5DVElPTl9fKTsKCglpZiAoIWdldF9kZXZpY2UoJmNnZGV2LT5kZXYpKQoJCXJldHVybiAtRU5PREVWOwoKCXByaXYgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGN0Y19wcml2KSwgR0ZQX0tFUk5FTCk7CglpZiAoIXByaXYpIHsKCQljdGNfcHJfZXJyKCIlczogT3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwoJCXB1dF9kZXZpY2UoJmNnZGV2LT5kZXYpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCW1lbXNldChwcml2LCAwLCBzaXplb2YgKHN0cnVjdCBjdGNfcHJpdikpOwoJcmMgPSBjdGNfYWRkX2ZpbGVzKCZjZ2Rldi0+ZGV2KTsKCWlmIChyYykgewoJCWtmcmVlKHByaXYpOwoJCXB1dF9kZXZpY2UoJmNnZGV2LT5kZXYpOwoJCXJldHVybiByYzsKCX0KCXByaXYtPmJ1ZmZlcl9zaXplID0gQ1RDX0JVRlNJWkVfREVGQVVMVDsKCWNnZGV2LT5jZGV2WzBdLT5oYW5kbGVyID0gY3RjX2lycV9oYW5kbGVyOwoJY2dkZXYtPmNkZXZbMV0tPmhhbmRsZXIgPSBjdGNfaXJxX2hhbmRsZXI7CgljZ2Rldi0+ZGV2LmRyaXZlcl9kYXRhID0gcHJpdjsKCglzcHJpbnRmKGJ1ZmZlciwgIiVwIiwgcHJpdik7CglEQkZfVEVYVChkYXRhLCAzLCBidWZmZXIpOwoKCXNwcmludGYoYnVmZmVyLCAiJXUiLCAodW5zaWduZWQgaW50KXNpemVvZihzdHJ1Y3QgY3RjX3ByaXYpKTsKCURCRl9URVhUKGRhdGEsIDMsIGJ1ZmZlcik7CgoJc3ByaW50ZihidWZmZXIsICIlcCIsICZjaGFubmVscyk7CglEQkZfVEVYVChkYXRhLCAzLCBidWZmZXIpOwoKCXNwcmludGYoYnVmZmVyLCAiJXUiLCAodW5zaWduZWQgaW50KXNpemVvZihzdHJ1Y3QgY2hhbm5lbCkpOwoJREJGX1RFWFQoZGF0YSwgMywgYnVmZmVyKTsKCglyZXR1cm4gMDsKfQoKLyoqCiAqIEluaXRpYWxpemUgZXZlcnl0aGluZyBvZiB0aGUgbmV0IGRldmljZSBleGNlcHQgdGhlIG5hbWUgYW5kIHRoZQogKiBjaGFubmVsIHN0cnVjdHMuCiAqLwpzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKgpjdGNfaW5pdF9uZXRkZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBhbGxvY19kZXZpY2UsCgkJICAgc3RydWN0IGN0Y19wcml2ICpwcml2cHRyKQp7CglpZiAoIXByaXZwdHIpCgkJcmV0dXJuIE5VTEw7CgoJREJGX1RFWFQoc2V0dXAsIDMsIF9fRlVOQ1RJT05fXyk7CgoJaWYgKGFsbG9jX2RldmljZSkgewoJCWRldiA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgbmV0X2RldmljZSksIEdGUF9LRVJORUwpOwoJCWlmICghZGV2KQoJCQlyZXR1cm4gTlVMTDsKCQltZW1zZXQoZGV2LCAwLCBzaXplb2YgKHN0cnVjdCBuZXRfZGV2aWNlKSk7Cgl9CgoJZGV2LT5wcml2ID0gcHJpdnB0cjsKCXByaXZwdHItPmZzbSA9IGluaXRfZnNtKCJjdGNkZXYiLCBkZXZfc3RhdGVfbmFtZXMsCgkJCQlkZXZfZXZlbnRfbmFtZXMsIENUQ19OUl9ERVZfU1RBVEVTLCBDVENfTlJfREVWX0VWRU5UUywKCQkJCWRldl9mc20sIERFVl9GU01fTEVOLCBHRlBfS0VSTkVMKTsKCWlmIChwcml2cHRyLT5mc20gPT0gTlVMTCkgewoJCWlmIChhbGxvY19kZXZpY2UpCgkJCWtmcmVlKGRldik7CgkJcmV0dXJuIE5VTEw7Cgl9Cglmc21fbmV3c3RhdGUocHJpdnB0ci0+ZnNtLCBERVZfU1RBVEVfU1RPUFBFRCk7Cglmc21fc2V0dGltZXIocHJpdnB0ci0+ZnNtLCAmcHJpdnB0ci0+cmVzdGFydF90aW1lcik7CglpZiAoZGV2LT5tdHUgPT0gMCkKCQlkZXYtPm10dSA9IENUQ19CVUZTSVpFX0RFRkFVTFQgLSBMTF9IRUFERVJfTEVOR1RIIC0gMjsKCWRldi0+aGFyZF9zdGFydF94bWl0ID0gY3RjX3R4OwoJZGV2LT5vcGVuID0gY3RjX29wZW47CglkZXYtPnN0b3AgPSBjdGNfY2xvc2U7CglkZXYtPmdldF9zdGF0cyA9IGN0Y19zdGF0czsKCWRldi0+Y2hhbmdlX210dSA9IGN0Y19jaGFuZ2VfbXR1OwoJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBMTF9IRUFERVJfTEVOR1RIICsgMjsKCWRldi0+YWRkcl9sZW4gPSAwOwoJZGV2LT50eXBlID0gQVJQSFJEX1NMSVA7CglkZXYtPnR4X3F1ZXVlX2xlbiA9IDEwMDsKCWRldi0+ZmxhZ3MgPSBJRkZfUE9JTlRPUE9JTlQgfCBJRkZfTk9BUlA7CglTRVRfTU9EVUxFX09XTkVSKGRldik7CglyZXR1cm4gZGV2Owp9CgoKLyoqCiAqCiAqIFNldHVwIGFuIGludGVyZmFjZS4KICoKICogQHBhcmFtIGNnZGV2ICBEZXZpY2UgdG8gYmUgc2V0dXAuCiAqCiAqIEByZXR1cm5zIDAgb24gc3VjY2VzcywgITAgb24gZmFpbHVyZS4KICovCnN0YXRpYyBpbnQKY3RjX25ld19kZXZpY2Uoc3RydWN0IGNjd2dyb3VwX2RldmljZSAqY2dkZXYpCnsKCWNoYXIgcmVhZF9pZFtDVENfSURfU0laRV07CgljaGFyIHdyaXRlX2lkW0NUQ19JRF9TSVpFXTsKCWludCBkaXJlY3Rpb247CgllbnVtIGNoYW5uZWxfdHlwZXMgdHlwZTsKCXN0cnVjdCBjdGNfcHJpdiAqcHJpdnB0cjsKCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CglpbnQgcmV0OwoJY2hhciBidWZmZXJbMTZdOwoKCXByX2RlYnVnKCIlcygpIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKCURCRl9URVhUKHNldHVwLCAzLCBfX0ZVTkNUSU9OX18pOwoKCXByaXZwdHIgPSBjZ2Rldi0+ZGV2LmRyaXZlcl9kYXRhOwoJaWYgKCFwcml2cHRyKQoJCXJldHVybiAtRU5PREVWOwoKCXNwcmludGYoYnVmZmVyLCAiJWQiLCBwcml2cHRyLT5idWZmZXJfc2l6ZSk7CglEQkZfVEVYVChzZXR1cCwgMywgYnVmZmVyKTsKCgl0eXBlID0gZ2V0X2NoYW5uZWxfdHlwZSgmY2dkZXYtPmNkZXZbMF0tPmlkKTsKCglzbnByaW50ZihyZWFkX2lkLCBDVENfSURfU0laRSwgImNoLSVzIiwgY2dkZXYtPmNkZXZbMF0tPmRldi5idXNfaWQpOwoJc25wcmludGYod3JpdGVfaWQsIENUQ19JRF9TSVpFLCAiY2gtJXMiLCBjZ2Rldi0+Y2RldlsxXS0+ZGV2LmJ1c19pZCk7CgoJaWYgKGFkZF9jaGFubmVsKGNnZGV2LT5jZGV2WzBdLCB0eXBlKSkKCQlyZXR1cm4gLUVOT01FTTsKCWlmIChhZGRfY2hhbm5lbChjZ2Rldi0+Y2RldlsxXSwgdHlwZSkpCgkJcmV0dXJuIC1FTk9NRU07CgoJcmV0ID0gY2N3X2RldmljZV9zZXRfb25saW5lKGNnZGV2LT5jZGV2WzBdKTsKCWlmIChyZXQgIT0gMCkgewoJCQlwcmludGsoS0VSTl9XQVJOSU5HCgkJIAkiY2N3X2RldmljZV9zZXRfb25saW5lIChjZGV2WzBdKSBmYWlsZWQgd2l0aCByZXQgPSAlZFxuIiwgcmV0KTsKCX0KCglyZXQgPSBjY3dfZGV2aWNlX3NldF9vbmxpbmUoY2dkZXYtPmNkZXZbMV0pOwoJaWYgKHJldCAhPSAwKSB7CgkJCXByaW50ayhLRVJOX1dBUk5JTkcKCQkgCSJjY3dfZGV2aWNlX3NldF9vbmxpbmUgKGNkZXZbMV0pIGZhaWxlZCB3aXRoIHJldCA9ICVkXG4iLCByZXQpOwoJfQoKCWRldiA9IGN0Y19pbml0X25ldGRldmljZShOVUxMLCAxLCBwcml2cHRyKTsKCglpZiAoIWRldikgewoJCWN0Y19wcl93YXJuKCJjdGNfaW5pdF9uZXRkZXZpY2UgZmFpbGVkXG4iKTsKCQlnb3RvIG91dDsKCX0KCglzdHJsY3B5KGRldi0+bmFtZSwgImN0YyVkIiwgSUZOQU1TSVopOwoKCWZvciAoZGlyZWN0aW9uID0gUkVBRDsgZGlyZWN0aW9uIDw9IFdSSVRFOyBkaXJlY3Rpb24rKykgewoJCXByaXZwdHItPmNoYW5uZWxbZGlyZWN0aW9uXSA9CgkJICAgIGNoYW5uZWxfZ2V0KHR5cGUsIGRpcmVjdGlvbiA9PSBSRUFEID8gcmVhZF9pZCA6IHdyaXRlX2lkLAoJCQkJZGlyZWN0aW9uKTsKCQlpZiAocHJpdnB0ci0+Y2hhbm5lbFtkaXJlY3Rpb25dID09IE5VTEwpIHsKCQkJaWYgKGRpcmVjdGlvbiA9PSBXUklURSkKCQkJCWNoYW5uZWxfZnJlZShwcml2cHRyLT5jaGFubmVsW1JFQURdKTsKCgkJCWN0Y19mcmVlX25ldGRldmljZShkZXYsIDEpOwoJCQlnb3RvIG91dDsKCQl9CgkJcHJpdnB0ci0+Y2hhbm5lbFtkaXJlY3Rpb25dLT5uZXRkZXYgPSBkZXY7CgkJcHJpdnB0ci0+Y2hhbm5lbFtkaXJlY3Rpb25dLT5wcm90b2NvbCA9IHByaXZwdHItPnByb3RvY29sOwoJCXByaXZwdHItPmNoYW5uZWxbZGlyZWN0aW9uXS0+bWF4X2J1ZnNpemUgPSBwcml2cHRyLT5idWZmZXJfc2l6ZTsKCX0KCS8qIHN5c2ZzIG1hZ2ljICovCglTRVRfTkVUREVWX0RFVihkZXYsICZjZ2Rldi0+ZGV2KTsKCglpZiAoY3RjX25ldGRldl9yZWdpc3RlcihkZXYpICE9IDApIHsKCQljdGNfZnJlZV9uZXRkZXZpY2UoZGV2LCAxKTsKCQlnb3RvIG91dDsKCX0KCglpZiAoY3RjX2FkZF9hdHRyaWJ1dGVzKCZjZ2Rldi0+ZGV2KSkgewoJCWN0Y19uZXRkZXZfdW5yZWdpc3RlcihkZXYpOwoJCWRldi0+cHJpdiA9IE5VTEw7CgkJY3RjX2ZyZWVfbmV0ZGV2aWNlKGRldiwgMSk7CgkJZ290byBvdXQ7Cgl9CgoJc3RybGNweShwcml2cHRyLT5mc20tPm5hbWUsIGRldi0+bmFtZSwgc2l6ZW9mIChwcml2cHRyLT5mc20tPm5hbWUpKTsKCglwcmludF9iYW5uZXIoKTsKCgljdGNfcHJfaW5mbygiJXM6IHJlYWQ6ICVzLCB3cml0ZTogJXMsIHByb3RvOiAlZFxuIiwKCQkgICAgZGV2LT5uYW1lLCBwcml2cHRyLT5jaGFubmVsW1JFQURdLT5pZCwKCQkgICAgcHJpdnB0ci0+Y2hhbm5lbFtXUklURV0tPmlkLCBwcml2cHRyLT5wcm90b2NvbCk7CgoJcmV0dXJuIDA7Cm91dDoKCWNjd19kZXZpY2Vfc2V0X29mZmxpbmUoY2dkZXYtPmNkZXZbMV0pOwoJY2N3X2RldmljZV9zZXRfb2ZmbGluZShjZ2Rldi0+Y2RldlswXSk7CgoJcmV0dXJuIC1FTk9ERVY7Cn0KCi8qKgogKiBTaHV0ZG93biBhbiBpbnRlcmZhY2UuCiAqCiAqIEBwYXJhbSBjZ2RldiAgRGV2aWNlIHRvIGJlIHNodXQgZG93bi4KICoKICogQHJldHVybnMgMCBvbiBzdWNjZXNzLCAhMCBvbiBmYWlsdXJlLgogKi8Kc3RhdGljIGludApjdGNfc2h1dGRvd25fZGV2aWNlKHN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmNnZGV2KQp7CglzdHJ1Y3QgY3RjX3ByaXYgKnByaXY7CglzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKCglEQkZfVEVYVChzZXR1cCwgMywgX19GVU5DVElPTl9fKTsKCXByX2RlYnVnKCIlcygpIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKCgoJcHJpdiA9IGNnZGV2LT5kZXYuZHJpdmVyX2RhdGE7CgluZGV2ID0gTlVMTDsKCWlmICghcHJpdikKCQlyZXR1cm4gLUVOT0RFVjsKCglpZiAocHJpdi0+Y2hhbm5lbFtSRUFEXSkgewoJCW5kZXYgPSBwcml2LT5jaGFubmVsW1JFQURdLT5uZXRkZXY7CgoJCS8qIENsb3NlIHRoZSBkZXZpY2UgKi8KCQljdGNfY2xvc2UobmRldik7CgkJbmRldi0+ZmxhZ3MgJj1+SUZGX1JVTk5JTkc7CgoJCWN0Y19yZW1vdmVfYXR0cmlidXRlcygmY2dkZXYtPmRldik7CgoJCWNoYW5uZWxfZnJlZShwcml2LT5jaGFubmVsW1JFQURdKTsKCX0KCWlmIChwcml2LT5jaGFubmVsW1dSSVRFXSkKCQljaGFubmVsX2ZyZWUocHJpdi0+Y2hhbm5lbFtXUklURV0pOwoKCWlmIChuZGV2KSB7CgkJY3RjX25ldGRldl91bnJlZ2lzdGVyKG5kZXYpOwoJCW5kZXYtPnByaXYgPSBOVUxMOwoJCWN0Y19mcmVlX25ldGRldmljZShuZGV2LCAxKTsKCX0KCglpZiAocHJpdi0+ZnNtKQoJCWtmcmVlX2ZzbShwcml2LT5mc20pOwoKCWNjd19kZXZpY2Vfc2V0X29mZmxpbmUoY2dkZXYtPmNkZXZbMV0pOwoJY2N3X2RldmljZV9zZXRfb2ZmbGluZShjZ2Rldi0+Y2RldlswXSk7CgoJaWYgKHByaXYtPmNoYW5uZWxbUkVBRF0pCgkJY2hhbm5lbF9yZW1vdmUocHJpdi0+Y2hhbm5lbFtSRUFEXSk7CglpZiAocHJpdi0+Y2hhbm5lbFtXUklURV0pCgkJY2hhbm5lbF9yZW1vdmUocHJpdi0+Y2hhbm5lbFtXUklURV0pOwoJcHJpdi0+Y2hhbm5lbFtSRUFEXSA9IHByaXYtPmNoYW5uZWxbV1JJVEVdID0gTlVMTDsKCglyZXR1cm4gMDsKCn0KCnN0YXRpYyB2b2lkCmN0Y19yZW1vdmVfZGV2aWNlKHN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmNnZGV2KQp7CglzdHJ1Y3QgY3RjX3ByaXYgKnByaXY7CgoJcHJfZGVidWcoIiVzKCkgY2FsbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwoJREJGX1RFWFQoc2V0dXAsIDMsIF9fRlVOQ1RJT05fXyk7CgoJcHJpdiA9IGNnZGV2LT5kZXYuZHJpdmVyX2RhdGE7CglpZiAoIXByaXYpCgkJcmV0dXJuOwoJaWYgKGNnZGV2LT5zdGF0ZSA9PSBDQ1dHUk9VUF9PTkxJTkUpCgkJY3RjX3NodXRkb3duX2RldmljZShjZ2Rldik7CgljdGNfcmVtb3ZlX2ZpbGVzKCZjZ2Rldi0+ZGV2KTsKCWNnZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSBOVUxMOwoJa2ZyZWUocHJpdik7CglwdXRfZGV2aWNlKCZjZ2Rldi0+ZGV2KTsKfQoKc3RhdGljIHN0cnVjdCBjY3dncm91cF9kcml2ZXIgY3RjX2dyb3VwX2RyaXZlciA9IHsKCS5vd25lciAgICAgICA9IFRISVNfTU9EVUxFLAoJLm5hbWUgICAgICAgID0gImN0YyIsCgkubWF4X3NsYXZlcyAgPSAyLAoJLmRyaXZlcl9pZCAgID0gMHhDM0UzQzMsCgkucHJvYmUgICAgICAgPSBjdGNfcHJvYmVfZGV2aWNlLAoJLnJlbW92ZSAgICAgID0gY3RjX3JlbW92ZV9kZXZpY2UsCgkuc2V0X29ubGluZSAgPSBjdGNfbmV3X2RldmljZSwKCS5zZXRfb2ZmbGluZSA9IGN0Y19zaHV0ZG93bl9kZXZpY2UsCn07CgovKioKICogTW9kdWxlIHJlbGF0ZWQgcm91dGluZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqCiAqIFByZXBhcmUgdG8gYmUgdW5sb2FkZWQuIEZyZWUgSVJRJ3MgYW5kIHJlbGVhc2UgYWxsIHJlc291cmNlcy4KICogVGhpcyBpcyBjYWxsZWQganVzdCBiZWZvcmUgdGhpcyBtb2R1bGUgaXMgdW5sb2FkZWQuIEl0IGlzCiAqIDxlbT5ub3Q8L2VtPiBjYWxsZWQsIGlmIHRoZSB1c2FnZSBjb3VudCBpcyAhMCwgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjawogKiBmb3IgdGhhdC4KICovCnN0YXRpYyB2b2lkIF9fZXhpdApjdGNfZXhpdCh2b2lkKQp7CglEQkZfVEVYVChzZXR1cCwgMywgX19GVU5DVElPTl9fKTsKCXVucmVnaXN0ZXJfY3UzMDg4X2Rpc2NpcGxpbmUoJmN0Y19ncm91cF9kcml2ZXIpOwoJY3RjX3VucmVnaXN0ZXJfZGJmX3ZpZXdzKCk7CgljdGNfcHJfaW5mbygiQ1RDIGRyaXZlciB1bmxvYWRlZFxuIik7Cn0KCi8qKgogKiBJbml0aWFsaXplIG1vZHVsZS4KICogVGhpcyBpcyBjYWxsZWQganVzdCBhZnRlciB0aGUgbW9kdWxlIGlzIGxvYWRlZC4KICoKICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsICEwIG9uIGVycm9yLgogKi8Kc3RhdGljIGludCBfX2luaXQKY3RjX2luaXQodm9pZCkKewoJaW50IHJldCA9IDA7CgoJbG9nbGV2ZWwgPSBDVENfTE9HTEVWRUxfREVGQVVMVDsKCglEQkZfVEVYVChzZXR1cCwgMywgX19GVU5DVElPTl9fKTsKCglwcmludF9iYW5uZXIoKTsKCglyZXQgPSBjdGNfcmVnaXN0ZXJfZGJmX3ZpZXdzKCk7CglpZiAocmV0KXsKCQljdGNfcHJfY3JpdCgiY3RjX2luaXQgZmFpbGVkIHdpdGggY3RjX3JlZ2lzdGVyX2RiZl92aWV3cyByYyA9ICVkXG4iLCByZXQpOwoJCXJldHVybiByZXQ7Cgl9CglyZXQgPSByZWdpc3Rlcl9jdTMwODhfZGlzY2lwbGluZSgmY3RjX2dyb3VwX2RyaXZlcik7CglpZiAocmV0KSB7CgkJY3RjX3VucmVnaXN0ZXJfZGJmX3ZpZXdzKCk7Cgl9CglyZXR1cm4gcmV0Owp9Cgptb2R1bGVfaW5pdChjdGNfaW5pdCk7Cm1vZHVsZV9leGl0KGN0Y19leGl0KTsKCi8qIC0tLSBUaGlzIGlzIHRoZSBFTkQgbXkgZnJpZW5kIC0tLSAqLwo=