Anmeldung erforderlich
Bitte melde dich zuerst im Kurs an, um die Pruefung zu starten.
Zur Anmeldung
← Zurueck zum Kurs
Abschlusspruefung
Beantworte alle Fragen. Unbegrenzte Versuche, keine Mindestpunktzahl.
Fragen werden geladen …
KGZ1bmN0aW9uKCl7CiAgdmFyIEtVUlNfSUQgPSAiMjkiOwogIHZhciBRVUlaX0FQSSA9ICJodHRwczovL2FwaS5kamliaW5oby5jb20vcHJveHkucGhwP1NlcnZpY2U9IjsKICB2YXIgU0VDUkVUX1BBUlRTID0gWyJESklCSU5IT0FQUCIsIFN0cmluZy5mcm9tQ2hhckNvZGUoNjQpLCAiR0syNzA5IiwgU3RyaW5nLmZyb21DaGFyQ29kZSgzNSldOwogIHZhciBBUFBfU0VDUkVUID0gU0VDUkVUX1BBUlRTLmpvaW4oIiIpOwoKICB2YXIgJCA9IGZ1bmN0aW9uKGlkKXsgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsgfTsKICB2YXIgcXVlc3Rpb25zID0gW107CiAgdmFyIGFuc3dlcnMgPSB7fTsKCiAgZnVuY3Rpb24gZ2V0VXNlcigpewogICAgdHJ5IHsgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oImRqYl91c2VyIikgfHwgIm51bGwiKTsgfQogICAgY2F0Y2goZSl7IHJldHVybiBudWxsOyB9CiAgfQoKICBmdW5jdGlvbiBxdWl6RmV0Y2goc2VydmljZSwgcGF5bG9hZCl7CiAgICB2YXIgdXNlciA9IGdldFVzZXIoKSB8fCB7fTsKICAgIHJldHVybiBmZXRjaChRVUlaX0FQSSArIHNlcnZpY2UsIHsKICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgIGhlYWRlcnM6IHsKICAgICAgICAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICJBdXRoLVRva2VuIjogdXNlci5hdXRoX3Rva2VuIHx8ICIiCiAgICAgIH0sCiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpCiAgICB9KS50aGVuKGZ1bmN0aW9uKHIpeyByZXR1cm4gci5qc29uKCk7IH0pOwogIH0KCiAgZnVuY3Rpb24gc2hvd0Vycm9yKG1zZyl7CiAgICB2YXIgZSA9ICQoImhrcC1lcnJvciIpOwogICAgZS50ZXh0Q29udGVudCA9IG1zZzsKICAgIGUuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CiAgfQogIGZ1bmN0aW9uIGhpZGVFcnJvcigpeyAkKCJoa3AtZXJyb3IiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOyB9CgogIGZ1bmN0aW9uIGVzY2FwZUh0bWwocyl7CiAgICByZXR1cm4gU3RyaW5nKHMgPT0gbnVsbCA/ICIiIDogcykKICAgICAgLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFNjb3JlKHMpewogICAgdmFyIG4gPSBwYXJzZUZsb2F0KHMpOwogICAgaWYoaXNOYU4obikpIHJldHVybiAiMCI7CiAgICByZXR1cm4gKG4gJSAxID09PSAwKSA/IG4udG9GaXhlZCgwKSA6IG4udG9GaXhlZCgxKTsKICB9CgogIGZ1bmN0aW9uIGxvYWRRdWVzdGlvbnMoKXsKICAgIGhpZGVFcnJvcigpOwogICAgYW5zd2VycyA9IHt9OwogICAgJCgiaGtwLXF1ZXN0aW9ucyIpLmlubmVySFRNTCA9ICIiOwogICAgJCgiaGtwLXN1Ym1pdC13cmFwIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICQoImhrcC1yZXN1bHQiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgJCgiaGtwLW1haW4iKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgICQoImhrcC1sb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CgogICAgcXVpekZldGNoKCJnZXRRdWl6UXVlc3Rpb25zIiwgeyBrdXJzX2lkOiBLVVJTX0lEIH0pCiAgICAgIC50aGVuKGZ1bmN0aW9uKHJlcyl7CiAgICAgICAgJCgiaGtwLWxvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgIHZhciBsaXN0ID0gQXJyYXkuaXNBcnJheShyZXMpID8gcmVzIDogKHJlcyAmJiByZXMuZGF0YSAmJiByZXMuZGF0YS5sZW5ndGggPyByZXMuZGF0YSA6IG51bGwpOwogICAgICAgIGlmKGxpc3QgJiYgbGlzdC5sZW5ndGgpewogICAgICAgICAgcXVlc3Rpb25zID0gbGlzdDsKICAgICAgICAgIHJlbmRlclF1ZXN0aW9ucygpOwogICAgICAgICAgJCgiaGtwLXN1Ym1pdC13cmFwIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNob3dFcnJvcigiRnVlciBkaWVzZW4gS3VycyBzaW5kIG5vY2gga2VpbmUgUHJ1ZWZ1bmdzZnJhZ2VuIGhpbnRlcmxlZ3QuIik7CiAgICAgICAgfQogICAgICB9KQogICAgICAuY2F0Y2goZnVuY3Rpb24oKXsKICAgICAgICAkKCJoa3AtbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgc2hvd0Vycm9yKCJWZXJiaW5kdW5nc2ZlaGxlci4gRnJhZ2VuIGtvbm50ZW4gbmljaHQgZ2VsYWRlbiB3ZXJkZW4uIik7CiAgICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyUXVlc3Rpb25zKCl7CiAgICB2YXIgYm94ID0gJCgiaGtwLXF1ZXN0aW9ucyIpOwogICAgYm94LmlubmVySFRNTCA9ICIiOwogICAgcXVlc3Rpb25zLmZvckVhY2goZnVuY3Rpb24ocSwgaWR4KXsKICAgICAgdmFyIGNhcmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgY2FyZC5zdHlsZS5jc3NUZXh0ID0gImJhY2tncm91bmQ6IzE3MTcxYjtib3JkZXI6MXB4IHNvbGlkICMyYTJhMzE7Ym9yZGVyLXJhZGl1czoxNHB4O3BhZGRpbmc6MjBweDtjb2xvcjojZmZmOyI7CiAgICAgIHZhciBvcHRzID0gWwogICAgICAgIFsiYSIsIHEub3B0aW9uX2FdLCBbImIiLCBxLm9wdGlvbl9iXSwKICAgICAgICBbImMiLCBxLm9wdGlvbl9jXSwgWyJkIiwgcS5vcHRpb25fZF0KICAgICAgXTsKICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT0iZm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206MTJweDtjb2xvcjojZmZmOyI+JwogICAgICAgICsgKGlkeCsxKSArICcuICcgKyBlc2NhcGVIdG1sKHEucXVlc3Rpb25fdGV4dCkgKyAnPC9kaXY+JwogICAgICAgICsgJzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjhweDsiPic7CiAgICAgIG9wdHMuZm9yRWFjaChmdW5jdGlvbihvKXsKICAgICAgICBpZihvWzFdID09IG51bGwgfHwgb1sxXSA9PT0gIiIpIHJldHVybjsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJoa3Atb3B0IiBkYXRhLXFpZD0iJyArIHEucXVlc3Rpb25faWQgKyAnIiBkYXRhLW9wdD0iJyArIG9bMF0gKyAnIiAnCiAgICAgICAgICArICdzdHlsZT0icGFkZGluZzoxMXB4IDE0cHg7Ym9yZGVyLXJhZGl1czo5cHg7Y3Vyc29yOnBvaW50ZXI7Ym9yZGVyOjFweCBzb2xpZCAjMmEyYTMxO2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiNmZmY7Ij4nCiAgICAgICAgICArICc8YiBzdHlsZT0iY29sb3I6I2Y0N2IyMDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bWFyZ2luLXJpZ2h0OjhweDsiPicgKyBvWzBdICsgJzwvYj4nCiAgICAgICAgICArIGVzY2FwZUh0bWwob1sxXSkgKyAnPC9kaXY+JzsKICAgICAgfSk7CiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CiAgICAgIGNhcmQuaW5uZXJIVE1MID0gaHRtbDsKICAgICAgYm94LmFwcGVuZENoaWxkKGNhcmQpOwogICAgfSk7CgogICAgdmFyIG9wdGlvbkVscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5oa3Atb3B0Iik7CiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG9wdGlvbkVscywgZnVuY3Rpb24oZWwpewogICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKCl7CiAgICAgICAgdmFyIHFpZCA9IGVsLmdldEF0dHJpYnV0ZSgiZGF0YS1xaWQiKTsKICAgICAgICB2YXIgb3B0ID0gZWwuZ2V0QXR0cmlidXRlKCJkYXRhLW9wdCIpOwogICAgICAgIGFuc3dlcnNbcWlkXSA9IG9wdDsKICAgICAgICB2YXIgc2libGluZ3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaGtwLW9wdFtkYXRhLXFpZD0iJyArIHFpZCArICciXScpOwogICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoc2libGluZ3MsIGZ1bmN0aW9uKHNpYil7CiAgICAgICAgICBzaWIuc3R5bGUuYm9yZGVyID0gIjFweCBzb2xpZCAjMmEyYTMxIjsKICAgICAgICAgIHNpYi5zdHlsZS5iYWNrZ3JvdW5kID0gInRyYW5zcGFyZW50IjsKICAgICAgICB9KTsKICAgICAgICBlbC5zdHlsZS5ib3JkZXIgPSAiMXB4IHNvbGlkICNmNDdiMjAiOwogICAgICAgIGVsLnN0eWxlLmJhY2tncm91bmQgPSAiIzVhM2ExYzQ0IjsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHN1Ym1pdEV4YW0oKXsKICAgIGlmKE9iamVjdC5rZXlzKGFuc3dlcnMpLmxlbmd0aCA8IHF1ZXN0aW9ucy5sZW5ndGgpewogICAgICBzaG93RXJyb3IoIkJpdHRlIGJlYW50d29ydGUgYWxsZSBGcmFnZW4sIGJldm9yIGR1IGFiZ2lic3QuIik7CiAgICAgIHdpbmRvdy5zY3JvbGxUbygwLDApOwogICAgICByZXR1cm47CiAgICB9CiAgICBoaWRlRXJyb3IoKTsKCiAgICB2YXIgcGF5bG9hZCA9IHF1ZXN0aW9ucy5tYXAoZnVuY3Rpb24ocSl7CiAgICAgIHJldHVybiB7CiAgICAgICAgcXVlc3Rpb25faWQ6IHBhcnNlSW50KHEucXVlc3Rpb25faWQsIDEwKSwKICAgICAgICBzZWxlY3RlZF9vcHRpb246IGFuc3dlcnNbcS5xdWVzdGlvbl9pZF0KICAgICAgfTsKICAgIH0pOwoKICAgIHZhciBidG4gPSAkKCJoa3Atc3VibWl0LWJ0biIpOwogICAgYnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gIjAuNyI7CiAgICBidG4udGV4dENvbnRlbnQgPSAiV2lyZCBhYmdlZ2ViZW4gLi4uIjsKCiAgICBxdWl6RmV0Y2goInN1Ym1pdFF1aXoiLCB7IGt1cnNfaWQ6IEtVUlNfSUQsIGFuc3dlcnM6IHBheWxvYWQgfSkKICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzKXsKICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICBidG4uc3R5bGUub3BhY2l0eSA9ICIxIjsKICAgICAgICBidG4udGV4dENvbnRlbnQgPSAiUHJ1ZWZ1bmcgYWJnZWJlbiI7CiAgICAgICAgdmFyIHJlc3VsdCA9IChyZXMgJiYgcmVzLmRhdGEpID8gcmVzLmRhdGEgOiByZXM7CiAgICAgICAgaWYocmVzdWx0ICYmIHJlc3VsdC5zY29yZV9wZXJjZW50YWdlICE9IG51bGwpewogICAgICAgICAgc2hvd1Jlc3VsdChyZXN1bHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzaG93RXJyb3IoKHJlcyAmJiByZXMubWVzc2FnZSkgPyByZXMubWVzc2FnZSA6ICJBYmdhYmUgZmVobGdlc2NobGFnZW4uIik7CiAgICAgICAgfQogICAgICB9KQogICAgICAuY2F0Y2goZnVuY3Rpb24oKXsKICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICBidG4uc3R5bGUub3BhY2l0eSA9ICIxIjsKICAgICAgICBidG4udGV4dENvbnRlbnQgPSAiUHJ1ZWZ1bmcgYWJnZWJlbiI7CiAgICAgICAgc2hvd0Vycm9yKCJWZXJiaW5kdW5nc2ZlaGxlciBiZWkgZGVyIEFiZ2FiZS4iKTsKICAgICAgfSk7CiAgfQoKICB2YXIgbGFzdFJlc3VsdCA9IG51bGw7CgogIGZ1bmN0aW9uIHNob3dSZXN1bHQoZCl7CiAgICBsYXN0UmVzdWx0ID0gZDsKICAgICQoImhrcC1tYWluIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICQoImhrcC1yZXN1bHQiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgICQoImhrcC1zY29yZSIpLnRleHRDb250ZW50ID0gZm9ybWF0U2NvcmUoZC5zY29yZV9wZXJjZW50YWdlKSArICIlIjsKICAgICQoImhrcC1zY29yZS1kZXRhaWwiKS50ZXh0Q29udGVudCA9IGQuY29ycmVjdF9hbnN3ZXJzICsgIiB2b24gIiArIGQudG90YWxfcXVlc3Rpb25zICsgIiByaWNodGlnIjsKICAgIHdpbmRvdy5zY3JvbGxUbygwLDApOwogIH0KCiAgZnVuY3Rpb24gcGFkMihuKXsgcmV0dXJuIChuIDwgMTAgPyAiMCIgOiAiIikgKyBuOyB9CgogIGZ1bmN0aW9uIHRvZGF5U3RyKCl7CiAgICB2YXIgdCA9IG5ldyBEYXRlKCk7CiAgICByZXR1cm4gcGFkMih0LmdldERhdGUoKSkgKyAiLiIgKyBwYWQyKHQuZ2V0TW9udGgoKSsxKSArICIuIiArIHQuZ2V0RnVsbFllYXIoKTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlRGF0ZShzKXsKICAgIGlmKCFzKSByZXR1cm4gdG9kYXlTdHIoKTsKICAgIHZhciBkID0gU3RyaW5nKHMpLnNwbGl0KCIgIilbMF07CiAgICB2YXIgcCA9IGQuc3BsaXQoIi0iKTsKICAgIGlmKHAubGVuZ3RoID09PSAzKSByZXR1cm4gcFsyXSArICIuIiArIHBbMV0gKyAiLiIgKyBwWzBdOwogICAgcmV0dXJuIHRvZGF5U3RyKCk7CiAgfQoKICBmdW5jdGlvbiBtYWtlVmVyaWZ5SWQoKXsKICAgIHZhciB0ID0gIkhLLSIgKyBLVVJTX0lEICsgIi0iOwogICAgdmFyIGNoYXJzID0gIkFCQ0RFRkdISktMTU5QUVJTVFVWV1hZWjIzNDU2Nzg5IjsKICAgIGZvcih2YXIgaT0wO2k8NjtpKyspeyB0ICs9IGNoYXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqY2hhcnMubGVuZ3RoKSk7IH0KICAgIHJldHVybiB0OwogIH0KCiAgZnVuY3Rpb24gbG9hZFNjcmlwdChzcmMpewogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgIHZhciBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgIHMuc3JjID0gc3JjOwogICAgICBzLm9ubG9hZCA9IHJlc29sdmU7CiAgICAgIHMub25lcnJvciA9IHJlamVjdDsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZ2VuZXJhdGVDZXJ0aWZpY2F0ZSgpewogICAgdmFyIHVzZXIgPSBnZXRVc2VyKCkgfHwge307CiAgICB2YXIgbmFtZSA9IHVzZXIuZnVsbF9uYW1lIHx8ICJUZWlsbmVobWVyIjsKICAgIHZhciBjb3Vyc2UgPSAiSGVsZGVuLVRyYWluaW5nOiBNZW50YWxlIFN0YWVya2UiOwogICAgdmFyIHNjb3JlID0gbGFzdFJlc3VsdCA/IGZvcm1hdFNjb3JlKGxhc3RSZXN1bHQuc2NvcmVfcGVyY2VudGFnZSkgOiAiMCI7CiAgICB2YXIgZGF0ZVN0ciA9IGxhc3RSZXN1bHQgPyBwYXJzZURhdGUobGFzdFJlc3VsdC5jb21wbGV0ZWRfYXQpIDogdG9kYXlTdHIoKTsKICAgIHZhciB2ZXJpZnlJZCA9IG1ha2VWZXJpZnlJZCgpOwoKICAgIHZhciBidG4gPSAkKCJoa3AtY2VydC1idG4iKTsKICAgIGlmKGJ0bil7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICJaZXJ0aWZpa2F0IHdpcmQgZXJzdGVsbHQgLi4uIjsgfQoKICAgIHZhciByZWFkeSA9ICh0eXBlb2Ygd2luZG93LmpzcGRmICE9PSAidW5kZWZpbmVkIiAmJiB3aW5kb3cuanNwZGYuanNQREYpCiAgICAgID8gUHJvbWlzZS5yZXNvbHZlKCkKICAgICAgOiBsb2FkU2NyaXB0KCJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9qc3BkZi8yLjUuMS9qc3BkZi51bWQubWluLmpzIik7CgogICAgcmVhZHkudGhlbihmdW5jdGlvbigpewogICAgICB2YXIganNQREYgPSB3aW5kb3cuanNwZGYuanNQREY7CiAgICAgIHZhciBkb2MgPSBuZXcganNQREYoeyBvcmllbnRhdGlvbjogImxhbmRzY2FwZSIsIHVuaXQ6ICJtbSIsIGZvcm1hdDogImE0IiB9KTsKICAgICAgdmFyIFcgPSAyOTcsIEggPSAyMTA7CgogICAgICAvLyBhcmthIHBsYW4KICAgICAgZG9jLnNldEZpbGxDb2xvcigyNTAsIDI0OCwgMjQzKTsKICAgICAgZG9jLnJlY3QoMCwgMCwgVywgSCwgIkYiKTsKCiAgICAgIC8vIGRpcyBjZXJjZXZlICh0dXJ1bmN1KQogICAgICBkb2Muc2V0RHJhd0NvbG9yKDI0NCwgMTIzLCAzMik7CiAgICAgIGRvYy5zZXRMaW5lV2lkdGgoMik7CiAgICAgIGRvYy5yZWN0KDEwLCAxMCwgVy0yMCwgSC0yMCk7CiAgICAgIGRvYy5zZXRMaW5lV2lkdGgoMC40KTsKICAgICAgZG9jLnJlY3QoMTQsIDE0LCBXLTI4LCBILTI4KTsKCiAgICAgIC8vIHVzdCBldGlrZXQKICAgICAgZG9jLnNldFRleHRDb2xvcigxNTQsIDEyMywgNzkpOwogICAgICBkb2Muc2V0Rm9udCgiaGVsdmV0aWNhIiwgIm5vcm1hbCIpOwogICAgICBkb2Muc2V0Rm9udFNpemUoMTEpOwogICAgICBkb2MudGV4dCgiREpJQklOSE8gIC0gIEhFTERFTiBLVVJTRSIsIFcvMiwgMzQsIHsgYWxpZ246ICJjZW50ZXIiIH0pOwoKICAgICAgLy8gYmFzbGlrCiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMjYsIDI2LCAyNik7CiAgICAgIGRvYy5zZXRGb250KCJoZWx2ZXRpY2EiLCAiYm9sZCIpOwogICAgICBkb2Muc2V0Rm9udFNpemUoMzIpOwogICAgICBkb2MudGV4dCgiVGVpbG5haG1lYmVzdGFldGlndW5nIiwgVy8yLCA1MiwgeyBhbGlnbjogImNlbnRlciIgfSk7CgogICAgICAvLyBheXJhYwogICAgICBkb2Muc2V0RHJhd0NvbG9yKDIxNiwgMjAxLCAxNzYpOwogICAgICBkb2Muc2V0TGluZVdpZHRoKDAuNik7CiAgICAgIGRvYy5saW5lKFcvMi00MCwgNTgsIFcvMis0MCwgNTgpOwoKICAgICAgLy8gbWV0aW4KICAgICAgZG9jLnNldFRleHRDb2xvcig4NSwgODUsIDg1KTsKICAgICAgZG9jLnNldEZvbnQoImhlbHZldGljYSIsICJub3JtYWwiKTsKICAgICAgZG9jLnNldEZvbnRTaXplKDE0KTsKICAgICAgZG9jLnRleHQoIkhpZXJtaXQgd2lyZCBiZXN0YWV0aWd0LCBkYXNzIiwgVy8yLCA3NCwgeyBhbGlnbjogImNlbnRlciIgfSk7CgogICAgICAvLyBhZAogICAgICBkb2Muc2V0VGV4dENvbG9yKDI2LCAyNiwgMjYpOwogICAgICBkb2Muc2V0Rm9udCgiaGVsdmV0aWNhIiwgImJvbGQiKTsKICAgICAgZG9jLnNldEZvbnRTaXplKDI2KTsKICAgICAgZG9jLnRleHQobmFtZSwgVy8yLCA4OCwgeyBhbGlnbjogImNlbnRlciIgfSk7CgogICAgICBkb2Muc2V0VGV4dENvbG9yKDg1LCA4NSwgODUpOwogICAgICBkb2Muc2V0Rm9udCgiaGVsdmV0aWNhIiwgIm5vcm1hbCIpOwogICAgICBkb2Muc2V0Rm9udFNpemUoMTQpOwogICAgICBkb2MudGV4dCgiZGVuIGZvbGdlbmRlbiBLdXJzIGVyZm9sZ3JlaWNoIGFic29sdmllcnQgaGF0OiIsIFcvMiwgMTAwLCB7IGFsaWduOiAiY2VudGVyIiB9KTsKCiAgICAgIC8vIGt1cnMgYWRpCiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMjYsIDI2LCAyNik7CiAgICAgIGRvYy5zZXRGb250KCJoZWx2ZXRpY2EiLCAiYm9sZCIpOwogICAgICBkb2Muc2V0Rm9udFNpemUoMTgpOwogICAgICBkb2MudGV4dChjb3Vyc2UsIFcvMiwgMTE0LCB7IGFsaWduOiAiY2VudGVyIiB9KTsKCiAgICAgIC8vIGFsdCBiaWxnaSBzYXRpcmkgKHNrb3IgLyB0YXJpaCAvIGlkKQogICAgICB2YXIgeSA9IDE0MjsKICAgICAgZG9jLnNldERyYXdDb2xvcigyMTYsIDIwMSwgMTc2KTsKICAgICAgZG9jLnNldExpbmVXaWR0aCgwLjQpOwogICAgICBkb2MubGluZSg0MCwgeS04LCBXLTQwLCB5LTgpOwoKICAgICAgZG9jLnNldEZvbnRTaXplKDEwKTsKICAgICAgZG9jLnNldFRleHRDb2xvcigxNTQsIDEyMywgNzkpOwogICAgICBkb2MudGV4dCgiRVJHRUJOSVMiLCA3MCwgeSwgeyBhbGlnbjogImNlbnRlciIgfSk7CiAgICAgIGRvYy50ZXh0KCJEQVRVTSIsIFcvMiwgeSwgeyBhbGlnbjogImNlbnRlciIgfSk7CiAgICAgIGRvYy50ZXh0KCJCRVNUQUVUSUdVTkdTLUlEIiwgVy03MCwgeSwgeyBhbGlnbjogImNlbnRlciIgfSk7CgogICAgICBkb2Muc2V0Rm9udFNpemUoMTQpOwogICAgICBkb2Muc2V0VGV4dENvbG9yKDI2LCAyNiwgMjYpOwogICAgICBkb2Muc2V0Rm9udCgiaGVsdmV0aWNhIiwgImJvbGQiKTsKICAgICAgZG9jLnRleHQoc2NvcmUgKyAiJSIsIDcwLCB5KzgsIHsgYWxpZ246ICJjZW50ZXIiIH0pOwogICAgICBkb2MudGV4dChkYXRlU3RyLCBXLzIsIHkrOCwgeyBhbGlnbjogImNlbnRlciIgfSk7CiAgICAgIGRvYy50ZXh0KHZlcmlmeUlkLCBXLTcwLCB5KzgsIHsgYWxpZ246ICJjZW50ZXIiIH0pOwoKICAgICAgLy8gYWx0IG5vdAogICAgICBkb2Muc2V0Rm9udCgiaGVsdmV0aWNhIiwgIm5vcm1hbCIpOwogICAgICBkb2Muc2V0Rm9udFNpemUoOSk7CiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMTQwLCAxNDAsIDE0MCk7CiAgICAgIGRvYy50ZXh0KCJLZWluZSBCZXdlcnR1bmcgaW0gU2lubmUgZWluZXIgUHJ1ZWZ1bmdzbm90ZS4gQmVzY2hlaW5pZ3QgZGllIFRlaWxuYWhtZS4iLCBXLzIsIEgtMjYsIHsgYWxpZ246ICJjZW50ZXIiIH0pOwoKICAgICAgdmFyIGZpbGVOYW1lID0gIlRlaWxuYWhtZWJlc3RhZXRpZ3VuZ18iICsgbmFtZS5yZXBsYWNlKC9bXkEtWmEtejAtOV0vZywgIl8iKSArICIucGRmIjsKICAgICAgZG9jLnNhdmUoZmlsZU5hbWUpOwoKICAgICAgaWYoYnRuKXsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICJaZXJ0aWZpa2F0IGhlcnVudGVybGFkZW4iOyB9CiAgICB9KS5jYXRjaChmdW5jdGlvbigpewogICAgICBpZihidG4peyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgYnRuLnRleHRDb250ZW50ID0gIlplcnRpZmlrYXQgaGVydW50ZXJsYWRlbiI7IH0KICAgICAgc2hvd0Vycm9yKCJaZXJ0aWZpa2F0IGtvbm50ZSBuaWNodCBlcnN0ZWxsdCB3ZXJkZW4uIik7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGluaXQoKXsKICAgIHZhciB1c2VyID0gZ2V0VXNlcigpOwogICAgaWYoIXVzZXIgfHwgIXVzZXIuYXV0aF90b2tlbil7CiAgICAgICQoImhrcC1uZWVkLWxvZ2luIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxvYWRRdWVzdGlvbnMoKTsKICB9CgogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAvLyAgWlBQIC8gR0tWIEZPUk1VICAocmVzbWkgUERGJ2kgcGRmLWxpYiBpbGUgZG9sZHVyKQogIC8vICBOT1Q6IFpQUCBiaWxnaWxlcmkgKEt1cnMtSUQsIFByYWV2ZW50aW9uc3ByaW56aXAsCiAgLy8gIEt1cnNsZWl0dW5nKSBzaW1kaWxpayB5ZXIgdHV0dWN1IC0gZ2VyY2VnaSBzb25yYS4KICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgdmFyIFpQUF9QREZfVVJMID0gImh0dHBzOi8vZGppYmluaG8uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA2L3pwcC1mb3JtdWxhci5wZGYiOwoKICAvLyBZZXIgdHV0dWN1IGt1cnVtL2t1cnMgYmlsZ2lsZXJpIChzb25yYSBnZXJjZWdpeWxlIGRlZ2lzdGlyKQogIHZhciBaUFAgPSB7CiAgICBrdXJzX2lkX3pwcDogIlpQUC1YWFhYWCIsCiAgICBwcmFldmVudGlvbnNwcmluemlwOiAiU3RyZXNzbWFuYWdlbWVudCAvIE1lbnRhbGUgR2VzdW5kaGVpdCIsCiAgICBrdXJzbGVpdHVuZzogIlN5bGxhLCBEamlicmlsIiwKICAgIGFuYmlldGVyX25hbWU6ICJESklCSU5ITyIsCiAgICBhbmJpZXRlcl9hZHJlc3NlOiAiTXVzdGVyc3RyYXNzZSAxLCA1MDY2NyBLb2VsbiIsCiAgICBrdXJzZWluaGVpdGVuOiAiOCIsCiAgICBtaW51dGVuOiAiNjAiLAogICAgZ2VidWVocjogIjE0OSwwMCIKICB9OwoKICBmdW5jdGlvbiBnZW5lcmF0ZVpwcEZvcm0oKXsKICAgIHZhciB1c2VyID0gZ2V0VXNlcigpIHx8IHt9OwogICAgdmFyIG5hbWUgPSB1c2VyLmZ1bGxfbmFtZSB8fCAiVGVpbG5laG1lciI7CiAgICB2YXIgYnRuID0gJCgiaGtwLXpwcC1idG4iKTsKICAgIGlmKGJ0bil7IGJ0bi5kaXNhYmxlZCA9IHRydWU7IGJ0bi50ZXh0Q29udGVudCA9ICJHS1YtRm9ybXVsYXIgd2lyZCBlcnN0ZWxsdCAuLi4iOyB9CgogICAgdmFyIHJlYWR5ID0gKHR5cGVvZiB3aW5kb3cuUERGTGliICE9PSAidW5kZWZpbmVkIikKICAgICAgPyBQcm9taXNlLnJlc29sdmUoKQogICAgICA6IGxvYWRTY3JpcHQoImh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL3BkZi1saWIvMS4xNy4xL3BkZi1saWIubWluLmpzIik7CgogICAgcmVhZHkudGhlbihmdW5jdGlvbigpewogICAgICByZXR1cm4gZmV0Y2goWlBQX1BERl9VUkwpLnRoZW4oZnVuY3Rpb24ocil7CiAgICAgICAgaWYoIXIub2spIHRocm93IG5ldyBFcnJvcigiUERGIG5pY2h0IGdlZnVuZGVuIik7CiAgICAgICAgcmV0dXJuIHIuYXJyYXlCdWZmZXIoKTsKICAgICAgfSk7CiAgICB9KS50aGVuKGZ1bmN0aW9uKGJ5dGVzKXsKICAgICAgcmV0dXJuIHdpbmRvdy5QREZMaWIuUERGRG9jdW1lbnQubG9hZChieXRlcyk7CiAgICB9KS50aGVuKGZ1bmN0aW9uKHBkZkRvYyl7CiAgICAgIHZhciBmb3JtID0gcGRmRG9jLmdldEZvcm0oKTsKCiAgICAgIGZ1bmN0aW9uIHNldEZpZWxkKGZpZWxkTmFtZSwgdmFsdWUpewogICAgICAgIHRyeSB7CiAgICAgICAgICB2YXIgZiA9IGZvcm0uZ2V0VGV4dEZpZWxkKGZpZWxkTmFtZSk7CiAgICAgICAgICBpZihmKXsgZi5zZXRUZXh0KFN0cmluZyh2YWx1ZSkpOyB9CiAgICAgICAgfSBjYXRjaChlKXsgLyogYWxhbiB5b2tzYSBnZWMgKi8gfQogICAgICB9CgogICAgICAvLyAtLS0gVGVpbCAxOiBzaXN0ZW1pbiBkb2xkdXJkdWd1IGFsYW5sYXIgLS0tCiAgICAgIHNldEZpZWxkKCJWb3IgdW5kIE5hY2huYW1lIGRlciB0ZWlsbmVobWVuZGVuIFBlcnNvbiIsIG5hbWUpOwogICAgICBzZXRGaWVsZCgiRGF0ZW5iYW5rIGRlciBaZW50cmFsZSIsIFpQUC5rdXJzX2lkX3pwcCk7CiAgICAgIHNldEZpZWxkKCJQcmFldmVudGlvbnNwcmluemlwIiwgWlBQLnByYWV2ZW50aW9uc3ByaW56aXApOwogICAgICBzZXRGaWVsZCgiUHLDpHZlbnRpb25zcHJpbnppcCIsIFpQUC5wcmFldmVudGlvbnNwcmluemlwKTsKICAgICAgc2V0RmllbGQoIkt1cnNsZWl0dW5nIiwgWlBQLmt1cnNsZWl0dW5nKTsKICAgICAgc2V0RmllbGQoImFuIiwgWlBQLmt1cnNlaW5oZWl0ZW4pOwogICAgICBzZXRGaWVsZCgiS3Vyc2VpbmhlaXRlbiDDpCIsIFpQUC5taW51dGVuKTsKICAgICAgc2V0RmllbGQoIkRpZSBUZWlsbmFobWVnZWLDvGhyIHZvbiIsIFpQUC5nZWJ1ZWhyKTsKICAgICAgc2V0RmllbGQoIk5hbWUgZGVzIGFuYmlldGVuZGVuIFVudGVybmVobWVucyBkZXIgYW5iaWV0ZW5kZW4iLCBaUFAuYW5iaWV0ZXJfbmFtZSk7CiAgICAgIHNldEZpZWxkKCJBZHJlc3NlIGRlcyBhbmJpZXRlbmRlbiBVbnRlcm5laG1lbnMgZGVyIGFuYmlldGVuZCIsIFpQUC5hbmJpZXRlcl9hZHJlc3NlKTsKCiAgICAgIC8vIFRlaWwgMidkZSBrYXRpbGltY2luaW4gYWRpIChrZW5kaSBkb2xkdXJhYmlsaXIgYW1hIG9uLWRvbGR1cmFsXHUwMTMxbSkKICAgICAgc2V0RmllbGQoIlZvciB1bmQgTmFjaG5hbWUgZGVyIEdLVnZlcnNpY2hlcnRlbiBQZXJzb24iLCBuYW1lKTsKCiAgICAgIC8vIE5PVDogR2VidXJ0c2RhdHVtLCBWZXJzaWNoZXJ0ZW5OciwgSUJBTiwgaW16YWxhciwgT3J0L0RhdHVtCiAgICAgIC8vIGJpbGVyZWsgQk9TIC0ga2lzaSBlbGxlIGRvbGR1cm1hbGkgKGhhc3Nhcy9raXNpc2VsIHZlcmkpLgoKICAgICAgcmV0dXJuIHBkZkRvYy5zYXZlKCk7CiAgICB9KS50aGVuKGZ1bmN0aW9uKG91dCl7CiAgICAgIHZhciBibG9iID0gbmV3IEJsb2IoW291dF0sIHsgdHlwZTogImFwcGxpY2F0aW9uL3BkZiIgfSk7CiAgICAgIHZhciB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKICAgICAgYS5ocmVmID0gdXJsOwogICAgICBhLmRvd25sb2FkID0gIkdLVi1UZWlsbmFobWViZXNjaGVpbmlndW5nXyIgKyBuYW1lLnJlcGxhY2UoL1teQS1aYS16MC05XS9nLCJfIikgKyAiLnBkZiI7CiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7CiAgICAgIGEuY2xpY2soKTsKICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTsKICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpOwogICAgICBpZihidG4peyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgYnRuLnRleHRDb250ZW50ID0gIkdLVi1Gb3JtdWxhciBoZXJ1bnRlcmxhZGVuIjsgfQogICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKXsKICAgICAgaWYoYnRuKXsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICJHS1YtRm9ybXVsYXIgaGVydW50ZXJsYWRlbiI7IH0KICAgICAgc2hvd0Vycm9yKCJHS1YtRm9ybXVsYXIga29ubnRlIG5pY2h0IGVyc3RlbGx0IHdlcmRlbi4gKCIgKyAoZXJyICYmIGVyci5tZXNzYWdlID8gZXJyLm1lc3NhZ2UgOiAiRmVobGVyIikgKyAiKSIpOwogICAgfSk7CiAgfQoKICB2YXIgc3VibWl0QnRuID0gJCgiaGtwLXN1Ym1pdC1idG4iKTsKICBpZihzdWJtaXRCdG4peyBzdWJtaXRCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBzdWJtaXRFeGFtKTsgfQogIHZhciByZXRyeUJ0biA9ICQoImhrcC1yZXRyeS1idG4iKTsKICBpZihyZXRyeUJ0bil7IHJldHJ5QnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgbG9hZFF1ZXN0aW9ucyk7IH0KICB2YXIgY2VydEJ0biA9ICQoImhrcC1jZXJ0LWJ0biIpOwogIGlmKGNlcnRCdG4peyBjZXJ0QnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZ2VuZXJhdGVDZXJ0aWZpY2F0ZSk7IH0KICB2YXIgenBwQnRuID0gJCgiaGtwLXpwcC1idG4iKTsKICBpZih6cHBCdG4peyB6cHBCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBnZW5lcmF0ZVpwcEZvcm0pOyB9CgogIGluaXQoKTsKfSkoKTsK