LyoKICogYWdlbnRfcmVnaXN0cnkuYwogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qKiBAZGVmZ3JvdXAgYWdlbnRfcmVnaXN0cnkgTWFpbnRhaW4gYSByZWdpc3RyeSBvZiBNSUIgc3VidHJlZXMsIHRvZ2V0aGVyIHdpdGggcmVsYXRlZCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgbWlibW9kdWxlLCBzZXNzaW9ucywgZXRjCiAqICAgQGluZ3JvdXAgYWdlbnQKICoKICogQHsKICovCgojZGVmaW5lIElOX1NOTVBfVkFSU19DCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpbmNsdWRlIDxzaWduYWwuaD4KI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZW5kaWYKI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpZiBIQVZFX1dJTlNPQ0tfSAojaW5jbHVkZSA8d2luc29jay5oPgojZW5kaWYKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGlmZGVmIFdJTjMyCiMgIGluY2x1ZGUgPHN5cy90aW1lYi5oPgojIGVsc2UKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbmRpZgojIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyBpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHRpbWUuaD4KIyBlbmRpZgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYWdlbnRfY2FsbGJhY2tzLmg+CgojaW5jbHVkZSAic25tcGQuaCIKI2luY2x1ZGUgIm1pYmdyb3VwL3N0cnVjdC5oIgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvb2xkX2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbnVsbC5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvdGFibGUuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L3RhYmxlX2l0ZXJhdG9yLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9hZ2VudF9yZWdpc3RyeS5oPgoKI2lmZGVmIFVTSU5HX0FHRU5UWF9TVUJBR0VOVF9NT0RVTEUKI2luY2x1ZGUgImFnZW50eC9zdWJhZ2VudC5oIgojaW5jbHVkZSAiYWdlbnR4L2NsaWVudC5oIgojZW5kaWYKCi8qIExvb2t1cCBjYWNoZSBjb2RlICovCgojZGVmaW5lIFNVQlRSRUVfREVGQVVMVF9DQUNIRV9TSVpFIDgKI2RlZmluZSBTVUJUUkVFX01BWF9DQUNIRV9TSVpFICAgICAzMgppbnQgbG9va3VwX2NhY2hlX3NpemUgPSAwOyAvKmVuYWJsZWQgbGF0ZXIgYWZ0ZXIgcmVnaXN0cmF0aW9ucyBhcmUgbG9hZGVkICovCgp0eXBlZGVmIHN0cnVjdCBsb29rdXBfY2FjaGVfcyB7CiAgIG5ldHNubXBfc3VidHJlZSAqbmV4dDsKICAgbmV0c25tcF9zdWJ0cmVlICpwcmV2aW91czsKfSBsb29rdXBfY2FjaGU7Cgp0eXBlZGVmIHN0cnVjdCBsb29rdXBfY2FjaGVfY29udGV4dF9zIHsKICAgY2hhciAqY29udGV4dDsKICAgc3RydWN0IGxvb2t1cF9jYWNoZV9jb250ZXh0X3MgKm5leHQ7CiAgIGludCB0aGVjYWNoZWNvdW50OwogICBpbnQgY3VycmVudHBvczsKICAgbG9va3VwX2NhY2hlIGNhY2hlW1NVQlRSRUVfTUFYX0NBQ0hFX1NJWkVdOwp9IGxvb2t1cF9jYWNoZV9jb250ZXh0OwoKc3RhdGljIGxvb2t1cF9jYWNoZV9jb250ZXh0ICp0aGVjb250ZXh0Y2FjaGUgPSBOVUxMOwoKLyoqIHNldCB0aGUgbG9va3VwIGNhY2hlIHNpemUgZm9yIG9wdGltaXplZCBhZ2VudCByZWdpc3RyYXRpb24gcGVyZm9ybWFuY2UuCiAqIEBwYXJhbSBuZXdzaXplIHNldCB0byB0aGUgbWF4aW11bSBzaXplIG9mIGEgY2FjaGUgZm9yIGEgZ2l2ZW4KICogY29udGV4dC4gIFNldCB0byAwIHRvIGNvbXBsZXRlbHkgZGlzYWJsZSBjYWNoaW5nLCBvciB0byAtMSB0byBzZXQKICogdG8gdGhlIGRlZmF1bHQgY2FjaGUgc2l6ZSAoOCksIG9yIHRvIGEgbnVtYmVyIG9mIHlvdXIgY2hvc2luZy4gIFRoZQogKiByb3VnaCBndWlkZSBpcyB0aGF0IGl0IHNob3VsZCBiZSBlcXVhbCB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YKICogc2ltdWx0YW5pb3VzIG1hbmFnZXJzIHlvdSBleHBlY3QgdG8gdGFsayB0byB0aGUgYWdlbnQgKE0pIHRpbWVzIDgwJQogKiAob3Igc28sIGhlIHNheXMgcmFuZG9tbHkpIHRoZSBhdmVyYWdlIG51bWJlciAoTikgb2YgdmFyYmluZHMgeW91CiAqIGV4cGVjdCB0byByZWNlaXZlIGluIGEgZ2l2ZW4gcmVxdWVzdCBmb3IgYSBtYW5hZ2VyLiAgaWUsIE0gdGltZXMgTi4KICogQmlnZ2VyIGRvZXMgTk9UIG5lY2Vzc2FyaWx5IG1lYW4gYmV0dGVyLiAgQ2VydGFpbmx5IDE2IHNob3VsZCBiZSBhbgogKiB1cHBlciBsaW1pdC4gIDMyIGlzIHRoZSBoYXJkIGNvZGVkIGxpbWl0LgogKi8Kdm9pZApuZXRzbm1wX3NldF9sb29rdXBfY2FjaGVfc2l6ZShpbnQgbmV3c2l6ZSkgewogICAgaWYgKG5ld3NpemUgPCAwKQogICAgICAgIGxvb2t1cF9jYWNoZV9zaXplID0gU1VCVFJFRV9ERUZBVUxUX0NBQ0hFX1NJWkU7CiAgICBlbHNlIGlmIChuZXdzaXplIDwgU1VCVFJFRV9NQVhfQ0FDSEVfU0laRSkKICAgICAgICBsb29rdXBfY2FjaGVfc2l6ZSA9IG5ld3NpemU7CiAgICBlbHNlCiAgICAgICAgbG9va3VwX2NhY2hlX3NpemUgPSBTVUJUUkVFX01BWF9DQUNIRV9TSVpFOwp9CgovKiogcmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb29rdXAgY2FjaGUgc2l6ZQogKiAgQHJldHVybiB0aGUgY3VycmVudCBsb29rdXAgY2FjaGUgc2l6ZQogKi8KaW50Cm5ldHNubXBfZ2V0X2xvb2t1cF9jYWNoZV9zaXplKHZvaWQpIHsKICAgIHJldHVybiBsb29rdXBfY2FjaGVfc2l6ZTsKfQoKTkVUU05NUF9TVEFUSUNfSU5MSU5FIGxvb2t1cF9jYWNoZV9jb250ZXh0ICoKZ2V0X2NvbnRleHRfbG9va3VwX2NhY2hlKGNvbnN0IGNoYXIgKmNvbnRleHQpIHsKICAgIGxvb2t1cF9jYWNoZV9jb250ZXh0ICpwdHI7CiAgICBpZiAoIWNvbnRleHQpCiAgICAgICAgY29udGV4dCA9ICIiOwoKICAgIGZvcihwdHIgPSB0aGVjb250ZXh0Y2FjaGU7IHB0cjsgcHRyID0gcHRyLT5uZXh0KSB7CiAgICAgICAgaWYgKHN0cmNtcChwdHItPmNvbnRleHQsIGNvbnRleHQpID09IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKCFwdHIpIHsKICAgICAgICBpZiAobmV0c25tcF9zdWJ0cmVlX2ZpbmRfZmlyc3QoY29udGV4dCkpIHsKICAgICAgICAgICAgcHRyID0gU05NUF9NQUxMT0NfVFlQRURFRihsb29rdXBfY2FjaGVfY29udGV4dCk7CiAgICAgICAgICAgIHB0ci0+bmV4dCA9IHRoZWNvbnRleHRjYWNoZTsKICAgICAgICAgICAgcHRyLT5jb250ZXh0ID0gc3RyZHVwKGNvbnRleHQpOwogICAgICAgICAgICB0aGVjb250ZXh0Y2FjaGUgPSBwdHI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHB0cjsKfQoKTkVUU05NUF9TVEFUSUNfSU5MSU5FIHZvaWQKbG9va3VwX2NhY2hlX2FkZChjb25zdCBjaGFyICpjb250ZXh0LAogICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZSAqbmV4dCwgbmV0c25tcF9zdWJ0cmVlICpwcmV2aW91cykgewogICAgbG9va3VwX2NhY2hlX2NvbnRleHQgKmNwdHI7CgogICAgaWYgKChjcHRyID0gZ2V0X2NvbnRleHRfbG9va3VwX2NhY2hlKGNvbnRleHQpKSA9PSBOVUxMKQogICAgICAgIHJldHVybjsKCiAgICBpZiAoY3B0ci0+dGhlY2FjaGVjb3VudCA8IGxvb2t1cF9jYWNoZV9zaXplKQogICAgICAgIGNwdHItPnRoZWNhY2hlY291bnQrKzsKCiAgICBjcHRyLT5jYWNoZVtjcHRyLT5jdXJyZW50cG9zXS5uZXh0ID0gbmV4dDsKICAgIGNwdHItPmNhY2hlW2NwdHItPmN1cnJlbnRwb3NdLnByZXZpb3VzID0gcHJldmlvdXM7CgogICAgaWYgKCsrY3B0ci0+Y3VycmVudHBvcyA+PSBsb29rdXBfY2FjaGVfc2l6ZSkKICAgICAgICBjcHRyLT5jdXJyZW50cG9zID0gMDsKfQoKTkVUU05NUF9TVEFUSUNfSU5MSU5FIHZvaWQKbG9va3VwX2NhY2hlX3JlcGxhY2UobG9va3VwX2NhY2hlICpwdHIsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZSAqbmV4dCwgbmV0c25tcF9zdWJ0cmVlICpwcmV2aW91cykgewoKICAgIHB0ci0+bmV4dCA9IG5leHQ7CiAgICBwdHItPnByZXZpb3VzID0gcHJldmlvdXM7Cn0KCk5FVFNOTVBfU1RBVElDX0lOTElORSBsb29rdXBfY2FjaGUgKgpsb29rdXBfY2FjaGVfZmluZChjb25zdCBjaGFyICpjb250ZXh0LCBvaWQgKm5hbWUsIHNpemVfdCBuYW1lX2xlbiwKICAgICAgICAgICAgICAgICAgaW50ICpyZXRjbXApIHsKICAgIGxvb2t1cF9jYWNoZV9jb250ZXh0ICpjcHRyOwogICAgbG9va3VwX2NhY2hlICpyZXQgPSBOVUxMOwogICAgaW50IGNtcDsKICAgIGludCBpOwoKICAgIGlmICgoY3B0ciA9IGdldF9jb250ZXh0X2xvb2t1cF9jYWNoZShjb250ZXh0KSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBmb3IoaSA9IDA7IGkgPCBjcHRyLT50aGVjYWNoZWNvdW50ICYmIGkgPCBsb29rdXBfY2FjaGVfc2l6ZTsgaSsrKSB7CiAgICAgICAgaWYgKGNwdHItPmNhY2hlW2ldLnByZXZpb3VzLT5zdGFydF9hKQogICAgICAgICAgICBjbXAgPSBzbm1wX29pZF9jb21wYXJlKG5hbWUsIG5hbWVfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdHItPmNhY2hlW2ldLnByZXZpb3VzLT5zdGFydF9hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdHItPmNhY2hlW2ldLnByZXZpb3VzLT5zdGFydF9sZW4pOwogICAgICAgIGVsc2UKICAgICAgICAgICAgY21wID0gMTsKICAgICAgICBpZiAoY21wID49IDApIHsKICAgICAgICAgICAgKnJldGNtcCA9IGNtcDsKICAgICAgICAgICAgcmV0ID0gJihjcHRyLT5jYWNoZVtpXSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJldDsKfQoKTkVUU05NUF9TVEFUSUNfSU5MSU5FIHZvaWQKaW52YWxpZGF0ZV9sb29rdXBfY2FjaGUoY29uc3QgY2hhciAqY29udGV4dCkgewogICAgbG9va3VwX2NhY2hlX2NvbnRleHQgKmNwdHI7CiAgICBpZiAoKGNwdHIgPSBnZXRfY29udGV4dF9sb29rdXBfY2FjaGUoY29udGV4dCkpICE9IE5VTEwpIHsKICAgICAgICBjcHRyLT50aGVjYWNoZWNvdW50ID0gMDsKICAgICAgICBjcHRyLT5jdXJyZW50cG9zID0gMDsKICAgIH0KfQoKLyogRW5kIG9mIExvb2t1cCBjYWNoZSBjb2RlICovCgpzdGF0aWMgdm9pZCByZWdpc3Rlcl9taWJfZGV0YWNoX25vZGUobmV0c25tcF9zdWJ0cmVlICpzKTsKc3VidHJlZV9jb250ZXh0X2NhY2hlICpjb250ZXh0X3N1YnRyZWVzID0gTlVMTDsKCnZvaWQKbmV0c25tcF9zdWJ0cmVlX2ZyZWUobmV0c25tcF9zdWJ0cmVlICphKQp7CiAgaWYgKGEgIT0gTlVMTCkgewogICAgaWYgKGEtPnZhcmlhYmxlcyAhPSBOVUxMICYmIG5ldHNubXBfb2lkX2VxdWFscyhhLT5uYW1lX2EsIGEtPm5hbWVsZW4sIAoJCQkJCSAgICAgYS0+c3RhcnRfYSwgYS0+c3RhcnRfbGVuKSA9PSAwKSB7CiAgICAgIFNOTVBfRlJFRShhLT52YXJpYWJsZXMpOwogICAgfQogICAgU05NUF9GUkVFKGEtPm5hbWVfYSk7CiAgICBhLT5uYW1lbGVuID0gMDsKICAgIFNOTVBfRlJFRShhLT5zdGFydF9hKTsKICAgIGEtPnN0YXJ0X2xlbiA9IDA7CiAgICBTTk1QX0ZSRUUoYS0+ZW5kX2EpOwogICAgYS0+ZW5kX2xlbiA9IDA7CiAgICBTTk1QX0ZSRUUoYS0+bGFiZWxfYSk7CiAgICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uX2ZyZWUoYS0+cmVnaW5mbyk7CiAgICBhLT5yZWdpbmZvID0gTlVMTDsKICAgIFNOTVBfRlJFRShhKTsKICB9Cn0KCm5ldHNubXBfc3VidHJlZSAqCm5ldHNubXBfc3VidHJlZV9kZWVwY29weShuZXRzbm1wX3N1YnRyZWUgKmEpCnsKICBuZXRzbm1wX3N1YnRyZWUgKmIgPSAobmV0c25tcF9zdWJ0cmVlICopY2FsbG9jKDEsIHNpemVvZihuZXRzbm1wX3N1YnRyZWUpKTsKCiAgaWYgKGIgIT0gTlVMTCkgewogICAgbWVtY3B5KGIsIGEsIHNpemVvZihuZXRzbm1wX3N1YnRyZWUpKTsKICAgIGItPm5hbWVfYSAgPSBzbm1wX2R1cGxpY2F0ZV9vYmppZChhLT5uYW1lX2EsICBhLT5uYW1lbGVuKTsKICAgIGItPnN0YXJ0X2EgPSBzbm1wX2R1cGxpY2F0ZV9vYmppZChhLT5zdGFydF9hLCBhLT5zdGFydF9sZW4pOwogICAgYi0+ZW5kX2EgICA9IHNubXBfZHVwbGljYXRlX29iamlkKGEtPmVuZF9hLCAgIGEtPmVuZF9sZW4pOwogICAgYi0+bGFiZWxfYSA9IHN0cmR1cChhLT5sYWJlbF9hKTsKICAgIAogICAgaWYgKGItPm5hbWVfYSA9PSBOVUxMIHx8IGItPnN0YXJ0X2EgPT0gTlVMTCB8fCAKCWItPmVuZF9hICA9PSBOVUxMIHx8IGItPmxhYmVsX2EgPT0gTlVMTCkgewogICAgICBuZXRzbm1wX3N1YnRyZWVfZnJlZShiKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKGEtPnZhcmlhYmxlcyAhPSBOVUxMKSB7CiAgICAgIGItPnZhcmlhYmxlcyA9IChzdHJ1Y3QgdmFyaWFibGUgKiltYWxsb2MoYS0+dmFyaWFibGVzX2xlbiAqIAoJCQkJCSAgICAgICBhLT52YXJpYWJsZXNfd2lkdGgpOwogICAgICBpZiAoYi0+dmFyaWFibGVzICE9IE5VTEwpIHsKCW1lbWNweShiLT52YXJpYWJsZXMsIGEtPnZhcmlhYmxlcyxhLT52YXJpYWJsZXNfbGVuKmEtPnZhcmlhYmxlc193aWR0aCk7CiAgICAgIH0gZWxzZSB7CgluZXRzbm1wX3N1YnRyZWVfZnJlZShiKTsKCXJldHVybiBOVUxMOwogICAgICB9CiAgICB9CgogICAgaWYgKGEtPnJlZ2luZm8gIT0gTlVMTCkgewogICAgICBiLT5yZWdpbmZvID0gbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbl9kdXAoYS0+cmVnaW5mbyk7CiAgICAgIGlmIChiLT5yZWdpbmZvID09IE5VTEwpIHsKCW5ldHNubXBfc3VidHJlZV9mcmVlKGIpOwoJcmV0dXJuIE5VTEw7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGI7Cn0KCnN1YnRyZWVfY29udGV4dF9jYWNoZSAqCmdldF90b3BfY29udGV4dF9jYWNoZSh2b2lkKQp7CiAgICByZXR1cm4gY29udGV4dF9zdWJ0cmVlczsKfQoKbmV0c25tcF9zdWJ0cmVlICoKbmV0c25tcF9zdWJ0cmVlX2ZpbmRfZmlyc3QoY29uc3QgY2hhciAqY29udGV4dF9uYW1lKQp7CiAgICBzdWJ0cmVlX2NvbnRleHRfY2FjaGUgKnB0cjsKCiAgICBpZiAoIWNvbnRleHRfbmFtZSkgewogICAgICAgIGNvbnRleHRfbmFtZSA9ICIiOwogICAgfQoKICAgIERFQlVHTVNHVEwoKCJzdWJ0cmVlIiwgImxvb2tpbmcgZm9yIHN1YnRyZWUgZm9yIGNvbnRleHQ6IFwiJXNcIlxuIiwgCgkJY29udGV4dF9uYW1lKSk7CiAgICBmb3IgKHB0ciA9IGNvbnRleHRfc3VidHJlZXM7IHB0ciAhPSBOVUxMOyBwdHIgPSBwdHItPm5leHQpIHsKICAgICAgICBpZiAocHRyLT5jb250ZXh0X25hbWUgIT0gTlVMTCAmJiAKCSAgICBzdHJjbXAocHRyLT5jb250ZXh0X25hbWUsIGNvbnRleHRfbmFtZSkgPT0gMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgic3VidHJlZSIsICJmb3VuZCBvbmUgZm9yOiBcIiVzXCJcbiIsIGNvbnRleHRfbmFtZSkpOwogICAgICAgICAgICByZXR1cm4gcHRyLT5maXJzdF9zdWJ0cmVlOwogICAgICAgIH0KICAgIH0KICAgIERFQlVHTVNHVEwoKCJzdWJ0cmVlIiwgImRpZG4ndCBmaW5kIGEgc3VidHJlZSBmb3IgY29udGV4dDogXCIlc1wiXG4iLCAKCQljb250ZXh0X25hbWUpKTsKICAgIHJldHVybiBOVUxMOwp9CgpuZXRzbm1wX3N1YnRyZWUgKgphZGRfc3VidHJlZShuZXRzbm1wX3N1YnRyZWUgKm5ld190cmVlLCBjb25zdCBjaGFyICpjb250ZXh0X25hbWUpCnsKICAgIHN1YnRyZWVfY29udGV4dF9jYWNoZSAqcHRyID0gU05NUF9NQUxMT0NfVFlQRURFRihzdWJ0cmVlX2NvbnRleHRfY2FjaGUpOwogICAgCiAgICBpZiAoIWNvbnRleHRfbmFtZSkgewogICAgICAgIGNvbnRleHRfbmFtZSA9ICIiOwogICAgfQoKICAgIGlmICghcHRyKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICAKICAgIERFQlVHTVNHVEwoKCJzdWJ0cmVlIiwgImFkZGluZyBzdWJ0cmVlIGZvciBjb250ZXh0OiBcIiVzXCJcbiIsCQoJCWNvbnRleHRfbmFtZSkpOwoKICAgIHB0ci0+bmV4dCA9IGNvbnRleHRfc3VidHJlZXM7CiAgICBwdHItPmZpcnN0X3N1YnRyZWUgPSBuZXdfdHJlZTsKICAgIHB0ci0+Y29udGV4dF9uYW1lID0gc3RyZHVwKGNvbnRleHRfbmFtZSk7CiAgICBjb250ZXh0X3N1YnRyZWVzID0gcHRyOwoKICAgIHJldHVybiBwdHItPmZpcnN0X3N1YnRyZWU7Cn0KCm5ldHNubXBfc3VidHJlZSAqCm5ldHNubXBfc3VidHJlZV9yZXBsYWNlX2ZpcnN0KG5ldHNubXBfc3VidHJlZSAqbmV3X3RyZWUsIAoJCQkgICAgICBjb25zdCBjaGFyICpjb250ZXh0X25hbWUpCnsKICAgIHN1YnRyZWVfY29udGV4dF9jYWNoZSAqcHRyOwogICAgaWYgKCFjb250ZXh0X25hbWUpIHsKICAgICAgICBjb250ZXh0X25hbWUgPSAiIjsKICAgIH0KICAgIGZvciAocHRyID0gY29udGV4dF9zdWJ0cmVlczsgcHRyICE9IE5VTEw7IHB0ciA9IHB0ci0+bmV4dCkgewogICAgICAgIGlmIChwdHItPmNvbnRleHRfbmFtZSAhPSBOVUxMICYmCgkgICAgc3RyY21wKHB0ci0+Y29udGV4dF9uYW1lLCBjb250ZXh0X25hbWUpID09IDApIHsKICAgICAgICAgICAgcHRyLT5maXJzdF9zdWJ0cmVlID0gbmV3X3RyZWU7CiAgICAgICAgICAgIHJldHVybiBwdHItPmZpcnN0X3N1YnRyZWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGFkZF9zdWJ0cmVlKG5ld190cmVlLCBjb250ZXh0X25hbWUpOwp9CgpORVRTTk1QX0lOTElORSB2b2lkCm5ldHNubXBfc3VidHJlZV9jaGFuZ2VfbmV4dChuZXRzbm1wX3N1YnRyZWUgKnB0ciwgbmV0c25tcF9zdWJ0cmVlICp0aGVuZXh0KQp7CiAgICBwdHItPm5leHQgPSB0aGVuZXh0OwogICAgaWYgKHRoZW5leHQpCiAgICAgICAgbmV0c25tcF9vaWRfY29tcGFyZV9sbChwdHItPnN0YXJ0X2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHItPnN0YXJ0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW5leHQtPnN0YXJ0X2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuZXh0LT5zdGFydF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlbmV4dC0+b2lkX29mZik7Cn0KCk5FVFNOTVBfSU5MSU5FIHZvaWQKbmV0c25tcF9zdWJ0cmVlX2NoYW5nZV9wcmV2KG5ldHNubXBfc3VidHJlZSAqcHRyLCBuZXRzbm1wX3N1YnRyZWUgKnRoZXByZXYpCnsKICAgIHB0ci0+cHJldiA9IHRoZXByZXY7CiAgICBpZiAodGhlcHJldikKICAgICAgICBuZXRzbm1wX29pZF9jb21wYXJlX2xsKHRoZXByZXYtPnN0YXJ0X2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVwcmV2LT5zdGFydF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHItPnN0YXJ0X2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHItPnN0YXJ0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdHItPm9pZF9vZmYpOwp9CgppbnQKbmV0c25tcF9zdWJ0cmVlX2NvbXBhcmUoY29uc3QgbmV0c25tcF9zdWJ0cmVlICphcCwgY29uc3QgbmV0c25tcF9zdWJ0cmVlICpicCkKewogICAgcmV0dXJuIHNubXBfb2lkX2NvbXBhcmUoYXAtPm5hbWVfYSwgYXAtPm5hbWVsZW4sIGJwLT5uYW1lX2EsIGJwLT5uYW1lbGVuKTsKfQoKdm9pZApuZXRzbm1wX3N1YnRyZWVfam9pbihuZXRzbm1wX3N1YnRyZWUgKnJvb3QpCnsKICAgIG5ldHNubXBfc3VidHJlZSAqcywgKnRtcCwgKmMsICpkOwoKICAgIHdoaWxlIChyb290ICE9IE5VTEwpIHsKICAgICAgICBzID0gcm9vdC0+bmV4dDsKICAgICAgICB3aGlsZSAocyAhPSBOVUxMICYmIHJvb3QtPnJlZ2luZm8gPT0gcy0+cmVnaW5mbykgewogICAgICAgICAgICB0bXAgPSBzLT5uZXh0OwogICAgICAgICAgICBERUJVR01TR1RMKCgic3VidHJlZSIsICJyb290IHN0YXJ0ICIpKTsKICAgICAgICAgICAgREVCVUdNU0dPSUQoKCJzdWJ0cmVlIiwgcm9vdC0+c3RhcnRfYSwgcm9vdC0+c3RhcnRfbGVuKSk7CiAgICAgICAgICAgIERFQlVHTVNHKCgic3VidHJlZSIsICIgKG9yaWdpbmFsIGVuZCAiKSk7CiAgICAgICAgICAgIERFQlVHTVNHT0lEKCgic3VidHJlZSIsIHJvb3QtPmVuZF9hLCByb290LT5lbmRfbGVuKSk7CiAgICAgICAgICAgIERFQlVHTVNHKCgic3VidHJlZSIsICIpXG4iKSk7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJzdWJ0cmVlIiwgIiAgSk9JTklORyB0byAiKSk7CiAgICAgICAgICAgIERFQlVHTVNHT0lEKCgic3VidHJlZSIsIHMtPnN0YXJ0X2EsIHMtPnN0YXJ0X2xlbikpOwoKCSAgICBTTk1QX0ZSRUUocm9vdC0+ZW5kX2EpOwoJICAgIHJvb3QtPmVuZF9hICAgPSBzLT5lbmRfYTsKICAgICAgICAgICAgcm9vdC0+ZW5kX2xlbiA9IHMtPmVuZF9sZW47CgkgICAgcy0+ZW5kX2EgICAgICA9IE5VTEw7CgogICAgICAgICAgICBmb3IgKGMgPSByb290OyBjICE9IE5VTEw7IGMgPSBjLT5jaGlsZHJlbikgewogICAgICAgICAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2NoYW5nZV9uZXh0KGMsIHMtPm5leHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoYyA9IHM7IGMgIT0gTlVMTDsgYyA9IGMtPmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX3ByZXYoYywgcm9vdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgREVCVUdNU0coKCJzdWJ0cmVlIiwgIiBzbyBuZXcgZW5kICIpKTsKICAgICAgICAgICAgREVCVUdNU0dPSUQoKCJzdWJ0cmVlIiwgcm9vdC0+ZW5kX2EsIHJvb3QtPmVuZF9sZW4pKTsKICAgICAgICAgICAgREVCVUdNU0coKCJzdWJ0cmVlIiwgIlxuIikpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBQcm9iYWJseSBuZWVkIHRvIGZyZWUgY2hpbGRyZW4gdG9vPyAgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmb3IgKGMgPSBzLT5jaGlsZHJlbjsgYyAhPSBOVUxMOyBjID0gZCkgewogICAgICAgICAgICAgICAgZCA9IGMtPmNoaWxkcmVuOwogICAgICAgICAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2ZyZWUoYyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2ZyZWUocyk7CiAgICAgICAgICAgIHMgPSB0bXA7CiAgICAgICAgfQogICAgICAgIHJvb3QgPSByb290LT5uZXh0OwogICAgfQp9CgoKICAgICAgICAvKgogICAgICAgICAqICBTcGxpdCB0aGUgc3VidHJlZSBpbnRvIHR3byBhdCB0aGUgc3BlY2lmaWVkIHBvaW50LAogICAgICAgICAqICAgIHJldHVybmluZyB0aGUgbmV3IChzZWNvbmQpIHN1YnRyZWUKICAgICAgICAgKi8KbmV0c25tcF9zdWJ0cmVlICoKbmV0c25tcF9zdWJ0cmVlX3NwbGl0KG5ldHNubXBfc3VidHJlZSAqY3VycmVudCwgb2lkIG5hbWVbXSwgaW50IG5hbWVfbGVuKQp7CiAgICBzdHJ1Y3QgdmFyaWFibGUgKnZwID0gTlVMTDsKICAgIG5ldHNubXBfc3VidHJlZSAqbmV3X3N1YiwgKnB0cjsKICAgIGludCBpID0gMCwgcmMgPSAwLCByYzIgPSAwOwogICAgc2l6ZV90IGNvbW1vbl9sZW4gPSAwOwogICAgY2hhciAqY3A7CiAgICBvaWQgKnRtcF9hLCAqdG1wX2I7CgogICAgaWYgKHNubXBfb2lkX2NvbXBhcmUobmFtZSwgbmFtZV9sZW4sIGN1cnJlbnQtPmVuZF9hLCBjdXJyZW50LT5lbmRfbGVuKT4wKSB7CgkvKiBTcGxpdCBjb21lcyBhZnRlciB0aGUgZW5kIG9mIHRoaXMgc3VidHJlZSAqLwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIG5ld19zdWIgPSBuZXRzbm1wX3N1YnRyZWVfZGVlcGNvcHkoY3VycmVudCk7CiAgICBpZiAobmV3X3N1YiA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgLyogIFNldCB1cCB0aGUgcG9pbnQgb2YgZGl2aXNpb24uICAqLwogICAgdG1wX2EgPSBzbm1wX2R1cGxpY2F0ZV9vYmppZChuYW1lLCBuYW1lX2xlbik7CiAgICBpZiAodG1wX2EgPT0gTlVMTCkgewoJbmV0c25tcF9zdWJ0cmVlX2ZyZWUobmV3X3N1Yik7CglyZXR1cm4gTlVMTDsKICAgIH0KICAgIHRtcF9iID0gc25tcF9kdXBsaWNhdGVfb2JqaWQobmFtZSwgbmFtZV9sZW4pOwogICAgaWYgKHRtcF9iID09IE5VTEwpIHsKCW5ldHNubXBfc3VidHJlZV9mcmVlKG5ld19zdWIpOwoJU05NUF9GUkVFKHRtcF9hKTsKCXJldHVybiBOVUxMOwogICAgfQoKICAgIFNOTVBfRlJFRShjdXJyZW50LT5lbmRfYSk7CiAgICBjdXJyZW50LT5lbmRfYSA9IHRtcF9hOwogICAgY3VycmVudC0+ZW5kX2xlbiA9IG5hbWVfbGVuOwogICAgaWYgKG5ld19zdWItPnN0YXJ0X2EgIT0gTlVMTCkgewoJU05NUF9GUkVFKG5ld19zdWItPnN0YXJ0X2EpOwogICAgfQogICAgbmV3X3N1Yi0+c3RhcnRfYSA9IHRtcF9iOwogICAgbmV3X3N1Yi0+c3RhcnRfbGVuID0gbmFtZV9sZW47CgogICAgLyogIFNwbGl0IHRoZSB2YXJpYWJsZXMgYmV0d2VlbiB0aGUgdHdvIG5ldyBzdWJ0cmVlcy4gICovCiAgICBpID0gY3VycmVudC0+dmFyaWFibGVzX2xlbjsKICAgIGN1cnJlbnQtPnZhcmlhYmxlc19sZW4gPSAwOwoKICAgIGZvciAodnAgPSBjdXJyZW50LT52YXJpYWJsZXM7IGkgPiAwOyBpLS0pIHsKCS8qICBOb3RlIHRoYXQgdGhlIHZhcmlhYmxlICJuYW1lIiBmaWVsZCBvbWl0cyB0aGUgcHJlZml4IGNvbW1vbiB0byB0aGUKCSAgICB3aG9sZSByZWdpc3RyYXRpb24sIGhlbmNlIHRoZSBzdHJhbmdlIGNvbXBhcmlzb24gaGVyZS4gICovCgoJcmMgPSBzbm1wX29pZF9jb21wYXJlKHZwLT5uYW1lLCB2cC0+bmFtZWxlbiwKCQkJICAgICAgbmFtZSAgICAgKyBjdXJyZW50LT5uYW1lbGVuLCAKCQkJICAgICAgbmFtZV9sZW4gLSBjdXJyZW50LT5uYW1lbGVuKTsKCiAgICAgICAgaWYgKG5hbWVfbGVuIC0gY3VycmVudC0+bmFtZWxlbiA+IHZwLT5uYW1lbGVuKSB7CiAgICAgICAgICAgIGNvbW1vbl9sZW4gPSB2cC0+bmFtZWxlbjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb21tb25fbGVuID0gbmFtZV9sZW4gLSBjdXJyZW50LT5uYW1lbGVuOwogICAgICAgIH0KCiAgICAgICAgcmMyID0gc25tcF9vaWRfY29tcGFyZSh2cC0+bmFtZSwgY29tbW9uX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgKyBjdXJyZW50LT5uYW1lbGVuLCBjb21tb25fbGVuKTsKCiAgICAgICAgaWYgKHJjID49IDApIHsKICAgICAgICAgICAgYnJlYWs7ICAvKiBBbGwgZm9sbG93aW5nIHZhcmlhYmxlcyBiZWxvbmcgdG8gdGhlIHNlY29uZCBzdWJ0cmVlICovCgl9CgogICAgICAgIGN1cnJlbnQtPnZhcmlhYmxlc19sZW4rKzsKICAgICAgICBpZiAocmMyIDwgMCkgewogICAgICAgICAgICBuZXdfc3ViLT52YXJpYWJsZXNfbGVuLS07CiAgICAgICAgICAgIGNwID0gKGNoYXIgKikgbmV3X3N1Yi0+dmFyaWFibGVzOwogICAgICAgICAgICBuZXdfc3ViLT52YXJpYWJsZXMgPSAoc3RydWN0IHZhcmlhYmxlICopKGNwICsgCgkJCQkJCSAgICAgbmV3X3N1Yi0+dmFyaWFibGVzX3dpZHRoKTsKICAgICAgICB9CiAgICAgICAgdnAgPSAoc3RydWN0IHZhcmlhYmxlICopICgoY2hhciAqKSB2cCArIGN1cnJlbnQtPnZhcmlhYmxlc193aWR0aCk7CiAgICB9CgogICAgLyogRGVsZWdhdGVkIHRyZWVzIHNob3VsZCByZXRhaW4gdGhlaXIgdmFyaWFibGVzIHJlZ2FyZGxlc3MgKi8KICAgIGlmIChjdXJyZW50LT52YXJpYWJsZXNfbGVuID4gMCAmJgogICAgICAgIElTX0RFTEVHQVRFRCgodV9jaGFyKSBjdXJyZW50LT52YXJpYWJsZXNbMF0udHlwZSkpIHsKICAgICAgICBuZXdfc3ViLT52YXJpYWJsZXNfbGVuID0gMTsKICAgICAgICBuZXdfc3ViLT52YXJpYWJsZXMgPSBjdXJyZW50LT52YXJpYWJsZXM7CiAgICB9CgogICAgLyogUHJvcG9nYXRlIHRoaXMgc3BsaXQgZG93biB0aHJvdWdoIGFueSBjaGlsZHJlbiAqLwogICAgaWYgKGN1cnJlbnQtPmNoaWxkcmVuKSB7CiAgICAgICAgbmV3X3N1Yi0+Y2hpbGRyZW4gPSBuZXRzbm1wX3N1YnRyZWVfc3BsaXQoY3VycmVudC0+Y2hpbGRyZW4sIAoJCQkJCQkgIG5hbWUsIG5hbWVfbGVuKTsKICAgIH0KCiAgICAvKiBSZXRhaW4gdGhlIGNvcnJlY3QgbGlua2luZyBvZiB0aGUgbGlzdCAqLwogICAgZm9yIChwdHIgPSBjdXJyZW50OyBwdHIgIT0gTlVMTDsgcHRyID0gcHRyLT5jaGlsZHJlbikgewogICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfbmV4dChwdHIsIG5ld19zdWIpOwogICAgfQogICAgZm9yIChwdHIgPSBuZXdfc3ViOyBwdHIgIT0gTlVMTDsgcHRyID0gcHRyLT5jaGlsZHJlbikgewogICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfcHJldihwdHIsIGN1cnJlbnQpOwogICAgfQogICAgZm9yIChwdHIgPSBuZXdfc3ViLT5uZXh0OyBwdHIgIT0gTlVMTDsgcHRyPXB0ci0+Y2hpbGRyZW4pIHsKICAgICAgICBuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX3ByZXYocHRyLCBuZXdfc3ViKTsKICAgIH0KCiAgICByZXR1cm4gbmV3X3N1YjsKfQoKaW50Cm5ldHNubXBfc3VidHJlZV9sb2FkKG5ldHNubXBfc3VidHJlZSAqbmV3X3N1YiwgY29uc3QgY2hhciAqY29udGV4dF9uYW1lKQp7CiAgICBuZXRzbm1wX3N1YnRyZWUgKnRyZWUxLCAqdHJlZTIsICpuZXcyOwogICAgbmV0c25tcF9zdWJ0cmVlICpwcmV2LCAqbmV4dDsKICAgIGludCAgICAgICAgICAgICByZXMsIHJjID0gMDsKCiAgICBpZiAobmV3X3N1YiA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIE1JQl9SRUdJU1RFUkVEX09LOyAgICAgICAvKiBEZWdlbmVyYXRlIGNhc2UgKi8KICAgIH0KCiAgICBpZiAoIW5ldHNubXBfc3VidHJlZV9maW5kX2ZpcnN0KGNvbnRleHRfbmFtZSkpIHsKICAgICAgICBzdGF0aWMgaW50IGlubG9vcCA9IDA7CiAgICAgICAgaWYgKCFpbmxvb3ApIHsKICAgICAgICAgICAgb2lkIGNjaXR0WzFdICAgICAgICAgICA9IHsgMCB9OwogICAgICAgICAgICBvaWQgaXNvWzFdICAgICAgICAgICAgID0geyAxIH07CiAgICAgICAgICAgIG9pZCBqb2ludF9jY2l0dF9pc29bMV0gPSB7IDIgfTsKICAgICAgICAgICAgaW5sb29wID0gMTsKICAgICAgICAgICAgbmV0c25tcF9yZWdpc3Rlcl9udWxsX2NvbnRleHQoc25tcF9kdXBsaWNhdGVfb2JqaWQoY2NpdHQsIDEpLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X25hbWUpOwogICAgICAgICAgICBuZXRzbm1wX3JlZ2lzdGVyX251bGxfY29udGV4dChzbm1wX2R1cGxpY2F0ZV9vYmppZChpc28sIDEpLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X25hbWUpOwogICAgICAgICAgICBuZXRzbm1wX3JlZ2lzdGVyX251bGxfY29udGV4dChzbm1wX2R1cGxpY2F0ZV9vYmppZChqb2ludF9jY2l0dF9pc28sIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBjb250ZXh0X25hbWUpOwogICAgICAgICAgICBpbmxvb3AgPSAwOwogICAgICAgIH0KICAgIH0KCiAgICAvKiAgRmluZCB0aGUgc3VidHJlZSB0aGF0IGNvbnRhaW5zIHRoZSBzdGFydCBvZiB0aGUgbmV3IHN1YnRyZWUgKGlmCglhbnkpLi4uKi8KCiAgICB0cmVlMSA9IG5ldHNubXBfc3VidHJlZV9maW5kKG5ld19zdWItPnN0YXJ0X2EsIG5ld19zdWItPnN0YXJ0X2xlbiwgCgkJCQkgTlVMTCwgY29udGV4dF9uYW1lKTsKCiAgICAvKiAgLi4uIGFuZCB0aGUgc3VidHJlZSB0aGF0IGZvbGxvd3MgdGhlIG5ldyBvbmUgKE5VTEwgaW1wbGllcyB0aGlzIGlzIHRoZQoJZmluYWwgcmVnaW9uIGNvdmVyZWQpLiAgKi8KCiAgICBpZiAodHJlZTEgPT0gTlVMTCkgewoJdHJlZTIgPSBuZXRzbm1wX3N1YnRyZWVfZmluZF9uZXh0KG5ld19zdWItPnN0YXJ0X2EsIG5ld19zdWItPnN0YXJ0X2xlbiwKCQkJCQkgIE5VTEwsIGNvbnRleHRfbmFtZSk7CiAgICB9IGVsc2UgewoJdHJlZTIgPSB0cmVlMS0+bmV4dDsKICAgIH0KCiAgICAvKiAgSGFuZGxlIG5ldyBzdWJ0cmVlcyB0aGF0IHN0YXJ0IGluIHZpcmdpbiB0ZXJyaXRvcnkuICAqLwoKICAgIGlmICh0cmVlMSA9PSBOVUxMKSB7CgluZXcyID0gTlVMTDsKCS8qICBJcyB0aGVyZSBhbnkgb3ZlcmxhcCB3aXRoIGxhdGVyIHN1YnRyZWVzPyAgKi8KCWlmICh0cmVlMiAmJiBzbm1wX29pZF9jb21wYXJlKG5ld19zdWItPmVuZF9hLCBuZXdfc3ViLT5lbmRfbGVuLAoJCQkJICAgICAgdHJlZTItPnN0YXJ0X2EsIHRyZWUyLT5zdGFydF9sZW4pID4gMCkgewoJICAgIG5ldzIgPSBuZXRzbm1wX3N1YnRyZWVfc3BsaXQobmV3X3N1YiwgCgkJCQkJIHRyZWUyLT5zdGFydF9hLCB0cmVlMi0+c3RhcnRfbGVuKTsKCX0KCgkvKiAgTGluayB0aGUgbmV3IHN1YnRyZWUgKGxlc3MgYW55IG92ZXJsYXBwaW5nIHJlZ2lvbikgd2l0aCB0aGUgbGlzdCBvZgoJICAgIGV4aXN0aW5nIHJlZ2lzdHJhdGlvbnMuICAqLwoKCWlmICh0cmVlMikgewogICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX3ByZXYobmV3X3N1YiwgdHJlZTItPnByZXYpOwogICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX3ByZXYodHJlZTIsIG5ld19zdWIpOwoJfSBlbHNlIHsKICAgICAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2NoYW5nZV9wcmV2KG5ld19zdWIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfZmluZF9wcmV2KG5ld19zdWItPnN0YXJ0X2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zdWItPnN0YXJ0X2xlbiwgTlVMTCwgY29udGV4dF9uYW1lKSk7CgoJICAgIGlmIChuZXdfc3ViLT5wcmV2KSB7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX25leHQobmV3X3N1Yi0+cHJldiwgbmV3X3N1Yik7CgkgICAgfSBlbHNlIHsKCQluZXRzbm1wX3N1YnRyZWVfcmVwbGFjZV9maXJzdChuZXdfc3ViLCBjb250ZXh0X25hbWUpOwoJICAgIH0KCiAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfbmV4dChuZXdfc3ViLCB0cmVlMik7CgoJICAgIC8qIElmIHRoZXJlIHdhcyBhbnkgb3ZlcmxhcCwgcmVjdXJzZSB0byBtZXJnZSBpbiB0aGUgb3ZlcmxhcHBpbmcKCSAgICAgICByZWdpb24gKGluY2x1ZGluZyBhbnl0aGluZyB0aGF0IG1heSBmb2xsb3cgdGhlIG92ZXJsYXApLiAgKi8KCSAgICBpZiAobmV3MikgewoJCXJldHVybiBuZXRzbm1wX3N1YnRyZWVfbG9hZChuZXcyLCBjb250ZXh0X25hbWUpOwoJICAgIH0KCX0KICAgIH0gZWxzZSB7CgkvKiAgSWYgdGhlIG5ldyBzdWJ0cmVlIHN0YXJ0cyAqd2l0aGluKiBhbiBleGlzdGluZyByZWdpc3RyYXRpb24KCSAgICAocmF0aGVyIHRoYW4gYXQgdGhlIHNhbWUgcG9pbnQgYXMgaXQpLCB0aGVuIHNwbGl0IHRoZSBleGlzdGluZwoJICAgIHN1YnRyZWUgYXQgdGhpcyBwb2ludC4gICovCgoJaWYgKG5ldHNubXBfb2lkX2VxdWFscyhuZXdfc3ViLT5zdGFydF9hLCBuZXdfc3ViLT5zdGFydF9sZW4sIAoJCQkgICAgIHRyZWUxLT5zdGFydF9hLCAgIHRyZWUxLT5zdGFydF9sZW4pICE9IDApIHsKCSAgICB0cmVlMSA9IG5ldHNubXBfc3VidHJlZV9zcGxpdCh0cmVlMSwgbmV3X3N1Yi0+c3RhcnRfYSwgCgkJCQkJICBuZXdfc3ViLT5zdGFydF9sZW4pOwoJfQoKICAgICAgICBpZiAodHJlZTEgPT0gTlVMTCkgewogICAgICAgICAgICByZXR1cm4gTUlCX1JFR0lTVFJBVElPTl9GQUlMRUQ7Cgl9CgoJLyogIE5vdyBjb25zaWRlciB0aGUgZW5kIG9mIHRoaXMgZXhpc3Rpbmcgc3VidHJlZToKCSAgICAKCSAgICBJZiBpdCBtYXRjaGVzIHRoZSBuZXcgc3VidHJlZSBwcmVjaXNlbHksCgkgICAgICAgICAgICBzaW1wbHkgbWVyZ2UgdGhlIG5ldyBvbmUgaW50byB0aGUgbGlzdCBvZiBjaGlsZHJlbgoKCSAgICBJZiBpdCBpbmNsdWRlcyB0aGUgd2hvbGUgb2YgdGhlIG5ldyBzdWJ0cmVlLAoJCSAgICBzcGxpdCBpdCBhdCB0aGUgYXBwcm9wcmlhdGUgcG9pbnQsIGFuZCBtZXJnZSBhZ2FpbgogICAgIAoJICAgIElmIHRoZSBuZXcgc3VidHJlZSBleHRlbmRzIGJleW9uZCB0aGlzIGV4aXN0aW5nIHJlZ2lvbiwKCSAgICAgICAgICAgIHNwbGl0IGl0LCBhbmQgcmVjdXJzZSB0byBtZXJnZSB0aGUgdHdvIHBhcnRzLiAgKi8KCglyYyA9IHNubXBfb2lkX2NvbXBhcmUobmV3X3N1Yi0+ZW5kX2EsIG5ld19zdWItPmVuZF9sZW4sIAoJCQkgICAgICB0cmVlMS0+ZW5kX2EsIHRyZWUxLT5lbmRfbGVuKTsKCiAgICAgICAgc3dpdGNoIChyYykgewoKCWNhc2UgLTE6CgkgICAgLyogIEV4aXN0aW5nIHN1YnRyZWUgY29udGFpbnMgbmV3IG9uZS4gICovCgkgICAgbmV0c25tcF9zdWJ0cmVlX3NwbGl0KHRyZWUxLCBuZXdfc3ViLT5lbmRfYSwgbmV3X3N1Yi0+ZW5kX2xlbik7CgkgICAgLyogRmFsbCBUaHJvdWdoICovCgoJY2FzZSAgMDoKCSAgICAvKiAgVGhlIHR3byB0cmVlcyBtYXRjaCBwcmVjaXNlbHkuICAqLwoKCSAgICAvKiAgTm90ZTogVGhpcyBpcyB0aGUgb25seSBwb2ludCB3aGVyZSB0aGUgb3JpZ2luYWwgcmVnaXN0cmF0aW9uCgkgICAgICAgIE9JRCAoIm5hbWUiKSBpcyB1c2VkLiAgKi8KCgkgICAgcHJldiA9IE5VTEw7CgkgICAgbmV4dCA9IHRyZWUxOwoJCgkgICAgd2hpbGUgKG5leHQgJiYgbmV4dC0+bmFtZWxlbiA+IG5ld19zdWItPm5hbWVsZW4pIHsKCQlwcmV2ID0gbmV4dDsKCQluZXh0ID0gbmV4dC0+Y2hpbGRyZW47CgkgICAgfQoKCSAgICB3aGlsZSAobmV4dCAmJiBuZXh0LT5uYW1lbGVuID09IG5ld19zdWItPm5hbWVsZW4gJiYKCQkgICBuZXh0LT5wcmlvcml0eSA8IG5ld19zdWItPnByaW9yaXR5ICkgewoJCXByZXYgPSBuZXh0OwoJCW5leHQgPSBuZXh0LT5jaGlsZHJlbjsKCSAgICB9CgkKCSAgICBpZiAobmV4dCAmJiAobmV4dC0+bmFtZWxlbiAgPT0gbmV3X3N1Yi0+bmFtZWxlbikgJiYKCQkobmV4dC0+cHJpb3JpdHkgPT0gbmV3X3N1Yi0+cHJpb3JpdHkpKSB7CiAgICAgICAgICAgICAgICBpZiAobmV3X3N1Yi0+bmFtZWxlbiAhPSAxKSB7ICAgIC8qIGlnbm9yZSByb290IE9JRCBkdXBzICovCiAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMDsKICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAqYnVmID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYnVmX292ZXJmbG93ID0gMDsKCiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZCgodV9jaGFyICoqKSAmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAmYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3N1Yi0+c3RhcnRfYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zdWItPnN0YXJ0X2xlbik7CiAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVwbGljYXRlIHJlZ2lzdHJhdGlvbjogTUlCIG1vZHVsZXMgJXMgYW5kICVzIChvaWQgJXMlcykuXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQtPmxhYmVsX2EsIG5ld19zdWItPmxhYmVsX2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmID8gYnVmIDogIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX292ZXJmbG93ID8gIiBbVFJVTkNBVEVEXSIgOiAiIik7CiAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOwogICAgICAgICAgICAgICAgfQoJCXJldHVybiBNSUJfRFVQTElDQVRFX1JFR0lTVFJBVElPTjsKCSAgICB9CgoJICAgIGlmIChwcmV2KSB7CgkJcHJldi0+Y2hpbGRyZW4gICAgPSBuZXdfc3ViOwoJCW5ld19zdWItPmNoaWxkcmVuID0gbmV4dDsKICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfcHJldihuZXdfc3ViLCBwcmV2LT5wcmV2KTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfbmV4dChuZXdfc3ViLCBwcmV2LT5uZXh0KTsKCSAgICB9IGVsc2UgewoJCW5ld19zdWItPmNoaWxkcmVuID0gbmV4dDsKICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfcHJldihuZXdfc3ViLCBuZXh0LT5wcmV2KTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfbmV4dChuZXdfc3ViLCBuZXh0LT5uZXh0KTsKCQoJCWZvciAobmV4dCA9IG5ld19zdWItPm5leHQ7IG5leHQgIT0gTlVMTDtuZXh0ID0gbmV4dC0+Y2hpbGRyZW4pewogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfcHJldihuZXh0LCBuZXdfc3ViKTsKCQl9CgoJCWZvciAocHJldiA9IG5ld19zdWItPnByZXY7IHByZXYgIT0gTlVMTDtwcmV2ID0gcHJldi0+Y2hpbGRyZW4pewogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfbmV4dChwcmV2LCBuZXdfc3ViKTsKCQl9CgkgICAgfQoJICAgIGJyZWFrOwoKCWNhc2UgIDE6CgkgICAgLyogIE5ldyBzdWJ0cmVlIGNvbnRhaW5zIHRoZSBleGlzdGluZyBvbmUuICAqLwoJICAgIG5ldzIgPSBuZXRzbm1wX3N1YnRyZWVfc3BsaXQobmV3X3N1YiwgdHJlZTEtPmVuZF9hLHRyZWUxLT5lbmRfbGVuKTsKCSAgICByZXMgPSBuZXRzbm1wX3N1YnRyZWVfbG9hZChuZXdfc3ViLCBjb250ZXh0X25hbWUpOwoJICAgIGlmIChyZXMgIT0gTUlCX1JFR0lTVEVSRURfT0spIHsKCQluZXRzbm1wX3N1YnRyZWVfZnJlZShuZXcyKTsKCQlyZXR1cm4gcmVzOwoJICAgIH0KCSAgICByZXR1cm4gbmV0c25tcF9zdWJ0cmVlX2xvYWQobmV3MiwgY29udGV4dF9uYW1lKTsKCX0KICAgIH0KICAgIHJldHVybiAwOwp9CgovKgogKiBOb3RlOiByZWdpbmZvIHdpbGwgYmUgZnJlZWQgb24gZmFpbHVyZXMKICovCmludApuZXRzbm1wX3JlZ2lzdGVyX21pYihjb25zdCBjaGFyICptb2R1bGVOYW1lLAogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmFyaWFibGUgKnZhciwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcnNpemUsCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW12YXJzLAogICAgICAgICAgICAgICAgICAgICBvaWQgKiBtaWJsb2MsCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtaWJsb2NsZW4sCiAgICAgICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICAgaW50IHJhbmdlX3N1YmlkLAogICAgICAgICAgICAgICAgICAgICBvaWQgcmFuZ2VfdWJvdW5kLAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3Nlc3Npb24gKiBzcywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAqcmVnaW5mbywKICAgICAgICAgICAgICAgICAgICAgaW50IHBlcmZvcm1fY2FsbGJhY2spCnsKICAgIG5ldHNubXBfc3VidHJlZSAqc3VidHJlZSwgKnN1YjI7CiAgICBpbnQgICAgICAgICAgICAgcmVzLCBpOwogICAgc3RydWN0IHJlZ2lzdGVyX3BhcmFtZXRlcnMgcmVnX3Bhcm1zOwogICAgaW50IG9sZF9sb29rdXBfY2FjaGVfdmFsID0gbmV0c25tcF9nZXRfbG9va3VwX2NhY2hlX3NpemUoKTsKCiAgICBpZiAobW9kdWxlTmFtZSA9PSBOVUxMIHx8CiAgICAgICAgbWlibG9jICAgICA9PSBOVUxMKSB7CiAgICAgICAgLyogU2hvdWxkbid0IGhhcHBlbiA/Pz8gKi8KICAgICAgICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uX2ZyZWUocmVnaW5mbyk7CiAgICAgICAgcmV0dXJuIE1JQl9SRUdJU1RSQVRJT05fRkFJTEVEOwogICAgfQogICAgc3VidHJlZSA9IChuZXRzbm1wX3N1YnRyZWUgKiljYWxsb2MoMSwgc2l6ZW9mKG5ldHNubXBfc3VidHJlZSkpOwogICAgaWYgKHN1YnRyZWUgPT0gTlVMTCkgewogICAgICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb25fZnJlZShyZWdpbmZvKTsKICAgICAgICByZXR1cm4gTUlCX1JFR0lTVFJBVElPTl9GQUlMRUQ7CiAgICB9CgogICAgREVCVUdNU0dUTCgoInJlZ2lzdGVyX21pYiIsICJyZWdpc3RlcmluZyBcIiVzXCIgYXQgIiwgbW9kdWxlTmFtZSkpOwogICAgREVCVUdNU0dPSURSQU5HRSgoInJlZ2lzdGVyX21pYiIsIG1pYmxvYywgbWlibG9jbGVuLCByYW5nZV9zdWJpZCwKICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX3Vib3VuZCkpOwogICAgREVCVUdNU0coKCJyZWdpc3Rlcl9taWIiLCAiIHdpdGggY29udGV4dCBcIiVzXCJcbiIsCiAgICAgICAgICAgICAgU05NUF9TVFJPUk5VTEwoY29udGV4dCkpKTsKCiAgICAvKgogICAgICogdmVyaWZ5IHRoYXQgdGhlIHBhc3NlZCBjb250ZXh0IGlzIGVxdWFsIHRvIHRoZSBjb250ZXh0CiAgICAgKiBpbiB0aGUgcmVnaW5mby4KICAgICAqICh3aGljaCBiZWdzIHRoZSBxdWVzdGlvbiwgd2h5IGRvIHdlIGhhdmUgYm90aD8gSXQgYXBwZWFycyB0aGF0IHRoZQogICAgICogIHJlZ2luZm8gaXRlbSBkaWRuJ3QgYXBwZWFyIHRpbCA1LjIpCiAgICAgKi8KICAgIGlmKCAoKE5VTEwgPT0gY29udGV4dCkgJiYgKE5VTEwgIT0gcmVnaW5mby0+Y29udGV4dE5hbWUpKSB8fAogICAgICAgICgoTlVMTCAhPSBjb250ZXh0KSAmJiAoTlVMTCA9PSByZWdpbmZvLT5jb250ZXh0TmFtZSkpIHx8CiAgICAgICAgKCAoKE5VTEwgIT0gY29udGV4dCkgJiYgKE5VTEwgIT0gcmVnaW5mby0+Y29udGV4dE5hbWUpKSAmJgogICAgICAgICAgKDAgIT0gc3RyY21wKGNvbnRleHQsIHJlZ2luZm8tPmNvbnRleHROYW1lKSkpICkgewogICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLCJjb250ZXh0IHBhc3NlZCBkdXJpbmcgcmVnaXN0cmF0aW9uIGRvZXMgbm90ICIKICAgICAgICAgICAgICAgICAiZXF1YWwgdGhlIHJlZ2luZm8gY29udGV4dE5hbWUhICgnJXMnICE9ICclcycpXG4iLAogICAgICAgICAgICAgICAgIGNvbnRleHQsIHJlZ2luZm8tPmNvbnRleHROYW1lKTsKICAgICAgICBuZXRzbm1wX2Fzc2VydCghInJlZ2lzdGVyIGNvbnRleHQgPT0gcmVnaW5mby0+Y29udGV4dE5hbWUiKTsgLyogYWx3YXlzIGZhbHNlICovCiAgICB9CgogICAgLyogIENyZWF0ZSB0aGUgbmV3IHN1YnRyZWUgbm9kZSBiZWluZyByZWdpc3RlcmVkLiAgKi8KCiAgICBzdWJ0cmVlLT5yZWdpbmZvID0gcmVnaW5mbzsKICAgIHN1YnRyZWUtPm5hbWVfYSAgPSBzbm1wX2R1cGxpY2F0ZV9vYmppZChtaWJsb2MsIG1pYmxvY2xlbik7CiAgICBzdWJ0cmVlLT5zdGFydF9hID0gc25tcF9kdXBsaWNhdGVfb2JqaWQobWlibG9jLCBtaWJsb2NsZW4pOwogICAgc3VidHJlZS0+ZW5kX2EgICA9IHNubXBfZHVwbGljYXRlX29iamlkKG1pYmxvYywgbWlibG9jbGVuKTsKICAgIHN1YnRyZWUtPmxhYmVsX2EgPSBzdHJkdXAobW9kdWxlTmFtZSk7CiAgICBpZiAoc3VidHJlZS0+bmFtZV9hID09IE5VTEwgfHwgc3VidHJlZS0+c3RhcnRfYSA9PSBOVUxMIHx8IAoJc3VidHJlZS0+ZW5kX2EgID09IE5VTEwgfHwgc3VidHJlZS0+bGFiZWxfYSA9PSBOVUxMKSB7CgluZXRzbm1wX3N1YnRyZWVfZnJlZShzdWJ0cmVlKTsgLyogYWxzbyBmcmVlcyByZWdpbmZvICovCglyZXR1cm4gTUlCX1JFR0lTVFJBVElPTl9GQUlMRUQ7CiAgICB9CiAgICBzdWJ0cmVlLT5uYW1lbGVuICAgPSAodV9jaGFyKW1pYmxvY2xlbjsKICAgIHN1YnRyZWUtPnN0YXJ0X2xlbiA9ICh1X2NoYXIpbWlibG9jbGVuOwogICAgc3VidHJlZS0+ZW5kX2xlbiAgID0gKHVfY2hhciltaWJsb2NsZW47CiAgICBzdWJ0cmVlLT5lbmRfYVttaWJsb2NsZW4gLSAxXSsrOwoKICAgIGlmICh2YXIgIT0gTlVMTCkgewoJc3VidHJlZS0+dmFyaWFibGVzID0gKHN0cnVjdCB2YXJpYWJsZSAqKW1hbGxvYyh2YXJzaXplKm51bXZhcnMpOwoJaWYgKHN1YnRyZWUtPnZhcmlhYmxlcyA9PSBOVUxMKSB7CgkgICAgbmV0c25tcF9zdWJ0cmVlX2ZyZWUoc3VidHJlZSk7IC8qIGFsc28gZnJlZXMgcmVnaW5mbyAqLwoJICAgIHJldHVybiBNSUJfUkVHSVNUUkFUSU9OX0ZBSUxFRDsKCX0KCW1lbWNweShzdWJ0cmVlLT52YXJpYWJsZXMsIHZhciwgbnVtdmFycyp2YXJzaXplKTsKCXN1YnRyZWUtPnZhcmlhYmxlc19sZW4gPSBudW12YXJzOwoJc3VidHJlZS0+dmFyaWFibGVzX3dpZHRoID0gdmFyc2l6ZTsKICAgIH0KICAgIHN1YnRyZWUtPnByaW9yaXR5ID0gcHJpb3JpdHk7CiAgICBzdWJ0cmVlLT50aW1lb3V0ID0gdGltZW91dDsKICAgIHN1YnRyZWUtPnJhbmdlX3N1YmlkID0gcmFuZ2Vfc3ViaWQ7CiAgICBzdWJ0cmVlLT5yYW5nZV91Ym91bmQgPSByYW5nZV91Ym91bmQ7CiAgICBzdWJ0cmVlLT5zZXNzaW9uID0gc3M7CiAgICBzdWJ0cmVlLT5mbGFncyA9ICh1X2NoYXIpZmxhZ3M7ICAgIC8qICB1c2VkIHRvIGlkZW50aWZ5IGluc3RhbmNlIG9pZHMgICovCiAgICBzdWJ0cmVlLT5mbGFncyB8PSBTVUJUUkVFX0FUVEFDSEVEOwogICAgc3VidHJlZS0+Z2xvYmFsX2NhY2hlaWQgPSByZWdpbmZvLT5nbG9iYWxfY2FjaGVpZDsKCiAgICBuZXRzbm1wX3NldF9sb29rdXBfY2FjaGVfc2l6ZSgwKTsKICAgIHJlcyA9IG5ldHNubXBfc3VidHJlZV9sb2FkKHN1YnRyZWUsIGNvbnRleHQpOwoKICAgIC8qICBJZiByZWdpc3RlcmluZyBhIHJhbmdlLCB1c2UgdGhlIGZpcnN0IHN1YnRyZWUgYXMgYSB0ZW1wbGF0ZSBmb3IgdGhlCglyZXN0IG9mIHRoZSByYW5nZS4gICovCgogICAgaWYgKHJlcyA9PSBNSUJfUkVHSVNURVJFRF9PSyAmJiByYW5nZV9zdWJpZCAhPSAwKSB7Cglmb3IgKGkgPSBtaWJsb2NbcmFuZ2Vfc3ViaWQgLSAxXSArIDE7IGkgPD0gKGludClyYW5nZV91Ym91bmQ7IGkrKykgewoJICAgIHN1YjIgPSBuZXRzbm1wX3N1YnRyZWVfZGVlcGNvcHkoc3VidHJlZSk7CgoJICAgIGlmIChzdWIyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfbWliX2NvbnRleHQobWlibG9jLCBtaWJsb2NsZW4sIHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9zdWJpZCwgcmFuZ2VfdWJvdW5kLCBjb250ZXh0KTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc2V0X2xvb2t1cF9jYWNoZV9zaXplKG9sZF9sb29rdXBfY2FjaGVfdmFsKTsKICAgICAgICAgICAgICAgIGludmFsaWRhdGVfbG9va3VwX2NhY2hlKGNvbnRleHQpOwogICAgICAgICAgICAgICAgcmV0dXJuIE1JQl9SRUdJU1RSQVRJT05fRkFJTEVEOwogICAgICAgICAgICB9CgogICAgICAgICAgICBzdWIyLT5uYW1lX2FbcmFuZ2Vfc3ViaWQgLSAxXSAgPSBpOwogICAgICAgICAgICBzdWIyLT5zdGFydF9hW3JhbmdlX3N1YmlkIC0gMV0gPSBpOwogICAgICAgICAgICBzdWIyLT5lbmRfYVtyYW5nZV9zdWJpZCAtIDFdICAgPSBpOyAgICAgLyogWFhYIC0gPz8/PyAqLwogICAgICAgICAgICBpZiAocmFuZ2Vfc3ViaWQgPT0gKGludCltaWJsb2NsZW4pIHsKICAgICAgICAgICAgICAgICsrc3ViMi0+ZW5kX2FbcmFuZ2Vfc3ViaWQgLSAxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWIyLT5mbGFncyB8PSBTVUJUUkVFX0FUVEFDSEVEOwogICAgICAgICAgICBzdWIyLT5nbG9iYWxfY2FjaGVpZCA9IHJlZ2luZm8tPmdsb2JhbF9jYWNoZWlkOwogICAgICAgICAgICAvKiBGUlEgVGhpcyBpcyBlc3NlbnRpYWwgZm9yIHJlcXVlc3RzIHRvIHN1Y2NlZWQhICovCiAgICAgICAgICAgIHN1YjItPnJlZ2luZm8tPnJvb3RvaWRbcmFuZ2Vfc3ViaWQgLSAxXSAgPSBpOwoKICAgICAgICAgICAgcmVzID0gbmV0c25tcF9zdWJ0cmVlX2xvYWQoc3ViMiwgY29udGV4dCk7CiAgICAgICAgICAgIGlmIChyZXMgIT0gTUlCX1JFR0lTVEVSRURfT0spIHsKICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfbWliX2NvbnRleHQobWlibG9jLCBtaWJsb2NsZW4sIHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9zdWJpZCwgcmFuZ2VfdWJvdW5kLCBjb250ZXh0KTsKCQluZXRzbm1wX3N1YnRyZWVfZnJlZShzdWIyKTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc2V0X2xvb2t1cF9jYWNoZV9zaXplKG9sZF9sb29rdXBfY2FjaGVfdmFsKTsKICAgICAgICAgICAgICAgIGludmFsaWRhdGVfbG9va3VwX2NhY2hlKGNvbnRleHQpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZiAocmVzID09IE1JQl9EVVBMSUNBVEVfUkVHSVNUUkFUSU9OIHx8CiAgICAgICAgICAgICAgIHJlcyA9PSBNSUJfUkVHSVNUUkFUSU9OX0ZBSUxFRCkgewogICAgICAgIG5ldHNubXBfc2V0X2xvb2t1cF9jYWNoZV9zaXplKG9sZF9sb29rdXBfY2FjaGVfdmFsKTsKICAgICAgICBpbnZhbGlkYXRlX2xvb2t1cF9jYWNoZShjb250ZXh0KTsKICAgICAgICBuZXRzbm1wX3N1YnRyZWVfZnJlZShzdWJ0cmVlKTsKICAgICAgICByZXR1cm4gcmVzOwogICAgfQoKICAgIC8qCiAgICAgKiBtYXJrIHRoZSBNSUIgYXMgZGV0YWNoZWQsIGlmIHRoZXJlJ3Mgbm8gbWFzdGVyIGFnZW50IHByZXNlbnQgYXMgb2Ygbm93IAogICAgICovCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJICAgICAgIE5FVFNOTVBfRFNfQUdFTlRfUk9MRSkgIT0gTUFTVEVSX0FHRU5UKSB7CiAgICAgICAgZXh0ZXJuIHN0cnVjdCBzbm1wX3Nlc3Npb24gKm1haW5fc2Vzc2lvbjsKICAgICAgICBpZiAobWFpbl9zZXNzaW9uID09IE5VTEwpIHsKICAgICAgICAgICAgcmVnaXN0ZXJfbWliX2RldGFjaF9ub2RlKHN1YnRyZWUpOwoJfQogICAgfQoKICAgIGlmIChyZXMgPT0gTUlCX1JFR0lTVEVSRURfT0sgJiYgcGVyZm9ybV9jYWxsYmFjaykgewogICAgICAgIG1lbXNldCgmcmVnX3Bhcm1zLCAweDAsIHNpemVvZihyZWdfcGFybXMpKTsKICAgICAgICByZWdfcGFybXMubmFtZSA9IG1pYmxvYzsKICAgICAgICByZWdfcGFybXMubmFtZWxlbiA9IG1pYmxvY2xlbjsKICAgICAgICByZWdfcGFybXMucHJpb3JpdHkgPSBwcmlvcml0eTsKICAgICAgICByZWdfcGFybXMucmFuZ2Vfc3ViaWQgPSByYW5nZV9zdWJpZDsKICAgICAgICByZWdfcGFybXMucmFuZ2VfdWJvdW5kID0gcmFuZ2VfdWJvdW5kOwogICAgICAgIHJlZ19wYXJtcy50aW1lb3V0ID0gdGltZW91dDsKICAgICAgICByZWdfcGFybXMuZmxhZ3MgPSAodV9jaGFyKSBmbGFnczsKICAgICAgICByZWdfcGFybXMuY29udGV4dE5hbWUgPSBjb250ZXh0OwogICAgICAgIHJlZ19wYXJtcy5zZXNzaW9uID0gc3M7CiAgICAgICAgcmVnX3Bhcm1zLnJlZ2luZm8gPSByZWdpbmZvOwogICAgICAgIHJlZ19wYXJtcy5jb250ZXh0TmFtZSA9IGNvbnRleHQ7CiAgICAgICAgc25tcF9jYWxsX2NhbGxiYWNrcyhTTk1QX0NBTExCQUNLX0FQUExJQ0FUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU05NUERfQ0FMTEJBQ0tfUkVHSVNURVJfT0lELCAmcmVnX3Bhcm1zKTsKICAgIH0KCiAgICBuZXRzbm1wX3NldF9sb29rdXBfY2FjaGVfc2l6ZShvbGRfbG9va3VwX2NhY2hlX3ZhbCk7CiAgICBpbnZhbGlkYXRlX2xvb2t1cF9jYWNoZShjb250ZXh0KTsKICAgIHJldHVybiByZXM7Cn0KCi8qCiAqIFJlYXR0YWNoIGEgcGFydGljdWxhciBub2RlLiAgCiAqLwoKc3RhdGljIHZvaWQKcmVnaXN0ZXJfbWliX3JlYXR0YWNoX25vZGUobmV0c25tcF9zdWJ0cmVlICpzKQp7CiAgICBpZiAoKHMgIT0gTlVMTCkgJiYgKHMtPm5hbWVsZW4gPiAxKSAmJiAhKHMtPmZsYWdzICYgU1VCVFJFRV9BVFRBQ0hFRCkpIHsKICAgICAgICBzdHJ1Y3QgcmVnaXN0ZXJfcGFyYW1ldGVycyByZWdfcGFybXM7CiAgICAgICAgLyoKICAgICAgICAgKiBvbmx5IGRvIHJlZ2lzdHJhdGlvbnMgdGhhdCBhcmUgbm90IHRoZSB0b3AgbGV2ZWwgbm9kZXMgCiAgICAgICAgICovCiAgICAgICAgbWVtc2V0KCZyZWdfcGFybXMsIDB4MCwgc2l6ZW9mKHJlZ19wYXJtcykpOwoKICAgICAgICAvKgogICAgICAgICAqIFhYWDogZG8gdGhpcyBiZXR0ZXIgCiAgICAgICAgICovCiAgICAgICAgcmVnX3Bhcm1zLm5hbWUgPSBzLT5uYW1lX2E7CiAgICAgICAgcmVnX3Bhcm1zLm5hbWVsZW4gPSBzLT5uYW1lbGVuOwogICAgICAgIHJlZ19wYXJtcy5wcmlvcml0eSA9IHMtPnByaW9yaXR5OwogICAgICAgIHJlZ19wYXJtcy5yYW5nZV9zdWJpZCA9IHMtPnJhbmdlX3N1YmlkOwogICAgICAgIHJlZ19wYXJtcy5yYW5nZV91Ym91bmQgPSBzLT5yYW5nZV91Ym91bmQ7CiAgICAgICAgcmVnX3Bhcm1zLnRpbWVvdXQgPSBzLT50aW1lb3V0OwogICAgICAgIHJlZ19wYXJtcy5mbGFncyA9IHMtPmZsYWdzOwogICAgICAgIHJlZ19wYXJtcy5zZXNzaW9uID0gcy0+c2Vzc2lvbjsKICAgICAgICByZWdfcGFybXMucmVnaW5mbyA9IHMtPnJlZ2luZm87CiAgICAgICAgLyogWFhYOiBtaXNzaW5nIGluIHN1YnRyZWU6IHJlZ19wYXJtcy5jb250ZXh0TmFtZSA9IHMtPmNvbnRleHQ7ICovCiAgICAgICAgaWYgKChOVUxMICE9IHMtPnJlZ2luZm8pICYmIChOVUxMICE9IHMtPnJlZ2luZm8tPmNvbnRleHROYW1lKSkKICAgICAgICAgICAgcmVnX3Bhcm1zLmNvbnRleHROYW1lID0gcy0+cmVnaW5mby0+Y29udGV4dE5hbWU7CiAgICAgICAgc25tcF9jYWxsX2NhbGxiYWNrcyhTTk1QX0NBTExCQUNLX0FQUExJQ0FUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU05NUERfQ0FMTEJBQ0tfUkVHSVNURVJfT0lELCAmcmVnX3Bhcm1zKTsKICAgICAgICBzLT5mbGFncyB8PSBTVUJUUkVFX0FUVEFDSEVEOwogICAgfQp9CgovKgogKiBDYWxsIGNhbGxiYWNrcyB0byByZWF0dGFjaCBhbGwgb3VyIG5vZGVzLiAgCiAqLwoKdm9pZApyZWdpc3Rlcl9taWJfcmVhdHRhY2godm9pZCkKewogICAgbmV0c25tcF9zdWJ0cmVlICpzLCAqdDsKICAgIHN1YnRyZWVfY29udGV4dF9jYWNoZSAqcHRyOwoKICAgIGZvciAocHRyID0gY29udGV4dF9zdWJ0cmVlczsgcHRyOyBwdHIgPSBwdHItPm5leHQpIHsKICAgICAgICBmb3IgKHMgPSBwdHItPmZpcnN0X3N1YnRyZWU7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpIHsKICAgICAgICAgICAgcmVnaXN0ZXJfbWliX3JlYXR0YWNoX25vZGUocyk7CiAgICAgICAgICAgIGZvciAodCA9IHMtPmNoaWxkcmVuOyB0ICE9IE5VTEw7IHQgPSB0LT5jaGlsZHJlbikgewogICAgICAgICAgICAgICAgcmVnaXN0ZXJfbWliX3JlYXR0YWNoX25vZGUodCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCi8qCiAqIE1hcmsgYSBub2RlIGFzIGRldGFjaGVkLiAgCiAqLwoKc3RhdGljIHZvaWQKcmVnaXN0ZXJfbWliX2RldGFjaF9ub2RlKG5ldHNubXBfc3VidHJlZSAqcykKewogICAgaWYgKHMgIT0gTlVMTCkgewogICAgICAgIHMtPmZsYWdzID0gcy0+ZmxhZ3MgJiB+U1VCVFJFRV9BVFRBQ0hFRDsKICAgIH0KfQoKLyoKICogTWFyayBhbGwgb3VyIHJlZ2lzdGVyZWQgT0lEcyBhcyBkZXRhY2hlZC4gIFRoaXMgaXMgb25seSByZWFsbHkKICogdXNlZnVsIGZvciBzdWJhZ2VudCBwcm90b2NvbHMsIHdoZW4gYSBjb25uZWN0aW9uIGlzIGxvc3Qgb3IKICogc29tZXRoaW5nLiAgCiAqLwoKdm9pZApyZWdpc3Rlcl9taWJfZGV0YWNoKHZvaWQpCnsKICAgIG5ldHNubXBfc3VidHJlZSAqcywgKnQ7CiAgICBzdWJ0cmVlX2NvbnRleHRfY2FjaGUgKnB0cjsKICAgIGZvciAocHRyID0gY29udGV4dF9zdWJ0cmVlczsgcHRyOyBwdHIgPSBwdHItPm5leHQpIHsKICAgICAgICBmb3IgKHMgPSBwdHItPmZpcnN0X3N1YnRyZWU7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpIHsKICAgICAgICAgICAgcmVnaXN0ZXJfbWliX2RldGFjaF9ub2RlKHMpOwogICAgICAgICAgICBmb3IgKHQgPSBzLT5jaGlsZHJlbjsgdCAhPSBOVUxMOyB0ID0gdC0+Y2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIHJlZ2lzdGVyX21pYl9kZXRhY2hfbm9kZSh0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKaW50CnJlZ2lzdGVyX21pYl9jb250ZXh0KGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2YXJpYWJsZSAqdmFyLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bXZhcnMsCiAgICAgICAgICAgICAgICAgICAgIG9pZCAqIG1pYmxvYywKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1pYmxvY2xlbiwKICAgICAgICAgICAgICAgICAgICAgaW50IHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgICBpbnQgcmFuZ2Vfc3ViaWQsCiAgICAgICAgICAgICAgICAgICAgIG9pZCByYW5nZV91Ym91bmQsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc2Vzc2lvbiAqIHNzLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb250ZXh0LCBpbnQgdGltZW91dCwgaW50IGZsYWdzKQp7CiAgICByZXR1cm4gbmV0c25tcF9yZWdpc3Rlcl9vbGRfYXBpKG1vZHVsZU5hbWUsIHZhciwgdmFyc2l6ZSwgbnVtdmFycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlibG9jLCBtaWJsb2NsZW4sIHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9zdWJpZCwgcmFuZ2VfdWJvdW5kLCBzcywgY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCwgZmxhZ3MpOwp9CgppbnQKcmVnaXN0ZXJfbWliX3JhbmdlKGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUsCiAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmFyaWFibGUgKnZhciwKICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJzaXplLAogICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bXZhcnMsCiAgICAgICAgICAgICAgICAgICBvaWQgKiBtaWJsb2MsCiAgICAgICAgICAgICAgICAgICBzaXplX3QgbWlibG9jbGVuLAogICAgICAgICAgICAgICAgICAgaW50IHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgaW50IHJhbmdlX3N1YmlkLCBvaWQgcmFuZ2VfdWJvdW5kLCBuZXRzbm1wX3Nlc3Npb24gKiBzcykKewogICAgcmV0dXJuIHJlZ2lzdGVyX21pYl9jb250ZXh0KG1vZHVsZU5hbWUsIHZhciwgdmFyc2l6ZSwgbnVtdmFycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWJsb2MsIG1pYmxvY2xlbiwgcHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Vfc3ViaWQsIHJhbmdlX3Vib3VuZCwgc3MsICIiLCAtMSwgMCk7Cn0KCmludApyZWdpc3Rlcl9taWJfcHJpb3JpdHkoY29uc3QgY2hhciAqbW9kdWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2YXJpYWJsZSAqdmFyLAogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcnNpemUsCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtdmFycywKICAgICAgICAgICAgICAgICAgICAgIG9pZCAqIG1pYmxvYywgc2l6ZV90IG1pYmxvY2xlbiwgaW50IHByaW9yaXR5KQp7CiAgICByZXR1cm4gcmVnaXN0ZXJfbWliX3JhbmdlKG1vZHVsZU5hbWUsIHZhciwgdmFyc2l6ZSwgbnVtdmFycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlibG9jLCBtaWJsb2NsZW4sIHByaW9yaXR5LCAwLCAwLCBOVUxMKTsKfQoKaW50CnJlZ2lzdGVyX21pYihjb25zdCBjaGFyICptb2R1bGVOYW1lLAogICAgICAgICAgICAgc3RydWN0IHZhcmlhYmxlICp2YXIsCiAgICAgICAgICAgICBzaXplX3QgdmFyc2l6ZSwKICAgICAgICAgICAgIHNpemVfdCBudW12YXJzLCBvaWQgKiBtaWJsb2MsIHNpemVfdCBtaWJsb2NsZW4pCnsKICAgIHJldHVybiByZWdpc3Rlcl9taWJfcHJpb3JpdHkobW9kdWxlTmFtZSwgdmFyLCB2YXJzaXplLCBudW12YXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWJsb2MsIG1pYmxvY2xlbiwgREVGQVVMVF9NSUJfUFJJT1JJVFkpOwp9Cgp2b2lkCm5ldHNubXBfc3VidHJlZV91bmxvYWQobmV0c25tcF9zdWJ0cmVlICpzdWIsIG5ldHNubXBfc3VidHJlZSAqcHJldiwgY29uc3QgY2hhciAqY29udGV4dCkKewogICAgbmV0c25tcF9zdWJ0cmVlICpwdHI7CgogICAgREVCVUdNU0dUTCgoInJlZ2lzdGVyX21pYiIsICJ1bmxvYWQoIikpOwogICAgaWYgKHN1YiAhPSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dPSUQoKCJyZWdpc3Rlcl9taWIiLCBzdWItPnN0YXJ0X2EsIHN1Yi0+c3RhcnRfbGVuKSk7CiAgICB9IGVsc2UgewogICAgICAgIERFQlVHTVNHKCgicmVnaXN0ZXJfbWliIiwgIltOSUxdIikpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIERFQlVHTVNHKCgicmVnaXN0ZXJfbWliIiwgIiwgIikpOwogICAgaWYgKHByZXYgIT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHT0lEKCgicmVnaXN0ZXJfbWliIiwgcHJldi0+c3RhcnRfYSwgcHJldi0+c3RhcnRfbGVuKSk7CiAgICB9IGVsc2UgewogICAgICAgIERFQlVHTVNHKCgicmVnaXN0ZXJfbWliIiwgIltOSUxdIikpOwogICAgfQogICAgREVCVUdNU0coKCJyZWdpc3Rlcl9taWIiLCAiKVxuIikpOwoKICAgIGlmIChwcmV2ICE9IE5VTEwpIHsgICAgICAgICAvKiBub24tbGVhZGluZyBlbnRyaWVzIGFyZSBlYXN5ICovCiAgICAgICAgcHJldi0+Y2hpbGRyZW4gPSBzdWItPmNoaWxkcmVuOwogICAgICAgIGludmFsaWRhdGVfbG9va3VwX2NhY2hlKGNvbnRleHQpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIC8qCiAgICAgKiBvdGhlcndpc2UsIHdlIG5lZWQgdG8gYW1lbmQgb3VyIG5laWdoYm91cnMgYXMgd2VsbCAKICAgICAqLwoKICAgIGlmIChzdWItPmNoaWxkcmVuID09IE5VTEwpIHsgICAgICAgIC8qIGp1c3QgcmVtb3ZlIHRoaXMgbm9kZSBjb21wbGV0ZWx5ICovCiAgICAgICAgZm9yIChwdHIgPSBzdWItPnByZXY7IHB0cjsgcHRyID0gcHRyLT5jaGlsZHJlbikgewogICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX25leHQocHRyLCBzdWItPm5leHQpOwogICAgICAgIH0KICAgICAgICBmb3IgKHB0ciA9IHN1Yi0+bmV4dDsgcHRyOyBwdHIgPSBwdHItPmNoaWxkcmVuKSB7CiAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfcHJldihwdHIsIHN1Yi0+cHJldik7CiAgICAgICAgfQoKCWlmIChzdWItPnByZXYgPT0gTlVMTCkgewoJICAgIG5ldHNubXBfc3VidHJlZV9yZXBsYWNlX2ZpcnN0KHN1Yi0+bmV4dCwgY29udGV4dCk7Cgl9CgogICAgfSBlbHNlIHsKICAgICAgICBmb3IgKHB0ciA9IHN1Yi0+cHJldjsgcHRyOyBwdHIgPSBwdHItPmNoaWxkcmVuKQogICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX25leHQocHRyLCBzdWItPmNoaWxkcmVuKTsKICAgICAgICBmb3IgKHB0ciA9IHN1Yi0+bmV4dDsgcHRyOyBwdHIgPSBwdHItPmNoaWxkcmVuKQogICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX3ByZXYocHRyLCBzdWItPmNoaWxkcmVuKTsKCglpZiAoc3ViLT5wcmV2ID09IE5VTEwpIHsKCSAgICBuZXRzbm1wX3N1YnRyZWVfcmVwbGFjZV9maXJzdChzdWItPmNoaWxkcmVuLCBjb250ZXh0KTsKCX0KICAgIH0KICAgIGludmFsaWRhdGVfbG9va3VwX2NhY2hlKGNvbnRleHQpOwp9CgovKioKICogVW5yZWdpc3RlcnMgYW4gT0lEIHRoYXQgaGFzIGFuIGFzc29jaWF0ZWQgY29udGV4dCBuYW1lIHZhbHVlLiAKICogVHlwaWNhbGx5IHVzZWQgd2hlbiBhIG1vZHVsZSBoYXMgbXVsdGlwbGUgY29udGV4dHMgZGVmaW5lZC4gIFRoZSBwYXJhbWV0ZXJzCiAqIHByaW9yaXR5LCByYW5nZV9zdWJpZCwgYW5kIHJhbmdlX3Vib3VuZCBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCiAqIGFnZW50eCwgc2VlIFJGQyAyNzQxLCBvdGhlcndpc2UgdGhlc2UgdmFsdWVzIHNob3VsZCBhbHdheXMgYmUgMC4KICoKICogQHBhcmFtIG5hbWUgIHRoZSBzcGVjaWZpYyBPSUQgdG8gdW5yZWdpc3RlciBpZiBpdCBjb25hdGlucyB0aGUgYXNzb2NpYXRlZAogKiAgICAgICAgICAgICAgY29udGV4dC4KICoKICogQHBhcmFtIGxlbiAgIHRoZSBsZW5ndGggb2YgdGhlIE9JRCwgdXNlICBPSURfTEVOR1RIIG1hY3JvLgogKgogKiBAcGFyYW0gcHJpb3JpdHkgIGEgdmFsdWUgYmV0d2VlbiAxIGFuZCAyNTUsIHVzZWQgdG8gYWNoaWV2ZSBhIGRlc2lyZWQKICogICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHdoZW4gZGlmZmVyZW50IHNlc3Npb25zIHJlZ2lzdGVyIGlkZW50aWNhbCBvcgogKiAgICAgICAgICAgICAgICAgIG92ZXJsYXBwaW5nIHJlZ2lvbnMuICBTdWJhZ2VudHMgd2l0aCBubyBwYXJ0aWN1bGFyCiAqICAgICAgICAgICAgICAgICAga25vd2xlZGdlIG9mIHByaW9yaXR5IHNob3VsZCByZWdpc3RlciB3aXRoIHRoZSBkZWZhdWx0CiAqICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgMTI3LgogKgogKiBAcGFyYW0gcmFuZ2Vfc3ViaWQgIHBlcm1pdHMgc3BlY2lmeWluZyBhIHJhbmdlIGluIHBsYWNlIG9mIG9uZSBvZiBhIHN1YnRyZWUKICogICAgICAgICAgICAgICAgICAgICBzdWItaWRlbnRpZmllcnMuICBXaGVuIHRoaXMgdmFsdWUgaXMgemVybywgbm8gcmFuZ2UgaXMKICogICAgICAgICAgICAgICAgICAgICBiZWluZyBzcGVjaWZpZWQuCiAqCiAqIEBwYXJhbSByYW5nZV91Ym91bmQgIHRoZSB1cHBlciBib3VuZCBvZiBhIHN1Yi1pZGVudGlmaWVyJ3MgcmFuZ2UuCiAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgcHJlc2VudCBvbmx5IGlmIHJhbmdlX3N1YmlkIGlzIG5vdCAwLgogKgogKiBAcGFyYW0gY29udGV4dCAgYSBjb250ZXh0IG5hbWUgdGhhdCBoYXMgYmVlbiBjcmVhdGVkCiAqCiAqIEByZXR1cm4gCiAqIAogKi8KaW50CnVucmVnaXN0ZXJfbWliX2NvbnRleHQob2lkICogbmFtZSwgc2l6ZV90IGxlbiwgaW50IHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgICAgIGludCByYW5nZV9zdWJpZCwgb2lkIHJhbmdlX3Vib3VuZCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb250ZXh0KQp7CiAgICBuZXRzbm1wX3N1YnRyZWUgKmxpc3QsICpteXB0ciA9IE5VTEw7CiAgICBuZXRzbm1wX3N1YnRyZWUgKnByZXYsICpjaGlsZCwgKm5leHQ7IC8qIGxvb3AgdGhyb3VnaCBjaGlsZHJlbiAqLwogICAgc3RydWN0IHJlZ2lzdGVyX3BhcmFtZXRlcnMgcmVnX3Bhcm1zOwogICAgaW50IG9sZF9sb29rdXBfY2FjaGVfdmFsID0gbmV0c25tcF9nZXRfbG9va3VwX2NhY2hlX3NpemUoKTsKICAgIGludCB1bnJlZ2lzdGVyaW5nID0gMTsKICAgIGludCBvcmlnX3N1YmlkX3ZhbCA9IC0xOwoKICAgIG5ldHNubXBfc2V0X2xvb2t1cF9jYWNoZV9zaXplKDApOwoKICAgIGlmICgocmFuZ2Vfc3ViaWQgIT0gMCkgJiYgIChyYW5nZV9zdWJpZCA8PSBsZW4pKQogICAgICAgIG9yaWdfc3ViaWRfdmFsID0gbmFtZVtyYW5nZV9zdWJpZC0xXTsKCiAgICB3aGlsZSh1bnJlZ2lzdGVyaW5nKXsKICAgICAgICBERUJVR01TR1RMKCgicmVnaXN0ZXJfbWliIiwgInVucmVnaXN0ZXJpbmcgIikpOwogICAgICAgIERFQlVHTVNHT0lEUkFOR0UoKCJyZWdpc3Rlcl9taWIiLCBuYW1lLCBsZW4sIHJhbmdlX3N1YmlkLCByYW5nZV91Ym91bmQpKTsKICAgICAgICBERUJVR01TRygoInJlZ2lzdGVyX21pYiIsICJcbiIpKTsKCiAgICAgICAgbGlzdCA9IG5ldHNubXBfc3VidHJlZV9maW5kKG5hbWUsIGxlbiwgbmV0c25tcF9zdWJ0cmVlX2ZpbmRfZmlyc3QoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgY29udGV4dCk7CiAgICAgICAgaWYgKGxpc3QgPT0gTlVMTCkgewogICAgICAgICAgICByZXR1cm4gTUlCX05PX1NVQ0hfUkVHSVNUUkFUSU9OOwogICAgICAgIH0KCiAgICAgICAgZm9yIChjaGlsZCA9IGxpc3QsIHByZXYgPSBOVUxMOyBjaGlsZCAhPSBOVUxMOwogICAgICAgICAgICBwcmV2ID0gY2hpbGQsIGNoaWxkID0gY2hpbGQtPmNoaWxkcmVuKSB7CiAgICAgICAgICAgIGlmIChuZXRzbm1wX29pZF9lcXVhbHMoY2hpbGQtPm5hbWVfYSwgY2hpbGQtPm5hbWVsZW4sIG5hbWUsIGxlbikgPT0gMCAmJgogICAgICAgICAgICAgICAgY2hpbGQtPnByaW9yaXR5ID09IHByaW9yaXR5KSB7CiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgIC8qIGZvdW5kIGl0ICovCiAgICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoY2hpbGQgPT0gTlVMTCkgewogICAgICAgICAgICByZXR1cm4gTUlCX05PX1NVQ0hfUkVHSVNUUkFUSU9OOwogICAgICAgIH0KCiAgICAgICAgbmV0c25tcF9zdWJ0cmVlX3VubG9hZChjaGlsZCwgcHJldiwgY29udGV4dCk7CiAgICAgICAgbXlwdHIgPSBjaGlsZDsgICAgICAgICAgICAgIC8qIHJlbWVtYmVyIHRoaXMgZm9yIGxhdGVyICovCgogICAgICAgIC8qCiAgICAgICAgKiAgTm93IGhhbmRsZSBhbnkgb2NjdXJhbmNlcyBpbiB0aGUgZm9sbG93aW5nIHN1YnRyZWVzLAogICAgICAgICogICAgICBhcyBhIHJlc3VsdCBvZiBzcGxpdHRpbmcgdGhpcyByYW5nZS4gIER1ZSB0byB0aGUKICAgICAgICAqICAgICAgbmF0dXJlIG9mIHRoZSB3YXkgc3VjaCBzcGxpdHMgd29yaywgdGhlIGZpcnN0CiAgICAgICAgKiAgICAgIHN1YnRyZWUgJ3NsaWNlJyB0aGF0IGRvZXNuJ3QgcmVmZXIgdG8gdGhlIGdpdmVuCiAgICAgICAgKiAgICAgIG5hbWUgbWFya3MgdGhlIGVuZCBvZiB0aGUgb3JpZ2luYWwgcmVnaW9uLgogICAgICAgICoKICAgICAgICAqICBUaGlzIHNob3VsZCBhbHNvIHNlcnZlIHRvIHJlZ2lzdGVyIHJhbmdlcy4KICAgICAgICAqLwoKICAgICAgICBmb3IgKGxpc3QgPSBteXB0ci0+bmV4dDsgbGlzdCAhPSBOVUxMOyBsaXN0ID0gbmV4dCkgewogICAgICAgICAgICBuZXh0ID0gbGlzdC0+bmV4dDsgLyogbGlzdCBnZXRzIGZyZWVkIHNvbWV0aW1lczsgY2FjaGUgbmV4dCAqLwogICAgICAgICAgICBmb3IgKGNoaWxkID0gbGlzdCwgcHJldiA9IE5VTEw7IGNoaWxkICE9IE5VTEw7CiAgICAgICAgICAgICAgICBwcmV2ID0gY2hpbGQsIGNoaWxkID0gY2hpbGQtPmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICBpZiAoKG5ldHNubXBfb2lkX2VxdWFscyhjaGlsZC0+bmFtZV9hLCBjaGlsZC0+bmFtZWxlbiwKICAgICAgICAgICAgICAgICAgICBuYW1lLCBsZW4pID09IDApICYmCiAgICAgICAgICAgIChjaGlsZC0+cHJpb3JpdHkgPT0gcHJpb3JpdHkpKSB7CiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9zdWJ0cmVlX3VubG9hZChjaGlsZCwgcHJldiwgY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2ZyZWUoY2hpbGQpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjaGlsZCA9PSBOVUxMKSAgICAgIC8qIERpZG4ndCBmaW5kIHRoZSBnaXZlbiBuYW1lICovCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIC8qIE1heWJlIHdlIGFyZSBpbiBhIHJhbmdlLi4uICovCiAgICAgICAgaWYgKG9yaWdfc3ViaWRfdmFsICE9IC0xKXsKICAgICAgICAgICAgaWYgKCsrbmFtZVtyYW5nZV9zdWJpZC0xXSA+PSBvcmlnX3N1YmlkX3ZhbCtyYW5nZV91Ym91bmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyaW5nPTA7CiAgICAgICAgICAgICAgICBuYW1lW3JhbmdlX3N1YmlkLTFdID0gb3JpZ19zdWJpZF92YWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB1bnJlZ2lzdGVyaW5nPTA7CiAgICAgICAgfQogICAgfQoKICAgIG1lbXNldCgmcmVnX3Bhcm1zLCAweDAsIHNpemVvZihyZWdfcGFybXMpKTsKICAgIHJlZ19wYXJtcy5uYW1lID0gbmFtZTsKICAgIHJlZ19wYXJtcy5uYW1lbGVuID0gbGVuOwogICAgcmVnX3Bhcm1zLnByaW9yaXR5ID0gcHJpb3JpdHk7CiAgICByZWdfcGFybXMucmFuZ2Vfc3ViaWQgPSByYW5nZV9zdWJpZDsKICAgIHJlZ19wYXJtcy5yYW5nZV91Ym91bmQgPSByYW5nZV91Ym91bmQ7CiAgICByZWdfcGFybXMuZmxhZ3MgPSAweDAwOyAgICAgLyogIHRoaXMgaXMgb2theSBJIHRoaW5rICAqLwogICAgcmVnX3Bhcm1zLmNvbnRleHROYW1lID0gY29udGV4dDsKICAgIHNubXBfY2FsbF9jYWxsYmFja3MoU05NUF9DQUxMQkFDS19BUFBMSUNBVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgU05NUERfQ0FMTEJBQ0tfVU5SRUdJU1RFUl9PSUQsICZyZWdfcGFybXMpOwoKICAgIG5ldHNubXBfc3VidHJlZV9mcmVlKG15cHRyKTsKICAgIG5ldHNubXBfc2V0X2xvb2t1cF9jYWNoZV9zaXplKG9sZF9sb29rdXBfY2FjaGVfdmFsKTsKICAgIGludmFsaWRhdGVfbG9va3VwX2NhY2hlKGNvbnRleHQpOwogICAgcmV0dXJuIE1JQl9VTlJFR0lTVEVSRURfT0s7Cn0KCmludApuZXRzbm1wX3VucmVnaXN0ZXJfbWliX3RhYmxlX3JvdyhvaWQgKiBuYW1lLCBzaXplX3QgbGVuLCBpbnQgcHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YXJfc3ViaWQsIG9pZCByYW5nZV91Ym91bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnRleHQpCnsKICAgIG5ldHNubXBfc3VidHJlZSAqbGlzdCwgKm15cHRyLCAqZnV0dXJlcHRyOwogICAgbmV0c25tcF9zdWJ0cmVlICpwcmV2LCAqY2hpbGQ7ICAgICAgIC8qIGxvb3AgdGhyb3VnaCBjaGlsZHJlbiAqLwogICAgc3RydWN0IHJlZ2lzdGVyX3BhcmFtZXRlcnMgcmVnX3Bhcm1zOwogICAgb2lkICAgICAgICAgICAgIHJhbmdlX2xib3VuZCA9IG5hbWVbdmFyX3N1YmlkIC0gMV07CgogICAgREVCVUdNU0dUTCgoInJlZ2lzdGVyX21pYiIsICJ1bnJlZ2lzdGVyaW5nICIpKTsKICAgIERFQlVHTVNHT0lEUkFOR0UoKCJyZWdpc3Rlcl9taWIiLCBuYW1lLCBsZW4sIHZhcl9zdWJpZCwgcmFuZ2VfdWJvdW5kKSk7CiAgICBERUJVR01TRygoInJlZ2lzdGVyX21pYiIsICJcbiIpKTsKCiAgICBmb3IgKDsgbmFtZVt2YXJfc3ViaWQgLSAxXSA8PSByYW5nZV91Ym91bmQ7IG5hbWVbdmFyX3N1YmlkIC0gMV0rKykgewogICAgICAgIGxpc3QgPSBuZXRzbm1wX3N1YnRyZWVfZmluZChuYW1lLCBsZW4sIAoJCQkJbmV0c25tcF9zdWJ0cmVlX2ZpbmRfZmlyc3QoY29udGV4dCksIGNvbnRleHQpOwoKICAgICAgICBpZiAobGlzdCA9PSBOVUxMKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgZm9yIChjaGlsZCA9IGxpc3QsIHByZXYgPSBOVUxMOyBjaGlsZCAhPSBOVUxMOwogICAgICAgICAgICAgcHJldiA9IGNoaWxkLCBjaGlsZCA9IGNoaWxkLT5jaGlsZHJlbikgewoKICAgICAgICAgICAgaWYgKG5ldHNubXBfb2lkX2VxdWFscyhjaGlsZC0+bmFtZV9hLCBjaGlsZC0+bmFtZWxlbiwgCgkJCQkgbmFtZSwgbGVuKSA9PSAwICYmIAoJCShjaGlsZC0+cHJpb3JpdHkgPT0gcHJpb3JpdHkpKSB7CiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogZm91bmQgaXQgKi8KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGNoaWxkID09IE5VTEwpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBuZXRzbm1wX3N1YnRyZWVfdW5sb2FkKGNoaWxkLCBwcmV2LCBjb250ZXh0KTsKICAgICAgICBteXB0ciA9IGNoaWxkOyAgICAgICAgICAvKiByZW1lbWJlciB0aGlzIGZvciBsYXRlciAqLwoKICAgICAgICBmb3IgKGxpc3QgPSBteXB0ci0+bmV4dDsgbGlzdCAhPSBOVUxMOyBsaXN0ID0gZnV0dXJlcHRyKSB7CiAgICAgICAgICAgIC8qIHJlbWVtYmVyIHRoZSBuZXh0IHNwb3QgaW4gdGhlIGxpc3QgaW4gY2FzZSB3ZSBmcmVlIHRoaXMgbm9kZSAqLwogICAgICAgICAgICBmdXR1cmVwdHIgPSBsaXN0LT5uZXh0OwoKICAgICAgICAgICAgLyogY2hlY2sgZWFjaCBjaGlsZCAqLwogICAgICAgICAgICBmb3IgKGNoaWxkID0gbGlzdCwgcHJldiA9IE5VTEw7IGNoaWxkICE9IE5VTEw7CiAgICAgICAgICAgICAgICAgcHJldiA9IGNoaWxkLCBjaGlsZCA9IGNoaWxkLT5jaGlsZHJlbikgewoKICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX29pZF9lcXVhbHMoY2hpbGQtPm5hbWVfYSwgY2hpbGQtPm5hbWVsZW4sIAoJCQkJICAgICAgbmFtZSwgbGVuKSA9PSAwICYmCiAgICAgICAgICAgICAgICAgICAgKGNoaWxkLT5wcmlvcml0eSA9PSBwcmlvcml0eSkpIHsKICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfdW5sb2FkKGNoaWxkLCBwcmV2LCBjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfZnJlZShjaGlsZCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIFhYWDogd2poOiBub3Qgc3VyZSB3aHkgd2UncmUgYmFpbGluZyBoZXJlICovCiAgICAgICAgICAgIGlmIChjaGlsZCA9PSBOVUxMKSB7ICAgICAgICAvKiBEaWRuJ3QgZmluZCB0aGUgZ2l2ZW4gbmFtZSAqLwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2ZyZWUobXlwdHIpOwogICAgfQoKICAgIG5hbWVbdmFyX3N1YmlkIC0gMV0gPSByYW5nZV9sYm91bmQ7CiAgICBtZW1zZXQoJnJlZ19wYXJtcywgMHgwLCBzaXplb2YocmVnX3Bhcm1zKSk7CiAgICByZWdfcGFybXMubmFtZSA9IG5hbWU7CiAgICByZWdfcGFybXMubmFtZWxlbiA9IGxlbjsKICAgIHJlZ19wYXJtcy5wcmlvcml0eSA9IHByaW9yaXR5OwogICAgcmVnX3Bhcm1zLnJhbmdlX3N1YmlkID0gdmFyX3N1YmlkOwogICAgcmVnX3Bhcm1zLnJhbmdlX3Vib3VuZCA9IHJhbmdlX3Vib3VuZDsKICAgIHJlZ19wYXJtcy5mbGFncyA9IDB4MDA7ICAgICAvKiAgdGhpcyBpcyBva2F5IEkgdGhpbmsgICovCiAgICByZWdfcGFybXMuY29udGV4dE5hbWUgPSBjb250ZXh0OwogICAgc25tcF9jYWxsX2NhbGxiYWNrcyhTTk1QX0NBTExCQUNLX0FQUExJQ0FUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICBTTk1QRF9DQUxMQkFDS19VTlJFR0lTVEVSX09JRCwgJnJlZ19wYXJtcyk7CgogICAgcmV0dXJuIDA7Cn0KCmludAp1bnJlZ2lzdGVyX21pYl9yYW5nZShvaWQgKiBuYW1lLCBzaXplX3QgbGVuLCBpbnQgcHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgIGludCByYW5nZV9zdWJpZCwgb2lkIHJhbmdlX3Vib3VuZCkKewogICAgcmV0dXJuIHVucmVnaXN0ZXJfbWliX2NvbnRleHQobmFtZSwgbGVuLCBwcmlvcml0eSwgcmFuZ2Vfc3ViaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV91Ym91bmQsICIiKTsKfQoKaW50CnVucmVnaXN0ZXJfbWliX3ByaW9yaXR5KG9pZCAqIG5hbWUsIHNpemVfdCBsZW4sIGludCBwcmlvcml0eSkKewogICAgcmV0dXJuIHVucmVnaXN0ZXJfbWliX3JhbmdlKG5hbWUsIGxlbiwgcHJpb3JpdHksIDAsIDApOwp9CgppbnQKdW5yZWdpc3Rlcl9taWIob2lkICogbmFtZSwgc2l6ZV90IGxlbikKewogICAgcmV0dXJuIHVucmVnaXN0ZXJfbWliX3ByaW9yaXR5KG5hbWUsIGxlbiwgREVGQVVMVF9NSUJfUFJJT1JJVFkpOwp9Cgp2b2lkCnVucmVnaXN0ZXJfbWlic19ieV9zZXNzaW9uKG5ldHNubXBfc2Vzc2lvbiAqIHNzKQp7CiAgICBuZXRzbm1wX3N1YnRyZWUgKmxpc3QsICpsaXN0MjsKICAgIG5ldHNubXBfc3VidHJlZSAqY2hpbGQsICpwcmV2LCAqbmV4dF9jaGlsZDsKICAgIHN0cnVjdCByZWdpc3Rlcl9wYXJhbWV0ZXJzIHJwOwogICAgc3VidHJlZV9jb250ZXh0X2NhY2hlICpjb250ZXh0cHRyOwoKICAgIERFQlVHTVNHVEwoKCJyZWdpc3Rlcl9taWIiLCAidW5yZWdpc3Rlcl9taWJzX2J5X3Nlc3Npb24oJXApIGN0eHQgXCIlc1wiXG4iLAoJCXNzLCAoc3MgJiYgc3MtPmNvbnRleHROYW1lKSA/IHNzLT5jb250ZXh0TmFtZSA6ICJbTklMXSIpKTsKCiAgICBmb3IgKGNvbnRleHRwdHIgPSBnZXRfdG9wX2NvbnRleHRfY2FjaGUoKTsgY29udGV4dHB0ciAhPSBOVUxMOwogICAgICAgICBjb250ZXh0cHRyID0gY29udGV4dHB0ci0+bmV4dCkgewogICAgICAgIGZvciAobGlzdCA9IGNvbnRleHRwdHItPmZpcnN0X3N1YnRyZWU7IGxpc3QgIT0gTlVMTDsgbGlzdCA9IGxpc3QyKSB7CiAgICAgICAgICAgIGxpc3QyID0gbGlzdC0+bmV4dDsKCiAgICAgICAgICAgIGZvciAoY2hpbGQgPSBsaXN0LCBwcmV2ID0gTlVMTDsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBuZXh0X2NoaWxkKXsKICAgICAgICAgICAgICAgIG5leHRfY2hpbGQgPSBjaGlsZC0+Y2hpbGRyZW47CgogICAgICAgICAgICAgICAgaWYgKCgoIXNzIHx8IHNzLT5mbGFncyAmIFNOTVBfRkxBR1NfU1VCU0VTU0lPTikgJiYKCQkgICAgIGNoaWxkLT5zZXNzaW9uID09IHNzKSB8fAogICAgICAgICAgICAgICAgICAgICghKCFzcyB8fCBzcy0+ZmxhZ3MgJiBTTk1QX0ZMQUdTX1NVQlNFU1NJT04pICYmIGNoaWxkLT5zZXNzaW9uICYmCiAgICAgICAgICAgICAgICAgICAgIGNoaWxkLT5zZXNzaW9uLT5zdWJzZXNzaW9uID09IHNzKSkgewoKICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJnJwLDB4MCxzaXplb2YocnApKTsKICAgICAgICAgICAgICAgICAgICBycC5uYW1lID0gY2hpbGQtPm5hbWVfYTsKCQkgICAgY2hpbGQtPm5hbWVfYSA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgcnAubmFtZWxlbiA9IGNoaWxkLT5uYW1lbGVuOwogICAgICAgICAgICAgICAgICAgIHJwLnByaW9yaXR5ID0gY2hpbGQtPnByaW9yaXR5OwogICAgICAgICAgICAgICAgICAgIHJwLnJhbmdlX3N1YmlkID0gY2hpbGQtPnJhbmdlX3N1YmlkOwogICAgICAgICAgICAgICAgICAgIHJwLnJhbmdlX3Vib3VuZCA9IGNoaWxkLT5yYW5nZV91Ym91bmQ7CiAgICAgICAgICAgICAgICAgICAgcnAudGltZW91dCA9IGNoaWxkLT50aW1lb3V0OwogICAgICAgICAgICAgICAgICAgIHJwLmZsYWdzID0gY2hpbGQtPmZsYWdzOwogICAgICAgICAgICAgICAgICAgIGlmICgoTlVMTCAhPSBjaGlsZC0+cmVnaW5mbykgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKE5VTEwgIT0gY2hpbGQtPnJlZ2luZm8tPmNvbnRleHROYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgcnAuY29udGV4dE5hbWUgPSBjaGlsZC0+cmVnaW5mby0+Y29udGV4dE5hbWU7CgogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+cmVnaW5mbyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICAqIERvbid0IGxldCdzIGZyZWUgdGhlIHNlc3Npb24gcG9pbnRlciBqdXN0IHlldCEgIAogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQtPnJlZ2luZm8tPmhhbmRsZXItPm15dm9pZCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb25fZnJlZShjaGlsZC0+cmVnaW5mbyk7CgkJCWNoaWxkLT5yZWdpbmZvID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV91bmxvYWQoY2hpbGQsIHByZXYsIGNvbnRleHRwdHItPmNvbnRleHRfbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2ZyZWUoY2hpbGQpOwoKICAgICAgICAgICAgICAgICAgICBzbm1wX2NhbGxfY2FsbGJhY2tzKFNOTVBfQ0FMTEJBQ0tfQVBQTElDQVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTk1QRF9DQUxMQkFDS19VTlJFR0lTVEVSX09JRCwgJnJwKTsKCQkgICAgU05NUF9GUkVFKHJwLm5hbWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwcmV2ID0gY2hpbGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2pvaW4oY29udGV4dHB0ci0+Zmlyc3Rfc3VidHJlZSk7CiAgICB9Cn0KCi8qCiAqIGluX2FfdmlldzogZGV0ZXJtaW5lcyBpZiBhIGdpdmVuIHNubXBfcGR1IGlzIGFsbG93ZWQgdG8gc2VlIGEKICogZ2l2ZW4gbmFtZS9uYW1lbGVuIE9JRCBwb2ludGVyCiAqIG5hbWUgICAgICAgICBJTiAtIG5hbWUgb2YgdmFyLCBPVVQgLSBuYW1lIG1hdGNoZWQKICogbmFtZUxlbiAgICAgIElOIC1udW1iZXIgb2Ygc3ViLWlkcyBpbiBuYW1lLCBPVVQgLSBzdWJpZC1pcyBpbiBtYXRjaGVkIG5hbWUKICogcGkgICAgICAgICAgIElOIC0gcmVsZXZhbnQgYXV0aCBpbmZvIHJlIFBEVSAKICogY3ZwICAgICAgICAgIElOIC0gcmVsZXZhbnQgYXV0aCBpbmZvIHJlIG1pYiBtb2R1bGUKICovCgppbnQKaW5fYV92aWV3KG9pZCAqbmFtZSwgc2l6ZV90ICpuYW1lbGVuLCBuZXRzbm1wX3BkdSAqcGR1LCBpbnQgdHlwZSkKewogICAgc3RydWN0IHZpZXdfcGFyYW1ldGVycyB2aWV3X3Bhcm1zOwoKICAgIGlmIChwZHUtPmZsYWdzICYgVUNEX01TR19GTEFHX0FMV0FZU19JTl9WSUVXKSB7CgkvKiBFbmFibGUgYnlwYXNzaW5nIG9mIHZpZXctYmFzZWQgYWNjZXNzIGNvbnRyb2wgKi8KICAgICAgICByZXR1cm4gVkFDTV9TVUNDRVNTOwogICAgfQoKICAgIC8qCiAgICAgKiBjaGVjayBmb3IgdjEgYW5kIGNvdW50ZXI2NHMsIHNpbmNlIHNubXB2MSBkb2Vzbid0IHN1cHBvcnQgaXQgCiAgICAgKi8KI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfU05NUFYxCiAgICBpZiAocGR1LT52ZXJzaW9uID09IFNOTVBfVkVSU0lPTl8xICYmIHR5cGUgPT0gQVNOX0NPVU5URVI2NCkgewogICAgICAgIHJldHVybiBWQUNNX05PVElOVklFVzsKICAgIH0KI2VuZGlmCgogICAgdmlld19wYXJtcy5wZHUgPSBwZHU7CiAgICB2aWV3X3Bhcm1zLm5hbWUgPSBuYW1lOwogICAgaWYgKG5hbWVsZW4gIT0gTlVMTCkgewogICAgICAgIHZpZXdfcGFybXMubmFtZWxlbiA9ICpuYW1lbGVuOwogICAgfSBlbHNlIHsKICAgICAgICB2aWV3X3Bhcm1zLm5hbWVsZW4gPSAwOwogICAgfQogICAgdmlld19wYXJtcy5lcnJvcmNvZGUgPSAwOwogICAgdmlld19wYXJtcy5jaGVja19zdWJ0cmVlID0gMDsKCiAgICBzd2l0Y2ggKHBkdS0+dmVyc2lvbikgewojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9TTk1QVjEKICAgIGNhc2UgU05NUF9WRVJTSU9OXzE6CiNlbmRpZgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9TTk1QVjJDCiAgICBjYXNlIFNOTVBfVkVSU0lPTl8yYzoKI2VuZGlmCiAgICBjYXNlIFNOTVBfVkVSU0lPTl8zOgogICAgICAgIHNubXBfY2FsbF9jYWxsYmFja3MoU05NUF9DQUxMQkFDS19BUFBMSUNBVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBEX0NBTExCQUNLX0FDTV9DSEVDSywgJnZpZXdfcGFybXMpOwogICAgICAgIHJldHVybiB2aWV3X3Bhcm1zLmVycm9yY29kZTsKICAgIH0KICAgIHJldHVybiBWQUNNX05PU0VDTkFNRTsKfQoKLyoKICogY2hlY2tfYWNjZXM6IGRldGVybWluZXMgaWYgYSBnaXZlbiBzbm1wX3BkdSBpcyBldmVyIGdvaW5nIHRvIGJlCiAqIGFsbG93ZWQgdG8gZG8gYW55bnRoaW5nIG9yIGlmIGl0J3Mgbm90IGdvaW5nIHRvIGV2ZXIgYmUKICogYXV0aGVudGljYXRlZC4KICovCmludApjaGVja19hY2Nlc3MobmV0c25tcF9wZHUgKnBkdSkKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJTiAtIHBkdSBiZWluZyBjaGVja2VkICovCiAgICBzdHJ1Y3Qgdmlld19wYXJhbWV0ZXJzIHZpZXdfcGFybXM7CiAgICB2aWV3X3Bhcm1zLnBkdSA9IHBkdTsKICAgIHZpZXdfcGFybXMubmFtZSA9IE5VTEw7CiAgICB2aWV3X3Bhcm1zLm5hbWVsZW4gPSAwOwogICAgdmlld19wYXJtcy5lcnJvcmNvZGUgPSAwOwogICAgdmlld19wYXJtcy5jaGVja19zdWJ0cmVlID0gMDsKCiAgICBpZiAocGR1LT5mbGFncyAmIFVDRF9NU0dfRkxBR19BTFdBWVNfSU5fVklFVykgewoJLyogRW5hYmxlIGJ5cGFzc2luZyBvZiB2aWV3LWJhc2VkIGFjY2VzcyBjb250cm9sICovCiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgc3dpdGNoIChwZHUtPnZlcnNpb24pIHsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfU05NUFYxCiAgICBjYXNlIFNOTVBfVkVSU0lPTl8xOgojZW5kaWYKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfU05NUFYyQwogICAgY2FzZSBTTk1QX1ZFUlNJT05fMmM6CiNlbmRpZgogICAgY2FzZSBTTk1QX1ZFUlNJT05fMzoKICAgICAgICBzbm1wX2NhbGxfY2FsbGJhY2tzKFNOTVBfQ0FMTEJBQ0tfQVBQTElDQVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTk1QRF9DQUxMQkFDS19BQ01fQ0hFQ0tfSU5JVElBTCwgJnZpZXdfcGFybXMpOwogICAgICAgIHJldHVybiB2aWV3X3Bhcm1zLmVycm9yY29kZTsKICAgIH0KICAgIHJldHVybiAxOwp9CgovKiogY2hlY2tzIHRvIHNlZSBpZiBldmVyeXRoaW5nIHdpdGhpbiBhCiAqICBnaXZlbiBzdWJ0cmVlIGlzIGVpdGhlcjogaW4gdmlldywgbm90IGluIHZpZXcsIG9yIHBvc3NpYmx5IGJvdGguCiAqICBJZiB0aGUgZW50aXJlIHN1YnRyZWUgaXMgbm90LWluLXZpZXcgd2UgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvCiAqICBza2lwIGNhbGxpbmcgdGhlIHN1Yi1oYW5kbGVycyBlbnRpcmVseS4KICogIEByZXR1cm5zIDAgaWYgZW50aXJlIHN1YnRyZWUgaXMgYWNjZXNzaWJsZSwgNSBpZiBub3QgYW5kIDcgaWYKICogIHBvcnRpb25zIGFyZSBib3RoLiAgMSBvbiBlcnJvciAoaWxsZWdhbCBwZHUgdmVyc2lvbikuCiAqLwppbnQKbmV0c25tcF9hY21fY2hlY2tfc3VidHJlZShuZXRzbm1wX3BkdSAqcGR1LCBvaWQgKm5hbWUsIHNpemVfdCBuYW1lbGVuKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElOIC0gcGR1IGJlaW5nIGNoZWNrZWQgKi8KICAgIHN0cnVjdCB2aWV3X3BhcmFtZXRlcnMgdmlld19wYXJtczsKICAgIHZpZXdfcGFybXMucGR1ID0gcGR1OwogICAgdmlld19wYXJtcy5uYW1lID0gbmFtZTsKICAgIHZpZXdfcGFybXMubmFtZWxlbiA9IG5hbWVsZW47CiAgICB2aWV3X3Bhcm1zLmVycm9yY29kZSA9IDA7CiAgICB2aWV3X3Bhcm1zLmNoZWNrX3N1YnRyZWUgPSAxOwoKICAgIGlmIChwZHUtPmZsYWdzICYgVUNEX01TR19GTEFHX0FMV0FZU19JTl9WSUVXKSB7CgkvKiBFbmFibGUgYnlwYXNzaW5nIG9mIHZpZXctYmFzZWQgYWNjZXNzIGNvbnRyb2wgKi8KICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBzd2l0Y2ggKHBkdS0+dmVyc2lvbikgewojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9TTk1QVjEKICAgIGNhc2UgU05NUF9WRVJTSU9OXzE6CiNlbmRpZgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9TTk1QVjJDCiAgICBjYXNlIFNOTVBfVkVSU0lPTl8yYzoKI2VuZGlmCiAgICBjYXNlIFNOTVBfVkVSU0lPTl8zOgogICAgICAgIHNubXBfY2FsbF9jYWxsYmFja3MoU05NUF9DQUxMQkFDS19BUFBMSUNBVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBEX0NBTExCQUNLX0FDTV9DSEVDS19TVUJUUkVFLCAmdmlld19wYXJtcyk7CiAgICAgICAgcmV0dXJuIHZpZXdfcGFybXMuZXJyb3Jjb2RlOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCm5ldHNubXBfc3VidHJlZSAqCm5ldHNubXBfc3VidHJlZV9maW5kX3ByZXYob2lkICpuYW1lLCBzaXplX3QgbGVuLCBuZXRzbm1wX3N1YnRyZWUgKnN1YnRyZWUsCgkJCSAgY29uc3QgY2hhciAqY29udGV4dF9uYW1lKQp7CiAgICBsb29rdXBfY2FjaGUgKmxvb2t1cF9jYWNoZSA9IE5VTEw7CiAgICBuZXRzbm1wX3N1YnRyZWUgKm15cHRyID0gTlVMTCwgKnByZXZpb3VzID0gTlVMTDsKICAgIGludCBjbXAgPSAxOwogICAgc2l6ZV90IGxsX29mZiA9IDA7CgogICAgaWYgKHN1YnRyZWUpIHsKICAgICAgICBteXB0ciA9IHN1YnRyZWU7CiAgICB9IGVsc2UgewoJLyogbG9vayB0aHJvdWdoIGV2ZXJ5dGhpbmcgKi8KICAgICAgICBpZiAobG9va3VwX2NhY2hlX3NpemUpIHsKICAgICAgICAgICAgbG9va3VwX2NhY2hlID0gbG9va3VwX2NhY2hlX2ZpbmQoY29udGV4dF9uYW1lLCBuYW1lLCBsZW4sICZjbXApOwogICAgICAgICAgICBpZiAobG9va3VwX2NhY2hlKSB7CiAgICAgICAgICAgICAgICBteXB0ciA9IGxvb2t1cF9jYWNoZS0+bmV4dDsKICAgICAgICAgICAgICAgIHByZXZpb3VzID0gbG9va3VwX2NhY2hlLT5wcmV2aW91czsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW15cHRyKQogICAgICAgICAgICAgICAgbXlwdHIgPSBuZXRzbm1wX3N1YnRyZWVfZmluZF9maXJzdChjb250ZXh0X25hbWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG15cHRyID0gbmV0c25tcF9zdWJ0cmVlX2ZpbmRfZmlyc3QoY29udGV4dF9uYW1lKTsKICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIHRoaXMgb3B0aW1pemF0aW9uIGNhdXNlcyBhIHNlZ2ZhdWx0IG9uIHNmIGNmIGFscGhhLWxpbnV4MS4KICAgICAqIGlmZGVmIG91dCB1bnRpbCBzb21lb25lIGZpZ3VyZXMgb3V0IHdoeSBhbmQgZml4ZXMgaXQuIHh4eC1ya3MgMjAwNTExMTcKICAgICAqLwojaWZuZGVmIF9fYWxwaGEKI2RlZmluZSBXVEVTVF9PUFRJTUlaQVRJT04gMQojZW5kaWYKI2lmZGVmIFdURVNUX09QVElNSVpBVElPTgogICAgREVCVUdNU0dUTCgoInd0ZXN0Iiwib2lkIGluOiAiKSk7CiAgICBERUJVR01TR09JRCgoInd0ZXN0IiwgbmFtZSwgbGVuKSk7CiAgICBERUJVR01TRygoInd0ZXN0IiwiXG4iKSk7CiNlbmRpZgogICAgZm9yICg7IG15cHRyICE9IE5VTEw7IHByZXZpb3VzID0gbXlwdHIsIG15cHRyID0gbXlwdHItPm5leHQpIHsKI2lmZGVmIFdURVNUX09QVElNSVpBVElPTgogICAgICAgIC8qIENvbXBhcmUgdGhlIGluY29taW5nIG9pZCB3aXRoIHRoZSBsaW5rZWQgbGlzdC4gIElmIHdlIGhhdmUKICAgICAgICAgICByZXN1bHRzIG9mIHByZXZpb3VzIGNvbXBhcmVzLCBpdHMgZmFzdGVyIHRvIG1ha2Ugc3VyZSB0aGUKICAgICAgICAgICBsZW5ndGggd2UgZGlmZmVyZWQgaW4gdGhlIGxhc3QgY2hlY2sgaXMgZ3JlYXRlciB0aGFuIHRoZQogICAgICAgICAgIGxlbmd0aCBiZXR3ZWVuIHRoaXMgcG9pbnRlciBhbmQgdGhlIGxhc3QgdGhlbiB3ZSBkb24ndCBuZWVkCiAgICAgICAgICAgdG8gYWN0dWFsbHkgcGVyZm9ybSBhIGNvbXBhcmlzb24gKi8KICAgICAgICBERUJVR01TR1RMKCgid3Rlc3QiLCJvaWQgY21wOiAiKSk7CiAgICAgICAgREVCVUdNU0dPSUQoKCJ3dGVzdCIsIG15cHRyLT5zdGFydF9hLCBteXB0ci0+c3RhcnRfbGVuKSk7CiAgICAgICAgREVCVUdNU0coKCJ3dGVzdCIsIiAgLS0tIG9mZiA9ICVsdSwgaW4gb2ZmID0gJWx1IHRlc3QgPSAlZFxuIiwKICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpbXlwdHItPm9pZF9vZmYsICh1bnNpZ25lZCBsb25nKWxsX29mZiwKICAgICAgICAgICAgICAgICAgIShsbF9vZmYgJiYgbXlwdHItPm9pZF9vZmYgJiYKICAgICAgICAgICAgICAgICAgICBteXB0ci0+b2lkX29mZiA+IGxsX29mZikpKTsKICAgICAgICBpZiAoIShsbF9vZmYgJiYgbXlwdHItPm9pZF9vZmYgJiYgbXlwdHItPm9pZF9vZmYgPiBsbF9vZmYpICYmCiAgICAgICAgICAgIG5ldHNubXBfb2lkX2NvbXBhcmVfbGwobmFtZSwgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15cHRyLT5zdGFydF9hLCBteXB0ci0+c3RhcnRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsbF9vZmYpIDwgMCkgewojZWxzZQogICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlKG5hbWUsIGxlbiwgbXlwdHItPnN0YXJ0X2EsIG15cHRyLT5zdGFydF9sZW4pIDwgMCkgewojZW5kaWYKICAgICAgICAgICAgaWYgKGxvb2t1cF9jYWNoZV9zaXplICYmIHByZXZpb3VzICYmIGNtcCkgewogICAgICAgICAgICAgICAgaWYgKGxvb2t1cF9jYWNoZSkgewogICAgICAgICAgICAgICAgICAgIGxvb2t1cF9jYWNoZV9yZXBsYWNlKGxvb2t1cF9jYWNoZSwgbXlwdHIsIHByZXZpb3VzKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbG9va3VwX2NhY2hlX2FkZChjb250ZXh0X25hbWUsIG15cHRyLCBwcmV2aW91cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBwcmV2aW91czsKfQoKbmV0c25tcF9zdWJ0cmVlICoKbmV0c25tcF9zdWJ0cmVlX2ZpbmRfbmV4dChvaWQgKm5hbWUsIHNpemVfdCBsZW4sCgkJCSAgbmV0c25tcF9zdWJ0cmVlICpzdWJ0cmVlLCBjb25zdCBjaGFyICpjb250ZXh0X25hbWUpCnsKICAgIG5ldHNubXBfc3VidHJlZSAqbXlwdHIgPSBOVUxMOwoKICAgIG15cHRyID0gbmV0c25tcF9zdWJ0cmVlX2ZpbmRfcHJldihuYW1lLCBsZW4sIHN1YnRyZWUsIGNvbnRleHRfbmFtZSk7CgogICAgaWYgKG15cHRyICE9IE5VTEwpIHsKICAgICAgICBteXB0ciA9IG15cHRyLT5uZXh0OwogICAgICAgIHdoaWxlIChteXB0ciAhPSBOVUxMICYmIChteXB0ci0+dmFyaWFibGVzID09IE5VTEwgfHwgCgkJCQkgbXlwdHItPnZhcmlhYmxlc19sZW4gPT0gMCkpIHsKICAgICAgICAgICAgbXlwdHIgPSBteXB0ci0+bmV4dDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG15cHRyOwogICAgfSBlbHNlIGlmIChzdWJ0cmVlICE9IE5VTEwgJiYgc25tcF9vaWRfY29tcGFyZShuYW1lLCBsZW4sIAoJCQkJICAgc3VidHJlZS0+c3RhcnRfYSwgc3VidHJlZS0+c3RhcnRfbGVuKSA8IDApIHsKICAgICAgICByZXR1cm4gc3VidHJlZTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9Cn0KCm5ldHNubXBfc3VidHJlZSAqCm5ldHNubXBfc3VidHJlZV9maW5kKG9pZCAqbmFtZSwgc2l6ZV90IGxlbiwgbmV0c25tcF9zdWJ0cmVlICpzdWJ0cmVlLCAKCQkgICAgIGNvbnN0IGNoYXIgKmNvbnRleHRfbmFtZSkKewogICAgbmV0c25tcF9zdWJ0cmVlICpteXB0cjsKCiAgICBteXB0ciA9IG5ldHNubXBfc3VidHJlZV9maW5kX3ByZXYobmFtZSwgbGVuLCBzdWJ0cmVlLCBjb250ZXh0X25hbWUpOwogICAgaWYgKG15cHRyICYmIG15cHRyLT5lbmRfYSAmJgogICAgICAgIHNubXBfb2lkX2NvbXBhcmUobmFtZSwgbGVuLCBteXB0ci0+ZW5kX2EsIG15cHRyLT5lbmRfbGVuKTwwKSB7CiAgICAgICAgcmV0dXJuIG15cHRyOwogICAgfQoKICAgIHJldHVybiBOVUxMOwp9CgpuZXRzbm1wX3Nlc3Npb24gKgpnZXRfc2Vzc2lvbl9mb3Jfb2lkKG9pZCAqbmFtZSwgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqY29udGV4dF9uYW1lKQp7CiAgICBuZXRzbm1wX3N1YnRyZWUgKm15cHRyOwoKICAgIG15cHRyID0gbmV0c25tcF9zdWJ0cmVlX2ZpbmRfcHJldihuYW1lLCBsZW4sIAoJCQkJICAgICAgbmV0c25tcF9zdWJ0cmVlX2ZpbmRfZmlyc3QoY29udGV4dF9uYW1lKSwKCQkJCSAgICAgIGNvbnRleHRfbmFtZSk7CgogICAgd2hpbGUgKG15cHRyICYmIG15cHRyLT52YXJpYWJsZXMgPT0gTlVMTCkgewogICAgICAgIG15cHRyID0gbXlwdHItPm5leHQ7CiAgICB9CgogICAgaWYgKG15cHRyID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG15cHRyLT5zZXNzaW9uOwogICAgfQp9Cgp2b2lkCnNldHVwX3RyZWUodm9pZCkKewogICAgb2lkIGNjaXR0WzFdICAgICAgICAgICA9IHsgMCB9OwogICAgb2lkIGlzb1sxXSAgICAgICAgICAgICA9IHsgMSB9OwogICAgb2lkIGpvaW50X2NjaXR0X2lzb1sxXSA9IHsgMiB9OwoKI2lmZGVmIFVTSU5HX0FHRU5UWF9TVUJBR0VOVF9NT0RVTEUKICAgIGludCByb2xlID0gIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICAgICAgTkVUU05NUF9EU19BR0VOVF9ST0xFKTsKCiAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIE5FVFNOTVBfRFNfQUdFTlRfUk9MRSwgCgkJCSAgIE1BU1RFUl9BR0VOVCk7CiNlbmRpZgoKICAgIC8qIAogICAgICogd2UgbmVlZCB0byBoYXZlIHRoZSBvaWQncyBpbiB0aGUgaGVhcCwgdGhhdCB3ZSBjYW4gKmZyZWUqIGl0IGZvciBldmVyeSBjYXNlLCAKICAgICAqIHRoYXRzIHRoZSBwdXJwb3NlIG9mIHRoZSBkdXBsaWNhdGVfb2JqaWQncwogICAgICovCiAgICBuZXRzbm1wX3JlZ2lzdGVyX251bGwoc25tcF9kdXBsaWNhdGVfb2JqaWQoY2NpdHQsIDEpLCAxKTsKICAgIG5ldHNubXBfcmVnaXN0ZXJfbnVsbChzbm1wX2R1cGxpY2F0ZV9vYmppZChpc28sIDEpLCAxKTsKICAgIG5ldHNubXBfcmVnaXN0ZXJfbnVsbChzbm1wX2R1cGxpY2F0ZV9vYmppZChqb2ludF9jY2l0dF9pc28sIDEpLCAxKTsKCiNpZmRlZiBVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFCiAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIE5FVFNOTVBfRFNfQUdFTlRfUk9MRSwgCgkJCSAgIHJvbGUpOwojZW5kaWYKfQoKaW50IApyZW1vdmVfdHJlZV9lbnRyeSAob2lkICpuYW1lLCBzaXplX3QgbGVuKSB7CgogICAgbmV0c25tcF9zdWJ0cmVlICpzdWIgPSBOVUxMOwoKICAgIGlmICgoc3ViID0gbmV0c25tcF9zdWJ0cmVlX2ZpbmQobmFtZSwgbGVuLCBOVUxMLCAiIikpID09IE5VTEwpIHsKCXJldHVybiBNSUJfTk9fU1VDSF9SRUdJU1RSQVRJT047CiAgICB9CgogICAgcmV0dXJuIHVucmVnaXN0ZXJfbWliX2NvbnRleHQobmFtZSwgbGVuLCBzdWItPnByaW9yaXR5LAoJCQkJICBzdWItPnJhbmdlX3N1YmlkLCBzdWItPnJhbmdlX3Vib3VuZCwgIiIpOwoKfQoKCnZvaWQKc2h1dGRvd25fdHJlZSh2b2lkKSB7CiAgICBvaWQgY2NpdHRbMV0gICAgICAgICAgID0geyAwIH07CiAgICBvaWQgaXNvWzFdICAgICAgICAgICAgID0geyAxIH07CiAgICBvaWQgam9pbnRfY2NpdHRfaXNvWzFdID0geyAyIH07CgogICAgREVCVUdNU0dUTCgoImFnZW50X3JlZ2lzdHJ5IiwgInNodXQgZG93biB0cmVlXG4iKSk7CgogICAgcmVtb3ZlX3RyZWVfZW50cnkoam9pbnRfY2NpdHRfaXNvLCAxKTsKICAgIHJlbW92ZV90cmVlX2VudHJ5KGlzbywgMSk7CiAgICByZW1vdmVfdHJlZV9lbnRyeShjY2l0dCwgMSk7Cgp9Cgp2b2lkCmNsZWFyX3N1YnRyZWUgKG5ldHNubXBfc3VidHJlZSAqc3ViKSB7CgogICAgbmV0c25tcF9zdWJ0cmVlICpjOwogICAgCiAgICBpZiAoc3ViID09IE5VTEwpCglyZXR1cm47CgogICAgZm9yKGMgPSBzdWI7IGM7KSB7CiAgICAgICAgc3ViID0gYzsKICAgICAgICBjID0gYy0+Y2hpbGRyZW47CiAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2ZyZWUoc3ViKTsKICAgIH0KCn0KCnZvaWQKY2xlYXJfbG9va3VwX2NhY2hlKHZvaWQpIHsKCiAgICBsb29rdXBfY2FjaGVfY29udGV4dCAqcHRyID0gTlVMTCwgKm5leHQgPSBOVUxMOwoKICAgIHB0ciA9IHRoZWNvbnRleHRjYWNoZTsKICAgIHdoaWxlIChwdHIpIHsKCW5leHQgPSBwdHItPm5leHQ7CglTTk1QX0ZSRUUocHRyLT5jb250ZXh0KTsKCVNOTVBfRlJFRShwdHIpOwoJcHRyID0gbmV4dDsKICAgIH0KICAgIHRoZWNvbnRleHRjYWNoZSA9IE5VTEw7IC8qICEhISAqLwp9Cgp2b2lkCmNsZWFyX2NvbnRleHQodm9pZCkgewoKICAgIHN1YnRyZWVfY29udGV4dF9jYWNoZSAqcHRyID0gTlVMTCwgKm5leHQgPSBOVUxMOwogICAgbmV0c25tcF9zdWJ0cmVlICp0LCAqdTsKCiAgICBERUJVR01TR1RMKCgiYWdlbnRfcmVnaXN0cnkiLCAiY2xlYXIgY29udGV4dFxuIikpOwoKICAgIHB0ciA9IGdldF90b3BfY29udGV4dF9jYWNoZSgpOyAKICAgIHdoaWxlIChwdHIpIHsKCW5leHQgPSBwdHItPm5leHQ7CgoJZm9yICh0ID0gcHRyLT5maXJzdF9zdWJ0cmVlOyB0OyB0ID0gdSkgewogICAgICAgICAgICB1ID0gdC0+bmV4dDsKCSAgICBjbGVhcl9zdWJ0cmVlKHQpOwoJfQoKCVNOTVBfRlJFRShwdHItPmNvbnRleHRfbmFtZSk7CiAgICAgICAgU05NUF9GUkVFKHB0cik7CgoJcHRyID0gbmV4dDsKICAgIH0KICAgIGNvbnRleHRfc3VidHJlZXMgPSBOVUxMOyAvKiAhISEgKi8KICAgIGNsZWFyX2xvb2t1cF9jYWNoZSgpOwp9CgpleHRlcm4gdm9pZCAgICAgZHVtcF9pZHhfcmVnaXN0cnkodm9pZCk7CnZvaWQKZHVtcF9yZWdpc3RyeSh2b2lkKQp7CiAgICBzdHJ1Y3QgdmFyaWFibGUgKnZwID0gTlVMTDsKICAgIG5ldHNubXBfc3VidHJlZSAqbXlwdHIsICpteXB0cjI7CiAgICB1X2NoYXIgKnMgPSBOVUxMLCAqZSA9IE5VTEwsICp2ID0gTlVMTDsKICAgIHNpemVfdCBzbCA9IDI1NiwgZWwgPSAyNTYsIHZsID0gMjU2LCBzbF9vID0gMCwgZWxfbyA9IDAsIHZsX28gPSAwOwogICAgaW50IGkgPSAwOwoKICAgIGlmICgocyA9ICh1X2NoYXIgKikgY2FsbG9jKHNsLCAxKSkgIT0gTlVMTCAmJgogICAgICAgIChlID0gKHVfY2hhciAqKSBjYWxsb2Moc2wsIDEpKSAhPSBOVUxMICYmCiAgICAgICAgKHYgPSAodV9jaGFyICopIGNhbGxvYyhzbCwgMSkpICE9IE5VTEwpIHsKCiAgICAgICAgc3VidHJlZV9jb250ZXh0X2NhY2hlICpwdHI7CiAgICAgICAgZm9yIChwdHIgPSBjb250ZXh0X3N1YnRyZWVzOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgewogICAgICAgICAgICBwcmludGYoIlN1YnRyZWVzIGZvciBDb250ZXh0OiAlc1xuIiwgcHRyLT5jb250ZXh0X25hbWUpOwogICAgICAgICAgICBmb3IgKG15cHRyID0gcHRyLT5maXJzdF9zdWJ0cmVlOyBteXB0ciAhPSBOVUxMOwogICAgICAgICAgICAgICAgIG15cHRyID0gbXlwdHItPm5leHQpIHsKICAgICAgICAgICAgICAgIHNsX28gPSBlbF9vID0gdmxfbyA9IDA7CgogICAgICAgICAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19vYmppZCgmcywgJnNsLCAmc2xfbywgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlwdHItPnN0YXJ0X2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15cHRyLT5zdGFydF9sZW4pKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX29iamlkKCZlLCAmZWwsICZlbF9vLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteXB0ci0+ZW5kX2EsCgkJCQkJICBteXB0ci0+ZW5kX2xlbikpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobXlwdHItPnZhcmlhYmxlcykgewogICAgICAgICAgICAgICAgICAgIHByaW50ZigiJTAyeCAoICVzIC0gJXMgKSBbIiwgbXlwdHItPmZsYWdzLCBzLCBlKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCB2cCA9IG15cHRyLT52YXJpYWJsZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICBpIDwgbXlwdHItPnZhcmlhYmxlc19sZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2bF9vID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19vYmppZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCZ2LCAmdmwsICZ2bF9vLCAxLCB2cC0+bmFtZSwgdnAtPm5hbWVsZW4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzLCAiLCB2KTsKICAgICAgICAgICAgICAgICAgICAgICAgdnAgPSAoc3RydWN0IHZhcmlhYmxlICopICgoY2hhciAqKSB2cCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlwdHItPnZhcmlhYmxlc193aWR0aCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHByaW50ZigiXVxuIik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHByaW50ZigiJTAyeCAgICVzIC0gJXMgIFxuIiwgbXlwdHItPmZsYWdzLCBzLCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAobXlwdHIyID0gbXlwdHI7IG15cHRyMiAhPSBOVUxMOwogICAgICAgICAgICAgICAgICAgICBteXB0cjIgPSBteXB0cjItPmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG15cHRyMi0+bGFiZWxfYSAmJiBteXB0cjItPmxhYmVsX2FbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChteXB0cjItPmxhYmVsX2EsICJvbGRfYXBpIikgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZhcmlhYmxlICp2cCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlwdHIyLT5yZWdpbmZvLT5oYW5kbGVyLT5teXZvaWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19vYmppZCgmcywgJnNsLCAmc2xfbywgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwLT5uYW1lLCB2cC0+bmFtZWxlbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXHQlc1slc10gJXAgdmFyICVzXG4iLCBteXB0cjItPmxhYmVsX2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlwdHIyLT5yZWdpbmZvLT5oYW5kbGVyTmFtZSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlwdHIyLT5yZWdpbmZvLT5oYW5kbGVyTmFtZSA6ICJuby1uYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteXB0cjItPnJlZ2luZm8sIHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcdCVzICVzICVwXG4iLCBteXB0cjItPmxhYmVsX2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlwdHIyLT5yZWdpbmZvLT5oYW5kbGVyTmFtZSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlwdHIyLT5yZWdpbmZvLT5oYW5kbGVyTmFtZSA6ICJuby1oYW5kbGVyLW5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15cHRyMi0+cmVnaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKHMgIT0gTlVMTCkgewogICAgICAgIFNOTVBfRlJFRShzKTsKICAgIH0KICAgIGlmIChlICE9IE5VTEwpIHsKICAgICAgICBTTk1QX0ZSRUUoZSk7CiAgICB9CiAgICBpZiAodiAhPSBOVUxMKSB7CiAgICAgICAgU05NUF9GUkVFKHYpOwogICAgfQoKICAgIGR1bXBfaWR4X3JlZ2lzdHJ5KCk7Cn0KCmludCAgICAgICAgICAgICBleHRlcm5hbF9zaWduYWxfc2NoZWR1bGVkW05VTV9FWFRFUk5BTF9TSUdTXTsKdm9pZCAgICAgICAgICAgICgqZXh0ZXJuYWxfc2lnbmFsX2hhbmRsZXJbTlVNX0VYVEVSTkFMX1NJR1NdKSAoaW50KTsKCiNpZm5kZWYgV0lOMzIKCi8qCiAqIFRPRE86IGFkZCBhZ2VudF9TSUdYWFhfaGFuZGxlciBmdW5jdGlvbnMgYW5kIGBjYXNlIFNJR1hYWDogLi4uJyBsaW5lcwogKiAgICAgICBiZWxvdyBmb3IgZXZlcnkgc2luZ2xlIHRoYXQgbWlnaHQgYmUgaGFuZGxlZCBieSByZWdpc3Rlcl9zaWduYWwoKS4KICovCgpSRVRTSUdUWVBFCmFnZW50X1NJR0NITERfaGFuZGxlcihpbnQgc2lnKQp7CiAgICBleHRlcm5hbF9zaWduYWxfc2NoZWR1bGVkW1NJR0NITERdKys7CiNpZm5kZWYgSEFWRV9TSUdBQ1RJT04KICAgIC8qCiAgICAgKiBzaWduYWwoKSBzdWNrcy4gSXQgKm1pZ2h0KiBoYXZlIFN5c1Ygc2VtYW50aWNzLCB3aGljaCBtZWFucyB0aGF0CiAgICAgKiAqIGEgc2lnbmFsIGhhbmRsZXIgaXMgcmVzZXQgb25jZSBpdCBnZXRzIGNhbGxlZC4gRW5zdXJlIHRoYXQgaXQKICAgICAqICogcmVtYWlucyBhY3RpdmUuCiAgICAgKi8KICAgIHNpZ25hbChTSUdDSExELCBhZ2VudF9TSUdDSExEX2hhbmRsZXIpOwojZW5kaWYKfQoKaW50CnJlZ2lzdGVyX3NpZ25hbChpbnQgc2lnLCB2b2lkICgqZnVuYykgKGludCkpCnsKCiAgICBzd2l0Y2ggKHNpZykgewojaWYgZGVmaW5lZChTSUdDSExEKQogICAgY2FzZSBTSUdDSExEOgojaWZkZWYgSEFWRV9TSUdBQ1RJT04KICAgICAgICB7CiAgICAgICAgICAgIHN0YXRpYyBzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsKICAgICAgICAgICAgYWN0LnNhX2hhbmRsZXIgPSBhZ2VudF9TSUdDSExEX2hhbmRsZXI7CiAgICAgICAgICAgIHNpZ2VtcHR5c2V0KCZhY3Quc2FfbWFzayk7CiAgICAgICAgICAgIGFjdC5zYV9mbGFncyA9IDA7CiAgICAgICAgICAgIHNpZ2FjdGlvbihTSUdDSExELCAmYWN0LCBOVUxMKTsKICAgICAgICB9CiNlbHNlCiAgICAgICAgc2lnbmFsKFNJR0NITEQsIGFnZW50X1NJR0NITERfaGFuZGxlcik7CiNlbmRpZgogICAgICAgIGJyZWFrOwojZW5kaWYKICAgIGRlZmF1bHQ6CiAgICAgICAgc25tcF9sb2coTE9HX0NSSVQsCiAgICAgICAgICAgICAgICAgInJlZ2lzdGVyX3NpZ25hbDogc2lnbmFsICVkIGNhbm5vdCBiZSBoYW5kbGVkXG4iLCBzaWcpOwogICAgICAgIHJldHVybiBTSUdfUkVHSVNUUkFUSU9OX0ZBSUxFRDsKICAgIH0KCiAgICBleHRlcm5hbF9zaWduYWxfaGFuZGxlcltzaWddID0gZnVuYzsKICAgIGV4dGVybmFsX3NpZ25hbF9zY2hlZHVsZWRbc2lnXSA9IDA7CgogICAgREVCVUdNU0dUTCgoInJlZ2lzdGVyX3NpZ25hbCIsICJyZWdpc3RlcmVkIHNpZ25hbCAlZFxuIiwgc2lnKSk7CiAgICByZXR1cm4gU0lHX1JFR0lTVEVSRURfT0s7Cn0KCmludAp1bnJlZ2lzdGVyX3NpZ25hbChpbnQgc2lnKQp7CiAgICBzaWduYWwoc2lnLCBTSUdfREZMKTsKICAgIERFQlVHTVNHVEwoKCJ1bnJlZ2lzdGVyX3NpZ25hbCIsICJ1bnJlZ2lzdGVyZWQgc2lnbmFsICVkXG4iLCBzaWcpKTsKICAgIHJldHVybiBTSUdfVU5SRUdJU1RFUkVEX09LOwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICFXSU4zMiAqLwoKLyoqICBAfSAqLwo=