LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfICAgXyBfX19fICBfCiAqICBQcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogKgogKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCiAqIGFyZSBhbHNvIGF2YWlsYWJsZSBhdCBodHRwczovL2N1cmwuaGF4eC5zZS9kb2NzL2NvcHlyaWdodC5odG1sLgogKgogKiBZb3UgbWF5IG9wdCB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUgYW5kL29yIHNlbGwKICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDT1BZSU5HIGZpbGUuCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioKCgpSRUNFSVZJTkcgQ09PS0lFIElORk9STUFUSU9OCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0cnVjdCBDb29raWVJbmZvICpDdXJsX2Nvb2tpZV9pbml0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgc3RydWN0IENvb2tpZUluZm8gKmluYywgYm9vbCBuZXdzZXNzaW9uKTsKCiAgICAgICAgSW5pdHMgYSBjb29raWUgc3RydWN0IHRvIHN0b3JlIGRhdGEgaW4gYSBsb2NhbCBmaWxlLiBUaGlzIGlzIGFsd2F5cwogICAgICAgIGNhbGxlZCBiZWZvcmUgYW55IGNvb2tpZXMgYXJlIHNldC4KCnN0cnVjdCBDb29raWUgKkN1cmxfY29va2llX2FkZChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAogICAgICAgICAgICAgICAgIHN0cnVjdCBDb29raWVJbmZvICpjLCBib29sIGh0dHBoZWFkZXIsIGNoYXIgKmxpbmVwdHIsCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKTsKCiAgICAgICAgVGhlICdsaW5lcHRyJyBwYXJhbWV0ZXIgaXMgYSBmdWxsICJTZXQtY29va2llOiIgbGluZSBhcwogICAgICAgIHJlY2VpdmVkIGZyb20gYSBzZXJ2ZXIuCgogICAgICAgIFRoZSBmdW5jdGlvbiBuZWVkIHRvIHJlcGxhY2UgcHJldmlvdXNseSBzdG9yZWQgbGluZXMgdGhhdCB0aGlzIG5ldwogICAgICAgIGxpbmUgc3VwZXJjZWVkcy4KCiAgICAgICAgSXQgbWF5IHJlbW92ZSBsaW5lcyB0aGF0IGFyZSBleHBpcmVkLgoKICAgICAgICBJdCBzaG91bGQgcmV0dXJuIGFuIGluZGljYXRpb24gb2Ygc3VjY2Vzcy9lcnJvci4KCgpTRU5ESU5HIENPT0tJRSBJTkZPUk1BVElPTgo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RydWN0IENvb2tpZXMgKkN1cmxfY29va2llX2dldGxpc3Qoc3RydWN0IENvb2tpZUluZm8gKmNvb2tpZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqaG9zdCwgY2hhciAqcGF0aCwgYm9vbCBzZWN1cmUpOwoKICAgICAgICBGb3IgYSBnaXZlbiBob3N0IGFuZCBwYXRoLCByZXR1cm4gYSBsaW5rZWQgbGlzdCBvZiBjb29raWVzIHRoYXQKICAgICAgICB0aGUgY2xpZW50IHNob3VsZCBzZW5kIHRvIHRoZSBzZXJ2ZXIgaWYgdXNlZCBub3cuIFRoZSBzZWN1cmUKICAgICAgICBib29sZWFuIGluZm9ybXMgdGhlIGNvb2tpZSBpZiBhIHNlY3VyZSBjb25uZWN0aW9uIGlzIGFjaGlldmVkIG9yCiAgICAgICAgbm90LgoKICAgICAgICBJdCBzaGFsbCBvbmx5IHJldHVybiBjb29raWVzIHRoYXQgaGF2ZW4ndCBleHBpcmVkLgoKCkV4YW1wbGUgc2V0IG9mIGNvb2tpZXM6CgogICAgU2V0LWNvb2tpZTogUFJPRFVDVElORk89d2VieHByZXNzOyBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6IFBFUlNPTkFMSVpFPW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS9mdGd3OyBzZWN1cmUKICAgIFNldC1jb29raWU6IEZpZEhpc3Q9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWRPcmRlcj1ub25lO2V4cGlyZXM9TW9uZGF5LCAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7CiAgICBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6IERpc1BlbmQ9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWREaXM9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOgogICAgU2Vzc2lvbl9LZXlANjc5MWE5ZTAtOTAxYS0xMWQwLWExYzgtOWIwMTJjODhhYTc3PW5vbmU7ZXhwaXJlcz1Nb25kYXksCiAgICAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7IGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQoqKioqLwoKI2luY2x1ZGUgImN1cmxfc2V0dXAuaCIKCiNpZiAhZGVmaW5lZChDVVJMX0RJU0FCTEVfSFRUUCkgJiYgIWRlZmluZWQoQ1VSTF9ESVNBQkxFX0NPT0tJRVMpCgojaWZkZWYgVVNFX0xJQlBTTAojIGluY2x1ZGUgPGxpYnBzbC5oPgojZW5kaWYKCiNpbmNsdWRlICJ1cmxkYXRhLmgiCiNpbmNsdWRlICJjb29raWUuaCIKI2luY2x1ZGUgInN0cnRvay5oIgojaW5jbHVkZSAic2VuZGYuaCIKI2luY2x1ZGUgInNsaXN0LmgiCiNpbmNsdWRlICJzaGFyZS5oIgojaW5jbHVkZSAic3RydG9vZmZ0LmgiCiNpbmNsdWRlICJzdHJjYXNlLmgiCiNpbmNsdWRlICJjdXJsX21lbXJjaHIuaCIKI2luY2x1ZGUgImluZXRfcHRvbi5oIgoKLyogVGhlIGxhc3QgMyAjaW5jbHVkZSBmaWxlcyBzaG91bGQgYmUgaW4gdGhpcyBvcmRlciAqLwojaW5jbHVkZSAiY3VybF9wcmludGYuaCIKI2luY2x1ZGUgImN1cmxfbWVtb3J5LmgiCiNpbmNsdWRlICJtZW1kZWJ1Zy5oIgoKc3RhdGljIHZvaWQgZnJlZWNvb2tpZShzdHJ1Y3QgQ29va2llICpjbykKewogIGZyZWUoY28tPmV4cGlyZXN0cik7CiAgZnJlZShjby0+ZG9tYWluKTsKICBmcmVlKGNvLT5wYXRoKTsKICBmcmVlKGNvLT5zcGF0aCk7CiAgZnJlZShjby0+bmFtZSk7CiAgZnJlZShjby0+dmFsdWUpOwogIGZyZWUoY28tPm1heGFnZSk7CiAgZnJlZShjby0+dmVyc2lvbik7CiAgZnJlZShjbyk7Cn0KCnN0YXRpYyBib29sIHRhaWxtYXRjaChjb25zdCBjaGFyICpjb29rZV9kb21haW4sIGNvbnN0IGNoYXIgKmhvc3RuYW1lKQp7CiAgc2l6ZV90IGNvb2tpZV9kb21haW5fbGVuID0gc3RybGVuKGNvb2tlX2RvbWFpbik7CiAgc2l6ZV90IGhvc3RuYW1lX2xlbiA9IHN0cmxlbihob3N0bmFtZSk7CgogIGlmKGhvc3RuYW1lX2xlbiA8IGNvb2tpZV9kb21haW5fbGVuKQogICAgcmV0dXJuIEZBTFNFOwoKICBpZighc3RyY2FzZWNvbXBhcmUoY29va2VfZG9tYWluLCBob3N0bmFtZStob3N0bmFtZV9sZW4tY29va2llX2RvbWFpbl9sZW4pKQogICAgcmV0dXJuIEZBTFNFOwoKICAvKiBBIGxlYWQgY2hhciBvZiBjb29raWVfZG9tYWluIGlzIG5vdCAnLicuCiAgICAgUkZDNjI2NSA0LjEuMi4zLiBUaGUgRG9tYWluIEF0dHJpYnV0ZSBzYXlzOgogICAgICAgRm9yIGV4YW1wbGUsIGlmIHRoZSB2YWx1ZSBvZiB0aGUgRG9tYWluIGF0dHJpYnV0ZSBpcwogICAgICAgImV4YW1wbGUuY29tIiwgdGhlIHVzZXIgYWdlbnQgd2lsbCBpbmNsdWRlIHRoZSBjb29raWUgaW4gdGhlIENvb2tpZQogICAgICAgaGVhZGVyIHdoZW4gbWFraW5nIEhUVFAgcmVxdWVzdHMgdG8gZXhhbXBsZS5jb20sIHd3dy5leGFtcGxlLmNvbSwgYW5kCiAgICAgICB3d3cuY29ycC5leGFtcGxlLmNvbS4KICAgKi8KICBpZihob3N0bmFtZV9sZW4gPT0gY29va2llX2RvbWFpbl9sZW4pCiAgICByZXR1cm4gVFJVRTsKICBpZignLicgPT0gKihob3N0bmFtZSArIGhvc3RuYW1lX2xlbiAtIGNvb2tpZV9kb21haW5fbGVuIC0gMSkpCiAgICByZXR1cm4gVFJVRTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qCiAqIG1hdGNoaW5nIGNvb2tpZSBwYXRoIGFuZCB1cmwgcGF0aAogKiBSRkM2MjY1IDUuMS40IFBhdGhzIGFuZCBQYXRoLU1hdGNoCiAqLwpzdGF0aWMgYm9vbCBwYXRobWF0Y2goY29uc3QgY2hhciAqY29va2llX3BhdGgsIGNvbnN0IGNoYXIgKnJlcXVlc3RfdXJpKQp7CiAgc2l6ZV90IGNvb2tpZV9wYXRoX2xlbjsKICBzaXplX3QgdXJpX3BhdGhfbGVuOwogIGNoYXIgKnVyaV9wYXRoID0gTlVMTDsKICBjaGFyICpwb3M7CiAgYm9vbCByZXQgPSBGQUxTRTsKCiAgLyogY29va2llX3BhdGggbXVzdCBub3QgaGF2ZSBsYXN0ICcvJyBzZXBhcmF0b3IuIGV4OiAvc2FtcGxlICovCiAgY29va2llX3BhdGhfbGVuID0gc3RybGVuKGNvb2tpZV9wYXRoKTsKICBpZigxID09IGNvb2tpZV9wYXRoX2xlbikgewogICAgLyogY29va2llX3BhdGggbXVzdCBiZSAnLycgKi8KICAgIHJldHVybiBUUlVFOwogIH0KCiAgdXJpX3BhdGggPSBzdHJkdXAocmVxdWVzdF91cmkpOwogIGlmKCF1cmlfcGF0aCkKICAgIHJldHVybiBGQUxTRTsKICBwb3MgPSBzdHJjaHIodXJpX3BhdGgsICc/Jyk7CiAgaWYocG9zKQogICAgKnBvcyA9IDB4MDsKCiAgLyogIy1mcmFnbWVudHMgYXJlIGFscmVhZHkgY3V0IG9mZiEgKi8KICBpZigwID09IHN0cmxlbih1cmlfcGF0aCkgfHwgdXJpX3BhdGhbMF0gIT0gJy8nKSB7CiAgICBmcmVlKHVyaV9wYXRoKTsKICAgIHVyaV9wYXRoID0gc3RyZHVwKCIvIik7CiAgICBpZighdXJpX3BhdGgpCiAgICAgIHJldHVybiBGQUxTRTsKICB9CgogIC8qIGhlcmUsIFJGQzYyNjUgNS4xLjQgc2F5cwogICAgIDQuIE91dHB1dCB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdXJpLXBhdGggZnJvbSB0aGUgZmlyc3QgY2hhcmFjdGVyIHVwCiAgICAgICAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgcmlnaHQtbW9zdCAleDJGICgiLyIpLgogICAgIGJ1dCBVUkwgcGF0aCAvaG9nZT9mdWdhPXh4eCBtZWFucyAvaG9nZS9pbmRleC5jZ2k/ZnVnYT14eHggaW4gc29tZSBzaXRlCiAgICAgd2l0aG91dCByZWRpcmVjdC4KICAgICBJZ25vcmUgdGhpcyBhbGdvcml0aG0gYmVjYXVzZSAvaG9nZSBpcyB1cmkgcGF0aCBmb3IgdGhpcyBjYXNlCiAgICAgKHVyaSBwYXRoIGlzIG5vdCAvKS4KICAgKi8KCiAgdXJpX3BhdGhfbGVuID0gc3RybGVuKHVyaV9wYXRoKTsKCiAgaWYodXJpX3BhdGhfbGVuIDwgY29va2llX3BhdGhfbGVuKSB7CiAgICByZXQgPSBGQUxTRTsKICAgIGdvdG8gcGF0aG1hdGNoZWQ7CiAgfQoKICAvKiBub3QgdXNpbmcgY2hlY2twcmVmaXgoKSBiZWNhdXNlIG1hdGNoaW5nIHNob3VsZCBiZSBjYXNlLXNlbnNpdGl2ZSAqLwogIGlmKHN0cm5jbXAoY29va2llX3BhdGgsIHVyaV9wYXRoLCBjb29raWVfcGF0aF9sZW4pKSB7CiAgICByZXQgPSBGQUxTRTsKICAgIGdvdG8gcGF0aG1hdGNoZWQ7CiAgfQoKICAvKiBUaGUgY29va2llLXBhdGggYW5kIHRoZSB1cmktcGF0aCBhcmUgaWRlbnRpY2FsLiAqLwogIGlmKGNvb2tpZV9wYXRoX2xlbiA9PSB1cmlfcGF0aF9sZW4pIHsKICAgIHJldCA9IFRSVUU7CiAgICBnb3RvIHBhdGhtYXRjaGVkOwogIH0KCiAgLyogaGVyZSwgY29va2llX3BhdGhfbGVuIDwgdXJsX3BhdGhfbGVuICovCiAgaWYodXJpX3BhdGhbY29va2llX3BhdGhfbGVuXSA9PSAnLycpIHsKICAgIHJldCA9IFRSVUU7CiAgICBnb3RvIHBhdGhtYXRjaGVkOwogIH0KCiAgcmV0ID0gRkFMU0U7CgpwYXRobWF0Y2hlZDoKICBmcmVlKHVyaV9wYXRoKTsKICByZXR1cm4gcmV0Owp9CgovKgogKiBjb29raWUgcGF0aCBzYW5pdGl6ZQogKi8Kc3RhdGljIGNoYXIgKnNhbml0aXplX2Nvb2tpZV9wYXRoKGNvbnN0IGNoYXIgKmNvb2tpZV9wYXRoKQp7CiAgc2l6ZV90IGxlbjsKICBjaGFyICpuZXdfcGF0aCA9IHN0cmR1cChjb29raWVfcGF0aCk7CiAgaWYoIW5ld19wYXRoKQogICAgcmV0dXJuIE5VTEw7CgogIC8qIHNvbWUgc3R1cGlkIHNpdGUgc2VuZHMgcGF0aCBhdHRyaWJ1dGUgd2l0aCAnIicuICovCiAgbGVuID0gc3RybGVuKG5ld19wYXRoKTsKICBpZihuZXdfcGF0aFswXSA9PSAnXCInKSB7CiAgICBtZW1tb3ZlKCh2b2lkICopbmV3X3BhdGgsIChjb25zdCB2b2lkICopKG5ld19wYXRoICsgMSksIGxlbik7CiAgICBsZW4tLTsKICB9CiAgaWYobGVuICYmIChuZXdfcGF0aFtsZW4gLSAxXSA9PSAnXCInKSkgewogICAgbmV3X3BhdGhbbGVuIC0gMV0gPSAweDA7CiAgICBsZW4tLTsKICB9CgogIC8qIFJGQzYyNjUgNS4yLjQgVGhlIFBhdGggQXR0cmlidXRlICovCiAgaWYobmV3X3BhdGhbMF0gIT0gJy8nKSB7CiAgICAvKiBMZXQgY29va2llLXBhdGggYmUgdGhlIGRlZmF1bHQtcGF0aC4gKi8KICAgIGZyZWUobmV3X3BhdGgpOwogICAgbmV3X3BhdGggPSBzdHJkdXAoIi8iKTsKICAgIHJldHVybiBuZXdfcGF0aDsKICB9CgogIC8qIGNvbnZlcnQgL2hvZ2UvIHRvIC9ob2dlICovCiAgaWYobGVuICYmIG5ld19wYXRoW2xlbiAtIDFdID09ICcvJykgewogICAgbmV3X3BhdGhbbGVuIC0gMV0gPSAweDA7CiAgfQoKICByZXR1cm4gbmV3X3BhdGg7Cn0KCi8qCiAqIExvYWQgY29va2llcyBmcm9tIGFsbCBnaXZlbiBjb29raWUgZmlsZXMgKENVUkxPUFRfQ09PS0lFRklMRSkuCiAqCiAqIE5PVEU6IE9PTSBvciBjb29raWUgcGFyc2luZyBmYWlsdXJlcyBhcmUgaWdub3JlZC4KICovCnZvaWQgQ3VybF9jb29raWVfbG9hZGZpbGVzKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCnsKICBzdHJ1Y3QgY3VybF9zbGlzdCAqbGlzdCA9IGRhdGEtPmNoYW5nZS5jb29raWVsaXN0OwogIGlmKGxpc3QpIHsKICAgIEN1cmxfc2hhcmVfbG9jayhkYXRhLCBDVVJMX0xPQ0tfREFUQV9DT09LSUUsIENVUkxfTE9DS19BQ0NFU1NfU0lOR0xFKTsKICAgIHdoaWxlKGxpc3QpIHsKICAgICAgc3RydWN0IENvb2tpZUluZm8gKm5ld2Nvb2tpZXMgPSBDdXJsX2Nvb2tpZV9pbml0KGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LT5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+Y29va2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnNldC5jb29raWVzZXNzaW9uKTsKICAgICAgaWYoIW5ld2Nvb2tpZXMpCiAgICAgICAgLyogRmFpbHVyZSBtYXkgYmUgZHVlIHRvIE9PTSBvciBhIGJhZCBjb29raWU7IGJvdGggYXJlIGlnbm9yZWQKICAgICAgICAgKiBidXQgb25seSB0aGUgZmlyc3Qgc2hvdWxkIGJlCiAgICAgICAgICovCiAgICAgICAgaW5mb2YoZGF0YSwgImlnbm9yaW5nIGZhaWxlZCBjb29raWVfaW5pdCBmb3IgJXNcbiIsIGxpc3QtPmRhdGEpOwogICAgICBlbHNlCiAgICAgICAgZGF0YS0+Y29va2llcyA9IG5ld2Nvb2tpZXM7CiAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwogICAgfQogICAgY3VybF9zbGlzdF9mcmVlX2FsbChkYXRhLT5jaGFuZ2UuY29va2llbGlzdCk7IC8qIGNsZWFuIHVwIGxpc3QgKi8KICAgIGRhdGEtPmNoYW5nZS5jb29raWVsaXN0ID0gTlVMTDsgLyogZG9uJ3QgZG8gdGhpcyBhZ2FpbiEgKi8KICAgIEN1cmxfc2hhcmVfdW5sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSk7CiAgfQp9CgovKgogKiBzdHJzdG9yZSgpIG1ha2VzIGEgc3RyZHVwKCkgb24gdGhlICduZXdzdHInIGFuZCBpZiAnKnN0cicgaXMgbm9uLU5VTEwKICogdGhhdCB3aWxsIGJlIGZyZWVkIGJlZm9yZSB0aGUgYWxsb2NhdGVkIHN0cmluZyBpcyBzdG9yZWQgdGhlcmUuCiAqCiAqIEl0IGlzIG1lYW50IHRvIGVhc2lseSByZXBsYWNlIHN0cmR1cCgpCiAqLwpzdGF0aWMgdm9pZCBzdHJzdG9yZShjaGFyICoqc3RyLCBjb25zdCBjaGFyICpuZXdzdHIpCnsKICBmcmVlKCpzdHIpOwogICpzdHIgPSBzdHJkdXAobmV3c3RyKTsKfQoKLyoKICogcmVtb3ZlX2V4cGlyZWQoKSByZW1vdmVzIGV4cGlyZWQgY29va2llcy4KICovCnN0YXRpYyB2b2lkIHJlbW92ZV9leHBpcmVkKHN0cnVjdCBDb29raWVJbmZvICpjb29raWVzKQp7CiAgc3RydWN0IENvb2tpZSAqY28sICpueCwgKnB2OwogIGN1cmxfb2ZmX3Qgbm93ID0gKGN1cmxfb2ZmX3QpdGltZShOVUxMKTsKCiAgY28gPSBjb29raWVzLT5jb29raWVzOwogIHB2ID0gTlVMTDsKICB3aGlsZShjbykgewogICAgbnggPSBjby0+bmV4dDsKICAgIGlmKGNvLT5leHBpcmVzICYmIGNvLT5leHBpcmVzIDwgbm93KSB7CiAgICAgIGlmKGNvID09IGNvb2tpZXMtPmNvb2tpZXMpIHsKICAgICAgICBjb29raWVzLT5jb29raWVzID0gY28tPm5leHQ7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgcHYtPm5leHQgPSBjby0+bmV4dDsKICAgICAgfQogICAgICBjb29raWVzLT5udW1jb29raWVzLS07CiAgICAgIGZyZWVjb29raWUoY28pOwogICAgfQogICAgZWxzZSB7CiAgICAgIHB2ID0gY287CiAgICB9CiAgICBjbyA9IG54OwogIH0KfQoKLyoKICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhbiBJUCh2NHx2NikgYWRkcmVzcy4KICovCnN0YXRpYyBib29sIGlzaXAoY29uc3QgY2hhciAqZG9tYWluKQp7CiAgc3RydWN0IGluX2FkZHIgYWRkcjsKI2lmZGVmIEVOQUJMRV9JUFY2CiAgc3RydWN0IGluNl9hZGRyIGFkZHI2OwojZW5kaWYKCiAgaWYoQ3VybF9pbmV0X3B0b24oQUZfSU5FVCwgZG9tYWluLCAmYWRkcikKI2lmZGVmIEVOQUJMRV9JUFY2CiAgICAgfHwgQ3VybF9pbmV0X3B0b24oQUZfSU5FVDYsIGRvbWFpbiwgJmFkZHI2KQojZW5kaWYKICAgICkgewogICAgLyogZG9tYWluIG5hbWUgZ2l2ZW4gYXMgSVAgYWRkcmVzcyAqLwogICAgcmV0dXJuIFRSVUU7CiAgfQoKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2FkZCgpCiAqCiAqIEFkZCBhIHNpbmdsZSBjb29raWUgbGluZSB0byB0aGUgY29va2llIGtlZXBpbmcgb2JqZWN0LgogKgogKiBCZSBhd2FyZSB0aGF0IHNvbWV0aW1lcyB3ZSBnZXQgYW4gSVAtb25seSBob3N0IG5hbWUsIGFuZCB0aGF0IG1pZ2h0IGFsc28gYmUKICogYSBudW1lcmljYWwgSVB2NiBhZGRyZXNzLgogKgogKiBSZXR1cm5zIE5VTEwgb24gb3V0IG9mIG1lbW9yeSBvciBpbnZhbGlkIGNvb2tpZS4gVGhpcyBpcyBzdWJvcHRpbWFsLAogKiBhcyB0aGV5IHNob3VsZCBiZSB0cmVhdGVkIHNlcGFyYXRlbHkuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdHJ1Y3QgQ29va2llICoKQ3VybF9jb29raWVfYWRkKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCiAgICAgICAgICAgICAgICAvKiBUaGUgJ2RhdGEnIHBvaW50ZXIgaGVyZSBtYXkgYmUgTlVMTCBhdCB0aW1lcywgYW5kIHRodXMKICAgICAgICAgICAgICAgICAgIG11c3Qgb25seSBiZSB1c2VkIHZlcnkgY2FyZWZ1bGx5IGZvciB0aGluZ3MgdGhhdCBjYW4gZGVhbAogICAgICAgICAgICAgICAgICAgd2l0aCBkYXRhIGJlaW5nIE5VTEwuIFN1Y2ggYXMgaW5mb2YoKSBhbmQgc2ltaWxhciAqLwoKICAgICAgICAgICAgICAgIHN0cnVjdCBDb29raWVJbmZvICpjLAogICAgICAgICAgICAgICAgYm9vbCBodHRwaGVhZGVyLCAvKiBUUlVFIGlmIEhUVFAgaGVhZGVyLXN0eWxlIGxpbmUgKi8KICAgICAgICAgICAgICAgIGNoYXIgKmxpbmVwdHIsICAgLyogZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lICovCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkb21haW4sIC8qIGRlZmF1bHQgZG9tYWluICovCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoKSAgIC8qIGZ1bGwgcGF0aCB1c2VkIHdoZW4gdGhpcyBjb29raWUgaXMgc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGdldCBkZWZhdWx0IHBhdGggZm9yIHRoZSBjb29raWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5sZXNzIHNldCAqLwp7CiAgc3RydWN0IENvb2tpZSAqY2xpc3Q7CiAgY2hhciBuYW1lW01BWF9OQU1FXTsKICBzdHJ1Y3QgQ29va2llICpjbzsKICBzdHJ1Y3QgQ29va2llICpsYXN0Yz1OVUxMOwogIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwogIGJvb2wgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICBib29sIGJhZGNvb2tpZSA9IEZBTFNFOyAvKiBjb29raWVzIGFyZSBnb29kIGJ5IGRlZmF1bHQuIG1tbW1tIHl1bW15ICovCgojaWZkZWYgVVNFX0xJQlBTTAogIGNvbnN0IHBzbF9jdHhfdCAqcHNsOwojZW5kaWYKCiNpZmRlZiBDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTCiAgKHZvaWQpZGF0YTsKI2VuZGlmCgogIC8qIEZpcnN0LCBhbGxvYyBhbmQgaW5pdCBhIG5ldyBzdHJ1Y3QgZm9yIGl0ICovCiAgY28gPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBDb29raWUpKTsKICBpZighY28pCiAgICByZXR1cm4gTlVMTDsgLyogYmFpbCBvdXQgaWYgd2UncmUgdGhpcyBsb3cgb24gbWVtb3J5ICovCgogIGlmKGh0dHBoZWFkZXIpIHsKICAgIC8qIFRoaXMgbGluZSB3YXMgcmVhZCBvZmYgYSBIVFRQLWhlYWRlciAqLwogICAgY29uc3QgY2hhciAqcHRyOwogICAgY29uc3QgY2hhciAqc2VtaXB0cjsKICAgIGNoYXIgKndoYXQ7CgogICAgd2hhdCA9IG1hbGxvYyhNQVhfQ09PS0lFX0xJTkUpOwogICAgaWYoIXdoYXQpIHsKICAgICAgZnJlZShjbyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHNlbWlwdHI9c3RyY2hyKGxpbmVwdHIsICc7Jyk7IC8qIGZpcnN0LCBmaW5kIGEgc2VtaWNvbG9uICovCgogICAgd2hpbGUoKmxpbmVwdHIgJiYgSVNCTEFOSygqbGluZXB0cikpCiAgICAgIGxpbmVwdHIrKzsKCiAgICBwdHIgPSBsaW5lcHRyOwogICAgZG8gewogICAgICAvKiB3ZSBoYXZlIGEgPHdoYXQ+PTx0aGlzPiBwYWlyIG9yIGEgc3RhbmQtYWxvbmUgd29yZCBoZXJlICovCiAgICAgIG5hbWVbMF09d2hhdFswXT0wOyAvKiBpbml0IHRoZSBidWZmZXJzICovCiAgICAgIGlmKDEgPD0gc3NjYW5mKHB0ciwgIiUiIE1BWF9OQU1FX1RYVCAiW147XHJcbj1dID0lIgogICAgICAgICAgICAgICAgICAgICBNQVhfQ09PS0lFX0xJTkVfVFhUICJbXjtcclxuXSIsCiAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHdoYXQpKSB7CiAgICAgICAgLyogVXNlIHN0cnN0b3JlKCkgYmVsb3cgdG8gcHJvcGVybHkgZGVhbCB3aXRoIHJlY2VpdmVkIGNvb2tpZQogICAgICAgICAgIGhlYWRlcnMgdGhhdCBoYXZlIHRoZSBzYW1lIHN0cmluZyBwcm9wZXJ0eSBzZXQgbW9yZSB0aGFuIG9uY2UsCiAgICAgICAgICAgYW5kIHRoZW4gd2UgdXNlIHRoZSBsYXN0IG9uZS4gKi8KICAgICAgICBjb25zdCBjaGFyICp3aGF0cHRyOwogICAgICAgIGJvb2wgZG9uZSA9IEZBTFNFOwogICAgICAgIGJvb2wgc2VwOwogICAgICAgIHNpemVfdCBsZW49c3RybGVuKHdoYXQpOwogICAgICAgIHNpemVfdCBubGVuID0gc3RybGVuKG5hbWUpOwogICAgICAgIGNvbnN0IGNoYXIgKmVuZG9mbiA9ICZwdHJbIG5sZW4gXTsKCiAgICAgICAgLyogbmFtZSBlbmRzIHdpdGggYSAnPScgPyAqLwogICAgICAgIHNlcCA9ICgqZW5kb2ZuID09ICc9Jyk/VFJVRTpGQUxTRTsKCiAgICAgICAgaWYobmxlbikgewogICAgICAgICAgZW5kb2ZuLS07IC8qIG1vdmUgdG8gdGhlIGxhc3QgY2hhcmFjdGVyICovCiAgICAgICAgICBpZihJU0JMQU5LKCplbmRvZm4pKSB7CiAgICAgICAgICAgIC8qIHNraXAgdHJhaWxpbmcgc3BhY2VzIGluIG5hbWUgKi8KICAgICAgICAgICAgd2hpbGUoKmVuZG9mbiAmJiBJU0JMQU5LKCplbmRvZm4pICYmIG5sZW4pIHsKICAgICAgICAgICAgICBlbmRvZm4tLTsKICAgICAgICAgICAgICBubGVuLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmFtZVtubGVuXT0wOyAvKiBuZXcgZW5kIG9mIG5hbWUgKi8KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIFN0cmlwIG9mZiB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlICd3aGF0JyAqLwogICAgICAgIHdoaWxlKGxlbiAmJiBJU0JMQU5LKHdoYXRbbGVuLTFdKSkgewogICAgICAgICAgd2hhdFtsZW4tMV09MDsKICAgICAgICAgIGxlbi0tOwogICAgICAgIH0KCiAgICAgICAgLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgJ3doYXQnICovCiAgICAgICAgd2hhdHB0cj13aGF0OwogICAgICAgIHdoaWxlKCp3aGF0cHRyICYmIElTQkxBTksoKndoYXRwdHIpKQogICAgICAgICAgd2hhdHB0cisrOwoKICAgICAgICBpZighY28tPm5hbWUgJiYgc2VwKSB7CiAgICAgICAgICAvKiBUaGUgdmVyeSBmaXJzdCBuYW1lL3ZhbHVlIHBhaXIgaXMgdGhlIGFjdHVhbCBjb29raWUgbmFtZSAqLwogICAgICAgICAgY28tPm5hbWUgPSBzdHJkdXAobmFtZSk7CiAgICAgICAgICBjby0+dmFsdWUgPSBzdHJkdXAod2hhdHB0cik7CiAgICAgICAgICBpZighY28tPm5hbWUgfHwgIWNvLT52YWx1ZSkgewogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZighbGVuKSB7CiAgICAgICAgICAvKiB0aGlzIHdhcyBhICI8bmFtZT49IiB3aXRoIG5vIGNvbnRlbnQsIGFuZCB3ZSBtdXN0IGFsbG93CiAgICAgICAgICAgICAnc2VjdXJlJyBhbmQgJ2h0dHBvbmx5JyBzcGVjaWZpZWQgdGhpcyB3ZWlyZGx5ICovCiAgICAgICAgICBkb25lID0gVFJVRTsKICAgICAgICAgIGlmKHN0cmNhc2Vjb21wYXJlKCJzZWN1cmUiLCBuYW1lKSkKICAgICAgICAgICAgY28tPnNlY3VyZSA9IFRSVUU7CiAgICAgICAgICBlbHNlIGlmKHN0cmNhc2Vjb21wYXJlKCJodHRwb25seSIsIG5hbWUpKQogICAgICAgICAgICBjby0+aHR0cG9ubHkgPSBUUlVFOwogICAgICAgICAgZWxzZSBpZihzZXApCiAgICAgICAgICAgIC8qIHRoZXJlIHdhcyBhICc9JyBzbyB3ZSdyZSBub3QgZG9uZSBwYXJzaW5nIHRoaXMgZmllbGQgKi8KICAgICAgICAgICAgZG9uZSA9IEZBTFNFOwogICAgICAgIH0KICAgICAgICBpZihkb25lKQogICAgICAgICAgOwogICAgICAgIGVsc2UgaWYoc3RyY2FzZWNvbXBhcmUoInBhdGgiLCBuYW1lKSkgewogICAgICAgICAgc3Ryc3RvcmUoJmNvLT5wYXRoLCB3aGF0cHRyKTsKICAgICAgICAgIGlmKCFjby0+cGF0aCkgewogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOyAvKiBvdXQgb2YgbWVtb3J5IGJhZCAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNvLT5zcGF0aCA9IHNhbml0aXplX2Nvb2tpZV9wYXRoKGNvLT5wYXRoKTsKICAgICAgICAgIGlmKCFjby0+c3BhdGgpIHsKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsgLyogb3V0IG9mIG1lbW9yeSBiYWQgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoc3RyY2FzZWNvbXBhcmUoImRvbWFpbiIsIG5hbWUpKSB7CiAgICAgICAgICBib29sIGlzX2lwOwogICAgICAgICAgY29uc3QgY2hhciAqZG90cDsKCiAgICAgICAgICAvKiBOb3csIHdlIG1ha2Ugc3VyZSB0aGF0IG91ciBob3N0IGlzIHdpdGhpbiB0aGUgZ2l2ZW4gZG9tYWluLAogICAgICAgICAgICAgb3IgdGhlIGdpdmVuIGRvbWFpbiBpcyBub3QgdmFsaWQgYW5kIHRodXMgY2Fubm90IGJlIHNldC4gKi8KCiAgICAgICAgICBpZignLicgPT0gd2hhdHB0clswXSkKICAgICAgICAgICAgd2hhdHB0cisrOyAvKiBpZ25vcmUgcHJlY2VkaW5nIGRvdCAqLwoKICAgICAgICAgIGlzX2lwID0gaXNpcChkb21haW4gPyBkb21haW4gOiB3aGF0cHRyKTsKCiAgICAgICAgICAvKiBjaGVjayBmb3IgbW9yZSBkb3RzICovCiAgICAgICAgICBkb3RwID0gc3RyY2hyKHdoYXRwdHIsICcuJyk7CiAgICAgICAgICBpZighZG90cCkKICAgICAgICAgICAgZG9tYWluPSI6IjsKCiAgICAgICAgICBpZighZG9tYWluCiAgICAgICAgICAgICB8fCAoaXNfaXAgJiYgIXN0cmNtcCh3aGF0cHRyLCBkb21haW4pKQogICAgICAgICAgICAgfHwgKCFpc19pcCAmJiB0YWlsbWF0Y2god2hhdHB0ciwgZG9tYWluKSkpIHsKICAgICAgICAgICAgc3Ryc3RvcmUoJmNvLT5kb21haW4sIHdoYXRwdHIpOwogICAgICAgICAgICBpZighY28tPmRvbWFpbikgewogICAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoIWlzX2lwKQogICAgICAgICAgICAgIGNvLT50YWlsbWF0Y2g9VFJVRTsgLyogd2UgYWx3YXlzIGRvIHRoYXQgaWYgdGhlIGRvbWFpbiBuYW1lIHdhcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gKi8KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiB3ZSBkaWQgbm90IGdldCBhIHRhaWxtYXRjaCBhbmQgdGhlbiB0aGUgYXR0ZW1wdGVkIHNldCBkb21haW4KICAgICAgICAgICAgICAgaXMgbm90IGEgZG9tYWluIHRvIHdoaWNoIHRoZSBjdXJyZW50IGhvc3QgYmVsb25ncy4gTWFyayBhcwogICAgICAgICAgICAgICBiYWQuICovCiAgICAgICAgICAgIGJhZGNvb2tpZT1UUlVFOwogICAgICAgICAgICBpbmZvZihkYXRhLCAic2tpcHBlZCBjb29raWUgd2l0aCBiYWQgdGFpbG1hdGNoIGRvbWFpbjogJXNcbiIsCiAgICAgICAgICAgICAgICAgIHdoYXRwdHIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmKHN0cmNhc2Vjb21wYXJlKCJ2ZXJzaW9uIiwgbmFtZSkpIHsKICAgICAgICAgIHN0cnN0b3JlKCZjby0+dmVyc2lvbiwgd2hhdHB0cik7CiAgICAgICAgICBpZighY28tPnZlcnNpb24pIHsKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoc3RyY2FzZWNvbXBhcmUoIm1heC1hZ2UiLCBuYW1lKSkgewogICAgICAgICAgLyogRGVmaW5lZCBpbiBSRkMyMTA5OgoKICAgICAgICAgICAgIE9wdGlvbmFsLiAgVGhlIE1heC1BZ2UgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxpZmV0aW1lIG9mIHRoZQogICAgICAgICAgICAgY29va2llLCBpbiBzZWNvbmRzLiAgVGhlIGRlbHRhLXNlY29uZHMgdmFsdWUgaXMgYSBkZWNpbWFsIG5vbi0KICAgICAgICAgICAgIG5lZ2F0aXZlIGludGVnZXIuICBBZnRlciBkZWx0YS1zZWNvbmRzIHNlY29uZHMgZWxhcHNlLCB0aGUKICAgICAgICAgICAgIGNsaWVudCBzaG91bGQgZGlzY2FyZCB0aGUgY29va2llLiAgQSB2YWx1ZSBvZiB6ZXJvIG1lYW5zIHRoZQogICAgICAgICAgICAgY29va2llIHNob3VsZCBiZSBkaXNjYXJkZWQgaW1tZWRpYXRlbHkuCgogICAgICAgICAgKi8KICAgICAgICAgIHN0cnN0b3JlKCZjby0+bWF4YWdlLCB3aGF0cHRyKTsKICAgICAgICAgIGlmKCFjby0+bWF4YWdlKSB7CiAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmKHN0cmNhc2Vjb21wYXJlKCJleHBpcmVzIiwgbmFtZSkpIHsKICAgICAgICAgIHN0cnN0b3JlKCZjby0+ZXhwaXJlc3RyLCB3aGF0cHRyKTsKICAgICAgICAgIGlmKCFjby0+ZXhwaXJlc3RyKSB7CiAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKgogICAgICAgICAgZWxzZSB0aGlzIGlzIHRoZSBzZWNvbmQgKG9yIG1vcmUpIG5hbWUgd2UgZG9uJ3Qga25vdwogICAgICAgICAgYWJvdXQhICovCiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgLyogdGhpcyBpcyBhbiAiaWxsZWdhbCIgPHdoYXQ+PTx0aGlzPiBwYWlyICovCiAgICAgIH0KCiAgICAgIGlmKCFzZW1pcHRyIHx8ICEqc2VtaXB0cikgewogICAgICAgIC8qIHdlIGFscmVhZHkga25vdyB0aGVyZSBhcmUgbm8gbW9yZSBjb29raWVzICovCiAgICAgICAgc2VtaXB0ciA9IE5VTEw7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIHB0cj1zZW1pcHRyKzE7CiAgICAgIHdoaWxlKCpwdHIgJiYgSVNCTEFOSygqcHRyKSkKICAgICAgICBwdHIrKzsKICAgICAgc2VtaXB0cj1zdHJjaHIocHRyLCAnOycpOyAvKiBub3csIGZpbmQgdGhlIG5leHQgc2VtaWNvbG9uICovCgogICAgICBpZighc2VtaXB0ciAmJiAqcHRyKQogICAgICAgIC8qIFRoZXJlIGFyZSBubyBtb3JlIHNlbWljb2xvbnMsIGJ1dCB0aGVyZSdzIGEgZmluYWwgbmFtZT12YWx1ZSBwYWlyCiAgICAgICAgICAgY29taW5nIHVwICovCiAgICAgICAgc2VtaXB0cj1zdHJjaHIocHRyLCAnXDAnKTsKICAgIH0gd2hpbGUoc2VtaXB0cik7CgogICAgaWYoY28tPm1heGFnZSkgewogICAgICBjby0+ZXhwaXJlcyA9CiAgICAgICAgY3VybHhfc3RydG9vZmZ0KCgqY28tPm1heGFnZT09J1wiJyk/CiAgICAgICAgICAgICAgICAgICAgICAgICZjby0+bWF4YWdlWzFdOiZjby0+bWF4YWdlWzBdLCBOVUxMLCAxMCk7CiAgICAgIGlmKENVUkxfT0ZGX1RfTUFYIC0gbm93IDwgY28tPmV4cGlyZXMpCiAgICAgICAgLyogYXZvaWQgb3ZlcmZsb3cgKi8KICAgICAgICBjby0+ZXhwaXJlcyA9IENVUkxfT0ZGX1RfTUFYOwogICAgICBlbHNlCiAgICAgICAgY28tPmV4cGlyZXMgKz0gbm93OwogICAgfQogICAgZWxzZSBpZihjby0+ZXhwaXJlc3RyKSB7CiAgICAgIC8qIE5vdGUgdGhhdCBpZiB0aGUgZGF0ZSBjb3VsZG4ndCBnZXQgcGFyc2VkIGZvciB3aGF0ZXZlciByZWFzb24sCiAgICAgICAgIHRoZSBjb29raWUgd2lsbCBiZSB0cmVhdGVkIGFzIGEgc2Vzc2lvbiBjb29raWUgKi8KICAgICAgY28tPmV4cGlyZXMgPSBjdXJsX2dldGRhdGUoY28tPmV4cGlyZXN0ciwgTlVMTCk7CgogICAgICAvKiBTZXNzaW9uIGNvb2tpZXMgaGF2ZSBleHBpcmVzIHNldCB0byAwIHNvIGlmIHdlIGdldCB0aGF0IGJhY2sKICAgICAgICAgZnJvbSB0aGUgZGF0ZSBwYXJzZXIgbGV0J3MgYWRkIGEgc2Vjb25kIHRvIG1ha2UgaXQgYQogICAgICAgICBub24tc2Vzc2lvbiBjb29raWUgKi8KICAgICAgaWYoY28tPmV4cGlyZXMgPT0gMCkKICAgICAgICBjby0+ZXhwaXJlcyA9IDE7CiAgICAgIGVsc2UgaWYoY28tPmV4cGlyZXMgPCAwKQogICAgICAgIGNvLT5leHBpcmVzID0gMDsKICAgIH0KCiAgICBpZighYmFkY29va2llICYmICFjby0+ZG9tYWluKSB7CiAgICAgIGlmKGRvbWFpbikgewogICAgICAgIC8qIG5vIGRvbWFpbiB3YXMgZ2l2ZW4gaW4gdGhlIGhlYWRlciBsaW5lLCBzZXQgdGhlIGRlZmF1bHQgKi8KICAgICAgICBjby0+ZG9tYWluPXN0cmR1cChkb21haW4pOwogICAgICAgIGlmKCFjby0+ZG9tYWluKQogICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgfQogICAgfQoKICAgIGlmKCFiYWRjb29raWUgJiYgIWNvLT5wYXRoICYmIHBhdGgpIHsKICAgICAgLyogTm8gcGF0aCB3YXMgZ2l2ZW4gaW4gdGhlIGhlYWRlciBsaW5lLCBzZXQgdGhlIGRlZmF1bHQuCiAgICAgICAgIE5vdGUgdGhhdCB0aGUgcGFzc2VkLWluIHBhdGggdG8gdGhpcyBmdW5jdGlvbiBNQVkgaGF2ZSBhICc/JyBhbmQKICAgICAgICAgZm9sbG93aW5nIHBhcnQgdGhhdCBNVVNUIG5vdCBiZSBzdG9yZWQgYXMgcGFydCBvZiB0aGUgcGF0aC4gKi8KICAgICAgY2hhciAqcXVlcnlwID0gc3RyY2hyKHBhdGgsICc/Jyk7CgogICAgICAvKiBxdWVyeXAgaXMgd2hlcmUgdGhlIGludGVyZXN0aW5nIHBhcnQgb2YgdGhlIHBhdGggZW5kcywgc28gbm93IHdlCiAgICAgICAgIHdhbnQgdG8gdGhlIGZpbmQgdGhlIGxhc3QgKi8KICAgICAgY2hhciAqZW5kc2xhc2g7CiAgICAgIGlmKCFxdWVyeXApCiAgICAgICAgZW5kc2xhc2ggPSBzdHJyY2hyKHBhdGgsICcvJyk7CiAgICAgIGVsc2UKICAgICAgICBlbmRzbGFzaCA9IG1lbXJjaHIocGF0aCwgJy8nLCAoc2l6ZV90KShxdWVyeXAgLSBwYXRoKSk7CiAgICAgIGlmKGVuZHNsYXNoKSB7CiAgICAgICAgc2l6ZV90IHBhdGhsZW4gPSAoc2l6ZV90KShlbmRzbGFzaC1wYXRoKzEpOyAvKiBpbmNsdWRlIGVuZGluZyBzbGFzaCAqLwogICAgICAgIGNvLT5wYXRoPW1hbGxvYyhwYXRobGVuKzEpOyAvKiBvbmUgZXh0cmEgZm9yIHRoZSB6ZXJvIGJ5dGUgKi8KICAgICAgICBpZihjby0+cGF0aCkgewogICAgICAgICAgbWVtY3B5KGNvLT5wYXRoLCBwYXRoLCBwYXRobGVuKTsKICAgICAgICAgIGNvLT5wYXRoW3BhdGhsZW5dPTA7IC8qIHplcm8gdGVybWluYXRlICovCiAgICAgICAgICBjby0+c3BhdGggPSBzYW5pdGl6ZV9jb29raWVfcGF0aChjby0+cGF0aCk7CiAgICAgICAgICBpZighY28tPnNwYXRoKQogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOyAvKiBvdXQgb2YgbWVtb3J5IGJhZCAqLwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICB9CiAgICB9CgogICAgZnJlZSh3aGF0KTsKCiAgICBpZihiYWRjb29raWUgfHwgIWNvLT5uYW1lKSB7CiAgICAgIC8qIHdlIGRpZG4ndCBnZXQgYSBjb29raWUgbmFtZSBvciBhIGJhZCBvbmUsCiAgICAgICAgIHRoaXMgaXMgYW4gaWxsZWdhbCBsaW5lLCBiYWlsIG91dCAqLwogICAgICBmcmVlY29va2llKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogIH0KICBlbHNlIHsKICAgIC8qIFRoaXMgbGluZSBpcyBOT1QgYSBIVFRQIGhlYWRlciBzdHlsZSBsaW5lLCB3ZSBkbyBvZmZlciBzdXBwb3J0IGZvcgogICAgICAgcmVhZGluZyB0aGUgb2RkIG5ldHNjYXBlIGNvb2tpZXMtZmlsZSBmb3JtYXQgaGVyZSAqLwogICAgY2hhciAqcHRyOwogICAgY2hhciAqZmlyc3RwdHI7CiAgICBjaGFyICp0b2tfYnVmPU5VTEw7CiAgICBpbnQgZmllbGRzOwoKICAgIC8qIElFIGludHJvZHVjZWQgSFRUUC1vbmx5IGNvb2tpZXMgdG8gcHJldmVudCBYU1MgYXR0YWNrcy4gQ29va2llcwogICAgICAgbWFya2VkIHdpdGggaHR0cE9ubHkgYWZ0ZXIgdGhlIGRvbWFpbiBuYW1lIGFyZSBub3QgYWNjZXNzaWJsZQogICAgICAgZnJvbSBqYXZhc2NyaXB0cywgYnV0IHNpbmNlIGN1cmwgZG9lcyBub3Qgb3BlcmF0ZSBhdCBqYXZhc2NyaXB0CiAgICAgICBsZXZlbCwgd2UgaW5jbHVkZSB0aGVtIGFueXdheS4gSW4gRmlyZWZveCdzIGNvb2tpZSBmaWxlcywgdGhlc2UKICAgICAgIGxpbmVzIGFyZSBwcmVjZWRlZCB3aXRoICNIdHRwT25seV8gYW5kIHRoZW4gZXZlcnl0aGluZyBpcwogICAgICAgYXMgdXN1YWwsIHNvIHdlIHNraXAgMTAgY2hhcmFjdGVycyBvZiB0aGUgbGluZS4uCiAgICAqLwogICAgaWYoc3RybmNtcChsaW5lcHRyLCAiI0h0dHBPbmx5XyIsIDEwKSA9PSAwKSB7CiAgICAgIGxpbmVwdHIgKz0gMTA7CiAgICAgIGNvLT5odHRwb25seSA9IFRSVUU7CiAgICB9CgogICAgaWYobGluZXB0clswXT09JyMnKSB7CiAgICAgIC8qIGRvbid0IGV2ZW4gdHJ5IHRoZSBjb21tZW50cyAqLwogICAgICBmcmVlKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICAvKiBzdHJpcCBvZmYgdGhlIHBvc3NpYmxlIGVuZC1vZi1saW5lIGNoYXJhY3RlcnMgKi8KICAgIHB0cj1zdHJjaHIobGluZXB0ciwgJ1xyJyk7CiAgICBpZihwdHIpCiAgICAgICpwdHI9MDsgLyogY2xlYXIgaXQgKi8KICAgIHB0cj1zdHJjaHIobGluZXB0ciwgJ1xuJyk7CiAgICBpZihwdHIpCiAgICAgICpwdHI9MDsgLyogY2xlYXIgaXQgKi8KCiAgICBmaXJzdHB0cj1zdHJ0b2tfcihsaW5lcHRyLCAiXHQiLCAmdG9rX2J1Zik7IC8qIHRva2VuaXplIGl0IG9uIHRoZSBUQUIgKi8KCiAgICAvKiBOb3cgbG9vcCB0aHJvdWdoIHRoZSBmaWVsZHMgYW5kIGluaXQgdGhlIHN0cnVjdCB3ZSBhbHJlYWR5IGhhdmUKICAgICAgIGFsbG9jYXRlZCAqLwogICAgZm9yKHB0cj1maXJzdHB0ciwgZmllbGRzPTA7IHB0ciAmJiAhYmFkY29va2llOwogICAgICAgIHB0cj1zdHJ0b2tfcihOVUxMLCAiXHQiLCAmdG9rX2J1ZiksIGZpZWxkcysrKSB7CiAgICAgIHN3aXRjaChmaWVsZHMpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGlmKHB0clswXT09Jy4nKSAvKiBza2lwIHByZWNlZGluZyBkb3RzICovCiAgICAgICAgICBwdHIrKzsKICAgICAgICBjby0+ZG9tYWluID0gc3RyZHVwKHB0cik7CiAgICAgICAgaWYoIWNvLT5kb21haW4pCiAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDE6CiAgICAgICAgLyogVGhpcyBmaWVsZCBnb3QgaXRzIGV4cGxhbmF0aW9uIG9uIHRoZSAyM3JkIG9mIE1heSAyMDAxIGJ5CiAgICAgICAgICAgQW5kculzIEdhcmPtYToKCiAgICAgICAgICAgZmxhZzogQSBUUlVFL0ZBTFNFIHZhbHVlIGluZGljYXRpbmcgaWYgYWxsIG1hY2hpbmVzIHdpdGhpbiBhIGdpdmVuCiAgICAgICAgICAgZG9tYWluIGNhbiBhY2Nlc3MgdGhlIHZhcmlhYmxlLiBUaGlzIHZhbHVlIGlzIHNldCBhdXRvbWF0aWNhbGx5IGJ5CiAgICAgICAgICAgdGhlIGJyb3dzZXIsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgeW91IHNldCBmb3IgdGhlIGRvbWFpbi4KCiAgICAgICAgICAgQXMgZmFyIGFzIEkgY2FuIHNlZSwgaXQgaXMgc2V0IHRvIHRydWUgd2hlbiB0aGUgY29va2llIHNheXMKICAgICAgICAgICAuZG9tYWluLmNvbSBhbmQgdG8gZmFsc2Ugd2hlbiB0aGUgZG9tYWluIGlzIGNvbXBsZXRlIHd3dy5kb21haW4uY29tCiAgICAgICAgKi8KICAgICAgICBjby0+dGFpbG1hdGNoID0gc3RyY2FzZWNvbXBhcmUocHRyLCAiVFJVRSIpP1RSVUU6RkFMU0U7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICAvKiBJdCB0dXJucyBvdXQsIHRoYXQgc29tZXRpbWVzIHRoZSBmaWxlIGZvcm1hdCBhbGxvd3MgdGhlIHBhdGgKICAgICAgICAgICBmaWVsZCB0byByZW1haW4gbm90IGZpbGxlZCBpbiwgd2UgdHJ5IHRvIGRldGVjdCB0aGlzIGFuZCB3b3JrCiAgICAgICAgICAgYXJvdW5kIGl0ISBBbmRy6XMgR2FyY+1hIG1hZGUgdXMgYXdhcmUgb2YgdGhpcy4uLiAqLwogICAgICAgIGlmKHN0cmNtcCgiVFJVRSIsIHB0cikgJiYgc3RyY21wKCJGQUxTRSIsIHB0cikpIHsKICAgICAgICAgIC8qIG9ubHkgaWYgdGhlIHBhdGggZG9lc24ndCBsb29rIGxpa2UgYSBib29sZWFuIG9wdGlvbiEgKi8KICAgICAgICAgIGNvLT5wYXRoID0gc3RyZHVwKHB0cik7CiAgICAgICAgICBpZighY28tPnBhdGgpCiAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY28tPnNwYXRoID0gc2FuaXRpemVfY29va2llX3BhdGgoY28tPnBhdGgpOwogICAgICAgICAgICBpZighY28tPnNwYXRoKSB7CiAgICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsgLyogb3V0IG9mIG1lbW9yeSBiYWQgKi8KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qIHRoaXMgZG9lc24ndCBsb29rIGxpa2UgYSBwYXRoLCBtYWtlIG9uZSB1cCEgKi8KICAgICAgICBjby0+cGF0aCA9IHN0cmR1cCgiLyIpOwogICAgICAgIGlmKCFjby0+cGF0aCkKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgY28tPnNwYXRoID0gc3RyZHVwKCIvIik7CiAgICAgICAgaWYoIWNvLT5zcGF0aCkKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgZmllbGRzKys7IC8qIGFkZCBhIGZpZWxkIGFuZCBmYWxsIGRvd24gdG8gc2VjdXJlICovCiAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KICAgICAgY2FzZSAzOgogICAgICAgIGNvLT5zZWN1cmUgPSBzdHJjYXNlY29tcGFyZShwdHIsICJUUlVFIik/VFJVRTpGQUxTRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA0OgogICAgICAgIGNvLT5leHBpcmVzID0gY3VybHhfc3RydG9vZmZ0KHB0ciwgTlVMTCwgMTApOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDU6CiAgICAgICAgY28tPm5hbWUgPSBzdHJkdXAocHRyKTsKICAgICAgICBpZighY28tPm5hbWUpCiAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDY6CiAgICAgICAgY28tPnZhbHVlID0gc3RyZHVwKHB0cik7CiAgICAgICAgaWYoIWNvLT52YWx1ZSkKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmKDYgPT0gZmllbGRzKSB7CiAgICAgIC8qIHdlIGdvdCBhIGNvb2tpZSB3aXRoIGJsYW5rIGNvbnRlbnRzLCBmaXggaXQgKi8KICAgICAgY28tPnZhbHVlID0gc3RyZHVwKCIiKTsKICAgICAgaWYoIWNvLT52YWx1ZSkKICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICBlbHNlCiAgICAgICAgZmllbGRzKys7CiAgICB9CgogICAgaWYoIWJhZGNvb2tpZSAmJiAoNyAhPSBmaWVsZHMpKQogICAgICAvKiB3ZSBkaWQgbm90IGZpbmQgdGhlIHN1ZmZpY2llbnQgbnVtYmVyIG9mIGZpZWxkcyAqLwogICAgICBiYWRjb29raWUgPSBUUlVFOwoKICAgIGlmKGJhZGNvb2tpZSkgewogICAgICBmcmVlY29va2llKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogIH0KCiAgaWYoIWMtPnJ1bm5pbmcgJiYgICAgLyogcmVhZCBmcm9tIGEgZmlsZSAqLwogICAgIGMtPm5ld3Nlc3Npb24gJiYgIC8qIGNsZWFuIHNlc3Npb24gY29va2llcyAqLwogICAgICFjby0+ZXhwaXJlcykgeyAgIC8qIHRoaXMgaXMgYSBzZXNzaW9uIGNvb2tpZSBzaW5jZSBpdCBkb2Vzbid0IGV4cGlyZSEgKi8KICAgIGZyZWVjb29raWUoY28pOwogICAgcmV0dXJuIE5VTEw7CiAgfQoKICBjby0+bGl2ZWNvb2tpZSA9IGMtPnJ1bm5pbmc7CgogIC8qIG5vdywgd2UgaGF2ZSBwYXJzZWQgdGhlIGluY29taW5nIGxpbmUsIHdlIG11c3Qgbm93IGNoZWNrIGlmIHRoaXMKICAgICBzdXBlcmNlZWRzIGFuIGFscmVhZHkgZXhpc3RpbmcgY29va2llLCB3aGljaCBpdCBtYXkgaWYgdGhlIHByZXZpb3VzIGhhdmUKICAgICB0aGUgc2FtZSBkb21haW4gYW5kIHBhdGggYXMgdGhpcyAqLwoKICAvKiBhdCBmaXJzdCwgcmVtb3ZlIGV4cGlyZWQgY29va2llcyAqLwogIHJlbW92ZV9leHBpcmVkKGMpOwoKI2lmZGVmIFVTRV9MSUJQU0wKICAvKiBDaGVjayBpZiB0aGUgZG9tYWluIGlzIGEgUHVibGljIFN1ZmZpeCBhbmQgaWYgeWVzLCBpZ25vcmUgdGhlIGNvb2tpZS4KICAgICBUaGlzIG5lZWRzIGEgbGlicHNsIGNvbXBpbGVkIHdpdGggYnVpbHRpbiBkYXRhLiAqLwogIGlmKGRvbWFpbiAmJiBjby0+ZG9tYWluICYmICFpc2lwKGNvLT5kb21haW4pKSB7CiAgICBpZigoKHBzbCA9IHBzbF9idWlsdGluKCkpICE9IE5VTEwpCiAgICAgICAgJiYgIXBzbF9pc19jb29raWVfZG9tYWluX2FjY2VwdGFibGUocHNsLCBkb21haW4sIGNvLT5kb21haW4pKSB7CiAgICAgIGluZm9mKGRhdGEsCiAgICAgICAgICAgICJjb29raWUgJyVzJyBkcm9wcGVkLCBkb21haW4gJyVzJyBtdXN0IG5vdCBzZXQgY29va2llcyBmb3IgJyVzJ1xuIiwKICAgICAgICAgICAgY28tPm5hbWUsIGRvbWFpbiwgY28tPmRvbWFpbik7CiAgICAgIGZyZWVjb29raWUoY28pOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICB9CiNlbmRpZgoKICBjbGlzdCA9IGMtPmNvb2tpZXM7CiAgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICB3aGlsZShjbGlzdCkgewogICAgaWYoc3RyY2FzZWNvbXBhcmUoY2xpc3QtPm5hbWUsIGNvLT5uYW1lKSkgewogICAgICAvKiB0aGUgbmFtZXMgYXJlIGlkZW50aWNhbCAqLwoKICAgICAgaWYoY2xpc3QtPmRvbWFpbiAmJiBjby0+ZG9tYWluKSB7CiAgICAgICAgaWYoc3RyY2FzZWNvbXBhcmUoY2xpc3QtPmRvbWFpbiwgY28tPmRvbWFpbikgJiYKICAgICAgICAgIChjbGlzdC0+dGFpbG1hdGNoID09IGNvLT50YWlsbWF0Y2gpKQogICAgICAgICAgLyogVGhlIGRvbWFpbnMgYXJlIGlkZW50aWNhbCAqLwogICAgICAgICAgcmVwbGFjZV9vbGQ9VFJVRTsKICAgICAgfQogICAgICBlbHNlIGlmKCFjbGlzdC0+ZG9tYWluICYmICFjby0+ZG9tYWluKQogICAgICAgIHJlcGxhY2Vfb2xkID0gVFJVRTsKCiAgICAgIGlmKHJlcGxhY2Vfb2xkKSB7CiAgICAgICAgLyogdGhlIGRvbWFpbnMgd2VyZSBpZGVudGljYWwgKi8KCiAgICAgICAgaWYoY2xpc3QtPnNwYXRoICYmIGNvLT5zcGF0aCkgewogICAgICAgICAgaWYoc3RyY2FzZWNvbXBhcmUoY2xpc3QtPnNwYXRoLCBjby0+c3BhdGgpKSB7CiAgICAgICAgICAgIHJlcGxhY2Vfb2xkID0gVFJVRTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgICAgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZighY2xpc3QtPnNwYXRoICYmICFjby0+c3BhdGgpCiAgICAgICAgICByZXBsYWNlX29sZCA9IFRSVUU7CiAgICAgICAgZWxzZQogICAgICAgICAgcmVwbGFjZV9vbGQgPSBGQUxTRTsKCiAgICAgIH0KCiAgICAgIGlmKHJlcGxhY2Vfb2xkICYmICFjby0+bGl2ZWNvb2tpZSAmJiBjbGlzdC0+bGl2ZWNvb2tpZSkgewogICAgICAgIC8qIEJvdGggY29va2llcyBtYXRjaGVkIGZpbmUsIGV4Y2VwdCB0aGF0IHRoZSBhbHJlYWR5IHByZXNlbnQKICAgICAgICAgICBjb29raWUgaXMgImxpdmUiLCB3aGljaCBtZWFucyBpdCB3YXMgc2V0IGZyb20gYSBoZWFkZXIsIHdoaWxlCiAgICAgICAgICAgdGhlIG5ldyBvbmUgaXNuJ3QgImxpdmUiIGFuZCB0aHVzIG9ubHkgcmVhZCBmcm9tIGEgZmlsZS4gV2UgbGV0CiAgICAgICAgICAgbGl2ZSBjb29raWVzIHN0YXkgYWxpdmUgKi8KCiAgICAgICAgLyogRnJlZSB0aGUgbmV3Y29tZXIgYW5kIGdldCBvdXQgb2YgaGVyZSEgKi8KICAgICAgICBmcmVlY29va2llKGNvKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgfQoKICAgICAgaWYocmVwbGFjZV9vbGQpIHsKICAgICAgICBjby0+bmV4dCA9IGNsaXN0LT5uZXh0OyAvKiBnZXQgdGhlIG5leHQtcG9pbnRlciBmaXJzdCAqLwoKICAgICAgICAvKiB0aGVuIGZyZWUgYWxsIHRoZSBvbGQgcG9pbnRlcnMgKi8KICAgICAgICBmcmVlKGNsaXN0LT5uYW1lKTsKICAgICAgICBmcmVlKGNsaXN0LT52YWx1ZSk7CiAgICAgICAgZnJlZShjbGlzdC0+ZG9tYWluKTsKICAgICAgICBmcmVlKGNsaXN0LT5wYXRoKTsKICAgICAgICBmcmVlKGNsaXN0LT5zcGF0aCk7CiAgICAgICAgZnJlZShjbGlzdC0+ZXhwaXJlc3RyKTsKICAgICAgICBmcmVlKGNsaXN0LT52ZXJzaW9uKTsKICAgICAgICBmcmVlKGNsaXN0LT5tYXhhZ2UpOwoKICAgICAgICAqY2xpc3QgPSAqY287ICAvKiB0aGVuIHN0b3JlIGFsbCB0aGUgbmV3IGRhdGEgKi8KCiAgICAgICAgZnJlZShjbyk7ICAgLyogZnJlZSB0aGUgbmV3bHkgYWxsb2NlZCBtZW1vcnkgKi8KICAgICAgICBjbyA9IGNsaXN0OyAvKiBwb2ludCB0byB0aGUgcHJldmlvdXMgc3RydWN0IGluc3RlYWQgKi8KCiAgICAgICAgLyogV2UgaGF2ZSByZXBsYWNlZCBhIGNvb2tpZSwgbm93IHNraXAgdGhlIHJlc3Qgb2YgdGhlIGxpc3QgYnV0CiAgICAgICAgICAgbWFrZSBzdXJlIHRoZSAnbGFzdGMnIHBvaW50ZXIgaXMgcHJvcGVybHkgc2V0ICovCiAgICAgICAgZG8gewogICAgICAgICAgbGFzdGMgPSBjbGlzdDsKICAgICAgICAgIGNsaXN0ID0gY2xpc3QtPm5leHQ7CiAgICAgICAgfSB3aGlsZShjbGlzdCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGxhc3RjID0gY2xpc3Q7CiAgICBjbGlzdCA9IGNsaXN0LT5uZXh0OwogIH0KCiAgaWYoYy0+cnVubmluZykKICAgIC8qIE9ubHkgc2hvdyB0aGlzIHdoZW4gTk9UIHJlYWRpbmcgdGhlIGNvb2tpZXMgZnJvbSBhIGZpbGUgKi8KICAgIGluZm9mKGRhdGEsICIlcyBjb29raWUgJXM9XCIlc1wiIGZvciBkb21haW4gJXMsIHBhdGggJXMsICIKICAgICAgICAgICJleHBpcmUgJSIgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAiXG4iLAogICAgICAgICAgcmVwbGFjZV9vbGQ/IlJlcGxhY2VkIjoiQWRkZWQiLCBjby0+bmFtZSwgY28tPnZhbHVlLAogICAgICAgICAgY28tPmRvbWFpbiwgY28tPnBhdGgsIGNvLT5leHBpcmVzKTsKCiAgaWYoIXJlcGxhY2Vfb2xkKSB7CiAgICAvKiB0aGVuIG1ha2UgdGhlIGxhc3QgaXRlbSBwb2ludCBvbiB0aGlzIG5ldyBvbmUgKi8KICAgIGlmKGxhc3RjKQogICAgICBsYXN0Yy0+bmV4dCA9IGNvOwogICAgZWxzZQogICAgICBjLT5jb29raWVzID0gY287CiAgICBjLT5udW1jb29raWVzKys7IC8qIG9uZSBtb3JlIGNvb2tpZSBpbiB0aGUgamFyICovCiAgfQoKICByZXR1cm4gY287Cn0KCi8qCiAqIGdldF9saW5lKCkgbWFrZXMgc3VyZSB0byBvbmx5IHJldHVybiBjb21wbGV0ZSB3aG9sZSBsaW5lcyB0aGF0IGZpdCBpbiAnbGVuJwogKiBieXRlcyBhbmQgZW5kIHdpdGggYSBuZXdsaW5lLgogKi8Kc3RhdGljIGNoYXIgKmdldF9saW5lKGNoYXIgKmJ1ZiwgaW50IGxlbiwgRklMRSAqaW5wdXQpCnsKICBib29sIHBhcnRpYWwgPSBGQUxTRTsKICB3aGlsZSgxKSB7CiAgICBjaGFyICpiID0gZmdldHMoYnVmLCBsZW4sIGlucHV0KTsKICAgIGlmKGIpIHsKICAgICAgc2l6ZV90IHJsZW4gPSBzdHJsZW4oYik7CiAgICAgIGlmKHJsZW4gJiYgKGJbcmxlbi0xXSA9PSAnXG4nKSkgewogICAgICAgIGlmKHBhcnRpYWwpIHsKICAgICAgICAgIHBhcnRpYWwgPSBGQUxTRTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYjsKICAgICAgfQogICAgICBlbHNlCiAgICAgICAgLyogcmVhZCBhIHBhcnRpYWwsIGRpc2NhcmQgdGhlIG5leHQgcGllY2UgdGhhdCBlbmRzIHdpdGggbmV3bGluZSAqLwogICAgICAgIHBhcnRpYWwgPSBUUlVFOwogICAgfQogICAgZWxzZQogICAgICBicmVhazsKICB9CiAgcmV0dXJuIE5VTEw7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfaW5pdCgpCiAqCiAqIEluaXRzIGEgY29va2llIHN0cnVjdCB0byByZWFkIGRhdGEgZnJvbSBhIGxvY2FsIGZpbGUuIFRoaXMgaXMgYWx3YXlzCiAqIGNhbGxlZCBiZWZvcmUgYW55IGNvb2tpZXMgYXJlIHNldC4gRmlsZSBtYXkgYmUgTlVMTC4KICoKICogSWYgJ25ld3Nlc3Npb24nIGlzIFRSVUUsIGRpc2NhcmQgYWxsICJzZXNzaW9uIGNvb2tpZXMiIG9uIHJlYWQgZnJvbSBmaWxlLgogKgogKiBSZXR1cm5zIE5VTEwgb24gb3V0IG9mIG1lbW9yeS4gSW52YWxpZCBjb29raWVzIGFyZSBpZ25vcmVkLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IENvb2tpZUluZm8gKkN1cmxfY29va2llX2luaXQoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENvb2tpZUluZm8gKmluYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZXdzZXNzaW9uKQp7CiAgc3RydWN0IENvb2tpZUluZm8gKmM7CiAgRklMRSAqZnAgPSBOVUxMOwogIGJvb2wgZnJvbWZpbGU9VFJVRTsKICBjaGFyICpsaW5lID0gTlVMTDsKCiAgaWYoTlVMTCA9PSBpbmMpIHsKICAgIC8qIHdlIGRpZG4ndCBnZXQgYSBzdHJ1Y3QsIGNyZWF0ZSBvbmUgKi8KICAgIGMgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBDb29raWVJbmZvKSk7CiAgICBpZighYykKICAgICAgcmV0dXJuIE5VTEw7IC8qIGZhaWxlZCB0byBnZXQgbWVtb3J5ICovCiAgICBjLT5maWxlbmFtZSA9IHN0cmR1cChmaWxlP2ZpbGU6Im5vbmUiKTsgLyogY29weSB0aGUgbmFtZSBqdXN0IGluIGNhc2UgKi8KICAgIGlmKCFjLT5maWxlbmFtZSkKICAgICAgZ290byBmYWlsOyAvKiBmYWlsZWQgdG8gZ2V0IG1lbW9yeSAqLwogIH0KICBlbHNlIHsKICAgIC8qIHdlIGdvdCBhbiBhbHJlYWR5IGV4aXN0aW5nIG9uZSwgdXNlIHRoYXQgKi8KICAgIGMgPSBpbmM7CiAgfQogIGMtPnJ1bm5pbmcgPSBGQUxTRTsgLyogdGhpcyBpcyBub3QgcnVubmluZywgdGhpcyBpcyBpbml0ICovCgogIGlmKGZpbGUgJiYgIXN0cmNtcChmaWxlLCAiLSIpKSB7CiAgICBmcCA9IHN0ZGluOwogICAgZnJvbWZpbGU9RkFMU0U7CiAgfQogIGVsc2UgaWYoZmlsZSAmJiAhKmZpbGUpIHsKICAgIC8qIHBvaW50cyB0byBhICIiIHN0cmluZyAqLwogICAgZnAgPSBOVUxMOwogIH0KICBlbHNlCiAgICBmcCA9IGZpbGU/Zm9wZW4oZmlsZSwgRk9QRU5fUkVBRFRFWFQpOk5VTEw7CgogIGMtPm5ld3Nlc3Npb24gPSBuZXdzZXNzaW9uOyAvKiBuZXcgc2Vzc2lvbj8gKi8KCiAgaWYoZnApIHsKICAgIGNoYXIgKmxpbmVwdHI7CiAgICBib29sIGhlYWRlcmxpbmU7CgogICAgbGluZSA9IG1hbGxvYyhNQVhfQ09PS0lFX0xJTkUpOwogICAgaWYoIWxpbmUpCiAgICAgIGdvdG8gZmFpbDsKICAgIHdoaWxlKGdldF9saW5lKGxpbmUsIE1BWF9DT09LSUVfTElORSwgZnApKSB7CiAgICAgIGlmKGNoZWNrcHJlZml4KCJTZXQtQ29va2llOiIsIGxpbmUpKSB7CiAgICAgICAgLyogVGhpcyBpcyBhIGNvb2tpZSBsaW5lLCBnZXQgaXQhICovCiAgICAgICAgbGluZXB0cj0mbGluZVsxMV07CiAgICAgICAgaGVhZGVybGluZT1UUlVFOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGxpbmVwdHI9bGluZTsKICAgICAgICBoZWFkZXJsaW5lPUZBTFNFOwogICAgICB9CiAgICAgIHdoaWxlKCpsaW5lcHRyICYmIElTQkxBTksoKmxpbmVwdHIpKQogICAgICAgIGxpbmVwdHIrKzsKCiAgICAgIEN1cmxfY29va2llX2FkZChkYXRhLCBjLCBoZWFkZXJsaW5lLCBsaW5lcHRyLCBOVUxMLCBOVUxMKTsKICAgIH0KICAgIGZyZWUobGluZSk7IC8qIGZyZWUgdGhlIGxpbmUgYnVmZmVyICovCgogICAgaWYoZnJvbWZpbGUpCiAgICAgIGZjbG9zZShmcCk7CiAgfQoKICBjLT5ydW5uaW5nID0gVFJVRTsgICAgICAgICAgLyogbm93LCB3ZSdyZSBydW5uaW5nICovCgogIHJldHVybiBjOwoKZmFpbDoKICBmcmVlKGxpbmUpOwogIGlmKCFpbmMpCiAgICAvKiBPbmx5IGNsZWFuIHVwIGlmIHdlIGFsbG9jYXRlZCBpdCBoZXJlLCBhcyB0aGUgb3JpZ2luYWwgY291bGQgc3RpbGwgYmUgaW4KICAgICAqIHVzZSBieSBhIHNoYXJlIGhhbmRsZSAqLwogICAgQ3VybF9jb29raWVfY2xlYW51cChjKTsKICBpZihmcm9tZmlsZSAmJiBmcCkKICAgIGZjbG9zZShmcCk7CiAgcmV0dXJuIE5VTEw7IC8qIG91dCBvZiBtZW1vcnkgKi8KfQoKLyogc29ydCB0aGlzIHNvIHRoYXQgdGhlIGxvbmdlc3QgcGF0aCBnZXRzIGJlZm9yZSB0aGUgc2hvcnRlciBwYXRoICovCnN0YXRpYyBpbnQgY29va2llX3NvcnQoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQp7CiAgc3RydWN0IENvb2tpZSAqYzEgPSAqKHN0cnVjdCBDb29raWUgKiopcDE7CiAgc3RydWN0IENvb2tpZSAqYzIgPSAqKHN0cnVjdCBDb29raWUgKiopcDI7CiAgc2l6ZV90IGwxLCBsMjsKCiAgLyogMSAtIGNvbXBhcmUgY29va2llIHBhdGggbGVuZ3RocyAqLwogIGwxID0gYzEtPnBhdGggPyBzdHJsZW4oYzEtPnBhdGgpIDogMDsKICBsMiA9IGMyLT5wYXRoID8gc3RybGVuKGMyLT5wYXRoKSA6IDA7CgogIGlmKGwxICE9IGwyKQogICAgcmV0dXJuIChsMiA+IGwxKSA/IDEgOiAtMSA7IC8qIGF2b2lkIHNpemVfdCA8PT4gaW50IGNvbnZlcnNpb25zICovCgogIC8qIDIgLSBjb21wYXJlIGNvb2tpZSBkb21haW4gbGVuZ3RocyAqLwogIGwxID0gYzEtPmRvbWFpbiA/IHN0cmxlbihjMS0+ZG9tYWluKSA6IDA7CiAgbDIgPSBjMi0+ZG9tYWluID8gc3RybGVuKGMyLT5kb21haW4pIDogMDsKCiAgaWYobDEgIT0gbDIpCiAgICByZXR1cm4gKGwyID4gbDEpID8gMSA6IC0xIDsgIC8qIGF2b2lkIHNpemVfdCA8PT4gaW50IGNvbnZlcnNpb25zICovCgogIC8qIDMgLSBjb21wYXJlIGNvb2tpZSBuYW1lcyAqLwogIGlmKGMxLT5uYW1lICYmIGMyLT5uYW1lKQogICAgcmV0dXJuIHN0cmNtcChjMS0+bmFtZSwgYzItPm5hbWUpOwoKICAvKiBzb3JyeSwgY2FuJ3QgYmUgbW9yZSBkZXRlcm1pbmlzdGljICovCiAgcmV0dXJuIDA7Cn0KCiNkZWZpbmUgQ0xPTkUoZmllbGQpICAgICAgICAgICAgICAgICAgICAgXAogIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGlmKHNyYy0+ZmllbGQpIHsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIGR1cC0+ZmllbGQgPSBzdHJkdXAoc3JjLT5maWVsZCk7ICAgXAogICAgICBpZighZHVwLT5maWVsZCkgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBnb3RvIGZhaWw7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogIH0gd2hpbGUoMCkKCnN0YXRpYyBzdHJ1Y3QgQ29va2llICpkdXBfY29va2llKHN0cnVjdCBDb29raWUgKnNyYykKewogIHN0cnVjdCBDb29raWUgKmR1cCA9IGNhbGxvYyhzaXplb2Yoc3RydWN0IENvb2tpZSksIDEpOwogIGlmKGR1cCkgewogICAgQ0xPTkUoZXhwaXJlc3RyKTsKICAgIENMT05FKGRvbWFpbik7CiAgICBDTE9ORShwYXRoKTsKICAgIENMT05FKHNwYXRoKTsKICAgIENMT05FKG5hbWUpOwogICAgQ0xPTkUodmFsdWUpOwogICAgQ0xPTkUobWF4YWdlKTsKICAgIENMT05FKHZlcnNpb24pOwogICAgZHVwLT5leHBpcmVzID0gc3JjLT5leHBpcmVzOwogICAgZHVwLT50YWlsbWF0Y2ggPSBzcmMtPnRhaWxtYXRjaDsKICAgIGR1cC0+c2VjdXJlID0gc3JjLT5zZWN1cmU7CiAgICBkdXAtPmxpdmVjb29raWUgPSBzcmMtPmxpdmVjb29raWU7CiAgICBkdXAtPmh0dHBvbmx5ID0gc3JjLT5odHRwb25seTsKICB9CiAgcmV0dXJuIGR1cDsKCiAgZmFpbDoKICBmcmVlY29va2llKGR1cCk7CiAgcmV0dXJuIE5VTEw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9nZXRsaXN0KCkKICoKICogRm9yIGEgZ2l2ZW4gaG9zdCBhbmQgcGF0aCwgcmV0dXJuIGEgbGlua2VkIGxpc3Qgb2YgY29va2llcyB0aGF0IHRoZQogKiBjbGllbnQgc2hvdWxkIHNlbmQgdG8gdGhlIHNlcnZlciBpZiB1c2VkIG5vdy4gVGhlIHNlY3VyZSBib29sZWFuIGluZm9ybXMKICogdGhlIGNvb2tpZSBpZiBhIHNlY3VyZSBjb25uZWN0aW9uIGlzIGFjaGlldmVkIG9yIG5vdC4KICoKICogSXQgc2hhbGwgb25seSByZXR1cm4gY29va2llcyB0aGF0IGhhdmVuJ3QgZXhwaXJlZC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdHJ1Y3QgQ29va2llICpDdXJsX2Nvb2tpZV9nZXRsaXN0KHN0cnVjdCBDb29raWVJbmZvICpjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKnBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZWN1cmUpCnsKICBzdHJ1Y3QgQ29va2llICpuZXdjbzsKICBzdHJ1Y3QgQ29va2llICpjbzsKICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKICBzdHJ1Y3QgQ29va2llICptYWluY289TlVMTDsKICBzaXplX3QgbWF0Y2hlcyA9IDA7CiAgYm9vbCBpc19pcDsKCiAgaWYoIWMgfHwgIWMtPmNvb2tpZXMpCiAgICByZXR1cm4gTlVMTDsgLyogbm8gY29va2llIHN0cnVjdCBvciBubyBjb29raWVzIGluIHRoZSBzdHJ1Y3QgKi8KCiAgLyogYXQgZmlyc3QsIHJlbW92ZSBleHBpcmVkIGNvb2tpZXMgKi8KICByZW1vdmVfZXhwaXJlZChjKTsKCiAgLyogY2hlY2sgaWYgaG9zdCBpcyBhbiBJUCh2NHx2NikgYWRkcmVzcyAqLwogIGlzX2lwID0gaXNpcChob3N0KTsKCiAgY28gPSBjLT5jb29raWVzOwoKICB3aGlsZShjbykgewogICAgLyogb25seSBwcm9jZXNzIHRoaXMgY29va2llIGlmIGl0IGlzIG5vdCBleHBpcmVkIG9yIGhhZCBubyBleHBpcmUKICAgICAgIGRhdGUgQU5EIHRoYXQgaWYgdGhlIGNvb2tpZSByZXF1aXJlcyB3ZSdyZSBzZWN1cmUgd2UgbXVzdCBvbmx5CiAgICAgICBjb250aW51ZSBpZiB3ZSBhcmUhICovCiAgICBpZigoIWNvLT5leHBpcmVzIHx8IChjby0+ZXhwaXJlcyA+IG5vdykpICYmCiAgICAgICAoY28tPnNlY3VyZT9zZWN1cmU6VFJVRSkpIHsKCiAgICAgIC8qIG5vdyBjaGVjayBpZiB0aGUgZG9tYWluIGlzIGNvcnJlY3QgKi8KICAgICAgaWYoIWNvLT5kb21haW4gfHwKICAgICAgICAgKGNvLT50YWlsbWF0Y2ggJiYgIWlzX2lwICYmIHRhaWxtYXRjaChjby0+ZG9tYWluLCBob3N0KSkgfHwKICAgICAgICAgKCghY28tPnRhaWxtYXRjaCB8fCBpc19pcCkgJiYgc3RyY2FzZWNvbXBhcmUoaG9zdCwgY28tPmRvbWFpbikpICkgewogICAgICAgIC8qIHRoZSByaWdodCBwYXJ0IG9mIHRoZSBob3N0IG1hdGNoZXMgdGhlIGRvbWFpbiBzdHVmZiBpbiB0aGUKICAgICAgICAgICBjb29raWUgZGF0YSAqLwoKICAgICAgICAvKiBub3cgY2hlY2sgdGhlIGxlZnQgcGFydCBvZiB0aGUgcGF0aCB3aXRoIHRoZSBjb29raWVzIHBhdGgKICAgICAgICAgICByZXF1aXJlbWVudCAqLwogICAgICAgIGlmKCFjby0+c3BhdGggfHwgcGF0aG1hdGNoKGNvLT5zcGF0aCwgcGF0aCkgKSB7CgogICAgICAgICAgLyogYW5kIG5vdywgd2Uga25vdyB0aGlzIGlzIGEgbWF0Y2ggYW5kIHdlIHNob3VsZCBjcmVhdGUgYW4KICAgICAgICAgICAgIGVudHJ5IGZvciB0aGUgcmV0dXJuLWxpbmtlZC1saXN0ICovCgogICAgICAgICAgbmV3Y28gPSBkdXBfY29va2llKGNvKTsKICAgICAgICAgIGlmKG5ld2NvKSB7CiAgICAgICAgICAgIC8qIHRoZW4gbW9kaWZ5IG91ciBuZXh0ICovCiAgICAgICAgICAgIG5ld2NvLT5uZXh0ID0gbWFpbmNvOwoKICAgICAgICAgICAgLyogcG9pbnQgdGhlIG1haW4gdG8gdXMgKi8KICAgICAgICAgICAgbWFpbmNvID0gbmV3Y287CgogICAgICAgICAgICBtYXRjaGVzKys7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZmFpbDoKICAgICAgICAgICAgLyogZmFpbHVyZSwgY2xlYXIgdXAgdGhlIGFsbG9jYXRlZCBjaGFpbiBhbmQgcmV0dXJuIE5VTEwgKi8KICAgICAgICAgICAgQ3VybF9jb29raWVfZnJlZWxpc3QobWFpbmNvKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjbyA9IGNvLT5uZXh0OwogIH0KCiAgaWYobWF0Y2hlcykgewogICAgLyogTm93IHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaWYgdGhlcmUgaXMgYSBuYW1lIGFwcGVhcmluZyBtb3JlIHRoYW4KICAgICAgIG9uY2UsIHRoZSBsb25nZXN0IHNwZWNpZmllZCBwYXRoIHZlcnNpb24gY29tZXMgZmlyc3QuIFRvIG1ha2UgdGhpcwogICAgICAgdGhlIHN3aWZ0ZXN0IHdheSwgd2UganVzdCBzb3J0IHRoZW0gYWxsIGJhc2VkIG9uIHBhdGggbGVuZ3RoLiAqLwogICAgc3RydWN0IENvb2tpZSAqKmFycmF5OwogICAgc2l6ZV90IGk7CgogICAgLyogYWxsb2MgYW4gYXJyYXkgYW5kIHN0b3JlIGFsbCBjb29raWUgcG9pbnRlcnMgKi8KICAgIGFycmF5ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgQ29va2llICopICogbWF0Y2hlcyk7CiAgICBpZighYXJyYXkpCiAgICAgIGdvdG8gZmFpbDsKCiAgICBjbyA9IG1haW5jbzsKCiAgICBmb3IoaT0wOyBjbzsgY28gPSBjby0+bmV4dCkKICAgICAgYXJyYXlbaSsrXSA9IGNvOwoKICAgIC8qIG5vdyBzb3J0IHRoZSBjb29raWUgcG9pbnRlcnMgaW4gcGF0aCBsZW5ndGggb3JkZXIgKi8KICAgIHFzb3J0KGFycmF5LCBtYXRjaGVzLCBzaXplb2Yoc3RydWN0IENvb2tpZSAqKSwgY29va2llX3NvcnQpOwoKICAgIC8qIHJlbWFrZSB0aGUgbGlua2VkIGxpc3Qgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZSBuZXcgb3JkZXIgKi8KCiAgICBtYWluY28gPSBhcnJheVswXTsgLyogc3RhcnQgaGVyZSAqLwogICAgZm9yKGk9MDsgaTxtYXRjaGVzLTE7IGkrKykKICAgICAgYXJyYXlbaV0tPm5leHQgPSBhcnJheVtpKzFdOwogICAgYXJyYXlbbWF0Y2hlcy0xXS0+bmV4dCA9IE5VTEw7IC8qIHRlcm1pbmF0ZSB0aGUgbGlzdCAqLwoKICAgIGZyZWUoYXJyYXkpOyAvKiByZW1vdmUgdGhlIHRlbXBvcmFyeSBkYXRhIGFnYWluICovCiAgfQoKICByZXR1cm4gbWFpbmNvOyAvKiByZXR1cm4gdGhlIG5ldyBsaXN0ICovCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9jbGVhcmFsbCgpCiAqCiAqIENsZWFyIGFsbCBleGlzdGluZyBjb29raWVzIGFuZCByZXNldCB0aGUgY291bnRlci4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgQ3VybF9jb29raWVfY2xlYXJhbGwoc3RydWN0IENvb2tpZUluZm8gKmNvb2tpZXMpCnsKICBpZihjb29raWVzKSB7CiAgICBDdXJsX2Nvb2tpZV9mcmVlbGlzdChjb29raWVzLT5jb29raWVzKTsKICAgIGNvb2tpZXMtPmNvb2tpZXMgPSBOVUxMOwogICAgY29va2llcy0+bnVtY29va2llcyA9IDA7CiAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfZnJlZWxpc3QoKQogKgogKiBGcmVlIGEgbGlzdCBvZiBjb29raWVzIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgQ3VybF9jb29raWVfZ2V0bGlzdCgpOwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgQ3VybF9jb29raWVfZnJlZWxpc3Qoc3RydWN0IENvb2tpZSAqY28pCnsKICBzdHJ1Y3QgQ29va2llICpuZXh0OwogIHdoaWxlKGNvKSB7CiAgICBuZXh0ID0gY28tPm5leHQ7CiAgICBmcmVlY29va2llKGNvKTsKICAgIGNvID0gbmV4dDsKICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfY2xlYXJzZXNzKCkKICoKICogRnJlZSBhbGwgc2Vzc2lvbiBjb29raWVzIGluIHRoZSBjb29raWVzIGxpc3QuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEN1cmxfY29va2llX2NsZWFyc2VzcyhzdHJ1Y3QgQ29va2llSW5mbyAqY29va2llcykKewogIHN0cnVjdCBDb29raWUgKmZpcnN0LCAqY3VyciwgKm5leHQsICpwcmV2ID0gTlVMTDsKCiAgaWYoIWNvb2tpZXMgfHwgIWNvb2tpZXMtPmNvb2tpZXMpCiAgICByZXR1cm47CgogIGZpcnN0ID0gY3VyciA9IHByZXYgPSBjb29raWVzLT5jb29raWVzOwoKICBmb3IoOyBjdXJyOyBjdXJyID0gbmV4dCkgewogICAgbmV4dCA9IGN1cnItPm5leHQ7CiAgICBpZighY3Vyci0+ZXhwaXJlcykgewogICAgICBpZihmaXJzdCA9PSBjdXJyKQogICAgICAgIGZpcnN0ID0gbmV4dDsKCiAgICAgIGlmKHByZXYgPT0gY3VycikKICAgICAgICBwcmV2ID0gbmV4dDsKICAgICAgZWxzZQogICAgICAgIHByZXYtPm5leHQgPSBuZXh0OwoKICAgICAgZnJlZWNvb2tpZShjdXJyKTsKICAgICAgY29va2llcy0+bnVtY29va2llcy0tOwogICAgfQogICAgZWxzZQogICAgICBwcmV2ID0gY3VycjsKICB9CgogIGNvb2tpZXMtPmNvb2tpZXMgPSBmaXJzdDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9jbGVhbnVwKCkKICoKICogRnJlZSBhICJjb29raWUgb2JqZWN0IiBwcmV2aW91cyBjcmVhdGVkIHdpdGggQ3VybF9jb29raWVfaW5pdCgpLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBDdXJsX2Nvb2tpZV9jbGVhbnVwKHN0cnVjdCBDb29raWVJbmZvICpjKQp7CiAgaWYoYykgewogICAgZnJlZShjLT5maWxlbmFtZSk7CiAgICBDdXJsX2Nvb2tpZV9mcmVlbGlzdChjLT5jb29raWVzKTsKICAgIGZyZWUoYyk7IC8qIGZyZWUgdGhlIGJhc2Ugc3RydWN0IGFzIHdlbGwgKi8KICB9Cn0KCi8qIGdldF9uZXRzY2FwZV9mb3JtYXQoKQogKgogKiBGb3JtYXRzIGEgc3RyaW5nIGZvciBOZXRzY2FwZSBvdXRwdXQgZmlsZSwgdy9vIGEgbmV3bGluZSBhdCB0aGUgZW5kLgogKgogKiBGdW5jdGlvbiByZXR1cm5zIGEgY2hhciAqIHRvIGEgZm9ybWF0dGVkIGxpbmUuIEhhcyB0byBiZSBmcmVlKClkCiovCnN0YXRpYyBjaGFyICpnZXRfbmV0c2NhcGVfZm9ybWF0KGNvbnN0IHN0cnVjdCBDb29raWUgKmNvKQp7CiAgcmV0dXJuIGFwcmludGYoCiAgICAiJXMiICAgICAvKiBodHRwb25seSBwcmVhbWJsZSAqLwogICAgIiVzJXNcdCIgLyogZG9tYWluICovCiAgICAiJXNcdCIgICAvKiB0YWlsbWF0Y2ggKi8KICAgICIlc1x0IiAgIC8qIHBhdGggKi8KICAgICIlc1x0IiAgIC8qIHNlY3VyZSAqLwogICAgIiUiIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgIlx0IiAgIC8qIGV4cGlyZXMgKi8KICAgICIlc1x0IiAgIC8qIG5hbWUgKi8KICAgICIlcyIsICAgIC8qIHZhbHVlICovCiAgICBjby0+aHR0cG9ubHk/IiNIdHRwT25seV8iOiIiLAogICAgLyogTWFrZSBzdXJlIGFsbCBkb21haW5zIGFyZSBwcmVmaXhlZCB3aXRoIGEgZG90IGlmIHRoZXkgYWxsb3cKICAgICAgIHRhaWxtYXRjaGluZy4gVGhpcyBpcyBNb3ppbGxhLXN0eWxlLiAqLwogICAgKGNvLT50YWlsbWF0Y2ggJiYgY28tPmRvbWFpbiAmJiBjby0+ZG9tYWluWzBdICE9ICcuJyk/ICIuIjoiIiwKICAgIGNvLT5kb21haW4/Y28tPmRvbWFpbjoidW5rbm93biIsCiAgICBjby0+dGFpbG1hdGNoPyJUUlVFIjoiRkFMU0UiLAogICAgY28tPnBhdGg/Y28tPnBhdGg6Ii8iLAogICAgY28tPnNlY3VyZT8iVFJVRSI6IkZBTFNFIiwKICAgIGNvLT5leHBpcmVzLAogICAgY28tPm5hbWUsCiAgICBjby0+dmFsdWU/Y28tPnZhbHVlOiIiKTsKfQoKLyoKICogY29va2llX291dHB1dCgpCiAqCiAqIFdyaXRlcyBhbGwgaW50ZXJuYWxseSBrbm93biBjb29raWVzIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4gU3BlY2lmeQogKiAiLSIgYXMgZmlsZSBuYW1lIHRvIHdyaXRlIHRvIHN0ZG91dC4KICoKICogVGhlIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gb24gd3JpdGUgZmFpbHVyZS4KICovCnN0YXRpYyBpbnQgY29va2llX291dHB1dChzdHJ1Y3QgQ29va2llSW5mbyAqYywgY29uc3QgY2hhciAqZHVtcGhlcmUpCnsKICBzdHJ1Y3QgQ29va2llICpjbzsKICBGSUxFICpvdXQ7CiAgYm9vbCB1c2Vfc3Rkb3V0PUZBTFNFOwogIGNoYXIgKmZvcm1hdF9wdHI7CgogIGlmKChOVUxMID09IGMpIHx8ICgwID09IGMtPm51bWNvb2tpZXMpKQogICAgLyogSWYgdGhlcmUgYXJlIG5vIGtub3duIGNvb2tpZXMsIHdlIGRvbid0IHdyaXRlIG9yIGV2ZW4gY3JlYXRlIGFueQogICAgICAgZGVzdGluYXRpb24gZmlsZSAqLwogICAgcmV0dXJuIDA7CgogIC8qIGF0IGZpcnN0LCByZW1vdmUgZXhwaXJlZCBjb29raWVzICovCiAgcmVtb3ZlX2V4cGlyZWQoYyk7CgogIGlmKCFzdHJjbXAoIi0iLCBkdW1waGVyZSkpIHsKICAgIC8qIHVzZSBzdGRvdXQgKi8KICAgIG91dCA9IHN0ZG91dDsKICAgIHVzZV9zdGRvdXQ9VFJVRTsKICB9CiAgZWxzZSB7CiAgICBvdXQgPSBmb3BlbihkdW1waGVyZSwgRk9QRU5fV1JJVEVURVhUKTsKICAgIGlmKCFvdXQpCiAgICAgIHJldHVybiAxOyAvKiBmYWlsdXJlICovCiAgfQoKICBmcHV0cygiIyBOZXRzY2FwZSBIVFRQIENvb2tpZSBGaWxlXG4iCiAgICAgICAgIiMgaHR0cHM6Ly9jdXJsLmhheHguc2UvZG9jcy9odHRwLWNvb2tpZXMuaHRtbFxuIgogICAgICAgICIjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGxpYmN1cmwhIEVkaXQgYXQgeW91ciBvd24gcmlzay5cblxuIiwKICAgICAgICBvdXQpOwoKICBmb3IoY28gPSBjLT5jb29raWVzOyBjbzsgY28gPSBjby0+bmV4dCkgewogICAgaWYoIWNvLT5kb21haW4pCiAgICAgIGNvbnRpbnVlOwogICAgZm9ybWF0X3B0ciA9IGdldF9uZXRzY2FwZV9mb3JtYXQoY28pOwogICAgaWYoZm9ybWF0X3B0ciA9PSBOVUxMKSB7CiAgICAgIGZwcmludGYob3V0LCAiI1xuIyBGYXRhbCBsaWJjdXJsIGVycm9yXG4iKTsKICAgICAgaWYoIXVzZV9zdGRvdXQpCiAgICAgICAgZmNsb3NlKG91dCk7CiAgICAgIHJldHVybiAxOwogICAgfQogICAgZnByaW50ZihvdXQsICIlc1xuIiwgZm9ybWF0X3B0cik7CiAgICBmcmVlKGZvcm1hdF9wdHIpOwogIH0KCiAgaWYoIXVzZV9zdGRvdXQpCiAgICBmY2xvc2Uob3V0KTsKCiAgcmV0dXJuIDA7Cn0KCnN0cnVjdCBjdXJsX3NsaXN0ICpDdXJsX2Nvb2tpZV9saXN0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCnsKICBzdHJ1Y3QgY3VybF9zbGlzdCAqbGlzdCA9IE5VTEw7CiAgc3RydWN0IGN1cmxfc2xpc3QgKmJlZzsKICBzdHJ1Y3QgQ29va2llICpjOwogIGNoYXIgKmxpbmU7CgogIGlmKChkYXRhLT5jb29raWVzID09IE5VTEwpIHx8CiAgICAgIChkYXRhLT5jb29raWVzLT5udW1jb29raWVzID09IDApKQogICAgcmV0dXJuIE5VTEw7CgogIGZvcihjID0gZGF0YS0+Y29va2llcy0+Y29va2llczsgYzsgYyA9IGMtPm5leHQpIHsKICAgIGlmKCFjLT5kb21haW4pCiAgICAgIGNvbnRpbnVlOwogICAgbGluZSA9IGdldF9uZXRzY2FwZV9mb3JtYXQoYyk7CiAgICBpZighbGluZSkgewogICAgICBjdXJsX3NsaXN0X2ZyZWVfYWxsKGxpc3QpOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGJlZyA9IEN1cmxfc2xpc3RfYXBwZW5kX25vZHVwKGxpc3QsIGxpbmUpOwogICAgaWYoIWJlZykgewogICAgICBmcmVlKGxpbmUpOwogICAgICBjdXJsX3NsaXN0X2ZyZWVfYWxsKGxpc3QpOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGxpc3QgPSBiZWc7CiAgfQoKICByZXR1cm4gbGlzdDsKfQoKdm9pZCBDdXJsX2ZsdXNoX2Nvb2tpZXMoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgaW50IGNsZWFudXApCnsKICBpZihkYXRhLT5zZXQuc3RyW1NUUklOR19DT09LSUVKQVJdKSB7CiAgICBpZihkYXRhLT5jaGFuZ2UuY29va2llbGlzdCkgewogICAgICAvKiBJZiB0aGVyZSBpcyBhIGxpc3Qgb2YgY29va2llIGZpbGVzIHRvIHJlYWQsIGRvIGl0IGZpcnN0IHNvIHRoYXQKICAgICAgICAgd2UgaGF2ZSBhbGwgdGhlIHRvbGQgZmlsZXMgcmVhZCBiZWZvcmUgd2Ugd3JpdGUgdGhlIG5ldyBqYXIuCiAgICAgICAgIEN1cmxfY29va2llX2xvYWRmaWxlcygpIExPQ0tTIGFuZCBVTkxPQ0tTIHRoZSBzaGFyZSBpdHNlbGYhICovCiAgICAgIEN1cmxfY29va2llX2xvYWRmaWxlcyhkYXRhKTsKICAgIH0KCiAgICBDdXJsX3NoYXJlX2xvY2soZGF0YSwgQ1VSTF9MT0NLX0RBVEFfQ09PS0lFLCBDVVJMX0xPQ0tfQUNDRVNTX1NJTkdMRSk7CgogICAgLyogaWYgd2UgaGF2ZSBhIGRlc3RpbmF0aW9uIGZpbGUgZm9yIGFsbCB0aGUgY29va2llcyB0byBnZXQgZHVtcGVkIHRvICovCiAgICBpZihjb29raWVfb3V0cHV0KGRhdGEtPmNvb2tpZXMsIGRhdGEtPnNldC5zdHJbU1RSSU5HX0NPT0tJRUpBUl0pKQogICAgICBpbmZvZihkYXRhLCAiV0FSTklORzogZmFpbGVkIHRvIHNhdmUgY29va2llcyBpbiAlc1xuIiwKICAgICAgICAgICAgZGF0YS0+c2V0LnN0cltTVFJJTkdfQ09PS0lFSkFSXSk7CiAgfQogIGVsc2UgewogICAgaWYoY2xlYW51cCAmJiBkYXRhLT5jaGFuZ2UuY29va2llbGlzdCkgewogICAgICAvKiBzaW5jZSBub3RoaW5nIGlzIHdyaXR0ZW4sIHdlIGNhbiBqdXN0IGZyZWUgdGhlIGxpc3Qgb2YgY29va2llIGZpbGUKICAgICAgICAgbmFtZXMgKi8KICAgICAgY3VybF9zbGlzdF9mcmVlX2FsbChkYXRhLT5jaGFuZ2UuY29va2llbGlzdCk7IC8qIGNsZWFuIHVwIGxpc3QgKi8KICAgICAgZGF0YS0+Y2hhbmdlLmNvb2tpZWxpc3QgPSBOVUxMOwogICAgfQogICAgQ3VybF9zaGFyZV9sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSwgQ1VSTF9MT0NLX0FDQ0VTU19TSU5HTEUpOwogIH0KCiAgaWYoY2xlYW51cCAmJiAoIWRhdGEtPnNoYXJlIHx8IChkYXRhLT5jb29raWVzICE9IGRhdGEtPnNoYXJlLT5jb29raWVzKSkpIHsKICAgIEN1cmxfY29va2llX2NsZWFudXAoZGF0YS0+Y29va2llcyk7CiAgfQogIEN1cmxfc2hhcmVfdW5sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSk7Cn0KCiNlbmRpZiAvKiBDVVJMX0RJU0FCTEVfSFRUUCB8fCBDVVJMX0RJU0FCTEVfQ09PS0lFUyAqLwo=