LyoKICogREVDIDkzIEVyaWsgQm9zIDxlcmlrQHhzNGFsbC5ubD4KICoKICogQ29weXJpZ2h0IDE5OTYgTWFyY3VzIE1laXNzbmVyCiAqCiAqIENvcHlyaWdodCAyMDAxIE1pa2UgTWNDb3JtYWNrCiAqCiAqIE1hciAzMSwgMTk5OS4gT3ZlIEvldmVuIDxvdmVrQGFyY3RpY25ldC5ubz4KICogLSBJbXBsZW1lbnRlZCBidWZmZXJzIGFuZCBFbmFibGVDb21tTm90aWZpY2F0aW9uLgogKgogKiBBcHIgMywgMTk5OS4gIExhd3NvbiBXaGl0bmV5IDxsYXdzb25fd2hpdG5leUBqdW5vLmNvbT4KICogLSBGaXhlZCB0aGUgbW9kZW0gY29udHJvbCBwYXJ0IG9mIEVzY2FwZUNvbW1GdW5jdGlvbjE2LgogKgogKiBNYXIgMywgMTk5OS4gT3ZlIEvldmVuIDxvdmVrQGFyY3RpY25ldC5ubz4KICogLSBVc2UgcG9ydCBpbmRpY2VzIGluc3RlYWQgb2YgdW5peGZkcyBmb3Igd2luMTYKICogLSBNb3ZlZCB0aGluZ3MgYXJvdW5kIChzZXBhcmF0ZWQgd2luMTYgYW5kIHdpbjMyIHJvdXRpbmVzKQogKiAtIEFkZGVkIHNvbWUgaGludHMgb24gaG93IHRvIGltcGxlbWVudCBidWZmZXJzIGFuZCBFbmFibGVDb21tTm90aWZpY2F0aW9uLgogKgogKiBNYXkgMjYsIDE5OTcuICBGaXhlcyBhbmQgY29tbWVudHMgYnkgUmljayBSaWNoYXJkc29uIDxyaWNrQGRnaWkuY29tPiBbUkVSXQogKiAtIHB0ci0+ZmQgd2Fzbid0IGdldHRpbmcgY2xlYXJlZCBvbiBjbG9zZS4KICogLSBHZXRDb21tRXZlbnRNYXNrKCkgYW5kIEdldENvbW1FcnJvcigpIGRpZG4ndCBkbyBtdWNoIG9mIGFueXRoaW5nLgogKiAgIElNSE8sIHRoZXkgYXJlIHN0aWxsIHdyb25nLCBidXQgdGhleSBhdCBsZWFzdCBpbXBsZW1lbnQgdGhlIFJYQ0hBUgogKiAgIGV2ZW50IGFuZCByZXR1cm4gSS9PIHF1ZXVlIHNpemVzLCB3aGljaCBtYWtlcyB0aGUgYXBwIEknbSBpbnRlcmVzdGVkCiAqICAgaW4gKGFuYWxvZyBkZXZpY2VzIEVaS0lUIERTUCBkZXZlbG9wbWVudCBzeXN0ZW0pIHdvcmsuCiAqCiAqIEF1Z3VzdCAxMiwgMTk5Ny4gIFRha2UgYSBiYXNoIGF0IFNldENvbW1FdmVudE1hc2sgLSBMYXdzb24gV2hpdG5leQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF3c29uX3doaXRuZXlAanVuby5jb20+CiAqIEp1bHkgNiwgMTk5OC4gRml4ZXMgYW5kIGNvbW1lbnRzIGJ5IFZhbGVudGlqbiBTZXNzaW5rCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2c2Vzc2lua0BpYy51dmEubmw+IFtWXQogKiBPa3RvYmVyIDk4LCBSZWluIEtsYXplcyBbUkhLXQogKiBBIHByb2dyYW0gdGhhdCB3YW50cyB0byBtb25pdG9yIHRoZSBtb2RlbSBzdGF0dXMgbGluZSAoUkxTRC9EQ0QpIG1heQogKiBwb2xsIHRoZSBtb2RlbSBzdGF0dXMgcmVnaXN0ZXIgaW4gdGhlIGNvbW1NYXNrIHN0cnVjdHVyZS4gSSB1cGRhdGUgdGhlIGJpdAogKiBpbiBHZXRDb21tRXJyb3IsIHdhaXRpbmcgZm9yIGFuIGltcGxlbWVudGF0aW9uIG9mIGNvbW11bmljYXRpb24gZXZlbnRzLgogKiAKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5lL3dpbnVzZXIxNi5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCiNpbmNsdWRlICJoZWFwLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgoKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChjb21tKTsKCi8qIHdpbmRvdydzIHNlbWkgZG9jdW1lbnRlZCBtb2RlbSBzdGF0dXMgcmVnaXN0ZXIgKi8KI2RlZmluZSBDT01NX01TUl9PRkZTRVQgIDM1CiNkZWZpbmUgTVNSX0NUUyAgMHgxMAojZGVmaW5lIE1TUl9EU1IgIDB4MjAKI2RlZmluZSBNU1JfUkkgICAweDQwCiNkZWZpbmUgTVNSX1JMU0QgMHg4MAojZGVmaW5lIE1TUl9NQVNLIChNU1JfQ1RTfE1TUl9EU1J8TVNSX1JJfE1TUl9STFNEKQoKI2RlZmluZSBGTEFHX0xQVCAweDgwCgojZGVmaW5lIE1BWF9QT1JUUyAgIDkKCnN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgewogICAgY2hhciAqZGV2aWNlbmFtZTsgICAvKiAvZGV2L3R0eVMwICovCiAgICBIQU5ETEUgaGFuZGxlOwogICAgaW50IHN1c3BlbmRlZDsKICAgIGludCB1bmdldCx4bWl0OwogICAgaW50IGJhdWRyYXRlOwogICAgaW50IGV2dGNoYXI7CiAgICAvKiBldmVudHMgKi8KICAgIGludCBjb21tZXJyb3IsIGV2ZW50bWFzazsKICAgIC8qIGJ1ZmZlcnMgKi8KICAgIGNoYXIgKmluYnVmLCpvdXRidWY7CiAgICB1bnNpZ25lZCBpYnVmX3NpemUsaWJ1Zl9oZWFkLGlidWZfdGFpbDsKICAgIHVuc2lnbmVkIG9idWZfc2l6ZSxvYnVmX2hlYWQsb2J1Zl90YWlsOwogICAgLyogbm90aWZpY2F0aW9ucyAqLwogICAgaW50IHduZCwgbl9yZWFkLCBuX3dyaXRlOwogICAgT1ZFUkxBUFBFRCByZWFkX292LCB3cml0ZV9vdjsKICAgIC8qIHNhdmUgdGVybWluYWwgc3RhdGVzICovCiAgICBEQ0IxNiBkY2I7CiAgICAvKiBwb2ludGVyIHRvIHVua25vd24oPT11bmRvY3VtZW50ZWQpIGNvbW0gc3RydWN0dXJlICovIAogICAgTFBDVk9JRCAqdW5rbm93bjsKfTsKCnN0YXRpYyBzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0IENPTVtNQVhfUE9SVFNdOwpzdGF0aWMgc3RydWN0IERvc0RldmljZVN0cnVjdCBMUFRbTUFYX1BPUlRTXTsKCi8qIHVwZGF0ZSB3aW5kb3cncyBzZW1pIGRvY3VtZW50ZWQgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyICovCi8qIHNlZSBrbm93bGVkZ2UgYmFzZSBRMTAxNDE3ICovCnN0YXRpYyB2b2lkIENPTU1fTVNSVXBkYXRlKCBIQU5ETEUgaGFuZGxlLCBVQ0hBUiAqIHBNc3IgKQp7CiAgICBVQ0hBUiB0bXBtc3I9MDsKICAgIERXT1JEIG1zdGF0PTA7CgogICAgaWYoIUdldENvbW1Nb2RlbVN0YXR1cyhoYW5kbGUsJm1zdGF0KSkKICAgICAgICByZXR1cm47CgogICAgaWYobXN0YXQgJiBNU19DVFNfT04pIHRtcG1zciB8PSBNU1JfQ1RTOwogICAgaWYobXN0YXQgJiBNU19EU1JfT04pIHRtcG1zciB8PSBNU1JfRFNSOwogICAgaWYobXN0YXQgJiBNU19SSU5HX09OKSB0bXBtc3IgfD0gTVNSX1JJOwogICAgaWYobXN0YXQgJiBNU19STFNEX09OKSB0bXBtc3IgfD0gTVNSX1JMU0Q7CiAgICAqcE1zciA9ICgqcE1zciAmIH5NU1JfTUFTSykgfCB0bXBtc3I7Cn0KCnZvaWQgQ09NTV9Jbml0KHZvaWQpCnsKCWludCB4OwoJY2hhciBvcHRpb25bMTBdLCB0ZW1wWzI1Nl0sICpidGVtcDsKCUhLRVkgaGtleTsKCglmb3IgKHg9MDsgeCE9TUFYX1BPUlRTOyB4KyspIHsKCQlzdHJjcHkob3B0aW9uLCJDT014Iik7CgkJb3B0aW9uWzNdID0gJzEnICsgeDsKCQlvcHRpb25bNF0gPSAnXDAnOwoKCQkvKiBkZWZhdWx0IHZhbHVlICovCgkJc3RyY3B5KHRlbXAsICIqIik7CgoJCWlmKCFSZWdPcGVuS2V5QShIS0VZX0xPQ0FMX01BQ0hJTkUsICJTb2Z0d2FyZVxcV2luZVxcV2luZVxcQ29uZmlnXFxzZXJpYWxwb3J0cyIsICZoa2V5KSkKCQl7CgkJICAgIERXT1JEIHR5cGUsIGNvdW50ID0gc2l6ZW9mKHRlbXApOwoKCQkgICAgUmVnUXVlcnlWYWx1ZUV4QShoa2V5LCBvcHRpb24sIDAsICZ0eXBlLCB0ZW1wLCAmY291bnQpOwoJCSAgICBSZWdDbG9zZUtleShoa2V5KTsKCQl9CgoJCWlmICghc3RyY21wKHRlbXAsICIqIikgfHwgKnRlbXAgPT0gJ1wwJykgCgkJCUNPTVt4XS5kZXZpY2VuYW1lID0gTlVMTDsKCQllbHNlIHsKCQkgIAlidGVtcCA9IHN0cmNocih0ZW1wLCcsJyk7CgkJCWlmIChidGVtcCAhPSBOVUxMKSB7CgkJCSAgCSpidGVtcCsrID0gJ1wwJzsKCQkJCUNPTVt4XS5iYXVkcmF0ZSA9IGF0b2koYnRlbXApOwoJCQl9IGVsc2UgewoJCQkJQ09NW3hdLmJhdWRyYXRlID0gLTE7CgkJCX0KCQkJaWYgKChDT01beF0uZGV2aWNlbmFtZSA9IG1hbGxvYyhzdHJsZW4odGVtcCkrMSkpID09IE5VTEwpIAoJCQkJV0FSTigiQ2FuJ3QgbWFsbG9jIGZvciBkZXZpY2UgaW5mbyFcbiIpOwoJCQllbHNlIHsKCQkJCUNPTVt4XS5oYW5kbGUgPSAwOwoJCQkJc3RyY3B5KENPTVt4XS5kZXZpY2VuYW1lLCB0ZW1wKTsKCQkJfQoJCQlUUkFDRSgiJXMgPSAlc1xuIiwgb3B0aW9uLCBDT01beF0uZGV2aWNlbmFtZSk7CiAJCX0KCgkJc3RyY3B5KG9wdGlvbiwgIkxQVHgiKTsKCQlvcHRpb25bM10gPSAnMScgKyB4OwoJCW9wdGlvbls0XSA9ICdcMCc7CgoJCS8qIGRlZmF1bHQgdmFsdWUgKi8KCQlzdHJjcHkodGVtcCwgIioiKTsKCgkJaWYoIVJlZ09wZW5LZXlBKEhLRVlfTE9DQUxfTUFDSElORSwgIlNvZnR3YXJlXFxXaW5lXFxXaW5lXFxDb25maWdcXHBhcmFsbGVscG9ydHMiLCAmaGtleSkpCgkJewoJCSAgICBEV09SRCB0eXBlLCBjb3VudCA9IHNpemVvZih0ZW1wKTsKCgkJICAgIFJlZ1F1ZXJ5VmFsdWVFeEEoaGtleSwgb3B0aW9uLCAwLCAmdHlwZSwgdGVtcCwgJmNvdW50KTsKCQkgICAgUmVnQ2xvc2VLZXkoaGtleSk7CgkJfQoKCQlpZiAoIXN0cmNtcCh0ZW1wLCAiKiIpIHx8ICp0ZW1wID09ICdcMCcpCgkJCUxQVFt4XS5kZXZpY2VuYW1lID0gTlVMTDsKCQllbHNlIHsKCQkJaWYgKChMUFRbeF0uZGV2aWNlbmFtZSA9IG1hbGxvYyhzdHJsZW4odGVtcCkrMSkpID09IE5VTEwpIAoJCQkJV0FSTigiQ2FuJ3QgbWFsbG9jIGZvciBkZXZpY2UgaW5mbyFcbiIpOwoJCQllbHNlIHsKCQkJCUxQVFt4XS5oYW5kbGUgPSAwOwoJCQkJc3RyY3B5KExQVFt4XS5kZXZpY2VuYW1lLCB0ZW1wKTsKCQkJfQoJCQlUUkFDRSgiJXMgPSAlc1xuIiwgb3B0aW9uLCBMUFRbeF0uZGV2aWNlbmFtZSk7CgkJfQoKCX0KfQoKCnN0YXRpYyBzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpHZXREZXZpY2VTdHJ1Y3QoaW50IGluZGV4KQp7CglpZiAoKGluZGV4JjB4N0YpPD1NQVhfUE9SVFMpIHsKICAgICAgICAgICAgaWYgKCEoaW5kZXgmRkxBR19MUFQpKSB7CgkJaWYgKENPTVtpbmRleF0uaGFuZGxlKQoJCSAgICByZXR1cm4gJkNPTVtpbmRleF07CgkgICAgfSBlbHNlIHsKCQlpbmRleCAmPSAweDdmOwoJCWlmIChMUFRbaW5kZXhdLmhhbmRsZSkKCQkgICAgcmV0dXJuICZMUFRbaW5kZXhdOwoJICAgIH0KCX0KCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIGludCAgICBHZXRDb21tUG9ydF9vdihMUE9WRVJMQVBQRUQgb3YsIGludCB3cml0ZSkKewoJaW50IHg7CiAgICAgICAgCglmb3IgKHg9MDsgeDxNQVhfUE9SVFM7IHgrKykgewoJCWlmIChvdiA9PSAod3JpdGU/JkNPTVt4XS53cml0ZV9vdjomQ09NW3hdLnJlYWRfb3YpKQoJCQlyZXR1cm4geDsKCX0KICAgICAgIAoJcmV0dXJuIC0xOwp9IAoKc3RhdGljIGludCBWYWxpZENPTVBvcnQoaW50IHgpCnsKCXJldHVybih4IDwgTUFYX1BPUlRTID8gKGludCkgQ09NW3hdLmRldmljZW5hbWUgOiAwKTsgCn0KCnN0YXRpYyBpbnQgVmFsaWRMUFRQb3J0KGludCB4KQp7CglyZXR1cm4oeCA8IE1BWF9QT1JUUyA/IChpbnQpIExQVFt4XS5kZXZpY2VuYW1lIDogMCk7IAp9CgpzdGF0aWMgaW50IFdpbkVycm9yKHZvaWQpCnsKICAgICAgICBUUkFDRSgiZXJybm8gPSAlZFxuIiwgZXJybm8pOwoJc3dpdGNoIChlcnJubykgewoJCWRlZmF1bHQ6CgkJCXJldHVybiBDRV9JT0U7CgkJfQp9CgpzdGF0aWMgdW5zaWduZWQgY29tbV9pbmJ1ZihzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHIpCnsKICByZXR1cm4gKChwdHItPmlidWZfdGFpbCA+IHB0ci0+aWJ1Zl9oZWFkKSA/IHB0ci0+aWJ1Zl9zaXplIDogMCkKICAgICsgcHRyLT5pYnVmX2hlYWQgLSBwdHItPmlidWZfdGFpbDsKfQoKc3RhdGljIHVuc2lnbmVkIGNvbW1fb3V0YnVmKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cikKewogIHJldHVybiAoKHB0ci0+b2J1Zl90YWlsID4gcHRyLT5vYnVmX2hlYWQpID8gcHRyLT5vYnVmX3NpemUgOiAwKQogICAgKyBwdHItPm9idWZfaGVhZCAtIHB0ci0+b2J1Zl90YWlsOwp9CgpzdGF0aWMgdm9pZCBjb21tX3dhaXRyZWFkKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cik7CnN0YXRpYyB2b2lkIGNvbW1fd2FpdHdyaXRlKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cik7CgpzdGF0aWMgVk9JRCBXSU5BUEkgQ09NTTE2X1JlYWRDb21wbGV0ZShEV09SRCBzdGF0dXMsIERXT1JEIGxlbiwgTFBPVkVSTEFQUEVEIG92KQp7CglpbnQgcHJldiA7CglXT1JEIG1hc2sgPSAwOwoJaW50IGNpZCA9IEdldENvbW1Qb3J0X292KG92LDApOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKCWlmKGNpZDwwKSB7CgkJRVJSKCJhc3luYyB3cml0ZSB3aXRoIGJhZCBvdmVybGFwcGVkIHBvaW50ZXJcbiIpOwoJCXJldHVybjsKCX0KCXB0ciA9ICZDT01bY2lkXTsKCgkvKiByZWFkIGRhdGEgZnJvbSBjb21tIHBvcnQgKi8KCWlmIChzdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKCQlFUlIoImFzeW5jIHJlYWQgZmFpbGVkXG4iKTsKCQlDT01bY2lkXS5jb21tZXJyb3IgPSBDRV9SWE9WRVI7CgkJcmV0dXJuOwoJfQoJVFJBQ0UoImFzeW5jIHJlYWQgY29tcGxldGVkICVsZCBieXRlc1xuIixsZW4pOwoKCXByZXYgPSBjb21tX2luYnVmKHB0cik7CgoJLyogY2hlY2sgZm9yIGV2ZW50cyAqLwoJaWYgKChwdHItPmV2ZW50bWFzayAmIEVWX1JYRkxBRykgJiYKCSAgICBtZW1jaHIocHRyLT5pbmJ1ZiArIHB0ci0+aWJ1Zl9oZWFkLCBwdHItPmV2dGNoYXIsIGxlbikpIHsKCQkqKFdPUkQqKShDT01bY2lkXS51bmtub3duKSB8PSBFVl9SWEZMQUc7CgkJbWFzayB8PSBDTl9FVkVOVDsKCX0KCWlmIChwdHItPmV2ZW50bWFzayAmIEVWX1JYQ0hBUikgewoJCSooV09SRCopKENPTVtjaWRdLnVua25vd24pIHw9IEVWX1JYQ0hBUjsKCQltYXNrIHw9IENOX0VWRU5UOwoJfQoKCS8qIGFkdmFuY2UgYnVmZmVyIHBvc2l0aW9uICovCglwdHItPmlidWZfaGVhZCArPSBsZW47CglpZiAocHRyLT5pYnVmX2hlYWQgPj0gcHRyLT5pYnVmX3NpemUpCgkJcHRyLT5pYnVmX2hlYWQgPSAwOwoKCS8qIGNoZWNrIGZvciBub3RpZmljYXRpb24gKi8KCWlmIChwdHItPnduZCAmJiAocHRyLT5uX3JlYWQ+MCkgJiYgKHByZXY8cHRyLT5uX3JlYWQpICYmCgkgICAgKGNvbW1faW5idWYocHRyKT49cHRyLT5uX3JlYWQpKSB7CgkJLyogcGFzc2VkIHRoZSByZWNlaXZlIG5vdGlmaWNhdGlvbiB0aHJlc2hvbGQgKi8KCQltYXNrIHw9IENOX1JFQ0VJVkU7Cgl9CgoJLyogc2VuZCBub3RpZmljYXRpb25zLCBpZiBhbnkgKi8KCWlmIChwdHItPnduZCAmJiBtYXNrKSB7CgkJVFJBQ0UoIm5vdGlmeWluZyAlMDR4OiBjaWQ9JWQsIG1hc2s9JTAyeFxuIiwgcHRyLT53bmQsIGNpZCwgbWFzayk7CgkJUG9zdE1lc3NhZ2VBKHB0ci0+d25kLCBXTV9DT01NTk9USUZZLCBjaWQsIG1hc2spOwoJfQoKCS8qIG9uIHJlYWwgd2luZG93cywgdGhpcyBjb3VsZCBjYXVzZSBwcm9ibGVtcywgc2luY2UgaXQgaXMgcmVjdXJzaXZlICovCgkvKiByZXN0YXJ0IHRoZSByZWNlaXZlICovCgljb21tX3dhaXRyZWFkKHB0cik7Cn0KCnN0YXRpYyBWT0lEIFdJTkFQSSBDT01NMTZfV3JpdGVDb21wbGV0ZShEV09SRCBzdGF0dXMsIERXT1JEIGxlbiwgTFBPVkVSTEFQUEVEIG92KQp7CglpbnQgcHJldiwgYmxlZnQ7CglXT1JEIG1hc2sgPSAwOwoJaW50IGNpZCA9IEdldENvbW1Qb3J0X292KG92LDEpOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKCWlmKGNpZDwwKSB7CgkJRVJSKCJhc3luYyB3cml0ZSB3aXRoIGJhZCBvdmVybGFwcGVkIHBvaW50ZXJcbiIpOwoJCXJldHVybjsKCX0KCXB0ciA9ICZDT01bY2lkXTsKCgkvKiByZWFkIGRhdGEgZnJvbSBjb21tIHBvcnQgKi8KCWlmIChzdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKCQlFUlIoImFzeW5jIHdyaXRlIGZhaWxlZFxuIik7CgkJQ09NW2NpZF0uY29tbWVycm9yID0gQ0VfUlhPVkVSOwoJCXJldHVybjsKCX0KCVRSQUNFKCJhc3luYyB3cml0ZSBjb21wbGV0ZWQgJWxkIGJ5dGVzXG4iLGxlbik7CgoJLyogdXBkYXRlIHRoZSBidWZmZXIgcG9pbnRlcnMgKi8KCXByZXYgPSBjb21tX291dGJ1ZigmQ09NW2NpZF0pOwoJcHRyLT5vYnVmX3RhaWwgKz0gbGVuOwoJaWYgKHB0ci0+b2J1Zl90YWlsID49IHB0ci0+b2J1Zl9zaXplKQoJCXB0ci0+b2J1Zl90YWlsID0gMDsKCgkvKiB3cml0ZSBhbnkgVHJhbnNtaXRDb21tQ2hhciBjaGFyYWN0ZXIgKi8KCWlmIChwdHItPnhtaXQ+PTApIHsKCQlpZighV3JpdGVGaWxlKHB0ci0+aGFuZGxlLCAmKHB0ci0+eG1pdCksIDEsICZsZW4sIE5VTEwpKQoJCQlsZW4gPSAtMTsKCQlpZiAobGVuID4gMCkgcHRyLT54bWl0ID0gLTE7Cgl9CgoJLyogd3JpdGUgZnJvbSBvdXRwdXQgcXVldWUgKi8KCWJsZWZ0ID0gKChwdHItPm9idWZfdGFpbCA8PSBwdHItPm9idWZfaGVhZCkgPyAKCQlwdHItPm9idWZfaGVhZCA6IHB0ci0+b2J1Zl9zaXplKSAtIHB0ci0+b2J1Zl90YWlsOwoKCS8qIGNoZWNrIGZvciBub3RpZmljYXRpb24gKi8KCWlmIChwdHItPnduZCAmJiAocHRyLT5uX3dyaXRlPjApICYmIChwcmV2Pj1wdHItPm5fd3JpdGUpICYmCgkgIChjb21tX291dGJ1ZihwdHIpPHB0ci0+bl93cml0ZSkpIHsKCQkvKiBwYXNzZWQgdGhlIHRyYW5zbWl0IG5vdGlmaWNhdGlvbiB0aHJlc2hvbGQgKi8KCQltYXNrIHw9IENOX1RSQU5TTUlUOwoJfQoKCS8qIHNlbmQgbm90aWZpY2F0aW9ucywgaWYgYW55ICovCglpZiAocHRyLT53bmQgJiYgbWFzaykgewoJCVRSQUNFKCJub3RpZnlpbmcgJTA0eDogY2lkPSVkLCBtYXNrPSUwMnhcbiIsIHB0ci0+d25kLCBjaWQsIG1hc2spOwoJCVBvc3RNZXNzYWdlQShwdHItPnduZCwgV01fQ09NTU5PVElGWSwgY2lkLCBtYXNrKTsKCX0KCgkvKiBzdGFydCBhZ2FpbiBpZiBuZWNlc3NhcnkgKi8KCWlmKGJsZWZ0KQoJCWNvbW1fd2FpdHdyaXRlKHB0cik7Cn0KCnN0YXRpYyB2b2lkIGNvbW1fd2FpdHJlYWQoc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyKQp7CglpbnQgYmxlZnQ7CgoJYmxlZnQgPSAoKHB0ci0+aWJ1Zl90YWlsID4gcHRyLT5pYnVmX2hlYWQpID8gCgkJKHB0ci0+aWJ1Zl90YWlsLTEpIDogcHRyLT5pYnVmX3NpemUpIC0gcHRyLT5pYnVmX2hlYWQ7CgkvKiBGSVhNRTogZ2V0IHRpbWVvdXRzIHdvcmtpbmcgcHJvcGVybHkgc28gd2UgY2FuIHJlYWQgYmxlZnQgYnl0ZXMgKi8KCVJlYWRGaWxlRXgocHRyLT5oYW5kbGUsCgkJcHRyLT5pbmJ1ZiArIHB0ci0+aWJ1Zl9oZWFkLAoJCTEsCgkJJnB0ci0+cmVhZF9vdiwKCQlDT01NMTZfUmVhZENvbXBsZXRlKTsKfQoKc3RhdGljIHZvaWQgY29tbV93YWl0d3JpdGUoc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyKQp7CglpbnQgYmxlZnQ7CgoJYmxlZnQgPSAoKHB0ci0+b2J1Zl90YWlsIDw9IHB0ci0+b2J1Zl9oZWFkKSA/IAoJCXB0ci0+b2J1Zl9oZWFkIDogcHRyLT5vYnVmX3NpemUpIC0gcHRyLT5vYnVmX3RhaWw7CglXcml0ZUZpbGVFeChwdHItPmhhbmRsZSwKCQlwdHItPm91dGJ1ZiArIHB0ci0+b2J1Zl90YWlsLAoJCWJsZWZ0LAoJCSZwdHItPndyaXRlX292LAoJCUNPTU0xNl9Xcml0ZUNvbXBsZXRlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNPTU0xNl9EQ0J0b0RDQjE2CShJbnRlcm5hbCkKICovCklOVDE2IENPTU0xNl9EQ0J0b0RDQjE2KExQRENCIGxwZGNiLCBMUERDQjE2IGxwZGNiMTYpCnsKCWlmKGxwZGNiLT5CYXVkUmF0ZTwweDEwMDAwKQoJCWxwZGNiMTYtPkJhdWRSYXRlID0gbHBkY2ItPkJhdWRSYXRlOwoJZWxzZSBpZihscGRjYi0+QmF1ZFJhdGU9PTExNTIwMCkKCQkJbHBkY2IxNi0+QmF1ZFJhdGUgPSA1NzYwMTsKCWVsc2UgewoJCVdBUk4oIkJhdWQgcmF0ZSBjYW4ndCBiZSBjb252ZXJ0ZWRcbiIpOwoJCWxwZGNiMTYtPkJhdWRSYXRlID0gNTc2MDE7Cgl9CglscGRjYjE2LT5CeXRlU2l6ZSA9IGxwZGNiLT5CeXRlU2l6ZTsKCWxwZGNiMTYtPmZQYXJpdHkgPSBscGRjYi0+ZlBhcml0eTsKCWxwZGNiMTYtPlBhcml0eSA9IGxwZGNiLT5QYXJpdHk7CglscGRjYjE2LT5TdG9wQml0cyA9IGxwZGNiLT5TdG9wQml0czsKCglscGRjYjE2LT5SbHNUaW1lb3V0ID0gNTA7CglscGRjYjE2LT5DdHNUaW1lb3V0ID0gNTA7IAoJbHBkY2IxNi0+RHNyVGltZW91dCA9IDUwOwoJbHBkY2IxNi0+Zk51bGwgPSAwOwoJbHBkY2IxNi0+ZkNoRXZ0ID0gMDsKCWxwZGNiMTYtPmZCaW5hcnkgPSAxOwoJbHBkY2IxNi0+ZkR0ckRpc2FibGUgPSAwOwoKCWxwZGNiMTYtPmZEdHJmbG93ID0gKGxwZGNiLT5mRHRyQ29udHJvbD09RFRSX0NPTlRST0xfRU5BQkxFKTsKCWxwZGNiMTYtPmZSdHNmbG93ID0gKGxwZGNiLT5mUnRzQ29udHJvbD09UlRTX0NPTlRST0xfRU5BQkxFKTsKCWxwZGNiMTYtPmZPdXR4Q3RzRmxvdyA9IGxwZGNiLT5mT3V0eEN0c0Zsb3c7CglscGRjYjE2LT5mT3V0eERzckZsb3cgPSBscGRjYi0+Zk91dHhEc3JGbG93OwoJbHBkY2IxNi0+ZkR0ckRpc2FibGUgPSAobHBkY2ItPmZEdHJDb250cm9sPT1EVFJfQ09OVFJPTF9ESVNBQkxFKTsKCglscGRjYjE2LT5mSW5YID0gbHBkY2ItPmZJblg7CgoJbHBkY2IxNi0+Zk91dFggPSBscGRjYi0+Zk91dFg7Ci8qCglscGRjYjE2LT5Yb25DaGFyID0gCglscGRjYjE2LT5Yb2ZmQ2hhciA9IAogKi8KCWxwZGNiMTYtPlhvbkxpbSA9IDEwOwoJbHBkY2IxNi0+WG9mZkxpbSA9IDEwOwoKCXJldHVybiAwOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgQnVpbGRDb21tRENCCQkoVVNFUi4yMTMpCiAqCiAqIEFjY29yZGluZyB0byB0aGUgRUNNQS0yMzQgKDM2OC4zKSB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gRkFMU0Ugb24gCiAqIHN1Y2Nlc3MsIG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiAtMS4gCiAqLwpJTlQxNiBXSU5BUEkgQnVpbGRDb21tRENCMTYoTFBDU1RSIGRldmljZSwgTFBEQ0IxNiBscGRjYikKewoJLyogIkNPTTE6OTYsbiw4LDEiCSovCgkvKiAgMDEyMzQ1CQkqLwoJaW50IHBvcnQ7CglEQ0IgZGNiOwoKCVRSQUNFKCIoJXMpLCBwdHIgJXBcbiIsIGRldmljZSwgbHBkY2IpOwoKCWlmIChzdHJuY2FzZWNtcChkZXZpY2UsIkNPTSIsMykpCgkJcmV0dXJuIC0xOwoJcG9ydCA9IGRldmljZVszXSAtICcwJzsKCglpZiAocG9ydC0tID09IDApIHsKCQlFUlIoIkJVRyAhIENPTTAgY2FuJ3QgZXhpc3QhXG4iKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKCFWYWxpZENPTVBvcnQocG9ydCkpIHsKCQlGSVhNRSgiaW52YWxpZCBDT00gcG9ydCAlZD9cbiIscG9ydCk7CgkJcmV0dXJuIC0xOwoJfQoJCQoJbWVtc2V0KGxwZGNiLCAwLCBzaXplb2YoRENCMTYpKTsgLyogaW5pdGlhbGl6ZSAqLwoKCWxwZGNiLT5JZCA9IHBvcnQ7CglkY2IuRENCbGVuZ3RoID0gc2l6ZW9mKERDQik7CgoJaWYgKHN0cmNocihkZXZpY2UsJz0nKSkgLyogYmxvY2sgbmV3IHN0eWxlICovCgkJcmV0dXJuIC0xOwoKCWlmKCFCdWlsZENvbW1EQ0JBKGRldmljZSwmZGNiKSkKCQlyZXR1cm4gLTE7CgoJcmV0dXJuIENPTU0xNl9EQ0J0b0RDQjE2KCZkY2IsIGxwZGNiKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCU9wZW5Db21tCQkoVVNFUi4yMDApCiAqLwpJTlQxNiBXSU5BUEkgT3BlbkNvbW0xNihMUENTVFIgZGV2aWNlLFVJTlQxNiBjYkluUXVldWUsVUlOVDE2IGNiT3V0UXVldWUpCnsKCWludCBwb3J0OwoJSEFORExFIGhhbmRsZTsKCiAgICAJVFJBQ0UoIiVzLCAlZCwgJWRcbiIsIGRldmljZSwgY2JJblF1ZXVlLCBjYk91dFF1ZXVlKTsKCglpZiAoc3RybGVuKGRldmljZSkgPCA0KQoJICAgcmV0dXJuIElFX0JBRElEOwoKCXBvcnQgPSBkZXZpY2VbM10gLSAnMCc7CgoJaWYgKHBvcnQtLSA9PSAwKQoJCUVSUigiQlVHICEgQ09NMCBvciBMUFQwIGRvbid0IGV4aXN0ICFcbiIpOwoKCWlmICghc3RybmNhc2VjbXAoZGV2aWNlLCJDT00iLDMpKSB7CgkJCiAgICAgICAgICAgICAgICBUUkFDRSgiJXMgPSAlc1xuIiwgZGV2aWNlLCBDT01bcG9ydF0uZGV2aWNlbmFtZSk7CgoJCWlmICghVmFsaWRDT01Qb3J0KHBvcnQpKQoJCQlyZXR1cm4gSUVfQkFESUQ7CgoJCWlmIChDT01bcG9ydF0uaGFuZGxlKQoJCQlyZXR1cm4gSUVfT1BFTjsKCgkJaGFuZGxlID0gQ3JlYXRlRmlsZUEoZGV2aWNlLCBHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURSwKCQkJRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURSwgTlVMTCwgQ1JFQVRFX0FMV0FZUywgMCwgMCApOwoJCWlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKCQkJRVJSKCJDb3VsZG4ndCBvcGVuICVzICEgKCVzKVxuIiwgQ09NW3BvcnRdLmRldmljZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CgkJCXJldHVybiBJRV9IQVJEV0FSRTsKCQl9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBDT01bcG9ydF0udW5rbm93biA9IFNFR1BUUl9BTExPQyg0MCk7CgkJCW1lbXNldChDT01bcG9ydF0udW5rbm93biwgMCwgNDApOwoJCQlDT01bcG9ydF0uaGFuZGxlID0gaGFuZGxlOwoJCQlDT01bcG9ydF0uY29tbWVycm9yID0gMDsKCQkJQ09NW3BvcnRdLmV2ZW50bWFzayA9IDA7CgkJCUNPTVtwb3J0XS5ldnRjaGFyID0gMDsgLyogRklYTUU6IGRlZmF1bHQ/ICovCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgdGVybWluYWwgc3RhdGUgKi8KCQkJR2V0Q29tbVN0YXRlMTYocG9ydCwmQ09NW3BvcnRdLmRjYik7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaWYoQ09NW3BvcnRdLmJhdWRyYXRlPi0xKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQjE2IGRjYjsKCQkJICAgIG1lbWNweSgmZGNiLCZDT01bcG9ydF0uZGNiLHNpemVvZiBkY2IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNiLkJhdWRSYXRlPUNPTVtwb3J0XS5iYXVkcmF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vcmUgZGVmYXVsdHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkYXRhYml0cywgcGFyaXR5LCBzdG9wYml0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRDb21tU3RhdGUxNiggJmRjYik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkJLyogaW5pdCBwcmlvcml0eSBjaGFyYWN0ZXJzICovCgkJCUNPTVtwb3J0XS51bmdldCA9IC0xOwoJCQlDT01bcG9ydF0ueG1pdCA9IC0xOwoJCQkvKiBhbGxvY2F0ZSBidWZmZXJzICovCgkJCUNPTVtwb3J0XS5pYnVmX3NpemUgPSBjYkluUXVldWU7CgkJCUNPTVtwb3J0XS5pYnVmX2hlYWQgPSBDT01bcG9ydF0uaWJ1Zl90YWlsID0gMDsKCQkJQ09NW3BvcnRdLm9idWZfc2l6ZSA9IGNiT3V0UXVldWU7CgkJCUNPTVtwb3J0XS5vYnVmX2hlYWQgPSBDT01bcG9ydF0ub2J1Zl90YWlsID0gMDsKCgkJCUNPTVtwb3J0XS5pbmJ1ZiA9IG1hbGxvYyhjYkluUXVldWUpOwoJCQlpZiAoQ09NW3BvcnRdLmluYnVmKSB7CgkJCSAgQ09NW3BvcnRdLm91dGJ1ZiA9IG1hbGxvYyhjYk91dFF1ZXVlKTsKCQkJICBpZiAoIUNPTVtwb3J0XS5vdXRidWYpCgkJCSAgICBmcmVlKENPTVtwb3J0XS5pbmJ1Zik7CgkJCX0gZWxzZSBDT01bcG9ydF0ub3V0YnVmID0gTlVMTDsKCQkJaWYgKCFDT01bcG9ydF0ub3V0YnVmKSB7CgkJCSAgLyogbm90IGVub3VnaCBtZW1vcnkgKi8KCQkJICBTZXRDb21tU3RhdGUxNigmQ09NW3BvcnRdLmRjYik7CgkJCSAgQ2xvc2VIYW5kbGUoQ09NW3BvcnRdLmhhbmRsZSk7CgkJCSAgRVJSKCJvdXQgb2YgbWVtb3J5XG4iKTsKCQkJICByZXR1cm4gSUVfTUVNT1JZOwoJCQl9CgoJCQlaZXJvTWVtb3J5KCZDT01bcG9ydF0ucmVhZF9vdixzaXplb2YgKE9WRVJMQVBQRUQpKTsKCQkJWmVyb01lbW9yeSgmQ09NW3BvcnRdLndyaXRlX292LHNpemVvZiAoT1ZFUkxBUFBFRCkpOwoJCQlDT01bcG9ydF0ucmVhZF9vdi5oRXZlbnQgPSBDcmVhdGVFdmVudEEoTlVMTCwwLDAsTlVMTCk7CgkJCUNPTVtwb3J0XS53cml0ZV9vdi5oRXZlbnQgPSBDcmVhdGVFdmVudEEoTlVMTCwwLDAsTlVMTCk7CgogICAgICAgICAgICAgICAgICAgICAgICBjb21tX3dhaXRyZWFkKCAmQ09NW3BvcnRdICk7CgoJCQlyZXR1cm4gcG9ydDsKCQl9Cgl9IAoJZWxzZSAKCWlmICghc3RybmNhc2VjbXAoZGV2aWNlLCJMUFQiLDMpKSB7CgkKCQlpZiAoIVZhbGlkTFBUUG9ydChwb3J0KSkKCQkJcmV0dXJuIElFX0JBRElEOwoKCQlpZiAoTFBUW3BvcnRdLmhhbmRsZSkKCQkJcmV0dXJuIElFX09QRU47CgoJCWhhbmRsZSA9IENyZWF0ZUZpbGVBKGRldmljZSwgR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEUsCgkJCUZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUsIE5VTEwsIENSRUFURV9BTFdBWVMsIDAsIDAgKTsKCQlpZiAoaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CgkJCXJldHVybiBJRV9IQVJEV0FSRTsKCQl9IGVsc2UgewoJCQlMUFRbcG9ydF0uaGFuZGxlID0gaGFuZGxlOwoJCQlMUFRbcG9ydF0uY29tbWVycm9yID0gMDsKCQkJTFBUW3BvcnRdLmV2ZW50bWFzayA9IDA7CgkJCXJldHVybiBwb3J0fEZMQUdfTFBUOwoJCX0KCX0KCXJldHVybiBJRV9CQURJRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNsb3NlQ29tbQkJKFVTRVIuMjA3KQogKi8KSU5UMTYgV0lOQVBJIENsb3NlQ29tbTE2KElOVDE2IGNpZCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogICAgICAgIAogICAgCVRSQUNFKCJjaWQ9JWRcbiIsIGNpZCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJaWYgKCEoY2lkJkZMQUdfTFBUKSkgewoJCS8qIENPTSBwb3J0ICovCgkJU0VHUFRSX0ZSRUUoQ09NW2NpZF0udW5rbm93bik7IC8qIFtMV10gKi8KCgkJQ2xvc2VIYW5kbGUoQ09NW2NpZF0ucmVhZF9vdi5oRXZlbnQpOwoJCUNsb3NlSGFuZGxlKENPTVtjaWRdLndyaXRlX292LmhFdmVudCk7CgoJCS8qIGZyZWUgYnVmZmVycyAqLwoJCWZyZWUocHRyLT5vdXRidWYpOwoJCWZyZWUocHRyLT5pbmJ1Zik7CgoJCS8qIHJlc2V0IG1vZGVtIGxpbmVzICovCgkJU2V0Q29tbVN0YXRlMTYoJkNPTVtjaWRdLmRjYik7Cgl9CgoJaWYgKCFDbG9zZUhhbmRsZShwdHItPmhhbmRsZSkpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJLyogRklYTUU6IHNob3VsZCB3ZSBjbGVhciBwdHItPmhhbmRsZSBoZXJlPyAqLwoJCXJldHVybiAtMTsKCX0gZWxzZSB7CgkJcHRyLT5jb21tZXJyb3IgPSAwOwoJCXB0ci0+aGFuZGxlID0gMDsKCQlyZXR1cm4gMDsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1CcmVhawkJKFVTRVIuMjEwKQogKi8KSU5UMTYgV0lOQVBJIFNldENvbW1CcmVhazE2KElOVDE2IGNpZCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKCVRSQUNFKCJjaWQ9JWRcbiIsIGNpZCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoKCXB0ci0+c3VzcGVuZGVkID0gMTsKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ2xlYXJDb21tQnJlYWsJKFVTRVIuMjExKQogKi8KSU5UMTYgV0lOQVBJIENsZWFyQ29tbUJyZWFrMTYoSU5UMTYgY2lkKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKCJjaWQ9JWRcbiIsIGNpZCk7CglpZiAoIShwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkpIHsKCQlGSVhNRSgibm8gY2lkPSVkIGZvdW5kIVxuIiwgY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CglwdHItPnN1c3BlbmRlZCA9IDA7CglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUVzY2FwZUNvbW1GdW5jdGlvbgkoVVNFUi4yMTQpCiAqLwpMT05HIFdJTkFQSSBFc2NhcGVDb21tRnVuY3Rpb24xNihVSU5UMTYgY2lkLFVJTlQxNiBuRnVuY3Rpb24pCnsKCXN0cnVjdCAgRG9zRGV2aWNlU3RydWN0ICpwdHI7CglpbnQJbWF4OwoKICAgIAlUUkFDRSgiY2lkPSVkLCBmdW5jdGlvbj0lZFxuIiwgY2lkLCBuRnVuY3Rpb24pOwoKCXN3aXRjaChuRnVuY3Rpb24pIHsKCWNhc2UgR0VUTUFYQ09NOgoJICAgICAgICBUUkFDRSgiR0VUTUFYQ09NXG4iKTsgCgkJZm9yIChtYXggPSBNQVhfUE9SVFM7IUNPTVttYXhdLmRldmljZW5hbWU7bWF4LS0pCgkJCTsKCQlyZXR1cm4gbWF4OwoKCWNhc2UgR0VUTUFYTFBUOgoJCVRSQUNFKCJHRVRNQVhMUFRcbiIpOyAKCQlmb3IgKG1heCA9IE1BWF9QT1JUUzshTFBUW21heF0uZGV2aWNlbmFtZTttYXgtLSkKCQkJOwoJCXJldHVybiBGTEFHX0xQVCArIG1heDsKCgljYXNlIEdFVEJBU0VJUlE6CgkJVFJBQ0UoIkdFVEJBU0VJUlFcbiIpOyAKCQkvKiBGSVhNRTogdXNlIHRhYmxlcyAqLwoJCS8qIGp1c3QgZmFrZSBzb21ldGhpbmcgZm9yIG5vdyAqLwoJCWlmIChjaWQgJiBGTEFHX0xQVCkgewoJCQkvKiBMUFQxOiBpcnEgNywgTFBUMjogaXJxIDUgKi8KCQkJcmV0dXJuIChjaWQgJiAweDdmKSA/IDUgOiA3OwoJCX0gZWxzZSB7CgkJCS8qIENPTTE6IGlycSA0LCBDT00yOiBpcnEgMywKCQkJICAgQ09NMzogaXJxIDQsIENPTTQ6IGlycSAzICovCgkJCXJldHVybiA0IC0gKGNpZCAmIDEpOwoJCX0KCX0KCglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoKCXN3aXRjaCAobkZ1bmN0aW9uKSB7CgljYXNlIFJFU0VUREVWOgoJY2FzZSBDTFJEVFI6CgljYXNlIENMUlJUUzoKCWNhc2UgU0VURFRSOgoJY2FzZSBTRVRSVFM6CgljYXNlIFNFVFhPRkY6CgljYXNlIFNFVFhPTjoKCQlpZihFc2NhcGVDb21tRnVuY3Rpb24ocHRyLT5oYW5kbGUsbkZ1bmN0aW9uKSkKCQkJcmV0dXJuIDA7CgkJZWxzZSB7CgkJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsKCQkJcmV0dXJuIC0xOwoJCX0KCgljYXNlIENMUkJSRUFLOgoJY2FzZSBTRVRCUkVBSzoKCWRlZmF1bHQ6CgkJV0FSTigiKGNpZD0lZCxuRnVuY3Rpb249JWQpOiBVbmtub3duIGZ1bmN0aW9uXG4iLCAKCQkJY2lkLCBuRnVuY3Rpb24pOwoJfQoJcmV0dXJuIC0xOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRmx1c2hDb21tCShVU0VSLjIxNSkKICovCklOVDE2IFdJTkFQSSBGbHVzaENvbW0xNihJTlQxNiBjaWQsSU5UMTYgZm5RdWV1ZSkKewoJRFdPUkQgcXVldWU7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKCJjaWQ9JWQsIHF1ZXVlPSVkXG4iLCBjaWQsIGZuUXVldWUpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBjaWQ9JWQgZm91bmQhXG4iLCBjaWQpOwoJCXJldHVybiAtMTsKCX0KCXN3aXRjaCAoZm5RdWV1ZSkgewoJY2FzZSAwOgoJCXF1ZXVlID0gUFVSR0VfVFhBQk9SVDsKCQlwdHItPm9idWZfdGFpbCA9IHB0ci0+b2J1Zl9oZWFkOwoJCWJyZWFrOwoJY2FzZSAxOgoJCXF1ZXVlID0gUFVSR0VfUlhBQk9SVDsKCQlwdHItPmlidWZfaGVhZCA9IHB0ci0+aWJ1Zl90YWlsOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlXQVJOKCIoY2lkPSVkLGZuUXVldWU9JWQpOlVua25vd24gcXVldWVcbiIsIAoJCSAgICAgICAgICAgIGNpZCwgZm5RdWV1ZSk7CgkJcmV0dXJuIC0xOwoJfQoKCWlmICghUHVyZ2VDb21tKHB0ci0+aGFuZGxlLHF1ZXVlKSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsKCQlyZXR1cm4gLTE7CQoJfSBlbHNlIHsKCQlwdHItPmNvbW1lcnJvciA9IDA7CgkJcmV0dXJuIDA7Cgl9Cn0gIAoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUdldENvbW1FcnJvcgkoVVNFUi4yMDMpCiAqLwpJTlQxNiBXSU5BUEkgR2V0Q29tbUVycm9yMTYoSU5UMTYgY2lkLExQQ09NU1RBVDE2IGxwU3RhdCkKewoJaW50CQl0ZW1wZXJyb3I7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CiAgICAgICAgdW5zaWduZWQgY2hhciAqc3RvbDsKCglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KICAgICAgICBpZiAoY2lkJkZMQUdfTFBUKSB7CiAgICAgICAgICAgIFdBUk4oIiBjaWQgJWQgbm90IGNvbW0gcG9ydFxuIixjaWQpOwogICAgICAgICAgICByZXR1cm4gQ0VfTU9ERTsKICAgICAgICB9CiAgICAgICAgc3RvbCA9ICh1bnNpZ25lZCBjaGFyICopQ09NW2NpZF0udW5rbm93biArIENPTU1fTVNSX09GRlNFVDsKCUNPTU1fTVNSVXBkYXRlKCBwdHItPmhhbmRsZSwgc3RvbCApOwoKCWlmIChscFN0YXQpIHsKCQlIQU5ETEUgcndfZXZlbnRzWzJdOwoKCQlscFN0YXQtPnN0YXR1cyA9IDA7CgoJCXJ3X2V2ZW50c1swXSA9IENPTVtjaWRdLnJlYWRfb3YuaEV2ZW50OwoJCXJ3X2V2ZW50c1sxXSA9IENPTVtjaWRdLndyaXRlX292LmhFdmVudDsKCgkJV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4KDIsJnJ3X2V2ZW50c1swXSxGQUxTRSwxLFRSVUUpOwoKCQlscFN0YXQtPmNiT3V0UXVlID0gY29tbV9vdXRidWYocHRyKTsKCQlscFN0YXQtPmNiSW5RdWUgPSBjb21tX2luYnVmKHB0cik7CgogICAgCQlUUkFDRSgiY2lkICVkLCBlcnJvciAlZCwgc3RhdCAlZCBpbiAlZCBvdXQgJWQsIHN0b2wgJXhcbiIsCgkJCSAgICAgY2lkLCBwdHItPmNvbW1lcnJvciwgbHBTdGF0LT5zdGF0dXMsIGxwU3RhdC0+Y2JJblF1ZSwgCgkJCSAgICAgbHBTdGF0LT5jYk91dFF1ZSwgKnN0b2wpOwoJfQoJZWxzZQoJCVRSQUNFKCJjaWQgJWQsIGVycm9yICVkLCBscFN0YXQgTlVMTCBzdG9sICV4XG4iLAoJCQkgICAgIGNpZCwgcHRyLT5jb21tZXJyb3IsICpzdG9sKTsKCgkvKiBSZXR1cm4gYW55IGVycm9ycyBhbmQgY2xlYXIgaXQgKi8KCXRlbXBlcnJvciA9IHB0ci0+Y29tbWVycm9yOwoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuKHRlbXBlcnJvcik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tRXZlbnRNYXNrCShVU0VSLjIwOCkKICovClNFR1BUUiBXSU5BUEkgU2V0Q29tbUV2ZW50TWFzazE2KElOVDE2IGNpZCxVSU5UMTYgZnVFdnRNYXNrKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CiAgICAgICAgdW5zaWduZWQgY2hhciAqc3RvbDsKCiAgICAJVFJBQ0UoImNpZCAlZCxtYXNrICVkXG4iLGNpZCxmdUV2dE1hc2spOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsY2lkKTsKCSAgICByZXR1cm4gKFNFR1BUUilOVUxMOwoJfQoKCXB0ci0+ZXZlbnRtYXNrID0gZnVFdnRNYXNrOwoKICAgICAgICBpZiAoKGNpZCZGTEFHX0xQVCkgfHwgIVZhbGlkQ09NUG9ydChjaWQpKSB7CiAgICAgICAgICAgIFdBUk4oIiBjaWQgJWQgbm90IGNvbW0gcG9ydFxuIixjaWQpOwogICAgICAgICAgICByZXR1cm4gKFNFR1BUUilOVUxMOwogICAgICAgIH0KICAgICAgICAvKiBpdCdzIGEgQ09NIHBvcnQgPyAtPiBtb2RpZnkgZmxhZ3MgKi8KICAgICAgICBzdG9sID0gKHVuc2lnbmVkIGNoYXIgKilDT01bY2lkXS51bmtub3duICsgQ09NTV9NU1JfT0ZGU0VUOwoJQ09NTV9NU1JVcGRhdGUoIHB0ci0+aGFuZGxlLCBzdG9sICk7CgoJVFJBQ0UoIiBtb2RlbSBkY2QgY29uc3RydWN0ICV4XG4iLCpzdG9sKTsKCXJldHVybiBTRUdQVFJfR0VUKENPTVtjaWRdLnVua25vd24pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbUV2ZW50TWFzawkoVVNFUi4yMDkpCiAqLwpVSU5UMTYgV0lOQVBJIEdldENvbW1FdmVudE1hc2sxNihJTlQxNiBjaWQsVUlOVDE2IGZuRXZ0Q2xlYXIpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCVdPUkQgZXZlbnRzOwoKICAgIAlUUkFDRSgiY2lkICVkLCBtYXNrICVkXG4iLCBjaWQsIGZuRXZ0Q2xlYXIpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsY2lkKTsKCSAgICByZXR1cm4gMDsKCX0KCiAgICAgICAgaWYgKChjaWQmRkxBR19MUFQpIHx8ICFWYWxpZENPTVBvcnQoY2lkKSkgewogICAgICAgICAgICBXQVJOKCIgY2lkICVkIG5vdCBjb21tIHBvcnRcbiIsY2lkKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQoKCWV2ZW50cyA9ICooV09SRCopKENPTVtjaWRdLnVua25vd24pICYgZm5FdnRDbGVhcjsKCSooV09SRCopKENPTVtjaWRdLnVua25vd24pICY9IH5mbkV2dENsZWFyOwoJcmV0dXJuIGV2ZW50czsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1TdGF0ZQkoVVNFUi4yMDEpCiAqLwpJTlQxNiBXSU5BUEkgU2V0Q29tbVN0YXRlMTYoTFBEQ0IxNiBscGRjYikKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJRENCIGRjYjsKCiAgICAJVFJBQ0UoImNpZCAlZCwgcHRyICVwXG4iLCBscGRjYi0+SWQsIGxwZGNiKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGxwZGNiLT5JZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGxwZGNiLT5JZCk7CgkJcmV0dXJuIC0xOwoJfQoKCW1lbXNldCgmZGNiLDAsc2l6ZW9mIGRjYik7CglkY2IuRENCbGVuZ3RoID0gc2l6ZW9mIGRjYjsKCWlmKGxwZGNiLT5CYXVkUmF0ZT09NTc2MDEpCgkJZGNiLkJhdWRSYXRlID0gMTE1MjAwOwogICAgICAgIGVsc2UKCQlkY2IuQmF1ZFJhdGUgPSBscGRjYi0+QmF1ZFJhdGU7CgkKICAgICAgICBkY2IuQnl0ZVNpemU9bHBkY2ItPkJ5dGVTaXplOwogICAgICAgIGRjYi5TdG9wQml0cz1scGRjYi0+U3RvcEJpdHM7CgoJZGNiLmZQYXJpdHk9bHBkY2ItPmZQYXJpdHk7CglkY2IuUGFyaXR5PWxwZGNiLT5QYXJpdHk7CgoJZGNiLmZPdXR4Q3RzRmxvdyA9IGxwZGNiLT5mT3V0eEN0c0Zsb3c7CgoJaWYgKGxwZGNiLT5mRHRyZmxvdyB8fCBscGRjYi0+ZlJ0c2Zsb3cpCgkJZGNiLmZSdHNDb250cm9sID0gVFJVRTsKCglpZiAobHBkY2ItPmZEdHJEaXNhYmxlKSAKCQlkY2IuZkR0ckNvbnRyb2wgPSBUUlVFOwoKCXB0ci0+ZXZ0Y2hhciA9IGxwZGNiLT5FdnRDaGFyOwoKCWRjYi5mSW5YID0gbHBkY2ItPmZJblg7CglkY2IuZk91dFggPSBscGRjYi0+Zk91dFg7CiAgICAgICAgCglpZiAoIVNldENvbW1TdGF0ZShwdHItPmhhbmRsZSwmZGNiKSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsJCgkJcmV0dXJuIC0xOwoJfSBlbHNlIHsKCQlwdHItPmNvbW1lcnJvciA9IDA7CgkJcmV0dXJuIDA7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tU3RhdGUJKFVTRVIuMjAyKQogKi8KSU5UMTYgV0lOQVBJIEdldENvbW1TdGF0ZTE2KElOVDE2IGNpZCwgTFBEQ0IxNiBscGRjYikKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJRENCIGRjYjsKCiAgICAJVFJBQ0UoImNpZCAlZCwgcHRyICVwXG4iLCBjaWQsIGxwZGNiKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJaWYgKCFHZXRDb21tU3RhdGUocHRyLT5oYW5kbGUsJmRjYikpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CQoJCXJldHVybiAtMTsKCX0KCglscGRjYi0+SWQgPSBjaWQ7CgoJQ09NTTE2X0RDQnRvRENCMTYoJmRjYixscGRjYik7CgoJbHBkY2ItPkV2dENoYXIgPSBwdHItPmV2dGNoYXI7CgoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglUcmFuc21pdENvbW1DaGFyCShVU0VSLjIwNikKICovCklOVDE2IFdJTkFQSSBUcmFuc21pdENvbW1DaGFyMTYoSU5UMTYgY2lkLENIQVIgY2hUcmFuc21pdCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkICVkLCBkYXRhICVkIFxuIiwgY2lkLCBjaFRyYW5zbWl0KTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoKCWlmIChwdHItPnN1c3BlbmRlZCkgewoJCXB0ci0+Y29tbWVycm9yID0gSUVfSEFSRFdBUkU7CgkJcmV0dXJuIC0xOwoJfQkKCglpZiAocHRyLT54bWl0ID49IDApIHsKCSAgLyogY2hhcmFjdGVyIGFscmVhZHkgcXVldWVkICovCgkgIC8qIEZJWE1FOiB3aGljaCBlcnJvciB3b3VsZCBXaW5kb3dzIHJldHVybj8gKi8KCSAgcHRyLT5jb21tZXJyb3IgPSBDRV9UWEZVTEw7CgkgIHJldHVybiAtMTsKCX0KCglpZiAocHRyLT5vYnVmX2hlYWQgPT0gcHRyLT5vYnVmX3RhaWwpIHsKCSAgLyogdHJhbnNtaXQgcXVldWUgZW1wdHksIHRyeSB0byB0cmFuc21pdCBkaXJlY3RseSAqLwoJICBEV09SRCBsZW47CgkgIGlmKCFXcml0ZUZpbGUocHRyLT5oYW5kbGUsICZjaFRyYW5zbWl0LCAxLCAmbGVuLCBOVUxMKSkgewoJICAgIC8qIGRpZG4ndCB3b3JrLCBxdWV1ZSBpdCAqLwoJICAgIHB0ci0+eG1pdCA9IGNoVHJhbnNtaXQ7CgkgICAgY29tbV93YWl0d3JpdGUocHRyKTsKCSAgfQoJfSBlbHNlIHsKCSAgLyogZGF0YSBpbiBxdWV1ZSwgbGV0IHRoaXMgY2hhciBiZSB0cmFuc21pdHRlZCBuZXh0ICovCgkgIHB0ci0+eG1pdCA9IGNoVHJhbnNtaXQ7CgkgIGNvbW1fd2FpdHdyaXRlKHB0cik7Cgl9CgoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglVbmdldENvbW1DaGFyCShVU0VSLjIxMikKICovCklOVDE2IFdJTkFQSSBVbmdldENvbW1DaGFyMTYoSU5UMTYgY2lkLENIQVIgY2hVbmdldCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkICVkIChjaGFyICVkKVxuIiwgY2lkLCBjaFVuZ2V0KTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoKCWlmIChwdHItPnN1c3BlbmRlZCkgewoJCXB0ci0+Y29tbWVycm9yID0gSUVfSEFSRFdBUkU7CgkJcmV0dXJuIC0xOwoJfQkKCglpZiAocHRyLT51bmdldD49MCkgewoJICAvKiBjaGFyYWN0ZXIgYWxyZWFkeSBxdWV1ZWQgKi8KCSAgLyogRklYTUU6IHdoaWNoIGVycm9yIHdvdWxkIFdpbmRvd3MgcmV0dXJuPyAqLwoJICBwdHItPmNvbW1lcnJvciA9IENFX1JYT1ZFUjsKCSAgcmV0dXJuIC0xOwoJfQoKCXB0ci0+dW5nZXQgPSBjaFVuZ2V0OwoKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJUmVhZENvbW0JKFVTRVIuMjA0KQogKi8KSU5UMTYgV0lOQVBJIFJlYWRDb21tMTYoSU5UMTYgY2lkLExQU1RSIGxwdkJ1ZixJTlQxNiBjYlJlYWQpCnsKCWludCBzdGF0dXMsIGxlbmd0aDsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCUxQU1RSIG9yZ0J1ZiA9IGxwdkJ1ZjsKCiAgICAJVFJBQ0UoImNpZCAlZCwgcHRyICVwLCBsZW5ndGggJWRcbiIsIGNpZCwgbHB2QnVmLCBjYlJlYWQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gLTE7Cgl9CQoKCS8qIHJlYWQgdW5nZXQgY2hhcmFjdGVyICovCglpZiAocHRyLT51bmdldD49MCkgewoJCSpscHZCdWYrKyA9IHB0ci0+dW5nZXQ7CgkJcHRyLT51bmdldCA9IC0xOwoKCQlsZW5ndGggPSAxOwoJfSBlbHNlCgkgCWxlbmd0aCA9IDA7CgoJLyogcmVhZCBmcm9tIHJlY2VpdmUgYnVmZmVyICovCgl3aGlsZSAobGVuZ3RoIDwgY2JSZWFkKSB7CgkgIHN0YXR1cyA9ICgocHRyLT5pYnVmX2hlYWQgPCBwdHItPmlidWZfdGFpbCkgPwoJCSAgICBwdHItPmlidWZfc2l6ZSA6IHB0ci0+aWJ1Zl9oZWFkKSAtIHB0ci0+aWJ1Zl90YWlsOwoJICBpZiAoIXN0YXR1cykgYnJlYWs7CgkgIGlmICgoY2JSZWFkIC0gbGVuZ3RoKSA8IHN0YXR1cykKCSAgICBzdGF0dXMgPSBjYlJlYWQgLSBsZW5ndGg7CgoJICBtZW1jcHkobHB2QnVmLCBwdHItPmluYnVmICsgcHRyLT5pYnVmX3RhaWwsIHN0YXR1cyk7CgkgIHB0ci0+aWJ1Zl90YWlsICs9IHN0YXR1czsKCSAgaWYgKHB0ci0+aWJ1Zl90YWlsID49IHB0ci0+aWJ1Zl9zaXplKQoJICAgIHB0ci0+aWJ1Zl90YWlsID0gMDsKCSAgbHB2QnVmICs9IHN0YXR1czsKCSAgbGVuZ3RoICs9IHN0YXR1czsKCX0KCglUUkFDRSgiJS4qc1xuIiwgbGVuZ3RoLCBvcmdCdWYpOwoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIGxlbmd0aDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVdyaXRlQ29tbQkoVVNFUi4yMDUpCiAqLwpJTlQxNiBXSU5BUEkgV3JpdGVDb21tMTYoSU5UMTYgY2lkLCBMUFNUUiBscHZCdWYsIElOVDE2IGNiV3JpdGUpCnsKCWludCBzdGF0dXMsIGxlbmd0aDsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZCAlZCwgcHRyICVwLCBsZW5ndGggJWRcbiIsIAoJCWNpZCwgbHB2QnVmLCBjYldyaXRlKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoKCWlmIChwdHItPnN1c3BlbmRlZCkgewoJCXB0ci0+Y29tbWVycm9yID0gSUVfSEFSRFdBUkU7CgkJcmV0dXJuIC0xOwoJfQkKCQoJVFJBQ0UoIiUuKnNcbiIsIGNiV3JpdGUsIGxwdkJ1ZiApOwoKCWxlbmd0aCA9IDA7Cgl3aGlsZSAobGVuZ3RoIDwgY2JXcml0ZSkgewoJICBpZiAoKHB0ci0+b2J1Zl9oZWFkID09IHB0ci0+b2J1Zl90YWlsKSAmJiAocHRyLT54bWl0IDwgMCkpIHsKCSAgICAvKiBubyBkYXRhIHF1ZXVlZCwgdHJ5IHRvIHdyaXRlIGRpcmVjdGx5ICovCgkgICAgaWYoIVdyaXRlRmlsZShwdHItPmhhbmRsZSwgbHB2QnVmLCBjYldyaXRlIC0gbGVuZ3RoLCAoTFBEV09SRCkmc3RhdHVzLCBOVUxMKSkKCSAgICAgIHN0YXR1cyA9IC0xOwoJICAgIGlmIChzdGF0dXMgPiAwKSB7CgkgICAgICBscHZCdWYgKz0gc3RhdHVzOwoJICAgICAgbGVuZ3RoICs9IHN0YXR1czsKCSAgICAgIGNvbnRpbnVlOwoJICAgIH0KCSAgfQoJICAvKiBjYW4ndCB3cml0ZSBkaXJlY3RseSwgcHV0IGludG8gdHJhbnNtaXQgYnVmZmVyICovCgkgIHN0YXR1cyA9ICgocHRyLT5vYnVmX3RhaWwgPiBwdHItPm9idWZfaGVhZCkgPwoJCSAgICAocHRyLT5vYnVmX3RhaWwtMSkgOiBwdHItPm9idWZfc2l6ZSkgLSBwdHItPm9idWZfaGVhZDsKCSAgaWYgKCFzdGF0dXMpIGJyZWFrOwoJICBpZiAoKGNiV3JpdGUgLSBsZW5ndGgpIDwgc3RhdHVzKQoJICAgIHN0YXR1cyA9IGNiV3JpdGUgLSBsZW5ndGg7CgkgIG1lbWNweShscHZCdWYsIHB0ci0+b3V0YnVmICsgcHRyLT5vYnVmX2hlYWQsIHN0YXR1cyk7CgkgIHB0ci0+b2J1Zl9oZWFkICs9IHN0YXR1czsKCSAgaWYgKHB0ci0+b2J1Zl9oZWFkID49IHB0ci0+b2J1Zl9zaXplKQoJICAgIHB0ci0+b2J1Zl9oZWFkID0gMDsKCSAgbHB2QnVmICs9IHN0YXR1czsKCSAgbGVuZ3RoICs9IHN0YXR1czsKCSAgY29tbV93YWl0d3JpdGUocHRyKTsKCX0KCglwdHItPmNvbW1lcnJvciA9IDA7CQoJcmV0dXJuIGxlbmd0aDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBFbmFibGVDb21tTm90aWZpY2F0aW9uICAgKFVTRVIuMjQ1KQogKi8KQk9PTDE2IFdJTkFQSSBFbmFibGVDb21tTm90aWZpY2F0aW9uMTYoIElOVDE2IGNpZCwgSFdORDE2IGh3bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgY2JXcml0ZU5vdGlmeSwgSU5UMTYgY2JPdXRRdWV1ZSApCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCglUUkFDRSgiKCVkLCAleCwgJWQsICVkKVxuIiwgY2lkLCBod25kLCBjYldyaXRlTm90aWZ5LCBjYk91dFF1ZXVlKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJcHRyLT53bmQgPSBod25kOwoJcHRyLT5uX3JlYWQgPSBjYldyaXRlTm90aWZ5OwoJcHRyLT5uX3dyaXRlID0gY2JPdXRRdWV1ZTsKCXJldHVybiBUUlVFOwp9Cgo=