LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJsbXAuaAogKiBWZXJzaW9uOiAgICAgICAwLjkKICogRGVzY3JpcHRpb246ICAgSXJEQSBMaW5rIE1hbmFnZW1lbnQgUHJvdG9jb2wgKExNUCkgbGF5ZXIKICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgogKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIENyZWF0ZWQgYXQ6ICAgIFN1biBBdWcgMTcgMjA6NTQ6MzIgMTk5NwogKiBNb2RpZmllZCBhdDogICBGcmkgRGVjIDEwIDEzOjIzOjAxIDE5OTkKICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiAKICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4sIAogKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KICogICAgIAogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAogKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAogKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWZuZGVmIElSTE1QX0gKI2RlZmluZSBJUkxNUF9ICgojaW5jbHVkZSA8YXNtL3BhcmFtLmg+ICAvKiBmb3IgSFogKi8KCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvcW9zLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcC5oPgkJLyogTEFQX01BWF9IRUFERVIsIC4uLiAqLwojaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXBfZXZlbnQuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lycXVldWUuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2Rpc2NvdmVyeS5oPgoKLyogTFNBUC1TRUwncyAqLwojZGVmaW5lIExTQVBfTUFTSyAgICAgMHg3ZgojZGVmaW5lIExTQVBfSUFTICAgICAgMHgwMAojZGVmaW5lIExTQVBfQU5ZICAgICAgMHhmZgojZGVmaW5lIExTQVBfTUFYICAgICAgMHg2ZiAvKiAweDcwLTB4N2YgYXJlIHJlc2VydmVkICovCiNkZWZpbmUgTFNBUF9DT05OTEVTUyAweDcwIC8qIENvbm5lY3Rpb25sZXNzIExTQVAsIG1vc3RseSB1c2VkIGZvciBVbHRyYSAqLwoKI2RlZmluZSBERVZfQUREUl9BTlkgIDB4ZmZmZmZmZmYKCiNkZWZpbmUgTE1QX0hFQURFUiAgICAgICAgICAyICAgIC8qIERlc3QgTFNBUCArIFNvdXJjZSBMU0FQICovCiNkZWZpbmUgTE1QX0NPTlRST0xfSEVBREVSICA0CiNkZWZpbmUgTE1QX1BJRF9IRUFERVIgICAgICAxICAgIC8qIFVzZWQgYnkgVWx0cmEgKi8KI2RlZmluZSBMTVBfTUFYX0hFQURFUiAgICAgIChMTVBfQ09OVFJPTF9IRUFERVIrTEFQX01BWF9IRUFERVIpCgojZGVmaW5lIExNX01BWF9DT05ORUNUSU9OUyAgMTAKCiNkZWZpbmUgTE1fSURMRV9USU1FT1VUICAgICAyKkhaIC8qIDIgc2Vjb25kcyBmb3Igbm93ICovCgp0eXBlZGVmIGVudW0gewoJU19QTlAgPSAwLAoJU19QREEsCglTX0NPTVBVVEVSLAoJU19QUklOVEVSLAoJU19NT0RFTSwKCVNfRkFYLAoJU19MQU4sCglTX1RFTEVQSE9OWSwKCVNfQ09NTSwKCVNfT0JFWCwKCVNfQU5ZLAoJU19FTkQsCn0gU0VSVklDRTsKCi8qIEZvciBzZWxlY3RpdmUgZGlzY292ZXJ5ICovCnR5cGVkZWYgdm9pZCAoKkRJU0NPVkVSWV9DQUxMQkFDSzEpIChkaXNjaW5mb190ICosIERJU0NPVkVSWV9NT0RFLCB2b2lkICopOwovKiBGb3IgZXhwaXJ5ICh0aGUgc2FtZSkgKi8KdHlwZWRlZiB2b2lkICgqRElTQ09WRVJZX0NBTExCQUNLMikgKGRpc2NpbmZvX3QgKiwgRElTQ09WRVJZX01PREUsIHZvaWQgKik7Cgp0eXBlZGVmIHN0cnVjdCB7CglpcmRhX3F1ZXVlX3QgcXVldWU7IC8qIE11c3QgYmUgZmlyc3QgKi8KCglfX3UxNl9ob3N0X29yZGVyIGhpbnRzOyAvKiBIaW50IGJpdHMgKi8KfSBpcmxtcF9zZXJ2aWNlX3Q7Cgp0eXBlZGVmIHN0cnVjdCB7CglpcmRhX3F1ZXVlX3QgcXVldWU7IC8qIE11c3QgYmUgZmlyc3QgKi8KCglfX3UxNl9ob3N0X29yZGVyIGhpbnRfbWFzazsKCglESVNDT1ZFUllfQ0FMTEJBQ0sxIGRpc2NvX2NhbGxiYWNrOwkvKiBTZWxlY3RpdmUgZGlzY292ZXJ5ICovCglESVNDT1ZFUllfQ0FMTEJBQ0syIGV4cGlyX2NhbGxiYWNrOwkvKiBTZWxlY3RpdmUgZXhwaXJhdGlvbiAqLwoJdm9pZCAqcHJpdjsgICAgICAgICAgICAgICAgLyogVXNlZCB0byBpZGVudGlmeSBjbGllbnQgKi8KfSBpcmxtcF9jbGllbnRfdDsKCi8qCiAqICBJbmZvcm1hdGlvbiBhYm91dCBlYWNoIGxvZ2ljYWwgTFNBUCBjb25uZWN0aW9uCiAqLwpzdHJ1Y3QgbHNhcF9jYiB7CglpcmRhX3F1ZXVlX3QgcXVldWU7ICAgICAgLyogTXVzdCBiZSBmaXJzdCAqLwoJbWFnaWNfdCBtYWdpYzsKCgl1bnNpZ25lZCBsb25nIGNvbm5lY3RlZDsJLyogc2V0X2JpdCB1c2VkIG9uIHRoaXMgKi8KCWludCAgcGVyc2lzdGVudDsKCglfX3U4IHNsc2FwX3NlbDsgICAvKiBTb3VyY2UgKHRoaXMpIExTQVAgYWRkcmVzcyAqLwoJX191OCBkbHNhcF9zZWw7ICAgLyogRGVzdGluYXRpb24gTFNBUCBhZGRyZXNzIChpZiBjb25uZWN0ZWQpICovCiNpZmRlZiBDT05GSUdfSVJEQV9VTFRSQQoJX191OCBwaWQ7ICAgICAgICAgLyogVXNlZCBieSBjb25uZWN0aW9ubGVzcyBMU0FQICovCiNlbmRpZiAvKiBDT05GSUdfSVJEQV9VTFRSQSAqLwoJc3RydWN0IHNrX2J1ZmYgKmNvbm5fc2tiOyAvKiBTdG9yZSBza2IgaGVyZSB3aGlsZSBjb25uZWN0aW5nICovCgoJc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2dfdGltZXI7CgoJSVJMTVBfU1RBVEUgICAgIGxzYXBfc3RhdGU7ICAvKiBDb25uZWN0aW9uIHN0YXRlICovCglub3RpZnlfdCAgICAgICAgbm90aWZ5OyAgICAgIC8qIEluZGljYXRpb24vQ29uZmlybSBlbnRyeSBwb2ludHMgKi8KCXN0cnVjdCBxb3NfaW5mbyBxb3M7ICAgICAgICAgLyogUW9TIGZvciB0aGlzIGNvbm5lY3Rpb24gKi8KCglzdHJ1Y3QgbGFwX2NiICpsYXA7IC8qIFBvaW50ZXIgdG8gTEFQIGNvbm5lY3Rpb24gc3RydWN0dXJlICovCn07CgovKgogKiAgVXNlZCBmb3IgY2FjaGluZyB0aGUgbGFzdCBzbHNhcC0+ZGxzYXAtPmhhbmRsZSBtYXBwaW5nCiAqCiAqIFdlIGRvbid0IG5lZWQgdG8ga2VlcC9tYXRjaCB0aGUgcmVtb3RlIGFkZHJlc3MgaW4gdGhlIGNhY2hlIGJlY2F1c2UKICogd2UgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIExBUCAod2hpY2ggaW1wbGllcyBpdCkuCiAqIEplYW4gSUkKICovCnR5cGVkZWYgc3RydWN0IHsKCWludCB2YWxpZDsKCglfX3U4IHNsc2FwX3NlbDsKCV9fdTggZGxzYXBfc2VsOwoJc3RydWN0IGxzYXBfY2IgKmxzYXA7Cn0gQ0FDSEVfRU5UUlk7CgovKgogKiAgSW5mb3JtYXRpb24gYWJvdXQgZWFjaCByZWdpc3RyZWQgSXJMQVAgbGF5ZXIKICovCnN0cnVjdCBsYXBfY2IgewoJaXJkYV9xdWV1ZV90IHF1ZXVlOyAvKiBNdXN0IGJlIGZpcnN0ICovCgltYWdpY190IG1hZ2ljOwoKCWludCByZWFzb247ICAgIC8qIExBUCBkaXNjb25uZWN0IHJlYXNvbiAqLwoKCUlSTE1QX1NUQVRFIGxhcF9zdGF0ZTsKCglzdHJ1Y3QgaXJsYXBfY2IgKmlybGFwOyAgIC8qIEluc3RhbmNlIG9mIElyTEFQIGxheWVyICovCgloYXNoYmluX3QgKmxzYXBzOyAgICAgICAgIC8qIExTQVAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGluayAqLwoJc3RydWN0IGxzYXBfY2IgKmZsb3dfbmV4dDsJLyogTmV4dCBsc2FwIHRvIGJlIHBvbGxlZCBmb3IgVHggKi8KCglfX3U4ICBjYWRkcjsgIC8qIENvbm5lY3Rpb24gYWRkcmVzcyAqLwogCV9fdTMyIHNhZGRyOyAgLyogU291cmNlIGRldmljZSBhZGRyZXNzICovCiAJX191MzIgZGFkZHI7ICAvKiBEZXN0aW5hdGlvbiBkZXZpY2UgYWRkcmVzcyAqLwoJCglzdHJ1Y3QgcW9zX2luZm8gKnFvczsgIC8qIExBUCBRb1MgZm9yIHRoaXMgc2Vzc2lvbiAqLwoJc3RydWN0IHRpbWVyX2xpc3QgaWRsZV90aW1lcjsKCQojaWZkZWYgQ09ORklHX0lSREFfQ0FDSEVfTEFTVF9MU0FQCgkvKiBUaGUgbHNhcCBjYWNoZSB3YXMgbW92ZWQgZnJvbSBzdHJ1Y3QgaXJsbXBfY2IgdG8gaGVyZSBiZWNhdXNlCgkgKiBpdCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWMgTEFQLiBBbHNvLCB0aGlzCgkgKiBpbXByb3ZlcyBwZXJmb3JtYW5jZS4gLSBKZWFuIElJICovCglDQUNIRV9FTlRSWSBjYWNoZTsgIC8qIENhY2hpbmcgbGFzdCBzbHNhcC0+ZGxzYXAtPmhhbmRsZSBtYXBwaW5nICovCiNlbmRpZgp9OwoKLyoKICogIE1haW4gc3RydWN0dXJlIGZvciBJckxNUAogKi8Kc3RydWN0IGlybG1wX2NiIHsKCW1hZ2ljX3QgbWFnaWM7CgoJX191OCBjb25mbGljdF9mbGFnOwoJCglkaXNjb3ZlcnlfdCBkaXNjb3ZlcnlfY21kOyAvKiBEaXNjb3ZlcnkgY29tbWFuZCB0byB1c2UgYnkgSXJMQVAgKi8KCWRpc2NvdmVyeV90IGRpc2NvdmVyeV9yc3A7IC8qIERpc2NvdmVyeSByZXNwb25zZSB0byB1c2UgYnkgSXJMQVAgKi8KCgkvKiBMYXN0IGxzYXAgcGlja2VkIGF1dG9tYXRpY2FsbHkgYnkgaXJsbXBfZmluZF9mcmVlX3Nsc2FwKCkgKi8KCWludAlsYXN0X2xzYXBfc2VsOwoKCXN0cnVjdCB0aW1lcl9saXN0IGRpc2NvdmVyeV90aW1lcjsKCiAJaGFzaGJpbl90ICpsaW5rczsgICAgICAgICAvKiBJckxBUCBjb25uZWN0aW9uIHRhYmxlICovCgloYXNoYmluX3QgKnVuY29ubmVjdGVkX2xzYXBzOwogCWhhc2hiaW5fdCAqY2xpZW50czsKCWhhc2hiaW5fdCAqc2VydmljZXM7CgoJaGFzaGJpbl90ICpjYWNoZWxvZzsJLyogQ3VycmVudCBkaXNjb3ZlcnkgbG9nICovCgoJaW50IHJ1bm5pbmc7CgoJX191MTZfaG9zdF9vcmRlciBoaW50czsgLyogSGludCBiaXRzICovCn07CgovKiBQcm90b3R5cGUgZGVjbGFyYXRpb25zICovCmludCAgaXJsbXBfaW5pdCh2b2lkKTsKdm9pZCBpcmxtcF9jbGVhbnVwKHZvaWQpOwpzdHJ1Y3QgbHNhcF9jYiAqaXJsbXBfb3Blbl9sc2FwKF9fdTggc2xzYXAsIG5vdGlmeV90ICpub3RpZnksIF9fdTggcGlkKTsKdm9pZCBpcmxtcF9jbG9zZV9sc2FwKCBzdHJ1Y3QgbHNhcF9jYiAqc2VsZik7CgpfX3UxNiBpcmxtcF9zZXJ2aWNlX3RvX2hpbnQoaW50IHNlcnZpY2UpOwp2b2lkICppcmxtcF9yZWdpc3Rlcl9zZXJ2aWNlKF9fdTE2IGhpbnRzKTsKaW50IGlybG1wX3VucmVnaXN0ZXJfc2VydmljZSh2b2lkICpoYW5kbGUpOwp2b2lkICppcmxtcF9yZWdpc3Rlcl9jbGllbnQoX191MTYgaGludF9tYXNrLCBESVNDT1ZFUllfQ0FMTEJBQ0sxIGRpc2NvX2NsYiwKCQkJICAgIERJU0NPVkVSWV9DQUxMQkFDSzIgZXhwaXJfY2xiLCB2b2lkICpwcml2KTsKaW50IGlybG1wX3VucmVnaXN0ZXJfY2xpZW50KHZvaWQgKmhhbmRsZSk7CmludCBpcmxtcF91cGRhdGVfY2xpZW50KHZvaWQgKmhhbmRsZSwgX191MTYgaGludF9tYXNrLCAKCQkJRElTQ09WRVJZX0NBTExCQUNLMSBkaXNjb19jbGIsCgkJCURJU0NPVkVSWV9DQUxMQkFDSzIgZXhwaXJfY2xiLCB2b2lkICpwcml2KTsKCnZvaWQgaXJsbXBfcmVnaXN0ZXJfbGluayhzdHJ1Y3QgaXJsYXBfY2IgKiwgX191MzIgc2FkZHIsIG5vdGlmeV90ICopOwp2b2lkIGlybG1wX3VucmVnaXN0ZXJfbGluayhfX3UzMiBzYWRkcik7CgppbnQgIGlybG1wX2Nvbm5lY3RfcmVxdWVzdChzdHJ1Y3QgbHNhcF9jYiAqLCBfX3U4IGRsc2FwX3NlbCwgCgkJCSAgIF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkciwKCQkJICAgc3RydWN0IHFvc19pbmZvICosIHN0cnVjdCBza19idWZmICopOwp2b2lkIGlybG1wX2Nvbm5lY3RfaW5kaWNhdGlvbihzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CmludCAgaXJsbXBfY29ubmVjdF9yZXNwb25zZShzdHJ1Y3QgbHNhcF9jYiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKdm9pZCBpcmxtcF9jb25uZWN0X2NvbmZpcm0oc3RydWN0IGxzYXBfY2IgKiwgc3RydWN0IHNrX2J1ZmYgKik7CnN0cnVjdCBsc2FwX2NiICppcmxtcF9kdXAoc3RydWN0IGxzYXBfY2IgKnNlbGYsIHZvaWQgKmluc3RhbmNlKTsKCnZvaWQgaXJsbXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHN0cnVjdCBsc2FwX2NiICpzZWxmLCBMTV9SRUFTT04gcmVhc29uLCAKCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqdXNlcmRhdGEpOwppbnQgIGlybG1wX2Rpc2Nvbm5lY3RfcmVxdWVzdChzdHJ1Y3QgbHNhcF9jYiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqdXNlcmRhdGEpOwoKdm9pZCBpcmxtcF9kaXNjb3ZlcnlfY29uZmlybShoYXNoYmluX3QgKmRpc2NvdmVyeV9sb2csIERJU0NPVkVSWV9NT0RFIG1vZGUpOwp2b2lkIGlybG1wX2Rpc2NvdmVyeV9yZXF1ZXN0KGludCBuc2xvdHMpOwpkaXNjaW5mb190ICppcmxtcF9nZXRfZGlzY292ZXJpZXMoaW50ICpwbiwgX191MTYgbWFzaywgaW50IG5zbG90cyk7CnZvaWQgaXJsbXBfZG9fZXhwaXJ5KHZvaWQpOwp2b2lkIGlybG1wX2RvX2Rpc2NvdmVyeShpbnQgbnNsb3RzKTsKZGlzY292ZXJ5X3QgKmlybG1wX2dldF9kaXNjb3ZlcnlfcmVzcG9uc2Uodm9pZCk7CnZvaWQgaXJsbXBfZGlzY292ZXJ5X2V4cGlyeShkaXNjaW5mb190ICpleHBpcnksIGludCBudW1iZXIpOwoKaW50ICBpcmxtcF9kYXRhX3JlcXVlc3Qoc3RydWN0IGxzYXBfY2IgKiwgc3RydWN0IHNrX2J1ZmYgKik7CnZvaWQgaXJsbXBfZGF0YV9pbmRpY2F0aW9uKHN0cnVjdCBsc2FwX2NiICosIHN0cnVjdCBza19idWZmICopOwoKaW50ICBpcmxtcF91ZGF0YV9yZXF1ZXN0KHN0cnVjdCBsc2FwX2NiICosIHN0cnVjdCBza19idWZmICopOwp2b2lkIGlybG1wX3VkYXRhX2luZGljYXRpb24oc3RydWN0IGxzYXBfY2IgKiwgc3RydWN0IHNrX2J1ZmYgKik7CgojaWZkZWYgQ09ORklHX0lSREFfVUxUUkEKaW50ICBpcmxtcF9jb25ubGVzc19kYXRhX3JlcXVlc3Qoc3RydWN0IGxzYXBfY2IgKiwgc3RydWN0IHNrX2J1ZmYgKiwgX191OCk7CnZvaWQgaXJsbXBfY29ubmxlc3NfZGF0YV9pbmRpY2F0aW9uKHN0cnVjdCBsc2FwX2NiICosIHN0cnVjdCBza19idWZmICopOwojZW5kaWYgLyogQ09ORklHX0lSREFfVUxUUkEgKi8KCnZvaWQgaXJsbXBfc3RhdHVzX2luZGljYXRpb24oc3RydWN0IGxhcF9jYiAqLCBMSU5LX1NUQVRVUyBsaW5rLCBMT0NLX1NUQVRVUyBsb2NrKTsKdm9pZCBpcmxtcF9mbG93X2luZGljYXRpb24oc3RydWN0IGxhcF9jYiAqc2VsZiwgTE9DQUxfRkxPVyBmbG93KTsKCkxNX1JFQVNPTiBpcmxtcF9jb252ZXJ0X2xhcF9yZWFzb24oTEFQX1JFQVNPTik7CgpzdGF0aWMgaW5saW5lIF9fdTMyIGlybG1wX2dldF9zYWRkcihjb25zdCBzdHJ1Y3QgbHNhcF9jYiAqc2VsZikKewoJcmV0dXJuIChzZWxmICYmIHNlbGYtPmxhcCkgPyBzZWxmLT5sYXAtPnNhZGRyIDogMDsKfQoKc3RhdGljIGlubGluZSBfX3UzMiBpcmxtcF9nZXRfZGFkZHIoY29uc3Qgc3RydWN0IGxzYXBfY2IgKnNlbGYpCnsKCXJldHVybiAoc2VsZiAmJiBzZWxmLT5sYXApID8gc2VsZi0+bGFwLT5kYWRkciA6IDA7Cn0KCmV4dGVybiBjb25zdCBjaGFyICppcmxtcF9yZWFzb25zW107CmV4dGVybiBpbnQgc3lzY3RsX2Rpc2NvdmVyeV90aW1lb3V0OwpleHRlcm4gaW50IHN5c2N0bF9kaXNjb3Zlcnlfc2xvdHM7CmV4dGVybiBpbnQgc3lzY3RsX2Rpc2NvdmVyeTsKZXh0ZXJuIGludCBzeXNjdGxfbGFwX2tlZXBhbGl2ZV90aW1lOwkvKiBpbiBtcywgZGVmYXVsdCBpcyBMTV9JRExFX1RJTUVPVVQgKi8KZXh0ZXJuIHN0cnVjdCBpcmxtcF9jYiAqaXJsbXA7CgovKiBDaGVjayBpZiBMQVAgcXVldWUgaXMgZnVsbC4KICogVXNlZCBieSBJclRUUCBmb3IgbG93IGNvbnRyb2wsIHNlZSBjb21tZW50cyBpbiBpcmxhcC5oIC0gSmVhbiBJSSAqLwpzdGF0aWMgaW5saW5lIGludCBpcmxtcF9sYXBfdHhfcXVldWVfZnVsbChzdHJ1Y3QgbHNhcF9jYiAqc2VsZikKewoJaWYgKHNlbGYgPT0gTlVMTCkKCQlyZXR1cm4gMDsKCWlmIChzZWxmLT5sYXAgPT0gTlVMTCkKCQlyZXR1cm4gMDsKCWlmIChzZWxmLT5sYXAtPmlybGFwID09IE5VTEwpCgkJcmV0dXJuIDA7CgoJcmV0dXJuKElSTEFQX0dFVF9UWF9RVUVVRV9MRU4oc2VsZi0+bGFwLT5pcmxhcCkgPj0gTEFQX0hJR0hfVEhSRVNIT0xEKTsKfQoKLyogQWZ0ZXIgZG9pbmcgYSBpcmxtcF9kdXAoKSwgdGhpcyBnZXQgb25lIG9mIHRoZSB0d28gc29ja2V0IGJhY2sgaW50bwogKiBhIHN0YXRlIHdoZXJlIGl0J3Mgd2FpdGluZyBpbmNvbW1pbmcgY29ubmVjdGlvbnMuCiAqIE5vdGUgOiB0aGlzIGNhbiBiZSB1c2VkICpvbmx5KiBpZiB0aGUgc29ja2V0IGlzIG5vdCB5ZXQgY29ubmVjdGVkCiAqIChpLmUuIE5PIGlybG1wX2Nvbm5lY3RfcmVzcG9uc2UoKSBkb25lIG9uIHRoaXMgc29ja2V0KS4KICogLSBKZWFuIElJICovCnN0YXRpYyBpbmxpbmUgdm9pZCBpcmxtcF9saXN0ZW4oc3RydWN0IGxzYXBfY2IgKnNlbGYpCnsKCXNlbGYtPmRsc2FwX3NlbCA9IExTQVBfQU5ZOwoJc2VsZi0+bGFwID0gTlVMTDsKCXNlbGYtPmxzYXBfc3RhdGUgPSBMU0FQX0RJU0NPTk5FQ1RFRDsKCS8qIFN0YXJ0ZWQgd2hlbiB3ZSByZWNlaXZlZCB0aGUgTE1fQ09OTkVDVF9JTkRJQ0FUSU9OICovCglkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKfQoKI2VuZGlmCg==