LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogKiAgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgIF9fX3wgfCB8IHwgIF8gXHwgfCAgICAKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gX198IHwgfCB8IHxfKSB8IHwgICAgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICoKICogQ29weXJpZ2h0IChDKSAyMDAxLCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogKgogKiBJbiBvcmRlciB0byBiZSB1c2VmdWwgZm9yIGV2ZXJ5IHBvdGVudGlhbCB1c2VyLCBjdXJsIGFuZCBsaWJjdXJsIGFyZQogKiBkdWFsLWxpY2Vuc2VkIHVuZGVyIHRoZSBNUEwgYW5kIHRoZSBNSVQvWC1kZXJpdmF0ZSBsaWNlbnNlcy4KICoKICogWW91IG1heSBvcHQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlIGFuZC9vciBzZWxsCiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwogKiBmdXJuaXNoZWQgdG8gZG8gc28sIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMIG9yIHRoZSBNSVQvWC1kZXJpdmF0ZQogKiBsaWNlbnNlcy4gWW91IG1heSBwaWNrIG9uZSBvZiB0aGVzZSBsaWNlbnNlcy4KICoKICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQogKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKgogKiAkSWQkCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioKCgpSRUNFSVZJTkcgQ09PS0lFIElORk9STUFUSU9OCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0cnVjdCBDb29raWVJbmZvICpjb29raWVfaW5pdChjaGFyICpmaWxlKTsKCQoJSW5pdHMgYSBjb29raWUgc3RydWN0IHRvIHN0b3JlIGRhdGEgaW4gYSBsb2NhbCBmaWxlLiBUaGlzIGlzIGFsd2F5cwoJY2FsbGVkIGJlZm9yZSBhbnkgY29va2llcyBhcmUgc2V0LgoKaW50IGNvb2tpZXNfc2V0KHN0cnVjdCBDb29raWVJbmZvICpjb29raWUsIGNoYXIgKmNvb2tpZV9saW5lKTsKCglUaGUgJ2Nvb2tpZV9saW5lJyBwYXJhbWV0ZXIgaXMgYSBmdWxsICJTZXQtY29va2llOiIgbGluZSBhcwoJcmVjZWl2ZWQgZnJvbSBhIHNlcnZlci4KCglUaGUgZnVuY3Rpb24gbmVlZCB0byByZXBsYWNlIHByZXZpb3VzbHkgc3RvcmVkIGxpbmVzIHRoYXQgdGhpcyBuZXcKCWxpbmUgc3VwZXJjZWVkcy4KCglJdCBtYXkgcmVtb3ZlIGxpbmVzIHRoYXQgYXJlIGV4cGlyZWQuCgoJSXQgc2hvdWxkIHJldHVybiBhbiBpbmRpY2F0aW9uIG9mIHN1Y2Nlc3MvZXJyb3IuCgoKU0VORElORyBDT09LSUUgSU5GT1JNQVRJT04KPT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0cnVjdCBDb29raWVzICpjb29raWVfZ2V0bGlzdChzdHJ1Y3QgQ29va2llSW5mbyAqY29va2llLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqaG9zdCwgY2hhciAqcGF0aCwgYm9vbCBzZWN1cmUpOwoKCUZvciBhIGdpdmVuIGhvc3QgYW5kIHBhdGgsIHJldHVybiBhIGxpbmtlZCBsaXN0IG9mIGNvb2tpZXMgdGhhdAoJdGhlIGNsaWVudCBzaG91bGQgc2VuZCB0byB0aGUgc2VydmVyIGlmIHVzZWQgbm93LiBUaGUgc2VjdXJlCglib29sZWFuIGluZm9ybXMgdGhlIGNvb2tpZSBpZiBhIHNlY3VyZSBjb25uZWN0aW9uIGlzIGFjaGlldmVkIG9yCglub3QuCgoJSXQgc2hhbGwgb25seSByZXR1cm4gY29va2llcyB0aGF0IGhhdmVuJ3QgZXhwaXJlZC4KCiAgICAKRXhhbXBsZSBzZXQgb2YgY29va2llczoKICAgIAogICAgU2V0LWNvb2tpZTogUFJPRFVDVElORk89d2VieHByZXNzOyBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6IFBFUlNPTkFMSVpFPW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS9mdGd3OyBzZWN1cmUKICAgIFNldC1jb29raWU6IEZpZEhpc3Q9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWRPcmRlcj1ub25lO2V4cGlyZXM9TW9uZGF5LCAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7CiAgICBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6IERpc1BlbmQ9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWREaXM9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOgogICAgU2Vzc2lvbl9LZXlANjc5MWE5ZTAtOTAxYS0xMWQwLWExYzgtOWIwMTJjODhhYTc3PW5vbmU7ZXhwaXJlcz1Nb25kYXksCiAgICAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7IGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQoqKioqLwoKI2luY2x1ZGUgInNldHVwLmgiCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgojaW5jbHVkZSAiY29va2llLmgiCiNpbmNsdWRlICJnZXRkYXRlLmgiCiNpbmNsdWRlICJzdHJlcXVhbC5oIgojaW5jbHVkZSAic3RydG9rLmgiCgovKiBUaGUgbGFzdCAjaW5jbHVkZSBmaWxlIHNob3VsZCBiZTogKi8KI2lmZGVmIE1BTExPQ0RFQlVHCiNpbmNsdWRlICJtZW1kZWJ1Zy5oIgojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2FkZCgpCiAqCiAqIEFkZCBhIHNpbmdsZSBjb29raWUgbGluZSB0byB0aGUgY29va2llIGtlZXBpbmcgb2JqZWN0LgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RydWN0IENvb2tpZSAqCkN1cmxfY29va2llX2FkZChzdHJ1Y3QgQ29va2llSW5mbyAqYywKICAgICAgICAgICAgICAgIGJvb2wgaHR0cGhlYWRlciwgLyogVFJVRSBpZiBIVFRQIGhlYWRlci1zdHlsZSBsaW5lICovCiAgICAgICAgICAgICAgICBjaGFyICpsaW5lcHRyKSAvKiBmaXJzdCBub24tc3BhY2Ugb2YgdGhlIGxpbmUgKi8KewogIHN0cnVjdCBDb29raWUgKmNsaXN0OwogIGNoYXIgd2hhdFtNQVhfQ09PS0lFX0xJTkVdOwogIGNoYXIgbmFtZVtNQVhfTkFNRV07CiAgY2hhciAqcHRyOwogIGNoYXIgKnNlbWlwdHI7CiAgc3RydWN0IENvb2tpZSAqY287CiAgc3RydWN0IENvb2tpZSAqbGFzdGM9TlVMTDsKICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKICBib29sIHJlcGxhY2Vfb2xkID0gRkFMU0U7CgogIC8qIEZpcnN0LCBhbGxvYyBhbmQgaW5pdCBhIG5ldyBzdHJ1Y3QgZm9yIGl0ICovCiAgY28gPSAoc3RydWN0IENvb2tpZSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IENvb2tpZSkpOwogIGlmKCFjbykKICAgIHJldHVybiBOVUxMOyAvKiBiYWlsIG91dCBpZiB3ZSdyZSB0aGlzIGxvdyBvbiBtZW1vcnkgKi8KCiAgLyogY2xlYXIgdGhlIHdob2xlIHN0cnVjdCBmaXJzdCAqLwogIG1lbXNldChjbywgMCwgc2l6ZW9mKHN0cnVjdCBDb29raWUpKTsKCSAgICAKICBpZihodHRwaGVhZGVyKSB7CiAgICAvKiBUaGlzIGxpbmUgd2FzIHJlYWQgb2ZmIGEgSFRUUC1oZWFkZXIgKi8KCiAgICBzZW1pcHRyPXN0cmNocihsaW5lcHRyLCAnOycpOyAvKiBmaXJzdCwgZmluZCBhIHNlbWljb2xvbiAqLwogICAgcHRyID0gbGluZXB0cjsKICAgIGRvIHsKICAgICAgLyogd2UgaGF2ZSBhIDx3aGF0Pj08dGhpcz4gcGFpciBvciBhICdzZWN1cmUnIHdvcmQgaGVyZSAqLwogICAgICBpZihzdHJjaHIocHRyLCAnPScpKSB7CiAgICAgICAgbmFtZVswXT13aGF0WzBdPTA7IC8qIGluaXQgdGhlIGJ1ZmZlcnMgKi8KICAgICAgICBpZigxIDw9IHNzY2FuZihwdHIsICIlIiBNQVhfTkFNRV9UWFQgIltePV09JSIKICAgICAgICAgICAgICAgICAgICAgICBNQVhfQ09PS0lFX0xJTkVfVFhUICJbXjtcclxuXSIsCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgd2hhdCkpIHsKICAgICAgICAgIC8qIHRoaXMgaXMgYSBsZWdhbCA8d2hhdD49PHRoaXM+IHBhaXIgKi8KICAgICAgICAgIGlmKHN0cmVxdWFsKCJwYXRoIiwgbmFtZSkpIHsKICAgICAgICAgICAgY28tPnBhdGg9c3RyZHVwKHdoYXQpOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZihzdHJlcXVhbCgiZG9tYWluIiwgbmFtZSkpIHsKICAgICAgICAgICAgY28tPmRvbWFpbj1zdHJkdXAod2hhdCk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmKHN0cmVxdWFsKCJ2ZXJzaW9uIiwgbmFtZSkpIHsKICAgICAgICAgICAgY28tPnZlcnNpb249c3RyZHVwKHdoYXQpOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZihzdHJlcXVhbCgibWF4LWFnZSIsIG5hbWUpKSB7CiAgICAgICAgICAgIC8qIERlZmluZWQgaW4gUkZDMjEwOToKCiAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgVGhlIE1heC1BZ2UgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxpZmV0aW1lIG9mIHRoZQogICAgICAgICAgICAgICBjb29raWUsIGluIHNlY29uZHMuICBUaGUgZGVsdGEtc2Vjb25kcyB2YWx1ZSBpcyBhIGRlY2ltYWwgbm9uLQogICAgICAgICAgICAgICBuZWdhdGl2ZSBpbnRlZ2VyLiAgQWZ0ZXIgZGVsdGEtc2Vjb25kcyBzZWNvbmRzIGVsYXBzZSwgdGhlCiAgICAgICAgICAgICAgIGNsaWVudCBzaG91bGQgZGlzY2FyZCB0aGUgY29va2llLiAgQSB2YWx1ZSBvZiB6ZXJvIG1lYW5zIHRoZQogICAgICAgICAgICAgICBjb29raWUgc2hvdWxkIGJlIGRpc2NhcmRlZCBpbW1lZGlhdGVseS4KCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjby0+bWF4YWdlID0gc3RyZHVwKHdoYXQpOwogICAgICAgICAgICBjby0+ZXhwaXJlcyA9CiAgICAgICAgICAgICAgYXRvaSgoKmNvLT5tYXhhZ2U9PSdcIicpPyZjby0+bWF4YWdlWzFdOiZjby0+bWF4YWdlWzBdKTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYoc3RyZXF1YWwoImV4cGlyZXMiLCBuYW1lKSkgewogICAgICAgICAgICBjby0+ZXhwaXJlc3RyPXN0cmR1cCh3aGF0KTsKICAgICAgICAgICAgY28tPmV4cGlyZXMgPSBjdXJsX2dldGRhdGUod2hhdCwgJm5vdyk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmKCFjby0+bmFtZSkgewogICAgICAgICAgICBjby0+bmFtZSA9IHN0cmR1cChuYW1lKTsKICAgICAgICAgICAgY28tPnZhbHVlID0gc3RyZHVwKHdoYXQpOwogICAgICAgICAgfQogICAgICAgICAgLyoKICAgICAgICAgICAgZWxzZSB0aGlzIGlzIHRoZSBzZWNvbmQgKG9yIG1vcmUpIG5hbWUgd2UgZG9uJ3Qga25vdwogICAgICAgICAgICBhYm91dCEgKi8KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAvKiB0aGlzIGlzIGFuICJpbGxlZ2FsIiA8d2hhdD49PHRoaXM+IHBhaXIgKi8KICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgaWYoc3NjYW5mKHB0ciwgIiUiIE1BWF9DT09LSUVfTElORV9UWFQgIlteO1xyXG5dIiwKICAgICAgICAgICAgICAgICAgd2hhdCkpIHsKICAgICAgICAgIGlmKHN0cmVxdWFsKCJzZWN1cmUiLCB3aGF0KSkKICAgICAgICAgICAgY28tPnNlY3VyZSA9IFRSVUU7CiAgICAgICAgICAvKiBlbHNlLAogICAgICAgICAgICAgdW5zdXBwb3J0ZWQga2V5d29yZCB3aXRob3V0IGFzc2lnbiEgKi8KCiAgICAgICAgfQogICAgICB9CiAgICAgIGlmKCFzZW1pcHRyKQogICAgICAgIGNvbnRpbnVlOyAvKiB3ZSBhbHJlYWR5IGtub3cgdGhlcmUgYXJlIG5vIG1vcmUgY29va2llcyAqLwoKICAgICAgcHRyPXNlbWlwdHIrMTsKICAgICAgd2hpbGUocHRyICYmICpwdHIgJiYgaXNzcGFjZSgoaW50KSpwdHIpKQogICAgICAgIHB0cisrOwogICAgICBzZW1pcHRyPXN0cmNocihwdHIsICc7Jyk7IC8qIG5vdywgZmluZCB0aGUgbmV4dCBzZW1pY29sb24gKi8KICAgIH0gd2hpbGUoc2VtaXB0cik7CiAgfQogIGVsc2UgewogICAgLyogVGhpcyBsaW5lIGlzIE5PVCBhIEhUVFAgaGVhZGVyIHN0eWxlIGxpbmUsIHdlIGRvIG9mZmVyIHN1cHBvcnQgZm9yCiAgICAgICByZWFkaW5nIHRoZSBvZGQgbmV0c2NhcGUgY29va2llcy1maWxlIGZvcm1hdCBoZXJlICovCiAgICBjaGFyICpmaXJzdHB0cjsKICAgIGNoYXIgKnRva19idWY7CiAgICBpbnQgZmllbGRzOwoKICAgIGlmKGxpbmVwdHJbMF09PScjJykgewogICAgICAvKiBkb24ndCBldmVuIHRyeSB0aGUgY29tbWVudHMgKi8KICAgICAgZnJlZShjbyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgLyogc3RyaXAgb2ZmIHRoZSBwb3NzaWJsZSBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzICovCiAgICBwdHI9c3RyY2hyKGxpbmVwdHIsICdccicpOwogICAgaWYocHRyKQogICAgICAqcHRyPTA7IC8qIGNsZWFyIGl0ICovCiAgICBwdHI9c3RyY2hyKGxpbmVwdHIsICdcbicpOwogICAgaWYocHRyKQogICAgICAqcHRyPTA7IC8qIGNsZWFyIGl0ICovCgogICAgZmlyc3RwdHI9c3RydG9rX3IobGluZXB0ciwgIlx0IiwgJnRva19idWYpOyAvKiBmaXJzdCB0b2tlbml6ZSBpdCBvbiB0aGUgVEFCICovCgogICAgLyogSGVyZSdzIGEgcXVpY2sgY2hlY2sgdG8gZWxpbWluYXRlIG5vcm1hbCBIVFRQLWhlYWRlcnMgZnJvbSB0aGlzICovCiAgICBpZighZmlyc3RwdHIgfHwgc3RyY2hyKGZpcnN0cHRyLCAnOicpKSB7CiAgICAgIGZyZWUoY28pOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICAvKiBOb3cgbG9vcCB0aHJvdWdoIHRoZSBmaWVsZHMgYW5kIGluaXQgdGhlIHN0cnVjdCB3ZSBhbHJlYWR5IGhhdmUKICAgICAgIGFsbG9jYXRlZCAqLwogICAgZm9yKHB0cj1maXJzdHB0ciwgZmllbGRzPTA7IHB0cjsgcHRyPXN0cnRva19yKE5VTEwsICJcdCIsICZ0b2tfYnVmKSwgZmllbGRzKyspIHsKICAgICAgc3dpdGNoKGZpZWxkcykgewogICAgICBjYXNlIDA6CiAgICAgICAgY28tPmRvbWFpbiA9IHN0cmR1cChwdHIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDE6CiAgICAgICAgLyogVGhpcyBmaWVsZCBnb3QgaXRzIGV4cGxhbmF0aW9uIG9uIHRoZSAyM3JkIG9mIE1heSAyMDAxIGJ5CiAgICAgICAgICAgQW5kculzIEdhcmPtYToKCiAgICAgICAgICAgZmxhZzogQSBUUlVFL0ZBTFNFIHZhbHVlIGluZGljYXRpbmcgaWYgYWxsIG1hY2hpbmVzIHdpdGhpbiBhIGdpdmVuCiAgICAgICAgICAgZG9tYWluIGNhbiBhY2Nlc3MgdGhlIHZhcmlhYmxlLiBUaGlzIHZhbHVlIGlzIHNldCBhdXRvbWF0aWNhbGx5IGJ5CiAgICAgICAgICAgdGhlIGJyb3dzZXIsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgeW91IHNldCBmb3IgdGhlIGRvbWFpbi4KCiAgICAgICAgICAgQXMgZmFyIGFzIEkgY2FuIHNlZSwgaXQgaXMgc2V0IHRvIHRydWUgd2hlbiB0aGUgY29va2llIHNheXMKICAgICAgICAgICAuZG9tYWluLmNvbSBhbmQgdG8gZmFsc2Ugd2hlbiB0aGUgZG9tYWluIGlzIGNvbXBsZXRlIHd3dy5kb21haW4uY29tCgogICAgICAgICAgIFdlIGRvbid0IGN1cnJlbnRseSB0YWtlIGFkdmFudGFnZSBvZiB0aGlzIGtub3dsZWRnZS4KICAgICAgICAqLwogICAgICAgIGNvLT5maWVsZDE9c3RyZXF1YWwocHRyLCAiVFJVRSIpKzE7IC8qIHN0b3JlIGluZm9ybWF0aW9uICovCiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICAvKiBJdCB0dXJucyBvdXQsIHRoYXQgc29tZXRpbWVzIHRoZSBmaWxlIGZvcm1hdCBhbGxvd3MgdGhlIHBhdGgKICAgICAgICAgICBmaWVsZCB0byByZW1haW4gbm90IGZpbGxlZCBpbiwgd2UgdHJ5IHRvIGRldGVjdCB0aGlzIGFuZCB3b3JrCiAgICAgICAgICAgYXJvdW5kIGl0ISBBbmRy6XMgR2FyY+1hIG1hZGUgdXMgYXdhcmUgb2YgdGhpcy4uLiAqLwogICAgICAgIGlmIChzdHJjbXAoIlRSVUUiLCBwdHIpICYmIHN0cmNtcCgiRkFMU0UiLCBwdHIpKSB7CiAgICAgICAgICAvKiBvbmx5IGlmIHRoZSBwYXRoIGRvZXNuJ3QgbG9vayBsaWtlIGEgYm9vbGVhbiBvcHRpb24hICovCiAgICAgICAgICBjby0+cGF0aCA9IHN0cmR1cChwdHIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qIHRoaXMgZG9lc24ndCBsb29rIGxpa2UgYSBwYXRoLCBtYWtlIG9uZSB1cCEgKi8KICAgICAgICBjby0+cGF0aCA9IHN0cmR1cCgiLyIpOwogICAgICAgIGZpZWxkcysrOyAvKiBhZGQgYSBmaWVsZCBhbmQgZmFsbCBkb3duIHRvIHNlY3VyZSAqLwogICAgICAgIC8qIEZBTExUSFJPVUdIICovCiAgICAgIGNhc2UgMzoKICAgICAgICBjby0+c2VjdXJlID0gc3RyZXF1YWwocHRyLCAiVFJVRSIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDQ6CiAgICAgICAgY28tPmV4cGlyZXMgPSBhdG9pKHB0cik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNToKICAgICAgICBjby0+bmFtZSA9IHN0cmR1cChwdHIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDY6CiAgICAgICAgY28tPnZhbHVlID0gc3RyZHVwKHB0cik7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZig3ICE9IGZpZWxkcykgewogICAgICAvKiB3ZSBkaWQgbm90IGZpbmQgdGhlIHN1ZmZpY2llbnQgbnVtYmVyIG9mIGZpZWxkcyB0byByZWNvZ25pemUgdGhpcwogICAgICAgICBhcyBhIHZhbGlkIGxpbmUsIGFib3J0IGFuZCBnbyBob21lICovCgogICAgICBpZihjby0+ZG9tYWluKQogICAgICAgIGZyZWUoY28tPmRvbWFpbik7CiAgICAgIGlmKGNvLT5wYXRoKQogICAgICAgIGZyZWUoY28tPnBhdGgpOwogICAgICBpZihjby0+bmFtZSkKICAgICAgICBmcmVlKGNvLT5uYW1lKTsKICAgICAgaWYoY28tPnZhbHVlKQogICAgICAgIGZyZWUoY28tPnZhbHVlKTsKCiAgICAgIGZyZWUoY28pOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgfQoKICBjby0+bGl2ZWNvb2tpZSA9IGMtPnJ1bm5pbmc7CgogIC8qIG5vdywgd2UgaGF2ZSBwYXJzZWQgdGhlIGluY29taW5nIGxpbmUsIHdlIG11c3Qgbm93IGNoZWNrIGlmIHRoaXMKICAgICBzdXBlcmNlZWRzIGFuIGFscmVhZHkgZXhpc3RpbmcgY29va2llLCB3aGljaCBpdCBtYXkgaWYgdGhlIHByZXZpb3VzIGhhdmUKICAgICB0aGUgc2FtZSBkb21haW4gYW5kIHBhdGggYXMgdGhpcyAqLwoKICBjbGlzdCA9IGMtPmNvb2tpZXM7CiAgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICB3aGlsZShjbGlzdCkgewogICAgaWYoc3RyZXF1YWwoY2xpc3QtPm5hbWUsIGNvLT5uYW1lKSkgewogICAgICAvKiB0aGUgbmFtZXMgYXJlIGlkZW50aWNhbCAqLwoKICAgICAgaWYoY2xpc3QtPmRvbWFpbiAmJiBjby0+ZG9tYWluKSB7CiAgICAgICAgaWYoc3RyZXF1YWwoY2xpc3QtPmRvbWFpbiwgY28tPmRvbWFpbikpCiAgICAgICAgICByZXBsYWNlX29sZD1UUlVFOwogICAgICB9CiAgICAgIGVsc2UgaWYoIWNsaXN0LT5kb21haW4gJiYgIWNvLT5kb21haW4pCiAgICAgICAgcmVwbGFjZV9vbGQgPSBUUlVFOwoKICAgICAgaWYocmVwbGFjZV9vbGQpIHsKICAgICAgICAvKiB0aGUgZG9tYWlucyB3ZXJlIGlkZW50aWNhbCAqLwoKICAgICAgICBpZihjbGlzdC0+cGF0aCAmJiBjby0+cGF0aCkgewogICAgICAgICAgaWYoc3RyZXF1YWwoY2xpc3QtPnBhdGgsIGNvLT5wYXRoKSkgewogICAgICAgICAgICByZXBsYWNlX29sZCA9IFRSVUU7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHJlcGxhY2Vfb2xkID0gRkFMU0U7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoIWNsaXN0LT5wYXRoICYmICFjby0+cGF0aCkKICAgICAgICAgIHJlcGxhY2Vfb2xkID0gVFJVRTsKICAgICAgICBlbHNlCiAgICAgICAgICByZXBsYWNlX29sZCA9IEZBTFNFOwogICAgICAgIAogICAgICB9CgogICAgICBpZihyZXBsYWNlX29sZCAmJiAhY28tPmxpdmVjb29raWUgJiYgY2xpc3QtPmxpdmVjb29raWUpIHsKICAgICAgICAvKiBCb3RoIGNvb2tpZXMgbWF0Y2hlZCBmaW5lLCBleGNlcHQgdGhhdCB0aGUgYWxyZWFkeSBwcmVzZW50CiAgICAgICAgICAgY29va2llIGlzICJsaXZlIiwgd2hpY2ggbWVhbnMgaXQgd2FzIHNldCBmcm9tIGEgaGVhZGVyLCB3aGlsZQogICAgICAgICAgIHRoZSBuZXcgb25lIGlzbid0ICJsaXZlIiBhbmQgdGh1cyBvbmx5IHJlYWQgZnJvbSBhIGZpbGUuIFdlIGxldAogICAgICAgICAgIGxpdmUgY29va2llcyBzdGF5IGFsaXZlICovCgogICAgICAgIC8qIEZyZWUgdGhlIG5ld2NvbWVyIGFuZCBnZXQgb3V0IG9mIGhlcmUhICovCiAgICAgICAgaWYoY28tPmRvbWFpbikKICAgICAgICAgIGZyZWUoY28tPmRvbWFpbik7CiAgICAgICAgaWYoY28tPnBhdGgpCiAgICAgICAgICBmcmVlKGNvLT5wYXRoKTsKICAgICAgICBpZihjby0+bmFtZSkKICAgICAgICAgIGZyZWUoY28tPm5hbWUpOwogICAgICAgIGlmKGNvLT52YWx1ZSkKICAgICAgICAgIGZyZWUoY28tPnZhbHVlKTsKCiAgICAgICAgZnJlZShjbyk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgIH0KCiAgICAgIGlmKHJlcGxhY2Vfb2xkKSB7CiAgICAgICAgY28tPm5leHQgPSBjbGlzdC0+bmV4dDsgLyogZ2V0IHRoZSBuZXh0LXBvaW50ZXIgZmlyc3QgKi8KCiAgICAgICAgLyogdGhlbiBmcmVlIGFsbCB0aGUgb2xkIHBvaW50ZXJzICovCiAgICAgICAgaWYoY2xpc3QtPm5hbWUpCiAgICAgICAgICBmcmVlKGNsaXN0LT5uYW1lKTsKICAgICAgICBpZihjbGlzdC0+dmFsdWUpCiAgICAgICAgICBmcmVlKGNsaXN0LT52YWx1ZSk7CiAgICAgICAgaWYoY2xpc3QtPmRvbWFpbikKICAgICAgICAgIGZyZWUoY2xpc3QtPmRvbWFpbik7CiAgICAgICAgaWYoY2xpc3QtPnBhdGgpCiAgICAgICAgICBmcmVlKGNsaXN0LT5wYXRoKTsKICAgICAgICBpZihjbGlzdC0+ZXhwaXJlc3RyKQogICAgICAgICAgZnJlZShjbGlzdC0+ZXhwaXJlc3RyKTsKCiAgICAgICAgaWYoY2xpc3QtPnZlcnNpb24pCiAgICAgICAgICBmcmVlKGNsaXN0LT52ZXJzaW9uKTsKICAgICAgICBpZihjbGlzdC0+bWF4YWdlKQogICAgICAgICAgZnJlZShjbGlzdC0+bWF4YWdlKTsKCiAgICAgICAgKmNsaXN0ID0gKmNvOyAgLyogdGhlbiBzdG9yZSBhbGwgdGhlIG5ldyBkYXRhICovCiAgICAgIH0KCiAgICB9CiAgICBsYXN0YyA9IGNsaXN0OwogICAgY2xpc3QgPSBjbGlzdC0+bmV4dDsKICB9CgogIGlmKCFyZXBsYWNlX29sZCkgewogICAgLyogdGhlbiBtYWtlIHRoZSBsYXN0IGl0ZW0gcG9pbnQgb24gdGhpcyBuZXcgb25lICovCiAgICBpZihsYXN0YykKICAgICAgbGFzdGMtPm5leHQgPSBjbzsKICAgIGVsc2UKICAgICAgYy0+Y29va2llcyA9IGNvOwogIH0KCiAgYy0+bnVtY29va2llcysrOyAvKiBvbmUgbW9yZSBjb29raWUgaW4gdGhlIGphciAqLwoKICByZXR1cm4gY287Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9pbml0KCkKICoKICogSW5pdHMgYSBjb29raWUgc3RydWN0IHRvIHJlYWQgZGF0YSBmcm9tIGEgbG9jYWwgZmlsZS4gVGhpcyBpcyBhbHdheXMKICogY2FsbGVkIGJlZm9yZSBhbnkgY29va2llcyBhcmUgc2V0LiBGaWxlIG1heSBiZSBOVUxMLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IENvb2tpZUluZm8gKkN1cmxfY29va2llX2luaXQoY2hhciAqZmlsZSwgc3RydWN0IENvb2tpZUluZm8gKmluYykKewogIGNoYXIgbGluZVtNQVhfQ09PS0lFX0xJTkVdOwogIHN0cnVjdCBDb29raWVJbmZvICpjOwogIEZJTEUgKmZwOwogIGJvb2wgZnJvbWZpbGU9VFJVRTsKICAKICBpZihOVUxMID09IGluYykgewogICAgLyogd2UgZGlkbid0IGdldCBhIHN0cnVjdCwgY3JlYXRlIG9uZSAqLwogICAgYyA9IChzdHJ1Y3QgQ29va2llSW5mbyAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IENvb2tpZUluZm8pKTsKICAgIGlmKCFjKQogICAgICByZXR1cm4gTlVMTDsgLyogZmFpbGVkIHRvIGdldCBtZW1vcnkgKi8KICAgIG1lbXNldChjLCAwLCBzaXplb2Yoc3RydWN0IENvb2tpZUluZm8pKTsKICAgIGMtPmZpbGVuYW1lID0gc3RyZHVwKGZpbGU/ZmlsZToibm9uZSIpOyAvKiBjb3B5IHRoZSBuYW1lIGp1c3QgaW4gY2FzZSAqLwogIH0KICBlbHNlIHsKICAgIC8qIHdlIGdvdCBhbiBhbHJlYWR5IGV4aXN0aW5nIG9uZSwgdXNlIHRoYXQgKi8KICAgIGMgPSBpbmM7CiAgfQogIGMtPnJ1bm5pbmcgPSBGQUxTRTsgLyogdGhpcyBpcyBub3QgcnVubmluZywgdGhpcyBpcyBpbml0ICovCgogIGlmKHN0cmVxdWFsKGZpbGUsICItIikpIHsKICAgIGZwID0gc3RkaW47CiAgICBmcm9tZmlsZT1GQUxTRTsKICB9CiAgZWxzZQogICAgZnAgPSBmaWxlP2ZvcGVuKGZpbGUsICJyIik6TlVMTDsKCiAgaWYoZnApIHsKICAgIGNoYXIgKmxpbmVwdHI7CiAgICBib29sIGhlYWRlcmxpbmU7CiAgICB3aGlsZShmZ2V0cyhsaW5lLCBNQVhfQ09PS0lFX0xJTkUsIGZwKSkgewogICAgICBpZihzdHJuZXF1YWwoIlNldC1Db29raWU6IiwgbGluZSwgMTEpKSB7CiAgICAgICAgLyogVGhpcyBpcyBhIGNvb2tpZSBsaW5lLCBnZXQgaXQhICovCiAgICAgICAgbGluZXB0cj0mbGluZVsxMV07CiAgICAgICAgaGVhZGVybGluZT1UUlVFOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGxpbmVwdHI9bGluZTsKICAgICAgICBoZWFkZXJsaW5lPUZBTFNFOwogICAgICB9CiAgICAgIHdoaWxlKCpsaW5lcHRyICYmIGlzc3BhY2UoKGludCkqbGluZXB0cikpCiAgICAgICAgbGluZXB0cisrOwoKICAgICAgQ3VybF9jb29raWVfYWRkKGMsIGhlYWRlcmxpbmUsIGxpbmVwdHIpOwogICAgfQogICAgaWYoZnJvbWZpbGUpCiAgICAgIGZjbG9zZShmcCk7CiAgfQoKICBjLT5ydW5uaW5nID0gVFJVRTsgLyogbm93LCB3ZSdyZSBydW5uaW5nICovCgogIHJldHVybiBjOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfZ2V0bGlzdCgpCiAqCiAqIEZvciBhIGdpdmVuIGhvc3QgYW5kIHBhdGgsIHJldHVybiBhIGxpbmtlZCBsaXN0IG9mIGNvb2tpZXMgdGhhdCB0aGUKICogY2xpZW50IHNob3VsZCBzZW5kIHRvIHRoZSBzZXJ2ZXIgaWYgdXNlZCBub3cuIFRoZSBzZWN1cmUgYm9vbGVhbiBpbmZvcm1zCiAqIHRoZSBjb29raWUgaWYgYSBzZWN1cmUgY29ubmVjdGlvbiBpcyBhY2hpZXZlZCBvciBub3QuCiAqCiAqIEl0IHNoYWxsIG9ubHkgcmV0dXJuIGNvb2tpZXMgdGhhdCBoYXZlbid0IGV4cGlyZWQuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RydWN0IENvb2tpZSAqQ3VybF9jb29raWVfZ2V0bGlzdChzdHJ1Y3QgQ29va2llSW5mbyAqYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpob3N0LCBjaGFyICpwYXRoLCBib29sIHNlY3VyZSkKewogICBzdHJ1Y3QgQ29va2llICpuZXdjbzsKICAgc3RydWN0IENvb2tpZSAqY287CiAgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwogICBpbnQgaG9zdGxlbj1zdHJsZW4oaG9zdCk7CiAgIGludCBkb21sZW47CgogICBzdHJ1Y3QgQ29va2llICptYWluY289TlVMTDsKCiAgIGlmKCFjIHx8ICFjLT5jb29raWVzKQogICAgICByZXR1cm4gTlVMTDsgLyogbm8gY29va2llIHN0cnVjdCBvciBubyBjb29raWVzIGluIHRoZSBzdHJ1Y3QgKi8KCiAgIGNvID0gYy0+Y29va2llczsKCiAgIHdoaWxlKGNvKSB7CiAgICAgIC8qIG9ubHkgcHJvY2VzcyB0aGlzIGNvb2tpZSBpZiBpdCBpcyBub3QgZXhwaXJlZCBvciBoYWQgbm8gZXhwaXJlCgkgZGF0ZSBBTkQgdGhhdCBpZiB0aGUgY29va2llIHJlcXVpcmVzIHdlJ3JlIHNlY3VyZSB3ZSBtdXN0IG9ubHkKCSBjb250aW51ZSBpZiB3ZSBhcmUhICovCiAgICAgaWYoIChjby0+ZXhwaXJlczw9MCB8fCAoY28tPmV4cGlyZXM+IG5vdykpICYmCiAgICAgICAgIChjby0+c2VjdXJlP3NlY3VyZTpUUlVFKSApIHsKCgkgLyogbm93IGNoZWNrIGlmIHRoZSBkb21haW4gaXMgY29ycmVjdCAqLwoJIGRvbWxlbj1jby0+ZG9tYWluP3N0cmxlbihjby0+ZG9tYWluKTowOwoJIGlmKCFjby0+ZG9tYWluIHx8CgkgICAgKChkb21sZW48PWhvc3RsZW4pICYmCgkgICAgIHN0cmVxdWFsKGhvc3QrKGhvc3RsZW4tZG9tbGVuKSwgY28tPmRvbWFpbikpICkgewoJICAgIC8qIHRoZSByaWdodCBwYXJ0IG9mIHRoZSBob3N0IG1hdGNoZXMgdGhlIGRvbWFpbiBzdHVmZiBpbiB0aGUKCSAgICAgICBjb29raWUgZGF0YSAqLwoKCSAgICAvKiBub3cgY2hlY2sgdGhlIGxlZnQgcGFydCBvZiB0aGUgcGF0aCB3aXRoIHRoZSBjb29raWVzIHBhdGgKCSAgICAgICByZXF1aXJlbWVudCAqLwoJICAgIGlmKCFjby0+cGF0aCB8fAoJICAgICAgIHN0cm5lcXVhbChwYXRoLCBjby0+cGF0aCwgc3RybGVuKGNvLT5wYXRoKSkpIHsKCgkgICAgICAgLyogYW5kIG5vdywgd2Uga25vdyB0aGlzIGlzIGEgbWF0Y2ggYW5kIHdlIHNob3VsZCBjcmVhdGUgYW4KCQkgIGVudHJ5IGZvciB0aGUgcmV0dXJuLWxpbmtlZC1saXN0ICovCgoJICAgICAgIG5ld2NvID0gKHN0cnVjdCBDb29raWUgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBDb29raWUpKTsKCSAgICAgICBpZihuZXdjbykgewoJCSAgLyogZmlyc3QsIGNvcHkgdGhlIHdob2xlIHNvdXJjZSBjb29raWU6ICovCgkJICBtZW1jcHkobmV3Y28sIGNvLCBzaXplb2Yoc3RydWN0IENvb2tpZSkpOwoKCQkgIC8qIHRoZW4gbW9kaWZ5IG91ciBuZXh0ICovCgkJICBuZXdjby0+bmV4dCA9IG1haW5jbzsKCgkJICAvKiBwb2ludCB0aGUgbWFpbiB0byB1cyAqLwoJCSAgbWFpbmNvID0gbmV3Y287CgkgICAgICAgfQoJICAgIH0KCSB9CiAgICAgIH0KICAgICAgY28gPSBjby0+bmV4dDsKICAgfQoKICAgcmV0dXJuIG1haW5jbzsgLyogcmV0dXJuIHRoZSBuZXcgbGlzdCAqLwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2ZyZWVsaXN0KCkKICoKICogRnJlZSBhIGxpc3Qgb2YgY29va2llcyBwcmV2aW91c2x5IHJldHVybmVkIGJ5IEN1cmxfY29va2llX2dldGxpc3QoKTsKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp2b2lkIEN1cmxfY29va2llX2ZyZWVsaXN0KHN0cnVjdCBDb29raWUgKmNvKQp7CiAgIHN0cnVjdCBDb29raWUgKm5leHQ7CiAgIGlmKGNvKSB7CiAgICAgIHdoaWxlKGNvKSB7CgkgbmV4dCA9IGNvLT5uZXh0OwoJIGZyZWUoY28pOyAvKiB3ZSBvbmx5IGZyZWUgdGhlIHN0cnVjdCBzaW5jZSB0aGUgIm1lbWJlcnMiIGFyZSBhbGwKCQkgICAgICBqdXN0IGNvcGllZCEgKi8KCSBjbyA9IG5leHQ7CiAgICAgIH0KICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfY2xlYW51cCgpCiAqCiAqIEZyZWUgYSAiY29va2llIG9iamVjdCIgcHJldmlvdXMgY3JlYXRlZCB3aXRoIGNvb2tpZV9pbml0KCkuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEN1cmxfY29va2llX2NsZWFudXAoc3RydWN0IENvb2tpZUluZm8gKmMpCnsKICAgc3RydWN0IENvb2tpZSAqY287CiAgIHN0cnVjdCBDb29raWUgKm5leHQ7CiAgIGlmKGMpIHsKICAgICAgaWYoYy0+ZmlsZW5hbWUpCgkgZnJlZShjLT5maWxlbmFtZSk7CiAgICAgIGNvID0gYy0+Y29va2llczsKCiAgICAgIHdoaWxlKGNvKSB7CgkgaWYoY28tPm5hbWUpCgkgICAgZnJlZShjby0+bmFtZSk7CgkgaWYoY28tPnZhbHVlKQoJICAgIGZyZWUoY28tPnZhbHVlKTsKCSBpZihjby0+ZG9tYWluKQoJICAgIGZyZWUoY28tPmRvbWFpbik7CgkgaWYoY28tPnBhdGgpCgkgICAgZnJlZShjby0+cGF0aCk7CgkgaWYoY28tPmV4cGlyZXN0cikKCSAgICBmcmVlKGNvLT5leHBpcmVzdHIpOwoKCSBpZihjby0+dmVyc2lvbikKCSAgICBmcmVlKGNvLT52ZXJzaW9uKTsKCSBpZihjby0+bWF4YWdlKQoJICAgIGZyZWUoY28tPm1heGFnZSk7CgoJIG5leHQgPSBjby0+bmV4dDsKCSBmcmVlKGNvKTsKCSBjbyA9IG5leHQ7CiAgICAgIH0KICAgICAgZnJlZShjKTsgLyogZnJlZSB0aGUgYmFzZSBzdHJ1Y3QgYXMgd2VsbCAqLwogICB9Cn0KCi8qCiAqIEN1cmxfY29va2llX291dHB1dCgpCiAqCiAqIFdyaXRlcyBhbGwgaW50ZXJuYWxseSBrbm93biBjb29raWVzIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4gU3BlY2lmeQogKiAiLSIgYXMgZmlsZSBuYW1lIHRvIHdyaXRlIHRvIHN0ZG91dC4KICoKICogVGhlIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gb24gd3JpdGUgZmFpbHVyZS4KICovCmludCBDdXJsX2Nvb2tpZV9vdXRwdXQoc3RydWN0IENvb2tpZUluZm8gKmMsIGNoYXIgKmR1bXBoZXJlKQp7CiAgc3RydWN0IENvb2tpZSAqY287CiAgRklMRSAqb3V0OwogIGJvb2wgdXNlX3N0ZG91dD1GQUxTRTsKCiAgaWYoKE5VTEwgPT0gYykgfHwgKDAgPT0gYy0+bnVtY29va2llcykpCiAgICAvKiBJZiB0aGVyZSBhcmUgbm8ga25vd24gY29va2llcywgd2UgZG9uJ3Qgd3JpdGUgb3IgZXZlbiBjcmVhdGUgYW55CiAgICAgICBkZXN0aW5hdGlvbiBmaWxlICovCiAgICByZXR1cm4gMDsKCiAgaWYoc3RyZXF1YWwoIi0iLCBkdW1waGVyZSkpIHsKICAgIC8qIHVzZSBzdGRvdXQgKi8KICAgIG91dCA9IHN0ZG91dDsKICAgIHVzZV9zdGRvdXQ9VFJVRTsKICB9CiAgZWxzZSB7CiAgICBvdXQgPSBmb3BlbihkdW1waGVyZSwgInciKTsKICAgIGlmKCFvdXQpCiAgICAgIHJldHVybiAxOyAvKiBmYWlsdXJlICovCiAgfQoKICBpZihjKSB7CiAgICBmcHV0cygiIyBOZXRzY2FwZSBIVFRQIENvb2tpZSBGaWxlXG4iCiAgICAgICAgICAiIyBodHRwOi8vd3d3Lm5ldHNjYXBlLmNvbS9uZXdzcmVmL3N0ZC9jb29raWVfc3BlYy5odG1sXG4iCiAgICAgICAgICAiIyBUaGlzIGlzIGdlbmVyYXRlZCBieSBsaWJjdXJsISBFZGl0IG9uIHlvdXIgb3duIHJpc2suXG5cbiIsCiAgICAgICAgICBvdXQpOwogICAgY28gPSBjLT5jb29raWVzOwogICAgIAogICAgd2hpbGUoY28pIHsKICAgICAgZnByaW50ZihvdXQsCiAgICAgICAgICAgICAgIiVzXHQiIC8qIGRvbWFpbiAqLwogICAgICAgICAgICAgICIlc1x0IiAvKiBmaWVsZDEgKi8KICAgICAgICAgICAgICAiJXNcdCIgLyogcGF0aCAqLwogICAgICAgICAgICAgICIlc1x0IiAvKiBzZWN1cmUgKi8KICAgICAgICAgICAgICAiJXVcdCIgLyogZXhwaXJlcyAqLwogICAgICAgICAgICAgICIlc1x0IiAvKiBuYW1lICovCiAgICAgICAgICAgICAgIiVzXG4iLCAvKiB2YWx1ZSAqLwogICAgICAgICAgICAgIGNvLT5kb21haW4sCiAgICAgICAgICAgICAgY28tPmZpZWxkMT09Mj8iVFJVRSI6IkZBTFNFIiwKICAgICAgICAgICAgICBjby0+cGF0aCwKICAgICAgICAgICAgICBjby0+c2VjdXJlPyJUUlVFIjoiRkFMU0UiLAogICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpY28tPmV4cGlyZXMsCiAgICAgICAgICAgICAgY28tPm5hbWUsCiAgICAgICAgICAgICAgY28tPnZhbHVlKTsKCiAgICAgIGNvPWNvLT5uZXh0OwogICAgfQogIH0KCiAgaWYoIXVzZV9zdGRvdXQpCiAgICBmY2xvc2Uob3V0KTsKCiAgcmV0dXJuIDA7Cn0KCiNpZmRlZiBDVVJMX0NPT0tJRV9ERUJVRwoKLyoKICogT24gbXkgU29sYXJpcyBib3gsIHRoaXMgY29tbWFuZCBsaW5lIGJ1aWxkcyB0aGlzIHRlc3QgcHJvZ3JhbToKICoKICogZ2NjIC1nIC1vIGNvb2t0ZXN0IC1EQ1VSTF9DT09LSUVfREVCVUcgLURIQVZFX0NPTkZJR19IIC1JLi4gLUkuLi9pbmNsdWRlIGNvb2tpZS5jIHN0cmVxdWFsLm8gZ2V0ZGF0ZS5vIG1lbWRlYnVnLm8gbXByaW50Zi5vIHN0cnRvay5vIC1sbnNsIC1sc29ja2V0CiAqCiAqLwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgc3RydWN0IENvb2tpZUluZm8gKmM9TlVMTDsKICBpZihhcmdjPjEpIHsKICAgIGMgPSBDdXJsX2Nvb2tpZV9pbml0KGFyZ3ZbMV0sIGMpOwogICAgQ3VybF9jb29raWVfYWRkKGMsIFRSVUUsICJQRVJTT05BTElaRT1ub25lO2V4cGlyZXM9TW9uZGF5LCAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7IGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS9mdGd3OyBzZWN1cmUiKTsKICAgIEN1cmxfY29va2llX2FkZChjLCBUUlVFLCAiZm9vYmFyPXllczsgZG9tYWluPS5oYXh4LnNlOyBwYXRoPS9sb29zZXI7Iik7CiAgICBjID0gQ3VybF9jb29raWVfaW5pdChhcmd2WzFdLCBjKTsKCiAgICBDdXJsX2Nvb2tpZV9vdXRwdXQoYyk7CiAgICBDdXJsX2Nvb2tpZV9jbGVhbnVwKGMpOwogICAgcmV0dXJuIDA7CiAgfQogIHJldHVybiAxOwp9CgojZW5kaWYKCi8qCiAqIGxvY2FsIHZhcmlhYmxlczoKICogZXZhbDogKGxvYWQtZmlsZSAiLi4vY3VybC1tb2RlLmVsIikKICogZW5kOgogKiB2aW02MDA6IGV0IHN3PTIgdHM9MiBzdHM9MiB0dz03OCBmZG09bWFya2VyCiAqIHZpbTw2MDA6IGV0IHN3PTIgdHM9MiBzdHM9MiB0dz03OAogKi8K