IC8qCiAqIERFQyA5MyBFcmlrIEJvcyA8ZXJpa0B4czRhbGwubmw+CiAqCiAqIENvcHlyaWdodCAxOTk2IE1hcmN1cyBNZWlzc25lcgogKgogKiBNYXIgMzEsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gSW1wbGVtZW50ZWQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogQXByIDMsIDE5OTkuICBMYXdzb24gV2hpdG5leSA8bGF3c29uX3doaXRuZXlAanVuby5jb20+CiAqIC0gRml4ZWQgdGhlIG1vZGVtIGNvbnRyb2wgcGFydCBvZiBFc2NhcGVDb21tRnVuY3Rpb24xNi4KICoKICogTWFyIDMsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gVXNlIHBvcnQgaW5kaWNlcyBpbnN0ZWFkIG9mIHVuaXhmZHMgZm9yIHdpbjE2CiAqIC0gTW92ZWQgdGhpbmdzIGFyb3VuZCAoc2VwYXJhdGVkIHdpbjE2IGFuZCB3aW4zMiByb3V0aW5lcykKICogLSBBZGRlZCBzb21lIGhpbnRzIG9uIGhvdyB0byBpbXBsZW1lbnQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogTWF5IDI2LCAxOTk3LiAgRml4ZXMgYW5kIGNvbW1lbnRzIGJ5IFJpY2sgUmljaGFyZHNvbiA8cmlja0BkZ2lpLmNvbT4gW1JFUl0KICogLSBwdHItPmZkIHdhc24ndCBnZXR0aW5nIGNsZWFyZWQgb24gY2xvc2UuCiAqIC0gR2V0Q29tbUV2ZW50TWFzaygpIGFuZCBHZXRDb21tRXJyb3IoKSBkaWRuJ3QgZG8gbXVjaCBvZiBhbnl0aGluZy4KICogICBJTUhPLCB0aGV5IGFyZSBzdGlsbCB3cm9uZywgYnV0IHRoZXkgYXQgbGVhc3QgaW1wbGVtZW50IHRoZSBSWENIQVIKICogICBldmVudCBhbmQgcmV0dXJuIEkvTyBxdWV1ZSBzaXplcywgd2hpY2ggbWFrZXMgdGhlIGFwcCBJJ20gaW50ZXJlc3RlZAogKiAgIGluIChhbmFsb2cgZGV2aWNlcyBFWktJVCBEU1AgZGV2ZWxvcG1lbnQgc3lzdGVtKSB3b3JrLgogKgogKiBBdWd1c3QgMTIsIDE5OTcuICBUYWtlIGEgYmFzaCBhdCBTZXRDb21tRXZlbnRNYXNrIC0gTGF3c29uIFdoaXRuZXkKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhd3Nvbl93aGl0bmV5QGp1bm8uY29tPgogKiBKdWx5IDYsIDE5OTguIEZpeGVzIGFuZCBjb21tZW50cyBieSBWYWxlbnRpam4gU2Vzc2luawogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dnNlc3NpbmtAaWMudXZhLm5sPiBbVl0KICogT2t0b2JlciA5OCwgUmVpbiBLbGF6ZXMgW1JIS10KICogQSBwcm9ncmFtIHRoYXQgd2FudHMgdG8gbW9uaXRvciB0aGUgbW9kZW0gc3RhdHVzIGxpbmUgKFJMU0QvRENEKSBtYXkKICogcG9sbCB0aGUgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyIGluIHRoZSBjb21tTWFzayBzdHJ1Y3R1cmUuIEkgdXBkYXRlIHRoZSBiaXQKICogaW4gR2V0Q29tbUVycm9yLCB3YWl0aW5nIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvZiBjb21tdW5pY2F0aW9uIGV2ZW50cy4KICogCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dGVybWlvcy5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaWZkZWYgSEFWRV9TVFJJTkdTX0gKIyBpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaWZkZWYgSEFWRV9TWVNfRklMSU9fSAojIGluY2x1ZGUgPHN5cy9maWxpby5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojaW5jbHVkZSAid2luZS93aW51c2VyMTYuaCIKI2luY2x1ZGUgImNvbW0uaCIKI2lmZGVmIEhBVkVfU1lTX01PREVNX0gKIyBpbmNsdWRlIDxzeXMvbW9kZW0uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19TVFJUSU9fSAojIGluY2x1ZGUgPHN5cy9zdHJ0aW8uaD4KI2VuZGlmCiNpbmNsdWRlICJoZWFwLmgiCiNpbmNsdWRlICJvcHRpb25zLmgiCgojaW5jbHVkZSAic2VydmVyLmgiCiNpbmNsdWRlICJwcm9jZXNzLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAic2VydmljZXMuaCIKI2luY2x1ZGUgImZpbGUuaCIKCiNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCgpERUZBVUxUX0RFQlVHX0NIQU5ORUwoY29tbSkKCiNpZm5kZWYgVElPQ0lOUQojZGVmaW5lCVRJT0NJTlEgRklPTlJFQUQKI2VuZGlmCiNkZWZpbmUgQ09NTV9NU1JfT0ZGU0VUICAzNSAgICAgICAvKiBzZWUga25vd2xlZGdlIGJhc2UgUTEwMTQxNyAqLwojZGVmaW5lIEZMQUdfTFBUIDB4ODAKCnN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgQ09NW01BWF9QT1JUU107CnN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgTFBUW01BWF9QT1JUU107Ci8qIHBvaW50ZXJzIHRvIHVua25vd24oPT11bmRvY3VtZW50ZWQpIGNvbW0gc3RydWN0dXJlICovIApMUENWT0lEICp1bmtub3duW01BWF9QT1JUU107Ci8qIHNhdmUgdGVybWluYWwgc3RhdGVzICovCnN0YXRpYyBzdHJ1Y3QgdGVybWlvcyBtX3N0YXRbTUFYX1BPUlRTXTsKCnZvaWQgQ09NTV9Jbml0KHZvaWQpCnsKCWludCB4OwoJY2hhciBvcHRpb25bMTBdLCB0ZW1wWzI1Nl0sICpidGVtcDsKCXN0cnVjdCBzdGF0IHN0OwoKCWZvciAoeD0wOyB4IT1NQVhfUE9SVFM7IHgrKykgewoJCXN0cmNweShvcHRpb24sIkNPTXgiKTsKCQlvcHRpb25bM10gPSAnMScgKyB4OwoJCW9wdGlvbls0XSA9ICdcMCc7CgoJCVBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggInNlcmlhbHBvcnRzIiwgb3B0aW9uLCAiKiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAsIHNpemVvZih0ZW1wKSApOwoJCWlmICghc3RyY21wKHRlbXAsICIqIikgfHwgKnRlbXAgPT0gJ1wwJykgCgkJCUNPTVt4XS5kZXZpY2VuYW1lID0gTlVMTDsKCQllbHNlIHsKCQkgIAlidGVtcCA9IHN0cmNocih0ZW1wLCcsJyk7CgkJCWlmIChidGVtcCAhPSBOVUxMKSB7CgkJCSAgCSpidGVtcCsrID0gJ1wwJzsKCQkJCUNPTVt4XS5iYXVkcmF0ZSA9IGF0b2koYnRlbXApOwoJCQl9IGVsc2UgewoJCQkJQ09NW3hdLmJhdWRyYXRlID0gLTE7CgkJCX0KCQkJc3RhdCh0ZW1wLCAmc3QpOwoJCQlpZiAoIVNfSVNDSFIoc3Quc3RfbW9kZSkpIAoJCQkJV0FSTigiQ2FuJ3QgdXNlIGAlcycgYXMgJXMgIVxuIiwgdGVtcCwgb3B0aW9uKTsKCQkJZWxzZQoJCQkJaWYgKChDT01beF0uZGV2aWNlbmFtZSA9IG1hbGxvYyhzdHJsZW4odGVtcCkrMSkpID09IE5VTEwpIAoJCQkJCVdBUk4oIkNhbid0IG1hbGxvYyBmb3IgZGV2aWNlIGluZm8hXG4iKTsKCQkJCWVsc2UgewoJCQkJCUNPTVt4XS5mZCA9IDA7CgkJCQkJc3RyY3B5KENPTVt4XS5kZXZpY2VuYW1lLCB0ZW1wKTsKCQkJCX0KICAgICAgICAgICAgICAgIFRSQUNFKCIlcyA9ICVzXG4iLCBvcHRpb24sIENPTVt4XS5kZXZpY2VuYW1lKTsKIAkJfQoKCQlzdHJjcHkob3B0aW9uLCAiTFBUeCIpOwoJCW9wdGlvblszXSA9ICcxJyArIHg7CgkJb3B0aW9uWzRdID0gJ1wwJzsKCgkJUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAicGFyYWxsZWxwb3J0cyIsIG9wdGlvbiwgIioiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLCBzaXplb2YodGVtcCkgKTsKCQlpZiAoIXN0cmNtcCh0ZW1wLCAiKiIpIHx8ICp0ZW1wID09ICdcMCcpCgkJCUxQVFt4XS5kZXZpY2VuYW1lID0gTlVMTDsKCQllbHNlIHsKCQkJc3RhdCh0ZW1wLCAmc3QpOwoJCQlpZiAoIVNfSVNDSFIoc3Quc3RfbW9kZSkpIAoJCQkJV0FSTigiQ2FuJ3QgdXNlIGAlcycgYXMgJXMgIVxuIiwgdGVtcCwgb3B0aW9uKTsKCQkJZWxzZSAKCQkJCWlmICgoTFBUW3hdLmRldmljZW5hbWUgPSBtYWxsb2Moc3RybGVuKHRlbXApKzEpKSA9PSBOVUxMKSAKCQkJCQlXQVJOKCJDYW4ndCBtYWxsb2MgZm9yIGRldmljZSBpbmZvIVxuIik7CgkJCQllbHNlIHsKCQkJCQlMUFRbeF0uZmQgPSAwOwoJCQkJCXN0cmNweShMUFRbeF0uZGV2aWNlbmFtZSwgdGVtcCk7CgkJCQl9CiAgICAgICAgICAgICAgICBUUkFDRSgiJXMgPSAlc1xuIiwgb3B0aW9uLCBMUFRbeF0uZGV2aWNlbmFtZSk7CgkJfQoKCX0KfQoKCnN0YXRpYyBzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpHZXREZXZpY2VTdHJ1Y3QoaW50IGZkKQp7CglpZiAoKGZkJjB4N0YpPD1NQVhfUE9SVFMpIHsKICAgICAgICAgICAgaWYgKCEoZmQmRkxBR19MUFQpKSB7CgkJaWYgKENPTVtmZF0uZmQpCgkJICAgIHJldHVybiAmQ09NW2ZkXTsKCSAgICB9IGVsc2UgewoJCWlmIChMUFRbZmRdLmZkKQoJCSAgICByZXR1cm4gJkxQVFtmZF07CgkgICAgfQoJfQoKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgaW50ICAgIEdldENvbW1Qb3J0X2ZkKGludCBmZCkKewogICAgICAgIGludCB4OwogICAgICAgIAogICAgICAgIGZvciAoeD0wOyB4PE1BWF9QT1JUUzsgeCsrKSB7CiAgICAgICAgICAgICBpZiAoQ09NW3hdLmZkID09IGZkKQogICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgfQogICAgICAgCiAgICAgICByZXR1cm4gLTE7Cn0gCgpzdGF0aWMgaW50IFZhbGlkQ09NUG9ydChpbnQgeCkKewoJcmV0dXJuKHggPCBNQVhfUE9SVFMgPyAoaW50KSBDT01beF0uZGV2aWNlbmFtZSA6IDApOyAKfQoKc3RhdGljIGludCBWYWxpZExQVFBvcnQoaW50IHgpCnsKCXJldHVybih4IDwgTUFYX1BPUlRTID8gKGludCkgTFBUW3hdLmRldmljZW5hbWUgOiAwKTsgCn0KCnN0YXRpYyBpbnQgV2luRXJyb3Iodm9pZCkKewogICAgICAgIFRSQUNFKCJlcnJubyA9ICVkXG4iLCBlcnJubyk7Cglzd2l0Y2ggKGVycm5vKSB7CgkJZGVmYXVsdDoKCQkJcmV0dXJuIENFX0lPRTsKCQl9Cn0KCnN0YXRpYyB1bnNpZ25lZCBjb21tX2luYnVmKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cikKewogIHJldHVybiAoKHB0ci0+aWJ1Zl90YWlsID4gcHRyLT5pYnVmX2hlYWQpID8gcHRyLT5pYnVmX3NpemUgOiAwKQogICAgKyBwdHItPmlidWZfaGVhZCAtIHB0ci0+aWJ1Zl90YWlsOwp9CgpzdGF0aWMgdW5zaWduZWQgY29tbV9vdXRidWYoc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyKQp7CiAgcmV0dXJuICgocHRyLT5vYnVmX3RhaWwgPiBwdHItPm9idWZfaGVhZCkgPyBwdHItPm9idWZfc2l6ZSA6IDApCiAgICArIHB0ci0+b2J1Zl9oZWFkIC0gcHRyLT5vYnVmX3RhaWw7Cn0KCnN0YXRpYyBpbnQgQ09NTV9XaGFja01vZGVtKGludCBmZCwgdW5zaWduZWQgaW50IGFuZHksIHVuc2lnbmVkIGludCBvcnJpZSkKewogICAgdW5zaWduZWQgaW50IG1zdGF0LCBva2F5OwogICAgb2theSA9IGlvY3RsKGZkLCBUSU9DTUdFVCwgJm1zdGF0KTsKICAgIGlmIChva2F5KSByZXR1cm4gb2theTsKICAgIGlmIChhbmR5KSBtc3RhdCAmPSBhbmR5OwogICAgbXN0YXQgfD0gb3JyaWU7CiAgICByZXR1cm4gaW9jdGwoZmQsIFRJT0NNU0VULCAmbXN0YXQpOwp9CgkKc3RhdGljIHZvaWQgQ0FMTEJBQ0sgY29tbV9ub3RpZmljYXRpb24oIFVMT05HX1BUUiBwcml2YXRlICkKewogIHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0ciA9IChzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICopcHJpdmF0ZTsKICBpbnQgcHJldiwgYmxlZnQsIGxlbjsKICBXT1JEIG1hc2sgPSAwOwogIGludCBjaWQgPSBHZXRDb21tUG9ydF9mZChwdHItPmZkKTsKCiAgVFJBQ0UoImFzeW5jIG5vdGlmaWNhdGlvblxuIik7CiAgLyogcmVhZCBkYXRhIGZyb20gY29tbSBwb3J0ICovCiAgcHJldiA9IGNvbW1faW5idWYocHRyKTsKICBkbyB7CiAgICBibGVmdCA9ICgocHRyLT5pYnVmX3RhaWwgPiBwdHItPmlidWZfaGVhZCkgPyAocHRyLT5pYnVmX3RhaWwtMSkgOiBwdHItPmlidWZfc2l6ZSkKICAgICAgLSBwdHItPmlidWZfaGVhZDsKICAgIGxlbiA9IHJlYWQocHRyLT5mZCwgcHRyLT5pbmJ1ZiArIHB0ci0+aWJ1Zl9oZWFkLCBibGVmdD9ibGVmdDoxKTsKICAgIGlmIChsZW4gPiAwKSB7CiAgICAgIGlmICghYmxlZnQpIHsKCXB0ci0+Y29tbWVycm9yID0gQ0VfUlhPVkVSOwogICAgICB9IGVsc2UgewoJLyogY2hlY2sgZm9yIGV2ZW50cyAqLwoJaWYgKChwdHItPmV2ZW50bWFzayAmIEVWX1JYRkxBRykgJiYKCSAgICBtZW1jaHIocHRyLT5pbmJ1ZiArIHB0ci0+aWJ1Zl9oZWFkLCBwdHItPmV2dGNoYXIsIGxlbikpIHsKCSAgKihXT1JEKikodW5rbm93bltjaWRdKSB8PSBFVl9SWEZMQUc7CgkgIG1hc2sgfD0gQ05fRVZFTlQ7Cgl9CglpZiAocHRyLT5ldmVudG1hc2sgJiBFVl9SWENIQVIpIHsKCSAgKihXT1JEKikodW5rbm93bltjaWRdKSB8PSBFVl9SWENIQVI7CgkgIG1hc2sgfD0gQ05fRVZFTlQ7Cgl9CgkvKiBhZHZhbmNlIGJ1ZmZlciBwb3NpdGlvbiAqLwoJcHRyLT5pYnVmX2hlYWQgKz0gbGVuOwoJaWYgKHB0ci0+aWJ1Zl9oZWFkID49IHB0ci0+aWJ1Zl9zaXplKQoJICBwdHItPmlidWZfaGVhZCA9IDA7CiAgICAgIH0KICAgIH0KICB9IHdoaWxlIChsZW4gPiAwKTsKICAvKiBjaGVjayBmb3Igbm90aWZpY2F0aW9uICovCiAgaWYgKHB0ci0+d25kICYmIChwdHItPm5fcmVhZD4wKSAmJiAocHJldjxwdHItPm5fcmVhZCkgJiYKICAgICAgKGNvbW1faW5idWYocHRyKT49cHRyLT5uX3JlYWQpKSB7CiAgICAvKiBwYXNzZWQgdGhlIHJlY2VpdmUgbm90aWZpY2F0aW9uIHRocmVzaG9sZCAqLwogICAgbWFzayB8PSBDTl9SRUNFSVZFOwogIH0KCiAgLyogd3JpdGUgYW55IFRyYW5zbWl0Q29tbUNoYXIgY2hhcmFjdGVyICovCiAgaWYgKHB0ci0+eG1pdD49MCkgewogICAgbGVuID0gd3JpdGUocHRyLT5mZCwgJihwdHItPnhtaXQpLCAxKTsKICAgIGlmIChsZW4gPiAwKSBwdHItPnhtaXQgPSAtMTsKICB9CiAgLyogd3JpdGUgZnJvbSBvdXRwdXQgcXVldWUgKi8KICBwcmV2ID0gY29tbV9vdXRidWYocHRyKTsKICBkbyB7CiAgICBibGVmdCA9ICgocHRyLT5vYnVmX3RhaWwgPD0gcHRyLT5vYnVmX2hlYWQpID8gcHRyLT5vYnVmX2hlYWQgOiBwdHItPm9idWZfc2l6ZSkKICAgICAgLSBwdHItPm9idWZfdGFpbDsKICAgIGxlbiA9IGJsZWZ0ID8gd3JpdGUocHRyLT5mZCwgcHRyLT5vdXRidWYgKyBwdHItPm9idWZfdGFpbCwgYmxlZnQpIDogMDsKICAgIGlmIChsZW4gPiAwKSB7CiAgICAgIHB0ci0+b2J1Zl90YWlsICs9IGxlbjsKICAgICAgaWYgKHB0ci0+b2J1Zl90YWlsID49IHB0ci0+b2J1Zl9zaXplKQoJcHRyLT5vYnVmX3RhaWwgPSAwOwogICAgICAvKiBmbGFnIGV2ZW50ICovCiAgICAgIGlmIChwdHItPm9idWZfdGFpbCA9PSBwdHItPm9idWZfaGVhZCkgewoJaWYgKHB0ci0+c193cml0ZSkgewoJICBTRVJWSUNFX0RlbGV0ZSggcHRyLT5zX3dyaXRlICk7CgkgIHB0ci0+c193cml0ZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOwoJfQogICAgICAgIGlmIChwdHItPmV2ZW50bWFzayAmIEVWX1RYRU1QVFkpIHsKCSAgKihXT1JEKikodW5rbm93bltjaWRdKSB8PSBFVl9UWEVNUFRZOwoJICBtYXNrIHw9IENOX0VWRU5UOwoJfQogICAgICB9CiAgICB9CiAgfSB3aGlsZSAobGVuID4gMCk7CiAgLyogY2hlY2sgZm9yIG5vdGlmaWNhdGlvbiAqLwogIGlmIChwdHItPnduZCAmJiAocHRyLT5uX3dyaXRlPjApICYmIChwcmV2Pj1wdHItPm5fd3JpdGUpICYmCiAgICAgIChjb21tX291dGJ1ZihwdHIpPHB0ci0+bl93cml0ZSkpIHsKICAgIC8qIHBhc3NlZCB0aGUgdHJhbnNtaXQgbm90aWZpY2F0aW9uIHRocmVzaG9sZCAqLwogICAgbWFzayB8PSBDTl9UUkFOU01JVDsKICB9CgogIC8qIHNlbmQgbm90aWZpY2F0aW9ucywgaWYgYW55ICovCiAgaWYgKHB0ci0+d25kICYmIG1hc2spIHsKICAgIFRSQUNFKCJub3RpZnlpbmcgJTA0eDogY2lkPSVkLCBtYXNrPSUwMnhcbiIsIHB0ci0+d25kLCBjaWQsIG1hc2spOwogICAgUG9zdE1lc3NhZ2UxNihwdHItPnduZCwgV01fQ09NTU5PVElGWSwgY2lkLCBtYXNrKTsKICB9Cn0KCnN0YXRpYyB2b2lkIGNvbW1fd2FpdHJlYWQoc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyKQp7CiAgaWYgKHB0ci0+c19yZWFkICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSByZXR1cm47CiAgcHRyLT5zX3JlYWQgPSBTRVJWSUNFX0FkZE9iamVjdCggRklMRV9EdXBVbml4SGFuZGxlKCBwdHItPmZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEIHwgU1lOQ0hST05JWkUgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbV9ub3RpZmljYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVTE9OR19QVFIpcHRyICk7Cn0KCnN0YXRpYyB2b2lkIGNvbW1fd2FpdHdyaXRlKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cikKewogIGlmIChwdHItPnNfd3JpdGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHJldHVybjsKICBwdHItPnNfd3JpdGUgPSBTRVJWSUNFX0FkZE9iamVjdCggRklMRV9EdXBVbml4SGFuZGxlKCBwdHItPmZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfV1JJVEUgfCBTWU5DSFJPTklaRSApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbV9ub3RpZmljYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUxPTkdfUFRSKXB0ciApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0IJCShVU0VSLjIxMykKICovCkJPT0wxNiBXSU5BUEkgQnVpbGRDb21tRENCMTYoTFBDU1RSIGRldmljZSwgTFBEQ0IxNiBscGRjYikKewoJLyogIkNPTTE6OTYwMCxuLDgsMSIJKi8KCS8qICAwMTIzNDUJCSovCglpbnQgcG9ydDsKCWNoYXIgKnB0ciwgdGVtcFsyNTZdOwoKCVRSQUNFKCIoJXMpLCBwdHIgJXBcbiIsIGRldmljZSwgbHBkY2IpOwoKCWlmICghbHN0cm5jbXBpQShkZXZpY2UsIkNPTSIsMykpIHsKCQlwb3J0ID0gZGV2aWNlWzNdIC0gJzAnOwoJCgoJCWlmIChwb3J0LS0gPT0gMCkgewoJCQlFUlIoIkJVRyAhIENPTTAgY2FuJ3QgZXhpc3QhLlxuIik7CgkJCXJldHVybiAtMTsKCQl9CgoJCWlmICghVmFsaWRDT01Qb3J0KHBvcnQpKSB7CgkJCXJldHVybiAtMTsKCQl9CgkJCgkJbWVtc2V0KGxwZGNiLCAwLCBzaXplb2YoRENCMTYpKTsgLyogaW5pdGlhbGl6ZSAqLwoKCQlscGRjYi0+SWQgPSBwb3J0OwoJCQoJCWlmICghKihkZXZpY2UrNCkpCgkJCXJldHVybiAwOwoKCQlpZiAoKihkZXZpY2UrNCkgIT0gJzonKQoJCQlyZXR1cm4gLTE7CgkJCgkJc3RyY3B5KHRlbXAsZGV2aWNlKzUpOwoJCXB0ciA9IHN0cnRvayh0ZW1wLCAiLCAiKTsgCgoJCWlmIChDT01bcG9ydF0uYmF1ZHJhdGUgPiAwKQoJCQlscGRjYi0+QmF1ZFJhdGUgPSBDT01bcG9ydF0uYmF1ZHJhdGU7CgkJZWxzZQoJCQlscGRjYi0+QmF1ZFJhdGUgPSBhdG9pKHB0cik7CiAgICAgICAgCVRSQUNFKCJiYXVkcmF0ZSAoJWQpXG4iLCBscGRjYi0+QmF1ZFJhdGUpOwoKCQlwdHIgPSBzdHJ0b2soTlVMTCwgIiwgIik7CgkJaWYgKGlzbG93ZXIoKnB0cikpCgkJCSpwdHIgPSB0b3VwcGVyKCpwdHIpOwoKICAgICAgICAJVFJBQ0UoInBhcml0eSAoJWMpXG4iLCAqcHRyKTsKCQlscGRjYi0+ZlBhcml0eSA9IFRSVUU7CgkJc3dpdGNoICgqcHRyKSB7CgkJCWNhc2UgJ04nOgoJCQkJbHBkY2ItPlBhcml0eSA9IE5PUEFSSVRZOwoJCQkJbHBkY2ItPmZQYXJpdHkgPSBGQUxTRTsKCQkJCWJyZWFrOwkJCQoJCQljYXNlICdFJzoKCQkJCWxwZGNiLT5QYXJpdHkgPSBFVkVOUEFSSVRZOwoJCQkJYnJlYWs7CQkJCgkJCWNhc2UgJ00nOgoJCQkJbHBkY2ItPlBhcml0eSA9IE1BUktQQVJJVFk7CgkJCQlicmVhazsJCQkKCQkJY2FzZSAnTyc6CgkJCQlscGRjYi0+UGFyaXR5ID0gT0REUEFSSVRZOwoJCQkJYnJlYWs7CQkJCgkJCWRlZmF1bHQ6CgkJCQlXQVJOKCJVbmtub3duIHBhcml0eSBgJWMnIVxuIiwgKnB0cik7CgkJCQlyZXR1cm4gLTE7CgkJfQoKCQlwdHIgPSBzdHJ0b2soTlVMTCwgIiwgIik7IAogICAgICAgICAJVFJBQ0UoImNoYXJzaXplICglYylcbiIsICpwdHIpOwoJCWxwZGNiLT5CeXRlU2l6ZSA9ICpwdHIgLSAnMCc7CgoJCXB0ciA9IHN0cnRvayhOVUxMLCAiLCAiKTsKICAgICAgICAJVFJBQ0UoInN0b3BiaXRzICglYylcbiIsICpwdHIpOwoJCXN3aXRjaCAoKnB0cikgewoJCQljYXNlICcxJzoKCQkJCWxwZGNiLT5TdG9wQml0cyA9IE9ORVNUT1BCSVQ7CgkJCQlicmVhazsJCQkKCQkJY2FzZSAnMic6CgkJCQlscGRjYi0+U3RvcEJpdHMgPSBUV09TVE9QQklUUzsKCQkJCWJyZWFrOwkJCQoJCQlkZWZhdWx0OgoJCQkJV0FSTigiVW5rbm93biAjIG9mIHN0b3BiaXRzIGAlYychXG4iLCAqcHRyKTsKCQkJCXJldHVybiAtMTsKCQl9Cgl9CQoKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJT3BlbkNvbW0JCShVU0VSLjIwMCkKICovCklOVDE2IFdJTkFQSSBPcGVuQ29tbTE2KExQQ1NUUiBkZXZpY2UsVUlOVDE2IGNiSW5RdWV1ZSxVSU5UMTYgY2JPdXRRdWV1ZSkKewoJaW50IHBvcnQsZmQ7CgogICAgCVRSQUNFKCIlcywgJWQsICVkXG4iLCBkZXZpY2UsIGNiSW5RdWV1ZSwgY2JPdXRRdWV1ZSk7CgoJaWYgKHN0cmxlbihkZXZpY2UpIDwgNCkKCSAgIHJldHVybiBJRV9CQURJRDsKCglwb3J0ID0gZGV2aWNlWzNdIC0gJzAnOwoKCWlmIChwb3J0LS0gPT0gMCkKCQlFUlIoIkJVRyAhIENPTTAgb3IgTFBUMCBkb24ndCBleGlzdCAhXG4iKTsKCglpZiAoIWxzdHJuY21waUEoZGV2aWNlLCJDT00iLDMpKSB7CgkJCiAgICAgICAgICAgICAgICBUUkFDRSgiJXMgPSAlc1xuIiwgZGV2aWNlLCBDT01bcG9ydF0uZGV2aWNlbmFtZSk7CgoJCWlmICghVmFsaWRDT01Qb3J0KHBvcnQpKQoJCQlyZXR1cm4gSUVfQkFESUQ7CgoJCWlmIChDT01bcG9ydF0uZmQpCgkJCXJldHVybiBJRV9PUEVOOwoKCQlmZCA9IG9wZW4oQ09NW3BvcnRdLmRldmljZW5hbWUsIE9fUkRXUiB8IE9fTk9OQkxPQ0spOwoJCWlmIChmZCA9PSAtMSkgewoJCQlFUlIoImVycm9yPSVkXG4iLCBlcnJubyk7CgkJCXJldHVybiBJRV9IQVJEV0FSRTsKCQl9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duW3BvcnRdID0gU0VHUFRSX0FMTE9DKDQwKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnplcm8odW5rbm93bltwb3J0XSw0MCk7CgkJCUNPTVtwb3J0XS5mZCA9IGZkOwoJCQlDT01bcG9ydF0uY29tbWVycm9yID0gMDsKCQkJQ09NW3BvcnRdLmV2ZW50bWFzayA9IDA7CgkJCUNPTVtwb3J0XS5ldnRjaGFyID0gMDsgLyogRklYTUU6IGRlZmF1bHQ/ICovCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgdGVybWluYWwgc3RhdGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgdGNnZXRhdHRyKGZkLCZtX3N0YXRbcG9ydF0pOwogICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgZGVmYXVsdCBwYXJhbWV0ZXJzICovCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKENPTVtwb3J0XS5iYXVkcmF0ZT4tMSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ0IxNiBkY2I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDb21tU3RhdGUxNihwb3J0LCAmZGNiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjYi5CYXVkUmF0ZT1DT01bcG9ydF0uYmF1ZHJhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3JlIGRlZmF1bHRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGF0YWJpdHMsIHBhcml0eSwgc3RvcGJpdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0Q29tbVN0YXRlMTYoICZkY2IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgkJCS8qIGluaXQgcHJpb3JpdHkgY2hhcmFjdGVycyAqLwoJCQlDT01bcG9ydF0udW5nZXQgPSAtMTsKCQkJQ09NW3BvcnRdLnhtaXQgPSAtMTsKCQkJLyogYWxsb2NhdGUgYnVmZmVycyAqLwoJCQlDT01bcG9ydF0uaWJ1Zl9zaXplID0gY2JJblF1ZXVlOwoJCQlDT01bcG9ydF0uaWJ1Zl9oZWFkID0gQ09NW3BvcnRdLmlidWZfdGFpbD0gMDsKCQkJQ09NW3BvcnRdLm9idWZfc2l6ZSA9IGNiT3V0UXVldWU7CgkJCUNPTVtwb3J0XS5vYnVmX2hlYWQgPSBDT01bcG9ydF0ub2J1Zl90YWlsID0gMDsKCgkJCUNPTVtwb3J0XS5pbmJ1ZiA9IG1hbGxvYyhjYkluUXVldWUpOwoJCQlpZiAoQ09NW3BvcnRdLmluYnVmKSB7CgkJCSAgQ09NW3BvcnRdLm91dGJ1ZiA9IG1hbGxvYyhjYk91dFF1ZXVlKTsKCQkJICBpZiAoIUNPTVtwb3J0XS5vdXRidWYpCgkJCSAgICBmcmVlKENPTVtwb3J0XS5pbmJ1Zik7CgkJCX0gZWxzZSBDT01bcG9ydF0ub3V0YnVmID0gTlVMTDsKCQkJaWYgKCFDT01bcG9ydF0ub3V0YnVmKSB7CgkJCSAgLyogbm90IGVub3VnaCBtZW1vcnkgKi8KCQkJICB0Y3NldGF0dHIoQ09NW3BvcnRdLmZkLFRDU0FOT1csJm1fc3RhdFtwb3J0XSk7CgkJCSAgY2xvc2UoQ09NW3BvcnRdLmZkKTsKCQkJICBFUlIoIm91dCBvZiBtZW1vcnkiKTsKCQkJICByZXR1cm4gSUVfTUVNT1JZOwoJCQl9CgogICAgICAgICAgICAgICAgICAgICAgICBDT01bcG9ydF0uc19yZWFkID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgICAgIENPTVtwb3J0XS5zX3dyaXRlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1fd2FpdHJlYWQoICZDT01bcG9ydF0gKTsKCQkJcmV0dXJuIHBvcnQ7CgkJfQoJfSAKCWVsc2UgCglpZiAoIWxzdHJuY21waUEoZGV2aWNlLCJMUFQiLDMpKSB7CgkKCQlpZiAoIVZhbGlkTFBUUG9ydChwb3J0KSkKCQkJcmV0dXJuIElFX0JBRElEOwoKCQlpZiAoTFBUW3BvcnRdLmZkKQoJCQlyZXR1cm4gSUVfT1BFTjsKCgkJZmQgPSBvcGVuKExQVFtwb3J0XS5kZXZpY2VuYW1lLCBPX1JEV1IgfCBPX05PTkJMT0NLLCAwKTsKCQlpZiAoZmQgPT0gLTEpIHsKCQkJcmV0dXJuIElFX0hBUkRXQVJFOwoJCX0gZWxzZSB7CgkJCUxQVFtwb3J0XS5mZCA9IGZkOwoJCQlMUFRbcG9ydF0uY29tbWVycm9yID0gMDsKCQkJTFBUW3BvcnRdLmV2ZW50bWFzayA9IDA7CgkJCXJldHVybiBwb3J0fEZMQUdfTFBUOwoJCX0KCX0KCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ2xvc2VDb21tCQkoVVNFUi4yMDcpCiAqLwpJTlQxNiBXSU5BUEkgQ2xvc2VDb21tMTYoSU5UMTYgY2lkKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CiAgICAgICAgCiAgICAJVFJBQ0UoImNpZD0lZFxuIiwgY2lkKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlyZXR1cm4gLTE7Cgl9CglpZiAoIShjaWQmRkxBR19MUFQpKSB7CgkJLyogQ09NIHBvcnQgKi8KCQlTRUdQVFJfRlJFRSh1bmtub3duW2NpZF0pOyAvKiBbTFddICovCgoJCVNFUlZJQ0VfRGVsZXRlKCBDT01bY2lkXS5zX3dyaXRlICk7CgkJU0VSVklDRV9EZWxldGUoIENPTVtjaWRdLnNfcmVhZCApOwoJCS8qIGZyZWUgYnVmZmVycyAqLwoJCWZyZWUocHRyLT5vdXRidWYpOwoJCWZyZWUocHRyLT5pbmJ1Zik7CgoJCS8qIHJlc2V0IG1vZGVtIGxpbmVzICovCgkJdGNzZXRhdHRyKHB0ci0+ZmQsVENTQU5PVywmbV9zdGF0W2NpZF0pOwoJfQoKCWlmIChjbG9zZShwdHItPmZkKSA9PSAtMSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsKCQkvKiBGSVhNRTogc2hvdWxkIHdlIGNsZWFyIHB0ci0+ZmQgaGVyZT8gKi8KCQlyZXR1cm4gLTE7Cgl9IGVsc2UgewoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlwdHItPmZkID0gMDsKCQlyZXR1cm4gMDsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1CcmVhawkJKFVTRVIuMjEwKQogKi8KSU5UMTYgV0lOQVBJIFNldENvbW1CcmVhazE2KElOVDE2IGNpZCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKCVRSQUNFKCJjaWQ9JWRcbiIsIGNpZCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJcmV0dXJuIC0xOwoJfQoKCXB0ci0+c3VzcGVuZGVkID0gMTsKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ2xlYXJDb21tQnJlYWsJCShVU0VSLjIxMSkKICovCklOVDE2IFdJTkFQSSBDbGVhckNvbW1CcmVhazE2KElOVDE2IGNpZCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkPSVkXG4iLCBjaWQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCXJldHVybiAtMTsKCX0KCglwdHItPnN1c3BlbmRlZCA9IDA7CglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUVzY2FwZUNvbW1GdW5jdGlvbgkoVVNFUi4yMTQpCiAqLwpMT05HIFdJTkFQSSBFc2NhcGVDb21tRnVuY3Rpb24xNihVSU5UMTYgY2lkLFVJTlQxNiBuRnVuY3Rpb24pCnsKCWludAltYXg7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CglzdHJ1Y3QgdGVybWlvcyBwb3J0OwoKICAgIAlUUkFDRSgiY2lkPSVkLCBmdW5jdGlvbj0lZFxuIiwgY2lkLCBuRnVuY3Rpb24pOwoJaWYgKChuRnVuY3Rpb24gIT0gR0VUTUFYQ09NKSAmJiAobkZ1bmN0aW9uICE9IEdFVE1BWExQVCkpIHsKCQlpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJICAgICAgICBUUkFDRSgiR2V0RGV2aWNlU3RydWN0IGZhaWxlZFxuIik7CgkJCXJldHVybiAtMTsKCQl9CgkJaWYgKHRjZ2V0YXR0cihwdHItPmZkLCZwb3J0KSA9PSAtMSkgewoJCSAgICAgICAgVFJBQ0UoInRjZ2V0YXR0ciBmYWlsZWRcbiIpOwoJCQlwdHItPmNvbW1lcnJvcj1XaW5FcnJvcigpOwkKCQkJcmV0dXJuIC0xOwoJCX0KCX0gZWxzZSBwdHIgPSBOVUxMOwoKCXN3aXRjaCAobkZ1bmN0aW9uKSB7CgkJY2FzZSBSRVNFVERFVjoKCQkgICAgICAgIFRSQUNFKCJSRVNFVERFVlxuIik7CgkJCWJyZWFrOwkJCQkJCgoJCWNhc2UgR0VUTUFYQ09NOgoJCSAgICAgICAgVFJBQ0UoIkdFVE1BWENPTVxuIik7IAoJCQlmb3IgKG1heCA9IE1BWF9QT1JUUzshQ09NW21heF0uZGV2aWNlbmFtZTttYXgtLSkKCQkJCTsKCQkJcmV0dXJuIG1heDsKCQkJYnJlYWs7CgoJCWNhc2UgR0VUTUFYTFBUOgoJCSAgICAgICAgVFJBQ0UoIkdFVE1BWExQVFxuIik7IAoJCQlmb3IgKG1heCA9IE1BWF9QT1JUUzshTFBUW21heF0uZGV2aWNlbmFtZTttYXgtLSkKCQkJCTsKCQkJcmV0dXJuIEZMQUdfTFBUICsgbWF4OwoJCQlicmVhazsKCgkJY2FzZSBHRVRCQVNFSVJROgoJCSAgICAgICAgVFJBQ0UoIkdFVEJBU0VJUlFcbiIpOyAKCQkJLyogRklYTUU6IHVzZSB0YWJsZXMgKi8KCQkJLyoganVzdCBmYWtlIHNvbWV0aGluZyBmb3Igbm93ICovCgkJCWlmIChjaWQgJiBGTEFHX0xQVCkgewoJCQkJLyogTFBUMTogaXJxIDcsIExQVDI6IGlycSA1ICovCgkJCQlyZXR1cm4gKGNpZCAmIDB4N2YpID8gNSA6IDc7CgkJCX0gZWxzZSB7CgkJCQkvKiBDT00xOiBpcnEgNCwgQ09NMjogaXJxIDMsCgkJCQkgICBDT00zOiBpcnEgNCwgQ09NNDogaXJxIDMgKi8KCQkJCXJldHVybiA0IC0gKGNpZCAmIDEpOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIENMUkRUUjoKCQkgICAgICAgIFRSQUNFKCJDTFJEVFJcbiIpOyAKI2lmZGVmIFRJT0NNX0RUUgoJCQlyZXR1cm4gQ09NTV9XaGFja01vZGVtKHB0ci0+ZmQsIH5USU9DTV9EVFIsIDApOwojZW5kaWYKCQljYXNlIENMUlJUUzoKCQkgICAgICAgIFRSQUNFKCJDTFJSVFNcbiIpOyAKI2lmZGVmIFRJT0NNX1JUUwoJCQlyZXR1cm4gQ09NTV9XaGFja01vZGVtKHB0ci0+ZmQsIH5USU9DTV9SVFMsIDApOwojZW5kaWYKCQoJCWNhc2UgU0VURFRSOgoJCSAgICAgICAgVFJBQ0UoIlNFVERUUlxuIik7IAojaWZkZWYgVElPQ01fRFRSCgkJCXJldHVybiBDT01NX1doYWNrTW9kZW0ocHRyLT5mZCwgMCwgVElPQ01fRFRSKTsKI2VuZGlmCgoJCWNhc2UgU0VUUlRTOgoJCSAgICAgICAgVFJBQ0UoIlNFVFJUU1xuIik7IAojaWZkZWYgVElPQ01fUlRTCQkJCgkJCXJldHVybiBDT01NX1doYWNrTW9kZW0ocHRyLT5mZCwgMCwgVElPQ01fUlRTKTsKI2VuZGlmCgoJCWNhc2UgU0VUWE9GRjoKCQkgICAgICAgIFRSQUNFKCJTRVRYT0ZGXG4iKTsgCgkJCXBvcnQuY19pZmxhZyB8PSBJWE9GRjsKCQkJYnJlYWs7CgoJCWNhc2UgU0VUWE9OOgoJCSAgICAgICAgVFJBQ0UoIlNFVFhPTlxuIik7IAoJCQlwb3J0LmNfaWZsYWcgfD0gSVhPTjsKCQkJYnJlYWs7CgoJCWRlZmF1bHQ6CgkJCVdBUk4oIihjaWQ9JWQsbkZ1bmN0aW9uPSVkKTogVW5rbm93biBmdW5jdGlvblxuIiwgCgkJCWNpZCwgbkZ1bmN0aW9uKTsKCQkJYnJlYWs7CQkJCQoJfQoJCglpZiAodGNzZXRhdHRyKHB0ci0+ZmQsIFRDU0FEUkFJTiwgJnBvcnQpID09IC0xKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCXJldHVybiAtMTsJCgl9IGVsc2UgewoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlyZXR1cm4gMDsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUZsdXNoQ29tbQkoVVNFUi4yMTUpCiAqLwpJTlQxNiBXSU5BUEkgRmx1c2hDb21tMTYoSU5UMTYgY2lkLElOVDE2IGZuUXVldWUpCnsKCWludCBxdWV1ZTsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZD0lZCwgcXVldWU9JWRcbiIsIGNpZCwgZm5RdWV1ZSk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJcmV0dXJuIC0xOwoJfQoJc3dpdGNoIChmblF1ZXVlKSB7CgkJY2FzZSAwOgoJCSAgcXVldWUgPSBUQ09GTFVTSDsKCQkgIHB0ci0+b2J1Zl90YWlsID0gcHRyLT5vYnVmX2hlYWQ7CgkJICBicmVhazsKCQljYXNlIDE6CgkJICBxdWV1ZSA9IFRDSUZMVVNIOwoJCSAgcHRyLT5pYnVmX2hlYWQgPSBwdHItPmlidWZfdGFpbDsKCQkgIGJyZWFrOwoJCWRlZmF1bHQ6CgkJICBXQVJOKCIoY2lkPSVkLGZuUXVldWU9JWQpOlVua25vd24gcXVldWVcbiIsIAoJCSAgICAgICAgICAgIGNpZCwgZm5RdWV1ZSk7CgkJICByZXR1cm4gLTE7CgkJfQoJaWYgKHRjZmx1c2gocHRyLT5mZCwgcXVldWUpKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCXJldHVybiAtMTsJCgl9IGVsc2UgewoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlyZXR1cm4gMDsKCX0KfSAgCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbUVycm9yCShVU0VSLjIwMykKICovCklOVDE2IFdJTkFQSSBHZXRDb21tRXJyb3IxNihJTlQxNiBjaWQsTFBDT01TVEFUMTYgbHBTdGF0KQp7CglpbnQJCXRlbXBlcnJvcjsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKICAgICAgICB1bnNpZ25lZCBjaGFyICpzdG9sOwogICAgICAgIHVuc2lnbmVkIGludCBtc3RhdDsKCglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJcmV0dXJuIC0xOwoJfQogICAgICAgIGlmIChjaWQmRkxBR19MUFQpIHsKICAgICAgICAgICAgV0FSTigiIGNpZCAlZCBub3QgY29tbSBwb3J0XG4iLGNpZCk7CiAgICAgICAgICAgIHJldHVybiBDRV9NT0RFOwogICAgICAgIH0KICAgICAgICBzdG9sID0gKHVuc2lnbmVkIGNoYXIgKil1bmtub3duW2NpZF0gKyBDT01NX01TUl9PRkZTRVQ7CiAgICAgICAgaW9jdGwocHRyLT5mZCxUSU9DTUdFVCwmbXN0YXQpOwogICAgICAgIGlmKCBtc3RhdCZUSU9DTV9DQVIgKSAKICAgICAgICAgICAgKnN0b2wgfD0gMHg4MDsKICAgICAgICBlbHNlIAogICAgICAgICAgICAqc3RvbCAmPTB4N2Y7CgoJaWYgKGxwU3RhdCkgewoJCWxwU3RhdC0+c3RhdHVzID0gMDsKCgkJbHBTdGF0LT5jYk91dFF1ZSA9IGNvbW1fb3V0YnVmKHB0cik7CgkJbHBTdGF0LT5jYkluUXVlID0gY29tbV9pbmJ1ZihwdHIpOwoKICAgIAkJVFJBQ0UoImNpZCAlZCwgZXJyb3IgJWQsIGxwU3RhdCAlZCAlZCAlZCBzdG9sICV4XG4iLAoJCQkgICAgIGNpZCwgcHRyLT5jb21tZXJyb3IsIGxwU3RhdC0+c3RhdHVzLCBscFN0YXQtPmNiSW5RdWUsIAoJCQkgICAgIGxwU3RhdC0+Y2JPdXRRdWUsICpzdG9sKTsKCX0KCWVsc2UKCQlUUkFDRSgiY2lkICVkLCBlcnJvciAlZCwgbHBTdGF0IE5VTEwgc3RvbCAleFxuIiwKCQkJICAgICBjaWQsIHB0ci0+Y29tbWVycm9yLCAqc3RvbCk7CgoJLyogUmV0dXJuIGFueSBlcnJvcnMgYW5kIGNsZWFyIGl0ICovCgl0ZW1wZXJyb3IgPSBwdHItPmNvbW1lcnJvcjsKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybih0ZW1wZXJyb3IpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbUV2ZW50TWFzawkoVVNFUi4yMDgpCiAqLwpTRUdQVFIgV0lOQVBJIFNldENvbW1FdmVudE1hc2sxNihJTlQxNiBjaWQsVUlOVDE2IGZ1RXZ0TWFzaykKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogICAgICAgIHVuc2lnbmVkIGNoYXIgKnN0b2w7CiAgICAgICAgaW50IHJlcGlkOwogICAgICAgIHVuc2lnbmVkIGludCBtc3RhdDsKCiAgICAJVFJBQ0UoImNpZCAlZCxtYXNrICVkXG4iLGNpZCxmdUV2dE1hc2spOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkKCSAgICByZXR1cm4gKFNFR1BUUilOVUxMOwoKCXB0ci0+ZXZlbnRtYXNrID0gZnVFdnRNYXNrOwoKICAgICAgICBpZiAoKGNpZCZGTEFHX0xQVCkgfHwgIVZhbGlkQ09NUG9ydChjaWQpKSB7CiAgICAgICAgICAgIFdBUk4oIiBjaWQgJWQgbm90IGNvbW0gcG9ydFxuIixjaWQpOwogICAgICAgICAgICByZXR1cm4gKFNFR1BUUilOVUxMOwogICAgICAgIH0KICAgICAgICAvKiBpdCdzIGEgQ09NIHBvcnQgPyAtPiBtb2RpZnkgZmxhZ3MgKi8KICAgICAgICBzdG9sID0gKHVuc2lnbmVkIGNoYXIgKil1bmtub3duW2NpZF0gKyBDT01NX01TUl9PRkZTRVQ7CglyZXBpZCA9IGlvY3RsKHB0ci0+ZmQsVElPQ01HRVQsJm1zdGF0KTsKCVRSQUNFKCIgaW9jdGwgICVkLCBtc3IgJXggYXQgJXAgJXBcbiIscmVwaWQsbXN0YXQsc3RvbCx1bmtub3duW2NpZF0pOwoJaWYgKChtc3RhdCZUSU9DTV9DQVIpKQoJICAgICpzdG9sIHw9IDB4ODA7CgllbHNlCgkgICAgKnN0b2wgJj0weDdmOwoKCVRSQUNFKCIgbW9kZW0gZGNkIGNvbnN0cnVjdCAleFxuIiwqc3RvbCk7CglyZXR1cm4gU0VHUFRSX0dFVCh1bmtub3duW2NpZF0pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbUV2ZW50TWFzawkoVVNFUi4yMDkpCiAqLwpVSU5UMTYgV0lOQVBJIEdldENvbW1FdmVudE1hc2sxNihJTlQxNiBjaWQsVUlOVDE2IGZuRXZ0Q2xlYXIpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCVdPUkQgZXZlbnRzOwoKICAgIAlUUkFDRSgiY2lkICVkLCBtYXNrICVkXG4iLCBjaWQsIGZuRXZ0Q2xlYXIpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkKCSAgICByZXR1cm4gMDsKCiAgICAgICAgaWYgKChjaWQmRkxBR19MUFQpIHx8ICFWYWxpZENPTVBvcnQoY2lkKSkgewogICAgICAgICAgICBXQVJOKCIgY2lkICVkIG5vdCBjb21tIHBvcnRcbiIsY2lkKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQoKCWV2ZW50cyA9ICooV09SRCopKHVua25vd25bY2lkXSkgJiBmbkV2dENsZWFyOwoJKihXT1JEKikodW5rbm93bltjaWRdKSAmPSB+Zm5FdnRDbGVhcjsKCXJldHVybiBldmVudHM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tU3RhdGUxNgkoVVNFUi4yMDEpCiAqLwpJTlQxNiBXSU5BUEkgU2V0Q29tbVN0YXRlMTYoTFBEQ0IxNiBscGRjYikKewoJc3RydWN0IHRlcm1pb3MgcG9ydDsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZCAlZCwgcHRyICVwXG4iLCBscGRjYi0+SWQsIGxwZGNiKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGxwZGNiLT5JZCkpID09IE5VTEwpIHsKCQlyZXR1cm4gLTE7Cgl9CglpZiAodGNnZXRhdHRyKHB0ci0+ZmQsICZwb3J0KSA9PSAtMSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsJCgkJcmV0dXJuIC0xOwoJfQoKCXBvcnQuY19jY1tWTUlOXSA9IDA7Cglwb3J0LmNfY2NbVlRJTUVdID0gMTsKCiNpZmRlZiBJTUFYQkVMCglwb3J0LmNfaWZsYWcgJj0gfihJU1RSSVB8QlJLSU5UfElHTkNSfElDUk5MfElOTENSfElNQVhCRUwpOwojZWxzZQoJcG9ydC5jX2lmbGFnICY9IH4oSVNUUklQfEJSS0lOVHxJR05DUnxJQ1JOTHxJTkxDUik7CiNlbmRpZgoJcG9ydC5jX2lmbGFnIHw9IChJR05CUkspOwoKCXBvcnQuY19vZmxhZyAmPSB+KE9QT1NUKTsKCglwb3J0LmNfY2ZsYWcgJj0gfihIVVBDTCk7Cglwb3J0LmNfY2ZsYWcgfD0gQ0xPQ0FMIHwgQ1JFQUQ7CgoJcG9ydC5jX2xmbGFnICY9IH4oSUNBTk9OfEVDSE98SVNJRyk7Cglwb3J0LmNfbGZsYWcgfD0gTk9GTFNIOwoKICAgIAlUUkFDRSgiYmF1ZHJhdGUgJWRcbiIsbHBkY2ItPkJhdWRSYXRlKTsKI2lmZGVmIENCQVVECglwb3J0LmNfY2ZsYWcgJj0gfkNCQVVEOwoJc3dpdGNoIChscGRjYi0+QmF1ZFJhdGUpIHsKCQljYXNlIDExMDoKCQljYXNlIENCUl8xMTA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTEwOwoJCQlicmVhazsJCQoJCWNhc2UgMzAwOgoJCWNhc2UgQ0JSXzMwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIzMDA7CgkJCWJyZWFrOwkJCgkJY2FzZSA2MDA6CgkJY2FzZSBDQlJfNjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjYwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDEyMDA6CgkJY2FzZSBDQlJfMTIwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMjQwMDoKCQljYXNlIENCUl8yNDAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjI0MDA7CgkJCWJyZWFrOwkJCgkJY2FzZSA0ODAwOgoJCWNhc2UgQ0JSXzQ4MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNDgwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDk2MDA6CgkJY2FzZSBDQlJfOTYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI5NjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMTkyMDA6CgkJY2FzZSBDQlJfMTkyMDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTkyMDA7CgkJCWJyZWFrOwkJCgkJY2FzZSAzODQwMDoKCQljYXNlIENCUl8zODQwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIzODQwMDsKCQkJYnJlYWs7CQkKI2lmZGVmIEI1NzYwMAoJCWNhc2UgNTc2MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNTc2MDA7CgkJCWJyZWFrOwkJCiNlbmRpZgojaWZkZWYgQjExNTIwMAoJCWNhc2UgNTc2MDE6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTE1MjAwOwoJCQlicmVhazsJCQojZW5kaWYKCQlkZWZhdWx0OgoJCQlwdHItPmNvbW1lcnJvciA9IElFX0JBVURSQVRFOwoJCQlyZXR1cm4gLTE7Cgl9CiNlbGlmICFkZWZpbmVkKF9fRU1YX18pCiAgICAgICAgc3dpdGNoIChscGRjYi0+QmF1ZFJhdGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgMTEwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTEwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjExMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDMwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzMwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIzMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA2MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl82MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCNjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTIwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzEyMDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTIwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDI0MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8yNDAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjI0MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0ODAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfNDgwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI0ODAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgOTYwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzk2MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCOTYwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDE5MjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTkyMDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTkyMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAzODQwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzM4NDAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjM4NDAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+Y29tbWVycm9yID0gSUVfQkFVRFJBVEU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgcG9ydC5jX2lzcGVlZCA9IHBvcnQuY19vc3BlZWQ7CiNlbmRpZgogICAgCVRSQUNFKCJieXRlc2l6ZSAlZFxuIixscGRjYi0+Qnl0ZVNpemUpOwoJcG9ydC5jX2NmbGFnICY9IH5DU0laRTsKCXN3aXRjaCAobHBkY2ItPkJ5dGVTaXplKSB7CgkJY2FzZSA1OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M1OwoJCQlicmVhazsKCQljYXNlIDY6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzY7CgkJCWJyZWFrOwoJCWNhc2UgNzoKCQkJcG9ydC5jX2NmbGFnIHw9IENTNzsKCQkJYnJlYWs7CgkJY2FzZSA4OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M4OwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlwdHItPmNvbW1lcnJvciA9IElFX0JZVEVTSVpFOwoJCQlyZXR1cm4gLTE7Cgl9CgogICAgCVRSQUNFKCJmUGFyaXR5ICVkIFBhcml0eSAlZFxuIixscGRjYi0+ZlBhcml0eSwgbHBkY2ItPlBhcml0eSk7Cglwb3J0LmNfY2ZsYWcgJj0gfihQQVJFTkIgfCBQQVJPREQpOwoJaWYgKGxwZGNiLT5mUGFyaXR5KQogICAgICAgICAgICBwb3J0LmNfaWZsYWcgfD0gSU5QQ0s7CiAgICAgICAgZWxzZQogICAgICAgICAgICBwb3J0LmNfaWZsYWcgJj0gfklOUENLOwogICAgICAgIHN3aXRjaCAobHBkY2ItPlBhcml0eSkgewogICAgICAgICAgICAgICAgY2FzZSBOT1BBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIE9ERFBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IChQQVJFTkIgfCBQQVJPREQpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgRVZFTlBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IFBBUkVOQjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICBwdHItPmNvbW1lcnJvciA9IElFX0JZVEVTSVpFOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQoJCgogICAgCVRSQUNFKCJzdG9wYml0cyAlZFxuIixscGRjYi0+U3RvcEJpdHMpOwoKCXN3aXRjaCAobHBkY2ItPlN0b3BCaXRzKSB7CgkJY2FzZSBPTkVTVE9QQklUOgoJCQkJcG9ydC5jX2NmbGFnICY9IH5DU1RPUEI7CgkJCQlicmVhazsKCQljYXNlIFRXT1NUT1BCSVRTOgoJCQkJcG9ydC5jX2NmbGFnIHw9IENTVE9QQjsKCQkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXB0ci0+Y29tbWVycm9yID0gSUVfQllURVNJWkU7CgkJCXJldHVybiAtMTsKCX0KI2lmZGVmIENSVFNDVFMKCglpZiAobHBkY2ItPmZEdHJmbG93IHx8IGxwZGNiLT5mUnRzZmxvdyB8fCBscGRjYi0+Zk91dHhDdHNGbG93KQoJCXBvcnQuY19jZmxhZyB8PSBDUlRTQ1RTOwoKCWlmIChscGRjYi0+ZkR0ckRpc2FibGUpIAoJCXBvcnQuY19jZmxhZyAmPSB+Q1JUU0NUUzsKI2VuZGlmCQoJaWYgKGxwZGNiLT5mSW5YKQoJCXBvcnQuY19pZmxhZyB8PSBJWE9OOwoJZWxzZQoJCXBvcnQuY19pZmxhZyAmPSB+SVhPTjsKCWlmIChscGRjYi0+Zk91dFgpCgkJcG9ydC5jX2lmbGFnIHw9IElYT0ZGOwoJZWxzZQoJCXBvcnQuY19pZmxhZyAmPSB+SVhPRkY7CgoJcHRyLT5ldnRjaGFyID0gbHBkY2ItPkV2dENoYXI7CgoJaWYgKHRjc2V0YXR0cihwdHItPmZkLCBUQ1NBRFJBSU4sICZwb3J0KSA9PSAtMSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsJCgkJcmV0dXJuIEZBTFNFOwoJfSBlbHNlIHsKCQlwdHItPmNvbW1lcnJvciA9IDA7CgkJcmV0dXJuIDA7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tU3RhdGUJKFVTRVIuMjAyKQogKi8KSU5UMTYgV0lOQVBJIEdldENvbW1TdGF0ZTE2KElOVDE2IGNpZCwgTFBEQ0IxNiBscGRjYikKewoJaW50IHNwZWVkOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJc3RydWN0IHRlcm1pb3MgcG9ydDsKCiAgICAJVFJBQ0UoImNpZCAlZCwgcHRyICVwXG4iLCBjaWQsIGxwZGNiKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlyZXR1cm4gLTE7Cgl9CglpZiAodGNnZXRhdHRyKHB0ci0+ZmQsICZwb3J0KSA9PSAtMSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsJCgkJcmV0dXJuIC0xOwoJfQoJbHBkY2ItPklkID0gY2lkOwojaWZuZGVmIF9fRU1YX18KI2lmZGVmIENCQVVECiAgICAgICAgc3BlZWQgPSBwb3J0LmNfY2ZsYWcgJiBDQkFVRDsKI2Vsc2UKICAgICAgICBzcGVlZCA9IHBvcnQuY19vc3BlZWQ7CiNlbmRpZgogICAgICAgIHN3aXRjaChzcGVlZCkgewoJCWNhc2UgQjExMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTEwOwoJCQlicmVhazsKCQljYXNlIEIzMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDMwMDsKCQkJYnJlYWs7CgkJY2FzZSBCNjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA2MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjEyMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDEyMDA7CgkJCWJyZWFrOwoJCWNhc2UgQjI0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDI0MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjQ4MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDQ4MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjk2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDk2MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjE5MjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxOTIwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMzg0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDM4NDAwOwoJCQlicmVhazsKI2lmZGVmIEI1NzYwMAoJCWNhc2UgQjU3NjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA1NzYwMDsKCQkJYnJlYWs7CiNlbmRpZgojaWZkZWYgQjExNTIwMAoJCWNhc2UgQjExNTIwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gNTc2MDE7CgkJCWJyZWFrOwojZW5kaWYKCX0KI2VuZGlmCglzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIENTSVpFKSB7CgkJY2FzZSBDUzU6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDU7CgkJCWJyZWFrOwoJCWNhc2UgQ1M2OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA2OwoJCQlicmVhazsKCQljYXNlIENTNzoKCQkJbHBkY2ItPkJ5dGVTaXplID0gNzsKCQkJYnJlYWs7CgkJY2FzZSBDUzg6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDg7CgkJCWJyZWFrOwoJfQkKCQogICAgICAgIGlmKHBvcnQuY19pZmxhZyAmIElOUENLKQogICAgICAgICAgICBscGRjYi0+ZlBhcml0eSA9IFRSVUU7CiAgICAgICAgZWxzZQogICAgICAgICAgICBscGRjYi0+ZlBhcml0eSA9IEZBTFNFOwoJc3dpdGNoIChwb3J0LmNfY2ZsYWcgJiAoUEFSRU5CIHwgUEFST0REKSkgewoJCWNhc2UgMDoKCQkJbHBkY2ItPlBhcml0eSA9IE5PUEFSSVRZOwoJCQlicmVhazsKCQljYXNlIFBBUkVOQjoKCQkJbHBkY2ItPlBhcml0eSA9IEVWRU5QQVJJVFk7CgkJCWJyZWFrOwoJCWNhc2UgKFBBUkVOQiB8IFBBUk9ERCk6CgkJCWxwZGNiLT5QYXJpdHkgPSBPRERQQVJJVFk7CQkKCQkJYnJlYWs7Cgl9CgoJaWYgKHBvcnQuY19jZmxhZyAmIENTVE9QQikKCQlscGRjYi0+U3RvcEJpdHMgPSBUV09TVE9QQklUUzsKCWVsc2UKCQlscGRjYi0+U3RvcEJpdHMgPSBPTkVTVE9QQklUOwoKCWxwZGNiLT5SbHNUaW1lb3V0ID0gNTA7CglscGRjYi0+Q3RzVGltZW91dCA9IDUwOyAKCWxwZGNiLT5Ec3JUaW1lb3V0ID0gNTA7CglscGRjYi0+Zk51bGwgPSAwOwoJbHBkY2ItPmZDaEV2dCA9IDA7CglscGRjYi0+ZkJpbmFyeSA9IDE7CglscGRjYi0+ZkR0ckRpc2FibGUgPSAwOwoKI2lmZGVmIENSVFNDVFMKCglpZiAocG9ydC5jX2NmbGFnICYgQ1JUU0NUUykgewoJCWxwZGNiLT5mRHRyZmxvdyA9IDE7CgkJbHBkY2ItPmZSdHNmbG93ID0gMTsKCQlscGRjYi0+Zk91dHhDdHNGbG93ID0gMTsKCQlscGRjYi0+Zk91dHhEc3JGbG93ID0gMTsKCX0gZWxzZSAKI2VuZGlmCgkJbHBkY2ItPmZEdHJEaXNhYmxlID0gMTsKCglpZiAocG9ydC5jX2lmbGFnICYgSVhPTikKCQlscGRjYi0+ZkluWCA9IDE7CgllbHNlCgkJbHBkY2ItPmZJblggPSAwOwoKCWlmIChwb3J0LmNfaWZsYWcgJiBJWE9GRikKCQlscGRjYi0+Zk91dFggPSAxOwoJZWxzZQoJCWxwZGNiLT5mT3V0WCA9IDA7Ci8qCglscGRjYi0+WG9uQ2hhciA9IAoJbHBkY2ItPlhvZmZDaGFyID0gCiAqLwoJbHBkY2ItPlhvbkxpbSA9IDEwOwoJbHBkY2ItPlhvZmZMaW0gPSAxMDsKCglscGRjYi0+RXZ0Q2hhciA9IHB0ci0+ZXZ0Y2hhcjsKCglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVRyYW5zbWl0Q29tbUNoYXIJKFVTRVIuMjA2KQogKi8KSU5UMTYgV0lOQVBJIFRyYW5zbWl0Q29tbUNoYXIxNihJTlQxNiBjaWQsQ0hBUiBjaFRyYW5zbWl0KQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKCJjaWQgJWQsIGRhdGEgJWQgXG4iLCBjaWQsIGNoVHJhbnNtaXQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0JCgoJaWYgKHB0ci0+eG1pdCA+PSAwKSB7CgkgIC8qIGNoYXJhY3RlciBhbHJlYWR5IHF1ZXVlZCAqLwoJICAvKiBGSVhNRTogd2hpY2ggZXJyb3Igd291bGQgV2luZG93cyByZXR1cm4/ICovCgkgIHB0ci0+Y29tbWVycm9yID0gQ0VfVFhGVUxMOwoJICByZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+b2J1Zl9oZWFkID09IHB0ci0+b2J1Zl90YWlsKSB7CgkgIC8qIHRyYW5zbWl0IHF1ZXVlIGVtcHR5LCB0cnkgdG8gdHJhbnNtaXQgZGlyZWN0bHkgKi8KCSAgaWYgKHdyaXRlKHB0ci0+ZmQsICZjaFRyYW5zbWl0LCAxKSA9PSAtMSkgewoJICAgIC8qIGRpZG4ndCB3b3JrLCBxdWV1ZSBpdCAqLwoJICAgIHB0ci0+eG1pdCA9IGNoVHJhbnNtaXQ7CgkgICAgY29tbV93YWl0d3JpdGUocHRyKTsKCSAgfQoJfSBlbHNlIHsKCSAgLyogZGF0YSBpbiBxdWV1ZSwgbGV0IHRoaXMgY2hhciBiZSB0cmFuc21pdHRlZCBuZXh0ICovCgkgIHB0ci0+eG1pdCA9IGNoVHJhbnNtaXQ7CgkgIGNvbW1fd2FpdHdyaXRlKHB0cik7Cgl9CgoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglVbmdldENvbW1DaGFyCShVU0VSLjIxMikKICovCklOVDE2IFdJTkFQSSBVbmdldENvbW1DaGFyMTYoSU5UMTYgY2lkLENIQVIgY2hVbmdldCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkICVkIChjaGFyICVkKVxuIiwgY2lkLCBjaFVuZ2V0KTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gLTE7Cgl9CQoKCWlmIChwdHItPnVuZ2V0Pj0wKSB7CgkgIC8qIGNoYXJhY3RlciBhbHJlYWR5IHF1ZXVlZCAqLwoJICAvKiBGSVhNRTogd2hpY2ggZXJyb3Igd291bGQgV2luZG93cyByZXR1cm4/ICovCgkgIHB0ci0+Y29tbWVycm9yID0gQ0VfUlhPVkVSOwoJICByZXR1cm4gLTE7Cgl9CgoJcHRyLT51bmdldCA9IGNoVW5nZXQ7CgoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglSZWFkQ29tbQkoVVNFUi4yMDQpCiAqLwpJTlQxNiBXSU5BUEkgUmVhZENvbW0xNihJTlQxNiBjaWQsTFBTVFIgbHB2QnVmLElOVDE2IGNiUmVhZCkKewoJaW50IHN0YXR1cywgbGVuZ3RoOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJTFBTVFIgb3JnQnVmID0gbHB2QnVmOwoKICAgIAlUUkFDRSgiY2lkICVkLCBwdHIgJXAsIGxlbmd0aCAlZFxuIiwgY2lkLCBscHZCdWYsIGNiUmVhZCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJcmV0dXJuIC0xOwoJfQoKCWlmIChwdHItPnN1c3BlbmRlZCkgewoJCXB0ci0+Y29tbWVycm9yID0gSUVfSEFSRFdBUkU7CgkJcmV0dXJuIC0xOwoJfQkKCgkvKiByZWFkIHVuZ2V0IGNoYXJhY3RlciAqLwoJaWYgKHB0ci0+dW5nZXQ+PTApIHsKCQkqbHB2QnVmKysgPSBwdHItPnVuZ2V0OwoJCXB0ci0+dW5nZXQgPSAtMTsKCgkJbGVuZ3RoID0gMTsKCX0gZWxzZQoJIAlsZW5ndGggPSAwOwoKCS8qIHJlYWQgZnJvbSByZWNlaXZlIGJ1ZmZlciAqLwoJd2hpbGUgKGxlbmd0aCA8IGNiUmVhZCkgewoJICBzdGF0dXMgPSAoKHB0ci0+aWJ1Zl9oZWFkIDwgcHRyLT5pYnVmX3RhaWwpID8KCQkgICAgcHRyLT5pYnVmX3NpemUgOiBwdHItPmlidWZfaGVhZCkgLSBwdHItPmlidWZfdGFpbDsKCSAgaWYgKCFzdGF0dXMpIGJyZWFrOwoJICBpZiAoKGNiUmVhZCAtIGxlbmd0aCkgPCBzdGF0dXMpCgkgICAgc3RhdHVzID0gY2JSZWFkIC0gbGVuZ3RoOwoKCSAgbWVtY3B5KGxwdkJ1ZiwgcHRyLT5pbmJ1ZiArIHB0ci0+aWJ1Zl90YWlsLCBzdGF0dXMpOwoJICBwdHItPmlidWZfdGFpbCArPSBzdGF0dXM7CgkgIGlmIChwdHItPmlidWZfdGFpbCA+PSBwdHItPmlidWZfc2l6ZSkKCSAgICBwdHItPmlidWZfdGFpbCA9IDA7CgkgIGxwdkJ1ZiArPSBzdGF0dXM7CgkgIGxlbmd0aCArPSBzdGF0dXM7Cgl9CgoJVFJBQ0UoIiUuKnNcbiIsIGxlbmd0aCwgb3JnQnVmKTsKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiBsZW5ndGg7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglXcml0ZUNvbW0JKFVTRVIuMjA1KQogKi8KSU5UMTYgV0lOQVBJIFdyaXRlQ29tbTE2KElOVDE2IGNpZCwgTFBTVFIgbHB2QnVmLCBJTlQxNiBjYldyaXRlKQp7CglpbnQgc3RhdHVzLCBsZW5ndGg7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKCJjaWQgJWQsIHB0ciAlcCwgbGVuZ3RoICVkXG4iLCAKCQljaWQsIGxwdkJ1ZiwgY2JXcml0ZSk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJcmV0dXJuIC0xOwoJfQoKCWlmIChwdHItPnN1c3BlbmRlZCkgewoJCXB0ci0+Y29tbWVycm9yID0gSUVfSEFSRFdBUkU7CgkJcmV0dXJuIC0xOwoJfQkKCQoJVFJBQ0UoIiUuKnNcbiIsIGNiV3JpdGUsIGxwdkJ1ZiApOwoKCWxlbmd0aCA9IDA7Cgl3aGlsZSAobGVuZ3RoIDwgY2JXcml0ZSkgewoJICBpZiAoKHB0ci0+b2J1Zl9oZWFkID09IHB0ci0+b2J1Zl90YWlsKSAmJiAocHRyLT54bWl0IDwgMCkpIHsKCSAgICAvKiBubyBkYXRhIHF1ZXVlZCwgdHJ5IHRvIHdyaXRlIGRpcmVjdGx5ICovCgkgICAgc3RhdHVzID0gd3JpdGUocHRyLT5mZCwgbHB2QnVmLCBjYldyaXRlIC0gbGVuZ3RoKTsKCSAgICBpZiAoc3RhdHVzID4gMCkgewoJICAgICAgbHB2QnVmICs9IHN0YXR1czsKCSAgICAgIGxlbmd0aCArPSBzdGF0dXM7CgkgICAgICBjb250aW51ZTsKCSAgICB9CgkgIH0KCSAgLyogY2FuJ3Qgd3JpdGUgZGlyZWN0bHksIHB1dCBpbnRvIHRyYW5zbWl0IGJ1ZmZlciAqLwoJICBzdGF0dXMgPSAoKHB0ci0+b2J1Zl90YWlsID4gcHRyLT5vYnVmX2hlYWQpID8KCQkgICAgKHB0ci0+b2J1Zl90YWlsLTEpIDogcHRyLT5vYnVmX3NpemUpIC0gcHRyLT5vYnVmX2hlYWQ7CgkgIGlmICghc3RhdHVzKSBicmVhazsKCSAgaWYgKChjYldyaXRlIC0gbGVuZ3RoKSA8IHN0YXR1cykKCSAgICBzdGF0dXMgPSBjYldyaXRlIC0gbGVuZ3RoOwoJICBtZW1jcHkobHB2QnVmLCBwdHItPm91dGJ1ZiArIHB0ci0+b2J1Zl9oZWFkLCBzdGF0dXMpOwoJICBwdHItPm9idWZfaGVhZCArPSBzdGF0dXM7CgkgIGlmIChwdHItPm9idWZfaGVhZCA+PSBwdHItPm9idWZfc2l6ZSkKCSAgICBwdHItPm9idWZfaGVhZCA9IDA7CgkgIGxwdkJ1ZiArPSBzdGF0dXM7CgkgIGxlbmd0aCArPSBzdGF0dXM7CgkgIGNvbW1fd2FpdHdyaXRlKHB0cik7Cgl9CgoJcHRyLT5jb21tZXJyb3IgPSAwOwkKCXJldHVybiBsZW5ndGg7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbiAgIChVU0VSLjI0NikKICovCkJPT0wxNiBXSU5BUEkgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbjE2KCBJTlQxNiBjaWQsIEhXTkQxNiBod25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IGNiV3JpdGVOb3RpZnksIElOVDE2IGNiT3V0UXVldWUgKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgoJVFJBQ0UoIiglZCwgJXgsICVkLCAlZClcbiIsIGNpZCwgaHduZCwgY2JXcml0ZU5vdGlmeSwgY2JPdXRRdWV1ZSk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9CQURJRDsKCQlyZXR1cm4gLTE7Cgl9CglwdHItPnduZCA9IGh3bmQ7CglwdHItPm5fcmVhZCA9IGNiV3JpdGVOb3RpZnk7CglwdHItPm5fd3JpdGUgPSBjYk91dFF1ZXVlOwoJcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0JBCQkoS0VSTkVMMzIuMTQpCiAqLwpCT09MIFdJTkFQSSBCdWlsZENvbW1EQ0JBKExQQ1NUUiBkZXZpY2UsTFBEQ0IgbHBkY2IpCnsKCXJldHVybiBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c0EoZGV2aWNlLGxwZGNiLE5VTEwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c0EJKEtFUk5FTDMyLjE1KQogKi8KQk9PTCBXSU5BUEkgQnVpbGRDb21tRENCQW5kVGltZW91dHNBKExQQ1NUUiBkZXZpY2UsIExQRENCIGxwZGNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ09NTVRJTUVPVVRTIGxwdGltZW91dHMpCnsKCWludAlwb3J0OwoJY2hhcgkqcHRyLCp0ZW1wOwoKCVRSQUNFKCIoJXMsJXAsJXApXG4iLGRldmljZSxscGRjYixscHRpbWVvdXRzKTsKCglpZiAoIWxzdHJuY21waUEoZGV2aWNlLCJDT00iLDMpKSB7CgkJcG9ydD1kZXZpY2VbM10tJzAnOwoJCWlmIChwb3J0LS09PTApIHsKCQkJRVJSKCJCVUchIENPTTAgY2FuJ3QgZXhpc3RzIS5cbiIpOwoJCQlyZXR1cm4gRkFMU0U7CgkJfQoJCWlmICghVmFsaWRDT01Qb3J0KHBvcnQpKQoJCQlyZXR1cm4gRkFMU0U7CgkJaWYgKCooZGV2aWNlKzQpIT0nOicpCgkJCXJldHVybiBGQUxTRTsKCQl0ZW1wPShMUFNUUikoZGV2aWNlKzUpOwoJfSBlbHNlCgkJdGVtcD0oTFBTVFIpZGV2aWNlOwoKCW1lbXNldChscGRjYiwgMCwgc2l6ZW9mKERDQikpOyAvKiBpbml0aWFsaXplICovCgoJbHBkY2ItPkRDQmxlbmd0aAk9IHNpemVvZihEQ0IpOwoJaWYgKHN0cmNocih0ZW1wLCcsJykpIHsJLyogb2xkIHN0eWxlICovCgkJRENCMTYJZGNiMTY7CgkJQk9PTDE2CXJldDsKCQljaGFyCWxhc3Q9dGVtcFtzdHJsZW4odGVtcCktMV07CgoJCXJldD1CdWlsZENvbW1EQ0IxNihkZXZpY2UsJmRjYjE2KTsKCQlpZiAoIXJldCkKCQkJcmV0dXJuIEZBTFNFOwoJCWxwZGNiLT5CYXVkUmF0ZQkJPSBkY2IxNi5CYXVkUmF0ZTsKCQlscGRjYi0+Qnl0ZVNpemUJCT0gZGNiMTYuQnl0ZVNpemU7CgkJbHBkY2ItPmZCaW5hcnkJCT0gZGNiMTYuZkJpbmFyeTsKCQlscGRjYi0+UGFyaXR5CQk9IGRjYjE2LlBhcml0eTsKCQlscGRjYi0+ZlBhcml0eQkJPSBkY2IxNi5mUGFyaXR5OwoJCWxwZGNiLT5mTnVsbAkJPSBkY2IxNi5mTnVsbDsKCQlscGRjYi0+U3RvcEJpdHMJCT0gZGNiMTYuU3RvcEJpdHM7CgkJaWYgKGxhc3QgPT0gJ3gnKSB7CgkJCWxwZGNiLT5mSW5YCQk9IFRSVUU7CgkJCWxwZGNiLT5mT3V0WAkJPSBUUlVFOwoJCQlscGRjYi0+Zk91dHhDdHNGbG93CT0gRkFMU0U7CgkJCWxwZGNiLT5mT3V0eERzckZsb3cJPSBGQUxTRTsKCQkJbHBkY2ItPmZEdHJDb250cm9sCT0gRFRSX0NPTlRST0xfRU5BQkxFOwoJCQlscGRjYi0+ZlJ0c0NvbnRyb2wJPSBSVFNfQ09OVFJPTF9FTkFCTEU7CgkJfSBlbHNlIGlmIChsYXN0PT0ncCcpIHsKCQkJbHBkY2ItPmZJblgJCT0gRkFMU0U7CgkJCWxwZGNiLT5mT3V0WAkJPSBGQUxTRTsKCQkJbHBkY2ItPmZPdXR4Q3RzRmxvdwk9IFRSVUU7CgkJCWxwZGNiLT5mT3V0eERzckZsb3cJPSBUUlVFOwoJCQlscGRjYi0+ZkR0ckNvbnRyb2wJPSBEVFJfQ09OVFJPTF9IQU5EU0hBS0U7CgkJCWxwZGNiLT5mUnRzQ29udHJvbAk9IFJUU19DT05UUk9MX0hBTkRTSEFLRTsKCQl9IGVsc2UgewoJCQlscGRjYi0+ZkluWAkJPSBGQUxTRTsKCQkJbHBkY2ItPmZPdXRYCQk9IEZBTFNFOwoJCQlscGRjYi0+Zk91dHhDdHNGbG93CT0gRkFMU0U7CgkJCWxwZGNiLT5mT3V0eERzckZsb3cJPSBGQUxTRTsKCQkJbHBkY2ItPmZEdHJDb250cm9sCT0gRFRSX0NPTlRST0xfRU5BQkxFOwoJCQlscGRjYi0+ZlJ0c0NvbnRyb2wJPSBSVFNfQ09OVFJPTF9FTkFCTEU7CgkJfQoJCWxwZGNiLT5Yb25DaGFyCT0gZGNiMTYuWG9uQ2hhcjsKCQlscGRjYi0+WG9mZkNoYXIJPSBkY2IxNi5Yb2ZmQ2hhcjsKCQlscGRjYi0+RXJyb3JDaGFyPSBkY2IxNi5QZUNoYXI7CgkJbHBkY2ItPmZFcnJvckNoYXI9IGRjYjE2LmZQZUNoYXI7CgkJbHBkY2ItPkVvZkNoYXIJPSBkY2IxNi5Fb2ZDaGFyOwoJCWxwZGNiLT5FdnRDaGFyCT0gZGNiMTYuRXZ0Q2hhcjsKCQlscGRjYi0+WG9uTGltCT0gZGNiMTYuWG9uTGltOwoJCWxwZGNiLT5Yb2ZmTGltCT0gZGNiMTYuWG9mZkxpbTsKCQlyZXR1cm4gVFJVRTsKCX0KCXB0cj1zdHJ0b2sodGVtcCwiICIpOyAKCXdoaWxlIChwdHIpIHsKCQlEV09SRAlmbGFnLHg7CgoJCWZsYWc9MDsKCQlpZiAoIXN0cm5jbXAoImJhdWQ9IixwdHIsNSkpIHsKCQkJaWYgKCFzc2NhbmYocHRyKzUsIiVsZCIsJngpKQoJCQkJV0FSTigiQ291bGRuJ3QgcGFyc2UgJXNcbiIscHRyKTsKCQkJbHBkY2ItPkJhdWRSYXRlID0geDsKCQkJZmxhZz0xOwoJCX0KCQlpZiAoIXN0cm5jbXAoInN0b3A9IixwdHIsNSkpIHsKCQkJaWYgKCFzc2NhbmYocHRyKzUsIiVsZCIsJngpKQoJCQkJV0FSTigiQ291bGRuJ3QgcGFyc2UgJXNcbiIscHRyKTsKCQkJbHBkY2ItPlN0b3BCaXRzID0geDsKCQkJZmxhZz0xOwoJCX0KCQlpZiAoIXN0cm5jbXAoImRhdGE9IixwdHIsNSkpIHsKCQkJaWYgKCFzc2NhbmYocHRyKzUsIiVsZCIsJngpKQoJCQkJV0FSTigiQ291bGRuJ3QgcGFyc2UgJXNcbiIscHRyKTsKCQkJbHBkY2ItPkJ5dGVTaXplID0geDsKCQkJZmxhZz0xOwoJCX0KCQlpZiAoIXN0cm5jbXAoInBhcml0eT0iLHB0ciw3KSkgewoJCQlscGRjYi0+ZlBhcml0eQk9IFRSVUU7CgkJCXN3aXRjaCAocHRyWzhdKSB7CgkJCWNhc2UgJ04nOmNhc2UgJ24nOgoJCQkJbHBkY2ItPmZQYXJpdHkJPSBGQUxTRTsKCQkJCWxwZGNiLT5QYXJpdHkJPSBOT1BBUklUWTsKCQkJCWJyZWFrOwoJCQljYXNlICdFJzpjYXNlICdlJzoKCQkJCWxwZGNiLT5QYXJpdHkJPSBFVkVOUEFSSVRZOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ08nOmNhc2UgJ28nOgoJCQkJbHBkY2ItPlBhcml0eQk9IE9ERFBBUklUWTsKCQkJCWJyZWFrOwoJCQljYXNlICdNJzpjYXNlICdtJzoKCQkJCWxwZGNiLT5QYXJpdHkJPSBNQVJLUEFSSVRZOwoJCQkJYnJlYWs7CgkJCX0KCQkJZmxhZz0xOwoJCX0KCQlpZiAoIWZsYWcpCgkJCUVSUigiVW5oYW5kbGVkIHNwZWNpZmllciAnJXMnLCBwbGVhc2UgcmVwb3J0LlxuIixwdHIpOwoJCXB0cj1zdHJ0b2soTlVMTCwiICIpOwoJfQoJaWYgKGxwZGNiLT5CYXVkUmF0ZT09MTEwKQoJCWxwZGNiLT5TdG9wQml0cyA9IDI7CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgQnVpbGRDb21tRENCQW5kVGltZW91dHNXCQkoS0VSTkVMMzIuMTYpCiAqLwpCT09MIFdJTkFQSSBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c1coIExQQ1dTVFIgZGV2aWQsIExQRENCIGxwZGNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENPTU1USU1FT1VUUyBscHRpbWVvdXRzICkKewoJTFBTVFIJZGV2aWRBOwoJQk9PTAlyZXQ7CgoJVFJBQ0UoIiglcCwlcCwlcClcbiIsZGV2aWQsbHBkY2IsbHB0aW1lb3V0cyk7CglkZXZpZEEgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIGRldmlkICk7CglyZXQ9QnVpbGRDb21tRENCQW5kVGltZW91dHNBKGRldmlkQSxscGRjYixscHRpbWVvdXRzKTsKICAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGV2aWRBICk7CglyZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0JXCQkoS0VSTkVMMzIuMTcpCiAqLwpCT09MIFdJTkFQSSBCdWlsZENvbW1EQ0JXKExQQ1dTVFIgZGV2aWQsTFBEQ0IgbHBkY2IpCnsKCXJldHVybiBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c1coZGV2aWQsbHBkY2IsTlVMTCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIENPTU1fR2V0UmVhZEZkCiAqICBSZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIGZvciByZWFkaW5nLgogKiAgTWFrZSBzdXJlIHRvIGNsb3NlIHRoZSBoYW5kbGUgYWZ0ZXJ3YXJkcyEKICovCnN0YXRpYyBpbnQgQ09NTV9HZXRSZWFkRmQoIEhBTkRMRSBoYW5kbGUpCnsKICAgIGludCBmZDsKICAgIHN0cnVjdCBnZXRfcmVhZF9mZF9yZXF1ZXN0ICpyZXEgPSBnZXRfcmVxX2J1ZmZlcigpOwogICAgcmVxLT5oYW5kbGUgPSBoYW5kbGU7CiAgICBzZXJ2ZXJfY2FsbF9mZCggUkVRX0dFVF9SRUFEX0ZELCAtMSwgJmZkICk7CiAgICByZXR1cm4gZmQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIENPTU1fR2V0V3JpdGVGZAogKiAgUmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciBmb3Igd3JpdGluZy4KICogIE1ha2Ugc3VyZSB0byBjbG9zZSB0aGUgaGFuZGxlIGFmdGVyd2FyZHMhCiAqLwpzdGF0aWMgaW50IENPTU1fR2V0V3JpdGVGZCggSEFORExFIGhhbmRsZSkKewogICAgaW50IGZkOwogICAgc3RydWN0IGdldF93cml0ZV9mZF9yZXF1ZXN0ICpyZXEgPSBnZXRfcmVxX2J1ZmZlcigpOwogICAgcmVxLT5oYW5kbGUgPSBoYW5kbGU7CiAgICBzZXJ2ZXJfY2FsbF9mZCggUkVRX0dFVF9XUklURV9GRCwgLTEsICZmZCApOwogICAgcmV0dXJuIGZkOwp9CgovKiBGSVhNRTogaGF2aW5nIHRoZXNlIGdsb2JhbCBmb3Igd2luMzIgZm9yIG5vdyAqLwppbnQgY29tbWVycm9yPTAsZXZlbnRtYXNrPTA7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbUJyZWFrCQkoS0VSTkVMMzIuNDQ5KQogKi8KQk9PTCBXSU5BUEkgU2V0Q29tbUJyZWFrKEhBTkRMRSBoYW5kbGUpCnsKI2lmIGRlZmluZWQoVElPQ1NCUkspICYmIGRlZmluZWQoVElPQ0NCUkspIC8qIGNoZWNrIGlmIGF2YWlsYWJsZSBmb3IgY29tcGlsYXRpb24gKi8KICAgICAgICBpbnQgZmQscmVzdWx0OwogCglmZCA9IENPTU1fR2V0V3JpdGVGZChoYW5kbGUpOwoJaWYoZmQ8MCkgewoJICAgICAgICBUUkFDRSgiQ09NTV9HZXRXcml0ZUZkIGZhaWxlZFxuIik7CgkJcmV0dXJuIEZBTFNFOwoJfQoJcmVzdWx0ID0gaW9jdGwoZmQsVElPQ1NCUkssMCk7CgljbG9zZShmZCk7CglpZiAocmVzdWx0ID09LTEpCgkgIHsKCSAgICAgICAgVFJBQ0UoImlvY3RsIGZhaWxlZFxuIik7CgkJU2V0TGFzdEVycm9yKEVSUk9SX05PVF9TVVBQT1JURUQpOwoJCXJldHVybiBGQUxTRTsKCSAgfQoJcmV0dXJuIFRSVUU7CiNlbHNlCglGSVhNRSgiaW9jdGwgbm90IGF2YWlsYWJsZVxuIik7CglTZXRMYXN0RXJyb3IoRVJST1JfTk9UX1NVUFBPUlRFRCk7CglyZXR1cm4gRkFMU0U7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ2xlYXJDb21tQnJlYWsJCShLRVJORUwzMi4yMCkKICovCkJPT0wgV0lOQVBJIENsZWFyQ29tbUJyZWFrKEhBTkRMRSBoYW5kbGUpCnsKI2lmIGRlZmluZWQoVElPQ1NCUkspICYmIGRlZmluZWQoVElPQ0NCUkspIC8qIGNoZWNrIGlmIGF2YWlsYWJsZSBmb3IgY29tcGlsYXRpb24gKi8KICAgICAgICBpbnQgZmQscmVzdWx0OwogCglmZCA9IENPTU1fR2V0V3JpdGVGZChoYW5kbGUpOwoJaWYoZmQ8MCkgewoJICAgICAgICBUUkFDRSgiQ09NTV9HZXRXcml0ZUZkIGZhaWxlZFxuIik7CgkJcmV0dXJuIEZBTFNFOwoJfQoJcmVzdWx0ID0gaW9jdGwoZmQsVElPQ0NCUkssMCk7CgljbG9zZShmZCk7CglpZiAocmVzdWx0ID09LTEpCgkgIHsKCSAgICAgICAgVFJBQ0UoImlvY3RsIGZhaWxlZFxuIik7CgkJU2V0TGFzdEVycm9yKEVSUk9SX05PVF9TVVBQT1JURUQpOwoJCXJldHVybiBGQUxTRTsKCSAgfQoJcmV0dXJuIFRSVUU7CiNlbHNlCglGSVhNRSgiaW9jdGwgbm90IGF2YWlsYWJsZVxuIik7CglTZXRMYXN0RXJyb3IoRVJST1JfTk9UX1NVUFBPUlRFRCk7CglyZXR1cm4gRkFMU0U7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRXNjYXBlQ29tbUZ1bmN0aW9uCShLRVJORUwzMi4yMTQpCiAqLwpCT09MIFdJTkFQSSBFc2NhcGVDb21tRnVuY3Rpb24oSEFORExFIGhhbmRsZSxVSU5UIG5GdW5jdGlvbikKewoJaW50IGZkLGRpcmVjdD1GQUxTRSxyZXN1bHQ9RkFMU0U7CglzdHJ1Y3QgdGVybWlvcwlwb3J0OwoKICAgIAlUUkFDRSgiaGFuZGxlICVkLCBmdW5jdGlvbj0lZFxuIiwgaGFuZGxlLCBuRnVuY3Rpb24pOwoJZmQgPSBDT01NX0dldFdyaXRlRmQoaGFuZGxlKTsKCWlmKGZkPDApCgkJcmV0dXJuIEZBTFNFOwoKCWlmICh0Y2dldGF0dHIoZmQsJnBvcnQpID09IC0xKSB7CgkJY29tbWVycm9yPVdpbkVycm9yKCk7CgkJY2xvc2UoZmQpOwoJCXJldHVybiBGQUxTRTsKCX0KCglzd2l0Y2ggKG5GdW5jdGlvbikgewoJCWNhc2UgUkVTRVRERVY6CgkJICAgICAgICBUUkFDRSgiXG4iKTsKCQkJYnJlYWs7CQkJCQkKCgkJY2FzZSBDTFJEVFI6CgkJICAgICAgICBUUkFDRSgiQ0xSRFRSXG4iKTsKI2lmZGVmIFRJT0NNX0RUUgoJCQlkaXJlY3Q9VFJVRTsKCQkJcmVzdWx0PSBDT01NX1doYWNrTW9kZW0oZmQsIH5USU9DTV9EVFIsIDApOwoJCQlicmVhazsKI2VuZGlmCgoJCWNhc2UgQ0xSUlRTOgoJCSAgICAgICAgVFJBQ0UoIkNMUlJUU1xuIik7CiNpZmRlZiBUSU9DTV9SVFMKCQkJZGlyZWN0PVRSVUU7CgkJCXJlc3VsdD0gQ09NTV9XaGFja01vZGVtKGZkLCB+VElPQ01fUlRTLCAwKTsKCQkJYnJlYWs7CiNlbmRpZgoJCgkJY2FzZSBTRVREVFI6CgkJICAgICAgICBUUkFDRSgiU0VURFRSXG4iKTsKI2lmZGVmIFRJT0NNX0RUUgoJCQlkaXJlY3Q9VFJVRTsKCQkJcmVzdWx0PSBDT01NX1doYWNrTW9kZW0oZmQsIDAsIFRJT0NNX0RUUik7CgkJCWJyZWFrOwojZW5kaWYKCgkJY2FzZSBTRVRSVFM6CgkJICAgICAgICBUUkFDRSgiU0VUUlRTXG4iKTsKI2lmZGVmIFRJT0NNX0RUUgoJCQlkaXJlY3Q9VFJVRTsKCQkJcmVzdWx0PSBDT01NX1doYWNrTW9kZW0oZmQsIDAsIFRJT0NNX1JUUyk7CgkJCWJyZWFrOwojZW5kaWYKCgkJY2FzZSBTRVRYT0ZGOgoJCSAgICAgICAgVFJBQ0UoIlNFVFhPRkZcbiIpOwoJCQlwb3J0LmNfaWZsYWcgfD0gSVhPRkY7CgkJCWJyZWFrOwoKCQljYXNlIFNFVFhPTjoKCQkgICAgICAgIFRSQUNFKCJTRVRYT05cbiIpOwoJCQlwb3J0LmNfaWZsYWcgfD0gSVhPTjsKCQkJYnJlYWs7CgkJY2FzZSBTRVRCUkVBSzoKCQkJVFJBQ0UoInNldGJyZWFrXG4iKTsKI2lmZGVmIAlUSU9DU0JSSwoJCQlkaXJlY3Q9VFJVRTsKCQkJcmVzdWx0ID0gaW9jdGwoZmQsVElPQ1NCUkssMCk7CgkJCWJyZWFrOwojZW5kaWYKCQljYXNlIENMUkJSRUFLOgoJCQlUUkFDRSgiY2xyYnJlYWtcbiIpOwojaWZkZWYgCVRJT0NTQlJLCgkJCWRpcmVjdD1UUlVFOwoJCQlyZXN1bHQgPSBpb2N0bChmZCxUSU9DQ0JSSywwKTsKCQkJYnJlYWs7CiNlbmRpZgoJCWRlZmF1bHQ6CgkJCVdBUk4oIihoYW5kbGU9JWQsbkZ1bmN0aW9uPSVkKTogVW5rbm93biBmdW5jdGlvblxuIiwgCgkJCWhhbmRsZSwgbkZ1bmN0aW9uKTsKCQkJYnJlYWs7CQkJCQoJfQoJCglpZiAoIWRpcmVjdCkKCSAgaWYgKHRjc2V0YXR0cihmZCwgVENTQURSQUlOLCAmcG9ydCkgPT0gLTEpIHsKCQljb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCWNsb3NlKGZkKTsKCQlyZXR1cm4gRkFMU0U7CQoJICB9IGVsc2UgCgkgICAgICAgIHJlc3VsdD0gVFJVRTsKCWVsc2UKCSAgewoJICAgIGlmIChyZXN1bHQgPT0gLTEpCgkgICAgICB7CgkJcmVzdWx0PSBGQUxTRTsKCQljb21tZXJyb3I9V2luRXJyb3IoKTsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICByZXN1bHQgPSBUUlVFOwoJICB9CgljbG9zZShmZCk7CglyZXR1cm4gcmVzdWx0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBQdXJnZUNvbW0gICAgICAgIChLRVJORUwzMi41NTcpCiAqLwpCT09MIFdJTkFQSSBQdXJnZUNvbW0oIEhBTkRMRSBoYW5kbGUsIERXT1JEIGZsYWdzKSAKewogICAgIGludCBmZDsKCiAgICAgVFJBQ0UoImhhbmRsZSAlZCwgZmxhZ3MgJWx4XG4iLCBoYW5kbGUsIGZsYWdzKTsKCiAgICAgZmQgPSBDT01NX0dldFdyaXRlRmQoaGFuZGxlKTsKICAgICBpZihmZDwwKQogICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgIC8qCiAgICAgKiogbm90IGV4YWN0bHkgc3VyZSBob3cgdGhlc2UgYXJlIGRpZmZlcmVudAogICAgICoqIFBlcmhhcHMgaWYgd2UgaGFkIG91ciBvd24gaW50ZXJuYWwgcXVldWVzLCBvbmUgZmx1c2hlcyB0aGVtCiAgICAgKiogYW5kIHRoZSBvdGhlciBmbHVzaGVzIHRoZSBrZXJuZWwncyBidWZmZXJzLgogICAgICovCiAgICAgaWYoZmxhZ3MmUFVSR0VfVFhBQk9SVCkKICAgICB7CiAgICAgICAgIHRjZmx1c2goZmQsVENPRkxVU0gpOwogICAgIH0KICAgICBpZihmbGFncyZQVVJHRV9SWEFCT1JUKQogICAgIHsKICAgICAgICAgdGNmbHVzaChmZCxUQ0lGTFVTSCk7CiAgICAgfQogICAgIGlmKGZsYWdzJlBVUkdFX1RYQ0xFQVIpCiAgICAgewogICAgICAgICB0Y2ZsdXNoKGZkLFRDT0ZMVVNIKTsKICAgICB9CiAgICAgaWYoZmxhZ3MmUFVSR0VfUlhDTEVBUikKICAgICB7CiAgICAgICAgIHRjZmx1c2goZmQsVENJRkxVU0gpOwogICAgIH0KICAgICBjbG9zZShmZCk7CgogICAgIHJldHVybiAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ2xlYXJDb21tRXJyb3IJKEtFUk5FTDMyLjIxKQogKi8KQk9PTCBXSU5BUEkgQ2xlYXJDb21tRXJyb3IoSU5UIGhhbmRsZSxMUERXT1JEIGVycm9ycyxMUENPTVNUQVQgbHBTdGF0KQp7CiAgICBpbnQgZmQ7CgogICAgZmQ9Q09NTV9HZXRSZWFkRmQoaGFuZGxlKTsKICAgIGlmKDA+ZmQpIAogICAgewogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBpZiAobHBTdGF0KSAKICAgIHsKCWxwU3RhdC0+c3RhdHVzID0gMDsKCglpZihpb2N0bChmZCwgVElPQ09VVFEsICZscFN0YXQtPmNiT3V0UXVlKSkKCSAgICBXQVJOKCJpb2N0bCByZXR1cm5lZCBlcnJvclxuIik7CgoJaWYoaW9jdGwoZmQsIFRJT0NJTlEsICZscFN0YXQtPmNiSW5RdWUpKQoJICAgIFdBUk4oImlvY3RsIHJldHVybmVkIGVycm9yXG4iKTsKCglUUkFDRSgiaGFuZGxlICVkIGNiSW5RdWUgPSAlbGQgY2JPdXRRdWUgPSAlbGRcbiIsCgkgICAgICBoYW5kbGUsIGxwU3RhdC0+Y2JJblF1ZSwgbHBTdGF0LT5jYk91dFF1ZSk7CiAgICB9CgogICAgY2xvc2UoZmQpOwoKICAgIGlmKGVycm9ycykKICAgICAgICAqZXJyb3JzID0gMDsKCiAgICAvKgogICAgKiogQWZ0ZXIgYW4gYXN5bmNocm9ub3VzIHdyaXRlIG9wcGVyYXRpb24sIHRoZQogICAgKiogYXBwIHdpbGwgY2FsbCBDbGVhckNvbW1FcnJvciB0byBzZWUgaWYgdGhlCiAgICAqKiByZXN1bHRzIGFyZSByZWFkeSB5ZXQuIEl0IHdhaXRzIGZvciBFUlJPUl9JT19QRU5ESU5HCiAgICAqLwogICAgY29tbWVycm9yID0gRVJST1JfSU9fUEVORElORzsKCiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU2V0dXBDb21tICAgICAgIChLRVJORUwzMi42NzYpCiAqLwpCT09MIFdJTkFQSSBTZXR1cENvbW0oIEhBTkRMRSBoYW5kbGUsIERXT1JEIGluc2l6ZSwgRFdPUkQgb3V0c2l6ZSkKewogICAgaW50IGZkOwoKICAgIEZJWE1FKCJpbnNpemUgJWxkIG91dHNpemUgJWxkIHVuaW1wbGVtZW50ZWQgc3R1YlxuIiwgaW5zaXplLCBvdXRzaXplKTsKICAgIGZkPUNPTU1fR2V0V3JpdGVGZChoYW5kbGUpOwogICAgaWYoMD5mZCkKICAgIHsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICBjbG9zZShmZCk7CiAgICByZXR1cm4gVFJVRTsKfSAKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tTWFzawkoS0VSTkVMMzIuMTU2KQogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbU1hc2soSEFORExFIGhhbmRsZSxMUERXT1JEIGV2dG1hc2spCnsKICAgIGludCBmZDsKCiAgICBUUkFDRSgiaGFuZGxlICVkLCBtYXNrICVwXG4iLCBoYW5kbGUsIGV2dG1hc2spOwogICAgaWYoMD4oZmQ9Q09NTV9HZXRSZWFkRmQoaGFuZGxlKSkpIAogICAgewogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGNsb3NlKGZkKTsKICAgICpldnRtYXNrID0gZXZlbnRtYXNrOwogICAgVFJBQ0UoIiVzJXMlcyVzJXMlcyVzJXMlc1xuIiwKCSAgKGV2ZW50bWFzayZFVl9CUkVBSyk/IkVWX0JSRUFLIjoiIiwKCSAgKGV2ZW50bWFzayZFVl9DVFMpPyJFVl9DVFMiOiIiLAoJICAoZXZlbnRtYXNrJkVWX0RTUik/IkVWX0RTUiI6IiIsCgkgIChldmVudG1hc2smRVZfRVJSKT8iRVZfRVJSIjoiIiwKCSAgKGV2ZW50bWFzayZFVl9SSU5HKT8iRVZfUklORyI6IiIsCgkgIChldmVudG1hc2smRVZfUkxTRCk/IkVWX1JMU0QiOiIiLAoJICAoZXZlbnRtYXNrJkVWX1JYQ0hBUik/IkVWX1JYQ0hBUiI6IiIsCgkgIChldmVudG1hc2smRVZfUlhGTEFHKT8iRVZfUlhGTEFHIjoiIiwKCSAgKGV2ZW50bWFzayZFVl9UWEVNUFRZKT8iRVZfVFhFTVBUWSI6IiIpOwoJICAKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbU1hc2sJKEtFUk5FTDMyLjQ1MSkKICovCkJPT0wgV0lOQVBJIFNldENvbW1NYXNrKElOVCBoYW5kbGUsRFdPUkQgZXZ0bWFzaykKewogICAgaW50IGZkOwoKICAgIFRSQUNFKCJoYW5kbGUgJWQsIG1hc2sgJWx4XG4iLCBoYW5kbGUsIGV2dG1hc2spOwogICAgVFJBQ0UoIiVzJXMlcyVzJXMlcyVzJXMlc1xuIiwKCSAgKGV2dG1hc2smRVZfQlJFQUspPyJFVl9CUkVBSyI6IiIsCgkgIChldnRtYXNrJkVWX0NUUyk/IkVWX0NUUyI6IiIsCgkgIChldnRtYXNrJkVWX0RTUik/IkVWX0RTUiI6IiIsCgkgIChldnRtYXNrJkVWX0VSUik/IkVWX0VSUiI6IiIsCgkgIChldnRtYXNrJkVWX1JJTkcpPyJFVl9SSU5HIjoiIiwKCSAgKGV2dG1hc2smRVZfUkxTRCk/IkVWX1JMU0QiOiIiLAoJICAoZXZ0bWFzayZFVl9SWENIQVIpPyJFVl9SWENIQVIiOiIiLAoJICAoZXZ0bWFzayZFVl9SWEZMQUcpPyJFVl9SWEZMQUciOiIiLAoJICAoZXZ0bWFzayZFVl9UWEVNUFRZKT8iRVZfVFhFTVBUWSI6IiIpOwoJICAKICAgIGlmKDA+KGZkPUNPTU1fR2V0V3JpdGVGZChoYW5kbGUpKSkgewogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGNsb3NlKGZkKTsKICAgIGV2ZW50bWFzayA9IGV2dG1hc2s7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1TdGF0ZSAgICAoS0VSTkVMMzIuNDUyKQogKi8KQk9PTCBXSU5BUEkgU2V0Q29tbVN0YXRlKElOVCBoYW5kbGUsTFBEQ0IgbHBkY2IpCnsKICAgICBzdHJ1Y3QgdGVybWlvcyBwb3J0OwogICAgIGludCBmZDsKCiAgICAgVFJBQ0UoImhhbmRsZSAlZCwgcHRyICVwXG4iLCBoYW5kbGUsIGxwZGNiKTsKICAgICBUUkFDRSgiYnl0ZXNpemUgJWQgYmF1ZHJhdGUgJWxkIGZQYXJpdHkgJWQgUGFyaXR5ICVkIHN0b3BiaXRzICVkXG4iLAoJICAgbHBkY2ItPkJ5dGVTaXplLGxwZGNiLT5CYXVkUmF0ZSxscGRjYi0+ZlBhcml0eSwgbHBkY2ItPlBhcml0eSwKCSAgIChscGRjYi0+U3RvcEJpdHMgPT0gT05FU1RPUEJJVCk/MToKCSAgIChscGRjYi0+U3RvcEJpdHMgPT0gVFdPU1RPUEJJVFMpPzI6MCk7CiAgICAgVFJBQ0UoIiVzICVzXG4iLChscGRjYi0+ZkluWCk/IklYT04iOiJ+SVhPTiIsCgkgICAobHBkY2ItPmZPdXRYKT8iSVhPRkYiOiJ+SVhPRkYiKTsKCiAgICAgaWYgKChmZCA9IENPTU1fR2V0V3JpdGVGZChoYW5kbGUpKSA8IDApIHJldHVybiBGQUxTRTsKCiAgICAgaWYgKCh0Y2dldGF0dHIoZmQsJnBvcnQpKSA9PSAtMSkgewogICAgICAgICBpbnQgc2F2ZV9lcnJvciA9IGVycm5vOwogICAgICAgICBjb21tZXJyb3IgPSBXaW5FcnJvcigpOwogICAgICAgICBjbG9zZSggZmQgKTsKI2lmZGVmIEhBVkVfU1RSRVJST1IKICAgICAgICAgRVJSKCJ0Y2dldGF0dHIgZXJyb3IgJyVzJ1xuIiwgc3RyZXJyb3Ioc2F2ZV9lcnJvcikpOwojZWxzZQogICAgICAgICBFUlIoInRjZ2V0YXR0ciBlcnJvciAlZFxuIiwgc2F2ZV9lcnJvcik7CiNlbmRpZgogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQoKCXBvcnQuY19jY1tWTUlOXSA9IDA7Cglwb3J0LmNfY2NbVlRJTUVdID0gMTsKCiNpZmRlZiBJTUFYQkVMCglwb3J0LmNfaWZsYWcgJj0gfihJU1RSSVB8QlJLSU5UfElHTkNSfElDUk5MfElOTENSfElNQVhCRUwpOwojZWxzZQoJcG9ydC5jX2lmbGFnICY9IH4oSVNUUklQfEJSS0lOVHxJR05DUnxJQ1JOTHxJTkxDUik7CiNlbmRpZgoJcG9ydC5jX2lmbGFnIHw9IChJR05CUkspOwoKCXBvcnQuY19vZmxhZyAmPSB+KE9QT1NUKTsKCglwb3J0LmNfY2ZsYWcgJj0gfihIVVBDTCk7Cglwb3J0LmNfY2ZsYWcgfD0gQ0xPQ0FMIHwgQ1JFQUQ7CgoJcG9ydC5jX2xmbGFnICY9IH4oSUNBTk9OfEVDSE98SVNJRyk7Cglwb3J0LmNfbGZsYWcgfD0gTk9GTFNIOwoKICAgICAvKgogICAgICoqIE1KTSAtIHJlbW92ZWQgZGVmYXVsdCBiYXVkcmF0ZSBzZXR0aW5ncwogICAgICoqIFRSQUNFKGNvbW0sImJhdWRyYXRlICVsZFxuIixscGRjYi0+QmF1ZFJhdGUpOwogICAgICovCiNpZmRlZiBDQkFVRAoJcG9ydC5jX2NmbGFnICY9IH5DQkFVRDsKCXN3aXRjaCAobHBkY2ItPkJhdWRSYXRlKSB7CgkJY2FzZSAxMTA6CgkJY2FzZSBDQlJfMTEwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjExMDsKCQkJYnJlYWs7CQkKCQljYXNlIDMwMDoKCQljYXNlIENCUl8zMDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMzAwOwoJCQlicmVhazsJCQoJCWNhc2UgNjAwOgoJCWNhc2UgQ0JSXzYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI2MDA7CgkJCWJyZWFrOwkJCgkJY2FzZSAxMjAwOgoJCWNhc2UgQ0JSXzEyMDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTIwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDI0MDA6CgkJY2FzZSBDQlJfMjQwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIyNDAwOwoJCQlicmVhazsJCQoJCWNhc2UgNDgwMDoKCQljYXNlIENCUl80ODAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjQ4MDA7CgkJCWJyZWFrOwkJCgkJY2FzZSA5NjAwOgoJCWNhc2UgQ0JSXzk2MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCOTYwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDE5MjAwOgoJCWNhc2UgQ0JSXzE5MjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjE5MjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMzg0MDA6CgkJY2FzZSBDQlJfMzg0MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMzg0MDA7CgkJCWJyZWFrOwkJCiNpZmRlZiBCNTc2MDAKCQljYXNlIDU3NjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjU3NjAwOwoJCQlicmVhazsJCQojZW5kaWYKI2lmZGVmIEIxMTUyMDAKCQljYXNlIDExNTIwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMTUyMDA7CgkJCWJyZWFrOwkJCiNlbmRpZgojaWZkZWYgQjIzMDQwMAoJCWNhc2UgMjMwNDAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjIzMDQwMDsKCQkJYnJlYWs7CQkKI2VuZGlmCiNpZmRlZiBCNDYwODAwCgkJY2FzZSA0NjA2MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNDYwODAwOwoJCQlicmVhazsJCQojZW5kaWYKICAgICAgIAkgICAgICAgIGRlZmF1bHQ6CgkJCWNvbW1lcnJvciA9IElFX0JBVURSQVRFOwoJCQljbG9zZSggZmQgKTsKCQkJRVJSKCJiYXVkcmF0ZSAlbGRcbiIsbHBkY2ItPkJhdWRSYXRlKTsKCQkJcmV0dXJuIEZBTFNFOwoJfQojZWxpZiAhZGVmaW5lZChfX0VNWF9fKQogICAgICAgIHN3aXRjaCAobHBkY2ItPkJhdWRSYXRlKSB7CiAgICAgICAgICAgICAgICBjYXNlIDExMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzExMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxMTA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAzMDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8zMDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMzAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgNjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfNjAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjYwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDEyMDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8xMjAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjEyMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAyNDAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMjQwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIyNDAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgNDgwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzQ4MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCNDgwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDk2MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl85NjAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjk2MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxOTIwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzE5MjAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjE5MjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMzg0MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8zODQwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIzODQwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICBjb21tZXJyb3IgPSBJRV9CQVVEUkFURTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoIGZkICk7CgkJCUVSUigiYmF1ZHJhdGUgJWQgXG4iLGxwZGNiLT5CYXVkUmF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICB9CiAgICAgICAgcG9ydC5jX2lzcGVlZCA9IHBvcnQuY19vc3BlZWQ7CiNlbmRpZgoJcG9ydC5jX2NmbGFnICY9IH5DU0laRTsKCXN3aXRjaCAobHBkY2ItPkJ5dGVTaXplKSB7CgkJY2FzZSA1OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M1OwoJCQlicmVhazsKCQljYXNlIDY6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzY7CgkJCWJyZWFrOwoJCWNhc2UgNzoKCQkJcG9ydC5jX2NmbGFnIHw9IENTNzsKCQkJYnJlYWs7CgkJY2FzZSA4OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M4OwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQljb21tZXJyb3IgPSBJRV9CWVRFU0laRTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoIGZkICk7CgkJCUVSUigiQnl0ZVNpemVcbiIpOwoJCQlyZXR1cm4gRkFMU0U7Cgl9CgoJcG9ydC5jX2NmbGFnICY9IH4oUEFSRU5CIHwgUEFST0REKTsKCWlmIChscGRjYi0+ZlBhcml0eSkKICAgICAgICAgICAgcG9ydC5jX2lmbGFnIHw9IElOUENLOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcG9ydC5jX2lmbGFnICY9IH5JTlBDSzsKICAgICAgICBzd2l0Y2ggKGxwZGNiLT5QYXJpdHkpIHsKICAgICAgICAgICAgICAgIGNhc2UgTk9QQVJJVFk6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBPRERQQVJJVFk6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19jZmxhZyB8PSAoUEFSRU5CIHwgUEFST0REKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIEVWRU5QQVJJVFk6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19jZmxhZyB8PSBQQVJFTkI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVycm9yID0gSUVfQllURVNJWkU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCBmZCApOwoJCQlFUlIoIlBhcml0eVxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICB9CgkKCglzd2l0Y2ggKGxwZGNiLT5TdG9wQml0cykgewoJCWNhc2UgT05FU1RPUEJJVDoKCQkJCXBvcnQuY19jZmxhZyAmPSB+Q1NUT1BCOwoJCQkJYnJlYWs7CgkJY2FzZSBUV09TVE9QQklUUzoKCQkJCXBvcnQuY19jZmxhZyB8PSBDU1RPUEI7CgkJCQlicmVhazsKCQlkZWZhdWx0OgoJCQljb21tZXJyb3IgPSBJRV9CWVRFU0laRTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoIGZkICk7CgkJCUVSUigiU3RvcEJpdHNcbiIpOwoJCQlyZXR1cm4gRkFMU0U7Cgl9CiNpZmRlZiBDUlRTQ1RTCglpZiAoCWxwZGNiLT5mT3V0eEN0c0Zsb3cgCQkJfHwKCQlscGRjYi0+ZkR0ckNvbnRyb2wgPT0gRFRSX0NPTlRST0xfRU5BQkxFfHwKCQlscGRjYi0+ZlJ0c0NvbnRyb2wgPT0gUlRTX0NPTlRST0xfRU5BQkxFCgkpIAoJICB7CgkgICAgcG9ydC5jX2NmbGFnIHw9IENSVFNDVFM7CgkgICAgVFJBQ0UoIkNSVFNDVFNcbiIpOwoJICB9CgkKCWlmIChscGRjYi0+ZkR0ckNvbnRyb2wgPT0gRFRSX0NPTlRST0xfRElTQUJMRSkKCSAgewoJICAgIHBvcnQuY19jZmxhZyAmPSB+Q1JUU0NUUzsKCSAgICBUUkFDRSgifkNSVFNDVFNcbiIpOwoJICB9CgojZW5kaWYJCglpZiAobHBkY2ItPmZJblgpCgkJcG9ydC5jX2lmbGFnIHw9IElYT047CgllbHNlCgkJcG9ydC5jX2lmbGFnICY9IH5JWE9OOwoJaWYgKGxwZGNiLT5mT3V0WCkKCQlwb3J0LmNfaWZsYWcgfD0gSVhPRkY7CgllbHNlCgkJcG9ydC5jX2lmbGFnICY9IH5JWE9GRjsKCglpZiAodGNzZXRhdHRyKGZkLFRDU0FOT1csJnBvcnQpPT0tMSkgeyAvKiBvdGhlcndpc2UgaXQgaGFuZ3Mgd2l0aCBwZW5kaW5nIGlucHV0Ki8KCSAgICAgICAgaW50IHNhdmVfZXJyb3I9ZXJybm87CgkJY29tbWVycm9yID0gV2luRXJyb3IoKTsJCiAgICAgICAgICAgICAgICBjbG9zZSggZmQgKTsKI2lmZGVmIEhBVkVfU1RSRVJST1IKICAgICAgICAgICAgICAgIEVSUigidGNnZXRhdHRyIGVycm9yICclcydcbiIsIHN0cmVycm9yKHNhdmVfZXJyb3IpKTsKI2Vsc2UKICAgICAgICAgICAgICAgIEVSUigidGNnZXRhdHRyIGVycm9yICVkXG4iLCBzYXZlX2Vycm9yKTsKI2VuZGlmCgkJcmV0dXJuIEZBTFNFOwoJfSBlbHNlIHsKCQljb21tZXJyb3IgPSAwOwogICAgICAgICAgICAgICAgY2xvc2UoIGZkICk7CgkJcmV0dXJuIFRSVUU7Cgl9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbVN0YXRlCShLRVJORUwzMi4xNTkpCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tU3RhdGUoSU5UIGhhbmRsZSwgTFBEQ0IgbHBkY2IpCnsKICAgICBzdHJ1Y3QgdGVybWlvcyBwb3J0OwogICAgIGludCBmZCxzcGVlZDsKCiAgICAgVFJBQ0UoImhhbmRsZSAlZCwgcHRyICVwXG4iLCBoYW5kbGUsIGxwZGNiKTsKCiAgICAgaWYgKChmZCA9IENPTU1fR2V0UmVhZEZkKGhhbmRsZSkpIDwgMCkgCiAgICAgICB7CgkgRVJSKCJjYW4ndCBnZXQgQ09NTV9HZXRSZWFkRmRcbiIpOwoJIHJldHVybiBGQUxTRTsKICAgICAgIH0KICAgICBpZiAodGNnZXRhdHRyKGZkLCAmcG9ydCkgPT0gLTEpIHsKICAgICAgICAgICAgICAgIGludCBzYXZlX2Vycm9yPWVycm5vOwojaWZkZWYgSEFWRV9TVFJFUlJPUgogICAgICAgICAgICAgICAgRVJSKCJ0Y2dldGF0dHIgZXJyb3IgJyVzJ1xuIiwgc3RyZXJyb3Ioc2F2ZV9lcnJvcikpOwojZWxzZQogICAgICAgICAgICAgICAgRVJSKCJ0Y2dldGF0dHIgZXJyb3IgJWRcbiIsIHNhdmVfZXJyb3IpOwojZW5kaWYKCQljb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKICAgICAgICAgICAgICAgIGNsb3NlKCBmZCApOwoJCXJldHVybiBGQUxTRTsKCX0KICAgICBjbG9zZSggZmQgKTsKI2lmbmRlZiBfX0VNWF9fCiNpZmRlZiBDQkFVRAogICAgIHNwZWVkPSAocG9ydC5jX2NmbGFnICYgQ0JBVUQpOwojZWxzZQogICAgIHNwZWVkPSAoY2ZnZXRvc3BlZWQoJnBvcnQpKTsKI2VuZGlmCiAgICAgc3dpdGNoIChzcGVlZCkgewoJCWNhc2UgQjExMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTEwOwoJCQlicmVhazsKCQljYXNlIEIzMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDMwMDsKCQkJYnJlYWs7CgkJY2FzZSBCNjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA2MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjEyMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDEyMDA7CgkJCWJyZWFrOwoJCWNhc2UgQjI0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDI0MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjQ4MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDQ4MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjk2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDk2MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjE5MjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxOTIwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMzg0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDM4NDAwOwoJCQlicmVhazsKI2lmZGVmIEI1NzYwMAoJCWNhc2UgQjU3NjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA1NzYwMDsKCQkJYnJlYWs7CQkKI2VuZGlmCiNpZmRlZiBCMTE1MjAwCgkJY2FzZSBCMTE1MjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxMTUyMDA7CgkJCWJyZWFrOwkJCiNlbmRpZgojaWZkZWYgQjIzMDQwMAogICAgICAgICAgICAgICAgY2FzZSBCMjMwNDAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAyMzA0MDA7CgkJCWJyZWFrOwkJCiNlbmRpZgojaWZkZWYgQjQ2MDgwMAogICAgICAgICAgICAgICAgY2FzZSBCNDYwODAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA0NjA4MDA7CgkJCWJyZWFrOwkJCiNlbmRpZgoJICAgICAgICBkZWZhdWx0OgoJCSAgICAgICAgRVJSKCJ1bmtub3duIHNwZWVkICV4IFxuIixzcGVlZCk7Cgl9CiNlbmRpZgoJc3dpdGNoIChwb3J0LmNfY2ZsYWcgJiBDU0laRSkgewoJCWNhc2UgQ1M1OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA1OwoJCQlicmVhazsKCQljYXNlIENTNjoKCQkJbHBkY2ItPkJ5dGVTaXplID0gNjsKCQkJYnJlYWs7CgkJY2FzZSBDUzc6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDc7CgkJCWJyZWFrOwoJCWNhc2UgQ1M4OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA4OwoJCQlicmVhazsKCSAgICAgICAgZGVmYXVsdDoKCQkgICAgICAgIEVSUigidW5rbm93biBzaXplICV4IFxuIixwb3J0LmNfY2ZsYWcgJiBDU0laRSk7Cgl9CQoJCiAgICAgICAgaWYocG9ydC5jX2lmbGFnICYgSU5QQ0spCiAgICAgICAgICAgIGxwZGNiLT5mUGFyaXR5ID0gVFJVRTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxwZGNiLT5mUGFyaXR5ID0gRkFMU0U7Cglzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIChQQVJFTkIgfCBQQVJPREQpKSB7CgkJY2FzZSAwOgoJCQlscGRjYi0+UGFyaXR5ID0gTk9QQVJJVFk7CgkJCWJyZWFrOwoJCWNhc2UgUEFSRU5COgoJCQlscGRjYi0+UGFyaXR5ID0gRVZFTlBBUklUWTsKCQkJYnJlYWs7CgkJY2FzZSAoUEFSRU5CIHwgUEFST0REKToKCQkJbHBkY2ItPlBhcml0eSA9IE9ERFBBUklUWTsJCQoJCQlicmVhazsKCX0KCglpZiAocG9ydC5jX2NmbGFnICYgQ1NUT1BCKQoJCWxwZGNiLT5TdG9wQml0cyA9IFRXT1NUT1BCSVRTOwoJZWxzZQoJCWxwZGNiLT5TdG9wQml0cyA9IE9ORVNUT1BCSVQ7CgoJbHBkY2ItPmZOdWxsID0gMDsKCWxwZGNiLT5mQmluYXJ5ID0gMTsKCiNpZmRlZiBDUlRTQ1RTCgoJaWYgKHBvcnQuY19jZmxhZyAmIENSVFNDVFMpIHsKCQlscGRjYi0+ZkR0ckNvbnRyb2wgPSBEVFJfQ09OVFJPTF9FTkFCTEU7CgkJbHBkY2ItPmZSdHNDb250cm9sID0gUlRTX0NPTlRST0xfRU5BQkxFOwoJCWxwZGNiLT5mT3V0eEN0c0Zsb3cgPSAxOwoJCWxwZGNiLT5mT3V0eERzckZsb3cgPSAxOwoJfSBlbHNlIAojZW5kaWYKCXsKCQlscGRjYi0+ZkR0ckNvbnRyb2wgPSBEVFJfQ09OVFJPTF9ESVNBQkxFOwoJCWxwZGNiLT5mUnRzQ29udHJvbCA9IFJUU19DT05UUk9MX0RJU0FCTEU7Cgl9CglpZiAocG9ydC5jX2lmbGFnICYgSVhPTikKCQlscGRjYi0+ZkluWCA9IDE7CgllbHNlCgkJbHBkY2ItPmZJblggPSAwOwoKCWlmIChwb3J0LmNfaWZsYWcgJiBJWE9GRikKCQlscGRjYi0+Zk91dFggPSAxOwoJZWxzZQoJCWxwZGNiLT5mT3V0WCA9IDA7Ci8qCglscGRjYi0+WG9uQ2hhciA9IAoJbHBkY2ItPlhvZmZDaGFyID0gCiAqLwoJbHBkY2ItPlhvbkxpbSA9IDEwOwoJbHBkY2ItPlhvZmZMaW0gPSAxMDsKCgljb21tZXJyb3IgPSAwOwoKICAgICAgICBUUkFDRSgiT0tcbiIpOwogCglUUkFDRSgiYnl0ZXNpemUgJWQgYmF1ZHJhdGUgJWxkIGZQYXJpdHkgJWQgUGFyaXR5ICVkIHN0b3BiaXRzICVkXG4iLAoJICAgICAgbHBkY2ItPkJ5dGVTaXplLGxwZGNiLT5CYXVkUmF0ZSxscGRjYi0+ZlBhcml0eSwgbHBkY2ItPlBhcml0eSwKCSAgICAgIChscGRjYi0+U3RvcEJpdHMgPT0gT05FU1RPUEJJVCk/MToKCSAgICAgIChscGRjYi0+U3RvcEJpdHMgPT0gVFdPU1RPUEJJVFMpPzI6MCk7CglUUkFDRSgiJXMgJXNcbiIsKGxwZGNiLT5mSW5YKT8iSVhPTiI6In5JWE9OIiwKCSAgICAgIChscGRjYi0+Zk91dFgpPyJJWE9GRiI6In5JWE9GRiIpOwojaWZkZWYgQ1JUU0NUUwoJaWYgKAlscGRjYi0+Zk91dHhDdHNGbG93IAkJCXx8CgkJbHBkY2ItPmZEdHJDb250cm9sID09IERUUl9DT05UUk9MX0VOQUJMRXx8CgkJbHBkY2ItPmZSdHNDb250cm9sID09IFJUU19DT05UUk9MX0VOQUJMRQoJCSkgCgkgIFRSQUNFKCJDUlRTQ1RTXG4iKTsKCQoJaWYgKGxwZGNiLT5mRHRyQ29udHJvbCA9PSBEVFJfQ09OVFJPTF9ESVNBQkxFKQoJICBUUkFDRSgifkNSVFNDVFNcbiIpOwoJCiNlbmRpZgkKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJVHJhbnNtaXRDb21tQ2hhcgkoS0VSTkVMMzIuNTM1KQogKi8KQk9PTCBXSU5BUEkgVHJhbnNtaXRDb21tQ2hhcihJTlQgY2lkLENIQVIgY2hUcmFuc21pdCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlGSVhNRSgiKCVkLCclYycpLCB1c2Ugd2luMzIgaGFuZGxlIVxuIixjaWQsY2hUcmFuc21pdCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWlmIChwdHItPnN1c3BlbmRlZCkgewoJCXB0ci0+Y29tbWVycm9yID0gSUVfSEFSRFdBUkU7CgkJcmV0dXJuIEZBTFNFOwoJfQoJaWYgKHdyaXRlKHB0ci0+ZmQsICh2b2lkICopICZjaFRyYW5zbWl0LCAxKSA9PSAtMSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsKCQlyZXR1cm4gRkFMU0U7Cgl9ICBlbHNlIHsKCQlwdHItPmNvbW1lcnJvciA9IDA7CgkJcmV0dXJuIFRSVUU7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tVGltZW91dHMJCShLRVJORUwzMi4xNjApCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tVGltZW91dHMoSU5UIGNpZCxMUENPTU1USU1FT1VUUyBscHRpbWVvdXRzKQp7CglGSVhNRSgiKCV4LCVwKTpzdHViLlxuIixjaWQsbHB0aW1lb3V0cyk7CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1UaW1lb3V0cwkJKEtFUk5FTDMyLjQ1MykKICovCkJPT0wgV0lOQVBJIFNldENvbW1UaW1lb3V0cyhJTlQgY2lkLExQQ09NTVRJTUVPVVRTIGxwdGltZW91dHMpIHsKCUZJWE1FKCIoJXgsJXApOnN0dWIuXG4iLGNpZCxscHRpbWVvdXRzKTsKCVRSQUNFKCJSZWFkSW50ZXJ2YWxUaW1lb3V0ICVsZFxuIixscHRpbWVvdXRzLT5SZWFkSW50ZXJ2YWxUaW1lb3V0KTsKCVRSQUNFKCJSZWFkVG90YWxUaW1lb3V0TXVsdGlwbGllciAlbGRcbiIsCgkgICAgICBscHRpbWVvdXRzLT5SZWFkVG90YWxUaW1lb3V0TXVsdGlwbGllcik7CglUUkFDRSgiUmVhZFRvdGFsVGltZW91dENvbnN0YW50ICVsZFxuIiwKCSAgICAgIGxwdGltZW91dHMtPlJlYWRUb3RhbFRpbWVvdXRDb25zdGFudCk7CglUUkFDRSgiV3JpdGVUb3RhbFRpbWVvdXRNdWx0aXBsaWVyICVsZFxuIiwKCSAgICAgIGxwdGltZW91dHMtPldyaXRlVG90YWxUaW1lb3V0TXVsdGlwbGllcik7CglUUkFDRSgiV3JpdGVUb3RhbFRpbWVvdXRDb25zdGFudCAlbGRcbiIsCgkgICAgICBscHRpbWVvdXRzLT5Xcml0ZVRvdGFsVGltZW91dENvbnN0YW50KTsKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldENvbW1Nb2RlbVN0YXR1cyAgIChLRVJORUwzMi4yODUpCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tTW9kZW1TdGF0dXMoSEFORExFIGhGaWxlLExQRFdPUkQgbHBNb2RlbVN0YXQgKQp7CglpbnQgZmQsbXN0YXQsIHJlc3VsdD1GQUxTRTsKCQoJKmxwTW9kZW1TdGF0PTA7CiNpZmRlZiBUSU9DTUdFVAoJZmQgPSBDT01NX0dldFdyaXRlRmQoaEZpbGUpOwoJaWYoZmQ8MCkKCQlyZXR1cm4gRkFMU0U7CglyZXN1bHQgPSBpb2N0bChmZCwgVElPQ01HRVQsICZtc3RhdCk7CgljbG9zZShmZCk7CglpZiAocmVzdWx0ID09IC0xKQoJICB7CgkgICAgVFJBQ0UoImlvY3RsIGZhaWxlZFxuIik7CgkgICAgcmV0dXJuIEZBTFNFOwoJICB9CglpZiAobXN0YXQgJiBUSU9DTV9DVFMpCgkgICAgKmxwTW9kZW1TdGF0IHw9IE1TX0NUU19PTjsKCWlmIChtc3RhdCAmIFRJT0NNX0RTUikKCSAgKmxwTW9kZW1TdGF0IHw9IE1TX0RTUl9PTjsKCWlmIChtc3RhdCAmIFRJT0NNX1JORykKCSAgKmxwTW9kZW1TdGF0IHw9IE1TX1JJTkdfT047CgkvKkZJWE1FOiAgTm90IHJlYWxseSBzdXJlIGFib3V0IFJMU0QgIFVCIDk5MDgxMCovCglpZiAobXN0YXQgJiBUSU9DTV9DQVIpCgkgICpscE1vZGVtU3RhdCB8PSBNU19STFNEX09OOwoJVFJBQ0UoIiVzJXMlcyVzXG4iLAoJICAgICAgKCpscE1vZGVtU3RhdCAmTVNfUkxTRF9PTik/Ik1TX1JMU0RfT04gIjoiIiwKCSAgICAgICgqbHBNb2RlbVN0YXQgJk1TX1JJTkdfT04pPyJNU19SSU5HX09OICI6IiIsCgkgICAgICAoKmxwTW9kZW1TdGF0ICZNU19EU1JfT04pPyJNU19EU1JfT04gIjoiIiwKCSAgICAgICgqbHBNb2RlbVN0YXQgJk1TX0NUU19PTik/Ik1TX0NUU19PTiAiOiIiKTsKCXJldHVybiBUUlVFOwojZWxzZQoJcmV0dXJuIEZBTFNFOwojZW5kaWYKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFdhaXRDb21tRXZlbnQgICAoS0VSTkVMMzIuNzE5KQogKi8KQk9PTCBXSU5BUEkgV2FpdENvbW1FdmVudChIQU5ETEUgaEZpbGUsTFBEV09SRCBldmVudG1hc2sgLExQT1ZFUkxBUFBFRCBvdmVybGFwcGVkKQp7CglGSVhNRSgiKCVkICVwICVwIClcbiIsaEZpbGUsIGV2ZW50bWFzayxvdmVybGFwcGVkKTsKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldENvbW1Qcm9wZXJ0aWVzICAgKEtFUk5FTDMyLj8/PykKICovCkJPT0wgV0lOQVBJIEdldENvbW1Qcm9wZXJ0aWVzKEhBTkRMRSBoRmlsZSwgTFBEQ0IgKmRjYikKewogICAgRklYTUUoIiglZCAlcCApXG4iLGhGaWxlLGRjYik7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBTZXRDb21tUHJvcGVydGllcyAgIChLRVJORUwzMi4/Pz8pCiAqLwpCT09MIFdJTkFQSSBTZXRDb21tUHJvcGVydGllcyhIQU5ETEUgaEZpbGUsIExQRENCIGRjYikKewogICAgRklYTUUoIiglZCAlcCApXG4iLGhGaWxlLGRjYik7CiAgICByZXR1cm4gVFJVRTsKfQoK