LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfICAgXyBfX19fICBfCiAqICBQcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogKgogKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDA1LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCiAqIGFyZSBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvY29weXJpZ2h0Lmh0bWwuCiAqCiAqIFlvdSBtYXkgb3B0IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKICogZnVybmlzaGVkIHRvIGRvIHNvLCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENPUFlJTkcgZmlsZS4KICoKICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQogKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKgogKiAkSWQkCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqCgoKUkVDRUlWSU5HIENPT0tJRSBJTkZPUk1BVElPTgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdHJ1Y3QgQ29va2llSW5mbyAqY29va2llX2luaXQoY2hhciAqZmlsZSk7CgogICAgICAgIEluaXRzIGEgY29va2llIHN0cnVjdCB0byBzdG9yZSBkYXRhIGluIGEgbG9jYWwgZmlsZS4gVGhpcyBpcyBhbHdheXMKICAgICAgICBjYWxsZWQgYmVmb3JlIGFueSBjb29raWVzIGFyZSBzZXQuCgppbnQgY29va2llc19zZXQoc3RydWN0IENvb2tpZUluZm8gKmNvb2tpZSwgY2hhciAqY29va2llX2xpbmUpOwoKICAgICAgICBUaGUgJ2Nvb2tpZV9saW5lJyBwYXJhbWV0ZXIgaXMgYSBmdWxsICJTZXQtY29va2llOiIgbGluZSBhcwogICAgICAgIHJlY2VpdmVkIGZyb20gYSBzZXJ2ZXIuCgogICAgICAgIFRoZSBmdW5jdGlvbiBuZWVkIHRvIHJlcGxhY2UgcHJldmlvdXNseSBzdG9yZWQgbGluZXMgdGhhdCB0aGlzIG5ldwogICAgICAgIGxpbmUgc3VwZXJjZWVkcy4KCiAgICAgICAgSXQgbWF5IHJlbW92ZSBsaW5lcyB0aGF0IGFyZSBleHBpcmVkLgoKICAgICAgICBJdCBzaG91bGQgcmV0dXJuIGFuIGluZGljYXRpb24gb2Ygc3VjY2Vzcy9lcnJvci4KCgpTRU5ESU5HIENPT0tJRSBJTkZPUk1BVElPTgo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RydWN0IENvb2tpZXMgKmNvb2tpZV9nZXRsaXN0KHN0cnVjdCBDb29raWVJbmZvICpjb29raWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpob3N0LCBjaGFyICpwYXRoLCBib29sIHNlY3VyZSk7CgogICAgICAgIEZvciBhIGdpdmVuIGhvc3QgYW5kIHBhdGgsIHJldHVybiBhIGxpbmtlZCBsaXN0IG9mIGNvb2tpZXMgdGhhdAogICAgICAgIHRoZSBjbGllbnQgc2hvdWxkIHNlbmQgdG8gdGhlIHNlcnZlciBpZiB1c2VkIG5vdy4gVGhlIHNlY3VyZQogICAgICAgIGJvb2xlYW4gaW5mb3JtcyB0aGUgY29va2llIGlmIGEgc2VjdXJlIGNvbm5lY3Rpb24gaXMgYWNoaWV2ZWQgb3IKICAgICAgICBub3QuCgogICAgICAgIEl0IHNoYWxsIG9ubHkgcmV0dXJuIGNvb2tpZXMgdGhhdCBoYXZlbid0IGV4cGlyZWQuCgoKRXhhbXBsZSBzZXQgb2YgY29va2llczoKCiAgICBTZXQtY29va2llOiBQUk9EVUNUSU5GTz13ZWJ4cHJlc3M7IGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQogICAgU2V0LWNvb2tpZTogUEVSU09OQUxJWkU9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9L2Z0Z3c7IHNlY3VyZQogICAgU2V0LWNvb2tpZTogRmlkSGlzdD1ub25lO2V4cGlyZXM9TW9uZGF5LCAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7CiAgICBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6IEZpZE9yZGVyPW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQogICAgU2V0LWNvb2tpZTogRGlzUGVuZD1ub25lO2V4cGlyZXM9TW9uZGF5LCAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7CiAgICBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6IEZpZERpcz1ub25lO2V4cGlyZXM9TW9uZGF5LCAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7CiAgICBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6CiAgICBTZXNzaW9uX0tleUA2NzkxYTllMC05MDFhLTExZDAtYTFjOC05YjAxMmM4OGFhNzc9bm9uZTtleHBpcmVzPU1vbmRheSwKICAgIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCioqKiovCgoKI2luY2x1ZGUgInNldHVwLmgiCgojaWYgIWRlZmluZWQoQ1VSTF9ESVNBQkxFX0hUVFApICYmICFkZWZpbmVkKENVUkxfRElTQUJMRV9DT09LSUVTKQoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAidXJsZGF0YS5oIgojaW5jbHVkZSAiY29va2llLmgiCiNpbmNsdWRlICJzdHJlcXVhbC5oIgojaW5jbHVkZSAic3RydG9rLmgiCiNpbmNsdWRlICJzZW5kZi5oIgojaW5jbHVkZSAibWVtb3J5LmgiCgovKiBUaGUgbGFzdCAjaW5jbHVkZSBmaWxlIHNob3VsZCBiZTogKi8KI2lmZGVmIENVUkxERUJVRwojaW5jbHVkZSAibWVtZGVidWcuaCIKI2VuZGlmCgojZGVmaW5lIG15X2lzc3BhY2UoeCkgKCh4ID09ICcgJykgfHwgKHggPT0gJ1x0JykpCgpzdGF0aWMgdm9pZCBmcmVlY29va2llKHN0cnVjdCBDb29raWUgKmNvKQp7CiAgaWYoY28tPmV4cGlyZXN0cikKICAgIGZyZWUoY28tPmV4cGlyZXN0cik7CiAgaWYoY28tPmRvbWFpbikKICAgIGZyZWUoY28tPmRvbWFpbik7CiAgaWYoY28tPnBhdGgpCiAgICBmcmVlKGNvLT5wYXRoKTsKICBpZihjby0+bmFtZSkKICAgIGZyZWUoY28tPm5hbWUpOwogIGlmKGNvLT52YWx1ZSkKICAgIGZyZWUoY28tPnZhbHVlKTsKICBpZihjby0+bWF4YWdlKQogICAgZnJlZShjby0+bWF4YWdlKTsKICBpZihjby0+dmVyc2lvbikKICAgIGZyZWUoY28tPnZlcnNpb24pOwoKICBmcmVlKGNvKTsKfQoKc3RhdGljIGJvb2wgdGFpbG1hdGNoKGNvbnN0IGNoYXIgKmxpdHRsZSwgY29uc3QgY2hhciAqYmlnb25lKQp7CiAgc2l6ZV90IGxpdHRsZWxlbiA9IHN0cmxlbihsaXR0bGUpOwogIHNpemVfdCBiaWdsZW4gPSBzdHJsZW4oYmlnb25lKTsKCiAgaWYobGl0dGxlbGVuID4gYmlnbGVuKQogICAgcmV0dXJuIEZBTFNFOwoKICByZXR1cm4gKGJvb2wpc3RyZXF1YWwobGl0dGxlLCBiaWdvbmUrYmlnbGVuLWxpdHRsZWxlbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2FkZCgpCiAqCiAqIEFkZCBhIHNpbmdsZSBjb29raWUgbGluZSB0byB0aGUgY29va2llIGtlZXBpbmcgb2JqZWN0LgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RydWN0IENvb2tpZSAqCkN1cmxfY29va2llX2FkZChzdHJ1Y3QgU2Vzc2lvbkhhbmRsZSAqZGF0YSwKICAgICAgICAgICAgICAgIC8qIFRoZSAnZGF0YScgcG9pbnRlciBoZXJlIG1heSBiZSBOVUxMIGF0IHRpbWVzLCBhbmQgdGh1cwogICAgICAgICAgICAgICAgICAgbXVzdCBvbmx5IGJlIHVzZWQgdmVyeSBjYXJlZnVsbHkgZm9yIHRoaW5ncyB0aGF0IGNhbiBkZWFsCiAgICAgICAgICAgICAgICAgICB3aXRoIGRhdGEgYmVpbmcgTlVMTC4gU3VjaCBhcyBpbmZvZigpIGFuZCBzaW1pbGFyICovCgogICAgICAgICAgICAgICAgc3RydWN0IENvb2tpZUluZm8gKmMsCiAgICAgICAgICAgICAgICBib29sIGh0dHBoZWFkZXIsIC8qIFRSVUUgaWYgSFRUUCBoZWFkZXItc3R5bGUgbGluZSAqLwogICAgICAgICAgICAgICAgY2hhciAqbGluZXB0ciwgICAvKiBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGxpbmUgKi8KICAgICAgICAgICAgICAgIGNoYXIgKmRvbWFpbiwgICAgLyogZGVmYXVsdCBkb21haW4gKi8KICAgICAgICAgICAgICAgIGNoYXIgKnBhdGgpICAgICAgLyogZnVsbCBwYXRoIHVzZWQgd2hlbiB0aGlzIGNvb2tpZSBpcyBzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gZ2V0IGRlZmF1bHQgcGF0aCBmb3IgdGhlIGNvb2tpZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxlc3Mgc2V0ICovCnsKICBzdHJ1Y3QgQ29va2llICpjbGlzdDsKICBjaGFyICp3aGF0OwogIGNoYXIgbmFtZVtNQVhfTkFNRV07CiAgY2hhciAqcHRyOwogIGNoYXIgKnNlbWlwdHI7CiAgc3RydWN0IENvb2tpZSAqY287CiAgc3RydWN0IENvb2tpZSAqbGFzdGM9TlVMTDsKICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKICBib29sIHJlcGxhY2Vfb2xkID0gRkFMU0U7CiAgYm9vbCBiYWRjb29raWUgPSBGQUxTRTsgLyogY29va2llcyBhcmUgZ29vZCBieSBkZWZhdWx0LiBtbW1tbSB5dW1teSAqLwoKICAvKiBGaXJzdCwgYWxsb2MgYW5kIGluaXQgYSBuZXcgc3RydWN0IGZvciBpdCAqLwogIGNvID0gKHN0cnVjdCBDb29raWUgKiljYWxsb2Moc2l6ZW9mKHN0cnVjdCBDb29raWUpLCAxKTsKICBpZighY28pCiAgICByZXR1cm4gTlVMTDsgLyogYmFpbCBvdXQgaWYgd2UncmUgdGhpcyBsb3cgb24gbWVtb3J5ICovCgogIGlmKGh0dHBoZWFkZXIpIHsKICAgIC8qIFRoaXMgbGluZSB3YXMgcmVhZCBvZmYgYSBIVFRQLWhlYWRlciAqLwogICAgY2hhciAqc2VwOwoKICAgIHdoYXQgPSBtYWxsb2MoTUFYX0NPT0tJRV9MSU5FKTsKICAgIGlmKCF3aGF0KSB7CiAgICAgIGZyZWUoY28pOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBzZW1pcHRyPXN0cmNocihsaW5lcHRyLCAnOycpOyAvKiBmaXJzdCwgZmluZCBhIHNlbWljb2xvbiAqLwoKICAgIHdoaWxlKCpsaW5lcHRyICYmIG15X2lzc3BhY2UoKmxpbmVwdHIpKQogICAgICBsaW5lcHRyKys7CgogICAgcHRyID0gbGluZXB0cjsKICAgIGRvIHsKICAgICAgLyogd2UgaGF2ZSBhIDx3aGF0Pj08dGhpcz4gcGFpciBvciBhICdzZWN1cmUnIHdvcmQgaGVyZSAqLwogICAgICBzZXAgPSBzdHJjaHIocHRyLCAnPScpOwogICAgICBpZihzZXAgJiYgKCFzZW1pcHRyIHx8IChzZW1pcHRyPnNlcCkpICkgewogICAgICAgIC8qCiAgICAgICAgICogVGhlcmUgaXMgYSA9IHNpZ24gYW5kIGlmIHRoZXJlIHdhcyBhIHNlbWljb2xvbiB0b28sIHdoaWNoIG1ha2Ugc3VyZQogICAgICAgICAqIHRoYXQgdGhlIHNlbWljb2xvbiBjb21lcyBfYWZ0ZXJfIHRoZSBlcXVhbCBzaWduLgogICAgICAgICAqLwoKICAgICAgICBuYW1lWzBdPXdoYXRbMF09MDsgLyogaW5pdCB0aGUgYnVmZmVycyAqLwogICAgICAgIGlmKDEgPD0gc3NjYW5mKHB0ciwgIiUiIE1BWF9OQU1FX1RYVCAiW147PV09JSIKICAgICAgICAgICAgICAgICAgICAgICBNQVhfQ09PS0lFX0xJTkVfVFhUICJbXjtcclxuXSIsCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgd2hhdCkpIHsKICAgICAgICAgIC8qIHRoaXMgaXMgYSA8bmFtZT49PHdoYXQ+IHBhaXIgKi8KCiAgICAgICAgICBjaGFyICp3aGF0cHRyOwoKICAgICAgICAgIC8qIFN0cmlwIG9mZiB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlICd3aGF0JyAqLwogICAgICAgICAgc2l6ZV90IGxlbj1zdHJsZW4od2hhdCk7CiAgICAgICAgICB3aGlsZShsZW4gJiYgbXlfaXNzcGFjZSh3aGF0W2xlbi0xXSkpIHsKICAgICAgICAgICAgd2hhdFtsZW4tMV09MDsKICAgICAgICAgICAgbGVuLS07CiAgICAgICAgICB9CgogICAgICAgICAgLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgJ3doYXQnICovCiAgICAgICAgICB3aGF0cHRyPXdoYXQ7CiAgICAgICAgICB3aGlsZShteV9pc3NwYWNlKCp3aGF0cHRyKSkgewogICAgICAgICAgICB3aGF0cHRyKys7CiAgICAgICAgICB9CgogICAgICAgICAgaWYoc3RyZXF1YWwoInBhdGgiLCBuYW1lKSkgewogICAgICAgICAgICBjby0+cGF0aD1zdHJkdXAod2hhdHB0cik7CiAgICAgICAgICAgIGlmKCFjby0+cGF0aCkgewogICAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7IC8qIG91dCBvZiBtZW1vcnkgYmFkICovCiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYoc3RyZXF1YWwoImRvbWFpbiIsIG5hbWUpKSB7CiAgICAgICAgICAgIC8qIG5vdGUgdGhhdCB0aGlzIG5hbWUgbWF5IG9yIG1heSBub3QgaGF2ZSBhIHByZWNlZWRpbmcgZG90LCBidXQKICAgICAgICAgICAgICAgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGF0LCB3ZSB0cmVhdCB0aGUgbmFtZXMgdGhlIHNhbWUgYW55d2F5ICovCgogICAgICAgICAgICBjb25zdCBjaGFyICpkb21wdHI9d2hhdHB0cjsKICAgICAgICAgICAgaW50IGRvdGNvdW50PTE7CgogICAgICAgICAgICAvKiBDb3VudCB0aGUgZG90cywgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUgZW5vdWdoCiAgICAgICAgICAgICAgIG9mIHRoZW0uICovCgogICAgICAgICAgICBpZignLicgPT0gd2hhdHB0clswXSkKICAgICAgICAgICAgICAvKiBkb24ndCBjb3VudCB0aGUgaW5pdGlhbCBkb3QsIGFzc3VtZSBpdCAqLwogICAgICAgICAgICAgIGRvbXB0cisrOwoKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgIGRvbXB0ciA9IHN0cmNocihkb21wdHIsICcuJyk7CiAgICAgICAgICAgICAgaWYoZG9tcHRyKSB7CiAgICAgICAgICAgICAgICBkb21wdHIrKzsKICAgICAgICAgICAgICAgIGRvdGNvdW50Kys7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IHdoaWxlKGRvbXB0cik7CgogICAgICAgICAgICAvKiBUaGUgb3JpZ2luYWwgTmV0c2NhcGUgY29va2llIHNwZWMgZGVmaW5lZCB0aGF0IHRoaXMgZG9tYWluIG5hbWUKICAgICAgICAgICAgICAgTVVTVCBoYXZlIHRocmVlIGRvdHMgKG9yIHR3byBpZiBvbmUgb2YgdGhlIHNldmVuIGhvbHkgVExEcyksCiAgICAgICAgICAgICAgIGJ1dCBpdCBzZWVtcyB0aGF0IHRoZXNlIGtpbmRzIG9mIGNvb2tpZXMgYXJlIGluIHVzZSAib3V0IHRoZXJlIgogICAgICAgICAgICAgICBzbyB3ZSBjYW5ub3QgYmUgdGhhdCBzdHJpY3QuIEkndmUgdGhlcmVmb3JlIGxvd2VyZWQgdGhlIGNoZWNrCiAgICAgICAgICAgICAgIHRvIG5vdCBhbGxvdyBsZXNzIHRoYW4gdHdvIGRvdHMuICovCgogICAgICAgICAgICBpZihkb3Rjb3VudCA8IDIpIHsKICAgICAgICAgICAgICAvKiBSZWNlaXZlZCBhbmQgc2tpcHBlZCBhIGNvb2tpZSB3aXRoIGEgZG9tYWluIHVzaW5nIHRvbyBmZXcKICAgICAgICAgICAgICAgICBkb3RzLiAqLwogICAgICAgICAgICAgIGJhZGNvb2tpZT1UUlVFOyAvKiBtYXJrIHRoaXMgYXMgYSBiYWQgY29va2llICovCiAgICAgICAgICAgICAgaW5mb2YoZGF0YSwgInNraXBwZWQgY29va2llIHdpdGggaWxsZWdhbCBkb3Rjb3VudCBkb21haW46ICVzXG4iLAogICAgICAgICAgICAgICAgICAgIHdoYXRwdHIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIC8qIE5vdywgd2UgbWFrZSBzdXJlIHRoYXQgb3VyIGhvc3QgaXMgd2l0aGluIHRoZSBnaXZlbiBkb21haW4sCiAgICAgICAgICAgICAgICAgb3IgdGhlIGdpdmVuIGRvbWFpbiBpcyBub3QgdmFsaWQgYW5kIHRodXMgY2Fubm90IGJlIHNldC4gKi8KCiAgICAgICAgICAgICAgaWYoJy4nID09IHdoYXRwdHJbMF0pCiAgICAgICAgICAgICAgICB3aGF0cHRyKys7IC8qIGlnbm9yZSBwcmVjZWVkaW5nIGRvdCAqLwoKICAgICAgICAgICAgICBpZighZG9tYWluIHx8IHRhaWxtYXRjaCh3aGF0cHRyLCBkb21haW4pKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0YWlscHRyPXdoYXRwdHI7CiAgICAgICAgICAgICAgICBpZih0YWlscHRyWzBdID09ICcuJykKICAgICAgICAgICAgICAgICAgdGFpbHB0cisrOwogICAgICAgICAgICAgICAgY28tPmRvbWFpbj1zdHJkdXAodGFpbHB0cik7IC8qIGRvbid0IHByZWZpeCB3L2RvdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbGx5ICovCiAgICAgICAgICAgICAgICBpZighY28tPmRvbWFpbikgewogICAgICAgICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvLT50YWlsbWF0Y2g9VFJVRTsgLyogd2UgYWx3YXlzIGRvIHRoYXQgaWYgdGhlIGRvbWFpbiBuYW1lIHdhcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiAqLwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qIHdlIGRpZCBub3QgZ2V0IGEgdGFpbG1hdGNoIGFuZCB0aGVuIHRoZSBhdHRlbXB0ZWQgc2V0IGRvbWFpbgogICAgICAgICAgICAgICAgICAgaXMgbm90IGEgZG9tYWluIHRvIHdoaWNoIHRoZSBjdXJyZW50IGhvc3QgYmVsb25ncy4gTWFyayBhcwogICAgICAgICAgICAgICAgICAgYmFkLiAqLwogICAgICAgICAgICAgICAgYmFkY29va2llPVRSVUU7CiAgICAgICAgICAgICAgICBpbmZvZihkYXRhLCAic2tpcHBlZCBjb29raWUgd2l0aCBiYWQgdGFpbG1hdGNoIGRvbWFpbjogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICB3aGF0cHRyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYoc3RyZXF1YWwoInZlcnNpb24iLCBuYW1lKSkgewogICAgICAgICAgICBjby0+dmVyc2lvbj1zdHJkdXAod2hhdHB0cik7CiAgICAgICAgICAgIGlmKCFjby0+dmVyc2lvbikgewogICAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYoc3RyZXF1YWwoIm1heC1hZ2UiLCBuYW1lKSkgewogICAgICAgICAgICAvKiBEZWZpbmVkIGluIFJGQzIxMDk6CgogICAgICAgICAgICAgICBPcHRpb25hbC4gIFRoZSBNYXgtQWdlIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsaWZldGltZSBvZiB0aGUKICAgICAgICAgICAgICAgY29va2llLCBpbiBzZWNvbmRzLiAgVGhlIGRlbHRhLXNlY29uZHMgdmFsdWUgaXMgYSBkZWNpbWFsIG5vbi0KICAgICAgICAgICAgICAgbmVnYXRpdmUgaW50ZWdlci4gIEFmdGVyIGRlbHRhLXNlY29uZHMgc2Vjb25kcyBlbGFwc2UsIHRoZQogICAgICAgICAgICAgICBjbGllbnQgc2hvdWxkIGRpc2NhcmQgdGhlIGNvb2tpZS4gIEEgdmFsdWUgb2YgemVybyBtZWFucyB0aGUKICAgICAgICAgICAgICAgY29va2llIHNob3VsZCBiZSBkaXNjYXJkZWQgaW1tZWRpYXRlbHkuCgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY28tPm1heGFnZSA9IHN0cmR1cCh3aGF0cHRyKTsKICAgICAgICAgICAgaWYoIWNvLT5tYXhhZ2UpIHsKICAgICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvLT5leHBpcmVzID0KICAgICAgICAgICAgICBhdG9pKCgqY28tPm1heGFnZT09J1wiJyk/JmNvLT5tYXhhZ2VbMV06JmNvLT5tYXhhZ2VbMF0pICsgKGxvbmcpbm93OwogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZihzdHJlcXVhbCgiZXhwaXJlcyIsIG5hbWUpKSB7CiAgICAgICAgICAgIGNvLT5leHBpcmVzdHI9c3RyZHVwKHdoYXRwdHIpOwogICAgICAgICAgICBpZighY28tPmV4cGlyZXN0cikgewogICAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY28tPmV4cGlyZXMgPSAobG9uZyljdXJsX2dldGRhdGUod2hhdCwgJm5vdyk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmKCFjby0+bmFtZSkgewogICAgICAgICAgICBjby0+bmFtZSA9IHN0cmR1cChuYW1lKTsKICAgICAgICAgICAgY28tPnZhbHVlID0gc3RyZHVwKHdoYXRwdHIpOwogICAgICAgICAgICBpZighY28tPm5hbWUgfHwgIWNvLT52YWx1ZSkgewogICAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIC8qCiAgICAgICAgICAgIGVsc2UgdGhpcyBpcyB0aGUgc2Vjb25kIChvciBtb3JlKSBuYW1lIHdlIGRvbid0IGtub3cKICAgICAgICAgICAgYWJvdXQhICovCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgLyogdGhpcyBpcyBhbiAiaWxsZWdhbCIgPHdoYXQ+PTx0aGlzPiBwYWlyICovCiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGlmKHNzY2FuZihwdHIsICIlIiBNQVhfQ09PS0lFX0xJTkVfVFhUICJbXjtcclxuXSIsCiAgICAgICAgICAgICAgICAgIHdoYXQpKSB7CiAgICAgICAgICBpZihzdHJlcXVhbCgic2VjdXJlIiwgd2hhdCkpCiAgICAgICAgICAgIGNvLT5zZWN1cmUgPSBUUlVFOwogICAgICAgICAgLyogZWxzZSwKICAgICAgICAgICAgIHVuc3VwcG9ydGVkIGtleXdvcmQgd2l0aG91dCBhc3NpZ24hICovCgogICAgICAgIH0KICAgICAgfQogICAgICBpZighc2VtaXB0ciB8fCAhKnNlbWlwdHIpIHsKICAgICAgICAvKiB3ZSBhbHJlYWR5IGtub3cgdGhlcmUgYXJlIG5vIG1vcmUgY29va2llcyAqLwogICAgICAgIHNlbWlwdHIgPSBOVUxMOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICBwdHI9c2VtaXB0cisxOwogICAgICB3aGlsZShwdHIgJiYgKnB0ciAmJiBteV9pc3NwYWNlKCpwdHIpKQogICAgICAgIHB0cisrOwogICAgICBzZW1pcHRyPXN0cmNocihwdHIsICc7Jyk7IC8qIG5vdywgZmluZCB0aGUgbmV4dCBzZW1pY29sb24gKi8KCiAgICAgIGlmKCFzZW1pcHRyICYmICpwdHIpCiAgICAgICAgLyogVGhlcmUgYXJlIG5vIG1vcmUgc2VtaWNvbG9ucywgYnV0IHRoZXJlJ3MgYSBmaW5hbCBuYW1lPXZhbHVlIHBhaXIKICAgICAgICAgICBjb21pbmcgdXAgKi8KICAgICAgICBzZW1pcHRyPXN0cmNocihwdHIsICdcMCcpOwogICAgfSB3aGlsZShzZW1pcHRyKTsKCiAgICBpZighYmFkY29va2llICYmICFjby0+ZG9tYWluKSB7CiAgICAgIGlmKGRvbWFpbikgewogICAgICAgIC8qIG5vIGRvbWFpbiB3YXMgZ2l2ZW4gaW4gdGhlIGhlYWRlciBsaW5lLCBzZXQgdGhlIGRlZmF1bHQgKi8KICAgICAgICBjby0+ZG9tYWluPXN0cmR1cChkb21haW4pOwogICAgICAgIGlmKCFjby0+ZG9tYWluKQogICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgfQogICAgfQoKICAgIGlmKCFiYWRjb29raWUgJiYgIWNvLT5wYXRoICYmIHBhdGgpIHsKICAgICAgLyogbm8gcGF0aCB3YXMgZ2l2ZW4gaW4gdGhlIGhlYWRlciBsaW5lLCBzZXQgdGhlIGRlZmF1bHQgICovCiAgICAgIGNoYXIgKmVuZHNsYXNoID0gc3RycmNocihwYXRoLCAnLycpOwogICAgICBpZihlbmRzbGFzaCkgewogICAgICAgIHNpemVfdCBwYXRobGVuID0gZW5kc2xhc2gtcGF0aCsxOyAvKiBpbmNsdWRlIHRoZSBlbmRpbmcgc2xhc2ggKi8KICAgICAgICBjby0+cGF0aD1tYWxsb2MocGF0aGxlbisxKTsgLyogb25lIGV4dHJhIGZvciB0aGUgemVybyBieXRlICovCiAgICAgICAgaWYoY28tPnBhdGgpIHsKICAgICAgICAgIG1lbWNweShjby0+cGF0aCwgcGF0aCwgcGF0aGxlbik7CiAgICAgICAgICBjby0+cGF0aFtwYXRobGVuXT0wOyAvKiB6ZXJvIHRlcm1pbmF0ZSAqLwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICB9CiAgICB9CgogICAgZnJlZSh3aGF0KTsKCiAgICBpZihiYWRjb29raWUgfHwgIWNvLT5uYW1lKSB7CiAgICAgIC8qIHdlIGRpZG4ndCBnZXQgYSBjb29raWUgbmFtZSBvciBhIGJhZCBvbmUsCiAgICAgICAgIHRoaXMgaXMgYW4gaWxsZWdhbCBsaW5lLCBiYWlsIG91dCAqLwogICAgICBmcmVlY29va2llKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogIH0KICBlbHNlIHsKICAgIC8qIFRoaXMgbGluZSBpcyBOT1QgYSBIVFRQIGhlYWRlciBzdHlsZSBsaW5lLCB3ZSBkbyBvZmZlciBzdXBwb3J0IGZvcgogICAgICAgcmVhZGluZyB0aGUgb2RkIG5ldHNjYXBlIGNvb2tpZXMtZmlsZSBmb3JtYXQgaGVyZSAqLwogICAgY2hhciAqZmlyc3RwdHI7CiAgICBjaGFyICp0b2tfYnVmOwogICAgaW50IGZpZWxkczsKCiAgICBpZihsaW5lcHRyWzBdPT0nIycpIHsKICAgICAgLyogZG9uJ3QgZXZlbiB0cnkgdGhlIGNvbW1lbnRzICovCiAgICAgIGZyZWUoY28pOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIC8qIHN0cmlwIG9mZiB0aGUgcG9zc2libGUgZW5kLW9mLWxpbmUgY2hhcmFjdGVycyAqLwogICAgcHRyPXN0cmNocihsaW5lcHRyLCAnXHInKTsKICAgIGlmKHB0cikKICAgICAgKnB0cj0wOyAvKiBjbGVhciBpdCAqLwogICAgcHRyPXN0cmNocihsaW5lcHRyLCAnXG4nKTsKICAgIGlmKHB0cikKICAgICAgKnB0cj0wOyAvKiBjbGVhciBpdCAqLwoKICAgIGZpcnN0cHRyPXN0cnRva19yKGxpbmVwdHIsICJcdCIsICZ0b2tfYnVmKTsgLyogdG9rZW5pemUgaXQgb24gdGhlIFRBQiAqLwoKICAgIC8qIEhlcmUncyBhIHF1aWNrIGNoZWNrIHRvIGVsaW1pbmF0ZSBub3JtYWwgSFRUUC1oZWFkZXJzIGZyb20gdGhpcyAqLwogICAgaWYoIWZpcnN0cHRyIHx8IHN0cmNocihmaXJzdHB0ciwgJzonKSkgewogICAgICBmcmVlKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgLyogTm93IGxvb3AgdGhyb3VnaCB0aGUgZmllbGRzIGFuZCBpbml0IHRoZSBzdHJ1Y3Qgd2UgYWxyZWFkeSBoYXZlCiAgICAgICBhbGxvY2F0ZWQgKi8KICAgIGZvcihwdHI9Zmlyc3RwdHIsIGZpZWxkcz0wOyBwdHIgJiYgIWJhZGNvb2tpZTsKICAgICAgICBwdHI9c3RydG9rX3IoTlVMTCwgIlx0IiwgJnRva19idWYpLCBmaWVsZHMrKykgewogICAgICBzd2l0Y2goZmllbGRzKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBpZihwdHJbMF09PScuJykgLyogc2tpcCBwcmVjZWVkaW5nIGRvdHMgKi8KICAgICAgICAgIHB0cisrOwogICAgICAgIGNvLT5kb21haW4gPSBzdHJkdXAocHRyKTsKICAgICAgICBpZighY28tPmRvbWFpbikKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMToKICAgICAgICAvKiBUaGlzIGZpZWxkIGdvdCBpdHMgZXhwbGFuYXRpb24gb24gdGhlIDIzcmQgb2YgTWF5IDIwMDEgYnkKICAgICAgICAgICBBbmRy6XMgR2FyY+1hOgoKICAgICAgICAgICBmbGFnOiBBIFRSVUUvRkFMU0UgdmFsdWUgaW5kaWNhdGluZyBpZiBhbGwgbWFjaGluZXMgd2l0aGluIGEgZ2l2ZW4KICAgICAgICAgICBkb21haW4gY2FuIGFjY2VzcyB0aGUgdmFyaWFibGUuIFRoaXMgdmFsdWUgaXMgc2V0IGF1dG9tYXRpY2FsbHkgYnkKICAgICAgICAgICB0aGUgYnJvd3NlciwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSB5b3Ugc2V0IGZvciB0aGUgZG9tYWluLgoKICAgICAgICAgICBBcyBmYXIgYXMgSSBjYW4gc2VlLCBpdCBpcyBzZXQgdG8gdHJ1ZSB3aGVuIHRoZSBjb29raWUgc2F5cwogICAgICAgICAgIC5kb21haW4uY29tIGFuZCB0byBmYWxzZSB3aGVuIHRoZSBkb21haW4gaXMgY29tcGxldGUgd3d3LmRvbWFpbi5jb20KICAgICAgICAqLwogICAgICAgIGNvLT50YWlsbWF0Y2g9KGJvb2wpc3RyZXF1YWwocHRyLCAiVFJVRSIpOyAvKiBzdG9yZSBpbmZvcm1hdGlvbiAqLwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDI6CiAgICAgICAgLyogSXQgdHVybnMgb3V0LCB0aGF0IHNvbWV0aW1lcyB0aGUgZmlsZSBmb3JtYXQgYWxsb3dzIHRoZSBwYXRoCiAgICAgICAgICAgZmllbGQgdG8gcmVtYWluIG5vdCBmaWxsZWQgaW4sIHdlIHRyeSB0byBkZXRlY3QgdGhpcyBhbmQgd29yawogICAgICAgICAgIGFyb3VuZCBpdCEgQW5kculzIEdhcmPtYSBtYWRlIHVzIGF3YXJlIG9mIHRoaXMuLi4gKi8KICAgICAgICBpZiAoc3RyY21wKCJUUlVFIiwgcHRyKSAmJiBzdHJjbXAoIkZBTFNFIiwgcHRyKSkgewogICAgICAgICAgLyogb25seSBpZiB0aGUgcGF0aCBkb2Vzbid0IGxvb2sgbGlrZSBhIGJvb2xlYW4gb3B0aW9uISAqLwogICAgICAgICAgY28tPnBhdGggPSBzdHJkdXAocHRyKTsKICAgICAgICAgIGlmKCFjby0+cGF0aCkKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvKiB0aGlzIGRvZXNuJ3QgbG9vayBsaWtlIGEgcGF0aCwgbWFrZSBvbmUgdXAhICovCiAgICAgICAgY28tPnBhdGggPSBzdHJkdXAoIi8iKTsKICAgICAgICBpZighY28tPnBhdGgpCiAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgIGZpZWxkcysrOyAvKiBhZGQgYSBmaWVsZCBhbmQgZmFsbCBkb3duIHRvIHNlY3VyZSAqLwogICAgICAgIC8qIEZBTExUSFJPVUdIICovCiAgICAgIGNhc2UgMzoKICAgICAgICBjby0+c2VjdXJlID0gKGJvb2wpc3RyZXF1YWwocHRyLCAiVFJVRSIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDQ6CiAgICAgICAgY28tPmV4cGlyZXMgPSBhdG9pKHB0cik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNToKICAgICAgICBjby0+bmFtZSA9IHN0cmR1cChwdHIpOwogICAgICAgIGlmKCFjby0+bmFtZSkKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNjoKICAgICAgICBjby0+dmFsdWUgPSBzdHJkdXAocHRyKTsKICAgICAgICBpZighY28tPnZhbHVlKQogICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYoNiA9PSBmaWVsZHMpIHsKICAgICAgLyogd2UgZ290IGEgY29va2llIHdpdGggYmxhbmsgY29udGVudHMsIGZpeCBpdCAqLwogICAgICBjby0+dmFsdWUgPSBzdHJkdXAoIiIpOwogICAgICBpZighY28tPnZhbHVlKQogICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgIGVsc2UKICAgICAgICBmaWVsZHMrKzsKICAgIH0KCiAgICBpZighYmFkY29va2llICYmICg3ICE9IGZpZWxkcykpCiAgICAgIC8qIHdlIGRpZCBub3QgZmluZCB0aGUgc3VmZmljaWVudCBudW1iZXIgb2YgZmllbGRzICovCiAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CgogICAgaWYoYmFkY29va2llKSB7CiAgICAgIGZyZWVjb29raWUoY28pOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgfQoKICBpZighYy0+cnVubmluZyAmJiAgICAvKiByZWFkIGZyb20gYSBmaWxlICovCiAgICAgYy0+bmV3c2Vzc2lvbiAmJiAgLyogY2xlYW4gc2Vzc2lvbiBjb29raWVzICovCiAgICAgIWNvLT5leHBpcmVzKSB7ICAgLyogdGhpcyBpcyBhIHNlc3Npb24gY29va2llIHNpbmNlIGl0IGRvZXNuJ3QgZXhwaXJlISAqLwogICAgZnJlZWNvb2tpZShjbyk7CiAgICByZXR1cm4gTlVMTDsKICB9CgogIGNvLT5saXZlY29va2llID0gYy0+cnVubmluZzsKCiAgLyogbm93LCB3ZSBoYXZlIHBhcnNlZCB0aGUgaW5jb21pbmcgbGluZSwgd2UgbXVzdCBub3cgY2hlY2sgaWYgdGhpcwogICAgIHN1cGVyY2VlZHMgYW4gYWxyZWFkeSBleGlzdGluZyBjb29raWUsIHdoaWNoIGl0IG1heSBpZiB0aGUgcHJldmlvdXMgaGF2ZQogICAgIHRoZSBzYW1lIGRvbWFpbiBhbmQgcGF0aCBhcyB0aGlzICovCgogIGNsaXN0ID0gYy0+Y29va2llczsKICByZXBsYWNlX29sZCA9IEZBTFNFOwogIHdoaWxlKGNsaXN0KSB7CiAgICBpZihzdHJlcXVhbChjbGlzdC0+bmFtZSwgY28tPm5hbWUpKSB7CiAgICAgIC8qIHRoZSBuYW1lcyBhcmUgaWRlbnRpY2FsICovCgogICAgICBpZihjbGlzdC0+ZG9tYWluICYmIGNvLT5kb21haW4pIHsKICAgICAgICBpZihzdHJlcXVhbChjbGlzdC0+ZG9tYWluLCBjby0+ZG9tYWluKSkKICAgICAgICAgIC8qIFRoZSBkb21haW5zIGFyZSBpZGVudGljYWwgKi8KICAgICAgICAgIHJlcGxhY2Vfb2xkPVRSVUU7CiAgICAgIH0KICAgICAgZWxzZSBpZighY2xpc3QtPmRvbWFpbiAmJiAhY28tPmRvbWFpbikKICAgICAgICByZXBsYWNlX29sZCA9IFRSVUU7CgogICAgICBpZihyZXBsYWNlX29sZCkgewogICAgICAgIC8qIHRoZSBkb21haW5zIHdlcmUgaWRlbnRpY2FsICovCgogICAgICAgIGlmKGNsaXN0LT5wYXRoICYmIGNvLT5wYXRoKSB7CiAgICAgICAgICBpZihzdHJlcXVhbChjbGlzdC0+cGF0aCwgY28tPnBhdGgpKSB7CiAgICAgICAgICAgIHJlcGxhY2Vfb2xkID0gVFJVRTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgICAgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZighY2xpc3QtPnBhdGggJiYgIWNvLT5wYXRoKQogICAgICAgICAgcmVwbGFjZV9vbGQgPSBUUlVFOwogICAgICAgIGVsc2UKICAgICAgICAgIHJlcGxhY2Vfb2xkID0gRkFMU0U7CgogICAgICB9CgogICAgICBpZihyZXBsYWNlX29sZCAmJiAhY28tPmxpdmVjb29raWUgJiYgY2xpc3QtPmxpdmVjb29raWUpIHsKICAgICAgICAvKiBCb3RoIGNvb2tpZXMgbWF0Y2hlZCBmaW5lLCBleGNlcHQgdGhhdCB0aGUgYWxyZWFkeSBwcmVzZW50CiAgICAgICAgICAgY29va2llIGlzICJsaXZlIiwgd2hpY2ggbWVhbnMgaXQgd2FzIHNldCBmcm9tIGEgaGVhZGVyLCB3aGlsZQogICAgICAgICAgIHRoZSBuZXcgb25lIGlzbid0ICJsaXZlIiBhbmQgdGh1cyBvbmx5IHJlYWQgZnJvbSBhIGZpbGUuIFdlIGxldAogICAgICAgICAgIGxpdmUgY29va2llcyBzdGF5IGFsaXZlICovCgogICAgICAgIC8qIEZyZWUgdGhlIG5ld2NvbWVyIGFuZCBnZXQgb3V0IG9mIGhlcmUhICovCiAgICAgICAgZnJlZWNvb2tpZShjbyk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgIH0KCiAgICAgIGlmKHJlcGxhY2Vfb2xkKSB7CiAgICAgICAgY28tPm5leHQgPSBjbGlzdC0+bmV4dDsgLyogZ2V0IHRoZSBuZXh0LXBvaW50ZXIgZmlyc3QgKi8KCiAgICAgICAgLyogdGhlbiBmcmVlIGFsbCB0aGUgb2xkIHBvaW50ZXJzICovCiAgICAgICAgaWYoY2xpc3QtPm5hbWUpCiAgICAgICAgICBmcmVlKGNsaXN0LT5uYW1lKTsKICAgICAgICBpZihjbGlzdC0+dmFsdWUpCiAgICAgICAgICBmcmVlKGNsaXN0LT52YWx1ZSk7CiAgICAgICAgaWYoY2xpc3QtPmRvbWFpbikKICAgICAgICAgIGZyZWUoY2xpc3QtPmRvbWFpbik7CiAgICAgICAgaWYoY2xpc3QtPnBhdGgpCiAgICAgICAgICBmcmVlKGNsaXN0LT5wYXRoKTsKICAgICAgICBpZihjbGlzdC0+ZXhwaXJlc3RyKQogICAgICAgICAgZnJlZShjbGlzdC0+ZXhwaXJlc3RyKTsKCiAgICAgICAgaWYoY2xpc3QtPnZlcnNpb24pCiAgICAgICAgICBmcmVlKGNsaXN0LT52ZXJzaW9uKTsKICAgICAgICBpZihjbGlzdC0+bWF4YWdlKQogICAgICAgICAgZnJlZShjbGlzdC0+bWF4YWdlKTsKCiAgICAgICAgKmNsaXN0ID0gKmNvOyAgLyogdGhlbiBzdG9yZSBhbGwgdGhlIG5ldyBkYXRhICovCgogICAgICAgIGZyZWUoY28pOyAgIC8qIGZyZWUgdGhlIG5ld2x5IGFsbG9jZWQgbWVtb3J5ICovCiAgICAgICAgY28gPSBjbGlzdDsgLyogcG9pbnQgdG8gdGhlIHByZXZpb3VzIHN0cnVjdCBpbnN0ZWFkICovCgogICAgICAgIC8qIFdlIGhhdmUgcmVwbGFjZWQgYSBjb29raWUsIG5vdyBza2lwIHRoZSByZXN0IG9mIHRoZSBsaXN0IGJ1dAogICAgICAgICAgIG1ha2Ugc3VyZSB0aGUgJ2xhc3RjJyBwb2ludGVyIGlzIHByb3Blcmx5IHNldCAqLwogICAgICAgIGRvIHsKICAgICAgICAgIGxhc3RjID0gY2xpc3Q7CiAgICAgICAgICBjbGlzdCA9IGNsaXN0LT5uZXh0OwogICAgICAgIH0gd2hpbGUoY2xpc3QpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBsYXN0YyA9IGNsaXN0OwogICAgY2xpc3QgPSBjbGlzdC0+bmV4dDsKICB9CgogIGlmKGMtPnJ1bm5pbmcpCiAgICAvKiBPbmx5IHNob3cgdGhpcyB3aGVuIE5PVCByZWFkaW5nIHRoZSBjb29raWVzIGZyb20gYSBmaWxlICovCiAgICBpbmZvZihkYXRhLCAiJXMgY29va2llICVzPVwiJXNcIiBmb3IgZG9tYWluICVzLCBwYXRoICVzLCBleHBpcmUgJWRcbiIsCiAgICAgICAgICByZXBsYWNlX29sZD8iUmVwbGFjZWQiOiJBZGRlZCIsIGNvLT5uYW1lLCBjby0+dmFsdWUsCiAgICAgICAgICBjby0+ZG9tYWluLCBjby0+cGF0aCwgY28tPmV4cGlyZXMpOwoKICBpZighcmVwbGFjZV9vbGQpIHsKICAgIC8qIHRoZW4gbWFrZSB0aGUgbGFzdCBpdGVtIHBvaW50IG9uIHRoaXMgbmV3IG9uZSAqLwogICAgaWYobGFzdGMpCiAgICAgIGxhc3RjLT5uZXh0ID0gY287CiAgICBlbHNlCiAgICAgIGMtPmNvb2tpZXMgPSBjbzsKICB9CgogIGMtPm51bWNvb2tpZXMrKzsgLyogb25lIG1vcmUgY29va2llIGluIHRoZSBqYXIgKi8KICByZXR1cm4gY287Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9pbml0KCkKICoKICogSW5pdHMgYSBjb29raWUgc3RydWN0IHRvIHJlYWQgZGF0YSBmcm9tIGEgbG9jYWwgZmlsZS4gVGhpcyBpcyBhbHdheXMKICogY2FsbGVkIGJlZm9yZSBhbnkgY29va2llcyBhcmUgc2V0LiBGaWxlIG1heSBiZSBOVUxMLgogKgogKiBJZiAnbmV3c2Vzc2lvbicgaXMgVFJVRSwgZGlzY2FyZCBhbGwgInNlc3Npb24gY29va2llcyIgb24gcmVhZCBmcm9tIGZpbGUuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgQ29va2llSW5mbyAqQ3VybF9jb29raWVfaW5pdChzdHJ1Y3QgU2Vzc2lvbkhhbmRsZSAqZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENvb2tpZUluZm8gKmluYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZXdzZXNzaW9uKQp7CiAgc3RydWN0IENvb2tpZUluZm8gKmM7CiAgRklMRSAqZnA7CiAgYm9vbCBmcm9tZmlsZT1UUlVFOwoKICBpZihOVUxMID09IGluYykgewogICAgLyogd2UgZGlkbid0IGdldCBhIHN0cnVjdCwgY3JlYXRlIG9uZSAqLwogICAgYyA9IChzdHJ1Y3QgQ29va2llSW5mbyAqKWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IENvb2tpZUluZm8pKTsKICAgIGlmKCFjKQogICAgICByZXR1cm4gTlVMTDsgLyogZmFpbGVkIHRvIGdldCBtZW1vcnkgKi8KICAgIGMtPmZpbGVuYW1lID0gc3RyZHVwKGZpbGU/ZmlsZToibm9uZSIpOyAvKiBjb3B5IHRoZSBuYW1lIGp1c3QgaW4gY2FzZSAqLwogIH0KICBlbHNlIHsKICAgIC8qIHdlIGdvdCBhbiBhbHJlYWR5IGV4aXN0aW5nIG9uZSwgdXNlIHRoYXQgKi8KICAgIGMgPSBpbmM7CiAgfQogIGMtPnJ1bm5pbmcgPSBGQUxTRTsgLyogdGhpcyBpcyBub3QgcnVubmluZywgdGhpcyBpcyBpbml0ICovCgogIGlmKGZpbGUgJiYgc3RyZXF1YWwoZmlsZSwgIi0iKSkgewogICAgZnAgPSBzdGRpbjsKICAgIGZyb21maWxlPUZBTFNFOwogIH0KICBlbHNlIGlmKGZpbGUgJiYgISpmaWxlKSB7CiAgICAvKiBwb2ludHMgdG8gYSAiIiBzdHJpbmcgKi8KICAgIGZwID0gTlVMTDsKICB9CiAgZWxzZQogICAgZnAgPSBmaWxlP2ZvcGVuKGZpbGUsICJyIik6TlVMTDsKCiAgYy0+bmV3c2Vzc2lvbiA9IG5ld3Nlc3Npb247IC8qIG5ldyBzZXNzaW9uPyAqLwoKICBpZihmcCkgewogICAgY2hhciAqbGluZXB0cjsKICAgIGJvb2wgaGVhZGVybGluZTsKCiAgICBjaGFyICpsaW5lID0gKGNoYXIgKiltYWxsb2MoTUFYX0NPT0tJRV9MSU5FKTsKICAgIGlmKGxpbmUpIHsKICAgICAgd2hpbGUoZmdldHMobGluZSwgTUFYX0NPT0tJRV9MSU5FLCBmcCkpIHsKICAgICAgICBpZihjaGVja3ByZWZpeCgiU2V0LUNvb2tpZToiLCBsaW5lKSkgewogICAgICAgICAgLyogVGhpcyBpcyBhIGNvb2tpZSBsaW5lLCBnZXQgaXQhICovCiAgICAgICAgICBsaW5lcHRyPSZsaW5lWzExXTsKICAgICAgICAgIGhlYWRlcmxpbmU9VFJVRTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBsaW5lcHRyPWxpbmU7CiAgICAgICAgICBoZWFkZXJsaW5lPUZBTFNFOwogICAgICAgIH0KICAgICAgICB3aGlsZSgqbGluZXB0ciAmJiBteV9pc3NwYWNlKCpsaW5lcHRyKSkKICAgICAgICAgIGxpbmVwdHIrKzsKCiAgICAgICAgQ3VybF9jb29raWVfYWRkKGRhdGEsIGMsIGhlYWRlcmxpbmUsIGxpbmVwdHIsIE5VTEwsIE5VTEwpOwogICAgICB9CiAgICAgIGZyZWUobGluZSk7IC8qIGZyZWUgdGhlIGxpbmUgYnVmZmVyICovCiAgICB9CiAgICBpZihmcm9tZmlsZSkKICAgICAgZmNsb3NlKGZwKTsKICB9CgogIGMtPnJ1bm5pbmcgPSBUUlVFOyAgICAgICAgICAvKiBub3csIHdlJ3JlIHJ1bm5pbmcgKi8KCiAgcmV0dXJuIGM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9nZXRsaXN0KCkKICoKICogRm9yIGEgZ2l2ZW4gaG9zdCBhbmQgcGF0aCwgcmV0dXJuIGEgbGlua2VkIGxpc3Qgb2YgY29va2llcyB0aGF0IHRoZQogKiBjbGllbnQgc2hvdWxkIHNlbmQgdG8gdGhlIHNlcnZlciBpZiB1c2VkIG5vdy4gVGhlIHNlY3VyZSBib29sZWFuIGluZm9ybXMKICogdGhlIGNvb2tpZSBpZiBhIHNlY3VyZSBjb25uZWN0aW9uIGlzIGFjaGlldmVkIG9yIG5vdC4KICoKICogSXQgc2hhbGwgb25seSByZXR1cm4gY29va2llcyB0aGF0IGhhdmVuJ3QgZXhwaXJlZC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdHJ1Y3QgQ29va2llICpDdXJsX2Nvb2tpZV9nZXRsaXN0KHN0cnVjdCBDb29raWVJbmZvICpjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmhvc3QsIGNoYXIgKnBhdGgsIGJvb2wgc2VjdXJlKQp7CiAgIHN0cnVjdCBDb29raWUgKm5ld2NvOwogICBzdHJ1Y3QgQ29va2llICpjbzsKICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CiAgIHN0cnVjdCBDb29raWUgKm1haW5jbz1OVUxMOwoKICAgaWYoIWMgfHwgIWMtPmNvb2tpZXMpCiAgICAgIHJldHVybiBOVUxMOyAvKiBubyBjb29raWUgc3RydWN0IG9yIG5vIGNvb2tpZXMgaW4gdGhlIHN0cnVjdCAqLwoKICAgY28gPSBjLT5jb29raWVzOwoKICAgd2hpbGUoY28pIHsKICAgICAvKiBvbmx5IHByb2Nlc3MgdGhpcyBjb29raWUgaWYgaXQgaXMgbm90IGV4cGlyZWQgb3IgaGFkIG5vIGV4cGlyZQogICAgICAgIGRhdGUgQU5EIHRoYXQgaWYgdGhlIGNvb2tpZSByZXF1aXJlcyB3ZSdyZSBzZWN1cmUgd2UgbXVzdCBvbmx5CiAgICAgICAgY29udGludWUgaWYgd2UgYXJlISAqLwogICAgIGlmKCAoY28tPmV4cGlyZXM8PTAgfHwgKGNvLT5leHBpcmVzPiBub3cpKSAmJgogICAgICAgICAoY28tPnNlY3VyZT9zZWN1cmU6VFJVRSkgKSB7CgogICAgICAgLyogbm93IGNoZWNrIGlmIHRoZSBkb21haW4gaXMgY29ycmVjdCAqLwogICAgICAgaWYoIWNvLT5kb21haW4gfHwKICAgICAgICAgIChjby0+dGFpbG1hdGNoICYmIHRhaWxtYXRjaChjby0+ZG9tYWluLCBob3N0KSkgfHwKICAgICAgICAgICghY28tPnRhaWxtYXRjaCAmJiBzdHJlcXVhbChob3N0LCBjby0+ZG9tYWluKSkgKSB7CiAgICAgICAgIC8qIHRoZSByaWdodCBwYXJ0IG9mIHRoZSBob3N0IG1hdGNoZXMgdGhlIGRvbWFpbiBzdHVmZiBpbiB0aGUKICAgICAgICAgICAgY29va2llIGRhdGEgKi8KCiAgICAgICAgIC8qIG5vdyBjaGVjayB0aGUgbGVmdCBwYXJ0IG9mIHRoZSBwYXRoIHdpdGggdGhlIGNvb2tpZXMgcGF0aAogICAgICAgICAgICByZXF1aXJlbWVudCAqLwogICAgICAgICBpZighY28tPnBhdGggfHwKICAgICAgICAgICAgY2hlY2twcmVmaXgoY28tPnBhdGgsIHBhdGgpICkgewoKICAgICAgICAgICAvKiBhbmQgbm93LCB3ZSBrbm93IHRoaXMgaXMgYSBtYXRjaCBhbmQgd2Ugc2hvdWxkIGNyZWF0ZSBhbgogICAgICAgICAgICAgIGVudHJ5IGZvciB0aGUgcmV0dXJuLWxpbmtlZC1saXN0ICovCgogICAgICAgICAgIG5ld2NvID0gKHN0cnVjdCBDb29raWUgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBDb29raWUpKTsKICAgICAgICAgICBpZihuZXdjbykgewogICAgICAgICAgICAgLyogZmlyc3QsIGNvcHkgdGhlIHdob2xlIHNvdXJjZSBjb29raWU6ICovCiAgICAgICAgICAgICBtZW1jcHkobmV3Y28sIGNvLCBzaXplb2Yoc3RydWN0IENvb2tpZSkpOwoKICAgICAgICAgICAgIC8qIHRoZW4gbW9kaWZ5IG91ciBuZXh0ICovCiAgICAgICAgICAgICBuZXdjby0+bmV4dCA9IG1haW5jbzsKCiAgICAgICAgICAgICAvKiBwb2ludCB0aGUgbWFpbiB0byB1cyAqLwogICAgICAgICAgICAgbWFpbmNvID0gbmV3Y287CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIC8qIGZhaWx1cmUsIGNsZWFyIHVwIHRoZSBhbGxvY2F0ZWQgY2hhaW4gYW5kIHJldHVybiBOVUxMICovCiAgICAgICAgICAgICB3aGlsZShtYWluY28pIHsKICAgICAgICAgICAgICAgY28gPSBtYWluY28tPm5leHQ7CiAgICAgICAgICAgICAgIGZyZWUobWFpbmNvKTsKICAgICAgICAgICAgICAgbWFpbmNvID0gY287CiAgICAgICAgICAgICB9CgogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICAgIGNvID0gY28tPm5leHQ7CiAgIH0KCiAgIHJldHVybiBtYWluY287IC8qIHJldHVybiB0aGUgbmV3IGxpc3QgKi8KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9mcmVlbGlzdCgpCiAqCiAqIEZyZWUgYSBsaXN0IG9mIGNvb2tpZXMgcHJldmlvdXNseSByZXR1cm5lZCBieSBDdXJsX2Nvb2tpZV9nZXRsaXN0KCk7CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBDdXJsX2Nvb2tpZV9mcmVlbGlzdChzdHJ1Y3QgQ29va2llICpjbykKewogICBzdHJ1Y3QgQ29va2llICpuZXh0OwogICBpZihjbykgewogICAgICB3aGlsZShjbykgewogICAgICAgICBuZXh0ID0gY28tPm5leHQ7CiAgICAgICAgIGZyZWUoY28pOyAvKiB3ZSBvbmx5IGZyZWUgdGhlIHN0cnVjdCBzaW5jZSB0aGUgIm1lbWJlcnMiIGFyZSBhbGwKICAgICAgICAgICAgICAgICAgICAgIGp1c3QgY29waWVkISAqLwogICAgICAgICBjbyA9IG5leHQ7CiAgICAgIH0KICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfY2xlYW51cCgpCiAqCiAqIEZyZWUgYSAiY29va2llIG9iamVjdCIgcHJldmlvdXMgY3JlYXRlZCB3aXRoIGNvb2tpZV9pbml0KCkuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEN1cmxfY29va2llX2NsZWFudXAoc3RydWN0IENvb2tpZUluZm8gKmMpCnsKICAgc3RydWN0IENvb2tpZSAqY287CiAgIHN0cnVjdCBDb29raWUgKm5leHQ7CiAgIGlmKGMpIHsKICAgICAgaWYoYy0+ZmlsZW5hbWUpCiAgICAgICAgIGZyZWUoYy0+ZmlsZW5hbWUpOwogICAgICBjbyA9IGMtPmNvb2tpZXM7CgogICAgICB3aGlsZShjbykgewogICAgICAgICBuZXh0ID0gY28tPm5leHQ7CiAgICAgICAgIGZyZWVjb29raWUoY28pOwogICAgICAgICBjbyA9IG5leHQ7CiAgICAgIH0KICAgICAgZnJlZShjKTsgLyogZnJlZSB0aGUgYmFzZSBzdHJ1Y3QgYXMgd2VsbCAqLwogICB9Cn0KCi8qCiAqIEN1cmxfY29va2llX291dHB1dCgpCiAqCiAqIFdyaXRlcyBhbGwgaW50ZXJuYWxseSBrbm93biBjb29raWVzIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4gU3BlY2lmeQogKiAiLSIgYXMgZmlsZSBuYW1lIHRvIHdyaXRlIHRvIHN0ZG91dC4KICoKICogVGhlIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gb24gd3JpdGUgZmFpbHVyZS4KICovCmludCBDdXJsX2Nvb2tpZV9vdXRwdXQoc3RydWN0IENvb2tpZUluZm8gKmMsIGNoYXIgKmR1bXBoZXJlKQp7CiAgc3RydWN0IENvb2tpZSAqY287CiAgRklMRSAqb3V0OwogIGJvb2wgdXNlX3N0ZG91dD1GQUxTRTsKCiAgaWYoKE5VTEwgPT0gYykgfHwgKDAgPT0gYy0+bnVtY29va2llcykpCiAgICAvKiBJZiB0aGVyZSBhcmUgbm8ga25vd24gY29va2llcywgd2UgZG9uJ3Qgd3JpdGUgb3IgZXZlbiBjcmVhdGUgYW55CiAgICAgICBkZXN0aW5hdGlvbiBmaWxlICovCiAgICByZXR1cm4gMDsKCiAgaWYoc3RyZXF1YWwoIi0iLCBkdW1waGVyZSkpIHsKICAgIC8qIHVzZSBzdGRvdXQgKi8KICAgIG91dCA9IHN0ZG91dDsKICAgIHVzZV9zdGRvdXQ9VFJVRTsKICB9CiAgZWxzZSB7CiAgICBvdXQgPSBmb3BlbihkdW1waGVyZSwgInciKTsKICAgIGlmKCFvdXQpCiAgICAgIHJldHVybiAxOyAvKiBmYWlsdXJlICovCiAgfQoKICBpZihjKSB7CiAgICBmcHV0cygiIyBOZXRzY2FwZSBIVFRQIENvb2tpZSBGaWxlXG4iCiAgICAgICAgICAiIyBodHRwOi8vd3d3Lm5ldHNjYXBlLmNvbS9uZXdzcmVmL3N0ZC9jb29raWVfc3BlYy5odG1sXG4iCiAgICAgICAgICAiIyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBsaWJjdXJsISBFZGl0IGF0IHlvdXIgb3duIHJpc2suXG5cbiIsCiAgICAgICAgICBvdXQpOwogICAgY28gPSBjLT5jb29raWVzOwoKICAgIHdoaWxlKGNvKSB7CiAgICAgIGZwcmludGYob3V0LAogICAgICAgICAgICAgICIlcyVzXHQiIC8qIGRvbWFpbiAqLwogICAgICAgICAgICAgICIlc1x0IiAvKiB0YWlsbWF0Y2ggKi8KICAgICAgICAgICAgICAiJXNcdCIgLyogcGF0aCAqLwogICAgICAgICAgICAgICIlc1x0IiAvKiBzZWN1cmUgKi8KICAgICAgICAgICAgICAiJXVcdCIgLyogZXhwaXJlcyAqLwogICAgICAgICAgICAgICIlc1x0IiAvKiBuYW1lICovCiAgICAgICAgICAgICAgIiVzXG4iLCAvKiB2YWx1ZSAqLwoKICAgICAgICAgICAgICAvKiBNYWtlIHN1cmUgYWxsIGRvbWFpbnMgYXJlIHByZWZpeGVkIHdpdGggYSBkb3QgaWYgdGhleSBhbGxvdwogICAgICAgICAgICAgICAgIHRhaWxtYXRjaGluZy4gVGhpcyBpcyBNb3ppbGxhLXN0eWxlLiAqLwogICAgICAgICAgICAgIChjby0+dGFpbG1hdGNoICYmIGNvLT5kb21haW4gJiYgY28tPmRvbWFpblswXSAhPSAnLicpPyAiLiI6IiIsCiAgICAgICAgICAgICAgY28tPmRvbWFpbj9jby0+ZG9tYWluOiJ1bmtub3duIiwKICAgICAgICAgICAgICBjby0+dGFpbG1hdGNoPyJUUlVFIjoiRkFMU0UiLAogICAgICAgICAgICAgIGNvLT5wYXRoP2NvLT5wYXRoOiIvIiwKICAgICAgICAgICAgICBjby0+c2VjdXJlPyJUUlVFIjoiRkFMU0UiLAogICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpY28tPmV4cGlyZXMsCiAgICAgICAgICAgICAgY28tPm5hbWUsCiAgICAgICAgICAgICAgY28tPnZhbHVlP2NvLT52YWx1ZToiIik7CgogICAgICBjbz1jby0+bmV4dDsKICAgIH0KICB9CgogIGlmKCF1c2Vfc3Rkb3V0KQogICAgZmNsb3NlKG91dCk7CgogIHJldHVybiAwOwp9CgojZW5kaWYgLyogQ1VSTF9ESVNBQkxFX0hUVFAgfHwgQ1VSTF9ESVNBQkxFX0NPT0tJRVMgKi8K