LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmxhbl9jbGllbnQuYwogKiBWZXJzaW9uOiAgICAgICAwLjkKICogRGVzY3JpcHRpb246ICAgSXJEQSBMQU4gQWNjZXNzIFByb3RvY29sIChJckxBTikgQ2xpZW50CiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBTdW4gQXVnIDMxIDIwOjE0OjM3IDE5OTcKICogTW9kaWZpZWQgYXQ6ICAgVHVlIERlYyAxNCAxNTo0NzowMiAxOTk5CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogU291cmNlczogICAgICAgc2tlbGV0b24uYyBieSBEb25hbGQgQmVja2VyIDxiZWNrZXJAQ0VTRElTLmdzZmMubmFzYS5nb3Y+CiAqICAgICAgICAgICAgICAgIHNsaXAuYyBieSBMYXVyZW5jZSBDdWxoYW5lLCA8bG96QGhvbG1lcy5kZW1vbi5jby51az4KICogICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1d2FsdC5ubC5tdWduZXQub3JnPgogKgogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwKICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgogKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgojaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KI2luY2x1ZGUgPG5ldC9hcnAuaD4KCiNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJ0dHAuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhc19vYmplY3QuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS90aW1lci5oPgoKI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NvbW1vbi5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fZXZlbnQuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2V0aC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fcHJvdmlkZXIuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NsaWVudC5oPgoKI3VuZGVmIENPTkZJR19JUkxBTl9HUkFUVUlUT1VTX0FSUAoKc3RhdGljIHZvaWQgaXJsYW5fY2xpZW50X2N0cmxfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCgkJCQkJCSAgICBMTV9SRUFTT04gcmVhc29uLAoJCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKik7CnN0YXRpYyBpbnQgaXJsYW5fY2xpZW50X2N0cmxfZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCgkJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIHZvaWQgaXJsYW5fY2xpZW50X2N0cmxfY29ubmVjdF9jb25maXJtKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCgkJCQkJICAgICAgc3RydWN0IHFvc19pbmZvICpxb3MsCgkJCQkJICAgICAgX191MzIgbWF4X3NkdV9zaXplLAoJCQkJCSAgICAgIF9fdTggbWF4X2hlYWRlcl9zaXplLAoJCQkJCSAgICAgIHN0cnVjdCBza19idWZmICopOwpzdGF0aWMgdm9pZCBpcmxhbl9jaGVja19yZXNwb25zZV9wYXJhbShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIGNoYXIgKnBhcmFtLAoJCQkJICAgICAgIGNoYXIgKnZhbHVlLCBpbnQgdmFsX2xlbik7CnN0YXRpYyB2b2lkIGlybGFuX2NsaWVudF9vcGVuX2N0cmxfdHNhcChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpOwoKc3RhdGljIHZvaWQgaXJsYW5fY2xpZW50X2tpY2tfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQp7CglzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGRhdGE7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCgkvKgoJICogSWYgd2UgYXJlIGluIHBlZXIgbW9kZSwgdGhlIGNsaWVudCBtYXkgbm90IGhhdmUgZ290IHRoZSBkaXNjb3ZlcnkKCSAqIGluZGljYXRpb24gaXQgbmVlZHMgdG8gbWFrZSBwcm9ncmVzcy4gSWYgdGhlIGNsaWVudCBpcyBzdGlsbCBpbgoJICogSURMRSBzdGF0ZSwgd2UgbXVzdCBraWNrIGl0IHRvLCBidXQgb25seSBpZiB0aGUgcHJvdmlkZXIgaXMgbm90IElETEUKCSAqLwoJaWYgKChzZWxmLT5wcm92aWRlci5hY2Nlc3NfdHlwZSA9PSBBQ0NFU1NfUEVFUikgJiYKCSAgICAoc2VsZi0+Y2xpZW50LnN0YXRlID09IElSTEFOX0lETEUpICYmCgkgICAgKHNlbGYtPnByb3ZpZGVyLnN0YXRlICE9IElSTEFOX0lETEUpKSB7CgkJaXJsYW5fY2xpZW50X3dha2V1cChzZWxmLCBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIpOwoJfQp9CgpzdGF0aWMgdm9pZCBpcmxhbl9jbGllbnRfc3RhcnRfa2lja190aW1lcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIGludCB0aW1lb3V0KQp7CglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT5jbGllbnQua2lja190aW1lciwgdGltZW91dCwgKHZvaWQgKikgc2VsZiwKCQkJIGlybGFuX2NsaWVudF9raWNrX3RpbWVyX2V4cGlyZWQpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfd2FrZXVwIChzZWxmLCBzYWRkciwgZGFkZHIpCiAqCiAqICAgIFdha2UgdXAgY2xpZW50CiAqCiAqLwp2b2lkIGlybGFuX2NsaWVudF93YWtldXAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBfX3UzMiBzYWRkciwgX191MzIgZGFkZHIpCnsKCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgoJLyoKCSAqIENoZWNrIGlmIHdlIGFyZSBhbHJlYWR5IGF3YWtlLCBvciBpZiB3ZSBhcmUgYSBwcm92aWRlciBpbiBkaXJlY3QKCSAqIG1vZGUgKGluIHRoYXQgY2FzZSB3ZSBtdXN0IGxlYXZlIHRoZSBjbGllbnQgaWRsZQoJICovCglpZiAoKHNlbGYtPmNsaWVudC5zdGF0ZSAhPSBJUkxBTl9JRExFKSB8fAoJICAgIChzZWxmLT5wcm92aWRlci5hY2Nlc3NfdHlwZSA9PSBBQ0NFU1NfRElSRUNUKSkKCXsKCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgYWxyZWFkeSBhd2FrZSFcbiIsIF9fRlVOQ1RJT05fXyApOwoJCQlyZXR1cm47Cgl9CgoJLyogQWRkcmVzc2VzIG1heSBoYXZlIGNoYW5nZWQhICovCglzZWxmLT5zYWRkciA9IHNhZGRyOwoJc2VsZi0+ZGFkZHIgPSBkYWRkcjsKCglpZiAoc2VsZi0+ZGlzY29ubmVjdF9yZWFzb24gPT0gTE1fVVNFUl9SRVFVRVNUKSB7CgkJCUlSREFfREVCVUcoMCwgIiVzKCksIHN0aWxsIHN0b3BwZWQgYnkgdXNlclxuIiwgX19GVU5DVElPTl9fICk7CgkJCXJldHVybjsKCX0KCgkvKiBPcGVuIFRTQVBzICovCglpcmxhbl9jbGllbnRfb3Blbl9jdHJsX3RzYXAoc2VsZik7Cglpcmxhbl9vcGVuX2RhdGFfdHNhcChzZWxmKTsKCglpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fRElTQ09WRVJZX0lORElDQVRJT04sIE5VTEwpOwoKCS8qIFN0YXJ0IGtpY2sgdGltZXIgKi8KCWlybGFuX2NsaWVudF9zdGFydF9raWNrX3RpbWVyKHNlbGYsIDIqSFopOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9kaXNjb3ZlcnlfaW5kaWNhdGlvbiAoZGFkZHIpCiAqCiAqICAgIFJlbW90ZSBkZXZpY2Ugd2l0aCBJckxBTiBzZXJ2ZXIgc3VwcG9ydCBkaXNjb3ZlcmVkCiAqCiAqLwp2b2lkIGlybGFuX2NsaWVudF9kaXNjb3ZlcnlfaW5kaWNhdGlvbihkaXNjaW5mb190ICpkaXNjb3ZlcnksCgkJCQkgICAgICAgRElTQ09WRVJZX01PREUgbW9kZSwKCQkJCSAgICAgICB2b2lkICpwcml2KQp7CglzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CglfX3UzMiBzYWRkciwgZGFkZHI7CgoJSVJEQV9ERUJVRygxLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoZGlzY292ZXJ5ICE9IE5VTEwsIHJldHVybjspOwoKCS8qCgkgKiBJIGRpZG4ndCBjaGVjayBpdCwgYnV0IEkgYmV0IHRoYXQgSXJMQU4gc3VmZmVyIGZyb20gdGhlIHNhbWUKCSAqIGRlZmljaWVuY3kgYXMgSXJDb21tIGFuZCBkb2Vzbid0IGhhbmRsZSB0d28gaW5zdGFuY2VzCgkgKiBzaW11bHRhbmVvdXNseSBjb25uZWN0aW5nIHRvIGVhY2ggb3RoZXIuCgkgKiBTYW1lIHdvcmthcm91bmQsIGRyb3AgcGFzc2l2ZSBkaXNjb3Zlcmllcy4KCSAqIEplYW4gSUkgKi8KCWlmKG1vZGUgPT0gRElTQ09WRVJZX1BBU1NJVkUpCgkJcmV0dXJuOwoKCXNhZGRyID0gZGlzY292ZXJ5LT5zYWRkcjsKCWRhZGRyID0gZGlzY292ZXJ5LT5kYWRkcjsKCgkvKiBGaW5kIGluc3RhbmNlICovCglyY3VfcmVhZF9sb2NrKCk7CglzZWxmID0gaXJsYW5fZ2V0X2FueSgpOwoJaWYgKHNlbGYpIHsKCQlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgZ290byBvdXQ7KTsKCgkJSVJEQV9ERUJVRygxLCAiJXMoKSwgRm91bmQgaW5zdGFuY2UgKCUwOHgpIVxuIiwgX19GVU5DVElPTl9fICwKCQkgICAgICBkYWRkcik7CgoJCWlybGFuX2NsaWVudF93YWtldXAoc2VsZiwgc2FkZHIsIGRhZGRyKTsKCX0KSVJEQV9BU1NFUlRfTEFCRUwob3V0OikKCXJjdV9yZWFkX3VubG9jaygpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfZGF0YV9pbmRpY2F0aW9uIChoYW5kbGUsIHNrYikKICoKICogICAgVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBkYXRhIHRoYXQgaXMgcmVjZWl2ZWQgb24gdGhlIGNvbnRyb2wgY2hhbm5lbAogKgogKi8Kc3RhdGljIGludCBpcmxhbl9jbGllbnRfY3RybF9kYXRhX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtMTspOwoKCWlybGFuX2RvX2NsaWVudF9ldmVudChzZWxmLCBJUkxBTl9EQVRBX0lORElDQVRJT04sIHNrYik7CgoJLyogUmVhZHkgZm9yIGEgbmV3IGNvbW1hbmQgKi8KCUlSREFfREVCVUcoMiwgIiVzKCksIGNsZWFyaW5nIHR4X2J1c3lcbiIsIF9fRlVOQ1RJT05fXyApOwoJc2VsZi0+Y2xpZW50LnR4X2J1c3kgPSBGQUxTRTsKCgkvKiBDaGVjayBpZiB3ZSBoYXZlIHNvbWUgcXVldWVkIGNvbW1hbmRzIHdhaXRpbmcgdG8gYmUgc2VudCAqLwoJaXJsYW5fcnVuX2N0cmxfdHhfcXVldWUoc2VsZik7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIGlybGFuX2NsaWVudF9jdHJsX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJCQkgICAgTE1fUkVBU09OIHJlYXNvbiwKCQkJCQkJICAgIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSkKewoJc3RydWN0IGlybGFuX2NiICpzZWxmOwoJc3RydWN0IHRzYXBfY2IgKnRzYXA7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoKCUlSREFfREVCVUcoNCwgIiVzKCksIHJlYXNvbj0lZFxuIiwgX19GVU5DVElPTl9fICwgcmVhc29uKTsKCglzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKCXRzYXAgPSAoc3RydWN0IHRzYXBfY2IgKikgc2FwOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CglJUkRBX0FTU0VSVCh0c2FwICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQodHNhcC0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOwoKCUlSREFfQVNTRVJUKHRzYXAgPT0gc2VsZi0+Y2xpZW50LnRzYXBfY3RybCwgcmV0dXJuOyk7CgoJLyogUmVtb3ZlIGZyYW1lcyBxdWV1ZWQgb24gdGhlIGNvbnRyb2wgY2hhbm5lbCAqLwoJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2VsZi0+Y2xpZW50LnR4cSkpICE9IE5VTEwpIHsKCQlkZXZfa2ZyZWVfc2tiKHNrYik7Cgl9CglzZWxmLT5jbGllbnQudHhfYnVzeSA9IEZBTFNFOwoKCWlybGFuX2RvX2NsaWVudF9ldmVudChzZWxmLCBJUkxBTl9MTVBfRElTQ09OTkVDVCwgTlVMTCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9vcGVuX3RzYXBzIChzZWxmKQogKgogKiAgICBJbml0aWFsaXplIGNhbGxiYWNrcyBhbmQgb3BlbiBJclRUUCBUU0FQcwogKgogKi8Kc3RhdGljIHZvaWQgaXJsYW5fY2xpZW50X29wZW5fY3RybF90c2FwKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikKewoJc3RydWN0IHRzYXBfY2IgKnRzYXA7Cglub3RpZnlfdCBub3RpZnk7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCgkvKiBDaGVjayBpZiBhbHJlYWR5IG9wZW4gKi8KCWlmIChzZWxmLT5jbGllbnQudHNhcF9jdHJsKQoJCXJldHVybjsKCglpcmRhX25vdGlmeV9pbml0KCZub3RpZnkpOwoKCS8qIFNldCB1cCBjYWxsYmFja3MgKi8KCW5vdGlmeS5kYXRhX2luZGljYXRpb24gICAgICAgPSBpcmxhbl9jbGllbnRfY3RybF9kYXRhX2luZGljYXRpb247Cglub3RpZnkuY29ubmVjdF9jb25maXJtICAgICAgID0gaXJsYW5fY2xpZW50X2N0cmxfY29ubmVjdF9jb25maXJtOwoJbm90aWZ5LmRpc2Nvbm5lY3RfaW5kaWNhdGlvbiA9IGlybGFuX2NsaWVudF9jdHJsX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbjsKCW5vdGlmeS5pbnN0YW5jZSA9IHNlbGY7CglzdHJsY3B5KG5vdGlmeS5uYW1lLCAiSXJMQU4gY3RybCAoYykiLCBzaXplb2Yobm90aWZ5Lm5hbWUpKTsKCgl0c2FwID0gaXJ0dHBfb3Blbl90c2FwKExTQVBfQU5ZLCBERUZBVUxUX0lOSVRJQUxfQ1JFRElULCAmbm90aWZ5KTsKCWlmICghdHNhcCkgewoJCUlSREFfREVCVUcoMiwgIiVzKCksIEdvdCBubyB0c2FwIVxuIiwgX19GVU5DVElPTl9fICk7CgkJcmV0dXJuOwoJfQoJc2VsZi0+Y2xpZW50LnRzYXBfY3RybCA9IHRzYXA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9jb25uZWN0X2NvbmZpcm0gKGhhbmRsZSwgc2tiKQogKgogKiAgICBDb25uZWN0aW9uIHRvIHBlZXIgSXJMQU4gbGF5ZSBjb25maXJtZWQKICoKICovCnN0YXRpYyB2b2lkIGlybGFuX2NsaWVudF9jdHJsX2Nvbm5lY3RfY29uZmlybSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJCSAgICAgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLAoJCQkJCSAgICAgIF9fdTMyIG1heF9zZHVfc2l6ZSwKCQkJCQkgICAgICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKCQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJc2VsZiA9IChzdHJ1Y3QgaXJsYW5fY2IgKikgaW5zdGFuY2U7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCglzZWxmLT5jbGllbnQubWF4X3NkdV9zaXplID0gbWF4X3NkdV9zaXplOwoJc2VsZi0+Y2xpZW50Lm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZTsKCgkvKiBUT0RPOiB3ZSBjb3VsZCBzZXQgdGhlIE1UVSBkZXBlbmRpbmcgb24gdGhlIG1heF9zZHVfc2l6ZSAqLwoKCWlybGFuX2RvX2NsaWVudF9ldmVudChzZWxmLCBJUkxBTl9DT05ORUNUX0NPTVBMRVRFLCBOVUxMKTsKfQoKLyoKICogRnVuY3Rpb24gcHJpbnRfcmV0X2NvZGUgKGNvZGUpCiAqCiAqICAgIFByaW50IHJldHVybiBjb2RlIG9mIHJlcXVlc3QgdG8gcGVlciBJckxBTiBsYXllci4KICoKICovCnN0YXRpYyB2b2lkIHByaW50X3JldF9jb2RlKF9fdTggY29kZSkKewoJc3dpdGNoKGNvZGUpIHsKCWNhc2UgMDoKCQlwcmludGsoS0VSTl9JTkZPICJTdWNjZXNzXG4iKTsKCQlicmVhazsKCWNhc2UgMToKCQlJUkRBX1dBUk5JTkcoIklyTEFOOiBJbnN1ZmZpY2llbnQgcmVzb3VyY2VzXG4iKTsKCQlicmVhazsKCWNhc2UgMjoKCQlJUkRBX1dBUk5JTkcoIklyTEFOOiBJbnZhbGlkIGNvbW1hbmQgZm9ybWF0XG4iKTsKCQlicmVhazsKCWNhc2UgMzoKCQlJUkRBX1dBUk5JTkcoIklyTEFOOiBDb21tYW5kIG5vdCBzdXBwb3J0ZWRcbiIpOwoJCWJyZWFrOwoJY2FzZSA0OgoJCUlSREFfV0FSTklORygiSXJMQU46IFBhcmFtZXRlciBub3Qgc3VwcG9ydGVkXG4iKTsKCQlicmVhazsKCWNhc2UgNToKCQlJUkRBX1dBUk5JTkcoIklyTEFOOiBWYWx1ZSBub3Qgc3VwcG9ydGVkXG4iKTsKCQlicmVhazsKCWNhc2UgNjoKCQlJUkRBX1dBUk5JTkcoIklyTEFOOiBOb3Qgb3BlblxuIik7CgkJYnJlYWs7CgljYXNlIDc6CgkJSVJEQV9XQVJOSU5HKCJJckxBTjogQXV0aGVudGljYXRpb24gcmVxdWlyZWRcbiIpOwoJCWJyZWFrOwoJY2FzZSA4OgoJCUlSREFfV0FSTklORygiSXJMQU46IEludmFsaWQgcGFzc3dvcmRcbiIpOwoJCWJyZWFrOwoJY2FzZSA5OgoJCUlSREFfV0FSTklORygiSXJMQU46IFByb3RvY29sIGVycm9yXG4iKTsKCQlicmVhazsKCWNhc2UgMjU1OgoJCUlSREFfV0FSTklORygiSXJMQU46IEFzeW5jaHJvbm91cyBzdGF0dXNcbiIpOwoJCWJyZWFrOwoJfQp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfcGFyc2VfcmVzcG9uc2UgKHNlbGYsIHNrYikKICoKICogICAgRXh0cmFjdCBhbGwgcGFyYW1ldGVycyBmcm9tIHJlY2VpdmVkIGJ1ZmZlciwgdGhlbiBmZWVkIHRoZW0gdG8KICogICAgY2hlY2tfcGFyYW1zIGZvciBwYXJzaW5nCiAqLwp2b2lkIGlybGFuX2NsaWVudF9wYXJzZV9yZXNwb25zZShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCnsKCV9fdTggKmZyYW1lOwoJX191OCAqcHRyOwoJaW50IGNvdW50OwoJaW50IHJldDsKCV9fdTE2IHZhbF9sZW47CglpbnQgaTsKCWNoYXIgKm5hbWU7CgljaGFyICp2YWx1ZTsKCglJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKSBza2ItPmxlbj0lZFxuIiwgX19GVU5DVElPTl9fICwgKGludCkgc2tiLT5sZW4pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgoJaWYgKCFza2IpIHsKCQlJUkRBX0VSUk9SKCIlcygpLCBHb3QgTlVMTCBza2IhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybjsKCX0KCWZyYW1lID0gc2tiLT5kYXRhOwoKCS8qCgkgKiAgQ2hlY2sgcmV0dXJuIGNvZGUgYW5kIHByaW50IGl0IGlmIG5vdCBzdWNjZXNzCgkgKi8KCWlmIChmcmFtZVswXSkgewoJCXByaW50X3JldF9jb2RlKGZyYW1lWzBdKTsKCQlyZXR1cm47Cgl9CgoJbmFtZSA9IGttYWxsb2MoMjU1LCBHRlBfQVRPTUlDKTsKCWlmICghbmFtZSkKCQlyZXR1cm47Cgl2YWx1ZSA9IGttYWxsb2MoMTAxNiwgR0ZQX0FUT01JQyk7CglpZiAoIXZhbHVlKSB7CgkJa2ZyZWUobmFtZSk7CgkJcmV0dXJuOwoJfQoKCS8qIEhvdyBtYW55IHBhcmFtZXRlcnM/ICovCgljb3VudCA9IGZyYW1lWzFdOwoKCUlSREFfREVCVUcoNCwgIiVzKCksIGdvdCAlZCBwYXJhbWV0ZXJzXG4iLCBfX0ZVTkNUSU9OX18gLCBjb3VudCk7CgoJcHRyID0gZnJhbWUrMjsKCgkvKiBGb3IgYWxsIHBhcmFtZXRlcnMgKi8KCWZvciAoaT0wOyBpPGNvdW50O2krKykgewoJCXJldCA9IGlybGFuX2V4dHJhY3RfcGFyYW0ocHRyLCBuYW1lLCB2YWx1ZSwgJnZhbF9sZW4pOwoJCWlmIChyZXQgPCAwKSB7CgkJCUlSREFfREVCVUcoMiwgIiVzKCksIElyTEFOLCBFcnJvciFcbiIsIF9fRlVOQ1RJT05fXyApOwoJCQlicmVhazsKCQl9CgkJcHRyICs9IHJldDsKCQlpcmxhbl9jaGVja19yZXNwb25zZV9wYXJhbShzZWxmLCBuYW1lLCB2YWx1ZSwgdmFsX2xlbik7Cgl9CgkvKiBDbGVhbnVwICovCglrZnJlZShuYW1lKTsKCWtmcmVlKHZhbHVlKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fY2hlY2tfcmVzcG9uc2VfcGFyYW0gKHNlbGYsIHBhcmFtLCB2YWx1ZSwgdmFsX2xlbikKICoKICogICAgIENoZWNrIHdoaWNoIHBhcmFtZXRlciBpcyByZWNlaXZlZCBhbmQgdXBkYXRlIGxvY2FsIHZhcmlhYmxlcwogKgogKi8Kc3RhdGljIHZvaWQgaXJsYW5fY2hlY2tfcmVzcG9uc2VfcGFyYW0oc3RydWN0IGlybGFuX2NiICpzZWxmLCBjaGFyICpwYXJhbSwKCQkJCSAgICAgICBjaGFyICp2YWx1ZSwgaW50IHZhbF9sZW4pCnsKCV9fdTE2IHRtcF9jcHU7IC8qIFRlbXBvcmFyeSB2YWx1ZSBpbiBob3N0IG9yZGVyICovCglfX3U4ICpieXRlczsKCWludCBpOwoKCUlSREFfREVCVUcoNCwgIiVzKCksIHBhcm09JXNcbiIsIF9fRlVOQ1RJT05fXyAsIHBhcmFtKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKCS8qIE1lZGlhIHR5cGUgKi8KCWlmIChzdHJjbXAocGFyYW0sICJNRURJQSIpID09IDApIHsKCQlpZiAoc3RyY21wKHZhbHVlLCAiODAyLjMiKSA9PSAwKQoJCQlzZWxmLT5tZWRpYSA9IE1FRElBXzgwMl8zOwoJCWVsc2UKCQkJc2VsZi0+bWVkaWEgPSBNRURJQV84MDJfNTsKCQlyZXR1cm47Cgl9CglpZiAoc3RyY21wKHBhcmFtLCAiRklMVEVSX1RZUEUiKSA9PSAwKSB7CgkJaWYgKHN0cmNtcCh2YWx1ZSwgIkRJUkVDVEVEIikgPT0gMCkKCQkJc2VsZi0+Y2xpZW50LmZpbHRlcl90eXBlIHw9IElSTEFOX0RJUkVDVEVEOwoJCWVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgIkZVTkNUSU9OQUwiKSA9PSAwKQoJCQlzZWxmLT5jbGllbnQuZmlsdGVyX3R5cGUgfD0gSVJMQU5fRlVOQ1RJT05BTDsKCQllbHNlIGlmIChzdHJjbXAodmFsdWUsICJHUk9VUCIpID09IDApCgkJCXNlbGYtPmNsaWVudC5maWx0ZXJfdHlwZSB8PSBJUkxBTl9HUk9VUDsKCQllbHNlIGlmIChzdHJjbXAodmFsdWUsICJNQUNfRlJBTUUiKSA9PSAwKQoJCQlzZWxmLT5jbGllbnQuZmlsdGVyX3R5cGUgfD0gSVJMQU5fTUFDX0ZSQU1FOwoJCWVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgIk1VTFRJQ0FTVCIpID09IDApCgkJCXNlbGYtPmNsaWVudC5maWx0ZXJfdHlwZSB8PSBJUkxBTl9NVUxUSUNBU1Q7CgkJZWxzZSBpZiAoc3RyY21wKHZhbHVlLCAiQlJPQURDQVNUIikgPT0gMCkKCQkJc2VsZi0+Y2xpZW50LmZpbHRlcl90eXBlIHw9IElSTEFOX0JST0FEQ0FTVDsKCQllbHNlIGlmIChzdHJjbXAodmFsdWUsICJJUFhfU09DS0VUIikgPT0gMCkKCQkJc2VsZi0+Y2xpZW50LmZpbHRlcl90eXBlIHw9IElSTEFOX0lQWF9TT0NLRVQ7CgoJfQoJaWYgKHN0cmNtcChwYXJhbSwgIkFDQ0VTU19UWVBFIikgPT0gMCkgewoJCWlmIChzdHJjbXAodmFsdWUsICJESVJFQ1QiKSA9PSAwKQoJCQlzZWxmLT5jbGllbnQuYWNjZXNzX3R5cGUgPSBBQ0NFU1NfRElSRUNUOwoJCWVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgIlBFRVIiKSA9PSAwKQoJCQlzZWxmLT5jbGllbnQuYWNjZXNzX3R5cGUgPSBBQ0NFU1NfUEVFUjsKCQllbHNlIGlmIChzdHJjbXAodmFsdWUsICJIT1NURUQiKSA9PSAwKQoJCQlzZWxmLT5jbGllbnQuYWNjZXNzX3R5cGUgPSBBQ0NFU1NfSE9TVEVEOwoJCWVsc2UgewoJCQlJUkRBX0RFQlVHKDIsICIlcygpLCB1bmtub3duIGFjY2VzcyB0eXBlIVxuIiwgX19GVU5DVElPTl9fICk7CgkJfQoJfQoJLyogSVJMQU4gdmVyc2lvbiAqLwoJaWYgKHN0cmNtcChwYXJhbSwgIklSTEFOX1ZFUiIpID09IDApIHsKCQlJUkRBX0RFQlVHKDQsICJJckxBTiB2ZXJzaW9uICVkLiVkXG4iLCAoX191OCkgdmFsdWVbMF0sCgkJICAgICAgKF9fdTgpIHZhbHVlWzFdKTsKCgkJc2VsZi0+dmVyc2lvblswXSA9IHZhbHVlWzBdOwoJCXNlbGYtPnZlcnNpb25bMV0gPSB2YWx1ZVsxXTsKCQlyZXR1cm47Cgl9CgkvKiBXaGljaCByZW1vdGUgVFNBUCB0byB1c2UgZm9yIGRhdGEgY2hhbm5lbCAqLwoJaWYgKHN0cmNtcChwYXJhbSwgIkRBVEFfQ0hBTiIpID09IDApIHsKCQlzZWxmLT5kdHNhcF9zZWxfZGF0YSA9IHZhbHVlWzBdOwoJCUlSREFfREVCVUcoNCwgIkRhdGEgVFNBUCA9ICUwMnhcbiIsIHNlbGYtPmR0c2FwX3NlbF9kYXRhKTsKCQlyZXR1cm47Cgl9CglpZiAoc3RyY21wKHBhcmFtLCAiQ09OX0FSQiIpID09IDApIHsKCQltZW1jcHkoJnRtcF9jcHUsIHZhbHVlLCAyKTsgLyogQWxpZ24gdmFsdWUgKi8KCQlsZTE2X3RvX2NwdXMoJnRtcF9jcHUpOyAgICAgLyogQ29udmVydCB0byBob3N0IG9yZGVyICovCgkJc2VsZi0+Y2xpZW50LnJlY3ZfYXJiX3ZhbCA9IHRtcF9jcHU7CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgcmVjZWl2ZSBhcmIgdmFsPSVkXG4iLCBfX0ZVTkNUSU9OX18gLAoJCQkgICBzZWxmLT5jbGllbnQucmVjdl9hcmJfdmFsKTsKCX0KCWlmIChzdHJjbXAocGFyYW0sICJNQVhfRlJBTUUiKSA9PSAwKSB7CgkJbWVtY3B5KCZ0bXBfY3B1LCB2YWx1ZSwgMik7IC8qIEFsaWduIHZhbHVlICovCgkJbGUxNl90b19jcHVzKCZ0bXBfY3B1KTsgICAgIC8qIENvbnZlcnQgdG8gaG9zdCBvcmRlciAqLwoJCXNlbGYtPmNsaWVudC5tYXhfZnJhbWUgPSB0bXBfY3B1OwoJCUlSREFfREVCVUcoNCwgIiVzKCksIG1heCBmcmFtZT0lZFxuIiwgX19GVU5DVElPTl9fICwKCQkJICAgc2VsZi0+Y2xpZW50Lm1heF9mcmFtZSk7Cgl9CgoJLyogUkVDT05ORUNUX0tFWSwgaW4gY2FzZSB0aGUgbGluayBnb2VzIGRvd24hICovCglpZiAoc3RyY21wKHBhcmFtLCAiUkVDT05ORUNUX0tFWSIpID09IDApIHsKCQlJUkRBX0RFQlVHKDQsICJHb3QgcmVjb25uZWN0IGtleTogIik7CgkJLyogZm9yIChpID0gMDsgaSA8IHZhbF9sZW47IGkrKykgKi8KLyogCQkJcHJpbnRrKCIlMDJ4IiwgdmFsdWVbaV0pOyAqLwoJCW1lbWNweShzZWxmLT5jbGllbnQucmVjb25uZWN0X2tleSwgdmFsdWUsIHZhbF9sZW4pOwoJCXNlbGYtPmNsaWVudC5rZXlfbGVuID0gdmFsX2xlbjsKCQlJUkRBX0RFQlVHKDQsICJcbiIpOwoJfQoJLyogRklMVEVSX0VOVFJZLCBoYXZlIHdlIGdvdCBhbiBldGhlcm5ldCBhZGRyZXNzPyAqLwoJaWYgKHN0cmNtcChwYXJhbSwgIkZJTFRFUl9FTlRSWSIpID09IDApIHsKCQlieXRlcyA9IHZhbHVlOwoJCUlSREFfREVCVUcoNCwgIkV0aGVybmV0IGFkZHJlc3MgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKCQkgICAgICBieXRlc1swXSwgYnl0ZXNbMV0sIGJ5dGVzWzJdLCBieXRlc1szXSwgYnl0ZXNbNF0sCgkJICAgICAgYnl0ZXNbNV0pOwoJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCgkJCXNlbGYtPmRldi0+ZGV2X2FkZHJbaV0gPSBieXRlc1tpXTsKCX0KfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X2dldF92YWx1ZV9jb25maXJtIChvYmpfaWQsIHZhbHVlKQogKgogKiAgICBHb3QgcmVzdWx0cyBmcm9tIHJlbW90ZSBMTS1JQVMKICoKICovCnZvaWQgaXJsYW5fY2xpZW50X2dldF92YWx1ZV9jb25maXJtKGludCByZXN1bHQsIF9fdTE2IG9ial9pZCwKCQkJCSAgICBzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZSwgdm9pZCAqcHJpdikKewoJc3RydWN0IGlybGFuX2NiICpzZWxmOwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHByaXYgIT0gTlVMTCwgcmV0dXJuOyk7CgoJc2VsZiA9IChzdHJ1Y3QgaXJsYW5fY2IgKikgcHJpdjsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCgkvKiBXZSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIG1ha2UgYW55IG1vcmUgcXVlcmllcyAqLwoJaXJpYXBfY2xvc2Uoc2VsZi0+Y2xpZW50LmlyaWFwKTsKCXNlbGYtPmNsaWVudC5pcmlhcCA9IE5VTEw7CgoJLyogQ2hlY2sgaWYgcmVxdWVzdCBzdWNjZWVkZWQgKi8KCWlmIChyZXN1bHQgIT0gSUFTX1NVQ0NFU1MpIHsKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBnb3QgTlVMTCB2YWx1ZSFcbiIsIF9fRlVOQ1RJT05fXyApOwoJCWlybGFuX2RvX2NsaWVudF9ldmVudChzZWxmLCBJUkxBTl9JQVNfUFJPVklERVJfTk9UX0FWQUlMLAoJCQkJICAgICAgTlVMTCk7CgkJcmV0dXJuOwoJfQoKCXN3aXRjaCAodmFsdWUtPnR5cGUpIHsKCWNhc2UgSUFTX0lOVEVHRVI6CgkJc2VsZi0+ZHRzYXBfc2VsX2N0cmwgPSB2YWx1ZS0+dC5pbnRlZ2VyOwoKCQlpZiAodmFsdWUtPnQuaW50ZWdlciAhPSAtMSkgewoJCQlpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fSUFTX1BST1ZJREVSX0FWQUlMLAoJCQkJCSAgICAgIE5VTEwpOwoJCQlyZXR1cm47CgkJfQoJCWlyaWFzX2RlbGV0ZV92YWx1ZSh2YWx1ZSk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMiwgIiVzKCksIHVua25vd24gdHlwZSFcbiIsIF9fRlVOQ1RJT05fXyApOwoJCWJyZWFrOwoJfQoJaXJsYW5fZG9fY2xpZW50X2V2ZW50KHNlbGYsIElSTEFOX0lBU19QUk9WSURFUl9OT1RfQVZBSUwsIE5VTEwpOwp9Cg==