Advertisement
xiaomianao666

邀您一起看:「听合集」

Aug 2nd, 2022
552
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:二级页面详情¥page_detail¥「听合集」@@eyJkYXRhIjoie1wiYXNzb2NpYXRlZE1vZGVsc01hcEZvckpvaW5UYWJsZVwiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhGS1wiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhvdXRGS1wiOnt9LFwiZmllbGRzVG9TZXRUb0RlZmF1bHRcIjpbXSxcImlkXCI6MCxcImxhc3RfY2hhcHRlcl9ydWxlXCI6XCJcIixcImxpc3RUb0NsZWFyQXNzb2NpYXRlZEZLXCI6W10sXCJsaXN0VG9DbGVhclNlbGZGS1wiOltdLFwicGFnZUxpc3RcIjpbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuW3peWFt1wiLFwicGF0aFwiOlwidXRpbGl5XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgaG9zdCA9IFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3NcXFwiO1xcbi8vbGV0IGhvc3QgPSBcXFwiaHR0cDovLzE5Mi4xNjguMy45NDo4MDc5XFxcIjtcXG5sZXQgaG9tZSA9IGJhc2U2NERlY29kZShcXFwiYUdsclpYSTZMeTlvYjIxbFxcXCIpO1xcbnZhciBhcGkgPSB7XFxuICAgIGhvc3Q6IGhvc3QrXFxcIi9oaWtlcnVsZVxcXCIsXFxuICAgIHVzZXJzVXJsOiBcXFwiL2Rldi91c2Vycz9vcmRlcj1cXFwiLCAvL+eUqOaIt+WIl+ihqFxcbiAgICBydWxlQ291bnRVcmw6IFxcXCIvZGV2L3J1bGVjb3VudFxcXCIsIC8v6I635Y+W6KeE5YiZ5pWw6YePXFxuICAgIHJ1bGVzVXJsOiBcXFwiL2Rldi9nZXRcXFwiLCAvL+eUqOaIt+WvueW6lOeahOinhOWImeWIl+ihqOS7heS7heiOt+WPluWFrOW8gFxcbiAgICBydWxlc0FsbFVybDogXFxcIi9kZXYvZ2V0YWxsXFxcIiwgLy/lvIDlj5HogIXlr7nlupTnmoTop4TliJnliJfooajlj6/ojrflj5bnp4HmnIlcXG4gICAgZGV2U2VsZjonL2Rldi9nZXRzZWxmJywvL+iOt+WPluW8gOWPkeiAheS/oeaBr1xcbiAgICBtYW5DYW5VcGxvYWQ6Jy9zZXRfY2FuX3VwbG9hZC8nLC8v6LaF566h6K6+572u5byA5Y+R6ICF5piv5ZCm5Y+v5LiK5LygXFxuICAgIG1hblJ1bGVTYWZlOicvc2V0X3J1bGVfc2FmZS8nLC8v6LaF566h6K6+572u6KeE5YiZ5a6J5YWo5oCnXFxuICAgIG1hblJ1bGVHb29kOicvc2V0X3J1bGVfZ29vZC8nLC8v6LaF566h6K6+572u6KeE5YiZ5LyY6LSo5oCnXFxuICAgIGltcG9ydFVybDogXFxcIi9ydWxlbGlzdC5qc29uP2lkPVxcXCIsIC8v6KeE5YiZ6K+m5oOF5Y+v5a+85YWlXFxuICAgIGluZm9TZXRVcmw6IFxcXCIvZGV2L3NldF9pbmZvXFxcIixcXG4gICAgbm93Q29uVXJsOiBcXFwiL3NxbF9pbmZvL2dldF9ub3dfY29uXFxcIixcXG4gICAgaW5mb0dldFVybDogXFxcIi9kZXYvZ2V0X2luZm8/bmFtZT1cXFwiLFxcbiAgICBzZXR0aW5nc0dldFVybDogXFxcIi9kZXYvZ2V0X3NldHRpbmdzP25hbWU9XFxcIixcXG4gICAgZ3VwbG9hZDogXFxcIi9kZXYvZ3VwbG9hZFxcXCIsXFxuICAgIGd0aW1lb3ZlcjogXFxcIi9kZXYvZ3RpbWVvdmVyXFxcIixcXG4gICAgZ2V0YnlpZDogXFxcIi9kZXYvZ2V0YnlpZFxcXCIsXFxuICAgIHJ1bGVMaXN0SnNvbjogXFxcIi9ydWxlbGlzdC5qc29uXFxcIixcXG4gICAgYXV0aDogXFxcIi9kZXYvZ2V0X2F1dGhcXFwiLFxcbiAgICB0aW1lb3ZlcjogXFxcIi9kZXYvdGltZW92ZXJcXFwiLFxcbiAgICBzaGFyZTogXFxcIi9kZXYvc2hhcmVcXFwiLFxcbiAgICBnZW5BdXRoOiBcXFwiL2Rldi9nZW5fYXV0aFxcXCIsXFxuICAgIGRlbGV0ZVVybDogXFxcIi9kZXYvZGVsZXRlXFxcIixcXG4gICAganNvbkxpc3Q6IFxcXCIvZGV2L2pzb25fbGlzdFxcXCIsXFxuICAgIHNlYXJjaDogXFxcIi9kZXYvc2VhcmNoXFxcIixcXG4gICAgbmV3X2RldjogXFxcIi9kZXZfcmVnaXN0L25ld1xcXCIsXFxuICAgIG5ld19nZXRJZDogXFxcIi9kZXZfcmVnaXN0L2dldF9pZFxcXCIsXFxuICAgIG5ld19jb25maXJtOiBcXFwiL2Rldl9yZWdpc3QvY29uZmlybVxcXCIsXFxuICAgIG1vZGlmeV9wd2Q6IFxcXCIvbW9kaWZ5L3Bhc3N3b3JkXFxcIixcXG4gICAgbW9kaWZ5X25hbWU6IFxcXCIvbW9kaWZ5L25hbWVcXFwiLFxcbiAgICBtb2RpZnlfYXZhOiBcXFwiL21vZGlmeS9hdmF0YXJcXFwiLFxcbiAgICB1c2VyOiBcXFwiL2Rldi91c2VyL1xcXCIsXFxuICAgIGdldF9ydWxlX25vdGU6IFxcXCIvbW9kaWZ5L2dldF9ydWxlX25vdGUvXFxcIixcXG4gICAgc2V0X3J1bGVfcGljOiBcXFwiL21vZGlmeS9ydWxlX3BpYy9cXFwiLFxcbiAgICBzZXRfcnVsZV9ub3RlOiBcXFwiL21vZGlmeS9ydWxlX25vdGUvXFxcIlxcbn1cXG4kLmV4cG9ydHMucmFuZ2UgPSBmdW5jdGlvbihtLCBuKSB7XFxuICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobSAtIG4gKyAxKSArIG4pO1xcbn1cXG4kLmV4cG9ydHMubWFwQ29sVHlwZSA9IGZ1bmN0aW9uKHRhcmdldCwgdHlwZSwgbikge1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xcbiAgICAgICAgdGFyZ2V0LnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiB0eXBlXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG52YXIgZ2V0QXBpID0gZnVuY3Rpb24oaykge1xcbiAgICByZXR1cm4gYXBpLmhvc3QgKyBhcGlba107XFxufTtcXG4kLmV4cG9ydHMuZ2V0QXBpPWdldEFwaTtcXG4kLmV4cG9ydHMubWQ9Z2V0QXBpKCdpbXBvcnRVcmwnKStcXFwiMzE4N1xcXCI7XFxuJC5leHBvcnRzLmxvY2FsUnVsZVZlciA9IGZ1bmN0aW9uKGxvY2FsUnVsZUxpc3QsIHJ1bGUpIHtcXG4gICAgbGV0IGxvY2FsUnVsZTtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbFJ1bGVMaXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICBsZXQgaXRlbSA9IGxvY2FsUnVsZUxpc3RbaV07XFxuICAgICAgICBsZXQgYXUgPSBpdGVtLmF1dGhvciB8fCBcXFwiXFxcIjtcXG4gICAgICAgIGxldCBzYW1lQXU9YXUubGVuZ3RoID4gMCAmJiBydWxlLmF1dGhvci5pbmNsdWRlcyhhdSk7XFxuICAgICAgICBzYW1lQXU9dHJ1ZTsvL+S4jeWIpOaWreS9nOiAhem7mOiupOS4unRydWVcXG4gICAgICAgIGlmIChpdGVtLnRpdGxlID09PSBydWxlLm5hbWUgJiYgc2FtZUF1KSB7XFxuICAgICAgICAgICAgbG9jYWxSdWxlID0gaXRlbTtcXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBpZiAobG9jYWxSdWxlID09PSB2b2lkIDApIHtcXG4gICAgICAgIHJldHVybiAtMTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiBsb2NhbFJ1bGUudmVyc2lvbjtcXG4gICAgfVxcbn1cXG4kLmV4cG9ydHMuY29sb3IgPSBmdW5jdGlvbih0ZXh0LCBjb2xvcikge1xcbiAgICB0ZXh0ICs9IFxcXCJcXFwiO1xcbiAgICBpZiAodGV4dC5pbmRleE9mKFxcXCLigJzigJzigJ3igJ1cXFwiKSA9PT0gMCkge1xcbiAgICAgICAgdGV4dC5yZXBsYWNlKFxcXCLigJzigJzigJ3igJ1cXFwiLCBcXFwiXFxcIik7XFxuICAgIH1cXG4gICAgcmV0dXJuIFxcXCLigJzigJzigJ3igJ08Zm9udCBjb2xvcj0nXFxcIiArIGNvbG9yICsgXFxcIic+XFxcIiArIHRleHQgKyBcXFwiPC9mb250PlxcXCI7XFxufVxcblxcbiQuZXhwb3J0cy5zbGVlcCA9IGZ1bmN0aW9uKHRpbWVvdXQpe1xcbiAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKHRpbWVvdXQpO1xcbn1cXG5mdW5jdGlvbiBodG1sVGFnKHRhZywgdGV4dCkge1xcbiAgICB0ZXh0ICs9IFxcXCJcXFwiO1xcbiAgICBpZiAodGV4dC5pbmRleE9mKFxcXCLigJzigJzigJ3igJ1cXFwiKSA9PT0gMCkge1xcbiAgICAgICAgdGV4dC5yZXBsYWNlKFxcXCLigJzigJzigJ3igJ1cXFwiLCBcXFwiXFxcIik7XFxuICAgIH1cXG4gICAgcmV0dXJuIFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIjxcXFwiICsgdGFnICsgXFxcIj5cXFwiICsgdGV4dCArIFxcXCI8L1xcXCIgKyB0YWcgKyBcXFwiPlxcXCI7XFxuXFxufVxcblxcbmZ1bmN0aW9uIGdldE5vd0Zvcm1hdERhdGUoKSB7XFxuICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpO1xcbiAgICAgICAgICAgIGxldCBzZXBlcmF0b3IxID0gXFxcIi1cXFwiO1xcbiAgICAgICAgICAgIGxldCBzZXBlcmF0b3IyID0gXFxcIjpcXFwiO1xcbiAgICAgICAgICAgIGxldCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSArIDE7XFxuICAgICAgICAgICAgbGV0IHN0ckRhdGUgPSBkYXRlLmdldERhdGUoKTtcXG4gICAgICAgICAgICBsZXQgc3RySG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XFxuICAgICAgICAgICAgbGV0IHN0ck1pbnV0ZXMgPSBkYXRlLmdldE1pbnV0ZXMoKTtcXG4gICAgICAgICAgICBsZXQgc3RyU2Vjb25kcyA9IGRhdGUuZ2V0U2Vjb25kcygpKzE7XFxuICAgICAgICAgICAgaWYgKG1vbnRoID49IDEgJiYgbW9udGggPD0gOSkge1xcbiAgICAgICAgICAgICAgICBtb250aCA9IFxcXCIwXFxcIiArIG1vbnRoXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChzdHJEYXRlID49IDAgJiYgc3RyRGF0ZSA8PSA5KSB7XFxuICAgICAgICAgICAgICAgIHN0ckRhdGUgPSBcXFwiMFxcXCIgKyBzdHJEYXRlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChzdHJIb3VycyA+PSAwICYmIHN0ckhvdXJzIDw9IDkpIHtcXG4gICAgICAgICAgICAgICAgc3RySG91cnMgPSBcXFwiMFxcXCIgKyBzdHJIb3Vyc1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoc3RyTWludXRlcyA+PSAwICYmIHN0ck1pbnV0ZXMgPD0gOSkge1xcbiAgICAgICAgICAgICAgICBzdHJNaW51dGVzID0gXFxcIjBcXFwiICsgc3RyTWludXRlc1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoc3RyU2Vjb25kcyA+PSAwICYmIHN0clNlY29uZHMgPD0gOSkge1xcbiAgICAgICAgICAgICAgICBzdHJTZWNvbmRzID0gXFxcIjBcXFwiICsgc3RyU2Vjb25kc1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAvL2xldCBjdXJyZW50ZGF0ZSA9IGRhdGUuZ2V0RnVsbFllYXIoKSArIHNlcGVyYXRvcjEgKyBtb250aCArIHNlcGVyYXRvcjEgKyBzdHJEYXRlICsgXFxcIiBcXFwiICsgc3RySG91cnMgKyBzZXBlcmF0b3IyICsgc3RyTWludXRlcyArIHNlcGVyYXRvcjIgKyBzdHJTZWNvbmRzO1xcbiAgICAgICAgICAgIGxldCBjdXJyZW50ZGF0ZSA9IChkYXRlLmdldEZ1bGxZZWFyKCktMjAyMCkrJycrIG1vbnRoICsnJysgc3RyRGF0ZSArJycrIHN0ckhvdXJzKycnICsgc3RyTWludXRlcyArJycrIE1hdGguY2VpbChzdHJTZWNvbmRzLzcpO1xcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChjdXJyZW50ZGF0ZSlcXG4gICAgICAgIH1cXG4kLmV4cG9ydHMuZ2V0Tm93Rm9ybWF0RGF0ZSA9IGdldE5vd0Zvcm1hdERhdGU7XFxuJC5leHBvcnRzLmh0bWxUYWcgPSBodG1sVGFnO1xcbiQuZXhwb3J0cy5zbWFsbCA9IGZ1bmN0aW9uKHRleHQpIHtcXG4gICAgcmV0dXJuIGh0bWxUYWcoXFxcInNtYWxsXFxcIiwgdGV4dCk7XFxufVxcbiQuZXhwb3J0cy5nZXRGaWxlID0gZnVuY3Rpb24oKSB7XFxuICAgIHZhciBGaWxlID0gcmVxdWVzdChcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFwiKSB8fCBcXFwie31cXFwiO1xcbiAgICB0cnkge1xcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoRmlsZSk7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFwiLCBcXFwie31cXFwiKTtcXG4gICAgICAgIHJldHVybiB7fTtcXG4gICAgfVxcbn1cXG4kLmV4cG9ydHMuZ2V0VXNlckRhdGUgPWZ1bmN0aW9uKCl7XFxuICAgIHZhciBGaWxlID0gcmVxdWVzdChcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSQS5qc29uXFxcIikgfHwgXFxcIltdXFxcIjtcXG4gICAgdHJ5IHtcXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEZpbGUpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUkEuanNvblxcXCIsIFxcXCJbXVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIFtdO1xcbiAgICB9XFxufVxcbiQuZXhwb3J0cy5leGlzdEZpbGUgPSBmdW5jdGlvbihzcGF0aCwgaXBhdGgsIGhlYWRlcnMpIHtcXG4gICAgbGV0IHNjb2RlID0gcmVxdWVzdChzcGF0aCk7XFxuICAgIGlmICghc2NvZGUpIHtcXG4gICAgICAgIHdyaXRlRmlsZShzcGF0aCwgcmVxdWVzdChpcGF0aCwgaGVhZGVycykpO1xcbiAgICB9XFxufVxcblxcbmxldCBuZXdBcGkgPSB7XFxuICAgIFxcXCJkaXNfbmV3XFxcIjogXFxcIi9oaWtlcnVsZS9uZXdfcnVsZV9kaXNjdXNzL1xcXCIsXFxuICAgIFxcXCJkaXNfdmVyaWZ5XFxcIjogXFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvZ2V0X3l6bVxcXCIsXFxuICAgIFxcXCJkaXNfZ2V0XFxcIjogXFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvXFxcIixcXG4gICAgXFxcImRpc19zZXRcXFwiOiBcXFwiL2hpa2VydWxlL21vZGlmeS9jYW5fZGlzY3Vzcy9cXFwiLFxcbiAgICBcXFwiZGlzX25ld191c2VyXFxcIjogXFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvbmV3X3VzZXJcXFwiLFxcbiAgICBcXFwiZGlzX2xvZ2luXFxcIjpcXFwiL2hpa2VydWxlL3J1bGVfZGlzY3Vzcy91c2VyX2xvZ2luXFxcIixcXG4gICAgXFxcImRpc19kZXZfZGlzY3Vzc1xcXCI6XFxcIi9oaWtlcnVsZS9tb2RpZnkvZGV2X2Nhbl9kaXNjdXNzXFxcIixcXG4gICAgXFxcImRpc19kZXZfY29udHJvbFxcXCI6XFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvcmVtb3ZlL1xcXCIsXFxuICAgIFxcXCJhbGxfcnVsZVxcXCI6XFxcIi9oaWtlcnVsZS9nZXRfcnVsZXNcXFwiLFxcbiAgICBcXFwiZGlzX2dldF9yZXBseVxcXCI6XFxcIi9oaWtlcnVsZS9nZXRfcmVwbHlfcnVsZV9kaXNjdXNzXFxcIixcXG4gICAgXFxcImRpc19yZXBseVxcXCI6XFxcIi9oaWtlcnVsZS9kZXZfbmV3X3J1bGVfZGlzY3Vzcy9cXFwiLFxcbn1cXG5cXG5mdW5jdGlvbiBzZXRBcGkob2JqZWN0KSB7XFxuICAgIGxldCB0YXJnZXQgPSB7fTtcXG4gICAgZm9yIChsZXQga2V5IGluIG9iamVjdCkge1xcbiAgICAgICAgdGFyZ2V0W2tleV09aG9zdCtvYmplY3Rba2V5XVxcbiAgICB9XFxuICAgIHJldHVybiB0YXJnZXQ7XFxufVxcblxcbiQuZXhwb3J0cy5hcGkgPSBzZXRBcGkobmV3QXBpKTtcXG4kLmV4cG9ydHMuYXBpLmhvc3Q9aG9zdDtcXG4kLmV4cG9ydHMuYXBpLmhvbWU9aG9tZTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuW8gOWPkeiAheeZu+W9lVwiLFwicGF0aFwiOlwiZGV2TG9naW5cIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi5byA5Y+R6ICF55m75b2VXFxcIik7XFxuY29uc3Qge1xcbiAgICBnZXRBcGksXFxuICAgIGh0bWxUYWcsXFxuICAgIG1hcENvbFR5cGUsXFxuICAgIHNtYWxsLFxcbmdldEZpbGVcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxudmFyIGRhdGEgPSBbXTtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCk9PntcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZVVzZXJuYW1lXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2VQYXNzd29yZFxcXCIpO1xcbn0pKVxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn6LSm5Y+3JyxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlVXNlcm5hbWUnLCcnKSxcXG4gICAgICAgIHR5cGU6XFxcIm51bWJlclxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlVXNlcm5hbWVcXFwiLGlucHV0KSdcXG4gICAgfVxcbn0sIHtcXG4gICAgdGl0bGU6ICflr4bnoIEnLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2VQYXNzd29yZCcsICcnKSxcXG4gICAgICAgIHR5cGU6IFxcXCJwYXNzd29yZFxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlUGFzc3dvcmRcXFwiLGlucHV0KSdcXG4gICAgfVxcbn0pO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCImbmJzcDsmbmJzcDs8YSBocmVmPSdoaWtlcjovL3BhZ2UvUmVnaXN0ZXInPuazqOWGjDwvYT5cXFwiLFxcbiAgICBjb2xfdHlwZTpcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbm1hcENvbFR5cGUoZGF0YSwgXFxcImxpbmVfYmxhbmtcXFwiLCAxKTtcXG5sZXQgdXNlciA9IGdldEZpbGUoKTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYlxcXCIsIFxcXCLnmbvlvZVcXFwiKSxcXG4gICAgdXJsOiAkKCkubGF6eVJ1bGUoKHVybCwgZik9PiB7XFxuICAgICAgICBsZXQgdXNlcm5hbWUgPSBnZXRWYXIoJ1dhcmVob3VzZVVzZXJuYW1lJywgJycpLFxcbiAgICAgICAgICAgIHBhc3N3b3JkID0gZ2V0VmFyKCdXYXJlaG91c2VQYXNzd29yZCcsICcnKTtcXG4gICAgICAgIGlmKHVzZXJuYW1lID09PSBcXFwiXFxcIiAmJiBwYXNzd29yZCA9PT1cXFwiXFxcIil7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+i0puWPt+WSjOWvhueggeS4jeiDveS4uuepulxcXCJcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBteVVybCA9IHVybCArICc/cXE9JyArIHVzZXJuYW1lICsgJyZwYXNzd29yZD0nICsgcGFzc3dvcmQ7XFxuICAgICAgICBsZXQgY29kZV9zdHIgPSByZXF1ZXN0KG15VXJsKTtcXG4gICAgICAgIGxldCBjb2RlID0gSlNPTi5wYXJzZShjb2RlX3N0cik7XFxuICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT0gMCkge1xcbiAgICAgICAgICAgIGYudXNlcm5hbWU9dXNlcm5hbWU7XFxuICAgICAgICAgICAgZi5wYXNzd29yZD1wYXNzd29yZFxcbiAgICAgICAgICAgIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb24nLCBKU09OLnN0cmluZ2lmeShmKSk7XFxuICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/nmbvlvZXmiJDlip9cXFwiO1xcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+i0puWPt+aIluWvhueggemUmeivr1xcXCI7XFxuICAgICAgICB9XFxuICAgIH0sIGdldEFwaShcXFwicnVsZXNBbGxVcmxcXFwiKSx1c2VyKSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbn0pO1xcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcImljb25fMl9yb3VuZFwiLFwibmFtZVwiOlwi5byA5Y+R6ICF566h55CGXCIsXCJwYXRoXCI6XCJkZXZNYW5hZ2VcIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi6KeE5YiZ566h55CGXFxcIik7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAnY2xlYXJWYXIoXFxcIldhcmVob3VzZS5iYWNrXFxcIixcXFwiXFxcIik7Jyk7XFxuaWYgKGdldFZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiKSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgIGJhY2soKTtcXG59XFxuY29uc3Qge1xcbiAgICBnZXRBcGksXFxuICAgIGNvbG9yLFxcbiAgICBzbWFsbCxcXG4gICAgZ2V0RmlsZSxcXG4gICAgZXhpc3RGaWxlLFxcbiAgICBtYXBDb2xUeXBlLFxcbiAgICBhcGlcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgZGV2XFxufSA9IE1ZX1BBUkFNUztcXG5sZXQge1xcbiAgICB1c2VybmFtZSxcXG4gICAgcGFzc3dvcmQsXFxufSA9IGdldEZpbGUoKTtcXG4vL2V4aXN0RmlsZShcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwv5byA5Y+R6ICF5YiG5LqrLmh0bWxcXFwiLCBcXFwiaHR0cHM6Ly9lcnAuc2N3aW5iYW8uY29tL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTM5XFxcIik7XFxubGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwicnVsZXNBbGxVcmxcXFwiKSArICc/cXE9JyArIHVzZXJuYW1lICsgJyZwYXNzd29yZD0nICsgcGFzc3dvcmQpKS5yZXN1bHQ7XFxubGV0IE1PQklMRV9VQSA9ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNS4wOyBTTS1HOTAwUCBCdWlsZC9MUlgyMVQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OC4wLjQzMjQuMTQ2IE1vYmlsZSBTYWZhcmkvNTM3LjM2JztcXG5sZXQgaW5mb1NldFVybCA9IGdldEFwaShcXFwiaW5mb1NldFVybFxcXCIpO1xcbmxldCBpbmZvR2V0VXJsID0gZ2V0QXBpKFxcXCJpbmZvR2V0VXJsXFxcIikgKyB1c2VybmFtZTtcXG5sZXQgc2V0dGluZ3NHZXRVcmwgPSBnZXRBcGkoXFxcInNldHRpbmdzR2V0VXJsXFxcIikgKyB1c2VybmFtZTtcXG5wdXRNeVZhcihcXFwiZGV2X3NldF9pbmZvXFxcIiwgW3VzZXJuYW1lLCBwYXNzd29yZCwgaW5mb1NldFVybCwgTU9CSUxFX1VBLCBpbmZvR2V0VXJsXS5qb2luKFxcXCIkJFxcXCIpKTtcXG5sZXQgZGF0YSA9IFtdO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGJpZz7ku5PlupPorr7nva48L2JpZz4mbmJzcDsmbmJzcDsmbmJzcDs8c21hbGw+PHU+77yIIOS4quS6uui1hOaWmSA+77yJPC91Pjwvc21hbGw+JyxcXG4gICAgZGVzYzogJ+KAnOKAnOKAneKAneaCqOWFseaciSA8c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPicgKyBydWxlTGlzdC5sZW5ndGggKyAnPC9zcGFuPicgKyBcXFwiIOadoeinhOWImeOAglxcXFxu54K55Ye76KeE5YiZ5Y+v6L+b6KGM5YiG5Lqr44CB5Yig6Zmk44CB5a+85YWl5pON5L2c5Y+K5p+l55yL6K+m5oOFXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1BlcnNvbmFsRGF0YSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICBleHRyYTp7aWQ6ZGV2LmlkfSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnXFxufSk7XFxubWFwQ29sVHlwZShkYXRhLCBcXFwibGluZVxcXCIsIDIpO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBzbWFsbChjb2xvcihcXFwi5pu05pS55YWs5ZGK4pyNXFxcIiwgXFxcIiMzNGIxZmZcXFwiKSksXFxuICAgIC8vIHVybDogXFxcIng1Oi8vZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvcnVsZXMvZHpIb3VzZS9odG1sL2Rldl9pbmZvX2VkaXQuaHRtbFxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9kZXZJbmZvRWRpdFxcXCIsXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBzbWFsbChjb2xvcihcXFwi5pu05aSa5YiG5Lqr8J+TslxcXCIsIFxcXCIjMzRiMWZmXFxcIikpLFxcbiAgICAvL3VybDogXFxcIng1Oi8vZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvcnVsZXMvZHpIb3VzZS9odG1sL+W8gOWPkeiAheWIhuS6qy5odG1sXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL21vcmVTaGFyZVxcXCIsXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBzbWFsbChjb2xvcihcXFwi5Y2H57qn5L6d6LWW8J+TpVxcXCIsIFxcXCIjMzRiMWZmXFxcIikpLFxcbiAgICB1cmw6ICQoXFxcIuWNh+e6p+S8mumHjeaWsOS7juS7k+W6k+aLieWPluebuOWFs+eahOmdmeaAgemhtemdouWIsOacrOWcsFxcXFxu56Gu6K6k5Y2H57qn5ZCXP1xcXCIpLmNvbmZpcm0oKGhvc3QpID0+IHtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwv5byA5Y+R6ICF5YiG5LqrLmh0bWxcXFwiLCByZXF1ZXN0KGhvc3QrJy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUzOScpKTtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwvZGV2X2luZm9fZWRpdC5odG1sXFxcIiwgcmVxdWVzdChob3N0KycvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD00MDInKSk7XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9odG1sL2Rldl9pbmZvX2dldC5odG1sXFxcIiwgcmVxdWVzdChob3N0KycvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD00MDQnKSk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey6YeN572u5byA5Y+R6ICF5YiG5LqrLOeugOS7i+afpeeciyznroDku4vnvJbovpHnrYnpnZnmgIHmlofku7ZcXFwiO1xcbiAgICB9LGFwaS5ob3N0KSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzMnXFxufSk7XFxubGV0IGRldlNldEJhY2s7XFxudHJ5IHtcXG4gICAgZGV2U2V0QmFjayA9IEpTT04ucGFyc2UocmVxdWVzdChzZXR0aW5nc0dldFVybCkpO1xcbn0gY2F0Y2ggKGUpIHtcXG4gICAgZGV2U2V0QmFjayA9IHt9O1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRTZXR0aW5nSXRlbShiYXNpYykge1xcbiAgICBsZXQgdGVtcCA9IHtcXG4gICAgICAgIHRpdGxlOiBiYXNpYy50aXRsZSxcXG4gICAgICAgIGNvbF90eXBlOiBiYXNpYy5jb2xfdHlwZSxcXG4gICAgICAgIHVybDogJChiYXNpYy5jb25maXJtKS5jb25maXJtKCh1cmwsIG1zZykgPT4ge1xcbiAgICAgICAgICAgIGxldCBiYWNrID0gcmVxdWVzdCh1cmwpO1xcbiAgICAgICAgICAgIGxldCByZXQgPSBKU09OLnBhcnNlKGJhY2spO1xcbiAgICAgICAgICAgIGlmIChyZXQuc3RhdHVzID09IDApIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgbXNnWzBdO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBtc2dbMV0gKyBcXFwiXFxcXG5cXFwiICsgcmV0LmRldGFpbDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBiYXNpYy51cmwsIGJhc2ljLm1zZylcXG4gICAgfTtcXG4gICAgcmV0dXJuIHRlbXA7XFxufVxcbmlmIChkZXZTZXRCYWNrLnN0YXR1cyA9PSAwKSB7XFxuICAgIGxldCBkZXZTZXR0aW5ncyA9IGRldlNldEJhY2sucmVzdWx0O1xcbiAgICBsZXQgc2hhcmUgPSB7XFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG4gICAgfTtcXG4gICAgaWYgKGRldlNldHRpbmdzLnNoYXJlX3B1YmxpYykge1xcbiAgICAgICAgc2hhcmUudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi5YWs5byA5LiK5LygXFxcIiwgXFxcImdyZWVuXFxcIikgKyBjb2xvcihcXFwiKOengeiXjylcXFwiLCBcXFwiIzAwYmZmZlxcXCIpKTtcXG4gICAgICAgIHNoYXJlLnVybCA9IGdldEFwaShcXFwiZ3VwbG9hZFxcXCIpICsgXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZCArIFxcXCImZmxhZz0xXFxcIjtcXG4gICAgICAgIHNoYXJlLmNvbmZpcm0gPSBcXFwi5piv5ZCm56Gu6K6k56eB6JeP5Lul5ZCO5o+Q5Lqk55qE6KeE5YiZP1xcXCI7XFxuICAgICAgICBzaGFyZS5tc2cgPSBbXFxcIuW3suengeiXj1xcXCIsIFxcXCLnp4Hol4/lpLHotKVcXFwiXTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHNoYXJlLnRpdGxlID0gc21hbGwoY29sb3IoXFxcIuengeWvhuS4iuS8oFxcXCIsIFxcXCJyZWRcXFwiKSArIGNvbG9yKFxcXCIo5YWs5byAKVxcXCIsIFxcXCIjYWRmZjJmXFxcIikpO1xcbiAgICAgICAgc2hhcmUudXJsID0gZ2V0QXBpKFxcXCJndXBsb2FkXFxcIikgKyBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkO1xcbiAgICAgICAgc2hhcmUuY29uZmlybSA9IFxcXCLmmK/lkKbnoa7orqTlhazlvIDku6XlkI7mj5DkuqTnmoTop4TliJk/XFxcIjtcXG4gICAgICAgIHNoYXJlLm1zZyA9IFtcXFwi5bey5YWs5byAXFxcIiwgXFxcIuWFrOW8gOWksei0pVxcXCJdO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaChzZXRTZXR0aW5nSXRlbShzaGFyZSkpO1xcbiAgICBsZXQgdGltZU92ZXIgPSB7XFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG4gICAgfTtcXG4gICAgaWYgKGRldlNldHRpbmdzLnRpbWVfb3Zlcikge1xcbiAgICAgICAgdGltZU92ZXIudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi55+t5pe256eY6ZKlXFxcIiwgXFxcImdyZWVuXFxcIikgKyBjb2xvcihcXFwiKOawuOS5hSlcXFwiLCBcXFwiIzAwYmZmZlxcXCIpKTtcXG4gICAgICAgIHRpbWVPdmVyLnVybCA9IGdldEFwaShcXFwiZ3RpbWVvdmVyXFxcIikgKyBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkICsgXFxcIiZmbGFnPTFcXFwiO1xcbiAgICAgICAgdGltZU92ZXIuY29uZmlybSA9IFxcXCLmmK/lkKbnoa7orqTku6XlkI7nmoTnp4Hol4/op4TliJnliIbkuqvkuI3ov4fmnJ8/XFxcIjtcXG4gICAgICAgIHRpbWVPdmVyLm1zZyA9IFtcXFwi5bey6K6+5Li65rC45LmFXFxcIiwgXFxcIuiuvuS4uuawuOS5heWksei0pVxcXCJdO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgdGltZU92ZXIudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi5rC45LmF56eY6ZKlXFxcIiwgXFxcInJlZFxcXCIpICsgY29sb3IoXFxcIijov4fmnJ8pXFxcIiwgXFxcIiNhZGZmMmZcXFwiKSk7XFxuICAgICAgICB0aW1lT3Zlci51cmwgPSBnZXRBcGkoXFxcImd0aW1lb3ZlclxcXCIpICsgXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZDtcXG4gICAgICAgIHRpbWVPdmVyLmNvbmZpcm0gPSBcXFwi56Gu6K6k6KaB5Lul5ZCO5YiG5Lqr55qE56eB6JeP6KeE5YiZ6Ieq5Yqo5Yiw5pyfP1xcXCI7XFxuICAgICAgICB0aW1lT3Zlci5tc2cgPSBbXFxcIuW3suiuvuS4uui/h+acn1xcXCIsIFxcXCLorr7kuLrov4fmnJ/lpLHotKVcXFwiXTtcXG4gICAgfVxcbiAgICBkYXRhLnB1c2goc2V0U2V0dGluZ0l0ZW0odGltZU92ZXIpKTtcXG4gICAgbGV0IGRpc2N1c3MgPSB7XFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG4gICAgfTtcXG4gICAgaWYgKGRldlNldHRpbmdzLmNhbl9kaXNjdXNzKSB7XFxuICAgICAgICBkaXNjdXNzLnRpdGxlID0gc21hbGwoY29sb3IoXFxcIuWFgeiuuOivhOiuulxcXCIsIFxcXCJyZWRcXFwiKSArIGNvbG9yKFxcXCIo5LiN6K64KVxcXCIsIFxcXCIjYWRmZjJmXFxcIikpO1xcbiAgICAgICAgZGlzY3Vzcy51cmwgPSBhcGkuZGlzX2Rldl9kaXNjdXNzICsgXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZCsgXFxcIiZmbGFnPTFcXFwiO1xcbiAgICAgICAgZGlzY3Vzcy5jb25maXJtID0gXFxcIuaYr+WQpuehruiupOS7peWQjuS4iuS8oOeahOinhOWImeWFgeiuuOivhOiuuj9cXFwiO1xcbiAgICAgICAgZGlzY3Vzcy5tc2cgPSBbXFxcIuW3suiuvuS4uuS4jeiuuFxcXCIsIFxcXCLorr7nva7lpLHotKVcXFwiXTtcXG5cXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGRpc2N1c3MudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi5LiN6K646K+E6K66XFxcIiwgXFxcImdyZWVuXFxcIikgKyBjb2xvcihcXFwiKOWFgeiuuClcXFwiLCBcXFwiIzAwYmZmZlxcXCIpKTtcXG4gICAgICAgIGRpc2N1c3MudXJsID0gYXBpLmRpc19kZXZfZGlzY3VzcyArIFxcXCI/cXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQ7XFxuICAgICAgICBkaXNjdXNzLmNvbmZpcm0gPSBcXFwi5piv5ZCm56Gu6K6k5Lul5ZCO5LiK5Lyg55qE6KeE5YiZ5YWB6K646K+E6K66P1xcXCI7XFxuICAgICAgICBkaXNjdXNzLm1zZyA9IFtcXFwi5bey6K6+5Li65YWB6K64XFxcIiwgXFxcIuiuvue9ruWksei0pVxcXCJdO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaChzZXRTZXR0aW5nSXRlbShkaXNjdXNzKSk7XFxufVxcbm1hcENvbFR5cGUoZGF0YSwgXFxcImxpbmVcXFwiLCAyKTtcXG5mb3IgKGxldCBpdGVtIG9mIHJ1bGVMaXN0KSB7XFxuICAgIGxldCBteV90X2V4Y29kZTEgPSAnJztcXG4gICAgbGV0IG15X3RfZXhjb2RlMiA9ICcnO1xcbiAgICBpZiAoaXRlbS5zdGF0ZSAhPSAncHVibGljJykge1xcbiAgICAgICAgbXlfdF9leGNvZGUxICs9ICfjipnvuI8nO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgbXlfdF9leGNvZGUxICs9ICcnO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogbXlfdF9leGNvZGUxICsgaXRlbS5uYW1lICsgbXlfdF9leGNvZGUyLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL21hbmFnZVJ1bGUjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IGl0ZW0uaWQsXFxuICAgICAgICAgICAgLy91c2VybmFtZTogdXNlcm5hbWUsXFxuICAgICAgICAgICAgLy9wYXNzd29yZDogcGFzc3dvcmRcXG4gICAgICAgIH0sXFxuICAgICAgICBwaWNfdXJsOiBpdGVtLnBpYyxcXG4gICAgfSlcXG59XFxuaWYgKHJ1bGVMaXN0Lmxlbmd0aCA9PT0gMCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCI8aDUgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz7lv6vmnaXkuIrkvKDkvaDnmoTnrKzkuIDmnaHop4TliJnlkKfvvIE8L2g1PlxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSk7XFxufVxcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuinhOWImeivpue7hi1kZXZcIixcInBhdGhcIjpcIm1hbmFnZVJ1bGVcIixcInJ1bGVcIjpcImpzOlxcbiAgICBjb25zdCB7XFxuICAgICAgICBnZXRBcGksXFxuICAgICAgICBjb2xvcixcXG4gICAgICAgIHNtYWxsLFxcbiAgICAgICAgZ2V0RmlsZSxcXG4gICAgICAgIGV4aXN0RmlsZSxcXG4gICAgICAgIG1hcENvbFR5cGUsXFxuICAgICAgICBodG1sVGFnLFxcbiAgICAgICAgYXBpXFxuICAgIH0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5sZXQge1xcbiAgICBpZFxcbn0gPSBNWV9QQVJBTVM7XFxubGV0IHtcXG4gICAgdXNlcm5hbWUsXFxuICAgIHBhc3N3b3JkLFxcbn0gPSBnZXRGaWxlKCk7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbn0pKTtcXG5sZXQgZGF0YUl0ZW0gPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXCJnZXRieWlkXFxcIikgKyBcXFwiP2lkPVxcXCIgKyBpZCkpLnJlc3VsdDtcXG5zZXRQYWdlVGl0bGUoXFxcIue8lui+keOAjFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcIuOAjVxcXCIpO1xcbmxldCByZXFCeUdldCA9IFxcXCI/aWQ9XFxcIiArIGRhdGFJdGVtLmlkICsgXFxcIiZxcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZDtcXG5sZXQgcnVsZUxpc3RKc29uID0gZ2V0QXBpKFxcXCJydWxlTGlzdEpzb25cXFwiKSArIFxcXCI/aWQ9XFxcIjtcXG5sZXQgZGF0YSA9IFtdO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi54mI5pysXFxcIiksXFxuICAgIGRlc2M6IFxcXCLigJzigJzigJ3igJ3kupHnq6/niYjmnKw6XFxcIiArIGNvbG9yKGRhdGFJdGVtLnZlciwgXFxcIiM1Y2ZmMmNcXFwiKSArIFxcXCJcXFxcbuS4iuasoeaPkOS6pOS6jjogW1xcXCIgKyBjb2xvcihkYXRhSXRlbS5sYXN0X3VwZGF0ZSwgXFxcIiNmZjcwMDBcXFwiKSArIFxcXCJdXFxcIixcXG4gICAgdXJsOiAkKFxcXCI85byA5Y+R6ICFPlxcXFxuXFxcIiArIGRhdGFJdGVtLmF1dGhvciArIFxcXCJcXFxcbjzlkI3np7A+XFxcXG5cXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCJcXFxcbjzkupHnq6/niYjmnKw+XFxcXG5cXFwiICsgZGF0YUl0ZW0udmVyICsgXFxcIlxcXFxuPOabtOaWsOaXtumXtD5cXFxcbltcXFwiICsgZGF0YUl0ZW0ubGFzdF91cGRhdGUgKyBcXFwiXVxcXCIpLmNvbmZpcm0oKCkgPT4ge30pLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMSdcXG59KTtcXG5sZXQgZGF0YVR5cGUgPSB7XFxuICAgIGhvbWVfcnVsZV91cmw6ICfpppbpobXkupHop4TliJknLFxcbiAgICBwdWJsaXNoOiAn5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZJyxcXG4gICAganNfdXJsOiAn572R6aG15o+S5Lu26KeE5YiZJyxcXG4gICAgaHRtbDogJ+mdmeaAgemhtemdoicsXFxuICAgIGNvbmZpZzogJ+S4u+mhtemFjee9ridcXG59O1xcblxcbmxldCBiYXNpYyA9IHtcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbn07XFxubGV0IGRhdGFUeXBlVGlwcyA9IGRhdGFUeXBlW2RhdGFJdGVtLmRhdGFfdHlwZV0gfHwgJ+acquefpeinhOWImTonICsgZGF0YUl0ZW0uZGF0YV90eXBlO1xcblxcbmJhc2ljLnRpdGxlID0gaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuexu+Wei1xcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChcXFwiKGlkOlxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXCIpXFxcIik7XFxuYmFzaWMuZGVzYyA9IFxcXCLmlbDmja7nsbvlnovvvJpcXFwiICsgY29sb3IoZGF0YVR5cGVUaXBzLCBcXFwiI2NiNTRmZlxcXCIpICsgXFxcIlxcXFxu5YiG5Lqr54q25oCB5Li677yaXFxcIiArIGRhdGFJdGVtLnN0YXRlO1xcbmlmIChbXFxcImh0bWxcXFwiLCBcXFwiY29uZmlnXFxcIiwgXFxcImpzX3VybFxcXCJdLmluY2x1ZGVzKGRhdGFJdGVtLmRhdGFfdHlwZSkpIHtcXG4gICAgYmFzaWMuZGVzYyArPSBcXFwiXFxcXG7igJzigJzigJ3igJ0gPT5cXFwiICsgc21hbGwoXFxcIueCueatpOmihOiniFxcXCIpO1xcbiAgICBiYXNpYy51cmwgPSBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXG59XFxubGV0IGF1dGggPSBcXFwiXFxcIjtcXG5pZiAoZGF0YUl0ZW0uc3RhdGUgPT0gXFxcInByaXZhdGVcXFwiKSB7XFxuICAgIGxldCBhdXRoX2JhY2sgPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXCJhdXRoXFxcIikgKyByZXFCeUdldCkpO1xcbiAgICBiYXNpYy50aXRsZSA9IGJhc2ljLnRpdGxlICsgXFxcIlxcXFxuXFxcIiArIHNtYWxsKGNvbG9yKGF1dGhfYmFjay5yZXN1bHQsIFxcXCJncmV5XFxcIikpO1xcbiAgICBhdXRoID0gJyZhdXRoPScgKyBhdXRoX2JhY2sucmVzdWx0O1xcbiAgICBiYXNpYy51cmwgPSBiYXNpYy51cmwgPT09IFxcXCJoaWtlcjovL2VtcHR5XFxcIiA/IGJhc2ljLnVybCA6IGJhc2ljLnVybCArIGF1dGg7XFxufVxcbmRhdGEucHVzaChiYXNpYyk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLmk43kvZxcXFwiKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJ0b2FzdDovL+S9oOaJjeaYr+acgOW4heeahOmCo+S4quS6uu+8gVxcXCJcXG59KTtcXG5sZXQgaW1wb3J0VXJsLCBydWxlQ29kZSwgc2hhcmVVcmwsIGJhY2tDb2RlID0gXFxcIlxcXCI7XFxubGV0IHN1YlVybCA9IHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgYXV0aDtcXG5pZiAoIWRhdGFJdGVtLmlzX2pzb24pIHtcXG4gICAgYmFja0NvZGUgPSByZXF1ZXN0KHN1YlVybCk7XFxufVxcbnN3aXRjaCAoZGF0YUl0ZW0uZGF0YV90eXBlKSB7XFxuICAgIGNhc2UgXFxcImhvbWVfcnVsZV91cmxcXFwiOlxcbiAgICAgICAgcnVsZUNvZGUgPSBcXFwi5rW36ZiU6KeG55WM6aaW6aG16aKR6YGT6KeE5YiZ44CQXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFwi44CR77+laG9tZV9ydWxlX3VybO+/pVxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArIGF1dGg7XFxuICAgICAgICBpbXBvcnRVcmwgPSBcXFwicnVsZTovL1xcXCIgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpXFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAncHVibGlzaCc6XFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJonICsgZGF0YUl0ZW0ubmFtZSArICfvv6VwdWJsaXNo77+lJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgJ2pzX3VybCc6XFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJrnvZHpobXmj5Lku7bvv6Vqc191cmzvv6UnICsgZGF0YUl0ZW0ubmFtZSArICdAYmFzZTY0Oi8vJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgJ2h0bWwnOlxcbiAgICAgICAgbGV0IGZpbGVfdG1wID0gZGF0YUl0ZW0ubmFtZS5zcGxpdCgnLicpO1xcbiAgICAgICAgbGV0IGZpbGVfcGF0aCA9IGZpbGVfdG1wLmxlbmd0aCA+IDEgPyBmaWxlX3RtcFtmaWxlX3RtcC5sZW5ndGggLSAxXSArIFxcXCIvXFxcIiArIGRhdGFJdGVtLm5hbWUgOiBkYXRhSXRlbS5uYW1lO1xcbiAgICAgICAgcnVsZUNvZGUgPSBcXFwi5rW36ZiU6KeG55WM5pys5Zyw5paH5Lu25YiG5Lqr77+lZmlsZV91cmzvv6VoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvXFxcIiArIGZpbGVfcGF0aCArIFxcXCJAXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgYXV0aDtcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICBicmVha1xcbiAgICBjYXNlIFxcXCJjb25maWdcXFwiOlxcbiAgICAgICAgaW1wb3J0VXJsID0gJCgpLnJ1bGUocGFzc3dvcmQgPT4ge1xcbiAgICAgICAgICAgIGV2YWwoZmV0Y2goXFxcImhpa2VyOi8vYXNzZXRzL2hvbWUuanNcXFwiKSk7XFxuICAgICAgICAgICAgSGlrZXJIb21lLmxvYWQoXFxcImltcG9ydFxcXCIsIHBhc3N3b3JkKTtcXG4gICAgICAgIH0sIGJhY2tDb2RlKTtcXG4gICAgICAgIGJyZWFrO1xcbn1cXG5sZXQgbXlfY29sX3R5cGUgPSBcXFwidGV4dF8yXFxcIjtcXG5pZiAoaW1wb3J0VXJsKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWvvOWFpeinhOWImVxcXCIsXFxuICAgICAgICB1cmw6IGltcG9ydFVybCxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9KTtcXG4gICAgaWYoZGF0YUl0ZW0uaXNfanNvbl9saXN0JiYvaG9tZV9ydWxlX3VybHxodG1sLy50ZXN0KGRhdGFJdGVtLmRhdGFfdHlwZSkpe1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXCJjb2xvcjogI2ZmNzAwMFxcXCI+5a+85YWl6YGT5b6357uPPC9zcGFuPicsXFxuICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRhdGFJdGVtLHN1YlVybCk9PntcXG4gICAgICAgICAgICAgICAgLy8gbGV0IHRpdGxlID0gXFxcIkgtXFxcIitkYXRhSXRlbS5uYW1lK1xcXCIuXFxcIitkYXRhSXRlbS5hdXRob3I7XFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IFxcXCJKLVxcXCIrZGF0YUl0ZW0ubmFtZS5zcGxpdCgnLicpWzBdO1xcbiAgICAgICAgICAgICAgICBsZXQgc3ViT2JqID0ge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBzdWJVcmwsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL3J1bGVDYWNoZS9cXFwiK3RpdGxlK1xcXCIuanNvblxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiBcXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsLy/npoHnlKjlubblj5Hmm7TmlrBcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgc2hhcmVUZXh0ID0gYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHN1Yk9iaikpO1xcbiAgICAgICAgICAgICAgICB2YXIgcGFzdGVzID0gZ2V0UGFzdGVzKCk7XFxuICAgICAgICAgICAgICAgIHZhciB1cmwgPSBzaGFyZVBhc3RlKHNoYXJlVGV4dCxwYXN0ZXMuc2xpY2UoLTEpWzBdKTtcXG4gICAgICAgICAgICAgICAgbGV0IGltcG9ydF9ydWxlPSBcXFwi6L275ZCI6ZuG6K6i6ZiF77yaXFxcIit0aXRsZSsnXFxcXG4nK3VybDtcXG4gICAgICAgICAgICAgICAgY29weShpbXBvcnRfcnVsZSk7XFxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSAnaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL3J1bGVDYWNoZS9zdWIuanNvbic7XFxuICAgICAgICAgICAgICAgIHJlcXVpcmUoZ2V0VmFyKCdzdWLkvp3otZYnLCdodHRwczovL2dpdGNvZGUubmV0L3FxXzMyMzk0MzUxL2RyLy0vcmF3L21hc3Rlci9qcy9zdWJzY3JpYmUuanMnKSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiDorqLpmIXlr7zlhaUocGF0aClcXG4gICAgICAgICAgICB9LGRhdGFJdGVtLHN1YlVybCksXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5pZiAocnVsZUNvZGUpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5YiG5Lqr6KeE5YiZXFxcIixcXG4gICAgICAgIHVybDogXFxcImNvcHk6Ly9cXFwiICsgcnVsZUNvZGUsXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSk7XFxufVxcblxcbmZ1bmN0aW9uIHNldFNldHRpbmdJdGVtKGJhc2ljLCBwYXR0ZXJuKSB7XFxuICAgIGxldCB0ZW1wID0ge1xcbiAgICAgICAgdGl0bGU6IGJhc2ljLnRpdGxlLFxcbiAgICAgICAgY29sX3R5cGU6IGJhc2ljLmNvbF90eXBlLFxcbiAgICAgICAgdXJsOiAkKGJhc2ljLmNvbmZpcm0pLmNvbmZpcm0oKHVybCwgbXNnLCBwYXR0ZXJuKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGJhY2tBID0gcmVxdWVzdCh1cmwpO1xcbiAgICAgICAgICAgIGxldCByZXQgPSBKU09OLnBhcnNlKGJhY2tBKTtcXG4gICAgICAgICAgICBpZiAocmV0LnN0YXR1cyA9PSAwKSB7XFxuICAgICAgICAgICAgICAgIHBhdHRlcm4gPyBiYWNrKCkgOiByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgbXNnWzBdO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHBhdHRlcm4gPyBiYWNrKCkgOiByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgbXNnWzFdICsgXFxcIlxcXFxuXFxcIiArIHJldC5kZXRhaWw7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgYmFzaWMudXJsLCBiYXNpYy5tc2csIHBhdHRlcm4pXFxuICAgIH07XFxuICAgIHJldHVybiB0ZW1wO1xcbn1cXG5pZiAoZGF0YUl0ZW0uc3RhdGUgPT0gJ3ByaXZhdGUnKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuiuvuS4uuWFrOW8gFxcXCIsXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXCJzaGFyZVxcXCIpICsgcmVxQnlHZXQgKyBcXFwiJmZsYWdcXFwiICsgXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIHJlcXVlc3QoaW5wdXQpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey6K6+5Li65YWs5byAXFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0sIHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6ZqP5py65a+G6ZKlXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZSxcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcImdlbkF1dGhcXFwiKSArIHJlcUJ5R2V0ICsgXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBiYWNrID0gcmVxdWVzdChpbnB1dCk7XFxuICAgICAgICAgICAgbGV0IHJldCA9IEpTT04ucGFyc2UoYmFjayk7XFxuICAgICAgICAgICAgaWYgKHJldC5zdGF0dXMgPT0gMCkge1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7LnlJ/miJDpmo/mnLrlr4bnoIFcXFxcblxcXCIgKyByZXQucmVzdWx0XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/pmo/mnLrlr4bnoIHnlJ/miJDlpLHotKVcXFwiXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgfSk7XFxuICAgIGxldCB0aW1lT3ZlciA9IHtcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9O1xcbiAgICBpZiAoZGF0YUl0ZW0udGltZV9vdmVyKSB7XFxuICAgICAgICB0aW1lT3Zlci50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXCLnn63ml7blr4bpkqVcXFwiLCBcXFwiZ3JlZW5cXFwiKSArIGNvbG9yKFxcXCIo4oaS5rC45LmFKVxcXCIsIFxcXCJyZWRcXFwiKSk7XFxuICAgICAgICB0aW1lT3Zlci51cmwgPSBnZXRBcGkoXFxcInRpbWVvdmVyXFxcIikgKyByZXFCeUdldCArIFxcXCImZmxhZz0xXFxcIjtcXG4gICAgICAgIHRpbWVPdmVyLmNvbmZpcm0gPSBcXFwi5piv5ZCm56Gu6K6k5Lul5ZCO55qE56eB6JeP6KeE5YiZ5YiG5Lqr5LiN6L+H5pyfP1xcXCI7XFxuICAgICAgICB0aW1lT3Zlci5tc2cgPSBbXFxcIuW3suiuvuS4uuawuOS5hVxcXCIsIFxcXCLorr7kuLrmsLjkuYXlpLHotKVcXFwiXTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHRpbWVPdmVyLnRpdGxlID0gc21hbGwoY29sb3IoXFxcIuawuOS5heWvhumSpVxcXCIsIFxcXCJyZWRcXFwiKSArIGNvbG9yKFxcXCIo4oaS55+t5pe2KVxcXCIsIFxcXCJncmVlblxcXCIpKTtcXG4gICAgICAgIHRpbWVPdmVyLnVybCA9IGdldEFwaShcXFwidGltZW92ZXJcXFwiKSArIHJlcUJ5R2V0O1xcbiAgICAgICAgdGltZU92ZXIuY29uZmlybSA9IFxcXCLnoa7orqTopoHku6XlkI7liIbkuqvnmoTnp4Hol4/op4TliJnoh6rliqjliLDmnJ8/XFxcIjtcXG4gICAgICAgIHRpbWVPdmVyLm1zZyA9IFtcXFwi5bey6K6+5Li66L+H5pyfXFxcIiwgXFxcIuiuvuS4uui/h+acn+Wksei0pVxcXCJdO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaChzZXRTZXR0aW5nSXRlbSh0aW1lT3ZlcikpO1xcbn0gZWxzZSBpZiAoZGF0YUl0ZW0uc3RhdGUgPT0gJ3B1YmxpYycpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6K6+5Li656eB5pyJXFxcIixcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcInNoYXJlXFxcIikgKyByZXFCeUdldCArIFxcXCImZmxhZz0xI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgcmVxdWVzdChpbnB1dCk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lorr7kuLrnp4HmnIlcXFwiO1xcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSk7XFxufVxcbmRhdGEucHVzaChzZXRTZXR0aW5nSXRlbSh7XFxuICAgIHRpdGxlOiBcXFwi5Yig6Zmk5pWw5o2uXFxcIixcXG4gICAgY29uZmlybTogXFxcIuaYr+WQpuehruiupOWIoOmZpFxcXCIsXFxuICAgIG1zZzogW1xcXCLlt7LliKDpmaRcXFwiLCBcXFwi5Yig6Zmk5aSx6LSlXFxcIl0sXFxuICAgIHVybDogZ2V0QXBpKFxcXCJkZWxldGVVcmxcXFwiKSArIHJlcUJ5R2V0LFxcbiAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG59LCB0cnVlKSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLorr7nva7lm77moIdcXFwiLFxcbiAgICB1cmw6ICQoZGF0YUl0ZW0ucGljX3VybCwgXFxcIui+k+WFpeWbvuagh+WcsOWdgFxcXCIpLmlucHV0KGFwaSA9PiB7XFxuICAgICAgICBpZiAoaW5wdXQgPT09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S9oOWcqOmAl+aIkemTvuaOpeWTqj9cXFwiXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChhcGkgKyBcXFwiJnJ1bGVfcGljPVxcXCIgKyBpbnB1dCk7XFxuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XFxuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFwiO1xcbiAgICB9LCBnZXRBcGkoXFxcInNldF9ydWxlX3BpY1xcXCIpICsgZGF0YUl0ZW0uaWQgKyByZXFCeUdldCksXFxuICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbn0pO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBkYXRhSXRlbS5jYW5fZGlzY3VzcyA/IFxcXCLnpoHmraLor4TorrpcXFwiIDogXFxcIuW8gOWQr+ivhOiuulxcXCIsXFxuICAgIHVybDogJChhcGkuZGlzX3NldCArIGRhdGFJdGVtLmlkICsgcmVxQnlHZXQgKyBcXFwiJnN0YXRlPVxcXCIgKyAoZGF0YUl0ZW0uY2FuX2Rpc2N1c3MgPyBcXFwiXFxcIiA6IDEpKS5sYXp5UnVsZSgoY2FuX2Rpc2N1c3MpID0+IHtcXG4gICAgICAgIHJlcXVlc3QoaW5wdXQpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIGNhbl9kaXNjdXNzID8gXFxcInRvYXN0Oi8v5bey56aB5q2i6K+E6K66XFxcIiA6IFxcXCJ0b2FzdDovL+W3suW8gOWQr+ivhOiuulxcXCI7XFxuICAgIH0sIGRhdGFJdGVtLmNhbl9kaXNjdXNzKSxcXG4gICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxufSk7XFxuTVlfUEFSQU1TLm5hbWUgPSBkYXRhSXRlbS5uYW1lO1xcbk1ZX1BBUkFNUy51c2VybmFtZT11c2VybmFtZTtcXG5NWV9QQVJBTVMucGFzc3dvcmQ9cGFzc3dvcmQ7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLorr7nva7lpIfms6hcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2Uvc2V0X3J1bGVfbm90ZXNcXFwiLFxcbiAgICBleHRyYTogTVlfUEFSQU1TLFxcbiAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG59KTtcXG5pZiAoZGF0YUl0ZW0uaXNfanNvbiAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT09IFxcXCJob21lX3J1bGVfdXJsXFxcIiAmJiAhZGF0YUl0ZW0uaXNfanNvbl9saXN0KSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+i/m+WFpemikemBkycsXFxuICAgICAgICB1cmw6ICQoIC8qXFxcIiNub0xvYWRpbmcjXFxcIiovICkubGF6eVJ1bGUoKG5hbWUsaG9tZSkgPT4ge1xcbiAgICAgICAgICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChob21lKSk7XFxuICAgICAgICAgICAgbGV0IGhhc1J1bGUgPSBydWxlTGlzdC5zb21lKGl0ZW0gPT4gaXRlbS50aXRsZSA9PT0gbmFtZSk7XFxuICAgICAgICAgICAgaWYgKGhhc1J1bGUpIHtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIsIFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvbWUrXFxcInNAXFxcIiArIG5hbWU7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acquWuieijhVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgZGF0YUl0ZW0ubmFtZSxhcGkuaG9tZSksXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSk7XFxufVxcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogZGF0YUl0ZW0uZ29vZF9udW0sXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6LWeLnN2Z1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF8zXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogZGF0YUl0ZW0uYmFkX251bSxcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/ouKkuc3ZnXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6K+E6K66XFxcIixcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/or4Torrouc3ZnXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvUmVwbHkjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHJ1bGVJZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5hdXRob3IsXFxuICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXFxuICAgICAgICB1c2VybmFtZTogdXNlcm5hbWVcXG4gICAgfVxcbn0pO1xcbmxldCB0b3RhbFN1bSA9IGRhdGFJdGVtLmdvb2RfbnVtICsgZGF0YUl0ZW0uYmFkX251bTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuivhOiuuihcXFwiICsgdG90YWxTdW0gKyBcXFwiKVxcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChodG1sVGFnKFxcXCJ1XFxcIiwgXFxcIuafpeeci+WFqOmDqOivhOiuuijmjqfor4QpID5cXFwiKSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL0NvbW1lbnRcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eSNmeXBhZ2Ujbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgIHRvdGFsU3VtOiB0b3RhbFN1bSxcXG4gICAgICAgIG5vX2FjdGl2ZTogdHJ1ZSxcXG4gICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcXG4gICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZFxcbiAgICB9XFxufSk7XFxuLy9jb25zdCBsb25nZXN0U3VtPTEyMDtcXG5sZXQgaWNvbiA9IHtcXG4gICAgXFxcImdvb2RcXFwiOiBcXFwi8J+RjVxcXCIsXFxuICAgIFxcXCJiYWRcXFwiOiBcXFwi8J+RjlxcXCIsXFxuICAgIFxcXCJyZXBseVxcXCI6IFxcXCLlvIDlj5HogIXwn5ejXFxcIlxcbn1cXG5pZiAodG90YWxTdW0gPT09IDApIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwiPGg1IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+5LiA5p2h6K+E6K665Lmf5rKh5pyJ77yM5b+r5p2l5oqi5rKZ5Y+R5ZCn77yBPC9oNT5cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0pO1xcbn0gZWxzZSB7XFxuICAgIGxldCBjb21tZW50TGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuZGlzX2dldCArIGRhdGFJdGVtLmlkICsgXFxcIj9saW1pdD01XFxcIikpLnJlc3VsdDtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjb21tZW50TGlzdCkge1xcbiAgICAgICAgbGV0IFJlcGx5ID0gaXRlbS5kaXNjdXNzX3R5cGU9PT1cXFwicmVwbHlcXFwiJiZpdGVtLnJlcGx5X3RvX25hbWUhPT1mYWxzZSYmaXRlbS5yZXBseV90b19pZCE9PWZhbHNlP1xcXCLigJjigJjlm57lpI1AXFxcIitpdGVtLnJlcGx5X3RvX25hbWUrXFxcIiAjXFxcIitpdGVtLmRpc2N1c3NfaWQrXFxcIuKAmeKAmVxcXFxuXFxcIjpcXFwiXFxcIjtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0ubmFtZSArIFxcXCImbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0nZ3JheSc+PHNtYWxsPiNcXFwiICsgaXRlbS5pZCArIFxcXCI8L3NtYWxsPjxmb250PlxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9SZXBseVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6e1xcbiAgICAgICAgICAgICAgICBydWxlSWQ6IGRhdGFJdGVtLmlkLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXFxuICAgICAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcXG4gICAgICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxcbiAgICAgICAgICAgICAgICByZXBseUlkOml0ZW0uaWRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXG4gICAgICAgICAgICBkZXNjOiBSZXBseStpdGVtLmNyZWF0ZV9kYXRlICsgXFxcIsK3XFxcIiArIGljb25baXRlbS5kaXNjdXNzX3R5cGVdLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICB0eXBlOiBcXFwibG9uZ190ZXh0XFxcIixcXG4gICAgICAgICAgICAgICAgdGV4dDogaXRlbS5kaXNjdXNzX3RleHRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcImljb25fMl9yb3VuZFwiLFwibmFtZVwiOlwi6KeE5YiZ5YiX6KGoXCIsXCJwYXRoXCI6XCJydWxlc1wiLFwicnVsZVwiOlwianM6XFxuICAgIGFkZExpc3RlbmVyKCdvbkNsb3NlJywkLnRvU3RyaW5nKCgpPT57XFxuICAgICAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiKTtcXG4gICAgICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuZmlsdGVyXFxcIik7XFxuICAgICAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLnR5cGVcXFwiKTtcXG4gICAgICAgIGlmKGdldFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnLCcnKSl7XFxuICAgICAgICAgICAgbG9nKCfmk43kvZzov4fnpoHmraLkuIrkvKA6JytnZXRWYXIoJ1dhcmVob3VzZS5jYW5fdXBsb2FkJykpO1xcbiAgICAgICAgICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuY2FuX3VwbG9hZFxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgfVxcbiAgICB9KSk7XFxuXFxuaWYgKGdldFZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiKSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgIGJhY2soZmFsc2UpO1xcbn1cXG5cXG5jb25zdCB7XFxuICAgIGdldEFwaSxcXG4gICAgYXBpLFxcbiAgICBjb2xvcixcXG4gICAgc21hbGwsXFxuICAgIGxvY2FsUnVsZVZlcixcXG4gICAgaHRtbFRhZyxcXG4gICAgbWRcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxuY29uc3QgeyBtZXJnZVNvcnQgfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3NvcnRcXFwiKTtcXG5sZXQge1xcbiAgICBhdmF0YXJVcmwsXFxuICAgIHFxLFxcbiAgICBpZCxcXG4gICAgY2FuX3VwbG9hZFxcbn0gPSBNWV9QQVJBTVM7XFxubGV0IGRhdGFUeXBlID0gZ2V0VmFyKFxcXCJXYXJlaG91c2UudHlwZVxcXCIsXFxcIlxcXCIpO1xcbmxldCBiYWNrQ29kZSA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcInJ1bGVzVXJsXFxcIikgKyBcXFwiP25hbWU9XFxcIiArIHFxK1xcXCImZGF0YV90eXBlPVxcXCIrZGF0YVR5cGUpKTtcXG5sZXQgZGV2TmFtZSA9IGJhY2tDb2RlLmRldl9uYW1lO1xcbnB1dFZhcihcXFwiV2FyZWhvdXNlLmZpbHRlclxcXCIsIGRldk5hbWUpO1xcbmxldCBydWxlTGlzdCA9IGJhY2tDb2RlLnJlc3VsdDtcXG5sZXQgc3ViVXJsID0gZ2V0QXBpKFxcXCJqc29uTGlzdFxcXCIpICsgXFxcIj9uYW1lPVxcXCIgKyBxcTtcXG5sZXQgaGFzU3ViID0gaGFzSG9tZVN1YihzdWJVcmwpO1xcbmxldCBkZXZJbmZvID0gXFxcIui/meS4quS6uuW+iOaHkizku4DkuYjpg73msqHlhpnlk6Z+XFxcIjtcXG5sZXQgdG1wSnNvbiA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcImluZm9HZXRVcmxcXFwiKSArIHFxKSk7XFxuaWYgKHRtcEpzb24uc3RhdHVzID09IDApIHtcXG4gICAgZGV2SW5mbyA9IHRtcEpzb24ucmVzdWx0IHx8IGRldkluZm87XFxufVxcbmxldCBzdWJGbGFnID0gaGFzU3ViID8gJ/CfhpcnIDogJ/Cfk6EnO1xcbmxldCBkYXRhID0gW107XFxucmVxdWlyZShtZCk7XFxuZGV2SW5mbz1tYXJrZWQucGFyc2UoZGV2SW5mbyk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgZGV2TmFtZSArIFxcXCJcXFxcblxcXFxuXFxcIiArIHNtYWxsKGh0bWxUYWcoXFxcInVcXFwiLCBcXFwi54K55Ye75p+l55yL5a6M5pW05YWs5ZGKXFxcIikpLFxcbiAgICBkZXNjOiBzbWFsbChkZXZJbmZvKSxcXG4gICAgdXJsOiAnaGlrZXI6Ly9wYWdlL2luZm8nLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGV4dDogZGV2SW5mbyxcXG4gICAgICAgIG5hbWU6IGRldk5hbWUsXFxuICAgICAgICB0eXBlOlxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0sXFxuICAgIHBpY191cmw6IGF2YXRhclVybCxcXG4gICAgY29sX3R5cGU6ICdtb3ZpZV8xX3ZlcnRpY2FsX3BpYydcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIjxiaWc+6K6i6ZiF566h55CGPC9iaWc+Jm5ic3A7Jm5ic3A7PHNtYWxsPijlvZPliY1cXFwiICsgKGhhc1N1YiA/IFxcXCLlt7LorqLpmIVcXFwiIDogXFxcIuacquiuoumYhVxcXCIpICsgXFxcIik8L3NtYWxsPlxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcblxcbmxldCBzdWJfY29kZSA9ICfmtbfpmJTop4bnlYzlkIjpm4bop4TliJnorqLpmIXvv6Vob21lX3N1Yu+/pScgKyBkZXZOYW1lICsgXFxcIuWQiOmbhkBAXFxcIiArIHN1YlVybDtcXG5sZXQgcnVsZXNDb2RlID0gJ+a1t+mYlOinhueVjOWQiOmbhuinhOWIme+/pWhvbWVfcnVsZV91cmzvv6UnICsgc3ViVXJsO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjZmY3MDAwXFxcIj7kuIDplK7orqLpmIU8L3NwYW4+JyxcXG4gICAgZGVzYzogJ+iuoumYheKAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXCJjb2xvcjogIzVjZmYyY1xcXCI+JyArIGRldk5hbWUgKyAnPC9zcGFuPueahOaJgOacieWNleinhOWIme+8jOWQiOmbhumcgOWNleeLrOiuoumYhScsXFxuICAgIHVybDogc3ViX2NvZGUsXFxuICAgIGNvbF90eXBlOiAndGV4dF8yJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjZmY3MDAwXFxcIj7lr7zlhaXlhajpg6g8L3NwYW4+JyxcXG4gICAgdXJsOiBydWxlc0NvZGUsXFxuICAgIGNvbF90eXBlOiAndGV4dF8yJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjZmY3MDAwXFxcIj7lr7zlhaXovbvlkIjpm4Y8L3NwYW4+JyxcXG4gICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRldk5hbWUsc3ViVXJsLGF2YXRhclVybCk9PntcXG4gICAgICAgIGNvbnN0IHtnZW5SdWxlfT0kLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9nZW5BcGlcXFwiKTtcXG4gICAgICAgIGxvZyhcXFwi6L275ZCI6ZuG5Zu+5qCH6ZO+5o6lOlxcXCIrYXZhdGFyVXJsKTtcXG4gICAgICAgIGxldCBpbXBvcnRfcnVsZT1nZW5SdWxlKFxcXCLovbvlkIjpm4YuXFxcIitkZXZOYW1lLHN1YlVybCxhdmF0YXJVcmwpO1xcbiAgICAgICAgLy9jb3B5KGltcG9ydF9ydWxlKTtcXG4gICAgICAgIGxldCBydWxlQ29kZT1wYXJzZVBhc3RlKGltcG9ydF9ydWxlLnNwbGl0KFxcXCJcXFxcblxcXCIpWzBdKTtcXG4gICAgICAgIC8vcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgIHJldHVybiBpbXBvcnRVcmxcXG4gICAgfSxkZXZOYW1lLHN1YlVybCxhdmF0YXJVcmwpLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMidcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXCJjb2xvcjogI2ZmNzAwMFxcXCI+5a+85YWl6YGT5b6357uPPC9zcGFuPicsXFxuICAgIHVybDogJCgpLmxhenlSdWxlKChkZXZOYW1lLHN1YlVybCxhdmF0YXJVcmwpPT57XFxuICAgICAgICBsZXQgdGl0bGUgPSBcXFwiSC1cXFwiK2Rldk5hbWU7XFxuICAgICAgICBsZXQgc3ViT2JqID0ge1xcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICB1cmw6IHN1YlVybCxcXG4gICAgICAgICAgICBkZXNjOiBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL3J1bGVDYWNoZS9cXFwiK3RpdGxlK1xcXCIuanNvblxcXCIsXFxuICAgICAgICAgICAgY29kZTogXFxcIlxcXCIsXFxuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSwvL+emgeeUqOW5tuWPkeabtOaWsFxcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHNoYXJlVGV4dCA9IGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShzdWJPYmopKTtcXG4gICAgICAgIHZhciBwYXN0ZXMgPSBnZXRQYXN0ZXMoKTtcXG4gICAgICAgIHZhciB1cmwgPSBzaGFyZVBhc3RlKHNoYXJlVGV4dCxwYXN0ZXMuc2xpY2UoLTEpWzBdKTtcXG4gICAgICAgIGxldCBpbXBvcnRfcnVsZT0gXFxcIui9u+WQiOmbhuiuoumYhe+8mlxcXCIrdGl0bGUrJ1xcXFxuJyt1cmw7XFxuICAgICAgICBjb3B5KGltcG9ydF9ydWxlKTtcXG4gICAgICAgIGNvbnN0IHBhdGggPSAnaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL3J1bGVDYWNoZS9zdWIuanNvbic7XFxuICAgICAgICByZXF1aXJlKGdldFZhcignc3Vi5L6d6LWWJywnaHR0cHM6Ly9naXRjb2RlLm5ldC9xcV8zMjM5NDM1MS9kci8tL3Jhdy9tYXN0ZXIvanMvc3Vic2NyaWJlLmpzJykpO1xcbiAgICAgICAgcmV0dXJuIOiuoumYheWvvOWFpShwYXRoKVxcbiAgICB9LGRldk5hbWUsc3ViVXJsLGF2YXRhclVybCksXFxuICAgIGNvbF90eXBlOiAndGV4dF8yJ1xcbn0pO1xcbmxldCBjYW5fdXBsb2FkX2FwaSA9IGdldEFwaShcXFwibWFuQ2FuVXBsb2FkXFxcIikraWQ7XFxuaWYoZ2V0VmFyKCdob3VzZS5pc19tYW5hZ2VyJykpe1xcbiAgICBsZXQgdGlwcyA9IGNhbl91cGxvYWQ/J+iDvSc6J+WQpic7XFxuICAgIC8vIGxvZygndGlwczonK3RpcHMpO1xcbiAgICAvLyBsb2coJ2Nhbl91cGxvYWQ6JytjYW5fdXBsb2FkKTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifimqDog73lkKbkuIrkvKA6JysoZ2V0VmFyKCdXYXJlaG91c2UuY2FuX3VwbG9hZCcpfHx0aXBzKSxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDonaGlrZXI6Ly9lbXB0eSdcXG4gICAgfSk7XFxuICAgIGZ1bmN0aW9uIHNldFVwbG9hZChmbGFnLGNhbl91cGxvYWRfYXBpKSB7XFxuICAgICAgICBmbGFnID0gZmxhZyB8fCAnJztcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IGNvZGUgPSBmZXRjaChjYW5fdXBsb2FkX2FwaSwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcIlVzZXItQWdlbnRcXFwiOiBNT0JJTEVfVUF9LFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1c2VybmFtZVxcXCI6IGdldFZhcignaG91c2UudXNlcm5hbWUnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogZ2V0VmFyKCdob3VzZS5wYXNzd29yZCcpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiY2FuX3VwbG9hZFxcXCI6ICEhZmxhZ1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGNvZGUgPSBKU09OLnBhcnNlKGNvZGUpLnJlc3VsdDtcXG4gICAgICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBlLm1lc3NhZ2VcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6J/CfmqvnpoHmraLkuIrkvKAnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+emgeatouivpeW8gOWPkeiAheS4iuS8oOinhOWImT/kvaDnmoTmk43kvZzlsIbooqvns7vnu5/orrDlvZUnKS5jb25maXJtKChpZCxjYW5fdXBsb2FkX2FwaSxzZXRVcGxvYWQpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldFVwbG9hZChmYWxzZSxjYW5fdXBsb2FkX2FwaSk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHB1dFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnLCflkKYnKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXG4gICAgICAgIH0saWQsY2FuX3VwbG9hZF9hcGksc2V0VXBsb2FkKVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifinIXlhYHorrjkuIrkvKAnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+WFgeiuuOivpeW8gOWPkeiAheS4iuS8oOinhOWImT/kvaDnmoTmk43kvZzlsIbooqvns7vnu5/orrDlvZUnKS5jb25maXJtKChpZCxjYW5fdXBsb2FkX2FwaSxzZXRVcGxvYWQpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldFVwbG9hZCh0cnVlLGNhbl91cGxvYWRfYXBpKTtcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKCdXYXJlaG91c2UuY2FuX3VwbG9hZCcsJ+aYrycpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcbiAgICAgICAgfSxpZCxjYW5fdXBsb2FkX2FwaSxzZXRVcGxvYWQpXFxuICAgIH0pO1xcbn1cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIjxzbWFsbD7mj5DnpLrvvJrlvIDlj5HogIXljZXni6zliIbkuqvnmoTlkIjpm4bmlofku7blj6rog73ljZXni6zlr7zlhaXjgII8L3NtYWxsPlxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwiPGJpZz7op4TliJnliJfooag8L2JpZz4mbmJzcDsmbmJzcDs8c21hbGw+KOWFsVxcXCIgKyBydWxlTGlzdC5sZW5ndGggKyBcXFwi5p2hKTwvc21hbGw+XFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxufSk7XFxubGV0IGRhdGFUeXBlTGlzdCA9IHtcXG4gICAgXFxcIlxcXCI6XFxcIuWFqOmDqFxcXCIsXFxuICAgIFxcXCJob21lX3J1bGVfdXJsXFxcIjogJ+Wwj+eoi+W6jycsXFxuICAgIC8vXFxcInB1Ymxpc2hcXFwiOiAn5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZJyxcXG4gICAgXFxcImpzX3VybFxcXCI6ICfnvZHpobXmj5Lku7YnLFxcbiAgICBcXFwiaHRtbFxcXCI6ICfpnZnmgIHpobXpnaInLFxcbiAgICBcXFwiY29uZmlnXFxcIjogJ+S4u+mimCdcXG59O1xcbmZvcihsZXQga2V5IGluIGRhdGFUeXBlTGlzdCl7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTpkYXRhVHlwZT09PWtleT9cXFwi4oCc4oCcXFxcIitkYXRhVHlwZUxpc3Rba2V5XStcXFwi4oCd4oCdXFxcIjpkYXRhVHlwZUxpc3Rba2V5XSxcXG4gICAgICAgIHVybDokKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChrZXkpPT57XFxuICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UudHlwZVxcXCIsa2V5KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sa2V5KSxcXG4gICAgICAgIGNvbF90eXBlOlxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbiAgICB9KTtcXG59XFxuaWYgKHJ1bGVMaXN0Lmxlbmd0aCA+IDIwKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuaQnOe0olxcXCIsXFxuICAgICAgICB1cmw6ICQudG9TdHJpbmcobmFtZSA9PiBcXFwiaGlrZXI6Ly9zZWFyY2g/cz1cXFwiICsgaW5wdXQgKyBcXFwiJnJ1bGU9XFxcIiArIG5hbWUsIE1ZX1JVTEUudGl0bGUpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICBkZXNjOiBcXFwi5pCc57Si5b2T5YmN5byA5Y+R6ICF55qE6KeE5YiZXFxcIlxcbiAgICB9KTtcXG59XFxubGV0IGhvbWVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5ob21lKSk7XFxubGV0IG1SdWxlTGlzdCA9IFtdO1xcbmZvciAodmFyIGl0ZW0gb2YgcnVsZUxpc3QpIHtcXG4gICAgdmFyIG5hbWUgPSBpdGVtLm5hbWU7XFxuICAgIGlmIChpdGVtLmlzX3RhcCkge1xcbiAgICAgICAgbGV0IGxvY2F0aW9uID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwicnVsZUxpc3RKc29uXFxcIikgKyBcXFwiP2lkPVxcXCIgKyBpdGVtLmlkKSk7XFxuICAgICAgICBpdGVtLmlkID0gbG9jYXRpb24uaWQ7XFxuICAgICAgICBpdGVtLm5hbWUgPSBsb2NhdGlvbi5uYW1lO1xcbiAgICAgICAgaXRlbS5hdXRob3IgPSBsb2NhdGlvbi5hdXRob3I7XFxuICAgICAgICBpdGVtLmRhdGFfdHlwZSA9IGxvY2F0aW9uLmRhdGFfdHlwZTtcXG4gICAgICAgIGl0ZW0udmVyID0gbG9jYXRpb24udmVyXFxuICAgIH1cXG4gICAgaXRlbS52ZXJzaW9uID0gaXRlbS52ZXI7XFxuICAgIGxldCBsYWJlbCA9IFxcXCJcXFwiLFxcbiAgICAgICAgbHZlciA9IC0yO1xcbiAgICBpZiAoaXRlbS5pc19qc29uICYmIGl0ZW0uZGF0YV90eXBlID09PSBcXFwiaG9tZV9ydWxlX3VybFxcXCIpIHtcXG4gICAgICAgIGx2ZXIgPSBsb2NhbFJ1bGVWZXIoaG9tZUxpc3QsIGl0ZW0pO1xcbiAgICAgICAgaWYgKGx2ZXIgPT09IC0xKSB7XFxuICAgICAgICAgICAgbGFiZWwgPSBcXFwi8J+GlVxcXCI7XFxuICAgICAgICB9IGVsc2UgaWYgKGx2ZXIgPCBpdGVtLnZlcikge1xcbiAgICAgICAgICAgIGxhYmVsID0gXFxcIvCfhplcXFwiO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIG1SdWxlTGlzdC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBsYWJlbCArIG5hbWUsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBsdmVyOiBsdmVyLFxcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkXFxuICAgICAgICB9LFxcbiAgICAgICAgcGljX3VybDogaXRlbS5waWMsXFxuICAgIH0pO1xcbn1cXG4vKiDlvZLlubbmjpLluo8gU3RhcnQgKi9cXG4vL21SdWxlTGlzdCA9IG1lcmdlU29ydChtUnVsZUxpc3QpO1xcbi8qIOW9kuW5tuaOkuW6jyBFbmQgKi9cXG5kYXRhLnB1c2guYXBwbHkoZGF0YSwgbVJ1bGVMaXN0KVxcbnNldFJlc3VsdChkYXRhKTtcXG5cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuinhOWImeivpue7hi11c2VyXCIsXCJwYXRoXCI6XCJydWxlRGV0YWlsXCIsXCJydWxlXCI6XCJqczpcXG4gICAgY29uc3Qge1xcbiAgICAgICAgZ2V0QXBpLFxcbiAgICAgICAgY29sb3IsXFxuICAgICAgICBzbWFsbCxcXG4gICAgICAgIGh0bWxUYWcsXFxuICAgICAgICBhcGksXFxuICAgICAgICBtZFxcbiAgICB9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgaWQsXFxuICAgIGx2ZXIsXFxuICAgIGlzQWxsXFxufSA9IE1ZX1BBUkFNUztcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKGlzQWxsKSA9PiB7XFxuICAgIGlmKCFpc0FsbCl7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgIH1cXG59LGlzQWxsKSk7XFxubGV0IGRhdGFJdGVtID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwiZ2V0YnlpZFxcXCIpICsgXFxcIj9pZD1cXFwiICsgaWQpKS5yZXN1bHQ7XFxuc2V0UGFnZVRpdGxlKFxcXCLjgIxcXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCLjgI1cXFwiKVxcbmxldCBydWxlTGlzdEpzb24gPSBnZXRBcGkoXFxcInJ1bGVMaXN0SnNvblxcXCIpICsgXFxcIj9pZD1cXFwiO1xcbmxldCBkYXRhID0gW107XFxudmFyIGhhc1N1YiA9IGZhbHNlO1xcblxcbmlmIChkYXRhSXRlbS5pc19qc29uX2xpc3QpIHtcXG4gICAgaGFzU3ViID0gaGFzSG9tZVN1YihydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCk7XFxufSBlbHNlIGlmICghZGF0YUl0ZW0uaXNfanNvbl9saXN0ICYmIGRhdGFJdGVtLmRhdGFfdHlwZSA9PSAnaG9tZV9ydWxlX3VybCcpIHtcXG4gICAgaGFzU3ViID0gaGFzSG9tZVN1YihydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArICcmZGVidWc9dHJ1ZScpO1xcbn1cXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIueJiOacrFxcXCIpLFxcbiAgICBkZXNjOiBcXFwi4oCc4oCc4oCd4oCd5byA5Y+R6ICF77yaXFxcIiArIGNvbG9yKGRhdGFJdGVtLmF1dGhvciwgXFxcIiMyMjhCRTZcXFwiKSArIFxcXCJcXFxcbuS6keerr+eJiOacrO+8mlxcXCIgKyBjb2xvcihkYXRhSXRlbS52ZXIsIFxcXCIjNWNmZjJjXFxcIikgKyBcXFwiXFxcXHRcXFxcdOacrOWcsOeJiOacrO+8mlxcXCIgKyBjb2xvcihsdmVyLCBcXFwiIzVjZmYyY1xcXCIpICsgXFxcIlxcXFxu5pu05paw5LqOOiBbXFxcIiArIGNvbG9yKGRhdGFJdGVtLmxhc3RfdXBkYXRlLCBcXFwiI2ZmNzAwMFxcXCIpICsgXFxcIl1cXFwiLFxcbiAgICB1cmw6ICQoXFxcIjzlvIDlj5HogIU+XFxcXG5cXFwiICsgZGF0YUl0ZW0uYXV0aG9yICsgXFxcIlxcXFxuPOWQjeensD5cXFxcblxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcIlxcXFxuPOS6keerr+eJiOacrD5cXFxcblxcXCIgKyBkYXRhSXRlbS52ZXIgKyBcXFwiXFxcXG485pys5Zyw54mI5pysPlxcXFxuXFxcIiArIGx2ZXIgKyBcXFwiXFxcXG485pu05paw5pe26Ze0PlxcXFxuW1xcXCIgKyBkYXRhSXRlbS5sYXN0X3VwZGF0ZSArIFxcXCJdXFxcIikuY29uZmlybSgoKSA9PiB7fSksXFxuICAgIGNvbF90eXBlOiAndGV4dF8xJ1xcbn0pO1xcbmxldCBkYXRhVHlwZSA9IHtcXG4gICAgaG9tZV9ydWxlX3VybDogJ+mmlumhteS6keinhOWImScsXFxuICAgIHB1Ymxpc2g6ICfmj5DkuqTkupHku5PlupPop4TliJknLFxcbiAgICBqc191cmw6ICfnvZHpobXmj5Lku7bop4TliJknLFxcbiAgICBodG1sOiAn6Z2Z5oCB6aG16Z2iJyxcXG4gICAgY29uZmlnOiAn5Li76aG16YWN572uJ1xcbn07XFxuXFxubGV0IGJhc2ljID0ge1xcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxufTtcXG5sZXQgZGF0YVR5cGVUaXBzID0gZGF0YVR5cGVbZGF0YUl0ZW0uZGF0YV90eXBlXSB8fCAn5pyq55+l6KeE5YiZ77yaJyArIGRhdGFJdGVtLmRhdGFfdHlwZTtcXG5cXG5sZXQgc2FmZV90aXA9ZGF0YUl0ZW0uaXNfc2FmZT9cXFwi5a6J5YWoXFxcIjpcXFwi5Y2x6ZmpXFxcIjtcXG5sZXQgZ29vZF90aXAgPSBkYXRhSXRlbS5pc19nb29kP3NtYWxsKGNvbG9yKFxcXCLjgJDkvJjotKjop4TliJnjgJFcXFwiLCcjZmY3MDAwJykpOlxcXCJcXFwiO1xcbmxldCBub3Rfc2FmZV9ub3RlPWRhdGFJdGVtLm5vdF9zYWZlX25vdGU7XFxuYmFzaWMudGl0bGUgPSBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi57G75Z6LXFxcIikgKyBcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIHNtYWxsKFxcXCIoaWQ6XFxcIiArIGRhdGFJdGVtLmlkICsgXFxcIilcXFwiKStcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIHNtYWxsKFxcXCIo6aOO6Zmp5qOA5rWLOlxcXCIgK3NhZmVfdGlwK1xcXCIpXFxcIikrZ29vZF90aXA7XFxuYmFzaWMuZGVzYyA9IFxcXCLmlbDmja7nsbvlnovvvJpcXFwiICsgY29sb3IoZGF0YVR5cGVUaXBzLCBcXFwiI2NiNTRmZlxcXCIpICsgXFxcIlxcXFxu5YiG5Lqr54q25oCB5Li677yaXFxcIiArIGRhdGFJdGVtLnN0YXRlO1xcbmlmIChbXFxcImh0bWxcXFwiLCBcXFwiY29uZmlnXFxcIiwgXFxcImpzX3VybFxcXCJdLmluY2x1ZGVzKGRhdGFJdGVtLmRhdGFfdHlwZSkpIHtcXG4gICAgYmFzaWMuZGVzYyArPSBcXFwiXFxcXG7igJzigJzigJ3igJ0gPT5cXFwiICsgc21hbGwoXFxcIueCueatpOmihOiniFxcXCIpO1xcbiAgICBiYXNpYy51cmwgPSBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXG59XFxuXFxuZGF0YS5wdXNoKGJhc2ljKTtcXG5sZXQgaGFzU3VicyA9IFxcXCJcXFwiO1xcbmlmIChoYXNTdWIpIHtcXG4gICAgaGFzU3VicyA9IFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoXFxcIuW3suiuoumYhVxcXCIpXFxufVxcblxcbmxldCBub3RlcyA9IHJlcXVlc3QoZ2V0QXBpKFxcXCJnZXRfcnVsZV9ub3RlXFxcIikgKyBpZCk7XFxubm90ZXMgPSBKU09OLnBhcnNlKG5vdGVzKS5yZXN1bHQ7XFxucmVxdWlyZShtZCk7XFxubGV0IG5vdGVzSHRtbD1cXFwiXFxcIlxcbnRyeXtcXG4gICAgbm90ZXNIdG1sPW1hcmtlZC5wYXJzZShub3Rlcyk7XFxufWNhdGNoKGUpe31cXG5cXG5pZiAobm90ZXMgIT09IGZhbHNlKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuWkh+azqFxcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChodG1sVGFnKFxcXCJ1XFxcIiwgXFxcIuafpeeci+WujOaVtOWFrOWRiiA+XFxcIikpLFxcbiAgICAgICAgZGVzYzogbm90ZXMsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHRleHQ6IG5vdGVzSHRtbCxcXG4gICAgICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lLFxcbiAgICAgICAgICAgIC8vIHR5cGU6IFxcXCJsb25nX3RleHRcXFwiXFxuICAgICAgICAgICAgdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgICAgIH1cXG4gICAgfSk7XFxufVxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi5pON5L2cXFxcIikgKyBoYXNTdWJzLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcInRvYXN0Oi8v5L2g5omN5piv5pyA5biF55qE6YKj5Liq5Lq677yBXFxcIlxcbn0pO1xcbmxldCBpbXBvcnRVcmwsIHJ1bGVDb2RlLCBzaGFyZVVybCwgYmFja0NvZGUgPSBcXFwiXFxcIjtcXG5pZiAoIWRhdGFJdGVtLmlzX2pzb24pIHtcXG4gICAgYmFja0NvZGUgPSByZXF1ZXN0KHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkKTtcXG59XFxuc3dpdGNoIChkYXRhSXRlbS5kYXRhX3R5cGUpIHtcXG4gICAgY2FzZSBcXFwiaG9tZV9ydWxlX3VybFxcXCI6XFxuICAgICAgICBydWxlQ29kZSA9IFxcXCLmtbfpmJTop4bnlYzpppbpobXpopHpgZPop4TliJnjgJBcXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCLjgJHvv6Vob21lX3J1bGVfdXJs77+lXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkO1xcbiAgICAgICAgaW1wb3J0VXJsID0gXFxcInJ1bGU6Ly9cXFwiICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKVxcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgJ3B1Ymxpc2gnOlxcbiAgICAgICAgcnVsZUNvZGUgPSAn5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77yaJyArIGRhdGFJdGVtLm5hbWUgKyAn77+lcHVibGlzaO+/pScgKyBiYXNlNjRFbmNvZGUoYmFja0NvZGUpO1xcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlICdqc191cmwnOlxcbiAgICAgICAgcnVsZUNvZGUgPSAn5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77ya572R6aG15o+S5Lu277+lanNfdXJs77+lJyArIGRhdGFJdGVtLm5hbWUgKyAnQGJhc2U2NDovLycgKyBiYXNlNjRFbmNvZGUoYmFja0NvZGUpO1xcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlICdodG1sJzpcXG4gICAgICAgIGxldCBmaWxlX3RtcCA9IGRhdGFJdGVtLm5hbWUuc3BsaXQoJy4nKTtcXG4gICAgICAgIGxldCBmaWxlX3BhdGggPSBmaWxlX3RtcC5sZW5ndGggPiAxID8gZmlsZV90bXBbZmlsZV90bXAubGVuZ3RoIC0gMV0gKyBcXFwiL1xcXCIgKyBkYXRhSXRlbS5uYW1lIDogZGF0YUl0ZW0ubmFtZTtcXG4gICAgICAgIHJ1bGVDb2RlID0gXFxcIua1t+mYlOinhueVjOacrOWcsOaWh+S7tuWIhuS6q++/pWZpbGVfdXJs77+laGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL1xcXCIgKyBmaWxlX3BhdGggKyBcXFwiQFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICBicmVha1xcbiAgICBjYXNlIFxcXCJjb25maWdcXFwiOlxcbiAgICAgICAgaW1wb3J0VXJsID0gJCgpLnJ1bGUocGFzc3dvcmQgPT4ge1xcbiAgICAgICAgICAgIGV2YWwoZmV0Y2goXFxcImhpa2VyOi8vYXNzZXRzL2hvbWUuanNcXFwiKSk7XFxuICAgICAgICAgICAgSGlrZXJIb21lLmxvYWQoXFxcImltcG9ydFxcXCIsIHBhc3N3b3JkKTtcXG4gICAgICAgIH0sIGJhY2tDb2RlKTtcXG4gICAgICAgIGJyZWFrO1xcbn1cXG5sZXQgbXlfY29sX3R5cGUgPSBcXFwidGV4dF8yXFxcIjtcXG5sZXQgbXlfY29sX3R5cGUyID0gXFxcInRleHRfM1xcXCI7XFxuaWYgKGltcG9ydFVybCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLlr7zlhaXop4TliJlcXFwiLFxcbiAgICAgICAgdXJsOiBkYXRhSXRlbS5pc19zYWZlP2ltcG9ydFVybDondG9hc3Q6Ly/po47pmanop4TliJnnpoHmraLlr7zlhaUhISEnLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pO1xcbn1cXG5pZiAocnVsZUNvZGUpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5YiG5Lqr5Y+j5LukXFxcIixcXG4gICAgICAgIHVybDogXFxcImNvcHk6Ly9cXFwiICsgcnVsZUNvZGUsXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSk7XFxufVxcblxcbmlmIChpbXBvcnRVcmwpIHtcXG4gICAgaWYgKGRhdGFJdGVtLmlzX2pzb25fbGlzdCAmJiAhaGFzU3ViKSB7XFxuICAgICAgICBsZXQgc3ViX3J1bGVfY29kZSA9ICfmtbfpmJTop4bnlYzlkIjpm4bop4TliJnorqLpmIXvv6Vob21lX3N1Yu+/pScgKyBkYXRhSXRlbS5uYW1lICsgXFxcIkBAXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkO1xcbiAgICAgICAgbGV0IHN1Yl91cmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUoc3ViX3J1bGVfY29kZSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn6K6i6ZiF5ZCI6ZuGJyxcXG4gICAgICAgICAgICB1cmw6IHN1Yl91cmwsXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlMlxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjZmY3MDAwXFxcIj7lr7zlhaXovbvlkIjpm4Y8L3NwYW4+JyxcXG4gICAgICAgICAgICB1cmw6ICQoKS5sYXp5UnVsZSgoZGF0YUl0ZW0sc3ViVXJsKT0+e1xcbiAgICAgICAgICAgICAgICBjb25zdCB7Z2VuUnVsZX09JC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvZ2VuQXBpXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCBpbXBvcnRfcnVsZT1nZW5SdWxlKGRhdGFJdGVtLm5hbWUrXFxcIi5cXFwiK2RhdGFJdGVtLmF1dGhvcixzdWJVcmwpO1xcbiAgICAgICAgICAgICAgICAvL2NvcHkoaW1wb3J0X3J1bGUpO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZUNvZGU9cGFyc2VQYXN0ZShpbXBvcnRfcnVsZS5zcGxpdChcXFwiXFxcXG5cXFwiKVswXSk7XFxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gaW1wb3J0VXJsXFxuICAgICAgICAgICAgfSxkYXRhSXRlbSxydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCksXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlMlxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjZmY3MDAwXFxcIj7lr7zlhaXpgZPlvrfnu488L3NwYW4+JyxcXG4gICAgICAgICAgICB1cmw6ICQoKS5sYXp5UnVsZSgoZGF0YUl0ZW0sc3ViVXJsKT0+e1xcbiAgICAgICAgICAgICAgICAvLyBsZXQgdGl0bGUgPSBcXFwiSC1cXFwiK2RhdGFJdGVtLm5hbWUrXFxcIi5cXFwiK2RhdGFJdGVtLmF1dGhvcjtcXG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gXFxcIkotXFxcIitkYXRhSXRlbS5uYW1lLnNwbGl0KCcuJylbMF07XFxuICAgICAgICAgICAgICAgIGxldCBzdWJPYmogPSB7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHN1YlVybCxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvcnVsZUNhY2hlL1xcXCIrdGl0bGUrXFxcIi5qc29uXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSwvL+emgeeUqOW5tuWPkeabtOaWsFxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGxldCBzaGFyZVRleHQgPSBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoc3ViT2JqKSk7XFxuICAgICAgICAgICAgICAgIHZhciBwYXN0ZXMgPSBnZXRQYXN0ZXMoKTtcXG4gICAgICAgICAgICAgICAgdmFyIHVybCA9IHNoYXJlUGFzdGUoc2hhcmVUZXh0LHBhc3Rlcy5zbGljZSgtMSlbMF0pO1xcbiAgICAgICAgICAgICAgICBsZXQgaW1wb3J0X3J1bGU9IFxcXCLovbvlkIjpm4borqLpmIXvvJpcXFwiK3RpdGxlKydcXFxcbicrdXJsO1xcbiAgICAgICAgICAgICAgICBjb3B5KGltcG9ydF9ydWxlKTtcXG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9ICdoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvcnVsZUNhY2hlL3N1Yi5qc29uJztcXG4gICAgICAgICAgICAgICAgcmVxdWlyZShnZXRWYXIoJ3N1YuS+nei1licsJ2h0dHBzOi8vZ2l0Y29kZS5uZXQvcXFfMzIzOTQzNTEvZHIvLS9yYXcvbWFzdGVyL2pzL3N1YnNjcmliZS5qcycpKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIOiuoumYheWvvOWFpShwYXRoKVxcbiAgICAgICAgICAgIH0sZGF0YUl0ZW0scnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZTJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIjxzbWFsbD7mj5DnpLrvvJrlvIDlj5HogIXljZXni6zliIbkuqvnmoTlkIjpm4bmlofku7blj6rog73ljZXni6zlr7zlhaXjgII8L3NtYWxsPlxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfSBlbHNlIGlmICghZGF0YUl0ZW0uaXNfanNvbl9saXN0ICYmICFoYXNTdWIgJiYgZGF0YUl0ZW0uZGF0YV90eXBlID09ICdob21lX3J1bGVfdXJsJykge1xcbiAgICAgICAgbGV0IHN1Yl9ydWxlX2NvZGUgPSAn5rW36ZiU6KeG55WM5Y2V6KeE5YiZ6K6i6ZiF77+laG9tZV9zdWLvv6UnICsgZGF0YUl0ZW0ubmFtZSArIFxcXCJAQFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArICcmZGVidWc9dHJ1ZSc7XFxuICAgICAgICBsZXQgc3ViX3VybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShzdWJfcnVsZV9jb2RlKTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICforqLpmIXop4TliJknLFxcbiAgICAgICAgICAgIHVybDogc3ViX3VybCxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgICAgIH0pXFxuICAgIH1cXG59XFxuaWYgKGRhdGFJdGVtLmlzX2pzb24gJiYgZGF0YUl0ZW0uZGF0YV90eXBlID09PSBcXFwiaG9tZV9ydWxlX3VybFxcXCIgJiYgIWRhdGFJdGVtLmlzX2pzb25fbGlzdCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfov5vlhaXpopHpgZMnLFxcbiAgICAgICAgdXJsOiAkKCAvKlxcXCIjbm9Mb2FkaW5nI1xcXCIqLyApLmxhenlSdWxlKChuYW1lLGhvbWUpID0+IHtcXG4gICAgICAgICAgICBsZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoaG9tZSkpO1xcbiAgICAgICAgICAgIGxldCBoYXNSdWxlID0gcnVsZUxpc3Quc29tZShpdGVtID0+IGl0ZW0udGl0bGUgPT09IG5hbWUpO1xcbiAgICAgICAgICAgIGlmIChoYXNSdWxlKSB7XFxuICAgICAgICAgICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBob21lK1xcXCJzQFxcXCIgKyBuYW1lO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mnKrlronoo4VcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGRhdGFJdGVtLm5hbWUsYXBpLmhvbWUpLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pXFxufVxcbmxldCBtYW5fcnVsZV9zYWZlID0gZ2V0QXBpKFxcXCJtYW5SdWxlU2FmZVxcXCIpK2RhdGFJdGVtLmlkO1xcbmxldCBtYW5fcnVsZV9nb29kID0gZ2V0QXBpKFxcXCJtYW5SdWxlR29vZFxcXCIpK2RhdGFJdGVtLmlkO1xcbi8vIGRhdGFJdGVtLmlzX3NhZmU7XFxuaWYoZ2V0VmFyKCdob3VzZS5pc19tYW5hZ2VyJykpe1xcbiAgICBmdW5jdGlvbiBzZXRJc1NhZmUoZmxhZyxtYW5fcnVsZV9zYWZlKSB7XFxuICAgICAgICBmbGFnID0gZmxhZyB8fCAnJztcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IGNvZGUgPSBmZXRjaChtYW5fcnVsZV9zYWZlLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFwiVXNlci1BZ2VudFxcXCI6IE1PQklMRV9VQX0sXFxuICAgICAgICAgICAgICAgIGJvZHk6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInVzZXJuYW1lXFxcIjogZ2V0VmFyKCdob3VzZS51c2VybmFtZScpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBnZXRWYXIoJ2hvdXNlLnBhc3N3b3JkJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJpc19zYWZlXFxcIjogISFmbGFnXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgY29kZSA9IEpTT04ucGFyc2UoY29kZSkucmVzdWx0O1xcbiAgICAgICAgICAgIGlmIChjb2RlLnN0YXR1cyA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZS5kZXRhaWxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgY29kZS5kZXRhaWxcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGUubWVzc2FnZVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGZ1bmN0aW9uIHNldElzR29vZChmbGFnLG1hbl9ydWxlX2dvb2QpIHtcXG4gICAgICAgIGZsYWcgPSBmbGFnIHx8ICcnO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgY29kZSA9IGZldGNoKG1hbl9ydWxlX2dvb2QsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXCJVc2VyLUFnZW50XFxcIjogTU9CSUxFX1VBfSxcXG4gICAgICAgICAgICAgICAgYm9keToge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwidXNlcm5hbWVcXFwiOiBnZXRWYXIoJ2hvdXNlLnVzZXJuYW1lJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IGdldFZhcignaG91c2UucGFzc3dvcmQnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcImlzX2dvb2RcXFwiOiAhIWZsYWdcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBjb2RlID0gSlNPTi5wYXJzZShjb2RlKS5yZXN1bHQ7XFxuICAgICAgICAgICAgaWYgKGNvZGUuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlLmRldGFpbFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBjb2RlLmRldGFpbFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgZS5tZXNzYWdlXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifwn5qr6aOO6ZmpJyxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDokKCfmoIforrDor6Xop4TliJnkuLrpo47pmak/6aOO6Zmp6KeE5YiZ5peg5rOV6KKr5a+85YWlJykuY29uZmlybSgoaWQsbWFuX3J1bGVfc2FmZSxzZXRJc1NhZmUpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldElzU2FmZShmYWxzZSxtYW5fcnVsZV9zYWZlKTtcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXG4gICAgICAgIH0sZGF0YUl0ZW0uaWQsbWFuX3J1bGVfc2FmZSxzZXRJc1NhZmUpXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6J+Kcheato+W4uCcsXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICB1cmw6JCgn5qCH6K6w6K+l6KeE5YiZ5Li65q2j5bi4PycpLmNvbmZpcm0oKGlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKT0+e1xcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc1NhZmUodHJ1ZSxtYW5fcnVsZV9zYWZlKTtcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXG4gICAgICAgIH0sZGF0YUl0ZW0uaWQsbWFuX3J1bGVfc2FmZSxzZXRJc1NhZmUpXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6J+KZpemdnuS8mOi0qCcsXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICB1cmw6JCgn5qCH6K6w6K+l6KeE5YiZ5Li66Z2e5LyY6LSoPycpLmNvbmZpcm0oKGlkLG1hbl9ydWxlX2dvb2Qsc2V0SXNHb29kKT0+e1xcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc0dvb2QoZmFsc2UsbWFuX3J1bGVfZ29vZCk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX2dvb2Qsc2V0SXNHb29kKVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifwn5KW5LyY6LSoJyxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDokKCfmoIforrDor6Xop4TliJnkuLrkvJjotKg/JykuY29uZmlybSgoaWQsbWFuX3J1bGVfZ29vZCxzZXRJc0dvb2QpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldElzR29vZCh0cnVlLG1hbl9ydWxlX2dvb2QpO1xcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9nb29kLHNldElzR29vZClcXG4gICAgfSk7XFxufVxcblxcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogZGF0YUl0ZW0uZ29vZF9udW0sXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6LWeLnN2Z1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF8zXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL01ha2VBY29tbWVudCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IGRhdGFJdGVtLmlkLFxcbiAgICAgICAgbmFtZTogZGF0YUl0ZW0ubmFtZVxcbiAgICB9XFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmJhZF9udW0sXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6LipLnN2Z1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF8zXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL01ha2VBY29tbWVudCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IGRhdGFJdGVtLmlkLFxcbiAgICAgICAgbmFtZTogZGF0YUl0ZW0ubmFtZSxcXG4gICAgICAgIGRlZmF1bHRUeXBlOlxcXCJiYWRcXFwiXFxuICAgIH1cXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuivhOiuulxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6K+E6K66LnN2Z1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF8zXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL01ha2VBY29tbWVudCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IGRhdGFJdGVtLmlkLFxcbiAgICAgICAgbmFtZTogZGF0YUl0ZW0ubmFtZVxcbiAgICB9XFxufSk7XFxubGV0IHRvdGFsU3VtID0gZGF0YUl0ZW0uZ29vZF9udW0gKyBkYXRhSXRlbS5iYWRfbnVtO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi6K+E6K66KFxcXCIgKyB0b3RhbFN1bSArIFxcXCIpXFxcIikgKyBcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIHNtYWxsKGh0bWxUYWcoXFxcInVcXFwiLCBcXFwi5p+l55yL5YWo6YOo6K+E6K66ID5cXFwiKSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL0NvbW1lbnRcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eSNmeXBhZ2Ujbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgIHRvdGFsU3VtOiB0b3RhbFN1bSxcXG4gICAgICAgIG5vX2FjdGl2ZTogZmFsc2VcXG4gICAgfVxcbn0pO1xcbi8vY29uc3QgbG9uZ2VzdFN1bT0xMjA7XFxubGV0IGljb24gPSB7XFxuICAgIFxcXCJnb29kXFxcIjogXFxcIvCfkY1cXFwiLFxcbiAgICBcXFwiYmFkXFxcIjogXFxcIvCfkY5cXFwiLFxcbiAgICBcXFwicmVwbHlcXFwiOlxcXCLlvIDlj5HogIXwn5ejXFxcIlxcbn1cXG5pZiAodG90YWxTdW0gPT09IDApIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwiPGg1IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+5LiA5p2h6K+E6K665Lmf5rKh5pyJ77yM5b+r5p2l5oqi5rKZ5Y+R5ZCn77yBPC9oNT5cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0pO1xcbn0gZWxzZSB7XFxuICAgIGxldCBjb21tZW50TGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuZGlzX2dldCArIGRhdGFJdGVtLmlkICsgXFxcIj9saW1pdD01XFxcIikpLnJlc3VsdDtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjb21tZW50TGlzdCkge1xcbiAgICAgICAgbGV0IFJlcGx5ID0gaXRlbS5kaXNjdXNzX3R5cGU9PT1cXFwicmVwbHlcXFwiJiZpdGVtLnJlcGx5X3RvX25hbWUhPT1mYWxzZSYmaXRlbS5yZXBseV90b19pZCE9PWZhbHNlP1xcXCLigJjigJjlm57lpI1AXFxcIitpdGVtLnJlcGx5X3RvX25hbWUrXFxcIiAjXFxcIitpdGVtLmRpc2N1c3NfaWQrXFxcIuKAmeKAmVxcXFxuXFxcIjpcXFwiXFxcIjtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0ubmFtZSArIFxcXCImbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0nZ3JheSc+PHNtYWxsPiNcXFwiICsgaXRlbS5pZCArIFxcXCI8L3NtYWxsPjxmb250PlxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgICAgIC8vdXJsOiBcXFwidG9hc3Q6Ly9cXFwiICsgaXRlbS5xcSxcXG4gICAgICAgICAgICB1cmw6XFxcIm1xcXdwYTovL2ltL2NoYXQ/Y2hhdF90eXBlPXdwYSZ1aW49XFxcIitpdGVtLnFxLFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXG4gICAgICAgICAgICBkZXNjOiBSZXBseStpdGVtLmNyZWF0ZV9kYXRlICsgXFxcIsK3XFxcIiArIGljb25baXRlbS5kaXNjdXNzX3R5cGVdLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXCIsXFxuICAgICAgICAgICAgZXh0cmE6e1xcbiAgICAgICAgICAgICAgICBuYW1lOml0ZW0ubmFtZSxcXG4gICAgICAgICAgICAgICAgdHlwZTpcXFwibG9uZ190ZXh0XFxcIixcXG4gICAgICAgICAgICAgICAgdGV4dDppdGVtLmRpc2N1c3NfdGV4dFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG59XFxuXFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwicmljaF90ZXh0XCIsXCJuYW1lXCI6XCLmn6XnnItcIixcInBhdGhcIjpcImluZm9cIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi5p+l55yL44CMXFxcIitNWV9QQVJBTVMubmFtZStcXFwi44CNXFxcIilcXG5zZXRSZXN1bHQoW3tcXG4gICAgdGl0bGU6IE1ZX1BBUkFNUy50ZXh0LFxcbiAgICBjb2xfdHlwZTpNWV9QQVJBTVMudHlwZVxcbn1dKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuW8gOWPkeiAheazqOWGjFwiLFwicGF0aFwiOlwiUmVnaXN0ZXJcIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi5byA5Y+R6ICF5rOo5YaMXFxcIik7XFxuY29uc3Qge1xcbiAgICBnZXRBcGksXFxuICAgIGh0bWxUYWcsXFxuICAgIG1hcENvbFR5cGUsXFxuICAgIHNtYWxsXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbnZhciBkYXRhID0gW107XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5QYXNzd29yZFxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLlVzZXJuYW1lXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuRGVzY3JpcHRpb25cXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5Vc2VyQWRkcmVzc1xcXCIpO1xcbn0pKTtcXG5hZGRMaXN0ZW5lcignb25SZWZyZXNoJywgJC50b1N0cmluZygoKT0+e1xcbiAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5XYWl0XFxcIiwgXFxcIlxcXCIpO1xcbn0pKTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogJ+i0puWPtycsXFxuICAgIGRlc2M6IFxcXCLor7fovpPlhaXotKblj7co5b+F5aGrKVxcXCIsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5Vc2VybmFtZScsICcnKSxcXG4gICAgICAgIHR5cGU6IFxcXCJudW1iZXJcXFwiLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5Vc2VybmFtZVxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSwge1xcbiAgICB0aXRsZTogJ+WvhueggScsXFxuICAgIGRlc2M6IFxcXCLor7fovpPlhaXlr4bnoIEo5b+F5aGrKVxcXCIsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5QYXNzd29yZCcsICcnKSxcXG4gICAgICAgIHR5cGU6IFxcXCJwYXNzd29yZFxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLlBhc3N3b3JkXFxcIixpbnB1dCknXFxuICAgIH1cXG59KTtcXG5tYXBDb2xUeXBlKGRhdGEsIFxcXCJsaW5lX2JsYW5rXFxcIiwgMSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICfmmLXnp7AnLFxcbiAgICBkZXNjOiBcXFwi6K+36L6T5YWl5pi156ewKOW/heWhqylcXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UuVXNlckFkZHJlc3MnLCAnJyksXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLlVzZXJBZGRyZXNzXFxcIixpbnB1dCknXFxuICAgIH1cXG59LCB7XFxuICAgIHRpdGxlOiAn5o+P6L+wJyxcXG4gICAgZGVzYzogXFxcIuivtOivtOS4uuS7gOS5iOimgeazqOWGjOWQp1xcXFxuKOWPr+S7peWinuWKoOmAmui/h+amgueOhyzpgInloaspXFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLkRlc2NyaXB0aW9uJywgJycpLFxcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UuRGVzY3JpcHRpb25cXFwiLGlucHV0KSdcXG4gICAgfVxcbn0pXFxuXFxubWFwQ29sVHlwZShkYXRhLCBcXFwibGluZV9ibGFua1xcXCIsIDEpO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiXFxcIiwgXFxcIuazqOWGjFxcXCIpLFxcbiAgICB1cmw6ICQoZ2V0QXBpKFxcXCJuZXdfZGV2XFxcIikrXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGdldElkLCBjb25maXJtKSA9PiB7XFxuICAgICAgICBsZXQgdXNlcm5hbWUgPSBnZXRWYXIoJ1dhcmVob3VzZS5Vc2VybmFtZScsIFxcXCJcXFwiKSxcXG4gICAgICAgICAgICBwYXNzd29yZCA9IGdldFZhcignV2FyZWhvdXNlLlBhc3N3b3JkJywgXFxcIlxcXCIpLFxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZ2V0VmFyKCdXYXJlaG91c2UuRGVzY3JpcHRpb24nLCBcXFwiXFxcIiksXFxuICAgICAgICAgICAgbmFtZSA9IGdldFZhcihcXFwiV2FyZWhvdXNlLlVzZXJBZGRyZXNzXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgaWYgKFt1c2VybmFtZSwgcGFzc3dvcmQsIG5hbWVdLmluY2x1ZGVzKFxcXCJcXFwiKSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/otKblj7cs5a+G56CB5ZKM5pi156ew5LiN6IO95Li656m6XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIHNob3dMb2FkaW5nKFxcXCLmraPlnKjmj5DkuqTnlLPor7fooahcXFwiKTtcXG4gICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0LCB7XFxuICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicmVhc29uXFxcIjogZGVzY3JpcHRpb24sXFxuICAgICAgICAgICAgICAgICAgICBcXFwibmFtZVxcXCI6IG5hbWUsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBwYXNzd29yZCxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJxcVxcXCI6IHVzZXJuYW1lXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBtZXRob2Q6ICdwb3N0J1xcbiAgICAgICAgfSk7XFxuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbiAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGlkcmVzdWx0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldElkICsgXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUpKTtcXG4gICAgICAgIGlmIChpZHJlc3VsdC5zdGF0dXMgIT09IDApIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIGlkcmVzdWx0LmRldGFpbDtcXG4gICAgICAgIH1cXG4gICAgICAgIFxcbiAgICAgICAgcmV0dXJuICQoXFxcIlxcXCIsIFxcXCLovpPlhaXpgq7nrrHpqozor4HnoIFcXFxcblxcXCIgKyByZXN1bHQuZGV0YWlsKS5pbnB1dCgoY29uZmlybSwgaWQsIGFjY291bnQpID0+IHtcXG4gICAgICAgICAgICBzaG93TG9hZGluZyhcXFwi6K+36ICQ5b+D562J5b6FXFxcIik7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoY29uZmlybSwge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInJlZ2lzdF9pZFxcXCI6IGlkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwieXptXFxcIjogaW5wdXRcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlVXNlcm5hbWVcXFwiLCBhY2NvdW50WzBdKTtcXG4gICAgICAgICAgICAgICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlUGFzc3dvcmRcXFwiLCBhY2NvdW50WzFdKTtcXG4gICAgICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5oiQ5Yqf5o+Q5Lqk5rOo5YaM5rOo5YaMXFxcXG5cXFwiK3Jlc3VsdC5kZXRhaWw7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lh7rplJnkuoblkZBcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGNvbmZpcm0sIGlkcmVzdWx0LnJlc3VsdCwgW3VzZXJuYW1lLCBwYXNzd29yZF0pO1xcbiAgICB9LCBnZXRBcGkoXFxcIm5ld19nZXRJZFxcXCIpLCBnZXRBcGkoXFxcIm5ld19jb25maXJtXFxcIikpLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxufSk7XFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwidGV4dF8xXCIsXCJuYW1lXCI6XCLkuKrkurrotYTmlplcIixcInBhdGhcIjpcIlBlcnNvbmFsRGF0YVwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLkuKrkurrotYTmlplcXFwiKTtcXG52YXIgZGF0YT1bXTtcXG5jb25zdCB7XFxuICAgIGdldEFwaSxcXG4gICAgZ2V0RmlsZSxcXG4gICAgYXBpXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOlxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcblxcbmxldCB7dXNlcm5hbWUscGFzc3dvcmR9ID0gZ2V0RmlsZSgpO1xcbmxldCBkZXYgPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXCJ1c2VyXFxcIikrTVlfUEFSQU1TLmlkKSkucmVzdWx0O1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLlpLTlg49cXFwiLFxcbiAgICBkZXNjOmRldi5hdmF0YXIsXFxuICAgIHVybDpcXFwiaGlrZXI6Ly9wYWdlL21vZGlmeV9QZXJzb25hbERhdGEjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6e1xcbiAgICAgICAgZGV2OmRldixcXG4gICAgICAgIHVzZXJuYW1lOnVzZXJuYW1lLFxcbiAgICAgICAgcGFzc3dvcmQ6cGFzc3dvcmQsXFxuICAgICAgICBQYXR0ZXJuOjBcXG4gICAgfSxcXG4gICAgY29sX3R5cGU6XFxcInRleHRfMVxcXCJcXG59KTtcXG5cXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi5pi156ewXFxcIixcXG4gICAgZGVzYzpkZXYubmFtZSxcXG4gICAgdXJsOlxcXCJoaWtlcjovL3BhZ2UvbW9kaWZ5X1BlcnNvbmFsRGF0YSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICBleHRyYTp7XFxuICAgICAgICBkZXY6ZGV2LFxcbiAgICAgICAgdXNlcm5hbWU6dXNlcm5hbWUsXFxuICAgICAgICBwYXNzd29yZDpwYXNzd29yZCxcXG4gICAgICAgIFBhdHRlcm46MVxcbiAgICB9LFxcbiAgICBjb2xfdHlwZTpcXFwidGV4dF8xXFxcIlxcbn0pO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLlr4bnoIFcXFwiLFxcbiAgICB1cmw6XFxcImhpa2VyOi8vcGFnZS9tb2RpZnlfUGVyc29uYWxEYXRhI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOntcXG4gICAgICAgIGRldjpkZXYsXFxuICAgICAgICB1c2VybmFtZTp1c2VybmFtZSxcXG4gICAgICAgIHBhc3N3b3JkOnBhc3N3b3JkLFxcbiAgICAgICAgUGF0dGVybjoyXFxuICAgIH0sXFxuICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6XFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIui0puWPt++8mlxcXCIrdXNlcm5hbWUsXFxuICAgIHVybDpcXFwiY29weTovL1xcXCIrdXNlcm5hbWUsXFxuICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIlVJRO+8mlxcXCIrZGV2LmlkLFxcbiAgICB1cmw6XFxcImNvcHk6Ly9cXFwiK2Rldi5pZCxcXG4gICAgY29sX3R5cGU6XFxcInRleHRfMVxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTpcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZXFxcIixcXG4gICAgdXJsOiQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGhvc3QpPT57XFxuICAgICAgICBsZXQgY29kZT1yZXF1ZXN0KGhvc3QrXFxcIi9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTE0NVxcXCIpO1xcbiAgICAgICAgbGV0IHdvcmQ9XFxcIu+/pXB1Ymxpc2jvv6VcXFwiK2Jhc2U2NEVuY29kZShjb2RlKTtcXG4gICAgICAgIHJldHVybiBcXFwicnVsZTovL1xcXCIrYmFzZTY0RW5jb2RlKHdvcmQpO1xcbiAgICB9LGFwaS5ob3N0KSxcXG4gICAgY29sX3R5cGU6XFxcInRleHRfMVxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi5ZCM5q2l5o+Q5Lqk5LqR5LuT5bqT6LSm5Y+35a+G56CBXFxcIixcXG4gICAgdXJsOlxcXCJydWxlOi8vXFxcIitiYXNlNjRFbmNvZGUoXFxcIu+/pXB1Ymxpc2hfYWNjb3VudO+/pVxcXCIrdXNlcm5hbWUrXFxcIkBcXFwiK3Bhc3N3b3JkKSxcXG4gICAgY29sX3R5cGU6XFxcInRleHRfMVxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTpcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi5L2g5LiA5YWx5Y+R5biD5LqG44CMXFxcIitkZXYucnVsZV9udW0rXFxcIuOAjeadoeinhOWImVxcXCIsXFxuICAgIHVybDpcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6XFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxubGV0IHVzZXIgPSBnZXRGaWxlKCk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIuazqOmUgOeZu+W9lVxcXCIsXFxuICAgIHVybDokKFxcXCLnoa7orqTms6jplIDnmbvlvZU/XFxcIikuY29uZmlybShmID0+IHtcXG4gICAgICAgIGYudXNlcm5hbWU9XFxcIlxcXCI7XFxuICAgICAgICBmLnBhc3N3b3JkPVxcXCJcXFwiO1xcbiAgICAgICAgd3JpdGVGaWxlKCdoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvbicsIEpTT04uc3RyaW5naWZ5KGYpKTtcXG4gICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiLFxcXCIxXFxcIik7XFxuICAgICAgICBiYWNrKCk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5rOo6ZSAXFxcIjtcXG4gICAgfSx1c2VyKSxcXG4gICAgY29sX3R5cGU6XFxcInRleHRfY2VudGVyXzFcXFwiXFxufSk7XFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5pu05pS55Liq5Lq66LWE5paZXCIsXCJwYXRoXCI6XCJtb2RpZnlfUGVyc29uYWxEYXRhXCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCB7XFxuICAgIGdldEFwaSxcXG4gICAgY29sb3IsXFxuICAgIHNtYWxsLFxcbiAgICBnZXRGaWxlLFxcbiAgICBodG1sVGFnXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGRldixcXG4gICAgdXNlcm5hbWUsXFxuICAgIHBhc3N3b3JkLFxcbiAgICBQYXR0ZXJuXFxufSA9IE1ZX1BBUkFNUztcXG52YXIgZGF0YSA9IFtdO1xcbmxldCBwYXRoID0gXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZDtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLm0ucGV0TmFtZVxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLm0uYXZhdGFyXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC5jXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC54XFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC55XFxcIik7XFxufSkpO1xcbmZ1bmN0aW9uIG1fcGV0TmFtZSgpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgICAgIGRlc2M6IFxcXCLor7fovpPlhaXmlrDmmLXnp7BcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5wZXROYW1lJywgJycpfHxkZXYubmFtZSxcXG4gICAgICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLm0ucGV0TmFtZVxcXCIsaW5wdXQpJ1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuS/neWtmFxcXCIsXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXCJtb2RpZnlfbmFtZVxcXCIpICsgcGF0aCkubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBuZXdQZXROYW1lID0gZ2V0VmFyKCdXYXJlaG91c2UubS5wZXROYW1lJywgJycpO1xcbiAgICAgICAgICAgIGlmIChuZXdQZXROYW1lID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHloavllYohXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQgKyBcXFwiJm5hbWU9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChuZXdQZXROYW1lKSk7XFxuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbiAgICB9KTtcXG59XFxuXFxuZnVuY3Rpb24gbV9hdmF0YXIoKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgICAgICBkZXNjOiBcXFwi6K+36L6T5YWl5paw55qE5aS05YOP6ZO+5o6lXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0uYXZhdGFyJywgJycpIHx8IGRldi5hdmF0YXIsXFxuICAgICAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5tLmF2YXRhclxcXCIsaW5wdXQpJ1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuS/neWtmFxcXCIsXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXCJtb2RpZnlfYXZhXFxcIikgKyBwYXRoKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IG5ld0F2YXRhciA9IGdldFZhcignV2FyZWhvdXNlLm0uYXZhdGFyJywgJycpO1xcbiAgICAgICAgICAgIFxcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0ICsgXFxcIiZhdmF0YXJfdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQobmV3QXZhdGFyKSk7XFxuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbiAgICB9KTtcXG59XFxuXFxuZnVuY3Rpb24gbV9wd2QoKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6XFxcIuWOn+WvhueggVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgICAgIGRlc2M6IFxcXCLor7fovpPlhaXljp/lr4bnoIFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0eXBlOlxcXCJwYXNzd29yZFxcXCIsXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLnknLCAnJyksXFxuICAgICAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLnlcXFwiLGlucHV0KSdcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6XFxcIuaWsOWvhueggVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgICAgIGRlc2M6IFxcXCLor7fovpPlhaXmlrDlr4bnoIFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0eXBlOlxcXCJwYXNzd29yZFxcXCIsXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLngnLCAnJyksXFxuICAgICAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLnhcXFwiLGlucHV0KSdcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTpcXFwi6YeN5aSN5paw5a+G56CBXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICAgICAgZGVzYzogXFxcIuivt+mHjeWkjeaWsOWvhueggVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHR5cGU6XFxcInBhc3N3b3JkXFxcIixcXG4gICAgICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC5jJywgJycpLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC5jXFxcIixpbnB1dCknXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5L+d5a2YXFxcIixcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcIm1vZGlmeV9wd2RcXFwiKStwYXRoKS5sYXp5UnVsZSgocGFzc3dvcmQsdXNlcm5hbWUpID0+IHtcXG4gICAgICAgICAgICBsZXQgb2xkX3Bhc3N3b3JkID0gZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC55JywgJycpO1xcbiAgICAgICAgICAgIGxldCBuZXdfcGFzc3dvcmQgPSBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLngnLCAnJyk7XFxuICAgICAgICAgICAgbGV0IG5ld19wYXNzd29yZF9hZ2FpbiA9IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQuYycsICcnKTtcXG4gICAgICAgICAgICBpZiAob2xkX3Bhc3N3b3JkIT09cGFzc3dvcmQpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WOn+WvhueggemUmeivr1xcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmKG5ld19wYXNzd29yZD09PVxcXCJcXFwiKXtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+i+k+WFpeaWsOWvhueggVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmKG5ld19wYXNzd29yZCE9PW5ld19wYXNzd29yZF9hZ2Fpbil7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kuKTmrKHlr4bnoIHkuI3lkIxcXFwiXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0ICsgXFxcIiZuZXdfcGFzc3dvcmQ9XFxcIiArIG5ld19wYXNzd29yZCtcXFwiJm5ld19wYXNzd29yZF9yZT1cXFwiK25ld19wYXNzd29yZF9hZ2Fpbik7XFxuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFwiLEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lOnVzZXJuYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ6bmV3X3Bhc3N3b3JkXFxuICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxwYXNzd29yZCx1c2VybmFtZSksXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxuICAgIH0pO1xcbn1cXG5cXG5zd2l0Y2ggKFBhdHRlcm4pIHtcXG4gICAgY2FzZSAwOlxcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXCLkv67mlLnlpLTlg49cXFwiKTtcXG4gICAgICAgIG1fYXZhdGFyKCk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAxOlxcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXCLkv67mlLnmmLXnp7BcXFwiKTtcXG4gICAgICAgIG1fcGV0TmFtZSgpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgMjpcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFwi5L+u5pS55a+G56CBXFxcIik7XFxuICAgICAgICBtX3B3ZCgpO1xcbiAgICAgICAgYnJlYWs7XFxufVxcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIue8lui+keinhOWImeWkh+azqFwiLFwicGF0aFwiOlwic2V0X3J1bGVfbm90ZXNcIixcInJ1bGVcIjpcImpzOlxcbmxldCBkYXRhID0gW107XFxuY29uc3Qge1xcbiAgICBnZXRBcGlcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgaWQsXFxuICAgIHVzZXJuYW1lLFxcbiAgICBwYXNzd29yZCxcXG4gICAgbmFtZVxcbn0gPSBNWV9QQVJBTVM7XFxuc2V0UGFnZVRpdGxlKFxcXCLlpIfms6jjgIxcXFwiK25hbWUrXFxcIuOAjVxcXCIpO1xcbmFkZExpc3RlbmVyKCdvbkNsb3NlJyxcXFwiY2xlYXJWYXIoJ1dhcmVob3VzZS5ydWxlLm5vdGVzJywgJycpXFxcIik7XFxubGV0IG5vdGVzPXJlcXVlc3QoZ2V0QXBpKFxcXCJnZXRfcnVsZV9ub3RlXFxcIikraWQpO1xcbm5vdGVzPUpTT04ucGFyc2Uobm90ZXMpLnJlc3VsdDtcXG5kYXRhLnB1c2goe1xcbiAgICBkZXNjOiBcXFwi6KeE5YiZ5aSH5rOoLi4uLi4uXFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5ydWxlLm5vdGVzJywgJycpfHxub3Rlc3x8XFxcIlxcXCIsXFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0Oi0xLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5ydWxlLm5vdGVzXFxcIixpbnB1dCknXFxuICAgIH1cXG59KTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuS/neWtmFxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHVybDogJChnZXRBcGkoXFxcInNldF9ydWxlX25vdGVcXFwiKSArIGlkKS5sYXp5UnVsZSgodXNlcm5hbWUsIHBhc3N3b3JkKSA9PiB7XFxuICAgICAgICBsZXQgbm90ZXMgPSBnZXRWYXIoJ1dhcmVob3VzZS5ydWxlLm5vdGVzJywgJycpO1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQsIHtcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJxcVxcXCI6IHVzZXJuYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogcGFzc3dvcmQsXFxuICAgICAgICAgICAgICAgICAgICBcXFwibm90ZVxcXCI6bm90ZXNcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG4gICAgICAgIH1cXG4gICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXCI7XFxuICAgIH0sIHVzZXJuYW1lLCBwYXNzd29yZClcXG59KTtcXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJsaW5lXCIsXCJuYW1lXCI6XCLor4TorrrliJfooahcIixcInBhdGhcIjpcIkNvbW1lbnRcIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi6K+E6K665YiX6KGoXFxcIik7XFxuY29uc3Qge1xcbiAgICBhcGlcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IGRhdGEgPSBbXTtcXG5sZXQge1xcbiAgICB0b3RhbFN1bSxcXG4gICAgaWQsXFxuICAgIG5vX2FjdGl2ZSxcXG4gICAgdXNlcm5hbWUsXFxuICAgIHBhc3N3b3JkXFxufSA9IE1ZX1BBUkFNUztcXG5sZXQgcGFnZSA9IHBhcnNlSW50KE1ZX1VSTC5zcGxpdChcXFwiI1xcXCIpWzFdKTtcXG5sZXQgZGlzY3Vzc190eXBlID0gZ2V0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFwiLCBcXFwiXFxcIik7XFxuaWYgKHBhZ2UgPT09IDEpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgfSkpO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLlhajpg6hcXFwiICsgKGRpc2N1c3NfdHlwZSA9PT0gXFxcIlxcXCIgPyBcXFwi4peJXFxcIiA6IFxcXCLil4tcXFwiKSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfNCdcXG5cXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIvCfkY3otZ5cXFwiICsgKGRpc2N1c3NfdHlwZSA9PT0gXFxcImdvb2RcXFwiID8gXFxcIuKXiVxcXCIgOiBcXFwi4peLXFxcIiksXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcIiwgXFxcImdvb2RcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF80J1xcblxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi8J+Rjui4qVxcXCIgKyAoZGlzY3Vzc190eXBlID09PSBcXFwiYmFkXFxcIiA/IFxcXCLil4lcXFwiIDogXFxcIuKXi1xcXCIpLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXCIsIFxcXCJiYWRcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF80J1xcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5Zue5aSNXFxcIiArIChkaXNjdXNzX3R5cGUgPT09IFxcXCJyZXBseVxcXCIgPyBcXFwi4peJXFxcIiA6IFxcXCLil4tcXFwiKSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFwiLCBcXFwicmVwbHlcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF80J1xcbiAgICB9KTtcXG59XFxuXFxuXFxubGV0IGljb24gPSB7XFxuICAgIFxcXCJnb29kXFxcIjogXFxcIvCfkY1cXFwiLFxcbiAgICBcXFwiYmFkXFxcIjogXFxcIvCfkY5cXFwiLFxcbiAgICBcXFwicmVwbHlcXFwiOlxcXCLlvIDlj5HogIXwn5ejXFxcIlxcbn1cXG5sZXQgY29udHJvbD0ocGlkLGFjdGl2ZSk9PnZvaWQgMDtcXG5pZihub19hY3RpdmUpe1xcbiAgICBjb250cm9sPWZ1bmN0aW9uKHBpZCxhY3RpdmUpe1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTphY3RpdmU/XFxcIumakOiXj+ivhOiuulxcXCI6XFxcIuWxleekuuivhOiuulxcXCIsXFxuICAgICAgICAgICAgdXJsOiQoYXBpLmRpc19kZXZfY29udHJvbCtwaWQrXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZCtcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKT0+e1xcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0PUpTT04ucGFyc2UocmVxdWVzdChpbnB1dCkpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIrcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBjb2xfdHlwZTpcXFwidGV4dF8yXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOlxcXCLliKDpmaTor4TorrpcXFwiLFxcbiAgICAgICAgICAgIHVybDokKFxcXCLnoa7orqTliKDpmaTor6Xor4Torro/XFxcIikuY29uZmlybSgoaW5wdXQpPT57XFxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQ9SlNPTi5wYXJzZShyZXF1ZXN0KGlucHV0KSk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIityZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgICAgIH0sYXBpLmRpc19kZXZfY29udHJvbCtwaWQrXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZCtcXFwiJmRlbGV0ZT0xXFxcIiksXFxuICAgICAgICAgICAgY29sX3R5cGU6XFxcInRleHRfMlxcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTpcXFwibGluZVxcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTpcXFwibGluZVxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbmlmICh0b3RhbFN1bSA9PT0gMCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCI8aDUgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz7kuIDmnaHor4TorrrkuZ/msqHmnInvvIzlv6vmnaXmiqLmspnlj5HlkKfvvIE8L2g1PlxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSk7XFxufSBlbHNlIHtcXG4gICAgbGV0IGNvbW1lbnRMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5kaXNfZ2V0ICsgaWQgKyBcXFwiP2xpbWl0PTUmcGFnZT1cXFwiICsgcGFnZSArIFxcXCImbm9fYWN0aXZlPVxcXCIgKyBub19hY3RpdmUgKyBcXFwiJmRpc2N1c3NfdHlwZT1cXFwiICsgZGlzY3Vzc190eXBlKSkucmVzdWx0O1xcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNvbW1lbnRMaXN0KSB7XFxuICAgICAgICBsZXQgUmVwbHkgPSBpdGVtLmRpc2N1c3NfdHlwZT09PVxcXCJyZXBseVxcXCImJml0ZW0ucmVwbHlfdG9fbmFtZSE9PWZhbHNlJiZpdGVtLnJlcGx5X3RvX2lkIT09ZmFsc2U/XFxcIuKAmOKAmOWbnuWkjUBcXFwiK2l0ZW0ucmVwbHlfdG9fbmFtZStcXFwiICNcXFwiK2l0ZW0uZGlzY3Vzc19pZCtcXFwi4oCZ4oCZXFxcXG5cXFwiOlxcXCJcXFwiO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lICsgXFxcIiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSdncmF5Jz48c21hbGw+I1xcXCIgKyBpdGVtLmlkICsgXFxcIjwvc21hbGw+PGZvbnQ+XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCIsXFxuICAgICAgICAgICAgLy91cmw6IG5vX2FjdGl2ZT9cXFwiaGlrZXI6Ly9wYWdlL1JlcGx5XFxcIjpcXFwidG9hc3Q6Ly9cXFwiICsgaXRlbS5xcSxcXG5cXHRcXHQgICAgICAgdXJsOm5vX2FjdGl2ZT9cXFwiaGlrZXI6Ly9wYWdlL1JlcGx5XFxcIjpcXFwibXFxd3BhOi8vaW0vY2hhdD9jaGF0X3R5cGU9d3BhJnVpbj1cXFwiK2l0ZW0ucXEsXFxuICAgICAgICAgICAgZXh0cmE6e1xcbiAgICAgICAgICAgICAgICBydWxlSWQ6IGlkLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXFxuICAgICAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcXG4gICAgICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxcbiAgICAgICAgICAgICAgICByZXBseUlkOml0ZW0uaWRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXG4gICAgICAgICAgICBkZXNjOiBSZXBseStpdGVtLmNyZWF0ZV9kYXRlICsgXFxcIsK3XFxcIiArIGljb25baXRlbS5kaXNjdXNzX3R5cGVdLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXCIsXFxuICAgICAgICAgICAgZXh0cmE6e1xcbiAgICAgICAgICAgICAgICBuYW1lOml0ZW0ubmFtZSxcXG4gICAgICAgICAgICAgICAgdHlwZTpcXFwibG9uZ190ZXh0XFxcIixcXG4gICAgICAgICAgICAgICAgdGV4dDppdGVtLmRpc2N1c3NfdGV4dFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxuICAgICAgICB9KTtcXG4gICAgICAgIGNvbnRyb2woaXRlbS5pZCxpdGVtLmFjdGl2ZSk7XFxuICAgIH1cXG4gICAgaWYgKGNvbW1lbnRMaXN0Lmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5cXG5zZXRSZXN1bHQoZGF0YSlcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWPkeihqOivhOiuulwiLFwicGF0aFwiOlwiTWFrZUFjb21tZW50XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZGF0YSA9IFtdO1xcbmNvbnN0IHtcXG4gICAgYXBpLFxcbiAgICBnZXRGaWxlXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGlkLFxcbiAgICBuYW1lLFxcbiAgICBkZWZhdWx0VHlwZVxcbn0gPSBNWV9QQVJBTVM7XFxubGV0IHVzZXI9Z2V0RmlsZSgpLnVzZXJ8fFtcXFwiXFxcIixcXFwiXFxcIl07XFxuXFxuc2V0UGFnZVRpdGxlKFxcXCLor4TorrooXFxcIiArIG5hbWUgKyBcXFwiKVxcXCIpO1xcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC50eXBlXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC50ZXh0XFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC5xcVxcXCIpO1xcbiAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxufSkpO1xcbmxldCB0eXBlID0gZ2V0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC50eXBlXFxcIikgfHwgZGVmYXVsdFR5cGV8fFxcXCJnb29kXFxcIjtcXG5kYXRhLnB1c2goe1xcbiAgICBkZXNjOiBcXFwi6K+E6K66Li4uLi4uXFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5jb21tZW50LnRleHQnLCAnJyksXFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0OjcsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQudGV4dFxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIui0puWPt++8mlxcXCIrKHVzZXJbMF18fFxcXCJcXFwiKSxcXG4gICAgZGVzYzpcXFwi6aqM6K+B56CB77yaXFxcIisodXNlclsxXXx8XFxcIlxcXCIpLFxcbiAgICB1cmw6XFxcImhpa2VyOi8vcGFnZS9Vc2VycmVnaXN0cmF0aW9uXFxcIixcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnLFxcbiAgICBcXG59KTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogICh0eXBlID09PSBcXFwiZ29vZFxcXCIgPyBcXFwi4peJXFxcIiA6IFxcXCLil4tcXFwiKStcXFwiIPCfkY1cXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC50eXBlXFxcIiwgXFxcImdvb2RcXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzInXFxuXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICAodHlwZSA9PT0gXFxcImJhZFxcXCIgPyBcXFwi4peJXFxcIiA6IFxcXCLil4tcXFwiKStcXFwiIPCfkY5cXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC50eXBlXFxcIiwgXFxcImJhZFxcXCIpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMidcXG59KTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaPkOS6pFxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHVybDogJChhcGkuZGlzX25ldyArIGlkKS5sYXp5UnVsZSgoQWNjb3VudCkgPT4ge1xcbiAgICAgICAgbGV0IHRleHQgPSBnZXRWYXIoJ1dhcmVob3VzZS5jb21tZW50LnRleHQnLCAnJyk7XFxuICAgICAgICBsZXQgW3FxLGF1dGhfY29kZV0gPSBBY2NvdW50O1xcbiAgICAgICAgbGV0IHR5cGUgPSBnZXRWYXIoJ1dhcmVob3VzZS5jb21tZW50LnR5cGUnKSB8fCAnZ29vZCc7XFxuICAgICAgICBxcT1xcXx8XFxcIlxcXCI7XFxuICAgICAgICBhdXRoX2NvZGU9YXV0aF9jb2RlfHxcXFwiXFxcIjtcXG4gICAgICAgIGlmKHFxPT1cXFwiXFxcInx8YXV0aF9jb2RlPT1cXFwiXFxcIil7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acqueZu+W9lei0puWPt1xcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBpZih0ZXh0PT1cXFwiXFxcIil7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S9oOi/mOS7gOS5iOmDveayoeWGmeWVilxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBmdW5jdGlvbiByKHApIHtcXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHApLFxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHAgPSB7XFxuICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgXFxcImRpc2N1c3NfdGV4dFxcXCI6IHRleHQsXFxuICAgICAgICAgICAgICAgIFxcXCJxcVxcXCI6IHFxLFxcbiAgICAgICAgICAgICAgICBcXFwiZGlzY3Vzc190eXBlXFxcIjogdHlwZSxcXG4gICAgICAgICAgICAgICAgXFxcImF1dGhfY29kZVxcXCI6IGF1dGhfY29kZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGxldCByZXN1bHQgPSByKHApO1xcbiAgICAgICAgaWYocmVzdWx0LnN0YXR1cz09PTApe1xcbiAgICAgICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIrcmVzdWx0LmRldGFpbDtcXG5cXG4gICAgfSx1c2VyKVxcbn0pO1xcblxcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuS8queUqOaIt+azqOWGjFwiLFwicGF0aFwiOlwiVXNlcnJlZ2lzdHJhdGlvblwiLFwicnVsZVwiOlwianM6XFxuY29uc3Qge1xcbiAgICBhcGksXFxuICAgIGdldEZpbGUsXFxuICAgIGdldFVzZXJEYXRlXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCBkYXRhID0gW107XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbnNldFBhZ2VUaXRsZShcXFwi55So5oi35YiX6KGo566h55CGXFxcIik7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5tLnFxXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UubS55em1cXFwiKTtcXG59KSk7XFxubGV0IHVzZXIgPSBnZXRGaWxlKCk7XFxubGV0IHVzZXJOYW1lID0gdXNlci51c2VyIHx8IFtcXFwiXFxcIl07XFxudXNlck5hbWUgPSB1c2VyTmFtZVswXTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnTxiaWc+KOa3u+WKoC/pqozor4Ep6LSm5Y+3PC9iaWc+XFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbn0pO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6I635Y+WXFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGRlc2M6IFxcXCLor7fovpPlhaVxcVxcXCIsXFxuICAgIHVybDogJC50b1N0cmluZygoYSwgYikgPT4ge1xcbiAgICAgICAgbGV0IHFxID0gaW5wdXQ7XFxuICAgICAgICBpZiAocXEgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L2g6L+Y5LuA5LmI6YO95rKh5aGr5ZWKIVxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBzaG93TG9hZGluZyhcXFwi6I635Y+W5LitLi4uXFxcIilcXG4gICAgICAgIHJldHVybiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChxcSwgYSwgYikgPT4ge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChhLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwicXFcXFwiOiBxcVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0MiA9IEpTT04ucGFyc2UocmVxdWVzdChiICsgXFxcIj9xcT1cXFwiICsgcXEpKTtcXG4gICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQyLmRldGFpbDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICB0aHJvdyBlO1xcbiAgICAgICAgfVxcbiAgICAgICAgfSwgcXEsIGEsIGIpO1xcblxcbiAgICB9LCBhcGkuZGlzX25ld191c2VyLCBhcGkuZGlzX3ZlcmlmeSksXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0eXBlOiBcXFwibnVtYmVyXFxcIixcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5xcScsICcnKSB8fCB1c2VyTmFtZSxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UubS5xcVxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSk7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGRlc2M6IFxcXCLor7fovpPlhaXpqozor4HnoIFcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS55em0nLCAnJyksXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLm0ueXptXFxcIixpbnB1dCknXFxuICAgIH1cXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCcsXFxuICAgIHRpdGxlOiBcXFwiPHNtYWxsPuaPkOekuu+8mjEu5q+P5aSp5Y+q6IO96I635Y+WNeasoemqjOivgeeggS48YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi48cz7pqozor4HnoIHmnInmlYjmnJ/mjIHnu63kuIDlkajlt6blj7M8L3M+KOaaguaXtuS4jeS8mu+8jOW/mOiusOmqjOivgeeggeWPr+mAmui/h1FR5Y+36I635Y+WKTwvc21hbGw+XFxcIlxcbn0pO1xcblxcbmxldCB1c2VyTGlzdCA9IGdldFVzZXJEYXRlKCk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLpqozor4Ev55m75b2VXFxcIixcXG4gICAgdXJsOiAkKFxcXCLnoa7lrprkv53lrZjvvIzpqozor4HnoIHloavplJnvvIzml6Dms5Xor4Torrrlk6ZcXFwiKS5jb25maXJtKChmLCBsLCBsb2dpbikgPT4ge1xcbiAgICAgICAgbGV0IHFxID0gZ2V0VmFyKCdXYXJlaG91c2UubS5xcScsICcnKTtcXG4gICAgICAgIGxldCB5em0gPSBnZXRWYXIoJ1dhcmVob3VzZS5tLnl6bScsICcnKTtcXG4gICAgICAgIGlmIChxcSA9PSBcXFwiXFxcIiB8fCB5em0gPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vcXHmiJbpqozor4HnoIHkuLrnqbpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QobG9naW4sIHtcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJxcVxcXCI6IHFxLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcImF1dGhfY29kZVxcXCI6IHl6bVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgZi51c2VyID0gW3FxLCB5em1dO1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShmKSk7XFxuICAgICAgICAgICAgbGV0IGluZGV4ID0gbC5maW5kSW5kZXgoaXRlbSA9PiBpdGVtWzBdID09PSBxcSk7XFxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcXG4gICAgICAgICAgICAgICAgbC5zcGxpY2UoaW5kZXgsIDEsIFtxcSwgeXptXSk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChsLmxlbmd0aCA8IDYpIHtcXG4gICAgICAgICAgICAgICAgbC5wdXNoKFtxcSwgeXptXSk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgbC5zcGxpY2UoMCwgMSk7XFxuICAgICAgICAgICAgICAgIGwucHVzaChbcXEsIHl6bV0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUkEuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGwpKTtcXG4gICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+mqjOivgeaIkOWKn1xcXCI7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuICAgIH0sIHVzZXIsIHVzZXJMaXN0LCBhcGkuZGlzX2xvZ2luKSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnTxiaWc+6LSm5Y+35YiX6KGoPC9iaWc+XFxcXHRcXFxcdFxcXFx0PHNtYWxsPijkv53nlZk15p2h6K6w5b2VKTwvc21hbGw+XFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbn0pO1xcbnVzZXJMaXN0LnJldmVyc2UoKTtcXG5cXG5mb3IgKGxldCBpdGVtIG9mIHVzZXJMaXN0KSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIui0puWPt++8mlxcXCIgKyBpdGVtWzBdICsgKHVzZXJOYW1lID09PSBpdGVtWzBdID8gXFxcIlxcXFx0XFxcXHRcXFxcdOKAnOKAnFvlvZPliY3otKblj7dd4oCd4oCdXFxcIiA6IFxcXCJcXFwiKSxcXG4gICAgICAgIGRlc2M6IFxcXCLpqozor4HnoIHvvJpcXFwiICsgaXRlbVsxXSxcXG4gICAgICAgIHVybDogJChcXFwi5piv5ZCm5YiH5o2i5Li66K+lW1xcXCIgKyBpdGVtWzBdICsgXFxcIl3otKblj7dcXFwiKS5jb25maXJtKChmLCBpdGVtKSA9PiB7XFxuICAgICAgICAgICAgZi51c2VyID0gaXRlbTtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoZikpO1xcbiAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5YiH5o2i5oiQ5YqfXFxcIjtcXG4gICAgICAgIH0sIHVzZXIsIGl0ZW0pLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxuICAgIH0pO1xcbn1cXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLpgIDlh7rotKblj7dcXFwiLFxcbiAgICB1cmw6ICQoXFxcIuehruiupOmAgOWHuueZu+W9leeKtuaAgVxcXCIpLmNvbmZpcm0oKGYpID0+IHtcXG4gICAgICAgIGYudXNlciA9IFtdO1xcbiAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGYpKTtcXG4gICAgICAgIGJhY2soKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/pgIDlh7rmiJDlip9cXFwiO1xcbiAgICB9LCB1c2VyKSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbn0pO1xcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWIl+ihqOaOkuW6j+eul+azlVwiLFwicGF0aFwiOlwic29ydFwiLFwicnVsZVwiOlwianM6XFxuLyog6KeE5YiZ5YiX6KGo5o6S5bqPIFsgVVDjgIFORVfjgIHml6Dmm7TmlrAgXSDpobrluo8gKi9cXG4vKiDlvZLlubbmjpLluo8gU3RhcnQgKi9cXG5mdW5jdGlvbiBtZXJnZVNvcnQoYXJyKSB7XFxuICAgIHZhciBsZW4gPSBhcnIubGVuZ3RoO1xcbiAgICBpZiAobGVuIDwgMikge1xcbiAgICAgICAgcmV0dXJuIGFycjtcXG4gICAgfVxcbiAgICB2YXIgbWlkZGxlID0gTWF0aC5mbG9vcihsZW4gLyAyKSxcXG4gICAgICAgIGxlZnQgPSBhcnIuc2xpY2UoMCwgbWlkZGxlKSxcXG4gICAgICAgIHJpZ2h0ID0gYXJyLnNsaWNlKG1pZGRsZSk7XFxuICAgIHJldHVybiBtZXJnZShtZXJnZVNvcnQobGVmdCksIG1lcmdlU29ydChyaWdodCkpO1xcbn1cXG5mdW5jdGlvbiBtZXJnZShsZWZ0LCByaWdodCkge1xcbiAgICB2YXIgcmVzdWx0ID0gW107XFxuICAgIHZhciBpc1RoaXNWZXJzaW9uTGlzdCA9IFtdO1xcblxcbiAgICB3aGlsZSAobGVmdC5sZW5ndGggPiAwICYmIHJpZ2h0Lmxlbmd0aCA+IDApIHtcXG4gICAgICAgIGlmIChsZWZ0WzBdLnRpdGxlLmluY2x1ZGVzKFxcXCLwn4aZXFxcIikpIHtcXG4gICAgICAgICAgICByZXN1bHQucHVzaChsZWZ0LnNoaWZ0KCkpO1xcbiAgICAgICAgfSBlbHNlIGlmIChyaWdodFswXS50aXRsZS5pbmNsdWRlcyhcXFwi8J+GmVxcXCIpKSB7XFxuICAgICAgICAgICAgcmVzdWx0LnB1c2gocmlnaHQuc2hpZnQoKSk7XFxuICAgICAgICB9IGVsc2UgaWYgKGxlZnRbMF0udGl0bGUuaW5jbHVkZXMoXFxcIvCfhpVcXFwiKSkge1xcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGxlZnQuc2hpZnQoKSk7XFxuICAgICAgICB9IGVsc2UgaWYgKHJpZ2h0WzBdLnRpdGxlLmluY2x1ZGVzKFxcXCLwn4aVXFxcIikpIHtcXG4gICAgICAgICAgICByZXN1bHQucHVzaChyaWdodC5zaGlmdCgpKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgaXNUaGlzVmVyc2lvbkxpc3QucHVzaChsZWZ0LnNoaWZ0KCkpO1xcbiAgICAgICAgICAgIGlzVGhpc1ZlcnNpb25MaXN0LnB1c2gocmlnaHQuc2hpZnQoKSk7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgd2hpbGUgKGlzVGhpc1ZlcnNpb25MaXN0Lmxlbmd0aCkgcmVzdWx0LnB1c2goaXNUaGlzVmVyc2lvbkxpc3Quc2hpZnQoKSk7XFxuXFxuICAgIHdoaWxlIChsZWZ0Lmxlbmd0aClcXG4gICAgICAgIHJlc3VsdC5wdXNoKGxlZnQuc2hpZnQoKSk7XFxuXFxuICAgIHdoaWxlIChyaWdodC5sZW5ndGgpXFxuICAgICAgICByZXN1bHQucHVzaChyaWdodC5zaGlmdCgpKTtcXG5cXG4gICAgcmV0dXJuIHJlc3VsdDtcXG59XFxuJC5leHBvcnRzLm1lcmdlU29ydCA9IG1lcmdlU29ydDtcXG4vKiDlvZLlubbmjpLluo8gRW5kICovXCJ9LHtcImNvbF90eXBlXCI6XCJpY29uXzJfcm91bmRcIixcIm5hbWVcIjpcIuWFqOmDqOWFrOW8gOinhOWImVwiLFwicGF0aFwiOlwiQWxsUHVibGljUnVsZVwiLFwicnVsZVwiOlwianM6XFxuICAgIGNvbnN0IHtcXG4gICAgICAgIGFwaSxcXG4gICAgICAgIGxvY2FsUnVsZVZlcixcXG4gICAgICAgIGdldEFwaVxcbiAgICB9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxuY29uc3Qge1xcbiAgICBtZXJnZVNvcnRcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2Uvc29ydFxcXCIpO1xcbmxldCBkYXRhVHlwZSA9IGdldFZhcihcXFwiV2FyZWhvdXNlLnR5cGVcXFwiLCBcXFwiXFxcIik7XFxubGV0IG9yZGVyID0gZ2V0VmFyKFxcXCJXYXJlaG91c2Uub3JkZXJcXFwiLCBcXFwiMFxcXCIpO1xcbmxldCBzb3J0ID0gZ2V0VmFyKFxcXCJXYXJlaG91c2Uuc29ydFxcXCIsIFxcXCIwXFxcIik7XFxubGV0IGdvb2QgPSBnZXRWYXIoXFxcIldhcmVob3VzZS5nb29kXFxcIiwgXFxcIlxcXCIpO1xcbmxldCBwYWdlID0gTVlfVVJMLnNwbGl0KFxcXCIjXFxcIilbMV0gfHwgMTtcXG5sZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmFsbF9ydWxlICsgXFxcIj9kYXRhX3R5cGU9XFxcIiArIGRhdGFUeXBlICsgXFxcIiZwYWdlPVxcXCIgKyBwYWdlICsgXFxcIiZsaW1pdD0yMCZvcmRlcj1cXFwiICsgb3JkZXIgKyBcXFwiJnNvcnQ9XFxcIiArIHNvcnQrIFxcXCImaXNfZ29vZD1cXFwiICsgZ29vZCkpLnJlc3VsdDtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLnR5cGVcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5vcmRlclxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLnNvcnRcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5nb29kXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIpO1xcbn0pKTtcXG5sZXQgZGF0YSA9IFtdO1xcbmlmIChnZXRWYXIoXFxcIldhcmVob3VzZS5iYWNrXFxcIikgPT09IFxcXCIxXFxcIikge1xcbiAgICBiYWNrKCk7XFxufVxcbmZ1bmN0aW9uIHRhYihhcnIsIHR5cGUsIGNvbnRyYXN0KSB7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgYXJyKSB7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtWzFdID09PSBjb250cmFzdCA/IFxcXCLigJzigJxcXFwiICsgaXRlbVswXSArIFxcXCLigJ3igJ1cXFwiIDogaXRlbVswXSxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGtleSwgdHlwZSkgPT4ge1xcbiAgICAgICAgICAgICAgICBwdXRWYXIodHlwZSwga2V5KTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgIH0sIGl0ZW1bMV0sIHR5cGUpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIlxcbiAgICB9KTtcXG59XFxuaWYgKHBhZ2UgPT09IFxcXCIxXFxcIikge1xcbiAgICB0YWIoW1xcbiAgICAgICAgW1xcXCLlhajpg6hcXFwiLCBcXFwiXFxcIl0sXFxuICAgICAgICBbXFxcIuWwj+eoi+W6j1xcXCIsIFxcXCJob21lX3J1bGVfdXJsXFxcIl0sXFxuICAgICAgICBbXFxcIuaPkOS6pOS6keS7k+W6k+inhOWImVxcXCIsIFxcXCJwdWJsaXNoXFxcIl0sXFxuICAgICAgICBbXFxcIue9kemhteaPkuS7tlxcXCIsIFxcXCJqc191cmxcXFwiXSxcXG4gICAgICAgIFtcXFwi6Z2Z5oCB6aG16Z2iXFxcIiwgXFxcImh0bWxcXFwiXSxcXG4gICAgICAgIFtcXFwi5Li76aKYXFxcIiwgXFxcImNvbmZpZ1xcXCJdXFxuICAgIF0sIFxcXCJXYXJlaG91c2UudHlwZVxcXCIsIGRhdGFUeXBlKTtcXG4gICAgdGFiKFtcXG4gICAgICAgIFtcXFwi5pe26Ze0XFxcIiwgXFxcIjBcXFwiXSxcXG4gICAgICAgIFtcXFwiSURcXFwiLCBcXFwiMVxcXCJdLFxcbiAgICAgICAgW1xcXCLlpb3or4TluqZcXFwiLCBcXFwiMlxcXCJdLFxcbiAgICAgICAgW1xcXCLlt67or4TluqZcXFwiLCBcXFwiM1xcXCJdLFxcbiAgICAgICAgW1xcXCLlm57lpI3mlbBcXFwiLCBcXFwiNFxcXCJdXFxuICAgIF0sIFxcXCJXYXJlaG91c2Uub3JkZXJcXFwiLCBvcmRlcik7XFxuICAgIHRhYihbXFxuICAgICAgICBbXFxcIuWAkuW6j1xcXCIsIFxcXCIwXFxcIl0sXFxuICAgICAgICBbXFxcIuato+W6j1xcXCIsIFxcXCIxXFxcIl1cXG4gICAgXSwgXFxcIldhcmVob3VzZS5zb3J0XFxcIiwgc29ydCk7XFxuICAgIHRhYihbXFxuICAgICAgICBbXFxcIuS4jeiuulxcXCIsIFxcXCJcXFwiXSxcXG4gICAgICAgIFtcXFwi5LyY6LSoXFxcIiwgXFxcIjFcXFwiXVxcbiAgICBdLCBcXFwiV2FyZWhvdXNlLmdvb2RcXFwiLCBnb29kKTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5pCc57SiXFxcIixcXG4gICAgICAgIHVybDogJC50b1N0cmluZyhuYW1lID0+IFxcXCJoaWtlcjovL3NlYXJjaD9zPVxcXCIgKyBpbnB1dCArIFxcXCImcnVsZT1cXFwiICsgbmFtZSwgTVlfUlVMRS50aXRsZSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgICAgIGRlc2M6IFxcXCLmkJzntKLlhajpg6jop4TliJlcXFwiXFxuICAgIH0pO1xcbn1cXG5cXG5sZXQgaG9tZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmhvbWUpKTtcXG5sZXQgbVJ1bGVMaXN0ID0gW107XFxuZm9yICh2YXIgaXRlbSBvZiBydWxlTGlzdCkge1xcbiAgICB2YXIgbmFtZSA9IGl0ZW0ubmFtZTtcXG4gICAgaWYgKGl0ZW0uaXNfdGFwKSB7XFxuICAgICAgICBsZXQgbG9jYXRpb24gPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXCJydWxlTGlzdEpzb25cXFwiKSArIFxcXCI/aWQ9XFxcIiArIGl0ZW0uaWQpKTtcXG4gICAgICAgIGl0ZW0uaWQgPSBsb2NhdGlvbi5pZDtcXG4gICAgICAgIGl0ZW0ubmFtZSA9IGxvY2F0aW9uLm5hbWU7XFxuICAgICAgICBpdGVtLmF1dGhvciA9IGxvY2F0aW9uLmF1dGhvcjtcXG4gICAgICAgIGl0ZW0uZGF0YV90eXBlID0gbG9jYXRpb24uZGF0YV90eXBlO1xcbiAgICAgICAgaXRlbS52ZXIgPSBsb2NhdGlvbi52ZXJcXG4gICAgfVxcbiAgICBpdGVtLnZlcnNpb24gPSBpdGVtLnZlcjtcXG4gICAgbGV0IGxhYmVsID0gXFxcIlxcXCIsXFxuICAgICAgICBsdmVyID0gLTI7XFxuICAgIGlmIChpdGVtLmlzX2pzb24gJiYgaXRlbS5kYXRhX3R5cGUgPT09IFxcXCJob21lX3J1bGVfdXJsXFxcIikge1xcbiAgICAgICAgbHZlciA9IGxvY2FsUnVsZVZlcihob21lTGlzdCwgaXRlbSk7XFxuICAgICAgICBpZiAobHZlciA9PT0gLTEpIHtcXG4gICAgICAgICAgICBsYWJlbCA9IFxcXCLwn4aVXFxcIjtcXG4gICAgICAgIH0gZWxzZSBpZiAobHZlciA8IGl0ZW0udmVyKSB7XFxuICAgICAgICAgICAgbGFiZWwgPSBcXFwi8J+GmVxcXCI7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgbVJ1bGVMaXN0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGxhYmVsICsgbmFtZSxcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9ydWxlRGV0YWlsI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGx2ZXI6IGx2ZXIsXFxuICAgICAgICAgICAgaWQ6IGl0ZW0uaWQsXFxuICAgICAgICAgICAgaXNBbGw6dHJ1ZVxcbiAgICAgICAgfSxcXG4gICAgICAgIHBpY191cmw6IGl0ZW0ucGljLFxcbiAgICB9KVxcbn1cXG4vKiDlvZLlubbmjpLluo8gU3RhcnQgKi9cXG4vL21SdWxlTGlzdCA9IG1lcmdlU29ydChtUnVsZUxpc3QpO1xcbi8qIOW9kuW5tuaOkuW6jyBFbmQgKi9cXG5kYXRhLnB1c2guYXBwbHkoZGF0YSwgbVJ1bGVMaXN0KVxcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWbnuWkjVwiLFwicGF0aFwiOlwiUmVwbHlcIixcInJ1bGVcIjpcImpzOlxcbmxldCBkYXRhID0gW107XFxuY29uc3Qge1xcbiAgICBhcGlcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgcmVwbHlJZCxcXG4gICAgcnVsZUlkLFxcbiAgICBuYW1lLFxcbiAgICBwYXNzd29yZCxcXG4gICAgdXNlcm5hbWVcXG59ID0gTVlfUEFSQU1TO1xcblxcblxcbnNldFBhZ2VUaXRsZShcXFwi5Zue5aSNKFxcXCIgKyBuYW1lICsgXFxcIilcXFwiKTtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQudGV4dFxcXCIpO1xcbiAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxufSkpO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIGRlc2M6IFxcXCLlm57lpI0uLi4uLi5cXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLmNvbW1lbnQudGV4dCcsICcnKSxcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6NyxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC50ZXh0XFxcIixpbnB1dCknXFxuICAgIH1cXG59KTtcXG5cXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaPkOS6pFxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHVybDogJChhcGkuZGlzX3JlcGx5ICsgcnVsZUlkKS5sYXp5UnVsZSgocGFzc3dvcmQsIHVzZXJuYW1lLCBydWxlSWQpID0+IHtcXG4gICAgICAgIGxldCB0ZXh0ID0gZ2V0VmFyKCdXYXJlaG91c2UuY29tbWVudC50ZXh0JywgJycpO1xcbiAgICAgICAgaWYgKHBhc3N3b3JkID09IFxcXCJcXFwiIHx8IHVzZXJuYW1lID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acqueZu+W9lei0puWPt1xcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAodGV4dCA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHlhpnllYpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQsIHtcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJkaXNjdXNzX3RleHRcXFwiOiB0ZXh0LFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInFxXFxcIjogdXNlcm5hbWUsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBwYXNzd29yZCxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJkaXNjdXNzX2lkXFxcIjogcnVsZUlkXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgfSk7XFxuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG5cXG4gICAgfSwgcGFzc3dvcmQsIHVzZXJuYW1lLCByZXBseUlkKVxcbn0pO1xcblxcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuaIkeeahOWbnuWkjVwiLFwicGF0aFwiOlwiTXlSZXBseVwiLFwicnVsZVwiOlwianM6XFxuY29uc3Qge1xcbiAgICBhcGlcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgYXV0aF9jb2RlLFxcbiAgICBxcVxcbn0gPSBNWV9QQVJBTVM7XFxubGV0IHBhZ2UgPSBwYXJzZUludChNWV9VUkwuc3BsaXQoXFxcIiNcXFwiKVsxXSk7XFxubGV0IGRhdGE9W107XFxubGV0IGNvbW1lbnRMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5kaXNfZ2V0X3JlcGx5ICsgXFxcIj9saW1pdD01JnBhZ2U9XFxcIiArIHBhZ2UgKyBcXFwiJnFxPVxcXCIgKyBxcSArIFxcXCImYXV0aF9jb2RlPVxcXCIgKyBhdXRoX2NvZGUpKS5yZXN1bHQ7XFxuaWYgKGNvbW1lbnRMaXN0Lmxlbmd0aCA9PT0gMCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCI8aDUgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz7liKvmi4nkuobkuIDmnaHkuZ/kuI3liankuoY8L2g1PlxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSk7XFxufSBlbHNlIHtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjb21tZW50TGlzdCkge1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lICsgXFxcIiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSdncmF5Jz48c21hbGw+I1xcXCIgKyBpdGVtLmlkICsgXFxcIjwvc21hbGw+PGZvbnQ+XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVEZXRhaWwjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsdmVyOiBcXFwi5Zue5aSN6L+b5YWl5LiN5pSv5oyB5p+l55yLXFxcIixcXG4gICAgICAgICAgICAgICAgaWQ6IGl0ZW0ucnVsZV9pZFswXVxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0uZGlzY3Vzc190ZXh0LFxcbiAgICAgICAgICAgIGRlc2M6IGl0ZW0uY3JlYXRlX2RhdGUgKyBcXFwiwrdcXFwiK2l0ZW0ucnVsZV9pZFsxXStcXFwiwrdcXFwiK1xcXCLlvIDlj5HogIXwn5ejXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOntcXG4gICAgICAgICAgICAgICAgbmFtZTppdGVtLm5hbWUsXFxuICAgICAgICAgICAgICAgIHR5cGU6XFxcImxvbmdfdGV4dFxcXCIsXFxuICAgICAgICAgICAgICAgIHRleHQ6aXRlbS5kaXNjdXNzX3RleHRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgXFxufVxcbnNldFJlc3VsdChkYXRhKTtcXG5cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuabtOWkmuWIhuS6q1wiLFwicGF0aFwiOlwibW9yZVNoYXJlXCIsXCJydWxlXCI6XCJqczpcXG4gICAgYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpPT57XFxuICAgICAgICBjbGVhclZhcihcXFwiaG91c2UudXBsb2FkX2NvZGVcXFwiKTtcXG4gICAgfSkpO1xcbmNvbnN0IHtjb2xvcixzbWFsbCxhcGksIGdldEZpbGV9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcbmxldCBwdXRfdXJsID0gYXBpLmhvc3QrJy9oaWtlcnVsZS9kZXYvcHV0JztcXG5pZighaG91c2VGaWxlKXtcXG4gICAgc2V0SXRlbSgnaXNfaG91c2VfdmlwJywgJ2ZhbHNlJyk7XFxufVxcbmxldCBob3VzZV9kYXRhID0gaG91c2VGaWxlKCk7XFxuLy8gbG9nKGhvdXNlX2RhdGEudXNlcm5hbWUrJy0nK2hvdXNlX2RhdGEucGFzc3dvcmQpO1xcbnZhciBjYW51cCA9IGhvdXNlX2RhdGEudXNlcm5hbWUubGVuZ3RoID49IDYgJiYgaG91c2VfZGF0YS5wYXNzd29yZC5sZW5ndGggPiAyO1xcbmxvZygn5Y+v5Lul5LiK5LygPycrY2FudXApO1xcbmxldCBkID0gW107XFxubGV0IGZpbGVfdHlwZSA9IFt7bmFtZTon6Z2Z5oCB5paH5Lu2Jyx2YWx1ZTonaHRtbCd9LHtuYW1lOifnvZHpobXmj5Lku7YnLHZhbHVlOidqc191cmwnfSx7bmFtZTon5Li76aG16YWN572uJyx2YWx1ZTonY29uZmlnJ31dOyAvL+S4iuS8oOexu+Wei1xcbmxldCBmaWxlX3JlZGlyZWN0ID0gW3tuYW1lOifmnKzlnLAnLHZhbHVlOidmYWxzZSd9LHtuYW1lOifnm7Tpk74zMDInLHZhbHVlOid0cnVlJ31dOyAvL+aYr+WQpumHjeWumuWQkVxcbmxldCBmaWxlX3VhID0gW3tuYW1lOifnlLXohJEnLHZhbHVlOidwYyd9LHtuYW1lOifmiYvmnLonLHZhbHVlOidtb2JpbGUnfV07XFxubGV0IGZpbGVfdHlwZV90aXRsZSA9IGZpbGVfdHlwZS5tYXAoKGl0ZW0pID0+IHtcXG4gICAgbGV0IG5hbWUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3R5cGUnLCfpnZnmgIHmlofku7YnKTtcXG4gICAgaWYoaXRlbS5uYW1lPT09bmFtZSl7XFxuICAgICAgICByZXR1cm4gJ/CfkYknK2l0ZW0ubmFtZTtcXG4gICAgfWVsc2V7XFxuICAgICAgICByZXR1cm4gaXRlbS5uYW1lO1xcbiAgICB9XFxufSk7XFxubGV0IGZpbGVfcmVkaXJlY3RfdGl0bGUgPSBmaWxlX3JlZGlyZWN0Lm1hcCgoaXRlbSkgPT4ge1xcbiAgICBsZXQgbmFtZSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfcmVkaXJlY3QnLCfmnKzlnLAnKTtcXG4gICAgaWYoaXRlbS5uYW1lPT09bmFtZSl7XFxuICAgICAgICByZXR1cm4gJ/CfkYknK2l0ZW0ubmFtZTtcXG4gICAgfWVsc2V7XFxuICAgICAgICByZXR1cm4gaXRlbS5uYW1lO1xcbiAgICB9XFxufSk7XFxubGV0IGZpbGVfdWFfdGl0bGUgPSBmaWxlX3VhLm1hcCgoaXRlbSkgPT4ge1xcbiAgICBsZXQgbmFtZSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnLCfnlLXohJEnKTtcXG4gICAgaWYoaXRlbS5uYW1lPT09bmFtZSl7XFxuICAgICAgICByZXR1cm4gJ/CfkYknK2l0ZW0ubmFtZTtcXG4gICAgfWVsc2V7XFxuICAgICAgICByZXR1cm4gaXRlbS5uYW1lO1xcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtjb2xfdHlwZTogJ3g1X3dlYnZpZXdfc2luZ2xlJywgZXh0cmE6IHtqczogJ2NvbnNvbGUubG9nKFxcXCLmiJHliqDovb3kuoZcXFwiKSd9fSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6ICfojrflj5YnLFxcbiAgICBkZXNjOiBcXFwi5paH5Lu26Lev5b6ELOaUr+aMgWhpa2VyLGZpbGUsaHR0cCzkuLvpophcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgb25DaGFuZ2U6IFxcXCJwdXRWYXIoJ2hvdXNlLndlYl91cmwnLGlucHV0KVxcXCIsXFxuICAgICAgICB0aXRsZVZpc2libGU6IHRydWUsXFxuICAgICAgICBpZDonZmlsZVBhdGgnLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOmdldFZhcignaG91c2Uud2ViX3VybCcpXFxuICAgIH0sXFxuICAgIHVybDokLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIGxldCBpbnB1dCA9IGdldFZhcignaG91c2Uud2ViX3VybCcsJycpO1xcbiAgICAgICAgaWYoaW5wdXQubGVuZ3RoPDIpe1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/pk77mjqXkuI3lj6/ku6XkuLrnqbonXFxuICAgICAgICB9IGVsc2UgaWYoL15oaWtlcjp8XmZpbGU6fF5odHRwOnxeaHR0cHM6fF5cXFxcL3N0b3JhZ2VcXFxcL3xeXFxcXC9zZGNhcmRcXFxcLy8udGVzdChpbnB1dCkpe1xcbiAgICAgICAgICAgIGlmKC9eXFxcXC9zdG9yYWdlXFxcXC98XlxcXFwvc2RjYXJkXFxcXC8vLnRlc3QoaW5wdXQpKXtcXG4gICAgICAgICAgICAgICAgaW5wdXQgPSAnZmlsZTovLycraW5wdXQ7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxvZygn5q2j5bi46ZO+5o6lOicraW5wdXQpO1xcbiAgICAgICAgICAgIGxldCB1YSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnKT09PSfnlLXohJEnPydNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODguMC40MzI0LjE0NiBTYWZhcmkvNTM3LjM2JzonTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDk7IE1JIDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OS4wLjQzODkuOTAgTW9iaWxlIFNhZmFyaS81MzcuMzYnO1xcbiAgICAgICAgICAgIGxldCB3ZWJfdXJsX2FyciA9IGlucHV0LnNwbGl0KCc7Jyk7XFxuICAgICAgICAgICAgbGV0IHdlYl91cmwgPSB3ZWJfdXJsX2FyclswXTtcXG4gICAgICAgICAgICBsZXQgaGVhZGVycyA9IHtcXG4gICAgICAgICAgICAgICAgJ1JlZmVyZXInOidodHRwczovL2Jsb2cuY3Nkbi5uZXQnLFxcbiAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6dWEsXFxuICAgICAgICAgICAgICAgICdBY2NlcHQnOidhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQsICovKjsgcT0wLjAxJyxcXG4gICAgICAgICAgICAgICAgJ0FjY2VwdC1MYW5ndWFnZSc6J3poLUNOJyxcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIGlmKHdlYl91cmxfYXJyLmxlbmd0aD49MyYmd2ViX3VybF9hcnJbMl0ubGVuZ3RoPjIpeyAvL+iuvue9rue8lueggVxcbiAgICAgICAgICAgICAgICBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICdjaGFyc2V0PScrd2ViX3VybF9hcnJbMl0udG9VcHBlckNhc2UoKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHtoZWFkZXJzOmhlYWRlcnMsd2l0aEhlYWRlcnM6ZmFsc2UscmVkaXJlY3Q6ZmFsc2V9O1xcbiAgICAgICAgICAgIGlmKHdlYl91cmxfYXJyLmxlbmd0aD49MiYmd2ViX3VybF9hcnJbMV0ubGVuZ3RoPjIpeyAvLyDorr7nva7or7fmsYLmlrnms5VcXG4gICAgICAgICAgICAgICAgcGFyYW1zWydtZXRob2QnXSA9IHdlYl91cmxfYXJyWzFdLnRvVXBwZXJDYXNlKCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxvZygn5byA5aeL6I635Y+W5rqQ56CBJyk7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgLypcXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFzeW5jKHdlYl91cmwscGFyYW1zLGZ1bmN0aW9uIChrZXksY29kZSkge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJhY2tfY29kZSA9IGNvZGU7XFxuICAgICAgICAgICAgICAgICAgICBpZihiYWNrX2NvZGUubGVuZ3RoPjIwKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJyxiYWNrX2NvZGUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/mupDnoIHlt7Lojrflj5Ys5bm26YOo5YiG5o+S5YWl5Yiw5paH5pys5Yy65Z+fJ1xcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr++8jOacrOasoeiOt+WPluWIsOepuuaWh+acrO+8jOeWkeS8vOS9oOayoeacieatpOaWh+S7tiEnO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICAgICAgbGV0IGJhY2tfY29kZSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnKT09PSfnlLXohJEnP2ZldGNoKHdlYl91cmwscGFyYW1zKTpyZXF1ZXN0KHdlYl91cmwscGFyYW1zKTtcXG4gICAgICAgICAgICAgICAgaWYoYmFja19jb2RlLmxlbmd0aD4yMCl7XFxuICAgICAgICAgICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJyxiYWNrX2NvZGUpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5rqQ56CB5bey6I635Y+WLOW5tumDqOWIhuaPkuWFpeWIsOaWh+acrOWMuuWfnydcXG4gICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZSZ6K+v77yM5pys5qyh6I635Y+W5Yiw56m65paH5pys77yM55aR5Ly85L2g5rKh5pyJ5q2k5paH5Lu2ISc7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/lj5HnlJ/kuobplJnor686XFxcXG4nK2UubWVzc2FnZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9ZWxzZSBpZigv5Li76aKY77+lfOWFg+e0oO+/pS8udGVzdChpbnB1dCkpe1xcbiAgICAgICAgICAgIGxvZygn5Li76aKY6ZO+5o6lJyk7XFxuICAgICAgICAgICAgbGV0IHdlYl91cmxfYXJyID0gaW5wdXQuc3BsaXQoJ++/pScpO1xcbiAgICAgICAgICAgIGxldCB3ZWJfdXJsID0gd2ViX3VybF9hcnJbd2ViX3VybF9hcnIubGVuZ3RoLTFdO1xcbiAgICAgICAgICAgIGxldCBiYWNrX2NvZGUgPSBwYXJzZVBhc3RlKHdlYl91cmwpO1xcbiAgICAgICAgICAgIGlmKGJhY2tfY29kZS5sZW5ndGg+MjApIHtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKCdob3VzZS51cGxvYWRfY29kZScsYmFja19jb2RlKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/mupDnoIHlt7Lojrflj5Ys5bm26YOo5YiG5o+S5YWl5Yiw5paH5pys5Yy65Z+fJ1xcbiAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZSZ6K+v77yM5pys5qyh6I635Y+W6L+U5Zue5Li6OlxcXFxuJytiYWNrX2NvZGU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mdnuazlemTvuaOpTpcXFxcbicrZ2V0VmFyKCdob3VzZS53ZWJfdXJsJyk7XFxuICAgICAgICB9XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6YCJ5oup5paH5Lu26Lev5b6EXFxcIixcXG4gICAgdXJsOiQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKCk9PntcXG4gICAgICAgIGxldCBmcCA9ICdodHRwczovL2dpdGNvZGUubmV0L3FxXzMyMzk0MzUxL2RyLy0vcmF3L21hc3Rlci9qcy9maWxlU2VsZWN0LmpzJztcXG4gICAgICAgIGxldCBmID0gcmVxdWlyZShmcCk7XFxuICAgICAgICByZXR1cm4gZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBmaW5kSXRlbShcXFwiZmlsZVBhdGhcXFwiKS5leHRyYTtcXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbShcXFwiZmlsZVBhdGhcXFwiLCB7XFxuICAgICAgICAgICAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih0YXJnZXQsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLndlYl91cmwnLFBBVEgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBvbkNsaWNrVHlwZTonY29uZmlybScsXFxuICAgICAgICAgICAgZmlsZVR5cGU6IFxcXCIuanN8LnR4dHwuaGlrZXJ8Lmpzb258Lmh0bWxcXFwiLFxcbiAgICAgICAgICAgIHBhdHRlcm46IDAsXFxuICAgICAgICAgICAgcmVxdWlyZVVybDpmcCxcXG4gICAgICAgICAgICBpbml0aWFsUGF0aDpnZXRQYXRoKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvJykuc2xpY2UoNyksXFxuICAgICAgICAgICAgbWVtb3J5OnRydWUsXFxuICAgICAgICB9KTtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J+S4iuS8oOexu+WeiycsXFxuICAgIGRlc2M6J+S4iuS8oOaWh+S7tueahOexu+WeiyzlvZPliY3kuLo6Jytjb2xvcihnZXRJdGVtKCdob3VzZS5maWxlX3R5cGUnLCfpnZnmgIHmlofku7YnKSwnI2ZmNzAwMCcpLFxcbiAgICBjb2xfdHlwZTondGV4dF8xJyxcXG4gICAgdXJsOiQoZmlsZV90eXBlX3RpdGxlLDIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICBzZXRJdGVtKCdob3VzZS5maWxlX3R5cGUnLGlucHV0LnJlcGxhY2UoJ/CfkYknLCcnKSk7XFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly/kvaDpgInmi6nkuoY6JytpbnB1dDtcXG4gICAgfSlcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTon5paH5Lu25a6a5L2NJyxcXG4gICAgZGVzYzon5paH5Lu25piv5ZCm5bGe5LqO6YeN5a6a5ZCRLOW9k+WJjeS4ujonK2NvbG9yKGdldEl0ZW0oJ2hvdXNlLmZpbGVfcmVkaXJlY3QnLCfmnKzlnLAnKSwnI2ZmNzAwMCcpLFxcbiAgICBjb2xfdHlwZTondGV4dF8xJyxcXG4gICAgdXJsOiQoZmlsZV9yZWRpcmVjdF90aXRsZSwyKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgc2V0SXRlbSgnaG91c2UuZmlsZV9yZWRpcmVjdCcsaW5wdXQucmVwbGFjZSgn8J+RiScsJycpKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+S9oOmAieaLqeS6hjonK2lucHV0O1xcbiAgICB9KVxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiforr7lpIdVQScsXFxuICAgIGRlc2M6J+WPkei1t+e9kemhteivt+axguWktOagh+ivhizlvZPliY3kuLo6Jytjb2xvcihnZXRJdGVtKCdob3VzZS5maWxlX3VhJywn55S16ISRJyksJyNmZjcwMDAnKSxcXG4gICAgY29sX3R5cGU6J3RleHRfMScsXFxuICAgIHVybDokKGZpbGVfdWFfdGl0bGUsMikuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgIHNldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnLGlucHV0LnJlcGxhY2UoJ/CfkYknLCcnKSk7XFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly/kvaDpgInmi6nkuoY6JytpbnB1dDtcXG4gICAgfSlcXG59KTtcXG5mdW5jdGlvbiBjb21wYXJlKG5hbWUpIHtcXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGl0ZW0pIHtcXG4gICAgICAgIHJldHVybiBpdGVtLm5hbWUgPT09IG5hbWU7XFxuICAgIH1cXG59XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J/Cfl4TvuI/njq/looMnLFxcbiAgICBjb2xfdHlwZTonZmxleF9idXR0b24nLFxcbiAgICB1cmw6JCgpLmxhenlSdWxlKChmaWxlX3R5cGUsY29tcGFyZSk9PntcXG4gICAgICAgIGxvZygn5p+l55yL546v5aKD5Y+Y6YePJyk7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCB1cF9jb2RlID0gZ2V0VmFyKCdob3VzZS51cGxvYWRfY29kZScsJycpO1xcbiAgICAgICAgICAgIGxldCBmdHlwZSA9ICBmaWxlX3R5cGUuZmlsdGVyKGNvbXBhcmUoZ2V0SXRlbSgnaG91c2UuZmlsZV90eXBlJywn6Z2Z5oCB5paH5Lu2JykpKVswXS52YWx1ZTtcXG4gICAgICAgICAgICBsZXQgcmVkaXJlY3QgPSBnZXRJdGVtKCdob3VzZS5maWxlX3JlZGlyZWN0Jywn5pys5ZywJykhPT0n5pys5ZywJztcXG4gICAgICAgICAgICBsZXQgY29kZSA9ICFyZWRpcmVjdD91cF9jb2RlOmlucHV0O1xcbiAgICAgICAgICAgIGxldCBlbnYgPSB7XFxuICAgICAgICAgICAgICAgIHdlYl91cmw6Z2V0VmFyKCdob3VzZS53ZWJfdXJsJywnJyksXFxuICAgICAgICAgICAgICAgIGRldmljZTpnZXRJdGVtKCdob3VzZS5maWxlX3VhJywn55S16ISRJyksXFxuICAgICAgICAgICAgICAgIGZ0eXBlOmZ0eXBlfHxcXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgcmVkaXJlY3Q6cmVkaXJlY3QsXFxuICAgICAgICAgICAgICAgIGNvZGU6Y29kZS5zdWJzdHJpbmcoMCw0MCl8fFxcXCJcXFwiLFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsb2coZW52KTtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytKU09OLnN0cmluZ2lmeShlbnYpO1xcbiAgICAgICAgICAgIC8vIGFsZXJ0KEpTT04uc3RyaW5naWZ5KGVudikpO1xcbiAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrZS5tZXNzYWdlO1xcbiAgICAgICAgICAgIC8vIGFsZXJ0KGUubWVzc2FnZSk7XFxuICAgICAgICB9XFxuICAgIH0sZmlsZV90eXBlLGNvbXBhcmUpXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J/Cfk4PmlZnnqIsnLFxcbiAgICBjb2xfdHlwZTonZmxleF9idXR0b24nLFxcbiAgICB1cmw6JCgpLng1UnVsZSgoKT0+e1xcbiAgICAgICAgbGV0IG1zZyA9ICfmrKLov47kvb/nlKjlvIDlj5HogIXmm7TlpJrliIbkuqvlt6XlhbdcXFxcbjEu6L6T5YWl572R5Z2A5Li65pys5Zyw5paH5Lu26Lev5b6ELGhpa2VyOi8v5oiW6ICFZmlsZTovL+W8gOWktFxcXFxuMi7ngrnlh7vnvZHlnYDovpPlhaXmoI/lkI7pnaLnmoTmjInpkq5cXFxcbjMu55yL5paH5pys6aKE6KeI5Yy65piv5ZCm5q2j56GuXFxcXG40LueCueWHu+S4iuS8oOaMiemSruaPkOS6pOWIsOS7k+W6kyc7XFxuICAgICAgICBhbGVydChtc2cpO1xcbiAgICB9KVxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOifwn5eR77iP5riF56m6JyxcXG4gICAgY29sX3R5cGU6J2ZsZXhfYnV0dG9uJyxcXG4gICAgdXJsOiQoKS5sYXp5UnVsZSgoKT0+e1xcbiAgICAgICAgY2xlYXJWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJyk7XFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly/lt7LmuIXpmaTpooTop4jljLrln5/lhoXlrrknXFxuICAgIH0pXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J/Cfk7LnpLrkvosnLFxcbiAgICBjb2xfdHlwZTonZmxleF9idXR0b24nLFxcbiAgICB1cmw6JCgpLmxhenlSdWxlKCgpPT57XFxuICAgICAgICBsZXQgZGVtb19jb2RlID0gZ2V0SXRlbSgnaG91c2UuZGVtbycsJzAnKTtcXG4gICAgICAgIGlmKGRlbW9fY29kZT09JzAnKXtcXG4gICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLndlYl91cmwnLCdoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvaHRtbC/otYTmupDnvZHkuabnrb4uaHRtbCcpO1xcbiAgICAgICAgICAgIGRlbW9fY29kZSA9IHBhcnNlSW50KGRlbW9fY29kZSkrMTtcXG4gICAgICAgICAgICBzZXRJdGVtKCdob3VzZS5kZW1vJyxkZW1vX2NvZGUrJycpO1xcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcHV0VmFyKCdob3VzZS53ZWJfdXJsJywnZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvcnVsZXMvZHpIb3VzZS9odG1sL+i1hOa6kOe9keS5puetvi5odG1sJyk7XFxuICAgICAgICAgICAgc2V0SXRlbSgnaG91c2UuZGVtbycsJzAnKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+W3suiuvue9ruekuuS+i+WcsOWdgCdcXG4gICAgfSlcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTon8J+TpOS4iuS8oCcsXFxuICAgIGNvbF90eXBlOidmbGV4X2J1dHRvbicsXFxuICAgIHVybDokKCkubGF6eVJ1bGUoKGNhbnVwLGhvdXNlX2RhdGEscHV0X3VybCxmaWxlX3R5cGUpID0+e1xcbiAgICAgICAgZnVuY3Rpb24gY29tcGFyZShuYW1lKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGl0ZW0pIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZSA9PT0gbmFtZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBjb25zdCB7Z2V0Tm93Rm9ybWF0RGF0ZX09JC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxuICAgICAgICBsZXQgdXBfY29kZSA9IGdldFZhcignaG91c2UudXBsb2FkX2NvZGUnLCcnKTtcXG4gICAgICAgIGlmKHVwX2NvZGUubGVuZ3RoIDwgMil7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+a6kOeggeWMuuaXoOWGheWuue+8jOivt+WFiOiuv+mXruS4gOS4qumdmeaAgemhtemdoidcXG4gICAgICAgIH1cXG4gICAgICAgIGlmKCFjYW51cCl7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+S9oOS4jeaYr+W8gOWPkeiAhe+8jOayoeacieaPkOS6pOWIsOS7k+W6k+eahOadg+WIqSEnXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgaW5wdXQgPSBnZXRWYXIoJ2hvdXNlLndlYl91cmwnLCcnKTtcXG4gICAgICAgIGxldCB3ZWJfdXJsID0gaW5wdXQuc3BsaXQoJzsnKVswXTtcXG4gICAgICAgIGxldCBmaWxlTmFtZSA9ICcnO1xcbiAgICAgICAgaWYoL15oaWtlcjp8XmZpbGU6fF5odHRwOnxeaHR0cHM6fF5cXFxcL3N0b3JhZ2VcXFxcL3xeXFxcXC9zZGNhcmRcXFxcLy8udGVzdCh3ZWJfdXJsKSl7XFxuICAgICAgICAgICAgZmlsZU5hbWUgPSB3ZWJfdXJsLnNwbGl0KCcvJylbd2ViX3VybC5zcGxpdCgnLycpLmxlbmd0aC0xXTtcXG4gICAgICAgIH1lbHNlIGlmKC/kuLvpopjvv6V85YWD57Sg77+lLy50ZXN0KGlucHV0KSl7XFxuICAgICAgICAgICAgbGV0IGJrYXJyID0gdXBfY29kZS5zcGxpdCgn77+lJyk7XFxuICAgICAgICAgICAgaWYoYmthcnIubGVuZ3RoPDMpe1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5LqR5Ymq6LS05p2/5YaF5a655pyJ6K+vJ1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBzd2l0Y2ggKGJrYXJyWzFdKSB7XFxuICAgICAgICAgICAgICAgIGNhc2UgJ215X2hvbWVfdGhlbWUnOlxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSB1cF9jb2RlLnNwbGl0KCfjgIwnKVsxXS5zcGxpdCgn44CNJylbMF07XFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgY2FzZSAnbXlfaG9tZV9zaW5nbGUnOlxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSB1cF9jb2RlLnNwbGl0KCfjgIwnKVsxXS5zcGxpdCgn44CNJylbMF07XFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgY2FzZSAnanNfdXJsJzpcXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gdXBfY29kZS5zcGxpdCgn77+lJylbMl0uc3BsaXQoJ0AnKVswXTtcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/plJnor6/vvIznvZHpobXpk77mjqXml6DlhoXlrrkhJztcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCB1YSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnKT09PSfnlLXohJEnPydNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODguMC40MzI0LjE0NiBTYWZhcmkvNTM3LjM2JzonTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDk7IE1JIDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OS4wLjQzODkuOTAgTW9iaWxlIFNhZmFyaS81MzcuMzYnO1xcbiAgICAgICAgbGV0IGhlYWRlcnMgPSB7XFxuICAgICAgICAgICAgJ1JlZmVyZXInOidodHRwczovL2Jsb2cuY3Nkbi5uZXQnLFxcbiAgICAgICAgICAgIFxcXCJjb250ZW50LXR5cGVcXFwiOiBcXFwiYXBwbGljYXRpb24vanNvblxcXCIsXFxuICAgICAgICAgICAgJ1VzZXItQWdlbnQnOnVhLFxcbiAgICAgICAgICAgICdBY2NlcHQnOidhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQsICovKjsgcT0wLjAxJyxcXG4gICAgICAgICAgICAnQWNjZXB0LUxhbmd1YWdlJzonemgtQ04nLFxcbiAgICAgICAgfTtcXG4gICAgICAgIGxldCB0b0NvbXBhcmUgPSAnJztcXG4gICAgICAgIGlmKGZpbGVOYW1lLmVuZHNXaXRoKCcuaHRtbCcpKXtcXG4gICAgICAgICAgICB0b0NvbXBhcmUgPSAn6Z2Z5oCB5paH5Lu2JztcXG4gICAgICAgIH1lbHNlIGlmKC/kuLvpopgvLnRlc3QoZmlsZU5hbWUpKXtcXG4gICAgICAgICAgICB0b0NvbXBhcmUgPSAn5Li76aG16YWN572uJ1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGZ0eXBlID0gIGZpbGVfdHlwZS5maWx0ZXIoY29tcGFyZSh0b0NvbXBhcmV8fGdldEl0ZW0oJ2hvdXNlLmZpbGVfdHlwZScsJ+mdmeaAgeaWh+S7ticpKSlbMF0udmFsdWU7XFxuICAgICAgICBsZXQgcmVkaXJlY3QgPSBnZXRJdGVtKCdob3VzZS5maWxlX3JlZGlyZWN0Jywn5pys5ZywJykhPT0n5pys5ZywJztcXG4gICAgICAgIGlmKHJlZGlyZWN0JiYhd2ViX3VybC5zdGFydHNXaXRoKCdodHRwJykpe1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/nm7Tpk74zMDLph43lrprlkJHnvZHlnYDpk77mjqXlv4XpobtodHRw5byA5aS0JztcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBjb2RlID0gIXJlZGlyZWN0P3VwX2NvZGU6d2ViX3VybDtcXG4gICAgICAgIGxldCBkYXRhID0ge1xcXCJwYXJhbXNcXFwiOlxcbiAgICAgICAgICAgICAgICB7XFxcImRhdGFcXFwiOiB7cnVsZV9uYW1lOiBmaWxlTmFtZSwgXFxcInJ1bGVfdHlwZVxcXCI6ICfmm7TlpJrliIbkuqsnLCBcXFwidmVyc2lvblxcXCI6Z2V0Tm93Rm9ybWF0RGF0ZSgpLFxcXCJydWxlX3ZhbHVlXFxcIjogY29kZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3R5cGU6ZnR5cGUsIGlzX3JlZGlyZWN0OnJlZGlyZWN0LGRldmljZVVhOmdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnKSxcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICBcXFwibmFtZVxcXCI6IGhvdXNlX2RhdGEudXNlcm5hbWUsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBob3VzZV9kYXRhLnBhc3N3b3JkfVxcbiAgICAgICAgfTtcXG4gICAgICAgIGxldCB1cHBhcmFtcyA9IHtoZWFkZXJzOmhlYWRlcnMsYm9keTpKU09OLnN0cmluZ2lmeShkYXRhKSx3aXRoSGVhZGVyczpmYWxzZSxyZWRpcmVjdDpmYWxzZSxtZXRob2Q6J1BPU1QnfTtcXG4gICAgICAgIGxldCBiYWNrbXNnID0gZ2V0SXRlbSgnaG91c2UuZmlsZV91YScpPT09J+eUteiEkSc/ZmV0Y2gocHV0X3VybCx1cHBhcmFtcyk6cmVxdWVzdChwdXRfdXJsLHVwcGFyYW1zKTtcXG4gICAgICAgIHRyeXtcXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gSlNPTi5wYXJzZShiYWNrbXNnKS5yZXN1bHQ7XFxuICAgICAgICAgICAgbGV0IGRldGFpbCA9IHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrZGV0YWlsO1xcbiAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+WPkeeUn+S6humUmeivr1xcXFxuJytlLm1lc3NhZ2U7XFxuICAgICAgICB9XFxuICAgIH0sY2FudXAsaG91c2VfZGF0YSxwdXRfdXJsLGZpbGVfdHlwZSlcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTon6ZW/5paH5pys6aKE6KeI5Yy65Z+fJyxcXG4gICAgY29sX3R5cGU6J3RleHRfMScsXFxuICAgIHVybDonaGlrZXI6Ly9lbXB0eScsXFxuICAgIGV4dHJhOiB7dGV4dFNpemU6IDExLGxpbmVWaXNpYmxlOmZhbHNlfVxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOmdldFZhcignaG91c2UudXBsb2FkX2NvZGUnLCcnKS5zdWJzdHJpbmcoMCwxMDI0MCksXFxuICAgIGNvbF90eXBlOidsb25nX3RleHQnLFxcbiAgICBleHRyYToge3RleHRTaXplOiAxMX1cXG59KTtcXG5zZXRQYWdlVGl0bGUoXFxcIuabtOWkmuWIhuS6q1xcXCIpO1xcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIui9u+WQiOmbhueUn+aIkOaOpeWPo1wiLFwicGF0aFwiOlwiZ2VuQXBpXCIsXCJydWxlXCI6XCJqczpcXG5mdW5jdGlvbiBnZW5SdWxlKG5hbWUsdXJsLGljb24pe1xcbiAgICBpY29uPWljb258fCdodHRwczovL3ozLmF4MXguY29tLzIwMjEvMTEvMTYvSVdKaHhmLnBuZyc7XFxuICAgIGNvbnN0IHtnZXROb3dGb3JtYXREYXRlLGFwaSxnZXRBcGl9PSQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpO1xcbiAgICBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGwgPSBmdW5jdGlvbihvbGQsbmV3X3N0cil7XFxuICAgICAgICByZXR1cm4gdGhpcy5zcGxpdChvbGQpLmpvaW4obmV3X3N0cik7XFxuICAgIH07XFxuICAgIGxldCBtdWJhbiA9IGdldEFwaSgnaW1wb3J0VXJsJykrXFxcIjE2OTBcXFwiO1xcbiAgICBsZXQgbXViYW5fd29yZD17bmFtZTpcXFwiQOi9u+WQiOmbhlxcXCIsdXJsOlxcXCJA5Zyw5Z2AXFxcIix2ZXI6XFxcIkDniYjmnKxcXFwiLGljb246XFxcIkDlm77moIdcXFwifTtcXG4gICAgbGV0IG11YmFuX2NvZGUgPSBmZXRjaChtdWJhbik7XFxuICAgIG11YmFuX2NvZGU9bXViYW5fY29kZS5yZXBsYWNlQWxsKG11YmFuX3dvcmQubmFtZSxuYW1lKS5yZXBsYWNlQWxsKG11YmFuX3dvcmQudmVyLGdldE5vd0Zvcm1hdERhdGUoKSkucmVwbGFjZUFsbChtdWJhbl93b3JkLnVybCx1cmwpLnJlcGxhY2VBbGwobXViYW5fd29yZC5pY29uLGljb24pO1xcbiAgICBsZXQgaW1wb3J0X2NvZGU9XFxcIua1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8muWwj+eoi+W6j++8jOaXoOagueagke+8jOiKseato+a4he+8jOS4jeaWreiNpOiFpeS4jeaIkua3q++/pWhvbWVfcnVsZV92Mu+/pWJhc2U2NDovL0BcXFwiK25hbWUrXFxcIkBcXFwiK2Jhc2U2NEVuY29kZShtdWJhbl9jb2RlKTtcXG4gICAgdmFyIHBhc3RlcyA9IGdldFBhc3RlcygpO1xcbiAgICB2YXIgdXJsID0gc2hhcmVQYXN0ZShpbXBvcnRfY29kZSxwYXN0ZXMuc2xpY2UoLTEpWzBdKTtcXG4gICAgbGV0IGltcG9ydF9ydWxlPSB1cmwrXFxcIlxcXFxuXFxcXG7lsI/nqIvluo/vvJpcXFwiK25hbWU7XFxuICAgIHJldHVybiBpbXBvcnRfcnVsZTtcXG59XFxuJC5leHBvcnRzLmdlblJ1bGU9Z2VuUnVsZTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWFqOWxgOino+aekOWFjeWXhVwiLFwicGF0aFwiOlwiZ2xvYmFsUGFyc2VcIixcInJ1bGVcIjpcImpzOlxcbiAgICBmdW5jdGlvbiBnZXRIZWFkZXJzKHBsYXlVcmwpe1xcbiAgICAgICAgbGV0IGhlYWRlcnMgPSB7fTtcXG4gICAgICAgIGxldCByZWZlcj1wbGF5VXJsLnNwbGl0KFxcXCIvL1xcXCIpWzBdK1xcXCIvL1xcXCIrcGxheVVybC5zcGxpdChcXFwiLy9cXFwiKVsxXS5zcGxpdChcXFwiL1xcXCIpWzBdO1xcbiAgICAgICAgaWYoL2xlY2xvdWRcXFxcLmNvbXxiaWxpdmlkZW9cXFxcLmNvbS8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgaGVhZGVycyA9IHtcXFwiUmVmZXJlclxcXCI6ICdodHRwczovL3d3dy5iaWxpYmlsaS5jb20vJyxcXFwiVXNlci1BZ2VudFxcXCI6XFxcIk1vemlsbGEvNS4wXFxcIn1cXG4gICAgICAgIH1lbHNlIGlmKC9tZ3R2XFxcXC5jb20vLnRlc3QocGxheVVybCkpe1xcbiAgICAgICAgICAgIGhlYWRlcnMgPSB7XFxcIlJlZmVyZXJcXFwiOiByZWZlcixcXFwiVXNlci1BZ2VudFxcXCI6XFxcIk1vemlsbGEvNS4wXFxcIn1cXG4gICAgICAgIH1lbHNlIGlmKC9peGlndWFcXFxcLmNvbS8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgaGVhZGVycyA9IHtcXFwiUmVmZXJlclxcXCI6ICdodHRwczovL3d3dy5peGlndWEuY29tLycsXFxcIlVzZXItQWdlbnRcXFwiOlxcXCJNb3ppbGxhLzUuMFxcXCJ9XFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICBoZWFkZXJzID0ge1xcXCJSZWZlcmVyXFxcIjogcmVmZXIsJ1VzZXItQWdlbnQnOidEYXJ0LzIuMTMgKGRhcnQ6aW8pJ31cXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBoZWFkZXJzXFxuICAgIH1cXG5mdW5jdGlvbiBpc1BpYyhzdHIpe1xcbiAgICByZXR1cm4gL1xcXFwuKGdpZnxqcGd8anBlZ3xwbmd8R0lGfEpQR3xQTkcpJC8udGVzdChzdHIpO1xcbn1cXG5mdW5jdGlvbiBpc1ZpZGVvKHBsYXlVcmwscmVjaGFuZ2Upe1xcbiAgICAvL+azqOaEjy5waHDkuI3lj6/ku6XooqvmjpLpmaTlkKbliJnono3lhbTop6PmnpDkuI3kuoYgfC5waHAkXFxuICAgIC8v5aaC5p6c5piv5pKt5pS+5Zyw5Z2A5bCx55u05o6l6L+U5Zue5Zyw5Z2A5Yqg5LiKVUHvvIzkuI3mmK/nmoTor53lsLHov5Tlm55mYWxzZVxcbiAgICAvLyBsZXQgdDEgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcXG4gICAgbGV0IGNhY2hlUmVneCA9IG5ldyBSZWdFeHAoJ2ZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8oLio/KVxcXFxcXFxcLm0zdTh8aGlrZXI6Ly9maWxlcy8oLio/KVxcXFxcXFxcLm0zdTgnKTtcXG4gICAgaWYoY2FjaGVSZWd4LnRlc3QocGxheVVybCkpe1xcbiAgICAgICAgcmV0dXJuIHBsYXlVcmxcXG4gICAgfVxcbiAgICBmdW5jdGlvbiBnZXRIb3N0KHVybCl7XFxuICAgICAgICAvLyBmYmHnmoRwYXJzZUxhennlpKrmhaLkuobljYPkuIfliKvnlKhcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgcmV0dXJuIHVybC5tYXRjaCgvXmh0dHAocyk/OlxcXFwvXFxcXC8oLio/KVxcXFwvLylbMF0uc2xpY2UoMCwtMSk7XFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcXG4gICAgICAgIH1cXG4gICAgICAgIC8qXFxuICAgICAgICBpZih0eXBlb2YobG9nKT09PSd1bmRlZmluZWQnKXtcXG4gICAgICAgICAgICByZXR1cm4gIGZiYS5wYXJzZUxhenlSdWxlKCQkJCgpLmxhenlSdWxlKCh1cmwpPT57XFxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRIb21lKHVybClcXG4gICAgICAgICAgICB9LHVybCkpXFxuICAgICAgICB9ZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIGdldEhvbWUodXJsKVxcbiAgICAgICAgfVxcbiAgICAgICAgKi9cXG4gICAgfVxcbiAgICBsZXQgcFVybD1wbGF5VXJsLnNwbGl0KFxcXCI7XFxcIilbMF07Ly/ojrflj5bmiqDmjonmtbfpmJR1YeetieWPguaVsOeahOe9kemhteaSreaUvumTvuaOpVxcbiAgICBsZXQgaG9zdCA9IGdldEhvc3QocFVybCk7IC8vIOiOt+WPluWfn+WQjVxcbiAgICBpZighaG9zdCl7Ly/liKTmlq3ml6Dln5/lkI3nm7TmjqXkuI3mmK/op4bpopFcXG4gICAgICAgIHJldHVybiBmYWxzZVxcbiAgICB9XFxuICAgIGZ1bmN0aW9uIHByaW50KGRhdGEpe1xcbiAgICAgICAgaWYodHlwZW9mKGxvZyk9PT0ndW5kZWZpbmVkJyl7XFxuICAgICAgICAgICAgcmV0dXJuICBmYmEubG9nKGRhdGEpXFxuICAgICAgICB9ZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIGxvZyhkYXRhKVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHJlY2hhbmdlPXR5cGVvZihyZWNoYW5nZSk9PT1cXFwiZnVuY3Rpb25cXFwiP3JlY2hhbmdlOmZ1bmN0aW9uKHBsYXlVcmwpe3JldHVybiBwbGF5VXJsfTtcXG4gICAgbGV0IGV4Y2VwdFdvcmRzID0gJy5qcyR8LmNzcyR8LnRzJHwuaHRtbCR8Lmh0bSR8LmdpZiR8LmpwZyR8LmpwZWckfC5wbmckfC5pY28kfC5zdmckfC50eHQkJy5zcGxpdCgnfCcpLm1hcChpdD0+J1xcXFxcXFxcJytpdCkuam9pbignfCcpO1xcbiAgICB2YXIgZXhjZXB0S2V5cyA9IG5ldyBSZWdFeHAoZXhjZXB0V29yZHMpO1xcbiAgICBsZXQgZXhjZXB0V29yZHMxID0gJ3JlZmVyZXI9fHVybD0nLnNwbGl0KCd8JykubWFwKGl0PT5pdCkuam9pbignfCcpO1xcbiAgICB2YXIgZXhjZXB0S2V5czEgPSBuZXcgUmVnRXhwKGV4Y2VwdFdvcmRzMSk7XFxuICAgIGxldCByZXBsYWNlV29yZHMgPSAncGxheW0zdTh8bTN1OFxcXFwudHYnLnNwbGl0KCd8JykubWFwKGl0PT5pdCkuam9pbignfCcpO1xcbiAgICBsZXQgcmVwbGFjZUtleXMgPSBuZXcgUmVnRXhwKHJlcGxhY2VXb3JkcywnZycpO1xcbiAgICBsZXQgdmlkZW9Xb3JkcyA9IFxcXCIvdmlkZW8vdG9zfC5tcDQkfC5tM3U4JHwuZmx2JHwuYXZpJHwuM2dwJHwubXBlZyR8LndtdiR8Lm1vdiR8cm12YnwuZGF0JHwubXAzJHwubTRhJHxxcUJGZG93bmxvYWR8bWltZT12aWRlbyUyRnxtaW1lX3R5cGU9dmlkZW9ffHR5cGU9bTN1OHxwdD1tM3U4XFxcIi5zcGxpdCgnfCcpLm1hcCgoaXQpPT57XFxuICAgICAgICAvL3R5cGU9bXA0XFxuICAgICAgICBpZihpdC5zdGFydHNXaXRoKFxcXCIuXFxcIikpe1xcbiAgICAgICAgICAgIHJldHVybiAnXFxcXFxcXFwnK2l0XFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICByZXR1cm4gaXRcXG4gICAgICAgIH1cXG4gICAgfSkuam9pbihcXFwifFxcXCIpO1xcbiAgICBsZXQgdmlkZW9LZXlzID0gbmV3IFJlZ0V4cCh2aWRlb1dvcmRzKTtcXG4gICAgbGV0IHJVcmwgPSBwVXJsLnJlcGxhY2UoaG9zdCwnJyk7Ly/ojrflj5bpmaTlvIDln5/lkI3nmoTliankvZnpk77mjqVcXG4gICAgbGV0IHBVcmwyPXBVcmwuc3BsaXQoXFxcIiZcXFwiKVswXS5zcGxpdChcXFwiP1xcXCIpWzBdOy8v6I635Y+W5LiN5bim5Y+C5pWw55qE572R6aG16ZO+5o6lXFxuICAgIGxldCBydXJsMiA9IHBVcmwyLnJlcGxhY2UoaG9zdCwnJyk7Ly/ojrflj5bpmaTlvIDln5/lkI3nmoTliankvZnkuI3luKblj4LmlbDpk77mjqVcXG4gICAgbGV0IGhhc0tleSA9IHZpZGVvS2V5cy50ZXN0KHJVcmwpfHx2aWRlb0tleXMudGVzdChydXJsMik7XFxuICAgIGxldCBwYXJVcmwgPSBwVXJsLnJlcGxhY2UocFVybC5zcGxpdChcXFwiP1xcXCIpWzBdLCcnKTsgLy8g5YiG5Ymy6Zeu5Y+35ZCO5Ymp5L2Z5Y+C5pWw55qE5a6M5pW06ZO+5o6lXFxuICAgIGxldCBleGNLZXkgPSBleGNlcHRLZXlzMS50ZXN0KHBhclVybCk7XFxuICAgIGlmKHJVcmwuc3BsaXQoJz8nKS5sZW5ndGg+Mil7XFxuICAgICAgICBsZXQgclVybDM9clVybC5zcGxpdChcXFwiP1xcXCIpWzFdOy8v6I635Y+WP+WIhuWJsuWQjueahOesrOS4gOautVxcbiAgICAgICAgaGFzS2V5ID0gaGFzS2V5fHx2aWRlb0tleXMudGVzdChyVXJsMyk7XFxuICAgIH1cXG4gICAgaWYoaGFzS2V5JiYhZXhjS2V5KXtcXG4gICAgICAgIGxldCB0aXBzID0gJ+ajgOa1i+WIsOeWkeS8vOWkmuWqkuS9k+eahOWcsOWdgDonO1xcbiAgICAgICAgcHJpbnQoXFxcImpz5LitXFxcIit0aXBzK3BVcmwpO1xcbiAgICAgICAgcHJpbnQoXFxcIuWIhuWJsumXruWPt+WQjjpcXFwiK3BhclVybCk7XFxuICAgIH1cXG4gICAgLy8gbG9nKCcxOicrKHZpZGVvS2V5cy50ZXN0KHBVcmwpfHx2aWRlb0tleXMudGVzdChwVXJsMil8fHZpZGVvS2V5cy50ZXN0KHBVcmwucmVwbGFjZShyZXBsYWNlS2V5cyxcXFwiXFxcIikuc3BsaXQoXFxcIiZcXFwiKVswXS5zcGxpdChcXFwiP1xcXCIpWzBdKSkpO1xcbiAgICAvLyBsb2coJzI6JyshZXhjZXB0S2V5cy50ZXN0KHBVcmwuc3BsaXQoXFxcIj9cXFwiKVswXS5zcGxpdCgnJicpWzBdKSk7XFxuICAgIC8vIGxvZygnMzonKyFleGNlcHRLZXlzMS50ZXN0KHBVcmwucmVwbGFjZShwVXJsLnNwbGl0KFxcXCI/XFxcIilbMF0sJycpKSk7XFxuICAgIGlmICgoaGFzS2V5fHx2aWRlb0tleXMudGVzdChyVXJsLnJlcGxhY2UocmVwbGFjZUtleXMsXFxcIlxcXCIpLnNwbGl0KFxcXCImXFxcIilbMF0uc3BsaXQoXFxcIj9cXFwiKVswXSkgKSYmICFleGNlcHRLZXlzLnRlc3QocFVybDIpJiYhZXhjZXB0S2V5czEudGVzdChwVXJsMikpIHtcXG4gICAgICAgIGlmKCEoL1VzZXItQWdlbnR8UmVmZXJlckAvLnRlc3QocGxheVVybCkpKXtcXG4gICAgICAgICAgICBpZigvbGVjbG91ZFxcXFwuY29tfGJpbGl2aWRlby8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgICAgIHBsYXlVcmwrPVxcXCI7e1JlZmVyZXJAaHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tLyYmVXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFwiO1xcbiAgICAgICAgICAgIH1lbHNlIGlmKC9peGlndWFcXFxcLmNvbS8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgICAgIHBsYXlVcmwrPVxcXCIjaXN2aWRlbz10cnVlIzt7UmVmZXJlckBodHRwczovL3d3dy5peGlndWEuY29tLyYmVXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBlbHNlIGlmKC9tZ3R2XFxcXC5jb218Ynl0ZWFtb25lLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICAgICAgcGxheVVybCs9XFxcIjt7VXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFwiO1xcbiAgICAgICAgICAgIH1lbHNlIGlmKC9wdHdvXFxcXC53a2ZpbGVcXFxcLmNvbS8udGVzdChwbGF5VXJsKSYmL3VybD0vLnRlc3QocGxheVVybCkpe1xcbiAgICAgICAgICAgICAgICBwbGF5VXJsPXBsYXlVcmwuc3BsaXQoXFxcInVybD1cXFwiKVsxXStcXFwiO3tSZWZlcmVyQGh0dHBzOi8vZmFudHVhbi50dn1cXFwiXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIC8vIOWkhOeQhuWkp+W4iOWFhOS5i+exu+eahGFwcFxcbiAgICAgICAgICAgIC8vIGVsc2V7XFxuICAgICAgICAgICAgLy8gICAgIHBsYXlVcmwrPVxcXCI7e1VzZXItQWdlbnRATW96aWxsYS81LjB9XFxcIjtcXG4gICAgICAgICAgICAvLyB9XFxuICAgICAgICB9XFxuICAgICAgICBwbGF5VXJsPXJlY2hhbmdlKHBsYXlVcmwpO1xcbiAgICAgICAgaWYoIS8jaXNWaWRlbz10cnVlIy8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgcGxheVVybCs9XFxcIiNpc1ZpZGVvPXRydWUjXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIC8vIGxldCB0MiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcbiAgICAgICAgLy8gcHJpbnQoJ+WIpOaWrWlzVmlkZW/ogJfml7Y6JysodDItdDEpKTtcXG4gICAgICAgIHJldHVybiBwbGF5VXJsO1xcbiAgICB9ZWxzZXtcXG4gICAgICAgIC8vIGxldCB0MiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcbiAgICAgICAgLy8gcHJpbnQoJ+WIpOaWrWlzVmlkZW/ogJfml7Y6JysodDItdDEpKTtcXG4gICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgfVxcbn1cXG5mdW5jdGlvbiBjb21QYXJzZShwYXJTdHIsZWosb25seWJhY2ssaHRtbCl7XFxuICAgIC8v5YiX6KGo77yM5qCH6aKY77yM5Zu+54mH77yM5o+P6L+w77yM6ZO+5o6l77yM5YaF5a65XFxuICAgIGVqID0gZWp8fGZhbHNlOy8v5pyJ5LqM57qnXFxuICAgIG9ubHliYWNrPW9ubHliYWNrfHxmYWxzZTsvL+WPqui/lOWbnuaVsOaNrlxcbiAgICBodG1sID0gaHRtbHx8Z2V0UmVzQ29kZSgpO1xcbiAgICBodG1sID0gdHlwZW9mKGh0bWwpPT09J3N0cmluZyc/aHRtbDpodG1sLmh0bWw7XFxuICAgIHJldHVybiAkLnRvU3RyaW5nKChwYXJTdHIsZWosb25seWJhY2ssaHRtbCxpc1BpYyk9PntcXG4gICAgICAgIGxldCB0PXBhclN0ci5zcGxpdChcXFwiO1xcXCIpO1xcbiAgICAgICAgbGV0IGQ9W107XFxuICAgICAgICAvLyBsZXQgbGlzdD1wZGZhKGdldFJlc0NvZGUoKSx0WzBdKTtcXG4gICAgICAgIGxldCBsaXN0PXBkZmEoaHRtbCx0WzBdKTtcXG4gICAgICAgIGxldCBsYXp5ID0gJCgnJykubGF6eVJ1bGUoKCk9PntcXG4gICAgICAgICAgICBjb25zdCB7bGF6eVBhcnNlfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2dsb2JhbFBhcnNlP3J1bGU96YGT6ZW/5LuT5bqTUHJvJyk7XFxuICAgICAgICAgICAgcmV0dXJuIGxhenlQYXJzZShpbnB1dClcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZm9yKGxldCBpIGluIGxpc3Qpe1xcbiAgICAgICAgICAgIGxldCBfcGljID0gdFsyXT9wZChsaXN0W2ldLHRbMl0pOicnO1xcbiAgICAgICAgICAgIGlmKGlzUGljKF9waWMpJiYhL0BSZWZlcmVyPS8udGVzdChfcGljKSl7XFxuICAgICAgICAgICAgICAgIF9waWMrPSdAUmVmZXJlcj0nXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBpdD17XFxuICAgICAgICAgICAgICAgIHRpdGxlOnBkZmgobGlzdFtpXSx0WzFdKSxcXG4gICAgICAgICAgICAgICAgcGljX3VybDpfcGljLFxcbiAgICAgICAgICAgICAgICBkZXNjOnBkZmgobGlzdFtpXSx0WzNdKSxcXG4gICAgICAgICAgICAgICAgdXJsOmVqP3BkKGxpc3RbaV0sdFs0XSk6cGQobGlzdFtpXSx0WzRdKStsYXp5XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBpZih0Lmxlbmd0aD41KXsvL+WGheWuue+8jOeUqOS6juaQnOe0olxcbiAgICAgICAgICAgICAgICBpdC5jb250ZW50PXBkZmgobGlzdFtpXSx0WzVdKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBkLnB1c2goaXQpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYob25seWJhY2spe1xcbiAgICAgICAgICAgIHJldHVybiBkXFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICBzZXRSZXN1bHQoZClcXG4gICAgICAgIH1cXG4gICAgfSxwYXJTdHIsZWosb25seWJhY2ssaHRtbCxpc1BpYylcXG59XFxuXFxuZnVuY3Rpb24gaXNCYWRWaWRlbyh2aWRlb1VybCkgey8v5piv5Z2P55qE6KeG6aKRXFxuICAgIGxldCBkbVBhdGggPSAnaGlrZXI6Ly9maWxlcy9jYWNoZS9kaWFvbWFvLnR4dCc7Ly/lkIrmr5vmqKHlvI/ov4fmu6Tmlofku7bot6/lvoRcXG4gICAgbGV0IGRtVXJscztcXG4gICAgdHJ5IHtcXG4gICAgICAgIGRtVXJscyA9IHJlcXVlc3QoZG1QYXRoKS50cmltKCkuc3BsaXQoJ1xcXFxuJykuZmlsdGVyKGl0ID0+IGl0ICYmICFpdC5zdGFydHNXaXRoKCcvLycpKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgZG1VcmxzID0gW107XFxuICAgIH1cXG5cXG4gICAgZnVuY3Rpb24gaGFzRG0odmlkZW9VcmwsIGRtVXJscykgey8v5pKt5pS+5Zyw5Z2A5piv5ZCm5Li65ZCK5q+b6KeG6aKRXFxuICAgICAgICBpZiAoZG1VcmxzLmxlbmd0aCA8IDEpIHtcXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcXG4gICAgICAgIH1cXG4gICAgICAgIGZ1bmN0aW9uIHByaW50KHN0cil7XFxuICAgICAgICAgICAgaWYodHlwZW9mKGxvZykhPT0ndW5kZWZpbmVkJyl7XFxuICAgICAgICAgICAgICAgIGxvZyhzdHIpO1xcbiAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICBmYmEubG9nKHN0cik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgZm9yIChsZXQgZG1Vcmwgb2YgZG1VcmxzKSB7XFxuICAgICAgICAgICAgaWYgKChuZXcgUmVnRXhwKGRtVXJsKSkudGVzdCh2aWRlb1VybCkpIHsvL+aSreaUvuWcsOWdgOWMheWQq+WQiuavm+agh+W/l+eahOWcsOWdgFxcbiAgICAgICAgICAgICAgICBwcmludCgn5ZCK5q+b6KeG6aKRLOiHquWKqOi/h+a7pDonK3ZpZGVvVXJsKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBwcmludCgn6Z2e5ZCK5q+b6KeG6aKRLOWPr+aSreaUvjonK3ZpZGVvVXJsKTtcXG4gICAgICAgIHJldHVybiBmYWxzZVxcbiAgICB9XFxuXFxuICAgIGZ1bmN0aW9uIGlzRG0ocmV0KSB7XFxuICAgICAgICBpZiAoIXJldCkge1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlXFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gaGFzRG0ocmV0LnNwbGl0KCcjJylbMF0uc3BsaXQoJzsnKVswXSwgZG1VcmxzKVxcbiAgICB9XFxuICAgIHJldHVybiBpc0RtKHZpZGVvVXJsKVxcbn1cXG5cXG5mdW5jdGlvbiBsYXp5UGFyc2UocGxheVVybCxtcyx0bSxyZWNoYW5nZSl7XFxuICAgIC8vIGxvZygn6LCD55So5LuT5bqT5YWN5ZeF5o6i5Lyg5Y+C6LaF5pe25Li6OicrbXMpO1xcbiAgICB0bSA9IHBhcnNlSW50KHRtKXx8NTAwMDtcXG4gICAgY29uc3Qge2lzVmlkZW8sZ2V0SGVhZGVycyxpc0JhZFZpZGVvfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2dsb2JhbFBhcnNlP3J1bGU96YGT6ZW/5LuT5bqTUHJvJyk7XFxuICAgIGxldCByZWFsVXJsID0gaXNWaWRlbyhwbGF5VXJsLHJlY2hhbmdlKTtcXG4gICAgLy9sb2cocmVhbFVybCk7XFxuICAgIGlmKHR5cGVvZihyZWFsVXJsKT09J3N0cmluZycpey8vYm9vbOWAvOWwseaYr+Wksei0pVxcbiAgICAgICAgdHJ5e1xcbiAgICAgICAgICAgIGxldCBydXJsPXJlYWxVcmwuc3BsaXQoXFxcIjtcXFwiKVswXS5zcGxpdChcXFwiI1xcXCIpWzBdO1xcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlcXVlc3QocnVybCx7dGltZW91dDp0bX0pKS51cmxcXG4gICAgICAgIH1jYXRjaChlKXtcXG4gICAgICAgICAgICByZXR1cm4gcmVhbFVybFxcbiAgICAgICAgfVxcbiAgICAgICAgLy9yZXR1cm4gcmVhbFVybFxcbiAgICB9XFxuXFxuICAgIC8vbG9nKFxcXCLorr/pl67otoXml7Y6XFxcIit0bSk7XFxuICAgIGxvZyhcXFwi5bCd6K+V6YGT6ZW/5LuT5bqTeDXlhY3ll4U6XFxcIitwbGF5VXJsKTtcXG4gICAgY2xlYXJWYXIoXFxcIl94NWp4VXJsXFxcIik7XFxuICAgIGxldCBiYWQ9JChcXFwi572R57uc5LiN5L2z5oiW6ICF55aR5Ly85a+55pa5572R56uZ5oyC5LqG77yM5L2g6KaB5p+l55yL5YW2572R6aG15ZCX77yfXFxcIikuY29uZmlybSgocGxheVVybCk9PntcXG4gICAgICAgIGxvZyhcXFwi572R56uZ55yL6LW35p2l5oyC5LqGOlxcXCIrcGxheVVybCk7XFxuICAgICAgICByZXR1cm4gcGxheVVybFxcbiAgICB9LHBsYXlVcmwpO1xcbiAgICB0cnl7XFxuICAgICAgICB2YXIgYmFjaz1yZXF1ZXN0KHBsYXlVcmwse2hlYWRlcnM6IGdldEhlYWRlcnMocGxheVVybCksdGltZW91dDp0bX0pO1xcbiAgICAgICAgLy92YXIgYmFjaz1mZXRjaChwbGF5VXJsLHtoZWFkZXJzOiB7J1VzZXItQWdlbnQnOiBQQ19VQX19KTtcXG4gICAgICAgIGlmKCFiYWNrKXtcXG4gICAgICAgICAgICBsb2coXFxcIue9keermVxcXCIrcGxheVVybCtcXFwi56Gu5a6e5ZWl5Lmf5rKh6L+U5ZueXFxcIik7XFxuICAgICAgICAgICAgcmV0dXJuIGJhZFxcbiAgICAgICAgfWVsc2UgaWYoLyNFWFRJTkYvLnRlc3QoYmFjaykpe1xcbiAgICAgICAgICAgIC8vbGV0IGxjYWNoZT1cXFwiL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9jYWNoZS92aWRlby5tM3U4XFxcIjtcXG4gICAgICAgICAgICAvL3dyaXRlRmlsZShsY2FjaGUsYmFjayk7XFxuICAgICAgICAgICAgLy9yZXR1cm4gbGNhY2hlK1xcXCIjI1xcXCIrcGxheVVybCtcXFwiI2lzVmlkZW89dHJ1ZSNcXFwiXFxuICAgICAgICAgICAgcGxheVVybD1jYWNoZU0zdTgocGxheVVybCk7XFxuICAgICAgICAgICAgcmV0dXJuIHBsYXlVcmxcXG4gICAgICAgIH1lbHNlIGlmKCghL+inpuWPkeS6humYsuebl+mTvnzmnKrmjojmnYN85o6l5Y+j6Ziy55uXLy50ZXN0KGJhY2spKSYmKCEvaHR0cHx1cmwvLnRlc3QoYmFjaykpJiYoIS9tc2d8Y29kZXxodG1sLy50ZXN0KGJhY2spKSl7XFxuICAgICAgICAgICAgbG9nKGJhY2spO1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/nlpHkvLzlr7nmlrnmlbDmja7liqDlr4bkuobvvIzlhbfkvZPmlbDmja7nnIvml6Xlv5cnXFxuICAgICAgICB9XFxuICAgIH1jYXRjaChlKXtcXG4gICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgcmV0dXJuIGJhZFxcbiAgICB9XFxuICAgIHRyeSB7XFxuICAgICAgICBiYWNrPUpTT04ucGFyc2UoYmFjayk7XFxuICAgICAgICBsZXQgcmVhbFVybD1iYWNrLnVybDtcXG4gICAgICAgIGlmKHR5cGVvZihyZWFsVXJsKT09XFxcInVuZGVmaW5lZFxcXCJ8fCFyZWFsVXJsKXtcXG4gICAgICAgICAgICBsb2coYmFjayk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+mBk+mVv+S7k+W6k+ino+aekOWksei0pe+8gei/lOWbnuaSreaUvuWcsOWdgOS4uuepulxcXCJcXG4gICAgICAgIH0gZWxzZSBpZih0eXBlb2YoaXNWaWRlbyhyZWFsVXJsLHJlY2hhbmdlKSk9PSdzdHJpbmcnKXtcXG4gICAgICAgICAgICByZXR1cm4gaXNWaWRlbyhyZWFsVXJsLHJlY2hhbmdlKTtcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiByZWFsVXJsK1xcXCIjaXNWaWRlbz10cnVlI1xcXCI7XFxuICAgICAgICB9XFxuICAgICAgICAvL2Vsc2V7XFxuICAgICAgICAvL3JlYWxVcmwrPVxcXCI7e1VzZXItQWdlbnRATW96aWxsYS81LjB9XFxcIjtcXG4gICAgICAgIC8vIH1cXG4gICAgfWNhdGNoIChlKSB7XFxuICAgICAgICBsb2coXFxcIuajgOa1i+WIsOino+aekOWPo+mdnmpzb27plJnor686XFxcIitlLm1lc3NhZ2UrJyzlvIDlp4t4NeWFjeWXheaOoicpO1xcbiAgICAgICAgLy8gcmVxdWlyZSgnaHR0cHM6Ly9oamRobnguY29kaW5nLm5ldC9wL2hpa2VyL2QvZHIvZ2l0L3Jhdy9tYXN0ZXIvanMvbHNnLmpzJyk7Ly/lvJXnlKjmnKzlnLDlgqjlrZjmj5Lku7ZcXG4gICAgICAgIGNvbnN0IGxzZz0kLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9sb2NhbFN0b3JhZ2U/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTsvL+W8leeUqOWtkOmhtemdouacrOWcsOWCqOWtmOaPkuS7tlxcbiAgICAgICAgbGV0IGxvY2FsX21zID0gbHNnLmdldEl0ZW0oJ3RpbWVvdXQnKTtcXG4gICAgICAgIGxldCBtcyA9IHBhcnNlSW50KG1zKXx8cGFyc2VJbnQobG9jYWxfbXMpfHw1MDAwO1xcbiAgICAgICAgbGV0IG1heF9jb3VudD1NYXRoLmNlaWwobXMvMjUwKTtcXG4gICAgICAgIGxvZyhcXFwi5pys5qyh5ZeF5o6i6LaF5pe2OlxcXCIrbXMrXFxcIuWFseiuoeW+heaKk+WMhTpcXFwiK21heF9jb3VudCtcXFwi5qyhXFxcIik7XFxuICAgICAgICBzaG93TG9hZGluZygn5ZeF5o6i5Lit77yM6Iul5aSx6LSl5bCx5YiH5o2id2Vi5ZeF5o6iLi4uJyk7XFxuICAgICAgICBsZXQgX3g1ID0gJC50b1N0cmluZygoaXNWaWRlbyxyZWNoYW5nZSxwbGF5VXJsLG1heF9jb3VudCxQQ19VQSxpc0JhZFZpZGVvKT0+e1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGlmKHR5cGVvZihmYmEpPT0ndW5kZWZpbmVkJ3x8IWZiYSl7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgZmJhID0gZnlfYnJpZGdlX2FwcDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mKHJlcXVlc3QpPT0ndW5kZWZpbmVkJ3x8IXJlcXVlc3Qpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwoZmJhLmdldEludGVybmFsSnMoKSk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGZiYS5wdXRWYXIoXFxcIl94NWp4VXJsXFxcIixwbGF5VXJsKTtcXG4gICAgICAgICAgICAgICAgaWYod2luZG93LmNvdW50ID09IG51bGwpe1xcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmNvdW50PTE7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgbGV0IHRleHQ9Jyc7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICB0ZXh0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXFxcImJvZHlcXFwiKS5pbm5lclRleHQ7XFxuICAgICAgICAgICAgICAgIH1jYXRjaCAoZSkge2ZiYS5sb2coZS5tZXNzYWdlKX1cXG4gICAgICAgICAgICAgICAgaWYoL+inpuWPkeS6humYsuebl+mTvnzmnKrmjojmnYN85o6l5Y+j6Ziy55uXLy50ZXN0KHRleHQpJiZ3aW5kb3cuY291bnQ9PT0xKXtcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcIuajgOa1i+WIsOacieaOiOadg++8jOW8gOWni+i/h+aOiOadg1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgLy9sb2NhdGlvbi5yZWxvYWQoKTtcXG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWY9ZmJhLmdldFZhcihcXFwiX3g1anhVcmxcXFwiKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB3aW5kb3cuY291bnQrKztcXG4gICAgICAgICAgICAgICAgLy8gZmJhLmxvZygnY291bnQ6Jyt3aW5kb3cuY291bnQrJyxtYXhfY291bnQ6JyttYXhfY291bnQpO1xcbiAgICAgICAgICAgICAgICBpZiggd2luZG93LmNvdW50ID49IG1heF9jb3VudCl7XFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXCLotoXov4dcXFwiK21heF9jb3VudCoyNTArXFxcIuavq+enkuacquiOt+WPluWIsOi1hOa6kOWcsOWdgO+8jOi3s+WIsOa6kOe9kemhtSzku6XkuIvmmK/liqDovb3ov4fnmoTlnLDlnYBcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXFwiYm9keVxcXCIpLmlubmVyVGV4dDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYmEubG9nKHRleHQpO1xcbiAgICAgICAgICAgICAgICAgICAgfWNhdGNoIChlKSB7ZmJhLmxvZyhlLm1lc3NhZ2UpfVxcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhKU09OLnN0cmluZ2lmeShfZ2V0VXJscygpKSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmJhLmdldFZhcihcXFwiX3g1anhVcmxcXFwiKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtdXRlTWUoZWxlbSkge1xcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnBhdXNlKCk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHZhciB2aWRlb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXCJ2aWRlb1xcXCIpLCBhdWRpb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXCJhdWRpb1xcXCIpLCB2MiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcImVtYmVkXFxcIiksIHYzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwiI3BsYXllclxcXCIpO1xcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHZpZGVvcywgZnVuY3Rpb24gKHZpZGVvKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZU1lKHZpZGVvKTtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKGF1ZGlvcywgZnVuY3Rpb24gKGF1ZGlvKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZU1lKGF1ZGlvKTtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHYyLCBmdW5jdGlvbiAodikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGVNZSh2KTtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHYzLCBmdW5jdGlvbiAodikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGVNZSh2KTtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgICAgICB2YXIgdXJscyA9IF9nZXRVcmxzKCk7XFxuICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coSlNPTi5zdHJpbmdpZnkodXJscykpO1xcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHVybHMpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdT11cmxzW2ldO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeXt1PWRlY29kZVVSSUNvbXBvbmVudCh1KTt9Y2F0Y2goZSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU9dW5lc2NhcGUodSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoL3VybD1odHRwLy50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IHUuc3BsaXQoXFxcInVybD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coXFxcInVybOWIhuWJsjpcXFwiK3UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKC91cmw9XFxcXC8vLnRlc3QodSkmJi9cXFxcLm0zdTgvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdCA9IHUubWF0Y2goLyguKilcXFxcL1xcXFwvKC4qPylcXFxcLy8pWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gaG9zdCt1LnNwbGl0KFxcXCJ1cmw9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYmEubG9nKFxcXCJ1cmzliIblibI6XFxcIit1KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigvdmlkPWh0dHAvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gdS5zcGxpdChcXFwidmlkPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwidmlk5YiG5YmyOlxcXCIrdSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoL3ZpZD1cXFxcLy8udGVzdCh1KSYmL1xcXFwubTN1OC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3N0ID0gdS5tYXRjaCgvKC4qKVxcXFwvXFxcXC8oLio/KVxcXFwvLylbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBob3N0K3Uuc3BsaXQoXFxcInZpZD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcInZpZOWIhuWJsjpcXFwiK3UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKC9cXFxcPyguKik9aHR0cC8udGVzdCh1KSYmL1xcXFwubTN1OC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBcXFwiaHR0cFxcXCIrdS5zcGxpdCgvXFxcXD8oLiopPWh0dHAvKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcIuWFtuS7luWIhuWJsjpcXFwiK3UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3xpbmRleFxcXFwubTN1OCRcXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKC9cXFxcLzFcXFxcLm0zdTgvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgdT11LnJlcGxhY2UoLyZmcm9tPS4qfCZuZXh0PS4qfCZqdW1wPS4qLywnJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlYWxVcmwgPSBpc1ZpZGVvKHUscmVjaGFuZ2UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZihyZWFsVXJsKT09J3N0cmluZycmJiFpc0JhZFZpZGVvKHUpKXsvL+i/h+a7pOWQiuavm+inhumikVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Z5X2JyaWRnZV9hcHAuc2V0V2ViVWEoUENfVUEpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YoZmJhLmdldEhlYWRlclVybCkhPT0ndW5kZWZpbmVkJyYmdHlwZW9mKHJlY2hhbmdlKSE9PSdmdW5jdGlvbicpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGJhY2tVcmwgPSBmYmEuZ2V0SGVhZGVyVXJsKHUucmVwbGFjZShcXFwiO3tcXFwiLFxcXCIjaXNWaWRlbz10cnVlIzt7XFxcIikpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJhY2tVcmwgPSBmYmEuZ2V0SGVhZGVyVXJsKHVybHNbaV0pLnJlcGxhY2UoJzt7JywnI2lnbm9yZUltZz10cnVlIyNpc1ZpZGVvPXRydWUjO3snKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1MSA9IGJhY2tVcmwuc3BsaXQoJyNpZ25vcmVJbWcnKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1MiA9ICcjaWdub3JlSW1nJytiYWNrVXJsLnNwbGl0KCcjaWdub3JlSW1nJylbMV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IHUxLnJlcGxhY2UoLyZmcm9tPS4qfCZuZXh0PS4qfCZqdW1wPS4qLywnJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigvdXJsPWh0dHAvLnRlc3QodTEpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IHUxLnNwbGl0KFxcXCJ1cmw9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoL3VybD1cXFxcLy8udGVzdCh1MSkmJi9cXFxcLm0zdTgvLnRlc3QodTEpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdDEgPSB1MS5tYXRjaCgvKC4qKVxcXFwvXFxcXC8oLio/KVxcXFwvLylbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEgPSBob3N0MSt1MS5zcGxpdChcXFwidXJsPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYmEubG9nKFxcXCJ1cmzliIblibI6XFxcIit1KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoL3ZpZD1odHRwLy50ZXN0KHUxKSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEgPSB1MS5zcGxpdChcXFwidmlkPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKC92aWQ9XFxcXC8vLnRlc3QodTEpJiYvXFxcXC5tM3U4Ly50ZXN0KHUxKSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvc3QxID0gdTEubWF0Y2goLyguKilcXFxcL1xcXFwvKC4qPylcXFxcLy8pWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxID0gaG9zdDErdTEuc3BsaXQoXFxcInZpZD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKC9cXFxcPyguKik9aHR0cC8udGVzdCh1MSkmJi9cXFxcLm0zdTgvLnRlc3QodTEpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IFxcXCJodHRwXFxcIit1MS5zcGxpdCgvXFxcXD8oLiopPWh0dHAvKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrVXJsID0gdTEgKyB1MjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coJ+i/lOWbnuiHquWKqOWKoGNvb2tpZemTvuaOpTonK2JhY2tVcmwpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZygn6L+U5Zue6ZO+5o6lOicrdSsn5bm26Ieq5Yqo5Yqg5LqGY29va2llLOWFt+S9k2Nvb2tpZeWcqOinhumikeaSreaUvuWkhOafpeeciycpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhY2tVcmw7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcIui/lOWbnuS7k+W6k3g15YWN5ZeF57uT5p6cOlxcXCIrcmVhbFVybCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbFVybFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgIC8vIGZ5X2JyaWRnZV9hcHAubG9nKCd4NeWkp+iMg+WbtOmUmeivrzonK2UubWVzc2FnZSk7XFxuICAgICAgICAgICAgICAgIGFsZXJ0KCd4NeWkp+iMg+WbtOmUmeivrzonK2UubWVzc2FnZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/miqXplJnnu5PmnZ94NSdcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LGlzVmlkZW8scmVjaGFuZ2UscGxheVVybCxtYXhfY291bnQsUENfVUEsaXNCYWRWaWRlbyk7XFxuICAgICAgICBsZXQgdXNlV2ViPWxzZy5nZXRJdGVtKFxcXCLpgJrlhY1cXFwiLFxcXCJYNVxcXCIpPT09XFxcIldFQlxcXCI7XFxuICAgICAgICAvL2xvZyhcXFwi5LuT5bqT5L2/55Sod2Vi6YCa5YWN5pu/5LujeDU6XFxcIit1c2VXZWIpO1xcbiAgICAgICAgbGV0IHJ1bGVIZWFkPXVzZVdlYiYmcGFyc2VJbnQoZ2V0QXBwVmVyc2lvbigpKT49MjMzOT9cXFwid2ViUnVsZTovL1xcXCI6XFxcIng1UnVsZTovL1xcXCI7XFxuICAgICAgICBsZXQgeDVVcmwgPSBydWxlSGVhZCtwbGF5VXJsKyAnQCcgK194NTtcXG4gICAgICAgIHJldHVybiB4NVVybFxcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIHg1UGFyc2VQcm8oeDVsaXN0LHg1VGltZW91dCxpc1ZpZGVvKXtcXG4gICAgbGV0IGJwYXRoID0gJ2ZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL3J1bGVzL2R6SG91c2UvaHRtbC/mtbfpmJTll4XmjqLlmaguaHRtbCc7XFxuICAgIGxldCBiY29kZSA9IGZldGNoKGJwYXRoKTtcXG4gICAgaWYoIWJjb2RlfHwhL2Z5X2JyaWRnZV9hcHAvLnRlc3QoYmNvZGUpKXtcXG4gICAgICAgIGxvZygn5pys5Zyw5pyq5a6J6KOF5ZeF5o6i5Zmo77yM5byA5aeL5a6J6KOFJyk7XFxuICAgICAgICBjb25zdCB7YXBpfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpO1xcbiAgICAgICAgbGV0IGh0bWwgPSBmZXRjaChhcGkuaG9zdCsnL3J1bGVsaXN0Lmpzb24/aWQ9MjA1NScpO1xcbiAgICAgICAgaWYoL+a1t+mYlOinhueVjC8udGVzdChodG1sKSl7XFxuICAgICAgICAgICAgd3JpdGVGaWxlKGJwYXRoLGh0bWwpO1xcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgd3JpdGVGaWxlKGJwYXRoLGZldGNoKCdodHRwczovL2hqZGhueC5jb2RpbmcubmV0L3AvaGlrZXIvZC9kci9naXQvcmF3L21hc3Rlci9odG1sL2dldFZpZGVvLmh0bWwnKSlcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICB4NVRpbWVvdXQgPSBwYXJzZUludCh4NVRpbWVvdXQpfHw1MDAwO1xcbiAgICBsZXQgbWF4X2NvdW50PSh4NVRpbWVvdXQvMjUwKTsgLy/moLnmja7otoXml7boh6rliqjorqHnrpfkuoblj6/miafooYznmoTmrKHmlbBcXG4gICAgcHV0VmFyKCd4NUxpc3QnLEpTT04uc3RyaW5naWZ5KHg1bGlzdCkpO1xcbiAgICBsZXQgX3g1ID0gJC50b1N0cmluZygoaXNWaWRlbywgbWF4X2NvdW50LHg1VGltZW91dCxpc0JhZFZpZGVvKSA9PiB7XFxuICAgICAgICAvL+WIneWni+WMlmZiYeWSjHJlcXVzdFxcbiAgICAgICAgaWYgKHR5cGVvZiAoZmJhKSA9PSAndW5kZWZpbmVkJyB8fCAhZmJhKSB7XFxuICAgICAgICAgICAgdmFyIGZiYSA9IGZ5X2JyaWRnZV9hcHA7XFxuICAgICAgICB9XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJlcXVlc3QpID09ICd1bmRlZmluZWQnIHx8ICFyZXF1ZXN0KSB7XFxuICAgICAgICAgICAgICAgIGV2YWwoZmJhLmdldEludGVybmFsSnMoKSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKTtcXG4gICAgICAgIH1cXG4gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tXFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGlmICh3aW5kb3cuY291bnQgPT0gbnVsbCkge1xcbiAgICAgICAgICAgICAgICB3aW5kb3cuY291bnQgPSAxO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgdGV4dD0nJztcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICB0ZXh0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXFxcImJvZHlcXFwiKS5pbm5lclRleHQ7XFxuICAgICAgICAgICAgfWNhdGNoIChlKSB7ZmJhLmxvZyhlLm1lc3NhZ2UpfVxcbiAgICAgICAgICAgIGlmKC/op6blj5HkuobpmLLnm5fpk7585pyq5o6I5p2DfOaOpeWPo+mYsuebly8udGVzdCh0ZXh0KSYmd2luZG93LmNvdW50PT0xKXtcXG4gICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XFxuICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcIuajgOa1i+WIsOacieaOiOadg++8jOW8gOWni+i/h+aOiOadg1xcXCIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB3aW5kb3cuY291bnQrKztcXG4gICAgICAgICAgICAvLyBmYmEubG9nKCdjb3VudDonICsgd2luZG93LmNvdW50ICsgJyxtYXhfY291bnQ6JyArIG1heF9jb3VudCk7XFxuICAgICAgICAgICAgaWYgKHdpbmRvdy5jb3VudCA+PSBtYXhfY291bnQpIHtcXG4gICAgICAgICAgICAgICAgZmJhLmNsZWFyVmFyKCd4NUxpc3QnKTtcXG4gICAgICAgICAgICAgICAgZmJhLmhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgICAgIGxldCBmbXNnID0gJ+mBk+mVv+S7k+W6k+mAmuWFjeino+aekOWksei0pSzljp/lm6A66LaF5pe2Jyt4NVRpbWVvdXQrJ+avq+enkic7XFxuICAgICAgICAgICAgICAgIGZiYS5sb2coZm1zZyk7XFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK2Ztc2c7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgZmJhLmxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgZnVuY3Rpb24gbXV0ZU1lKGVsZW0pIHtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBlbGVtLnBhdXNlKCk7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG5cXG4gICAgICAgIHZhciB2aWRlb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXCJ2aWRlb1xcXCIpLCBhdWRpb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXCJhdWRpb1xcXCIpLFxcbiAgICAgICAgICAgIHYyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwiZW1iZWRcXFwiKSwgdjMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXCIjcGxheWVyXFxcIik7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2aWRlb3MsIGZ1bmN0aW9uICh2aWRlbykge1xcbiAgICAgICAgICAgICAgICBtdXRlTWUodmlkZW8pO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwoYXVkaW9zLCBmdW5jdGlvbiAoYXVkaW8pIHtcXG4gICAgICAgICAgICAgICAgbXV0ZU1lKGF1ZGlvKTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIH1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHYyLCBmdW5jdGlvbiAodikge1xcbiAgICAgICAgICAgICAgICBtdXRlTWUodik7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB9XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2MywgZnVuY3Rpb24gKHYpIHtcXG4gICAgICAgICAgICAgICAgbXV0ZU1lKHYpO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgfVxcbiAgICAgICAgdmFyIHVybHMgPSBfZ2V0VXJscygpO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBmb3IgKGxldCBpIGluIHVybHMpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHU9dXJsc1tpXTtcXG4gICAgICAgICAgICAgICAgLy91PWRlY29kZVVSSUNvbXBvbmVudCh1KTtcXG4gICAgICAgICAgICAgICAgdHJ5e3U9ZGVjb2RlVVJJQ29tcG9uZW50KHUpO31jYXRjaChlKXtcXG4gICAgICAgICAgICAgICAgICAgIHU9dW5lc2NhcGUodSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYoL3VybD1odHRwLy50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgIHUgPSB1LnNwbGl0KFxcXCJ1cmw9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZigvdmlkPWh0dHAvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgdSA9IHUuc3BsaXQoXFxcInZpZD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKC9cXFxcPyguKik9aHR0cC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICB1ID0gXFxcImh0dHBcXFwiK3Uuc3BsaXQoL1xcXFw/KC4qKT1odHRwLykuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgLy9mYmEubG9nKFxcXCLlhbbku5bliIblibI6XFxcIit1KTtcXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoL1xcXFwvMVxcXFwubTN1OCQvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgdT11LnJlcGxhY2UoLyZmcm9tPS4qfCZuZXh0PS4qfCZqdW1wPS4qLywnJyk7XFxuICAgICAgICAgICAgICAgIGxldCByZWFsVXJsID0gaXNWaWRlbyh1KTtcXG4gICAgICAgICAgICAgICAgaWYgKHJlYWxVcmwmJiFpc0JhZFZpZGVvKHUpKSB7Ly/ov4fmu6TlkIrmr5tcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcIuS7k+W6k3g15YWN5ZeF57uT5p6cOlxcXCIgKyByZWFsVXJsKTtcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5jbGVhclZhcigneDVMaXN0Jyk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbFVybFxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKVxcbiAgICAgICAgfVxcbiAgICB9LCBpc1ZpZGVvLCBtYXhfY291bnQseDVUaW1lb3V0LGlzQmFkVmlkZW8pO1xcbiAgICBjb25zdCBsc2c9JC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbG9jYWxTdG9yYWdlP3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgIGxldCB1c2VXZWI9bHNnLmdldEl0ZW0oXFxcIumAmuWFjVxcXCIsXFxcIlg1XFxcIik9PT1cXFwiV0VCXFxcIjtcXG4gICAgLy9sb2coXFxcIuS7k+W6k+S9v+eUqHdlYumAmuWFjeabv+S7o3g1OlxcXCIrdXNlV2ViKTtcXG4gICAgbGV0IHJ1bGVIZWFkPXVzZVdlYiYmcGFyc2VJbnQoZ2V0QXBwVmVyc2lvbigpKT49MjMzOT9cXFwid2ViUnVsZTovL1xcXCI6XFxcIng1UnVsZTovL1xcXCI7XFxuICAgIHJldHVybiBydWxlSGVhZCticGF0aCsnQCcgKyBfeDU7XFxufVxcblxcbmZ1bmN0aW9uIExhenlQYXJzZUZhc3QocGxheVVybExpc3QsZ2V0VGltZW91dCx4NVRpbWVvdXQpe1xcbiAgICBjb25zdCB7aXNWaWRlbyxnZXRIZWFkZXJzLHg1UGFyc2VQcm99ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZ2xvYmFsUGFyc2U/cnVsZT3pgZPplb/ku5PlupNQcm8nKTtcXG4gICAgLy8gbG9nKCflvIDlp4vmiafooYwnK3BsYXlVcmxMaXN0Lmxlbmd0aCsn5Liq5Zyw5Z2A55qE5om56YeP5ZeF5o6iOicrcGxheVVybExpc3QpO1xcbiAgICBsb2coJ+W8gOWni+aJp+ihjCcrcGxheVVybExpc3QubGVuZ3RoKyfkuKrlnLDlnYDnmoTmibnph4/ll4XmjqInKTtcXG4gICAgbGV0IHBsYXlVcmxzID0gcGxheVVybExpc3QubWFwKChpdCk9PntcXG4gICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgdXJsOml0LnNwbGl0KFxcXCI7XFxcIilbMF0sXFxuICAgICAgICAgICAgb3B0aW9uczoge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAvL1xcXCJVc2VyLUFnZW50XFxcIjogXFxcIkRhcnQvMi4xMyAoZGFydDppbylcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOlxcXCJNb3ppbGxhLzUuMFxcXCJcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgdGltZW91dDogZ2V0VGltZW91dFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGxldCBiaHRtbCA9IGJhdGNoRmV0Y2gocGxheVVybHMpO1xcbiAgICBsZXQgdmlkZW9zID0gW107XFxuICAgIGxldCB4NWxpc3QgPSBbXTtcXG4gICAgZm9yKGxldCBpIGluIGJodG1sKXtcXG4gICAgICAgIGxldCBvcmRlciA9IHBhcnNlSW50KGkpKzE7XFxuICAgICAgICBsZXQgdG5hbWU9b3JkZXIrJ+WPt+ino+aekOe9keWdgDonO1xcbiAgICAgICAgLy9sb2codG5hbWUpO1xcbiAgICAgICAgbGV0IHR1cmw9cGxheVVybExpc3RbaV0uc3BsaXQoXFxcIjtcXFwiKVswXTtcXG4gICAgICAgIGxldCBqbmFtZT1wbGF5VXJsTGlzdFtpXS5zcGxpdChcXFwiO1xcXCIpLmxlbmd0aD4xP3BsYXlVcmxMaXN0W2ldLnNwbGl0KFxcXCI7XFxcIilbMV06XFxcIlxcXCI7XFxuICAgICAgICB0bmFtZSs9am5hbWU7XFxuICAgICAgICBsZXQgYmFja2NvZGUgPSBiaHRtbFtpXTtcXG4gICAgICAgIGlmKCghL3VybHxodHRwLy50ZXN0KGJhY2tjb2RlKSkmJighLyNFWFRJTkYvLnRlc3QoYmFja2NvZGUpKSl7XFxuICAgICAgICAgICAgbG9nKHRuYW1lK3R1cmwrJ+aciemXrumimCzlj6/og73liqDlr4bmiJbogIXmjILkuoYnKTtcXG4gICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgIH1lbHNlIGlmKC8jRVhUSU5GLy50ZXN0KGJhY2tjb2RlKSl7XFxuICAgICAgICAgICAgLy9sZXQgbGNhY2hlPVxcXCIvc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL2NhY2hlL3ZpZGVvX1xcXCIrdG5hbWUrXFxcIi5tM3U4XFxcIjtcXG4gICAgICAgICAgICAvL3dyaXRlRmlsZShsY2FjaGUsYmFja2NvZGUpO1xcbiAgICAgICAgICAgIC8vdmlkZW9zLnB1c2gobGNhY2hlKTtcXG4gICAgICAgICAgICBsZXQgcFVybD1jYWNoZU0zdTgodHVybCk7XFxuICAgICAgICAgICAgdmlkZW9zLnB1c2gocFVybCk7XFxuICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICB9XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBKU09OLnBhcnNlKGJhY2tjb2RlKS51cmw7XFxuICAgICAgICAgICAgaWYoL15odHRwLy50ZXN0KHVybCkpe1xcbiAgICAgICAgICAgICAgICBsZXQgcmVhbFZpZGVvID0gaXNWaWRlbyh1cmwpO1xcbiAgICAgICAgICAgICAgICBpZih0eXBlb2YocmVhbFZpZGVvKT09J3N0cmluZycpe1xcbiAgICAgICAgICAgICAgICAgICAgbG9nKHRuYW1lKyflt7Lop6PmnpDlh7rop4bpopE6JytyZWFsVmlkZW8pO1xcbiAgICAgICAgICAgICAgICAgICAgaWYoam5hbWUpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxWaWRlbys9XFxcIuKYhVxcXCIram5hbWVcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvcy5wdXNoKHJlYWxWaWRlbyk7XFxuICAgICAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICAgICAgbG9nKHRuYW1lKyfop6PmnpDlh7rkuI3nn6XpgZPku4DkuYjkuJzopb86Jyt1cmwpO1xcbiAgICAgICAgICAgICAgICAgICAgdXJsKz1cXFwiI2lzVmlkZW89dHJ1ZSNcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgaWYoam5hbWUpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybCs9XFxcIuKYhVxcXCIram5hbWVcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvcy5wdXNoKHVybCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgbG9nKHRuYW1lKyfkuLpqc29u5o6l5Y+j5LiU5peg6L+U5Zue6KeG6aKR5Zyw5Z2A5pWw5o2uOicrcGxheVVybExpc3RbaV0rJ1xcXFxuJytiYWNrY29kZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKHRuYW1lKyfkuLp4NeaOpeWPoyzliqDlhaV4NeWXheaOouWIl+ihqCcpO1xcbiAgICAgICAgICAgIHg1bGlzdC5wdXNoKHBsYXlVcmxMaXN0W2ldKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICAvLyBsb2codmlkZW9zKTtcXG4gICAgaWYodmlkZW9zLmxlbmd0aD4wKXtcXG4gICAgICAgIGlmKGdldFZhcignZHAuY2FjaGVWaWRlbycsJ3RydWUnKT09PSd0cnVlJyYmcGFyc2VJbnQoZ2V0QXBwVmVyc2lvbigpKT49MjI1NSlcXG4gICAgICAgIHtcXG4gICAgICAgICAgICBsb2coXFxcIuWwiuaVrOeahOmtlOaWreeUqOaIt++8jOinhumikee8k+WtmOW3suWQr+eUqO+8jOivt+WwveaDheS6q+WPl+eci+WJp+aXtuWFiVxcXCIpO1xcbiAgICAgICAgICAgIGxldCB2aWRlb3NDYWNoZT12aWRlb3MubWFwKChpdCk9PntcXG4gICAgICAgICAgICAgICAgbGV0IGhlYWRlcnM9e307XFxuICAgICAgICAgICAgICAgIGlmKGl0LnNwbGl0KFxcXCI7XFxcIikubGVuZ3RoPjEpe1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhlYWQgPSBpdC5zcGxpdCgnOycpWzFdO1xcbiAgICAgICAgICAgICAgICAgICAgaWYoL0AvLnRlc3QoaGVhZCkmJi97fH0vLnRlc3QoaGVhZCkpe1xcbi8vaGVhZCA9IGhlYWQucmVwbGFjZSgve3x9L2csJycpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQgPSBoZWFkLnNwbGl0KFxcXCJ7XFxcIilbMV0uc3BsaXQoXFxcIn1cXFwiKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkID0gaGVhZC5zcGxpdCgnJiYnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gaGVhZCl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSBoZWFkW2ldLnNwbGl0KCdAJylbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9aGVhZFtpXS5zcGxpdCgnQCcpWzFdLnJlcGxhY2UoLzsvLCfvvJvvvJsnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1trZXldID0gdmFsdWU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgICAgICB1cmw6aXQuc3BsaXQoXFxcIjtcXFwiKVswXS5zcGxpdChcXFwi4piFXFxcIilbMF0sXFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOntcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOmhlYWRlcnNcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHZhciBkYXRhPWJhdGNoQ2FjaGVNM3U4KHZpZGVvc0NhY2hlKTtcXG4gICAgICAgICAgICBkYXRhPWRhdGEubWFwKChpdCxpZCk9PntcXG4gICAgICAgICAgICAgICAgbGV0IGV4dHJhPVxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICBpZih2aWRlb3NbaWRdLnNwbGl0KFxcXCI7XFxcIikubGVuZ3RoPjEpe1xcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE9XFxcIjtcXFwiK3ZpZGVvc1tpZF0uc3BsaXQoXFxcIjtcXFwiKVsxXTtcXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYodmlkZW9zW2lkXS5zcGxpdChcXFwi4piFXFxcIikubGVuZ3RoPjEpe1xcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE9XFxcIuKYhVxcXCIrdmlkZW9zW2lkXS5zcGxpdChcXFwi4piFXFxcIilbMV07XFxuICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgICAgaWYoaXQrXFxcIlxcXCIhPVxcXCJudWxsXFxcIil7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQrZXh0cmFcXG4gICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlkZW9zW2lkXVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgLy9sb2coZGF0YSk7XFxuICAgICAgICAgICAgcmV0dXJuIGRhdGFcXG4gICAgICAgICAgICAvL3JldHVybiB2aWRlb3NcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiB2aWRlb3NcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBsb2coJ+WFseaciScreDVsaXN0Lmxlbmd0aCsn5LiqeDXlnLDlnYDov5vooYzova7mtYHll4XmjqInKTtcXG4gICAgLy/msqHmnInnmoTor53lsLHlvIDlp4vkvp3mrKF4NeWXheaOolxcbiAgICBzaG93TG9hZGluZygn5ZeF5o6i5Lit77yM6Iul5aSx6LSl5bCx5YiH5o2id2Vi5ZeF5o6iLi4uJyk7XFxuICAgIHJldHVybiB4NVBhcnNlUHJvKHg1bGlzdCx4NVRpbWVvdXQsaXNWaWRlbyk7XFxufVxcbnZhciBsYXp5PSQoJycpLmxhenlSdWxlKCgpPT57XFxuICAgIHRyeXtcXG4gICAgICAgIHJlYWxVcmw9aW5wdXQ7XFxuICAgICAgICBldmFsKFxcXCJ2YXIgY29uZmlnX2RwID1cXFwiICsgZmV0Y2goXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvTXlQYXJzZVNldC5qc29uXFxcIikpO1xcbiAgICAgICAgZXZhbChmZXRjaChjb25maWdfZHAuY2opKTtcXG4gICAgICAgIGxvZyhpbnB1dCsnLT7mraPlnKjmlq3mj5LprZTmlLnniYjop6PmnpAuLi4nKTtcXG4gICAgICAgIC8vIOWKoOWFpei2heaXtuiuvue9ru+8jOW7uuiuruWcqOmmlumhteiuvue9rlxcbiAgICAgICAgcmV0dXJuIGF5dG1QYXJzZShyZWFsVXJsKVxcbiAgICB9Y2F0Y2goZSl7XFxuICAgICAgICByZXR1cm4gaW5wdXRcXG4gICAgfVxcbn0pO1xcbiQuZXhwb3J0cy5pc1BpYz1pc1BpYztcXG4kLmV4cG9ydHMuaXNWaWRlbz1pc1ZpZGVvO1xcbiQuZXhwb3J0cy5pc0JhZFZpZGVvPWlzQmFkVmlkZW87XFxuJC5leHBvcnRzLmNvbVBhcnNlPWNvbVBhcnNlO1xcbiQuZXhwb3J0cy5nZXRIZWFkZXJzPWdldEhlYWRlcnM7XFxuJC5leHBvcnRzLmxhenlQYXJzZT1sYXp5UGFyc2U7XFxuJC5leHBvcnRzLng1UGFyc2VQcm89eDVQYXJzZVBybztcXG4kLmV4cG9ydHMuTGF6eVBhcnNlRmFzdD1MYXp5UGFyc2VGYXN0O1xcbiQuZXhwb3J0cy5sYXp5PWxhenk7XCJ9LHtcIm5hbWVcIjpcIuS7u+WKoeS7k+W6k+aOpeWPo1wiLFwicGF0aFwiOlwidGFza0NhbGxcIixcInJ1bGVcIjpcImpzOlxcblN0cmluZy5wcm90b3R5cGUuc3RyaXAgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnJlcGxhY2UoLyheXFxcXHMqKXwoXFxcXHMqJCkvZywgXFxcIlxcXCIpOyB9O1xcbmZ1bmN0aW9uIHRhc2tfcmVxKHRhc2tfYXBpLHRhc2spIHsgLy8g6YCa55So5Y+R6YCB5LuT5bqTcG9zdOiwg+eUqOS7u+WKoeivt+axglxcbiAgICBjb25zdCB7Z2V0RmlsZX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgbGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcbiAgICBpZighaG91c2VGaWxlKXtcXG4gICAgICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcbiAgICB9XFxuICAgIGxldCBob3VzZV9kYXRhID0gaG91c2VGaWxlKCk7XFxuICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KHRhc2tfYXBpLCB7XFxuICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcbiAgICAgICAgfSxcXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICBcXFwicGFyYW1zXFxcIjoge1xcbiAgICAgICAgICAgICAgICBcXFwiZGF0YVxcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJ0eXBlXFxcIjogdGFzay5tb2RlfHwncnVuJyxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJmdW5jXFxcIjogdGFzay5mdW5jfHwnJyxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB0YXNrLnBhcmFtc3x8W11cXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgXFxcImF1dGhcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwibmFtZVxcXCI6IGhvdXNlX2RhdGEudXNlcm5hbWV8fFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogaG91c2VfZGF0YS5wYXNzd29yZHx8XFxcIlxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pLFxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgfSk7XFxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbn1cXG5cXG5mdW5jdGlvbiB0YXNrX3VwbG9hZCh0YXNrKXsgLy8g6YCa55So5Lu75Yqh5Y+R5biD5paw5aKe5Y+K5L+u5pS55Yqf6IO9XFxuICAgIGNvbnN0IHthcGksZ2V0RmlsZX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgbGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcbiAgICBpZighaG91c2VGaWxlKXtcXG4gICAgICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcbiAgICB9XFxuICAgIGxldCBhcGlfdXJsID0gYXBpLmhvc3QrJy9oaWtlcnVsZS90YXNrL2FkZCc7XFxuICAgIGxldCBob3VzZV9kYXRhID0gaG91c2VGaWxlKCk7XFxuICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGFwaV91cmwsIHtcXG4gICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICB9LFxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgIFxcXCJkYXRhXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIm5hbWVcXFwiOiB0YXNrLm5hbWUsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicHljb2RlXFxcIjogdGFzay5weWNvZGUsXFxuICAgICAgICAgICAgICAgICAgICBcXFwibm90ZVxcXCI6IHRhc2subm90ZSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJ0ZXN0X2NvZGVcXFwiOiB0YXNrLnRlc3RfY29kZSxcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgXFxcImF1dGhcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwibmFtZVxcXCI6IGhvdXNlX2RhdGEudXNlcm5hbWV8fFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogaG91c2VfZGF0YS5wYXNzd29yZHx8XFxcIlxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pLFxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgfSk7XFxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbn1cXG5cXG5mdW5jdGlvbiB0YXNrX2NhbGwoaWQsZnVuYyxwYXJhbXMpe1xcbiAgICBjb25zdCB7YXBpfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpO1xcbiAgICBsZXQgdGFza19hcGkgPSBhcGkuaG9zdCsnL2hpa2VydWxlL3Rhc2svcnVuLycraWQ7XFxuICAgIGxldCB0YXNrID0ge1xcbiAgICAgICAgbW9kZTonY2FsbCcsXFxuICAgICAgICBmdW5jOmZ1bmMsXFxuICAgICAgICBwYXJhbXM6cGFyYW1zfHxbXVxcbiAgICB9O1xcbiAgICByZXR1cm4gdGFza19yZXEodGFza19hcGksdGFzayk7XFxufVxcblxcbmZ1bmN0aW9uIHRhc2tfcmVuYW1lKGlkLG5ld190YXNrX25hbWUpe1xcbiAgICBjb25zdCB7YXBpLGdldEZpbGV9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgIGxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXG4gICAgaWYoIWhvdXNlRmlsZSl7XFxuICAgICAgICBzZXRJdGVtKCdpc19ob3VzZV92aXAnLCAnZmFsc2UnKTtcXG4gICAgfVxcbiAgICBsZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcbiAgICBsZXQgdGFza19hcGkgPSBhcGkuaG9zdCsnL2hpa2VydWxlL3Rhc2svcmVuYW1lLycraWQ7XFxuICAgIHRhc2tfYXBpID0gdGFza19hcGkrJz9uYW1lPScraG91c2VfZGF0YS51c2VybmFtZSsnJnBhc3N3b3JkPScraG91c2VfZGF0YS5wYXNzd29yZCsnJnRhc2tfbmFtZT0nK25ld190YXNrX25hbWU7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gSlNPTi5wYXJzZShmZXRjaCh0YXNrX2FwaSx7fSkpO1xcbiAgICAgICAgaWYocmVzdWx0LnN0YXR1cz09MCl7XFxuICAgICAgICAgICAgcmV0dXJuICByZXN1bHQuZGV0YWlsXFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCsnJytyZXN1bHQuZGV0YWlsXFxuICAgICAgICB9XFxuICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxuICAgICAgICByZXR1cm4gJycrZS5tZXNzYWdlXFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gdGFza19jaGFuZ2Vfc3RhdGUoaWQpe1xcbiAgICBjb25zdCB7YXBpLGdldEZpbGV9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgIGxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXG4gICAgaWYoIWhvdXNlRmlsZSl7XFxuICAgICAgICBzZXRJdGVtKCdpc19ob3VzZV92aXAnLCAnZmFsc2UnKTtcXG4gICAgfVxcbiAgICBsZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcbiAgICBsZXQgdGFza19hcGkgPSBhcGkuaG9zdCsnL2hpa2VydWxlL3Rhc2svY2hhbmdlX3N0YXRlLycraWQ7XFxuICAgIHRhc2tfYXBpID0gdGFza19hcGkrJz9uYW1lPScraG91c2VfZGF0YS51c2VybmFtZSsnJnBhc3N3b3JkPScraG91c2VfZGF0YS5wYXNzd29yZDtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKGZldGNoKHRhc2tfYXBpLHt9KSk7XFxuICAgICAgICBpZihyZXN1bHQuc3RhdHVzPT0wKXtcXG4gICAgICAgICAgICByZXR1cm4gIHJlc3VsdC5kZXRhaWxcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0KycnK3Jlc3VsdC5kZXRhaWxcXG4gICAgICAgIH1cXG4gICAgfWNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS5tZXNzYWdlKTtcXG4gICAgICAgIHJldHVybiAnJytlLm1lc3NhZ2VcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiB0YXNrX3J1bihpZCl7XFxuICAgIGNvbnN0IHthcGl9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgIGxldCB0YXNrX2FwaSA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvdGFzay9ydW4vJytpZDtcXG4gICAgbGV0IHRhc2sgPSB7fTtcXG4gICAgcmV0dXJuIHRhc2tfcmVxKHRhc2tfYXBpLHRhc2spO1xcbn1cXG5cXG4kLmV4cG9ydHMudGFza0NhbGwgPSB0YXNrX2NhbGw7XFxuJC5leHBvcnRzLnRhc2tSdW4gPSB0YXNrX3J1bjtcXG4kLmV4cG9ydHMudGFza1JlcSA9IHRhc2tfcmVxO1xcbiQuZXhwb3J0cy50YXNrVXBsb2FkID0gdGFza191cGxvYWQ7XFxuJC5leHBvcnRzLnRhc2tSZW5hbWUgPSB0YXNrX3JlbmFtZTtcXG4kLmV4cG9ydHMudGFza0NoYW5nZVN0YXRlID0gdGFza19jaGFuZ2Vfc3RhdGU7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlhajlsYDlgqjlrZhcIixcInBhdGhcIjpcImxvY2FsU3RvcmFnZVwiLFwicnVsZVwiOlwibGV0IGxvY2FsU3RvcmFnZSA9IChmdW5jdGlvbigpIHtcXG4gICAgZXZhbFByaXZhdGVKUyhcXFwiandVS3dOVGlQR2NXU0xDWEI1WHRBWHdiNkxRYlZ5SEQrMFhKN2wwN2NlMD1cXFwiKTtcXG4gICAgLy9wYXRodG89dW5kZWZpbmVkO1xcbiAgICBldmFsUHJpdmF0ZUpTKFxcXCI0QzBZeFJZbkdDWWtnRlJYdHBsL0N6NXpMNWhoNGpDQ3p0YituZytXb2t5bVE4b1VyelM5bEE4eXhDNWFGYWRuU0VteUhLTWJyYWZsUnFYQ25OUkhEbGs2dWU4eUhUTzE2bEJQcnB3Z3M1amYwUGhyQXRvVEpJRTBaSG45bUthUTRKZDJlcnFiNEk1NWJlV0lldWdLc0RzMjExU3pJTlE1eUpnU2gxZFZ1Tnp6eFJHSmc0MEZtVHVWbVhWZk4xeGcyV0lHSEJFbWtWbkd4bU9SaFBPTkErUTVWd1BtZHA0MS9oemUzZUlzVXZobzdWQ0JnSzRyYUptUGFsSVJCQlZsQ1ZnbjhGa1dtZktxWm8rVlcrb0JjSDdocmNyc1NsQ1NqQmFuZ1QvN3N5V0h4S1loZWhVMGthTVlqbldGZzFFbTBjbU5SdG9tQ3NIejFCOHEzMk9lUUhvYXdkV3h6S09hTUhPWERCalJvakE4RS9haDBXUk95emlxUlN4bC9tOGRoQmQwZjlwaFl6LzVTVS96SkQ1MlgvOUVDMTZXVlZkcFNXMzNha1JIUnNsUHBSbFRXRjkrQXlSbVJ3MGVaT0VzMW85UU1QQVFVZkF4Yll5RkhnenR3L08yZEpScEh5VG1pQmlhYXFUY2l2eDZ2OXp5dkJ6MDR3STFBYVNDdWkrZFR1VTNsdTV4ZEV0M0FqdDZaM2lEWE9WY0VQMEVERjc0NzRQUVU2SkVadXdlOTdTY2g0Ymkxd0IxWEhaU2ZJdGRsWVlvR2VkM0xMcGJtREFJUmNpdjByQW9wOFZtUWNUdDJLM0xmaDFSRFlZMFl0dlJjSDQ5T3ZwRFJIL3hhNUZjOE1ZM0RyRm9BN3Fjb0Y0ZUNnaVZCZkJnSlI2OCtMcFFLN3RPa2c4azllYyszTlN4SlRoY2w4ZDZ5Tnd4VDlUazE3emVKZ2Q2TW95WVpJcFdRTGxGNll2Yk9kRVdoam1uQTc4d0MwaFd6K1htNmhRTVNxdEZ3K2JoRmY3Y0JHVTNhYXRQRm1kQ1kyRWRYZmgwSVlXODV3ZE95TWZpd1c3L3ZWVHA5aUUwMEkzRjA5d0dIa0dLaFZiTHVlQWtZZTd6ekpYUjd0aGFGb3I2SDdxTG1KamJSUWs5ZXZOdEJRWE5SN0RpZmlYdVFmMmx0N25PSDgwU1dtMWZESEh6am1Qc05JcHMyVFhHVCtpd1ZWNjlnL3RXaXBWUTZEOEJUeCtjQ1FwNDdubVRJclkrcU40a2gyRlloNUxsd1hkZ0l5eTFWSXVDM3gwNTNld0FJSVVtbFk5bmlFcHFZdCsxZkZQWE9DdENHdFliU2QzN3ZWUjFFT2oyazVHdS8rOUpXZzJxdndsMXR3ZWxnMUowdHhhcklpNGtUYlRydnJuRkxOOTJwb2ZwWlFVZm9XbzRjZTdIV05kYnU0SktFcmFMUVVmZGZHRVBkMVRJdWZ1dVJWYTM5ZXE5R1p5U0R1Qkw2ME1QZGxkeEt3MXpvK2ZCNVpZK1lNajNMTDJnR3REYnM5OCtBc1JWOUxKV21VbXN4OTFobUp0RlVNV0QzeG5qOEhNWldzME5QbENGVXI5NDg1S3FUcG81a1J6R2ZGK2svTmwySnpydjVjdmtxdFVuTGdLcFhFT2ovc2Uvb0R6T0FyUUtJNVROVWJ2WXdjd2NkampNU2ZqSzY4S3J3aHMrbjZTbVdaNFpkZ1JIZ0FLNU1vRmkzWG1MVjQ3UDN2U1JXdTV6eUVzTWs0eTN1dUNGaXVSUFJsdTRRNXBKdnVPZW03SDdVTGlJaENlbXY1RGdrR3RETDFjR0w0RVFoWVJCNklTelZ2c2IyRWFQOXdRRTZEVlJuTTdPK3BuU3pldDZsenAzcEZkR25ib3gxTFJmQzYwdXRYWitDakltNGlFTW10YkIyTjV6RFNoR2JlTTNYVWJKUWRDQmlzOFhJcmhoMmJpQjVoQkNWd24zWTNldHQ3R0RQVnRvaTFHUmp6K0piZ00rWVI5MjhLYmRXUzV0RmFNTTNLajNYdjZvdEl4ek1CbkRDOXVXM2QrSVh4NnZMUEowSlJ1aDN5UDdwVGxhNmMzaVI0cDluV1lEcUorWlNtcHJIRm5ET3pzTFdtRmphcGplL01xd01KZDZUazNuQVd3aWNNT1B1WXBNeXFJRjA0Zmw0bXFndHNITFNNV1JSTkhQWmpFVFE5Z1JtZURZZTZhUnRsVzAycUwyb2xERU5xTFFNdEFkb2lyTldSY1A5VkwzVGQ4SGFVTzZmU2xHTmFiTWFrSkQvMDBYQ2hPU1VPSVArN2ZNN1YwL2wxYkxXUHRFejFpN0x5Z1RWN3BkR29EbnRxU0NFbkpyQnloQkF6TFJnNVFJYzk0MzhJaEtteWZuMC8zYXdvRDFJcjc4MGV5cC9YY0k2eE5jdzZUdi9FVGZIZzBlN2lZQzBVWWNKSUU1UVVYdjBzK1lvR0lFcTVHSXpLdWI4SE5qU1RVcHN2bmtWeCtkYmUyalJuM1liOVc3SkNaNVlTNkY1TXlVVnNwak1EN05ZYytEV2pVTDJiMnNWeUFmZVlwQzhVaGFoOXR1bWF2YkJ2N2EzYTlrZ0ZicTU4bHJIeHpZN2lKUVZpZ3pxM2UxYTJCU2IwUGNXMWFKOEJEN05rTnBoS1lheVR4eWtnd2lsRVJMOGpxcUJFbmlIVmRCeERKWUxiK1h3M2FsTG1sdHVURVY2S0d0Qm50QlgreXozNlJQRE15R0lLZSszZnpjeGZuQ0RuMjBNb2RWVmtWTm96UHFNWFowRzVMNGFMVEFRYWtZS1Vqc1ZNUWpBaFFrVGxIQmVPL2FMUHg5c3hsKytqMVo1ckxnRzEyVE40WEoxZWljdnc0QVZFNThMb3JhcTBRaUUwY1M3UEgxcGJyWldyZnQ3TFlHaXlCU2hvcjcrMGppb1VoMXBkV3EycU1ZTHFlTUVldUNST1F0NTdtRnJPanlQSDQ5cXA5N2NXT3JnZWcyV3lmV1NER1FQamU1K1AweVFvQ3BEL0QzUkFNdVdtYjl3bEJ0Y3EyajhXSlB0OTFFM2tLYXd1UUl5dmQycjJVang0K0hUTnRWS2I5a01MT084NUk2NWJOR0JIKzRpclN5NWdRWWxFMjZBMmNTR0ljTEtRUmx2Sm9NbmE3TC85d3lyeTRIek9yemtyQXZMZGdzU05sWWpwSFFFUmlPSTgwc0o1ak5DQ25mdzAxM0YrQStzQWZMbXlTL0JETE5RMXFhUTNwNmg4L0pxQWZoWDVPR0hnU2lSVk9DRWp1YURCL013Wk5DdTNRTDllaGhvQWo3dU9mOFBrcjNtSWpiaGg5SGlqc2p4MTkxKzBlMkpRckZhMDFBVkpLRVZ0dVB0SWMyaC8xcFBLTXZ5ZW54alRPMk94UG5qanQrODRuSUtLaHhESi9naFB0N2l2OFBtVEowbEtLeVBSc3NsOGYvUWRIZHh1cGI2alRzSTZVS216OVk0NlBNQnVENlAzd2g4cXAzNk82b2liTkRpUWQxc0UxMHZKaDl6MUZ5c0tJZThFcU1wbk5kRW1HMlRmRUJ4UnBtUXJoS0VxZWUwcDYrYTZzUW84Y1ZsUkprS1FBWUthd2NhTkVTNVhjNmRRWTVucWVpcThzVWl6ZjFzcGZIZUhlbER1MU02QlJYdUNqRmFmWGh6OGkzbFBXZ1lxVnBmeDEzaWdWQ1JmNDdVSDY1MnlMbnNtZXBDQldneUJUV0FjT3lGMVF4OFlHdFpub2IxVE4rNnhFd3pwY1dWeTdRTzlQOTJzS0E5U0srL05Ic3FmMTNDT3QwSkhDdFRWMU9sVFFXK0pBS3l4ZTFIbDcrczk1ejNLQ2dGS1FTKzNBczFKVjdOYStnK0xDUjJJZXZ1OGQ1RDBMN0d3b0RyZVV2NDM3NExSYUZrTnNIT3FXYlU5bmhRamRNVnI3YS9pOE8vNGhicHRhU3pxcWtnWUZpTkZVL29tVzVxd0l6N3NwNG5zY0lUUkUzZ3VhNmJ6a2xNWjhFQ24xaXFBV3QwYTZnZWtpNURhTDhxWWFwVENDaGpsV3NFeHFGdXhpV1AzNVRVQ2RkRWQ4QUNiTUdzK2dRRnlET296ZkJERzE3ZFpPMG1Dd1crUHpDTDJqYklDRE5haTUvam0xUXI2TUw1Nmp6VWFJRHowR0xQVFNhZXgxVUREd2tROW83bVhXQzBSN2pXbnpia0hSV2NvbVZiV21HcUwxcmpkb2Fjcy9SOXVqcVV1QkE2QTVWTC9xa1ExeEhMNDJFWG9vcHJDOHdycmZSNjh6TU1GeE93VTdDWUhKN2JoRy9RNHJOc1hEQmNNbzFBZGlxOUxYYlhtL1FKajB1L2pnWkdzc3owbm5LS1VGSmN4enVBTks5NnpXd2YxRFhhc1VjT29FdUVhdG0xcm1QNXdyQkptVy9ad1Q2YUJCaVIyT1NKMHhyOHRRNk9ibWRLanliKzFlRVhiMTQzN1IySWRoRFVkazVQUnp0SDJZRnQycG11TDQvTG1JTEZBdlBkaXlNdERITmorS2g0c1Y0TWxYYldQcnJJOTdZQk9GcEZsWCtnbmV3S0tmRlprSEU3ZGl0eTM0ZFVRMkduZTZzQUd4MXp4eWpadjVLQk0yNmxSSEY0NVhxRk5KMVJRM2hNeW1KSHN5WU5zTU80MUJXckd2MTlQQTQ2OGVjdzlIY1JOMHdoalVUZ25zOFpWYUM0aGlKc2dZMDdhQUVCSG05MC91aGhqTy9XbWI3d3VWYWRobDlSbkhlUWpweDRnd0NyTHo1aTVzNUl0MXNCd2ZEYjBGZStQQ3BMa2Mrd0lJTksyWTg2a1B0aFI2Z0p3Vzc1enVvTjVDMENBaUR3ZlU3M3ZhQVphaHpmNFZMTmxNMFUwNE90SFlCaTEzWWdQb05tR0hSZWxaVkV5Mkt1S1ZaZ2hEMTR2U2xZK0pyTUJEZG0yeTJ0aEZWK0JyaWhMNytmUTV3Y1lueEdlbGF3RHVvU1I1K2JERGtyNlJMNDBMNHh5ZkFoeGxyT24wdUEyOGdoR2VXZ3VhV0tFdjVuQnJydmV1MXVlVnkxTXZHVVlCWStJbEVyOE5kRE5SZG1Felh0MzlrR2xkODZ4T2ZBSC94TDFWbXVnYVhPR2FQQjJxYzdXRFJrVzZrNUY2bjNQa0l6ZFBYeU9OS3AxRGtPZzNvY1NNWk1UczZHS2o5QzN2T0RaNlpRcHdORFlMTVQrQ21FTDE4R1JqWE5jWmxQL0xuaGlBSXNjWVRMMStpSFdEWXZSbXZQTXd0T0hoQ25FWElVM0ZUYlArNlFSR0E2cXlkYm5uZXFWaFhvd2NMbWJNSXoxNklDMWt3aFpqNzUvTTUzc0tZWDJ6UmdPU1RBZk5TRC81bFpZU05VeEpmS1REZ2lhRkVnZ3JDcmQrM0NjK2NoenNsSTN6RFhFS1RydmxjWDJJbkM5dUgrZnN5cHlIdytBdlkyT21CR1FNSUljOGZFM3ROTzBnQlRWcVhzZHNFNzZZd0hyMjlkelFja3VzdXlKc0JmU1ZjbHJ2c05DWjFQUURMOEgzY1JzM0hFOW5Va3g1YmJKWVdzUHhiODI1Z25FcFdVOVo5S3R6dnNsaTcvaGVPbERLcEh4SmIxdUNyV3FmOGdSbldtcTN6ZlNTclVYQkhTTHU2Mk1ya1hUaldnYXBVVnhNR2tybnpSMEU0UE15MWJGY3lEcEVRZTE1VGF5V0JNMUI2anJJRyswRFJSOU9hQ1VQd0Q3ZXhObWpaYjlNODF1cytBSVJmeXpKUFpHbWZIdVQ5U056RmZOdVFkRlp5aVpWdGFZYW92V3VOMmlySTN6UWF0S0NEblFJWHByMFZoRzBHb3A4Yy96cm9XQm9OL2FWS21uOHNrU0Z2QURPam9aQWl4ZzZLMXk5d0ZpOHBlQ21pbUZaM1p6Q1ZzRzZFVTlTdmxicTUrd243RDZ5K2RBWWRhUG1zNGd3Q3JMejVpNXM1SXQxc0J3ZkRiejRYNFZ4cUlwY1RDOU5hWUtxQTdHS0srYVRyWldVd3dOMjFRT3RyOGVxeFNnSjFVOWVDT2NXWFFkK3AzNkd5NGZZK3Q5YzJDc1ZOYk5sMWdoeGE5Ykk4VTZlNkZUZC92dkJhcTlqcktkaXRxNG1OQ2Fpb2dtZlBLNk00OFVZSThqWk1DZGQvOUM4QnF2VWo0YllVNWJ5V0FTRUc2QkJHZEs4S2xmaS9hNExXdDNpdkM0dTlRQlRmYi92Q21OSmkvUUFmYWJjUEcrVXNXbXNZTlJLK2c4aE1jc3VCbWhoNDhOcGhSdmViVlFxcTZuY0t4YzFuRkhXTVc1TTZvZit6OGMxSGRkbmllRFA5R2FCc3EreXNsaktzbFlydDk4OVBZOXhzYm1rcjNYL29DZmlGVTROZmNPaGVlKytuZ1cwWHBaQVZ0MUkyUW5jMWFsd2Jub05xTU1oWElCOTVpa0x4U0ZxSDIyNlpxOXNHL3RyZHIyU0FWdXJueVdzZkhOanVJbEJXS0RPcmQ3VnJZRkp2UTl4YlZvbUtxUWp1aDlkemYybnZWckJ6YkVGMENaWTZpemtZL1JRWTVyOWs5My95Mk5HN28wN25NWWpPdFpZWWVOVW9pazdHYksvSHpRbDFTN3MvRkNobnQ5TTZmRTBVeXVQbXR0Tzk4aHF6eFFidGVNYWxNdFNjZTJXTGNqeVhWR2ZwcWRCa1l5bTRnWkJ5Y2NTNmFudHQ0b0xkbHVXU1NKc0hYMUljWGhReTZvSitBaGp3OWhGWXdYTEhQTG9DbzNqRWxpVUFLNDE3OXd0WXRIc08wYWJMeDQraG10TTVGejd3VVZhaEJBOXN1cE9UZi9GRDRzaVpNTW9mNVczdm01RGVkaHFHQU5saHQzbUk2Um1JaHY0OFFWdG5lTXNVellDNE5EaFpENE01UjZwN0dYQnFjcHUzRmFFRi8wSTBlM0xjZVgxSE4raURxS1JQdUd6dnBhYy8xdHNHUEl0ZUFEeHU5T1lvYXAyejNGMUN6U2cvVXVhOGwvS0V6dEFLRGN2YmhOVS9ZVWMybGhneGdmZGI0ZStQOVRaN1JhWDgyczYyN3UwQ2JGc2ZHRS8xaExwYjVNYzJ2azF1REdyZEljYldBNnhocFlBSFloRVlVbDljNzVZL1IvMGdsNnI5K202Y0kwQnZCWTVBYTVOQlJjNlVNdnNPL1BPdzVDY3I3OXNKemljZWFWM1l3cllFa2pwNktpK09Zckd1OTU0QUErZEo5V3N2TkdCRkdNcktBZlE5VlVDL0FUa0pmVGxvTWx0RGVWNUFvOXprYWF5M2RLQWE1L1B4QUdSREFVY1FMREY3dVZYYkQxdkZnRS8rUlhpd3pTNU43Y3IzYUZCZFJZN1hBbUZ6L2ZiMC9LU3BSOENRL2xva3BtTTJtbHRKOXZHUGdpcWI1blpsOUt1N2QyR2xnQWRpRVJoU1gxenZsajlIL1NCdWpCUG9PMWZwb091NUYzNWNkSGE1a1NGdkFET2pvWkFpeGc2SzF5OXdGbGowRXo1a3NVVzNXVTYzRTdlNHF0RFVDS1d3ampVNWYwRmQ1N1Z5VnpwQzZDZENTY0JqWVN6VDlyWkxWc2txNjFhT1dyRERVTktxQVEzK25YL0JCVzNjUVRFY09WZGMxNW5nVlhjU1MvYUsyUUZNZGlLUWxxbTE1ZkVySmR3cXllemE3aGZsS1RpQ3pVZHU1VkdsRlc5cUN0OHN5SG9vc0EyTnpmb3NKZFRkTjhiV0hub0RyNU4yNWV0K3AvbnZqak96WlJhTFlvWS9mci9rNWhxcHRPaz1cXFwiKTtcXG4gICAgcmV0dXJuICQuZXhwb3J0cztcXG59KSgpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi57yW6L6R5YWs5ZGKXCIsXCJwYXRoXCI6XCJkZXZJbmZvRWRpdFwiLFwicnVsZVwiOlwianM6XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpPT57XFxuICAgIHB1dE15VmFyKFxcXCJkZXZJbmZvXFxcIiwnJyk7IC8v5riF6Zmk5Y6G5Y+y5YWs5ZGKXFxufSkpO1xcbnNldFBhZ2VUaXRsZSgn57yW6L6R5YWs5ZGKJyk7XFxuLy8gbGV0IHtub3dKeCxNeUppZXhpLGp4c1JvdXRlfSA9IE1ZX1BBUkFNUztcXG5jb25zdCB7Y29sb3Isc21hbGwsYXBpLCBnZXRGaWxlLGdldEFwaX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG4vLyBsZXQgaG91c2VGaWxlID0gZ2V0RmlsZXx8ZmFsc2U7XFxudmFyIGRldl9pbmZvX3VybCA9IGdldEFwaSgnaW5mb0dldFVybCcpO1xcbi8vIGxvZyhkZXZfaW5mb191cmwpO1xcbnZhciBnZXRfaW5mbyA9IGZ1bmN0aW9uKHFxKXtcXG4gICAgcXEgPSBxcXx8JzQzNDg1NzAwNSc7XFxuICAgIGxldCBkZXZfaW5mb191cmwgPSBkZXZfaW5mb191cmwrcXE7XFxuICAgIGxldCBiYWNrX2NvZGUgPSBKU09OLnBhcnNlKHJlcXVlc3QoZGV2X2luZm9fdXJsKSk7XFxuICAgIGxldCBkZXZfaW5mbz1iYWNrX2NvZGUucmVzdWx0fHxiYWNrX2NvZGUuZGV0YWlsO1xcbiAgICByZXR1cm4gZGV2X2luZm87XFxufTtcXG52YXIgYmVmb3JlX3JlZnJlc2ggPSBmdW5jdGlvbigpe1xcbiAgICBsZXQgZGV2X3NldF9pbmZvID0gZ2V0TXlWYXIoXFxcImRldl9zZXRfaW5mb1xcXCIpLnNwbGl0KCckJCcpO1xcbiAgICBsZXQgZGV2X2luZm9fdXJsID0gZGV2X3NldF9pbmZvLnNsaWNlKC0xKVswXTtcXG4gICAgbGV0IGJhY2tfY29kZSA9IEpTT04ucGFyc2UocmVxdWVzdChkZXZfaW5mb191cmwpKTtcXG4gICAgbGV0IGRldl9pbmZvPWJhY2tfY29kZS5yZXN1bHR8fGJhY2tfY29kZS5kZXRhaWw7XFxuICAgIHB1dE15VmFyKFxcXCJkZXZJbmZvXFxcIixkZXZfaW5mbyk7XFxuICAgIHJldHVybiBkZXZfaW5mb1xcbn07XFxubGV0IGQgPSBbXTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTon57yW6L6R5YWs5ZGKJyxcXG4gICAgZGVzYzon5pSv5oyBbWTor63ms5Us54K55Ye76L+b5YWl5a2m5LmgTWTor63ms5VcXFxcbuS/neWtmOWFrOWRiuaMiemSruWcqOaWh+acrOahhuacgOS4i+mdoicsXFxuICAgIGNvbF90eXBlOid0ZXh0XzEnLFxcbiAgICB1cmw6J2h0dHBzOi8vd3d3LnJ1bm9vYi5jb20vbWFya2Rvd24vbWQtdHV0b3JpYWwuaHRtbCdcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTon6L+U5ZueJyxcXG4gICAgY29sX3R5cGU6J3RleHRfMicsXFxuICAgIHVybDokKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCgpPT57XFxuICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgfSlcXG59KTtcXG5pZighZ2V0TXlWYXIoJ2RldkluZm8nKSl7XFxuICAgIGJlZm9yZV9yZWZyZXNoKCk7XFxufVxcbmxldCBlbXB0eSA9ICdoaWtlcjovL2VtcHR5JztcXG5kLnB1c2goe1xcbiAgICB0aXRsZTon6ZiF6KeI5p+l6ZiFJyxcXG4gICAgY29sX3R5cGU6J3RleHRfMicsXFxuICAgIC8vIHVybDokKGdldE15VmFyKCdkZXZJbmZvJykpLmNvbmZpcm0oKVxcbiAgICB1cmw6JChlbXB0eSkucnVsZSgoKT0+e1xcbiAgICAgICAgcmVxdWlyZShcXFwiaHR0cHM6Ly9naXRsYWIuY29tL2hqZGhueC9oaWtlci8tL3Jhdy9tYWluL2pzL21hcmtlZC5taW4uanNcXFwiKTtcXG4gICAgICAgbGV0IGRldkluZm89XFxcIlxcXCI7XFxuICAgICAgIHRyeXtcXG4gICAgICAgICAgZGV2SW5mbz1tYXJrZWQucGFyc2UoZ2V0TXlWYXIoJ2RldkluZm8nKSk7XFxuICAgICAgIH1jYXRjaChlKXt9XFxuICAgICAgICBzZXRSZXN1bHQoW1xcbiAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6ZGV2SW5mbyxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6J3JpY2hfdGV4dCcsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgXSk7XFxuICAgIH0pXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgZGVzYzogXFxcIuW/q+adpee8lui+keS9oOeahOWFrOWRiuWQp35cXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKCdkZXZJbmZvJywgJycpfHxcXFwiXFxcIixcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6LTEsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dE15VmFyKFxcXCJkZXZJbmZvXFxcIixpbnB1dCknXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi5L+d5a2Y5YWs5ZGKXFxcIixcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXG4gICAgdXJsOiQoJ+ehruiupOS/neWtmOWFrOWRiuWQl++8n+WwhuS8muS4jumBk+mVv+S7k+W6k+acjeWKoeWZqOmAmuiurycpLmNvbmZpcm0oKCk9PntcXG4gICAgICAgIGxldCBkZXZfc2V0X2luZm8gPSBnZXRNeVZhcihcXFwiZGV2X3NldF9pbmZvXFxcIikuc3BsaXQoJyQkJyk7XFxuICAgICAgICBsZXQgaW5wdXRfdGV4dCA9IGdldE15VmFyKCdkZXZJbmZvJywgJycpO1xcbiAgICAgICAgaWYoaW5wdXRfdGV4dC5sZW5ndGggPj0gNCl7XFxuICAgICAgICAgICAgbGV0IGluZm9fc2V0X3VybD0gZGV2X3NldF9pbmZvWzJdO1xcbiAgICAgICAgICAgIGxldCBzZW5kX2RhdGEgPSB7XFxcInBhcmFtc1xcXCI6XFxuICAgICAgICAgICAgICAgICAgICB7XFxcImRhdGFcXFwiOiB7XFxcImluZm9cXFwiOiBpbnB1dF90ZXh0fSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwibmFtZVxcXCI6IGRldl9zZXRfaW5mb1swXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBkZXZfc2V0X2luZm9bMV19XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAvLyBsb2coc2VuZF9kYXRhKTtcXG4gICAgICAgICAgICBsZXQgcGFyMiA9IHtoZWFkZXJzOnsnY29udGVudC10eXBlJzonYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywnVXNlci1BZ2VudCc6ZGV2X3NldF9pbmZvWzNdfSxib2R5OkpTT04uc3RyaW5naWZ5KHNlbmRfZGF0YSksbWV0aG9kOidQT1NUJ307XFxuICAgICAgICAgICAgLy8gcGFyMiA9IEpTT04uc3RyaW5naWZ5KHBhcjIpOyAvL3g16YeM6Z2i6K+35rGC5omN6ZyA6KaB57yW56CBXFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgbGV0IGJhY2tfcmV0ID0gcmVxdWVzdChpbmZvX3NldF91cmwsIHBhcjIpO1xcbiAgICAgICAgICAgICAgICBiYWNrX3JldCA9IEpTT04ucGFyc2UoYmFja19yZXQpLnJlc3VsdDtcXG4gICAgICAgICAgICAgICAgaWYoYmFja19yZXQuc3RhdHVzPT09MCl7XFxuICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+S/neWtmOaIkOWKn1xcXFxuJytiYWNrX3JldC5kZXRhaWw7XFxuICAgICAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+S/neWtmOWksei0pVxcXFxuJytiYWNrX3JldC5kZXRhaWw7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr1xcXFxuJytlLm1lc3NhZ2U7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgY29uZmlybSh7dGl0bGU6J+mBk+mVv+aPkOekuicsY29udGVudDon6Jm954S25L2g5b6I5oeS77yM5L2G5piv5YWs5ZGK6Iez5bCR5YaZNOS4quWtl+WQp++8gSd9KTtcXG4gICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgICAgICB9XFxuICAgIH0pXFxufSk7XFxuXFxuc2V0UmVzdWx0KGQpO1wifV0sXCJwYXJhbXNcIjpcIntcXFwiaWRcXFwiOjIyOTQsXFxcImlzQWxsXFxcIjp0cnVlLFxcXCJsdmVyXFxcIjoxMDV9XCIsXCJzYXZlZFwiOmZhbHNlLFwidGl0bGVcIjpcIumBk+mVv+S7k+W6k1Byb1wiLFwidmVyc2lvblwiOjAsXCJ1cmxcIjpcImhpa2VyOi8vcGFnZS9ydWxlRGV0YWlsI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1wiLFwiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcImZpbmRfcnVsZVwiOlwianM6XFxuICAgIGNvbnN0IHtcXG4gICAgICAgIGdldEFwaSxcXG4gICAgICAgIGNvbG9yLFxcbiAgICAgICAgc21hbGwsXFxuICAgICAgICBodG1sVGFnLFxcbiAgICAgICAgYXBpLFxcbiAgICAgICAgbWRcXG4gICAgfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGlkLFxcbiAgICBsdmVyLFxcbiAgICBpc0FsbFxcbn0gPSBNWV9QQVJBTVM7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKChpc0FsbCkgPT4ge1xcbiAgICBpZighaXNBbGwpe1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICB9XFxufSxpc0FsbCkpO1xcbmxldCBkYXRhSXRlbSA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcImdldGJ5aWRcXFwiKSArIFxcXCI/aWQ9XFxcIiArIGlkKSkucmVzdWx0O1xcbnNldFBhZ2VUaXRsZShcXFwi44CMXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFwi44CNXFxcIilcXG5sZXQgcnVsZUxpc3RKc29uID0gZ2V0QXBpKFxcXCJydWxlTGlzdEpzb25cXFwiKSArIFxcXCI/aWQ9XFxcIjtcXG5sZXQgZGF0YSA9IFtdO1xcbnZhciBoYXNTdWIgPSBmYWxzZTtcXG5cXG5pZiAoZGF0YUl0ZW0uaXNfanNvbl9saXN0KSB7XFxuICAgIGhhc1N1YiA9IGhhc0hvbWVTdWIocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpO1xcbn0gZWxzZSBpZiAoIWRhdGFJdGVtLmlzX2pzb25fbGlzdCAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT0gJ2hvbWVfcnVsZV91cmwnKSB7XFxuICAgIGhhc1N1YiA9IGhhc0hvbWVTdWIocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyAnJmRlYnVnPXRydWUnKTtcXG59XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLniYjmnKxcXFwiKSxcXG4gICAgZGVzYzogXFxcIuKAnOKAnOKAneKAneW8gOWPkeiAhe+8mlxcXCIgKyBjb2xvcihkYXRhSXRlbS5hdXRob3IsIFxcXCIjMjI4QkU2XFxcIikgKyBcXFwiXFxcXG7kupHnq6/niYjmnKzvvJpcXFwiICsgY29sb3IoZGF0YUl0ZW0udmVyLCBcXFwiIzVjZmYyY1xcXCIpICsgXFxcIlxcXFx0XFxcXHTmnKzlnLDniYjmnKzvvJpcXFwiICsgY29sb3IobHZlciwgXFxcIiM1Y2ZmMmNcXFwiKSArIFxcXCJcXFxcbuabtOaWsOS6jjogW1xcXCIgKyBjb2xvcihkYXRhSXRlbS5sYXN0X3VwZGF0ZSwgXFxcIiNmZjcwMDBcXFwiKSArIFxcXCJdXFxcIixcXG4gICAgdXJsOiAkKFxcXCI85byA5Y+R6ICFPlxcXFxuXFxcIiArIGRhdGFJdGVtLmF1dGhvciArIFxcXCJcXFxcbjzlkI3np7A+XFxcXG5cXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCJcXFxcbjzkupHnq6/niYjmnKw+XFxcXG5cXFwiICsgZGF0YUl0ZW0udmVyICsgXFxcIlxcXFxuPOacrOWcsOeJiOacrD5cXFxcblxcXCIgKyBsdmVyICsgXFxcIlxcXFxuPOabtOaWsOaXtumXtD5cXFxcbltcXFwiICsgZGF0YUl0ZW0ubGFzdF91cGRhdGUgKyBcXFwiXVxcXCIpLmNvbmZpcm0oKCkgPT4ge30pLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMSdcXG59KTtcXG5sZXQgZGF0YVR5cGUgPSB7XFxuICAgIGhvbWVfcnVsZV91cmw6ICfpppbpobXkupHop4TliJknLFxcbiAgICBwdWJsaXNoOiAn5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZJyxcXG4gICAganNfdXJsOiAn572R6aG15o+S5Lu26KeE5YiZJyxcXG4gICAgaHRtbDogJ+mdmeaAgemhtemdoicsXFxuICAgIGNvbmZpZzogJ+S4u+mhtemFjee9ridcXG59O1xcblxcbmxldCBiYXNpYyA9IHtcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbn07XFxubGV0IGRhdGFUeXBlVGlwcyA9IGRhdGFUeXBlW2RhdGFJdGVtLmRhdGFfdHlwZV0gfHwgJ+acquefpeinhOWIme+8micgKyBkYXRhSXRlbS5kYXRhX3R5cGU7XFxuXFxubGV0IHNhZmVfdGlwPWRhdGFJdGVtLmlzX3NhZmU/XFxcIuWuieWFqFxcXCI6XFxcIuWNsemZqVxcXCI7XFxubGV0IGdvb2RfdGlwID0gZGF0YUl0ZW0uaXNfZ29vZD9zbWFsbChjb2xvcihcXFwi44CQ5LyY6LSo6KeE5YiZ44CRXFxcIiwnI2ZmNzAwMCcpKTpcXFwiXFxcIjtcXG5sZXQgbm90X3NhZmVfbm90ZT1kYXRhSXRlbS5ub3Rfc2FmZV9ub3RlO1xcbmJhc2ljLnRpdGxlID0gaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuexu+Wei1xcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChcXFwiKGlkOlxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXCIpXFxcIikrXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChcXFwiKOmjjumZqeajgOa1izpcXFwiICtzYWZlX3RpcCtcXFwiKVxcXCIpK2dvb2RfdGlwO1xcbmJhc2ljLmRlc2MgPSBcXFwi5pWw5o2u57G75Z6L77yaXFxcIiArIGNvbG9yKGRhdGFUeXBlVGlwcywgXFxcIiNjYjU0ZmZcXFwiKSArIFxcXCJcXFxcbuWIhuS6q+eKtuaAgeS4uu+8mlxcXCIgKyBkYXRhSXRlbS5zdGF0ZTtcXG5pZiAoW1xcXCJodG1sXFxcIiwgXFxcImNvbmZpZ1xcXCIsIFxcXCJqc191cmxcXFwiXS5pbmNsdWRlcyhkYXRhSXRlbS5kYXRhX3R5cGUpKSB7XFxuICAgIGJhc2ljLmRlc2MgKz0gXFxcIlxcXFxu4oCc4oCc4oCd4oCdID0+XFxcIiArIHNtYWxsKFxcXCLngrnmraTpooTop4hcXFwiKTtcXG4gICAgYmFzaWMudXJsID0gcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxufVxcblxcbmRhdGEucHVzaChiYXNpYyk7XFxubGV0IGhhc1N1YnMgPSBcXFwiXFxcIjtcXG5pZiAoaGFzU3ViKSB7XFxuICAgIGhhc1N1YnMgPSBcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIHNtYWxsKFxcXCLlt7LorqLpmIVcXFwiKVxcbn1cXG5cXG5sZXQgbm90ZXMgPSByZXF1ZXN0KGdldEFwaShcXFwiZ2V0X3J1bGVfbm90ZVxcXCIpICsgaWQpO1xcbm5vdGVzID0gSlNPTi5wYXJzZShub3RlcykucmVzdWx0O1xcbnJlcXVpcmUobWQpO1xcbmxldCBub3Rlc0h0bWw9XFxcIlxcXCJcXG50cnl7XFxuICAgIG5vdGVzSHRtbD1tYXJrZWQucGFyc2Uobm90ZXMpO1xcbn1jYXRjaChlKXt9XFxuXFxuaWYgKG5vdGVzICE9PSBmYWxzZSkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLlpIfms6hcXFwiKSArIFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoaHRtbFRhZyhcXFwidVxcXCIsIFxcXCLmn6XnnIvlrozmlbTlhazlkYogPlxcXCIpKSxcXG4gICAgICAgIGRlc2M6IG5vdGVzLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0ZXh0OiBub3Rlc0h0bWwsXFxuICAgICAgICAgICAgbmFtZTogZGF0YUl0ZW0ubmFtZSxcXG4gICAgICAgICAgICAvLyB0eXBlOiBcXFwibG9uZ190ZXh0XFxcIlxcbiAgICAgICAgICAgIHR5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuaTjeS9nFxcXCIpICsgaGFzU3VicyxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJ0b2FzdDovL+S9oOaJjeaYr+acgOW4heeahOmCo+S4quS6uu+8gVxcXCJcXG59KTtcXG5sZXQgaW1wb3J0VXJsLCBydWxlQ29kZSwgc2hhcmVVcmwsIGJhY2tDb2RlID0gXFxcIlxcXCI7XFxuaWYgKCFkYXRhSXRlbS5pc19qc29uKSB7XFxuICAgIGJhY2tDb2RlID0gcmVxdWVzdChydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCk7XFxufVxcbnN3aXRjaCAoZGF0YUl0ZW0uZGF0YV90eXBlKSB7XFxuICAgIGNhc2UgXFxcImhvbWVfcnVsZV91cmxcXFwiOlxcbiAgICAgICAgcnVsZUNvZGUgPSBcXFwi5rW36ZiU6KeG55WM6aaW6aG16aKR6YGT6KeE5YiZ44CQXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFwi44CR77+laG9tZV9ydWxlX3VybO+/pVxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXG4gICAgICAgIGltcG9ydFVybCA9IFxcXCJydWxlOi8vXFxcIiArIGJhc2U2NEVuY29kZShydWxlQ29kZSlcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlICdwdWJsaXNoJzpcXG4gICAgICAgIHJ1bGVDb2RlID0gJ+a1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8micgKyBkYXRhSXRlbS5uYW1lICsgJ++/pXB1Ymxpc2jvv6UnICsgYmFzZTY0RW5jb2RlKGJhY2tDb2RlKTtcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAnanNfdXJsJzpcXG4gICAgICAgIHJ1bGVDb2RlID0gJ+a1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8mue9kemhteaPkuS7tu+/pWpzX3VybO+/pScgKyBkYXRhSXRlbS5uYW1lICsgJ0BiYXNlNjQ6Ly8nICsgYmFzZTY0RW5jb2RlKGJhY2tDb2RlKTtcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAnaHRtbCc6XFxuICAgICAgICBsZXQgZmlsZV90bXAgPSBkYXRhSXRlbS5uYW1lLnNwbGl0KCcuJyk7XFxuICAgICAgICBsZXQgZmlsZV9wYXRoID0gZmlsZV90bXAubGVuZ3RoID4gMSA/IGZpbGVfdG1wW2ZpbGVfdG1wLmxlbmd0aCAtIDFdICsgXFxcIi9cXFwiICsgZGF0YUl0ZW0ubmFtZSA6IGRhdGFJdGVtLm5hbWU7XFxuICAgICAgICBydWxlQ29kZSA9IFxcXCLmtbfpmJTop4bnlYzmnKzlnLDmlofku7bliIbkuqvvv6VmaWxlX3VybO+/pWhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9cXFwiICsgZmlsZV9wYXRoICsgXFxcIkBcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgYnJlYWtcXG4gICAgY2FzZSBcXFwiY29uZmlnXFxcIjpcXG4gICAgICAgIGltcG9ydFVybCA9ICQoKS5ydWxlKHBhc3N3b3JkID0+IHtcXG4gICAgICAgICAgICBldmFsKGZldGNoKFxcXCJoaWtlcjovL2Fzc2V0cy9ob21lLmpzXFxcIikpO1xcbiAgICAgICAgICAgIEhpa2VySG9tZS5sb2FkKFxcXCJpbXBvcnRcXFwiLCBwYXNzd29yZCk7XFxuICAgICAgICB9LCBiYWNrQ29kZSk7XFxuICAgICAgICBicmVhaztcXG59XFxubGV0IG15X2NvbF90eXBlID0gXFxcInRleHRfMlxcXCI7XFxubGV0IG15X2NvbF90eXBlMiA9IFxcXCJ0ZXh0XzNcXFwiO1xcbmlmIChpbXBvcnRVcmwpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5a+85YWl6KeE5YiZXFxcIixcXG4gICAgICAgIHVybDogZGF0YUl0ZW0uaXNfc2FmZT9pbXBvcnRVcmw6J3RvYXN0Oi8v6aOO6Zmp6KeE5YiZ56aB5q2i5a+85YWlISEhJyxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9KTtcXG59XFxuaWYgKHJ1bGVDb2RlKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWIhuS6q+WPo+S7pFxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJjb3B5Oi8vXFxcIiArIHJ1bGVDb2RlLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pO1xcbn1cXG5cXG5pZiAoaW1wb3J0VXJsKSB7XFxuICAgIGlmIChkYXRhSXRlbS5pc19qc29uX2xpc3QgJiYgIWhhc1N1Yikge1xcbiAgICAgICAgbGV0IHN1Yl9ydWxlX2NvZGUgPSAn5rW36ZiU6KeG55WM5ZCI6ZuG6KeE5YiZ6K6i6ZiF77+laG9tZV9zdWLvv6UnICsgZGF0YUl0ZW0ubmFtZSArIFxcXCJAQFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXG4gICAgICAgIGxldCBzdWJfdXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHN1Yl9ydWxlX2NvZGUpO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+iuoumYheWQiOmbhicsXFxuICAgICAgICAgICAgdXJsOiBzdWJfdXJsLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZTJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXCJjb2xvcjogI2ZmNzAwMFxcXCI+5a+85YWl6L275ZCI6ZuGPC9zcGFuPicsXFxuICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRhdGFJdGVtLHN1YlVybCk9PntcXG4gICAgICAgICAgICAgICAgY29uc3Qge2dlblJ1bGV9PSQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2dlbkFwaVxcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgaW1wb3J0X3J1bGU9Z2VuUnVsZShkYXRhSXRlbS5uYW1lK1xcXCIuXFxcIitkYXRhSXRlbS5hdXRob3Isc3ViVXJsKTtcXG4gICAgICAgICAgICAgICAgLy9jb3B5KGltcG9ydF9ydWxlKTtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVDb2RlPXBhcnNlUGFzdGUoaW1wb3J0X3J1bGUuc3BsaXQoXFxcIlxcXFxuXFxcIilbMF0pO1xcbiAgICAgICAgICAgICAgICAvL3JldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgICAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGltcG9ydFVybFxcbiAgICAgICAgICAgIH0sZGF0YUl0ZW0scnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZTJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXCJjb2xvcjogI2ZmNzAwMFxcXCI+5a+85YWl6YGT5b6357uPPC9zcGFuPicsXFxuICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRhdGFJdGVtLHN1YlVybCk9PntcXG4gICAgICAgICAgICAgICAgLy8gbGV0IHRpdGxlID0gXFxcIkgtXFxcIitkYXRhSXRlbS5uYW1lK1xcXCIuXFxcIitkYXRhSXRlbS5hdXRob3I7XFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IFxcXCJKLVxcXCIrZGF0YUl0ZW0ubmFtZS5zcGxpdCgnLicpWzBdO1xcbiAgICAgICAgICAgICAgICBsZXQgc3ViT2JqID0ge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBzdWJVcmwsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL3J1bGVDYWNoZS9cXFwiK3RpdGxlK1xcXCIuanNvblxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiBcXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsLy/npoHnlKjlubblj5Hmm7TmlrBcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgc2hhcmVUZXh0ID0gYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHN1Yk9iaikpO1xcbiAgICAgICAgICAgICAgICB2YXIgcGFzdGVzID0gZ2V0UGFzdGVzKCk7XFxuICAgICAgICAgICAgICAgIHZhciB1cmwgPSBzaGFyZVBhc3RlKHNoYXJlVGV4dCxwYXN0ZXMuc2xpY2UoLTEpWzBdKTtcXG4gICAgICAgICAgICAgICAgbGV0IGltcG9ydF9ydWxlPSBcXFwi6L275ZCI6ZuG6K6i6ZiF77yaXFxcIit0aXRsZSsnXFxcXG4nK3VybDtcXG4gICAgICAgICAgICAgICAgY29weShpbXBvcnRfcnVsZSk7XFxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSAnaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL3J1bGVDYWNoZS9zdWIuanNvbic7XFxuICAgICAgICAgICAgICAgIHJlcXVpcmUoZ2V0VmFyKCdzdWLkvp3otZYnLCdodHRwczovL2dpdGNvZGUubmV0L3FxXzMyMzk0MzUxL2RyLy0vcmF3L21hc3Rlci9qcy9zdWJzY3JpYmUuanMnKSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiDorqLpmIXlr7zlhaUocGF0aClcXG4gICAgICAgICAgICB9LGRhdGFJdGVtLHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGUyXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCI8c21hbGw+5o+Q56S677ya5byA5Y+R6ICF5Y2V54us5YiG5Lqr55qE5ZCI6ZuG5paH5Lu25Y+q6IO95Y2V54us5a+85YWl44CCPC9zbWFsbD5cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH0gZWxzZSBpZiAoIWRhdGFJdGVtLmlzX2pzb25fbGlzdCAmJiAhaGFzU3ViICYmIGRhdGFJdGVtLmRhdGFfdHlwZSA9PSAnaG9tZV9ydWxlX3VybCcpIHtcXG4gICAgICAgIGxldCBzdWJfcnVsZV9jb2RlID0gJ+a1t+mYlOinhueVjOWNleinhOWImeiuoumYhe+/pWhvbWVfc3Vi77+lJyArIGRhdGFJdGVtLm5hbWUgKyBcXFwiQEBcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyAnJmRlYnVnPXRydWUnO1xcbiAgICAgICAgbGV0IHN1Yl91cmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUoc3ViX3J1bGVfY29kZSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn6K6i6ZiF6KeE5YiZJyxcXG4gICAgICAgICAgICB1cmw6IHN1Yl91cmwsXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgICAgICB9KVxcbiAgICB9XFxufVxcbmlmIChkYXRhSXRlbS5pc19qc29uICYmIGRhdGFJdGVtLmRhdGFfdHlwZSA9PT0gXFxcImhvbWVfcnVsZV91cmxcXFwiICYmICFkYXRhSXRlbS5pc19qc29uX2xpc3QpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn6L+b5YWl6aKR6YGTJyxcXG4gICAgICAgIHVybDogJCggLypcXFwiI25vTG9hZGluZyNcXFwiKi8gKS5sYXp5UnVsZSgobmFtZSxob21lKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGhvbWUpKTtcXG4gICAgICAgICAgICBsZXQgaGFzUnVsZSA9IHJ1bGVMaXN0LnNvbWUoaXRlbSA9PiBpdGVtLnRpdGxlID09PSBuYW1lKTtcXG4gICAgICAgICAgICBpZiAoaGFzUnVsZSkge1xcbiAgICAgICAgICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5iYWNrXFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gaG9tZStcXFwic0BcXFwiICsgbmFtZTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pyq5a6J6KOFXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBkYXRhSXRlbS5uYW1lLGFwaS5ob21lKSxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9KVxcbn1cXG5sZXQgbWFuX3J1bGVfc2FmZSA9IGdldEFwaShcXFwibWFuUnVsZVNhZmVcXFwiKStkYXRhSXRlbS5pZDtcXG5sZXQgbWFuX3J1bGVfZ29vZCA9IGdldEFwaShcXFwibWFuUnVsZUdvb2RcXFwiKStkYXRhSXRlbS5pZDtcXG4vLyBkYXRhSXRlbS5pc19zYWZlO1xcbmlmKGdldFZhcignaG91c2UuaXNfbWFuYWdlcicpKXtcXG4gICAgZnVuY3Rpb24gc2V0SXNTYWZlKGZsYWcsbWFuX3J1bGVfc2FmZSkge1xcbiAgICAgICAgZmxhZyA9IGZsYWcgfHwgJyc7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBjb2RlID0gZmV0Y2gobWFuX3J1bGVfc2FmZSwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcIlVzZXItQWdlbnRcXFwiOiBNT0JJTEVfVUF9LFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1c2VybmFtZVxcXCI6IGdldFZhcignaG91c2UudXNlcm5hbWUnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogZ2V0VmFyKCdob3VzZS5wYXNzd29yZCcpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiaXNfc2FmZVxcXCI6ICEhZmxhZ1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGNvZGUgPSBKU09OLnBhcnNlKGNvZGUpLnJlc3VsdDtcXG4gICAgICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBlLm1lc3NhZ2VcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBmdW5jdGlvbiBzZXRJc0dvb2QoZmxhZyxtYW5fcnVsZV9nb29kKSB7XFxuICAgICAgICBmbGFnID0gZmxhZyB8fCAnJztcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IGNvZGUgPSBmZXRjaChtYW5fcnVsZV9nb29kLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFwiVXNlci1BZ2VudFxcXCI6IE1PQklMRV9VQX0sXFxuICAgICAgICAgICAgICAgIGJvZHk6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInVzZXJuYW1lXFxcIjogZ2V0VmFyKCdob3VzZS51c2VybmFtZScpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBnZXRWYXIoJ2hvdXNlLnBhc3N3b3JkJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJpc19nb29kXFxcIjogISFmbGFnXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgY29kZSA9IEpTT04ucGFyc2UoY29kZSkucmVzdWx0O1xcbiAgICAgICAgICAgIGlmIChjb2RlLnN0YXR1cyA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZS5kZXRhaWxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgY29kZS5kZXRhaWxcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGUubWVzc2FnZVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon8J+aq+mjjumZqScsXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICB1cmw6JCgn5qCH6K6w6K+l6KeE5YiZ5Li66aOO6ZmpP+mjjumZqeinhOWImeaXoOazleiiq+WvvOWFpScpLmNvbmZpcm0oKGlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKT0+e1xcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc1NhZmUoZmFsc2UsbWFuX3J1bGVfc2FmZSk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifinIXmraPluLgnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uuato+W4uD8nKS5jb25maXJtKChpZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSk9PntcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNTYWZlKHRydWUsbWFuX3J1bGVfc2FmZSk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifimaXpnZ7kvJjotKgnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uumdnuS8mOi0qD8nKS5jb25maXJtKChpZCxtYW5fcnVsZV9nb29kLHNldElzR29vZCk9PntcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNHb29kKGZhbHNlLG1hbl9ydWxlX2dvb2QpO1xcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9nb29kLHNldElzR29vZClcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon8J+SluS8mOi0qCcsXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICB1cmw6JCgn5qCH6K6w6K+l6KeE5YiZ5Li65LyY6LSoPycpLmNvbmZpcm0oKGlkLG1hbl9ydWxlX2dvb2Qsc2V0SXNHb29kKT0+e1xcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc0dvb2QodHJ1ZSxtYW5fcnVsZV9nb29kKTtcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXG4gICAgICAgIH0sZGF0YUl0ZW0uaWQsbWFuX3J1bGVfZ29vZCxzZXRJc0dvb2QpXFxuICAgIH0pO1xcbn1cXG5cXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmdvb2RfbnVtLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+i1ni5zdmdcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfM1xcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9NYWtlQWNvbW1lbnQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWVcXG4gICAgfVxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBkYXRhSXRlbS5iYWRfbnVtLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+i4qS5zdmdcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfM1xcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9NYWtlQWNvbW1lbnQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWUsXFxuICAgICAgICBkZWZhdWx0VHlwZTpcXFwiYmFkXFxcIlxcbiAgICB9XFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLor4TorrpcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+ivhOiuui5zdmdcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfM1xcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9NYWtlQWNvbW1lbnQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWVcXG4gICAgfVxcbn0pO1xcbmxldCB0b3RhbFN1bSA9IGRhdGFJdGVtLmdvb2RfbnVtICsgZGF0YUl0ZW0uYmFkX251bTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuivhOiuuihcXFwiICsgdG90YWxTdW0gKyBcXFwiKVxcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChodG1sVGFnKFxcXCJ1XFxcIiwgXFxcIuafpeeci+WFqOmDqOivhOiuuiA+XFxcIikpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9Db21tZW50XFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHkjZnlwYWdlI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICB0b3RhbFN1bTogdG90YWxTdW0sXFxuICAgICAgICBub19hY3RpdmU6IGZhbHNlXFxuICAgIH1cXG59KTtcXG4vL2NvbnN0IGxvbmdlc3RTdW09MTIwO1xcbmxldCBpY29uID0ge1xcbiAgICBcXFwiZ29vZFxcXCI6IFxcXCLwn5GNXFxcIixcXG4gICAgXFxcImJhZFxcXCI6IFxcXCLwn5GOXFxcIixcXG4gICAgXFxcInJlcGx5XFxcIjpcXFwi5byA5Y+R6ICF8J+Xo1xcXCJcXG59XFxuaWYgKHRvdGFsU3VtID09PSAwKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuS4gOadoeivhOiuuuS5n+ayoeacie+8jOW/q+adpeaKouaymeWPkeWQp++8gTwvaDU+XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICB9KTtcXG59IGVsc2Uge1xcbiAgICBsZXQgY29tbWVudExpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmRpc19nZXQgKyBkYXRhSXRlbS5pZCArIFxcXCI/bGltaXQ9NVxcXCIpKS5yZXN1bHQ7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY29tbWVudExpc3QpIHtcXG4gICAgICAgIGxldCBSZXBseSA9IGl0ZW0uZGlzY3Vzc190eXBlPT09XFxcInJlcGx5XFxcIiYmaXRlbS5yZXBseV90b19uYW1lIT09ZmFsc2UmJml0ZW0ucmVwbHlfdG9faWQhPT1mYWxzZT9cXFwi4oCY4oCY5Zue5aSNQFxcXCIraXRlbS5yZXBseV90b19uYW1lK1xcXCIgI1xcXCIraXRlbS5kaXNjdXNzX2lkK1xcXCLigJnigJlcXFxcblxcXCI6XFxcIlxcXCI7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLm5hbWUgKyBcXFwiJm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9J2dyYXknPjxzbWFsbD4jXFxcIiArIGl0ZW0uaWQgKyBcXFwiPC9zbWFsbD48Zm9udD5cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgICAgICAvL3VybDogXFxcInRvYXN0Oi8vXFxcIiArIGl0ZW0ucXEsXFxuICAgICAgICAgICAgdXJsOlxcXCJtcXF3cGE6Ly9pbS9jaGF0P2NoYXRfdHlwZT13cGEmdWluPVxcXCIraXRlbS5xcSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5kaXNjdXNzX3RleHQsXFxuICAgICAgICAgICAgZGVzYzogUmVwbHkraXRlbS5jcmVhdGVfZGF0ZSArIFxcXCLCt1xcXCIgKyBpY29uW2l0ZW0uZGlzY3Vzc190eXBlXSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOntcXG4gICAgICAgICAgICAgICAgbmFtZTppdGVtLm5hbWUsXFxuICAgICAgICAgICAgICAgIHR5cGU6XFxcImxvbmdfdGV4dFxcXCIsXFxuICAgICAgICAgICAgICAgIHRleHQ6aXRlbS5kaXNjdXNzX3RleHRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxufVxcblxcbnNldFJlc3VsdChkYXRhKTtcIixcImdyb3VwXCI6XCIw77iP4oOj5LuT5bqT6ZuG5ZCIXCIsXCJ1YVwiOlwibW9iaWxlXCIsXCJwcmVSdWxlXCI6XCJcIixcInBhZ2VzXCI6XCJbe1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5bel5YW3XFxcIixcXFwicGF0aFxcXCI6XFxcInV0aWxpeVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmxldCBob3N0ID0gXFxcXFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3NcXFxcXFxcIjtcXFxcbi8vbGV0IGhvc3QgPSBcXFxcXFxcImh0dHA6Ly8xOTIuMTY4LjMuOTQ6ODA3OVxcXFxcXFwiO1xcXFxubGV0IGhvbWUgPSBiYXNlNjREZWNvZGUoXFxcXFxcXCJhR2xyWlhJNkx5OW9iMjFsXFxcXFxcXCIpO1xcXFxudmFyIGFwaSA9IHtcXFxcbiAgICBob3N0OiBob3N0K1xcXFxcXFwiL2hpa2VydWxlXFxcXFxcXCIsXFxcXG4gICAgdXNlcnNVcmw6IFxcXFxcXFwiL2Rldi91c2Vycz9vcmRlcj1cXFxcXFxcIiwgLy/nlKjmiLfliJfooahcXFxcbiAgICBydWxlQ291bnRVcmw6IFxcXFxcXFwiL2Rldi9ydWxlY291bnRcXFxcXFxcIiwgLy/ojrflj5bop4TliJnmlbDph49cXFxcbiAgICBydWxlc1VybDogXFxcXFxcXCIvZGV2L2dldFxcXFxcXFwiLCAvL+eUqOaIt+WvueW6lOeahOinhOWImeWIl+ihqOS7heS7heiOt+WPluWFrOW8gFxcXFxuICAgIHJ1bGVzQWxsVXJsOiBcXFxcXFxcIi9kZXYvZ2V0YWxsXFxcXFxcXCIsIC8v5byA5Y+R6ICF5a+55bqU55qE6KeE5YiZ5YiX6KGo5Y+v6I635Y+W56eB5pyJXFxcXG4gICAgZGV2U2VsZjonL2Rldi9nZXRzZWxmJywvL+iOt+WPluW8gOWPkeiAheS/oeaBr1xcXFxuICAgIG1hbkNhblVwbG9hZDonL3NldF9jYW5fdXBsb2FkLycsLy/otoXnrqHorr7nva7lvIDlj5HogIXmmK/lkKblj6/kuIrkvKBcXFxcbiAgICBtYW5SdWxlU2FmZTonL3NldF9ydWxlX3NhZmUvJywvL+i2heeuoeiuvue9ruinhOWImeWuieWFqOaAp1xcXFxuICAgIG1hblJ1bGVHb29kOicvc2V0X3J1bGVfZ29vZC8nLC8v6LaF566h6K6+572u6KeE5YiZ5LyY6LSo5oCnXFxcXG4gICAgaW1wb3J0VXJsOiBcXFxcXFxcIi9ydWxlbGlzdC5qc29uP2lkPVxcXFxcXFwiLCAvL+inhOWImeivpuaDheWPr+WvvOWFpVxcXFxuICAgIGluZm9TZXRVcmw6IFxcXFxcXFwiL2Rldi9zZXRfaW5mb1xcXFxcXFwiLFxcXFxuICAgIG5vd0NvblVybDogXFxcXFxcXCIvc3FsX2luZm8vZ2V0X25vd19jb25cXFxcXFxcIixcXFxcbiAgICBpbmZvR2V0VXJsOiBcXFxcXFxcIi9kZXYvZ2V0X2luZm8/bmFtZT1cXFxcXFxcIixcXFxcbiAgICBzZXR0aW5nc0dldFVybDogXFxcXFxcXCIvZGV2L2dldF9zZXR0aW5ncz9uYW1lPVxcXFxcXFwiLFxcXFxuICAgIGd1cGxvYWQ6IFxcXFxcXFwiL2Rldi9ndXBsb2FkXFxcXFxcXCIsXFxcXG4gICAgZ3RpbWVvdmVyOiBcXFxcXFxcIi9kZXYvZ3RpbWVvdmVyXFxcXFxcXCIsXFxcXG4gICAgZ2V0YnlpZDogXFxcXFxcXCIvZGV2L2dldGJ5aWRcXFxcXFxcIixcXFxcbiAgICBydWxlTGlzdEpzb246IFxcXFxcXFwiL3J1bGVsaXN0Lmpzb25cXFxcXFxcIixcXFxcbiAgICBhdXRoOiBcXFxcXFxcIi9kZXYvZ2V0X2F1dGhcXFxcXFxcIixcXFxcbiAgICB0aW1lb3ZlcjogXFxcXFxcXCIvZGV2L3RpbWVvdmVyXFxcXFxcXCIsXFxcXG4gICAgc2hhcmU6IFxcXFxcXFwiL2Rldi9zaGFyZVxcXFxcXFwiLFxcXFxuICAgIGdlbkF1dGg6IFxcXFxcXFwiL2Rldi9nZW5fYXV0aFxcXFxcXFwiLFxcXFxuICAgIGRlbGV0ZVVybDogXFxcXFxcXCIvZGV2L2RlbGV0ZVxcXFxcXFwiLFxcXFxuICAgIGpzb25MaXN0OiBcXFxcXFxcIi9kZXYvanNvbl9saXN0XFxcXFxcXCIsXFxcXG4gICAgc2VhcmNoOiBcXFxcXFxcIi9kZXYvc2VhcmNoXFxcXFxcXCIsXFxcXG4gICAgbmV3X2RldjogXFxcXFxcXCIvZGV2X3JlZ2lzdC9uZXdcXFxcXFxcIixcXFxcbiAgICBuZXdfZ2V0SWQ6IFxcXFxcXFwiL2Rldl9yZWdpc3QvZ2V0X2lkXFxcXFxcXCIsXFxcXG4gICAgbmV3X2NvbmZpcm06IFxcXFxcXFwiL2Rldl9yZWdpc3QvY29uZmlybVxcXFxcXFwiLFxcXFxuICAgIG1vZGlmeV9wd2Q6IFxcXFxcXFwiL21vZGlmeS9wYXNzd29yZFxcXFxcXFwiLFxcXFxuICAgIG1vZGlmeV9uYW1lOiBcXFxcXFxcIi9tb2RpZnkvbmFtZVxcXFxcXFwiLFxcXFxuICAgIG1vZGlmeV9hdmE6IFxcXFxcXFwiL21vZGlmeS9hdmF0YXJcXFxcXFxcIixcXFxcbiAgICB1c2VyOiBcXFxcXFxcIi9kZXYvdXNlci9cXFxcXFxcIixcXFxcbiAgICBnZXRfcnVsZV9ub3RlOiBcXFxcXFxcIi9tb2RpZnkvZ2V0X3J1bGVfbm90ZS9cXFxcXFxcIixcXFxcbiAgICBzZXRfcnVsZV9waWM6IFxcXFxcXFwiL21vZGlmeS9ydWxlX3BpYy9cXFxcXFxcIixcXFxcbiAgICBzZXRfcnVsZV9ub3RlOiBcXFxcXFxcIi9tb2RpZnkvcnVsZV9ub3RlL1xcXFxcXFwiXFxcXG59XFxcXG4kLmV4cG9ydHMucmFuZ2UgPSBmdW5jdGlvbihtLCBuKSB7XFxcXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtIC0gbiArIDEpICsgbik7XFxcXG59XFxcXG4kLmV4cG9ydHMubWFwQ29sVHlwZSA9IGZ1bmN0aW9uKHRhcmdldCwgdHlwZSwgbikge1xcXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XFxcXG4gICAgICAgIHRhcmdldC5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiB0eXBlXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbn1cXFxcbnZhciBnZXRBcGkgPSBmdW5jdGlvbihrKSB7XFxcXG4gICAgcmV0dXJuIGFwaS5ob3N0ICsgYXBpW2tdO1xcXFxufTtcXFxcbiQuZXhwb3J0cy5nZXRBcGk9Z2V0QXBpO1xcXFxuJC5leHBvcnRzLm1kPWdldEFwaSgnaW1wb3J0VXJsJykrXFxcXFxcXCIzMTg3XFxcXFxcXCI7XFxcXG4kLmV4cG9ydHMubG9jYWxSdWxlVmVyID0gZnVuY3Rpb24obG9jYWxSdWxlTGlzdCwgcnVsZSkge1xcXFxuICAgIGxldCBsb2NhbFJ1bGU7XFxcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbFJ1bGVMaXN0Lmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgIGxldCBpdGVtID0gbG9jYWxSdWxlTGlzdFtpXTtcXFxcbiAgICAgICAgbGV0IGF1ID0gaXRlbS5hdXRob3IgfHwgXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgbGV0IHNhbWVBdT1hdS5sZW5ndGggPiAwICYmIHJ1bGUuYXV0aG9yLmluY2x1ZGVzKGF1KTtcXFxcbiAgICAgICAgc2FtZUF1PXRydWU7Ly/kuI3liKTmlq3kvZzogIXpu5jorqTkuLp0cnVlXFxcXG4gICAgICAgIGlmIChpdGVtLnRpdGxlID09PSBydWxlLm5hbWUgJiYgc2FtZUF1KSB7XFxcXG4gICAgICAgICAgICBsb2NhbFJ1bGUgPSBpdGVtO1xcXFxuICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgaWYgKGxvY2FsUnVsZSA9PT0gdm9pZCAwKSB7XFxcXG4gICAgICAgIHJldHVybiAtMTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICByZXR1cm4gbG9jYWxSdWxlLnZlcnNpb247XFxcXG4gICAgfVxcXFxufVxcXFxuJC5leHBvcnRzLmNvbG9yID0gZnVuY3Rpb24odGV4dCwgY29sb3IpIHtcXFxcbiAgICB0ZXh0ICs9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgaWYgKHRleHQuaW5kZXhPZihcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiKSA9PT0gMCkge1xcXFxuICAgICAgICB0ZXh0LnJlcGxhY2UoXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBcXFxcXFxcIuKAnOKAnOKAneKAnTxmb250IGNvbG9yPSdcXFxcXFxcIiArIGNvbG9yICsgXFxcXFxcXCInPlxcXFxcXFwiICsgdGV4dCArIFxcXFxcXFwiPC9mb250PlxcXFxcXFwiO1xcXFxufVxcXFxuXFxcXG4kLmV4cG9ydHMuc2xlZXAgPSBmdW5jdGlvbih0aW1lb3V0KXtcXFxcbiAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKHRpbWVvdXQpO1xcXFxufVxcXFxuZnVuY3Rpb24gaHRtbFRhZyh0YWcsIHRleHQpIHtcXFxcbiAgICB0ZXh0ICs9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgaWYgKHRleHQuaW5kZXhPZihcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiKSA9PT0gMCkge1xcXFxuICAgICAgICB0ZXh0LnJlcGxhY2UoXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgXFxcXFxcXCI8XFxcXFxcXCIgKyB0YWcgKyBcXFxcXFxcIj5cXFxcXFxcIiArIHRleHQgKyBcXFxcXFxcIjwvXFxcXFxcXCIgKyB0YWcgKyBcXFxcXFxcIj5cXFxcXFxcIjtcXFxcblxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXROb3dGb3JtYXREYXRlKCkge1xcXFxuICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpO1xcXFxuICAgICAgICAgICAgbGV0IHNlcGVyYXRvcjEgPSBcXFxcXFxcIi1cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGxldCBzZXBlcmF0b3IyID0gXFxcXFxcXCI6XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBsZXQgbW9udGggPSBkYXRlLmdldE1vbnRoKCkgKyAxO1xcXFxuICAgICAgICAgICAgbGV0IHN0ckRhdGUgPSBkYXRlLmdldERhdGUoKTtcXFxcbiAgICAgICAgICAgIGxldCBzdHJIb3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcXFxcbiAgICAgICAgICAgIGxldCBzdHJNaW51dGVzID0gZGF0ZS5nZXRNaW51dGVzKCk7XFxcXG4gICAgICAgICAgICBsZXQgc3RyU2Vjb25kcyA9IGRhdGUuZ2V0U2Vjb25kcygpKzE7XFxcXG4gICAgICAgICAgICBpZiAobW9udGggPj0gMSAmJiBtb250aCA8PSA5KSB7XFxcXG4gICAgICAgICAgICAgICAgbW9udGggPSBcXFxcXFxcIjBcXFxcXFxcIiArIG1vbnRoXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZiAoc3RyRGF0ZSA+PSAwICYmIHN0ckRhdGUgPD0gOSkge1xcXFxuICAgICAgICAgICAgICAgIHN0ckRhdGUgPSBcXFxcXFxcIjBcXFxcXFxcIiArIHN0ckRhdGVcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGlmIChzdHJIb3VycyA+PSAwICYmIHN0ckhvdXJzIDw9IDkpIHtcXFxcbiAgICAgICAgICAgICAgICBzdHJIb3VycyA9IFxcXFxcXFwiMFxcXFxcXFwiICsgc3RySG91cnNcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGlmIChzdHJNaW51dGVzID49IDAgJiYgc3RyTWludXRlcyA8PSA5KSB7XFxcXG4gICAgICAgICAgICAgICAgc3RyTWludXRlcyA9IFxcXFxcXFwiMFxcXFxcXFwiICsgc3RyTWludXRlc1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaWYgKHN0clNlY29uZHMgPj0gMCAmJiBzdHJTZWNvbmRzIDw9IDkpIHtcXFxcbiAgICAgICAgICAgICAgICBzdHJTZWNvbmRzID0gXFxcXFxcXCIwXFxcXFxcXCIgKyBzdHJTZWNvbmRzXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAvL2xldCBjdXJyZW50ZGF0ZSA9IGRhdGUuZ2V0RnVsbFllYXIoKSArIHNlcGVyYXRvcjEgKyBtb250aCArIHNlcGVyYXRvcjEgKyBzdHJEYXRlICsgXFxcXFxcXCIgXFxcXFxcXCIgKyBzdHJIb3VycyArIHNlcGVyYXRvcjIgKyBzdHJNaW51dGVzICsgc2VwZXJhdG9yMiArIHN0clNlY29uZHM7XFxcXG4gICAgICAgICAgICBsZXQgY3VycmVudGRhdGUgPSAoZGF0ZS5nZXRGdWxsWWVhcigpLTIwMjApKycnKyBtb250aCArJycrIHN0ckRhdGUgKycnKyBzdHJIb3VycysnJyArIHN0ck1pbnV0ZXMgKycnKyBNYXRoLmNlaWwoc3RyU2Vjb25kcy83KTtcXFxcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChjdXJyZW50ZGF0ZSlcXFxcbiAgICAgICAgfVxcXFxuJC5leHBvcnRzLmdldE5vd0Zvcm1hdERhdGUgPSBnZXROb3dGb3JtYXREYXRlO1xcXFxuJC5leHBvcnRzLmh0bWxUYWcgPSBodG1sVGFnO1xcXFxuJC5leHBvcnRzLnNtYWxsID0gZnVuY3Rpb24odGV4dCkge1xcXFxuICAgIHJldHVybiBodG1sVGFnKFxcXFxcXFwic21hbGxcXFxcXFxcIiwgdGV4dCk7XFxcXG59XFxcXG4kLmV4cG9ydHMuZ2V0RmlsZSA9IGZ1bmN0aW9uKCkge1xcXFxuICAgIHZhciBGaWxlID0gcmVxdWVzdChcXFxcXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwie31cXFxcXFxcIjtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShGaWxlKTtcXFxcbiAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcXFxcXCIsIFxcXFxcXFwie31cXFxcXFxcIik7XFxcXG4gICAgICAgIHJldHVybiB7fTtcXFxcbiAgICB9XFxcXG59XFxcXG4kLmV4cG9ydHMuZ2V0VXNlckRhdGUgPWZ1bmN0aW9uKCl7XFxcXG4gICAgdmFyIEZpbGUgPSByZXF1ZXN0KFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSQS5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwiW11cXFxcXFxcIjtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShGaWxlKTtcXFxcbiAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUkEuanNvblxcXFxcXFwiLCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgICAgICByZXR1cm4gW107XFxcXG4gICAgfVxcXFxufVxcXFxuJC5leHBvcnRzLmV4aXN0RmlsZSA9IGZ1bmN0aW9uKHNwYXRoLCBpcGF0aCwgaGVhZGVycykge1xcXFxuICAgIGxldCBzY29kZSA9IHJlcXVlc3Qoc3BhdGgpO1xcXFxuICAgIGlmICghc2NvZGUpIHtcXFxcbiAgICAgICAgd3JpdGVGaWxlKHNwYXRoLCByZXF1ZXN0KGlwYXRoLCBoZWFkZXJzKSk7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5sZXQgbmV3QXBpID0ge1xcXFxuICAgIFxcXFxcXFwiZGlzX25ld1xcXFxcXFwiOiBcXFxcXFxcIi9oaWtlcnVsZS9uZXdfcnVsZV9kaXNjdXNzL1xcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiZGlzX3ZlcmlmeVxcXFxcXFwiOiBcXFxcXFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvZ2V0X3l6bVxcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiZGlzX2dldFxcXFxcXFwiOiBcXFxcXFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJkaXNfc2V0XFxcXFxcXCI6IFxcXFxcXFwiL2hpa2VydWxlL21vZGlmeS9jYW5fZGlzY3Vzcy9cXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImRpc19uZXdfdXNlclxcXFxcXFwiOiBcXFxcXFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvbmV3X3VzZXJcXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImRpc19sb2dpblxcXFxcXFwiOlxcXFxcXFwiL2hpa2VydWxlL3J1bGVfZGlzY3Vzcy91c2VyX2xvZ2luXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJkaXNfZGV2X2Rpc2N1c3NcXFxcXFxcIjpcXFxcXFxcIi9oaWtlcnVsZS9tb2RpZnkvZGV2X2Nhbl9kaXNjdXNzXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJkaXNfZGV2X2NvbnRyb2xcXFxcXFxcIjpcXFxcXFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvcmVtb3ZlL1xcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiYWxsX3J1bGVcXFxcXFxcIjpcXFxcXFxcIi9oaWtlcnVsZS9nZXRfcnVsZXNcXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImRpc19nZXRfcmVwbHlcXFxcXFxcIjpcXFxcXFxcIi9oaWtlcnVsZS9nZXRfcmVwbHlfcnVsZV9kaXNjdXNzXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJkaXNfcmVwbHlcXFxcXFxcIjpcXFxcXFxcIi9oaWtlcnVsZS9kZXZfbmV3X3J1bGVfZGlzY3Vzcy9cXFxcXFxcIixcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gc2V0QXBpKG9iamVjdCkge1xcXFxuICAgIGxldCB0YXJnZXQgPSB7fTtcXFxcbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqZWN0KSB7XFxcXG4gICAgICAgIHRhcmdldFtrZXldPWhvc3Qrb2JqZWN0W2tleV1cXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIHRhcmdldDtcXFxcbn1cXFxcblxcXFxuJC5leHBvcnRzLmFwaSA9IHNldEFwaShuZXdBcGkpO1xcXFxuJC5leHBvcnRzLmFwaS5ob3N0PWhvc3Q7XFxcXG4kLmV4cG9ydHMuYXBpLmhvbWU9aG9tZTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlvIDlj5HogIXnmbvlvZVcXFwiLFxcXCJwYXRoXFxcIjpcXFwiZGV2TG9naW5cXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLlvIDlj5HogIXnmbvlvZVcXFxcXFxcIik7XFxcXG5jb25zdCB7XFxcXG4gICAgZ2V0QXBpLFxcXFxuICAgIGh0bWxUYWcsXFxcXG4gICAgbWFwQ29sVHlwZSxcXFxcbiAgICBzbWFsbCxcXFxcbmdldEZpbGVcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxudmFyIGRhdGEgPSBbXTtcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKT0+e1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlVXNlcm5hbWVcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2VQYXNzd29yZFxcXFxcXFwiKTtcXFxcbn0pKVxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+i0puWPtycsXFxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZVVzZXJuYW1lJywnJyksXFxcXG4gICAgICAgIHR5cGU6XFxcXFxcXCJudW1iZXJcXFxcXFxcIixcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2VVc2VybmFtZVxcXFxcXFwiLGlucHV0KSdcXFxcbiAgICB9XFxcXG59LCB7XFxcXG4gICAgdGl0bGU6ICflr4bnoIEnLFxcXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2VQYXNzd29yZCcsICcnKSxcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiLFxcXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZVBhc3N3b3JkXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOlxcXFxcXFwiJm5ic3A7Jm5ic3A7PGEgaHJlZj0naGlrZXI6Ly9wYWdlL1JlZ2lzdGVyJz7ms6jlhow8L2E+XFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxufSk7XFxcXG5tYXBDb2xUeXBlKGRhdGEsIFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiLCAxKTtcXFxcbmxldCB1c2VyID0gZ2V0RmlsZSgpO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogaHRtbFRhZyhcXFxcXFxcImJcXFxcXFxcIiwgXFxcXFxcXCLnmbvlvZVcXFxcXFxcIiksXFxcXG4gICAgdXJsOiAkKCkubGF6eVJ1bGUoKHVybCwgZik9PiB7XFxcXG4gICAgICAgIGxldCB1c2VybmFtZSA9IGdldFZhcignV2FyZWhvdXNlVXNlcm5hbWUnLCAnJyksXFxcXG4gICAgICAgICAgICBwYXNzd29yZCA9IGdldFZhcignV2FyZWhvdXNlUGFzc3dvcmQnLCAnJyk7XFxcXG4gICAgICAgIGlmKHVzZXJuYW1lID09PSBcXFxcXFxcIlxcXFxcXFwiICYmIHBhc3N3b3JkID09PVxcXFxcXFwiXFxcXFxcXCIpe1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/otKblj7flkozlr4bnoIHkuI3og73kuLrnqbpcXFxcXFxcIlxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBteVVybCA9IHVybCArICc/cXE9JyArIHVzZXJuYW1lICsgJyZwYXNzd29yZD0nICsgcGFzc3dvcmQ7XFxcXG4gICAgICAgIGxldCBjb2RlX3N0ciA9IHJlcXVlc3QobXlVcmwpO1xcXFxuICAgICAgICBsZXQgY29kZSA9IEpTT04ucGFyc2UoY29kZV9zdHIpO1xcXFxuICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT0gMCkge1xcXFxuICAgICAgICAgICAgZi51c2VybmFtZT11c2VybmFtZTtcXFxcbiAgICAgICAgICAgIGYucGFzc3dvcmQ9cGFzc3dvcmRcXFxcbiAgICAgICAgICAgIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb24nLCBKU09OLnN0cmluZ2lmeShmKSk7XFxcXG4gICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+eZu+W9leaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6LSm5Y+35oiW5a+G56CB6ZSZ6K+vXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LCBnZXRBcGkoXFxcXFxcXCJydWxlc0FsbFVybFxcXFxcXFwiKSx1c2VyKSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxcXG59KTtcXFxcbnNldFJlc3VsdChkYXRhKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwiaWNvbl8yX3JvdW5kXFxcIixcXFwibmFtZVxcXCI6XFxcIuW8gOWPkeiAheeuoeeQhlxcXCIsXFxcInBhdGhcXFwiOlxcXCJkZXZNYW5hZ2VcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLop4TliJnnrqHnkIZcXFxcXFxcIik7XFxcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICdjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5iYWNrXFxcXFxcXCIsXFxcXFxcXCJcXFxcXFxcIik7Jyk7XFxcXG5pZiAoZ2V0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmJhY2tcXFxcXFxcIikgPT09IFxcXFxcXFwiMVxcXFxcXFwiKSB7XFxcXG4gICAgYmFjaygpO1xcXFxufVxcXFxuY29uc3Qge1xcXFxuICAgIGdldEFwaSxcXFxcbiAgICBjb2xvcixcXFxcbiAgICBzbWFsbCxcXFxcbiAgICBnZXRGaWxlLFxcXFxuICAgIGV4aXN0RmlsZSxcXFxcbiAgICBtYXBDb2xUeXBlLFxcXFxuICAgIGFwaVxcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5sZXQge1xcXFxuICAgIGRldlxcXFxufSA9IE1ZX1BBUkFNUztcXFxcbmxldCB7XFxcXG4gICAgdXNlcm5hbWUsXFxcXG4gICAgcGFzc3dvcmQsXFxcXG59ID0gZ2V0RmlsZSgpO1xcXFxuLy9leGlzdEZpbGUoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvaHRtbC/lvIDlj5HogIXliIbkuqsuaHRtbFxcXFxcXFwiLCBcXFxcXFxcImh0dHBzOi8vZXJwLnNjd2luYmFvLmNvbS9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUzOVxcXFxcXFwiKTtcXFxcbmxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcXFxcXCJydWxlc0FsbFVybFxcXFxcXFwiKSArICc/cXE9JyArIHVzZXJuYW1lICsgJyZwYXNzd29yZD0nICsgcGFzc3dvcmQpKS5yZXN1bHQ7XFxcXG5sZXQgTU9CSUxFX1VBID0gJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA1LjA7IFNNLUc5MDBQIEJ1aWxkL0xSWDIxVCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg4LjAuNDMyNC4xNDYgTW9iaWxlIFNhZmFyaS81MzcuMzYnO1xcXFxubGV0IGluZm9TZXRVcmwgPSBnZXRBcGkoXFxcXFxcXCJpbmZvU2V0VXJsXFxcXFxcXCIpO1xcXFxubGV0IGluZm9HZXRVcmwgPSBnZXRBcGkoXFxcXFxcXCJpbmZvR2V0VXJsXFxcXFxcXCIpICsgdXNlcm5hbWU7XFxcXG5sZXQgc2V0dGluZ3NHZXRVcmwgPSBnZXRBcGkoXFxcXFxcXCJzZXR0aW5nc0dldFVybFxcXFxcXFwiKSArIHVzZXJuYW1lO1xcXFxucHV0TXlWYXIoXFxcXFxcXCJkZXZfc2V0X2luZm9cXFxcXFxcIiwgW3VzZXJuYW1lLCBwYXNzd29yZCwgaW5mb1NldFVybCwgTU9CSUxFX1VBLCBpbmZvR2V0VXJsXS5qb2luKFxcXFxcXFwiJCRcXFxcXFxcIikpO1xcXFxubGV0IGRhdGEgPSBbXTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08YmlnPuS7k+W6k+iuvue9rjwvYmlnPiZuYnNwOyZuYnNwOyZuYnNwOzxzbWFsbD48dT7vvIgg5Liq5Lq66LWE5paZID7vvIk8L3U+PC9zbWFsbD4nLFxcXFxuICAgIGRlc2M6ICfigJzigJzigJ3igJ3mgqjlhbHmnIkgPHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjogI2ZmNzAwMFxcXFxcXFwiPicgKyBydWxlTGlzdC5sZW5ndGggKyAnPC9zcGFuPicgKyBcXFxcXFxcIiDmnaHop4TliJnjgIJcXFxcXFxcXG7ngrnlh7vop4TliJnlj6/ov5vooYzliIbkuqvjgIHliKDpmaTjgIHlr7zlhaXmk43kvZzlj4rmn6XnnIvor6bmg4VcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1BlcnNvbmFsRGF0YSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICBleHRyYTp7aWQ6ZGV2LmlkfSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMSdcXFxcbn0pO1xcXFxubWFwQ29sVHlwZShkYXRhLCBcXFxcXFxcImxpbmVcXFxcXFxcIiwgMik7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBzbWFsbChjb2xvcihcXFxcXFxcIuabtOaUueWFrOWRiuKcjVxcXFxcXFwiLCBcXFxcXFxcIiMzNGIxZmZcXFxcXFxcIikpLFxcXFxuICAgIC8vIHVybDogXFxcXFxcXCJ4NTovL2ZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL3J1bGVzL2R6SG91c2UvaHRtbC9kZXZfaW5mb19lZGl0Lmh0bWxcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2RldkluZm9FZGl0XFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzMnXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IHNtYWxsKGNvbG9yKFxcXFxcXFwi5pu05aSa5YiG5Lqr8J+TslxcXFxcXFwiLCBcXFxcXFxcIiMzNGIxZmZcXFxcXFxcIikpLFxcXFxuICAgIC8vdXJsOiBcXFxcXFxcIng1Oi8vZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvcnVsZXMvZHpIb3VzZS9odG1sL+W8gOWPkeiAheWIhuS6qy5odG1sXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9tb3JlU2hhcmVcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMydcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogc21hbGwoY29sb3IoXFxcXFxcXCLljYfnuqfkvp3otZbwn5OlXFxcXFxcXCIsIFxcXFxcXFwiIzM0YjFmZlxcXFxcXFwiKSksXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwi5Y2H57qn5Lya6YeN5paw5LuO5LuT5bqT5ouJ5Y+W55u45YWz55qE6Z2Z5oCB6aG16Z2i5Yiw5pys5ZywXFxcXFxcXFxu56Gu6K6k5Y2H57qn5ZCXP1xcXFxcXFwiKS5jb25maXJtKChob3N0KSA9PiB7XFxcXG4gICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9odG1sL+W8gOWPkeiAheWIhuS6qy5odG1sXFxcXFxcXCIsIHJlcXVlc3QoaG9zdCsnL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTM5JykpO1xcXFxuICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvaHRtbC9kZXZfaW5mb19lZGl0Lmh0bWxcXFxcXFxcIiwgcmVxdWVzdChob3N0KycvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD00MDInKSk7XFxcXG4gICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9odG1sL2Rldl9pbmZvX2dldC5odG1sXFxcXFxcXCIsIHJlcXVlc3QoaG9zdCsnL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NDA0JykpO1xcXFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey6YeN572u5byA5Y+R6ICF5YiG5LqrLOeugOS7i+afpeeciyznroDku4vnvJbovpHnrYnpnZnmgIHmlofku7ZcXFxcXFxcIjtcXFxcbiAgICB9LGFwaS5ob3N0KSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMydcXFxcbn0pO1xcXFxubGV0IGRldlNldEJhY2s7XFxcXG50cnkge1xcXFxuICAgIGRldlNldEJhY2sgPSBKU09OLnBhcnNlKHJlcXVlc3Qoc2V0dGluZ3NHZXRVcmwpKTtcXFxcbn0gY2F0Y2ggKGUpIHtcXFxcbiAgICBkZXZTZXRCYWNrID0ge307XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHNldFNldHRpbmdJdGVtKGJhc2ljKSB7XFxcXG4gICAgbGV0IHRlbXAgPSB7XFxcXG4gICAgICAgIHRpdGxlOiBiYXNpYy50aXRsZSxcXFxcbiAgICAgICAgY29sX3R5cGU6IGJhc2ljLmNvbF90eXBlLFxcXFxuICAgICAgICB1cmw6ICQoYmFzaWMuY29uZmlybSkuY29uZmlybSgodXJsLCBtc2cpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBiYWNrID0gcmVxdWVzdCh1cmwpO1xcXFxuICAgICAgICAgICAgbGV0IHJldCA9IEpTT04ucGFyc2UoYmFjayk7XFxcXG4gICAgICAgICAgICBpZiAocmV0LnN0YXR1cyA9PSAwKSB7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIG1zZ1swXTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyBtc2dbMV0gKyBcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFwiICsgcmV0LmRldGFpbDtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSwgYmFzaWMudXJsLCBiYXNpYy5tc2cpXFxcXG4gICAgfTtcXFxcbiAgICByZXR1cm4gdGVtcDtcXFxcbn1cXFxcbmlmIChkZXZTZXRCYWNrLnN0YXR1cyA9PSAwKSB7XFxcXG4gICAgbGV0IGRldlNldHRpbmdzID0gZGV2U2V0QmFjay5yZXN1bHQ7XFxcXG4gICAgbGV0IHNoYXJlID0ge1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIlxcXFxuICAgIH07XFxcXG4gICAgaWYgKGRldlNldHRpbmdzLnNoYXJlX3B1YmxpYykge1xcXFxuICAgICAgICBzaGFyZS50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXFxcXFwi5YWs5byA5LiK5LygXFxcXFxcXCIsIFxcXFxcXFwiZ3JlZW5cXFxcXFxcIikgKyBjb2xvcihcXFxcXFxcIijnp4Hol48pXFxcXFxcXCIsIFxcXFxcXFwiIzAwYmZmZlxcXFxcXFwiKSk7XFxcXG4gICAgICAgIHNoYXJlLnVybCA9IGdldEFwaShcXFxcXFxcImd1cGxvYWRcXFxcXFxcIikgKyBcXFxcXFxcIj9xcT1cXFxcXFxcIiArIHVzZXJuYW1lICsgXFxcXFxcXCImcGFzc3dvcmQ9XFxcXFxcXCIgKyBwYXNzd29yZCArIFxcXFxcXFwiJmZsYWc9MVxcXFxcXFwiO1xcXFxuICAgICAgICBzaGFyZS5jb25maXJtID0gXFxcXFxcXCLmmK/lkKbnoa7orqTnp4Hol4/ku6XlkI7mj5DkuqTnmoTop4TliJk/XFxcXFxcXCI7XFxcXG4gICAgICAgIHNoYXJlLm1zZyA9IFtcXFxcXFxcIuW3suengeiXj1xcXFxcXFwiLCBcXFxcXFxcIuengeiXj+Wksei0pVxcXFxcXFwiXTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICBzaGFyZS50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXFxcXFwi56eB5a+G5LiK5LygXFxcXFxcXCIsIFxcXFxcXFwicmVkXFxcXFxcXCIpICsgY29sb3IoXFxcXFxcXCIo5YWs5byAKVxcXFxcXFwiLCBcXFxcXFxcIiNhZGZmMmZcXFxcXFxcIikpO1xcXFxuICAgICAgICBzaGFyZS51cmwgPSBnZXRBcGkoXFxcXFxcXCJndXBsb2FkXFxcXFxcXCIpICsgXFxcXFxcXCI/cXE9XFxcXFxcXCIgKyB1c2VybmFtZSArIFxcXFxcXFwiJnBhc3N3b3JkPVxcXFxcXFwiICsgcGFzc3dvcmQ7XFxcXG4gICAgICAgIHNoYXJlLmNvbmZpcm0gPSBcXFxcXFxcIuaYr+WQpuehruiupOWFrOW8gOS7peWQjuaPkOS6pOeahOinhOWImT9cXFxcXFxcIjtcXFxcbiAgICAgICAgc2hhcmUubXNnID0gW1xcXFxcXFwi5bey5YWs5byAXFxcXFxcXCIsIFxcXFxcXFwi5YWs5byA5aSx6LSlXFxcXFxcXCJdO1xcXFxuICAgIH1cXFxcbiAgICBkYXRhLnB1c2goc2V0U2V0dGluZ0l0ZW0oc2hhcmUpKTtcXFxcbiAgICBsZXQgdGltZU92ZXIgPSB7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfM1xcXFxcXFwiXFxcXG4gICAgfTtcXFxcbiAgICBpZiAoZGV2U2V0dGluZ3MudGltZV9vdmVyKSB7XFxcXG4gICAgICAgIHRpbWVPdmVyLnRpdGxlID0gc21hbGwoY29sb3IoXFxcXFxcXCLnn63ml7bnp5jpkqVcXFxcXFxcIiwgXFxcXFxcXCJncmVlblxcXFxcXFwiKSArIGNvbG9yKFxcXFxcXFwiKOawuOS5hSlcXFxcXFxcIiwgXFxcXFxcXCIjMDBiZmZmXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgdGltZU92ZXIudXJsID0gZ2V0QXBpKFxcXFxcXFwiZ3RpbWVvdmVyXFxcXFxcXCIpICsgXFxcXFxcXCI/cXE9XFxcXFxcXCIgKyB1c2VybmFtZSArIFxcXFxcXFwiJnBhc3N3b3JkPVxcXFxcXFwiICsgcGFzc3dvcmQgKyBcXFxcXFxcIiZmbGFnPTFcXFxcXFxcIjtcXFxcbiAgICAgICAgdGltZU92ZXIuY29uZmlybSA9IFxcXFxcXFwi5piv5ZCm56Gu6K6k5Lul5ZCO55qE56eB6JeP6KeE5YiZ5YiG5Lqr5LiN6L+H5pyfP1xcXFxcXFwiO1xcXFxuICAgICAgICB0aW1lT3Zlci5tc2cgPSBbXFxcXFxcXCLlt7Lorr7kuLrmsLjkuYVcXFxcXFxcIiwgXFxcXFxcXCLorr7kuLrmsLjkuYXlpLHotKVcXFxcXFxcIl07XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgdGltZU92ZXIudGl0bGUgPSBzbWFsbChjb2xvcihcXFxcXFxcIuawuOS5heenmOmSpVxcXFxcXFwiLCBcXFxcXFxcInJlZFxcXFxcXFwiKSArIGNvbG9yKFxcXFxcXFwiKOi/h+acnylcXFxcXFxcIiwgXFxcXFxcXCIjYWRmZjJmXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgdGltZU92ZXIudXJsID0gZ2V0QXBpKFxcXFxcXFwiZ3RpbWVvdmVyXFxcXFxcXCIpICsgXFxcXFxcXCI/cXE9XFxcXFxcXCIgKyB1c2VybmFtZSArIFxcXFxcXFwiJnBhc3N3b3JkPVxcXFxcXFwiICsgcGFzc3dvcmQ7XFxcXG4gICAgICAgIHRpbWVPdmVyLmNvbmZpcm0gPSBcXFxcXFxcIuehruiupOimgeS7peWQjuWIhuS6q+eahOengeiXj+inhOWImeiHquWKqOWIsOacnz9cXFxcXFxcIjtcXFxcbiAgICAgICAgdGltZU92ZXIubXNnID0gW1xcXFxcXFwi5bey6K6+5Li66L+H5pyfXFxcXFxcXCIsIFxcXFxcXFwi6K6+5Li66L+H5pyf5aSx6LSlXFxcXFxcXCJdO1xcXFxuICAgIH1cXFxcbiAgICBkYXRhLnB1c2goc2V0U2V0dGluZ0l0ZW0odGltZU92ZXIpKTtcXFxcbiAgICBsZXQgZGlzY3VzcyA9IHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8zXFxcXFxcXCJcXFxcbiAgICB9O1xcXFxuICAgIGlmIChkZXZTZXR0aW5ncy5jYW5fZGlzY3Vzcykge1xcXFxuICAgICAgICBkaXNjdXNzLnRpdGxlID0gc21hbGwoY29sb3IoXFxcXFxcXCLlhYHorrjor4TorrpcXFxcXFxcIiwgXFxcXFxcXCJyZWRcXFxcXFxcIikgKyBjb2xvcihcXFxcXFxcIijkuI3orrgpXFxcXFxcXCIsIFxcXFxcXFwiI2FkZmYyZlxcXFxcXFwiKSk7XFxcXG4gICAgICAgIGRpc2N1c3MudXJsID0gYXBpLmRpc19kZXZfZGlzY3VzcyArIFxcXFxcXFwiP3FxPVxcXFxcXFwiICsgdXNlcm5hbWUgKyBcXFxcXFxcIiZwYXNzd29yZD1cXFxcXFxcIiArIHBhc3N3b3JkKyBcXFxcXFxcIiZmbGFnPTFcXFxcXFxcIjtcXFxcbiAgICAgICAgZGlzY3Vzcy5jb25maXJtID0gXFxcXFxcXCLmmK/lkKbnoa7orqTku6XlkI7kuIrkvKDnmoTop4TliJnlhYHorrjor4Torro/XFxcXFxcXCI7XFxcXG4gICAgICAgIGRpc2N1c3MubXNnID0gW1xcXFxcXFwi5bey6K6+5Li65LiN6K64XFxcXFxcXCIsIFxcXFxcXFwi6K6+572u5aSx6LSlXFxcXFxcXCJdO1xcXFxuXFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgZGlzY3Vzcy50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXFxcXFwi5LiN6K646K+E6K66XFxcXFxcXCIsIFxcXFxcXFwiZ3JlZW5cXFxcXFxcIikgKyBjb2xvcihcXFxcXFxcIijlhYHorrgpXFxcXFxcXCIsIFxcXFxcXFwiIzAwYmZmZlxcXFxcXFwiKSk7XFxcXG4gICAgICAgIGRpc2N1c3MudXJsID0gYXBpLmRpc19kZXZfZGlzY3VzcyArIFxcXFxcXFwiP3FxPVxcXFxcXFwiICsgdXNlcm5hbWUgKyBcXFxcXFxcIiZwYXNzd29yZD1cXFxcXFxcIiArIHBhc3N3b3JkO1xcXFxuICAgICAgICBkaXNjdXNzLmNvbmZpcm0gPSBcXFxcXFxcIuaYr+WQpuehruiupOS7peWQjuS4iuS8oOeahOinhOWImeWFgeiuuOivhOiuuj9cXFxcXFxcIjtcXFxcbiAgICAgICAgZGlzY3Vzcy5tc2cgPSBbXFxcXFxcXCLlt7Lorr7kuLrlhYHorrhcXFxcXFxcIiwgXFxcXFxcXCLorr7nva7lpLHotKVcXFxcXFxcIl07XFxcXG4gICAgfVxcXFxuICAgIGRhdGEucHVzaChzZXRTZXR0aW5nSXRlbShkaXNjdXNzKSk7XFxcXG59XFxcXG5tYXBDb2xUeXBlKGRhdGEsIFxcXFxcXFwibGluZVxcXFxcXFwiLCAyKTtcXFxcbmZvciAobGV0IGl0ZW0gb2YgcnVsZUxpc3QpIHtcXFxcbiAgICBsZXQgbXlfdF9leGNvZGUxID0gJyc7XFxcXG4gICAgbGV0IG15X3RfZXhjb2RlMiA9ICcnO1xcXFxuICAgIGlmIChpdGVtLnN0YXRlICE9ICdwdWJsaWMnKSB7XFxcXG4gICAgICAgIG15X3RfZXhjb2RlMSArPSAn44qZ77iPJztcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICBteV90X2V4Y29kZTEgKz0gJyc7XFxcXG4gICAgfVxcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBteV90X2V4Y29kZTEgKyBpdGVtLm5hbWUgKyBteV90X2V4Y29kZTIsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvbWFuYWdlUnVsZSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkLFxcXFxuICAgICAgICAgICAgLy91c2VybmFtZTogdXNlcm5hbWUsXFxcXG4gICAgICAgICAgICAvL3Bhc3N3b3JkOiBwYXNzd29yZFxcXFxuICAgICAgICB9LFxcXFxuICAgICAgICBwaWNfdXJsOiBpdGVtLnBpYyxcXFxcbiAgICB9KVxcXFxufVxcXFxuaWYgKHJ1bGVMaXN0Lmxlbmd0aCA9PT0gMCkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuW/q+adpeS4iuS8oOS9oOeahOesrOS4gOadoeinhOWImeWQp++8gTwvaDU+XFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59XFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi6KeE5YiZ6K+m57uGLWRldlxcXCIsXFxcInBhdGhcXFwiOlxcXCJtYW5hZ2VSdWxlXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuICAgIGNvbnN0IHtcXFxcbiAgICAgICAgZ2V0QXBpLFxcXFxuICAgICAgICBjb2xvcixcXFxcbiAgICAgICAgc21hbGwsXFxcXG4gICAgICAgIGdldEZpbGUsXFxcXG4gICAgICAgIGV4aXN0RmlsZSxcXFxcbiAgICAgICAgbWFwQ29sVHlwZSxcXFxcbiAgICAgICAgaHRtbFRhZyxcXFxcbiAgICAgICAgYXBpXFxcXG4gICAgfSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5sZXQge1xcXFxuICAgIGlkXFxcXG59ID0gTVlfUEFSQU1TO1xcXFxubGV0IHtcXFxcbiAgICB1c2VybmFtZSxcXFxcbiAgICBwYXNzd29yZCxcXFxcbn0gPSBnZXRGaWxlKCk7XFxcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbn0pKTtcXFxcbmxldCBkYXRhSXRlbSA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcXFxcXCJnZXRieWlkXFxcXFxcXCIpICsgXFxcXFxcXCI/aWQ9XFxcXFxcXCIgKyBpZCkpLnJlc3VsdDtcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIue8lui+keOAjFxcXFxcXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXFxcXFwi44CNXFxcXFxcXCIpO1xcXFxubGV0IHJlcUJ5R2V0ID0gXFxcXFxcXCI/aWQ9XFxcXFxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXFxcXFwiJnFxPVxcXFxcXFwiICsgdXNlcm5hbWUgKyBcXFxcXFxcIiZwYXNzd29yZD1cXFxcXFxcIiArIHBhc3N3b3JkO1xcXFxubGV0IHJ1bGVMaXN0SnNvbiA9IGdldEFwaShcXFxcXFxcInJ1bGVMaXN0SnNvblxcXFxcXFwiKSArIFxcXFxcXFwiP2lkPVxcXFxcXFwiO1xcXFxubGV0IGRhdGEgPSBbXTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcXFxcXCJiaWdcXFxcXFxcIiwgXFxcXFxcXCLniYjmnKxcXFxcXFxcIiksXFxcXG4gICAgZGVzYzogXFxcXFxcXCLigJzigJzigJ3igJ3kupHnq6/niYjmnKw6XFxcXFxcXCIgKyBjb2xvcihkYXRhSXRlbS52ZXIsIFxcXFxcXFwiIzVjZmYyY1xcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFxu5LiK5qyh5o+Q5Lqk5LqOOiBbXFxcXFxcXCIgKyBjb2xvcihkYXRhSXRlbS5sYXN0X3VwZGF0ZSwgXFxcXFxcXCIjZmY3MDAwXFxcXFxcXCIpICsgXFxcXFxcXCJdXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiPOW8gOWPkeiAhT5cXFxcXFxcXG5cXFxcXFxcIiArIGRhdGFJdGVtLmF1dGhvciArIFxcXFxcXFwiXFxcXFxcXFxuPOWQjeensD5cXFxcXFxcXG5cXFxcXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFxcXFxcIlxcXFxcXFxcbjzkupHnq6/niYjmnKw+XFxcXFxcXFxuXFxcXFxcXCIgKyBkYXRhSXRlbS52ZXIgKyBcXFxcXFxcIlxcXFxcXFxcbjzmm7TmlrDml7bpl7Q+XFxcXFxcXFxuW1xcXFxcXFwiICsgZGF0YUl0ZW0ubGFzdF91cGRhdGUgKyBcXFxcXFxcIl1cXFxcXFxcIikuY29uZmlybSgoKSA9PiB7fSksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnXFxcXG59KTtcXFxcbmxldCBkYXRhVHlwZSA9IHtcXFxcbiAgICBob21lX3J1bGVfdXJsOiAn6aaW6aG15LqR6KeE5YiZJyxcXFxcbiAgICBwdWJsaXNoOiAn5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZJyxcXFxcbiAgICBqc191cmw6ICfnvZHpobXmj5Lku7bop4TliJknLFxcXFxuICAgIGh0bWw6ICfpnZnmgIHpobXpnaInLFxcXFxuICAgIGNvbmZpZzogJ+S4u+mhtemFjee9ridcXFxcbn07XFxcXG5cXFxcbmxldCBiYXNpYyA9IHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG59O1xcXFxubGV0IGRhdGFUeXBlVGlwcyA9IGRhdGFUeXBlW2RhdGFJdGVtLmRhdGFfdHlwZV0gfHwgJ+acquefpeinhOWImTonICsgZGF0YUl0ZW0uZGF0YV90eXBlO1xcXFxuXFxcXG5iYXNpYy50aXRsZSA9IGh0bWxUYWcoXFxcXFxcXCJiaWdcXFxcXFxcIiwgXFxcXFxcXCLnsbvlnotcXFxcXFxcIikgKyBcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFwiICsgc21hbGwoXFxcXFxcXCIoaWQ6XFxcXFxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXFxcXFwiKVxcXFxcXFwiKTtcXFxcbmJhc2ljLmRlc2MgPSBcXFxcXFxcIuaVsOaNruexu+Wei++8mlxcXFxcXFwiICsgY29sb3IoZGF0YVR5cGVUaXBzLCBcXFxcXFxcIiNjYjU0ZmZcXFxcXFxcIikgKyBcXFxcXFxcIlxcXFxcXFxcbuWIhuS6q+eKtuaAgeS4uu+8mlxcXFxcXFwiICsgZGF0YUl0ZW0uc3RhdGU7XFxcXG5pZiAoW1xcXFxcXFwiaHRtbFxcXFxcXFwiLCBcXFxcXFxcImNvbmZpZ1xcXFxcXFwiLCBcXFxcXFxcImpzX3VybFxcXFxcXFwiXS5pbmNsdWRlcyhkYXRhSXRlbS5kYXRhX3R5cGUpKSB7XFxcXG4gICAgYmFzaWMuZGVzYyArPSBcXFxcXFxcIlxcXFxcXFxcbuKAnOKAnOKAneKAnSA9PlxcXFxcXFwiICsgc21hbGwoXFxcXFxcXCLngrnmraTpooTop4hcXFxcXFxcIik7XFxcXG4gICAgYmFzaWMudXJsID0gcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxcXG59XFxcXG5sZXQgYXV0aCA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG5pZiAoZGF0YUl0ZW0uc3RhdGUgPT0gXFxcXFxcXCJwcml2YXRlXFxcXFxcXCIpIHtcXFxcbiAgICBsZXQgYXV0aF9iYWNrID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFxcXFxcImF1dGhcXFxcXFxcIikgKyByZXFCeUdldCkpO1xcXFxuICAgIGJhc2ljLnRpdGxlID0gYmFzaWMudGl0bGUgKyBcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFwiICsgc21hbGwoY29sb3IoYXV0aF9iYWNrLnJlc3VsdCwgXFxcXFxcXCJncmV5XFxcXFxcXCIpKTtcXFxcbiAgICBhdXRoID0gJyZhdXRoPScgKyBhdXRoX2JhY2sucmVzdWx0O1xcXFxuICAgIGJhc2ljLnVybCA9IGJhc2ljLnVybCA9PT0gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIgPyBiYXNpYy51cmwgOiBiYXNpYy51cmwgKyBhdXRoO1xcXFxufVxcXFxuZGF0YS5wdXNoKGJhc2ljKTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcXFxcXCJiaWdcXFxcXFxcIiwgXFxcXFxcXCLmk43kvZxcXFxcXFxcIiksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcInRvYXN0Oi8v5L2g5omN5piv5pyA5biF55qE6YKj5Liq5Lq677yBXFxcXFxcXCJcXFxcbn0pO1xcXFxubGV0IGltcG9ydFVybCwgcnVsZUNvZGUsIHNoYXJlVXJsLCBiYWNrQ29kZSA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG5sZXQgc3ViVXJsID0gcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyBhdXRoO1xcXFxuaWYgKCFkYXRhSXRlbS5pc19qc29uKSB7XFxcXG4gICAgYmFja0NvZGUgPSByZXF1ZXN0KHN1YlVybCk7XFxcXG59XFxcXG5zd2l0Y2ggKGRhdGFJdGVtLmRhdGFfdHlwZSkge1xcXFxuICAgIGNhc2UgXFxcXFxcXCJob21lX3J1bGVfdXJsXFxcXFxcXCI6XFxcXG4gICAgICAgIHJ1bGVDb2RlID0gXFxcXFxcXCLmtbfpmJTop4bnlYzpppbpobXpopHpgZPop4TliJnjgJBcXFxcXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFxcXFxcIuOAke+/pWhvbWVfcnVsZV91cmzvv6VcXFxcXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgYXV0aDtcXFxcbiAgICAgICAgaW1wb3J0VXJsID0gXFxcXFxcXCJydWxlOi8vXFxcXFxcXCIgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpXFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgJ3B1Ymxpc2gnOlxcXFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJonICsgZGF0YUl0ZW0ubmFtZSArICfvv6VwdWJsaXNo77+lJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgJ2pzX3VybCc6XFxcXG4gICAgICAgIHJ1bGVDb2RlID0gJ+a1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8mue9kemhteaPkuS7tu+/pWpzX3VybO+/pScgKyBkYXRhSXRlbS5uYW1lICsgJ0BiYXNlNjQ6Ly8nICsgYmFzZTY0RW5jb2RlKGJhY2tDb2RlKTtcXFxcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXFxcbiAgICAgICAgYnJlYWs7XFxcXG4gICAgY2FzZSAnaHRtbCc6XFxcXG4gICAgICAgIGxldCBmaWxlX3RtcCA9IGRhdGFJdGVtLm5hbWUuc3BsaXQoJy4nKTtcXFxcbiAgICAgICAgbGV0IGZpbGVfcGF0aCA9IGZpbGVfdG1wLmxlbmd0aCA+IDEgPyBmaWxlX3RtcFtmaWxlX3RtcC5sZW5ndGggLSAxXSArIFxcXFxcXFwiL1xcXFxcXFwiICsgZGF0YUl0ZW0ubmFtZSA6IGRhdGFJdGVtLm5hbWU7XFxcXG4gICAgICAgIHJ1bGVDb2RlID0gXFxcXFxcXCLmtbfpmJTop4bnlYzmnKzlnLDmlofku7bliIbkuqvvv6VmaWxlX3VybO+/pWhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9cXFxcXFxcIiArIGZpbGVfcGF0aCArIFxcXFxcXFwiQFxcXFxcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyBhdXRoO1xcXFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcXFxuICAgICAgICBicmVha1xcXFxuICAgIGNhc2UgXFxcXFxcXCJjb25maWdcXFxcXFxcIjpcXFxcbiAgICAgICAgaW1wb3J0VXJsID0gJCgpLnJ1bGUocGFzc3dvcmQgPT4ge1xcXFxuICAgICAgICAgICAgZXZhbChmZXRjaChcXFxcXFxcImhpa2VyOi8vYXNzZXRzL2hvbWUuanNcXFxcXFxcIikpO1xcXFxuICAgICAgICAgICAgSGlrZXJIb21lLmxvYWQoXFxcXFxcXCJpbXBvcnRcXFxcXFxcIiwgcGFzc3dvcmQpO1xcXFxuICAgICAgICB9LCBiYWNrQ29kZSk7XFxcXG4gICAgICAgIGJyZWFrO1xcXFxufVxcXFxubGV0IG15X2NvbF90eXBlID0gXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIjtcXFxcbmlmIChpbXBvcnRVcmwpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLlr7zlhaXop4TliJlcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiBpbXBvcnRVcmwsXFxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcXFxuICAgIH0pO1xcXFxuICAgIGlmKGRhdGFJdGVtLmlzX2pzb25fbGlzdCYmL2hvbWVfcnVsZV91cmx8aHRtbC8udGVzdChkYXRhSXRlbS5kYXRhX3R5cGUpKXtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjogI2ZmNzAwMFxcXFxcXFwiPuWvvOWFpemBk+W+t+e7jzwvc3Bhbj4nLFxcXFxuICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRhdGFJdGVtLHN1YlVybCk9PntcXFxcbiAgICAgICAgICAgICAgICAvLyBsZXQgdGl0bGUgPSBcXFxcXFxcIkgtXFxcXFxcXCIrZGF0YUl0ZW0ubmFtZStcXFxcXFxcIi5cXFxcXFxcIitkYXRhSXRlbS5hdXRob3I7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gXFxcXFxcXCJKLVxcXFxcXFwiK2RhdGFJdGVtLm5hbWUuc3BsaXQoJy4nKVswXTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgc3ViT2JqID0ge1xcXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogc3ViVXJsLFxcXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBcXFxcXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9ydWxlQ2FjaGUvXFxcXFxcXCIrdGl0bGUrXFxcXFxcXCIuanNvblxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmU6IGZhbHNlLC8v56aB55So5bm25Y+R5pu05pawXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGxldCBzaGFyZVRleHQgPSBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoc3ViT2JqKSk7XFxcXG4gICAgICAgICAgICAgICAgdmFyIHBhc3RlcyA9IGdldFBhc3RlcygpO1xcXFxuICAgICAgICAgICAgICAgIHZhciB1cmwgPSBzaGFyZVBhc3RlKHNoYXJlVGV4dCxwYXN0ZXMuc2xpY2UoLTEpWzBdKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgaW1wb3J0X3J1bGU9IFxcXFxcXFwi6L275ZCI6ZuG6K6i6ZiF77yaXFxcXFxcXCIrdGl0bGUrJ1xcXFxcXFxcbicrdXJsO1xcXFxuICAgICAgICAgICAgICAgIGNvcHkoaW1wb3J0X3J1bGUpO1xcXFxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSAnaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL3J1bGVDYWNoZS9zdWIuanNvbic7XFxcXG4gICAgICAgICAgICAgICAgcmVxdWlyZShnZXRWYXIoJ3N1YuS+nei1licsJ2h0dHBzOi8vZ2l0Y29kZS5uZXQvcXFfMzIzOTQzNTEvZHIvLS9yYXcvbWFzdGVyL2pzL3N1YnNjcmliZS5qcycpKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4g6K6i6ZiF5a+85YWlKHBhdGgpXFxcXG4gICAgICAgICAgICB9LGRhdGFJdGVtLHN1YlVybCksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxufVxcXFxuaWYgKHJ1bGVDb2RlKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5YiG5Lqr6KeE5YiZXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJjb3B5Oi8vXFxcXFxcXCIgKyBydWxlQ29kZSxcXFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG4gICAgfSk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHNldFNldHRpbmdJdGVtKGJhc2ljLCBwYXR0ZXJuKSB7XFxcXG4gICAgbGV0IHRlbXAgPSB7XFxcXG4gICAgICAgIHRpdGxlOiBiYXNpYy50aXRsZSxcXFxcbiAgICAgICAgY29sX3R5cGU6IGJhc2ljLmNvbF90eXBlLFxcXFxuICAgICAgICB1cmw6ICQoYmFzaWMuY29uZmlybSkuY29uZmlybSgodXJsLCBtc2csIHBhdHRlcm4pID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBiYWNrQSA9IHJlcXVlc3QodXJsKTtcXFxcbiAgICAgICAgICAgIGxldCByZXQgPSBKU09OLnBhcnNlKGJhY2tBKTtcXFxcbiAgICAgICAgICAgIGlmIChyZXQuc3RhdHVzID09IDApIHtcXFxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuID8gYmFjaygpIDogcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyBtc2dbMF07XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHBhdHRlcm4gPyBiYWNrKCkgOiByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIG1zZ1sxXSArIFxcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXCIgKyByZXQuZGV0YWlsO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9LCBiYXNpYy51cmwsIGJhc2ljLm1zZywgcGF0dGVybilcXFxcbiAgICB9O1xcXFxuICAgIHJldHVybiB0ZW1wO1xcXFxufVxcXFxuaWYgKGRhdGFJdGVtLnN0YXRlID09ICdwcml2YXRlJykge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuiuvuS4uuWFrOW8gFxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXFxcXFwic2hhcmVcXFxcXFxcIikgKyByZXFCeUdldCArIFxcXFxcXFwiJmZsYWdcXFxcXFxcIiArIFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICAgICAgcmVxdWVzdChpbnB1dCk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+W3suiuvuS4uuWFrOW8gFxcXFxcXFwiO1xcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG4gICAgfSwge1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLpmo/mnLrlr4bpkqVcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlLFxcXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXFxcXFwiZ2VuQXV0aFxcXFxcXFwiKSArIHJlcUJ5R2V0ICsgXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgYmFjayA9IHJlcXVlc3QoaW5wdXQpO1xcXFxuICAgICAgICAgICAgbGV0IHJldCA9IEpTT04ucGFyc2UoYmFjayk7XFxcXG4gICAgICAgICAgICBpZiAocmV0LnN0YXR1cyA9PSAwKSB7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey55Sf5oiQ6ZqP5py65a+G56CBXFxcXFxcXFxuXFxcXFxcXCIgKyByZXQucmVzdWx0XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6ZqP5py65a+G56CB55Sf5oiQ5aSx6LSlXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSlcXFxcbiAgICB9KTtcXFxcbiAgICBsZXQgdGltZU92ZXIgPSB7XFxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcXFxuICAgIH07XFxcXG4gICAgaWYgKGRhdGFJdGVtLnRpbWVfb3Zlcikge1xcXFxuICAgICAgICB0aW1lT3Zlci50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXFxcXFwi55+t5pe25a+G6ZKlXFxcXFxcXCIsIFxcXFxcXFwiZ3JlZW5cXFxcXFxcIikgKyBjb2xvcihcXFxcXFxcIijihpLmsLjkuYUpXFxcXFxcXCIsIFxcXFxcXFwicmVkXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgdGltZU92ZXIudXJsID0gZ2V0QXBpKFxcXFxcXFwidGltZW92ZXJcXFxcXFxcIikgKyByZXFCeUdldCArIFxcXFxcXFwiJmZsYWc9MVxcXFxcXFwiO1xcXFxuICAgICAgICB0aW1lT3Zlci5jb25maXJtID0gXFxcXFxcXCLmmK/lkKbnoa7orqTku6XlkI7nmoTnp4Hol4/op4TliJnliIbkuqvkuI3ov4fmnJ8/XFxcXFxcXCI7XFxcXG4gICAgICAgIHRpbWVPdmVyLm1zZyA9IFtcXFxcXFxcIuW3suiuvuS4uuawuOS5hVxcXFxcXFwiLCBcXFxcXFxcIuiuvuS4uuawuOS5heWksei0pVxcXFxcXFwiXTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICB0aW1lT3Zlci50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXFxcXFwi5rC45LmF5a+G6ZKlXFxcXFxcXCIsIFxcXFxcXFwicmVkXFxcXFxcXCIpICsgY29sb3IoXFxcXFxcXCIo4oaS55+t5pe2KVxcXFxcXFwiLCBcXFxcXFxcImdyZWVuXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgdGltZU92ZXIudXJsID0gZ2V0QXBpKFxcXFxcXFwidGltZW92ZXJcXFxcXFxcIikgKyByZXFCeUdldDtcXFxcbiAgICAgICAgdGltZU92ZXIuY29uZmlybSA9IFxcXFxcXFwi56Gu6K6k6KaB5Lul5ZCO5YiG5Lqr55qE56eB6JeP6KeE5YiZ6Ieq5Yqo5Yiw5pyfP1xcXFxcXFwiO1xcXFxuICAgICAgICB0aW1lT3Zlci5tc2cgPSBbXFxcXFxcXCLlt7Lorr7kuLrov4fmnJ9cXFxcXFxcIiwgXFxcXFxcXCLorr7kuLrov4fmnJ/lpLHotKVcXFxcXFxcIl07XFxcXG4gICAgfVxcXFxuICAgIGRhdGEucHVzaChzZXRTZXR0aW5nSXRlbSh0aW1lT3ZlcikpO1xcXFxufSBlbHNlIGlmIChkYXRhSXRlbS5zdGF0ZSA9PSAncHVibGljJykge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuiuvuS4uuengeaciVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXFxcXFwic2hhcmVcXFxcXFxcIikgKyByZXFCeUdldCArIFxcXFxcXFwiJmZsYWc9MSNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgICAgICAgIHJlcXVlc3QoaW5wdXQpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7Lorr7kuLrnp4HmnIlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcXFxuICAgIH0pO1xcXFxufVxcXFxuZGF0YS5wdXNoKHNldFNldHRpbmdJdGVtKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLliKDpmaTmlbDmja5cXFxcXFxcIixcXFxcbiAgICBjb25maXJtOiBcXFxcXFxcIuaYr+WQpuehruiupOWIoOmZpFxcXFxcXFwiLFxcXFxuICAgIG1zZzogW1xcXFxcXFwi5bey5Yig6ZmkXFxcXFxcXCIsIFxcXFxcXFwi5Yig6Zmk5aSx6LSlXFxcXFxcXCJdLFxcXFxuICAgIHVybDogZ2V0QXBpKFxcXFxcXFwiZGVsZXRlVXJsXFxcXFxcXCIpICsgcmVxQnlHZXQsXFxcXG4gICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG59LCB0cnVlKSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuiuvue9ruWbvuagh1xcXFxcXFwiLFxcXFxuICAgIHVybDogJChkYXRhSXRlbS5waWNfdXJsLCBcXFxcXFxcIui+k+WFpeWbvuagh+WcsOWdgFxcXFxcXFwiKS5pbnB1dChhcGkgPT4ge1xcXFxuICAgICAgICBpZiAoaW5wdXQgPT09IFxcXFxcXFwiXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5L2g5Zyo6YCX5oiR6ZO+5o6l5ZOqP1xcXFxcXFwiXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoYXBpICsgXFxcXFxcXCImcnVsZV9waWM9XFxcXFxcXCIgKyBpbnB1dCk7XFxcXG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcXFxcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyByZXN1bHQuZGV0YWlsO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgfSwgZ2V0QXBpKFxcXFxcXFwic2V0X3J1bGVfcGljXFxcXFxcXCIpICsgZGF0YUl0ZW0uaWQgKyByZXFCeUdldCksXFxcXG4gICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG59KTtcXFxcblxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogZGF0YUl0ZW0uY2FuX2Rpc2N1c3MgPyBcXFxcXFxcIuemgeatouivhOiuulxcXFxcXFwiIDogXFxcXFxcXCLlvIDlkK/or4TorrpcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoYXBpLmRpc19zZXQgKyBkYXRhSXRlbS5pZCArIHJlcUJ5R2V0ICsgXFxcXFxcXCImc3RhdGU9XFxcXFxcXCIgKyAoZGF0YUl0ZW0uY2FuX2Rpc2N1c3MgPyBcXFxcXFxcIlxcXFxcXFwiIDogMSkpLmxhenlSdWxlKChjYW5fZGlzY3VzcykgPT4ge1xcXFxuICAgICAgICByZXF1ZXN0KGlucHV0KTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICByZXR1cm4gY2FuX2Rpc2N1c3MgPyBcXFxcXFxcInRvYXN0Oi8v5bey56aB5q2i6K+E6K66XFxcXFxcXCIgOiBcXFxcXFxcInRvYXN0Oi8v5bey5byA5ZCv6K+E6K66XFxcXFxcXCI7XFxcXG4gICAgfSwgZGF0YUl0ZW0uY2FuX2Rpc2N1c3MpLFxcXFxuICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcXFxufSk7XFxcXG5NWV9QQVJBTVMubmFtZSA9IGRhdGFJdGVtLm5hbWU7XFxcXG5NWV9QQVJBTVMudXNlcm5hbWU9dXNlcm5hbWU7XFxcXG5NWV9QQVJBTVMucGFzc3dvcmQ9cGFzc3dvcmQ7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuiuvue9ruWkh+azqFxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2Uvc2V0X3J1bGVfbm90ZXNcXFxcXFxcIixcXFxcbiAgICBleHRyYTogTVlfUEFSQU1TLFxcXFxuICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcXFxufSk7XFxcXG5pZiAoZGF0YUl0ZW0uaXNfanNvbiAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT09IFxcXFxcXFwiaG9tZV9ydWxlX3VybFxcXFxcXFwiICYmICFkYXRhSXRlbS5pc19qc29uX2xpc3QpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogJ+i/m+WFpemikemBkycsXFxcXG4gICAgICAgIHVybDogJCggLypcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIqLyApLmxhenlSdWxlKChuYW1lLGhvbWUpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChob21lKSk7XFxcXG4gICAgICAgICAgICBsZXQgaGFzUnVsZSA9IHJ1bGVMaXN0LnNvbWUoaXRlbSA9PiBpdGVtLnRpdGxlID09PSBuYW1lKTtcXFxcbiAgICAgICAgICAgIGlmIChoYXNSdWxlKSB7XFxcXG4gICAgICAgICAgICAgICAgcHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmJhY2tcXFxcXFxcIiwgXFxcXFxcXCIxXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gaG9tZStcXFxcXFxcInNAXFxcXFxcXCIgKyBuYW1lO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+acquWuieijhVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9LCBkYXRhSXRlbS5uYW1lLGFwaS5ob21lKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG4gICAgfSk7XFxcXG59XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBkYXRhSXRlbS5nb29kX251bSxcXFxcbiAgICBwaWNfdXJsOiBcXFxcXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/otZ4uc3ZnXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl9zbWFsbF8zXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBkYXRhSXRlbS5iYWRfbnVtLFxcXFxuICAgIHBpY191cmw6IFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+i4qS5zdmdcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uX3NtYWxsXzNcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi6K+E6K66XFxcXFxcXCIsXFxcXG4gICAgcGljX3VybDogXFxcXFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6K+E6K66LnN2Z1xcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fc21hbGxfM1xcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvUmVwbHkjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgcnVsZUlkOiBkYXRhSXRlbS5pZCxcXFxcbiAgICAgICAgbmFtZTogZGF0YUl0ZW0uYXV0aG9yLFxcXFxuICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXFxcXG4gICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZVxcXFxuICAgIH1cXFxcbn0pO1xcXFxubGV0IHRvdGFsU3VtID0gZGF0YUl0ZW0uZ29vZF9udW0gKyBkYXRhSXRlbS5iYWRfbnVtO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXFxcXFwiYmlnXFxcXFxcXCIsIFxcXFxcXFwi6K+E6K66KFxcXFxcXFwiICsgdG90YWxTdW0gKyBcXFxcXFxcIilcXFxcXFxcIikgKyBcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFwiICsgc21hbGwoaHRtbFRhZyhcXFxcXFxcInVcXFxcXFxcIiwgXFxcXFxcXCLmn6XnnIvlhajpg6jor4Torroo5o6n6K+EKSA+XFxcXFxcXCIpKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbW1lbnRcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eSNmeXBhZ2Ujbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXFxcbiAgICAgICAgdG90YWxTdW06IHRvdGFsU3VtLFxcXFxuICAgICAgICBub19hY3RpdmU6IHRydWUsXFxcXG4gICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcXFxcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkXFxcXG4gICAgfVxcXFxufSk7XFxcXG4vL2NvbnN0IGxvbmdlc3RTdW09MTIwO1xcXFxubGV0IGljb24gPSB7XFxcXG4gICAgXFxcXFxcXCJnb29kXFxcXFxcXCI6IFxcXFxcXFwi8J+RjVxcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiYmFkXFxcXFxcXCI6IFxcXFxcXFwi8J+RjlxcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwicmVwbHlcXFxcXFxcIjogXFxcXFxcXCLlvIDlj5HogIXwn5ejXFxcXFxcXCJcXFxcbn1cXFxcbmlmICh0b3RhbFN1bSA9PT0gMCkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuS4gOadoeivhOiuuuS5n+ayoeacie+8jOW/q+adpeaKouaymeWPkeWQp++8gTwvaDU+XFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59IGVsc2Uge1xcXFxuICAgIGxldCBjb21tZW50TGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuZGlzX2dldCArIGRhdGFJdGVtLmlkICsgXFxcXFxcXCI/bGltaXQ9NVxcXFxcXFwiKSkucmVzdWx0O1xcXFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY29tbWVudExpc3QpIHtcXFxcbiAgICAgICAgbGV0IFJlcGx5ID0gaXRlbS5kaXNjdXNzX3R5cGU9PT1cXFxcXFxcInJlcGx5XFxcXFxcXCImJml0ZW0ucmVwbHlfdG9fbmFtZSE9PWZhbHNlJiZpdGVtLnJlcGx5X3RvX2lkIT09ZmFsc2U/XFxcXFxcXCLigJjigJjlm57lpI1AXFxcXFxcXCIraXRlbS5yZXBseV90b19uYW1lK1xcXFxcXFwiICNcXFxcXFxcIitpdGVtLmRpc2N1c3NfaWQrXFxcXFxcXCLigJnigJlcXFxcXFxcXG5cXFxcXFxcIjpcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0ubmFtZSArIFxcXFxcXFwiJm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9J2dyYXknPjxzbWFsbD4jXFxcXFxcXCIgKyBpdGVtLmlkICsgXFxcXFxcXCI8L3NtYWxsPjxmb250PlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYXZhdGFyXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1JlcGx5XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYTp7XFxcXG4gICAgICAgICAgICAgICAgcnVsZUlkOiBkYXRhSXRlbS5pZCxcXFxcbiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxcXFxuICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcXFxcbiAgICAgICAgICAgICAgICByZXBseUlkOml0ZW0uaWRcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5kaXNjdXNzX3RleHQsXFxcXG4gICAgICAgICAgICBkZXNjOiBSZXBseStpdGVtLmNyZWF0ZV9kYXRlICsgXFxcXFxcXCLCt1xcXFxcXFwiICsgaWNvbltpdGVtLmRpc2N1c3NfdHlwZV0sXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgdHlwZTogXFxcXFxcXCJsb25nX3RleHRcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB0ZXh0OiBpdGVtLmRpc2N1c3NfdGV4dFxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG59XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcImljb25fMl9yb3VuZFxcXCIsXFxcIm5hbWVcXFwiOlxcXCLop4TliJnliJfooahcXFwiLFxcXCJwYXRoXFxcIjpcXFwicnVsZXNcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG4gICAgYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCQudG9TdHJpbmcoKCk9PntcXFxcbiAgICAgICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UuYmFja1xcXFxcXFwiKTtcXFxcbiAgICAgICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UuZmlsdGVyXFxcXFxcXCIpO1xcXFxuICAgICAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS50eXBlXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZihnZXRWYXIoJ1dhcmVob3VzZS5jYW5fdXBsb2FkJywnJykpe1xcXFxuICAgICAgICAgICAgbG9nKCfmk43kvZzov4fnpoHmraLkuIrkvKA6JytnZXRWYXIoJ1dhcmVob3VzZS5jYW5fdXBsb2FkJykpO1xcXFxuICAgICAgICAgICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UuY2FuX3VwbG9hZFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSkpO1xcXFxuXFxcXG5pZiAoZ2V0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmJhY2tcXFxcXFxcIikgPT09IFxcXFxcXFwiMVxcXFxcXFwiKSB7XFxcXG4gICAgYmFjayhmYWxzZSk7XFxcXG59XFxcXG5cXFxcbmNvbnN0IHtcXFxcbiAgICBnZXRBcGksXFxcXG4gICAgYXBpLFxcXFxuICAgIGNvbG9yLFxcXFxuICAgIHNtYWxsLFxcXFxuICAgIGxvY2FsUnVsZVZlcixcXFxcbiAgICBodG1sVGFnLFxcXFxuICAgIG1kXFxcXG59ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbmNvbnN0IHsgbWVyZ2VTb3J0IH0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2Uvc29ydFxcXFxcXFwiKTtcXFxcbmxldCB7XFxcXG4gICAgYXZhdGFyVXJsLFxcXFxuICAgIHFxLFxcXFxuICAgIGlkLFxcXFxuICAgIGNhbl91cGxvYWRcXFxcbn0gPSBNWV9QQVJBTVM7XFxcXG5sZXQgZGF0YVR5cGUgPSBnZXRWYXIoXFxcXFxcXCJXYXJlaG91c2UudHlwZVxcXFxcXFwiLFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxubGV0IGJhY2tDb2RlID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFxcXFxcInJ1bGVzVXJsXFxcXFxcXCIpICsgXFxcXFxcXCI/bmFtZT1cXFxcXFxcIiArIHFxK1xcXFxcXFwiJmRhdGFfdHlwZT1cXFxcXFxcIitkYXRhVHlwZSkpO1xcXFxubGV0IGRldk5hbWUgPSBiYWNrQ29kZS5kZXZfbmFtZTtcXFxcbnB1dFZhcihcXFxcXFxcIldhcmVob3VzZS5maWx0ZXJcXFxcXFxcIiwgZGV2TmFtZSk7XFxcXG5sZXQgcnVsZUxpc3QgPSBiYWNrQ29kZS5yZXN1bHQ7XFxcXG5sZXQgc3ViVXJsID0gZ2V0QXBpKFxcXFxcXFwianNvbkxpc3RcXFxcXFxcIikgKyBcXFxcXFxcIj9uYW1lPVxcXFxcXFwiICsgcXE7XFxcXG5sZXQgaGFzU3ViID0gaGFzSG9tZVN1YihzdWJVcmwpO1xcXFxubGV0IGRldkluZm8gPSBcXFxcXFxcIui/meS4quS6uuW+iOaHkizku4DkuYjpg73msqHlhpnlk6Z+XFxcXFxcXCI7XFxcXG5sZXQgdG1wSnNvbiA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcXFxcXCJpbmZvR2V0VXJsXFxcXFxcXCIpICsgcXEpKTtcXFxcbmlmICh0bXBKc29uLnN0YXR1cyA9PSAwKSB7XFxcXG4gICAgZGV2SW5mbyA9IHRtcEpzb24ucmVzdWx0IHx8IGRldkluZm87XFxcXG59XFxcXG5sZXQgc3ViRmxhZyA9IGhhc1N1YiA/ICfwn4aXJyA6ICfwn5OhJztcXFxcbmxldCBkYXRhID0gW107XFxcXG5yZXF1aXJlKG1kKTtcXFxcbmRldkluZm89bWFya2VkLnBhcnNlKGRldkluZm8pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIGRldk5hbWUgKyBcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFxcblxcXFxcXFwiICsgc21hbGwoaHRtbFRhZyhcXFxcXFxcInVcXFxcXFxcIiwgXFxcXFxcXCLngrnlh7vmn6XnnIvlrozmlbTlhazlkYpcXFxcXFxcIikpLFxcXFxuICAgIGRlc2M6IHNtYWxsKGRldkluZm8pLFxcXFxuICAgIHVybDogJ2hpa2VyOi8vcGFnZS9pbmZvJyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0ZXh0OiBkZXZJbmZvLFxcXFxuICAgICAgICBuYW1lOiBkZXZOYW1lLFxcXFxuICAgICAgICB0eXBlOlxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbiAgICB9LFxcXFxuICAgIHBpY191cmw6IGF2YXRhclVybCxcXFxcbiAgICBjb2xfdHlwZTogJ21vdmllXzFfdmVydGljYWxfcGljJ1xcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIjxiaWc+6K6i6ZiF566h55CGPC9iaWc+Jm5ic3A7Jm5ic3A7PHNtYWxsPijlvZPliY1cXFxcXFxcIiArIChoYXNTdWIgPyBcXFxcXFxcIuW3suiuoumYhVxcXFxcXFwiIDogXFxcXFxcXCLmnKrorqLpmIVcXFxcXFxcIikgKyBcXFxcXFxcIik8L3NtYWxsPlxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxubGV0IHN1Yl9jb2RlID0gJ+a1t+mYlOinhueVjOWQiOmbhuinhOWImeiuoumYhe+/pWhvbWVfc3Vi77+lJyArIGRldk5hbWUgKyBcXFxcXFxcIuWQiOmbhkBAXFxcXFxcXCIgKyBzdWJVcmw7XFxcXG5sZXQgcnVsZXNDb2RlID0gJ+a1t+mYlOinhueVjOWQiOmbhuinhOWIme+/pWhvbWVfcnVsZV91cmzvv6UnICsgc3ViVXJsO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICNmZjcwMDBcXFxcXFxcIj7kuIDplK7orqLpmIU8L3NwYW4+JyxcXFxcbiAgICBkZXNjOiAn6K6i6ZiF4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjogIzVjZmYyY1xcXFxcXFwiPicgKyBkZXZOYW1lICsgJzwvc3Bhbj7nmoTmiYDmnInljZXop4TliJnvvIzlkIjpm4bpnIDljZXni6zorqLpmIUnLFxcXFxuICAgIHVybDogc3ViX2NvZGUsXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzInXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiAjZmY3MDAwXFxcXFxcXCI+5a+85YWl5YWo6YOoPC9zcGFuPicsXFxcXG4gICAgdXJsOiBydWxlc0NvZGUsXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzInXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiAjZmY3MDAwXFxcXFxcXCI+5a+85YWl6L275ZCI6ZuGPC9zcGFuPicsXFxcXG4gICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRldk5hbWUsc3ViVXJsLGF2YXRhclVybCk9PntcXFxcbiAgICAgICAgY29uc3Qge2dlblJ1bGV9PSQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9nZW5BcGlcXFxcXFxcIik7XFxcXG4gICAgICAgIGxvZyhcXFxcXFxcIui9u+WQiOmbhuWbvuagh+mTvuaOpTpcXFxcXFxcIithdmF0YXJVcmwpO1xcXFxuICAgICAgICBsZXQgaW1wb3J0X3J1bGU9Z2VuUnVsZShcXFxcXFxcIui9u+WQiOmbhi5cXFxcXFxcIitkZXZOYW1lLHN1YlVybCxhdmF0YXJVcmwpO1xcXFxuICAgICAgICAvL2NvcHkoaW1wb3J0X3J1bGUpO1xcXFxuICAgICAgICBsZXQgcnVsZUNvZGU9cGFyc2VQYXN0ZShpbXBvcnRfcnVsZS5zcGxpdChcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFwiKVswXSk7XFxcXG4gICAgICAgIC8vcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxcXG4gICAgICAgIHJldHVybiBpbXBvcnRVcmxcXFxcbiAgICB9LGRldk5hbWUsc3ViVXJsLGF2YXRhclVybCksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzInXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiAjZmY3MDAwXFxcXFxcXCI+5a+85YWl6YGT5b6357uPPC9zcGFuPicsXFxcXG4gICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRldk5hbWUsc3ViVXJsLGF2YXRhclVybCk9PntcXFxcbiAgICAgICAgbGV0IHRpdGxlID0gXFxcXFxcXCJILVxcXFxcXFwiK2Rldk5hbWU7XFxcXG4gICAgICAgIGxldCBzdWJPYmogPSB7XFxcXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxcXG4gICAgICAgICAgICB1cmw6IHN1YlVybCxcXFxcbiAgICAgICAgICAgIGRlc2M6IFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL3J1bGVDYWNoZS9cXFxcXFxcIit0aXRsZStcXFxcXFxcIi5qc29uXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2RlOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSwvL+emgeeUqOW5tuWPkeabtOaWsFxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBzaGFyZVRleHQgPSBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoc3ViT2JqKSk7XFxcXG4gICAgICAgIHZhciBwYXN0ZXMgPSBnZXRQYXN0ZXMoKTtcXFxcbiAgICAgICAgdmFyIHVybCA9IHNoYXJlUGFzdGUoc2hhcmVUZXh0LHBhc3Rlcy5zbGljZSgtMSlbMF0pO1xcXFxuICAgICAgICBsZXQgaW1wb3J0X3J1bGU9IFxcXFxcXFwi6L275ZCI6ZuG6K6i6ZiF77yaXFxcXFxcXCIrdGl0bGUrJ1xcXFxcXFxcbicrdXJsO1xcXFxuICAgICAgICBjb3B5KGltcG9ydF9ydWxlKTtcXFxcbiAgICAgICAgY29uc3QgcGF0aCA9ICdoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvcnVsZUNhY2hlL3N1Yi5qc29uJztcXFxcbiAgICAgICAgcmVxdWlyZShnZXRWYXIoJ3N1YuS+nei1licsJ2h0dHBzOi8vZ2l0Y29kZS5uZXQvcXFfMzIzOTQzNTEvZHIvLS9yYXcvbWFzdGVyL2pzL3N1YnNjcmliZS5qcycpKTtcXFxcbiAgICAgICAgcmV0dXJuIOiuoumYheWvvOWFpShwYXRoKVxcXFxuICAgIH0sZGV2TmFtZSxzdWJVcmwsYXZhdGFyVXJsKSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMidcXFxcbn0pO1xcXFxubGV0IGNhbl91cGxvYWRfYXBpID0gZ2V0QXBpKFxcXFxcXFwibWFuQ2FuVXBsb2FkXFxcXFxcXCIpK2lkO1xcXFxuaWYoZ2V0VmFyKCdob3VzZS5pc19tYW5hZ2VyJykpe1xcXFxuICAgIGxldCB0aXBzID0gY2FuX3VwbG9hZD8n6IO9Jzon5ZCmJztcXFxcbiAgICAvLyBsb2coJ3RpcHM6Jyt0aXBzKTtcXFxcbiAgICAvLyBsb2coJ2Nhbl91cGxvYWQ6JytjYW5fdXBsb2FkKTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTon4pqg6IO95ZCm5LiK5LygOicrKGdldFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnKXx8dGlwcyksXFxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXFxcbiAgICAgICAgdXJsOidoaWtlcjovL2VtcHR5J1xcXFxuICAgIH0pO1xcXFxuICAgIGZ1bmN0aW9uIHNldFVwbG9hZChmbGFnLGNhbl91cGxvYWRfYXBpKSB7XFxcXG4gICAgICAgIGZsYWcgPSBmbGFnIHx8ICcnO1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IGNvZGUgPSBmZXRjaChjYW5fdXBsb2FkX2FwaSwge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjogTU9CSUxFX1VBfSxcXFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJ1c2VybmFtZVxcXFxcXFwiOiBnZXRWYXIoJ2hvdXNlLnVzZXJuYW1lJyksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiOiBnZXRWYXIoJ2hvdXNlLnBhc3N3b3JkJyksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJjYW5fdXBsb2FkXFxcXFxcXCI6ICEhZmxhZ1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgY29kZSA9IEpTT04ucGFyc2UoY29kZSkucmVzdWx0O1xcXFxuICAgICAgICAgICAgaWYgKGNvZGUuc3RhdHVzID09PSAwKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUuZGV0YWlsXFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBjb2RlLmRldGFpbFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgZS5tZXNzYWdlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6J/CfmqvnpoHmraLkuIrkvKAnLFxcXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxcXG4gICAgICAgIHVybDokKCfnpoHmraLor6XlvIDlj5HogIXkuIrkvKDop4TliJk/5L2g55qE5pON5L2c5bCG6KKr57O757uf6K6w5b2VJykuY29uZmlybSgoaWQsY2FuX3VwbG9hZF9hcGksc2V0VXBsb2FkKT0+e1xcXFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldFVwbG9hZChmYWxzZSxjYW5fdXBsb2FkX2FwaSk7XFxcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXFxcbiAgICAgICAgICAgICAgICBwdXRWYXIoJ1dhcmVob3VzZS5jYW5fdXBsb2FkJywn5ZCmJyk7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxcXG4gICAgICAgIH0saWQsY2FuX3VwbG9hZF9hcGksc2V0VXBsb2FkKVxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOifinIXlhYHorrjkuIrkvKAnLFxcXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxcXG4gICAgICAgIHVybDokKCflhYHorrjor6XlvIDlj5HogIXkuIrkvKDop4TliJk/5L2g55qE5pON5L2c5bCG6KKr57O757uf6K6w5b2VJykuY29uZmlybSgoaWQsY2FuX3VwbG9hZF9hcGksc2V0VXBsb2FkKT0+e1xcXFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldFVwbG9hZCh0cnVlLGNhbl91cGxvYWRfYXBpKTtcXFxcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcXFxuICAgICAgICAgICAgICAgIHB1dFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnLCfmmK8nKTtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXFxcbiAgICAgICAgfSxpZCxjYW5fdXBsb2FkX2FwaSxzZXRVcGxvYWQpXFxcXG4gICAgfSk7XFxcXG59XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIjxzbWFsbD7mj5DnpLrvvJrlvIDlj5HogIXljZXni6zliIbkuqvnmoTlkIjpm4bmlofku7blj6rog73ljZXni6zlr7zlhaXjgII8L3NtYWxsPlxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwiPGJpZz7op4TliJnliJfooag8L2JpZz4mbmJzcDsmbmJzcDs8c21hbGw+KOWFsVxcXFxcXFwiICsgcnVsZUxpc3QubGVuZ3RoICsgXFxcXFxcXCLmnaEpPC9zbWFsbD5cXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxufSk7XFxcXG5sZXQgZGF0YVR5cGVMaXN0ID0ge1xcXFxuICAgIFxcXFxcXFwiXFxcXFxcXCI6XFxcXFxcXCLlhajpg6hcXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImhvbWVfcnVsZV91cmxcXFxcXFxcIjogJ+Wwj+eoi+W6jycsXFxcXG4gICAgLy9cXFxcXFxcInB1Ymxpc2hcXFxcXFxcIjogJ+aPkOS6pOS6keS7k+W6k+inhOWImScsXFxcXG4gICAgXFxcXFxcXCJqc191cmxcXFxcXFxcIjogJ+e9kemhteaPkuS7ticsXFxcXG4gICAgXFxcXFxcXCJodG1sXFxcXFxcXCI6ICfpnZnmgIHpobXpnaInLFxcXFxuICAgIFxcXFxcXFwiY29uZmlnXFxcXFxcXCI6ICfkuLvpopgnXFxcXG59O1xcXFxuZm9yKGxldCBrZXkgaW4gZGF0YVR5cGVMaXN0KXtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTpkYXRhVHlwZT09PWtleT9cXFxcXFxcIuKAnOKAnFxcXFxcXFwiK2RhdGFUeXBlTGlzdFtrZXldK1xcXFxcXFwi4oCd4oCdXFxcXFxcXCI6ZGF0YVR5cGVMaXN0W2tleV0sXFxcXG4gICAgICAgIHVybDokKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGtleSk9PntcXFxcbiAgICAgICAgICAgIHB1dFZhcihcXFxcXFxcIldhcmVob3VzZS50eXBlXFxcXFxcXCIsa2V5KTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSxrZXkpLFxcXFxuICAgICAgICBjb2xfdHlwZTpcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufVxcXFxuaWYgKHJ1bGVMaXN0Lmxlbmd0aCA+IDIwKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5pCc57SiXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJC50b1N0cmluZyhuYW1lID0+IFxcXFxcXFwiaGlrZXI6Ly9zZWFyY2g/cz1cXFxcXFxcIiArIGlucHV0ICsgXFxcXFxcXCImcnVsZT1cXFxcXFxcIiArIG5hbWUsIE1ZX1JVTEUudGl0bGUpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICAgICAgICBkZXNjOiBcXFxcXFxcIuaQnOe0ouW9k+WJjeW8gOWPkeiAheeahOinhOWImVxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59XFxcXG5sZXQgaG9tZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmhvbWUpKTtcXFxcbmxldCBtUnVsZUxpc3QgPSBbXTtcXFxcbmZvciAodmFyIGl0ZW0gb2YgcnVsZUxpc3QpIHtcXFxcbiAgICB2YXIgbmFtZSA9IGl0ZW0ubmFtZTtcXFxcbiAgICBpZiAoaXRlbS5pc190YXApIHtcXFxcbiAgICAgICAgbGV0IGxvY2F0aW9uID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFxcXFxcInJ1bGVMaXN0SnNvblxcXFxcXFwiKSArIFxcXFxcXFwiP2lkPVxcXFxcXFwiICsgaXRlbS5pZCkpO1xcXFxuICAgICAgICBpdGVtLmlkID0gbG9jYXRpb24uaWQ7XFxcXG4gICAgICAgIGl0ZW0ubmFtZSA9IGxvY2F0aW9uLm5hbWU7XFxcXG4gICAgICAgIGl0ZW0uYXV0aG9yID0gbG9jYXRpb24uYXV0aG9yO1xcXFxuICAgICAgICBpdGVtLmRhdGFfdHlwZSA9IGxvY2F0aW9uLmRhdGFfdHlwZTtcXFxcbiAgICAgICAgaXRlbS52ZXIgPSBsb2NhdGlvbi52ZXJcXFxcbiAgICB9XFxcXG4gICAgaXRlbS52ZXJzaW9uID0gaXRlbS52ZXI7XFxcXG4gICAgbGV0IGxhYmVsID0gXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgbHZlciA9IC0yO1xcXFxuICAgIGlmIChpdGVtLmlzX2pzb24gJiYgaXRlbS5kYXRhX3R5cGUgPT09IFxcXFxcXFwiaG9tZV9ydWxlX3VybFxcXFxcXFwiKSB7XFxcXG4gICAgICAgIGx2ZXIgPSBsb2NhbFJ1bGVWZXIoaG9tZUxpc3QsIGl0ZW0pO1xcXFxuICAgICAgICBpZiAobHZlciA9PT0gLTEpIHtcXFxcbiAgICAgICAgICAgIGxhYmVsID0gXFxcXFxcXCLwn4aVXFxcXFxcXCI7XFxcXG4gICAgICAgIH0gZWxzZSBpZiAobHZlciA8IGl0ZW0udmVyKSB7XFxcXG4gICAgICAgICAgICBsYWJlbCA9IFxcXFxcXFwi8J+GmVxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIG1SdWxlTGlzdC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGxhYmVsICsgbmFtZSxcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9ydWxlRGV0YWlsI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgbHZlcjogbHZlcixcXFxcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkXFxcXG4gICAgICAgIH0sXFxcXG4gICAgICAgIHBpY191cmw6IGl0ZW0ucGljLFxcXFxuICAgIH0pO1xcXFxufVxcXFxuLyog5b2S5bm25o6S5bqPIFN0YXJ0ICovXFxcXG4vL21SdWxlTGlzdCA9IG1lcmdlU29ydChtUnVsZUxpc3QpO1xcXFxuLyog5b2S5bm25o6S5bqPIEVuZCAqL1xcXFxuZGF0YS5wdXNoLmFwcGx5KGRhdGEsIG1SdWxlTGlzdClcXFxcbnNldFJlc3VsdChkYXRhKTtcXFxcblxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuinhOWImeivpue7hi11c2VyXFxcIixcXFwicGF0aFxcXCI6XFxcInJ1bGVEZXRhaWxcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG4gICAgY29uc3Qge1xcXFxuICAgICAgICBnZXRBcGksXFxcXG4gICAgICAgIGNvbG9yLFxcXFxuICAgICAgICBzbWFsbCxcXFxcbiAgICAgICAgaHRtbFRhZyxcXFxcbiAgICAgICAgYXBpLFxcXFxuICAgICAgICBtZFxcXFxuICAgIH0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxubGV0IHtcXFxcbiAgICBpZCxcXFxcbiAgICBsdmVyLFxcXFxuICAgIGlzQWxsXFxcXG59ID0gTVlfUEFSQU1TO1xcXFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKChpc0FsbCkgPT4ge1xcXFxuICAgIGlmKCFpc0FsbCl7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICB9XFxcXG59LGlzQWxsKSk7XFxcXG5sZXQgZGF0YUl0ZW0gPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXFxcXFwiZ2V0YnlpZFxcXFxcXFwiKSArIFxcXFxcXFwiP2lkPVxcXFxcXFwiICsgaWQpKS5yZXN1bHQ7XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLjgIxcXFxcXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFxcXFxcIuOAjVxcXFxcXFwiKVxcXFxubGV0IHJ1bGVMaXN0SnNvbiA9IGdldEFwaShcXFxcXFxcInJ1bGVMaXN0SnNvblxcXFxcXFwiKSArIFxcXFxcXFwiP2lkPVxcXFxcXFwiO1xcXFxubGV0IGRhdGEgPSBbXTtcXFxcbnZhciBoYXNTdWIgPSBmYWxzZTtcXFxcblxcXFxuaWYgKGRhdGFJdGVtLmlzX2pzb25fbGlzdCkge1xcXFxuICAgIGhhc1N1YiA9IGhhc0hvbWVTdWIocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpO1xcXFxufSBlbHNlIGlmICghZGF0YUl0ZW0uaXNfanNvbl9saXN0ICYmIGRhdGFJdGVtLmRhdGFfdHlwZSA9PSAnaG9tZV9ydWxlX3VybCcpIHtcXFxcbiAgICBoYXNTdWIgPSBoYXNIb21lU3ViKHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgJyZkZWJ1Zz10cnVlJyk7XFxcXG59XFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcXFxcXCJiaWdcXFxcXFxcIiwgXFxcXFxcXCLniYjmnKxcXFxcXFxcIiksXFxcXG4gICAgZGVzYzogXFxcXFxcXCLigJzigJzigJ3igJ3lvIDlj5HogIXvvJpcXFxcXFxcIiArIGNvbG9yKGRhdGFJdGVtLmF1dGhvciwgXFxcXFxcXCIjMjI4QkU2XFxcXFxcXCIpICsgXFxcXFxcXCJcXFxcXFxcXG7kupHnq6/niYjmnKzvvJpcXFxcXFxcIiArIGNvbG9yKGRhdGFJdGVtLnZlciwgXFxcXFxcXCIjNWNmZjJjXFxcXFxcXCIpICsgXFxcXFxcXCJcXFxcXFxcXHRcXFxcXFxcXHTmnKzlnLDniYjmnKzvvJpcXFxcXFxcIiArIGNvbG9yKGx2ZXIsIFxcXFxcXFwiIzVjZmYyY1xcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFxu5pu05paw5LqOOiBbXFxcXFxcXCIgKyBjb2xvcihkYXRhSXRlbS5sYXN0X3VwZGF0ZSwgXFxcXFxcXCIjZmY3MDAwXFxcXFxcXCIpICsgXFxcXFxcXCJdXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiPOW8gOWPkeiAhT5cXFxcXFxcXG5cXFxcXFxcIiArIGRhdGFJdGVtLmF1dGhvciArIFxcXFxcXFwiXFxcXFxcXFxuPOWQjeensD5cXFxcXFxcXG5cXFxcXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFxcXFxcIlxcXFxcXFxcbjzkupHnq6/niYjmnKw+XFxcXFxcXFxuXFxcXFxcXCIgKyBkYXRhSXRlbS52ZXIgKyBcXFxcXFxcIlxcXFxcXFxcbjzmnKzlnLDniYjmnKw+XFxcXFxcXFxuXFxcXFxcXCIgKyBsdmVyICsgXFxcXFxcXCJcXFxcXFxcXG485pu05paw5pe26Ze0PlxcXFxcXFxcbltcXFxcXFxcIiArIGRhdGFJdGVtLmxhc3RfdXBkYXRlICsgXFxcXFxcXCJdXFxcXFxcXCIpLmNvbmZpcm0oKCkgPT4ge30pLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF8xJ1xcXFxufSk7XFxcXG5sZXQgZGF0YVR5cGUgPSB7XFxcXG4gICAgaG9tZV9ydWxlX3VybDogJ+mmlumhteS6keinhOWImScsXFxcXG4gICAgcHVibGlzaDogJ+aPkOS6pOS6keS7k+W6k+inhOWImScsXFxcXG4gICAganNfdXJsOiAn572R6aG15o+S5Lu26KeE5YiZJyxcXFxcbiAgICBodG1sOiAn6Z2Z5oCB6aG16Z2iJyxcXFxcbiAgICBjb25maWc6ICfkuLvpobXphY3nva4nXFxcXG59O1xcXFxuXFxcXG5sZXQgYmFzaWMgPSB7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxufTtcXFxcbmxldCBkYXRhVHlwZVRpcHMgPSBkYXRhVHlwZVtkYXRhSXRlbS5kYXRhX3R5cGVdIHx8ICfmnKrnn6Xop4TliJnvvJonICsgZGF0YUl0ZW0uZGF0YV90eXBlO1xcXFxuXFxcXG5sZXQgc2FmZV90aXA9ZGF0YUl0ZW0uaXNfc2FmZT9cXFxcXFxcIuWuieWFqFxcXFxcXFwiOlxcXFxcXFwi5Y2x6ZmpXFxcXFxcXCI7XFxcXG5sZXQgZ29vZF90aXAgPSBkYXRhSXRlbS5pc19nb29kP3NtYWxsKGNvbG9yKFxcXFxcXFwi44CQ5LyY6LSo6KeE5YiZ44CRXFxcXFxcXCIsJyNmZjcwMDAnKSk6XFxcXFxcXCJcXFxcXFxcIjtcXFxcbmxldCBub3Rfc2FmZV9ub3RlPWRhdGFJdGVtLm5vdF9zYWZlX25vdGU7XFxcXG5iYXNpYy50aXRsZSA9IGh0bWxUYWcoXFxcXFxcXCJiaWdcXFxcXFxcIiwgXFxcXFxcXCLnsbvlnotcXFxcXFxcIikgKyBcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFwiICsgc21hbGwoXFxcXFxcXCIoaWQ6XFxcXFxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXFxcXFwiKVxcXFxcXFwiKStcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFwiICsgc21hbGwoXFxcXFxcXCIo6aOO6Zmp5qOA5rWLOlxcXFxcXFwiICtzYWZlX3RpcCtcXFxcXFxcIilcXFxcXFxcIikrZ29vZF90aXA7XFxcXG5iYXNpYy5kZXNjID0gXFxcXFxcXCLmlbDmja7nsbvlnovvvJpcXFxcXFxcIiArIGNvbG9yKGRhdGFUeXBlVGlwcywgXFxcXFxcXCIjY2I1NGZmXFxcXFxcXCIpICsgXFxcXFxcXCJcXFxcXFxcXG7liIbkuqvnirbmgIHkuLrvvJpcXFxcXFxcIiArIGRhdGFJdGVtLnN0YXRlO1xcXFxuaWYgKFtcXFxcXFxcImh0bWxcXFxcXFxcIiwgXFxcXFxcXCJjb25maWdcXFxcXFxcIiwgXFxcXFxcXCJqc191cmxcXFxcXFxcIl0uaW5jbHVkZXMoZGF0YUl0ZW0uZGF0YV90eXBlKSkge1xcXFxuICAgIGJhc2ljLmRlc2MgKz0gXFxcXFxcXCJcXFxcXFxcXG7igJzigJzigJ3igJ0gPT5cXFxcXFxcIiArIHNtYWxsKFxcXFxcXFwi54K55q2k6aKE6KeIXFxcXFxcXCIpO1xcXFxuICAgIGJhc2ljLnVybCA9IHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkO1xcXFxufVxcXFxuXFxcXG5kYXRhLnB1c2goYmFzaWMpO1xcXFxubGV0IGhhc1N1YnMgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuaWYgKGhhc1N1Yikge1xcXFxuICAgIGhhc1N1YnMgPSBcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFwiICsgc21hbGwoXFxcXFxcXCLlt7LorqLpmIVcXFxcXFxcIilcXFxcbn1cXFxcblxcXFxubGV0IG5vdGVzID0gcmVxdWVzdChnZXRBcGkoXFxcXFxcXCJnZXRfcnVsZV9ub3RlXFxcXFxcXCIpICsgaWQpO1xcXFxubm90ZXMgPSBKU09OLnBhcnNlKG5vdGVzKS5yZXN1bHQ7XFxcXG5yZXF1aXJlKG1kKTtcXFxcbmxldCBub3Rlc0h0bWw9XFxcXFxcXCJcXFxcXFxcIlxcXFxudHJ5e1xcXFxuICAgIG5vdGVzSHRtbD1tYXJrZWQucGFyc2Uobm90ZXMpO1xcXFxufWNhdGNoKGUpe31cXFxcblxcXFxuaWYgKG5vdGVzICE9PSBmYWxzZSkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBodG1sVGFnKFxcXFxcXFwiYmlnXFxcXFxcXCIsIFxcXFxcXFwi5aSH5rOoXFxcXFxcXCIpICsgXFxcXFxcXCJcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcIiArIHNtYWxsKGh0bWxUYWcoXFxcXFxcXCJ1XFxcXFxcXCIsIFxcXFxcXFwi5p+l55yL5a6M5pW05YWs5ZGKID5cXFxcXFxcIikpLFxcXFxuICAgICAgICBkZXNjOiBub3RlcyxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgdGV4dDogbm90ZXNIdG1sLFxcXFxuICAgICAgICAgICAgbmFtZTogZGF0YUl0ZW0ubmFtZSxcXFxcbiAgICAgICAgICAgIC8vIHR5cGU6IFxcXFxcXFwibG9uZ190ZXh0XFxcXFxcXCJcXFxcbiAgICAgICAgICAgIHR5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxufVxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogaHRtbFRhZyhcXFxcXFxcImJpZ1xcXFxcXFwiLCBcXFxcXFxcIuaTjeS9nFxcXFxcXFwiKSArIGhhc1N1YnMsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcInRvYXN0Oi8v5L2g5omN5piv5pyA5biF55qE6YKj5Liq5Lq677yBXFxcXFxcXCJcXFxcbn0pO1xcXFxubGV0IGltcG9ydFVybCwgcnVsZUNvZGUsIHNoYXJlVXJsLCBiYWNrQ29kZSA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG5pZiAoIWRhdGFJdGVtLmlzX2pzb24pIHtcXFxcbiAgICBiYWNrQ29kZSA9IHJlcXVlc3QocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpO1xcXFxufVxcXFxuc3dpdGNoIChkYXRhSXRlbS5kYXRhX3R5cGUpIHtcXFxcbiAgICBjYXNlIFxcXFxcXFwiaG9tZV9ydWxlX3VybFxcXFxcXFwiOlxcXFxuICAgICAgICBydWxlQ29kZSA9IFxcXFxcXFwi5rW36ZiU6KeG55WM6aaW6aG16aKR6YGT6KeE5YiZ44CQXFxcXFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcXFxcXCLjgJHvv6Vob21lX3J1bGVfdXJs77+lXFxcXFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXFxcbiAgICAgICAgaW1wb3J0VXJsID0gXFxcXFxcXCJydWxlOi8vXFxcXFxcXCIgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpXFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgJ3B1Ymxpc2gnOlxcXFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJonICsgZGF0YUl0ZW0ubmFtZSArICfvv6VwdWJsaXNo77+lJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgJ2pzX3VybCc6XFxcXG4gICAgICAgIHJ1bGVDb2RlID0gJ+a1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8mue9kemhteaPkuS7tu+/pWpzX3VybO+/pScgKyBkYXRhSXRlbS5uYW1lICsgJ0BiYXNlNjQ6Ly8nICsgYmFzZTY0RW5jb2RlKGJhY2tDb2RlKTtcXFxcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXFxcbiAgICAgICAgYnJlYWs7XFxcXG4gICAgY2FzZSAnaHRtbCc6XFxcXG4gICAgICAgIGxldCBmaWxlX3RtcCA9IGRhdGFJdGVtLm5hbWUuc3BsaXQoJy4nKTtcXFxcbiAgICAgICAgbGV0IGZpbGVfcGF0aCA9IGZpbGVfdG1wLmxlbmd0aCA+IDEgPyBmaWxlX3RtcFtmaWxlX3RtcC5sZW5ndGggLSAxXSArIFxcXFxcXFwiL1xcXFxcXFwiICsgZGF0YUl0ZW0ubmFtZSA6IGRhdGFJdGVtLm5hbWU7XFxcXG4gICAgICAgIHJ1bGVDb2RlID0gXFxcXFxcXCLmtbfpmJTop4bnlYzmnKzlnLDmlofku7bliIbkuqvvv6VmaWxlX3VybO+/pWhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9cXFxcXFxcIiArIGZpbGVfcGF0aCArIFxcXFxcXFwiQFxcXFxcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxcXG4gICAgICAgIGJyZWFrXFxcXG4gICAgY2FzZSBcXFxcXFxcImNvbmZpZ1xcXFxcXFwiOlxcXFxuICAgICAgICBpbXBvcnRVcmwgPSAkKCkucnVsZShwYXNzd29yZCA9PiB7XFxcXG4gICAgICAgICAgICBldmFsKGZldGNoKFxcXFxcXFwiaGlrZXI6Ly9hc3NldHMvaG9tZS5qc1xcXFxcXFwiKSk7XFxcXG4gICAgICAgICAgICBIaWtlckhvbWUubG9hZChcXFxcXFxcImltcG9ydFxcXFxcXFwiLCBwYXNzd29yZCk7XFxcXG4gICAgICAgIH0sIGJhY2tDb2RlKTtcXFxcbiAgICAgICAgYnJlYWs7XFxcXG59XFxcXG5sZXQgbXlfY29sX3R5cGUgPSBcXFxcXFxcInRleHRfMlxcXFxcXFwiO1xcXFxubGV0IG15X2NvbF90eXBlMiA9IFxcXFxcXFwidGV4dF8zXFxcXFxcXCI7XFxcXG5pZiAoaW1wb3J0VXJsKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5a+85YWl6KeE5YiZXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogZGF0YUl0ZW0uaXNfc2FmZT9pbXBvcnRVcmw6J3RvYXN0Oi8v6aOO6Zmp6KeE5YiZ56aB5q2i5a+85YWlISEhJyxcXFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG4gICAgfSk7XFxcXG59XFxcXG5pZiAocnVsZUNvZGUpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLliIbkuqvlj6Pku6RcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImNvcHk6Ly9cXFxcXFxcIiArIHJ1bGVDb2RlLFxcXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxuaWYgKGltcG9ydFVybCkge1xcXFxuICAgIGlmIChkYXRhSXRlbS5pc19qc29uX2xpc3QgJiYgIWhhc1N1Yikge1xcXFxuICAgICAgICBsZXQgc3ViX3J1bGVfY29kZSA9ICfmtbfpmJTop4bnlYzlkIjpm4bop4TliJnorqLpmIXvv6Vob21lX3N1Yu+/pScgKyBkYXRhSXRlbS5uYW1lICsgXFxcXFxcXCJAQFxcXFxcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxcXG4gICAgICAgIGxldCBzdWJfdXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHN1Yl9ydWxlX2NvZGUpO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6ICforqLpmIXlkIjpm4YnLFxcXFxuICAgICAgICAgICAgdXJsOiBzdWJfdXJsLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlMlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjogI2ZmNzAwMFxcXFxcXFwiPuWvvOWFpei9u+WQiOmbhjwvc3Bhbj4nLFxcXFxuICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRhdGFJdGVtLHN1YlVybCk9PntcXFxcbiAgICAgICAgICAgICAgICBjb25zdCB7Z2VuUnVsZX09JC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2dlbkFwaVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgaW1wb3J0X3J1bGU9Z2VuUnVsZShkYXRhSXRlbS5uYW1lK1xcXFxcXFwiLlxcXFxcXFwiK2RhdGFJdGVtLmF1dGhvcixzdWJVcmwpO1xcXFxuICAgICAgICAgICAgICAgIC8vY29weShpbXBvcnRfcnVsZSk7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVDb2RlPXBhcnNlUGFzdGUoaW1wb3J0X3J1bGUuc3BsaXQoXFxcXFxcXCJcXFxcXFxcXG5cXFxcXFxcIilbMF0pO1xcXFxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gaW1wb3J0VXJsXFxcXG4gICAgICAgICAgICB9LGRhdGFJdGVtLHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZTJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICNmZjcwMDBcXFxcXFxcIj7lr7zlhaXpgZPlvrfnu488L3NwYW4+JyxcXFxcbiAgICAgICAgICAgIHVybDogJCgpLmxhenlSdWxlKChkYXRhSXRlbSxzdWJVcmwpPT57XFxcXG4gICAgICAgICAgICAgICAgLy8gbGV0IHRpdGxlID0gXFxcXFxcXCJILVxcXFxcXFwiK2RhdGFJdGVtLm5hbWUrXFxcXFxcXCIuXFxcXFxcXCIrZGF0YUl0ZW0uYXV0aG9yO1xcXFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IFxcXFxcXFwiSi1cXFxcXFxcIitkYXRhSXRlbS5uYW1lLnNwbGl0KCcuJylbMF07XFxcXG4gICAgICAgICAgICAgICAgbGV0IHN1Yk9iaiA9IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHN1YlVybCxcXFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcXFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvcnVsZUNhY2hlL1xcXFxcXFwiK3RpdGxlK1xcXFxcXFwiLmpzb25cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSwvL+emgeeUqOW5tuWPkeabtOaWsFxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBsZXQgc2hhcmVUZXh0ID0gYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHN1Yk9iaikpO1xcXFxuICAgICAgICAgICAgICAgIHZhciBwYXN0ZXMgPSBnZXRQYXN0ZXMoKTtcXFxcbiAgICAgICAgICAgICAgICB2YXIgdXJsID0gc2hhcmVQYXN0ZShzaGFyZVRleHQscGFzdGVzLnNsaWNlKC0xKVswXSk7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGltcG9ydF9ydWxlPSBcXFxcXFxcIui9u+WQiOmbhuiuoumYhe+8mlxcXFxcXFwiK3RpdGxlKydcXFxcXFxcXG4nK3VybDtcXFxcbiAgICAgICAgICAgICAgICBjb3B5KGltcG9ydF9ydWxlKTtcXFxcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gJ2hpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9ydWxlQ2FjaGUvc3ViLmpzb24nO1xcXFxuICAgICAgICAgICAgICAgIHJlcXVpcmUoZ2V0VmFyKCdzdWLkvp3otZYnLCdodHRwczovL2dpdGNvZGUubmV0L3FxXzMyMzk0MzUxL2RyLy0vcmF3L21hc3Rlci9qcy9zdWJzY3JpYmUuanMnKSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIOiuoumYheWvvOWFpShwYXRoKVxcXFxuICAgICAgICAgICAgfSxkYXRhSXRlbSxydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGUyXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwiPHNtYWxsPuaPkOekuu+8muW8gOWPkeiAheWNleeLrOWIhuS6q+eahOWQiOmbhuaWh+S7tuWPquiDveWNleeLrOWvvOWFpeOAgjwvc21hbGw+XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9IGVsc2UgaWYgKCFkYXRhSXRlbS5pc19qc29uX2xpc3QgJiYgIWhhc1N1YiAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT0gJ2hvbWVfcnVsZV91cmwnKSB7XFxcXG4gICAgICAgIGxldCBzdWJfcnVsZV9jb2RlID0gJ+a1t+mYlOinhueVjOWNleinhOWImeiuoumYhe+/pWhvbWVfc3Vi77+lJyArIGRhdGFJdGVtLm5hbWUgKyBcXFxcXFxcIkBAXFxcXFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArICcmZGVidWc9dHJ1ZSc7XFxcXG4gICAgICAgIGxldCBzdWJfdXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHN1Yl9ydWxlX2NvZGUpO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6ICforqLpmIXop4TliJknLFxcXFxuICAgICAgICAgICAgdXJsOiBzdWJfdXJsLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG4gICAgICAgIH0pXFxcXG4gICAgfVxcXFxufVxcXFxuaWYgKGRhdGFJdGVtLmlzX2pzb24gJiYgZGF0YUl0ZW0uZGF0YV90eXBlID09PSBcXFxcXFxcImhvbWVfcnVsZV91cmxcXFxcXFxcIiAmJiAhZGF0YUl0ZW0uaXNfanNvbl9saXN0KSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6ICfov5vlhaXpopHpgZMnLFxcXFxuICAgICAgICB1cmw6ICQoIC8qXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKi8gKS5sYXp5UnVsZSgobmFtZSxob21lKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoaG9tZSkpO1xcXFxuICAgICAgICAgICAgbGV0IGhhc1J1bGUgPSBydWxlTGlzdC5zb21lKGl0ZW0gPT4gaXRlbS50aXRsZSA9PT0gbmFtZSk7XFxcXG4gICAgICAgICAgICBpZiAoaGFzUnVsZSkge1xcXFxuICAgICAgICAgICAgICAgIHB1dFZhcihcXFxcXFxcIldhcmVob3VzZS5iYWNrXFxcXFxcXCIsIFxcXFxcXFwiMVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvbWUrXFxcXFxcXCJzQFxcXFxcXFwiICsgbmFtZTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mnKrlronoo4VcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSwgZGF0YUl0ZW0ubmFtZSxhcGkuaG9tZSksXFxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcXFxuICAgIH0pXFxcXG59XFxcXG5sZXQgbWFuX3J1bGVfc2FmZSA9IGdldEFwaShcXFxcXFxcIm1hblJ1bGVTYWZlXFxcXFxcXCIpK2RhdGFJdGVtLmlkO1xcXFxubGV0IG1hbl9ydWxlX2dvb2QgPSBnZXRBcGkoXFxcXFxcXCJtYW5SdWxlR29vZFxcXFxcXFwiKStkYXRhSXRlbS5pZDtcXFxcbi8vIGRhdGFJdGVtLmlzX3NhZmU7XFxcXG5pZihnZXRWYXIoJ2hvdXNlLmlzX21hbmFnZXInKSl7XFxcXG4gICAgZnVuY3Rpb24gc2V0SXNTYWZlKGZsYWcsbWFuX3J1bGVfc2FmZSkge1xcXFxuICAgICAgICBmbGFnID0gZmxhZyB8fCAnJztcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCBjb2RlID0gZmV0Y2gobWFuX3J1bGVfc2FmZSwge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjogTU9CSUxFX1VBfSxcXFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJ1c2VybmFtZVxcXFxcXFwiOiBnZXRWYXIoJ2hvdXNlLnVzZXJuYW1lJyksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiOiBnZXRWYXIoJ2hvdXNlLnBhc3N3b3JkJyksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJpc19zYWZlXFxcXFxcXCI6ICEhZmxhZ1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgY29kZSA9IEpTT04ucGFyc2UoY29kZSkucmVzdWx0O1xcXFxuICAgICAgICAgICAgaWYgKGNvZGUuc3RhdHVzID09PSAwKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUuZGV0YWlsXFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBjb2RlLmRldGFpbFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgZS5tZXNzYWdlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgZnVuY3Rpb24gc2V0SXNHb29kKGZsYWcsbWFuX3J1bGVfZ29vZCkge1xcXFxuICAgICAgICBmbGFnID0gZmxhZyB8fCAnJztcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCBjb2RlID0gZmV0Y2gobWFuX3J1bGVfZ29vZCwge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjogTU9CSUxFX1VBfSxcXFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJ1c2VybmFtZVxcXFxcXFwiOiBnZXRWYXIoJ2hvdXNlLnVzZXJuYW1lJyksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiOiBnZXRWYXIoJ2hvdXNlLnBhc3N3b3JkJyksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJpc19nb29kXFxcXFxcXCI6ICEhZmxhZ1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgY29kZSA9IEpTT04ucGFyc2UoY29kZSkucmVzdWx0O1xcXFxuICAgICAgICAgICAgaWYgKGNvZGUuc3RhdHVzID09PSAwKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUuZGV0YWlsXFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBjb2RlLmRldGFpbFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgZS5tZXNzYWdlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6J/Cfmqvpo47pmaknLFxcXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxcXG4gICAgICAgIHVybDokKCfmoIforrDor6Xop4TliJnkuLrpo47pmak/6aOO6Zmp6KeE5YiZ5peg5rOV6KKr5a+85YWlJykuY29uZmlybSgoaWQsbWFuX3J1bGVfc2FmZSxzZXRJc1NhZmUpPT57XFxcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNTYWZlKGZhbHNlLG1hbl9ydWxlX3NhZmUpO1xcXFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxcXG4gICAgICAgIH0sZGF0YUl0ZW0uaWQsbWFuX3J1bGVfc2FmZSxzZXRJc1NhZmUpXFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6J+Kcheato+W4uCcsXFxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uuato+W4uD8nKS5jb25maXJtKChpZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSk9PntcXFxcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc1NhZmUodHJ1ZSxtYW5fcnVsZV9zYWZlKTtcXFxcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcXFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKVxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOifimaXpnZ7kvJjotKgnLFxcXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxcXG4gICAgICAgIHVybDokKCfmoIforrDor6Xop4TliJnkuLrpnZ7kvJjotKg/JykuY29uZmlybSgoaWQsbWFuX3J1bGVfZ29vZCxzZXRJc0dvb2QpPT57XFxcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNHb29kKGZhbHNlLG1hbl9ydWxlX2dvb2QpO1xcXFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxcXG4gICAgICAgIH0sZGF0YUl0ZW0uaWQsbWFuX3J1bGVfZ29vZCxzZXRJc0dvb2QpXFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6J/CfkpbkvJjotKgnLFxcXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxcXG4gICAgICAgIHVybDokKCfmoIforrDor6Xop4TliJnkuLrkvJjotKg/JykuY29uZmlybSgoaWQsbWFuX3J1bGVfZ29vZCxzZXRJc0dvb2QpPT57XFxcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNHb29kKHRydWUsbWFuX3J1bGVfZ29vZCk7XFxcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9nb29kLHNldElzR29vZClcXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogZGF0YUl0ZW0uZ29vZF9udW0sXFxcXG4gICAgcGljX3VybDogXFxcXFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6LWeLnN2Z1xcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fc21hbGxfM1xcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvTWFrZUFjb21tZW50I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXFxcbiAgICAgICAgbmFtZTogZGF0YUl0ZW0ubmFtZVxcXFxuICAgIH1cXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogZGF0YUl0ZW0uYmFkX251bSxcXFxcbiAgICBwaWNfdXJsOiBcXFxcXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/ouKkuc3ZnXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl9zbWFsbF8zXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9NYWtlQWNvbW1lbnQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgaWQ6IGRhdGFJdGVtLmlkLFxcXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lLFxcXFxuICAgICAgICBkZWZhdWx0VHlwZTpcXFxcXFxcImJhZFxcXFxcXFwiXFxcXG4gICAgfVxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuivhOiuulxcXFxcXFwiLFxcXFxuICAgIHBpY191cmw6IFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+ivhOiuui5zdmdcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uX3NtYWxsXzNcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL01ha2VBY29tbWVudCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxcXG4gICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWVcXFxcbiAgICB9XFxcXG59KTtcXFxcbmxldCB0b3RhbFN1bSA9IGRhdGFJdGVtLmdvb2RfbnVtICsgZGF0YUl0ZW0uYmFkX251bTtcXFxcblxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogaHRtbFRhZyhcXFxcXFxcImJpZ1xcXFxcXFwiLCBcXFxcXFxcIuivhOiuuihcXFxcXFxcIiArIHRvdGFsU3VtICsgXFxcXFxcXCIpXFxcXFxcXCIpICsgXFxcXFxcXCJcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcIiArIHNtYWxsKGh0bWxUYWcoXFxcXFxcXCJ1XFxcXFxcXCIsIFxcXFxcXFwi5p+l55yL5YWo6YOo6K+E6K66ID5cXFxcXFxcIikpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29tbWVudFxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5I2Z5cGFnZSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICAgICAgaWQ6IGRhdGFJdGVtLmlkLFxcXFxuICAgICAgICB0b3RhbFN1bTogdG90YWxTdW0sXFxcXG4gICAgICAgIG5vX2FjdGl2ZTogZmFsc2VcXFxcbiAgICB9XFxcXG59KTtcXFxcbi8vY29uc3QgbG9uZ2VzdFN1bT0xMjA7XFxcXG5sZXQgaWNvbiA9IHtcXFxcbiAgICBcXFxcXFxcImdvb2RcXFxcXFxcIjogXFxcXFxcXCLwn5GNXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJiYWRcXFxcXFxcIjogXFxcXFxcXCLwn5GOXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJyZXBseVxcXFxcXFwiOlxcXFxcXFwi5byA5Y+R6ICF8J+Xo1xcXFxcXFwiXFxcXG59XFxcXG5pZiAodG90YWxTdW0gPT09IDApIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCI8aDUgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz7kuIDmnaHor4TorrrkuZ/msqHmnInvvIzlv6vmnaXmiqLmspnlj5HlkKfvvIE8L2g1PlxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufSBlbHNlIHtcXFxcbiAgICBsZXQgY29tbWVudExpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmRpc19nZXQgKyBkYXRhSXRlbS5pZCArIFxcXFxcXFwiP2xpbWl0PTVcXFxcXFxcIikpLnJlc3VsdDtcXFxcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNvbW1lbnRMaXN0KSB7XFxcXG4gICAgICAgIGxldCBSZXBseSA9IGl0ZW0uZGlzY3Vzc190eXBlPT09XFxcXFxcXCJyZXBseVxcXFxcXFwiJiZpdGVtLnJlcGx5X3RvX25hbWUhPT1mYWxzZSYmaXRlbS5yZXBseV90b19pZCE9PWZhbHNlP1xcXFxcXFwi4oCY4oCY5Zue5aSNQFxcXFxcXFwiK2l0ZW0ucmVwbHlfdG9fbmFtZStcXFxcXFxcIiAjXFxcXFxcXCIraXRlbS5kaXNjdXNzX2lkK1xcXFxcXFwi4oCZ4oCZXFxcXFxcXFxuXFxcXFxcXCI6XFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLm5hbWUgKyBcXFxcXFxcIiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSdncmF5Jz48c21hbGw+I1xcXFxcXFwiICsgaXRlbS5pZCArIFxcXFxcXFwiPC9zbWFsbD48Zm9udD5cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImF2YXRhclxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgLy91cmw6IFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIGl0ZW0ucXEsXFxcXG4gICAgICAgICAgICB1cmw6XFxcXFxcXCJtcXF3cGE6Ly9pbS9jaGF0P2NoYXRfdHlwZT13cGEmdWluPVxcXFxcXFwiK2l0ZW0ucXEsXFxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5kaXNjdXNzX3RleHQsXFxcXG4gICAgICAgICAgICBkZXNjOiBSZXBseStpdGVtLmNyZWF0ZV9kYXRlICsgXFxcXFxcXCLCt1xcXFxcXFwiICsgaWNvbltpdGVtLmRpc2N1c3NfdHlwZV0sXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6e1xcXFxuICAgICAgICAgICAgICAgIG5hbWU6aXRlbS5uYW1lLFxcXFxuICAgICAgICAgICAgICAgIHR5cGU6XFxcXFxcXCJsb25nX3RleHRcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB0ZXh0Oml0ZW0uZGlzY3Vzc190ZXh0XFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxuc2V0UmVzdWx0KGRhdGEpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJyaWNoX3RleHRcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5p+l55yLXFxcIixcXFwicGF0aFxcXCI6XFxcImluZm9cXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLmn6XnnIvjgIxcXFxcXFxcIitNWV9QQVJBTVMubmFtZStcXFxcXFxcIuOAjVxcXFxcXFwiKVxcXFxuc2V0UmVzdWx0KFt7XFxcXG4gICAgdGl0bGU6IE1ZX1BBUkFNUy50ZXh0LFxcXFxuICAgIGNvbF90eXBlOk1ZX1BBUkFNUy50eXBlXFxcXG59XSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5byA5Y+R6ICF5rOo5YaMXFxcIixcXFwicGF0aFxcXCI6XFxcIlJlZ2lzdGVyXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi5byA5Y+R6ICF5rOo5YaMXFxcXFxcXCIpO1xcXFxuY29uc3Qge1xcXFxuICAgIGdldEFwaSxcXFxcbiAgICBodG1sVGFnLFxcXFxuICAgIG1hcENvbFR5cGUsXFxcXG4gICAgc21hbGxcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxudmFyIGRhdGEgPSBbXTtcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UuUGFzc3dvcmRcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UuVXNlcm5hbWVcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UuRGVzY3JpcHRpb25cXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UuVXNlckFkZHJlc3NcXFxcXFxcIik7XFxcXG59KSk7XFxcXG5hZGRMaXN0ZW5lcignb25SZWZyZXNoJywgJC50b1N0cmluZygoKT0+e1xcXFxuICAgIHB1dFZhcihcXFxcXFxcIldhcmVob3VzZS5XYWl0XFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxufSkpO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+i0puWPtycsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLor7fovpPlhaXotKblj7co5b+F5aGrKVxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UuVXNlcm5hbWUnLCAnJyksXFxcXG4gICAgICAgIHR5cGU6IFxcXFxcXFwibnVtYmVyXFxcXFxcXCIsXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLlVzZXJuYW1lXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0sIHtcXFxcbiAgICB0aXRsZTogJ+WvhueggScsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLor7fovpPlhaXlr4bnoIEo5b+F5aGrKVxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UuUGFzc3dvcmQnLCAnJyksXFxcXG4gICAgICAgIHR5cGU6IFxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIixcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuUGFzc3dvcmRcXFxcXFxcIixpbnB1dCknXFxcXG4gICAgfVxcXFxufSk7XFxcXG5tYXBDb2xUeXBlKGRhdGEsIFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiLCAxKTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfmmLXnp7AnLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi6K+36L6T5YWl5pi156ewKOW/heWhqylcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLlVzZXJBZGRyZXNzJywgJycpLFxcXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZS5Vc2VyQWRkcmVzc1xcXFxcXFwiLGlucHV0KSdcXFxcbiAgICB9XFxcXG59LCB7XFxcXG4gICAgdGl0bGU6ICfmj4/ov7AnLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi6K+06K+05Li65LuA5LmI6KaB5rOo5YaM5ZCnXFxcXFxcXFxuKOWPr+S7peWinuWKoOmAmui/h+amgueOhyzpgInloaspXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5EZXNjcmlwdGlvbicsICcnKSxcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJ0ZXh0YXJlYVxcXFxcXFwiLFxcXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZS5EZXNjcmlwdGlvblxcXFxcXFwiLGlucHV0KSdcXFxcbiAgICB9XFxcXG59KVxcXFxuXFxcXG5tYXBDb2xUeXBlKGRhdGEsIFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiLCAxKTtcXFxcblxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogaHRtbFRhZyhcXFxcXFxcImJcXFxcXFxcIiwgXFxcXFxcXCLms6jlhoxcXFxcXFxcIiksXFxcXG4gICAgdXJsOiAkKGdldEFwaShcXFxcXFxcIm5ld19kZXZcXFxcXFxcIikrXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoZ2V0SWQsIGNvbmZpcm0pID0+IHtcXFxcbiAgICAgICAgbGV0IHVzZXJuYW1lID0gZ2V0VmFyKCdXYXJlaG91c2UuVXNlcm5hbWUnLCBcXFxcXFxcIlxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgIHBhc3N3b3JkID0gZ2V0VmFyKCdXYXJlaG91c2UuUGFzc3dvcmQnLCBcXFxcXFxcIlxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZ2V0VmFyKCdXYXJlaG91c2UuRGVzY3JpcHRpb24nLCBcXFxcXFxcIlxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgIG5hbWUgPSBnZXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuVXNlckFkZHJlc3NcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgIGlmIChbdXNlcm5hbWUsIHBhc3N3b3JkLCBuYW1lXS5pbmNsdWRlcyhcXFxcXFxcIlxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/otKblj7cs5a+G56CB5ZKM5pi156ew5LiN6IO95Li656m6XFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgc2hvd0xvYWRpbmcoXFxcXFxcXCLmraPlnKjmj5DkuqTnlLPor7fooahcXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0LCB7XFxcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcInBhcmFtc1xcXFxcXFwiOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicmVhc29uXFxcXFxcXCI6IGRlc2NyaXB0aW9uLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogbmFtZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiOiBwYXNzd29yZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJxcVxcXFxcXFwiOiB1c2VybmFtZVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgbWV0aG9kOiAncG9zdCdcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxcXG4gICAgICAgIGhpZGVMb2FkaW5nKCk7XFxcXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgcmVzdWx0LmRldGFpbDtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgaWRyZXN1bHQgPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0SWQgKyBcXFxcXFxcIj9xcT1cXFxcXFxcIiArIHVzZXJuYW1lKSk7XFxcXG4gICAgICAgIGlmIChpZHJlc3VsdC5zdGF0dXMgIT09IDApIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyBpZHJlc3VsdC5kZXRhaWw7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgXFxcXG4gICAgICAgIHJldHVybiAkKFxcXFxcXFwiXFxcXFxcXCIsIFxcXFxcXFwi6L6T5YWl6YKu566x6aqM6K+B56CBXFxcXFxcXFxuXFxcXFxcXCIgKyByZXN1bHQuZGV0YWlsKS5pbnB1dCgoY29uZmlybSwgaWQsIGFjY291bnQpID0+IHtcXFxcbiAgICAgICAgICAgIHNob3dMb2FkaW5nKFxcXFxcXFwi6K+36ICQ5b+D562J5b6FXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChjb25maXJtLCB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXFxcbiAgICAgICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicmVnaXN0X2lkXFxcXFxcXCI6IGlkLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwieXptXFxcXFxcXCI6IGlucHV0XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxcXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlVXNlcm5hbWVcXFxcXFxcIiwgYWNjb3VudFswXSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHB1dFZhcihcXFxcXFxcIldhcmVob3VzZVBhc3N3b3JkXFxcXFxcXCIsIGFjY291bnRbMV0pO1xcXFxuICAgICAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcXFxuICAgICAgICAgICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5oiQ5Yqf5o+Q5Lqk5rOo5YaM5rOo5YaMXFxcXFxcXFxuXFxcXFxcXCIrcmVzdWx0LmRldGFpbDtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WHuumUmeS6huWRkFxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9LCBjb25maXJtLCBpZHJlc3VsdC5yZXN1bHQsIFt1c2VybmFtZSwgcGFzc3dvcmRdKTtcXFxcbiAgICB9LCBnZXRBcGkoXFxcXFxcXCJuZXdfZ2V0SWRcXFxcXFxcIiksIGdldEFwaShcXFxcXFxcIm5ld19jb25maXJtXFxcXFxcXCIpKSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxcXG59KTtcXFxcbnNldFJlc3VsdChkYXRhKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwidGV4dF8xXFxcIixcXFwibmFtZVxcXCI6XFxcIuS4quS6uui1hOaWmVxcXCIsXFxcInBhdGhcXFwiOlxcXCJQZXJzb25hbERhdGFcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLkuKrkurrotYTmlplcXFxcXFxcIik7XFxcXG52YXIgZGF0YT1bXTtcXFxcbmNvbnN0IHtcXFxcbiAgICBnZXRBcGksXFxcXG4gICAgZ2V0RmlsZSxcXFxcbiAgICBhcGlcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxubGV0IHt1c2VybmFtZSxwYXNzd29yZH0gPSBnZXRGaWxlKCk7XFxcXG5sZXQgZGV2ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFxcXFxcInVzZXJcXFxcXFxcIikrTVlfUEFSQU1TLmlkKSkucmVzdWx0O1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTpcXFxcXFxcIuWktOWDj1xcXFxcXFwiLFxcXFxuICAgIGRlc2M6ZGV2LmF2YXRhcixcXFxcbiAgICB1cmw6XFxcXFxcXCJoaWtlcjovL3BhZ2UvbW9kaWZ5X1BlcnNvbmFsRGF0YSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICBleHRyYTp7XFxcXG4gICAgICAgIGRldjpkZXYsXFxcXG4gICAgICAgIHVzZXJuYW1lOnVzZXJuYW1lLFxcXFxuICAgICAgICBwYXNzd29yZDpwYXNzd29yZCxcXFxcbiAgICAgICAgUGF0dGVybjowXFxcXG4gICAgfSxcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOlxcXFxcXFwi5pi156ewXFxcXFxcXCIsXFxcXG4gICAgZGVzYzpkZXYubmFtZSxcXFxcbiAgICB1cmw6XFxcXFxcXCJoaWtlcjovL3BhZ2UvbW9kaWZ5X1BlcnNvbmFsRGF0YSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICBleHRyYTp7XFxcXG4gICAgICAgIGRldjpkZXYsXFxcXG4gICAgICAgIHVzZXJuYW1lOnVzZXJuYW1lLFxcXFxuICAgICAgICBwYXNzd29yZDpwYXNzd29yZCxcXFxcbiAgICAgICAgUGF0dGVybjoxXFxcXG4gICAgfSxcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTpcXFxcXFxcIuWvhueggVxcXFxcXFwiLFxcXFxuICAgIHVybDpcXFxcXFxcImhpa2VyOi8vcGFnZS9tb2RpZnlfUGVyc29uYWxEYXRhI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgIGV4dHJhOntcXFxcbiAgICAgICAgZGV2OmRldixcXFxcbiAgICAgICAgdXNlcm5hbWU6dXNlcm5hbWUsXFxcXG4gICAgICAgIHBhc3N3b3JkOnBhc3N3b3JkLFxcXFxuICAgICAgICBQYXR0ZXJuOjJcXFxcbiAgICB9LFxcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOlxcXFxcXFwi6LSm5Y+377yaXFxcXFxcXCIrdXNlcm5hbWUsXFxcXG4gICAgdXJsOlxcXFxcXFwiY29weTovL1xcXFxcXFwiK3VzZXJuYW1lLFxcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTpcXFxcXFxcIlVJRO+8mlxcXFxcXFwiK2Rldi5pZCxcXFxcbiAgICB1cmw6XFxcXFxcXCJjb3B5Oi8vXFxcXFxcXCIrZGV2LmlkLFxcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOlxcXFxcXFwi5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZXFxcXFxcXCIsXFxcXG4gICAgdXJsOiQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoaG9zdCk9PntcXFxcbiAgICAgICAgbGV0IGNvZGU9cmVxdWVzdChob3N0K1xcXFxcXFwiL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9MTQ1XFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgd29yZD1cXFxcXFxcIu+/pXB1Ymxpc2jvv6VcXFxcXFxcIitiYXNlNjRFbmNvZGUoY29kZSk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInJ1bGU6Ly9cXFxcXFxcIitiYXNlNjRFbmNvZGUod29yZCk7XFxcXG4gICAgfSxhcGkuaG9zdCksXFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOlxcXFxcXFwi5ZCM5q2l5o+Q5Lqk5LqR5LuT5bqT6LSm5Y+35a+G56CBXFxcXFxcXCIsXFxcXG4gICAgdXJsOlxcXFxcXFwicnVsZTovL1xcXFxcXFwiK2Jhc2U2NEVuY29kZShcXFxcXFxcIu+/pXB1Ymxpc2hfYWNjb3VudO+/pVxcXFxcXFwiK3VzZXJuYW1lK1xcXFxcXFwiQFxcXFxcXFwiK3Bhc3N3b3JkKSxcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTpcXFxcXFxcIuS9oOS4gOWFseWPkeW4g+S6huOAjFxcXFxcXFwiK2Rldi5ydWxlX251bStcXFxcXFxcIuOAjeadoeinhOWImVxcXFxcXFwiLFxcXFxuICAgIHVybDpcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxubGV0IHVzZXIgPSBnZXRGaWxlKCk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOlxcXFxcXFwi5rOo6ZSA55m75b2VXFxcXFxcXCIsXFxcXG4gICAgdXJsOiQoXFxcXFxcXCLnoa7orqTms6jplIDnmbvlvZU/XFxcXFxcXCIpLmNvbmZpcm0oZiA9PiB7XFxcXG4gICAgICAgIGYudXNlcm5hbWU9XFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgZi5wYXNzd29yZD1cXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICB3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uJywgSlNPTi5zdHJpbmdpZnkoZikpO1xcXFxuICAgICAgICBwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuYmFja1xcXFxcXFwiLFxcXFxcXFwiMVxcXFxcXFwiKTtcXFxcbiAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+W3suazqOmUgFxcXFxcXFwiO1xcXFxuICAgIH0sdXNlciksXFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuc2V0UmVzdWx0KGRhdGEpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuabtOaUueS4quS6uui1hOaWmVxcXCIsXFxcInBhdGhcXFwiOlxcXCJtb2RpZnlfUGVyc29uYWxEYXRhXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuY29uc3Qge1xcXFxuICAgIGdldEFwaSxcXFxcbiAgICBjb2xvcixcXFxcbiAgICBzbWFsbCxcXFxcbiAgICBnZXRGaWxlLFxcXFxuICAgIGh0bWxUYWdcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxubGV0IHtcXFxcbiAgICBkZXYsXFxcXG4gICAgdXNlcm5hbWUsXFxcXG4gICAgcGFzc3dvcmQsXFxcXG4gICAgUGF0dGVyblxcXFxufSA9IE1ZX1BBUkFNUztcXFxcbnZhciBkYXRhID0gW107XFxcXG5sZXQgcGF0aCA9IFxcXFxcXFwiP3FxPVxcXFxcXFwiICsgdXNlcm5hbWUgKyBcXFxcXFxcIiZwYXNzd29yZD1cXFxcXFxcIiArIHBhc3N3b3JkO1xcXFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5tLnBldE5hbWVcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UubS5hdmF0YXJcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC5jXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQueFxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLnlcXFxcXFxcIik7XFxcXG59KSk7XFxcXG5mdW5jdGlvbiBtX3BldE5hbWUoKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgICAgIGRlc2M6IFxcXFxcXFwi6K+36L6T5YWl5paw5pi156ewXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLnBldE5hbWUnLCAnJyl8fGRldi5uYW1lLFxcXFxuICAgICAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UubS5wZXROYW1lXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5L+d5a2YXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcXFxcXCJtb2RpZnlfbmFtZVxcXFxcXFwiKSArIHBhdGgpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBuZXdQZXROYW1lID0gZ2V0VmFyKCdXYXJlaG91c2UubS5wZXROYW1lJywgJycpO1xcXFxuICAgICAgICAgICAgaWYgKG5ld1BldE5hbWUgPT0gXFxcXFxcXCJcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5L2g6L+Y5LuA5LmI6YO95rKh5aGr5ZWKIVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQgKyBcXFxcXFxcIiZuYW1lPVxcXFxcXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG5ld1BldE5hbWUpKTtcXFxcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcXFxcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyByZXN1bHQuZGV0YWlsO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcXFxuICAgIH0pO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBtX2F2YXRhcigpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICAgICAgZGVzYzogXFxcXFxcXCLor7fovpPlhaXmlrDnmoTlpLTlg4/pk77mjqVcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0uYXZhdGFyJywgJycpIHx8IGRldi5hdmF0YXIsXFxcXG4gICAgICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZS5tLmF2YXRhclxcXFxcXFwiLGlucHV0KSdcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuS/neWtmFxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXFxcXFwibW9kaWZ5X2F2YVxcXFxcXFwiKSArIHBhdGgpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBuZXdBdmF0YXIgPSBnZXRWYXIoJ1dhcmVob3VzZS5tLmF2YXRhcicsICcnKTtcXFxcbiAgICAgICAgICAgIFxcXFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQgKyBcXFxcXFxcIiZhdmF0YXJfdXJsPVxcXFxcXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG5ld0F2YXRhcikpO1xcXFxuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xcXFxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXFxcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxcXG4gICAgfSk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIG1fcHdkKCkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOlxcXFxcXFwi5Y6f5a+G56CBXFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgICAgICBkZXNjOiBcXFxcXFxcIuivt+i+k+WFpeWOn+WvhueggVxcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgdHlwZTpcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQueScsICcnKSxcXFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQueVxcXFxcXFwiLGlucHV0KSdcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOlxcXFxcXFwi5paw5a+G56CBXFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgICAgICBkZXNjOiBcXFxcXFxcIuivt+i+k+WFpeaWsOWvhueggVxcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgdHlwZTpcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQueCcsICcnKSxcXFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQueFxcXFxcXFwiLGlucHV0KSdcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOlxcXFxcXFwi6YeN5aSN5paw5a+G56CBXFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgICAgICBkZXNjOiBcXFxcXFxcIuivt+mHjeWkjeaWsOWvhueggVxcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgdHlwZTpcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLmMnLCAnJyksXFxcXG4gICAgICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLmNcXFxcXFxcIixpbnB1dCknXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLkv53lrZhcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKGdldEFwaShcXFxcXFxcIm1vZGlmeV9wd2RcXFxcXFxcIikrcGF0aCkubGF6eVJ1bGUoKHBhc3N3b3JkLHVzZXJuYW1lKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgb2xkX3Bhc3N3b3JkID0gZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC55JywgJycpO1xcXFxuICAgICAgICAgICAgbGV0IG5ld19wYXNzd29yZCA9IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQueCcsICcnKTtcXFxcbiAgICAgICAgICAgIGxldCBuZXdfcGFzc3dvcmRfYWdhaW4gPSBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLmMnLCAnJyk7XFxcXG4gICAgICAgICAgICBpZiAob2xkX3Bhc3N3b3JkIT09cGFzc3dvcmQpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WOn+WvhueggemUmeivr1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaWYobmV3X3Bhc3N3b3JkPT09XFxcXFxcXCJcXFxcXFxcIil7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/or7fovpPlhaXmlrDlr4bnoIFcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGlmKG5ld19wYXNzd29yZCE9PW5ld19wYXNzd29yZF9hZ2Fpbil7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kuKTmrKHlr4bnoIHkuI3lkIxcXFxcXFxcIlxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQgKyBcXFxcXFxcIiZuZXdfcGFzc3dvcmQ9XFxcXFxcXCIgKyBuZXdfcGFzc3dvcmQrXFxcXFxcXCImbmV3X3Bhc3N3b3JkX3JlPVxcXFxcXFwiK25ld19wYXNzd29yZF9hZ2Fpbik7XFxcXG4gICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XFxcXG4gICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xcXFxuICAgICAgICAgICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcXFxcXCIsSlNPTi5zdHJpbmdpZnkoe1xcXFxuICAgICAgICAgICAgICAgICAgICB1c2VybmFtZTp1c2VybmFtZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ6bmV3X3Bhc3N3b3JkXFxcXG4gICAgICAgICAgICAgICAgfSkpO1xcXFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgcmVzdWx0LmRldGFpbDtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSxwYXNzd29yZCx1c2VybmFtZSksXFxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxuc3dpdGNoIChQYXR0ZXJuKSB7XFxcXG4gICAgY2FzZSAwOlxcXFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcXFxcXCLkv67mlLnlpLTlg49cXFxcXFxcIik7XFxcXG4gICAgICAgIG1fYXZhdGFyKCk7XFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgMTpcXFxcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXFxcXFwi5L+u5pS55pi156ewXFxcXFxcXCIpO1xcXFxuICAgICAgICBtX3BldE5hbWUoKTtcXFxcbiAgICAgICAgYnJlYWs7XFxcXG4gICAgY2FzZSAyOlxcXFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcXFxcXCLkv67mlLnlr4bnoIFcXFxcXFxcIik7XFxcXG4gICAgICAgIG1fcHdkKCk7XFxcXG4gICAgICAgIGJyZWFrO1xcXFxufVxcXFxuc2V0UmVzdWx0KGRhdGEpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIue8lui+keinhOWImeWkh+azqFxcXCIsXFxcInBhdGhcXFwiOlxcXCJzZXRfcnVsZV9ub3Rlc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmxldCBkYXRhID0gW107XFxcXG5jb25zdCB7XFxcXG4gICAgZ2V0QXBpXFxcXG59ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbmxldCB7XFxcXG4gICAgaWQsXFxcXG4gICAgdXNlcm5hbWUsXFxcXG4gICAgcGFzc3dvcmQsXFxcXG4gICAgbmFtZVxcXFxufSA9IE1ZX1BBUkFNUztcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIuWkh+azqOOAjFxcXFxcXFwiK25hbWUrXFxcXFxcXCLjgI1cXFxcXFxcIik7XFxcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsXFxcXFxcXCJjbGVhclZhcignV2FyZWhvdXNlLnJ1bGUubm90ZXMnLCAnJylcXFxcXFxcIik7XFxcXG5sZXQgbm90ZXM9cmVxdWVzdChnZXRBcGkoXFxcXFxcXCJnZXRfcnVsZV9ub3RlXFxcXFxcXCIpK2lkKTtcXFxcbm5vdGVzPUpTT04ucGFyc2Uobm90ZXMpLnJlc3VsdDtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgZGVzYzogXFxcXFxcXCLop4TliJnlpIfms6guLi4uLi5cXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLnJ1bGUubm90ZXMnLCAnJyl8fG5vdGVzfHxcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICB0eXBlOiBcXFxcXFxcInRleHRhcmVhXFxcXFxcXCIsXFxcXG4gICAgICAgIGhlaWdodDotMSxcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UucnVsZS5ub3Rlc1xcXFxcXFwiLGlucHV0KSdcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLkv53lrZhcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKGdldEFwaShcXFxcXFxcInNldF9ydWxlX25vdGVcXFxcXFxcIikgKyBpZCkubGF6eVJ1bGUoKHVzZXJuYW1lLCBwYXNzd29yZCkgPT4ge1xcXFxuICAgICAgICBsZXQgbm90ZXMgPSBnZXRWYXIoJ1dhcmVob3VzZS5ydWxlLm5vdGVzJywgJycpO1xcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCwge1xcXFxuICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInFxXFxcXFxcXCI6IHVzZXJuYW1lLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCI6IHBhc3N3b3JkLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIm5vdGVcXFxcXFxcIjpub3Rlc1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxcXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgcmVzdWx0LmRldGFpbDtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBiYWNrKGZhbHNlKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFxcXFxcIjtcXFxcbiAgICB9LCB1c2VybmFtZSwgcGFzc3dvcmQpXFxcXG59KTtcXFxcbnNldFJlc3VsdChkYXRhKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibGluZVxcXCIsXFxcIm5hbWVcXFwiOlxcXCLor4TorrrliJfooahcXFwiLFxcXCJwYXRoXFxcIjpcXFwiQ29tbWVudFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIuivhOiuuuWIl+ihqFxcXFxcXFwiKTtcXFxcbmNvbnN0IHtcXFxcbiAgICBhcGlcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxubGV0IGRhdGEgPSBbXTtcXFxcbmxldCB7XFxcXG4gICAgdG90YWxTdW0sXFxcXG4gICAgaWQsXFxcXG4gICAgbm9fYWN0aXZlLFxcXFxuICAgIHVzZXJuYW1lLFxcXFxuICAgIHBhc3N3b3JkXFxcXG59ID0gTVlfUEFSQU1TO1xcXFxubGV0IHBhZ2UgPSBwYXJzZUludChNWV9VUkwuc3BsaXQoXFxcXFxcXCIjXFxcXFxcXCIpWzFdKTtcXFxcbmxldCBkaXNjdXNzX3R5cGUgPSBnZXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG5pZiAocGFnZSA9PT0gMSkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgIHB1dFZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICB9KSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5YWo6YOoXFxcXFxcXCIgKyAoZGlzY3Vzc190eXBlID09PSBcXFxcXFxcIlxcXFxcXFwiID8gXFxcXFxcXCLil4lcXFxcXFxcIiA6IFxcXFxcXFwi4peLXFxcXFxcXCIpLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgICAgICBwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzQnXFxcXG5cXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLwn5GN6LWeXFxcXFxcXCIgKyAoZGlzY3Vzc190eXBlID09PSBcXFxcXFxcImdvb2RcXFxcXFxcIiA/IFxcXFxcXFwi4peJXFxcXFxcXCIgOiBcXFxcXFxcIuKXi1xcXFxcXFwiKSxcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICAgICAgcHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcXFxcXCIsIFxcXFxcXFwiZ29vZFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfNCdcXFxcblxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIvCfkY7ouKlcXFxcXFxcIiArIChkaXNjdXNzX3R5cGUgPT09IFxcXFxcXFwiYmFkXFxcXFxcXCIgPyBcXFxcXFxcIuKXiVxcXFxcXFwiIDogXFxcXFxcXCLil4tcXFxcXFxcIiksXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgICAgICAgIHB1dFZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXFxcXFwiLCBcXFxcXFxcImJhZFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfNCdcXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLlm57lpI1cXFxcXFxcIiArIChkaXNjdXNzX3R5cGUgPT09IFxcXFxcXFwicmVwbHlcXFxcXFxcIiA/IFxcXFxcXFwi4peJXFxcXFxcXCIgOiBcXFxcXFxcIuKXi1xcXFxcXFwiKSxcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICAgICAgcHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcXFxcXCIsIFxcXFxcXFwicmVwbHlcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzQnXFxcXG4gICAgfSk7XFxcXG59XFxcXG5cXFxcblxcXFxubGV0IGljb24gPSB7XFxcXG4gICAgXFxcXFxcXCJnb29kXFxcXFxcXCI6IFxcXFxcXFwi8J+RjVxcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiYmFkXFxcXFxcXCI6IFxcXFxcXFwi8J+RjlxcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwicmVwbHlcXFxcXFxcIjpcXFxcXFxcIuW8gOWPkeiAhfCfl6NcXFxcXFxcIlxcXFxufVxcXFxubGV0IGNvbnRyb2w9KHBpZCxhY3RpdmUpPT52b2lkIDA7XFxcXG5pZihub19hY3RpdmUpe1xcXFxuICAgIGNvbnRyb2w9ZnVuY3Rpb24ocGlkLGFjdGl2ZSl7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTphY3RpdmU/XFxcXFxcXCLpmpDol4/or4TorrpcXFxcXFxcIjpcXFxcXFxcIuWxleekuuivhOiuulxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiQoYXBpLmRpc19kZXZfY29udHJvbCtwaWQrXFxcXFxcXCI/cXE9XFxcXFxcXCIgKyB1c2VybmFtZSArIFxcXFxcXFwiJnBhc3N3b3JkPVxcXFxcXFwiICsgcGFzc3dvcmQrXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKT0+e1xcXFxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQ9SlNPTi5wYXJzZShyZXF1ZXN0KGlucHV0KSk7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIityZXN1bHQuZGV0YWlsO1xcXFxuICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTpcXFxcXFxcInRleHRfMlxcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6XFxcXFxcXCLliKDpmaTor4TorrpcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDokKFxcXFxcXFwi56Gu6K6k5Yig6Zmk6K+l6K+E6K66P1xcXFxcXFwiKS5jb25maXJtKChpbnB1dCk9PntcXFxcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0PUpTT04ucGFyc2UocmVxdWVzdChpbnB1dCkpO1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIrcmVzdWx0LmRldGFpbDtcXFxcbiAgICAgICAgICAgIH0sYXBpLmRpc19kZXZfY29udHJvbCtwaWQrXFxcXFxcXCI/cXE9XFxcXFxcXCIgKyB1c2VybmFtZSArIFxcXFxcXFwiJnBhc3N3b3JkPVxcXFxcXFwiICsgcGFzc3dvcmQrXFxcXFxcXCImZGVsZXRlPTFcXFxcXFxcIiksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTpcXFxcXFxcInRleHRfMlxcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgY29sX3R5cGU6XFxcXFxcXCJsaW5lXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTpcXFxcXFxcImxpbmVcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG59XFxcXG5pZiAodG90YWxTdW0gPT09IDApIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCI8aDUgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz7kuIDmnaHor4TorrrkuZ/msqHmnInvvIzlv6vmnaXmiqLmspnlj5HlkKfvvIE8L2g1PlxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufSBlbHNlIHtcXFxcbiAgICBsZXQgY29tbWVudExpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmRpc19nZXQgKyBpZCArIFxcXFxcXFwiP2xpbWl0PTUmcGFnZT1cXFxcXFxcIiArIHBhZ2UgKyBcXFxcXFxcIiZub19hY3RpdmU9XFxcXFxcXCIgKyBub19hY3RpdmUgKyBcXFxcXFxcIiZkaXNjdXNzX3R5cGU9XFxcXFxcXCIgKyBkaXNjdXNzX3R5cGUpKS5yZXN1bHQ7XFxcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjb21tZW50TGlzdCkge1xcXFxuICAgICAgICBsZXQgUmVwbHkgPSBpdGVtLmRpc2N1c3NfdHlwZT09PVxcXFxcXFwicmVwbHlcXFxcXFxcIiYmaXRlbS5yZXBseV90b19uYW1lIT09ZmFsc2UmJml0ZW0ucmVwbHlfdG9faWQhPT1mYWxzZT9cXFxcXFxcIuKAmOKAmOWbnuWkjUBcXFxcXFxcIitpdGVtLnJlcGx5X3RvX25hbWUrXFxcXFxcXCIgI1xcXFxcXFwiK2l0ZW0uZGlzY3Vzc19pZCtcXFxcXFxcIuKAmeKAmVxcXFxcXFxcblxcXFxcXFwiOlxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lICsgXFxcXFxcXCImbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0nZ3JheSc+PHNtYWxsPiNcXFxcXFxcIiArIGl0ZW0uaWQgKyBcXFxcXFxcIjwvc21hbGw+PGZvbnQ+XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJhdmF0YXJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIC8vdXJsOiBub19hY3RpdmU/XFxcXFxcXCJoaWtlcjovL3BhZ2UvUmVwbHlcXFxcXFxcIjpcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyBpdGVtLnFxLFxcXFxuXFxcXHRcXFxcdCAgICAgICB1cmw6bm9fYWN0aXZlP1xcXFxcXFwiaGlrZXI6Ly9wYWdlL1JlcGx5XFxcXFxcXCI6XFxcXFxcXCJtcXF3cGE6Ly9pbS9jaGF0P2NoYXRfdHlwZT13cGEmdWluPVxcXFxcXFwiK2l0ZW0ucXEsXFxcXG4gICAgICAgICAgICBleHRyYTp7XFxcXG4gICAgICAgICAgICAgICAgcnVsZUlkOiBpZCxcXFxcbiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxcXFxuICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcXFxcbiAgICAgICAgICAgICAgICByZXBseUlkOml0ZW0uaWRcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5kaXNjdXNzX3RleHQsXFxcXG4gICAgICAgICAgICBkZXNjOiBSZXBseStpdGVtLmNyZWF0ZV9kYXRlICsgXFxcXFxcXCLCt1xcXFxcXFwiICsgaWNvbltpdGVtLmRpc2N1c3NfdHlwZV0sXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6e1xcXFxuICAgICAgICAgICAgICAgIG5hbWU6aXRlbS5uYW1lLFxcXFxuICAgICAgICAgICAgICAgIHR5cGU6XFxcXFxcXCJsb25nX3RleHRcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB0ZXh0Oml0ZW0uZGlzY3Vzc190ZXh0XFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBjb250cm9sKGl0ZW0uaWQsaXRlbS5hY3RpdmUpO1xcXFxuICAgIH1cXFxcbiAgICBpZiAoY29tbWVudExpc3QubGVuZ3RoID09PSAwKSB7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5zZXRSZXN1bHQoZGF0YSlcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlj5Hooajor4TorrpcXFwiLFxcXCJwYXRoXFxcIjpcXFwiTWFrZUFjb21tZW50XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IGRhdGEgPSBbXTtcXFxcbmNvbnN0IHtcXFxcbiAgICBhcGksXFxcXG4gICAgZ2V0RmlsZVxcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5sZXQge1xcXFxuICAgIGlkLFxcXFxuICAgIG5hbWUsXFxcXG4gICAgZGVmYXVsdFR5cGVcXFxcbn0gPSBNWV9QQVJBTVM7XFxcXG5sZXQgdXNlcj1nZXRGaWxlKCkudXNlcnx8W1xcXFxcXFwiXFxcXFxcXCIsXFxcXFxcXCJcXFxcXFxcIl07XFxcXG5cXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIuivhOiuuihcXFxcXFxcIiArIG5hbWUgKyBcXFxcXFxcIilcXFxcXFxcIik7XFxcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQudHlwZVxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LnRleHRcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC5xcVxcXFxcXFwiKTtcXFxcbiAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG59KSk7XFxcXG5sZXQgdHlwZSA9IGdldFZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LnR5cGVcXFxcXFxcIikgfHwgZGVmYXVsdFR5cGV8fFxcXFxcXFwiZ29vZFxcXFxcXFwiO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuivhOiuui4uLi4uLlxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UuY29tbWVudC50ZXh0JywgJycpLFxcXFxuICAgICAgICB0eXBlOiBcXFxcXFxcInRleHRhcmVhXFxcXFxcXCIsXFxcXG4gICAgICAgIGhlaWdodDo3LFxcXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LnRleHRcXFxcXFxcIixpbnB1dCknXFxcXG4gICAgfVxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOlxcXFxcXFwi6LSm5Y+377yaXFxcXFxcXCIrKHVzZXJbMF18fFxcXFxcXFwiXFxcXFxcXCIpLFxcXFxuICAgIGRlc2M6XFxcXFxcXCLpqozor4HnoIHvvJpcXFxcXFxcIisodXNlclsxXXx8XFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgdXJsOlxcXFxcXFwiaGlrZXI6Ly9wYWdlL1VzZXJyZWdpc3RyYXRpb25cXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMScsXFxcXG4gICAgXFxcXG59KTtcXFxcblxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogICh0eXBlID09PSBcXFxcXFxcImdvb2RcXFxcXFxcIiA/IFxcXFxcXFwi4peJXFxcXFxcXCIgOiBcXFxcXFxcIuKXi1xcXFxcXFwiKStcXFxcXFxcIiDwn5GNXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICBwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC50eXBlXFxcXFxcXCIsIFxcXFxcXFwiZ29vZFxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgIH0pLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF8yJ1xcXFxuXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6ICAodHlwZSA9PT0gXFxcXFxcXCJiYWRcXFxcXFxcIiA/IFxcXFxcXFwi4peJXFxcXFxcXCIgOiBcXFxcXFxcIuKXi1xcXFxcXFwiKStcXFxcXFxcIiDwn5GOXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICBwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC50eXBlXFxcXFxcXCIsIFxcXFxcXFwiYmFkXFxcXFxcXCIpO1xcXFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgfSksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzInXFxcXG59KTtcXFxcblxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmj5DkuqRcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKGFwaS5kaXNfbmV3ICsgaWQpLmxhenlSdWxlKChBY2NvdW50KSA9PiB7XFxcXG4gICAgICAgIGxldCB0ZXh0ID0gZ2V0VmFyKCdXYXJlaG91c2UuY29tbWVudC50ZXh0JywgJycpO1xcXFxuICAgICAgICBsZXQgW3FxLGF1dGhfY29kZV0gPSBBY2NvdW50O1xcXFxuICAgICAgICBsZXQgdHlwZSA9IGdldFZhcignV2FyZWhvdXNlLmNvbW1lbnQudHlwZScpIHx8ICdnb29kJztcXFxcbiAgICAgICAgcXE9cXF8fFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgIGF1dGhfY29kZT1hdXRoX2NvZGV8fFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgIGlmKHFxPT1cXFxcXFxcIlxcXFxcXFwifHxhdXRoX2NvZGU9PVxcXFxcXFwiXFxcXFxcXCIpe1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mnKrnmbvlvZXotKblj7dcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZih0ZXh0PT1cXFxcXFxcIlxcXFxcXFwiKXtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5L2g6L+Y5LuA5LmI6YO95rKh5YaZ5ZWKXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgZnVuY3Rpb24gcihwKSB7XFxcXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCwge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcXFxuICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocCksXFxcXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IHAgPSB7XFxcXG4gICAgICAgICAgICBcXFxcXFxcInBhcmFtc1xcXFxcXFwiOiB7XFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJkaXNjdXNzX3RleHRcXFxcXFxcIjogdGV4dCxcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcInFxXFxcXFxcXCI6IHFxLFxcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwiZGlzY3Vzc190eXBlXFxcXFxcXCI6IHR5cGUsXFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJhdXRoX2NvZGVcXFxcXFxcIjogYXV0aF9jb2RlXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHIocCk7XFxcXG4gICAgICAgIGlmKHJlc3VsdC5zdGF0dXM9PT0wKXtcXFxcbiAgICAgICAgICAgIGJhY2soZmFsc2UpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIrcmVzdWx0LmRldGFpbDtcXFxcblxcXFxuICAgIH0sdXNlcilcXFxcbn0pO1xcXFxuXFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5Lyq55So5oi35rOo5YaMXFxcIixcXFwicGF0aFxcXCI6XFxcIlVzZXJyZWdpc3RyYXRpb25cXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCB7XFxcXG4gICAgYXBpLFxcXFxuICAgIGdldEZpbGUsXFxcXG4gICAgZ2V0VXNlckRhdGVcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxubGV0IGRhdGEgPSBbXTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIueUqOaIt+WIl+ihqOeuoeeQhlxcXFxcXFwiKTtcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UubS5xcVxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5tLnl6bVxcXFxcXFwiKTtcXFxcbn0pKTtcXFxcbmxldCB1c2VyID0gZ2V0RmlsZSgpO1xcXFxubGV0IHVzZXJOYW1lID0gdXNlci51c2VyIHx8IFtcXFxcXFxcIlxcXFxcXFwiXTtcXFxcbnVzZXJOYW1lID0gdXNlck5hbWVbMF07XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnTxiaWc+KOa3u+WKoC/pqozor4Ep6LSm5Y+3PC9iaWc+XFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi6I635Y+WXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLor7fovpPlhaVxcVxcXFxcXFwiLFxcXFxuICAgIHVybDogJC50b1N0cmluZygoYSwgYikgPT4ge1xcXFxuICAgICAgICBsZXQgcXEgPSBpbnB1dDtcXFxcbiAgICAgICAgaWYgKHFxID09IFxcXFxcXFwiXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5L2g6L+Y5LuA5LmI6YO95rKh5aGr5ZWKIVxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHNob3dMb2FkaW5nKFxcXFxcXFwi6I635Y+W5LitLi4uXFxcXFxcXCIpXFxcXG4gICAgICAgIHJldHVybiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKHFxLCBhLCBiKSA9PiB7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChhLCB7XFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicXFcXFxcXFxcIjogcXFcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxcXG4gICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xcXFxuICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQyID0gSlNPTi5wYXJzZShyZXF1ZXN0KGIgKyBcXFxcXFxcIj9xcT1cXFxcXFxcIiArIHFxKSk7XFxcXG4gICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgcmVzdWx0Mi5kZXRhaWw7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxcXG4gICAgICAgICAgICB0aHJvdyBlO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIH0sIHFxLCBhLCBiKTtcXFxcblxcXFxuICAgIH0sIGFwaS5kaXNfbmV3X3VzZXIsIGFwaS5kaXNfdmVyaWZ5KSxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0eXBlOiBcXFxcXFxcIm51bWJlclxcXFxcXFwiLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0ucXEnLCAnJykgfHwgdXNlck5hbWUsXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0ucXFcXFxcXFxcIixpbnB1dCknXFxcXG4gICAgfVxcXFxufSk7XFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLor7fovpPlhaXpqozor4HnoIFcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0ueXptJywgJycpLFxcXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZS5tLnl6bVxcXFxcXFwiLGlucHV0KSdcXFxcbiAgICB9XFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6ICdyaWNoX3RleHQnLFxcXFxuICAgIHRpdGxlOiBcXFxcXFxcIjxzbWFsbD7mj5DnpLrvvJoxLuavj+WkqeWPquiDveiOt+WPljXmrKHpqozor4HnoIEuPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzIuPHM+6aqM6K+B56CB5pyJ5pWI5pyf5oyB57ut5LiA5ZGo5bem5Y+zPC9zPijmmoLml7bkuI3kvJrvvIzlv5jorrDpqozor4HnoIHlj6/pgJrov4dRUeWPt+iOt+WPlik8L3NtYWxsPlxcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxubGV0IHVzZXJMaXN0ID0gZ2V0VXNlckRhdGUoKTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi6aqM6K+BL+eZu+W9lVxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIuehruWumuS/neWtmO+8jOmqjOivgeeggeWhq+mUme+8jOaXoOazleivhOiuuuWTplxcXFxcXFwiKS5jb25maXJtKChmLCBsLCBsb2dpbikgPT4ge1xcXFxuICAgICAgICBsZXQgcXEgPSBnZXRWYXIoJ1dhcmVob3VzZS5tLnFxJywgJycpO1xcXFxuICAgICAgICBsZXQgeXptID0gZ2V0VmFyKCdXYXJlaG91c2UubS55em0nLCAnJyk7XFxcXG4gICAgICAgIGlmIChxcSA9PSBcXFxcXFxcIlxcXFxcXFwiIHx8IHl6bSA9PSBcXFxcXFxcIlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL3Fx5oiW6aqM6K+B56CB5Li656m6XFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QobG9naW4sIHtcXFxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJxcVxcXFxcXFwiOiBxcSxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJhdXRoX2NvZGVcXFxcXFxcIjogeXptXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXFxcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXFxcbiAgICAgICAgICAgIGYudXNlciA9IFtxcSwgeXptXTtcXFxcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGYpKTtcXFxcbiAgICAgICAgICAgIGxldCBpbmRleCA9IGwuZmluZEluZGV4KGl0ZW0gPT4gaXRlbVswXSA9PT0gcXEpO1xcXFxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcXFxcbiAgICAgICAgICAgICAgICBsLnNwbGljZShpbmRleCwgMSwgW3FxLCB5em1dKTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobC5sZW5ndGggPCA2KSB7XFxcXG4gICAgICAgICAgICAgICAgbC5wdXNoKFtxcSwgeXptXSk7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIGwuc3BsaWNlKDAsIDEpO1xcXFxuICAgICAgICAgICAgICAgIGwucHVzaChbcXEsIHl6bV0pO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSQS5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGwpKTtcXFxcbiAgICAgICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6aqM6K+B5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxcXG4gICAgfSwgdXNlciwgdXNlckxpc3QsIGFwaS5kaXNfbG9naW4pLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLigJzigJzigJ3igJ08YmlnPui0puWPt+WIl+ihqDwvYmlnPlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdDxzbWFsbD4o5L+d55WZNeadoeiusOW9lSk8L3NtYWxsPlxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbn0pO1xcXFxudXNlckxpc3QucmV2ZXJzZSgpO1xcXFxuXFxcXG5mb3IgKGxldCBpdGVtIG9mIHVzZXJMaXN0KSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi6LSm5Y+377yaXFxcXFxcXCIgKyBpdGVtWzBdICsgKHVzZXJOYW1lID09PSBpdGVtWzBdID8gXFxcXFxcXCJcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHTigJzigJxb5b2T5YmN6LSm5Y+3XeKAneKAnVxcXFxcXFwiIDogXFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgICAgIGRlc2M6IFxcXFxcXFwi6aqM6K+B56CB77yaXFxcXFxcXCIgKyBpdGVtWzFdLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCLmmK/lkKbliIfmjaLkuLror6VbXFxcXFxcXCIgKyBpdGVtWzBdICsgXFxcXFxcXCJd6LSm5Y+3XFxcXFxcXCIpLmNvbmZpcm0oKGYsIGl0ZW0pID0+IHtcXFxcbiAgICAgICAgICAgIGYudXNlciA9IGl0ZW07XFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShmKSk7XFxcXG4gICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIh+aNouaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICB9LCB1c2VyLCBpdGVtKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn1cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi6YCA5Ye66LSm5Y+3XFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwi56Gu6K6k6YCA5Ye655m75b2V54q25oCBXFxcXFxcXCIpLmNvbmZpcm0oKGYpID0+IHtcXFxcbiAgICAgICAgZi51c2VyID0gW107XFxcXG4gICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGYpKTtcXFxcbiAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+mAgOWHuuaIkOWKn1xcXFxcXFwiO1xcXFxuICAgIH0sIHVzZXIpLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXFxcbn0pO1xcXFxuc2V0UmVzdWx0KGRhdGEpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuWIl+ihqOaOkuW6j+eul+azlVxcXCIsXFxcInBhdGhcXFwiOlxcXCJzb3J0XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuLyog6KeE5YiZ5YiX6KGo5o6S5bqPIFsgVVDjgIFORVfjgIHml6Dmm7TmlrAgXSDpobrluo8gKi9cXFxcbi8qIOW9kuW5tuaOkuW6jyBTdGFydCAqL1xcXFxuZnVuY3Rpb24gbWVyZ2VTb3J0KGFycikge1xcXFxuICAgIHZhciBsZW4gPSBhcnIubGVuZ3RoO1xcXFxuICAgIGlmIChsZW4gPCAyKSB7XFxcXG4gICAgICAgIHJldHVybiBhcnI7XFxcXG4gICAgfVxcXFxuICAgIHZhciBtaWRkbGUgPSBNYXRoLmZsb29yKGxlbiAvIDIpLFxcXFxuICAgICAgICBsZWZ0ID0gYXJyLnNsaWNlKDAsIG1pZGRsZSksXFxcXG4gICAgICAgIHJpZ2h0ID0gYXJyLnNsaWNlKG1pZGRsZSk7XFxcXG4gICAgcmV0dXJuIG1lcmdlKG1lcmdlU29ydChsZWZ0KSwgbWVyZ2VTb3J0KHJpZ2h0KSk7XFxcXG59XFxcXG5mdW5jdGlvbiBtZXJnZShsZWZ0LCByaWdodCkge1xcXFxuICAgIHZhciByZXN1bHQgPSBbXTtcXFxcbiAgICB2YXIgaXNUaGlzVmVyc2lvbkxpc3QgPSBbXTtcXFxcblxcXFxuICAgIHdoaWxlIChsZWZ0Lmxlbmd0aCA+IDAgJiYgcmlnaHQubGVuZ3RoID4gMCkge1xcXFxuICAgICAgICBpZiAobGVmdFswXS50aXRsZS5pbmNsdWRlcyhcXFxcXFxcIvCfhplcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGxlZnQuc2hpZnQoKSk7XFxcXG4gICAgICAgIH0gZWxzZSBpZiAocmlnaHRbMF0udGl0bGUuaW5jbHVkZXMoXFxcXFxcXCLwn4aZXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICByZXN1bHQucHVzaChyaWdodC5zaGlmdCgpKTtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChsZWZ0WzBdLnRpdGxlLmluY2x1ZGVzKFxcXFxcXFwi8J+GlVxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobGVmdC5zaGlmdCgpKTtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChyaWdodFswXS50aXRsZS5pbmNsdWRlcyhcXFxcXFxcIvCfhpVcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJpZ2h0LnNoaWZ0KCkpO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgaXNUaGlzVmVyc2lvbkxpc3QucHVzaChsZWZ0LnNoaWZ0KCkpO1xcXFxuICAgICAgICAgICAgaXNUaGlzVmVyc2lvbkxpc3QucHVzaChyaWdodC5zaGlmdCgpKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcblxcXFxuICAgIHdoaWxlIChpc1RoaXNWZXJzaW9uTGlzdC5sZW5ndGgpIHJlc3VsdC5wdXNoKGlzVGhpc1ZlcnNpb25MaXN0LnNoaWZ0KCkpO1xcXFxuXFxcXG4gICAgd2hpbGUgKGxlZnQubGVuZ3RoKVxcXFxuICAgICAgICByZXN1bHQucHVzaChsZWZ0LnNoaWZ0KCkpO1xcXFxuXFxcXG4gICAgd2hpbGUgKHJpZ2h0Lmxlbmd0aClcXFxcbiAgICAgICAgcmVzdWx0LnB1c2gocmlnaHQuc2hpZnQoKSk7XFxcXG5cXFxcbiAgICByZXR1cm4gcmVzdWx0O1xcXFxufVxcXFxuJC5leHBvcnRzLm1lcmdlU29ydCA9IG1lcmdlU29ydDtcXFxcbi8qIOW9kuW5tuaOkuW6jyBFbmQgKi9cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwiaWNvbl8yX3JvdW5kXFxcIixcXFwibmFtZVxcXCI6XFxcIuWFqOmDqOWFrOW8gOinhOWImVxcXCIsXFxcInBhdGhcXFwiOlxcXCJBbGxQdWJsaWNSdWxlXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuICAgIGNvbnN0IHtcXFxcbiAgICAgICAgYXBpLFxcXFxuICAgICAgICBsb2NhbFJ1bGVWZXIsXFxcXG4gICAgICAgIGdldEFwaVxcXFxuICAgIH0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxuY29uc3Qge1xcXFxuICAgIG1lcmdlU29ydFxcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9zb3J0XFxcXFxcXCIpO1xcXFxubGV0IGRhdGFUeXBlID0gZ2V0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLnR5cGVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG5sZXQgb3JkZXIgPSBnZXRWYXIoXFxcXFxcXCJXYXJlaG91c2Uub3JkZXJcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxubGV0IHNvcnQgPSBnZXRWYXIoXFxcXFxcXCJXYXJlaG91c2Uuc29ydFxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG5sZXQgZ29vZCA9IGdldFZhcihcXFxcXFxcIldhcmVob3VzZS5nb29kXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxubGV0IHBhZ2UgPSBNWV9VUkwuc3BsaXQoXFxcXFxcXCIjXFxcXFxcXCIpWzFdIHx8IDE7XFxcXG5sZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmFsbF9ydWxlICsgXFxcXFxcXCI/ZGF0YV90eXBlPVxcXFxcXFwiICsgZGF0YVR5cGUgKyBcXFxcXFxcIiZwYWdlPVxcXFxcXFwiICsgcGFnZSArIFxcXFxcXFwiJmxpbWl0PTIwJm9yZGVyPVxcXFxcXFwiICsgb3JkZXIgKyBcXFxcXFxcIiZzb3J0PVxcXFxcXFwiICsgc29ydCsgXFxcXFxcXCImaXNfZ29vZD1cXFxcXFxcIiArIGdvb2QpKS5yZXN1bHQ7XFxcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLnR5cGVcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2Uub3JkZXJcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2Uuc29ydFxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5nb29kXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLmJhY2tcXFxcXFxcIik7XFxcXG59KSk7XFxcXG5sZXQgZGF0YSA9IFtdO1xcXFxuaWYgKGdldFZhcihcXFxcXFxcIldhcmVob3VzZS5iYWNrXFxcXFxcXCIpID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgIGJhY2soKTtcXFxcbn1cXFxcbmZ1bmN0aW9uIHRhYihhcnIsIHR5cGUsIGNvbnRyYXN0KSB7XFxcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBhcnIpIHtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtWzFdID09PSBjb250cmFzdCA/IFxcXFxcXFwi4oCc4oCcXFxcXFxcXCIgKyBpdGVtWzBdICsgXFxcXFxcXCLigJ3igJ1cXFxcXFxcIiA6IGl0ZW1bMF0sXFxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoa2V5LCB0eXBlKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgcHV0VmFyKHR5cGUsIGtleSk7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0sIGl0ZW1bMV0sIHR5cGUpLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJibGFua19ibG9ja1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59XFxcXG5pZiAocGFnZSA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICB0YWIoW1xcXFxuICAgICAgICBbXFxcXFxcXCLlhajpg6hcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIl0sXFxcXG4gICAgICAgIFtcXFxcXFxcIuWwj+eoi+W6j1xcXFxcXFwiLCBcXFxcXFxcImhvbWVfcnVsZV91cmxcXFxcXFxcIl0sXFxcXG4gICAgICAgIFtcXFxcXFxcIuaPkOS6pOS6keS7k+W6k+inhOWImVxcXFxcXFwiLCBcXFxcXFxcInB1Ymxpc2hcXFxcXFxcIl0sXFxcXG4gICAgICAgIFtcXFxcXFxcIue9kemhteaPkuS7tlxcXFxcXFwiLCBcXFxcXFxcImpzX3VybFxcXFxcXFwiXSxcXFxcbiAgICAgICAgW1xcXFxcXFwi6Z2Z5oCB6aG16Z2iXFxcXFxcXCIsIFxcXFxcXFwiaHRtbFxcXFxcXFwiXSxcXFxcbiAgICAgICAgW1xcXFxcXFwi5Li76aKYXFxcXFxcXCIsIFxcXFxcXFwiY29uZmlnXFxcXFxcXCJdXFxcXG4gICAgXSwgXFxcXFxcXCJXYXJlaG91c2UudHlwZVxcXFxcXFwiLCBkYXRhVHlwZSk7XFxcXG4gICAgdGFiKFtcXFxcbiAgICAgICAgW1xcXFxcXFwi5pe26Ze0XFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiXSxcXFxcbiAgICAgICAgW1xcXFxcXFwiSURcXFxcXFxcIiwgXFxcXFxcXCIxXFxcXFxcXCJdLFxcXFxuICAgICAgICBbXFxcXFxcXCLlpb3or4TluqZcXFxcXFxcIiwgXFxcXFxcXCIyXFxcXFxcXCJdLFxcXFxuICAgICAgICBbXFxcXFxcXCLlt67or4TluqZcXFxcXFxcIiwgXFxcXFxcXCIzXFxcXFxcXCJdLFxcXFxuICAgICAgICBbXFxcXFxcXCLlm57lpI3mlbBcXFxcXFxcIiwgXFxcXFxcXCI0XFxcXFxcXCJdXFxcXG4gICAgXSwgXFxcXFxcXCJXYXJlaG91c2Uub3JkZXJcXFxcXFxcIiwgb3JkZXIpO1xcXFxuICAgIHRhYihbXFxcXG4gICAgICAgIFtcXFxcXFxcIuWAkuW6j1xcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIl0sXFxcXG4gICAgICAgIFtcXFxcXFxcIuato+W6j1xcXFxcXFwiLCBcXFxcXFxcIjFcXFxcXFxcIl1cXFxcbiAgICBdLCBcXFxcXFxcIldhcmVob3VzZS5zb3J0XFxcXFxcXCIsIHNvcnQpO1xcXFxuICAgIHRhYihbXFxcXG4gICAgICAgIFtcXFxcXFxcIuS4jeiuulxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiXSxcXFxcbiAgICAgICAgW1xcXFxcXFwi5LyY6LSoXFxcXFxcXCIsIFxcXFxcXFwiMVxcXFxcXFwiXVxcXFxuICAgIF0sIFxcXFxcXFwiV2FyZWhvdXNlLmdvb2RcXFxcXFxcIiwgZ29vZCk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5pCc57SiXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJC50b1N0cmluZyhuYW1lID0+IFxcXFxcXFwiaGlrZXI6Ly9zZWFyY2g/cz1cXFxcXFxcIiArIGlucHV0ICsgXFxcXFxcXCImcnVsZT1cXFxcXFxcIiArIG5hbWUsIE1ZX1JVTEUudGl0bGUpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICAgICAgICBkZXNjOiBcXFxcXFxcIuaQnOe0ouWFqOmDqOinhOWImVxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59XFxcXG5cXFxcbmxldCBob21lTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuaG9tZSkpO1xcXFxubGV0IG1SdWxlTGlzdCA9IFtdO1xcXFxuZm9yICh2YXIgaXRlbSBvZiBydWxlTGlzdCkge1xcXFxuICAgIHZhciBuYW1lID0gaXRlbS5uYW1lO1xcXFxuICAgIGlmIChpdGVtLmlzX3RhcCkge1xcXFxuICAgICAgICBsZXQgbG9jYXRpb24gPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXFxcXFwicnVsZUxpc3RKc29uXFxcXFxcXCIpICsgXFxcXFxcXCI/aWQ9XFxcXFxcXCIgKyBpdGVtLmlkKSk7XFxcXG4gICAgICAgIGl0ZW0uaWQgPSBsb2NhdGlvbi5pZDtcXFxcbiAgICAgICAgaXRlbS5uYW1lID0gbG9jYXRpb24ubmFtZTtcXFxcbiAgICAgICAgaXRlbS5hdXRob3IgPSBsb2NhdGlvbi5hdXRob3I7XFxcXG4gICAgICAgIGl0ZW0uZGF0YV90eXBlID0gbG9jYXRpb24uZGF0YV90eXBlO1xcXFxuICAgICAgICBpdGVtLnZlciA9IGxvY2F0aW9uLnZlclxcXFxuICAgIH1cXFxcbiAgICBpdGVtLnZlcnNpb24gPSBpdGVtLnZlcjtcXFxcbiAgICBsZXQgbGFiZWwgPSBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICBsdmVyID0gLTI7XFxcXG4gICAgaWYgKGl0ZW0uaXNfanNvbiAmJiBpdGVtLmRhdGFfdHlwZSA9PT0gXFxcXFxcXCJob21lX3J1bGVfdXJsXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgbHZlciA9IGxvY2FsUnVsZVZlcihob21lTGlzdCwgaXRlbSk7XFxcXG4gICAgICAgIGlmIChsdmVyID09PSAtMSkge1xcXFxuICAgICAgICAgICAgbGFiZWwgPSBcXFxcXFxcIvCfhpVcXFxcXFxcIjtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChsdmVyIDwgaXRlbS52ZXIpIHtcXFxcbiAgICAgICAgICAgIGxhYmVsID0gXFxcXFxcXCLwn4aZXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgbVJ1bGVMaXN0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogbGFiZWwgKyBuYW1lLFxcXFxuICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3J1bGVEZXRhaWwjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBsdmVyOiBsdmVyLFxcXFxuICAgICAgICAgICAgaWQ6IGl0ZW0uaWQsXFxcXG4gICAgICAgICAgICBpc0FsbDp0cnVlXFxcXG4gICAgICAgIH0sXFxcXG4gICAgICAgIHBpY191cmw6IGl0ZW0ucGljLFxcXFxuICAgIH0pXFxcXG59XFxcXG4vKiDlvZLlubbmjpLluo8gU3RhcnQgKi9cXFxcbi8vbVJ1bGVMaXN0ID0gbWVyZ2VTb3J0KG1SdWxlTGlzdCk7XFxcXG4vKiDlvZLlubbmjpLluo8gRW5kICovXFxcXG5kYXRhLnB1c2guYXBwbHkoZGF0YSwgbVJ1bGVMaXN0KVxcXFxuc2V0UmVzdWx0KGRhdGEpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuWbnuWkjVxcXCIsXFxcInBhdGhcXFwiOlxcXCJSZXBseVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmxldCBkYXRhID0gW107XFxcXG5jb25zdCB7XFxcXG4gICAgYXBpXFxcXG59ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbmxldCB7XFxcXG4gICAgcmVwbHlJZCxcXFxcbiAgICBydWxlSWQsXFxcXG4gICAgbmFtZSxcXFxcbiAgICBwYXNzd29yZCxcXFxcbiAgICB1c2VybmFtZVxcXFxufSA9IE1ZX1BBUkFNUztcXFxcblxcXFxuXFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLlm57lpI0oXFxcXFxcXCIgKyBuYW1lICsgXFxcXFxcXCIpXFxcXFxcXCIpO1xcXFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LnRleHRcXFxcXFxcIik7XFxcXG4gICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxufSkpO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGRlc2M6IFxcXFxcXFwi5Zue5aSNLi4uLi4uXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5jb21tZW50LnRleHQnLCAnJyksXFxcXG4gICAgICAgIHR5cGU6IFxcXFxcXFwidGV4dGFyZWFcXFxcXFxcIixcXFxcbiAgICAgICAgaGVpZ2h0OjcsXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQudGV4dFxcXFxcXFwiLGlucHV0KSdcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuaPkOS6pFxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoYXBpLmRpc19yZXBseSArIHJ1bGVJZCkubGF6eVJ1bGUoKHBhc3N3b3JkLCB1c2VybmFtZSwgcnVsZUlkKSA9PiB7XFxcXG4gICAgICAgIGxldCB0ZXh0ID0gZ2V0VmFyKCdXYXJlaG91c2UuY29tbWVudC50ZXh0JywgJycpO1xcXFxuICAgICAgICBpZiAocGFzc3dvcmQgPT0gXFxcXFxcXCJcXFxcXFxcIiB8fCB1c2VybmFtZSA9PSBcXFxcXFxcIlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+acqueZu+W9lei0puWPt1xcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmICh0ZXh0ID09IFxcXFxcXFwiXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5L2g6L+Y5LuA5LmI6YO95rKh5YaZ5ZWKXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQsIHtcXFxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJkaXNjdXNzX3RleHRcXFxcXFxcIjogdGV4dCxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJxcVxcXFxcXFwiOiB1c2VybmFtZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiOiBwYXNzd29yZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJkaXNjdXNzX2lkXFxcXFxcXCI6IHJ1bGVJZFxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxcXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxcXG4gICAgICAgICAgICBiYWNrKGZhbHNlKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgcmVzdWx0LmRldGFpbDtcXFxcblxcXFxuICAgIH0sIHBhc3N3b3JkLCB1c2VybmFtZSwgcmVwbHlJZClcXFxcbn0pO1xcXFxuXFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5oiR55qE5Zue5aSNXFxcIixcXFwicGF0aFxcXCI6XFxcIk15UmVwbHlcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCB7XFxcXG4gICAgYXBpXFxcXG59ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbmxldCB7XFxcXG4gICAgYXV0aF9jb2RlLFxcXFxuICAgIHFxXFxcXG59ID0gTVlfUEFSQU1TO1xcXFxubGV0IHBhZ2UgPSBwYXJzZUludChNWV9VUkwuc3BsaXQoXFxcXFxcXCIjXFxcXFxcXCIpWzFdKTtcXFxcbmxldCBkYXRhPVtdO1xcXFxubGV0IGNvbW1lbnRMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5kaXNfZ2V0X3JlcGx5ICsgXFxcXFxcXCI/bGltaXQ9NSZwYWdlPVxcXFxcXFwiICsgcGFnZSArIFxcXFxcXFwiJnFxPVxcXFxcXFwiICsgcXEgKyBcXFxcXFxcIiZhdXRoX2NvZGU9XFxcXFxcXCIgKyBhdXRoX2NvZGUpKS5yZXN1bHQ7XFxcXG5pZiAoY29tbWVudExpc3QubGVuZ3RoID09PSAwKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwiPGg1IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+5Yir5ouJ5LqG5LiA5p2h5Lmf5LiN5Ymp5LqGPC9oNT5cXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn0gZWxzZSB7XFxcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjb21tZW50TGlzdCkge1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0ubmFtZSArIFxcXFxcXFwiJm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9J2dyYXknPjxzbWFsbD4jXFxcXFxcXCIgKyBpdGVtLmlkICsgXFxcXFxcXCI8L3NtYWxsPjxmb250PlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYXZhdGFyXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3J1bGVEZXRhaWwjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGx2ZXI6IFxcXFxcXFwi5Zue5aSN6L+b5YWl5LiN5pSv5oyB5p+l55yLXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgaWQ6IGl0ZW0ucnVsZV9pZFswXVxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXFxcbiAgICAgICAgICAgIGRlc2M6IGl0ZW0uY3JlYXRlX2RhdGUgKyBcXFxcXFxcIsK3XFxcXFxcXCIraXRlbS5ydWxlX2lkWzFdK1xcXFxcXFwiwrdcXFxcXFxcIitcXFxcXFxcIuW8gOWPkeiAhfCfl6NcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYTp7XFxcXG4gICAgICAgICAgICAgICAgbmFtZTppdGVtLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgdHlwZTpcXFxcXFxcImxvbmdfdGV4dFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHRleHQ6aXRlbS5kaXNjdXNzX3RleHRcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxuICAgIFxcXFxufVxcXFxuc2V0UmVzdWx0KGRhdGEpO1xcXFxuXFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5pu05aSa5YiG5LqrXFxcIixcXFwicGF0aFxcXCI6XFxcIm1vcmVTaGFyZVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbiAgICBhZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCk9PntcXFxcbiAgICAgICAgY2xlYXJWYXIoXFxcXFxcXCJob3VzZS51cGxvYWRfY29kZVxcXFxcXFwiKTtcXFxcbiAgICB9KSk7XFxcXG5jb25zdCB7Y29sb3Isc21hbGwsYXBpLCBnZXRGaWxlfSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5sZXQgaG91c2VGaWxlID0gZ2V0RmlsZXx8ZmFsc2U7XFxcXG5sZXQgcHV0X3VybCA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvZGV2L3B1dCc7XFxcXG5pZighaG91c2VGaWxlKXtcXFxcbiAgICBzZXRJdGVtKCdpc19ob3VzZV92aXAnLCAnZmFsc2UnKTtcXFxcbn1cXFxcbmxldCBob3VzZV9kYXRhID0gaG91c2VGaWxlKCk7XFxcXG4vLyBsb2coaG91c2VfZGF0YS51c2VybmFtZSsnLScraG91c2VfZGF0YS5wYXNzd29yZCk7XFxcXG52YXIgY2FudXAgPSBob3VzZV9kYXRhLnVzZXJuYW1lLmxlbmd0aCA+PSA2ICYmIGhvdXNlX2RhdGEucGFzc3dvcmQubGVuZ3RoID4gMjtcXFxcbmxvZygn5Y+v5Lul5LiK5LygPycrY2FudXApO1xcXFxubGV0IGQgPSBbXTtcXFxcbmxldCBmaWxlX3R5cGUgPSBbe25hbWU6J+mdmeaAgeaWh+S7ticsdmFsdWU6J2h0bWwnfSx7bmFtZTon572R6aG15o+S5Lu2Jyx2YWx1ZTonanNfdXJsJ30se25hbWU6J+S4u+mhtemFjee9ricsdmFsdWU6J2NvbmZpZyd9XTsgLy/kuIrkvKDnsbvlnotcXFxcbmxldCBmaWxlX3JlZGlyZWN0ID0gW3tuYW1lOifmnKzlnLAnLHZhbHVlOidmYWxzZSd9LHtuYW1lOifnm7Tpk74zMDInLHZhbHVlOid0cnVlJ31dOyAvL+aYr+WQpumHjeWumuWQkVxcXFxubGV0IGZpbGVfdWEgPSBbe25hbWU6J+eUteiEkScsdmFsdWU6J3BjJ30se25hbWU6J+aJi+acuicsdmFsdWU6J21vYmlsZSd9XTtcXFxcbmxldCBmaWxlX3R5cGVfdGl0bGUgPSBmaWxlX3R5cGUubWFwKChpdGVtKSA9PiB7XFxcXG4gICAgbGV0IG5hbWUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3R5cGUnLCfpnZnmgIHmlofku7YnKTtcXFxcbiAgICBpZihpdGVtLm5hbWU9PT1uYW1lKXtcXFxcbiAgICAgICAgcmV0dXJuICfwn5GJJytpdGVtLm5hbWU7XFxcXG4gICAgfWVsc2V7XFxcXG4gICAgICAgIHJldHVybiBpdGVtLm5hbWU7XFxcXG4gICAgfVxcXFxufSk7XFxcXG5sZXQgZmlsZV9yZWRpcmVjdF90aXRsZSA9IGZpbGVfcmVkaXJlY3QubWFwKChpdGVtKSA9PiB7XFxcXG4gICAgbGV0IG5hbWUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3JlZGlyZWN0Jywn5pys5ZywJyk7XFxcXG4gICAgaWYoaXRlbS5uYW1lPT09bmFtZSl7XFxcXG4gICAgICAgIHJldHVybiAn8J+RiScraXRlbS5uYW1lO1xcXFxuICAgIH1lbHNle1xcXFxuICAgICAgICByZXR1cm4gaXRlbS5uYW1lO1xcXFxuICAgIH1cXFxcbn0pO1xcXFxubGV0IGZpbGVfdWFfdGl0bGUgPSBmaWxlX3VhLm1hcCgoaXRlbSkgPT4ge1xcXFxuICAgIGxldCBuYW1lID0gZ2V0SXRlbSgnaG91c2UuZmlsZV91YScsJ+eUteiEkScpO1xcXFxuICAgIGlmKGl0ZW0ubmFtZT09PW5hbWUpe1xcXFxuICAgICAgICByZXR1cm4gJ/CfkYknK2l0ZW0ubmFtZTtcXFxcbiAgICB9ZWxzZXtcXFxcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZTtcXFxcbiAgICB9XFxcXG59KTtcXFxcbmQucHVzaCh7Y29sX3R5cGU6ICd4NV93ZWJ2aWV3X3NpbmdsZScsIGV4dHJhOiB7anM6ICdjb25zb2xlLmxvZyhcXFxcXFxcIuaIkeWKoOi9veS6hlxcXFxcXFwiKSd9fSk7XFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiAn6I635Y+WJyxcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuaWh+S7tui3r+W+hCzmlK/mjIFoaWtlcixmaWxlLGh0dHAs5Li76aKYXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgb25DaGFuZ2U6IFxcXFxcXFwicHV0VmFyKCdob3VzZS53ZWJfdXJsJyxpbnB1dClcXFxcXFxcIixcXFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiB0cnVlLFxcXFxuICAgICAgICBpZDonZmlsZVBhdGgnLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6Z2V0VmFyKCdob3VzZS53ZWJfdXJsJylcXFxcbiAgICB9LFxcXFxuICAgIHVybDokLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgbGV0IGlucHV0ID0gZ2V0VmFyKCdob3VzZS53ZWJfdXJsJywnJyk7XFxcXG4gICAgICAgIGlmKGlucHV0Lmxlbmd0aDwyKXtcXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/pk77mjqXkuI3lj6/ku6XkuLrnqbonXFxcXG4gICAgICAgIH0gZWxzZSBpZigvXmhpa2VyOnxeZmlsZTp8Xmh0dHA6fF5odHRwczp8XlxcXFxcXFxcL3N0b3JhZ2VcXFxcXFxcXC98XlxcXFxcXFxcL3NkY2FyZFxcXFxcXFxcLy8udGVzdChpbnB1dCkpe1xcXFxuICAgICAgICAgICAgaWYoL15cXFxcXFxcXC9zdG9yYWdlXFxcXFxcXFwvfF5cXFxcXFxcXC9zZGNhcmRcXFxcXFxcXC8vLnRlc3QoaW5wdXQpKXtcXFxcbiAgICAgICAgICAgICAgICBpbnB1dCA9ICdmaWxlOi8vJytpbnB1dDtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGxvZygn5q2j5bi46ZO+5o6lOicraW5wdXQpO1xcXFxuICAgICAgICAgICAgbGV0IHVhID0gZ2V0SXRlbSgnaG91c2UuZmlsZV91YScpPT09J+eUteiEkSc/J01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OC4wLjQzMjQuMTQ2IFNhZmFyaS81MzcuMzYnOidNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOTsgTUkgNikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg5LjAuNDM4OS45MCBNb2JpbGUgU2FmYXJpLzUzNy4zNic7XFxcXG4gICAgICAgICAgICBsZXQgd2ViX3VybF9hcnIgPSBpbnB1dC5zcGxpdCgnOycpO1xcXFxuICAgICAgICAgICAgbGV0IHdlYl91cmwgPSB3ZWJfdXJsX2FyclswXTtcXFxcbiAgICAgICAgICAgIGxldCBoZWFkZXJzID0ge1xcXFxuICAgICAgICAgICAgICAgICdSZWZlcmVyJzonaHR0cHM6Ly9ibG9nLmNzZG4ubmV0JyxcXFxcbiAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6dWEsXFxcXG4gICAgICAgICAgICAgICAgJ0FjY2VwdCc6J2FwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCwgKi8qOyBxPTAuMDEnLFxcXFxuICAgICAgICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOid6aC1DTicsXFxcXG4gICAgICAgICAgICB9O1xcXFxuICAgICAgICAgICAgaWYod2ViX3VybF9hcnIubGVuZ3RoPj0zJiZ3ZWJfdXJsX2FyclsyXS5sZW5ndGg+Mil7IC8v6K6+572u57yW56CBXFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSAnY2hhcnNldD0nK3dlYl91cmxfYXJyWzJdLnRvVXBwZXJDYXNlKCk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsZXQgcGFyYW1zID0ge2hlYWRlcnM6aGVhZGVycyx3aXRoSGVhZGVyczpmYWxzZSxyZWRpcmVjdDpmYWxzZX07XFxcXG4gICAgICAgICAgICBpZih3ZWJfdXJsX2Fyci5sZW5ndGg+PTImJndlYl91cmxfYXJyWzFdLmxlbmd0aD4yKXsgLy8g6K6+572u6K+35rGC5pa55rOVXFxcXG4gICAgICAgICAgICAgICAgcGFyYW1zWydtZXRob2QnXSA9IHdlYl91cmxfYXJyWzFdLnRvVXBwZXJDYXNlKCk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsb2coJ+W8gOWni+iOt+WPlua6kOeggScpO1xcXFxuICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICAvKlxcXFxuICAgICAgICAgICAgICAgIHJlcXVlc3RBc3luYyh3ZWJfdXJsLHBhcmFtcyxmdW5jdGlvbiAoa2V5LGNvZGUpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJhY2tfY29kZSA9IGNvZGU7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmKGJhY2tfY29kZS5sZW5ndGg+MjApe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0VmFyKCdob3VzZS51cGxvYWRfY29kZScsYmFja19jb2RlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+a6kOeggeW3suiOt+WPlizlubbpg6jliIbmj5LlhaXliLDmlofmnKzljLrln58nXFxcXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr++8jOacrOasoeiOt+WPluWIsOepuuaWh+acrO+8jOeWkeS8vOS9oOayoeacieatpOaWh+S7tiEnO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgKi9cXFxcbiAgICAgICAgICAgICAgICBsZXQgYmFja19jb2RlID0gZ2V0SXRlbSgnaG91c2UuZmlsZV91YScpPT09J+eUteiEkSc/ZmV0Y2god2ViX3VybCxwYXJhbXMpOnJlcXVlc3Qod2ViX3VybCxwYXJhbXMpO1xcXFxuICAgICAgICAgICAgICAgIGlmKGJhY2tfY29kZS5sZW5ndGg+MjApe1xcXFxuICAgICAgICAgICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJyxiYWNrX2NvZGUpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+a6kOeggeW3suiOt+WPlizlubbpg6jliIbmj5LlhaXliLDmlofmnKzljLrln58nXFxcXG4gICAgICAgICAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/plJnor6/vvIzmnKzmrKHojrflj5bliLDnqbrmlofmnKzvvIznlpHkvLzkvaDmsqHmnInmraTmlofku7YhJztcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICBsb2coZS5tZXNzYWdlKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5Y+R55Sf5LqG6ZSZ6K+vOlxcXFxcXFxcbicrZS5tZXNzYWdlO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9ZWxzZSBpZigv5Li76aKY77+lfOWFg+e0oO+/pS8udGVzdChpbnB1dCkpe1xcXFxuICAgICAgICAgICAgbG9nKCfkuLvpopjpk77mjqUnKTtcXFxcbiAgICAgICAgICAgIGxldCB3ZWJfdXJsX2FyciA9IGlucHV0LnNwbGl0KCfvv6UnKTtcXFxcbiAgICAgICAgICAgIGxldCB3ZWJfdXJsID0gd2ViX3VybF9hcnJbd2ViX3VybF9hcnIubGVuZ3RoLTFdO1xcXFxuICAgICAgICAgICAgbGV0IGJhY2tfY29kZSA9IHBhcnNlUGFzdGUod2ViX3VybCk7XFxcXG4gICAgICAgICAgICBpZihiYWNrX2NvZGUubGVuZ3RoPjIwKSB7XFxcXG4gICAgICAgICAgICAgICAgcHV0VmFyKCdob3VzZS51cGxvYWRfY29kZScsYmFja19jb2RlKTtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5rqQ56CB5bey6I635Y+WLOW5tumDqOWIhuaPkuWFpeWIsOaWh+acrOWMuuWfnydcXFxcbiAgICAgICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/plJnor6/vvIzmnKzmrKHojrflj5bov5Tlm57kuLo6XFxcXFxcXFxuJytiYWNrX2NvZGU7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mdnuazlemTvuaOpTpcXFxcXFxcXG4nK2dldFZhcignaG91c2Uud2ViX3VybCcpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiaW5wdXRcXFxcXFxcIlxcXFxufSk7XFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIumAieaLqeaWh+S7tui3r+W+hFxcXFxcXFwiLFxcXFxuICAgIHVybDokKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCgpPT57XFxcXG4gICAgICAgIGxldCBmcCA9ICdodHRwczovL2dpdGNvZGUubmV0L3FxXzMyMzk0MzUxL2RyLy0vcmF3L21hc3Rlci9qcy9maWxlU2VsZWN0LmpzJztcXFxcbiAgICAgICAgbGV0IGYgPSByZXF1aXJlKGZwKTtcXFxcbiAgICAgICAgcmV0dXJuIGYuZmlsZVNlbGVjdGlvblVyaSh7XFxcXG4gICAgICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGZpbmRJdGVtKFxcXFxcXFwiZmlsZVBhdGhcXFxcXFxcIikuZXh0cmE7XFxcXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbShcXFxcXFxcImZpbGVQYXRoXFxcXFxcXCIsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXFxcbiAgICAgICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLndlYl91cmwnLFBBVEgpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xcXFxuICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICBvbkNsaWNrVHlwZTonY29uZmlybScsXFxcXG4gICAgICAgICAgICBmaWxlVHlwZTogXFxcXFxcXCIuanN8LnR4dHwuaGlrZXJ8Lmpzb258Lmh0bWxcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHBhdHRlcm46IDAsXFxcXG4gICAgICAgICAgICByZXF1aXJlVXJsOmZwLFxcXFxuICAgICAgICAgICAgaW5pdGlhbFBhdGg6Z2V0UGF0aCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlLycpLnNsaWNlKDcpLFxcXFxuICAgICAgICAgICAgbWVtb3J5OnRydWUsXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH0pLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbn0pO1xcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTon5LiK5Lyg57G75Z6LJyxcXFxcbiAgICBkZXNjOifkuIrkvKDmlofku7bnmoTnsbvlnoss5b2T5YmN5Li6OicrY29sb3IoZ2V0SXRlbSgnaG91c2UuZmlsZV90eXBlJywn6Z2Z5oCB5paH5Lu2JyksJyNmZjcwMDAnKSxcXFxcbiAgICBjb2xfdHlwZTondGV4dF8xJyxcXFxcbiAgICB1cmw6JChmaWxlX3R5cGVfdGl0bGUsMikuc2VsZWN0KCgpID0+IHtcXFxcbiAgICAgICAgc2V0SXRlbSgnaG91c2UuZmlsZV90eXBlJyxpbnB1dC5yZXBsYWNlKCfwn5GJJywnJykpO1xcXFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXFxcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+S9oOmAieaLqeS6hjonK2lucHV0O1xcXFxuICAgIH0pXFxcXG59KTtcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTon5paH5Lu25a6a5L2NJyxcXFxcbiAgICBkZXNjOifmlofku7bmmK/lkKblsZ7kuo7ph43lrprlkJEs5b2T5YmN5Li6OicrY29sb3IoZ2V0SXRlbSgnaG91c2UuZmlsZV9yZWRpcmVjdCcsJ+acrOWcsCcpLCcjZmY3MDAwJyksXFxcXG4gICAgY29sX3R5cGU6J3RleHRfMScsXFxcXG4gICAgdXJsOiQoZmlsZV9yZWRpcmVjdF90aXRsZSwyKS5zZWxlY3QoKCkgPT4ge1xcXFxuICAgICAgICBzZXRJdGVtKCdob3VzZS5maWxlX3JlZGlyZWN0JyxpbnB1dC5yZXBsYWNlKCfwn5GJJywnJykpO1xcXFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXFxcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+S9oOmAieaLqeS6hjonK2lucHV0O1xcXFxuICAgIH0pXFxcXG59KTtcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTon6K6+5aSHVUEnLFxcXFxuICAgIGRlc2M6J+WPkei1t+e9kemhteivt+axguWktOagh+ivhizlvZPliY3kuLo6Jytjb2xvcihnZXRJdGVtKCdob3VzZS5maWxlX3VhJywn55S16ISRJyksJyNmZjcwMDAnKSxcXFxcbiAgICBjb2xfdHlwZTondGV4dF8xJyxcXFxcbiAgICB1cmw6JChmaWxlX3VhX3RpdGxlLDIpLnNlbGVjdCgoKSA9PiB7XFxcXG4gICAgICAgIHNldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnLGlucHV0LnJlcGxhY2UoJ/CfkYknLCcnKSk7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L2g6YCJ5oup5LqGOicraW5wdXQ7XFxcXG4gICAgfSlcXFxcbn0pO1xcXFxuZnVuY3Rpb24gY29tcGFyZShuYW1lKSB7XFxcXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGl0ZW0pIHtcXFxcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZSA9PT0gbmFtZTtcXFxcbiAgICB9XFxcXG59XFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOifwn5eE77iP546v5aKDJyxcXFxcbiAgICBjb2xfdHlwZTonZmxleF9idXR0b24nLFxcXFxuICAgIHVybDokKCkubGF6eVJ1bGUoKGZpbGVfdHlwZSxjb21wYXJlKT0+e1xcXFxuICAgICAgICBsb2coJ+afpeeci+eOr+Wig+WPmOmHjycpO1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IHVwX2NvZGUgPSBnZXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJywnJyk7XFxcXG4gICAgICAgICAgICBsZXQgZnR5cGUgPSAgZmlsZV90eXBlLmZpbHRlcihjb21wYXJlKGdldEl0ZW0oJ2hvdXNlLmZpbGVfdHlwZScsJ+mdmeaAgeaWh+S7ticpKSlbMF0udmFsdWU7XFxcXG4gICAgICAgICAgICBsZXQgcmVkaXJlY3QgPSBnZXRJdGVtKCdob3VzZS5maWxlX3JlZGlyZWN0Jywn5pys5ZywJykhPT0n5pys5ZywJztcXFxcbiAgICAgICAgICAgIGxldCBjb2RlID0gIXJlZGlyZWN0P3VwX2NvZGU6aW5wdXQ7XFxcXG4gICAgICAgICAgICBsZXQgZW52ID0ge1xcXFxuICAgICAgICAgICAgICAgIHdlYl91cmw6Z2V0VmFyKCdob3VzZS53ZWJfdXJsJywnJyksXFxcXG4gICAgICAgICAgICAgICAgZGV2aWNlOmdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnLCfnlLXohJEnKSxcXFxcbiAgICAgICAgICAgICAgICBmdHlwZTpmdHlwZXx8XFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICByZWRpcmVjdDpyZWRpcmVjdCxcXFxcbiAgICAgICAgICAgICAgICBjb2RlOmNvZGUuc3Vic3RyaW5nKDAsNDApfHxcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgbG9nKGVudik7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytKU09OLnN0cmluZ2lmeShlbnYpO1xcXFxuICAgICAgICAgICAgLy8gYWxlcnQoSlNPTi5zdHJpbmdpZnkoZW52KSk7XFxcXG4gICAgICAgIH1jYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrZS5tZXNzYWdlO1xcXFxuICAgICAgICAgICAgLy8gYWxlcnQoZS5tZXNzYWdlKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sZmlsZV90eXBlLGNvbXBhcmUpXFxcXG59KTtcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTon8J+Tg+aVmeeoiycsXFxcXG4gICAgY29sX3R5cGU6J2ZsZXhfYnV0dG9uJyxcXFxcbiAgICB1cmw6JCgpLng1UnVsZSgoKT0+e1xcXFxuICAgICAgICBsZXQgbXNnID0gJ+asoui/juS9v+eUqOW8gOWPkeiAheabtOWkmuWIhuS6q+W3peWFt1xcXFxcXFxcbjEu6L6T5YWl572R5Z2A5Li65pys5Zyw5paH5Lu26Lev5b6ELGhpa2VyOi8v5oiW6ICFZmlsZTovL+W8gOWktFxcXFxcXFxcbjIu54K55Ye7572R5Z2A6L6T5YWl5qCP5ZCO6Z2i55qE5oyJ6ZKuXFxcXFxcXFxuMy7nnIvmlofmnKzpooTop4jljLrmmK/lkKbmraPnoa5cXFxcXFxcXG40LueCueWHu+S4iuS8oOaMiemSruaPkOS6pOWIsOS7k+W6kyc7XFxcXG4gICAgICAgIGFsZXJ0KG1zZyk7XFxcXG4gICAgfSlcXFxcbn0pO1xcXFxuXFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOifwn5eR77iP5riF56m6JyxcXFxcbiAgICBjb2xfdHlwZTonZmxleF9idXR0b24nLFxcXFxuICAgIHVybDokKCkubGF6eVJ1bGUoKCk9PntcXFxcbiAgICAgICAgY2xlYXJWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJyk7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5bey5riF6Zmk6aKE6KeI5Yy65Z+f5YaF5a65J1xcXFxuICAgIH0pXFxcXG59KTtcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTon8J+TsuekuuS+iycsXFxcXG4gICAgY29sX3R5cGU6J2ZsZXhfYnV0dG9uJyxcXFxcbiAgICB1cmw6JCgpLmxhenlSdWxlKCgpPT57XFxcXG4gICAgICAgIGxldCBkZW1vX2NvZGUgPSBnZXRJdGVtKCdob3VzZS5kZW1vJywnMCcpO1xcXFxuICAgICAgICBpZihkZW1vX2NvZGU9PScwJyl7XFxcXG4gICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLndlYl91cmwnLCdoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvaHRtbC/otYTmupDnvZHkuabnrb4uaHRtbCcpO1xcXFxuICAgICAgICAgICAgZGVtb19jb2RlID0gcGFyc2VJbnQoZGVtb19jb2RlKSsxO1xcXFxuICAgICAgICAgICAgc2V0SXRlbSgnaG91c2UuZGVtbycsZGVtb19jb2RlKycnKTtcXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLndlYl91cmwnLCdmaWxlOi8vL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9ydWxlcy9kekhvdXNlL2h0bWwv6LWE5rqQ572R5Lmm562+Lmh0bWwnKTtcXFxcbiAgICAgICAgICAgIHNldEl0ZW0oJ2hvdXNlLmRlbW8nLCcwJyk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly/lt7Lorr7nva7npLrkvovlnLDlnYAnXFxcXG4gICAgfSlcXFxcbn0pO1xcXFxuXFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOifwn5Ok5LiK5LygJyxcXFxcbiAgICBjb2xfdHlwZTonZmxleF9idXR0b24nLFxcXFxuICAgIHVybDokKCkubGF6eVJ1bGUoKGNhbnVwLGhvdXNlX2RhdGEscHV0X3VybCxmaWxlX3R5cGUpID0+e1xcXFxuICAgICAgICBmdW5jdGlvbiBjb21wYXJlKG5hbWUpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihpdGVtKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZSA9PT0gbmFtZTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBjb25zdCB7Z2V0Tm93Rm9ybWF0RGF0ZX09JC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IHVwX2NvZGUgPSBnZXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJywnJyk7XFxcXG4gICAgICAgIGlmKHVwX2NvZGUubGVuZ3RoIDwgMil7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5rqQ56CB5Yy65peg5YaF5a6577yM6K+35YWI6K6/6Zeu5LiA5Liq6Z2Z5oCB6aG16Z2iJ1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmKCFjYW51cCl7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L2g5LiN5piv5byA5Y+R6ICF77yM5rKh5pyJ5o+Q5Lqk5Yiw5LuT5bqT55qE5p2D5YipISdcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgaW5wdXQgPSBnZXRWYXIoJ2hvdXNlLndlYl91cmwnLCcnKTtcXFxcbiAgICAgICAgbGV0IHdlYl91cmwgPSBpbnB1dC5zcGxpdCgnOycpWzBdO1xcXFxuICAgICAgICBsZXQgZmlsZU5hbWUgPSAnJztcXFxcbiAgICAgICAgaWYoL15oaWtlcjp8XmZpbGU6fF5odHRwOnxeaHR0cHM6fF5cXFxcXFxcXC9zdG9yYWdlXFxcXFxcXFwvfF5cXFxcXFxcXC9zZGNhcmRcXFxcXFxcXC8vLnRlc3Qod2ViX3VybCkpe1xcXFxuICAgICAgICAgICAgZmlsZU5hbWUgPSB3ZWJfdXJsLnNwbGl0KCcvJylbd2ViX3VybC5zcGxpdCgnLycpLmxlbmd0aC0xXTtcXFxcbiAgICAgICAgfWVsc2UgaWYoL+S4u+mimO+/pXzlhYPntKDvv6UvLnRlc3QoaW5wdXQpKXtcXFxcbiAgICAgICAgICAgIGxldCBia2FyciA9IHVwX2NvZGUuc3BsaXQoJ++/pScpO1xcXFxuICAgICAgICAgICAgaWYoYmthcnIubGVuZ3RoPDMpe1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/kupHliarotLTmnb/lhoXlrrnmnInor68nXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBzd2l0Y2ggKGJrYXJyWzFdKSB7XFxcXG4gICAgICAgICAgICAgICAgY2FzZSAnbXlfaG9tZV90aGVtZSc6XFxcXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gdXBfY29kZS5zcGxpdCgn44CMJylbMV0uc3BsaXQoJ+OAjScpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgICAgICAgICBjYXNlICdteV9ob21lX3NpbmdsZSc6XFxcXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gdXBfY29kZS5zcGxpdCgn44CMJylbMV0uc3BsaXQoJ+OAjScpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgICAgICAgICBjYXNlICdqc191cmwnOlxcXFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IHVwX2NvZGUuc3BsaXQoJ++/pScpWzJdLnNwbGl0KCdAJylbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/plJnor6/vvIznvZHpobXpk77mjqXml6DlhoXlrrkhJztcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgdWEgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJyk9PT0n55S16ISRJz8nTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg4LjAuNDMyNC4xNDYgU2FmYXJpLzUzNy4zNic6J01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA5OyBNSSA2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODkuMC40Mzg5LjkwIE1vYmlsZSBTYWZhcmkvNTM3LjM2JztcXFxcbiAgICAgICAgbGV0IGhlYWRlcnMgPSB7XFxcXG4gICAgICAgICAgICAnUmVmZXJlcic6J2h0dHBzOi8vYmxvZy5jc2RuLm5ldCcsXFxcXG4gICAgICAgICAgICBcXFxcXFxcImNvbnRlbnQtdHlwZVxcXFxcXFwiOiBcXFxcXFxcImFwcGxpY2F0aW9uL2pzb25cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICdVc2VyLUFnZW50Jzp1YSxcXFxcbiAgICAgICAgICAgICdBY2NlcHQnOidhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQsICovKjsgcT0wLjAxJyxcXFxcbiAgICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOid6aC1DTicsXFxcXG4gICAgICAgIH07XFxcXG4gICAgICAgIGxldCB0b0NvbXBhcmUgPSAnJztcXFxcbiAgICAgICAgaWYoZmlsZU5hbWUuZW5kc1dpdGgoJy5odG1sJykpe1xcXFxuICAgICAgICAgICAgdG9Db21wYXJlID0gJ+mdmeaAgeaWh+S7tic7XFxcXG4gICAgICAgIH1lbHNlIGlmKC/kuLvpopgvLnRlc3QoZmlsZU5hbWUpKXtcXFxcbiAgICAgICAgICAgIHRvQ29tcGFyZSA9ICfkuLvpobXphY3nva4nXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IGZ0eXBlID0gIGZpbGVfdHlwZS5maWx0ZXIoY29tcGFyZSh0b0NvbXBhcmV8fGdldEl0ZW0oJ2hvdXNlLmZpbGVfdHlwZScsJ+mdmeaAgeaWh+S7ticpKSlbMF0udmFsdWU7XFxcXG4gICAgICAgIGxldCByZWRpcmVjdCA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfcmVkaXJlY3QnLCfmnKzlnLAnKSE9PSfmnKzlnLAnO1xcXFxuICAgICAgICBpZihyZWRpcmVjdCYmIXdlYl91cmwuc3RhcnRzV2l0aCgnaHR0cCcpKXtcXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/nm7Tpk74zMDLph43lrprlkJHnvZHlnYDpk77mjqXlv4XpobtodHRw5byA5aS0JztcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgY29kZSA9ICFyZWRpcmVjdD91cF9jb2RlOndlYl91cmw7XFxcXG4gICAgICAgIGxldCBkYXRhID0ge1xcXFxcXFwicGFyYW1zXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICAgICAge1xcXFxcXFwiZGF0YVxcXFxcXFwiOiB7cnVsZV9uYW1lOiBmaWxlTmFtZSwgXFxcXFxcXCJydWxlX3R5cGVcXFxcXFxcIjogJ+abtOWkmuWIhuS6qycsIFxcXFxcXFwidmVyc2lvblxcXFxcXFwiOmdldE5vd0Zvcm1hdERhdGUoKSxcXFxcXFxcInJ1bGVfdmFsdWVcXFxcXFxcIjogY29kZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfdHlwZTpmdHlwZSwgaXNfcmVkaXJlY3Q6cmVkaXJlY3QsZGV2aWNlVWE6Z2V0SXRlbSgnaG91c2UuZmlsZV91YScpLFxcXFxuICAgICAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogaG91c2VfZGF0YS51c2VybmFtZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiOiBob3VzZV9kYXRhLnBhc3N3b3JkfVxcXFxuICAgICAgICB9O1xcXFxuICAgICAgICBsZXQgdXBwYXJhbXMgPSB7aGVhZGVyczpoZWFkZXJzLGJvZHk6SlNPTi5zdHJpbmdpZnkoZGF0YSksd2l0aEhlYWRlcnM6ZmFsc2UscmVkaXJlY3Q6ZmFsc2UsbWV0aG9kOidQT1NUJ307XFxcXG4gICAgICAgIGxldCBiYWNrbXNnID0gZ2V0SXRlbSgnaG91c2UuZmlsZV91YScpPT09J+eUteiEkSc/ZmV0Y2gocHV0X3VybCx1cHBhcmFtcyk6cmVxdWVzdChwdXRfdXJsLHVwcGFyYW1zKTtcXFxcbiAgICAgICAgdHJ5e1xcXFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IEpTT04ucGFyc2UoYmFja21zZykucmVzdWx0O1xcXFxuICAgICAgICAgICAgbGV0IGRldGFpbCA9IHJlc3VsdC5kZXRhaWw7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytkZXRhaWw7XFxcXG4gICAgICAgIH1jYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5Y+R55Sf5LqG6ZSZ6K+vXFxcXFxcXFxuJytlLm1lc3NhZ2U7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LGNhbnVwLGhvdXNlX2RhdGEscHV0X3VybCxmaWxlX3R5cGUpXFxcXG59KTtcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTon6ZW/5paH5pys6aKE6KeI5Yy65Z+fJyxcXFxcbiAgICBjb2xfdHlwZTondGV4dF8xJyxcXFxcbiAgICB1cmw6J2hpa2VyOi8vZW1wdHknLFxcXFxuICAgIGV4dHJhOiB7dGV4dFNpemU6IDExLGxpbmVWaXNpYmxlOmZhbHNlfVxcXFxufSk7XFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6Z2V0VmFyKCdob3VzZS51cGxvYWRfY29kZScsJycpLnN1YnN0cmluZygwLDEwMjQwKSxcXFxcbiAgICBjb2xfdHlwZTonbG9uZ190ZXh0JyxcXFxcbiAgICBleHRyYToge3RleHRTaXplOiAxMX1cXFxcbn0pO1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi5pu05aSa5YiG5LqrXFxcXFxcXCIpO1xcXFxuc2V0UmVzdWx0KGQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIui9u+WQiOmbhueUn+aIkOaOpeWPo1xcXCIsXFxcInBhdGhcXFwiOlxcXCJnZW5BcGlcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5mdW5jdGlvbiBnZW5SdWxlKG5hbWUsdXJsLGljb24pe1xcXFxuICAgIGljb249aWNvbnx8J2h0dHBzOi8vejMuYXgxeC5jb20vMjAyMS8xMS8xNi9JV0poeGYucG5nJztcXFxcbiAgICBjb25zdCB7Z2V0Tm93Rm9ybWF0RGF0ZSxhcGksZ2V0QXBpfT0kLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcXFxcXCIpO1xcXFxuICAgIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbCA9IGZ1bmN0aW9uKG9sZCxuZXdfc3RyKXtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXQob2xkKS5qb2luKG5ld19zdHIpO1xcXFxuICAgIH07XFxcXG4gICAgbGV0IG11YmFuID0gZ2V0QXBpKCdpbXBvcnRVcmwnKStcXFxcXFxcIjE2OTBcXFxcXFxcIjtcXFxcbiAgICBsZXQgbXViYW5fd29yZD17bmFtZTpcXFxcXFxcIkDovbvlkIjpm4ZcXFxcXFxcIix1cmw6XFxcXFxcXCJA5Zyw5Z2AXFxcXFxcXCIsdmVyOlxcXFxcXFwiQOeJiOacrFxcXFxcXFwiLGljb246XFxcXFxcXCJA5Zu+5qCHXFxcXFxcXCJ9O1xcXFxuICAgIGxldCBtdWJhbl9jb2RlID0gZmV0Y2gobXViYW4pO1xcXFxuICAgIG11YmFuX2NvZGU9bXViYW5fY29kZS5yZXBsYWNlQWxsKG11YmFuX3dvcmQubmFtZSxuYW1lKS5yZXBsYWNlQWxsKG11YmFuX3dvcmQudmVyLGdldE5vd0Zvcm1hdERhdGUoKSkucmVwbGFjZUFsbChtdWJhbl93b3JkLnVybCx1cmwpLnJlcGxhY2VBbGwobXViYW5fd29yZC5pY29uLGljb24pO1xcXFxuICAgIGxldCBpbXBvcnRfY29kZT1cXFxcXFxcIua1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8muWwj+eoi+W6j++8jOaXoOagueagke+8jOiKseato+a4he+8jOS4jeaWreiNpOiFpeS4jeaIkua3q++/pWhvbWVfcnVsZV92Mu+/pWJhc2U2NDovL0BcXFxcXFxcIituYW1lK1xcXFxcXFwiQFxcXFxcXFwiK2Jhc2U2NEVuY29kZShtdWJhbl9jb2RlKTtcXFxcbiAgICB2YXIgcGFzdGVzID0gZ2V0UGFzdGVzKCk7XFxcXG4gICAgdmFyIHVybCA9IHNoYXJlUGFzdGUoaW1wb3J0X2NvZGUscGFzdGVzLnNsaWNlKC0xKVswXSk7XFxcXG4gICAgbGV0IGltcG9ydF9ydWxlPSB1cmwrXFxcXFxcXCJcXFxcXFxcXG5cXFxcXFxcXG7lsI/nqIvluo/vvJpcXFxcXFxcIituYW1lO1xcXFxuICAgIHJldHVybiBpbXBvcnRfcnVsZTtcXFxcbn1cXFxcbiQuZXhwb3J0cy5nZW5SdWxlPWdlblJ1bGU7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5YWo5bGA6Kej5p6Q5YWN5ZeFXFxcIixcXFwicGF0aFxcXCI6XFxcImdsb2JhbFBhcnNlXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuICAgIGZ1bmN0aW9uIGdldEhlYWRlcnMocGxheVVybCl7XFxcXG4gICAgICAgIGxldCBoZWFkZXJzID0ge307XFxcXG4gICAgICAgIGxldCByZWZlcj1wbGF5VXJsLnNwbGl0KFxcXFxcXFwiLy9cXFxcXFxcIilbMF0rXFxcXFxcXCIvL1xcXFxcXFwiK3BsYXlVcmwuc3BsaXQoXFxcXFxcXCIvL1xcXFxcXFwiKVsxXS5zcGxpdChcXFxcXFxcIi9cXFxcXFxcIilbMF07XFxcXG4gICAgICAgIGlmKC9sZWNsb3VkXFxcXFxcXFwuY29tfGJpbGl2aWRlb1xcXFxcXFxcLmNvbS8udGVzdChwbGF5VXJsKSl7XFxcXG4gICAgICAgICAgICBoZWFkZXJzID0ge1xcXFxcXFwiUmVmZXJlclxcXFxcXFwiOiAnaHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tLycsXFxcXFxcXCJVc2VyLUFnZW50XFxcXFxcXCI6XFxcXFxcXCJNb3ppbGxhLzUuMFxcXFxcXFwifVxcXFxuICAgICAgICB9ZWxzZSBpZigvbWd0dlxcXFxcXFxcLmNvbS8udGVzdChwbGF5VXJsKSl7XFxcXG4gICAgICAgICAgICBoZWFkZXJzID0ge1xcXFxcXFwiUmVmZXJlclxcXFxcXFwiOiByZWZlcixcXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjpcXFxcXFxcIk1vemlsbGEvNS4wXFxcXFxcXCJ9XFxcXG4gICAgICAgIH1lbHNlIGlmKC9peGlndWFcXFxcXFxcXC5jb20vLnRlc3QocGxheVVybCkpe1xcXFxuICAgICAgICAgICAgaGVhZGVycyA9IHtcXFxcXFxcIlJlZmVyZXJcXFxcXFxcIjogJ2h0dHBzOi8vd3d3Lml4aWd1YS5jb20vJyxcXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjpcXFxcXFxcIk1vemlsbGEvNS4wXFxcXFxcXCJ9XFxcXG4gICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgaGVhZGVycyA9IHtcXFxcXFxcIlJlZmVyZXJcXFxcXFxcIjogcmVmZXIsJ1VzZXItQWdlbnQnOidEYXJ0LzIuMTMgKGRhcnQ6aW8pJ31cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gaGVhZGVyc1xcXFxuICAgIH1cXFxcbmZ1bmN0aW9uIGlzUGljKHN0cil7XFxcXG4gICAgcmV0dXJuIC9cXFxcXFxcXC4oZ2lmfGpwZ3xqcGVnfHBuZ3xHSUZ8SlBHfFBORykkLy50ZXN0KHN0cik7XFxcXG59XFxcXG5mdW5jdGlvbiBpc1ZpZGVvKHBsYXlVcmwscmVjaGFuZ2Upe1xcXFxuICAgIC8v5rOo5oSPLnBocOS4jeWPr+S7peiiq+aOkumZpOWQpuWImeiejeWFtOino+aekOS4jeS6hiB8LnBocCRcXFxcbiAgICAvL+WmguaenOaYr+aSreaUvuWcsOWdgOWwseebtOaOpei/lOWbnuWcsOWdgOWKoOS4ilVB77yM5LiN5piv55qE6K+d5bCx6L+U5ZueZmFsc2VcXFxcbiAgICAvLyBsZXQgdDEgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcXFxcbiAgICBsZXQgY2FjaGVSZWd4ID0gbmV3IFJlZ0V4cCgnZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLyguKj8pXFxcXFxcXFxcXFxcXFxcXC5tM3U4fGhpa2VyOi8vZmlsZXMvKC4qPylcXFxcXFxcXFxcXFxcXFxcLm0zdTgnKTtcXFxcbiAgICBpZihjYWNoZVJlZ3gudGVzdChwbGF5VXJsKSl7XFxcXG4gICAgICAgIHJldHVybiBwbGF5VXJsXFxcXG4gICAgfVxcXFxuICAgIGZ1bmN0aW9uIGdldEhvc3QodXJsKXtcXFxcbiAgICAgICAgLy8gZmJh55qEcGFyc2VMYXp55aSq5oWi5LqG5Y2D5LiH5Yir55SoXFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gdXJsLm1hdGNoKC9eaHR0cChzKT86XFxcXFxcXFwvXFxcXFxcXFwvKC4qPylcXFxcXFxcXC8vKVswXS5zbGljZSgwLC0xKTtcXFxcbiAgICAgICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICAvKlxcXFxuICAgICAgICBpZih0eXBlb2YobG9nKT09PSd1bmRlZmluZWQnKXtcXFxcbiAgICAgICAgICAgIHJldHVybiAgZmJhLnBhcnNlTGF6eVJ1bGUoJCQkKCkubGF6eVJ1bGUoKHVybCk9PntcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SG9tZSh1cmwpXFxcXG4gICAgICAgICAgICB9LHVybCkpXFxcXG4gICAgICAgIH1lbHNlIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBnZXRIb21lKHVybClcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICAqL1xcXFxuICAgIH1cXFxcbiAgICBsZXQgcFVybD1wbGF5VXJsLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKVswXTsvL+iOt+WPluaKoOaOiea1t+mYlHVh562J5Y+C5pWw55qE572R6aG15pKt5pS+6ZO+5o6lXFxcXG4gICAgbGV0IGhvc3QgPSBnZXRIb3N0KHBVcmwpOyAvLyDojrflj5bln5/lkI1cXFxcbiAgICBpZighaG9zdCl7Ly/liKTmlq3ml6Dln5/lkI3nm7TmjqXkuI3mmK/op4bpopFcXFxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxcXG4gICAgfVxcXFxuICAgIGZ1bmN0aW9uIHByaW50KGRhdGEpe1xcXFxuICAgICAgICBpZih0eXBlb2YobG9nKT09PSd1bmRlZmluZWQnKXtcXFxcbiAgICAgICAgICAgIHJldHVybiAgZmJhLmxvZyhkYXRhKVxcXFxuICAgICAgICB9ZWxzZSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gbG9nKGRhdGEpXFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgcmVjaGFuZ2U9dHlwZW9mKHJlY2hhbmdlKT09PVxcXFxcXFwiZnVuY3Rpb25cXFxcXFxcIj9yZWNoYW5nZTpmdW5jdGlvbihwbGF5VXJsKXtyZXR1cm4gcGxheVVybH07XFxcXG4gICAgbGV0IGV4Y2VwdFdvcmRzID0gJy5qcyR8LmNzcyR8LnRzJHwuaHRtbCR8Lmh0bSR8LmdpZiR8LmpwZyR8LmpwZWckfC5wbmckfC5pY28kfC5zdmckfC50eHQkJy5zcGxpdCgnfCcpLm1hcChpdD0+J1xcXFxcXFxcXFxcXFxcXFwnK2l0KS5qb2luKCd8Jyk7XFxcXG4gICAgdmFyIGV4Y2VwdEtleXMgPSBuZXcgUmVnRXhwKGV4Y2VwdFdvcmRzKTtcXFxcbiAgICBsZXQgZXhjZXB0V29yZHMxID0gJ3JlZmVyZXI9fHVybD0nLnNwbGl0KCd8JykubWFwKGl0PT5pdCkuam9pbignfCcpO1xcXFxuICAgIHZhciBleGNlcHRLZXlzMSA9IG5ldyBSZWdFeHAoZXhjZXB0V29yZHMxKTtcXFxcbiAgICBsZXQgcmVwbGFjZVdvcmRzID0gJ3BsYXltM3U4fG0zdThcXFxcXFxcXC50dicuc3BsaXQoJ3wnKS5tYXAoaXQ9Pml0KS5qb2luKCd8Jyk7XFxcXG4gICAgbGV0IHJlcGxhY2VLZXlzID0gbmV3IFJlZ0V4cChyZXBsYWNlV29yZHMsJ2cnKTtcXFxcbiAgICBsZXQgdmlkZW9Xb3JkcyA9IFxcXFxcXFwiL3ZpZGVvL3Rvc3wubXA0JHwubTN1OCR8LmZsdiR8LmF2aSR8LjNncCR8Lm1wZWckfC53bXYkfC5tb3YkfHJtdmJ8LmRhdCR8Lm1wMyR8Lm00YSR8cXFCRmRvd25sb2FkfG1pbWU9dmlkZW8lMkZ8bWltZV90eXBlPXZpZGVvX3x0eXBlPW0zdTh8cHQ9bTN1OFxcXFxcXFwiLnNwbGl0KCd8JykubWFwKChpdCk9PntcXFxcbiAgICAgICAgLy90eXBlPW1wNFxcXFxuICAgICAgICBpZihpdC5zdGFydHNXaXRoKFxcXFxcXFwiLlxcXFxcXFwiKSl7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ1xcXFxcXFxcXFxcXFxcXFwnK2l0XFxcXG4gICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgcmV0dXJuIGl0XFxcXG4gICAgICAgIH1cXFxcbiAgICB9KS5qb2luKFxcXFxcXFwifFxcXFxcXFwiKTtcXFxcbiAgICBsZXQgdmlkZW9LZXlzID0gbmV3IFJlZ0V4cCh2aWRlb1dvcmRzKTtcXFxcbiAgICBsZXQgclVybCA9IHBVcmwucmVwbGFjZShob3N0LCcnKTsvL+iOt+WPlumZpOW8gOWfn+WQjeeahOWJqeS9memTvuaOpVxcXFxuICAgIGxldCBwVXJsMj1wVXJsLnNwbGl0KFxcXFxcXFwiJlxcXFxcXFwiKVswXS5zcGxpdChcXFxcXFxcIj9cXFxcXFxcIilbMF07Ly/ojrflj5bkuI3luKblj4LmlbDnmoTnvZHpobXpk77mjqVcXFxcbiAgICBsZXQgcnVybDIgPSBwVXJsMi5yZXBsYWNlKGhvc3QsJycpOy8v6I635Y+W6Zmk5byA5Z+f5ZCN55qE5Ymp5L2Z5LiN5bim5Y+C5pWw6ZO+5o6lXFxcXG4gICAgbGV0IGhhc0tleSA9IHZpZGVvS2V5cy50ZXN0KHJVcmwpfHx2aWRlb0tleXMudGVzdChydXJsMik7XFxcXG4gICAgbGV0IHBhclVybCA9IHBVcmwucmVwbGFjZShwVXJsLnNwbGl0KFxcXFxcXFwiP1xcXFxcXFwiKVswXSwnJyk7IC8vIOWIhuWJsumXruWPt+WQjuWJqeS9meWPguaVsOeahOWujOaVtOmTvuaOpVxcXFxuICAgIGxldCBleGNLZXkgPSBleGNlcHRLZXlzMS50ZXN0KHBhclVybCk7XFxcXG4gICAgaWYoclVybC5zcGxpdCgnPycpLmxlbmd0aD4yKXtcXFxcbiAgICAgICAgbGV0IHJVcmwzPXJVcmwuc3BsaXQoXFxcXFxcXCI/XFxcXFxcXCIpWzFdOy8v6I635Y+WP+WIhuWJsuWQjueahOesrOS4gOautVxcXFxuICAgICAgICBoYXNLZXkgPSBoYXNLZXl8fHZpZGVvS2V5cy50ZXN0KHJVcmwzKTtcXFxcbiAgICB9XFxcXG4gICAgaWYoaGFzS2V5JiYhZXhjS2V5KXtcXFxcbiAgICAgICAgbGV0IHRpcHMgPSAn5qOA5rWL5Yiw55aR5Ly85aSa5aqS5L2T55qE5Zyw5Z2AOic7XFxcXG4gICAgICAgIHByaW50KFxcXFxcXFwianPkuK1cXFxcXFxcIit0aXBzK3BVcmwpO1xcXFxuICAgICAgICBwcmludChcXFxcXFxcIuWIhuWJsumXruWPt+WQjjpcXFxcXFxcIitwYXJVcmwpO1xcXFxuICAgIH1cXFxcbiAgICAvLyBsb2coJzE6JysodmlkZW9LZXlzLnRlc3QocFVybCl8fHZpZGVvS2V5cy50ZXN0KHBVcmwyKXx8dmlkZW9LZXlzLnRlc3QocFVybC5yZXBsYWNlKHJlcGxhY2VLZXlzLFxcXFxcXFwiXFxcXFxcXCIpLnNwbGl0KFxcXFxcXFwiJlxcXFxcXFwiKVswXS5zcGxpdChcXFxcXFxcIj9cXFxcXFxcIilbMF0pKSk7XFxcXG4gICAgLy8gbG9nKCcyOicrIWV4Y2VwdEtleXMudGVzdChwVXJsLnNwbGl0KFxcXFxcXFwiP1xcXFxcXFwiKVswXS5zcGxpdCgnJicpWzBdKSk7XFxcXG4gICAgLy8gbG9nKCczOicrIWV4Y2VwdEtleXMxLnRlc3QocFVybC5yZXBsYWNlKHBVcmwuc3BsaXQoXFxcXFxcXCI/XFxcXFxcXCIpWzBdLCcnKSkpO1xcXFxuICAgIGlmICgoaGFzS2V5fHx2aWRlb0tleXMudGVzdChyVXJsLnJlcGxhY2UocmVwbGFjZUtleXMsXFxcXFxcXCJcXFxcXFxcIikuc3BsaXQoXFxcXFxcXCImXFxcXFxcXCIpWzBdLnNwbGl0KFxcXFxcXFwiP1xcXFxcXFwiKVswXSkgKSYmICFleGNlcHRLZXlzLnRlc3QocFVybDIpJiYhZXhjZXB0S2V5czEudGVzdChwVXJsMikpIHtcXFxcbiAgICAgICAgaWYoISgvVXNlci1BZ2VudHxSZWZlcmVyQC8udGVzdChwbGF5VXJsKSkpe1xcXFxuICAgICAgICAgICAgaWYoL2xlY2xvdWRcXFxcXFxcXC5jb218YmlsaXZpZGVvLy50ZXN0KHBsYXlVcmwpKXtcXFxcbiAgICAgICAgICAgICAgICBwbGF5VXJsKz1cXFxcXFxcIjt7UmVmZXJlckBodHRwczovL3d3dy5iaWxpYmlsaS5jb20vJiZVc2VyLUFnZW50QE1vemlsbGEvNS4wfVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfWVsc2UgaWYoL2l4aWd1YVxcXFxcXFxcLmNvbS8udGVzdChwbGF5VXJsKSl7XFxcXG4gICAgICAgICAgICAgICAgcGxheVVybCs9XFxcXFxcXCIjaXN2aWRlbz10cnVlIzt7UmVmZXJlckBodHRwczovL3d3dy5peGlndWEuY29tLyYmVXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGVsc2UgaWYoL21ndHZcXFxcXFxcXC5jb218Ynl0ZWFtb25lLy50ZXN0KHBsYXlVcmwpKXtcXFxcbiAgICAgICAgICAgICAgICBwbGF5VXJsKz1cXFxcXFxcIjt7VXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1lbHNlIGlmKC9wdHdvXFxcXFxcXFwud2tmaWxlXFxcXFxcXFwuY29tLy50ZXN0KHBsYXlVcmwpJiYvdXJsPS8udGVzdChwbGF5VXJsKSl7XFxcXG4gICAgICAgICAgICAgICAgcGxheVVybD1wbGF5VXJsLnNwbGl0KFxcXFxcXFwidXJsPVxcXFxcXFwiKVsxXStcXFxcXFxcIjt7UmVmZXJlckBodHRwczovL2ZhbnR1YW4udHZ9XFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIC8vIOWkhOeQhuWkp+W4iOWFhOS5i+exu+eahGFwcFxcXFxuICAgICAgICAgICAgLy8gZWxzZXtcXFxcbiAgICAgICAgICAgIC8vICAgICBwbGF5VXJsKz1cXFxcXFxcIjt7VXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIC8vIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBwbGF5VXJsPXJlY2hhbmdlKHBsYXlVcmwpO1xcXFxuICAgICAgICBpZighLyNpc1ZpZGVvPXRydWUjLy50ZXN0KHBsYXlVcmwpKXtcXFxcbiAgICAgICAgICAgIHBsYXlVcmwrPVxcXFxcXFwiI2lzVmlkZW89dHJ1ZSNcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICAvLyBsZXQgdDIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcXFxcbiAgICAgICAgLy8gcHJpbnQoJ+WIpOaWrWlzVmlkZW/ogJfml7Y6JysodDItdDEpKTtcXFxcbiAgICAgICAgcmV0dXJuIHBsYXlVcmw7XFxcXG4gICAgfWVsc2V7XFxcXG4gICAgICAgIC8vIGxldCB0MiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcXFxuICAgICAgICAvLyBwcmludCgn5Yik5pataXNWaWRlb+iAl+aXtjonKyh0Mi10MSkpO1xcXFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgfVxcXFxufVxcXFxuZnVuY3Rpb24gY29tUGFyc2UocGFyU3RyLGVqLG9ubHliYWNrLGh0bWwpe1xcXFxuICAgIC8v5YiX6KGo77yM5qCH6aKY77yM5Zu+54mH77yM5o+P6L+w77yM6ZO+5o6l77yM5YaF5a65XFxcXG4gICAgZWogPSBlanx8ZmFsc2U7Ly/mnInkuoznuqdcXFxcbiAgICBvbmx5YmFjaz1vbmx5YmFja3x8ZmFsc2U7Ly/lj6rov5Tlm57mlbDmja5cXFxcbiAgICBodG1sID0gaHRtbHx8Z2V0UmVzQ29kZSgpO1xcXFxuICAgIGh0bWwgPSB0eXBlb2YoaHRtbCk9PT0nc3RyaW5nJz9odG1sOmh0bWwuaHRtbDtcXFxcbiAgICByZXR1cm4gJC50b1N0cmluZygocGFyU3RyLGVqLG9ubHliYWNrLGh0bWwsaXNQaWMpPT57XFxcXG4gICAgICAgIGxldCB0PXBhclN0ci5zcGxpdChcXFxcXFxcIjtcXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCBkPVtdO1xcXFxuICAgICAgICAvLyBsZXQgbGlzdD1wZGZhKGdldFJlc0NvZGUoKSx0WzBdKTtcXFxcbiAgICAgICAgbGV0IGxpc3Q9cGRmYShodG1sLHRbMF0pO1xcXFxuICAgICAgICBsZXQgbGF6eSA9ICQoJycpLmxhenlSdWxlKCgpPT57XFxcXG4gICAgICAgICAgICBjb25zdCB7bGF6eVBhcnNlfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2dsb2JhbFBhcnNlP3J1bGU96YGT6ZW/5LuT5bqTUHJvJyk7XFxcXG4gICAgICAgICAgICByZXR1cm4gbGF6eVBhcnNlKGlucHV0KVxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZm9yKGxldCBpIGluIGxpc3Qpe1xcXFxuICAgICAgICAgICAgbGV0IF9waWMgPSB0WzJdP3BkKGxpc3RbaV0sdFsyXSk6Jyc7XFxcXG4gICAgICAgICAgICBpZihpc1BpYyhfcGljKSYmIS9AUmVmZXJlcj0vLnRlc3QoX3BpYykpe1xcXFxuICAgICAgICAgICAgICAgIF9waWMrPSdAUmVmZXJlcj0nXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsZXQgaXQ9e1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOnBkZmgobGlzdFtpXSx0WzFdKSxcXFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOl9waWMsXFxcXG4gICAgICAgICAgICAgICAgZGVzYzpwZGZoKGxpc3RbaV0sdFszXSksXFxcXG4gICAgICAgICAgICAgICAgdXJsOmVqP3BkKGxpc3RbaV0sdFs0XSk6cGQobGlzdFtpXSx0WzRdKStsYXp5XFxcXG4gICAgICAgICAgICB9O1xcXFxuICAgICAgICAgICAgaWYodC5sZW5ndGg+NSl7Ly/lhoXlrrnvvIznlKjkuo7mkJzntKJcXFxcbiAgICAgICAgICAgICAgICBpdC5jb250ZW50PXBkZmgobGlzdFtpXSx0WzVdKVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgZC5wdXNoKGl0KTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZihvbmx5YmFjayl7XFxcXG4gICAgICAgICAgICByZXR1cm4gZFxcXFxuICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgIHNldFJlc3VsdChkKVxcXFxuICAgICAgICB9XFxcXG4gICAgfSxwYXJTdHIsZWosb25seWJhY2ssaHRtbCxpc1BpYylcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gaXNCYWRWaWRlbyh2aWRlb1VybCkgey8v5piv5Z2P55qE6KeG6aKRXFxcXG4gICAgbGV0IGRtUGF0aCA9ICdoaWtlcjovL2ZpbGVzL2NhY2hlL2RpYW9tYW8udHh0JzsvL+WQiuavm+aooeW8j+i/h+a7pOaWh+S7tui3r+W+hFxcXFxuICAgIGxldCBkbVVybHM7XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgZG1VcmxzID0gcmVxdWVzdChkbVBhdGgpLnRyaW0oKS5zcGxpdCgnXFxcXFxcXFxuJykuZmlsdGVyKGl0ID0+IGl0ICYmICFpdC5zdGFydHNXaXRoKCcvLycpKTtcXFxcbiAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgIGRtVXJscyA9IFtdO1xcXFxuICAgIH1cXFxcblxcXFxuICAgIGZ1bmN0aW9uIGhhc0RtKHZpZGVvVXJsLCBkbVVybHMpIHsvL+aSreaUvuWcsOWdgOaYr+WQpuS4uuWQiuavm+inhumikVxcXFxuICAgICAgICBpZiAoZG1VcmxzLmxlbmd0aCA8IDEpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGZ1bmN0aW9uIHByaW50KHN0cil7XFxcXG4gICAgICAgICAgICBpZih0eXBlb2YobG9nKSE9PSd1bmRlZmluZWQnKXtcXFxcbiAgICAgICAgICAgICAgICBsb2coc3RyKTtcXFxcbiAgICAgICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgICAgIGZiYS5sb2coc3RyKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBmb3IgKGxldCBkbVVybCBvZiBkbVVybHMpIHtcXFxcbiAgICAgICAgICAgIGlmICgobmV3IFJlZ0V4cChkbVVybCkpLnRlc3QodmlkZW9VcmwpKSB7Ly/mkq3mlL7lnLDlnYDljIXlkKvlkIrmr5vmoIflv5fnmoTlnLDlnYBcXFxcbiAgICAgICAgICAgICAgICBwcmludCgn5ZCK5q+b6KeG6aKRLOiHquWKqOi/h+a7pDonK3ZpZGVvVXJsKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHByaW50KCfpnZ7lkIrmr5vop4bpopEs5Y+v5pKt5pS+OicrdmlkZW9VcmwpO1xcXFxuICAgICAgICByZXR1cm4gZmFsc2VcXFxcbiAgICB9XFxcXG5cXFxcbiAgICBmdW5jdGlvbiBpc0RtKHJldCkge1xcXFxuICAgICAgICBpZiAoIXJldCkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIHRydWVcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gaGFzRG0ocmV0LnNwbGl0KCcjJylbMF0uc3BsaXQoJzsnKVswXSwgZG1VcmxzKVxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gaXNEbSh2aWRlb1VybClcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gbGF6eVBhcnNlKHBsYXlVcmwsbXMsdG0scmVjaGFuZ2Upe1xcXFxuICAgIC8vIGxvZygn6LCD55So5LuT5bqT5YWN5ZeF5o6i5Lyg5Y+C6LaF5pe25Li6OicrbXMpO1xcXFxuICAgIHRtID0gcGFyc2VJbnQodG0pfHw1MDAwO1xcXFxuICAgIGNvbnN0IHtpc1ZpZGVvLGdldEhlYWRlcnMsaXNCYWRWaWRlb30gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9nbG9iYWxQYXJzZT9ydWxlPemBk+mVv+S7k+W6k1BybycpO1xcXFxuICAgIGxldCByZWFsVXJsID0gaXNWaWRlbyhwbGF5VXJsLHJlY2hhbmdlKTtcXFxcbiAgICAvL2xvZyhyZWFsVXJsKTtcXFxcbiAgICBpZih0eXBlb2YocmVhbFVybCk9PSdzdHJpbmcnKXsvL2Jvb2zlgLzlsLHmmK/lpLHotKVcXFxcbiAgICAgICAgdHJ5e1xcXFxuICAgICAgICAgICAgbGV0IHJ1cmw9cmVhbFVybC5zcGxpdChcXFxcXFxcIjtcXFxcXFxcIilbMF0uc3BsaXQoXFxcXFxcXCIjXFxcXFxcXCIpWzBdO1xcXFxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVxdWVzdChydXJsLHt0aW1lb3V0OnRtfSkpLnVybFxcXFxuICAgICAgICB9Y2F0Y2goZSl7XFxcXG4gICAgICAgICAgICByZXR1cm4gcmVhbFVybFxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIC8vcmV0dXJuIHJlYWxVcmxcXFxcbiAgICB9XFxcXG5cXFxcbiAgICAvL2xvZyhcXFxcXFxcIuiuv+mXrui2heaXtjpcXFxcXFxcIit0bSk7XFxcXG4gICAgbG9nKFxcXFxcXFwi5bCd6K+V6YGT6ZW/5LuT5bqTeDXlhY3ll4U6XFxcXFxcXCIrcGxheVVybCk7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJfeDVqeFVybFxcXFxcXFwiKTtcXFxcbiAgICBsZXQgYmFkPSQoXFxcXFxcXCLnvZHnu5zkuI3kvbPmiJbogIXnlpHkvLzlr7nmlrnnvZHnq5nmjILkuobvvIzkvaDopoHmn6XnnIvlhbbnvZHpobXlkJfvvJ9cXFxcXFxcIikuY29uZmlybSgocGxheVVybCk9PntcXFxcbiAgICAgICAgbG9nKFxcXFxcXFwi572R56uZ55yL6LW35p2l5oyC5LqGOlxcXFxcXFwiK3BsYXlVcmwpO1xcXFxuICAgICAgICByZXR1cm4gcGxheVVybFxcXFxuICAgIH0scGxheVVybCk7XFxcXG4gICAgdHJ5e1xcXFxuICAgICAgICB2YXIgYmFjaz1yZXF1ZXN0KHBsYXlVcmwse2hlYWRlcnM6IGdldEhlYWRlcnMocGxheVVybCksdGltZW91dDp0bX0pO1xcXFxuICAgICAgICAvL3ZhciBiYWNrPWZldGNoKHBsYXlVcmwse2hlYWRlcnM6IHsnVXNlci1BZ2VudCc6IFBDX1VBfX0pO1xcXFxuICAgICAgICBpZighYmFjayl7XFxcXG4gICAgICAgICAgICBsb2coXFxcXFxcXCLnvZHnq5lcXFxcXFxcIitwbGF5VXJsK1xcXFxcXFwi56Gu5a6e5ZWl5Lmf5rKh6L+U5ZueXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIGJhZFxcXFxuICAgICAgICB9ZWxzZSBpZigvI0VYVElORi8udGVzdChiYWNrKSl7XFxcXG4gICAgICAgICAgICAvL2xldCBsY2FjaGU9XFxcXFxcXCIvc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL2NhY2hlL3ZpZGVvLm0zdThcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIC8vd3JpdGVGaWxlKGxjYWNoZSxiYWNrKTtcXFxcbiAgICAgICAgICAgIC8vcmV0dXJuIGxjYWNoZStcXFxcXFxcIiMjXFxcXFxcXCIrcGxheVVybCtcXFxcXFxcIiNpc1ZpZGVvPXRydWUjXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIHBsYXlVcmw9Y2FjaGVNM3U4KHBsYXlVcmwpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIHBsYXlVcmxcXFxcbiAgICAgICAgfWVsc2UgaWYoKCEv6Kem5Y+R5LqG6Ziy55uX6ZO+fOacquaOiOadg3zmjqXlj6PpmLLnm5cvLnRlc3QoYmFjaykpJiYoIS9odHRwfHVybC8udGVzdChiYWNrKSkmJighL21zZ3xjb2RlfGh0bWwvLnRlc3QoYmFjaykpKXtcXFxcbiAgICAgICAgICAgIGxvZyhiYWNrKTtcXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/nlpHkvLzlr7nmlrnmlbDmja7liqDlr4bkuobvvIzlhbfkvZPmlbDmja7nnIvml6Xlv5cnXFxcXG4gICAgICAgIH1cXFxcbiAgICB9Y2F0Y2goZSl7XFxcXG4gICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcXFxuICAgICAgICByZXR1cm4gYmFkXFxcXG4gICAgfVxcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIGJhY2s9SlNPTi5wYXJzZShiYWNrKTtcXFxcbiAgICAgICAgbGV0IHJlYWxVcmw9YmFjay51cmw7XFxcXG4gICAgICAgIGlmKHR5cGVvZihyZWFsVXJsKT09XFxcXFxcXCJ1bmRlZmluZWRcXFxcXFxcInx8IXJlYWxVcmwpe1xcXFxuICAgICAgICAgICAgbG9nKGJhY2spO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/pgZPplb/ku5PlupPop6PmnpDlpLHotKXvvIHov5Tlm57mkq3mlL7lnLDlnYDkuLrnqbpcXFxcXFxcIlxcXFxuICAgICAgICB9IGVsc2UgaWYodHlwZW9mKGlzVmlkZW8ocmVhbFVybCxyZWNoYW5nZSkpPT0nc3RyaW5nJyl7XFxcXG4gICAgICAgICAgICByZXR1cm4gaXNWaWRlbyhyZWFsVXJsLHJlY2hhbmdlKTtcXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICByZXR1cm4gcmVhbFVybCtcXFxcXFxcIiNpc1ZpZGVvPXRydWUjXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgLy9lbHNle1xcXFxuICAgICAgICAvL3JlYWxVcmwrPVxcXFxcXFwiO3tVc2VyLUFnZW50QE1vemlsbGEvNS4wfVxcXFxcXFwiO1xcXFxuICAgICAgICAvLyB9XFxcXG4gICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgIGxvZyhcXFxcXFxcIuajgOa1i+WIsOino+aekOWPo+mdnmpzb27plJnor686XFxcXFxcXCIrZS5tZXNzYWdlKycs5byA5aeLeDXlhY3ll4XmjqInKTtcXFxcbiAgICAgICAgLy8gcmVxdWlyZSgnaHR0cHM6Ly9oamRobnguY29kaW5nLm5ldC9wL2hpa2VyL2QvZHIvZ2l0L3Jhdy9tYXN0ZXIvanMvbHNnLmpzJyk7Ly/lvJXnlKjmnKzlnLDlgqjlrZjmj5Lku7ZcXFxcbiAgICAgICAgY29uc3QgbHNnPSQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9sb2NhbFN0b3JhZ2U/cnVsZT3pgZPplb/ku5PlupNQcm9cXFxcXFxcIik7Ly/lvJXnlKjlrZDpobXpnaLmnKzlnLDlgqjlrZjmj5Lku7ZcXFxcbiAgICAgICAgbGV0IGxvY2FsX21zID0gbHNnLmdldEl0ZW0oJ3RpbWVvdXQnKTtcXFxcbiAgICAgICAgbGV0IG1zID0gcGFyc2VJbnQobXMpfHxwYXJzZUludChsb2NhbF9tcyl8fDUwMDA7XFxcXG4gICAgICAgIGxldCBtYXhfY291bnQ9TWF0aC5jZWlsKG1zLzI1MCk7XFxcXG4gICAgICAgIGxvZyhcXFxcXFxcIuacrOasoeWXheaOoui2heaXtjpcXFxcXFxcIittcytcXFxcXFxcIuWFseiuoeW+heaKk+WMhTpcXFxcXFxcIittYXhfY291bnQrXFxcXFxcXCLmrKFcXFxcXFxcIik7XFxcXG4gICAgICAgIHNob3dMb2FkaW5nKCfll4XmjqLkuK3vvIzoi6XlpLHotKXlsLHliIfmjaJ3ZWLll4XmjqIuLi4nKTtcXFxcbiAgICAgICAgbGV0IF94NSA9ICQudG9TdHJpbmcoKGlzVmlkZW8scmVjaGFuZ2UscGxheVVybCxtYXhfY291bnQsUENfVUEsaXNCYWRWaWRlbyk9PntcXFxcbiAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgaWYodHlwZW9mKGZiYSk9PSd1bmRlZmluZWQnfHwhZmJhKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZiYSA9IGZ5X2JyaWRnZV9hcHA7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZihyZXF1ZXN0KT09J3VuZGVmaW5lZCd8fCFyZXF1ZXN0KXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwoZmJhLmdldEludGVybmFsSnMoKSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhlLm1lc3NhZ2UpO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBmYmEucHV0VmFyKFxcXFxcXFwiX3g1anhVcmxcXFxcXFxcIixwbGF5VXJsKTtcXFxcbiAgICAgICAgICAgICAgICBpZih3aW5kb3cuY291bnQgPT0gbnVsbCl7XFxcXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5jb3VudD0xO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBsZXQgdGV4dD0nJztcXFxcbiAgICAgICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgICAgICB0ZXh0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXFxcXFxcXCJib2R5XFxcXFxcXCIpLmlubmVyVGV4dDtcXFxcbiAgICAgICAgICAgICAgICB9Y2F0Y2ggKGUpIHtmYmEubG9nKGUubWVzc2FnZSl9XFxcXG4gICAgICAgICAgICAgICAgaWYoL+inpuWPkeS6humYsuebl+mTvnzmnKrmjojmnYN85o6l5Y+j6Ziy55uXLy50ZXN0KHRleHQpJiZ3aW5kb3cuY291bnQ9PT0xKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFxcXFxcIuajgOa1i+WIsOacieaOiOadg++8jOW8gOWni+i/h+aOiOadg1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgLy9sb2NhdGlvbi5yZWxvYWQoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZj1mYmEuZ2V0VmFyKFxcXFxcXFwiX3g1anhVcmxcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIHdpbmRvdy5jb3VudCsrO1xcXFxuICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coJ2NvdW50Oicrd2luZG93LmNvdW50KycsbWF4X2NvdW50OicrbWF4X2NvdW50KTtcXFxcbiAgICAgICAgICAgICAgICBpZiggd2luZG93LmNvdW50ID49IG1heF9jb3VudCl7XFxcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcXFxcXCLotoXov4dcXFxcXFxcIittYXhfY291bnQqMjUwK1xcXFxcXFwi5q+r56eS5pyq6I635Y+W5Yiw6LWE5rqQ5Zyw5Z2A77yM6Lez5Yiw5rqQ572R6aG1LOS7peS4i+aYr+WKoOi9vei/h+eahOWcsOWdgFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXFxcXFxcXCJib2R5XFxcXFxcXCIpLmlubmVyVGV4dDtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZiYS5sb2codGV4dCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaCAoZSkge2ZiYS5sb2coZS5tZXNzYWdlKX1cXFxcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhKU09OLnN0cmluZ2lmeShfZ2V0VXJscygpKSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYmEuZ2V0VmFyKFxcXFxcXFwiX3g1anhVcmxcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG11dGVNZShlbGVtKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnBhdXNlKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB2YXIgdmlkZW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFxcXFxcInZpZGVvXFxcXFxcXCIpLCBhdWRpb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXFxcXFwiYXVkaW9cXFxcXFxcIiksIHYyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFxcXFxcImVtYmVkXFxcXFxcXCIpLCB2MyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcXFxcXCIjcGxheWVyXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2aWRlb3MsIGZ1bmN0aW9uICh2aWRlbykge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZU1lKHZpZGVvKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cXFxcbiAgICAgICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwoYXVkaW9zLCBmdW5jdGlvbiAoYXVkaW8pIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGVNZShhdWRpbyk7XFxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHYyLCBmdW5jdGlvbiAodikge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZU1lKHYpO1xcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcXFxuICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2MywgZnVuY3Rpb24gKHYpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGVNZSh2KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cXFxcbiAgICAgICAgICAgICAgICB2YXIgdXJscyA9IF9nZXRVcmxzKCk7XFxcXG4gICAgICAgICAgICAgICAgLy8gZmJhLmxvZyhKU09OLnN0cmluZ2lmeSh1cmxzKSk7XFxcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHVybHMpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1PXVybHNbaV07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnl7dT1kZWNvZGVVUklDb21wb25lbnQodSk7fWNhdGNoKGUpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU9dW5lc2NhcGUodSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoL3VybD1odHRwLy50ZXN0KHUpKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gdS5zcGxpdChcXFxcXFxcInVybD1cXFxcXFxcIikuc2xpY2UoLTEpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coXFxcXFxcXCJ1cmzliIblibI6XFxcXFxcXCIrdSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZigvdXJsPVxcXFxcXFxcLy8udGVzdCh1KSYmL1xcXFxcXFxcLm0zdTgvLnRlc3QodSkpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3N0ID0gdS5tYXRjaCgvKC4qKVxcXFxcXFxcL1xcXFxcXFxcLyguKj8pXFxcXFxcXFwvLylbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IGhvc3QrdS5zcGxpdChcXFxcXFxcInVybD1cXFxcXFxcIikuc2xpY2UoLTEpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coXFxcXFxcXCJ1cmzliIblibI6XFxcXFxcXCIrdSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKC92aWQ9aHR0cC8udGVzdCh1KSl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IHUuc3BsaXQoXFxcXFxcXCJ2aWQ9XFxcXFxcXCIpLnNsaWNlKC0xKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXFxcXFwidmlk5YiG5YmyOlxcXFxcXFwiK3UpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoL3ZpZD1cXFxcXFxcXC8vLnRlc3QodSkmJi9cXFxcXFxcXC5tM3U4Ly50ZXN0KHUpKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdCA9IHUubWF0Y2goLyguKilcXFxcXFxcXC9cXFxcXFxcXC8oLio/KVxcXFxcXFxcLy8pWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBob3N0K3Uuc3BsaXQoXFxcXFxcXCJ2aWQ9XFxcXFxcXCIpLnNsaWNlKC0xKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXFxcXFwidmlk5YiG5YmyOlxcXFxcXFwiK3UpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigvXFxcXFxcXFw/KC4qKT1odHRwLy50ZXN0KHUpJiYvXFxcXFxcXFwubTN1OC8udGVzdCh1KSl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFxcXFxcXFwiaHR0cFxcXFxcXFwiK3Uuc3BsaXQoL1xcXFxcXFxcPyguKik9aHR0cC8pLnNsaWNlKC0xKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXFxcXFwi5YW25LuW5YiG5YmyOlxcXFxcXFwiK3UpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgLy98aW5kZXhcXFxcXFxcXC5tM3U4JFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigvXFxcXFxcXFwvMVxcXFxcXFxcLm0zdTgvLnRlc3QodSkpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdT11LnJlcGxhY2UoLyZmcm9tPS4qfCZuZXh0PS4qfCZqdW1wPS4qLywnJyk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhbFVybCA9IGlzVmlkZW8odSxyZWNoYW5nZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YocmVhbFVybCk9PSdzdHJpbmcnJiYhaXNCYWRWaWRlbyh1KSl7Ly/ov4fmu6TlkIrmr5vop4bpopFcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Z5X2JyaWRnZV9hcHAuc2V0V2ViVWEoUENfVUEpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZihmYmEuZ2V0SGVhZGVyVXJsKSE9PSd1bmRlZmluZWQnJiZ0eXBlb2YocmVjaGFuZ2UpIT09J2Z1bmN0aW9uJyl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCBiYWNrVXJsID0gZmJhLmdldEhlYWRlclVybCh1LnJlcGxhY2UoXFxcXFxcXCI7e1xcXFxcXFwiLFxcXFxcXFwiI2lzVmlkZW89dHJ1ZSM7e1xcXFxcXFwiKSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiYWNrVXJsID0gZmJhLmdldEhlYWRlclVybCh1cmxzW2ldKS5yZXBsYWNlKCc7eycsJyNpZ25vcmVJbWc9dHJ1ZSMjaXNWaWRlbz10cnVlIzt7Jyk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1MSA9IGJhY2tVcmwuc3BsaXQoJyNpZ25vcmVJbWcnKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHUyID0gJyNpZ25vcmVJbWcnK2JhY2tVcmwuc3BsaXQoJyNpZ25vcmVJbWcnKVsxXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEgPSB1MS5yZXBsYWNlKC8mZnJvbT0uKnwmbmV4dD0uKnwmanVtcD0uKi8sJycpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigvdXJsPWh0dHAvLnRlc3QodTEpKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxID0gdTEuc3BsaXQoXFxcXFxcXCJ1cmw9XFxcXFxcXCIpLnNsaWNlKC0xKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoL3VybD1cXFxcXFxcXC8vLnRlc3QodTEpJiYvXFxcXFxcXFwubTN1OC8udGVzdCh1MSkpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvc3QxID0gdTEubWF0Y2goLyguKilcXFxcXFxcXC9cXFxcXFxcXC8oLio/KVxcXFxcXFxcLy8pWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEgPSBob3N0MSt1MS5zcGxpdChcXFxcXFxcInVybD1cXFxcXFxcIikuc2xpY2UoLTEpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmJhLmxvZyhcXFxcXFxcInVybOWIhuWJsjpcXFxcXFxcIit1KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKC92aWQ9aHR0cC8udGVzdCh1MSkpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEgPSB1MS5zcGxpdChcXFxcXFxcInZpZD1cXFxcXFxcIikuc2xpY2UoLTEpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZigvdmlkPVxcXFxcXFxcLy8udGVzdCh1MSkmJi9cXFxcXFxcXC5tM3U4Ly50ZXN0KHUxKSl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdDEgPSB1MS5tYXRjaCgvKC4qKVxcXFxcXFxcL1xcXFxcXFxcLyguKj8pXFxcXFxcXFwvLylbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IGhvc3QxK3UxLnNwbGl0KFxcXFxcXFwidmlkPVxcXFxcXFwiKS5zbGljZSgtMSlbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigvXFxcXFxcXFw/KC4qKT1odHRwLy50ZXN0KHUxKSYmL1xcXFxcXFxcLm0zdTgvLnRlc3QodTEpKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxID0gXFxcXFxcXCJodHRwXFxcXFxcXCIrdTEuc3BsaXQoL1xcXFxcXFxcPyguKik9aHR0cC8pLnNsaWNlKC0xKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrVXJsID0gdTEgKyB1MjtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmJhLmxvZygn6L+U5Zue6Ieq5Yqo5YqgY29va2ll6ZO+5o6lOicrYmFja1VybCk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coJ+i/lOWbnumTvuaOpTonK3UrJ+W5tuiHquWKqOWKoOS6hmNvb2tpZSzlhbfkvZNjb29raWXlnKjop4bpopHmkq3mlL7lpITmn6XnnIsnKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhY2tVcmw7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcXFxcXCLov5Tlm57ku5PlupN4NeWFjeWXhee7k+aenDpcXFxcXFxcIityZWFsVXJsKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxVcmxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhlLm1lc3NhZ2UpXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICAgICAgLy8gZnlfYnJpZGdlX2FwcC5sb2coJ3g15aSn6IyD5Zu06ZSZ6K+vOicrZS5tZXNzYWdlKTtcXFxcbiAgICAgICAgICAgICAgICBhbGVydCgneDXlpKfojIPlm7TplJnor686JytlLm1lc3NhZ2UpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/miqXplJnnu5PmnZ94NSdcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSxpc1ZpZGVvLHJlY2hhbmdlLHBsYXlVcmwsbWF4X2NvdW50LFBDX1VBLGlzQmFkVmlkZW8pO1xcXFxuICAgICAgICBsZXQgdXNlV2ViPWxzZy5nZXRJdGVtKFxcXFxcXFwi6YCa5YWNXFxcXFxcXCIsXFxcXFxcXCJYNVxcXFxcXFwiKT09PVxcXFxcXFwiV0VCXFxcXFxcXCI7XFxcXG4gICAgICAgIC8vbG9nKFxcXFxcXFwi5LuT5bqT5L2/55Sod2Vi6YCa5YWN5pu/5LujeDU6XFxcXFxcXCIrdXNlV2ViKTtcXFxcbiAgICAgICAgbGV0IHJ1bGVIZWFkPXVzZVdlYiYmcGFyc2VJbnQoZ2V0QXBwVmVyc2lvbigpKT49MjMzOT9cXFxcXFxcIndlYlJ1bGU6Ly9cXFxcXFxcIjpcXFxcXFxcIng1UnVsZTovL1xcXFxcXFwiO1xcXFxuICAgICAgICBsZXQgeDVVcmwgPSBydWxlSGVhZCtwbGF5VXJsKyAnQCcgK194NTtcXFxcbiAgICAgICAgcmV0dXJuIHg1VXJsXFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiB4NVBhcnNlUHJvKHg1bGlzdCx4NVRpbWVvdXQsaXNWaWRlbyl7XFxcXG4gICAgbGV0IGJwYXRoID0gJ2ZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL3J1bGVzL2R6SG91c2UvaHRtbC/mtbfpmJTll4XmjqLlmaguaHRtbCc7XFxcXG4gICAgbGV0IGJjb2RlID0gZmV0Y2goYnBhdGgpO1xcXFxuICAgIGlmKCFiY29kZXx8IS9meV9icmlkZ2VfYXBwLy50ZXN0KGJjb2RlKSl7XFxcXG4gICAgICAgIGxvZygn5pys5Zyw5pyq5a6J6KOF5ZeF5o6i5Zmo77yM5byA5aeL5a6J6KOFJyk7XFxcXG4gICAgICAgIGNvbnN0IHthcGl9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IGh0bWwgPSBmZXRjaChhcGkuaG9zdCsnL3J1bGVsaXN0Lmpzb24/aWQ9MjA1NScpO1xcXFxuICAgICAgICBpZigv5rW36ZiU6KeG55WMLy50ZXN0KGh0bWwpKXtcXFxcbiAgICAgICAgICAgIHdyaXRlRmlsZShicGF0aCxodG1sKTtcXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUoYnBhdGgsZmV0Y2goJ2h0dHBzOi8vaGpkaG54LmNvZGluZy5uZXQvcC9oaWtlci9kL2RyL2dpdC9yYXcvbWFzdGVyL2h0bWwvZ2V0VmlkZW8uaHRtbCcpKVxcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIHg1VGltZW91dCA9IHBhcnNlSW50KHg1VGltZW91dCl8fDUwMDA7XFxcXG4gICAgbGV0IG1heF9jb3VudD0oeDVUaW1lb3V0LzI1MCk7IC8v5qC55o2u6LaF5pe26Ieq5Yqo6K6h566X5LqG5Y+v5omn6KGM55qE5qyh5pWwXFxcXG4gICAgcHV0VmFyKCd4NUxpc3QnLEpTT04uc3RyaW5naWZ5KHg1bGlzdCkpO1xcXFxuICAgIGxldCBfeDUgPSAkLnRvU3RyaW5nKChpc1ZpZGVvLCBtYXhfY291bnQseDVUaW1lb3V0LGlzQmFkVmlkZW8pID0+IHtcXFxcbiAgICAgICAgLy/liJ3lp4vljJZmYmHlkoxyZXF1c3RcXFxcbiAgICAgICAgaWYgKHR5cGVvZiAoZmJhKSA9PSAndW5kZWZpbmVkJyB8fCAhZmJhKSB7XFxcXG4gICAgICAgICAgICB2YXIgZmJhID0gZnlfYnJpZGdlX2FwcDtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgaWYgKHR5cGVvZiAocmVxdWVzdCkgPT0gJ3VuZGVmaW5lZCcgfHwgIXJlcXVlc3QpIHtcXFxcbiAgICAgICAgICAgICAgICBldmFsKGZiYS5nZXRJbnRlcm5hbEpzKCkpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBmYmEubG9nKGUubWVzc2FnZSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS1cXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGlmICh3aW5kb3cuY291bnQgPT0gbnVsbCkge1xcXFxuICAgICAgICAgICAgICAgIHdpbmRvdy5jb3VudCA9IDE7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsZXQgdGV4dD0nJztcXFxcbiAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgdGV4dD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxcXFxcXFwiYm9keVxcXFxcXFwiKS5pbm5lclRleHQ7XFxcXG4gICAgICAgICAgICB9Y2F0Y2ggKGUpIHtmYmEubG9nKGUubWVzc2FnZSl9XFxcXG4gICAgICAgICAgICBpZigv6Kem5Y+R5LqG6Ziy55uX6ZO+fOacquaOiOadg3zmjqXlj6PpmLLnm5cvLnRlc3QodGV4dCkmJndpbmRvdy5jb3VudD09MSl7XFxcXG4gICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XFxcXG4gICAgICAgICAgICAgICAgZmJhLmxvZyhcXFxcXFxcIuajgOa1i+WIsOacieaOiOadg++8jOW8gOWni+i/h+aOiOadg1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHdpbmRvdy5jb3VudCsrO1xcXFxuICAgICAgICAgICAgLy8gZmJhLmxvZygnY291bnQ6JyArIHdpbmRvdy5jb3VudCArICcsbWF4X2NvdW50OicgKyBtYXhfY291bnQpO1xcXFxuICAgICAgICAgICAgaWYgKHdpbmRvdy5jb3VudCA+PSBtYXhfY291bnQpIHtcXFxcbiAgICAgICAgICAgICAgICBmYmEuY2xlYXJWYXIoJ3g1TGlzdCcpO1xcXFxuICAgICAgICAgICAgICAgIGZiYS5oaWRlTG9hZGluZygpO1xcXFxuICAgICAgICAgICAgICAgIGxldCBmbXNnID0gJ+mBk+mVv+S7k+W6k+mAmuWFjeino+aekOWksei0pSzljp/lm6A66LaF5pe2Jyt4NVRpbWVvdXQrJ+avq+enkic7XFxcXG4gICAgICAgICAgICAgICAgZmJhLmxvZyhmbXNnKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytmbXNnO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKTtcXFxcbiAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgIGZ1bmN0aW9uIG11dGVNZShlbGVtKSB7XFxcXG4gICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgIGVsZW0ucGF1c2UoKTtcXFxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgIHZhciB2aWRlb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXFxcXFwidmlkZW9cXFxcXFxcIiksIGF1ZGlvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcXFxcXCJhdWRpb1xcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgIHYyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFxcXFxcImVtYmVkXFxcXFxcXCIpLCB2MyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcXFxcXCIjcGxheWVyXFxcXFxcXCIpO1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHZpZGVvcywgZnVuY3Rpb24gKHZpZGVvKSB7XFxcXG4gICAgICAgICAgICAgICAgbXV0ZU1lKHZpZGVvKTtcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbChhdWRpb3MsIGZ1bmN0aW9uIChhdWRpbykge1xcXFxuICAgICAgICAgICAgICAgIG11dGVNZShhdWRpbyk7XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodjIsIGZ1bmN0aW9uICh2KSB7XFxcXG4gICAgICAgICAgICAgICAgbXV0ZU1lKHYpO1xcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHYzLCBmdW5jdGlvbiAodikge1xcXFxuICAgICAgICAgICAgICAgIG11dGVNZSh2KTtcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdmFyIHVybHMgPSBfZ2V0VXJscygpO1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgZm9yIChsZXQgaSBpbiB1cmxzKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHU9dXJsc1tpXTtcXFxcbiAgICAgICAgICAgICAgICAvL3U9ZGVjb2RlVVJJQ29tcG9uZW50KHUpO1xcXFxuICAgICAgICAgICAgICAgIHRyeXt1PWRlY29kZVVSSUNvbXBvbmVudCh1KTt9Y2F0Y2goZSl7XFxcXG4gICAgICAgICAgICAgICAgICAgIHU9dW5lc2NhcGUodSk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGlmKC91cmw9aHR0cC8udGVzdCh1KSl7XFxcXG4gICAgICAgICAgICAgICAgICAgIHUgPSB1LnNwbGl0KFxcXFxcXFwidXJsPVxcXFxcXFwiKS5zbGljZSgtMSlbMF07XFxcXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoL3ZpZD1odHRwLy50ZXN0KHUpKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgdSA9IHUuc3BsaXQoXFxcXFxcXCJ2aWQ9XFxcXFxcXCIpLnNsaWNlKC0xKVswXTtcXFxcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZigvXFxcXFxcXFw/KC4qKT1odHRwLy50ZXN0KHUpKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgdSA9IFxcXFxcXFwiaHR0cFxcXFxcXFwiK3Uuc3BsaXQoL1xcXFxcXFxcPyguKik9aHR0cC8pLnNsaWNlKC0xKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgLy9mYmEubG9nKFxcXFxcXFwi5YW25LuW5YiG5YmyOlxcXFxcXFwiK3UpO1xcXFxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKC9cXFxcXFxcXC8xXFxcXFxcXFwubTN1OCQvLnRlc3QodSkpe1xcXFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgdT11LnJlcGxhY2UoLyZmcm9tPS4qfCZuZXh0PS4qfCZqdW1wPS4qLywnJyk7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJlYWxVcmwgPSBpc1ZpZGVvKHUpO1xcXFxuICAgICAgICAgICAgICAgIGlmIChyZWFsVXJsJiYhaXNCYWRWaWRlbyh1KSkgey8v6L+H5ruk5ZCK5q+bXFxcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcXFxcXCLku5PlupN4NeWFjeWXhee7k+aenDpcXFxcXFxcIiArIHJlYWxVcmwpO1xcXFxuICAgICAgICAgICAgICAgICAgICBmYmEuY2xlYXJWYXIoJ3g1TGlzdCcpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbFVybFxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgZmJhLmxvZyhlLm1lc3NhZ2UpXFxcXG4gICAgICAgIH1cXFxcbiAgICB9LCBpc1ZpZGVvLCBtYXhfY291bnQseDVUaW1lb3V0LGlzQmFkVmlkZW8pO1xcXFxuICAgIGNvbnN0IGxzZz0kLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvbG9jYWxTdG9yYWdlP3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcXFxcXCIpO1xcXFxuICAgIGxldCB1c2VXZWI9bHNnLmdldEl0ZW0oXFxcXFxcXCLpgJrlhY1cXFxcXFxcIixcXFxcXFxcIlg1XFxcXFxcXCIpPT09XFxcXFxcXCJXRUJcXFxcXFxcIjtcXFxcbiAgICAvL2xvZyhcXFxcXFxcIuS7k+W6k+S9v+eUqHdlYumAmuWFjeabv+S7o3g1OlxcXFxcXFwiK3VzZVdlYik7XFxcXG4gICAgbGV0IHJ1bGVIZWFkPXVzZVdlYiYmcGFyc2VJbnQoZ2V0QXBwVmVyc2lvbigpKT49MjMzOT9cXFxcXFxcIndlYlJ1bGU6Ly9cXFxcXFxcIjpcXFxcXFxcIng1UnVsZTovL1xcXFxcXFwiO1xcXFxuICAgIHJldHVybiBydWxlSGVhZCticGF0aCsnQCcgKyBfeDU7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIExhenlQYXJzZUZhc3QocGxheVVybExpc3QsZ2V0VGltZW91dCx4NVRpbWVvdXQpe1xcXFxuICAgIGNvbnN0IHtpc1ZpZGVvLGdldEhlYWRlcnMseDVQYXJzZVByb30gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9nbG9iYWxQYXJzZT9ydWxlPemBk+mVv+S7k+W6k1BybycpO1xcXFxuICAgIC8vIGxvZygn5byA5aeL5omn6KGMJytwbGF5VXJsTGlzdC5sZW5ndGgrJ+S4quWcsOWdgOeahOaJuemHj+WXheaOojonK3BsYXlVcmxMaXN0KTtcXFxcbiAgICBsb2coJ+W8gOWni+aJp+ihjCcrcGxheVVybExpc3QubGVuZ3RoKyfkuKrlnLDlnYDnmoTmibnph4/ll4XmjqInKTtcXFxcbiAgICBsZXQgcGxheVVybHMgPSBwbGF5VXJsTGlzdC5tYXAoKGl0KT0+e1xcXFxuICAgICAgICByZXR1cm4ge1xcXFxuICAgICAgICAgICAgdXJsOml0LnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKVswXSxcXFxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIC8vXFxcXFxcXCJVc2VyLUFnZW50XFxcXFxcXCI6IFxcXFxcXFwiRGFydC8yLjEzIChkYXJ0OmlvKVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjpcXFxcXFxcIk1vemlsbGEvNS4wXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgIHRpbWVvdXQ6IGdldFRpbWVvdXRcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIGxldCBiaHRtbCA9IGJhdGNoRmV0Y2gocGxheVVybHMpO1xcXFxuICAgIGxldCB2aWRlb3MgPSBbXTtcXFxcbiAgICBsZXQgeDVsaXN0ID0gW107XFxcXG4gICAgZm9yKGxldCBpIGluIGJodG1sKXtcXFxcbiAgICAgICAgbGV0IG9yZGVyID0gcGFyc2VJbnQoaSkrMTtcXFxcbiAgICAgICAgbGV0IHRuYW1lPW9yZGVyKyflj7fop6PmnpDnvZHlnYA6JztcXFxcbiAgICAgICAgLy9sb2codG5hbWUpO1xcXFxuICAgICAgICBsZXQgdHVybD1wbGF5VXJsTGlzdFtpXS5zcGxpdChcXFxcXFxcIjtcXFxcXFxcIilbMF07XFxcXG4gICAgICAgIGxldCBqbmFtZT1wbGF5VXJsTGlzdFtpXS5zcGxpdChcXFxcXFxcIjtcXFxcXFxcIikubGVuZ3RoPjE/cGxheVVybExpc3RbaV0uc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpWzFdOlxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgIHRuYW1lKz1qbmFtZTtcXFxcbiAgICAgICAgbGV0IGJhY2tjb2RlID0gYmh0bWxbaV07XFxcXG4gICAgICAgIGlmKCghL3VybHxodHRwLy50ZXN0KGJhY2tjb2RlKSkmJighLyNFWFRJTkYvLnRlc3QoYmFja2NvZGUpKSl7XFxcXG4gICAgICAgICAgICBsb2codG5hbWUrdHVybCsn5pyJ6Zeu6aKYLOWPr+iDveWKoOWvhuaIluiAheaMguS6hicpO1xcXFxuICAgICAgICAgICAgY29udGludWU7XFxcXG4gICAgICAgIH1lbHNlIGlmKC8jRVhUSU5GLy50ZXN0KGJhY2tjb2RlKSl7XFxcXG4gICAgICAgICAgICAvL2xldCBsY2FjaGU9XFxcXFxcXCIvc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL2NhY2hlL3ZpZGVvX1xcXFxcXFwiK3RuYW1lK1xcXFxcXFwiLm0zdThcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIC8vd3JpdGVGaWxlKGxjYWNoZSxiYWNrY29kZSk7XFxcXG4gICAgICAgICAgICAvL3ZpZGVvcy5wdXNoKGxjYWNoZSk7XFxcXG4gICAgICAgICAgICBsZXQgcFVybD1jYWNoZU0zdTgodHVybCk7XFxcXG4gICAgICAgICAgICB2aWRlb3MucHVzaChwVXJsKTtcXFxcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBsZXQgdXJsID0gSlNPTi5wYXJzZShiYWNrY29kZSkudXJsO1xcXFxuICAgICAgICAgICAgaWYoL15odHRwLy50ZXN0KHVybCkpe1xcXFxuICAgICAgICAgICAgICAgIGxldCByZWFsVmlkZW8gPSBpc1ZpZGVvKHVybCk7XFxcXG4gICAgICAgICAgICAgICAgaWYodHlwZW9mKHJlYWxWaWRlbyk9PSdzdHJpbmcnKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgbG9nKHRuYW1lKyflt7Lop6PmnpDlh7rop4bpopE6JytyZWFsVmlkZW8pO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZihqbmFtZSl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFsVmlkZW8rPVxcXFxcXFwi4piFXFxcXFxcXCIram5hbWVcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICB2aWRlb3MucHVzaChyZWFsVmlkZW8pO1xcXFxuICAgICAgICAgICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgICAgICAgICBsb2codG5hbWUrJ+ino+aekOWHuuS4jeefpemBk+S7gOS5iOS4nOilvzonK3VybCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHVybCs9XFxcXFxcXCIjaXNWaWRlbz10cnVlI1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZihqbmFtZSl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmwrPVxcXFxcXFwi4piFXFxcXFxcXCIram5hbWVcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICB2aWRlb3MucHVzaCh1cmwpO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgICAgIGxvZyh0bmFtZSsn5Li6anNvbuaOpeWPo+S4lOaXoOi/lOWbnuinhumikeWcsOWdgOaVsOaNrjonK3BsYXlVcmxMaXN0W2ldKydcXFxcXFxcXG4nK2JhY2tjb2RlKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBsb2codG5hbWUrJ+S4ung15o6l5Y+jLOWKoOWFpXg15ZeF5o6i5YiX6KGoJyk7XFxcXG4gICAgICAgICAgICB4NWxpc3QucHVzaChwbGF5VXJsTGlzdFtpXSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgLy8gbG9nKHZpZGVvcyk7XFxcXG4gICAgaWYodmlkZW9zLmxlbmd0aD4wKXtcXFxcbiAgICAgICAgaWYoZ2V0VmFyKCdkcC5jYWNoZVZpZGVvJywndHJ1ZScpPT09J3RydWUnJiZwYXJzZUludChnZXRBcHBWZXJzaW9uKCkpPj0yMjU1KVxcXFxuICAgICAgICB7XFxcXG4gICAgICAgICAgICBsb2coXFxcXFxcXCLlsIrmlaznmoTprZTmlq3nlKjmiLfvvIzop4bpopHnvJPlrZjlt7LlkK/nlKjvvIzor7flsL3mg4Xkuqvlj5fnnIvliafml7blhYlcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBsZXQgdmlkZW9zQ2FjaGU9dmlkZW9zLm1hcCgoaXQpPT57XFxcXG4gICAgICAgICAgICAgICAgbGV0IGhlYWRlcnM9e307XFxcXG4gICAgICAgICAgICAgICAgaWYoaXQuc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpLmxlbmd0aD4xKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhlYWQgPSBpdC5zcGxpdCgnOycpWzFdO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZigvQC8udGVzdChoZWFkKSYmL3t8fS8udGVzdChoZWFkKSl7XFxcXG4vL2hlYWQgPSBoZWFkLnJlcGxhY2UoL3t8fS9nLCcnKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQgPSBoZWFkLnNwbGl0KFxcXFxcXFwie1xcXFxcXFwiKVsxXS5zcGxpdChcXFxcXFxcIn1cXFxcXFxcIilbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkID0gaGVhZC5zcGxpdCgnJiYnKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiBoZWFkKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0gaGVhZFtpXS5zcGxpdCgnQCcpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9aGVhZFtpXS5zcGxpdCgnQCcpWzFdLnJlcGxhY2UoLzsvLCfvvJvvvJsnKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzW2tleV0gPSB2YWx1ZTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6aXQuc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpWzBdLnNwbGl0KFxcXFxcXFwi4piFXFxcXFxcXCIpWzBdLFxcXFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOntcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6aGVhZGVyc1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICB2YXIgZGF0YT1iYXRjaENhY2hlTTN1OCh2aWRlb3NDYWNoZSk7XFxcXG4gICAgICAgICAgICBkYXRhPWRhdGEubWFwKChpdCxpZCk9PntcXFxcbiAgICAgICAgICAgICAgICBsZXQgZXh0cmE9XFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICBpZih2aWRlb3NbaWRdLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKS5sZW5ndGg+MSl7XFxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhPVxcXFxcXFwiO1xcXFxcXFwiK3ZpZGVvc1tpZF0uc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpWzFdO1xcXFxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKHZpZGVvc1tpZF0uc3BsaXQoXFxcXFxcXCLimIVcXFxcXFxcIikubGVuZ3RoPjEpe1xcXFxuICAgICAgICAgICAgICAgICAgICBleHRyYT1cXFxcXFxcIuKYhVxcXFxcXFwiK3ZpZGVvc1tpZF0uc3BsaXQoXFxcXFxcXCLimIVcXFxcXFxcIilbMV07XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgICAgICAgICAgaWYoaXQrXFxcXFxcXCJcXFxcXFxcIiE9XFxcXFxcXCJudWxsXFxcXFxcXCIpe1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQrZXh0cmFcXFxcbiAgICAgICAgICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpZGVvc1tpZF1cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIC8vbG9nKGRhdGEpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIGRhdGFcXFxcbiAgICAgICAgICAgIC8vcmV0dXJuIHZpZGVvc1xcXFxuICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgIHJldHVybiB2aWRlb3NcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBsb2coJ+WFseaciScreDVsaXN0Lmxlbmd0aCsn5LiqeDXlnLDlnYDov5vooYzova7mtYHll4XmjqInKTtcXFxcbiAgICAvL+ayoeacieeahOivneWwseW8gOWni+S+neasoXg15ZeF5o6iXFxcXG4gICAgc2hvd0xvYWRpbmcoJ+WXheaOouS4re+8jOiLpeWksei0peWwseWIh+aNondlYuWXheaOoi4uLicpO1xcXFxuICAgIHJldHVybiB4NVBhcnNlUHJvKHg1bGlzdCx4NVRpbWVvdXQsaXNWaWRlbyk7XFxcXG59XFxcXG52YXIgbGF6eT0kKCcnKS5sYXp5UnVsZSgoKT0+e1xcXFxuICAgIHRyeXtcXFxcbiAgICAgICAgcmVhbFVybD1pbnB1dDtcXFxcbiAgICAgICAgZXZhbChcXFxcXFxcInZhciBjb25maWdfZHAgPVxcXFxcXFwiICsgZmV0Y2goXFxcXFxcXCJoaWtlcjovL2ZpbGVzL2NhY2hlL015UGFyc2VTZXQuanNvblxcXFxcXFwiKSk7XFxcXG4gICAgICAgIGV2YWwoZmV0Y2goY29uZmlnX2RwLmNqKSk7XFxcXG4gICAgICAgIGxvZyhpbnB1dCsnLT7mraPlnKjmlq3mj5LprZTmlLnniYjop6PmnpAuLi4nKTtcXFxcbiAgICAgICAgLy8g5Yqg5YWl6LaF5pe26K6+572u77yM5bu66K6u5Zyo6aaW6aG16K6+572uXFxcXG4gICAgICAgIHJldHVybiBheXRtUGFyc2UocmVhbFVybClcXFxcbiAgICB9Y2F0Y2goZSl7XFxcXG4gICAgICAgIHJldHVybiBpbnB1dFxcXFxuICAgIH1cXFxcbn0pO1xcXFxuJC5leHBvcnRzLmlzUGljPWlzUGljO1xcXFxuJC5leHBvcnRzLmlzVmlkZW89aXNWaWRlbztcXFxcbiQuZXhwb3J0cy5pc0JhZFZpZGVvPWlzQmFkVmlkZW87XFxcXG4kLmV4cG9ydHMuY29tUGFyc2U9Y29tUGFyc2U7XFxcXG4kLmV4cG9ydHMuZ2V0SGVhZGVycz1nZXRIZWFkZXJzO1xcXFxuJC5leHBvcnRzLmxhenlQYXJzZT1sYXp5UGFyc2U7XFxcXG4kLmV4cG9ydHMueDVQYXJzZVBybz14NVBhcnNlUHJvO1xcXFxuJC5leHBvcnRzLkxhenlQYXJzZUZhc3Q9TGF6eVBhcnNlRmFzdDtcXFxcbiQuZXhwb3J0cy5sYXp5PWxhenk7XFxcIn0se1xcXCJuYW1lXFxcIjpcXFwi5Lu75Yqh5LuT5bqT5o6l5Y+jXFxcIixcXFwicGF0aFxcXCI6XFxcInRhc2tDYWxsXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuU3RyaW5nLnByb3RvdHlwZS5zdHJpcCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMucmVwbGFjZSgvKF5cXFxcXFxcXHMqKXwoXFxcXFxcXFxzKiQpL2csIFxcXFxcXFwiXFxcXFxcXCIpOyB9O1xcXFxuZnVuY3Rpb24gdGFza19yZXEodGFza19hcGksdGFzaykgeyAvLyDpgJrnlKjlj5HpgIHku5PlupNwb3N06LCD55So5Lu75Yqh6K+35rGCXFxcXG4gICAgY29uc3Qge2dldEZpbGV9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXFxcXFwiKTtcXFxcbiAgICBsZXQgaG91c2VGaWxlID0gZ2V0RmlsZXx8ZmFsc2U7XFxcXG4gICAgaWYoIWhvdXNlRmlsZSl7XFxcXG4gICAgICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcXFxuICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KHRhc2tfYXBpLCB7XFxcXG4gICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXFxcbiAgICAgICAgfSxcXFxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcXFxuICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwiZGF0YVxcXFxcXFwiOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwidHlwZVxcXFxcXFwiOiB0YXNrLm1vZGV8fCdydW4nLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcImZ1bmNcXFxcXFxcIjogdGFzay5mdW5jfHwnJyxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjogdGFzay5wYXJhbXN8fFtdXFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcImF1dGhcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogaG91c2VfZGF0YS51c2VybmFtZXx8XFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiOiBob3VzZV9kYXRhLnBhc3N3b3JkfHxcXFxcXFxcIlxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCdcXFxcbiAgICB9KTtcXFxcbiAgICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gdGFza191cGxvYWQodGFzayl7IC8vIOmAmueUqOS7u+WKoeWPkeW4g+aWsOWinuWPiuS/ruaUueWKn+iDvVxcXFxuICAgIGNvbnN0IHthcGksZ2V0RmlsZX0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcXFxcXCIpO1xcXFxuICAgIGxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXFxcbiAgICBpZighaG91c2VGaWxlKXtcXFxcbiAgICAgICAgc2V0SXRlbSgnaXNfaG91c2VfdmlwJywgJ2ZhbHNlJyk7XFxcXG4gICAgfVxcXFxuICAgIGxldCBhcGlfdXJsID0gYXBpLmhvc3QrJy9oaWtlcnVsZS90YXNrL2FkZCc7XFxcXG4gICAgbGV0IGhvdXNlX2RhdGEgPSBob3VzZUZpbGUoKTtcXFxcbiAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChhcGlfdXJsLCB7XFxcXG4gICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXFxcbiAgICAgICAgfSxcXFxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcXFxuICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwiZGF0YVxcXFxcXFwiOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiB0YXNrLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicHljb2RlXFxcXFxcXCI6IHRhc2sucHljb2RlLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIm5vdGVcXFxcXFxcIjogdGFzay5ub3RlLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInRlc3RfY29kZVxcXFxcXFwiOiB0YXNrLnRlc3RfY29kZSxcXFxcbiAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwiYXV0aFxcXFxcXFwiOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBob3VzZV9kYXRhLnVzZXJuYW1lfHxcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCI6IGhvdXNlX2RhdGEucGFzc3dvcmR8fFxcXFxcXFwiXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcXFxuICAgIH0pO1xcXFxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiB0YXNrX2NhbGwoaWQsZnVuYyxwYXJhbXMpe1xcXFxuICAgIGNvbnN0IHthcGl9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXFxcXFwiKTtcXFxcbiAgICBsZXQgdGFza19hcGkgPSBhcGkuaG9zdCsnL2hpa2VydWxlL3Rhc2svcnVuLycraWQ7XFxcXG4gICAgbGV0IHRhc2sgPSB7XFxcXG4gICAgICAgIG1vZGU6J2NhbGwnLFxcXFxuICAgICAgICBmdW5jOmZ1bmMsXFxcXG4gICAgICAgIHBhcmFtczpwYXJhbXN8fFtdXFxcXG4gICAgfTtcXFxcbiAgICByZXR1cm4gdGFza19yZXEodGFza19hcGksdGFzayk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHRhc2tfcmVuYW1lKGlkLG5ld190YXNrX25hbWUpe1xcXFxuICAgIGNvbnN0IHthcGksZ2V0RmlsZX0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcXFxcXCIpO1xcXFxuICAgIGxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXFxcbiAgICBpZighaG91c2VGaWxlKXtcXFxcbiAgICAgICAgc2V0SXRlbSgnaXNfaG91c2VfdmlwJywgJ2ZhbHNlJyk7XFxcXG4gICAgfVxcXFxuICAgIGxldCBob3VzZV9kYXRhID0gaG91c2VGaWxlKCk7XFxcXG4gICAgbGV0IHRhc2tfYXBpID0gYXBpLmhvc3QrJy9oaWtlcnVsZS90YXNrL3JlbmFtZS8nK2lkO1xcXFxuICAgIHRhc2tfYXBpID0gdGFza19hcGkrJz9uYW1lPScraG91c2VfZGF0YS51c2VybmFtZSsnJnBhc3N3b3JkPScraG91c2VfZGF0YS5wYXNzd29yZCsnJnRhc2tfbmFtZT0nK25ld190YXNrX25hbWU7XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgbGV0IHJlc3VsdCA9IEpTT04ucGFyc2UoZmV0Y2godGFza19hcGkse30pKTtcXFxcbiAgICAgICAgaWYocmVzdWx0LnN0YXR1cz09MCl7XFxcXG4gICAgICAgICAgICByZXR1cm4gIHJlc3VsdC5kZXRhaWxcXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCsnJytyZXN1bHQuZGV0YWlsXFxcXG4gICAgICAgIH1cXFxcbiAgICB9Y2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxcXG4gICAgICAgIHJldHVybiAnJytlLm1lc3NhZ2VcXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHRhc2tfY2hhbmdlX3N0YXRlKGlkKXtcXFxcbiAgICBjb25zdCB7YXBpLGdldEZpbGV9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXFxcXFwiKTtcXFxcbiAgICBsZXQgaG91c2VGaWxlID0gZ2V0RmlsZXx8ZmFsc2U7XFxcXG4gICAgaWYoIWhvdXNlRmlsZSl7XFxcXG4gICAgICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcXFxuICAgIGxldCB0YXNrX2FwaSA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvdGFzay9jaGFuZ2Vfc3RhdGUvJytpZDtcXFxcbiAgICB0YXNrX2FwaSA9IHRhc2tfYXBpKyc/bmFtZT0nK2hvdXNlX2RhdGEudXNlcm5hbWUrJyZwYXNzd29yZD0nK2hvdXNlX2RhdGEucGFzc3dvcmQ7XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgbGV0IHJlc3VsdCA9IEpTT04ucGFyc2UoZmV0Y2godGFza19hcGkse30pKTtcXFxcbiAgICAgICAgaWYocmVzdWx0LnN0YXR1cz09MCl7XFxcXG4gICAgICAgICAgICByZXR1cm4gIHJlc3VsdC5kZXRhaWxcXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCsnJytyZXN1bHQuZGV0YWlsXFxcXG4gICAgICAgIH1cXFxcbiAgICB9Y2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxcXG4gICAgICAgIHJldHVybiAnJytlLm1lc3NhZ2VcXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHRhc2tfcnVuKGlkKXtcXFxcbiAgICBjb25zdCB7YXBpfSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFxcXFxcIik7XFxcXG4gICAgbGV0IHRhc2tfYXBpID0gYXBpLmhvc3QrJy9oaWtlcnVsZS90YXNrL3J1bi8nK2lkO1xcXFxuICAgIGxldCB0YXNrID0ge307XFxcXG4gICAgcmV0dXJuIHRhc2tfcmVxKHRhc2tfYXBpLHRhc2spO1xcXFxufVxcXFxuXFxcXG4kLmV4cG9ydHMudGFza0NhbGwgPSB0YXNrX2NhbGw7XFxcXG4kLmV4cG9ydHMudGFza1J1biA9IHRhc2tfcnVuO1xcXFxuJC5leHBvcnRzLnRhc2tSZXEgPSB0YXNrX3JlcTtcXFxcbiQuZXhwb3J0cy50YXNrVXBsb2FkID0gdGFza191cGxvYWQ7XFxcXG4kLmV4cG9ydHMudGFza1JlbmFtZSA9IHRhc2tfcmVuYW1lO1xcXFxuJC5leHBvcnRzLnRhc2tDaGFuZ2VTdGF0ZSA9IHRhc2tfY2hhbmdlX3N0YXRlO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuWFqOWxgOWCqOWtmFxcXCIsXFxcInBhdGhcXFwiOlxcXCJsb2NhbFN0b3JhZ2VcXFwiLFxcXCJydWxlXFxcIjpcXFwibGV0IGxvY2FsU3RvcmFnZSA9IChmdW5jdGlvbigpIHtcXFxcbiAgICBldmFsUHJpdmF0ZUpTKFxcXFxcXFwiandVS3dOVGlQR2NXU0xDWEI1WHRBWHdiNkxRYlZ5SEQrMFhKN2wwN2NlMD1cXFxcXFxcIik7XFxcXG4gICAgLy9wYXRodG89dW5kZWZpbmVkO1xcXFxuICAgIGV2YWxQcml2YXRlSlMoXFxcXFxcXCI0QzBZeFJZbkdDWWtnRlJYdHBsL0N6NXpMNWhoNGpDQ3p0YituZytXb2t5bVE4b1VyelM5bEE4eXhDNWFGYWRuU0VteUhLTWJyYWZsUnFYQ25OUkhEbGs2dWU4eUhUTzE2bEJQcnB3Z3M1amYwUGhyQXRvVEpJRTBaSG45bUthUTRKZDJlcnFiNEk1NWJlV0lldWdLc0RzMjExU3pJTlE1eUpnU2gxZFZ1Tnp6eFJHSmc0MEZtVHVWbVhWZk4xeGcyV0lHSEJFbWtWbkd4bU9SaFBPTkErUTVWd1BtZHA0MS9oemUzZUlzVXZobzdWQ0JnSzRyYUptUGFsSVJCQlZsQ1ZnbjhGa1dtZktxWm8rVlcrb0JjSDdocmNyc1NsQ1NqQmFuZ1QvN3N5V0h4S1loZWhVMGthTVlqbldGZzFFbTBjbU5SdG9tQ3NIejFCOHEzMk9lUUhvYXdkV3h6S09hTUhPWERCalJvakE4RS9haDBXUk95emlxUlN4bC9tOGRoQmQwZjlwaFl6LzVTVS96SkQ1MlgvOUVDMTZXVlZkcFNXMzNha1JIUnNsUHBSbFRXRjkrQXlSbVJ3MGVaT0VzMW85UU1QQVFVZkF4Yll5RkhnenR3L08yZEpScEh5VG1pQmlhYXFUY2l2eDZ2OXp5dkJ6MDR3STFBYVNDdWkrZFR1VTNsdTV4ZEV0M0FqdDZaM2lEWE9WY0VQMEVERjc0NzRQUVU2SkVadXdlOTdTY2g0Ymkxd0IxWEhaU2ZJdGRsWVlvR2VkM0xMcGJtREFJUmNpdjByQW9wOFZtUWNUdDJLM0xmaDFSRFlZMFl0dlJjSDQ5T3ZwRFJIL3hhNUZjOE1ZM0RyRm9BN3Fjb0Y0ZUNnaVZCZkJnSlI2OCtMcFFLN3RPa2c4azllYyszTlN4SlRoY2w4ZDZ5Tnd4VDlUazE3emVKZ2Q2TW95WVpJcFdRTGxGNll2Yk9kRVdoam1uQTc4d0MwaFd6K1htNmhRTVNxdEZ3K2JoRmY3Y0JHVTNhYXRQRm1kQ1kyRWRYZmgwSVlXODV3ZE95TWZpd1c3L3ZWVHA5aUUwMEkzRjA5d0dIa0dLaFZiTHVlQWtZZTd6ekpYUjd0aGFGb3I2SDdxTG1KamJSUWs5ZXZOdEJRWE5SN0RpZmlYdVFmMmx0N25PSDgwU1dtMWZESEh6am1Qc05JcHMyVFhHVCtpd1ZWNjlnL3RXaXBWUTZEOEJUeCtjQ1FwNDdubVRJclkrcU40a2gyRlloNUxsd1hkZ0l5eTFWSXVDM3gwNTNld0FJSVVtbFk5bmlFcHFZdCsxZkZQWE9DdENHdFliU2QzN3ZWUjFFT2oyazVHdS8rOUpXZzJxdndsMXR3ZWxnMUowdHhhcklpNGtUYlRydnJuRkxOOTJwb2ZwWlFVZm9XbzRjZTdIV05kYnU0SktFcmFMUVVmZGZHRVBkMVRJdWZ1dVJWYTM5ZXE5R1p5U0R1Qkw2ME1QZGxkeEt3MXpvK2ZCNVpZK1lNajNMTDJnR3REYnM5OCtBc1JWOUxKV21VbXN4OTFobUp0RlVNV0QzeG5qOEhNWldzME5QbENGVXI5NDg1S3FUcG81a1J6R2ZGK2svTmwySnpydjVjdmtxdFVuTGdLcFhFT2ovc2Uvb0R6T0FyUUtJNVROVWJ2WXdjd2NkampNU2ZqSzY4S3J3aHMrbjZTbVdaNFpkZ1JIZ0FLNU1vRmkzWG1MVjQ3UDN2U1JXdTV6eUVzTWs0eTN1dUNGaXVSUFJsdTRRNXBKdnVPZW03SDdVTGlJaENlbXY1RGdrR3RETDFjR0w0RVFoWVJCNklTelZ2c2IyRWFQOXdRRTZEVlJuTTdPK3BuU3pldDZsenAzcEZkR25ib3gxTFJmQzYwdXRYWitDakltNGlFTW10YkIyTjV6RFNoR2JlTTNYVWJKUWRDQmlzOFhJcmhoMmJpQjVoQkNWd24zWTNldHQ3R0RQVnRvaTFHUmp6K0piZ00rWVI5MjhLYmRXUzV0RmFNTTNLajNYdjZvdEl4ek1CbkRDOXVXM2QrSVh4NnZMUEowSlJ1aDN5UDdwVGxhNmMzaVI0cDluV1lEcUorWlNtcHJIRm5ET3pzTFdtRmphcGplL01xd01KZDZUazNuQVd3aWNNT1B1WXBNeXFJRjA0Zmw0bXFndHNITFNNV1JSTkhQWmpFVFE5Z1JtZURZZTZhUnRsVzAycUwyb2xERU5xTFFNdEFkb2lyTldSY1A5VkwzVGQ4SGFVTzZmU2xHTmFiTWFrSkQvMDBYQ2hPU1VPSVArN2ZNN1YwL2wxYkxXUHRFejFpN0x5Z1RWN3BkR29EbnRxU0NFbkpyQnloQkF6TFJnNVFJYzk0MzhJaEtteWZuMC8zYXdvRDFJcjc4MGV5cC9YY0k2eE5jdzZUdi9FVGZIZzBlN2lZQzBVWWNKSUU1UVVYdjBzK1lvR0lFcTVHSXpLdWI4SE5qU1RVcHN2bmtWeCtkYmUyalJuM1liOVc3SkNaNVlTNkY1TXlVVnNwak1EN05ZYytEV2pVTDJiMnNWeUFmZVlwQzhVaGFoOXR1bWF2YkJ2N2EzYTlrZ0ZicTU4bHJIeHpZN2lKUVZpZ3pxM2UxYTJCU2IwUGNXMWFKOEJEN05rTnBoS1lheVR4eWtnd2lsRVJMOGpxcUJFbmlIVmRCeERKWUxiK1h3M2FsTG1sdHVURVY2S0d0Qm50QlgreXozNlJQRE15R0lLZSszZnpjeGZuQ0RuMjBNb2RWVmtWTm96UHFNWFowRzVMNGFMVEFRYWtZS1Vqc1ZNUWpBaFFrVGxIQmVPL2FMUHg5c3hsKytqMVo1ckxnRzEyVE40WEoxZWljdnc0QVZFNThMb3JhcTBRaUUwY1M3UEgxcGJyWldyZnQ3TFlHaXlCU2hvcjcrMGppb1VoMXBkV3EycU1ZTHFlTUVldUNST1F0NTdtRnJPanlQSDQ5cXA5N2NXT3JnZWcyV3lmV1NER1FQamU1K1AweVFvQ3BEL0QzUkFNdVdtYjl3bEJ0Y3EyajhXSlB0OTFFM2tLYXd1UUl5dmQycjJVang0K0hUTnRWS2I5a01MT084NUk2NWJOR0JIKzRpclN5NWdRWWxFMjZBMmNTR0ljTEtRUmx2Sm9NbmE3TC85d3lyeTRIek9yemtyQXZMZGdzU05sWWpwSFFFUmlPSTgwc0o1ak5DQ25mdzAxM0YrQStzQWZMbXlTL0JETE5RMXFhUTNwNmg4L0pxQWZoWDVPR0hnU2lSVk9DRWp1YURCL013Wk5DdTNRTDllaGhvQWo3dU9mOFBrcjNtSWpiaGg5SGlqc2p4MTkxKzBlMkpRckZhMDFBVkpLRVZ0dVB0SWMyaC8xcFBLTXZ5ZW54alRPMk94UG5qanQrODRuSUtLaHhESi9naFB0N2l2OFBtVEowbEtLeVBSc3NsOGYvUWRIZHh1cGI2alRzSTZVS216OVk0NlBNQnVENlAzd2g4cXAzNk82b2liTkRpUWQxc0UxMHZKaDl6MUZ5c0tJZThFcU1wbk5kRW1HMlRmRUJ4UnBtUXJoS0VxZWUwcDYrYTZzUW84Y1ZsUkprS1FBWUthd2NhTkVTNVhjNmRRWTVucWVpcThzVWl6ZjFzcGZIZUhlbER1MU02QlJYdUNqRmFmWGh6OGkzbFBXZ1lxVnBmeDEzaWdWQ1JmNDdVSDY1MnlMbnNtZXBDQldneUJUV0FjT3lGMVF4OFlHdFpub2IxVE4rNnhFd3pwY1dWeTdRTzlQOTJzS0E5U0srL05Ic3FmMTNDT3QwSkhDdFRWMU9sVFFXK0pBS3l4ZTFIbDcrczk1ejNLQ2dGS1FTKzNBczFKVjdOYStnK0xDUjJJZXZ1OGQ1RDBMN0d3b0RyZVV2NDM3NExSYUZrTnNIT3FXYlU5bmhRamRNVnI3YS9pOE8vNGhicHRhU3pxcWtnWUZpTkZVL29tVzVxd0l6N3NwNG5zY0lUUkUzZ3VhNmJ6a2xNWjhFQ24xaXFBV3QwYTZnZWtpNURhTDhxWWFwVENDaGpsV3NFeHFGdXhpV1AzNVRVQ2RkRWQ4QUNiTUdzK2dRRnlET296ZkJERzE3ZFpPMG1Dd1crUHpDTDJqYklDRE5haTUvam0xUXI2TUw1Nmp6VWFJRHowR0xQVFNhZXgxVUREd2tROW83bVhXQzBSN2pXbnpia0hSV2NvbVZiV21HcUwxcmpkb2Fjcy9SOXVqcVV1QkE2QTVWTC9xa1ExeEhMNDJFWG9vcHJDOHdycmZSNjh6TU1GeE93VTdDWUhKN2JoRy9RNHJOc1hEQmNNbzFBZGlxOUxYYlhtL1FKajB1L2pnWkdzc3owbm5LS1VGSmN4enVBTks5NnpXd2YxRFhhc1VjT29FdUVhdG0xcm1QNXdyQkptVy9ad1Q2YUJCaVIyT1NKMHhyOHRRNk9ibWRLanliKzFlRVhiMTQzN1IySWRoRFVkazVQUnp0SDJZRnQycG11TDQvTG1JTEZBdlBkaXlNdERITmorS2g0c1Y0TWxYYldQcnJJOTdZQk9GcEZsWCtnbmV3S0tmRlprSEU3ZGl0eTM0ZFVRMkduZTZzQUd4MXp4eWpadjVLQk0yNmxSSEY0NVhxRk5KMVJRM2hNeW1KSHN5WU5zTU80MUJXckd2MTlQQTQ2OGVjdzlIY1JOMHdoalVUZ25zOFpWYUM0aGlKc2dZMDdhQUVCSG05MC91aGhqTy9XbWI3d3VWYWRobDlSbkhlUWpweDRnd0NyTHo1aTVzNUl0MXNCd2ZEYjBGZStQQ3BMa2Mrd0lJTksyWTg2a1B0aFI2Z0p3Vzc1enVvTjVDMENBaUR3ZlU3M3ZhQVphaHpmNFZMTmxNMFUwNE90SFlCaTEzWWdQb05tR0hSZWxaVkV5Mkt1S1ZaZ2hEMTR2U2xZK0pyTUJEZG0yeTJ0aEZWK0JyaWhMNytmUTV3Y1lueEdlbGF3RHVvU1I1K2JERGtyNlJMNDBMNHh5ZkFoeGxyT24wdUEyOGdoR2VXZ3VhV0tFdjVuQnJydmV1MXVlVnkxTXZHVVlCWStJbEVyOE5kRE5SZG1Felh0MzlrR2xkODZ4T2ZBSC94TDFWbXVnYVhPR2FQQjJxYzdXRFJrVzZrNUY2bjNQa0l6ZFBYeU9OS3AxRGtPZzNvY1NNWk1UczZHS2o5QzN2T0RaNlpRcHdORFlMTVQrQ21FTDE4R1JqWE5jWmxQL0xuaGlBSXNjWVRMMStpSFdEWXZSbXZQTXd0T0hoQ25FWElVM0ZUYlArNlFSR0E2cXlkYm5uZXFWaFhvd2NMbWJNSXoxNklDMWt3aFpqNzUvTTUzc0tZWDJ6UmdPU1RBZk5TRC81bFpZU05VeEpmS1REZ2lhRkVnZ3JDcmQrM0NjK2NoenNsSTN6RFhFS1RydmxjWDJJbkM5dUgrZnN5cHlIdytBdlkyT21CR1FNSUljOGZFM3ROTzBnQlRWcVhzZHNFNzZZd0hyMjlkelFja3VzdXlKc0JmU1ZjbHJ2c05DWjFQUURMOEgzY1JzM0hFOW5Va3g1YmJKWVdzUHhiODI1Z25FcFdVOVo5S3R6dnNsaTcvaGVPbERLcEh4SmIxdUNyV3FmOGdSbldtcTN6ZlNTclVYQkhTTHU2Mk1ya1hUaldnYXBVVnhNR2tybnpSMEU0UE15MWJGY3lEcEVRZTE1VGF5V0JNMUI2anJJRyswRFJSOU9hQ1VQd0Q3ZXhObWpaYjlNODF1cytBSVJmeXpKUFpHbWZIdVQ5U056RmZOdVFkRlp5aVpWdGFZYW92V3VOMmlySTN6UWF0S0NEblFJWHByMFZoRzBHb3A4Yy96cm9XQm9OL2FWS21uOHNrU0Z2QURPam9aQWl4ZzZLMXk5d0ZpOHBlQ21pbUZaM1p6Q1ZzRzZFVTlTdmxicTUrd243RDZ5K2RBWWRhUG1zNGd3Q3JMejVpNXM1SXQxc0J3ZkRiejRYNFZ4cUlwY1RDOU5hWUtxQTdHS0srYVRyWldVd3dOMjFRT3RyOGVxeFNnSjFVOWVDT2NXWFFkK3AzNkd5NGZZK3Q5YzJDc1ZOYk5sMWdoeGE5Ykk4VTZlNkZUZC92dkJhcTlqcktkaXRxNG1OQ2Fpb2dtZlBLNk00OFVZSThqWk1DZGQvOUM4QnF2VWo0YllVNWJ5V0FTRUc2QkJHZEs4S2xmaS9hNExXdDNpdkM0dTlRQlRmYi92Q21OSmkvUUFmYWJjUEcrVXNXbXNZTlJLK2c4aE1jc3VCbWhoNDhOcGhSdmViVlFxcTZuY0t4YzFuRkhXTVc1TTZvZit6OGMxSGRkbmllRFA5R2FCc3EreXNsaktzbFlydDk4OVBZOXhzYm1rcjNYL29DZmlGVTROZmNPaGVlKytuZ1cwWHBaQVZ0MUkyUW5jMWFsd2Jub05xTU1oWElCOTVpa0x4U0ZxSDIyNlpxOXNHL3RyZHIyU0FWdXJueVdzZkhOanVJbEJXS0RPcmQ3VnJZRkp2UTl4YlZvbUtxUWp1aDlkemYybnZWckJ6YkVGMENaWTZpemtZL1JRWTVyOWs5My95Mk5HN28wN25NWWpPdFpZWWVOVW9pazdHYksvSHpRbDFTN3MvRkNobnQ5TTZmRTBVeXVQbXR0Tzk4aHF6eFFidGVNYWxNdFNjZTJXTGNqeVhWR2ZwcWRCa1l5bTRnWkJ5Y2NTNmFudHQ0b0xkbHVXU1NKc0hYMUljWGhReTZvSitBaGp3OWhGWXdYTEhQTG9DbzNqRWxpVUFLNDE3OXd0WXRIc08wYWJMeDQraG10TTVGejd3VVZhaEJBOXN1cE9UZi9GRDRzaVpNTW9mNVczdm01RGVkaHFHQU5saHQzbUk2Um1JaHY0OFFWdG5lTXNVellDNE5EaFpENE01UjZwN0dYQnFjcHUzRmFFRi8wSTBlM0xjZVgxSE4raURxS1JQdUd6dnBhYy8xdHNHUEl0ZUFEeHU5T1lvYXAyejNGMUN6U2cvVXVhOGwvS0V6dEFLRGN2YmhOVS9ZVWMybGhneGdmZGI0ZStQOVRaN1JhWDgyczYyN3UwQ2JGc2ZHRS8xaExwYjVNYzJ2azF1REdyZEljYldBNnhocFlBSFloRVlVbDljNzVZL1IvMGdsNnI5K202Y0kwQnZCWTVBYTVOQlJjNlVNdnNPL1BPdzVDY3I3OXNKemljZWFWM1l3cllFa2pwNktpK09Zckd1OTU0QUErZEo5V3N2TkdCRkdNcktBZlE5VlVDL0FUa0pmVGxvTWx0RGVWNUFvOXprYWF5M2RLQWE1L1B4QUdSREFVY1FMREY3dVZYYkQxdkZnRS8rUlhpd3pTNU43Y3IzYUZCZFJZN1hBbUZ6L2ZiMC9LU3BSOENRL2xva3BtTTJtbHRKOXZHUGdpcWI1blpsOUt1N2QyR2xnQWRpRVJoU1gxenZsajlIL1NCdWpCUG9PMWZwb091NUYzNWNkSGE1a1NGdkFET2pvWkFpeGc2SzF5OXdGbGowRXo1a3NVVzNXVTYzRTdlNHF0RFVDS1d3ampVNWYwRmQ1N1Z5VnpwQzZDZENTY0JqWVN6VDlyWkxWc2txNjFhT1dyRERVTktxQVEzK25YL0JCVzNjUVRFY09WZGMxNW5nVlhjU1MvYUsyUUZNZGlLUWxxbTE1ZkVySmR3cXllemE3aGZsS1RpQ3pVZHU1VkdsRlc5cUN0OHN5SG9vc0EyTnpmb3NKZFRkTjhiV0hub0RyNU4yNWV0K3AvbnZqak96WlJhTFlvWS9mci9rNWhxcHRPaz1cXFxcXFxcIik7XFxcXG4gICAgcmV0dXJuICQuZXhwb3J0cztcXFxcbn0pKCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi57yW6L6R5YWs5ZGKXFxcIixcXFwicGF0aFxcXCI6XFxcImRldkluZm9FZGl0XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpPT57XFxcXG4gICAgcHV0TXlWYXIoXFxcXFxcXCJkZXZJbmZvXFxcXFxcXCIsJycpOyAvL+a4hemZpOWOhuWPsuWFrOWRilxcXFxufSkpO1xcXFxuc2V0UGFnZVRpdGxlKCfnvJbovpHlhazlkYonKTtcXFxcbi8vIGxldCB7bm93SngsTXlKaWV4aSxqeHNSb3V0ZX0gPSBNWV9QQVJBTVM7XFxcXG5jb25zdCB7Y29sb3Isc21hbGwsYXBpLCBnZXRGaWxlLGdldEFwaX0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxuLy8gbGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcXFxudmFyIGRldl9pbmZvX3VybCA9IGdldEFwaSgnaW5mb0dldFVybCcpO1xcXFxuLy8gbG9nKGRldl9pbmZvX3VybCk7XFxcXG52YXIgZ2V0X2luZm8gPSBmdW5jdGlvbihxcSl7XFxcXG4gICAgcXEgPSBxcXx8JzQzNDg1NzAwNSc7XFxcXG4gICAgbGV0IGRldl9pbmZvX3VybCA9IGRldl9pbmZvX3VybCtxcTtcXFxcbiAgICBsZXQgYmFja19jb2RlID0gSlNPTi5wYXJzZShyZXF1ZXN0KGRldl9pbmZvX3VybCkpO1xcXFxuICAgIGxldCBkZXZfaW5mbz1iYWNrX2NvZGUucmVzdWx0fHxiYWNrX2NvZGUuZGV0YWlsO1xcXFxuICAgIHJldHVybiBkZXZfaW5mbztcXFxcbn07XFxcXG52YXIgYmVmb3JlX3JlZnJlc2ggPSBmdW5jdGlvbigpe1xcXFxuICAgIGxldCBkZXZfc2V0X2luZm8gPSBnZXRNeVZhcihcXFxcXFxcImRldl9zZXRfaW5mb1xcXFxcXFwiKS5zcGxpdCgnJCQnKTtcXFxcbiAgICBsZXQgZGV2X2luZm9fdXJsID0gZGV2X3NldF9pbmZvLnNsaWNlKC0xKVswXTtcXFxcbiAgICBsZXQgYmFja19jb2RlID0gSlNPTi5wYXJzZShyZXF1ZXN0KGRldl9pbmZvX3VybCkpO1xcXFxuICAgIGxldCBkZXZfaW5mbz1iYWNrX2NvZGUucmVzdWx0fHxiYWNrX2NvZGUuZGV0YWlsO1xcXFxuICAgIHB1dE15VmFyKFxcXFxcXFwiZGV2SW5mb1xcXFxcXFwiLGRldl9pbmZvKTtcXFxcbiAgICByZXR1cm4gZGV2X2luZm9cXFxcbn07XFxcXG5sZXQgZCA9IFtdO1xcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTon57yW6L6R5YWs5ZGKJyxcXFxcbiAgICBkZXNjOifmlK/mjIFtZOivreazlSzngrnlh7vov5vlhaXlrabkuaBNZOivreazlVxcXFxcXFxcbuS/neWtmOWFrOWRiuaMiemSruWcqOaWh+acrOahhuacgOS4i+mdoicsXFxcXG4gICAgY29sX3R5cGU6J3RleHRfMScsXFxcXG4gICAgdXJsOidodHRwczovL3d3dy5ydW5vb2IuY29tL21hcmtkb3duL21kLXR1dG9yaWFsLmh0bWwnXFxcXG59KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6J+i/lOWbnicsXFxcXG4gICAgY29sX3R5cGU6J3RleHRfMicsXFxcXG4gICAgdXJsOiQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKCk9PntcXFxcbiAgICAgICAgYmFjayhmYWxzZSk7XFxcXG4gICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICB9KVxcXFxufSk7XFxcXG5pZighZ2V0TXlWYXIoJ2RldkluZm8nKSl7XFxcXG4gICAgYmVmb3JlX3JlZnJlc2goKTtcXFxcbn1cXFxcbmxldCBlbXB0eSA9ICdoaWtlcjovL2VtcHR5JztcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6J+mYheiniOafpemYhScsXFxcXG4gICAgY29sX3R5cGU6J3RleHRfMicsXFxcXG4gICAgLy8gdXJsOiQoZ2V0TXlWYXIoJ2RldkluZm8nKSkuY29uZmlybSgpXFxcXG4gICAgdXJsOiQoZW1wdHkpLnJ1bGUoKCk9PntcXFxcbiAgICAgICAgcmVxdWlyZShcXFxcXFxcImh0dHBzOi8vZ2l0bGFiLmNvbS9oamRobngvaGlrZXIvLS9yYXcvbWFpbi9qcy9tYXJrZWQubWluLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgIGxldCBkZXZJbmZvPVxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgdHJ5e1xcXFxuICAgICAgICAgIGRldkluZm89bWFya2VkLnBhcnNlKGdldE15VmFyKCdkZXZJbmZvJykpO1xcXFxuICAgICAgIH1jYXRjaChlKXt9XFxcXG4gICAgICAgIHNldFJlc3VsdChbXFxcXG4gICAgICAgICAgICB7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6ZGV2SW5mbyxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZToncmljaF90ZXh0JyxcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgXSk7XFxcXG4gICAgfSlcXFxcbn0pO1xcXFxuZC5wdXNoKHtcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuW/q+adpee8lui+keS9oOeahOWFrOWRiuWQp35cXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKCdkZXZJbmZvJywgJycpfHxcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICB0eXBlOiBcXFxcXFxcInRleHRhcmVhXFxcXFxcXCIsXFxcXG4gICAgICAgIGhlaWdodDotMSxcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRNeVZhcihcXFxcXFxcImRldkluZm9cXFxcXFxcIixpbnB1dCknXFxcXG4gICAgfVxcXFxufSk7XFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOlxcXFxcXFwi5L+d5a2Y5YWs5ZGKXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXFxcbiAgICB1cmw6JCgn56Gu6K6k5L+d5a2Y5YWs5ZGK5ZCX77yf5bCG5Lya5LiO6YGT6ZW/5LuT5bqT5pyN5Yqh5Zmo6YCa6K6vJykuY29uZmlybSgoKT0+e1xcXFxuICAgICAgICBsZXQgZGV2X3NldF9pbmZvID0gZ2V0TXlWYXIoXFxcXFxcXCJkZXZfc2V0X2luZm9cXFxcXFxcIikuc3BsaXQoJyQkJyk7XFxcXG4gICAgICAgIGxldCBpbnB1dF90ZXh0ID0gZ2V0TXlWYXIoJ2RldkluZm8nLCAnJyk7XFxcXG4gICAgICAgIGlmKGlucHV0X3RleHQubGVuZ3RoID49IDQpe1xcXFxuICAgICAgICAgICAgbGV0IGluZm9fc2V0X3VybD0gZGV2X3NldF9pbmZvWzJdO1xcXFxuICAgICAgICAgICAgbGV0IHNlbmRfZGF0YSA9IHtcXFxcXFxcInBhcmFtc1xcXFxcXFwiOlxcXFxuICAgICAgICAgICAgICAgICAgICB7XFxcXFxcXCJkYXRhXFxcXFxcXCI6IHtcXFxcXFxcImluZm9cXFxcXFxcIjogaW5wdXRfdGV4dH0sXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogZGV2X3NldF9pbmZvWzBdLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiOiBkZXZfc2V0X2luZm9bMV19XFxcXG4gICAgICAgICAgICB9O1xcXFxuICAgICAgICAgICAgLy8gbG9nKHNlbmRfZGF0YSk7XFxcXG4gICAgICAgICAgICBsZXQgcGFyMiA9IHtoZWFkZXJzOnsnY29udGVudC10eXBlJzonYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywnVXNlci1BZ2VudCc6ZGV2X3NldF9pbmZvWzNdfSxib2R5OkpTT04uc3RyaW5naWZ5KHNlbmRfZGF0YSksbWV0aG9kOidQT1NUJ307XFxcXG4gICAgICAgICAgICAvLyBwYXIyID0gSlNPTi5zdHJpbmdpZnkocGFyMik7IC8veDXph4zpnaLor7fmsYLmiY3pnIDopoHnvJbnoIFcXFxcbiAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGJhY2tfcmV0ID0gcmVxdWVzdChpbmZvX3NldF91cmwsIHBhcjIpO1xcXFxuICAgICAgICAgICAgICAgIGJhY2tfcmV0ID0gSlNPTi5wYXJzZShiYWNrX3JldCkucmVzdWx0O1xcXFxuICAgICAgICAgICAgICAgIGlmKGJhY2tfcmV0LnN0YXR1cz09PTApe1xcXFxuICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L+d5a2Y5oiQ5YqfXFxcXFxcXFxuJytiYWNrX3JldC5kZXRhaWw7XFxcXG4gICAgICAgICAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/kv53lrZjlpLHotKVcXFxcXFxcXG4nK2JhY2tfcmV0LmRldGFpbDtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZSZ6K+vXFxcXFxcXFxuJytlLm1lc3NhZ2U7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgY29uZmlybSh7dGl0bGU6J+mBk+mVv+aPkOekuicsY29udGVudDon6Jm954S25L2g5b6I5oeS77yM5L2G5piv5YWs5ZGK6Iez5bCR5YaZNOS4quWtl+WQp++8gSd9KTtcXFxcbiAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pXFxcXG59KTtcXFxcblxcXFxuc2V0UmVzdWx0KGQpO1xcXCJ9XVwiLFwicHJveHlcIjpcIlwifSIsInBpY1VybCI6Imh0dHBzOi8vczEuYXgxeC5jb20vMjAyMi8wOC8wMy92Vnl6d1YuanBnIiwidGl0bGUiOiLjgIzlkKzlkIjpm4bjgI0ifQ==
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement