LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmlhcC5jCiAqIFZlcnNpb246ICAgICAgIDAuOAogKiBEZXNjcmlwdGlvbjogICBJbmZvcm1hdGlvbiBBY2Nlc3MgUHJvdG9jb2wgKElBUCkKICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgogKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIENyZWF0ZWQgYXQ6ICAgIFRodSBBdWcgMjEgMDA6MDI6MDcgMTk5NwogKiBNb2RpZmllZCBhdDogICBTYXQgRGVjIDI1IDE2OjQyOjQyIDE5OTkKICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKgogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwKICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CiAqCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgogKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgoKI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFzX29iamVjdC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXBfZXZlbnQuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CgojaWZkZWYgQ09ORklHX0lSREFfREVCVUcKLyogRklYTUU6IFRoaXMgb25lIHNob3VsZCBnbyBpbiBpcmxtcC5jICovCnN0YXRpYyBjb25zdCBjaGFyICppYXNfY2hhcnNldF90eXBlc1tdID0gewoJIkNTX0FTQ0lJIiwKCSJDU19JU09fODg1OV8xIiwKCSJDU19JU09fODg1OV8yIiwKCSJDU19JU09fODg1OV8zIiwKCSJDU19JU09fODg1OV80IiwKCSJDU19JU09fODg1OV81IiwKCSJDU19JU09fODg1OV82IiwKCSJDU19JU09fODg1OV83IiwKCSJDU19JU09fODg1OV84IiwKCSJDU19JU09fODg1OV85IiwKCSJDU19VTklDT0RFIgp9OwojZW5kaWYJLyogQ09ORklHX0lSREFfREVCVUcgKi8KCnN0YXRpYyBoYXNoYmluX3QgKmlyaWFwID0gTlVMTDsKc3RhdGljIHZvaWQgKnNlcnZpY2VfaGFuZGxlOwoKc3RhdGljIHZvaWQgX19pcmlhcF9jbG9zZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYpOwpzdGF0aWMgaW50IGlyaWFwX3JlZ2lzdGVyX2xzYXAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBfX3U4IHNsc2FwX3NlbCwgaW50IG1vZGUpOwpzdGF0aWMgdm9pZCBpcmlhcF9kaXNjb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCQlMTV9SRUFTT04gcmVhc29uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIHZvaWQgaXJpYXBfY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCgkJCQkgICAgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLCBfX3UzMiBtYXhfc2R1X3NpemUsCgkJCQkgICAgIF9fdTggbWF4X2hlYWRlcl9zaXplLAoJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIHZvaWQgaXJpYXBfY29ubmVjdF9jb25maXJtKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCgkJCQkgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLAoJCQkJICBfX3UzMiBtYXhfc2R1X3NpemUsIF9fdTggbWF4X2hlYWRlcl9zaXplLAoJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIGludCBpcmlhcF9kYXRhX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKCnN0YXRpYyB2b2lkIGlyaWFwX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSk7CgpzdGF0aWMgaW5saW5lIHZvaWQgaXJpYXBfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc3RydWN0IGlyaWFwX2NiICpzZWxmLCAKCQkJCQkgICAgICBpbnQgdGltZW91dCkgCnsKCWlyZGFfc3RhcnRfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyLCB0aW1lb3V0LCBzZWxmLCAKCQkJIGlyaWFwX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQpOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9pbml0ICh2b2lkKQogKgogKiAgICBJbml0aWFsaXplcyB0aGUgSXJJQVAgbGF5ZXIsIGNhbGxlZCBieSB0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGNvZGUKICogICAgaW4gaXJtb2QuYwogKi8KaW50IF9faW5pdCBpcmlhcF9pbml0KHZvaWQpCnsKCXN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CglzdHJ1Y3QgaXJpYXBfY2IgKnNlcnZlcjsKCV9fdTggb2N0X3NlcVs2XTsKCV9fdTE2IGhpbnRzOwoKCS8qIEFsbG9jYXRlIG1hc3RlciBhcnJheSAqLwoJaXJpYXAgPSBoYXNoYmluX25ldyhIQl9MT0NLKTsKCWlmICghaXJpYXApCgkJcmV0dXJuIC1FTk9NRU07CgoJLyogT2JqZWN0IHJlcG9zaXRvcnkgLSBkZWZpbmVkIGluIGlyaWFzX29iamVjdC5jICovCglpcmlhc19vYmplY3RzID0gaGFzaGJpbl9uZXcoSEJfTE9DSyk7CglpZiAoIWlyaWFzX29iamVjdHMpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBDYW4ndCBhbGxvY2F0ZSBpcmlhc19vYmplY3RzIGhhc2hiaW4hXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJaGFzaGJpbl9kZWxldGUoaXJpYXAsIE5VTEwpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCS8qCgkgKiAgUmVnaXN0ZXIgc29tZSBkZWZhdWx0IHNlcnZpY2VzIGZvciBJckxNUAoJICovCgloaW50cyAgPSBpcmxtcF9zZXJ2aWNlX3RvX2hpbnQoU19DT01QVVRFUik7CglzZXJ2aWNlX2hhbmRsZSA9IGlybG1wX3JlZ2lzdGVyX3NlcnZpY2UoaGludHMpOwoKCS8qIFJlZ2lzdGVyIHRoZSBEZXZpY2Ugb2JqZWN0IHdpdGggTE0tSUFTICovCglvYmogPSBpcmlhc19uZXdfb2JqZWN0KCJEZXZpY2UiLCBJQVNfREVWSUNFX0lEKTsKCWlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKG9iaiwgIkRldmljZU5hbWUiLCAiTGludXgiLCBJQVNfS0VSTkVMX0FUVFIpOwoKCW9jdF9zZXFbMF0gPSAweDAxOyAgLyogVmVyc2lvbiAxICovCglvY3Rfc2VxWzFdID0gMHgwMDsgIC8qIElBUyBzdXBwb3J0IGJpdHMgKi8KCW9jdF9zZXFbMl0gPSAweDAwOyAgLyogTE0tTVVYIHN1cHBvcnQgYml0cyAqLwojaWZkZWYgQ09ORklHX0lSREFfVUxUUkEKCW9jdF9zZXFbMl0gfD0gMHgwNDsgLyogQ29ubmVjdGlvbmxlc3MgRGF0YSBzdXBwb3J0ICovCiNlbmRpZgoJaXJpYXNfYWRkX29jdHNlcV9hdHRyaWIob2JqLCAiSXJMTVBTdXBwb3J0Iiwgb2N0X3NlcSwgMywKCQkJCUlBU19LRVJORUxfQVRUUik7Cglpcmlhc19pbnNlcnRfb2JqZWN0KG9iaik7CgoJLyoKCSAqICBSZWdpc3RlciBzZXJ2ZXIgc3VwcG9ydCB3aXRoIElyTE1QIHNvIHdlIGNhbiBhY2NlcHQgaW5jb21pbmcKCSAqICBjb25uZWN0aW9ucwoJICovCglzZXJ2ZXIgPSBpcmlhcF9vcGVuKExTQVBfSUFTLCBJQVNfU0VSVkVSLCBOVUxMLCBOVUxMKTsKCWlmICghc2VydmVyKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5hYmxlIHRvIG9wZW4gc2VydmVyXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiAtMTsKCX0KCWlyaWFwX3JlZ2lzdGVyX2xzYXAoc2VydmVyLCBMU0FQX0lBUywgSUFTX1NFUlZFUik7CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFwX2NsZWFudXAgKHZvaWQpCiAqCiAqICAgIEluaXRpYWxpemVzIHRoZSBJcklBUCBsYXllciwgY2FsbGVkIGJ5IHRoZSBtb2R1bGUgY2xlYW51cCBjb2RlIGluCiAqICAgIGlybW9kLmMKICovCnZvaWQgX19leGl0IGlyaWFwX2NsZWFudXAodm9pZCkKewoJaXJsbXBfdW5yZWdpc3Rlcl9zZXJ2aWNlKHNlcnZpY2VfaGFuZGxlKTsKCgloYXNoYmluX2RlbGV0ZShpcmlhcCwgKEZSRUVfRlVOQykgX19pcmlhcF9jbG9zZSk7CgloYXNoYmluX2RlbGV0ZShpcmlhc19vYmplY3RzLCAoRlJFRV9GVU5DKSBfX2lyaWFzX2RlbGV0ZV9vYmplY3QpOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9vcGVuICh2b2lkKQogKgogKiAgICBPcGVucyBhbiBpbnN0YW5jZSBvZiB0aGUgSXJJQVAgbGF5ZXIsIGFuZCByZWdpc3RlcnMgd2l0aCBJckxNUAogKi8Kc3RydWN0IGlyaWFwX2NiICppcmlhcF9vcGVuKF9fdTggc2xzYXBfc2VsLCBpbnQgbW9kZSwgdm9pZCAqcHJpdiwKCQkJICAgIENPTkZJUk1fQ0FMTEJBQ0sgY2FsbGJhY2spCnsKCXN0cnVjdCBpcmlhcF9jYiAqc2VsZjsKCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCXNlbGYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJpYXBfY2IpLCBHRlBfQVRPTUlDKTsKCWlmICghc2VsZikgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gTlVMTDsKCX0KCgkvKgoJICogIEluaXRpYWxpemUgaW5zdGFuY2UKCSAqLwoJbWVtc2V0KHNlbGYsIDAsIHNpemVvZihzdHJ1Y3QgaXJpYXBfY2IpKTsKCglzZWxmLT5tYWdpYyA9IElBU19NQUdJQzsKCXNlbGYtPm1vZGUgPSBtb2RlOwoJaWYgKG1vZGUgPT0gSUFTX0NMSUVOVCkKCQlpcmlhcF9yZWdpc3Rlcl9sc2FwKHNlbGYsIHNsc2FwX3NlbCwgbW9kZSk7CgoJc2VsZi0+Y29uZmlybSA9IGNhbGxiYWNrOwoJc2VsZi0+cHJpdiA9IHByaXY7CgoJLyogaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3JlcXVlc3QoKSB3aWxsIGNvbnN0cnVjdCBwYWNrZXRzIGJlZm9yZQoJICogd2UgY29ubmVjdCwgc28gdGhpcyBtdXN0IGhhdmUgYSBzYW5lIHZhbHVlLi4uIEplYW4gSUkgKi8KCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IExNUF9NQVhfSEVBREVSOwoKCWluaXRfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKCgloYXNoYmluX2luc2VydChpcmlhcCwgKGlyZGFfcXVldWVfdCAqKSBzZWxmLCAobG9uZykgc2VsZiwgTlVMTCk7CgoJLyogSW5pdGlhbGl6ZSBzdGF0ZSBtYWNoaW5lcyAqLwoJaXJpYXBfbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgU19ESVNDT05ORUNUKTsKCWlyaWFwX25leHRfY2FsbF9zdGF0ZShzZWxmLCBTX01BS0VfQ0FMTCk7CglpcmlhcF9uZXh0X3NlcnZlcl9zdGF0ZShzZWxmLCBSX0RJU0NPTk5FQ1QpOwoJaXJpYXBfbmV4dF9yX2Nvbm5lY3Rfc3RhdGUoc2VsZiwgUl9XQUlUSU5HKTsKCglyZXR1cm4gc2VsZjsKfQpFWFBPUlRfU1lNQk9MKGlyaWFwX29wZW4pOwoKLyoKICogRnVuY3Rpb24gX19pcmlhcF9jbG9zZSAoc2VsZikKICoKICogICAgUmVtb3ZlcyAoZGVhbGxvY2F0ZXMpIHRoZSBJcklBUCBpbnN0YW5jZQogKgogKi8Kc3RhdGljIHZvaWQgX19pcmlhcF9jbG9zZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYpCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CgoJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CgoJaWYgKHNlbGYtPnJlcXVlc3Rfc2tiKQoJCWRldl9rZnJlZV9za2Ioc2VsZi0+cmVxdWVzdF9za2IpOwoKCXNlbGYtPm1hZ2ljID0gMDsKCglrZnJlZShzZWxmKTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfY2xvc2UgKHZvaWQpCiAqCiAqICAgIENsb3NlcyBJcklBUCBhbmQgZGVyZWdpc3RlcnMgd2l0aCBJckxNUAogKi8Kdm9pZCBpcmlhcF9jbG9zZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYpCnsKCXN0cnVjdCBpcmlhcF9jYiAqZW50cnk7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKCglpZiAoc2VsZi0+bHNhcCkgewoJCWlybG1wX2Nsb3NlX2xzYXAoc2VsZi0+bHNhcCk7CgkJc2VsZi0+bHNhcCA9IE5VTEw7Cgl9CgoJZW50cnkgPSAoc3RydWN0IGlyaWFwX2NiICopIGhhc2hiaW5fcmVtb3ZlKGlyaWFwLCAobG9uZykgc2VsZiwgTlVMTCk7CglJUkRBX0FTU0VSVChlbnRyeSA9PSBzZWxmLCByZXR1cm47KTsKCglfX2lyaWFwX2Nsb3NlKHNlbGYpOwp9CkVYUE9SVF9TWU1CT0woaXJpYXBfY2xvc2UpOwoKc3RhdGljIGludCBpcmlhcF9yZWdpc3Rlcl9sc2FwKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgX191OCBzbHNhcF9zZWwsIGludCBtb2RlKQp7Cglub3RpZnlfdCBub3RpZnk7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglpcmRhX25vdGlmeV9pbml0KCZub3RpZnkpOwoJbm90aWZ5LmNvbm5lY3RfY29uZmlybSAgICAgICA9IGlyaWFwX2Nvbm5lY3RfY29uZmlybTsKCW5vdGlmeS5jb25uZWN0X2luZGljYXRpb24gICAgPSBpcmlhcF9jb25uZWN0X2luZGljYXRpb247Cglub3RpZnkuZGlzY29ubmVjdF9pbmRpY2F0aW9uID0gaXJpYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uOwoJbm90aWZ5LmRhdGFfaW5kaWNhdGlvbiAgICAgICA9IGlyaWFwX2RhdGFfaW5kaWNhdGlvbjsKCW5vdGlmeS5pbnN0YW5jZSA9IHNlbGY7CglpZiAobW9kZSA9PSBJQVNfQ0xJRU5UKQoJCXN0cmNweShub3RpZnkubmFtZSwgIklySUFTIGNsaSIpOwoJZWxzZQoJCXN0cmNweShub3RpZnkubmFtZSwgIklySUFTIHNydiIpOwoKCXNlbGYtPmxzYXAgPSBpcmxtcF9vcGVuX2xzYXAoc2xzYXBfc2VsLCAmbm90aWZ5LCAwKTsKCWlmIChzZWxmLT5sc2FwID09IE5VTEwpIHsKCQlJUkRBX0VSUk9SKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlZCBMU0FQIVxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gLTE7Cgl9CglzZWxmLT5zbHNhcF9zZWwgPSBzZWxmLT5sc2FwLT5zbHNhcF9zZWw7CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbiAoaGFuZGxlLCByZWFzb24pCiAqCiAqICAgIEdvdCBkaXNjb25uZWN0LCBzbyBjbGVhbiB1cCBldmVyeXRoaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbm5lY3Rpb24KICoKICovCnN0YXRpYyB2b2lkIGlyaWFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJCUxNX1JFQVNPTiByZWFzb24sCgkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IGlyaWFwX2NiICpzZWxmOwoKCUlSREFfREVCVUcoNCwgIiVzKCksIHJlYXNvbj0lc1xuIiwgX19GVU5DVElPTl9fLCBpcmxtcF9yZWFzb25zW3JlYXNvbl0pOwoKCXNlbGYgPSAoc3RydWN0IGlyaWFwX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoKCUlSREFfQVNTRVJUKGlyaWFwICE9IE5VTEwsIHJldHVybjspOwoKCWRlbF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOwoKCS8qIE5vdCBuZWVkZWQgKi8KCWlmIChza2IpCgkJZGV2X2tmcmVlX3NrYihza2IpOwoKCWlmIChzZWxmLT5tb2RlID09IElBU19DTElFTlQpIHsKCQlJUkRBX0RFQlVHKDQsICIlcygpLCBkaXNjb25uZWN0IGFzIGNsaWVudFxuIiwgX19GVU5DVElPTl9fKTsKCgoJCWlyaWFwX2RvX2NsaWVudF9ldmVudChzZWxmLCBJQVBfTE1fRElTQ09OTkVDVF9JTkRJQ0FUSU9OLAoJCQkJICAgICAgTlVMTCk7CgkJLyoKCQkgKiBJbmZvcm0gc2VydmljZSB1c2VyIHRoYXQgdGhlIHJlcXVlc3QgZmFpbGVkIGJ5IHNlbmRpbmcKCQkgKiBpdCBhIE5VTEwgdmFsdWUuIFdhcm5pbmcsIHRoZSBjbGllbnQgbWlnaHQgY2xvc2UgdXMsIHNvCgkJICogcmVtZW1iZXIgbm8gdG8gdXNlIHNlbGYgYW55bW9yZSBhZnRlciBjYWxsaW5nIGNvbmZpcm0KCQkgKi8KCQlpZiAoc2VsZi0+Y29uZmlybSkKCQkJc2VsZi0+Y29uZmlybShJQVNfRElTQ09OTkVDVCwgMCwgTlVMTCwgc2VsZi0+cHJpdik7Cgl9IGVsc2UgewoJCUlSREFfREVCVUcoNCwgIiVzKCksIGRpc2Nvbm5lY3QgYXMgc2VydmVyXG4iLCBfX0ZVTkNUSU9OX18pOwoJCWlyaWFwX2RvX3NlcnZlcl9ldmVudChzZWxmLCBJQVBfTE1fRElTQ09OTkVDVF9JTkRJQ0FUSU9OLAoJCQkJICAgICAgTlVMTCk7CgkJaXJpYXBfY2xvc2Uoc2VsZik7Cgl9Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFwX2Rpc2Nvbm5lY3RfcmVxdWVzdCAoaGFuZGxlKQogKi8Kc3RhdGljIHZvaWQgaXJpYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCBpcmlhcF9jYiAqc2VsZikKewoJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoKCXR4X3NrYiA9IGFsbG9jX3NrYihMTVBfTUFYX0hFQURFUiwgR0ZQX0FUT01JQyk7CglpZiAodHhfc2tiID09IE5VTEwpIHsKCQlJUkRBX0RFQlVHKDAsCgkJCSAgICIlcygpLCBDb3VsZCBub3QgYWxsb2NhdGUgYW4gc2tfYnVmZiBvZiBsZW5ndGggJWRcbiIsCgkJCSAgIF9fRlVOQ1RJT05fXywgTE1QX01BWF9IRUFERVIpOwoJCXJldHVybjsKCX0KCgkvKgoJICogIFJlc2VydmUgc3BhY2UgZm9yIE1VWCBjb250cm9sIGFuZCBMQVAgaGVhZGVyCgkgKi8KCXNrYl9yZXNlcnZlKHR4X3NrYiwgTE1QX01BWF9IRUFERVIpOwoKCWlybG1wX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5sc2FwLCB0eF9za2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3MgKGFkZHIsIG5hbWUsIGF0dHIpCiAqCiAqICAgIFJldHJpZXZlIGFsbCB2YWx1ZXMgZnJvbSBhdHRyaWJ1dGUgaW4gYWxsIG9iamVjdHMgd2l0aCBnaXZlbiBjbGFzcwogKiAgICBuYW1lCiAqLwppbnQgaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3JlcXVlc3Qoc3RydWN0IGlyaWFwX2NiICpzZWxmLAoJCQkJICBfX3UzMiBzYWRkciwgX191MzIgZGFkZHIsCgkJCQkgIGNoYXIgKm5hbWUsIGNoYXIgKmF0dHIpCnsKCXN0cnVjdCBza19idWZmICp0eF9za2I7CglpbnQgbmFtZV9sZW4sIGF0dHJfbGVuLCBza2JfbGVuOwoJX191OCAqZnJhbWU7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuIC0xOyk7CgoJLyogQ2xpZW50IG11c3Qgc3VwcGx5IHRoZSBkZXN0aW5hdGlvbiBkZXZpY2UgYWRkcmVzcyAqLwoJaWYgKCFkYWRkcikKCQlyZXR1cm4gLTE7CgoJc2VsZi0+ZGFkZHIgPSBkYWRkcjsKCXNlbGYtPnNhZGRyID0gc2FkZHI7CgoJLyoKCSAqICBTYXZlIG9wZXJhdGlvbiwgc28gd2Uga25vdyB3aGF0IHRoZSBsYXRlciBpbmRpY2F0aW9uIGlzIGFib3V0CgkgKi8KCXNlbGYtPm9wZXJhdGlvbiA9IEdFVF9WQUxVRV9CWV9DTEFTUzsKCgkvKiBHaXZlIG91cnNlbHZlcyAxMCBzZWNzIHRvIGZpbmlzaCB0aGlzIG9wZXJhdGlvbiAqLwoJaXJpYXBfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc2VsZiwgMTAqSFopOwoKCW5hbWVfbGVuID0gc3RybGVuKG5hbWUpOwkvKiBVcCB0byBJQVNfTUFYX0NMQVNTTkFNRSA9IDYwICovCglhdHRyX2xlbiA9IHN0cmxlbihhdHRyKTsJLyogVXAgdG8gSUFTX01BWF9BVFRSSUJOQU1FID0gNjAgKi8KCglza2JfbGVuID0gc2VsZi0+bWF4X2hlYWRlcl9zaXplKzIrbmFtZV9sZW4rMSthdHRyX2xlbis0OwoJdHhfc2tiID0gYWxsb2Nfc2tiKHNrYl9sZW4sIEdGUF9BVE9NSUMpOwoJaWYgKCF0eF9za2IpCgkJcmV0dXJuIC1FTk9NRU07CgoJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYIGFuZCBMQVAgaGVhZGVyICovCglza2JfcmVzZXJ2ZSh0eF9za2IsIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSk7Cglza2JfcHV0KHR4X3NrYiwgMytuYW1lX2xlbithdHRyX2xlbik7CglmcmFtZSA9IHR4X3NrYi0+ZGF0YTsKCgkvKiBCdWlsZCBmcmFtZSAqLwoJZnJhbWVbMF0gPSBJQVBfTFNUIHwgR0VUX1ZBTFVFX0JZX0NMQVNTOwoJZnJhbWVbMV0gPSBuYW1lX2xlbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc2VydCBsZW5ndGggb2YgbmFtZSAqLwoJbWVtY3B5KGZyYW1lKzIsIG5hbWUsIG5hbWVfbGVuKTsgICAgICAgICAgIC8qIEluc2VydCBuYW1lICovCglmcmFtZVsyK25hbWVfbGVuXSA9IGF0dHJfbGVuOyAgICAgICAgICAgICAgLyogSW5zZXJ0IGxlbmd0aCBvZiBhdHRyICovCgltZW1jcHkoZnJhbWUrMytuYW1lX2xlbiwgYXR0ciwgYXR0cl9sZW4pOyAgLyogSW5zZXJ0IGF0dHIgKi8KCglpcmlhcF9kb19jbGllbnRfZXZlbnQoc2VsZiwgSUFQX0NBTExfUkVRVUVTVF9HVkJDLCB0eF9za2IpOwoKCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIHN0YXRlX3NfZGlzY29ubmVjdCgpLiAqLwoJZGV2X2tmcmVlX3NrYih0eF9za2IpOwoKCXJldHVybiAwOwp9CkVYUE9SVF9TWU1CT0woaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3JlcXVlc3QpOwoKLyoKICogRnVuY3Rpb24gaXJpYXBfZ2V0dmFsdWVieWNsYXNzX2NvbmZpcm0gKHNlbGYsIHNrYikKICoKICogICAgR290IHJlc3VsdCBmcm9tIEdldFZhbHVlQnlDbGFzcyBjb21tYW5kLiBQYXJzZSBpdCBhbmQgcmV0dXJuIHJlc3VsdAogKiAgICB0byBzZXJ2aWNlIHVzZXIuCiAqCiAqLwpzdGF0aWMgdm9pZCBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfY29uZmlybShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsCgkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZTsKCWludCBjaGFyc2V0OwoJX191MzIgdmFsdWVfbGVuOwoJX191MzIgdG1wX2NwdTMyOwoJX191MTYgb2JqX2lkOwoJX191MTYgbGVuOwoJX191OCAgdHlwZTsKCV9fdTggKmZwOwoJaW50IG47CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CgoJLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KCWZwID0gc2tiLT5kYXRhOwoJbiA9IDI7CgoJLyogR2V0IGxlbmd0aCwgTVNCIGZpcnN0ICovCglsZW4gPSBiZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX3UxNiAqKShmcCtuKSkpOyBuICs9IDI7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKSwgbGVuPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGxlbik7CgoJLyogR2V0IG9iamVjdCBJRCwgTVNCIGZpcnN0ICovCglvYmpfaWQgPSBiZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX3UxNiAqKShmcCtuKSkpOyBuICs9IDI7CgoJdHlwZSA9IGZwW24rK107CglJUkRBX0RFQlVHKDQsICIlcygpLCBWYWx1ZSB0eXBlID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgdHlwZSk7CgoJc3dpdGNoICh0eXBlKSB7CgljYXNlIElBU19JTlRFR0VSOgoJCW1lbWNweSgmdG1wX2NwdTMyLCBmcCtuLCA0KTsgbiArPSA0OwoJCWJlMzJfdG9fY3B1cygmdG1wX2NwdTMyKTsKCQl2YWx1ZSA9IGlyaWFzX25ld19pbnRlZ2VyX3ZhbHVlKHRtcF9jcHUzMik7CgoJCS8qICBMZWdhbCB2YWx1ZXMgcmVzdHJpY3RlZCB0byAweDAxLTB4NmYsIHBhZ2UgMTUgaXJ0dHAgKi8KCQlJUkRBX0RFQlVHKDQsICIlcygpLCBsc2FwPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHZhbHVlLT50LmludGVnZXIpOwoJCWJyZWFrOwoJY2FzZSBJQVNfU1RSSU5HOgoJCWNoYXJzZXQgPSBmcFtuKytdOwoKCQlzd2l0Y2ggKGNoYXJzZXQpIHsKCQljYXNlIENTX0FTQ0lJOgoJCQlicmVhazsKLyoJCWNhc2UgQ1NfSVNPXzg4NTlfMTogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfMjogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfMzogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfNDogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfNTogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfNjogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfNzogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfODogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfOTogKi8KLyoJCWNhc2UgQ1NfVU5JQ09ERTogKi8KCQlkZWZhdWx0OgoJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBjaGFyc2V0ICVzLCBub3Qgc3VwcG9ydGVkXG4iLAoJCQkJICAgX19GVU5DVElPTl9fLCBpYXNfY2hhcnNldF90eXBlc1tjaGFyc2V0XSk7CgoJCQkvKiBBYm9ydGluZywgY2xvc2UgY29ubmVjdGlvbiEgKi8KCQkJaXJpYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYpOwoJCQlyZXR1cm47CgkJCS8qIGJyZWFrOyAqLwoJCX0KCQl2YWx1ZV9sZW4gPSBmcFtuKytdOwoJCUlSREFfREVCVUcoNCwgIiVzKCksIHN0cmxlbj0lZFxuIiwgX19GVU5DVElPTl9fLCB2YWx1ZV9sZW4pOwoKCQkvKiBNYWtlIHN1cmUgdGhlIHN0cmluZyBpcyBudWxsLXRlcm1pbmF0ZWQgKi8KCQlmcFtuK3ZhbHVlX2xlbl0gPSAweDAwOwoJCUlSREFfREVCVUcoNCwgIkdvdCBzdHJpbmcgJXNcbiIsIGZwK24pOwoKCQkvKiBXaWxsIHRydW5jYXRlIHRvIElBU19NQVhfU1RSSU5HIGJ5dGVzICovCgkJdmFsdWUgPSBpcmlhc19uZXdfc3RyaW5nX3ZhbHVlKGZwK24pOwoJCWJyZWFrOwoJY2FzZSBJQVNfT0NUX1NFUToKCQl2YWx1ZV9sZW4gPSBiZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX3UxNiAqKShmcCtuKSkpOwoJCW4gKz0gMjsKCgkJLyogV2lsbCB0cnVuY2F0ZSB0byBJQVNfTUFYX09DVEVUX1NUUklORyBieXRlcyAqLwoJCXZhbHVlID0gaXJpYXNfbmV3X29jdHNlcV92YWx1ZShmcCtuLCB2YWx1ZV9sZW4pOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQl2YWx1ZSA9IGlyaWFzX25ld19taXNzaW5nX3ZhbHVlKCk7CgkJYnJlYWs7Cgl9CgoJLyogRmluaXNoZWQsIGNsb3NlIGNvbm5lY3Rpb24hICovCglpcmlhcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZik7CgoJLyogV2FybmluZywgdGhlIGNsaWVudCBtaWdodCBjbG9zZSB1cywgc28gcmVtZW1iZXIgbm8gdG8gdXNlIHNlbGYKCSAqIGFueW1vcmUgYWZ0ZXIgY2FsbGluZyBjb25maXJtCgkgKi8KCWlmIChzZWxmLT5jb25maXJtKQoJCXNlbGYtPmNvbmZpcm0oSUFTX1NVQ0NFU1MsIG9ial9pZCwgdmFsdWUsIHNlbGYtPnByaXYpOwoJZWxzZSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgbWlzc2luZyBoYW5kbGVyIVxuIiwgX19GVU5DVElPTl9fKTsKCQlpcmlhc19kZWxldGVfdmFsdWUodmFsdWUpOwoJfQp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVzcG9uc2UgKCkKICoKICogICAgU2VuZCBhbnN3ZXIgYmFjayB0byByZW1vdGUgTE0tSUFTCiAqCiAqLwpzdGF0aWMgdm9pZCBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVzcG9uc2Uoc3RydWN0IGlyaWFwX2NiICpzZWxmLAoJCQkJCSAgIF9fdTE2IG9ial9pZCwKCQkJCQkgICBfX3U4IHJldF9jb2RlLAoJCQkJCSAgIHN0cnVjdCBpYXNfdmFsdWUgKnZhbHVlKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOwoJaW50IG47CglfX3UzMiB0bXBfYmUzMjsKCV9fYmUxNiB0bXBfYmUxNjsKCV9fdTggKmZwOwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CglJUkRBX0FTU0VSVCh2YWx1ZSAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHZhbHVlLT5sZW4gPD0gMTAyNCwgcmV0dXJuOyk7CgoJLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KCW4gPSAwOwoKCS8qCgkgKiAgV2UgbXVzdCBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIHJlc3BvbnNlIGFmdGVyIHRoZSBsZW5ndGggb2YgdGhlCgkgKiAgdmFsdWUuIFdlIGFkZCAzMiBieXRlcyBiZWNhdXNlIG9mIHRoZSA2IGJ5dGVzIGZvciB0aGUgZnJhbWUgYW5kCgkgKiAgbWF4IDUgYnl0ZXMgZm9yIHRoZSB2YWx1ZSBjb2RpbmcuCgkgKi8KCXR4X3NrYiA9IGFsbG9jX3NrYih2YWx1ZS0+bGVuICsgc2VsZi0+bWF4X2hlYWRlcl9zaXplICsgMzIsCgkJCSAgIEdGUF9BVE9NSUMpOwoJaWYgKCF0eF9za2IpCgkJcmV0dXJuOwoKCS8qIFJlc2VydmUgc3BhY2UgZm9yIE1VWCBhbmQgTEFQIGhlYWRlciAqLwoJc2tiX3Jlc2VydmUodHhfc2tiLCBzZWxmLT5tYXhfaGVhZGVyX3NpemUpOwoJc2tiX3B1dCh0eF9za2IsIDYpOwoKCWZwID0gdHhfc2tiLT5kYXRhOwoKCS8qIEJ1aWxkIGZyYW1lICovCglmcFtuKytdID0gR0VUX1ZBTFVFX0JZX0NMQVNTIHwgSUFQX0xTVDsKCWZwW24rK10gPSByZXRfY29kZTsKCgkvKiBJbnNlcnQgbGlzdCBsZW5ndGggKE1TQiBmaXJzdCkgKi8KCXRtcF9iZTE2ID0gX19jb25zdGFudF9odG9ucygweDAwMDEpOwoJbWVtY3B5KGZwK24sICZ0bXBfYmUxNiwgMik7ICBuICs9IDI7CgoJLyogSW5zZXJ0IG9iamVjdCBpZGVudGlmaWVyICggTVNCIGZpcnN0KSAqLwoJdG1wX2JlMTYgPSBjcHVfdG9fYmUxNihvYmpfaWQpOwoJbWVtY3B5KGZwK24sICZ0bXBfYmUxNiwgMik7IG4gKz0gMjsKCglzd2l0Y2ggKHZhbHVlLT50eXBlKSB7CgljYXNlIElBU19TVFJJTkc6CgkJc2tiX3B1dCh0eF9za2IsIDMgKyB2YWx1ZS0+bGVuKTsKCQlmcFtuKytdID0gdmFsdWUtPnR5cGU7CgkJZnBbbisrXSA9IDA7IC8qIEFTQ0lJICovCgkJZnBbbisrXSA9IChfX3U4KSB2YWx1ZS0+bGVuOwoJCW1lbWNweShmcCtuLCB2YWx1ZS0+dC5zdHJpbmcsIHZhbHVlLT5sZW4pOyBuKz12YWx1ZS0+bGVuOwoJCWJyZWFrOwoJY2FzZSBJQVNfSU5URUdFUjoKCQlza2JfcHV0KHR4X3NrYiwgNSk7CgkJZnBbbisrXSA9IHZhbHVlLT50eXBlOwoKCQl0bXBfYmUzMiA9IGNwdV90b19iZTMyKHZhbHVlLT50LmludGVnZXIpOwoJCW1lbWNweShmcCtuLCAmdG1wX2JlMzIsIDQpOyBuICs9IDQ7CgkJYnJlYWs7CgljYXNlIElBU19PQ1RfU0VROgoJCXNrYl9wdXQodHhfc2tiLCAzICsgdmFsdWUtPmxlbik7CgkJZnBbbisrXSA9IHZhbHVlLT50eXBlOwoKCQl0bXBfYmUxNiA9IGNwdV90b19iZTE2KHZhbHVlLT5sZW4pOwoJCW1lbWNweShmcCtuLCAmdG1wX2JlMTYsIDIpOyBuICs9IDI7CgkJbWVtY3B5KGZwK24sIHZhbHVlLT50Lm9jdF9zZXEsIHZhbHVlLT5sZW4pOyBuKz12YWx1ZS0+bGVuOwoJCWJyZWFrOwoJY2FzZSBJQVNfTUlTU0lORzoKCQlJUkRBX0RFQlVHKCAzLCAiJXM6IHNlbmRpbmcgSUFTX01JU1NJTkdcbiIsIF9fRlVOQ1RJT05fXyk7CgkJc2tiX3B1dCh0eF9za2IsIDEpOwoJCWZwW24rK10gPSB2YWx1ZS0+dHlwZTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdHlwZSBub3QgaW1wbGVtZW50ZWQhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCWJyZWFrOwoJfQoJaXJpYXBfZG9fcl9jb25uZWN0X2V2ZW50KHNlbGYsIElBUF9DQUxMX1JFU1BPTlNFLCB0eF9za2IpOwoKCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIHN0YXRlX3JfZXhlY3V0ZSgpLiAqLwoJZGV2X2tmcmVlX3NrYih0eF9za2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfaW5kaWNhdGlvbiAoc2VsZiwgc2tiKQogKgogKiAgICBnZXR2YWx1ZWJ5Y2xhc3MgaXMgcmVxdWVzdGVkIGZyb20gcGVlciBMTS1JQVMKICoKICovCnN0YXRpYyB2b2lkIGlyaWFwX2dldHZhbHVlYnljbGFzc19pbmRpY2F0aW9uKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwKCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CglzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOwoJaW50IG5hbWVfbGVuOwoJaW50IGF0dHJfbGVuOwoJY2hhciBuYW1lW0lBU19NQVhfQ0xBU1NOQU1FICsgMV07CS8qIDYwIGJ5dGVzICovCgljaGFyIGF0dHJbSUFTX01BWF9BVFRSSUJOQU1FICsgMV07CS8qIDYwIGJ5dGVzICovCglfX3U4ICpmcDsKCWludCBuOwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CgoJZnAgPSBza2ItPmRhdGE7CgluID0gMTsKCgluYW1lX2xlbiA9IGZwW24rK107CgltZW1jcHkobmFtZSwgZnArbiwgbmFtZV9sZW4pOyBuKz1uYW1lX2xlbjsKCW5hbWVbbmFtZV9sZW5dID0gJ1wwJzsKCglhdHRyX2xlbiA9IGZwW24rK107CgltZW1jcHkoYXR0ciwgZnArbiwgYXR0cl9sZW4pOyBuKz1hdHRyX2xlbjsKCWF0dHJbYXR0cl9sZW5dID0gJ1wwJzsKCglJUkRBX0RFQlVHKDQsICJMTS1JQVM6IExvb2tpbmcgdXAgJXM6ICVzXG4iLCBuYW1lLCBhdHRyKTsKCW9iaiA9IGlyaWFzX2ZpbmRfb2JqZWN0KG5hbWUpOwoKCWlmIChvYmogPT0gTlVMTCkgewoJCUlSREFfREVCVUcoMiwgIkxNLUlBUzogT2JqZWN0ICVzIG5vdCBmb3VuZFxuIiwgbmFtZSk7CgkJaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3Jlc3BvbnNlKHNlbGYsIDB4MTIzNSwgSUFTX0NMQVNTX1VOS05PV04sCgkJCQkJICAgICAgICZpcmlhc19taXNzaW5nKTsKCQlyZXR1cm47Cgl9CglJUkRBX0RFQlVHKDQsICJMTS1JQVM6IGZvdW5kICVzLCBpZD0lZFxuIiwgb2JqLT5uYW1lLCBvYmotPmlkKTsKCglhdHRyaWIgPSBpcmlhc19maW5kX2F0dHJpYihvYmosIGF0dHIpOwoJaWYgKGF0dHJpYiA9PSBOVUxMKSB7CgkJSVJEQV9ERUJVRygyLCAiTE0tSUFTOiBBdHRyaWJ1dGUgJXMgbm90IGZvdW5kXG4iLCBhdHRyKTsKCQlpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVzcG9uc2Uoc2VsZiwgb2JqLT5pZCwKCQkJCQkgICAgICAgSUFTX0FUVFJJQl9VTktOT1dOLCAKCQkJCQkgICAgICAgJmlyaWFzX21pc3NpbmcpOwoJCXJldHVybjsKCX0KCgkvKiBXZSBoYXZlIGEgbWF0Y2g7IHNlbmQgdGhlIHZhbHVlLiAgKi8KCWlyaWFwX2dldHZhbHVlYnljbGFzc19yZXNwb25zZShzZWxmLCBvYmotPmlkLCBJQVNfU1VDQ0VTUywKCQkJCSAgICAgICBhdHRyaWItPnZhbHVlKTsKCglyZXR1cm47Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFwX3NlbmRfYWNrICh2b2lkKQogKgogKiAgICBDdXJyZW50bHkgbm90IHVzZWQKICoKICovCnZvaWQgaXJpYXBfc2VuZF9hY2soc3RydWN0IGlyaWFwX2NiICpzZWxmKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOwoJX191OCAqZnJhbWU7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKCgl0eF9za2IgPSBhbGxvY19za2IoTE1QX01BWF9IRUFERVIgKyAxLCBHRlBfQVRPTUlDKTsKCWlmICghdHhfc2tiKQoJCXJldHVybjsKCgkvKiBSZXNlcnZlIHNwYWNlIGZvciBNVVggYW5kIExBUCBoZWFkZXIgKi8KCXNrYl9yZXNlcnZlKHR4X3NrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKCXNrYl9wdXQodHhfc2tiLCAxKTsKCWZyYW1lID0gdHhfc2tiLT5kYXRhOwoKCS8qIEJ1aWxkIGZyYW1lICovCglmcmFtZVswXSA9IElBUF9MU1QgfCBJQVBfQUNLIHwgc2VsZi0+b3BlcmF0aW9uOwoKCWlybG1wX2RhdGFfcmVxdWVzdChzZWxmLT5sc2FwLCB0eF9za2IpOwp9Cgp2b2lkIGlyaWFwX2Nvbm5lY3RfcmVxdWVzdChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYpCnsKCWludCByZXQ7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CgoJcmV0ID0gaXJsbXBfY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmxzYXAsIExTQVBfSUFTLAoJCQkJICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwKCQkJCSAgICBOVUxMLCBOVUxMKTsKCWlmIChyZXQgPCAwKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgY29ubmVjdCBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXNlbGYtPmNvbmZpcm0oSUFTX0RJU0NPTk5FQ1QsIDAsIE5VTEwsIHNlbGYtPnByaXYpOwoJfQp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9jb25uZWN0X2NvbmZpcm0gKGhhbmRsZSwgc2tiKQogKgogKiAgICBMU0FQIGNvbm5lY3Rpb24gY29uZmlybWVkIQogKgogKi8Kc3RhdGljIHZvaWQgaXJpYXBfY29ubmVjdF9jb25maXJtKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCgkJCQkgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLCBfX3UzMiBtYXhfc2VnX3NpemUsCgkJCQkgIF9fdTggbWF4X2hlYWRlcl9zaXplLAoJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglzdHJ1Y3QgaXJpYXBfY2IgKnNlbGY7CgoJc2VsZiA9IChzdHJ1Y3QgaXJpYXBfY2IgKikgaW5zdGFuY2U7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CgoJc2VsZi0+bWF4X2RhdGFfc2l6ZSA9IG1heF9zZWdfc2l6ZTsKCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZTsKCglkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKCglpcmlhcF9kb19jbGllbnRfZXZlbnQoc2VsZiwgSUFQX0xNX0NPTk5FQ1RfQ09ORklSTSwgc2tiKTsKCgkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudCAtIHNlZSBzdGF0ZV9zX21ha2VfY2FsbCgpLiAqLwoJZGV2X2tmcmVlX3NrYihza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9jb25uZWN0X2luZGljYXRpb24gKCBoYW5kbGUsIHNrYikKICoKICogICAgUmVtb3RlIExNLUlBUyBpcyByZXF1ZXN0aW5nIGNvbm5lY3Rpb24KICoKICovCnN0YXRpYyB2b2lkIGlyaWFwX2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJICAgICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgX191MzIgbWF4X3NlZ19zaXplLAoJCQkJICAgICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IGlyaWFwX2NiICpzZWxmLCAqbmV3OwoKCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJc2VsZiA9IChzdHJ1Y3QgaXJpYXBfY2IgKikgaW5zdGFuY2U7CgoJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCBnb3RvIG91dDspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCBnb3RvIG91dDspOwoKCS8qIFN0YXJ0IG5ldyBzZXJ2ZXIgKi8KCW5ldyA9IGlyaWFwX29wZW4oTFNBUF9JQVMsIElBU19TRVJWRVIsIE5VTEwsIE5VTEwpOwoJaWYgKCFuZXcpIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBvcGVuIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKCQlnb3RvIG91dDsKCX0KCgkvKiBOb3cgYXR0YWNoIHVwIHRoZSBuZXcgInNvY2tldCIgKi8KCW5ldy0+bHNhcCA9IGlybG1wX2R1cChzZWxmLT5sc2FwLCBuZXcpOwoJaWYgKCFuZXctPmxzYXApIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBkdXAgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKCQlnb3RvIG91dDsKCX0KCgluZXctPm1heF9kYXRhX3NpemUgPSBtYXhfc2VnX3NpemU7CgluZXctPm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZTsKCgkvKiBDbGVhbiB1cCB0aGUgb3JpZ2luYWwgb25lIHRvIGtlZXAgaXQgaW4gbGlzdGVuIHN0YXRlICovCglpcmxtcF9saXN0ZW4oc2VsZi0+bHNhcCk7CgoJaXJpYXBfZG9fc2VydmVyX2V2ZW50KG5ldywgSUFQX0xNX0NPTk5FQ1RfSU5ESUNBVElPTiwgc2tiKTsKCm91dDoKCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIHN0YXRlX3JfZGlzY29ubmVjdCgpLiAqLwoJZGV2X2tmcmVlX3NrYihza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9kYXRhX2luZGljYXRpb24gKGhhbmRsZSwgc2tiKQogKgogKiAgICBSZWNlaXZlcyBkYXRhIGZyb20gY29ubmVjdGlvbiBpZGVudGlmaWVkIGJ5IGhhbmRsZSBmcm9tIElyTE1QCiAqCiAqLwpzdGF0aWMgaW50IGlyaWFwX2RhdGFfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBpcmlhcF9jYiAqc2VsZjsKCV9fdTggICpmcmFtZTsKCV9fdTggIG9wY29kZTsKCglJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCXNlbGYgPSAoc3RydWN0IGlyaWFwX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm4gMDspOwoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCBnb3RvIG91dDspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCBnb3RvIG91dDspOwoKCWZyYW1lID0gc2tiLT5kYXRhOwoKCWlmIChzZWxmLT5tb2RlID09IElBU19TRVJWRVIpIHsKCQkvKiBDYWxsIHNlcnZlciAqLwoJCUlSREFfREVCVUcoNCwgIiVzKCksIENhbGxpbmcgc2VydmVyIVxuIiwgX19GVU5DVElPTl9fKTsKCQlpcmlhcF9kb19yX2Nvbm5lY3RfZXZlbnQoc2VsZiwgSUFQX1JFQ1ZfRl9MU1QsIHNrYik7CgkJZ290byBvdXQ7Cgl9CglvcGNvZGUgPSBmcmFtZVswXTsKCWlmICh+b3Bjb2RlICYgSUFQX0xTVCkgewoJCUlSREFfV0FSTklORygiJXM6LCBJcklBUyBtdWx0aWZyYW1lIGNvbW1hbmRzIG9yICIKCQkJICAgICAicmVzdWx0cyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0IVxuIiwKCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCWdvdG8gb3V0OwoJfQoKCS8qIENoZWNrIGZvciBhY2sgZnJhbWVzIHNpbmNlIHRoZXkgZG9uJ3QgY29udGFpbiBhbnkgZGF0YSAqLwoJaWYgKG9wY29kZSAmIElBUF9BQ0spIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpIEdvdCBhY2sgZnJhbWUhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCWdvdG8gb3V0OwoJfQoKCW9wY29kZSAmPSB+SUFQX0xTVDsgLyogTWFzayBhd2F5IExTVCBiaXQgKi8KCglzd2l0Y2ggKG9wY29kZSkgewoJY2FzZSBHRVRfSU5GT19CQVNFOgoJCUlSREFfREVCVUcoMCwgIklyTE1QIEdldEluZm9CYXNlRGV0YWlscyBub3QgaW1wbGVtZW50ZWQhXG4iKTsKCQlicmVhazsKCWNhc2UgR0VUX1ZBTFVFX0JZX0NMQVNTOgoJCWlyaWFwX2RvX2NhbGxfZXZlbnQoc2VsZiwgSUFQX1JFQ1ZfRl9MU1QsIE5VTEwpOwoKCQlzd2l0Y2ggKGZyYW1lWzFdKSB7CgkJY2FzZSBJQVNfU1VDQ0VTUzoKCQkJaXJpYXBfZ2V0dmFsdWVieWNsYXNzX2NvbmZpcm0oc2VsZiwgc2tiKTsKCQkJYnJlYWs7CgkJY2FzZSBJQVNfQ0xBU1NfVU5LTk9XTjoKCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgTm8gc3VjaCBjbGFzcyFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJCS8qIEZpbmlzaGVkLCBjbG9zZSBjb25uZWN0aW9uISAqLwoJCQlpcmlhcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZik7CgoJCQkvKgoJCQkgKiBXYXJuaW5nLCB0aGUgY2xpZW50IG1pZ2h0IGNsb3NlIHVzLCBzbyByZW1lbWJlcgoJCQkgKiBubyB0byB1c2Ugc2VsZiBhbnltb3JlIGFmdGVyIGNhbGxpbmcgY29uZmlybQoJCQkgKi8KCQkJaWYgKHNlbGYtPmNvbmZpcm0pCgkJCQlzZWxmLT5jb25maXJtKElBU19DTEFTU19VTktOT1dOLCAwLCBOVUxMLAoJCQkJCSAgICAgIHNlbGYtPnByaXYpOwoJCQlicmVhazsKCQljYXNlIElBU19BVFRSSUJfVU5LTk9XTjoKCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgTm8gc3VjaCBhdHRyaWJ1dGUhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCQkvKiBGaW5pc2hlZCwgY2xvc2UgY29ubmVjdGlvbiEgKi8KCQkJaXJpYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYpOwoKCQkJLyoKCQkJICogV2FybmluZywgdGhlIGNsaWVudCBtaWdodCBjbG9zZSB1cywgc28gcmVtZW1iZXIKCQkJICogbm8gdG8gdXNlIHNlbGYgYW55bW9yZSBhZnRlciBjYWxsaW5nIGNvbmZpcm0KCQkJICovCgkJCWlmIChzZWxmLT5jb25maXJtKQoJCQkJc2VsZi0+Y29uZmlybShJQVNfQVRUUklCX1VOS05PV04sIDAsIE5VTEwsCgkJCQkJICAgICAgc2VsZi0+cHJpdik7CgkJCWJyZWFrOwoJCX0KCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBvcC1jb2RlOiAlMDJ4XG4iLCBfX0ZVTkNUSU9OX18sCgkJCSAgIG9wY29kZSk7CgkJYnJlYWs7Cgl9CgpvdXQ6CgkvKiBDbGVhbnVwIC0gc3ViLWNhbGxzIHdpbGwgaGF2ZSBkb25lIHNrYl9nZXQoKSBhcyBuZWVkZWQuICovCglkZXZfa2ZyZWVfc2tiKHNrYik7CglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfY2FsbF9pbmRpY2F0aW9uIChzZWxmLCBza2IpCiAqCiAqICAgIFJlY2VpdmVkIGNhbGwgdG8gc2VydmVyIGZyb20gcGVlciBMTS1JQVMKICoKICovCnZvaWQgaXJpYXBfY2FsbF9pbmRpY2F0aW9uKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJX191OCAqZnA7CglfX3U4IG9wY29kZTsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOwoKCWZwID0gc2tiLT5kYXRhOwoKCW9wY29kZSA9IGZwWzBdOwoJaWYgKH5vcGNvZGUgJiAweDgwKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogSXJJQVMgbXVsdGlmcmFtZSBjb21tYW5kcyBvciByZXN1bHRzIgoJCQkgICAgICJpcyBub3QgaW1wbGVtZW50ZWQgeWV0IVxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm47Cgl9CglvcGNvZGUgJj0gMHg3ZjsgLyogTWFzayBhd2F5IExTVCBiaXQgKi8KCglzd2l0Y2ggKG9wY29kZSkgewoJY2FzZSBHRVRfSU5GT19CQVNFOgoJCUlSREFfV0FSTklORygiJXM6IEdldEluZm9CYXNlRGV0YWlscyBub3QgaW1wbGVtZW50ZWQgeWV0IVxuIiwKCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCWJyZWFrOwoJY2FzZSBHRVRfVkFMVUVfQllfQ0xBU1M6CgkJaXJpYXBfZ2V0dmFsdWVieWNsYXNzX2luZGljYXRpb24oc2VsZiwgc2tiKTsKCQlicmVhazsKCX0KCS8qIHNrYiB3aWxsIGJlIGNsZWFuZWQgdXAgaW4gaXJpYXBfZGF0YV9pbmRpY2F0aW9uICovCn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFwX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQgKGRhdGEpCiAqCiAqICAgIFF1ZXJ5IGhhcyB0YWtlbiB0b28gbG9uZyB0aW1lLCBzbyBhYm9ydAogKgogKi8Kc3RhdGljIHZvaWQgaXJpYXBfd2F0Y2hkb2dfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQp7CglzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlyaWFwX2NiICopIGRhdGE7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CgoJLyogaXJpYXBfY2xvc2Uoc2VsZik7ICovCn0KCiNpZmRlZiBDT05GSUdfUFJPQ19GUwoKc3RhdGljIGNvbnN0IGNoYXIgKmlhc192YWx1ZV90eXBlc1tdID0gewoJIklBU19NSVNTSU5HIiwKCSJJQVNfSU5URUdFUiIsCgkiSUFTX09DVF9TRVEiLAoJIklBU19TVFJJTkciCn07CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBpYXNfb2JqZWN0ICppcmlhc19zZXFfaWR4KGxvZmZfdCBwb3MpIAp7CglzdHJ1Y3QgaWFzX29iamVjdCAqb2JqOwoKCWZvciAob2JqID0gKHN0cnVjdCBpYXNfb2JqZWN0ICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGlyaWFzX29iamVjdHMpOwoJICAgICBvYmo7IG9iaiA9IChzdHJ1Y3QgaWFzX29iamVjdCAqKSBoYXNoYmluX2dldF9uZXh0KGlyaWFzX29iamVjdHMpKSB7CgkJaWYgKHBvcy0tID09IDApCgkJCWJyZWFrOwoJfQoJCQoJcmV0dXJuIG9iajsKfQoKc3RhdGljIHZvaWQgKmlyaWFzX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCnsKCXNwaW5fbG9ja19pcnEoJmlyaWFzX29iamVjdHMtPmhiX3NwaW5sb2NrKTsKCglyZXR1cm4gKnBvcyA/IGlyaWFzX3NlcV9pZHgoKnBvcyAtIDEpIDogU0VRX1NUQVJUX1RPS0VOOwp9CgpzdGF0aWMgdm9pZCAqaXJpYXNfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQp7CgkrKypwb3M7CgoJcmV0dXJuICh2ID09IFNFUV9TVEFSVF9UT0tFTikgCgkJPyAodm9pZCAqKSBoYXNoYmluX2dldF9maXJzdChpcmlhc19vYmplY3RzKQoJCTogKHZvaWQgKikgaGFzaGJpbl9nZXRfbmV4dChpcmlhc19vYmplY3RzKTsKfQoKc3RhdGljIHZvaWQgaXJpYXNfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsKCXNwaW5fdW5sb2NrX2lycSgmaXJpYXNfb2JqZWN0cy0+aGJfc3BpbmxvY2spOwp9CgpzdGF0aWMgaW50IGlyaWFzX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQp7CglpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCgkJc2VxX3B1dHMoc2VxLCAiTE0tSUFTIE9iamVjdHM6XG4iKTsKCWVsc2UgewoJCXN0cnVjdCBpYXNfb2JqZWN0ICpvYmogPSB2OwoJCXN0cnVjdCBpYXNfYXR0cmliICphdHRyaWI7CgoJCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuIC1FSU5WQUw7KTsKCgkJc2VxX3ByaW50ZihzZXEsICJuYW1lOiAlcywgaWQ9JWRcbiIsCgkJCSAgIG9iai0+bmFtZSwgb2JqLT5pZCk7CgoJCS8qIENhcmVmdWwgZm9yIHByaW9yaXR5IGludmVyc2lvbnMgaGVyZSAhCgkJICogQWxsIG90aGVyIHVzZXMgb2YgYXR0cmliIHNwaW5sb2NrIGFyZSBpbmRlcGVuZGVudCBvZgoJCSAqIHRoZSBvYmplY3Qgc3BpbmxvY2ssIHNvIHdlIGFyZSBzYWZlLiBKZWFuIElJICovCgkJc3Bpbl9sb2NrKCZvYmotPmF0dHJpYnMtPmhiX3NwaW5sb2NrKTsKCgkJLyogTGlzdCBhbGwgYXR0cmlidXRlcyBmb3IgdGhpcyBvYmplY3QgKi8KCQlmb3IgKGF0dHJpYiA9IChzdHJ1Y3QgaWFzX2F0dHJpYiAqKSBoYXNoYmluX2dldF9maXJzdChvYmotPmF0dHJpYnMpOwoJCSAgICAgYXR0cmliICE9IE5VTEw7CgkJICAgICBhdHRyaWIgPSAoc3RydWN0IGlhc19hdHRyaWIgKikgaGFzaGJpbl9nZXRfbmV4dChvYmotPmF0dHJpYnMpKSB7CgkJICAgICAKCQkJSVJEQV9BU1NFUlQoYXR0cmliLT5tYWdpYyA9PSBJQVNfQVRUUklCX01BR0lDLAoJCQkJICAgIGdvdG8gb3V0bG9vcDsgKTsKCgkJCXNlcV9wcmludGYoc2VxLCAiIC0gQXR0cmlidXRlIG5hbWU6IFwiJXNcIiwgIiwKCQkJCSAgIGF0dHJpYi0+bmFtZSk7CgkJCXNlcV9wcmludGYoc2VxLCAidmFsdWVbJXNdOiAiLAoJCQkJICAgaWFzX3ZhbHVlX3R5cGVzW2F0dHJpYi0+dmFsdWUtPnR5cGVdKTsKCgkJCXN3aXRjaCAoYXR0cmliLT52YWx1ZS0+dHlwZSkgewoJCQljYXNlIElBU19JTlRFR0VSOgoJCQkJc2VxX3ByaW50ZihzZXEsICIlZFxuIiwKCQkJCQkgICBhdHRyaWItPnZhbHVlLT50LmludGVnZXIpOwoJCQkJYnJlYWs7CgkJCWNhc2UgSUFTX1NUUklORzoKCQkJCXNlcV9wcmludGYoc2VxLCAiXCIlc1wiXG4iLAoJCQkJCSAgIGF0dHJpYi0+dmFsdWUtPnQuc3RyaW5nKTsKCQkJCWJyZWFrOwoJCQljYXNlIElBU19PQ1RfU0VROgoJCQkJc2VxX3ByaW50ZihzZXEsICJvY3RldCBzZXF1ZW5jZSAoJWQgYnl0ZXMpXG4iLCAKCQkJCQkgICBhdHRyaWItPnZhbHVlLT5sZW4pOwoJCQkJYnJlYWs7CgkJCWNhc2UgSUFTX01JU1NJTkc6CgkJCQlzZXFfcHV0cyhzZXEsICJtaXNzaW5nXG4iKTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJc2VxX3ByaW50ZihzZXEsICJ0eXBlICVkP1xuIiwgCgkJCQkJICAgYXR0cmliLT52YWx1ZS0+dHlwZSk7CgkJCX0KCQkJc2VxX3B1dGMoc2VxLCAnXG4nKTsKCgkJfQoJSVJEQV9BU1NFUlRfTEFCRUwob3V0bG9vcDopCgkJc3Bpbl91bmxvY2soJm9iai0+YXR0cmlicy0+aGJfc3BpbmxvY2spOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlyaWFzX3NlcV9vcHMgPSB7Cgkuc3RhcnQgID0gaXJpYXNfc2VxX3N0YXJ0LAoJLm5leHQgICA9IGlyaWFzX3NlcV9uZXh0LAoJLnN0b3AgICA9IGlyaWFzX3NlcV9zdG9wLAoJLnNob3cgICA9IGlyaWFzX3NlcV9zaG93LAp9OwoKc3RhdGljIGludCBpcmlhc19zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJSVJEQV9BU1NFUlQoIGlyaWFzX29iamVjdHMgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUw7KTsKCglyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmlyaWFzX3NlcV9vcHMpOwp9CgpzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlyaWFzX3NlcV9mb3BzID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLm9wZW4gICAgICAgICAgID0gaXJpYXNfc2VxX29wZW4sCgkucmVhZCAgICAgICAgICAgPSBzZXFfcmVhZCwKCS5sbHNlZWsgICAgICAgICA9IHNlcV9sc2VlaywKCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCn07CgojZW5kaWYgLyogUFJPQ19GUyAqLwo=