LS0gJElkOiB0ZXN0ZXMvZmlsZXMubHVhICQKLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCgpsb2NhbCBkZWJ1ZyA9IHJlcXVpcmUgImRlYnVnIgoKbG9jYWwgbWF4aW50ID0gbWF0aC5tYXhpbnRlZ2VyCgphc3NlcnQodHlwZShvcy5nZXRlbnYiUEFUSCIpID09ICJzdHJpbmciKQoKYXNzZXJ0KGlvLmlucHV0KGlvLnN0ZGluKSA9PSBpby5zdGRpbikKYXNzZXJ0KG5vdCBwY2FsbChpby5pbnB1dCwgIm5vbi1leGlzdGVudC1maWxlIikpCmFzc2VydChpby5vdXRwdXQoaW8uc3Rkb3V0KSA9PSBpby5zdGRvdXQpCgoKbG9jYWwgZnVuY3Rpb24gdGVzdGVyciAobXNnLCBmLCAuLi4pCiAgbG9jYWwgc3RhdCwgZXJyID0gcGNhbGwoZiwgLi4uKQogIHJldHVybiAobm90IHN0YXQgYW5kIHN0cmluZy5maW5kKGVyciwgbXNnLCAxLCB0cnVlKSkKZW5kCgoKbG9jYWwgZnVuY3Rpb24gY2hlY2tlcnIgKG1zZywgZiwgLi4uKQogIGFzc2VydCh0ZXN0ZXJyKG1zZywgZiwgLi4uKSkKZW5kCgoKLS0gY2Fubm90IGNsb3NlIHN0YW5kYXJkIGZpbGVzCmFzc2VydChub3QgaW8uY2xvc2UoaW8uc3RkaW4pIGFuZAogICAgICAgbm90IGlvLnN0ZG91dDpjbG9zZSgpIGFuZAogICAgICAgbm90IGlvLnN0ZGVycjpjbG9zZSgpKQoKLS0gY2Fubm90IGNhbGwgY2xvc2UgbWV0aG9kIHdpdGhvdXQgYW4gYXJndW1lbnQgKG5ldyBpbiA1LjMuNSkKY2hlY2tlcnIoImdvdCBubyB2YWx1ZSIsIGlvLnN0ZGluLmNsb3NlKQoKCmFzc2VydCh0eXBlKGlvLmlucHV0KCkpID09ICJ1c2VyZGF0YSIgYW5kIGlvLnR5cGUoaW8ub3V0cHV0KCkpID09ICJmaWxlIikKYXNzZXJ0KHR5cGUoaW8uc3RkaW4pID09ICJ1c2VyZGF0YSIgYW5kIGlvLnR5cGUoaW8uc3RkZXJyKSA9PSAiZmlsZSIpCmFzc2VydChub3QgaW8udHlwZSg4KSkKbG9jYWwgYSA9IHt9OyBzZXRtZXRhdGFibGUoYSwge30pCmFzc2VydChub3QgaW8udHlwZShhKSkKCmFzc2VydChnZXRtZXRhdGFibGUoaW8uaW5wdXQoKSkuX19uYW1lID09ICJGSUxFKiIpCgpsb2NhbCBhLGIsYyA9IGlvLm9wZW4oJ3h1eHVfbmFvX2V4aXN0ZScpCmFzc2VydChub3QgYSBhbmQgdHlwZShiKSA9PSAic3RyaW5nIiBhbmQgdHlwZShjKSA9PSAibnVtYmVyIikKCmEsYixjID0gaW8ub3BlbignL2EvYi9jL2QnLCAndycpCmFzc2VydChub3QgYSBhbmQgdHlwZShiKSA9PSAic3RyaW5nIiBhbmQgdHlwZShjKSA9PSAibnVtYmVyIikKCmxvY2FsIGZpbGUgPSBvcy50bXBuYW1lKCkKbG9jYWwgZiwgbXNnID0gaW8ub3BlbihmaWxlLCAidyIpCmlmIG5vdCBmIHRoZW4KICAoTWVzc2FnZSBvciBwcmludCkoIidvcy50bXBuYW1lJyBmaWxlIGNhbm5vdCBiZSBvcGVuOyBza2lwcGluZyBmaWxlIHRlc3RzIikKCmVsc2UgIC0teyAgbW9zdCB0ZXN0cyBoZXJlIG5lZWQgdG1wbmFtZQpmOmNsb3NlKCkKCnByaW50KCd0ZXN0aW5nIGkvbycpCgpsb2NhbCBvdGhlcmZpbGUgPSBvcy50bXBuYW1lKCkKCmNoZWNrZXJyKCJpbnZhbGlkIG1vZGUiLCBpby5vcGVuLCBmaWxlLCAicnciKQpjaGVja2VycigiaW52YWxpZCBtb2RlIiwgaW8ub3BlbiwgZmlsZSwgInJiKyIpCmNoZWNrZXJyKCJpbnZhbGlkIG1vZGUiLCBpby5vcGVuLCBmaWxlLCAicitiayIpCmNoZWNrZXJyKCJpbnZhbGlkIG1vZGUiLCBpby5vcGVuLCBmaWxlLCAiIikKY2hlY2tlcnIoImludmFsaWQgbW9kZSIsIGlvLm9wZW4sIGZpbGUsICIrIikKY2hlY2tlcnIoImludmFsaWQgbW9kZSIsIGlvLm9wZW4sIGZpbGUsICJiIikKYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInIrYiIpKTpjbG9zZSgpCmFzc2VydChpby5vcGVuKGZpbGUsICJyKyIpKTpjbG9zZSgpCmFzc2VydChpby5vcGVuKGZpbGUsICJyYiIpKTpjbG9zZSgpCgphc3NlcnQob3Muc2V0bG9jYWxlKCdDJywgJ2FsbCcpKQoKaW8uaW5wdXQoaW8uc3RkaW4pOyBpby5vdXRwdXQoaW8uc3Rkb3V0KTsKCm9zLnJlbW92ZShmaWxlKQphc3NlcnQobm90IGxvYWRmaWxlKGZpbGUpKQpjaGVja2VycigiIiwgZG9maWxlLCBmaWxlKQphc3NlcnQobm90IGlvLm9wZW4oZmlsZSkpCmlvLm91dHB1dChmaWxlKQphc3NlcnQoaW8ub3V0cHV0KCkgfj0gaW8uc3Rkb3V0KQoKaWYgbm90IF9wb3J0IHRoZW4gICAtLSBpbnZhbGlkIHNlZWsKICBsb2NhbCBzdGF0dXMsIG1zZywgY29kZSA9IGlvLnN0ZGluOnNlZWsoInNldCIsIDEwMDApCiAgYXNzZXJ0KG5vdCBzdGF0dXMgYW5kIHR5cGUobXNnKSA9PSAic3RyaW5nIiBhbmQgdHlwZShjb2RlKSA9PSAibnVtYmVyIikKZW5kCgphc3NlcnQoaW8ub3V0cHV0KCk6c2VlaygpID09IDApCmFzc2VydChpby53cml0ZSgiYWxvIGFsbyIpOnNlZWsoKSA9PSBzdHJpbmcubGVuKCJhbG8gYWxvIikpCmFzc2VydChpby5vdXRwdXQoKTpzZWVrKCJjdXIiLCAtMykgPT0gc3RyaW5nLmxlbigiYWxvIGFsbyIpLTMpCmFzc2VydChpby53cml0ZSgiam9hbyIpKQphc3NlcnQoaW8ub3V0cHV0KCk6c2VlaygiZW5kIikgPT0gc3RyaW5nLmxlbigiYWxvIGpvYW8iKSkKCmFzc2VydChpby5vdXRwdXQoKTpzZWVrKCJzZXQiKSA9PSAwKQoKYXNzZXJ0KGlvLndyaXRlKCci4WxvIicsICJ7YX1cbiIsICJzZWNvbmQgbGluZVxuIiwgInRoaXJkIGxpbmUgXG4iKSkKYXNzZXJ0KGlvLndyaXRlKCfnZm91cnRoX2xpbmUnKSkKaW8ub3V0cHV0KGlvLnN0ZG91dCkKY29sbGVjdGdhcmJhZ2UoKSAgLS0gZmlsZSBzaG91bGQgYmUgY2xvc2VkIGJ5IEdDCmFzc2VydChpby5pbnB1dCgpID09IGlvLnN0ZGluIGFuZCByYXdlcXVhbChpby5vdXRwdXQoKSwgaW8uc3Rkb3V0KSkKcHJpbnQoJysnKQoKLS0gdGVzdCBHQyBmb3IgZmlsZXMKY29sbGVjdGdhcmJhZ2UoKQpmb3IgaT0xLDEyMCBkbwogIGZvciBpPTEsNSBkbwogICAgaW8uaW5wdXQoZmlsZSkKICAgIGFzc2VydChpby5vcGVuKGZpbGUsICdyJykpCiAgICBpby5saW5lcyhmaWxlKQogIGVuZAogIGNvbGxlY3RnYXJiYWdlKCkKZW5kCgppby5pbnB1dCgpOmNsb3NlKCkKaW8uY2xvc2UoKQoKYXNzZXJ0KG9zLnJlbmFtZShmaWxlLCBvdGhlcmZpbGUpKQphc3NlcnQobm90IG9zLnJlbmFtZShmaWxlLCBvdGhlcmZpbGUpKQoKaW8ub3V0cHV0KGlvLm9wZW4ob3RoZXJmaWxlLCAiYWIiKSkKYXNzZXJ0KGlvLndyaXRlKCJcblxuXHRcdCAgIiwgMzQ1MCwgIlxuIikpOwppby5jbG9zZSgpCgoKZG8KICAtLSBjbG9zaW5nIGZpbGUgYnkgc2NvcGUKICBsb2NhbCBGID0gbmlsCiAgZG8KICAgIGxvY2FsIDx0b2Nsb3NlPiBmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInciKSkKICAgIEYgPSBmCiAgZW5kCiAgYXNzZXJ0KHRvc3RyaW5nKEYpID09ICJmaWxlIChjbG9zZWQpIikKZW5kCmFzc2VydChvcy5yZW1vdmUoZmlsZSkpCgoKZG8KICAtLSB0ZXN0IHdyaXRpbmcvcmVhZGluZyBudW1iZXJzCiAgbG9jYWwgPHRvY2xvc2U+IGYgPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAidyIpKQogIGY6d3JpdGUobWF4aW50LCAnXG4nKQogIGY6d3JpdGUoc3RyaW5nLmZvcm1hdCgiMFgleFxuIiwgbWF4aW50KSkKICBmOndyaXRlKCIweEFCQ3AtMyIsICdcbicpCiAgZjp3cml0ZSgwLCAnXG4nKQogIGY6d3JpdGUoLW1heGludCwgJ1xuJykKICBmOndyaXRlKHN0cmluZy5mb3JtYXQoIjB4JVhcbiIsIC1tYXhpbnQpKQogIGY6d3JpdGUoIi0weEFCQ3AtMyIsICdcbicpCiAgYXNzZXJ0KGY6Y2xvc2UoKSkKICBsb2NhbCA8dG9jbG9zZT4gZiA9IGFzc2VydChpby5vcGVuKGZpbGUsICJyIikpCiAgYXNzZXJ0KGY6cmVhZCgibiIpID09IG1heGludCkKICBhc3NlcnQoZjpyZWFkKCJuIikgPT0gbWF4aW50KQogIGFzc2VydChmOnJlYWQoIm4iKSA9PSAweEFCQ3AtMykKICBhc3NlcnQoZjpyZWFkKCJuIikgPT0gMCkKICBhc3NlcnQoZjpyZWFkKCIqbiIpID09IC1tYXhpbnQpICAgICAgICAgICAgLS0gdGVzdCBvbGQgZm9ybWF0ICh3aXRoICcqJykKICBhc3NlcnQoZjpyZWFkKCJuIikgPT0gLW1heGludCkKICBhc3NlcnQoZjpyZWFkKCIqbiIpID09IC0weEFCQ3AtMykgICAgICAgICAgICAtLSB0ZXN0IG9sZCBmb3JtYXQgKHdpdGggJyonKQplbmQKYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKCgotLSB0ZXN0aW5nIG11bHRpcGxlIGFyZ3VtZW50cyB0byBpby5yZWFkCmRvCiAgbG9jYWwgPHRvY2xvc2U+IGYgPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAidyIpKQogIGY6d3JpdGVbWwphIGxpbmUKYW5vdGhlciBsaW5lCjEyMzQKMy40NQpvbmUKdHdvCnRocmVlCl1dCiAgbG9jYWwgbDEsIGwyLCBsMywgbDQsIG4xLCBuMiwgYywgZHVtbXkKICBhc3NlcnQoZjpjbG9zZSgpKQogIGxvY2FsIDx0b2Nsb3NlPiBmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInIiKSkKICBsMSwgbDIsIG4xLCBuMiwgZHVtbXkgPSBmOnJlYWQoImwiLCAiTCIsICJuIiwgIm4iKQogIGFzc2VydChsMSA9PSAiYSBsaW5lIiBhbmQgbDIgPT0gImFub3RoZXIgbGluZVxuIiBhbmQKICAgICAgICAgbjEgPT0gMTIzNCBhbmQgbjIgPT0gMy40NSBhbmQgZHVtbXkgPT0gbmlsKQogIGFzc2VydChmOmNsb3NlKCkpCiAgbG9jYWwgPHRvY2xvc2U+IGYgPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAiciIpKQogIGwxLCBsMiwgbjEsIG4yLCBjLCBsMywgbDQsIGR1bW15ID0gZjpyZWFkKDcsICJsIiwgIm4iLCAibiIsIDEsICJsIiwgImwiKQogIGFzc2VydChsMSA9PSAiYSBsaW5lXG4iIGFuZCBsMiA9PSAiYW5vdGhlciBsaW5lIiBhbmQgYyA9PSAnXG4nIGFuZAogICAgICAgICBuMSA9PSAxMjM0IGFuZCBuMiA9PSAzLjQ1IGFuZCBsMyA9PSAib25lIiBhbmQgbDQgPT0gInR3byIKICAgICAgICAgYW5kIGR1bW15ID09IG5pbCkKICBhc3NlcnQoZjpjbG9zZSgpKQogIGxvY2FsIDx0b2Nsb3NlPiBmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInIiKSkKICAtLSBzZWNvbmQgaXRlbSBmYWlsaW5nCiAgbDEsIG4xLCBuMiwgZHVtbXkgPSBmOnJlYWQoImwiLCAibiIsICJuIiwgImwiKQogIGFzc2VydChsMSA9PSAiYSBsaW5lIiBhbmQgbjEgPT0gbmlsKQplbmQKYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKCgoKLS0gdGVzdCB5aWVsZGluZyBkdXJpbmcgJ2RvZmlsZScKZiA9IGFzc2VydChpby5vcGVuKGZpbGUsICJ3IikpCmY6d3JpdGVbWwpsb2NhbCB4LCB6ID0gY29yb3V0aW5lLnlpZWxkKDEwKQpsb2NhbCB5ID0gY29yb3V0aW5lLnlpZWxkKDIwKQpyZXR1cm4geCArIHkgKiB6Cl1dCmFzc2VydChmOmNsb3NlKCkpCmYgPSBjb3JvdXRpbmUud3JhcChkb2ZpbGUpCmFzc2VydChmKGZpbGUpID09IDEwKQphc3NlcnQoZigxMDAsIDEwMSkgPT0gMjApCmFzc2VydChmKDIwMCkgPT0gMTAwICsgMjAwICogMTAxKQphc3NlcnQob3MucmVtb3ZlKGZpbGUpKQoKCmYgPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAidyIpKQotLSB0ZXN0IG51bWJlciB0ZXJtaW5hdGlvbgpmOndyaXRlW1sKLTEyLjMtCS0weGZmZmYrICAuM3w1LkUtM1ggICsyMzRlKzEzRSAweERFQURCRUVGREVBREJFRUZ4CjB4MS4xM0FwKzNlCl1dCi0tIHZlcnkgbG9uZyBudW1iZXIKZjp3cml0ZSgiMTIzNCIpOyBmb3IgaSA9IDEsIDEwMDAgZG8gZjp3cml0ZSgiMCIpIGVuZDsgIGY6d3JpdGUoIlxuIikKLS0gaW52YWxpZCBzZXF1ZW5jZXMgKG11c3QgcmVhZCBhbmQgZGlzY2FyZCB2YWxpZCBwcmVmaXhlcykKZjp3cml0ZVtbCi5lKwkwLmU7CS0tOyAgMHhYOwpdXQphc3NlcnQoZjpjbG9zZSgpKQpmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInIiKSkKYXNzZXJ0KGY6cmVhZCgibiIpID09IC0xMi4zKTsgYXNzZXJ0KGY6cmVhZCgxKSA9PSAiLSIpCmFzc2VydChmOnJlYWQoIm4iKSA9PSAtMHhmZmZmKTsgYXNzZXJ0KGY6cmVhZCgyKSA9PSAiKyAiKQphc3NlcnQoZjpyZWFkKCJuIikgPT0gMC4zKTsgYXNzZXJ0KGY6cmVhZCgxKSA9PSAifCIpCmFzc2VydChmOnJlYWQoIm4iKSA9PSA1ZS0zKTsgYXNzZXJ0KGY6cmVhZCgxKSA9PSAiWCIpCmFzc2VydChmOnJlYWQoIm4iKSA9PSAyMzRlMTMpOyBhc3NlcnQoZjpyZWFkKDEpID09ICJFIikKYXNzZXJ0KGY6cmVhZCgibiIpID09IDBYZGVhZGJlZWZkZWFkYmVlZik7IGFzc2VydChmOnJlYWQoMikgPT0gInhcbiIpCmFzc2VydChmOnJlYWQoIm4iKSA9PSAweDEuMTNhUDMpOyBhc3NlcnQoZjpyZWFkKDEpID09ICJlIikKCmRvICAgLS0gYXR0ZW1wdCB0byByZWFkIHRvbyBsb25nIG51bWJlcgogIGFzc2VydChmOnJlYWQoIm4iKSA9PSBuaWwpICAtLSBmYWlscwogIGxvY2FsIHMgPSBmOnJlYWQoIkwiKSAgIC0tIHJlYWQgcmVzdCBvZiBsaW5lCiAgYXNzZXJ0KHN0cmluZy5maW5kKHMsICJeMDAqXG4kIikpICAtLSBsb3RzIG9mIDAncyBsZWZ0CmVuZAoKYXNzZXJ0KG5vdCBmOnJlYWQoIm4iKSk7IGFzc2VydChmOnJlYWQoMikgPT0gImUrIikKYXNzZXJ0KG5vdCBmOnJlYWQoIm4iKSk7IGFzc2VydChmOnJlYWQoMSkgPT0gIjsiKQphc3NlcnQobm90IGY6cmVhZCgibiIpKTsgYXNzZXJ0KGY6cmVhZCgyKSA9PSAiLTsiKQphc3NlcnQobm90IGY6cmVhZCgibiIpKTsgYXNzZXJ0KGY6cmVhZCgxKSA9PSAiWCIpCmFzc2VydChub3QgZjpyZWFkKCJuIikpOyBhc3NlcnQoZjpyZWFkKDEpID09ICI7IikKYXNzZXJ0KG5vdCBmOnJlYWQoIm4iKSk7IGFzc2VydChub3QgZjpyZWFkKDApKSAgIC0tIGVuZCBvZiBmaWxlCmFzc2VydChmOmNsb3NlKCkpCmFzc2VydChvcy5yZW1vdmUoZmlsZSkpCgoKLS0gdGVzdCBsaW5lIGdlbmVyYXRvcnMKYXNzZXJ0KG5vdCBwY2FsbChpby5saW5lcywgIm5vbi1leGlzdGVudC1maWxlIikpCmFzc2VydChvcy5yZW5hbWUob3RoZXJmaWxlLCBmaWxlKSkKaW8ub3V0cHV0KG90aGVyZmlsZSkKbG9jYWwgbiA9IDAKbG9jYWwgZiA9IGlvLmxpbmVzKGZpbGUpCndoaWxlIGYoKSBkbyBuID0gbiArIDEgZW5kOwphc3NlcnQobiA9PSA2KSAgIC0tIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgZmlsZQpjaGVja2VycigiZmlsZSBpcyBhbHJlYWR5IGNsb3NlZCIsIGYpCmNoZWNrZXJyKCJmaWxlIGlzIGFscmVhZHkgY2xvc2VkIiwgZikKLS0gY29weSBmcm9tIGZpbGUgdG8gb3RoZXJmaWxlCm4gPSAwCmZvciBsIGluIGlvLmxpbmVzKGZpbGUpIGRvIGlvLndyaXRlKGwsICJcbiIpOyBuID0gbiArIDEgZW5kCmlvLmNsb3NlKCkKYXNzZXJ0KG4gPT0gNikKLS0gY29weSBmcm9tIG90aGVyZmlsZSBiYWNrIHRvIGZpbGUKbG9jYWwgZiA9IGFzc2VydChpby5vcGVuKG90aGVyZmlsZSkpCmFzc2VydChpby50eXBlKGYpID09ICJmaWxlIikKaW8ub3V0cHV0KGZpbGUpCmFzc2VydChub3QgaW8ub3V0cHV0KCk6cmVhZCgpKQpuID0gMApmb3IgbCBpbiBmOmxpbmVzKCkgZG8gaW8ud3JpdGUobCwgIlxuIik7IG4gPSBuICsgMSBlbmQKYXNzZXJ0KHRvc3RyaW5nKGYpOnN1YigxLCA1KSA9PSAiZmlsZSAiKQphc3NlcnQoZjpjbG9zZSgpKTsgaW8uY2xvc2UoKQphc3NlcnQobiA9PSA2KQpjaGVja2VycigiY2xvc2VkIGZpbGUiLCBpby5jbG9zZSwgZikKYXNzZXJ0KHRvc3RyaW5nKGYpID09ICJmaWxlIChjbG9zZWQpIikKYXNzZXJ0KGlvLnR5cGUoZikgPT0gImNsb3NlZCBmaWxlIikKaW8uaW5wdXQoZmlsZSkKZiA9IGlvLm9wZW4ob3RoZXJmaWxlKTpsaW5lcygpCm4gPSAwCmZvciBsIGluIGlvLmxpbmVzKCkgZG8gYXNzZXJ0KGwgPT0gZigpKTsgbiA9IG4gKyAxIGVuZApmID0gbmlsOyBjb2xsZWN0Z2FyYmFnZSgpCmFzc2VydChuID09IDYpCmFzc2VydChvcy5yZW1vdmUob3RoZXJmaWxlKSkKCmRvICAtLSBidWcgaW4gNS4zLjEKICBpby5vdXRwdXQob3RoZXJmaWxlKQogIGlvLndyaXRlKHN0cmluZy5yZXAoImEiLCAzMDApLCAiXG4iKQogIGlvLmNsb3NlKCkKICBsb2NhbCB0ID17fTsgZm9yIGkgPSAxLCAyNTAgZG8gdFtpXSA9IDEgZW5kCiAgdCA9IHtpby5saW5lcyhvdGhlcmZpbGUsIHRhYmxlLnVucGFjayh0KSkoKX0KICAtLSBldmVyeXRoaW5nIG9rIGhlcmUKICBhc3NlcnQoI3QgPT0gMjUwIGFuZCB0WzFdID09ICdhJyBhbmQgdFsjdF0gPT0gJ2EnKQogIHRbI3QgKyAxXSA9IDEgICAgLS0gb25lIHRvbyBtYW55CiAgY2hlY2tlcnIoInRvbyBtYW55IGFyZ3VtZW50cyIsIGlvLmxpbmVzLCBvdGhlcmZpbGUsIHRhYmxlLnVucGFjayh0KSkKICBjb2xsZWN0Z2FyYmFnZSgpICAgLS0gZW5zdXJlICdvdGhlcmZpbGUnIGlzIGNsb3NlZAogIGFzc2VydChvcy5yZW1vdmUob3RoZXJmaWxlKSkKZW5kCgppby5pbnB1dChmaWxlKQpkbyAgLS0gdGVzdCBlcnJvciByZXR1cm5zCiAgbG9jYWwgYSxiLGMgPSBpby5pbnB1dCgpOndyaXRlKCJ4dXh1IikKICBhc3NlcnQobm90IGEgYW5kIHR5cGUoYikgPT0gInN0cmluZyIgYW5kIHR5cGUoYykgPT0gIm51bWJlciIpCmVuZApjaGVja2VycigiaW52YWxpZCBmb3JtYXQiLCBpby5yZWFkLCAieCIpCmFzc2VydChpby5yZWFkKDApID09ICIiKSAgIC0tIG5vdCBlb2YKYXNzZXJ0KGlvLnJlYWQoNSwgJ2wnKSA9PSAnIuFsbyInKQphc3NlcnQoaW8ucmVhZCgwKSA9PSAiIikKYXNzZXJ0KGlvLnJlYWQoKSA9PSAic2Vjb25kIGxpbmUiKQpsb2NhbCB4ID0gaW8uaW5wdXQoKTpzZWVrKCkKYXNzZXJ0KGlvLnJlYWQoKSA9PSAidGhpcmQgbGluZSAiKQphc3NlcnQoaW8uaW5wdXQoKTpzZWVrKCJzZXQiLCB4KSkKYXNzZXJ0KGlvLnJlYWQoJ0wnKSA9PSAidGhpcmQgbGluZSBcbiIpCmFzc2VydChpby5yZWFkKDEpID09ICLnIikKYXNzZXJ0KGlvLnJlYWQoc3RyaW5nLmxlbiJmb3VydGhfbGluZSIpID09ICJmb3VydGhfbGluZSIpCmFzc2VydChpby5pbnB1dCgpOnNlZWsoImN1ciIsIC1zdHJpbmcubGVuImZvdXJ0aF9saW5lIikpCmFzc2VydChpby5yZWFkKCkgPT0gImZvdXJ0aF9saW5lIikKYXNzZXJ0KGlvLnJlYWQoKSA9PSAiIikgIC0tIGVtcHR5IGxpbmUKYXNzZXJ0KGlvLnJlYWQoJ24nKSA9PSAzNDUwKQphc3NlcnQoaW8ucmVhZCgxKSA9PSAnXG4nKQphc3NlcnQoaW8ucmVhZCgwKSA9PSBuaWwpICAtLSBlbmQgb2YgZmlsZQphc3NlcnQoaW8ucmVhZCgxKSA9PSBuaWwpICAtLSBlbmQgb2YgZmlsZQphc3NlcnQoaW8ucmVhZCgzMDAwMCkgPT0gbmlsKSAgLS0gZW5kIG9mIGZpbGUKYXNzZXJ0KCh7aW8ucmVhZCgxKX0pWzJdID09IHVuZGVmKQphc3NlcnQoaW8ucmVhZCgpID09IG5pbCkgIC0tIGVuZCBvZiBmaWxlCmFzc2VydCgoe2lvLnJlYWQoKX0pWzJdID09IHVuZGVmKQphc3NlcnQoaW8ucmVhZCgnbicpID09IG5pbCkgIC0tIGVuZCBvZiBmaWxlCmFzc2VydCgoe2lvLnJlYWQoJ24nKX0pWzJdID09IHVuZGVmKQphc3NlcnQoaW8ucmVhZCgnYScpID09ICcnKSAgLS0gZW5kIG9mIGZpbGUgKE9LIGZvciAnYScpCmFzc2VydChpby5yZWFkKCdhJykgPT0gJycpICAtLSBlbmQgb2YgZmlsZSAoT0sgZm9yICdhJykKY29sbGVjdGdhcmJhZ2UoKQpwcmludCgnKycpCmlvLmNsb3NlKGlvLmlucHV0KCkpCmNoZWNrZXJyKCIgaW5wdXQgZmlsZSBpcyBjbG9zZWQiLCBpby5yZWFkKQoKYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKCmxvY2FsIHQgPSAnMDEyMzQ1Njc4OScKZm9yIGk9MSwxMCBkbyB0ID0gdC4udDsgZW5kCmFzc2VydChzdHJpbmcubGVuKHQpID09IDEwKjJeMTApCgppby5vdXRwdXQoZmlsZSkKaW8ud3JpdGUoImFsbyIpOndyaXRlKCJcbiIpCmlvLmNsb3NlKCkKY2hlY2tlcnIoIiBvdXRwdXQgZmlsZSBpcyBjbG9zZWQiLCBpby53cml0ZSkKbG9jYWwgZiA9IGlvLm9wZW4oZmlsZSwgImErYiIpCmlvLm91dHB1dChmKQpjb2xsZWN0Z2FyYmFnZSgpCgphc3NlcnQoaW8ud3JpdGUoJyAnIC4uIHQgLi4gJyAnKSkKYXNzZXJ0KGlvLndyaXRlKCc7JywgJ2VuZCBvZiBmaWxlXG4nKSkKZjpmbHVzaCgpOyBpby5mbHVzaCgpCmY6Y2xvc2UoKQpwcmludCgnKycpCgppby5pbnB1dChmaWxlKQphc3NlcnQoaW8ucmVhZCgpID09ICJhbG8iKQphc3NlcnQoaW8ucmVhZCgxKSA9PSAnICcpCmFzc2VydChpby5yZWFkKHN0cmluZy5sZW4odCkpID09IHQpCmFzc2VydChpby5yZWFkKDEpID09ICcgJykKYXNzZXJ0KGlvLnJlYWQoMCkpCmFzc2VydChpby5yZWFkKCdhJykgPT0gJztlbmQgb2YgZmlsZVxuJykKYXNzZXJ0KGlvLnJlYWQoMCkgPT0gbmlsKQphc3NlcnQoaW8uY2xvc2UoaW8uaW5wdXQoKSkpCgoKLS0gdGVzdCBlcnJvcnMgaW4gcmVhZC93cml0ZQpkbwogIGxvY2FsIGZ1bmN0aW9uIGlzbXNnIChtKQogICAgLS0gZXJyb3IgbWVzc2FnZSBpcyBub3QgYSBjb2RlIG51bWJlcgogICAgcmV0dXJuICh0eXBlKG0pID09ICJzdHJpbmciIGFuZCB0b251bWJlcihtKSA9PSBuaWwpCiAgZW5kCgogIC0tIHJlYWQKICBsb2NhbCBmID0gaW8ub3BlbihmaWxlLCAidyIpCiAgbG9jYWwgciwgbSwgYyA9IGY6cmVhZCgpCiAgYXNzZXJ0KG5vdCByIGFuZCBpc21zZyhtKSBhbmQgdHlwZShjKSA9PSAibnVtYmVyIikKICBhc3NlcnQoZjpjbG9zZSgpKQogIC0tIHdyaXRlCiAgZiA9IGlvLm9wZW4oZmlsZSwgInIiKQogIHIsIG0sIGMgPSBmOndyaXRlKCJ3aGF0ZXZlciIpCiAgYXNzZXJ0KG5vdCByIGFuZCBpc21zZyhtKSBhbmQgdHlwZShjKSA9PSAibnVtYmVyIikKICBhc3NlcnQoZjpjbG9zZSgpKQogIC0tIGxpbmVzCiAgZiA9IGlvLm9wZW4oZmlsZSwgInciKQogIHIsIG0gPSBwY2FsbChmOmxpbmVzKCkpCiAgYXNzZXJ0KHIgPT0gZmFsc2UgYW5kIGlzbXNnKG0pKQogIGFzc2VydChmOmNsb3NlKCkpCmVuZAoKYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKCi0tIHRlc3QgZm9yIEwgZm9ybWF0CmlvLm91dHB1dChmaWxlKTsgaW8ud3JpdGUiXG5cbmxpbmVcbm90aGVyIjpjbG9zZSgpCmlvLmlucHV0KGZpbGUpCmFzc2VydChpby5yZWFkIkwiID09ICJcbiIpCmFzc2VydChpby5yZWFkIkwiID09ICJcbiIpCmFzc2VydChpby5yZWFkIkwiID09ICJsaW5lXG4iKQphc3NlcnQoaW8ucmVhZCJMIiA9PSAib3RoZXIiKQphc3NlcnQoaW8ucmVhZCJMIiA9PSBuaWwpCmlvLmlucHV0KCk6Y2xvc2UoKQoKbG9jYWwgZiA9IGFzc2VydChpby5vcGVuKGZpbGUpKQpsb2NhbCBzID0gIiIKZm9yIGwgaW4gZjpsaW5lcygiTCIpIGRvIHMgPSBzIC4uIGwgZW5kCmFzc2VydChzID09ICJcblxubGluZVxub3RoZXIiKQpmOmNsb3NlKCkKCmlvLmlucHV0KGZpbGUpCnMgPSAiIgpmb3IgbCBpbiBpby5saW5lcyhuaWwsICJMIikgZG8gcyA9IHMgLi4gbCBlbmQKYXNzZXJ0KHMgPT0gIlxuXG5saW5lXG5vdGhlciIpCmlvLmlucHV0KCk6Y2xvc2UoKQoKcyA9ICIiCmZvciBsIGluIGlvLmxpbmVzKGZpbGUsICJMIikgZG8gcyA9IHMgLi4gbCBlbmQKYXNzZXJ0KHMgPT0gIlxuXG5saW5lXG5vdGhlciIpCgpzID0gIiIKZm9yIGwgaW4gaW8ubGluZXMoZmlsZSwgImwiKSBkbyBzID0gcyAuLiBsIGVuZAphc3NlcnQocyA9PSAibGluZW90aGVyIikKCmlvLm91dHB1dChmaWxlKTsgaW8ud3JpdGUiYSA9IDEwICsgMzRcbmEgPSAyKmFcbmEgPSAtYVxuIjpjbG9zZSgpCmxvY2FsIHQgPSB7fQphc3NlcnQobG9hZChpby5saW5lcyhmaWxlLCAiTCIpLCBuaWwsIG5pbCwgdCkpKCkKYXNzZXJ0KHQuYSA9PSAtKCgxMCArIDM0KSAqIDIpKQoKCmRvICAgLS0gdGVzdGluZyBjbG9zaW5nIGZpbGUgaW4gbGluZSBpdGVyYXRpb24KCiAgLS0gZ2V0IHRoZSB0by1iZS1jbG9zZWQgdmFyaWFibGUgZnJvbSBhIGxvb3AKICBsb2NhbCBmdW5jdGlvbiBnZXR0b2Nsb3NlIChsdikKICAgIGx2ID0gbHYgKyAxCiAgICBmb3IgaSA9IDEsIG1hdGgubWF4aW50ZWdlciBkbwogICAgICBsb2NhbCBuLCB2ID0gZGVidWcuZ2V0bG9jYWwobHYsIGkpCiAgICAgIGlmIG4gPT0gIihmb3IgdG9jbG9zZSkiIHRoZW4KICAgICAgICByZXR1cm4gdgogICAgICBlbmQKICAgIGVuZAogIGVuZAoKICBsb2NhbCBmCiAgZm9yIGwgaW4gaW8ubGluZXMoZmlsZSkgZG8KICAgIGYgPSBnZXR0b2Nsb3NlKDEpCiAgICBhc3NlcnQoaW8udHlwZShmKSA9PSAiZmlsZSIpCiAgICBicmVhawogIGVuZAogIGFzc2VydChpby50eXBlKGYpID09ICJjbG9zZWQgZmlsZSIpCgogIGYgPSBuaWwKICBsb2NhbCBmdW5jdGlvbiBmb28gKG5hbWUpCiAgICBmb3IgbCBpbiBpby5saW5lcyhuYW1lKSBkbwogICAgICBmID0gZ2V0dG9jbG9zZSgxKQogICAgICBhc3NlcnQoaW8udHlwZShmKSA9PSAiZmlsZSIpCiAgICAgIGVycm9yKGYpICAgLS0gZXhpdCBsb29wIHdpdGggYW4gZXJyb3IKICAgIGVuZAogIGVuZAogIGxvY2FsIHN0LCBtc2cgPSBwY2FsbChmb28sIGZpbGUpCiAgYXNzZXJ0KHN0ID09IGZhbHNlIGFuZCBpby50eXBlKG1zZykgPT0gImNsb3NlZCBmaWxlIikKCmVuZAoKCi0tIHRlc3QgZm9yIG11bHRpcGUgYXJndW1lbnRzIGluICdsaW5lcycKaW8ub3V0cHV0KGZpbGUpOyBpby53cml0ZSIwMTIzNDU2Nzg5XG4iOmNsb3NlKCkKZm9yIGEsYiBpbiBpby5saW5lcyhmaWxlLCAxLCAxKSBkbwogIGlmIGEgPT0gIlxuIiB0aGVuIGFzc2VydChiID09IG5pbCkKICBlbHNlIGFzc2VydCh0b251bWJlcihhKSA9PSB0b251bWJlcihiKSAtIDEpCiAgZW5kCmVuZAoKZm9yIGEsYixjIGluIGlvLmxpbmVzKGZpbGUsIDEsIDIsICJhIikgZG8KICBhc3NlcnQoYSA9PSAiMCIgYW5kIGIgPT0gIjEyIiBhbmQgYyA9PSAiMzQ1Njc4OVxuIikKZW5kCgpmb3IgYSxiLGMgaW4gaW8ubGluZXMoZmlsZSwgImEiLCAwLCAxKSBkbwogIGlmIGEgPT0gIiIgdGhlbiBicmVhayBlbmQKICBhc3NlcnQoYSA9PSAiMDEyMzQ1Njc4OVxuIiBhbmQgYiA9PSBuaWwgYW5kIGMgPT0gbmlsKQplbmQKY29sbGVjdGdhcmJhZ2UoKSAgIC0tIHRvIGNsb3NlIGZpbGUgaW4gcHJldmlvdXMgaXRlcmF0aW9uCgppby5vdXRwdXQoZmlsZSk7IGlvLndyaXRlIjAwXG4xMFxuMjBcbjMwXG40MFxuIjpjbG9zZSgpCmZvciBhLCBiIGluIGlvLmxpbmVzKGZpbGUsICJuIiwgIm4iKSBkbwogIGlmIGEgPT0gNDAgdGhlbiBhc3NlcnQoYiA9PSBuaWwpCiAgZWxzZSBhc3NlcnQoYSA9PSBiIC0gMTApCiAgZW5kCmVuZAoKCi0tIHRlc3QgbG9hZCB4IGxpbmVzCmlvLm91dHB1dChmaWxlKTsKaW8ud3JpdGVbWwpsb2NhbCB5Cj0gWApYID0KWCAqCjIgKwpYOwpYID0KWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OwpdXTpjbG9zZSgpCl9HLlggPSAxCmFzc2VydChub3QgbG9hZCgoaW8ubGluZXMoZmlsZSkpKSkKY29sbGVjdGdhcmJhZ2UoKSAgIC0tIHRvIGNsb3NlIGZpbGUgaW4gcHJldmlvdXMgaXRlcmF0aW9uCmxvYWQoKGlvLmxpbmVzKGZpbGUsICJMIikpKSgpCmFzc2VydChfRy5YID09IDIpCmxvYWQoKGlvLmxpbmVzKGZpbGUsIDEpKSkoKQphc3NlcnQoX0cuWCA9PSA0KQpsb2FkKChpby5saW5lcyhmaWxlLCAzKSkpKCkKYXNzZXJ0KF9HLlggPT0gOCkKCnByaW50KCcrJykKCmxvY2FsIHgxID0gInN0cmluZ1xuXG5cXGNvbSBcIlwiJydjb2lzYXMgW1tlc3RyYW5oYXNdXSBdXSciCmlvLm91dHB1dChmaWxlKQphc3NlcnQoaW8ud3JpdGUoc3RyaW5nLmZvcm1hdCgieDIgPSAlcVxuLS0gY29tbWVudCB3aXRob3V0IGVuZGluZyBFT1MiLCB4MSkpKQppby5jbG9zZSgpCmFzc2VydChsb2FkZmlsZShmaWxlKSkoKQphc3NlcnQoeDEgPT0geDIpCnByaW50KCcrJykKYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKYXNzZXJ0KG5vdCBvcy5yZW1vdmUoZmlsZSkpCmFzc2VydChub3Qgb3MucmVtb3ZlKG90aGVyZmlsZSkpCgotLSB0ZXN0aW5nIGxvYWRmaWxlCmxvY2FsIGZ1bmN0aW9uIHRlc3Rsb2FkZmlsZSAocywgZXhwcmVzKQogIGlvLm91dHB1dChmaWxlKQogIGlmIHMgdGhlbiBpby53cml0ZShzKSBlbmQKICBpby5jbG9zZSgpCiAgbG9jYWwgcmVzID0gYXNzZXJ0KGxvYWRmaWxlKGZpbGUpKSgpCiAgYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKICBhc3NlcnQocmVzID09IGV4cHJlcykKZW5kCgotLSBsb2FkaW5nIGVtcHR5IGZpbGUKdGVzdGxvYWRmaWxlKG5pbCwgbmlsKQoKLS0gbG9hZGluZyBmaWxlIHdpdGggaW5pdGlhbCBjb21tZW50IHdpdGhvdXQgZW5kIG9mIGxpbmUKdGVzdGxvYWRmaWxlKCIjIGEgbm9uLWVuZGluZyBjb21tZW50IiwgbmlsKQoKCi0tIGNoZWNraW5nIFVuaWNvZGUgQk9NIGluIGZpbGVzCnRlc3Rsb2FkZmlsZSgiXHhFRlx4QkJceEJGIyBzb21lIGNvbW1lbnRcbnJldHVybiAyMzQiLCAyMzQpCnRlc3Rsb2FkZmlsZSgiXHhFRlx4QkJceEJGcmV0dXJuIDIzOSIsIDIzOSkKdGVzdGxvYWRmaWxlKCJceEVGXHhCQlx4QkYiLCBuaWwpICAgLS0gZW1wdHkgZmlsZSB3aXRoIGEgQk9NCgoKLS0gY2hlY2tpbmcgbGluZSBudW1iZXJzIGluIGZpbGVzIHdpdGggaW5pdGlhbCBjb21tZW50cwp0ZXN0bG9hZGZpbGUoIiMgYSBjb21tZW50XG5yZXR1cm4gcmVxdWlyZSdkZWJ1ZycuZ2V0aW5mbygxKS5jdXJyZW50bGluZSIsIDIpCgoKLS0gbG9hZGluZyBiaW5hcnkgZmlsZQppby5vdXRwdXQoaW8ub3BlbihmaWxlLCAid2IiKSkKYXNzZXJ0KGlvLndyaXRlKHN0cmluZy5kdW1wKGZ1bmN0aW9uICgpIHJldHVybiAxMCwgJ1wwYWxvXDI1NScsICdoaScgZW5kKSkpCmlvLmNsb3NlKCkKYSwgYiwgYyA9IGFzc2VydChsb2FkZmlsZShmaWxlKSkoKQphc3NlcnQoYSA9PSAxMCBhbmQgYiA9PSAiXDBhbG9cMjU1IiBhbmQgYyA9PSAiaGkiKQphc3NlcnQob3MucmVtb3ZlKGZpbGUpKQoKLS0gYnVnIGluIDUuMi4xCmRvCiAgaW8ub3V0cHV0KGlvLm9wZW4oZmlsZSwgIndiIikpCiAgLS0gc2F2ZSBmdW5jdGlvbiB3aXRoIG5vIHVwdmFsdWVzCiAgYXNzZXJ0KGlvLndyaXRlKHN0cmluZy5kdW1wKGZ1bmN0aW9uICgpIHJldHVybiAxIGVuZCkpKQogIGlvLmNsb3NlKCkKICBmID0gYXNzZXJ0KGxvYWRmaWxlKGZpbGUsICJiIiwge30pKQogIGFzc2VydCh0eXBlKGYpID09ICJmdW5jdGlvbiIgYW5kIGYoKSA9PSAxKQogIGFzc2VydChvcy5yZW1vdmUoZmlsZSkpCmVuZAoKLS0gbG9hZGluZyBiaW5hcnkgZmlsZSB3aXRoIGluaXRpYWwgY29tbWVudAppby5vdXRwdXQoaW8ub3BlbihmaWxlLCAid2IiKSkKYXNzZXJ0KGlvLndyaXRlKCIjdGhpcyBpcyBhIGNvbW1lbnQgZm9yIGEgYmluYXJ5IGZpbGVcMFxuIiwKICAgICAgICAgICAgICAgIHN0cmluZy5kdW1wKGZ1bmN0aW9uICgpIHJldHVybiAyMCwgJ1wwXDBcMCcgZW5kKSkpCmlvLmNsb3NlKCkKYSwgYiwgYyA9IGFzc2VydChsb2FkZmlsZShmaWxlKSkoKQphc3NlcnQoYSA9PSAyMCBhbmQgYiA9PSAiXDBcMFwwIiBhbmQgYyA9PSBuaWwpCmFzc2VydChvcy5yZW1vdmUoZmlsZSkpCgoKLS0gJ2xvYWRmaWxlJyB3aXRoICdlbnYnCmRvCiAgbG9jYWwgZiA9IGlvLm9wZW4oZmlsZSwgJ3cnKQogIGY6d3JpdGVbWwogICAgaWYgKC4uLikgdGhlbiBhID0gMTU7IHJldHVybiBiLCBjLCBkCiAgICBlbHNlIHJldHVybiBfRU5WCiAgICBlbmQKICBdXQogIGY6Y2xvc2UoKQogIGxvY2FsIHQgPSB7YiA9IDEyLCBjID0gInh1eHUiLCBkID0gcHJpbnR9CiAgbG9jYWwgZiA9IGFzc2VydChsb2FkZmlsZShmaWxlLCAndCcsIHQpKQogIGxvY2FsIGIsIGMsIGQgPSBmKDEpCiAgYXNzZXJ0KHQuYSA9PSAxNSBhbmQgYiA9PSAxMiBhbmQgYyA9PSB0LmMgYW5kIGQgPT0gcHJpbnQpCiAgYXNzZXJ0KGYoKSA9PSB0KQogIGYgPSBhc3NlcnQobG9hZGZpbGUoZmlsZSwgJ3QnLCBuaWwpKQogIGFzc2VydChmKCkgPT0gbmlsKQogIGYgPSBhc3NlcnQobG9hZGZpbGUoZmlsZSkpCiAgYXNzZXJ0KGYoKSA9PSBfRykKICBhc3NlcnQob3MucmVtb3ZlKGZpbGUpKQplbmQKCgotLSAnbG9hZGZpbGUnIHggbW9kZXMKZG8KICBpby5vcGVuKGZpbGUsICd3Jyk6d3JpdGUoInJldHVybiAxMCIpOmNsb3NlKCkKICBsb2NhbCBzLCBtID0gbG9hZGZpbGUoZmlsZSwgJ2InKQogIGFzc2VydChub3QgcyBhbmQgc3RyaW5nLmZpbmQobSwgImEgdGV4dCBjaHVuayIpKQogIGlvLm9wZW4oZmlsZSwgJ3cnKTp3cml0ZSgiXDI3IHJldHVybiAxMCIpOmNsb3NlKCkKICBsb2NhbCBzLCBtID0gbG9hZGZpbGUoZmlsZSwgJ3QnKQogIGFzc2VydChub3QgcyBhbmQgc3RyaW5nLmZpbmQobSwgImEgYmluYXJ5IGNodW5rIikpCiAgYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKZW5kCgoKaW8ub3V0cHV0KGZpbGUpCmFzc2VydChpby53cml0ZSgicXVhbHF1ZXIgY29pc2FcbiIpKQphc3NlcnQoaW8ud3JpdGUoIm1haXMgcXVhbHF1ZXIgY29pc2EiKSkKaW8uY2xvc2UoKQphc3NlcnQoaW8ub3V0cHV0KGFzc2VydChpby5vcGVuKG90aGVyZmlsZSwgJ3diJykpKQogICAgICAgOndyaXRlKCJvdXRyYSBjb2lzYVwwXDFcM1wwXDBcMFwwXDI1NVwwIikKICAgICAgIDpjbG9zZSgpKQoKbG9jYWwgZmlsZWhhbmRsZSA9IGFzc2VydChpby5vcGVuKGZpbGUsICdyKycpKQpsb2NhbCBvdGhlcmZpbGVoYW5kbGUgPSBhc3NlcnQoaW8ub3BlbihvdGhlcmZpbGUsICdyYicpKQphc3NlcnQoZmlsZWhhbmRsZSB+PSBvdGhlcmZpbGVoYW5kbGUpCmFzc2VydCh0eXBlKGZpbGVoYW5kbGUpID09ICJ1c2VyZGF0YSIpCmFzc2VydChmaWxlaGFuZGxlOnJlYWQoJ2wnKSA9PSAicXVhbHF1ZXIgY29pc2EiKQppby5pbnB1dChvdGhlcmZpbGVoYW5kbGUpCmFzc2VydChpby5yZWFkKHN0cmluZy5sZW4ib3V0cmEgY29pc2EiKSA9PSAib3V0cmEgY29pc2EiKQphc3NlcnQoZmlsZWhhbmRsZTpyZWFkKCdsJykgPT0gIm1haXMgcXVhbHF1ZXIgY29pc2EiKQpmaWxlaGFuZGxlOmNsb3NlKCk7CmFzc2VydCh0eXBlKGZpbGVoYW5kbGUpID09ICJ1c2VyZGF0YSIpCmlvLmlucHV0KG90aGVyZmlsZWhhbmRsZSkKYXNzZXJ0KGlvLnJlYWQoNCkgPT0gIlwwXDFcM1wwIikKYXNzZXJ0KGlvLnJlYWQoMykgPT0gIlwwXDBcMCIpCmFzc2VydChpby5yZWFkKDApID09ICIiKSAgICAgICAgLS0gMjU1IGlzIG5vdCBlb2YKYXNzZXJ0KGlvLnJlYWQoMSkgPT0gIlwyNTUiKQphc3NlcnQoaW8ucmVhZCgnYScpID09ICJcMCIpCmFzc2VydChub3QgaW8ucmVhZCgwKSkKYXNzZXJ0KG90aGVyZmlsZWhhbmRsZSA9PSBpby5pbnB1dCgpKQpvdGhlcmZpbGVoYW5kbGU6Y2xvc2UoKQphc3NlcnQob3MucmVtb3ZlKGZpbGUpKQphc3NlcnQob3MucmVtb3ZlKG90aGVyZmlsZSkpCmNvbGxlY3RnYXJiYWdlKCkKCmlvLm91dHB1dChmaWxlKQogIDp3cml0ZVtbCiAxMjMuNAktNTZlLTIgIG5vdCBhIG51bWJlcgpzZWNvbmQgbGluZQp0aGlyZCBsaW5lCgphbmQgdGhlIHJlc3Qgb2YgdGhlIGZpbGUKXV0KICA6Y2xvc2UoKQppby5pbnB1dChmaWxlKQpsb2NhbCBfLGEsYixjLGQsZSxoLF9fID0gaW8ucmVhZCgxLCAnbicsICduJywgJ2wnLCAnbCcsICdsJywgJ2EnLCAxMCkKYXNzZXJ0KGlvLmNsb3NlKGlvLmlucHV0KCkpKQphc3NlcnQoXyA9PSAnICcgYW5kIF9fID09IG5pbCkKYXNzZXJ0KHR5cGUoYSkgPT0gJ251bWJlcicgYW5kIGE9PTEyMy40IGFuZCBiPT0tNTZlLTIpCmFzc2VydChkPT0nc2Vjb25kIGxpbmUnIGFuZCBlPT0ndGhpcmQgbGluZScpCmFzc2VydChoPT1bWwoKYW5kIHRoZSByZXN0IG9mIHRoZSBmaWxlCl1dKQphc3NlcnQob3MucmVtb3ZlKGZpbGUpKQpjb2xsZWN0Z2FyYmFnZSgpCgotLSB0ZXN0aW5nIGJ1ZmZlcnMKZG8KICBsb2NhbCBmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInciKSkKICBsb2NhbCBmciA9IGFzc2VydChpby5vcGVuKGZpbGUsICJyIikpCiAgYXNzZXJ0KGY6c2V0dmJ1ZigiZnVsbCIsIDIwMDApKQogIGY6d3JpdGUoIngiKQogIGFzc2VydChmcjpyZWFkKCJhbGwiKSA9PSAiIikgIC0tIGZ1bGwgYnVmZmVyOyBvdXRwdXQgbm90IHdyaXR0ZW4geWV0CiAgZjpjbG9zZSgpCiAgZnI6c2Vlaygic2V0IikKICBhc3NlcnQoZnI6cmVhZCgiYWxsIikgPT0gIngiKSAgIC0tIGBjbG9zZScgZmx1c2hlcyBpdAogIGYgPSBhc3NlcnQoaW8ub3BlbihmaWxlKSwgInciKQogIGFzc2VydChmOnNldHZidWYoIm5vIikpCiAgZjp3cml0ZSgieCIpCiAgZnI6c2Vlaygic2V0IikKICBhc3NlcnQoZnI6cmVhZCgiYWxsIikgPT0gIngiKSAgLS0gbm8gYnVmZmVyOyBvdXRwdXQgaXMgcmVhZHkKICBmOmNsb3NlKCkKICBmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgImEiKSkKICBhc3NlcnQoZjpzZXR2YnVmKCJsaW5lIikpCiAgZjp3cml0ZSgieCIpCiAgZnI6c2Vlaygic2V0IiwgMSkKICBhc3NlcnQoZnI6cmVhZCgiYWxsIikgPT0gIiIpICAgLS0gbGluZSBidWZmZXI7IG5vIG91dHB1dCB3aXRob3V0IGBcbicKICBmOndyaXRlKCJhXG4iKTpzZWVrKCJzZXQiLCAxKQogIGFzc2VydChmcjpyZWFkKCJhbGwiKSA9PSAieGFcbiIpICAtLSBub3cgd2UgaGF2ZSBhIHdob2xlIGxpbmUKICBmOmNsb3NlKCk7IGZyOmNsb3NlKCkKICBhc3NlcnQob3MucmVtb3ZlKGZpbGUpKQplbmQKCgppZiBub3QgX3NvZnQgdGhlbgogIHByaW50KCJ0ZXN0aW5nIGxhcmdlIGZpbGVzICg+IEJVRlNJWikiKQogIGlvLm91dHB1dChmaWxlKQogIGZvciBpPTEsNTAwMSBkbyBpby53cml0ZSgnMDEyMzQ1Njc4OTEyMycpIGVuZAogIGlvLndyaXRlKCdcbjEyMzQ2Jyk6Y2xvc2UoKQogIGlvLmlucHV0KGZpbGUpCiAgbG9jYWwgeCA9IGlvLnJlYWQoJ2EnKQogIGlvLmlucHV0KCk6c2Vlaygnc2V0JywgMCkKICBsb2NhbCB5ID0gaW8ucmVhZCgzMDAwMSkuLmlvLnJlYWQoMTAwNSkuLmlvLnJlYWQoMCkuLgogICAgICAgICAgICBpby5yZWFkKDEpLi5pby5yZWFkKDEwMDAwMykKICBhc3NlcnQoeCA9PSB5IGFuZCBzdHJpbmcubGVuKHgpID09IDUwMDEqMTMgKyA2KQogIGlvLmlucHV0KCk6c2Vlaygnc2V0JywgMCkKICB5ID0gaW8ucmVhZCgpICAtLSBodWdlIGxpbmUKICBhc3NlcnQoeCA9PSB5Li4nXG4nLi5pby5yZWFkKCkpCiAgYXNzZXJ0KGlvLnJlYWQoKSA9PSBuaWwpCiAgaW8uY2xvc2UoaW8uaW5wdXQoKSkKICBhc3NlcnQob3MucmVtb3ZlKGZpbGUpKQogIHggPSBuaWw7IHkgPSBuaWwKZW5kCgppZiBub3QgX3BvcnQgdGhlbgogIGxvY2FsIHByb2duYW1lCiAgZG8gIC0tIGdldCBuYW1lIG9mIHJ1bm5pbmcgZXhlY3V0YWJsZQogICAgbG9jYWwgYXJnID0gYXJnIG9yIEFSRwogICAgbG9jYWwgaSA9IDAKICAgIHdoaWxlIGFyZ1tpXSBkbyBpID0gaSAtIDEgZW5kCiAgICBwcm9nbmFtZSA9ICciJyAuLiBhcmdbaSArIDFdIC4uICciJwogIGVuZAogIHByaW50KCJ0ZXN0aW5nIHBvcGVuL3BjbG9zZSBhbmQgZXhlY3V0ZSIpCiAgbG9jYWwgdGVzdHMgPSB7CiAgICAtLSBjb21tYW5kLCAgIHdoYXQsICBjb2RlCiAgICB7ImxzID4gL2Rldi9udWxsIiwgIm9rIn0sCiAgICB7Im5vdC10by1iZS1mb3VuZC1jb21tYW5kIiwgImV4aXQifSwKICAgIHsiZXhpdCAzIiwgImV4aXQiLCAzfSwKICAgIHsiZXhpdCAxMjkiLCAiZXhpdCIsIDEyOX0sCiAgICB7ImtpbGwgLXMgSFVQICQkIiwgInNpZ25hbCIsIDF9LAogICAgeyJraWxsIC1zIEtJTEwgJCQiLCAic2lnbmFsIiwgOX0sCiAgICB7InNoIC1jICdraWxsIC1zIEhVUCAkJCciLCAiZXhpdCJ9LAogICAge3Byb2duYW1lIC4uICcgLWUgIiAiJywgIm9rIn0sCiAgICB7cHJvZ25hbWUgLi4gJyAtZSAib3MuZXhpdCgwLCB0cnVlKSInLCAib2sifSwKICAgIHtwcm9nbmFtZSAuLiAnIC1lICJvcy5leGl0KDIwLCB0cnVlKSInLCAiZXhpdCIsIDIwfSwKICB9CiAgcHJpbnQoIlxuKHNvbWUgZXJyb3IgbWVzc2FnZXMgYXJlIGV4cGVjdGVkIG5vdykiKQogIGZvciBfLCB2IGluIGlwYWlycyh0ZXN0cykgZG8KICAgIGxvY2FsIHgsIHksIHogPSBpby5wb3Blbih2WzFdKTpjbG9zZSgpCiAgICBsb2NhbCB4MSwgeTEsIHoxID0gb3MuZXhlY3V0ZSh2WzFdKQogICAgYXNzZXJ0KHggPT0geDEgYW5kIHkgPT0geTEgYW5kIHogPT0gejEpCiAgICBpZiB2WzJdID09ICJvayIgdGhlbgogICAgICBhc3NlcnQoeCBhbmQgeSA9PSAnZXhpdCcgYW5kIHogPT0gMCkKICAgIGVsc2UKICAgICAgYXNzZXJ0KG5vdCB4IGFuZCB5ID09IHZbMl0pICAgLS0gY29ycmVjdCBzdGF0dXMgYW5kICd3aGF0JwogICAgICAtLSBjb3JyZWN0IGNvZGUgaWYga25vd24gKGJ1dCBhbHdheXMgZGlmZmVyZW50IGZyb20gMCkKICAgICAgYXNzZXJ0KCh2WzNdID09IG5pbCBhbmQgeiA+IDApIG9yIHZbM10gPT0geikKICAgIGVuZAogIGVuZAplbmQKCgotLSB0ZXN0aW5nIHRtcGZpbGUKZiA9IGlvLnRtcGZpbGUoKQphc3NlcnQoaW8udHlwZShmKSA9PSAiZmlsZSIpCmY6d3JpdGUoImFsbyIpCmY6c2Vlaygic2V0IikKYXNzZXJ0KGY6cmVhZCJhIiA9PSAiYWxvIikKCmVuZCAtLX0KCnByaW50JysnCgpwcmludCgidGVzdGluZyBkYXRlL3RpbWUiKQoKYXNzZXJ0KG9zLmRhdGUoIiIpID09ICIiKQphc3NlcnQob3MuZGF0ZSgiISIpID09ICIiKQphc3NlcnQob3MuZGF0ZSgiXDBcMCIpID09ICJcMFwwIikKYXNzZXJ0KG9zLmRhdGUoIiFcMFwwIikgPT0gIlwwXDAiKQpsb2NhbCB4ID0gc3RyaW5nLnJlcCgiYSIsIDEwMDAwKQphc3NlcnQob3MuZGF0ZSh4KSA9PSB4KQpsb2NhbCB0ID0gb3MudGltZSgpCkQgPSBvcy5kYXRlKCIqdCIsIHQpCmFzc2VydChvcy5kYXRlKHN0cmluZy5yZXAoIiVkIiwgMTAwMCksIHQpID09CiAgICAgICBzdHJpbmcucmVwKG9zLmRhdGUoIiVkIiwgdCksIDEwMDApKQphc3NlcnQob3MuZGF0ZShzdHJpbmcucmVwKCIlIiwgMjAwKSkgPT0gc3RyaW5nLnJlcCgiJSIsIDEwMCkpCgpsb2NhbCB0ID0gb3MudGltZSgpCkQgPSBvcy5kYXRlKCIqdCIsIHQpCmxvYWQob3MuZGF0ZShbW2Fzc2VydChELnllYXI9PSVZIGFuZCBELm1vbnRoPT0lbSBhbmQgRC5kYXk9PSVkIGFuZAogIEQuaG91cj09JUggYW5kIEQubWluPT0lTSBhbmQgRC5zZWM9PSVTIGFuZAogIEQud2RheT09JXcrMSBhbmQgRC55ZGF5PT0laildXSwgdCkpKCkKCmNoZWNrZXJyKCJpbnZhbGlkIGNvbnZlcnNpb24gc3BlY2lmaWVyIiwgb3MuZGF0ZSwgIiUiKQpjaGVja2VycigiaW52YWxpZCBjb252ZXJzaW9uIHNwZWNpZmllciIsIG9zLmRhdGUsICIlOSIpCmNoZWNrZXJyKCJpbnZhbGlkIGNvbnZlcnNpb24gc3BlY2lmaWVyIiwgb3MuZGF0ZSwgIiUiKQpjaGVja2VycigiaW52YWxpZCBjb252ZXJzaW9uIHNwZWNpZmllciIsIG9zLmRhdGUsICIlTyIpCmNoZWNrZXJyKCJpbnZhbGlkIGNvbnZlcnNpb24gc3BlY2lmaWVyIiwgb3MuZGF0ZSwgIiVFIikKY2hlY2tlcnIoImludmFsaWQgY29udmVyc2lvbiBzcGVjaWZpZXIiLCBvcy5kYXRlLCAiJUVhIikKCmNoZWNrZXJyKCJub3QgYW4gaW50ZWdlciIsIG9zLnRpbWUsIHt5ZWFyPTEwMDAsIG1vbnRoPTEsIGRheT0xLCBob3VyPSd4J30pCmNoZWNrZXJyKCJub3QgYW4gaW50ZWdlciIsIG9zLnRpbWUsIHt5ZWFyPTEwMDAsIG1vbnRoPTEsIGRheT0xLCBob3VyPTEuNX0pCgpjaGVja2VycigibWlzc2luZyIsIG9zLnRpbWUsIHtob3VyID0gMTJ9KSAgIC0tIG1pc3NpbmcgZGF0ZQoKaWYgbm90IF9wb3J0IHRoZW4KICAtLSB0ZXN0IFBvc2l4LXNwZWNpZmljIG1vZGlmaWVycwogIGFzc2VydCh0eXBlKG9zLmRhdGUoIiVFeCIpKSA9PSAnc3RyaW5nJykKICBhc3NlcnQodHlwZShvcy5kYXRlKCIlT3kiKSkgPT0gJ3N0cmluZycpCgoKICAtLSB0ZXN0IG91dC1vZi1yYW5nZSBkYXRlcyAoYXQgbGVhc3QgZm9yIFVuaXgpCiAgaWYgbWF4aW50ID49IDJeNjIgdGhlbiAgLS0gY2Fubm90IGRvIHRoZXNlIHRlc3RzIGluIFNtYWxsIEx1YQogICAgLS0gbm8gYXJpdGggb3ZlcmZsb3dzCiAgICBjaGVja2Vycigib3V0LW9mLWJvdW5kIiwgb3MudGltZSwge3llYXIgPSAtbWF4aW50LCBtb250aCA9IDEsIGRheSA9IDF9KQogICAgaWYgc3RyaW5nLnBhY2tzaXplKCJpIikgPT0gNCB0aGVuICAgLS0gNC1ieXRlIGludHMKICAgICAgaWYgdGVzdGVycigib3V0LW9mLWJvdW5kIiwgb3MuZGF0ZSwgIiVZIiwgMl40MCkgdGhlbgogICAgICAgIC0tIHRpbWVfdCBoYXMgNCBieXRlcyBhbmQgdGhlcmVmb3JlIGNhbm5vdCByZXByZXNlbnQgeWVhciA0MDAwCiAgICAgICAgcHJpbnQoIiAgNC1ieXRlIHRpbWVfdCIpCiAgICAgICAgY2hlY2tlcnIoImNhbm5vdCBiZSByZXByZXNlbnRlZCIsIG9zLnRpbWUsIHt5ZWFyPTQwMDAsIG1vbnRoPTEsIGRheT0xfSkKICAgICAgZWxzZQogICAgICAgIC0tIHRpbWVfdCBoYXMgOCBieXRlczsgYW4gaW50IHllYXIgY2Fubm90IHJlcHJlc2VudCBhIGh1Z2UgdGltZQogICAgICAgIHByaW50KCIgIDgtYnl0ZSB0aW1lX3QiKQogICAgICAgIGNoZWNrZXJyKCJjYW5ub3QgYmUgcmVwcmVzZW50ZWQiLCBvcy5kYXRlLCAiJVkiLCAyXjYwKQogICAgICAgIC0tIGl0IHNob3VsZCBoYXZlIG5vIHByb2JsZW1zIHdpdGggeWVhciA0MDAwCiAgICAgICAgYXNzZXJ0KHRvbnVtYmVyKG9zLnRpbWV7eWVhcj00MDAwLCBtb250aD0xLCBkYXk9MX0pKQogICAgICBlbmQKICAgIGVsc2UgICAgLS0gOC1ieXRlIGludHMKICAgICAgLS0gYXNzdW1lIHRpbWVfdCBoYXMgOCBieXRlcyB0b28KICAgICAgcHJpbnQoIiAgOC1ieXRlIHRpbWVfdCIpCiAgICAgIGFzc2VydCh0b251bWJlcihvcy5kYXRlKCIlWSIsIDJeNjApKSkKICAgICAgLS0gYnV0IHN0aWxsIGNhbm5vdCByZXByZXNlbnQgYSBodWdlIHllYXIKICAgICAgY2hlY2tlcnIoImNhbm5vdCBiZSByZXByZXNlbnRlZCIsIG9zLnRpbWUsIHt5ZWFyPTJeNjAsIG1vbnRoPTEsIGRheT0xfSkKICAgIGVuZAogIGVuZAplbmQKCgpEID0gb3MuZGF0ZSgiISp0IiwgdCkKbG9hZChvcy5kYXRlKFtbIWFzc2VydChELnllYXI9PSVZIGFuZCBELm1vbnRoPT0lbSBhbmQgRC5kYXk9PSVkIGFuZAogIEQuaG91cj09JUggYW5kIEQubWluPT0lTSBhbmQgRC5zZWM9PSVTIGFuZAogIEQud2RheT09JXcrMSBhbmQgRC55ZGF5PT0laildXSwgdCkpKCkKCmRvCiAgbG9jYWwgRCA9IG9zLmRhdGUoIip0IikKICBsb2NhbCB0ID0gb3MudGltZShEKQogIGlmIEQuaXNkc3QgPT0gbmlsIHRoZW4KICAgIHByaW50KCJubyBkYXlsaWdodCBzYXZpbmcgaW5mb3JtYXRpb24iKQogIGVsc2UKICAgIGFzc2VydCh0eXBlKEQuaXNkc3QpID09ICdib29sZWFuJykKICBlbmQKICBELmlzZHN0ID0gbmlsCiAgbG9jYWwgdDEgPSBvcy50aW1lKEQpCiAgYXNzZXJ0KHQgPT0gdDEpICAgLS0gaWYgaXNkc3QgaXMgYWJzZW50IHVzZXMgY29ycmVjdCBkZWZhdWx0CmVuZAoKdCA9IG9zLnRpbWUoRCkKRC55ZWFyID0gRC55ZWFyLTE7CmxvY2FsIHQxID0gb3MudGltZShEKQotLSBhbGxvdyBmb3IgbGVhcCB5ZWFycwphc3NlcnQobWF0aC5hYnMob3MuZGlmZnRpbWUodCx0MSkvKDI0KjM2MDApIC0gMzY1KSA8IDIpCgotLSBzaG91bGQgbm90IHRha2UgbW9yZSB0aGFuIDEgc2Vjb25kIHRvIGV4ZWN1dGUgdGhlc2UgdHdvIGxpbmVzCnQgPSBvcy50aW1lKCkKdDEgPSBvcy50aW1lKG9zLmRhdGUoIip0IikpCmxvY2FsIGRpZmYgPSBvcy5kaWZmdGltZSh0MSx0KQphc3NlcnQoMCA8PSBkaWZmIGFuZCBkaWZmIDw9IDEpCmRpZmYgPSBvcy5kaWZmdGltZSh0LHQxKQphc3NlcnQoLTEgPD0gZGlmZiBhbmQgZGlmZiA8PSAwKQoKbG9jYWwgdDEgPSBvcy50aW1le3llYXI9MjAwMCwgbW9udGg9MTAsIGRheT0xLCBob3VyPTIzLCBtaW49MTJ9CmxvY2FsIHQyID0gb3MudGltZXt5ZWFyPTIwMDAsIG1vbnRoPTEwLCBkYXk9MSwgaG91cj0yMywgbWluPTEwLCBzZWM9MTl9CmFzc2VydChvcy5kaWZmdGltZSh0MSx0MikgPT0gNjAqMi0xOSkKCi0tIHNpbmNlIDUuMy4zLCAnb3MudGltZScgbm9ybWFsaXplcyB0YWJsZSBmaWVsZHMKdDEgPSB7eWVhciA9IDIwMDUsIG1vbnRoID0gMSwgZGF5ID0gMSwgaG91ciA9IDEsIG1pbiA9IDAsIHNlYyA9IC0zNjAyfQpvcy50aW1lKHQxKQphc3NlcnQodDEuZGF5ID09IDMxIGFuZCB0MS5tb250aCA9PSAxMiBhbmQgdDEueWVhciA9PSAyMDA0IGFuZAogICAgICAgdDEuaG91ciA9PSAyMyBhbmQgdDEubWluID09IDU5IGFuZCB0MS5zZWMgPT0gNTggYW5kCiAgICAgICB0MS55ZGF5ID09IDM2NikKCmlvLm91dHB1dChpby5zdGRvdXQpCmxvY2FsIHQgPSBvcy5kYXRlKCclZCAlbSAlWSAlSCAlTSAlUycpCmxvY2FsIGQsIG0sIGEsIGgsIG1pbiwgcyA9IHN0cmluZy5tYXRjaCh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoJWQrKSAoJWQrKSAoJWQrKSAoJWQrKSAoJWQrKSAoJWQrKSIpCmQgPSB0b251bWJlcihkKQptID0gdG9udW1iZXIobSkKYSA9IHRvbnVtYmVyKGEpCmggPSB0b251bWJlcihoKQptaW4gPSB0b251bWJlcihtaW4pCnMgPSB0b251bWJlcihzKQppby53cml0ZShzdHJpbmcuZm9ybWF0KCd0ZXN0IGRvbmUgb24gJTIuMmQvJTIuMmQvJWQnLCBkLCBtLCBhKSkKaW8ud3JpdGUoc3RyaW5nLmZvcm1hdCgnLCBhdCAlMi4yZDolMi4yZDolMi4yZFxuJywgaCwgbWluLCBzKSkKaW8ud3JpdGUoc3RyaW5nLmZvcm1hdCgnJXNcbicsIF9WRVJTSU9OKSkKCgo=