LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmxtcF9ldmVudC5jCiAqIFZlcnNpb246ICAgICAgIDAuOAogKiBEZXNjcmlwdGlvbjogICBBbiBJckRBIExNUCBldmVudCBkcml2ZXIgZm9yIExpbnV4CiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBNb24gQXVnICA0IDIwOjQwOjUzIDE5OTcKICogTW9kaWZpZWQgYXQ6ICAgVHVlIERlYyAxNCAyMzowNDoxNiAxOTk5CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICoKICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4sCiAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgogKgogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS90aW1lci5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXAuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcF9mcmFtZS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXBfZXZlbnQuaD4KCmNvbnN0IGNoYXIgKmlybG1wX3N0YXRlW10gPSB7CgkiTEFQX1NUQU5EQlkiLAoJIkxBUF9VX0NPTk5FQ1QiLAoJIkxBUF9BQ1RJVkUiLAp9OwoKY29uc3QgY2hhciAqaXJsc2FwX3N0YXRlW10gPSB7CgkiTFNBUF9ESVNDT05ORUNURUQiLAoJIkxTQVBfQ09OTkVDVCIsCgkiTFNBUF9DT05ORUNUX1BFTkQiLAoJIkxTQVBfREFUQV9UUkFOU0ZFUl9SRUFEWSIsCgkiTFNBUF9TRVRVUCIsCgkiTFNBUF9TRVRVUF9QRU5EIiwKfTsKCiNpZmRlZiBDT05GSUdfSVJEQV9ERUJVRwpzdGF0aWMgY29uc3QgY2hhciAqaXJsbXBfZXZlbnRbXSA9IHsKCSJMTV9DT05ORUNUX1JFUVVFU1QiLAoJIkxNX0NPTk5FQ1RfQ09ORklSTSIsCgkiTE1fQ09OTkVDVF9SRVNQT05TRSIsCgkiTE1fQ09OTkVDVF9JTkRJQ0FUSU9OIiwKCgkiTE1fRElTQ09OTkVDVF9JTkRJQ0FUSU9OIiwKCSJMTV9ESVNDT05ORUNUX1JFUVVFU1QiLAoKCSJMTV9EQVRBX1JFUVVFU1QiLAoJIkxNX1VEQVRBX1JFUVVFU1QiLAoJIkxNX0RBVEFfSU5ESUNBVElPTiIsCgkiTE1fVURBVEFfSU5ESUNBVElPTiIsCgoJIkxNX1dBVENIRE9HX1RJTUVPVVQiLAoKCS8qIElyTEFQIGV2ZW50cyAqLwoJIkxNX0xBUF9DT05ORUNUX1JFUVVFU1QiLAoJIkxNX0xBUF9DT05ORUNUX0lORElDQVRJT04iLAoJIkxNX0xBUF9DT05ORUNUX0NPTkZJUk0iLAoJIkxNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT04iLAoJIkxNX0xBUF9ESVNDT05ORUNUX1JFUVVFU1QiLAoJIkxNX0xBUF9ESVNDT1ZFUllfUkVRVUVTVCIsCgkiTE1fTEFQX0RJU0NPVkVSWV9DT05GSVJNIiwKCSJMTV9MQVBfSURMRV9USU1FT1VUIiwKfTsKI2VuZGlmCS8qIENPTkZJR19JUkRBX0RFQlVHICovCgovKiBMQVAgQ29ubmVjdGlvbiBjb250cm9sIHByb3RvIGRlY2xhcmF0aW9ucyAqLwpzdGF0aWMgdm9pZCBpcmxtcF9zdGF0ZV9zdGFuZGJ5ICAoc3RydWN0IGxhcF9jYiAqLCBJUkxNUF9FVkVOVCwKCQkJCSAgc3RydWN0IHNrX2J1ZmYgKik7CnN0YXRpYyB2b2lkIGlybG1wX3N0YXRlX3VfY29ubmVjdChzdHJ1Y3QgbGFwX2NiICosIElSTE1QX0VWRU5ULAoJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqKTsKc3RhdGljIHZvaWQgaXJsbXBfc3RhdGVfYWN0aXZlICAgKHN0cnVjdCBsYXBfY2IgKiwgSVJMTVBfRVZFTlQsCgkJCQkgIHN0cnVjdCBza19idWZmICopOwoKLyogTFNBUCBDb25uZWN0aW9uIGNvbnRyb2wgcHJvdG8gZGVjbGFyYXRpb25zICovCnN0YXRpYyBpbnQgaXJsbXBfc3RhdGVfZGlzY29ubmVjdGVkKHN0cnVjdCBsc2FwX2NiICosIElSTE1QX0VWRU5ULAoJCQkJICAgIHN0cnVjdCBza19idWZmICopOwpzdGF0aWMgaW50IGlybG1wX3N0YXRlX2Nvbm5lY3QgICAgIChzdHJ1Y3QgbHNhcF9jYiAqLCBJUkxNUF9FVkVOVCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqKTsKc3RhdGljIGludCBpcmxtcF9zdGF0ZV9jb25uZWN0X3BlbmQoc3RydWN0IGxzYXBfY2IgKiwgSVJMTVBfRVZFTlQsCgkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKik7CnN0YXRpYyBpbnQgaXJsbXBfc3RhdGVfZHRyICAgICAgICAgKHN0cnVjdCBsc2FwX2NiICosIElSTE1QX0VWRU5ULAoJCQkJICAgIHN0cnVjdCBza19idWZmICopOwpzdGF0aWMgaW50IGlybG1wX3N0YXRlX3NldHVwICAgICAgIChzdHJ1Y3QgbHNhcF9jYiAqLCBJUkxNUF9FVkVOVCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqKTsKc3RhdGljIGludCBpcmxtcF9zdGF0ZV9zZXR1cF9wZW5kICAoc3RydWN0IGxzYXBfY2IgKiwgSVJMTVBfRVZFTlQsCgkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKik7CgpzdGF0aWMgdm9pZCAoKmxhcF9zdGF0ZVtdKSAoc3RydWN0IGxhcF9jYiAqLCBJUkxNUF9FVkVOVCwgc3RydWN0IHNrX2J1ZmYgKikgPQp7CglpcmxtcF9zdGF0ZV9zdGFuZGJ5LAoJaXJsbXBfc3RhdGVfdV9jb25uZWN0LAoJaXJsbXBfc3RhdGVfYWN0aXZlLAp9OwoKc3RhdGljIGludCAoKmxzYXBfc3RhdGVbXSkoIHN0cnVjdCBsc2FwX2NiICosIElSTE1QX0VWRU5ULCBzdHJ1Y3Qgc2tfYnVmZiAqKSA9CnsKCWlybG1wX3N0YXRlX2Rpc2Nvbm5lY3RlZCwKCWlybG1wX3N0YXRlX2Nvbm5lY3QsCglpcmxtcF9zdGF0ZV9jb25uZWN0X3BlbmQsCglpcmxtcF9zdGF0ZV9kdHIsCglpcmxtcF9zdGF0ZV9zZXR1cCwKCWlybG1wX3N0YXRlX3NldHVwX3BlbmQKfTsKCnN0YXRpYyBpbmxpbmUgdm9pZCBpcmxtcF9uZXh0X2xhcF9zdGF0ZShzdHJ1Y3QgbGFwX2NiICpzZWxmLAoJCQkJCUlSTE1QX1NUQVRFIHN0YXRlKQp7CgkvKgoJSVJEQV9ERUJVRyg0LCAiJXMoKSwgTE1QIExBUCA9ICVzXG4iLCBfX0ZVTkNUSU9OX18sIGlybG1wX3N0YXRlW3N0YXRlXSk7CgkqLwoJc2VsZi0+bGFwX3N0YXRlID0gc3RhdGU7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc3RydWN0IGxzYXBfY2IgKnNlbGYsCgkJCQkJIExTQVBfU1RBVEUgc3RhdGUpCnsKCS8qCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9ERUJVRyg0LCAiJXMoKSwgTE1QIExTQVAgPSAlc1xuIiwgX19GVU5DVElPTl9fLCBpcmxzYXBfc3RhdGVbc3RhdGVdKTsKCSovCglzZWxmLT5sc2FwX3N0YXRlID0gc3RhdGU7Cn0KCi8qIERvIGNvbm5lY3Rpb24gY29udHJvbCBldmVudHMgKi8KaW50IGlybG1wX2RvX2xzYXBfZXZlbnQoc3RydWN0IGxzYXBfY2IgKnNlbGYsIElSTE1QX0VWRU5UIGV2ZW50LAoJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIHJldHVybiAtMTspOwoKCUlSREFfREVCVUcoNCwgIiVzKCksIEVWRU5UID0gJXMsIFNUQVRFID0gJXNcbiIsCgkJX19GVU5DVElPTl9fLCBpcmxtcF9ldmVudFtldmVudF0sIGlybHNhcF9zdGF0ZVsgc2VsZi0+bHNhcF9zdGF0ZV0pOwoKCXJldHVybiAoKmxzYXBfc3RhdGVbc2VsZi0+bHNhcF9zdGF0ZV0pIChzZWxmLCBldmVudCwgc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gZG9fbGFwX2V2ZW50IChldmVudCwgc2tiLCBpbmZvKQogKgogKiAgICBEbyBJckxBUCBjb250cm9sIGV2ZW50cwogKgogKi8Kdm9pZCBpcmxtcF9kb19sYXBfZXZlbnQoc3RydWN0IGxhcF9jYiAqc2VsZiwgSVJMTVBfRVZFTlQgZXZlbnQsCgkJCXN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKCglJUkRBX0RFQlVHKDQsICIlcygpLCBFVkVOVCA9ICVzLCBTVEFURSA9ICVzXG4iLCBfX0ZVTkNUSU9OX18sCgkJICAgaXJsbXBfZXZlbnRbZXZlbnRdLAoJCSAgIGlybG1wX3N0YXRlW3NlbGYtPmxhcF9zdGF0ZV0pOwoKCSgqbGFwX3N0YXRlW3NlbGYtPmxhcF9zdGF0ZV0pIChzZWxmLCBldmVudCwgc2tiKTsKfQoKdm9pZCBpcmxtcF9kaXNjb3ZlcnlfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQp7CglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCS8qIFdlIGFsd2F5cyBjbGVhbnVwIHRoZSBsb2cgKGFjdGl2ZSAmIHBhc3NpdmUgZGlzY292ZXJ5KSAqLwoJaXJsbXBfZG9fZXhwaXJ5KCk7CgoJLyogQWN0aXZlIGRpc2NvdmVyeSBpcyBjb25kaXRpb25hbCAqLwoJaWYgKHN5c2N0bF9kaXNjb3ZlcnkpCgkJaXJsbXBfZG9fZGlzY292ZXJ5KHN5c2N0bF9kaXNjb3Zlcnlfc2xvdHMpOwoKCS8qIFJlc3RhcnQgdGltZXIgKi8KCWlybG1wX3N0YXJ0X2Rpc2NvdmVyeV90aW1lcihpcmxtcCwgc3lzY3RsX2Rpc2NvdmVyeV90aW1lb3V0ICogSFopOwp9Cgp2b2lkIGlybG1wX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKewoJc3RydWN0IGxzYXBfY2IgKnNlbGYgPSAoc3RydWN0IGxzYXBfY2IgKikgZGF0YTsKCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuOyk7CgoJaXJsbXBfZG9fbHNhcF9ldmVudChzZWxmLCBMTV9XQVRDSERPR19USU1FT1VULCBOVUxMKTsKfQoKdm9pZCBpcmxtcF9pZGxlX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKewoJc3RydWN0IGxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgbGFwX2NiICopIGRhdGE7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuOyk7CgoJaXJsbXBfZG9fbGFwX2V2ZW50KHNlbGYsIExNX0xBUF9JRExFX1RJTUVPVVQsIE5VTEwpOwp9CgovKgogKiBTZW5kIGFuIGV2ZW50IG9uIGFsbCBMU0FQcyBhdHRhY2hlZCB0byB0aGlzIExBUC4KICovCnN0YXRpYyBpbmxpbmUgdm9pZAppcmxtcF9kb19hbGxfbHNhcF9ldmVudChoYXNoYmluX3QgKglsc2FwX2hhc2hiaW4sCgkJCUlSTE1QX0VWRU5UCWV2ZW50KQp7CglzdHJ1Y3QgbHNhcF9jYiAqbHNhcDsKCXN0cnVjdCBsc2FwX2NiICpsc2FwX25leHQ7CgoJLyogTm90ZSA6IHRoaXMgZnVuY3Rpb24gdXNlIHRoZSBuZXcgaGFzaGJpbl9maW5kX25leHQoKQoJICogZnVuY3Rpb24sIGluc3RlYWQgb2YgdGhlIG9sZCBoYXNoYmluX2dldF9uZXh0KCkuCgkgKiBUaGlzIG1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBhbHdheXMgcG9pbnRpbmcgb25lIGxzYXAKCSAqIGFoZWFkLCBzbyB0aGF0IGlmIHRoZSBjdXJyZW50IGxzYXAgaXMgcmVtb3ZlZCBhcyB0aGUKCSAqIHJlc3VsdCBvZiBzZW5kaW5nIHRoZSBldmVudCwgd2UgZG9uJ3QgY2FyZS4KCSAqIEFsc28sIGFzIHdlIHN0b3JlIHRoZSBjb250ZXh0IG91cnNlbHZlcywgaWYgYW4gZW51bWVyYXRpb24KCSAqIG9mIHRoZSBzYW1lIGxzYXAgaGFzaGJpbiBoYXBwZW5zIGFzIHRoZSByZXN1bHQgb2Ygc2VuZGluZyB0aGUKCSAqIGV2ZW50LCB3ZSBkb24ndCBjYXJlLgoJICogVGhlIG9ubHkgcHJvYmxlbSBpcyBpZiB0aGUgbmV4dCBsc2FwIGlzIHJlbW92ZWQuIEluIHRoYXQgY2FzZSwKCSAqIGhhc2hiaW5fZmluZF9uZXh0KCkgd2lsbCByZXR1cm4gTlVMTCBhbmQgd2Ugd2lsbCBhYm9ydCB0aGUKCSAqIGVudW1lcmF0aW9uLiAtIEplYW4gSUkgKi8KCgkvKiBBbHNvIDogd2UgZG9uJ3QgYWNjZXB0IGFueSBza2IgaW4gaW5wdXQuIFdlIGNhbiAqTk9UKiBwYXNzCgkgKiB0aGUgc2FtZSBza2IgdG8gbXVsdGlwbGUgY2xpZW50cyBzYWZlbHksIHdlIHdvdWxkIG5lZWQgdG8KCSAqIHNrYl9jbG9uZSgpIGl0LiAtIEplYW4gSUkgKi8KCglsc2FwID0gKHN0cnVjdCBsc2FwX2NiICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGxzYXBfaGFzaGJpbik7CgoJd2hpbGUgKE5VTEwgIT0gaGFzaGJpbl9maW5kX25leHQobHNhcF9oYXNoYmluLAoJCQkJCSAobG9uZykgbHNhcCwKCQkJCQkgTlVMTCwKCQkJCQkgKHZvaWQgKikgJmxzYXBfbmV4dCkgKSB7CgkJaXJsbXBfZG9fbHNhcF9ldmVudChsc2FwLCBldmVudCwgTlVMTCk7CgkJbHNhcCA9IGxzYXBfbmV4dDsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgICBMQVAgY29ubmVjdGlvbiBjb250cm9sIHN0YXRlcwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBGdW5jdGlvbiBpcmxtcF9zdGF0ZV9zdGFuZGJ5IChldmVudCwgc2tiLCBpbmZvKQogKgogKiAgICBTVEFOREJZLCBUaGUgSXJMQVAgY29ubmVjdGlvbiBkb2VzIG5vdCBleGlzdC4KICoKICovCnN0YXRpYyB2b2lkIGlybG1wX3N0YXRlX3N0YW5kYnkoc3RydWN0IGxhcF9jYiAqc2VsZiwgSVJMTVBfRVZFTlQgZXZlbnQsCgkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoJSVJEQV9BU1NFUlQoc2VsZi0+aXJsYXAgIT0gTlVMTCwgcmV0dXJuOyk7CgoJc3dpdGNoIChldmVudCkgewoJY2FzZSBMTV9MQVBfRElTQ09WRVJZX1JFUVVFU1Q6CgkJLyogaXJsbXBfbmV4dF9zdGF0aW9uX3N0YXRlKCBMTVBfRElTQ09WRVIpOyAqLwoKCQlpcmxhcF9kaXNjb3ZlcnlfcmVxdWVzdChzZWxmLT5pcmxhcCwgJmlybG1wLT5kaXNjb3ZlcnlfY21kKTsKCQlicmVhazsKCWNhc2UgTE1fTEFQX0NPTk5FQ1RfSU5ESUNBVElPTjoKCQkvKiAgSXQncyBpbXBvcnRhbnQgdG8gc3dpdGNoIHN0YXRlIGZpcnN0LCB0byBhdm9pZCBJckxNUCB0bwoJCSAqICB0aGluayB0aGF0IHRoZSBsaW5rIGlzIGZyZWUgc2luY2UgSXJMTVAgbWF5IHRoZW4gc3RhcnQKCQkgKiAgZGlzY292ZXJ5IGJlZm9yZSB0aGUgY29ubmVjdGlvbiBpcyBwcm9wZXJseSBzZXQgdXAuIERCLgoJCSAqLwoJCWlybG1wX25leHRfbGFwX3N0YXRlKHNlbGYsIExBUF9BQ1RJVkUpOwoKCQkvKiBKdXN0IGFjY2VwdCBjb25uZWN0aW9uIFRPRE8sIHRoaXMgc2hvdWxkIGJlIGZpeGVkICovCgkJaXJsYXBfY29ubmVjdF9yZXNwb25zZShzZWxmLT5pcmxhcCwgc2tiKTsKCQlicmVhazsKCWNhc2UgTE1fTEFQX0NPTk5FQ1RfUkVRVUVTVDoKCQlJUkRBX0RFQlVHKDQsICIlcygpIExTX0NPTk5FQ1RfUkVRVUVTVFxuIiwgX19GVU5DVElPTl9fKTsKCgkJaXJsbXBfbmV4dF9sYXBfc3RhdGUoc2VsZiwgTEFQX1VfQ09OTkVDVCk7CgoJCS8qIEZJWE1FOiBuZWVkIHRvIHNldCB1c2VycyByZXF1ZXN0ZWQgUW9TICovCgkJaXJsYXBfY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmlybGFwLCBzZWxmLT5kYWRkciwgTlVMTCwgMCk7CgkJYnJlYWs7CgljYXNlIExNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT046CgkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgRXJyb3IgTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTlxuIiwKCQkJICAgX19GVU5DVElPTl9fKTsKCgkJaXJsbXBfbmV4dF9sYXBfc3RhdGUoc2VsZiwgTEFQX1NUQU5EQlkpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIGV2ZW50ICVzXG4iLAoJCQkgICBfX0ZVTkNUSU9OX18sIGlybG1wX2V2ZW50W2V2ZW50XSk7CgkJYnJlYWs7Cgl9Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybG1wX3N0YXRlX3VfY29ubmVjdCAoZXZlbnQsIHNrYiwgaW5mbykKICoKICogICAgVV9DT05ORUNULCBUaGUgbGF5ZXIgYWJvdmUgaGFzIHRyaWVkIHRvIG9wZW4gYW4gTFNBUCBjb25uZWN0aW9uIGJ1dAogKiAgICBzaW5jZSB0aGUgSXJMQVAgY29ubmVjdGlvbiBkb2VzIG5vdCBleGlzdCwgd2UgbXVzdCBmaXJzdCBzdGFydCBhbgogKiAgICBJckxBUCBjb25uZWN0aW9uLiBXZSBhcmUgbm93IHdhaXRpbmcgcmVzcG9uc2UgZnJvbSBJckxBUC4KICogKi8Kc3RhdGljIHZvaWQgaXJsbXBfc3RhdGVfdV9jb25uZWN0KHN0cnVjdCBsYXBfY2IgKnNlbGYsIElSTE1QX0VWRU5UIGV2ZW50LAoJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0RFQlVHKDIsICIlcygpLCBldmVudD0lc1xuIiwgX19GVU5DVElPTl9fLCBpcmxtcF9ldmVudFtldmVudF0pOwoKCXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgTE1fTEFQX0NPTk5FQ1RfSU5ESUNBVElPTjoKCQkvKiAgSXQncyBpbXBvcnRhbnQgdG8gc3dpdGNoIHN0YXRlIGZpcnN0LCB0byBhdm9pZCBJckxNUCB0bwoJCSAqICB0aGluayB0aGF0IHRoZSBsaW5rIGlzIGZyZWUgc2luY2UgSXJMTVAgbWF5IHRoZW4gc3RhcnQKCQkgKiAgZGlzY292ZXJ5IGJlZm9yZSB0aGUgY29ubmVjdGlvbiBpcyBwcm9wZXJseSBzZXQgdXAuIERCLgoJCSAqLwoJCWlybG1wX25leHRfbGFwX3N0YXRlKHNlbGYsIExBUF9BQ1RJVkUpOwoKCQkvKiBKdXN0IGFjY2VwdCBjb25uZWN0aW9uIFRPRE8sIHRoaXMgc2hvdWxkIGJlIGZpeGVkICovCgkJaXJsYXBfY29ubmVjdF9yZXNwb25zZShzZWxmLT5pcmxhcCwgc2tiKTsKCgkJLyogVGVsbCBMU0FQcyB0aGF0IHRoZXkgY2FuIHN0YXJ0IHNlbmRpbmcgZGF0YSAqLwoJCWlybG1wX2RvX2FsbF9sc2FwX2V2ZW50KHNlbGYtPmxzYXBzLCBMTV9MQVBfQ09OTkVDVF9DT05GSVJNKTsKCgkJLyogTm90ZSA6IGJ5IHRoZSB0aW1lIHdlIGdldCB0aGVyZSAoTEFQIHJldHJpZXMgYW5kIGNvKSwKCQkgKiB0aGUgbHNhcHMgbWF5IGFscmVhZHkgaGF2ZSBnb25lLiBUaGlzIGF2b2lkIGdldHRpbmcgc3R1Y2sKCQkgKiBmb3JldmVyIGluIExBUF9BQ1RJVkUgc3RhdGUgLSBKZWFuIElJICovCgkJaWYgKEhBU0hCSU5fR0VUX1NJWkUoc2VsZi0+bHNhcHMpID09IDApIHsKCQkJSVJEQV9ERUJVRygwLCAiJXMoKSBOTyBMU0FQcyAhXG4iLCAgX19GVU5DVElPTl9fKTsKCQkJaXJsbXBfc3RhcnRfaWRsZV90aW1lcihzZWxmLCBMTV9JRExFX1RJTUVPVVQpOwoJCX0KCQlicmVhazsKCWNhc2UgTE1fTEFQX0NPTk5FQ1RfUkVRVUVTVDoKCQkvKiBBbHJlYWR5IHRyeWluZyB0byBjb25uZWN0ICovCgkJYnJlYWs7CgljYXNlIExNX0xBUF9DT05ORUNUX0NPTkZJUk06CgkJLyogRm9yIGFsbCBsc2FwX2NlIEUgQXNzb2NpYXRlZCBkbyBMU19Db25uZWN0X2NvbmZpcm0gKi8KCQlpcmxtcF9uZXh0X2xhcF9zdGF0ZShzZWxmLCBMQVBfQUNUSVZFKTsKCgkJLyogVGVsbCBMU0FQcyB0aGF0IHRoZXkgY2FuIHN0YXJ0IHNlbmRpbmcgZGF0YSAqLwoJCWlybG1wX2RvX2FsbF9sc2FwX2V2ZW50KHNlbGYtPmxzYXBzLCBMTV9MQVBfQ09OTkVDVF9DT05GSVJNKTsKCgkJLyogTm90ZSA6IGJ5IHRoZSB0aW1lIHdlIGdldCB0aGVyZSAoTEFQIHJldHJpZXMgYW5kIGNvKSwKCQkgKiB0aGUgbHNhcHMgbWF5IGFscmVhZHkgaGF2ZSBnb25lLiBUaGlzIGF2b2lkIGdldHRpbmcgc3R1Y2sKCQkgKiBmb3JldmVyIGluIExBUF9BQ1RJVkUgc3RhdGUgLSBKZWFuIElJICovCgkJaWYgKEhBU0hCSU5fR0VUX1NJWkUoc2VsZi0+bHNhcHMpID09IDApIHsKCQkJSVJEQV9ERUJVRygwLCAiJXMoKSBOTyBMU0FQcyAhXG4iLCAgX19GVU5DVElPTl9fKTsKCQkJaXJsbXBfc3RhcnRfaWRsZV90aW1lcihzZWxmLCBMTV9JRExFX1RJTUVPVVQpOwoJCX0KCQlicmVhazsKCWNhc2UgTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKCQlJUkRBX0RFQlVHKDQsICIlcygpLCBMTV9MQVBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OXG4iLCAgX19GVU5DVElPTl9fKTsKCQlpcmxtcF9uZXh0X2xhcF9zdGF0ZShzZWxmLCBMQVBfU1RBTkRCWSk7CgoJCS8qIFNlbmQgZGlzY29ubmVjdCBldmVudCB0byBhbGwgTFNBUHMgdXNpbmcgdGhpcyBsaW5rICovCgkJaXJsbXBfZG9fYWxsX2xzYXBfZXZlbnQoc2VsZi0+bHNhcHMsCgkJCQkJTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTik7CgkJYnJlYWs7CgljYXNlIExNX0xBUF9ESVNDT05ORUNUX1JFUVVFU1Q6CgkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgTE1fTEFQX0RJU0NPTk5FQ1RfUkVRVUVTVFxuIiwgIF9fRlVOQ1RJT05fXyk7CgoJCS8qIE9uZSBvZiB0aGUgTFNBUCBkaWQgdGltZW91dCBvciB3YXMgY2xvc2VkLCBpZiBpdCB3YXMKCQkgKiB0aGUgbGFzdCBvbmUsIHRyeSB0byBnZXQgb3V0IG9mIGhlcmUgLSBKZWFuIElJICovCgkJaWYgKEhBU0hCSU5fR0VUX1NJWkUoc2VsZi0+bHNhcHMpIDw9IDEpIHsKCQkJaXJsYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmlybGFwKTsKCQl9CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXZlbnQgJXNcbiIsCgkJCSBfX0ZVTkNUSU9OX18sIGlybG1wX2V2ZW50W2V2ZW50XSk7CgkJYnJlYWs7Cgl9Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybG1wX3N0YXRlX2FjdGl2ZSAoZXZlbnQsIHNrYiwgaW5mbykKICoKICogICAgQUNUSVZFLCBJckxBUCBjb25uZWN0aW9uIGlzIGFjdGl2ZQogKgogKi8Kc3RhdGljIHZvaWQgaXJsbXBfc3RhdGVfYWN0aXZlKHN0cnVjdCBsYXBfY2IgKnNlbGYsIElSTE1QX0VWRU5UIGV2ZW50LAoJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglzd2l0Y2ggKGV2ZW50KSB7CgljYXNlIExNX0xBUF9DT05ORUNUX1JFUVVFU1Q6CgkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgTFNfQ09OTkVDVF9SRVFVRVNUXG4iLCBfX0ZVTkNUSU9OX18pOwoKCQkvKgoJCSAqIElyTEFQIG1heSBoYXZlIGEgcGVuZGluZyBkaXNjb25uZWN0LiBXZSB0cmllZCB0byBjbG9zZQoJCSAqIElyTEFQLCBidXQgaXQgd2FzIHBvc3Rwb25lZCBiZWNhdXNlIHRoZSBsaW5rIHdhcwoJCSAqIGJ1c3kgb3Igd2Ugd2VyZSBzdGlsbCBzZW5kaW5nIHBhY2tldHMuIEFzIHdlIG5vdwoJCSAqIG5lZWQgaXQsIG1ha2Ugc3VyZSBpdCBzdGF5cyBvbi4gSmVhbiBJSQoJCSAqLwoJCWlybGFwX2NsZWFyX2Rpc2Nvbm5lY3Qoc2VsZi0+aXJsYXApOwoKCQkvKgoJCSAqICBMQVAgY29ubmVjdGlvbiBhbHJlYWR5IGFjdGl2ZSwganVzdCBib3VuY2UgYmFjayEgU2luY2Ugd2UKCQkgKiAgZG9uJ3Qga25vdyB3aGljaCBMU0FQIHRoYXQgdHJpZWQgdG8gZG8gdGhpcywgd2UgaGF2ZSB0bwoJCSAqICBub3RpZnkgYWxsIExTQVBzIHVzaW5nIHRoaXMgTEFQLCBidXQgdGhhdCBzaG91bGQgYmUgc2FmZSB0bwoJCSAqICBkbyBhbnl3YXkuCgkJICovCgkJaXJsbXBfZG9fYWxsX2xzYXBfZXZlbnQoc2VsZi0+bHNhcHMsIExNX0xBUF9DT05ORUNUX0NPTkZJUk0pOwoKCQkvKiBOZWVkZWQgYnkgY29ubmVjdCBpbmRpY2F0aW9uICovCgkJaXJsbXBfZG9fYWxsX2xzYXBfZXZlbnQoaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLAoJCQkJCUxNX0xBUF9DT05ORUNUX0NPTkZJUk0pOwoJCS8qIEtlZXAgc3RhdGUgKi8KCQlicmVhazsKCWNhc2UgTE1fTEFQX0RJU0NPTk5FQ1RfUkVRVUVTVDoKCQkvKgoJCSAqICBOZWVkIHRvIGZpbmQgb3V0IGlmIHdlIHNob3VsZCBjbG9zZSBJckxBUCBvciBub3QuIElmIHRoZXJlCgkJICogIGlzIG9ubHkgb25lIExTQVAgY29ubmVjdGlvbiBsZWZ0IG9uIHRoaXMgbGluaywgdGhhdCBMU0FQCgkJICogIG11c3QgYmUgdGhlIG9uZSB0aGF0IHRyaWVzIHRvIGNsb3NlIElyTEFQLiBJdCB3aWxsIGJlCgkJICogIHJlbW92ZWQgbGF0ZXIgYW5kIG1vdmVkIHRvIHRoZSBsaXN0IG9mIHVuY29ubmVjdGVkIExTQVBzCgkJICovCgkJaWYgKEhBU0hCSU5fR0VUX1NJWkUoc2VsZi0+bHNhcHMpID4gMCkgewoJCQkvKiBUaW1lciB2YWx1ZSBpcyBjaGVja2VkIGluIGlyc3lzY3RsIC0gSmVhbiBJSSAqLwoJCQlpcmxtcF9zdGFydF9pZGxlX3RpbWVyKHNlbGYsIHN5c2N0bF9sYXBfa2VlcGFsaXZlX3RpbWUgKiBIWiAvIDEwMDApOwoJCX0gZWxzZSB7CgkJCS8qIE5vIG1vcmUgY29ubmVjdGlvbnMsIHNvIGNsb3NlIElyTEFQICovCgoJCQkvKiBXZSBkb24ndCB3YW50IHRvIGNoYW5nZSBzdGF0ZSBqdXN0IHlldCwgYmVjYXVzZQoJCQkgKiB3ZSB3YW50IHRvIHJlZmxlY3QgYWNjdXJhdGVseSB0aGUgcmVhbCBzdGF0ZSBvZgoJCQkgKiB0aGUgTEFQLCBub3QgdGhlIHN0YXRlIHdlIHdpc2ggaXQgd2FzIGluLAoJCQkgKiBzbyB0aGF0IHdlIGRvbid0IGxvc2UgTE1fTEFQX0NPTk5FQ1RfUkVRVUVTVC4KCQkJICogSW4gc29tZSBjYXNlcywgSXJMQVAgd29uJ3QgY2xvc2UgdGhlIExBUAoJCQkgKiBpbW1lZGlhdGVseS4gRm9yIGV4YW1wbGUsIGl0IG1pZ2h0IHN0aWxsIGJlCgkJCSAqIHJldHJ5aW5nIHBhY2tldHMgb3Igd2FpdGluZyBmb3IgdGhlIHBmIGJpdC4KCQkJICogQXMgdGhlIExBUCBhbHdheXMgc2VuZCBhIERJU0NPTk5FQ1RfSU5ESUNBVElPTgoJCQkgKiBpbiBQQ0xPU0Ugb3IgU0NMT1NFLCBqdXN0IGNoYW5nZSBzdGF0ZSBvbiB0aGF0LgoJCQkgKiBKZWFuIElJICovCgkJCWlybGFwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5pcmxhcCk7CgkJfQoJCWJyZWFrOwoJY2FzZSBMTV9MQVBfSURMRV9USU1FT1VUOgoJCWlmIChIQVNIQklOX0dFVF9TSVpFKHNlbGYtPmxzYXBzKSA9PSAwKSB7CgkJCS8qIFNhbWUgcmVhc29uaW5nIGFzIGFib3ZlIC0ga2VlcCBzdGF0ZSAqLwoJCQlpcmxhcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+aXJsYXApOwoJCX0KCQlicmVhazsKCWNhc2UgTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKCQlpcmxtcF9uZXh0X2xhcF9zdGF0ZShzZWxmLCBMQVBfU1RBTkRCWSk7CgoJCS8qIEluIHNvbWUgY2FzZSwgYXQgdGhpcyBwb2ludCBvdXIgc2lkZSBoYXMgYWxyZWFkeSBjbG9zZWQKCQkgKiBhbGwgbHNhcHMsIGFuZCB3ZSBhcmUgd2FpdGluZyBmb3IgdGhlIGlkbGVfdGltZXIgdG8KCQkgKiBleHBpcmUuIElmIGFub3RoZXIgZGV2aWNlIHJlY29ubmVjdCBpbW1lZGlhdGVseSwgdGhlCgkJICogaWRsZSB0aW1lciB3aWxsIGV4cGlyZSBpbiB0aGUgbWlkbGUgb2YgdGhlIGNvbm5lY3Rpb24KCQkgKiBpbml0aWFsaXNhdGlvbiwgc2NyZXdpbmcgdXAgdGhpbmdzIGEgbG90Li4uCgkJICogVGhlcmVmb3JlLCB3ZSBtdXN0IHN0b3AgdGhlIHRpbWVyLi4uICovCgkJaXJsbXBfc3RvcF9pZGxlX3RpbWVyKHNlbGYpOwoKCQkvKgoJCSAqICBJbmZvcm0gYWxsIGNvbm5lY3RlZCBMU0FQJ3MgdXNpbmcgdGhpcyBsaW5rCgkJICovCgkJaXJsbXBfZG9fYWxsX2xzYXBfZXZlbnQoc2VsZi0+bHNhcHMsCgkJCQkJTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTik7CgoJCS8qIEZvcmNlIGFuIGV4cGlyeSBvZiB0aGUgZGlzY292ZXJ5IGxvZy4KCQkgKiBOb3cgdGhhdCB0aGUgTEFQIGlzIGZyZWUsIHRoZSBzeXN0ZW0gbWF5IGF0dGVtcHQgdG8KCQkgKiBjb25uZWN0IHRvIGFub3RoZXIgZGV2aWNlLiBVbmZvcnR1bmF0ZWx5LCBvdXIgZW50cmllcwoJCSAqIGFyZSBzdGFsZS4gVGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgKDwzcykgYmVmb3JlIHRoZQoJCSAqIG5vcm1hbCBkaXNjb3Zlcnkgd2lsbCBydW4gYW5kIHdoZXJlIGlybG1wX2Nvbm5lY3RfcmVxdWVzdCgpCgkJICogY2FuIGdldCB0aGUgd3JvbmcgaW5mbywgc28gbWFrZSBzdXJlIHRoaW5ncyBnZXQKCQkgKiBjbGVhbmVkICpOT1cqIDstKSAtIEplYW4gSUkgKi8KCQlpcmxtcF9kb19leHBpcnkoKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBldmVudCAlc1xuIiwKCQkJIF9fRlVOQ1RJT05fXywgaXJsbXBfZXZlbnRbZXZlbnRdKTsKCQlicmVhazsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgICBMU0FQIGNvbm5lY3Rpb24gY29udHJvbCBzdGF0ZXMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogRnVuY3Rpb24gaXJsbXBfc3RhdGVfZGlzY29ubmVjdGVkIChldmVudCwgc2tiLCBpbmZvKQogKgogKiAgICBESVNDT05ORUNURUQKICoKICovCnN0YXRpYyBpbnQgaXJsbXBfc3RhdGVfZGlzY29ubmVjdGVkKHN0cnVjdCBsc2FwX2NiICpzZWxmLCBJUkxNUF9FVkVOVCBldmVudCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglpbnQgcmV0ID0gMDsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CgoJc3dpdGNoIChldmVudCkgewojaWZkZWYgQ09ORklHX0lSREFfVUxUUkEKCWNhc2UgTE1fVURBVEFfSU5ESUNBVElPTjoKCQkvKiBUaGlzIGlzIG1vc3QgYml6emFyZS4gVGhvc2UgcGFja2V0cyBhcmUgIGFrYSB1bnJlbGlhYmxlCgkJICogY29ubmVjdGVkLCBha2EgSXJMUFQgb3IgU09DS19ER1JBTS9JUkRBUFJPVE9fVU5JVERBVEEuCgkJICogV2h5IGRvIHdlIHBhc3MgdGhlbSBhcyBVbHRyYSA/Pz8gSmVhbiBJSSAqLwoJCWlybG1wX2Nvbm5sZXNzX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IpOwoJCWJyZWFrOwojZW5kaWYgLyogQ09ORklHX0lSREFfVUxUUkEgKi8KCWNhc2UgTE1fQ09OTkVDVF9SRVFVRVNUOgoJCUlSREFfREVCVUcoNCwgIiVzKCksIExNX0NPTk5FQ1RfUkVRVUVTVFxuIiwgX19GVU5DVElPTl9fKTsKCgkJaWYgKHNlbGYtPmNvbm5fc2tiKSB7CgkJCUlSREFfV0FSTklORygiJXM6IGJ1c3kgd2l0aCBhbm90aGVyIHJlcXVlc3QhXG4iLAoJCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCQlyZXR1cm4gLUVCVVNZOwoJCX0KCQkvKiBEb24ndCBmb3JnZXQgdG8gcmVmY291bnQgaXQgKHNlZSBpcmxtcF9jb25uZWN0X3JlcXVlc3QoKSkgKi8KCQlza2JfZ2V0KHNrYik7CgkJc2VsZi0+Y29ubl9za2IgPSBza2I7CgoJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX1NFVFVQX1BFTkQpOwoKCQkvKiBTdGFydCB3YXRjaGRvZyB0aW1lciAoNSBzZWNzIGZvciBub3cpICovCgkJaXJsbXBfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc2VsZiwgNSpIWik7CgoJCWlybG1wX2RvX2xhcF9ldmVudChzZWxmLT5sYXAsIExNX0xBUF9DT05ORUNUX1JFUVVFU1QsIE5VTEwpOwoJCWJyZWFrOwoJY2FzZSBMTV9DT05ORUNUX0lORElDQVRJT046CgkJaWYgKHNlbGYtPmNvbm5fc2tiKSB7CgkJCUlSREFfV0FSTklORygiJXM6IGJ1c3kgd2l0aCBhbm90aGVyIHJlcXVlc3QhXG4iLAoJCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCQlyZXR1cm4gLUVCVVNZOwoJCX0KCQkvKiBEb24ndCBmb3JnZXQgdG8gcmVmY291bnQgaXQgKHNlZSBpcmxhcF9kcml2ZXJfcmN2KCkpICovCgkJc2tiX2dldChza2IpOwoJCXNlbGYtPmNvbm5fc2tiID0gc2tiOwoKCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9DT05ORUNUX1BFTkQpOwoKCQkvKiBTdGFydCB3YXRjaGRvZyB0aW1lcgoJCSAqIFRoaXMgaXMgbm90IG1lbnRpb25uZWQgaW4gdGhlIHNwZWMsIGJ1dCB0aGVyZSBpcyBhIHJhcmUKCQkgKiByYWNlIGNvbmRpdGlvbiB0aGF0IGNhbiBnZXQgdGhlIHNvY2tldCBzdHVjay4KCQkgKiBJZiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQgd2hpbGUgb3VyIExBUCBpcyBjbG9zaW5nIGRvd24sCgkJICogdGhlIExNX0xBUF9DT05ORUNUX1JFUVVFU1QgZ2V0IGxvc3QgYW5kIHdlIGdldCBzdHVjayBpbgoJCSAqIENPTk5FQ1RfUEVORCBzdGF0ZSBmb3JldmVyLgoJCSAqIFRoZSBvdGhlciBjYXVzZSBvZiBnZXR0aW5nIHN0dWNrIGRvd24gdGhlcmUgaXMgaWYgdGhlCgkJICogaGlnaGVyIGxheWVyIG5ldmVyIHJlcGx5IHRvIHRoZSBDT05ORUNUX0lORElDQVRJT04uCgkJICogQW55d2F5LCBpdCBtYWtlIHNlbnNlIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlCgkJICogYSBiYWNrdXAgcGxhbi4gMSBzZWNvbmQgaXMgcGxlbnR5IChzaG91bGQgYmUgaW1tZWRpYXRlKS4KCQkgKiBKZWFuIElJICovCgkJaXJsbXBfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc2VsZiwgMSpIWik7CgoJCWlybG1wX2RvX2xhcF9ldmVudChzZWxmLT5sYXAsIExNX0xBUF9DT05ORUNUX1JFUVVFU1QsIE5VTEwpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVbmtub3duIGV2ZW50ICVzIG9uIExTQVAgJSMwMnhcbiIsCgkJCSAgIF9fRlVOQ1RJT05fXywgaXJsbXBfZXZlbnRbZXZlbnRdLCBzZWxmLT5zbHNhcF9zZWwpOwoJCWJyZWFrOwoJfQoJcmV0dXJuIHJldDsKfQoKLyoKICogRnVuY3Rpb24gaXJsbXBfc3RhdGVfY29ubmVjdCAoc2VsZiwgZXZlbnQsIHNrYikKICoKICogICAgQ09OTkVDVAogKgogKi8Kc3RhdGljIGludCBpcmxtcF9zdGF0ZV9jb25uZWN0KHN0cnVjdCBsc2FwX2NiICpzZWxmLCBJUkxNUF9FVkVOVCBldmVudCwKCQkJCXN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBsc2FwX2NiICpsc2FwOwoJaW50IHJldCA9IDA7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIHJldHVybiAtMTspOwoKCXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgTE1fQ09OTkVDVF9SRVNQT05TRToKCQkvKgoJCSAqICBCaW5kIHRoaXMgTFNBUCB0byB0aGUgSXJMQVAgbGluayB3aGVyZSB0aGUgY29ubmVjdCB3YXMKCQkgKiAgcmVjZWl2ZWQKCQkgKi8KCQlsc2FwID0gaGFzaGJpbl9yZW1vdmUoaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLCAobG9uZykgc2VsZiwKCQkJCSAgICAgIE5VTEwpOwoKCQlJUkRBX0FTU0VSVChsc2FwID09IHNlbGYsIHJldHVybiAtMTspOwoJCUlSREFfQVNTRVJUKHNlbGYtPmxhcCAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCQlJUkRBX0FTU0VSVChzZWxmLT5sYXAtPmxzYXBzICE9IE5VTEwsIHJldHVybiAtMTspOwoKCQloYXNoYmluX2luc2VydChzZWxmLT5sYXAtPmxzYXBzLCAoaXJkYV9xdWV1ZV90ICopIHNlbGYsCgkJCSAgICAgICAobG9uZykgc2VsZiwgTlVMTCk7CgoJCXNldF9iaXQoMCwgJnNlbGYtPmNvbm5lY3RlZCk7CS8qIFRSVUUgKi8KCgkJaXJsbXBfc2VuZF9sY2ZfcGR1KHNlbGYtPmxhcCwgc2VsZi0+ZGxzYXBfc2VsLAoJCQkJICAgc2VsZi0+c2xzYXBfc2VsLCBDT05ORUNUX0NORiwgc2tiKTsKCgkJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CgoJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX0RBVEFfVFJBTlNGRVJfUkVBRFkpOwoJCWJyZWFrOwoJY2FzZSBMTV9XQVRDSERPR19USU1FT1VUOgoJCS8qIE1heSBoYXBwZW4sIHdobyBrbm93cy4uLgoJCSAqIEplYW4gSUkgKi8KCQlJUkRBX0RFQlVHKDAsICIlcygpIFdBVENIRE9HX1RJTUVPVVQhXG4iLCAgX19GVU5DVElPTl9fKTsKCgkJLyogRGlzY29ubmVjdCwgZ2V0IG91dC4uLiAtIEplYW4gSUkgKi8KCQlzZWxmLT5sYXAgPSBOVUxMOwoJCXNlbGYtPmRsc2FwX3NlbCA9IExTQVBfQU5ZOwoJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX0RJU0NPTk5FQ1RFRCk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCS8qIExNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT04gOiBTaG91bGQgbmV2ZXIgaGFwcGVuLCB3ZQoJCSAqIGFyZSAqbm90KiB5ZXQgYm91bmQgdG8gdGhlIElyTEFQIGxpbmsuIEplYW4gSUkgKi8KCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIGV2ZW50ICVzIG9uIExTQVAgJSMwMnhcbiIsIAoJCQkgICBfX0ZVTkNUSU9OX18sIGlybG1wX2V2ZW50W2V2ZW50XSwgc2VsZi0+c2xzYXBfc2VsKTsKCQlicmVhazsKCX0KCXJldHVybiByZXQ7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybG1wX3N0YXRlX2Nvbm5lY3RfcGVuZCAoZXZlbnQsIHNrYiwgaW5mbykKICoKICogICAgQ09OTkVDVF9QRU5ECiAqCiAqLwpzdGF0aWMgaW50IGlybG1wX3N0YXRlX2Nvbm5lY3RfcGVuZChzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgSVJMTVBfRVZFTlQgZXZlbnQsCgkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKCWludCByZXQgPSAwOwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKCglzd2l0Y2ggKGV2ZW50KSB7CgljYXNlIExNX0NPTk5FQ1RfUkVRVUVTVDoKCQkvKiBLZWVwIHN0YXRlICovCgkJYnJlYWs7CgljYXNlIExNX0NPTk5FQ1RfUkVTUE9OU0U6CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgTE1fQ09OTkVDVF9SRVNQT05TRSwgIgoJCQkgICAibm8gaW5kaWNhdGlvbiBpc3N1ZWQgeWV0XG4iLCAgX19GVU5DVElPTl9fKTsKCQkvKiBLZWVwIHN0YXRlICovCgkJYnJlYWs7CgljYXNlIExNX0RJU0NPTk5FQ1RfUkVRVUVTVDoKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBMTV9ESVNDT05ORUNUX1JFUVVFU1QsICIKCQkJICAgIm5vdCB5ZXQgYm91bmQgdG8gSXJMQVAgY29ubmVjdGlvblxuIiwgIF9fRlVOQ1RJT05fXyk7CgkJLyogS2VlcCBzdGF0ZSAqLwoJCWJyZWFrOwoJY2FzZSBMTV9MQVBfQ09OTkVDVF9DT05GSVJNOgoJCUlSREFfREVCVUcoNCwgIiVzKCksIExTX0NPTk5FQ1RfQ09ORklSTVxuIiwgIF9fRlVOQ1RJT05fXyk7CgkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfQ09OTkVDVCk7CgoJCXR4X3NrYiA9IHNlbGYtPmNvbm5fc2tiOwoJCXNlbGYtPmNvbm5fc2tiID0gTlVMTDsKCgkJaXJsbXBfY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIHR4X3NrYik7CgkJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgaXJsbXBfY29ubmVjdF9pbmRpY2F0aW9uKCkuICovCgkJZGV2X2tmcmVlX3NrYih0eF9za2IpOwoJCWJyZWFrOwoJY2FzZSBMTV9XQVRDSERPR19USU1FT1VUOgoJCS8qIFdpbGwgaGFwcGVuIGluIHNvbWUgcmFyZSBjYXNlcyBiZWNhdXNlIG9mIGEgcmFjZSBjb25kaXRpb24uCgkJICogSnVzdCBtYWtlIHN1cmUgd2UgZG9uJ3Qgc3RheSB0aGVyZSBmb3JldmVyLi4uCgkJICogSmVhbiBJSSAqLwoJCUlSREFfREVCVUcoMCwgIiVzKCkgV0FUQ0hET0dfVElNRU9VVCFcbiIsICBfX0ZVTkNUSU9OX18pOwoKCQkvKiBHbyBiYWNrIHRvIGRpc2Nvbm5lY3RlZCBtb2RlLCBrZWVwIHRoZSBzb2NrZXQgd2FpdGluZyAqLwoJCXNlbGYtPmxhcCA9IE5VTEw7CgkJc2VsZi0+ZGxzYXBfc2VsID0gTFNBUF9BTlk7CgkJaWYoc2VsZi0+Y29ubl9za2IpCgkJCWRldl9rZnJlZV9za2Ioc2VsZi0+Y29ubl9za2IpOwoJCXNlbGYtPmNvbm5fc2tiID0gTlVMTDsKCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9ESVNDT05ORUNURUQpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQkvKiBMTV9MQVBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OIDogU2hvdWxkIG5ldmVyIGhhcHBlbiwgd2UKCQkgKiBhcmUgKm5vdCogeWV0IGJvdW5kIHRvIHRoZSBJckxBUCBsaW5rLiBKZWFuIElJICovCgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBldmVudCAlcyBvbiBMU0FQICUjMDJ4XG4iLAoJCQkgICBfX0ZVTkNUSU9OX18sIGlybG1wX2V2ZW50W2V2ZW50XSwgc2VsZi0+c2xzYXBfc2VsKTsKCQlicmVhazsKCX0KCXJldHVybiByZXQ7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybG1wX3N0YXRlX2R0ciAoc2VsZiwgZXZlbnQsIHNrYikKICoKICogICAgREFUQV9UUkFOU0ZFUl9SRUFEWQogKgogKi8Kc3RhdGljIGludCBpcmxtcF9zdGF0ZV9kdHIoc3RydWN0IGxzYXBfY2IgKnNlbGYsIElSTE1QX0VWRU5UIGV2ZW50LAoJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglMTV9SRUFTT04gcmVhc29uOwoJaW50IHJldCA9IDA7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bGFwICE9IE5VTEwsIHJldHVybiAtMTspOwoKCXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgTE1fREFUQV9SRVFVRVNUOiAvKiBPcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBjYXNlICovCgkJaXJsbXBfc2VuZF9kYXRhX3BkdShzZWxmLT5sYXAsIHNlbGYtPmRsc2FwX3NlbCwKCQkJCSAgICBzZWxmLT5zbHNhcF9zZWwsIEZBTFNFLCBza2IpOwoJCWJyZWFrOwoJY2FzZSBMTV9EQVRBX0lORElDQVRJT046IC8qIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2UgKi8KCQlpcmxtcF9kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiKTsKCQlicmVhazsKCWNhc2UgTE1fVURBVEFfUkVRVUVTVDoKCQlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgkJaXJsbXBfc2VuZF9kYXRhX3BkdShzZWxmLT5sYXAsIHNlbGYtPmRsc2FwX3NlbCwKCQkJCSAgICBzZWxmLT5zbHNhcF9zZWwsIFRSVUUsIHNrYik7CgkJYnJlYWs7CgljYXNlIExNX1VEQVRBX0lORElDQVRJT046CgkJaXJsbXBfdWRhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IpOwoJCWJyZWFrOwoJY2FzZSBMTV9DT05ORUNUX1JFUVVFU1Q6CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgTE1fQ09OTkVDVF9SRVFVRVNULCAiCgkJCSAgICJlcnJvciwgTFNBUCBhbHJlYWR5IGNvbm5lY3RlZFxuIiwgX19GVU5DVElPTl9fKTsKCQkvKiBLZWVwIHN0YXRlICovCgkJYnJlYWs7CgljYXNlIExNX0NPTk5FQ1RfUkVTUE9OU0U6CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgTE1fQ09OTkVDVF9SRVNQT05TRSwgIgoJCQkgICAiZXJyb3IsIExTQVAgYWxyZWFkeSBjb25uZWN0ZWRcbiIsIF9fRlVOQ1RJT05fXyk7CgkJLyogS2VlcCBzdGF0ZSAqLwoJCWJyZWFrOwoJY2FzZSBMTV9ESVNDT05ORUNUX1JFUVVFU1Q6CgkJaXJsbXBfc2VuZF9sY2ZfcGR1KHNlbGYtPmxhcCwgc2VsZi0+ZGxzYXBfc2VsLCBzZWxmLT5zbHNhcF9zZWwsCgkJCQkgICBESVNDT05ORUNULCBza2IpOwoJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX0RJU0NPTk5FQ1RFRCk7CgkJLyogQ2FsbGVkIG9ubHkgZnJvbSBpcmxtcF9kaXNjb25uZWN0X3JlcXVlc3QoKSwgd2lsbAoJCSAqIHVuYmluZCBmcm9tIExBUCBvdmVyIHRoZXJlLiBKZWFuIElJICovCgoJCS8qIFRyeSB0byBjbG9zZSB0aGUgTEFQIGNvbm5lY3Rpb24gaWYgaXRzIHN0aWxsIHRoZXJlICovCgkJaWYgKHNlbGYtPmxhcCkgewoJCQlJUkRBX0RFQlVHKDQsICIlcygpLCB0cnlpbmcgdG8gY2xvc2UgSXJMQVBcbiIsCgkJCQkgICBfX0ZVTkNUSU9OX18pOwoJCQlpcmxtcF9kb19sYXBfZXZlbnQoc2VsZi0+bGFwLAoJCQkJCSAgIExNX0xBUF9ESVNDT05ORUNUX1JFUVVFU1QsCgkJCQkJICAgTlVMTCk7CgkJfQoJCWJyZWFrOwoJY2FzZSBMTV9MQVBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OOgoJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX0RJU0NPTk5FQ1RFRCk7CgoJCXJlYXNvbiA9IGlybG1wX2NvbnZlcnRfbGFwX3JlYXNvbihzZWxmLT5sYXAtPnJlYXNvbik7CgoJCWlybG1wX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCByZWFzb24sIE5VTEwpOwoJCWJyZWFrOwoJY2FzZSBMTV9ESVNDT05ORUNUX0lORElDQVRJT046CgkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfRElTQ09OTkVDVEVEKTsKCgkJSVJEQV9BU1NFUlQoc2VsZi0+bGFwICE9IE5VTEwsIHJldHVybiAtMTspOwoJCUlSREFfQVNTRVJUKHNlbGYtPmxhcC0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuIC0xOyk7CgoJCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCQlJUkRBX0FTU0VSVChza2ItPmxlbiA+IDMsIHJldHVybiAtMTspOwoJCXJlYXNvbiA9IHNrYi0+ZGF0YVszXTsKCgkJIC8qIFRyeSB0byBjbG9zZSB0aGUgTEFQIGNvbm5lY3Rpb24gKi8KCQlJUkRBX0RFQlVHKDQsICIlcygpLCB0cnlpbmcgdG8gY2xvc2UgSXJMQVBcbiIsIF9fRlVOQ1RJT05fXyk7CgkJaXJsbXBfZG9fbGFwX2V2ZW50KHNlbGYtPmxhcCwgTE1fTEFQX0RJU0NPTk5FQ1RfUkVRVUVTVCwgTlVMTCk7CgoJCWlybG1wX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCByZWFzb24sIHNrYik7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXZlbnQgJXMgb24gTFNBUCAlIzAyeFxuIiwKCQkJICAgX19GVU5DVElPTl9fLCBpcmxtcF9ldmVudFtldmVudF0sIHNlbGYtPnNsc2FwX3NlbCk7CgkJYnJlYWs7Cgl9CglyZXR1cm4gcmV0Owp9CgovKgogKiBGdW5jdGlvbiBpcmxtcF9zdGF0ZV9zZXR1cCAoZXZlbnQsIHNrYiwgaW5mbykKICoKICogICAgU0VUVVAsIFN0YXRpb24gQ29udHJvbCBoYXMgc2V0IHVwIHRoZSB1bmRlcmx5aW5nIElyTEFQIGNvbm5lY3Rpb24uCiAqICAgIEFuIExTQVAgY29ubmVjdGlvbiByZXF1ZXN0IGhhcyBiZWVuIHRyYW5zbWl0dGVkIHRvIHRoZSBwZWVyCiAqICAgIExTQVAtQ29ubmVjdGlvbiBDb250cm9sIEZTTSBhbmQgd2UgYXJlIGF3YWl0aW5nIHJlcGx5LgogKi8Kc3RhdGljIGludCBpcmxtcF9zdGF0ZV9zZXR1cChzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgSVJMTVBfRVZFTlQgZXZlbnQsCgkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJTE1fUkVBU09OIHJlYXNvbjsKCWludCByZXQgPSAwOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglzd2l0Y2ggKGV2ZW50KSB7CgljYXNlIExNX0NPTk5FQ1RfQ09ORklSTToKCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9EQVRBX1RSQU5TRkVSX1JFQURZKTsKCgkJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CgoJCWlybG1wX2Nvbm5lY3RfY29uZmlybShzZWxmLCBza2IpOwoJCWJyZWFrOwoJY2FzZSBMTV9ESVNDT05ORUNUX0lORElDQVRJT046CgkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfRElTQ09OTkVDVEVEKTsKCgkJSVJEQV9BU1NFUlQoc2VsZi0+bGFwICE9IE5VTEwsIHJldHVybiAtMTspOwoJCUlSREFfQVNTRVJUKHNlbGYtPmxhcC0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuIC0xOyk7CgoJCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCQlJUkRBX0FTU0VSVChza2ItPmxlbiA+IDMsIHJldHVybiAtMTspOwoJCXJlYXNvbiA9IHNrYi0+ZGF0YVszXTsKCgkJIC8qIFRyeSB0byBjbG9zZSB0aGUgTEFQIGNvbm5lY3Rpb24gKi8KCQlJUkRBX0RFQlVHKDQsICIlcygpLCB0cnlpbmcgdG8gY2xvc2UgSXJMQVBcbiIsICBfX0ZVTkNUSU9OX18pOwoJCWlybG1wX2RvX2xhcF9ldmVudChzZWxmLT5sYXAsIExNX0xBUF9ESVNDT05ORUNUX1JFUVVFU1QsIE5VTEwpOwoKCQlpcmxtcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgcmVhc29uLCBza2IpOwoJCWJyZWFrOwoJY2FzZSBMTV9MQVBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OOgoJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX0RJU0NPTk5FQ1RFRCk7CgoJCWRlbF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOwoKCQlJUkRBX0FTU0VSVChzZWxmLT5sYXAgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgkJSVJEQV9BU1NFUlQoc2VsZi0+bGFwLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm4gLTE7KTsKCgkJcmVhc29uID0gaXJsbXBfY29udmVydF9sYXBfcmVhc29uKHNlbGYtPmxhcC0+cmVhc29uKTsKCgkJaXJsbXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIHJlYXNvbiwgc2tiKTsKCQlicmVhazsKCWNhc2UgTE1fV0FUQ0hET0dfVElNRU9VVDoKCQlJUkRBX0RFQlVHKDAsICIlcygpIFdBVENIRE9HX1RJTUVPVVQhXG4iLCBfX0ZVTkNUSU9OX18pOwoKCQlJUkRBX0FTU0VSVChzZWxmLT5sYXAgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgkJaXJsbXBfZG9fbGFwX2V2ZW50KHNlbGYtPmxhcCwgTE1fTEFQX0RJU0NPTk5FQ1RfUkVRVUVTVCwgTlVMTCk7CgkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfRElTQ09OTkVDVEVEKTsKCgkJaXJsbXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIExNX0NPTk5FQ1RfRkFJTFVSRSwgTlVMTCk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXZlbnQgJXMgb24gTFNBUCAlIzAyeFxuIiwKCQkJICAgX19GVU5DVElPTl9fLCBpcmxtcF9ldmVudFtldmVudF0sIHNlbGYtPnNsc2FwX3NlbCk7CgkJYnJlYWs7Cgl9CglyZXR1cm4gcmV0Owp9CgovKgogKiBGdW5jdGlvbiBpcmxtcF9zdGF0ZV9zZXR1cF9wZW5kIChldmVudCwgc2tiLCBpbmZvKQogKgogKiAgICBTRVRVUF9QRU5ELCBBbiBMTV9DT05ORUNUX1JFUVVFU1QgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmljZQogKiAgICB1c2VyIHRvIHNldCB1cCBhbiBMU0FQIGNvbm5lY3Rpb24uIEEgcmVxdWVzdCBoYXMgYmVlbiBzZW50IHRvIHRoZQogKiAgICBMQVAgRlNNIHRvIHNldCB1cCB0aGUgdW5kZXJseWluZyBJckxBUCBjb25uZWN0aW9uLCBhbmQgd2UKICogICAgYXJlIGF3YWl0aW5nIGNvbmZpcm0uCiAqLwpzdGF0aWMgaW50IGlybG1wX3N0YXRlX3NldHVwX3BlbmQoc3RydWN0IGxzYXBfY2IgKnNlbGYsIElSTE1QX0VWRU5UIGV2ZW50LAoJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOwoJTE1fUkVBU09OIHJlYXNvbjsKCWludCByZXQgPSAwOwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKGlybG1wICE9IE5VTEwsIHJldHVybiAtMTspOwoKCXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgTE1fTEFQX0NPTk5FQ1RfQ09ORklSTToKCQlJUkRBX0FTU0VSVChzZWxmLT5jb25uX3NrYiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCgkJdHhfc2tiID0gc2VsZi0+Y29ubl9za2I7CgkJc2VsZi0+Y29ubl9za2IgPSBOVUxMOwoKCQlpcmxtcF9zZW5kX2xjZl9wZHUoc2VsZi0+bGFwLCBzZWxmLT5kbHNhcF9zZWwsCgkJCQkgICBzZWxmLT5zbHNhcF9zZWwsIENPTk5FQ1RfQ01ELCB0eF9za2IpOwoJCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIGlybGFwX2RhdGFfcmVxdWVzdCgpLiAqLwoJCWRldl9rZnJlZV9za2IodHhfc2tiKTsKCgkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfU0VUVVApOwoJCWJyZWFrOwoJY2FzZSBMTV9XQVRDSERPR19USU1FT1VUOgoJCUlSREFfREVCVUcoMCwgIiVzKCkgOiBXQVRDSERPR19USU1FT1VUICFcbiIsICBfX0ZVTkNUSU9OX18pOwoKCQlJUkRBX0FTU0VSVChzZWxmLT5sYXAgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgkJaXJsbXBfZG9fbGFwX2V2ZW50KHNlbGYtPmxhcCwgTE1fTEFQX0RJU0NPTk5FQ1RfUkVRVUVTVCwgTlVMTCk7CgkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfRElTQ09OTkVDVEVEKTsKCgkJaXJsbXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIExNX0NPTk5FQ1RfRkFJTFVSRSwgTlVMTCk7CgkJYnJlYWs7CgljYXNlIExNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT046IC8qIExTX0Rpc2Nvbm5lY3QuaW5kaWNhdGlvbiAqLwoJCWRlbF90aW1lciggJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKCgkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfRElTQ09OTkVDVEVEKTsKCgkJcmVhc29uID0gaXJsbXBfY29udmVydF9sYXBfcmVhc29uKHNlbGYtPmxhcC0+cmVhc29uKTsKCgkJaXJsbXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIHJlYXNvbiwgTlVMTCk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXZlbnQgJXMgb24gTFNBUCAlIzAyeFxuIiwKCQkJICAgX19GVU5DVElPTl9fLCBpcmxtcF9ldmVudFtldmVudF0sIHNlbGYtPnNsc2FwX3NlbCk7CgkJYnJlYWs7Cgl9CglyZXR1cm4gcmV0Owp9Cg==