LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiAgIENvcHlyaWdodCAoQykgMTk5OS0yMDAyLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCiogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiB1Y29udigxKTogYW4gaWNvbnYoMSktbGlrZSBjb252ZXJ0ZXIgdXNpbmcgSUNVLgogKgogKiBPcmlnaW5hbCBjb2RlIGJ5IEpvbmFzIFV0dGVyc3Ry9m0gPGpvbmFzLnV0dGVyc3Ryb21Adml0dHJhbi5ub3Jybm9kLnNlPgogKiBjb250cmlidXRlZCBpbiAxOTk5LgogKgogKiBDb252ZXJzaW9uIHRvIHRoZSBDIGNvbnZlcnNpb24gQVBJIGFuZCBtYW55IGltcHJvdmVtZW50cyBieQogKiBZdmVzIEFycm91eWUgPHl2ZXNAcmVhbG5hbWVzLmNvbT4sIGN1cnJlbnQgbWFpbnRhaW5lci4KICoKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2luY2x1ZGUgPHVuaWNvZGUvdXR5cGVzLmg+CiNpbmNsdWRlIDx1bmljb2RlL3VjbnYuaD4KI2luY2x1ZGUgPHVuaWNvZGUvdW5pc3RyLmg+CiNpbmNsdWRlIDx1bmljb2RlL3RyYW5zbGl0Lmg+CgojaW5jbHVkZSAiY21lbW9yeS5oIgojaW5jbHVkZSAiY3N0cmluZy5oIgojaW5jbHVkZSAidXN0cmZtdC5oIgoKI2luY2x1ZGUgInVuaWNvZGUvdXdtc2cuaCIKCiNpZmRlZiBXSU4zMgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxpby5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2VuZGlmCgojaWZkZWYgVUNPTlZNU0dfU1RBVElDCi8qIGJlbG93IGZyb20gdGhlIFJFQURNRSAqLwojaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKI2luY2x1ZGUgInVuaWNvZGUvdWRhdGEuaCIKVV9DRlVOQyBjaGFyIHVjb252bXNnX2RhdFtdOwojZW5kaWYKCiNkZWZpbmUgREVGQVVMVF9CVUZTWiAgIDQwOTYKI2RlZmluZSBVQ09OVk1TRyAidWNvbnZtc2ciCgpzdGF0aWMgVVJlc291cmNlQnVuZGxlICpnQnVuZGxlID0gMDsgICAgLyogQnVuZGxlIGNvbnRhaW5pbmcgbWVzc2FnZXMuICovCgovKgogKiBJbml0aWFsaXplIHRoZSBtZXNzYWdlIGJ1bmRsZSBzbyB0aGF0IG1lc3NhZ2Ugc3RyaW5ncyBjYW4gYmUgZmV0Y2hlZAogKiBieSB1X3dtc2coKS4KICoKICovCgpzdGF0aWMgdm9pZCBpbml0TXNnKGNvbnN0IGNoYXIgKnBuYW1lKSB7CiAgICBzdGF0aWMgaW50IHBzID0gMDsKCiAgICBpZiAoIXBzKSB7CiAgICAgICAgY2hhciBkYXRhUGF0aFsyMDQ4XTsgICAgICAgIC8qIFhYWCBTbG9wcHk6IHNob3VsZCBiZSBQQVRIX01BWC4gKi8KICAgICAgICBVRXJyb3JDb2RlIGVyciA9IFVfWkVST19FUlJPUjsKCiAgICAgICAgcHMgPSAxOwoKICAgICAgICAvKiBTZXQgdXAgb3VyIHN0YXRpYyBkYXRhIC0gaWYgYW55ICovCiNpZmRlZiBVQ09OVk1TR19TVEFUSUMKICAgICAgICB1ZGF0YV9zZXRBcHBEYXRhKFVDT05WTVNHLCAoY29uc3Qgdm9pZCopIHVjb252bXNnX2RhdCwgJmVycik7CiAgICAgICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiB3YXJuaW5nLCBwcm9ibGVtIGluc3RhbGxpbmcgb3VyIHN0YXRpYyByZXNvdXJjZSBidW5kbGUgZGF0YSB1Y29udm1zZzogJXMgLSB0cnlpbmcgYW55d2F5cy5cbiIsCiAgICAgICAgICAgICAgICAgIHBuYW1lLCB1X2Vycm9yTmFtZShlcnIpKTsKICAgICAgICAgIGVyciA9IFVfWkVST19FUlJPUjsgLyogSXQgbWF5IHN0aWxsIGZhaWwgKi8KICAgICAgICB9CiNlbmRpZgoKICAgICAgICAvKiBHZXQgbWVzc2FnZXMuICovCiAgICAgICAgZ0J1bmRsZSA9IHVfd21zZ19zZXRQYXRoKFVDT05WTVNHLCAmZXJyKTsKICAgICAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAgICAgICAgICAgIiVzOiB3YXJuaW5nOiBjb3VsZG4ndCBvcGVuIGJ1bmRsZSAlczogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgcG5hbWUsIFVDT05WTVNHLCB1X2Vycm9yTmFtZShlcnIpKTsKIAogICAgICAgICAgICBlcnIgPSBVX1pFUk9fRVJST1I7CiAgICAgICAgICAgIC8qIHRoYXQgd2FzIHRyeSAjMSwgdHJ5IGFnYWluIHdpdGggYSBwYXRoICovCiAgICAgICAgICAgIHVwcnZfc3RyY3B5KGRhdGFQYXRoLCB1X2dldERhdGFEaXJlY3RvcnkoKSk7CiAgICAgICAgICAgIHVwcnZfc3RyY2F0KGRhdGFQYXRoLCBVQ09OVk1TRyk7CgogICAgICAgICAgICBnQnVuZGxlID0gdV93bXNnX3NldFBhdGgoZGF0YVBhdGgsICZlcnIpOwogICAgICAgICAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICAgICAgICIlczogd2FybmluZzogY291bGRuJ3Qgb3BlbiBidW5kbGUgJXM6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgIHBuYW1lLCBkYXRhUGF0aCwgdV9lcnJvck5hbWUoZXJyKSk7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiB3YXJuaW5nOiBtZXNzYWdlcyB3aWxsIG5vdCBiZSBkaXNwbGF5ZWRcbiIsIHBuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKLyogTWFwcGluZyBvZiBjYWxsYmFjayBuYW1lcyB0byB0aGUgY2FsbGJhY2tzIHBhc3NlZCB0byB0aGUgY29udmVydGVyCiAgIEFQSS4gKi8KCnN0YXRpYyBzdHJ1Y3QgY2FsbGJhY2tfZW50IHsKICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICBVQ29udmVydGVyRnJvbVVDYWxsYmFjayBmcm9tdTsKICAgIGNvbnN0IHZvaWQgKmZyb211Y3R4dDsKICAgIFVDb252ZXJ0ZXJUb1VDYWxsYmFjayB0b3U7CiAgICBjb25zdCB2b2lkICp0b3VjdHh0Owp9IHRyYW5zY29kZV9jYWxsYmFja3NbXSA9IHsKICAgIHsgInN1YnN0aXR1dGUiLAogICAgICBVQ05WX0ZST01fVV9DQUxMQkFDS19TVUJTVElUVVRFLCAwLAogICAgICBVQ05WX1RPX1VfQ0FMTEJBQ0tfU1VCU1RJVFVURSwgMCB9LAogICAgeyAic2tpcCIsCiAgICAgIFVDTlZfRlJPTV9VX0NBTExCQUNLX1NLSVAsIDAsCiAgICAgIFVDTlZfVE9fVV9DQUxMQkFDS19TS0lQLCAwIH0sCiAgICB7ICJzdG9wIiwKICAgICAgVUNOVl9GUk9NX1VfQ0FMTEJBQ0tfU1RPUCwgMCwKICAgICAgVUNOVl9UT19VX0NBTExCQUNLX1NUT1AsIDAgfSwKICAgIHsgImVzY2FwZSIsCiAgICAgIFVDTlZfRlJPTV9VX0NBTExCQUNLX0VTQ0FQRSwgMCwKICAgICAgVUNOVl9UT19VX0NBTExCQUNLX0VTQ0FQRSwgMH0sCiAgICB7ICJlc2NhcGUtaWN1IiwKICAgICAgVUNOVl9GUk9NX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9JQ1UsCiAgICAgIFVDTlZfVE9fVV9DQUxMQkFDS19FU0NBUEUsIFVDTlZfRVNDQVBFX0lDVSB9LAogICAgeyAiZXNjYXBlLWphdmEiLAogICAgICBVQ05WX0ZST01fVV9DQUxMQkFDS19FU0NBUEUsIFVDTlZfRVNDQVBFX0pBVkEsCiAgICAgIFVDTlZfVE9fVV9DQUxMQkFDS19FU0NBUEUsIFVDTlZfRVNDQVBFX0pBVkEgfSwKICAgIHsgImVzY2FwZS1jIiwKICAgICAgVUNOVl9GUk9NX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9DLAogICAgICBVQ05WX1RPX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9DIH0sCiAgICB7ICJlc2NhcGUteG1sIiwKICAgICAgVUNOVl9GUk9NX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9YTUxfSEVYLAogICAgICBVQ05WX1RPX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9YTUxfSEVYIH0sCiAgICB7ICJlc2NhcGUteG1sLWhleCIsCiAgICAgIFVDTlZfRlJPTV9VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfWE1MX0hFWCwKICAgICAgVUNOVl9UT19VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfWE1MX0hFWCB9LAogICAgeyAiZXNjYXBlLXhtbC1kZWMiLAogICAgICBVQ05WX0ZST01fVV9DQUxMQkFDS19FU0NBUEUsIFVDTlZfRVNDQVBFX1hNTF9ERUMsCiAgICAgIFVDTlZfVE9fVV9DQUxMQkFDS19FU0NBUEUsIFVDTlZfRVNDQVBFX1hNTF9ERUMgfSwKICAgIHsgImVzY2FwZS11bmljb2RlIiwgVUNOVl9GUk9NX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9VTklDT0RFLAogICAgICBVQ05WX1RPX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9VTklDT0RFIH0KfTsKCi8qIFJldHVybiBhIHBvaW50ZXIgdG8gYSBjYWxsYmFjayByZWNvcmQgZ2l2ZW4gaXRzIG5hbWUuICovCgpzdGF0aWMgY29uc3Qgc3RydWN0IGNhbGxiYWNrX2VudCAqZmluZENhbGxiYWNrKGNvbnN0IGNoYXIgKm5hbWUpIHsKICAgIGludCBpLCBjb3VudCA9CiAgICAgICAgc2l6ZW9mKHRyYW5zY29kZV9jYWxsYmFja3MpIC8gc2l6ZW9mKCp0cmFuc2NvZGVfY2FsbGJhY2tzKTsKCiAgICAvKiBXZSdsbCBkbyBhIGxpbmVhciBzZWFyY2gsIHRoZXJlIGFyZW4ndCBtYW55IG9mIHRoZW0gYW5kIGJzZWFyY2goKQogICAgICAgbWF5IG5vdCBiZSB0aGF0IHBvcnRhYmxlLiAqLwoKICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgICAgaWYgKCF1cHJ2X3N0cmljbXAobmFtZSwgdHJhbnNjb2RlX2NhbGxiYWNrc1tpXS5uYW1lKSkgewogICAgICAgICAgICByZXR1cm4gJnRyYW5zY29kZV9jYWxsYmFja3NbaV07CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9CgovKiBQcmludCBjb252ZXJ0ZXIgaW5mb3JtYXRpb24uIElmIGxvb2tmb3IgaXMgc2V0LCBvbmx5IHRoYXQgY29udmVydGVyIHdpbGwKICAgYmUgcHJpbnRlZCwgb3RoZXJ3aXNlIGFsbCBjb252ZXJ0ZXJzIHdpbGwgYmUgcHJpbnRlZC4gSWYgY2Fub24gaXMgbm9uCiAgIHplcm8sIHRhZ3MgYW5kIGFsaWFzZXMgZm9yIGVhY2ggY29udmVydGVyIGFyZSBwcmludGVkIHRvbywgaW4gdGhlIGZvcm1hdAogICBleHBlY3RlZCBmb3IgY29udnJ0ZXJzLnR4dCg1KS4gKi8KCnN0YXRpYyBpbnQgcHJpbnRDb252ZXJ0ZXJzKGNvbnN0IGNoYXIgKnBuYW1lLCBjb25zdCBjaGFyICpsb29rZm9yLAogICAgaW50IGNhbm9uKQp7CiAgICBVRXJyb3JDb2RlIGVyciA9IFVfWkVST19FUlJPUjsKICAgIGludDMyX3QgbnVtOwogICAgdWludDE2X3QgbnVtX3N0ZHM7CiAgICBjb25zdCBjaGFyICoqc3RkczsKCiAgICAvKiBJZiB0aGVyZSBpcyBhIHNwZWNpZmllZCBuYW1lLCBqdXN0IGhhbmRsZSB0aGF0IG5vdy4gKi8KCiAgICBpZiAobG9va2ZvcikgewogICAgICAgIGlmICghY2Fub24pIHsKICAgICAgICAgICAgcHJpbnRmKCIlc1xuIiwgbG9va2Zvcik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogIEJlY2F1c2Ugd2UgYXJlIHByaW50aW5nIGEgY2Fub25pY2FsIG5hbWUsIHdlIG5lZWQgdGhlCiAgICAgICAgICAgIHRydWUgY29udmVydGVyIG5hbWUuIFdlJ3ZlIGRvbmUgdGhhdCBhbHJlYWR5IGV4Y2VwdCBmb3IKICAgICAgICAgICAgdGhlIGRlZmF1bHQgbmFtZSAoYmVjYXVzZSB3ZSB3YW50IHRvIHByaW50IHRoZSBleGFjdAogICAgICAgICAgICBuYW1lIG9uZSB3b3VsZCBnZXQgd2hlbiBjYWxsaW5nIHVjbnZfZ2V0RGVmYXVsdE5hbWUoKQogICAgICAgICAgICBpbiBub24tY2Fub24gbW9kZSkuIEJ1dCBzaW5jZSB3ZSBkbyBub3Qga25vdyBhdCB0aGlzCiAgICAgICAgICAgIHBvaW50IGlmIHdlIGhhdmUgdGhlIGRlZmF1bHQgbmFtZSBvciBzb21ldGhpbmcgZWxzZSwgd2UKICAgICAgICAgICAgbmVlZCB0byBub3JtYWxpemUgYWdhaW4gdG8gdGhlIGNhbm9uaWNhbCBjb252ZXJ0ZXIKICAgICAgICAgICAgbmFtZS4gKi8KCiAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRydWVuYW1lID0gdWNudl9nZXRBbGlhcyhsb29rZm9yLCAwLCAmZXJyKTsKICAgICAgICAgICAgaWYgKFVfU1VDQ0VTUyhlcnIpKSB7CiAgICAgICAgICAgICAgICBsb29rZm9yID0gdHJ1ZW5hbWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlcnIgPSBVX1pFUk9fRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyogUHJpbnQgY29udmVydGVyIG5hbWVzLiBXZSBjb21lIGhlcmUgZm9yIG9uZSBvZiB0d28gcmVhc29uczogd2UKICAgICAgIGFyZSBwcmludGluZyBhbGwgdGhlIG5hbWVzIChsb29rZm9yIHdhcyBudWxsKSwgb3Igd2UgaGF2ZSBhCiAgICAgICBzaW5nbGUgY29udmVydGVyIHRvIHByaW50IGJ1dCBpbiBjYW5vbiBtb2RlLCBoZW5jZSB3ZSBuZWVkIHRvCiAgICAgICBnZXQgdG8gaXQgaW4gb3JkZXIgdG8gcHJpbnQgZXZlcnl0aGluZy4gKi8KCiAgICBudW0gPSB1Y252X2NvdW50QXZhaWxhYmxlKCk7CiAgICBpZiAobnVtIDw9IDApIHsKICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICB1X3dtc2coc3RkZXJyLCAiY2FudEdldE5hbWVzIik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgaWYgKGxvb2tmb3IpIHsKICAgICAgICBudW0gPSAxOyAgICAgICAgICAgICAgICAvKiBXZSBrbm93IHdoZXJlIHdlIHdhbnQgdG8gYmUuICovCiAgICB9CgogICAgbnVtX3N0ZHMgPSB1Y252X2NvdW50U3RhbmRhcmRzKCk7CiAgICBzdGRzID0gKGNvbnN0IGNoYXIgKiopIHVwcnZfbWFsbG9jKG51bV9zdGRzICogc2l6ZW9mKCpzdGRzKSk7CiAgICBpZiAoIXN0ZHMpIHsKICAgICAgICB1X3dtc2coc3RkZXJyLCAiY2FudEdldFRhZyIsIHVfd21zZ19lcnJvck5hbWUoVV9NRU1PUllfQUxMT0NBVElPTl9FUlJPUikpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0gZWxzZSB7CiAgICAgICAgdWludDE2X3QgczsKCiAgICAgICAgZm9yIChzID0gMDsgcyA8IG51bV9zdGRzOyArK3MpIHsKICAgICAgICAgICAgc3Rkc1tzXSA9IHVjbnZfZ2V0U3RhbmRhcmQocywgJmVycik7CiAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRHZXRUYWciLCB1X3dtc2dfZXJyb3JOYW1lKGVycikpOwogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bTsgaSsrKSB7CiAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICAgICB1aW50MTZfdCBudW1fYWxpYXNlczsKCiAgICAgICAgLyogU2V0IHRoZSBuYW1lIGVpdGhlciB0byB3aGF0IHdlIGFyZSBsb29raW5nIGZvciwgb3IKICAgICAgICB0byB0aGUgY3VycmVudCBjb252ZXJ0ZXIgbmFtZS4gKi8KCiAgICAgICAgaWYgKGxvb2tmb3IpIHsKICAgICAgICAgICAgbmFtZSA9IGxvb2tmb3I7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmFtZSA9IHVjbnZfZ2V0QXZhaWxhYmxlTmFtZShpKTsKICAgICAgICB9CgogICAgICAgIC8qIEdldCBhbGwgdGhlIGFsaWFzZXMgYXNzb2NpYXRlZCB0byB0aGUgbmFtZS4gKi8KCiAgICAgICAgZXJyID0gVV9aRVJPX0VSUk9SOwogICAgICAgIG51bV9hbGlhc2VzID0gdWNudl9jb3VudEFsaWFzZXMobmFtZSwgJmVycik7CiAgICAgICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgICAgIHByaW50ZigiJXMiLCBuYW1lKTsKCiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKG5hbWUsIHVwcnZfc3RybGVuKG5hbWUpICsgMSk7CiAgICAgICAgICAgIHB1dGNoYXIoJ1x0Jyk7CiAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50R2V0QWxpYXNlcyIsIHN0ci5nZXRCdWZmZXIoKSwKICAgICAgICAgICAgICAgIHVfd21zZ19lcnJvck5hbWUoZXJyKSk7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1aW50MTZfdCBhLCBzLCB0OwoKICAgICAgICAgICAgLyogV3JpdGUgYWxsIHRoZSBhbGlhc2VzIGFuZCB0aGVpciB0YWdzLiAqLwoKICAgICAgICAgICAgZm9yIChhID0gMDsgYSA8IG51bV9hbGlhc2VzOyArK2EpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFsaWFzID0gdWNudl9nZXRBbGlhcyhuYW1lLCBhLCAmZXJyKTsKCiAgICAgICAgICAgICAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cihuYW1lLCB1cHJ2X3N0cmxlbihuYW1lKSArIDEpOwogICAgICAgICAgICAgICAgICAgIHB1dGNoYXIoJ1x0Jyk7CiAgICAgICAgICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRHZXRBbGlhc2VzIiwgc3RyLmdldEJ1ZmZlcigpLAogICAgICAgICAgICAgICAgICAgICAgICB1X3dtc2dfZXJyb3JOYW1lKGVycikpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwcmludGYoIiVzIiwgYWxpYXMpOwoKICAgICAgICAgICAgICAgIC8qIExvb2sgKHNsb3dseSwgbGluZWFyIHNlYXJjaGluZykgZm9yIGEgdGFnLiAqLwoKICAgICAgICAgICAgICAgIGlmIChjYW5vbikgewogICAgICAgICAgICAgICAgICAgIGZvciAocyA9IHQgPSAwOyBzIDwgbnVtX3N0ZHM7ICsrcykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGFuZGFyZCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y252X2dldFN0YW5kYXJkTmFtZShuYW1lLCBzdGRzW3NdLCAmZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFVfU1VDQ0VTUyhlcnIpICYmIHN0YW5kYXJkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChzdGFuZGFyZCwgYWxpYXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiIHsiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICVzIiwgc3Rkc1tzXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgfSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKiBNb3ZlIG9uLiAqLwoKICAgICAgICAgICAgICAgIGlmIChhIDwgbnVtX2FsaWFzZXMgLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgcHV0Y2hhcihhIHx8ICFjYW5vbiA/ICcgJyA6ICdcdCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBUZXJtaW5hdGUgdGhpcyBlbnRyeS4gKi8KCiAgICAgICAgaWYgKGNhbm9uKSB7CiAgICAgICAgICAgIHB1dGNoYXIoJ1xuJyk7CiAgICAgICAgfSBlbHNlIGlmIChpIDwgbnVtIC0gMSkgewogICAgICAgICAgICBwdXRjaGFyKCcgJyk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIEZyZWUgdGVtcG9yYXJ5IGRhdGEuICovCgogICAgdXBydl9mcmVlKHN0ZHMpOwoKICAgIC8qIFN1Y2Nlc3MuICovCgogICAgcmV0dXJuIDA7Cn0KCi8qIFByaW50IGFsbCBhdmFpbGFibGUgdHJhbnNsaXRlcmF0b3JzLiBJZiBjYW5vbiBpcyBub24gemVybywgcHJpbnQKICAgb25lIHRyYW5zbGl0ZXJhdG9yIHBlciBsaW5lLiAqLwoKc3RhdGljIGludCBwcmludFRyYW5zbGl0ZXJhdG9ycyhpbnQgY2Fub24pCnsKICAgIGludDMyX3QgbnVtdHJhbnMgPSB1dHJhbnNfY291bnRBdmFpbGFibGVJRHMoKSwgaTsKICAgIGludCBidWZsZW4gPSA1MTI7CiAgICBjaGFyICpidWYgPSAoY2hhciAqKSB1cHJ2X21hbGxvYyhidWZsZW4pOwogICAgY2hhciBzdGF0aWNidWZbNTEyXTsKCiAgICBjaGFyIHNlcGNoYXIgPSBjYW5vbiA/ICdcbicgOiAnICc7CgogICAgaWYgKCFidWYpIHsKICAgICAgICBidWYgPSBzdGF0aWNidWY7CiAgICAgICAgYnVmbGVuID0gc2l6ZW9mKHN0YXRpY2J1Zik7CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8IG51bXRyYW5zOyArK2kpIHsKICAgICAgICBpbnQzMl90IGxlbiA9IHV0cmFuc19nZXRBdmFpbGFibGVJRChpLCBidWYsIGJ1Zmxlbik7CiAgICAgICAgaWYgKGxlbiA+PSBidWZsZW4gLSAxKSB7CiAgICAgICAgICAgIGlmIChidWYgIT0gc3RhdGljYnVmKSB7CiAgICAgICAgICAgICAgICBidWZsZW4gPDw9IDE7CiAgICAgICAgICAgICAgICBpZiAoYnVmbGVuIDwgbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgYnVmbGVuID0gbGVuICsgNjQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBidWYgPSAoY2hhciAqKSB1cHJ2X3JlYWxsb2MoYnVmLCBidWZsZW4pOwogICAgICAgICAgICAgICAgaWYgKCFidWYpIHsKICAgICAgICAgICAgICAgICAgICBidWYgPSBzdGF0aWNidWY7CiAgICAgICAgICAgICAgICAgICAgYnVmbGVuID0gc2l6ZW9mKHN0YXRpY2J1Zik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdXRyYW5zX2dldEF2YWlsYWJsZUlEKGksIGJ1ZiwgYnVmbGVuKTsKICAgICAgICAgICAgaWYgKGxlbiA+PSBidWZsZW4pIHsKICAgICAgICAgICAgICAgIHVwcnZfc3RyY3B5KGJ1ZiArIGJ1ZmxlbiAtIDQsICIuLi4iKTsgLyogVHJ1bmNhdGUgdGhlIG5hbWUuICovCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHByaW50ZigiJXMiLCBidWYpOwogICAgICAgIGlmIChpIDwgbnVtdHJhbnMgLSAxKSB7CiAgICAgICAgICAgIHB1dGNoYXIoc2VwY2hhcik7CiAgICAgICAgfQogICAgfQoKICAgIC8qIEFkZCBhIHRlcm1pbmF0aW5nIG5ld2xpbmUgaWYgbmVlZGVkLiAqLwoKICAgIGlmIChzZXBjaGFyICE9ICdcbicpIHsKICAgICAgICBwdXRjaGFyKCdcbicpOwogICAgfQoKICAgIC8qIEZyZWUgdGVtcG9yYXJ5IGRhdGEuICovCgogICAgaWYgKGJ1ZiAhPSBzdGF0aWNidWYpIHsKICAgICAgICB1cHJ2X2ZyZWUoYnVmKTsKICAgIH0KCiAgICAvKiBTdWNjZXNzLiAqLwoKICAgIHJldHVybiAwOwp9CgovKiBSZXR1cm4gdGhlIG9mZnNldCBvZiBhIGJ5dGUgaW4gaXRzIHNvdXJjZSwgZ2l2ZW4gdGhlIGZyb20gYW5kIHRvIG9mZnNldHMKICAgdmVjdG9ycyBhbmQgdGhlIGJ5dGUgb2Zmc2V0IGl0c2VsZi4gKi8KCnN0YXRpYyBpbmxpbmUgaW50MzJfdCBkYXRhT2Zmc2V0KGludDMyX3Qgd2hlcmV0bywKICAgIGNvbnN0IGludDMyX3QgKmZyb21vZmZzZXRzLCBpbnQzMl90IGZyb21zeiwKICAgIGNvbnN0IGludDMyX3QgKnRvb2Zmc2V0cywgaW50MzJfdCB0b3N6KSB7CiAgICBpZiAod2hlcmV0byA+PSAwICYmIHdoZXJldG8gPCB0b3N6KSB7CiAgICAgICAgd2hlcmV0byA9IHRvb2Zmc2V0c1t3aGVyZXRvXTsKICAgICAgICBpZiAod2hlcmV0byA+PSAwICYmIHdoZXJldG8gPCBmcm9tc3opIHsKICAgICAgICAgICAgcmV0dXJuIGZyb21vZmZzZXRzW3doZXJldG9dOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMDsKfQoKLy8gQ29udmVydCBhIGZpbGUgZnJvbSBvbmUgZW5jb2RpbmcgdG8gYW5vdGhlcgpzdGF0aWMgVUJvb2wgY29udmVydEZpbGUoY29uc3QgY2hhciAqcG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tY3BhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBVQ29udmVydGVyVG9VQ2FsbGJhY2sgdG91Y2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp0b3VjdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9jcGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJGcm9tVUNhbGxiYWNrIGZyb211Y2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpmcm9tdWN0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmFsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmc3osCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0cmFuc2xpdCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmluZmlsZXN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEUgKiBvdXRmaWxlLCBpbnQgdmVyYm9zZSkKewogICAgRklMRSAqaW5maWxlOwogICAgVUJvb2wgcmV0ID0gVFJVRTsKICAgIFVDb252ZXJ0ZXIgKmNvbnZmcm9tID0gMDsKICAgIFVDb252ZXJ0ZXIgKmNvbnZ0byA9IDA7CiAgICBVRXJyb3JDb2RlIGVyciA9IFVfWkVST19FUlJPUjsKICAgIFVCb29sIGZsdXNoOwogICAgY29uc3QgY2hhciAqY2J1ZnA7CiAgICBjaGFyICpidWZwOwogICAgY2hhciAqYnVmID0gMDsKCiAgICB1aW50MzJfdCBpbmZvZmZzZXQgPSAwLCBvdXRmb2Zmc2V0ID0gMDsgICAvKiBXaGVyZSB3ZSBhcmUgaW4gdGhlIGZpbGUsIGZvciBlcnJvciByZXBvcnRpbmcuICovCgogICAgY29uc3QgVUNoYXIgKnVuaWJ1ZmJwOwogICAgVUNoYXIgKnVuaWJ1ZnA7CiAgICBVQ2hhciAqdW5pYnVmID0gMDsKICAgIGludDMyX3QgKmZyb21vZmZzZXRzID0gMCwgKnRvb2Zmc2V0cyA9IDA7CgogICAgc2l6ZV90IHJkLCB3ciwgdG9idWZzejsKCiAgICBUcmFuc2xpdGVyYXRvciAqdCA9IDA7ICAgICAgLy8gVHJhbnNsaXRlcmF0b3IgYWN0aW5nIG9uIFVuaWNvZGUgZGF0YS4KICAgIFVuaWNvZGVTdHJpbmcgdTsgICAgICAgICAgICAvLyBTdHJpbmcgdG8gZG8gdGhlIHRyYW5zbGl0ZXJhdGlvbi4KCiAgICAvLyBPcGVuIHRoZSBjb3JyZWN0IGlucHV0IGZpbGUgb3IgY29ubmVjdCB0byBzdGRpbiBmb3IgcmVhZGluZyBpbnB1dAoKICAgIGlmIChpbmZpbGVzdHIgIT0gMCAmJiBzdHJjbXAoaW5maWxlc3RyLCAiLSIpKSB7CiAgICAgICAgaW5maWxlID0gZm9wZW4oaW5maWxlc3RyLCAicmIiKTsKICAgICAgICBpZiAoaW5maWxlID09IDApIHsKICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIxKGluZmlsZXN0ciwgIiIpOwogICAgICAgICAgICBzdHIxLmFwcGVuZCgoVUNoYXIzMikgMCk7CiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyMihzdHJlcnJvcihlcnJubyksICIiKTsKICAgICAgICAgICAgc3RyMi5hcHBlbmQoKFVDaGFyMzIpIDApOwogICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRPcGVuSW5wdXRGIiwgc3RyMS5nZXRCdWZmZXIoKSwgc3RyMi5nZXRCdWZmZXIoKSk7CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGluZmlsZXN0ciA9ICItIjsKICAgICAgICBpbmZpbGUgPSBzdGRpbjsKI2lmZGVmIFdJTjMyCiAgICAgICAgaWYgKHNldG1vZGUoZmlsZW5vKHN0ZGluKSwgT19CSU5BUlkpID09IC0xKSB7CiAgICAgICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAiY2FudFNldEluQmluTW9kZSIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgfQojZW5kaWYKICAgIH0KCiAgICBpZiAodmVyYm9zZSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6XG4iLCBpbmZpbGVzdHIpOwogICAgfQoKICAgIC8vIENyZWF0ZSB0cmFuc2xpdGVyYXRvciBhcyBuZWVkZWQuCgogICAgaWYgKHRyYW5zbGl0ICE9IE5VTEwgJiYgKnRyYW5zbGl0KSB7CiAgICAgICAgVVBhcnNlRXJyb3IgcGFyc2U7CiAgICAgICAgVW5pY29kZVN0cmluZyBzdHIodHJhbnNsaXQpLCBwZXN0cjsKCiAgICAgICAgLyogQ3JlYXRlIGZyb20gcnVsZXMgb3IgYnkgSUQgYXMgbmVlZGVkLiAqLwoKICAgICAgICBwYXJzZS5saW5lID0gLTE7CgogICAgICAgIGlmICh1cHJ2X3N0cmNocih0cmFuc2xpdCwgJzonKSB8fCB1cHJ2X3N0cmNocih0cmFuc2xpdCwgJz4nKSB8fCB1cHJ2X3N0cmNocih0cmFuc2xpdCwgJzwnKSB8fCB1cHJ2X3N0cmNocih0cmFuc2xpdCwgJz4nKSkgewogICAgICAgICAgICB0ID0gVHJhbnNsaXRlcmF0b3I6OmNyZWF0ZUZyb21SdWxlcygiVWNvbnYiLCBzdHIsIFVUUkFOU19GT1JXQVJELCBwYXJzZSwgZXJyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0ID0gVHJhbnNsaXRlcmF0b3I6OmNyZWF0ZUluc3RhbmNlKHRyYW5zbGl0LCBVVFJBTlNfRk9SV0FSRCwgZXJyKTsKICAgICAgICB9CgogICAgICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgICAgICBzdHIuYXBwZW5kKChVQ2hhcjMyKSAwKTsKICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CgogICAgICAgICAgICBpZiAocGFyc2UubGluZSA+PSAwKSB7CiAgICAgICAgICAgICAgICBVQ2hhciBsaW5lYnVmWzIwXSwgb2Zmc2V0YnVmWzIwXTsKICAgICAgICAgICAgICAgIHVwcnZfaXRvdShsaW5lYnVmLCBwYXJzZS5saW5lLCAxMCwgMCk7CiAgICAgICAgICAgICAgICB1cHJ2X2l0b3Uob2Zmc2V0YnVmLCBwYXJzZS5vZmZzZXQsIDEwLCAwKTsKICAgICAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50Q3JlYXRlVHJhbnNsaXRQYXJzZUVyciIsIHN0ci5nZXRCdWZmZXIoKSwKICAgICAgICAgICAgICAgICAgICB1X3dtc2dfZXJyb3JOYW1lKGVyciksIGxpbmVidWYsIG9mZnNldGJ1Zik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAiY2FudENyZWF0ZVRyYW5zbGl0Iiwgc3RyLmdldEJ1ZmZlcigpLAogICAgICAgICAgICAgICAgICAgIHVfd21zZ19lcnJvck5hbWUoZXJyKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICBkZWxldGUgdDsKICAgICAgICAgICAgICAgIHQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgICAgICB9CiAgICB9CgogICAgLy8gQ3JlYXRlIGNvZGVwYWdlIGNvbnZlcnRlci4gSWYgdGhlIGNvZGVwYWdlIG9yIGl0cyBhbGlhc2VzIHdlcmVuJ3QKICAgIC8vIGF2YWlsYWJsZSwgaXQgcmV0dXJucyBOVUxMIGFuZCBhIGZhaWx1cmUgY29kZS4gV2UgYWxzbyBzZXQgdGhlCiAgICAvLyBjYWxsYmFja3MsIGFuZCByZXR1cm4gZXJyb3JzIGluIHRoZSBzYW1lIHdheS4KCiAgICBjb252ZnJvbSA9IHVjbnZfb3Blbihmcm9tY3BhZ2UsICZlcnIpOwogICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgVW5pY29kZVN0cmluZyBzdHIoZnJvbWNwYWdlLCB1cHJ2X3N0cmxlbihmcm9tY3BhZ2UpICsgMSk7CiAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRPcGVuRnJvbUNvZGVzZXQiLCBzdHIuZ2V0QnVmZmVyKCksCiAgICAgICAgICAgIHVfd21zZ19lcnJvck5hbWUoZXJyKSk7CiAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgfQogICAgdWNudl9zZXRUb1VDYWxsQmFjayhjb252ZnJvbSwgdG91Y2FsbGJhY2ssIHRvdWN0eHQsIDAsIDAsICZlcnIpOwogICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRTZXRDYWxsYmFjayIsIHVfd21zZ19lcnJvck5hbWUoZXJyKSk7CiAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgfQoKICAgIGNvbnZ0byA9IHVjbnZfb3Blbih0b2NwYWdlLCAmZXJyKTsKICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKHRvY3BhZ2UsIHVwcnZfc3RybGVuKHRvY3BhZ2UpICsgMSk7CiAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRPcGVuVG9Db2Rlc2V0Iiwgc3RyLmdldEJ1ZmZlcigpLAogICAgICAgICAgICB1X3dtc2dfZXJyb3JOYW1lKGVycikpOwogICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgIH0KICAgIHVjbnZfc2V0RnJvbVVDYWxsQmFjayhjb252dG8sIGZyb211Y2FsbGJhY2ssIGZyb211Y3R4dCwgMCwgMCwgJmVycik7CiAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICB1X3dtc2coc3RkZXJyLCAiY2FudFNldENhbGxiYWNrIiwgdV93bXNnX2Vycm9yTmFtZShlcnIpKTsKICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgICB9CiAgICB1Y252X3NldEZhbGxiYWNrKGNvbnZ0bywgZmFsbGJhY2spOwoKICAgIC8vIFRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgYWx3YXlzIGlzIG9mIGVub3VnaCBzaXplLCB3ZQogICAgLy8gbXVzdCB0YWtlIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvLCB0aGF0IGlzIHRoZSBjaGFyYWN0ZXIgaW4KICAgIC8vIHRoZSBjb2RlcGFnZSB0aGF0IHVzZXMgdGhlIG1vc3QgYnl0ZXMgYW5kIG11bHRpcGx5IGl0IGFnYWluc3QKICAgIC8vIHRoZSBidWZmZXIgc2l6ZS4KCiAgICB0b2J1ZnN6ID0gYnVmc3ogKiB1Y252X2dldE1heENoYXJTaXplKGNvbnZ0byk7CiAgICBidWYgPSBuZXcgY2hhclt0b2J1ZnN6XTsKICAgIHVuaWJ1ZiA9IG5ldyBVQ2hhcltidWZzel07CgogICAgZnJvbW9mZnNldHMgPSBuZXcgaW50MzJfdFtidWZzel07CiAgICB0b29mZnNldHMgPSBuZXcgaW50MzJfdFt0b2J1ZnN6XTsKCiAgICAvLyBPSywgd2UgY2FuIGNvbnZlcnQgbm93LgoKICAgIGRvIHsKICAgICAgICBjaGFyIHdpbGxleGl0ID0gMDsKCiAgICAgICAgcmQgPSBmcmVhZChidWYsIDEsIGJ1ZnN6LCBpbmZpbGUpOwogICAgICAgIGlmIChmZXJyb3IoaW5maWxlKSAhPSAwKSB7CiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgIHN0ci5hcHBlbmQoKFVDaGFyMzIpIDApOwogICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRSZWFkIiwgc3RyLmdldEJ1ZmZlcigpKTsKICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgICAgIH0KCiAgICAgICAgLy8gQ29udmVydCB0aGUgcmVhZCBidWZmZXIgaW50byB0aGUgbmV3IGNvZGluZwogICAgICAgIC8vIEFmdGVyIHRoZSBjYWxsICd1bmlidWZwJyB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgbGFzdAogICAgICAgIC8vIGNoYXJhY3RlciB0aGF0IHdhcyBjb252ZXJ0ZWQgaW4gdGhlICd1bmlidWYnLgogICAgICAgIC8vIEFsc28gdGhlICdjYnVmcCcgaXMgcG9zaXRpb25lZCBvbiB0aGUgbGFzdCBjb252ZXJ0ZWQKICAgICAgICAvLyBjaGFyYWN0ZXIuCiAgICAgICAgLy8gQXQgdGhlIGxhc3QgY29udmVyc2lvbiBpbiB0aGUgZmlsZSwgZmx1c2ggc2hvdWxkIGJlIHNldCB0bwogICAgICAgIC8vIHRydWUgc28gdGhhdCB3ZSBnZXQgYWxsIGNoYXJhY3RlcnMgY29udmVydGVkCiAgICAgICAgLy8KICAgICAgICAvLyBUaGUgY29udmVydGVyIG11c3QgYmUgZmx1c2hlZCBhdCB0aGUgZW5kIG9mIGNvbnZlcnNpb24gc28KICAgICAgICAvLyB0aGF0IGNoYXJhY3RlcnMgb24gaG9sZCBhbHNvIHdpbGwgYmUgd3JpdHRlbi4KCiAgICAgICAgdW5pYnVmcCA9IHVuaWJ1ZjsKICAgICAgICBjYnVmcCA9IGJ1ZjsKICAgICAgICBmbHVzaCA9IHJkICE9IGJ1ZnN6OwogICAgICAgIHVjbnZfdG9Vbmljb2RlKGNvbnZmcm9tLCAmdW5pYnVmcCwgdW5pYnVmcCArIGJ1ZnN6LCAmY2J1ZnAsCiAgICAgICAgICAgIGNidWZwICsgcmQsIGZyb21vZmZzZXRzLCBmbHVzaCwgJmVycik7CgogICAgICAgIGluZm9mZnNldCArPSBjYnVmcCAtIGJ1ZjsKCiAgICAgICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgICAgIGNoYXIgcG9zWzMyXTsKICAgICAgICAgICAgc3ByaW50Zihwb3MsICIldSIsIGluZm9mZnNldCAtIDEpOwogICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cihwb3MsIHVwcnZfc3RybGVuKHBvcykgKyAxKTsKICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJwcm9ibGVtQ3Z0VG9VIiwgc3RyLmdldEJ1ZmZlcigpLCB1X3dtc2dfZXJyb3JOYW1lKGVycikpOwogICAgICAgICAgICB3aWxsZXhpdCA9IDE7CiAgICAgICAgfQoKICAgICAgICAvLyBBdCB0aGUgbGFzdCBjb252ZXJzaW9uLCB0aGUgY29udmVydGVkIGNoYXJhY3RlcnMgc2hvdWxkIGJlCiAgICAgICAgLy8gZXF1YWwgdG8gbnVtYmVyIG9mIGNoYXJzIHJlYWQuCgogICAgICAgIGlmIChmbHVzaCAmJiAhd2lsbGV4aXQgJiYgY2J1ZnAgIT0gKGJ1ZiArIHJkKSkgewogICAgICAgICAgICBjaGFyIHBvc1szMl07CiAgICAgICAgICAgIHNwcmludGYocG9zLCAiJXUiLCBpbmZvZmZzZXQpOwogICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cihwb3MsIHVwcnZfc3RybGVuKHBvcykgKyAxKTsKICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJwcmVtRW5kSW5wdXQiLCBzdHIuZ2V0QnVmZmVyKCkpOwogICAgICAgICAgICB3aWxsZXhpdCA9IDE7CiAgICAgICAgfQoKICAgICAgICAvLyBQcmVwYXJlIHRvIHRyYW5zbGl0ZXJhdGUgYW5kIGNvbnZlcnQuCgogICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgIHUuc2V0VG8odW5pYnVmLCB1bmlidWZwIC0gdW5pYnVmKTsgLy8gQ29weSBpbnRvIHN0cmluZy4KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1LnNldFRvKHVuaWJ1ZiwgdW5pYnVmcCAtIHVuaWJ1ZiwgYnVmc3opOyAvLyBTaGFyZSB0aGUgYnVmZmVyLgogICAgICAgIH0KCiAgICAgICAgLy8gVHJhbnNsaXRlcmF0ZSBpZiBuZWVkZWQuCgogICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgIHQtPnRyYW5zbGl0ZXJhdGUodSk7CiAgICAgICAgfQoKICAgICAgICBpbnQzMl90IHVsZW4gPSB1Lmxlbmd0aCgpOwoKICAgICAgICAvLyBDb252ZXJ0IHRoZSBVbmljb2RlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBjb2RlcGFnZQogICAgICAgIC8vIEFnYWluICdidWZwJyB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgbGFzdCBjb252ZXJ0ZWQgY2hhcmFjdGVyCiAgICAgICAgLy8gQW5kICd1bmlidWZicCcgd2lsbCBiZSBwbGFjZWQgb24gdGhlIGxhc3QgY29udmVydGVkIHVuaWNvZGUgY2hhcmFjdGVyCiAgICAgICAgLy8gQXQgdGhlIGxhc3QgY29udmVyc2lvbiBmbHVzaCBzaG91bGQgYmUgc2V0IHRvIHRydWUgdG8gZW5zdXJlIHRoYXQKICAgICAgICAvLyBhbGwgY2hhcmFjdGVycyBsZWZ0IGdldCBjb252ZXJ0ZWQKCiAgICAgICAgY29uc3QgVUNoYXIgKnVuaWJ1ZnUgPSB1bmlidWZicCA9IHUuZ2V0QnVmZmVyKCk7CgogICAgICAgIGRvIHsKICAgICAgICAgICAgaW50MzJfdCBsZW4gPSB1bGVuID4gKGludDMyX3QpYnVmc3ogPyAoaW50MzJfdClidWZzeiA6IHVsZW47CgogICAgICAgICAgICBidWZwID0gYnVmOwogICAgICAgICAgICB1bmlidWZwID0gKFVDaGFyICopICh1bmlidWZicCArIGxlbik7CgogICAgICAgICAgICB1Y252X2Zyb21Vbmljb2RlKGNvbnZ0bywgJmJ1ZnAsIGJ1ZnAgKyB0b2J1ZnN6LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1bmlidWZicCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlidWZwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2Zmc2V0cywgZmx1c2gsICZlcnIpOwoKICAgICAgICAgICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJ0YWc7CiAgICAgICAgICAgICAgICBjaGFyIHBvc1szMl07CgogICAgICAgICAgICAgICAgdWludDMyX3QgZXJyb2Zmc2V0ID0KICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0KGJ1ZnAgLSBidWYgLSAxLCBmcm9tb2Zmc2V0cywgYnVmc3osIHRvb2Zmc2V0cywgdG9idWZzeik7CiAgICAgICAgICAgICAgICBpbnQzMl90IGZlcnJvZmZzZXQgPSBpbmZvZmZzZXQgLSAodW5pYnVmcCAtIHVuaWJ1ZnUpICsgZXJyb2Zmc2V0OwoKICAgICAgICAgICAgICAgIGlmICgoaW50MzJfdCkgZmVycm9mZnNldCA8IDApIHsKICAgICAgICAgICAgICAgICAgICBmZXJyb2Zmc2V0ID0gb3V0Zm9mZnNldCArIChidWZwIC0gYnVmKTsKICAgICAgICAgICAgICAgICAgICBlcnJ0YWcgPSAicHJvYmxlbUN2dEZyb21VT3V0IjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZXJydGFnID0gInByb2JsZW1DdnRGcm9tVSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzcHJpbnRmKHBvcywgIiV1IiwgZmVycm9mZnNldCk7CiAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cihwb3MsIHVwcnZfc3RybGVuKHBvcykgKyAxKTsKICAgICAgICAgICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgZXJydGFnLCBzdHIuZ2V0QnVmZmVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgdV93bXNnX2Vycm9yTmFtZShlcnIpKTsKICAgICAgICAgICAgICAgIHdpbGxleGl0ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQXQgdGhlIGxhc3QgY29udmVyc2lvbiwgdGhlIGNvbnZlcnRlZCBjaGFyYWN0ZXJzIHNob3VsZCBiZSBlcXVhbCB0byBudW1iZXIKICAgICAgICAgICAgLy8gb2YgY29uc3VtZWQgY2hhcmFjdGVycy4KICAgICAgICAgICAgaWYgKGZsdXNoICYmICF3aWxsZXhpdCAmJiB1bmlidWZicCAhPSAodW5pYnVmdSArIChzaXplX3QpICh1bmlidWZwIC0gdW5pYnVmdSkpKSB7CiAgICAgICAgICAgICAgICBjaGFyIHBvc1szMl07CiAgICAgICAgICAgICAgICBzcHJpbnRmKHBvcywgIiV1IiwgaW5mb2Zmc2V0KTsKICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKHBvcywgdXBydl9zdHJsZW4ocG9zKSArIDEpOwogICAgICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAicHJlbUVuZCIsIHN0ci5nZXRCdWZmZXIoKSk7CiAgICAgICAgICAgICAgICB3aWxsZXhpdCA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEZpbmFsbHksIHdyaXRlIHRoZSBjb252ZXJ0ZWQgYnVmZmVyIHRvIHRoZSBvdXRwdXQgZmlsZQoKCiAgICAgICAgICAgIHJkID0gKHNpemVfdCkgKGJ1ZnAgLSBidWYpOwogICAgICAgICAgICBvdXRmb2Zmc2V0ICs9ICh3ciA9IGZ3cml0ZShidWYsIDEsIHJkLCBvdXRmaWxlKSk7CiAgICAgICAgICAgIGlmICh3ciAhPSByZCkgewogICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIoc3RyZXJyb3IoZXJybm8pLCAiIik7CiAgICAgICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50V3JpdGUiLCBzdHIuZ2V0QnVmZmVyKCkpOwogICAgICAgICAgICAgICAgd2lsbGV4aXQgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAod2lsbGV4aXQpIHsKICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKCh1bGVuIC09IGJ1ZnN6KSA+IDApOwogICAgfSB3aGlsZSAoIWZsdXNoKTsgICAgICAgICAgIC8vIFN0b3Agd2hlbiB3ZSBoYXZlIGZsdXNoZWQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydGVycyAodGhpcyBtZWFucyB0aGF0IGl0J3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZW5kIG9mIG91dHB1dCkKCiAgICBnb3RvIG5vcm1hbF9leGl0OwoKZXJyb3JfZXhpdDoKICAgIHJldCA9IEZBTFNFOwoKbm9ybWFsX2V4aXQ6CiAgICAvLyBDbGVhbnVwLgoKICAgIGlmIChjb252ZnJvbSkgdWNudl9jbG9zZShjb252ZnJvbSk7CiAgICBpZiAoY29udnRvKSB1Y252X2Nsb3NlKGNvbnZ0byk7CgogICAgaWYgKHQpIGRlbGV0ZSB0OwoKICAgIGlmIChidWYpIGRlbGV0ZVtdIGJ1ZjsKICAgIGlmICh1bmlidWYpIGRlbGV0ZVtdIHVuaWJ1ZjsKCiAgICBpZiAoZnJvbW9mZnNldHMpIGRlbGV0ZVtdIGZyb21vZmZzZXRzOwogICAgaWYgKHRvb2Zmc2V0cykgZGVsZXRlW10gdG9vZmZzZXRzOwoKICAgIGlmIChpbmZpbGUgIT0gc3RkaW4pIHsKICAgICAgICBmY2xvc2UoaW5maWxlKTsKICAgIH0KCiAgICByZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyICpwbmFtZSwgaW50IGVjb2RlKSB7CiAgICBjb25zdCBVQ2hhciAqbXNnOwogICAgaW50MzJfdCBtc2dMZW47CiAgICBVRXJyb3JDb2RlIGVyciA9IFVfWkVST19FUlJPUjsKICAgIEZJTEUgKmZwID0gZWNvZGUgPyBzdGRlcnIgOiBzdGRvdXQ7CiAgICBpbnQgcmVzOwoKICAgIGluaXRNc2cocG5hbWUpOwogICAgbXNnID0KICAgICAgICB1cmVzX2dldFN0cmluZ0J5S2V5KGdCdW5kbGUsIGVjb2RlID8gImxjVXNhZ2VXb3JkIiA6ICJ1Y1VzYWdlV29yZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXNnTGVuLCAmZXJyKTsKICAgIFVuaWNvZGVTdHJpbmcgdXBuYW1lKHBuYW1lLCB1cHJ2X3N0cmxlbihwbmFtZSkgKyAxKTsKICAgIFVuaWNvZGVTdHJpbmcgbW5hbWUobXNnLCBtc2dMZW4gKyAxKTsKCiAgICByZXMgPSB1X3dtc2coZnAsICJ1c2FnZSIsIG1uYW1lLmdldEJ1ZmZlcigpLCB1cG5hbWUuZ2V0QnVmZmVyKCkpOwogICAgaWYgKCFlY29kZSkgewogICAgICAgIGlmICghcmVzKSB7CiAgICAgICAgICAgIGZwdXRjKCdcbicsIGZwKTsKICAgICAgICB9CiAgICAgICAgaWYgKCF1X3dtc2coZnAsICJoZWxwIikpIHsKICAgICAgICAgICAgLyogTm93IGR1bXAgY2FsbGJhY2tzIGFuZCBmaW5pc2guICovCgogICAgICAgICAgICBpbnQgaSwgY291bnQgPQogICAgICAgICAgICAgICAgc2l6ZW9mKHRyYW5zY29kZV9jYWxsYmFja3MpIC8gc2l6ZW9mKCp0cmFuc2NvZGVfY2FsbGJhY2tzKTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIgJXMiLCB0cmFuc2NvZGVfY2FsbGJhY2tzW2ldLm5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZwdXRjKCdcbicsIGZwKTsKICAgICAgICB9CiAgICB9CgogICAgZXhpdChlY29kZSk7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgRklMRSAqb3V0ZmlsZTsKICAgIGludCByZXQgPSAwOwogICAgaW50IHNlZW5mID0gMDsKCiAgICBzaXplX3QgYnVmc3ogPSBERUZBVUxUX0JVRlNaOwoKICAgIGNvbnN0IGNoYXIgKmZyb21jcGFnZSA9IDA7CiAgICBjb25zdCBjaGFyICp0b2NwYWdlID0gMDsKICAgIGNvbnN0IGNoYXIgKnRyYW5zbGl0ID0gMDsKICAgIGNvbnN0IGNoYXIgKm91dGZpbGVzdHIgPSAwOwogICAgaW50IGZhbGxiYWNrID0gMDsKCiAgICBVQ29udmVydGVyRnJvbVVDYWxsYmFjayBmcm9tdWNhbGxiYWNrID0gVUNOVl9GUk9NX1VfQ0FMTEJBQ0tfU1RPUDsKICAgIGNvbnN0IHZvaWQgKmZyb211Y3R4dCA9IDA7CiAgICBVQ29udmVydGVyVG9VQ2FsbGJhY2sgdG91Y2FsbGJhY2sgPSBVQ05WX1RPX1VfQ0FMTEJBQ0tfU1RPUDsKICAgIGNvbnN0IHZvaWQgKnRvdWN0eHQgPSAwOwoKICAgIGNoYXIgKippdGVyOwogICAgY2hhciAqKmVuZCA9IGFyZ3YgKyBhcmdjOwoKICAgIGNvbnN0IGNoYXIgKnBuYW1lOwoKICAgIGludCBwcmludENvbnZzID0gMCwgcHJpbnRDYW5vbiA9IDA7CiAgICBjb25zdCBjaGFyICpwcmludE5hbWUgPSAwOwogICAgaW50IHByaW50VHJhbnNsaXRzID0gMDsKCiAgICBpbnQgdmVyYm9zZSA9IDA7CgogICAgLy8gR2V0IGFuZCBwcmV0dGlmeSBwbmFtZS4KICAgIHBuYW1lID0gdXBydl9zdHJyY2hyKCphcmd2LCBVX0ZJTEVfU0VQX0NIQVIpOwojaWZkZWYgV0lOMzIKICAgIGlmICghcG5hbWUpIHsKICAgICAgICBwbmFtZSA9IHVwcnZfc3RycmNocigqYXJndiwgJy8nKTsKICAgIH0KI2VuZGlmCiAgICBpZiAoIXBuYW1lKSB7CiAgICAgICAgcG5hbWUgPSAqYXJndjsKICAgIH0gZWxzZSB7CiAgICAgICAgKytwbmFtZTsKICAgIH0KCiAgICAvLyBGaXJzdCwgZ2V0IHRoZSBhcmd1bWVudHMgZnJvbSBjb21tYW5kLWxpbmUKICAgIC8vIHRvIGtub3cgdGhlIGNvZGVwYWdlcyB0byBjb252ZXJ0IGJldHdlZW4KCiAgICAvLyBYWFggV2hlbiB5b3UgYWRkIHRvIHRoaXMgbG9vcCwgeW91IG5lZWQgdG8gYWRkIHRvIHRoZSBzaW1pbGFyIGxvb3AKICAgIC8vIGJlbG93LgoKICAgIGZvciAoaXRlciA9IGFyZ3YgKyAxOyBpdGVyICE9IGVuZDsgaXRlcisrKSB7CiAgICAgICAgLy8gQ2hlY2sgZm9yIGZyb20gY2hhcnNldAogICAgICAgIGlmIChzdHJjbXAoIi1mIiwgKml0ZXIpID09IDAgfHwgIXN0cmNtcCgiLS1mcm9tLWNvZGUiLCAqaXRlcikpIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgICAgICBpZiAoaXRlciAhPSBlbmQpCiAgICAgICAgICAgICAgICBmcm9tY3BhZ2UgPSAqaXRlcjsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItdCIsICppdGVyKSA9PSAwIHx8ICFzdHJjbXAoIi0tdG8tY29kZSIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgICAgIGlmIChpdGVyICE9IGVuZCkKICAgICAgICAgICAgICAgIHRvY3BhZ2UgPSAqaXRlcjsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCIteCIsICppdGVyKSA9PSAwKSB7CiAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICAgICAgaWYgKGl0ZXIgIT0gZW5kKQogICAgICAgICAgICAgICAgdHJhbnNsaXQgPSAqaXRlcjsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLS1mYWxsYmFjayIsICppdGVyKSkgewogICAgICAgICAgICBmYWxsYmFjayA9IDE7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLW5vLWZhbGxiYWNrIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGZhbGxiYWNrID0gMDsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLWIiLCAqaXRlcikgPT0gMCB8fCAhc3RyY21wKCItLWJsb2NrLXNpemUiLCAqaXRlcikpIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgICAgICBpZiAoaXRlciAhPSBlbmQpIHsKICAgICAgICAgICAgICAgIGJ1ZnN6ID0gYXRvaSgqaXRlcik7CiAgICAgICAgICAgICAgICBpZiAoKGludCkgYnVmc3ogPD0gMCkgewogICAgICAgICAgICAgICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKCppdGVyKTsKICAgICAgICAgICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAiYmFkQmxvY2tTaXplIiwgc3RyLmdldEJ1ZmZlcigpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKHBuYW1lLCAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItbCIsICppdGVyKSA9PSAwIHx8ICFzdHJjbXAoIi0tbGlzdCIsICppdGVyKSkgewogICAgICAgICAgICBpZiAocHJpbnRUcmFuc2xpdHMpIHsKICAgICAgICAgICAgICAgIHVzYWdlKHBuYW1lLCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludENvbnZzID0gMTsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLS1kZWZhdWx0LWNvZGUiLCAqaXRlcikgPT0gMCkgewogICAgICAgICAgICBpZiAocHJpbnRUcmFuc2xpdHMpIHsKICAgICAgICAgICAgICAgIHVzYWdlKHBuYW1lLCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludE5hbWUgPSB1Y252X2dldERlZmF1bHROYW1lKCk7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi0tbGlzdC1jb2RlIiwgKml0ZXIpID09IDApIHsKICAgICAgICAgICAgaWYgKHByaW50VHJhbnNsaXRzKSB7CiAgICAgICAgICAgICAgICB1c2FnZShwbmFtZSwgMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICAgICAgaWYgKGl0ZXIgIT0gZW5kKSB7CiAgICAgICAgICAgICAgICBVRXJyb3JDb2RlIGUgPSBVX1pFUk9fRVJST1I7CiAgICAgICAgICAgICAgICBwcmludE5hbWUgPSB1Y252X2dldEFsaWFzKCppdGVyLCAwLCAmZSk7CiAgICAgICAgICAgICAgICBpZiAoVV9GQUlMVVJFKGUpIHx8ICFwcmludE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cigqaXRlcik7CiAgICAgICAgICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgIm5vU3VjaENvZGVzZXQiLCBzdHIuZ2V0QnVmZmVyKCkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIHVzYWdlKHBuYW1lLCAxKTsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLS1jYW5vbiIsICppdGVyKSA9PSAwKSB7CiAgICAgICAgICAgIHByaW50Q2Fub24gPSAxOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItTCIsICppdGVyKSA9PSAwCiAgICAgICAgICAgIHx8ICFzdHJjbXAoIi0tbGlzdC10cmFuc2xpdGVyYXRvcnMiLCAqaXRlcikpIHsKICAgICAgICAgICAgaWYgKHByaW50Q29udnMpIHsKICAgICAgICAgICAgICAgIHVzYWdlKHBuYW1lLCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludFRyYW5zbGl0cyA9IDE7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi1oIiwgKml0ZXIpID09IDAgfHwgIXN0cmNtcCgiLT8iLCAqaXRlcikKICAgICAgICAgICAgfHwgIXN0cmNtcCgiLS1oZWxwIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIHVzYWdlKHBuYW1lLCAwKTsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi1jIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGZyb211Y2FsbGJhY2sgPSBVQ05WX0ZST01fVV9DQUxMQkFDS19TS0lQOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLS10by1jYWxsYmFjayIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgICAgIGlmIChpdGVyICE9IGVuZCkgewogICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGNhbGxiYWNrX2VudCAqY2JlID0gZmluZENhbGxiYWNrKCppdGVyKTsKICAgICAgICAgICAgICAgIGlmIChjYmUpIHsKICAgICAgICAgICAgICAgICAgICBmcm9tdWNhbGxiYWNrID0gY2JlLT5mcm9tdTsKICAgICAgICAgICAgICAgICAgICBmcm9tdWN0eHQgPSBjYmUtPmZyb211Y3R4dDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIoKml0ZXIpOwogICAgICAgICAgICAgICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgICAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJ1bmtub3duQ2FsbGJhY2siLCBzdHIuZ2V0QnVmZmVyKCkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiA0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLWZyb20tY2FsbGJhY2siLCAqaXRlcikpIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgICAgICBpZiAoaXRlciAhPSBlbmQpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBjYWxsYmFja19lbnQgKmNiZSA9IGZpbmRDYWxsYmFjaygqaXRlcik7CiAgICAgICAgICAgICAgICBpZiAoY2JlKSB7CiAgICAgICAgICAgICAgICAgICAgdG91Y2FsbGJhY2sgPSBjYmUtPnRvdTsKICAgICAgICAgICAgICAgICAgICB0b3VjdHh0ID0gY2JlLT50b3VjdHh0OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cigqaXRlcik7CiAgICAgICAgICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgInVua25vd25DYWxsYmFjayIsIHN0ci5nZXRCdWZmZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShwbmFtZSwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi1pIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIHRvdWNhbGxiYWNrID0gVUNOVl9UT19VX0NBTExCQUNLX1NLSVA7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLWNhbGxiYWNrIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICAgICAgaWYgKGl0ZXIgIT0gZW5kKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgY2FsbGJhY2tfZW50ICpjYmUgPSBmaW5kQ2FsbGJhY2soKml0ZXIpOwogICAgICAgICAgICAgICAgaWYgKGNiZSkgewogICAgICAgICAgICAgICAgICAgIGZyb211Y2FsbGJhY2sgPSBjYmUtPmZyb211OwogICAgICAgICAgICAgICAgICAgIGZyb211Y3R4dCA9IGNiZS0+ZnJvbXVjdHh0OwogICAgICAgICAgICAgICAgICAgIHRvdWNhbGxiYWNrID0gY2JlLT50b3U7CiAgICAgICAgICAgICAgICAgICAgdG91Y3R4dCA9IGNiZS0+dG91Y3R4dDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIoKml0ZXIpOwogICAgICAgICAgICAgICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgICAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJ1bmtub3duQ2FsbGJhY2siLCBzdHIuZ2V0QnVmZmVyKCkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiA0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItcyIsICppdGVyKSB8fCAhc3RyY21wKCItLXNpbGVudCIsICppdGVyKSkgewogICAgICAgICAgICB2ZXJib3NlID0gMDsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi12IiwgKml0ZXIpIHx8ICFzdHJjbXAoIi0tdmVyYm9zZSIsICppdGVyKSkgewogICAgICAgICAgICB2ZXJib3NlID0gMTsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi1WIiwgKml0ZXIpIHx8ICFzdHJjbXAoIi0tdmVyc2lvbiIsICppdGVyKSkgewogICAgICAgICAgICBwcmludGYoIiVzIHYyLjBcbiIsIHBuYW1lKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItbyIsICppdGVyKSB8fCAhc3RyY21wKCItLW91dHB1dCIsICppdGVyKSkgewogICAgICAgICAgICArK2l0ZXI7CiAgICAgICAgICAgIGlmIChpdGVyICE9IGVuZCAmJiAhb3V0ZmlsZXN0cikgewogICAgICAgICAgICAgICAgb3V0ZmlsZXN0ciA9ICppdGVyOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICgqKml0ZXIgPT0gJy0nICYmICgqaXRlcilbMV0pIHsKICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAocHJpbnRDb252cyB8fCBwcmludE5hbWUpIHsKICAgICAgICByZXR1cm4gcHJpbnRDb252ZXJ0ZXJzKHBuYW1lLCBwcmludE5hbWUsIHByaW50Q2Fub24pID8gMiA6IDA7CiAgICB9IGVsc2UgaWYgKHByaW50VHJhbnNsaXRzKSB7CiAgICAgICAgcmV0dXJuIHByaW50VHJhbnNsaXRlcmF0b3JzKHByaW50Q2Fub24pID8gMyA6IDA7CiAgICB9CgogICAgaWYgKCFmcm9tY3BhZ2UgfHwgIXVwcnZfc3RyY21wKGZyb21jcGFnZSwgIi0iKSkgewogICAgICAgIGZyb21jcGFnZSA9IHVjbnZfZ2V0RGVmYXVsdE5hbWUoKTsKICAgIH0KICAgIGlmICghdG9jcGFnZSB8fCAhdXBydl9zdHJjbXAodG9jcGFnZSwgIi0iKSkgewogICAgICAgIHRvY3BhZ2UgPSB1Y252X2dldERlZmF1bHROYW1lKCk7CiAgICB9CgogICAgLy8gT3BlbiB0aGUgY29ycmVjdCBvdXRwdXQgZmlsZSBvciBjb25uZWN0IHRvIHN0ZG91dCBmb3IgcmVhZGluZyBpbnB1dAogICAgaWYgKG91dGZpbGVzdHIgIT0gMCAmJiBzdHJjbXAob3V0ZmlsZXN0ciwgIi0iKSkgewogICAgICAgIG91dGZpbGUgPSBmb3BlbihvdXRmaWxlc3RyLCAid2IiKTsKICAgICAgICBpZiAob3V0ZmlsZSA9PSAwKSB7CiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyMShvdXRmaWxlc3RyLCAiIik7CiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyMihzdHJlcnJvcihlcnJubyksICIiKTsKICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50Q3JlYXRlT3V0cHV0RiIsCiAgICAgICAgICAgICAgICBzdHIxLmdldEJ1ZmZlcigpLCBzdHIyLmdldEJ1ZmZlcigpKTsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBvdXRmaWxlc3RyID0gIi0iOwogICAgICAgIG91dGZpbGUgPSBzdGRvdXQ7CiNpZmRlZiBXSU4zMgogICAgICAgIGlmIChzZXRtb2RlKGZpbGVubyhvdXRmaWxlKSwgT19CSU5BUlkpID09IC0xKSB7CiAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50U2V0T3V0QmluTW9kZSIpOwogICAgICAgICAgICBleGl0KC0xKTsKICAgICAgICB9CiNlbmRpZgogICAgfQoKICAgIC8qIExvb3AgYWdhaW4gb24gdGhlIGFyZ3VtZW50cyB0byBmaW5kIGFsbCB0aGUgaW5wdXQgZmlsZXMsIGFuZAogICAgY29udmVydCB0aGVtLiBYWFggQ2hlYXAgYW5kIHNsb3BweS4gKi8KCiAgICBmb3IgKGl0ZXIgPSBhcmd2ICsgMTsgaXRlciAhPSBlbmQ7IGl0ZXIrKykgewogICAgICAgIGlmIChzdHJjbXAoIi1mIiwgKml0ZXIpID09IDAgfHwgIXN0cmNtcCgiLS1mcm9tLWNvZGUiLCAqaXRlcikpIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItdCIsICppdGVyKSA9PSAwIHx8ICFzdHJjbXAoIi0tdG8tY29kZSIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi14IiwgKml0ZXIpID09IDApIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLS1mYWxsYmFjayIsICppdGVyKSkgewogICAgICAgICAgICA7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLW5vLWZhbGxiYWNrIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIDsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLWIiLCAqaXRlcikgPT0gMCB8fCAhc3RyY21wKCItLWJsb2NrLXNpemUiLCAqaXRlcikpIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItbCIsICppdGVyKSA9PSAwIHx8ICFzdHJjbXAoIi0tbGlzdCIsICppdGVyKSkgewogICAgICAgICAgICA7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi0tZGVmYXVsdC1jb2RlIiwgKml0ZXIpID09IDApIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItLWxpc3QtY29kZSIsICppdGVyKSA9PSAwKSB7CiAgICAgICAgICAgIDsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLS1jYW5vbiIsICppdGVyKSA9PSAwKSB7CiAgICAgICAgICAgIDsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLUwiLCAqaXRlcikgPT0gMAogICAgICAgICAgICB8fCAhc3RyY21wKCItLWxpc3QtdHJhbnNsaXRlcmF0b3JzIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIDsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLWgiLCAqaXRlcikgPT0gMCB8fCAhc3RyY21wKCItPyIsICppdGVyKQogICAgICAgICAgICB8fCAhc3RyY21wKCItLWhlbHAiLCAqaXRlcikpIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLWMiLCAqaXRlcikpIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLS10by1jYWxsYmFjayIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLWZyb20tY2FsbGJhY2siLCAqaXRlcikpIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLWkiLCAqaXRlcikpIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLS1jYWxsYmFjayIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItcyIsICppdGVyKSB8fCAhc3RyY21wKCItLXNpbGVudCIsICppdGVyKSkgewogICAgICAgICAgICA7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItdiIsICppdGVyKSB8fCAhc3RyY21wKCItLXZlcmJvc2UiLCAqaXRlcikpIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLVYiLCAqaXRlcikgfHwgIXN0cmNtcCgiLS12ZXJzaW9uIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIDsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi1vIiwgKml0ZXIpIHx8ICFzdHJjbXAoIi0tb3V0cHV0IiwgKml0ZXIpKSB7CiAgICAgICAgICAgICsraXRlcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZWVuZiA9IDE7CiAgICAgICAgICAgIGlmICghY29udmVydEZpbGUKICAgICAgICAgICAgICAgIChwbmFtZSwgZnJvbWNwYWdlLCB0b3VjYWxsYmFjaywgdG91Y3R4dCwgdG9jcGFnZSwKICAgICAgICAgICAgICAgIGZyb211Y2FsbGJhY2ssIGZyb211Y3R4dCwgZmFsbGJhY2ssIGJ1ZnN6LCB0cmFuc2xpdCwgKml0ZXIsCiAgICAgICAgICAgICAgICBvdXRmaWxlLCB2ZXJib3NlKSkgewogICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICghc2VlbmYpIHsKICAgICAgICBpZiAoIWNvbnZlcnRGaWxlCiAgICAgICAgICAgIChwbmFtZSwgZnJvbWNwYWdlLCB0b3VjYWxsYmFjaywgdG91Y3R4dCwgdG9jcGFnZSwKICAgICAgICAgICAgZnJvbXVjYWxsYmFjaywgZnJvbXVjdHh0LCBmYWxsYmFjaywgYnVmc3osIHRyYW5zbGl0LCAwLCBvdXRmaWxlLAogICAgICAgICAgICB2ZXJib3NlKSkgewogICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgICAgICAgfQogICAgfQoKICAgIGdvdG8gbm9ybWFsX2V4aXQ7CmVycm9yX2V4aXQ6CiAgICByZXQgPSAxOwpub3JtYWxfZXhpdDoKCiAgICBpZiAob3V0ZmlsZSAhPSBzdGRvdXQpCiAgICAgICAgZmNsb3NlKG91dGZpbGUpOwoKICAgIHJldHVybiByZXQ7Cn0KCgovKgogKiBIZXksIEVtYWNzLCBwbGVhc2Ugc2V0IHRoZSBmb2xsb3dpbmc6CiAqCiAqIExvY2FsIFZhcmlhYmxlczoKICogaW5kZW50LXRhYnMtbW9kZTogbmlsCiAqIEVuZDoKICoKICovCg==