LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmxtcF9ldmVudC5jCiAqIFZlcnNpb246ICAgICAgIDAuOAogKiBEZXNjcmlwdGlvbjogICBBbiBJckRBIExNUCBldmVudCBkcml2ZXIgZm9yIExpbnV4CiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBNb24gQXVnICA0IDIwOjQwOjUzIDE5OTcKICogTW9kaWZpZWQgYXQ6ICAgVHVlIERlYyAxNCAyMzowNDoxNiAxOTk5CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICoKICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4sCiAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgogKgogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS90aW1lci5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXAuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcF9mcmFtZS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXBfZXZlbnQuaD4KCmNvbnN0IGNoYXIgKmlybG1wX3N0YXRlW10gPSB7CgkiTEFQX1NUQU5EQlkiLAoJIkxBUF9VX0NPTk5FQ1QiLAoJIkxBUF9BQ1RJVkUiLAp9OwoKY29uc3QgY2hhciAqaXJsc2FwX3N0YXRlW10gPSB7CgkiTFNBUF9ESVNDT05ORUNURUQiLAoJIkxTQVBfQ09OTkVDVCIsCgkiTFNBUF9DT05ORUNUX1BFTkQiLAoJIkxTQVBfREFUQV9UUkFOU0ZFUl9SRUFEWSIsCgkiTFNBUF9TRVRVUCIsCgkiTFNBUF9TRVRVUF9QRU5EIiwKfTsKCiNpZmRlZiBDT05GSUdfSVJEQV9ERUJVRwpzdGF0aWMgY29uc3QgY2hhciAqaXJsbXBfZXZlbnRbXSA9IHsKCSJMTV9DT05ORUNUX1JFUVVFU1QiLAoJIkxNX0NPTk5FQ1RfQ09ORklSTSIsCgkiTE1fQ09OTkVDVF9SRVNQT05TRSIsCgkiTE1fQ09OTkVDVF9JTkRJQ0FUSU9OIiwKCgkiTE1fRElTQ09OTkVDVF9JTkRJQ0FUSU9OIiwKCSJMTV9ESVNDT05ORUNUX1JFUVVFU1QiLAoKCSJMTV9EQVRBX1JFUVVFU1QiLAoJIkxNX1VEQVRBX1JFUVVFU1QiLAoJIkxNX0RBVEFfSU5ESUNBVElPTiIsCgkiTE1fVURBVEFfSU5ESUNBVElPTiIsCgoJIkxNX1dBVENIRE9HX1RJTUVPVVQiLAoKCS8qIElyTEFQIGV2ZW50cyAqLwoJIkxNX0xBUF9DT05ORUNUX1JFUVVFU1QiLAoJIkxNX0xBUF9DT05ORUNUX0lORElDQVRJT04iLAoJIkxNX0xBUF9DT05ORUNUX0NPTkZJUk0iLAoJIkxNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT04iLAoJIkxNX0xBUF9ESVNDT05ORUNUX1JFUVVFU1QiLAoJIkxNX0xBUF9ESVNDT1ZFUllfUkVRVUVTVCIsCgkiTE1fTEFQX0RJU0NPVkVSWV9DT05GSVJNIiwKCSJMTV9MQVBfSURMRV9USU1FT1VUIiwKfTsKI2VuZGlmCS8qIENPTkZJR19JUkRBX0RFQlVHICovCgovKiBMQVAgQ29ubmVjdGlvbiBjb250cm9sIHByb3RvIGRlY2xhcmF0aW9ucyAqLwpzdGF0aWMgdm9pZCBpcmxtcF9zdGF0ZV9zdGFuZGJ5ICAoc3RydWN0IGxhcF9jYiAqLCBJUkxNUF9FVkVOVCwKCQkJCSAgc3RydWN0IHNrX2J1ZmYgKik7CnN0YXRpYyB2b2lkIGlybG1wX3N0YXRlX3VfY29ubmVjdChzdHJ1Y3QgbGFwX2NiICosIElSTE1QX0VWRU5ULAoJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqKTsKc3RhdGljIHZvaWQgaXJsbXBfc3RhdGVfYWN0aXZlICAgKHN0cnVjdCBsYXBfY2IgKiwgSVJMTVBfRVZFTlQsCgkJCQkgIHN0cnVjdCBza19idWZmICopOwoKLyogTFNBUCBDb25uZWN0aW9uIGNvbnRyb2wgcHJvdG8gZGVjbGFyYXRpb25zICovCnN0YXRpYyBpbnQgaXJsbXBfc3RhdGVfZGlzY29ubmVjdGVkKHN0cnVjdCBsc2FwX2NiICosIElSTE1QX0VWRU5ULAoJCQkJICAgIHN0cnVjdCBza19idWZmICopOwpzdGF0aWMgaW50IGlybG1wX3N0YXRlX2Nvbm5lY3QgICAgIChzdHJ1Y3QgbHNhcF9jYiAqLCBJUkxNUF9FVkVOVCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqKTsKc3RhdGljIGludCBpcmxtcF9zdGF0ZV9jb25uZWN0X3BlbmQoc3RydWN0IGxzYXBfY2IgKiwgSVJMTVBfRVZFTlQsCgkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKik7CnN0YXRpYyBpbnQgaXJsbXBfc3RhdGVfZHRyICAgICAgICAgKHN0cnVjdCBsc2FwX2NiICosIElSTE1QX0VWRU5ULAoJCQkJICAgIHN0cnVjdCBza19idWZmICopOwpzdGF0aWMgaW50IGlybG1wX3N0YXRlX3NldHVwICAgICAgIChzdHJ1Y3QgbHNhcF9jYiAqLCBJUkxNUF9FVkVOVCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqKTsKc3RhdGljIGludCBpcmxtcF9zdGF0ZV9zZXR1cF9wZW5kICAoc3RydWN0IGxzYXBfY2IgKiwgSVJMTVBfRVZFTlQsCgkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKik7CgpzdGF0aWMgdm9pZCAoKmxhcF9zdGF0ZVtdKSAoc3RydWN0IGxhcF9jYiAqLCBJUkxNUF9FVkVOVCwgc3RydWN0IHNrX2J1ZmYgKikgPQp7CglpcmxtcF9zdGF0ZV9zdGFuZGJ5LAoJaXJsbXBfc3RhdGVfdV9jb25uZWN0LAoJaXJsbXBfc3RhdGVfYWN0aXZlLAp9OwoKc3RhdGljIGludCAoKmxzYXBfc3RhdGVbXSkoIHN0cnVjdCBsc2FwX2NiICosIElSTE1QX0VWRU5ULCBzdHJ1Y3Qgc2tfYnVmZiAqKSA9CnsKCWlybG1wX3N0YXRlX2Rpc2Nvbm5lY3RlZCwKCWlybG1wX3N0YXRlX2Nvbm5lY3QsCglpcmxtcF9zdGF0ZV9jb25uZWN0X3BlbmQsCglpcmxtcF9zdGF0ZV9kdHIsCglpcmxtcF9zdGF0ZV9zZXR1cCwKCWlybG1wX3N0YXRlX3NldHVwX3BlbmQKfTsKCnN0YXRpYyBpbmxpbmUgdm9pZCBpcmxtcF9uZXh0X2xhcF9zdGF0ZShzdHJ1Y3QgbGFwX2NiICpzZWxmLAoJCQkJCUlSTE1QX1NUQVRFIHN0YXRlKQp7CgkvKgoJSVJEQV9ERUJVRyg0LCAiJXMoKSwgTE1QIExBUCA9ICVzXG4iLCBfX0ZVTkNUSU9OX18sIGlybG1wX3N0YXRlW3N0YXRlXSk7CgkqLwoJc2VsZi0+bGFwX3N0YXRlID0gc3RhdGU7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc3RydWN0IGxzYXBfY2IgKnNlbGYsCgkJCQkJIExTQVBfU1RBVEUgc3RhdGUpCnsKCS8qCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9ERUJVRyg0LCAiJXMoKSwgTE1QIExTQVAgPSAlc1xuIiwgX19GVU5DVElPTl9fLCBpcmxzYXBfc3RhdGVbc3RhdGVdKTsKCSovCglzZWxmLT5sc2FwX3N0YXRlID0gc3RhdGU7Cn0KCi8qIERvIGNvbm5lY3Rpb24gY29udHJvbCBldmVudHMgKi8KaW50IGlybG1wX2RvX2xzYXBfZXZlbnQoc3RydWN0IGxzYXBfY2IgKnNlbGYsIElSTE1QX0VWRU5UIGV2ZW50LAoJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIHJldHVybiAtMTspOwoKCUlSREFfREVCVUcoNCwgIiVzKCksIEVWRU5UID0gJXMsIFNUQVRFID0gJXNcbiIsCgkJX19GVU5DVElPTl9fLCBpcmxtcF9ldmVudFtldmVudF0sIGlybHNhcF9zdGF0ZVsgc2VsZi0+bHNhcF9zdGF0ZV0pOwoKCXJldHVybiAoKmxzYXBfc3RhdGVbc2VsZi0+bHNhcF9zdGF0ZV0pIChzZWxmLCBldmVudCwgc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gZG9fbGFwX2V2ZW50IChldmVudCwgc2tiLCBpbmZvKQogKgogKiAgICBEbyBJckxBUCBjb250cm9sIGV2ZW50cwogKgogKi8Kdm9pZCBpcmxtcF9kb19sYXBfZXZlbnQoc3RydWN0IGxhcF9jYiAqc2VsZiwgSVJMTVBfRVZFTlQgZXZlbnQsCgkJCXN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKCglJUkRBX0RFQlVHKDQsICIlcygpLCBFVkVOVCA9ICVzLCBTVEFURSA9ICVzXG4iLCBfX0ZVTkNUSU9OX18sCgkJICAgaXJsbXBfZXZlbnRbZXZlbnRdLAoJCSAgIGlybG1wX3N0YXRlW3NlbGYtPmxhcF9zdGF0ZV0pOwoKCSgqbGFwX3N0YXRlW3NlbGYtPmxhcF9zdGF0ZV0pIChzZWxmLCBldmVudCwgc2tiKTsKfQoKdm9pZCBpcmxtcF9kaXNjb3ZlcnlfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQp7CglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCS8qIFdlIGFsd2F5cyBjbGVhbnVwIHRoZSBsb2cgKGFjdGl2ZSAmIHBhc3NpdmUgZGlzY292ZXJ5KSAqLwoJaXJsbXBfZG9fZXhwaXJ5KCk7CgoJLyogQWN0aXZlIGRpc2NvdmVyeSBpcyBjb25kaXRpb25hbCAqLwoJaWYgKHN5c2N0bF9kaXNjb3ZlcnkpCgkJaXJsbXBfZG9fZGlzY292ZXJ5KHN5c2N0bF9kaXNjb3Zlcnlfc2xvdHMpOwoKCS8qIFJlc3RhcnQgdGltZXIgKi8KCWlybG1wX3N0YXJ0X2Rpc2NvdmVyeV90aW1lcihpcmxtcCwgc3lzY3RsX2Rpc2NvdmVyeV90aW1lb3V0ICogSFopOwp9Cgp2b2lkIGlybG1wX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKewoJc3RydWN0IGxzYXBfY2IgKnNlbGYgPSAoc3RydWN0IGxzYXBfY2IgKikgZGF0YTsKCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuOyk7CgoJaXJsbXBfZG9fbHNhcF9ldmVudChzZWxmLCBMTV9XQVRDSERPR19USU1FT1VULCBOVUxMKTsKfQoKdm9pZCBpcmxtcF9pZGxlX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKewoJc3RydWN0IGxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgbGFwX2NiICopIGRhdGE7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuOyk7CgoJaXJsbXBfZG9fbGFwX2V2ZW50KHNlbGYsIExNX0xBUF9JRExFX1RJTUVPVVQsIE5VTEwpOwp9CgovKgogKiBTZW5kIGFuIGV2ZW50IG9uIGFsbCBMU0FQcyBhdHRhY2hlZCB0byB0aGlzIExBUC4KICovCnN0YXRpYyBpbmxpbmUgdm9pZAppcmxtcF9kb19hbGxfbHNhcF9ldmVudChoYXNoYmluX3QgKglsc2FwX2hhc2hiaW4sCgkJCUlSTE1QX0VWRU5UCWV2ZW50KQp7CglzdHJ1Y3QgbHNhcF9jYiAqbHNhcDsKCXN0cnVjdCBsc2FwX2NiICpsc2FwX25leHQ7CgoJLyogTm90ZSA6IHRoaXMgZnVuY3Rpb24gdXNlIHRoZSBuZXcgaGFzaGJpbl9maW5kX25leHQoKQoJICogZnVuY3Rpb24sIGluc3RlYWQgb2YgdGhlIG9sZCBoYXNoYmluX2dldF9uZXh0KCkuCgkgKiBUaGlzIG1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBhbHdheXMgcG9pbnRpbmcgb25lIGxzYXAKCSAqIGFoZWFkLCBzbyB0aGF0IGlmIHRoZSBjdXJyZW50IGxzYXAgaXMgcmVtb3ZlZCBhcyB0aGUKCSAqIHJlc3VsdCBvZiBzZW5kaW5nIHRoZSBldmVudCwgd2UgZG9uJ3QgY2FyZS4KCSAqIEFsc28sIGFzIHdlIHN0b3JlIHRoZSBjb250ZXh0IG91cnNlbHZlcywgaWYgYW4gZW51bWVyYXRpb24KCSAqIG9mIHRoZSBzYW1lIGxzYXAgaGFzaGJpbiBoYXBwZW5zIGFzIHRoZSByZXN1bHQgb2Ygc2VuZGluZyB0aGUKCSAqIGV2ZW50LCB3ZSBkb24ndCBjYXJlLgoJICogVGhlIG9ubHkgcHJvYmxlbSBpcyBpZiB0aGUgbmV4dCBsc2FwIGlzIHJlbW92ZWQuIEluIHRoYXQgY2FzZSwKCSAqIGhhc2hiaW5fZmluZF9uZXh0KCkgd2lsbCByZXR1cm4gTlVMTCBhbmQgd2Ugd2lsbCBhYm9ydCB0aGUKCSAqIGVudW1lcmF0aW9uLiAtIEplYW4gSUkgKi8KCgkvKiBBbHNvIDogd2UgZG9uJ3QgYWNjZXB0IGFueSBza2IgaW4gaW5wdXQuIFdlIGNhbiAqTk9UKiBwYXNzCgkgKiB0aGUgc2FtZSBza2IgdG8gbXVsdGlwbGUgY2xpZW50cyBzYWZlbHksIHdlIHdvdWxkIG5lZWQgdG8KCSAqIHNrYl9jbG9uZSgpIGl0LiAtIEplYW4gSUkgKi8KCglsc2FwID0gKHN0cnVjdCBsc2FwX2NiICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGxzYXBfaGFzaGJpbik7CgoJd2hpbGUgKE5VTEwgIT0gaGFzaGJpbl9maW5kX25leHQobHNhcF9oYXNoYmluLAoJCQkJCSAobG9uZykgbHNhcCwKCQkJCQkgTlVMTCwKCQkJCQkgKHZvaWQgKikgJmxzYXBfbmV4dCkgKSB7CgkJaXJsbXBfZG9fbHNhcF9ldmVudChsc2FwLCBldmVudCwgTlVMTCk7CgkJbHNhcCA9IGxzYXBfbmV4dDsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgICBMQVAgY29ubmVjdGlvbiBjb250cm9sIHN0YXRlcwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBGdW5jdGlvbiBpcmxtcF9zdGF0ZV9zdGFuZGJ5IChldmVudCwgc2tiLCBpbmZvKQogKgogKiAgICBTVEFOREJZLCBUaGUgSXJMQVAgY29ubmVjdGlvbiBkb2VzIG5vdCBleGlzdC4KICoKICovCnN0YXRpYyB2b2lkIGlybG1wX3N0YXRlX3N0YW5kYnkoc3RydWN0IGxhcF9jYiAqc2VsZiwgSVJMTVBfRVZFTlQgZXZlbnQsCgkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoJSVJEQV9BU1NFUlQoc2VsZi0+aXJsYXAgIT0gTlVMTCwgcmV0dXJuOyk7CgoJc3dpdGNoIChldmVudCkgewoJY2FzZSBMTV9MQVBfRElTQ09WRVJZX1JFUVVFU1Q6CgkJLyogaXJsbXBfbmV4dF9zdGF0aW9uX3N0YXRlKCBMTVBfRElTQ09WRVIpOyAqLwoKCQlpcmxhcF9kaXNjb3ZlcnlfcmVxdWVzdChzZWxmLT5pcmxhcCwgJmlybG1wLT5kaXNjb3ZlcnlfY21kKTsKCQlicmVhazsKCWNhc2UgTE1fTEFQX0NPTk5FQ1RfSU5ESUNBVElPTjoKCQkvKiAgSXQncyBpbXBvcnRhbnQgdG8gc3dpdGNoIHN0YXRlIGZpcnN0LCB0byBhdm9pZCBJckxNUCB0bwoJCSAqICB0aGluayB0aGF0IHRoZSBsaW5rIGlzIGZyZWUgc2luY2UgSXJMTVAgbWF5IHRoZW4gc3RhcnQKCQkgKiAgZGlzY292ZXJ5IGJlZm9yZSB0aGUgY29ubmVjdGlvbiBpcyBwcm9wZXJseSBzZXQgdXAuIERCLgoJCSAqLwoJCWlybG1wX25leHRfbGFwX3N0YXRlKHNlbGYsIExBUF9BQ1RJVkUpOwoKCQkvKiBKdXN0IGFjY2VwdCBjb25uZWN0aW9uIFRPRE8sIHRoaXMgc2hvdWxkIGJlIGZpeGVkICovCgkJaXJsYXBfY29ubmVjdF9yZXNwb25zZShzZWxmLT5pcmxhcCwgc2tiKTsKCQlicmVhazsKCWNhc2UgTE1fTEFQX0NPTk5FQ1RfUkVRVUVTVDoKCQlJUkRBX0RFQlVHKDQsICIlcygpIExTX0NPTk5FQ1RfUkVRVUVTVFxuIiwgX19GVU5DVElPTl9fKTsKCgkJaXJsbXBfbmV4dF9sYXBfc3RhdGUoc2VsZiwgTEFQX1VfQ09OTkVDVCk7CgoJCS8qIEZJWE1FOiBuZWVkIHRvIHNldCB1c2VycyByZXF1ZXN0ZWQgUW9TICovCgkJaXJsYXBfY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmlybGFwLCBzZWxmLT5kYWRkciwgTlVMTCwgMCk7CgkJYnJlYWs7CgljYXNlIExNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT046CgkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgRXJyb3IgTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTlxuIiwKCQkJICAgX19GVU5DVElPTl9fKTsKCgkJaXJsbXBfbmV4dF9sYXBfc3RhdGUoc2VsZiwgTEFQX1NUQU5EQlkpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIGV2ZW50ICVzXG4iLAoJCQkgICBfX0ZVTkNUSU9OX18sIGlybG1wX2V2ZW50W2V2ZW50XSk7CgkJYnJlYWs7Cgl9Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybG1wX3N0YXRlX3VfY29ubmVjdCAoZXZlbnQsIHNrYiwgaW5mbykKICoKICogICAgVV9DT05ORUNULCBUaGUgbGF5ZXIgYWJvdmUgaGFzIHRyaWVkIHRvIG9wZW4gYW4gTFNBUCBjb25uZWN0aW9uIGJ1dAogKiAgICBzaW5jZSB0aGUgSXJMQVAgY29ubmVjdGlvbiBkb2VzIG5vdCBleGlzdCwgd2UgbXVzdCBmaXJzdCBzdGFydCBhbgogKiAgICBJckxBUCBjb25uZWN0aW9uLiBXZSBhcmUgbm93IHdhaXRpbmcgcmVzcG9uc2UgZnJvbSBJckxBUC4KICogKi8Kc3RhdGljIHZvaWQgaXJsbXBfc3RhdGVfdV9jb25uZWN0KHN0cnVjdCBsYXBfY2IgKnNlbGYsIElSTE1QX0VWRU5UIGV2ZW50LAoJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0RFQlVHKDIsICIlcygpLCBldmVudD0lc1xuIiwgX19GVU5DVElPTl9fLCBpcmxtcF9ldmVudFtldmVudF0pOwoKCXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgTE1fTEFQX0NPTk5FQ1RfSU5ESUNBVElPTjoKCQkvKiAgSXQncyBpbXBvcnRhbnQgdG8gc3dpdGNoIHN0YXRlIGZpcnN0LCB0byBhdm9pZCBJckxNUCB0bwoJCSAqICB0aGluayB0aGF0IHRoZSBsaW5rIGlzIGZyZWUgc2luY2UgSXJMTVAgbWF5IHRoZW4gc3RhcnQKCQkgKiAgZGlzY292ZXJ5IGJlZm9yZSB0aGUgY29ubmVjdGlvbiBpcyBwcm9wZXJseSBzZXQgdXAuIERCLgoJCSAqLwoJCWlybG1wX25leHRfbGFwX3N0YXRlKHNlbGYsIExBUF9BQ1RJVkUpOwoKCQkvKiBKdXN0IGFjY2VwdCBjb25uZWN0aW9uIFRPRE8sIHRoaXMgc2hvdWxkIGJlIGZpeGVkICovCgkJaXJsYXBfY29ubmVjdF9yZXNwb25zZShzZWxmLT5pcmxhcCwgc2tiKTsKCgkJLyogVGVsbCBMU0FQcyB0aGF0IHRoZXkgY2FuIHN0YXJ0IHNlbmRpbmcgZGF0YSAqLwoJCWlybG1wX2RvX2FsbF9sc2FwX2V2ZW50KHNlbGYtPmxzYXBzLCBMTV9MQVBfQ09OTkVDVF9DT05GSVJNKTsKCgkJLyogTm90ZSA6IGJ5IHRoZSB0aW1lIHdlIGdldCB0aGVyZSAoTEFQIHJldHJpZXMgYW5kIGNvKSwKCQkgKiB0aGUgbHNhcHMgbWF5IGFscmVhZHkgaGF2ZSBnb25lLiBUaGlzIGF2b2lkIGdldHRpbmcgc3R1Y2sKCQkgKiBmb3JldmVyIGluIExBUF9BQ1RJVkUgc3RhdGUgLSBKZWFuIElJICovCgkJaWYgKEhBU0hCSU5fR0VUX1NJWkUoc2VsZi0+bHNhcHMpID09IDApIHsKCQkJSVJEQV9ERUJVRygwLCAiJXMoKSBOTyBMU0FQcyAhXG4iLCAgX19GVU5DVElPTl9fKTsKCQkJaXJsbXBfc3RhcnRfaWRsZV90aW1lcihzZWxmLCBMTV9JRExFX1RJTUVPVVQpOwoJCX0KCQlicmVhazsKCWNhc2UgTE1fTEFQX0NPTk5FQ1RfUkVRVUVTVDoKCQkvKiBBbHJlYWR5IHRyeWluZyB0byBjb25uZWN0ICovCgkJYnJlYWs7CgljYXNlIExNX0xBUF9DT05ORUNUX0NPTkZJUk06CgkJLyogRm9yIGFsbCBsc2FwX2NlIEUgQXNzb2NpYXRlZCBkbyBMU19Db25uZWN0X2NvbmZpcm0gKi8KCQlpcmxtcF9uZXh0X2xhcF9zdGF0ZShzZWxmLCBMQVBfQUNUSVZFKTsKCgkJLyogVGVsbCBMU0FQcyB0aGF0IHRoZXkgY2FuIHN0YXJ0IHNlbmRpbmcgZGF0YSAqLwoJCWlybG1wX2RvX2FsbF9sc2FwX2V2ZW50KHNlbGYtPmxzYXBzLCBMTV9MQVBfQ09OTkVDVF9DT05GSVJNKTsKCgkJLyogTm90ZSA6IGJ5IHRoZSB0aW1lIHdlIGdldCB0aGVyZSAoTEFQIHJldHJpZXMgYW5kIGNvKSwKCQkgKiB0aGUgbHNhcHMgbWF5IGFscmVhZHkgaGF2ZSBnb25lLiBUaGlzIGF2b2lkIGdldHRpbmcgc3R1Y2sKCQkgKiBmb3JldmVyIGluIExBUF9BQ1RJVkUgc3RhdGUgLSBKZWFuIElJICovCgkJaWYgKEhBU0hCSU5fR0VUX1NJWkUoc2VsZi0+bHNhcHMpID09IDApIHsKCQkJSVJEQV9ERUJVRygwLCAiJXMoKSBOTyBMU0FQcyAhXG4iLCAgX19GVU5DVElPTl9fKTsKCQkJaXJsbXBfc3RhcnRfaWRsZV90aW1lcihzZWxmLCBMTV9JRExFX1RJTUVPVVQpOwoJCX0KCQlicmVhazsKCWNhc2UgTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKCQlJUkRBX0RFQlVHKDQsICIlcygpLCBMTV9MQVBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OXG4iLCAgX19GVU5DVElPTl9fKTsKCQlpcmxtcF9uZXh0X2xhcF9zdGF0ZShzZWxmLCBMQVBfU1RBTkRCWSk7CgoJCS8qIFNlbmQgZGlzY29ubmVjdCBldmVudCB0byBhbGwgTFNBUHMgdXNpbmcgdGhpcyBsaW5rICovCgkJaXJsbXBfZG9fYWxsX2xzYXBfZXZlbnQoc2VsZi0+bHNhcHMsCgkJCQkJTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTik7CgkJYnJlYWs7CgljYXNlIExNX0xBUF9ESVNDT05ORUNUX1JFUVVFU1Q6CgkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgTE1fTEFQX0RJU0NPTk5FQ1RfUkVRVUVTVFxuIiwgIF9fRlVOQ1RJT05fXyk7CgoJCS8qIE9uZSBvZiB0aGUgTFNBUCBkaWQgdGltZW91dCBvciB3YXMgY2xvc2VkLCBpZiBpdCB3YXMKCQkgKiB0aGUgbGFzdCBvbmUsIHRyeSB0byBnZXQgb3V0IG9mIGhlcmUgLSBKZWFuIElJICovCgkJaWYgKEhBU0hCSU5fR0VUX1NJWkUoc2VsZi0+bHNhcHMpIDw9IDEpIHsKCQkJaXJsYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmlybGFwKTsKCQl9CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXZlbnQgJXNcbiIsCgkJCSBfX0ZVTkNUSU9OX18sIGlybG1wX2V2ZW50W2V2ZW50XSk7CgkJYnJlYWs7Cgl9Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybG1wX3N0YXRlX2FjdGl2ZSAoZXZlbnQsIHNrYiwgaW5mbykKICoKICogICAgQUNUSVZFLCBJckxBUCBjb25uZWN0aW9uIGlzIGFjdGl2ZQogKgogKi8Kc3RhdGljIHZvaWQgaXJsbXBfc3RhdGVfYWN0aXZlKHN0cnVjdCBsYXBfY2IgKnNlbGYsIElSTE1QX0VWRU5UIGV2ZW50LAoJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglzd2l0Y2ggKGV2ZW50KSB7CgljYXNlIExNX0xBUF9DT05ORUNUX1JFUVVFU1Q6CgkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgTFNfQ09OTkVDVF9SRVFVRVNUXG4iLCBfX0ZVTkNUSU9OX18pOwoKCQkvKgoJCSAqIElyTEFQIG1heSBoYXZlIGEgcGVuZGluZyBkaXNjb25uZWN0LiBXZSB0cmllZCB0byBjbG9zZQoJCSAqIElyTEFQLCBidXQgaXQgd2FzIHBvc3Rwb25lZCBiZWNhdXNlIHRoZSBsaW5rIHdhcwoJCSAqIGJ1c3kgb3Igd2Ugd2VyZSBzdGlsbCBzZW5kaW5nIHBhY2tldHMuIEFzIHdlIG5vdwoJCSAqIG5lZWQgaXQsIG1ha2Ugc3VyZSBpdCBzdGF5cyBvbi4gSmVhbiBJSQoJCSAqLwoJCWlybGFwX2NsZWFyX2Rpc2Nvbm5lY3Qoc2VsZi0+aXJsYXApOwoKCQkvKgoJCSAqICBMQVAgY29ubmVjdGlvbiBhbHJlYWR5IGFjdGl2ZSwganVzdCBib3VuY2UgYmFjayEgU2luY2Ugd2UKCQkgKiAgZG9uJ3Qga25vdyB3aGljaCBMU0FQIHRoYXQgdHJpZWQgdG8gZG8gdGhpcywgd2UgaGF2ZSB0bwoJCSAqICBub3RpZnkgYWxsIExTQVBzIHVzaW5nIHRoaXMgTEFQLCBidXQgdGhhdCBzaG91bGQgYmUgc2FmZSB0bwoJCSAqICBkbyBhbnl3YXkuCgkJICovCgkJaXJsbXBfZG9fYWxsX2xzYXBfZXZlbnQoc2VsZi0+bHNhcHMsIExNX0xBUF9DT05ORUNUX0NPTkZJUk0pOwoKCQkvKiBOZWVkZWQgYnkgY29ubmVjdCBpbmRpY2F0aW9uICovCgkJaXJsbXBfZG9fYWxsX2xzYXBfZXZlbnQoaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLAoJCQkJCUxNX0xBUF9DT05ORUNUX0NPTkZJUk0pOwoJCS8qIEtlZXAgc3RhdGUgKi8KCQlicmVhazsKCWNhc2UgTE1fTEFQX0RJU0NPTk5FQ1RfUkVRVUVTVDoKCQkvKgoJCSAqICBOZWVkIHRvIGZpbmQgb3V0IGlmIHdlIHNob3VsZCBjbG9zZSBJckxBUCBvciBub3QuIElmIHRoZXJlCgkJICogIGlzIG9ubHkgb25lIExTQVAgY29ubmVjdGlvbiBsZWZ0IG9uIHRoaXMgbGluaywgdGhhdCBMU0FQCgkJICogIG11c3QgYmUgdGhlIG9uZSB0aGF0IHRyaWVzIHRvIGNsb3NlIElyTEFQLiBJdCB3aWxsIGJlCgkJICogIHJlbW92ZWQgbGF0ZXIgYW5kIG1vdmVkIHRvIHRoZSBsaXN0IG9mIHVuY29ubmVjdGVkIExTQVBzCgkJICovCgkJaWYgKEhBU0hCSU5fR0VUX1NJWkUoc2VsZi0+bHNhcHMpID4gMCkgewoJCQkvKiBUaW1lciB2YWx1ZSBpcyBjaGVja2VkIGluIGlyc3lzY3RsIC0gSmVhbiBJSSAqLwoJCQlpcmxtcF9zdGFydF9pZGxlX3RpbWVyKHNlbGYsIHN5c2N0bF9sYXBfa2VlcGFsaXZlX3RpbWUgKiBIWiAvIDEwMDApOwoJCX0gZWxzZSB7CgkJCS8qIE5vIG1vcmUgY29ubmVjdGlvbnMsIHNvIGNsb3NlIElyTEFQICovCgoJCQkvKiBXZSBkb24ndCB3YW50IHRvIGNoYW5nZSBzdGF0ZSBqdXN0IHlldCwgYmVjYXVzZQoJCQkgKiB3ZSB3YW50IHRvIHJlZmxlY3QgYWNjdXJhdGVseSB0aGUgcmVhbCBzdGF0ZSBvZgoJCQkgKiB0aGUgTEFQLCBub3QgdGhlIHN0YXRlIHdlIHdpc2ggaXQgd2FzIGluLAoJCQkgKiBzbyB0aGF0IHdlIGRvbid0IGxvc2UgTE1fTEFQX0NPTk5FQ1RfUkVRVUVTVC4KCQkJICogSW4gc29tZSBjYXNlcywgSXJMQVAgd29uJ3QgY2xvc2UgdGhlIExBUAoJCQkgKiBpbW1lZGlhdGVseS4gRm9yIGV4YW1wbGUsIGl0IG1pZ2h0IHN0aWxsIGJlCgkJCSAqIHJldHJ5aW5nIHBhY2tldHMgb3Igd2FpdGluZyBmb3IgdGhlIHBmIGJpdC4KCQkJICogQXMgdGhlIExBUCBhbHdheXMgc2VuZCBhIERJU0NPTk5FQ1RfSU5ESUNBVElPTgoJCQkgKiBpbiBQQ0xPU0Ugb3IgU0NMT1NFLCBqdXN0IGNoYW5nZSBzdGF0ZSBvbiB0aGF0LgoJCQkgKiBKZWFuIElJICovCgkJCWlybGFwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5pcmxhcCk7CgkJfQoJCWJyZWFrOwoJY2FzZSBMTV9MQVBfSURMRV9USU1FT1VUOgoJCWlmIChIQVNIQklOX0dFVF9TSVpFKHNlbGYtPmxzYXBzKSA9PSAwKSB7CgkJCS8qIFNhbWUgcmVhc29uaW5nIGFzIGFib3ZlIC0ga2VlcCBzdGF0ZSAqLwoJCQlpcmxhcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+aXJsYXApOwoJCX0KCQlicmVhazsKCWNhc2UgTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKCQlpcmxtcF9uZXh0X2xhcF9zdGF0ZShzZWxmLCBMQVBfU1RBTkRCWSk7CgoJCS8qIEluIHNvbWUgY2FzZSwgYXQgdGhpcyBwb2ludCBvdXIgc2lkZSBoYXMgYWxyZWFkeSBjbG9zZWQKCQkgKiBhbGwgbHNhcHMsIGFuZCB3ZSBhcmUgd2FpdGluZyBmb3IgdGhlIGlkbGVfdGltZXIgdG8KCQkgKiBleHBpcmUuIElmIGFub3RoZXIgZGV2aWNlIHJlY29ubmVjdCBpbW1lZGlhdGVseSwgdGhlCgkJICogaWRsZSB0aW1lciB3aWxsIGV4cGlyZSBpbiB0aGUgbWlkbGUgb2YgdGhlIGNvbm5lY3Rpb24KCQkgKiBpbml0aWFsaXNhdGlvbiwgc2NyZXdpbmcgdXAgdGhpbmdzIGEgbG90Li4uCgkJICogVGhlcmVmb3JlLCB3ZSBtdXN0IHN0b3AgdGhlIHRpbWVyLi4uICovCgkJaXJsbXBfc3RvcF9pZGxlX3RpbWVyKHNlbGYpOwoKCQkvKgoJCSAqICBJbmZvcm0gYWxsIGNvbm5lY3RlZCBMU0FQJ3MgdXNpbmcgdGhpcyBsaW5rCgkJICovCgkJaXJsbXBfZG9fYWxsX2xzYXBfZXZlbnQoc2VsZi0+bHNhcHMsCgkJCQkJTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTik7CgoJCS8qIEZvcmNlIGFuIGV4cGlyeSBvZiB0aGUgZGlzY292ZXJ5IGxvZy4KCQkgKiBOb3cgdGhhdCB0aGUgTEFQIGlzIGZyZWUsIHRoZSBzeXN0ZW0gbWF5IGF0dGVtcHQgdG8KCQkgKiBjb25uZWN0IHRvIGFub3RoZXIgZGV2aWNlLiBVbmZvcnR1bmF0ZWx5LCBvdXIgZW50cmllcwoJCSAqIGFyZSBzdGFsZS4gVGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgKDwzcykgYmVmb3JlIHRoZQoJCSAqIG5vcm1hbCBkaXNjb3Zlcnkgd2lsbCBydW4gYW5kIHdoZXJlIGlybG1wX2Nvbm5lY3RfcmVxdWVzdCgpCgkJICogY2FuIGdldCB0aGUgd3JvbmcgaW5mbywgc28gbWFrZSBzdXJlIHRoaW5ncyBnZXQKCQkgKiBjbGVhbmVkICpOT1cqIDstKSAtIEplYW4gSUkgKi8KCQlpcmxtcF9kb19leHBpcnkoKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBldmVudCAlc1xuIiwKCQkJIF9fRlVOQ1RJT05fXywgaXJsbXBfZXZlbnRbZXZlbnRdKTsKCQlicmVhazsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgICBMU0FQIGNvbm5lY3Rpb24gY29udHJvbCBzdGF0ZXMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogRnVuY3Rpb24gaXJsbXBfc3RhdGVfZGlzY29ubmVjdGVkIChldmVudCwgc2tiLCBpbmZvKQogKgogKiAgICBESVNDT05ORUNURUQKICoKICovCnN0YXRpYyBpbnQgaXJsbXBfc3RhdGVfZGlzY29ubmVjdGVkKHN0cnVjdCBsc2FwX2NiICpzZWxmLCBJUkxNUF9FVkVOVCBldmVudCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglpbnQgcmV0ID0gMDsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CgoJc3dpdGNoIChldmVudCkgewojaWZkZWYgQ09ORklHX0lSREFfVUxUUkEKCWNhc2UgTE1fVURBVEFfSU5ESUNBVElPTjoKCQkvKiBUaGlzIGlzIG1vc3QgYml6emFyZS4gVGhvc2UgcGFja2V0cyBhcmUgIGFrYSB1bnJlbGlhYmxlCgkJICogY29ubmVjdGVkLCBha2EgSXJMUFQgb3IgU09DS19ER1JBTS9JUkRBUFJPVE9fVU5JVERBVEEuCgkJICogV2h5IGRvIHdlIHBhc3MgdGhlbSBhcyBVbHRyYSA/Pz8gSmVhbiBJSSAqLwoJCWlybG1wX2Nvbm5sZXNzX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IpOwoJCWJyZWFrOwojZW5kaWYgLyogQ09ORklHX0lSREFfVUxUUkEgKi8KCWNhc2UgTE1fQ09OTkVDVF9SRVFVRVNUOgoJCUlSREFfREVCVUcoNCwgIiVzKCksIExNX0NPTk5FQ1RfUkVRVUVTVFxuIiwgX19GVU5DVElPTl9fKTsKCgkJaWYgKHNlbGYtPmNvbm5fc2tiKSB7CgkJCUlSREFfV0FSTklORygiJXM6IGJ1c3kgd2l0aCBhbm90aGVyIHJlcXVlc3QhXG4iLAoJCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCQlyZXR1cm4gLUVCVVNZOwoJCX0KCQkvKiBEb24ndCBmb3JnZXQgdG8gcmVmY291bnQgaXQgKHNlZSBpcmxtcF9jb25uZWN0X3JlcXVlc3QoKSkgKi8KCQlza2JfZ2V0KHNrYik7CgkJc2VsZi0+Y29ubl9za2IgPSBza2I7CgoJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX1NFVFVQX1BFTkQpOwoKCQkvKiBTdGFydCB3YXRjaGRvZyB0aW1lciAoNSBzZWNzIGZvciBub3cpICovCgkJaXJsbXBfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc2VsZiwgNSpIWik7CgoJCWlybG1wX2RvX2xhcF9ldmVudChzZWxmLT5sYXAsIExNX0xBUF9DT05ORUNUX1JFUVVFU1QsIE5VTEwpOwoJCWJyZWFrOwoJY2FzZSBMTV9DT05ORUNUX0lORElDQVRJT046CgkJaWYgKHNlbGYtPmNvbm5fc2tiKSB7CgkJCUlSREFfV0FSTklORygiJXM6IGJ1c3kgd2l0aCBhbm90aGVyIHJlcXVlc3QhXG4iLAoJCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCQlyZXR1cm4gLUVCVVNZOwoJCX0KCQkvKiBEb24ndCBmb3JnZXQgdG8gcmVmY291bnQgaXQgKHNlZSBpcmxhcF9kcml2ZXJfcmN2KCkpICovCgkJc2tiX2dldChza2IpOwoJCXNlbGYtPmNvbm5fc2tiID0gc2tiOwoKCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9DT05ORUNUX1BFTkQpOwoKCQkvKiBTdGFydCB3YXRjaGRvZyB0aW1lcgoJCSAqIFRoaXMgaXMgbm90IG1lbnRpb25uZWQgaW4gdGhlIHNwZWMsIGJ1dCB0aGVyZSBpcyBhIHJhcmUKCQkgKiByYWNlIGNvbmRpdGlvbiB0aGF0IGNhbiBnZXQgdGhlIHNvY2tldCBzdHVjay4KCQkgKiBJZiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQgd2hpbGUgb3VyIExBUCBpcyBjbG9zaW5nIGRvd24sCgkJICogdGhlIExNX0xBUF9DT05ORUNUX1JFUVVFU1QgZ2V0IGxvc3QgYW5kIHdlIGdldCBzdHVjayBpbgoJCSAqIENPTk5FQ1RfUEVORCBzdGF0ZSBmb3JldmVyLgoJCSAqIFRoZSBvdGhlciBjYXVzZSBvZiBnZXR0aW5nIHN0dWNrIGRvd24gdGhlcmUgaXMgaWYgdGhlCgkJICogaGlnaGVyIGxheWVyIG5ldmVyIHJlcGx5IHRvIHRoZSBDT05ORUNUX0lORElDQVRJT04uCgkJICogQW55d2F5LCBpdCBtYWtlIHNlbnNlIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlCgkJICogYSBiYWNrdXAgcGxhbi4gMSBzZWNvbmQgaXMgcGxlbnR5IChzaG91bGQgYmUgaW1tZWRpYXRlKS4KCQkgKiBKZWFuIElJICovCgkJaXJsbXBfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc2VsZiwgMSpIWik7CgoJCWlybG1wX2RvX2xhcF9ldmVudChzZWxmLT5sYXAsIExNX0xBUF9DT05ORUNUX1JFUVVFU1QsIE5VTEwpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVbmtub3duIGV2ZW50ICVzIG9uIExTQVAgJSMwMnhcbiIsCgkJCSAgIF9fRlVOQ1RJT05fXywgaXJsbXBfZXZlbnRbZXZlbnRdLCBzZWxmLT5zbHNhcF9zZWwpOwoJCWJyZWFrOwoJfQoJcmV0dXJuIHJldDsKfQoKLyoKICogRnVuY3Rpb24gaXJsbXBfc3RhdGVfY29ubmVjdCAoc2VsZiwgZXZlbnQsIHNrYikKICoKICogICAgQ09OTkVDVAogKgogKi8Kc3RhdGljIGludCBpcmxtcF9zdGF0ZV9jb25uZWN0KHN0cnVjdCBsc2FwX2NiICpzZWxmLCBJUkxNUF9FVkVOVCBldmVudCwKCQkJCXN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBsc2FwX2NiICpsc2FwOwoJaW50IHJldCA9IDA7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIHJldHVybiAtMTspOwoKCXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgTE1fQ09OTkVDVF9SRVNQT05TRToKCQkvKgoJCSAqICBCaW5kIHRoaXMgTFNBUCB0byB0aGUgSXJMQVAgbGluayB3aGVyZSB0aGUgY29ubmVjdCB3YXMKCQkgKiAgcmVjZWl2ZWQKCQkgKi8KCQlsc2FwID0gaGFzaGJpbl9yZW1vdmUoaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLCAobG9uZykgc2VsZiwKCQkJCSAgICAgIE5VTEwpOwoKCQlJUkRBX0FTU0VSVChsc2FwID09IHNlbGYsIHJldHVybiAtMTspOwoJCUlSREFfQVNTRVJUKHNlbGYtPmxhcCAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCQlJUkRBX0FTU0VSVChzZWxmLT5sYXAtPmxzYXBzICE9IE5VTEwsIHJldHVybiAtMTspOwoKCQloYXNoYmluX2luc2VydChzZWxmLT5sYXAtPmxzYXBzLCAoaXJkYV9xdWV1ZV90ICopIHNlbGYsCgkJCSAgICAgICAobG9uZykgc2VsZiwgTlVMTCk7CgoJCXNldF9iaXQoMCwgJnNlbGYtPmNvbm5lY3RlZCk7CS8qIFRSVUUgKi8KCgkJaXJsbXBfc2VuZF9sY2ZfcGR1KHNlbGYtPmxhcCwgc2VsZi0+ZGxzYXBfc2VsLAoJCQkJICAgc2VsZi0+c2xzYXBfc2VsLCBDT05ORUNUX0NORiwgc2tiKTsKCgkJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CgoJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX0RBVEFfVFJBTlNGRVJfUkVBRFkpOwoJCWJyZWFrOwoJY2FzZSBMTV9XQVRDSERPR19USU1FT1VUOgoJCS8qIE1heSBoYXBwZW4sIHdobyBrbm93cy4uLgoJCSAqIEplYW4gSUkgKi8KCQlJUkRBX0RFQlVHKDAsICIlcygpIFdBVENIRE9HX1RJTUVPVVQhXG4iLCAgX19GVU5DVElPTl9fKTsKCgkJLyogRGlzY29ubmVjdCwgZ2V0IG91dC4uLiAtIEplYW4gSUkgKi8KCQlzZWxmLT5sYXAgPSBOVUxMOwoJCXNlbGYtPmRsc2FwX3NlbCA9IExTQVBfQU5ZOwoJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX0RJU0NPTk5FQ1RFRCk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCS8qIExNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT04gOiBTaG91bGQgbmV2ZXIgaGFwcGVuLCB3ZQoJCSAqIGFyZSAqbm90KiB5ZXQgYm91bmQgdG8gdGhlIElyTEFQIGxpbmsuIEplYW4gSUkgKi8KCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIGV2ZW50ICVzIG9uIExTQVAgJSMwMnhcbiIsCgkJCSAgIF9fRlVOQ1RJT05fXywgaXJsbXBfZXZlbnRbZXZlbnRdLCBzZWxmLT5zbHNhcF9zZWwpOwoJCWJyZWFrOwoJfQoJcmV0dXJuIHJldDsKfQoKLyoKICogRnVuY3Rpb24gaXJsbXBfc3RhdGVfY29ubmVjdF9wZW5kIChldmVudCwgc2tiLCBpbmZvKQogKgogKiAgICBDT05ORUNUX1BFTkQKICoKICovCnN0YXRpYyBpbnQgaXJsbXBfc3RhdGVfY29ubmVjdF9wZW5kKHN0cnVjdCBsc2FwX2NiICpzZWxmLCBJUkxNUF9FVkVOVCBldmVudCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOwoJaW50IHJldCA9IDA7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIHJldHVybiAtMTspOwoKCXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgTE1fQ09OTkVDVF9SRVFVRVNUOgoJCS8qIEtlZXAgc3RhdGUgKi8KCQlicmVhazsKCWNhc2UgTE1fQ09OTkVDVF9SRVNQT05TRToKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBMTV9DT05ORUNUX1JFU1BPTlNFLCAiCgkJCSAgICJubyBpbmRpY2F0aW9uIGlzc3VlZCB5ZXRcbiIsICBfX0ZVTkNUSU9OX18pOwoJCS8qIEtlZXAgc3RhdGUgKi8KCQlicmVhazsKCWNhc2UgTE1fRElTQ09OTkVDVF9SRVFVRVNUOgoJCUlSREFfREVCVUcoMCwgIiVzKCksIExNX0RJU0NPTk5FQ1RfUkVRVUVTVCwgIgoJCQkgICAibm90IHlldCBib3VuZCB0byBJckxBUCBjb25uZWN0aW9uXG4iLCAgX19GVU5DVElPTl9fKTsKCQkvKiBLZWVwIHN0YXRlICovCgkJYnJlYWs7CgljYXNlIExNX0xBUF9DT05ORUNUX0NPTkZJUk06CgkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgTFNfQ09OTkVDVF9DT05GSVJNXG4iLCAgX19GVU5DVElPTl9fKTsKCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9DT05ORUNUKTsKCgkJdHhfc2tiID0gc2VsZi0+Y29ubl9za2I7CgkJc2VsZi0+Y29ubl9za2IgPSBOVUxMOwoKCQlpcmxtcF9jb25uZWN0X2luZGljYXRpb24oc2VsZiwgdHhfc2tiKTsKCQkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudCAtIHNlZSBpcmxtcF9jb25uZWN0X2luZGljYXRpb24oKS4gKi8KCQlkZXZfa2ZyZWVfc2tiKHR4X3NrYik7CgkJYnJlYWs7CgljYXNlIExNX1dBVENIRE9HX1RJTUVPVVQ6CgkJLyogV2lsbCBoYXBwZW4gaW4gc29tZSByYXJlIGNhc2VzIGJlY2F1c2Ugb2YgYSByYWNlIGNvbmRpdGlvbi4KCQkgKiBKdXN0IG1ha2Ugc3VyZSB3ZSBkb24ndCBzdGF5IHRoZXJlIGZvcmV2ZXIuLi4KCQkgKiBKZWFuIElJICovCgkJSVJEQV9ERUJVRygwLCAiJXMoKSBXQVRDSERPR19USU1FT1VUIVxuIiwgIF9fRlVOQ1RJT05fXyk7CgoJCS8qIEdvIGJhY2sgdG8gZGlzY29ubmVjdGVkIG1vZGUsIGtlZXAgdGhlIHNvY2tldCB3YWl0aW5nICovCgkJc2VsZi0+bGFwID0gTlVMTDsKCQlzZWxmLT5kbHNhcF9zZWwgPSBMU0FQX0FOWTsKCQlpZihzZWxmLT5jb25uX3NrYikKCQkJZGV2X2tmcmVlX3NrYihzZWxmLT5jb25uX3NrYik7CgkJc2VsZi0+Y29ubl9za2IgPSBOVUxMOwoJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX0RJU0NPTk5FQ1RFRCk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCS8qIExNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT04gOiBTaG91bGQgbmV2ZXIgaGFwcGVuLCB3ZQoJCSAqIGFyZSAqbm90KiB5ZXQgYm91bmQgdG8gdGhlIElyTEFQIGxpbmsuIEplYW4gSUkgKi8KCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIGV2ZW50ICVzIG9uIExTQVAgJSMwMnhcbiIsCgkJCSAgIF9fRlVOQ1RJT05fXywgaXJsbXBfZXZlbnRbZXZlbnRdLCBzZWxmLT5zbHNhcF9zZWwpOwoJCWJyZWFrOwoJfQoJcmV0dXJuIHJldDsKfQoKLyoKICogRnVuY3Rpb24gaXJsbXBfc3RhdGVfZHRyIChzZWxmLCBldmVudCwgc2tiKQogKgogKiAgICBEQVRBX1RSQU5TRkVSX1JFQURZCiAqCiAqLwpzdGF0aWMgaW50IGlybG1wX3N0YXRlX2R0cihzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgSVJMTVBfRVZFTlQgZXZlbnQsCgkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCUxNX1JFQVNPTiByZWFzb247CglpbnQgcmV0ID0gMDsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5sYXAgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgoJc3dpdGNoIChldmVudCkgewoJY2FzZSBMTV9EQVRBX1JFUVVFU1Q6IC8qIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2UgKi8KCQlpcmxtcF9zZW5kX2RhdGFfcGR1KHNlbGYtPmxhcCwgc2VsZi0+ZGxzYXBfc2VsLAoJCQkJICAgIHNlbGYtPnNsc2FwX3NlbCwgRkFMU0UsIHNrYik7CgkJYnJlYWs7CgljYXNlIExNX0RBVEFfSU5ESUNBVElPTjogLyogT3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZSAqLwoJCWlybG1wX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IpOwoJCWJyZWFrOwoJY2FzZSBMTV9VREFUQV9SRVFVRVNUOgoJCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCQlpcmxtcF9zZW5kX2RhdGFfcGR1KHNlbGYtPmxhcCwgc2VsZi0+ZGxzYXBfc2VsLAoJCQkJICAgIHNlbGYtPnNsc2FwX3NlbCwgVFJVRSwgc2tiKTsKCQlicmVhazsKCWNhc2UgTE1fVURBVEFfSU5ESUNBVElPTjoKCQlpcmxtcF91ZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYik7CgkJYnJlYWs7CgljYXNlIExNX0NPTk5FQ1RfUkVRVUVTVDoKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBMTV9DT05ORUNUX1JFUVVFU1QsICIKCQkJICAgImVycm9yLCBMU0FQIGFscmVhZHkgY29ubmVjdGVkXG4iLCBfX0ZVTkNUSU9OX18pOwoJCS8qIEtlZXAgc3RhdGUgKi8KCQlicmVhazsKCWNhc2UgTE1fQ09OTkVDVF9SRVNQT05TRToKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBMTV9DT05ORUNUX1JFU1BPTlNFLCAiCgkJCSAgICJlcnJvciwgTFNBUCBhbHJlYWR5IGNvbm5lY3RlZFxuIiwgX19GVU5DVElPTl9fKTsKCQkvKiBLZWVwIHN0YXRlICovCgkJYnJlYWs7CgljYXNlIExNX0RJU0NPTk5FQ1RfUkVRVUVTVDoKCQlpcmxtcF9zZW5kX2xjZl9wZHUoc2VsZi0+bGFwLCBzZWxmLT5kbHNhcF9zZWwsIHNlbGYtPnNsc2FwX3NlbCwKCQkJCSAgIERJU0NPTk5FQ1QsIHNrYik7CgkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfRElTQ09OTkVDVEVEKTsKCQkvKiBDYWxsZWQgb25seSBmcm9tIGlybG1wX2Rpc2Nvbm5lY3RfcmVxdWVzdCgpLCB3aWxsCgkJICogdW5iaW5kIGZyb20gTEFQIG92ZXIgdGhlcmUuIEplYW4gSUkgKi8KCgkJLyogVHJ5IHRvIGNsb3NlIHRoZSBMQVAgY29ubmVjdGlvbiBpZiBpdHMgc3RpbGwgdGhlcmUgKi8KCQlpZiAoc2VsZi0+bGFwKSB7CgkJCUlSREFfREVCVUcoNCwgIiVzKCksIHRyeWluZyB0byBjbG9zZSBJckxBUFxuIiwKCQkJCSAgIF9fRlVOQ1RJT05fXyk7CgkJCWlybG1wX2RvX2xhcF9ldmVudChzZWxmLT5sYXAsCgkJCQkJICAgTE1fTEFQX0RJU0NPTk5FQ1RfUkVRVUVTVCwKCQkJCQkgICBOVUxMKTsKCQl9CgkJYnJlYWs7CgljYXNlIExNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT046CgkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfRElTQ09OTkVDVEVEKTsKCgkJcmVhc29uID0gaXJsbXBfY29udmVydF9sYXBfcmVhc29uKHNlbGYtPmxhcC0+cmVhc29uKTsKCgkJaXJsbXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIHJlYXNvbiwgTlVMTCk7CgkJYnJlYWs7CgljYXNlIExNX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9ESVNDT05ORUNURUQpOwoKCQlJUkRBX0FTU0VSVChzZWxmLT5sYXAgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgkJSVJEQV9BU1NFUlQoc2VsZi0+bGFwLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm4gLTE7KTsKCgkJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtMTspOwoJCUlSREFfQVNTRVJUKHNrYi0+bGVuID4gMywgcmV0dXJuIC0xOyk7CgkJcmVhc29uID0gc2tiLT5kYXRhWzNdOwoKCQkgLyogVHJ5IHRvIGNsb3NlIHRoZSBMQVAgY29ubmVjdGlvbiAqLwoJCUlSREFfREVCVUcoNCwgIiVzKCksIHRyeWluZyB0byBjbG9zZSBJckxBUFxuIiwgX19GVU5DVElPTl9fKTsKCQlpcmxtcF9kb19sYXBfZXZlbnQoc2VsZi0+bGFwLCBMTV9MQVBfRElTQ09OTkVDVF9SRVFVRVNULCBOVUxMKTsKCgkJaXJsbXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIHJlYXNvbiwgc2tiKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBldmVudCAlcyBvbiBMU0FQICUjMDJ4XG4iLAoJCQkgICBfX0ZVTkNUSU9OX18sIGlybG1wX2V2ZW50W2V2ZW50XSwgc2VsZi0+c2xzYXBfc2VsKTsKCQlicmVhazsKCX0KCXJldHVybiByZXQ7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybG1wX3N0YXRlX3NldHVwIChldmVudCwgc2tiLCBpbmZvKQogKgogKiAgICBTRVRVUCwgU3RhdGlvbiBDb250cm9sIGhhcyBzZXQgdXAgdGhlIHVuZGVybHlpbmcgSXJMQVAgY29ubmVjdGlvbi4KICogICAgQW4gTFNBUCBjb25uZWN0aW9uIHJlcXVlc3QgaGFzIGJlZW4gdHJhbnNtaXR0ZWQgdG8gdGhlIHBlZXIKICogICAgTFNBUC1Db25uZWN0aW9uIENvbnRyb2wgRlNNIGFuZCB3ZSBhcmUgYXdhaXRpbmcgcmVwbHkuCiAqLwpzdGF0aWMgaW50IGlybG1wX3N0YXRlX3NldHVwKHN0cnVjdCBsc2FwX2NiICpzZWxmLCBJUkxNUF9FVkVOVCBldmVudCwKCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglMTV9SRUFTT04gcmVhc29uOwoJaW50IHJldCA9IDA7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgTE1fQ09OTkVDVF9DT05GSVJNOgoJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX0RBVEFfVFJBTlNGRVJfUkVBRFkpOwoKCQlkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKCgkJaXJsbXBfY29ubmVjdF9jb25maXJtKHNlbGYsIHNrYik7CgkJYnJlYWs7CgljYXNlIExNX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9ESVNDT05ORUNURUQpOwoKCQlJUkRBX0FTU0VSVChzZWxmLT5sYXAgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgkJSVJEQV9BU1NFUlQoc2VsZi0+bGFwLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm4gLTE7KTsKCgkJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtMTspOwoJCUlSREFfQVNTRVJUKHNrYi0+bGVuID4gMywgcmV0dXJuIC0xOyk7CgkJcmVhc29uID0gc2tiLT5kYXRhWzNdOwoKCQkgLyogVHJ5IHRvIGNsb3NlIHRoZSBMQVAgY29ubmVjdGlvbiAqLwoJCUlSREFfREVCVUcoNCwgIiVzKCksIHRyeWluZyB0byBjbG9zZSBJckxBUFxuIiwgIF9fRlVOQ1RJT05fXyk7CgkJaXJsbXBfZG9fbGFwX2V2ZW50KHNlbGYtPmxhcCwgTE1fTEFQX0RJU0NPTk5FQ1RfUkVRVUVTVCwgTlVMTCk7CgoJCWlybG1wX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCByZWFzb24sIHNrYik7CgkJYnJlYWs7CgljYXNlIExNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT046CgkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfRElTQ09OTkVDVEVEKTsKCgkJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CgoJCUlSREFfQVNTRVJUKHNlbGYtPmxhcCAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCQlJUkRBX0FTU0VSVChzZWxmLT5sYXAtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybiAtMTspOwoKCQlyZWFzb24gPSBpcmxtcF9jb252ZXJ0X2xhcF9yZWFzb24oc2VsZi0+bGFwLT5yZWFzb24pOwoKCQlpcmxtcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgcmVhc29uLCBza2IpOwoJCWJyZWFrOwoJY2FzZSBMTV9XQVRDSERPR19USU1FT1VUOgoJCUlSREFfREVCVUcoMCwgIiVzKCkgV0FUQ0hET0dfVElNRU9VVCFcbiIsIF9fRlVOQ1RJT05fXyk7CgoJCUlSREFfQVNTRVJUKHNlbGYtPmxhcCAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCQlpcmxtcF9kb19sYXBfZXZlbnQoc2VsZi0+bGFwLCBMTV9MQVBfRElTQ09OTkVDVF9SRVFVRVNULCBOVUxMKTsKCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9ESVNDT05ORUNURUQpOwoKCQlpcmxtcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTE1fQ09OTkVDVF9GQUlMVVJFLCBOVUxMKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBldmVudCAlcyBvbiBMU0FQICUjMDJ4XG4iLAoJCQkgICBfX0ZVTkNUSU9OX18sIGlybG1wX2V2ZW50W2V2ZW50XSwgc2VsZi0+c2xzYXBfc2VsKTsKCQlicmVhazsKCX0KCXJldHVybiByZXQ7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybG1wX3N0YXRlX3NldHVwX3BlbmQgKGV2ZW50LCBza2IsIGluZm8pCiAqCiAqICAgIFNFVFVQX1BFTkQsIEFuIExNX0NPTk5FQ1RfUkVRVUVTVCBoYXMgYmVlbiByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2aWNlCiAqICAgIHVzZXIgdG8gc2V0IHVwIGFuIExTQVAgY29ubmVjdGlvbi4gQSByZXF1ZXN0IGhhcyBiZWVuIHNlbnQgdG8gdGhlCiAqICAgIExBUCBGU00gdG8gc2V0IHVwIHRoZSB1bmRlcmx5aW5nIElyTEFQIGNvbm5lY3Rpb24sIGFuZCB3ZQogKiAgICBhcmUgYXdhaXRpbmcgY29uZmlybS4KICovCnN0YXRpYyBpbnQgaXJsbXBfc3RhdGVfc2V0dXBfcGVuZChzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgSVJMTVBfRVZFTlQgZXZlbnQsCgkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBza19idWZmICp0eF9za2I7CglMTV9SRUFTT04gcmVhc29uOwoJaW50IHJldCA9IDA7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoaXJsbXAgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgoJc3dpdGNoIChldmVudCkgewoJY2FzZSBMTV9MQVBfQ09OTkVDVF9DT05GSVJNOgoJCUlSREFfQVNTRVJUKHNlbGYtPmNvbm5fc2tiICE9IE5VTEwsIHJldHVybiAtMTspOwoKCQl0eF9za2IgPSBzZWxmLT5jb25uX3NrYjsKCQlzZWxmLT5jb25uX3NrYiA9IE5VTEw7CgoJCWlybG1wX3NlbmRfbGNmX3BkdShzZWxmLT5sYXAsIHNlbGYtPmRsc2FwX3NlbCwKCQkJCSAgIHNlbGYtPnNsc2FwX3NlbCwgQ09OTkVDVF9DTUQsIHR4X3NrYik7CgkJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgaXJsYXBfZGF0YV9yZXF1ZXN0KCkuICovCgkJZGV2X2tmcmVlX3NrYih0eF9za2IpOwoKCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9TRVRVUCk7CgkJYnJlYWs7CgljYXNlIExNX1dBVENIRE9HX1RJTUVPVVQ6CgkJSVJEQV9ERUJVRygwLCAiJXMoKSA6IFdBVENIRE9HX1RJTUVPVVQgIVxuIiwgIF9fRlVOQ1RJT05fXyk7CgoJCUlSREFfQVNTRVJUKHNlbGYtPmxhcCAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCQlpcmxtcF9kb19sYXBfZXZlbnQoc2VsZi0+bGFwLCBMTV9MQVBfRElTQ09OTkVDVF9SRVFVRVNULCBOVUxMKTsKCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9ESVNDT05ORUNURUQpOwoKCQlpcmxtcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTE1fQ09OTkVDVF9GQUlMVVJFLCBOVUxMKTsKCQlicmVhazsKCWNhc2UgTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjogLyogTFNfRGlzY29ubmVjdC5pbmRpY2F0aW9uICovCgkJZGVsX3RpbWVyKCAmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOwoKCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9ESVNDT05ORUNURUQpOwoKCQlyZWFzb24gPSBpcmxtcF9jb252ZXJ0X2xhcF9yZWFzb24oc2VsZi0+bGFwLT5yZWFzb24pOwoKCQlpcmxtcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgcmVhc29uLCBOVUxMKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBldmVudCAlcyBvbiBMU0FQICUjMDJ4XG4iLAoJCQkgICBfX0ZVTkNUSU9OX18sIGlybG1wX2V2ZW50W2V2ZW50XSwgc2VsZi0+c2xzYXBfc2VsKTsKCQlicmVhazsKCX0KCXJldHVybiByZXQ7Cn0K