LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogKiAgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgIF9fX3wgfCB8IHwgIF8gXHwgfCAgICAKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gX198IHwgfCB8IHxfKSB8IHwgICAgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICoKICogQ29weXJpZ2h0IChDKSAyMDAxLCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogKgogKiBJbiBvcmRlciB0byBiZSB1c2VmdWwgZm9yIGV2ZXJ5IHBvdGVudGlhbCB1c2VyLCBjdXJsIGFuZCBsaWJjdXJsIGFyZQogKiBkdWFsLWxpY2Vuc2VkIHVuZGVyIHRoZSBNUEwgYW5kIHRoZSBNSVQvWC1kZXJpdmF0ZSBsaWNlbnNlcy4KICoKICogWW91IG1heSBvcHQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlIGFuZC9vciBzZWxsCiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwogKiBmdXJuaXNoZWQgdG8gZG8gc28sIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMIG9yIHRoZSBNSVQvWC1kZXJpdmF0ZQogKiBsaWNlbnNlcy4gWW91IG1heSBwaWNrIG9uZSBvZiB0aGVzZSBsaWNlbnNlcy4KICoKICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQogKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKgogKiAkSWQkCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioKCgpSRUNFSVZJTkcgQ09PS0lFIElORk9STUFUSU9OCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0cnVjdCBDb29raWVJbmZvICpjb29raWVfaW5pdChjaGFyICpmaWxlKTsKCQoJSW5pdHMgYSBjb29raWUgc3RydWN0IHRvIHN0b3JlIGRhdGEgaW4gYSBsb2NhbCBmaWxlLiBUaGlzIGlzIGFsd2F5cwoJY2FsbGVkIGJlZm9yZSBhbnkgY29va2llcyBhcmUgc2V0LgoKaW50IGNvb2tpZXNfc2V0KHN0cnVjdCBDb29raWVJbmZvICpjb29raWUsIGNoYXIgKmNvb2tpZV9saW5lKTsKCglUaGUgJ2Nvb2tpZV9saW5lJyBwYXJhbWV0ZXIgaXMgYSBmdWxsICJTZXQtY29va2llOiIgbGluZSBhcwoJcmVjZWl2ZWQgZnJvbSBhIHNlcnZlci4KCglUaGUgZnVuY3Rpb24gbmVlZCB0byByZXBsYWNlIHByZXZpb3VzbHkgc3RvcmVkIGxpbmVzIHRoYXQgdGhpcyBuZXcKCWxpbmUgc3VwZXJjZWVkcy4KCglJdCBtYXkgcmVtb3ZlIGxpbmVzIHRoYXQgYXJlIGV4cGlyZWQuCgoJSXQgc2hvdWxkIHJldHVybiBhbiBpbmRpY2F0aW9uIG9mIHN1Y2Nlc3MvZXJyb3IuCgoKU0VORElORyBDT09LSUUgSU5GT1JNQVRJT04KPT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0cnVjdCBDb29raWVzICpjb29raWVfZ2V0bGlzdChzdHJ1Y3QgQ29va2llSW5mbyAqY29va2llLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqaG9zdCwgY2hhciAqcGF0aCwgYm9vbCBzZWN1cmUpOwoKCUZvciBhIGdpdmVuIGhvc3QgYW5kIHBhdGgsIHJldHVybiBhIGxpbmtlZCBsaXN0IG9mIGNvb2tpZXMgdGhhdAoJdGhlIGNsaWVudCBzaG91bGQgc2VuZCB0byB0aGUgc2VydmVyIGlmIHVzZWQgbm93LiBUaGUgc2VjdXJlCglib29sZWFuIGluZm9ybXMgdGhlIGNvb2tpZSBpZiBhIHNlY3VyZSBjb25uZWN0aW9uIGlzIGFjaGlldmVkIG9yCglub3QuCgoJSXQgc2hhbGwgb25seSByZXR1cm4gY29va2llcyB0aGF0IGhhdmVuJ3QgZXhwaXJlZC4KCiAgICAKRXhhbXBsZSBzZXQgb2YgY29va2llczoKICAgIAogICAgU2V0LWNvb2tpZTogUFJPRFVDVElORk89d2VieHByZXNzOyBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6IFBFUlNPTkFMSVpFPW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS9mdGd3OyBzZWN1cmUKICAgIFNldC1jb29raWU6IEZpZEhpc3Q9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWRPcmRlcj1ub25lO2V4cGlyZXM9TW9uZGF5LCAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7CiAgICBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6IERpc1BlbmQ9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWREaXM9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOgogICAgU2Vzc2lvbl9LZXlANjc5MWE5ZTAtOTAxYS0xMWQwLWExYzgtOWIwMTJjODhhYTc3PW5vbmU7ZXhwaXJlcz1Nb25kYXksCiAgICAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7IGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQoqKioqLwoKI2luY2x1ZGUgInNldHVwLmgiCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgojaW5jbHVkZSAiY29va2llLmgiCiNpbmNsdWRlICJnZXRkYXRlLmgiCiNpbmNsdWRlICJzdHJlcXVhbC5oIgojaW5jbHVkZSAic3RydG9rLmgiCgovKiBUaGUgbGFzdCAjaW5jbHVkZSBmaWxlIHNob3VsZCBiZTogKi8KI2lmZGVmIE1BTExPQ0RFQlVHCiNpbmNsdWRlICJtZW1kZWJ1Zy5oIgojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2FkZCgpCiAqCiAqIEFkZCBhIHNpbmdsZSBjb29raWUgbGluZSB0byB0aGUgY29va2llIGtlZXBpbmcgb2JqZWN0LgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RydWN0IENvb2tpZSAqCkN1cmxfY29va2llX2FkZChzdHJ1Y3QgQ29va2llSW5mbyAqYywKICAgICAgICAgICAgICAgIGJvb2wgaHR0cGhlYWRlciwgLyogVFJVRSBpZiBIVFRQIGhlYWRlci1zdHlsZSBsaW5lICovCiAgICAgICAgICAgICAgICBjaGFyICpsaW5lcHRyLCAgIC8qIGZpcnN0IG5vbi1zcGFjZSBvZiB0aGUgbGluZSAqLwogICAgICAgICAgICAgICAgY2hhciAqZG9tYWluKSAgICAvKiBkZWZhdWx0IGRvbWFpbiAqLwp7CiAgc3RydWN0IENvb2tpZSAqY2xpc3Q7CiAgY2hhciB3aGF0W01BWF9DT09LSUVfTElORV07CiAgY2hhciBuYW1lW01BWF9OQU1FXTsKICBjaGFyICpwdHI7CiAgY2hhciAqc2VtaXB0cjsKICBzdHJ1Y3QgQ29va2llICpjbzsKICBzdHJ1Y3QgQ29va2llICpsYXN0Yz1OVUxMOwogIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwogIGJvb2wgcmVwbGFjZV9vbGQgPSBGQUxTRTsKCiAgLyogRmlyc3QsIGFsbG9jIGFuZCBpbml0IGEgbmV3IHN0cnVjdCBmb3IgaXQgKi8KICBjbyA9IChzdHJ1Y3QgQ29va2llICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgQ29va2llKSk7CiAgaWYoIWNvKQogICAgcmV0dXJuIE5VTEw7IC8qIGJhaWwgb3V0IGlmIHdlJ3JlIHRoaXMgbG93IG9uIG1lbW9yeSAqLwoKICAvKiBjbGVhciB0aGUgd2hvbGUgc3RydWN0IGZpcnN0ICovCiAgbWVtc2V0KGNvLCAwLCBzaXplb2Yoc3RydWN0IENvb2tpZSkpOwoJICAgIAogIGlmKGh0dHBoZWFkZXIpIHsKICAgIC8qIFRoaXMgbGluZSB3YXMgcmVhZCBvZmYgYSBIVFRQLWhlYWRlciAqLwoKICAgIHNlbWlwdHI9c3RyY2hyKGxpbmVwdHIsICc7Jyk7IC8qIGZpcnN0LCBmaW5kIGEgc2VtaWNvbG9uICovCiAgICBwdHIgPSBsaW5lcHRyOwogICAgZG8gewogICAgICAvKiB3ZSBoYXZlIGEgPHdoYXQ+PTx0aGlzPiBwYWlyIG9yIGEgJ3NlY3VyZScgd29yZCBoZXJlICovCiAgICAgIGlmKHN0cmNocihwdHIsICc9JykpIHsKICAgICAgICBuYW1lWzBdPXdoYXRbMF09MDsgLyogaW5pdCB0aGUgYnVmZmVycyAqLwogICAgICAgIGlmKDEgPD0gc3NjYW5mKHB0ciwgIiUiIE1BWF9OQU1FX1RYVCAiW149XT0lIgogICAgICAgICAgICAgICAgICAgICAgIE1BWF9DT09LSUVfTElORV9UWFQgIlteO1xyXG5dIiwKICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB3aGF0KSkgewogICAgICAgICAgLyogdGhpcyBpcyBhIGxlZ2FsIDx3aGF0Pj08dGhpcz4gcGFpciAqLwogICAgICAgICAgaWYoc3RyZXF1YWwoInBhdGgiLCBuYW1lKSkgewogICAgICAgICAgICBjby0+cGF0aD1zdHJkdXAod2hhdCk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmKHN0cmVxdWFsKCJkb21haW4iLCBuYW1lKSkgewogICAgICAgICAgICBjby0+ZG9tYWluPXN0cmR1cCh3aGF0KTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYoc3RyZXF1YWwoInZlcnNpb24iLCBuYW1lKSkgewogICAgICAgICAgICBjby0+dmVyc2lvbj1zdHJkdXAod2hhdCk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmKHN0cmVxdWFsKCJtYXgtYWdlIiwgbmFtZSkpIHsKICAgICAgICAgICAgLyogRGVmaW5lZCBpbiBSRkMyMTA5OgoKICAgICAgICAgICAgICAgT3B0aW9uYWwuICBUaGUgTWF4LUFnZSBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGlmZXRpbWUgb2YgdGhlCiAgICAgICAgICAgICAgIGNvb2tpZSwgaW4gc2Vjb25kcy4gIFRoZSBkZWx0YS1zZWNvbmRzIHZhbHVlIGlzIGEgZGVjaW1hbCBub24tCiAgICAgICAgICAgICAgIG5lZ2F0aXZlIGludGVnZXIuICBBZnRlciBkZWx0YS1zZWNvbmRzIHNlY29uZHMgZWxhcHNlLCB0aGUKICAgICAgICAgICAgICAgY2xpZW50IHNob3VsZCBkaXNjYXJkIHRoZSBjb29raWUuICBBIHZhbHVlIG9mIHplcm8gbWVhbnMgdGhlCiAgICAgICAgICAgICAgIGNvb2tpZSBzaG91bGQgYmUgZGlzY2FyZGVkIGltbWVkaWF0ZWx5LgoKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvLT5tYXhhZ2UgPSBzdHJkdXAod2hhdCk7CiAgICAgICAgICAgIGNvLT5leHBpcmVzID0KICAgICAgICAgICAgICBhdG9pKCgqY28tPm1heGFnZT09J1wiJyk/JmNvLT5tYXhhZ2VbMV06JmNvLT5tYXhhZ2VbMF0pOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZihzdHJlcXVhbCgiZXhwaXJlcyIsIG5hbWUpKSB7CiAgICAgICAgICAgIGNvLT5leHBpcmVzdHI9c3RyZHVwKHdoYXQpOwogICAgICAgICAgICBjby0+ZXhwaXJlcyA9IGN1cmxfZ2V0ZGF0ZSh3aGF0LCAmbm93KTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYoIWNvLT5uYW1lKSB7CiAgICAgICAgICAgIGNvLT5uYW1lID0gc3RyZHVwKG5hbWUpOwogICAgICAgICAgICBjby0+dmFsdWUgPSBzdHJkdXAod2hhdCk7CiAgICAgICAgICB9CiAgICAgICAgICAvKgogICAgICAgICAgICBlbHNlIHRoaXMgaXMgdGhlIHNlY29uZCAob3IgbW9yZSkgbmFtZSB3ZSBkb24ndCBrbm93CiAgICAgICAgICAgIGFib3V0ISAqLwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIC8qIHRoaXMgaXMgYW4gImlsbGVnYWwiIDx3aGF0Pj08dGhpcz4gcGFpciAqLwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBpZihzc2NhbmYocHRyLCAiJSIgTUFYX0NPT0tJRV9MSU5FX1RYVCAiW147XHJcbl0iLAogICAgICAgICAgICAgICAgICB3aGF0KSkgewogICAgICAgICAgaWYoc3RyZXF1YWwoInNlY3VyZSIsIHdoYXQpKQogICAgICAgICAgICBjby0+c2VjdXJlID0gVFJVRTsKICAgICAgICAgIC8qIGVsc2UsCiAgICAgICAgICAgICB1bnN1cHBvcnRlZCBrZXl3b3JkIHdpdGhvdXQgYXNzaWduISAqLwoKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYoIXNlbWlwdHIpCiAgICAgICAgY29udGludWU7IC8qIHdlIGFscmVhZHkga25vdyB0aGVyZSBhcmUgbm8gbW9yZSBjb29raWVzICovCgogICAgICBwdHI9c2VtaXB0cisxOwogICAgICB3aGlsZShwdHIgJiYgKnB0ciAmJiBpc3NwYWNlKChpbnQpKnB0cikpCiAgICAgICAgcHRyKys7CiAgICAgIHNlbWlwdHI9c3RyY2hyKHB0ciwgJzsnKTsgLyogbm93LCBmaW5kIHRoZSBuZXh0IHNlbWljb2xvbiAqLwoKICAgICAgaWYoIXNlbWlwdHIgJiYgKnB0cikKICAgICAgICAvKiBUaGVyZSBhcmUgbm8gbW9yZSBzZW1pY29sb25zLCBidXQgdGhlcmUncyBhIGZpbmFsIG5hbWU9dmFsdWUgcGFpcgogICAgICAgICAgIGNvbWluZyB1cCAqLwogICAgICAgIHNlbWlwdHI9cHRyOwogICAgfSB3aGlsZShzZW1pcHRyKTsKCiAgICBpZihOVUxMID09IGNvLT5kb21haW4pCiAgICAgIC8qIG5vIGRvbWFpbiBnaXZlbiBpbiB0aGUgaGVhZGVyIGxpbmUsIHNldCB0aGUgZGVmYXVsdCBub3cgKi8KICAgICAgY28tPmRvbWFpbj1kb21haW4/c3RyZHVwKGRvbWFpbik6TlVMTDsKICB9CiAgZWxzZSB7CiAgICAvKiBUaGlzIGxpbmUgaXMgTk9UIGEgSFRUUCBoZWFkZXIgc3R5bGUgbGluZSwgd2UgZG8gb2ZmZXIgc3VwcG9ydCBmb3IKICAgICAgIHJlYWRpbmcgdGhlIG9kZCBuZXRzY2FwZSBjb29raWVzLWZpbGUgZm9ybWF0IGhlcmUgKi8KICAgIGNoYXIgKmZpcnN0cHRyOwogICAgY2hhciAqdG9rX2J1ZjsKICAgIGludCBmaWVsZHM7CgogICAgaWYobGluZXB0clswXT09JyMnKSB7CiAgICAgIC8qIGRvbid0IGV2ZW4gdHJ5IHRoZSBjb21tZW50cyAqLwogICAgICBmcmVlKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICAvKiBzdHJpcCBvZmYgdGhlIHBvc3NpYmxlIGVuZC1vZi1saW5lIGNoYXJhY3RlcnMgKi8KICAgIHB0cj1zdHJjaHIobGluZXB0ciwgJ1xyJyk7CiAgICBpZihwdHIpCiAgICAgICpwdHI9MDsgLyogY2xlYXIgaXQgKi8KICAgIHB0cj1zdHJjaHIobGluZXB0ciwgJ1xuJyk7CiAgICBpZihwdHIpCiAgICAgICpwdHI9MDsgLyogY2xlYXIgaXQgKi8KCiAgICBmaXJzdHB0cj1zdHJ0b2tfcihsaW5lcHRyLCAiXHQiLCAmdG9rX2J1Zik7IC8qIGZpcnN0IHRva2VuaXplIGl0IG9uIHRoZSBUQUIgKi8KCiAgICAvKiBIZXJlJ3MgYSBxdWljayBjaGVjayB0byBlbGltaW5hdGUgbm9ybWFsIEhUVFAtaGVhZGVycyBmcm9tIHRoaXMgKi8KICAgIGlmKCFmaXJzdHB0ciB8fCBzdHJjaHIoZmlyc3RwdHIsICc6JykpIHsKICAgICAgZnJlZShjbyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8qIE5vdyBsb29wIHRocm91Z2ggdGhlIGZpZWxkcyBhbmQgaW5pdCB0aGUgc3RydWN0IHdlIGFscmVhZHkgaGF2ZQogICAgICAgYWxsb2NhdGVkICovCiAgICBmb3IocHRyPWZpcnN0cHRyLCBmaWVsZHM9MDsgcHRyOyBwdHI9c3RydG9rX3IoTlVMTCwgIlx0IiwgJnRva19idWYpLCBmaWVsZHMrKykgewogICAgICBzd2l0Y2goZmllbGRzKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBjby0+ZG9tYWluID0gc3RyZHVwKHB0cik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMToKICAgICAgICAvKiBUaGlzIGZpZWxkIGdvdCBpdHMgZXhwbGFuYXRpb24gb24gdGhlIDIzcmQgb2YgTWF5IDIwMDEgYnkKICAgICAgICAgICBBbmRy6XMgR2FyY+1hOgoKICAgICAgICAgICBmbGFnOiBBIFRSVUUvRkFMU0UgdmFsdWUgaW5kaWNhdGluZyBpZiBhbGwgbWFjaGluZXMgd2l0aGluIGEgZ2l2ZW4KICAgICAgICAgICBkb21haW4gY2FuIGFjY2VzcyB0aGUgdmFyaWFibGUuIFRoaXMgdmFsdWUgaXMgc2V0IGF1dG9tYXRpY2FsbHkgYnkKICAgICAgICAgICB0aGUgYnJvd3NlciwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSB5b3Ugc2V0IGZvciB0aGUgZG9tYWluLgoKICAgICAgICAgICBBcyBmYXIgYXMgSSBjYW4gc2VlLCBpdCBpcyBzZXQgdG8gdHJ1ZSB3aGVuIHRoZSBjb29raWUgc2F5cwogICAgICAgICAgIC5kb21haW4uY29tIGFuZCB0byBmYWxzZSB3aGVuIHRoZSBkb21haW4gaXMgY29tcGxldGUgd3d3LmRvbWFpbi5jb20KCiAgICAgICAgICAgV2UgZG9uJ3QgY3VycmVudGx5IHRha2UgYWR2YW50YWdlIG9mIHRoaXMga25vd2xlZGdlLgogICAgICAgICovCiAgICAgICAgY28tPmZpZWxkMT1zdHJlcXVhbChwdHIsICJUUlVFIikrMTsgLyogc3RvcmUgaW5mb3JtYXRpb24gKi8KICAgICAgICBicmVhazsKICAgICAgY2FzZSAyOgogICAgICAgIC8qIEl0IHR1cm5zIG91dCwgdGhhdCBzb21ldGltZXMgdGhlIGZpbGUgZm9ybWF0IGFsbG93cyB0aGUgcGF0aAogICAgICAgICAgIGZpZWxkIHRvIHJlbWFpbiBub3QgZmlsbGVkIGluLCB3ZSB0cnkgdG8gZGV0ZWN0IHRoaXMgYW5kIHdvcmsKICAgICAgICAgICBhcm91bmQgaXQhIEFuZHLpcyBHYXJj7WEgbWFkZSB1cyBhd2FyZSBvZiB0aGlzLi4uICovCiAgICAgICAgaWYgKHN0cmNtcCgiVFJVRSIsIHB0cikgJiYgc3RyY21wKCJGQUxTRSIsIHB0cikpIHsKICAgICAgICAgIC8qIG9ubHkgaWYgdGhlIHBhdGggZG9lc24ndCBsb29rIGxpa2UgYSBib29sZWFuIG9wdGlvbiEgKi8KICAgICAgICAgIGNvLT5wYXRoID0gc3RyZHVwKHB0cik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLyogdGhpcyBkb2Vzbid0IGxvb2sgbGlrZSBhIHBhdGgsIG1ha2Ugb25lIHVwISAqLwogICAgICAgIGNvLT5wYXRoID0gc3RyZHVwKCIvIik7CiAgICAgICAgZmllbGRzKys7IC8qIGFkZCBhIGZpZWxkIGFuZCBmYWxsIGRvd24gdG8gc2VjdXJlICovCiAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KICAgICAgY2FzZSAzOgogICAgICAgIGNvLT5zZWN1cmUgPSBzdHJlcXVhbChwdHIsICJUUlVFIik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNDoKICAgICAgICBjby0+ZXhwaXJlcyA9IGF0b2kocHRyKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA1OgogICAgICAgIGNvLT5uYW1lID0gc3RyZHVwKHB0cik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNjoKICAgICAgICBjby0+dmFsdWUgPSBzdHJkdXAocHRyKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIGlmKDcgIT0gZmllbGRzKSB7CiAgICAgIC8qIHdlIGRpZCBub3QgZmluZCB0aGUgc3VmZmljaWVudCBudW1iZXIgb2YgZmllbGRzIHRvIHJlY29nbml6ZSB0aGlzCiAgICAgICAgIGFzIGEgdmFsaWQgbGluZSwgYWJvcnQgYW5kIGdvIGhvbWUgKi8KCiAgICAgIGlmKGNvLT5kb21haW4pCiAgICAgICAgZnJlZShjby0+ZG9tYWluKTsKICAgICAgaWYoY28tPnBhdGgpCiAgICAgICAgZnJlZShjby0+cGF0aCk7CiAgICAgIGlmKGNvLT5uYW1lKQogICAgICAgIGZyZWUoY28tPm5hbWUpOwogICAgICBpZihjby0+dmFsdWUpCiAgICAgICAgZnJlZShjby0+dmFsdWUpOwoKICAgICAgZnJlZShjbyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICB9CgogIGNvLT5saXZlY29va2llID0gYy0+cnVubmluZzsKCiAgLyogbm93LCB3ZSBoYXZlIHBhcnNlZCB0aGUgaW5jb21pbmcgbGluZSwgd2UgbXVzdCBub3cgY2hlY2sgaWYgdGhpcwogICAgIHN1cGVyY2VlZHMgYW4gYWxyZWFkeSBleGlzdGluZyBjb29raWUsIHdoaWNoIGl0IG1heSBpZiB0aGUgcHJldmlvdXMgaGF2ZQogICAgIHRoZSBzYW1lIGRvbWFpbiBhbmQgcGF0aCBhcyB0aGlzICovCgogIGNsaXN0ID0gYy0+Y29va2llczsKICByZXBsYWNlX29sZCA9IEZBTFNFOwogIHdoaWxlKGNsaXN0KSB7CiAgICBpZihzdHJlcXVhbChjbGlzdC0+bmFtZSwgY28tPm5hbWUpKSB7CiAgICAgIC8qIHRoZSBuYW1lcyBhcmUgaWRlbnRpY2FsICovCgogICAgICBpZihjbGlzdC0+ZG9tYWluICYmIGNvLT5kb21haW4pIHsKICAgICAgICBpZihzdHJlcXVhbChjbGlzdC0+ZG9tYWluLCBjby0+ZG9tYWluKSkKICAgICAgICAgIHJlcGxhY2Vfb2xkPVRSVUU7CiAgICAgIH0KICAgICAgZWxzZSBpZighY2xpc3QtPmRvbWFpbiAmJiAhY28tPmRvbWFpbikKICAgICAgICByZXBsYWNlX29sZCA9IFRSVUU7CgogICAgICBpZihyZXBsYWNlX29sZCkgewogICAgICAgIC8qIHRoZSBkb21haW5zIHdlcmUgaWRlbnRpY2FsICovCgogICAgICAgIGlmKGNsaXN0LT5wYXRoICYmIGNvLT5wYXRoKSB7CiAgICAgICAgICBpZihzdHJlcXVhbChjbGlzdC0+cGF0aCwgY28tPnBhdGgpKSB7CiAgICAgICAgICAgIHJlcGxhY2Vfb2xkID0gVFJVRTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgICAgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZighY2xpc3QtPnBhdGggJiYgIWNvLT5wYXRoKQogICAgICAgICAgcmVwbGFjZV9vbGQgPSBUUlVFOwogICAgICAgIGVsc2UKICAgICAgICAgIHJlcGxhY2Vfb2xkID0gRkFMU0U7CiAgICAgICAgCiAgICAgIH0KCiAgICAgIGlmKHJlcGxhY2Vfb2xkICYmICFjby0+bGl2ZWNvb2tpZSAmJiBjbGlzdC0+bGl2ZWNvb2tpZSkgewogICAgICAgIC8qIEJvdGggY29va2llcyBtYXRjaGVkIGZpbmUsIGV4Y2VwdCB0aGF0IHRoZSBhbHJlYWR5IHByZXNlbnQKICAgICAgICAgICBjb29raWUgaXMgImxpdmUiLCB3aGljaCBtZWFucyBpdCB3YXMgc2V0IGZyb20gYSBoZWFkZXIsIHdoaWxlCiAgICAgICAgICAgdGhlIG5ldyBvbmUgaXNuJ3QgImxpdmUiIGFuZCB0aHVzIG9ubHkgcmVhZCBmcm9tIGEgZmlsZS4gV2UgbGV0CiAgICAgICAgICAgbGl2ZSBjb29raWVzIHN0YXkgYWxpdmUgKi8KCiAgICAgICAgLyogRnJlZSB0aGUgbmV3Y29tZXIgYW5kIGdldCBvdXQgb2YgaGVyZSEgKi8KICAgICAgICBpZihjby0+ZG9tYWluKQogICAgICAgICAgZnJlZShjby0+ZG9tYWluKTsKICAgICAgICBpZihjby0+cGF0aCkKICAgICAgICAgIGZyZWUoY28tPnBhdGgpOwogICAgICAgIGlmKGNvLT5uYW1lKQogICAgICAgICAgZnJlZShjby0+bmFtZSk7CiAgICAgICAgaWYoY28tPnZhbHVlKQogICAgICAgICAgZnJlZShjby0+dmFsdWUpOwoKICAgICAgICBmcmVlKGNvKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgfQoKICAgICAgaWYocmVwbGFjZV9vbGQpIHsKICAgICAgICBjby0+bmV4dCA9IGNsaXN0LT5uZXh0OyAvKiBnZXQgdGhlIG5leHQtcG9pbnRlciBmaXJzdCAqLwoKICAgICAgICAvKiB0aGVuIGZyZWUgYWxsIHRoZSBvbGQgcG9pbnRlcnMgKi8KICAgICAgICBpZihjbGlzdC0+bmFtZSkKICAgICAgICAgIGZyZWUoY2xpc3QtPm5hbWUpOwogICAgICAgIGlmKGNsaXN0LT52YWx1ZSkKICAgICAgICAgIGZyZWUoY2xpc3QtPnZhbHVlKTsKICAgICAgICBpZihjbGlzdC0+ZG9tYWluKQogICAgICAgICAgZnJlZShjbGlzdC0+ZG9tYWluKTsKICAgICAgICBpZihjbGlzdC0+cGF0aCkKICAgICAgICAgIGZyZWUoY2xpc3QtPnBhdGgpOwogICAgICAgIGlmKGNsaXN0LT5leHBpcmVzdHIpCiAgICAgICAgICBmcmVlKGNsaXN0LT5leHBpcmVzdHIpOwoKICAgICAgICBpZihjbGlzdC0+dmVyc2lvbikKICAgICAgICAgIGZyZWUoY2xpc3QtPnZlcnNpb24pOwogICAgICAgIGlmKGNsaXN0LT5tYXhhZ2UpCiAgICAgICAgICBmcmVlKGNsaXN0LT5tYXhhZ2UpOwoKICAgICAgICAqY2xpc3QgPSAqY287ICAvKiB0aGVuIHN0b3JlIGFsbCB0aGUgbmV3IGRhdGEgKi8KCiAgICAgICAgZnJlZShjbyk7ICAgLyogZnJlZSB0aGUgbmV3bHkgYWxsb2NlZCBtZW1vcnkgKi8KICAgICAgICBjbyA9IGNsaXN0OyAvKiBwb2ludCB0byB0aGUgcHJldmlvdXMgc3RydWN0IGluc3RlYWQgKi8KCiAgICAgICAgLyogV2UgaGF2ZSByZXBsYWNlZCBhIGNvb2tpZSwgbm93IHNraXAgdGhlIHJlc3Qgb2YgdGhlIGxpc3QgYnV0CiAgICAgICAgICAgbWFrZSBzdXJlIHRoZSAnbGFzdGMnIHBvaW50ZXIgaXMgcHJvcGVybHkgc2V0ICovCiAgICAgICAgZG8gewogICAgICAgICAgbGFzdGMgPSBjbGlzdDsKICAgICAgICAgIGNsaXN0ID0gY2xpc3QtPm5leHQ7CiAgICAgICAgfSB3aGlsZShjbGlzdCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGxhc3RjID0gY2xpc3Q7CiAgICBjbGlzdCA9IGNsaXN0LT5uZXh0OwogIH0KCiAgaWYoIXJlcGxhY2Vfb2xkKSB7CiAgICAvKiB0aGVuIG1ha2UgdGhlIGxhc3QgaXRlbSBwb2ludCBvbiB0aGlzIG5ldyBvbmUgKi8KICAgIGlmKGxhc3RjKQogICAgICBsYXN0Yy0+bmV4dCA9IGNvOwogICAgZWxzZQogICAgICBjLT5jb29raWVzID0gY287CiAgfQoKICBjLT5udW1jb29raWVzKys7IC8qIG9uZSBtb3JlIGNvb2tpZSBpbiB0aGUgamFyICovCgogIHJldHVybiBjbzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2luaXQoKQogKgogKiBJbml0cyBhIGNvb2tpZSBzdHJ1Y3QgdG8gcmVhZCBkYXRhIGZyb20gYSBsb2NhbCBmaWxlLiBUaGlzIGlzIGFsd2F5cwogKiBjYWxsZWQgYmVmb3JlIGFueSBjb29raWVzIGFyZSBzZXQuIEZpbGUgbWF5IGJlIE5VTEwuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgQ29va2llSW5mbyAqQ3VybF9jb29raWVfaW5pdChjaGFyICpmaWxlLCBzdHJ1Y3QgQ29va2llSW5mbyAqaW5jKQp7CiAgY2hhciBsaW5lW01BWF9DT09LSUVfTElORV07CiAgc3RydWN0IENvb2tpZUluZm8gKmM7CiAgRklMRSAqZnA7CiAgYm9vbCBmcm9tZmlsZT1UUlVFOwogIAogIGlmKE5VTEwgPT0gaW5jKSB7CiAgICAvKiB3ZSBkaWRuJ3QgZ2V0IGEgc3RydWN0LCBjcmVhdGUgb25lICovCiAgICBjID0gKHN0cnVjdCBDb29raWVJbmZvICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgQ29va2llSW5mbykpOwogICAgaWYoIWMpCiAgICAgIHJldHVybiBOVUxMOyAvKiBmYWlsZWQgdG8gZ2V0IG1lbW9yeSAqLwogICAgbWVtc2V0KGMsIDAsIHNpemVvZihzdHJ1Y3QgQ29va2llSW5mbykpOwogICAgYy0+ZmlsZW5hbWUgPSBzdHJkdXAoZmlsZT9maWxlOiJub25lIik7IC8qIGNvcHkgdGhlIG5hbWUganVzdCBpbiBjYXNlICovCiAgfQogIGVsc2UgewogICAgLyogd2UgZ290IGFuIGFscmVhZHkgZXhpc3Rpbmcgb25lLCB1c2UgdGhhdCAqLwogICAgYyA9IGluYzsKICB9CiAgYy0+cnVubmluZyA9IEZBTFNFOyAvKiB0aGlzIGlzIG5vdCBydW5uaW5nLCB0aGlzIGlzIGluaXQgKi8KCiAgaWYoZmlsZSAmJiBzdHJlcXVhbChmaWxlLCAiLSIpKSB7CiAgICBmcCA9IHN0ZGluOwogICAgZnJvbWZpbGU9RkFMU0U7CiAgfQogIGVsc2UKICAgIGZwID0gZmlsZT9mb3BlbihmaWxlLCAiciIpOk5VTEw7CgogIGlmKGZwKSB7CiAgICBjaGFyICpsaW5lcHRyOwogICAgYm9vbCBoZWFkZXJsaW5lOwogICAgd2hpbGUoZmdldHMobGluZSwgTUFYX0NPT0tJRV9MSU5FLCBmcCkpIHsKICAgICAgaWYoc3RybmVxdWFsKCJTZXQtQ29va2llOiIsIGxpbmUsIDExKSkgewogICAgICAgIC8qIFRoaXMgaXMgYSBjb29raWUgbGluZSwgZ2V0IGl0ISAqLwogICAgICAgIGxpbmVwdHI9JmxpbmVbMTFdOwogICAgICAgIGhlYWRlcmxpbmU9VFJVRTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBsaW5lcHRyPWxpbmU7CiAgICAgICAgaGVhZGVybGluZT1GQUxTRTsKICAgICAgfQogICAgICB3aGlsZSgqbGluZXB0ciAmJiBpc3NwYWNlKChpbnQpKmxpbmVwdHIpKQogICAgICAgIGxpbmVwdHIrKzsKCiAgICAgIEN1cmxfY29va2llX2FkZChjLCBoZWFkZXJsaW5lLCBsaW5lcHRyLCBOVUxMKTsKICAgIH0KICAgIGlmKGZyb21maWxlKQogICAgICBmY2xvc2UoZnApOwogIH0KCiAgYy0+cnVubmluZyA9IFRSVUU7IC8qIG5vdywgd2UncmUgcnVubmluZyAqLwoKICByZXR1cm4gYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2dldGxpc3QoKQogKgogKiBGb3IgYSBnaXZlbiBob3N0IGFuZCBwYXRoLCByZXR1cm4gYSBsaW5rZWQgbGlzdCBvZiBjb29raWVzIHRoYXQgdGhlCiAqIGNsaWVudCBzaG91bGQgc2VuZCB0byB0aGUgc2VydmVyIGlmIHVzZWQgbm93LiBUaGUgc2VjdXJlIGJvb2xlYW4gaW5mb3JtcwogKiB0aGUgY29va2llIGlmIGEgc2VjdXJlIGNvbm5lY3Rpb24gaXMgYWNoaWV2ZWQgb3Igbm90LgogKgogKiBJdCBzaGFsbCBvbmx5IHJldHVybiBjb29raWVzIHRoYXQgaGF2ZW4ndCBleHBpcmVkLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0cnVjdCBDb29raWUgKkN1cmxfY29va2llX2dldGxpc3Qoc3RydWN0IENvb2tpZUluZm8gKmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqaG9zdCwgY2hhciAqcGF0aCwgYm9vbCBzZWN1cmUpCnsKICAgc3RydWN0IENvb2tpZSAqbmV3Y287CiAgIHN0cnVjdCBDb29raWUgKmNvOwogICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKICAgaW50IGhvc3RsZW49c3RybGVuKGhvc3QpOwogICBpbnQgZG9tbGVuOwoKICAgc3RydWN0IENvb2tpZSAqbWFpbmNvPU5VTEw7CgogICBpZighYyB8fCAhYy0+Y29va2llcykKICAgICAgcmV0dXJuIE5VTEw7IC8qIG5vIGNvb2tpZSBzdHJ1Y3Qgb3Igbm8gY29va2llcyBpbiB0aGUgc3RydWN0ICovCgogICBjbyA9IGMtPmNvb2tpZXM7CgogICB3aGlsZShjbykgewogICAgICAvKiBvbmx5IHByb2Nlc3MgdGhpcyBjb29raWUgaWYgaXQgaXMgbm90IGV4cGlyZWQgb3IgaGFkIG5vIGV4cGlyZQoJIGRhdGUgQU5EIHRoYXQgaWYgdGhlIGNvb2tpZSByZXF1aXJlcyB3ZSdyZSBzZWN1cmUgd2UgbXVzdCBvbmx5CgkgY29udGludWUgaWYgd2UgYXJlISAqLwogICAgIGlmKCAoY28tPmV4cGlyZXM8PTAgfHwgKGNvLT5leHBpcmVzPiBub3cpKSAmJgogICAgICAgICAoY28tPnNlY3VyZT9zZWN1cmU6VFJVRSkgKSB7CgoJIC8qIG5vdyBjaGVjayBpZiB0aGUgZG9tYWluIGlzIGNvcnJlY3QgKi8KCSBkb21sZW49Y28tPmRvbWFpbj9zdHJsZW4oY28tPmRvbWFpbik6MDsKCSBpZighY28tPmRvbWFpbiB8fAoJICAgICgoZG9tbGVuPD1ob3N0bGVuKSAmJgoJICAgICBzdHJlcXVhbChob3N0Kyhob3N0bGVuLWRvbWxlbiksIGNvLT5kb21haW4pKSApIHsKCSAgICAvKiB0aGUgcmlnaHQgcGFydCBvZiB0aGUgaG9zdCBtYXRjaGVzIHRoZSBkb21haW4gc3R1ZmYgaW4gdGhlCgkgICAgICAgY29va2llIGRhdGEgKi8KCgkgICAgLyogbm93IGNoZWNrIHRoZSBsZWZ0IHBhcnQgb2YgdGhlIHBhdGggd2l0aCB0aGUgY29va2llcyBwYXRoCgkgICAgICAgcmVxdWlyZW1lbnQgKi8KCSAgICBpZighY28tPnBhdGggfHwKCSAgICAgICBzdHJuZXF1YWwocGF0aCwgY28tPnBhdGgsIHN0cmxlbihjby0+cGF0aCkpKSB7CgoJICAgICAgIC8qIGFuZCBub3csIHdlIGtub3cgdGhpcyBpcyBhIG1hdGNoIGFuZCB3ZSBzaG91bGQgY3JlYXRlIGFuCgkJICBlbnRyeSBmb3IgdGhlIHJldHVybi1saW5rZWQtbGlzdCAqLwoKCSAgICAgICBuZXdjbyA9IChzdHJ1Y3QgQ29va2llICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgQ29va2llKSk7CgkgICAgICAgaWYobmV3Y28pIHsKCQkgIC8qIGZpcnN0LCBjb3B5IHRoZSB3aG9sZSBzb3VyY2UgY29va2llOiAqLwoJCSAgbWVtY3B5KG5ld2NvLCBjbywgc2l6ZW9mKHN0cnVjdCBDb29raWUpKTsKCgkJICAvKiB0aGVuIG1vZGlmeSBvdXIgbmV4dCAqLwoJCSAgbmV3Y28tPm5leHQgPSBtYWluY287CgoJCSAgLyogcG9pbnQgdGhlIG1haW4gdG8gdXMgKi8KCQkgIG1haW5jbyA9IG5ld2NvOwoJICAgICAgIH0KCSAgICB9CgkgfQogICAgICB9CiAgICAgIGNvID0gY28tPm5leHQ7CiAgIH0KCiAgIHJldHVybiBtYWluY287IC8qIHJldHVybiB0aGUgbmV3IGxpc3QgKi8KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9mcmVlbGlzdCgpCiAqCiAqIEZyZWUgYSBsaXN0IG9mIGNvb2tpZXMgcHJldmlvdXNseSByZXR1cm5lZCBieSBDdXJsX2Nvb2tpZV9nZXRsaXN0KCk7CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBDdXJsX2Nvb2tpZV9mcmVlbGlzdChzdHJ1Y3QgQ29va2llICpjbykKewogICBzdHJ1Y3QgQ29va2llICpuZXh0OwogICBpZihjbykgewogICAgICB3aGlsZShjbykgewoJIG5leHQgPSBjby0+bmV4dDsKCSBmcmVlKGNvKTsgLyogd2Ugb25seSBmcmVlIHRoZSBzdHJ1Y3Qgc2luY2UgdGhlICJtZW1iZXJzIiBhcmUgYWxsCgkJICAgICAganVzdCBjb3BpZWQhICovCgkgY28gPSBuZXh0OwogICAgICB9CiAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2NsZWFudXAoKQogKgogKiBGcmVlIGEgImNvb2tpZSBvYmplY3QiIHByZXZpb3VzIGNyZWF0ZWQgd2l0aCBjb29raWVfaW5pdCgpLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBDdXJsX2Nvb2tpZV9jbGVhbnVwKHN0cnVjdCBDb29raWVJbmZvICpjKQp7CiAgIHN0cnVjdCBDb29raWUgKmNvOwogICBzdHJ1Y3QgQ29va2llICpuZXh0OwogICBpZihjKSB7CiAgICAgIGlmKGMtPmZpbGVuYW1lKQoJIGZyZWUoYy0+ZmlsZW5hbWUpOwogICAgICBjbyA9IGMtPmNvb2tpZXM7CgogICAgICB3aGlsZShjbykgewoJIGlmKGNvLT5uYW1lKQoJICAgIGZyZWUoY28tPm5hbWUpOwoJIGlmKGNvLT52YWx1ZSkKCSAgICBmcmVlKGNvLT52YWx1ZSk7CgkgaWYoY28tPmRvbWFpbikKCSAgICBmcmVlKGNvLT5kb21haW4pOwoJIGlmKGNvLT5wYXRoKQoJICAgIGZyZWUoY28tPnBhdGgpOwoJIGlmKGNvLT5leHBpcmVzdHIpCgkgICAgZnJlZShjby0+ZXhwaXJlc3RyKTsKCgkgaWYoY28tPnZlcnNpb24pCgkgICAgZnJlZShjby0+dmVyc2lvbik7CgkgaWYoY28tPm1heGFnZSkKCSAgICBmcmVlKGNvLT5tYXhhZ2UpOwoKCSBuZXh0ID0gY28tPm5leHQ7CgkgZnJlZShjbyk7CgkgY28gPSBuZXh0OwogICAgICB9CiAgICAgIGZyZWUoYyk7IC8qIGZyZWUgdGhlIGJhc2Ugc3RydWN0IGFzIHdlbGwgKi8KICAgfQp9CgovKgogKiBDdXJsX2Nvb2tpZV9vdXRwdXQoKQogKgogKiBXcml0ZXMgYWxsIGludGVybmFsbHkga25vd24gY29va2llcyB0byB0aGUgc3BlY2lmaWVkIGZpbGUuIFNwZWNpZnkKICogIi0iIGFzIGZpbGUgbmFtZSB0byB3cml0ZSB0byBzdGRvdXQuCiAqCiAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIG9uIHdyaXRlIGZhaWx1cmUuCiAqLwppbnQgQ3VybF9jb29raWVfb3V0cHV0KHN0cnVjdCBDb29raWVJbmZvICpjLCBjaGFyICpkdW1waGVyZSkKewogIHN0cnVjdCBDb29raWUgKmNvOwogIEZJTEUgKm91dDsKICBib29sIHVzZV9zdGRvdXQ9RkFMU0U7CgogIGlmKChOVUxMID09IGMpIHx8ICgwID09IGMtPm51bWNvb2tpZXMpKQogICAgLyogSWYgdGhlcmUgYXJlIG5vIGtub3duIGNvb2tpZXMsIHdlIGRvbid0IHdyaXRlIG9yIGV2ZW4gY3JlYXRlIGFueQogICAgICAgZGVzdGluYXRpb24gZmlsZSAqLwogICAgcmV0dXJuIDA7CgogIGlmKHN0cmVxdWFsKCItIiwgZHVtcGhlcmUpKSB7CiAgICAvKiB1c2Ugc3Rkb3V0ICovCiAgICBvdXQgPSBzdGRvdXQ7CiAgICB1c2Vfc3Rkb3V0PVRSVUU7CiAgfQogIGVsc2UgewogICAgb3V0ID0gZm9wZW4oZHVtcGhlcmUsICJ3Iik7CiAgICBpZighb3V0KQogICAgICByZXR1cm4gMTsgLyogZmFpbHVyZSAqLwogIH0KCiAgaWYoYykgewogICAgZnB1dHMoIiMgTmV0c2NhcGUgSFRUUCBDb29raWUgRmlsZVxuIgogICAgICAgICAgIiMgaHR0cDovL3d3dy5uZXRzY2FwZS5jb20vbmV3c3JlZi9zdGQvY29va2llX3NwZWMuaHRtbFxuIgogICAgICAgICAgIiMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgbGliY3VybCEgRWRpdCBhdCB5b3VyIG93biByaXNrLlxuXG4iLAogICAgICAgICAgb3V0KTsKICAgIGNvID0gYy0+Y29va2llczsKICAgICAKICAgIHdoaWxlKGNvKSB7CiAgICAgIGZwcmludGYob3V0LAogICAgICAgICAgICAgICIlc1x0IiAvKiBkb21haW4gKi8KICAgICAgICAgICAgICAiJXNcdCIgLyogZmllbGQxICovCiAgICAgICAgICAgICAgIiVzXHQiIC8qIHBhdGggKi8KICAgICAgICAgICAgICAiJXNcdCIgLyogc2VjdXJlICovCiAgICAgICAgICAgICAgIiV1XHQiIC8qIGV4cGlyZXMgKi8KICAgICAgICAgICAgICAiJXNcdCIgLyogbmFtZSAqLwogICAgICAgICAgICAgICIlc1xuIiwgLyogdmFsdWUgKi8KICAgICAgICAgICAgICBjby0+ZG9tYWluP2NvLT5kb21haW46InVua25vd24iLAogICAgICAgICAgICAgIGNvLT5maWVsZDE9PTI/IlRSVUUiOiJGQUxTRSIsCiAgICAgICAgICAgICAgY28tPnBhdGg/Y28tPnBhdGg6Ii8iLAogICAgICAgICAgICAgIGNvLT5zZWN1cmU/IlRSVUUiOiJGQUxTRSIsCiAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljby0+ZXhwaXJlcywKICAgICAgICAgICAgICBjby0+bmFtZSwKICAgICAgICAgICAgICBjby0+dmFsdWU/Y28tPnZhbHVlOiIiKTsKCiAgICAgIGNvPWNvLT5uZXh0OwogICAgfQogIH0KCiAgaWYoIXVzZV9zdGRvdXQpCiAgICBmY2xvc2Uob3V0KTsKCiAgcmV0dXJuIDA7Cn0KCiNpZmRlZiBDVVJMX0NPT0tJRV9ERUJVRwoKLyoKICogT24gbXkgU29sYXJpcyBib3gsIHRoaXMgY29tbWFuZCBsaW5lIGJ1aWxkcyB0aGlzIHRlc3QgcHJvZ3JhbToKICoKICogZ2NjIC1nIC1vIGNvb2t0ZXN0IC1EQ1VSTF9DT09LSUVfREVCVUcgLURIQVZFX0NPTkZJR19IIC1JLi4gLUkuLi9pbmNsdWRlIGNvb2tpZS5jIHN0cmVxdWFsLm8gZ2V0ZGF0ZS5vIG1lbWRlYnVnLm8gbXByaW50Zi5vIHN0cnRvay5vIC1sbnNsIC1sc29ja2V0CiAqCiAqLwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgc3RydWN0IENvb2tpZUluZm8gKmM9TlVMTDsKICBpZihhcmdjPjEpIHsKICAgIGMgPSBDdXJsX2Nvb2tpZV9pbml0KGFyZ3ZbMV0sIGMpOwogICAgQ3VybF9jb29raWVfYWRkKGMsIFRSVUUsICJQRVJTT05BTElaRT1ub25lO2V4cGlyZXM9TW9uZGF5LCAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7IGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS9mdGd3OyBzZWN1cmUiKTsKICAgIEN1cmxfY29va2llX2FkZChjLCBUUlVFLCAiZm9vYmFyPXllczsgZG9tYWluPS5oYXh4LnNlOyBwYXRoPS9sb29zZXI7Iik7CiAgICBjID0gQ3VybF9jb29raWVfaW5pdChhcmd2WzFdLCBjKTsKCiAgICBDdXJsX2Nvb2tpZV9vdXRwdXQoYyk7CiAgICBDdXJsX2Nvb2tpZV9jbGVhbnVwKGMpOwogICAgcmV0dXJuIDA7CiAgfQogIHJldHVybiAxOwp9CgojZW5kaWYKCi8qCiAqIGxvY2FsIHZhcmlhYmxlczoKICogZXZhbDogKGxvYWQtZmlsZSAiLi4vY3VybC1tb2RlLmVsIikKICogZW5kOgogKiB2aW02MDA6IGZkbT1tYXJrZXIKICogdmltOiBldCBzdz0yIHRzPTIgc3RzPTIgdHc9NzgKICovCg==