LyogVGhpcyBzb3VyY2UgY29kZSB3YXMgbW9kaWZpZWQgYnkgTWFydGluIEhlZGVuZmFsayA8bWhlQHN0YWNrZW4ua3RoLnNlPiBmb3IKICogdXNlIGluIEN1cmwuIEhpcyBsYXRlc3QgY2hhbmdlcyB3ZXJlIGRvbmUgMjAwMC0wOS0xOC4KICoKICogSXQgaGFzIHNpbmNlIGJlZW4gcGF0Y2hlZCBhbmQgbW9kaWZpZWQgYSBsb3QgYnkgRGFuaWVsIFN0ZW5iZXJnCiAqIDxkYW5pZWxAaGF4eC5zZT4gdG8gbWFrZSBpdCBiZXR0ZXIgYXBwbGllZCB0byBjdXJsIGNvbmRpdGlvbnMsIGFuZCB0byBtYWtlCiAqIGl0IG5vdCB1c2UgZ2xvYmFscywgcG9sbHV0ZSBuYW1lIHNwYWNlIGFuZCBtb3JlLiBUaGlzIHNvdXJjZSBjb2RlIGF3YWl0cyBhCiAqIHJld3JpdGUgdG8gd29yayBhcm91bmQgdGhlIHBhcmFncmFwaCAyIGluIHRoZSBCU0QgbGljZW5zZXMgYXMgZXhwbGFpbmVkCiAqIGJlbG93LgogKgogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCiAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICoKICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgSU5TVElUVVRFIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAogKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSU5TVElUVVRFIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCiAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4gICovCgojaW5jbHVkZSAic2V0dXAuaCIKCiNpZm5kZWYgQ1VSTF9ESVNBQkxFX0ZUUAojaWZkZWYgSEFWRV9LUkI0CgojZGVmaW5lIF9NUFJJTlRGX1JFUExBQ0UgLyogd2Ugd2FudCBjdXJsLWZ1bmN0aW9ucyBpbnN0ZWFkIG9mIG5hdGl2ZSBvbmVzICovCiNpbmNsdWRlIDxjdXJsL21wcmludGYuaD4KCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8bmV0ZGIuaD4KCiNpZmRlZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCgojaW5jbHVkZSAidXJsZGF0YS5oIgojaW5jbHVkZSAia3JiNC5oIgojaW5jbHVkZSAiYmFzZTY0LmgiCiNpbmNsdWRlICJzZW5kZi5oIgojaW5jbHVkZSAiZnRwLmgiCiNpbmNsdWRlICJtZW1vcnkuaCIKCi8qIFRoZSBsYXN0ICNpbmNsdWRlIGZpbGUgc2hvdWxkIGJlOiAqLwojaW5jbHVkZSAibWVtZGVidWcuaCIKCiNkZWZpbmUgbWluKGEsIGIpICAgKChhKSA8IChiKSA/IChhKSA6IChiKSkKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgewogICAgZW51bSBwcm90ZWN0aW9uX2xldmVsIGxldmVsOwogICAgY29uc3QgY2hhciAqbmFtZTsKfSBsZXZlbF9uYW1lc1tdID0gewogICAgeyBwcm90X2NsZWFyLCAiY2xlYXIiIH0sCiAgICB7IHByb3Rfc2FmZSwgInNhZmUiIH0sCiAgICB7IHByb3RfY29uZmlkZW50aWFsLCAiY29uZmlkZW50aWFsIiB9LAogICAgeyBwcm90X3ByaXZhdGUsICJwcml2YXRlIiB9Cn07CgpzdGF0aWMgZW51bSBwcm90ZWN0aW9uX2xldmVsCm5hbWVfdG9fbGV2ZWwoY29uc3QgY2hhciAqbmFtZSkKewogIGludCBpOwogIGZvcihpID0gMDsgaSA8IChpbnQpc2l6ZW9mKGxldmVsX25hbWVzKS8oaW50KXNpemVvZihsZXZlbF9uYW1lc1swXSk7IGkrKykKICAgIGlmKGN1cmxfc3RybmVxdWFsKGxldmVsX25hbWVzW2ldLm5hbWUsIG5hbWUsIHN0cmxlbihuYW1lKSkpCiAgICAgIHJldHVybiBsZXZlbF9uYW1lc1tpXS5sZXZlbDsKICByZXR1cm4gKGVudW0gcHJvdGVjdGlvbl9sZXZlbCktMTsKfQoKc3RhdGljIGNvbnN0IHN0cnVjdCBDdXJsX3NlY19jbGllbnRfbWVjaCAqIGNvbnN0IG1lY2hzW10gPSB7CiNpZmRlZiBLUkI1CiAgLyogbm90IHN1cHBvcnRlZCAqLwojZW5kaWYKI2lmZGVmIEhBVkVfS1JCNAogICAgJkN1cmxfa3JiNF9jbGllbnRfbWVjaCwKI2VuZGlmCiAgICBOVUxMCn07CgppbnQKQ3VybF9zZWNfZ2V0YyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIEZJTEUgKkYpCnsKICBpZihjb25uLT5zZWNfY29tcGxldGUgJiYgY29ubi0+ZGF0YV9wcm90KSB7CiAgICBjaGFyIGM7CiAgICBpZihDdXJsX3NlY19yZWFkKGNvbm4sIGZpbGVubyhGKSwgJmMsIDEpIDw9IDApCiAgICAgIHJldHVybiBFT0Y7CiAgICByZXR1cm4gYzsKICB9CiAgZWxzZQogICAgcmV0dXJuIGdldGMoRik7Cn0KCnN0YXRpYyBpbnQKYmxvY2tfcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKewogIHVuc2lnbmVkIGNoYXIgKnAgPSBidWY7CiAgaW50IGI7CiAgd2hpbGUobGVuKSB7CiAgICBiID0gcmVhZChmZCwgcCwgbGVuKTsKICAgIGlmIChiID09IDApCiAgICAgIHJldHVybiAwOwogICAgZWxzZSBpZiAoYiA8IDApCiAgICAgIHJldHVybiAtMTsKICAgIGxlbiAtPSBiOwogICAgcCArPSBiOwogIH0KICByZXR1cm4gcCAtICh1bnNpZ25lZCBjaGFyKilidWY7Cn0KCnN0YXRpYyBpbnQKYmxvY2tfd3JpdGUoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCnsKICB1bnNpZ25lZCBjaGFyICpwID0gYnVmOwogIGludCBiOwogIHdoaWxlKGxlbikgewogICAgYiA9IHdyaXRlKGZkLCBwLCBsZW4pOwogICAgaWYoYiA8IDApCiAgICAgIHJldHVybiAtMTsKICAgIGxlbiAtPSBiOwogICAgcCArPSBiOwogIH0KICByZXR1cm4gcCAtICh1bnNpZ25lZCBjaGFyKilidWY7Cn0KCnN0YXRpYyBpbnQKc2VjX2dldF9kYXRhKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKICAgICAgICAgICAgIGludCBmZCwgc3RydWN0IGtyYjRidWZmZXIgKmJ1ZikKewogIGludCBsZW47CiAgaW50IGI7CgogIGIgPSBibG9ja19yZWFkKGZkLCAmbGVuLCBzaXplb2YobGVuKSk7CiAgaWYgKGIgPT0gMCkKICAgIHJldHVybiAwOwogIGVsc2UgaWYgKGIgPCAwKQogICAgcmV0dXJuIC0xOwogIGxlbiA9IG50b2hsKGxlbik7CiAgYnVmLT5kYXRhID0gcmVhbGxvYyhidWYtPmRhdGEsIGxlbik7CiAgYiA9IGJsb2NrX3JlYWQoZmQsIGJ1Zi0+ZGF0YSwgbGVuKTsKICBpZiAoYiA9PSAwKQogICAgcmV0dXJuIDA7CiAgZWxzZSBpZiAoYiA8IDApCiAgICByZXR1cm4gLTE7CiAgYnVmLT5zaXplID0gKGNvbm4tPm1lY2gtPmRlY29kZSkoY29ubi0+YXBwX2RhdGEsIGJ1Zi0+ZGF0YSwgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4tPmRhdGFfcHJvdCwgY29ubik7CiAgYnVmLT5pbmRleCA9IDA7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBzaXplX3QKYnVmZmVyX3JlYWQoc3RydWN0IGtyYjRidWZmZXIgKmJ1Ziwgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikKewogICAgbGVuID0gbWluKGxlbiwgYnVmLT5zaXplIC0gYnVmLT5pbmRleCk7CiAgICBtZW1jcHkoZGF0YSwgKGNoYXIqKWJ1Zi0+ZGF0YSArIGJ1Zi0+aW5kZXgsIGxlbik7CiAgICBidWYtPmluZGV4ICs9IGxlbjsKICAgIHJldHVybiBsZW47Cn0KCnN0YXRpYyBzaXplX3QKYnVmZmVyX3dyaXRlKHN0cnVjdCBrcmI0YnVmZmVyICpidWYsIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCnsKICAgIGlmKGJ1Zi0+aW5kZXggKyBsZW4gPiBidWYtPnNpemUpIHsKICAgICAgICB2b2lkICp0bXA7CiAgICAgICAgaWYoYnVmLT5kYXRhID09IE5VTEwpCiAgICAgICAgICAgIHRtcCA9IG1hbGxvYygxMDI0KTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHRtcCA9IHJlYWxsb2MoYnVmLT5kYXRhLCBidWYtPmluZGV4ICsgbGVuKTsKICAgICAgICBpZih0bXAgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIGJ1Zi0+ZGF0YSA9IHRtcDsKICAgICAgICBidWYtPnNpemUgPSBidWYtPmluZGV4ICsgbGVuOwogICAgfQogICAgbWVtY3B5KChjaGFyKilidWYtPmRhdGEgKyBidWYtPmluZGV4LCBkYXRhLCBsZW4pOwogICAgYnVmLT5pbmRleCArPSBsZW47CiAgICByZXR1cm4gbGVuOwp9CgppbnQKQ3VybF9zZWNfcmVhZChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBmZCwgdm9pZCAqYnVmZmVyLCBpbnQgbGVuZ3RoKQp7CiAgICBzaXplX3QgbGVuOwogICAgaW50IHJ4ID0gMDsKCiAgICBpZihjb25uLT5zZWNfY29tcGxldGUgPT0gMCB8fCBjb25uLT5kYXRhX3Byb3QgPT0gMCkKICAgICAgcmV0dXJuIHJlYWQoZmQsIGJ1ZmZlciwgbGVuZ3RoKTsKCiAgICBpZihjb25uLT5pbl9idWZmZXIuZW9mX2ZsYWcpewogICAgICBjb25uLT5pbl9idWZmZXIuZW9mX2ZsYWcgPSAwOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBsZW4gPSBidWZmZXJfcmVhZCgmY29ubi0+aW5fYnVmZmVyLCBidWZmZXIsIGxlbmd0aCk7CiAgICBsZW5ndGggLT0gbGVuOwogICAgcnggKz0gbGVuOwogICAgYnVmZmVyID0gKGNoYXIqKWJ1ZmZlciArIGxlbjsKCiAgICB3aGlsZShsZW5ndGgpIHsKICAgICAgaWYoc2VjX2dldF9kYXRhKGNvbm4sIGZkLCAmY29ubi0+aW5fYnVmZmVyKSA8IDApCiAgICAgICAgcmV0dXJuIC0xOwogICAgICBpZihjb25uLT5pbl9idWZmZXIuc2l6ZSA9PSAwKSB7CiAgICAgICAgaWYocngpCiAgICAgICAgICBjb25uLT5pbl9idWZmZXIuZW9mX2ZsYWcgPSAxOwogICAgICAgIHJldHVybiByeDsKICAgICAgfQogICAgICBsZW4gPSBidWZmZXJfcmVhZCgmY29ubi0+aW5fYnVmZmVyLCBidWZmZXIsIGxlbmd0aCk7CiAgICAgIGxlbmd0aCAtPSBsZW47CiAgICAgIHJ4ICs9IGxlbjsKICAgICAgYnVmZmVyID0gKGNoYXIqKWJ1ZmZlciArIGxlbjsKICAgIH0KICAgIHJldHVybiByeDsKfQoKc3RhdGljIGludApzZWNfc2VuZChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBmZCwgY2hhciAqZnJvbSwgaW50IGxlbmd0aCkKewogIGludCBieXRlczsKICB2b2lkICpidWY7CiAgYnl0ZXMgPSAoY29ubi0+bWVjaC0+ZW5jb2RlKShjb25uLT5hcHBfZGF0YSwgZnJvbSwgbGVuZ3RoLCBjb25uLT5kYXRhX3Byb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmLCBjb25uKTsKICBieXRlcyA9IGh0b25sKGJ5dGVzKTsKICBibG9ja193cml0ZShmZCwgJmJ5dGVzLCBzaXplb2YoYnl0ZXMpKTsKICBibG9ja193cml0ZShmZCwgYnVmLCBudG9obChieXRlcykpOwogIGZyZWUoYnVmKTsKICByZXR1cm4gbGVuZ3RoOwp9CgppbnQKQ3VybF9zZWNfZmZsdXNoX2ZkKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IGZkKQp7CiAgaWYoY29ubi0+ZGF0YV9wcm90ICE9IHByb3RfY2xlYXIpIHsKICAgIGlmKGNvbm4tPm91dF9idWZmZXIuaW5kZXggPiAwKXsKICAgICAgQ3VybF9zZWNfd3JpdGUoY29ubiwgZmQsCiAgICAgICAgICAgICAgICBjb25uLT5vdXRfYnVmZmVyLmRhdGEsIGNvbm4tPm91dF9idWZmZXIuaW5kZXgpOwogICAgICBjb25uLT5vdXRfYnVmZmVyLmluZGV4ID0gMDsKICAgIH0KICAgIHNlY19zZW5kKGNvbm4sIGZkLCBOVUxMLCAwKTsKICB9CiAgcmV0dXJuIDA7Cn0KCmludApDdXJsX3NlY193cml0ZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBmZCwgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQp7CiAgaW50IGxlbiA9IGNvbm4tPmJ1ZmZlcl9zaXplOwogIGludCB0eCA9IDA7CgogIGlmKGNvbm4tPmRhdGFfcHJvdCA9PSBwcm90X2NsZWFyKQogICAgcmV0dXJuIHdyaXRlKGZkLCBidWZmZXIsIGxlbmd0aCk7CgogIGxlbiAtPSAoY29ubi0+bWVjaC0+b3ZlcmhlYWQpKGNvbm4tPmFwcF9kYXRhLCBjb25uLT5kYXRhX3Byb3QsIGxlbik7CiAgd2hpbGUobGVuZ3RoKXsKICAgIGlmKGxlbmd0aCA8IGxlbikKICAgICAgbGVuID0gbGVuZ3RoOwogICAgc2VjX3NlbmQoY29ubiwgZmQsIGJ1ZmZlciwgbGVuKTsKICAgIGxlbmd0aCAtPSBsZW47CiAgICBidWZmZXIgKz0gbGVuOwogICAgdHggKz0gbGVuOwogIH0KICByZXR1cm4gdHg7Cn0KCmludApDdXJsX3NlY19wdXRjKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IGMsIEZJTEUgKkYpCnsKICBjaGFyIGNoID0gYzsKICBpZihjb25uLT5kYXRhX3Byb3QgPT0gcHJvdF9jbGVhcikKICAgIHJldHVybiBwdXRjKGMsIEYpOwoKICBidWZmZXJfd3JpdGUoJmNvbm4tPm91dF9idWZmZXIsICZjaCwgMSk7CiAgaWYoYyA9PSAnXG4nIHx8IGNvbm4tPm91dF9idWZmZXIuaW5kZXggPj0gMTAyNCAvKiBYWFggKi8pIHsKICAgIEN1cmxfc2VjX3dyaXRlKGNvbm4sIGZpbGVubyhGKSwgY29ubi0+b3V0X2J1ZmZlci5kYXRhLAogICAgICAgICAgICAgICAgICAgY29ubi0+b3V0X2J1ZmZlci5pbmRleCk7CiAgICBjb25uLT5vdXRfYnVmZmVyLmluZGV4ID0gMDsKICB9CiAgcmV0dXJuIGM7Cn0KCmludApDdXJsX3NlY19yZWFkX21zZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGNoYXIgKnMsIGludCBsZXZlbCkKewogIGludCBsZW47CiAgdW5zaWduZWQgY2hhciAqYnVmOwogIGludCBjb2RlOwoKICBsZW4gPSBDdXJsX2Jhc2U2NF9kZWNvZGUocyArIDQsICZidWYpOyAvKiBYWFggKi8KICBpZihsZW4gPiAwKQogICAgbGVuID0gKGNvbm4tPm1lY2gtPmRlY29kZSkoY29ubi0+YXBwX2RhdGEsIGJ1ZiwgbGVuLCBsZXZlbCwgY29ubik7CiAgZWxzZQogICAgcmV0dXJuIC0xOwoKICBpZihsZW4gPCAwKSB7CiAgICBmcmVlKGJ1Zik7CiAgICByZXR1cm4gLTE7CiAgfQoKICBidWZbbGVuXSA9ICdcMCc7CgogIGlmKGJ1ZlszXSA9PSAnLScpCiAgICBjb2RlID0gMDsKICBlbHNlCiAgICBzc2NhbmYoKGNoYXIgKilidWYsICIlZCIsICZjb2RlKTsKICBpZihidWZbbGVuLTFdID09ICdcbicpCiAgICBidWZbbGVuLTFdID0gJ1wwJzsKICBzdHJjcHkocywgKGNoYXIgKilidWYpOwogIGZyZWUoYnVmKTsKICByZXR1cm4gY29kZTsKfQoKZW51bSBwcm90ZWN0aW9uX2xldmVsCkN1cmxfc2V0X2NvbW1hbmRfcHJvdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGVudW0gcHJvdGVjdGlvbl9sZXZlbCBsZXZlbCkKewogIGVudW0gcHJvdGVjdGlvbl9sZXZlbCBvbGQgPSBjb25uLT5jb21tYW5kX3Byb3Q7CiAgY29ubi0+Y29tbWFuZF9wcm90ID0gbGV2ZWw7CiAgcmV0dXJuIG9sZDsKfQoKc3RhdGljIGludApzZWNfcHJvdF9pbnRlcm5hbChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBsZXZlbCkKewogIGNoYXIgKnA7CiAgdW5zaWduZWQgaW50IHMgPSAxMDQ4NTc2OwogIHNzaXplX3QgbnJlYWQ7CgogIGlmKCFjb25uLT5zZWNfY29tcGxldGUpewogICAgaW5mb2YoY29ubi0+ZGF0YSwgIk5vIHNlY3VyaXR5IGRhdGEgZXhjaGFuZ2UgaGFzIHRha2VuIHBsYWNlLlxuIik7CiAgICByZXR1cm4gLTE7CiAgfQoKICBpZihsZXZlbCl7CiAgICBpbnQgY29kZTsKICAgIGlmKEN1cmxfZnRwc2VuZGYoY29ubiwgIlBCU1ogJXUiLCBzKSkKICAgICAgcmV0dXJuIC0xOwoKICAgIGlmKEN1cmxfR2V0RlRQUmVzcG9uc2UoJm5yZWFkLCBjb25uLCAmY29kZSkpCiAgICAgIHJldHVybiAtMTsKCiAgICBpZihjb2RlLzEwMCAhPSAnMicpewogICAgICBmYWlsZihjb25uLT5kYXRhLCAiRmFpbGVkIHRvIHNldCBwcm90ZWN0aW9uIGJ1ZmZlciBzaXplLiIpOwogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBjb25uLT5idWZmZXJfc2l6ZSA9IHM7CgogICAgcCA9IHN0cnN0cihjb25uLT5kYXRhLT5zdGF0ZS5idWZmZXIsICJQQlNaPSIpOwogICAgaWYocCkKICAgICAgc3NjYW5mKHAsICJQQlNaPSV1IiwgJnMpOwogICAgaWYocyA8IGNvbm4tPmJ1ZmZlcl9zaXplKQogICAgICBjb25uLT5idWZmZXJfc2l6ZSA9IHM7CiAgfQoKICBpZihDdXJsX2Z0cHNlbmRmKGNvbm4sICJQUk9UICVjIiwgbGV2ZWxbIkNTRVAiXSkpCiAgICByZXR1cm4gLTE7CgogIGlmKEN1cmxfR2V0RlRQUmVzcG9uc2UoJm5yZWFkLCBjb25uLCBOVUxMKSkKICAgIHJldHVybiAtMTsKCiAgaWYoY29ubi0+ZGF0YS0+c3RhdGUuYnVmZmVyWzBdICE9ICcyJyl7CiAgICBmYWlsZihjb25uLT5kYXRhLCAiRmFpbGVkIHRvIHNldCBwcm90ZWN0aW9uIGxldmVsLiIpOwogICAgcmV0dXJuIC0xOwogIH0KCiAgY29ubi0+ZGF0YV9wcm90ID0gKGVudW0gcHJvdGVjdGlvbl9sZXZlbClsZXZlbDsKICByZXR1cm4gMDsKfQoKdm9pZApDdXJsX3NlY19zZXRfcHJvdGVjdGlvbl9sZXZlbChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCnsKICBpZihjb25uLT5zZWNfY29tcGxldGUgJiYgY29ubi0+ZGF0YV9wcm90ICE9IGNvbm4tPnJlcXVlc3RfZGF0YV9wcm90KQogICAgc2VjX3Byb3RfaW50ZXJuYWwoY29ubiwgY29ubi0+cmVxdWVzdF9kYXRhX3Byb3QpOwp9CgoKaW50CkN1cmxfc2VjX3JlcXVlc3RfcHJvdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGNvbnN0IGNoYXIgKmxldmVsKQp7CiAgaW50IGwgPSBuYW1lX3RvX2xldmVsKGxldmVsKTsKICBpZihsID09IC0xKQogICAgcmV0dXJuIC0xOwogIGNvbm4tPnJlcXVlc3RfZGF0YV9wcm90ID0gKGVudW0gcHJvdGVjdGlvbl9sZXZlbClsOwogIHJldHVybiAwOwp9CgppbnQKQ3VybF9zZWNfbG9naW4oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKQp7CiAgaW50IHJldDsKICBjb25zdCBzdHJ1Y3QgQ3VybF9zZWNfY2xpZW50X21lY2ggKiBjb25zdCAqbTsKICBzc2l6ZV90IG5yZWFkOwogIHN0cnVjdCBTZXNzaW9uSGFuZGxlICpkYXRhPWNvbm4tPmRhdGE7CiAgaW50IGZ0cGNvZGU7CgogIGZvcihtID0gbWVjaHM7ICptICYmICgqbSktPm5hbWU7IG0rKykgewogICAgdm9pZCAqdG1wOwoKICAgIHRtcCA9IHJlYWxsb2MoY29ubi0+YXBwX2RhdGEsICgqbSktPnNpemUpOwogICAgaWYgKHRtcCA9PSBOVUxMKSB7CiAgICAgIGZhaWxmIChkYXRhLCAicmVhbGxvYyAldSBmYWlsZWQiLCAoKm0pLT5zaXplKTsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgY29ubi0+YXBwX2RhdGEgPSB0bXA7CgogICAgaWYoKCptKS0+aW5pdCAmJiAoKigqbSktPmluaXQpKGNvbm4tPmFwcF9kYXRhKSAhPSAwKSB7CiAgICAgIGluZm9mKGRhdGEsICJTa2lwcGluZyAlcy4uLlxuIiwgKCptKS0+bmFtZSk7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaW5mb2YoZGF0YSwgIlRyeWluZyAlcy4uLlxuIiwgKCptKS0+bmFtZSk7CgogICAgaWYoQ3VybF9mdHBzZW5kZihjb25uLCAiQVVUSCAlcyIsICgqbSktPm5hbWUpKQogICAgICByZXR1cm4gLTE7CgogICAgaWYoQ3VybF9HZXRGVFBSZXNwb25zZSgmbnJlYWQsIGNvbm4sICZmdHBjb2RlKSkKICAgICAgcmV0dXJuIC0xOwoKICAgIGlmKGNvbm4tPmRhdGEtPnN0YXRlLmJ1ZmZlclswXSAhPSAnMycpewogICAgICBzd2l0Y2goZnRwY29kZSkgewogICAgICBjYXNlIDUwNDoKICAgICAgICBpbmZvZihkYXRhLAogICAgICAgICAgICAgICIlcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIuXG4iLCAoKm0pLT5uYW1lKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA1MzQ6CiAgICAgICAgaW5mb2YoZGF0YSwgIiVzIHJlamVjdGVkIGFzIHNlY3VyaXR5IG1lY2hhbmlzbS5cbiIsICgqbSktPm5hbWUpOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGlmKGNvbm4tPmRhdGEtPnN0YXRlLmJ1ZmZlclswXSA9PSAnNScpIHsKICAgICAgICAgIGluZm9mKGRhdGEsICJUaGUgc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgRlRQICIKICAgICAgICAgICAgICAgICJzZWN1cml0eSBleHRlbnNpb25zLlxuIik7CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIHJldCA9ICgqKCptKS0+YXV0aCkoY29ubi0+YXBwX2RhdGEsIGNvbm4pOwoKICAgIGlmKHJldCA9PSBBVVRIX0NPTlRJTlVFKQogICAgICBjb250aW51ZTsKICAgIGVsc2UgaWYocmV0ICE9IEFVVEhfT0spewogICAgICAvKiBtZWNoYW5pc20gaXMgc3VwcG9zZWQgdG8gb3V0cHV0IGVycm9yIHN0cmluZyAqLwogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBjb25uLT5tZWNoID0gKm07CiAgICBjb25uLT5zZWNfY29tcGxldGUgPSAxOwogICAgY29ubi0+Y29tbWFuZF9wcm90ID0gcHJvdF9zYWZlOwogICAgYnJlYWs7CiAgfQoKICByZXR1cm4gKm0gPT0gTlVMTDsKfQoKdm9pZApDdXJsX3NlY19lbmQoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKQp7CiAgaWYgKGNvbm4tPm1lY2ggIT0gTlVMTCkgewogICAgaWYoY29ubi0+bWVjaC0+ZW5kKQogICAgICAoY29ubi0+bWVjaC0+ZW5kKShjb25uLT5hcHBfZGF0YSk7CiAgICBtZW1zZXQoY29ubi0+YXBwX2RhdGEsIDAsIGNvbm4tPm1lY2gtPnNpemUpOwogICAgZnJlZShjb25uLT5hcHBfZGF0YSk7CiAgICBjb25uLT5hcHBfZGF0YSA9IE5VTEw7CiAgfQogIGNvbm4tPnNlY19jb21wbGV0ZSA9IDA7CiAgY29ubi0+ZGF0YV9wcm90ID0gKGVudW0gcHJvdGVjdGlvbl9sZXZlbCkwOwogIGNvbm4tPm1lY2g9TlVMTDsKfQoKI2VuZGlmIC8qIEhBVkVfS1JCNCAqLwojZW5kaWYgLyogQ1VSTF9ESVNBQkxFX0ZUUCAqLwo=