﻿{"id":89,"date":"2026-10-06T03:48:05","date_gmt":"2026-10-06T03:48:05","guid":{"rendered":"https:\/\/catventures.lol\/?page_id=89"},"modified":"2026-10-06T04:32:54","modified_gmt":"2026-10-06T04:32:54","slug":"gizmos-cupcake-conveyor","status":"publish","type":"page","link":"https:\/\/catventures.lol\/?page_id=89","title":{"rendered":"Gizmo&#8217;s Cupcake Conveyor"},"content":{"rendered":"\n<style>\n#app, #app * { box-sizing: border-box; }\n#app {\n  width: 100%;\n  max-width: 100%;\n  margin: 0 auto;\n  overflow: hidden;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  background: #3a2418;\n  color: #fff6e8;\n  font-family: \"Trebuchet MS\", \"Segoe UI\", sans-serif;\n  position: relative;\n  touch-action: none;\n}\n#app.fs-fallback {\n  position: fixed;\n  inset: 0;\n  width: 100dvw;\n  height: 100dvh;\n  max-width: none;\n  margin: 0;\n  z-index: 99999;\n  background: #1a0e08;\n  flex-direction: row;\n  align-items: center;\n  justify-content: center;\n  overflow: hidden;\n}\n#stage {\n  position: relative;\n  width: 100%;\n  max-width: 100%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  overflow: hidden;\n  line-height: 0;\n  touch-action: none;\n}\n#app.fs-fallback #stage {\n  width: auto;\n  height: auto;\n  max-width: calc(100dvw - 16px);\n  max-height: calc(100dvh - 16px);\n  flex: 0 0 auto;\n}\n#app canvas {\n  display: block;\n  background: #ffe8c8;\n  touch-action: none;\n  width: min(100%, calc((100vh - 40px) * 16 \/ 9));\n  max-width: 100%;\n  height: auto;\n  aspect-ratio: 16 \/ 9;\n  max-height: calc(100vh - 40px);\n  margin: 0 auto;\n}\n#app.fs-fallback canvas {\n  width: min(calc(100dvw - 8px), calc((100dvh - 8px) * 16 \/ 9)) !important;\n  height: min(calc(100dvh - 8px), calc((100dvw - 8px) * 9 \/ 16)) !important;\n  max-width: calc(100dvw - 16px);\n  max-height: calc(100dvh - 16px);\n  aspect-ratio: auto;\n  margin: 0;\n}\n#overlay {\n  position: absolute;\n  inset: 0;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background: rgba(40, 20, 10, 0.58);\n  padding: 12px;\n  overflow: auto;\n}\n#overlay[hidden] { display: none !important; }\n.card {\n  width: min(480px, 100%);\n  max-height: 100%;\n  overflow: auto;\n  background: #5a3424;\n  border: 1px solid #e07a32;\n  border-radius: 18px;\n  padding: 10px 14px 14px;\n  box-shadow: 0 18px 50px rgba(0, 0, 0, 0.45);\n  text-align: center;\n  color: #fff6e8;\n}\n.card[hidden] { display: none !important; }\n.card h1 {\n  font-family: Georgia, \"Palatino Linotype\", serif;\n  font-size: 22px;\n  line-height: 1.15;\n  margin: 0 0 8px;\n  color: #ffb070;\n}\n.howto, .controls {\n  margin: 0 0 6px;\n  line-height: 1.35;\n  font-size: 13px;\n  color: #f0d8c0;\n}\n.controls { color: #d8b898; font-size: 12px; text-align: left; }\n#high-score {\n  margin: 0 0 8px;\n  font-size: 13px;\n  color: #ffe08a;\n}\nbutton.go {\n  margin-top: 4px;\n  background: #e07a32;\n  color: #fffaf4;\n  border: 0;\n  border-radius: 999px;\n  padding: 12px 28px;\n  font: 700 17px\/1 \"Trebuchet MS\", \"Segoe UI\", sans-serif;\n  cursor: pointer;\n}\nbutton.go:hover { background: #c45e18; }\nbutton.go:focus-visible { outline: 3px solid #ffcc88; outline-offset: 2px; }\n.hero-cover {\n  width: min(140px, 36%);\n  height: auto;\n  border-radius: 12px;\n  margin: 0 auto 6px;\n  display: block;\n  box-shadow: 0 8px 24px rgba(0,0,0,0.35);\n}\n#hud-btns {\n  display: none;\n  position: absolute;\n  top: 8px;\n  right: 8px;\n  z-index: 8;\n  gap: 6px;\n  pointer-events: auto;\n}\n#hud-btns.on { display: flex; }\n#app.fs-fallback #hud-btns {\n  position: fixed;\n  top: max(6px, env(safe-area-inset-top, 0px));\n  right: max(6px, env(safe-area-inset-right, 0px));\n  z-index: 100000;\n  flex-direction: column;\n}\n#app.fs-fallback #hud-btns button {\n  width: 36px;\n  height: 36px;\n  font-size: 16px;\n}\n#hud-btns button {\n  width: 40px;\n  height: 40px;\n  border: 0;\n  border-radius: 12px;\n  background: rgba(40, 20, 12, 0.78);\n  color: #fff6e8;\n  font: 700 18px\/1 \"Trebuchet MS\", \"Segoe UI\", sans-serif;\n  cursor: pointer;\n  touch-action: none;\n}\n#rotate-gate {\n  display: none;\n  position: absolute;\n  inset: 0;\n  z-index: 12;\n  align-items: center;\n  justify-content: center;\n  background: rgba(20, 10, 6, 0.92);\n  color: #fff6e8;\n  text-align: center;\n  padding: 24px;\n  font: 700 20px\/1.35 \"Trebuchet MS\", \"Segoe UI\", sans-serif;\n}\n#app.fs-fallback #rotate-gate {\n  position: fixed;\n  z-index: 100001;\n}\n#rotate-gate.on { display: flex; }\n#load-err { color: #ff8899; min-height: 1.2em; }\nbody.gizmo-lock {\n  overflow: hidden !important;\n  touch-action: none;\n  overscroll-behavior: none;\n}\n<\/style>\n<div id=\"app\">\n<div id=\"stage\">\n<canvas id=\"game\" width=\"1280\" height=\"720\"><\/canvas>\n<div id=\"overlay\">\n<div class=\"card\" id=\"title-card\">\n<img decoding=\"async\" class=\"hero-cover\" id=\"cover-img\" alt=\"Gizmo at a bakery conveyor with cupcakes and broccoli\" src=\"https:\/\/catventures.lol\/wp-content\/uploads\/2026\/10\/cover-1.jpg\">\n<h1>Gizmo&#8217;s Cupcake Conveyor<\/h1>\n<p class=\"howto\">Swat sweets into the treat basket. Let evil veggies ride by. Build a combo!<\/p>\n<p class=\"controls\">Desktop: Move (A\/D or arrows). Jump (Space). Duck (Down). Swat (X or click). Pause (Esc).<br>Phone: drag to move, tap a sweet to swat, swipe up to jump, swipe down to duck.<\/p>\n<p id=\"high-score\">High score: 0<\/p>\n<p id=\"load-err\"><\/p>\n<button type=\"button\" class=\"go\" id=\"start-btn\">Play<\/button>\n<\/div>\n<div class=\"card\" id=\"end-card\" hidden>\n<h1 id=\"end-title\">Done<\/h1>\n<p class=\"howto\" id=\"end-msg\"><\/p>\n<button type=\"button\" class=\"go\" id=\"again-btn\">Play again<\/button>\n<\/div>\n<\/div>\n<div id=\"rotate-gate\">Turn your phone sideways<\/div>\n<\/div>\n<div id=\"hud-btns\">\n<button type=\"button\" id=\"btn-pause\" aria-label=\"Pause\">II<\/button>\n<button type=\"button\" id=\"btn-exit\" aria-label=\"Exit\">X<\/button>\n<\/div>\n<\/div>\n<script>\n(function () {\n  var el = document.createElement(\"script\");\n  el.text = atob(\"d2luZG93LkdJWk1PX0FTU0VUUyA9IHsKICBjb3ZlcjogImh0dHBzOi8vY2F0dmVudHVyZXMubG9sL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzEwL2NvdmVyLTEuanBnIiwKICBzaGVldDogImh0dHBzOi8vY2F0dmVudHVyZXMubG9sL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzEwL2dpem1vX3NoZWV0LnBuZyIsCiAgZXh0cmE6ICJodHRwczovL2NhdHZlbnR1cmVzLmxvbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8xMC9naXptb19leHRyYS5wbmciLAogIGN1cGNha2U6ICJodHRwczovL2NhdHZlbnR1cmVzLmxvbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8xMC9jdXBjYWtlLnBuZyIsCiAgYnJvY2NvbGk6ICJodHRwczovL2NhdHZlbnR1cmVzLmxvbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8xMC9icm9jY29saS5wbmciLAogIGJhc2tldDogImh0dHBzOi8vY2F0dmVudHVyZXMubG9sL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzEwL2Jhc2tldC5wbmciLAogIGNodXRlOiAiaHR0cHM6Ly9jYXR2ZW50dXJlcy5sb2wvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMTAvY2h1dGUucG5nIiwKICBjZWxsOiA5NiwKICBleHRyYVc6IDE0MCwKICBleHRyYUg6IDEyMCwKICBhbmltczogewogICAgaWRsZTogeyByb3c6IDAsIGNvdW50OiA0IH0sCiAgICB3YWxrOiB7IHJvdzogMSwgY291bnQ6IDUgfSwKICAgIHJ1bjogeyByb3c6IDIsIGNvdW50OiA0IH0sCiAgICBqdW1wOiB7IHJvdzogMywgY291bnQ6IDQgfSwKICAgIGZhbGw6IHsgcm93OiA0LCBjb3VudDogNCB9LAogICAgY3JvdWNoOiB7IHJvdzogNSwgY291bnQ6IDQgfSwKICAgIGF0dGFjazogeyByb3c6IDYsIGNvdW50OiA0IH0sCiAgICBoaXQ6IHsgcm93OiA3LCBjb3VudDogNCB9LAogICAgZGVhdGg6IHsgcm93OiA4LCBjb3VudDogMyB9CiAgfSwKICBleHRyYUNvdW50OiAzCn07CihmdW5jdGlvbiAoKSB7CiAgInVzZSBzdHJpY3QiOwoKICB2YXIgVyA9IDEyODA7CiAgdmFyIEggPSA3MjA7CiAgdmFyIEdSQVZJVFkgPSAyMjAwOwogIHZhciBNT1ZFX1NQRUVEID0gMzQwOwogIHZhciBKVU1QX1YgPSAtNzIwOwogIHZhciBTV0FUX01TID0gMzAwOwogIHZhciBTV0FUX0FDVElWRV9TVEFSVCA9IDAuMjg7CiAgdmFyIFNXQVRfQUNUSVZFX0VORCA9IDAuODU7CiAgdmFyIEhJVFNUT1BfTVMgPSA1MDsKICB2YXIgQkVMVF9ZID0gNDAwOwogIHZhciBCRUxUX0ggPSA1NjsKICB2YXIgRkxPT1JfWSA9IDQ5MDsKICB2YXIgU1BBV05fWCA9IDEzMjA7CiAgdmFyIENIVVRFX1ggPSAxMTgwOwogIHZhciBCQVNLRVRfWCA9IDcwOwogIHZhciBCQVNLRVRfWSA9IDQ1NTsKICB2YXIgSFNfS0VZID0gImdpem1vQ3VwY2FrZUhpZ2hTY29yZSI7CgogIHZhciBBU1NFVFMgPSB3aW5kb3cuR0laTU9fQVNTRVRTIHx8IHt9OwogIHZhciBjYW52YXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpOwogIHZhciBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm92ZXJsYXkiKTsKICB2YXIgdGl0bGVDYXJkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpdGxlLWNhcmQiKTsKICB2YXIgZW5kQ2FyZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlbmQtY2FyZCIpOwogIHZhciBlbmRUaXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlbmQtdGl0bGUiKTsKICB2YXIgZW5kTXNnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVuZC1tc2ciKTsKICB2YXIgc3RhcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic3RhcnQtYnRuIik7CiAgdmFyIGFnYWluQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFnYWluLWJ0biIpOwogIHZhciBsb2FkRXJyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxvYWQtZXJyIik7CiAgdmFyIGhpZ2hFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJoaWdoLXNjb3JlIik7CiAgdmFyIGFwcEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFwcCIpOwogIHZhciBodWRCdG5zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImh1ZC1idG5zIik7CiAgdmFyIGJ0blBhdXNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0bi1wYXVzZSIpOwogIHZhciBidG5FeGl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0bi1leGl0Iik7CiAgdmFyIHJvdGF0ZUdhdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm90YXRlLWdhdGUiKTsKCiAgaWYgKCFjYW52YXMpIHJldHVybjsKICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgY2FudmFzLndpZHRoID0gVzsKICBjYW52YXMuaGVpZ2h0ID0gSDsKCiAgdmFyIGltYWdlcyA9IHt9OwogIHZhciByZWFkeSA9IGZhbHNlOwogIHZhciBzdGF0ZSA9ICJ0aXRsZSI7CiAgdmFyIGtleXMgPSB7fTsKICB2YXIgc2NvcmUgPSAwOwogIHZhciBoaWdoU2NvcmUgPSAwOwogIHZhciBoZWFydHMgPSAzOwogIHZhciBjb21ibyA9IDA7CiAgdmFyIG11bHRpcGxpZXIgPSAxOwogIHZhciBiZWx0U3BlZWQgPSA4MDsKICB2YXIgdGltZUFsaXZlID0gMDsKICB2YXIgaGl0c3RvcCA9IDA7CiAgdmFyIHBhdXNlZCA9IGZhbHNlOwogIHZhciBnaXptbyA9IG51bGw7CiAgdmFyIGZvb2RzID0gW107CiAgdmFyIHBhcnRpY2xlcyA9IFtdOwogIHZhciBmbG9hdGVycyA9IFtdOwogIHZhciBzcGF3bkRpcmVjdG9yID0gbnVsbDsKICB2YXIgYXVkaW9DdHggPSBudWxsOwogIHZhciBsYXN0VHMgPSAwOwogIHZhciBzY2FsZSA9IDE7CiAgdmFyIHRvdWNoTW9kZSA9IGZhbHNlOwogIHZhciBtb2JpbGVQbGF5ID0gZmFsc2U7CiAgdmFyIHVzaW5nRnNGYWxsYmFjayA9IGZhbHNlOwogIHZhciB0b3VjaFRhcmdldFggPSBudWxsOwogIHZhciB0b3VjaEp1bXAgPSBmYWxzZTsKICB2YXIgdG91Y2hEdWNrID0gZmFsc2U7CiAgdmFyIHRvdWNoRHVja1QgPSAwOwogIHZhciBhdXRvU3dhdEZvb2RJZCA9IG51bGw7CiAgdmFyIHBvaW50ZXJEb3duID0gZmFsc2U7CiAgdmFyIHBvaW50ZXJTdGFydCA9IG51bGw7CiAgdmFyIHBvaW50ZXJMYXN0ID0gbnVsbDsKICB2YXIgcG9pbnRlck1vdmVkID0gZmFsc2U7CiAgdmFyIHN3aXBlSGFuZGxlZCA9IGZhbHNlOwoKICB0cnkgewogICAgaGlnaFNjb3JlID0gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oSFNfS0VZKSB8fCAiMCIsIDEwKSB8fCAwOwogIH0gY2F0Y2ggKGUpIHsKICAgIGhpZ2hTY29yZSA9IDA7CiAgfQogIGlmIChoaWdoRWwpIGhpZ2hFbC50ZXh0Q29udGVudCA9ICJIaWdoIHNjb3JlOiAiICsgaGlnaFNjb3JlOwoKICBmdW5jdGlvbiBsb2FkSW1hZ2UodXJsKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgaW1nID0gbmV3IEltYWdlKCk7CiAgICAgIGltZy5jcm9zc09yaWdpbiA9ICJhbm9ueW1vdXMiOwogICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkgeyByZXNvbHZlKGltZyk7IH07CiAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24gKCkgeyByZWplY3QobmV3IEVycm9yKCJGYWlsZWQgdG8gbG9hZCAiICsgdXJsKSk7IH07CiAgICAgIGltZy5zcmMgPSB1cmw7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGxvYWRBbGwoKSB7CiAgICB2YXIgbWFwID0gewogICAgICBzaGVldDogQVNTRVRTLnNoZWV0LAogICAgICBleHRyYTogQVNTRVRTLmV4dHJhLAogICAgICBjdXBjYWtlOiBBU1NFVFMuY3VwY2FrZSwKICAgICAgYnJvY2NvbGk6IEFTU0VUUy5icm9jY29saSwKICAgICAgYmFza2V0OiBBU1NFVFMuYmFza2V0LAogICAgICBjaHV0ZTogQVNTRVRTLmNodXRlCiAgICB9OwogICAgdmFyIGtleXNMaXN0ID0gT2JqZWN0LmtleXMobWFwKTsKICAgIHJldHVybiBQcm9taXNlLmFsbChrZXlzTGlzdC5tYXAoZnVuY3Rpb24gKGspIHsKICAgICAgaWYgKCFtYXBba10pIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIk1pc3NpbmcgYXNzZXQgIiArIGspKTsKICAgICAgcmV0dXJuIGxvYWRJbWFnZShtYXBba10pLnRoZW4oZnVuY3Rpb24gKGltZykgeyBpbWFnZXNba10gPSBpbWc7IH0pOwogICAgfSkpOwogIH0KCiAgZnVuY3Rpb24gZW5zdXJlQXVkaW8oKSB7CiAgICBpZiAoYXVkaW9DdHgpIHJldHVybjsKICAgIHZhciBBQyA9IHdpbmRvdy5BdWRpb0NvbnRleHQgfHwgd2luZG93LndlYmtpdEF1ZGlvQ29udGV4dDsKICAgIGlmICghQUMpIHJldHVybjsKICAgIGF1ZGlvQ3R4ID0gbmV3IEFDKCk7CiAgfQoKICBmdW5jdGlvbiBiZWVwKGZyZXEsIGR1ciwgdHlwZSwgZ2FpbikgewogICAgaWYgKCFhdWRpb0N0eCkgcmV0dXJuOwogICAgdmFyIHQwID0gYXVkaW9DdHguY3VycmVudFRpbWU7CiAgICB2YXIgbyA9IGF1ZGlvQ3R4LmNyZWF0ZU9zY2lsbGF0b3IoKTsKICAgIHZhciBnID0gYXVkaW9DdHguY3JlYXRlR2FpbigpOwogICAgby50eXBlID0gdHlwZSB8fCAic2luZSI7CiAgICBvLmZyZXF1ZW5jeS52YWx1ZSA9IGZyZXE7CiAgICBnLmdhaW4uc2V0VmFsdWVBdFRpbWUoZ2FpbiB8fCAwLjEyLCB0MCk7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAwMSwgdDAgKyBkdXIpOwogICAgby5jb25uZWN0KGcpOwogICAgZy5jb25uZWN0KGF1ZGlvQ3R4LmRlc3RpbmF0aW9uKTsKICAgIG8uc3RhcnQodDApOwogICAgby5zdG9wKHQwICsgZHVyICsgMC4wMik7CiAgfQoKICBmdW5jdGlvbiBkaW5nKCkgewogICAgYmVlcCg4ODAsIDAuMDgsICJ0cmlhbmdsZSIsIDAuMTQpOwogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGJlZXAoMTMyMCwgMC4xLCAidHJpYW5nbGUiLCAwLjEpOyB9LCA0MCk7CiAgfQoKICBmdW5jdGlvbiBib25rKCkgewogICAgYmVlcCgxMjAsIDAuMTgsICJzcXVhcmUiLCAwLjE2KTsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBiZWVwKDgwLCAwLjIyLCAic2F3dG9vdGgiLCAwLjEpOyB9LCA1MCk7CiAgfQoKICBmdW5jdGlvbiBhbmltTWV0YShuYW1lKSB7CiAgICB2YXIgYSA9IChBU1NFVFMuYW5pbXMgfHwge30pW25hbWVdOwogICAgaWYgKGEpIHJldHVybiBhOwogICAgcmV0dXJuIHsgcm93OiAwLCBjb3VudDogMSB9OwogIH0KCiAgZnVuY3Rpb24gZnJhbWVSZWN0KGFuaW0sIGZyYW1lKSB7CiAgICB2YXIgbWV0YSA9IGFuaW1NZXRhKGFuaW0pOwogICAgdmFyIGNlbGwgPSBBU1NFVFMuY2VsbCB8fCA5NjsKICAgIHZhciBjb2xzID0gTWF0aC5mbG9vcigoaW1hZ2VzLnNoZWV0LndpZHRoIHx8IDQ4MCkgLyBjZWxsKTsKICAgIHZhciBmID0gZnJhbWUgJSBtZXRhLmNvdW50OwogICAgcmV0dXJuIHsgc3g6IGYgKiBjZWxsLCBzeTogbWV0YS5yb3cgKiBjZWxsLCBzdzogY2VsbCwgc2g6IGNlbGwgfTsKICB9CgogIGZ1bmN0aW9uIFBsYXllcigpIHsKICAgIHRoaXMueCA9IDM2MDsKICAgIHRoaXMueSA9IEZMT09SX1k7CiAgICB0aGlzLnZ4ID0gMDsKICAgIHRoaXMudnkgPSAwOwogICAgdGhpcy53ID0gMTI4OwogICAgdGhpcy5oID0gMTI4OwogICAgdGhpcy5mYWNpbmcgPSAxOwogICAgdGhpcy5vbkdyb3VuZCA9IHRydWU7CiAgICB0aGlzLmR1Y2tpbmcgPSBmYWxzZTsKICAgIHRoaXMuc3dhdHRpbmcgPSBmYWxzZTsKICAgIHRoaXMuc3dhdFQgPSAwOwogICAgdGhpcy5hbmltID0gImlkbGUiOwogICAgdGhpcy5mcmFtZSA9IDA7CiAgICB0aGlzLmZyYW1lVCA9IDA7CiAgICB0aGlzLmhpdEZsYXNoID0gMDsKICAgIHRoaXMucmVhY3QgPSBudWxsOwogICAgdGhpcy5yZWFjdFQgPSAwOwogIH0KCiAgUGxheWVyLnByb3RvdHlwZS5iYiA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBoID0gdGhpcy5kdWNraW5nID8gdGhpcy5oICogMC42NSA6IHRoaXMuaDsKICAgIHZhciB5ID0gdGhpcy55IC0gaDsKICAgIHJldHVybiB7IHg6IHRoaXMueCAtIHRoaXMudyAqIDAuNCwgeTogeSwgdzogdGhpcy53ICogMC44LCBoOiBoIH07CiAgfTsKCiAgUGxheWVyLnByb3RvdHlwZS5zd2F0Qm94ID0gZnVuY3Rpb24gKCkgewogICAgaWYgKCF0aGlzLnN3YXR0aW5nKSByZXR1cm4gbnVsbDsKICAgIHZhciBwID0gdGhpcy5zd2F0VCAvIChTV0FUX01TIC8gMTAwMCk7CiAgICBpZiAocCA8IFNXQVRfQUNUSVZFX1NUQVJUIHx8IHAgPiBTV0FUX0FDVElWRV9FTkQpIHJldHVybiBudWxsOwogICAgdmFyIGJiID0gdGhpcy5iYigpOwogICAgdmFyIHJlYWNoID0gOTI7CiAgICB2YXIgaHggPSB0aGlzLmZhY2luZyA+IDAgPyBiYi54ICsgYmIudyAqIDAuNTUgOiBiYi54IC0gcmVhY2g7CiAgICAvLyBDb3ZlciB0aGUgY29udmV5b3IgaGVpZ2h0IHNvIHBhdyBjb25uZWN0cyB3aXRoIGJlbHQgaXRlbXMKICAgIHZhciBoeSA9IE1hdGgubWluKGJiLnkgKyAxMCwgQkVMVF9ZIC0gNzApOwogICAgdmFyIGhoID0gTWF0aC5tYXgoYmIuaCAqIDAuNywgQkVMVF9ZICsgQkVMVF9IIC0gaHkpOwogICAgcmV0dXJuIHsgeDogaHgsIHk6IGh5LCB3OiByZWFjaCwgaDogaGggfTsKICB9OwoKICBQbGF5ZXIucHJvdG90eXBlLnN0YXJ0U3dhdCA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0aGlzLnN3YXR0aW5nKSByZXR1cm47CiAgICBpZiAodGhpcy5yZWFjdCA9PT0gImhpdCIpIHJldHVybjsKICAgIHRoaXMuc3dhdHRpbmcgPSB0cnVlOwogICAgdGhpcy5zd2F0VCA9IDA7CiAgICB0aGlzLmFuaW0gPSAiYXR0YWNrIjsKICAgIHRoaXMuZnJhbWUgPSAwOwogICAgdGhpcy5mcmFtZVQgPSAwOwogICAgdGhpcy5fc3dhdEhpdHMgPSB7fTsKICB9OwoKICBQbGF5ZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChkdCkgewogICAgdmFyIGxlZnQgPSBrZXlzWyJBcnJvd0xlZnQiXSB8fCBrZXlzWyJhIl0gfHwga2V5c1siQSJdOwogICAgdmFyIHJpZ2h0ID0ga2V5c1siQXJyb3dSaWdodCJdIHx8IGtleXNbImQiXSB8fCBrZXlzWyJEIl07CiAgICB2YXIganVtcCA9IGtleXNbIiAiXSB8fCBrZXlzWyJBcnJvd1VwIl0gfHwga2V5c1sidyJdIHx8IGtleXNbIlciXSB8fCB0b3VjaEp1bXA7CiAgICB2YXIgZHVjayA9IGtleXNbIkFycm93RG93biJdIHx8IGtleXNbInMiXSB8fCBrZXlzWyJTIl0gfHwgdG91Y2hEdWNrOwoKICAgIGlmICh0aGlzLmhpdEZsYXNoID4gMCkgdGhpcy5oaXRGbGFzaCAtPSBkdDsKICAgIGlmICh0aGlzLnJlYWN0KSB7CiAgICAgIHRoaXMucmVhY3RUIC09IGR0OwogICAgICBpZiAodGhpcy5yZWFjdFQgPD0gMCkgdGhpcy5yZWFjdCA9IG51bGw7CiAgICB9CiAgICBpZiAodG91Y2hEdWNrVCA+IDApIHsKICAgICAgdG91Y2hEdWNrVCAtPSBkdDsKICAgICAgaWYgKHRvdWNoRHVja1QgPD0gMCkgdG91Y2hEdWNrID0gZmFsc2U7CiAgICB9CiAgICB0b3VjaEp1bXAgPSBmYWxzZTsKCiAgICB0aGlzLmR1Y2tpbmcgPSAhIWR1Y2sgJiYgdGhpcy5vbkdyb3VuZCAmJiAhdGhpcy5zd2F0dGluZzsKCiAgICBpZiAoIXRoaXMuc3dhdHRpbmcgJiYgIXRoaXMuZHVja2luZykgewogICAgICBpZiAodG91Y2hUYXJnZXRYICE9IG51bGwgJiYgdG91Y2hNb2RlKSB7CiAgICAgICAgdmFyIGR4ID0gdG91Y2hUYXJnZXRYIC0gdGhpcy54OwogICAgICAgIGlmIChNYXRoLmFicyhkeCkgPCAxMikgewogICAgICAgICAgdGhpcy52eCA9IDA7CiAgICAgICAgICB0aGlzLnggPSB0b3VjaFRhcmdldFg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMudnggPSBkeCA+IDAgPyBNT1ZFX1NQRUVEIDogLU1PVkVfU1BFRUQ7CiAgICAgICAgICB0aGlzLmZhY2luZyA9IGR4ID4gMCA\/IDEgOiAtMTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobGVmdCkgeyB0aGlzLnZ4ID0gLU1PVkVfU1BFRUQ7IHRoaXMuZmFjaW5nID0gLTE7IH0KICAgICAgZWxzZSBpZiAocmlnaHQpIHsgdGhpcy52eCA9IE1PVkVfU1BFRUQ7IHRoaXMuZmFjaW5nID0gMTsgfQogICAgICBlbHNlIHRoaXMudnggPSAwOwogICAgfSBlbHNlIGlmICh0aGlzLmR1Y2tpbmcpIHsKICAgICAgdGhpcy52eCA9IDA7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnZ4ICo9IDAuODU7CiAgICB9CgogICAgaWYgKGp1bXAgJiYgdGhpcy5vbkdyb3VuZCAmJiAhdGhpcy5kdWNraW5nICYmICF0aGlzLnN3YXR0aW5nKSB7CiAgICAgIHRoaXMudnkgPSBKVU1QX1Y7CiAgICAgIHRoaXMub25Hcm91bmQgPSBmYWxzZTsKICAgIH0KCiAgICB0aGlzLnZ5ICs9IEdSQVZJVFkgKiBkdDsKICAgIHRoaXMueCArPSB0aGlzLnZ4ICogZHQ7CiAgICB0aGlzLnkgKz0gdGhpcy52eSAqIGR0OwoKICAgIHZhciBtaW5YID0gNDA7CiAgICB2YXIgbWF4WCA9IFcgLSA0MDsKICAgIGlmICh0aGlzLnggPCBtaW5YKSB0aGlzLnggPSBtaW5YOwogICAgaWYgKHRoaXMueCA+IG1heFgpIHRoaXMueCA9IG1heFg7CgogICAgaWYgKHRoaXMueSA+PSBGTE9PUl9ZKSB7CiAgICAgIHRoaXMueSA9IEZMT09SX1k7CiAgICAgIHRoaXMudnkgPSAwOwogICAgICB0aGlzLm9uR3JvdW5kID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMub25Hcm91bmQgPSBmYWxzZTsKICAgIH0KCiAgICBpZiAodGhpcy5zd2F0dGluZykgewogICAgICB0aGlzLnN3YXRUICs9IGR0OwogICAgICB0aGlzLmFuaW0gPSAiYXR0YWNrIjsKICAgICAgdmFyIG1ldGEgPSBhbmltTWV0YSgiYXR0YWNrIik7CiAgICAgIHRoaXMuZnJhbWUgPSBNYXRoLm1pbihtZXRhLmNvdW50IC0gMSwgTWF0aC5mbG9vcigodGhpcy5zd2F0VCAvIChTV0FUX01TIC8gMTAwMCkpICogbWV0YS5jb3VudCkpOwogICAgICBpZiAodGhpcy5zd2F0VCA+PSBTV0FUX01TIC8gMTAwMCkgewogICAgICAgIHRoaXMuc3dhdHRpbmcgPSBmYWxzZTsKICAgICAgICB0aGlzLnN3YXRUID0gMDsKICAgICAgfQogICAgfSBlbHNlIGlmICh0aGlzLnJlYWN0ID09PSAiaGl0IikgewogICAgICB0aGlzLmFuaW0gPSAiaGl0IjsKICAgIH0gZWxzZSBpZiAodGhpcy5yZWFjdCA9PT0gImhhcHB5IikgewogICAgICB0aGlzLmFuaW0gPSAiZXh0cmEiOwogICAgfSBlbHNlIGlmICghdGhpcy5vbkdyb3VuZCkgewogICAgICB0aGlzLmFuaW0gPSB0aGlzLnZ5IDwgMCA\/ICJqdW1wIiA6ICJmYWxsIjsKICAgIH0gZWxzZSBpZiAodGhpcy5kdWNraW5nKSB7CiAgICAgIHRoaXMuYW5pbSA9ICJjcm91Y2giOwogICAgfSBlbHNlIGlmIChNYXRoLmFicyh0aGlzLnZ4KSA+IDIwKSB7CiAgICAgIHRoaXMuYW5pbSA9IE1hdGguYWJzKHRoaXMudngpID4gMjgwID8gInJ1biIgOiAid2FsayI7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmFuaW0gPSAiaWRsZSI7CiAgICB9CgogICAgdGhpcy5mcmFtZVQgKz0gZHQ7CiAgICB2YXIgZnBzID0gdGhpcy5hbmltID09PSAicnVuIiA\/IDEyIDogODsKICAgIGlmICghdGhpcy5zd2F0dGluZyAmJiB0aGlzLmFuaW0gIT09ICJleHRyYSIpIHsKICAgICAgaWYgKHRoaXMuZnJhbWVUID4gMSAvIGZwcykgewogICAgICAgIHRoaXMuZnJhbWVUID0gMDsKICAgICAgICB2YXIgbSA9IGFuaW1NZXRhKHRoaXMuYW5pbSA9PT0gImV4dHJhIiA\/ICJpZGxlIiA6IHRoaXMuYW5pbSk7CiAgICAgICAgdGhpcy5mcmFtZSA9ICh0aGlzLmZyYW1lICsgMSkgJSBtLmNvdW50OwogICAgICB9CiAgICB9CiAgfTsKCiAgUGxheWVyLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24gKGMpIHsKICAgIHZhciBpbWc7CiAgICB2YXIgc3gsIHN5LCBzdywgc2g7CiAgICB2YXIgZHJhd1cgPSB0aGlzLnc7CiAgICB2YXIgZHJhd0ggPSB0aGlzLmg7CiAgICBpZiAodGhpcy5hbmltID09PSAiZXh0cmEiICYmIGltYWdlcy5leHRyYSkgewogICAgICBpbWcgPSBpbWFnZXMuZXh0cmE7CiAgICAgIHZhciBldyA9IEFTU0VUUy5leHRyYVcgfHwgMTQwOwogICAgICB2YXIgZWggPSBBU1NFVFMuZXh0cmFIIHx8IDEyMDsKICAgICAgdmFyIGVpID0gTWF0aC5taW4oKEFTU0VUUy5leHRyYUNvdW50IHx8IDMpIC0gMSwgMSk7CiAgICAgIHN4ID0gZWkgKiBldzsgc3kgPSAwOyBzdyA9IGV3OyBzaCA9IGVoOwogICAgICBkcmF3VyA9IDEzMDsgZHJhd0ggPSAxMTI7CiAgICB9IGVsc2UgewogICAgICBpbWcgPSBpbWFnZXMuc2hlZXQ7CiAgICAgIHZhciByID0gZnJhbWVSZWN0KHRoaXMuYW5pbSA9PT0gImV4dHJhIiA\/ICJpZGxlIiA6IHRoaXMuYW5pbSwgdGhpcy5mcmFtZSk7CiAgICAgIHN4ID0gci5zeDsgc3kgPSByLnN5OyBzdyA9IHIuc3c7IHNoID0gci5zaDsKICAgIH0KCiAgICBjLnNhdmUoKTsKICAgIGMudHJhbnNsYXRlKHRoaXMueCwgdGhpcy55KTsKICAgIGlmICh0aGlzLmZhY2luZyA8IDApIGMuc2NhbGUoLTEsIDEpOwogICAgaWYgKHRoaXMuaGl0Rmxhc2ggPiAwKSBjLmdsb2JhbEFscGhhID0gMC41NSArIDAuNDUgKiBNYXRoLmFicyhNYXRoLnNpbih0aGlzLmhpdEZsYXNoICogMzApKTsKICAgIGMuZHJhd0ltYWdlKGltZywgc3gsIHN5LCBzdywgc2gsIC1kcmF3VyAvIDIsIC1kcmF3SCwgZHJhd1csIGRyYXdIKTsKICAgIGMucmVzdG9yZSgpOwoKICAgIC8vIGRlYnVnIGhpdGJveCBvcHRpb25hbCBvZmYKICB9OwoKICBmdW5jdGlvbiBGb29kKGtpbmQsIHgpIHsKICAgIHRoaXMua2luZCA9IGtpbmQ7CiAgICB0aGlzLnggPSB4OwogICAgdGhpcy55ID0gQkVMVF9ZIC0gODsKICAgIHRoaXMudnggPSAwOwogICAgdGhpcy52eSA9IDA7CiAgICB0aGlzLncgPSBraW5kID09PSAiY3VwY2FrZSIgPyA3MiA6IDc2OwogICAgdGhpcy5oID0ga2luZCA9PT0gImN1cGNha2UiID8gNzIgOiA3NjsKICAgIHRoaXMub25CZWx0ID0gdHJ1ZTsKICAgIHRoaXMuZmx5aW5nID0gZmFsc2U7CiAgICB0aGlzLnNwaW4gPSAwOwogICAgdGhpcy5zcGluViA9IDA7CiAgICB0aGlzLnNxdWFzaCA9IDE7CiAgICB0aGlzLmRlYWQgPSBmYWxzZTsKICAgIHRoaXMudG9CYXNrZXQgPSBmYWxzZTsKICAgIHRoaXMuYmFzZVNjb3JlID0ga2luZCA9PT0gImN1cGNha2UiID8gMTAwIDogMDsKICAgIHRoaXMuaWQgPSBGb29kLl9pZCsrOwogIH0KICBGb29kLl9pZCA9IDE7CgogIEZvb2QucHJvdG90eXBlLmJiID0gZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIHsgeDogdGhpcy54IC0gdGhpcy53ICogMC40LCB5OiB0aGlzLnkgLSB0aGlzLmggKiAwLjg1LCB3OiB0aGlzLncgKiAwLjgsIGg6IHRoaXMuaCAqIDAuOCB9OwogIH07CgogIEZvb2QucHJvdG90eXBlLmxhdW5jaFRvQmFza2V0ID0gZnVuY3Rpb24gKCkgewogICAgdGhpcy5vbkJlbHQgPSBmYWxzZTsKICAgIHRoaXMuZmx5aW5nID0gdHJ1ZTsKICAgIHRoaXMudG9CYXNrZXQgPSB0cnVlOwogICAgdmFyIHR4ID0gQkFTS0VUX1ggKyA0MDsKICAgIHZhciB0eSA9IEJBU0tFVF9ZICsgMjA7CiAgICB2YXIgZHggPSB0eCAtIHRoaXMueDsKICAgIHZhciBkeSA9IHR5IC0gdGhpcy55OwogICAgdGhpcy52eCA9IGR4ICogMi4yOwogICAgdGhpcy52eSA9IE1hdGgubWluKC00MjAsIGR5ICogMi4wIC0gMjAwKTsKICAgIHRoaXMuc3BpblYgPSAoTWF0aC5yYW5kb20oKSA+IDAuNSA\/IDEgOiAtMSkgKiAoOCArIE1hdGgucmFuZG9tKCkgKiA2KTsKICAgIHRoaXMuc3F1YXNoID0gMC43OwogIH07CgogIEZvb2QucHJvdG90eXBlLmxhdW5jaEJvbmsgPSBmdW5jdGlvbiAoKSB7CiAgICB0aGlzLm9uQmVsdCA9IGZhbHNlOwogICAgdGhpcy5mbHlpbmcgPSB0cnVlOwogICAgdGhpcy50b0Jhc2tldCA9IHRydWU7CiAgICB0aGlzLnZ4ID0gLTE4MCAtIE1hdGgucmFuZG9tKCkgKiA4MDsKICAgIHRoaXMudnkgPSAtMzgwOwogICAgdGhpcy5zcGluViA9IDEwOwogICAgdGhpcy5zcXVhc2ggPSAwLjc1OwogIH07CgogIEZvb2QucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChkdCwgc3BlZWQpIHsKICAgIGlmICh0aGlzLmRlYWQpIHJldHVybjsKICAgIGlmICh0aGlzLnNxdWFzaCA8IDEpIHsKICAgICAgdGhpcy5zcXVhc2ggKz0gZHQgKiAzOwogICAgICBpZiAodGhpcy5zcXVhc2ggPiAxKSB0aGlzLnNxdWFzaCA9IDE7CiAgICB9CiAgICBpZiAodGhpcy5vbkJlbHQpIHsKICAgICAgdGhpcy54IC09IHNwZWVkICogZHQ7CiAgICAgIHRoaXMueSA9IEJFTFRfWSAtIDggKyBNYXRoLnNpbih0aGlzLnggKiAwLjA0KSAqIDI7CiAgICAgIC8vIEJlbHQgcnVucyByaWdodC10by1sZWZ0OyBpdGVtcyBleGl0IGF0IHRoZSBsZWZ0IGVuZC4KICAgICAgLy8gTWlzc2VkIGN1cGNha2VzIGJyZWFrIGNvbWJvLiBVbnN3YXR0ZWQgYnJvY2NvbGkgY291bnRzIGFzIHNhZmVseSBkaXNwb3NlZC4KICAgICAgaWYgKHRoaXMueCA8IDUwKSB7CiAgICAgICAgdGhpcy5kZWFkID0gdHJ1ZTsKICAgICAgICBpZiAodGhpcy5raW5kID09PSAiY3VwY2FrZSIpIG9uTWlzc1N3ZWV0KCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodGhpcy5mbHlpbmcpIHsKICAgICAgdGhpcy52eSArPSBHUkFWSVRZICogMC44NSAqIGR0OwogICAgICB0aGlzLnggKz0gdGhpcy52eCAqIGR0OwogICAgICB0aGlzLnkgKz0gdGhpcy52eSAqIGR0OwogICAgICB0aGlzLnNwaW4gKz0gdGhpcy5zcGluViAqIGR0OwogICAgICBpZiAodGhpcy50b0Jhc2tldCAmJiB0aGlzLnkgPiBCQVNLRVRfWSArIDEwICYmIHRoaXMueCA8IEJBU0tFVF9YICsgMTEwKSB7CiAgICAgICAgdGhpcy5kZWFkID0gdHJ1ZTsKICAgICAgICBpZiAodGhpcy5raW5kID09PSAiY3VwY2FrZSIpIG9uQ2F0Y2hTd2VldCh0aGlzKTsKICAgICAgICBlbHNlIG9uQ2F0Y2hWZWcodGhpcyk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy55ID4gSCArIDgwIHx8IHRoaXMueCA8IC0xMDAgfHwgdGhpcy54ID4gVyArIDEwMCkgewogICAgICAgIHRoaXMuZGVhZCA9IHRydWU7CiAgICAgICAgaWYgKHRoaXMua2luZCA9PT0gImN1cGNha2UiICYmIHRoaXMudG9CYXNrZXQpIG9uTWlzc1N3ZWV0KCk7CiAgICAgIH0KICAgIH0KICB9OwoKICBGb29kLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24gKGMpIHsKICAgIHZhciBpbWcgPSB0aGlzLmtpbmQgPT09ICJjdXBjYWtlIiA\/IGltYWdlcy5jdXBjYWtlIDogaW1hZ2VzLmJyb2Njb2xpOwogICAgaWYgKCFpbWcpIHJldHVybjsKICAgIGMuc2F2ZSgpOwogICAgYy50cmFuc2xhdGUodGhpcy54LCB0aGlzLnkgLSB0aGlzLmggKiAwLjUpOwogICAgYy5yb3RhdGUodGhpcy5zcGluKTsKICAgIGMuc2NhbGUodGhpcy5zcXVhc2gsIDIgLSB0aGlzLnNxdWFzaCk7CiAgICBjLmRyYXdJbWFnZShpbWcsIC10aGlzLncgLyAyLCAtdGhpcy5oIC8gMiwgdGhpcy53LCB0aGlzLmgpOwogICAgYy5yZXN0b3JlKCk7CiAgfTsKCiAgZnVuY3Rpb24gU3Bhd25EaXJlY3RvcigpIHsKICAgIHRoaXMucXVldWUgPSBbXTsKICAgIHRoaXMudGltZXIgPSAxLjI7CiAgICB0aGlzLnBhdHRlcm5zID0gewogICAgICBFQVNZXzAxOiBbImN1cGNha2UiLCAiY3VwY2FrZSIsICJnYXAiLCAiYnJvY2NvbGkiLCAiY3VwY2FrZSJdLAogICAgICBFQVNZXzAyOiBbImN1cGNha2UiLCAiZ2FwIiwgImJyb2Njb2xpIiwgImdhcCIsICJjdXBjYWtlIl0sCiAgICAgIE1FRElVTV8wMTogWyJjdXBjYWtlIiwgImN1cGNha2UiLCAiYnJvY2NvbGkiLCAiY3VwY2FrZSIsICJicm9jY29saSJdCiAgICB9OwogICAgdGhpcy5wYXR0ZXJuTmFtZXMgPSBbIkVBU1lfMDEiLCAiRUFTWV8wMiIsICJNRURJVU1fMDEiXTsKICAgIHRoaXMubG9hZFBhdHRlcm4oIkVBU1lfMDEiKTsKICB9CgogIFNwYXduRGlyZWN0b3IucHJvdG90eXBlLmxvYWRQYXR0ZXJuID0gZnVuY3Rpb24gKG5hbWUpIHsKICAgIHZhciBwID0gdGhpcy5wYXR0ZXJuc1tuYW1lXSB8fCB0aGlzLnBhdHRlcm5zLkVBU1lfMDE7CiAgICB0aGlzLnF1ZXVlID0gcC5zbGljZSgpOwogICAgdGhpcy5jdXJyZW50TmFtZSA9IG5hbWU7CiAgfTsKCiAgU3Bhd25EaXJlY3Rvci5wcm90b3R5cGUucGlja1BhdHRlcm4gPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgbmFtZTsKICAgIGlmICh0aW1lQWxpdmUgPCAyNSkgewogICAgICBuYW1lID0gTWF0aC5yYW5kb20oKSA8IDAuNSA\/ICJFQVNZXzAxIiA6ICJFQVNZXzAyIjsKICAgIH0gZWxzZSBpZiAodGltZUFsaXZlIDwgNTUpIHsKICAgICAgbmFtZSA9IE1hdGgucmFuZG9tKCkgPCAwLjM1ID8gIk1FRElVTV8wMSIgOiAoTWF0aC5yYW5kb20oKSA8IDAuNSA\/ICJFQVNZXzAxIiA6ICJFQVNZXzAyIik7CiAgICB9IGVsc2UgewogICAgICBuYW1lID0gIk1FRElVTV8wMSI7CiAgICB9CiAgICB0aGlzLmxvYWRQYXR0ZXJuKG5hbWUpOwogIH07CgogIFNwYXduRGlyZWN0b3IucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChkdCkgewogICAgdGhpcy50aW1lciAtPSBkdDsKICAgIGlmICh0aGlzLnRpbWVyID4gMCkgcmV0dXJuOwogICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID09PSAwKSB7CiAgICAgIHRoaXMucGlja1BhdHRlcm4oKTsKICAgICAgdGhpcy50aW1lciA9IDAuNTU7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBuZXh0ID0gdGhpcy5xdWV1ZS5zaGlmdCgpOwogICAgdmFyIGdhcCA9IDAuNTUgKyBNYXRoLm1heCgwLCAoMjgwIC0gYmVsdFNwZWVkKSAvIDI4MCkgKiAwLjM1OwogICAgaWYgKG5leHQgPT09ICJnYXAiKSB7CiAgICAgIHRoaXMudGltZXIgPSBnYXAgKiAwLjk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZvb2RzLnB1c2gobmV3IEZvb2QobmV4dCwgU1BBV05fWCkpOwogICAgdGhpcy50aW1lciA9IGdhcDsKICB9OwoKICBmdW5jdGlvbiBvbkNhdGNoU3dlZXQoZm9vZCkgewogICAgdmFyIHB0cyA9IE1hdGgucm91bmQoZm9vZC5iYXNlU2NvcmUgKiBtdWx0aXBsaWVyKTsKICAgIHNjb3JlICs9IHB0czsKICAgIGNvbWJvICs9IDE7CiAgICB1cGRhdGVNdWx0aXBsaWVyKCk7CiAgICBkaW5nKCk7CiAgICBzcGF3blNjb3JlUG9wKEJBU0tFVF9YICsgNTAsIEJBU0tFVF9ZLCAiKyIgKyBwdHMsICIjZmY2NmFhIik7CiAgICBidXJzdChCQVNLRVRfWCArIDUwLCBCQVNLRVRfWSArIDEwLCAiI2ZmOTljYyIsIDE0KTsKICAgIGdpem1vLnJlYWN0ID0gImhhcHB5IjsKICAgIGdpem1vLnJlYWN0VCA9IDAuNDU7CiAgICBoaXRzdG9wID0gSElUU1RPUF9NUyAvIDEwMDA7CiAgfQoKICBmdW5jdGlvbiBvbkNhdGNoVmVnKCkgewogICAgaGVhcnRzIC09IDE7CiAgICBjb21ibyA9IDA7CiAgICB1cGRhdGVNdWx0aXBsaWVyKCk7CiAgICBib25rKCk7CiAgICBzcGF3blNjb3JlUG9wKEJBU0tFVF9YICsgNTAsIEJBU0tFVF9ZLCAiQk9OSyEiLCAiIzY2YWE0NCIpOwogICAgYnVyc3QoQkFTS0VUX1ggKyA1MCwgQkFTS0VUX1kgKyAxMCwgIiM2NmFhNDQiLCAxMCk7CiAgICBnaXptby5yZWFjdCA9ICJoaXQiOwogICAgZ2l6bW8ucmVhY3RUID0gMC41NTsKICAgIGdpem1vLmhpdEZsYXNoID0gMC41NTsKICAgIGhpdHN0b3AgPSBISVRTVE9QX01TIC8gMTAwMDsKICAgIGlmIChoZWFydHMgPD0gMCkgewogICAgICBoZWFydHMgPSAwOwogICAgICBnYW1lT3ZlcigpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gb25NaXNzU3dlZXQoKSB7CiAgICBjb21ibyA9IDA7CiAgICB1cGRhdGVNdWx0aXBsaWVyKCk7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVNdWx0aXBsaWVyKCkgewogICAgaWYgKGNvbWJvID49IDMwKSBtdWx0aXBsaWVyID0gNTsKICAgIGVsc2UgaWYgKGNvbWJvID49IDIwKSBtdWx0aXBsaWVyID0gNDsKICAgIGVsc2UgaWYgKGNvbWJvID49IDEwKSBtdWx0aXBsaWVyID0gMzsKICAgIGVsc2UgaWYgKGNvbWJvID49IDUpIG11bHRpcGxpZXIgPSAyOwogICAgZWxzZSBtdWx0aXBsaWVyID0gMTsKICB9CgogIGZ1bmN0aW9uIHNwYXduU2NvcmVQb3AoeCwgeSwgdGV4dCwgY29sb3IpIHsKICAgIGZsb2F0ZXJzLnB1c2goeyB4OiB4LCB5OiB5LCB0ZXh0OiB0ZXh0LCBjb2xvcjogY29sb3IsIHQ6IDAsIGxpZmU6IDAuOSB9KTsKICB9CgogIGZ1bmN0aW9uIGJ1cnN0KHgsIHksIGNvbG9yLCBuKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgYSA9IE1hdGgucmFuZG9tKCkgKiBNYXRoLlBJICogMjsKICAgICAgdmFyIHNwID0gODAgKyBNYXRoLnJhbmRvbSgpICogMTgwOwogICAgICBwYXJ0aWNsZXMucHVzaCh7CiAgICAgICAgeDogeCwgeTogeSwKICAgICAgICB2eDogTWF0aC5jb3MoYSkgKiBzcCwKICAgICAgICB2eTogTWF0aC5zaW4oYSkgKiBzcCAtIDYwLAogICAgICAgIGxpZmU6IDAuNCArIE1hdGgucmFuZG9tKCkgKiAwLjQsCiAgICAgICAgdDogMCwKICAgICAgICBjb2xvcjogY29sb3IsCiAgICAgICAgcjogMyArIE1hdGgucmFuZG9tKCkgKiA0CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVzZXRHYW1lKCkgewogICAgc2NvcmUgPSAwOwogICAgaGVhcnRzID0gMzsKICAgIGNvbWJvID0gMDsKICAgIG11bHRpcGxpZXIgPSAxOwogICAgYmVsdFNwZWVkID0gODA7CiAgICB0aW1lQWxpdmUgPSAwOwogICAgaGl0c3RvcCA9IDA7CiAgICBwYXVzZWQgPSBmYWxzZTsKICAgIGZvb2RzID0gW107CiAgICBwYXJ0aWNsZXMgPSBbXTsKICAgIGZsb2F0ZXJzID0gW107CiAgICBnaXptbyA9IG5ldyBQbGF5ZXIoKTsKICAgIHNwYXduRGlyZWN0b3IgPSBuZXcgU3Bhd25EaXJlY3RvcigpOwogICAgdG91Y2hUYXJnZXRYID0gbnVsbDsKICAgIGF1dG9Td2F0Rm9vZElkID0gbnVsbDsKICAgIHRvdWNoRHVjayA9IGZhbHNlOwogICAgdG91Y2hKdW1wID0gZmFsc2U7CiAgICBzdGF0ZSA9ICJwbGF5IjsKICAgIG92ZXJsYXkuaGlkZGVuID0gdHJ1ZTsKICAgIGVuZENhcmQuaGlkZGVuID0gdHJ1ZTsKICAgIHRpdGxlQ2FyZC5oaWRkZW4gPSB0cnVlOwogIH0KCiAgZnVuY3Rpb24gZ2FtZU92ZXIoKSB7CiAgICBzdGF0ZSA9ICJvdmVyIjsKICAgIGlmIChzY29yZSA+IGhpZ2hTY29yZSkgewogICAgICBoaWdoU2NvcmUgPSBzY29yZTsKICAgICAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oSFNfS0VZLCBTdHJpbmcoaGlnaFNjb3JlKSk7IH0gY2F0Y2ggKGUpIHt9CiAgICB9CiAgICBpZiAoaGlnaEVsKSBoaWdoRWwudGV4dENvbnRlbnQgPSAiSGlnaCBzY29yZTogIiArIGhpZ2hTY29yZTsKICAgIGVuZFRpdGxlLnRleHRDb250ZW50ID0gIktpdGNoZW4gQ2hhb3MhIjsKICAgIGVuZE1zZy50ZXh0Q29udGVudCA9ICJTY29yZSAiICsgc2NvcmUgKyAiICDCtyAgQmVzdCBjb21ibyB4IiArIE1hdGgubWF4KDEsIG11bHRpcGxpZXIpICsgIiAgwrcgIEhpZ2ggIiArIGhpZ2hTY29yZTsKICAgIGVuZENhcmQuaGlkZGVuID0gZmFsc2U7CiAgICB0aXRsZUNhcmQuaGlkZGVuID0gdHJ1ZTsKICAgIG92ZXJsYXkuaGlkZGVuID0gZmFsc2U7CiAgICBnaXptby5hbmltID0gImRlYXRoIjsKICAgIGdpem1vLmZyYW1lID0gMDsKICAgIGdpem1vLnN3YXR0aW5nID0gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiB0b2dnbGVQYXVzZSgpIHsKICAgIGlmIChzdGF0ZSAhPT0gInBsYXkiICYmIHN0YXRlICE9PSAicGF1c2UiKSByZXR1cm47CiAgICBpZiAocGF1c2VkKSB7CiAgICAgIHBhdXNlZCA9IGZhbHNlOwogICAgICBzdGF0ZSA9ICJwbGF5IjsKICAgICAgb3ZlcmxheS5oaWRkZW4gPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgcGF1c2VkID0gdHJ1ZTsKICAgICAgc3RhdGUgPSAicGF1c2UiOwogICAgICBlbmRUaXRsZS50ZXh0Q29udGVudCA9ICJQYXVzZWQiOwogICAgICBlbmRNc2cudGV4dENvbnRlbnQgPSAiUHJlc3MgRXNjIG9yIHRhcCBQbGF5IGFnYWluIHRvIGNvbnRpbnVlLiI7CiAgICAgIGVuZENhcmQuaGlkZGVuID0gZmFsc2U7CiAgICAgIHRpdGxlQ2FyZC5oaWRkZW4gPSB0cnVlOwogICAgICBvdmVybGF5LmhpZGRlbiA9IGZhbHNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gb3ZlcmxhcHMoYSwgYikgewogICAgcmV0dXJuIGEueCA8IGIueCArIGIudyAmJiBhLnggKyBhLncgPiBiLnggJiYgYS55IDwgYi55ICsgYi5oICYmIGEueSArIGEuaCA+IGIueTsKICB9CgogIGZ1bmN0aW9uIGNoZWNrU3dhdEhpdHMoKSB7CiAgICB2YXIgYm94ID0gZ2l6bW8uc3dhdEJveCgpOwogICAgaWYgKCFib3gpIHJldHVybjsKICAgIGlmICghZ2l6bW8uX3N3YXRIaXRzKSBnaXptby5fc3dhdEhpdHMgPSB7fTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9vZHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGYgPSBmb29kc1tpXTsKICAgICAgaWYgKGYuZGVhZCB8fCAhZi5vbkJlbHQpIGNvbnRpbnVlOwogICAgICBpZiAoZ2l6bW8uX3N3YXRIaXRzW2YuaWRdKSBjb250aW51ZTsKICAgICAgaWYgKG92ZXJsYXBzKGJveCwgZi5iYigpKSkgewogICAgICAgIGdpem1vLl9zd2F0SGl0c1tmLmlkXSA9IHRydWU7CiAgICAgICAgZi5zcXVhc2ggPSAwLjU1OwogICAgICAgIGlmIChmLmtpbmQgPT09ICJjdXBjYWtlIikgZi5sYXVuY2hUb0Jhc2tldCgpOwogICAgICAgIGVsc2UgZi5sYXVuY2hCb25rKCk7CiAgICAgICAgaGl0c3RvcCA9IEhJVFNUT1BfTVMgLyAxMDAwOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBkcmF3QmFja2dyb3VuZChjKSB7CiAgICAvLyB3YXJtIGJha2VyeSBncmFkaWVudAogICAgdmFyIGcgPSBjLmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsIDAsIDAsIEgpOwogICAgZy5hZGRDb2xvclN0b3AoMCwgIiNmZmY2ZTgiKTsKICAgIGcuYWRkQ29sb3JTdG9wKDAuNTUsICIjZmZlOGM4Iik7CiAgICBnLmFkZENvbG9yU3RvcCgxLCAiI2U4Yzg5YSIpOwogICAgYy5maWxsU3R5bGUgPSBnOwogICAgYy5maWxsUmVjdCgwLCAwLCBXLCBIKTsKCiAgICAvLyBiYWNrIHdhbGwgdGlsZXMKICAgIGMuZmlsbFN0eWxlID0gIiNmM2Q3YjAiOwogICAgYy5maWxsUmVjdCgwLCAwLCBXLCAzMDApOwogICAgYy5zdHJva2VTdHlsZSA9ICIjZTBjMDkwIjsKICAgIGMubGluZVdpZHRoID0gMjsKICAgIGZvciAodmFyIHggPSAwOyB4IDwgVzsgeCArPSA2NCkgewogICAgICBjLmJlZ2luUGF0aCgpOyBjLm1vdmVUbyh4LCAwKTsgYy5saW5lVG8oeCwgMzAwKTsgYy5zdHJva2UoKTsKICAgIH0KICAgIGZvciAodmFyIHkgPSAwOyB5IDwgMzAwOyB5ICs9IDQ4KSB7CiAgICAgIGMuYmVnaW5QYXRoKCk7IGMubW92ZVRvKDAsIHkpOyBjLmxpbmVUbyhXLCB5KTsgYy5zdHJva2UoKTsKICAgIH0KCiAgICAvLyBzaGVsZgogICAgYy5maWxsU3R5bGUgPSAiI2M0ODk0YSI7CiAgICBjLmZpbGxSZWN0KDQwLCA3MCwgVyAtIDgwLCAyMik7CiAgICBjLmZpbGxTdHlsZSA9ICIjYTg2ZTM4IjsKICAgIGMuZmlsbFJlY3QoNDAsIDkyLCBXIC0gODAsIDgpOwogICAgLy8gamFycyBvbiBzaGVsZgogICAgZm9yICh2YXIgaiA9IDA7IGogPCA2OyBqKyspIHsKICAgICAgdmFyIGp4ID0gMTAwICsgaiAqIDE4MDsKICAgICAgYy5maWxsU3R5bGUgPSBqICUgMiA\/ICIjZmY4OGFhIiA6ICIjODhjY2ZmIjsKICAgICAgYy5maWxsUmVjdChqeCwgMzUsIDM2LCAzNik7CiAgICAgIGMuZmlsbFN0eWxlID0gIiNmZmY4IjsKICAgICAgYy5maWxsUmVjdChqeCArIDYsIDQwLCAxMCwgMTYpOwogICAgfQoKICAgIC8vIHdpbmRvdwogICAgYy5maWxsU3R5bGUgPSAiI2I4ZTBmZiI7CiAgICBjLmZpbGxSZWN0KDkyMCwgMTIwLCAyMjAsIDE0MCk7CiAgICBjLnN0cm9rZVN0eWxlID0gIiM4YTVhMzAiOwogICAgYy5saW5lV2lkdGggPSA2OwogICAgYy5zdHJva2VSZWN0KDkyMCwgMTIwLCAyMjAsIDE0MCk7CiAgICBjLmJlZ2luUGF0aCgpOyBjLm1vdmVUbygxMDMwLCAxMjApOyBjLmxpbmVUbygxMDMwLCAyNjApOyBjLm1vdmVUbyg5MjAsIDE5MCk7IGMubGluZVRvKDExNDAsIDE5MCk7IGMuc3Ryb2tlKCk7CgogICAgLy8gZmxvb3IKICAgIGMuZmlsbFN0eWxlID0gIiNkNGE1NzQiOwogICAgYy5maWxsUmVjdCgwLCBGTE9PUl9ZLCBXLCBIIC0gRkxPT1JfWSk7CiAgICBjLmZpbGxTdHlsZSA9ICIjYzQ5MzYwIjsKICAgIGZvciAodmFyIGZ4ID0gMDsgZnggPCBXOyBmeCArPSA5MCkgewogICAgICBjLmZpbGxSZWN0KGZ4LCBGTE9PUl9ZLCAyLCBIIC0gRkxPT1JfWSk7CiAgICB9CgogICAgLy8gY29udmV5b3IgYmVsdAogICAgYy5maWxsU3R5bGUgPSAiIzNhM2E0OCI7CiAgICBjLmZpbGxSZWN0KDMwLCBCRUxUX1ksIFcgLSA2MCwgQkVMVF9IKTsKICAgIGMuZmlsbFN0eWxlID0gIiMyYTJhMzQiOwogICAgYy5maWxsUmVjdCgzMCwgQkVMVF9ZICsgQkVMVF9IIC0gMTAsIFcgLSA2MCwgMTApOwogICAgYy5maWxsU3R5bGUgPSAiIzVhNWE2YSI7CiAgICB2YXIgc2Nyb2xsID0gKHRpbWVBbGl2ZSAqIGJlbHRTcGVlZCkgJSA0MDsKICAgIGZvciAodmFyIGJ4ID0gMzAgLSBzY3JvbGw7IGJ4IDwgVyAtIDMwOyBieCArPSA0MCkgewogICAgICBjLmZpbGxSZWN0KGJ4LCBCRUxUX1kgKyA4LCAxOCwgQkVMVF9IIC0gMjIpOwogICAgfQogICAgLy8gcm9sbGVycwogICAgYy5maWxsU3R5bGUgPSAiIzg4OCI7CiAgICBjLmJlZ2luUGF0aCgpOyBjLmFyYyg1MCwgQkVMVF9ZICsgQkVMVF9IIC8gMiwgMTgsIDAsIE1hdGguUEkgKiAyKTsgYy5maWxsKCk7CiAgICBjLmJlZ2luUGF0aCgpOyBjLmFyYyhXIC0gNTAsIEJFTFRfWSArIEJFTFRfSCAvIDIsIDE4LCAwLCBNYXRoLlBJICogMik7IGMuZmlsbCgpOwoKICAgIC8vIGJhc2tldAogICAgaWYgKGltYWdlcy5iYXNrZXQpIHsKICAgICAgYy5kcmF3SW1hZ2UoaW1hZ2VzLmJhc2tldCwgQkFTS0VUX1gsIEJBU0tFVF9ZLCAxNDAsIDEwMCk7CiAgICB9IGVsc2UgewogICAgICBjLmZpbGxTdHlsZSA9ICIjYzQ4YTQ2IjsKICAgICAgYy5maWxsUmVjdChCQVNLRVRfWCwgQkFTS0VUX1ksIDEyMCwgODApOwogICAgfQogICAgYy5maWxsU3R5bGUgPSAiI2ZmZiI7CiAgICBjLmZvbnQgPSAiYm9sZCAxNHB4IFRyZWJ1Y2hldCBNUywgc2Fucy1zZXJpZiI7CiAgICBjLmZpbGxUZXh0KCJUUkVBVFMiLCBCQVNLRVRfWCArIDM4LCBCQVNLRVRfWSArIDY0KTsKCiAgICAvLyBUcmVhdCBiYXNrZXQgbGVmdCAoYWJvdmUpLiBWZWdldGFibGUgY2h1dGUgb24gdGhlIHJpZ2h0IHBlciBsYXlvdXQuCiAgICBpZiAoaW1hZ2VzLmNodXRlKSB7CiAgICAgIGMuZHJhd0ltYWdlKGltYWdlcy5jaHV0ZSwgQ0hVVEVfWCwgQkVMVF9ZIC0gMzAsIDEwMCwgMTAwKTsKICAgIH0KICAgIGMuZmlsbFN0eWxlID0gIiNkZmY1ZDgiOwogICAgYy5mb250ID0gImJvbGQgMTNweCBUcmVidWNoZXQgTVMsIHNhbnMtc2VyaWYiOwogICAgYy5maWxsVGV4dCgiVkVHIENIVVRFIiwgQ0hVVEVfWCArIDEyLCBCRUxUX1kgLSAzNik7CiAgICAvLyBTb2Z0IGhpZ2hsaWdodCBhdCBsZWZ0IGJlbHQgZXhpdCAodW5zd2F0dGVkIHZlZ2dpZXMgT0s7IHN3ZWV0cyBtaXNzKQogICAgYy5maWxsU3R5bGUgPSAicmdiYSg4MCwxMjAsNjAsMC4yMikiOwogICAgYy5maWxsUmVjdCgyMCwgQkVMVF9ZIC0gNCwgNDYsIEJFTFRfSCArIDgpOwogIH0KCiAgZnVuY3Rpb24gZHJhd0hVRChjKSB7CiAgICBjLmZpbGxTdHlsZSA9ICJyZ2JhKDQwLDI0LDE2LDAuNTUpIjsKICAgIGMuZmlsbFJlY3QoMTYsIDIyLCA0MjAsIDU0KTsKICAgIGMuZmlsbFJlY3QoVyAtIDIyMCwgMjIsIDIwMCwgNTQpOwogICAgYy5maWxsU3R5bGUgPSAiI2ZmZjhmMCI7CiAgICBjLmZvbnQgPSAiYm9sZCAyNnB4IFRyZWJ1Y2hldCBNUywgc2Fucy1zZXJpZiI7CiAgICBjLmZpbGxUZXh0KCJTQ09SRTogIiArIHNjb3JlLCAyOCwgNTgpOwogICAgYy5mb250ID0gImJvbGQgMjJweCBUcmVidWNoZXQgTVMsIHNhbnMtc2VyaWYiOwogICAgdmFyIGNvbWJvTGFiZWwgPSBtdWx0aXBsaWVyID4gMSA\/ICgieCIgKyBtdWx0aXBsaWVyICsgIiBDT01CTyAoIiArIGNvbWJvICsgIikiKSA6ICgiQ29tYm8gIiArIGNvbWJvKTsKICAgIGMuZmlsbFN0eWxlID0gbXVsdGlwbGllciA+PSA0ID8gIiNmZjY2YWEiIDogKG11bHRpcGxpZXIgPj0gMiA\/ICIjZmZjYzY2IiA6ICIjZmZlOGQwIik7CiAgICBjLmZpbGxUZXh0KGNvbWJvTGFiZWwsIDI1MCwgNTgpOwoKICAgIC8vIGhlYXJ0cyAoZHJhd24gc2hhcGVzOyBhdm9pZCB1bmljb2RlIHRoYXQgV29yZFByZXNzIG1heSBtYW5nbGUpCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykgewogICAgICB2YXIgaHggPSBXIC0gMTg1ICsgaSAqIDU1OwogICAgICB2YXIgaHkgPSA0ODsKICAgICAgYy5zYXZlKCk7CiAgICAgIGMudHJhbnNsYXRlKGh4LCBoeSk7CiAgICAgIGMuYmVnaW5QYXRoKCk7CiAgICAgIGMubW92ZVRvKDAsIDYpOwogICAgICBjLmJlemllckN1cnZlVG8oLTE4LCAtMTAsIC0yMiwgMTIsIDAsIDI0KTsKICAgICAgYy5iZXppZXJDdXJ2ZVRvKDIyLCAxMiwgMTgsIC0xMCwgMCwgNik7CiAgICAgIGMuY2xvc2VQYXRoKCk7CiAgICAgIGMuZmlsbFN0eWxlID0gaSA8IGhlYXJ0cyA\/ICIjZmY0NDY2IiA6ICIjNWEzMDMwIjsKICAgICAgYy5maWxsKCk7CiAgICAgIGMuc3Ryb2tlU3R5bGUgPSBpIDwgaGVhcnRzID8gIiNhYTIyMzMiIDogIiMzYTIwMjAiOwogICAgICBjLmxpbmVXaWR0aCA9IDI7CiAgICAgIGMuc3Ryb2tlKCk7CiAgICAgIGMucmVzdG9yZSgpOwogICAgfQoKICAgIGlmIChwYXVzZWQpIHsKICAgICAgYy5maWxsU3R5bGUgPSAicmdiYSgwLDAsMCwwLjM1KSI7CiAgICAgIGMuZmlsbFJlY3QoMCwgMCwgVywgSCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBkcmF3KGMpIHsKICAgIGRyYXdCYWNrZ3JvdW5kKGMpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb29kcy5sZW5ndGg7IGkrKykgZm9vZHNbaV0uZHJhdyhjKTsKICAgIGlmIChnaXptbykgZ2l6bW8uZHJhdyhjKTsKCiAgICBmb3IgKHZhciBwID0gMDsgcCA8IHBhcnRpY2xlcy5sZW5ndGg7IHArKykgewogICAgICB2YXIgcHQgPSBwYXJ0aWNsZXNbcF07CiAgICAgIGMuZ2xvYmFsQWxwaGEgPSBNYXRoLm1heCgwLCAxIC0gcHQudCAvIHB0LmxpZmUpOwogICAgICBjLmZpbGxTdHlsZSA9IHB0LmNvbG9yOwogICAgICBjLmJlZ2luUGF0aCgpOwogICAgICBjLmFyYyhwdC54LCBwdC55LCBwdC5yLCAwLCBNYXRoLlBJICogMik7CiAgICAgIGMuZmlsbCgpOwogICAgICBjLmdsb2JhbEFscGhhID0gMTsKICAgIH0KICAgIGZvciAodmFyIGYgPSAwOyBmIDwgZmxvYXRlcnMubGVuZ3RoOyBmKyspIHsKICAgICAgdmFyIGZsID0gZmxvYXRlcnNbZl07CiAgICAgIGMuZ2xvYmFsQWxwaGEgPSBNYXRoLm1heCgwLCAxIC0gZmwudCAvIGZsLmxpZmUpOwogICAgICBjLmZpbGxTdHlsZSA9IGZsLmNvbG9yOwogICAgICBjLmZvbnQgPSAiYm9sZCAyOHB4IFRyZWJ1Y2hldCBNUywgc2Fucy1zZXJpZiI7CiAgICAgIGMuZmlsbFRleHQoZmwudGV4dCwgZmwueCAtIDIwLCBmbC55IC0gZmwudCAqIDYwKTsKICAgICAgYy5nbG9iYWxBbHBoYSA9IDE7CiAgICB9CgogICAgLy8gc3dhdCBib3ggZmxhc2ggc3VidGxlCiAgICBpZiAoZ2l6bW8gJiYgZ2l6bW8uc3dhdHRpbmcpIHsKICAgICAgdmFyIHNiID0gZ2l6bW8uc3dhdEJveCgpOwogICAgICBpZiAoc2IpIHsKICAgICAgICBjLmZpbGxTdHlsZSA9ICJyZ2JhKDI1NSw4MCwxMjAsMC4yMikiOwogICAgICAgIGMuZmlsbFJlY3Qoc2IueCwgc2IueSwgc2Iudywgc2IuaCk7CiAgICAgIH0KICAgIH0KCiAgICBkcmF3SFVEKGMpOwoKICAgIGlmIChzdGF0ZSA9PT0gIm92ZXIiICYmIGdpem1vKSB7CiAgICAgIC8vIGFscmVhZHkgc2hvd2luZyBkZWF0aCBhbmltIHZpYSBvdmVybGF5CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1cGRhdGUoZHQpIHsKICAgIGlmIChzdGF0ZSAhPT0gInBsYXkiIHx8IHBhdXNlZCkgcmV0dXJuOwoKICAgIGlmIChoaXRzdG9wID4gMCkgewogICAgICBoaXRzdG9wIC09IGR0OwogICAgICAvLyBzdGlsbCBhbmltYXRlIHRpbnkgc3F1YXNoIHNldHRsZQogICAgICByZXR1cm47CiAgICB9CgogICAgdGltZUFsaXZlICs9IGR0OwogICAgYmVsdFNwZWVkID0gTWF0aC5taW4oMjgwLCA4MCArIHRpbWVBbGl2ZSAqIDIuMik7CgogICAgZ2l6bW8udXBkYXRlKGR0KTsKICAgIHRpY2tBdXRvU3dhdCgpOwogICAgaWYgKGdpem1vLnN3YXR0aW5nKSBjaGVja1N3YXRIaXRzKCk7CgogICAgc3Bhd25EaXJlY3Rvci51cGRhdGUoZHQpOwoKICAgIGZvciAodmFyIGkgPSBmb29kcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICBmb29kc1tpXS51cGRhdGUoZHQsIGJlbHRTcGVlZCk7CiAgICAgIGlmIChmb29kc1tpXS5kZWFkKSBmb29kcy5zcGxpY2UoaSwgMSk7CiAgICB9CgogICAgZm9yICh2YXIgcCA9IHBhcnRpY2xlcy5sZW5ndGggLSAxOyBwID49IDA7IHAtLSkgewogICAgICB2YXIgcHQgPSBwYXJ0aWNsZXNbcF07CiAgICAgIHB0LnQgKz0gZHQ7CiAgICAgIHB0LnggKz0gcHQudnggKiBkdDsKICAgICAgcHQueSArPSBwdC52eSAqIGR0OwogICAgICBwdC52eSArPSA0MDAgKiBkdDsKICAgICAgaWYgKHB0LnQgPj0gcHQubGlmZSkgcGFydGljbGVzLnNwbGljZShwLCAxKTsKICAgIH0KICAgIGZvciAodmFyIGYgPSBmbG9hdGVycy5sZW5ndGggLSAxOyBmID49IDA7IGYtLSkgewogICAgICBmbG9hdGVyc1tmXS50ICs9IGR0OwogICAgICBpZiAoZmxvYXRlcnNbZl0udCA+PSBmbG9hdGVyc1tmXS5saWZlKSBmbG9hdGVycy5zcGxpY2UoZiwgMSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBsb29wKHRzKSB7CiAgICBpZiAoIWxhc3RUcykgbGFzdFRzID0gdHM7CiAgICB2YXIgZHQgPSBNYXRoLm1pbigwLjAzMywgKHRzIC0gbGFzdFRzKSAvIDEwMDApOwogICAgbGFzdFRzID0gdHM7CiAgICB1cGRhdGUoZHQpOwogICAgZHJhdyhjdHgpOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApOwogIH0KCiAgZnVuY3Rpb24gZml0KCkgewogICAgdmFyIHN0YWdlID0gY2FudmFzLnBhcmVudEVsZW1lbnQ7CiAgICB2YXIgZnNNb2RlID0gdXNpbmdGc0ZhbGxiYWNrIHx8IGlzRnNBY3RpdmUoKTsKICAgIGlmIChmc01vZGUpIHsKICAgICAgdmFyIHZ3ID0gd2luZG93LmlubmVyV2lkdGggfHwgMzIwOwogICAgICB2YXIgdmggPSB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMTgwOwogICAgICB2YXIgcGFkID0gMTY7CiAgICAgIHZhciBhdmFpbFcgPSBNYXRoLm1heCg4MCwgdncgLSBwYWQpOwogICAgICB2YXIgYXZhaWxIID0gTWF0aC5tYXgoODAsIHZoIC0gcGFkKTsKICAgICAgdmFyIGN3ID0gYXZhaWxXOwogICAgICB2YXIgY2ggPSBjdyAqIDkgLyAxNjsKICAgICAgaWYgKGNoID4gYXZhaWxIKSB7CiAgICAgICAgY2ggPSBhdmFpbEg7CiAgICAgICAgY3cgPSBjaCAqIDE2IC8gOTsKICAgICAgfQogICAgICBjdyA9IE1hdGguZmxvb3IoY3cpOwogICAgICBjaCA9IE1hdGguZmxvb3IoY2gpOwogICAgICBjYW52YXMuc3R5bGUud2lkdGggPSBjdyArICJweCI7CiAgICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBjaCArICJweCI7CiAgICAgIHNjYWxlID0gY3cgLyBXOwogICAgICBpZiAoc3RhZ2UpIHsKICAgICAgICBzdGFnZS5zdHlsZS53aWR0aCA9IGN3ICsgInB4IjsKICAgICAgICBzdGFnZS5zdHlsZS5oZWlnaHQgPSBjaCArICJweCI7CiAgICAgIH0KICAgICAgcGxhY2VIdWRCdXR0b25zKGN3LCBjaCwgdncsIHZoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY2FudmFzLnN0eWxlLndpZHRoID0gIiI7CiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICBpZiAoc3RhZ2UpIHsKICAgICAgc3RhZ2Uuc3R5bGUud2lkdGggPSAiIjsKICAgICAgc3RhZ2Uuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICB9CiAgICB2YXIgciA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIGlmIChyLndpZHRoID4gMCkgc2NhbGUgPSByLndpZHRoIC8gVzsKICAgIGVsc2Ugc2NhbGUgPSAxOwogICAgaWYgKHN0YWdlKSB7CiAgICAgIHN0YWdlLnN0eWxlLmhlaWdodCA9IE1hdGguY2VpbChyLmhlaWdodCB8fCAoVyAqIHNjYWxlICogOSAvIDE2KSkgKyAicHgiOwogICAgfQogICAgcGxhY2VIdWRCdXR0b25zKHIud2lkdGggfHwgVyAqIHNjYWxlLCByLmhlaWdodCB8fCBIICogc2NhbGUsIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQpOwogIH0KCiAgZnVuY3Rpb24gcGxhY2VIdWRCdXR0b25zKGN3LCBjaCwgdncsIHZoKSB7CiAgICBpZiAoIWh1ZEJ0bnMpIHJldHVybjsKICAgIHZhciBzaWRlID0gTWF0aC5tYXgoMCwgKHZ3IC0gY3cpIC8gMik7CiAgICB2YXIgdG9wR2FwID0gTWF0aC5tYXgoMCwgKHZoIC0gY2gpIC8gMik7CiAgICBpZiAodXNpbmdGc0ZhbGxiYWNrIHx8IGlzRnNBY3RpdmUoKSkgewogICAgICBodWRCdG5zLnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIjsKICAgICAgaHVkQnRucy5zdHlsZS5mbGV4RGlyZWN0aW9uID0gImNvbHVtbiI7CiAgICAgIC8vIFNpdCBpbiB0aGUgcmlnaHQgbGV0dGVyYm94IChibGFjayBtYXJnaW4pLCBub3Qgb3ZlciB0aGUgY2FudmFzIGhlYXJ0cwogICAgICB2YXIgYnRuVyA9IDM2OwogICAgICBpZiAoc2lkZSA+PSBidG5XICsgOCkgewogICAgICAgIGh1ZEJ0bnMuc3R5bGUudG9wID0gTWF0aC5tYXgoNiwgdG9wR2FwICsgOCkgKyAicHgiOwogICAgICAgIGh1ZEJ0bnMuc3R5bGUucmlnaHQgPSBNYXRoLm1heCg2LCBNYXRoLmZsb29yKChzaWRlIC0gYnRuVykgLyAyKSkgKyAicHgiOwogICAgICB9IGVsc2UgaWYgKHRvcEdhcCA+PSA0MCkgewogICAgICAgIGh1ZEJ0bnMuc3R5bGUudG9wID0gTWF0aC5tYXgoNCwgTWF0aC5mbG9vcigodG9wR2FwIC0gMzYpIC8gMikpICsgInB4IjsKICAgICAgICBodWRCdG5zLnN0eWxlLnJpZ2h0ID0gIjZweCI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVGlueSBtYXJnaW5zOiBwYXJrIGp1c3Qgb3V0c2lkZSBjYW52YXMgdG9wLXJpZ2h0IGNvcm5lciBpbiB0aGUgcmVzaWR1YWwgZ2FwCiAgICAgICAgaHVkQnRucy5zdHlsZS50b3AgPSBNYXRoLm1heCgyLCB0b3BHYXAgKyAyKSArICJweCI7CiAgICAgICAgaHVkQnRucy5zdHlsZS5yaWdodCA9IE1hdGgubWF4KDIsIHNpZGUgKyAyKSArICJweCI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGh1ZEJ0bnMuc3R5bGUucG9zaXRpb24gPSAiIjsKICAgICAgaHVkQnRucy5zdHlsZS50b3AgPSAiIjsKICAgICAgaHVkQnRucy5zdHlsZS5yaWdodCA9ICIiOwogICAgICBodWRCdG5zLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSAiIjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNhbnZhc1BvcyhlKSB7CiAgICB2YXIgciA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIHZhciBjbGllbnRYID0gZS5jbGllbnRYOwogICAgdmFyIGNsaWVudFkgPSBlLmNsaWVudFk7CiAgICBpZiAoZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdKSB7CiAgICAgIGNsaWVudFggPSBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7CiAgICAgIGNsaWVudFkgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFk7CiAgICB9IGVsc2UgaWYgKGUudG91Y2hlcyAmJiBlLnRvdWNoZXNbMF0pIHsKICAgICAgY2xpZW50WCA9IGUudG91Y2hlc1swXS5jbGllbnRYOwogICAgICBjbGllbnRZID0gZS50b3VjaGVzWzBdLmNsaWVudFk7CiAgICB9CiAgICB2YXIgcncgPSByLndpZHRoIHx8IDE7CiAgICB2YXIgcmggPSByLmhlaWdodCB8fCAxOwogICAgcmV0dXJuIHsKICAgICAgeDogKGNsaWVudFggLSByLmxlZnQpIC8gcncgKiBXLAogICAgICB5OiAoY2xpZW50WSAtIHIudG9wKSAvIHJoICogSAogICAgfTsKICB9CgogIGZ1bmN0aW9uIGlzVG91Y2hEZXZpY2UoKSB7CiAgICBpZiAod2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoIihwb2ludGVyOiBjb2Fyc2UpIikubWF0Y2hlcykgcmV0dXJuIHRydWU7CiAgICBpZiAobmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzICYmIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDApIHJldHVybiB0cnVlOwogICAgcmV0dXJuICJvbnRvdWNoc3RhcnQiIGluIHdpbmRvdzsKICB9CgogIGZ1bmN0aW9uIGlzUG9ydHJhaXQoKSB7CiAgICBpZiAoc2NyZWVuLm9yaWVudGF0aW9uICYmIHR5cGVvZiBzY3JlZW4ub3JpZW50YXRpb24udHlwZSA9PT0gInN0cmluZyIpIHsKICAgICAgcmV0dXJuIHNjcmVlbi5vcmllbnRhdGlvbi50eXBlLmluZGV4T2YoInBvcnRyYWl0IikgPT09IDA7CiAgICB9CiAgICByZXR1cm4gd2luZG93LmlubmVySGVpZ2h0ID4gd2luZG93LmlubmVyV2lkdGg7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVSb3RhdGVHYXRlKCkgewogICAgaWYgKCFyb3RhdGVHYXRlKSByZXR1cm47CiAgICBpZiAobW9iaWxlUGxheSAmJiBpc1BvcnRyYWl0KCkpIHJvdGF0ZUdhdGUuY2xhc3NMaXN0LmFkZCgib24iKTsKICAgIGVsc2Ugcm90YXRlR2F0ZS5jbGFzc0xpc3QucmVtb3ZlKCJvbiIpOwogIH0KCiAgZnVuY3Rpb24gbG9ja0JvZHkob24pIHsKICAgIGlmIChvbikgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJnaXptby1sb2NrIik7CiAgICBlbHNlIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiZ2l6bW8tbG9jayIpOwogIH0KCiAgZnVuY3Rpb24gc2hvd0h1ZChvbikgewogICAgaWYgKCFodWRCdG5zKSByZXR1cm47CiAgICBpZiAob24pIGh1ZEJ0bnMuY2xhc3NMaXN0LmFkZCgib24iKTsKICAgIGVsc2UgaHVkQnRucy5jbGFzc0xpc3QucmVtb3ZlKCJvbiIpOwogIH0KCiAgZnVuY3Rpb24gZW50ZXJGc0ZhbGxiYWNrKCkgewogICAgdXNpbmdGc0ZhbGxiYWNrID0gdHJ1ZTsKICAgIGlmIChhcHBFbCkgYXBwRWwuY2xhc3NMaXN0LmFkZCgiZnMtZmFsbGJhY2siKTsKICAgIGxvY2tCb2R5KHRydWUpOwogICAgZml0KCk7CiAgfQoKICBmdW5jdGlvbiBleGl0RnNGYWxsYmFjaygpIHsKICAgIHVzaW5nRnNGYWxsYmFjayA9IGZhbHNlOwogICAgaWYgKGFwcEVsKSBhcHBFbC5jbGFzc0xpc3QucmVtb3ZlKCJmcy1mYWxsYmFjayIpOwogICAgbG9ja0JvZHkoZmFsc2UpOwogICAgZml0KCk7CiAgfQoKICBmdW5jdGlvbiByZXF1ZXN0R2FtZUZ1bGxzY3JlZW4oKSB7CiAgICB2YXIgZWwgPSBhcHBFbCB8fCBjYW52YXM7CiAgICB2YXIgcmVxID0gZWwucmVxdWVzdEZ1bGxzY3JlZW4gfHwgZWwud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4gfHwgZWwud2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4gfHwgZWwubXNSZXF1ZXN0RnVsbHNjcmVlbjsKICAgIGlmICghcmVxKSB7CiAgICAgIGVudGVyRnNGYWxsYmFjaygpOwogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCJmYWxsYmFjayIpOwogICAgfQogICAgdHJ5IHsKICAgICAgdmFyIHJldCA9IHJlcS5jYWxsKGVsKTsKICAgICAgaWYgKHJldCAmJiB0eXBlb2YgcmV0LnRoZW4gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICByZXR1cm4gcmV0LnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gImZzIjsgfSkuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgZW50ZXJGc0ZhbGxiYWNrKCk7CiAgICAgICAgICByZXR1cm4gImZhbGxiYWNrIjsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCJmcyIpOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGVudGVyRnNGYWxsYmFjaygpOwogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCJmYWxsYmFjayIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gbG9ja0xhbmRzY2FwZSgpIHsKICAgIHRyeSB7CiAgICAgIGlmIChzY3JlZW4ub3JpZW50YXRpb24gJiYgc2NyZWVuLm9yaWVudGF0aW9uLmxvY2spIHsKICAgICAgICBzY3JlZW4ub3JpZW50YXRpb24ubG9jaygibGFuZHNjYXBlIikuY2F0Y2goZnVuY3Rpb24gKCkge30pOwogICAgICB9CiAgICB9IGNhdGNoIChlcnIpIHt9CiAgfQoKICBmdW5jdGlvbiBleGl0RnVsbHNjcmVlbkFsbCgpIHsKICAgIHZhciBleGl0RnMgPSBkb2N1bWVudC5leGl0RnVsbHNjcmVlbiB8fCBkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbiB8fCBkb2N1bWVudC53ZWJraXRDYW5jZWxGdWxsU2NyZWVuIHx8IGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW47CiAgICBpZiAoZXhpdEZzKSB7CiAgICAgIHRyeSB7IGV4aXRGcy5jYWxsKGRvY3VtZW50KTsgfSBjYXRjaCAoZXJyKSB7fQogICAgfQogICAgZXhpdEZzRmFsbGJhY2soKTsKICB9CgogIGZ1bmN0aW9uIGlzRnNBY3RpdmUoKSB7CiAgICByZXR1cm4gISEoZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudCk7CiAgfQoKICBmdW5jdGlvbiBzY3JvbGxHYW1lSW50b1ZpZXcoKSB7CiAgICBpZiAoYXBwRWwgJiYgYXBwRWwuc2Nyb2xsSW50b1ZpZXcpIHsKICAgICAgYXBwRWwuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogImNlbnRlciIsIGlubGluZTogIm5lYXJlc3QiLCBiZWhhdmlvcjogInNtb290aCIgfSk7CiAgICB9CiAgICBmaXQoKTsKICB9CgogIGZ1bmN0aW9uIGZpbmROZWFyZXN0U3dlZXQoeCwgeSwgbWF4RGlzdCkgewogICAgdmFyIGJlc3QgPSBudWxsOwogICAgdmFyIGJlc3REID0gbWF4RGlzdDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9vZHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGYgPSBmb29kc1tpXTsKICAgICAgaWYgKGYuZGVhZCB8fCAhZi5vbkJlbHQpIGNvbnRpbnVlOwogICAgICBpZiAoZi5raW5kICE9PSAiY3VwY2FrZSIpIGNvbnRpbnVlOwogICAgICB2YXIgYmIgPSBmLmJiKCk7CiAgICAgIHZhciBjeCA9IGJiLnggKyBiYi53ICogMC41OwogICAgICB2YXIgY3kgPSBiYi55ICsgYmIuaCAqIDAuNTsKICAgICAgdmFyIGQgPSBNYXRoLnNxcnQoKGN4IC0geCkgKiAoY3ggLSB4KSArIChjeSAtIHkpICogKGN5IC0geSkpOwogICAgICBpZiAoZCA8IGJlc3REKSB7IGJlc3REID0gZDsgYmVzdCA9IGY7IH0KICAgIH0KICAgIHJldHVybiBiZXN0OwogIH0KCiAgZnVuY3Rpb24gdGlja0F1dG9Td2F0KCkgewogICAgaWYgKCFnaXptbyB8fCBhdXRvU3dhdEZvb2RJZCA9PSBudWxsKSByZXR1cm47CiAgICB2YXIgdGFyZ2V0ID0gbnVsbDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9vZHMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGZvb2RzW2ldLmlkID09PSBhdXRvU3dhdEZvb2RJZCkgeyB0YXJnZXQgPSBmb29kc1tpXTsgYnJlYWs7IH0KICAgIH0KICAgIGlmICghdGFyZ2V0IHx8IHRhcmdldC5kZWFkIHx8ICF0YXJnZXQub25CZWx0KSB7CiAgICAgIGF1dG9Td2F0Rm9vZElkID0gbnVsbDsKICAgICAgcmV0dXJuOwogICAgfQogICAgdG91Y2hUYXJnZXRYID0gdGFyZ2V0LnggLSA1MCAqIChnaXptby5mYWNpbmcgPj0gMCA\/IDEgOiAtMSk7CiAgICAvLyBQcmVmZXIgc3RhbmRpbmcganVzdCBsZWZ0IG9mIHRoZSBzd2VldCBzbyBmYWNpbmcgcmlnaHQgbWVldHMgaXQKICAgIHRvdWNoVGFyZ2V0WCA9IHRhcmdldC54IC0gNTU7CiAgICBpZiAodG91Y2hUYXJnZXRYIDwgNDApIHRvdWNoVGFyZ2V0WCA9IDQwOwogICAgZ2l6bW8uZmFjaW5nID0gMTsKICAgIGlmIChNYXRoLmFicyhnaXptby54IC0gdG91Y2hUYXJnZXRYKSA8IDI4ICYmICFnaXptby5zd2F0dGluZykgewogICAgICBnaXptby5zdGFydFN3YXQoKTsKICAgICAgYXV0b1N3YXRGb29kSWQgPSBudWxsOwogICAgfQogIH0KCiAgZnVuY3Rpb24gb25LZXkoZSwgZG93bikgewogICAga2V5c1tlLmtleV0gPSBkb3duOwogICAgaWYgKGRvd24gJiYgKGUua2V5ID09PSAieCIgfHwgZS5rZXkgPT09ICJYIikpIHsKICAgICAgaWYgKHN0YXRlID09PSAicGxheSIgJiYgIXBhdXNlZCAmJiBnaXptbykgZ2l6bW8uc3RhcnRTd2F0KCk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIH0KICAgIGlmIChkb3duICYmIGUua2V5ID09PSAiRXNjYXBlIikgewogICAgICBpZiAoc3RhdGUgPT09ICJwbGF5IiB8fCBzdGF0ZSA9PT0gInBhdXNlIikgdG9nZ2xlUGF1c2UoKTsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgfQogICAgaWYgKGRvd24gJiYgKGUua2V5ID09PSAiICIgfHwgZS5rZXkgPT09ICJBcnJvd1VwIiB8fCBlLmtleSA9PT0gIkFycm93RG93biIpKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGVuZE1vYmlsZVNlc3Npb24oKSB7CiAgICBtb2JpbGVQbGF5ID0gZmFsc2U7CiAgICB0b3VjaE1vZGUgPSBmYWxzZTsKICAgIHRvdWNoVGFyZ2V0WCA9IG51bGw7CiAgICBhdXRvU3dhdEZvb2RJZCA9IG51bGw7CiAgICBzaG93SHVkKGZhbHNlKTsKICAgIHVwZGF0ZVJvdGF0ZUdhdGUoKTsKICAgIGV4aXRGdWxsc2NyZWVuQWxsKCk7CiAgICBsb2NrQm9keShmYWxzZSk7CiAgfQoKICBmdW5jdGlvbiBzdGFydEZyb21UaXRsZSgpIHsKICAgIGVuc3VyZUF1ZGlvKCk7CiAgICBpZiAoYXVkaW9DdHggJiYgYXVkaW9DdHguc3RhdGUgPT09ICJzdXNwZW5kZWQiKSBhdWRpb0N0eC5yZXN1bWUoKTsKICAgIHRvdWNoTW9kZSA9IGlzVG91Y2hEZXZpY2UoKTsKICAgIG1vYmlsZVBsYXkgPSB0b3VjaE1vZGU7CiAgICByZXNldEdhbWUoKTsKICAgIHNob3dIdWQodG91Y2hNb2RlKTsKICAgIGlmICh0b3VjaE1vZGUpIHsKICAgICAgbG9ja0JvZHkodHJ1ZSk7CiAgICAgIHJlcXVlc3RHYW1lRnVsbHNjcmVlbigpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIGxvY2tMYW5kc2NhcGUoKTsKICAgICAgICB1cGRhdGVSb3RhdGVHYXRlKCk7CiAgICAgICAgZml0KCk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgc2Nyb2xsR2FtZUludG9WaWV3KCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBleGl0VG9UaXRsZSgpIHsKICAgIGVuZE1vYmlsZVNlc3Npb24oKTsKICAgIHN0YXRlID0gInRpdGxlIjsKICAgIHBhdXNlZCA9IGZhbHNlOwogICAgb3ZlcmxheS5oaWRkZW4gPSBmYWxzZTsKICAgIGVuZENhcmQuaGlkZGVuID0gdHJ1ZTsKICAgIHRpdGxlQ2FyZC5oaWRkZW4gPSBmYWxzZTsKICB9CgogIHN0YXJ0QnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgewogICAgaWYgKCFyZWFkeSkgcmV0dXJuOwogICAgc3RhcnRGcm9tVGl0bGUoKTsKICB9KTsKICBhZ2FpbkJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgIGlmIChzdGF0ZSA9PT0gInBhdXNlIikgewogICAgICB0b2dnbGVQYXVzZSgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBzdGFydEZyb21UaXRsZSgpOwogIH0pOwoKICBpZiAoYnRuUGF1c2UpIHsKICAgIGJ0blBhdXNlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgaWYgKHN0YXRlID09PSAicGxheSIgfHwgc3RhdGUgPT09ICJwYXVzZSIpIHRvZ2dsZVBhdXNlKCk7CiAgICB9KTsKICB9CiAgaWYgKGJ0bkV4aXQpIHsKICAgIGJ0bkV4aXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBleGl0VG9UaXRsZSgpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBvblBvaW50ZXJEb3duKGUpIHsKICAgIGlmIChzdGF0ZSAhPT0gInBsYXkiIHx8IHBhdXNlZCkgcmV0dXJuOwogICAgaWYgKGUudGFyZ2V0ICYmIChlLnRhcmdldC5pZCA9PT0gImJ0bi1wYXVzZSIgfHwgZS50YXJnZXQuaWQgPT09ICJidG4tZXhpdCIpKSByZXR1cm47CiAgICBlbnN1cmVBdWRpbygpOwogICAgdmFyIHBvcyA9IGNhbnZhc1BvcyhlKTsKICAgIHBvaW50ZXJEb3duID0gdHJ1ZTsKICAgIHBvaW50ZXJNb3ZlZCA9IGZhbHNlOwogICAgc3dpcGVIYW5kbGVkID0gZmFsc2U7CiAgICBwb2ludGVyU3RhcnQgPSBwb3M7CiAgICBwb2ludGVyTGFzdCA9IHBvczsKICAgIGlmICh0b3VjaE1vZGUgfHwgZS5wb2ludGVyVHlwZSA9PT0gInRvdWNoIiB8fCBlLnR5cGUuaW5kZXhPZigidG91Y2giKSA9PT0gMCkgewogICAgICB0b3VjaE1vZGUgPSB0cnVlOwogICAgICB0b3VjaFRhcmdldFggPSBwb3MueDsKICAgIH0KICAgIGlmIChlLmNhbmNlbGFibGUpIGUucHJldmVudERlZmF1bHQoKTsKICB9CgogIGZ1bmN0aW9uIG9uUG9pbnRlck1vdmUoZSkgewogICAgaWYgKCFwb2ludGVyRG93biB8fCBzdGF0ZSAhPT0gInBsYXkiIHx8IHBhdXNlZCkgcmV0dXJuOwogICAgdmFyIHBvcyA9IGNhbnZhc1BvcyhlKTsKICAgIHBvaW50ZXJMYXN0ID0gcG9zOwogICAgaWYgKHBvaW50ZXJTdGFydCkgewogICAgICB2YXIgbWR4ID0gcG9zLnggLSBwb2ludGVyU3RhcnQueDsKICAgICAgdmFyIG1keSA9IHBvcy55IC0gcG9pbnRlclN0YXJ0Lnk7CiAgICAgIGlmIChNYXRoLmFicyhtZHgpICsgTWF0aC5hYnMobWR5KSA+IDE4KSBwb2ludGVyTW92ZWQgPSB0cnVlOwogICAgICBpZiAoIXN3aXBlSGFuZGxlZCAmJiBNYXRoLmFicyhtZHkpID4gNTAgJiYgTWF0aC5hYnMobWR5KSA+IE1hdGguYWJzKG1keCkgKiAxLjEpIHsKICAgICAgICBzd2lwZUhhbmRsZWQgPSB0cnVlOwogICAgICAgIGlmIChtZHkgPCAwKSB0b3VjaEp1bXAgPSB0cnVlOwogICAgICAgIGVsc2UgewogICAgICAgICAgdG91Y2hEdWNrID0gdHJ1ZTsKICAgICAgICAgIHRvdWNoRHVja1QgPSAwLjQ1OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKHRvdWNoTW9kZSkgdG91Y2hUYXJnZXRYID0gcG9zLng7CiAgICBpZiAoZS5jYW5jZWxhYmxlKSBlLnByZXZlbnREZWZhdWx0KCk7CiAgfQoKICBmdW5jdGlvbiBvblBvaW50ZXJVcChlKSB7CiAgICBpZiAoIXBvaW50ZXJEb3duKSByZXR1cm47CiAgICBwb2ludGVyRG93biA9IGZhbHNlOwogICAgdmFyIHBvcyA9IGNhbnZhc1BvcyhlKTsKICAgIGlmIChzdGF0ZSA9PT0gInBsYXkiICYmICFwYXVzZWQgJiYgZ2l6bW8pIHsKICAgICAgaWYgKCFzd2lwZUhhbmRsZWQgJiYgIXBvaW50ZXJNb3ZlZCkgewogICAgICAgIC8vIFRhcDogcHJlZmVyIHN3YXR0aW5nIGEgbmVhcmJ5IHN3ZWV0OyBvdGhlcndpc2UgZmFjZS9tb3ZlIGFuZCBzd2F0CiAgICAgICAgdmFyIHN3ZWV0ID0gZmluZE5lYXJlc3RTd2VldChwb3MueCwgcG9zLnksIDExMCk7CiAgICAgICAgaWYgKHN3ZWV0KSB7CiAgICAgICAgICB0b3VjaE1vZGUgPSB0cnVlOwogICAgICAgICAgYXV0b1N3YXRGb29kSWQgPSBzd2VldC5pZDsKICAgICAgICAgIHRvdWNoVGFyZ2V0WCA9IHN3ZWV0LnggLSA1NTsKICAgICAgICAgIGdpem1vLmZhY2luZyA9IDE7CiAgICAgICAgfSBlbHNlIGlmICh0b3VjaE1vZGUpIHsKICAgICAgICAgIHRvdWNoVGFyZ2V0WCA9IHBvcy54OwogICAgICAgICAgZ2l6bW8uc3RhcnRTd2F0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGdpem1vLnN0YXJ0U3dhdCgpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0b3VjaE1vZGUgJiYgIXN3aXBlSGFuZGxlZCkgewogICAgICAgIHRvdWNoVGFyZ2V0WCA9IHBvcy54OwogICAgICB9CiAgICB9CiAgICBpZiAoIXBvaW50ZXJEb3duKSB7CiAgICAgIC8vIGtlZXAgZm9sbG93IHRhcmdldCB3aGlsZSBmaW5nZXIgdXAgb25seSBpZiBhdXRvLXN3YXR0aW5nCiAgICAgIGlmICghYXV0b1N3YXRGb29kSWQgJiYgdG91Y2hNb2RlKSB7CiAgICAgICAgLy8gbGVhdmUgbGFzdCB0YXJnZXQgc28gR2l6bW8gc3RheXMgcHV0CiAgICAgIH0KICAgIH0KICAgIGlmIChlLmNhbmNlbGFibGUpIGUucHJldmVudERlZmF1bHQoKTsKICB9CgogIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLCBvblBvaW50ZXJEb3duKTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Qb2ludGVyTW92ZSk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCBvblBvaW50ZXJVcCk7CiAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBvblBvaW50ZXJEb3duLCB7IHBhc3NpdmU6IGZhbHNlIH0pOwogIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLCBvblBvaW50ZXJNb3ZlLCB7IHBhc3NpdmU6IGZhbHNlIH0pOwogIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIG9uUG9pbnRlclVwLCB7IHBhc3NpdmU6IGZhbHNlIH0pOwogIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGNhbmNlbCIsIG9uUG9pbnRlclVwLCB7IHBhc3NpdmU6IGZhbHNlIH0pOwoKICAvLyBQcmV2ZW50IHBpbmNoIHpvb20gLyBwYWdlIHNjcm9sbCB3aGlsZSBwbGF5aW5nIG9uIG1vYmlsZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImdlc3R1cmVzdGFydCIsIGZ1bmN0aW9uIChlKSB7IGlmIChtb2JpbGVQbGF5KSBlLnByZXZlbnREZWZhdWx0KCk7IH0sIHsgcGFzc2l2ZTogZmFsc2UgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIiwgZnVuY3Rpb24gKGUpIHsKICAgIGlmIChtb2JpbGVQbGF5ICYmIGUuY2FuY2VsYWJsZSkgZS5wcmV2ZW50RGVmYXVsdCgpOwogIH0sIHsgcGFzc2l2ZTogZmFsc2UgfSk7CgogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsgb25LZXkoZSwgdHJ1ZSk7IH0pOwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsIGZ1bmN0aW9uIChlKSB7IG9uS2V5KGUsIGZhbHNlKTsgfSk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIGZ1bmN0aW9uICgpIHsgZml0KCk7IHVwZGF0ZVJvdGF0ZUdhdGUoKTsgfSk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm9yaWVudGF0aW9uY2hhbmdlIiwgZnVuY3Rpb24gKCkgewogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGZpdCgpOyB1cGRhdGVSb3RhdGVHYXRlKCk7IH0sIDIwMCk7CiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZnVsbHNjcmVlbmNoYW5nZSIsIGZ1bmN0aW9uICgpIHsKICAgIGlmICghaXNGc0FjdGl2ZSgpICYmIG1vYmlsZVBsYXkgJiYgIXVzaW5nRnNGYWxsYmFjaykgewogICAgICBlbnRlckZzRmFsbGJhY2soKTsKICAgIH0KICAgIGZpdCgpOwogICAgdXBkYXRlUm90YXRlR2F0ZSgpOwogIH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBmdW5jdGlvbiAoKSB7CiAgICBmaXQoKTsKICAgIHVwZGF0ZVJvdGF0ZUdhdGUoKTsKICB9KTsKCiAgLy8gSG9vayBhdXRvLXN3YXQgaW50byB0aGUgbWFpbiB1cGRhdGUgYnkgd3JhcHBpbmcgdXBkYXRlIGNhbGwgc2l0ZSDigJQgcGF0Y2ggYmVsb3cgdmlhIHRpY2sgaW4gbG9vcAogIHZhciBfb3JpZ1VwZGF0ZVJlZiA9IG51bGw7CgogIHdpbmRvdy5fX0dJWk1PID0gewogICAgZ2V0U2NvcmU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNjb3JlOyB9LAogICAgZ2V0U3RhdGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0YXRlOyB9LAogICAgZ2V0Rm9vZHM6IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIGZvb2RzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gIWYuZGVhZCAmJiBmLm9uQmVsdDsgfSkubWFwKGZ1bmN0aW9uIChmKSB7CiAgICAgICAgcmV0dXJuIHsgaWQ6IGYuaWQsIGtpbmQ6IGYua2luZCwgeDogZi54LCB5OiBmLnkgfTsKICAgICAgfSk7CiAgICB9LAogICAgZm9yY2VUb3VjaDogZnVuY3Rpb24gKCkgeyB0b3VjaE1vZGUgPSB0cnVlOyBtb2JpbGVQbGF5ID0gdHJ1ZTsgfQogIH07CgogIGxvYWRBbGwoKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgIHJlYWR5ID0gdHJ1ZTsKICAgIGlmIChsb2FkRXJyKSBsb2FkRXJyLnRleHRDb250ZW50ID0gIiI7CiAgICBmaXQoKTsKICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAodHMpIHsKICAgICAgZml0KCk7CiAgICAgIGxvb3AodHMpOwogICAgfSk7CiAgICBzZXRUaW1lb3V0KGZpdCwgMTAwKTsKICAgIHNldFRpbWVvdXQoZml0LCA0MDApOwogIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgIGlmIChsb2FkRXJyKSBsb2FkRXJyLnRleHRDb250ZW50ID0gIkNvdWxkIG5vdCBsb2FkIGdhbWUgYXJ0LiBSZWZyZXNoIGFuZCB0cnkgYWdhaW4uIjsKICAgIGNvbnNvbGUuZXJyb3IoZXJyKTsKICB9KTsKfSkoKTsK\");\n  document.body.appendChild(el);\n})();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>Gizmo&#8217;s Cupcake Conveyor Swat sweets into the treat basket. Let evil veggies ride by. Build a combo! Desktop: Move (A\/D or arrows). Jump (Space). Duck (Down). Swat (X or click). Pause (Esc).Phone: drag to move, tap a sweet to swat, swipe up to jump, swipe down to duck. High score: 0 Play Done Play again [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-89","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages\/89","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/catventures.lol\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=89"}],"version-history":[{"count":5,"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages\/89\/revisions"}],"predecessor-version":[{"id":124,"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages\/89\/revisions\/124"}],"wp:attachment":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=89"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}