LyoKICogSGV4eGFnb24gYm9hcmQgZ2FtZS4KICogQ29weXJpZ2h0IChDKSAyMDAxIEVyaWsgSm9uc3Nvbi4KICogCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqIAogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKiAKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCiAqIAogKiBFbWFpbCBlcmlrQG5lc3FpLmhvbWVpcC5uZXQKICogCiAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNpbmNsdWRlIDxsaWJoZXh4Lmg+Cgp2b2lkIHN0cmlwRnJvbURibFNwYWNlKGNoYXIgKmNwZnJvbSkKewoJY2hhciAqY3B0byA9IGNwZnJvbTsKCWludCBzcGFjZSA9IDE7CgkKCXdoaWxlKCpjcGZyb20pCgl7CgkJaWYoIShzcGFjZSAmJiAoKmNwZnJvbSA9PSAnICcgfHwgKmNwZnJvbSA9PSAnXHQnKSkpCgkJewoJCQkqY3B0byA9ICpjcGZyb207CgkJCWNwdG8rKzsKCQl9CgkJCgkJaWYoKmNwZnJvbSA9PSAnICcgfHwgKmNwZnJvbSA9PSAnXHQnKQoJCQlzcGFjZSA9IDE7CgkJZWxzZSAKCQkJc3BhY2UgPSAwOwoJCQoJCWNwZnJvbSsrOwoJfQoJCgkqY3B0byA9IDA7Cn0KCnZvaWQgcHJpbnRDb3B5KCkKewoJcHJpbnRmKCJcbiIpOwoJcHJpbnRmKCJIZXh4YWdvbiBib2FyZCBnYW1lLlxuIik7CglwcmludGYoIkNvcHlyaWdodCAoQykgMjAwMSBFcmlrIEpvbnNzb24uXG5cbiIpOwoJCglwcmludGYoIlRoZSBwaWVjZXMgd2FzIGRyYXduIGJ5IFN0ZWZhbiBQ5Whsc29uLlxuXG4iKTsKCglwcmludGYoIlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3JcbiIpOwoJcHJpbnRmKCJtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuIik7CglwcmludGYoImFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyXG4iKTsKCXByaW50Zigib2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG5cbiIpOwoJCglwcmludGYoIlRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuIik7CglwcmludGYoImJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4iKTsKCXByaW50ZigiTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuIik7CglwcmludGYoIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG5cbiIpOwoJCglwcmludGYoIllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4iKTsKCXByaW50ZigiYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiIpOwoJcHJpbnRmKCJGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS5cblxuIik7CgkKCXByaW50ZigiRW1haWwgZXJpa0BuZXNxaS5ob21laXAubmV0XG5cbiIpOwp9OwoKdm9pZCBwcmludEhlbHAoKQp7CglwcmludGYoIiAgICAgICAgX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoJcHJpbnRmKCIgICAgIF9fLyAgXFxfXyAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCXByaW50ZigiICBfXy8gIFxcX18vICBcXF9fICAgICAgSGV4eGFnb24gdjAuMy4xIFxuIik7CglwcmludGYoIiAvICBcXF9fLyAgXFxfXy8gIFxcICAgICBDb3B5cmlnaHQgMjAwMSBcbiIpOwoJcHJpbnRmKCIgXFxfXy8gIFxcX18vICBcXF9fLyAgICAgRXJpayBKb25zc29uICAgXG4iKTsKCXByaW50ZigiIC8gIFxcX18vICBcXF9fLyAgXFwgICAgICAgICAgICAgICAgICAgIFxuIik7CglwcmludGYoIiBcXF9fLyAgXFxfXy8gIFxcX18vICAgICAgICAgICAgICAgICAgICBcbiIpOwoJcHJpbnRmKCIgICAgXFxfXy8gIFxcX18vICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCXByaW50ZigiICAgICAgIFxcX18vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4iKTsKCXByaW50ZigiIGVyaWtAbmVzcWkuaG9tZWlwLm5ldFxuIik7IAoJcHJpbnRmKCIgaHR0cDovL25lc3FpLmhvbWVpcC5uZXQvaGV4eGFnb25cbiIpOwoJcHJpbnRmKCJcbiIpOwoJcHJpbnRmKCIgQ29tbW9uIGNvbW1hbmRzOlxuIik7CglwcmludGYoIiAgIHF1aXQgICAgICAgICAgICAgICAgICA6IFF1aXQgdGhlIHByb2dyYW0uXG4iKTsKCXByaW50ZigiICAgaGVscCAgICAgICAgICAgICAgICAgIDogUHJpbnQgdGhpcyBoZWxwLlxuIik7CglwcmludGYoIiAgIGNvcHlyaWdodCAgICAgICAgICAgICA6IFByaW50cyBjb3B5cmlnaHQgaW5mb3JtYXRpb24uXG5cbiIpOwoJcHJpbnRmKCIgUGxheSByZWxhdGVkIGNvbW1hbmRzOlxuIik7CglwcmludGYoIiAgIGp1bXAgIFtGUk9NXVtUT10gICAgICA6IEp1bXAgZnJvbSBlZy4gQTQgdG8gQjQuXG4iKTsKCXByaW50ZigiICAgaiAgICAgW0ZST01dW1RPXSAgICAgIDogU2FtZSBhcyBqdW1wLlxuIik7CglwcmludGYoIiAgIGNsb25lIFtUT10gICAgICAgICAgICA6IENsb25lIHRvIGEgcG9zaXRpb24uXG4iKTsKCXByaW50ZigiICAgYyAgICAgW1RPXSAgICAgICAgICAgIDogU2FtZSBhcyBjbG9uZS5cbiIpOwoJcHJpbnRmKCIgICBoaW50ICAgICAgICAgICAgICAgICAgOiBMZXQgdGhlIGNvbXB1dGVyIG1vdmUgZm9yIHlvdS5cbiIpOwoJcHJpbnRmKCIgICBib2FyZCAgICAgICAgICAgICAgICAgOiBEaXNwbGF5IHRoZSBjdXJyZW50IHBsYXlib2FyZC5cbiIpOwoJcHJpbnRmKCIgICB1bmRvICAgICAgICAgICAgICAgICAgOiBHbyBnYWNrIG9uZSBoYWxmIG1vdmUuIChVbmRvKVxuIik7CglwcmludGYoIiAgIHJlZG8gICAgICAgICAgICAgICAgICA6IEdvdG8gdGhlIG5leHQgaGFsZiBtb3ZlLiAoSWYgeW91IGhhdmUgdXNlZCBcInVuZG9cIi4pXG5cbiIpOwoJcHJpbnRmKCIgR2FtZSByZWxhdGVkIGNvbW1hbmRzOlxuIik7CglwcmludGYoIiAgIHRpbWUgW3NlY29uZHNdICAgICAgICA6IE1heCB0aW1lIGZvciB0aGUgY29tcHV0ZXIgdG8gdGhpbmsuXG4iKTsKCXByaW50ZigiICAgbGV2ZWwgW2xldmVsXSAgICAgICAgIDogTWF4IHNlYXJjaCBkZXB0aCBmb3IgdGhlIGNvbXB1dGVyIHRoZSB1c2UuXG4iKTsKCXByaW50ZigiICAgbG9hZCBbZmlsZW5hbWVdICAgICAgIDogTG9hZCBhIGdhbWUgZnJvbSBhIHNhdmUtZmlsZS5cbiIpOwoJcHJpbnRmKCIgICBzYXZlIFtmaWxlbmFtZV0gICAgICAgOiBTYXZlIGEgZ2FtZSAod2l0aCBoaXN0b3J5KSB0byBhIGZpbGUuXG4iKTsKCXByaW50ZigiICAgbmV3Z2FtZSBbQ0MvSEMvQ0gvSEhdIDogU3RhcnQgYSBuZXcgZ2FtZTpcbiIpOwoJcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyBmb3IgaHVtYW4gYWdhaW5zdCBjb21wdXRlci5cbiIpOwoJcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgICBDSCBmb3IgY29tcHV0ZXIgYWdhaW5zdCBodW1hbi5cbiIpOyAKCXByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtZSBhcyBIQyBidXQgY29tcHV0ZXIgc3RhcnRzLlxuIik7CglwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIENDIGZvciBjb21wdXRlciBhZ2FpbnN0IGNvbXB1dGVyLlxuIik7CglwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIEhIIGZvciBodW1hbiBhZ2FpbnN0IGh1bWFuLlxuXG4iKTsKCXByaW50ZigiIElmIHlvdSBqdXN0IGhpdCBlbnRlciB5b3VyIGxhc3QgY29tbWFuZCB3aWxsIGJlIHJlcGVhdGVkLlxuIik7CglwcmludGYoIlxuIik7Cn0KCmVudW0KewoJIEdBTUVfSEMgPSAxLAoJIEdBTUVfSEgKfTsKCmludCBwYXJzZUNvcmRzKGNoYXIgKnN0cikKewoJIGlmKCgoKnN0ciA+PSAnYScgJiYgKnN0ciA8PSAnaScpIHx8IAoJCSAoKnN0ciA+PSAnQScgJiYgKnN0ciA8PSAnSScpKSAmJiAoc3RyWzFdID49ICcxJyAmJiBzdHJbMV0gPD0gJzknKSkKCSB7CgkJICBpbnQgeCwgeTsKCgkJICBpZigqc3RyID49ICdhJyAmJiAqc3RyIDw9ICdpJykKCQkJICAgeCA9ICpzdHIgLSAnYSc7CgkJICBlbHNlIGlmKCpzdHIgPj0gJ0EnICYmICpzdHIgPD0gJ0knKQoJCQkgICB4ID0gKnN0ciAtICdBJzsKCQkgIGVsc2UKCQkJICAgcmV0dXJuIC0xOwoKCQkgIHkgPSBzdHJbMV0gLSAnMSc7CgoJCSAgcmV0dXJuIGdldEhleHhhZ29uSW5kZXgoeCArIDEsIHkgKyAxKTsKCSB9CgkgCgkgcmV0dXJuIC0xOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CglpbnQgcXVpdCA9IDA7CgkKCWludCBtb2RlID0gMTsKI2lmZGVmIFNNQUxMX1BST0JMRU1fU0laRQogICAgICAgIGludCBsZXZlbCA9IDM7CiNlbHNlCiAgICAgICAgaW50IGxldmVsID0gNDsKI2VuZGlmCglpbnQgdGltZSA9IDEyOwoJCiAgaW50IGxsdm1faW5kZXg7CgoJcHJpbnRmKCJIZXh4YWdvbiBib2FyZCBnYW1lLlxuIik7CglwcmludGYoIkNvcHlyaWdodCAyMDAxLlxuIik7CglwcmludGYoIkVyaWsgSm9uc3Nvbi5cbiIpOwoJcHJpbnRmKCJUeXBlIFwiY29weXJpZ2h0XCIgdG8gc2VlIHRoZSBjb3B5cmlnaHQgbm90aWNlLlxuXG4iKTsKCQoJSGV4eGFnb25HYW1lICpnYW1lID0gbmV3IEhleHhhZ29uR2FtZSgpOwoJZ2FtZS0+ZGlzcGxheVRleHQoKTsKCQoJY2hhciAqaW5wdXQgPSAwOwoJCglmb3IgKGxsdm1faW5kZXggPSAwOyBsbHZtX2luZGV4IDwgMTsgbGx2bV9pbmRleCsrKQoJewogICAgICAgICAgY2hhciB0bXBbXSA9ICJuZXdnYW1lIENDIjsKCgkJaW50IGxlbiA9IHN0cmxlbih0bXApOwoJCWlmKGxlbiAmJiB0bXBbbGVuIC0gMV0gPT0gJyAnKQoJCQl0bXBbbGVuIC0gMV0gPSAwOwoJCQoJCWlmKCp0bXAgPT0gMCkKCQl7CgkJCWlmKGlucHV0KQoJCQkJcHJpbnRmKCJSZXBlYXRpbmcgbGFzdCBjb21tYW5kLlxuIik7CgkJfQoJCWVsc2UKCQl7CgkJCWlucHV0ID0gdG1wOwoJCX0KCQkKCQlpZighaW5wdXQpCgkJCWNvbnRpbnVlOwoJCQoJCWlmKCFzdHJjYXNlY21wKCJxdWl0IiwgaW5wdXQpIHx8ICFzdHJjYXNlY21wKCJleGl0IiwgaW5wdXQpKQoJCXsKCQkJcXVpdCA9IDE7CgkJfQoJCWVsc2UgaWYoIXN0cmNhc2VjbXAoImhlbHAiLCBpbnB1dCkpCgkJCXByaW50SGVscCgpOwoJCWVsc2UgaWYoIXN0cmNhc2VjbXAoImNvcHlyaWdodCIsIGlucHV0KSkKCQkJcHJpbnRDb3B5KCk7CgkJZWxzZSBpZighc3RybmNhc2VjbXAoImxldmVsICIsIGlucHV0LCA2KSkKCQl7CgkJCWlmKCEoaXNkaWdpdChpbnB1dFs2XSkgJiYgaW5wdXRbN10gPT0gMCkpCgkJCQlwcmludGYoIkludmFsaWQgaW5wdXQgdG8gY29tbWFuZCBcImxldmVsXCIuXG5WYWxpZCB2YWx1ZXMgYXJlIDAtOS5cbiIpOwoJCQllbHNlCgkJCQlsZXZlbCA9IGlucHV0WzZdIC0gJzAnOwoJCX0KCQllbHNlIGlmKCFzdHJjYXNlY21wKCJsZXZlbCIsIGlucHV0KSkKCQkJcHJpbnRmKCJUaGUgc2VhcmNoIGxldmVsIGlzIHNldCB0bzogJWkuXG4iLCBsZXZlbCk7CgkJZWxzZSBpZighc3RybmNhc2VjbXAoInRpbWUgIiwgaW5wdXQsIDUpKQoJCXsKCQkJY2hhciAqY3AgPSBpbnB1dCArIDU7CgkJCQoJCQl3aGlsZShpc2RpZ2l0KCpjcCkpCgkJCQljcCsrOwoJCQkKCQkJaWYoY3AgPT0gaW5wdXQgKyA1IHx8ICgqY3AgIT0gMCAmJiAhKCgqY3AgPT0gJyAnKSAmJiAqKGNwICsgMSkgPT0gMCkpKQoJCQkJcHJpbnRmKCJTeW50YXg6IHRpbWUgW251bWJlcl1cbiIpOwoJCQllbHNlCgkJCQl0aW1lID0gYXRvaShpbnB1dCArIDUpOwoJCX0KCQllbHNlIGlmKCFzdHJjYXNlY21wKCJ0aW1lIiwgaW5wdXQpKQoJCQlwcmludGYoIlRoZSBzZWFyY2ggdGltZSBpcyBzZXQgdG8gJWkgc2VjLlxuIiwgdGltZSk7CgkJZWxzZSBpZighc3RyY2FzZWNtcCgiYm9hcmQiLCBpbnB1dCkpCgkJCWdhbWUtPmRpc3BsYXlUZXh0KCk7CgkJZWxzZSBpZighc3RyY2FzZWNtcCgidW5kbyIsIGlucHV0KSkKCQl7CgkJCWlmKGdhbWUtPnByZXYoKSkKCQkJCXByaW50ZigiTm8gbW9yZSBtb3ZlcyBsZWZ0IHRvIHVuZG8hXG4iKTsKCQkJZWxzZQoJCQkJZ2FtZS0+ZGlzcGxheVRleHQoKTsKCQl9CgkJZWxzZSBpZighc3RyY2FzZWNtcCgicmVkbyIsIGlucHV0KSkKCQl7CgkJCWlmKGdhbWUtPm5leHQoKSkKCQkJCXByaW50ZigiVGhlcmUgaXMgbm8gbW92ZSB0byByZWRvIVxuIik7CgkJCWVsc2UKCQkJCWdhbWUtPmRpc3BsYXlUZXh0KCk7CgkJfQoJCWVsc2UgaWYoIXN0cmNhc2VjbXAoImhpbnQiLCBpbnB1dCkpCgkJewoJCQlnYW1lLT5jb21wdXRlck1vdmUobGV2ZWwsIDAsIHRpbWUgKiAxMDAwKTsKCQkJZ2FtZS0+ZGlzcGxheVRleHQoKTsKCQkJCgkJCWlmKG1vZGUgIT0gR0FNRV9ISCkKCQkJewoJCQkJIGdhbWUtPmNvbXB1dGVyTW92ZShsZXZlbCwgMCwgdGltZSAqIDEwMDApOwoJCQkJIGdhbWUtPmRpc3BsYXlUZXh0KCk7CQkJCQkJCQoJCQl9IAoJCX0KCQllbHNlIGlmKCFzdHJuY2FzZWNtcCgibG9hZCAiLCBpbnB1dCwgNSkpCgkJewoJCQlpbnQgcmV0ID0gZ2FtZS0+bG9hZEdhbWUoaW5wdXQgKyA1KTsKCQkJaWYocmV0ID09IDApCgkJCXsKCQkJCXByaW50ZigiR2FtZSBsb2FkZWQuXG4iKTsKCQkJCWdhbWUtPmRpc3BsYXlUZXh0KCk7CgkJCX0KCQkJZWxzZSBpZihyZXQgPT0gLTEpCgkJCQlwcmludGYoIkVycm9yIG9wZW5pbmcgbG9hZC1maWxlIVxuIik7CgkJCWVsc2UgaWYocmV0ID09IC0zKQoJCQkJcHJpbnRmKCJVbmtub3duIGZpbGUgZm9ybWF0LlxuIik7CgkJCWVsc2UKCQkJCXByaW50ZigiRXJyb3IgcmVhZGluZyBmcm9tIGxvYWQtZmlsZSFcbiIpOwoJCX0KCQllbHNlIGlmKCFzdHJjYXNlY21wKCJsb2FkIiwgaW5wdXQpKQoJCQlwcmludGYoIlRoZSBsb2FkIGNvbW1hbmQgbmVlZHMgYSBmaWxlbmFtZSBhcyBhcmd1bWVudC5cbiIpOwoJCWVsc2UgaWYoIXN0cm5jYXNlY21wKCJzYXZlICIsIGlucHV0LCA1KSkKCSAgIHsKCQkgICBpbnQgcmV0ID0gZ2FtZS0+c2F2ZUdhbWUoaW5wdXQgKyA1KTsKCQkgICBpZihyZXQgPT0gMCkKCQkJICAgcHJpbnRmKCJHYW1lIHNhdmVkLlxuIik7CgkJICAgZWxzZSBpZihyZXQgPT0gLTEpCgkJCSAgIHByaW50ZigiRXJyb3Igb3BlbmluZyBzYXZlLWZpbGUhXG4iKTsKCQkgICBlbHNlCgkJCQkgcHJpbnRmKCJFcnJvciB3cml0aW5nIHRvIHNhdmUtZmlsZSFcbiIpOwoJICAgfQoJCWVsc2UgaWYoIXN0cmNhc2VjbXAoInNhdmUiLCBpbnB1dCkpCgkJCXByaW50ZigiVGhlIHNhdmUgY29tbWFuZCBuZWVkcyBhIGZpbGVuYW1lIGFzIGFyZ3VtZW50LlxuIik7CgkJZWxzZSBpZighc3RybmNhc2VjbXAoIm5ld2dhbWUgIiwgaW5wdXQsIDgpKQoJCXsKCQkJaWYoKChpbnB1dFs4XSA9PSAnYycgfHwgaW5wdXRbOF0gPT0gJ0MnKSB8fCAoaW5wdXRbOF0gPT0gJ2gnIHx8IGlucHV0WzhdID09ICdIJykpICYmCgkJCSAgICgoaW5wdXRbOV0gPT0gJ2MnIHx8IGlucHV0WzldID09ICdDJykgfHwgKGlucHV0WzldID09ICdoJyB8fCBpbnB1dFs4XSA9PSAnOScpKSAmJgoJCQkgICAoaW5wdXRbMTBdID09IDAgfHwgKGlucHV0WzEwXSA9PSAnICcgJiYgaW5wdXRbMTFdID09IDApKSkgCgkJCXsKCQkJCWRlbGV0ZSBnYW1lOwoJCQkJZ2FtZSA9IG5ldyBIZXh4YWdvbkdhbWUoKTsKCQkJCWdhbWUtPmRpc3BsYXlUZXh0KCk7CgkJCQkKCQkJCWlmKChpbnB1dFs4XSA9PSAnaCcgfHwgaW5wdXRbOF0gPT0gJ0gnKSAmJgoJCQkJCShpbnB1dFs5XSA9PSAnYycgfHwgaW5wdXRbOV0gPT0gJ0MnKSkKCQkJCQltb2RlID0gR0FNRV9IQzsKCQkJCWVsc2UgaWYoKGlucHV0WzhdID09ICdjJyB8fCBpbnB1dFs4XSA9PSAnQycpICYmCgkJCQkJCShpbnB1dFs5XSA9PSAnaCcgfHwgaW5wdXRbOV0gPT0gJ0gnKSkKCQkJCXsKCQkJCQlnYW1lLT5jb21wdXRlck1vdmUobGV2ZWwsIDAsIHRpbWUgKiAxMDAwKTsKCQkJCQlnYW1lLT5kaXNwbGF5VGV4dCgpOwoJCQkJCW1vZGUgPSBHQU1FX0hDOwoJCQkJfQoJCQkJZWxzZSBpZigoaW5wdXRbOF0gPT0gJ2gnIHx8IGlucHV0WzhdID09ICdIJykgJiYKCQkJCQkJKGlucHV0WzldID09ICdoJyB8fCBpbnB1dFs5XSA9PSAnSCcpKQoJCQkJCW1vZGUgPSBHQU1FX0hIOwoJCQkJZWxzZSBpZigoaW5wdXRbOF0gPT0gJ2MnIHx8IGlucHV0WzhdID09ICdDJykgJiYKCQkJCQkJKGlucHV0WzldID09ICdjJyB8fCBpbnB1dFs5XSA9PSAnQycpKQoJCQkJewoJCQkJCXdoaWxlKCFnYW1lLT5lbmRPZkdhbWUoKSkKCQkJCQl7CgkJCQkJCWdhbWUtPmNvbXB1dGVyTW92ZShsZXZlbCwgMCwgdGltZSAqIDEwMDApOwoJCQkJCQlnYW1lLT5kaXNwbGF5VGV4dCgpOwoJCQkJCX0KCQkJCQkKCQkJCQltb2RlID0gR0FNRV9IQzsKCQkJCX0KCQkJCWVsc2UKCQkJCQlwcmludGYoIllvdSBoYXZlIGZvdW5kIGEgYnVnIGluIEhleHhhZ29uISBUaGlzIGNvZGUgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCEhXG4iKTsKCQkJfQoJCQllbHNlCgkJCQlwcmludGYoIlN5bnRheDogbmV3Z2FtZSBIQy9DSC9DQy9ISFxuIik7CgkJfQoJCWVsc2UgaWYoIXN0cmNhc2VjbXAoIm5ld2dhbWUiLCBpbnB1dCkpCgkJewoJCQkgcHJpbnRmKCJTeW50YXg6IG5ld2dhbWUgSEMvQ0gvQ0MvSEhcbiIpOwoJCX0KCQllbHNlIGlmKCFzdHJuY2FzZWNtcCgianVtcCAiLCBpbnB1dCwgNSkgfHwKCQkJCSFzdHJuY2FzZWNtcCgiaiAiLCBpbnB1dCwgMikpCgkJewoJCQkgY2hhciAqY3AgPSBpbnB1dDsKCQkJIAoJCQkgaWYoIXN0cm5jYXNlY21wKCJqICIsIGlucHV0LCAyKSkKCQkJCSAgY3AgKz0gMjsKCQkJIGVsc2UKCQkJCSAgY3AgKz0gNTsKCgkJCSBIZXh4YWdvbk1vdmUgbW92ZTsKCgkJCSBpbnQgbGVuID0gc3RybGVuKGNwKTsKCQkJIGlmKGxlbiA9PSA1KQoJCQkgewoJCQkJICBtb3ZlLmZyb20gPSBwYXJzZUNvcmRzKGNwKTsKCQkJCSAgbW92ZS50byA9IHBhcnNlQ29yZHMoY3AgKyAzKTsKCQkJIH0gZWxzZSBpZihsZW4gPT0gNCkKCQkJIHsKCQkJCSAgbW92ZS5mcm9tID0gcGFyc2VDb3JkcyhjcCk7CgkJCQkgIG1vdmUudG8gPSBwYXJzZUNvcmRzKGNwICsgMik7CgkJCSB9CgkJCSBlbHNlCgkJCQkgIG1vdmUuZnJvbSA9IC0xOwoKCQkJIGlmKG1vdmUuZnJvbSAhPSAtMSAmJiBtb3ZlLnRvICE9IC0xKQoJCQkgewoJCQkJICBpZihnYW1lLT5pc01vdmVWYWxpZChtb3ZlKSkKCQkJCSAgewoJCQkJCSAgIGdhbWUtPmFwcGx5TW92ZShtb3ZlKTsKCQkJCQkgICBnYW1lLT5kaXNwbGF5VGV4dCgpOwkJCQkJCQkKCQkJCQkgICAKCQkJCQkgICBpZihtb2RlICE9IEdBTUVfSEgpCgkJCQkJICAgewoJCQkJCQkJZ2FtZS0+Y29tcHV0ZXJNb3ZlKGxldmVsLCAwLCB0aW1lICogMTAwMCk7CgkJCQkJCQlnYW1lLT5kaXNwbGF5VGV4dCgpOwkJCQkJCQkKCQkJCQkgICB9IAoJCQkJICB9CgkJCQkgIGVsc2UKCQkJCQkgICBwcmludGYoIklsbGVnYWwgbW92ZSFcbiIpOwoJCQkgfSAKCQkJIGVsc2UKCQkJIHsKCQkJCSAgaWYobGVuID09IDUpCgkJCQkgIHsKCQkJCQkgICBpZihjcFsyXSA9PSAnICcpCgkJCQkJCQlwcmludGYoIkJhZCBjb3JkaW5hdGUuXG4iKTsKCQkJCQkgICBlbHNlCgkJCQkJCQlwcmludGYoIlN5bnRheDoganVtcCBbRlJPTV1bVE9dXG5FZy4gXCJqdW1wIGE0YjRcIlxuIik7CgkJCQkgIH0KCQkJCSAgZWxzZSBpZihsZW4gPT0gNCkKCQkJCQkgICBwcmludGYoIkJhZCBjb3JkaW5hdGUuXG4iKTsKCQkJCSAgZWxzZQoJCQkJCSAgIHByaW50ZigiU3ludGF4OiBqdW1wIFtGUk9NXVtUT11cbkVnLiBcImp1bXAgYTRiNFwiXG4iKTsKCQkJIH0KCQl9CgkJZWxzZSBpZighc3RyY2FzZWNtcCgianVtcCIsIGlucHV0KSB8fAoJCQkJIXN0cmNhc2VjbXAoImoiLCBpbnB1dCkpCgkJewoJCQkgcHJpbnRmKCJTeW50YXg6IGp1bXAgW0ZST01dW1RPXVxuRWcuIFwianVtcCBhNGI0XCJcbiIpOwoJCX0KCQllbHNlIGlmKCFzdHJuY2FzZWNtcCgiY2xvbmUgIiwgaW5wdXQsIDYpIHx8CgkJCQkhc3RybmNhc2VjbXAoImMgIiwgaW5wdXQsIDIpKQoJCXsKCQkJIGNoYXIgKmNwID0gaW5wdXQ7CgkJCSAKCQkJIGlmKCFzdHJuY2FzZWNtcCgiYyAiLCBpbnB1dCwgMikpCgkJCQkgIGNwICs9IDI7CgkJCSBlbHNlCgkJCQkgIGNwICs9IDY7CgoJCQkgSGV4eGFnb25Nb3ZlIG1vdmU7CgkJCSAKCQkJIGlmKHN0cmxlbihjcCkgPT0gMikKCQkJIHsKCQkJCSAgbW92ZS50byA9IHBhcnNlQ29yZHMoY3ApOwoJCQkJICBtb3ZlLmZyb20gPSBtb3ZlLnRvOwoKCQkJCSAgaWYobW92ZS50byAhPSAtMSkKCQkJCSAgewoJCQkJCSAgIGlmKGdhbWUtPmlzTW92ZVZhbGlkKG1vdmUpKQoJCQkJCSAgIHsKCQkJCQkJCWdhbWUtPmFwcGx5TW92ZShtb3ZlKTsKCQkJCQkJCWdhbWUtPmRpc3BsYXlUZXh0KCk7CQkJCQkJCQoJCQkJCQkJCgkJCQkJCQlpZihtb2RlICE9IEdBTUVfSEgpCgkJCQkJCQl7CgkJCQkJCQkJIGdhbWUtPmNvbXB1dGVyTW92ZShsZXZlbCwgMCwgdGltZSAqIDEwMDApOwoJCQkJCQkJCSBnYW1lLT5kaXNwbGF5VGV4dCgpOwkJCQkJCQkKCQkJCQkJCX0gCgkJCQkJICAgfQoJCQkJCSAgIGVsc2UKCQkJCQkJCXByaW50ZigiSWxsZWdhbCBtb3ZlIVxuIik7CgkJCQkgIH0KCQkJCSAgZWxzZQoJCQkJCSAgIHByaW50ZigiSW52YWxpZCBjb3JkaW5hdGUuXG4iKTsKCQkJIH0KCQkJIGVsc2UKCQkJCSAgcHJpbnRmKCJTeW50YXg6IGNsb25lIFtUT11cbkVnLiBcImNsb25lIGI0XCJcbiIpOwoJCQkgCgkJfQkJCgkJZWxzZSBpZighc3RyY2FzZWNtcCgiY2xvbmUiLCBpbnB1dCkgfHwKCQkJCSFzdHJjYXNlY21wKCJjIiwgaW5wdXQpKQoJCXsKCQkJIHByaW50ZigiU3ludGF4OiBjbG9uZSBbVE9dXG5FZy4gXCJjbG9uZSBiNFwiXG4iKTsKCQl9CgkJZWxzZQoJCQlwcmludGYoIlVua25vd24gY29tbWFuZCwgdHJ5IFwiaGVscFwiIGZvciBhIGxpc3Qgb2YgY29tbWFuZHMuXG4iKTsKCX0KfQo=