LyoKICoJT1NTIGRyaXZlciBmb3IgTGludXggMi5bNDZdLnggZm9yCiAqCiAqCVRyaWRlbnQgNEQtV2F2ZQogKglTaVMgNzAxOAogKglBTGkgNTQ1MQogKglUdmlhL0lHU1QgQ3liZXJQcm8gNTA1MAogKgogKglEcml2ZXI6IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CiAqCiAqICBCdWlsdCBmcm9tOgogKglMb3cgbGV2ZWwgY29kZTogPGF1ZGlvQHRyaWRlbnRtaWNyby5jb20+IGZyb20gQUxTQQogKglGcmFtZXdvcms6IFRob21hcyBTYWlsZXIgPHNhaWxlckBpZmUuZWUuZXRoei5jaD4KICoJRXh0ZW5kZWQgYnk6IFphY2ggQnJvd24gPHphYkByZWRoYXQuY29tPiAgCiAqCiAqICBIYWNrZWQgdXAgYnk6CiAqCUFhcm9uIEhvbHR6bWFuIDxhaG9sdHptYUBlc3MuZW5nci51dmljLmNhPgogKglPbGxpZSBMaG8gPG9sbGllQHNpcy5jb20udHc+IFNpUyA3MDE4IEF1ZGlvIENvcmUgU3VwcG9ydAogKglDaGluZy1MaW5nIExlZSA8Y2xpbmctbGlAYWxpLmNvbS50dz4gQUxpIDU0NTEgQXVkaW8gQ29yZSBTdXBwb3J0IAogKglNYXR0IFd1IDxtYXR0d3VAYWNlcnNvZnRlY2guY29tLmNuPiBBTGkgNTQ1MSBBdWRpbyBDb3JlIFN1cHBvcnQKICoJUGV0ZXIgV+RjaHRsZXIgPHB3YWVjaHRsZXJAbG9ld2Uta29tcC5kZT4gQ3liZXJQcm81MDUwIHN1cHBvcnQKICogICAgICBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QG11bGl4Lm9yZz4KICoKICoKICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqCiAqICBIaXN0b3J5CiAqICB2MC4xNC4xMGoKICogIAlKYW51YXJ5IDMgMjAwNCBFdWdlbmUgVGVvIDxldWdlbmV0ZW9AZXVnZW5ldGVvLm5ldD4KICogIAltaW5vciBjbGVhbnVwIHRvIHVzZSBwcl9kZWJ1ZyBpbnN0ZWFkIG9mIFRSREJHIHNpbmNlIGl0IGlzIGFscmVhZHkKICogIAlkZWZpbmVkIGluIGxpbnV4L2tlcm5lbC5oLgogKiAgdjAuMTQuMTBpCiAqICAgICAgRGVjZW1iZXIgMjkgMjAwMyBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QG11bGl4Lm9yZz4KICogICAgICBtYWpvciBjbGVhbnVwIGZvciAyLjYsIGZpeCBhIGZldyBlcnJvciBwYXRjaCBidWdsZXRzCiAqICAgICAgd2l0aCByZXR1cm5pbmcgd2l0aG91dCBwcm9wZXJseSBjbGVhbmluZyB1cCBmaXJzdCwKICogICAgICBnZXQgcmlkIG9mIGxvY2tfa2VybmVsKCkuCiAqICB2MC4xNC4xMGgKICoJU2VwdCAxMCAyMDAyIFBhc2NhbCBTY2htaWR0IDxkZXIuZXJlbWl0QGVtYWlsLmRlPgogKglhZGRlZCBzdXBwb3J0IGZvciBBTGkgNTQ1MSBqb3lzdGljayBwb3J0CiAqICB2MC4xNC4xMGcKICoJU2VwdCAwNSAyMDAyIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CiAqCWFkYXB0IHRvIG5ldyBwY2kgam95c3RpY2sgYXR0YWNobWVudCBpbnRlcmZhY2UKICogIHYwLjE0LjEwZgogKiAgICAgIEp1bHkgMjQgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KICogICAgICBwYXRjaCBmcm9tIEVyaWMgTGVtYXIgKHZpYSBJYW4gU29ib3JvZmYpOiBpbiBzdXNwZW5kIGFuZCByZXN1bWUsIAogKiAgICAgIGZpeCB3cm9uZyBjYXN0IGZyb20gcGNpX2RldiogdG8gc3RydWN0IHRyaWRlbnRfY2FyZCouIAogKiAgdjAuMTQuMTBlCiAqICAgICAgSnVseSAxOSAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPgogKiAgICAgIHJld3JpdGUgdGhlIERNQSBidWZmZXIgYWxsb2NhdGlvbi9kZWFsbGNvYXRpb24gZnVuY3Rpb25zLCB0byBtYWtlIGl0IAogKiAgICAgIG1vZHVsYXIgYW5kIGZpeCBhIGJ1ZyB3aGVyZSB3ZSB3b3VsZCBjYWxsIGZyZWVfcGFnZXMgb24gbWVtb3J5IAogKiAgICAgIG9idGFpbmVkIHdpdGggcGNpX2FsbG9jX2NvbnNpc3RlbnQuIEFsc28gcmVtb3ZlIHVubmVjZXNzYXJ5ICNpZmRlZiAKICogICAgICBDT05GSUdfUFJPQ19GUyBhbmQgdmFyaW91cyBvdGhlciBjbGVhbnVwcy4KICogIHYwLjE0LjEwZAogKiAgICAgIEp1bHkgMTkgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KICogICAgICBtYWRlIHNldmVyYWwgcHJpbnRrKEtFUk5fTk9USUNFLi4uKSBpbnRvIFRSREJHKC4uLiksIHRvIGF2b2lkIHNwYW1taW5nCiAqICAgICAgbXkgc3lzbG9nIHdpdGggaHVuZHJlZHMgb2YgbWVzc2FnZXMuIAogKiAgdjAuMTQuMTBjCiAqICAgICAgSnVseSAxNiAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPgogKiAgICAgIENsZWFuZWQgdXAgTGVpIEh1J3MgMC40LjEwIGRyaXZlciB0byBjb25mb3JtIHRvIERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKICogICAgICBhbmQgdGhlIGNvZGluZyBzdHlsZSB1c2VkIGluIHRoZSByZXN0IG9mIHRoZSBmaWxlLiAKICogIHYwLjE0LjEwYgogKiAgICAgIEp1bmUgMjMgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KICogICAgICBhZGQgYSBtaXNzaW5nIHVubG9ja19zZXRfZm10LCByZW1vdmUgYSBzdXBlcmZsb3VzIGxvY2svdW5sb2NrIHBhaXIgCiAqICAgICAgd2l0aCBub3RoaW5nIGluIGJldHdlZW4uIAogKiAgdjAuMTQuMTBhCiAqICAgICAgSnVuZSAyMSAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPiAKICogICAgICB1c2UgYSBkZWJ1ZyBtYWNybyBpbnN0ZWFkIG9mICNpZmRlZiBDT05GSUdfREVCVUcsIHRyaW0gdG8gODAgY29sdW1ucyAKICogICAgICBwZXIgbGluZSwgdXNlICdkbyB7fSB3aGlsZSAoMCknIGluIHN0YXRlbWVudCBtYWNyb3MuIAogKiAgdjAuMTQuMTAKICogICAgICBKdW5lIDYgMjAwMiBMZWkgSHUgPExlaV9odUBhbGkuY29tLnR3PgogKiAgICAgIHJld3JpdGUgdGhlIHBhcnQgdG8gcmVhZC93cml0ZSByZWdpc3RlcnMgb2YgYXVkaW8gY29kZWMgZm9yIEFsaTU0NTEgCiAqICB2MC4xNC45ZQogKiAgICAgIEphbnVhcnkgMiAyMDAyIFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHVjdy5jej4gYWRkZWQgZ2FtZXBvcnQKICogICAgICBzdXBwb3J0IHRvIGF2b2lkIHJlc291cmNlIGNvbmZsaWN0IHdpdGggcGNpZ2FtZS5jCiAqICB2MC4xNC45ZAogKiAgCU9jdG9iZXIgOCAyMDAxIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgogKgl1c2Ugc2V0X2N1cnJlbnRfc3RhdGUsIHByb3Blcmx5IHJlbGVhc2UgcmVzb3VyY2VzIG9uIGZhaWx1cmUgaW4KICoJdHJpZGVudF9wcm9iZSwgZ2V0IHJpZCBvZiBjaGVja19yZWdpb24KICogIHYwLjE0LjljCiAqCUF1Z3VzdCAxMCAyMDAxIFBldGVyIFfkY2h0bGVyIDxwd2FlY2h0bGVyQGxvZXdlLWtvbXAuZGU+CiAqCWFkZGVkIHN1cHBvcnQgZm9yIFR2aWEgKGZvcm1lcmx5IEludGVncmFwaGljcy9JR1NUKSBDeWJlclBybzUwNTAKICoJdGhpcyBjaGlwIGlzIG9mdGVuIGZvdW5kIGluIHNldHRvcCBib3hlcyAoY29tYmluZWQgdmlkZW8rYXVkaW8pCiAqICB2MC4xNC45YgogKglTd2l0Y2ggdG8gc3RhdGljIGlubGluZSBub3QgZXh0ZXJuIGlubGluZSAoZ2NjIDMpCiAqICB2MC4xNC45YQogKglBdWcgNiAyMDAxIEFsYW4gQ294CiAqCTAuMTQuOSBjcmFzaGVkIG9uIHJtbW9kIGR1ZSB0byBhIHRpbWVyL2JoIGxlZnQgcnVubmluZy4gU2ltcGxpZmllZAogKgl0aGUgZXhpc3RpbmcgbG9naWMgKHRoZSBCSCBkb2Vzbid0IGhlbHAgYXMgYWM5NyBpcyBsb2NrX2lycXNhdmUpCiAqCWFuZCB1c2VkIGRlbF90aW1lcl9zeW5jIHRvIGNsZWFuIHVwCiAqCUZpeGVkIGEgcHJvYmxlbSB3aGVyZSB0aGUgQUxpIGNoYW5nZSBicm9rZSBteSBnZW5lcmljIGNhcmQKICogIHYwLjE0LjkKICoJSnVsIDEwIDIwMDEgTWF0dCBXdQogKglBZGQgSC9XIFZvbHVtZSBDb250cm9sCiAqICB2MC4xNC44YQogKglKdWx5IDcgMjAwMSBBbGFuIENveAogKglNb3ZlZCBNYXR0IFd1J3MgYWM5NyByZWdpc3RlciBjYWNoZSBpbnRvIHRoZSBjYXJkIHN0cnVjdHVyZQogKiAgdjAuMTQuOAogKglBcHIgMzAgMjAwMSBNYXR0IFd1CiAqCVNldCBFQlVGMSBhbmQgRUJVRjIgdG8gc3RpbGwgbW9kZQogKglBZGQgZGM5Ny9hYzk3IHJlc2V0IGZ1bmN0aW9uCiAqCUZpeCBwb3dlciBtYW5hZ2VtZW50OiBhbGlfcmVzdG9yZV9yZWdzCiAqICB1bnJlbGVhc2VkIAogKglNYXIgMDkgMjAwMSBNYXR0IFd1CiAqCUFkZCBjYWNoZSBmb3IgYWM5NyBhY2Nlc3MKICogIHYwLjE0LjcKICoJRmViIDA2IDIwMDEgTWF0dCBXdQogKglGaXggYWM5NyBpbml0aWFsaXphdGlvbgogKglGaXggYnVnOiBhbiBleHRyYSB0YWlsIHdpbGwgYmUgcGxheWVkIHdoZW4gcGxheWluZwogKglKYW4gMDUgMjAwMSBNYXR0IFd1CiAqCUltcGxlbWVudCBtdWx0aS1jaGFubmVscyBhbmQgUy9QRElGIGluIHN1cHBvcnQgZm9yIEFMaSAxNTM1KwogKiAgdjAuMTQuNiAKICoJTm92IDEgMjAwMCBDaGluZy1MaW5nIExlZQogKglGaXggdGhlIGJ1ZyBvZiBtZW1vcnkgbGVhayB3aGVuIHN3aXRjaGluZyA1LjEtY2hhbm5lbHMgdG8gMiBjaGFubmVscy4KICoJQWRkIGxvY2sgcHJvdGVjdGlvbiBpbnRvIGR5bmFtaWMgY2hhbmdpbmcgZm9ybWF0IG9mIGRhdGEuCiAqCU9jdCAxOCAyMDAwIENoaW5nLUxpbmcgTGVlCiAqCTUuMS1jaGFubmVscyBzdXBwb3J0IGZvciBBTGkKICoJSnVuZSAyOCAyMDAwIENoaW5nLUxpbmcgTGVlCiAqCVMvUERJRiBvdXQvaW4ocGxheWJhY2svcmVjb3JkKSBzdXBwb3J0IGZvciBBTGkgMTUzNSssIHVzaW5nIC9wcm9jIHRvIGJlIHNlbGVjdGVkIGJ5IHVzZXIKICoJU2ltcGxlIFBvd2VyIE1hbmFnZW1lbnQgc3VwcG9ydCBmb3IgQUxpCiAqICB2MC4xNC41IE1heSAyMyAyMDAwIE9sbGllIExobwogKiAgCU1pc2MgYnVnIGZpeCBmcm9tIHRoZSBOZXQKICogIHYwLjE0LjQgTWF5IDIwIDIwMDAgQWFyb24gSG9sdHptYW4KICogIAlGaXgga2ZyZWUnZCBtZW1vcnkgYWNjZXNzIGluIHJlbGVhc2UKICogIAlGaXggcmFjZSBpbiBvcGVuIHdoaWxlIGxvb2tpbmcgZm9yIGEgZnJlZSB2aXJ0dWFsIGNoYW5uZWwgc2xvdAogKiAgCXJlbW92ZSBvcGVuX3dhaXQgd3EgKHdoaWNoIGFwcGVhcnMgdG8gYmUgdW51c2VkKQogKiAgdjAuMTQuMyBNYXkgMTAgMjAwMCBPbGxpZSBMaG8KICoJZml4ZWQgYSBzbWFsbCBidWcgaW4gdHJpZGVudF91cGRhdGVfcHRyLCB4bW1zIDEuMC4xIG5vIGxvbmdlciB1c2VzIDEwMCUgQ1BVCiAqICB2MC4xNC4yIE1hciAyOSAyMDAwIENoaW5nLUxpbmcgTGVlCiAqCUFkZCBjbGVhciB0byBzaWxlbmNlIGFkdmFuY2UgaW4gdHJpZGVudF91cGRhdGVfcHRyIAogKglmaXggaW52YWxpZCBkYXRhIG9mIHRoZSBlbmQgb2YgdGhlIHNvdW5kCiAqICB2MC4xNC4xIE1hciAyNCAyMDAwIENoaW5nLUxpbmcgTGVlCiAqCUFMaSA1NDUxIHN1cHBvcnQgYWRkZWQsIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgTy5LLgogKglBTGkgNTQ1MSBvcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgc3RydWN0dXJlZCBiYXNlZCBvbiBzb25pY3ZpYmVzLCBhbmQKICoJc3VnZ2VzdGVkIHRvIG1lcmdlIGludG8gdGhpcyBmaWxlIGJ5IEFsYW4gQ294LgogKiAgdjAuMTQgTWFyIDE1IDIwMDAgT2xsaWUgTGhvCiAqCTUuMSBjaGFubmVsIG91dHB1dCBzdXBwb3J0IHdpdGggY2hhbm5lbCBiaW5kaW5nLiBXaGF0J3MgdGhlIE1hdHJpeCA/CiAqICB2MC4xMy4xIE1hciAxMCAyMDAwIE9sbGllIExobwogKglmZXcgbWlub3IgYnVncyBvbiBkdWFsIGNvZGVjIHN1cHBvcnQsIG5lZWRzIG1vcmUgdGVzdGluZwogKiAgdjAuMTMgTWFyIDAzIDIwMDAgT2xsaWUgTGhvCiAqCW5ldyBwY2lfKiBmb3IgMi40IGtlcm5lbCwgYmFjayBwb3J0ZWQgdG8gMi4yCiAqICB2MC4xMiBGZWIgMjMgMjAwMCBPbGxpZSBMaG8KICoJUHJlbGltaW5hcnkgUmVjb3JkaW5nIHN1cHBvcnQKICogIHYwLjExLjIgRmViIDE5IDIwMDAgT2xsaWUgTGhvCiAqCXJlbW92ZWQgaW5jb21wbGV0ZSBmdWxsLWR1bHBsZXggc3VwcG9ydAogKiAgdjAuMTEuMSBKYW4gMjggMjAwMCBPbGxpZSBMaG8KICoJc21hbGwgYnVnIGluIHNldHRpbmcgc2FtcGxlIHJhdGUgZm9yIDRkLW54IChyZXBvcnRlZCBieSBBYXJvbikKICogIHYwLjExIEphbiAyNyAyMDAwIE9sbGllIExobwogKglETUEgYnVnLCBzY2hlZHVsZXIgbGF0ZW5jeSwgc2Vjb25kIHRyeQogKiAgdjAuMTAgSmFuIDI0IDIwMDAgT2xsaWUgTGhvCiAqCURNQSBidWcgZml4ZWQsIGZvdW5kIGtlcm5lbCBzY2hlZHVsaW5nIHByb2JsZW0KICogIHYwLjA5IEphbiAyMCAyMDAwIE9sbGllIExobwogKglDbGVhbiB1cCBvZiBjaGFubmVsIHJlZ2lzdGVyIGFjY2VzcyByb3V0aW5lIChwcmVwYXJlIGZvciBjaGFubmVsIGJpbmRpbmcpCiAqICB2MC4wOCBKYW4gMTQgMjAwMCBPbGxpZSBMaG8KICoJSXNvbGF0aW9uIG9mIEFDOTcgY29kZWMgY29kZQogKiAgdjAuMDcgSmFuIDEzIDIwMDAgT2xsaWUgTGhvCiAqCUdldCByaWQgb2YgdWdseSBvbGQgbG93IGxldmVsIGFjY2VzcyByb3V0aW5lcyAoZS5nLiBDSFJlZ3MubHAqKioqKQogKiAgdjAuMDYgSmFuIDExIDIwMDAgT2xsaWUgTGhvCiAqCVByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIGR1YWwgKG1vcmUgPykgQUM5NyBjb2RlY3MKICogIHYwLjA1IEphbiAwOCAyMDAwIEx1Y2EgTW9udGVjY2hpYW5pIDxtLmx1Y2FAaW5hbWUuY29tPgogKglhZGFwdCB0byAyLjMueCBuZXcgX19zZXR1cC9fX2luaXQgY2FsbAogKiAgdjAuMDQgRGVjIDMxIDE5OTkgT2xsaWUgTGhvCiAqCU11bHRpcGxlIE9wZW4sIHVzaW5nIE1pZGRsZSBMb29wIEludGVycnVwdCB0byBzbW9vdGggcGxheWJhY2sKICogIHYwLjAzIERlYyAyNCAxOTk5IE9sbGllIExobwogKgltZW0gbGVhayBpbiBwcm9nX2RtYWJ1ZiBhbmQgZGVhbGxvY19kbWFidWYgcmVtb3ZlZAogKiAgdjAuMDIgRGVjIDE1IDE5OTkgT2xsaWUgTGhvCiAqCVNpUyA3MDE4IHN1cHBvcnQgYWRkZWQsIHBsYXliYWNrIE8uSy4KICogIHYwLjAxIEFsYW4gQ294IGV0LiBhbC4KICoJSW5pdGlhbCBSZWxlYXNlIGluIGtlcm5lbCAyLjMuMzAsIGRvZXMgbm90IHdvcmsKICogCiAqICBUb0RvCiAqCUNsZWFuIHVwIG9mIGxvdyBsZXZlbCBjaGFubmVsIHJlZ2lzdGVyIGFjY2VzcyBjb2RlLiAoZG9uZSkKICoJRml4IHRoZSBidWcgb24gZG1hIGJ1ZmZlciBtYW5hZ2VtZW50IGluIHVwZGF0ZV9wdHIsIHJlYWQvd3JpdGUsIGRyYWluX2RhYyAoZG9uZSkKICoJRHVhbCBBQzk3IGNvZGVjcyBzdXBwb3J0IChkb25lKQogKglSZWNvcmRpbmcgc3VwcG9ydCAoZG9uZSkKICoJTW1hcCBzdXBwb3J0CiAqCSJDaGFubmVsIEJpbmRpbmciIGlvY3RsIGV4dGVuc2lvbiAoZG9uZSkKICoJbmV3IHBjaSBkZXZpY2UgZHJpdmVyIGludGVyZmFjZSBmb3IgMi40IGtlcm5lbCAoZG9uZSkKICoKICoJTG9jayBvcmRlciAoaGlnaC0+bG93KQogKgkJbG9jawktCWhhcmR3YXJlIGxvY2sKICoJCW9wZW5fbXV0ZXggLSAJZ3VhcmQgb3BlbnMKICoJCXNlbQktCWd1YXJkIGRtYWJ1Ziwgd3JpdGUgcmUtZW50cnkgZXRjCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvcG9sbC5oPgojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgojaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9wbS5oPgojaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KI2luY2x1ZGUgPGxpbnV4L21tLmg+CgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2RtYS5oPgoKI2lmIGRlZmluZWQoQ09ORklHX0FMUEhBX05BVVRJTFVTKSB8fCBkZWZpbmVkKENPTkZJR19BTFBIQV9HRU5FUklDKQojaW5jbHVkZSA8YXNtL2h3cnBiLmg+CiNlbmRpZgoKI2luY2x1ZGUgInRyaWRlbnQuaCIKCiNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMTQuMTBqLTIuNiIKCiNpZiBkZWZpbmVkKENPTkZJR19HQU1FUE9SVCkgfHwgKGRlZmluZWQoTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19HQU1FUE9SVF9NT0RVTEUpKQojZGVmaW5lIFNVUFBPUlRfSk9ZU1RJQ0sgMQojZW5kaWYKCi8qIG1hZ2ljIG51bWJlcnMgdG8gcHJvdGVjdCBvdXIgZGF0YSBzdHJ1Y3R1cmVzICovCiNkZWZpbmUgVFJJREVOVF9DQVJEX01BR0lDCTB4NTA3MjY5NkUJLyogIlByaW4iICovCiNkZWZpbmUgVFJJREVOVF9TVEFURV9NQUdJQwkweDYzNjU3MzczCS8qICJjZXNzIiAqLwoKI2RlZmluZSBUUklERU5UX0RNQV9NQVNLCTB4M2ZmZmZmZmYJLyogRE1BIGJ1ZmZlciBtYXNrIGZvciBwY2lfYWxsb2NfY29uc2lzdCAqLwojZGVmaW5lIEFMSV9ETUFfTUFTSwkJMHg3ZmZmZmZmZgkvKiBBTEkgVHJpZGVudHMgaGF2ZSAzMS1iaXQgRE1BLiBXb3cuICovCgojZGVmaW5lIE5SX0hXX0NICQkzMgoKLyogbWF4aW11bSBudW1iZXIgb2YgQUM5NyBjb2RlY3MgY29ubmVjdGVkLCBBQzk3IDIuMCBkZWZpbmVkIDQsIGJ1dCA3MDE4IGFuZCA0RC1OWCBvbmx5CiAgIGhhdmUgMiBTREFUQV9JTiBsaW5lcyAoY3VycmVudGx5KSAqLwojZGVmaW5lIE5SX0FDOTcJCTIKCi8qIG1pbm9yIG51bWJlciBvZiAvZGV2L3N3bW9kZW0gKHRlbXBvcmFyeSwgZXhwZXJpbWVudGFsKSAqLwojZGVmaW5lIFNORF9ERVZfU1dNT0RFTQk3CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgYWxpX211bHRpX2NoYW5uZWxzXzVfMVtdID0gewoJLypBTElfU1VSUl9MRUZUX0NIQU5ORUwsIEFMSV9TVVJSX1JJR0hUX0NIQU5ORUwsICovCglBTElfQ0VOVEVSX0NIQU5ORUwsCglBTElfTEVGX0NIQU5ORUwsCglBTElfU1VSUl9MRUZUX0NIQU5ORUwsCglBTElfU1VSUl9SSUdIVF9DSEFOTkVMCn07CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NpemVbXSA9IHsgMSwgMiwgMiwgNCB9OwpzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NoaWZ0W10gPSB7IDAsIDEsIDEsIDIgfTsKCnN0YXRpYyBjb25zdCBjaGFyIGludmFsaWRfbWFnaWNbXSA9IEtFUk5fQ1JJVCAidHJpZGVudDogaW52YWxpZCBtYWdpYyB2YWx1ZSBpbiAlc1xuIjsKCmVudW0gewoJVFJJREVOVF80RF9EWCA9IDAsCglUUklERU5UXzREX05YLAoJU0lTXzcwMTgsCglBTElfNTQ1MSwKCUNZQkVSNTA1MAp9OwoKc3RhdGljIGNoYXIgKmNhcmRfbmFtZXNbXSA9IHsKCSJUcmlkZW50IDREV2F2ZSBEWCIsCgkiVHJpZGVudCA0RFdhdmUgTlgiLAoJIlNpUyA3MDE4IFBDSSBBdWRpbyIsCgkiQUxpIEF1ZGlvIEFjY2VsZXJhdG9yIiwKCSJUdmlhL0lHU1QgQ3liZXJQcm8gNTA1MCIKfTsKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0cmlkZW50X3BjaV90YmxbXSA9IHsKCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVFJJREVOVCwgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWCksCgkJUENJX0NMQVNTX01VTFRJTUVESUFfQVVESU8gPDwgOCwgMHhmZmZmMDAsIFRSSURFTlRfNERfRFh9LAoJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9UUklERU5ULCBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YKSwKCQkwLCAwLCBUUklERU5UXzREX05YfSwKCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfNzAxOCksIDAsIDAsIFNJU183MDE4fSwKCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQUxJLCBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSwgMCwgMCwgQUxJXzU0NTF9LAoJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFUkcsIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTApLAoJCTAsIDAsIENZQkVSNTA1MH0sCgl7MCx9Cn07CgpNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdHJpZGVudF9wY2lfdGJsKTsKCi8qICJzb2Z0d2FyZSIgb3IgdmlydHVhbCBjaGFubmVsLCBhbiBpbnN0YW5jZSBvZiBvcGVuZWQgL2Rldi9kc3AgKi8Kc3RydWN0IHRyaWRlbnRfc3RhdGUgewoJdW5zaWduZWQgaW50IG1hZ2ljOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZDsJLyogQ2FyZCBpbmZvICovCgoJLyogZmlsZSBtb2RlICovCgltb2RlX3Qgb3Blbl9tb2RlOwoKCS8qIHZpcnR1YWwgY2hhbm5lbCBudW1iZXIgKi8KCWludCB2aXJ0OwoKCXN0cnVjdCBkbWFidWYgewoJCS8qIHdhdmUgc2FtcGxlIHN0dWZmICovCgkJdW5zaWduZWQgaW50IHJhdGU7CgkJdW5zaWduZWQgY2hhciBmbXQsIGVuYWJsZTsKCgkJLyogaGFyZHdhcmUgY2hhbm5lbCAqLwoJCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWw7CgoJCS8qIE9TUyBidWZmZXIgbWFuYWdlbWVudCBzdHVmZiAqLwoJCXZvaWQgKnJhd2J1ZjsKCQlkbWFfYWRkcl90IGRtYV9oYW5kbGU7CgkJdW5zaWduZWQgYnVmb3JkZXI7CgkJdW5zaWduZWQgbnVtZnJhZzsKCQl1bnNpZ25lZCBmcmFnc2hpZnQ7CgoJCS8qIG91ciBidWZmZXIgYWN0cyBsaWtlIGEgY2lyY3VsYXIgcmluZyAqLwoJCXVuc2lnbmVkIGh3cHRyOwkvKiB3aGVyZSBkbWEgbGFzdCBzdGFydGVkLCB1cGRhdGVkIGJ5IHVwZGF0ZV9wdHIgKi8KCQl1bnNpZ25lZCBzd3B0cjsJLyogd2hlcmUgZHJpdmVyIGxhc3QgY2xlYXIvZmlsbGVkLCB1cGRhdGVkIGJ5IHJlYWQvd3JpdGUgKi8KCQlpbnQgY291bnQ7CS8qIGJ5dGVzIHRvIGJlIGNvbXN1bWVkIG9yIGJlZW4gZ2VuZXJhdGVkIGJ5IGRtYSBtYWNoaW5lICovCgkJdW5zaWduZWQgdG90YWxfYnl0ZXM7CS8qIHRvdGFsIGJ5dGVzIGRtYWVkIGJ5IGhhcmR3YXJlICovCgoJCXVuc2lnbmVkIGVycm9yOwkvKiBudW1iZXIgb2Ygb3Zlci91bmRlcnJ1bnMgKi8KICAgICAgICAgICAgICAgIC8qIHB1dCBwcm9jZXNzIG9uIHdhaXQgcXVldWUgd2hlbiBubyBtb3JlIHNwYWNlIGluIGJ1ZmZlciAqLwoJCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CQoKCQkvKiByZWR1bmRhbnQsIGJ1dCBtYWtlcyBjYWxjdWxhdGlvbnMgZWFzaWVyICovCgkJdW5zaWduZWQgZnJhZ3NpemU7CgkJdW5zaWduZWQgZG1hc2l6ZTsKCQl1bnNpZ25lZCBmcmFnc2FtcGxlczsKCgkJLyogT1NTIHN0dWZmICovCgkJdW5zaWduZWQgbWFwcGVkOjE7CgkJdW5zaWduZWQgcmVhZHk6MTsKCQl1bnNpZ25lZCBlbmRjbGVhcmVkOjE7CgkJdW5zaWduZWQgdXBkYXRlX2ZsYWc7CgkJdW5zaWduZWQgb3NzZnJhZ3NoaWZ0OwoJCWludCBvc3NtYXhmcmFnczsKCQl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKCgl9IGRtYWJ1ZjsKCgkvKiA1LjEgY2hhbm5lbHMgKi8KCXN0cnVjdCB0cmlkZW50X3N0YXRlICpvdGhlcl9zdGF0ZXNbNF07CglpbnQgbXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50OwoJdW5zaWduZWQgY2hhbnNfbnVtOwoJdW5zaWduZWQgbG9uZyBmbXRfZmxhZzsKCS8qIEd1YXJkIGFnYWluc3QgbW1hcC93cml0ZS9yZWFkIHJhY2VzICovCglzdHJ1Y3QgbXV0ZXggc2VtOwoKfTsKCi8qIGhhcmR3YXJlIGNoYW5uZWxzICovCnN0cnVjdCB0cmlkZW50X2NoYW5uZWwgewoJaW50IG51bTsgLyogY2hhbm5lbCBudW1iZXIgKi8KCXUzMiBsYmE7IC8qIExvb3AgQmVnaW5lIEFkZHJlc3MsIHdoZXJlIGRtYSBidWZmZXIgc3RhcnRzICovCgl1MzIgZXNvOyAvKiBFbmQgU2FtcGxlIE9mZnNldCwgd2VocmUgZG1hIGJ1ZmZlciBlbmRzICovIAoJICAgICAgICAgLyogKGluIHRoZSB1bml0IG9mIHNhbXBsZXMpICovCgl1MzIgZGVsdGE7IC8qIGRlbHRhIHZhbHVlLCBzYW1wbGUgcmF0ZSAvIDQ4ayBmb3IgcGxheWJhY2ssICovCgkgICAgICAgICAgIC8qIDQ4ay9zYW1wbGUgcmF0ZSBmb3IgcmVjb3JkaW5nICovCgl1MTYgYXR0cmlidXRlOyAvKiBjb250cm9sIHdoZXJlIFBDTSBkYXRhIGdvIGFuZCBjb21lICAqLwoJdTE2IGZtX3ZvbDsKCXUzMiBjb250cm9sOyAvKiBzaWduZWQvdW5zaWduZWQsIDgvMTYgYml0cywgbW9uby9zdGVyZW8gKi8KfTsKCnN0cnVjdCB0cmlkZW50X3BjbV9iYW5rX2FkZHJlc3MgewoJdTMyIHN0YXJ0OwoJdTMyIHN0b3A7Cgl1MzIgYWludDsKCXUzMiBhaW50X2VuOwp9OwoKc3RhdGljIHN0cnVjdCB0cmlkZW50X3BjbV9iYW5rX2FkZHJlc3MgYmFua19hX2FkZHJzID0gewoJVDREX1NUQVJUX0EsCglUNERfU1RPUF9BLAoJVDREX0FJTlRfQSwKCVQ0RF9BSU5URU5fQQp9OwoKc3RhdGljIHN0cnVjdCB0cmlkZW50X3BjbV9iYW5rX2FkZHJlc3MgYmFua19iX2FkZHJzID0gewoJVDREX1NUQVJUX0IsCglUNERfU1RPUF9CLAoJVDREX0FJTlRfQiwKCVQ0RF9BSU5URU5fQgp9OwoKc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgewoJLyogcmVnaXN0ZXIgYWRkcmVzc2VzIHRvIGNvbnRyb2wgYmFuayBvcGVyYXRpb25zICovCglzdHJ1Y3QgdHJpZGVudF9wY21fYmFua19hZGRyZXNzICphZGRyZXNzZXM7CgkvKiBlYWNoIGJhbmsgaGFzIDMyIGNoYW5uZWxzICovCgl1MzIgYml0bWFwOwkJLyogY2hhbm5lbCBhbGxvY2F0aW9uIGJpdG1hcCAqLwoJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCBjaGFubmVsc1szMl07Cn07CgpzdHJ1Y3QgdHJpZGVudF9jYXJkIHsKCXVuc2lnbmVkIGludCBtYWdpYzsKCgkvKiBXZSBrZWVwIHRyaWRlbnQgY2FyZHMgaW4gYSBsaW5rZWQgbGlzdCAqLwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqbmV4dDsKCgkvKiBzaW5nbGUgb3BlbiBsb2NrIG1lY2hhbmlzbSwgb25seSB1c2VkIGZvciByZWNvcmRpbmcgKi8KCXN0cnVjdCBtdXRleCBvcGVuX211dGV4OwoKCS8qIFRoZSB0cmlkZW50IGhhcyBhIGNlcnRhaW4gYW1vdW50IG9mIGNyb3NzIGNoYW5uZWwgaW50ZXJhY3Rpb24KCSAgIHNvIHdlIHVzZSBhIHNpbmdsZSBwZXIgY2FyZCBsb2NrICovCglzcGlubG9ja190IGxvY2s7CgoJLyogUENJIGRldmljZSBzdHVmZiAqLwoJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7Cgl1MTYgcGNpX2lkOwoJdTggcmV2aXNpb247CgoJLyogc291bmRjb3JlIHN0dWZmICovCglpbnQgZGV2X2F1ZGlvOwoKCS8qIHN0cnVjdHVyZXMgZm9yIGFic3RyYWN0aW9uIG9mIGhhcmR3YXJlIGZhY2lsaXRpZXMsIGNvZGVjcywgKi8gCgkvKiBiYW5rcyBhbmQgY2hhbm5lbHMgKi8KCXN0cnVjdCBhYzk3X2NvZGVjICphYzk3X2NvZGVjW05SX0FDOTddOwoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgYmFua3NbTlJfQkFOS1NdOwoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlc1tOUl9IV19DSF07CgoJLyogaGFyZHdhcmUgcmVzb3VyY2VzICovCgl1bnNpZ25lZCBsb25nIGlvYmFzZTsKCXUzMiBpcnE7CgoJLyogRnVuY3Rpb24gc3VwcG9ydCAqLwoJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqKCphbGxvY19wY21fY2hhbm5lbCkgKHN0cnVjdCB0cmlkZW50X2NhcmQgKik7CglzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICooKmFsbG9jX3JlY19wY21fY2hhbm5lbCkgKHN0cnVjdCB0cmlkZW50X2NhcmQgKik7Cgl2b2lkICgqZnJlZV9wY21fY2hhbm5lbCkgKHN0cnVjdCB0cmlkZW50X2NhcmQgKiwgdW5zaWduZWQgaW50IGNoYW4pOwoJdm9pZCAoKmFkZHJlc3NfaW50ZXJydXB0KSAoc3RydWN0IHRyaWRlbnRfY2FyZCAqKTsKCgkvKiBBZGRlZCBieSBNYXR0IFd1IDAxLTA1LTIwMDEgZm9yIHNwZGlmIGluICovCglpbnQgbXVsdGlfY2hhbm5lbF91c2VfY291bnQ7CglpbnQgcmVjX2NoYW5uZWxfdXNlX2NvdW50OwoJdTE2IG1peGVyX3JlZ3NbNjRdW05SX0FDOTddOwkvKiBNYWRlIGNhcmQgbG9jYWwgYnkgQWxhbiAqLwoJaW50IG1peGVyX3JlZ3NfcmVhZHk7CgoJLyogQWRkZWQgZm9yIGhhcmR3YXJlIHZvbHVtZSBjb250cm9sICovCglpbnQgaHd2b2xjdGw7CglzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKCgkvKiBHYW1lIHBvcnQgc3VwcG9ydCAqLwoJc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydDsKfTsKCmVudW0gZG1hYnVmX21vZGUgewoJRE1fUExBWUJBQ0sgPSAwLAoJRE1fUkVDT1JECn07CgovKiB0YWJsZSB0byBtYXAgZnJvbSBDSEFOTkVMTUFTSyB0byBjaGFubmVsIGF0dHJpYnV0ZSBmb3IgU2lTIDcwMTggKi8Kc3RhdGljIHUxNiBtYXNrMmF0dHJbXSA9IHsKCVBDTV9MUiwgUENNX0xSLCBTVVJSX0xSLCBDRU5URVJfTEZFLAoJSFNFVCwgTUlDLCBNT0RFTV9MSU5FMSwgTU9ERU1fTElORTIsCglJMlNfTFIsIFNQRElGX0xSCn07CgovKiB0YWJsZSB0byBtYXAgZnJvbSBjaGFubmVsIGF0dHJpYnV0ZSB0byBDSEFOTkVMTUFTSyBmb3IgU2lTIDcwMTggKi8Kc3RhdGljIGludCBhdHRyMm1hc2tbXSA9IHsKCURTUF9CSU5EX01PREVNMSwgRFNQX0JJTkRfTU9ERU0yLCBEU1BfQklORF9GUk9OVCwgRFNQX0JJTkRfSEFORFNFVCwKCURTUF9CSU5EX0kyUywgRFNQX0JJTkRfQ0VOVEVSX0xGRSwgRFNQX0JJTkRfU1VSUiwgRFNQX0JJTkRfU1BESUYKfTsKCi8qIEFkZGVkIGJ5IE1hdHQgV3UgMDEtMDUtMjAwMSBmb3Igc3BkaWYgaW4gKi8Kc3RhdGljIGludCBhbGlfY2xvc2VfbXVsdGlfY2hhbm5lbHModm9pZCk7CnN0YXRpYyB2b2lkIGFsaV9kZWxheShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgaW50ZXJ2YWwpOwpzdGF0aWMgdm9pZCBhbGlfZGV0ZWN0X3NwZGlmX3JhdGUoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCk7CgpzdGF0aWMgdm9pZCBhbGlfYWM5N193cml0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZywgdTE2IHZhbCk7CnN0YXRpYyB1MTYgYWxpX2FjOTdfcmVhZChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZyk7CgpzdGF0aWMgc3RydWN0IHRyaWRlbnRfY2FyZCAqZGV2czsKCnN0YXRpYyB2b2lkIHRyaWRlbnRfYWM5N19zZXQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcsIHUxNiB2YWwpOwpzdGF0aWMgdTE2IHRyaWRlbnRfYWM5N19nZXQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcpOwoKc3RhdGljIGludCB0cmlkZW50X29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKc3RhdGljIGludCB0cmlkZW50X2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgCgkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CgpzdGF0aWMgdm9pZCBhbGlfYWM5N19zZXQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IHNlY29uZGFyeSwgdTggcmVnLCB1MTYgdmFsKTsKc3RhdGljIHUxNiBhbGlfYWM5N19nZXQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IHNlY29uZGFyeSwgdTggcmVnKTsKc3RhdGljIHZvaWQgYWxpX3NldF9zcGRpZl9vdXRfcmF0ZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgcmF0ZSk7CnN0YXRpYyB2b2lkIGFsaV9lbmFibGVfc3BlY2lhbF9jaGFubmVsKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0KTsKc3RhdGljIHN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmFsaV9hbGxvY19yZWNfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCk7CnN0YXRpYyBzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICphbGlfYWxsb2NfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCk7CnN0YXRpYyB2b2lkIGFsaV9mcmVlX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKTsKc3RhdGljIGludCBhbGlfc2V0dXBfbXVsdGlfY2hhbm5lbHMoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IGNoYW5fbnVtcyk7CnN0YXRpYyB1bnNpZ25lZCBpbnQgYWxpX2dldF9zcGRpZl9pbl9yYXRlKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpOwpzdGF0aWMgdm9pZCBhbGlfc2V0dXBfc3BkaWZfaW4oc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCk7CnN0YXRpYyB2b2lkIGFsaV9kaXNhYmxlX3NwZGlmX2luKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpOwpzdGF0aWMgdm9pZCBhbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IGNoKTsKc3RhdGljIHZvaWQgYWxpX3NldHVwX3NwZGlmX291dChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgZmxhZyk7CnN0YXRpYyBpbnQgYWxpX3dyaXRlXzVfMShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsCgkJCSBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCAKCQkJIGludCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIHVuc2lnbmVkIGludCAqY29weV9jb3VudCwgCgkJCSB1bnNpZ25lZCBpbnQgKnN0YXRlX2NudCk7CnN0YXRpYyBpbnQgYWxpX2FsbG9jYXRlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLCAKCQkJCQkgICAgICAgaW50IGNoYW5fbnVtcyk7CnN0YXRpYyB2b2lkIGFsaV9mcmVlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKTsKCiNkZWZpbmUgc2Vla19vZmZzZXQoZG1hX3B0ciwgYnVmZmVyLCBjbnQsIG9mZnNldCwgY29weV9jb3VudCkJZG8geyBcCiAgICAgICAgKGRtYV9wdHIpICs9IChvZmZzZXQpOwkgIFwKCShidWZmZXIpICs9IChvZmZzZXQpOwkgIFwKICAgICAgICAoY250KSAtPSAob2Zmc2V0KTsJICBcCgkoY29weV9jb3VudCkgKz0gKG9mZnNldCk7IFwKfSB3aGlsZSAoMCkKCnN0YXRpYyBpbmxpbmUgaW50IGxvY2tfc2V0X2ZtdChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSogc3RhdGUpCnsKCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZzdGF0ZS0+Zm10X2ZsYWcpKQoJCXJldHVybiAtRUZBVUxUOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgdW5sb2NrX3NldF9mbXQoc3RydWN0IHRyaWRlbnRfc3RhdGUqIHN0YXRlKQp7CgljbGVhcl9iaXQoMCwgJnN0YXRlLT5mbXRfZmxhZyk7Cn0KCnN0YXRpYyBpbnQKdHJpZGVudF9lbmFibGVfbG9vcF9pbnRlcnJ1cHRzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXUzMiBnbG9iYWxfY29udHJvbDsKCglnbG9iYWxfY29udHJvbCA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOwoKCXN3aXRjaCAoY2FyZC0+cGNpX2lkKSB7CgljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKCQlnbG9iYWxfY29udHJvbCB8PSAoRU5ETFBfSUUgfCBNSURMUF9JRSB8IEJBTktfQl9FTik7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTE6CgljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFg6CgljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfTlg6CgljYXNlIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTA6CgkJZ2xvYmFsX2NvbnRyb2wgfD0gKEVORExQX0lFIHwgTUlETFBfSUUpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gMDsKCX0KCglvdXRsKGdsb2JhbF9jb250cm9sLCBUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOwoKCXByX2RlYnVnKCJ0cmlkZW50OiBFbmFibGUgTG9vcCBJbnRlcnJ1cHRzLCBnbG9iY3RsID0gMHglMDhYXG4iLAoJCSBpbmwoVFJJRF9SRUcoY2FyZCwgVDREX0xGT19HQ19DSVIpKSk7CgoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQKdHJpZGVudF9kaXNhYmxlX2xvb3BfaW50ZXJydXB0cyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1MzIgZ2xvYmFsX2NvbnRyb2w7CgoJZ2xvYmFsX2NvbnRyb2wgPSBpbmwoVFJJRF9SRUcoY2FyZCwgVDREX0xGT19HQ19DSVIpKTsKCWdsb2JhbF9jb250cm9sICY9IH4oRU5ETFBfSUUgfCBNSURMUF9JRSk7CglvdXRsKGdsb2JhbF9jb250cm9sLCBUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOwoKCXByX2RlYnVnKCJ0cmlkZW50OiBEaXNhYmxlZCBMb29wIEludGVycnVwdHMsIGdsb2JjdGwgPSAweCUwOFhcbiIsCgkJIGdsb2JhbF9jb250cm9sKTsKCglyZXR1cm4gMTsKfQoKc3RhdGljIHZvaWQKdHJpZGVudF9lbmFibGVfdm9pY2VfaXJxKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQp7Cgl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKCXN0cnVjdCB0cmlkZW50X3BjbV9iYW5rICpiYW5rID0gJmNhcmQtPmJhbmtzW2NoYW5uZWwgPj4gNV07Cgl1MzIgcmVnLCBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5haW50X2VuOwoKCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7CglyZWcgfD0gbWFzazsKCW91dGwocmVnLCBUUklEX1JFRyhjYXJkLCBhZGRyKSk7CgojaWZkZWYgREVCVUcKCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7Cglwcl9kZWJ1ZygidHJpZGVudDogZW5hYmxlZCBJUlEgb24gY2hhbm5lbCAlZCwgJXMgPSAweCUwOHgoYWRkcjolWClcbiIsCgkJIGNoYW5uZWwsIGFkZHIgPT0gVDREX0FJTlRFTl9CID8gIkFJTlRFTl9CIiA6ICJBSU5URU5fQSIsCgkJIHJlZywgYWRkcik7CiNlbmRpZiAvKiBERUJVRyAqLwp9CgpzdGF0aWMgdm9pZAp0cmlkZW50X2Rpc2FibGVfdm9pY2VfaXJxKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQp7Cgl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKCXN0cnVjdCB0cmlkZW50X3BjbV9iYW5rICpiYW5rID0gJmNhcmQtPmJhbmtzW2NoYW5uZWwgPj4gNV07Cgl1MzIgcmVnLCBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5haW50X2VuOwoKCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7CglyZWcgJj0gfm1hc2s7CglvdXRsKHJlZywgVFJJRF9SRUcoY2FyZCwgYWRkcikpOwoKCS8qIEFjayB0aGUgY2hhbm5lbCBpbiBjYXNlIHRoZSBpbnRlcnJ1cHQgd2FzIHNldCBiZWZvcmUgd2UgZGlzYWJsZSBpdC4gKi8KCW91dGwobWFzaywgVFJJRF9SRUcoY2FyZCwgYmFuay0+YWRkcmVzc2VzLT5haW50KSk7CgojaWZkZWYgREVCVUcKCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7Cglwcl9kZWJ1ZygidHJpZGVudDogZGlzYWJsZWQgSVJRIG9uIGNoYW5uZWwgJWQsICVzID0gMHglMDh4KGFkZHI6JVgpXG4iLAoJCSBjaGFubmVsLCBhZGRyID09IFQ0RF9BSU5URU5fQiA/ICJBSU5URU5fQiIgOiAiQUlOVEVOX0EiLAoJCSByZWcsIGFkZHIpOwojZW5kaWYgLyogREVCVUcgKi8KfQoKc3RhdGljIHZvaWQKdHJpZGVudF9zdGFydF92b2ljZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IChjaGFubmVsICYgMHgxZik7CglzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsID4+IDVdOwoJdTMyIGFkZHIgPSBiYW5rLT5hZGRyZXNzZXMtPnN0YXJ0OwoKI2lmZGVmIERFQlVHCgl1MzIgcmVnOwojZW5kaWYgLyogREVCVUcgKi8KCglvdXRsKG1hc2ssIFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKCiNpZmRlZiBERUJVRwoJcmVnID0gaW5sKFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKCXByX2RlYnVnKCJ0cmlkZW50OiBzdGFydCB2b2ljZSBvbiBjaGFubmVsICVkLCAlcyA9IDB4JTA4eChhZGRyOiVYKVxuIiwKCQkgY2hhbm5lbCwgYWRkciA9PSBUNERfU1RBUlRfQiA/ICJTVEFSVF9CIiA6ICJTVEFSVF9BIiwKCQkgcmVnLCBhZGRyKTsKI2VuZGlmIC8qIERFQlVHICovCn0KCnN0YXRpYyB2b2lkCnRyaWRlbnRfc3RvcF92b2ljZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IChjaGFubmVsICYgMHgxZik7CglzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsID4+IDVdOwoJdTMyIGFkZHIgPSBiYW5rLT5hZGRyZXNzZXMtPnN0b3A7CgojaWZkZWYgREVCVUcKCXUzMiByZWc7CiNlbmRpZiAvKiBERUJVRyAqLwoKCW91dGwobWFzaywgVFJJRF9SRUcoY2FyZCwgYWRkcikpOwoKI2lmZGVmIERFQlVHCglyZWcgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcikpOwoJcHJfZGVidWcoInRyaWRlbnQ6IHN0b3Agdm9pY2Ugb24gY2hhbm5lbCAlZCwgJXMgPSAweCUwOHgoYWRkcjolWClcbiIsCgkJIGNoYW5uZWwsIGFkZHIgPT0gVDREX1NUT1BfQiA/ICJTVE9QX0IiIDogIlNUT1BfQSIsCgkJIHJlZywgYWRkcik7CiNlbmRpZiAvKiBERUJVRyAqLwp9CgpzdGF0aWMgdTMyCnRyaWRlbnRfZ2V0X2ludGVycnVwdF9tYXNrKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQp7CglzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsXTsKCXUzMiBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5haW50OwoJcmV0dXJuIGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7Cn0KCnN0YXRpYyBpbnQKdHJpZGVudF9jaGVja19jaGFubmVsX2ludGVycnVwdChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IChjaGFubmVsICYgMHgxZik7Cgl1MzIgcmVnID0gdHJpZGVudF9nZXRfaW50ZXJydXB0X21hc2soY2FyZCwgY2hhbm5lbCA+PiA1KTsKCiNpZmRlZiBERUJVRwoJaWYgKHJlZyAmIG1hc2spCgkJcHJfZGVidWcoInRyaWRlbnQ6IGNoYW5uZWwgJWQgaGFzIGludGVycnVwdCwgJXMgPSAweCUwOHhcbiIsCgkJCSBjaGFubmVsLCByZWcgPT0gVDREX0FJTlRfQiA/ICJBSU5UX0IiIDogIkFJTlRfQSIsCgkJCSByZWcpOwojZW5kaWYgLyogREVCVUcgKi8KCXJldHVybiAocmVnICYgbWFzaykgPyAxIDogMDsKfQoKc3RhdGljIHZvaWQKdHJpZGVudF9hY2tfY2hhbm5lbF9pbnRlcnJ1cHQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGNoYW5uZWwpCnsKCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCAoY2hhbm5lbCAmIDB4MWYpOwoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbmsgPSAmY2FyZC0+YmFua3NbY2hhbm5lbCA+PiA1XTsKCXUzMiByZWcsIGFkZHIgPSBiYW5rLT5hZGRyZXNzZXMtPmFpbnQ7CgoJcmVnID0gaW5sKFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKCXJlZyAmPSBtYXNrOwoJb3V0bChyZWcsIFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKCiNpZmRlZiBERUJVRwoJcmVnID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9BSU5UX0IpKTsKCXByX2RlYnVnKCJ0cmlkZW50OiBBY2sgY2hhbm5lbCAlZCBpbnRlcnJ1cHQsIEFJTlRfQiA9IDB4JTA4eFxuIiwKCQkgY2hhbm5lbCwgcmVnKTsKI2VuZGlmIC8qIERFQlVHICovCn0KCnN0YXRpYyBzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICoKdHJpZGVudF9hbGxvY19wY21fY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7CglzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuazsKCWludCBpZHg7CgoJYmFuayA9ICZjYXJkLT5iYW5rc1tCQU5LX0JdOwoKCWZvciAoaWR4ID0gMzE7IGlkeCA+PSAwOyBpZHgtLSkgewoJCWlmICghKGJhbmstPmJpdG1hcCAmICgxIDw8IGlkeCkpKSB7CgkJCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWwgPSAmYmFuay0+Y2hhbm5lbHNbaWR4XTsKCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgaWR4OwoJCQljaGFubmVsLT5udW0gPSBpZHggKyAzMjsKCQkJcmV0dXJuIGNoYW5uZWw7CgkJfQoJfQoKCS8qIG5vIG1vcmUgZnJlZSBjaGFubmVscyBhdmFpbGFibGUgKi8KCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogbm8gbW9yZSBjaGFubmVscyBhdmFpbGFibGUgb24gQmFuayBCLlxuIik7CglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHZvaWQKdHJpZGVudF9mcmVlX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQp7CglpbnQgYmFuazsKCXVuc2lnbmVkIGNoYXIgYjsKCglpZiAoY2hhbm5lbCA8IDMxIHx8IGNoYW5uZWwgPiA2MykKCQlyZXR1cm47CgoJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYIHx8IAoJICAgIGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YKSB7CgkJYiA9IGluYihUUklEX1JFRyhjYXJkLCBUNERfUkVDX0NIKSk7CgkJaWYgKChiICYgfjB4ODApID09IGNoYW5uZWwpCgkJCW91dGIoMHgwLCBUUklEX1JFRyhjYXJkLCBUNERfUkVDX0NIKSk7Cgl9CgoJYmFuayA9IGNoYW5uZWwgPj4gNTsKCWNoYW5uZWwgPSBjaGFubmVsICYgMHgxZjsKCgljYXJkLT5iYW5rc1tiYW5rXS5iaXRtYXAgJj0gfigxIDw8IChjaGFubmVsKSk7Cn0KCnN0YXRpYyBzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICoKY3liZXJfYWxsb2NfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CglpbnQgaWR4OwoKCS8qIFRoZSBjeWJlcnBybyA1MDUwIGhhcyBvbmx5IDMyIHZvaWNlcyBhbmQgb25lIGJhbmsgKi8KCS8qIC4uIGF0IGxlYXN0IHRoZXkgYXJlIG5vdCBkb2N1bWVudGVkIChpZiB5b3Ugd2FudCB0byBjYWxsIHRoYXQgCgkgKiBjcmFwIGRvY3VtZW50YXRpb24pLCBwZXJoYXBzIGJyb2tlbiA/ICovCgoJYmFuayA9ICZjYXJkLT5iYW5rc1tCQU5LX0FdOwoKCWZvciAoaWR4ID0gMzE7IGlkeCA+PSAwOyBpZHgtLSkgewoJCWlmICghKGJhbmstPmJpdG1hcCAmICgxIDw8IGlkeCkpKSB7CgkJCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWwgPSAmYmFuay0+Y2hhbm5lbHNbaWR4XTsKCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgaWR4OwoJCQljaGFubmVsLT5udW0gPSBpZHg7CgkJCXJldHVybiBjaGFubmVsOwoJCX0KCX0KCgkvKiBubyBtb3JlIGZyZWUgY2hhbm5lbHMgYXZhaWxhYmxlICovCglwcmludGsoS0VSTl9FUlIgImN5YmVycHJvNTA1MDogbm8gbW9yZSBjaGFubmVscyBhdmFpbGFibGUgb24gQmFuayBBLlxuIik7CglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHZvaWQKY3liZXJfZnJlZV9wY21fY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJaWYgKGNoYW5uZWwgPiAzMSkKCQlyZXR1cm47CgljYXJkLT5iYW5rc1tCQU5LX0FdLmJpdG1hcCAmPSB+KDEgPDwgKGNoYW5uZWwpKTsKfQoKc3RhdGljIGlubGluZSB2b2lkCmN5YmVyX291dGlkeChpbnQgcG9ydCwgaW50IGlkeCwgaW50IGRhdGEpCnsKCW91dGIoaWR4LCBwb3J0KTsKCW91dGIoZGF0YSwgcG9ydCArIDEpOwp9CgpzdGF0aWMgaW5saW5lIGludApjeWJlcl9pbmlkeChpbnQgcG9ydCwgaW50IGlkeCkKewoJb3V0YihpZHgsIHBvcnQpOwoJcmV0dXJuIGluYihwb3J0ICsgMSk7Cn0KCnN0YXRpYyBpbnQKY3liZXJfaW5pdF9yaXR1YWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJLyogc29tZSBibGFjayBtYWdpYywgdGFrZW4gZnJvbSBTREsgc2FtcGxlcyAqLwoJLyogcmVtb3ZlIHRoaXMgYW5kIG5vdGhpbmcgd2lsbCB3b3JrICovCglpbnQgcG9ydERhdDsKCWludCByZXQgPSAwOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCgkvKgoJICogICAgICBLZWVwIGludGVycnVwdHMgb2ZmIGZvciB0aGUgY29uZmlndXJlIC0gd2UgZG9uJ3Qgd2FudCB0bwoJICogICAgICBjbGFzaCB3aXRoIGFub3RoZXIgY3liZXJwcm8gY29uZmlnIGV2ZW50CgkgKi8KCglzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoJcG9ydERhdCA9IGN5YmVyX2luaWR4KENZQkVSX1BPUlRfQVVESU8sIENZQkVSX0lEWF9BVURJT19FTkFCTEUpOwoJLyogZW5hYmxlLCBpZiBpdCB3YXMgZGlzYWJsZWQgKi8KCWlmICgocG9ydERhdCAmIENZQkVSX0JNU0tfQVVFTlopICE9IENZQkVSX0JNU0tfQVVFTlpfRU5BQkxFKSB7CgkJcHJpbnRrKEtFUk5fSU5GTyAiY3liZXJwcm81MDUwOiBlbmFibGluZyBhdWRpbyBjb250cm9sbGVyXG4iKTsKCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgQ1lCRVJfSURYX0FVRElPX0VOQUJMRSwgCgkJCSAgICAgcG9ydERhdCB8IENZQkVSX0JNU0tfQVVFTlpfRU5BQkxFKTsKCQkvKiBjaGVjayBhZ2FpbiBpZiBoYXJkd2FyZSBpcyBlbmFibGVkIG5vdyAqLwoJCXBvcnREYXQgPSBjeWJlcl9pbmlkeChDWUJFUl9QT1JUX0FVRElPLCBDWUJFUl9JRFhfQVVESU9fRU5BQkxFKTsKCX0KCWlmICgocG9ydERhdCAmIENZQkVSX0JNU0tfQVVFTlopICE9IENZQkVSX0JNU0tfQVVFTlpfRU5BQkxFKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJjeWJlcnBybzUwNTA6IGluaXRBdWRpb0FjY2Vzczogbm8gc3VjY2Vzc1xuIik7CgkJcmV0ID0gLTE7Cgl9IGVsc2UgewoJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCBDWUJFUl9JRFhfSVJRX0VOQUJMRSwgCgkJCSAgICAgQ1lCRVJfQk1TS19BVURJT19JTlRfRU5BQkxFKTsKCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgMHhiZiwgMHgwMSk7CgkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIDB4YmEsIDB4MjApOwoJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCAweGJiLCAweDA4KTsKCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgMHhiZiwgMHgwMik7CgkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIDB4YjMsIDB4MDYpOwoJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCAweGJmLCAweDAwKTsKCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCXJldHVybiByZXQ7Cn0KCi8qICBjYWxsZWQgd2l0aCBzcGluIGxvY2sgaGVsZCAqLwoKc3RhdGljIGludAp0cmlkZW50X2xvYWRfY2hhbm5lbF9yZWdpc3RlcnMoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdTMyICogZGF0YSwgCgkJCSAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJaW50IGk7CgoJaWYgKGNoYW5uZWwgPiA2MykKCQlyZXR1cm4gMDsKCgkvKiBzZWxlY3QgaGFyZHdhcmUgY2hhbm5lbCB0byB3cml0ZSAqLwoJb3V0YihjaGFubmVsLCBUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOwoKCS8qIE91dHB1dCB0aGUgY2hhbm5lbCByZWdpc3RlcnMsIGJ1dCBkb24ndCB3cml0ZSByZWdpc3RlcgoJICAgdGhyZWUgdG8gYW4gQUxJIGNoaXAuICovCglmb3IgKGkgPSAwOyBpIDwgQ0hBTk5FTF9SRUdTOyBpKyspIHsKCQlpZiAoaSA9PSAzICYmIGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKQoJCQljb250aW51ZTsKCQlvdXRsKGRhdGFbaV0sIFRSSURfUkVHKGNhcmQsIENIQU5ORUxfU1RBUlQgKyA0ICogaSkpOwoJfQoJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxIHx8IAoJICAgIGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwKSB7CgkJb3V0bChBTElfRU1PRF9TdGlsbCwgVFJJRF9SRUcoY2FyZCwgQUxJX0VCVUYxKSk7CgkJb3V0bChBTElfRU1PRF9TdGlsbCwgVFJJRF9SRUcoY2FyZCwgQUxJX0VCVUYyKSk7Cgl9CglyZXR1cm4gMTsKfQoKLyogY2FsbGVkIHdpdGggc3BpbiBsb2NrIGhlbGQgKi8Kc3RhdGljIGludAp0cmlkZW50X3dyaXRlX3ZvaWNlX3JlZ3Moc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7Cgl1bnNpZ25lZCBpbnQgZGF0YVtDSEFOTkVMX1JFR1MgKyAxXTsKCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWw7CgoJY2hhbm5lbCA9IHN0YXRlLT5kbWFidWYuY2hhbm5lbDsKCglkYXRhWzFdID0gY2hhbm5lbC0+bGJhOwoJZGF0YVs0XSA9IGNoYW5uZWwtPmNvbnRyb2w7CgoJc3dpdGNoIChzdGF0ZS0+Y2FyZC0+cGNpX2lkKSB7CgljYXNlIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTE6CgkJZGF0YVswXSA9IDA7CS8qIEN1cnJlbnQgU2FtcGxlIE9mZnNldCAqLwoJCWRhdGFbMl0gPSAoY2hhbm5lbC0+ZXNvIDw8IDE2KSB8IChjaGFubmVsLT5kZWx0YSAmIDB4ZmZmZik7CgkJZGF0YVszXSA9IDA7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MDoKCQlkYXRhWzBdID0gMDsJLyogQ3VycmVudCBTYW1wbGUgT2Zmc2V0ICovCgkJZGF0YVsyXSA9IChjaGFubmVsLT5lc28gPDwgMTYpIHwgKGNoYW5uZWwtPmRlbHRhICYgMHhmZmZmKTsKCQlkYXRhWzNdID0gKGNoYW5uZWwtPmF0dHJpYnV0ZSA8PCAxNikgfCAoY2hhbm5lbC0+Zm1fdm9sICYgMHhmZmZmKTsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWDoKCQlkYXRhWzBdID0gMDsJLyogQ3VycmVudCBTYW1wbGUgT2Zmc2V0ICovCgkJZGF0YVsyXSA9IChjaGFubmVsLT5lc28gPDwgMTYpIHwgKGNoYW5uZWwtPmRlbHRhICYgMHhmZmZmKTsKCQlkYXRhWzNdID0gY2hhbm5lbC0+Zm1fdm9sICYgMHhmZmZmOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgoJCWRhdGFbMF0gPSAoY2hhbm5lbC0+ZGVsdGEgPDwgMjQpOwoJCWRhdGFbMl0gPSAoKGNoYW5uZWwtPmRlbHRhIDw8IDE2KSAmIDB4ZmYwMDAwMDApIHwgCgkJCShjaGFubmVsLT5lc28gJiAweDAwZmZmZmZmKTsKCQlkYXRhWzNdID0gY2hhbm5lbC0+Zm1fdm9sICYgMHhmZmZmOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gMDsKCX0KCglyZXR1cm4gdHJpZGVudF9sb2FkX2NoYW5uZWxfcmVnaXN0ZXJzKHN0YXRlLT5jYXJkLCBkYXRhLCBjaGFubmVsLT5udW0pOwp9CgpzdGF0aWMgaW50CmNvbXB1dGVfcmF0ZV9wbGF5KHUzMiByYXRlKQp7CglpbnQgZGVsdGE7CgkvKiBXZSBzcGVjaWFsIGNhc2UgNDQxMDAgYW5kIDgwMDAgc2luY2Ugcm91bmRpbmcgd2l0aCB0aGUgZXF1YXRpb24KCSAgIGRvZXMgbm90IGdpdmUgdXMgYW4gYWNjdXJhdGUgZW5vdWdoIHZhbHVlLiBGb3IgMTEwMjUgYW5kIDIyMDUwCgkgICB0aGUgZXF1YXRpb24gZ2l2ZXMgdXMgdGhlIGJlc3QgYW5zd2VyLiBBbGwgb3RoZXIgZnJlcXVlbmNpZXMgd2lsbAoJICAgYWxzbyB1c2UgdGhlIGVxdWF0aW9uLiBKRFcgKi8KCWlmIChyYXRlID09IDQ0MTAwKQoJCWRlbHRhID0gMHhlYjM7CgllbHNlIGlmIChyYXRlID09IDgwMDApCgkJZGVsdGEgPSAweDJhYjsKCWVsc2UgaWYgKHJhdGUgPT0gNDgwMDApCgkJZGVsdGEgPSAweDEwMDA7CgllbHNlCgkJZGVsdGEgPSAoKChyYXRlIDw8IDEyKSArIHJhdGUpIC8gNDgwMDApICYgMHgwMDAwZmZmZjsKCXJldHVybiBkZWx0YTsKfQoKc3RhdGljIGludApjb21wdXRlX3JhdGVfcmVjKHUzMiByYXRlKQp7CglpbnQgZGVsdGE7CgoJaWYgKHJhdGUgPT0gNDQxMDApCgkJZGVsdGEgPSAweDExNmE7CgllbHNlIGlmIChyYXRlID09IDgwMDApCgkJZGVsdGEgPSAweDYwMDA7CgllbHNlIGlmIChyYXRlID09IDQ4MDAwKQoJCWRlbHRhID0gMHgxMDAwOwoJZWxzZQoJCWRlbHRhID0gKCg0ODAwMCA8PCAxMikgLyByYXRlKSAmIDB4MDAwMGZmZmY7CgoJcmV0dXJuIGRlbHRhOwp9CgovKiBzZXQgcGxheWJhY2sgc2FtcGxlIHJhdGUgKi8Kc3RhdGljIHVuc2lnbmVkIGludAp0cmlkZW50X3NldF9kYWNfcmF0ZShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGludCByYXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCglpZiAocmF0ZSA+IDQ4MDAwKQoJCXJhdGUgPSA0ODAwMDsKCWlmIChyYXRlIDwgNDAwMCkKCQlyYXRlID0gNDAwMDsKCglkbWFidWYtPnJhdGUgPSByYXRlOwoJZG1hYnVmLT5jaGFubmVsLT5kZWx0YSA9IGNvbXB1dGVfcmF0ZV9wbGF5KHJhdGUpOwoKCXRyaWRlbnRfd3JpdGVfdm9pY2VfcmVncyhzdGF0ZSk7CgoJcHJfZGVidWcoInRyaWRlbnQ6IGNhbGxlZCB0cmlkZW50X3NldF9kYWNfcmF0ZSA6IHJhdGUgPSAlZFxuIiwgcmF0ZSk7CgoJcmV0dXJuIHJhdGU7Cn0KCi8qIHNldCByZWNvcmRpbmcgc2FtcGxlIHJhdGUgKi8Kc3RhdGljIHVuc2lnbmVkIGludAp0cmlkZW50X3NldF9hZGNfcmF0ZShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGludCByYXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCglpZiAocmF0ZSA+IDQ4MDAwKQoJCXJhdGUgPSA0ODAwMDsKCWlmIChyYXRlIDwgNDAwMCkKCQlyYXRlID0gNDAwMDsKCglkbWFidWYtPnJhdGUgPSByYXRlOwoJZG1hYnVmLT5jaGFubmVsLT5kZWx0YSA9IGNvbXB1dGVfcmF0ZV9yZWMocmF0ZSk7CgoJdHJpZGVudF93cml0ZV92b2ljZV9yZWdzKHN0YXRlKTsKCglwcl9kZWJ1ZygidHJpZGVudDogY2FsbGVkIHRyaWRlbnRfc2V0X2FkY19yYXRlIDogcmF0ZSA9ICVkXG4iLCByYXRlKTsKCglyZXR1cm4gcmF0ZTsKfQoKLyogcHJlcGFyZSBjaGFubmVsIGF0dHJpYnV0ZXMgZm9yIHBsYXliYWNrICovCnN0YXRpYyB2b2lkCnRyaWRlbnRfcGxheV9zZXR1cChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCnsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbCA9IGRtYWJ1Zi0+Y2hhbm5lbDsKCgljaGFubmVsLT5sYmEgPSBkbWFidWYtPmRtYV9oYW5kbGU7CgljaGFubmVsLT5kZWx0YSA9IGNvbXB1dGVfcmF0ZV9wbGF5KGRtYWJ1Zi0+cmF0ZSk7CgoJY2hhbm5lbC0+ZXNvID0gZG1hYnVmLT5kbWFzaXplID4+IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07CgljaGFubmVsLT5lc28gLT0gMTsKCglpZiAoc3RhdGUtPmNhcmQtPnBjaV9pZCAhPSBQQ0lfREVWSUNFX0lEX1NJXzcwMTgpIHsKCQljaGFubmVsLT5hdHRyaWJ1dGUgPSAwOwoJCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKCQkJaWYgKChjaGFubmVsLT5udW0gPT0gQUxJX1NQRElGX0lOX0NIQU5ORUwpIHx8IAoJCQkgICAgKGNoYW5uZWwtPm51bSA9PSBBTElfUENNX0lOX0NIQU5ORUwpKQoJCQkJYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKHN0YXRlLT5jYXJkLCBjaGFubmVsLT5udW0pOwoJCQllbHNlIGlmICgoaW5sKFRSSURfUkVHKHN0YXRlLT5jYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKSAKCQkJCSAgJiBBTElfU1BESUZfT1VUX0NIX0VOQUJMRSkKCQkJCSAmJiAoY2hhbm5lbC0+bnVtID09IEFMSV9TUERJRl9PVVRfQ0hBTk5FTCkpIHsKCQkJCWFsaV9zZXRfc3BkaWZfb3V0X3JhdGUoc3RhdGUtPmNhcmQsIAoJCQkJCQkgICAgICAgc3RhdGUtPmRtYWJ1Zi5yYXRlKTsKCQkJCXN0YXRlLT5kbWFidWYuY2hhbm5lbC0+ZGVsdGEgPSAweDEwMDA7CgkJCX0KCQl9Cgl9CgoJY2hhbm5lbC0+Zm1fdm9sID0gMHgwOwoKCWNoYW5uZWwtPmNvbnRyb2wgPSBDSEFOTkVMX0xPT1A7CglpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgewoJCS8qIDE2LWJpdHMgKi8KCQljaGFubmVsLT5jb250cm9sIHw9IENIQU5ORUxfMTZCSVRTOwoJCS8qIHNpZ25lZCAqLwoJCWNoYW5uZWwtPmNvbnRyb2wgfD0gQ0hBTk5FTF9TSUdORUQ7Cgl9CglpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF9TVEVSRU8pCgkJLyogc3RlcmVvICovCgkJY2hhbm5lbC0+Y29udHJvbCB8PSBDSEFOTkVMX1NURVJFTzsKCglwcl9kZWJ1ZygidHJpZGVudDogdHJpZGVudF9wbGF5X3NldHVwLCBMQkEgPSAweCUwOHgsIERlbHRhID0gMHglMDh4LCAiCgkJICJFU08gPSAweCUwOHgsIENvbnRyb2wgPSAweCUwOHhcbiIsIGNoYW5uZWwtPmxiYSwKCQkgY2hhbm5lbC0+ZGVsdGEsIGNoYW5uZWwtPmVzbywgY2hhbm5lbC0+Y29udHJvbCk7CgoJdHJpZGVudF93cml0ZV92b2ljZV9yZWdzKHN0YXRlKTsKfQoKLyogcHJlcGFyZSBjaGFubmVsIGF0dHJpYnV0ZXMgZm9yIHJlY29yZGluZyAqLwpzdGF0aWMgdm9pZAp0cmlkZW50X3JlY19zZXR1cChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCnsKCXUxNiB3OwoJdTggYnZhbDsKCglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWwgPSBkbWFidWYtPmNoYW5uZWw7Cgl1bnNpZ25lZCBpbnQgcmF0ZTsKCgkvKiBFbmFibGUgQUMtOTcgQURDIChjYXB0dXJlKSAqLwoJc3dpdGNoIChjYXJkLT5wY2lfaWQpIHsKCWNhc2UgUENJX0RFVklDRV9JRF9BTElfNTQ1MToKCQlhbGlfZW5hYmxlX3NwZWNpYWxfY2hhbm5lbChzdGF0ZSk7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKCQkvKiBmb3IgNzAxOCwgdGhlIGFjOTcgaXMgYWx3YXlzIGluIHBsYXliYWNrL3JlY29yZCAoZHVwbGV4KSBtb2RlICovCgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFg6CgkJdyA9IGluYihUUklEX1JFRyhjYXJkLCBEWF9BQ1IyX0FDOTdfQ09NX1NUQVQpKTsKCQlvdXRiKHcgfCAweDQ4LCBUUklEX1JFRyhjYXJkLCBEWF9BQ1IyX0FDOTdfQ09NX1NUQVQpKTsKCQkvKiBlbmFibGUgYW5kIHNldCByZWNvcmQgY2hhbm5lbCAqLwoJCW91dGIoMHg4MCB8IGNoYW5uZWwtPm51bSwgVFJJRF9SRUcoY2FyZCwgVDREX1JFQ19DSCkpOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgoJCXcgPSBpbncoVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKCQlvdXR3KHcgfCAweDEwMDAsIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CgkJLyogZW5hYmxlIGFuZCBzZXQgcmVjb3JkIGNoYW5uZWwgKi8KCQlvdXRiKDB4ODAgfCBjaGFubmVsLT5udW0sIFRSSURfUkVHKGNhcmQsIFQ0RF9SRUNfQ0gpKTsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MDoKCQkvKiBkb24ndCBrbm93IHlldCwgdXNpbmcgc3BlY2lhbCBjaGFubmVsIDIyIGluIEdDMSgweGQ0KT8gKi8KCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuOwoJfQoKCWNoYW5uZWwtPmxiYSA9IGRtYWJ1Zi0+ZG1hX2hhbmRsZTsKCWNoYW5uZWwtPmRlbHRhID0gY29tcHV0ZV9yYXRlX3JlYyhkbWFidWYtPnJhdGUpOwoJaWYgKChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgJiYgCgkgICAgKGNoYW5uZWwtPm51bSA9PSBBTElfU1BESUZfSU5fQ0hBTk5FTCkpIHsKCQlyYXRlID0gYWxpX2dldF9zcGRpZl9pbl9yYXRlKGNhcmQpOwoJCWlmIChyYXRlID09IDApIHsKCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidHJpZGVudDogQUxpIDU0NTEgIgoJCQkgICAgICAgIlMvUERJRiBpbnB1dCBzZXR1cCBlcnJvciFcbiIpOwoJCQlyYXRlID0gNDgwMDA7CgkJfQoJCWJ2YWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCQlpZiAoYnZhbCAmIDB4MTApIHsKCQkJb3V0YihidmFsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwoJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0cmlkZW50OiBjbGVhcmVkIEFMaSAiCgkJCSAgICAgICAiNTQ1MSBTL1BESUYgcGFyaXR5IGVycm9yIGZsYWcuXG4iKTsKCQl9CgoJCWlmIChyYXRlICE9IDQ4MDAwKQoJCQljaGFubmVsLT5kZWx0YSA9ICgocmF0ZSA8PCAxMikgLyBkbWFidWYtPnJhdGUpICYgMHgwMDAwZmZmZjsKCX0KCgljaGFubmVsLT5lc28gPSBkbWFidWYtPmRtYXNpemUgPj4gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKCWNoYW5uZWwtPmVzbyAtPSAxOwoKCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkICE9IFBDSV9ERVZJQ0VfSURfU0lfNzAxOCkgewoJCWNoYW5uZWwtPmF0dHJpYnV0ZSA9IDA7Cgl9CgoJY2hhbm5lbC0+Zm1fdm9sID0gMHgwOwoKCWNoYW5uZWwtPmNvbnRyb2wgPSBDSEFOTkVMX0xPT1A7CglpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgewoJCS8qIDE2LWJpdHMgKi8KCQljaGFubmVsLT5jb250cm9sIHw9IENIQU5ORUxfMTZCSVRTOwoJCS8qIHNpZ25lZCAqLwoJCWNoYW5uZWwtPmNvbnRyb2wgfD0gQ0hBTk5FTF9TSUdORUQ7Cgl9CglpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF9TVEVSRU8pCgkJLyogc3RlcmVvICovCgkJY2hhbm5lbC0+Y29udHJvbCB8PSBDSEFOTkVMX1NURVJFTzsKCglwcl9kZWJ1ZygidHJpZGVudDogdHJpZGVudF9yZWNfc2V0dXAsIExCQSA9IDB4JTA4eCwgRGVsYXQgPSAweCUwOHgsICIKCQkgIkVTTyA9IDB4JTA4eCwgQ29udHJvbCA9IDB4JTA4eFxuIiwgY2hhbm5lbC0+bGJhLAoJCSBjaGFubmVsLT5kZWx0YSwgY2hhbm5lbC0+ZXNvLCBjaGFubmVsLT5jb250cm9sKTsKCgl0cmlkZW50X3dyaXRlX3ZvaWNlX3JlZ3Moc3RhdGUpOwp9CgovKiBnZXQgY3VycmVudCBwbGF5YmFjay9yZWNvcmRpbmcgZG1hIGJ1ZmZlciBwb2ludGVyIChieXRlIG9mZnNldCBmcm9tIExCQSksCiAgIGNhbGxlZCB3aXRoIHNwaW5sb2NrIGhlbGQhICovCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQKdHJpZGVudF9nZXRfZG1hX2FkZHIoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXUzMiBjc287CgoJaWYgKCFkbWFidWYtPmVuYWJsZSkKCQlyZXR1cm4gMDsKCglvdXRiKGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtLCBUUklEX1JFRyhzdGF0ZS0+Y2FyZCwgVDREX0xGT19HQ19DSVIpKTsKCglzd2l0Y2ggKHN0YXRlLT5jYXJkLT5wY2lfaWQpIHsKCWNhc2UgUENJX0RFVklDRV9JRF9BTElfNTQ1MToKCWNhc2UgUENJX0RFVklDRV9JRF9TSV83MDE4OgoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYOgoJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwOgoJCS8qIDE2IGJpdHMgRVNPLCBDU08gZm9yIDcwMTggYW5kIERYICovCgkJY3NvID0gaW53KFRSSURfUkVHKHN0YXRlLT5jYXJkLCBDSF9EWF9DU09fQUxQSEFfRk1TICsgMikpOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgoJCS8qIDI0IGJpdHMgRVNPLCBDU08gZm9yIE5YICovCgkJY3NvID0gaW5sKFRSSURfUkVHKHN0YXRlLT5jYXJkLCBDSF9OWF9ERUxUQV9DU08pKSAmIDB4MDBmZmZmZmY7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVybiAwOwoJfQoKCXByX2RlYnVnKCJ0cmlkZW50OiB0cmlkZW50X2dldF9kbWFfYWRkcjogY2hpcCByZXBvcnRlZCBjaGFubmVsOiAlZCwgIgoJCSAiY3NvID0gMHglMDR4XG4iLCBkbWFidWYtPmNoYW5uZWwtPm51bSwgY3NvKTsKCgkvKiBFU08gYW5kIENTTyBhcmUgaW4gdW5pdHMgb2YgU2FtcGxlcywgY29udmVydCB0byBieXRlIG9mZnNldCAqLwoJY3NvIDw8PSBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwoKCXJldHVybiAoY3NvICUgZG1hYnVmLT5kbWFzaXplKTsKfQoKLyogU3RvcCByZWNvcmRpbmcgKGxvY2sgaGVsZCkgKi8Kc3RhdGljIGlubGluZSB2b2lkCl9fc3RvcF9hZGMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXVuc2lnbmVkIGludCBjaGFuX251bSA9IGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwoKCWRtYWJ1Zi0+ZW5hYmxlICY9IH5BRENfUlVOTklORzsKCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBjaGFuX251bSk7Cgl0cmlkZW50X2Rpc2FibGVfdm9pY2VfaXJxKGNhcmQsIGNoYW5fbnVtKTsKfQoKc3RhdGljIHZvaWQKc3RvcF9hZGMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CglfX3N0b3BfYWRjKHN0YXRlKTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKfQoKc3RhdGljIHZvaWQKc3RhcnRfYWRjKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKewoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cgl1bnNpZ25lZCBpbnQgY2hhbl9udW0gPSBkbWFidWYtPmNoYW5uZWwtPm51bTsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCWlmICgoZG1hYnVmLT5tYXBwZWQgfHwgCgkgICAgIGRtYWJ1Zi0+Y291bnQgPCAoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUpICYmIAoJICAgIGRtYWJ1Zi0+cmVhZHkpIHsKCQlkbWFidWYtPmVuYWJsZSB8PSBBRENfUlVOTklORzsKCQl0cmlkZW50X2VuYWJsZV92b2ljZV9pcnEoY2FyZCwgY2hhbl9udW0pOwoJCXRyaWRlbnRfc3RhcnRfdm9pY2UoY2FyZCwgY2hhbl9udW0pOwoJfQoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwp9CgovKiBzdG9wIHBsYXliYWNrIChsb2NrIGhlbGQpICovCnN0YXRpYyBpbmxpbmUgdm9pZApfX3N0b3BfZGFjKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKewoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cgl1bnNpZ25lZCBpbnQgY2hhbl9udW0gPSBkbWFidWYtPmNoYW5uZWwtPm51bTsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKCglkbWFidWYtPmVuYWJsZSAmPSB+REFDX1JVTk5JTkc7Cgl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgY2hhbl9udW0pOwoJaWYgKHN0YXRlLT5jaGFuc19udW0gPT0gNikgewoJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT4KCQkJCSAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzFdLT4KCQkJCSAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT4KCQkJCSAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT4KCQkJCSAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJfQoJdHJpZGVudF9kaXNhYmxlX3ZvaWNlX2lycShjYXJkLCBjaGFuX251bSk7Cn0KCnN0YXRpYyB2b2lkCnN0b3BfZGFjKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoJX19zdG9wX2RhYyhzdGF0ZSk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cn0KCnN0YXRpYyB2b2lkCnN0YXJ0X2RhYyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCnsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJdW5zaWduZWQgaW50IGNoYW5fbnVtID0gZG1hYnVmLT5jaGFubmVsLT5udW07CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CglpZiAoKGRtYWJ1Zi0+bWFwcGVkIHx8IGRtYWJ1Zi0+Y291bnQgPiAwKSAmJiBkbWFidWYtPnJlYWR5KSB7CgkJZG1hYnVmLT5lbmFibGUgfD0gREFDX1JVTk5JTkc7CgkJdHJpZGVudF9lbmFibGVfdm9pY2VfaXJxKGNhcmQsIGNoYW5fbnVtKTsKCQl0cmlkZW50X3N0YXJ0X3ZvaWNlKGNhcmQsIGNoYW5fbnVtKTsKCQlpZiAoc3RhdGUtPmNoYW5zX251bSA9PSA2KSB7CgkJCXRyaWRlbnRfc3RhcnRfdm9pY2UoY2FyZCwgc3RhdGUtPm90aGVyX3N0YXRlc1swXS0+CgkJCQkJICAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCQl0cmlkZW50X3N0YXJ0X3ZvaWNlKGNhcmQsIHN0YXRlLT5vdGhlcl9zdGF0ZXNbMV0tPgoJCQkJCSAgICBkbWFidWYuY2hhbm5lbC0+bnVtKTsKCQkJdHJpZGVudF9zdGFydF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT4KCQkJCQkgICAgZG1hYnVmLmNoYW5uZWwtPm51bSk7CgkJCXRyaWRlbnRfc3RhcnRfdm9pY2UoY2FyZCwgc3RhdGUtPm90aGVyX3N0YXRlc1szXS0+CgkJCQkJICAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCX0KCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKfQoKI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSICgxNS1QQUdFX1NISUZUKQojZGVmaW5lIERNQUJVRl9NSU5PUkRFUiAxCgovKiBhbGxvYyBhIERNQSBidWZmZXIgb2Ygd2l0aCBhIGJ1ZmZlciBvZiB0aGlzIG9yZGVyICovCnN0YXRpYyBpbnQKYWxsb2NfZG1hYnVmKHN0cnVjdCBkbWFidWYgKmRtYWJ1Ziwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGludCBvcmRlcikKewoJdm9pZCAqcmF3YnVmID0gTlVMTDsKCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKCglpZiAoIShyYXdidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBQQUdFX1NJWkUgPDwgb3JkZXIsIAoJCQkJCSAgICAmZG1hYnVmLT5kbWFfaGFuZGxlKSkpCgkJcmV0dXJuIC1FTk9NRU07CgoJcHJfZGVidWcoInRyaWRlbnQ6IGFsbG9jYXRlZCAlbGQgKG9yZGVyID0gJWQpIGJ5dGVzIGF0ICVwXG4iLAoJCSBQQUdFX1NJWkUgPDwgb3JkZXIsIG9yZGVyLCByYXdidWYpOwoKCWRtYWJ1Zi0+cmVhZHkgPSBkbWFidWYtPm1hcHBlZCA9IDA7CglkbWFidWYtPnJhd2J1ZiA9IHJhd2J1ZjsKCWRtYWJ1Zi0+YnVmb3JkZXIgPSBvcmRlcjsKCgkvKiBub3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSAqLyAKCS8qIHJlbWFwX3Bmbl9yYW5nZSBkb2Vzbid0IGRvIHdoYXQgd2Ugd2FudCAqLwoJcGVuZCA9IHZpcnRfdG9fcGFnZShyYXdidWYgKyAoUEFHRV9TSVpFIDw8IG9yZGVyKSAtIDEpOwoJZm9yIChwYWdlID0gdmlydF90b19wYWdlKHJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQoJCVNldFBhZ2VSZXNlcnZlZChwYWdlKTsKCglyZXR1cm4gMDsKfQoKLyogYWxsb2NhdGUgdGhlIG1haW4gRE1BIGJ1ZmZlciwgcGxheWJhY2sgYW5kIHJlY29yZGluZyBidWZmZXIgc2hvdWxkIGJlICovCi8qIGFsbG9jYXRlZCBzZXBhcmF0ZWx5ICovCnN0YXRpYyBpbnQKYWxsb2NfbWFpbl9kbWFidWYoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCWludCBvcmRlcjsKCWludCByZXQgPSAtRU5PTUVNOwoKCS8qIGFsbG9jIGFzIGJpZyBhIGNodW5rIGFzIHdlIGNhbiwgRklYTUU6IGlzIHRoaXMgbmVjZXNzYXJ5ID8/ICovCglmb3IgKG9yZGVyID0gRE1BQlVGX0RFRkFVTFRPUkRFUjsgb3JkZXIgPj0gRE1BQlVGX01JTk9SREVSOyBvcmRlci0tKSB7CgkJaWYgKCEocmV0ID0gYWxsb2NfZG1hYnVmKGRtYWJ1Ziwgc3RhdGUtPmNhcmQtPnBjaV9kZXYsIG9yZGVyKSkpCgkJCXJldHVybiAwOwoJCS8qIGVsc2UgdHJ5IGFnYWluICovCgl9CglyZXR1cm4gcmV0Owp9CgovKiBkZWFsbG9jYXRlIGEgRE1BIGJ1ZmZlciAqLwpzdGF0aWMgdm9pZApkZWFsbG9jX2RtYWJ1ZihzdHJ1Y3QgZG1hYnVmICpkbWFidWYsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQp7CglzdHJ1Y3QgcGFnZSAqcGFnZSwgKnBlbmQ7CgoJaWYgKGRtYWJ1Zi0+cmF3YnVmKSB7CgkJLyogdW5kbyBtYXJraW5nIHRoZSBwYWdlcyBhcyByZXNlcnZlZCAqLwoJCXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYgKyAoUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIpIC0gMSk7CgkJZm9yIChwYWdlID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCgkJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOwoJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGNpX2RldiwgUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIsIAoJCQkJICAgIGRtYWJ1Zi0+cmF3YnVmLCBkbWFidWYtPmRtYV9oYW5kbGUpOwoJCWRtYWJ1Zi0+cmF3YnVmID0gTlVMTDsKCX0KCWRtYWJ1Zi0+bWFwcGVkID0gZG1hYnVmLT5yZWFkeSA9IDA7Cn0KCnN0YXRpYyBpbnQKcHJvZ19kbWFidWYoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLCBlbnVtIGRtYWJ1Zl9tb2RlIHJlYykKewoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cgl1bnNpZ25lZCBieXRlcGVyc2VjOwoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnMgPSBzdGF0ZTsKCXVuc2lnbmVkIGJ1ZnNpemUsIGRtYV9udW1zOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWludCByZXQsIGksIG9yZGVyOwoKCWlmICgocmV0ID0gbG9ja19zZXRfZm10KHN0YXRlKSkgPCAwKQoJCXJldHVybiByZXQ7CgoJaWYgKHN0YXRlLT5jaGFuc19udW0gPT0gNikKCQlkbWFfbnVtcyA9IDU7CgllbHNlCgkJZG1hX251bXMgPSAxOwoKCWZvciAoaSA9IDA7IGkgPCBkbWFfbnVtczsgaSsrKSB7CgkJaWYgKGkgPiAwKSB7CgkJCXMgPSBzdGF0ZS0+b3RoZXJfc3RhdGVzW2kgLSAxXTsKCQkJZG1hYnVmID0gJnMtPmRtYWJ1ZjsKCQkJZG1hYnVmLT5mbXQgPSBzdGF0ZS0+ZG1hYnVmLmZtdDsKCQkJZG1hYnVmLT5yYXRlID0gc3RhdGUtPmRtYWJ1Zi5yYXRlOwoJCX0KCgkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlkbWFidWYtPmh3cHRyID0gZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOwoJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmVycm9yID0gMDsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CgoJCS8qIGFsbG9jYXRlIERNQSBidWZmZXIgaWYgbm90IGFsbG9jYXRlZCB5ZXQgKi8KCQlpZiAoIWRtYWJ1Zi0+cmF3YnVmKSB7CgkJCWlmIChpID09IDApIHsKCQkJCWlmICgocmV0ID0gYWxsb2NfbWFpbl9kbWFidWYoc3RhdGUpKSkgewoJCQkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCQkJCQlyZXR1cm4gcmV0OwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJcmV0ID0gLUVOT01FTTsKCQkJCW9yZGVyID0gc3RhdGUtPmRtYWJ1Zi5idWZvcmRlciAtIDE7CgkJCQlpZiAob3JkZXIgPj0gRE1BQlVGX01JTk9SREVSKSB7CgkJCQkJcmV0ID0gYWxsb2NfZG1hYnVmKGRtYWJ1ZiwKCQkJCQkJCSAgIHN0YXRlLT5jYXJkLT5wY2lfZGV2LAoJCQkJCQkJICAgb3JkZXIpOwoJCQkJfQoJCQkJaWYgKHJldCkgewoJCQkJCS8qIHJlbGVhc2UgdGhlIG1haW4gRE1BIGJ1ZmZlciAqLwoJCQkJCWRlYWxsb2NfZG1hYnVmKCZzdGF0ZS0+ZG1hYnVmLCBzdGF0ZS0+Y2FyZC0+cGNpX2Rldik7CgkJCQkJLyogcmVsZWFzZSB0aGUgYXV4aWxpYXJ5IERNQSBidWZmZXJzICovCgkJCQkJZm9yIChpIC09IDI7IGkgPj0gMDsgaS0tKQoJCQkJCQlkZWFsbG9jX2RtYWJ1Zigmc3RhdGUtPm90aGVyX3N0YXRlc1tpXS0+ZG1hYnVmLCAKCQkJCQkJCSAgICAgICBzdGF0ZS0+Y2FyZC0+cGNpX2Rldik7CgkJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgkJCX0KCQl9CgkJLyogRklYTUU6IGZpZ3VyZSBvdXQgYWxsIHRoaXMgT1NTIGZyYWdtZW50IHN0dWZmICovCgkJYnl0ZXBlcnNlYyA9IGRtYWJ1Zi0+cmF0ZSA8PCBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwoJCWJ1ZnNpemUgPSBQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcjsKCQlpZiAoZG1hYnVmLT5vc3NmcmFnc2hpZnQpIHsKCQkJaWYgKCgxMDAwIDw8IGRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0KSA8IGJ5dGVwZXJzZWMpCgkJCQlkbWFidWYtPmZyYWdzaGlmdCA9IGxkMihieXRlcGVyc2VjIC8gMTAwMCk7CgkJCWVsc2UKCQkJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0ID0gZG1hYnVmLT5vc3NmcmFnc2hpZnQ7CgkJfSBlbHNlIHsKCQkJLyogbGV0cyBoYW5kIG91dCByZWFzb25hYmxlIGJpZyBhc3MgYnVmZmVycyBieSBkZWZhdWx0ICovCgkJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0ID0gKGRtYWJ1Zi0+YnVmb3JkZXIgKyBQQUdFX1NISUZUIC0gMik7CgkJfQoJCWRtYWJ1Zi0+bnVtZnJhZyA9IGJ1ZnNpemUgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CgkJd2hpbGUgKGRtYWJ1Zi0+bnVtZnJhZyA8IDQgJiYgZG1hYnVmLT5mcmFnc2hpZnQgPiAzKSB7CgkJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0LS07CgkJCWRtYWJ1Zi0+bnVtZnJhZyA9IGJ1ZnNpemUgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CgkJfQoJCWRtYWJ1Zi0+ZnJhZ3NpemUgPSAxIDw8IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwoJCWlmIChkbWFidWYtPm9zc21heGZyYWdzID49IDQgJiYgZG1hYnVmLT5vc3NtYXhmcmFncyA8IGRtYWJ1Zi0+bnVtZnJhZykKCQkJZG1hYnVmLT5udW1mcmFnID0gZG1hYnVmLT5vc3NtYXhmcmFnczsKCQlkbWFidWYtPmZyYWdzYW1wbGVzID0gZG1hYnVmLT5mcmFnc2l6ZSA+PiBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwoJCWRtYWJ1Zi0+ZG1hc2l6ZSA9IGRtYWJ1Zi0+bnVtZnJhZyA8PCBkbWFidWYtPmZyYWdzaGlmdDsKCgkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwgCgkJICAgICAgIGRtYWJ1Zi0+ZG1hc2l6ZSk7CgoJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJaWYgKHJlYyA9PSBETV9SRUNPUkQpCgkJCXRyaWRlbnRfcmVjX3NldHVwKHMpOwoJCWVsc2UgLyogRE1fUExBWUJBQ0sgKi8KCQkJdHJpZGVudF9wbGF5X3NldHVwKHMpOwoKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CgoJCS8qIHNldCB0aGUgcmVhZHkgZmxhZyBmb3IgdGhlIGRtYSBidWZmZXIgKi8KCQlkbWFidWYtPnJlYWR5ID0gMTsKCgkJcHJfZGVidWcoInRyaWRlbnQ6IHByb2dfZG1hYnVmKCVkKSwgc2FtcGxlIHJhdGUgPSAlZCwgIgoJCQkgImZvcm1hdCA9ICVkLCBudW1mcmFnID0gJWQsIGZyYWdzaXplID0gJWQgIgoJCQkgImRtYXNpemUgPSAlZFxuIiwgZG1hYnVmLT5jaGFubmVsLT5udW0sCgkJCSBkbWFidWYtPnJhdGUsIGRtYWJ1Zi0+Zm10LCBkbWFidWYtPm51bWZyYWcsCgkJCSBkbWFidWYtPmZyYWdzaXplLCBkbWFidWYtPmRtYXNpemUpOwoJfQoJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgaW5saW5lIGludCBwcm9nX2RtYWJ1Zl9yZWNvcmQoc3RydWN0IHRyaWRlbnRfc3RhdGUqIHN0YXRlKQp7CglyZXR1cm4gcHJvZ19kbWFidWYoc3RhdGUsIERNX1JFQ09SRCk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IHByb2dfZG1hYnVmX3BsYXliYWNrKHN0cnVjdCB0cmlkZW50X3N0YXRlKiBzdGF0ZSkKewoJcmV0dXJuIHByb2dfZG1hYnVmKHN0YXRlLCBETV9QTEFZQkFDSyk7Cn0KCi8qIHdlIGFyZSBkb2luZyBxdWFudHVtIG1lY2hhbmljcyBoZXJlLCB0aGUgYnVmZmVyIGNhbiBvbmx5IGJlIGVtcHR5LCBoYWxmIG9yIGZ1bGwgZmlsbGVkIGkuZS4KICAgfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18ICAgb3IgICB8eHh4eHh4eHh4eHh4fC0tLS0tLS0tLS0tLXwgICBvciAgIHx4eHh4eHh4eHh4eHh8eHh4eHh4eHh4eHh4fAogICBidXQgd2UgYWxtb3N0IGFsd2F5cyBnZXQgdGhpcwogICB8eHh4eHh4LS0tLS0tfC0tLS0tLS0tLS0tLXwgICBvciAgIHx4eHh4eHh4eHh4eHh8eHh4eHgtLS0tLS0tfAogICBzbyB3ZSBoYXZlIHRvIGNsZWFyIHRoZSB0YWlsIHNwYWNlIHRvICJzaWxlbmNlIgogICB8eHh4eHh4MDAwMDAwfC0tLS0tLS0tLS0tLXwgICBvciAgIHx4eHh4eHh4eHh4eHh8eHh4eHh4MDAwMDAwfAoqLwpzdGF0aWMgdm9pZAp0cmlkZW50X2NsZWFyX3RhaWwoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXVuc2lnbmVkIHN3cHRyOwoJdW5zaWduZWQgY2hhciBzaWxlbmNlID0gKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpID8gMCA6IDB4ODA7Cgl1bnNpZ25lZCBpbnQgbGVuOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgoJaWYgKHN3cHRyID09IDAgfHwgc3dwdHIgPT0gZG1hYnVmLT5kbWFzaXplIC8gMiB8fCAKCSAgICBzd3B0ciA9PSBkbWFidWYtPmRtYXNpemUpCgkJcmV0dXJuOwoKCWlmIChzd3B0ciA8IGRtYWJ1Zi0+ZG1hc2l6ZSAvIDIpCgkJbGVuID0gZG1hYnVmLT5kbWFzaXplIC8gMiAtIHN3cHRyOwoJZWxzZQoJCWxlbiA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyOwoKCW1lbXNldChkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBzaWxlbmNlLCBsZW4pOwoJaWYgKHN0YXRlLT5jYXJkLT5wY2lfaWQgIT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCWRtYWJ1Zi0+c3dwdHIgKz0gbGVuOwoJCWRtYWJ1Zi0+Y291bnQgKz0gbGVuOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Cgl9CgoJLyogcmVzdGFydCB0aGUgZG1hIG1hY2hpbmUgaW4gY2FzZSBpdCBpcyBoYWx0ZWQgKi8KCXN0YXJ0X2RhYyhzdGF0ZSk7Cn0KCnN0YXRpYyBpbnQKZHJhaW5fZGFjKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwgaW50IG5vbmJsb2NrKQp7CglERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIGxvbmcgdG1vOwoJaW50IGNvdW50OwoJdW5zaWduZWQgbG9uZyBkaWZmID0gMDsKCglpZiAoZG1hYnVmLT5tYXBwZWQgfHwgIWRtYWJ1Zi0+cmVhZHkpCgkJcmV0dXJuIDA7CgoJYWRkX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOwoJZm9yICg7OykgewoJCS8qIEl0IHNlZW1zIHRoYXQgd2UgaGF2ZSB0byBzZXQgdGhlIGN1cnJlbnQgc3RhdGUgdG8gVEFTS19JTlRFUlJVUFRJQkxFCgkJICAgZXZlcnkgdGltZSB0byBtYWtlIHRoZSBwcm9jZXNzIHJlYWxseSBnbyB0byBzbGVlcCAqLwoJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CgoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoKCQlpZiAoY291bnQgPD0gMCkKCQkJYnJlYWs7CgoJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKCQkJYnJlYWs7CgoJCWlmIChub25ibG9jaykgewoJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdCk7CgkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CgkJCXJldHVybiAtRUJVU1k7CgkJfQoKCQkvKiBObyBtYXR0ZXIgaG93IG11Y2ggZGF0YSBpcyBsZWZ0IGluIHRoZSBidWZmZXIsIHdlIGhhdmUgdG8gd2FpdCB1bnRpbAoJCSAgIENTTyA9PSBFU08vMiBvciBDU08gPT0gRVNPIHdoZW4gYWRkcmVzcyBlbmdpbmUgaW50ZXJydXB0cyAqLwoJCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEgfHwgCgkJICAgIHN0YXRlLT5jYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MCkgewoJCQlkaWZmID0gZG1hYnVmLT5zd3B0ciAtIHRyaWRlbnRfZ2V0X2RtYV9hZGRyKHN0YXRlKSArIGRtYWJ1Zi0+ZG1hc2l6ZTsKCQkJZGlmZiA9IGRpZmYgJSAoZG1hYnVmLT5kbWFzaXplKTsKCQkJdG1vID0gKGRpZmYgKiBIWikgLyBkbWFidWYtPnJhdGU7CgkJfSBlbHNlIHsKCQkJdG1vID0gKGRtYWJ1Zi0+ZG1hc2l6ZSAqIEhaKSAvIGRtYWJ1Zi0+cmF0ZTsKCQl9CgkJdG1vID4+PSBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwoJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPyB0bW8gOiAxKSAmJiB0bW8pIHsKCQkJYnJlYWs7CgkJfQoJfQoJcmVtb3ZlX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOwoJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwoKCXJldHVybiAwOwp9CgovKiB1cGRhdGUgYnVmZmVyIG1hbmFuZ2VtZW50IHBvaW50ZXJzLCBlc3BlY2lhbGx5LCAqLyAKLyogZG1hYnVmLT5jb3VudCBhbmQgZG1hYnVmLT5od3B0ciAqLwpzdGF0aWMgdm9pZAp0cmlkZW50X3VwZGF0ZV9wdHIoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXVuc2lnbmVkIGh3cHRyLCBzd3B0cjsKCWludCBjbGVhcl9jbnQgPSAwOwoJaW50IGRpZmY7Cgl1bnNpZ25lZCBjaGFyIHNpbGVuY2U7Cgl1bnNpZ25lZCBoYWxmX2RtYXNpemU7CgoJLyogdXBkYXRlIGhhcmR3YXJlIHBvaW50ZXIgKi8KCWh3cHRyID0gdHJpZGVudF9nZXRfZG1hX2FkZHIoc3RhdGUpOwoJZGlmZiA9IChkbWFidWYtPmRtYXNpemUgKyBod3B0ciAtIGRtYWJ1Zi0+aHdwdHIpICUgZG1hYnVmLT5kbWFzaXplOwoJZG1hYnVmLT5od3B0ciA9IGh3cHRyOwoJZG1hYnVmLT50b3RhbF9ieXRlcyArPSBkaWZmOwoKCS8qIGVycm9yIGhhbmRsaW5nIGFuZCBwcm9jZXNzIHdha2UgdXAgZm9yIEFEQyAqLwoJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IEFEQ19SVU5OSU5HKSB7CgkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7CgkJCWRtYWJ1Zi0+Y291bnQgLT0gZGlmZjsKCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZCkgZG1hYnVmLT5mcmFnc2l6ZSkKCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CgkJfSBlbHNlIHsKCQkJZG1hYnVmLT5jb3VudCArPSBkaWZmOwoKCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwIHx8IAoJCQkgICAgZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkgewoJCQkJLyogYnVmZmVyIHVuZGVycnVuIG9yIGJ1ZmZlciBvdmVycnVuLCAqLyAKCQkJCS8qIHdlIGhhdmUgbm8gd2F5IHRvIHJlY292ZXIgaXQgaGVyZSwganVzdCAqLyAKCQkJCS8qIHN0b3AgdGhlIG1hY2hpbmUgYW5kIGxldCB0aGUgcHJvY2VzcyAqLyAKCQkJCS8qIGZvcmNlIGh3cHRyIGFuZCBzd3B0ciB0byBzeW5jICovCgkJCQlfX3N0b3BfYWRjKHN0YXRlKTsKCQkJCWRtYWJ1Zi0+ZXJyb3IrKzsKCQkJfQoJCQlpZiAoZG1hYnVmLT5jb3VudCA8IChzaWduZWQpIGRtYWJ1Zi0+ZG1hc2l6ZSAvIDIpCgkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOwoJCX0KCX0KCgkvKiBlcnJvciBoYW5kbGluZyBhbmQgcHJvY2VzcyB3YWtlIHVwIGZvciBEQUMgKi8KCWlmIChkbWFidWYtPmVuYWJsZSA9PSBEQUNfUlVOTklORykgewoJCWlmIChkbWFidWYtPm1hcHBlZCkgewoJCQlkbWFidWYtPmNvdW50ICs9IGRpZmY7CgkJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpCgkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOwoJCX0gZWxzZSB7CgkJCWRtYWJ1Zi0+Y291bnQgLT0gZGlmZjsKCgkJCWlmIChkbWFidWYtPmNvdW50IDwgMCB8fCAKCQkJICAgIGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpIHsKCQkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biwgd2UgaGF2ZSBubyB3YXkgdG8gcmVjb3ZlcgoJCQkJICAgaXQgaGVyZSwganVzdCBzdG9wIHRoZSBtYWNoaW5lIGFuZCBsZXQgdGhlIHByb2Nlc3MgZm9yY2UgaHdwdHIKCQkJCSAgIGFuZCBzd3B0ciB0byBzeW5jICovCgkJCQlfX3N0b3BfZGFjKHN0YXRlKTsKCQkJCWRtYWJ1Zi0+ZXJyb3IrKzsKCQkJfSBlbHNlIGlmICghZG1hYnVmLT5lbmRjbGVhcmVkKSB7CgkJCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CgkJCQlzaWxlbmNlID0gKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQgPyAwIDogMHg4MCk7CgkJCQlpZiAoZG1hYnVmLT51cGRhdGVfZmxhZyAmIEFMSV9BRERSRVNTX0lOVF9VUERBVEUpIHsKCQkJCQkvKiBXZSBtdXN0IGNsZWFyIGVuZCBkYXRhIG9mIDEvMiBkbWFidWYgaWYgbmVlZGVkLgoJCQkJCSAgIEFjY29yZGluZyB0byAxLzIgYWxnb3JpdGhtIG9mIEFkZHJlc3MgRW5naW5lIEludGVycnVwdCwKCQkJCQkgICBjaGVjayB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZGF0YSBvZiBoYWxmIGRtYXNpemUuICovCgkJCQkJaGFsZl9kbWFzaXplID0gZG1hYnVmLT5kbWFzaXplIC8gMjsKCQkJCQlpZiAoKGRpZmYgPSBod3B0ciAtIGhhbGZfZG1hc2l6ZSkgPCAwKQoJCQkJCQlkaWZmID0gaHdwdHI7CgkJCQkJaWYgKChkbWFidWYtPmNvdW50ICsgZGlmZikgPCBoYWxmX2RtYXNpemUpIHsKCQkJCQkJLy90aGVyZSBpcyBpbnZhbGlkIGRhdGEgaW4gdGhlIGVuZCBvZiBoYWxmIGJ1ZmZlcgoJCQkJCQlpZiAoKGNsZWFyX2NudCA9IGhhbGZfZG1hc2l6ZSAtIHN3cHRyKSA8IDApCgkJCQkJCQljbGVhcl9jbnQgKz0gaGFsZl9kbWFzaXplOwoJCQkJCQkvL2NsZWFyIHRoZSBpbnZhbGlkIGRhdGEKCQkJCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIHNpbGVuY2UsIGNsZWFyX2NudCk7CgkJCQkJCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID09IDYpIHsKCQkJCQkJCWNsZWFyX2NudCA9IGNsZWFyX2NudCAvIDI7CgkJCQkJCQlzd3B0ciA9IHN3cHRyIC8gMjsKCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAoJCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7CgkJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1sxXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKCQkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwoJCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMl0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCgkJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAoJCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7CgkJCQkJCX0KCQkJCQkJZG1hYnVmLT5lbmRjbGVhcmVkID0gMTsKCQkJCQl9CgkJCQl9IGVsc2UgaWYgKGRtYWJ1Zi0+Y291bnQgPCAoc2lnbmVkKSBkbWFidWYtPmZyYWdzaXplKSB7CgkJCQkJY2xlYXJfY250ID0gZG1hYnVmLT5mcmFnc2l6ZTsKCQkJCQlpZiAoKHN3cHRyICsgY2xlYXJfY250KSA+IGRtYWJ1Zi0+ZG1hc2l6ZSkKCQkJCQkJY2xlYXJfY250ID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7CgkJCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIHNpbGVuY2UsIGNsZWFyX2NudCk7CgkJCQkJaWYgKHN0YXRlLT5jaGFuc19udW0gPT0gNikgewoJCQkJCQljbGVhcl9jbnQgPSBjbGVhcl9jbnQgLyAyOwoJCQkJCQlzd3B0ciA9IHN3cHRyIC8gMjsKCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMF0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCgkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwoJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1sxXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7CgkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAoJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbM10tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCgkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwoJCQkJCX0KCQkJCQlkbWFidWYtPmVuZGNsZWFyZWQgPSAxOwoJCQkJfQoJCQl9CgkJCS8qIHRyaWRlbnRfdXBkYXRlX3B0ciBpcyBjYWxsZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIgb3IgYnkgcHJvY2VzcyB2aWEKCQkJICAgaW9jdGwvcG9sbCwgd2Ugb25seSB3YWtlIHVwIHRoZSB3YWl0aW5nIHByb2Nlc3Mgd2hlbiB3ZSBoYXZlIG1vcmUKCQkJICAgdGhhbiAxLzIgYnVmZmVyIGZyZWUgKGFsd2F5cyB0cnVlIGZvciBpbnRlcnJ1cHQgaGFuZGxlcikgKi8KCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUgLyAyKQoJCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKCQl9Cgl9CglkbWFidWYtPnVwZGF0ZV9mbGFnICY9IH5BTElfQUREUkVTU19JTlRfVVBEQVRFOwp9CgpzdGF0aWMgdm9pZAp0cmlkZW50X2FkZHJlc3NfaW50ZXJydXB0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCWludCBpOwoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlOwoJdW5zaWduZWQgaW50IGNoYW5uZWw7CgoJLyogVXBkYXRlIHRoZSBwb2ludGVycyBmb3IgYWxsIGNoYW5uZWxzIHdlIGFyZSBydW5uaW5nLiAqLwoJLyogRklYTUU6IHNob3VsZCByZWFkIGludGVycnVwdCBzdGF0dXMgb25seSBvbmNlICovCglmb3IgKGkgPSAwOyBpIDwgTlJfSFdfQ0g7IGkrKykgewoJCWNoYW5uZWwgPSA2MyAtIGk7CgkJaWYgKHRyaWRlbnRfY2hlY2tfY2hhbm5lbF9pbnRlcnJ1cHQoY2FyZCwgY2hhbm5lbCkpIHsKCQkJdHJpZGVudF9hY2tfY2hhbm5lbF9pbnRlcnJ1cHQoY2FyZCwgY2hhbm5lbCk7CgkJCWlmICgoc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV0pICE9IE5VTEwpIHsKCQkJCXRyaWRlbnRfdXBkYXRlX3B0cihzdGF0ZSk7CgkJCX0gZWxzZSB7CgkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0cmlkZW50OiBzcHVyaW91cyBjaGFubmVsICIgCgkJCQkgICAgICAgImlycSAlZC5cbiIsIGNoYW5uZWwpOwoJCQkJdHJpZGVudF9zdG9wX3ZvaWNlKGNhcmQsIGNoYW5uZWwpOwoJCQkJdHJpZGVudF9kaXNhYmxlX3ZvaWNlX2lycShjYXJkLCBjaGFubmVsKTsKCQkJfQoJCX0KCX0KfQoKc3RhdGljIHZvaWQKYWxpX2h3dm9sX2NvbnRyb2woc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IG9wdCkKewoJdTE2IGR3VGVtcCwgdm9sdW1lWzJdLCBtdXRlLCBkaWZmLCAqcFZvbFsyXTsKCglkd1RlbXAgPSBhbGlfYWM5N19yZWFkKGNhcmQtPmFjOTdfY29kZWNbMF0sIDB4MDIpOwoJbXV0ZSA9IGR3VGVtcCAmIDB4ODAwMDsKCXZvbHVtZVswXSA9IGR3VGVtcCAmIDB4MDAxZjsKCXZvbHVtZVsxXSA9IChkd1RlbXAgJiAweDFmMDApID4+IDg7CglpZiAodm9sdW1lWzBdIDwgdm9sdW1lWzFdKSB7CgkJcFZvbFswXSA9ICZ2b2x1bWVbMF07CgkJcFZvbFsxXSA9ICZ2b2x1bWVbMV07Cgl9IGVsc2UgewoJCXBWb2xbMV0gPSAmdm9sdW1lWzBdOwoJCXBWb2xbMF0gPSAmdm9sdW1lWzFdOwoJfQoJZGlmZiA9ICoocFZvbFsxXSkgLSAqKHBWb2xbMF0pOwoKCWlmIChvcHQgPT0gMSkgewkJLy8gTVVURQoJCWR3VGVtcCBePSAweDgwMDA7CgkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgCgkJCSAgICAgICAweDAyLCBkd1RlbXApOwoJfSBlbHNlIGlmIChvcHQgPT0gMikgewkvLyBEb3duCgkJaWYgKG11dGUpCgkJCXJldHVybjsKCQlpZiAoKihwVm9sWzFdKSA8IDB4MDAxZikgewoJCQkoKnBWb2xbMV0pKys7CgkJCSoocFZvbFswXSkgPSAqKHBWb2xbMV0pIC0gZGlmZjsKCQl9CgkJZHdUZW1wICY9IDB4ZTBlMDsKCQlkd1RlbXAgfD0gKHZvbHVtZVswXSkgfCAodm9sdW1lWzFdIDw8IDgpOwoJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIDB4MDIsIGR3VGVtcCk7CgkJY2FyZC0+YWM5N19jb2RlY1swXS0+bWl4ZXJfc3RhdGVbMF0gPSAoKDMyIC0gdm9sdW1lWzBdKSAqIDI1IC8gOCkgfCAKCQkJKCgoMzIgLSB2b2x1bWVbMV0pICogMjUgLyA4KSA8PCA4KTsKCX0gZWxzZSBpZiAob3B0ID09IDQpIHsJLy8gVXAKCQlpZiAobXV0ZSkKCQkJcmV0dXJuOwoJCWlmICgqKHBWb2xbMF0pID4gMCkgewoJCQkoKnBWb2xbMF0pLS07CgkJCSoocFZvbFsxXSkgPSAqKHBWb2xbMF0pICsgZGlmZjsKCQl9CgkJZHdUZW1wICY9IDB4ZTBlMDsKCQlkd1RlbXAgfD0gKHZvbHVtZVswXSkgfCAodm9sdW1lWzFdIDw8IDgpOwoJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIDB4MDIsIGR3VGVtcCk7CgkJY2FyZC0+YWM5N19jb2RlY1swXS0+bWl4ZXJfc3RhdGVbMF0gPSAoKDMyIC0gdm9sdW1lWzBdKSAqIDI1IC8gOCkgfCAKCQkJKCgoMzIgLSB2b2x1bWVbMV0pICogMjUgLyA4KSA8PCA4KTsKCX0gZWxzZSB7CgkJLyogTm90aGluZyBuZWVkcyBkb2luZyAqLwoJfQp9CgovKgogKglSZS1lbmFibGUgcmVwb3J0aW5nIG9mIHZvbCBjaGFuZ2UgYWZ0ZXIgMC4xIHNlY29uZHMKICovCgpzdGF0aWMgdm9pZAphbGlfdGltZW91dCh1bnNpZ25lZCBsb25nIHB0cikKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgdHJpZGVudF9jYXJkICopIHB0cjsKCXUxNiB0ZW1wID0gMDsKCgkvKiBFbmFibGUgR1BJTyBJUlEgKE1JU0NJTlQgYml0IDE4aCkgKi8KCXRlbXAgPSBpbncoVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQgKyAyKSk7Cgl0ZW1wIHw9IDB4MDAwNDsKCW91dHcodGVtcCwgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQgKyAyKSk7Cn0KCi8qCiAqCVNldCB1cCB0aGUgdGltZXIgdG8gY2xlYXIgdGhlIHZvbCBjaGFuZ2Ugbm90aWZpY2F0aW9uCiAqLwoKc3RhdGljIHZvaWQKYWxpX3NldF90aW1lcihzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7CgkvKiBBZGQgVGltZXIgUm91dGluZSB0byBFbmFibGUgR1BJTyBJUlEgKi8KCWRlbF90aW1lcigmY2FyZC0+dGltZXIpOwkvKiBOZXZlciBxdWV1ZSB0d2ljZSAqLwoJY2FyZC0+dGltZXIuZnVuY3Rpb24gPSBhbGlfdGltZW91dDsKCWNhcmQtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgY2FyZDsKCWNhcmQtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyAxMDsKCWFkZF90aW1lcigmY2FyZC0+dGltZXIpOwp9CgovKgogKglQcm9jZXNzIGEgR1BJTyBldmVudAogKi8KCnN0YXRpYyB2b2lkCmFsaV9xdWV1ZV90YXNrKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBvcHQpCnsKCXUxNiB0ZW1wOwoKCS8qIERpc2FibGUgR1BJTyBJUlEgKE1JU0NJTlQgYml0IDE4aCkgKi8KCXRlbXAgPSBpbncoVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQgKyAyKSk7Cgl0ZW1wICY9ICh1MTYpICh+MHgwMDA0KTsKCW91dHcodGVtcCwgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQgKyAyKSk7CgoJLyogQWRqdXN0IHRoZSB2b2x1bWUgKi8KCWFsaV9od3ZvbF9jb250cm9sKGNhcmQsIG9wdCk7CgoJLyogU2V0IHRoZSB0aW1lciBmb3IgMS8xMHRoIHNlYyAqLwoJYWxpX3NldF90aW1lcihjYXJkKTsKfQoKc3RhdGljIHZvaWQKY3liZXJfYWRkcmVzc19pbnRlcnJ1cHQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJaW50IGksIGlycV9zdGF0dXM7CglzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGU7Cgl1bnNpZ25lZCBpbnQgY2hhbm5lbDsKCgkvKiBVcGRhdGUgdGhlIHBvaW50ZXJzIGZvciBhbGwgY2hhbm5lbHMgd2UgYXJlIHJ1bm5pbmcuICovCgkvKiBGSVhFRDogcmVhZCBpbnRlcnJ1cHQgc3RhdHVzIG9ubHkgb25jZSAqLwoJaXJxX3N0YXR1cyA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfQUlOVF9BKSk7CgoJcHJfZGVidWcoImN5YmVyX2FkZHJlc3NfaW50ZXJydXB0OiBpcnFfc3RhdHVzIDB4JVhcbiIsIGlycV9zdGF0dXMpOwoKCWZvciAoaSA9IDA7IGkgPCBOUl9IV19DSDsgaSsrKSB7CgkJY2hhbm5lbCA9IDMxIC0gaTsKCQlpZiAoaXJxX3N0YXR1cyAmICgxIDw8IGNoYW5uZWwpKSB7CgkJCS8qIGNsZWFyIGJpdCBieSB3cml0aW5nIGEgMSwgemVyb2VzIGFyZSBpZ25vcmVkICovCgkJCW91dGwoKDEgPDwgY2hhbm5lbCksIFRSSURfUkVHKGNhcmQsIFQ0RF9BSU5UX0EpKTsKCgkJCXByX2RlYnVnKCJjeWJlcl9pbnRlcnJ1cHQ6IGNoYW5uZWwgJWRcbiIsIGNoYW5uZWwpOwoKCQkJaWYgKChzdGF0ZSA9IGNhcmQtPnN0YXRlc1tpXSkgIT0gTlVMTCkgewoJCQkJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKCQkJfSBlbHNlIHsKCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImN5YmVyNTA1MDogc3B1cmlvdXMgIiAKCQkJCSAgICAgICAiY2hhbm5lbCBpcnEgJWQuXG4iLCBjaGFubmVsKTsKCQkJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBjaGFubmVsKTsKCQkJCXRyaWRlbnRfZGlzYWJsZV92b2ljZV9pcnEoY2FyZCwgY2hhbm5lbCk7CgkJCX0KCQl9Cgl9Cn0KCnN0YXRpYyBpcnFyZXR1cm5fdAp0cmlkZW50X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCnsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSAoc3RydWN0IHRyaWRlbnRfY2FyZCAqKSBkZXZfaWQ7Cgl1MzIgZXZlbnQ7Cgl1MzIgZ3BpbzsKCglzcGluX2xvY2soJmNhcmQtPmxvY2spOwoJZXZlbnQgPSBpbmwoVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKCglwcl9kZWJ1ZygidHJpZGVudDogdHJpZGVudF9pbnRlcnJ1cHQgY2FsbGVkLCBNSVNDSU5UID0gMHglMDh4XG4iLAoJCSBldmVudCk7CgoJaWYgKGV2ZW50ICYgQUREUkVTU19JUlEpIHsKCQljYXJkLT5hZGRyZXNzX2ludGVycnVwdChjYXJkKTsKCX0KCglpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKCQkvKiBHUElPIElSUSAoSC9XIFZvbHVtZSBDb250cm9sKSAqLwoJCWV2ZW50ID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CgkJaWYgKGV2ZW50ICYgKDEgPDwgMjUpKSB7CgkJCWdwaW8gPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dQSU8pKTsKCQkJaWYgKCF0aW1lcl9wZW5kaW5nKCZjYXJkLT50aW1lcikpCgkJCQlhbGlfcXVldWVfdGFzayhjYXJkLCBncGlvICYgMHgwNyk7CgkJfQoJCWV2ZW50ID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CgkJb3V0bChldmVudCB8IChTVF9UQVJHRVRfUkVBQ0hFRCB8IE1JWEVSX09WRVJGTE9XIHwgTUlYRVJfVU5ERVJGTE9XKSwgCgkJICAgICBUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwoJCXNwaW5fdW5sb2NrKCZjYXJkLT5sb2NrKTsKCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Cgl9CgoJLyogbWFudWFsbHkgY2xlYXIgaW50ZXJydXB0IHN0YXR1cywgYmFkIGhhcmR3YXJlIGRlc2lnbiwgYmxhbWUgVF4yICovCglvdXRsKChTVF9UQVJHRVRfUkVBQ0hFRCB8IE1JWEVSX09WRVJGTE9XIHwgTUlYRVJfVU5ERVJGTE9XKSwgCgkgICAgIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CglzcGluX3VubG9jaygmY2FyZC0+bG9jayk7CglyZXR1cm4gSVJRX0hBTkRMRUQ7Cn0KCi8qIGluIHRoaXMgbG9vcCwgZG1hYnVmLmNvdW50IHNpZ25pZmllcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBpcyB3YWl0aW5nICovIAovKiB0byBiZSBjb3BpZWQgdG8gdGhlIHVzZXIncyBidWZmZXIuICBpdCBpcyBmaWxsZWQgYnkgdGhlIGRtYSBtYWNoaW5lIGFuZCAqLyAKLyogZHJhaW5lZCBieSB0aGlzIGxvb3AuICovCnN0YXRpYyBzc2l6ZV90CnRyaWRlbnRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQp7CglzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHRyaWRlbnRfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXNzaXplX3QgcmV0ID0gMDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1bnNpZ25lZCBzd3B0cjsKCWludCBjbnQ7CgoJcHJfZGVidWcoInRyaWRlbnQ6IHRyaWRlbnRfcmVhZCBjYWxsZWQsIGNvdW50ID0gJXpkXG4iLCBjb3VudCk7CgoJVkFMSURBVEVfU1RBVEUoc3RhdGUpOwoKCWlmIChkbWFidWYtPm1hcHBlZCkKCQlyZXR1cm4gLUVOWElPOwoJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKCQlyZXR1cm4gLUVGQVVMVDsKCgltdXRleF9sb2NrKCZzdGF0ZS0+c2VtKTsKCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkpCgkJZ290byBvdXQ7CgoJd2hpbGUgKGNvdW50ID4gMCkgewoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCWlmIChkbWFidWYtPmNvdW50ID4gKHNpZ25lZCkgZG1hYnVmLT5kbWFzaXplKSB7CgkJCS8qIGJ1ZmZlciBvdmVycnVuLCB3ZSBhcmUgcmVjb3ZlcmluZyBmcm9tICovIAoJCQkvKiBzbGVlcF9vbl90aW1lb3V0LCByZXN5bmMgaHdwdHIgYW5kIHN3cHRyLCAqLyAKCQkJLyogbWFrZSBwcm9jZXNzIGZsdXNoIHRoZSBidWZmZXIgKi8KCQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CgkJfQoJCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKCQljbnQgPSBkbWFidWYtPmRtYXNpemUgLSBzd3B0cjsKCQlpZiAoZG1hYnVmLT5jb3VudCA8IGNudCkKCQkJY250ID0gZG1hYnVmLT5jb3VudDsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoKCQlpZiAoY250ID4gY291bnQpCgkJCWNudCA9IGNvdW50OwoJCWlmIChjbnQgPD0gMCkgewoJCQl1bnNpZ25lZCBsb25nIHRtbzsKCQkJLyogYnVmZmVyIGlzIGVtcHR5LCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kICovIAoJCQkvKiB3YWl0IGZvciBkYXRhIHRvIGJlIHJlY29yZGVkICovCgkJCXN0YXJ0X2FkYyhzdGF0ZSk7CgkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewoJCQkJaWYgKCFyZXQpCgkJCQkJcmV0ID0gLUVBR0FJTjsKCQkJCWdvdG8gb3V0OwoJCQl9CgoJCQltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwoJCQkvKiBObyBtYXR0ZXIgaG93IG11Y2ggc3BhY2UgbGVmdCBpbiB0aGUgYnVmZmVyLCAqLyAKCQkJLyogd2UgaGF2ZSB0byB3YWl0IHVudGlsIENTTyA9PSBFU08vMiBvciBDU08gPT0gRVNPICovIAoJCQkvKiB3aGVuIGFkZHJlc3MgZW5naW5lIGludGVycnVwdHMgKi8KCQkJdG1vID0gKGRtYWJ1Zi0+ZG1hc2l6ZSAqIEhaKSAvIChkbWFidWYtPnJhdGUgKiAyKTsKCQkJdG1vID4+PSBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwoJCQkvKiBUaGVyZSBhcmUgdHdvIHNpdHVhdGlvbnMgd2hlbiBzbGVlcF9vbl90aW1lb3V0IHJldHVybnMsIG9uZSBpcyB3aGVuCgkJCSAgIHRoZSBpbnRlcnJ1cHQgaXMgc2VydmljZWQgY29ycmVjdGx5IGFuZCB0aGUgcHJvY2VzcyBpcyB3YWtlZCB1cCBieQoJCQkgICBJU1IgT04gVElNRS4gQW5vdGhlciBpcyB3aGVuIHRpbWVvdXQgaXMgZXhwaXJlZCwgd2hpY2ggbWVhbnMgdGhhdAoJCQkgICBlaXRoZXIgaW50ZXJydXB0IGlzIE5PVCBzZXJ2aWNlZCBjb3JyZWN0bHkgKHBlbmRpbmcgaW50ZXJydXB0KSBvciBpdAoJCQkgICBpcyBUT08gTEFURSBmb3IgdGhlIHByb2Nlc3MgdG8gYmUgc2NoZWR1bGVkIHRvIHJ1biAoc2NoZWR1bGVyIGxhdGVuY3kpCgkJCSAgIHdoaWNoIHJlc3VsdHMgaW4gYSAocG90ZW50aWFsKSBidWZmZXIgb3ZlcnJ1bi4gQW5kIHdvcnNlLCB0aGVyZSBpcwoJCQkgICBOT1RISU5HIHdlIGNhbiBkbyB0byBwcmV2ZW50IGl0LiAqLwoJCQlpZiAoIWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmZG1hYnVmLT53YWl0LCB0bW8pKSB7CgkJCQlwcl9kZWJ1ZyhLRVJOX0VSUiAidHJpZGVudDogcmVjb3JkaW5nIHNjaGVkdWxlIHRpbWVvdXQsICIKCQkJCQkgImRtYXN6ICV1IGZyYWdzeiAldSBjb3VudCAlaSBod3B0ciAldSBzd3B0ciAldVxuIiwKCQkJCQkgZG1hYnVmLT5kbWFzaXplLCBkbWFidWYtPmZyYWdzaXplLCBkbWFidWYtPmNvdW50LAoJCQkJCSBkbWFidWYtPmh3cHRyLCBkbWFidWYtPnN3cHRyKTsKCgkJCQkvKiBhIGJ1ZmZlciBvdmVycnVuLCB3ZSBkZWxheSB0aGUgcmVjb3ZlcnkgdW50aWwgbmV4dCB0aW1lIHRoZQoJCQkJICAgd2hpbGUgbG9vcCBiZWdpbiBhbmQgd2UgUkVBTExZIGhhdmUgc3BhY2UgdG8gcmVjb3JkICovCgkJCX0KCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CgkJCQlpZiAoIXJldCkKCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CgkJCQlnb3RvIG91dDsKCQkJfQoJCQltdXRleF9sb2NrKCZzdGF0ZS0+c2VtKTsKCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7CgkJCQlpZiAoIXJldCkKCQkJCQlyZXQgPSAtRU5YSU87CgkJCQlnb3RvIG91dDsKCQkJfQoJCQljb250aW51ZTsKCQl9CgoJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBjbnQpKSB7CgkJCWlmICghcmV0KQoJCQkJcmV0ID0gLUVGQVVMVDsKCQkJZ290byBvdXQ7CgkJfQoKCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBkbWFidWYtPmRtYXNpemU7CgoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCWRtYWJ1Zi0+c3dwdHIgPSBzd3B0cjsKCQlkbWFidWYtPmNvdW50IC09IGNudDsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoKCQljb3VudCAtPSBjbnQ7CgkJYnVmZmVyICs9IGNudDsKCQlyZXQgKz0gY250OwoJCXN0YXJ0X2FkYyhzdGF0ZSk7Cgl9Cm91dDoKCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7CglyZXR1cm4gcmV0Owp9CgovKiBpbiB0aGlzIGxvb3AsIGRtYWJ1Zi5jb3VudCBzaWduaWZpZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMgd2FpdGluZyB0byBiZSBkbWEgdG8KICAgdGhlIHNvdW5kY2FyZC4gIGl0IGlzIGRyYWluZWQgYnkgdGhlIGRtYSBtYWNoaW5lIGFuZCBmaWxsZWQgYnkgdGhpcyBsb29wLiAqLwoKc3RhdGljIHNzaXplX3QKdHJpZGVudF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQp7CglzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHRyaWRlbnRfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXNzaXplX3QgcmV0OwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIHN3cHRyOwoJaW50IGNudDsKCXVuc2lnbmVkIGludCBzdGF0ZV9jbnQ7Cgl1bnNpZ25lZCBpbnQgY29weV9jb3VudDsKCWludCBscmV0OyAvKiBmb3IgbG9ja19zZXRfZm10ICovCgoJcHJfZGVidWcoInRyaWRlbnQ6IHRyaWRlbnRfd3JpdGUgY2FsbGVkLCBjb3VudCA9ICV6ZFxuIiwgY291bnQpOwoKCVZBTElEQVRFX1NUQVRFKHN0YXRlKTsKCgkvKgoJICogICAgICBHdWFyZCBhZ2FpbnN0IGFuIG1tYXAgb3IgaW9jdGwgd2hpbGUgd3JpdGluZwoJICovCgoJbXV0ZXhfbG9jaygmc3RhdGUtPnNlbSk7CgoJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7CgkJcmV0ID0gLUVOWElPOwoJCWdvdG8gb3V0OwoJfQoJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpKQoJCWdvdG8gb3V0OwoKCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkgewoJCXJldCA9IC1FRkFVTFQ7CgkJZ290byBvdXQ7Cgl9CgoJcmV0ID0gMDsKCgl3aGlsZSAoY291bnQgPiAwKSB7CgkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwKSB7CgkJCS8qIGJ1ZmZlciB1bmRlcnJ1biwgd2UgYXJlIHJlY292ZXJpbmcgZnJvbSAqLyAKCQkJLyogc2xlZXBfb25fdGltZW91dCwgcmVzeW5jIGh3cHRyIGFuZCBzd3B0ciAqLwoJCQlkbWFidWYtPmNvdW50ID0gMDsKCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CgkJfQoJCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKCQljbnQgPSBkbWFidWYtPmRtYXNpemUgLSBzd3B0cjsKCQlpZiAoZG1hYnVmLT5jb3VudCArIGNudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkKCQkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5jb3VudDsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoKCQlpZiAoY250ID4gY291bnQpCgkJCWNudCA9IGNvdW50OwoJCWlmIChjbnQgPD0gMCkgewoJCQl1bnNpZ25lZCBsb25nIHRtbzsKCQkJLyogYnVmZmVyIGlzIGZ1bGwsIHN0YXJ0IHRoZSBkbWEgbWFjaGluZSBhbmQgKi8gCgkJCS8qIHdhaXQgZm9yIGRhdGEgdG8gYmUgcGxheWVkICovCgkJCXN0YXJ0X2RhYyhzdGF0ZSk7CgkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewoJCQkJaWYgKCFyZXQpCgkJCQkJcmV0ID0gLUVBR0FJTjsKCQkJCWdvdG8gb3V0OwoJCQl9CgkJCS8qIE5vIG1hdHRlciBob3cgbXVjaCBkYXRhIGxlZnQgaW4gdGhlIGJ1ZmZlciwgKi8gCgkJCS8qIHdlIGhhdmUgdG8gd2FpdCB1bnRpbCBDU08gPT0gRVNPLzIgb3IgQ1NPID09IEVTTyAqLyAKCQkJLyogd2hlbiBhZGRyZXNzIGVuZ2luZSBpbnRlcnJ1cHRzICovCgkJCWxvY2tfc2V0X2ZtdChzdGF0ZSk7CgkJCXRtbyA9IChkbWFidWYtPmRtYXNpemUgKiBIWikgLyAoZG1hYnVmLT5yYXRlICogMik7CgkJCXRtbyA+Pj0gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoJCQltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwoKCQkJLyogVGhlcmUgYXJlIHR3byBzaXR1YXRpb25zIHdoZW4gc2xlZXBfb25fdGltZW91dCAqLyAKCQkJLyogcmV0dXJucywgb25lIGlzIHdoZW4gdGhlIGludGVycnVwdCBpcyBzZXJ2aWNlZCAqLyAKCQkJLyogY29ycmVjdGx5IGFuZCB0aGUgcHJvY2VzcyBpcyB3YWtlZCB1cCBieSBJU1IgKi8gCgkJCS8qIE9OIFRJTUUuIEFub3RoZXIgaXMgd2hlbiB0aW1lb3V0IGlzIGV4cGlyZWQsIHdoaWNoICovIAoJCQkvKiBtZWFucyB0aGF0IGVpdGhlciBpbnRlcnJ1cHQgaXMgTk9UIHNlcnZpY2VkICovIAoJCQkvKiBjb3JyZWN0bHkgKHBlbmRpbmcgaW50ZXJydXB0KSBvciBpdCBpcyBUT08gTEFURSAqLyAKCQkJLyogZm9yIHRoZSBwcm9jZXNzIHRvIGJlIHNjaGVkdWxlZCB0byBydW4gKi8gCgkJCS8qIChzY2hlZHVsZXIgbGF0ZW5jeSkgd2hpY2ggcmVzdWx0cyBpbiBhIChwb3RlbnRpYWwpICovIAoJCQkvKiBidWZmZXIgdW5kZXJydW4uIEFuZCB3b3JzZSwgdGhlcmUgaXMgTk9USElORyB3ZSAqLyAKCQkJLyogY2FuIGRvIHRvIHByZXZlbnQgaXQuICovCgkJCWlmICghaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZkbWFidWYtPndhaXQsIHRtbykpIHsKCQkJCXByX2RlYnVnKEtFUk5fRVJSICJ0cmlkZW50OiBwbGF5YmFjayBzY2hlZHVsZSAiCgkJCQkJICJ0aW1lb3V0LCBkbWFzeiAldSBmcmFnc3ogJXUgY291bnQgJWkgIgoJCQkJCSAiaHdwdHIgJXUgc3dwdHIgJXVcbiIsIGRtYWJ1Zi0+ZG1hc2l6ZSwKCQkJCQkgZG1hYnVmLT5mcmFnc2l6ZSwgZG1hYnVmLT5jb3VudCwKCQkJCQkgZG1hYnVmLT5od3B0ciwgZG1hYnVmLT5zd3B0cik7CgoJCQkJLyogYSBidWZmZXIgdW5kZXJydW4sIHdlIGRlbGF5IHRoZSByZWNvdmVyeSAqLyAKCQkJCS8qIHVudGlsIG5leHQgdGltZSB0aGUgd2hpbGUgbG9vcCBiZWdpbiBhbmQgKi8gCgkJCQkvKiB3ZSBSRUFMTFkgaGF2ZSBkYXRhIHRvIHBsYXkgKi8KCQkJfQoJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKCQkJCWlmICghcmV0KQoJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKCQkJCWdvdG8gb3V0X25vbG9jazsKCQkJfQoJCQltdXRleF9sb2NrKCZzdGF0ZS0+c2VtKTsKCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7CgkJCQlpZiAoIXJldCkKCQkJCQlyZXQgPSAtRU5YSU87CgkJCQlnb3RvIG91dDsKCQkJfQoJCQljb250aW51ZTsKCQl9CgkJaWYgKChscmV0ID0gbG9ja19zZXRfZm10KHN0YXRlKSkgPCAwKSB7CgkJCXJldCA9IGxyZXQ7CgkJCWdvdG8gb3V0OwoJCX0KCgkJaWYgKHN0YXRlLT5jaGFuc19udW0gPT0gNikgewoJCQljb3B5X2NvdW50ID0gMDsKCQkJc3RhdGVfY250ID0gMDsKCQkJaWYgKGFsaV93cml0ZV81XzEoc3RhdGUsIGJ1ZmZlciwgY250LCAmY29weV9jb3VudCwgCgkJCQkJICAmc3RhdGVfY250KSA9PSAtRUZBVUxUKSB7CgkJCQlpZiAoc3RhdGVfY250KSB7CgkJCQkJc3dwdHIgPSAoc3dwdHIgKyBzdGF0ZV9jbnQpICUgZG1hYnVmLT5kbWFzaXplOwoJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCQkJCWRtYWJ1Zi0+c3dwdHIgPSBzd3B0cjsKCQkJCQlkbWFidWYtPmNvdW50ICs9IHN0YXRlX2NudDsKCQkJCQlkbWFidWYtPmVuZGNsZWFyZWQgPSAwOwoJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJCQl9CgkJCQlyZXQgKz0gY29weV9jb3VudDsKCQkJCWlmICghcmV0KQoJCQkJCXJldCA9IC1FRkFVTFQ7CgkJCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CgkJCQlnb3RvIG91dDsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCAKCQkJCQkgICBidWZmZXIsIGNudCkpIHsKCQkJCWlmICghcmV0KQoJCQkJCXJldCA9IC1FRkFVTFQ7CgkJCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CgkJCQlnb3RvIG91dDsKCQkJfQoJCQlzdGF0ZV9jbnQgPSBjbnQ7CgkJfQoJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCgkJc3dwdHIgPSAoc3dwdHIgKyBzdGF0ZV9jbnQpICUgZG1hYnVmLT5kbWFzaXplOwoKCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlkbWFidWYtPnN3cHRyID0gc3dwdHI7CgkJZG1hYnVmLT5jb3VudCArPSBzdGF0ZV9jbnQ7CgkJZG1hYnVmLT5lbmRjbGVhcmVkID0gMDsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoKCQljb3VudCAtPSBjbnQ7CgkJYnVmZmVyICs9IGNudDsKCQlyZXQgKz0gY250OwoJCXN0YXJ0X2RhYyhzdGF0ZSk7Cgl9Cm91dDoKCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7Cm91dF9ub2xvY2s6CglyZXR1cm4gcmV0Owp9CgovKiBObyBrZXJuZWwgbG9jayAtIHdlIGhhdmUgb3VyIG93biBzcGlubG9jayAqLwpzdGF0aWMgdW5zaWduZWQgaW50CnRyaWRlbnRfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQp7CglzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHRyaWRlbnRfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CgoJVkFMSURBVEVfU1RBVEUoc3RhdGUpOwoKCS8qCgkgKiAgICAgIEd1YXJkIGFnYWluc3QgYSBwYXJhbGxlbCBwb2xsIGFuZCB3cml0ZSBjYXVzaW5nIG11bHRpcGxlCgkgKiAgICAgIHByb2dfZG1hYnVmIGV2ZW50cwoJICovCgoJbXV0ZXhfbG9jaygmc3RhdGUtPnNlbSk7CgoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIHByb2dfZG1hYnVmX3BsYXliYWNrKHN0YXRlKSkgewoJCQltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwoJCQlyZXR1cm4gMDsKCQl9CgkJcG9sbF93YWl0KGZpbGUsICZkbWFidWYtPndhaXQsIHdhaXQpOwoJfQoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkgewoJCQltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwoJCQlyZXR1cm4gMDsKCQl9CgkJcG9sbF93YWl0KGZpbGUsICZkbWFidWYtPndhaXQsIHdhaXQpOwoJfQoKCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Cgl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOwoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQlpZiAoZG1hYnVmLT5jb3VudCA+PSAoc2lnbmVkKSBkbWFidWYtPmZyYWdzaXplKQoJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07Cgl9CglpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZCkgZG1hYnVmLT5mcmFnc2l6ZSkKCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CgkJfSBlbHNlIHsKCQkJaWYgKChzaWduZWQpIGRtYWJ1Zi0+ZG1hc2l6ZSA+PSBkbWFidWYtPmNvdW50ICsgCgkJCSAgICAoc2lnbmVkKSBkbWFidWYtPmZyYWdzaXplKQoJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKCQl9Cgl9CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoKCXJldHVybiBtYXNrOwp9CgpzdGF0aWMgaW50CnRyaWRlbnRfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCnsKCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJaW50IHJldCA9IC1FSU5WQUw7Cgl1bnNpZ25lZCBsb25nIHNpemU7CgoJVkFMSURBVEVfU1RBVEUoc3RhdGUpOwoKCS8qCgkgKiAgICAgIExvY2sgYWdhaW5zdCBwb2xsIHJlYWQgd3JpdGUgb3IgbW1hcCBjcmVhdGluZyBidWZmZXJzLiBBbHNvIGxvY2sKCSAqICAgICAgYSByZWFkIG9yIHdyaXRlIGFnYWluc3QgYW4gbW1hcC4KCSAqLwoKCW11dGV4X2xvY2soJnN0YXRlLT5zZW0pOwoKCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX3BsYXliYWNrKHN0YXRlKSkgIT0gMCkKCQkJZ290byBvdXQ7Cgl9IGVsc2UgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7CgkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9yZWNvcmQoc3RhdGUpKSAhPSAwKQoJCQlnb3RvIG91dDsKCX0gZWxzZQoJCWdvdG8gb3V0OwoKCXJldCA9IC1FSU5WQUw7CglpZiAodm1hLT52bV9wZ29mZiAhPSAwKQoJCWdvdG8gb3V0OwoJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKCWlmIChzaXplID4gKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyKSkKCQlnb3RvIG91dDsKCXJldCA9IC1FQUdBSU47CglpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKCQkJICAgICB2aXJ0X3RvX3BoeXMoZG1hYnVmLT5yYXdidWYpID4+IFBBR0VfU0hJRlQsCgkJCSAgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQoJCWdvdG8gb3V0OwoJZG1hYnVmLT5tYXBwZWQgPSAxOwoJcmV0ID0gMDsKb3V0OgoJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQKdHJpZGVudF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgCgkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKewoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJYXVkaW9fYnVmX2luZm8gYWJpbmZvOwoJY291bnRfaW5mbyBjaW5mbzsKCWludCB2YWwsIG1hcHBlZCwgcmV0ID0gMDsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwoJaW50IF9fdXNlciAqcCA9IGFyZ3A7CgoJVkFMSURBVEVfU1RBVEUoc3RhdGUpOwoKCgltYXBwZWQgPSAoKGZpbGUtPmZfbW9kZSAmIChGTU9ERV9XUklURSB8IEZNT0RFX1JFQUQpKSAmJiBkbWFidWYtPm1hcHBlZCk7CgoJcHJfZGVidWcoInRyaWRlbnQ6IHRyaWRlbnRfaW9jdGwsIGNvbW1hbmQgPSAlMmQsIGFyZyA9IDB4JTA4eFxuIiwKCQkgX0lPQ19OUihjbWQpLCBhcmcgPyAqcCA6IDApOwoKCXN3aXRjaCAoY21kKSB7CgljYXNlIE9TU19HRVRWRVJTSU9OOgoJCXJldCA9IHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKCQkvKiBGSVhNRTogc3Bpbl9sb2NrID8gKi8KCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKCQkJc3RvcF9kYWMoc3RhdGUpOwoJCQlzeW5jaHJvbml6ZV9pcnEoY2FyZC0+aXJxKTsKCQkJZG1hYnVmLT5yZWFkeSA9IDA7CgkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyID0gMDsKCQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOwoJCX0KCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCQlzdG9wX2FkYyhzdGF0ZSk7CgkJCXN5bmNocm9uaXplX2lycShjYXJkLT5pcnEpOwoJCQlkbWFidWYtPnJlYWR5ID0gMDsKCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHIgPSAwOwoJCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT50b3RhbF9ieXRlcyA9IDA7CgkJfQoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKCQkJcmV0ID0gZHJhaW5fZGFjKHN0YXRlLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX1NQRUVEOgkvKiBzZXQgc21hcGxlIHJhdGUgKi8KCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgewoJCQlyZXQgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgkJaWYgKHZhbCA+PSAwKSB7CgkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCQkJc3RvcF9kYWMoc3RhdGUpOwoJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CgkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQkJCXRyaWRlbnRfc2V0X2RhY19yYXRlKHN0YXRlLCB2YWwpOwoJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQkJfQoJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCQkJc3RvcF9hZGMoc3RhdGUpOwoJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CgkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQkJCXRyaWRlbnRfc2V0X2FkY19yYXRlKHN0YXRlLCB2YWwpOwoJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQkJfQoJCX0KCQlyZXQgPSBwdXRfdXNlcihkbWFidWYtPnJhdGUsIHApOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CS8qIHNldCBzdGVyZW8gb3IgbW9ubyBjaGFubmVsICovCgkJaWYgKGdldF91c2VyKHZhbCwgcCkpIHsKCQkJcmV0ID0gLUVGQVVMVDsKCQkJYnJlYWs7CgkJfQoJCWlmICgocmV0ID0gbG9ja19zZXRfZm10KHN0YXRlKSkgPCAwKQoJCQlyZXR1cm4gcmV0OwoKCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKCQkJc3RvcF9kYWMoc3RhdGUpOwoJCQlkbWFidWYtPnJlYWR5ID0gMDsKCQkJaWYgKHZhbCkKCQkJCWRtYWJ1Zi0+Zm10IHw9IFRSSURFTlRfRk1UX1NURVJFTzsKCQkJZWxzZQoJCQkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UX1NURVJFTzsKCQl9CgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQkJc3RvcF9hZGMoc3RhdGUpOwoJCQlkbWFidWYtPnJlYWR5ID0gMDsKCQkJaWYgKHZhbCkKCQkJCWRtYWJ1Zi0+Zm10IHw9IFRSSURFTlRfRk1UX1NURVJFTzsKCQkJZWxzZQoJCQkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UX1NURVJFTzsKCQl9CgkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmX3BsYXliYWNrKHN0YXRlKSkpCgkJCQlyZXQgPSB2YWw7CgkJCWVsc2UKCQkJCXJldCA9IHB1dF91c2VyKGRtYWJ1Zi0+ZnJhZ3NpemUsIHApOwoJCQlicmVhazsKCQl9CgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1Zl9yZWNvcmQoc3RhdGUpKSkKCQkJCXJldCA9IHZhbDsKCQkJZWxzZQoJCQkJcmV0ID0gcHV0X3VzZXIoZG1hYnVmLT5mcmFnc2l6ZSwgcCk7CgkJCWJyZWFrOwoJCX0KCQkvKiBuZWl0aGVyIFJFQUQgbm9yIFdSSVRFPyBpcyB0aGlzIGV2ZW4gcG9zc2libGU/ICovCgkJcmV0ID0gLUVJTlZBTDsKCQlicmVhazsKCgoJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6IC8qIFJldHVybnMgYSBtYXNrIG9mIHN1cHBvcnRlZCBzYW1wbGUgZm9ybWF0ICovCgkJcmV0ID0gcHV0X3VzZXIoQUZNVF9TMTZfTEUgfCBBRk1UX1UxNl9MRSB8IEFGTVRfUzggfCAKCQkJICAgICAgIEFGTVRfVTgsIHApOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CS8qIFNlbGVjdCBzYW1wbGUgZm9ybWF0ICovCgkJaWYgKGdldF91c2VyKHZhbCwgcCkpIHsKCQkJcmV0ID0gLUVGQVVMVDsKCQkJYnJlYWs7CgkJfQoJCWlmICgocmV0ID0gbG9ja19zZXRfZm10KHN0YXRlKSkgPCAwKQoJCQlyZXR1cm4gcmV0OwoKCQlpZiAodmFsICE9IEFGTVRfUVVFUlkpIHsKCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJCQlzdG9wX2RhYyhzdGF0ZSk7CgkJCQlkbWFidWYtPnJlYWR5ID0gMDsKCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCgkJCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfMTZCSVQ7CgkJCQllbHNlCgkJCQkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UXzE2QklUOwoJCQl9CgkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJCQlzdG9wX2FkYyhzdGF0ZSk7CgkJCQlkbWFidWYtPnJlYWR5ID0gMDsKCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCgkJCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfMTZCSVQ7CgkJCQllbHNlCgkJCQkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UXzE2QklUOwoJCQl9CgkJfQoJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCQlyZXQgPSBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyBBRk1UX1MxNl9MRSA6IAoJCQkgICAgICAgQUZNVF9VOCwgcCk7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgoJCWlmIChnZXRfdXNlcih2YWwsIHApKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlpZiAodmFsICE9IDApIHsKCQkJaWYgKChyZXQgPSBsb2NrX3NldF9mbXQoc3RhdGUpKSA8IDApCgkJCQlyZXR1cm4gcmV0OwoKCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJCQlzdG9wX2RhYyhzdGF0ZSk7CgkJCQlkbWFidWYtPnJlYWR5ID0gMDsKCgkJCQkvL3ByZXZlbnQgZnJvbSBtZW1vcnkgbGVhawoJCQkJaWYgKChzdGF0ZS0+Y2hhbnNfbnVtID4gMikgJiYgKHN0YXRlLT5jaGFuc19udW0gIT0gdmFsKSkgewoJCQkJCWFsaV9mcmVlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RhdGUpOwoJCQkJCXN0YXRlLT5jaGFuc19udW0gPSAxOwoJCQkJfQoKCQkJCWlmICh2YWwgPj0gMikgewoKCQkJCQlkbWFidWYtPmZtdCB8PSBUUklERU5UX0ZNVF9TVEVSRU87CgkJCQkJaWYgKCh2YWwgPT0gNikgJiYgKHN0YXRlLT5jYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkpIHsKCQkJCQkJaWYgKGNhcmQtPnJlY19jaGFubmVsX3VzZV9jb3VudCA+IDApIHsKCQkJCQkJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogUmVjb3JkIGlzICIKCQkJCQkJCSAgICAgICAid29ya2luZyBvbiB0aGUgY2FyZCFcbiIpOwoJCQkJCQkJcmV0ID0gLUVCVVNZOwoJCQkJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCgkJCQkJCXJldCA9IGFsaV9zZXR1cF9tdWx0aV9jaGFubmVscyhzdGF0ZS0+Y2FyZCwgNik7CgkJCQkJCWlmIChyZXQgPCAwKSB7CgkJCQkJCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQltdXRleF9sb2NrKCZzdGF0ZS0+Y2FyZC0+b3Blbl9tdXRleCk7CgkJCQkJCXJldCA9IGFsaV9hbGxvY2F0ZV9vdGhlcl9zdGF0ZXNfcmVzb3VyY2VzKHN0YXRlLCA2KTsKCQkJCQkJaWYgKHJldCA8IDApIHsKCQkJCQkJCW11dGV4X3VubG9jaygmc3RhdGUtPmNhcmQtPm9wZW5fbXV0ZXgpOwoJCQkJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJc3RhdGUtPmNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50Kys7CgkJCQkJCW11dGV4X3VubG9jaygmc3RhdGUtPmNhcmQtPm9wZW5fbXV0ZXgpOwoJCQkJCX0gZWxzZQoJCQkJCQl2YWwgPSAyOwkvKnlpZWxkIHRvIDItY2hhbm5lbHMgKi8KCQkJCX0gZWxzZQoJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5UUklERU5UX0ZNVF9TVEVSRU87CgkJCQlzdGF0ZS0+Y2hhbnNfbnVtID0gdmFsOwoJCQl9CgkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJCQlzdG9wX2FkYyhzdGF0ZSk7CgkJCQlkbWFidWYtPnJlYWR5ID0gMDsKCQkJCWlmICh2YWwgPj0gMikgewoJCQkJCWlmICghKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgCgkJCQkJICAgICAgKHZhbCA9PSA2KSkpCgkJCQkJCXZhbCA9IDI7CgkJCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfU1RFUkVPOwoJCQkJfSBlbHNlCgkJCQkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UX1NURVJFTzsKCQkJCXN0YXRlLT5jaGFuc19udW0gPSB2YWw7CgkJCX0KCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoJCX0KCQlyZXQgPSBwdXRfdXNlcih2YWwsIHApOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgoJCS8qIENhdXNlIHRoZSB3b3JraW5nIGZyYWdtZW50IHRvIGJlIG91dHB1dCAqLwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CgkJaWYgKGRtYWJ1Zi0+c3ViZGl2aXNpb24pIHsKCQkJcmV0ID0gLUVJTlZBTDsKCQkJYnJlYWs7CgkJfQoJCWlmIChnZXRfdXNlcih2YWwsIHApKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIgJiYgdmFsICE9IDQpIHsKCQkJcmV0ID0gLUVJTlZBTDsKCQkJYnJlYWs7CgkJfQoJCWRtYWJ1Zi0+c3ViZGl2aXNpb24gPSB2YWw7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgoJCWlmIChnZXRfdXNlcih2YWwsIHApKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCgkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CgkJZG1hYnVmLT5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOwoJCWlmIChkbWFidWYtPm9zc2ZyYWdzaGlmdCA8IDQpCgkJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gNDsKCQlpZiAoZG1hYnVmLT5vc3NmcmFnc2hpZnQgPiAxNSkKCQkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSAxNTsKCQlpZiAoZG1hYnVmLT5vc3NtYXhmcmFncyA8IDQpCgkJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSA0OwoKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgoJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkgewoJCQlyZXQgPSAtRUlOVkFMOwoJCQlicmVhazsKCQl9CgkJaWYgKCFkbWFidWYtPnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpICE9IDApIHsKCQkJcmV0ID0gdmFsOwoJCQlicmVhazsKCQl9CgkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKCQlhYmluZm8uZnJhZ3NpemUgPSBkbWFidWYtPmZyYWdzaXplOwoJCWFiaW5mby5ieXRlcyA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIGRtYWJ1Zi0+Y291bnQ7CgkJYWJpbmZvLmZyYWdzdG90YWwgPSBkbWFidWYtPm51bWZyYWc7CgkJYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBkbWFidWYtPmZyYWdzaGlmdDsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YgKGFiaW5mbykpID8gCgkJCS1FRkFVTFQgOiAwOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CgkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKCQkJcmV0ID0gLUVJTlZBTDsKCQkJYnJlYWs7CgkJfQoJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkgIT0gMCkgewoJCQlyZXQgPSB2YWw7CgkJCWJyZWFrOwoJCX0KCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOwoJCWFiaW5mby5mcmFnc2l6ZSA9IGRtYWJ1Zi0+ZnJhZ3NpemU7CgkJYWJpbmZvLmJ5dGVzID0gZG1hYnVmLT5jb3VudDsKCQlhYmluZm8uZnJhZ3N0b3RhbCA9IGRtYWJ1Zi0+bnVtZnJhZzsKCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJcmV0ID0gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZiAoYWJpbmZvKSkgPyAKCQkJLUVGQVVMVCA6IDA7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgoJCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKCQlyZXQgPSBwdXRfdXNlcihEU1BfQ0FQX1JFQUxUSU1FIHwgRFNQX0NBUF9UUklHR0VSIHwgCgkJCSAgICAgICBEU1BfQ0FQX01NQVAgfCBEU1BfQ0FQX0JJTkQsIHApOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgoJCXZhbCA9IDA7CgkJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSAmJiBkbWFidWYtPmVuYWJsZSkKCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CgkJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgZG1hYnVmLT5lbmFibGUpCgkJCXZhbCB8PSBQQ01fRU5BQkxFX09VVFBVVDsKCQlyZXQgPSBwdXRfdXNlcih2YWwsIHApOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgoJCWlmIChnZXRfdXNlcih2YWwsIHApKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgewoJCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIAoJCQkJICAgIChyZXQgPSBwcm9nX2RtYWJ1Zl9yZWNvcmQoc3RhdGUpKSkKCQkJCQlicmVhazsKCQkJCXN0YXJ0X2FkYyhzdGF0ZSk7CgkJCX0gZWxzZQoJCQkJc3RvcF9hZGMoc3RhdGUpOwoJCX0KCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7CgkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgCgkJCQkgICAgKHJldCA9IHByb2dfZG1hYnVmX3BsYXliYWNrKHN0YXRlKSkpCgkJCQkJYnJlYWs7CgkJCQlzdGFydF9kYWMoc3RhdGUpOwoJCQl9IGVsc2UKCQkJCXN0b3BfZGFjKHN0YXRlKTsKCQl9CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CgkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKCQkJcmV0ID0gLUVJTlZBTDsKCQkJYnJlYWs7CgkJfQoJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkKCQkgICAgIT0gMCkgewoJCQlyZXQgPSB2YWw7CgkJCWJyZWFrOwoJCX0KCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOwoJCWNpbmZvLmJ5dGVzID0gZG1hYnVmLT50b3RhbF9ieXRlczsKCQljaW5mby5ibG9ja3MgPSBkbWFidWYtPmNvdW50ID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwoJCWNpbmZvLnB0ciA9IGRtYWJ1Zi0+aHdwdHI7CgkJaWYgKGRtYWJ1Zi0+bWFwcGVkKQoJCQlkbWFidWYtPmNvdW50ICY9IGRtYWJ1Zi0+ZnJhZ3NpemUgLSAxOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJcmV0ID0gY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mIChjaW5mbykpID8gCgkJCS1FRkFVTFQgOiAwOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgoJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkgewoJCQlyZXQgPSAtRUlOVkFMOwoJCQlicmVhazsKCQl9CgkJaWYgKCFkbWFidWYtPnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpCgkJICAgICE9IDApIHsKCQkJcmV0ID0gdmFsOwoJCQlicmVhazsKCQl9CgoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCXRyaWRlbnRfdXBkYXRlX3B0cihzdGF0ZSk7CgkJY2luZm8uYnl0ZXMgPSBkbWFidWYtPnRvdGFsX2J5dGVzOwoJCWNpbmZvLmJsb2NrcyA9IGRtYWJ1Zi0+Y291bnQgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CgkJY2luZm8ucHRyID0gZG1hYnVmLT5od3B0cjsKCQlpZiAoZG1hYnVmLT5tYXBwZWQpCgkJCWRtYWJ1Zi0+Y291bnQgJj0gZG1hYnVmLT5mcmFnc2l6ZSAtIDE7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YgKGNpbmZvKSkgPyAKCQkJLUVGQVVMVCA6IDA7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKCQlyZXQgPSAtRUlOVkFMOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CgkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKSB7CgkJCXJldCA9IC1FSU5WQUw7CgkJCWJyZWFrOwoJCX0KCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX3BsYXliYWNrKHN0YXRlKSkgIT0gMCkgewoJCQlyZXQgPSB2YWw7CgkJCWJyZWFrOwoJCX0KCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOwoJCXZhbCA9IGRtYWJ1Zi0+Y291bnQ7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlyZXQgPSBwdXRfdXNlcih2YWwsIHApOwoJCWJyZWFrOwoKCWNhc2UgU09VTkRfUENNX1JFQURfUkFURToKCQlyZXQgPSBwdXRfdXNlcihkbWFidWYtPnJhdGUsIHApOwoJCWJyZWFrOwoKCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CgkJcmV0ID0gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfU1RFUkVPKSA/IDIgOiAxLCAKCQkJICAgICAgIHApOwoJCWJyZWFrOwoKCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKCQlyZXQgPSBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyBBRk1UX1MxNl9MRSA6IAoJCQkgICAgICAgQUZNVF9VOCwgcCk7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX0dFVENIQU5ORUxNQVNLOgoJCXJldCA9IHB1dF91c2VyKERTUF9CSU5EX0ZST05UIHwgRFNQX0JJTkRfU1VSUiB8IAoJCQkgICAgICAgRFNQX0JJTkRfQ0VOVEVSX0xGRSwgIHApOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9CSU5EX0NIQU5ORUw6CgkJaWYgKHN0YXRlLT5jYXJkLT5wY2lfaWQgIT0gUENJX0RFVklDRV9JRF9TSV83MDE4KSB7CgkJCXJldCA9IC1FSU5WQUw7CgkJCWJyZWFrOwoJCX0KCgkJaWYgKGdldF91c2VyKHZhbCwgcCkpIHsKCQkJcmV0ID0gLUVGQVVMVDsKCQkJYnJlYWs7CgkJfQoJCWlmICh2YWwgPT0gRFNQX0JJTkRfUVVFUlkpIHsKCQkJdmFsID0gZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgfCAweDNjMDA7CgkJCXZhbCA9IGF0dHIybWFza1t2YWwgPj4gOF07CgkJfSBlbHNlIHsKCQkJZG1hYnVmLT5yZWFkeSA9IDA7CgkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQoJCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSAoQ0hBTk5FTF9SRUMgfCAKCQkJCQkJCSAgICAgIFNSQ19FTkFCTEUpOwoJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCgkJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSA9IChDSEFOTkVMX1NQQ19QQiB8IAoJCQkJCQkJICAgICAgU1JDX0VOQUJMRSk7CgkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlIHw9IG1hc2syYXR0cltmZnModmFsKV07CgkJfQoJCXJldCA9IHB1dF91c2VyKHZhbCwgcCk7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX01BUElOQlVGOgoJY2FzZSBTTkRDVExfRFNQX01BUE9VVEJVRjoKCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CgljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CgljYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKCWRlZmF1bHQ6CgkJcmV0ID0gLUVJTlZBTDsKCQlicmVhazsKCgl9CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50CnRyaWRlbnRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJaW50IGkgPSAwOwoJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBkZXZzOwoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gTlVMTDsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9IE5VTEw7CgoJLyogQWRkZWQgYnkgTWF0dCBXdSAwMS0wNS0yMDAxICovCgkvKiBUT0RPOiB0aGVyZSdzIHNvbWUgcmVkdW5kYWN5IGhlcmUgd3J0IHRoZSBjaGVjayBiZWxvdyAqLwoJLyogZm9yIG11bHRpX3VzZV9jb3VudCA+IDAuIFNob3VsZCB3ZSByZXR1cm4gLUVCVVNZIG9yIGZpbmQgKi8KCS8qIGEgZGlmZmVyZW50IGNhcmQ/IGZvciBub3csIGRvbid0IGJyZWFrIGN1cnJlbnQgYmVoYXZpb3VyICovCgkvKiAtLSBtdWxpeCAqLwoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKCQkJaWYgKGNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50ID4gMCkKCQkJCXJldHVybiAtRUJVU1k7CgkJfQoJfQoKCS8qIGZpbmQgYW4gYXZhaWxhYmxlIHZpcnR1YWwgY2hhbm5lbCAoaW5zdGFuY2Ugb2YgL2Rldi9kc3ApICovCgl3aGlsZSAoY2FyZCAhPSBOVUxMKSB7CgkJbXV0ZXhfbG9jaygmY2FyZC0+b3Blbl9tdXRleCk7CgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQkJLyogU2tpcCBvcGVucyBvbiBjYXJkcyB0aGF0IGFyZSBpbiA2IGNoYW5uZWwgbW9kZSAqLwoJCQlpZiAoY2FyZC0+bXVsdGlfY2hhbm5lbF91c2VfY291bnQgPiAwKSB7CgkJCQltdXRleF91bmxvY2soJmNhcmQtPm9wZW5fbXV0ZXgpOwoJCQkJY2FyZCA9IGNhcmQtPm5leHQ7CgkJCQljb250aW51ZTsKCQkJfQoJCX0KCQlmb3IgKGkgPSAwOyBpIDwgTlJfSFdfQ0g7IGkrKykgewoJCQlpZiAoY2FyZC0+c3RhdGVzW2ldID09IE5VTEwpIHsKCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzW2ldID0ga3phbGxvYyhzaXplb2YoKnN0YXRlKSwgR0ZQX0tFUk5FTCk7CgkJCQlpZiAoc3RhdGUgPT0gTlVMTCkgewoJCQkJCW11dGV4X3VubG9jaygmY2FyZC0+b3Blbl9tdXRleCk7CgkJCQkJcmV0dXJuIC1FTk9NRU07CgkJCQl9CgkJCQltdXRleF9pbml0KCZzdGF0ZS0+c2VtKTsKCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJCQkJZ290byBmb3VuZF92aXJ0OwoJCQl9CgkJfQoJCW11dGV4X3VubG9jaygmY2FyZC0+b3Blbl9tdXRleCk7CgkJY2FyZCA9IGNhcmQtPm5leHQ7Cgl9CgkvKiBubyBtb3JlIHZpcnR1YWwgY2hhbm5lbCBhdmFpYWJsZSAqLwoJaWYgKCFzdGF0ZSkgewoJCXJldHVybiAtRU5PREVWOwoJfQogICAgICBmb3VuZF92aXJ0OgoJLyogZm91bmQgYSBmcmVlIHZpcnR1YWwgY2hhbm5lbCwgYWxsb2NhdGUgaGFyZHdhcmUgY2hhbm5lbHMgKi8KCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQoJCWRtYWJ1Zi0+Y2hhbm5lbCA9IGNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbChjYXJkKTsKCWVsc2UKCQlkbWFidWYtPmNoYW5uZWwgPSBjYXJkLT5hbGxvY19wY21fY2hhbm5lbChjYXJkKTsKCglpZiAoZG1hYnVmLT5jaGFubmVsID09IE5VTEwpIHsKCQlrZnJlZShjYXJkLT5zdGF0ZXNbaV0pOwoJCWNhcmQtPnN0YXRlc1tpXSA9IE5VTEw7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJLyogaW5pdGlhbGl6ZSB0aGUgdmlydHVhbCBjaGFubmVsICovCglzdGF0ZS0+dmlydCA9IGk7CglzdGF0ZS0+Y2FyZCA9IGNhcmQ7CglzdGF0ZS0+bWFnaWMgPSBUUklERU5UX1NUQVRFX01BR0lDOwoJaW5pdF93YWl0cXVldWVfaGVhZCgmZG1hYnVmLT53YWl0KTsKCWZpbGUtPnByaXZhdGVfZGF0YSA9IHN0YXRlOwoKCS8qIHNldCBkZWZhdWx0IHNhbXBsZSBmb3JtYXQuIEFjY29yZGluZyB0byBPU1MgUHJvZ3JhbW1lcidzICovIAoJLyogR3VpZGUgIC9kZXYvZHNwIHNob3VsZCBiZSBkZWZhdWx0IHRvIHVuc2lnbmVkIDgtYml0cywgbW9ubywgKi8gCgkvKiB3aXRoIHNhbXBsZSByYXRlIDhrSHogYW5kIC9kZXYvZHNwVyB3aWxsIGFjY2VwdCAxNi1iaXRzIHNhbXBsZSAqLwoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UX01BU0s7CgkJaWYgKChtaW5vciAmIDB4MGYpID09IFNORF9ERVZfRFNQMTYpCgkJCWRtYWJ1Zi0+Zm10IHw9IFRSSURFTlRfRk1UXzE2QklUOwoJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gMDsKCQlkbWFidWYtPm9zc21heGZyYWdzID0gMDsKCQlkbWFidWYtPnN1YmRpdmlzaW9uID0gMDsKCQlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfU0lfNzAxOCkgewoJCQkvKiBzZXQgZGVmYXVsdCBjaGFubmVsIGF0dHJpYnV0ZSB0byBub3JtYWwgcGxheWJhY2sgKi8KCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSBDSEFOTkVMX1BCOwoJCX0KCQl0cmlkZW50X3NldF9kYWNfcmF0ZShzdGF0ZSwgODAwMCk7Cgl9CgoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQkvKiBGSVhNRTogVHJpZGVudCA0ZCBjYW4gb25seSByZWNvcmQgaW4gc2lnbmVkIDE2LWJpdHMgc3RlcmVvLCAqLyAKCQkvKiA0OGtIeiBzYW1wbGUsIHRvIGJlIGRlYWxlZCB3aXRoIGluIHRyaWRlbnRfc2V0X2FkY19yYXRlKCkgPz8gKi8KCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfTUFTSzsKCQlpZiAoKG1pbm9yICYgMHgwZikgPT0gU05EX0RFVl9EU1AxNikKCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfMTZCSVQ7CgkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSAwOwoJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSAwOwoJCWRtYWJ1Zi0+c3ViZGl2aXNpb24gPSAwOwoJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9TSV83MDE4KSB7CgkJCS8qIHNldCBkZWZhdWx0IGNoYW5uZWwgYXR0cmlidXRlIHRvIDB4OGE4MCwgcmVjb3JkIGZyb20KCQkJICAgUENNIEwvUiBGSUZPIGFuZCBtb25vID0gKGxlZnQgKyByaWdodCArIDEpLzIgKi8KCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSAoQ0hBTk5FTF9SRUMgfCBQQ01fTFIgfCAKCQkJCQkJICAgICAgTU9OT19NSVgpOwoJCX0KCQl0cmlkZW50X3NldF9hZGNfcmF0ZShzdGF0ZSwgODAwMCk7CgoJCS8qIEFkZGVkIGJ5IE1hdHQgV3UgMDEtMDUtMjAwMSAqLwoJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkKCQkJY2FyZC0+cmVjX2NoYW5uZWxfdXNlX2NvdW50Kys7Cgl9CgoJc3RhdGUtPm9wZW5fbW9kZSB8PSBmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKTsKCW11dGV4X3VubG9jaygmY2FyZC0+b3Blbl9tdXRleCk7CgoJcHJfZGVidWcoInRyaWRlbnQ6IG9wZW4gdmlydHVhbCBjaGFubmVsICVkLCBoYXJkIGNoYW5uZWwgJWRcbiIsCgkJIHN0YXRlLT52aXJ0LCBkbWFidWYtPmNoYW5uZWwtPm51bSk7CgoJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwp9CgpzdGF0aWMgaW50CnRyaWRlbnRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZDsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKCglWQUxJREFURV9TVEFURShzdGF0ZSk7CgoJY2FyZCA9IHN0YXRlLT5jYXJkOwoJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CgoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJdHJpZGVudF9jbGVhcl90YWlsKHN0YXRlKTsKCQlkcmFpbl9kYWMoc3RhdGUsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKCX0KCglwcl9kZWJ1ZygidHJpZGVudDogY2xvc2luZyB2aXJ0dWFsIGNoYW5uZWwgJWQsIGhhcmQgY2hhbm5lbCAlZFxuIiwKCQkgc3RhdGUtPnZpcnQsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtKTsKCgkvKiBzdG9wIERNQSBzdGF0ZSBtYWNoaW5lIGFuZCBmcmVlIERNQSBidWZmZXJzL2NoYW5uZWxzICovCgltdXRleF9sb2NrKCZjYXJkLT5vcGVuX211dGV4KTsKCglpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKCQlzdG9wX2RhYyhzdGF0ZSk7CgkJZGVhbGxvY19kbWFidWYoJnN0YXRlLT5kbWFidWYsIHN0YXRlLT5jYXJkLT5wY2lfZGV2KTsKCQlzdGF0ZS0+Y2FyZC0+ZnJlZV9wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCwgZG1hYnVmLT5jaGFubmVsLT5udW0pOwoKCQkvKiBBZGRlZCBieSBNYXR0IFd1ICovCgkJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID4gMikgewoJCQkJaWYgKGNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50LS0gPCAwKQoJCQkJCWNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50ID0gMDsKCQkJCWlmIChjYXJkLT5tdWx0aV9jaGFubmVsX3VzZV9jb3VudCA9PSAwKQoJCQkJCWFsaV9jbG9zZV9tdWx0aV9jaGFubmVscygpOwoJCQkJYWxpX2ZyZWVfb3RoZXJfc3RhdGVzX3Jlc291cmNlcyhzdGF0ZSk7CgkJCX0KCQl9Cgl9CglpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCXN0b3BfYWRjKHN0YXRlKTsKCQlkZWFsbG9jX2RtYWJ1Zigmc3RhdGUtPmRtYWJ1Ziwgc3RhdGUtPmNhcmQtPnBjaV9kZXYpOwoJCXN0YXRlLT5jYXJkLT5mcmVlX3BjbV9jaGFubmVsKHN0YXRlLT5jYXJkLCBkbWFidWYtPmNoYW5uZWwtPm51bSk7CgoJCS8qIEFkZGVkIGJ5IE1hdHQgV3UgKi8KCQlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKCQkJaWYgKGNhcmQtPnJlY19jaGFubmVsX3VzZV9jb3VudC0tIDwgMCkKCQkJCWNhcmQtPnJlY19jaGFubmVsX3VzZV9jb3VudCA9IDA7CgkJfQoJfQoKCWNhcmQtPnN0YXRlc1tzdGF0ZS0+dmlydF0gPSBOVUxMOwoJa2ZyZWUoc3RhdGUpOwoKCS8qIHdlJ3JlIGNvdmVyZWQgYnkgdGhlIG9wZW5fbXV0ZXggKi8KCW11dGV4X3VubG9jaygmY2FyZC0+b3Blbl9tdXRleCk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyAvKmNvbnN0ICovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJpZGVudF9hdWRpb19mb3BzID0gewoJLm93bmVyID0gVEhJU19NT0RVTEUsCgkubGxzZWVrID0gbm9fbGxzZWVrLAoJLnJlYWQgPSB0cmlkZW50X3JlYWQsCgkud3JpdGUgPSB0cmlkZW50X3dyaXRlLAoJLnBvbGwgPSB0cmlkZW50X3BvbGwsCgkuaW9jdGwgPSB0cmlkZW50X2lvY3RsLAoJLm1tYXAgPSB0cmlkZW50X21tYXAsCgkub3BlbiA9IHRyaWRlbnRfb3BlbiwKCS5yZWxlYXNlID0gdHJpZGVudF9yZWxlYXNlLAp9OwoKLyogdHJpZGVudCBzcGVjaWZpYyBBQzk3IGZ1bmN0aW9ucyAqLwovKiBXcml0ZSBBQzk3IGNvZGVjIHJlZ2lzdGVycyAqLwpzdGF0aWMgdm9pZAp0cmlkZW50X2FjOTdfc2V0KHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnLCB1MTYgdmFsKQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gKHN0cnVjdCB0cmlkZW50X2NhcmQgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOwoJdW5zaWduZWQgaW50IGFkZHJlc3MsIG1hc2ssIGJ1c3k7Cgl1bnNpZ25lZCBzaG9ydCBjb3VudCA9IDB4ZmZmZjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1MzIgZGF0YTsKCglkYXRhID0gKCh1MzIpIHZhbCkgPDwgMTY7CgoJc3dpdGNoIChjYXJkLT5wY2lfaWQpIHsKCWRlZmF1bHQ6CgljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKCQlhZGRyZXNzID0gU0lfQUM5N19XUklURTsKCQltYXNrID0gU0lfQUM5N19CVVNZX1dSSVRFIHwgU0lfQUM5N19BVURJT19CVVNZOwoJCWlmIChjb2RlYy0+aWQpCgkJCW1hc2sgfD0gU0lfQUM5N19TRUNPTkRBUlk7CgkJYnVzeSA9IFNJX0FDOTdfQlVTWV9XUklURTsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWDoKCQlhZGRyZXNzID0gRFhfQUNSMF9BQzk3X1c7CgkJbWFzayA9IGJ1c3kgPSBEWF9BQzk3X0JVU1lfV1JJVEU7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfTlg6CgkJYWRkcmVzcyA9IE5YX0FDUjFfQUM5N19XOwoJCW1hc2sgPSBOWF9BQzk3X0JVU1lfV1JJVEU7CgkJaWYgKGNvZGVjLT5pZCkKCQkJbWFzayB8PSBOWF9BQzk3X1dSSVRFX1NFQ09OREFSWTsKCQlidXN5ID0gTlhfQUM5N19CVVNZX1dSSVRFOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwOgoJCWFkZHJlc3MgPSBTSV9BQzk3X1dSSVRFOwoJCW1hc2sgPSBidXN5ID0gU0lfQUM5N19CVVNZX1dSSVRFOwoJCWlmIChjb2RlYy0+aWQpCgkJCW1hc2sgfD0gU0lfQUM5N19TRUNPTkRBUlk7CgkJYnJlYWs7Cgl9CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCWRvIHsKCQlpZiAoKGludyhUUklEX1JFRyhjYXJkLCBhZGRyZXNzKSkgJiBidXN5KSA9PSAwKQoJCQlicmVhazsKCX0gd2hpbGUgKGNvdW50LS0pOwoKCWRhdGEgfD0gKG1hc2sgfCAocmVnICYgQUM5N19SRUdfQUREUikpOwoKCWlmIChjb3VudCA9PSAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBBQzk3IENPREVDIHdyaXRlIHRpbWVkIG91dC5cbiIpOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlyZXR1cm47Cgl9CgoJb3V0bChkYXRhLCBUUklEX1JFRyhjYXJkLCBhZGRyZXNzKSk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cn0KCi8qIFJlYWQgQUM5NyBjb2RlYyByZWdpc3RlcnMgKi8Kc3RhdGljIHUxNgp0cmlkZW50X2FjOTdfZ2V0KHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnKQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gKHN0cnVjdCB0cmlkZW50X2NhcmQgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOwoJdW5zaWduZWQgaW50IGFkZHJlc3MsIG1hc2ssIGJ1c3k7Cgl1bnNpZ25lZCBzaG9ydCBjb3VudCA9IDB4ZmZmZjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1MzIgZGF0YTsKCglzd2l0Y2ggKGNhcmQtPnBjaV9pZCkgewoJZGVmYXVsdDoKCWNhc2UgUENJX0RFVklDRV9JRF9TSV83MDE4OgoJCWFkZHJlc3MgPSBTSV9BQzk3X1JFQUQ7CgkJbWFzayA9IFNJX0FDOTdfQlVTWV9SRUFEIHwgU0lfQUM5N19BVURJT19CVVNZOwoJCWlmIChjb2RlYy0+aWQpCgkJCW1hc2sgfD0gU0lfQUM5N19TRUNPTkRBUlk7CgkJYnVzeSA9IFNJX0FDOTdfQlVTWV9SRUFEOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYOgoJCWFkZHJlc3MgPSBEWF9BQ1IxX0FDOTdfUjsKCQltYXNrID0gYnVzeSA9IERYX0FDOTdfQlVTWV9SRUFEOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgoJCWlmIChjb2RlYy0+aWQpCgkJCWFkZHJlc3MgPSBOWF9BQ1IzX0FDOTdfUl9TRUNPTkRBUlk7CgkJZWxzZQoJCQlhZGRyZXNzID0gTlhfQUNSMl9BQzk3X1JfUFJJTUFSWTsKCQltYXNrID0gTlhfQUM5N19CVVNZX1JFQUQ7CgkJYnVzeSA9IE5YX0FDOTdfQlVTWV9SRUFEIHwgTlhfQUM5N19CVVNZX0RBVEE7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTA6CgkJYWRkcmVzcyA9IFNJX0FDOTdfUkVBRDsKCQltYXNrID0gYnVzeSA9IFNJX0FDOTdfQlVTWV9SRUFEOwoJCWlmIChjb2RlYy0+aWQpCgkJCW1hc2sgfD0gU0lfQUM5N19TRUNPTkRBUlk7CgkJYnJlYWs7Cgl9CgoJZGF0YSA9IChtYXNrIHwgKHJlZyAmIEFDOTdfUkVHX0FERFIpKTsKCglzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoJb3V0bChkYXRhLCBUUklEX1JFRyhjYXJkLCBhZGRyZXNzKSk7CglkbyB7CgkJZGF0YSA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyZXNzKSk7CgkJaWYgKChkYXRhICYgYnVzeSkgPT0gMCkKCQkJYnJlYWs7Cgl9IHdoaWxlIChjb3VudC0tKTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCglpZiAoY291bnQgPT0gMCkgewoJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogQUM5NyBDT0RFQyByZWFkIHRpbWVkIG91dC5cbiIpOwoJCWRhdGEgPSAwOwoJfQoJcmV0dXJuICgodTE2KSAoZGF0YSA+PiAxNikpOwp9CgovKiByZXdyaXRlIGFjOTcgcmVhZCBhbmQgd3JpdGUgbWl4ZXIgcmVnaXN0ZXIgYnkgaHVsZWkgZm9yIEFMSSovCnN0YXRpYyBpbnQKYWNxdWlyZWNvZGVjYWNjZXNzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXUxNiB3c2VtYW1hc2sgPSAweDYwMDA7CS8qIGJpdCAxNC4uMTMgKi8KCXUxNiB3c2VtYWJpdHM7Cgl1MTYgd2NvbnRyb2w7CglpbnQgYmxvY2sgPSAwOwoJaW50IG5jb3VudCA9IDI1OwoJd2hpbGUgKDEpIHsKCQl3Y29udHJvbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJCXdzZW1hYml0cyA9IHdjb250cm9sICYgd3NlbWFtYXNrOwoKCQlpZiAod3NlbWFiaXRzID09IDB4NDAwMCkKCQkJcmV0dXJuIDE7CS8qIDB4NDAwMCBpcyBhdWRpbyAsdGhlbiBzdWNjZXNzICovCgkJaWYgKG5jb3VudC0tIDwgMCkKCQkJYnJlYWs7CgkJaWYgKHdzZW1hYml0cyA9PSAwKSB7CgkJICAgICAgdW5sb2NrOgoJCQlvdXRsKCgodTMyKSAod2NvbnRyb2wgJiAweDFlZmYpIHwgMHgwMDAwNDAwMCksIAoJCQkgICAgIFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CgkJCWNvbnRpbnVlOwoJCX0KCQl1ZGVsYXkoMjApOwoJfQoJaWYgKCFibG9jaykgewoJCXByX2RlYnVnKCJhY2Nlc3Njb2RlY3NlbWFwaG9yZTogdHJ5IHVubG9ja1xuIik7CgkJYmxvY2sgPSAxOwoJCWdvdG8gdW5sb2NrOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCnJlbGVhc2Vjb2RlY2FjY2VzcyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1bnNpZ25lZCBsb25nIHdjb250cm9sOwoJd2NvbnRyb2wgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKCW91dGwoKHdjb250cm9sICYgMHhmZmZmMWVmZiksIFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7Cn0KCnN0YXRpYyBpbnQKd2FpdGZvcnN0aW1lcnRpY2soc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJdW5zaWduZWQgbG9uZyBjaGsxLCBjaGsyOwoJdW5zaWduZWQgaW50IHdjb3VudCA9IDB4ZmZmZjsKCWNoazEgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX1NUSU1FUikpOwoKCXdoaWxlICgxKSB7CgkJY2hrMiA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU1RJTUVSKSk7CgkJaWYgKCh3Y291bnQgPiAwKSAmJiBjaGsxICE9IGNoazIpCgkJCXJldHVybiAxOwoJCWlmICh3Y291bnQgPD0gMCkKCQkJYnJlYWs7CgkJdWRlbGF5KDUwKTsKCX0KCXJldHVybiAwOwp9CgovKiBSZWFkIEFDOTcgY29kZWMgcmVnaXN0ZXJzIGZvciBBTGkqLwpzdGF0aWMgdTE2CmFsaV9hYzk3X2dldChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgc2Vjb25kYXJ5LCB1OCByZWcpCnsKCXVuc2lnbmVkIGludCBhZGRyZXNzLCBtYXNrOwoJdW5zaWduZWQgaW50IG5jb3VudDsKCXVuc2lnbmVkIGxvbmcgYXVkX3JlZzsKCXUzMiBkYXRhOwoJdTE2IHdjb250cm9sOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglpZiAoIWNhcmQpCgkJQlVHKCk7CgoJYWRkcmVzcyA9IEFMSV9BQzk3X1JFQUQ7CglpZiAoY2FyZC0+cmV2aXNpb24gPT0gQUxJXzU0NTFfVjAyKSB7CgkJYWRkcmVzcyA9IEFMSV9BQzk3X1dSSVRFOwoJfQoJbWFzayA9IEFMSV9BQzk3X1JFQURfQUNUSU9OIHwgQUxJX0FDOTdfQVVESU9fQlVTWTsKCWlmIChzZWNvbmRhcnkpCgkJbWFzayB8PSBBTElfQUM5N19TRUNPTkRBUlk7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCglpZiAoIWFjcXVpcmVjb2RlY2FjY2VzcyhjYXJkKSkKCQlwcmludGsoS0VSTl9FUlIgImFjY2VzcyBjb2RlYyBmYWlsXG4iKTsKCgl3Y29udHJvbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJd2NvbnRyb2wgJj0gMHhmZTAwOwoJd2NvbnRyb2wgfD0gKDB4ODAwMCB8IHJlZyk7CglvdXR3KHdjb250cm9sLCBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoKCWRhdGEgPSAobWFzayB8IChyZWcgJiBBQzk3X1JFR19BRERSKSk7CgoJaWYgKCF3YWl0Zm9yc3RpbWVydGljayhjYXJkKSkgewoJCXByaW50ayhLRVJOX0VSUiAiYWxpX2FjOTdfcmVhZDogQklUX0NMT0NLIGlzIGRlYWRcbiIpOwoJCWdvdG8gcmVsZWFzZWNvZGVjOwoJfQoKCXVkZWxheSgyMCk7CgoJbmNvdW50ID0gMTA7CgoJd2hpbGUgKDEpIHsKCQlpZiAoKGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpICYgQUxJX0FDOTdfQlVTWV9SRUFEKSAKCQkgICAgIT0gMCkKCQkJYnJlYWs7CgkJaWYgKG5jb3VudCA8PSAwKQoJCQlicmVhazsKCQlpZiAobmNvdW50LS0gPT0gMSkgewoJCQlwcl9kZWJ1ZygiYWxpX2FjOTdfcmVhZCA6dHJ5IGNsZWFyIGJ1c3kgZmxhZ1xuIik7CgkJCWF1ZF9yZWcgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKCQkJb3V0bCgoYXVkX3JlZyAmIDB4ZmZmZjdmZmYpLCAKCQkJICAgICBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJCX0KCQl1ZGVsYXkoMTApOwoJfQoKCWRhdGEgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcmVzcykpOwoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCglyZXR1cm4gKCh1MTYpIChkYXRhID4+IDE2KSk7CgogICAgICByZWxlYXNlY29kZWM6CglyZWxlYXNlY29kZWNhY2Nlc3MoY2FyZCk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CglwcmludGsoS0VSTl9FUlIgImFsaV9hYzk3X3JlYWQ6IEFDOTcgQ09ERUMgcmVhZCB0aW1lZCBvdXQuXG4iKTsKCXJldHVybiAwOwp9CgovKiBXcml0ZSBBQzk3IGNvZGVjIHJlZ2lzdGVycyBmb3IgaHVsZWkqLwpzdGF0aWMgdm9pZAphbGlfYWM5N19zZXQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IHNlY29uZGFyeSwgdTggcmVnLCB1MTYgdmFsKQp7Cgl1bnNpZ25lZCBpbnQgYWRkcmVzcywgbWFzazsKCXVuc2lnbmVkIGludCBuY291bnQ7Cgl1MzIgZGF0YTsKCXUxNiB3Y29udHJvbDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJZGF0YSA9ICgodTMyKSB2YWwpIDw8IDE2OwoKCWlmICghY2FyZCkKCQlCVUcoKTsKCglhZGRyZXNzID0gQUxJX0FDOTdfV1JJVEU7CgltYXNrID0gQUxJX0FDOTdfV1JJVEVfQUNUSU9OIHwgQUxJX0FDOTdfQVVESU9fQlVTWTsKCWlmIChzZWNvbmRhcnkpCgkJbWFzayB8PSBBTElfQUM5N19TRUNPTkRBUlk7CglpZiAoY2FyZC0+cmV2aXNpb24gPT0gQUxJXzU0NTFfVjAyKQoJCW1hc2sgfD0gQUxJX0FDOTdfV1JJVEVfTUlYRVJfUkVHSVNURVI7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCWlmICghYWNxdWlyZWNvZGVjYWNjZXNzKGNhcmQpKQoJCXByaW50ayhLRVJOX0VSUiAiYWxpX2FjOTdfd3JpdGU6IGFjY2VzcyBjb2RlYyBmYWlsXG4iKTsKCgl3Y29udHJvbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJd2NvbnRyb2wgJj0gMHhmZjAwOwoJd2NvbnRyb2wgfD0gKDB4ODEwMCB8IHJlZyk7IC8qIGJpdCA4PTE6IChhbGkxNTM1IClyZXNlcnZlZC8gKi8gCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxpMTUzNSsgd3JpdGUgKi8KCW91dGwoKGRhdGEgfCB3Y29udHJvbCksIFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CgoJaWYgKCF3YWl0Zm9yc3RpbWVydGljayhjYXJkKSkgewoJCXByaW50ayhLRVJOX0VSUiAiQklUX0NMT0NLIGlzIGRlYWRcbiIpOwoJCWdvdG8gcmVsZWFzZWNvZGVjOwoJfQoKCW5jb3VudCA9IDEwOwoJd2hpbGUgKDEpIHsKCQl3Y29udHJvbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJCWlmICghKHdjb250cm9sICYgMHg4MDAwKSkKCQkJYnJlYWs7CgkJaWYgKG5jb3VudCA8PSAwKQoJCQlicmVhazsKCQlpZiAobmNvdW50LS0gPT0gMSkgewoJCQlwcl9kZWJ1ZygiYWxpX2FjOTdfc2V0IDp0cnkgY2xlYXIgYnVzeSBmbGFnISFcbiIpOwoJCQlvdXR3KHdjb250cm9sICYgMHg3ZmZmLCAKCQkJICAgICBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJCX0KCQl1ZGVsYXkoMTApOwoJfQoKICAgICAgcmVsZWFzZWNvZGVjOgoJcmVsZWFzZWNvZGVjYWNjZXNzKGNhcmQpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoJcmV0dXJuOwp9CgpzdGF0aWMgdm9pZAphbGlfZW5hYmxlX3NwZWNpYWxfY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdCkKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXQtPmNhcmQ7Cgl1bnNpZ25lZCBsb25nIHNfY2hhbm5lbHM7CgoJc19jaGFubmVscyA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKCXNfY2hhbm5lbHMgfD0gKDEgPDwgc3RhdC0+ZG1hYnVmLmNoYW5uZWwtPm51bSk7CglvdXRsKHNfY2hhbm5lbHMsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwp9CgpzdGF0aWMgdTE2CmFsaV9hYzk3X3JlYWQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcpCnsKCWludCBpZDsKCXUxNiBkYXRhOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IE5VTEw7CgoJLyogQWRkZWQgYnkgTWF0dCBXdSAqLwoJaWYgKCFjb2RlYykKCQlCVUcoKTsKCgljYXJkID0gKHN0cnVjdCB0cmlkZW50X2NhcmQgKikgY29kZWMtPnByaXZhdGVfZGF0YTsKCglpZiAoIWNhcmQtPm1peGVyX3JlZ3NfcmVhZHkpCgkJcmV0dXJuIGFsaV9hYzk3X2dldChjYXJkLCBjb2RlYy0+aWQsIHJlZyk7CgoJLyoKCSAqICAgICAgRklYTUU6IG5lZWQgdG8gc3RvcCB0aGlzIGNhY2hpbmcgc29tZSByZWdpc3RlcnMKCSAqLwoJaWYgKGNvZGVjLT5pZCkKCQlpZCA9IDE7CgllbHNlCgkJaWQgPSAwOwoKCWRhdGEgPSBjYXJkLT5taXhlcl9yZWdzW3JlZyAvIDJdW2lkXTsKCXJldHVybiBkYXRhOwp9CgpzdGF0aWMgdm9pZAphbGlfYWM5N193cml0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZywgdTE2IHZhbCkKewoJaW50IGlkOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZDsKCgkvKiAgQWRkZWQgYnkgTWF0dCBXdSAqLwoJaWYgKCFjb2RlYykKCQlCVUcoKTsKCgljYXJkID0gKHN0cnVjdCB0cmlkZW50X2NhcmQgKikgY29kZWMtPnByaXZhdGVfZGF0YTsKCglpZiAoIWNhcmQtPm1peGVyX3JlZ3NfcmVhZHkpIHsKCQlhbGlfYWM5N19zZXQoY2FyZCwgY29kZWMtPmlkLCByZWcsIHZhbCk7CgkJcmV0dXJuOwoJfQoKCWlmIChjb2RlYy0+aWQpCgkJaWQgPSAxOwoJZWxzZQoJCWlkID0gMDsKCgljYXJkLT5taXhlcl9yZWdzW3JlZyAvIDJdW2lkXSA9IHZhbDsKCWFsaV9hYzk3X3NldChjYXJkLCBjb2RlYy0+aWQsIHJlZywgdmFsKTsKfQoKLyoKZmxhZzoJQUxJX1NQRElGX09VVF9UT19TUERJRl9PVVQKCUFMSV9QQ01fVE9fU1BESUZfT1VUCiovCgpzdGF0aWMgdm9pZAphbGlfc2V0dXBfc3BkaWZfb3V0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBmbGFnKQp7Cgl1bnNpZ25lZCBsb25nIHNwZGlmOwoJdW5zaWduZWQgY2hhciBjaDsKCgljaGFyIHRlbXA7CglzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CgoJcGNpX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsCgkJCQkgcGNpX2Rldik7CglpZiAocGNpX2RldiA9PSBOVUxMKQoJCXJldHVybjsKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4NjEsICZ0ZW1wKTsKCXRlbXAgfD0gMHg0MDsKCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDYxLCB0ZW1wKTsKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4N2QsICZ0ZW1wKTsKCXRlbXAgfD0gMHgwMTsKCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDdkLCB0ZW1wKTsKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4N2UsICZ0ZW1wKTsKCXRlbXAgJj0gKH4weDIwKTsKCXRlbXAgfD0gMHgxMDsKCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDdlLCB0ZW1wKTsKCglwY2lfZGV2X3B1dChwY2lfZGV2KTsKCgljaCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKTsKCW91dGIoY2ggfCBBTElfU1BESUZfT1VUX0VOQUJMRSwgVFJJRF9SRUcoY2FyZCwgQUxJX1NDVFJMKSk7CgljaCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwoJb3V0YihjaCAmIEFMSV9TUERJRl9PVVRfQ0hfU1RBVFVTLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwoKCWlmIChmbGFnICYgQUxJX1NQRElGX09VVF9UT19TUERJRl9PVVQpIHsKCQlzcGRpZiA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKCQlzcGRpZiB8PSBBTElfU1BESUZfT1VUX0NIX0VOQUJMRTsKCQlzcGRpZiAmPSBBTElfU1BESUZfT1VUX1NFTF9TUERJRjsKCQlvdXR3KHNwZGlmLCBUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKCQlzcGRpZiA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MpKTsKCQlpZiAoZmxhZyAmIEFMSV9TUERJRl9PVVRfTk9OX1BDTSkKCQkJc3BkaWYgfD0gMHgwMDAyOwoJCWVsc2UKCQkJc3BkaWYgJj0gKH4weDAwMDIpOwoJCW91dHcoc3BkaWYsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUykpOwoJfSBlbHNlIHsKCQlzcGRpZiA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKCQlzcGRpZiB8PSBBTElfU1BESUZfT1VUX1NFTF9QQ007CgkJb3V0dyhzcGRpZiwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7Cgl9Cn0KCnN0YXRpYyB2b2lkCmFsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgY2gpCnsKCXVuc2lnbmVkIGxvbmcgc2M7CgoJc2MgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CglzYyAmPSB+KDEgPDwgY2gpOwoJb3V0bChzYywgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7Cn0KCnN0YXRpYyB2b2lkCmFsaV9kaXNhYmxlX3NwZGlmX2luKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXVuc2lnbmVkIGxvbmcgc3BkaWY7CgoJc3BkaWYgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CglzcGRpZiAmPSAofkFMSV9TUERJRl9JTl9TVVBQT1JUKTsKCW91dGwoc3BkaWYsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwoKCWFsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChjYXJkLCBBTElfU1BESUZfSU5fQ0hBTk5FTCk7Cn0KCnN0YXRpYyB2b2lkCmFsaV9zZXR1cF9zcGRpZl9pbihzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1bnNpZ25lZCBsb25nIHNwZGlmOwoKCS8vU2V0IFNQRElGIElOIFN1cHBvcnRlZAoJc3BkaWYgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CglzcGRpZiB8PSBBTElfU1BESUZfSU5fU1VQUE9SVDsKCW91dGwoc3BkaWYsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwoKCS8vU2V0IFNQRElGIElOIFJlYwoJc3BkaWYgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CglzcGRpZiB8PSBBTElfU1BESUZfSU5fQ0hfRU5BQkxFOwoJb3V0bChzcGRpZiwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CgoJc3BkaWYgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCXNwZGlmIHw9IEFMSV9TUERJRl9JTl9DSF9TVEFUVVM7CglvdXRiKHNwZGlmLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwovKgoJc3BkaWYgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCXNwZGlmIHw9IEFMSV9TUERJRl9JTl9GVU5DX0VOQUJMRTsKCW91dGIoc3BkaWYsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CiovCn0KCnN0YXRpYyB2b2lkCmFsaV9kZWxheShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgaW50ZXJ2YWwpCnsKCXVuc2lnbmVkIGxvbmcgYmVnaW50aW1lciwgY3VycmVudHRpbWVyOwoKCWJlZ2ludGltZXIgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX1NUSU1FUikpOwoJY3VycmVudHRpbWVyID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9TVElNRVIpKTsKCgl3aGlsZSAoY3VycmVudHRpbWVyIDwgYmVnaW50aW1lciArIGludGVydmFsKQoJCWN1cnJlbnR0aW1lciA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU1RJTUVSKSk7Cn0KCnN0YXRpYyB2b2lkCmFsaV9kZXRlY3Rfc3BkaWZfcmF0ZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1MTYgd3ZhbCA9IDA7Cgl1MTYgY291bnQgPSAwOwoJdTggYnZhbCA9IDAsIFIxID0gMCwgUjIgPSAwOwoKCWJ2YWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCWJ2YWwgfD0gMHgwMjsKCW91dGIoYnZhbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCglidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMSkpOwoJYnZhbCB8PSAweDFGOwoJb3V0YihidmFsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCArIDEpKTsKCgl3aGlsZSAoKChSMSA8IDB4MEIpIHx8IChSMSA+IDB4MEUpKSAmJiAoUjEgIT0gMHgxMikgJiYgCgkgICAgICAgY291bnQgPD0gNTAwMDApIHsKCQljb3VudCsrOwoKCQlhbGlfZGVsYXkoY2FyZCwgNik7CgoJCWJ2YWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwgKyAxKSk7CgkJUjEgPSBidmFsICYgMHgxRjsKCX0KCglpZiAoY291bnQgPiA1MDAwMCkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgInRyaWRlbnQ6IEVycm9yIGluICIKCQkgICAgICAgImFsaV9kZXRlY3Rfc3BkaWZfcmF0ZSFcbiIpOwoJCXJldHVybjsKCX0KCgljb3VudCA9IDA7CgoJd2hpbGUgKGNvdW50IDw9IDUwMDAwKSB7CgkJY291bnQrKzsKCgkJYWxpX2RlbGF5KGNhcmQsIDYpOwoKCQlidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMSkpOwoJCVIyID0gYnZhbCAmIDB4MUY7CgoJCWlmIChSMiAhPSBSMSkKCQkJUjEgPSBSMjsKCQllbHNlCgkJCWJyZWFrOwoJfQoKCWlmIChjb3VudCA+IDUwMDAwKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAidHJpZGVudDogRXJyb3IgaW4gIgoJCSAgICAgICAiYWxpX2RldGVjdF9zcGRpZl9yYXRlIVxuIik7CgkJcmV0dXJuOwoJfQoKCXN3aXRjaCAoUjIpIHsKCWNhc2UgMHgwYjoKCWNhc2UgMHgwYzoKCWNhc2UgMHgwZDoKCWNhc2UgMHgwZToKCQl3dmFsID0gaW53KFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMikpOwoJCXd2YWwgJj0gMHhFMEYwOwoJCXd2YWwgfD0gKHUxNikgMHgwOSA8PCA4IHwgKHUxNikgMHgwNTsKCQlvdXR3KHd2YWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMikpOwoKCQlidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDMpKSAmIDB4RjA7CgkJb3V0YihidmFsIHwgMHgwMiwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NTICsgMykpOwoJCWJyZWFrOwoKCWNhc2UgMHgxMjoKCQl3dmFsID0gaW53KFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMikpOwoJCXd2YWwgJj0gMHhFMEYwOwoJCXd2YWwgfD0gKHUxNikgMHgwRSA8PCA4IHwgKHUxNikgMHgwODsKCQlvdXR3KHd2YWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMikpOwoKCQlidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDMpKSAmIDB4RjA7CgkJb3V0YihidmFsIHwgMHgwMywgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NTICsgMykpOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJYnJlYWs7Cgl9Cgp9CgpzdGF0aWMgdW5zaWduZWQgaW50CmFsaV9nZXRfc3BkaWZfaW5fcmF0ZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1MzIgZHdSYXRlID0gMDsKCXU4IGJ2YWwgPSAwOwoKCWFsaV9kZXRlY3Rfc3BkaWZfcmF0ZShjYXJkKTsKCglidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CglidmFsICY9IDB4N0Y7CglidmFsIHw9IDB4NDA7CglvdXRiKGJ2YWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CgoJYnZhbCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MgKyAzKSk7CglidmFsICY9IDB4MEY7CgoJc3dpdGNoIChidmFsKSB7CgljYXNlIDA6CgkJZHdSYXRlID0gNDQxMDA7CgkJYnJlYWs7CgljYXNlIDE6CgkJZHdSYXRlID0gNDgwMDA7CgkJYnJlYWs7CgljYXNlIDI6CgkJZHdSYXRlID0gMzIwMDA7CgkJYnJlYWs7CglkZWZhdWx0OgoJCS8vIEVycm9yIG9jY3VycwoJCWJyZWFrOwoJfQoKCXJldHVybiBkd1JhdGU7Cgp9CgpzdGF0aWMgaW50CmFsaV9jbG9zZV9tdWx0aV9jaGFubmVscyh2b2lkKQp7CgljaGFyIHRlbXAgPSAwOwoJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOwoKCXBjaV9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLAoJCQkJIHBjaV9kZXYpOwoJaWYgKHBjaV9kZXYgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgoJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgMHg1OSwgJnRlbXApOwoJdGVtcCAmPSB+MHg4MDsKCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDU5LCB0ZW1wKTsKCglwY2lfZGV2X3B1dChwY2lfZGV2KTsKCglwY2lfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwgUENJX0RFVklDRV9JRF9BTF9NNzEwMSwKCQkJCSBOVUxMKTsKCWlmIChwY2lfZGV2ID09IE5VTEwpCgkJcmV0dXJuIC0xOwoKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4QjgsICZ0ZW1wKTsKCXRlbXAgJj0gfjB4MjA7CglwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpX2RldiwgMHhCOCwgdGVtcCk7CgoJcGNpX2Rldl9wdXQocGNpX2Rldik7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKYWxpX3NldHVwX211bHRpX2NoYW5uZWxzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBjaGFuX251bXMpCnsKCXVuc2lnbmVkIGxvbmcgZHdWYWx1ZTsKCWNoYXIgdGVtcCA9IDA7CglzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CgoJcGNpX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsCgkJCQkgcGNpX2Rldik7CglpZiAocGNpX2RldiA9PSBOVUxMKQoJCXJldHVybiAtMTsKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4NTksICZ0ZW1wKTsKCXRlbXAgfD0gMHg4MDsKCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDU5LCB0ZW1wKTsKCglwY2lfZGV2X3B1dChwY2lfZGV2KTsKCglwY2lfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwgUENJX0RFVklDRV9JRF9BTF9NNzEwMSwKCQkJCSBOVUxMKTsKCWlmIChwY2lfZGV2ID09IE5VTEwpCgkJcmV0dXJuIC0xOwoJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgKGludCkgMHhCOCwgJnRlbXApOwoJdGVtcCB8PSAweDIwOwoJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaV9kZXYsIChpbnQpIDB4QjgsICh1OCkgdGVtcCk7CgoJcGNpX2Rldl9wdXQocGNpX2Rldik7CgoJaWYgKGNoYW5fbnVtcyA9PSA2KSB7CgkJZHdWYWx1ZSA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKSB8IDB4MDAwZjAwMDA7CgkJb3V0bChkd1ZhbHVlLCBUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKTsKCQltZGVsYXkoNCk7CgkJZHdWYWx1ZSA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKTsKCQlpZiAoZHdWYWx1ZSAmIDB4MjAwMDAwMCkgewoJCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAweDAyLCA4MDgwKTsKCQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgMHgzNiwgMCk7CgkJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIDB4MzgsIDApOwoJCQkvKgoJCQkgKiAgICAgIE9uIGEgYm9hcmQgd2l0aCBhIHNpbmdsZSBjb2RlYyB5b3Ugd29uJ3QgZ2V0IHRoZQoJCQkgKiAgICAgIHN1cnJvdW5kLiBPbiBvdGhlciBib2FyZHMgY29uZmlndXJlIGl0LgoJCQkgKi8KCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbMV0gIT0gTlVMTCkgewoJCQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1sxXSwgMHgzNiwgMCk7CgkJCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzFdLCAweDM4LCAwKTsKCQkJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMV0sIDB4MDIsIDB4MDYwNik7CgkJCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzFdLCAweDE4LCAweDAzMDMpOwoJCQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1sxXSwgMHg3NCwgMHgzKTsKCQkJfQoJCQlyZXR1cm4gMTsKCQl9Cgl9CglyZXR1cm4gLUVJTlZBTDsKfQoKc3RhdGljIHZvaWQKYWxpX2ZyZWVfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGNoYW5uZWwpCnsKCWludCBiYW5rOwoKCWlmIChjaGFubmVsID4gMzEpCgkJcmV0dXJuOwoKCWJhbmsgPSBjaGFubmVsID4+IDU7CgljaGFubmVsID0gY2hhbm5lbCAmIDB4MWY7CgoJY2FyZC0+YmFua3NbYmFua10uYml0bWFwICY9IH4oMSA8PCAoY2hhbm5lbCkpOwp9CgpzdGF0aWMgaW50CmFsaV9hbGxvY2F0ZV9vdGhlcl9zdGF0ZXNfcmVzb3VyY2VzKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwgaW50IGNoYW5fbnVtcykKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnM7CglpbnQgaSwgc3RhdGVfY291bnQgPSAwOwoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CglzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICpjaGFubmVsOwoJdW5zaWduZWQgbG9uZyBudW07CgoJYmFuayA9ICZjYXJkLT5iYW5rc1tCQU5LX0FdOwoKCWlmIChjaGFuX251bXMgIT0gNikKCQlyZXR1cm4gMDsKCglmb3IgKGkgPSAwOyAoaSA8IEFMSV9DSEFOTkVMUykgJiYgKHN0YXRlX2NvdW50ICE9IDQpOyBpKyspIHsKCQlpZiAoY2FyZC0+c3RhdGVzW2ldKQoJCQljb250aW51ZTsKCgkJbnVtID0gYWxpX211bHRpX2NoYW5uZWxzXzVfMVtzdGF0ZV9jb3VudF07CgkJaWYgKCEoYmFuay0+Yml0bWFwICYgKDEgPDwgbnVtKSkpIHsKCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgbnVtOwoJCQljaGFubmVsID0gJmJhbmstPmNoYW5uZWxzW251bV07CgkJCWNoYW5uZWwtPm51bSA9IG51bTsKCQl9IGVsc2UgewoJCQlzdGF0ZV9jb3VudC0tOwoJCQlmb3IgKDsgc3RhdGVfY291bnQgPj0gMDsgc3RhdGVfY291bnQtLSkgewoJCQkJa2ZyZWUoc3RhdGUtPm90aGVyX3N0YXRlc1tzdGF0ZV9jb3VudF0pOwoJCQkJbnVtID0gYWxpX211bHRpX2NoYW5uZWxzXzVfMVtzdGF0ZV9jb3VudF07CgkJCQkJYWxpX2ZyZWVfcGNtX2NoYW5uZWwoY2FyZCwgbnVtKTsKCQkJfQoJCQlyZXR1cm4gLUVCVVNZOwoJCX0KCQlzID0gY2FyZC0+c3RhdGVzW2ldID0ga3phbGxvYyhzaXplb2YoKnN0YXRlKSwgR0ZQX0tFUk5FTCk7CgkJaWYgKCFzKSB7CgkJCW51bSA9IGFsaV9tdWx0aV9jaGFubmVsc181XzFbc3RhdGVfY291bnRdOwoJCQlhbGlfZnJlZV9wY21fY2hhbm5lbChjYXJkLCBudW0pOwoJCQlzdGF0ZV9jb3VudC0tOwoJCQlmb3IgKDsgc3RhdGVfY291bnQgPj0gMDsgc3RhdGVfY291bnQtLSkgewoJCQkJbnVtID0gYWxpX211bHRpX2NoYW5uZWxzXzVfMVtzdGF0ZV9jb3VudF07CgkJCQlhbGlfZnJlZV9wY21fY2hhbm5lbChjYXJkLCBudW0pOwoJCQkJa2ZyZWUoc3RhdGUtPm90aGVyX3N0YXRlc1tzdGF0ZV9jb3VudF0pOwoJCQl9CgkJCXJldHVybiAtRU5PTUVNOwoJCX0KCgkJcy0+ZG1hYnVmLmNoYW5uZWwgPSBjaGFubmVsOwoJCXMtPmRtYWJ1Zi5vc3NmcmFnc2hpZnQgPSBzLT5kbWFidWYub3NzbWF4ZnJhZ3MgPQoJCQlzLT5kbWFidWYuc3ViZGl2aXNpb24gPSAwOwoJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYWJ1Zi53YWl0KTsKCQlzLT5tYWdpYyA9IGNhcmQtPm1hZ2ljOwoJCXMtPmNhcmQgPSBjYXJkOwoJCXMtPnZpcnQgPSBpOwoJCWFsaV9lbmFibGVfc3BlY2lhbF9jaGFubmVsKHMpOwoJCXN0YXRlLT5vdGhlcl9zdGF0ZXNbc3RhdGVfY291bnQrK10gPSBzOwoJfQoKCWlmIChzdGF0ZV9jb3VudCAhPSA0KSB7CgkJc3RhdGVfY291bnQtLTsKCQlmb3IgKDsgc3RhdGVfY291bnQgPj0gMDsgc3RhdGVfY291bnQtLSkgewoJCQlrZnJlZShzdGF0ZS0+b3RoZXJfc3RhdGVzW3N0YXRlX2NvdW50XSk7CgkJCW51bSA9IGFsaV9tdWx0aV9jaGFubmVsc181XzFbc3RhdGVfY291bnRdOwoJCQlhbGlfZnJlZV9wY21fY2hhbm5lbChjYXJkLCBudW0pOwoJCX0KCQlyZXR1cm4gLUVCVVNZOwoJfQoJcmV0dXJuIDA7Cn0KCiNpZmRlZiBDT05GSUdfUE0KLyogc2F2ZSByZWdpc3RlcnMgZm9yIEFMaSBQb3dlciBNYW5hZ2VtZW50ICovCnN0YXRpYyBzdHJ1Y3QgYWxpX3NhdmVkX3JlZ2lzdGVycyB7Cgl1bnNpZ25lZCBsb25nIGdsb2JhbF9yZWdzW0FMSV9HTE9CQUxfUkVHU107Cgl1bnNpZ25lZCBsb25nIGNoYW5uZWxfcmVnc1tBTElfQ0hBTk5FTFNdW0FMSV9DSEFOTkVMX1JFR1NdOwoJdW5zaWduZWQgbWl4ZXJfcmVnc1tBTElfTUlYRVJfUkVHU107Cn0gYWxpX3JlZ2lzdGVyczsKCnN0YXRpYyB2b2lkCmFsaV9zYXZlX3JlZ3Moc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWludCBpLCBqOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CgoJYWxpX3JlZ2lzdGVycy5nbG9iYWxfcmVnc1sweDJjXSA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwoJLy9hbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MjBdID0gaW5sKFRSSURfUkVHKGNhcmQsVDREX1NUQVJUX0EpKTsgICAgCglhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MjFdID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9TVE9QX0EpKTsKCgkvL2Rpc2FibGUgYWxsIElSUSBiaXRzCglvdXRsKEFMSV9ESVNBQkxFX0FMTF9JUlEsIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CgoJZm9yIChpID0gMTsgaSA8IEFMSV9NSVhFUl9SRUdTOyBpKyspCgkJYWxpX3JlZ2lzdGVycy5taXhlcl9yZWdzW2ldID0gYWxpX2FjOTdfcmVhZChjYXJkLT5hYzk3X2NvZGVjWzBdLCAKCQkJCQkJCSAgICBpICogMik7CgoJZm9yIChpID0gMDsgaSA8IEFMSV9HTE9CQUxfUkVHUzsgaSsrKSB7CgkJaWYgKChpICogNCA9PSBUNERfTUlTQ0lOVCkgfHwgKGkgKiA0ID09IFQ0RF9TVE9QX0EpKQoJCQljb250aW51ZTsKCQlhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzW2ldID0gaW5sKFRSSURfUkVHKGNhcmQsIGkgKiA0KSk7Cgl9CgoJZm9yIChpID0gMDsgaSA8IEFMSV9DSEFOTkVMUzsgaSsrKSB7CgkJb3V0YihpLCBUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOwoJCWZvciAoaiA9IDA7IGogPCBBTElfQ0hBTk5FTF9SRUdTOyBqKyspCgkJCWFsaV9yZWdpc3RlcnMuY2hhbm5lbF9yZWdzW2ldW2pdID0gaW5sKFRSSURfUkVHKGNhcmQsIAoJCQkJCQkJCQlqICogNCArIDB4ZTApKTsKCX0KCgkvL1N0b3AgYWxsIEhXIGNoYW5uZWwKCW91dGwoQUxJX1NUT1BfQUxMX0NIQU5ORUxTLCBUUklEX1JFRyhjYXJkLCBUNERfU1RPUF9BKSk7CgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwp9CgpzdGF0aWMgdm9pZAphbGlfcmVzdG9yZV9yZWdzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglpbnQgaSwgajsKCglzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoKCWZvciAoaSA9IDE7IGkgPCBBTElfTUlYRVJfUkVHUzsgaSsrKQoJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIGkgKiAyLCAKCQkJICAgICAgIGFsaV9yZWdpc3RlcnMubWl4ZXJfcmVnc1tpXSk7CgoJZm9yIChpID0gMDsgaSA8IEFMSV9DSEFOTkVMUzsgaSsrKSB7CgkJb3V0YihpLCBUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOwoJCWZvciAoaiA9IDA7IGogPCBBTElfQ0hBTk5FTF9SRUdTOyBqKyspCgkJCW91dGwoYWxpX3JlZ2lzdGVycy5jaGFubmVsX3JlZ3NbaV1bal0sIAoJCQkgICAgIFRSSURfUkVHKGNhcmQsIGogKiA0ICsgMHhlMCkpOwoJfQoKCWZvciAoaSA9IDA7IGkgPCBBTElfR0xPQkFMX1JFR1M7IGkrKykgewoJCWlmICgoaSAqIDQgPT0gVDREX01JU0NJTlQpIHx8IChpICogNCA9PSBUNERfU1RPUF9BKSB8fCAKCQkgICAgKGkgKiA0ID09IFQ0RF9TVEFSVF9BKSkKCQkJY29udGludWU7CgkJb3V0bChhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzW2ldLCBUUklEX1JFRyhjYXJkLCBpICogNCkpOwoJfQoKCS8vc3RhcnQgSFcgY2hhbm5lbAoJb3V0bChhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MjBdLCBUUklEX1JFRyhjYXJkLCBUNERfU1RBUlRfQSkpOwoJLy9yZXN0b3JlIElSUSBlbmFibGUgYml0cwoJb3V0bChhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MmNdLCBUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKfQoKc3RhdGljIGludAp0cmlkZW50X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHVudXNlZCkKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOwoKCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewoJCWFsaV9zYXZlX3JlZ3MoY2FyZCk7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIGludAp0cmlkZW50X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKGRldik7CgoJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJYWxpX3Jlc3RvcmVfcmVncyhjYXJkKTsKCX0KCXJldHVybiAwOwp9CiNlbmRpZgoKc3RhdGljIHN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKgphbGlfYWxsb2NfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CglpbnQgaWR4OwoKCWJhbmsgPSAmY2FyZC0+YmFua3NbQkFOS19BXTsKCglpZiAoaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpICYgCgkgICAgKEFMSV9TUERJRl9PVVRfQ0hfRU5BQkxFKSkgewoJCWlkeCA9IEFMSV9TUERJRl9PVVRfQ0hBTk5FTDsKCQlpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBpZHgpKSkgewoJCQlzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICpjaGFubmVsID0gJmJhbmstPmNoYW5uZWxzW2lkeF07CgkJCWJhbmstPmJpdG1hcCB8PSAxIDw8IGlkeDsKCQkJY2hhbm5lbC0+bnVtID0gaWR4OwoJCQlyZXR1cm4gY2hhbm5lbDsKCQl9Cgl9CgoJZm9yIChpZHggPSBBTElfUENNX09VVF9DSEFOTkVMX0ZJUlNUOyBpZHggPD0gQUxJX1BDTV9PVVRfQ0hBTk5FTF9MQVNUOyAKCSAgICAgaWR4KyspIHsKCQlpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBpZHgpKSkgewoJCQlzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICpjaGFubmVsID0gJmJhbmstPmNoYW5uZWxzW2lkeF07CgkJCWJhbmstPmJpdG1hcCB8PSAxIDw8IGlkeDsKCQkJY2hhbm5lbC0+bnVtID0gaWR4OwoJCQlyZXR1cm4gY2hhbm5lbDsKCQl9Cgl9CgoJLyogbm8gbW9yZSBmcmVlIGNoYW5uZWxzIGF2YWxpYWJsZSAqLwojaWYgMCAKCXByaW50ayhLRVJOX0VSUiAiYWxpOiBubyBtb3JlIGNoYW5uZWxzIGF2YWlsYWJsZSBvbiBCYW5rIEEuXG4iKTsKI2VuZGlmIC8qIDAgKi8gCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKgphbGlfYWxsb2NfcmVjX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXN0cnVjdCB0cmlkZW50X3BjbV9iYW5rICpiYW5rOwoJaW50IGlkeDsKCglpZiAoaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpICYgQUxJX1NQRElGX0lOX1NVUFBPUlQpCgkJaWR4ID0gQUxJX1NQRElGX0lOX0NIQU5ORUw7CgllbHNlCgkJaWR4ID0gQUxJX1BDTV9JTl9DSEFOTkVMOwoKCWJhbmsgPSAmY2FyZC0+YmFua3NbQkFOS19BXTsKCglpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBpZHgpKSkgewoJCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWwgPSAmYmFuay0+Y2hhbm5lbHNbaWR4XTsKCQliYW5rLT5iaXRtYXAgfD0gMSA8PCBpZHg7CgkJY2hhbm5lbC0+bnVtID0gaWR4OwoJCXJldHVybiBjaGFubmVsOwoJfQoKCS8qIG5vIGZyZWUgcmVjb3JkYWJsZSBjaGFubmVscyBhdmFsaWFibGUgKi8KI2lmIDAgCglwcmludGsoS0VSTl9FUlIgImFsaTogbm8gcmVjb3JkYWJsZSBjaGFubmVscyBhdmFpbGFibGUgb24gQmFuayBBLlxuIik7CiNlbmRpZiAvKiAwICovIAoJcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyB2b2lkCmFsaV9zZXRfc3BkaWZfb3V0X3JhdGUoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IHJhdGUpCnsKCXVuc2lnbmVkIGNoYXIgY2hfc3Rfc2VsOwoJdW5zaWduZWQgc2hvcnQgc3RhdHVzX3JhdGU7CgoJc3dpdGNoIChyYXRlKSB7CgljYXNlIDQ0MTAwOgoJCXN0YXR1c19yYXRlID0gMDsKCQlicmVhazsKCWNhc2UgMzIwMDA6CgkJc3RhdHVzX3JhdGUgPSAweDMwMDsKCQlicmVhazsKCWNhc2UgNDgwMDA6CglkZWZhdWx0OgoJCXN0YXR1c19yYXRlID0gMHgyMDA7CgkJYnJlYWs7Cgl9CgoJLyogc2VsZWN0IHNwZGlmX291dCAqLyAKCWNoX3N0X3NlbCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpICYgQUxJX1NQRElGX09VVF9DSF9TVEFUVVM7CgoJY2hfc3Rfc2VsIHw9IDB4ODA7CS8qIHNlbGVjdCByaWdodCAqLyAKCW91dGIoY2hfc3Rfc2VsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwoJb3V0YihzdGF0dXNfcmF0ZSB8IDB4MjAsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDIpKTsKCgljaF9zdF9zZWwgJj0gKH4weDgwKTsJLyogc2VsZWN0IGxlZnQgKi8gCglvdXRiKGNoX3N0X3NlbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCW91dHcoc3RhdHVzX3JhdGUgfCAweDEwLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MgKyAyKSk7Cn0KCnN0YXRpYyB2b2lkCmFsaV9hZGRyZXNzX2ludGVycnVwdChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7CglpbnQgaSwgY2hhbm5lbDsKCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZTsKCXUzMiBtYXNrLCBjaGFubmVsX21hc2s7CgoJbWFzayA9IHRyaWRlbnRfZ2V0X2ludGVycnVwdF9tYXNrKGNhcmQsIDApOwoJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKCQlpZiAoKHN0YXRlID0gY2FyZC0+c3RhdGVzW2ldKSA9PSBOVUxMKQoJCQljb250aW51ZTsKCQljaGFubmVsID0gc3RhdGUtPmRtYWJ1Zi5jaGFubmVsLT5udW07CgkJaWYgKChjaGFubmVsX21hc2sgPSAxIDw8IGNoYW5uZWwpICYgbWFzaykgewoJCQltYXNrICY9IH5jaGFubmVsX21hc2s7CgkJCXRyaWRlbnRfYWNrX2NoYW5uZWxfaW50ZXJydXB0KGNhcmQsIGNoYW5uZWwpOwoJCQl1ZGVsYXkoMTAwKTsKCQkJc3RhdGUtPmRtYWJ1Zi51cGRhdGVfZmxhZyB8PSBBTElfQUREUkVTU19JTlRfVVBEQVRFOwoJCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOwoJCX0KCX0KCWlmIChtYXNrKSB7CgkJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKCQkJaWYgKG1hc2sgJiAoMSA8PCBpKSkgewoJCQkJcHJpbnRrKCJhbGk6IHNwdXJpb3VzIGNoYW5uZWwgaXJxICVkLlxuIiwgaSk7CgkJCQl0cmlkZW50X2Fja19jaGFubmVsX2ludGVycnVwdChjYXJkLCBpKTsKCQkJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBpKTsKCQkJCXRyaWRlbnRfZGlzYWJsZV92b2ljZV9pcnEoY2FyZCwgaSk7CgkJCX0KCQl9Cgl9Cn0KCi8qIFVwZGF0aW5nIHRoZSB2YWx1ZXMgb2YgY291bnRlcnMgb2Ygb3RoZXJfc3RhdGVzJyBETUFzIHdpdGhvdXQgbG9jayAKcHJvdGVjdGlvbiBpcyBubyBoYXJtIGJlY2F1c2UgYWxsIERNQXMgb2YgbXVsdGktY2hhbm5lbHMgYW5kIGludGVycnVwdApkZXBlbmQgb24gYSBtYXN0ZXIgc3RhdGUncyBETUEsIGFuZCBjaGFuZ2luZyB0aGUgY291bnRlcnMgb2YgdGhlIG1hc3RlcgpzdGF0ZSBETUEgaXMgcHJvdGVjdGVkIGJ5IGEgc3BpbmxvY2suCiovCnN0YXRpYyBpbnQKYWxpX3dyaXRlXzVfMShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIAoJICAgICAgaW50IGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgdW5zaWduZWQgaW50ICpjb3B5X2NvdW50LCAKCSAgICAgIHVuc2lnbmVkIGludCAqc3RhdGVfY250KQp7CgoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWZfdGVtcDsKCWNvbnN0IGNoYXIgX191c2VyICpidWZmZXIgPSBidWY7Cgl1bnNpZ25lZCBzd3B0ciwgb3RoZXJfZG1hX251bXMsIHNhbXBsZV9zOwoJdW5zaWduZWQgaW50IGksIGxvb3A7CgoJb3RoZXJfZG1hX251bXMgPSA0OwoJc2FtcGxlX3MgPSBzYW1wbGVfc2l6ZVtkbWFidWYtPmZtdF0gPj4gMTsKCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKCglpZiAoKGkgPSBzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50KSA+IDApIHsKCQlpZiAoaSA9PSAxKSB7CgkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCAKCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKCQkJCXJldHVybiAtRUZBVUxUOwoJCQlzZWVrX29mZnNldChzd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAoJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CgkJCWktLTsKCQkJKCpzdGF0ZV9jbnQpICs9IHNhbXBsZV9zOwoJCQlzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50Kys7CgkJfSBlbHNlCgkJCWkgPSBpIC0gKHN0YXRlLT5jaGFuc19udW0gLSBvdGhlcl9kbWFfbnVtcyk7CgkJZm9yICg7IChpIDwgb3RoZXJfZG1hX251bXMpICYmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKTsgaSsrKSB7CgkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbaV0tPmRtYWJ1ZjsKCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsIAoJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAoJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CgkJfQoJCWlmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPT0gMCkKCQkJc3RhdGUtPm11bHRpX2NoYW5uZWxzX2FkanVzdF9jb3VudCArPSBpOwoJfQoJaWYgKGNudF9mb3JfbXVsdGlfY2hhbm5lbCA+IDApIHsKCQlsb29wID0gY250X2Zvcl9tdWx0aV9jaGFubmVsIC8gKHN0YXRlLT5jaGFuc19udW0gKiBzYW1wbGVfcyk7CgkJZm9yIChpID0gMDsgaSA8IGxvb3A7IGkrKykgewoJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCAKCQkJCQkgICBzYW1wbGVfcyAqIDIpKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCgkJCQkgICAgc2FtcGxlX3MgKiAyLCAqY29weV9jb3VudCk7CgkJCSgqc3RhdGVfY250KSArPSAoc2FtcGxlX3MgKiAyKTsKCgkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbMF0tPmRtYWJ1ZjsKCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsIAoJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAoJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CgoJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzWzFdLT5kbWFidWY7CgkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLCAKCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKCQkJCXJldHVybiAtRUZBVUxUOwoJCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwoKCQkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1syXS0+ZG1hYnVmOwoJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCgkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCgkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKCgkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbM10tPmRtYWJ1ZjsKCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsIAoJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAoJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CgkJfQoKCQlpZiAoY250X2Zvcl9tdWx0aV9jaGFubmVsID4gMCkgewoJCQlzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50ID0gY250X2Zvcl9tdWx0aV9jaGFubmVsIC8gc2FtcGxlX3M7CgoJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCBzYW1wbGVfcykpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwoJCQkoKnN0YXRlX2NudCkgKz0gc2FtcGxlX3M7CgoJCQlpZiAoY250X2Zvcl9tdWx0aV9jaGFubmVsID4gMCkgewoJCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIAoJCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKCQkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCgkJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CgkJCQkoKnN0YXRlX2NudCkgKz0gc2FtcGxlX3M7CgoJCQkJaWYgKGNudF9mb3JfbXVsdGlfY2hhbm5lbCA+IDApIHsKCQkJCQlpbnQgZGlmZiA9IHN0YXRlLT5jaGFuc19udW0gLSBvdGhlcl9kbWFfbnVtczsKCQkJCQlsb29wID0gc3RhdGUtPm11bHRpX2NoYW5uZWxzX2FkanVzdF9jb3VudCAtIGRpZmY7CgkJCQkJZm9yIChpID0gMDsgaSA8IGxvb3A7IGkrKykgewoJCQkJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzW2ldLT5kbWFidWY7CgkJCQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgCgkJCQkJCQkJICAgZG1hYnVmX3RlbXAtPnN3cHRyLCAKCQkJCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKCQkJCQkJCXJldHVybiAtRUZBVUxUOwoJCQkJCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgCgkJCQkJCQkgICAgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKCQkJCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0gZWxzZQoJCQlzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50ID0gMDsKCX0KCWZvciAoaSA9IDA7IGkgPCBvdGhlcl9kbWFfbnVtczsgaSsrKSB7CgkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1tpXS0+ZG1hYnVmOwoJCWRtYWJ1Zl90ZW1wLT5zd3B0ciA9IGRtYWJ1Zl90ZW1wLT5zd3B0ciAlIGRtYWJ1Zl90ZW1wLT5kbWFzaXplOwoJfQoJcmV0dXJuICpzdGF0ZV9jbnQ7Cn0KCnN0YXRpYyB2b2lkCmFsaV9mcmVlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglpbnQgaTsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzOwoJdW5zaWduZWQgb3RoZXJfc3RhdGVzX2NvdW50OwoKCW90aGVyX3N0YXRlc19jb3VudCA9IHN0YXRlLT5jaGFuc19udW0gLSAyOyAvKiBleGNlcHQgUENNIEwvUiBjaGFubmVscyAqLwoJZm9yIChpID0gMDsgaSA8IG90aGVyX3N0YXRlc19jb3VudDsgaSsrKSB7CgkJcyA9IHN0YXRlLT5vdGhlcl9zdGF0ZXNbaV07CgkJZGVhbGxvY19kbWFidWYoJnMtPmRtYWJ1ZiwgY2FyZC0+cGNpX2Rldik7CgkJYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKHMtPmNhcmQsIHMtPmRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCXN0YXRlLT5jYXJkLT5mcmVlX3BjbV9jaGFubmVsKHMtPmNhcmQsIHMtPmRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCWNhcmQtPnN0YXRlc1tzLT52aXJ0XSA9IE5VTEw7CgkJa2ZyZWUocyk7Cgl9Cn0KCnN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJlczsKCnN0YXRpYyBpbnQKYWxpX3dyaXRlX3Byb2Moc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCnsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSAoc3RydWN0IHRyaWRlbnRfY2FyZCAqKSBkYXRhOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWNoYXIgYzsKCglpZiAoY291bnQgPCAwKQoJCXJldHVybiAtRUlOVkFMOwoJaWYgKGNvdW50ID09IDApCgkJcmV0dXJuIDA7CglpZiAoZ2V0X3VzZXIoYywgYnVmZmVyKSkKCQlyZXR1cm4gLUVGQVVMVDsKCglzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoJc3dpdGNoIChjKSB7CgljYXNlICcwJzoKCQlhbGlfc2V0dXBfc3BkaWZfb3V0KGNhcmQsIEFMSV9QQ01fVE9fU1BESUZfT1VUKTsKCQlhbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwoY2FyZCwgQUxJX1NQRElGX09VVF9DSEFOTkVMKTsKCQlicmVhazsKCWNhc2UgJzEnOgoJCWFsaV9zZXR1cF9zcGRpZl9vdXQoY2FyZCwgQUxJX1NQRElGX09VVF9UT19TUERJRl9PVVQgfCAKCQkJCSAgICBBTElfU1BESUZfT1VUX1BDTSk7CgkJYnJlYWs7CgljYXNlICcyJzoKCQlhbGlfc2V0dXBfc3BkaWZfb3V0KGNhcmQsIEFMSV9TUERJRl9PVVRfVE9fU1BESUZfT1VUIHwgCgkJCQkgICAgQUxJX1NQRElGX09VVF9OT05fUENNKTsKCQlicmVhazsKCWNhc2UgJzMnOgoJCWFsaV9kaXNhYmxlX3NwZGlmX2luKGNhcmQpOwkvL2RlZmF1bHQKCQlicmVhazsKCWNhc2UgJzQnOgoJCWFsaV9zZXR1cF9zcGRpZl9pbihjYXJkKTsKCQlicmVhazsKCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCglyZXR1cm4gY291bnQ7Cn0KCi8qIE9TUyAvZGV2L21peGVyIGZpbGUgb3BlcmF0aW9uIG1ldGhvZHMgKi8Kc3RhdGljIGludAp0cmlkZW50X29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglpbnQgaSA9IDA7CglpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IGRldnM7CgoJZm9yIChjYXJkID0gZGV2czsgY2FyZCAhPSBOVUxMOyBjYXJkID0gY2FyZC0+bmV4dCkKCQlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQoJCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tpXSAhPSBOVUxMICYmIAoJCQkgICAgY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyID09IG1pbm9yKQoJCQkJZ290byBtYXRjaDsKCglpZiAoIWNhcmQpIHsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KICAgICAgbWF0Y2g6CglmaWxlLT5wcml2YXRlX2RhdGEgPSBjYXJkLT5hYzk3X2NvZGVjW2ldOwoKCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKfQoKc3RhdGljIGludAp0cmlkZW50X2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgCgkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKewoJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gKHN0cnVjdCBhYzk3X2NvZGVjICopIGZpbGUtPnByaXZhdGVfZGF0YTsKCglyZXR1cm4gY29kZWMtPm1peGVyX2lvY3RsKGNvZGVjLCBjbWQsIGFyZyk7Cn0KCnN0YXRpYyAvKmNvbnN0ICovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJpZGVudF9taXhlcl9mb3BzID0gewoJLm93bmVyID0gVEhJU19NT0RVTEUsCgkubGxzZWVrID0gbm9fbGxzZWVrLAoJLmlvY3RsID0gdHJpZGVudF9pb2N0bF9taXhkZXYsCgkub3BlbiA9IHRyaWRlbnRfb3Blbl9taXhkZXYsCn07CgpzdGF0aWMgaW50CmFsaV9yZXNldF81NDUxKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gTlVMTDsKCXVuc2lnbmVkIGludCBkd1ZhbDsKCXVuc2lnbmVkIHNob3J0IHdDb3VudCwgd1JlZzsKCglwY2lfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwgUENJX0RFVklDRV9JRF9BTF9NMTUzMywKCQkJCSBwY2lfZGV2KTsKCWlmIChwY2lfZGV2ID09IE5VTEwpCgkJcmV0dXJuIC0xOwoKCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDdjLCAmZHdWYWwpOwoJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDdjLCBkd1ZhbCB8IDB4MDgwMDAwMDApOwoJdWRlbGF5KDUwMDApOwoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4N2MsICZkd1ZhbCk7CglwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4N2MsIGR3VmFsICYgMHhmN2ZmZmZmZik7Cgl1ZGVsYXkoNTAwMCk7CglwY2lfZGV2X3B1dChwY2lfZGV2KTsKCglwY2lfZGV2ID0gY2FyZC0+cGNpX2RldjsKCWlmIChwY2lfZGV2ID09IE5VTEwpCgkJcmV0dXJuIC0xOwoKCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDQ0LCAmZHdWYWwpOwoJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDQ0LCBkd1ZhbCB8IDB4MDAwYzAwMDApOwoJdWRlbGF5KDUwMCk7CglwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX2RldiwgMHg0NCwgJmR3VmFsKTsKCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldiwgMHg0NCwgZHdWYWwgJiAweGZmZmJmZmZmKTsKCXVkZWxheSg1MDAwKTsKCgkvKiBUT0RPOiByZWNvZ25pemUgaWYgd2UgaGF2ZSBhIFBNIGNhcGFibGUgY29kZWMgYW5kIG9ubHkgZG8gdGhpcyAqLwoJLyogaWYgdGhlIGNvZGVjIGlzIFBNIGNhcGFibGUgKi8KCXdDb3VudCA9IDIwMDA7Cgl3aGlsZSAod0NvdW50LS0pIHsKCQl3UmVnID0gYWxpX2FjOTdfZ2V0KGNhcmQsIDAsIEFDOTdfUE9XRVJfQ09OVFJPTCk7CgkJaWYgKCh3UmVnICYgMHgwMDBmKSA9PSAweDAwMGYpCgkJCXJldHVybiAwOwoJCXVkZWxheSg1MDAwKTsKCX0KCS8qIFRoaXMgaXMgbm9uIGZhdGFsIGlmIHlvdSBoYXZlIGEgbm9uIFBNIGNhcGFibGUgY29kZWMuLiAqLwoJcmV0dXJuIDA7Cn0KCi8qIEFDOTcgY29kZWMgaW5pdGlhbGlzYXRpb24uICovCnN0YXRpYyBpbnQgX19kZXZpbml0CnRyaWRlbnRfYWM5N19pbml0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCWludCBudW1fYWM5NyA9IDA7Cgl1bnNpZ25lZCBsb25nIHJlYWR5XzJuZCA9IDA7CglzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWM7CglpbnQgaSA9IDA7CgoJLyogaW5pdGlhbGl6ZSBjb250cm9sbGVyIHNpZGUgb2YgQUMgbGluaywgYW5kIGZpbmQgb3V0IGlmIHNlY29uZGFyeSBjb2RlcwoJICAgcmVhbGx5IGV4aXN0ICovCglzd2l0Y2ggKGNhcmQtPnBjaV9pZCkgewoJY2FzZSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxOgoJCWlmIChhbGlfcmVzZXRfNTQ1MShjYXJkKSkgewoJCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnRfYWM5N19pbml0OiBlcnJvciAiCgkJCSAgICAgICAicmVzZXR0aW5nIDU0NTEuXG4iKTsKCQkJcmV0dXJuIC0xOwoJCX0KCQlvdXRsKDB4ODAwMDAwMDEsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwoJCW91dGwoMHgwMDAwMDAwMCwgVFJJRF9SRUcoY2FyZCwgVDREX0FJTlRFTl9BKSk7CgkJb3V0bCgweGZmZmZmZmZmLCBUUklEX1JFRyhjYXJkLCBUNERfQUlOVF9BKSk7CgkJb3V0bCgweDAwMDAwMDAwLCBUUklEX1JFRyhjYXJkLCBUNERfTVVTSUNWT0xfV0FWRVZPTCkpOwoJCW91dGIoMHgxMCwgVFJJRF9SRUcoY2FyZCwgQUxJX01QVVIyKSk7CgkJcmVhZHlfMm5kID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9TQ1RSTCkpOwoJCXJlYWR5XzJuZCAmPSAweDNmZmY7CgkJb3V0bChyZWFkeV8ybmQgfCBQQ01PVVQgfCAweDgwMDAsIFRSSURfUkVHKGNhcmQsIEFMSV9TQ1RSTCkpOwoJCXJlYWR5XzJuZCA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKTsKCQlyZWFkeV8ybmQgJj0gU0lfQUM5N19TRUNPTkRBUllfUkVBRFk7CgkJaWYgKGNhcmQtPnJldmlzaW9uIDwgQUxJXzU0NTFfVjAyKQoJCQlyZWFkeV8ybmQgPSAwOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTg6CgkJLyogZGlzYWJsZSBBQzk3IEdQSU8gaW50ZXJydXB0ICovCgkJb3V0bCgweDAwLCBUUklEX1JFRyhjYXJkLCBTSV9BQzk3X0dQSU8pKTsKCQkvKiB3aGVuIHBvd2VyIHVwIHRoZSBBQyBsaW5rIGlzIGluIGNvbGQgcmVzZXQgbW9kZSBzbyBzdG9wIGl0ICovCgkJb3V0bChQQ01PVVQgfCBTVVJST1VUIHwgQ0VOVEVST1VUIHwgTEZFT1VUIHwgU0VDT05EQVJZX0lELCAKCQkgICAgIFRSSURfUkVHKGNhcmQsIFNJX1NFUklBTF9JTlRGX0NUUkwpKTsKCQkvKiBpdCB0YWtlIGEgbG9uZyB0aW1lIHRvIHJlY292ZXIgZnJvbSBhIGNvbGQgcmVzZXQgKi8gCgkJLyogKGVzcGVjaWFsbHkgd2hlbiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIGNvZGVjKSAqLwoJCXVkZWxheSgyMDAwKTsKCQlyZWFkeV8ybmQgPSBpbmwoVFJJRF9SRUcoY2FyZCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOwoJCXJlYWR5XzJuZCAmPSBTSV9BQzk3X1NFQ09OREFSWV9SRUFEWTsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWDoKCQkvKiBwbGF5YmFjayBvbiAqLwoJCW91dGwoRFhfQUM5N19QTEFZQkFDSywgVFJJRF9SRUcoY2FyZCwgRFhfQUNSMl9BQzk3X0NPTV9TVEFUKSk7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfTlg6CgkJLyogZW5hYmxlIEFDOTcgT3V0cHV0IFNsb3QgMyw0IChQQ00gTGVmdC9SaWdodCBQbGF5YmFjaykgKi8KCQlvdXRsKE5YX0FDOTdfUENNX09VVFBVVCwgVFJJRF9SRUcoY2FyZCwgTlhfQUNSMF9BQzk3X0NPTV9TVEFUKSk7CgkJcmVhZHlfMm5kID0gaW5sKFRSSURfUkVHKGNhcmQsIE5YX0FDUjBfQUM5N19DT01fU1RBVCkpOwoJCXJlYWR5XzJuZCAmPSBOWF9BQzk3X1NFQ09OREFSWV9SRUFEWTsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MDoKCQkvKiBkaXNhYmxlIEFDOTcgR1BJTyBpbnRlcnJ1cHQgKi8KCQlvdXRsKDB4MDAsIFRSSURfUkVHKGNhcmQsIFNJX0FDOTdfR1BJTykpOwoJCS8qIHdoZW4gcG93ZXIgdXAsIHRoZSBBQyBsaW5rIGlzIGluIGNvbGQgcmVzZXQgbW9kZSwgc28gc3RvcCBpdCAqLwoJCW91dGwoUENNT1VUIHwgU1VSUk9VVCB8IENFTlRFUk9VVCB8IExGRU9VVCwgCgkJICAgICBUUklEX1JFRyhjYXJkLCBTSV9TRVJJQUxfSU5URl9DVFJMKSk7CgkJLyogaXQgdGFrZSBhIGxvbmcgdGltZSB0byByZWNvdmVyIGZyb20gYSBjb2xkIHJlc2V0IChlc3BlY2lhbGx5ICovIAoJCS8qIHdoZW4geW91IGhhdmUgbW9yZSB0aGFuIG9uZSBjb2RlYykgKi8KCQl1ZGVsYXkoMjAwMCk7CgkJcmVhZHlfMm5kID0gaW5sKFRSSURfUkVHKGNhcmQsIFNJX1NFUklBTF9JTlRGX0NUUkwpKTsKCQlyZWFkeV8ybmQgJj0gU0lfQUM5N19TRUNPTkRBUllfUkVBRFk7CgkJYnJlYWs7Cgl9CgoJZm9yIChudW1fYWM5NyA9IDA7IG51bV9hYzk3IDwgTlJfQUM5NzsgbnVtX2FjOTcrKykgewoJCWlmICgoY29kZWMgPSBhYzk3X2FsbG9jX2NvZGVjKCkpID09IE5VTEwpCgkJCXJldHVybiAtRU5PTUVNOwoKCQkvKiBpbml0aWFsaXplIHNvbWUgYmFzaWMgY29kZWMgaW5mb3JtYXRpb24sIG90aGVyIGZpZWxkcyAqLyAKCQkvKiB3aWxsIGJlIGZpbGxlZCBpbiBhYzk3X3Byb2JlX2NvZGVjICovCgkJY29kZWMtPnByaXZhdGVfZGF0YSA9IGNhcmQ7CgkJY29kZWMtPmlkID0gbnVtX2FjOTc7CgoJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewoJCQljb2RlYy0+Y29kZWNfcmVhZCA9IGFsaV9hYzk3X3JlYWQ7CgkJCWNvZGVjLT5jb2RlY193cml0ZSA9IGFsaV9hYzk3X3dyaXRlOwoJCX0gZWxzZSB7CgkJCWNvZGVjLT5jb2RlY19yZWFkID0gdHJpZGVudF9hYzk3X2dldDsKCQkJY29kZWMtPmNvZGVjX3dyaXRlID0gdHJpZGVudF9hYzk3X3NldDsKCQl9CgoJCWlmIChhYzk3X3Byb2JlX2NvZGVjKGNvZGVjKSA9PSAwKQoJCQlicmVhazsKCgkJY29kZWMtPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZ0cmlkZW50X21peGVyX2ZvcHMsIC0xKTsKCQlpZiAoY29kZWMtPmRldl9taXhlciA8IDApIHsKCQkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBjb3VsZG4ndCByZWdpc3RlciBtaXhlciFcbiIpOwoJCQlhYzk3X3JlbGVhc2VfY29kZWMoY29kZWMpOwoJCQlicmVhazsKCQl9CgoJCWNhcmQtPmFjOTdfY29kZWNbbnVtX2FjOTddID0gY29kZWM7CgoJCS8qIGlmIHRoZXJlIGlzIG5vIHNlY29uZGFyeSBjb2RlYyBhdCBhbGwsIGRvbid0IHByb2JlIGFueSBtb3JlICovCgkJaWYgKCFyZWFkeV8ybmQpCgkJCWJyZWFrOwoJfQoKCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewoJCWZvciAobnVtX2FjOTcgPSAwOyBudW1fYWM5NyA8IE5SX0FDOTc7IG51bV9hYzk3KyspIHsKCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbbnVtX2FjOTddID09IE5VTEwpCgkJCQlicmVhazsKCQkJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKCQkJCXUxNiByZWcgPSBhbGlfYWM5N19nZXQoY2FyZCwgbnVtX2FjOTcsIGkgKiAyKTsKCQkJCWNhcmQtPm1peGVyX3JlZ3NbaV1bbnVtX2FjOTddID0gcmVnOwoJCQl9CgkJfQoJfQoJcmV0dXJuIG51bV9hYzk3ICsgMTsKfQoKI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKLyogR2FtZXBvcnQgZnVuY3Rpb25zIGZvciB0aGUgY2FyZHMgQURDIGdhbWVwb3J0ICovCgpzdGF0aWMgdW5zaWduZWQgY2hhciB0cmlkZW50X2dhbWVfcmVhZChzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0KQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gZ2FtZXBvcnQtPnBvcnRfZGF0YTsKCglyZXR1cm4gaW5iKFRSSURfUkVHKGNhcmQsIFQ0RF9HQU1FX0xFRykpOwp9CgpzdGF0aWMgdm9pZCB0cmlkZW50X2dhbWVfdHJpZ2dlcihzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0KQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gZ2FtZXBvcnQtPnBvcnRfZGF0YTsKCglvdXRiKDB4ZmYsIFRSSURfUkVHKGNhcmQsIFQ0RF9HQU1FX0xFRykpOwp9CgpzdGF0aWMgaW50IHRyaWRlbnRfZ2FtZV9jb29rZWRfcmVhZChzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0LAoJCQkJICAgIGludCAqYXhlcywgaW50ICpidXR0b25zKQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gZ2FtZXBvcnQtPnBvcnRfZGF0YTsKCWludCBpOwoKCSpidXR0b25zID0gKH5pbmIoVFJJRF9SRUcoY2FyZCwgVDREX0dBTUVfTEVHKSkgPj4gNCkgJiAweGY7CgoJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewoJCWF4ZXNbaV0gPSBpbncoVFJJRF9SRUcoY2FyZCwgVDREX0dBTUVfQVhEKSArIGkgKiBzaXplb2YgKHUxNikpOwoJCWlmIChheGVzW2ldID09IDB4ZmZmZikKCQkJYXhlc1tpXSA9IC0xOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHRyaWRlbnRfZ2FtZV9vcGVuKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsIGludCBtb2RlKQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gZ2FtZXBvcnQtPnBvcnRfZGF0YTsKCglzd2l0Y2ggKG1vZGUpIHsKCWNhc2UgR0FNRVBPUlRfTU9ERV9DT09LRUQ6CgkJb3V0YigweDgwLCBUUklEX1JFRyhjYXJkLCBUNERfR0FNRV9DUikpOwoJCW1zbGVlcCgyMCk7CgkJcmV0dXJuIDA7CgljYXNlIEdBTUVQT1JUX01PREVfUkFXOgoJCW91dGIoMHgwMCwgVFJJRF9SRUcoY2FyZCwgVDREX0dBTUVfQ1IpKTsKCQlyZXR1cm4gMDsKCWRlZmF1bHQ6CgkJcmV0dXJuIC0xOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IF9fZGV2aW5pdCB0cmlkZW50X3JlZ2lzdGVyX2dhbWVwb3J0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXN0cnVjdCBnYW1lcG9ydCAqZ3A7CgoJY2FyZC0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKCWlmICghZ3ApIHsKCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IGNhbiBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJZ2FtZXBvcnRfc2V0X25hbWUoZ3AsICJUcmlkZW50IDREV2F2ZSIpOwoJZ2FtZXBvcnRfc2V0X3BoeXMoZ3AsICJwY2klcy9nYW1lcG9ydDAiLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7CglncC0+cmVhZCA9IHRyaWRlbnRfZ2FtZV9yZWFkOwoJZ3AtPnRyaWdnZXIgPSB0cmlkZW50X2dhbWVfdHJpZ2dlcjsKCWdwLT5jb29rZWRfcmVhZCA9IHRyaWRlbnRfZ2FtZV9jb29rZWRfcmVhZDsKCWdwLT5vcGVuID0gdHJpZGVudF9nYW1lX29wZW47CglncC0+ZnV6eiA9IDY0OwoJZ3AtPnBvcnRfZGF0YSA9IGNhcmQ7CgoJZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChncCk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCB0cmlkZW50X3VucmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJaWYgKGNhcmQtPmdhbWVwb3J0KQoJCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChjYXJkLT5nYW1lcG9ydCk7Cn0KCiNlbHNlCnN0YXRpYyBpbmxpbmUgaW50IHRyaWRlbnRfcmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkgeyByZXR1cm4gLUVOT1NZUzsgfQpzdGF0aWMgaW5saW5lIHZvaWQgdHJpZGVudF91bnJlZ2lzdGVyX2dhbWVwb3J0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpIHsgfQojZW5kaWYgLyogU1VQUE9SVF9KT1lTVElDSyAqLwoKLyogaW5zdGFsbCB0aGUgZHJpdmVyLCB3ZSBkbyBub3QgYWxsb2NhdGUgaGFyZHdhcmUgY2hhbm5lbCBub3IgRE1BIGJ1ZmZlciAqLyAKLyogbm93LCB0aGV5IGFyZSBkZWZlcmVkIHVudGlsICJBQ0NFU1MiIHRpbWUgKGluIHByb2dfZG1hYnVmIGNhbGxlZCBieSAqLyAKLyogb3Blbi9yZWFkL3dyaXRlL2lvY3RsL21tYXApICovCnN0YXRpYyBpbnQgX19kZXZpbml0CnRyaWRlbnRfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCnsKCXVuc2lnbmVkIGxvbmcgaW9iYXNlOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZDsKCXU4IGJpdHM7Cgl1OCByZXZpc2lvbjsKCWludCBpID0gMDsKCXUxNiB0ZW1wOwoJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZfbTE1MzMgPSBOVUxMOwoJaW50IHJjID0gLUVOT0RFVjsKCXU2NCBkbWFfbWFzazsKCglpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpCgkJZ290byBvdXQ7CgoJaWYgKHBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKQoJCWRtYV9tYXNrID0gQUxJX0RNQV9NQVNLOwoJZWxzZQoJCWRtYV9tYXNrID0gVFJJREVOVF9ETUFfTUFTSzsKCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaV9kZXYsIGRtYV9tYXNrKSkgewoJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQiIAoJCSAgICAgICAiICVzIFBDSSBidXNtYXN0ZXIgRE1BXG4iLCAKCQkgICAgICAgcGNpX2Rldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEgPyAKCQkgICAgICAgIjMyLWJpdCIgOiAiMzAtYml0Iik7CgkJZ290byBvdXQ7Cgl9CglwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZyZXZpc2lvbik7CgoJaWYgKHBjaV9pZC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTApCgkJaW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDEpOwoJZWxzZQoJCWlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKTsKCglpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgMjU2LCBjYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdKSkgewoJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogY2FuJ3QgYWxsb2NhdGUgSS9PIHNwYWNlIGF0ICIKCQkgICAgICAgIjB4JTQuNGx4XG4iLCBpb2Jhc2UpOwoJCWdvdG8gb3V0OwoJfQoKCXJjID0gLUVOT01FTTsKCWlmICgoY2FyZCA9IGt6YWxsb2Moc2l6ZW9mKCpjYXJkKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IG91dCBvZiBtZW1vcnlcbiIpOwoJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwoJfQoKCWluaXRfdGltZXIoJmNhcmQtPnRpbWVyKTsKCWNhcmQtPmlvYmFzZSA9IGlvYmFzZTsKCWNhcmQtPnBjaV9kZXYgPSBwY2lfZGV2X2dldChwY2lfZGV2KTsKCWNhcmQtPnBjaV9pZCA9IHBjaV9pZC0+ZGV2aWNlOwoJY2FyZC0+cmV2aXNpb24gPSByZXZpc2lvbjsKCWNhcmQtPmlycSA9IHBjaV9kZXYtPmlycTsKCWNhcmQtPm5leHQgPSBkZXZzOwoJY2FyZC0+bWFnaWMgPSBUUklERU5UX0NBUkRfTUFHSUM7CgljYXJkLT5iYW5rc1tCQU5LX0FdLmFkZHJlc3NlcyA9ICZiYW5rX2FfYWRkcnM7CgljYXJkLT5iYW5rc1tCQU5LX0FdLmJpdG1hcCA9IDBVTDsKCWNhcmQtPmJhbmtzW0JBTktfQl0uYWRkcmVzc2VzID0gJmJhbmtfYl9hZGRyczsKCWNhcmQtPmJhbmtzW0JBTktfQl0uYml0bWFwID0gMFVMOwoKCW11dGV4X2luaXQoJmNhcmQtPm9wZW5fbXV0ZXgpOwoJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmxvY2spOwoJaW5pdF90aW1lcigmY2FyZC0+dGltZXIpOwoKCWRldnMgPSBjYXJkOwoKCXBjaV9zZXRfbWFzdGVyKHBjaV9kZXYpOwoKCXByaW50ayhLRVJOX0lORk8gInRyaWRlbnQ6ICVzIGZvdW5kIGF0IElPIDB4JTA0bHgsIElSUSAlZFxuIiwgCgkgICAgICAgY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSwgY2FyZC0+aW9iYXNlLCBjYXJkLT5pcnEpOwoKCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewoJCS8qIEFMaSBjaGFubmVsIE1hbmFnZW1lbnQgKi8KCQljYXJkLT5hbGxvY19wY21fY2hhbm5lbCA9IGFsaV9hbGxvY19wY21fY2hhbm5lbDsKCQljYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwgPSBhbGlfYWxsb2NfcmVjX3BjbV9jaGFubmVsOwoJCWNhcmQtPmZyZWVfcGNtX2NoYW5uZWwgPSBhbGlfZnJlZV9wY21fY2hhbm5lbDsKCgkJY2FyZC0+YWRkcmVzc19pbnRlcnJ1cHQgPSBhbGlfYWRkcmVzc19pbnRlcnJ1cHQ7CgoJCS8qIEFkZGVkIGJ5IE1hdHQgV3UgMDEtMDUtMjAwMSBmb3Igc3BkaWYgaW4gKi8KCQljYXJkLT5tdWx0aV9jaGFubmVsX3VzZV9jb3VudCA9IDA7CgkJY2FyZC0+cmVjX2NoYW5uZWxfdXNlX2NvdW50ID0gMDsKCgkJLyogQUxpIFNQRElGIE9VVCBmdW5jdGlvbiAqLwoJCWlmIChjYXJkLT5yZXZpc2lvbiA9PSBBTElfNTQ1MV9WMDIpIHsKCQkJYWxpX3NldHVwX3NwZGlmX291dChjYXJkLCBBTElfUENNX1RPX1NQRElGX09VVCk7CgkJCXJlcyA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJBTGk1NDUxIiwgMCwgTlVMTCk7CgkJCWlmIChyZXMpIHsKCQkJCXJlcy0+d3JpdGVfcHJvYyA9IGFsaV93cml0ZV9wcm9jOwoJCQkJcmVzLT5kYXRhID0gY2FyZDsKCQkJfQoJCX0KCgkJLyogQWRkIEgvVyBWb2x1bWUgQ29udHJvbCBCeSBNYXR0IFd1IEp1bC4gMDYsIDIwMDEgKi8KCQljYXJkLT5od3ZvbGN0bCA9IDA7CgkJcGNpX2Rldl9tMTUzMyA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCAKCQkJCQkJUENJX0RFVklDRV9JRF9BTF9NMTUzMywgCgkJCQkJCXBjaV9kZXZfbTE1MzMpOwoJCXJjID0gLUVOT0RFVjsKCQlpZiAocGNpX2Rldl9tMTUzMyA9PSBOVUxMKQoJCQlnb3RvIG91dF9wcm9jX2ZzOwoJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXZfbTE1MzMsIDB4NjMsICZiaXRzKTsKCQlpZiAoYml0cyAmICgxIDw8IDUpKQoJCQljYXJkLT5od3ZvbGN0bCA9IDE7CgkJaWYgKGNhcmQtPmh3dm9sY3RsKSB7CgkJCS8qIENsZWFyIG0xNTMzIHBjaSBjZmcgNzhoIGJpdCAzMCB0byB6ZXJvLCB3aGljaCBtYWtlcwoJCQkgICBHUElPMTEvMTIvMTMgd29yayBhcyBBQ0dQX1VQL0RPV04vTVVURS4gKi8KCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2Rldl9tMTUzMywgMHg3YiwgJmJpdHMpOwoJCQliaXRzICY9IDB4YmY7CS8qY2xlYXIgYml0IDYgKi8KCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaV9kZXZfbTE1MzMsIDB4N2IsIGJpdHMpOwoJCX0KCX0gZWxzZSBpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTApIHsKCQljYXJkLT5hbGxvY19wY21fY2hhbm5lbCA9IGN5YmVyX2FsbG9jX3BjbV9jaGFubmVsOwoJCWNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbCA9IGN5YmVyX2FsbG9jX3BjbV9jaGFubmVsOwoJCWNhcmQtPmZyZWVfcGNtX2NoYW5uZWwgPSBjeWJlcl9mcmVlX3BjbV9jaGFubmVsOwoJCWNhcmQtPmFkZHJlc3NfaW50ZXJydXB0ID0gY3liZXJfYWRkcmVzc19pbnRlcnJ1cHQ7CgkJY3liZXJfaW5pdF9yaXR1YWwoY2FyZCk7Cgl9IGVsc2UgewoJCWNhcmQtPmFsbG9jX3BjbV9jaGFubmVsID0gdHJpZGVudF9hbGxvY19wY21fY2hhbm5lbDsKCQljYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwgPSB0cmlkZW50X2FsbG9jX3BjbV9jaGFubmVsOwoJCWNhcmQtPmZyZWVfcGNtX2NoYW5uZWwgPSB0cmlkZW50X2ZyZWVfcGNtX2NoYW5uZWw7CgkJY2FyZC0+YWRkcmVzc19pbnRlcnJ1cHQgPSB0cmlkZW50X2FkZHJlc3NfaW50ZXJydXB0OwoJfQoKCS8qIGNsYWltIG91ciBpcnEgKi8KCXJjID0gLUVOT0RFVjsKCWlmIChyZXF1ZXN0X2lycShjYXJkLT5pcnEsICZ0cmlkZW50X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCgkJCWNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0sIGNhcmQpKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiB1bmFibGUgdG8gYWxsb2NhdGUgaXJxICVkXG4iLCAKCQkgICAgICAgY2FyZC0+aXJxKTsKCQlnb3RvIG91dF9wcm9jX2ZzOwoJfQoJLyogcmVnaXN0ZXIgL2Rldi9kc3AgKi8KCWlmICgoY2FyZC0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZ0cmlkZW50X2F1ZGlvX2ZvcHMsIC0xKSkgPCAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBjb3VsZG4ndCByZWdpc3RlciBEU1AgZGV2aWNlIVxuIik7CgkJZ290byBvdXRfZnJlZV9pcnE7Cgl9CgljYXJkLT5taXhlcl9yZWdzX3JlYWR5ID0gMDsKCS8qIGluaXRpYWxpemUgQUM5NyBjb2RlYyBhbmQgcmVnaXN0ZXIgL2Rldi9taXhlciAqLwoJaWYgKHRyaWRlbnRfYWM5N19pbml0KGNhcmQpIDw9IDApIHsKCQkvKiB1bnJlZ2lzdGVyIGF1ZGlvIGRldmljZXMgKi8KCQlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKSB7CgkJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwpIHsKCQkJCXN0cnVjdCBhYzk3X2NvZGVjKiBjb2RlYyA9IGNhcmQtPmFjOTdfY29kZWNbaV07CgkJCQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNvZGVjLT5kZXZfbWl4ZXIpOwoJCQkJYWM5N19yZWxlYXNlX2NvZGVjKGNvZGVjKTsKCQkJfQoJCX0KCQlnb3RvIG91dF91bnJlZ2lzdGVyX3NvdW5kX2RzcDsKCX0KCWNhcmQtPm1peGVyX3JlZ3NfcmVhZHkgPSAxOwoJb3V0bCgweDAwLCBUUklEX1JFRyhjYXJkLCBUNERfTVVTSUNWT0xfV0FWRVZPTCkpOwoKCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewoJCS8qIEFkZCBIL1cgVm9sdW1lIENvbnRyb2wgQnkgTWF0dCBXdSBKdWwuIDA2LCAyMDAxICovCgkJaWYgKGNhcmQtPmh3dm9sY3RsKSB7CgkJCS8qIEVuYWJsZSBHUElPIElSUSAoTUlTQ0lOVCBiaXQgMThoKSAqLwoJCQl0ZW1wID0gaW53KFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UICsgMikpOwoJCQl0ZW1wIHw9IDB4MDAwNDsKCQkJb3V0dyh0ZW1wLCBUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCArIDIpKTsKCgkJCS8qIEVuYWJsZSBIL1cgVm9sdW1lIENvbnRyb2wgR0xPVkFMIENPTlRST0wgYml0IDAgKi8KCQkJdGVtcCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKCQkJdGVtcCB8PSAweDAwMDE7CgkJCW91dHcodGVtcCwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CgoJCX0KCQlpZiAoY2FyZC0+cmV2aXNpb24gPT0gQUxJXzU0NTFfVjAyKQoJCQlhbGlfY2xvc2VfbXVsdGlfY2hhbm5lbHMoKTsKCQkvKiBlZGl0ZWQgYnkgSE1TRU8gZm9yIEdUIHNvdW5kICovCiNpZiBkZWZpbmVkKENPTkZJR19BTFBIQV9OQVVUSUxVUykgfHwgZGVmaW5lZChDT05GSUdfQUxQSEFfR0VORVJJQykKCQl7CgkJCXUxNiBhYzk3X2RhdGE7CgkJCWV4dGVybiBzdHJ1Y3QgaHdycGJfc3RydWN0ICpod3JwYjsKCgkJCWlmICgoaHdycGItPnN5c190eXBlKSA9PSAyMDEpIHsKCQkJCXByaW50ayhLRVJOX0lORk8gInRyaWRlbnQ6IFJ1bm5pbmcgb24gQWxwaGEgc3lzdGVtICIKCQkJCSAgICAgICAidHlwZSBOYXV0aWx1c1xuIik7CgkJCQlhYzk3X2RhdGEgPSBhbGlfYWM5N19nZXQoY2FyZCwgMCwgQUM5N19QT1dFUl9DT05UUk9MKTsKCQkJCWFsaV9hYzk3X3NldChjYXJkLCAwLCBBQzk3X1BPV0VSX0NPTlRST0wsIAoJCQkJCSAgICAgYWM5N19kYXRhIHwgQUxJX0VBUERfUE9XRVJfRE9XTik7CgkJCX0KCQl9CiNlbmRpZgkJCQkvKiBDT05GSUdfQUxQSEFfTkFVVElMVVMgfHwgQ09ORklHX0FMUEhBX0dFTkVSSUMgKi8KCQkvKiBlZGl0ZWQgYnkgSE1TRU8gZm9yIEdUIHNvdW5kICovCgl9CglyYyA9IDA7CglwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgY2FyZCk7CgoJLyogRW5hYmxlIEFkZHJlc3MgRW5naW5lIEludGVycnVwdHMgKi8KCXRyaWRlbnRfZW5hYmxlX2xvb3BfaW50ZXJydXB0cyhjYXJkKTsKCgkvKiBSZWdpc3RlciBnYW1lcG9ydCAqLwoJdHJpZGVudF9yZWdpc3Rlcl9nYW1lcG9ydChjYXJkKTsKCm91dDoKCXJldHVybiByYzsKCm91dF91bnJlZ2lzdGVyX3NvdW5kX2RzcDoKCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmRldl9hdWRpbyk7Cm91dF9mcmVlX2lycToKCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7Cm91dF9wcm9jX2ZzOgoJcGNpX2Rldl9wdXQoY2FyZC0+cGNpX2Rldik7CglpZiAocmVzKSB7CgkJcmVtb3ZlX3Byb2NfZW50cnkoIkFMaTU0NTEiLCBOVUxMKTsKCQlyZXMgPSBOVUxMOwoJfQoJa2ZyZWUoY2FyZCk7CglkZXZzID0gTlVMTDsKb3V0X3JlbGVhc2VfcmVnaW9uOgoJcmVsZWFzZV9yZWdpb24oaW9iYXNlLCAyNTYpOwoJcmV0dXJuIHJjOyAKfQoKc3RhdGljIHZvaWQgX19kZXZleGl0CnRyaWRlbnRfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQp7CglpbnQgaTsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CgoJLyoKCSAqICAgICAgS2lsbCBydW5uaW5nIHRpbWVycyBiZWZvcmUgdW5sb2FkLiBXZSBjYW4ndCBoYXZlIHRoZW0KCSAqICAgICAgZ29pbmcgb2ZmIGFmdGVyIHJtbW9kIQoJICovCglpZiAoY2FyZC0+aHd2b2xjdGwpCgkJZGVsX3RpbWVyX3N5bmMoJmNhcmQtPnRpbWVyKTsKCgkvKiBBTGkgUy9QRElGIGFuZCBQb3dlciBNYW5hZ2VtZW50ICovCglpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKCQlhbGlfc2V0dXBfc3BkaWZfb3V0KGNhcmQsIEFMSV9QQ01fVE9fU1BESUZfT1VUKTsKCQlhbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwoY2FyZCwgQUxJX1NQRElGX09VVF9DSEFOTkVMKTsKCQlhbGlfZGlzYWJsZV9zcGRpZl9pbihjYXJkKTsKCQlyZW1vdmVfcHJvY19lbnRyeSgiQUxpNTQ1MSIsIE5VTEwpOwoJfQoKCS8qIFVucmVnaXN0ZXIgZ2FtZXBvcnQgKi8KCXRyaWRlbnRfdW5yZWdpc3Rlcl9nYW1lcG9ydChjYXJkKTsKCgkvKiBLaWxsIGludGVycnVwdHMsIGFuZCBTUC9ESUYgKi8KCXRyaWRlbnRfZGlzYWJsZV9sb29wX2ludGVycnVwdHMoY2FyZCk7CgoJLyogZnJlZSBoYXJkd2FyZSByZXNvdXJjZXMgKi8KCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CglyZWxlYXNlX3JlZ2lvbihjYXJkLT5pb2Jhc2UsIDI1Nik7CgoJLyogdW5yZWdpc3RlciBhdWRpbyBkZXZpY2VzICovCglmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQoJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwpIHsKCQkJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjYXJkLT5hYzk3X2NvZGVjW2ldLT5kZXZfbWl4ZXIpOwoJCQlhYzk3X3JlbGVhc2VfY29kZWMoY2FyZC0+YWM5N19jb2RlY1tpXSk7CgkJfQoJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+ZGV2X2F1ZGlvKTsKCglwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgTlVMTCk7CglwY2lfZGV2X3B1dChjYXJkLT5wY2lfZGV2KTsKCWtmcmVlKGNhcmQpOwp9CgpNT0RVTEVfQVVUSE9SKCJBbGFuIENveCwgQWFyb24gSG9sdHptYW4sIE9sbGllIExobywgQ2hpbmcgTGluZyBMZWUsIE11bGkgQmVuLVllaHVkYSIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlRyaWRlbnQgNERXYXZlL1NpUyA3MDE4L0FMaSA1NDUxIGFuZCBUdmlhL0lHU1QgQ3liZXJQcm81MDUwIFBDSSAiCgkJICAgIkF1ZGlvIERyaXZlciIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7CgojZGVmaW5lIFRSSURFTlRfTU9EVUxFX05BTUUgInRyaWRlbnQiCgpzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdHJpZGVudF9wY2lfZHJpdmVyID0gewoJLm5hbWUgPSBUUklERU5UX01PRFVMRV9OQU1FLAoJLmlkX3RhYmxlID0gdHJpZGVudF9wY2lfdGJsLAoJLnByb2JlID0gdHJpZGVudF9wcm9iZSwKCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh0cmlkZW50X3JlbW92ZSksCiNpZmRlZiBDT05GSUdfUE0KCS5zdXNwZW5kID0gdHJpZGVudF9zdXNwZW5kLAoJLnJlc3VtZSA9IHRyaWRlbnRfcmVzdW1lCiNlbmRpZgp9OwoKc3RhdGljIGludCBfX2luaXQKdHJpZGVudF9pbml0X21vZHVsZSh2b2lkKQp7CglwcmludGsoS0VSTl9JTkZPICJUcmlkZW50IDREV2F2ZS9TaVMgNzAxOC9BTGkgNTQ1MSxUdmlhIEN5YmVyUHJvICIgCgkgICAgICAgIjUwNTAgUENJIEF1ZGlvLCB2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04gIiwgIiBfX1RJTUVfXyAiICIgCgkgICAgICAgX19EQVRFX18gIlxuIik7CgoJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnRyaWRlbnRfcGNpX2RyaXZlcik7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdAp0cmlkZW50X2NsZWFudXBfbW9kdWxlKHZvaWQpCnsKCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdHJpZGVudF9wY2lfZHJpdmVyKTsKfQoKbW9kdWxlX2luaXQodHJpZGVudF9pbml0X21vZHVsZSk7Cm1vZHVsZV9leGl0KHRyaWRlbnRfY2xlYW51cF9tb2R1bGUpOwo=