LyoKICoKICogQ29weXJpZ2h0IChDKSAyMDAwICBSb2JlcnQgT2xzc29uLgogKiBTd2VkaXNoIFVuaXZlcnNpdHkgb2YgQWdyaWN1bHR1cmFsIFNjaWVuY2VzCiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KICoKICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKICogbGF0ZXIgdmVyc2lvbi4KICoKICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKICogMDIxMTEtMTMwNywgVVNBLiAgCiAqLwoKLyogCiAqIFRoaXMgd29yayBpbmNsdWRlcyB3b3JrIHdpdGggdGhlIGZvbGxvd2luZyBjb3B5d3JpdGU6CiAqCiAqIENvcHlyaWdodCAoQykgMTk5NywgMjAwMCBLdW5paGlybyBJc2hpZ3VybwogKgogKi8KCi8qIAogKiBUaGFua3MgdG8gSmVucyBM5eVzIGF0IFN3ZWRpc2ggVW5pdmVyc2l0eSBvZiBBZ3JpY3VsdHVyYWwgU2NpZW5jZXMKICogZm9yIHJldmlld2luZyBhbmQgdGVzdHMuCiAqLwoKCiNpbmNsdWRlIDx6ZWJyYS5oPgoKCiNpZmRlZiBIQVZFX0lSRFAKCiNpbmNsdWRlICJpZi5oIgojaW5jbHVkZSAidnR5LmgiCiNpbmNsdWRlICJzb2NrdW5pb24uaCIKI2luY2x1ZGUgInByZWZpeC5oIgojaW5jbHVkZSAiY29tbWFuZC5oIgojaW5jbHVkZSAibWVtb3J5LmgiCiNpbmNsdWRlICJzdHJlYW0uaCIKI2luY2x1ZGUgImlvY3RsLmgiCiNpbmNsdWRlICJjb25uZWN0ZWQuaCIKI2luY2x1ZGUgImxvZy5oIgojaW5jbHVkZSAiemNsaWVudC5oIgojaW5jbHVkZSAidGhyZWFkLmgiCiNpbmNsdWRlICJ6ZWJyYS9pbnRlcmZhY2UuaCIKI2luY2x1ZGUgInplYnJhL3J0YWR2LmgiCiNpbmNsdWRlICJ6ZWJyYS9yaWIuaCIKI2luY2x1ZGUgInplYnJhL3pzZXJ2LmgiCiNpbmNsdWRlICJ6ZWJyYS9yZWRpc3RyaWJ1dGUuaCIKI2luY2x1ZGUgInplYnJhL2lyZHAuaCIKI2luY2x1ZGUgPG5ldGluZXQvaXBfaWNtcC5oPgojaW5jbHVkZSAiaWYuaCIKI2luY2x1ZGUgInNvY2t1bmlvbi5oIgojaW5jbHVkZSAibG9nLmgiCgoKCi8qIEdMT0JBTCBWQVJTICovCgppbnQgaXJkcF9zb2NrOwpjaGFyIGIxWzE2XSwgYjJbMTZdLCBiM1sxNl0sIGI0WzE2XTsgIC8qIEZvciBpbmV0XzJhICovCgpleHRlcm4gc3RydWN0IHplYnJhX3QgemVicmFkOwpleHRlcm4gc3RydWN0IHRocmVhZCAqdF9pcmRwX3JhdzsKZXh0ZXJuIHN0cnVjdCBpbnRlcmZhY2UgKmdldF9pZmxpc3RfaWZwKGludCBpZHgpOwppbnQgaW5fY2tzdW0gKHZvaWQgKnB0ciwgaW50IG5ieXRlcyk7CnZvaWQgcHJvY2Vzc19zb2xpY2l0IChzdHJ1Y3QgaW50ZXJmYWNlICppZnApOwoKdm9pZCBwYXJzZV9pcmRwX3BhY2tldChjaGFyICpwLCAKCQkgIGludCBsZW4sIAoJCSAgc3RydWN0IGludGVyZmFjZSAqaWZwKQp7CiAgc3RydWN0IGlwICppcCA9IChzdHJ1Y3QgaXAgKilwIDsKICBzdHJ1Y3QgaWNtcGhkciAqaWNtcDsKICBzdHJ1Y3QgaW5fYWRkciBzcmM7CiAgaW50IGlwX2hsZW4sIGlwX2xlbjsKICBzdHJ1Y3QgemVicmFfaWYgKnppOwogIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKCiAgemkgPSBpZnAtPmluZm87CiAgaWYoIXppKSByZXR1cm47CgogIGlyZHAgPSAmemktPmlyZHA7CiAgaWYoIWlyZHApIHJldHVybjsKCiAgaXBfaGxlbiA9IGlwLT5pcF9obCo0OyAKICBpcF9sZW4gPSBudG9ocyhpcC0+aXBfbGVuKTsKICBsZW4gPSBsZW4gLSBpcF9obGVuOwogIHNyYyA9IGlwLT5pcF9zcmM7CgogIGlmKGlwX2xlbiA8IElDTVBfTUlOTEVOKSB7CiAgICB6bG9nX2VyciAoIklSRFA6IFJYIElDTVAgcGFja2V0IHRvbyBzaG9ydCBmcm9tICVzXG4iLAoJICAgICAgaW5ldF9udG9hIChzcmMpKTsKICAgIHJldHVybjsKICB9CgogIC8qIENoZWNrIHNvIHdlIGRvbid0IGNoZWNrc3VtIHBhY2tldHMgbG9uZ2VyIHRoYW4gb3VyZSBSWF9CVUYgLSAoZXRobGVuICsKICAgbGVuIG9mIElQLWhlYWRlcikgMTQrMjAgKi8KCiAgaWYoaXBfbGVuID4gSVJEUF9SWF9CVUYtMzQpIHsKICAgIHpsb2dfZXJyICgiSVJEUDogUlggSUNNUCBwYWNrZXQgdG9vIGxvbmcgZnJvbSAlc1xuIiwKCSAgICAgIGluZXRfbnRvYSAoc3JjKSk7CiAgICByZXR1cm47CiAgfQoKCiAgaWYgKGluX2Nrc3VtIChpcCwgaXBfbGVuKSkgewogICAgemxvZ193YXJuICgiSVJEUDogUlggSUNNUCBwYWNrZXQgZnJvbSAlcy4gQmFkIGNoZWNrc3VtLCBzaWxlbnRseSBpZ25vcmVkIiwKCSAgICAgICBpbmV0X250b2EgKHNyYykpOwogICAgcmV0dXJuOwogIH0KCiAgaWNtcCA9IChzdHJ1Y3QgaWNtcGhkciAqKSAocCtpcF9obGVuKTsKCgogIC8qIEhhbmRsZSBqdXN0IG9ubHkgSVJEUCAqLwoKICBpZiggaWNtcC0+dHlwZSA9PSBJQ01QX1JPVVRFUkFEVkVSVCk7CiAgZWxzZSBpZiggaWNtcC0+dHlwZSA9PSBJQ01QX1JPVVRFUlNPTElDSVQpOwogIGVsc2UgcmV0dXJuOwoKIAogIGlmIChpY21wLT5jb2RlICE9IDApIHsKICAgIHpsb2dfd2FybiAoIklSRFA6IFJYIHBhY2tldCB0eXBlICVkIGZyb20gJXMuIEJhZCBJQ01QIHR5cGUgY29kZSwgc2lsZW50bHkgaWdub3JlZCIsCgkgICAgICAgaWNtcC0+dHlwZSwKCSAgICAgICBpbmV0X250b2EgKHNyYykpOwogICAgcmV0dXJuOwogIH0KCiAgaWYoaXAtPmlwX2RzdC5zX2FkZHIgPT0gSU5BRERSX0JST0FEQ0FTVCAmJiAKICAgICBpcmRwLT5mbGFncyAmIElGX0JST0FEQ0FTVCk7CgogIGVsc2UgaWYgKCBudG9obChpcC0+aXBfZHN0LnNfYWRkcikgPT0gSU5BRERSX0FMTFJUUlNfR1JPVVAgJiYgCgkgICAgISAoaXJkcC0+ZmxhZ3MgJiAgSUZfQlJPQURDQVNUKSk7CgogIGVsc2UgeyAvKiBFUlJPUiAqLwoKICAgIHpsb2dfd2FybiAoIklSRFA6IFJYIGlsbGVnYWwgZnJvbSAlcyB0byAlcyB3aGlsZSAlcyBvcGVyYXRlcyBpbiAlc1xuIiwKCSAgICAgICBpbmV0X250b2EgKHNyYyksIAoJICAgICAgIG50b2hsKGlwLT5pcF9kc3Quc19hZGRyKSA9PSBJTkFERFJfQUxMUlRSU19HUk9VUD8gCgkgICAgICAgIm11bHRpY2FzdCIgOiBpbmV0X250b2EoaXAtPmlwX2RzdCksCgkgICAgICAgaWZwLT5uYW1lLAoJICAgICAgIGlyZHAtPmZsYWdzICYgIElGX0JST0FEQ0FTVD8gCgkgICAgICAgImJyb2FkY2FzdCIgOiAibXVsdGljYXN0Iik7CgogICAgemxvZ193YXJuICgiSVJEUDogUGxlYXNlIGNvcnJlY3Qgc2V0dGluZ3NcbiIpOwogICAgcmV0dXJuOwogIH0KCiAgc3dpdGNoIChpY21wLT50eXBlKSAKICAgIHsKICAgIGNhc2UgSUNNUF9ST1VURVJBRFZFUlQ6CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgSUNNUF9ST1VURVJTT0xJQ0lUOgoKICAgICAgaWYoaXJkcC0+ZmxhZ3MgJiBJRl9ERUJVR19NRVNTQUdFUykgCgl6bG9nX3dhcm4gKCJJUkRQOiBSWCBTb2xpY2l0IG9uICVzIGZyb20gJXNcbiIsCgkJICAgaWZwLT5uYW1lLAoJCSAgIGluZXRfbnRvYSAoc3JjKSk7CgogICAgICBwcm9jZXNzX3NvbGljaXQoaWZwKTsKICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgemxvZ193YXJuICgiSVJEUDogUlggdHlwZSAlZCBmcm9tICVzLiBCYWQgSUNNUCB0eXBlLCBzaWxlbnRseSBpZ25vcmVkIiwKCQkgaWNtcC0+dHlwZSwKCQkgaW5ldF9udG9hIChzcmMpKTsKICAgIH0KfQoMCmludCBpcmRwX3JlY3Ztc2cgKGludCBzb2NrLCAKCSAgICAgIHVfY2hhciAqYnVmLCAKCSAgICAgIGludCBzaXplLCAKCSAgICAgIGludCAqaWZpbmRleCkKewogIHN0cnVjdCBtc2doZHIgbXNnOwogIHN0cnVjdCBpb3ZlYyBpb3Y7CiAgc3RydWN0IGNtc2doZHIgKnB0cjsKICBjaGFyIGFkYXRhW0NNU0dfU1BBQ0UoIFNPUFRfU0laRV9DTVNHX1BLVElORk9fSVBWNCgpICldOwogIGludCByZXQ7CgogIG1zZy5tc2dfbmFtZSA9ICh2b2lkICopMDsKICBtc2cubXNnX25hbWVsZW4gPSAwOwogIG1zZy5tc2dfaW92ID0gJmlvdjsKICBtc2cubXNnX2lvdmxlbiA9IDE7CiAgbXNnLm1zZ19jb250cm9sID0gKHZvaWQgKikgYWRhdGE7CiAgbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mIGFkYXRhOwoKICBpb3YuaW92X2Jhc2UgPSBidWY7CiAgaW92Lmlvdl9sZW4gPSBzaXplOwoKICByZXQgPSByZWN2bXNnIChzb2NrLCAmbXNnLCAwKTsKICBpZiAocmV0IDwgMCkgewogICAgemxvZ193YXJuKCJJUkRQOiByZWN2bXNnOiByZWFkIGVycm9yICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgIHJldHVybiByZXQ7CiAgfQoKICBpZiAobXNnLm1zZ19mbGFncyAmIE1TR19UUlVOQykgewogICAgemxvZ193YXJuKCJJUkRQOiByZWN2bXNnOiB0cnVuY2F0ZWQgbWVzc2FnZSIpOwogICAgcmV0dXJuIHJldDsKICB9CiAgaWYgKG1zZy5tc2dfZmxhZ3MgJiBNU0dfQ1RSVU5DKSB7CiAgICB6bG9nX3dhcm4oIklSRFA6IHJlY3Ztc2c6IHRydW5jYXRlZCBjb250cm9sIG1lc3NhZ2UiKTsKICAgIHJldHVybiByZXQ7CiAgfQoKICBpZmluZGV4ID0gZ2V0c29ja29wdF9wa3RpbmZvX2lmaW5kZXggKEFGX0lORVQsICZtc2cpOwoKICByZXR1cm4gcmV0Owp9CgwKaW50IGlyZHBfcmVhZF9yYXcoc3RydWN0IHRocmVhZCAqcikKewogIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKICBzdHJ1Y3QgemVicmFfaWYgKnppOwogIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKICBjaGFyIGJ1ZltJUkRQX1JYX0JVRl07CiAgaW50IHJldCwgaWZpbmRleDsKICAKICBpbnQgaXJkcF9zb2NrID0gVEhSRUFEX0ZEIChyKTsKICB0X2lyZHBfcmF3ID0gdGhyZWFkX2FkZF9yZWFkICh6ZWJyYWQubWFzdGVyLCBpcmRwX3JlYWRfcmF3LCBOVUxMLCBpcmRwX3NvY2spOwogIAogIHJldCA9IGlyZHBfcmVjdm1zZyAoaXJkcF9zb2NrLCBidWYsIElSRFBfUlhfQlVGLCAgJmlmaW5kZXgpOwogCiAgaWYgKHJldCA8IDApIHpsb2dfd2FybiAoIklSRFA6IFJYIEVycm9yIGxlbmd0aCA9ICVkIiwgcmV0KTsKCiAgaWZwID0gZ2V0X2lmbGlzdF9pZnAoaWZpbmRleCk7CiAgaWYoISBpZnAgKSByZXR1cm4gcmV0OwoKICB6aT0gaWZwLT5pbmZvOwogIGlmKCEgemkgKSByZXR1cm4gcmV0OwoKICBpcmRwID0gJnppLT5pcmRwOwogIGlmKCEgaXJkcCApIHJldHVybiByZXQ7CgogIGlmKCEgKGlyZHAtPmZsYWdzICYgSUZfQUNUSVZFKSkgewoKICAgIGlmKGlyZHAtPmZsYWdzICYgSUZfREVCVUdfTUlTQykgCiAgICAgIHpsb2dfd2FybigiSVJEUDogUlggSUNNUCBmb3IgZGlzYWJsZWQgaW50ZXJmYWNlICVzXG4iLAoJCWlmcC0+bmFtZSk7CiAgICByZXR1cm4gMDsKICB9CgogIGlmKGlyZHAtPmZsYWdzICYgSUZfREVCVUdfUEFDS0VUKSB7CiAgICBpbnQgaTsKICAgIHpsb2dfd2FybigiSVJEUDogUlggKGlkeCAlZCkgIiwgaWZpbmRleCk7CiAgICBmb3IoaT0wOyBpIDwgcmV0OyBpKyspIHpsb2dfd2FybiggIklSRFA6IFJYICV4ICIsIGJ1ZltpXSYweEZGKTsKICB9CgogIHBhcnNlX2lyZHBfcGFja2V0KGJ1ZiwgcmV0LCBpZnApOwogIHJldHVybiByZXQ7Cn0KDAp2b2lkIHNlbmRfcGFja2V0KHN0cnVjdCBpbnRlcmZhY2UgKmlmcCwgCgkgICAgc3RydWN0IHN0cmVhbSAqcywKCSAgICB1X2ludDMyX3QgZHN0LAoJICAgIHN0cnVjdCBwcmVmaXggKnAsCgkgICAgdV9pbnQzMl90IHR0bCkKewogIHN0YXRpYyBzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja2RzdCA9IHtBRl9JTkVUfTsKICBzdHJ1Y3QgaXAgKmlwOwogIHN0cnVjdCBpY21waGRyICppY21wOwogIHN0cnVjdCBtc2doZHIgKm1zZzsKICBzdHJ1Y3QgY21zZ2hkciAqY21zZzsKICBzdHJ1Y3QgaW92ZWMgaW92ZWN0b3I7CiAgY2hhciBtc2didWZbMjU2XTsKICBjaGFyIGJ1ZlsyNTZdOwogIHN0cnVjdCBpbl9wa3RpbmZvICpwa3RpbmZvOwogIHVfbG9uZyBzcmM7CiAgaW50IG9uOwogCiAgaWYgKCEgKGlmcC0+ZmxhZ3MgJiBJRkZfVVApKSByZXR1cm47CgogIGlmKCFwKSBzcmMgPSBudG9obChwLT51LnByZWZpeDQuc19hZGRyKTsKICBlbHNlIHNyYyA9IDA7IC8qIElzIGZpbGxlZCBpbiAqLwogIAogIGlwID0gKHN0cnVjdCBpcCAqKSBidWY7CiAgaXAtPmlwX2hsID0gc2l6ZW9mKHN0cnVjdCBpcCkgPj4gMjsKICBpcC0+aXBfdiA9IElQVkVSU0lPTjsKICBpcC0+aXBfdG9zID0gMHhDMDsKICBpcC0+aXBfb2ZmID0gMEw7CiAgaXAtPmlwX3AgPSAxOyAgICAgICAvKiBJUF9JQ01QICovCiAgaXAtPmlwX3R0bCA9IHR0bDsKICBpcC0+aXBfc3JjLnNfYWRkciA9IHNyYzsKICBpcC0+aXBfZHN0LnNfYWRkciA9IGRzdDsKICBpY21wID0gKHN0cnVjdCBpY21waGRyICopIChidWYgKyAyMCk7CgogIC8qIE1lcmdlIElQIGhlYWRlciB3aXRoIGljbXAgcGFja2V0ICovCgogIHN0cmVhbV9nZXQoaWNtcCwgcywgcy0+cHV0cCk7CgogIC8qIGljbXAtPmNoZWNrc3VtIGlzIGFscmVhZHkgY2FsY3VsYXRlZCAqLwogIGlwLT5pcF9sZW4gID0gc2l6ZW9mKHN0cnVjdCBpcCkgKyBzLT5wdXRwOwogIHN0cmVhbV9mcmVlKHMpOyAKCiAgb24gPSAxOwogIGlmIChzZXRzb2Nrb3B0KGlyZHBfc29jaywgSVBQUk9UT19JUCwgSVBfSERSSU5DTCwKCQkgKGNoYXIgKikgJm9uLCBzaXplb2Yob24pKSA8IDApCiAgICB6bG9nX3dhcm4oInNlbmR0byAlcyIsIHN0cmVycm9yIChlcnJubykpOwoKCiAgaWYoZHN0ID09IElOQUREUl9CUk9BRENBU1QgKSB7CiAgICBvbiA9IDE7CiAgICBpZiAoc2V0c29ja29wdChpcmRwX3NvY2ssIFNPTF9TT0NLRVQsIFNPX0JST0FEQ0FTVCwKCQkgICAoY2hhciAqKSAmb24sIHNpemVvZihvbikpIDwgMCkKICAgICAgemxvZ193YXJuKCJzZW5kdG8gJXMiLCBzdHJlcnJvciAoZXJybm8pKTsKICB9CgogIGlmKGRzdCAhPSAgSU5BRERSX0JST0FEQ0FTVCkgewogICAgICBvbiA9IDA7IAogICAgICBpZiggc2V0c29ja29wdChpcmRwX3NvY2ssSVBQUk9UT19JUCwgSVBfTVVMVElDQVNUX0xPT1AsIAoJCSAgICAgKGNoYXIgKikmb24sc2l6ZW9mKG9uKSkgPCAwKQoJemxvZ193YXJuKCJzZW5kdG8gJXMiLCBzdHJlcnJvciAoZXJybm8pKTsKICB9CgogIGJ6ZXJvKCZzb2NrZHN0LHNpemVvZihzb2NrZHN0KSk7CiAgc29ja2RzdC5zaW5fZmFtaWx5PUFGX0lORVQ7CiAgc29ja2RzdC5zaW5fYWRkci5zX2FkZHIgPSBkc3Q7CgogIGNtc2cgPSAoc3RydWN0IGNtc2doZHIgKikgKG1zZ2J1ZiArIHNpemVvZihzdHJ1Y3QgbXNnaGRyKSk7CiAgY21zZy0+Y21zZ19sZW4gPSBzaXplb2Yoc3RydWN0IGNtc2doZHIpICsgc2l6ZW9mKHN0cnVjdCBpbl9wa3RpbmZvKTsKICBjbXNnLT5jbXNnX2xldmVsID0gU09MX0lQOwogIGNtc2ctPmNtc2dfdHlwZSA9IElQX1BLVElORk87CiAgcGt0aW5mbyA9IChzdHJ1Y3QgaW5fcGt0aW5mbyAqKSBDTVNHX0RBVEEoY21zZyk7CiAgcGt0aW5mby0+aXBpX2lmaW5kZXggPSBpZnAtPmlmaW5kZXg7CiAgcGt0aW5mby0+aXBpX3NwZWNfZHN0LnNfYWRkciA9IHNyYzsKICBwa3RpbmZvLT5pcGlfYWRkci5zX2FkZHIgPSBzcmM7CiAKICBpb3ZlY3Rvci5pb3ZfYmFzZSA9ICh2b2lkICopIGJ1ZjsKICBpb3ZlY3Rvci5pb3ZfbGVuID0gaXAtPmlwX2xlbjsgCiAgbXNnID0gKHN0cnVjdCBtc2doZHIgKikgbXNnYnVmOwogIG1zZy0+bXNnX25hbWUgPSAmc29ja2RzdDsKICBtc2ctPm1zZ19uYW1lbGVuID0gc2l6ZW9mKHNvY2tkc3QpOwogIG1zZy0+bXNnX2lvdiA9ICZpb3ZlY3RvcjsKICBtc2ctPm1zZ19pb3ZsZW4gPSAxOwogIG1zZy0+bXNnX2NvbnRyb2wgPSBjbXNnOwogIG1zZy0+bXNnX2NvbnRyb2xsZW4gPSBjbXNnLT5jbXNnX2xlbjsKIAogIGlmIChzZW5kbXNnKGlyZHBfc29jaywgbXNnLCAwKSA8IDApIHsKICAgIHpsb2dfd2Fybigic2VuZHRvICVzIiwgc3RyZXJyb3IgKGVycm5vKSk7CiAgfQogIC8qICAgcHJpbnRmKCJUWCBvbiAlcyBpZHggJWRcbiIsIGlmcC0+bmFtZSwgaWZwLT5pZmluZGV4KTsgKi8KfQoKCiNlbmRpZiAvKiBIQVZFX0lSRFAgKi8KCgoK