LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmlhcC5jCiAqIFZlcnNpb246ICAgICAgIDAuOAogKiBEZXNjcmlwdGlvbjogICBJbmZvcm1hdGlvbiBBY2Nlc3MgUHJvdG9jb2wgKElBUCkKICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgogKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIENyZWF0ZWQgYXQ6ICAgIFRodSBBdWcgMjEgMDA6MDI6MDcgMTk5NwogKiBNb2RpZmllZCBhdDogICBTYXQgRGVjIDI1IDE2OjQyOjQyIDE5OTkKICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKgogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwKICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CiAqCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgogKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvZnMuaD4KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KCiNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJ0dHAuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhc19vYmplY3QuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwX2V2ZW50Lmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgoKI2lmZGVmIENPTkZJR19JUkRBX0RFQlVHCi8qIEZJWE1FOiBUaGlzIG9uZSBzaG91bGQgZ28gaW4gaXJsbXAuYyAqLwpzdGF0aWMgY29uc3QgY2hhciAqaWFzX2NoYXJzZXRfdHlwZXNbXSA9IHsKCSJDU19BU0NJSSIsCgkiQ1NfSVNPXzg4NTlfMSIsCgkiQ1NfSVNPXzg4NTlfMiIsCgkiQ1NfSVNPXzg4NTlfMyIsCgkiQ1NfSVNPXzg4NTlfNCIsCgkiQ1NfSVNPXzg4NTlfNSIsCgkiQ1NfSVNPXzg4NTlfNiIsCgkiQ1NfSVNPXzg4NTlfNyIsCgkiQ1NfSVNPXzg4NTlfOCIsCgkiQ1NfSVNPXzg4NTlfOSIsCgkiQ1NfVU5JQ09ERSIKfTsKI2VuZGlmCS8qIENPTkZJR19JUkRBX0RFQlVHICovCgpzdGF0aWMgaGFzaGJpbl90ICppcmlhcCA9IE5VTEw7CnN0YXRpYyB2b2lkICpzZXJ2aWNlX2hhbmRsZTsKCnN0YXRpYyB2b2lkIF9faXJpYXBfY2xvc2Uoc3RydWN0IGlyaWFwX2NiICpzZWxmKTsKc3RhdGljIGludCBpcmlhcF9yZWdpc3Rlcl9sc2FwKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgX191OCBzbHNhcF9zZWwsIGludCBtb2RlKTsKc3RhdGljIHZvaWQgaXJpYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCgkJCQkJTE1fUkVBU09OIHJlYXNvbiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyB2b2lkIGlyaWFwX2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJICAgICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgX191MzIgbWF4X3NkdV9zaXplLAoJCQkJICAgICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyB2b2lkIGlyaWFwX2Nvbm5lY3RfY29uZmlybSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywKCQkJCSAgX191MzIgbWF4X3NkdV9zaXplLCBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyBpbnQgaXJpYXBfZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCgkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYik7CgpzdGF0aWMgdm9pZCBpcmlhcF93YXRjaGRvZ190aW1lcl9leHBpcmVkKHZvaWQgKmRhdGEpOwoKc3RhdGljIGlubGluZSB2b2lkIGlyaWFwX3N0YXJ0X3dhdGNoZG9nX3RpbWVyKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwKCQkJCQkgICAgICBpbnQgdGltZW91dCkKewoJaXJkYV9zdGFydF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIsIHRpbWVvdXQsIHNlbGYsCgkJCSBpcmlhcF93YXRjaGRvZ190aW1lcl9leHBpcmVkKTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfaW5pdCAodm9pZCkKICoKICogICAgSW5pdGlhbGl6ZXMgdGhlIElySUFQIGxheWVyLCBjYWxsZWQgYnkgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBjb2RlCiAqICAgIGluIGlybW9kLmMKICovCmludCBfX2luaXQgaXJpYXBfaW5pdCh2b2lkKQp7CglzdHJ1Y3QgaWFzX29iamVjdCAqb2JqOwoJc3RydWN0IGlyaWFwX2NiICpzZXJ2ZXI7CglfX3U4IG9jdF9zZXFbNl07CglfX3UxNiBoaW50czsKCgkvKiBBbGxvY2F0ZSBtYXN0ZXIgYXJyYXkgKi8KCWlyaWFwID0gaGFzaGJpbl9uZXcoSEJfTE9DSyk7CglpZiAoIWlyaWFwKQoJCXJldHVybiAtRU5PTUVNOwoKCS8qIE9iamVjdCByZXBvc2l0b3J5IC0gZGVmaW5lZCBpbiBpcmlhc19vYmplY3QuYyAqLwoJaXJpYXNfb2JqZWN0cyA9IGhhc2hiaW5fbmV3KEhCX0xPQ0spOwoJaWYgKCFpcmlhc19vYmplY3RzKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogQ2FuJ3QgYWxsb2NhdGUgaXJpYXNfb2JqZWN0cyBoYXNoYmluIVxuIiwKCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCWhhc2hiaW5fZGVsZXRlKGlyaWFwLCBOVUxMKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCgkvKgoJICogIFJlZ2lzdGVyIHNvbWUgZGVmYXVsdCBzZXJ2aWNlcyBmb3IgSXJMTVAKCSAqLwoJaGludHMgID0gaXJsbXBfc2VydmljZV90b19oaW50KFNfQ09NUFVURVIpOwoJc2VydmljZV9oYW5kbGUgPSBpcmxtcF9yZWdpc3Rlcl9zZXJ2aWNlKGhpbnRzKTsKCgkvKiBSZWdpc3RlciB0aGUgRGV2aWNlIG9iamVjdCB3aXRoIExNLUlBUyAqLwoJb2JqID0gaXJpYXNfbmV3X29iamVjdCgiRGV2aWNlIiwgSUFTX0RFVklDRV9JRCk7Cglpcmlhc19hZGRfc3RyaW5nX2F0dHJpYihvYmosICJEZXZpY2VOYW1lIiwgIkxpbnV4IiwgSUFTX0tFUk5FTF9BVFRSKTsKCglvY3Rfc2VxWzBdID0gMHgwMTsgIC8qIFZlcnNpb24gMSAqLwoJb2N0X3NlcVsxXSA9IDB4MDA7ICAvKiBJQVMgc3VwcG9ydCBiaXRzICovCglvY3Rfc2VxWzJdID0gMHgwMDsgIC8qIExNLU1VWCBzdXBwb3J0IGJpdHMgKi8KI2lmZGVmIENPTkZJR19JUkRBX1VMVFJBCglvY3Rfc2VxWzJdIHw9IDB4MDQ7IC8qIENvbm5lY3Rpb25sZXNzIERhdGEgc3VwcG9ydCAqLwojZW5kaWYKCWlyaWFzX2FkZF9vY3RzZXFfYXR0cmliKG9iaiwgIklyTE1QU3VwcG9ydCIsIG9jdF9zZXEsIDMsCgkJCQlJQVNfS0VSTkVMX0FUVFIpOwoJaXJpYXNfaW5zZXJ0X29iamVjdChvYmopOwoKCS8qCgkgKiAgUmVnaXN0ZXIgc2VydmVyIHN1cHBvcnQgd2l0aCBJckxNUCBzbyB3ZSBjYW4gYWNjZXB0IGluY29taW5nCgkgKiAgY29ubmVjdGlvbnMKCSAqLwoJc2VydmVyID0gaXJpYXBfb3BlbihMU0FQX0lBUywgSUFTX1NFUlZFUiwgTlVMTCwgTlVMTCk7CglpZiAoIXNlcnZlcikgewoJCUlSREFfREVCVUcoMCwgIiVzKCksIHVuYWJsZSB0byBvcGVuIHNlcnZlclxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gLTE7Cgl9CglpcmlhcF9yZWdpc3Rlcl9sc2FwKHNlcnZlciwgTFNBUF9JQVMsIElBU19TRVJWRVIpOwoKCXJldHVybiAwOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9jbGVhbnVwICh2b2lkKQogKgogKiAgICBJbml0aWFsaXplcyB0aGUgSXJJQVAgbGF5ZXIsIGNhbGxlZCBieSB0aGUgbW9kdWxlIGNsZWFudXAgY29kZSBpbgogKiAgICBpcm1vZC5jCiAqLwp2b2lkIGlyaWFwX2NsZWFudXAodm9pZCkKewoJaXJsbXBfdW5yZWdpc3Rlcl9zZXJ2aWNlKHNlcnZpY2VfaGFuZGxlKTsKCgloYXNoYmluX2RlbGV0ZShpcmlhcCwgKEZSRUVfRlVOQykgX19pcmlhcF9jbG9zZSk7CgloYXNoYmluX2RlbGV0ZShpcmlhc19vYmplY3RzLCAoRlJFRV9GVU5DKSBfX2lyaWFzX2RlbGV0ZV9vYmplY3QpOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9vcGVuICh2b2lkKQogKgogKiAgICBPcGVucyBhbiBpbnN0YW5jZSBvZiB0aGUgSXJJQVAgbGF5ZXIsIGFuZCByZWdpc3RlcnMgd2l0aCBJckxNUAogKi8Kc3RydWN0IGlyaWFwX2NiICppcmlhcF9vcGVuKF9fdTggc2xzYXBfc2VsLCBpbnQgbW9kZSwgdm9pZCAqcHJpdiwKCQkJICAgIENPTkZJUk1fQ0FMTEJBQ0sgY2FsbGJhY2spCnsKCXN0cnVjdCBpcmlhcF9jYiAqc2VsZjsKCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCXNlbGYgPSBremFsbG9jKHNpemVvZigqc2VsZiksIEdGUF9BVE9NSUMpOwoJaWYgKCFzZWxmKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBOVUxMOwoJfQoKCS8qCgkgKiAgSW5pdGlhbGl6ZSBpbnN0YW5jZQoJICovCgoJc2VsZi0+bWFnaWMgPSBJQVNfTUFHSUM7CglzZWxmLT5tb2RlID0gbW9kZTsKCWlmIChtb2RlID09IElBU19DTElFTlQpCgkJaXJpYXBfcmVnaXN0ZXJfbHNhcChzZWxmLCBzbHNhcF9zZWwsIG1vZGUpOwoKCXNlbGYtPmNvbmZpcm0gPSBjYWxsYmFjazsKCXNlbGYtPnByaXYgPSBwcml2OwoKCS8qIGlyaWFwX2dldHZhbHVlYnljbGFzc19yZXF1ZXN0KCkgd2lsbCBjb25zdHJ1Y3QgcGFja2V0cyBiZWZvcmUKCSAqIHdlIGNvbm5lY3QsIHNvIHRoaXMgbXVzdCBoYXZlIGEgc2FuZSB2YWx1ZS4uLiBKZWFuIElJICovCglzZWxmLT5tYXhfaGVhZGVyX3NpemUgPSBMTVBfTUFYX0hFQURFUjsKCglpbml0X3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CgoJaGFzaGJpbl9pbnNlcnQoaXJpYXAsIChpcmRhX3F1ZXVlX3QgKikgc2VsZiwgKGxvbmcpIHNlbGYsIE5VTEwpOwoKCS8qIEluaXRpYWxpemUgc3RhdGUgbWFjaGluZXMgKi8KCWlyaWFwX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIFNfRElTQ09OTkVDVCk7CglpcmlhcF9uZXh0X2NhbGxfc3RhdGUoc2VsZiwgU19NQUtFX0NBTEwpOwoJaXJpYXBfbmV4dF9zZXJ2ZXJfc3RhdGUoc2VsZiwgUl9ESVNDT05ORUNUKTsKCWlyaWFwX25leHRfcl9jb25uZWN0X3N0YXRlKHNlbGYsIFJfV0FJVElORyk7CgoJcmV0dXJuIHNlbGY7Cn0KRVhQT1JUX1NZTUJPTChpcmlhcF9vcGVuKTsKCi8qCiAqIEZ1bmN0aW9uIF9faXJpYXBfY2xvc2UgKHNlbGYpCiAqCiAqICAgIFJlbW92ZXMgKGRlYWxsb2NhdGVzKSB0aGUgSXJJQVAgaW5zdGFuY2UKICoKICovCnN0YXRpYyB2b2lkIF9faXJpYXBfY2xvc2Uoc3RydWN0IGlyaWFwX2NiICpzZWxmKQp7CglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoKCWRlbF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOwoKCWlmIChzZWxmLT5yZXF1ZXN0X3NrYikKCQlkZXZfa2ZyZWVfc2tiKHNlbGYtPnJlcXVlc3Rfc2tiKTsKCglzZWxmLT5tYWdpYyA9IDA7CgoJa2ZyZWUoc2VsZik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFwX2Nsb3NlICh2b2lkKQogKgogKiAgICBDbG9zZXMgSXJJQVAgYW5kIGRlcmVnaXN0ZXJzIHdpdGggSXJMTVAKICovCnZvaWQgaXJpYXBfY2xvc2Uoc3RydWN0IGlyaWFwX2NiICpzZWxmKQp7CglzdHJ1Y3QgaXJpYXBfY2IgKmVudHJ5OwoKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CgoJaWYgKHNlbGYtPmxzYXApIHsKCQlpcmxtcF9jbG9zZV9sc2FwKHNlbGYtPmxzYXApOwoJCXNlbGYtPmxzYXAgPSBOVUxMOwoJfQoKCWVudHJ5ID0gKHN0cnVjdCBpcmlhcF9jYiAqKSBoYXNoYmluX3JlbW92ZShpcmlhcCwgKGxvbmcpIHNlbGYsIE5VTEwpOwoJSVJEQV9BU1NFUlQoZW50cnkgPT0gc2VsZiwgcmV0dXJuOyk7CgoJX19pcmlhcF9jbG9zZShzZWxmKTsKfQpFWFBPUlRfU1lNQk9MKGlyaWFwX2Nsb3NlKTsKCnN0YXRpYyBpbnQgaXJpYXBfcmVnaXN0ZXJfbHNhcChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIF9fdTggc2xzYXBfc2VsLCBpbnQgbW9kZSkKewoJbm90aWZ5X3Qgbm90aWZ5OwoKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJaXJkYV9ub3RpZnlfaW5pdCgmbm90aWZ5KTsKCW5vdGlmeS5jb25uZWN0X2NvbmZpcm0gICAgICAgPSBpcmlhcF9jb25uZWN0X2NvbmZpcm07Cglub3RpZnkuY29ubmVjdF9pbmRpY2F0aW9uICAgID0gaXJpYXBfY29ubmVjdF9pbmRpY2F0aW9uOwoJbm90aWZ5LmRpc2Nvbm5lY3RfaW5kaWNhdGlvbiA9IGlyaWFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbjsKCW5vdGlmeS5kYXRhX2luZGljYXRpb24gICAgICAgPSBpcmlhcF9kYXRhX2luZGljYXRpb247Cglub3RpZnkuaW5zdGFuY2UgPSBzZWxmOwoJaWYgKG1vZGUgPT0gSUFTX0NMSUVOVCkKCQlzdHJjcHkobm90aWZ5Lm5hbWUsICJJcklBUyBjbGkiKTsKCWVsc2UKCQlzdHJjcHkobm90aWZ5Lm5hbWUsICJJcklBUyBzcnYiKTsKCglzZWxmLT5sc2FwID0gaXJsbXBfb3Blbl9sc2FwKHNsc2FwX3NlbCwgJm5vdGlmeSwgMCk7CglpZiAoc2VsZi0+bHNhcCA9PSBOVUxMKSB7CgkJSVJEQV9FUlJPUigiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZWQgTFNBUCFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIC0xOwoJfQoJc2VsZi0+c2xzYXBfc2VsID0gc2VsZi0+bHNhcC0+c2xzYXBfc2VsOwoKCXJldHVybiAwOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9kaXNjb25uZWN0X2luZGljYXRpb24gKGhhbmRsZSwgcmVhc29uKQogKgogKiAgICBHb3QgZGlzY29ubmVjdCwgc28gY2xlYW4gdXAgZXZlcnl0aGluZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25uZWN0aW9uCiAqCiAqLwpzdGF0aWMgdm9pZCBpcmlhcF9kaXNjb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCQlMTV9SRUFTT04gcmVhc29uLAoJCQkJCXN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBpcmlhcF9jYiAqc2VsZjsKCglJUkRBX0RFQlVHKDQsICIlcygpLCByZWFzb249JXNcbiIsIF9fRlVOQ1RJT05fXywgaXJsbXBfcmVhc29uc1tyZWFzb25dKTsKCglzZWxmID0gKHN0cnVjdCBpcmlhcF9jYiAqKSBpbnN0YW5jZTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKCglJUkRBX0FTU0VSVChpcmlhcCAhPSBOVUxMLCByZXR1cm47KTsKCglkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKCgkvKiBOb3QgbmVlZGVkICovCglpZiAoc2tiKQoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCglpZiAoc2VsZi0+bW9kZSA9PSBJQVNfQ0xJRU5UKSB7CgkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgZGlzY29ubmVjdCBhcyBjbGllbnRcbiIsIF9fRlVOQ1RJT05fXyk7CgoKCQlpcmlhcF9kb19jbGllbnRfZXZlbnQoc2VsZiwgSUFQX0xNX0RJU0NPTk5FQ1RfSU5ESUNBVElPTiwKCQkJCSAgICAgIE5VTEwpOwoJCS8qCgkJICogSW5mb3JtIHNlcnZpY2UgdXNlciB0aGF0IHRoZSByZXF1ZXN0IGZhaWxlZCBieSBzZW5kaW5nCgkJICogaXQgYSBOVUxMIHZhbHVlLiBXYXJuaW5nLCB0aGUgY2xpZW50IG1pZ2h0IGNsb3NlIHVzLCBzbwoJCSAqIHJlbWVtYmVyIG5vIHRvIHVzZSBzZWxmIGFueW1vcmUgYWZ0ZXIgY2FsbGluZyBjb25maXJtCgkJICovCgkJaWYgKHNlbGYtPmNvbmZpcm0pCgkJCXNlbGYtPmNvbmZpcm0oSUFTX0RJU0NPTk5FQ1QsIDAsIE5VTEwsIHNlbGYtPnByaXYpOwoJfSBlbHNlIHsKCQlJUkRBX0RFQlVHKDQsICIlcygpLCBkaXNjb25uZWN0IGFzIHNlcnZlclxuIiwgX19GVU5DVElPTl9fKTsKCQlpcmlhcF9kb19zZXJ2ZXJfZXZlbnQoc2VsZiwgSUFQX0xNX0RJU0NPTk5FQ1RfSU5ESUNBVElPTiwKCQkJCSAgICAgIE5VTEwpOwoJCWlyaWFwX2Nsb3NlKHNlbGYpOwoJfQp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9kaXNjb25uZWN0X3JlcXVlc3QgKGhhbmRsZSkKICovCnN0YXRpYyB2b2lkIGlyaWFwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYpCnsKCXN0cnVjdCBza19idWZmICp0eF9za2I7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKCgl0eF9za2IgPSBhbGxvY19za2IoTE1QX01BWF9IRUFERVIsIEdGUF9BVE9NSUMpOwoJaWYgKHR4X3NrYiA9PSBOVUxMKSB7CgkJSVJEQV9ERUJVRygwLAoJCQkgICAiJXMoKSwgQ291bGQgbm90IGFsbG9jYXRlIGFuIHNrX2J1ZmYgb2YgbGVuZ3RoICVkXG4iLAoJCQkgICBfX0ZVTkNUSU9OX18sIExNUF9NQVhfSEVBREVSKTsKCQlyZXR1cm47Cgl9CgoJLyoKCSAqICBSZXNlcnZlIHNwYWNlIGZvciBNVVggY29udHJvbCBhbmQgTEFQIGhlYWRlcgoJICovCglza2JfcmVzZXJ2ZSh0eF9za2IsIExNUF9NQVhfSEVBREVSKTsKCglpcmxtcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+bHNhcCwgdHhfc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfZ2V0dmFsdWVieWNsYXNzIChhZGRyLCBuYW1lLCBhdHRyKQogKgogKiAgICBSZXRyaWV2ZSBhbGwgdmFsdWVzIGZyb20gYXR0cmlidXRlIGluIGFsbCBvYmplY3RzIHdpdGggZ2l2ZW4gY2xhc3MKICogICAgbmFtZQogKi8KaW50IGlyaWFwX2dldHZhbHVlYnljbGFzc19yZXF1ZXN0KHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwKCQkJCSAgX191MzIgc2FkZHIsIF9fdTMyIGRhZGRyLAoJCQkJICBjaGFyICpuYW1lLCBjaGFyICphdHRyKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOwoJaW50IG5hbWVfbGVuLCBhdHRyX2xlbiwgc2tiX2xlbjsKCV9fdTggKmZyYW1lOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybiAtMTspOwoKCS8qIENsaWVudCBtdXN0IHN1cHBseSB0aGUgZGVzdGluYXRpb24gZGV2aWNlIGFkZHJlc3MgKi8KCWlmICghZGFkZHIpCgkJcmV0dXJuIC0xOwoKCXNlbGYtPmRhZGRyID0gZGFkZHI7CglzZWxmLT5zYWRkciA9IHNhZGRyOwoKCS8qCgkgKiAgU2F2ZSBvcGVyYXRpb24sIHNvIHdlIGtub3cgd2hhdCB0aGUgbGF0ZXIgaW5kaWNhdGlvbiBpcyBhYm91dAoJICovCglzZWxmLT5vcGVyYXRpb24gPSBHRVRfVkFMVUVfQllfQ0xBU1M7CgoJLyogR2l2ZSBvdXJzZWx2ZXMgMTAgc2VjcyB0byBmaW5pc2ggdGhpcyBvcGVyYXRpb24gKi8KCWlyaWFwX3N0YXJ0X3dhdGNoZG9nX3RpbWVyKHNlbGYsIDEwKkhaKTsKCgluYW1lX2xlbiA9IHN0cmxlbihuYW1lKTsJLyogVXAgdG8gSUFTX01BWF9DTEFTU05BTUUgPSA2MCAqLwoJYXR0cl9sZW4gPSBzdHJsZW4oYXR0cik7CS8qIFVwIHRvIElBU19NQVhfQVRUUklCTkFNRSA9IDYwICovCgoJc2tiX2xlbiA9IHNlbGYtPm1heF9oZWFkZXJfc2l6ZSsyK25hbWVfbGVuKzErYXR0cl9sZW4rNDsKCXR4X3NrYiA9IGFsbG9jX3NrYihza2JfbGVuLCBHRlBfQVRPTUlDKTsKCWlmICghdHhfc2tiKQoJCXJldHVybiAtRU5PTUVNOwoKCS8qIFJlc2VydmUgc3BhY2UgZm9yIE1VWCBhbmQgTEFQIGhlYWRlciAqLwoJc2tiX3Jlc2VydmUodHhfc2tiLCBzZWxmLT5tYXhfaGVhZGVyX3NpemUpOwoJc2tiX3B1dCh0eF9za2IsIDMrbmFtZV9sZW4rYXR0cl9sZW4pOwoJZnJhbWUgPSB0eF9za2ItPmRhdGE7CgoJLyogQnVpbGQgZnJhbWUgKi8KCWZyYW1lWzBdID0gSUFQX0xTVCB8IEdFVF9WQUxVRV9CWV9DTEFTUzsKCWZyYW1lWzFdID0gbmFtZV9sZW47ICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnNlcnQgbGVuZ3RoIG9mIG5hbWUgKi8KCW1lbWNweShmcmFtZSsyLCBuYW1lLCBuYW1lX2xlbik7ICAgICAgICAgICAvKiBJbnNlcnQgbmFtZSAqLwoJZnJhbWVbMituYW1lX2xlbl0gPSBhdHRyX2xlbjsgICAgICAgICAgICAgIC8qIEluc2VydCBsZW5ndGggb2YgYXR0ciAqLwoJbWVtY3B5KGZyYW1lKzMrbmFtZV9sZW4sIGF0dHIsIGF0dHJfbGVuKTsgIC8qIEluc2VydCBhdHRyICovCgoJaXJpYXBfZG9fY2xpZW50X2V2ZW50KHNlbGYsIElBUF9DQUxMX1JFUVVFU1RfR1ZCQywgdHhfc2tiKTsKCgkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudCAtIHNlZSBzdGF0ZV9zX2Rpc2Nvbm5lY3QoKS4gKi8KCWRldl9rZnJlZV9za2IodHhfc2tiKTsKCglyZXR1cm4gMDsKfQpFWFBPUlRfU1lNQk9MKGlyaWFwX2dldHZhbHVlYnljbGFzc19yZXF1ZXN0KTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFwX2dldHZhbHVlYnljbGFzc19jb25maXJtIChzZWxmLCBza2IpCiAqCiAqICAgIEdvdCByZXN1bHQgZnJvbSBHZXRWYWx1ZUJ5Q2xhc3MgY29tbWFuZC4gUGFyc2UgaXQgYW5kIHJldHVybiByZXN1bHQKICogICAgdG8gc2VydmljZSB1c2VyLgogKgogKi8Kc3RhdGljIHZvaWQgaXJpYXBfZ2V0dmFsdWVieWNsYXNzX2NvbmZpcm0oc3RydWN0IGlyaWFwX2NiICpzZWxmLAoJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IGlhc192YWx1ZSAqdmFsdWU7CglpbnQgY2hhcnNldDsKCV9fdTMyIHZhbHVlX2xlbjsKCV9fdTMyIHRtcF9jcHUzMjsKCV9fdTE2IG9ial9pZDsKCV9fdTE2IGxlbjsKCV9fdTggIHR5cGU7CglfX3U4ICpmcDsKCWludCBuOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOwoKCS8qIEluaXRpYWxpemUgdmFyaWFibGVzICovCglmcCA9IHNrYi0+ZGF0YTsKCW4gPSAyOwoKCS8qIEdldCBsZW5ndGgsIE1TQiBmaXJzdCAqLwoJbGVuID0gYmUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoX19iZTE2ICopKGZwK24pKSk7IG4gKz0gMjsKCglJUkRBX0RFQlVHKDQsICIlcygpLCBsZW49JWRcbiIsIF9fRlVOQ1RJT05fXywgbGVuKTsKCgkvKiBHZXQgb2JqZWN0IElELCBNU0IgZmlyc3QgKi8KCW9ial9pZCA9IGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fYmUxNiAqKShmcCtuKSkpOyBuICs9IDI7CgoJdHlwZSA9IGZwW24rK107CglJUkRBX0RFQlVHKDQsICIlcygpLCBWYWx1ZSB0eXBlID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgdHlwZSk7CgoJc3dpdGNoICh0eXBlKSB7CgljYXNlIElBU19JTlRFR0VSOgoJCW1lbWNweSgmdG1wX2NwdTMyLCBmcCtuLCA0KTsgbiArPSA0OwoJCWJlMzJfdG9fY3B1cygmdG1wX2NwdTMyKTsKCQl2YWx1ZSA9IGlyaWFzX25ld19pbnRlZ2VyX3ZhbHVlKHRtcF9jcHUzMik7CgoJCS8qICBMZWdhbCB2YWx1ZXMgcmVzdHJpY3RlZCB0byAweDAxLTB4NmYsIHBhZ2UgMTUgaXJ0dHAgKi8KCQlJUkRBX0RFQlVHKDQsICIlcygpLCBsc2FwPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHZhbHVlLT50LmludGVnZXIpOwoJCWJyZWFrOwoJY2FzZSBJQVNfU1RSSU5HOgoJCWNoYXJzZXQgPSBmcFtuKytdOwoKCQlzd2l0Y2ggKGNoYXJzZXQpIHsKCQljYXNlIENTX0FTQ0lJOgoJCQlicmVhazsKLyoJCWNhc2UgQ1NfSVNPXzg4NTlfMTogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfMjogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfMzogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfNDogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfNTogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfNjogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfNzogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfODogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfOTogKi8KLyoJCWNhc2UgQ1NfVU5JQ09ERTogKi8KCQlkZWZhdWx0OgoJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBjaGFyc2V0ICVzLCBub3Qgc3VwcG9ydGVkXG4iLAoJCQkJICAgX19GVU5DVElPTl9fLCBpYXNfY2hhcnNldF90eXBlc1tjaGFyc2V0XSk7CgoJCQkvKiBBYm9ydGluZywgY2xvc2UgY29ubmVjdGlvbiEgKi8KCQkJaXJpYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYpOwoJCQlyZXR1cm47CgkJCS8qIGJyZWFrOyAqLwoJCX0KCQl2YWx1ZV9sZW4gPSBmcFtuKytdOwoJCUlSREFfREVCVUcoNCwgIiVzKCksIHN0cmxlbj0lZFxuIiwgX19GVU5DVElPTl9fLCB2YWx1ZV9sZW4pOwoKCQkvKiBNYWtlIHN1cmUgdGhlIHN0cmluZyBpcyBudWxsLXRlcm1pbmF0ZWQgKi8KCQlmcFtuK3ZhbHVlX2xlbl0gPSAweDAwOwoJCUlSREFfREVCVUcoNCwgIkdvdCBzdHJpbmcgJXNcbiIsIGZwK24pOwoKCQkvKiBXaWxsIHRydW5jYXRlIHRvIElBU19NQVhfU1RSSU5HIGJ5dGVzICovCgkJdmFsdWUgPSBpcmlhc19uZXdfc3RyaW5nX3ZhbHVlKGZwK24pOwoJCWJyZWFrOwoJY2FzZSBJQVNfT0NUX1NFUToKCQl2YWx1ZV9sZW4gPSBiZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2JlMTYgKikoZnArbikpKTsKCQluICs9IDI7CgoJCS8qIFdpbGwgdHJ1bmNhdGUgdG8gSUFTX01BWF9PQ1RFVF9TVFJJTkcgYnl0ZXMgKi8KCQl2YWx1ZSA9IGlyaWFzX25ld19vY3RzZXFfdmFsdWUoZnArbiwgdmFsdWVfbGVuKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJdmFsdWUgPSBpcmlhc19uZXdfbWlzc2luZ192YWx1ZSgpOwoJCWJyZWFrOwoJfQoKCS8qIEZpbmlzaGVkLCBjbG9zZSBjb25uZWN0aW9uISAqLwoJaXJpYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYpOwoKCS8qIFdhcm5pbmcsIHRoZSBjbGllbnQgbWlnaHQgY2xvc2UgdXMsIHNvIHJlbWVtYmVyIG5vIHRvIHVzZSBzZWxmCgkgKiBhbnltb3JlIGFmdGVyIGNhbGxpbmcgY29uZmlybQoJICovCglpZiAoc2VsZi0+Y29uZmlybSkKCQlzZWxmLT5jb25maXJtKElBU19TVUNDRVNTLCBvYmpfaWQsIHZhbHVlLCBzZWxmLT5wcml2KTsKCWVsc2UgewoJCUlSREFfREVCVUcoMCwgIiVzKCksIG1pc3NpbmcgaGFuZGxlciFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJaXJpYXNfZGVsZXRlX3ZhbHVlKHZhbHVlKTsKCX0KfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3Jlc3BvbnNlICgpCiAqCiAqICAgIFNlbmQgYW5zd2VyIGJhY2sgdG8gcmVtb3RlIExNLUlBUwogKgogKi8Kc3RhdGljIHZvaWQgaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3Jlc3BvbnNlKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwKCQkJCQkgICBfX3UxNiBvYmpfaWQsCgkJCQkJICAgX191OCByZXRfY29kZSwKCQkJCQkgICBzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZSkKewoJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKCWludCBuOwoJX19iZTMyIHRtcF9iZTMyOwoJX19iZTE2IHRtcF9iZTE2OwoJX191OCAqZnA7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHZhbHVlICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQodmFsdWUtPmxlbiA8PSAxMDI0LCByZXR1cm47KTsKCgkvKiBJbml0aWFsaXplIHZhcmlhYmxlcyAqLwoJbiA9IDA7CgoJLyoKCSAqICBXZSBtdXN0IGFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgcmVzcG9uc2UgYWZ0ZXIgdGhlIGxlbmd0aCBvZiB0aGUKCSAqICB2YWx1ZS4gV2UgYWRkIDMyIGJ5dGVzIGJlY2F1c2Ugb2YgdGhlIDYgYnl0ZXMgZm9yIHRoZSBmcmFtZSBhbmQKCSAqICBtYXggNSBieXRlcyBmb3IgdGhlIHZhbHVlIGNvZGluZy4KCSAqLwoJdHhfc2tiID0gYWxsb2Nfc2tiKHZhbHVlLT5sZW4gKyBzZWxmLT5tYXhfaGVhZGVyX3NpemUgKyAzMiwKCQkJICAgR0ZQX0FUT01JQyk7CglpZiAoIXR4X3NrYikKCQlyZXR1cm47CgoJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYIGFuZCBMQVAgaGVhZGVyICovCglza2JfcmVzZXJ2ZSh0eF9za2IsIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSk7Cglza2JfcHV0KHR4X3NrYiwgNik7CgoJZnAgPSB0eF9za2ItPmRhdGE7CgoJLyogQnVpbGQgZnJhbWUgKi8KCWZwW24rK10gPSBHRVRfVkFMVUVfQllfQ0xBU1MgfCBJQVBfTFNUOwoJZnBbbisrXSA9IHJldF9jb2RlOwoKCS8qIEluc2VydCBsaXN0IGxlbmd0aCAoTVNCIGZpcnN0KSAqLwoJdG1wX2JlMTYgPSBfX2NvbnN0YW50X2h0b25zKDB4MDAwMSk7CgltZW1jcHkoZnArbiwgJnRtcF9iZTE2LCAyKTsgIG4gKz0gMjsKCgkvKiBJbnNlcnQgb2JqZWN0IGlkZW50aWZpZXIgKCBNU0IgZmlyc3QpICovCgl0bXBfYmUxNiA9IGNwdV90b19iZTE2KG9ial9pZCk7CgltZW1jcHkoZnArbiwgJnRtcF9iZTE2LCAyKTsgbiArPSAyOwoKCXN3aXRjaCAodmFsdWUtPnR5cGUpIHsKCWNhc2UgSUFTX1NUUklORzoKCQlza2JfcHV0KHR4X3NrYiwgMyArIHZhbHVlLT5sZW4pOwoJCWZwW24rK10gPSB2YWx1ZS0+dHlwZTsKCQlmcFtuKytdID0gMDsgLyogQVNDSUkgKi8KCQlmcFtuKytdID0gKF9fdTgpIHZhbHVlLT5sZW47CgkJbWVtY3B5KGZwK24sIHZhbHVlLT50LnN0cmluZywgdmFsdWUtPmxlbik7IG4rPXZhbHVlLT5sZW47CgkJYnJlYWs7CgljYXNlIElBU19JTlRFR0VSOgoJCXNrYl9wdXQodHhfc2tiLCA1KTsKCQlmcFtuKytdID0gdmFsdWUtPnR5cGU7CgoJCXRtcF9iZTMyID0gY3B1X3RvX2JlMzIodmFsdWUtPnQuaW50ZWdlcik7CgkJbWVtY3B5KGZwK24sICZ0bXBfYmUzMiwgNCk7IG4gKz0gNDsKCQlicmVhazsKCWNhc2UgSUFTX09DVF9TRVE6CgkJc2tiX3B1dCh0eF9za2IsIDMgKyB2YWx1ZS0+bGVuKTsKCQlmcFtuKytdID0gdmFsdWUtPnR5cGU7CgoJCXRtcF9iZTE2ID0gY3B1X3RvX2JlMTYodmFsdWUtPmxlbik7CgkJbWVtY3B5KGZwK24sICZ0bXBfYmUxNiwgMik7IG4gKz0gMjsKCQltZW1jcHkoZnArbiwgdmFsdWUtPnQub2N0X3NlcSwgdmFsdWUtPmxlbik7IG4rPXZhbHVlLT5sZW47CgkJYnJlYWs7CgljYXNlIElBU19NSVNTSU5HOgoJCUlSREFfREVCVUcoIDMsICIlczogc2VuZGluZyBJQVNfTUlTU0lOR1xuIiwgX19GVU5DVElPTl9fKTsKCQlza2JfcHV0KHR4X3NrYiwgMSk7CgkJZnBbbisrXSA9IHZhbHVlLT50eXBlOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDAsICIlcygpLCB0eXBlIG5vdCBpbXBsZW1lbnRlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJYnJlYWs7Cgl9CglpcmlhcF9kb19yX2Nvbm5lY3RfZXZlbnQoc2VsZiwgSUFQX0NBTExfUkVTUE9OU0UsIHR4X3NrYik7CgoJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgc3RhdGVfcl9leGVjdXRlKCkuICovCglkZXZfa2ZyZWVfc2tiKHR4X3NrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFwX2dldHZhbHVlYnljbGFzc19pbmRpY2F0aW9uIChzZWxmLCBza2IpCiAqCiAqICAgIGdldHZhbHVlYnljbGFzcyBpcyByZXF1ZXN0ZWQgZnJvbSBwZWVyIExNLUlBUwogKgogKi8Kc3RhdGljIHZvaWQgaXJpYXBfZ2V0dmFsdWVieWNsYXNzX2luZGljYXRpb24oc3RydWN0IGlyaWFwX2NiICpzZWxmLAoJCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IGlhc19vYmplY3QgKm9iajsKCXN0cnVjdCBpYXNfYXR0cmliICphdHRyaWI7CglpbnQgbmFtZV9sZW47CglpbnQgYXR0cl9sZW47CgljaGFyIG5hbWVbSUFTX01BWF9DTEFTU05BTUUgKyAxXTsJLyogNjAgYnl0ZXMgKi8KCWNoYXIgYXR0cltJQVNfTUFYX0FUVFJJQk5BTUUgKyAxXTsJLyogNjAgYnl0ZXMgKi8KCV9fdTggKmZwOwoJaW50IG47CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKCglmcCA9IHNrYi0+ZGF0YTsKCW4gPSAxOwoKCW5hbWVfbGVuID0gZnBbbisrXTsKCW1lbWNweShuYW1lLCBmcCtuLCBuYW1lX2xlbik7IG4rPW5hbWVfbGVuOwoJbmFtZVtuYW1lX2xlbl0gPSAnXDAnOwoKCWF0dHJfbGVuID0gZnBbbisrXTsKCW1lbWNweShhdHRyLCBmcCtuLCBhdHRyX2xlbik7IG4rPWF0dHJfbGVuOwoJYXR0clthdHRyX2xlbl0gPSAnXDAnOwoKCUlSREFfREVCVUcoNCwgIkxNLUlBUzogTG9va2luZyB1cCAlczogJXNcbiIsIG5hbWUsIGF0dHIpOwoJb2JqID0gaXJpYXNfZmluZF9vYmplY3QobmFtZSk7CgoJaWYgKG9iaiA9PSBOVUxMKSB7CgkJSVJEQV9ERUJVRygyLCAiTE0tSUFTOiBPYmplY3QgJXMgbm90IGZvdW5kXG4iLCBuYW1lKTsKCQlpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVzcG9uc2Uoc2VsZiwgMHgxMjM1LCBJQVNfQ0xBU1NfVU5LTk9XTiwKCQkJCQkgICAgICAgJmlyaWFzX21pc3NpbmcpOwoJCXJldHVybjsKCX0KCUlSREFfREVCVUcoNCwgIkxNLUlBUzogZm91bmQgJXMsIGlkPSVkXG4iLCBvYmotPm5hbWUsIG9iai0+aWQpOwoKCWF0dHJpYiA9IGlyaWFzX2ZpbmRfYXR0cmliKG9iaiwgYXR0cik7CglpZiAoYXR0cmliID09IE5VTEwpIHsKCQlJUkRBX0RFQlVHKDIsICJMTS1JQVM6IEF0dHJpYnV0ZSAlcyBub3QgZm91bmRcbiIsIGF0dHIpOwoJCWlyaWFwX2dldHZhbHVlYnljbGFzc19yZXNwb25zZShzZWxmLCBvYmotPmlkLAoJCQkJCSAgICAgICBJQVNfQVRUUklCX1VOS05PV04sCgkJCQkJICAgICAgICZpcmlhc19taXNzaW5nKTsKCQlyZXR1cm47Cgl9CgoJLyogV2UgaGF2ZSBhIG1hdGNoOyBzZW5kIHRoZSB2YWx1ZS4gICovCglpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVzcG9uc2Uoc2VsZiwgb2JqLT5pZCwgSUFTX1NVQ0NFU1MsCgkJCQkgICAgICAgYXR0cmliLT52YWx1ZSk7CgoJcmV0dXJuOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9zZW5kX2FjayAodm9pZCkKICoKICogICAgQ3VycmVudGx5IG5vdCB1c2VkCiAqCiAqLwp2b2lkIGlyaWFwX3NlbmRfYWNrKHN0cnVjdCBpcmlhcF9jYiAqc2VsZikKewoJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKCV9fdTggKmZyYW1lOwoKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CgoJdHhfc2tiID0gYWxsb2Nfc2tiKExNUF9NQVhfSEVBREVSICsgMSwgR0ZQX0FUT01JQyk7CglpZiAoIXR4X3NrYikKCQlyZXR1cm47CgoJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYIGFuZCBMQVAgaGVhZGVyICovCglza2JfcmVzZXJ2ZSh0eF9za2IsIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSk7Cglza2JfcHV0KHR4X3NrYiwgMSk7CglmcmFtZSA9IHR4X3NrYi0+ZGF0YTsKCgkvKiBCdWlsZCBmcmFtZSAqLwoJZnJhbWVbMF0gPSBJQVBfTFNUIHwgSUFQX0FDSyB8IHNlbGYtPm9wZXJhdGlvbjsKCglpcmxtcF9kYXRhX3JlcXVlc3Qoc2VsZi0+bHNhcCwgdHhfc2tiKTsKfQoKdm9pZCBpcmlhcF9jb25uZWN0X3JlcXVlc3Qoc3RydWN0IGlyaWFwX2NiICpzZWxmKQp7CglpbnQgcmV0OwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoKCXJldCA9IGlybG1wX2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5sc2FwLCBMU0FQX0lBUywKCQkJCSAgICBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIsCgkJCQkgICAgTlVMTCwgTlVMTCk7CglpZiAocmV0IDwgMCkgewoJCUlSREFfREVCVUcoMCwgIiVzKCksIGNvbm5lY3QgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKCQlzZWxmLT5jb25maXJtKElBU19ESVNDT05ORUNULCAwLCBOVUxMLCBzZWxmLT5wcml2KTsKCX0KfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfY29ubmVjdF9jb25maXJtIChoYW5kbGUsIHNrYikKICoKICogICAgTFNBUCBjb25uZWN0aW9uIGNvbmZpcm1lZCEKICoKICovCnN0YXRpYyB2b2lkIGlyaWFwX2Nvbm5lY3RfY29uZmlybSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgX191MzIgbWF4X3NlZ19zaXplLAoJCQkJICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IGlyaWFwX2NiICpzZWxmOwoKCXNlbGYgPSAoc3RydWN0IGlyaWFwX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOwoKCXNlbGYtPm1heF9kYXRhX3NpemUgPSBtYXhfc2VnX3NpemU7CglzZWxmLT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CgoJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CgoJaXJpYXBfZG9fY2xpZW50X2V2ZW50KHNlbGYsIElBUF9MTV9DT05ORUNUX0NPTkZJUk0sIHNrYik7CgoJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgc3RhdGVfc19tYWtlX2NhbGwoKS4gKi8KCWRldl9rZnJlZV9za2Ioc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfY29ubmVjdF9pbmRpY2F0aW9uICggaGFuZGxlLCBza2IpCiAqCiAqICAgIFJlbW90ZSBMTS1JQVMgaXMgcmVxdWVzdGluZyBjb25uZWN0aW9uCiAqCiAqLwpzdGF0aWMgdm9pZCBpcmlhcF9jb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCSAgICAgc3RydWN0IHFvc19pbmZvICpxb3MsIF9fdTMyIG1heF9zZWdfc2l6ZSwKCQkJCSAgICAgX191OCBtYXhfaGVhZGVyX3NpemUsCgkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgKm5ldzsKCglJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCXNlbGYgPSAoc3RydWN0IGlyaWFwX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgZ290byBvdXQ7KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgZ290byBvdXQ7KTsKCgkvKiBTdGFydCBuZXcgc2VydmVyICovCgluZXcgPSBpcmlhcF9vcGVuKExTQVBfSUFTLCBJQVNfU0VSVkVSLCBOVUxMLCBOVUxMKTsKCWlmICghbmV3KSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgb3BlbiBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CgkJZ290byBvdXQ7Cgl9CgoJLyogTm93IGF0dGFjaCB1cCB0aGUgbmV3ICJzb2NrZXQiICovCgluZXctPmxzYXAgPSBpcmxtcF9kdXAoc2VsZi0+bHNhcCwgbmV3KTsKCWlmICghbmV3LT5sc2FwKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgZHVwIGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJZ290byBvdXQ7Cgl9CgoJbmV3LT5tYXhfZGF0YV9zaXplID0gbWF4X3NlZ19zaXplOwoJbmV3LT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CgoJLyogQ2xlYW4gdXAgdGhlIG9yaWdpbmFsIG9uZSB0byBrZWVwIGl0IGluIGxpc3RlbiBzdGF0ZSAqLwoJaXJsbXBfbGlzdGVuKHNlbGYtPmxzYXApOwoKCWlyaWFwX2RvX3NlcnZlcl9ldmVudChuZXcsIElBUF9MTV9DT05ORUNUX0lORElDQVRJT04sIHNrYik7CgpvdXQ6CgkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudCAtIHNlZSBzdGF0ZV9yX2Rpc2Nvbm5lY3QoKS4gKi8KCWRldl9rZnJlZV9za2Ioc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfZGF0YV9pbmRpY2F0aW9uIChoYW5kbGUsIHNrYikKICoKICogICAgUmVjZWl2ZXMgZGF0YSBmcm9tIGNvbm5lY3Rpb24gaWRlbnRpZmllZCBieSBoYW5kbGUgZnJvbSBJckxNUAogKgogKi8Kc3RhdGljIGludCBpcmlhcF9kYXRhX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglzdHJ1Y3QgaXJpYXBfY2IgKnNlbGY7CglfX3U4ICAqZnJhbWU7CglfX3U4ICBvcGNvZGU7CgoJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglzZWxmID0gKHN0cnVjdCBpcmlhcF9jYiAqKSBpbnN0YW5jZTsKCglJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIDA7KTsKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgZ290byBvdXQ7KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgZ290byBvdXQ7KTsKCglmcmFtZSA9IHNrYi0+ZGF0YTsKCglpZiAoc2VsZi0+bW9kZSA9PSBJQVNfU0VSVkVSKSB7CgkJLyogQ2FsbCBzZXJ2ZXIgKi8KCQlJUkRBX0RFQlVHKDQsICIlcygpLCBDYWxsaW5nIHNlcnZlciFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJaXJpYXBfZG9fcl9jb25uZWN0X2V2ZW50KHNlbGYsIElBUF9SRUNWX0ZfTFNULCBza2IpOwoJCWdvdG8gb3V0OwoJfQoJb3Bjb2RlID0gZnJhbWVbMF07CglpZiAofm9wY29kZSAmIElBUF9MU1QpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiwgSXJJQVMgbXVsdGlmcmFtZSBjb21tYW5kcyBvciAiCgkJCSAgICAgInJlc3VsdHMgaXMgbm90IGltcGxlbWVudGVkIHlldCFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlnb3RvIG91dDsKCX0KCgkvKiBDaGVjayBmb3IgYWNrIGZyYW1lcyBzaW5jZSB0aGV5IGRvbid0IGNvbnRhaW4gYW55IGRhdGEgKi8KCWlmIChvcGNvZGUgJiBJQVBfQUNLKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSBHb3QgYWNrIGZyYW1lIVxuIiwgX19GVU5DVElPTl9fKTsKCQlnb3RvIG91dDsKCX0KCglvcGNvZGUgJj0gfklBUF9MU1Q7IC8qIE1hc2sgYXdheSBMU1QgYml0ICovCgoJc3dpdGNoIChvcGNvZGUpIHsKCWNhc2UgR0VUX0lORk9fQkFTRToKCQlJUkRBX0RFQlVHKDAsICJJckxNUCBHZXRJbmZvQmFzZURldGFpbHMgbm90IGltcGxlbWVudGVkIVxuIik7CgkJYnJlYWs7CgljYXNlIEdFVF9WQUxVRV9CWV9DTEFTUzoKCQlpcmlhcF9kb19jYWxsX2V2ZW50KHNlbGYsIElBUF9SRUNWX0ZfTFNULCBOVUxMKTsKCgkJc3dpdGNoIChmcmFtZVsxXSkgewoJCWNhc2UgSUFTX1NVQ0NFU1M6CgkJCWlyaWFwX2dldHZhbHVlYnljbGFzc19jb25maXJtKHNlbGYsIHNrYik7CgkJCWJyZWFrOwoJCWNhc2UgSUFTX0NMQVNTX1VOS05PV046CgkJCUlSREFfREVCVUcoMSwgIiVzKCksIE5vIHN1Y2ggY2xhc3MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCQkvKiBGaW5pc2hlZCwgY2xvc2UgY29ubmVjdGlvbiEgKi8KCQkJaXJpYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYpOwoKCQkJLyoKCQkJICogV2FybmluZywgdGhlIGNsaWVudCBtaWdodCBjbG9zZSB1cywgc28gcmVtZW1iZXIKCQkJICogbm8gdG8gdXNlIHNlbGYgYW55bW9yZSBhZnRlciBjYWxsaW5nIGNvbmZpcm0KCQkJICovCgkJCWlmIChzZWxmLT5jb25maXJtKQoJCQkJc2VsZi0+Y29uZmlybShJQVNfQ0xBU1NfVU5LTk9XTiwgMCwgTlVMTCwKCQkJCQkgICAgICBzZWxmLT5wcml2KTsKCQkJYnJlYWs7CgkJY2FzZSBJQVNfQVRUUklCX1VOS05PV046CgkJCUlSREFfREVCVUcoMSwgIiVzKCksIE5vIHN1Y2ggYXR0cmlidXRlIVxuIiwgX19GVU5DVElPTl9fKTsKCQkJLyogRmluaXNoZWQsIGNsb3NlIGNvbm5lY3Rpb24hICovCgkJCWlyaWFwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmKTsKCgkJCS8qCgkJCSAqIFdhcm5pbmcsIHRoZSBjbGllbnQgbWlnaHQgY2xvc2UgdXMsIHNvIHJlbWVtYmVyCgkJCSAqIG5vIHRvIHVzZSBzZWxmIGFueW1vcmUgYWZ0ZXIgY2FsbGluZyBjb25maXJtCgkJCSAqLwoJCQlpZiAoc2VsZi0+Y29uZmlybSkKCQkJCXNlbGYtPmNvbmZpcm0oSUFTX0FUVFJJQl9VTktOT1dOLCAwLCBOVUxMLAoJCQkJCSAgICAgIHNlbGYtPnByaXYpOwoJCQlicmVhazsKCQl9CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gb3AtY29kZTogJTAyeFxuIiwgX19GVU5DVElPTl9fLAoJCQkgICBvcGNvZGUpOwoJCWJyZWFrOwoJfQoKb3V0OgoJLyogQ2xlYW51cCAtIHN1Yi1jYWxscyB3aWxsIGhhdmUgZG9uZSBza2JfZ2V0KCkgYXMgbmVlZGVkLiAqLwoJZGV2X2tmcmVlX3NrYihza2IpOwoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFwX2NhbGxfaW5kaWNhdGlvbiAoc2VsZiwgc2tiKQogKgogKiAgICBSZWNlaXZlZCBjYWxsIHRvIHNlcnZlciBmcm9tIHBlZXIgTE0tSUFTCiAqCiAqLwp2b2lkIGlyaWFwX2NhbGxfaW5kaWNhdGlvbihzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCnsKCV9fdTggKmZwOwoJX191OCBvcGNvZGU7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKCglmcCA9IHNrYi0+ZGF0YTsKCglvcGNvZGUgPSBmcFswXTsKCWlmICh+b3Bjb2RlICYgMHg4MCkgewoJCUlSREFfV0FSTklORygiJXM6IElySUFTIG11bHRpZnJhbWUgY29tbWFuZHMgb3IgcmVzdWx0cyIKCQkJICAgICAiaXMgbm90IGltcGxlbWVudGVkIHlldCFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoJb3Bjb2RlICY9IDB4N2Y7IC8qIE1hc2sgYXdheSBMU1QgYml0ICovCgoJc3dpdGNoIChvcGNvZGUpIHsKCWNhc2UgR0VUX0lORk9fQkFTRToKCQlJUkRBX1dBUk5JTkcoIiVzOiBHZXRJbmZvQmFzZURldGFpbHMgbm90IGltcGxlbWVudGVkIHlldCFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlicmVhazsKCWNhc2UgR0VUX1ZBTFVFX0JZX0NMQVNTOgoJCWlyaWFwX2dldHZhbHVlYnljbGFzc19pbmRpY2F0aW9uKHNlbGYsIHNrYik7CgkJYnJlYWs7Cgl9CgkvKiBza2Igd2lsbCBiZSBjbGVhbmVkIHVwIGluIGlyaWFwX2RhdGFfaW5kaWNhdGlvbiAqLwp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF93YXRjaGRvZ190aW1lcl9leHBpcmVkIChkYXRhKQogKgogKiAgICBRdWVyeSBoYXMgdGFrZW4gdG9vIGxvbmcgdGltZSwgc28gYWJvcnQKICoKICovCnN0YXRpYyB2b2lkIGlyaWFwX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKewoJc3RydWN0IGlyaWFwX2NiICpzZWxmID0gKHN0cnVjdCBpcmlhcF9jYiAqKSBkYXRhOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoKCS8qIGlyaWFwX2Nsb3NlKHNlbGYpOyAqLwp9CgojaWZkZWYgQ09ORklHX1BST0NfRlMKCnN0YXRpYyBjb25zdCBjaGFyICppYXNfdmFsdWVfdHlwZXNbXSA9IHsKCSJJQVNfTUlTU0lORyIsCgkiSUFTX0lOVEVHRVIiLAoJIklBU19PQ1RfU0VRIiwKCSJJQVNfU1RSSU5HIgp9OwoKc3RhdGljIGlubGluZSBzdHJ1Y3QgaWFzX29iamVjdCAqaXJpYXNfc2VxX2lkeChsb2ZmX3QgcG9zKQp7CglzdHJ1Y3QgaWFzX29iamVjdCAqb2JqOwoKCWZvciAob2JqID0gKHN0cnVjdCBpYXNfb2JqZWN0ICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGlyaWFzX29iamVjdHMpOwoJICAgICBvYmo7IG9iaiA9IChzdHJ1Y3QgaWFzX29iamVjdCAqKSBoYXNoYmluX2dldF9uZXh0KGlyaWFzX29iamVjdHMpKSB7CgkJaWYgKHBvcy0tID09IDApCgkJCWJyZWFrOwoJfQoKCXJldHVybiBvYmo7Cn0KCnN0YXRpYyB2b2lkICppcmlhc19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQp7CglzcGluX2xvY2tfaXJxKCZpcmlhc19vYmplY3RzLT5oYl9zcGlubG9jayk7CgoJcmV0dXJuICpwb3MgPyBpcmlhc19zZXFfaWR4KCpwb3MgLSAxKSA6IFNFUV9TVEFSVF9UT0tFTjsKfQoKc3RhdGljIHZvaWQgKmlyaWFzX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKewoJKysqcG9zOwoKCXJldHVybiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCgkJPyAodm9pZCAqKSBoYXNoYmluX2dldF9maXJzdChpcmlhc19vYmplY3RzKQoJCTogKHZvaWQgKikgaGFzaGJpbl9nZXRfbmV4dChpcmlhc19vYmplY3RzKTsKfQoKc3RhdGljIHZvaWQgaXJpYXNfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsKCXNwaW5fdW5sb2NrX2lycSgmaXJpYXNfb2JqZWN0cy0+aGJfc3BpbmxvY2spOwp9CgpzdGF0aWMgaW50IGlyaWFzX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQp7CglpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCgkJc2VxX3B1dHMoc2VxLCAiTE0tSUFTIE9iamVjdHM6XG4iKTsKCWVsc2UgewoJCXN0cnVjdCBpYXNfb2JqZWN0ICpvYmogPSB2OwoJCXN0cnVjdCBpYXNfYXR0cmliICphdHRyaWI7CgoJCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuIC1FSU5WQUw7KTsKCgkJc2VxX3ByaW50ZihzZXEsICJuYW1lOiAlcywgaWQ9JWRcbiIsCgkJCSAgIG9iai0+bmFtZSwgb2JqLT5pZCk7CgoJCS8qIENhcmVmdWwgZm9yIHByaW9yaXR5IGludmVyc2lvbnMgaGVyZSAhCgkJICogQWxsIG90aGVyIHVzZXMgb2YgYXR0cmliIHNwaW5sb2NrIGFyZSBpbmRlcGVuZGVudCBvZgoJCSAqIHRoZSBvYmplY3Qgc3BpbmxvY2ssIHNvIHdlIGFyZSBzYWZlLiBKZWFuIElJICovCgkJc3Bpbl9sb2NrKCZvYmotPmF0dHJpYnMtPmhiX3NwaW5sb2NrKTsKCgkJLyogTGlzdCBhbGwgYXR0cmlidXRlcyBmb3IgdGhpcyBvYmplY3QgKi8KCQlmb3IgKGF0dHJpYiA9IChzdHJ1Y3QgaWFzX2F0dHJpYiAqKSBoYXNoYmluX2dldF9maXJzdChvYmotPmF0dHJpYnMpOwoJCSAgICAgYXR0cmliICE9IE5VTEw7CgkJICAgICBhdHRyaWIgPSAoc3RydWN0IGlhc19hdHRyaWIgKikgaGFzaGJpbl9nZXRfbmV4dChvYmotPmF0dHJpYnMpKSB7CgoJCQlJUkRBX0FTU0VSVChhdHRyaWItPm1hZ2ljID09IElBU19BVFRSSUJfTUFHSUMsCgkJCQkgICAgZ290byBvdXRsb29wOyApOwoKCQkJc2VxX3ByaW50ZihzZXEsICIgLSBBdHRyaWJ1dGUgbmFtZTogXCIlc1wiLCAiLAoJCQkJICAgYXR0cmliLT5uYW1lKTsKCQkJc2VxX3ByaW50ZihzZXEsICJ2YWx1ZVslc106ICIsCgkJCQkgICBpYXNfdmFsdWVfdHlwZXNbYXR0cmliLT52YWx1ZS0+dHlwZV0pOwoKCQkJc3dpdGNoIChhdHRyaWItPnZhbHVlLT50eXBlKSB7CgkJCWNhc2UgSUFTX0lOVEVHRVI6CgkJCQlzZXFfcHJpbnRmKHNlcSwgIiVkXG4iLAoJCQkJCSAgIGF0dHJpYi0+dmFsdWUtPnQuaW50ZWdlcik7CgkJCQlicmVhazsKCQkJY2FzZSBJQVNfU1RSSU5HOgoJCQkJc2VxX3ByaW50ZihzZXEsICJcIiVzXCJcbiIsCgkJCQkJICAgYXR0cmliLT52YWx1ZS0+dC5zdHJpbmcpOwoJCQkJYnJlYWs7CgkJCWNhc2UgSUFTX09DVF9TRVE6CgkJCQlzZXFfcHJpbnRmKHNlcSwgIm9jdGV0IHNlcXVlbmNlICglZCBieXRlcylcbiIsCgkJCQkJICAgYXR0cmliLT52YWx1ZS0+bGVuKTsKCQkJCWJyZWFrOwoJCQljYXNlIElBU19NSVNTSU5HOgoJCQkJc2VxX3B1dHMoc2VxLCAibWlzc2luZ1xuIik7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXNlcV9wcmludGYoc2VxLCAidHlwZSAlZD9cbiIsCgkJCQkJICAgYXR0cmliLT52YWx1ZS0+dHlwZSk7CgkJCX0KCQkJc2VxX3B1dGMoc2VxLCAnXG4nKTsKCgkJfQoJSVJEQV9BU1NFUlRfTEFCRUwob3V0bG9vcDopCgkJc3Bpbl91bmxvY2soJm9iai0+YXR0cmlicy0+aGJfc3BpbmxvY2spOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlyaWFzX3NlcV9vcHMgPSB7Cgkuc3RhcnQgID0gaXJpYXNfc2VxX3N0YXJ0LAoJLm5leHQgICA9IGlyaWFzX3NlcV9uZXh0LAoJLnN0b3AgICA9IGlyaWFzX3NlcV9zdG9wLAoJLnNob3cgICA9IGlyaWFzX3NlcV9zaG93LAp9OwoKc3RhdGljIGludCBpcmlhc19zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJSVJEQV9BU1NFUlQoIGlyaWFzX29iamVjdHMgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUw7KTsKCglyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmlyaWFzX3NlcV9vcHMpOwp9Cgpjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlyaWFzX3NlcV9mb3BzID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLm9wZW4gICAgICAgICAgID0gaXJpYXNfc2VxX29wZW4sCgkucmVhZCAgICAgICAgICAgPSBzZXFfcmVhZCwKCS5sbHNlZWsgICAgICAgICA9IHNlcV9sc2VlaywKCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCn07CgojZW5kaWYgLyogUFJPQ19GUyAqLwo=