LS0gJElkOiB0ZXN0ZXMvcG0ubHVhICQKLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCgpwcmludCgndGVzdGluZyBwYXR0ZXJuIG1hdGNoaW5nJykKCmxvY2FsIGZ1bmN0aW9uIGNoZWNrZXJyb3IgKG1zZywgZiwgLi4uKQogIGxvY2FsIHMsIGVyciA9IHBjYWxsKGYsIC4uLikKICBhc3NlcnQobm90IHMgYW5kIHN0cmluZy5maW5kKGVyciwgbXNnKSkKZW5kCgoKbG9jYWwgZnVuY3Rpb24gZiAocywgcCkKICBsb2NhbCBpLGUgPSBzdHJpbmcuZmluZChzLCBwKQogIGlmIGkgdGhlbiByZXR1cm4gc3RyaW5nLnN1YihzLCBpLCBlKSBlbmQKZW5kCgpsb2NhbCBhLGIgPSBzdHJpbmcuZmluZCgnJywgJycpICAgIC0tIGVtcHR5IHBhdHRlcm5zIGFyZSB0cmlja3kKYXNzZXJ0KGEgPT0gMSBhbmQgYiA9PSAwKTsKYSxiID0gc3RyaW5nLmZpbmQoJ2FsbycsICcnKQphc3NlcnQoYSA9PSAxIGFuZCBiID09IDApCmEsYiA9IHN0cmluZy5maW5kKCdhXDBvIGFcMG8gYVwwbycsICdhJywgMSkgICAtLSBmaXJzdCBwb3NpdGlvbgphc3NlcnQoYSA9PSAxIGFuZCBiID09IDEpCmEsYiA9IHN0cmluZy5maW5kKCdhXDBvIGFcMG8gYVwwbycsICdhXDBvJywgMikgICAtLSBzdGFydHMgaW4gdGhlIG1pZGxlCmFzc2VydChhID09IDUgYW5kIGIgPT0gNykKYSxiID0gc3RyaW5nLmZpbmQoJ2FcMG8gYVwwbyBhXDBvJywgJ2FcMG8nLCA5KSAgIC0tIHN0YXJ0cyBpbiB0aGUgbWlkbGUKYXNzZXJ0KGEgPT0gOSBhbmQgYiA9PSAxMSkKYSxiID0gc3RyaW5nLmZpbmQoJ2FcMGFcMGFcMGFcMFwwYWInLCAnXDBhYicsIDIpOyAgLS0gZmluZHMgYXQgdGhlIGVuZAphc3NlcnQoYSA9PSA5IGFuZCBiID09IDExKTsKYSxiID0gc3RyaW5nLmZpbmQoJ2FcMGFcMGFcMGFcMFwwYWInLCAnYicpICAgIC0tIGxhc3QgcG9zaXRpb24KYXNzZXJ0KGEgPT0gMTEgYW5kIGIgPT0gMTEpCmFzc2VydChub3Qgc3RyaW5nLmZpbmQoJ2FcMGFcMGFcMGFcMFwwYWInLCAnYlwwJykpICAgLS0gY2hlY2sgZW5kaW5nCmFzc2VydChub3Qgc3RyaW5nLmZpbmQoJycsICdcMCcpKQphc3NlcnQoc3RyaW5nLmZpbmQoJ2FsbzEyM2FsbycsICcxMicpID09IDQpCmFzc2VydChub3Qgc3RyaW5nLmZpbmQoJ2FsbzEyM2FsbycsICdeMTInKSkKCmFzc2VydChzdHJpbmcubWF0Y2goImFhYWIiLCAiLipiIikgPT0gImFhYWIiKQphc3NlcnQoc3RyaW5nLm1hdGNoKCJhYWEiLCAiLiphIikgPT0gImFhYSIpCmFzc2VydChzdHJpbmcubWF0Y2goImIiLCAiLipiIikgPT0gImIiKQoKYXNzZXJ0KHN0cmluZy5tYXRjaCgiYWFhYiIsICIuK2IiKSA9PSAiYWFhYiIpCmFzc2VydChzdHJpbmcubWF0Y2goImFhYSIsICIuK2EiKSA9PSAiYWFhIikKYXNzZXJ0KG5vdCBzdHJpbmcubWF0Y2goImIiLCAiLitiIikpCgphc3NlcnQoc3RyaW5nLm1hdGNoKCJhYWFiIiwgIi4/YiIpID09ICJhYiIpCmFzc2VydChzdHJpbmcubWF0Y2goImFhYSIsICIuP2EiKSA9PSAiYWEiKQphc3NlcnQoc3RyaW5nLm1hdGNoKCJiIiwgIi4/YiIpID09ICJiIikKCmFzc2VydChmKCdhbG9BTE8nLCAnJWwqJykgPT0gJ2FsbycpCmFzc2VydChmKCdhTG9fQUxPJywgJyVhKicpID09ICdhTG8nKQoKYXNzZXJ0KGYoIiAgXG5cciomXG5cciAgIHh1eHUgIFxuXG4iLCAiJWclZyVnKyIpID09ICJ4dXh1IikKCmFzc2VydChmKCdhYWFiJywgJ2EqJykgPT0gJ2FhYScpOwphc3NlcnQoZignYWFhJywgJ14uKiQnKSA9PSAnYWFhJyk7CmFzc2VydChmKCdhYWEnLCAnYionKSA9PSAnJyk7CmFzc2VydChmKCdhYWEnLCAnYWIqYScpID09ICdhYScpCmFzc2VydChmKCdhYmEnLCAnYWIqYScpID09ICdhYmEnKQphc3NlcnQoZignYWFhYicsICdhKycpID09ICdhYWEnKQphc3NlcnQoZignYWFhJywgJ14uKyQnKSA9PSAnYWFhJykKYXNzZXJ0KG5vdCBmKCdhYWEnLCAnYisnKSkKYXNzZXJ0KG5vdCBmKCdhYWEnLCAnYWIrYScpKQphc3NlcnQoZignYWJhJywgJ2FiK2EnKSA9PSAnYWJhJykKYXNzZXJ0KGYoJ2EkYScsICcuJCcpID09ICdhJykKYXNzZXJ0KGYoJ2EkYScsICcuJSQnKSA9PSAnYSQnKQphc3NlcnQoZignYSRhJywgJy4kLicpID09ICdhJGEnKQphc3NlcnQobm90IGYoJ2EkYScsICckJCcpKQphc3NlcnQobm90IGYoJ2EkYicsICdhJCcpKQphc3NlcnQoZignYSRhJywgJyQnKSA9PSAnJykKYXNzZXJ0KGYoJycsICdiKicpID09ICcnKQphc3NlcnQobm90IGYoJ2FhYScsICdiYionKSkKYXNzZXJ0KGYoJ2FhYWInLCAnYS0nKSA9PSAnJykKYXNzZXJ0KGYoJ2FhYScsICdeLi0kJykgPT0gJ2FhYScpCmFzc2VydChmKCdhYWJhYWFiYWFhYmFhYWJhJywgJ2IuKmInKSA9PSAnYmFhYWJhYWFiYWFhYicpCmFzc2VydChmKCdhYWJhYWFiYWFhYmFhYWJhJywgJ2IuLWInKSA9PSAnYmFhYWInKQphc3NlcnQoZignYWxvIHhvJywgJy5vJCcpID09ICd4bycpCmFzc2VydChmKCcgXG4gaXN0byDpIGFzc2ltJywgJyVTJVMqJykgPT0gJ2lzdG8nKQphc3NlcnQoZignIFxuIGlzdG8g6SBhc3NpbScsICclUyokJykgPT0gJ2Fzc2ltJykKYXNzZXJ0KGYoJyBcbiBpc3RvIOkgYXNzaW0nLCAnW2Etel0qJCcpID09ICdhc3NpbScpCmFzc2VydChmKCd1bSBjYXJhY3RlciA/IGV4dHJhJywgJ1teJXNhLXpdJykgPT0gJz8nKQphc3NlcnQoZignJywgJ2E/JykgPT0gJycpCmFzc2VydChmKCfhJywgJ+E/JykgPT0gJ+EnKQphc3NlcnQoZign4WJsJywgJ+E/Yj9sPycpID09ICfhYmwnKQphc3NlcnQoZignICDhYmwnLCAn4T9iP2w/JykgPT0gJycpCmFzc2VydChmKCdhYScsICdeYWE/YT9hJykgPT0gJ2FhJykKYXNzZXJ0KGYoJ11dXeFiJywgJ1teXV0nKSA9PSAn4ScpCmFzc2VydChmKCIwYWxvIGFsbyIsICIleCoiKSA9PSAiMGEiKQphc3NlcnQoZigiYWxvIGFsbyIsICIlQysiKSA9PSAiYWxvIGFsbyIpCnByaW50KCcrJykKCgpsb2NhbCBmdW5jdGlvbiBmMSAocywgcCkKICBwID0gc3RyaW5nLmdzdWIocCwgIiUlKFswLTldKSIsIGZ1bmN0aW9uIChzKQogICAgICAgIHJldHVybiAiJSIgLi4gKHRvbnVtYmVyKHMpKzEpCiAgICAgICBlbmQpCiAgcCA9IHN0cmluZy5nc3ViKHAsICJeKF4/KSIsICIlMSgpIiwgMSkKICBwID0gc3RyaW5nLmdzdWIocCwgIigkPykkIiwgIigpJTEiLCAxKQogIGxvY2FsIHQgPSB7c3RyaW5nLm1hdGNoKHMsIHApfQogIHJldHVybiBzdHJpbmcuc3ViKHMsIHRbMV0sIHRbI3RdIC0gMSkKZW5kCgphc3NlcnQoZjEoJ2FsbyBhbHggMTIzIGJcMG8gYlwwbycsICcoLi4qKSAlMScpID09ICJiXDBvIGJcMG8iKQphc3NlcnQoZjEoJ2F4ejEyMz0gND0gNCAzNCcsICcoLispPSguKik9JTIgJTEnKSA9PSAnMz0gND0gNCAzJykKYXNzZXJ0KGYxKCc9PT09PT09JywgJ14oPSopPSUxJCcpID09ICc9PT09PT09JykKYXNzZXJ0KG5vdCBzdHJpbmcubWF0Y2goJz09PT09PT09PT0nLCAnXihbPV0qKT0lMSQnKSkKCmxvY2FsIGZ1bmN0aW9uIHJhbmdlIChpLCBqKQogIGlmIGkgPD0gaiB0aGVuCiAgICByZXR1cm4gaSwgcmFuZ2UoaSsxLCBqKQogIGVuZAplbmQKCmxvY2FsIGFiYyA9IHN0cmluZy5jaGFyKHJhbmdlKDAsIDEyNykpIC4uIHN0cmluZy5jaGFyKHJhbmdlKDEyOCwgMjU1KSk7Cgphc3NlcnQoc3RyaW5nLmxlbihhYmMpID09IDI1NikKCmxvY2FsIGZ1bmN0aW9uIHN0cnNldCAocCkKICBsb2NhbCByZXMgPSB7cz0nJ30KICBzdHJpbmcuZ3N1YihhYmMsIHAsIGZ1bmN0aW9uIChjKSByZXMucyA9IHJlcy5zIC4uIGMgZW5kKQogIHJldHVybiByZXMucwplbmQ7Cgphc3NlcnQoc3RyaW5nLmxlbihzdHJzZXQoJ1tcMjAwLVwyMTBdJykpID09IDExKQoKYXNzZXJ0KHN0cnNldCgnW2Etel0nKSA9PSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKQphc3NlcnQoc3Ryc2V0KCdbYS16JWRdJykgPT0gc3Ryc2V0KCdbJWRhLXV1LXpdJykpCmFzc2VydChzdHJzZXQoJ1thLV0nKSA9PSAiLWEiKQphc3NlcnQoc3Ryc2V0KCdbXiVXXScpID09IHN0cnNldCgnWyV3XScpKQphc3NlcnQoc3Ryc2V0KCdbXSUlXScpID09ICclXScpCmFzc2VydChzdHJzZXQoJ1thJS16XScpID09ICctYXonKQphc3NlcnQoc3Ryc2V0KCdbJV4lWyUtYSVdJS1iXScpID09ICctW11eYWInKQphc3NlcnQoc3Ryc2V0KCclWicpID09IHN0cnNldCgnW1wxLVwyNTVdJykpCmFzc2VydChzdHJzZXQoJy4nKSA9PSBzdHJzZXQoJ1tcMS1cMjU1JXpdJykpCnByaW50KCcrJyk7Cgphc3NlcnQoc3RyaW5nLm1hdGNoKCJhbG8geHl6SyIsICIoJXcrKUsiKSA9PSAieHl6IikKYXNzZXJ0KHN0cmluZy5tYXRjaCgiMjU0IEsiLCAiKCVkKilLIikgPT0gIiIpCmFzc2VydChzdHJpbmcubWF0Y2goImFsbyAiLCAiKCV3KikkIikgPT0gIiIpCmFzc2VydChub3Qgc3RyaW5nLm1hdGNoKCJhbG8gIiwgIigldyspJCIpKQphc3NlcnQoc3RyaW5nLmZpbmQoIijhbG8pIiwgIiUo4SIpID09IDEpCmxvY2FsIGEsIGIsIGMsIGQsIGUgPSBzdHJpbmcubWF0Y2goIuJsbyBhbG8iLCAiXigoKC4pLikuKiAoJXcqKSkkIikKYXNzZXJ0KGEgPT0gJ+JsbyBhbG8nIGFuZCBiID09ICfibCcgYW5kIGMgPT0gJ+InIGFuZCBkID09ICdhbG8nIGFuZCBlID09IG5pbCkKYSwgYiwgYywgZCAgPSBzdHJpbmcubWF0Y2goJzAxMjM0NTY3ODknLCAnKC4rKC4/KSgpKScpCmFzc2VydChhID09ICcwMTIzNDU2Nzg5JyBhbmQgYiA9PSAnJyBhbmQgYyA9PSAxMSBhbmQgZCA9PSBuaWwpCnByaW50KCcrJykKCmFzc2VydChzdHJpbmcuZ3N1Yign/GxvIPxsbycsICf8JywgJ3gnKSA9PSAneGxvIHhsbycpCmFzc2VydChzdHJpbmcuZ3N1YignYWxvIPpsbyAgJywgJyArJCcsICcnKSA9PSAnYWxvIPpsbycpICAtLSB0cmltCmFzc2VydChzdHJpbmcuZ3N1YignICBhbG8gYWxvICAnLCAnXiVzKiguLSklcyokJywgJyUxJykgPT0gJ2FsbyBhbG8nKSAgLS0gZG91YmxlIHRyaW0KYXNzZXJ0KHN0cmluZy5nc3ViKCdhbG8gIGFsbyAgXG4gMTIzXG4gJywgJyVzKycsICcgJykgPT0gJ2FsbyBhbG8gMTIzICcpCmxvY2FsIHQgPSAiYWLnIGQiCmEsIGIgPSBzdHJpbmcuZ3N1Yih0LCAnKC4pJywgJyUxQCcpCmFzc2VydCgnQCcuLmEgPT0gc3RyaW5nLmdzdWIodCwgJycsICdAJykgYW5kIGIgPT0gNSkKYSwgYiA9IHN0cmluZy5nc3ViKCdhYudkJywgJyguKScsICclMEAnLCAyKQphc3NlcnQoYSA9PSAnYUBiQOdkJyBhbmQgYiA9PSAyKQphc3NlcnQoc3RyaW5nLmdzdWIoJ2FsbyBhbG8nLCAnKClbYWxdJywgJyUxJykgPT0gJzEybyA1Nm8nKQphc3NlcnQoc3RyaW5nLmdzdWIoImFiYz14eXoiLCAiKCV3KikoJXApKCV3KykiLCAiJTMlMiUxLSUwIikgPT0KICAgICAgICAgICAgICAieHl6PWFiYy1hYmM9eHl6IikKYXNzZXJ0KHN0cmluZy5nc3ViKCJhYmMiLCAiJXciLCAiJTElMCIpID09ICJhYWJiY2MiKQphc3NlcnQoc3RyaW5nLmdzdWIoImFiYyIsICIldysiLCAiJTAlMSIpID09ICJhYmNhYmMiKQphc3NlcnQoc3RyaW5nLmdzdWIoJ+Hp7ScsICckJywgJ1ww8/onKSA9PSAn4entXDDz+icpCmFzc2VydChzdHJpbmcuZ3N1YignJywgJ14nLCAncicpID09ICdyJykKYXNzZXJ0KHN0cmluZy5nc3ViKCcnLCAnJCcsICdyJykgPT0gJ3InKQpwcmludCgnKycpCgoKZG8gICAtLSBuZXcgKDUuMy4zKSBzZW1hbnRpY3MgZm9yIGVtcHR5IG1hdGNoZXMKICBhc3NlcnQoc3RyaW5nLmdzdWIoImEgYiBjZCIsICIgKiIsICItIikgPT0gIi1hLWItYy1kLSIpCgogIGxvY2FsIHJlcyA9ICIiCiAgbG9jYWwgc3ViID0gImEgIFxuYmNcdFx0ZCIKICBsb2NhbCBpID0gMQogIGZvciBwLCBlIGluIHN0cmluZy5nbWF0Y2goc3ViLCAiKCklcyooKSIpIGRvCiAgICByZXMgPSByZXMgLi4gc3RyaW5nLnN1YihzdWIsIGksIHAgLSAxKSAuLiAiLSIKICAgIGkgPSBlCiAgZW5kCiAgYXNzZXJ0KHJlcyA9PSAiLWEtYi1jLWQtIikKZW5kCgoKYXNzZXJ0KHN0cmluZy5nc3ViKCJ1bSAoZG9pcykgdHJlcyAocXVhdHJvKSIsICIoJSgldyslKSkiLCBzdHJpbmcudXBwZXIpID09CiAgICAgICAgICAgICJ1bSAoRE9JUykgdHJlcyAoUVVBVFJPKSIpCgpkbwogIGxvY2FsIGZ1bmN0aW9uIHNldGdsb2JhbCAobix2KSByYXdzZXQoX0csIG4sIHYpIGVuZAogIHN0cmluZy5nc3ViKCJhPXJvYmVydG8scm9iZXJ0bz1hIiwgIigldyspPSgldyV3KikiLCBzZXRnbG9iYWwpCiAgYXNzZXJ0KF9HLmE9PSJyb2JlcnRvIiBhbmQgX0cucm9iZXJ0bz09ImEiKQogIF9HLmEgPSBuaWw7IF9HLnJvYmVydG8gPSBuaWwKZW5kCgpmdW5jdGlvbiBmKGEsYikgcmV0dXJuIHN0cmluZy5nc3ViKGEsJy4nLGIpIGVuZAphc3NlcnQoc3RyaW5nLmdzdWIoInRyb2NhciB0dWRvIGVtIHx0ZXN0ZXxifCDpIHxiZWxlemF8YWx8IiwgInwoW158XSopfChbXnxdKil8IiwgZikgPT0KICAgICAgICAgICAgInRyb2NhciB0dWRvIGVtIGJiYmJiIOkgYWxhbGFsYWxhbGFsIikKCmxvY2FsIGZ1bmN0aW9uIGRvc3RyaW5nIChzKSByZXR1cm4gbG9hZChzLCAiIikoKSBvciAiIiBlbmQKYXNzZXJ0KHN0cmluZy5nc3ViKCJhbG8gJGE9J3gnJCBub3ZhbWVudGUgJHJldHVybiBhJCIsCiAgICAgICAgICAgICAgICAgICAiJChbXiRdKiklJCIsCiAgICAgICAgICAgICAgICAgICBkb3N0cmluZykgPT0gImFsbyAgbm92YW1lbnRlIHgiKQoKbG9jYWwgeCA9IHN0cmluZy5nc3ViKCIkeD1zdHJpbmcuZ3N1YignYWxvJywgJy4nLCBzdHJpbmcudXBwZXIpJCBhc3NpbSB2YWkgcGFyYSAkcmV0dXJuIHgkIiwKICAgICAgICAgIiQoW14kXSopJSQiLCBkb3N0cmluZykKYXNzZXJ0KHggPT0gJyBhc3NpbSB2YWkgcGFyYSBBTE8nKQpfRy5hLCBfRy54ID0gbmlsCgpsb2NhbCB0ID0ge30KbG9jYWwgcyA9ICdhIGFsbyBqb3NlICBqb2FvJwpsb2NhbCByID0gc3RyaW5nLmdzdWIocywgJygpKCV3KykoKScsIGZ1bmN0aW9uIChhLHcsYikKICAgICAgICAgICAgIGFzc2VydChzdHJpbmcubGVuKHcpID09IGItYSk7CiAgICAgICAgICAgICB0W2FdID0gYi1hOwogICAgICAgICAgIGVuZCkKYXNzZXJ0KHMgPT0gciBhbmQgdFsxXSA9PSAxIGFuZCB0WzNdID09IDMgYW5kIHRbN10gPT0gNCBhbmQgdFsxM10gPT0gNCkKCgpsb2NhbCBmdW5jdGlvbiBpc2JhbGFuY2VkIChzKQogIHJldHVybiBub3Qgc3RyaW5nLmZpbmQoc3RyaW5nLmdzdWIocywgIiViKCkiLCAiIiksICJbKCldIikKZW5kCgphc3NlcnQoaXNiYWxhbmNlZCgiKDkgKCg4KSkoXDApIDcpIFwwXDAgYSBiICgpKGMpKCkgYSIpKQphc3NlcnQobm90IGlzYmFsYW5jZWQoIig5ICgoOCkgNykgYSBiIChcMCBjKSBhIikpCmFzc2VydChzdHJpbmcuZ3N1YigiYWxvICdvaScgYWxvIiwgIiViJyciLCAnIicpID09ICdhbG8gIiBhbG8nKQoKCmxvY2FsIHQgPSB7ImFwcGxlIiwgIm9yYW5nZSIsICJsaW1lIjsgbj0wfQphc3NlcnQoc3RyaW5nLmdzdWIoInggYW5kIHggYW5kIHgiLCAieCIsIGZ1bmN0aW9uICgpIHQubj10Lm4rMTsgcmV0dXJuIHRbdC5uXSBlbmQpCiAgICAgICAgPT0gImFwcGxlIGFuZCBvcmFuZ2UgYW5kIGxpbWUiKQoKdCA9IHtuPTB9CnN0cmluZy5nc3ViKCJmaXJzdCBzZWNvbmQgd29yZCIsICIldyV3KiIsIGZ1bmN0aW9uICh3KSB0Lm49dC5uKzE7IHRbdC5uXSA9IHcgZW5kKQphc3NlcnQodFsxXSA9PSAiZmlyc3QiIGFuZCB0WzJdID09ICJzZWNvbmQiIGFuZCB0WzNdID09ICJ3b3JkIiBhbmQgdC5uID09IDMpCgp0ID0ge249MH0KYXNzZXJ0KHN0cmluZy5nc3ViKCJmaXJzdCBzZWNvbmQgd29yZCIsICIldysiLAogICAgICAgICBmdW5jdGlvbiAodykgdC5uPXQubisxOyB0W3Qubl0gPSB3IGVuZCwgMikgPT0gImZpcnN0IHNlY29uZCB3b3JkIikKYXNzZXJ0KHRbMV0gPT0gImZpcnN0IiBhbmQgdFsyXSA9PSAic2Vjb25kIiBhbmQgdFszXSA9PSB1bmRlZikKCmNoZWNrZXJyb3IoImludmFsaWQgcmVwbGFjZW1lbnQgdmFsdWUgJShhIHRhYmxlJSkiLAogICAgICAgICAgICBzdHJpbmcuZ3N1YiwgImFsbyIsICIuIiwge2EgPSB7fX0pCmNoZWNrZXJyb3IoImludmFsaWQgY2FwdHVyZSBpbmRleCAlJTIiLCBzdHJpbmcuZ3N1YiwgImFsbyIsICIuIiwgIiUyIikKY2hlY2tlcnJvcigiaW52YWxpZCBjYXB0dXJlIGluZGV4ICUlMCIsIHN0cmluZy5nc3ViLCAiYWxvIiwgIiglMCkiLCAiYSIpCmNoZWNrZXJyb3IoImludmFsaWQgY2FwdHVyZSBpbmRleCAlJTEiLCBzdHJpbmcuZ3N1YiwgImFsbyIsICIoJTEpIiwgImEiKQpjaGVja2Vycm9yKCJpbnZhbGlkIHVzZSBvZiAnJSUnIiwgc3RyaW5nLmdzdWIsICJhbG8iLCAiLiIsICIleCIpCgoKaWYgbm90IF9zb2Z0IHRoZW4KICBwcmludCgiYmlnIHN0cmluZ3MiKQogIGxvY2FsIGEgPSBzdHJpbmcucmVwKCdhJywgMzAwMDAwKQogIGFzc2VydChzdHJpbmcuZmluZChhLCAnXmEqLj8kJykpCiAgYXNzZXJ0KG5vdCBzdHJpbmcuZmluZChhLCAnXmEqLj9iJCcpKQogIGFzc2VydChzdHJpbmcuZmluZChhLCAnXmEtLj8kJykpCgogIC0tIGJ1ZyBpbiA1LjEuMgogIGEgPSBzdHJpbmcucmVwKCdhJywgMTAwMDApIC4uIHN0cmluZy5yZXAoJ2InLCAxMDAwMCkKICBhc3NlcnQobm90IHBjYWxsKHN0cmluZy5nc3ViLCBhLCAnYicpKQplbmQKCi0tIHJlY3Vyc2l2ZSBuZXN0IG9mIGdzdWJzCmxvY2FsIGZ1bmN0aW9uIHJldiAocykKICByZXR1cm4gc3RyaW5nLmdzdWIocywgIiguKSguKykiLCBmdW5jdGlvbiAoYyxzMSkgcmV0dXJuIHJldihzMSkuLmMgZW5kKQplbmQKCmxvY2FsIHggPSAiYWJjZGVmIgphc3NlcnQocmV2KHJldih4KSkgPT0geCkKCgotLSBnc3ViIHdpdGggdGFibGVzCmFzc2VydChzdHJpbmcuZ3N1YigiYWxvIGFsbyIsICIuIiwge30pID09ICJhbG8gYWxvIikKYXNzZXJ0KHN0cmluZy5nc3ViKCJhbG8gYWxvIiwgIiguKSIsIHthPSJBQSIsIGw9IiJ9KSA9PSAiQUFvIEFBbyIpCmFzc2VydChzdHJpbmcuZ3N1YigiYWxvIGFsbyIsICIoLikuIiwge2E9IkFBIiwgbD0iSyJ9KSA9PSAiQUFvIEFBbyIpCmFzc2VydChzdHJpbmcuZ3N1YigiYWxvIGFsbyIsICIoKC4pKC4/KSkiLCB7YWw9IkFBIiwgbz1mYWxzZX0pID09ICJBQW8gQUFvIikKCmFzc2VydChzdHJpbmcuZ3N1YigiYWxvIGFsbyIsICIoKS4iLCB7J3gnLCd5eScsJ3p6eid9KSA9PSAieHl5enp6IGFsbyIpCgp0ID0ge307IHNldG1ldGF0YWJsZSh0LCB7X19pbmRleCA9IGZ1bmN0aW9uICh0LHMpIHJldHVybiBzdHJpbmcudXBwZXIocykgZW5kfSkKYXNzZXJ0KHN0cmluZy5nc3ViKCJhIGFsbyBiIGhpIiwgIiV3JXcrIiwgdCkgPT0gImEgQUxPIGIgSEkiKQoKCi0tIHRlc3RzIGZvciBnbWF0Y2gKbG9jYWwgYSA9IDAKZm9yIGkgaW4gc3RyaW5nLmdtYXRjaCgnYWJjZGUnLCAnKCknKSBkbyBhc3NlcnQoaSA9PSBhKzEpOyBhPWkgZW5kCmFzc2VydChhPT02KQoKdCA9IHtuPTB9CmZvciB3IGluIHN0cmluZy5nbWF0Y2goImZpcnN0IHNlY29uZCB3b3JkIiwgIiV3KyIpIGRvCiAgICAgIHQubj10Lm4rMTsgdFt0Lm5dID0gdwplbmQKYXNzZXJ0KHRbMV0gPT0gImZpcnN0IiBhbmQgdFsyXSA9PSAic2Vjb25kIiBhbmQgdFszXSA9PSAid29yZCIpCgp0ID0gezMsIDYsIDl9CmZvciBpIGluIHN0cmluZy5nbWF0Y2ggKCJ4dXh4IHV1IHBwYXIgciIsICIoKSguKSUyIikgZG8KICBhc3NlcnQoaSA9PSB0YWJsZS5yZW1vdmUodCwgMSkpCmVuZAphc3NlcnQoI3QgPT0gMCkKCnQgPSB7fQpmb3IgaSxqIGluIHN0cmluZy5nbWF0Y2goIjEzIDE0IDEwID0gMTEsIDE1PSAxNiwgMjI9MjMiLCAiKCVkKyklcyo9JXMqKCVkKykiKSBkbwogIHRbdG9udW1iZXIoaSldID0gdG9udW1iZXIoaikKZW5kCmEgPSAwCmZvciBrLHYgaW4gcGFpcnModCkgZG8gYXNzZXJ0KGsrMSA9PSB2KzApOyBhPWErMSBlbmQKYXNzZXJ0KGEgPT0gMykKCgpkbyAgIC0tIGluaXQgcGFyYW1ldGVyIGluIGdtYXRjaAogIGxvY2FsIHMgPSAwCiAgZm9yIGsgaW4gc3RyaW5nLmdtYXRjaCgiMTAgMjAgMzAiLCAiJWQrIiwgMykgZG8KICAgIHMgPSBzICsgdG9udW1iZXIoaykKICBlbmQKICBhc3NlcnQocyA9PSA1MCkKCiAgcyA9IDAKICBmb3IgayBpbiBzdHJpbmcuZ21hdGNoKCIxMSAyMSAzMSIsICIlZCsiLCAtNCkgZG8KICAgIHMgPSBzICsgdG9udW1iZXIoaykKICBlbmQKICBhc3NlcnQocyA9PSAzMikKCiAgLS0gdGhlcmUgaXMgYW4gZW1wdHkgc3RyaW5nIGF0IHRoZSBlbmQgb2YgdGhlIHN1YmplY3QKICBzID0gMAogIGZvciBrIGluIHN0cmluZy5nbWF0Y2goIjExIDIxIDMxIiwgIiV3KiIsIDkpIGRvCiAgICBzID0gcyArIDEKICBlbmQKICBhc3NlcnQocyA9PSAxKQoKICAtLSB0aGVyZSBhcmUgbm8gZW1wdHkgc3RyaW5ncyBhZnRlciB0aGUgZW5kIG9mIHRoZSBzdWJqZWN0CiAgcyA9IDAKICBmb3IgayBpbiBzdHJpbmcuZ21hdGNoKCIxMSAyMSAzMSIsICIldyoiLCAxMCkgZG8KICAgIHMgPSBzICsgMQogIGVuZAogIGFzc2VydChzID09IDApCmVuZAoKCi0tIHRlc3RzIGZvciBgJWYnIChgZnJvbnRpZXJzJykKCmFzc2VydChzdHJpbmcuZ3N1YigiYWFhIGFhIGEgYWFhIGEiLCAiJWZbJXddYSIsICJ4IikgPT0gInhhYSB4YSB4IHhhYSB4IikKYXNzZXJ0KHN0cmluZy5nc3ViKCJbW11dIFtdW10gW1tbWyIsICIlZltbXS4iLCAieCIpID09ICJ4W11dIHhdeF0geFtbWyIpCmFzc2VydChzdHJpbmcuZ3N1YigiMDFhYmM0NWRlMyIsICIlZlslZF0iLCAiLiIpID09ICIuMDFhYmMuNDVkZS4zIikKYXNzZXJ0KHN0cmluZy5nc3ViKCIwMWFiYzQ1IGRlM3giLCAiJWZbJURdJXciLCAiLiIpID09ICIwMS5iYzQ1IGRlMy4iKQphc3NlcnQoc3RyaW5nLmdzdWIoImZ1bmN0aW9uIiwgIiVmW1wxLVwyNTVdJXciLCAiLiIpID09ICIudW5jdGlvbiIpCmFzc2VydChzdHJpbmcuZ3N1YigiZnVuY3Rpb24iLCAiJWZbXlwxLVwyNTVdIiwgIi4iKSA9PSAiZnVuY3Rpb24uIikKCmFzc2VydChzdHJpbmcuZmluZCgiYSIsICIlZlthXSIpID09IDEpCmFzc2VydChzdHJpbmcuZmluZCgiYSIsICIlZlteJXpdIikgPT0gMSkKYXNzZXJ0KHN0cmluZy5maW5kKCJhIiwgIiVmW14lbF0iKSA9PSAyKQphc3NlcnQoc3RyaW5nLmZpbmQoImFiYSIsICIlZlthJXpdIikgPT0gMykKYXNzZXJ0KHN0cmluZy5maW5kKCJhYmEiLCAiJWZbJXpdIikgPT0gNCkKYXNzZXJ0KG5vdCBzdHJpbmcuZmluZCgiYWJhIiwgIiVmWyVsJXpdIikpCmFzc2VydChub3Qgc3RyaW5nLmZpbmQoImFiYSIsICIlZlteJWwlel0iKSkKCmxvY2FsIGksIGUgPSBzdHJpbmcuZmluZCgiIGFsbyBhYWxvIGFsbG8iLCAiJWZbJVNdLi0lZlslc10uLSVmWyVTXSIpCmFzc2VydChpID09IDIgYW5kIGUgPT0gNSkKbG9jYWwgayA9IHN0cmluZy5tYXRjaCgiIGFsbyBhYWxvIGFsbG8iLCAiJWZbJVNdKC4tJWZbJXNdLi0lZlslU10pIikKYXNzZXJ0KGsgPT0gJ2FsbyAnKQoKbG9jYWwgYSA9IHsxLCA1LCA5LCAxNCwgMTcsfQpmb3IgayBpbiBzdHJpbmcuZ21hdGNoKCJhbG8gYWxvIHRoMDIgaXMgMWhhdCIsICIoKSVmWyV3JWRdIikgZG8KICBhc3NlcnQodGFibGUucmVtb3ZlKGEsIDEpID09IGspCmVuZAphc3NlcnQoI2EgPT0gMCkKCgotLSBtYWxmb3JtZWQgcGF0dGVybnMKbG9jYWwgZnVuY3Rpb24gbWFsZm9ybSAocCwgbSkKICBtID0gbSBvciAibWFsZm9ybWVkIgogIGxvY2FsIHIsIG1zZyA9IHBjYWxsKHN0cmluZy5maW5kLCAiYSIsIHApCiAgYXNzZXJ0KG5vdCByIGFuZCBzdHJpbmcuZmluZChtc2csIG0pKQplbmQKCm1hbGZvcm0oIiguIiwgInVuZmluaXNoZWQgY2FwdHVyZSIpCm1hbGZvcm0oIi4pIiwgImludmFsaWQgcGF0dGVybiBjYXB0dXJlIikKbWFsZm9ybSgiW2EiKQptYWxmb3JtKCJbXSIpCm1hbGZvcm0oIlteXSIpCm1hbGZvcm0oIlthJV0iKQptYWxmb3JtKCJbYSUiKQptYWxmb3JtKCIlYiIpCm1hbGZvcm0oIiViYSIpCm1hbGZvcm0oIiUiKQptYWxmb3JtKCIlZiIsICJtaXNzaW5nIikKCi0tIFwwIGluIHBhdHRlcm5zCmFzc2VydChzdHJpbmcubWF0Y2goImFiXDBcMVwyYyIsICJbXDAtXDJdKyIpID09ICJcMFwxXDIiKQphc3NlcnQoc3RyaW5nLm1hdGNoKCJhYlwwXDFcMmMiLCAiW1wwLVwwXSsiKSA9PSAiXDAiKQphc3NlcnQoc3RyaW5nLmZpbmQoImIkYSIsICIkXDA/IikgPT0gMikKYXNzZXJ0KHN0cmluZy5maW5kKCJhYmNcMGVmZyIsICIlXDAiKSA9PSA0KQphc3NlcnQoc3RyaW5nLm1hdGNoKCJhYmNcMGVmZ1wwXDFlXDFnIiwgIiViXDBcMSIpID09ICJcMGVmZ1wwXDFlXDEiKQphc3NlcnQoc3RyaW5nLm1hdGNoKCJhYmNcMFwwXDAiLCAiJVwwKyIpID09ICJcMFwwXDAiKQphc3NlcnQoc3RyaW5nLm1hdGNoKCJhYmNcMFwwXDAiLCAiJVwwJVwwPyIpID09ICJcMFwwIikKCi0tIG1hZ2ljIGNoYXIgYWZ0ZXIgXDAKYXNzZXJ0KHN0cmluZy5maW5kKCJhYmNcMFwwIiwiXDAuIikgPT0gNCkKYXNzZXJ0KHN0cmluZy5maW5kKCJhYmN4XDBcMGFiY1wwYWJjIiwieFwwXDBhYmNcMGEuIikgPT0gNCkKCgpkbyAgIC0tIHRlc3QgcmV1c2Ugb2Ygb3JpZ2luYWwgc3RyaW5nIGluIGdzdWIKICBsb2NhbCBzID0gc3RyaW5nLnJlcCgiYSIsIDEwMCkKICBsb2NhbCByID0gc3RyaW5nLmdzdWIocywgImIiLCAiYyIpICAgLS0gbm8gbWF0Y2gKICBhc3NlcnQoc3RyaW5nLmZvcm1hdCgiJXAiLCBzKSA9PSBzdHJpbmcuZm9ybWF0KCIlcCIsIHIpKQoKICByID0gc3RyaW5nLmdzdWIocywgIi4iLCB7eCA9ICJ5In0pICAgLS0gbm8gc3Vic3RpdHV0aW9ucwogIGFzc2VydChzdHJpbmcuZm9ybWF0KCIlcCIsIHMpID09IHN0cmluZy5mb3JtYXQoIiVwIiwgcikpCgogIGxvY2FsIGNvdW50ID0gMAogIHIgPSBzdHJpbmcuZ3N1YihzLCAiLiIsIGZ1bmN0aW9uICh4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHggPT0gImEiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuaWwgICAgLS0gbm8gc3Vic3RpdHV0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kKQogIHIgPSBzdHJpbmcuZ3N1YihyLCAiLiIsIHtiID0gJ3gnfSkgICAtLSAiYSIgaXMgbm90IGEga2V5OyBubyBzdWJzdC4KICBhc3NlcnQoY291bnQgPT0gMTAwKQogIGFzc2VydChzdHJpbmcuZm9ybWF0KCIlcCIsIHMpID09IHN0cmluZy5mb3JtYXQoIiVwIiwgcikpCgogIGNvdW50ID0gMAogIHIgPSBzdHJpbmcuZ3N1YihzLCAiLiIsIGZ1bmN0aW9uICh4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHggPT0gImEiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4ICAgIC0tIHN1YnN0aXR1dGlvbi4uLgogICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCkKICBhc3NlcnQoY291bnQgPT0gMTAwKQogIC0tIG5vIHJldXNlIGluIHRoaXMgY2FzZQogIGFzc2VydChyID09IHMgYW5kIHN0cmluZy5mb3JtYXQoIiVwIiwgcykgfj0gc3RyaW5nLmZvcm1hdCgiJXAiLCByKSkKZW5kCgpwcmludCgnT0snKQoK