LS0gJElkOiBkYi5sdWEsdiAxLjkwIDIwMTgvMDQvMDIgMTc6NTU6NTggcm9iZXJ0byBFeHAgJAotLSBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBmaWxlIGFsbC5sdWEKCi0tIHRlc3RpbmcgZGVidWcgbGlicmFyeQoKbG9jYWwgZGVidWcgPSByZXF1aXJlICJkZWJ1ZyIKCmxvY2FsIGZ1bmN0aW9uIGRvc3RyaW5nKHMpIHJldHVybiBhc3NlcnQobG9hZChzKSkoKSBlbmQKCnByaW50InRlc3RpbmcgZGVidWcgbGlicmFyeSBhbmQgZGVidWcgaW5mb3JtYXRpb24iCgpkbwpsb2NhbCBhPTEKZW5kCgphc3NlcnQobm90IGRlYnVnLmdldGhvb2soKSkKCmxvY2FsIHRlc3RsaW5lID0gMTkgICAgICAgICAtLSBsaW5lIHdoZXJlICd0ZXN0JyBpcyBkZWZpbmVkCmZ1bmN0aW9uIHRlc3QgKHMsIGwsIHApICAgICAtLSB0aGlzIG11c3QgYmUgbGluZSAxOQogIGNvbGxlY3RnYXJiYWdlKCkgICAtLSBhdm9pZCBnYyBkdXJpbmcgdHJhY2UKICBsb2NhbCBmdW5jdGlvbiBmIChldmVudCwgbGluZSkKICAgIGFzc2VydChldmVudCA9PSAnbGluZScpCiAgICBsb2NhbCBsID0gdGFibGUucmVtb3ZlKGwsIDEpCiAgICBpZiBwIHRoZW4gcHJpbnQobCwgbGluZSkgZW5kCiAgICBhc3NlcnQobCA9PSBsaW5lLCAid3JvbmcgdHJhY2UhISIpCiAgZW5kCiAgZGVidWcuc2V0aG9vayhmLCJsIik7IGxvYWQocykoKTsgZGVidWcuc2V0aG9vaygpCiAgYXNzZXJ0KCNsID09IDApCmVuZAoKCmRvCiAgYXNzZXJ0KG5vdCBwY2FsbChkZWJ1Zy5nZXRpbmZvLCBwcmludCwgIlgiKSkgICAtLSBpbnZhbGlkIG9wdGlvbgogIGFzc2VydChub3QgZGVidWcuZ2V0aW5mbygxMDAwKSkgICAtLSBvdXQgb2YgcmFuZ2UgbGV2ZWwKICBhc3NlcnQobm90IGRlYnVnLmdldGluZm8oLTEpKSAgICAgLS0gb3V0IG9mIHJhbmdlIGxldmVsCiAgbG9jYWwgYSA9IGRlYnVnLmdldGluZm8ocHJpbnQpCiAgYXNzZXJ0KGEud2hhdCA9PSAiQyIgYW5kIGEuc2hvcnRfc3JjID09ICJbQ10iKQogIGEgPSBkZWJ1Zy5nZXRpbmZvKHByaW50LCAiTCIpCiAgYXNzZXJ0KGEuYWN0aXZlbGluZXMgPT0gbmlsKQogIGxvY2FsIGIgPSBkZWJ1Zy5nZXRpbmZvKHRlc3QsICJTZkwiKQogIGFzc2VydChiLm5hbWUgPT0gbmlsIGFuZCBiLndoYXQgPT0gIkx1YSIgYW5kIGIubGluZWRlZmluZWQgPT0gdGVzdGxpbmUgYW5kCiAgICAgICAgIGIubGFzdGxpbmVkZWZpbmVkID09IGIubGluZWRlZmluZWQgKyAxMCBhbmQKICAgICAgICAgYi5mdW5jID09IHRlc3QgYW5kIG5vdCBzdHJpbmcuZmluZChiLnNob3J0X3NyYywgIiVbIikpCiAgYXNzZXJ0KGIuYWN0aXZlbGluZXNbYi5saW5lZGVmaW5lZCArIDFdIGFuZAogICAgICAgICBiLmFjdGl2ZWxpbmVzW2IubGFzdGxpbmVkZWZpbmVkXSkKICBhc3NlcnQobm90IGIuYWN0aXZlbGluZXNbYi5saW5lZGVmaW5lZF0gYW5kCiAgICAgICAgIG5vdCBiLmFjdGl2ZWxpbmVzW2IubGFzdGxpbmVkZWZpbmVkICsgMV0pCmVuZAoKCi0tIHRlc3QgZmlsZSBhbmQgc3RyaW5nIG5hbWVzIHRydW5jYXRpb24KYSA9ICJmdW5jdGlvbiBmICgpIGVuZCIKbG9jYWwgZnVuY3Rpb24gZG9zdHJpbmcgKHMsIHgpIHJldHVybiBsb2FkKHMsIHgpKCkgZW5kCmRvc3RyaW5nKGEpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYyA9PSBzdHJpbmcuZm9ybWF0KCdbc3RyaW5nICIlcyJdJywgYSkpCmRvc3RyaW5nKGEuLnN0cmluZy5mb3JtYXQoIjsgJXNcbj0xIiwgc3RyaW5nLnJlcCgncCcsIDQwMCkpKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMsICdeJVtzdHJpbmcgW15cbl0qJS4lLiUuIiVdJCcpKQpkb3N0cmluZyhhLi5zdHJpbmcuZm9ybWF0KCI7ICVzPTEiLCBzdHJpbmcucmVwKCdwJywgNDAwKSkpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYywgJ14lW3N0cmluZyBbXlxuXSolLiUuJS4iJV0kJykpCmRvc3RyaW5nKCJcbiIuLmEpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYyA9PSAnW3N0cmluZyAiLi4uIl0nKQpkb3N0cmluZyhhLCAiIikKYXNzZXJ0KGRlYnVnLmdldGluZm8oZikuc2hvcnRfc3JjID09ICdbc3RyaW5nICIiXScpCmRvc3RyaW5nKGEsICJAeHV4dSIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYyA9PSAieHV4dSIpCmRvc3RyaW5nKGEsICJAIi4uc3RyaW5nLnJlcCgncCcsIDEwMDApLi4ndCcpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYywgIl4lLiUuJS5wKnQkIikpCmRvc3RyaW5nKGEsICI9eHV4dSIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYyA9PSAieHV4dSIpCmRvc3RyaW5nKGEsIHN0cmluZy5mb3JtYXQoIj0lcyIsIHN0cmluZy5yZXAoJ3gnLCA1MDApKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLmdldGluZm8oZikuc2hvcnRfc3JjLCAiXngqJCIpKQpkb3N0cmluZyhhLCAiPSIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYyA9PSAiIikKYSA9IG5pbDsgZiA9IG5pbDsKCgpyZXBlYXQKICBsb2NhbCBnID0ge3ggPSBmdW5jdGlvbiAoKQogICAgbG9jYWwgYSA9IGRlYnVnLmdldGluZm8oMikKICAgIGFzc2VydChhLm5hbWUgPT0gJ2YnIGFuZCBhLm5hbWV3aGF0ID09ICdsb2NhbCcpCiAgICBhID0gZGVidWcuZ2V0aW5mbygxKQogICAgYXNzZXJ0KGEubmFtZSA9PSAneCcgYW5kIGEubmFtZXdoYXQgPT0gJ2ZpZWxkJykKICAgIHJldHVybiAneGl4aScKICBlbmR9CiAgbG9jYWwgZiA9IGZ1bmN0aW9uICgpIHJldHVybiAxKzEgYW5kIChub3QgMSBvciBnLngoKSkgZW5kCiAgYXNzZXJ0KGYoKSA9PSAneGl4aScpCiAgZyA9IGRlYnVnLmdldGluZm8oZikKICBhc3NlcnQoZy53aGF0ID09ICJMdWEiIGFuZCBnLmZ1bmMgPT0gZiBhbmQgZy5uYW1ld2hhdCA9PSAiIiBhbmQgbm90IGcubmFtZSkKCiAgZnVuY3Rpb24gZiAoeCwgbmFtZSkgICAtLSBsb2NhbCEKICAgIG5hbWUgPSBuYW1lIG9yICdmJwogICAgbG9jYWwgYSA9IGRlYnVnLmdldGluZm8oMSkKICAgIGFzc2VydChhLm5hbWUgPT0gbmFtZSBhbmQgYS5uYW1ld2hhdCA9PSAnbG9jYWwnKQogICAgcmV0dXJuIHgKICBlbmQKCiAgLS0gYnJlYWtzIGluIGRpZmZlcmVudCBjb25kaXRpb25zCiAgaWYgMz40IHRoZW4gYnJlYWsgZW5kOyBmKCkKICBpZiAzPDQgdGhlbiBhPTEgZWxzZSBicmVhayBlbmQ7IGYoKQogIHdoaWxlIDEgZG8gbG9jYWwgeD0xMDsgYnJlYWsgZW5kOyBmKCkKICBsb2NhbCBiID0gMQogIGlmIDM+NCB0aGVuIHJldHVybiBtYXRoLnNpbigxKSBlbmQ7IGYoKQogIGEgPSAzPDQ7IGYoKQogIGEgPSAzPDQgb3IgMTsgZigpCiAgcmVwZWF0IGxvY2FsIHg9MjA7IGlmIDQ+MyB0aGVuIGYoKSBlbHNlIGJyZWFrIGVuZDsgZigpIHVudGlsIDEKICBnID0ge30KICBmKGcpLnggPSBmKDIpIGFuZCBmKDEwKStmKDkpCiAgYXNzZXJ0KGcueCA9PSBmKDE5KSkKICBmdW5jdGlvbiBnKHgpIGlmIG5vdCB4IHRoZW4gcmV0dXJuIDMgZW5kIHJldHVybiAoeCgnYScsICd4JykpIGVuZAogIGFzc2VydChnKGYpID09ICdhJykKdW50aWwgMQoKdGVzdChbW2lmCm1hdGguc2luKDEpCnRoZW4KICBhPTEKZWxzZQogIGE9MgplbmQKXV0sIHsyLDMsNCw3fSkKCnRlc3QoW1stLQppZiBuaWwgdGhlbgogIGE9MQplbHNlCiAgYT0yCmVuZApdXSwgezIsNSw2fSkKCnRlc3QoW1thPTEKcmVwZWF0CiAgYT1hKzEKdW50aWwgYT09MwpdXSwgezEsMyw0LDMsNH0pCgp0ZXN0KFtbIGRvCiAgcmV0dXJuCmVuZApdXSwgezJ9KQoKdGVzdChbW2xvY2FsIGEKYT0xCndoaWxlIGE8PTMgZG8KICBhPWErMQplbmQKXV0sIHsxLDIsMyw0LDMsNCwzLDQsMyw1fSkKCnRlc3QoW1t3aGlsZSBtYXRoLnNpbigxKSBkbwogIGlmIG1hdGguc2luKDEpCiAgdGhlbiBicmVhawogIGVuZAplbmQKYT0xXV0sIHsxLDIsMyw2fSkKCnRlc3QoW1tmb3IgaT0xLDMgZG8KICBhPWkKZW5kCl1dLCB7MSwyLDEsMiwxLDIsMSwzfSkKCnRlc3QoW1tmb3IgaSx2IGluIHBhaXJzeydhJywnYid9IGRvCiAgYT10b3N0cmluZyhpKSAuLiB2CmVuZApdXSwgezEsMiwxLDIsMSwzfSkKCnRlc3QoW1tmb3IgaT0xLDQgZG8gYT0xIGVuZF1dLCB7MSwxLDEsMSwxfSkKCgpkbyAgIC0tIHRlc3RpbmcgbGluZSBpbmZvL3RyYWNlIHdpdGggbGFyZ2UgZ2FwcyBpbiBzb3VyY2UKCiAgbG9jYWwgYSA9IHsxLCAyLCAzLCAxMCwgMTI0LCAxMjUsIDEyNiwgMTI3LCAxMjgsIDEyOSwgMTMwLAogICAgICAgICAgICAgMjU1LCAyNTYsIDI1NywgNTAwLCAxMDAwfQogIGxvY2FsIHMgPSBbWwogICAgIGxvY2FsIGIgPSB7MTB9CiAgICAgYSA9IGJbMV0gWCArIFkgYlsxXQogICAgIGIgPSA0CiAgXV0KICBmb3IgXywgaSBpbiBpcGFpcnMoYSkgZG8KICAgIGxvY2FsIHN1YnMgPSB7WCA9IHN0cmluZy5yZXAoIlxuIiwgaSl9CiAgICBmb3IgXywgaiBpbiBpcGFpcnMoYSkgZG8KICAgICAgc3Vicy5ZID0gc3RyaW5nLnJlcCgiXG4iLCBqKQogICAgICBsb2NhbCBzID0gc3RyaW5nLmdzdWIocywgIltYWV0iLCBzdWJzKQogICAgICB0ZXN0KHMsIHsxLCAyICsgaSwgMiArIGkgKyBqLCAyICsgaSwgMiArIGkgKyBqLCAzICsgaSArIGp9KQogICAgZW5kCiAgZW5kCmVuZAoKcHJpbnQnKycKCi0tIGludmFsaWQgbGV2ZWxzIGluIFtnc11ldGxvY2FsCmFzc2VydChub3QgcGNhbGwoZGVidWcuZ2V0bG9jYWwsIDIwLCAxKSkKYXNzZXJ0KG5vdCBwY2FsbChkZWJ1Zy5zZXRsb2NhbCwgLTEsIDEsIDEwKSkKCgotLSBwYXJhbWV0ZXIgbmFtZXMKbG9jYWwgZnVuY3Rpb24gZm9vIChhLGIsLi4uKSBsb2NhbCBkLCBlIGVuZApsb2NhbCBjbyA9IGNvcm91dGluZS5jcmVhdGUoZm9vKQoKYXNzZXJ0KGRlYnVnLmdldGxvY2FsKGZvbywgMSkgPT0gJ2EnKQphc3NlcnQoZGVidWcuZ2V0bG9jYWwoZm9vLCAyKSA9PSAnYicpCmFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoZm9vLCAzKSkKYXNzZXJ0KGRlYnVnLmdldGxvY2FsKGNvLCBmb28sIDEpID09ICdhJykKYXNzZXJ0KGRlYnVnLmdldGxvY2FsKGNvLCBmb28sIDIpID09ICdiJykKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbChjbywgZm9vLCAzKSkKCmFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwocHJpbnQsIDEpKQoKCmxvY2FsIGZ1bmN0aW9uIGZvbyAoKSByZXR1cm4gKGRlYnVnLmdldGxvY2FsKDEsIC0xKSkgZW5kCmFzc2VydChub3QgZm9vKDEwKSkKCgotLSB2YXJhcmdzCmxvY2FsIGZ1bmN0aW9uIGZvbyAoYSwgLi4uKQogIGxvY2FsIHQgPSB0YWJsZS5wYWNrKC4uLikKICBmb3IgaSA9IDEsIHQubiBkbwogICAgbG9jYWwgbiwgdiA9IGRlYnVnLmdldGxvY2FsKDEsIC1pKQogICAgYXNzZXJ0KG4gPT0gIigqdmFyYXJnKSIgYW5kIHYgPT0gdFtpXSkKICBlbmQKICBhc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKDEsIC0odC5uICsgMSkpKQogIGFzc2VydChub3QgZGVidWcuc2V0bG9jYWwoMSwgLSh0Lm4gKyAxKSwgMzApKQogIGlmIHQubiA+IDAgdGhlbgogICAgKGZ1bmN0aW9uICh4KQogICAgICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgLTEsIHgpID09ICIoKnZhcmFyZykiKQogICAgICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgLXQubiwgeCkgPT0gIigqdmFyYXJnKSIpCiAgICAgZW5kKSg0MzApCiAgICAgYXNzZXJ0KC4uLiA9PSA0MzApCiAgZW5kCmVuZAoKZm9vKCkKZm9vKHByaW50KQpmb28oMjAwLCAzLCA0KQpsb2NhbCBhID0ge30KZm9yIGkgPSAxLCAoX3NvZnQgYW5kIDEwMCBvciAxMDAwKSBkbyBhW2ldID0gaSBlbmQKZm9vKHRhYmxlLnVucGFjayhhKSkKYSA9IG5pbAoKCgpkbyAgIC0tIHRlc3QgaG9vayBwcmVzZW5jZSBpbiBkZWJ1ZyBpbmZvCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRob29rKCkpCiAgbG9jYWwgY291bnQgPSAwCiAgbG9jYWwgZnVuY3Rpb24gZiAoKQogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSkubmFtZXdoYXQgPT0gImhvb2siKQogICAgbG9jYWwgc25kbGluZSA9IHN0cmluZy5tYXRjaChkZWJ1Zy50cmFjZWJhY2soKSwgIlxuKC4tKVxuIikKICAgIGFzc2VydChzdHJpbmcuZmluZChzbmRsaW5lLCAiaG9vayIpKQogICAgY291bnQgPSBjb3VudCArIDEKICBlbmQKICBkZWJ1Zy5zZXRob29rKGYsICJsIikKICBsb2NhbCBhID0gMAogIF9FTlYuYSA9IGEKICBhID0gMQogIGRlYnVnLnNldGhvb2soKQogIGFzc2VydChjb3VudCA9PSA0KQplbmQKCgphID0ge307IEwgPSBuaWwKbG9jYWwgZ2xvYiA9IDEKbG9jYWwgb2xkZ2xvYiA9IGdsb2IKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSxsKQogIGNvbGxlY3RnYXJiYWdlKCkgICAtLSBmb3JjZSBHQyBkdXJpbmcgYSBob29rCiAgbG9jYWwgZiwgbSwgYyA9IGRlYnVnLmdldGhvb2soKQogIGFzc2VydChtID09ICdjcmwnIGFuZCBjID09IDApCiAgaWYgZSA9PSAibGluZSIgdGhlbgogICAgaWYgZ2xvYiB+PSBvbGRnbG9iIHRoZW4KICAgICAgTCA9IGwtMSAgIC0tIGdldCB0aGUgZmlyc3QgbGluZSB3aGVyZSAiZ2xvYiIgaGFzIGNoYW5nZWQKICAgICAgb2xkZ2xvYiA9IGdsb2IKICAgIGVuZAogIGVsc2VpZiBlID09ICJjYWxsIiB0aGVuCiAgICAgIGxvY2FsIGYgPSBkZWJ1Zy5nZXRpbmZvKDIsICJmIikuZnVuYwogICAgICBhW2ZdID0gMQogIGVsc2UgYXNzZXJ0KGUgPT0gInJldHVybiIpCiAgZW5kCmVuZCwgImNybCIpCgoKZnVuY3Rpb24gZihhLGIpCiAgY29sbGVjdGdhcmJhZ2UoKQogIGxvY2FsIF8sIHggPSBkZWJ1Zy5nZXRsb2NhbCgxLCAxKQogIGxvY2FsIF8sIHkgPSBkZWJ1Zy5nZXRsb2NhbCgxLCAyKQogIGFzc2VydCh4ID09IGEgYW5kIHkgPT0gYikKICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgMywgInBlcmEiKSA9PSAiQUEiLi4iQUEiKQogIGFzc2VydChkZWJ1Zy5zZXRsb2NhbCgyLCA0LCAibWHn4yIpID09ICJCIikKICB4ID0gZGVidWcuZ2V0aW5mbygyKQogIGFzc2VydCh4LmZ1bmMgPT0gZyBhbmQgeC53aGF0ID09ICJMdWEiIGFuZCB4Lm5hbWUgPT0gJ2cnIGFuZAogICAgICAgICB4Lm51cHMgPT0gMiBhbmQgc3RyaW5nLmZpbmQoeC5zb3VyY2UsICJeQC4qZGIlLmx1YSQiKSkKICBnbG9iID0gZ2xvYisxCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzEpCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzIpCmVuZAoKZnVuY3Rpb24gZm9vKCkKICBnbG9iID0gZ2xvYisxCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzEpCmVuZDsgZm9vKCkgIC0tIHNldCBMCi0tIGNoZWNrIGxpbmUgY291bnRpbmcgaW5zaWRlIHN0cmluZ3MgYW5kIGVtcHR5IGxpbmVzCgpfID0gJ2Fsb1wKYWxvJyAuLiBbWwoKXV0KLS1bWwpdXQphc3NlcnQoZGVidWcuZ2V0aW5mbygxLCAibCIpLmN1cnJlbnRsaW5lID09IEwrMTEpICAtLSBjaGVjayBjb3VudCBvZiBsaW5lcwoKCmZ1bmN0aW9uIGcgKC4uLikKICBsb2NhbCBhcmcgPSB7Li4ufQogIGRvIGxvY2FsIGEsYixjOyBhPW1hdGguc2luKDQwKTsgZW5kCiAgbG9jYWwgZmVpamFvCiAgbG9jYWwgQUFBQSxCID0gInh1eHUiLCAibWFt428iCiAgZihBQUFBLEIpCiAgYXNzZXJ0KEFBQUEgPT0gInBlcmEiIGFuZCBCID09ICJtYefjIikKICBkbwogICAgIGxvY2FsIEIgPSAxMwogICAgIGxvY2FsIHgseSA9IGRlYnVnLmdldGxvY2FsKDEsNSkKICAgICBhc3NlcnQoeCA9PSAnQicgYW5kIHkgPT0gMTMpCiAgZW5kCmVuZAoKZygpCgoKYXNzZXJ0KGFbZl0gYW5kIGFbZ10gYW5kIGFbYXNzZXJ0XSBhbmQgYVtkZWJ1Zy5nZXRsb2NhbF0gYW5kIG5vdCBhW3ByaW50XSkKCgotLSB0ZXN0cyBmb3IgbWFuaXB1bGF0aW5nIG5vbi1yZWdpc3RlcmVkIGxvY2FscyAoQyBhbmQgTHVhIHRlbXBvcmFyaWVzKQoKbG9jYWwgbiwgdiA9IGRlYnVnLmdldGxvY2FsKDAsIDEpCmFzc2VydCh2ID09IDAgYW5kIG4gPT0gIigqdGVtcG9yYXJ5KSIpCmxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgwLCAyKQphc3NlcnQodiA9PSAyIGFuZCBuID09ICIoKnRlbXBvcmFyeSkiKQphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKDAsIDMpKQphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKDAsIDApKQoKZnVuY3Rpb24gZigpCiAgYXNzZXJ0KHNlbGVjdCgyLCBkZWJ1Zy5nZXRsb2NhbCgyLDMpKSA9PSAxKQogIGFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoMiw0KSkKICBkZWJ1Zy5zZXRsb2NhbCgyLCAzLCAxMCkKICByZXR1cm4gMjAKZW5kCgpmdW5jdGlvbiBnKGEsYikgcmV0dXJuIChhKzEpICsgZigpIGVuZAoKYXNzZXJ0KGcoMCwwKSA9PSAzMCkKIAoKZGVidWcuc2V0aG9vayhuaWwpOwphc3NlcnQoZGVidWcuZ2V0aG9vaygpID09IG5pbCkKCgotLSBtaW5pbWFsIHRlc3RzIGZvciBzZXR1c2VydmFsdWUvZ2V0dXNlcnZhbHVlCmRvCiAgYXNzZXJ0KGRlYnVnLnNldHVzZXJ2YWx1ZShpby5zdGRpbiwgMTApID09IG5pbCkKICBsb2NhbCBhLCBiID0gZGVidWcuZ2V0dXNlcnZhbHVlKGlvLnN0ZGluLCAxMCkKICBhc3NlcnQoYSA9PSBuaWwgYW5kIG5vdCBiKQplbmQKCi0tIHRlc3RpbmcgaXRlcmFjdGlvbiBiZXR3ZWVuIG11bHRpcGxlIHZhbHVlcyB4IGhvb2tzCmRvCiAgbG9jYWwgZnVuY3Rpb24gZiguLi4pIHJldHVybiAzLCAuLi4gZW5kCiAgbG9jYWwgY291bnQgPSAwCiAgbG9jYWwgYSA9IHt9CiAgZm9yIGkgPSAxLCAxMDAgZG8gYVtpXSA9IGkgZW5kCiAgZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoKSBjb3VudCA9IGNvdW50ICsgMSBlbmQsICIiLCAxKQogIGxvY2FsIHQgPSB7dGFibGUudW5wYWNrKGEpfQogIGFzc2VydCgjdCA9PSAxMDApCiAgdCA9IHt0YWJsZS51bnBhY2soYSwgMSwgMyl9CiAgYXNzZXJ0KCN0ID09IDMpCiAgdCA9IHtmKHRhYmxlLnVucGFjayhhLCAxLCAzMCkpfQogIGFzc2VydCgjdCA9PSAzMSkKZW5kCgoKLS0gdGVzdGluZyBhY2Nlc3MgdG8gZnVuY3Rpb24gYXJndW1lbnRzCgpsb2NhbCBmdW5jdGlvbiBjb2xsZWN0bG9jYWxzIChsZXZlbCkKICBsb2NhbCB0YWIgPSB7fQogIGZvciBpID0gMSwgbWF0aC5odWdlIGRvCiAgICBsb2NhbCBuLCB2ID0gZGVidWcuZ2V0bG9jYWwobGV2ZWwgKyAxLCBpKQogICAgaWYgbm90IChuIGFuZCBzdHJpbmcuZmluZChuLCAiXlthLXpBLVowLTlfXSskIikpIHRoZW4KICAgICAgIGJyZWFrICAgLS0gY29uc2lkZXIgb25seSByZWFsIHZhcmlhYmxlcwogICAgZW5kCiAgICB0YWJbbl0gPSB2CiAgZW5kCiAgcmV0dXJuIHRhYgplbmQKCgpYID0gbmlsCmEgPSB7fQpmdW5jdGlvbiBhOmYgKGEsIGIsIC4uLikgbG9jYWwgYXJnID0gey4uLn07IGxvY2FsIGMgPSAxMyBlbmQKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkKICBhc3NlcnQoZSA9PSAiY2FsbCIpCiAgZG9zdHJpbmcoIlhYID0gMTIiKSAgLS0gdGVzdCBkb3N0cmluZyBpbnNpZGUgaG9va3MKICAtLSB0ZXN0aW5nIGVycm9ycyBpbnNpZGUgaG9va3MKICBhc3NlcnQobm90IHBjYWxsKGxvYWQoImE9J2pvYW8nKzEiKSkpCiAgZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSwgbCkgCiAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygyLCAibCIpLmN1cnJlbnRsaW5lID09IGwpCiAgICBsb2NhbCBmLG0sYyA9IGRlYnVnLmdldGhvb2soKQogICAgYXNzZXJ0KGUgPT0gImxpbmUiKQogICAgYXNzZXJ0KG0gPT0gJ2wnIGFuZCBjID09IDApCiAgICBkZWJ1Zy5zZXRob29rKG5pbCkgIC0tIGhvb2sgaXMgY2FsbGVkIG9ubHkgb25jZQogICAgYXNzZXJ0KG5vdCBYKSAgICAgICAtLSBjaGVjayB0aGF0CiAgICBYID0gY29sbGVjdGxvY2FscygyKQogIGVuZCwgImwiKQplbmQsICJjIikKCmE6ZigxLDIsMyw0LDUpCmFzc2VydChYLnNlbGYgPT0gYSBhbmQgWC5hID09IDEgICBhbmQgWC5iID09IDIgYW5kIFguYyA9PSBuaWwpCmFzc2VydChYWCA9PSAxMikKYXNzZXJ0KGRlYnVnLmdldGhvb2soKSA9PSBuaWwpCgoKLS0gdGVzdGluZyBhY2Nlc3MgdG8gbG9jYWwgdmFyaWFibGVzIGluIHJldHVybiBob29rIChidWcgaW4gNS4yKQpkbwogIGxvY2FsIFggPSBmYWxzZQoKICBsb2NhbCBmdW5jdGlvbiBmb28gKGEsIGIsIC4uLikKICAgIGRvIGxvY2FsIHgseSx6IGVuZAogICAgbG9jYWwgYywgZCA9IDEwLCAyMAogICAgcmV0dXJuCiAgZW5kCgogIGxvY2FsIGZ1bmN0aW9uIGF1eCAoKQogICAgaWYgZGVidWcuZ2V0aW5mbygyKS5uYW1lID09ICJmb28iIHRoZW4KICAgICAgWCA9IHRydWUgICAtLSB0byBzaWduYWwgdGhhdCBpdCBmb3VuZCAnZm9vJwogICAgICBsb2NhbCB0YWIgPSB7YSA9IDEwMCwgYiA9IDIwMCwgYyA9IDEwLCBkID0gMjB9CiAgICAgIGZvciBuLCB2IGluIHBhaXJzKGNvbGxlY3Rsb2NhbHMoMikpIGRvCiAgICAgICAgYXNzZXJ0KHRhYltuXSA9PSB2KQogICAgICAgIHRhYltuXSA9IHVuZGVmCiAgICAgIGVuZAogICAgICBhc3NlcnQobmV4dCh0YWIpID09IG5pbCkgICAgLS0gJ3RhYicgbXVzdCBiZSBlbXB0eQogICAgZW5kCiAgZW5kCgogIGRlYnVnLnNldGhvb2soYXV4LCAiciIpOyBmb28oMTAwLCAyMDApOyBkZWJ1Zy5zZXRob29rKCkKICBhc3NlcnQoWCkKCmVuZAoKCmxvY2FsIGZ1bmN0aW9uIGVxc2VxICh0MSwgdDIpCiAgYXNzZXJ0KCN0MSA9PSAjdDIpCiAgZm9yIGkgPSAxLCAjdDEgZG8KICAgIGFzc2VydCh0MVtpXSA9PSB0MltpXSkKICBlbmQKZW5kCgoKZG8gIHByaW50KCJ0ZXN0aW5nIGluc3BlY3Rpb24gb2YgcGFyYW1ldGVycy9yZXR1cm5lZCB2YWx1ZXMiKQogIGxvY2FsIG9uID0gZmFsc2UKICBsb2NhbCBpbnAsIG91dAoKICBsb2NhbCBmdW5jdGlvbiBob29rIChldmVudCkKICAgIGlmIG5vdCBvbiB0aGVuIHJldHVybiBlbmQKICAgIGxvY2FsIGFyID0gZGVidWcuZ2V0aW5mbygyLCAicnVTIikKICAgIGxvY2FsIHQgPSB7fQogICAgZm9yIGkgPSBhci5mdHJhbnNmZXIsIGFyLmZ0cmFuc2ZlciArIGFyLm50cmFuc2ZlciAtIDEgZG8KICAgICAgbG9jYWwgXywgdiA9IGRlYnVnLmdldGxvY2FsKDIsIGkpCiAgICAgIHRbI3QgKyAxXSA9IHYgCiAgICBlbmQKICAgIGlmIGV2ZW50ID09ICJyZXR1cm4iIHRoZW4KICAgICAgb3V0ID0gdAogICAgZWxzZQogICAgICBpbnAgPSB0CiAgICBlbmQKICBlbmQKCiAgZGVidWcuc2V0aG9vayhob29rLCAiY3IiKQoKICBvbiA9IHRydWU7IG1hdGguc2luKDMpOyBvbiA9IGZhbHNlCiAgZXFzZXEoaW5wLCB7M30pOyBlcXNlcShvdXQsIHttYXRoLnNpbigzKX0pCgogIG9uID0gdHJ1ZTsgc2VsZWN0KDIsIDEwLCAyMCwgMzAsIDQwKTsgb24gPSBmYWxzZQogIGVxc2VxKGlucCwgezIsIDEwLCAyMCwgMzAsIDQwfSk7IGVxc2VxKG91dCwgezIwLCAzMCwgNDB9KQoKICBsb2NhbCBmdW5jdGlvbiBmb28gKGEsIC4uLikgcmV0dXJuIC4uLiBlbmQKICBsb2NhbCBmdW5jdGlvbiBmb28xICgpIG9uID0gbm90IG9uOyByZXR1cm4gZm9vKDIwLCAxMCwgMCkgZW5kCiAgZm9vMSgpOyBvbiA9IGZhbHNlCiAgZXFzZXEoaW5wLCB7MjB9KTsgZXFzZXEob3V0LCB7MTAsIDB9KQoKICBkZWJ1Zy5zZXRob29rKCkKZW5kCgoKCi0tIHRlc3RpbmcgdXB2YWx1ZSBhY2Nlc3MKbG9jYWwgZnVuY3Rpb24gZ2V0dXB2YWx1ZXMgKGYpCiAgbG9jYWwgdCA9IHt9CiAgbG9jYWwgaSA9IDEKICB3aGlsZSB0cnVlIGRvCiAgICBsb2NhbCBuYW1lLCB2YWx1ZSA9IGRlYnVnLmdldHVwdmFsdWUoZiwgaSkKICAgIGlmIG5vdCBuYW1lIHRoZW4gYnJlYWsgZW5kCiAgICBhc3NlcnQobm90IHRbbmFtZV0pCiAgICB0W25hbWVdID0gdmFsdWUKICAgIGkgPSBpICsgMQogIGVuZAogIHJldHVybiB0CmVuZAoKbG9jYWwgYSxiLGMgPSAxLDIsMwpsb2NhbCBmdW5jdGlvbiBmb28xIChhKSBiID0gYTsgcmV0dXJuIGMgZW5kCmxvY2FsIGZ1bmN0aW9uIGZvbzIgKHgpIGEgPSB4OyByZXR1cm4gYytiIGVuZAphc3NlcnQobm90IGRlYnVnLmdldHVwdmFsdWUoZm9vMSwgMykpCmFzc2VydChub3QgZGVidWcuZ2V0dXB2YWx1ZShmb28xLCAwKSkKYXNzZXJ0KG5vdCBkZWJ1Zy5zZXR1cHZhbHVlKGZvbzEsIDMsICJ4dXh1IikpCmxvY2FsIHQgPSBnZXR1cHZhbHVlcyhmb28xKQphc3NlcnQodC5hID09IG5pbCBhbmQgdC5iID09IDIgYW5kIHQuYyA9PSAzKQp0ID0gZ2V0dXB2YWx1ZXMoZm9vMikKYXNzZXJ0KHQuYSA9PSAxIGFuZCB0LmIgPT0gMiBhbmQgdC5jID09IDMpCmFzc2VydChkZWJ1Zy5zZXR1cHZhbHVlKGZvbzEsIDEsICJ4dXh1IikgPT0gImIiKQphc3NlcnQoKHtkZWJ1Zy5nZXR1cHZhbHVlKGZvbzIsIDMpfSlbMl0gPT0gInh1eHUiKQotLSB1cHZhbHVlcyBvZiBDIGZ1bmN0aW9ucyBhcmUgYWxsd2F5cyAiY2FsbGVkIiAiIiAodGhlIGVtcHR5IHN0cmluZykKYXNzZXJ0KGRlYnVnLmdldHVwdmFsdWUoc3RyaW5nLmdtYXRjaCgieCIsICJ4IiksIDEpID09ICIiKSAgCgoKLS0gdGVzdGluZyBjb3VudCBob29rcwpsb2NhbCBhPTAKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkgYT1hKzEgZW5kLCAiIiwgMSkKYT0wOyBmb3IgaT0xLDEwMDAgZG8gZW5kOyBhc3NlcnQoMTAwMCA8IGEgYW5kIGEgPCAxMDEyKQpkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlKSBhPWErMSBlbmQsICIiLCA0KQphPTA7IGZvciBpPTEsMTAwMCBkbyBlbmQ7IGFzc2VydCgyNTAgPCBhIGFuZCBhIDwgMjU1KQpsb2NhbCBmLG0sYyA9IGRlYnVnLmdldGhvb2soKQphc3NlcnQobSA9PSAiIiBhbmQgYyA9PSA0KQpkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlKSBhPWErMSBlbmQsICIiLCA0MDAwKQphPTA7IGZvciBpPTEsMTAwMCBkbyBlbmQ7IGFzc2VydChhID09IDApCgpkbwogIGRlYnVnLnNldGhvb2socHJpbnQsICIiLCAyXjI0IC0gMSkgICAtLSBjb3VudCB1cHBlcmJvdW5kCiAgbG9jYWwgZixtLGMgPSBkZWJ1Zy5nZXRob29rKCkKICBhc3NlcnQoKHtkZWJ1Zy5nZXRob29rKCl9KVszXSA9PSAyXjI0IC0gMSkKZW5kCgpkZWJ1Zy5zZXRob29rKCkKCgotLSB0ZXN0cyBmb3IgdGFpbCBjYWxscwpsb2NhbCBmdW5jdGlvbiBmICh4KQogIGlmIHggdGhlbgogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgIlMiKS53aGF0ID09ICJMdWEiKQogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgInQiKS5pc3RhaWxjYWxsID09IHRydWUpCiAgICBsb2NhbCB0YWlsID0gZGVidWcuZ2V0aW5mbygyKQogICAgYXNzZXJ0KHRhaWwuZnVuYyA9PSBnMSBhbmQgdGFpbC5pc3RhaWxjYWxsID09IHRydWUpCiAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygzLCAiUyIpLndoYXQgPT0gIm1haW4iKQogICAgcHJpbnQiKyIKICAgIGVuZAplbmQKCmZ1bmN0aW9uIGcoeCkgcmV0dXJuIGYoeCkgZW5kCgpmdW5jdGlvbiBnMSh4KSBnKHgpIGVuZAoKbG9jYWwgZnVuY3Rpb24gaCAoeCkgbG9jYWwgZj1nMTsgcmV0dXJuIGYoeCkgZW5kCgpoKHRydWUpCgpsb2NhbCBiID0ge30KZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkgdGFibGUuaW5zZXJ0KGIsIGUpIGVuZCwgImNyIikKaChmYWxzZSkKZGVidWcuc2V0aG9vaygpCmxvY2FsIHJlcyA9IHsicmV0dXJuIiwgICAtLSBmaXJzdCByZXR1cm4gKGZyb20gc2V0aG9vaykKICAiY2FsbCIsICJ0YWlsIGNhbGwiLCAiY2FsbCIsICJ0YWlsIGNhbGwiLAogICJyZXR1cm4iLCAicmV0dXJuIiwKICAiY2FsbCIsICAgIC0tIGxhc3QgY2FsbCAodG8gc2V0aG9vaykKfQpmb3IgaSA9IDEsICNyZXMgZG8gYXNzZXJ0KHJlc1tpXSA9PSB0YWJsZS5yZW1vdmUoYiwgMSkpIGVuZAoKYiA9IDAKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkKICAgICAgICAgICAgICAgIGlmIGUgPT0gInRhaWwgY2FsbCIgdGhlbgogICAgICAgICAgICAgICAgICBiID0gYiArIDEKICAgICAgICAgICAgICAgICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMiwgInQiKS5pc3RhaWxjYWxsID09IHRydWUpCiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDIsICJ0IikuaXN0YWlsY2FsbCA9PSBmYWxzZSkKICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgIGVuZCwgImMiKQpoKGZhbHNlKQpkZWJ1Zy5zZXRob29rKCkKYXNzZXJ0KGIgPT0gMikgICAtLSB0d28gdGFpbCBjYWxscwoKbGltID0gX3NvZnQgYW5kIDMwMDAgb3IgMzAwMDAKbG9jYWwgZnVuY3Rpb24gZm9vICh4KQogIGlmIHg9PTAgdGhlbgogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMikud2hhdCA9PSAibWFpbiIpCiAgICBsb2NhbCBpbmZvID0gZGVidWcuZ2V0aW5mbygxKQogICAgYXNzZXJ0KGluZm8uaXN0YWlsY2FsbCA9PSB0cnVlIGFuZCBpbmZvLmZ1bmMgPT0gZm9vKQogIGVsc2UgcmV0dXJuIGZvbyh4LTEpCiAgZW5kCmVuZAoKZm9vKGxpbSkKCgpwcmludCIrIgoKCi0tIHRlc3RpbmcgbG9jYWwgZnVuY3Rpb24gaW5mb3JtYXRpb24KY28gPSBsb2FkW1sKICBsb2NhbCBBID0gZnVuY3Rpb24gKCkKICAgIHJldHVybiB4CiAgZW5kCiAgcmV0dXJuCl1dCgpsb2NhbCBhID0gMAotLSAnQScgc2hvdWxkIGJlIHZpc2libGUgdG8gZGVidWdnZXIgb25seSBhZnRlciBpdHMgY29tcGxldGUgZGVmaW5pdGlvbgpkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlLCBsKQogIGlmIGwgPT0gMyB0aGVuIGEgPSBhICsgMTsgYXNzZXJ0KGRlYnVnLmdldGxvY2FsKDIsIDEpID09ICIoKnRlbXBvcmFyeSkiKQogIGVsc2VpZiBsID09IDQgdGhlbiBhID0gYSArIDE7IGFzc2VydChkZWJ1Zy5nZXRsb2NhbCgyLCAxKSA9PSAiQSIpCiAgZW5kCmVuZCwgImwiKQpjbygpICAtLSBydW4gbG9jYWwgZnVuY3Rpb24gZGVmaW5pdGlvbgpkZWJ1Zy5zZXRob29rKCkgIC0tIHR1cm4gb2ZmIGhvb2sKYXNzZXJ0KGEgPT0gMikgICAtLSBlbnN1cmUgYWxsIHR3byBsaW5lcyB3aGVyZSBob29rZWQKCi0tIHRlc3RpbmcgdHJhY2ViYWNrCgphc3NlcnQoZGVidWcudHJhY2ViYWNrKHByaW50KSA9PSBwcmludCkKYXNzZXJ0KGRlYnVnLnRyYWNlYmFjayhwcmludCwgNCkgPT0gcHJpbnQpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy50cmFjZWJhY2soImhpIiwgNCksICJeaGlcbiIpKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcudHJhY2ViYWNrKCJoaSIpLCAiXmhpXG4iKSkKYXNzZXJ0KG5vdCBzdHJpbmcuZmluZChkZWJ1Zy50cmFjZWJhY2soImhpIiksICInZGVidWcudHJhY2ViYWNrJyIpKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcudHJhY2ViYWNrKCJoaSIsIDApLCAiJ2RlYnVnLnRyYWNlYmFjayciKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLnRyYWNlYmFjaygpLCAiXnN0YWNrIHRyYWNlYmFjazpcbiIpKQoKZG8gIC0tIEMtZnVuY3Rpb24gbmFtZXMgaW4gdHJhY2ViYWNrCiAgbG9jYWwgc3QsIG1zZyA9IChmdW5jdGlvbiAoKSByZXR1cm4gcGNhbGwgZW5kKSgpKGRlYnVnLnRyYWNlYmFjaykKICBhc3NlcnQoc3QgPT0gdHJ1ZSBhbmQgc3RyaW5nLmZpbmQobXNnLCAicGNhbGwiKSkKZW5kCgoKLS0gdGVzdGluZyBucGFyYW1zLCBudXBzIGUgaXN2YXJhcmcKbG9jYWwgdCA9IGRlYnVnLmdldGluZm8ocHJpbnQsICJ1IikKYXNzZXJ0KHQuaXN2YXJhcmcgPT0gdHJ1ZSBhbmQgdC5ucGFyYW1zID09IDAgYW5kIHQubnVwcyA9PSAwKQoKdCA9IGRlYnVnLmdldGluZm8oZnVuY3Rpb24gKGEsYixjKSBlbmQsICJ1IikKYXNzZXJ0KHQuaXN2YXJhcmcgPT0gZmFsc2UgYW5kIHQubnBhcmFtcyA9PSAzIGFuZCB0Lm51cHMgPT0gMCkKCnQgPSBkZWJ1Zy5nZXRpbmZvKGZ1bmN0aW9uIChhLGIsLi4uKSByZXR1cm4gdFthXSBlbmQsICJ1IikKYXNzZXJ0KHQuaXN2YXJhcmcgPT0gdHJ1ZSBhbmQgdC5ucGFyYW1zID09IDIgYW5kIHQubnVwcyA9PSAxKQoKdCA9IGRlYnVnLmdldGluZm8oMSkgICAtLSBtYWluCmFzc2VydCh0LmlzdmFyYXJnID09IHRydWUgYW5kIHQubnBhcmFtcyA9PSAwIGFuZCB0Lm51cHMgPT0gMSBhbmQKICAgICAgIGRlYnVnLmdldHVwdmFsdWUodC5mdW5jLCAxKSA9PSAiX0VOViIpCgoKCgotLSB0ZXN0aW5nIGRlYnVnZ2luZyBvZiBjb3JvdXRpbmVzCgpsb2NhbCBmdW5jdGlvbiBjaGVja3RyYWNlYmFjayAoY28sIHAsIGxldmVsKQogIGxvY2FsIHRiID0gZGVidWcudHJhY2ViYWNrKGNvLCBuaWwsIGxldmVsKQogIGxvY2FsIGkgPSAwCiAgZm9yIGwgaW4gc3RyaW5nLmdtYXRjaCh0YiwgIlteXG5dK1xuPyIpIGRvCiAgICBhc3NlcnQoaSA9PSAwIG9yIHN0cmluZy5maW5kKGwsIHBbaV0pKQogICAgaSA9IGkrMQogIGVuZAogIGFzc2VydChwW2ldID09IHVuZGVmKQplbmQKCgpsb2NhbCBmdW5jdGlvbiBmIChuKQogIGlmIG4gPiAwIHRoZW4gZihuLTEpCiAgZWxzZSBjb3JvdXRpbmUueWllbGQoKSBlbmQKZW5kCgpsb2NhbCBjbyA9IGNvcm91dGluZS5jcmVhdGUoZikKY29yb3V0aW5lLnJlc3VtZShjbywgMykKY2hlY2t0cmFjZWJhY2soY28sIHsieWllbGQiLCAiZGIubHVhIiwgImRiLmx1YSIsICJkYi5sdWEiLCAiZGIubHVhIn0pCmNoZWNrdHJhY2ViYWNrKGNvLCB7ImRiLmx1YSIsICJkYi5sdWEiLCAiZGIubHVhIiwgImRiLmx1YSJ9LCAxKQpjaGVja3RyYWNlYmFjayhjbywgeyJkYi5sdWEiLCAiZGIubHVhIiwgImRiLmx1YSJ9LCAyKQpjaGVja3RyYWNlYmFjayhjbywgeyJkYi5sdWEifSwgNCkKY2hlY2t0cmFjZWJhY2soY28sIHt9LCA0MCkKCgpjbyA9IGNvcm91dGluZS5jcmVhdGUoZnVuY3Rpb24gKHgpCiAgICAgICBsb2NhbCBhID0gMQogICAgICAgY29yb3V0aW5lLnlpZWxkKGRlYnVnLmdldGluZm8oMSwgImwiKSkKICAgICAgIGNvcm91dGluZS55aWVsZChkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUpCiAgICAgICByZXR1cm4gYQogICAgIGVuZCkKCmxvY2FsIHRyID0ge30KbG9jYWwgZm9vID0gZnVuY3Rpb24gKGUsIGwpIGlmIGwgdGhlbiB0YWJsZS5pbnNlcnQodHIsIGwpIGVuZCBlbmQKZGVidWcuc2V0aG9vayhjbywgZm9vLCAibGNyIikKCmxvY2FsIF8sIGwgPSBjb3JvdXRpbmUucmVzdW1lKGNvLCAxMCkKbG9jYWwgeCA9IGRlYnVnLmdldGluZm8oY28sIDEsICJsZkxTIikKYXNzZXJ0KHguY3VycmVudGxpbmUgPT0gbC5jdXJyZW50bGluZSBhbmQgeC5hY3RpdmVsaW5lc1t4LmN1cnJlbnRsaW5lXSkKYXNzZXJ0KHR5cGUoeC5mdW5jKSA9PSAiZnVuY3Rpb24iKQpmb3IgaT14LmxpbmVkZWZpbmVkICsgMSwgeC5sYXN0bGluZWRlZmluZWQgZG8KICBhc3NlcnQoeC5hY3RpdmVsaW5lc1tpXSkKICB4LmFjdGl2ZWxpbmVzW2ldID0gdW5kZWYKZW5kCmFzc2VydChuZXh0KHguYWN0aXZlbGluZXMpID09IG5pbCkgICAtLSBubyAnZXh0cmEnIGVsZW1lbnRzCmFzc2VydChub3QgZGVidWcuZ2V0aW5mbyhjbywgMikpCmxvY2FsIGEsYiA9IGRlYnVnLmdldGxvY2FsKGNvLCAxLCAxKQphc3NlcnQoYSA9PSAieCIgYW5kIGIgPT0gMTApCmEsYiA9IGRlYnVnLmdldGxvY2FsKGNvLCAxLCAyKQphc3NlcnQoYSA9PSAiYSIgYW5kIGIgPT0gMSkKZGVidWcuc2V0bG9jYWwoY28sIDEsIDIsICJoaSIpCmFzc2VydChkZWJ1Zy5nZXRob29rKGNvKSA9PSBmb28pCmFzc2VydCgjdHIgPT0gMiBhbmQKICAgICAgIHRyWzFdID09IGwuY3VycmVudGxpbmUtMSBhbmQgdHJbMl0gPT0gbC5jdXJyZW50bGluZSkKCmEsYixjID0gcGNhbGwoY29yb3V0aW5lLnJlc3VtZSwgY28pCmFzc2VydChhIGFuZCBiIGFuZCBjID09IGwuY3VycmVudGxpbmUrMSkKY2hlY2t0cmFjZWJhY2soY28sIHsieWllbGQiLCAiaW4gZnVuY3Rpb24gPCJ9KQoKYSxiID0gY29yb3V0aW5lLnJlc3VtZShjbykKYXNzZXJ0KGEgYW5kIGIgPT0gImhpIikKYXNzZXJ0KCN0ciA9PSA0IGFuZCB0cls0XSA9PSBsLmN1cnJlbnRsaW5lKzIpCmFzc2VydChkZWJ1Zy5nZXRob29rKGNvKSA9PSBmb28pCmFzc2VydChub3QgZGVidWcuZ2V0aG9vaygpKQpjaGVja3RyYWNlYmFjayhjbywge30pCgoKLS0gY2hlY2sgZ2V0L3NldGxvY2FsIGluIGNvcm91dGluZXMKY28gPSBjb3JvdXRpbmUuY3JlYXRlKGZ1bmN0aW9uICh4KQogIGxvY2FsIGEsIGIgPSBjb3JvdXRpbmUueWllbGQoeCkKICBhc3NlcnQoYSA9PSAxMDAgYW5kIGIgPT0gbmlsKQogIHJldHVybiB4CmVuZCkKYSwgYiA9IGNvcm91dGluZS5yZXN1bWUoY28sIDEwKQphc3NlcnQoYSBhbmQgYiA9PSAxMCkKYSwgYiA9IGRlYnVnLmdldGxvY2FsKGNvLCAxLCAxKQphc3NlcnQoYSA9PSAieCIgYW5kIGIgPT0gMTApCmFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoY28sIDEsIDUpKQphc3NlcnQoZGVidWcuc2V0bG9jYWwoY28sIDEsIDEsIDMwKSA9PSAieCIpCmFzc2VydChub3QgZGVidWcuc2V0bG9jYWwoY28sIDEsIDUsIDQwKSkKYSwgYiA9IGNvcm91dGluZS5yZXN1bWUoY28sIDEwMCkKYXNzZXJ0KGEgYW5kIGIgPT0gMzApCgoKLS0gY2hlY2sgdHJhY2ViYWNrIG9mIHN1c3BlbmRlZCAob3IgZGVhZCB3aXRoIGVycm9yKSBjb3JvdXRpbmVzCgpmdW5jdGlvbiBmKGkpIGlmIGk9PTAgdGhlbiBlcnJvcihpKSBlbHNlIGNvcm91dGluZS55aWVsZCgpOyBmKGktMSkgZW5kIGVuZAoKY28gPSBjb3JvdXRpbmUuY3JlYXRlKGZ1bmN0aW9uICh4KSBmKHgpIGVuZCkKYSwgYiA9IGNvcm91dGluZS5yZXN1bWUoY28sIDMpCnQgPSB7Iidjb3JvdXRpbmUueWllbGQnIiwgIidmJyIsICJpbiBmdW5jdGlvbiA8In0Kd2hpbGUgY29yb3V0aW5lLnN0YXR1cyhjbykgPT0gInN1c3BlbmRlZCIgZG8KICBjaGVja3RyYWNlYmFjayhjbywgdCkKICBhLCBiID0gY29yb3V0aW5lLnJlc3VtZShjbykKICB0YWJsZS5pbnNlcnQodCwgMiwgIidmJyIpICAgLS0gb25lIG1vcmUgcmVjdXJzaXZlIGNhbGwgdG8gJ2YnCmVuZAp0WzFdID0gIidlcnJvciciCmNoZWNrdHJhY2ViYWNrKGNvLCB0KQoKCi0tIHRlc3QgYWNlc3NpbmcgbGluZSBudW1iZXJzIG9mIGEgY29yb3V0aW5lIGZyb20gYSByZXN1bWUgaW5zaWRlCi0tIGEgQyBmdW5jdGlvbiAodGhpcyBpcyBhIGtub3duIGJ1ZyBpbiBMdWEgNS4wKQoKbG9jYWwgZnVuY3Rpb24gZyh4KQogICAgY29yb3V0aW5lLnlpZWxkKHgpCmVuZAoKbG9jYWwgZnVuY3Rpb24gZiAoaSkKICBkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uICgpIGVuZCwgImwiKQogIGZvciBqPTEsMTAwMCBkbwogICAgZyhpK2opCiAgZW5kCmVuZAoKbG9jYWwgY28gPSBjb3JvdXRpbmUud3JhcChmKQpjbygxMCkKcGNhbGwoY28pCnBjYWxsKGNvKQoKCmFzc2VydCh0eXBlKGRlYnVnLmdldHJlZ2lzdHJ5KCkpID09ICJ0YWJsZSIpCgoKLS0gdGVzdCB0YWdtZXRob2QgaW5mb3JtYXRpb24KbG9jYWwgYSA9IHt9CmxvY2FsIGZ1bmN0aW9uIGYgKHQpCiAgbG9jYWwgaW5mbyA9IGRlYnVnLmdldGluZm8oMSk7CiAgYXNzZXJ0KGluZm8ubmFtZXdoYXQgPT0gIm1ldGFtZXRob2QiKQogIGEub3AgPSBpbmZvLm5hbWUKICByZXR1cm4gaW5mby5uYW1lCmVuZApzZXRtZXRhdGFibGUoYSwgewogIF9faW5kZXggPSBmOyBfX2FkZCA9IGY7IF9fZGl2ID0gZjsgX19tb2QgPSBmOyBfX2NvbmNhdCA9IGY7IF9fcG93ID0gZjsKICBfX211bCA9IGY7IF9faWRpdiA9IGY7IF9fdW5tID0gZjsgX19sZW4gPSBmOyBfX3N1YiA9IGY7CiAgX19zaGwgPSBmOyBfX3NociA9IGY7IF9fYm9yID0gZjsgX19ieG9yID0gZjsKICBfX2VxID0gZjsgX19sZSA9IGY7IF9fbHQgPSBmOyBfX3VubSA9IGY7IF9fbGVuID0gZjsgX19iYW5kID0gZjsKICBfX2Jub3QgPSBmOwp9KQoKbG9jYWwgYiA9IHNldG1ldGF0YWJsZSh7fSwgZ2V0bWV0YXRhYmxlKGEpKQoKYXNzZXJ0KGFbM10gPT0gImluZGV4IiBhbmQgYV4zID09ICJwb3ciIGFuZCBhLi5hID09ICJjb25jYXQiKQphc3NlcnQoYS8zID09ICJkaXYiIGFuZCAzJWEgPT0gIm1vZCIpCmFzc2VydChhKzMgPT0gImFkZCIgYW5kIDMtYSA9PSAic3ViIiBhbmQgYSozID09ICJtdWwiIGFuZAogICAgICAgLWEgPT0gInVubSIgYW5kICNhID09ICJsZW4iIGFuZCBhJjMgPT0gImJhbmQiKQphc3NlcnQoYXwzID09ICJib3IiIGFuZCAzfmEgPT0gImJ4b3IiIGFuZCBhPDwzID09ICJzaGlmdCIgYW5kCiAgICAgICBhPj4xID09ICJzaGlmdCIpCmFzc2VydCAoYT09YiBhbmQgYS5vcCA9PSAiZXEiKQphc3NlcnQgKGE+PWIgYW5kIGEub3AgPT0gIm9yZGVyIikKYXNzZXJ0IChhPmIgYW5kIGEub3AgPT0gIm9yZGVyIikKYXNzZXJ0KH5hID09ICJibm90IikKCmRvICAgLS0gdGVzdGluZyBmb3ItaXRlcmF0b3IgbmFtZQogIGxvY2FsIGZ1bmN0aW9uIGYoKQogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSkubmFtZSA9PSAiZm9yIGl0ZXJhdG9yIikKICBlbmQKCiAgZm9yIGkgaW4gZiBkbyBlbmQKZW5kCgoKZG8gICAtLSB0ZXN0aW5nIGRlYnVnIGluZm8gZm9yIGZpbmFsaXplcnMKICBsb2NhbCBuYW1lID0gbmlsCgogIC0tIGNyZWF0ZSBhIHBpZWNlIG9mIGdhcmJhZ2Ugd2l0aCBhIGZpbmFsaXplcgogIHNldG1ldGF0YWJsZSh7fSwge19fZ2MgPSBmdW5jdGlvbiAoKQogICAgbG9jYWwgdCA9IGRlYnVnLmdldGluZm8oMikgICAtLSBnZXQgY2FsbGVlIGluZm9ybWF0aW9uCiAgICBhc3NlcnQodC5uYW1ld2hhdCA9PSAibWV0YW1ldGhvZCIpCiAgICBuYW1lID0gdC5uYW1lCiAgZW5kfSkKCiAgLS0gcmVwZWF0IHVudGlsIHByZXZpb3VzIGZpbmFsaXplciBydW5zIChzZXR0aW5nICduYW1lJykKICByZXBlYXQgbG9jYWwgYSA9IHt9IHVudGlsIG5hbWUKICBhc3NlcnQobmFtZSA9PSAiX19nYyIpCmVuZAoKCmRvCiAgcHJpbnQoInRlc3RpbmcgdHJhY2ViYWNrIHNpemVzIikKCiAgbG9jYWwgZnVuY3Rpb24gY291bnRsaW5lcyAocykKICAgIHJldHVybiBzZWxlY3QoMiwgc3RyaW5nLmdzdWIocywgIlxuIiwgIiIpKQogIGVuZAoKICBsb2NhbCBmdW5jdGlvbiBkZWVwIChsdmwsIG4pCiAgICBpZiBsdmwgPT0gMCB0aGVuCiAgICAgIHJldHVybiAoZGVidWcudHJhY2ViYWNrKCJtZXNzYWdlIiwgbikpCiAgICBlbHNlCiAgICAgIHJldHVybiAoZGVlcChsdmwtMSwgbikpCiAgICBlbmQKICBlbmQKCiAgbG9jYWwgZnVuY3Rpb24gY2hlY2tkZWVwICh0b3RhbCwgc3RhcnQpCiAgICBsb2NhbCBzID0gZGVlcCh0b3RhbCwgc3RhcnQpCiAgICBsb2NhbCByZXN0ID0gc3RyaW5nLm1hdGNoKHMsICJebWVzc2FnZVxuc3RhY2sgdHJhY2ViYWNrOlxuKC4qKSQiKQogICAgbG9jYWwgY2wgPSBjb3VudGxpbmVzKHJlc3QpCiAgICAtLSBhdCBtb3N0IDEwIGxpbmVzIGluIGZpcnN0IHBhcnQsIDExIGluIHNlY29uZCwgcGx1cyAnLi4uJwogICAgYXNzZXJ0KGNsIDw9IDEwICsgMTEgKyAxKQogICAgbG9jYWwgYnJrID0gc3RyaW5nLmZpbmQocmVzdCwgIiUuJS4lLiIpCiAgICBpZiBicmsgdGhlbiAgIC0tIGRvZXMgbWVzc2FnZSBoYXZlICcuLi4nPwogICAgICBsb2NhbCByZXN0MSA9IHN0cmluZy5zdWIocmVzdCwgMSwgYnJrKQogICAgICBsb2NhbCByZXN0MiA9IHN0cmluZy5zdWIocmVzdCwgYnJrLCAjcmVzdCkKICAgICAgYXNzZXJ0KGNvdW50bGluZXMocmVzdDEpID09IDEwIGFuZCBjb3VudGxpbmVzKHJlc3QyKSA9PSAxMSkKICAgIGVsc2UKICAgICAgYXNzZXJ0KGNsID09IHRvdGFsIC0gc3RhcnQgKyAyKQogICAgZW5kCiAgZW5kCgogIGZvciBkID0gMSwgNTEsIDEwIGRvCiAgICBmb3IgbCA9IDEsIGQgZG8KICAgICAgLS0gdXNlIGNvcm91dGluZXMgdG8gZW5zdXJlIGNvbXBsZXRlIGNvbnRyb2wgb2YgdGhlIHN0YWNrCiAgICAgIGNvcm91dGluZS53cmFwKGNoZWNrZGVlcCkoZCwgbCkKICAgIGVuZAogIGVuZAoKZW5kCgoKcHJpbnQoInRlc3RpbmcgZGVidWcgZnVuY3Rpb25zIG9uIGNodW5rIHdpdGhvdXQgZGVidWcgaW5mbyIpCnByb2cgPSBbWy0tIHByb2dyYW0gdG8gYmUgbG9hZGVkIHdpdGhvdXQgZGVidWcgaW5mb3JtYXRpb24KbG9jYWwgZGVidWcgPSByZXF1aXJlJ2RlYnVnJwpsb2NhbCBhID0gMTIgIC0tIGEgbG9jYWwgdmFyaWFibGUKCmxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgxLCAxKQphc3NlcnQobiA9PSAiKCp0ZW1wb3JhcnkpIiBhbmQgdiA9PSBkZWJ1ZykgICAtLSB1bmtvd24gbmFtZSBidXQga25vd24gdmFsdWUKbiwgdiA9IGRlYnVnLmdldGxvY2FsKDEsIDIpCmFzc2VydChuID09ICIoKnRlbXBvcmFyeSkiIGFuZCB2ID09IDEyKSAgIC0tIHVua293biBuYW1lIGJ1dCBrbm93biB2YWx1ZQoKLS0gYSBmdW5jdGlvbiB3aXRoIGFuIHVwdmFsdWUKbG9jYWwgZiA9IGZ1bmN0aW9uICgpIGxvY2FsIHg7IHJldHVybiBhIGVuZApuLCB2ID0gZGVidWcuZ2V0dXB2YWx1ZShmLCAxKQphc3NlcnQobiA9PSAiKCpubyBuYW1lKSIgYW5kIHYgPT0gMTIpCmFzc2VydChkZWJ1Zy5zZXR1cHZhbHVlKGYsIDEsIDEzKSA9PSAiKCpubyBuYW1lKSIpCmFzc2VydChhID09IDEzKQoKbG9jYWwgdCA9IGRlYnVnLmdldGluZm8oZikKYXNzZXJ0KHQubmFtZSA9PSBuaWwgYW5kIHQubGluZWRlZmluZWQgPiAwIGFuZAogICAgICAgdC5sYXN0bGluZWRlZmluZWQgPT0gdC5saW5lZGVmaW5lZCBhbmQKICAgICAgIHQuc2hvcnRfc3JjID09ICI/IikKYXNzZXJ0KGRlYnVnLmdldGluZm8oMSkuY3VycmVudGxpbmUgPT0gLTEpCgp0ID0gZGVidWcuZ2V0aW5mbyhmLCAiTCIpLmFjdGl2ZWxpbmVzCmFzc2VydChuZXh0KHQpID09IG5pbCkgICAgLS0gYWN0aXZlIGxpbmVzIGFyZSBlbXB0eQoKLS0gZHVtcC9sb2FkIGEgZnVuY3Rpb24gd2l0aG91dCBkZWJ1ZyBpbmZvCmYgPSBsb2FkKHN0cmluZy5kdW1wKGYpKQoKdCA9IGRlYnVnLmdldGluZm8oZikKYXNzZXJ0KHQubmFtZSA9PSBuaWwgYW5kIHQubGluZWRlZmluZWQgPiAwIGFuZAogICAgICAgdC5sYXN0bGluZWRlZmluZWQgPT0gdC5saW5lZGVmaW5lZCBhbmQKICAgICAgIHQuc2hvcnRfc3JjID09ICI/IikKYXNzZXJ0KGRlYnVnLmdldGluZm8oMSkuY3VycmVudGxpbmUgPT0gLTEpCgpyZXR1cm4gYQpdXQoKCi0tIGxvYWQgJ3Byb2cnIHdpdGhvdXQgZGVidWcgaW5mbwpsb2NhbCBmID0gYXNzZXJ0KGxvYWQoc3RyaW5nLmR1bXAobG9hZChwcm9nKSwgdHJ1ZSkpKQoKYXNzZXJ0KGYoKSA9PSAxMykKCmRvICAgLS0gdGVzdHMgZm9yICdzb3VyY2UnIGluIGJpbmFyeSBkdW1wcwogIGxvY2FsIHByb2cgPSBbWwogICAgcmV0dXJuIGZ1bmN0aW9uICh4KQogICAgICByZXR1cm4gZnVuY3Rpb24gKHkpIAogICAgICAgIHJldHVybiB4ICsgeQogICAgICBlbmQKICAgIGVuZAogIF1dCiAgbG9jYWwgbmFtZSA9IHN0cmluZy5yZXAoIngiLCAxMDAwKQogIGxvY2FsIHAgPSBhc3NlcnQobG9hZChwcm9nLCBuYW1lKSkKICAtLSBsb2FkICdwJyBhcyBhIGJpbmFyeSBjaHVuayB3aXRoIGRlYnVnIGluZm9ybWF0aW9uCiAgbG9jYWwgYyA9IHN0cmluZy5kdW1wKHApCiAgYXNzZXJ0KCNjID4gMTAwMCBhbmQgI2MgPCAyMDAwKSAgIC0tIG5vIHJlcGV0aXRpb24gb2YgJ3NvdXJjZScgaW4gZHVtcAogIGxvY2FsIGYgPSBhc3NlcnQobG9hZChjKSkKICBsb2NhbCBnID0gZigpCiAgbG9jYWwgaCA9IGcoMykKICBhc3NlcnQoaCg1KSA9PSA4KQogIGFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNvdXJjZSA9PSBuYW1lIGFuZCAgIC0tIGFsbCBmdW5jdGlvbnMgaGF2ZSAnc291cmNlJwogICAgICAgICBkZWJ1Zy5nZXRpbmZvKGcpLnNvdXJjZSA9PSBuYW1lIGFuZCAKICAgICAgICAgZGVidWcuZ2V0aW5mbyhoKS5zb3VyY2UgPT0gbmFtZSkKICAtLSBhZ2Fpbiwgd2l0aG91dCBkZWJ1ZyBpbmZvCiAgbG9jYWwgYyA9IHN0cmluZy5kdW1wKHAsIHRydWUpCiAgYXNzZXJ0KCNjIDwgNTAwKSAgIC0tIG5vICdzb3VyY2UnIGluIGR1bXAKICBsb2NhbCBmID0gYXNzZXJ0KGxvYWQoYykpCiAgbG9jYWwgZyA9IGYoKQogIGxvY2FsIGggPSBnKDMwKQogIGFzc2VydChoKDUwKSA9PSA4MCkKICBhc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zb3VyY2UgPT0gJz0/JyBhbmQgICAtLSBubyBmdW5jdGlvbiBoYXMgJ3NvdXJjZScKICAgICAgICAgZGVidWcuZ2V0aW5mbyhnKS5zb3VyY2UgPT0gJz0/JyBhbmQgCiAgICAgICAgIGRlYnVnLmdldGluZm8oaCkuc291cmNlID09ICc9PycpCmVuZAoKcHJpbnQiT0siCgo=