LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfICAgXyBfX19fICBfCiAqICBQcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogKgogKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE4LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCiAqIGFyZSBhbHNvIGF2YWlsYWJsZSBhdCBodHRwczovL2N1cmwuaGF4eC5zZS9kb2NzL2NvcHlyaWdodC5odG1sLgogKgogKiBZb3UgbWF5IG9wdCB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUgYW5kL29yIHNlbGwKICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDT1BZSU5HIGZpbGUuCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioKCgpSRUNFSVZJTkcgQ09PS0lFIElORk9STUFUSU9OCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0cnVjdCBDb29raWVJbmZvICpDdXJsX2Nvb2tpZV9pbml0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgc3RydWN0IENvb2tpZUluZm8gKmluYywgYm9vbCBuZXdzZXNzaW9uKTsKCiAgICAgICAgSW5pdHMgYSBjb29raWUgc3RydWN0IHRvIHN0b3JlIGRhdGEgaW4gYSBsb2NhbCBmaWxlLiBUaGlzIGlzIGFsd2F5cwogICAgICAgIGNhbGxlZCBiZWZvcmUgYW55IGNvb2tpZXMgYXJlIHNldC4KCnN0cnVjdCBDb29raWUgKkN1cmxfY29va2llX2FkZChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAogICAgICAgICAgICAgICAgIHN0cnVjdCBDb29raWVJbmZvICpjLCBib29sIGh0dHBoZWFkZXIsIGNoYXIgKmxpbmVwdHIsCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKTsKCiAgICAgICAgVGhlICdsaW5lcHRyJyBwYXJhbWV0ZXIgaXMgYSBmdWxsICJTZXQtY29va2llOiIgbGluZSBhcwogICAgICAgIHJlY2VpdmVkIGZyb20gYSBzZXJ2ZXIuCgogICAgICAgIFRoZSBmdW5jdGlvbiBuZWVkIHRvIHJlcGxhY2UgcHJldmlvdXNseSBzdG9yZWQgbGluZXMgdGhhdCB0aGlzIG5ldwogICAgICAgIGxpbmUgc3VwZXJjZWVkcy4KCiAgICAgICAgSXQgbWF5IHJlbW92ZSBsaW5lcyB0aGF0IGFyZSBleHBpcmVkLgoKICAgICAgICBJdCBzaG91bGQgcmV0dXJuIGFuIGluZGljYXRpb24gb2Ygc3VjY2Vzcy9lcnJvci4KCgpTRU5ESU5HIENPT0tJRSBJTkZPUk1BVElPTgo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RydWN0IENvb2tpZXMgKkN1cmxfY29va2llX2dldGxpc3Qoc3RydWN0IENvb2tpZUluZm8gKmNvb2tpZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqaG9zdCwgY2hhciAqcGF0aCwgYm9vbCBzZWN1cmUpOwoKICAgICAgICBGb3IgYSBnaXZlbiBob3N0IGFuZCBwYXRoLCByZXR1cm4gYSBsaW5rZWQgbGlzdCBvZiBjb29raWVzIHRoYXQKICAgICAgICB0aGUgY2xpZW50IHNob3VsZCBzZW5kIHRvIHRoZSBzZXJ2ZXIgaWYgdXNlZCBub3cuIFRoZSBzZWN1cmUKICAgICAgICBib29sZWFuIGluZm9ybXMgdGhlIGNvb2tpZSBpZiBhIHNlY3VyZSBjb25uZWN0aW9uIGlzIGFjaGlldmVkIG9yCiAgICAgICAgbm90LgoKICAgICAgICBJdCBzaGFsbCBvbmx5IHJldHVybiBjb29raWVzIHRoYXQgaGF2ZW4ndCBleHBpcmVkLgoKCkV4YW1wbGUgc2V0IG9mIGNvb2tpZXM6CgogICAgU2V0LWNvb2tpZTogUFJPRFVDVElORk89d2VieHByZXNzOyBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6IFBFUlNPTkFMSVpFPW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS9mdGd3OyBzZWN1cmUKICAgIFNldC1jb29raWU6IEZpZEhpc3Q9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWRPcmRlcj1ub25lO2V4cGlyZXM9TW9uZGF5LCAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7CiAgICBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6IERpc1BlbmQ9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWREaXM9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOgogICAgU2Vzc2lvbl9LZXlANjc5MWE5ZTAtOTAxYS0xMWQwLWExYzgtOWIwMTJjODhhYTc3PW5vbmU7ZXhwaXJlcz1Nb25kYXksCiAgICAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7IGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQoqKioqLwoKCiNpbmNsdWRlICJjdXJsX3NldHVwLmgiCgojaWYgIWRlZmluZWQoQ1VSTF9ESVNBQkxFX0hUVFApICYmICFkZWZpbmVkKENVUkxfRElTQUJMRV9DT09LSUVTKQoKI2lmZGVmIFVTRV9MSUJQU0wKIyBpbmNsdWRlIDxsaWJwc2wuaD4KI2VuZGlmCgojaW5jbHVkZSAidXJsZGF0YS5oIgojaW5jbHVkZSAiY29va2llLmgiCiNpbmNsdWRlICJzdHJ0b2suaCIKI2luY2x1ZGUgInNlbmRmLmgiCiNpbmNsdWRlICJzbGlzdC5oIgojaW5jbHVkZSAic2hhcmUuaCIKI2luY2x1ZGUgInN0cnRvb2ZmdC5oIgojaW5jbHVkZSAic3RyY2FzZS5oIgojaW5jbHVkZSAiY3VybF9tZW1yY2hyLmgiCiNpbmNsdWRlICJpbmV0X3B0b24uaCIKCi8qIFRoZSBsYXN0IDMgI2luY2x1ZGUgZmlsZXMgc2hvdWxkIGJlIGluIHRoaXMgb3JkZXIgKi8KI2luY2x1ZGUgImN1cmxfcHJpbnRmLmgiCiNpbmNsdWRlICJjdXJsX21lbW9yeS5oIgojaW5jbHVkZSAibWVtZGVidWcuaCIKCnN0YXRpYyB2b2lkIGZyZWVjb29raWUoc3RydWN0IENvb2tpZSAqY28pCnsKICBmcmVlKGNvLT5leHBpcmVzdHIpOwogIGZyZWUoY28tPmRvbWFpbik7CiAgZnJlZShjby0+cGF0aCk7CiAgZnJlZShjby0+c3BhdGgpOwogIGZyZWUoY28tPm5hbWUpOwogIGZyZWUoY28tPnZhbHVlKTsKICBmcmVlKGNvLT5tYXhhZ2UpOwogIGZyZWUoY28tPnZlcnNpb24pOwogIGZyZWUoY28pOwp9CgpzdGF0aWMgYm9vbCB0YWlsbWF0Y2goY29uc3QgY2hhciAqY29va2VfZG9tYWluLCBjb25zdCBjaGFyICpob3N0bmFtZSkKewogIHNpemVfdCBjb29raWVfZG9tYWluX2xlbiA9IHN0cmxlbihjb29rZV9kb21haW4pOwogIHNpemVfdCBob3N0bmFtZV9sZW4gPSBzdHJsZW4oaG9zdG5hbWUpOwoKICBpZihob3N0bmFtZV9sZW4gPCBjb29raWVfZG9tYWluX2xlbikKICAgIHJldHVybiBGQUxTRTsKCiAgaWYoIXN0cmNhc2Vjb21wYXJlKGNvb2tlX2RvbWFpbiwgaG9zdG5hbWUgKyBob3N0bmFtZV9sZW4tY29va2llX2RvbWFpbl9sZW4pKQogICAgcmV0dXJuIEZBTFNFOwoKICAvKiBBIGxlYWQgY2hhciBvZiBjb29raWVfZG9tYWluIGlzIG5vdCAnLicuCiAgICAgUkZDNjI2NSA0LjEuMi4zLiBUaGUgRG9tYWluIEF0dHJpYnV0ZSBzYXlzOgogICAgICAgRm9yIGV4YW1wbGUsIGlmIHRoZSB2YWx1ZSBvZiB0aGUgRG9tYWluIGF0dHJpYnV0ZSBpcwogICAgICAgImV4YW1wbGUuY29tIiwgdGhlIHVzZXIgYWdlbnQgd2lsbCBpbmNsdWRlIHRoZSBjb29raWUgaW4gdGhlIENvb2tpZQogICAgICAgaGVhZGVyIHdoZW4gbWFraW5nIEhUVFAgcmVxdWVzdHMgdG8gZXhhbXBsZS5jb20sIHd3dy5leGFtcGxlLmNvbSwgYW5kCiAgICAgICB3d3cuY29ycC5leGFtcGxlLmNvbS4KICAgKi8KICBpZihob3N0bmFtZV9sZW4gPT0gY29va2llX2RvbWFpbl9sZW4pCiAgICByZXR1cm4gVFJVRTsKICBpZignLicgPT0gKihob3N0bmFtZSArIGhvc3RuYW1lX2xlbiAtIGNvb2tpZV9kb21haW5fbGVuIC0gMSkpCiAgICByZXR1cm4gVFJVRTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qCiAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYW4gSVAodjR8djYpIGFkZHJlc3MuCiAqLwpzdGF0aWMgYm9vbCBpc2lwKGNvbnN0IGNoYXIgKmRvbWFpbikKewogIHN0cnVjdCBpbl9hZGRyIGFkZHI7CiNpZmRlZiBFTkFCTEVfSVBWNgogIHN0cnVjdCBpbjZfYWRkciBhZGRyNjsKI2VuZGlmCgogIGlmKEN1cmxfaW5ldF9wdG9uKEFGX0lORVQsIGRvbWFpbiwgJmFkZHIpCiNpZmRlZiBFTkFCTEVfSVBWNgogICAgIHx8IEN1cmxfaW5ldF9wdG9uKEFGX0lORVQ2LCBkb21haW4sICZhZGRyNikKI2VuZGlmCiAgICApIHsKICAgIC8qIGRvbWFpbiBuYW1lIGdpdmVuIGFzIElQIGFkZHJlc3MgKi8KICAgIHJldHVybiBUUlVFOwogIH0KCiAgcmV0dXJuIEZBTFNFOwp9CgovKgogKiBtYXRjaGluZyBjb29raWUgcGF0aCBhbmQgdXJsIHBhdGgKICogUkZDNjI2NSA1LjEuNCBQYXRocyBhbmQgUGF0aC1NYXRjaAogKi8Kc3RhdGljIGJvb2wgcGF0aG1hdGNoKGNvbnN0IGNoYXIgKmNvb2tpZV9wYXRoLCBjb25zdCBjaGFyICpyZXF1ZXN0X3VyaSkKewogIHNpemVfdCBjb29raWVfcGF0aF9sZW47CiAgc2l6ZV90IHVyaV9wYXRoX2xlbjsKICBjaGFyICp1cmlfcGF0aCA9IE5VTEw7CiAgY2hhciAqcG9zOwogIGJvb2wgcmV0ID0gRkFMU0U7CgogIC8qIGNvb2tpZV9wYXRoIG11c3Qgbm90IGhhdmUgbGFzdCAnLycgc2VwYXJhdG9yLiBleDogL3NhbXBsZSAqLwogIGNvb2tpZV9wYXRoX2xlbiA9IHN0cmxlbihjb29raWVfcGF0aCk7CiAgaWYoMSA9PSBjb29raWVfcGF0aF9sZW4pIHsKICAgIC8qIGNvb2tpZV9wYXRoIG11c3QgYmUgJy8nICovCiAgICByZXR1cm4gVFJVRTsKICB9CgogIHVyaV9wYXRoID0gc3RyZHVwKHJlcXVlc3RfdXJpKTsKICBpZighdXJpX3BhdGgpCiAgICByZXR1cm4gRkFMU0U7CiAgcG9zID0gc3RyY2hyKHVyaV9wYXRoLCAnPycpOwogIGlmKHBvcykKICAgICpwb3MgPSAweDA7CgogIC8qICMtZnJhZ21lbnRzIGFyZSBhbHJlYWR5IGN1dCBvZmYhICovCiAgaWYoMCA9PSBzdHJsZW4odXJpX3BhdGgpIHx8IHVyaV9wYXRoWzBdICE9ICcvJykgewogICAgZnJlZSh1cmlfcGF0aCk7CiAgICB1cmlfcGF0aCA9IHN0cmR1cCgiLyIpOwogICAgaWYoIXVyaV9wYXRoKQogICAgICByZXR1cm4gRkFMU0U7CiAgfQoKICAvKiBoZXJlLCBSRkM2MjY1IDUuMS40IHNheXMKICAgICA0LiBPdXRwdXQgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVyaS1wYXRoIGZyb20gdGhlIGZpcnN0IGNoYXJhY3RlciB1cAogICAgICAgIHRvLCBidXQgbm90IGluY2x1ZGluZywgdGhlIHJpZ2h0LW1vc3QgJXgyRiAoIi8iKS4KICAgICBidXQgVVJMIHBhdGggL2hvZ2U/ZnVnYT14eHggbWVhbnMgL2hvZ2UvaW5kZXguY2dpP2Z1Z2E9eHh4IGluIHNvbWUgc2l0ZQogICAgIHdpdGhvdXQgcmVkaXJlY3QuCiAgICAgSWdub3JlIHRoaXMgYWxnb3JpdGhtIGJlY2F1c2UgL2hvZ2UgaXMgdXJpIHBhdGggZm9yIHRoaXMgY2FzZQogICAgICh1cmkgcGF0aCBpcyBub3QgLykuCiAgICovCgogIHVyaV9wYXRoX2xlbiA9IHN0cmxlbih1cmlfcGF0aCk7CgogIGlmKHVyaV9wYXRoX2xlbiA8IGNvb2tpZV9wYXRoX2xlbikgewogICAgcmV0ID0gRkFMU0U7CiAgICBnb3RvIHBhdGhtYXRjaGVkOwogIH0KCiAgLyogbm90IHVzaW5nIGNoZWNrcHJlZml4KCkgYmVjYXVzZSBtYXRjaGluZyBzaG91bGQgYmUgY2FzZS1zZW5zaXRpdmUgKi8KICBpZihzdHJuY21wKGNvb2tpZV9wYXRoLCB1cmlfcGF0aCwgY29va2llX3BhdGhfbGVuKSkgewogICAgcmV0ID0gRkFMU0U7CiAgICBnb3RvIHBhdGhtYXRjaGVkOwogIH0KCiAgLyogVGhlIGNvb2tpZS1wYXRoIGFuZCB0aGUgdXJpLXBhdGggYXJlIGlkZW50aWNhbC4gKi8KICBpZihjb29raWVfcGF0aF9sZW4gPT0gdXJpX3BhdGhfbGVuKSB7CiAgICByZXQgPSBUUlVFOwogICAgZ290byBwYXRobWF0Y2hlZDsKICB9CgogIC8qIGhlcmUsIGNvb2tpZV9wYXRoX2xlbiA8IHVybF9wYXRoX2xlbiAqLwogIGlmKHVyaV9wYXRoW2Nvb2tpZV9wYXRoX2xlbl0gPT0gJy8nKSB7CiAgICByZXQgPSBUUlVFOwogICAgZ290byBwYXRobWF0Y2hlZDsKICB9CgogIHJldCA9IEZBTFNFOwoKcGF0aG1hdGNoZWQ6CiAgZnJlZSh1cmlfcGF0aCk7CiAgcmV0dXJuIHJldDsKfQoKLyoKICogUmV0dXJuIHRoZSB0b3AtbGV2ZWwgZG9tYWluLCBmb3Igb3B0aW1hbCBoYXNoaW5nLgogKi8Kc3RhdGljIGNvbnN0IGNoYXIgKmdldF90b3BfZG9tYWluKGNvbnN0IGNoYXIgKiBjb25zdCBkb21haW4sIHNpemVfdCAqb3V0bGVuKQp7CiAgc2l6ZV90IGxlbjsKICBjb25zdCBjaGFyICpmaXJzdCA9IE5VTEwsICpsYXN0OwoKICBpZighZG9tYWluKQogICAgcmV0dXJuIE5VTEw7CgogIGxlbiA9IHN0cmxlbihkb21haW4pOwogIGxhc3QgPSBtZW1yY2hyKGRvbWFpbiwgJy4nLCBsZW4pOwogIGlmKGxhc3QpIHsKICAgIGZpcnN0ID0gbWVtcmNocihkb21haW4sICcuJywgKHNpemVfdCkgKGxhc3QgLSBkb21haW4pKTsKICAgIGlmKGZpcnN0KQogICAgICBsZW4gLT0gKHNpemVfdCkgKCsrZmlyc3QgLSBkb21haW4pOwogIH0KCiAgaWYob3V0bGVuKQogICAgKm91dGxlbiA9IGxlbjsKCiAgcmV0dXJuIGZpcnN0PyBmaXJzdDogZG9tYWluOwp9CgovKgogKiBBIGNhc2UtaW5zZW5zaXRpdmUgaGFzaCBmb3IgdGhlIGNvb2tpZSBkb21haW5zLgogKi8Kc3RhdGljIHNpemVfdCBjb29raWVfaGFzaF9kb21haW4oY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBzaXplX3QgbGVuKQp7CiAgY29uc3QgY2hhciAqZW5kID0gZG9tYWluICsgbGVuOwogIHNpemVfdCBoID0gNTM4MTsKCiAgd2hpbGUoZG9tYWluIDwgZW5kKSB7CiAgICBoICs9IGggPDwgNTsKICAgIGggXj0gQ3VybF9yYXdfdG91cHBlcigqZG9tYWluKyspOwogIH0KCiAgcmV0dXJuIChoICUgQ09PS0lFX0hBU0hfU0laRSk7Cn0KCi8qCiAqIEhhc2ggdGhpcyBkb21haW4uCiAqLwpzdGF0aWMgc2l6ZV90IGNvb2tpZWhhc2goY29uc3QgY2hhciAqIGNvbnN0IGRvbWFpbikKewogIGNvbnN0IGNoYXIgKnRvcDsKICBzaXplX3QgbGVuOwoKICBpZighZG9tYWluIHx8IGlzaXAoZG9tYWluKSkKICAgIHJldHVybiAwOwoKICB0b3AgPSBnZXRfdG9wX2RvbWFpbihkb21haW4sICZsZW4pOwogIHJldHVybiBjb29raWVfaGFzaF9kb21haW4odG9wLCBsZW4pOwp9CgovKgogKiBjb29raWUgcGF0aCBzYW5pdGl6ZQogKi8Kc3RhdGljIGNoYXIgKnNhbml0aXplX2Nvb2tpZV9wYXRoKGNvbnN0IGNoYXIgKmNvb2tpZV9wYXRoKQp7CiAgc2l6ZV90IGxlbjsKICBjaGFyICpuZXdfcGF0aCA9IHN0cmR1cChjb29raWVfcGF0aCk7CiAgaWYoIW5ld19wYXRoKQogICAgcmV0dXJuIE5VTEw7CgogIC8qIHNvbWUgc3R1cGlkIHNpdGUgc2VuZHMgcGF0aCBhdHRyaWJ1dGUgd2l0aCAnIicuICovCiAgbGVuID0gc3RybGVuKG5ld19wYXRoKTsKICBpZihuZXdfcGF0aFswXSA9PSAnXCInKSB7CiAgICBtZW1tb3ZlKCh2b2lkICopbmV3X3BhdGgsIChjb25zdCB2b2lkICopKG5ld19wYXRoICsgMSksIGxlbik7CiAgICBsZW4tLTsKICB9CiAgaWYobGVuICYmIChuZXdfcGF0aFtsZW4gLSAxXSA9PSAnXCInKSkgewogICAgbmV3X3BhdGhbbGVuIC0gMV0gPSAweDA7CiAgICBsZW4tLTsKICB9CgogIC8qIFJGQzYyNjUgNS4yLjQgVGhlIFBhdGggQXR0cmlidXRlICovCiAgaWYobmV3X3BhdGhbMF0gIT0gJy8nKSB7CiAgICAvKiBMZXQgY29va2llLXBhdGggYmUgdGhlIGRlZmF1bHQtcGF0aC4gKi8KICAgIGZyZWUobmV3X3BhdGgpOwogICAgbmV3X3BhdGggPSBzdHJkdXAoIi8iKTsKICAgIHJldHVybiBuZXdfcGF0aDsKICB9CgogIC8qIGNvbnZlcnQgL2hvZ2UvIHRvIC9ob2dlICovCiAgaWYobGVuICYmIG5ld19wYXRoW2xlbiAtIDFdID09ICcvJykgewogICAgbmV3X3BhdGhbbGVuIC0gMV0gPSAweDA7CiAgfQoKICByZXR1cm4gbmV3X3BhdGg7Cn0KCi8qCiAqIExvYWQgY29va2llcyBmcm9tIGFsbCBnaXZlbiBjb29raWUgZmlsZXMgKENVUkxPUFRfQ09PS0lFRklMRSkuCiAqCiAqIE5PVEU6IE9PTSBvciBjb29raWUgcGFyc2luZyBmYWlsdXJlcyBhcmUgaWdub3JlZC4KICovCnZvaWQgQ3VybF9jb29raWVfbG9hZGZpbGVzKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCnsKICBzdHJ1Y3QgY3VybF9zbGlzdCAqbGlzdCA9IGRhdGEtPmNoYW5nZS5jb29raWVsaXN0OwogIGlmKGxpc3QpIHsKICAgIEN1cmxfc2hhcmVfbG9jayhkYXRhLCBDVVJMX0xPQ0tfREFUQV9DT09LSUUsIENVUkxfTE9DS19BQ0NFU1NfU0lOR0xFKTsKICAgIHdoaWxlKGxpc3QpIHsKICAgICAgc3RydWN0IENvb2tpZUluZm8gKm5ld2Nvb2tpZXMgPSBDdXJsX2Nvb2tpZV9pbml0KGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LT5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+Y29va2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnNldC5jb29raWVzZXNzaW9uKTsKICAgICAgaWYoIW5ld2Nvb2tpZXMpCiAgICAgICAgLyogRmFpbHVyZSBtYXkgYmUgZHVlIHRvIE9PTSBvciBhIGJhZCBjb29raWU7IGJvdGggYXJlIGlnbm9yZWQKICAgICAgICAgKiBidXQgb25seSB0aGUgZmlyc3Qgc2hvdWxkIGJlCiAgICAgICAgICovCiAgICAgICAgaW5mb2YoZGF0YSwgImlnbm9yaW5nIGZhaWxlZCBjb29raWVfaW5pdCBmb3IgJXNcbiIsIGxpc3QtPmRhdGEpOwogICAgICBlbHNlCiAgICAgICAgZGF0YS0+Y29va2llcyA9IG5ld2Nvb2tpZXM7CiAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwogICAgfQogICAgY3VybF9zbGlzdF9mcmVlX2FsbChkYXRhLT5jaGFuZ2UuY29va2llbGlzdCk7IC8qIGNsZWFuIHVwIGxpc3QgKi8KICAgIGRhdGEtPmNoYW5nZS5jb29raWVsaXN0ID0gTlVMTDsgLyogZG9uJ3QgZG8gdGhpcyBhZ2FpbiEgKi8KICAgIEN1cmxfc2hhcmVfdW5sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSk7CiAgfQp9CgovKgogKiBzdHJzdG9yZSgpIG1ha2VzIGEgc3RyZHVwKCkgb24gdGhlICduZXdzdHInIGFuZCBpZiAnKnN0cicgaXMgbm9uLU5VTEwKICogdGhhdCB3aWxsIGJlIGZyZWVkIGJlZm9yZSB0aGUgYWxsb2NhdGVkIHN0cmluZyBpcyBzdG9yZWQgdGhlcmUuCiAqCiAqIEl0IGlzIG1lYW50IHRvIGVhc2lseSByZXBsYWNlIHN0cmR1cCgpCiAqLwpzdGF0aWMgdm9pZCBzdHJzdG9yZShjaGFyICoqc3RyLCBjb25zdCBjaGFyICpuZXdzdHIpCnsKICBmcmVlKCpzdHIpOwogICpzdHIgPSBzdHJkdXAobmV3c3RyKTsKfQoKLyoKICogcmVtb3ZlX2V4cGlyZWQoKSByZW1vdmVzIGV4cGlyZWQgY29va2llcy4KICovCnN0YXRpYyB2b2lkIHJlbW92ZV9leHBpcmVkKHN0cnVjdCBDb29raWVJbmZvICpjb29raWVzKQp7CiAgc3RydWN0IENvb2tpZSAqY28sICpueCwgKnB2OwogIGN1cmxfb2ZmX3Qgbm93ID0gKGN1cmxfb2ZmX3QpdGltZShOVUxMKTsKICB1bnNpZ25lZCBpbnQgaTsKCiAgZm9yKGkgPSAwOyBpIDwgQ09PS0lFX0hBU0hfU0laRTsgaSsrKSB7CiAgICBjbyA9IGNvb2tpZXMtPmNvb2tpZXNbaV07CiAgICBwdiA9IE5VTEw7CiAgICB3aGlsZShjbykgewogICAgICBueCA9IGNvLT5uZXh0OwogICAgICBpZihjby0+ZXhwaXJlcyAmJiBjby0+ZXhwaXJlcyA8IG5vdykgewogICAgICAgIGlmKCFwdikgewogICAgICAgICAgY29va2llcy0+Y29va2llc1tpXSA9IGNvLT5uZXh0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHB2LT5uZXh0ID0gY28tPm5leHQ7CiAgICAgICAgfQogICAgICAgIGNvb2tpZXMtPm51bWNvb2tpZXMtLTsKICAgICAgICBmcmVlY29va2llKGNvKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBwdiA9IGNvOwogICAgICB9CiAgICAgIGNvID0gbng7CiAgICB9CiAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9hZGQoKQogKgogKiBBZGQgYSBzaW5nbGUgY29va2llIGxpbmUgdG8gdGhlIGNvb2tpZSBrZWVwaW5nIG9iamVjdC4KICoKICogQmUgYXdhcmUgdGhhdCBzb21ldGltZXMgd2UgZ2V0IGFuIElQLW9ubHkgaG9zdCBuYW1lLCBhbmQgdGhhdCBtaWdodCBhbHNvIGJlCiAqIGEgbnVtZXJpY2FsIElQdjYgYWRkcmVzcy4KICoKICogUmV0dXJucyBOVUxMIG9uIG91dCBvZiBtZW1vcnkgb3IgaW52YWxpZCBjb29raWUuIFRoaXMgaXMgc3Vib3B0aW1hbCwKICogYXMgdGhleSBzaG91bGQgYmUgdHJlYXRlZCBzZXBhcmF0ZWx5LgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RydWN0IENvb2tpZSAqCkN1cmxfY29va2llX2FkZChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAogICAgICAgICAgICAgICAgLyogVGhlICdkYXRhJyBwb2ludGVyIGhlcmUgbWF5IGJlIE5VTEwgYXQgdGltZXMsIGFuZCB0aHVzCiAgICAgICAgICAgICAgICAgICBtdXN0IG9ubHkgYmUgdXNlZCB2ZXJ5IGNhcmVmdWxseSBmb3IgdGhpbmdzIHRoYXQgY2FuIGRlYWwKICAgICAgICAgICAgICAgICAgIHdpdGggZGF0YSBiZWluZyBOVUxMLiBTdWNoIGFzIGluZm9mKCkgYW5kIHNpbWlsYXIgKi8KCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQ29va2llSW5mbyAqYywKICAgICAgICAgICAgICAgIGJvb2wgaHR0cGhlYWRlciwgLyogVFJVRSBpZiBIVFRQIGhlYWRlci1zdHlsZSBsaW5lICovCiAgICAgICAgICAgICAgICBib29sIG5vZXhwaXJlLCAvKiBpZiBUUlVFLCBza2lwIHJlbW92ZV9leHBpcmVkKCkgKi8KICAgICAgICAgICAgICAgIGNoYXIgKmxpbmVwdHIsICAgLyogZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lICovCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkb21haW4sIC8qIGRlZmF1bHQgZG9tYWluICovCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoKSAgIC8qIGZ1bGwgcGF0aCB1c2VkIHdoZW4gdGhpcyBjb29raWUgaXMgc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGdldCBkZWZhdWx0IHBhdGggZm9yIHRoZSBjb29raWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5sZXNzIHNldCAqLwp7CiAgc3RydWN0IENvb2tpZSAqY2xpc3Q7CiAgc3RydWN0IENvb2tpZSAqY287CiAgc3RydWN0IENvb2tpZSAqbGFzdGMgPSBOVUxMOwogIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwogIGJvb2wgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICBib29sIGJhZGNvb2tpZSA9IEZBTFNFOyAvKiBjb29raWVzIGFyZSBnb29kIGJ5IGRlZmF1bHQuIG1tbW1tIHl1bW15ICovCiAgc2l6ZV90IG15aGFzaDsKCiNpZmRlZiBVU0VfTElCUFNMCiAgY29uc3QgcHNsX2N0eF90ICpwc2w7CiNlbmRpZgoKI2lmZGVmIENVUkxfRElTQUJMRV9WRVJCT1NFX1NUUklOR1MKICAodm9pZClkYXRhOwojZW5kaWYKCiAgLyogRmlyc3QsIGFsbG9jIGFuZCBpbml0IGEgbmV3IHN0cnVjdCBmb3IgaXQgKi8KICBjbyA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IENvb2tpZSkpOwogIGlmKCFjbykKICAgIHJldHVybiBOVUxMOyAvKiBiYWlsIG91dCBpZiB3ZSdyZSB0aGlzIGxvdyBvbiBtZW1vcnkgKi8KCiAgaWYoaHR0cGhlYWRlcikgewogICAgLyogVGhpcyBsaW5lIHdhcyByZWFkIG9mZiBhIEhUVFAtaGVhZGVyICovCiAgICBjaGFyIG5hbWVbTUFYX05BTUVdOwogICAgY2hhciB3aGF0W01BWF9OQU1FXTsKICAgIGNvbnN0IGNoYXIgKnB0cjsKICAgIGNvbnN0IGNoYXIgKnNlbWlwdHI7CgogICAgc2l6ZV90IGxpbmVsZW5ndGggPSBzdHJsZW4obGluZXB0cik7CiAgICBpZihsaW5lbGVuZ3RoID4gTUFYX0NPT0tJRV9MSU5FKSB7CiAgICAgIC8qIGRpc2NhcmQgb3Zlcmx5IGxvbmcgbGluZXMgYXQgb25jZSAqLwogICAgICBmcmVlKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgc2VtaXB0ciA9IHN0cmNocihsaW5lcHRyLCAnOycpOyAvKiBmaXJzdCwgZmluZCBhIHNlbWljb2xvbiAqLwoKICAgIHdoaWxlKCpsaW5lcHRyICYmIElTQkxBTksoKmxpbmVwdHIpKQogICAgICBsaW5lcHRyKys7CgogICAgcHRyID0gbGluZXB0cjsKICAgIGRvIHsKICAgICAgLyogd2UgaGF2ZSBhIDx3aGF0Pj08dGhpcz4gcGFpciBvciBhIHN0YW5kLWFsb25lIHdvcmQgaGVyZSAqLwogICAgICBuYW1lWzBdID0gd2hhdFswXSA9IDA7IC8qIGluaXQgdGhlIGJ1ZmZlcnMgKi8KICAgICAgaWYoMSA8PSBzc2NhbmYocHRyLCAiJSIgTUFYX05BTUVfVFhUICJbXjtcclxuPV0gPSUiCiAgICAgICAgICAgICAgICAgICAgIE1BWF9OQU1FX1RYVCAiW147XHJcbl0iLAogICAgICAgICAgICAgICAgICAgICBuYW1lLCB3aGF0KSkgewogICAgICAgIC8qIFVzZSBzdHJzdG9yZSgpIGJlbG93IHRvIHByb3Blcmx5IGRlYWwgd2l0aCByZWNlaXZlZCBjb29raWUKICAgICAgICAgICBoZWFkZXJzIHRoYXQgaGF2ZSB0aGUgc2FtZSBzdHJpbmcgcHJvcGVydHkgc2V0IG1vcmUgdGhhbiBvbmNlLAogICAgICAgICAgIGFuZCB0aGVuIHdlIHVzZSB0aGUgbGFzdCBvbmUuICovCiAgICAgICAgY29uc3QgY2hhciAqd2hhdHB0cjsKICAgICAgICBib29sIGRvbmUgPSBGQUxTRTsKICAgICAgICBib29sIHNlcDsKICAgICAgICBzaXplX3QgbGVuID0gc3RybGVuKHdoYXQpOwogICAgICAgIHNpemVfdCBubGVuID0gc3RybGVuKG5hbWUpOwogICAgICAgIGNvbnN0IGNoYXIgKmVuZG9mbiA9ICZwdHJbIG5sZW4gXTsKCiAgICAgICAgaWYobmxlbiA+PSAoTUFYX05BTUUtMSkgfHwgbGVuID49IChNQVhfTkFNRS0xKSB8fAogICAgICAgICAgICgobmxlbiArIGxlbikgPiBNQVhfTkFNRSkpIHsKICAgICAgICAgIC8qIHRvbyBsb25nIGluZGl2aWR1YWwgbmFtZSBvciBjb250ZW50cywgb3IgdG9vIGxvbmcgY29tYmluYXRpb24gb2YKICAgICAgICAgICAgIG5hbWUgKyBjb250ZW50cy4gQ2hyb21lIGFuZCBGaXJlZm94IHN1cHBvcnQgNDA5NSBvciA0MDk2IGJ5dGVzCiAgICAgICAgICAgICBjb21iby4gKi8KICAgICAgICAgIGZyZWVjb29raWUoY28pOwogICAgICAgICAgaW5mb2YoZGF0YSwgIm92ZXJzaXplZCBjb29raWUgZHJvcHBlZCwgbmFtZS92YWwgJWQgKyAlZCBieXRlc1xuIiwKICAgICAgICAgICAgICAgIG5sZW4sIGxlbik7CiAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CgogICAgICAgIC8qIG5hbWUgZW5kcyB3aXRoIGEgJz0nID8gKi8KICAgICAgICBzZXAgPSAoKmVuZG9mbiA9PSAnPScpP1RSVUU6RkFMU0U7CgogICAgICAgIGlmKG5sZW4pIHsKICAgICAgICAgIGVuZG9mbi0tOyAvKiBtb3ZlIHRvIHRoZSBsYXN0IGNoYXJhY3RlciAqLwogICAgICAgICAgaWYoSVNCTEFOSygqZW5kb2ZuKSkgewogICAgICAgICAgICAvKiBza2lwIHRyYWlsaW5nIHNwYWNlcyBpbiBuYW1lICovCiAgICAgICAgICAgIHdoaWxlKCplbmRvZm4gJiYgSVNCTEFOSygqZW5kb2ZuKSAmJiBubGVuKSB7CiAgICAgICAgICAgICAgZW5kb2ZuLS07CiAgICAgICAgICAgICAgbmxlbi0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5hbWVbbmxlbl0gPSAwOyAvKiBuZXcgZW5kIG9mIG5hbWUgKi8KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIFN0cmlwIG9mZiB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlICd3aGF0JyAqLwogICAgICAgIHdoaWxlKGxlbiAmJiBJU0JMQU5LKHdoYXRbbGVuLTFdKSkgewogICAgICAgICAgd2hhdFtsZW4tMV0gPSAwOwogICAgICAgICAgbGVuLS07CiAgICAgICAgfQoKICAgICAgICAvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSAnd2hhdCcgKi8KICAgICAgICB3aGF0cHRyID0gd2hhdDsKICAgICAgICB3aGlsZSgqd2hhdHB0ciAmJiBJU0JMQU5LKCp3aGF0cHRyKSkKICAgICAgICAgIHdoYXRwdHIrKzsKCiAgICAgICAgaWYoIWNvLT5uYW1lKSB7CiAgICAgICAgICAvKiBUaGUgdmVyeSBmaXJzdCBuYW1lL3ZhbHVlIHBhaXIgaXMgdGhlIGFjdHVhbCBjb29raWUgbmFtZSAqLwogICAgICAgICAgaWYoIXNlcCkgewogICAgICAgICAgICAvKiBCYWQgbmFtZS92YWx1ZSBwYWlyLiAqLwogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNvLT5uYW1lID0gc3RyZHVwKG5hbWUpOwogICAgICAgICAgY28tPnZhbHVlID0gc3RyZHVwKHdoYXRwdHIpOwogICAgICAgICAgZG9uZSA9IFRSVUU7CiAgICAgICAgICBpZighY28tPm5hbWUgfHwgIWNvLT52YWx1ZSkgewogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZighbGVuKSB7CiAgICAgICAgICAvKiB0aGlzIHdhcyBhICI8bmFtZT49IiB3aXRoIG5vIGNvbnRlbnQsIGFuZCB3ZSBtdXN0IGFsbG93CiAgICAgICAgICAgICAnc2VjdXJlJyBhbmQgJ2h0dHBvbmx5JyBzcGVjaWZpZWQgdGhpcyB3ZWlyZGx5ICovCiAgICAgICAgICBkb25lID0gVFJVRTsKICAgICAgICAgIGlmKHN0cmNhc2Vjb21wYXJlKCJzZWN1cmUiLCBuYW1lKSkKICAgICAgICAgICAgY28tPnNlY3VyZSA9IFRSVUU7CiAgICAgICAgICBlbHNlIGlmKHN0cmNhc2Vjb21wYXJlKCJodHRwb25seSIsIG5hbWUpKQogICAgICAgICAgICBjby0+aHR0cG9ubHkgPSBUUlVFOwogICAgICAgICAgZWxzZSBpZihzZXApCiAgICAgICAgICAgIC8qIHRoZXJlIHdhcyBhICc9JyBzbyB3ZSdyZSBub3QgZG9uZSBwYXJzaW5nIHRoaXMgZmllbGQgKi8KICAgICAgICAgICAgZG9uZSA9IEZBTFNFOwogICAgICAgIH0KICAgICAgICBpZihkb25lKQogICAgICAgICAgOwogICAgICAgIGVsc2UgaWYoc3RyY2FzZWNvbXBhcmUoInBhdGgiLCBuYW1lKSkgewogICAgICAgICAgc3Ryc3RvcmUoJmNvLT5wYXRoLCB3aGF0cHRyKTsKICAgICAgICAgIGlmKCFjby0+cGF0aCkgewogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOyAvKiBvdXQgb2YgbWVtb3J5IGJhZCAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGZyZWUoY28tPnNwYXRoKTsgLyogaWYgdGhpcyBpcyBzZXQgYWdhaW4gKi8KICAgICAgICAgIGNvLT5zcGF0aCA9IHNhbml0aXplX2Nvb2tpZV9wYXRoKGNvLT5wYXRoKTsKICAgICAgICAgIGlmKCFjby0+c3BhdGgpIHsKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsgLyogb3V0IG9mIG1lbW9yeSBiYWQgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoc3RyY2FzZWNvbXBhcmUoImRvbWFpbiIsIG5hbWUpKSB7CiAgICAgICAgICBib29sIGlzX2lwOwoKICAgICAgICAgIC8qIE5vdywgd2UgbWFrZSBzdXJlIHRoYXQgb3VyIGhvc3QgaXMgd2l0aGluIHRoZSBnaXZlbiBkb21haW4sCiAgICAgICAgICAgICBvciB0aGUgZ2l2ZW4gZG9tYWluIGlzIG5vdCB2YWxpZCBhbmQgdGh1cyBjYW5ub3QgYmUgc2V0LiAqLwoKICAgICAgICAgIGlmKCcuJyA9PSB3aGF0cHRyWzBdKQogICAgICAgICAgICB3aGF0cHRyKys7IC8qIGlnbm9yZSBwcmVjZWRpbmcgZG90ICovCgojaWZuZGVmIFVTRV9MSUJQU0wKICAgICAgICAgIC8qCiAgICAgICAgICAgKiBXaXRob3V0IFBTTCB3ZSBkb24ndCBrbm93IHdoZW4gdGhlIGluY29taW5nIGNvb2tpZSBpcyBzZXQgb24gYQogICAgICAgICAgICogVExEIG9yIG90aGVyd2lzZSAicHJvdGVjdGVkIiBzdWZmaXguIFRvIHJlZHVjZSByaXNrLCB3ZSByZXF1aXJlIGEKICAgICAgICAgICAqIGRvdCBPUiB0aGUgZXhhY3QgaG9zdCBuYW1lIGJlaW5nICJsb2NhbGhvc3QiLgogICAgICAgICAgICovCiAgICAgICAgICB7CiAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRvdHA7CiAgICAgICAgICAgIC8qIGNoZWNrIGZvciBtb3JlIGRvdHMgKi8KICAgICAgICAgICAgZG90cCA9IHN0cmNocih3aGF0cHRyLCAnLicpOwogICAgICAgICAgICBpZighZG90cCAmJiAhc3RyY2FzZWNvbXBhcmUoImxvY2FsaG9zdCIsIHdoYXRwdHIpKQogICAgICAgICAgICAgIGRvbWFpbiA9ICI6IjsKICAgICAgICAgIH0KI2VuZGlmCgogICAgICAgICAgaXNfaXAgPSBpc2lwKGRvbWFpbiA/IGRvbWFpbiA6IHdoYXRwdHIpOwoKICAgICAgICAgIGlmKCFkb21haW4KICAgICAgICAgICAgIHx8IChpc19pcCAmJiAhc3RyY21wKHdoYXRwdHIsIGRvbWFpbikpCiAgICAgICAgICAgICB8fCAoIWlzX2lwICYmIHRhaWxtYXRjaCh3aGF0cHRyLCBkb21haW4pKSkgewogICAgICAgICAgICBzdHJzdG9yZSgmY28tPmRvbWFpbiwgd2hhdHB0cik7CiAgICAgICAgICAgIGlmKCFjby0+ZG9tYWluKSB7CiAgICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZighaXNfaXApCiAgICAgICAgICAgICAgY28tPnRhaWxtYXRjaCA9IFRSVUU7IC8qIHdlIGFsd2F5cyBkbyB0aGF0IGlmIHRoZSBkb21haW4gbmFtZSB3YXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gKi8KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiB3ZSBkaWQgbm90IGdldCBhIHRhaWxtYXRjaCBhbmQgdGhlbiB0aGUgYXR0ZW1wdGVkIHNldCBkb21haW4KICAgICAgICAgICAgICAgaXMgbm90IGEgZG9tYWluIHRvIHdoaWNoIHRoZSBjdXJyZW50IGhvc3QgYmVsb25ncy4gTWFyayBhcwogICAgICAgICAgICAgICBiYWQuICovCiAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICAgIGluZm9mKGRhdGEsICJza2lwcGVkIGNvb2tpZSB3aXRoIGJhZCB0YWlsbWF0Y2ggZG9tYWluOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgd2hhdHB0cik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoc3RyY2FzZWNvbXBhcmUoInZlcnNpb24iLCBuYW1lKSkgewogICAgICAgICAgc3Ryc3RvcmUoJmNvLT52ZXJzaW9uLCB3aGF0cHRyKTsKICAgICAgICAgIGlmKCFjby0+dmVyc2lvbikgewogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZihzdHJjYXNlY29tcGFyZSgibWF4LWFnZSIsIG5hbWUpKSB7CiAgICAgICAgICAvKiBEZWZpbmVkIGluIFJGQzIxMDk6CgogICAgICAgICAgICAgT3B0aW9uYWwuICBUaGUgTWF4LUFnZSBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGlmZXRpbWUgb2YgdGhlCiAgICAgICAgICAgICBjb29raWUsIGluIHNlY29uZHMuICBUaGUgZGVsdGEtc2Vjb25kcyB2YWx1ZSBpcyBhIGRlY2ltYWwgbm9uLQogICAgICAgICAgICAgbmVnYXRpdmUgaW50ZWdlci4gIEFmdGVyIGRlbHRhLXNlY29uZHMgc2Vjb25kcyBlbGFwc2UsIHRoZQogICAgICAgICAgICAgY2xpZW50IHNob3VsZCBkaXNjYXJkIHRoZSBjb29raWUuICBBIHZhbHVlIG9mIHplcm8gbWVhbnMgdGhlCiAgICAgICAgICAgICBjb29raWUgc2hvdWxkIGJlIGRpc2NhcmRlZCBpbW1lZGlhdGVseS4KCiAgICAgICAgICAqLwogICAgICAgICAgc3Ryc3RvcmUoJmNvLT5tYXhhZ2UsIHdoYXRwdHIpOwogICAgICAgICAgaWYoIWNvLT5tYXhhZ2UpIHsKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoc3RyY2FzZWNvbXBhcmUoImV4cGlyZXMiLCBuYW1lKSkgewogICAgICAgICAgc3Ryc3RvcmUoJmNvLT5leHBpcmVzdHIsIHdoYXRwdHIpOwogICAgICAgICAgaWYoIWNvLT5leHBpcmVzdHIpIHsKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICBlbHNlIHRoaXMgaXMgdGhlIHNlY29uZCAob3IgbW9yZSkgbmFtZSB3ZSBkb24ndCBrbm93CiAgICAgICAgICBhYm91dCEgKi8KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAvKiB0aGlzIGlzIGFuICJpbGxlZ2FsIiA8d2hhdD49PHRoaXM+IHBhaXIgKi8KICAgICAgfQoKICAgICAgaWYoIXNlbWlwdHIgfHwgISpzZW1pcHRyKSB7CiAgICAgICAgLyogd2UgYWxyZWFkeSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGNvb2tpZXMgKi8KICAgICAgICBzZW1pcHRyID0gTlVMTDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgcHRyID0gc2VtaXB0ciArIDE7CiAgICAgIHdoaWxlKCpwdHIgJiYgSVNCTEFOSygqcHRyKSkKICAgICAgICBwdHIrKzsKICAgICAgc2VtaXB0ciA9IHN0cmNocihwdHIsICc7Jyk7IC8qIG5vdywgZmluZCB0aGUgbmV4dCBzZW1pY29sb24gKi8KCiAgICAgIGlmKCFzZW1pcHRyICYmICpwdHIpCiAgICAgICAgLyogVGhlcmUgYXJlIG5vIG1vcmUgc2VtaWNvbG9ucywgYnV0IHRoZXJlJ3MgYSBmaW5hbCBuYW1lPXZhbHVlIHBhaXIKICAgICAgICAgICBjb21pbmcgdXAgKi8KICAgICAgICBzZW1pcHRyID0gc3RyY2hyKHB0ciwgJ1wwJyk7CiAgICB9IHdoaWxlKHNlbWlwdHIpOwoKICAgIGlmKGNvLT5tYXhhZ2UpIHsKICAgICAgQ1VSTG9mZnQgb2ZmdDsKICAgICAgb2ZmdCA9IGN1cmx4X3N0cnRvb2ZmdCgoKmNvLT5tYXhhZ2UgPT0gJ1wiJyk/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvLT5tYXhhZ2VbMV06JmNvLT5tYXhhZ2VbMF0sIE5VTEwsIDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjby0+ZXhwaXJlcyk7CiAgICAgIGlmKG9mZnQgPT0gQ1VSTF9PRkZUX0ZMT1cpCiAgICAgICAgLyogb3ZlcmZsb3csIHVzZWQgbWF4IHZhbHVlICovCiAgICAgICAgY28tPmV4cGlyZXMgPSBDVVJMX09GRl9UX01BWDsKICAgICAgZWxzZSBpZighb2ZmdCkgewogICAgICAgIGlmKENVUkxfT0ZGX1RfTUFYIC0gbm93IDwgY28tPmV4cGlyZXMpCiAgICAgICAgICAvKiB3b3VsZCBvdmVyZmxvdyAqLwogICAgICAgICAgY28tPmV4cGlyZXMgPSBDVVJMX09GRl9UX01BWDsKICAgICAgICBlbHNlCiAgICAgICAgICBjby0+ZXhwaXJlcyArPSBub3c7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoY28tPmV4cGlyZXN0cikgewogICAgICAvKiBOb3RlIHRoYXQgaWYgdGhlIGRhdGUgY291bGRuJ3QgZ2V0IHBhcnNlZCBmb3Igd2hhdGV2ZXIgcmVhc29uLAogICAgICAgICB0aGUgY29va2llIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNlc3Npb24gY29va2llICovCiAgICAgIGNvLT5leHBpcmVzID0gY3VybF9nZXRkYXRlKGNvLT5leHBpcmVzdHIsIE5VTEwpOwoKICAgICAgLyogU2Vzc2lvbiBjb29raWVzIGhhdmUgZXhwaXJlcyBzZXQgdG8gMCBzbyBpZiB3ZSBnZXQgdGhhdCBiYWNrCiAgICAgICAgIGZyb20gdGhlIGRhdGUgcGFyc2VyIGxldCdzIGFkZCBhIHNlY29uZCB0byBtYWtlIGl0IGEKICAgICAgICAgbm9uLXNlc3Npb24gY29va2llICovCiAgICAgIGlmKGNvLT5leHBpcmVzID09IDApCiAgICAgICAgY28tPmV4cGlyZXMgPSAxOwogICAgICBlbHNlIGlmKGNvLT5leHBpcmVzIDwgMCkKICAgICAgICBjby0+ZXhwaXJlcyA9IDA7CiAgICB9CgogICAgaWYoIWJhZGNvb2tpZSAmJiAhY28tPmRvbWFpbikgewogICAgICBpZihkb21haW4pIHsKICAgICAgICAvKiBubyBkb21haW4gd2FzIGdpdmVuIGluIHRoZSBoZWFkZXIgbGluZSwgc2V0IHRoZSBkZWZhdWx0ICovCiAgICAgICAgY28tPmRvbWFpbiA9IHN0cmR1cChkb21haW4pOwogICAgICAgIGlmKCFjby0+ZG9tYWluKQogICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgfQogICAgfQoKICAgIGlmKCFiYWRjb29raWUgJiYgIWNvLT5wYXRoICYmIHBhdGgpIHsKICAgICAgLyogTm8gcGF0aCB3YXMgZ2l2ZW4gaW4gdGhlIGhlYWRlciBsaW5lLCBzZXQgdGhlIGRlZmF1bHQuCiAgICAgICAgIE5vdGUgdGhhdCB0aGUgcGFzc2VkLWluIHBhdGggdG8gdGhpcyBmdW5jdGlvbiBNQVkgaGF2ZSBhICc/JyBhbmQKICAgICAgICAgZm9sbG93aW5nIHBhcnQgdGhhdCBNVVNUIG5vdCBiZSBzdG9yZWQgYXMgcGFydCBvZiB0aGUgcGF0aC4gKi8KICAgICAgY2hhciAqcXVlcnlwID0gc3RyY2hyKHBhdGgsICc/Jyk7CgogICAgICAvKiBxdWVyeXAgaXMgd2hlcmUgdGhlIGludGVyZXN0aW5nIHBhcnQgb2YgdGhlIHBhdGggZW5kcywgc28gbm93IHdlCiAgICAgICAgIHdhbnQgdG8gdGhlIGZpbmQgdGhlIGxhc3QgKi8KICAgICAgY2hhciAqZW5kc2xhc2g7CiAgICAgIGlmKCFxdWVyeXApCiAgICAgICAgZW5kc2xhc2ggPSBzdHJyY2hyKHBhdGgsICcvJyk7CiAgICAgIGVsc2UKICAgICAgICBlbmRzbGFzaCA9IG1lbXJjaHIocGF0aCwgJy8nLCAoc2l6ZV90KShxdWVyeXAgLSBwYXRoKSk7CiAgICAgIGlmKGVuZHNsYXNoKSB7CiAgICAgICAgc2l6ZV90IHBhdGhsZW4gPSAoc2l6ZV90KShlbmRzbGFzaC1wYXRoICsgMSk7IC8qIGluY2x1ZGUgZW5kIHNsYXNoICovCiAgICAgICAgY28tPnBhdGggPSBtYWxsb2MocGF0aGxlbiArIDEpOyAvKiBvbmUgZXh0cmEgZm9yIHRoZSB6ZXJvIGJ5dGUgKi8KICAgICAgICBpZihjby0+cGF0aCkgewogICAgICAgICAgbWVtY3B5KGNvLT5wYXRoLCBwYXRoLCBwYXRobGVuKTsKICAgICAgICAgIGNvLT5wYXRoW3BhdGhsZW5dID0gMDsgLyogemVybyB0ZXJtaW5hdGUgKi8KICAgICAgICAgIGNvLT5zcGF0aCA9IHNhbml0aXplX2Nvb2tpZV9wYXRoKGNvLT5wYXRoKTsKICAgICAgICAgIGlmKCFjby0+c3BhdGgpCiAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7IC8qIG91dCBvZiBtZW1vcnkgYmFkICovCiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgIH0KICAgIH0KCiAgICBpZihiYWRjb29raWUgfHwgIWNvLT5uYW1lKSB7CiAgICAgIC8qIHdlIGRpZG4ndCBnZXQgYSBjb29raWUgbmFtZSBvciBhIGJhZCBvbmUsCiAgICAgICAgIHRoaXMgaXMgYW4gaWxsZWdhbCBsaW5lLCBiYWlsIG91dCAqLwogICAgICBmcmVlY29va2llKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogIH0KICBlbHNlIHsKICAgIC8qIFRoaXMgbGluZSBpcyBOT1QgYSBIVFRQIGhlYWRlciBzdHlsZSBsaW5lLCB3ZSBkbyBvZmZlciBzdXBwb3J0IGZvcgogICAgICAgcmVhZGluZyB0aGUgb2RkIG5ldHNjYXBlIGNvb2tpZXMtZmlsZSBmb3JtYXQgaGVyZSAqLwogICAgY2hhciAqcHRyOwogICAgY2hhciAqZmlyc3RwdHI7CiAgICBjaGFyICp0b2tfYnVmID0gTlVMTDsKICAgIGludCBmaWVsZHM7CgogICAgLyogSUUgaW50cm9kdWNlZCBIVFRQLW9ubHkgY29va2llcyB0byBwcmV2ZW50IFhTUyBhdHRhY2tzLiBDb29raWVzCiAgICAgICBtYXJrZWQgd2l0aCBodHRwT25seSBhZnRlciB0aGUgZG9tYWluIG5hbWUgYXJlIG5vdCBhY2Nlc3NpYmxlCiAgICAgICBmcm9tIGphdmFzY3JpcHRzLCBidXQgc2luY2UgY3VybCBkb2VzIG5vdCBvcGVyYXRlIGF0IGphdmFzY3JpcHQKICAgICAgIGxldmVsLCB3ZSBpbmNsdWRlIHRoZW0gYW55d2F5LiBJbiBGaXJlZm94J3MgY29va2llIGZpbGVzLCB0aGVzZQogICAgICAgbGluZXMgYXJlIHByZWNlZGVkIHdpdGggI0h0dHBPbmx5XyBhbmQgdGhlbiBldmVyeXRoaW5nIGlzCiAgICAgICBhcyB1c3VhbCwgc28gd2Ugc2tpcCAxMCBjaGFyYWN0ZXJzIG9mIHRoZSBsaW5lLi4KICAgICovCiAgICBpZihzdHJuY21wKGxpbmVwdHIsICIjSHR0cE9ubHlfIiwgMTApID09IDApIHsKICAgICAgbGluZXB0ciArPSAxMDsKICAgICAgY28tPmh0dHBvbmx5ID0gVFJVRTsKICAgIH0KCiAgICBpZihsaW5lcHRyWzBdPT0nIycpIHsKICAgICAgLyogZG9uJ3QgZXZlbiB0cnkgdGhlIGNvbW1lbnRzICovCiAgICAgIGZyZWUoY28pOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIC8qIHN0cmlwIG9mZiB0aGUgcG9zc2libGUgZW5kLW9mLWxpbmUgY2hhcmFjdGVycyAqLwogICAgcHRyID0gc3RyY2hyKGxpbmVwdHIsICdccicpOwogICAgaWYocHRyKQogICAgICAqcHRyID0gMDsgLyogY2xlYXIgaXQgKi8KICAgIHB0ciA9IHN0cmNocihsaW5lcHRyLCAnXG4nKTsKICAgIGlmKHB0cikKICAgICAgKnB0ciA9IDA7IC8qIGNsZWFyIGl0ICovCgogICAgZmlyc3RwdHIgPSBzdHJ0b2tfcihsaW5lcHRyLCAiXHQiLCAmdG9rX2J1Zik7IC8qIHRva2VuaXplIGl0IG9uIHRoZSBUQUIgKi8KCiAgICAvKiBOb3cgbG9vcCB0aHJvdWdoIHRoZSBmaWVsZHMgYW5kIGluaXQgdGhlIHN0cnVjdCB3ZSBhbHJlYWR5IGhhdmUKICAgICAgIGFsbG9jYXRlZCAqLwogICAgZm9yKHB0ciA9IGZpcnN0cHRyLCBmaWVsZHMgPSAwOyBwdHIgJiYgIWJhZGNvb2tpZTsKICAgICAgICBwdHIgPSBzdHJ0b2tfcihOVUxMLCAiXHQiLCAmdG9rX2J1ZiksIGZpZWxkcysrKSB7CiAgICAgIHN3aXRjaChmaWVsZHMpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGlmKHB0clswXT09Jy4nKSAvKiBza2lwIHByZWNlZGluZyBkb3RzICovCiAgICAgICAgICBwdHIrKzsKICAgICAgICBjby0+ZG9tYWluID0gc3RyZHVwKHB0cik7CiAgICAgICAgaWYoIWNvLT5kb21haW4pCiAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDE6CiAgICAgICAgLyogVGhpcyBmaWVsZCBnb3QgaXRzIGV4cGxhbmF0aW9uIG9uIHRoZSAyM3JkIG9mIE1heSAyMDAxIGJ5CiAgICAgICAgICAgQW5kculzIEdhcmPtYToKCiAgICAgICAgICAgZmxhZzogQSBUUlVFL0ZBTFNFIHZhbHVlIGluZGljYXRpbmcgaWYgYWxsIG1hY2hpbmVzIHdpdGhpbiBhIGdpdmVuCiAgICAgICAgICAgZG9tYWluIGNhbiBhY2Nlc3MgdGhlIHZhcmlhYmxlLiBUaGlzIHZhbHVlIGlzIHNldCBhdXRvbWF0aWNhbGx5IGJ5CiAgICAgICAgICAgdGhlIGJyb3dzZXIsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgeW91IHNldCBmb3IgdGhlIGRvbWFpbi4KCiAgICAgICAgICAgQXMgZmFyIGFzIEkgY2FuIHNlZSwgaXQgaXMgc2V0IHRvIHRydWUgd2hlbiB0aGUgY29va2llIHNheXMKICAgICAgICAgICAuZG9tYWluLmNvbSBhbmQgdG8gZmFsc2Ugd2hlbiB0aGUgZG9tYWluIGlzIGNvbXBsZXRlIHd3dy5kb21haW4uY29tCiAgICAgICAgKi8KICAgICAgICBjby0+dGFpbG1hdGNoID0gc3RyY2FzZWNvbXBhcmUocHRyLCAiVFJVRSIpP1RSVUU6RkFMU0U7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICAvKiBJdCB0dXJucyBvdXQsIHRoYXQgc29tZXRpbWVzIHRoZSBmaWxlIGZvcm1hdCBhbGxvd3MgdGhlIHBhdGgKICAgICAgICAgICBmaWVsZCB0byByZW1haW4gbm90IGZpbGxlZCBpbiwgd2UgdHJ5IHRvIGRldGVjdCB0aGlzIGFuZCB3b3JrCiAgICAgICAgICAgYXJvdW5kIGl0ISBBbmRy6XMgR2FyY+1hIG1hZGUgdXMgYXdhcmUgb2YgdGhpcy4uLiAqLwogICAgICAgIGlmKHN0cmNtcCgiVFJVRSIsIHB0cikgJiYgc3RyY21wKCJGQUxTRSIsIHB0cikpIHsKICAgICAgICAgIC8qIG9ubHkgaWYgdGhlIHBhdGggZG9lc24ndCBsb29rIGxpa2UgYSBib29sZWFuIG9wdGlvbiEgKi8KICAgICAgICAgIGNvLT5wYXRoID0gc3RyZHVwKHB0cik7CiAgICAgICAgICBpZighY28tPnBhdGgpCiAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY28tPnNwYXRoID0gc2FuaXRpemVfY29va2llX3BhdGgoY28tPnBhdGgpOwogICAgICAgICAgICBpZighY28tPnNwYXRoKSB7CiAgICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsgLyogb3V0IG9mIG1lbW9yeSBiYWQgKi8KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qIHRoaXMgZG9lc24ndCBsb29rIGxpa2UgYSBwYXRoLCBtYWtlIG9uZSB1cCEgKi8KICAgICAgICBjby0+cGF0aCA9IHN0cmR1cCgiLyIpOwogICAgICAgIGlmKCFjby0+cGF0aCkKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgY28tPnNwYXRoID0gc3RyZHVwKCIvIik7CiAgICAgICAgaWYoIWNvLT5zcGF0aCkKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgZmllbGRzKys7IC8qIGFkZCBhIGZpZWxkIGFuZCBmYWxsIGRvd24gdG8gc2VjdXJlICovCiAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KICAgICAgY2FzZSAzOgogICAgICAgIGNvLT5zZWN1cmUgPSBzdHJjYXNlY29tcGFyZShwdHIsICJUUlVFIik/VFJVRTpGQUxTRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA0OgogICAgICAgIGlmKGN1cmx4X3N0cnRvb2ZmdChwdHIsIE5VTEwsIDEwLCAmY28tPmV4cGlyZXMpKQogICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA1OgogICAgICAgIGNvLT5uYW1lID0gc3RyZHVwKHB0cik7CiAgICAgICAgaWYoIWNvLT5uYW1lKQogICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA2OgogICAgICAgIGNvLT52YWx1ZSA9IHN0cmR1cChwdHIpOwogICAgICAgIGlmKCFjby0+dmFsdWUpCiAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZig2ID09IGZpZWxkcykgewogICAgICAvKiB3ZSBnb3QgYSBjb29raWUgd2l0aCBibGFuayBjb250ZW50cywgZml4IGl0ICovCiAgICAgIGNvLT52YWx1ZSA9IHN0cmR1cCgiIik7CiAgICAgIGlmKCFjby0+dmFsdWUpCiAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgZWxzZQogICAgICAgIGZpZWxkcysrOwogICAgfQoKICAgIGlmKCFiYWRjb29raWUgJiYgKDcgIT0gZmllbGRzKSkKICAgICAgLyogd2UgZGlkIG5vdCBmaW5kIHRoZSBzdWZmaWNpZW50IG51bWJlciBvZiBmaWVsZHMgKi8KICAgICAgYmFkY29va2llID0gVFJVRTsKCiAgICBpZihiYWRjb29raWUpIHsKICAgICAgZnJlZWNvb2tpZShjbyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICB9CgogIGlmKCFjLT5ydW5uaW5nICYmICAgIC8qIHJlYWQgZnJvbSBhIGZpbGUgKi8KICAgICBjLT5uZXdzZXNzaW9uICYmICAvKiBjbGVhbiBzZXNzaW9uIGNvb2tpZXMgKi8KICAgICAhY28tPmV4cGlyZXMpIHsgICAvKiB0aGlzIGlzIGEgc2Vzc2lvbiBjb29raWUgc2luY2UgaXQgZG9lc24ndCBleHBpcmUhICovCiAgICBmcmVlY29va2llKGNvKTsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgY28tPmxpdmVjb29raWUgPSBjLT5ydW5uaW5nOwoKICAvKiBub3csIHdlIGhhdmUgcGFyc2VkIHRoZSBpbmNvbWluZyBsaW5lLCB3ZSBtdXN0IG5vdyBjaGVjayBpZiB0aGlzCiAgICAgc3VwZXJjZWVkcyBhbiBhbHJlYWR5IGV4aXN0aW5nIGNvb2tpZSwgd2hpY2ggaXQgbWF5IGlmIHRoZSBwcmV2aW91cyBoYXZlCiAgICAgdGhlIHNhbWUgZG9tYWluIGFuZCBwYXRoIGFzIHRoaXMgKi8KCiAgLyogYXQgZmlyc3QsIHJlbW92ZSBleHBpcmVkIGNvb2tpZXMgKi8KICBpZighbm9leHBpcmUpCiAgICByZW1vdmVfZXhwaXJlZChjKTsKCiNpZmRlZiBVU0VfTElCUFNMCiAgLyogQ2hlY2sgaWYgdGhlIGRvbWFpbiBpcyBhIFB1YmxpYyBTdWZmaXggYW5kIGlmIHllcywgaWdub3JlIHRoZSBjb29raWUuCiAgICAgVGhpcyBuZWVkcyBhIGxpYnBzbCBjb21waWxlZCB3aXRoIGJ1aWx0aW4gZGF0YS4gKi8KICBpZihkb21haW4gJiYgY28tPmRvbWFpbiAmJiAhaXNpcChjby0+ZG9tYWluKSkgewogICAgcHNsID0gcHNsX2J1aWx0aW4oKTsKICAgIGlmKHBzbCAmJiAhcHNsX2lzX2Nvb2tpZV9kb21haW5fYWNjZXB0YWJsZShwc2wsIGRvbWFpbiwgY28tPmRvbWFpbikpIHsKICAgICAgaW5mb2YoZGF0YSwKICAgICAgICAgICAgImNvb2tpZSAnJXMnIGRyb3BwZWQsIGRvbWFpbiAnJXMnIG11c3Qgbm90IHNldCBjb29raWVzIGZvciAnJXMnXG4iLAogICAgICAgICAgICBjby0+bmFtZSwgZG9tYWluLCBjby0+ZG9tYWluKTsKICAgICAgZnJlZWNvb2tpZShjbyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQogIH0KI2VuZGlmCgogIG15aGFzaCA9IGNvb2tpZWhhc2goY28tPmRvbWFpbik7CiAgY2xpc3QgPSBjLT5jb29raWVzW215aGFzaF07CiAgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICB3aGlsZShjbGlzdCkgewogICAgaWYoc3RyY2FzZWNvbXBhcmUoY2xpc3QtPm5hbWUsIGNvLT5uYW1lKSkgewogICAgICAvKiB0aGUgbmFtZXMgYXJlIGlkZW50aWNhbCAqLwoKICAgICAgaWYoY2xpc3QtPmRvbWFpbiAmJiBjby0+ZG9tYWluKSB7CiAgICAgICAgaWYoc3RyY2FzZWNvbXBhcmUoY2xpc3QtPmRvbWFpbiwgY28tPmRvbWFpbikgJiYKICAgICAgICAgIChjbGlzdC0+dGFpbG1hdGNoID09IGNvLT50YWlsbWF0Y2gpKQogICAgICAgICAgLyogVGhlIGRvbWFpbnMgYXJlIGlkZW50aWNhbCAqLwogICAgICAgICAgcmVwbGFjZV9vbGQgPSBUUlVFOwogICAgICB9CiAgICAgIGVsc2UgaWYoIWNsaXN0LT5kb21haW4gJiYgIWNvLT5kb21haW4pCiAgICAgICAgcmVwbGFjZV9vbGQgPSBUUlVFOwoKICAgICAgaWYocmVwbGFjZV9vbGQpIHsKICAgICAgICAvKiB0aGUgZG9tYWlucyB3ZXJlIGlkZW50aWNhbCAqLwoKICAgICAgICBpZihjbGlzdC0+c3BhdGggJiYgY28tPnNwYXRoKSB7CiAgICAgICAgICBpZihzdHJjYXNlY29tcGFyZShjbGlzdC0+c3BhdGgsIGNvLT5zcGF0aCkpIHsKICAgICAgICAgICAgcmVwbGFjZV9vbGQgPSBUUlVFOwogICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgICByZXBsYWNlX29sZCA9IEZBTFNFOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmKCFjbGlzdC0+c3BhdGggJiYgIWNvLT5zcGF0aCkKICAgICAgICAgIHJlcGxhY2Vfb2xkID0gVFJVRTsKICAgICAgICBlbHNlCiAgICAgICAgICByZXBsYWNlX29sZCA9IEZBTFNFOwoKICAgICAgfQoKICAgICAgaWYocmVwbGFjZV9vbGQgJiYgIWNvLT5saXZlY29va2llICYmIGNsaXN0LT5saXZlY29va2llKSB7CiAgICAgICAgLyogQm90aCBjb29raWVzIG1hdGNoZWQgZmluZSwgZXhjZXB0IHRoYXQgdGhlIGFscmVhZHkgcHJlc2VudAogICAgICAgICAgIGNvb2tpZSBpcyAibGl2ZSIsIHdoaWNoIG1lYW5zIGl0IHdhcyBzZXQgZnJvbSBhIGhlYWRlciwgd2hpbGUKICAgICAgICAgICB0aGUgbmV3IG9uZSBpc24ndCAibGl2ZSIgYW5kIHRodXMgb25seSByZWFkIGZyb20gYSBmaWxlLiBXZSBsZXQKICAgICAgICAgICBsaXZlIGNvb2tpZXMgc3RheSBhbGl2ZSAqLwoKICAgICAgICAvKiBGcmVlIHRoZSBuZXdjb21lciBhbmQgZ2V0IG91dCBvZiBoZXJlISAqLwogICAgICAgIGZyZWVjb29raWUoY28pOwogICAgICAgIHJldHVybiBOVUxMOwogICAgICB9CgogICAgICBpZihyZXBsYWNlX29sZCkgewogICAgICAgIGNvLT5uZXh0ID0gY2xpc3QtPm5leHQ7IC8qIGdldCB0aGUgbmV4dC1wb2ludGVyIGZpcnN0ICovCgogICAgICAgIC8qIHRoZW4gZnJlZSBhbGwgdGhlIG9sZCBwb2ludGVycyAqLwogICAgICAgIGZyZWUoY2xpc3QtPm5hbWUpOwogICAgICAgIGZyZWUoY2xpc3QtPnZhbHVlKTsKICAgICAgICBmcmVlKGNsaXN0LT5kb21haW4pOwogICAgICAgIGZyZWUoY2xpc3QtPnBhdGgpOwogICAgICAgIGZyZWUoY2xpc3QtPnNwYXRoKTsKICAgICAgICBmcmVlKGNsaXN0LT5leHBpcmVzdHIpOwogICAgICAgIGZyZWUoY2xpc3QtPnZlcnNpb24pOwogICAgICAgIGZyZWUoY2xpc3QtPm1heGFnZSk7CgogICAgICAgICpjbGlzdCA9ICpjbzsgIC8qIHRoZW4gc3RvcmUgYWxsIHRoZSBuZXcgZGF0YSAqLwoKICAgICAgICBmcmVlKGNvKTsgICAvKiBmcmVlIHRoZSBuZXdseSBhbGxvY2VkIG1lbW9yeSAqLwogICAgICAgIGNvID0gY2xpc3Q7IC8qIHBvaW50IHRvIHRoZSBwcmV2aW91cyBzdHJ1Y3QgaW5zdGVhZCAqLwoKICAgICAgICAvKiBXZSBoYXZlIHJlcGxhY2VkIGEgY29va2llLCBub3cgc2tpcCB0aGUgcmVzdCBvZiB0aGUgbGlzdCBidXQKICAgICAgICAgICBtYWtlIHN1cmUgdGhlICdsYXN0YycgcG9pbnRlciBpcyBwcm9wZXJseSBzZXQgKi8KICAgICAgICBkbyB7CiAgICAgICAgICBsYXN0YyA9IGNsaXN0OwogICAgICAgICAgY2xpc3QgPSBjbGlzdC0+bmV4dDsKICAgICAgICB9IHdoaWxlKGNsaXN0KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgbGFzdGMgPSBjbGlzdDsKICAgIGNsaXN0ID0gY2xpc3QtPm5leHQ7CiAgfQoKICBpZihjLT5ydW5uaW5nKQogICAgLyogT25seSBzaG93IHRoaXMgd2hlbiBOT1QgcmVhZGluZyB0aGUgY29va2llcyBmcm9tIGEgZmlsZSAqLwogICAgaW5mb2YoZGF0YSwgIiVzIGNvb2tpZSAlcz1cIiVzXCIgZm9yIGRvbWFpbiAlcywgcGF0aCAlcywgIgogICAgICAgICAgImV4cGlyZSAlIiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICJcbiIsCiAgICAgICAgICByZXBsYWNlX29sZD8iUmVwbGFjZWQiOiJBZGRlZCIsIGNvLT5uYW1lLCBjby0+dmFsdWUsCiAgICAgICAgICBjby0+ZG9tYWluLCBjby0+cGF0aCwgY28tPmV4cGlyZXMpOwoKICBpZighcmVwbGFjZV9vbGQpIHsKICAgIC8qIHRoZW4gbWFrZSB0aGUgbGFzdCBpdGVtIHBvaW50IG9uIHRoaXMgbmV3IG9uZSAqLwogICAgaWYobGFzdGMpCiAgICAgIGxhc3RjLT5uZXh0ID0gY287CiAgICBlbHNlCiAgICAgIGMtPmNvb2tpZXNbbXloYXNoXSA9IGNvOwogICAgYy0+bnVtY29va2llcysrOyAvKiBvbmUgbW9yZSBjb29raWUgaW4gdGhlIGphciAqLwogIH0KCiAgcmV0dXJuIGNvOwp9CgovKgogKiBnZXRfbGluZSgpIG1ha2VzIHN1cmUgdG8gb25seSByZXR1cm4gY29tcGxldGUgd2hvbGUgbGluZXMgdGhhdCBmaXQgaW4gJ2xlbicKICogYnl0ZXMgYW5kIGVuZCB3aXRoIGEgbmV3bGluZS4KICovCnN0YXRpYyBjaGFyICpnZXRfbGluZShjaGFyICpidWYsIGludCBsZW4sIEZJTEUgKmlucHV0KQp7CiAgYm9vbCBwYXJ0aWFsID0gRkFMU0U7CiAgd2hpbGUoMSkgewogICAgY2hhciAqYiA9IGZnZXRzKGJ1ZiwgbGVuLCBpbnB1dCk7CiAgICBpZihiKSB7CiAgICAgIHNpemVfdCBybGVuID0gc3RybGVuKGIpOwogICAgICBpZihybGVuICYmIChiW3JsZW4tMV0gPT0gJ1xuJykpIHsKICAgICAgICBpZihwYXJ0aWFsKSB7CiAgICAgICAgICBwYXJ0aWFsID0gRkFMU0U7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGI7CiAgICAgIH0KICAgICAgLyogcmVhZCBhIHBhcnRpYWwsIGRpc2NhcmQgdGhlIG5leHQgcGllY2UgdGhhdCBlbmRzIHdpdGggbmV3bGluZSAqLwogICAgICBwYXJ0aWFsID0gVFJVRTsKICAgIH0KICAgIGVsc2UKICAgICAgYnJlYWs7CiAgfQogIHJldHVybiBOVUxMOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2luaXQoKQogKgogKiBJbml0cyBhIGNvb2tpZSBzdHJ1Y3QgdG8gcmVhZCBkYXRhIGZyb20gYSBsb2NhbCBmaWxlLiBUaGlzIGlzIGFsd2F5cwogKiBjYWxsZWQgYmVmb3JlIGFueSBjb29raWVzIGFyZSBzZXQuIEZpbGUgbWF5IGJlIE5VTEwuCiAqCiAqIElmICduZXdzZXNzaW9uJyBpcyBUUlVFLCBkaXNjYXJkIGFsbCAic2Vzc2lvbiBjb29raWVzIiBvbiByZWFkIGZyb20gZmlsZS4KICoKICogUmV0dXJucyBOVUxMIG9uIG91dCBvZiBtZW1vcnkuIEludmFsaWQgY29va2llcyBhcmUgaWdub3JlZC4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBDb29raWVJbmZvICpDdXJsX2Nvb2tpZV9pbml0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDb29raWVJbmZvICppbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmV3c2Vzc2lvbikKewogIHN0cnVjdCBDb29raWVJbmZvICpjOwogIEZJTEUgKmZwID0gTlVMTDsKICBib29sIGZyb21maWxlID0gVFJVRTsKICBjaGFyICpsaW5lID0gTlVMTDsKCiAgaWYoTlVMTCA9PSBpbmMpIHsKICAgIC8qIHdlIGRpZG4ndCBnZXQgYSBzdHJ1Y3QsIGNyZWF0ZSBvbmUgKi8KICAgIGMgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBDb29raWVJbmZvKSk7CiAgICBpZighYykKICAgICAgcmV0dXJuIE5VTEw7IC8qIGZhaWxlZCB0byBnZXQgbWVtb3J5ICovCiAgICBjLT5maWxlbmFtZSA9IHN0cmR1cChmaWxlP2ZpbGU6Im5vbmUiKTsgLyogY29weSB0aGUgbmFtZSBqdXN0IGluIGNhc2UgKi8KICAgIGlmKCFjLT5maWxlbmFtZSkKICAgICAgZ290byBmYWlsOyAvKiBmYWlsZWQgdG8gZ2V0IG1lbW9yeSAqLwogIH0KICBlbHNlIHsKICAgIC8qIHdlIGdvdCBhbiBhbHJlYWR5IGV4aXN0aW5nIG9uZSwgdXNlIHRoYXQgKi8KICAgIGMgPSBpbmM7CiAgfQogIGMtPnJ1bm5pbmcgPSBGQUxTRTsgLyogdGhpcyBpcyBub3QgcnVubmluZywgdGhpcyBpcyBpbml0ICovCgogIGlmKGZpbGUgJiYgIXN0cmNtcChmaWxlLCAiLSIpKSB7CiAgICBmcCA9IHN0ZGluOwogICAgZnJvbWZpbGUgPSBGQUxTRTsKICB9CiAgZWxzZSBpZihmaWxlICYmICEqZmlsZSkgewogICAgLyogcG9pbnRzIHRvIGEgIiIgc3RyaW5nICovCiAgICBmcCA9IE5VTEw7CiAgfQogIGVsc2UKICAgIGZwID0gZmlsZT9mb3BlbihmaWxlLCBGT1BFTl9SRUFEVEVYVCk6TlVMTDsKCiAgYy0+bmV3c2Vzc2lvbiA9IG5ld3Nlc3Npb247IC8qIG5ldyBzZXNzaW9uPyAqLwoKICBpZihmcCkgewogICAgY2hhciAqbGluZXB0cjsKICAgIGJvb2wgaGVhZGVybGluZTsKCiAgICBsaW5lID0gbWFsbG9jKE1BWF9DT09LSUVfTElORSk7CiAgICBpZighbGluZSkKICAgICAgZ290byBmYWlsOwogICAgd2hpbGUoZ2V0X2xpbmUobGluZSwgTUFYX0NPT0tJRV9MSU5FLCBmcCkpIHsKICAgICAgaWYoY2hlY2twcmVmaXgoIlNldC1Db29raWU6IiwgbGluZSkpIHsKICAgICAgICAvKiBUaGlzIGlzIGEgY29va2llIGxpbmUsIGdldCBpdCEgKi8KICAgICAgICBsaW5lcHRyID0gJmxpbmVbMTFdOwogICAgICAgIGhlYWRlcmxpbmUgPSBUUlVFOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGxpbmVwdHIgPSBsaW5lOwogICAgICAgIGhlYWRlcmxpbmUgPSBGQUxTRTsKICAgICAgfQogICAgICB3aGlsZSgqbGluZXB0ciAmJiBJU0JMQU5LKCpsaW5lcHRyKSkKICAgICAgICBsaW5lcHRyKys7CgogICAgICBDdXJsX2Nvb2tpZV9hZGQoZGF0YSwgYywgaGVhZGVybGluZSwgVFJVRSwgbGluZXB0ciwgTlVMTCwgTlVMTCk7CiAgICB9CiAgICBmcmVlKGxpbmUpOyAvKiBmcmVlIHRoZSBsaW5lIGJ1ZmZlciAqLwogICAgcmVtb3ZlX2V4cGlyZWQoYyk7IC8qIHJ1biB0aGlzIG9uY2UsIG5vdCBvbiBldmVyeSBjb29raWUgKi8KCiAgICBpZihmcm9tZmlsZSkKICAgICAgZmNsb3NlKGZwKTsKICB9CgogIGMtPnJ1bm5pbmcgPSBUUlVFOyAgICAgICAgICAvKiBub3csIHdlJ3JlIHJ1bm5pbmcgKi8KCiAgcmV0dXJuIGM7CgpmYWlsOgogIGZyZWUobGluZSk7CiAgaWYoIWluYykKICAgIC8qIE9ubHkgY2xlYW4gdXAgaWYgd2UgYWxsb2NhdGVkIGl0IGhlcmUsIGFzIHRoZSBvcmlnaW5hbCBjb3VsZCBzdGlsbCBiZSBpbgogICAgICogdXNlIGJ5IGEgc2hhcmUgaGFuZGxlICovCiAgICBDdXJsX2Nvb2tpZV9jbGVhbnVwKGMpOwogIGlmKGZyb21maWxlICYmIGZwKQogICAgZmNsb3NlKGZwKTsKICByZXR1cm4gTlVMTDsgLyogb3V0IG9mIG1lbW9yeSAqLwp9CgovKiBzb3J0IHRoaXMgc28gdGhhdCB0aGUgbG9uZ2VzdCBwYXRoIGdldHMgYmVmb3JlIHRoZSBzaG9ydGVyIHBhdGggKi8Kc3RhdGljIGludCBjb29raWVfc29ydChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCnsKICBzdHJ1Y3QgQ29va2llICpjMSA9ICooc3RydWN0IENvb2tpZSAqKilwMTsKICBzdHJ1Y3QgQ29va2llICpjMiA9ICooc3RydWN0IENvb2tpZSAqKilwMjsKICBzaXplX3QgbDEsIGwyOwoKICAvKiAxIC0gY29tcGFyZSBjb29raWUgcGF0aCBsZW5ndGhzICovCiAgbDEgPSBjMS0+cGF0aCA/IHN0cmxlbihjMS0+cGF0aCkgOiAwOwogIGwyID0gYzItPnBhdGggPyBzdHJsZW4oYzItPnBhdGgpIDogMDsKCiAgaWYobDEgIT0gbDIpCiAgICByZXR1cm4gKGwyID4gbDEpID8gMSA6IC0xIDsgLyogYXZvaWQgc2l6ZV90IDw9PiBpbnQgY29udmVyc2lvbnMgKi8KCiAgLyogMiAtIGNvbXBhcmUgY29va2llIGRvbWFpbiBsZW5ndGhzICovCiAgbDEgPSBjMS0+ZG9tYWluID8gc3RybGVuKGMxLT5kb21haW4pIDogMDsKICBsMiA9IGMyLT5kb21haW4gPyBzdHJsZW4oYzItPmRvbWFpbikgOiAwOwoKICBpZihsMSAhPSBsMikKICAgIHJldHVybiAobDIgPiBsMSkgPyAxIDogLTEgOyAgLyogYXZvaWQgc2l6ZV90IDw9PiBpbnQgY29udmVyc2lvbnMgKi8KCiAgLyogMyAtIGNvbXBhcmUgY29va2llIG5hbWVzICovCiAgaWYoYzEtPm5hbWUgJiYgYzItPm5hbWUpCiAgICByZXR1cm4gc3RyY21wKGMxLT5uYW1lLCBjMi0+bmFtZSk7CgogIC8qIHNvcnJ5LCBjYW4ndCBiZSBtb3JlIGRldGVybWluaXN0aWMgKi8KICByZXR1cm4gMDsKfQoKI2RlZmluZSBDTE9ORShmaWVsZCkgICAgICAgICAgICAgICAgICAgICBcCiAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgaWYoc3JjLT5maWVsZCkgeyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgZC0+ZmllbGQgPSBzdHJkdXAoc3JjLT5maWVsZCk7ICAgICBcCiAgICAgIGlmKCFkLT5maWVsZCkgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGdvdG8gZmFpbDsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgfSB3aGlsZSgwKQoKc3RhdGljIHN0cnVjdCBDb29raWUgKmR1cF9jb29raWUoc3RydWN0IENvb2tpZSAqc3JjKQp7CiAgc3RydWN0IENvb2tpZSAqZCA9IGNhbGxvYyhzaXplb2Yoc3RydWN0IENvb2tpZSksIDEpOwogIGlmKGQpIHsKICAgIENMT05FKGV4cGlyZXN0cik7CiAgICBDTE9ORShkb21haW4pOwogICAgQ0xPTkUocGF0aCk7CiAgICBDTE9ORShzcGF0aCk7CiAgICBDTE9ORShuYW1lKTsKICAgIENMT05FKHZhbHVlKTsKICAgIENMT05FKG1heGFnZSk7CiAgICBDTE9ORSh2ZXJzaW9uKTsKICAgIGQtPmV4cGlyZXMgPSBzcmMtPmV4cGlyZXM7CiAgICBkLT50YWlsbWF0Y2ggPSBzcmMtPnRhaWxtYXRjaDsKICAgIGQtPnNlY3VyZSA9IHNyYy0+c2VjdXJlOwogICAgZC0+bGl2ZWNvb2tpZSA9IHNyYy0+bGl2ZWNvb2tpZTsKICAgIGQtPmh0dHBvbmx5ID0gc3JjLT5odHRwb25seTsKICB9CiAgcmV0dXJuIGQ7CgogIGZhaWw6CiAgZnJlZWNvb2tpZShkKTsKICByZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2dldGxpc3QoKQogKgogKiBGb3IgYSBnaXZlbiBob3N0IGFuZCBwYXRoLCByZXR1cm4gYSBsaW5rZWQgbGlzdCBvZiBjb29raWVzIHRoYXQgdGhlCiAqIGNsaWVudCBzaG91bGQgc2VuZCB0byB0aGUgc2VydmVyIGlmIHVzZWQgbm93LiBUaGUgc2VjdXJlIGJvb2xlYW4gaW5mb3JtcwogKiB0aGUgY29va2llIGlmIGEgc2VjdXJlIGNvbm5lY3Rpb24gaXMgYWNoaWV2ZWQgb3Igbm90LgogKgogKiBJdCBzaGFsbCBvbmx5IHJldHVybiBjb29raWVzIHRoYXQgaGF2ZW4ndCBleHBpcmVkLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0cnVjdCBDb29raWUgKkN1cmxfY29va2llX2dldGxpc3Qoc3RydWN0IENvb2tpZUluZm8gKmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNlY3VyZSkKewogIHN0cnVjdCBDb29raWUgKm5ld2NvOwogIHN0cnVjdCBDb29raWUgKmNvOwogIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwogIHN0cnVjdCBDb29raWUgKm1haW5jbyA9IE5VTEw7CiAgc2l6ZV90IG1hdGNoZXMgPSAwOwogIGJvb2wgaXNfaXA7CiAgY29uc3Qgc2l6ZV90IG15aGFzaCA9IGNvb2tpZWhhc2goaG9zdCk7CgogIGlmKCFjIHx8ICFjLT5jb29raWVzW215aGFzaF0pCiAgICByZXR1cm4gTlVMTDsgLyogbm8gY29va2llIHN0cnVjdCBvciBubyBjb29raWVzIGluIHRoZSBzdHJ1Y3QgKi8KCiAgLyogYXQgZmlyc3QsIHJlbW92ZSBleHBpcmVkIGNvb2tpZXMgKi8KICByZW1vdmVfZXhwaXJlZChjKTsKCiAgLyogY2hlY2sgaWYgaG9zdCBpcyBhbiBJUCh2NHx2NikgYWRkcmVzcyAqLwogIGlzX2lwID0gaXNpcChob3N0KTsKCiAgY28gPSBjLT5jb29raWVzW215aGFzaF07CgogIHdoaWxlKGNvKSB7CiAgICAvKiBvbmx5IHByb2Nlc3MgdGhpcyBjb29raWUgaWYgaXQgaXMgbm90IGV4cGlyZWQgb3IgaGFkIG5vIGV4cGlyZQogICAgICAgZGF0ZSBBTkQgdGhhdCBpZiB0aGUgY29va2llIHJlcXVpcmVzIHdlJ3JlIHNlY3VyZSB3ZSBtdXN0IG9ubHkKICAgICAgIGNvbnRpbnVlIGlmIHdlIGFyZSEgKi8KICAgIGlmKCghY28tPmV4cGlyZXMgfHwgKGNvLT5leHBpcmVzID4gbm93KSkgJiYKICAgICAgIChjby0+c2VjdXJlP3NlY3VyZTpUUlVFKSkgewoKICAgICAgLyogbm93IGNoZWNrIGlmIHRoZSBkb21haW4gaXMgY29ycmVjdCAqLwogICAgICBpZighY28tPmRvbWFpbiB8fAogICAgICAgICAoY28tPnRhaWxtYXRjaCAmJiAhaXNfaXAgJiYgdGFpbG1hdGNoKGNvLT5kb21haW4sIGhvc3QpKSB8fAogICAgICAgICAoKCFjby0+dGFpbG1hdGNoIHx8IGlzX2lwKSAmJiBzdHJjYXNlY29tcGFyZShob3N0LCBjby0+ZG9tYWluKSkgKSB7CiAgICAgICAgLyogdGhlIHJpZ2h0IHBhcnQgb2YgdGhlIGhvc3QgbWF0Y2hlcyB0aGUgZG9tYWluIHN0dWZmIGluIHRoZQogICAgICAgICAgIGNvb2tpZSBkYXRhICovCgogICAgICAgIC8qIG5vdyBjaGVjayB0aGUgbGVmdCBwYXJ0IG9mIHRoZSBwYXRoIHdpdGggdGhlIGNvb2tpZXMgcGF0aAogICAgICAgICAgIHJlcXVpcmVtZW50ICovCiAgICAgICAgaWYoIWNvLT5zcGF0aCB8fCBwYXRobWF0Y2goY28tPnNwYXRoLCBwYXRoKSApIHsKCiAgICAgICAgICAvKiBhbmQgbm93LCB3ZSBrbm93IHRoaXMgaXMgYSBtYXRjaCBhbmQgd2Ugc2hvdWxkIGNyZWF0ZSBhbgogICAgICAgICAgICAgZW50cnkgZm9yIHRoZSByZXR1cm4tbGlua2VkLWxpc3QgKi8KCiAgICAgICAgICBuZXdjbyA9IGR1cF9jb29raWUoY28pOwogICAgICAgICAgaWYobmV3Y28pIHsKICAgICAgICAgICAgLyogdGhlbiBtb2RpZnkgb3VyIG5leHQgKi8KICAgICAgICAgICAgbmV3Y28tPm5leHQgPSBtYWluY287CgogICAgICAgICAgICAvKiBwb2ludCB0aGUgbWFpbiB0byB1cyAqLwogICAgICAgICAgICBtYWluY28gPSBuZXdjbzsKCiAgICAgICAgICAgIG1hdGNoZXMrKzsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBmYWlsOgogICAgICAgICAgICAvKiBmYWlsdXJlLCBjbGVhciB1cCB0aGUgYWxsb2NhdGVkIGNoYWluIGFuZCByZXR1cm4gTlVMTCAqLwogICAgICAgICAgICBDdXJsX2Nvb2tpZV9mcmVlbGlzdChtYWluY28pOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNvID0gY28tPm5leHQ7CiAgfQoKICBpZihtYXRjaGVzKSB7CiAgICAvKiBOb3cgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBpZiB0aGVyZSBpcyBhIG5hbWUgYXBwZWFyaW5nIG1vcmUgdGhhbgogICAgICAgb25jZSwgdGhlIGxvbmdlc3Qgc3BlY2lmaWVkIHBhdGggdmVyc2lvbiBjb21lcyBmaXJzdC4gVG8gbWFrZSB0aGlzCiAgICAgICB0aGUgc3dpZnRlc3Qgd2F5LCB3ZSBqdXN0IHNvcnQgdGhlbSBhbGwgYmFzZWQgb24gcGF0aCBsZW5ndGguICovCiAgICBzdHJ1Y3QgQ29va2llICoqYXJyYXk7CiAgICBzaXplX3QgaTsKCiAgICAvKiBhbGxvYyBhbiBhcnJheSBhbmQgc3RvcmUgYWxsIGNvb2tpZSBwb2ludGVycyAqLwogICAgYXJyYXkgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBDb29raWUgKikgKiBtYXRjaGVzKTsKICAgIGlmKCFhcnJheSkKICAgICAgZ290byBmYWlsOwoKICAgIGNvID0gbWFpbmNvOwoKICAgIGZvcihpID0gMDsgY287IGNvID0gY28tPm5leHQpCiAgICAgIGFycmF5W2krK10gPSBjbzsKCiAgICAvKiBub3cgc29ydCB0aGUgY29va2llIHBvaW50ZXJzIGluIHBhdGggbGVuZ3RoIG9yZGVyICovCiAgICBxc29ydChhcnJheSwgbWF0Y2hlcywgc2l6ZW9mKHN0cnVjdCBDb29raWUgKiksIGNvb2tpZV9zb3J0KTsKCiAgICAvKiByZW1ha2UgdGhlIGxpbmtlZCBsaXN0IG9yZGVyIGFjY29yZGluZyB0byB0aGUgbmV3IG9yZGVyICovCgogICAgbWFpbmNvID0gYXJyYXlbMF07IC8qIHN0YXJ0IGhlcmUgKi8KICAgIGZvcihpID0gMDsgaTxtYXRjaGVzLTE7IGkrKykKICAgICAgYXJyYXlbaV0tPm5leHQgPSBhcnJheVtpICsgMV07CiAgICBhcnJheVttYXRjaGVzLTFdLT5uZXh0ID0gTlVMTDsgLyogdGVybWluYXRlIHRoZSBsaXN0ICovCgogICAgZnJlZShhcnJheSk7IC8qIHJlbW92ZSB0aGUgdGVtcG9yYXJ5IGRhdGEgYWdhaW4gKi8KICB9CgogIHJldHVybiBtYWluY287IC8qIHJldHVybiB0aGUgbmV3IGxpc3QgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2NsZWFyYWxsKCkKICoKICogQ2xlYXIgYWxsIGV4aXN0aW5nIGNvb2tpZXMgYW5kIHJlc2V0IHRoZSBjb3VudGVyLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBDdXJsX2Nvb2tpZV9jbGVhcmFsbChzdHJ1Y3QgQ29va2llSW5mbyAqY29va2llcykKewogIGlmKGNvb2tpZXMpIHsKICAgIHVuc2lnbmVkIGludCBpOwogICAgZm9yKGkgPSAwOyBpIDwgQ09PS0lFX0hBU0hfU0laRTsgaSsrKSB7CiAgICAgIEN1cmxfY29va2llX2ZyZWVsaXN0KGNvb2tpZXMtPmNvb2tpZXNbaV0pOwogICAgICBjb29raWVzLT5jb29raWVzW2ldID0gTlVMTDsKICAgIH0KICAgIGNvb2tpZXMtPm51bWNvb2tpZXMgPSAwOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2ZyZWVsaXN0KCkKICoKICogRnJlZSBhIGxpc3Qgb2YgY29va2llcyBwcmV2aW91c2x5IHJldHVybmVkIGJ5IEN1cmxfY29va2llX2dldGxpc3QoKTsKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp2b2lkIEN1cmxfY29va2llX2ZyZWVsaXN0KHN0cnVjdCBDb29raWUgKmNvKQp7CiAgc3RydWN0IENvb2tpZSAqbmV4dDsKICB3aGlsZShjbykgewogICAgbmV4dCA9IGNvLT5uZXh0OwogICAgZnJlZWNvb2tpZShjbyk7CiAgICBjbyA9IG5leHQ7CiAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2NsZWFyc2VzcygpCiAqCiAqIEZyZWUgYWxsIHNlc3Npb24gY29va2llcyBpbiB0aGUgY29va2llcyBsaXN0LgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBDdXJsX2Nvb2tpZV9jbGVhcnNlc3Moc3RydWN0IENvb2tpZUluZm8gKmNvb2tpZXMpCnsKICBzdHJ1Y3QgQ29va2llICpmaXJzdCwgKmN1cnIsICpuZXh0LCAqcHJldiA9IE5VTEw7CiAgdW5zaWduZWQgaW50IGk7CgogIGlmKCFjb29raWVzKQogICAgcmV0dXJuOwoKICBmb3IoaSA9IDA7IGkgPCBDT09LSUVfSEFTSF9TSVpFOyBpKyspIHsKICAgIGlmKCFjb29raWVzLT5jb29raWVzW2ldKQogICAgICBjb250aW51ZTsKCiAgICBmaXJzdCA9IGN1cnIgPSBwcmV2ID0gY29va2llcy0+Y29va2llc1tpXTsKCiAgICBmb3IoOyBjdXJyOyBjdXJyID0gbmV4dCkgewogICAgICBuZXh0ID0gY3Vyci0+bmV4dDsKICAgICAgaWYoIWN1cnItPmV4cGlyZXMpIHsKICAgICAgICBpZihmaXJzdCA9PSBjdXJyKQogICAgICAgICAgZmlyc3QgPSBuZXh0OwoKICAgICAgICBpZihwcmV2ID09IGN1cnIpCiAgICAgICAgICBwcmV2ID0gbmV4dDsKICAgICAgICBlbHNlCiAgICAgICAgICBwcmV2LT5uZXh0ID0gbmV4dDsKCiAgICAgICAgZnJlZWNvb2tpZShjdXJyKTsKICAgICAgICBjb29raWVzLT5udW1jb29raWVzLS07CiAgICAgIH0KICAgICAgZWxzZQogICAgICAgIHByZXYgPSBjdXJyOwogICAgfQoKICAgIGNvb2tpZXMtPmNvb2tpZXNbaV0gPSBmaXJzdDsKICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfY2xlYW51cCgpCiAqCiAqIEZyZWUgYSAiY29va2llIG9iamVjdCIgcHJldmlvdXMgY3JlYXRlZCB3aXRoIEN1cmxfY29va2llX2luaXQoKS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgQ3VybF9jb29raWVfY2xlYW51cChzdHJ1Y3QgQ29va2llSW5mbyAqYykKewogIHVuc2lnbmVkIGludCBpOwoKICBpZihjKSB7CiAgICBmcmVlKGMtPmZpbGVuYW1lKTsKICAgIGZvcihpID0gMDsgaSA8IENPT0tJRV9IQVNIX1NJWkU7IGkrKykKICAgICAgQ3VybF9jb29raWVfZnJlZWxpc3QoYy0+Y29va2llc1tpXSk7CiAgICBmcmVlKGMpOyAvKiBmcmVlIHRoZSBiYXNlIHN0cnVjdCBhcyB3ZWxsICovCiAgfQp9CgovKiBnZXRfbmV0c2NhcGVfZm9ybWF0KCkKICoKICogRm9ybWF0cyBhIHN0cmluZyBmb3IgTmV0c2NhcGUgb3V0cHV0IGZpbGUsIHcvbyBhIG5ld2xpbmUgYXQgdGhlIGVuZC4KICoKICogRnVuY3Rpb24gcmV0dXJucyBhIGNoYXIgKiB0byBhIGZvcm1hdHRlZCBsaW5lLiBIYXMgdG8gYmUgZnJlZSgpZAoqLwpzdGF0aWMgY2hhciAqZ2V0X25ldHNjYXBlX2Zvcm1hdChjb25zdCBzdHJ1Y3QgQ29va2llICpjbykKewogIHJldHVybiBhcHJpbnRmKAogICAgIiVzIiAgICAgLyogaHR0cG9ubHkgcHJlYW1ibGUgKi8KICAgICIlcyVzXHQiIC8qIGRvbWFpbiAqLwogICAgIiVzXHQiICAgLyogdGFpbG1hdGNoICovCiAgICAiJXNcdCIgICAvKiBwYXRoICovCiAgICAiJXNcdCIgICAvKiBzZWN1cmUgKi8KICAgICIlIiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICJcdCIgICAvKiBleHBpcmVzICovCiAgICAiJXNcdCIgICAvKiBuYW1lICovCiAgICAiJXMiLCAgICAvKiB2YWx1ZSAqLwogICAgY28tPmh0dHBvbmx5PyIjSHR0cE9ubHlfIjoiIiwKICAgIC8qIE1ha2Ugc3VyZSBhbGwgZG9tYWlucyBhcmUgcHJlZml4ZWQgd2l0aCBhIGRvdCBpZiB0aGV5IGFsbG93CiAgICAgICB0YWlsbWF0Y2hpbmcuIFRoaXMgaXMgTW96aWxsYS1zdHlsZS4gKi8KICAgIChjby0+dGFpbG1hdGNoICYmIGNvLT5kb21haW4gJiYgY28tPmRvbWFpblswXSAhPSAnLicpPyAiLiI6IiIsCiAgICBjby0+ZG9tYWluP2NvLT5kb21haW46InVua25vd24iLAogICAgY28tPnRhaWxtYXRjaD8iVFJVRSI6IkZBTFNFIiwKICAgIGNvLT5wYXRoP2NvLT5wYXRoOiIvIiwKICAgIGNvLT5zZWN1cmU/IlRSVUUiOiJGQUxTRSIsCiAgICBjby0+ZXhwaXJlcywKICAgIGNvLT5uYW1lLAogICAgY28tPnZhbHVlP2NvLT52YWx1ZToiIik7Cn0KCi8qCiAqIGNvb2tpZV9vdXRwdXQoKQogKgogKiBXcml0ZXMgYWxsIGludGVybmFsbHkga25vd24gY29va2llcyB0byB0aGUgc3BlY2lmaWVkIGZpbGUuIFNwZWNpZnkKICogIi0iIGFzIGZpbGUgbmFtZSB0byB3cml0ZSB0byBzdGRvdXQuCiAqCiAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIG9uIHdyaXRlIGZhaWx1cmUuCiAqLwpzdGF0aWMgaW50IGNvb2tpZV9vdXRwdXQoc3RydWN0IENvb2tpZUluZm8gKmMsIGNvbnN0IGNoYXIgKmR1bXBoZXJlKQp7CiAgc3RydWN0IENvb2tpZSAqY287CiAgRklMRSAqb3V0OwogIGJvb2wgdXNlX3N0ZG91dCA9IEZBTFNFOwogIGNoYXIgKmZvcm1hdF9wdHI7CiAgdW5zaWduZWQgaW50IGk7CgogIGlmKChOVUxMID09IGMpIHx8ICgwID09IGMtPm51bWNvb2tpZXMpKQogICAgLyogSWYgdGhlcmUgYXJlIG5vIGtub3duIGNvb2tpZXMsIHdlIGRvbid0IHdyaXRlIG9yIGV2ZW4gY3JlYXRlIGFueQogICAgICAgZGVzdGluYXRpb24gZmlsZSAqLwogICAgcmV0dXJuIDA7CgogIC8qIGF0IGZpcnN0LCByZW1vdmUgZXhwaXJlZCBjb29raWVzICovCiAgcmVtb3ZlX2V4cGlyZWQoYyk7CgogIC8qIG1ha2Ugc3VyZSB3ZSBzdGlsbCBoYXZlIGNvb2tpZXMgYWZ0ZXIgZXhwaXJhdGlvbiAqLwogIGlmKDAgPT0gYy0+bnVtY29va2llcykKICAgIHJldHVybiAwOwoKICBpZighc3RyY21wKCItIiwgZHVtcGhlcmUpKSB7CiAgICAvKiB1c2Ugc3Rkb3V0ICovCiAgICBvdXQgPSBzdGRvdXQ7CiAgICB1c2Vfc3Rkb3V0ID0gVFJVRTsKICB9CiAgZWxzZSB7CiAgICBvdXQgPSBmb3BlbihkdW1waGVyZSwgRk9QRU5fV1JJVEVURVhUKTsKICAgIGlmKCFvdXQpCiAgICAgIHJldHVybiAxOyAvKiBmYWlsdXJlICovCiAgfQoKICBmcHV0cygiIyBOZXRzY2FwZSBIVFRQIENvb2tpZSBGaWxlXG4iCiAgICAgICAgIiMgaHR0cHM6Ly9jdXJsLmhheHguc2UvZG9jcy9odHRwLWNvb2tpZXMuaHRtbFxuIgogICAgICAgICIjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGxpYmN1cmwhIEVkaXQgYXQgeW91ciBvd24gcmlzay5cblxuIiwKICAgICAgICBvdXQpOwoKICBmb3IoaSA9IDA7IGkgPCBDT09LSUVfSEFTSF9TSVpFOyBpKyspIHsKICAgIGZvcihjbyA9IGMtPmNvb2tpZXNbaV07IGNvOyBjbyA9IGNvLT5uZXh0KSB7CiAgICAgIGlmKCFjby0+ZG9tYWluKQogICAgICAgIGNvbnRpbnVlOwogICAgICBmb3JtYXRfcHRyID0gZ2V0X25ldHNjYXBlX2Zvcm1hdChjbyk7CiAgICAgIGlmKGZvcm1hdF9wdHIgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYob3V0LCAiI1xuIyBGYXRhbCBsaWJjdXJsIGVycm9yXG4iKTsKICAgICAgICBpZighdXNlX3N0ZG91dCkKICAgICAgICAgIGZjbG9zZShvdXQpOwogICAgICAgIHJldHVybiAxOwogICAgICB9CiAgICAgIGZwcmludGYob3V0LCAiJXNcbiIsIGZvcm1hdF9wdHIpOwogICAgICBmcmVlKGZvcm1hdF9wdHIpOwogICAgfQogIH0KCiAgaWYoIXVzZV9zdGRvdXQpCiAgICBmY2xvc2Uob3V0KTsKCiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3QgY3VybF9zbGlzdCAqY29va2llX2xpc3Qoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKewogIHN0cnVjdCBjdXJsX3NsaXN0ICpsaXN0ID0gTlVMTDsKICBzdHJ1Y3QgY3VybF9zbGlzdCAqYmVnOwogIHN0cnVjdCBDb29raWUgKmM7CiAgY2hhciAqbGluZTsKICB1bnNpZ25lZCBpbnQgaTsKCiAgaWYoKGRhdGEtPmNvb2tpZXMgPT0gTlVMTCkgfHwKICAgICAgKGRhdGEtPmNvb2tpZXMtPm51bWNvb2tpZXMgPT0gMCkpCiAgICByZXR1cm4gTlVMTDsKCiAgZm9yKGkgPSAwOyBpIDwgQ09PS0lFX0hBU0hfU0laRTsgaSsrKSB7CiAgICBmb3IoYyA9IGRhdGEtPmNvb2tpZXMtPmNvb2tpZXNbaV07IGM7IGMgPSBjLT5uZXh0KSB7CiAgICAgIGlmKCFjLT5kb21haW4pCiAgICAgICAgY29udGludWU7CiAgICAgIGxpbmUgPSBnZXRfbmV0c2NhcGVfZm9ybWF0KGMpOwogICAgICBpZighbGluZSkgewogICAgICAgIGN1cmxfc2xpc3RfZnJlZV9hbGwobGlzdCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgIH0KICAgICAgYmVnID0gQ3VybF9zbGlzdF9hcHBlbmRfbm9kdXAobGlzdCwgbGluZSk7CiAgICAgIGlmKCFiZWcpIHsKICAgICAgICBmcmVlKGxpbmUpOwogICAgICAgIGN1cmxfc2xpc3RfZnJlZV9hbGwobGlzdCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgIH0KICAgICAgbGlzdCA9IGJlZzsKICAgIH0KICB9CgogIHJldHVybiBsaXN0Owp9CgpzdHJ1Y3QgY3VybF9zbGlzdCAqQ3VybF9jb29raWVfbGlzdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQp7CiAgc3RydWN0IGN1cmxfc2xpc3QgKmxpc3Q7CiAgQ3VybF9zaGFyZV9sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSwgQ1VSTF9MT0NLX0FDQ0VTU19TSU5HTEUpOwogIGxpc3QgPSBjb29raWVfbGlzdChkYXRhKTsKICBDdXJsX3NoYXJlX3VubG9jayhkYXRhLCBDVVJMX0xPQ0tfREFUQV9DT09LSUUpOwogIHJldHVybiBsaXN0Owp9Cgp2b2lkIEN1cmxfZmx1c2hfY29va2llcyhzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCBpbnQgY2xlYW51cCkKewogIGlmKGRhdGEtPnNldC5zdHJbU1RSSU5HX0NPT0tJRUpBUl0pIHsKICAgIGlmKGRhdGEtPmNoYW5nZS5jb29raWVsaXN0KSB7CiAgICAgIC8qIElmIHRoZXJlIGlzIGEgbGlzdCBvZiBjb29raWUgZmlsZXMgdG8gcmVhZCwgZG8gaXQgZmlyc3Qgc28gdGhhdAogICAgICAgICB3ZSBoYXZlIGFsbCB0aGUgdG9sZCBmaWxlcyByZWFkIGJlZm9yZSB3ZSB3cml0ZSB0aGUgbmV3IGphci4KICAgICAgICAgQ3VybF9jb29raWVfbG9hZGZpbGVzKCkgTE9DS1MgYW5kIFVOTE9DS1MgdGhlIHNoYXJlIGl0c2VsZiEgKi8KICAgICAgQ3VybF9jb29raWVfbG9hZGZpbGVzKGRhdGEpOwogICAgfQoKICAgIEN1cmxfc2hhcmVfbG9jayhkYXRhLCBDVVJMX0xPQ0tfREFUQV9DT09LSUUsIENVUkxfTE9DS19BQ0NFU1NfU0lOR0xFKTsKCiAgICAvKiBpZiB3ZSBoYXZlIGEgZGVzdGluYXRpb24gZmlsZSBmb3IgYWxsIHRoZSBjb29raWVzIHRvIGdldCBkdW1wZWQgdG8gKi8KICAgIGlmKGNvb2tpZV9vdXRwdXQoZGF0YS0+Y29va2llcywgZGF0YS0+c2V0LnN0cltTVFJJTkdfQ09PS0lFSkFSXSkpCiAgICAgIGluZm9mKGRhdGEsICJXQVJOSU5HOiBmYWlsZWQgdG8gc2F2ZSBjb29raWVzIGluICVzXG4iLAogICAgICAgICAgICBkYXRhLT5zZXQuc3RyW1NUUklOR19DT09LSUVKQVJdKTsKICB9CiAgZWxzZSB7CiAgICBpZihjbGVhbnVwICYmIGRhdGEtPmNoYW5nZS5jb29raWVsaXN0KSB7CiAgICAgIC8qIHNpbmNlIG5vdGhpbmcgaXMgd3JpdHRlbiwgd2UgY2FuIGp1c3QgZnJlZSB0aGUgbGlzdCBvZiBjb29raWUgZmlsZQogICAgICAgICBuYW1lcyAqLwogICAgICBjdXJsX3NsaXN0X2ZyZWVfYWxsKGRhdGEtPmNoYW5nZS5jb29raWVsaXN0KTsgLyogY2xlYW4gdXAgbGlzdCAqLwogICAgICBkYXRhLT5jaGFuZ2UuY29va2llbGlzdCA9IE5VTEw7CiAgICB9CiAgICBDdXJsX3NoYXJlX2xvY2soZGF0YSwgQ1VSTF9MT0NLX0RBVEFfQ09PS0lFLCBDVVJMX0xPQ0tfQUNDRVNTX1NJTkdMRSk7CiAgfQoKICBpZihjbGVhbnVwICYmICghZGF0YS0+c2hhcmUgfHwgKGRhdGEtPmNvb2tpZXMgIT0gZGF0YS0+c2hhcmUtPmNvb2tpZXMpKSkgewogICAgQ3VybF9jb29raWVfY2xlYW51cChkYXRhLT5jb29raWVzKTsKICB9CiAgQ3VybF9zaGFyZV91bmxvY2soZGF0YSwgQ1VSTF9MT0NLX0RBVEFfQ09PS0lFKTsKfQoKI2VuZGlmIC8qIENVUkxfRElTQUJMRV9IVFRQIHx8IENVUkxfRElTQUJMRV9DT09LSUVTICovCg==