LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfICAgXyBfX19fICBfCiAqICBQcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogKgogKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDExLCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCiAqIGFyZSBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvY29weXJpZ2h0Lmh0bWwuCiAqCiAqIFlvdSBtYXkgb3B0IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKICogZnVybmlzaGVkIHRvIGRvIHNvLCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENPUFlJTkcgZmlsZS4KICoKICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQogKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKgoKClJFQ0VJVklORyBDT09LSUUgSU5GT1JNQVRJT04KPT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RydWN0IENvb2tpZUluZm8gKmNvb2tpZV9pbml0KGNoYXIgKmZpbGUpOwoKICAgICAgICBJbml0cyBhIGNvb2tpZSBzdHJ1Y3QgdG8gc3RvcmUgZGF0YSBpbiBhIGxvY2FsIGZpbGUuIFRoaXMgaXMgYWx3YXlzCiAgICAgICAgY2FsbGVkIGJlZm9yZSBhbnkgY29va2llcyBhcmUgc2V0LgoKaW50IGNvb2tpZXNfc2V0KHN0cnVjdCBDb29raWVJbmZvICpjb29raWUsIGNoYXIgKmNvb2tpZV9saW5lKTsKCiAgICAgICAgVGhlICdjb29raWVfbGluZScgcGFyYW1ldGVyIGlzIGEgZnVsbCAiU2V0LWNvb2tpZToiIGxpbmUgYXMKICAgICAgICByZWNlaXZlZCBmcm9tIGEgc2VydmVyLgoKICAgICAgICBUaGUgZnVuY3Rpb24gbmVlZCB0byByZXBsYWNlIHByZXZpb3VzbHkgc3RvcmVkIGxpbmVzIHRoYXQgdGhpcyBuZXcKICAgICAgICBsaW5lIHN1cGVyY2VlZHMuCgogICAgICAgIEl0IG1heSByZW1vdmUgbGluZXMgdGhhdCBhcmUgZXhwaXJlZC4KCiAgICAgICAgSXQgc2hvdWxkIHJldHVybiBhbiBpbmRpY2F0aW9uIG9mIHN1Y2Nlc3MvZXJyb3IuCgoKU0VORElORyBDT09LSUUgSU5GT1JNQVRJT04KPT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0cnVjdCBDb29raWVzICpjb29raWVfZ2V0bGlzdChzdHJ1Y3QgQ29va2llSW5mbyAqY29va2llLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqaG9zdCwgY2hhciAqcGF0aCwgYm9vbCBzZWN1cmUpOwoKICAgICAgICBGb3IgYSBnaXZlbiBob3N0IGFuZCBwYXRoLCByZXR1cm4gYSBsaW5rZWQgbGlzdCBvZiBjb29raWVzIHRoYXQKICAgICAgICB0aGUgY2xpZW50IHNob3VsZCBzZW5kIHRvIHRoZSBzZXJ2ZXIgaWYgdXNlZCBub3cuIFRoZSBzZWN1cmUKICAgICAgICBib29sZWFuIGluZm9ybXMgdGhlIGNvb2tpZSBpZiBhIHNlY3VyZSBjb25uZWN0aW9uIGlzIGFjaGlldmVkIG9yCiAgICAgICAgbm90LgoKICAgICAgICBJdCBzaGFsbCBvbmx5IHJldHVybiBjb29raWVzIHRoYXQgaGF2ZW4ndCBleHBpcmVkLgoKCkV4YW1wbGUgc2V0IG9mIGNvb2tpZXM6CgogICAgU2V0LWNvb2tpZTogUFJPRFVDVElORk89d2VieHByZXNzOyBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6IFBFUlNPTkFMSVpFPW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS9mdGd3OyBzZWN1cmUKICAgIFNldC1jb29raWU6IEZpZEhpc3Q9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWRPcmRlcj1ub25lO2V4cGlyZXM9TW9uZGF5LCAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7CiAgICBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6IERpc1BlbmQ9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWREaXM9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOgogICAgU2Vzc2lvbl9LZXlANjc5MWE5ZTAtOTAxYS0xMWQwLWExYzgtOWIwMTJjODhhYTc3PW5vbmU7ZXhwaXJlcz1Nb25kYXksCiAgICAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7IGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQoqKioqLwoKCiNpbmNsdWRlICJzZXR1cC5oIgoKI2lmICFkZWZpbmVkKENVUkxfRElTQUJMRV9IVFRQKSAmJiAhZGVmaW5lZChDVVJMX0RJU0FCTEVfQ09PS0lFUykKCiNkZWZpbmUgX01QUklOVEZfUkVQTEFDRQojaW5jbHVkZSA8Y3VybC9tcHJpbnRmLmg+CgojaW5jbHVkZSAidXJsZGF0YS5oIgojaW5jbHVkZSAiY29va2llLmgiCiNpbmNsdWRlICJzdHJlcXVhbC5oIgojaW5jbHVkZSAic3RydG9rLmgiCiNpbmNsdWRlICJzZW5kZi5oIgojaW5jbHVkZSAiY3VybF9tZW1vcnkuaCIKI2luY2x1ZGUgInNoYXJlLmgiCiNpbmNsdWRlICJzdHJ0b29mZnQuaCIKI2luY2x1ZGUgInJhd3N0ci5oIgojaW5jbHVkZSAiY3VybF9tZW1yY2hyLmgiCgovKiBUaGUgbGFzdCAjaW5jbHVkZSBmaWxlIHNob3VsZCBiZTogKi8KI2luY2x1ZGUgIm1lbWRlYnVnLmgiCgpzdGF0aWMgdm9pZCBmcmVlY29va2llKHN0cnVjdCBDb29raWUgKmNvKQp7CiAgaWYoY28tPmV4cGlyZXN0cikKICAgIGZyZWUoY28tPmV4cGlyZXN0cik7CiAgaWYoY28tPmRvbWFpbikKICAgIGZyZWUoY28tPmRvbWFpbik7CiAgaWYoY28tPnBhdGgpCiAgICBmcmVlKGNvLT5wYXRoKTsKICBpZihjby0+bmFtZSkKICAgIGZyZWUoY28tPm5hbWUpOwogIGlmKGNvLT52YWx1ZSkKICAgIGZyZWUoY28tPnZhbHVlKTsKICBpZihjby0+bWF4YWdlKQogICAgZnJlZShjby0+bWF4YWdlKTsKICBpZihjby0+dmVyc2lvbikKICAgIGZyZWUoY28tPnZlcnNpb24pOwoKICBmcmVlKGNvKTsKfQoKc3RhdGljIGJvb2wgdGFpbG1hdGNoKGNvbnN0IGNoYXIgKmxpdHRsZSwgY29uc3QgY2hhciAqYmlnb25lKQp7CiAgc2l6ZV90IGxpdHRsZWxlbiA9IHN0cmxlbihsaXR0bGUpOwogIHNpemVfdCBiaWdsZW4gPSBzdHJsZW4oYmlnb25lKTsKCiAgaWYobGl0dGxlbGVuID4gYmlnbGVuKQogICAgcmV0dXJuIEZBTFNFOwoKICByZXR1cm4gQ3VybF9yYXdfZXF1YWwobGl0dGxlLCBiaWdvbmUrYmlnbGVuLWxpdHRsZWxlbikgPyBUUlVFIDogRkFMU0U7Cn0KCi8qCiAqIExvYWQgY29va2llcyBmcm9tIGFsbCBnaXZlbiBjb29raWUgZmlsZXMgKENVUkxPUFRfQ09PS0lFRklMRSkuCiAqLwp2b2lkIEN1cmxfY29va2llX2xvYWRmaWxlcyhzdHJ1Y3QgU2Vzc2lvbkhhbmRsZSAqZGF0YSkKewogIHN0cnVjdCBjdXJsX3NsaXN0ICpsaXN0ID0gZGF0YS0+Y2hhbmdlLmNvb2tpZWxpc3Q7CiAgaWYobGlzdCkgewogICAgQ3VybF9zaGFyZV9sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSwgQ1VSTF9MT0NLX0FDQ0VTU19TSU5HTEUpOwogICAgd2hpbGUobGlzdCkgewogICAgICBkYXRhLT5jb29raWVzID0gQ3VybF9jb29raWVfaW5pdChkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LT5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5jb29raWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5zZXQuY29va2llc2Vzc2lvbik7CiAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwogICAgfQogICAgY3VybF9zbGlzdF9mcmVlX2FsbChkYXRhLT5jaGFuZ2UuY29va2llbGlzdCk7IC8qIGNsZWFuIHVwIGxpc3QgKi8KICAgIGRhdGEtPmNoYW5nZS5jb29raWVsaXN0ID0gTlVMTDsgLyogZG9uJ3QgZG8gdGhpcyBhZ2FpbiEgKi8KICAgIEN1cmxfc2hhcmVfdW5sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSk7CiAgfQp9CgovKgogKiBzdHJzdG9yZSgpIG1ha2VzIGEgc3RyZHVwKCkgb24gdGhlICduZXdzdHInIGFuZCBpZiAnKnN0cicgaXMgbm9uLU5VTEwKICogdGhhdCB3aWxsIGJlIGZyZWVkIGJlZm9yZSB0aGUgYWxsb2NhdGVkIHN0cmluZyBpcyBzdG9yZWQgdGhlcmUuCiAqCiAqIEl0IGlzIG1lYW50IHRvIGVhc2lseSByZXBsYWNlIHN0cmR1cCgpCiAqLwpzdGF0aWMgdm9pZCBzdHJzdG9yZShjaGFyICoqc3RyLCBjb25zdCBjaGFyICpuZXdzdHIpCnsKICBpZigqc3RyKQogICAgZnJlZSgqc3RyKTsKICAqc3RyID0gc3RyZHVwKG5ld3N0cik7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9hZGQoKQogKgogKiBBZGQgYSBzaW5nbGUgY29va2llIGxpbmUgdG8gdGhlIGNvb2tpZSBrZWVwaW5nIG9iamVjdC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0cnVjdCBDb29raWUgKgpDdXJsX2Nvb2tpZV9hZGQoc3RydWN0IFNlc3Npb25IYW5kbGUgKmRhdGEsCiAgICAgICAgICAgICAgICAvKiBUaGUgJ2RhdGEnIHBvaW50ZXIgaGVyZSBtYXkgYmUgTlVMTCBhdCB0aW1lcywgYW5kIHRodXMKICAgICAgICAgICAgICAgICAgIG11c3Qgb25seSBiZSB1c2VkIHZlcnkgY2FyZWZ1bGx5IGZvciB0aGluZ3MgdGhhdCBjYW4gZGVhbAogICAgICAgICAgICAgICAgICAgd2l0aCBkYXRhIGJlaW5nIE5VTEwuIFN1Y2ggYXMgaW5mb2YoKSBhbmQgc2ltaWxhciAqLwoKICAgICAgICAgICAgICAgIHN0cnVjdCBDb29raWVJbmZvICpjLAogICAgICAgICAgICAgICAgYm9vbCBodHRwaGVhZGVyLCAvKiBUUlVFIGlmIEhUVFAgaGVhZGVyLXN0eWxlIGxpbmUgKi8KICAgICAgICAgICAgICAgIGNoYXIgKmxpbmVwdHIsICAgLyogZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lICovCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkb21haW4sIC8qIGRlZmF1bHQgZG9tYWluICovCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoKSAgIC8qIGZ1bGwgcGF0aCB1c2VkIHdoZW4gdGhpcyBjb29raWUgaXMgc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGdldCBkZWZhdWx0IHBhdGggZm9yIHRoZSBjb29raWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5sZXNzIHNldCAqLwp7CiAgc3RydWN0IENvb2tpZSAqY2xpc3Q7CiAgY2hhciBuYW1lW01BWF9OQU1FXTsKICBzdHJ1Y3QgQ29va2llICpjbzsKICBzdHJ1Y3QgQ29va2llICpsYXN0Yz1OVUxMOwogIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwogIGJvb2wgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICBib29sIGJhZGNvb2tpZSA9IEZBTFNFOyAvKiBjb29raWVzIGFyZSBnb29kIGJ5IGRlZmF1bHQuIG1tbW1tIHl1bW15ICovCgojaWZkZWYgQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUwogICh2b2lkKWRhdGE7CiNlbmRpZgoKICAvKiBGaXJzdCwgYWxsb2MgYW5kIGluaXQgYSBuZXcgc3RydWN0IGZvciBpdCAqLwogIGNvID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgQ29va2llKSk7CiAgaWYoIWNvKQogICAgcmV0dXJuIE5VTEw7IC8qIGJhaWwgb3V0IGlmIHdlJ3JlIHRoaXMgbG93IG9uIG1lbW9yeSAqLwoKICBpZihodHRwaGVhZGVyKSB7CiAgICAvKiBUaGlzIGxpbmUgd2FzIHJlYWQgb2ZmIGEgSFRUUC1oZWFkZXIgKi8KICAgIGNvbnN0IGNoYXIgKnB0cjsKICAgIGNvbnN0IGNoYXIgKnNlbWlwdHI7CiAgICBjaGFyICp3aGF0OwoKICAgIHdoYXQgPSBtYWxsb2MoTUFYX0NPT0tJRV9MSU5FKTsKICAgIGlmKCF3aGF0KSB7CiAgICAgIGZyZWUoY28pOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBzZW1pcHRyPXN0cmNocihsaW5lcHRyLCAnOycpOyAvKiBmaXJzdCwgZmluZCBhIHNlbWljb2xvbiAqLwoKICAgIHdoaWxlKCpsaW5lcHRyICYmIElTQkxBTksoKmxpbmVwdHIpKQogICAgICBsaW5lcHRyKys7CgogICAgcHRyID0gbGluZXB0cjsKICAgIGRvIHsKICAgICAgLyogd2UgaGF2ZSBhIDx3aGF0Pj08dGhpcz4gcGFpciBvciBhIHN0YW5kLWFsb25lIHdvcmQgaGVyZSAqLwogICAgICBuYW1lWzBdPXdoYXRbMF09MDsgLyogaW5pdCB0aGUgYnVmZmVycyAqLwogICAgICBpZigxIDw9IHNzY2FuZihwdHIsICIlIiBNQVhfTkFNRV9UWFQgIlteO1xyXG4gPV09JSIKICAgICAgICAgICAgICAgICAgICAgTUFYX0NPT0tJRV9MSU5FX1RYVCAiW147XHJcbl0iLAogICAgICAgICAgICAgICAgICAgICBuYW1lLCB3aGF0KSkgewogICAgICAgIC8qIFVzZSBzdHJzdG9yZSgpIGJlbG93IHRvIHByb3Blcmx5IGRlYWwgd2l0aCByZWNlaXZlZCBjb29raWUKICAgICAgICAgICBoZWFkZXJzIHRoYXQgaGF2ZSB0aGUgc2FtZSBzdHJpbmcgcHJvcGVydHkgc2V0IG1vcmUgdGhhbiBvbmNlLAogICAgICAgICAgIGFuZCB0aGVuIHdlIHVzZSB0aGUgbGFzdCBvbmUuICovCiAgICAgICAgY29uc3QgY2hhciAqd2hhdHB0cjsKICAgICAgICBib29sIGRvbmUgPSBGQUxTRTsKICAgICAgICBib29sIHNlcDsKICAgICAgICBzaXplX3QgbGVuPXN0cmxlbih3aGF0KTsKICAgICAgICBjb25zdCBjaGFyICplbmRvZm4gPSAmcHRyWyBzdHJsZW4obmFtZSkgXTsKCiAgICAgICAgLyogc2tpcCB0cmFpbGluZyBzcGFjZXMgaW4gbmFtZSAqLwogICAgICAgIHdoaWxlKCplbmRvZm4gJiYgSVNCTEFOSygqZW5kb2ZuKSkKICAgICAgICAgIGVuZG9mbisrOwoKICAgICAgICAvKiBuYW1lIGVuZHMgd2l0aCBhICc9JyA/ICovCiAgICAgICAgc2VwID0gKCplbmRvZm4gPT0gJz0nKT9UUlVFOkZBTFNFOwoKICAgICAgICAvKiBTdHJpcCBvZmYgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSAnd2hhdCcgKi8KICAgICAgICB3aGlsZShsZW4gJiYgSVNCTEFOSyh3aGF0W2xlbi0xXSkpIHsKICAgICAgICAgIHdoYXRbbGVuLTFdPTA7CiAgICAgICAgICBsZW4tLTsKICAgICAgICB9CgogICAgICAgIC8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlICd3aGF0JyAqLwogICAgICAgIHdoYXRwdHI9d2hhdDsKICAgICAgICB3aGlsZSgqd2hhdHB0ciAmJiBJU0JMQU5LKCp3aGF0cHRyKSkKICAgICAgICAgIHdoYXRwdHIrKzsKCiAgICAgICAgaWYoIWxlbikgewogICAgICAgICAgLyogdGhpcyB3YXMgYSAiPG5hbWU+PSIgd2l0aCBubyBjb250ZW50LCBhbmQgd2UgbXVzdCBhbGxvdwogICAgICAgICAgICAgJ3NlY3VyZScgYW5kICdodHRwb25seScgc3BlY2lmaWVkIHRoaXMgd2VpcmRseSAqLwogICAgICAgICAgZG9uZSA9IFRSVUU7CiAgICAgICAgICBpZihDdXJsX3Jhd19lcXVhbCgic2VjdXJlIiwgbmFtZSkpCiAgICAgICAgICAgIGNvLT5zZWN1cmUgPSBUUlVFOwogICAgICAgICAgZWxzZSBpZihDdXJsX3Jhd19lcXVhbCgiaHR0cG9ubHkiLCBuYW1lKSkKICAgICAgICAgICAgY28tPmh0dHBvbmx5ID0gVFJVRTsKICAgICAgICAgIGVsc2UgaWYoc2VwKQogICAgICAgICAgICAvKiB0aGVyZSB3YXMgYSAnPScgc28gd2UncmUgbm90IGRvbmUgcGFyc2luZyB0aGlzIGZpZWxkICovCiAgICAgICAgICAgIGRvbmUgPSBGQUxTRTsKICAgICAgICB9CiAgICAgICAgaWYoZG9uZSkKICAgICAgICAgIDsKICAgICAgICBlbHNlIGlmKEN1cmxfcmF3X2VxdWFsKCJwYXRoIiwgbmFtZSkpIHsKICAgICAgICAgIHN0cnN0b3JlKCZjby0+cGF0aCwgd2hhdHB0cik7CiAgICAgICAgICBpZighY28tPnBhdGgpIHsKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsgLyogb3V0IG9mIG1lbW9yeSBiYWQgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoQ3VybF9yYXdfZXF1YWwoImRvbWFpbiIsIG5hbWUpKSB7CiAgICAgICAgICAvKiBub3RlIHRoYXQgdGhpcyBuYW1lIG1heSBvciBtYXkgbm90IGhhdmUgYSBwcmVjZWRpbmcgZG90LCBidXQKICAgICAgICAgICAgIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhhdCwgd2UgdHJlYXQgdGhlIG5hbWVzIHRoZSBzYW1lIGFueXdheSAqLwoKICAgICAgICAgIGNvbnN0IGNoYXIgKmRvbXB0cj13aGF0cHRyOwogICAgICAgICAgY29uc3QgY2hhciAqbmV4dHB0cjsKICAgICAgICAgIGludCBkb3Rjb3VudD0xOwoKICAgICAgICAgIC8qIENvdW50IHRoZSBkb3RzLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGFyZSBlbm91Z2gKICAgICAgICAgICAgIG9mIHRoZW0uICovCgogICAgICAgICAgaWYoJy4nID09IHdoYXRwdHJbMF0pCiAgICAgICAgICAgIC8qIGRvbid0IGNvdW50IHRoZSBpbml0aWFsIGRvdCwgYXNzdW1lIGl0ICovCiAgICAgICAgICAgIGRvbXB0cisrOwoKICAgICAgICAgIGRvIHsKICAgICAgICAgICAgbmV4dHB0ciA9IHN0cmNocihkb21wdHIsICcuJyk7CiAgICAgICAgICAgIGlmKG5leHRwdHIpIHsKICAgICAgICAgICAgICBpZihkb21wdHIgIT0gbmV4dHB0cikKICAgICAgICAgICAgICAgIGRvdGNvdW50Kys7CiAgICAgICAgICAgICAgZG9tcHRyID0gbmV4dHB0cisxOwogICAgICAgICAgICB9CiAgICAgICAgICB9IHdoaWxlKG5leHRwdHIpOwoKICAgICAgICAgIC8qIFRoZSBvcmlnaW5hbCBOZXRzY2FwZSBjb29raWUgc3BlYyBkZWZpbmVkIHRoYXQgdGhpcyBkb21haW4gbmFtZQogICAgICAgICAgICAgTVVTVCBoYXZlIHRocmVlIGRvdHMgKG9yIHR3byBpZiBvbmUgb2YgdGhlIHNldmVuIGhvbHkgVExEcyksCiAgICAgICAgICAgICBidXQgaXQgc2VlbXMgdGhhdCB0aGVzZSBraW5kcyBvZiBjb29raWVzIGFyZSBpbiB1c2UgIm91dCB0aGVyZSIKICAgICAgICAgICAgIHNvIHdlIGNhbm5vdCBiZSB0aGF0IHN0cmljdC4gSSd2ZSB0aGVyZWZvcmUgbG93ZXJlZCB0aGUgY2hlY2sKICAgICAgICAgICAgIHRvIG5vdCBhbGxvdyBsZXNzIHRoYW4gdHdvIGRvdHMuICovCgogICAgICAgICAgaWYoZG90Y291bnQgPCAyKSB7CiAgICAgICAgICAgIC8qIFJlY2VpdmVkIGFuZCBza2lwcGVkIGEgY29va2llIHdpdGggYSBkb21haW4gdXNpbmcgdG9vIGZldwogICAgICAgICAgICAgICBkb3RzLiAqLwogICAgICAgICAgICBiYWRjb29raWU9VFJVRTsgLyogbWFyayB0aGlzIGFzIGEgYmFkIGNvb2tpZSAqLwogICAgICAgICAgICBpbmZvZihkYXRhLCAic2tpcHBlZCBjb29raWUgd2l0aCBpbGxlZ2FsIGRvdGNvdW50IGRvbWFpbjogJXNcbiIsCiAgICAgICAgICAgICAgICAgIHdoYXRwdHIpOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qIE5vdywgd2UgbWFrZSBzdXJlIHRoYXQgb3VyIGhvc3QgaXMgd2l0aGluIHRoZSBnaXZlbiBkb21haW4sCiAgICAgICAgICAgICAgIG9yIHRoZSBnaXZlbiBkb21haW4gaXMgbm90IHZhbGlkIGFuZCB0aHVzIGNhbm5vdCBiZSBzZXQuICovCgogICAgICAgICAgICBpZignLicgPT0gd2hhdHB0clswXSkKICAgICAgICAgICAgICB3aGF0cHRyKys7IC8qIGlnbm9yZSBwcmVjZWRpbmcgZG90ICovCgogICAgICAgICAgICBpZighZG9tYWluIHx8IHRhaWxtYXRjaCh3aGF0cHRyLCBkb21haW4pKSB7CiAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGFpbHB0cj13aGF0cHRyOwogICAgICAgICAgICAgIGlmKHRhaWxwdHJbMF0gPT0gJy4nKQogICAgICAgICAgICAgICAgdGFpbHB0cisrOwogICAgICAgICAgICAgIHN0cnN0b3JlKCZjby0+ZG9tYWluLCB0YWlscHRyKTsgLyogZG9uJ3QgcHJlZml4IHcvZG90cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxseSAqLwogICAgICAgICAgICAgIGlmKCFjby0+ZG9tYWluKSB7CiAgICAgICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvLT50YWlsbWF0Y2g9VFJVRTsgLyogd2UgYWx3YXlzIGRvIHRoYXQgaWYgdGhlIGRvbWFpbiBuYW1lIHdhcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAvKiB3ZSBkaWQgbm90IGdldCBhIHRhaWxtYXRjaCBhbmQgdGhlbiB0aGUgYXR0ZW1wdGVkIHNldCBkb21haW4KICAgICAgICAgICAgICAgICBpcyBub3QgYSBkb21haW4gdG8gd2hpY2ggdGhlIGN1cnJlbnQgaG9zdCBiZWxvbmdzLiBNYXJrIGFzCiAgICAgICAgICAgICAgICAgYmFkLiAqLwogICAgICAgICAgICAgIGJhZGNvb2tpZT1UUlVFOwogICAgICAgICAgICAgIGluZm9mKGRhdGEsICJza2lwcGVkIGNvb2tpZSB3aXRoIGJhZCB0YWlsbWF0Y2ggZG9tYWluOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICB3aGF0cHRyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmKEN1cmxfcmF3X2VxdWFsKCJ2ZXJzaW9uIiwgbmFtZSkpIHsKICAgICAgICAgIHN0cnN0b3JlKCZjby0+dmVyc2lvbiwgd2hhdHB0cik7CiAgICAgICAgICBpZighY28tPnZlcnNpb24pIHsKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoQ3VybF9yYXdfZXF1YWwoIm1heC1hZ2UiLCBuYW1lKSkgewogICAgICAgICAgLyogRGVmaW5lZCBpbiBSRkMyMTA5OgoKICAgICAgICAgICAgIE9wdGlvbmFsLiAgVGhlIE1heC1BZ2UgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxpZmV0aW1lIG9mIHRoZQogICAgICAgICAgICAgY29va2llLCBpbiBzZWNvbmRzLiAgVGhlIGRlbHRhLXNlY29uZHMgdmFsdWUgaXMgYSBkZWNpbWFsIG5vbi0KICAgICAgICAgICAgIG5lZ2F0aXZlIGludGVnZXIuICBBZnRlciBkZWx0YS1zZWNvbmRzIHNlY29uZHMgZWxhcHNlLCB0aGUKICAgICAgICAgICAgIGNsaWVudCBzaG91bGQgZGlzY2FyZCB0aGUgY29va2llLiAgQSB2YWx1ZSBvZiB6ZXJvIG1lYW5zIHRoZQogICAgICAgICAgICAgY29va2llIHNob3VsZCBiZSBkaXNjYXJkZWQgaW1tZWRpYXRlbHkuCgogICAgICAgICAgKi8KICAgICAgICAgIHN0cnN0b3JlKCZjby0+bWF4YWdlLCB3aGF0cHRyKTsKICAgICAgICAgIGlmKCFjby0+bWF4YWdlKSB7CiAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY28tPmV4cGlyZXMgPQogICAgICAgICAgICBzdHJ0b2woKCpjby0+bWF4YWdlPT0nXCInKT8mY28tPm1heGFnZVsxXTomY28tPm1heGFnZVswXSxOVUxMLDEwKQogICAgICAgICAgICArIChsb25nKW5vdzsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihDdXJsX3Jhd19lcXVhbCgiZXhwaXJlcyIsIG5hbWUpKSB7CiAgICAgICAgICBzdHJzdG9yZSgmY28tPmV4cGlyZXN0ciwgd2hhdHB0cik7CiAgICAgICAgICBpZighY28tPmV4cGlyZXN0cikgewogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIC8qIE5vdGUgdGhhdCBpZiB0aGUgZGF0ZSBjb3VsZG4ndCBnZXQgcGFyc2VkIGZvciB3aGF0ZXZlciByZWFzb24sCiAgICAgICAgICAgICB0aGUgY29va2llIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNlc3Npb24gY29va2llICovCiAgICAgICAgICBjby0+ZXhwaXJlcyA9IGN1cmxfZ2V0ZGF0ZSh3aGF0LCAmbm93KTsKCiAgICAgICAgICAvKiBTZXNzaW9uIGNvb2tpZXMgaGF2ZSBleHBpcmVzIHNldCB0byAwIHNvIGlmIHdlIGdldCB0aGF0IGJhY2sKICAgICAgICAgICAgIGZyb20gdGhlIGRhdGUgcGFyc2VyIGxldCdzIGFkZCBhIHNlY29uZCB0byBtYWtlIGl0IGEKICAgICAgICAgICAgIG5vbi1zZXNzaW9uIGNvb2tpZSAqLwogICAgICAgICAgaWYoY28tPmV4cGlyZXMgPT0gMCkKICAgICAgICAgICAgY28tPmV4cGlyZXMgPSAxOwogICAgICAgICAgZWxzZSBpZihjby0+ZXhwaXJlcyA8IDApCiAgICAgICAgICAgIGNvLT5leHBpcmVzID0gMDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZighY28tPm5hbWUpIHsKICAgICAgICAgIGNvLT5uYW1lID0gc3RyZHVwKG5hbWUpOwogICAgICAgICAgY28tPnZhbHVlID0gc3RyZHVwKHdoYXRwdHIpOwogICAgICAgICAgaWYoIWNvLT5uYW1lIHx8ICFjby0+dmFsdWUpIHsKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICBlbHNlIHRoaXMgaXMgdGhlIHNlY29uZCAob3IgbW9yZSkgbmFtZSB3ZSBkb24ndCBrbm93CiAgICAgICAgICBhYm91dCEgKi8KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAvKiB0aGlzIGlzIGFuICJpbGxlZ2FsIiA8d2hhdD49PHRoaXM+IHBhaXIgKi8KICAgICAgfQoKICAgICAgaWYoIXNlbWlwdHIgfHwgISpzZW1pcHRyKSB7CiAgICAgICAgLyogd2UgYWxyZWFkeSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGNvb2tpZXMgKi8KICAgICAgICBzZW1pcHRyID0gTlVMTDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgcHRyPXNlbWlwdHIrMTsKICAgICAgd2hpbGUoKnB0ciAmJiBJU0JMQU5LKCpwdHIpKQogICAgICAgIHB0cisrOwogICAgICBzZW1pcHRyPXN0cmNocihwdHIsICc7Jyk7IC8qIG5vdywgZmluZCB0aGUgbmV4dCBzZW1pY29sb24gKi8KCiAgICAgIGlmKCFzZW1pcHRyICYmICpwdHIpCiAgICAgICAgLyogVGhlcmUgYXJlIG5vIG1vcmUgc2VtaWNvbG9ucywgYnV0IHRoZXJlJ3MgYSBmaW5hbCBuYW1lPXZhbHVlIHBhaXIKICAgICAgICAgICBjb21pbmcgdXAgKi8KICAgICAgICBzZW1pcHRyPXN0cmNocihwdHIsICdcMCcpOwogICAgfSB3aGlsZShzZW1pcHRyKTsKCiAgICBpZighYmFkY29va2llICYmICFjby0+ZG9tYWluKSB7CiAgICAgIGlmKGRvbWFpbikgewogICAgICAgIC8qIG5vIGRvbWFpbiB3YXMgZ2l2ZW4gaW4gdGhlIGhlYWRlciBsaW5lLCBzZXQgdGhlIGRlZmF1bHQgKi8KICAgICAgICBjby0+ZG9tYWluPXN0cmR1cChkb21haW4pOwogICAgICAgIGlmKCFjby0+ZG9tYWluKQogICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgfQogICAgfQoKICAgIGlmKCFiYWRjb29raWUgJiYgIWNvLT5wYXRoICYmIHBhdGgpIHsKICAgICAgLyogTm8gcGF0aCB3YXMgZ2l2ZW4gaW4gdGhlIGhlYWRlciBsaW5lLCBzZXQgdGhlIGRlZmF1bHQuCiAgICAgICAgIE5vdGUgdGhhdCB0aGUgcGFzc2VkLWluIHBhdGggdG8gdGhpcyBmdW5jdGlvbiBNQVkgaGF2ZSBhICc/JyBhbmQKICAgICAgICAgZm9sbG93aW5nIHBhcnQgdGhhdCBNVVNUIG5vdCBiZSBzdG9yZWQgYXMgcGFydCBvZiB0aGUgcGF0aC4gKi8KICAgICAgY2hhciAqcXVlcnlwID0gc3RyY2hyKHBhdGgsICc/Jyk7CgogICAgICAvKiBxdWVyeXAgaXMgd2hlcmUgdGhlIGludGVyZXN0aW5nIHBhcnQgb2YgdGhlIHBhdGggZW5kcywgc28gbm93IHdlCiAgICAgICAgIHdhbnQgdG8gdGhlIGZpbmQgdGhlIGxhc3QgKi8KICAgICAgY2hhciAqZW5kc2xhc2g7CiAgICAgIGlmKCFxdWVyeXApCiAgICAgICAgZW5kc2xhc2ggPSBzdHJyY2hyKHBhdGgsICcvJyk7CiAgICAgIGVsc2UKICAgICAgICBlbmRzbGFzaCA9IG1lbXJjaHIocGF0aCwgJy8nLCAoc2l6ZV90KShxdWVyeXAgLSBwYXRoKSk7CiAgICAgIGlmKGVuZHNsYXNoKSB7CiAgICAgICAgc2l6ZV90IHBhdGhsZW4gPSAoc2l6ZV90KShlbmRzbGFzaC1wYXRoKzEpOyAvKiBpbmNsdWRlIGVuZGluZyBzbGFzaCAqLwogICAgICAgIGNvLT5wYXRoPW1hbGxvYyhwYXRobGVuKzEpOyAvKiBvbmUgZXh0cmEgZm9yIHRoZSB6ZXJvIGJ5dGUgKi8KICAgICAgICBpZihjby0+cGF0aCkgewogICAgICAgICAgbWVtY3B5KGNvLT5wYXRoLCBwYXRoLCBwYXRobGVuKTsKICAgICAgICAgIGNvLT5wYXRoW3BhdGhsZW5dPTA7IC8qIHplcm8gdGVybWluYXRlICovCiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgIH0KICAgIH0KCiAgICBmcmVlKHdoYXQpOwoKICAgIGlmKGJhZGNvb2tpZSB8fCAhY28tPm5hbWUpIHsKICAgICAgLyogd2UgZGlkbid0IGdldCBhIGNvb2tpZSBuYW1lIG9yIGEgYmFkIG9uZSwKICAgICAgICAgdGhpcyBpcyBhbiBpbGxlZ2FsIGxpbmUsIGJhaWwgb3V0ICovCiAgICAgIGZyZWVjb29raWUoY28pOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgfQogIGVsc2UgewogICAgLyogVGhpcyBsaW5lIGlzIE5PVCBhIEhUVFAgaGVhZGVyIHN0eWxlIGxpbmUsIHdlIGRvIG9mZmVyIHN1cHBvcnQgZm9yCiAgICAgICByZWFkaW5nIHRoZSBvZGQgbmV0c2NhcGUgY29va2llcy1maWxlIGZvcm1hdCBoZXJlICovCiAgICBjaGFyICpwdHI7CiAgICBjaGFyICpmaXJzdHB0cjsKICAgIGNoYXIgKnRva19idWY9TlVMTDsKICAgIGludCBmaWVsZHM7CgogICAgLyogSUUgaW50cm9kdWNlZCBIVFRQLW9ubHkgY29va2llcyB0byBwcmV2ZW50IFhTUyBhdHRhY2tzLiBDb29raWVzCiAgICAgICBtYXJrZWQgd2l0aCBodHRwT25seSBhZnRlciB0aGUgZG9tYWluIG5hbWUgYXJlIG5vdCBhY2Nlc3NpYmxlCiAgICAgICBmcm9tIGphdmFzY3JpcHRzLCBidXQgc2luY2UgY3VybCBkb2VzIG5vdCBvcGVyYXRlIGF0IGphdmFzY3JpcHQKICAgICAgIGxldmVsLCB3ZSBpbmNsdWRlIHRoZW0gYW55d2F5LiBJbiBGaXJlZm94J3MgY29va2llIGZpbGVzLCB0aGVzZQogICAgICAgbGluZXMgYXJlIHByZWNlZGVkIHdpdGggI0h0dHBPbmx5XyBhbmQgdGhlbiBldmVyeXRoaW5nIGlzCiAgICAgICBhcyB1c3VhbCwgc28gd2Ugc2tpcCAxMCBjaGFyYWN0ZXJzIG9mIHRoZSBsaW5lLi4KICAgICovCiAgICBpZihzdHJuY21wKGxpbmVwdHIsICIjSHR0cE9ubHlfIiwgMTApID09IDApIHsKICAgICAgbGluZXB0ciArPSAxMDsKICAgICAgY28tPmh0dHBvbmx5ID0gVFJVRTsKICAgIH0KCiAgICBpZihsaW5lcHRyWzBdPT0nIycpIHsKICAgICAgLyogZG9uJ3QgZXZlbiB0cnkgdGhlIGNvbW1lbnRzICovCiAgICAgIGZyZWUoY28pOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIC8qIHN0cmlwIG9mZiB0aGUgcG9zc2libGUgZW5kLW9mLWxpbmUgY2hhcmFjdGVycyAqLwogICAgcHRyPXN0cmNocihsaW5lcHRyLCAnXHInKTsKICAgIGlmKHB0cikKICAgICAgKnB0cj0wOyAvKiBjbGVhciBpdCAqLwogICAgcHRyPXN0cmNocihsaW5lcHRyLCAnXG4nKTsKICAgIGlmKHB0cikKICAgICAgKnB0cj0wOyAvKiBjbGVhciBpdCAqLwoKICAgIGZpcnN0cHRyPXN0cnRva19yKGxpbmVwdHIsICJcdCIsICZ0b2tfYnVmKTsgLyogdG9rZW5pemUgaXQgb24gdGhlIFRBQiAqLwoKICAgIC8qIEhlcmUncyBhIHF1aWNrIGNoZWNrIHRvIGVsaW1pbmF0ZSBub3JtYWwgSFRUUC1oZWFkZXJzIGZyb20gdGhpcyAqLwogICAgaWYoIWZpcnN0cHRyIHx8IHN0cmNocihmaXJzdHB0ciwgJzonKSkgewogICAgICBmcmVlKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgLyogTm93IGxvb3AgdGhyb3VnaCB0aGUgZmllbGRzIGFuZCBpbml0IHRoZSBzdHJ1Y3Qgd2UgYWxyZWFkeSBoYXZlCiAgICAgICBhbGxvY2F0ZWQgKi8KICAgIGZvcihwdHI9Zmlyc3RwdHIsIGZpZWxkcz0wOyBwdHIgJiYgIWJhZGNvb2tpZTsKICAgICAgICBwdHI9c3RydG9rX3IoTlVMTCwgIlx0IiwgJnRva19idWYpLCBmaWVsZHMrKykgewogICAgICBzd2l0Y2goZmllbGRzKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBpZihwdHJbMF09PScuJykgLyogc2tpcCBwcmVjZWRpbmcgZG90cyAqLwogICAgICAgICAgcHRyKys7CiAgICAgICAgY28tPmRvbWFpbiA9IHN0cmR1cChwdHIpOwogICAgICAgIGlmKCFjby0+ZG9tYWluKQogICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAxOgogICAgICAgIC8qIFRoaXMgZmllbGQgZ290IGl0cyBleHBsYW5hdGlvbiBvbiB0aGUgMjNyZCBvZiBNYXkgMjAwMSBieQogICAgICAgICAgIEFuZHLpcyBHYXJj7WE6CgogICAgICAgICAgIGZsYWc6IEEgVFJVRS9GQUxTRSB2YWx1ZSBpbmRpY2F0aW5nIGlmIGFsbCBtYWNoaW5lcyB3aXRoaW4gYSBnaXZlbgogICAgICAgICAgIGRvbWFpbiBjYW4gYWNjZXNzIHRoZSB2YXJpYWJsZS4gVGhpcyB2YWx1ZSBpcyBzZXQgYXV0b21hdGljYWxseSBieQogICAgICAgICAgIHRoZSBicm93c2VyLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIHlvdSBzZXQgZm9yIHRoZSBkb21haW4uCgogICAgICAgICAgIEFzIGZhciBhcyBJIGNhbiBzZWUsIGl0IGlzIHNldCB0byB0cnVlIHdoZW4gdGhlIGNvb2tpZSBzYXlzCiAgICAgICAgICAgLmRvbWFpbi5jb20gYW5kIHRvIGZhbHNlIHdoZW4gdGhlIGRvbWFpbiBpcyBjb21wbGV0ZSB3d3cuZG9tYWluLmNvbQogICAgICAgICovCiAgICAgICAgY28tPnRhaWxtYXRjaCA9IEN1cmxfcmF3X2VxdWFsKHB0ciwgIlRSVUUiKT9UUlVFOkZBTFNFOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDI6CiAgICAgICAgLyogSXQgdHVybnMgb3V0LCB0aGF0IHNvbWV0aW1lcyB0aGUgZmlsZSBmb3JtYXQgYWxsb3dzIHRoZSBwYXRoCiAgICAgICAgICAgZmllbGQgdG8gcmVtYWluIG5vdCBmaWxsZWQgaW4sIHdlIHRyeSB0byBkZXRlY3QgdGhpcyBhbmQgd29yawogICAgICAgICAgIGFyb3VuZCBpdCEgQW5kculzIEdhcmPtYSBtYWRlIHVzIGF3YXJlIG9mIHRoaXMuLi4gKi8KICAgICAgICBpZihzdHJjbXAoIlRSVUUiLCBwdHIpICYmIHN0cmNtcCgiRkFMU0UiLCBwdHIpKSB7CiAgICAgICAgICAvKiBvbmx5IGlmIHRoZSBwYXRoIGRvZXNuJ3QgbG9vayBsaWtlIGEgYm9vbGVhbiBvcHRpb24hICovCiAgICAgICAgICBjby0+cGF0aCA9IHN0cmR1cChwdHIpOwogICAgICAgICAgaWYoIWNvLT5wYXRoKQogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qIHRoaXMgZG9lc24ndCBsb29rIGxpa2UgYSBwYXRoLCBtYWtlIG9uZSB1cCEgKi8KICAgICAgICBjby0+cGF0aCA9IHN0cmR1cCgiLyIpOwogICAgICAgIGlmKCFjby0+cGF0aCkKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgZmllbGRzKys7IC8qIGFkZCBhIGZpZWxkIGFuZCBmYWxsIGRvd24gdG8gc2VjdXJlICovCiAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KICAgICAgY2FzZSAzOgogICAgICAgIGNvLT5zZWN1cmUgPSBDdXJsX3Jhd19lcXVhbChwdHIsICJUUlVFIik/VFJVRTpGQUxTRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA0OgogICAgICAgIGNvLT5leHBpcmVzID0gY3VybHhfc3RydG9vZmZ0KHB0ciwgTlVMTCwgMTApOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDU6CiAgICAgICAgY28tPm5hbWUgPSBzdHJkdXAocHRyKTsKICAgICAgICBpZighY28tPm5hbWUpCiAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDY6CiAgICAgICAgY28tPnZhbHVlID0gc3RyZHVwKHB0cik7CiAgICAgICAgaWYoIWNvLT52YWx1ZSkKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmKDYgPT0gZmllbGRzKSB7CiAgICAgIC8qIHdlIGdvdCBhIGNvb2tpZSB3aXRoIGJsYW5rIGNvbnRlbnRzLCBmaXggaXQgKi8KICAgICAgY28tPnZhbHVlID0gc3RyZHVwKCIiKTsKICAgICAgaWYoIWNvLT52YWx1ZSkKICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICBlbHNlCiAgICAgICAgZmllbGRzKys7CiAgICB9CgogICAgaWYoIWJhZGNvb2tpZSAmJiAoNyAhPSBmaWVsZHMpKQogICAgICAvKiB3ZSBkaWQgbm90IGZpbmQgdGhlIHN1ZmZpY2llbnQgbnVtYmVyIG9mIGZpZWxkcyAqLwogICAgICBiYWRjb29raWUgPSBUUlVFOwoKICAgIGlmKGJhZGNvb2tpZSkgewogICAgICBmcmVlY29va2llKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogIH0KCiAgaWYoIWMtPnJ1bm5pbmcgJiYgICAgLyogcmVhZCBmcm9tIGEgZmlsZSAqLwogICAgIGMtPm5ld3Nlc3Npb24gJiYgIC8qIGNsZWFuIHNlc3Npb24gY29va2llcyAqLwogICAgICFjby0+ZXhwaXJlcykgeyAgIC8qIHRoaXMgaXMgYSBzZXNzaW9uIGNvb2tpZSBzaW5jZSBpdCBkb2Vzbid0IGV4cGlyZSEgKi8KICAgIGZyZWVjb29raWUoY28pOwogICAgcmV0dXJuIE5VTEw7CiAgfQoKICBjby0+bGl2ZWNvb2tpZSA9IGMtPnJ1bm5pbmc7CgogIC8qIG5vdywgd2UgaGF2ZSBwYXJzZWQgdGhlIGluY29taW5nIGxpbmUsIHdlIG11c3Qgbm93IGNoZWNrIGlmIHRoaXMKICAgICBzdXBlcmNlZWRzIGFuIGFscmVhZHkgZXhpc3RpbmcgY29va2llLCB3aGljaCBpdCBtYXkgaWYgdGhlIHByZXZpb3VzIGhhdmUKICAgICB0aGUgc2FtZSBkb21haW4gYW5kIHBhdGggYXMgdGhpcyAqLwoKICBjbGlzdCA9IGMtPmNvb2tpZXM7CiAgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICB3aGlsZShjbGlzdCkgewogICAgaWYoQ3VybF9yYXdfZXF1YWwoY2xpc3QtPm5hbWUsIGNvLT5uYW1lKSkgewogICAgICAvKiB0aGUgbmFtZXMgYXJlIGlkZW50aWNhbCAqLwoKICAgICAgaWYoY2xpc3QtPmRvbWFpbiAmJiBjby0+ZG9tYWluKSB7CiAgICAgICAgaWYoQ3VybF9yYXdfZXF1YWwoY2xpc3QtPmRvbWFpbiwgY28tPmRvbWFpbikpCiAgICAgICAgICAvKiBUaGUgZG9tYWlucyBhcmUgaWRlbnRpY2FsICovCiAgICAgICAgICByZXBsYWNlX29sZD1UUlVFOwogICAgICB9CiAgICAgIGVsc2UgaWYoIWNsaXN0LT5kb21haW4gJiYgIWNvLT5kb21haW4pCiAgICAgICAgcmVwbGFjZV9vbGQgPSBUUlVFOwoKICAgICAgaWYocmVwbGFjZV9vbGQpIHsKICAgICAgICAvKiB0aGUgZG9tYWlucyB3ZXJlIGlkZW50aWNhbCAqLwoKICAgICAgICBpZihjbGlzdC0+cGF0aCAmJiBjby0+cGF0aCkgewogICAgICAgICAgaWYoQ3VybF9yYXdfZXF1YWwoY2xpc3QtPnBhdGgsIGNvLT5wYXRoKSkgewogICAgICAgICAgICByZXBsYWNlX29sZCA9IFRSVUU7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHJlcGxhY2Vfb2xkID0gRkFMU0U7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoIWNsaXN0LT5wYXRoICYmICFjby0+cGF0aCkKICAgICAgICAgIHJlcGxhY2Vfb2xkID0gVFJVRTsKICAgICAgICBlbHNlCiAgICAgICAgICByZXBsYWNlX29sZCA9IEZBTFNFOwoKICAgICAgfQoKICAgICAgaWYocmVwbGFjZV9vbGQgJiYgIWNvLT5saXZlY29va2llICYmIGNsaXN0LT5saXZlY29va2llKSB7CiAgICAgICAgLyogQm90aCBjb29raWVzIG1hdGNoZWQgZmluZSwgZXhjZXB0IHRoYXQgdGhlIGFscmVhZHkgcHJlc2VudAogICAgICAgICAgIGNvb2tpZSBpcyAibGl2ZSIsIHdoaWNoIG1lYW5zIGl0IHdhcyBzZXQgZnJvbSBhIGhlYWRlciwgd2hpbGUKICAgICAgICAgICB0aGUgbmV3IG9uZSBpc24ndCAibGl2ZSIgYW5kIHRodXMgb25seSByZWFkIGZyb20gYSBmaWxlLiBXZSBsZXQKICAgICAgICAgICBsaXZlIGNvb2tpZXMgc3RheSBhbGl2ZSAqLwoKICAgICAgICAvKiBGcmVlIHRoZSBuZXdjb21lciBhbmQgZ2V0IG91dCBvZiBoZXJlISAqLwogICAgICAgIGZyZWVjb29raWUoY28pOwogICAgICAgIHJldHVybiBOVUxMOwogICAgICB9CgogICAgICBpZihyZXBsYWNlX29sZCkgewogICAgICAgIGNvLT5uZXh0ID0gY2xpc3QtPm5leHQ7IC8qIGdldCB0aGUgbmV4dC1wb2ludGVyIGZpcnN0ICovCgogICAgICAgIC8qIHRoZW4gZnJlZSBhbGwgdGhlIG9sZCBwb2ludGVycyAqLwogICAgICAgIGZyZWUoY2xpc3QtPm5hbWUpOwogICAgICAgIGlmKGNsaXN0LT52YWx1ZSkKICAgICAgICAgIGZyZWUoY2xpc3QtPnZhbHVlKTsKICAgICAgICBpZihjbGlzdC0+ZG9tYWluKQogICAgICAgICAgZnJlZShjbGlzdC0+ZG9tYWluKTsKICAgICAgICBpZihjbGlzdC0+cGF0aCkKICAgICAgICAgIGZyZWUoY2xpc3QtPnBhdGgpOwogICAgICAgIGlmKGNsaXN0LT5leHBpcmVzdHIpCiAgICAgICAgICBmcmVlKGNsaXN0LT5leHBpcmVzdHIpOwoKICAgICAgICBpZihjbGlzdC0+dmVyc2lvbikKICAgICAgICAgIGZyZWUoY2xpc3QtPnZlcnNpb24pOwogICAgICAgIGlmKGNsaXN0LT5tYXhhZ2UpCiAgICAgICAgICBmcmVlKGNsaXN0LT5tYXhhZ2UpOwoKICAgICAgICAqY2xpc3QgPSAqY287ICAvKiB0aGVuIHN0b3JlIGFsbCB0aGUgbmV3IGRhdGEgKi8KCiAgICAgICAgZnJlZShjbyk7ICAgLyogZnJlZSB0aGUgbmV3bHkgYWxsb2NlZCBtZW1vcnkgKi8KICAgICAgICBjbyA9IGNsaXN0OyAvKiBwb2ludCB0byB0aGUgcHJldmlvdXMgc3RydWN0IGluc3RlYWQgKi8KCiAgICAgICAgLyogV2UgaGF2ZSByZXBsYWNlZCBhIGNvb2tpZSwgbm93IHNraXAgdGhlIHJlc3Qgb2YgdGhlIGxpc3QgYnV0CiAgICAgICAgICAgbWFrZSBzdXJlIHRoZSAnbGFzdGMnIHBvaW50ZXIgaXMgcHJvcGVybHkgc2V0ICovCiAgICAgICAgZG8gewogICAgICAgICAgbGFzdGMgPSBjbGlzdDsKICAgICAgICAgIGNsaXN0ID0gY2xpc3QtPm5leHQ7CiAgICAgICAgfSB3aGlsZShjbGlzdCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGxhc3RjID0gY2xpc3Q7CiAgICBjbGlzdCA9IGNsaXN0LT5uZXh0OwogIH0KCiAgaWYoYy0+cnVubmluZykKICAgIC8qIE9ubHkgc2hvdyB0aGlzIHdoZW4gTk9UIHJlYWRpbmcgdGhlIGNvb2tpZXMgZnJvbSBhIGZpbGUgKi8KICAgIGluZm9mKGRhdGEsICIlcyBjb29raWUgJXM9XCIlc1wiIGZvciBkb21haW4gJXMsIHBhdGggJXMsICIKICAgICAgICAgICJleHBpcmUgJSIgRk9STUFUX09GRl9UICJcbiIsCiAgICAgICAgICByZXBsYWNlX29sZD8iUmVwbGFjZWQiOiJBZGRlZCIsIGNvLT5uYW1lLCBjby0+dmFsdWUsCiAgICAgICAgICBjby0+ZG9tYWluLCBjby0+cGF0aCwgY28tPmV4cGlyZXMpOwoKICBpZighcmVwbGFjZV9vbGQpIHsKICAgIC8qIHRoZW4gbWFrZSB0aGUgbGFzdCBpdGVtIHBvaW50IG9uIHRoaXMgbmV3IG9uZSAqLwogICAgaWYobGFzdGMpCiAgICAgIGxhc3RjLT5uZXh0ID0gY287CiAgICBlbHNlCiAgICAgIGMtPmNvb2tpZXMgPSBjbzsKICB9CgogIGMtPm51bWNvb2tpZXMrKzsgLyogb25lIG1vcmUgY29va2llIGluIHRoZSBqYXIgKi8KICByZXR1cm4gY287Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9pbml0KCkKICoKICogSW5pdHMgYSBjb29raWUgc3RydWN0IHRvIHJlYWQgZGF0YSBmcm9tIGEgbG9jYWwgZmlsZS4gVGhpcyBpcyBhbHdheXMKICogY2FsbGVkIGJlZm9yZSBhbnkgY29va2llcyBhcmUgc2V0LiBGaWxlIG1heSBiZSBOVUxMLgogKgogKiBJZiAnbmV3c2Vzc2lvbicgaXMgVFJVRSwgZGlzY2FyZCBhbGwgInNlc3Npb24gY29va2llcyIgb24gcmVhZCBmcm9tIGZpbGUuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgQ29va2llSW5mbyAqQ3VybF9jb29raWVfaW5pdChzdHJ1Y3QgU2Vzc2lvbkhhbmRsZSAqZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENvb2tpZUluZm8gKmluYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZXdzZXNzaW9uKQp7CiAgc3RydWN0IENvb2tpZUluZm8gKmM7CiAgRklMRSAqZnA7CiAgYm9vbCBmcm9tZmlsZT1UUlVFOwoKICBpZihOVUxMID09IGluYykgewogICAgLyogd2UgZGlkbid0IGdldCBhIHN0cnVjdCwgY3JlYXRlIG9uZSAqLwogICAgYyA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IENvb2tpZUluZm8pKTsKICAgIGlmKCFjKQogICAgICByZXR1cm4gTlVMTDsgLyogZmFpbGVkIHRvIGdldCBtZW1vcnkgKi8KICAgIGMtPmZpbGVuYW1lID0gc3RyZHVwKGZpbGU/ZmlsZToibm9uZSIpOyAvKiBjb3B5IHRoZSBuYW1lIGp1c3QgaW4gY2FzZSAqLwogIH0KICBlbHNlIHsKICAgIC8qIHdlIGdvdCBhbiBhbHJlYWR5IGV4aXN0aW5nIG9uZSwgdXNlIHRoYXQgKi8KICAgIGMgPSBpbmM7CiAgfQogIGMtPnJ1bm5pbmcgPSBGQUxTRTsgLyogdGhpcyBpcyBub3QgcnVubmluZywgdGhpcyBpcyBpbml0ICovCgogIGlmKGZpbGUgJiYgc3RyZXF1YWwoZmlsZSwgIi0iKSkgewogICAgZnAgPSBzdGRpbjsKICAgIGZyb21maWxlPUZBTFNFOwogIH0KICBlbHNlIGlmKGZpbGUgJiYgISpmaWxlKSB7CiAgICAvKiBwb2ludHMgdG8gYSAiIiBzdHJpbmcgKi8KICAgIGZwID0gTlVMTDsKICB9CiAgZWxzZQogICAgZnAgPSBmaWxlP2ZvcGVuKGZpbGUsICJyIik6TlVMTDsKCiAgYy0+bmV3c2Vzc2lvbiA9IG5ld3Nlc3Npb247IC8qIG5ldyBzZXNzaW9uPyAqLwoKICBpZihmcCkgewogICAgY2hhciAqbGluZXB0cjsKICAgIGJvb2wgaGVhZGVybGluZTsKCiAgICBjaGFyICpsaW5lID0gbWFsbG9jKE1BWF9DT09LSUVfTElORSk7CiAgICBpZihsaW5lKSB7CiAgICAgIHdoaWxlKGZnZXRzKGxpbmUsIE1BWF9DT09LSUVfTElORSwgZnApKSB7CiAgICAgICAgaWYoY2hlY2twcmVmaXgoIlNldC1Db29raWU6IiwgbGluZSkpIHsKICAgICAgICAgIC8qIFRoaXMgaXMgYSBjb29raWUgbGluZSwgZ2V0IGl0ISAqLwogICAgICAgICAgbGluZXB0cj0mbGluZVsxMV07CiAgICAgICAgICBoZWFkZXJsaW5lPVRSVUU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgbGluZXB0cj1saW5lOwogICAgICAgICAgaGVhZGVybGluZT1GQUxTRTsKICAgICAgICB9CiAgICAgICAgd2hpbGUoKmxpbmVwdHIgJiYgSVNCTEFOSygqbGluZXB0cikpCiAgICAgICAgICBsaW5lcHRyKys7CgogICAgICAgIEN1cmxfY29va2llX2FkZChkYXRhLCBjLCBoZWFkZXJsaW5lLCBsaW5lcHRyLCBOVUxMLCBOVUxMKTsKICAgICAgfQogICAgICBmcmVlKGxpbmUpOyAvKiBmcmVlIHRoZSBsaW5lIGJ1ZmZlciAqLwogICAgfQogICAgaWYoZnJvbWZpbGUpCiAgICAgIGZjbG9zZShmcCk7CiAgfQoKICBjLT5ydW5uaW5nID0gVFJVRTsgICAgICAgICAgLyogbm93LCB3ZSdyZSBydW5uaW5nICovCgogIHJldHVybiBjOwp9CgovKiBzb3J0IHRoaXMgc28gdGhhdCB0aGUgbG9uZ2VzdCBwYXRoIGdldHMgYmVmb3JlIHRoZSBzaG9ydGVyIHBhdGggKi8Kc3RhdGljIGludCBjb29raWVfc29ydChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCnsKICBzdHJ1Y3QgQ29va2llICpjMSA9ICooc3RydWN0IENvb2tpZSAqKilwMTsKICBzdHJ1Y3QgQ29va2llICpjMiA9ICooc3RydWN0IENvb2tpZSAqKilwMjsKCiAgc2l6ZV90IGwxID0gYzEtPnBhdGg/c3RybGVuKGMxLT5wYXRoKTowOwogIHNpemVfdCBsMiA9IGMyLT5wYXRoP3N0cmxlbihjMi0+cGF0aCk6MDsKCiAgcmV0dXJuIChsMiA+IGwxKSA/IDEgOiAobDIgPCBsMSkgPyAtMSA6IDAgOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfZ2V0bGlzdCgpCiAqCiAqIEZvciBhIGdpdmVuIGhvc3QgYW5kIHBhdGgsIHJldHVybiBhIGxpbmtlZCBsaXN0IG9mIGNvb2tpZXMgdGhhdCB0aGUKICogY2xpZW50IHNob3VsZCBzZW5kIHRvIHRoZSBzZXJ2ZXIgaWYgdXNlZCBub3cuIFRoZSBzZWN1cmUgYm9vbGVhbiBpbmZvcm1zCiAqIHRoZSBjb29raWUgaWYgYSBzZWN1cmUgY29ubmVjdGlvbiBpcyBhY2hpZXZlZCBvciBub3QuCiAqCiAqIEl0IHNoYWxsIG9ubHkgcmV0dXJuIGNvb2tpZXMgdGhhdCBoYXZlbid0IGV4cGlyZWQuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RydWN0IENvb2tpZSAqQ3VybF9jb29raWVfZ2V0bGlzdChzdHJ1Y3QgQ29va2llSW5mbyAqYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBjb25zdCBjaGFyICpwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2VjdXJlKQp7CiAgc3RydWN0IENvb2tpZSAqbmV3Y287CiAgc3RydWN0IENvb2tpZSAqY287CiAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CiAgc3RydWN0IENvb2tpZSAqbWFpbmNvPU5VTEw7CiAgc2l6ZV90IG1hdGNoZXMgPSAwOwoKICBpZighYyB8fCAhYy0+Y29va2llcykKICAgIHJldHVybiBOVUxMOyAvKiBubyBjb29raWUgc3RydWN0IG9yIG5vIGNvb2tpZXMgaW4gdGhlIHN0cnVjdCAqLwoKICBjbyA9IGMtPmNvb2tpZXM7CgogIHdoaWxlKGNvKSB7CiAgICAvKiBvbmx5IHByb2Nlc3MgdGhpcyBjb29raWUgaWYgaXQgaXMgbm90IGV4cGlyZWQgb3IgaGFkIG5vIGV4cGlyZQogICAgICAgZGF0ZSBBTkQgdGhhdCBpZiB0aGUgY29va2llIHJlcXVpcmVzIHdlJ3JlIHNlY3VyZSB3ZSBtdXN0IG9ubHkKICAgICAgIGNvbnRpbnVlIGlmIHdlIGFyZSEgKi8KICAgIGlmKCghY28tPmV4cGlyZXMgfHwgKGNvLT5leHBpcmVzID4gbm93KSkgJiYKICAgICAgIChjby0+c2VjdXJlP3NlY3VyZTpUUlVFKSkgewoKICAgICAgLyogbm93IGNoZWNrIGlmIHRoZSBkb21haW4gaXMgY29ycmVjdCAqLwogICAgICBpZighY28tPmRvbWFpbiB8fAogICAgICAgICAoY28tPnRhaWxtYXRjaCAmJiB0YWlsbWF0Y2goY28tPmRvbWFpbiwgaG9zdCkpIHx8CiAgICAgICAgICghY28tPnRhaWxtYXRjaCAmJiBDdXJsX3Jhd19lcXVhbChob3N0LCBjby0+ZG9tYWluKSkgKSB7CiAgICAgICAgLyogdGhlIHJpZ2h0IHBhcnQgb2YgdGhlIGhvc3QgbWF0Y2hlcyB0aGUgZG9tYWluIHN0dWZmIGluIHRoZQogICAgICAgICAgIGNvb2tpZSBkYXRhICovCgogICAgICAgIC8qIG5vdyBjaGVjayB0aGUgbGVmdCBwYXJ0IG9mIHRoZSBwYXRoIHdpdGggdGhlIGNvb2tpZXMgcGF0aAogICAgICAgICAgIHJlcXVpcmVtZW50ICovCiAgICAgICAgaWYoIWNvLT5wYXRoIHx8CiAgICAgICAgICAgLyogbm90IHVzaW5nIGNoZWNrcHJlZml4KCkgYmVjYXVzZSBtYXRjaGluZyBzaG91bGQgYmUKICAgICAgICAgICAgICBjYXNlLXNlbnNpdGl2ZSAqLwogICAgICAgICAgICFzdHJuY21wKGNvLT5wYXRoLCBwYXRoLCBzdHJsZW4oY28tPnBhdGgpKSApIHsKCiAgICAgICAgICAvKiBhbmQgbm93LCB3ZSBrbm93IHRoaXMgaXMgYSBtYXRjaCBhbmQgd2Ugc2hvdWxkIGNyZWF0ZSBhbgogICAgICAgICAgICAgZW50cnkgZm9yIHRoZSByZXR1cm4tbGlua2VkLWxpc3QgKi8KCiAgICAgICAgICBuZXdjbyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IENvb2tpZSkpOwogICAgICAgICAgaWYobmV3Y28pIHsKICAgICAgICAgICAgLyogZmlyc3QsIGNvcHkgdGhlIHdob2xlIHNvdXJjZSBjb29raWU6ICovCiAgICAgICAgICAgIG1lbWNweShuZXdjbywgY28sIHNpemVvZihzdHJ1Y3QgQ29va2llKSk7CgogICAgICAgICAgICAvKiB0aGVuIG1vZGlmeSBvdXIgbmV4dCAqLwogICAgICAgICAgICBuZXdjby0+bmV4dCA9IG1haW5jbzsKCiAgICAgICAgICAgIC8qIHBvaW50IHRoZSBtYWluIHRvIHVzICovCiAgICAgICAgICAgIG1haW5jbyA9IG5ld2NvOwoKICAgICAgICAgICAgbWF0Y2hlcysrOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZhaWw6CiAgICAgICAgICAgIC8qIGZhaWx1cmUsIGNsZWFyIHVwIHRoZSBhbGxvY2F0ZWQgY2hhaW4gYW5kIHJldHVybiBOVUxMICovCiAgICAgICAgICAgIHdoaWxlKG1haW5jbykgewogICAgICAgICAgICAgIGNvID0gbWFpbmNvLT5uZXh0OwogICAgICAgICAgICAgIGZyZWUobWFpbmNvKTsKICAgICAgICAgICAgICBtYWluY28gPSBjbzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjbyA9IGNvLT5uZXh0OwogIH0KCiAgaWYobWF0Y2hlcykgewogICAgLyogTm93IHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaWYgdGhlcmUgaXMgYSBuYW1lIGFwcGVhcmluZyBtb3JlIHRoYW4KICAgICAgIG9uY2UsIHRoZSBsb25nZXN0IHNwZWNpZmllZCBwYXRoIHZlcnNpb24gY29tZXMgZmlyc3QuIFRvIG1ha2UgdGhpcwogICAgICAgdGhlIHN3aWZ0ZXN0IHdheSwgd2UganVzdCBzb3J0IHRoZW0gYWxsIGJhc2VkIG9uIHBhdGggbGVuZ3RoLiAqLwogICAgc3RydWN0IENvb2tpZSAqKmFycmF5OwogICAgc2l6ZV90IGk7CgogICAgLyogYWxsb2MgYW4gYXJyYXkgYW5kIHN0b3JlIGFsbCBjb29raWUgcG9pbnRlcnMgKi8KICAgIGFycmF5ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgQ29va2llICopICogbWF0Y2hlcyk7CiAgICBpZighYXJyYXkpCiAgICAgIGdvdG8gZmFpbDsKCiAgICBjbyA9IG1haW5jbzsKCiAgICBmb3IoaT0wOyBjbzsgY28gPSBjby0+bmV4dCkKICAgICAgYXJyYXlbaSsrXSA9IGNvOwoKICAgIC8qIG5vdyBzb3J0IHRoZSBjb29raWUgcG9pbnRlcnMgaW4gcGF0aCBsZW50aCBvcmRlciAqLwogICAgcXNvcnQoYXJyYXksIG1hdGNoZXMsIHNpemVvZihzdHJ1Y3QgQ29va2llICopLCBjb29raWVfc29ydCk7CgogICAgLyogcmVtYWtlIHRoZSBsaW5rZWQgbGlzdCBvcmRlciBhY2NvcmRpbmcgdG8gdGhlIG5ldyBvcmRlciAqLwoKICAgIG1haW5jbyA9IGFycmF5WzBdOyAvKiBzdGFydCBoZXJlICovCiAgICBmb3IoaT0wOyBpPG1hdGNoZXMtMTsgaSsrKQogICAgICBhcnJheVtpXS0+bmV4dCA9IGFycmF5W2krMV07CiAgICBhcnJheVttYXRjaGVzLTFdLT5uZXh0ID0gTlVMTDsgLyogdGVybWluYXRlIHRoZSBsaXN0ICovCgogICAgZnJlZShhcnJheSk7IC8qIHJlbW92ZSB0aGUgdGVtcG9yYXJ5IGRhdGEgYWdhaW4gKi8KICB9CgogIHJldHVybiBtYWluY287IC8qIHJldHVybiB0aGUgbmV3IGxpc3QgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2NsZWFyYWxsKCkKICoKICogQ2xlYXIgYWxsIGV4aXN0aW5nIGNvb2tpZXMgYW5kIHJlc2V0IHRoZSBjb3VudGVyLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBDdXJsX2Nvb2tpZV9jbGVhcmFsbChzdHJ1Y3QgQ29va2llSW5mbyAqY29va2llcykKewogIGlmKGNvb2tpZXMpIHsKICAgIEN1cmxfY29va2llX2ZyZWVsaXN0KGNvb2tpZXMtPmNvb2tpZXMsIFRSVUUpOwogICAgY29va2llcy0+Y29va2llcyA9IE5VTEw7CiAgICBjb29raWVzLT5udW1jb29raWVzID0gMDsKICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9mcmVlbGlzdCgpCiAqCiAqIEZyZWUgYSBsaXN0IG9mIGNvb2tpZXMgcHJldmlvdXNseSByZXR1cm5lZCBieSBDdXJsX2Nvb2tpZV9nZXRsaXN0KCk7CiAqCiAqIFRoZSAnY29va2llc3RvbycgYXJndW1lbnQgdGVsbHMgdGhpcyBmdW5jdGlvbiB3aGV0aGVyIHRvIGp1c3QgZnJlZSB0aGUKICogbGlzdCBvciBhY3R1YWxseSBhbHNvIGZyZWUgYWxsIGNvb2tpZXMgd2l0aGluIHRoZSBsaXN0IGFzIHdlbGwuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBDdXJsX2Nvb2tpZV9mcmVlbGlzdChzdHJ1Y3QgQ29va2llICpjbywgYm9vbCBjb29raWVzdG9vKQp7CiAgc3RydWN0IENvb2tpZSAqbmV4dDsKICBpZihjbykgewogICAgd2hpbGUoY28pIHsKICAgICAgbmV4dCA9IGNvLT5uZXh0OwogICAgICBpZihjb29raWVzdG9vKQogICAgICAgIGZyZWVjb29raWUoY28pOwogICAgICBlbHNlCiAgICAgICAgZnJlZShjbyk7IC8qIHdlIG9ubHkgZnJlZSB0aGUgc3RydWN0IHNpbmNlIHRoZSAibWVtYmVycyIgYXJlIGFsbCBqdXN0CiAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgb3V0IGluIHRoZSBtYWluIGNvb2tpZSBsaXN0ISAqLwogICAgICBjbyA9IG5leHQ7CiAgICB9CiAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2NsZWFyc2VzcygpCiAqCiAqIEZyZWUgYWxsIHNlc3Npb24gY29va2llcyBpbiB0aGUgY29va2llcyBsaXN0LgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBDdXJsX2Nvb2tpZV9jbGVhcnNlc3Moc3RydWN0IENvb2tpZUluZm8gKmNvb2tpZXMpCnsKICBzdHJ1Y3QgQ29va2llICpmaXJzdCwgKmN1cnIsICpuZXh0LCAqcHJldiA9IE5VTEw7CgogIGlmKCFjb29raWVzIHx8ICFjb29raWVzLT5jb29raWVzKQogICAgcmV0dXJuOwoKICBmaXJzdCA9IGN1cnIgPSBwcmV2ID0gY29va2llcy0+Y29va2llczsKCiAgZm9yKDsgY3VycjsgY3VyciA9IG5leHQpIHsKICAgIG5leHQgPSBjdXJyLT5uZXh0OwogICAgaWYoIWN1cnItPmV4cGlyZXMpIHsKICAgICAgaWYoZmlyc3QgPT0gY3VycikKICAgICAgICBmaXJzdCA9IG5leHQ7CgogICAgICBpZihwcmV2ID09IGN1cnIpCiAgICAgICAgcHJldiA9IG5leHQ7CiAgICAgIGVsc2UKICAgICAgICBwcmV2LT5uZXh0ID0gbmV4dDsKCiAgICAgIGZyZWVjb29raWUoY3Vycik7CiAgICAgIGNvb2tpZXMtPm51bWNvb2tpZXMtLTsKICAgIH0KICAgIGVsc2UKICAgICAgcHJldiA9IGN1cnI7CiAgfQoKICBjb29raWVzLT5jb29raWVzID0gZmlyc3Q7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfY2xlYW51cCgpCiAqCiAqIEZyZWUgYSAiY29va2llIG9iamVjdCIgcHJldmlvdXMgY3JlYXRlZCB3aXRoIGNvb2tpZV9pbml0KCkuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEN1cmxfY29va2llX2NsZWFudXAoc3RydWN0IENvb2tpZUluZm8gKmMpCnsKICBzdHJ1Y3QgQ29va2llICpjbzsKICBzdHJ1Y3QgQ29va2llICpuZXh0OwogIGlmKGMpIHsKICAgIGlmKGMtPmZpbGVuYW1lKQogICAgICBmcmVlKGMtPmZpbGVuYW1lKTsKICAgIGNvID0gYy0+Y29va2llczsKCiAgICB3aGlsZShjbykgewogICAgICBuZXh0ID0gY28tPm5leHQ7CiAgICAgIGZyZWVjb29raWUoY28pOwogICAgICBjbyA9IG5leHQ7CiAgICB9CiAgICBmcmVlKGMpOyAvKiBmcmVlIHRoZSBiYXNlIHN0cnVjdCBhcyB3ZWxsICovCiAgfQp9CgovKiBnZXRfbmV0c2NhcGVfZm9ybWF0KCkKICoKICogRm9ybWF0cyBhIHN0cmluZyBmb3IgTmV0c2NhcGUgb3V0cHV0IGZpbGUsIHcvbyBhIG5ld2xpbmUgYXQgdGhlIGVuZC4KICoKICogRnVuY3Rpb24gcmV0dXJucyBhIGNoYXIgKiB0byBhIGZvcm1hdHRlZCBsaW5lLiBIYXMgdG8gYmUgZnJlZSgpZAoqLwpzdGF0aWMgY2hhciAqZ2V0X25ldHNjYXBlX2Zvcm1hdChjb25zdCBzdHJ1Y3QgQ29va2llICpjbykKewogIHJldHVybiBhcHJpbnRmKAogICAgIiVzIiAgICAgLyogaHR0cG9ubHkgcHJlYW1ibGUgKi8KICAgICIlcyVzXHQiIC8qIGRvbWFpbiAqLwogICAgIiVzXHQiICAgLyogdGFpbG1hdGNoICovCiAgICAiJXNcdCIgICAvKiBwYXRoICovCiAgICAiJXNcdCIgICAvKiBzZWN1cmUgKi8KICAgICIlIiBGT1JNQVRfT0ZGX1QgIlx0IiAgIC8qIGV4cGlyZXMgKi8KICAgICIlc1x0IiAgIC8qIG5hbWUgKi8KICAgICIlcyIsICAgIC8qIHZhbHVlICovCiAgICBjby0+aHR0cG9ubHk/IiNIdHRwT25seV8iOiIiLAogICAgLyogTWFrZSBzdXJlIGFsbCBkb21haW5zIGFyZSBwcmVmaXhlZCB3aXRoIGEgZG90IGlmIHRoZXkgYWxsb3cKICAgICAgIHRhaWxtYXRjaGluZy4gVGhpcyBpcyBNb3ppbGxhLXN0eWxlLiAqLwogICAgKGNvLT50YWlsbWF0Y2ggJiYgY28tPmRvbWFpbiAmJiBjby0+ZG9tYWluWzBdICE9ICcuJyk/ICIuIjoiIiwKICAgIGNvLT5kb21haW4/Y28tPmRvbWFpbjoidW5rbm93biIsCiAgICBjby0+dGFpbG1hdGNoPyJUUlVFIjoiRkFMU0UiLAogICAgY28tPnBhdGg/Y28tPnBhdGg6Ii8iLAogICAgY28tPnNlY3VyZT8iVFJVRSI6IkZBTFNFIiwKICAgIGNvLT5leHBpcmVzLAogICAgY28tPm5hbWUsCiAgICBjby0+dmFsdWU/Y28tPnZhbHVlOiIiKTsKfQoKLyoKICogY29va2llX291dHB1dCgpCiAqCiAqIFdyaXRlcyBhbGwgaW50ZXJuYWxseSBrbm93biBjb29raWVzIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4gU3BlY2lmeQogKiAiLSIgYXMgZmlsZSBuYW1lIHRvIHdyaXRlIHRvIHN0ZG91dC4KICoKICogVGhlIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gb24gd3JpdGUgZmFpbHVyZS4KICovCnN0YXRpYyBpbnQgY29va2llX291dHB1dChzdHJ1Y3QgQ29va2llSW5mbyAqYywgY29uc3QgY2hhciAqZHVtcGhlcmUpCnsKICBzdHJ1Y3QgQ29va2llICpjbzsKICBGSUxFICpvdXQ7CiAgYm9vbCB1c2Vfc3Rkb3V0PUZBTFNFOwoKICBpZigoTlVMTCA9PSBjKSB8fCAoMCA9PSBjLT5udW1jb29raWVzKSkKICAgIC8qIElmIHRoZXJlIGFyZSBubyBrbm93biBjb29raWVzLCB3ZSBkb24ndCB3cml0ZSBvciBldmVuIGNyZWF0ZSBhbnkKICAgICAgIGRlc3RpbmF0aW9uIGZpbGUgKi8KICAgIHJldHVybiAwOwoKICBpZihzdHJlcXVhbCgiLSIsIGR1bXBoZXJlKSkgewogICAgLyogdXNlIHN0ZG91dCAqLwogICAgb3V0ID0gc3Rkb3V0OwogICAgdXNlX3N0ZG91dD1UUlVFOwogIH0KICBlbHNlIHsKICAgIG91dCA9IGZvcGVuKGR1bXBoZXJlLCAidyIpOwogICAgaWYoIW91dCkKICAgICAgcmV0dXJuIDE7IC8qIGZhaWx1cmUgKi8KICB9CgogIGlmKGMpIHsKICAgIGNoYXIgKmZvcm1hdF9wdHI7CgogICAgZnB1dHMoIiMgTmV0c2NhcGUgSFRUUCBDb29raWUgRmlsZVxuIgogICAgICAgICAgIiMgaHR0cDovL2N1cmwuaGF4eC5zZS9yZmMvY29va2llX3NwZWMuaHRtbFxuIgogICAgICAgICAgIiMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgbGliY3VybCEgRWRpdCBhdCB5b3VyIG93biByaXNrLlxuXG4iLAogICAgICAgICAgb3V0KTsKICAgIGNvID0gYy0+Y29va2llczsKCiAgICB3aGlsZShjbykgewogICAgICBmb3JtYXRfcHRyID0gZ2V0X25ldHNjYXBlX2Zvcm1hdChjbyk7CiAgICAgIGlmKGZvcm1hdF9wdHIgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYob3V0LCAiI1xuIyBGYXRhbCBsaWJjdXJsIGVycm9yXG4iKTsKICAgICAgICBpZighdXNlX3N0ZG91dCkKICAgICAgICAgIGZjbG9zZShvdXQpOwogICAgICAgIHJldHVybiAxOwogICAgICB9CiAgICAgIGZwcmludGYob3V0LCAiJXNcbiIsIGZvcm1hdF9wdHIpOwogICAgICBmcmVlKGZvcm1hdF9wdHIpOwogICAgICBjbz1jby0+bmV4dDsKICAgIH0KICB9CgogIGlmKCF1c2Vfc3Rkb3V0KQogICAgZmNsb3NlKG91dCk7CgogIHJldHVybiAwOwp9CgpzdHJ1Y3QgY3VybF9zbGlzdCAqQ3VybF9jb29raWVfbGlzdChzdHJ1Y3QgU2Vzc2lvbkhhbmRsZSAqZGF0YSkKewogIHN0cnVjdCBjdXJsX3NsaXN0ICpsaXN0ID0gTlVMTDsKICBzdHJ1Y3QgY3VybF9zbGlzdCAqYmVnOwogIHN0cnVjdCBDb29raWUgKmM7CiAgY2hhciAqbGluZTsKCiAgaWYoKGRhdGEtPmNvb2tpZXMgPT0gTlVMTCkgfHwKICAgICAgKGRhdGEtPmNvb2tpZXMtPm51bWNvb2tpZXMgPT0gMCkpCiAgICByZXR1cm4gTlVMTDsKCiAgYyA9IGRhdGEtPmNvb2tpZXMtPmNvb2tpZXM7CgogIHdoaWxlKGMpIHsKICAgIC8qIGZpbGwgdGhlIGxpc3Qgd2l0aCBfYWxsXyB0aGUgY29va2llcyB3ZSBrbm93ICovCiAgICBsaW5lID0gZ2V0X25ldHNjYXBlX2Zvcm1hdChjKTsKICAgIGlmKCFsaW5lKSB7CiAgICAgIGN1cmxfc2xpc3RfZnJlZV9hbGwobGlzdCk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgYmVnID0gY3VybF9zbGlzdF9hcHBlbmQobGlzdCwgbGluZSk7CiAgICBmcmVlKGxpbmUpOwogICAgaWYoIWJlZykgewogICAgICBjdXJsX3NsaXN0X2ZyZWVfYWxsKGxpc3QpOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGxpc3QgPSBiZWc7CiAgICBjID0gYy0+bmV4dDsKICB9CgogIHJldHVybiBsaXN0Owp9Cgp2b2lkIEN1cmxfZmx1c2hfY29va2llcyhzdHJ1Y3QgU2Vzc2lvbkhhbmRsZSAqZGF0YSwgaW50IGNsZWFudXApCnsKICBpZihkYXRhLT5zZXQuc3RyW1NUUklOR19DT09LSUVKQVJdKSB7CiAgICBpZihkYXRhLT5jaGFuZ2UuY29va2llbGlzdCkgewogICAgICAvKiBJZiB0aGVyZSBpcyBhIGxpc3Qgb2YgY29va2llIGZpbGVzIHRvIHJlYWQsIGRvIGl0IGZpcnN0IHNvIHRoYXQKICAgICAgICAgd2UgaGF2ZSBhbGwgdGhlIHRvbGQgZmlsZXMgcmVhZCBiZWZvcmUgd2Ugd3JpdGUgdGhlIG5ldyBqYXIuCiAgICAgICAgIEN1cmxfY29va2llX2xvYWRmaWxlcygpIExPQ0tTIGFuZCBVTkxPQ0tTIHRoZSBzaGFyZSBpdHNlbGYhICovCiAgICAgIEN1cmxfY29va2llX2xvYWRmaWxlcyhkYXRhKTsKICAgIH0KCiAgICBDdXJsX3NoYXJlX2xvY2soZGF0YSwgQ1VSTF9MT0NLX0RBVEFfQ09PS0lFLCBDVVJMX0xPQ0tfQUNDRVNTX1NJTkdMRSk7CgogICAgLyogaWYgd2UgaGF2ZSBhIGRlc3RpbmF0aW9uIGZpbGUgZm9yIGFsbCB0aGUgY29va2llcyB0byBnZXQgZHVtcGVkIHRvICovCiAgICBpZihjb29raWVfb3V0cHV0KGRhdGEtPmNvb2tpZXMsIGRhdGEtPnNldC5zdHJbU1RSSU5HX0NPT0tJRUpBUl0pKQogICAgICBpbmZvZihkYXRhLCAiV0FSTklORzogZmFpbGVkIHRvIHNhdmUgY29va2llcyBpbiAlc1xuIiwKICAgICAgICAgICAgZGF0YS0+c2V0LnN0cltTVFJJTkdfQ09PS0lFSkFSXSk7CiAgfQogIGVsc2UgewogICAgaWYoY2xlYW51cCAmJiBkYXRhLT5jaGFuZ2UuY29va2llbGlzdCkgewogICAgICAvKiBzaW5jZSBub3RoaW5nIGlzIHdyaXR0ZW4sIHdlIGNhbiBqdXN0IGZyZWUgdGhlIGxpc3Qgb2YgY29va2llIGZpbGUKICAgICAgICAgbmFtZXMgKi8KICAgICAgY3VybF9zbGlzdF9mcmVlX2FsbChkYXRhLT5jaGFuZ2UuY29va2llbGlzdCk7IC8qIGNsZWFuIHVwIGxpc3QgKi8KICAgICAgZGF0YS0+Y2hhbmdlLmNvb2tpZWxpc3QgPSBOVUxMOwogICAgfQogICAgQ3VybF9zaGFyZV9sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSwgQ1VSTF9MT0NLX0FDQ0VTU19TSU5HTEUpOwogIH0KCiAgaWYoY2xlYW51cCAmJiAoIWRhdGEtPnNoYXJlIHx8IChkYXRhLT5jb29raWVzICE9IGRhdGEtPnNoYXJlLT5jb29raWVzKSkpIHsKICAgIEN1cmxfY29va2llX2NsZWFudXAoZGF0YS0+Y29va2llcyk7CiAgfQogIEN1cmxfc2hhcmVfdW5sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSk7Cn0KCiNlbmRpZiAvKiBDVVJMX0RJU0FCTEVfSFRUUCB8fCBDVVJMX0RJU0FCTEVfQ09PS0lFUyAqLwo=