LS0gJElkOiB0ZXN0ZXMvZGIubHVhICQKLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCgotLSB0ZXN0aW5nIGRlYnVnIGxpYnJhcnkKCmxvY2FsIGRlYnVnID0gcmVxdWlyZSAiZGVidWciCgpsb2NhbCBmdW5jdGlvbiBkb3N0cmluZyhzKSByZXR1cm4gYXNzZXJ0KGxvYWQocykpKCkgZW5kCgpwcmludCJ0ZXN0aW5nIGRlYnVnIGxpYnJhcnkgYW5kIGRlYnVnIGluZm9ybWF0aW9uIgoKZG8KbG9jYWwgYT0xCmVuZAoKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRob29rKCkpCgpsb2NhbCB0ZXN0bGluZSA9IDE5ICAgICAgICAgLS0gbGluZSB3aGVyZSAndGVzdCcgaXMgZGVmaW5lZApmdW5jdGlvbiB0ZXN0IChzLCBsLCBwKSAgICAgLS0gdGhpcyBtdXN0IGJlIGxpbmUgMTkKICBjb2xsZWN0Z2FyYmFnZSgpICAgLS0gYXZvaWQgZ2MgZHVyaW5nIHRyYWNlCiAgbG9jYWwgZnVuY3Rpb24gZiAoZXZlbnQsIGxpbmUpCiAgICBhc3NlcnQoZXZlbnQgPT0gJ2xpbmUnKQogICAgbG9jYWwgbCA9IHRhYmxlLnJlbW92ZShsLCAxKQogICAgaWYgcCB0aGVuIHByaW50KGwsIGxpbmUpIGVuZAogICAgYXNzZXJ0KGwgPT0gbGluZSwgIndyb25nIHRyYWNlISEiKQogIGVuZAogIGRlYnVnLnNldGhvb2soZiwibCIpOyBsb2FkKHMpKCk7IGRlYnVnLnNldGhvb2soKQogIGFzc2VydCgjbCA9PSAwKQplbmQKCgpkbwogIGFzc2VydChub3QgcGNhbGwoZGVidWcuZ2V0aW5mbywgcHJpbnQsICJYIikpICAgLS0gaW52YWxpZCBvcHRpb24KICBhc3NlcnQobm90IGRlYnVnLmdldGluZm8oMTAwMCkpICAgLS0gb3V0IG9mIHJhbmdlIGxldmVsCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRpbmZvKC0xKSkgICAgIC0tIG91dCBvZiByYW5nZSBsZXZlbAogIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKHByaW50KQogIGFzc2VydChhLndoYXQgPT0gIkMiIGFuZCBhLnNob3J0X3NyYyA9PSAiW0NdIikKICBhID0gZGVidWcuZ2V0aW5mbyhwcmludCwgIkwiKQogIGFzc2VydChhLmFjdGl2ZWxpbmVzID09IG5pbCkKICBsb2NhbCBiID0gZGVidWcuZ2V0aW5mbyh0ZXN0LCAiU2ZMIikKICBhc3NlcnQoYi5uYW1lID09IG5pbCBhbmQgYi53aGF0ID09ICJMdWEiIGFuZCBiLmxpbmVkZWZpbmVkID09IHRlc3RsaW5lIGFuZAogICAgICAgICBiLmxhc3RsaW5lZGVmaW5lZCA9PSBiLmxpbmVkZWZpbmVkICsgMTAgYW5kCiAgICAgICAgIGIuZnVuYyA9PSB0ZXN0IGFuZCBub3Qgc3RyaW5nLmZpbmQoYi5zaG9ydF9zcmMsICIlWyIpKQogIGFzc2VydChiLmFjdGl2ZWxpbmVzW2IubGluZWRlZmluZWQgKyAxXSBhbmQKICAgICAgICAgYi5hY3RpdmVsaW5lc1tiLmxhc3RsaW5lZGVmaW5lZF0pCiAgYXNzZXJ0KG5vdCBiLmFjdGl2ZWxpbmVzW2IubGluZWRlZmluZWRdIGFuZAogICAgICAgICBub3QgYi5hY3RpdmVsaW5lc1tiLmxhc3RsaW5lZGVmaW5lZCArIDFdKQplbmQKCgotLSB0ZXN0IGZpbGUgYW5kIHN0cmluZyBuYW1lcyB0cnVuY2F0aW9uCmEgPSAiZnVuY3Rpb24gZiAoKSBlbmQiCmxvY2FsIGZ1bmN0aW9uIGRvc3RyaW5nIChzLCB4KSByZXR1cm4gbG9hZChzLCB4KSgpIGVuZApkb3N0cmluZyhhKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gc3RyaW5nLmZvcm1hdCgnW3N0cmluZyAiJXMiXScsIGEpKQpkb3N0cmluZyhhLi5zdHJpbmcuZm9ybWF0KCI7ICVzXG49MSIsIHN0cmluZy5yZXAoJ3AnLCA0MDApKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLmdldGluZm8oZikuc2hvcnRfc3JjLCAnXiVbc3RyaW5nIFteXG5dKiUuJS4lLiIlXSQnKSkKZG9zdHJpbmcoYS4uc3RyaW5nLmZvcm1hdCgiOyAlcz0xIiwgc3RyaW5nLnJlcCgncCcsIDQwMCkpKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMsICdeJVtzdHJpbmcgW15cbl0qJS4lLiUuIiVdJCcpKQpkb3N0cmluZygiXG4iLi5hKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gJ1tzdHJpbmcgIi4uLiJdJykKZG9zdHJpbmcoYSwgIiIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYyA9PSAnW3N0cmluZyAiIl0nKQpkb3N0cmluZyhhLCAiQHh1eHUiKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gInh1eHUiKQpkb3N0cmluZyhhLCAiQCIuLnN0cmluZy5yZXAoJ3AnLCAxMDAwKS4uJ3QnKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMsICJeJS4lLiUucCp0JCIpKQpkb3N0cmluZyhhLCAiPXh1eHUiKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gInh1eHUiKQpkb3N0cmluZyhhLCBzdHJpbmcuZm9ybWF0KCI9JXMiLCBzdHJpbmcucmVwKCd4JywgNTAwKSkpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYywgIl54KiQiKSkKZG9zdHJpbmcoYSwgIj0iKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gIiIpCmEgPSBuaWw7IGYgPSBuaWw7CgoKcmVwZWF0CiAgbG9jYWwgZyA9IHt4ID0gZnVuY3Rpb24gKCkKICAgIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKDIpCiAgICBhc3NlcnQoYS5uYW1lID09ICdmJyBhbmQgYS5uYW1ld2hhdCA9PSAnbG9jYWwnKQogICAgYSA9IGRlYnVnLmdldGluZm8oMSkKICAgIGFzc2VydChhLm5hbWUgPT0gJ3gnIGFuZCBhLm5hbWV3aGF0ID09ICdmaWVsZCcpCiAgICByZXR1cm4gJ3hpeGknCiAgZW5kfQogIGxvY2FsIGYgPSBmdW5jdGlvbiAoKSByZXR1cm4gMSsxIGFuZCAobm90IDEgb3IgZy54KCkpIGVuZAogIGFzc2VydChmKCkgPT0gJ3hpeGknKQogIGcgPSBkZWJ1Zy5nZXRpbmZvKGYpCiAgYXNzZXJ0KGcud2hhdCA9PSAiTHVhIiBhbmQgZy5mdW5jID09IGYgYW5kIGcubmFtZXdoYXQgPT0gIiIgYW5kIG5vdCBnLm5hbWUpCgogIGZ1bmN0aW9uIGYgKHgsIG5hbWUpICAgLS0gbG9jYWwhCiAgICBuYW1lID0gbmFtZSBvciAnZicKICAgIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKDEpCiAgICBhc3NlcnQoYS5uYW1lID09IG5hbWUgYW5kIGEubmFtZXdoYXQgPT0gJ2xvY2FsJykKICAgIHJldHVybiB4CiAgZW5kCgogIC0tIGJyZWFrcyBpbiBkaWZmZXJlbnQgY29uZGl0aW9ucwogIGlmIDM+NCB0aGVuIGJyZWFrIGVuZDsgZigpCiAgaWYgMzw0IHRoZW4gYT0xIGVsc2UgYnJlYWsgZW5kOyBmKCkKICB3aGlsZSAxIGRvIGxvY2FsIHg9MTA7IGJyZWFrIGVuZDsgZigpCiAgbG9jYWwgYiA9IDEKICBpZiAzPjQgdGhlbiByZXR1cm4gbWF0aC5zaW4oMSkgZW5kOyBmKCkKICBhID0gMzw0OyBmKCkKICBhID0gMzw0IG9yIDE7IGYoKQogIHJlcGVhdCBsb2NhbCB4PTIwOyBpZiA0PjMgdGhlbiBmKCkgZWxzZSBicmVhayBlbmQ7IGYoKSB1bnRpbCAxCiAgZyA9IHt9CiAgZihnKS54ID0gZigyKSBhbmQgZigxMCkrZig5KQogIGFzc2VydChnLnggPT0gZigxOSkpCiAgZnVuY3Rpb24gZyh4KSBpZiBub3QgeCB0aGVuIHJldHVybiAzIGVuZCByZXR1cm4gKHgoJ2EnLCAneCcpKSBlbmQKICBhc3NlcnQoZyhmKSA9PSAnYScpCnVudGlsIDEKCnRlc3QoW1tpZgptYXRoLnNpbigxKQp0aGVuCiAgYT0xCmVsc2UKICBhPTIKZW5kCl1dLCB7MiwzLDQsN30pCgp0ZXN0KFtbLS0KaWYgbmlsIHRoZW4KICBhPTEKZWxzZQogIGE9MgplbmQKXV0sIHsyLDUsNn0pCgp0ZXN0KFtbYT0xCnJlcGVhdAogIGE9YSsxCnVudGlsIGE9PTMKXV0sIHsxLDMsNCwzLDR9KQoKdGVzdChbWyBkbwogIHJldHVybgplbmQKXV0sIHsyfSkKCnRlc3QoW1tsb2NhbCBhCmE9MQp3aGlsZSBhPD0zIGRvCiAgYT1hKzEKZW5kCl1dLCB7MSwyLDMsNCwzLDQsMyw0LDMsNX0pCgp0ZXN0KFtbd2hpbGUgbWF0aC5zaW4oMSkgZG8KICBpZiBtYXRoLnNpbigxKQogIHRoZW4gYnJlYWsKICBlbmQKZW5kCmE9MV1dLCB7MSwyLDMsNn0pCgp0ZXN0KFtbZm9yIGk9MSwzIGRvCiAgYT1pCmVuZApdXSwgezEsMiwxLDIsMSwyLDEsM30pCgp0ZXN0KFtbZm9yIGksdiBpbiBwYWlyc3snYScsJ2InfSBkbwogIGE9dG9zdHJpbmcoaSkgLi4gdgplbmQKXV0sIHsxLDIsMSwyLDEsM30pCgp0ZXN0KFtbZm9yIGk9MSw0IGRvIGE9MSBlbmRdXSwgezEsMSwxLDEsMX0pCgoKZG8gICAtLSB0ZXN0aW5nIGxpbmUgaW5mby90cmFjZSB3aXRoIGxhcmdlIGdhcHMgaW4gc291cmNlCgogIGxvY2FsIGEgPSB7MSwgMiwgMywgMTAsIDEyNCwgMTI1LCAxMjYsIDEyNywgMTI4LCAxMjksIDEzMCwKICAgICAgICAgICAgIDI1NSwgMjU2LCAyNTcsIDUwMCwgMTAwMH0KICBsb2NhbCBzID0gW1sKICAgICBsb2NhbCBiID0gezEwfQogICAgIGEgPSBiWzFdIFggKyBZIGJbMV0KICAgICBiID0gNAogIF1dCiAgZm9yIF8sIGkgaW4gaXBhaXJzKGEpIGRvCiAgICBsb2NhbCBzdWJzID0ge1ggPSBzdHJpbmcucmVwKCJcbiIsIGkpfQogICAgZm9yIF8sIGogaW4gaXBhaXJzKGEpIGRvCiAgICAgIHN1YnMuWSA9IHN0cmluZy5yZXAoIlxuIiwgaikKICAgICAgbG9jYWwgcyA9IHN0cmluZy5nc3ViKHMsICJbWFldIiwgc3VicykKICAgICAgdGVzdChzLCB7MSwgMiArIGksIDIgKyBpICsgaiwgMiArIGksIDIgKyBpICsgaiwgMyArIGkgKyBqfSkKICAgIGVuZAogIGVuZAplbmQKCnByaW50JysnCgotLSBpbnZhbGlkIGxldmVscyBpbiBbZ3NdZXRsb2NhbAphc3NlcnQobm90IHBjYWxsKGRlYnVnLmdldGxvY2FsLCAyMCwgMSkpCmFzc2VydChub3QgcGNhbGwoZGVidWcuc2V0bG9jYWwsIC0xLCAxLCAxMCkpCgoKLS0gcGFyYW1ldGVyIG5hbWVzCmxvY2FsIGZ1bmN0aW9uIGZvbyAoYSxiLC4uLikgbG9jYWwgZCwgZSBlbmQKbG9jYWwgY28gPSBjb3JvdXRpbmUuY3JlYXRlKGZvbykKCmFzc2VydChkZWJ1Zy5nZXRsb2NhbChmb28sIDEpID09ICdhJykKYXNzZXJ0KGRlYnVnLmdldGxvY2FsKGZvbywgMikgPT0gJ2InKQphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKGZvbywgMykpCmFzc2VydChkZWJ1Zy5nZXRsb2NhbChjbywgZm9vLCAxKSA9PSAnYScpCmFzc2VydChkZWJ1Zy5nZXRsb2NhbChjbywgZm9vLCAyKSA9PSAnYicpCmFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoY28sIGZvbywgMykpCgphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKHByaW50LCAxKSkKCgpsb2NhbCBmdW5jdGlvbiBmb28gKCkgcmV0dXJuIChkZWJ1Zy5nZXRsb2NhbCgxLCAtMSkpIGVuZAphc3NlcnQobm90IGZvbygxMCkpCgoKLS0gdmFyYXJncwpsb2NhbCBmdW5jdGlvbiBmb28gKGEsIC4uLikKICBsb2NhbCB0ID0gdGFibGUucGFjayguLi4pCiAgZm9yIGkgPSAxLCB0Lm4gZG8KICAgIGxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgxLCAtaSkKICAgIGFzc2VydChuID09ICIodmFyYXJnKSIgYW5kIHYgPT0gdFtpXSkKICBlbmQKICBhc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKDEsIC0odC5uICsgMSkpKQogIGFzc2VydChub3QgZGVidWcuc2V0bG9jYWwoMSwgLSh0Lm4gKyAxKSwgMzApKQogIGlmIHQubiA+IDAgdGhlbgogICAgKGZ1bmN0aW9uICh4KQogICAgICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgLTEsIHgpID09ICIodmFyYXJnKSIpCiAgICAgIGFzc2VydChkZWJ1Zy5zZXRsb2NhbCgyLCAtdC5uLCB4KSA9PSAiKHZhcmFyZykiKQogICAgIGVuZCkoNDMwKQogICAgIGFzc2VydCguLi4gPT0gNDMwKQogIGVuZAplbmQKCmZvbygpCmZvbyhwcmludCkKZm9vKDIwMCwgMywgNCkKbG9jYWwgYSA9IHt9CmZvciBpID0gMSwgKF9zb2Z0IGFuZCAxMDAgb3IgMTAwMCkgZG8gYVtpXSA9IGkgZW5kCmZvbyh0YWJsZS51bnBhY2soYSkpCmEgPSBuaWwKCgoKZG8gICAtLSB0ZXN0IGhvb2sgcHJlc2VuY2UgaW4gZGVidWcgaW5mbwogIGFzc2VydChub3QgZGVidWcuZ2V0aG9vaygpKQogIGxvY2FsIGNvdW50ID0gMAogIGxvY2FsIGZ1bmN0aW9uIGYgKCkKICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEpLm5hbWV3aGF0ID09ICJob29rIikKICAgIGxvY2FsIHNuZGxpbmUgPSBzdHJpbmcubWF0Y2goZGVidWcudHJhY2ViYWNrKCksICJcbiguLSlcbiIpCiAgICBhc3NlcnQoc3RyaW5nLmZpbmQoc25kbGluZSwgImhvb2siKSkKICAgIGNvdW50ID0gY291bnQgKyAxCiAgZW5kCiAgZGVidWcuc2V0aG9vayhmLCAibCIpCiAgbG9jYWwgYSA9IDAKICBfRU5WLmEgPSBhCiAgYSA9IDEKICBkZWJ1Zy5zZXRob29rKCkKICBhc3NlcnQoY291bnQgPT0gNCkKZW5kCgoKYSA9IHt9OyBMID0gbmlsCmxvY2FsIGdsb2IgPSAxCmxvY2FsIG9sZGdsb2IgPSBnbG9iCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUsbCkKICBjb2xsZWN0Z2FyYmFnZSgpICAgLS0gZm9yY2UgR0MgZHVyaW5nIGEgaG9vawogIGxvY2FsIGYsIG0sIGMgPSBkZWJ1Zy5nZXRob29rKCkKICBhc3NlcnQobSA9PSAnY3JsJyBhbmQgYyA9PSAwKQogIGlmIGUgPT0gImxpbmUiIHRoZW4KICAgIGlmIGdsb2Igfj0gb2xkZ2xvYiB0aGVuCiAgICAgIEwgPSBsLTEgICAtLSBnZXQgdGhlIGZpcnN0IGxpbmUgd2hlcmUgImdsb2IiIGhhcyBjaGFuZ2VkCiAgICAgIG9sZGdsb2IgPSBnbG9iCiAgICBlbmQKICBlbHNlaWYgZSA9PSAiY2FsbCIgdGhlbgogICAgICBsb2NhbCBmID0gZGVidWcuZ2V0aW5mbygyLCAiZiIpLmZ1bmMKICAgICAgYVtmXSA9IDEKICBlbHNlIGFzc2VydChlID09ICJyZXR1cm4iKQogIGVuZAplbmQsICJjcmwiKQoKCmZ1bmN0aW9uIGYoYSxiKQogIGNvbGxlY3RnYXJiYWdlKCkKICBsb2NhbCBfLCB4ID0gZGVidWcuZ2V0bG9jYWwoMSwgMSkKICBsb2NhbCBfLCB5ID0gZGVidWcuZ2V0bG9jYWwoMSwgMikKICBhc3NlcnQoeCA9PSBhIGFuZCB5ID09IGIpCiAgYXNzZXJ0KGRlYnVnLnNldGxvY2FsKDIsIDMsICJwZXJhIikgPT0gIkFBIi4uIkFBIikKICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgNCwgIm1h5+MiKSA9PSAiQiIpCiAgeCA9IGRlYnVnLmdldGluZm8oMikKICBhc3NlcnQoeC5mdW5jID09IGcgYW5kIHgud2hhdCA9PSAiTHVhIiBhbmQgeC5uYW1lID09ICdnJyBhbmQKICAgICAgICAgeC5udXBzID09IDIgYW5kIHN0cmluZy5maW5kKHguc291cmNlLCAiXkAuKmRiJS5sdWEkIikpCiAgZ2xvYiA9IGdsb2IrMQogIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUgPT0gTCsxKQogIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUgPT0gTCsyKQplbmQKCmZ1bmN0aW9uIGZvbygpCiAgZ2xvYiA9IGdsb2IrMQogIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUgPT0gTCsxKQplbmQ7IGZvbygpICAtLSBzZXQgTAotLSBjaGVjayBsaW5lIGNvdW50aW5nIGluc2lkZSBzdHJpbmdzIGFuZCBlbXB0eSBsaW5lcwoKXyA9ICdhbG9cCmFsbycgLi4gW1sKCl1dCi0tW1sKXV0KYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzExKSAgLS0gY2hlY2sgY291bnQgb2YgbGluZXMKCgpmdW5jdGlvbiBnICguLi4pCiAgbG9jYWwgYXJnID0gey4uLn0KICBkbyBsb2NhbCBhLGIsYzsgYT1tYXRoLnNpbig0MCk7IGVuZAogIGxvY2FsIGZlaWphbwogIGxvY2FsIEFBQUEsQiA9ICJ4dXh1IiwgIm1hbeNvIgogIGYoQUFBQSxCKQogIGFzc2VydChBQUFBID09ICJwZXJhIiBhbmQgQiA9PSAibWHn4yIpCiAgZG8KICAgICBsb2NhbCBCID0gMTMKICAgICBsb2NhbCB4LHkgPSBkZWJ1Zy5nZXRsb2NhbCgxLDUpCiAgICAgYXNzZXJ0KHggPT0gJ0InIGFuZCB5ID09IDEzKQogIGVuZAplbmQKCmcoKQoKCmFzc2VydChhW2ZdIGFuZCBhW2ddIGFuZCBhW2Fzc2VydF0gYW5kIGFbZGVidWcuZ2V0bG9jYWxdIGFuZCBub3QgYVtwcmludF0pCgoKLS0gdGVzdHMgZm9yIG1hbmlwdWxhdGluZyBub24tcmVnaXN0ZXJlZCBsb2NhbHMgKEMgYW5kIEx1YSB0ZW1wb3JhcmllcykKCmxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgwLCAxKQphc3NlcnQodiA9PSAwIGFuZCBuID09ICIoQyB0ZW1wb3JhcnkpIikKbG9jYWwgbiwgdiA9IGRlYnVnLmdldGxvY2FsKDAsIDIpCmFzc2VydCh2ID09IDIgYW5kIG4gPT0gIihDIHRlbXBvcmFyeSkiKQphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKDAsIDMpKQphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKDAsIDApKQoKZnVuY3Rpb24gZigpCiAgYXNzZXJ0KHNlbGVjdCgyLCBkZWJ1Zy5nZXRsb2NhbCgyLDMpKSA9PSAxKQogIGFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoMiw0KSkKICBkZWJ1Zy5zZXRsb2NhbCgyLCAzLCAxMCkKICByZXR1cm4gMjAKZW5kCgpmdW5jdGlvbiBnKGEsYikgcmV0dXJuIChhKzEpICsgZigpIGVuZAoKYXNzZXJ0KGcoMCwwKSA9PSAzMCkKIAoKZGVidWcuc2V0aG9vayhuaWwpOwphc3NlcnQoZGVidWcuZ2V0aG9vaygpID09IG5pbCkKCgotLSBtaW5pbWFsIHRlc3RzIGZvciBzZXR1c2VydmFsdWUvZ2V0dXNlcnZhbHVlCmRvCiAgYXNzZXJ0KGRlYnVnLnNldHVzZXJ2YWx1ZShpby5zdGRpbiwgMTApID09IG5pbCkKICBsb2NhbCBhLCBiID0gZGVidWcuZ2V0dXNlcnZhbHVlKGlvLnN0ZGluLCAxMCkKICBhc3NlcnQoYSA9PSBuaWwgYW5kIG5vdCBiKQplbmQKCi0tIHRlc3RpbmcgaXRlcmFjdGlvbiBiZXR3ZWVuIG11bHRpcGxlIHZhbHVlcyB4IGhvb2tzCmRvCiAgbG9jYWwgZnVuY3Rpb24gZiguLi4pIHJldHVybiAzLCAuLi4gZW5kCiAgbG9jYWwgY291bnQgPSAwCiAgbG9jYWwgYSA9IHt9CiAgZm9yIGkgPSAxLCAxMDAgZG8gYVtpXSA9IGkgZW5kCiAgZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoKSBjb3VudCA9IGNvdW50ICsgMSBlbmQsICIiLCAxKQogIGxvY2FsIHQgPSB7dGFibGUudW5wYWNrKGEpfQogIGFzc2VydCgjdCA9PSAxMDApCiAgdCA9IHt0YWJsZS51bnBhY2soYSwgMSwgMyl9CiAgYXNzZXJ0KCN0ID09IDMpCiAgdCA9IHtmKHRhYmxlLnVucGFjayhhLCAxLCAzMCkpfQogIGFzc2VydCgjdCA9PSAzMSkKZW5kCgoKLS0gdGVzdGluZyBhY2Nlc3MgdG8gZnVuY3Rpb24gYXJndW1lbnRzCgpsb2NhbCBmdW5jdGlvbiBjb2xsZWN0bG9jYWxzIChsZXZlbCkKICBsb2NhbCB0YWIgPSB7fQogIGZvciBpID0gMSwgbWF0aC5odWdlIGRvCiAgICBsb2NhbCBuLCB2ID0gZGVidWcuZ2V0bG9jYWwobGV2ZWwgKyAxLCBpKQogICAgaWYgbm90IChuIGFuZCBzdHJpbmcuZmluZChuLCAiXlthLXpBLVowLTlfXSskIikpIHRoZW4KICAgICAgIGJyZWFrICAgLS0gY29uc2lkZXIgb25seSByZWFsIHZhcmlhYmxlcwogICAgZW5kCiAgICB0YWJbbl0gPSB2CiAgZW5kCiAgcmV0dXJuIHRhYgplbmQKCgpYID0gbmlsCmEgPSB7fQpmdW5jdGlvbiBhOmYgKGEsIGIsIC4uLikgbG9jYWwgYXJnID0gey4uLn07IGxvY2FsIGMgPSAxMyBlbmQKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkKICBhc3NlcnQoZSA9PSAiY2FsbCIpCiAgZG9zdHJpbmcoIlhYID0gMTIiKSAgLS0gdGVzdCBkb3N0cmluZyBpbnNpZGUgaG9va3MKICAtLSB0ZXN0aW5nIGVycm9ycyBpbnNpZGUgaG9va3MKICBhc3NlcnQobm90IHBjYWxsKGxvYWQoImE9J2pvYW8nKzEiKSkpCiAgZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSwgbCkgCiAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygyLCAibCIpLmN1cnJlbnRsaW5lID09IGwpCiAgICBsb2NhbCBmLG0sYyA9IGRlYnVnLmdldGhvb2soKQogICAgYXNzZXJ0KGUgPT0gImxpbmUiKQogICAgYXNzZXJ0KG0gPT0gJ2wnIGFuZCBjID09IDApCiAgICBkZWJ1Zy5zZXRob29rKG5pbCkgIC0tIGhvb2sgaXMgY2FsbGVkIG9ubHkgb25jZQogICAgYXNzZXJ0KG5vdCBYKSAgICAgICAtLSBjaGVjayB0aGF0CiAgICBYID0gY29sbGVjdGxvY2FscygyKQogIGVuZCwgImwiKQplbmQsICJjIikKCmE6ZigxLDIsMyw0LDUpCmFzc2VydChYLnNlbGYgPT0gYSBhbmQgWC5hID09IDEgICBhbmQgWC5iID09IDIgYW5kIFguYyA9PSBuaWwpCmFzc2VydChYWCA9PSAxMikKYXNzZXJ0KGRlYnVnLmdldGhvb2soKSA9PSBuaWwpCgoKLS0gdGVzdGluZyBhY2Nlc3MgdG8gbG9jYWwgdmFyaWFibGVzIGluIHJldHVybiBob29rIChidWcgaW4gNS4yKQpkbwogIGxvY2FsIFggPSBmYWxzZQoKICBsb2NhbCBmdW5jdGlvbiBmb28gKGEsIGIsIC4uLikKICAgIGRvIGxvY2FsIHgseSx6IGVuZAogICAgbG9jYWwgYywgZCA9IDEwLCAyMAogICAgcmV0dXJuCiAgZW5kCgogIGxvY2FsIGZ1bmN0aW9uIGF1eCAoKQogICAgaWYgZGVidWcuZ2V0aW5mbygyKS5uYW1lID09ICJmb28iIHRoZW4KICAgICAgWCA9IHRydWUgICAtLSB0byBzaWduYWwgdGhhdCBpdCBmb3VuZCAnZm9vJwogICAgICBsb2NhbCB0YWIgPSB7YSA9IDEwMCwgYiA9IDIwMCwgYyA9IDEwLCBkID0gMjB9CiAgICAgIGZvciBuLCB2IGluIHBhaXJzKGNvbGxlY3Rsb2NhbHMoMikpIGRvCiAgICAgICAgYXNzZXJ0KHRhYltuXSA9PSB2KQogICAgICAgIHRhYltuXSA9IHVuZGVmCiAgICAgIGVuZAogICAgICBhc3NlcnQobmV4dCh0YWIpID09IG5pbCkgICAgLS0gJ3RhYicgbXVzdCBiZSBlbXB0eQogICAgZW5kCiAgZW5kCgogIGRlYnVnLnNldGhvb2soYXV4LCAiciIpOyBmb28oMTAwLCAyMDApOyBkZWJ1Zy5zZXRob29rKCkKICBhc3NlcnQoWCkKCmVuZAoKCmxvY2FsIGZ1bmN0aW9uIGVxc2VxICh0MSwgdDIpCiAgYXNzZXJ0KCN0MSA9PSAjdDIpCiAgZm9yIGkgPSAxLCAjdDEgZG8KICAgIGFzc2VydCh0MVtpXSA9PSB0MltpXSkKICBlbmQKZW5kCgoKZG8gIHByaW50KCJ0ZXN0aW5nIGluc3BlY3Rpb24gb2YgcGFyYW1ldGVycy9yZXR1cm5lZCB2YWx1ZXMiKQogIGxvY2FsIG9uID0gZmFsc2UKICBsb2NhbCBpbnAsIG91dAoKICBsb2NhbCBmdW5jdGlvbiBob29rIChldmVudCkKICAgIGlmIG5vdCBvbiB0aGVuIHJldHVybiBlbmQKICAgIGxvY2FsIGFyID0gZGVidWcuZ2V0aW5mbygyLCAicnVTIikKICAgIGxvY2FsIHQgPSB7fQogICAgZm9yIGkgPSBhci5mdHJhbnNmZXIsIGFyLmZ0cmFuc2ZlciArIGFyLm50cmFuc2ZlciAtIDEgZG8KICAgICAgbG9jYWwgXywgdiA9IGRlYnVnLmdldGxvY2FsKDIsIGkpCiAgICAgIHRbI3QgKyAxXSA9IHYgCiAgICBlbmQKICAgIGlmIGV2ZW50ID09ICJyZXR1cm4iIHRoZW4KICAgICAgb3V0ID0gdAogICAgZWxzZQogICAgICBpbnAgPSB0CiAgICBlbmQKICBlbmQKCiAgZGVidWcuc2V0aG9vayhob29rLCAiY3IiKQoKICBvbiA9IHRydWU7IG1hdGguc2luKDMpOyBvbiA9IGZhbHNlCiAgZXFzZXEoaW5wLCB7M30pOyBlcXNlcShvdXQsIHttYXRoLnNpbigzKX0pCgogIG9uID0gdHJ1ZTsgc2VsZWN0KDIsIDEwLCAyMCwgMzAsIDQwKTsgb24gPSBmYWxzZQogIGVxc2VxKGlucCwgezIsIDEwLCAyMCwgMzAsIDQwfSk7IGVxc2VxKG91dCwgezIwLCAzMCwgNDB9KQoKICBsb2NhbCBmdW5jdGlvbiBmb28gKGEsIC4uLikgcmV0dXJuIC4uLiBlbmQKICBsb2NhbCBmdW5jdGlvbiBmb28xICgpIG9uID0gbm90IG9uOyByZXR1cm4gZm9vKDIwLCAxMCwgMCkgZW5kCiAgZm9vMSgpOyBvbiA9IGZhbHNlCiAgZXFzZXEoaW5wLCB7MjB9KTsgZXFzZXEob3V0LCB7MTAsIDB9KQoKICBkZWJ1Zy5zZXRob29rKCkKZW5kCgoKCi0tIHRlc3RpbmcgdXB2YWx1ZSBhY2Nlc3MKbG9jYWwgZnVuY3Rpb24gZ2V0dXB2YWx1ZXMgKGYpCiAgbG9jYWwgdCA9IHt9CiAgbG9jYWwgaSA9IDEKICB3aGlsZSB0cnVlIGRvCiAgICBsb2NhbCBuYW1lLCB2YWx1ZSA9IGRlYnVnLmdldHVwdmFsdWUoZiwgaSkKICAgIGlmIG5vdCBuYW1lIHRoZW4gYnJlYWsgZW5kCiAgICBhc3NlcnQobm90IHRbbmFtZV0pCiAgICB0W25hbWVdID0gdmFsdWUKICAgIGkgPSBpICsgMQogIGVuZAogIHJldHVybiB0CmVuZAoKbG9jYWwgYSxiLGMgPSAxLDIsMwpsb2NhbCBmdW5jdGlvbiBmb28xIChhKSBiID0gYTsgcmV0dXJuIGMgZW5kCmxvY2FsIGZ1bmN0aW9uIGZvbzIgKHgpIGEgPSB4OyByZXR1cm4gYytiIGVuZAphc3NlcnQobm90IGRlYnVnLmdldHVwdmFsdWUoZm9vMSwgMykpCmFzc2VydChub3QgZGVidWcuZ2V0dXB2YWx1ZShmb28xLCAwKSkKYXNzZXJ0KG5vdCBkZWJ1Zy5zZXR1cHZhbHVlKGZvbzEsIDMsICJ4dXh1IikpCmxvY2FsIHQgPSBnZXR1cHZhbHVlcyhmb28xKQphc3NlcnQodC5hID09IG5pbCBhbmQgdC5iID09IDIgYW5kIHQuYyA9PSAzKQp0ID0gZ2V0dXB2YWx1ZXMoZm9vMikKYXNzZXJ0KHQuYSA9PSAxIGFuZCB0LmIgPT0gMiBhbmQgdC5jID09IDMpCmFzc2VydChkZWJ1Zy5zZXR1cHZhbHVlKGZvbzEsIDEsICJ4dXh1IikgPT0gImIiKQphc3NlcnQoKHtkZWJ1Zy5nZXR1cHZhbHVlKGZvbzIsIDMpfSlbMl0gPT0gInh1eHUiKQotLSB1cHZhbHVlcyBvZiBDIGZ1bmN0aW9ucyBhcmUgYWxsd2F5cyAiY2FsbGVkIiAiIiAodGhlIGVtcHR5IHN0cmluZykKYXNzZXJ0KGRlYnVnLmdldHVwdmFsdWUoc3RyaW5nLmdtYXRjaCgieCIsICJ4IiksIDEpID09ICIiKSAgCgoKLS0gdGVzdGluZyBjb3VudCBob29rcwpsb2NhbCBhPTAKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkgYT1hKzEgZW5kLCAiIiwgMSkKYT0wOyBmb3IgaT0xLDEwMDAgZG8gZW5kOyBhc3NlcnQoMTAwMCA8IGEgYW5kIGEgPCAxMDEyKQpkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlKSBhPWErMSBlbmQsICIiLCA0KQphPTA7IGZvciBpPTEsMTAwMCBkbyBlbmQ7IGFzc2VydCgyNTAgPCBhIGFuZCBhIDwgMjU1KQpsb2NhbCBmLG0sYyA9IGRlYnVnLmdldGhvb2soKQphc3NlcnQobSA9PSAiIiBhbmQgYyA9PSA0KQpkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlKSBhPWErMSBlbmQsICIiLCA0MDAwKQphPTA7IGZvciBpPTEsMTAwMCBkbyBlbmQ7IGFzc2VydChhID09IDApCgpkbwogIGRlYnVnLnNldGhvb2socHJpbnQsICIiLCAyXjI0IC0gMSkgICAtLSBjb3VudCB1cHBlcmJvdW5kCiAgbG9jYWwgZixtLGMgPSBkZWJ1Zy5nZXRob29rKCkKICBhc3NlcnQoKHtkZWJ1Zy5nZXRob29rKCl9KVszXSA9PSAyXjI0IC0gMSkKZW5kCgpkZWJ1Zy5zZXRob29rKCkKCgotLSB0ZXN0cyBmb3IgdGFpbCBjYWxscwpsb2NhbCBmdW5jdGlvbiBmICh4KQogIGlmIHggdGhlbgogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgIlMiKS53aGF0ID09ICJMdWEiKQogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgInQiKS5pc3RhaWxjYWxsID09IHRydWUpCiAgICBsb2NhbCB0YWlsID0gZGVidWcuZ2V0aW5mbygyKQogICAgYXNzZXJ0KHRhaWwuZnVuYyA9PSBnMSBhbmQgdGFpbC5pc3RhaWxjYWxsID09IHRydWUpCiAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygzLCAiUyIpLndoYXQgPT0gIm1haW4iKQogICAgcHJpbnQiKyIKICAgIGVuZAplbmQKCmZ1bmN0aW9uIGcoeCkgcmV0dXJuIGYoeCkgZW5kCgpmdW5jdGlvbiBnMSh4KSBnKHgpIGVuZAoKbG9jYWwgZnVuY3Rpb24gaCAoeCkgbG9jYWwgZj1nMTsgcmV0dXJuIGYoeCkgZW5kCgpoKHRydWUpCgpsb2NhbCBiID0ge30KZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkgdGFibGUuaW5zZXJ0KGIsIGUpIGVuZCwgImNyIikKaChmYWxzZSkKZGVidWcuc2V0aG9vaygpCmxvY2FsIHJlcyA9IHsicmV0dXJuIiwgICAtLSBmaXJzdCByZXR1cm4gKGZyb20gc2V0aG9vaykKICAiY2FsbCIsICJ0YWlsIGNhbGwiLCAiY2FsbCIsICJ0YWlsIGNhbGwiLAogICJyZXR1cm4iLCAicmV0dXJuIiwKICAiY2FsbCIsICAgIC0tIGxhc3QgY2FsbCAodG8gc2V0aG9vaykKfQpmb3IgaSA9IDEsICNyZXMgZG8gYXNzZXJ0KHJlc1tpXSA9PSB0YWJsZS5yZW1vdmUoYiwgMSkpIGVuZAoKYiA9IDAKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkKICAgICAgICAgICAgICAgIGlmIGUgPT0gInRhaWwgY2FsbCIgdGhlbgogICAgICAgICAgICAgICAgICBiID0gYiArIDEKICAgICAgICAgICAgICAgICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMiwgInQiKS5pc3RhaWxjYWxsID09IHRydWUpCiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDIsICJ0IikuaXN0YWlsY2FsbCA9PSBmYWxzZSkKICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgIGVuZCwgImMiKQpoKGZhbHNlKQpkZWJ1Zy5zZXRob29rKCkKYXNzZXJ0KGIgPT0gMikgICAtLSB0d28gdGFpbCBjYWxscwoKbGltID0gX3NvZnQgYW5kIDMwMDAgb3IgMzAwMDAKbG9jYWwgZnVuY3Rpb24gZm9vICh4KQogIGlmIHg9PTAgdGhlbgogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMikud2hhdCA9PSAibWFpbiIpCiAgICBsb2NhbCBpbmZvID0gZGVidWcuZ2V0aW5mbygxKQogICAgYXNzZXJ0KGluZm8uaXN0YWlsY2FsbCA9PSB0cnVlIGFuZCBpbmZvLmZ1bmMgPT0gZm9vKQogIGVsc2UgcmV0dXJuIGZvbyh4LTEpCiAgZW5kCmVuZAoKZm9vKGxpbSkKCgpwcmludCIrIgoKCi0tIHRlc3RpbmcgbG9jYWwgZnVuY3Rpb24gaW5mb3JtYXRpb24KY28gPSBsb2FkW1sKICBsb2NhbCBBID0gZnVuY3Rpb24gKCkKICAgIHJldHVybiB4CiAgZW5kCiAgcmV0dXJuCl1dCgpsb2NhbCBhID0gMAotLSAnQScgc2hvdWxkIGJlIHZpc2libGUgdG8gZGVidWdnZXIgb25seSBhZnRlciBpdHMgY29tcGxldGUgZGVmaW5pdGlvbgpkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlLCBsKQogIGlmIGwgPT0gMyB0aGVuIGEgPSBhICsgMTsgYXNzZXJ0KGRlYnVnLmdldGxvY2FsKDIsIDEpID09ICIodGVtcG9yYXJ5KSIpCiAgZWxzZWlmIGwgPT0gNCB0aGVuIGEgPSBhICsgMTsgYXNzZXJ0KGRlYnVnLmdldGxvY2FsKDIsIDEpID09ICJBIikKICBlbmQKZW5kLCAibCIpCmNvKCkgIC0tIHJ1biBsb2NhbCBmdW5jdGlvbiBkZWZpbml0aW9uCmRlYnVnLnNldGhvb2soKSAgLS0gdHVybiBvZmYgaG9vawphc3NlcnQoYSA9PSAyKSAgIC0tIGVuc3VyZSBhbGwgdHdvIGxpbmVzIHdoZXJlIGhvb2tlZAoKLS0gdGVzdGluZyB0cmFjZWJhY2sKCmFzc2VydChkZWJ1Zy50cmFjZWJhY2socHJpbnQpID09IHByaW50KQphc3NlcnQoZGVidWcudHJhY2ViYWNrKHByaW50LCA0KSA9PSBwcmludCkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLnRyYWNlYmFjaygiaGkiLCA0KSwgIl5oaVxuIikpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy50cmFjZWJhY2soImhpIiksICJeaGlcbiIpKQphc3NlcnQobm90IHN0cmluZy5maW5kKGRlYnVnLnRyYWNlYmFjaygiaGkiKSwgIidkZWJ1Zy50cmFjZWJhY2snIikpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy50cmFjZWJhY2soImhpIiwgMCksICInZGVidWcudHJhY2ViYWNrJyIpKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcudHJhY2ViYWNrKCksICJec3RhY2sgdHJhY2ViYWNrOlxuIikpCgpkbyAgLS0gQy1mdW5jdGlvbiBuYW1lcyBpbiB0cmFjZWJhY2sKICBsb2NhbCBzdCwgbXNnID0gKGZ1bmN0aW9uICgpIHJldHVybiBwY2FsbCBlbmQpKCkoZGVidWcudHJhY2ViYWNrKQogIGFzc2VydChzdCA9PSB0cnVlIGFuZCBzdHJpbmcuZmluZChtc2csICJwY2FsbCIpKQplbmQKCgotLSB0ZXN0aW5nIG5wYXJhbXMsIG51cHMgZSBpc3ZhcmFyZwpsb2NhbCB0ID0gZGVidWcuZ2V0aW5mbyhwcmludCwgInUiKQphc3NlcnQodC5pc3ZhcmFyZyA9PSB0cnVlIGFuZCB0Lm5wYXJhbXMgPT0gMCBhbmQgdC5udXBzID09IDApCgp0ID0gZGVidWcuZ2V0aW5mbyhmdW5jdGlvbiAoYSxiLGMpIGVuZCwgInUiKQphc3NlcnQodC5pc3ZhcmFyZyA9PSBmYWxzZSBhbmQgdC5ucGFyYW1zID09IDMgYW5kIHQubnVwcyA9PSAwKQoKdCA9IGRlYnVnLmdldGluZm8oZnVuY3Rpb24gKGEsYiwuLi4pIHJldHVybiB0W2FdIGVuZCwgInUiKQphc3NlcnQodC5pc3ZhcmFyZyA9PSB0cnVlIGFuZCB0Lm5wYXJhbXMgPT0gMiBhbmQgdC5udXBzID09IDEpCgp0ID0gZGVidWcuZ2V0aW5mbygxKSAgIC0tIG1haW4KYXNzZXJ0KHQuaXN2YXJhcmcgPT0gdHJ1ZSBhbmQgdC5ucGFyYW1zID09IDAgYW5kIHQubnVwcyA9PSAxIGFuZAogICAgICAgZGVidWcuZ2V0dXB2YWx1ZSh0LmZ1bmMsIDEpID09ICJfRU5WIikKCgoKCi0tIHRlc3RpbmcgZGVidWdnaW5nIG9mIGNvcm91dGluZXMKCmxvY2FsIGZ1bmN0aW9uIGNoZWNrdHJhY2ViYWNrIChjbywgcCwgbGV2ZWwpCiAgbG9jYWwgdGIgPSBkZWJ1Zy50cmFjZWJhY2soY28sIG5pbCwgbGV2ZWwpCiAgbG9jYWwgaSA9IDAKICBmb3IgbCBpbiBzdHJpbmcuZ21hdGNoKHRiLCAiW15cbl0rXG4/IikgZG8KICAgIGFzc2VydChpID09IDAgb3Igc3RyaW5nLmZpbmQobCwgcFtpXSkpCiAgICBpID0gaSsxCiAgZW5kCiAgYXNzZXJ0KHBbaV0gPT0gdW5kZWYpCmVuZAoKCmxvY2FsIGZ1bmN0aW9uIGYgKG4pCiAgaWYgbiA+IDAgdGhlbiBmKG4tMSkKICBlbHNlIGNvcm91dGluZS55aWVsZCgpIGVuZAplbmQKCmxvY2FsIGNvID0gY29yb3V0aW5lLmNyZWF0ZShmKQpjb3JvdXRpbmUucmVzdW1lKGNvLCAzKQpjaGVja3RyYWNlYmFjayhjbywgeyJ5aWVsZCIsICJkYi5sdWEiLCAiZGIubHVhIiwgImRiLmx1YSIsICJkYi5sdWEifSkKY2hlY2t0cmFjZWJhY2soY28sIHsiZGIubHVhIiwgImRiLmx1YSIsICJkYi5sdWEiLCAiZGIubHVhIn0sIDEpCmNoZWNrdHJhY2ViYWNrKGNvLCB7ImRiLmx1YSIsICJkYi5sdWEiLCAiZGIubHVhIn0sIDIpCmNoZWNrdHJhY2ViYWNrKGNvLCB7ImRiLmx1YSJ9LCA0KQpjaGVja3RyYWNlYmFjayhjbywge30sIDQwKQoKCmNvID0gY29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbiAoeCkKICAgICAgIGxvY2FsIGEgPSAxCiAgICAgICBjb3JvdXRpbmUueWllbGQoZGVidWcuZ2V0aW5mbygxLCAibCIpKQogICAgICAgY29yb3V0aW5lLnlpZWxkKGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSkKICAgICAgIHJldHVybiBhCiAgICAgZW5kKQoKbG9jYWwgdHIgPSB7fQpsb2NhbCBmb28gPSBmdW5jdGlvbiAoZSwgbCkgaWYgbCB0aGVuIHRhYmxlLmluc2VydCh0ciwgbCkgZW5kIGVuZApkZWJ1Zy5zZXRob29rKGNvLCBmb28sICJsY3IiKQoKbG9jYWwgXywgbCA9IGNvcm91dGluZS5yZXN1bWUoY28sIDEwKQpsb2NhbCB4ID0gZGVidWcuZ2V0aW5mbyhjbywgMSwgImxmTFMiKQphc3NlcnQoeC5jdXJyZW50bGluZSA9PSBsLmN1cnJlbnRsaW5lIGFuZCB4LmFjdGl2ZWxpbmVzW3guY3VycmVudGxpbmVdKQphc3NlcnQodHlwZSh4LmZ1bmMpID09ICJmdW5jdGlvbiIpCmZvciBpPXgubGluZWRlZmluZWQgKyAxLCB4Lmxhc3RsaW5lZGVmaW5lZCBkbwogIGFzc2VydCh4LmFjdGl2ZWxpbmVzW2ldKQogIHguYWN0aXZlbGluZXNbaV0gPSB1bmRlZgplbmQKYXNzZXJ0KG5leHQoeC5hY3RpdmVsaW5lcykgPT0gbmlsKSAgIC0tIG5vICdleHRyYScgZWxlbWVudHMKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRpbmZvKGNvLCAyKSkKbG9jYWwgYSxiID0gZGVidWcuZ2V0bG9jYWwoY28sIDEsIDEpCmFzc2VydChhID09ICJ4IiBhbmQgYiA9PSAxMCkKYSxiID0gZGVidWcuZ2V0bG9jYWwoY28sIDEsIDIpCmFzc2VydChhID09ICJhIiBhbmQgYiA9PSAxKQpkZWJ1Zy5zZXRsb2NhbChjbywgMSwgMiwgImhpIikKYXNzZXJ0KGRlYnVnLmdldGhvb2soY28pID09IGZvbykKYXNzZXJ0KCN0ciA9PSAyIGFuZAogICAgICAgdHJbMV0gPT0gbC5jdXJyZW50bGluZS0xIGFuZCB0clsyXSA9PSBsLmN1cnJlbnRsaW5lKQoKYSxiLGMgPSBwY2FsbChjb3JvdXRpbmUucmVzdW1lLCBjbykKYXNzZXJ0KGEgYW5kIGIgYW5kIGMgPT0gbC5jdXJyZW50bGluZSsxKQpjaGVja3RyYWNlYmFjayhjbywgeyJ5aWVsZCIsICJpbiBmdW5jdGlvbiA8In0pCgphLGIgPSBjb3JvdXRpbmUucmVzdW1lKGNvKQphc3NlcnQoYSBhbmQgYiA9PSAiaGkiKQphc3NlcnQoI3RyID09IDQgYW5kIHRyWzRdID09IGwuY3VycmVudGxpbmUrMikKYXNzZXJ0KGRlYnVnLmdldGhvb2soY28pID09IGZvbykKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRob29rKCkpCmNoZWNrdHJhY2ViYWNrKGNvLCB7fSkKCgotLSBjaGVjayBnZXQvc2V0bG9jYWwgaW4gY29yb3V0aW5lcwpjbyA9IGNvcm91dGluZS5jcmVhdGUoZnVuY3Rpb24gKHgpCiAgbG9jYWwgYSwgYiA9IGNvcm91dGluZS55aWVsZCh4KQogIGFzc2VydChhID09IDEwMCBhbmQgYiA9PSBuaWwpCiAgcmV0dXJuIHgKZW5kKQphLCBiID0gY29yb3V0aW5lLnJlc3VtZShjbywgMTApCmFzc2VydChhIGFuZCBiID09IDEwKQphLCBiID0gZGVidWcuZ2V0bG9jYWwoY28sIDEsIDEpCmFzc2VydChhID09ICJ4IiBhbmQgYiA9PSAxMCkKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbChjbywgMSwgNSkpCmFzc2VydChkZWJ1Zy5zZXRsb2NhbChjbywgMSwgMSwgMzApID09ICJ4IikKYXNzZXJ0KG5vdCBkZWJ1Zy5zZXRsb2NhbChjbywgMSwgNSwgNDApKQphLCBiID0gY29yb3V0aW5lLnJlc3VtZShjbywgMTAwKQphc3NlcnQoYSBhbmQgYiA9PSAzMCkKCgotLSBjaGVjayB0cmFjZWJhY2sgb2Ygc3VzcGVuZGVkIGNvcm91dGluZXMKCmZ1bmN0aW9uIGYoaSkgY29yb3V0aW5lLnlpZWxkKGkgPT0gMCk7IGYoaSAtIDEpIGVuZAoKY28gPSBjb3JvdXRpbmUuY3JlYXRlKGZ1bmN0aW9uICh4KSBmKHgpIGVuZCkKYSwgYiA9IGNvcm91dGluZS5yZXN1bWUoY28sIDMpCnQgPSB7Iidjb3JvdXRpbmUueWllbGQnIiwgIidmJyIsICJpbiBmdW5jdGlvbiA8In0KcmVwZWF0CiAgY2hlY2t0cmFjZWJhY2soY28sIHQpCiAgYSwgYiA9IGNvcm91dGluZS5yZXN1bWUoY28pCiAgdGFibGUuaW5zZXJ0KHQsIDIsICInZiciKSAgIC0tIG9uZSBtb3JlIHJlY3Vyc2l2ZSBjYWxsIHRvICdmJwp1bnRpbCBiCmNoZWNrdHJhY2ViYWNrKGNvLCB0KQoKCi0tIHRlc3QgYWNlc3NpbmcgbGluZSBudW1iZXJzIG9mIGEgY29yb3V0aW5lIGZyb20gYSByZXN1bWUgaW5zaWRlCi0tIGEgQyBmdW5jdGlvbiAodGhpcyBpcyBhIGtub3duIGJ1ZyBpbiBMdWEgNS4wKQoKbG9jYWwgZnVuY3Rpb24gZyh4KQogICAgY29yb3V0aW5lLnlpZWxkKHgpCmVuZAoKbG9jYWwgZnVuY3Rpb24gZiAoaSkKICBkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uICgpIGVuZCwgImwiKQogIGZvciBqPTEsMTAwMCBkbwogICAgZyhpK2opCiAgZW5kCmVuZAoKbG9jYWwgY28gPSBjb3JvdXRpbmUud3JhcChmKQpjbygxMCkKcGNhbGwoY28pCnBjYWxsKGNvKQoKCmFzc2VydCh0eXBlKGRlYnVnLmdldHJlZ2lzdHJ5KCkpID09ICJ0YWJsZSIpCgoKLS0gdGVzdCB0YWdtZXRob2QgaW5mb3JtYXRpb24KbG9jYWwgYSA9IHt9CmxvY2FsIGZ1bmN0aW9uIGYgKHQpCiAgbG9jYWwgaW5mbyA9IGRlYnVnLmdldGluZm8oMSk7CiAgYXNzZXJ0KGluZm8ubmFtZXdoYXQgPT0gIm1ldGFtZXRob2QiKQogIGEub3AgPSBpbmZvLm5hbWUKICByZXR1cm4gaW5mby5uYW1lCmVuZApzZXRtZXRhdGFibGUoYSwgewogIF9faW5kZXggPSBmOyBfX2FkZCA9IGY7IF9fZGl2ID0gZjsgX19tb2QgPSBmOyBfX2NvbmNhdCA9IGY7IF9fcG93ID0gZjsKICBfX211bCA9IGY7IF9faWRpdiA9IGY7IF9fdW5tID0gZjsgX19sZW4gPSBmOyBfX3N1YiA9IGY7CiAgX19zaGwgPSBmOyBfX3NociA9IGY7IF9fYm9yID0gZjsgX19ieG9yID0gZjsKICBfX2VxID0gZjsgX19sZSA9IGY7IF9fbHQgPSBmOyBfX3VubSA9IGY7IF9fbGVuID0gZjsgX19iYW5kID0gZjsKICBfX2Jub3QgPSBmOwp9KQoKbG9jYWwgYiA9IHNldG1ldGF0YWJsZSh7fSwgZ2V0bWV0YXRhYmxlKGEpKQoKYXNzZXJ0KGFbM10gPT0gImluZGV4IiBhbmQgYV4zID09ICJwb3ciIGFuZCBhLi5hID09ICJjb25jYXQiKQphc3NlcnQoYS8zID09ICJkaXYiIGFuZCAzJWEgPT0gIm1vZCIpCmFzc2VydChhKzMgPT0gImFkZCIgYW5kIDMtYSA9PSAic3ViIiBhbmQgYSozID09ICJtdWwiIGFuZAogICAgICAgLWEgPT0gInVubSIgYW5kICNhID09ICJsZW4iIGFuZCBhJjMgPT0gImJhbmQiKQphc3NlcnQoYSArIDMwMDAwID09ICJhZGQiIGFuZCBhIC0gMy4wID09ICJzdWIiIGFuZCBhICogMy4wID09ICJtdWwiIGFuZAogICAgICAgLWEgPT0gInVubSIgYW5kICNhID09ICJsZW4iIGFuZCBhICYgMyA9PSAiYmFuZCIpCmFzc2VydChhfDMgPT0gImJvciIgYW5kIDN+YSA9PSAiYnhvciIgYW5kIGE8PDMgPT0gInNoaWZ0IiBhbmQKICAgICAgIGE+PjEgPT0gInNoaWZ0IikKYXNzZXJ0IChhPT1iIGFuZCBhLm9wID09ICJlcSIpCmFzc2VydCAoYT49YiBhbmQgYS5vcCA9PSAib3JkZXIiKQphc3NlcnQgKGE+YiBhbmQgYS5vcCA9PSAib3JkZXIiKQphc3NlcnQofmEgPT0gImJub3QiKQoKZG8gICAtLSB0ZXN0aW5nIGZvci1pdGVyYXRvciBuYW1lCiAgbG9jYWwgZnVuY3Rpb24gZigpCiAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygxKS5uYW1lID09ICJmb3IgaXRlcmF0b3IiKQogIGVuZAoKICBmb3IgaSBpbiBmIGRvIGVuZAplbmQKCgpkbyAgIC0tIHRlc3RpbmcgZGVidWcgaW5mbyBmb3IgZmluYWxpemVycwogIGxvY2FsIG5hbWUgPSBuaWwKCiAgLS0gY3JlYXRlIGEgcGllY2Ugb2YgZ2FyYmFnZSB3aXRoIGEgZmluYWxpemVyCiAgc2V0bWV0YXRhYmxlKHt9LCB7X19nYyA9IGZ1bmN0aW9uICgpCiAgICBsb2NhbCB0ID0gZGVidWcuZ2V0aW5mbygyKSAgIC0tIGdldCBjYWxsZWUgaW5mb3JtYXRpb24KICAgIGFzc2VydCh0Lm5hbWV3aGF0ID09ICJtZXRhbWV0aG9kIikKICAgIG5hbWUgPSB0Lm5hbWUKICBlbmR9KQoKICAtLSByZXBlYXQgdW50aWwgcHJldmlvdXMgZmluYWxpemVyIHJ1bnMgKHNldHRpbmcgJ25hbWUnKQogIHJlcGVhdCBsb2NhbCBhID0ge30gdW50aWwgbmFtZQogIGFzc2VydChuYW1lID09ICJfX2djIikKZW5kCgoKZG8KICBwcmludCgidGVzdGluZyB0cmFjZWJhY2sgc2l6ZXMiKQoKICBsb2NhbCBmdW5jdGlvbiBjb3VudGxpbmVzIChzKQogICAgcmV0dXJuIHNlbGVjdCgyLCBzdHJpbmcuZ3N1YihzLCAiXG4iLCAiIikpCiAgZW5kCgogIGxvY2FsIGZ1bmN0aW9uIGRlZXAgKGx2bCwgbikKICAgIGlmIGx2bCA9PSAwIHRoZW4KICAgICAgcmV0dXJuIChkZWJ1Zy50cmFjZWJhY2soIm1lc3NhZ2UiLCBuKSkKICAgIGVsc2UKICAgICAgcmV0dXJuIChkZWVwKGx2bC0xLCBuKSkKICAgIGVuZAogIGVuZAoKICBsb2NhbCBmdW5jdGlvbiBjaGVja2RlZXAgKHRvdGFsLCBzdGFydCkKICAgIGxvY2FsIHMgPSBkZWVwKHRvdGFsLCBzdGFydCkKICAgIGxvY2FsIHJlc3QgPSBzdHJpbmcubWF0Y2gocywgIl5tZXNzYWdlXG5zdGFjayB0cmFjZWJhY2s6XG4oLiopJCIpCiAgICBsb2NhbCBjbCA9IGNvdW50bGluZXMocmVzdCkKICAgIC0tIGF0IG1vc3QgMTAgbGluZXMgaW4gZmlyc3QgcGFydCwgMTEgaW4gc2Vjb25kLCBwbHVzICcuLi4nCiAgICBhc3NlcnQoY2wgPD0gMTAgKyAxMSArIDEpCiAgICBsb2NhbCBicmsgPSBzdHJpbmcuZmluZChyZXN0LCAiJS4lLiUuIikKICAgIGlmIGJyayB0aGVuICAgLS0gZG9lcyBtZXNzYWdlIGhhdmUgJy4uLic/CiAgICAgIGxvY2FsIHJlc3QxID0gc3RyaW5nLnN1YihyZXN0LCAxLCBicmspCiAgICAgIGxvY2FsIHJlc3QyID0gc3RyaW5nLnN1YihyZXN0LCBicmssICNyZXN0KQogICAgICBhc3NlcnQoY291bnRsaW5lcyhyZXN0MSkgPT0gMTAgYW5kIGNvdW50bGluZXMocmVzdDIpID09IDExKQogICAgZWxzZQogICAgICBhc3NlcnQoY2wgPT0gdG90YWwgLSBzdGFydCArIDIpCiAgICBlbmQKICBlbmQKCiAgZm9yIGQgPSAxLCA1MSwgMTAgZG8KICAgIGZvciBsID0gMSwgZCBkbwogICAgICAtLSB1c2UgY29yb3V0aW5lcyB0byBlbnN1cmUgY29tcGxldGUgY29udHJvbCBvZiB0aGUgc3RhY2sKICAgICAgY29yb3V0aW5lLndyYXAoY2hlY2tkZWVwKShkLCBsKQogICAgZW5kCiAgZW5kCgplbmQKCgpwcmludCgidGVzdGluZyBkZWJ1ZyBmdW5jdGlvbnMgb24gY2h1bmsgd2l0aG91dCBkZWJ1ZyBpbmZvIikKcHJvZyA9IFtbLS0gcHJvZ3JhbSB0byBiZSBsb2FkZWQgd2l0aG91dCBkZWJ1ZyBpbmZvcm1hdGlvbgpsb2NhbCBkZWJ1ZyA9IHJlcXVpcmUnZGVidWcnCmxvY2FsIGEgPSAxMiAgLS0gYSBsb2NhbCB2YXJpYWJsZQoKbG9jYWwgbiwgdiA9IGRlYnVnLmdldGxvY2FsKDEsIDEpCmFzc2VydChuID09ICIodGVtcG9yYXJ5KSIgYW5kIHYgPT0gZGVidWcpICAgLS0gdW5rb3duIG5hbWUgYnV0IGtub3duIHZhbHVlCm4sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgxLCAyKQphc3NlcnQobiA9PSAiKHRlbXBvcmFyeSkiIGFuZCB2ID09IDEyKSAgIC0tIHVua293biBuYW1lIGJ1dCBrbm93biB2YWx1ZQoKLS0gYSBmdW5jdGlvbiB3aXRoIGFuIHVwdmFsdWUKbG9jYWwgZiA9IGZ1bmN0aW9uICgpIGxvY2FsIHg7IHJldHVybiBhIGVuZApuLCB2ID0gZGVidWcuZ2V0dXB2YWx1ZShmLCAxKQphc3NlcnQobiA9PSAiKG5vIG5hbWUpIiBhbmQgdiA9PSAxMikKYXNzZXJ0KGRlYnVnLnNldHVwdmFsdWUoZiwgMSwgMTMpID09ICIobm8gbmFtZSkiKQphc3NlcnQoYSA9PSAxMykKCmxvY2FsIHQgPSBkZWJ1Zy5nZXRpbmZvKGYpCmFzc2VydCh0Lm5hbWUgPT0gbmlsIGFuZCB0LmxpbmVkZWZpbmVkID4gMCBhbmQKICAgICAgIHQubGFzdGxpbmVkZWZpbmVkID09IHQubGluZWRlZmluZWQgYW5kCiAgICAgICB0LnNob3J0X3NyYyA9PSAiPyIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKDEpLmN1cnJlbnRsaW5lID09IC0xKQoKdCA9IGRlYnVnLmdldGluZm8oZiwgIkwiKS5hY3RpdmVsaW5lcwphc3NlcnQobmV4dCh0KSA9PSBuaWwpICAgIC0tIGFjdGl2ZSBsaW5lcyBhcmUgZW1wdHkKCi0tIGR1bXAvbG9hZCBhIGZ1bmN0aW9uIHdpdGhvdXQgZGVidWcgaW5mbwpmID0gbG9hZChzdHJpbmcuZHVtcChmKSkKCnQgPSBkZWJ1Zy5nZXRpbmZvKGYpCmFzc2VydCh0Lm5hbWUgPT0gbmlsIGFuZCB0LmxpbmVkZWZpbmVkID4gMCBhbmQKICAgICAgIHQubGFzdGxpbmVkZWZpbmVkID09IHQubGluZWRlZmluZWQgYW5kCiAgICAgICB0LnNob3J0X3NyYyA9PSAiPyIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKDEpLmN1cnJlbnRsaW5lID09IC0xKQoKcmV0dXJuIGEKXV0KCgotLSBsb2FkICdwcm9nJyB3aXRob3V0IGRlYnVnIGluZm8KbG9jYWwgZiA9IGFzc2VydChsb2FkKHN0cmluZy5kdW1wKGxvYWQocHJvZyksIHRydWUpKSkKCmFzc2VydChmKCkgPT0gMTMpCgpkbyAgIC0tIHRlc3RzIGZvciAnc291cmNlJyBpbiBiaW5hcnkgZHVtcHMKICBsb2NhbCBwcm9nID0gW1sKICAgIHJldHVybiBmdW5jdGlvbiAoeCkKICAgICAgcmV0dXJuIGZ1bmN0aW9uICh5KSAKICAgICAgICByZXR1cm4geCArIHkKICAgICAgZW5kCiAgICBlbmQKICBdXQogIGxvY2FsIG5hbWUgPSBzdHJpbmcucmVwKCJ4IiwgMTAwMCkKICBsb2NhbCBwID0gYXNzZXJ0KGxvYWQocHJvZywgbmFtZSkpCiAgLS0gbG9hZCAncCcgYXMgYSBiaW5hcnkgY2h1bmsgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbgogIGxvY2FsIGMgPSBzdHJpbmcuZHVtcChwKQogIGFzc2VydCgjYyA+IDEwMDAgYW5kICNjIDwgMjAwMCkgICAtLSBubyByZXBldGl0aW9uIG9mICdzb3VyY2UnIGluIGR1bXAKICBsb2NhbCBmID0gYXNzZXJ0KGxvYWQoYykpCiAgbG9jYWwgZyA9IGYoKQogIGxvY2FsIGggPSBnKDMpCiAgYXNzZXJ0KGgoNSkgPT0gOCkKICBhc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zb3VyY2UgPT0gbmFtZSBhbmQgICAtLSBhbGwgZnVuY3Rpb25zIGhhdmUgJ3NvdXJjZScKICAgICAgICAgZGVidWcuZ2V0aW5mbyhnKS5zb3VyY2UgPT0gbmFtZSBhbmQgCiAgICAgICAgIGRlYnVnLmdldGluZm8oaCkuc291cmNlID09IG5hbWUpCiAgLS0gYWdhaW4sIHdpdGhvdXQgZGVidWcgaW5mbwogIGxvY2FsIGMgPSBzdHJpbmcuZHVtcChwLCB0cnVlKQogIGFzc2VydCgjYyA8IDUwMCkgICAtLSBubyAnc291cmNlJyBpbiBkdW1wCiAgbG9jYWwgZiA9IGFzc2VydChsb2FkKGMpKQogIGxvY2FsIGcgPSBmKCkKICBsb2NhbCBoID0gZygzMCkKICBhc3NlcnQoaCg1MCkgPT0gODApCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oZikuc291cmNlID09ICc9PycgYW5kICAgLS0gbm8gZnVuY3Rpb24gaGFzICdzb3VyY2UnCiAgICAgICAgIGRlYnVnLmdldGluZm8oZykuc291cmNlID09ICc9PycgYW5kIAogICAgICAgICBkZWJ1Zy5nZXRpbmZvKGgpLnNvdXJjZSA9PSAnPT8nKQplbmQKCnByaW50Ik9LIgoK