Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@本地资源管理@eyJsYXN0X2NoYXB0ZXJfcnVsZSI6IiIsInRpdGxlIjoi5pys5Zyw6LWE5rqQ566h55CGIiwiYXV0aG9yIjoiQExveURnSWsiLCJ1cmwiOiJoaWtlcjovL2VtcHR5IiwidmVyc2lvbiI6OTksImNvbF90eXBlIjoibW92aWVfM19tYXJxdWVlIiwiY2xhc3NfbmFtZSI6IiIsInR5cGUiOiJ0b29sIiwiY2xhc3NfdXJsIjoiIiwiYXJlYV9uYW1lIjoiIiwiYXJlYV91cmwiOiIiLCJzb3J0X25hbWUiOiIiLCJ5ZWFyX25hbWUiOiIiLCJzb3J0X3VybCI6IiIsInllYXJfdXJsIjoiIiwiZmluZF9ydWxlIjoianM6XG5pZiAoIWdldEl0ZW0oXCI6c3RhcnRVc2VcIiwgZmFsc2UpKSB7XG4gICAgdG9hc3QoXCI6LSnliJ3mrKHop4HpnaLvvIzor7flpJrlhbPnhadcIik7XG4gICAgY29uZmlybSh7XG4gICAgICAgIHRpdGxlOiBcIuS9v+eUqOmhu+efpVwiLFxuICAgICAgICBjb250ZW50OiBcIjEu5pmu6YCa55So5oi377ya5pys56iL5bqP5Y+q5o+Q5L6b5pys5Zyw6ZiF6K+75pyN5Yqh77yM5LiN5o+Q5L6b572R57uc5YaF5a6544CCXFxuXFxuMi7lvIDlj5HogIXvvJrmj5DkvpvlpJrnur/nqIvkuIvovb3mlK/mjIHjgIJcXG5cXG4zLuWmguS9leiOt+WPluWGheWuuT9cXG7pgJrov4fjgIzogZrmvKvjgI3jgIzpgZPplb/lkIjpm4bjgI3nrYnnrKzkuInmlrnlsI/nqIvluo/kuIvovb3jgIJcIixcbiAgICAgICAgY29uZmlybTogXCJzZXRJdGVtKCc6c3RhcnRVc2UnLCcxJyk7cmVmcmVzaFBhZ2UoKTsndG9hc3Q6Ly/mhJ/osKLmgqjnmoTnkIbop6MnXCIsXG4gICAgICAgIGNhbmNlbDogXCIndG9hc3Q6Ly/lvojpgZfmhr7vvIzkuI3og73kuLrmgqjmnI3liqHjgIJcXFxcbumVv+aMieagh+mimOWPr+WIoOmZpOOAgidcIlxuICAgIH0pO1xuICAgIHNldFJlc3VsdChbXSk7XG59IGVsc2UgaWYgKE1ZX1JVTEUudGl0bGUgIT09IFwi5pys5Zyw6LWE5rqQ566h55CGXCIpIHtcbiAgICBjb25maXJtKHtcbiAgICAgICAgdGl0bGU6IFwi6K2m5ZGK4pqgXCIsXG4gICAgICAgIGNvbnRlbnQ6IFwi5LiN6IO95pS55ZCN5ZOm77yBXCIsXG4gICAgICAgIGNvbmZpcm06ICQudG9TdHJpbmcoKCkgPT4ge1xuICAgICAgICAgICAgTVlfUlVMRS50aXRsZSA9IFwi5pys5Zyw6LWE5rqQ566h55CGXCI7XG4gICAgICAgICAgICB0b2FzdChcIuW3suW4ruS9oOaUueWbnuWOn+WQje+8jOivt+mHjeaWsOWvvOWFpVwiKTtcbiAgICAgICAgICAgIHJldHVybiBcInJ1bGU6Ly9cIiArIGJhc2U2NEVuY29kZShcIua1t+mYlOinhueVjO+/pWhvbWVfcnVsZe+/pVwiICsgSlNPTi5zdHJpbmdpZnkoTVlfUlVMRSkpO1xuICAgICAgICB9KSxcbiAgICAgICAgY2FuY2VsOiBcIid0b2FzdDovL+W+iOmBl+aGvu+8jOS4jeiDveS4uuaCqOacjeWKoeOAglxcXFxu6ZW/5oyJ5qCH6aKY5Y+v5Yig6Zmk44CCJ1wiXG4gICAgfSk7XG4gICAgc2V0UmVzdWx0KFtdKTtcbn0gZWxzZSB7XG4gICAgJC5yZXF1aXJlKFwiaGlrZXI6Ly9wYWdlL01haW4udmlld1wiKTtcbn0iLCJzZWFyY2hfdXJsIjoiIiwiZ3JvdXAiOiLlt6XlhbciLCJzZWFyY2hGaW5kIjoiIiwiZGV0YWlsX2NvbF90eXBlIjoibW92aWVfMSIsImRldGFpbF9maW5kX3J1bGUiOiIiLCJzZGV0YWlsX2NvbF90eXBlIjoibW92aWVfMSIsInNkZXRhaWxfZmluZF9ydWxlIjoiIiwidWEiOiJtb2JpbGUiLCJwcmVSdWxlIjoiIiwicGFnZXMiOiJbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiNmLkZpbGXlt6XlhbdcIixcInBhdGhcIjpcIkZpbGUuanNcIixcInJ1bGVcIjpcImNvbnN0IEZpbGUgPSBqYXZhLmlvLkZpbGU7XFxuY29uc3Qge1xcbiAgICBGaWxlcyxcXG4gICAgUGF0aHMsXFxuICAgIFN0YW5kYXJkQ29weU9wdGlvbixcXG4gICAgU3RhbmRhcmRPcGVuT3B0aW9uXFxufSA9IGphdmEubmlvLmZpbGU7XFxuY29uc3QgamF2YVN0cmluZyA9IGphdmEubGFuZy5TdHJpbmc7XFxubGV0IGphdmFTY29wZSA9IG5ldyBKYXZhSW1wb3J0ZXIoamF2YS5pbywgamF2YS5sYW5nLCBqYXZhLmxhbmcucmVmbGVjdCwgamF2YS51dGlsLlZlY3Rvcik7XFxuXFxuZnVuY3Rpb24gZGVsZXRlRmlsZXMoZmlsZU5hbWUpIHtcXG4gICAgbGV0IGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7XFxuICAgIGlmICghZmlsZS5leGlzdHMoKSkge1xcbiAgICAgICAgLy9sb2coXFxcIuWIoOmZpOaWh+S7tuWksei0pe+8mlxcXCIgKyBmaWxlTmFtZSArIFxcXCLmlofku7bkuI3lrZjlnKhcXFwiKTtcXG4gICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZUZpbGUoZmlsZU5hbWUpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gZGVsZXRlRGlyZWN0b3J5KGZpbGVOYW1lKTtcXG4gICAgICAgIH1cXG5cXG4gICAgfVxcblxcbn1cXG4vKipcXG4gKiDliKDpmaTljZXkuKrmlofku7ZcXG4gKiBcXG4gKiBAcGFyYW0gZmlsZU5hbWVcXG4gKiAgICAgICAgICAgIOiiq+WIoOmZpOaWh+S7tueahOaWh+S7tuWQjVxcbiAqIEByZXR1cm4g5Y2V5Liq5paH5Lu25Yig6Zmk5oiQ5Yqf6L+U5ZuedHJ1ZSzlkKbliJnov5Tlm55mYWxzZVxcbiAqL1xcbmZ1bmN0aW9uIGRlbGV0ZUZpbGUoZmlsZU5hbWUpIHtcXG4gICAgbGV0IGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7XFxuICAgIGlmIChmaWxlLmlzRmlsZSgpICYmIGZpbGUuZXhpc3RzKCkpIHtcXG4gICAgICAgIGZpbGUuZGVsZXRlKCk7XFxuICAgICAgICAvL2xvZyhcXFwi5Yig6Zmk5Y2V5Liq5paH5Lu2XFxcIiArIGZpbGVOYW1lICsgXFxcIuaIkOWKn++8gVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICAvL2xvZyhcXFwi5Yig6Zmk5Y2V5Liq5paH5Lu2XFxcIiArIGZpbGVOYW1lICsgXFxcIuWksei0pe+8gVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxuXFxufVxcbi8qKlxcbiAqIOWIoOmZpOebruW9le+8iOaWh+S7tuWkue+8ieS7peWPiuebruW9leS4i+eahOaWh+S7tlxcbiAqIFxcbiAqIEBwYXJhbSBkaXJcXG4gKiAgICAgICAgICAgIOiiq+WIoOmZpOebruW9leeahOaWh+S7tui3r+W+hFxcbiAqIEByZXR1cm4g55uu5b2V5Yig6Zmk5oiQ5Yqf6L+U5ZuedHJ1ZSzlkKbliJnov5Tlm55mYWxzZVxcbiAqL1xcbmZ1bmN0aW9uIGRlbGV0ZURpcmVjdG9yeShkaXIpIHtcXG4gICAgLy8g5aaC5p6cZGly5LiN5Lul5paH5Lu25YiG6ZqU56ym57uT5bC+77yM6Ieq5Yqo5re75Yqg5paH5Lu25YiG6ZqU56ymXFxuICAgIGlmICghZGlyLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkge1xcbiAgICAgICAgZGlyID0gZGlyICsgRmlsZS5zZXBhcmF0b3I7XFxuICAgIH1cXG4gICAgbGV0IGRpckZpbGUgPSBuZXcgRmlsZShkaXIpO1xcbiAgICAvLyDlpoLmnpxkaXLlr7nlupTnmoTmlofku7bkuI3lrZjlnKjvvIzmiJbogIXkuI3mmK/kuIDkuKrnm67lvZXvvIzliJnpgIDlh7pcXG4gICAgaWYgKCFkaXJGaWxlLmV4aXN0cygpIHx8ICFkaXJGaWxlLmlzRGlyZWN0b3J5KCkpIHtcXG4gICAgICAgIC8vbG9nKFxcXCLliKDpmaTnm67lvZXlpLHotKVcXFwiICsgZGlyICsgXFxcIuebruW9leS4jeWtmOWcqO+8gVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxuICAgIGxldCBmbGFnID0gdHJ1ZTtcXG4gICAgLy8g5Yig6Zmk5paH5Lu25aS55LiL55qE5omA5pyJ5paH5Lu2KOWMheaLrOWtkOebruW9lSlcXG4gICAgbGV0IGZpbGVzID0gZGlyRmlsZS5saXN0RmlsZXMoKTtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgLy8g5Yig6Zmk5a2Q5paH5Lu2XFxuICAgICAgICBpZiAoZmlsZXNbaV0uaXNGaWxlKCkpIHtcXG4gICAgICAgICAgICBmbGFnID0gZGVsZXRlRmlsZShmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7XFxuICAgICAgICAgICAgaWYgKCFmbGFnKSB7XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7IC8vIOWIoOmZpOWtkOebruW9lVxcbiAgICAgICAgICAgIGZsYWcgPSBkZWxldGVEaXJlY3RvcnkoZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpO1xcbiAgICAgICAgICAgIGlmICghZmxhZykge1xcbiAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgaWYgKCFmbGFnKSB7XFxuICAgICAgICAvL2xvZyhcXFwi5Yig6Zmk55uu5b2V5aSx6LSlXFxcIik7XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH1cXG4gICAgLy8g5Yig6Zmk5b2T5YmN55uu5b2VXFxuICAgIGlmIChkaXJGaWxlLmRlbGV0ZSgpKSB7XFxuICAgICAgICAvL2xvZyhcXFwi5Yig6Zmk55uu5b2VXFxcIiArIGRpciArIFxcXCLmiJDlip/vvIFcXFwiKTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgLy9sb2coXFxcIuWIoOmZpOebruW9lVxcXCIgKyBkaXIgKyBcXFwi5aSx6LSl77yBXFxcIik7XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH1cXG59XFxuXFxuLy9jb3B55Y2V5Liq5paH5Lu2XFxuZnVuY3Rpb24gY29weUZpbGUoc291cmNlLCB0YXJnZXQsIGlzQ292ZXIpIHtcXG4gICAgbGV0IHNvdXJjZVBhdGggPSBQYXRocy5nZXQoc291cmNlKTtcXG4gICAgbGV0IHRhcmdldFBhdGggPSBQYXRocy5nZXQodGFyZ2V0KTtcXG4gICAgbGV0IGlzRXhpc3QgPSBGaWxlcy5leGlzdHModGFyZ2V0UGF0aCk7XFxuICAgIGlmIChGaWxlcy5pc0RpcmVjdG9yeShzb3VyY2VQYXRoKSB8fCAoaXNFeGlzdCAmJiAhaXNDb3ZlcikgfHwgKGlzRXhpc3QgJiYgRmlsZXMuaXNEaXJlY3RvcnkodGFyZ2V0UGF0aCkpKSB7XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIGlmICghaXNFeGlzdCkge1xcbiAgICAgICAgICAgIEZpbGVzLmNyZWF0ZURpcmVjdG9yaWVzKHRhcmdldFBhdGguZ2V0UGFyZW50KCkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGlzQ292ZXIgPT09IHRydWUpIHtcXG4gICAgICAgICAgICBGaWxlcy5jb3B5KHNvdXJjZVBhdGgsIHRhcmdldFBhdGgsIFN0YW5kYXJkQ29weU9wdGlvbi5SRVBMQUNFX0VYSVNUSU5HLCBTdGFuZGFyZENvcHlPcHRpb24uQ09QWV9BVFRSSUJVVEVTKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgRmlsZXMuY29weShzb3VyY2VQYXRoLCB0YXJnZXRQYXRoLCBTdGFuZGFyZENvcHlPcHRpb24uQ09QWV9BVFRSSUJVVEVTKTtcXG4gICAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGdldEZpbGVUaW1lKHBhdGgpIHtcXG4gICAgbGV0IGZpbGUgPSBuZXcgRmlsZShwYXRoKTtcXG4gICAgbGV0IGxhc3RNb2RpZmllZCA9IGZpbGUubGFzdE1vZGlmaWVkKCk7XFxuICAgIGxldCBkYXRlID0gbmV3IERhdGUobGFzdE1vZGlmaWVkKTtcXG4gICAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXROYW1lKHBhdGgpIHtcXG4gICAgcmV0dXJuIG5ldyBGaWxlKHBhdGgpLmdldE5hbWUoKSArIFxcXCJcXFwiO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRGaWxlUGF0aChwYXRoLCB0eXBlLCBleHBhbmQpIHtcXG4gICAgdHlwZSA9IHR5cGUgfHwgXFxcImZpbGVcXFwiO1xcbiAgICBpZiAoIVtcXFwiZmlsZVxcXCIsIFxcXCJkaXJcXFwiXS5pbmNsdWRlcyh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKFxcXCLnsbvlnovplJnor69cXFwiKTtcXG4gICAgbGV0IGZpbGVUeXBlID0gdHlwZSA9PT0gXFxcImZpbGVcXFwiID8gXFxcImlzRmlsZVxcXCIgOiBcXFwiaXNEaXJlY3RvcnlcXFwiO1xcbiAgICBsZXQgZmlsZSA9IG5ldyBGaWxlKHBhdGgpO1xcbiAgICBsZXQgYXJyYXkgPSBmaWxlLmxpc3RGaWxlcygpIHx8IFtdO1xcbiAgICBsZXQgcGF0aExpc3QgPSBbXTtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgaWYgKGFycmF5W2ldW2ZpbGVUeXBlXSgpKSB7XFxuICAgICAgICAgICAgcGF0aExpc3QucHVzaCh7XFxuICAgICAgICAgICAgICAgIG5hbWU6IGFycmF5W2ldLmdldE5hbWUoKSArIFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICBwYXRoOiBhcnJheVtpXS5nZXRQYXRoKCkgKyBcXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBOdW1iZXIoYXJyYXlbaV0ubGFzdE1vZGlmaWVkKCkpLFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGlmIChleHBhbmQpIHtcXG4gICAgICAgIHBhdGhMaXN0ID0gcGF0aExpc3QuZmlsdGVyKGl0ID0+IGl0Lm5hbWUuZW5kc1dpdGgoZXhwYW5kKSk7XFxuICAgIH1cXG4gICAgcmV0dXJuIHBhdGhMaXN0O1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRGaWxlcyhwYXRoLCB0eXBlLCBleHBhbmQpIHtcXG4gICAgbGV0IHR5cGVzID0ge1xcbiAgICAgICAgXFxcImZpbGVcXFwiOiBcXFwiaXNGaWxlXFxcIixcXG4gICAgICAgIFxcXCJkaXJcXFwiOiBcXFwiaXNEaXJlY3RvcnlcXFwiXFxuICAgIH07XFxuICAgIGxldCBmaWxlVHlwZSA9IHR5cGVzW3R5cGVdO1xcbiAgICBsZXQgZmlsZSA9IG5ldyBGaWxlKHBhdGgpO1xcbiAgICBsZXQgYXJyYXkgPSBmaWxlLmxpc3RGaWxlcygpIHx8IFtdO1xcbiAgICBsZXQgZmlsZUxpc3QgPSBbXTtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgbGV0IGZpbGUgPSBhcnJheVtpXTtcXG4gICAgICAgIGlmICgoIWZpbGVUeXBlIHx8IGZpbGVbZmlsZVR5cGVdKCkpICYmICghZXhwYW5kIHx8IGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKGV4cGFuZCkpKSB7XFxuICAgICAgICAgICAgZmlsZUxpc3QucHVzaChmaWxlKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICByZXR1cm4gZmlsZUxpc3Q7XFxufVxcblxcbmZ1bmN0aW9uIHJlbmFtZUZpbGUoZnJvbVBhdGgsIG5hbWUpIHtcXG4gICAgbGV0IGZyb21GaWxlID0gbmV3IEZpbGUoZnJvbVBhdGgpO1xcbiAgICBsZXQgdG9GaWxlID0gbmV3IEZpbGUoZnJvbUZpbGUuZ2V0UGFyZW50KCkgKyBcXFwiL1xcXCIgKyBuYW1lKTtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGlmICghZnJvbUZpbGUuZXhpc3RzKCkpIHtcXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAodG9GaWxlLmV4aXN0cygpKSB7XFxuICAgICAgICAgICAgaWYgKCF0b0ZpbGUuZGVsZXRlKCkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIEZpbGVzLm1vdmUoZnJvbUZpbGUudG9QYXRoKCksIHRvRmlsZS50b1BhdGgoKSwgU3RhbmRhcmRDb3B5T3B0aW9uLlJFUExBQ0VfRVhJU1RJTkcpO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIG1vdmVGaWxlcyhmcm9tUGF0aCwgdG9QYXRoKSB7XFxuICAgIGxldCBmcm9tRmlsZSA9IG5ldyBGaWxlKGZyb21QYXRoKTtcXG4gICAgbGV0IHRvRmlsZSA9IG5ldyBGaWxlKHRvUGF0aCk7XFxuICAgIHRyeSB7XFxuICAgICAgICBpZiAoIWZyb21GaWxlLmV4aXN0cygpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHRvRmlsZS5leGlzdHMoKSkge1xcbiAgICAgICAgICAgIGlmICghZGVsZXRlRmlsZXModG9QYXRoKSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgRmlsZXMubW92ZShmcm9tRmlsZS50b1BhdGgoKSwgdG9GaWxlLnRvUGF0aCgpLCBTdGFuZGFyZENvcHlPcHRpb24uUkVQTEFDRV9FWElTVElORyk7XFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gZmlsZVdyaXRlKHBhdGgsIGNvbnRlbnQpIHtcXG4gICAgd3JpdGVGaWxlKFxcXCJmaWxlOi8vXFxcIiArIHBhdGgsIGNvbnRlbnQpXFxufVxcblxcbmZ1bmN0aW9uIGZpbGVXcml0ZUFwcGVuZChwYXRoLCBjb250ZW50KSB7XFxuICAgIGxldCBmaWxlID0gbmV3IEZpbGUocGF0aCk7XFxuICAgIGxldCBwYXRocyA9IGZpbGUudG9QYXRoKCk7XFxuICAgIGlmIChmaWxlLmV4aXN0cygpKSB7XFxuICAgICAgICBGaWxlcy53cml0ZShwYXRocywgbmV3IGphdmFTdHJpbmcoY29udGVudCkuZ2V0Qnl0ZXMoKSwgU3RhbmRhcmRPcGVuT3B0aW9uLkFQUEVORCk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCwgY29udGVudCk7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gZ2V0VG90YWxTaXplT2ZGaWxlc0luRGlyKGZpbGUpIHtcXG4gICAgaWYgKGZpbGUuaXNGaWxlKCkpIHtcXG4gICAgICAgIHJldHVybiBmaWxlLmxlbmd0aCgpO1xcbiAgICB9XFxuICAgIGxldCBjaGlsZHJlbiA9IGZpbGUubGlzdEZpbGVzKCk7XFxuICAgIGxldCB0b3RhbCA9IDA7XFxuICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7XFxuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbikge1xcbiAgICAgICAgICAgIHRvdGFsICs9IGdldFRvdGFsU2l6ZU9mRmlsZXNJbkRpcihjaGlsZCk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgcmV0dXJuIHRvdGFsO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRGaWxlU2l6ZShmaWxlUGF0aCkge1xcbiAgICAvL0J5dGVcXG4gICAgbGV0IHNpemUgPSBnZXRUb3RhbFNpemVPZkZpbGVzSW5EaXIobmV3IEZpbGUoZmlsZVBhdGgpKTtcXG4gICAgaWYgKHNpemUgPCAwKSB7XFxuICAgICAgICByZXR1cm4gbnVsbDtcXG4gICAgfVxcbiAgICBsZXQgdW5pdEZvcm0gPSBbXFxcIkJ5dGVcXFwiLCBcXFwiS0JcXFwiLCBcXFwiTUJcXFwiLCBcXFwiR0JcXFwiLCBcXFwiVEJcXFwiXTtcXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHVuaXRGb3JtLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XFxuICAgICAgICBpZiAoc2l6ZSA+IDEwMjQpIHtcXG4gICAgICAgICAgICBzaXplIC89IDEwMjQ7XFxuICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiBzaXplLnRvRml4ZWQoMikucmVwbGFjZSgvKFxcXFwuMDApJC8sIFxcXCJcXFwiKSArIHVuaXRGb3JtW2ldO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHJldHVybiBcXFwiRVJST1I65pWw5YC86L+H5aSnXFxcIjtcXG59XFxuLy/lrozmlbTlkIjlubZcXG4vKlxcbmZ1bmN0aW9uIGZpbGVDb21iaW5lKGZpbGVzSW5wdXQsIGZpbGVPdXQsIGV4dGVuc2lvbiwgaW50ZXJjZXB0KSB7XFxuICAgIHdpdGgoamF2YVNjb3BlKSB7XFxuICAgICAgICBjb25zdCBUTVBfQlVGRkVSX1NJWkUgPSAweDMwMDAwO1xcbiAgICAgICAgY29uc3QgQlVGRkVSX1NJWkUgPSAweDMwMDAwMDtcXG4gICAgICAgIC8v5ZCI5bm25Li05pe25paH5Lu2XFxuICAgICAgICBsZXQgaW5wdXRGaWxlID0gbmV3IEZpbGUoZmlsZXNJbnB1dCk7XFxuICAgICAgICBsZXQgdG1wRmlsZSA9IG5ldyBGaWxlKGZpbGVPdXQgKyBcXFwiLnRtcFxcXCIpO1xcbiAgICAgICAgbGV0IHRvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBGaWxlKSk7XFxuICAgICAgICBsZXQgaW5wdXRGaWxlcyA9IGlucHV0RmlsZS5saXN0RmlsZXMoKTtcXG4gICAgICAgIGxldCB0YnlzID0gQXJyYXkubmV3SW5zdGFuY2UoQnl0ZS5UWVBFLCBUTVBfQlVGRkVSX1NJWkUpO1xcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBpbnB1dEZpbGVzKSB7XFxuICAgICAgICAgICAgaWYgKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKGV4dGVuc2lvbikpIHtcXG4gICAgICAgICAgICAgICAgbGV0IGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTtcXG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IDA7XFxuICAgICAgICAgICAgICAgIHdoaWxlICgobGVuID0gaXMucmVhZCh0YnlzKSkgIT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHRvcy53cml0ZSh0YnlzLCAwLCBsZW4pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgdG9zLmNsb3NlKCk7XFxuICAgICAgICAvL+inhOWImeabv+aNouinhOWImTtcXG4gICAgICAgIGxldCBvdXRGaWxlID0gbmV3IEZpbGUoZmlsZU91dCk7XFxuICAgICAgICBpZiAodHlwZW9mIGludGVyY2VwdCA9PT0gXFxcImZ1bmN0aW9uXFxcIikge1xcbiAgICAgICAgICAgIGxldCB0aXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRtcEZpbGUpO1xcbiAgICAgICAgICAgIGxldCBvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRGaWxlKSk7XFxuICAgICAgICAgICAgbGV0IGxlbiA9IDA7XFxuICAgICAgICAgICAgbGV0IGJ5cyA9IEFycmF5Lm5ld0luc3RhbmNlKEJ5dGUuVFlQRSwgQlVGRkVSX1NJWkUpO1xcbiAgICAgICAgICAgIHdoaWxlICgobGVuID0gdGlzLnJlYWQoYnlzKSkgIT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgbGV0IG5ieXMgPSBpbnRlcmNlcHQobmV3IFN0cmluZyhieXMsMCxsZW4pKTtcXG4gICAgICAgICAgICAgICAgb3Mud3JpdGUobmJ5cywgMCwgbmJ5cy5sZW5ndGgpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0bXBGaWxlLmRlbGV0ZSgpO1xcbiAgICAgICAgICAgIHRpcy5jbG9zZSgpO1xcbiAgICAgICAgICAgIG9zLmNsb3NlKCk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGlmIChvdXRGaWxlLmV4aXN0cygpKSB7XFxuICAgICAgICAgICAgICAgIG91dEZpbGUuZGVsZXRlKCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHRtcEZpbGUucmVuYW1lVG8ob3V0RmlsZSk7XFxuICAgICAgICB9XFxuICAgIH1cXG59Ki9cXG4vL+aui1xcbmZ1bmN0aW9uIGZpbGVSdWxlKGZpbGVzSW5wdXQsIGZpbGVPdXQsIGludGVyY2VwdCkge1xcbiAgICB3aXRoKGphdmFTY29wZSkge1xcbiAgICAgICAgY29uc3QgQlVGRkVSX1NJWkUgPSAweDMwMDAwMDtcXG4gICAgICAgIGxldCB0bXBGaWxlID0gbmV3IEZpbGUoZmlsZXNJbnB1dCk7XFxuICAgICAgICBpZiAoISh0bXBGaWxlLmV4aXN0cygpICYmIHRtcEZpbGUuaXNGaWxlKCkpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IG91dEZpbGUgPSBuZXcgRmlsZShmaWxlT3V0KTtcXG5cXG4gICAgICAgIGxldCB0aXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRtcEZpbGUpO1xcbiAgICAgICAgbGV0IG9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUpKTtcXG4gICAgICAgIGxldCBsZW4gPSAwO1xcbiAgICAgICAgbGV0IGJ5cyA9IEFycmF5Lm5ld0luc3RhbmNlKEJ5dGUuVFlQRSwgQlVGRkVSX1NJWkUpO1xcbiAgICAgICAgd2hpbGUgKChsZW4gPSB0aXMucmVhZChieXMpKSAhPSAtMSkge1xcbiAgICAgICAgICAgIGxldCBuYnlzID0gaW50ZXJjZXB0KG5ldyBTdHJpbmcoYnlzLCAwLCBsZW4pKTtcXG4gICAgICAgICAgICBvcy53cml0ZShuYnlzLCAwLCBuYnlzLmxlbmd0aCk7XFxuICAgICAgICB9XFxuICAgICAgICB0bXBGaWxlLmRlbGV0ZSgpO1xcbiAgICAgICAgdGlzLmNsb3NlKCk7XFxuICAgICAgICBvcy5jbG9zZSgpO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gcmVhZEZpbGUocGF0aCkge1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IHBhdGhzID0gUGF0aHMuZ2V0KHBhdGgpO1xcbiAgICAgICAgaWYgKCFGaWxlcy5leGlzdHMocGF0aHMpKSByZXR1cm4gXFxcIlxcXCI7XFxuICAgICAgICByZXR1cm4gU3RyaW5nKG5ldyBqYXZhU3RyaW5nKEZpbGVzLnJlYWRBbGxCeXRlcyhwYXRocykpKTtcXG4gICAgfSBjYXRjaCB7XFxuICAgICAgICByZXR1cm4gXFxcIlxcXCI7XFxuICAgIH1cXG59XFxuJC5leHBvcnRzID0ge1xcbiAgICBnZXRGaWxlVGltZTogKHBhdGgpID0+IGdldEZpbGVUaW1lKHBhdGgpLFxcbiAgICBnZXRGaWxlUGF0aDogKHBhdGgsIHR5cGUsIGV4cGFuZCkgPT4gZ2V0RmlsZVBhdGgocGF0aCwgdHlwZSwgZXhwYW5kKSxcXG4gICAgZGVsZXRlRmlsZXM6IChwYXRoKSA9PiBkZWxldGVGaWxlcyhwYXRoKSxcXG4gICAgcmVuYW1lRmlsZTogKHBhdGgsIG5hbWUpID0+IHJlbmFtZUZpbGUocGF0aCwgbmFtZSksXFxuICAgIG1vdmVGaWxlczogKGZyb21QYXRoLCB0b1BhdGgpID0+IG1vdmVGaWxlcyhmcm9tUGF0aCwgdG9QYXRoKSxcXG4gICAgZmlsZVdyaXRlOiAocGF0aCwgY29udGVudCkgPT4gZmlsZVdyaXRlKHBhdGgsIGNvbnRlbnQpLFxcbiAgICBmaWxlV3JpdGVBcHBlbmQ6IChwYXRoLCBjb250ZW50KSA9PiBmaWxlV3JpdGVBcHBlbmQocGF0aCwgY29udGVudCksXFxuICAgIGdldE5hbWU6IChwYXRoKSA9PiBnZXROYW1lKHBhdGgpLFxcbiAgICBnZXRGaWxlU2l6ZTogKGZpbGVQYXRoKSA9PiBnZXRGaWxlU2l6ZShmaWxlUGF0aCksXFxuICAgIGZpbGVSdWxlOiAoZmlsZXNJbnB1dCwgZmlsZU91dCwgaW50ZXJjZXB0KSA9PiBmaWxlUnVsZShmaWxlc0lucHV0LCBmaWxlT3V0LCBpbnRlcmNlcHQpLFxcbiAgICBjb3B5RmlsZTogKHNvdXJjZSwgdGFyZ2V0LCBpc0NvdmVyKSA9PiBjb3B5RmlsZShzb3VyY2UsIHRhcmdldCwgaXNDb3ZlciksXFxuICAgIHJlYWRGaWxlOiAocGF0aCkgPT4gcmVhZEZpbGUocGF0aCksXFxuICAgIGdldEZpbGVzOiAocGF0aCwgdHlwZSwgZXhwYW5kKSA9PiBnZXRGaWxlcyhwYXRoLCB0eXBlLCBleHBhbmQpLFxcbiAgICBnZXRUb3RhbFNpemVPZkZpbGVzSW5EaXI6KGZpbGUpPT5nZXRUb3RhbFNpemVPZkZpbGVzSW5EaXIoZmlsZSlcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJ0ZXh0XzJcIixcIm5hbWVcIjpcIiN2LuS4i+i9veWIl+ihqC3mma7pgJrkuIvovb1cIixcInBhdGhcIjpcImRvd25sb2FkLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IHZpZXdDb25maWcgPSBPYmplY3QuYXNzaWduKHtcXG4gICAgY2hhcHRlckxpc3Q6IFtdLFxcbiAgICBpbmZvOiB7fSxcXG4gICAgZGVmYXVsdFZpZXc6IFxcXCIwXFxcIlxcbn0sIE1ZX1BBUkFNUyk7XFxudmlld0NvbmZpZy5pbmZvID0gT2JqZWN0LmFzc2lnbih7XFxuICAgIHJ1bGVOYW1lOiBcXFwiXFxcIixcXG4gICAgYm9va05hbWU6IFxcXCJcXFwiLFxcbiAgICBib29rVG9wUGljOiBcXFwiXFxcIixcXG4gICAgcGFyc2VDb2RlOiBcXFwiXFxcIixcXG4gICAgZGVjb2RlOiB1bmRlZmluZWQsXFxuICAgIHR5cGU6IFxcXCJjb21pY1xcXCIsXFxuICAgIGNvbWljU2NoZW1lOiBcXFwiMVxcXCJcXG59LCB2aWV3Q29uZmlnLmluZm8pO1xcbmxldCB7XFxuICAgIGNoYXB0ZXJMaXN0LFxcbiAgICBpbmZvLFxcbiAgICBkZWZhdWx0Vmlld1xcbn0gPSB2aWV3Q29uZmlnO1xcbnNldFBhZ2VUaXRsZShcXFwi6YCJ5oup5ZmofFxcXCIgKyBpbmZvLmJvb2tOYW1lKVxcblxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFwiKTtcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFwiKTtcXG5cXG52aWV3Q29uZmlnLmluZm8uYm9va05hbWUgPSBUb29sLnRleHRTaGllbGQodmlld0NvbmZpZy5pbmZvLmJvb2tOYW1lKTtcXG52aWV3Q29uZmlnLmluZm8ucnVsZU5hbWUgPSBUb29sLnRleHRTaGllbGQodmlld0NvbmZpZy5pbmZvLnJ1bGVOYW1lKTtcXG5cXG5jb25zdCBNWV9JRCA9IGluZm8ucnVsZU5hbWUgKyBcXFwiLy9cXFwiICsgaW5mby5ib29rTmFtZTtcXG5cXG5sZXQgaXNTdGFydCA9IGdldE15VmFyKE1ZX0lEICsgXFxcIjppc1N0YXJ0XFxcIik7XFxubGV0IHZpZXdNb2RlID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOnZpZXdNb2RlXFxcIiwgZGVmYXVsdFZpZXcpO1xcbmxldCBpc1JldmVyc2UgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6aXNSZXZlcnNlXFxcIiwgXFxcIjBcXFwiKTtcXG5sZXQgdGFnRmlsdGVyID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOnRhZ0ZpbHRlclxcXCIsIENvbmZpZy5kZWZfRG9WaV9UeXBlKTtcXG5cXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKE1ZX0lEKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFwiOmxvYWRpbmdUZWFtXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFwiOnZpZXdNb2RlXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFwiOmNvbXBsZXRlZFxcXCIpO1xcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiKTtcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6dGFnRmlsdGVyXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFwiOnBhZ2VOdW1cXFwiKTtcXG59LCBNWV9JRCkpO1xcblxcbmxldCBsYXlvdXQgPSBbXTtcXG5cXG5pZiAoaXNTdGFydCA9PT0gXFxcIjFcXFwiKSB7XFxuICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjp2aWV3TW9kZVxcXCIsIGRlZmF1bHRWaWV3KTtcXG4gICAgdmlld01vZGUgPSBcXFwiMVxcXCI7XFxufVxcblxcbmxldCBiYWNrdXBDaGFwdGVyTGlzdCA9IGNoYXB0ZXJMaXN0O1xcbmlmICh0eXBlb2YgY2hhcHRlckxpc3QgPT09IFxcXCJzdHJpbmdcXFwiKSB7XFxuICAgIGlmIChjaGFwdGVyTGlzdC5zdGFydHNXaXRoKFxcXCJoaWtlcjovL2ZpbGVzL1xcXCIpKSB7XFxuICAgICAgICBjaGFwdGVyTGlzdCA9IGdldFBhdGgoY2hhcHRlckxpc3QpLnNsaWNlKDcpO1xcbiAgICAgICAgYmFja3VwQ2hhcHRlckxpc3QgPSBjaGFwdGVyTGlzdDtcXG4gICAgfVxcbiAgICBjaGFwdGVyTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBjaGFwdGVyTGlzdCkgfHwgXFxcIltdXFxcIik7XFxufVxcbmxldCBjaGFwdGVyQWxsID0gY2hhcHRlckxpc3Q7XFxuY2hhcHRlckxpc3QgPSBjaGFwdGVyTGlzdC5tYXAoKGl0ZW0sIENJRCkgPT4ge1xcbiAgICBpdGVtLkNJRCA9IENJRDtcXG4gICAgaXRlbS50aXRsZSA9IFRvb2wudGV4dFNoaWVsZChpdGVtLnRpdGxlKTtcXG4gICAgcmV0dXJuIGl0ZW07XFxufSk7XFxubGV0IHBhZ2VOdW0gPSBOdW1iZXIoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOnBhZ2VOdW1cXFwiLCBcXFwiMVxcXCIpKTtcXG5sZXQgY2hhcHRlckNodW5rID0gW2NoYXB0ZXJMaXN0XS5jb25jYXQoVG9vbC5jaHVuayhjaGFwdGVyTGlzdCwgQ29uZmlnLnZpZXdQYWdlU2l6ZSkpO1xcbmNoYXB0ZXJMaXN0ID0gY2hhcHRlckNodW5rW3BhZ2VOdW1dIHx8IFtdO1xcbmNvbnN0IGRlZl9Eb1ZpX1N0eWxlID0gY2hhcHRlckFsbC5sZW5ndGggPT09IDEgPyBcXFwidGV4dF9jZW50ZXJfMVxcXCIgOiBDb25maWcuZGVmX0RvVmlfU3R5bGU7XFxuXFxuZnVuY3Rpb24gc2V0VHlwZSgpIHtcXG4gICAgbGV0IHNldCA9ICh0YWcsIHB1dCkgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIocHV0LCB0YWcpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9O1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogMCA9PSBwYWdlTnVtID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyAoXFxcIuWFqOmDqChcXFwiICsgY2hhcHRlckFsbC5sZW5ndGggKyBcXFwiKVxcXCIpLmZvbnRjb2xvcihcXFwiIzIzQUQ2RlxcXCIpIDogXFxcIuWFqOmDqChcXFwiICsgY2hhcHRlckFsbC5sZW5ndGggKyBcXFwiKVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoc2V0LCAwLCBNWV9JRCArIFxcXCI6cGFnZU51bVxcXCIpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbiAgICB9KTtcXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjaGFwdGVyQ2h1bmsubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgIGxldCB0YWdUZXh0ID0gKGkgLSAxKSAqIENvbmZpZy52aWV3UGFnZVNpemUgKyBcXFwiLVxcXCIgKyAoKGkgLSAxKSAqIENvbmZpZy52aWV3UGFnZVNpemUgKyBjaGFwdGVyQ2h1bmtbaV0ubGVuZ3RoKTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaSA9PSBwYWdlTnVtID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyB0YWdUZXh0LmZvbnRjb2xvcihcXFwiIzIzQUQ2RlxcXCIpIDogdGFnVGV4dCxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoc2V0LCBpLCBNWV9JRCArIFxcXCI6cGFnZU51bVxcXCIpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiYmxhbmtfYmxvY2tcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogdGFnRmlsdGVyID09PSBcXFwiMFxcXCIgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLlhajpg6hcXFwiLmZvbnRjb2xvcihcXFwiIzIzQUQ2RlxcXCIpIDogXFxcIuWFqOmDqFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoc2V0LCBcXFwiMFxcXCIsIE1ZX0lEICsgXFxcIjp0YWdGaWx0ZXJcXFwiKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiB0YWdGaWx0ZXIgPT09IFxcXCIxXFxcIiA/IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIuacquS4i+i9vVxcXCIuZm9udGNvbG9yKFxcXCIjMjNBRDZGXFxcIikgOiBcXFwi5pyq5LiL6L29XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShzZXQsIFxcXCIxXFxcIiwgTVlfSUQgKyBcXFwiOnRhZ0ZpbHRlclxcXCIpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IHRhZ0ZpbHRlciA9PT0gXFxcIjJcXFwiID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi5bey5LiL6L29XFxcIi5mb250Y29sb3IoXFxcIiMyM0FENkZcXFwiKSA6IFxcXCLlt7LkuIvovb1cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKHNldCwgXFxcIjJcXFwiLCBNWV9JRCArIFxcXCI6dGFnRmlsdGVyXFxcIiksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxuICAgIH0pO1xcbn1cXG5sZXQgY2hhcHRlclRlYW0gPSBbXTtcXG5sZXQgcmVjb3JkID0gW107XFxuaWYgKGluZm8udHlwZSA9PT0gXFxcImNvbWljXFxcIikge1xcbiAgICBsZXQgbGF6eSA9ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgICAgIGxldCBmaWxlbGlzdCA9IEZpbGUuZ2V0RmlsZVBhdGgoaW5wdXQpO1xcbiAgICAgICAgbGV0IHBpY2xpc3QgPSBmaWxlbGlzdC5tYXAoKGl0ZW0sIGkpID0+IFxcXCJmaWxlOi8vXFxcIiArIGlucHV0ICsgXFxcIi9cXFwiICsgKGkgKyAxKSArIFxcXCIuanBnXFxcIik7XFxuICAgICAgICByZXR1cm4gXFxcInBpY3M6Ly9cXFwiICsgcGljbGlzdC5qb2luKFxcXCImJlxcXCIpO1xcbiAgICB9KTtcXG5cXG4gICAgZnVuY3Rpb24gY29tRnVuKGksIGl0ZW0pIHtcXG4gICAgICAgIGxldCByb290UGF0aCA9IENvbmZpZy5jb21pY1BhdGggKyBcXFwiL1xcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcIi9cXFwiICsgaW5mby5ib29rTmFtZSArIFxcXCIvXFxcIiArIGkgKyBcXFwiJEEkXFxcIiArIGl0ZW0udGl0bGU7XFxuICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCcXFxcIiArIGl0ZW0udGl0bGUgKyBcXFwi4oCd4oCdXFxcIixcXG4gICAgICAgICAgICB1cmw6IHJvb3RQYXRoICsgbGF6eSxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwiI1xcXCIgKyBpLFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgY29sX3R5cGU6IGRlZl9Eb1ZpX1N0eWxlXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgRmlsZS5nZXRGaWxlUGF0aChDb25maWdbaW5mby50eXBlICsgXFxcIlBhdGhcXFwiXSArIFxcXCIvXFxcIiArIGluZm8ucnVsZU5hbWUgKyBcXFwiL1xcXCIgKyBpbmZvLmJvb2tOYW1lLCBcXFwiZGlyXFxcIikuZm9yRWFjaCgoZmlsZSkgPT4ge1xcbiAgICAgICAgbGV0IGF0dCA9IFRvb2wuc3BsaXQoZmlsZS5uYW1lLCBcXFwiJFxcXCIsIDIpO1xcbiAgICAgICAgaWYgKGF0dC5sZW5ndGggPT09IDMgJiYgYXR0WzFdID09PSAoXFxcIkFcXFwiKSkge1xcbiAgICAgICAgICAgIHJlY29yZC5wdXNoKGF0dFsyXSk7XFxuICAgICAgICB9XFxuICAgIH0pO1xcbn0gZWxzZSB7XFxuICAgIGZ1bmN0aW9uIGNvbUZ1bihpLCBpdGVtKSB7XFxuICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCcXFxcIiArIGl0ZW0udGl0bGUgKyBcXFwi4oCd4oCdXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvTm92ZWxNYWluQm9keSNhdXRvUGFnZSMjcmVhZFRoZW1lI1xcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNcXFwiICsgaSxcXG4gICAgICAgICAgICAgICAgcGF0aDogQ29uZmlnLm5vdmVsUGF0aCArIFxcXCIvXFxcIiArIGluZm8ucnVsZU5hbWUgKyBcXFwiL1xcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcIi9cXFwiICsgaSArIFxcXCIkQSRcXFwiICsgaXRlbS50aXRsZSArIFxcXCIudHh0XFxcIixcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGl0ZW0udGl0bGVcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBkZWZfRG9WaV9TdHlsZVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIEZpbGUuZ2V0RmlsZVBhdGgoQ29uZmlnW2luZm8udHlwZSArIFxcXCJQYXRoXFxcIl0gKyBcXFwiL1xcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcIi9cXFwiICsgaW5mby5ib29rTmFtZSwgXFxcImZpbGVcXFwiLCBcXFwiLnR4dFxcXCIpLmZvckVhY2goKGZpbGUpID0+IHtcXG4gICAgICAgIGxldCBhdHQgPSBUb29sLnNwbGl0KGZpbGUubmFtZSwgXFxcIiRcXFwiLCAyKTtcXG4gICAgICAgIGlmIChhdHQubGVuZ3RoID09PSAzICYmIGF0dFsxXSA9PT0gKFxcXCJBXFxcIikpIHtcXG4gICAgICAgICAgICByZWNvcmQucHVzaChhdHRbMl0uc2xpY2UoMCwgYXR0WzJdLmxhc3RJbmRleE9mKFxcXCIuXFxcIikpKTtcXG4gICAgICAgIH1cXG4gICAgfSk7XFxufVxcblxcbmZ1bmN0aW9uIGNsaWNrRG93bmxvYWQoaXRlbSwgaW5mbywgTVlfSUQsIGkpIHtcXG4gICAgbGV0IGxvYWRpbmdUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6bG9hZGluZ1RlYW1cXFwiLCBcXFwiW11cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgbGV0IEVsZW1lbnRJbmRleCA9IGxvYWRpbmdUZWFtLmluZGV4T2YoaSk7XFxuICAgIGlmIChFbGVtZW50SW5kZXggPiAtMSkgcmV0dXJuIFxcXCJ0b2FzdDovL+ato+WcqOS4i+i9vVxcXCI7XFxuXFxuICAgIGxvYWRpbmdUZWFtLnB1c2goaSk7XFxuICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpsb2FkaW5nVGVhbVxcXCIsIEpTT04uc3RyaW5naWZ5KGxvYWRpbmdUZWFtKSk7XFxuICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgdGl0bGU6IFxcXCLigJjigJhcXFwiICsgaXRlbS50aXRsZSArIFxcXCLigJnigJlcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwiI1xcXCIgKyBpXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBsZXQgcmVzdWx0ID0gXFxcInRvYXN0Oi8v5LiL6L295aSx6LSlXFxcIjtcXG4gICAgdHJ5IHtcXG4gICAgICAgIHRvYXN0KFxcXCLlvIDlp4vkuIvovb06XFxcIiArIGl0ZW0udGl0bGUpO1xcbiAgICAgICAgbGV0IGRvd25sb2FkID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRG93bmxvYWQuZXhlLmpzXFxcIik7XFxuICAgICAgICByZXN1bHQgPSBkb3dubG9hZChpdGVtLCBpbmZvLCBpLCBNWV9JRCk7XFxuICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcIuKAneKAnVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwidG9hc3Q6Ly/lt7LkuIvovb1cXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCIjXFxcIiArIGlcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0udGl0bGUsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNcXFwiICsgaVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgIH0gZmluYWxseSB7XFxuICAgICAgICBsb2FkaW5nVGVhbS5zcGxpY2UoRWxlbWVudEluZGV4LCAxKTtcXG4gICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpsb2FkaW5nVGVhbVxcXCIsIEpTT04uc3RyaW5naWZ5KGxvYWRpbmdUZWFtKSk7XFxuICAgIH1cXG4gICAgcmV0dXJuIHJlc3VsdDtcXG59XFxuXFxuZnVuY3Rpb24gc2luZ2xlVmlldygpIHtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLlj43ovazliJfooahcXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpc1JldmVyc2UsIE1ZX0lEKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmlzUmV2ZXJzZVxcXCIsIGlzUmV2ZXJzZSA9PT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIGlzUmV2ZXJzZSwgTVlfSUQpLFxcbiAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaW1nLmljb25zOC5jb20vP2lkPTMzbnZEcWJISDdIVyZzaXplPTQ4JmZvcm1hdD1naWYmdG9rZW49XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl8yXFxcIlxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLmibnph4/kuIvovb1cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChNWV9JRCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBsb2FkaW5nVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmxvYWRpbmdUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICAgICAgaWYgKGxvYWRpbmdUZWFtLmxlbmd0aCA+IDApIHJldHVybiBcXFwidG9hc3Q6Ly/ov5jmnInku7vliqHmsqHmnInlrozmiJBcXFwiO1xcbiAgICAgICAgICAgIGlmIChnZXRBcHBWZXJzaW9uKCkgPCAyNTk0KSByZXR1cm4gXFxcInRvYXN0Oi8v5pyq5byA5pS+XFxcIjtcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6dmlld01vZGVcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcblxcbiAgICAgICAgfSwgTVlfSUQpLFxcbiAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaW1nLmljb25zOC5jb20vP2Zvcm1hdD1naWYmaWQ9MHVhZmFNTnp4ajg4JnRva2VuPVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fMlxcXCJcXG4gICAgfSk7XFxuICAgIHNldFR5cGUoKTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgbGV0IGxvYWRpbmdUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6bG9hZGluZ1RlYW1cXFwiLCBcXFwiW11cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgZm9yIChsZXQgaSA9IDAsIGl0ZW0gPSBjaGFwdGVyTGlzdFswXTsgaSA8IGNoYXB0ZXJMaXN0Lmxlbmd0aDsgaXRlbSA9IGNoYXB0ZXJMaXN0WysraV0pIHtcXG4gICAgICAgIGxldCBpc19kb3dubG9hZCA9IHJlY29yZC5pbmNsdWRlcyhpdGVtLnRpdGxlKTtcXG4gICAgICAgIGlmIChpc19kb3dubG9hZCAmJiB0YWdGaWx0ZXIgIT09IFxcXCIxXFxcIikge1xcbiAgICAgICAgICAgIGNoYXB0ZXJUZWFtLnB1c2goY29tRnVuKGl0ZW0uQ0lELCBpdGVtKSk7XFxuICAgICAgICB9IGVsc2UgaWYgKCFpc19kb3dubG9hZCAmJiB0YWdGaWx0ZXIgIT09IFxcXCIyXFxcIikge1xcbiAgICAgICAgICAgIGNoYXB0ZXJUZWFtLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogbG9hZGluZ1RlYW0uaW5jbHVkZXMoaXRlbS5DSUQpID8gXFxcIuKAmOKAmFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcIuKAmeKAmVxcXCIgOiBpdGVtLnRpdGxlLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoY2xpY2tEb3dubG9hZCwgaXRlbSwgaW5mbywgTVlfSUQsIGl0ZW0uQ0lEKSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCIjXFxcIiArIGl0ZW0uQ0lEXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBkZWZfRG9WaV9TdHlsZVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGNsaWNrQ2hvb3NlKHRpdGxlLCBNWV9JRCwgaSkge1xcbiAgICBsZXQgaXNTdGFydCA9IGdldE15VmFyKE1ZX0lEICsgXFxcIjppc1N0YXJ0XFxcIik7XFxuICAgIGlmIChpc1N0YXJ0ID09PSBcXFwiMVxcXCIpIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjkuIvovb0uLi5cXFwiO1xcbiAgICBsZXQgYmF0Y2hUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgIGxldCBFbGVtZW50SW5kZXggPSBiYXRjaFRlYW0uaW5kZXhPZihpKTtcXG4gICAgaWYgKEVsZW1lbnRJbmRleCA+IC0xKSB7XFxuICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNcXFwiICsgaVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICAgICAgYmF0Y2hUZWFtLnNwbGljZShFbGVtZW50SW5kZXgsIDEpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJjigJhcXFwiICsgdGl0bGUgKyBcXFwi4oCZ4oCZXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwiI1xcXCIgKyBpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgICBiYXRjaFRlYW0ucHVzaChpKTtcXG4gICAgfVxcbiAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgSlNPTi5zdHJpbmdpZnkoYmF0Y2hUZWFtKSk7XFxuICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxufVxcblxcbmZ1bmN0aW9uIGJhdGNoVmlldygpIHtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLljZXpgInkuIvovb1cXFwiLFxcbiAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaW1nLmljb25zOC5jb20vP2lkPVBJaWN2RjZlYnpNbiZzaXplPTQ4JmZvcm1hdD1naWYmdG9rZW49XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoTVlfSUQpID0+IHtcXG4gICAgICAgICAgICBpZiAoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmlzU3RhcnRcXFwiKSA9PT0gXFxcIjFcXFwiKSByZXR1cm4gXFxcInRvYXN0Oi8v5q2j5Zyo5om56YeP5LiL6L29XFxcIjtcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6dmlld01vZGVcXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgTVlfSUQpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiXFxuICAgIH0pO1xcbiAgICBsZXQgc3RhcnQgPSBDb25maWcudmlld1BhZ2VTaXplICogTWF0aC5tYXgocGFnZU51bSAtIDEsIDApO1xcbiAgICBsZXQgZW5kID0gc3RhcnQgKyBjaGFwdGVyTGlzdC5sZW5ndGg7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6YCJ5oup5YWo6YOoXFxcIixcXG4gICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2ltZy5pY29uczguY29tLz9mb3JtYXQ9Z2lmJmlkPTFIVmNITG9OenJpdCZ0b2tlbj1cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChzdGFydCwgZW5kLCBNWV9JRCkgPT4ge1xcbiAgICAgICAgICAgIGlmIChnZXRNeVZhcihNWV9JRCArIFxcXCI6aXNTdGFydFxcXCIpID09PSBcXFwiMVxcXCIpIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjkuIvovb3lk6Z+XFxcIjtcXG4gICAgICAgICAgICBjb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXCIpO1xcbiAgICAgICAgICAgIGxldCBjaG9vc2VUZWFtID0gVG9vbC5yYW5nZShzdGFydCwgZW5kKTtcXG4gICAgICAgICAgICBsZXQgYmF0Y2hUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICAgICAgYmF0Y2hUZWFtID0gQXJyYXkuZnJvbShuZXcgU2V0KGJhdGNoVGVhbS5jb25jYXQoY2hvb3NlVGVhbSkpKTtcXG4gICAgICAgICAgICBsZXQgY29tcGxldGVkID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6Y29tcGxldGVkXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICAgICAgYmF0Y2hUZWFtID0gYmF0Y2hUZWFtLmZpbHRlcigoaSkgPT4gIWNvbXBsZXRlZC5pbmNsdWRlcyhpKSk7XFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIEpTT04uc3RyaW5naWZ5KGJhdGNoVGVhbSkpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICB9LCBzdGFydCwgZW5kLCBNWV9JRCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5Y+W5raI5YWo6YOoXFxcIixcXG4gICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2ltZy5pY29uczguY29tLz9mb3JtYXQ9Z2lmJmlkPUh6RWpQcEkzTkw4RCZ0b2tlbj1cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChzdGFydCwgZW5kLCBNWV9JRCkgPT4ge1xcbiAgICAgICAgICAgIGlmIChnZXRNeVZhcihNWV9JRCArIFxcXCI6aXNTdGFydFxcXCIpID09PSBcXFwiMVxcXCIpIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjkuIvovb3lk6Z+XFxcIjtcXG4gICAgICAgICAgICBjb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXCIpO1xcbiAgICAgICAgICAgIGxldCBjaG9vc2VUZWFtID0gbmV3IFNldChUb29sLnJhbmdlKHN0YXJ0LCBlbmQpKTtcXG4gICAgICAgICAgICBsZXQgYmF0Y2hUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICAgICAgYmF0Y2hUZWFtID0gYmF0Y2hUZWFtLmZpbHRlcih4ID0+ICFjaG9vc2VUZWFtLmhhcyh4KSk7XFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIEpTT04uc3RyaW5naWZ5KGJhdGNoVGVhbSkpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICB9LCBzdGFydCwgZW5kLCBNWV9JRCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi56Gu6K6k6YCJ5LitXFxcIixcXG4gICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2ltZy5pY29uczguY29tLz9mb3JtYXQ9Z2lmJmlkPXRNcnZ0YzZUOWhWYiZ0b2tlbj1cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChNWV9JRCkgPT4ge1xcbiAgICAgICAgICAgIGlmIChnZXRNeVZhcihNWV9JRCArIFxcXCI6aXNTdGFydFxcXCIsIFxcXCItMVxcXCIpICE9PSBcXFwiLTFcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjkuIvovb3lk6Z+XFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgICAgIHJldHVybiBiYXRjaFRlYW0ubGVuZ3RoID09PSAwID8gXFxcInRvYXN0Oi8v5L2g6L+Y5LuA5LmI6YO95rKh5pyJ6YCJXFxcIiA6IFxcXCJoaWtlcjovL3BhZ2UvQmF0Y2gudmlldyNub1JlZnJlc2gjI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCI7XFxuICAgICAgICB9LCBNWV9JRCksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIG5ld1dpbmRvdzogdHJ1ZSxcXG4gICAgICAgICAgICB3aW5kb3dJZDogTVlfSUQgKyBcXFwiLy/mibnph4/kuIvovb1cXFwiLFxcbiAgICAgICAgICAgIE1ZX0lEOiBNWV9JRCxcXG4gICAgICAgICAgICBjaGFwdGVyTGlzdDogYmFja3VwQ2hhcHRlckxpc3QsXFxuICAgICAgICAgICAgaW5mbzogaW5mb1xcbiAgICAgICAgfSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF80XFxcIlxcbiAgICB9KTtcXG4gICAgc2V0VHlwZSgpO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBsZXQgYmF0Y2hUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgIGxldCBjb21wbGV0ZWQgPSBbXTtcXG4gICAgZm9yIChsZXQgaSA9IDAsIGl0ZW0gPSBjaGFwdGVyTGlzdFswXTsgaSA8IGNoYXB0ZXJMaXN0Lmxlbmd0aDsgaXRlbSA9IGNoYXB0ZXJMaXN0WysraV0pIHtcXG4gICAgICAgIGxldCBpc19kb3dubG9hZCA9IHJlY29yZC5pbmNsdWRlcyhpdGVtLnRpdGxlKTtcXG5cXG4gICAgICAgIGlmIChpc19kb3dubG9hZCkge1xcbiAgICAgICAgICAgIGNvbXBsZXRlZC5wdXNoKGl0ZW0uQ0lEKTtcXG4gICAgICAgICAgICBpZiAodGFnRmlsdGVyICE9PSBcXFwiMVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgY2hhcHRlclRlYW0ucHVzaChjb21GdW4oaXRlbS5DSUQsIGl0ZW0pKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2UgaWYgKCFpc19kb3dubG9hZCAmJiB0YWdGaWx0ZXIgIT09IFxcXCIyXFxcIikge1xcbiAgICAgICAgICAgIGNoYXB0ZXJUZWFtLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogYmF0Y2hUZWFtLmluY2x1ZGVzKGl0ZW0uQ0lEKSA/IFxcXCLigJjigJhcXFwiICsgaXRlbS50aXRsZSArIFxcXCLigJnigJlcXFwiIDogaXRlbS50aXRsZSxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKGNsaWNrQ2hvb3NlLCBpdGVtLnRpdGxlLCBNWV9JRCwgaXRlbS5DSUQpLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNcXFwiICsgaXRlbS5DSURcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IGRlZl9Eb1ZpX1N0eWxlXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmNvbXBsZXRlZFxcXCIsIEpTT04uc3RyaW5naWZ5KGNvbXBsZXRlZCkpO1xcbn1cXG5zd2l0Y2ggKHZpZXdNb2RlKSB7XFxuICAgIGNhc2UgXFxcIjBcXFwiOlxcbiAgICAgICAgc2luZ2xlVmlldygpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgXFxcIjFcXFwiOlxcbiAgICAgICAgYmF0Y2hWaWV3KCk7XFxuICAgICAgICBicmVhaztcXG59XFxuaWYgKGlzUmV2ZXJzZSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgIGNoYXB0ZXJUZWFtLnJldmVyc2UoKTtcXG59XFxubGF5b3V0LnB1c2guYXBwbHkobGF5b3V0LCBjaGFwdGVyVGVhbSk7XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjdi7mibnph4/kuIvovb3lmahcIixcInBhdGhcIjpcIkJhdGNoLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmxldCB7XFxuICAgIGNoYXB0ZXJMaXN0LFxcbiAgICBpbmZvLFxcbiAgICBNWV9JRFxcbn0gPSBNWV9QQVJBTVM7XFxuc2V0UGFnZVRpdGxlKFxcXCLkuIvovb3lmah8XFxcIitpbmZvLmJvb2tOYW1lKTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKE1ZX0lEKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFwiOmlzU3RhcnRcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIpO1xcbiAgICByZWZyZXNoUGFnZSgpO1xcbn0sIE1ZX0lEKSk7XFxuXFxubGV0IGlzU3RhcnQgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6aXNTdGFydFxcXCIsIFxcXCIwXFxcIik7XFxubGV0IHN0YXR1cyA9IGdldE15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiLCBcXFwiMFxcXCIpO1xcbmxldCBsYXlvdXQgPSBbXTtcXG5cXG5sZXQgYmF0Y2hUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuaWYodHlwZW9mIGNoYXB0ZXJMaXN0ID09PSBcXFwic3RyaW5nXFxcIil7XFxuICAgIGNoYXB0ZXJMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIitjaGFwdGVyTGlzdCl8fFxcXCJbXVxcXCIpO1xcbn1cXG5sZXQgY2hhcHRlclRlYW0gPSBiYXRjaFRlYW0ubWFwKHYgPT4ge1xcbiAgICBsZXQgY2hhcHRlckl0ZW0gPSBjaGFwdGVyTGlzdFt2XTtcXG4gICAgY2hhcHRlckl0ZW0uQ0lEID0gdjtcXG4gICAgcmV0dXJuIGNoYXB0ZXJJdGVtO1xcbn0pO1xcbmlmIChpc1N0YXJ0ID09PSBcXFwiMFxcXCIpIHtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLlvIDlp4vkuIvovb1bXFxcIiArIGNoYXB0ZXJUZWFtLmxlbmd0aCArIFxcXCJdXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoY2hhcHRlclRlYW0sIGluZm8sIE1ZX0lEKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmlzU3RhcnRcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICBsZXQgZG93bmxvYWQgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9CYXRjaFN0YXRpc3RpY3MuanNcXFwiKTtcXG4gICAgICAgICAgICBpZihpbmZvLnR5cGU9PT1cXFwiY29taWNcXFwiJiZpbmZvLmNvbWljU2NoZW1lPT09XFxcIjFcXFwiKXtcXG4gICAgICAgICAgICAgICAgZG93bmxvYWQ9ZG93bmxvYWQuYjtcXG4gICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgZG93bmxvYWQ9ZG93bmxvYWQuYTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGRvd25sb2FkKGNoYXB0ZXJUZWFtLCBpbmZvLCBNWV9JRCkgfHwgXFxcInRvYXN0Oi8v5LiL6L296ZSZ6K+vXFxcIjtcXG4gICAgICAgIH0sIGNoYXB0ZXJUZWFtLCBpbmZvLCBNWV9JRCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwifHzlvIDlp4vkuIvovb1cXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuS7u+WKoeWIl+ihqO+8mlxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxuICAgIH0pO1xcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNoYXB0ZXJUZWFtKSB7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0udGl0bGUsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcblxcbn0gZWxzZSB7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5LiL6L296L+b5bqmOjAvXFxcIitjaGFwdGVyVGVhbS5sZW5ndGgsXFxuICAgICAgICBkZXNjOiBcXFwi4oCc4oCc4oCd4oCd4paH4paH4paH4paH4paH4paH4paH4paH4paH4paHXFxcIi5mb250Y29sb3IoXFxcIiNlNWUxZTRcXFwiKStcXFwiIDAlXFxcIixcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcInx85LiL6L296L+b5bqmXFxcIixcXG4gICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5ZCO5Y+w5LiL6L29XFxcIixcXG4gICAgICAgIHVybDogXFxcImZ1bmM6Ly9iYWNrZ3JvdW5kXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbiAgICB9KTtcXG5cXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFtcXFwiW+WPlua2iOS4i+i9vV1cXFwiLCBcXFwiW+ato+WcqOWBnOatoi4uLl1cXFwiLCBcXFwiW+i/lOWbnl1cXFwiLCBcXFwiW+WkhOeQhuWksei0pV1cXFwiLCBcXFwiW+mHjeaWsOW8gOWni11cXFwiXVtzdGF0dXNdLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChNWV9JRCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBzdGF0dXMgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIjBcXFwiKTtcXG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSBcXFwiMFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCJb5q2j5Zyo5YGc5q2iLi4uXVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCJ8fOS4i+i9veaOp+WItlxcXCJcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjlj5bmtojkuIvovb3ku7vliqFcXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBcXFwiMVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ato+WcqOaaguWBnC4uLlxcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IFxcXCIyXFxcIikge1xcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7LpgIDlh7rkuIvovb3lmahcXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoW1xcXCIzXFxcIiwgXFxcIjRcXFwiXS5pbmNsdWRlcyhzdGF0dXMpKSB7XFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFwiOmlzU3RhcnRcXFwiKTtcXG4gICAgICAgICAgICAgICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIik7XFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFwiOmxvZ1xcXCIpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6YeN5paw54K55Ye75LiL6L29XFxcIlxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIE1ZX0lEKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcInx85LiL6L295o6n5Yi2XFxcIlxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCI8c3Ryb25nPuS4i+i9veaXpeW/lzwvc3Ryb25nPlxcXCIuYmlnKCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxuICAgICAgICBcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCJ8fOaXpeW/l1xcXCJcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOlxcXCLigJzigJzigJ3igJ0kPlxcXCIrXFxcIuW8gOWni+S4i+i9vS4uLi4uLlxcXCIuZm9udGNvbG9yKFxcXCIjMDBmZjAwXFxcIiksXFxuICAgICAgICB1cmw6XFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwiI2xvZyMwXFxcIixcXG4gICAgICAgICAgICBsaW5lVmlzaWJsZTpmYWxzZVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG59XFxuXFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjZmcu5om56YeP5LiL6L2957uf6K6hXCIsXCJwYXRoXCI6XCJCYXRjaFN0YXRpc3RpY3MuanNcIixcInJ1bGVcIjpcImNvbnN0IFRvb2wgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcIik7XFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzXFxcIik7XFxuXFxuJC5leHBvcnRzLmEgPSBmdW5jdGlvbihjaGFwdGVyVGVhbSwgaW5mbywgTVlfSUQpIHtcXG4gICAgaWYgKGNoYXB0ZXJUZWFtLmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+epuueahOS4i+i9vemYn+WIl1xcXCI7XFxuICAgIH1cXG5cXG4gICAgdmFyIGNvdW50ID0gMDtcXG4gICAgdmFyIHRhc2tDb3VudCA9IGNoYXB0ZXJUZWFtLmxlbmd0aDtcXG4gICAgdmFyIHN1Y2Nlc3NDSUQgPSBbXTtcXG4gICAgdmFyIGZhaWxOYW1lID0gW107XFxuICAgIHZhciBsb2dDb3VudCA9IDE7XFxuICAgIHZhciB0YXNrVGVhbSA9IGNoYXB0ZXJUZWFtLm1hcChjaGFwdGVySXRlbSA9PiAoe1xcbiAgICAgICAgZnVuYzogdGFzayxcXG4gICAgICAgIGlkOiBjaGFwdGVySXRlbS50aXRsZSxcXG4gICAgICAgIHBhcmFtOiB7XFxuICAgICAgICAgICAgY2hhcHRlckl0ZW06IGNoYXB0ZXJJdGVtLFxcbiAgICAgICAgICAgIGluZm86IGluZm8sXFxuICAgICAgICAgICAgTVlfSUQ6IE1ZX0lEXFxuICAgICAgICB9XFxuICAgIH0pKTtcXG4gICAgbGV0IGxvZ051bSA9IENvbmZpZy5sb2dOdW07XFxuXFxuXFxuICAgIGZ1bmN0aW9uIHB1dExvZyh0ZXh0KSB7XFxuICAgICAgICBsb2codGV4dCk7XFxuICAgICAgICBpZiAobG9nQ291bnQgPj0gbG9nTnVtKSB7XFxuICAgICAgICAgICAgZGVsZXRlSXRlbShNWV9JRCArIFxcXCIjbG9nI1xcXCIgKyAobG9nQ291bnQgLSAxMCkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgYWRkSXRlbUFmdGVyKE1ZX0lEICsgXFxcInx85pel5b+XXFxcIiwge1xcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFwiJD5cXFwiICsgdGV4dCxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwiI2xvZyNcXFwiICsgbG9nQ291bnRcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGxvZ0NvdW50Kys7XFxuICAgIH1cXG5cXG4gICAgZnVuY3Rpb24gdGFzayh0YXNrUGFyYW0pIHtcXG4gICAgICAgIGxldCByZXN1bHQgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9CYXRjaC5leGUuanNcXFwiKSh0YXNrUGFyYW0pO1xcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBsaXN0ZW5lcihwZXJjaCwgaWQsIGVycm9yLCBDSUQpIHtcXG4gICAgICAgIGNvdW50Kys7XFxuICAgICAgICBsZXQgaXNTdWNjZXNzID0gZmFsc2U7XFxuICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkge1xcbiAgICAgICAgICAgIGZhaWxOYW1lLnB1c2goaWQpO1xcbiAgICAgICAgICAgIHB1dExvZyhcXFwiW2xpc3RlbmVyXeS4i+i9veWksei0pe+8mlxcXCIgKyBpZCArIFxcXCI8RVJST1JAIFxcXCIgKyBlcnJvciArIFxcXCI+XFxcIik7XFxuICAgICAgICB9IGVsc2UgaWYgKENJRCA+PSAwKSB7XFxuICAgICAgICAgICAgc3VjY2Vzc0NJRC5wdXNoKENJRCk7XFxuICAgICAgICAgICAgbGV0IHJhdGlvID0gKGNvdW50IC8gdGFza0NvdW50KS50b0ZpeGVkKDQpO1xcbiAgICAgICAgICAgIGxldCBzdHJpcENvdW50ID0gTWF0aC5jZWlsKHJhdGlvICogMTApO1xcbiAgICAgICAgICAgIGlzU3VjY2VzcyA9IHRydWU7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5LiL6L296L+b5bqm77yaXFxcIiArIHN1Y2Nlc3NDSUQubGVuZ3RoICsgXFxcIi9cXFwiICsgdGFza0NvdW50LFxcbiAgICAgICAgICAgICAgICBkZXNjOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLilodcXFwiLnJlcGVhdChzdHJpcENvdW50KS5mb250Y29sb3IoXFxcIiNmZmFjMmRcXFwiKSArIFxcXCLilodcXFwiLnJlcGVhdCgxMCAtIHN0cmlwQ291bnQpLmZvbnRjb2xvcihcXFwiI2U1ZTFlNFxcXCIpICsgXFxcIiBcXFwiICsgU3RyaW5nKChyYXRpbyAqIDEwMCkpLnNsaWNlKDAsIDUpICsgXFxcIiVcXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcInx85LiL6L296L+b5bqmXFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcHV0TG9nKFxcXCJbbGlzdGVuZXJd5bey5a6M5oiQ5LiL6L2977yaXFxcIiArIGlkKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoQ0lEID09PSAtMSkge1xcbiAgICAgICAgICAgIGZhaWxOYW1lLnB1c2goaWQpO1xcbiAgICAgICAgICAgIHB1dExvZyhcXFwiW2xpc3RlbmVyXeW3suWBnOatou+8mlxcXCIgKyBpZCk7XFxuICAgICAgICAgICAgY291bnQgPSB0YXNrQ291bnQ7XFxuICAgICAgICB9XFxuXFxuICAgICAgICBpZiAodGFza0NvdW50ICE9PSBjb3VudCkgcmV0dXJuO1xcbiAgICAgICAgaWYgKHN1Y2Nlc3NDSUQubGVuZ3RoID09PSB0YXNrQ291bnQpIHtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgZGVzYzogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi4paHXFxcIi5yZXBlYXQoMTApLmZvbnRjb2xvcihcXFwiIzAwZmYwMFxcXCIpICsgXFxcIiAxMDAlXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCJ8fOS4i+i9vei/m+W6plxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgbGV0IHN0YXR1cyA9IGdldE15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgbGV0IGZhaWxUZWFtID0gYmF0Y2hUZWFtLmZpbHRlcih2ID0+ICFzdWNjZXNzQ0lELmluY2x1ZGVzKHYpKTtcXG4gICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBKU09OLnN0cmluZ2lmeShmYWlsVGVhbSkpO1xcbiAgICAgICAgaWYgKGZhaWxUZWFtLmxlbmd0aCA+IDAgJiYgc3RhdHVzICE9PSBcXFwiMVxcXCIpIHtcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIjNcXFwiKTtcXG4gICAgICAgICAgICBwdXRMb2coXFxcIuS4i+i9veWksei0pTpbXFxcIiArIGZhaWxOYW1lLmpvaW4oXFxcIl3vvIxbXFxcIikgKyBcXFwiXeOAglxcXCIpO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIlvlpITnkIblpLHotKVdXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCJ8fOS4i+i9veaOp+WItlxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIGlmIChmYWlsVGVhbS5sZW5ndGggPiAwICYmIHN0YXR1cyA9PT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCI0XFxcIik7XFxuICAgICAgICAgICAgcHV0TG9nKFxcXCJbbGlzdGVuZXJdI+W3suWBnOatouaJgOacieS7u+WKoe+8jOS9huW3suaciei/m+W6puS4jeS8mua2iOWksSNcXFwiKTtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCJb6YeN5paw5byA5aeLXVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwifHzkuIvovb3mjqfliLZcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImJyZWFrXFxcIjtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCIyXFxcIik7XFxuICAgICAgICAgICAgcHV0TG9nKFxcXCLkuIvovb3ku7vliqFbXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFwiXeW3suWFqOmDqOaIkOWKn+WujOaIkFxcXCIpO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIlvov5Tlm55dXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCJ8fOS4i+i9veaOp+WItlxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgdG9hc3QoXFxcIuS4i+i9veS7u+WKoVtcXFwiICsgaW5mby5ib29rTmFtZSArIFxcXCJd5bey5a6M5oiQXFxcIik7XFxuICAgIH1cXG4gICAgbGV0IHRhc2tUZWFtQ2h1bmsgPSBbXTtcXG4gICAgaWYgKENvbmZpZy50aHJlYWROdW0gPiAwKSB7XFxuICAgICAgICB0YXNrVGVhbUNodW5rID0gVG9vbC5jaHVuayh0YXNrVGVhbSwgQ29uZmlnLnRocmVhZE51bSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICB0YXNrVGVhbUNodW5rID0gW3Rhc2tUZWFtXTtcXG4gICAgfVxcbiAgICBmb3IgKGxldCB0YXNrTGlzdCBvZiB0YXNrVGVhbUNodW5rKSB7XFxuICAgICAgICBiZSh0YXNrTGlzdCwge1xcbiAgICAgICAgICAgIGZ1bmM6IGxpc3RlbmVyXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxldCBzdGF0dXMgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIjBcXFwiKTtcXG4gICAgICAgIGlmIChzdGF0dXMgPT09IFxcXCIxXFxcIikge1xcbiAgICAgICAgICAgIGxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBcXFwiW11cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgICAgICAvL2xldCBzdGF0dXMgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIjBcXFwiKTtcXG4gICAgICAgICAgICBsZXQgZmFpbFRlYW0gPSBiYXRjaFRlYW0uZmlsdGVyKHYgPT4gIXN1Y2Nlc3NDSUQuaW5jbHVkZXModikpO1xcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBKU09OLnN0cmluZ2lmeShmYWlsVGVhbSkpO1xcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiLCBcXFwiNFxcXCIpO1xcbiAgICAgICAgICAgIHB1dExvZyhcXFwiW2xpc3RlbmVyXSPlt7LlgZzmraLmiYDmnInku7vliqHvvIzkvYblt7LmnInov5vluqbkuI3kvJrmtojlpLEjXFxcIik7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwiW+mHjeaWsOW8gOWni11cXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcInx85LiL6L295o6n5Yi2XFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH1cXG5cXG4gICAgfVxcblxcbiAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbn07XFxuXFxuJC5leHBvcnRzLmIgPSBmdW5jdGlvbiBjb21pYyhjaGFwdGVyVGVhbSwgaW5mbywgTVlfSUQpIHtcXG4gICAgaWYgKGNoYXB0ZXJUZWFtLmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+epuueahOS4i+i9vemYn+WIl1xcXCI7XFxuICAgIH1cXG4gICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG5cXG4gICAgbGV0IGxvZ051bSA9IENvbmZpZy5sb2dOdW07XFxuICAgIGxldCBsb2dDb3VudCA9IDA7XFxuXFxuICAgIGZ1bmN0aW9uIHB1dExvZyh0ZXh0KSB7XFxuICAgICAgICBsb2codGV4dCk7XFxuICAgICAgICBpZiAobG9nQ291bnQgPj0gbG9nTnVtKSB7XFxuICAgICAgICAgICAgZGVsZXRlSXRlbShNWV9JRCArIFxcXCIjbG9nI1xcXCIgKyAobG9nQ291bnQgLSAxMCkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgYWRkSXRlbUFmdGVyKE1ZX0lEICsgXFxcInx85pel5b+XXFxcIiwge1xcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFwiJD5cXFwiICsgdGV4dCxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwiI2xvZyNcXFwiICsgbG9nQ291bnRcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGxvZ0NvdW50Kys7XFxuICAgIH1cXG5cXG4gICAgZnVuY3Rpb24gdGFzayh0YXNrUGFyYW0pIHtcXG4gICAgICAgIGNvbnN0IFRvb2wgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcIik7XFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBsZXQgcGljID0gVG9vbC5oaWtlclBpYyh0YXNrUGFyYW0udXJsKTtcXG4gICAgICAgICAgICAgICAgVG9vbC5waWNEb3dubG9hZChwaWNbMF0sIHRhc2tQYXJhbS5jaGFwdGVyUGF0aCArICh0YXNrUGFyYW0uaSArIDEpICsgXFxcIi5qcGdcXFwiLCBwaWNbMV0sIHRhc2tQYXJhbS5kZWNvZGUpO1xcbiAgICAgICAgICAgICAgICBpZiAoZ2V0TXlWYXIodGFza1BhcmFtLk1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiLCBcXFwiXFxcIikgPT09IFxcXCIxXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGVycm9yTnVtID0gMDtcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gOSkge1xcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB0YXNrUGFyYW0uQ0lEO1xcbiAgICB9XFxuICAgIGxldCBjb3VudCA9IDA7XFxuICAgIGxldCB0b3RhbENvdW50ID0gMDtcXG4gICAgbGV0IHN1Y2Nlc3NDSUQgPSBbXTtcXG5cXG4gICAgZnVuY3Rpb24gbGlzdGVuZXIocGFyYW0sIGlkLCBlcnJvciwgcmVzdWx0KSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIHRvdGFsQ291bnQrKztcXG5cXG4gICAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkge1xcbiAgICAgICAgICAgICAgICBwdXRMb2coXFxcIltsaXN0ZW5lcl3kuIvovb3lpLHotKXvvJpcXFwiICsgaWQgKyBcXFwiPEVSUk9SQCBcXFwiICsgZXJyb3IgKyBcXFwiPlxcXCIpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSAtMSkge1xcbiAgICAgICAgICAgICAgICBwdXRMb2coXFxcIltsaXN0ZW5lcl3lt7LlgZzmraLvvJpcXFwiICsgaWQpO1xcbiAgICAgICAgICAgICAgICB0b3RhbENvdW50ID0gcGFyYW0ucGl2Q291bnQ7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgY291bnQrKztcXG4gICAgICAgICAgICAgICAgbGV0IHJhdGlvID0gKChjb3VudCAvIHBhcmFtLnBpdkNvdW50KSkudG9GaXhlZCg0KTtcXG4gICAgICAgICAgICAgICAgbGV0IHN0cmlwQ291bnQgPSBNYXRoLmNlaWwocmF0aW8gKiAxMCk7XFxuICAgICAgICAgICAgICAgIGlmIChwYXJhbS5waXZDb3VudCA9PT0gdG90YWxDb3VudCAmJiB0b3RhbENvdW50ID09PSBjb3VudCkge1xcbiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NJRC5wdXNoKHBhcmFtLkNJRCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuS4i+i9vei/m+W6pu+8mlxcXCIgKyAoc3VjY2Vzc0NJRC5sZW5ndGgpICsgXFxcIi9cXFwiICsgcGFyYW0udG90YWwsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLilodcXFwiLnJlcGVhdChzdHJpcENvdW50KS5mb250Y29sb3IoXFxcIiNmZmFjMmRcXFwiKSArIFxcXCLilodcXFwiLnJlcGVhdCgxMCAtIHN0cmlwQ291bnQpLmZvbnRjb2xvcihcXFwiI2U1ZTFlNFxcXCIpICsgXFxcIiBcXFwiICsgU3RyaW5nKChyYXRpbyAqIDEwMCkpLnNsaWNlKDAsIDUpICsgXFxcIiVcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwifHzkuIvovb3ov5vluqZcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAvL3B1dExvZyhcXFwiW2xpc3RlbmVyXeW3suWujOaIkOS4i+i9ve+8mlxcXCIgKyBpZCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmICh0b3RhbENvdW50ICE9PSBwYXJhbS5waXZDb3VudCkgcmV0dXJuO1xcbiAgICAgICAgICAgIGlmICh0b3RhbENvdW50ID09PSBjb3VudCkge1xcbiAgICAgICAgICAgICAgICBGaWxlLnJlbmFtZUZpbGUocGFyYW0uY2hhcHRlclBhdGgsIHBhcmFtLkNJRCArIFxcXCIkQSRcXFwiICsgVG9vbC50ZXh0U2hpZWxkKHBhcmFtLnRpdGxlKSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHRvdGFsQ291bnQgPSBjb3VudCA9IDA7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJicmVha1xcXCI7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgbGV0IHRhc2tUZWFtID0gW107XFxuICAgIGxldCBtYWluUGF0aCA9IENvbmZpZy5jb21pY1BhdGggKyBcXFwiL1xcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcIi9cXFwiICsgVG9vbC50ZXh0U2hpZWxkKGluZm8uYm9va05hbWUpICsgXFxcIi9cXFwiO1xcbiAgICBpZiAoaW5mby5ib29rVG9wUGljKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBib29rVG9wUGljID0gVG9vbC5oaWtlclBpYyhpbmZvLmJvb2tUb3BQaWMpO1xcbiAgICAgICAgICAgIFRvb2wucGljRG93bmxvYWQoYm9va1RvcFBpY1swXSwgbWFpblBhdGggKyBpbmZvLmJvb2tOYW1lICsgXFxcIi5qcGdcXFwiLCBib29rVG9wUGljWzFdLCBpbmZvLmRlY29kZSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKFxcXCI85bCB6Z2i5LiL6L296ZSZ6K+vPiBcXFwiICsgZS5tZXNzYWdlKTtcXG4gICAgICAgIH1cXG4gICAgfVxcblxcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGNoYXB0ZXJUZWFtLmxlbmd0aDsgaysrKSB7XFxuICAgICAgICBsZXQgaXRlbSA9IGNoYXB0ZXJUZWFtW2tdO1xcbiAgICAgICAgbGV0IG9yZGVyID0gaztcXG4gICAgICAgIGxldCBjaGFwdGVyUGF0aCA9IG1haW5QYXRoICsgaXRlbS5DSUQgKyBcXFwiJEIkXFxcIiArIFRvb2wudGV4dFNoaWVsZChpdGVtLnRpdGxlKSArIFxcXCIvXFxcIjtcXG4gICAgICAgIGxldCBwaWNMaXN0ID0gW107XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBnZXRQaWNMaXN0ID0gbmV3IEZ1bmN0aW9uKFxcXCJpbnB1dFxcXCIsIFxcXCJ1cmxcXFwiLCBcXFwiaW5kZXhcXFwiLCBcXFwidGl0bGVcXFwiLCBcXFwicmV0dXJuXFxcIiArIGluZm8ucGFyc2VDb2RlKTtcXG4gICAgICAgICAgICBwaWNMaXN0ID0gZ2V0UGljTGlzdChpdGVtLnVybCwgaXRlbS51cmwsIGssIGl0ZW0udGl0bGUpO1xcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGljTGlzdCA9PT0gXFxcInN0cmluZ1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgcGljTGlzdCA9IHBpY0xpc3QucmVwbGFjZShcXFwicGljczovL1xcXCIsIFxcXCJcXFwiKS5zcGxpdChcXFwiJiZcXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgcHV0TG9nKFxcXCI85ryr55S75Zu+54mH6Kej5p6Q6ZSZ6K+vPiBcXFwiICsgZS5tZXNzYWdlKTtcXG4gICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChwaWNMaXN0Lmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgICAgIHB1dExvZyhcXFwiPOa8q+eUu+WbvueJh+ino+aekOmUmeivr++8muWbvueJh+mTvuaOpei/lOWbnuS4uuepuj5cXFwiKTtcXG4gICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgIH1cXG4gICAgICAgIHBpY0xpc3QgPSBwaWNMaXN0LmZpbHRlcihwID0+IHApO1xcbiAgICAgICAgdmFyIHRhc2tUZWFtID0gcGljTGlzdC5tYXAoKHVybCwgaSkgPT4gKHtcXG4gICAgICAgICAgICBmdW5jOiB0YXNrLFxcbiAgICAgICAgICAgIGlkOiBpLFxcbiAgICAgICAgICAgIHBhcmFtOiB7XFxuICAgICAgICAgICAgICAgIHVybDogdXJsLFxcbiAgICAgICAgICAgICAgICBpOiBpLFxcbiAgICAgICAgICAgICAgICBjaGFwdGVyUGF0aDogY2hhcHRlclBhdGgsXFxuICAgICAgICAgICAgICAgIE1ZX0lEOiBNWV9JRCxcXG4gICAgICAgICAgICAgICAgZGVjb2RlOiBpbmZvLmRlY29kZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pKTtcXG4gICAgICAgIGJlKHRhc2tUZWFtLCB7XFxuICAgICAgICAgICAgZnVuYzogbGlzdGVuZXIsXFxuICAgICAgICAgICAgcGFyYW06IHtcXG4gICAgICAgICAgICAgICAgcGl2Q291bnQ6IHBpY0xpc3QubGVuZ3RoLFxcbiAgICAgICAgICAgICAgICB0b3RhbDogY2hhcHRlclRlYW0ubGVuZ3RoLFxcbiAgICAgICAgICAgICAgICBvcmRlcjogb3JkZXIsXFxuICAgICAgICAgICAgICAgIENJRDogaXRlbS5DSUQsXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlLFxcbiAgICAgICAgICAgICAgICBjaGFwdGVyUGF0aDogY2hhcHRlclBhdGhcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGlmIChnZXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIlxcXCIpID09PSBcXFwiMVxcXCIpIHtcXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgfVxcblxcbiAgICBsZXQgc3RhdHVzID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCIwXFxcIik7XFxuICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAoNDApO1xcbiAgICAvL2xldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBcXFwiW11cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgbGV0IGZhaWxUZWFtID0gY2hhcHRlclRlYW0uZmlsdGVyKHYgPT4gIXN1Y2Nlc3NDSUQuaW5jbHVkZXModi5DSUQpKTtcXG4gICAgbGV0IGZhaWxOYW1lID0gZmFpbFRlYW0ubWFwKGl0ZW0gPT4gaXRlbS50aXRsZSk7XFxuICAgIGxldCBiYXRjaFRlYW0gPSBmYWlsVGVhbS5tYXAoaXRlbSA9PiBpdGVtLkNJRCk7XFxuXFxuICAgIGlmIChmYWlsVGVhbS5sZW5ndGggPiAwICYmIHN0YXR1cyAhPT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgSlNPTi5zdHJpbmdpZnkoYmF0Y2hUZWFtKSk7XFxuICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIjNcXFwiKTtcXG4gICAgICAgIHB1dExvZyhcXFwi5LiL6L295aSx6LSlOltcXFwiICsgZmFpbE5hbWUuam9pbihcXFwiXe+8jFtcXFwiKSArIFxcXCJd44CCXFxcIik7XFxuICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIlvlpITnkIblpLHotKVdXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwifHzkuIvovb3mjqfliLZcXFwiXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH0gZWxzZSBpZiAoZmFpbFRlYW0ubGVuZ3RoID4gMCAmJiBzdGF0dXMgPT09IFxcXCIxXFxcIikge1xcbiAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIEpTT04uc3RyaW5naWZ5KGJhdGNoVGVhbSkpO1xcbiAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCI0XFxcIik7XFxuICAgICAgICBwdXRMb2coXFxcIltsaXN0ZW5lcl0j5bey5YGc5q2i5omA5pyJ5Lu75Yqh77yM5L2G5bey5pyJ6L+b5bqm5LiN5Lya5raI5aSxI1xcXCIpO1xcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCJb6YeN5paw5byA5aeLXVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcInx85LiL6L295o6n5Yi2XFxcIlxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCIyXFxcIik7XFxuICAgICAgICBwdXRMb2coXFxcIuS4i+i9veS7u+WKoVtcXFwiICsgaW5mby5ib29rTmFtZSArIFxcXCJd5bey5YWo6YOo5oiQ5Yqf5a6M5oiQXFxcIik7XFxuICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIlvov5Tlm55dXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwifHzkuIvovb3mjqfliLZcXFwiXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjZmcu5om56YeP5Li756iL5bqPXCIsXCJwYXRoXCI6XCJCYXRjaC5leGUuanNcIixcInJ1bGVcIjpcImNvbnN0IE1pYW4gPSAkLnJlcXVpcmUoXFxcIm1haW5Eb3dubG9hZFxcXCIpO1xcbmZ1bmN0aW9uIGNvbWljKHRhc2tQYXJhbSkge1xcbiAgICBsZXQge1xcbiAgICAgICAgY2hhcHRlckl0ZW0sXFxuICAgICAgICBpbmZvLFxcbiAgICAgICAgTVlfSUQsXFxuICAgIH0gPSB0YXNrUGFyYW07XFxuICAgIHJldHVybiBNaWFuLmNvbWljKGNoYXB0ZXJJdGVtLCBpbmZvLCBjaGFwdGVySXRlbS5DSUQsIE1ZX0lELCB0cnVlKXx8Y2hhcHRlckl0ZW0uQ0lEO1xcbn1cXG5cXG5mdW5jdGlvbiBub3ZlbCh0YXNrUGFyYW0pIHtcXG4gICAgbGV0IHtcXG4gICAgICAgIGNoYXB0ZXJJdGVtLFxcbiAgICAgICAgaW5mbyxcXG4gICAgICAgIE1ZX0lELFxcbiAgICB9ID0gdGFza1BhcmFtO1xcbiAgICByZXR1cm4gTWlhbi5ub3ZlbChjaGFwdGVySXRlbSwgaW5mbywgY2hhcHRlckl0ZW0uQ0lELE1ZX0lELCB0cnVlKXx8Y2hhcHRlckl0ZW0uQ0lEO1xcbiAgICAvL0ZpbGUucmVuYW1lRmlsZShjaGFwdGVyUGF0aCwgY2hhcHRlckl0ZW0uQ0lEICsgXFxcIiRBJFxcXCIgKyBjaGFwdGVySXRlbS50aXRsZSk7XFxufVxcbnZhciAkZXhlID0ge1xcbiAgICBjb21pYzogY29taWMsXFxuICAgIG5vdmVsOiBub3ZlbFxcbn07XFxuJC5leHBvcnRzID0gZnVuY3Rpb24odGFza1BhcmFtKSB7XFxuICAgIHJldHVybiAkZXhlW3Rhc2tQYXJhbS5pbmZvLnR5cGVdKHRhc2tQYXJhbSk7XFxufTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiNmZy7mma7pgJrkuLvnqIvluo9cIixcInBhdGhcIjpcIkRvd25sb2FkLmV4ZS5qc1wiLFwicnVsZVwiOlwiY29uc3QgTWlhbiA9ICQucmVxdWlyZShcXFwibWFpbkRvd25sb2FkXFxcIik7XFxuZnVuY3Rpb24gbm92ZWwoaXRlbSwgaW5mbywgb3JkZXIsIE1ZX0lEKSB7XFxuICAgIE1pYW4ubm92ZWwoaXRlbSwgaW5mbywgb3JkZXIpO1xcbiAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFwiQFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcIiDkuIvovb3lrozmiJBcXFwiO1xcbn1cXG5cXG5mdW5jdGlvbiBjb21pYyhpdGVtLCBpbmZvLCBvcmRlciwgTVlfSUQpIHtcXG4gICAgTWlhbi5jb21pYyhpdGVtLCBpbmZvLCBvcmRlcik7XFxuICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgaW5mby5ib29rTmFtZSArIFxcXCJAXFxcIiArIGl0ZW0udGl0bGUgKyBcXFwiIOS4i+i9veWujOaIkFxcXCI7XFxufVxcbnZhciAkZXhlID0ge1xcbiAgICBjb21pYzogY29taWMsXFxuICAgIG5vdmVsOiBub3ZlbFxcbn07XFxuJC5leHBvcnRzID0gZnVuY3Rpb24oaXRlbSwgaW5mbywgb3JkZXIsIE1ZX0lEKSB7XFxuICAgIHJldHVybiAkZXhlW2luZm8udHlwZV0oaXRlbSwgaW5mbywgb3JkZXIsIE1ZX0lEKTtcXG59O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI2Yu6YCa55So5bel5YW3XCIsXCJwYXRoXCI6XCJUb29sLmpzXCIsXCJydWxlXCI6XCJjb25zdCB2ID0ge1xcbiAgICBzcGxpdCh0ZXh0LCB0YXJnZXQsIGNvdW50KSB7XFxuICAgICAgICBjb3VudCA9IGNvdW50ID09PSB1bmRlZmluZWQgPyAxIDogY291bnQ7XFxuICAgICAgICBsZXQgYXJyYXkgPSBbdGV4dF07XFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcXG4gICAgICAgICAgICB0ZXh0ID0gYXJyYXlbaV07XFxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGV4dC5pbmRleE9mKHRhcmdldCk7XFxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xcbiAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgYXJyYXlbaV0gPSB0ZXh0LnNsaWNlKDAsIGluZGV4KTtcXG4gICAgICAgICAgICBhcnJheVtpICsgMV0gPSB0ZXh0LnNsaWNlKGluZGV4ICsgdGFyZ2V0Lmxlbmd0aCk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gYXJyYXk7XFxuICAgIH0sXFxuICAgIGNodW5rKGFyciwgc2l6ZSkge1xcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFyci5sZW5ndGg7IGkgPCBsZW47IGkgKz0gc2l6ZSkge1xcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFyci5zbGljZShpLCBpICsgc2l6ZSkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfSxcXG4gICAgaGlrZXJQaWModXJsKSB7XFxuICAgICAgICB2YXIgaGVhZGVycyA9IHt9O1xcbiAgICAgICAgbGV0IHVybHMgPSB1cmwuc3BsaXQoXFxcIkBcXFwiKTtcXG4gICAgICAgIGxldCBwaWNVcmwgPSB1cmxzLnNoaWZ0KCk7XFxuICAgICAgICBsZXQgbGVuZ3RoID0gdXJscy5sZW5ndGg7XFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgbGV0IFtrZXksIHZhbHVlXSA9IHYuc3BsaXQodXJsc1tpXSwgXFxcIj1cXFwiKTtcXG4gICAgICAgICAgICBpZiAoa2V5ID09PSBcXFwiaGVhZGVyc1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaGVhZGVycywgSlNPTi5wYXJzZSh2YWx1ZSkpO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmluY2x1ZGVzKFxcXCIuXFxcIikgfHwga2V5LmluY2x1ZGVzKFxcXCI/XFxcIikpIHtcXG4gICAgICAgICAgICAgICAgcGljVXJsICs9IFxcXCJAXFxcIiArIGtleSArICh2YWx1ZSA/IFxcXCI9XFxcIiArIHZhbHVlIDogXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9PSBcXFwianNcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IHZhbHVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBbcGljVXJsLCBoZWFkZXJzXTtcXG4gICAgfSxcXG4gICAgcmFuZ2Uoc3RhcnQsIGVuZCkge1xcbiAgICAgICAgcmV0dXJuIEFycmF5KGVuZCAtIHN0YXJ0KS5maWxsKDApLm1hcCgoZWwsIGkpID0+IHN0YXJ0ICsgaSk7XFxuICAgIH0sXFxuICAgIHBpY0Rvd25sb2FkKHVybCwgcGF0aCwgaGVhZGVycywgZGVjaXBoZSkge1xcbiAgICAgICAgaWYgKHR5cGVvZiBkZWNpcGhlID09PSBcXFwic3RyaW5nXFxcIiAmJiBkZWNpcGhlLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICBsZXQgaW5zdHJlYW07XFxuICAgICAgICAgICAgbGV0IG91dHN0cmVhbTtcXG4gICAgICAgICAgICBsZXQgZmlsZTtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBmaWxlID0gbmV3IGphdmEuaW8uRmlsZShwYXRoKTtcXG4gICAgICAgICAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgZGlyID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7XFxuICAgICAgICAgICAgICAgIGlmIChkaXIgIT0gbnVsbCAmJiAhZGlyLmV4aXN0cygpKSB7XFxuICAgICAgICAgICAgICAgICAgICBkaXIubWtkaXJzKCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaW5zdHJlYW0gPSBmZXRjaCh1cmwsIHtcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXFxuICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbTogdHJ1ZVxcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICAgICAgb3V0c3RyZWFtID0gbmV3IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbShwYXRoKTtcXG4gICAgICAgICAgICAgICAgbGV0IHQgPSAkLmhpa2VyLmlucHV0LFxcbiAgICAgICAgICAgICAgICAgICAgYyA9ICQuaGlrZXIudXJsO1xcbiAgICAgICAgICAgICAgICAkLmhpa2VyLmlucHV0ID0gaW5zdHJlYW07XFxuICAgICAgICAgICAgICAgICQuaGlrZXIudXJsID0gdXJsO1xcbiAgICAgICAgICAgICAgICBsZXQgcGljaW4gPSAobmV3IEZ1bmN0aW9uKFxcXCJyZXR1cm4gXFxcIiArIGRlY2lwaGUpKSgpO1xcbiAgICAgICAgICAgICAgICAkLmhpa2VyLmlucHV0ID0gdDtcXG4gICAgICAgICAgICAgICAgJC5oaWtlci51cmwgPSBjO1xcbiAgICAgICAgICAgICAgICBsZXQgYnVmID0gamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkubmV3SW5zdGFuY2UoamF2YS5sYW5nLkJ5dGUuVFlQRSwgMTAyNCk7XFxuICAgICAgICAgICAgICAgIGxldCBsZW47XFxuICAgICAgICAgICAgICAgIHdoaWxlICgobGVuID0gcGljaW4ucmVhZChidWYpKSAhPSAtMSkge1xcbiAgICAgICAgICAgICAgICAgICAgb3V0c3RyZWFtLndyaXRlKGJ1ZiwgMCwgbGVuKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBjbG9zZU1lKGluc3RyZWFtKTtcXG4gICAgICAgICAgICAgICAgY2xvc2VNZShvdXRzdHJlYW0pO1xcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgY2xvc2VNZShpbnN0cmVhbSk7XFxuICAgICAgICAgICAgICAgIGNsb3NlTWUob3V0c3RyZWFtKTtcXG4gICAgICAgICAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBqYXZhLmlvLkZpbGUgJiYgZmlsZS5leGlzdHMoKSkge1xcbiAgICAgICAgICAgICAgICAgICAgZmlsZS5kZWxldGUoKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsb2coXFxcIjzop6Plr4bkuIvovb1FcnJvcj5cXFwiICsgZS50b1N0cmluZygpKVxcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xcbiAgICAgICAgICAgIH0gZmluYWxseSB7XFxuICAgICAgICAgICAgICAgIGNsb3NlTWUoaW5zdHJlYW0pO1xcbiAgICAgICAgICAgICAgICBjbG9zZU1lKG91dHN0cmVhbSk7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXF1aXJlRG93bmxvYWQodXJsLCBwYXRoLCBoZWFkZXJzKTtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAgdGV4dFNoaWVsZCh0ZXh0KSB7XFxuICAgICAgICBsZXQgZSA9IC8jfDp8JnxcXFxcfHxcXFxcXnxAfFxcXFw8fFxcXFw+fCV8XFxcXC98XFxcXD8vZztcXG4gICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoZSwgXFxcIl9cXFwiKTtcXG4gICAgfVxcbiAgICBcXG59XFxuXFxuJC5leHBvcnRzID0gdjtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2LuS4u+mhtemdolwiLFwicGF0aFwiOlwiTWFpbi52aWV3XCIsXCJydWxlXCI6XCJqczpcXG5mdW5jdGlvbiBtYWluKCkge1xcbiAgICB2YXIgbGF5b3V0ID0gW107XFxuICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgIGNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc1xcXCIpO1xcbiAgICBsZXQgdHlwZSA9IGdldE15VmFyKFxcXCIudHlwZVxcXCIsIGdldEl0ZW0oXFxcIm1haW46dHlwZVxcXCIsIENvbmZpZy5kZWZfTG9yZF9UeXBlKSk7XFxuICAgIGxldCB0Z251bSA9IGdldE15VmFyKFxcXCIudGdudW1cXFwiLCBcXFwiMFxcXCIpO1xcbiAgICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKE1ZX0lEKSA9PiB7XFxuICAgICAgICBjbGVhck15VmFyKFxcXCJzZWFyY2hLZXlcXFwiKTtcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcIi50Z251bVxcXCIpO1xcbiAgICB9KSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiB0eXBlID09PSBcXFwiY29taWNcXFwiID8gXFxcIuKXiea8q+eUu1xcXCIgOiBcXFwi4peL5ryr55S7XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgodHlwZSkgPT4ge1xcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcXFwiY29taWNcXFwiKSByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCIudHlwZVxcXCIsIFxcXCJjb21pY1xcXCIpO1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcIm1haW46dHlwZVxcXCIsIFxcXCJjb21pY1xcXCIpO1xcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcIi50Z251bVxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgdHlwZSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogdHlwZSA9PT0gXFxcIm5vdmVsXFxcIiA/IFxcXCLil4nlsI/or7RcXFwiIDogXFxcIuKXi+Wwj+ivtFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHR5cGUpID0+IHtcXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXFxcIm5vdmVsXFxcIikgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiLnR5cGVcXFwiLCBcXFwibm92ZWxcXFwiKTtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJtYWluOnR5cGVcXFwiLCBcXFwibm92ZWxcXFwiKTtcXG4gICAgICAgICAgICBjbGVhck15VmFyKFxcXCIudGdudW1cXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIHR5cGUpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IHR5cGUgPT09IFxcXCJ0eHRcXFwiID8gXFxcIuKXieaVtOacrOWwj+ivtFxcXCIgOiBcXFwi4peL5pW05pys5bCP6K+0XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgodHlwZSkgPT4ge1xcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcXFwidHh0XFxcIikgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvTm92ZWxDb2xsZWN0ZWQudmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCIudHlwZVxcXCIsIFxcXCJ0eHRcXFwiKTtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJtYWluOnR5cGVcXFwiLCBcXFwidHh0XFxcIik7XFxuICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwiLnRnbnVtXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCB0eXBlKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIlxcbiAgICB9KTtcXG4gICAgaWYgKHR5cGUgPT09IFxcXCJ0eHRcXFwiKSB7XFxuICAgICAgICBsZXQgdHh0VmlldyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2V4dGVybmFsaW1wb3J0VHh0LnZpZXdcXFwiKTtcXG4gICAgICAgIHJldHVybiB0eHRWaWV3KGxheW91dCk7XFxuICAgIH1cXG4gICAgbGV0IHRhZyA9IEZpbGUuZ2V0RmlsZVBhdGgoQ29uZmlnW3R5cGUgKyBcXFwiUGF0aFxcXCJdLCBcXFwiZGlyXFxcIik7XFxuICAgIGlmICh0YWcubGVuZ3RoID09PSAwKSB7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIixcXG4gICAgICAgIH0pO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi6K6+572uXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvU2V0dGluZy52aWV3I25vUmVmcmVzaCMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogTVlfUlVMRS52ZXJzaW9uXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzluK7liqnigJ3igJ1cXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9oZWxwLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/a2V5d29yZD1ub3ZlbENvbWljXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAnPGgxIHN0eWxlPVxcXCJ0ZXh0LWFsaWduOiBjZW50ZXI7XFxcIj7llaXpg73msqHmnInogLY8L2gxPicsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiBzZXRSZXN1bHQobGF5b3V0KTtcXG4gICAgfVxcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB1cmw6ICdcXFwiaGlrZXI6Ly9zZWFyY2g/cz1cXFwiK2lucHV0JyxcXG4gICAgICAgIGRlc2M6IFxcXCLmkJzkvaDmg7PopoHnmoQjXFxcIiArIHR5cGUgKyBcXFwiIy4uLi4uLlxcXCIsXFxuICAgICAgICB0aXRsZTogXFxcIvCflI1cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHJ1bGVzOiAkLnRvU3RyaW5nKCh0YWcsIHR5cGUpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IGFycjEgPSBbXTtcXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWcubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgIGFycjEucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcInRpdGxlXFxcIjogdGFnW2ldLm5hbWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcInNlYXJjaF91cmxcXFwiOiBcXFwiaGlrZXI6Ly9lbXB0eT9pc0FsbD0xJnNlYXJjaFRlcm1zPSoqJnR5cGU9XFxcIiArIHR5cGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcInNlYXJjaEZpbmRcXFwiOiBcXFwianM6JC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvU2VhcmNoLnZpZXc/cnVsZT0nK01ZX1JVTEUuX3RpdGxlKTtcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJyMSk7XFxuICAgICAgICAgICAgfSwgdGFnLCB0eXBlKSxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKCdzZWFyY2hLZXknLCAnJyksXFxuICAgICAgICAgICAgb25DaGFuZ2U6IFxcXCJwdXRNeVZhcignc2VhcmNoS2V5JyxpbnB1dClcXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcblxcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuKAmOKAmOKameiuvue9ruKAmeKAmVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcudmlldyNub1JlZnJlc2gjI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHZlcnNpb246IE1ZX1JVTEUudmVyc2lvblxcbiAgICAgICAgfVxcbiAgICB9KTtcXG5cXG5cXG4gICAgZm9yIChsZXQgaSBpbiB0YWcpIHtcXG4gICAgICAgIGxldCBpdCA9IHRhZ1tpXTtcXG4gICAgICAgIGlmICh0Z251bSA9PT0gaSkge1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJxcXFwiICsgaXQubmFtZSArIFxcXCLigJ3igJ1cXFwiLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoW1xcXCLliKDpmaTor6Xnm67lvZVcXFwiLCBcXFwi6Lez6L2s5bCP56iL5bqPXFxcIiwgXFxcIuaJk+W8gOS5puaetlxcXCJdLCAxLCBcXFwi6YCJ5oup5pON5L2cXFxcIikuc2VsZWN0KChpdCwgdHlwZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxcXCLot7PovazlsI/nqIvluo9cXFwiID09PSBpbnB1dCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9ob21lQFxcXCIgKyBpdC5uYW1lO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKFxcXCLliKDpmaTor6Xnm67lvZVcXFwiPT09aW5wdXQpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIHRoZW4oW1xcXCLor6Xmk43kvZzkuI3kvJrliKDpmaTlsI/nqIvluo/vvIzkvYbor6XlsI/nqIvluo/kuIvovb3nmoTmiYDmnInmvKvnlLvlsIbooqvliKDpmaRcXFwiXSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIuivpeaTjeS9nOS4jeS8muWIoOmZpOWwj+eoi+W6j++8jOS9huivpeWwj+eoi+W6j+S4i+i9veeahOaJgOaciSDmvKvnlLsv5bCP6K+0IOWwhuiiq+WIoOmZpFxcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmlsZXMocGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcIi50Z251bVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBpdC5wYXRoKTtcXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL0Jvb2tyYWNrLnZpZXc/cnVsZT3mnKzlnLDotYTmupDnrqHnkIYmcnVsZU5hbWU9XFxcIitpdC5uYW1lK1xcXCImdHlwZT1cXFwiK3R5cGU7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0sIGl0LCB0eXBlKVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBpdC5uYW1lLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoaSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiLnRnbnVtXFxcIiwgaSk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgICAgfSwgaSksXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgbGV0IHBhdGggPSB0YWdbdGdudW1dLnBhdGg7XFxuICAgIGxldCBtaGxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKHBhdGgsIFxcXCJkaXJcXFwiKTtcXG5cXG4gICAgaWYgKG1obGlzdC5sZW5ndGggPT09IDApIHtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi5ZWl6YO95rKh5pyJ6IC2XFxcIi5iaWcoKSxcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIHNldFJlc3VsdChsYXlvdXQpO1xcbiAgICB9XFxuICAgIGxldCBwYWdlVXJsID0gdHlwZSA9PT0gXFxcIm5vdmVsXFxcIiA/IFxcXCJoaWtlcjovL3BhZ2UvTm92ZWxCcm93c2VyLnZpZXdcXFwiIDogXFxcImhpa2VyOi8vcGFnZS9Db21pY0Jyb3dzZXIudmlld1xcXCI7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgbWhsaXN0KSB7XFxuICAgICAgICBsZXQgcGljID0gZmlsZUV4aXN0KFxcXCJmaWxlOi8vXFxcIiArIGl0ZW0ucGF0aCArIFxcXCIvXFxcIiArIGl0ZW0ubmFtZSArIFxcXCIuanBnXFxcIikgPyBpdGVtLnBhdGggKyBcXFwiL1xcXCIgKyBpdGVtLm5hbWUgKyBcXFwiLmpwZ1xcXCIgOiBDb25maWcuZGVmX1BpYztcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lLFxcbiAgICAgICAgICAgIHBpY191cmw6IHBpYyxcXG4gICAgICAgICAgICB1cmw6IHR5cGUgPT09IFxcXCJub3ZlbFxcXCIgP3BhZ2VVcmwgKyBcXFwiP3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGU6JChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgocGFnZVVybCwgcGF0aCk9PntcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwibG9uZ1ByZXNzLmpzXFxcIikuc2luZ2xlRW50ZXIocGFnZVVybCwgcGF0aCk7XFxuICAgICAgICAgICAgfSwgcGFnZVVybCwgaXRlbS5wYXRoKSxcXG4gICAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbihpdGVtLCB7XFxuICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5Yig6ZmkXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwibG9uZ1ByZXNzLmpzXFxcIikuZGVsZXRlRmlsZUZvckJvb2socGF0aClcXG4gICAgICAgICAgICAgICAgICAgIH0sIGl0ZW0ucGF0aClcXG4gICAgICAgICAgICAgICAgfV0sXFxuICAgICAgICAgICAgICAgIGlkOiBpdGVtLnBhdGhcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgc2V0UmVzdWx0KGxheW91dCk7XFxufVxcblxcbm1haW4oKTtcIn0se1wiY29sX3R5cGVcIjpcInRleHRfMVwiLFwibmFtZVwiOlwiI3Yu5ryr55S756ug6IqC5YiX6KGoXCIsXCJwYXRoXCI6XCJDb21pY0Jyb3dzZXIudmlld1wiLFwicnVsZVwiOlwianM6XFxuY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFwiVG9vbC5qc1xcXCIpO1xcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiQ29uZmlnLmpzXFxcIik7XFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiRmlsZS5qc1xcXCIpO1xcbmlmIChnZXRQYXJhbShcXFwiaGFzUGFyYW1zXFxcIikgPT09IFxcXCJ0cnVlXFxcIikge1xcbiAgICBNWV9QQVJBTVMgPSB7XFxuICAgICAgICBwYXRoOiBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInBhdGhcXFwiKSksXFxuICAgICAgICBuYW1lOiBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcIm5hbWVcXFwiKSksXFxuICAgICAgICBib29rTmFtZTogZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJib29rTmFtZVxcXCIpKSxcXG4gICAgICAgIHJ1bGVOYW1lOiBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInJ1bGVOYW1lXFxcIikpLFxcbiAgICAgICAgY29taWNTdHlsZTogZ2V0UGFyYW0oXFxcImNvbWljU3R5bGVcXFwiKVxcbiAgICB9XFxufVxcbmxldCBwYXRoID0gTVlfUEFSQU1TLnBhdGg7XFxuaWYgKCFwYXRoKSB7XFxuICAgIHBhdGggPSBDb25maWcuY29taWNQYXRoICsgXFxcIi9cXFwiICsgTVlfUEFSQU1TLnJ1bGVOYW1lICsgXFxcIi9cXFwiICsgTVlfUEFSQU1TLmJvb2tOYW1lO1xcbn1cXG5pZiAoTVlfUEFSQU1TLmNvbWljU3R5bGUpIHtcXG4gICAgQ29uZmlnLmRlZl9Db21pY19TdHlsZSA9IE1ZX1BBUkFNUy5jb21pY1N0eWxlO1xcbn1cXG5zZXRQYWdlVGl0bGUoXFxcIkNWfFxcXCIgKyAoTVlfUEFSQU1TLm5hbWUgfHwgRmlsZS5nZXROYW1lKHBhdGgpKSk7XFxuXFxudmFyIGxheW91dCA9IFtdO1xcbmxldCBtb2RlID0gZ2V0TXlWYXIoXFxcIi5tb2RlXFxcIiwgXFxcIjBcXFwiKTtcXG5sZXQgaXNSZXZlcnNlID0gZ2V0TXlWYXIoXFxcIi5pc1JldmVyc2VcXFwiLCBcXFwiMFxcXCIpO1xcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcIi5tb2RlXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcIi5pc1JldmVyc2VcXFwiKTtcXG59KSk7XFxuY29uc3QgY29taWNTdGF0dXMgPSBuZXcgTWFwKFtcXG4gICAgW1xcXCJBXFxcIiwgXFxcIlxcXCJdLFxcbiAgICBbXFxcIkJcXFwiLCBcXFwi4oCY4oCYW+acquWujOaIkF3igJnigJlcXFwiXVxcbl0pO1xcblxcbmZ1bmN0aW9uIGdldFRpdGxlKHRpdGxlKSB7XFxuICAgIGxldCB0aXRsZXMgPSBUb29sLnNwbGl0KHRpdGxlLCBcXFwiJFxcXCIsIDIpO1xcbiAgICByZXR1cm4gY29taWNTdGF0dXMuZ2V0KHRpdGxlc1sxXSkgKyB0aXRsZXNbMl0gfHwgdGl0bGU7XFxufVxcblxcbmZ1bmN0aW9uIGdldFRpdGxlMih0aXRsZSkge1xcbiAgICBsZXQgdGl0bGVzID0gVG9vbC5zcGxpdCh0aXRsZSwgXFxcIiRcXFwiLCAyKTtcXG4gICAgcmV0dXJuIHRpdGxlc1syXSB8fCB0aXRsZTtcXG59XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWIoOmZpOaVtOacrFxcXCIsXFxuICAgIHVybDogJChcXFwi56Gu6K6k5Yig6Zmk5pW05pys5ryr55S777yfXFxcIikuY29uZmlybSgocGF0aCkgPT4ge1xcbiAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgICAgIGlmIChGaWxlLmRlbGV0ZUZpbGVzKHBhdGgpKSB7XFxuICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFwiO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5aSx6LSlXFxcIjtcXG4gICAgICAgIH1cXG4gICAgfSwgcGF0aCksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFtcXFwi55yL5ryr55S7XFxcIiwgXFxcIuWIoOmZpOeroOiKglxcXCJdW21vZGVdLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKG1vZGUpID0+IHtcXG4gICAgICAgIHB1dE15VmFyKFxcXCIubW9kZVxcXCIsIG1vZGUgPT09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgfSwgbW9kZSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pXFxubGV0IG1obGlzdCA9IEZpbGUuZ2V0RmlsZVBhdGgocGF0aCwgXFxcImRpclxcXCIpO1xcbm1obGlzdC5zb3J0KChhLCBiKSA9PiB7XFxuICAgIGEgPSAoYS5uYW1lLm1hdGNoKC9cXFxcZCsvKSB8fCBbXSlbMF0gfHwgMDtcXG4gICAgYiA9IChiLm5hbWUubWF0Y2goL1xcXFxkKy8pIHx8IFtdKVswXSB8fCAwO1xcbiAgICByZXR1cm4gYSAtIGI7XFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi56ug6IqCIFxcXCIuYmlnKCkgKyAoXFxcIuWFseaciTpcXFwiICsgbWhsaXN0Lmxlbmd0aCArIFxcXCLnq6BcXFwiKS5zbWFsbCgpLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlzUmV2ZXJzZSkgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcIi5pc1JldmVyc2VcXFwiLCBpc1JldmVyc2UgPT09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgfSwgaXNSZXZlcnNlKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxubGV0IGFycmF5ID0gW107XFxuXFxuaWYgKG1vZGUgPT09IFxcXCIwXFxcIikge1xcbiAgICBpZiAoQ29uZmlnLmRlZl9pc0NvbWljQ29tcGF0aWJsZSA9PT0gXFxcIjBcXFwiKSB7XFxuICAgICAgICBsZXQgbGF6eSA9ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICAgICAgbGV0IGZpbGVsaXN0ID0gRmlsZS5nZXRGaWxlUGF0aChpbnB1dCk7XFxuICAgICAgICAgICAgbGV0IHNob3J0ZW4gPSBpbnB1dC5yZXBsYWNlKGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvXFxcIikuc2xpY2UoNyksIFxcXCJoaWtlcjovL2ZpbGVzL1xcXCIpO1xcbiAgICAgICAgICAgIGxldCBwaWNsaXN0ID0gZmlsZWxpc3QubWFwKChpdGVtLCBpKSA9PiBzaG9ydGVuICsgXFxcIi9cXFwiICsgKGkgKyAxKSArIFxcXCIuanBnXFxcIik7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJwaWNzOi8vXFxcIiArIHBpY2xpc3Quam9pbihcXFwiJiZcXFwiKTtcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBtaGxpc3QpIHtcXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBnZXRUaXRsZShpdGVtLm5hbWUpO1xcbiAgICAgICAgICAgIGFycmF5LnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgICAgIHVybDogaXRlbS5wYXRoICsgbGF6eSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IENvbmZpZy5kZWZfQ29taWNfU3R5bGUsXFxuICAgICAgICAgICAgICAgIHBpY191cmw6IGl0ZW0ucGF0aCArIFxcXCIvMS5qcGdcXFwiXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBmb3IgKGxldCBpdGVtIG9mIG1obGlzdCkge1xcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IGdldFRpdGxlKGl0ZW0ubmFtZSk7XFxuICAgICAgICAgICAgYXJyYXkucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2NvbWljQ29tcGF0aWJsZS52aWV3I2F1dG9QYWdlIyNyZWFkVGhlbWUjP3BhdGg9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChpdGVtLnBhdGgpLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogQ29uZmlnLmRlZl9Db21pY19TdHlsZSxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogaXRlbS5wYXRoICsgXFxcIi8xLmpwZ1xcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBpdGVtLnBhdGgsXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogZ2V0VGl0bGUyKGl0ZW0ubmFtZSlcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICB9XFxuXFxufSBlbHNlIHtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBtaGxpc3QpIHtcXG4gICAgICAgIGxldCBuYW1lID0gZ2V0VGl0bGUyKGl0ZW0ubmFtZSk7XFxuICAgICAgICBhcnJheS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogbmFtZSxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIuehruiupOWIoOmZpFtcXFwiICsgbmFtZSArIFxcXCJd77yfXFxcIikuY29uZmlybSgocGF0aCkgPT4ge1xcbiAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgICAgICAgICBpZiAoRmlsZS5kZWxldGVGaWxlcyhwYXRoKSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTlpLHotKVcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSwgaXRlbS5wYXRoKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogQ29uZmlnLmRlZl9Db21pY19TdHlsZSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLnBhdGggKyBcXFwiLzEuanBnXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxuaWYgKGlzUmV2ZXJzZSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgIGFycmF5LnJldmVyc2UoKTtcXG59XFxubGF5b3V0LnB1c2guYXBwbHkobGF5b3V0LCBhcnJheSk7XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjdi7ogZrlkIjmkJzntKJcIixcInBhdGhcIjpcIlNlYXJjaC52aWV3XCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qcz9ydWxlPVxcXCIgKyBNWV9SVUxFLl90aXRsZSk7XFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzP3J1bGU9XFxcIiArIE1ZX1JVTEUuX3RpdGxlKTtcXG5sZXQgY29taWNSdWxlRGlycyA9IEZpbGUuZ2V0RmlsZVBhdGgoQ29uZmlnW2dldFBhcmFtKFxcXCJ0eXBlXFxcIikgKyBcXFwiUGF0aFxcXCJdLCBcXFwiZGlyXFxcIik7XFxuaWYgKGdldFBhcmFtKFxcXCJpc0FsbFxcXCIpID09PSBcXFwiMVxcXCIpIHtcXG4gICAgY29taWNSdWxlRGlycyA9IGNvbWljUnVsZURpcnMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5uYW1lID09PSBNWV9SVUxFLnRpdGxlKTtcXG59XFxuXFxubGV0IHNlYXJjaFJlc3VsdCA9IFtdO1xcbmxldCBzZWFyY2hUZXJtcz0gZ2V0UGFyYW0oXFxcInNlYXJjaFRlcm1zXFxcIik7XFxubGV0IHNlYXJjaFRlc3Q7XFxuXFxuaWYgKCFnZXRTZWFyY2hNb2RlKCkpIHtcXG4gICAgbGV0IHRlcm1zQXJyID0gc2VhcmNoVGVybXMuc3BsaXQoXFxcIlxcXCIpLm1hcCh0ID0+IHQucmVwbGFjZSgvXFxcXCp8XFxcXC58XFxcXD98XFxcXCt8XFxcXCR8XFxcXF58XFxcXFt8XFxcXF18XFxcXCh8XFxcXCl8XFxcXHt8XFxcXH18XFxcXHx8XFxcXC98XFxcXFxcXFwvZywgayA9PiBcXFwiXFxcXFxcXFxcXFwiICsgaykpO1xcbiAgICBsZXQgcmVnID0gbmV3IFJlZ0V4cCh0ZXJtc0Fyci5qb2luKFxcXCIuKlxcXCIpLCBcXFwiaVxcXCIpO1xcbiAgICBzZWFyY2hUZXN0ID0gdGV4dCA9PiByZWcudGVzdCh0ZXh0KTtcXG59IGVsc2Uge1xcbiAgICBzZWFyY2hUZXN0ID0gdGV4dCA9PiBzZWFyY2hDb250YWlucyh0ZXh0LCBzZWFyY2hUZXJtcywgZmFsc2UpO1xcbn1cXG5cXG5sZXQgcGFnZVVybCA9IGdldFBhcmFtKFxcXCJ0eXBlXFxcIikgPT09IFxcXCJub3ZlbFxcXCIgPyBcXFwiaGlrZXI6Ly9wYWdlL05vdmVsQnJvd3Nlci52aWV3XFxcIiA6IFxcXCJoaWtlcjovL3BhZ2UvQ29taWNCcm93c2VyLnZpZXdcXFwiO1xcbmZvciAobGV0IHNvbkRpciBvZiBjb21pY1J1bGVEaXJzKSB7XFxuICAgIGxldCBjb21pY0xpc3QgPSBGaWxlLmdldEZpbGVQYXRoKHNvbkRpci5wYXRoLCBcXFwiZGlyXFxcIik7XFxuICAgIGZvciAobGV0IGNvbWljIG9mIGNvbWljTGlzdCkge1xcbiAgICAgICAgaWYgKHNlYXJjaFRlc3QoY29taWMubmFtZSkpIHtcXG4gICAgICAgICAgICBzZWFyY2hSZXN1bHQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBjb21pYy5uYW1lLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBjb21pYy5wYXRoICsgXFxcIi9cXFwiICsgY29taWMubmFtZSArIFxcXCIuanBnXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiBwYWdlVXJsICsgXFxcIj9ydWxlPVxcXCIgKyBNWV9SVUxFLl90aXRsZSxcXG4gICAgICAgICAgICAgICAgZGVzYzogc29uRGlyLm5hbWUsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiBjb21pY1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICB9XFxuXFxufVxcbnNldFJlc3VsdChzZWFyY2hSZXN1bHQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI3Yu6K6+572uXCIsXCJwYXRoXCI6XCJTZXR0aW5nLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShNWV9SVUxFLnRpdGxlICsgXFxcInzorr7nva5cXFwiKTtcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFwiKTtcXG5cXG5sZXQgbGF5b3V0ID0gW107XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIjxzdHJvbmc+5Z+656GA6K6+572uPC9zdHJvbmc+XFxcIi5iaWcoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuebruW9lei3r+W+hFxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nL01vcmUudmlldyNub1JlZnJlc2gjI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9zZXR0aW5nVHlwZT1jb250ZW50c1xcXCIsXFxuICAgIGRlc2M6IENvbmZpZy5ob21lUGF0aCxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuiuvue9rum7mOiupOWwgemdolxcXCIsXFxuICAgIGRlc2M6IENvbmZpZy5kZWZfUGljLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvU2V0dGluZy9Nb3JlLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/c2V0dGluZ1R5cGU9ZGVmYXVsdFBpY1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIjxzdHJvbmc+5LiL6L295Zmo6K6+572uPC9zdHJvbmc+XFxcIi5iaWcoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxufSk7XFxuXFxuZnVuY3Rpb24gc2V0TnVtKGtleSwgdGVzdCkge1xcbiAgICBsZXQgQ29uZmlnID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFwiY29uZmlnLmpzb25cXFwiLCAwKSB8fCBcXFwie31cXFwiKTtcXG4gICAgaW5wdXQgPSBwYXJzZUludChpbnB1dCk7XFxuICAgIGlmIChOdW1iZXIuaXNOYU4oaW5wdXQpKSByZXR1cm4gXFxcInRvYXN0Oi8v6K+36L6T5YWl5pWw5a2XXFxcIjtcXG4gICAgaWYgKCF0ZXN0KGlucHV0KSkgcmV0dXJuIFxcXCJ0b2FzdDovL+S4jeespuWQiOadoeS7tlxcXCI7XFxuICAgIENvbmZpZ1trZXldID0gaW5wdXQ7XFxuICAgIHNhdmVGaWxlKFxcXCJjb25maWcuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KENvbmZpZyksIDApO1xcbiAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFwiO1xcbn1cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwibG9n5pWwXFxcIixcXG4gICAgdXJsOiAkKENvbmZpZy5sb2dOdW0sIFxcXCIwPE48MTAwXFxcIikuaW5wdXQoc2V0TnVtLCBcXFwibG9nTnVtXFxcIiwgaXQgPT4gaXQgPiAwICYmIGl0IDwgMTAwKSxcXG4gICAgZGVzYzogXFxcIlxcXCIgKyBDb25maWcubG9nTnVtLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5YiG5om55LiL6L295pWwKDDkuI3lvIDlkK8pXFxcIixcXG4gICAgdXJsOiAkKFxcXCJcXFwiICsgQ29uZmlnLnRocmVhZE51bSwgXFxcIk4+LTFcXFwiKS5pbnB1dChzZXROdW0sIFxcXCJ0aHJlYWROdW1cXFwiLCBpdCA9PiBpdCA+IC0xKSxcXG4gICAgZGVzYzogXFxcIlxcXCIgKyBDb25maWcudGhyZWFkTnVtLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxuICAgIH1cXG59KTtcXG5cXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwiPHN0cm9uZz7lsI/or7TpmIXor7vlmajorr7nva48L3N0cm9uZz5cXFwiLmJpZygpLFxcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6buY6K6k5byA5ZCv5YiG6aG16ZiF6K+7XFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChkZWZfaXNQYWdpbmF0ZSkgPT4ge1xcbiAgICAgICAgbGV0IENvbmZpZyA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcImNvbmZpZy5qc29uXFxcIiwgMCkgfHwgXFxcInt9XFxcIik7XFxuXFxuICAgICAgICBDb25maWcuZGVmX2lzUGFnaW5hdGUgPSBkZWZfaXNQYWdpbmF0ZSA9PT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiO1xcblxcbiAgICAgICAgc2F2ZUZpbGUoXFxcImNvbmZpZy5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoQ29uZmlnKSwgMCk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCBDb25maWcuZGVmX2lzUGFnaW5hdGUpLFxcbiAgICBkZXNjOiBDb25maWcuZGVmX2lzUGFnaW5hdGUgPT09IFxcXCIwXFxcIiA/IFxcXCLkuI3lvIDlkK9cXFwiIDogXFxcIuW8gOWQr1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmr4/pobXmnIDlpKfnq6DmlbBcXFwiLFxcbiAgICB1cmw6ICQoQ29uZmlnLnZpZXdQYWdlU2l6ZSwgXFxcIjMwPE48NTAwXFxcIikuaW5wdXQoc2V0TnVtLCBcXFwidmlld1BhZ2VTaXplXFxcIiwgaXQgPT4gaXQgPiAzMCAmJiBpdCA8IDUwMCksXFxuICAgIGRlc2M6IFxcXCJcXFwiICsgQ29uZmlnLnZpZXdQYWdlU2l6ZSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuabv+aNouinhOWImVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nL01vcmUudmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMjbm9SZWZyZXNoIz9zZXR0aW5nVHlwZT1yZXBsYWNlUnVsZVxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIjxzdHJvbmc+5ryr55S76ZiF6K+75Zmo6K6+572uPC9zdHJvbmc+XFxcIi5iaWcoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWFvOWuueaooeW8j1xcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoZGVmX2lzQ29taWNDb21wYXRpYmxlKSA9PiB7XFxuICAgICAgICBsZXQgQ29uZmlnID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFwiY29uZmlnLmpzb25cXFwiLCAwKSB8fCBcXFwie31cXFwiKTtcXG5cXG4gICAgICAgIENvbmZpZy5kZWZfaXNDb21pY0NvbXBhdGlibGUgPSBkZWZfaXNDb21pY0NvbXBhdGlibGUgPT09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIjtcXG5cXG4gICAgICAgIHNhdmVGaWxlKFxcXCJjb25maWcuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KENvbmZpZyksIDApO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgQ29uZmlnLmRlZl9pc0NvbWljQ29tcGF0aWJsZSksXFxuICAgIGRlc2M6IENvbmZpZy5kZWZfaXNDb21pY0NvbXBhdGlibGUgPT09IFxcXCIwXFxcIiA/IFxcXCLkuI3lvIDlkK9cXFwiIDogXFxcIuW8gOWQr1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmvKvnlLvliJfooajmoLflvI9cXFwiLFxcbiAgICB1cmw6ICQoW1xcXCJ0ZXh0XzFcXFwiLCBcXFwiYXZhdGFyXFxcIiwgXFxcInBpY18zXFxcIiwgXFxcInBpY18zX3NxdWFyZVxcXCIsIFxcXCJtb3ZpZV8zX21hcnF1ZWVcXFwiXSwgMSwgXFxcIuivt+mAieaLqea8q+eUu+WIl+ihqOaYvuekuuagt+W8j1xcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICBsZXQgQ29uZmlnID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFwiY29uZmlnLmpzb25cXFwiLCAwKSB8fCBcXFwie31cXFwiKTtcXG4gICAgICAgIENvbmZpZy5kZWZfQ29taWNfU3R5bGUgPSBpbnB1dDtcXG4gICAgICAgIHNhdmVGaWxlKFxcXCJjb25maWcuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KENvbmZpZyksIDApO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgQ29uZmlnLmRlZl9Db21pY19TdHlsZSksXFxuICAgIGRlc2M6IENvbmZpZy5kZWZfQ29taWNfU3R5bGV8fFxcXCJcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwiPHN0cm9uZz7lhbbku5borr7nva48L3N0cm9uZz5cXFwiLmJpZygpLFxcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6KeE5YiZ5Y+R5biD6aG1XFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVEZXRhaWwjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjP3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGx2ZXI6IE1ZX1BBUkFNUy52ZXJzaW9uIHx8IFxcXCLojrflj5bniYjmnKzlpLHotKXvvIzoh6rooYzmn6XnnItcXFwiLFxcbiAgICAgICAgaWQ6IFxcXCIzNTU5XFxcIlxcbiAgICB9LFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5oGi5aSN6buY6K6k6K6+572uXFxcIixcXG4gICAgdXJsOiAkKFxcXCLnoa7orqTmgaLlpI3pu5jorqTorr7nva7vvJ9cXFwiKS5jb25maXJtKCgpID0+IHtcXG4gICAgICAgIGRlbGV0ZUZpbGUoXFxcImNvbmZpZy5qc29uXFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5oGi5aSN5a6M5oiQXFxcIjtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmuIXnkIbnvJPlrZhcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvU2V0dGluZy9Nb3JlLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP3NldHRpbmdUeXBlPWNhY2hlXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaWh+S7tueuoeeQhlxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9GaWxlTWFuYWdlbWVudC52aWV3I25vUmVmcmVzaCMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxubGV0IHRpZCA9IERhdGUubm93KCk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuajgOa1i+abtOaWsFxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChvbGRWZXJzaW9uLCB0aWQpID0+IHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IG5ld1ZlcnNpb24gPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9kZXYvZ2V0YnlpZD9pZD0zNTU5XFxcIiwge1xcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiAyMDAwXFxuICAgICAgICAgICAgfSkpLnJlc3VsdC52ZXI7XFxuICAgICAgICAgICAgaWYgKG5ld1ZlcnNpb24gPD0gb2xkVmVyc2lvbikge1xcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHRpZCArIFxcXCIj6K6+572uX+abtOaWsFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5bey57uP5piv5pyA5paw54mI5pys5LqGXFxcIlxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3sue7j+aYr+acgOaWsOeJiOacrOS6hlxcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbSh0aWQgKyBcXFwiI+iuvue9rl/mm7TmlrBcXFwiLCB7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuacieaWsOeJiOacrOi/mOacquabtOaWsFxcXCJcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLmnInmlrDniYjmnKzov5jmnKrmm7TmlrBcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJydWxlOi8vNXJXMzZaaVU2S2VHNTVXTTc3K2xhRzl0WlY5eWRXeGxYM1Z5Yk8rL3BXaDBkSEE2THk5b2FXdGxjaTV1YjJ0cFlTNXdjbVZ6Y3k5b2FXdGxjblZzWlM5eWRXeGxiR2x6ZEM1cWMyOXVQMmxrUFRNMU5Uaz1cXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHRpZCArIFxcXCIj6K6+572uX+abtOaWsFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLkv6Hmga/ojrflj5blpLHotKVcXFwiXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+abtOaWsOS/oeaBr+iOt+WPluWksei0pVxcXCI7XFxuICAgICAgICB9XFxuICAgIH0sIE1ZX1BBUkFNUy52ZXJzaW9uLCB0aWQpLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IHRpZCArIFxcXCIj6K6+572uX+abtOaWsFxcXCJcXG4gICAgfVxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLlhbPkuo7lpoLkvZXosIPnlKhcXFwiLFxcbiAgICB1cmw6IFxcXCJtcXFhcGk6Ly9mb3J3YXJkL3VybD9zcmNfdHlwZT13ZWImc3R5bGU9ZGVmYXVsdCZwbGdfYXV0aD0xJnZlcnNpb249MSZ1cmxfcHJlZml4PWFIUjBjSE02THk5eGRXNHVjWEV1WTI5dEwzRnhkMlZpTDNGMWJuQnlieTl6YUdGeVpUOWZkM1k5TXlaZmQzZDJQVEV5T0NacGJuWnBkR1ZEYjJSbFBURklSbmxDU2labWNtOXRQVEkwTmpZeE1DWmlhWG85YTJFakwyOTFkQT09XFxcIixcXG4gICAgZGVzYzogXFxcIuivpue7hueCueWHu+WKoOWFpemikemBkyjlv6vmnaXljY7lsbHkuI7miJHorrpbamld5YmRKVxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLpl67popjlj43ppohcXFwiLFxcbiAgICB1cmw6IFxcXCJtcXFhcGk6Ly9mb3J3YXJkL3VybD9zcmNfdHlwZT13ZWImc3R5bGU9ZGVmYXVsdCZwbGdfYXV0aD0xJnZlcnNpb249MSZ1cmxfcHJlZml4PWFIUjBjSE02THk5eGRXNHVjWEV1WTI5dEwzRnhkMlZpTDNGMWJuQnlieTl6YUdGeVpUOWZkM1k5TXlaZmQzZDJQVEV5T0NaaGNIQkRhR0Z1Ym1Wc1BYTm9ZWEpsSm1sdWRtbDBaVU52WkdVOU1WaE9ZV3hCUlhsMlZtb21ZMjl1ZEdWdWRFbEVQV016YkVsUUptSjFjMmx1WlhOelZIbHdaVDB5Sm1aeWIyMDlNVGd4TURjMEptSnBlajFyWVNadFlXbHVVMjkxY21ObFNXUTljMmhoY21VbWMzVmlVMjkxY21ObFNXUTliM1JvWlhKekptcDFiWEJ6YjNWeVkyVTljMmh2Y25SMWNtdz0mdD0xNjcxODkzMTIzNTk3I0ludGVudDtzY2hlbWU9bXFxYXBpO3BhY2thZ2U9Y29tLnRlbmNlbnQubW9iaWxlcXE7ZW5kXFxcIixcXG4gICAgZGVzYzogXFxcIue7neWvueS4jeS8muaciWJ1ZyjllYrmiJHkuI3mjqXlj5chKVxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbn0pO1xcbi8qXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIua4hemZpOWwj+ivtOWIhumhteiusOW9lVxcXCIsXFxuICAgIHVybDogJChcXFwi56Gu6K6k5riF6Zmk5bCP6K+05YiG6aG16K6w5b2V77yfXFxcIikuY29uZmlybSgoKSA9PiB7XFxuICAgICAgICBkZWxldGVGaWxlKFxcXCJub3ZlbEZvb3RwcmludC5qc29uXFxcIik7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5riF6Zmk5a6M5oiQXFxcIjtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbn0pO1xcbiovXFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJ0ZXh0XzFcIixcIm5hbWVcIjpcIiN2LuWwj+ivtOeroOiKguWIl+ihqFwiLFwicGF0aFwiOlwiTm92ZWxCcm93c2VyLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmlmIChnZXRQYXJhbShcXFwiaGFzUGFyYW1zXFxcIikgPT09IFxcXCJ0cnVlXFxcIikge1xcbiAgICBNWV9QQVJBTVMgPSB7XFxuICAgICAgICBwYXRoOiBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInBhdGhcXFwiKSksXFxuICAgICAgICBuYW1lOiBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcIm5hbWVcXFwiKSlcXG4gICAgfVxcbn1cXG5sZXQgcGF0aCA9IE1ZX1BBUkFNUy5wYXRoO1xcbnNldFBhZ2VUaXRsZShcXFwiTlZ8XFxcIiArIE1ZX1BBUkFNUy5uYW1lKTtcXG5jb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbmNvbnN0IFRvb2wgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcIik7XFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzXFxcIik7XFxuY29uc3QgYm9va0luZm8gPSBPYmplY3QuYXNzaWduKHtcXG4gICAgZm9vdDogMCxcXG4gICAgaXNSZXBsYWNlOiB0cnVlLFxcbiAgICBpc1NlZ21lbnQ6IHRydWVcXG59LCBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIpIHx8IFxcXCJ7fVxcXCIpKTtcXG5sZXQgaWQgPSBcXFwiI1xcXCIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcXG52YXIgbGF5b3V0ID0gW107XFxubGV0IG1vZGUgPSBnZXRNeVZhcihcXFwiLm1vZGVcXFwiLCBcXFwiMFxcXCIpO1xcbmxldCBtb2RlMiA9IGdldE15VmFyKFxcXCIubW9kZTJcXFwiLCBDb25maWcuZGVmX2lzUGFnaW5hdGUpO1xcblxcbmxldCBpc1JldmVyc2UgPSBnZXRNeVZhcihcXFwiLmlzUmV2ZXJzZVxcXCIsIFxcXCIwXFxcIik7XFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJNeVZhcihcXFwiLm1vZGVcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwiLm1vZGUyXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcIi5pc1JldmVyc2VcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwiLnBhZ2VOdW1cXFwiKTtcXG59KSk7XFxuXFxuZnVuY3Rpb24gZ2V0VGl0bGUodGl0bGUpIHtcXG4gICAgbGV0IHRpdGxlcyA9IFRvb2wuc3BsaXQodGl0bGUsIFxcXCIkXFxcIiwgMik7XFxuICAgIHJldHVybiB0aXRsZXNbMl0gIT09IHVuZGVmaW5lZCA/IHRpdGxlc1syXS5zbGljZSgwLCB0aXRsZXNbMl0ubGFzdEluZGV4T2YoXFxcIi5cXFwiKSkgOiB0aXRsZTtcXG59XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWIoOmZpOaVtOacrFxcXCIsXFxuICAgIHVybDogJChcXFwi56Gu6K6k5Yig6Zmk5pW05pys5bCP6K+077yfXFxcIikuY29uZmlybSgocGF0aCkgPT4ge1xcbiAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgICAgIGlmIChGaWxlLmRlbGV0ZUZpbGVzKHBhdGgpKSB7XFxuICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFwiO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5aSx6LSlXFxcIjtcXG4gICAgICAgIH1cXG4gICAgfSwgcGF0aCksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFtcXFwi55yL5bCP6K+0XFxcIiwgXFxcIuWIoOmZpOeroOiKglxcXCJdW21vZGVdLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKG1vZGUpID0+IHtcXG4gICAgICAgIHB1dE15VmFyKFxcXCIubW9kZVxcXCIsIG1vZGUgPT09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgfSwgbW9kZSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLigJjigJjmm7TlpJrlip/og70gPuKAmeKAmVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxufSk7XFxuXFxuZnVuY3Rpb24gdHh0KHBhdGhzKSB7XFxuICAgIHNob3dMb2FkaW5nKFxcXCLmraPlnKjlkIjlubYuLi5cXFwiKTtcXG4gICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFwiKTtcXG4gICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzXFxcIik7XFxuXFxuICAgIGxldCBmaWxlbGlzdCA9IEZpbGUuZ2V0RmlsZVBhdGgocGF0aHMucGF0aCwgXFxcImZpbGVcXFwiLCBcXFwiLnR4dFxcXCIpO1xcbiAgICBsZXQgbGlzdExlbmd0aCA9IGZpbGVsaXN0Lmxlbmd0aDtcXG4gICAgaWYgKGxpc3RMZW5ndGggPT09IDApIHtcXG4gICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v56m655qE56ug6IqCXFxcIjtcXG4gICAgfVxcbiAgICBjb25zdCBib29rSW5mbyA9IE9iamVjdC5hc3NpZ24oe1xcbiAgICAgICAgc2VsZWN0ZWQ6IFtdLFxcbiAgICAgICAgaXNSZXBsYWNlOiB0cnVlXFxuICAgIH0sIEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBwYXRocy5wYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikgfHwgXFxcInt9XFxcIikpO1xcbiAgICBsZXQgYnVmaWxlbGlzdCA9IFtdO1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xcbiAgICAgICAgbGV0IGZpbGUgPSBmaWxlbGlzdFtpXTtcXG4gICAgICAgIGxldCBmaWxlSW5mbyA9IFRvb2wuc3BsaXQoZmlsZS5uYW1lLCBcXFwiJFxcXCIsIDIpO1xcbiAgICAgICAgYnVmaWxlbGlzdC5wdXNoKHtcXG4gICAgICAgICAgICBuYW1lOiBmaWxlSW5mb1syXS5zbGljZSgwLCBmaWxlSW5mb1syXS5sYXN0SW5kZXhPZihcXFwiLlxcXCIpKSxcXG4gICAgICAgICAgICBwYXRoOiBcXFwiZmlsZTovL1xcXCIgKyBmaWxlLnBhdGgsXFxuICAgICAgICAgICAgaWQ6IE51bWJlcihmaWxlSW5mb1swXSkgfHwgMFxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgYnVmaWxlbGlzdC5zb3J0KChhLCBiKSA9PiBhLmlkIC0gYi5pZCk7XFxuICAgIGxldCBlbnRpcmVQYXRoID0gcGF0aHMucGF0aC5yZXBsYWNlKENvbmZpZy5ub3ZlbFBhdGgsIENvbmZpZy5ub3ZlbEZ1bGxQYXRoKSArIFxcXCIudHh0XFxcIjtcXG4gICAgbGV0IGVudGlyZVBhdGh0byA9IGJvb2tJbmZvLmlzUmVwbGFjZSA/IGVudGlyZVBhdGggKyBcXFwiLnRtcFxcXCIgOiBlbnRpcmVQYXRoO1xcblxcbiAgICBpZiAoZmlsZUV4aXN0KFxcXCJmaWxlOi8vXFxcIiArIGVudGlyZVBhdGgpKSB7XFxuICAgICAgICB0b2FzdChcXFwi5Yid5aeL5YyW5paH5Lu2XFxcIik7XFxuICAgICAgICBpZiAoIUZpbGUuZGVsZXRlRmlsZXMoZW50aXJlUGF0aCkpIHtcXG4gICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liJ3lp4vljJblpLHotKVcXFwiO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB0b2FzdChcXFwi5Yid5aeL5YyW5oiQ5YqfXFxcIik7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcXG4gICAgICAgIGxldCBpdGVtID0gYnVmaWxlbGlzdFtpXTtcXG4gICAgICAgIGxldCBjb250ZW50ID0gcmVxdWVzdChpdGVtLnBhdGgpO1xcbiAgICAgICAgRmlsZS5maWxlV3JpdGVBcHBlbmQoZW50aXJlUGF0aHRvLCBpdGVtLm5hbWUgKyBcXFwiXFxcXG7jgIDjgIBcXFwiICsgY29udGVudC5yZXBsYWNlKC8mbmJzcDsvZyxcXFwiXFxcIikuc3BsaXQoLyhcXFxcbnxcXFxccikrLykuZmlsdGVyKGl0ID0+IGl0LnRyaW0oKS5sZW5ndGggPiAxKS5tYXAoaXQ9Pml0LnRyaW0oKSkuam9pbihcXFwiXFxcXHLjgIDjgIBcXFwiKSArIFxcXCJcXFxcblxcXFxuXFxcIik7XFxuICAgIH1cXG4gICAgaWYgKGJvb2tJbmZvLmlzUmVwbGFjZSkge1xcbiAgICAgICAgbGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFwicmVwbGFjZVJ1bGUuanNvblxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgbGV0IGxlbiA9IHJ1bGVMaXN0Lmxlbmd0aDtcXG4gICAgICAgIGxldCByZXBsYWNlUGF0dGVybiA9IFtcXFwicmVwbGFjZVxcXCIsIFxcXCJyZXBsYWNlQWxsXFxcIl07XFxuICAgICAgICBsZXQgZmxhZyA9IEZpbGUuZmlsZVJ1bGUoZW50aXJlUGF0aHRvLCBlbnRpcmVQYXRoLCAoamF2YVN0cmluZykgPT4ge1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VSdWxlID0gcnVsZUxpc3RbaV07XFxuICAgICAgICAgICAgICAgIGlmICghYm9va0luZm8uc2VsZWN0ZWQuaW5jbHVkZXMocmVwbGFjZVJ1bGUuaWQpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgcmVwbGFjZSA9IHJlcGxhY2VQYXR0ZXJuWzAgKyByZXBsYWNlUnVsZS5pc1JlZ2V4XTtcXG4gICAgICAgICAgICAgICAgamF2YVN0cmluZyA9IGphdmFTdHJpbmdbcmVwbGFjZV0ocmVwbGFjZVJ1bGUucGF0dGVybiwgcmVwbGFjZVJ1bGUucmVwbGFjZW1lbnQpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gamF2YVN0cmluZy5nZXRCeXRlcygpO1xcbiAgICAgICAgfSk7XFxuICAgICAgICBpZiAoIWZsYWcpIHtcXG4gICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lkIjlubblpLHotKVcXFwiO1xcbiAgICAgICAgfVxcblxcbiAgICB9XFxuICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lkIjlubblrozmiJBcXFwiO1xcbn1cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5ZCI5bm25bCP6K+0XFxcIixcXG4gICAgdXJsOiAkKFxcXCLnoa7lrprlkIjlubY/XFxcXG7kvJropobnm5blt7LmnIlUWFRcXFwiKS5jb25maXJtKHR4dCwgTVlfUEFSQU1TKSxcXG4gICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFtcXFwi4piQ5YiG6aG1XFxcIiwgXFxcIuKYkeWIhumhtVxcXCJdW21vZGUyXSxcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChtb2RlMikgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcIi5tb2RlMlxcXCIsIG1vZGUyID09PSBcXFwiMFxcXCIgPyBcXFwiMVxcXCIgOiBcXFwiMFxcXCIpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCBtb2RlMiksXFxuICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBbXFxcIuKYkOWIhuautVxcXCIsIFxcXCLimJHliIbmrrVcXFwiXVtOdW1iZXIoYm9va0luZm8uaXNTZWdtZW50KV0sXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaXNTZWdtZW50LCBwYXRoKSA9PiB7XFxuICAgICAgICBjb25zdCBib29rSW5mbyA9IEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICBib29rSW5mby5pc1NlZ21lbnQgPSAhaXNTZWdtZW50O1xcbiAgICAgICAgd3JpdGVGaWxlKFxcXCJmaWxlOi8vXFxcIiArIHBhdGgrXFxcIi9ib29rSW5mby5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoYm9va0luZm8pKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0sIGJvb2tJbmZvLmlzU2VnbWVudCwgcGF0aCksXFxuICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5YeA5YyWXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL05vdmVsQ3VzdG9tLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCNcXFwiLFxcbiAgICBleHRyYTogTVlfUEFSQU1TLFxcbiAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWklumDqOafpeeci1xcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgocGF0aCkgPT4ge1xcbiAgICAgICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzXFxcIik7XFxuICAgICAgICBsZXQgZW50aXJlUGF0aCA9IHBhdGgucmVwbGFjZShDb25maWcubm92ZWxQYXRoLCBDb25maWcubm92ZWxGdWxsUGF0aCkgKyBcXFwiLnR4dFxcXCI7XFxuICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXCJmaWxlOi8vXFxcIiArIGVudGlyZVBhdGgpKSB7XFxuICAgICAgICAgICAgdG9hc3QoXFxcIuiwg+eUqOesrOS4ieaWueW6lOeUqOaJk+W8gOaWh+S7tlxcXCIpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwib3BlbkZpbGU6Ly9maWxlOi8vXFxcIiArIGVudGlyZVBhdGhcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acrOWcsOaaguaXoOWPr+S+m+WklumDqOaJk+W8gOeahHR4dOaWh+S7tu+8jOivt+WFiOWQiOW5tuWwj+ivtO+8gVxcXCJcXG4gICAgICAgIH1cXG4gICAgfSwgcGF0aCksXFxuICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5cXG5sZXQgbWhsaXN0ID0gRmlsZS5nZXRGaWxlUGF0aChwYXRoLCBcXFwiZmlsZVxcXCIsIFxcXCIudHh0XFxcIik7XFxubWhsaXN0LnNvcnQoKGEsIGIpID0+IHtcXG4gICAgYSA9IChhLm5hbWUubWF0Y2goL1xcXFxkKy8pIHx8IFtdKVswXSB8fCAwO1xcbiAgICBiID0gKGIubmFtZS5tYXRjaCgvXFxcXGQrLykgfHwgW10pWzBdIHx8IDA7XFxuICAgIHJldHVybiBhIC0gYjtcXG59KTtcXG5sZXQgY2hhcHRlckxpc3QgPSBbXTtcXG5sZXQgY2hhcHRlckNvdW50ID0gbWhsaXN0Lmxlbmd0aDtcXG5cXG5pZiAobW9kZTIgPT09IFxcXCIxXFxcIikge1xcbiAgICBsZXQgbWhsaXN0Q2h1bmsgPSBUb29sLmNodW5rKG1obGlzdCwgQ29uZmlnLnZpZXdQYWdlU2l6ZSk7XFxuICAgIGxldCB2aWV3UGFnZUNvdW50ID0gbWhsaXN0Q2h1bmsubGVuZ3RoO1xcbiAgICBsZXQgZGVmUGFnZSA9ICh2aWV3UGFnZUNvdW50IC0gMSA8IGJvb2tJbmZvLmZvb3QgPyAwIDogYm9va0luZm8uZm9vdCkgfHwgMDtcXG4gICAgbGV0IHBhZ2VOdW0gPSBOdW1iZXIoZ2V0TXlWYXIoXFxcIi5wYWdlTnVtXFxcIiwgXFxcIlxcXCIgKyBkZWZQYWdlKSk7XFxuICAgIGNoYXB0ZXJMaXN0ID0gbWhsaXN0Q2h1bmtbcGFnZU51bV0gfHwgW107XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLnq6DoioIgXFxcIi5iaWcoKSArIChcXFwi5pys6aG1OlxcXCIgKyBjaGFwdGVyTGlzdC5sZW5ndGggKyBcXFwiIOWFseaciTpcXFwiICsgY2hhcHRlckNvdW50ICsgXFxcIueroCDlvZPliY06XFxcIiArIChwYWdlTnVtICsgMSkgKyBcXFwiL1xcXCIgKyB2aWV3UGFnZUNvdW50KS5zbWFsbCgpLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpc1JldmVyc2UpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiLmlzUmV2ZXJzZVxcXCIsIGlzUmV2ZXJzZSA9PT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICB9LCBpc1JldmVyc2UpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIui3s+mbhlxcXCIsXFxuICAgICAgICB1cmw6ICQoY2hhcHRlckNvdW50LCBcXFwi6L6T5YWl6Lez6L2s56ug6IqCIDEtXFxcIiArIGNoYXB0ZXJDb3VudCkuaW5wdXQoKGNoYXB0ZXJDb3VudCwgcGFnZU51bSwgdmlld1BhZ2VTaXplLCBwYXRoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGlucHV0TnVtID0gTnVtYmVyKGlucHV0KTtcXG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGlucHV0TnVtKSB8fCBpbnB1dE51bSA8IDAgfHwgaW5wdXROdW0gPiBjaGFwdGVyQ291bnQpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+i+k+WFpeato+ehruiMg+WbtOWGheeahOaVsOWtl1xcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlucHV0TnVtID0gTWF0aC5mbG9vcigoaW5wdXROdW0gKyB2aWV3UGFnZVNpemUpIC8gdmlld1BhZ2VTaXplKSAtIDE7XFxuICAgICAgICAgICAgaWYgKHBhZ2VOdW0gPT09IGlucHV0TnVtKSByZXR1cm4gXFxcInRvYXN0Oi8v5q2j5Zyo5b2T5YmN6aG16Z2iXFxcIjtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiLnBhZ2VOdW1cXFwiLCBcXFwiXFxcIiArIGlucHV0TnVtKTtcXG4gICAgICAgICAgICBjb25zdCBib29rSW5mbyA9IEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgICAgYm9va0luZm8uZm9vdCA9IGlucHV0TnVtO1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFwiZmlsZTovL1xcXCIgKyBwYXRoLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIH0sIGNoYXB0ZXJDb3VudCwgcGFnZU51bSwgQ29uZmlnLnZpZXdQYWdlU2l6ZSwgcGF0aCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfNVxcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6Lez6aG1XFxcIixcXG4gICAgICAgIHVybDogJChwYWdlTnVtICsgMSwgXFxcIui3s+i9rOmhteaVsCAxLVxcXCIgKyB2aWV3UGFnZUNvdW50KS5pbnB1dCgodmlld1BhZ2VDb3VudCwgcGFnZU51bSwgcGF0aCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBpbnB1dE51bSA9IE51bWJlcihpbnB1dCkgLSAxO1xcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4oaW5wdXROdW0pIHx8IGlucHV0TnVtIDwgMCB8fCBpbnB1dE51bSA+IHZpZXdQYWdlQ291bnQgLSAxKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/or7fovpPlhaXmraPnoa7ojIPlm7TlhoXnmoTmlbDlrZdcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAocGFnZU51bSA9PT0gaW5wdXROdW0pIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjlvZPliY3pobXpnaJcXFwiO1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCIucGFnZU51bVxcXCIsIFxcXCJcXFwiICsgaW5wdXROdW0pO1xcbiAgICAgICAgICAgIGNvbnN0IGJvb2tJbmZvID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiKSB8fCBcXFwie31cXFwiKTtcXG4gICAgICAgICAgICBib29rSW5mby5mb290ID0gaW5wdXROdW07XFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIH0sIHZpZXdQYWdlQ291bnQsIHBhZ2VOdW0sIHBhdGgpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzVcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuS4iuS4gOmhtVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHBhZ2VOdW0sIHBhdGgpID0+IHtcXG4gICAgICAgICAgICBsZXQgaW5wdXROdW0gPSBwYWdlTnVtIC0gMTtcXG4gICAgICAgICAgICBpZiAoaW5wdXROdW0gPCAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lnu4/mmK/nrKzkuIDpobXkuoZcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiLnBhZ2VOdW1cXFwiLCBcXFwiXFxcIiArIGlucHV0TnVtKTtcXG4gICAgICAgICAgICBjb25zdCBib29rSW5mbyA9IEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgICAgYm9va0luZm8uZm9vdCA9IGlucHV0TnVtO1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoYm9va0luZm8pKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIHBhZ2VOdW0sIHBhdGgpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzVcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuS4i+S4gOmhtVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHZpZXdQYWdlQ291bnQsIHBhZ2VOdW0sIHBhdGgpID0+IHtcXG4gICAgICAgICAgICBsZXQgaW5wdXROdW0gPSBwYWdlTnVtICsgMTtcXG4gICAgICAgICAgICBpZiAoaW5wdXROdW0gPiB2aWV3UGFnZUNvdW50IC0gMSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey57uP5piv5pyA5ZCO5LiA6aG15LqGXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcIi5wYWdlTnVtXFxcIiwgXFxcIlxcXCIgKyBpbnB1dE51bSk7XFxuICAgICAgICAgICAgY29uc3QgYm9va0luZm8gPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIpIHx8IFxcXCJ7fVxcXCIpO1xcbiAgICAgICAgICAgIGJvb2tJbmZvLmZvb3QgPSBpbnB1dE51bTtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCB2aWV3UGFnZUNvdW50LCBwYWdlTnVtLCBwYXRoKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF81XFxcIlxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLmnKvpobVcXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCh2aWV3UGFnZUNvdW50LCBwYWdlTnVtLCBwYXRoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGlucHV0TnVtID0gdmlld1BhZ2VDb3VudCAtIDE7XFxuICAgICAgICAgICAgaWYgKHBhZ2VOdW0gPT09IGlucHV0TnVtIHx8IGlucHV0TnVtID09PSAtMSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey57uP5piv5pyA5ZCO5LiA6aG15LqGXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcIi5wYWdlTnVtXFxcIiwgXFxcIlxcXCIgKyBpbnB1dE51bSk7XFxuICAgICAgICAgICAgY29uc3QgYm9va0luZm8gPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIpIHx8IFxcXCJ7fVxcXCIpO1xcbiAgICAgICAgICAgIGJvb2tJbmZvLmZvb3QgPSBpbnB1dE51bTtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCB2aWV3UGFnZUNvdW50LCBwYWdlTnVtLCBwYXRoKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF81XFxcIlxcbiAgICB9KTtcXG59IGVsc2Uge1xcbiAgICBjaGFwdGVyTGlzdCA9IG1obGlzdDtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIueroOiKgiBcXFwiLmJpZygpICsgKFxcXCLlhbHmnIk6XFxcIiArIGNoYXB0ZXJDb3VudCArIFxcXCLnq6BcXFwiKS5zbWFsbCgpLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpc1JldmVyc2UpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiLmlzUmV2ZXJzZVxcXCIsIGlzUmV2ZXJzZSA9PT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICB9LCBpc1JldmVyc2UpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxuICAgIH0pO1xcbn1cXG5sZXQgYXJyYXkgPSBbXTtcXG5pZiAobW9kZSA9PT0gXFxcIjBcXFwiKSB7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY2hhcHRlckxpc3QpIHtcXG4gICAgICAgIGxldCBuYW1lID0gZ2V0VGl0bGUoaXRlbS5uYW1lKTtcXG4gICAgICAgIGFycmF5LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBuYW1lLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9Ob3ZlbE1haW5Cb2R5I2F1dG9QYWdlIyNyZWFkVGhlbWUjXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBwYXRoOiBpdGVtLnBhdGgsXFxuICAgICAgICAgICAgICAgIGRpclBhdGg6IHBhdGgsXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBuYW1lLFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgY29sX3R5cGU6IENvbmZpZy5kZWZfVmlld19TdHlsZVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59IGVsc2Uge1xcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNoYXB0ZXJMaXN0KSB7XFxuICAgICAgICBsZXQgbmFtZSA9IGdldFRpdGxlKGl0ZW0ubmFtZSk7XFxuICAgICAgICBhcnJheS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogbmFtZSxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIuehruiupOWIoOmZpFtcXFwiICsgbmFtZSArIFxcXCJd77yfXFxcIikuY29uZmlybSgocGF0aCkgPT4ge1xcbiAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgICAgICAgICBpZiAoRmlsZS5kZWxldGVGaWxlcyhwYXRoKSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTlpLHotKVcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSwgaXRlbS5wYXRoKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogQ29uZmlnLmRlZl9WaWV3X1N0eWxlXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5pZiAoaXNSZXZlcnNlID09PSBcXFwiMVxcXCIpIHtcXG4gICAgYXJyYXkucmV2ZXJzZSgpO1xcbn1cXG5sYXlvdXQucHVzaC5hcHBseShsYXlvdXQsIGFycmF5KTtcXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2LuWwj+ivtOato+aWh+mYheivu1wiLFwicGF0aFwiOlwiTm92ZWxNYWluQm9keVwiLFwicnVsZVwiOlwianM6XFxudmFyIGxheW91dCA9IFtdO1xcbmxldCBjb250ZW50ID0gcmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBNWV9QQVJBTVMucGF0aCk7XFxuLy9jb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9cXFxcbnxcXFxcci9nLCBcXFwiPGJyPlxcXCIpLnJlcGxhY2UoLygmbmJzcDspKy9nLFxcXCIgXFxcIik7XFxuY29uc3QgYm9va0luZm8gPSBPYmplY3QuYXNzaWduKHtcXG4gICAgc2VsZWN0ZWQ6IFtdLFxcbiAgICBpc1JlcGxhY2U6IGZhbHNlLFxcbiAgICBpc1NlZ21lbnQ6IHRydWUsXFxufSwgSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIiArIE1ZX1BBUkFNUy5kaXJQYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikgfHwgXFxcInt9XFxcIikpO1xcblxcbmlmIChib29rSW5mby5pc1JlcGxhY2UpIHtcXG4gICAgbGV0IGphdmFTdHJpbmcgPSBqYXZhLmxhbmcuU3RyaW5nKGNvbnRlbnQpO1xcbiAgICBsZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgIGxldCByZXBsYWNlUGF0dGVybiA9IFtcXFwicmVwbGFjZVxcXCIsIFxcXCJyZXBsYWNlQWxsXFxcIl07XFxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBydWxlTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xcbiAgICAgICAgbGV0IHJlcGxhY2VSdWxlID0gcnVsZUxpc3RbaV07XFxuICAgICAgICBpZiAoIWJvb2tJbmZvLnNlbGVjdGVkLmluY2x1ZGVzKHJlcGxhY2VSdWxlLmlkKSkge1xcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJlcGxhY2UgPSByZXBsYWNlUGF0dGVyblswICsgcmVwbGFjZVJ1bGUuaXNSZWdleF07XFxuICAgICAgICBqYXZhU3RyaW5nID0gamF2YVN0cmluZ1tyZXBsYWNlXShyZXBsYWNlUnVsZS5wYXR0ZXJuLCByZXBsYWNlUnVsZS5yZXBsYWNlbWVudCk7XFxuICAgIH1cXG4gICAgY29udGVudCA9IFN0cmluZyhqYXZhU3RyaW5nKTtcXG59XFxuaWYgKGJvb2tJbmZvLmlzU2VnbWVudCkge1xcbiAgICBjb250ZW50ID0gXFxcIuOAgOOAgFxcXCIgKyBjb250ZW50LnNwbGl0KC8oXFxcXG58XFxcXHIpKy8pLmZpbHRlcihpdCA9PiBpdC50cmltKCkubGVuZ3RoID4gMSkubWFwKGl0ID0+IGl0LnRyaW0oKSkuam9pbihcXFwiPGJyPuOAgOOAgFxcXCIpO1xcbn1cXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIixcXG4gICAgdGl0bGU6IChcXFwiPHN0cm9uZz5cXFwiICsgTVlfUEFSQU1TLnRpdGxlICsgXFxcIjwvc3Ryb25nPlxcXCIpLmJpZygpLFxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IGNvbnRlbnQsXFxuICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRleHRTaXplOiAxOCxcXG4gICAgICAgIGNsaWNrOiB0cnVlXFxuICAgIH1cXG59KTtcXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcInRleHRfMVwiLFwibmFtZVwiOlwiI3Yu5ZCI5bm2VFhUXCIsXCJwYXRoXCI6XCJOb3ZlbENvbGxlY3RlZC52aWV3XCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc1xcXCIpO1xcbmxldCBydWxlbERpciA9IEZpbGUuZ2V0RmlsZVBhdGgoQ29uZmlnLm5vdmVsRnVsbFBhdGgsIFxcXCJkaXJcXFwiKTtcXG5zZXRQYWdlVGl0bGUoXFxcIuWQiOW5tlRYVFxcXCIpO1xcbmxldCBsYXlvdXQgPSBbXTtcXG5cXG5mdW5jdGlvbiBvcGVyYXRpb24ocGF0aCkge1xcbiAgICBzd2l0Y2ggKGlucHV0KSB7XFxuICAgICAgICBjYXNlIFxcXCLliIbkuqtcXFwiOlxcbiAgICAgICAgICAgIHJldHVybiBcXFwic2hhcmU6Ly9cXFwiICsgcGF0aDtcXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIGNhc2UgXFxcIuWIoOmZpFxcXCI6XFxuICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgICAgICAgICBpZiAoRmlsZS5kZWxldGVGaWxlcyhwYXRoKSkge1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5aSx6LSlXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICBjYXNlIFxcXCLmtbfpmJTpooTop4hcXFwiOlxcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3R4dFBhcnNlci52aWV3XFxcIjtcXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIGNhc2UgXFxcIuaJk+W8gOaWueW8j1xcXCI6XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJvcGVuRmlsZTovL2ZpbGU6Ly9cXFwiICsgcGF0aDtcXG4gICAgICAgICAgICBicmVhaztcXG4gICAgfVxcbn1cXG5mb3IgKGxldCBydWxlUGF0aHMgb2YgcnVsZWxEaXIpIHtcXG4gICAgbGV0IG5vdmVscyA9IEZpbGUuZ2V0RmlsZVBhdGgocnVsZVBhdGhzLnBhdGgsIFxcXCJmaWxlXFxcIiwgXFxcIi50eHRcXFwiKTtcXG4gICAgZm9yIChsZXQgbm92ZWwgb2Ygbm92ZWxzKSB7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IG5vdmVsLm5hbWUsXFxuICAgICAgICAgICAgdXJsOiAkKFtcXFwi5YiG5LqrXFxcIiwgXFxcIuWIoOmZpFxcXCIsIFxcXCLmtbfpmJTpooTop4hcXFwiLCBcXFwi5omT5byA5pa55byPXFxcIl0sIDEpLnNlbGVjdChvcGVyYXRpb24sIG5vdmVsLnBhdGgpLFxcbiAgICAgICAgICAgIGRlc2M6IFxcXCLmnaXmupDvvJpcXFwiICsgcnVsZVBhdGhzLm5hbWUsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIHBhdGg6IG5vdmVsLnBhdGhcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5pZiAobGF5b3V0Lmxlbmd0aCA9PT0gMCkge1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogJzxoMSBzdHlsZT1cXFwidGV4dC1hbGlnbjogY2VudGVyO1xcXCI+5ZWl6YO95rKh5pyJ6IC2PC9oMT4nLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0pO1xcbn1cXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2LuabtOWkmuiuvue9rlwiLFwicGF0aFwiOlwiU2V0dGluZy9Nb3JlLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzXFxcIik7XFxuXFxuY29uc3Qgc2V0dGluZ1R5cGUgPSBNWV9QQVJBTVMuc2V0dGluZ1R5cGUgfHwgZ2V0UGFyYW0oXFxcInNldHRpbmdUeXBlXFxcIik7XFxuXFxubGV0IGxheW91dCA9IFtdO1xcbmxldCBpZCA9IFxcXCIjXFxcIiArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcbnN3aXRjaCAoc2V0dGluZ1R5cGUpIHtcXG4gICAgY2FzZSBcXFwiY2FjaGVcXFwiOlxcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXCLmuIXpmaTnvJPlrZh86K6+572uXFxcIik7XFxuICAgICAgICBjb25zdCBrbm93bkxpc3QgPSBuZXcgTWFwKFtcXG4gICAgICAgICAgICBbRmlsZS5nZXROYW1lKENvbmZpZy5ub3ZlbFBhdGgpLCBcXFwiI+euoeeQhuWZqCPlsI/or7TnvJPlrZjnm67lvZVb5LiN5bu66K6u5riF6ZmkXVxcXCJdLFxcbiAgICAgICAgICAgIFtGaWxlLmdldE5hbWUoQ29uZmlnLmNvbWljUGF0aCksIFxcXCIj566h55CG5ZmoI+a8q+eUu+e8k+WtmOebruW9lVvkuI3lu7rorq7muIXpmaRdXFxcIl0sXFxuICAgICAgICAgICAgW0ZpbGUuZ2V0TmFtZShDb25maWcuZXh0ZXJuYWxJbXBvcnRQYXRoKSwgXFxcIiPnrqHnkIblmagj5a+85YWl55qEVFhU55uu5b2VW+S4jeW7uuiurua4hemZpF1cXFwiXSxcXG4gICAgICAgICAgICBbRmlsZS5nZXROYW1lKENvbmZpZy5ub3ZlbEZ1bGxQYXRoKSwgXFxcIiPnrqHnkIblmagj5bCP6K+05ZCI5bm255uu5b2VW+WPr+S7pea4hemZpF1cXFwiXSxcXG4gICAgICAgICAgICBbXFxcImRy56ug6IqC57yT5a2YXFxcIiwgXFxcIumBk+mVv+aooeadv+S4tOaXtue8k+WtmFvlu7rorq7muIXpmaRdXFxcIl1cXG4gICAgICAgIF0pO1xcblxcbiAgICAgICAgbGV0IGNhY2hlRGlyID0gRmlsZS5nZXRGaWxlUGF0aChDb25maWcuaG9tZVBhdGgsIFxcXCJkaXJcXFwiKTtcXG5cXG4gICAgICAgIGZ1bmN0aW9uIGNsZWFuQ2FjaGUocGF0aCkge1xcbiAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmlsZXMocGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5riF6Zmk5a6M5oiQXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5riF6Zmk5aSx6LSlXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBmb3IgKGxldCBjYWNoZSBvZiBjYWNoZURpcikge1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGNhY2hlLm5hbWUsXFxuICAgICAgICAgICAgICAgIGRlc2M6IFxcXCLlpKflsI/vvJpcXFwiICsgRmlsZS5nZXRGaWxlU2l6ZShjYWNoZS5wYXRoKSArIFxcXCJcXFxcbuaPj+i/sO+8mlxcXCIgKyAoa25vd25MaXN0LmdldChjYWNoZS5uYW1lKSB8fCBcXFwi5pyq55+l55uu5b2VW+mjjumZqeacquefpV1cXFwiKSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIuehruiupOa4hemZpCBcXFwiICsgY2FjaGUubmFtZSArIFxcXCIgP1xcXCIpLmNvbmZpcm0oY2xlYW5DYWNoZSwgY2FjaGUucGF0aClcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuWFqOmDqOa4hemZpChcXFwiICsgRmlsZS5nZXRGaWxlU2l6ZShDb25maWcuaG9tZVBhdGgpICsgXFxcIilcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCLnoa7orqTmuIXpmaTlhajpg6jnvJPlrZjmlbDmja4/XFxcIikuY29uZmlybShjbGVhbkNhY2hlLCBDb25maWcuaG9tZVBhdGgpXFxuICAgICAgICB9KTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlIFxcXCJkZWZhdWx0UGljXFxcIjpcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFwi6buY6K6k5bCB6Z2ifOiuvue9rlxcXCIpO1xcbiAgICAgICAgaWYgKGdldE15VmFyKFxcXCI6ZGVmYXVsdFBpY0JhY2tcXFwiKSkge1xcbiAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICBjbGVhck15VmFyKFxcXCI6ZGVmYXVsdFBpY0JhY2tcXFwiKTtcXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGZ1bmN0aW9uIHNldERlZmF1bHRQaWModXJsKSB7XFxuICAgICAgICAgICAgbGV0IENvbmZpZyA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcImNvbmZpZy5qc29uXFxcIiwgMCkgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgICAgQ29uZmlnLmRlZl9QaWMgPSB1cmw7XFxuICAgICAgICAgICAgc2F2ZUZpbGUoXFxcImNvbmZpZy5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoQ29uZmlnKSwgMCk7XFxuICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHN0YXJ0ID0gMTtcXG4gICAgICAgIGlmICh0eXBlb2YoTVlfTkFNRSkgIT09IFxcXCJ1bmRlZmluZWRcXFwiICYmIE1ZX05BTUUgPT09IFxcXCLll4Xop4nmtY/op4jlmahcXFwiKSB7XFxuICAgICAgICAgICAgc3RhcnQgPSA0O1xcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWbvueJh2xhdGVcXFwiLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcIm1vdmllXzNcXFwiLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaG9tZV9sYXRlXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKHNldERlZmF1bHRQaWMsIFxcXCJoaWtlcjovL2ltYWdlcy9ob21lX2xhdGVcXFwiKVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IDQ7IGkrKykge1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLlm77niYdcXFwiICsgaSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJtb3ZpZV8zXFxcIixcXG4gICAgICAgICAgICAgICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2hvbWVfcGljXFxcIiArIGksXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShzZXREZWZhdWx0UGljLCBcXFwiaGlrZXI6Ly9pbWFnZXMvaG9tZV9waWNcXFwiICsgaSlcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuiHquWumuS5ieKelVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbiAgICAgICAgICAgIHVybDogJChbXFxcIuiHquWumuS5iXVybFxcXCIsIFxcXCLpgInmi6nmlofku7bot6/lvoRcXFwiXSkuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi6Ieq5a6a5LmJdXJsXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIlxcXCIsIFxcXCLovpPlhaXlm77niYfnmoTot6/lvoTmiJbogIXpk77mjqVcXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IENvbmZpZyA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcImNvbmZpZy5qc29uXFxcIiwgMCkgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnLmRlZl9QaWMgPSBpbnB1dDtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlRmlsZShcXFwiY29uZmlnLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShDb25maWcpLCAwKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXF1aXJlVXJsID0gXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVTZWxlY3QgPSAkLnJlcXVpcmUocmVxdWlyZVVybCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZVNlbGVjdC5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBDb25maWcgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJjb25maWcuanNvblxcXCIsIDApIHx8IFxcXCJ7fVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuZGVmX1BpYyA9IFxcXCJmaWxlOi8vXFxcIiArIFBBVEg7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVGaWxlKFxcXCJjb25maWcuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KENvbmZpZyksIDApO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiOmRlZmF1bHRQaWNCYWNrXFxcIiwgXFxcInRydWVcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZTogXFxcIi5qcGd8LmpwZWd8LmdpZnwucG5nfC5zdmd8LmJtcFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGlja1R5cGU6IFxcXCJjb25maXJtXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZTogXFxcInNlbGVjdFBhdGhDYWNoZTJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeVBhdGg6IHRydWVcXG4gICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgfSk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSBcXFwicmVwbGFjZVJ1bGVcXFwiOlxcbiAgICAgICAgaWYgKE1ZX1BBUkFNUy5pc1JlZnJlc2gpIHtcXG4gICAgICAgICAgICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKCkgPT4gcmVmcmVzaFBhZ2UoKSkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXCLmm7/mjaLop4TliJl86K6+572uXFxcIik7XFxuICAgICAgICBsZXQgcnVsZUxpc3QgPSBbXTtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgY29uZmlybSh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiAn6ZSZ6K+v5o+Q56S6JyxcXG4gICAgICAgICAgICAgICAgY29udGVudDogJ+abv+aNouaVsOaNruivu+WPluWksei0pe+8jOaYr+WQpuWIneWni+WMlu+8n1xcXFxu6K+l5pON5L2c5Lya5riF6Zmk5L2g55qE5pu/5o2i5pWw5o2uISEhJyxcXG4gICAgICAgICAgICAgICAgY29uZmlybTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICB0b2FzdChcXFwi5Yid5aeL5YyW5a6M5oiQXFxcIik7XFxuICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICBjYW5jZWw6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgLy90b2FzdChcXFwi5Y+W5raIXFxcIik7XFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgIH1cXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuaWsOW7uuabv+aNolxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2VkaXRSZXBsYWNlUnVsZS52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjP2lzTmV3PXRydWVcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLlr7zlh7rop4TliJlcXFwiLFxcbiAgICAgICAgICAgIHVybDogJChcXFwi56Gu6K6k5a+85Ye6XFxcIiArIHJ1bGVMaXN0Lmxlbmd0aCArIFxcXCLmnaHop4TliJnvvJ9cXFxcbih7aG9tZVB0YWh9L3JlcGxhY2VSdWxlLmpzb24pXFxcIikuY29uZmlybSgobnVtKSA9PiB7XFxuICAgICAgICAgICAgICAgIGNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc1xcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgc2F2ZVB0YSA9IENvbmZpZy5ob21lUGF0aCArIFxcXCIvcmVwbGFjZVJ1bGUuanNvblxcXCI7XFxuICAgICAgICAgICAgICAgIHdyaXRlRmlsZShzYXZlUHRhLCByZWFkRmlsZShcXFwicmVwbGFjZVJ1bGUuanNvblxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgICAgICAgICBsb2coXFxcIlxcXFxu6Lev5b6E77yaXFxcIiArIHNhdmVQdGEgKyBcXFwiXFxcXG7lr7zlh7rop4TliJkgXFxcIiArIG51bSArIFxcXCIg5p2hXFxcIik7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwic2hhcmU6Ly9cXFwiICsgc2F2ZVB0YTtcXG4gICAgICAgICAgICB9LCBydWxlTGlzdC5sZW5ndGgpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIlxcbiAgICAgICAgfSk7XFxuXFxuICAgICAgICBmdW5jdGlvbiBpbXBvcnRSdWxlKGlzYmFjaykge1xcbiAgICAgICAgICAgIGlucHV0ID0gdHlwZW9mIFBBVEggPT09IFxcXCJ1bmRlZmluZWRcXFwiID8gaW5wdXQgOiBQQVRIO1xcbiAgICAgICAgICAgIGlucHV0ID0gaW5wdXQuc3RhcnRzV2l0aChcXFwiZmlsZTovL1xcXCIpID8gaW5wdXQgOiBcXFwiZmlsZTovL1xcXCIgKyBpbnB1dFxcbiAgICAgICAgICAgIGxldCBydWxlVGV4dCA9IHJlcXVlc3QoaW5wdXQpO1xcbiAgICAgICAgICAgIGlmICghcnVsZVRleHQpIHJldHVybiBcXFwidG9hc3Q6Ly/ojrflj5bmlofku7bkuLrnqbpcXFwiO1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGxldCBuZXdSdWxlTGlzdCA9IEpTT04ucGFyc2UocnVsZVRleHQpO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCBuZXdDb3VudCA9IDAsXFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb3VudCA9IDA7XFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgaW4gbmV3UnVsZUxpc3QpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdSdWxlID0gbmV3UnVsZUxpc3RbaV07XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld1J1bGUuaGFzT3duUHJvcGVydHkoXFxcInJlcGxhY2VtZW50XFxcIikgfHwgIW5ld1J1bGUuaGFzT3duUHJvcGVydHkoXFxcInBhdHRlcm5cXFwiKSB8fCAhbmV3UnVsZS5oYXNPd25Qcm9wZXJ0eShcXFwibmFtZVxcXCIpIHx8IChuZXdSdWxlLnNjb3BlQ29udGVudCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiAhbmV3UnVsZS5zY29wZUNvbnRlbnQpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBsZXQgaWQgPSBuZXdSdWxlLmlkO1xcbiAgICAgICAgICAgICAgICAgICAgbmV3UnVsZS5pZCA9IGlkIHx8IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkSW5kZXggPSBydWxlTGlzdC5maW5kSW5kZXgocnVsZSA9PiBydWxlLmlkID09PSBpZCk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoaWRJbmRleCA+IC0xKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ291bnQrKztcXG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlTGlzdC5zcGxpY2UoaWRJbmRleCwgMSwgbmV3UnVsZSk7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvdW50Kys7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUxpc3QucHVzaChuZXdSdWxlKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBzYXZlRmlsZShcXFwicmVwbGFjZVJ1bGUuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KHJ1bGVMaXN0KSk7XFxuICAgICAgICAgICAgICAgIGlmIChpc2JhY2spIHtcXG4gICAgICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgbG9nKFxcXCJcXFxcbui3r+W+hO+8mlxcXCIgKyBpbnB1dCArIFxcXCJcXFxcbuaAu+inhOWImeaVsO+8mlxcXCIgKyBuZXdSdWxlTGlzdC5sZW5ndGggKyBcXFwiXFxcXG7mm7TmlrDop4TliJkgXFxcIiArIHVwZGF0ZUNvdW50ICsgXFxcIiDmnaFcXFxcdOaWsOWinuinhOWImSBcXFwiICsgbmV3Q291bnQgKyBcXFwiIOadoVxcXCIpO1xcbiAgICAgICAgICAgICAgICB0b2FzdChcXFwi5a+85YWl5oiQ5YqfXFxcIik7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgICAgICAgICAgaWYgKGlzYmFjaykgYmFjaygpO1xcbiAgICAgICAgICAgICAgICB0b2FzdChcXFwi5a+85YWl5aSx6LSlXFxcIik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5a+85YWl6KeE5YiZXFxcIixcXG4gICAgICAgICAgICB1cmw6ICQoW1xcXCLlpJbpg6jmlofku7ZcXFwiLCBcXFwi5YaF6YOo5paH5Lu2XFxcIl0sIDEsIFxcXCLop4TliJnlr7zlhaVcXFwiKS5zZWxlY3QoKGltcG9ydFJ1bGUpID0+IHtcXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi5aSW6YOo5paH5Lu2XFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJmaWxlU2VsZWN0Oi8vXFxcIiArICQudG9TdHJpbmcoaW1wb3J0UnVsZSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVxdWlyZVVybCA9IFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaWxlU2VsZWN0ID0gcmVxdWlyZShyZXF1aXJlVXJsKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlU2VsZWN0LmZpbGVTZWxlY3Rpb25Vcmkoe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKGltcG9ydFJ1bGUsIHRydWUpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVVcmw6IHJlcXVpcmVVcmwsXFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGU6IFxcXCIuanNvblxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGlja1R5cGU6IFxcXCJjb25maXJtXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnk6IFxcXCJzZWxlY3RQYXRoQ2FjaGVcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0sIGltcG9ydFJ1bGUpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcnVsZUxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcXG4gICAgICAgICAgICBsZXQgcmVwbGFjZVJ1bGUgPSBydWxlTGlzdFtpXTtcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiByZXBsYWNlUnVsZS5uYW1lLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBpZCArIFxcXCIuXFxcIiArIGksXFxuICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLliKDpmaRcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlkLCBpbmRleCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFwicmVwbGFjZVJ1bGUuanNvblxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGcgPSBydWxlTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xcblxcbiAgICAgICAgICAgICAgICAgICAgc2F2ZUZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShydWxlTGlzdCkpO1xcbiAgICAgICAgICAgICAgICAgICAgLy9kZWxldGVJdGVtQnlDbHMoaWQgKyBcXFwiLlxcXCIgKyBpbmRleCk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICB0b2FzdChcXFwi5Yig6Zmk5oiQ5YqfXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICB9LCBpZCwgaSksXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBjbHM6IGlkICsgXFxcIi5cXFwiICsgaVxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi57yW6L6RXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2VkaXRSZXBsYWNlUnVsZS52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjP2luZGV4PVxcXCIgKyBpLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBjbHM6IGlkICsgXFxcIi5cXFwiICsgaVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBpZCArIFxcXCIuXFxcIiArIGlcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgXFxcImNvbnRlbnRzXFxcIjpcXG4gICAgICAgIGxldCBmID0gcmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXCIpO1xcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXCLnm67lvZXorr7nva586K6+572uXFxcIik7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLpgInmi6nmlofku7blpLlcXFwiLFxcbiAgICAgICAgICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICAgICAgICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKGlkKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oaWQpLmV4dHJhO1xcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbShpZCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHRhcmdldCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgICAgICAgICAgfSwgaWQpLFxcbiAgICAgICAgICAgICAgICBpbml0aWFsUGF0aDogQ29uZmlnLmhvbWVQYXRoLFxcbiAgICAgICAgICAgICAgICByZXF1aXJlVXJsOiBcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXCIsXFxuICAgICAgICAgICAgICAgIHBhdHRlcm46IDFcXG4gICAgICAgICAgICB9KSksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICAgICAgZGVzYzogXFxcIuaUr+aMgWhpa2VyOi8vZmlsZXPot6/lvoQo6K+l5pON5L2c5LiN5Lya5Yid5aeL5YyW55uu5b2VKVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBDb25maWcuaG9tZVBhdGgsXFxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKChpZCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoaWQsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgfSwgaWQpLFxcbiAgICAgICAgICAgICAgICBpZDogaWRcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuehruiupFxcXCIsXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpZCkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgaW5wdXQgPSBnZXRNeVZhcihpZCwgZmluZEl0ZW0oaWQpLmV4dHJhLmRlZmF1bHRWYWx1ZSB8fCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgIGNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc1xcXCIpO1xcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aChcXFwiaGlrZXI6Ly9maWxlcy9cXFwiKSkgaW5wdXQgPSBnZXRQYXRoKGlucHV0KS5zbGljZSg3KTtcXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmVuZHNXaXRoKFxcXCIvXFxcIikpIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvXFxcXC8kLywgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLmhvbWVQYXRoID09IGlucHV0KSByZXR1cm4gXFxcInRvYXN0Oi8v5bey57uP5piv5b2T5YmN55uu5b2VXFxcIjtcXG4gICAgICAgICAgICAgICAgQ29uZmlnID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFwiY29uZmlnLmpzb25cXFwiLCAwKSB8fCBcXFwie31cXFwiKTtcXG4gICAgICAgICAgICAgICAgQ29uZmlnLmhvbWVQYXRoID0gaW5wdXQ7XFxuICAgICAgICAgICAgICAgIHNhdmVGaWxlKFxcXCJjb25maWcuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KENvbmZpZyksIDApO1xcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lkv53lrZhcXFwiO1xcbiAgICAgICAgICAgIH0sIGlkKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgfSk7XFxuXFxuICAgICAgICBicmVhaztcXG59XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjdi7nvJbovpHmm7/mjaLop4TliJlcIixcInBhdGhcIjpcImVkaXRSZXBsYWNlUnVsZS52aWV3XCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBpc05ldyA9IE1ZX1BBUkFNUy5pc05ldyB8fCBnZXRQYXJhbShcXFwiaXNOZXdcXFwiKTtcXG5jb25zdCBpbmRleCA9IE1ZX1BBUkFNUy5pbmRleCB8fCBOdW1iZXIoZ2V0UGFyYW0oXFxcImluZGV4XFxcIikpO1xcbmxldCBsYXlvdXQgPSBbXTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhck15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLm5hbWVcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5pc1JlZ2V4XFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUucGF0dGVyblxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLnJlcGxhY2VtZW50XFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuZmlyc3RcXFwiKTtcXG4gICAgLy9jbGVhck15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLnNjb3BlXFxcIik7XFxufSkpO1xcbmxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG5sZXQgaWQgPSBcXFwiI1xcXCIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcXG4vL2xldCByZXBsYWNlUnVsZSA9IGlzTmV3ID09IFxcXCJ0cnVlXFxcIj97fTpydWxlTGlzdFtpbmRleF07XFxuaWYgKGlzTmV3ID09IFxcXCJ0cnVlXFxcIikge1xcbiAgICByZXBsYWNlUnVsZSA9IHtcXG4gICAgICAgIGlkOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSxcXG4gICAgICAgIGlzUmVnZXg6IGZhbHNlLFxcbiAgICB9XFxufSBlbHNlIHtcXG4gICAgcmVwbGFjZVJ1bGUgPSBydWxlTGlzdFtpbmRleF07XFxufVxcbi8v6aaW5qyh5Yid5aeL5YyWXFxuaWYoZ2V0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuZmlyc3RcXFwiLFxcXCJcXFwiKT09XFxcIlxcXCIpe1xcbiAgICBwdXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5pc1JlZ2V4XFxcIiwgXFxcIlxcXCIgKyByZXBsYWNlUnVsZS5pc1JlZ2V4KTtcXG4gICAgcHV0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuZmlyc3RcXFwiLFxcXCIxXFxcIik7XFxufVxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmi7fotJ1cXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgbGV0IGF0dCA9IFtcXFwibmFtZVxcXCIsIFxcXCJpc1JlZ2V4XFxcIiwgXFxcInBhdHRlcm5cXFwiLCBcXFwicmVwbGFjZW1lbnRcXFwiXTtcXG4gICAgICAgIGxldCBqc29uID0ge307XFxuICAgICAgICBhdHQuZm9yRWFjaChrZXkgPT4ge1xcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGdldE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLlxcXCIgKyBrZXksIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBpZiAoa2V5ID09PSBcXFwiaXNSZWdleFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PT0gXFxcInRydWVcXFwiID8gdHJ1ZSA6IGZhbHNlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBqc29uW2tleV0gPSB2YWx1ZTtcXG4gICAgICAgIH0pO1xcbiAgICAgICAgY29weShKU09OLnN0cmluZ2lmeShqc29uKSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIueymOi0tFxcXCIsXFxuICAgIHVybDogJChcXFwie3tjbGlwYm9hcmR9fVxcXCIpLmlucHV0KCgpID0+IHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGlucHV0KTtcXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uKSB8fCBqc29uLnBhdHRlcm4gPT0gdW5kZWZpbmVkKSByZXR1cm47XFxuICAgICAgICAgICAgbGV0IGF0dCA9IFtcXFwibmFtZVxcXCIsIFxcXCJpc1JlZ2V4XFxcIiwgXFxcInBhdHRlcm5cXFwiLCBcXFwicmVwbGFjZW1lbnRcXFwiXTtcXG4gICAgICAgICAgICBhdHQuZm9yRWFjaChrZXkgPT4ge1xcbiAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5cXFwiICsga2V5LCBTdHJpbmcoanNvbltrZXldKSk7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgfVxcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuabv+aNouinhOWImeWQjeensFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5uYW1lXFxcIiwgcmVwbGFjZVJ1bGUubmFtZSksXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLm5hbWVcXFwiLGlucHV0KTsnXFxuICAgIH1cXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5pu/5o2i6KeE5YiZXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0OiAtMSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUucGF0dGVyblxcXCIsIHJlcGxhY2VSdWxlLnBhdHRlcm4pLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5wYXR0ZXJuXFxcIiwgaW5wdXQpOydcXG4gICAgfVxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmmK/lkKbkvb/nlKjmraPliJnooajovr7lvI/vvJpcXFwiICsgZ2V0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuaXNSZWdleFxcXCIpLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlkKSA9PiB7XFxuICAgICAgICBsZXQgaXNSZWdleCA9IGdldE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLmlzUmVnZXhcXFwiKSA9PT0gXFxcInRydWVcXFwiID8gZmFsc2UgOiB0cnVlO1xcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IGlkXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuaYr+WQpuS9v+eUqOato+WImeihqOi+vuW8j++8mlxcXCIgKyBpc1JlZ2V4XFxuICAgICAgICB9KTtcXG4gICAgICAgIHB1dE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLmlzUmVnZXhcXFwiLCBcXFwiXFxcIiArIGlzUmVnZXgpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgaWQpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogaWRcXG4gICAgfVxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLmm7/mjaLkuLpcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6IC0xLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5yZXBsYWNlbWVudFxcXCIsIHJlcGxhY2VSdWxlLnJlcGxhY2VtZW50KSxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUucmVwbGFjZW1lbnRcXFwiLGlucHV0KTsnXFxuICAgIH1cXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5L+d5a2YXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChyZXBsYWNlUnVsZSwgaXNOZXcsIGluZGV4KSA9PiB7XFxuICAgICAgICBsZXQgcGF0dGVybiA9IGdldE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLnBhdHRlcm5cXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAoIXBhdHRlcm4pIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pu/5o2i6KeE5YiZ5LiN6IO95Li656m6XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocmVwbGFjZVJ1bGUsIHtcXG4gICAgICAgICAgICBuYW1lOiBnZXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5uYW1lXFxcIiwgXFxcIlxcXCIpLFxcbiAgICAgICAgICAgIGlzUmVnZXg6IGdldE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLmlzUmVnZXhcXFwiKSA9PT0gXFxcInRydWVcXFwiID8gdHJ1ZSA6IGZhbHNlLFxcbiAgICAgICAgICAgIHBhdHRlcm46IHBhdHRlcm4sXFxuICAgICAgICAgICAgcmVwbGFjZW1lbnQ6IGdldE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLnJlcGxhY2VtZW50XFxcIiwgXFxcIlxcXCIpXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgIGlmIChpc05ldyA9PSBcXFwidHJ1ZVxcXCIpIHtcXG4gICAgICAgICAgICBydWxlTGlzdC5wdXNoKHJlcGxhY2VSdWxlKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcnVsZUxpc3Quc3BsaWNlKGluZGV4LCAxLCByZXBsYWNlUnVsZSk7XFxuICAgICAgICB9XFxuICAgICAgICBzYXZlRmlsZShcXFwicmVwbGFjZVJ1bGUuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KHJ1bGVMaXN0KSk7XFxuICAgICAgICBiYWNrKCk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+d5a2Y5oiQ5YqfXFxcIjtcXG4gICAgfSwgcmVwbGFjZVJ1bGUsIGlzTmV3LCBpbmRleCksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxufSk7XFxuXFxuLypcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5pu/5o2i6IyD5Zu0XFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0OiAtMSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXFxcIlxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLnNjb3BlXFxcIixpbnB1dCk7J1xcbiAgICB9XFxufSk7XFxuXFxuKi9cXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2LuWwj+ivtOS4quaAp+WMluWHgOWMllwiLFwicGF0aFwiOlwiTm92ZWxDdXN0b20udmlld1wiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLmm7/mjaLop4TliJl8XFxcIiArIE1ZX1BBUkFNUy5uYW1lKTtcXG5sZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIikgfHwgXFxcIltdXFxcIik7XFxubGV0IGlkID0gXFxcIiNcXFwiICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxuXFxuY29uc3QgYm9va0luZm8gPSBPYmplY3QuYXNzaWduKHtcXG4gICAgZm9vdDogMCxcXG4gICAgaXNSZXBsYWNlOiB0cnVlLFxcbiAgICBzZWxlY3RlZDogW11cXG59LCBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgTVlfUEFSQU1TLnBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiKSB8fCBcXFwie31cXFwiKSk7XFxuXFxubGV0IGxheW91dCA9IFtdO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFtcXFwi4piQ5YeA5YyWXFxcIiwgXFxcIuKYkeWHgOWMllxcXCJdWzAgKyBib29rSW5mby5pc1JlcGxhY2VdLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCRpZCwgcGF0aCkgPT4ge1xcblxcbiAgICAgICAgdmFyIGJvb2tJbmZvID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiKSB8fCBcXFwie31cXFwiKTtcXG4gICAgICAgIGxldCBpc1JlcGxhY2UgPSBib29rSW5mby5pc1JlcGxhY2U9PT11bmRlZmluZWQ/dHJ1ZTpib29rSW5mby5pc1JlcGxhY2U7XFxuICAgICAgICBib29rSW5mby5pc1JlcGxhY2UgPSAhaXNSZXBsYWNlO1xcbiAgICAgICAgd3JpdGVGaWxlKFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcbiAgICAgICAgdXBkYXRlSXRlbSgkaWQsIHtcXG4gICAgICAgICAgICB0aXRsZTogaXNSZXBsYWNlID8gXFxcIuKYkOWHgOWMllxcXCIgOiBcXFwi4piR5YeA5YyWXFxcIixcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgaWQgKyBcXFwiIy0xXFxcIiwgTVlfUEFSQU1TLnBhdGgpLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IGlkICsgXFxcIiMtMVxcXCJcXG4gICAgfSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIue8lui+keinhOWImVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nL01vcmUudmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMjbm9SZWZyZXNoIz9zZXR0aW5nVHlwZT1yZXBsYWNlUnVsZVxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG4gICAgZXh0cmE6e1xcbiAgICAgICAgaXNSZWZyZXNoOiB0cnVlXFxuICAgIH1cXG59KTtcXG5mb3IgKGxldCBpID0gMCwgbGVuID0gcnVsZUxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcXG4gICAgbGV0IHJlcGxhY2VSdWxlID0gcnVsZUxpc3RbaV07XFxuICAgIGxldCBpc1RydWUgPSBib29rSW5mby5zZWxlY3RlZC5pbmNsdWRlcyhyZXBsYWNlUnVsZS5pZCk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAoaXNUcnVlID8gXFxcIuKXj1xcXCIgOiBcXFwi4peLXFxcIikgKyByZXBsYWNlUnVsZS5uYW1lLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICB5OiAwLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpc1RydWU6IGlzVHJ1ZSxcXG4gICAgICAgICAgICBpZDogaWQgKyBpLFxcbiAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLlvIDlkK9cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgkaWQsIHJlcGxhY2VSdWxlLCBwYXRoKSA9PiB7XFxuICAgICAgICAgICAgaWYgKGZpbmRJdGVtKCRpZCkuZXh0cmEuaXNUcnVlKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7LlvIDlkK9cXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBjb25zdCBib29rSW5mbyA9IE9iamVjdC5hc3NpZ24oe1xcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogW11cXG4gICAgICAgICAgICB9LCBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIpIHx8IFxcXCJ7fVxcXCIpKTtcXG4gICAgICAgICAgICBib29rSW5mby5zZWxlY3RlZC5wdXNoKHJlcGxhY2VSdWxlLmlkKTtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKCRpZCwge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKXj1xcXCIgKyByZXBsYWNlUnVsZS5uYW1lLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVlOiB0cnVlLFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICRpZCxcXG4gICAgICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCBpZCArIGksIHJlcGxhY2VSdWxlLCBNWV9QQVJBTVMucGF0aCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5YWz6ZetXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoJGlkLCByZXBsYWNlUnVsZSwgcGF0aCkgPT4ge1xcbiAgICAgICAgICAgIGlmICghZmluZEl0ZW0oJGlkKS5leHRyYS5pc1RydWUpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suWFs+mXrVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGNvbnN0IGJvb2tJbmZvID0gT2JqZWN0LmFzc2lnbih7XFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBbXVxcbiAgICAgICAgICAgIH0sIEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikgfHwgXFxcInt9XFxcIikpO1xcbiAgICAgICAgICAgIGJvb2tJbmZvLnNlbGVjdGVkLnNwbGljZShib29rSW5mby5zZWxlY3RlZC5pbmRleE9mKHJlcGxhY2VSdWxlLmlkKSwgMSk7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSgkaWQsIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLil4tcXFwiICsgcmVwbGFjZVJ1bGUubmFtZSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlzVHJ1ZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgICAgICBpZDogJGlkLFxcbiAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIGlkICsgaSwgcmVwbGFjZVJ1bGUsIE1ZX1BBUkFNUy5wYXRoKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG59XFxuXFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjdi7lpJblr7zlsI/or7RcIixcInBhdGhcIjpcImV4dGVybmFsaW1wb3J0VHh0LnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmZ1bmN0aW9uIHR4dFZpZXcobGF5b3V0KSB7XFxuICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgIGNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc1xcXCIpO1xcbiAgICBsZXQgZmlsZXMgPSBGaWxlLmdldEZpbGVQYXRoKENvbmZpZy5leHRlcm5hbEltcG9ydFBhdGgpO1xcbiAgICBmaWxlcyA9IGZpbGVzLmZpbHRlcih2ID0+IC8oXFxcXC50eHR8XFxcXC5lcHViKSQvLnRlc3Qodi5uYW1lKSk7XFxuXFxuICAgIHNldFBhZ2VUaXRsZShcXFwi5bCP6K+05Lmm5p62XFxcIik7XFxuICAgIC8vbGV0IGxheW91dCA9IFtdO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB1cmw6ICdpbnB1dD9cXFwiaGlrZXI6Ly9wYWdlL3R4dFNlYXJjaC52aWV3I25vUmVmcmVzaCM/c2VhcmNoVGVybXM9XFxcIitlbmNvZGVVUklDb21wb25lbnQoaW5wdXQpOlxcXCJ0b2FzdDovL+ivt+i+k+WFpeWwj+ivtOWQjVxcXCInLFxcbiAgICAgICAgZGVzYzogXFxcIuaQnOe0olxcXCIsXFxuICAgICAgICB0aXRsZTogXFxcIvCflI1cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoXFxcInNlYXJjaEtleUJ5VHh0XFxcIiwgXFxcIlxcXCIpLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBcXFwicHV0TXlWYXIoJ3NlYXJjaEtleUJ5VHh0JyxpbnB1dClcXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWvvOWFpeWwj+ivtFxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxuICAgICAgICB1cmw6ICQoW1xcXCLns7vnu5/pgInmi6nlmahcXFwiLCBcXFwi5rW36ZiU6YCJ5oup5ZmoXFxcIl0sIDEsIFxcXCLpgInmi6nlmajnsbvlnotcXFwiKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gXFxcIuezu+e7n+mAieaLqeWZqFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJmaWxlU2VsZWN0Oi8vXFxcIiArICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEvKFxcXFwudHh0fC5lcHViKSQvaS50ZXN0KGlucHV0KSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLpgInmi6nkuobplJnor6/nmoTmlofku7bnsbvlnotcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaWxlTWF0Y2ggPSBpbnB1dC5tYXRjaCgvXFxcXC8oW15cXFxcL10qPykoXFxcXC50eHR8XFxcXC5lcHViKSQvaSk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgbm92ZWxOYW1lID0gZmlsZU1hdGNoWzFdLnJlcGxhY2UoXFxcIl9maWxlU2VsZWN0X1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3BhdGggPSBDb25maWcuZXh0ZXJuYWxJbXBvcnRQYXRoICsgbm92ZWxOYW1lICsgZmlsZU1hdGNoWzJdO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvcGF0aENhY2hlID0gQ29uZmlnLmNvbnRlbnRzQ2FjaGUgKyBub3ZlbE5hbWUgKyBmaWxlTWF0Y2hbMl07XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IGlucHV0LnJlcGxhY2UoXFxcImZpbGU6Ly9cXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXCJmaWxlOi8vXFxcIiArIHRvcGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLlr7zlhaXmj5DnpLpcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBcXFwi5bey5a2Y5ZyoW1xcXCIgKyBub3ZlbE5hbWUgKyBcXFwiXeaYr+WQpuimhueblj9cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtOiAkLnRvU3RyaW5nKChwYXRoLCB0b3BhdGgsIHRvcGF0aENhY2hlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5jb3B5RmlsZShwYXRoLCB0b3BhdGgsIHRydWUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVFeGlzdChcXFwiZmlsZTovL1xcXCIgKyB0b3BhdGhDYWNoZSkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLmRlbGV0ZUZpbGVzKHRvcGF0aENhY2hlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lr7zlhaXmiJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBwYXRoLCB0b3BhdGgsIHRvcGF0aENhY2hlKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBGaWxlLmNvcHlGaWxlKHBhdGgsIHRvcGF0aCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVFeGlzdChcXFwiZmlsZTovL1xcXCIgKyB0b3BhdGhDYWNoZSkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5kZWxldGVGaWxlcyh0b3BhdGhDYWNoZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2FzdChcXFwi5a+85YWl5oiQ5YqfXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBsZXQgcmVxdWlyZVVybCA9IFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcIjtcXG4gICAgICAgICAgICAgICAgbGV0IGZpbGVTZWxlY3QgPSAkLnJlcXVpcmUocmVxdWlyZVVybCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBmaWxlU2VsZWN0LmZpbGVTZWxlY3Rpb25Vcmkoe1xcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaWxlTWF0Y2ggPSBQQVRILm1hdGNoKC9cXFxcLyhbXlxcXFwvXSo/KShcXFxcLnR4dHxcXFxcLmVwdWIpJC9pKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm92ZWxOYW1lID0gZmlsZU1hdGNoWzFdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b3BhdGggPSBDb25maWcuZXh0ZXJuYWxJbXBvcnRQYXRoICsgbm92ZWxOYW1lICsgZmlsZU1hdGNoWzJdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b3BhdGhDYWNoZSA9IENvbmZpZy5jb250ZW50c0NhY2hlICsgbm92ZWxOYW1lICsgZmlsZU1hdGNoWzJdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gUEFUSDtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXCJmaWxlOi8vXFxcIiArIHRvcGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIuW3suWtmOWcqFtcXFwiICsgbm92ZWxOYW1lICsgXFxcIl3mmK/lkKbopobnm5Y/XFxcIikuY29uZmlybSgocGF0aCwgdG9wYXRoLCB0b3BhdGhDYWNoZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuY29weUZpbGUocGF0aCwgdG9wYXRoLCB0cnVlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlRXhpc3QoXFxcImZpbGU6Ly9cXFwiICsgdG9wYXRoQ2FjaGUpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5kZWxldGVGaWxlcyh0b3BhdGhDYWNoZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5a+85YWl5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcGF0aCwgdG9wYXRoLCB0b3BhdGhDYWNoZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5jb3B5RmlsZShwYXRoLCB0b3BhdGgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXCJmaWxlOi8vXFxcIiArIHRvcGF0aENhY2hlKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5kZWxldGVGaWxlcyh0b3BhdGhDYWNoZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5a+85YWl5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlOiBcXFwiLnR4dHwuZXB1YlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrVHlwZTogXFxcImNvbmZpcm1cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmU6IFxcXCJzZWxlY3RQYXRoQ2FjaGUxXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIG1lbW9yeVBhdGg6IHRydWVcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgbGV0IG9wdGlvbnMgPSBbXFxcIumYheivu1xcXCIsIFxcXCLliIbkuqtcXFwiLCBcXFwi5Yig6ZmkXFxcIiwgXFxcIuaJk+W8gOaWueW8j1xcXCJdO1xcblxcbiAgICBsZXQgcGF0dGVybiA9IGdldE15VmFyKFxcXCI6dHh0UGF0dGVyblxcXCIsIG9wdGlvbnNbMF0pO1xcbiAgICBsZXQgaWQgPSBEYXRlLm5vdygpICsgXFxcIjrmqKHlvI9cXFwiO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogcGF0dGVybixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIixcXG4gICAgICAgIHVybDogJChvcHRpb25zLCAxLCBcXFwi5pON5L2c5qih5byPXFxcIikuc2VsZWN0KChpZCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCI6dHh0UGF0dGVyblxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKGlkLCB7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBpbnB1dFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSwgaWQpLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogaWRcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5paH5Lu2566h55CGXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIixcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9GaWxlTWFuYWdlbWVudC52aWV3I25vUmVmcmVzaCMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP3R5cGU9ZXh0ZXJuYWxJbXBvcnRQYXRoXFxcIlxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG5cXG4gICAgZnVuY3Rpb24gb3BlcmF0aW9uKHBhdGgsIG5hbWUsIHR5cGUpIHtcXG4gICAgICAgIGxldCBwYXR0ZXJuID0gZ2V0TXlWYXIoXFxcIjp0eHRQYXR0ZXJuXFxcIiwgXFxcIumYheivu1xcXCIpO1xcbiAgICAgICAgc3dpdGNoIChwYXR0ZXJuKSB7XFxuICAgICAgICAgICAgY2FzZSBcXFwi5YiG5LqrXFxcIjpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJzaGFyZTovL1xcXCIgKyBwYXRoO1xcbiAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICBjYXNlIFxcXCLliKDpmaRcXFwiOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gJChcXFwi56Gu6K6k5Yig6ZmkW1xcXCIgKyBuYW1lICsgXFxcIl1cXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmlsZXMocGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiLmpzb25cXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLmRlbGV0ZUZpbGVzKHBhdGggKyBcXFwiLmpzb25cXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9yZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUl0ZW0ocGF0aClcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0sIHBhdGgpO1xcbiAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICBjYXNlIFxcXCLpmIXor7tcXFwiOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGU9PT1cXFwiLnR4dFxcXCI/XFxcImhpa2VyOi8vcGFnZS90eHRQYXJzZXIudmlld1xcXCI6XFxcImhpa2VyOi8vcGFnZS9lcHViUGFyc2VyLnZpZXcjYXV0b0NhY2hlI1xcXCIpK1xcXCI/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZTtcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgY2FzZSBcXFwi5omT5byA5pa55byPXFxcIjpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJvcGVuRmlsZTovL2ZpbGU6Ly9cXFwiICsgcGF0aDtcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgZm9yIChsZXQgbm92ZWwgb2YgZmlsZXMpIHtcXG4gICAgICAgIGxldCB0eXBlID0gbm92ZWwubmFtZS5zdWJzdHJpbmcobm92ZWwubmFtZS5sYXN0SW5kZXhPZihcXFwiLlxcXCIpKTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogbm92ZWwubmFtZSxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUob3BlcmF0aW9uLCBub3ZlbC5wYXRoLCBub3ZlbC5uYW1lLCB0eXBlKSxcXG4gICAgICAgICAgICBkZXNjOiBcXFwi5aSn5bCP77yaXFxcIiArIEZpbGUuZ2V0RmlsZVNpemUobm92ZWwucGF0aCkgKyBcXFwiXFxcXG7kv67mlLnml7bpl7TvvJpcXFwiICsgJC5kYXRlRm9ybWF0KG5vdmVsLmxhc3RNb2RpZmllZCwgXFxcInl5eXktTU0tZGQgSEg6bW06c3NcXFwiKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgcGF0aDogbm92ZWwucGF0aCxcXG4gICAgICAgICAgICAgICAgaXNDYWNoZTogdHJ1ZSxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IG5vdmVsLm5hbWUsXFxuICAgICAgICAgICAgICAgIGlkOiBub3ZlbC5wYXRoLFxcbiAgICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWIhuS6q1xcXCIsXFxuICAgICAgICAgICAgICAgICAgICBqczogSlNPTi5zdHJpbmdpZnkoXFxcInNoYXJlOi8vXFxcIiArIG5vdmVsLnBhdGgpXFxuICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi6ZiF6K+7XFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGpzOiBKU09OLnN0cmluZ2lmeSgodHlwZT09PVxcXCIudHh0XFxcIj9cXFwiaGlrZXI6Ly9wYWdlL3R4dFBhcnNlci52aWV3XFxcIjpcXFwiaGlrZXI6Ly9wYWdlL2VwdWJQYXJzZXIudmlldyNhdXRvQ2FjaGUjXFxcIikrXFxcIj9ydWxlPVxcXCIgKyBNWV9SVUxFLnRpdGxlKVxcbiAgICAgICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuaJk+W8gOaWueW8j1xcXCIsXFxuICAgICAgICAgICAgICAgICAgICBqczogSlNPTi5zdHJpbmdpZnkoXFxcIm9wZW5GaWxlOi8vZmlsZTovL1xcXCIgKyBub3ZlbC5wYXRoKVxcbiAgICAgICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWIoOmZpFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygocGF0aCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImxvbmdQcmVzcy5qc1xcXCIpLmRlbGV0ZUZpbGVGb3JUeHQocGF0aClcXG4gICAgICAgICAgICAgICAgICAgIH0sIG5vdmVsLnBhdGgpXFxuICAgICAgICAgICAgICAgIH1dXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi6K6+572uXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvU2V0dGluZy52aWV3I25vUmVmcmVzaCMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogTVlfUlVMRS52ZXJzaW9uXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzluK7liqnigJ3igJ1cXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9oZWxwLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/a2V5d29yZD10eHRcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICc8aDEgc3R5bGU9XFxcInRleHQtYWxpZ246IGNlbnRlcjtcXFwiPuWVpemDveayoeacieiAtjwvaDE+JyxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIHNldFJlc3VsdChsYXlvdXQpO1xcbn1cXG5cXG5pZiAoJC5pbXBvcnRQYXJhbSA9PT0gdW5kZWZpbmVkKSB7XFxuICAgICQuZXhwb3J0cyA9IHR4dFZpZXc7XFxufSBlbHNlIGlmICgkLmltcG9ydFBhcmFtID09PSBudWxsKSB7XFxuICAgIHNldFJlc3VsdCh0eHRWaWV3KFtdKSk7XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI3YuVFhU6Kej5p6Q5ZmoXCIsXCJwYXRoXCI6XCJ0eHRQYXJzZXIudmlld1wiLFwicnVsZVwiOlwianM6XFxuKGZ1bmN0aW9uKCkge1xcbiAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcIkNvbmZpZy5qc1xcXCIpO1xcbiAgICBsZXQgcmVncyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3JlZ3VsYXJDaGFwdGVyLmZcXFwiKTtcXG4gICAgbGV0IHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInBhdGhcXFwiKSB8fCBcXFwiXFxcIikgfHwgTVlfUEFSQU1TLnBhdGg7XFxuICAgIGxldCBjaGFyc3QgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcImNoYXJzdFxcXCIpIHx8IFxcXCJcXFwiKSB8fCBNWV9QQVJBTVMuY2hhcnN0IHx8IFxcXCJVVEYtOFxcXCI7XFxuICAgIGxldCBpc0NhY2hlID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJpc0NhY2hlXFxcIikgfHwgXFxcIlxcXCIpIHx8IE1ZX1BBUkFNUy5pc0NhY2hlO1xcbiAgICBpZiAoIXBhdGguc3RhcnRzV2l0aChcXFwiZmlsZTovL1xcXCIpKSB7XFxuICAgICAgICBwYXRoID0gXFxcImZpbGU6Ly9cXFwiICsgcGF0aDtcXG4gICAgfVxcbiAgICBpZihNWV9QQVJBTVMudGl0bGUpe1xcbiAgICAgICAgc2V0UGFnZVRpdGxlKE1ZX1BBUkFNUy50aXRsZSk7XFxuICAgIH1lbHNle1xcbiAgICAgICAgc2V0UGFnZVRpdGxlKCQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKS5nZXROYW1lKHBhdGgpKTtcXG4gICAgfVxcbiAgICBsZXQgbGF5b3V0ID0gW107XFxuICAgIGxldCBjaGFwdGVyTmFtZXMgPSBbXTtcXG4gICAgbGV0IGludGVydmFscyA9IFtdO1xcbiAgICBsZXQgaGFzUHJlZmFjZSA9IGZhbHNlO1xcbiAgICBsZXQgY2FjaGVQYXRoID0gcGF0aC5yZXBsYWNlKENvbmZpZy5leHRlcm5hbEltcG9ydFBhdGgsIENvbmZpZy5jb250ZW50c0NhY2hlKTtcXG4gICAgaWYgKGlzQ2FjaGUmJmZpbGVFeGlzdChjYWNoZVBhdGgpKSB7XFxuICAgICAgICB0cnkge1xcblxcbiAgICAgICAgICAgIGxldCBjID0gSlNPTi5wYXJzZShyZXF1ZXN0KGNhY2hlUGF0aCkpO1xcbiAgICAgICAgICAgIGNoYXB0ZXJOYW1lcyA9IGMuY2hhcHRlck5hbWVzO1xcbiAgICAgICAgICAgIGludGVydmFscyA9IGMuaW50ZXJ2YWxzO1xcbiAgICAgICAgICAgIGhhc1ByZWZhY2UgPSBjLmhhc1ByZWZhY2U7XFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIumHjeaWsOino+aekOebruW9lVxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgocGF0aCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlRmlsZShwYXRoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICB9LCBwYXRoK1xcXCIuanNvblxcXCIpLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6ZmFsc2VcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6XFxcImxpbmVfYmxhbmtcXFwiXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICAgICAgc2V0UmVzdWx0KFt7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdPHN0cm9uZz7nm67lvZXop6PmnpDlpLHotKUo6YeN5paw6Kej5p6QKTwvc3Ryb25nPlxcXCIuYmlnKCksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgocGF0aCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlRmlsZShwYXRoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICB9LCBwYXRoK1xcXCIuanNvblxcXCIpLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XSk7XFxuICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgfVxcblxcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuato+WcqOino+aekOebruW9lVxcXCIpO1xcbiAgICAgICAgbGV0IHR4dCA9IHJlcXVlc3QocGF0aCwge1xcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgLy9cXFwiY29udGVudC10eXBlXFxcIjogXFxcInRleHQvcGxhaW47IGNoYXJzdD1cXFwiICsgY2hhcnN0XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgICBsZXQgcGF0dGVybiA9IHJlZ3MuZ2V0VG9jUnVsZSh0eHQpO1xcbiAgICAgICAgaWYgKCFwYXR0ZXJuKSB7XFxuICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICBzZXRSZXN1bHQoW3tcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ08c3Ryb25nPuebruW9leino+aekOWksei0pTwvc3Ryb25nPlxcXCIuYmlnKCksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XSk7XFxuICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIodHh0KTtcXG4gICAgICAgIGxldCBwb2ludGVyID0gMDtcXG4gICAgICAgIHdoaWxlIChtYXRjaGVyLmZpbmQoKSkge1xcbiAgICAgICAgICAgIGxldCBzdGFydCA9IG1hdGNoZXIuc3RhcnQoKTtcXG4gICAgICAgICAgICBsZXQgZW5kID0gbWF0Y2hlci5lbmQoKTtcXG4gICAgICAgICAgICBsZXQgdCA9IG1hdGNoZXIuZ3JvdXAoKTtcXG4gICAgICAgICAgICBpZiAocG9pbnRlciA9PT0gMCAmJiBzdGFydCA+IDMwKSB7XFxuICAgICAgICAgICAgICAgIGhhc1ByZWZhY2UgPSB0cnVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBjaGFwdGVyTmFtZXMucHVzaCh0KTtcXG4gICAgICAgICAgICBpbnRlcnZhbHMucHVzaChbcG9pbnRlciwgc3RhcnRdKTtcXG4gICAgICAgICAgICBwb2ludGVyID0gZW5kO1xcbiAgICAgICAgfVxcbiAgICAgICAgaW50ZXJ2YWxzLnB1c2goW3BvaW50ZXIsIHR4dC5sZW5ndGhdKTtcXG4gICAgICAgIGlmIChpc0NhY2hlKSB7XFxuICAgICAgICAgICAgd3JpdGVGaWxlKGNhY2hlUGF0aCwgSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICBjaGFwdGVyTmFtZXM6IGNoYXB0ZXJOYW1lcyxcXG4gICAgICAgICAgICAgICAgaW50ZXJ2YWxzOiBpbnRlcnZhbHMsXFxuICAgICAgICAgICAgICAgIGhhc1ByZWZhY2U6IGhhc1ByZWZhY2VcXG4gICAgICAgICAgICB9KSk7XFxuICAgICAgICB9XFxuICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICB9XFxuXFxuXFxuICAgIGlmIChoYXNQcmVmYWNlKSB7XFxuICAgICAgICBsZXQgaW50ZXJ2YWwgPSBpbnRlcnZhbHNbMF07XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLluo/oqIBcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvVFhUVmlld2VyLnZpZXcjYXV0b1BhZ2UjI3JlYWRUaGVtZSNcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGNoYXB0ZXJOYW1lOiBcXFwi5bqP6KiAXFxcIixcXG4gICAgICAgICAgICAgICAgc3RhcnQ6IGludGVydmFsWzBdLFxcbiAgICAgICAgICAgICAgICBlbmQ6IGludGVydmFsWzFdLFxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLFxcbiAgICAgICAgICAgICAgICBjaGFyc3Q6IGNoYXJzdFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhcHRlck5hbWVzLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICBsZXQgbmFtZSA9IGNoYXB0ZXJOYW1lc1tpXTtcXG4gICAgICAgIGxldCBpbnRlcnZhbCA9IGludGVydmFsc1tpICsgMV07XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IG5hbWUsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9UWFRWaWV3ZXIudmlldyNhdXRvUGFnZSMjcmVhZFRoZW1lI1xcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgc3RhcnQ6IGludGVydmFsWzBdLFxcbiAgICAgICAgICAgICAgICBlbmQ6IGludGVydmFsWzFdLFxcbiAgICAgICAgICAgICAgICBjaGFwdGVyTmFtZTogbmFtZSxcXG4gICAgICAgICAgICAgICAgcGF0aDogcGF0aCxcXG4gICAgICAgICAgICAgICAgY2hhcnN0OiBjaGFyc3RcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBzZXRSZXN1bHQobGF5b3V0KTtcXG59KSgpXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjdi5UWFTmn6XnnIvlmahcIixcInBhdGhcIjpcIlRYVFZpZXdlci52aWV3XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgcGF0aCA9IE1ZX1BBUkFNUy5wYXRoO1xcbmxldCBjaGFyc3QgPSBNWV9QQVJBTVMuY2hhcnN0O1xcbmxldCB0eHQgPSByZXF1ZXN0KHBhdGgsIHtcXG4gICAgaGVhZGVyczoge1xcbiAgICAgICAvL1xcXCJjb250ZW50LXR5cGVcXFwiOiBcXFwidGV4dC9wbGFpbjsgY2hhcnN0PVxcXCIgKyBjaGFyc3RcXG4gICAgfVxcbn0pO1xcblxcbmxldCB0YXJnZXRUZXh0cyA9IHR4dC5zdWJzdHJpbmcoTVlfUEFSQU1TLnN0YXJ0LCBNWV9QQVJBTVMuZW5kKTtcXG5cXG5sZXQgY29udGVudCA9IHRhcmdldFRleHRzLnNwbGl0KC8oXFxcXG58XFxcXHIpKy8pLmZpbHRlcihpdCA9PiBpdC5sZW5ndGggPiAxKS5qb2luKFxcXCI8YnI+XFxcIik7XFxubGV0IGxheW91dCA9IFtdO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICB0aXRsZTogKFxcXCI8c3Ryb25nPlxcXCIgKyBNWV9QQVJBTVMuY2hhcHRlck5hbWUgKyBcXFwiPC9zdHJvbmc+XFxcIikuYmlnKCksXFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogY29udGVudCxcXG4gICAgY29sX3R5cGU6ICdyaWNoX3RleHQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGV4dFNpemU6IDE4LFxcbiAgICAgICAgY2xpY2s6IHRydWVcXG4gICAgfVxcbn0pO1xcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI2ou56ug6IqC5q2j5YiZXCIsXCJwYXRoXCI6XCJyZWd1bGFyQ2hhcHRlci5mXCIsXCJydWxlXCI6XCJqczpcXG5sZXQgcnVsZXMgPSBbe1xcbiAgICAgICAgXFxcImlkXFxcIjogLTEsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogdHJ1ZSxcXG4gICAgICAgIFxcXCJuYW1lXFxcIjogXFxcIuebruW9lSjljrvnqbrnmb0pXFxcIixcXG4gICAgICAgIFxcXCJydWxlXFxcIjogXFxcIig/PD1b44CAXFxcXFxcXFxzXSkoPzrluo/nq6B85qWU5a2QfOato+aWhyg/IeWujHznu5MpfOe7iOeroHzlkI7orrB85bC+5aOwfOeVquWklnznrKw/XFxcXFxcXFxzezAsNH1bXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXSs/XFxcXFxcXFxzezAsNH0oPzrnq6B86IqCKD8h6K++KXzljbd86ZuGKD8hW+WQiOWSjF0pKSkuezAsMzB9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCLnrKzkuIDnq6Ag5YGH6KOF56ys5LiA56ug5YmN6Z2i5pyJ56m655m95L2G5oiR5LiN6KaBXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiAwXFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIFxcXCJpZFxcXCI6IC0yLFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IHRydWUsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLnm67lvZVcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiXlsg44CAXFxcXFxcXFx0XXswLDR9KD865bqP56ugfOallOWtkHzmraPmlocoPyHlrox857uTKXznu4jnq6B85ZCO6K6wfOWwvuWjsHznlarlpJZ856ysP1xcXFxcXFxcc3swLDR9W1xcXFxcXFxcZOOAh+mbtuS4gOS6jOS4pOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+Wjuei0sOWPgeiChuS8jemZhuafkuaNjOeOluaLvuS9sOS7n10rP1xcXFxcXFxcc3swLDR9KD8656ugfOiKgig/Ieivvil85Y23fOmbhig/IVvlkIjlkoxdKXzpg6goPyFb5YiG6LWb5ri4XSl856+HKD8h5bygKSkpLnswLDMwfSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwi56ys5LiA56ugIOagh+WHhueahOeypOivreWwseaYr+i/meagt1xcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogMVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtMyxcXG4gICAgICAgIFxcXCJlbmFibGVcXFwiOiBmYWxzZSxcXG4gICAgICAgIFxcXCJuYW1lXFxcIjogXFxcIuebruW9lSjljLnphY3nroDku4spXFxcIixcXG4gICAgICAgIFxcXCJydWxlXFxcIjogXFxcIig/PD1b44CAXFxcXFxcXFxzXSkoPzooPzrlhoXlrrl85paH56ugKT/nroDku4t85paH5qGIfOWJjeiogHzluo/nq6B85qWU5a2QfOato+aWhyg/IeWujHznu5MpfOe7iOeroHzlkI7orrB85bC+5aOwfOeVquWklnznrKw/XFxcXFxcXFxzezAsNH1bXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXSs/XFxcXFxcXFxzezAsNH0oPzrnq6B86IqCKD8h6K++KXzljbd86ZuGKD8hW+WQiOWSjF0pfOmDqCg/IVvliIbotZvmuLhdKXzlm54oPyFb5ZCI5p2l5LqL5Y67XSl85Zy6KD8hW+WSjOWQiOavlOeUteaYr10pfOevhyg/IeW8oCkpKS57MCwzMH0kXFxcIixcXG4gICAgICAgIFxcXCJleGFtcGxlXFxcIjogXFxcIueugOS7iyDogIHlpKvor7jokZvmnZHlpKtcXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDJcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTQsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogZmFsc2UsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLnm67lvZUo5Y+k5YW444CB6L275bCP6K+05aSH55SoKVxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCJeWyDjgIBcXFxcXFxcXHRdezAsNH0oPzrluo/nq6B85qWU5a2QfOato+aWhyg/IeWujHznu5MpfOe7iOeroHzlkI7orrB85bC+5aOwfOeVquWklnznrKw/XFxcXFxcXFxzezAsNH1bXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXSs/XFxcXFxcXFxzezAsNH0oPzrnq6B86IqCKD8h6K++KXzljbd86ZuGKD8hW+WQiOWSjF0pfOmDqCg/IVvliIbotZvmuLhdKXzlm54oPyFb5ZCI5p2l5LqL5Y67XSl85Zy6KD8hW+WSjOWQiOavlOeUteaYr10pfOivnXznr4coPyHlvKApKSkuezAsMzB9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCLnrKzkuIDnq6Ag5q+U5LiK6Z2i5Y+q5aSa5LqG5Zue5ZKM6K+dXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiAzXFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIFxcXCJpZFxcXCI6IC01LFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IGZhbHNlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwi5pWw5a2XKOe6r+aVsOWtl+agh+mimClcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiKD88PVvjgIBcXFxcXFxcXHNdKVxcXFxcXFxcZCtcXFxcXFxcXC4/WyDjgIBcXFxcXFxcXHRdezAsNH0kXFxcIixcXG4gICAgICAgIFxcXCJleGFtcGxlXFxcIjogXFxcIjEyXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiA0XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIFxcXCJpZFxcXCI6IC02LFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IGZhbHNlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwi5aSn5YaZ5pWw5a2XKOe6r+aVsOWtl+agh+mimClcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiKD88PVvjgIBcXFxcXFxcXHNdKVvjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsMTJ9WyDjgIBcXFxcXFxcXHRdezAsNH0kXFxcIixcXG4gICAgICAgIFxcXCJleGFtcGxlXFxcIjogXFxcIuS4gOeZvuS4g+WNgVxcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogNFxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtNyxcXG4gICAgICAgIFxcXCJlbmFibGVcXFwiOiB0cnVlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwi5pWw5a2XIOWIhumalOespiDmoIfpopjlkI3np7BcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiXlsg44CAXFxcXFxcXFx0XXswLDR9XFxcXFxcXFxkezEsNX1bOu+8miwu77yMIOOAgV/igJRcXFxcXFxcXC1dLnsxLDMwfSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwiMeOAgei/meS4quWwseaYr+agh+mimFxcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogNVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtOCxcXG4gICAgICAgIFxcXCJlbmFibGVcXFwiOiB0cnVlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwi5aSn5YaZ5pWw5a2XIOWIhumalOespiDmoIfpopjlkI3np7BcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiXlsg44CAXFxcXFxcXFx0XXswLDR9KD865bqP56ugfOallOWtkHzmraPmlocoPyHlrox857uTKXznu4jnq6B85ZCO6K6wfOWwvuWjsHznlarlpJZ8W+OAh+mbtuS4gOS6jOS4pOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+Wjuei0sOWPgeiChuS8jemZhuafkuaNjOeOluaLvuS9sOS7n117MSw4fSlbIOOAgV/igJRcXFxcXFxcXC1dLnsxLDMwfSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwi5LiA44CB5Y+q5pyJ5YmN6Z2i55qE5pWw5a2X5pyJ5beu5YirXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiA2XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIFxcXCJpZFxcXCI6IC05LFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IHRydWUsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLmraPmlocg5qCH6aKYL+W6j+WPt1xcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCJeWyDjgIBcXFxcXFxcXHRdezAsNH3mraPmlodbIOOAgF17MSw0fS57MCwyMH0kXFxcIixcXG4gICAgICAgIFxcXCJleGFtcGxlXFxcIjogXFxcIuato+aWhyDmiJHlpbbluLjlsbHotbXlrZDpvplcXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDdcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTEwLFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IHRydWUsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCJDaGFwdGVyL1NlY3Rpb24vUGFydC9FcGlzb2RlIOW6j+WPtyDmoIfpophcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiXlsg44CAXFxcXFxcXFx0XXswLDR9KD86W0NjXWhhcHRlcnxbU3NdZWN0aW9ufFtQcF1hcnR877yw77yh77yy77y0fFtObl1bb09dXFxcXFxcXFwufFtFZV1waXNvZGV8KD865YaF5a65fOaWh+eroCk/566A5LuLfOaWh+ahiHzliY3oqIB85bqP56ugfOallOWtkHzmraPmlocoPyHlrox857uTKXznu4jnq6B85ZCO6K6wfOWwvuWjsHznlarlpJYpXFxcXFxcXFxzezAsNH1cXFxcXFxcXGR7MSw0fS57MCwzMH0kXFxcIixcXG4gICAgICAgIFxcXCJleGFtcGxlXFxcIjogXFxcIkNoYXB0ZXIgMSBNeUdyYW5kbWFJc05CXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiA4XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIFxcXCJpZFxcXCI6IC0xMSxcXG4gICAgICAgIFxcXCJlbmFibGVcXFwiOiBmYWxzZSxcXG4gICAgICAgIFxcXCJuYW1lXFxcIjogXFxcIkNoYXB0ZXIo5Y67566A5LuLKVxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCJeWyDjgIBcXFxcXFxcXHRdezAsNH0oPzpbQ2NdaGFwdGVyfFtTc11lY3Rpb258W1BwXWFydHzvvLDvvKHvvLLvvLR8W05uXVtPb11cXFxcXFxcXC58W0VlXXBpc29kZSlcXFxcXFxcXHN7MCw0fVxcXFxcXFxcZHsxLDR9LnswLDMwfSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwiQ2hhcHRlciAxIE15R3JhbmRtYUlzTkJcXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDlcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTEyLFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IHRydWUsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLnibnmrornrKblj7cg5bqP5Y+3IOagh+mimFxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCIoPzw9W1xcXFxcXFxcc+OAgF0pW+OAkOOAlOOAluOAjOOAjuOAiO+8u1xcXFxcXFxcW10oPzrnrKx8W0NjXWhhcHRlcilbXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXXsxLDEwfVvnq6DoioJdLnswLDIwfSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwi44CQ56ys5LiA56ugIOWQjumdoueahOespuWPt+WPr+S7peayoeaciVxcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogMTBcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTEzLFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IGZhbHNlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwi54m55q6K56ym5Y+3IOagh+mimCjmiJDlr7kpXFxcIixcXG4gICAgICAgIFxcXCJydWxlXFxcIjogXFxcIig/PD1bXFxcXFxcXFxz44CAXXswLDR9KSg/OltcXFxcXFxcXFvjgIjjgIzjgI7jgJbjgJTjgIrvvIjjgJBcXFxcXFxcXChdLnsxLDMwfVtcXFxcXFxcXCnjgJHvvInjgIvjgJXjgJfjgI/jgI3jgIlcXFxcXFxcXF1dP3woPzrlhoXlrrl85paH56ugKT/nroDku4t85paH5qGIfOWJjeiogHzluo/nq6B85qWU5a2QfOato+aWhyg/IeWujHznu5MpfOe7iOeroHzlkI7orrB85bC+5aOwfOeVquWklilbIOOAgF17MCw0fSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwi44CO5Yqg5Liq55u06KeS5byV5Y+35pu05LiT5Lia44CPXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiAxMVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtMTQsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogdHJ1ZSxcXG4gICAgICAgIFxcXCJuYW1lXFxcIjogXFxcIueJueauiuespuWPtyDmoIfpopgo5Y2V5LiqKVxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCIoPzw9W1xcXFxcXFxcc+OAgF17MCw0fSkoPzpb4piG4piF4pym4pynXS57MSwzMH18KD865YaF5a65fOaWh+eroCk/566A5LuLfOaWh+ahiHzliY3oqIB85bqP56ugfOallOWtkHzmraPmlocoPyHlrox857uTKXznu4jnq6B85ZCO6K6wfOWwvuWjsHznlarlpJYpWyDjgIBdezAsNH0kXFxcIixcXG4gICAgICAgIFxcXCJleGFtcGxlXFxcIjogXFxcIuKYhuOAgeaZi+axn+S9nOiAheacgOWWnOasoueahOagvOW8j1xcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogMTJcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTE1LFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IHRydWUsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLnq6Av5Y23IOW6j+WPtyDmoIfpophcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiXlsgXFxcXFxcXFx044CAXXswLDR9KD86KD865YaF5a65fOaWh+eroCk/566A5LuLfOaWh+ahiHzliY3oqIB85bqP56ugfOallOWtkHzmraPmlocoPyHlrox857uTKXznu4jnq6B85ZCO6K6wfOWwvuWjsHznlarlpJZ8W+WNt+eroF1bXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXXsxLDh9KVsg44CAXXswLDR9LnswLDMwfSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwi5Y235LqUIOW8gOa6kOebm+S4llxcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogMTNcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTE2LFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IGZhbHNlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwi6aG25qC85qCH6aKYXFxcIixcXG4gICAgICAgIFxcXCJydWxlXFxcIjogXFxcIl5cXFxcXFxcXFMuezEsMjB9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCLkuI3otoXov4cyMOS4quWtl+mhtuagvOWGmeeahOmDveaYr+agh+mimFxcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogMTRcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTE3LFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IGZhbHNlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwi5Y+M5qCH6aKYKOWJjeWQkSlcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiKD9tKSg/PD1bIFxcXFxcXFxcdOOAgF17MCw0fSnnrKxbXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXXsxLDh956ugLnswLDMwfSQoPz1bXFxcXFxcXFxz44CAXXswLDh956ysW1xcXFxcXFxcZOmbtuS4gOS6jOS4pOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+Wjuei0sOWPgeiChuS8jemZhuafkuaNjOeOluaLvuS9sOS7n117MSw4feeroClcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwi56ys5LiA56ugIOecn+ato+eahOagh+mimOW5tuWBh+ijheaNouihjOesrOS4gOeroCDov5nkuKrkuI3opoFcXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDE1XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIFxcXCJpZFxcXCI6IC0xOCxcXG4gICAgICAgIFxcXCJlbmFibGVcXFwiOiBmYWxzZSxcXG4gICAgICAgIFxcXCJuYW1lXFxcIjogXFxcIuWPjOagh+mimCjlkI7lkJEpXFxcIixcXG4gICAgICAgIFxcXCJydWxlXFxcIjogXFxcIig/bSkoPzw9WyBcXFxcXFxcXHTjgIBdezAsNH3nrKxbXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXXsxLDh956ugLnswLDMwfSRbXFxcXFxcXFxz44CAXXswLDh9KeesrFtcXFxcXFxcXGTpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsOH3nq6AuezAsMzB9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCLnrKzkuIDnq6Ag6L+Z5Liq5qCH6aKY5LiN6KaB5bm25YGH6KOF5o2i6KGM56ys5LiA56ug55yf5q2j55qE5qCH6aKYXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiAxNlxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtMTksXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogdHJ1ZSxcXG4gICAgICAgIFxcXCJuYW1lXFxcIjogXFxcIuS5puWQjSDmi6zlj7cg5bqP5Y+3XFxcIixcXG4gICAgICAgIFxcXCJydWxlXFxcIjogXFxcIl4uezEsMjB9WyjvvIhdW1xcXFxcXFxcZOOAh+mbtuS4gOS6jOS4pOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+Wjuei0sOWPgeiChuS8jemZhuafkuaNjOeOluaLvuS9sOS7n117MSw4fVsp77yJXVsg44CAXFxcXHRdezAsNH0kXFxcIixcXG4gICAgICAgIFxcXCJleGFtcGxlXFxcIjogXFxcIuagh+mimOWQjumdouaVsOWtl+acieaLrOWPtygxMilcXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDE3XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIFxcXCJpZFxcXCI6IC0yMCxcXG4gICAgICAgIFxcXCJlbmFibGVcXFwiOiB0cnVlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwi5Lmm5ZCNIOW6j+WPt1xcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCJeLnsxLDIwfVtcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsOH1bIOOAgFxcXFx0XXswLDR9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCLmoIfpopjlkI7pnaLmlbDlrZfmsqHmnInmi6zlj7cxMjRcXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDE4XFxuICAgIH1cXG5dO1xcbmxldCBNYXRjaGVyID0gamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7XFxubGV0IFBhdHRlcm4gPSBqYXZhLnV0aWwucmVnZXguUGF0dGVybjtcXG5cXG5mdW5jdGlvbiBnZXRUb2NSdWxlKGNvbnRlbnQpIHtcXG4gICAgbGV0IG1heENzID0gMTtcXG4gICAgbGV0IHRvY1BhdHRlcm4gPSBudWxsO1xcbiAgICBmb3IgKGxldCB0b2NSdWxlIG9mIHJ1bGVzKSB7XFxuICAgICAgICBpZiAoIXRvY1J1bGUuZW5hYmxlKSBjb250aW51ZTtcXG4gICAgICAgIGxldCBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKHRvY1J1bGUucnVsZSwgUGF0dGVybi5NVUxUSUxJTkUpO1xcbiAgICAgICAgbGV0IG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIoY29udGVudCk7XFxuICAgICAgICBsZXQgY3MgPSAwO1xcbiAgICAgICAgd2hpbGUgKG1hdGNoZXIuZmluZCgpKSB7XFxuICAgICAgICAgICAgY3MrKztcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChjcyA+PSBtYXhDcykge1xcbiAgICAgICAgICAgIG1heENzID0gY3M7XFxuICAgICAgICAgICAgdG9jUGF0dGVybiA9IHBhdHRlcm47XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgcmV0dXJuIHRvY1BhdHRlcm47XFxufVxcbiQuZXhwb3J0cy5nZXRUb2NSdWxlID0gZ2V0VG9jUnVsZTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiNWLuW4ruWKqVwiLFwicGF0aFwiOlwiaGVscC52aWV3XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgaGVscFRleHQgPSB7XFxuICAgIFxcXCJ0eHRcXFwiOiBgXFxuICAgICAgICA8aDEgaWQ9XFxcInR4dOaYr+S7gOS5iFxcXCI+VFhU5piv5LuA5LmIPzwvaDE+XFxuICAgICAgICA8cD48YSBocmVmPVxcXCJodHRwczovL2JhaWtlLmJhaWR1LmNvbS9pdGVtL3R4dC8xMjE3MzMwXFxcIj7miJHlt7Lnu4/luK7kvaDnmb7luqbkuoY8L2E+77yb566A5Y2V5p2l6K+05bCx5piv5LiA56eN5YKo5a2Y5bCP6K+055qE5paH5Lu2KOaJqeWxleWQjTp0eHQp44CCPC9wPlxcbiAgICAgICAgPGgxIGlkPVxcXCLlpoLkvZXnlKjor6XlsI/nqIvluo/pmIXor7t0eHTlsI/or7RcXFwiPuWmguS9leeUqOivpeWwj+eoi+W6j+mYheivu3R4dOWwj+ivtD88L2gxPlxcbiAgICAgICAgPHA+5Zyo5Li76aG16Z2iIOKXiVRYVCDnlYzpnaLkuIvvvIzngrnlh7vlr7zlhaVUWFTvvIzpgInmi6nnm67moIflsI/or7Tmlofku7YodHh05paH5Lu277yMPGVtPuivpeaTjeS9nOS4jeS8muWIoOmZpHR4dOaWh+S7tu+8jOiAjOaYr2NvcHnkuIDku73liLDlsI/nqIvluo/nmoTot6/lvoTkuIs8L2VtPinvvIzlr7zlhaXlkI7lho3lnKgg4peJVFhUIOeVjOmdouS4i+mAieaLqeaDs+imgemYheivu+eahOWwj+ivtOWNs+WPr+OAgjwvcD5cXG5cXG4gICAgYCxcXG4gICAgXFxcIm5vdmVsQ29taWNcXFwiOiBgXFxuICAgICAgICA8aDEgaWQ9XFxcIui/meS4quWwj+eoi+W6j+acieS7gOS5iOeUqO+8n1xcXCI+6L+Z5Liq5bCP56iL5bqP5pyJ5LuA5LmI55So77yfPC9oMT5cXG4gICAgICAgIDx1bD5cXG4gICAgICAgIDxsaT48dT7ku6PnoIHkuIrkuLrlhbbku5blsI/nqIvluo8o5ryr55S757G7L+Wwj+ivtOexuynmj5DkvpvkuIvovb3mjqXlj6PjgII8L3U+PC9saT5cXG4gICAgICAgIDxsaT48dT7mnKzkvZPlhYXlvZPpmIXor7vlmajvvIzlj6/ku6XmtY/op4jnlKjor6XlsI/nqIvluo/mj5DkvpvnmoTkuIvovb3mjqXlj6Mo5LiK6Z2iKe+8jOS4i+i9veeahOa8q+eUuy/lsI/or7TjgII8L3U+PC9saT5cXG4gICAgICAgIDxsaT48dT7mj5DkvptUWFTmoLzlvI/lsI/or7Tmlofku7bop6PmnpDlip/og73jgII8L3U+XFxuICAgICAgICA8aDEgaWQ9XFxcIuS4uuS7gOS5iOWIl+ihqOmHjOS7gOS5iOmDveayoeeUqFxcXCI+5Li65LuA5LmI5YiX6KGo6YeM5LuA5LmI6YO95rKh55SoPzwvaDE+XFxuICAgICAgICA8dT7liJ3mrKHkvb/nlKjvvIzmsqHmnInlvojmraPluLjlkKfjgILwn6SUPC91PlxcbiAgICAgICAgPGgxIGlkPVxcXCLor6XlpoLkvZXmt7vliqDmvKvnlLvmiJblsI/or7RcXFwiPuivpeWmguS9lea3u+WKoOa8q+eUuyjmiJblsI/or7QpPzwvaDE+XFxuICAgICAgICA8dT4g5Zyo5LiA5Liq5pyJ5LiL6L295Yqf6IO955qE5bCP56iL5bqPKOa8q+eUu+exuy/lsI/or7Tnsbsp5Lit5LiL6L295LiA5pys5ryr55S7L+Wwj+ivtO+8jOi/lOWbnuivpeinhOWImeWNs+WPr+a1j+iniOOAgjwvdT48L2xpPlxcbiAgICAgICAgPC91bD5cXG4gICAgYFxcbn07XFxuc2V0UGFnZVRpdGxlKFxcXCLluK7liqlcXFwiKTtcXG5sZXQga2V5d29yZCA9IGdldFBhcmFtKFxcXCJrZXl3b3JkXFxcIik7XFxubGV0IHRleHQ7XFxuaWYgKGtleXdvcmQgPT09IHVuZGVmaW5lZCB8fCAhKHRleHQgPSBoZWxwVGV4dFtrZXl3b3JkXSkpIHtcXG4gICAgc2V0UmVzdWx0KFt7XFxuICAgICAgICB0aXRsZTogJzxoMSBzdHlsZT1cXFwidGV4dC1hbGlnbjogY2VudGVyO1xcXCI+6LWE5paZ5LiN6KeB5ZKvPC9oMT4nLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH1dKTtcXG59IGVsc2Uge1xcbiAgICBzZXRSZXN1bHQoW3tcXG4gICAgICAgIHRpdGxlOiB0ZXh0LFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH1dKTtcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJ0ZXh0XzFcIixcIm5hbWVcIjpcIiN2LuWkluWvvOaQnOe0olwiLFwicGF0aFwiOlwidHh0U2VhcmNoLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzXFxcIik7XFxuXFxubGV0IHNlYXJjaFRlcm1zID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJzZWFyY2hUZXJtc1xcXCIpKTtcXG5zZXRQYWdlVGl0bGUoXFxcIuOAjFxcXCIgKyBzZWFyY2hUZXJtcyArIFxcXCLjgI3nmoTmkJzntKLnu5PmnpxcXFwiKTtcXG5sZXQgZGF0YSA9IEZpbGUuZ2V0RmlsZVBhdGgoQ29uZmlnLmV4dGVybmFsSW1wb3J0UGF0aCwgdW5kZWZpbmVkKTtcXG5kYXRhID0gZGF0YS5maWx0ZXIodiA9PiAvKFxcXFwudHh0fFxcXFwuZXB1YikkLy50ZXN0KHYubmFtZSkpO1xcblxcbmxldCB0ZXJtc0FyciA9IHNlYXJjaFRlcm1zLnNwbGl0KFxcXCJcXFwiKS5tYXAodCA9PiB0LnJlcGxhY2UoL1xcXFwqfFxcXFwufFxcXFw/fFxcXFwrfFxcXFwkfFxcXFxefFxcXFxbfFxcXFxdfFxcXFwofFxcXFwpfFxcXFx7fFxcXFx9fFxcXFx8fFxcXFwvfFxcXFxcXFxcL2csIGsgPT4gXFxcIlxcXFxcXFxcXFxcIiArIGspKTtcXG5sZXQgcmVnID0gbmV3IFJlZ0V4cCh0ZXJtc0Fyci5qb2luKFxcXCIuKlxcXCIpLCBcXFwiaVxcXCIpO1xcbmxldCBzZWFyY2hSZXN1bHQgPSBbXTtcXG5mb3IgKGxldCB0eHQgb2YgZGF0YSkge1xcbiAgICBpZiAocmVnLnRlc3QodHh0Lm5hbWUpKSB7XFxuICAgICAgICBsZXQgdHlwZSA9IHR4dC5uYW1lLnN1YnN0cmluZyh0eHQubmFtZS5sYXN0SW5kZXhPZihcXFwiLlxcXCIpKTtcXG4gICAgICAgIHNlYXJjaFJlc3VsdC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogdHh0Lm5hbWUsXFxuICAgICAgICAgICAgdXJsOiAodHlwZT09PVxcXCIudHh0XFxcIj9cXFwiaGlrZXI6Ly9wYWdlL3R4dFBhcnNlci52aWV3XFxcIjpcXFwiaGlrZXI6Ly9wYWdlL2VwdWJQYXJzZXIudmlldyNhdXRvQ2FjaGUjXFxcIikrXFxcIj9ydWxlPVxcXCIgKyBNWV9SVUxFLnRpdGxlLFxcbiAgICAgICAgICAgIGRlc2M6IHR4dC5wYXRoLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIHBhdGg6IHR4dC5wYXRoLFxcbiAgICAgICAgICAgICAgICBpc0NhY2hlOiB0cnVlLFxcbiAgICAgICAgICAgICAgICB0aXRsZTogdHh0Lm5hbWVcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5pZiAoc2VhcmNoUmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xcbiAgICBzZWFyY2hSZXN1bHQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImJpZ19iaWdfYmxhbmtfYmxvY2tcXFwiLFxcbiAgICB9LCB7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImJpZ19iaWdfYmxhbmtfYmxvY2tcXFwiLFxcbiAgICB9LCB7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImJpZ19iaWdfYmxhbmtfYmxvY2tcXFwiLFxcbiAgICB9LCB7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImJpZ19iaWdfYmxhbmtfYmxvY2tcXFwiLFxcbiAgICB9LCB7XFxuICAgICAgICB0aXRsZTogJzxoMiBzdHlsZT1cXFwidGV4dC1hbGlnbjogY2VudGVyO1xcXCI+8J+UjuayoeacieaJvuWIsOebuOWFs+S5puexjTwvaDI+JyxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICB9KTtcXG59XFxuc2V0UmVzdWx0KHNlYXJjaFJlc3VsdCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjZi7plb/mjIkv54K55Ye7XCIsXCJwYXRoXCI6XCJsb25nUHJlc3MuanNcIixcInJ1bGVcIjpcImpzOlxcbiQuZXhwb3J0cyA9IHtcXG4gICAgZGVsZXRlRmlsZUZvckJvb2socGF0aCkge1xcbiAgICAgICAgLy9yZXR1cm4gJChcXFwi5omA5pyJ55qEIOa8q+eUuy/lsI/or7Qg56ug6IqC5bCG6KKr5Yig6ZmkXFxcXG3noa7orqTliKDpmaTvvJ9cXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmlsZXMocGF0aCkpIHtcXG4gICAgICAgICAgICBkZWxldGVJdGVtKHBhdGgpXFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXCI7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTlpLHotKVcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgLy99LCBwYXRoKTtcXG4gICAgfSxcXG4gICAgZGVsZXRlRmlsZUZvclR4dChwYXRoKSB7XFxuICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmlsZXMocGF0aCkpIHtcXG4gICAgICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiLmpzb25cXFwiKSkge1xcbiAgICAgICAgICAgICAgICBGaWxlLmRlbGV0ZUZpbGVzKHBhdGggKyBcXFwiLmpzb25cXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgZGVsZXRlSXRlbShwYXRoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcIjtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXCI7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHNpbmdsZUVudGVyKHBhZ2VVcmwsIHBhdGgpIHtcXG4gICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICBsZXQgZGlycyA9IEZpbGUuZ2V0RmlsZVBhdGgocGF0aCwgXFxcImRpclxcXCIpO1xcbiAgICAgICAgaWYgKGRpcnMubGVuZ3RoID09PSAxKSB7XFxuICAgICAgICAgICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzXFxcIik7XFxuICAgICAgICAgICAgbGV0IGZpID0gZGlyc1swXS5wYXRoO1xcbiAgICAgICAgICAgIGlmIChDb25maWcuZGVmX2lzQ29taWNDb21wYXRpYmxlID09PSBcXFwiMFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgbGV0IGZpbGVsaXN0ID0gRmlsZS5nZXRGaWxlUGF0aChmaSk7XFxuICAgICAgICAgICAgICAgIGxldCBzaG9ydGVuID0gZmkucmVwbGFjZShnZXRQYXRoKFxcXCJoaWtlcjovL2ZpbGVzL1xcXCIpLnNsaWNlKDcpLCBcXFwiaGlrZXI6Ly9maWxlcy9cXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHBpY2xpc3QgPSBmaWxlbGlzdC5tYXAoKGl0ZW0sIGkpID0+IHNob3J0ZW4gKyBcXFwiL1xcXCIgKyAoaSArIDEpICsgXFxcIi5qcGdcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJwaWNzOi8vXFxcIiArIHBpY2xpc3Quam9pbihcXFwiJiZcXFwiKTtcXG5cXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9jb21pY0NvbXBhdGlibGUudmlldyNhdXRvUGFnZSMjcmVhZFRoZW1lIz9wYXRoPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoZmkpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIHBhZ2VVcmwgKyBcXFwiP3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGVcXG4gICAgICAgIH1cXG4gICAgfVxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiNmZy7kuIvovb3kuLvnqIvluo9cIixcInBhdGhcIjpcIm1haW5Eb3dubG9hZFwiLFwicnVsZVwiOlwiY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFwiKTtcXG5jb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXCIpO1xcblxcblxcbiQuZXhwb3J0cy5ub3ZlbCA9IGZ1bmN0aW9uIG5vdmVsKGl0ZW0sIGluZm8sIG9yZGVyLCBNWV9JRCwgaW50ZXJydXB0KSB7XFxuICAgIGxldCBtYWluUGF0aCA9IENvbmZpZy5ub3ZlbFBhdGggKyBcXFwiL1xcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcIi9cXFwiICsgVG9vbC50ZXh0U2hpZWxkKGluZm8uYm9va05hbWUpICsgXFxcIi9cXFwiO1xcbiAgICBsZXQgY2hhcHRlclBhdGggPSBtYWluUGF0aCArIG9yZGVyICsgXFxcIiRBJFxcXCIgKyBUb29sLnRleHRTaGllbGQoaXRlbS50aXRsZSkgKyBcXFwiLnR4dFxcXCI7XFxuICAgIGxldCBjb250ZW50ID0gXFxcIlxcXCI7XFxuICAgIGlmIChpbnRlcnJ1cHQgJiYgZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCJcXFwiKSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICByZXR1cm4gLTE7XFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBzZXRSZXN1bHQgPSBkYXRhID0+IHtcXG4gICAgICAgICAgICBjb250ZW50ID0gZGF0YVswXS50aXRsZXx8XFxcIlxcXCI7XFxuICAgICAgICAgICAgaWYoZGF0YS5sZW5ndGg+MSYmZGF0YVsxXS50aXRsZSYmZGF0YVsxXS50aXRsZS5sZW5ndGg+Y29udGVudC5sZW5ndGgpe1xcbiAgICAgICAgICAgICAgICBjb250ZW50PWRhdGFbMV0udGl0bGU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGdldFJlc0NvZGUgPSAoKSA9PiB7XFxuICAgICAgICAgICAgcmV0dXJuIGZldGNoKGl0ZW0udXJsKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBnZXRDb250ZW50ID0gbmV3IEZ1bmN0aW9uKFxcXCJpbnB1dFxcXCIsIFxcXCJ1cmxcXFwiLCBcXFwiaW5kZXhcXFwiLCBcXFwidGl0bGVcXFwiLCBcXFwic2V0UmVzdWx0XFxcIiwgXFxcImdldFJlc0NvZGVcXFwiLCBcXFwicmV0dXJuIFxcXCIgKyBpbmZvLnBhcnNlQ29kZSk7XFxuICAgICAgICBjb250ZW50ID0gZ2V0Q29udGVudChpdGVtLnVybCwgaXRlbS51cmwsIG9yZGVyLCBpdGVtLnRpdGxlLCBzZXRSZXN1bHQsIGdldFJlc0NvZGUpIHx8IGNvbnRlbnQgfHwgXFxcIlxcXCI7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGUubWVzc2FnZSA9IFxcXCI85bCP6K+05q2j5paH6Kej5p6Q6ZSZ6K+vPiBcXFwiICsgZS5tZXNzYWdlO1xcbiAgICAgICAgdGhyb3cgZTtcXG4gICAgfVxcbiAgICBpZiAoIWNvbnRlbnQpIHtcXG4gICAgICAgIHRvYXN0KFxcXCLlsI/or7TkuLrnqbpcXFwiKTtcXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwiPOWwj+ivtOato+aWh+ino+aekOmUmeivr++8muato+aWh+i/lOWbnuS4uuepuj5cXFwiKTtcXG4gICAgfVxcbiAgICBpZiAoaW5mby5ib29rVG9wUGljKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBib29rVG9wUGljID0gVG9vbC5oaWtlclBpYyhpbmZvLmJvb2tUb3BQaWMpO1xcbiAgICAgICAgICAgIFRvb2wucGljRG93bmxvYWQoYm9va1RvcFBpY1swXSwgbWFpblBhdGggKyBpbmZvLmJvb2tOYW1lICsgXFxcIi5qcGdcXFwiLCBib29rVG9wUGljWzFdLCBpbmZvLmRlY29kZSk7XFxuXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKFxcXCI85bCB6Z2i5LiL6L296ZSZ6K+vPiBcXFwiICsgZS5tZXNzYWdlKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBGaWxlLmZpbGVXcml0ZShjaGFwdGVyUGF0aCwgY29udGVudC5yZXBsYWNlKC88c2NyaXB0Pi4qPzxcXFxcL3NjcmlwdD4vZ21pLCBcXFwiXFxcIikudHJpbVJpZ2h0KCkpO1xcbiAgICAvL0ZpbGUucmVuYW1lRmlsZShjaGFwdGVyUGF0aCwgb3JkZXIgKyBcXFwiJEEkXFxcIiArIGl0ZW0udGl0bGUgKyBcXFwiLnR4dFxcXCIpO1xcbn1cXG5cXG4kLmV4cG9ydHMuY29taWMgPSBmdW5jdGlvbiBjb21pYyhpdGVtLCBpbmZvLCBvcmRlciwgTVlfSUQsIGludGVycnVwdCkge1xcbiAgICBsZXQgbWFpblBhdGggPSBDb25maWcuY29taWNQYXRoICsgXFxcIi9cXFwiICsgaW5mby5ydWxlTmFtZSArIFxcXCIvXFxcIiArIFRvb2wudGV4dFNoaWVsZChpbmZvLmJvb2tOYW1lKSArIFxcXCIvXFxcIjtcXG4gICAgbGV0IGNoYXB0ZXJQYXRoID0gbWFpblBhdGggKyBvcmRlciArIFxcXCIkQiRcXFwiICsgVG9vbC50ZXh0U2hpZWxkKGl0ZW0udGl0bGUpICsgXFxcIi9cXFwiO1xcbiAgICBsZXQgcGljTGlzdCA9IFtdO1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IGdldFBpY0xpc3QgPSBuZXcgRnVuY3Rpb24oXFxcImlucHV0XFxcIiwgXFxcInVybFxcXCIsIFxcXCJpbmRleFxcXCIsIFxcXCJ0aXRsZVxcXCIsIFxcXCJyZXR1cm5cXFwiICsgaW5mby5wYXJzZUNvZGUpO1xcbiAgICAgICAgcGljTGlzdCA9IGdldFBpY0xpc3QoaXRlbS51cmwsIGl0ZW0udXJsLCBvcmRlciwgaXRlbS50aXRsZSk7XFxuICAgICAgICBpZiAodHlwZW9mIHBpY0xpc3QgPT09IFxcXCJzdHJpbmdcXFwiKSB7XFxuICAgICAgICAgICAgcGljTGlzdCA9IHBpY0xpc3QucmVwbGFjZShcXFwicGljczovL1xcXCIsIFxcXCJcXFwiKS5zcGxpdChcXFwiJiZcXFwiKTtcXG4gICAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgZS5tZXNzYWdlID0gXFxcIjzmvKvnlLvlm77niYfop6PmnpDplJnor68+IFxcXCIgKyBlLm1lc3NhZ2U7XFxuICAgICAgICB0aHJvdyBlO1xcbiAgICB9XFxuICAgIHBpY0xpc3QgPSBwaWNMaXN0LmZpbHRlcihwID0+IHApO1xcbiAgICBjb25zdCBMID0gcGljTGlzdC5sZW5ndGg7XFxuICAgIGlmIChMID09PSAwKSB7XFxuICAgICAgICB0b2FzdChcXFwi5Zu+54mH6ZO+5o6l5Li656m6XFxcIik7XFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIjzmvKvnlLvlm77niYfop6PmnpDplJnor6/vvJrlm77niYfpk77mjqXov5Tlm57kuLrnqbo+XFxcIik7XFxuICAgIH1cXG4gICAgaWYgKGluZm8uYm9va1RvcFBpYykge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgYm9va1RvcFBpYyA9IFRvb2wuaGlrZXJQaWMoaW5mby5ib29rVG9wUGljKTtcXG4gICAgICAgICAgICBUb29sLnBpY0Rvd25sb2FkKGJvb2tUb3BQaWNbMF0sIG1haW5QYXRoICsgaW5mby5ib29rTmFtZSArIFxcXCIuanBnXFxcIiwgYm9va1RvcFBpY1sxXSwgaW5mby5kZWNvZGUpO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyhcXFwiPOWwgemdouS4i+i9vemUmeivrz4gXFxcIiArIGUubWVzc2FnZSk7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgbGV0IGVycm9yTnVtID0gMDtcXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBMOyBpKyspIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IHBpYyA9IFRvb2wuaGlrZXJQaWMocGljTGlzdFtpXSk7XFxuICAgICAgICAgICAgVG9vbC5waWNEb3dubG9hZChwaWNbMF0sIGNoYXB0ZXJQYXRoICsgKGkgKyAxKSArIFxcXCIuanBnXFxcIiwgcGljWzFdLCBpbmZvLmRlY29kZSk7XFxuICAgICAgICAgICAgaWYgKGludGVycnVwdCAmJiBnZXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIlxcXCIpID09PSBcXFwiMVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBlcnJvck51bSA9IDA7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgaWYgKGVycm9yTnVtIDwgMTApIHtcXG4gICAgICAgICAgICAgICAgaS0tO1xcbiAgICAgICAgICAgICAgICBlcnJvck51bSsrO1xcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcblxcbiAgICBGaWxlLnJlbmFtZUZpbGUoY2hhcHRlclBhdGgsIG9yZGVyICsgXFxcIiRBJFxcXCIgKyBUb29sLnRleHRTaGllbGQoaXRlbS50aXRsZSkpO1xcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2Lua8q+eUu+WFvOWuuVwiLFwicGF0aFwiOlwiY29taWNDb21wYXRpYmxlLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuc2V0UGFnZVRpdGxlKE1ZX1BBUkFNUy50aXRsZSk7XFxubGV0IHBhdGg9ZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJwYXRoXFxcIixNWV9QQVJBTVMucGF0aCkpO1xcbmxldCBmaWxlbGlzdCA9IEZpbGUuZ2V0RmlsZVBhdGgocGF0aCk7XFxubGV0IHBpY2xpc3QgPSBmaWxlbGlzdC5tYXAoKGl0ZW0sIGkpID0+ICh7XFxuICAgIGNvbF90eXBlOiBcXFwicGljXzFfZnVsbFxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICBwaWNfdXJsOiBwYXRoICsgXFxcIi9cXFwiICsgKGkgKyAxKSArIFxcXCIuanBnXFxcIlxcbn0pKTtcXG5cXG5zZXRSZXN1bHQocGljbGlzdCk7XFxuXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjdi7kuabmnrZcIixcInBhdGhcIjpcIkJvb2tyYWNrLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcIkZpbGUuanNcXFwiKTtcXG5jb25zdCByYW5rID0gJC5yZXF1aXJlKFxcXCJmaWxlUmFuay5qc1xcXCIpO1xcbmNvbnN0IFRvb2wgPSAkLnJlcXVpcmUoXFxcIlRvb2wuanNcXFwiKTtcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcIkNvbmZpZy5qc1xcXCIpO1xcblxcbihmdW5jdGlvbigpIHtcXG4gICAgbGV0IHR5cGUgPSBNWV9QQVJBTVMudHlwZSB8fCBnZXRQYXJhbShcXFwidHlwZVxcXCIsIFxcXCJcXFwiKSB8fCBcXFwiY29taWNcXFwiO1xcbiAgICBsZXQgcnVsZU5hbWUgPSBUb29sLnRleHRTaGllbGQoTVlfUEFSQU1TLnJ1bGVOYW1lIHx8IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwicnVsZU5hbWVcXFwiKSkpO1xcbiAgICBpZiAoIXJ1bGVOYW1lKSB7XFxuICAgICAgICB0b2FzdChcXFwi6K+35Lyg5YWl6KeE5YiZ5ZCNXFxcIik7XFxuICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgfVxcbiAgICBpZiAoIVtcXFwiY29taWNcXFwiLCBcXFwibm92ZWxcXFwiXS5pbmNsdWRlcyh0eXBlKSkge1xcbiAgICAgICAgdG9hc3QoXFxcIuivt+S8oOWFpeato+ehrueahHR5cGU6Y29taWMgbm92ZWxcXFwiKTtcXG4gICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICB9XFxuICAgIHNldFBhZ2VUaXRsZShydWxlTmFtZSArIFxcXCJ85pys5Zyw5Lmm5p62XFxcIik7XFxuICAgIGxldCBsYXlvdXQgPSBbXTtcXG4gICAgbGV0IHBhdGggPSBDb25maWdbdHlwZSArIFxcXCJQYXRoXFxcIl0gKyBydWxlTmFtZTtcXG4gICAgbGV0IGNvbF90eXBlID0gZ2V0SXRlbShcXFwiYm9va3JhY2s6Y29sX3R5cGVcXFwiLCBcXFwibW92aWVfM19tYXJxdWVlXFxcIik7XFxuICAgIGxldCByYW5rTWV0aG9kID0gZ2V0SXRlbShcXFwiYm9va3JhY2s6cmFua01ldGhvZFxcXCIsIFxcXCLns7vnu59cXFwiKTtcXG4gICAgbGV0IHJhbmtJc1JldmVyc2UgPSBnZXRJdGVtKFxcXCJib29rcmFjazpyYW5rSXNSZXZlcnNlXFxcIiwgXFxcIlxcXCIpO1xcblxcbiAgICBsZXQgY29sVHlwZXMgPSBbXFxcIm1vdmllXzFcXFwiLCBcXFwibW92aWVfMlxcXCIsIFxcXCJtb3ZpZV8zX21hcnF1ZWVcXFwiLCBcXFwibW92aWVfMV92ZXJ0aWNhbF9waWNcXFwiLCBcXFwicGljXzJcXFwiLCBcXFwicGljXzNcXFwiLCBcXFwicGljXzNfc3F1YXJlXFxcIiwgXFxcInBpY18yX2NhcmRcXFwiXTtcXG4gICAgXFxuICAgIGxldCByYW5rTWV0aG9kcyA9IFtcXFwi57O757ufXFxcIiwgXFxcIuWkp+Wwj1xcXCIsIFxcXCLlkI3np7BcXFwiLCBcXFwi5pe26Ze0XFxcIl07XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHVybDogJ1xcXCJoaWtlcjovL3NlYXJjaD9zPVxcXCIraW5wdXQnLFxcbiAgICAgICAgZGVzYzogXFxcIuaQnOS9oOaDs+imgeeahCNcXFwiICsgdHlwZSArIFxcXCIjLi4uLi4uXFxcIixcXG4gICAgICAgIHRpdGxlOiBcXFwi8J+UjVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgcnVsZXM6ICQudG9TdHJpbmcoKHJ1bGVOYW1lLCB0eXBlKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBhcnIxID0gW3tcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwidGl0bGVcXFwiOiBydWxlTmFtZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwic2VhcmNoX3VybFxcXCI6IFxcXCJoaWtlcjovL2VtcHR5P2lzQWxsPTEmc2VhcmNoVGVybXM9KiomdHlwZT1cXFwiICsgdHlwZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwic2VhcmNoRmluZFxcXCI6IFxcXCJqczokLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9TZWFyY2gudmlldz9ydWxlPScrTVlfUlVMRS5fdGl0bGUpO1xcXCJcXG4gICAgICAgICAgICAgICAgICAgIH1dO1xcbiAgICAgICAgICAgICAgICBcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFycjEpO1xcbiAgICAgICAgICAgIH0sIHJ1bGVOYW1lLCB0eXBlKSxcXG4gICAgICAgICAgICAvKmRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoJ3NlYXJjaEtleScsICcnKSxcXG4gICAgICAgICAgICBvbkNoYW5nZTogXFxcInB1dE15VmFyKCdzZWFyY2hLZXknLGlucHV0KVxcXCIqL1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG5cXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLwn6epXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiZmxleF9idXR0b25cXFwiLFxcbiAgICAgICAgdXJsOiAkKGNvbFR5cGVzLm1hcCh2PT52PT09Y29sX3R5cGU/XFxcIuKAnOKAnFxcXCIrditcXFwi4oCd4oCdXFxcIjp2KSkuc2VsZWN0KChuYW1lKSA9PiB7XFxuICAgICAgICAgICAgaWYoL+KAnOKAnC4qP+KAneKAnS8udGVzdChpbnB1dCkpIHJldHVybjtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJib29rcmFjazpjb2xfdHlwZVxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSlcXG4gICAgfSk7XFxuICAgIGZvciAobGV0IG5hbWUgb2YgcmFua01ldGhvZHMpIHtcXG4gICAgICAgIGxldCBhID0gcmFua01ldGhvZCA9PT0gbmFtZTtcXG4gICAgICAgIGxldCB0aXRsZWEgPSBhID8gXFxcIuKAmOKAmFxcXCIgKyBuYW1lICsgXFxcIuKAmeKAmVxcXCIgOiBuYW1lO1xcbiAgICAgICAgbGV0IHRpdGxlYiA9IFxcXCJcXFwiO1xcbiAgICAgICAgaWYgKGEpIHtcXG4gICAgICAgICAgICB0aXRsZWIgPSAhcmFua0lzUmV2ZXJzZSA/IFxcXCLihpNcXFwiIDogXFxcIuKGkVxcXCI7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHRpdGxlYiA9IFxcXCLihpVcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZWEgKyB0aXRsZWIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJmbGV4X2J1dHRvblxcXCIsXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChuYW1lKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCByYW5rTWV0aG9kID0gZ2V0SXRlbShcXFwiYm9va3JhY2s6cmFua01ldGhvZFxcXCIsIFxcXCLns7vnu59cXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHJhbmtJc1JldmVyc2UgPSBnZXRJdGVtKFxcXCJib29rcmFjazpyYW5rSXNSZXZlcnNlXFxcIiwgXFxcIlxcXCIpO1xcblxcbiAgICAgICAgICAgICAgICBpZiAocmFua01ldGhvZCA9PT0gbmFtZSkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmtJc1JldmVyc2UpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByYW5rSXNSZXZlcnNlID0gXFxcIlxcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmtJc1JldmVyc2UgPSBcXFwiMVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJib29rcmFjazpyYW5rSXNSZXZlcnNlXFxcIiwgcmFua0lzUmV2ZXJzZSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJib29rcmFjazpyYW5rSXNSZXZlcnNlXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwiYm9va3JhY2s6cmFua01ldGhvZFxcXCIsIG5hbWUpO1xcblxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICB9LCBuYW1lKVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgbGV0IHJhbmtNZXRob2RNYXAgPSB7XFxuICAgICAgICBcXFwi57O757ufXFxcIjogXFxcIlxcXCIsXFxuICAgICAgICBcXFwi5aSn5bCPXFxcIjogXFxcInNpemVcXFwiLFxcbiAgICAgICAgXFxcIuWQjeensFxcXCI6IFxcXCJuYW1lXFxcIixcXG4gICAgICAgIFxcXCLml7bpl7RcXFwiOiBcXFwidGltZVxcXCJcXG4gICAgfTtcXG4gICAgbGV0IGJvb2tMaXN0ID0gW107XFxuICAgIGxldCBsaXN0ID0gcmFuayhGaWxlLmdldEZpbGVzKHBhdGgsIFxcXCJkaXJcXFwiKSwgcmFua01ldGhvZE1hcFtyYW5rTWV0aG9kXSk7XFxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgYm9va0xpc3QucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIuWVpemDveayoeacieiAtlxcXCIuYmlnKCksXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG5cXG4gICAgfVxcbiAgICBsZXQgcGFnZVVybCA9IHR5cGUgPT09IFxcXCJub3ZlbFxcXCIgPyBcXFwiaGlrZXI6Ly9wYWdlL05vdmVsQnJvd3Nlci52aWV3XFxcIiA6IFxcXCJoaWtlcjovL3BhZ2UvQ29taWNCcm93c2VyLnZpZXdcXFwiO1xcbiAgICBmb3IgKGxldCBpdGVtIG9mIGxpc3QpIHtcXG4gICAgICAgIGxldCBwaWMgPSBmaWxlRXhpc3QoXFxcImZpbGU6Ly9cXFwiICsgaXRlbS5nZXRQYXRoKCkgKyBcXFwiL1xcXCIgKyBpdGVtLmdldE5hbWUoKSArIFxcXCIuanBnXFxcIikgPyBpdGVtLmdldFBhdGgoKSArIFxcXCIvXFxcIiArIGl0ZW0uZ2V0TmFtZSgpICsgXFxcIi5qcGdcXFwiIDogQ29uZmlnLmRlZl9QaWM7XFxuICAgICAgICBib29rTGlzdC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5nZXROYW1lKCksXFxuICAgICAgICAgICAgcGljX3VybDogcGljLFxcbiAgICAgICAgICAgIHVybDogdHlwZSA9PT0gXFxcIm5vdmVsXFxcIiA/cGFnZVVybCArIFxcXCI/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZTokKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwYWdlVXJsLCBwYXRoKT0+e1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJsb25nUHJlc3MuanNcXFwiKS5zaW5nbGVFbnRlcihwYWdlVXJsLCBwYXRoKTtcXG4gICAgICAgICAgICB9LCBwYWdlVXJsLCBpdGVtLnBhdGgpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOmNvbF90eXBlLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5Yig6ZmkXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwibG9uZ1ByZXNzLmpzXFxcIikuZGVsZXRlRmlsZUZvckJvb2socGF0aCk7XFxuICAgICAgICAgICAgICAgICAgICB9LCBpdGVtLmdldFBhdGgoKSlcXG4gICAgICAgICAgICAgICAgfV0sXFxuICAgICAgICAgICAgICAgIGlkOiBpdGVtLmdldFBhdGgoKSxcXG4gICAgICAgICAgICAgICAgcGF0aDogaXRlbS5nZXRQYXRoKCksXFxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0uZ2V0TmFtZSgpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgaWYgKHJhbmtJc1JldmVyc2UpIHtcXG4gICAgICAgIGJvb2tMaXN0LnJldmVyc2UoKTtcXG4gICAgfVxcblxcbiAgICBzZXRSZXN1bHQobGF5b3V0LmNvbmNhdChib29rTGlzdCkpO1xcbn0pKCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjZi7mlofku7bmjpLluo9cIixcInBhdGhcIjpcImZpbGVSYW5rLmpzXCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJGaWxlLmpzXFxcIik7XFxubGV0IGNobk51bUNoYXIgPSB7XFxuICAgIOmbtjogMCxcXG4gICAg5LiAOiAxLFxcbiAgICDkuow6IDIsXFxuICAgIOS4iTogMyxcXG4gICAg5ZubOiA0LFxcbiAgICDkupQ6IDUsXFxuICAgIOWFrTogNixcXG4gICAg5LiDOiA3LFxcbiAgICDlhas6IDgsXFxuICAgIOS5nTogOVxcbn07XFxuXFxubGV0IGNobk5hbWVWYWx1ZSA9IHtcXG4gICAg5Y2BOiB7XFxuICAgICAgICB2YWx1ZTogMTAsXFxuICAgICAgICBzZWNVbml0OiBmYWxzZVxcbiAgICB9LFxcbiAgICDnmb46IHtcXG4gICAgICAgIHZhbHVlOiAxMDAsXFxuICAgICAgICBzZWNVbml0OiBmYWxzZVxcbiAgICB9LFxcbiAgICDljYM6IHtcXG4gICAgICAgIHZhbHVlOiAxMDAwLFxcbiAgICAgICAgc2VjVW5pdDogZmFsc2VcXG4gICAgfSxcXG4gICAg5LiHOiB7XFxuICAgICAgICB2YWx1ZTogMTAwMDAsXFxuICAgICAgICBzZWNVbml0OiB0cnVlXFxuICAgIH0sXFxuICAgIOS6vzoge1xcbiAgICAgICAgdmFsdWU6IDEwMDAwMDAwMCxcXG4gICAgICAgIHNlY1VuaXQ6IHRydWVcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBDaGluZXNlVG9OdW1iZXIoY2huU3RyKSB7XFxuICAgIGxldCBydG4gPSAwO1xcbiAgICBsZXQgc2VjdGlvbiA9IDA7XFxuICAgIGxldCBudW1iZXIgPSAwO1xcbiAgICBsZXQgc2VjVW5pdCA9IGZhbHNlO1xcbiAgICBsZXQgc3RyID0gY2huU3RyLnNwbGl0KCcnKTtcXG5cXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgIGxldCBudW0gPSBjaG5OdW1DaGFyW3N0cltpXV07XFxuICAgICAgICBpZiAodHlwZW9mIG51bSAhPT0gJ3VuZGVmaW5lZCcpIHtcXG4gICAgICAgICAgICBudW1iZXIgPSBudW07XFxuICAgICAgICAgICAgaWYgKGkgPT09IHN0ci5sZW5ndGggLSAxKSB7XFxuICAgICAgICAgICAgICAgIHNlY3Rpb24gKz0gbnVtYmVyO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IHVuaXQgPSBjaG5OYW1lVmFsdWVbc3RyW2ldXS52YWx1ZTtcXG4gICAgICAgICAgICBzZWNVbml0ID0gY2huTmFtZVZhbHVlW3N0cltpXV0uc2VjVW5pdDtcXG4gICAgICAgICAgICBpZiAoc2VjVW5pdCkge1xcbiAgICAgICAgICAgICAgICBzZWN0aW9uID0gKHNlY3Rpb24gKyBudW1iZXIpICogdW5pdDtcXG4gICAgICAgICAgICAgICAgcnRuICs9IHNlY3Rpb247XFxuICAgICAgICAgICAgICAgIHNlY3Rpb24gPSAwO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHNlY3Rpb24gKz0gKG51bWJlciAqIHVuaXQpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBudW1iZXIgPSAwO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHJldHVybiBydG4gKyBzZWN0aW9uO1xcbn1cXG5cXG5mdW5jdGlvbiBuYW1lQ29tcGFyZShhLCBiKSB7XFxuICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKVxcbiAgICAgICAgcmV0dXJuIGEgPT0gbnVsbCA/IGIgPT0gbnVsbCA/IDAgOiAtMSA6IDE7XFxuXFxuICAgIGEgPSBhLnJlcGxhY2UoLyhb6Zu25LiA5LqM5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5Lq/XSkvZywgZnVuY3Rpb24obWF0Y2gsIHAxLCBwMiwgcDMsIG9mZnNldCwgc3RyaW5nKSB7XFxuICAgICAgICAvLyBwMSBpcyBub25kaWdpdHMsIHAyIGRpZ2l0cywgYW5kIHAzIG5vbi1hbHBoYW51bWVyaWNzXFxuICAgICAgICByZXR1cm4gdi5DaGluZXNlVG9OdW1iZXIocDEpO1xcbiAgICB9KVxcbiAgICBiID0gYi5yZXBsYWNlKC8oW+mbtuS4gOS6jOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+S6v10pL2csIGZ1bmN0aW9uKG1hdGNoLCBwMSwgcDIsIHAzLCBvZmZzZXQsIHN0cmluZykge1xcbiAgICAgICAgLy8gcDEgaXMgbm9uZGlnaXRzLCBwMiBkaWdpdHMsIGFuZCBwMyBub24tYWxwaGFudW1lcmljc1xcbiAgICAgICAgcmV0dXJuIHYuQ2hpbmVzZVRvTnVtYmVyKHAxKTtcXG4gICAgfSlcXG5cXG4gICAgbGV0IE5VTUJFUlMgPSBqYXZhLnV0aWwucmVnZXguUGF0dGVybi5jb21waWxlKFxcXCIoPzw9XFxcXFxcXFxEKSg/PVxcXFxcXFxcZCl8KD88PVxcXFxcXFxcZCkoPz1cXFxcXFxcXEQpXFxcIik7XFxuICAgIGxldCBzcGxpdDEgPSBOVU1CRVJTLnNwbGl0KG5ldyBqYXZhLmxhbmcuU3RyaW5nKGEpKTtcXG4gICAgbGV0IHNwbGl0MiA9IE5VTUJFUlMuc3BsaXQobmV3IGphdmEubGFuZy5TdHJpbmcoYikpO1xcblxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKHNwbGl0MS5sZW5ndGgsIHNwbGl0Mi5sZW5ndGgpOyBpKyspIHtcXG4gICAgICAgIGxldCBjMSA9IHNwbGl0MVtpXS5jaGFyQ29kZUF0KDApO1xcbiAgICAgICAgbGV0IGMyID0gc3BsaXQyW2ldLmNoYXJDb2RlQXQoMCk7XFxuICAgICAgICBsZXQgY21wID0gMDtcXG4gICAgICAgIGxldCB6ZXJvQ2hhckNvZGUgPSAnMCcuY2hhckNvZGVBdCgwKTtcXG4gICAgICAgIGxldCBuaW5lQ2hhckNvZGUgPSAnOScuY2hhckNvZGVBdCgwKTtcXG5cXG4gICAgICAgIGlmIChjMSA+PSB6ZXJvQ2hhckNvZGUgJiYgYzEgPD0gbmluZUNoYXJDb2RlICYmIGMyID49IHplcm9DaGFyQ29kZSAmJiBjMiA8PSBuaW5lQ2hhckNvZGUpIHtcXG4gICAgICAgICAgICBjbXAgPSBuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoc3BsaXQxW2ldKS5jb21wYXJlVG8obmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKHNwbGl0MltpXSkpO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgaWYgKGNtcCA9PT0gMCkge1xcbiAgICAgICAgICAgIGxldCByZWdleCA9IC9bYS16QS1aMC05XS9cXG4gICAgICAgICAgICBsZXQgczEgPSBTdHJpbmcoc3BsaXQxW2ldKVxcbiAgICAgICAgICAgIGxldCBzMiA9IFN0cmluZyhzcGxpdDJbaV0pXFxuICAgICAgICAgICAgaWYgKHJlZ2V4LnRlc3QoczEpIHx8IHJlZ2V4LnRlc3QoczIpKSB7XFxuICAgICAgICAgICAgICAgIGNtcCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nKHNwbGl0MVtpXSkuY29tcGFyZVRvKG5ldyBqYXZhLmxhbmcuU3RyaW5nKHNwbGl0MltpXSkpO1xcbiAgICAgICAgICAgICAgICAvLyBjbXAgPSBzMS5sb2NhbGVDb21wYXJlKHMyLCAnZW4nKVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGNtcCA9IHMxLmxvY2FsZUNvbXBhcmUoczIsICd6aCcpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcblxcbiAgICAgICAgaWYgKGNtcCAhPT0gMCkge1xcbiAgICAgICAgICAgIHJldHVybiBjbXA7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgbGV0IGxlbmd0aENtcCA9IHNwbGl0MS5sZW5ndGggLSBzcGxpdDIubGVuZ3RoO1xcbiAgICAvLyBpZiAobGVuZ3RoQ21wICE9PSAwKSBsZW5ndGhDbXAgPSBsZW5ndGhDbXAgPiAwID8gLTEgOiAxO1xcbiAgICByZXR1cm4gbGVuZ3RoQ21wO1xcbn1cXG5cXG5mdW5jdGlvbiByYW5rKGxpc3QsIG0pIHtcXG4gICAgc3dpdGNoIChtKSB7XFxuICAgICAgICBjYXNlIFxcXCJ0eXBlXFxcIjpcXG4gICAgICAgICAgICByZXR1cm4gbGlzdDtcXG4gICAgICAgIGNhc2UgXFxcIm5hbWVcXFwiOlxcbiAgICAgICAgICAgIHJldHVybiBsaXN0LnNvcnQoKGEsIGIpID0+IG5hbWVDb21wYXJlKFN0cmluZyhhLmdldE5hbWUoKSksIFN0cmluZyhiLmdldE5hbWUoKSkpKTtcXG4gICAgICAgIGNhc2UgXFxcInNpemVcXFwiOlxcbiAgICAgICAgICAgIHJldHVybiBsaXN0LnNvcnQoKGEsIGIpID0+IEZpbGUuZ2V0VG90YWxTaXplT2ZGaWxlc0luRGlyKGEpIC0gRmlsZS5nZXRUb3RhbFNpemVPZkZpbGVzSW5EaXIoYikpO1xcbiAgICAgICAgY2FzZSBcXFwidGltZVxcXCI6XFxuICAgICAgICAgICAgcmV0dXJuIGxpc3Quc29ydCgoYSwgYikgPT4gYS5sYXN0TW9kaWZpZWQoKSAtIGIubGFzdE1vZGlmaWVkKCkpO1xcbiAgICAgICAgZGVmYXVsdDpcXG4gICAgICAgICAgICByZXR1cm4gbGlzdDtcXG4gICAgfVxcblxcbn1cXG4kLmV4cG9ydHM9cmFuaztcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2LmVwdWLop6PmnpDlmahcIixcInBhdGhcIjpcImVwdWJQYXJzZXIudmlld1wiLFwicnVsZVwiOlwianM6XFxudmFyIGxheW91dCA9IFtdO1xcbnNldFBhZ2VUaXRsZShcXFwi5Lmm57GN5L+h5oGvXFxcIik7XFxubGV0IHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInBhdGhcXFwiKSB8fCBcXFwiXFxcIikgfHwgTVlfUEFSQU1TLnBhdGg7XFxubGV0IG1ldGEgPSBnZXRFcHViTWV0YWRhdGEocGF0aCk7XFxuLy9sb2cobWV0YSlcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBtZXRhLmZpcnN0VGl0bGUsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgIH1cXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi8J+RpOS9nOiAhe+8mlxcXCIgKyBtZXRhLmF1dGhvcnNbMF0ubGFzdG5hbWUsXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIixcXG59KTtcXG5sZXQgZGVzY3JpcHRpb24gPSAobWV0YS5kZXNjcmlwdGlvbnNbMF0gfHwgXFxcIlxcXCIpLnJlcGxhY2UoLzxwLio/Pnw8XFxcXC9wPi9nLCBcXFwiXFxcIik7XFxubGV0IHRkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xcbmlmIChkZXNjcmlwdGlvbikge1xcbiAgICBcXG4gICAgaWYgKGRlc2NyaXB0aW9uLmxlbmd0aCA+IDUwKSB7XFxuICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLnN1YnN0cmluZygwLCA1MCkgK1xcXCIuLi4uLi5cXFwiICtcXFwi5pu05aSaPlxcXCIubGluaygkKCkuYjY0KFxcXCInXFxcIikucnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgc2V0UGFnZVRpdGxlKFxcXCLnroDku4tcXFwiKTtcXG4gICAgICAgICAgICBzZXRSZXN1bHQoW3tcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLnroDku4vvvJo8YnI+44CA44CAXFxcIiArIE1ZX1BBUkFNUy50ZXh0LFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxuXFxuICAgICAgICAgICAgfV0pO1xcbiAgICAgICAgfSkpO1xcbiAgICB9XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi8J+TneeugOS7i++8mjxicj7jgIDjgIBcXFwiK2Rlc2NyaXB0aW9uLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0ZXh0OiB0ZGVzY3JpcHRpb25cXG4gICAgICAgIH1cXG4gICAgfSk7XFxufVxcbi8vc2V0UGFnZVRpdGxlKG1ldGEuZmlyc3RUaXRsZSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbn0pO1xcbmxldCBjaGFwdGVycyA9IGdldEVwdWJDaGFwdGVycyhwYXRoKTtcXG5mb3IgKGxldCBpdCBvZiBjaGFwdGVycykge1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogaXQudGl0bGUsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvZXB1YlZpZXdlci52aWV3I3JlYWRUaGVtZSMjYXV0b1BhZ2UjXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaHJlZjogaXQudXJsLFxcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXFxuICAgICAgICAgICAgdGl0bGU6IGl0LnRpdGxlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2LmVwdWLmn6XnnIvlmahcIixcInBhdGhcIjpcImVwdWJWaWV3ZXIudmlld1wiLFwicnVsZVwiOlwianM6XFxubGV0IHBhdGggPSBNWV9QQVJBTVMucGF0aDtcXG5sZXQgdXJsID0gTVlfUEFSQU1TLmhyZWY7XFxubGV0IGMgPSBnZXRFcHViQ29udGVudChwYXRoLCB1cmwpO1xcbi8vbGV0IGE9IGMucmVwbGFjZSgvXFxcXHM/PGRpdi4qPz58PFxcXFwvZGl2PlxcXFxzPy9nLCBcXFwiXFxcIikucmVwbGFjZSgvXFxcXHM/PHAuKj8+KC4qKTxcXFxcL3A+XFxcXHM/L2csIFxcXCJcXFxcdTMwMDBcXFxcdTMwMDAkMTxicj5cXFwiKTtcXG4vL2xldCBiPWMucmVwbGFjZSgvXFxcXHM/PGRpdi4qPz58PFxcXFwvZGl2PlxcXFxzPy9nLCBcXFwiXFxcIikucmVwbGFjZSgvXFxcXHM/PHAuKj8+KC4qPyk8XFxcXC9wPlxcXFxzPy9nLCBcXFwiXFxcXHUzMDAwXFxcXHUzMDAwJDE8YnI+XFxcIik7XFxuLy9sb2coYT09YilcXG4vL2xvZyhnZXRFcHViQ29udGVudDAocGF0aCwgdXJsKSlcXG5cXG5sZXQgbGF5b3V0ID0gW107XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxuICAgIHRpdGxlOiAoXFxcIjxzdHJvbmc+XFxcIiArIE1ZX1BBUkFNUy50aXRsZSArIFxcXCI8L3N0cm9uZz5cXFwiKS5iaWcoKSxcXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBjLFxcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0ZXh0U2l6ZTogMTgsXFxuICAgICAgICBjbGljazogdHJ1ZVxcbiAgICB9XFxufSk7XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjduaWh+S7tueuoeeQhlwiLFwicGF0aFwiOlwiRmlsZU1hbmFnZW1lbnQudmlld1wiLFwicnVsZVwiOlwianM6XFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzXFxcIik7XFxubGV0IHVybCA9IFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcIjtcXG5sZXQgZiA9ICQucmVxdWlyZSh1cmwpO1xcbmxldCB0eXBlID0gZ2V0UGFyYW0oXFxcInR5cGVcXFwiLCBcXFwiaG9tZVBhdGhcXFwiKTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IHtcXG4gICAgcmVmcmVzaFBhZ2UoKTtcXG59KTtcXG5sZXQgaGlrZXJQYXRoID0gXFxcImZpbGU6Ly9cXFwiICsgQ29uZmlnLmhvbWVQYXRoO1xcbmlmKCFmaWxlRXhpc3QoaGlrZXJQYXRoKSl7XFxuICAgIHdyaXRlRmlsZShoaWtlclBhdGgrXFxcIi/liJvlu7rnm67lvZUudHh0XFxcIixcXFwiXFxcIik7XFxuICAgIGRlbGV0ZUZpbGUoaGlrZXJQYXRoK1xcXCIv5Yib5bu655uu5b2VLnR4dFxcXCIpO1xcbn1cXG5mLmZpbGVTZWxlY3Rpb24oe1xcbiAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAvL+agueaNruaWh+S7tuaJqeWxleWQje+8jOeUqOS4jeWQjOWwj+eoi+W6j+aJk+W8gFxcbiAgICAgICAgaWYgKFxcXCIuanBnXFxcIiA9PT0gVFlQRSkge1xcbiAgICAgICAgICAgIHJldHVybiBQQVRIO1xcbiAgICAgICAgfSBlbHNlIGlmIChcXFwiLnR4dFxcXCIgPT09IFRZUEUpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS90eHRQYXJzZXIudmlldz9pc0NhY2hlPXRydWUmcnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZSArIFxcXCImcGF0aD1cXFwiICsgUEFUSDtcXG4gICAgICAgIH0gZWxzZSBpZiAoXFxcIi5lcHViXFxcIiA9PT0gVFlQRSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2VwdWJQYXJzZXIudmlldyNhdXRvQ2FjaGUjP3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFwiJnBhdGg9XFxcIiArIFBBVEg7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiAkKFxcXCLml6Dms5XmiZPlvIDvvIzmmK/lkKbkvb/nlKjlhbbku5blupTnlKjmiZPlvIDvvJ9cXFwiKS5jb25maXJtKHBhdGggPT4gXFxcIm9wZW5GaWxlOi8vZmlsZTovL1xcXCIgKyBwYXRoLCBQQVRIKTtcXG4gICAgICAgIH1cXG4gICAgfSksXFxuICAgIGluaXRpYWxQYXRoOiBDb25maWdbdHlwZV0sXFxuICAgIHJvb3REaXJQYXRoOiBDb25maWcuaG9tZVBhdGgsXFxuICAgIC8vb25DbGlja1R5cGU6IFxcXCJjb25maXJtXFxcIixcXG4gICAgLy9tZW1vcnk6IFxcXCJGaWxlTWFuYWdlbWVudDptZW1vcnlcXFwiLFxcbiAgICBmaWxlVHlwZTogXFxcIlxcXFwudHh0fFxcXFwuZXB1YnwuanBnXFxcIixcXG4gICAgLy9jSG9tZVRpcHM6IFxcXCLmmK/lkKbkvb/nlKjmtbfpmJTlsI/nqIvluo/miZPlvIBbJHtuYW1lfV0/XFxcIixcXG4gICAgLy9jU2VhcmNoVGlwczogXFxcIuaYr+WQpuS9v+eUqOa1t+mYlOWwj+eoi+W6j+aJk+W8gFske3BhdGh9XT9cXFwiXFxufSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjai5Db25maWdcIixcInBhdGhcIjpcIkNvbmZpZy5qc1wiLFwicnVsZVwiOlwianM6XFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanM/cnVsZT3mnKzlnLDotYTmupDnrqHnkIZcXFwiKTtcXG5cXG5sZXQgbG9jYWxDb25maWcgPSB7fTtcXG5cXG50cnkge1xcbiAgICBsb2NhbENvbmZpZyA9IEpTT04ucGFyc2UoRmlsZS5yZWFkRmlsZShnZXRQYXRoKFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2ZpbGVzL+acrOWcsOi1hOa6kOeuoeeQhi9jb25maWcuanNvblxcXCIpLnNsaWNlKDcpKSk7XFxufSBjYXRjaCAoZSkge1xcbiAgICBkZWxldGVGaWxlKFxcXCJjb25maWcuanNvblxcXCIpO1xcbn1cXG5jb25zdCBDb25maWcgPSBPYmplY3QuYXNzaWduKHtcXG4gICAgaG9tZVBhdGg6IGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvbG9jYWxNYW5hZ2VyXFxcIikuc2xpY2UoNyksXFxuICAgIGxvZ051bTogMTAsXFxuICAgIHRocmVhZE51bTogMCxcXG4gICAgZGVmX2lzUGFnaW5hdGU6IFxcXCIxXFxcIiwgLy8x6buY6K6k5byA5ZCv5YiG6aG177yMMOm7mOiupOWFs+mXrVxcbiAgICB2aWV3UGFnZVNpemU6IDIwMCxcXG4gICAgZGVmX1BpYzogXFxcImhpa2VyOi8vaW1hZ2VzL2hvbWVfcGljNFxcXCIsXFxuICAgIGRlZl9Mb3JkX1R5cGU6IFxcXCJjb21pY1xcXCIsXFxuICAgIGRlZl9WaWV3X1N0eWxlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgZGVmX0RvVmlfU3R5bGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICBkZWZfRG9WaV9UeXBlOiBcXFwiMVxcXCIsIC8vMOWFqOmDqCwgMeacquWujOaIkO+8jDLlt7LlrozmiJBcXG4gICAgZGVmX2lzQ29taWNDb21wYXRpYmxlOiBcXFwiMFxcXCIsXFxuICAgIGRlZl9Db21pY19TdHlsZTogXFxcInRleHRfMVxcXCJcXG59LCBsb2NhbENvbmZpZyk7XFxuY29uc3QgUEFUSFMgPSB7XFxuICAgIG5vdmVsUGF0aDogXFxcIi/lsI/or7QvXFxcIixcXG4gICAgY29taWNQYXRoOiBcXFwiL+a8q+eUuy9cXFwiLFxcbiAgICBub3ZlbEZ1bGxQYXRoOiBcXFwiL+Wwj+ivtOWQiOW5ti9cXFwiLFxcbiAgICBleHRlcm5hbEltcG9ydFBhdGg6IFxcXCIv5aSW5a+85bCP6K+0L1xcXCIsXFxuICAgIGNvbnRlbnRzQ2FjaGU6IFxcXCIv55uu5b2V57yT5a2YL1xcXCJcXG59XFxuXFxuXFxuT2JqZWN0LmtleXMoUEFUSFMpLmZvckVhY2goa2V5ID0+IENvbmZpZ1trZXldID0gQ29uZmlnLmhvbWVQYXRoICsgUEFUSFNba2V5XSk7XFxuXFxuJC5leHBvcnRzID0gQ29uZmlnO1wifV0iLCJpY29uIjoiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9xLzU4LnBuZyIsInByb3h5IjoiIn0=
Add Comment
Please, Sign In to add comment