LyoKICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCiAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICoKICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgSU5TVElUVVRFIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAogKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSU5TVElUVVRFIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCiAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICovCgovKiAkSWQ6IHNucHJpbnRmLmMsdiAxLjEgMjAwNC0wNC0wNSAyMjo0Mzo1MSBndXkgRXhwICQgKi8KCiNpZmRlZiBIQVZFX0NPTkZJR19ICiNpbmNsdWRlIDxjb25maWcuaD4KI2VuZGlmCgojaWZuZGVmIGxpbnQKc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQogICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL21pc3Npbmcvc25wcmludGYuYyx2IDEuMSAyMDA0LTA0LTA1IDIyOjQzOjUxIGd1eSBFeHAgJCI7CiNlbmRpZgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgojaW5jbHVkZSA8cGNhcC1pbnQuaD4KCmVudW0gZm9ybWF0X2ZsYWdzIHsKICAgIG1pbnVzX2ZsYWcgICAgID0gIDEsCiAgICBwbHVzX2ZsYWcgICAgICA9ICAyLAogICAgc3BhY2VfZmxhZyAgICAgPSAgNCwKICAgIGFsdGVybmF0ZV9mbGFnID0gIDgsCiAgICB6ZXJvX2ZsYWcgICAgICA9IDE2Cn07CgovKgogKiBDb21tb24gc3RhdGUKICovCgpzdHJ1Y3Qgc3RhdGUgewogIHVuc2lnbmVkIGNoYXIgKnN0cjsKICB1bnNpZ25lZCBjaGFyICpzOwogIHVuc2lnbmVkIGNoYXIgKnRoZWVuZDsKICBzaXplX3Qgc3o7CiAgc2l6ZV90IG1heF9zejsKICBpbnQgKCphcHBlbmRfY2hhcikoc3RydWN0IHN0YXRlICosIHVuc2lnbmVkIGNoYXIpOwogIGludCAoKnJlc2VydmUpKHN0cnVjdCBzdGF0ZSAqLCBzaXplX3QpOwogIC8qIFhYWCAtIG1ldGhvZHMgKi8KfTsKCiNpZm5kZWYgSEFWRV9WU05QUklOVEYKc3RhdGljIGludApzbl9yZXNlcnZlIChzdHJ1Y3Qgc3RhdGUgKnN0YXRlLCBzaXplX3QgbikKewogIHJldHVybiBzdGF0ZS0+cyArIG4gPiBzdGF0ZS0+dGhlZW5kOwp9CgpzdGF0aWMgaW50CnNuX2FwcGVuZF9jaGFyIChzdHJ1Y3Qgc3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBjaGFyIGMpCnsKICBpZiAoc25fcmVzZXJ2ZSAoc3RhdGUsIDEpKSB7CiAgICByZXR1cm4gMTsKICB9IGVsc2UgewogICAgKnN0YXRlLT5zKysgPSBjOwogICAgcmV0dXJuIDA7CiAgfQp9CiNlbmRpZgoKI2lmIDAKc3RhdGljIGludAphc19yZXNlcnZlIChzdHJ1Y3Qgc3RhdGUgKnN0YXRlLCBzaXplX3QgbikKewogIGlmIChzdGF0ZS0+cyArIG4gPiBzdGF0ZS0+dGhlZW5kKSB7CiAgICBpbnQgb2ZmID0gc3RhdGUtPnMgLSBzdGF0ZS0+c3RyOwogICAgdW5zaWduZWQgY2hhciAqdG1wOwoKICAgIGlmIChzdGF0ZS0+bWF4X3N6ICYmIHN0YXRlLT5zeiA+PSBzdGF0ZS0+bWF4X3N6KQogICAgICByZXR1cm4gMTsKCiAgICBzdGF0ZS0+c3ogPSBtYXgoc3RhdGUtPnN6ICogMiwgc3RhdGUtPnN6ICsgbik7CiAgICBpZiAoc3RhdGUtPm1heF9zeikKICAgICAgc3RhdGUtPnN6ID0gbWluKHN0YXRlLT5zeiwgc3RhdGUtPm1heF9zeik7CiAgICB0bXAgPSByZWFsbG9jIChzdGF0ZS0+c3RyLCBzdGF0ZS0+c3opOwogICAgaWYgKHRtcCA9PSBOVUxMKQogICAgICByZXR1cm4gMTsKICAgIHN0YXRlLT5zdHIgPSB0bXA7CiAgICBzdGF0ZS0+cyA9IHN0YXRlLT5zdHIgKyBvZmY7CiAgICBzdGF0ZS0+dGhlZW5kID0gc3RhdGUtPnN0ciArIHN0YXRlLT5zeiAtIDE7CiAgfQogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50CmFzX2FwcGVuZF9jaGFyIChzdHJ1Y3Qgc3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBjaGFyIGMpCnsKICBpZihhc19yZXNlcnZlIChzdGF0ZSwgMSkpCiAgICByZXR1cm4gMTsKICBlbHNlIHsKICAgICpzdGF0ZS0+cysrID0gYzsKICAgIHJldHVybiAwOwogIH0KfQojZW5kaWYKCnN0YXRpYyBpbnQKYXBwZW5kX251bWJlcihzdHJ1Y3Qgc3RhdGUgKnN0YXRlLAoJICAgICAgdW5zaWduZWQgbG9uZyBudW0sIHVuc2lnbmVkIGJhc2UsIGNoYXIgKnJlcCwKCSAgICAgIGludCB3aWR0aCwgaW50IHByZWMsIGludCBmbGFncywgaW50IG1pbnVzcCkKewogIGludCBsZW4gPSAwOwogIGludCBpOwoKICAvKiBnaXZlbiBwcmVjaXNpb24sIGlnbm9yZSB6ZXJvIGZsYWcgKi8KICBpZihwcmVjICE9IC0xKQogICAgZmxhZ3MgJj0gfnplcm9fZmxhZzsKICBlbHNlCiAgICBwcmVjID0gMTsKICAvKiB6ZXJvIHZhbHVlIHdpdGggemVybyBwcmVjaXNpb24gLT4gIiIgKi8KICBpZihwcmVjID09IDAgJiYgbnVtID09IDApCiAgICByZXR1cm4gMDsKICBkb3sKICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgcmVwW251bSAlIGJhc2VdKSkKICAgICAgcmV0dXJuIDE7CiAgICBsZW4rKzsKICAgIG51bSAvPSBiYXNlOwogIH13aGlsZShudW0pOwogIHByZWMgLT0gbGVuOwogIC8qIHBhZCB3aXRoIHByZWMgemVyb3MgKi8KICB3aGlsZShwcmVjLS0gPiAwKXsKICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgJzAnKSkKICAgICAgcmV0dXJuIDE7CiAgICBsZW4rKzsKICB9CiAgLyogYWRkIGxlbmd0aCBvZiBhbHRlcm5hdGUgcHJlZml4IChhZGRlZCBsYXRlcikgdG8gbGVuICovCiAgaWYoZmxhZ3MgJiBhbHRlcm5hdGVfZmxhZyAmJiAoYmFzZSA9PSAxNiB8fCBiYXNlID09IDgpKQogICAgbGVuICs9IGJhc2UgLyA4OwogIC8qIHBhZCB3aXRoIHplcm9zICovCiAgaWYoZmxhZ3MgJiB6ZXJvX2ZsYWcpewogICAgd2lkdGggLT0gbGVuOwogICAgaWYobWludXNwIHx8IChmbGFncyAmIHNwYWNlX2ZsYWcpIHx8IChmbGFncyAmIHBsdXNfZmxhZykpCiAgICAgIHdpZHRoLS07CiAgICB3aGlsZSh3aWR0aC0tID4gMCl7CiAgICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgJzAnKSkKCXJldHVybiAxOwogICAgICBsZW4rKzsKICAgIH0KICB9CiAgLyogYWRkIGFsdGVybmF0ZSBwcmVmaXggKi8KICBpZihmbGFncyAmIGFsdGVybmF0ZV9mbGFnICYmIChiYXNlID09IDE2IHx8IGJhc2UgPT0gOCkpewogICAgaWYoYmFzZSA9PSAxNikKICAgICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCByZXBbMTBdICsgMjMpKSAvKiBYWFggKi8KCXJldHVybiAxOwogICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnMCcpKQogICAgICByZXR1cm4gMTsKICB9CiAgLyogYWRkIHNpZ24gKi8KICBpZihtaW51c3ApewogICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnLScpKQogICAgICByZXR1cm4gMTsKICAgIGxlbisrOwogIH0gZWxzZSBpZihmbGFncyAmIHBsdXNfZmxhZykgewogICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnKycpKQogICAgICByZXR1cm4gMTsKICAgIGxlbisrOwogIH0gZWxzZSBpZihmbGFncyAmIHNwYWNlX2ZsYWcpIHsKICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgJyAnKSkKICAgICAgcmV0dXJuIDE7CiAgICBsZW4rKzsKICB9CiAgaWYoZmxhZ3MgJiBtaW51c19mbGFnKQogICAgLyogc3dhcCBiZWZvcmUgcGFkZGluZyB3aXRoIHNwYWNlcyAqLwogICAgZm9yKGkgPSAwOyBpIDwgbGVuIC8gMjsgaSsrKXsKICAgICAgY2hhciBjID0gc3RhdGUtPnNbLWktMV07CiAgICAgIHN0YXRlLT5zWy1pLTFdID0gc3RhdGUtPnNbLWxlbitpXTsKICAgICAgc3RhdGUtPnNbLWxlbitpXSA9IGM7CiAgICB9CiAgd2lkdGggLT0gbGVuOwogIHdoaWxlKHdpZHRoLS0gPiAwKXsKICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgICcgJykpCiAgICAgIHJldHVybiAxOwogICAgbGVuKys7CiAgfQogIGlmKCEoZmxhZ3MgJiBtaW51c19mbGFnKSkKICAgIC8qIHN3YXAgYWZ0ZXIgcGFkZGluZyB3aXRoIHNwYWNlcyAqLwogICAgZm9yKGkgPSAwOyBpIDwgbGVuIC8gMjsgaSsrKXsKICAgICAgY2hhciBjID0gc3RhdGUtPnNbLWktMV07CiAgICAgIHN0YXRlLT5zWy1pLTFdID0gc3RhdGUtPnNbLWxlbitpXTsKICAgICAgc3RhdGUtPnNbLWxlbitpXSA9IGM7CiAgICB9CgogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50CmFwcGVuZF9zdHJpbmcgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsCgkgICAgICAgdW5zaWduZWQgY2hhciAqYXJnLAoJICAgICAgIGludCB3aWR0aCwKCSAgICAgICBpbnQgcHJlYywKCSAgICAgICBpbnQgZmxhZ3MpCnsKICBpZihwcmVjICE9IC0xKQogICAgd2lkdGggLT0gcHJlYzsKICBlbHNlCiAgICB3aWR0aCAtPSBzdHJsZW4oKGNoYXIgKilhcmcpOwogIGlmKCEoZmxhZ3MgJiBtaW51c19mbGFnKSkKICAgIHdoaWxlKHdpZHRoLS0gPiAwKQogICAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCAnICcpKQoJcmV0dXJuIDE7CiAgaWYgKHByZWMgIT0gLTEpIHsKICAgIHdoaWxlICgqYXJnICYmIHByZWMtLSkKICAgICAgaWYgKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsICphcmcrKykpCglyZXR1cm4gMTsKICB9IGVsc2UgewogICAgd2hpbGUgKCphcmcpCiAgICAgIGlmICgoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCAqYXJnKyspKQoJcmV0dXJuIDE7CiAgfQogIGlmKGZsYWdzICYgbWludXNfZmxhZykKICAgIHdoaWxlKHdpZHRoLS0gPiAwKQogICAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCAnICcpKQoJcmV0dXJuIDE7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKYXBwZW5kX2NoYXIoc3RydWN0IHN0YXRlICpzdGF0ZSwKCSAgICB1bnNpZ25lZCBjaGFyIGFyZywKCSAgICBpbnQgd2lkdGgsCgkgICAgaW50IGZsYWdzKQp7CiAgd2hpbGUoIShmbGFncyAmIG1pbnVzX2ZsYWcpICYmIC0td2lkdGggPiAwKQogICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgJyAnKSkKICAgICAgcmV0dXJuIDE7CgogIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsIGFyZykpCiAgICByZXR1cm4gMTsKICB3aGlsZSgoZmxhZ3MgJiBtaW51c19mbGFnKSAmJiAtLXdpZHRoID4gMCkKICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsICcgJykpCiAgICAgIHJldHVybiAxOwoKICByZXR1cm4gMDsKfQoKLyoKICogVGhpcyBjYW4ndCBiZSBtYWRlIGludG8gYSBmdW5jdGlvbi4uLgogKi8KCiNkZWZpbmUgUEFSU0VfSU5UX0ZPUk1BVChyZXMsIGFyZywgdW5zaWcpIFwKaWYgKGxvbmdfZmxhZykgXAogICAgIHJlcyA9ICh1bnNpZyBsb25nKXZhX2FyZyhhcmcsIHVuc2lnIGxvbmcpOyBcCmVsc2UgaWYgKHNob3J0X2ZsYWcpIFwKICAgICByZXMgPSAodW5zaWcgc2hvcnQpdmFfYXJnKGFyZywgdW5zaWcgaW50KTsgXAplbHNlIFwKICAgICByZXMgPSAodW5zaWcgaW50KXZhX2FyZyhhcmcsIHVuc2lnIGludCkKCi8qCiAqIHp5eHByaW50ZiAtIHJldHVybiAwIG9yIC0xCiAqLwoKc3RhdGljIGludAp4eXpwcmludGYgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgKmNoYXJfZm9ybWF0LCB2YV9saXN0IGFwKQp7CiAgY29uc3QgdW5zaWduZWQgY2hhciAqZm9ybWF0ID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiljaGFyX2Zvcm1hdDsKICB1bnNpZ25lZCBjaGFyIGM7CgogIHdoaWxlKChjID0gKmZvcm1hdCsrKSkgewogICAgaWYgKGMgPT0gJyUnKSB7CiAgICAgIGludCBmbGFncyAgICAgID0gMDsKICAgICAgaW50IHdpZHRoICAgICAgPSAwOwogICAgICBpbnQgcHJlYyAgICAgICA9IC0xOwogICAgICBpbnQgbG9uZ19mbGFnICA9IDA7CiAgICAgIGludCBzaG9ydF9mbGFnID0gMDsKCiAgICAgIC8qIGZsYWdzICovCiAgICAgIHdoaWxlKChjID0gKmZvcm1hdCsrKSl7CglpZihjID09ICctJykKCSAgZmxhZ3MgfD0gbWludXNfZmxhZzsKCWVsc2UgaWYoYyA9PSAnKycpCgkgIGZsYWdzIHw9IHBsdXNfZmxhZzsKCWVsc2UgaWYoYyA9PSAnICcpCgkgIGZsYWdzIHw9IHNwYWNlX2ZsYWc7CgllbHNlIGlmKGMgPT0gJyMnKQoJICBmbGFncyB8PSBhbHRlcm5hdGVfZmxhZzsKCWVsc2UgaWYoYyA9PSAnMCcpCgkgIGZsYWdzIHw9IHplcm9fZmxhZzsKCWVsc2UKCSAgYnJlYWs7CiAgICAgIH0KCiAgICAgIGlmKChmbGFncyAmIHNwYWNlX2ZsYWcpICYmIChmbGFncyAmIHBsdXNfZmxhZykpCglmbGFncyBePSBzcGFjZV9mbGFnOwoKICAgICAgaWYoKGZsYWdzICYgbWludXNfZmxhZykgJiYgKGZsYWdzICYgemVyb19mbGFnKSkKCWZsYWdzIF49IHplcm9fZmxhZzsKCiAgICAgIC8qIHdpZHRoICovCiAgICAgIGlmIChpc2RpZ2l0KGMpKQoJZG8gewoJICB3aWR0aCA9IHdpZHRoICogMTAgKyBjIC0gJzAnOwoJICBjID0gKmZvcm1hdCsrOwoJfSB3aGlsZShpc2RpZ2l0KGMpKTsKICAgICAgZWxzZSBpZihjID09ICcqJykgewoJd2lkdGggPSB2YV9hcmcoYXAsIGludCk7CgljID0gKmZvcm1hdCsrOwogICAgICB9CgogICAgICAvKiBwcmVjaXNpb24gKi8KICAgICAgaWYgKGMgPT0gJy4nKSB7CglwcmVjID0gMDsKCWMgPSAqZm9ybWF0Kys7CglpZiAoaXNkaWdpdChjKSkKCSAgZG8gewoJICAgIHByZWMgPSBwcmVjICogMTAgKyBjIC0gJzAnOwoJICAgIGMgPSAqZm9ybWF0Kys7CgkgIH0gd2hpbGUoaXNkaWdpdChjKSk7CgllbHNlIGlmIChjID09ICcqJykgewoJICBwcmVjID0gdmFfYXJnKGFwLCBpbnQpOwoJICBjID0gKmZvcm1hdCsrOwoJfQogICAgICB9CgogICAgICAvKiBzaXplICovCgogICAgICBpZiAoYyA9PSAnaCcpIHsKCXNob3J0X2ZsYWcgPSAxOwoJYyA9ICpmb3JtYXQrKzsKICAgICAgfSBlbHNlIGlmIChjID09ICdsJykgewoJbG9uZ19mbGFnID0gMTsKCWMgPSAqZm9ybWF0Kys7CiAgICAgIH0KCiAgICAgIHN3aXRjaCAoYykgewogICAgICBjYXNlICdjJyA6CglpZihhcHBlbmRfY2hhcihzdGF0ZSwgdmFfYXJnKGFwLCBpbnQpLCB3aWR0aCwgZmxhZ3MpKQoJICByZXR1cm4gLTE7CglicmVhazsKICAgICAgY2FzZSAncycgOgoJaWYgKGFwcGVuZF9zdHJpbmcoc3RhdGUsCgkJCSAgdmFfYXJnKGFwLCB1bnNpZ25lZCBjaGFyKiksCgkJCSAgd2lkdGgsCgkJCSAgcHJlYywKCQkJICBmbGFncykpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICBjYXNlICdkJyA6CiAgICAgIGNhc2UgJ2knIDogewoJbG9uZyBhcmc7Cgl1bnNpZ25lZCBsb25nIG51bTsKCWludCBtaW51c3AgPSAwOwoKCVBBUlNFX0lOVF9GT1JNQVQoYXJnLCBhcCwgc2lnbmVkKTsKCglpZiAoYXJnIDwgMCkgewoJICBtaW51c3AgPSAxOwoJICBudW0gPSAtYXJnOwoJfSBlbHNlCgkgIG51bSA9IGFyZzsKCglpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIG51bSwgMTAsICIwMTIzNDU2Nzg5IiwKCQkJICAgd2lkdGgsIHByZWMsIGZsYWdzLCBtaW51c3ApKQoJICByZXR1cm4gLTE7CglicmVhazsKICAgICAgfQogICAgICBjYXNlICd1JyA6IHsKCXVuc2lnbmVkIGxvbmcgYXJnOwoKCVBBUlNFX0lOVF9GT1JNQVQoYXJnLCBhcCwgdW5zaWduZWQpOwoKCWlmIChhcHBlbmRfbnVtYmVyIChzdGF0ZSwgYXJnLCAxMCwgIjAxMjM0NTY3ODkiLAoJCQkgICB3aWR0aCwgcHJlYywgZmxhZ3MsIDApKQoJICByZXR1cm4gLTE7CglicmVhazsKICAgICAgfQogICAgICBjYXNlICdvJyA6IHsKCXVuc2lnbmVkIGxvbmcgYXJnOwoKCVBBUlNFX0lOVF9GT1JNQVQoYXJnLCBhcCwgdW5zaWduZWQpOwoKCWlmIChhcHBlbmRfbnVtYmVyIChzdGF0ZSwgYXJnLCAwMTAsICIwMTIzNDU2NyIsCgkJCSAgIHdpZHRoLCBwcmVjLCBmbGFncywgMCkpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgJ3gnIDogewoJdW5zaWduZWQgbG9uZyBhcmc7CgoJUEFSU0VfSU5UX0ZPUk1BVChhcmcsIGFwLCB1bnNpZ25lZCk7CgoJaWYgKGFwcGVuZF9udW1iZXIgKHN0YXRlLCBhcmcsIDB4MTAsICIwMTIzNDU2Nzg5YWJjZGVmIiwKCQkJICAgd2lkdGgsIHByZWMsIGZsYWdzLCAwKSkKCSAgcmV0dXJuIC0xOwoJYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAnWCcgOnsKCXVuc2lnbmVkIGxvbmcgYXJnOwoKCVBBUlNFX0lOVF9GT1JNQVQoYXJnLCBhcCwgdW5zaWduZWQpOwoKCWlmIChhcHBlbmRfbnVtYmVyIChzdGF0ZSwgYXJnLCAweDEwLCAiMDEyMzQ1Njc4OUFCQ0RFRiIsCgkJCSAgIHdpZHRoLCBwcmVjLCBmbGFncywgMCkpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgJ3AnIDogewoJdW5zaWduZWQgbG9uZyBhcmcgPSAodW5zaWduZWQgbG9uZyl2YV9hcmcoYXAsIHZvaWQqKTsKCglpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIGFyZywgMHgxMCwgIjAxMjM0NTY3ODlBQkNERUYiLAoJCQkgICB3aWR0aCwgcHJlYywgZmxhZ3MsIDApKQoJICByZXR1cm4gLTE7CglicmVhazsKICAgICAgfQogICAgICBjYXNlICduJyA6IHsKCWludCAqYXJnID0gdmFfYXJnKGFwLCBpbnQqKTsKCSphcmcgPSBzdGF0ZS0+cyAtIHN0YXRlLT5zdHI7CglicmVhazsKICAgICAgfQogICAgICBjYXNlICdcMCcgOgoJICAtLWZvcm1hdDsKCSAgLyogRkFMTFRIUk9VR0ggKi8KICAgICAgY2FzZSAnJScgOgoJaWYgKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgYykpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICBkZWZhdWx0IDoKCWlmICggICAoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsICclJykKCSAgICB8fCAoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsIGMpKQoJICByZXR1cm4gLTE7CglicmVhazsKICAgICAgfQogICAgfSBlbHNlCiAgICAgIGlmICgoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCBjKSkKCXJldHVybiAtMTsKICB9CiAgcmV0dXJuIDA7Cn0KCiNpZm5kZWYgSEFWRV9TTlBSSU5URgppbnQKc25wcmludGYgKGNoYXIgKnN0ciwgc2l6ZV90IHN6LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKewogIHZhX2xpc3QgYXJnczsKICBpbnQgcmV0OwoKICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOwogIHJldCA9IHZzbnByaW50ZiAoc3RyLCBzeiwgZm9ybWF0LCBhcmdzKTsKCiNpZmRlZiBQQVJBTk9JQQogIHsKICAgIGludCByZXQyOwogICAgY2hhciAqdG1wOwoKICAgIHRtcCA9IG1hbGxvYyAoc3opOwogICAgaWYgKHRtcCA9PSBOVUxMKQogICAgICBhYm9ydCAoKTsKCiAgICByZXQyID0gdnNwcmludGYgKHRtcCwgZm9ybWF0LCBhcmdzKTsKICAgIGlmIChyZXQgIT0gcmV0MiB8fCBzdHJjbXAoc3RyLCB0bXApKQogICAgICBhYm9ydCAoKTsKICAgIGZyZWUgKHRtcCk7CiAgfQojZW5kaWYKCiAgdmFfZW5kKGFyZ3MpOwogIHJldHVybiByZXQ7Cn0KI2VuZGlmCgojaWYgMAojaWZuZGVmIEhBVkVfQVNQUklOVEYKaW50CmFzcHJpbnRmIChjaGFyICoqcmV0LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKewogIHZhX2xpc3QgYXJnczsKICBpbnQgdmFsOwoKICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOwogIHZhbCA9IHZhc3ByaW50ZiAocmV0LCBmb3JtYXQsIGFyZ3MpOwoKI2lmZGVmIFBBUkFOT0lBCiAgewogICAgaW50IHJldDI7CiAgICBjaGFyICp0bXA7CiAgICB0bXAgPSBtYWxsb2MgKHZhbCArIDEpOwogICAgaWYgKHRtcCA9PSBOVUxMKQogICAgICBhYm9ydCAoKTsKCiAgICByZXQyID0gdnNwcmludGYgKHRtcCwgZm9ybWF0LCBhcmdzKTsKICAgIGlmICh2YWwgIT0gcmV0MiB8fCBzdHJjbXAoKnJldCwgdG1wKSkKICAgICAgYWJvcnQgKCk7CiAgICBmcmVlICh0bXApOwogIH0KI2VuZGlmCgogIHZhX2VuZChhcmdzKTsKICByZXR1cm4gdmFsOwp9CiNlbmRpZgoKI2lmbmRlZiBIQVZFX0FTTlBSSU5URgppbnQKYXNucHJpbnRmIChjaGFyICoqcmV0LCBzaXplX3QgbWF4X3N6LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKewogIHZhX2xpc3QgYXJnczsKICBpbnQgdmFsOwoKICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOwogIHZhbCA9IHZhc25wcmludGYgKHJldCwgbWF4X3N6LCBmb3JtYXQsIGFyZ3MpOwoKI2lmZGVmIFBBUkFOT0lBCiAgewogICAgaW50IHJldDI7CiAgICBjaGFyICp0bXA7CiAgICB0bXAgPSBtYWxsb2MgKHZhbCArIDEpOwogICAgaWYgKHRtcCA9PSBOVUxMKQogICAgICBhYm9ydCAoKTsKCiAgICByZXQyID0gdnNwcmludGYgKHRtcCwgZm9ybWF0LCBhcmdzKTsKICAgIGlmICh2YWwgIT0gcmV0MiB8fCBzdHJjbXAoKnJldCwgdG1wKSkKICAgICAgYWJvcnQgKCk7CiAgICBmcmVlICh0bXApOwogIH0KI2VuZGlmCgogIHZhX2VuZChhcmdzKTsKICByZXR1cm4gdmFsOwp9CiNlbmRpZgoKI2lmbmRlZiBIQVZFX1ZBU1BSSU5URgppbnQKdmFzcHJpbnRmIChjaGFyICoqcmV0LCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKewogIHJldHVybiB2YXNucHJpbnRmIChyZXQsIDAsIGZvcm1hdCwgYXJncyk7Cn0KI2VuZGlmCgoKI2lmbmRlZiBIQVZFX1ZBU05QUklOVEYKaW50CnZhc25wcmludGYgKGNoYXIgKipyZXQsIHNpemVfdCBtYXhfc3osIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQp7CiAgaW50IHN0OwogIHNpemVfdCBsZW47CiAgc3RydWN0IHN0YXRlIHN0YXRlOwoKICBzdGF0ZS5tYXhfc3ogPSBtYXhfc3o7CiAgc3RhdGUuc3ogICAgID0gMTsKICBzdGF0ZS5zdHIgICAgPSBtYWxsb2Moc3RhdGUuc3opOwogIGlmIChzdGF0ZS5zdHIgPT0gTlVMTCkgewogICAgKnJldCA9IE5VTEw7CiAgICByZXR1cm4gLTE7CiAgfQogIHN0YXRlLnMgPSBzdGF0ZS5zdHI7CiAgc3RhdGUudGhlZW5kID0gc3RhdGUucyArIHN0YXRlLnN6IC0gMTsKICBzdGF0ZS5hcHBlbmRfY2hhciA9IGFzX2FwcGVuZF9jaGFyOwogIHN0YXRlLnJlc2VydmUgICAgID0gYXNfcmVzZXJ2ZTsKCiAgc3QgPSB4eXpwcmludGYgKCZzdGF0ZSwgZm9ybWF0LCBhcmdzKTsKICBpZiAoc3QpIHsKICAgIGZyZWUgKHN0YXRlLnN0cik7CiAgICAqcmV0ID0gTlVMTDsKICAgIHJldHVybiAtMTsKICB9IGVsc2UgewogICAgY2hhciAqdG1wOwoKICAgICpzdGF0ZS5zID0gJ1wwJzsKICAgIGxlbiA9IHN0YXRlLnMgLSBzdGF0ZS5zdHI7CiAgICB0bXAgPSByZWFsbG9jIChzdGF0ZS5zdHIsIGxlbisxKTsKICAgIGlmICh0bXAgPT0gTlVMTCkgewogICAgICBmcmVlIChzdGF0ZS5zdHIpOwogICAgICAqcmV0ID0gTlVMTDsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgKnJldCA9IHRtcDsKICAgIHJldHVybiBsZW47CiAgfQp9CiNlbmRpZgojZW5kaWYKCiNpZm5kZWYgSEFWRV9WU05QUklOVEYKaW50CnZzbnByaW50ZiAoY2hhciAqc3RyLCBzaXplX3Qgc3osIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQp7CiAgc3RydWN0IHN0YXRlIHN0YXRlOwogIGludCByZXQ7CiAgdW5zaWduZWQgY2hhciAqdXN0ciA9ICh1bnNpZ25lZCBjaGFyICopc3RyOwoKICBzdGF0ZS5tYXhfc3ogPSAwOwogIHN0YXRlLnN6ICAgICA9IHN6OwogIHN0YXRlLnN0ciAgICA9IHVzdHI7CiAgc3RhdGUucyAgICAgID0gdXN0cjsKICBzdGF0ZS50aGVlbmQgPSB1c3RyICsgc3ogLSAxOwogIHN0YXRlLmFwcGVuZF9jaGFyID0gc25fYXBwZW5kX2NoYXI7CiAgc3RhdGUucmVzZXJ2ZSAgICAgPSBzbl9yZXNlcnZlOwoKICByZXQgPSB4eXpwcmludGYgKCZzdGF0ZSwgZm9ybWF0LCBhcmdzKTsKICAqc3RhdGUucyA9ICdcMCc7CiAgaWYgKHJldCkKICAgIHJldHVybiBzejsKICBlbHNlCiAgICByZXR1cm4gc3RhdGUucyAtIHN0YXRlLnN0cjsKfQojZW5kaWYKCg==