LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmlhcF9ldmVudC5jCiAqIFZlcnNpb246ICAgICAgIDAuMQogKiBEZXNjcmlwdGlvbjogICBJQVAgRmluaXRlIFN0YXRlIE1hY2hpbmUKICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgogKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIENyZWF0ZWQgYXQ6ICAgIFRodSBBdWcgMjEgMDA6MDI6MDcgMTk5NwogKiBNb2RpZmllZCBhdDogICBXZWQgTWFyICAxIDExOjI4OjM0IDIwMDAKICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKgogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk5LTIwMDAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwKICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CiAqCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgogKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXBfZXZlbnQuaD4KCnN0YXRpYyB2b2lkIHN0YXRlX3NfZGlzY29ubmVjdCAgIChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAoJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIHZvaWQgc3RhdGVfc19jb25uZWN0aW5nICAgKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCgkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOwpzdGF0aWMgdm9pZCBzdGF0ZV9zX2NhbGwgICAgICAgICAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CgpzdGF0aWMgdm9pZCBzdGF0ZV9zX21ha2VfY2FsbCAgICAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyB2b2lkIHN0YXRlX3NfY2FsbGluZyAgICAgIChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAoJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIHZvaWQgc3RhdGVfc19vdXRzdGFuZGluZyAgKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCgkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOwpzdGF0aWMgdm9pZCBzdGF0ZV9zX3JlcGx5aW5nICAgICAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyB2b2lkIHN0YXRlX3Nfd2FpdF9mb3JfY2FsbChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAoJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIHZvaWQgc3RhdGVfc193YWl0X2FjdGl2ZSAgKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCgkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOwoKc3RhdGljIHZvaWQgc3RhdGVfcl9kaXNjb25uZWN0ICAgKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCgkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOwpzdGF0aWMgdm9pZCBzdGF0ZV9yX2NhbGwgICAgICAgICAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyB2b2lkIHN0YXRlX3Jfd2FpdGluZyAgICAgIChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAoJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIHZvaWQgc3RhdGVfcl93YWl0X2FjdGl2ZSAgKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCgkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOwpzdGF0aWMgdm9pZCBzdGF0ZV9yX3JlY2VpdmluZyAgICAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyB2b2lkIHN0YXRlX3JfZXhlY3V0ZSAgICAgIChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAoJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIHZvaWQgc3RhdGVfcl9yZXR1cm5pbmcgICAgKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCgkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOwoKc3RhdGljIHZvaWQgKCppcmlhcF9zdGF0ZVtdKShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAoJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpID0gewoJLyogQ2xpZW50IEZTTSAqLwoJc3RhdGVfc19kaXNjb25uZWN0LAoJc3RhdGVfc19jb25uZWN0aW5nLAoJc3RhdGVfc19jYWxsLAoKCS8qIFMtQ2FsbCBGU00gKi8KCXN0YXRlX3NfbWFrZV9jYWxsLAoJc3RhdGVfc19jYWxsaW5nLAoJc3RhdGVfc19vdXRzdGFuZGluZywKCXN0YXRlX3NfcmVwbHlpbmcsCglzdGF0ZV9zX3dhaXRfZm9yX2NhbGwsCglzdGF0ZV9zX3dhaXRfYWN0aXZlLAoKCS8qIFNlcnZlciBGU00gKi8KCXN0YXRlX3JfZGlzY29ubmVjdCwKCXN0YXRlX3JfY2FsbCwKCgkvKiBSLUNvbm5lY3QgRlNNICovCglzdGF0ZV9yX3dhaXRpbmcsCglzdGF0ZV9yX3dhaXRfYWN0aXZlLAoJc3RhdGVfcl9yZWNlaXZpbmcsCglzdGF0ZV9yX2V4ZWN1dGUsCglzdGF0ZV9yX3JldHVybmluZywKfTsKCnZvaWQgaXJpYXBfbmV4dF9jbGllbnRfc3RhdGUoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9TVEFURSBzdGF0ZSkKewoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CgoJc2VsZi0+Y2xpZW50X3N0YXRlID0gc3RhdGU7Cn0KCnZvaWQgaXJpYXBfbmV4dF9jYWxsX3N0YXRlKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfU1RBVEUgc3RhdGUpCnsKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoKCXNlbGYtPmNhbGxfc3RhdGUgPSBzdGF0ZTsKfQoKdm9pZCBpcmlhcF9uZXh0X3NlcnZlcl9zdGF0ZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX1NUQVRFIHN0YXRlKQp7CglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKCglzZWxmLT5zZXJ2ZXJfc3RhdGUgPSBzdGF0ZTsKfQoKdm9pZCBpcmlhcF9uZXh0X3JfY29ubmVjdF9zdGF0ZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX1NUQVRFIHN0YXRlKQp7CglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKCglzZWxmLT5yX2Nvbm5lY3Rfc3RhdGUgPSBzdGF0ZTsKfQoKdm9pZCBpcmlhcF9kb19jbGllbnRfZXZlbnQoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CgoJKCppcmlhcF9zdGF0ZVsgc2VsZi0+Y2xpZW50X3N0YXRlXSkgKHNlbGYsIGV2ZW50LCBza2IpOwp9Cgp2b2lkIGlyaWFwX2RvX2NhbGxfZXZlbnQoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKCQkJIHN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoKCSgqaXJpYXBfc3RhdGVbIHNlbGYtPmNhbGxfc3RhdGVdKSAoc2VsZiwgZXZlbnQsIHNrYik7Cn0KCnZvaWQgaXJpYXBfZG9fc2VydmVyX2V2ZW50KHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCgkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoKCSgqaXJpYXBfc3RhdGVbIHNlbGYtPnNlcnZlcl9zdGF0ZV0pIChzZWxmLCBldmVudCwgc2tiKTsKfQoKdm9pZCBpcmlhcF9kb19yX2Nvbm5lY3RfZXZlbnQoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CgoJKCppcmlhcF9zdGF0ZVsgc2VsZi0+cl9jb25uZWN0X3N0YXRlXSkgKHNlbGYsIGV2ZW50LCBza2IpOwp9CgoKLyoKICogRnVuY3Rpb24gc3RhdGVfc19kaXNjb25uZWN0IChldmVudCwgc2tiKQogKgogKiAgICBTLURpc2Nvbm5lY3QsIFRoZSBkZXZpY2UgaGFzIG5vIExTQVAgY29ubmVjdGlvbiB0byBhIHBhcnRpY3VsYXIKICogICAgcmVtb3RlIGRldmljZS4KICovCnN0YXRpYyB2b2lkIHN0YXRlX3NfZGlzY29ubmVjdChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAoJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CgoJc3dpdGNoIChldmVudCkgewoJY2FzZSBJQVBfQ0FMTF9SRVFVRVNUX0dWQkM6CgkJaXJpYXBfbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgU19DT05ORUNUSU5HKTsKCQlJUkRBX0FTU0VSVChzZWxmLT5yZXF1ZXN0X3NrYiA9PSBOVUxMLCByZXR1cm47KTsKCQkvKiBEb24ndCBmb3JnZXQgdG8gcmVmY291bnQgaXQgLQoJCSAqIHNlZSBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVxdWVzdCgpLiAqLwoJCXNrYl9nZXQoc2tiKTsKCQlzZWxmLT5yZXF1ZXN0X3NrYiA9IHNrYjsKCQlpcmlhcF9jb25uZWN0X3JlcXVlc3Qoc2VsZik7CgkJYnJlYWs7CgljYXNlIElBUF9MTV9ESVNDT05ORUNUX0lORElDQVRJT046CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXywgZXZlbnQpOwoJCWJyZWFrOwoJfQp9CgovKgogKiBGdW5jdGlvbiBzdGF0ZV9zX2Nvbm5lY3RpbmcgKHNlbGYsIGV2ZW50LCBza2IpCiAqCiAqICAgIFMtQ29ubmVjdGluZwogKgogKi8Kc3RhdGljIHZvaWQgc3RhdGVfc19jb25uZWN0aW5nKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCgkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKCglzd2l0Y2ggKGV2ZW50KSB7CgljYXNlIElBUF9MTV9DT05ORUNUX0NPTkZJUk06CgkJLyoKCQkgKiAgSnVtcCB0byBTLUNhbGwgRlNNCgkJICovCgkJaXJpYXBfZG9fY2FsbF9ldmVudChzZWxmLCBJQVBfQ0FMTF9SRVFVRVNULCBza2IpOwoJCS8qIGlyaWFwX2NhbGxfcmVxdWVzdChzZWxmLCAwLDAsMCk7ICovCgkJaXJpYXBfbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgU19DQUxMKTsKCQlicmVhazsKCWNhc2UgSUFQX0xNX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKCQkvKiBBYm9ydCBjYWxscyAqLwoJCWlyaWFwX25leHRfY2FsbF9zdGF0ZShzZWxmLCBTX01BS0VfQ0FMTCk7CgkJaXJpYXBfbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgU19ESVNDT05ORUNUKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fLCBldmVudCk7CgkJYnJlYWs7Cgl9Cn0KCi8qCiAqIEZ1bmN0aW9uIHN0YXRlX3NfY2FsbCAoc2VsZiwgZXZlbnQsIHNrYikKICoKICogICAgUy1DYWxsLCBUaGUgZGV2aWNlIGNhbiBwcm9jZXNzIGNhbGxzIHRvIGEgc3BlY2lmaWMgcmVtb3RlCiAqICAgIGRldmljZS4gV2hlbmV2ZXIgdGhlIExTQVAgY29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQsIHRoaXMgc3RhdGUKICogICAgY2F0Y2hlcyB0aGF0IGV2ZW50IGFuZCBjbGVhcnMgdXAKICovCnN0YXRpYyB2b2lkIHN0YXRlX3NfY2FsbChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAoJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCglzd2l0Y2ggKGV2ZW50KSB7CgljYXNlIElBUF9MTV9ESVNDT05ORUNUX0lORElDQVRJT046CgkJLyogQWJvcnQgY2FsbHMgKi8KCQlpcmlhcF9uZXh0X2NhbGxfc3RhdGUoc2VsZiwgU19NQUtFX0NBTEwpOwoJCWlyaWFwX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIFNfRElTQ09OTkVDVCk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMCwgInN0YXRlX3NfY2FsbDogVW5rbm93biBldmVudCAlZFxuIiwgZXZlbnQpOwoJCWJyZWFrOwoJfQp9CgovKgogKiBGdW5jdGlvbiBzdGF0ZV9zX21ha2VfY2FsbCAoZXZlbnQsIHNrYikKICoKICogICAgUy1NYWtlLUNhbGwKICoKICovCnN0YXRpYyB2b2lkIHN0YXRlX3NfbWFrZV9jYWxsKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCgkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBza19idWZmICp0eF9za2I7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCglzd2l0Y2ggKGV2ZW50KSB7CgljYXNlIElBUF9DQUxMX1JFUVVFU1Q6CgkJLyogQWxyZWFkeSByZWZjb3VudGVkIC0gc2VlIHN0YXRlX3NfZGlzY29ubmVjdCgpICovCgkJdHhfc2tiID0gc2VsZi0+cmVxdWVzdF9za2I7CgkJc2VsZi0+cmVxdWVzdF9za2IgPSBOVUxMOwoKCQlpcmxtcF9kYXRhX3JlcXVlc3Qoc2VsZi0+bHNhcCwgdHhfc2tiKTsKCQlpcmlhcF9uZXh0X2NhbGxfc3RhdGUoc2VsZiwgU19PVVRTVEFORElORyk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXywgZXZlbnQpOwoJCWJyZWFrOwoJfQp9CgovKgogKiBGdW5jdGlvbiBzdGF0ZV9zX2NhbGxpbmcgKGV2ZW50LCBza2IpCiAqCiAqICAgIFMtQ2FsbGluZwogKgogKi8Kc3RhdGljIHZvaWQgc3RhdGVfc19jYWxsaW5nKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCgkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0RFQlVHKDAsICIlcygpLCBOb3QgaW1wbGVtZW50ZWRcbiIsIF9fRlVOQ1RJT05fXyk7Cn0KCi8qCiAqIEZ1bmN0aW9uIHN0YXRlX3Nfb3V0c3RhbmRpbmcgKGV2ZW50LCBza2IpCiAqCiAqICAgIFMtT3V0c3RhbmRpbmcsIFRoZSBkZXZpY2UgaXMgd2FpdGluZyBmb3IgYSByZXNwb25zZSB0byBhIGNvbW1hbmQKICoKICovCnN0YXRpYyB2b2lkIHN0YXRlX3Nfb3V0c3RhbmRpbmcoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKCQkJCXN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CgoJc3dpdGNoIChldmVudCkgewoJY2FzZSBJQVBfUkVDVl9GX0xTVDoKCQkvKmlyaWFwX3NlbmRfYWNrKHNlbGYpOyovCgkJLypMTV9JZGxlX3JlcXVlc3QoaWRsZSk7ICovCgoJCWlyaWFwX25leHRfY2FsbF9zdGF0ZShzZWxmLCBTX1dBSVRfRk9SX0NBTEwpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGV2ZW50KTsKCQlicmVhazsKCX0KfQoKLyoKICogRnVuY3Rpb24gc3RhdGVfc19yZXBseWluZyAoZXZlbnQsIHNrYikKICoKICogICAgUy1SZXBseWluZywgVGhlIGRldmljZSBpcyBjb2xsZWN0aW5nIGEgbXVsdGlwbGUgcGFydCByZXNwb25zZQogKi8Kc3RhdGljIHZvaWQgc3RhdGVfc19yZXBseWluZyhzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAoJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfREVCVUcoMCwgIiVzKCksIE5vdCBpbXBsZW1lbnRlZFxuIiwgX19GVU5DVElPTl9fKTsKfQoKLyoKICogRnVuY3Rpb24gc3RhdGVfc193YWl0X2Zvcl9jYWxsIChldmVudCwgc2tiKQogKgogKiAgICBTLVdhaXQtZm9yLUNhbGwKICoKICovCnN0YXRpYyB2b2lkIHN0YXRlX3Nfd2FpdF9mb3JfY2FsbChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAoJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0RFQlVHKDAsICIlcygpLCBOb3QgaW1wbGVtZW50ZWRcbiIsIF9fRlVOQ1RJT05fXyk7Cn0KCgovKgogKiBGdW5jdGlvbiBzdGF0ZV9zX3dhaXRfYWN0aXZlIChldmVudCwgc2tiKQogKgogKiAgICBTLVdhaXQtQWN0aXZlCiAqCiAqLwpzdGF0aWMgdm9pZCBzdGF0ZV9zX3dhaXRfYWN0aXZlKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCgkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0RFQlVHKDAsICIlcygpLCBOb3QgaW1wbGVtZW50ZWRcbiIsIF9fRlVOQ1RJT05fXyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgU2VydmVyIEZTTQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBGdW5jdGlvbiBzdGF0ZV9yX2Rpc2Nvbm5lY3QgKHNlbGYsIGV2ZW50LCBza2IpCiAqCiAqICAgIExNLUlBUyBzZXJ2ZXIgaXMgZGlzY29ubmVjdGVkIChub3QgcHJvY2Vzc2luZyBhbnkgcmVxdWVzdHMhKQogKgogKi8Kc3RhdGljIHZvaWQgc3RhdGVfcl9kaXNjb25uZWN0KHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCgkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOwoKCXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgSUFQX0xNX0NPTk5FQ1RfSU5ESUNBVElPTjoKCQl0eF9za2IgPSBhbGxvY19za2IoNjQsIEdGUF9BVE9NSUMpOwoJCWlmICh0eF9za2IgPT0gTlVMTCkgewoJCQlJUkRBX1dBUk5JTkcoIiVzOiB1bmFibGUgdG8gbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKCQkJcmV0dXJuOwoJCX0KCgkJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYX0NPTlRST0wgYW5kIExBUCBoZWFkZXIgKi8KCQlza2JfcmVzZXJ2ZSh0eF9za2IsIExNUF9NQVhfSEVBREVSKTsKCgkJaXJsbXBfY29ubmVjdF9yZXNwb25zZShzZWxmLT5sc2FwLCB0eF9za2IpOwoJCS8qTE1fSWRsZV9yZXF1ZXN0KGlkbGUpOyAqLwoKCQlpcmlhcF9uZXh0X3NlcnZlcl9zdGF0ZShzZWxmLCBSX0NBTEwpOwoKCQkvKgoJCSAqICBKdW1wIHRvIFItQ29ubmVjdCBGU00sIHdlIHNraXAgUi1XYWl0aW5nIHNpbmNlIHdlIGRvIG5vdAoJCSAqICBjYXJlIGFib3V0IExNX0lkbGVfcmVxdWVzdCgpIQoJCSAqLwoJCWlyaWFwX25leHRfcl9jb25uZWN0X3N0YXRlKHNlbGYsIFJfUkVDRUlWSU5HKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fLCBldmVudCk7CgkJYnJlYWs7Cgl9Cn0KCi8qCiAqIEZ1bmN0aW9uIHN0YXRlX3JfY2FsbCAoc2VsZiwgZXZlbnQsIHNrYikKICovCnN0YXRpYyB2b2lkIHN0YXRlX3JfY2FsbChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAoJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglzd2l0Y2ggKGV2ZW50KSB7CgljYXNlIElBUF9MTV9ESVNDT05ORUNUX0lORElDQVRJT046CgkJLyogQWJvcnQgY2FsbCAqLwoJCWlyaWFwX25leHRfc2VydmVyX3N0YXRlKHNlbGYsIFJfRElTQ09OTkVDVCk7CgkJaXJpYXBfbmV4dF9yX2Nvbm5lY3Rfc3RhdGUoc2VsZiwgUl9XQUlUSU5HKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5rbm93biBldmVudCFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJYnJlYWs7Cgl9Cn0KCi8qCiAqICBSLUNvbm5lY3QgRlNNCiAqLwoKLyoKICogRnVuY3Rpb24gc3RhdGVfcl93YWl0aW5nIChzZWxmLCBldmVudCwgc2tiKQogKi8Kc3RhdGljIHZvaWQgc3RhdGVfcl93YWl0aW5nKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCgkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0RFQlVHKDAsICIlcygpLCBOb3QgaW1wbGVtZW50ZWRcbiIsIF9fRlVOQ1RJT05fXyk7Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX3Jfd2FpdF9hY3RpdmUoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKCQkJCXN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfREVCVUcoMCwgIiVzKCksIE5vdCBpbXBsZW1lbnRlZFxuIiwgX19GVU5DVElPTl9fKTsKfQoKLyoKICogRnVuY3Rpb24gc3RhdGVfcl9yZWNlaXZpbmcgKHNlbGYsIGV2ZW50LCBza2IpCiAqCiAqICAgIFdlIGFyZSByZWNlaXZpbmcgYSBjb21tYW5kCiAqCiAqLwpzdGF0aWMgdm9pZCBzdGF0ZV9yX3JlY2VpdmluZyhzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAoJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgSUFQX1JFQ1ZfRl9MU1Q6CgkJaXJpYXBfbmV4dF9yX2Nvbm5lY3Rfc3RhdGUoc2VsZiwgUl9FWEVDVVRFKTsKCgkJaXJpYXBfY2FsbF9pbmRpY2F0aW9uKHNlbGYsIHNrYik7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMCwgIiVzKCksIHVua25vd24gZXZlbnQhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCWJyZWFrOwoJfQp9CgovKgogKiBGdW5jdGlvbiBzdGF0ZV9yX2V4ZWN1dGUgKHNlbGYsIGV2ZW50LCBza2IpCiAqCiAqICAgIFRoZSBzZXJ2ZXIgaXMgcHJvY2Vzc2luZyB0aGUgcmVxdWVzdAogKgogKi8Kc3RhdGljIHZvaWQgc3RhdGVfcl9leGVjdXRlKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCgkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoKCXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgSUFQX0NBTExfUkVTUE9OU0U6CgkJLyoKCQkgKiAgU2luY2Ugd2UgZG9uJ3QgaW1wbGVtZW50IHRoZSBXYWl0aW5nIHN0YXRlLCB3ZSByZXR1cm4KCQkgKiAgdG8gc3RhdGUgUmVjZWl2aW5nIGluc3RlYWQsIERCLgoJCSAqLwoJCWlyaWFwX25leHRfcl9jb25uZWN0X3N0YXRlKHNlbGYsIFJfUkVDRUlWSU5HKTsKCgkJLyogRG9uJ3QgZm9yZ2V0IHRvIHJlZmNvdW50IGl0IC0gc2VlCgkJICogaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3Jlc3BvbnNlKCkuICovCgkJc2tiX2dldChza2IpOwoKCQlpcmxtcF9kYXRhX3JlcXVlc3Qoc2VsZi0+bHNhcCwgc2tiKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5rbm93biBldmVudCFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJYnJlYWs7Cgl9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX3JfcmV0dXJuaW5nKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCgkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfREVCVUcoMCwgIiVzKCksIGV2ZW50PSVkXG4iLCBfX0ZVTkNUSU9OX18sIGV2ZW50KTsKCglzd2l0Y2ggKGV2ZW50KSB7CgljYXNlIElBUF9SRUNWX0ZfTFNUOgoJCWJyZWFrOwoJZGVmYXVsdDoKCQlicmVhazsKCX0KfQo=