Advertisement
xiaomianao666

邀您一起看:「轻合集.app」

Apr 22nd, 2022
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:二级页面详情¥page_detail¥「轻合集.app@@eyJkYXRhIjoie1wiYXNzb2NpYXRlZE1vZGVsc01hcEZvckpvaW5UYWJsZVwiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhGS1wiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhvdXRGS1wiOnt9LFwiZmllbGRzVG9TZXRUb0RlZmF1bHRcIjpbXSxcImlkXCI6MCxcImxhc3RfY2hhcHRlcl9ydWxlXCI6XCJcIixcImxpc3RUb0NsZWFyQXNzb2NpYXRlZEZLXCI6W10sXCJsaXN0VG9DbGVhclNlbGZGS1wiOltdLFwicGFnZUxpc3RcIjpbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuW3peWFt1wiLFwicGF0aFwiOlwidXRpbGl5XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgaG9zdCA9IFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3NcXFwiO1xcbi8vbGV0IGhvc3QgPSBcXFwiaHR0cDovLzE5Mi4xNjguMy45NDo4MDc5XFxcIjtcXG5sZXQgaG9tZSA9IGJhc2U2NERlY29kZShcXFwiYUdsclpYSTZMeTlvYjIxbFxcXCIpO1xcbnZhciBhcGkgPSB7XFxuICAgIGhvc3Q6IGhvc3QrXFxcIi9oaWtlcnVsZVxcXCIsXFxuICAgIHVzZXJzVXJsOiBcXFwiL2Rldi91c2Vycz9vcmRlcj1cXFwiLCAvL+eUqOaIt+WIl+ihqFxcbiAgICBydWxlQ291bnRVcmw6IFxcXCIvZGV2L3J1bGVjb3VudFxcXCIsIC8v6I635Y+W6KeE5YiZ5pWw6YePXFxuICAgIHJ1bGVzVXJsOiBcXFwiL2Rldi9nZXRcXFwiLCAvL+eUqOaIt+WvueW6lOeahOinhOWImeWIl+ihqOS7heS7heiOt+WPluWFrOW8gFxcbiAgICBydWxlc0FsbFVybDogXFxcIi9kZXYvZ2V0YWxsXFxcIiwgLy/lvIDlj5HogIXlr7nlupTnmoTop4TliJnliJfooajlj6/ojrflj5bnp4HmnIlcXG4gICAgZGV2U2VsZjonL2Rldi9nZXRzZWxmJywvL+iOt+WPluW8gOWPkeiAheS/oeaBr1xcbiAgICBtYW5DYW5VcGxvYWQ6Jy9zZXRfY2FuX3VwbG9hZC8nLC8v6LaF566h6K6+572u5byA5Y+R6ICF5piv5ZCm5Y+v5LiK5LygXFxuICAgIG1hblJ1bGVTYWZlOicvc2V0X3J1bGVfc2FmZS8nLC8v6LaF566h6K6+572u6KeE5YiZ5a6J5YWo5oCnXFxuICAgIG1hblJ1bGVHb29kOicvc2V0X3J1bGVfZ29vZC8nLC8v6LaF566h6K6+572u6KeE5YiZ5LyY6LSo5oCnXFxuICAgIGltcG9ydFVybDogXFxcIi9ydWxlbGlzdC5qc29uP2lkPVxcXCIsIC8v6KeE5YiZ6K+m5oOF5Y+v5a+85YWlXFxuICAgIGluZm9TZXRVcmw6IFxcXCIvZGV2L3NldF9pbmZvXFxcIixcXG4gICAgbm93Q29uVXJsOiBcXFwiL3NxbF9pbmZvL2dldF9ub3dfY29uXFxcIixcXG4gICAgaW5mb0dldFVybDogXFxcIi9kZXYvZ2V0X2luZm8/bmFtZT1cXFwiLFxcbiAgICBzZXR0aW5nc0dldFVybDogXFxcIi9kZXYvZ2V0X3NldHRpbmdzP25hbWU9XFxcIixcXG4gICAgZ3VwbG9hZDogXFxcIi9kZXYvZ3VwbG9hZFxcXCIsXFxuICAgIGd0aW1lb3ZlcjogXFxcIi9kZXYvZ3RpbWVvdmVyXFxcIixcXG4gICAgZ2V0YnlpZDogXFxcIi9kZXYvZ2V0YnlpZFxcXCIsXFxuICAgIHJ1bGVMaXN0SnNvbjogXFxcIi9ydWxlbGlzdC5qc29uXFxcIixcXG4gICAgYXV0aDogXFxcIi9kZXYvZ2V0X2F1dGhcXFwiLFxcbiAgICB0aW1lb3ZlcjogXFxcIi9kZXYvdGltZW92ZXJcXFwiLFxcbiAgICBzaGFyZTogXFxcIi9kZXYvc2hhcmVcXFwiLFxcbiAgICBnZW5BdXRoOiBcXFwiL2Rldi9nZW5fYXV0aFxcXCIsXFxuICAgIGRlbGV0ZVVybDogXFxcIi9kZXYvZGVsZXRlXFxcIixcXG4gICAganNvbkxpc3Q6IFxcXCIvZGV2L2pzb25fbGlzdFxcXCIsXFxuICAgIHNlYXJjaDogXFxcIi9kZXYvc2VhcmNoXFxcIixcXG4gICAgbmV3X2RldjogXFxcIi9kZXZfcmVnaXN0L25ld1xcXCIsXFxuICAgIG5ld19nZXRJZDogXFxcIi9kZXZfcmVnaXN0L2dldF9pZFxcXCIsXFxuICAgIG5ld19jb25maXJtOiBcXFwiL2Rldl9yZWdpc3QvY29uZmlybVxcXCIsXFxuICAgIG1vZGlmeV9wd2Q6IFxcXCIvbW9kaWZ5L3Bhc3N3b3JkXFxcIixcXG4gICAgbW9kaWZ5X25hbWU6IFxcXCIvbW9kaWZ5L25hbWVcXFwiLFxcbiAgICBtb2RpZnlfYXZhOiBcXFwiL21vZGlmeS9hdmF0YXJcXFwiLFxcbiAgICB1c2VyOiBcXFwiL2Rldi91c2VyL1xcXCIsXFxuICAgIGdldF9ydWxlX25vdGU6IFxcXCIvbW9kaWZ5L2dldF9ydWxlX25vdGUvXFxcIixcXG4gICAgc2V0X3J1bGVfcGljOiBcXFwiL21vZGlmeS9ydWxlX3BpYy9cXFwiLFxcbiAgICBzZXRfcnVsZV9ub3RlOiBcXFwiL21vZGlmeS9ydWxlX25vdGUvXFxcIlxcbn1cXG4kLmV4cG9ydHMucmFuZ2UgPSBmdW5jdGlvbihtLCBuKSB7XFxuICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobSAtIG4gKyAxKSArIG4pO1xcbn1cXG4kLmV4cG9ydHMubWFwQ29sVHlwZSA9IGZ1bmN0aW9uKHRhcmdldCwgdHlwZSwgbikge1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xcbiAgICAgICAgdGFyZ2V0LnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiB0eXBlXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG52YXIgZ2V0QXBpID0gZnVuY3Rpb24oaykge1xcbiAgICByZXR1cm4gYXBpLmhvc3QgKyBhcGlba107XFxufTtcXG4kLmV4cG9ydHMuZ2V0QXBpPWdldEFwaTtcXG4kLmV4cG9ydHMubWQ9Z2V0QXBpKCdpbXBvcnRVcmwnKStcXFwiMzE4N1xcXCI7XFxuJC5leHBvcnRzLmxvY2FsUnVsZVZlciA9IGZ1bmN0aW9uKGxvY2FsUnVsZUxpc3QsIHJ1bGUpIHtcXG4gICAgbGV0IGxvY2FsUnVsZTtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbFJ1bGVMaXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICBsZXQgaXRlbSA9IGxvY2FsUnVsZUxpc3RbaV07XFxuICAgICAgICBsZXQgYXUgPSBpdGVtLmF1dGhvciB8fCBcXFwiXFxcIjtcXG4gICAgICAgIGxldCBzYW1lQXU9YXUubGVuZ3RoID4gMCAmJiBydWxlLmF1dGhvci5pbmNsdWRlcyhhdSk7XFxuICAgICAgICBzYW1lQXU9dHJ1ZTsvL+S4jeWIpOaWreS9nOiAhem7mOiupOS4unRydWVcXG4gICAgICAgIGlmIChpdGVtLnRpdGxlID09PSBydWxlLm5hbWUgJiYgc2FtZUF1KSB7XFxuICAgICAgICAgICAgbG9jYWxSdWxlID0gaXRlbTtcXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBpZiAobG9jYWxSdWxlID09PSB2b2lkIDApIHtcXG4gICAgICAgIHJldHVybiAtMTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiBsb2NhbFJ1bGUudmVyc2lvbjtcXG4gICAgfVxcbn1cXG4kLmV4cG9ydHMuY29sb3IgPSBmdW5jdGlvbih0ZXh0LCBjb2xvcikge1xcbiAgICB0ZXh0ICs9IFxcXCJcXFwiO1xcbiAgICBpZiAodGV4dC5pbmRleE9mKFxcXCLigJzigJzigJ3igJ1cXFwiKSA9PT0gMCkge1xcbiAgICAgICAgdGV4dC5yZXBsYWNlKFxcXCLigJzigJzigJ3igJ1cXFwiLCBcXFwiXFxcIik7XFxuICAgIH1cXG4gICAgcmV0dXJuIFxcXCLigJzigJzigJ3igJ08Zm9udCBjb2xvcj0nXFxcIiArIGNvbG9yICsgXFxcIic+XFxcIiArIHRleHQgKyBcXFwiPC9mb250PlxcXCI7XFxufVxcblxcbmZ1bmN0aW9uIGh0bWxUYWcodGFnLCB0ZXh0KSB7XFxuICAgIHRleHQgKz0gXFxcIlxcXCI7XFxuICAgIGlmICh0ZXh0LmluZGV4T2YoXFxcIuKAnOKAnOKAneKAnVxcXCIpID09PSAwKSB7XFxuICAgICAgICB0ZXh0LnJlcGxhY2UoXFxcIuKAnOKAnOKAneKAnVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgfVxcbiAgICByZXR1cm4gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwiPFxcXCIgKyB0YWcgKyBcXFwiPlxcXCIgKyB0ZXh0ICsgXFxcIjwvXFxcIiArIHRhZyArIFxcXCI+XFxcIjtcXG5cXG59XFxuXFxuZnVuY3Rpb24gZ2V0Tm93Rm9ybWF0RGF0ZSgpIHtcXG4gICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKCk7XFxuICAgICAgICAgICAgbGV0IHNlcGVyYXRvcjEgPSBcXFwiLVxcXCI7XFxuICAgICAgICAgICAgbGV0IHNlcGVyYXRvcjIgPSBcXFwiOlxcXCI7XFxuICAgICAgICAgICAgbGV0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMTtcXG4gICAgICAgICAgICBsZXQgc3RyRGF0ZSA9IGRhdGUuZ2V0RGF0ZSgpO1xcbiAgICAgICAgICAgIGxldCBzdHJIb3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcXG4gICAgICAgICAgICBsZXQgc3RyTWludXRlcyA9IGRhdGUuZ2V0TWludXRlcygpO1xcbiAgICAgICAgICAgIGxldCBzdHJTZWNvbmRzID0gZGF0ZS5nZXRTZWNvbmRzKCkrMTtcXG4gICAgICAgICAgICBpZiAobW9udGggPj0gMSAmJiBtb250aCA8PSA5KSB7XFxuICAgICAgICAgICAgICAgIG1vbnRoID0gXFxcIjBcXFwiICsgbW9udGhcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHN0ckRhdGUgPj0gMCAmJiBzdHJEYXRlIDw9IDkpIHtcXG4gICAgICAgICAgICAgICAgc3RyRGF0ZSA9IFxcXCIwXFxcIiArIHN0ckRhdGVcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHN0ckhvdXJzID49IDAgJiYgc3RySG91cnMgPD0gOSkge1xcbiAgICAgICAgICAgICAgICBzdHJIb3VycyA9IFxcXCIwXFxcIiArIHN0ckhvdXJzXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChzdHJNaW51dGVzID49IDAgJiYgc3RyTWludXRlcyA8PSA5KSB7XFxuICAgICAgICAgICAgICAgIHN0ck1pbnV0ZXMgPSBcXFwiMFxcXCIgKyBzdHJNaW51dGVzXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChzdHJTZWNvbmRzID49IDAgJiYgc3RyU2Vjb25kcyA8PSA5KSB7XFxuICAgICAgICAgICAgICAgIHN0clNlY29uZHMgPSBcXFwiMFxcXCIgKyBzdHJTZWNvbmRzXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIC8vbGV0IGN1cnJlbnRkYXRlID0gZGF0ZS5nZXRGdWxsWWVhcigpICsgc2VwZXJhdG9yMSArIG1vbnRoICsgc2VwZXJhdG9yMSArIHN0ckRhdGUgKyBcXFwiIFxcXCIgKyBzdHJIb3VycyArIHNlcGVyYXRvcjIgKyBzdHJNaW51dGVzICsgc2VwZXJhdG9yMiArIHN0clNlY29uZHM7XFxuICAgICAgICAgICAgbGV0IGN1cnJlbnRkYXRlID0gKGRhdGUuZ2V0RnVsbFllYXIoKS0yMDIwKSsnJysgbW9udGggKycnKyBzdHJEYXRlICsnJysgc3RySG91cnMrJycgKyBzdHJNaW51dGVzICsnJysgTWF0aC5jZWlsKHN0clNlY29uZHMvNyk7XFxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGN1cnJlbnRkYXRlKVxcbiAgICAgICAgfVxcbiQuZXhwb3J0cy5nZXROb3dGb3JtYXREYXRlID0gZ2V0Tm93Rm9ybWF0RGF0ZTtcXG4kLmV4cG9ydHMuaHRtbFRhZyA9IGh0bWxUYWc7XFxuJC5leHBvcnRzLnNtYWxsID0gZnVuY3Rpb24odGV4dCkge1xcbiAgICByZXR1cm4gaHRtbFRhZyhcXFwic21hbGxcXFwiLCB0ZXh0KTtcXG59XFxuJC5leHBvcnRzLmdldEZpbGUgPSBmdW5jdGlvbigpIHtcXG4gICAgdmFyIEZpbGUgPSByZXF1ZXN0KFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvblxcXCIpIHx8IFxcXCJ7fVxcXCI7XFxuICAgIHRyeSB7XFxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShGaWxlKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvblxcXCIsIFxcXCJ7fVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIHt9O1xcbiAgICB9XFxufVxcbiQuZXhwb3J0cy5nZXRVc2VyRGF0ZSA9ZnVuY3Rpb24oKXtcXG4gICAgdmFyIEZpbGUgPSByZXF1ZXN0KFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVJBLmpzb25cXFwiKSB8fCBcXFwiW11cXFwiO1xcbiAgICB0cnkge1xcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoRmlsZSk7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSQS5qc29uXFxcIiwgXFxcIltdXFxcIik7XFxuICAgICAgICByZXR1cm4gW107XFxuICAgIH1cXG59XFxuJC5leHBvcnRzLmV4aXN0RmlsZSA9IGZ1bmN0aW9uKHNwYXRoLCBpcGF0aCwgaGVhZGVycykge1xcbiAgICBsZXQgc2NvZGUgPSByZXF1ZXN0KHNwYXRoKTtcXG4gICAgaWYgKCFzY29kZSkge1xcbiAgICAgICAgd3JpdGVGaWxlKHNwYXRoLCByZXF1ZXN0KGlwYXRoLCBoZWFkZXJzKSk7XFxuICAgIH1cXG59XFxuXFxubGV0IG5ld0FwaSA9IHtcXG4gICAgXFxcImRpc19uZXdcXFwiOiBcXFwiL2hpa2VydWxlL25ld19ydWxlX2Rpc2N1c3MvXFxcIixcXG4gICAgXFxcImRpc192ZXJpZnlcXFwiOiBcXFwiL2hpa2VydWxlL3J1bGVfZGlzY3Vzcy9nZXRfeXptXFxcIixcXG4gICAgXFxcImRpc19nZXRcXFwiOiBcXFwiL2hpa2VydWxlL3J1bGVfZGlzY3Vzcy9cXFwiLFxcbiAgICBcXFwiZGlzX3NldFxcXCI6IFxcXCIvaGlrZXJ1bGUvbW9kaWZ5L2Nhbl9kaXNjdXNzL1xcXCIsXFxuICAgIFxcXCJkaXNfbmV3X3VzZXJcXFwiOiBcXFwiL2hpa2VydWxlL3J1bGVfZGlzY3Vzcy9uZXdfdXNlclxcXCIsXFxuICAgIFxcXCJkaXNfbG9naW5cXFwiOlxcXCIvaGlrZXJ1bGUvcnVsZV9kaXNjdXNzL3VzZXJfbG9naW5cXFwiLFxcbiAgICBcXFwiZGlzX2Rldl9kaXNjdXNzXFxcIjpcXFwiL2hpa2VydWxlL21vZGlmeS9kZXZfY2FuX2Rpc2N1c3NcXFwiLFxcbiAgICBcXFwiZGlzX2Rldl9jb250cm9sXFxcIjpcXFwiL2hpa2VydWxlL3J1bGVfZGlzY3Vzcy9yZW1vdmUvXFxcIixcXG4gICAgXFxcImFsbF9ydWxlXFxcIjpcXFwiL2hpa2VydWxlL2dldF9ydWxlc1xcXCIsXFxuICAgIFxcXCJkaXNfZ2V0X3JlcGx5XFxcIjpcXFwiL2hpa2VydWxlL2dldF9yZXBseV9ydWxlX2Rpc2N1c3NcXFwiLFxcbiAgICBcXFwiZGlzX3JlcGx5XFxcIjpcXFwiL2hpa2VydWxlL2Rldl9uZXdfcnVsZV9kaXNjdXNzL1xcXCIsXFxufVxcblxcbmZ1bmN0aW9uIHNldEFwaShvYmplY3QpIHtcXG4gICAgbGV0IHRhcmdldCA9IHt9O1xcbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqZWN0KSB7XFxuICAgICAgICB0YXJnZXRba2V5XT1ob3N0K29iamVjdFtrZXldXFxuICAgIH1cXG4gICAgcmV0dXJuIHRhcmdldDtcXG59XFxuXFxuJC5leHBvcnRzLmFwaSA9IHNldEFwaShuZXdBcGkpO1xcbiQuZXhwb3J0cy5hcGkuaG9zdD1ob3N0O1xcbiQuZXhwb3J0cy5hcGkuaG9tZT1ob21lO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5byA5Y+R6ICF55m75b2VXCIsXCJwYXRoXCI6XCJkZXZMb2dpblwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLlvIDlj5HogIXnmbvlvZVcXFwiKTtcXG5jb25zdCB7XFxuICAgIGdldEFwaSxcXG4gICAgaHRtbFRhZyxcXG4gICAgbWFwQ29sVHlwZSxcXG4gICAgc21hbGwsXFxuZ2V0RmlsZVxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG52YXIgZGF0YSA9IFtdO1xcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKT0+e1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlVXNlcm5hbWVcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZVBhc3N3b3JkXFxcIik7XFxufSkpXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICfotKblj7cnLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2VVc2VybmFtZScsJycpLFxcbiAgICAgICAgdHlwZTpcXFwibnVtYmVyXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2VVc2VybmFtZVxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSwge1xcbiAgICB0aXRsZTogJ+WvhueggScsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZVBhc3N3b3JkJywgJycpLFxcbiAgICAgICAgdHlwZTogXFxcInBhc3N3b3JkXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2VQYXNzd29yZFxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSk7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIiZuYnNwOyZuYnNwOzxhIGhyZWY9J2hpa2VyOi8vcGFnZS9SZWdpc3Rlcic+5rOo5YaMPC9hPlxcXCIsXFxuICAgIGNvbF90eXBlOlxcXCJyaWNoX3RleHRcXFwiXFxufSk7XFxubWFwQ29sVHlwZShkYXRhLCBcXFwibGluZV9ibGFua1xcXCIsIDEpO1xcbmxldCB1c2VyID0gZ2V0RmlsZSgpO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiXFxcIiwgXFxcIueZu+W9lVxcXCIpLFxcbiAgICB1cmw6ICQoKS5sYXp5UnVsZSgodXJsLCBmKT0+IHtcXG4gICAgICAgIGxldCB1c2VybmFtZSA9IGdldFZhcignV2FyZWhvdXNlVXNlcm5hbWUnLCAnJyksXFxuICAgICAgICAgICAgcGFzc3dvcmQgPSBnZXRWYXIoJ1dhcmVob3VzZVBhc3N3b3JkJywgJycpO1xcbiAgICAgICAgaWYodXNlcm5hbWUgPT09IFxcXCJcXFwiICYmIHBhc3N3b3JkID09PVxcXCJcXFwiKXtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6LSm5Y+35ZKM5a+G56CB5LiN6IO95Li656m6XFxcIlxcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IG15VXJsID0gdXJsICsgJz9xcT0nICsgdXNlcm5hbWUgKyAnJnBhc3N3b3JkPScgKyBwYXNzd29yZDtcXG4gICAgICAgIGxldCBjb2RlX3N0ciA9IHJlcXVlc3QobXlVcmwpO1xcbiAgICAgICAgbGV0IGNvZGUgPSBKU09OLnBhcnNlKGNvZGVfc3RyKTtcXG4gICAgICAgIGlmIChjb2RlLnN0YXR1cyA9PSAwKSB7XFxuICAgICAgICAgICAgZi51c2VybmFtZT11c2VybmFtZTtcXG4gICAgICAgICAgICBmLnBhc3N3b3JkPXBhc3N3b3JkXFxuICAgICAgICAgICAgd3JpdGVGaWxlKCdoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvbicsIEpTT04uc3RyaW5naWZ5KGYpKTtcXG4gICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+eZu+W9leaIkOWKn1xcXCI7XFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6LSm5Y+35oiW5a+G56CB6ZSZ6K+vXFxcIjtcXG4gICAgICAgIH1cXG4gICAgfSwgZ2V0QXBpKFxcXCJydWxlc0FsbFVybFxcXCIpLHVzZXIpLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxufSk7XFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwiaWNvbl8yX3JvdW5kXCIsXCJuYW1lXCI6XCLlvIDlj5HogIXnrqHnkIZcIixcInBhdGhcIjpcImRldk1hbmFnZVwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLop4TliJnnrqHnkIZcXFwiKTtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICdjbGVhclZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiLFxcXCJcXFwiKTsnKTtcXG5pZiAoZ2V0VmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIpID09PSBcXFwiMVxcXCIpIHtcXG4gICAgYmFjaygpO1xcbn1cXG5jb25zdCB7XFxuICAgIGdldEFwaSxcXG4gICAgY29sb3IsXFxuICAgIHNtYWxsLFxcbiAgICBnZXRGaWxlLFxcbiAgICBleGlzdEZpbGUsXFxuICAgIG1hcENvbFR5cGUsXFxuICAgIGFwaVxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5sZXQge1xcbiAgICBkZXZcXG59ID0gTVlfUEFSQU1TO1xcbmxldCB7XFxuICAgIHVzZXJuYW1lLFxcbiAgICBwYXNzd29yZCxcXG59ID0gZ2V0RmlsZSgpO1xcbi8vZXhpc3RGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvaHRtbC/lvIDlj5HogIXliIbkuqsuaHRtbFxcXCIsIFxcXCJodHRwczovL2VycC5zY3dpbmJhby5jb20vaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MzlcXFwiKTtcXG5sZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXCJydWxlc0FsbFVybFxcXCIpICsgJz9xcT0nICsgdXNlcm5hbWUgKyAnJnBhc3N3b3JkPScgKyBwYXNzd29yZCkpLnJlc3VsdDtcXG5sZXQgTU9CSUxFX1VBID0gJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA1LjA7IFNNLUc5MDBQIEJ1aWxkL0xSWDIxVCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg4LjAuNDMyNC4xNDYgTW9iaWxlIFNhZmFyaS81MzcuMzYnO1xcbmxldCBpbmZvU2V0VXJsID0gZ2V0QXBpKFxcXCJpbmZvU2V0VXJsXFxcIik7XFxubGV0IGluZm9HZXRVcmwgPSBnZXRBcGkoXFxcImluZm9HZXRVcmxcXFwiKSArIHVzZXJuYW1lO1xcbmxldCBzZXR0aW5nc0dldFVybCA9IGdldEFwaShcXFwic2V0dGluZ3NHZXRVcmxcXFwiKSArIHVzZXJuYW1lO1xcbnB1dE15VmFyKFxcXCJkZXZfc2V0X2luZm9cXFwiLCBbdXNlcm5hbWUsIHBhc3N3b3JkLCBpbmZvU2V0VXJsLCBNT0JJTEVfVUEsIGluZm9HZXRVcmxdLmpvaW4oXFxcIiQkXFxcIikpO1xcbmxldCBkYXRhID0gW107XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08YmlnPuS7k+W6k+iuvue9rjwvYmlnPiZuYnNwOyZuYnNwOyZuYnNwOzxzbWFsbD48dT7vvIgg5Liq5Lq66LWE5paZID7vvIk8L3U+PC9zbWFsbD4nLFxcbiAgICBkZXNjOiAn4oCc4oCc4oCd4oCd5oKo5YWx5pyJIDxzcGFuIHN0eWxlPVxcXCJjb2xvcjogI2ZmNzAwMFxcXCI+JyArIHJ1bGVMaXN0Lmxlbmd0aCArICc8L3NwYW4+JyArIFxcXCIg5p2h6KeE5YiZ44CCXFxcXG7ngrnlh7vop4TliJnlj6/ov5vooYzliIbkuqvjgIHliKDpmaTjgIHlr7zlhaXmk43kvZzlj4rmn6XnnIvor6bmg4VcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvUGVyc29uYWxEYXRhI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOntpZDpkZXYuaWR9LFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMSdcXG59KTtcXG5tYXBDb2xUeXBlKGRhdGEsIFxcXCJsaW5lXFxcIiwgMik7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IHNtYWxsKGNvbG9yKFxcXCLmm7TmlLnlhazlkYrinI1cXFwiLCBcXFwiIzM0YjFmZlxcXCIpKSxcXG4gICAgLy8gdXJsOiBcXFwieDU6Ly9maWxlOi8vL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9ydWxlcy9kekhvdXNlL2h0bWwvZGV2X2luZm9fZWRpdC5odG1sXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2RldkluZm9FZGl0XFxcIixcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzMnXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IHNtYWxsKGNvbG9yKFxcXCLmm7TlpJrliIbkuqvwn5OyXFxcIiwgXFxcIiMzNGIxZmZcXFwiKSksXFxuICAgIC8vdXJsOiBcXFwieDU6Ly9maWxlOi8vL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9ydWxlcy9kekhvdXNlL2h0bWwv5byA5Y+R6ICF5YiG5LqrLmh0bWxcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvbW9yZVNoYXJlXFxcIixcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzMnXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IHNtYWxsKGNvbG9yKFxcXCLljYfnuqfkvp3otZbwn5OlXFxcIiwgXFxcIiMzNGIxZmZcXFwiKSksXFxuICAgIHVybDogJChcXFwi5Y2H57qn5Lya6YeN5paw5LuO5LuT5bqT5ouJ5Y+W55u45YWz55qE6Z2Z5oCB6aG16Z2i5Yiw5pys5ZywXFxcXG7noa7orqTljYfnuqflkJc/XFxcIikuY29uZmlybSgoaG9zdCkgPT4ge1xcbiAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvaHRtbC/lvIDlj5HogIXliIbkuqsuaHRtbFxcXCIsIHJlcXVlc3QoaG9zdCsnL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTM5JykpO1xcbiAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvaHRtbC9kZXZfaW5mb19lZGl0Lmh0bWxcXFwiLCByZXF1ZXN0KGhvc3QrJy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTQwMicpKTtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwvZGV2X2luZm9fZ2V0Lmh0bWxcXFwiLCByZXF1ZXN0KGhvc3QrJy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTQwNCcpKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lph43nva7lvIDlj5HogIXliIbkuqss566A5LuL5p+l55yLLOeugOS7i+e8lui+keetiemdmeaAgeaWh+S7tlxcXCI7XFxuICAgIH0sYXBpLmhvc3QpLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMydcXG59KTtcXG5sZXQgZGV2U2V0QmFjaztcXG50cnkge1xcbiAgICBkZXZTZXRCYWNrID0gSlNPTi5wYXJzZShyZXF1ZXN0KHNldHRpbmdzR2V0VXJsKSk7XFxufSBjYXRjaCAoZSkge1xcbiAgICBkZXZTZXRCYWNrID0ge307XFxufVxcblxcbmZ1bmN0aW9uIHNldFNldHRpbmdJdGVtKGJhc2ljKSB7XFxuICAgIGxldCB0ZW1wID0ge1xcbiAgICAgICAgdGl0bGU6IGJhc2ljLnRpdGxlLFxcbiAgICAgICAgY29sX3R5cGU6IGJhc2ljLmNvbF90eXBlLFxcbiAgICAgICAgdXJsOiAkKGJhc2ljLmNvbmZpcm0pLmNvbmZpcm0oKHVybCwgbXNnKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGJhY2sgPSByZXF1ZXN0KHVybCk7XFxuICAgICAgICAgICAgbGV0IHJldCA9IEpTT04ucGFyc2UoYmFjayk7XFxuICAgICAgICAgICAgaWYgKHJldC5zdGF0dXMgPT0gMCkge1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBtc2dbMF07XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIG1zZ1sxXSArIFxcXCJcXFxcblxcXCIgKyByZXQuZGV0YWlsO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGJhc2ljLnVybCwgYmFzaWMubXNnKVxcbiAgICB9O1xcbiAgICByZXR1cm4gdGVtcDtcXG59XFxuaWYgKGRldlNldEJhY2suc3RhdHVzID09IDApIHtcXG4gICAgbGV0IGRldlNldHRpbmdzID0gZGV2U2V0QmFjay5yZXN1bHQ7XFxuICAgIGxldCBzaGFyZSA9IHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIlxcbiAgICB9O1xcbiAgICBpZiAoZGV2U2V0dGluZ3Muc2hhcmVfcHVibGljKSB7XFxuICAgICAgICBzaGFyZS50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXCLlhazlvIDkuIrkvKBcXFwiLCBcXFwiZ3JlZW5cXFwiKSArIGNvbG9yKFxcXCIo56eB6JePKVxcXCIsIFxcXCIjMDBiZmZmXFxcIikpO1xcbiAgICAgICAgc2hhcmUudXJsID0gZ2V0QXBpKFxcXCJndXBsb2FkXFxcIikgKyBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkICsgXFxcIiZmbGFnPTFcXFwiO1xcbiAgICAgICAgc2hhcmUuY29uZmlybSA9IFxcXCLmmK/lkKbnoa7orqTnp4Hol4/ku6XlkI7mj5DkuqTnmoTop4TliJk/XFxcIjtcXG4gICAgICAgIHNoYXJlLm1zZyA9IFtcXFwi5bey56eB6JePXFxcIiwgXFxcIuengeiXj+Wksei0pVxcXCJdO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgc2hhcmUudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi56eB5a+G5LiK5LygXFxcIiwgXFxcInJlZFxcXCIpICsgY29sb3IoXFxcIijlhazlvIApXFxcIiwgXFxcIiNhZGZmMmZcXFwiKSk7XFxuICAgICAgICBzaGFyZS51cmwgPSBnZXRBcGkoXFxcImd1cGxvYWRcXFwiKSArIFxcXCI/cXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQ7XFxuICAgICAgICBzaGFyZS5jb25maXJtID0gXFxcIuaYr+WQpuehruiupOWFrOW8gOS7peWQjuaPkOS6pOeahOinhOWImT9cXFwiO1xcbiAgICAgICAgc2hhcmUubXNnID0gW1xcXCLlt7LlhazlvIBcXFwiLCBcXFwi5YWs5byA5aSx6LSlXFxcIl07XFxuICAgIH1cXG4gICAgZGF0YS5wdXNoKHNldFNldHRpbmdJdGVtKHNoYXJlKSk7XFxuICAgIGxldCB0aW1lT3ZlciA9IHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIlxcbiAgICB9O1xcbiAgICBpZiAoZGV2U2V0dGluZ3MudGltZV9vdmVyKSB7XFxuICAgICAgICB0aW1lT3Zlci50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXCLnn63ml7bnp5jpkqVcXFwiLCBcXFwiZ3JlZW5cXFwiKSArIGNvbG9yKFxcXCIo5rC45LmFKVxcXCIsIFxcXCIjMDBiZmZmXFxcIikpO1xcbiAgICAgICAgdGltZU92ZXIudXJsID0gZ2V0QXBpKFxcXCJndGltZW92ZXJcXFwiKSArIFxcXCI/cXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQgKyBcXFwiJmZsYWc9MVxcXCI7XFxuICAgICAgICB0aW1lT3Zlci5jb25maXJtID0gXFxcIuaYr+WQpuehruiupOS7peWQjueahOengeiXj+inhOWImeWIhuS6q+S4jei/h+acnz9cXFwiO1xcbiAgICAgICAgdGltZU92ZXIubXNnID0gW1xcXCLlt7Lorr7kuLrmsLjkuYVcXFwiLCBcXFwi6K6+5Li65rC45LmF5aSx6LSlXFxcIl07XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICB0aW1lT3Zlci50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXCLmsLjkuYXnp5jpkqVcXFwiLCBcXFwicmVkXFxcIikgKyBjb2xvcihcXFwiKOi/h+acnylcXFwiLCBcXFwiI2FkZmYyZlxcXCIpKTtcXG4gICAgICAgIHRpbWVPdmVyLnVybCA9IGdldEFwaShcXFwiZ3RpbWVvdmVyXFxcIikgKyBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkO1xcbiAgICAgICAgdGltZU92ZXIuY29uZmlybSA9IFxcXCLnoa7orqTopoHku6XlkI7liIbkuqvnmoTnp4Hol4/op4TliJnoh6rliqjliLDmnJ8/XFxcIjtcXG4gICAgICAgIHRpbWVPdmVyLm1zZyA9IFtcXFwi5bey6K6+5Li66L+H5pyfXFxcIiwgXFxcIuiuvuS4uui/h+acn+Wksei0pVxcXCJdO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaChzZXRTZXR0aW5nSXRlbSh0aW1lT3ZlcikpO1xcbiAgICBsZXQgZGlzY3VzcyA9IHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIlxcbiAgICB9O1xcbiAgICBpZiAoZGV2U2V0dGluZ3MuY2FuX2Rpc2N1c3MpIHtcXG4gICAgICAgIGRpc2N1c3MudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi5YWB6K646K+E6K66XFxcIiwgXFxcInJlZFxcXCIpICsgY29sb3IoXFxcIijkuI3orrgpXFxcIiwgXFxcIiNhZGZmMmZcXFwiKSk7XFxuICAgICAgICBkaXNjdXNzLnVybCA9IGFwaS5kaXNfZGV2X2Rpc2N1c3MgKyBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkKyBcXFwiJmZsYWc9MVxcXCI7XFxuICAgICAgICBkaXNjdXNzLmNvbmZpcm0gPSBcXFwi5piv5ZCm56Gu6K6k5Lul5ZCO5LiK5Lyg55qE6KeE5YiZ5YWB6K646K+E6K66P1xcXCI7XFxuICAgICAgICBkaXNjdXNzLm1zZyA9IFtcXFwi5bey6K6+5Li65LiN6K64XFxcIiwgXFxcIuiuvue9ruWksei0pVxcXCJdO1xcblxcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgZGlzY3Vzcy50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXCLkuI3orrjor4TorrpcXFwiLCBcXFwiZ3JlZW5cXFwiKSArIGNvbG9yKFxcXCIo5YWB6K64KVxcXCIsIFxcXCIjMDBiZmZmXFxcIikpO1xcbiAgICAgICAgZGlzY3Vzcy51cmwgPSBhcGkuZGlzX2Rldl9kaXNjdXNzICsgXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZDtcXG4gICAgICAgIGRpc2N1c3MuY29uZmlybSA9IFxcXCLmmK/lkKbnoa7orqTku6XlkI7kuIrkvKDnmoTop4TliJnlhYHorrjor4Torro/XFxcIjtcXG4gICAgICAgIGRpc2N1c3MubXNnID0gW1xcXCLlt7Lorr7kuLrlhYHorrhcXFwiLCBcXFwi6K6+572u5aSx6LSlXFxcIl07XFxuICAgIH1cXG4gICAgZGF0YS5wdXNoKHNldFNldHRpbmdJdGVtKGRpc2N1c3MpKTtcXG59XFxubWFwQ29sVHlwZShkYXRhLCBcXFwibGluZVxcXCIsIDIpO1xcbmZvciAobGV0IGl0ZW0gb2YgcnVsZUxpc3QpIHtcXG4gICAgbGV0IG15X3RfZXhjb2RlMSA9ICcnO1xcbiAgICBsZXQgbXlfdF9leGNvZGUyID0gJyc7XFxuICAgIGlmIChpdGVtLnN0YXRlICE9ICdwdWJsaWMnKSB7XFxuICAgICAgICBteV90X2V4Y29kZTEgKz0gJ+OKme+4jyc7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBteV90X2V4Y29kZTEgKz0gJyc7XFxuICAgIH1cXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBteV90X2V4Y29kZTEgKyBpdGVtLm5hbWUgKyBteV90X2V4Y29kZTIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvbWFuYWdlUnVsZSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogaXRlbS5pZCxcXG4gICAgICAgICAgICAvL3VzZXJuYW1lOiB1c2VybmFtZSxcXG4gICAgICAgICAgICAvL3Bhc3N3b3JkOiBwYXNzd29yZFxcbiAgICAgICAgfSxcXG4gICAgICAgIHBpY191cmw6IGl0ZW0ucGljLFxcbiAgICB9KVxcbn1cXG5pZiAocnVsZUxpc3QubGVuZ3RoID09PSAwKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuW/q+adpeS4iuS8oOS9oOeahOesrOS4gOadoeinhOWImeWQp++8gTwvaDU+XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICB9KTtcXG59XFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6KeE5YiZ6K+m57uGLWRldlwiLFwicGF0aFwiOlwibWFuYWdlUnVsZVwiLFwicnVsZVwiOlwianM6XFxuY29uc3Qge1xcbiAgICBnZXRBcGksXFxuICAgIGNvbG9yLFxcbiAgICBzbWFsbCxcXG4gICAgZ2V0RmlsZSxcXG4gICAgZXhpc3RGaWxlLFxcbiAgICBtYXBDb2xUeXBlLFxcbiAgICBodG1sVGFnLFxcbiAgICBhcGlcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgaWRcXG59ID0gTVlfUEFSQU1TO1xcbmxldCB7XFxuICAgIHVzZXJuYW1lLFxcbiAgICBwYXNzd29yZCxcXG59ID0gZ2V0RmlsZSgpO1xcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG59KSk7XFxubGV0IGRhdGFJdGVtID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwiZ2V0YnlpZFxcXCIpICsgXFxcIj9pZD1cXFwiICsgaWQpKS5yZXN1bHQ7XFxuc2V0UGFnZVRpdGxlKFxcXCLnvJbovpHjgIxcXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCLjgI1cXFwiKTtcXG5sZXQgcmVxQnlHZXQgPSBcXFwiP2lkPVxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXCImcXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQ7XFxubGV0IHJ1bGVMaXN0SnNvbiA9IGdldEFwaShcXFwicnVsZUxpc3RKc29uXFxcIikgKyBcXFwiP2lkPVxcXCI7XFxubGV0IGRhdGEgPSBbXTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIueJiOacrFxcXCIpLFxcbiAgICBkZXNjOiBcXFwi4oCc4oCc4oCd4oCd5LqR56uv54mI5pysOlxcXCIgKyBjb2xvcihkYXRhSXRlbS52ZXIsIFxcXCIjNWNmZjJjXFxcIikgKyBcXFwiXFxcXG7kuIrmrKHmj5DkuqTkuo46IFtcXFwiICsgY29sb3IoZGF0YUl0ZW0ubGFzdF91cGRhdGUsIFxcXCIjZmY3MDAwXFxcIikgKyBcXFwiXVxcXCIsXFxuICAgIHVybDogJChcXFwiPOW8gOWPkeiAhT5cXFxcblxcXCIgKyBkYXRhSXRlbS5hdXRob3IgKyBcXFwiXFxcXG485ZCN56ewPlxcXFxuXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFwiXFxcXG485LqR56uv54mI5pysPlxcXFxuXFxcIiArIGRhdGFJdGVtLnZlciArIFxcXCJcXFxcbjzmm7TmlrDml7bpl7Q+XFxcXG5bXFxcIiArIGRhdGFJdGVtLmxhc3RfdXBkYXRlICsgXFxcIl1cXFwiKS5jb25maXJtKCgpID0+IHt9KSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnXFxufSk7XFxubGV0IGRhdGFUeXBlID0ge1xcbiAgICBob21lX3J1bGVfdXJsOiAn6aaW6aG15LqR6KeE5YiZJyxcXG4gICAgcHVibGlzaDogJ+aPkOS6pOS6keS7k+W6k+inhOWImScsXFxuICAgIGpzX3VybDogJ+e9kemhteaPkuS7tuinhOWImScsXFxuICAgIGh0bWw6ICfpnZnmgIHpobXpnaInLFxcbiAgICBjb25maWc6ICfkuLvpobXphY3nva4nXFxufTtcXG5cXG5sZXQgYmFzaWMgPSB7XFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG59O1xcbmxldCBkYXRhVHlwZVRpcHMgPSBkYXRhVHlwZVtkYXRhSXRlbS5kYXRhX3R5cGVdIHx8ICfmnKrnn6Xop4TliJk6JyArIGRhdGFJdGVtLmRhdGFfdHlwZTtcXG5cXG5iYXNpYy50aXRsZSA9IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLnsbvlnotcXFwiKSArIFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoXFxcIihpZDpcXFwiICsgZGF0YUl0ZW0uaWQgKyBcXFwiKVxcXCIpO1xcbmJhc2ljLmRlc2MgPSBcXFwi5pWw5o2u57G75Z6L77yaXFxcIiArIGNvbG9yKGRhdGFUeXBlVGlwcywgXFxcIiNjYjU0ZmZcXFwiKSArIFxcXCJcXFxcbuWIhuS6q+eKtuaAgeS4uu+8mlxcXCIgKyBkYXRhSXRlbS5zdGF0ZTtcXG5pZiAoW1xcXCJodG1sXFxcIiwgXFxcImNvbmZpZ1xcXCIsIFxcXCJqc191cmxcXFwiXS5pbmNsdWRlcyhkYXRhSXRlbS5kYXRhX3R5cGUpKSB7XFxuICAgIGJhc2ljLmRlc2MgKz0gXFxcIlxcXFxu4oCc4oCc4oCd4oCdID0+XFxcIiArIHNtYWxsKFxcXCLngrnmraTpooTop4hcXFwiKTtcXG4gICAgYmFzaWMudXJsID0gcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxufVxcbmxldCBhdXRoID0gXFxcIlxcXCI7XFxuaWYgKGRhdGFJdGVtLnN0YXRlID09IFxcXCJwcml2YXRlXFxcIikge1xcbiAgICBsZXQgYXV0aF9iYWNrID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwiYXV0aFxcXCIpICsgcmVxQnlHZXQpKTtcXG4gICAgYmFzaWMudGl0bGUgPSBiYXNpYy50aXRsZSArIFxcXCJcXFxcblxcXCIgKyBzbWFsbChjb2xvcihhdXRoX2JhY2sucmVzdWx0LCBcXFwiZ3JleVxcXCIpKTtcXG4gICAgYXV0aCA9ICcmYXV0aD0nICsgYXV0aF9iYWNrLnJlc3VsdDtcXG4gICAgYmFzaWMudXJsID0gYmFzaWMudXJsID09PSBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIgPyBiYXNpYy51cmwgOiBiYXNpYy51cmwgKyBhdXRoO1xcbn1cXG5kYXRhLnB1c2goYmFzaWMpO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi5pON5L2cXFxcIiksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwidG9hc3Q6Ly/kvaDmiY3mmK/mnIDluIXnmoTpgqPkuKrkurrvvIFcXFwiXFxufSk7XFxubGV0IGltcG9ydFVybCwgcnVsZUNvZGUsIHNoYXJlVXJsLCBiYWNrQ29kZSA9IFxcXCJcXFwiO1xcbmlmICghZGF0YUl0ZW0uaXNfanNvbikge1xcbiAgICBiYWNrQ29kZSA9IHJlcXVlc3QocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyBhdXRoKTtcXG59XFxuc3dpdGNoIChkYXRhSXRlbS5kYXRhX3R5cGUpIHtcXG4gICAgY2FzZSBcXFwiaG9tZV9ydWxlX3VybFxcXCI6XFxuICAgICAgICBydWxlQ29kZSA9IFxcXCLmtbfpmJTop4bnlYzpppbpobXpopHpgZPop4TliJnjgJBcXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCLjgJHvv6Vob21lX3J1bGVfdXJs77+lXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgYXV0aDtcXG4gICAgICAgIGltcG9ydFVybCA9IFxcXCJydWxlOi8vXFxcIiArIGJhc2U2NEVuY29kZShydWxlQ29kZSlcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlICdwdWJsaXNoJzpcXG4gICAgICAgIHJ1bGVDb2RlID0gJ+a1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8micgKyBkYXRhSXRlbS5uYW1lICsgJ++/pXB1Ymxpc2jvv6UnICsgYmFzZTY0RW5jb2RlKGJhY2tDb2RlKTtcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAnanNfdXJsJzpcXG4gICAgICAgIHJ1bGVDb2RlID0gJ+a1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8mue9kemhteaPkuS7tu+/pWpzX3VybO+/pScgKyBkYXRhSXRlbS5uYW1lICsgJ0BiYXNlNjQ6Ly8nICsgYmFzZTY0RW5jb2RlKGJhY2tDb2RlKTtcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAnaHRtbCc6XFxuICAgICAgICBsZXQgZmlsZV90bXAgPSBkYXRhSXRlbS5uYW1lLnNwbGl0KCcuJyk7XFxuICAgICAgICBsZXQgZmlsZV9wYXRoID0gZmlsZV90bXAubGVuZ3RoID4gMSA/IGZpbGVfdG1wW2ZpbGVfdG1wLmxlbmd0aCAtIDFdICsgXFxcIi9cXFwiICsgZGF0YUl0ZW0ubmFtZSA6IGRhdGFJdGVtLm5hbWU7XFxuICAgICAgICBydWxlQ29kZSA9IFxcXCLmtbfpmJTop4bnlYzmnKzlnLDmlofku7bliIbkuqvvv6VmaWxlX3VybO+/pWhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9cXFwiICsgZmlsZV9wYXRoICsgXFxcIkBcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyBhdXRoO1xcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgIGJyZWFrXFxuICAgIGNhc2UgXFxcImNvbmZpZ1xcXCI6XFxuICAgICAgICBpbXBvcnRVcmwgPSAkKCkucnVsZShwYXNzd29yZCA9PiB7XFxuICAgICAgICAgICAgZXZhbChmZXRjaChcXFwiaGlrZXI6Ly9hc3NldHMvaG9tZS5qc1xcXCIpKTtcXG4gICAgICAgICAgICBIaWtlckhvbWUubG9hZChcXFwiaW1wb3J0XFxcIiwgcGFzc3dvcmQpO1xcbiAgICAgICAgfSwgYmFja0NvZGUpO1xcbiAgICAgICAgYnJlYWs7XFxufVxcbmxldCBteV9jb2xfdHlwZSA9IFxcXCJ0ZXh0XzJcXFwiO1xcbmlmIChpbXBvcnRVcmwpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5a+85YWl6KeE5YiZXFxcIixcXG4gICAgICAgIHVybDogaW1wb3J0VXJsLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pO1xcbn1cXG5pZiAocnVsZUNvZGUpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5YiG5Lqr6KeE5YiZXFxcIixcXG4gICAgICAgIHVybDogXFxcImNvcHk6Ly9cXFwiICsgcnVsZUNvZGUsXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSk7XFxufVxcblxcbmZ1bmN0aW9uIHNldFNldHRpbmdJdGVtKGJhc2ljLCBwYXR0ZXJuKSB7XFxuICAgIGxldCB0ZW1wID0ge1xcbiAgICAgICAgdGl0bGU6IGJhc2ljLnRpdGxlLFxcbiAgICAgICAgY29sX3R5cGU6IGJhc2ljLmNvbF90eXBlLFxcbiAgICAgICAgdXJsOiAkKGJhc2ljLmNvbmZpcm0pLmNvbmZpcm0oKHVybCwgbXNnLCBwYXR0ZXJuKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGJhY2tBID0gcmVxdWVzdCh1cmwpO1xcbiAgICAgICAgICAgIGxldCByZXQgPSBKU09OLnBhcnNlKGJhY2tBKTtcXG4gICAgICAgICAgICBpZiAocmV0LnN0YXR1cyA9PSAwKSB7XFxuICAgICAgICAgICAgICAgIHBhdHRlcm4gPyBiYWNrKCkgOiByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgbXNnWzBdO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHBhdHRlcm4gPyBiYWNrKCkgOiByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgbXNnWzFdICsgXFxcIlxcXFxuXFxcIiArIHJldC5kZXRhaWw7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgYmFzaWMudXJsLCBiYXNpYy5tc2csIHBhdHRlcm4pXFxuICAgIH07XFxuICAgIHJldHVybiB0ZW1wO1xcbn1cXG5pZiAoZGF0YUl0ZW0uc3RhdGUgPT0gJ3ByaXZhdGUnKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuiuvuS4uuWFrOW8gFxcXCIsXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXCJzaGFyZVxcXCIpICsgcmVxQnlHZXQgKyBcXFwiJmZsYWdcXFwiICsgXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIHJlcXVlc3QoaW5wdXQpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey6K6+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+PHNtYWxsPiNcXFwiICsgaXRlbS5pZCArIFxcXCI8L3NtYWxsPjxmb250PlxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9SZXBseVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6e1xcbiAgICAgICAgICAgICAgICBydWxlSWQ6IGRhdGFJdGVtLmlkLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXFxuICAgICAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcXG4gICAgICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxcbiAgICAgICAgICAgICAgICByZXBseUlkOml0ZW0uaWRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXG4gICAgICAgICAgICBkZXNjOiBSZXBseStpdGVtLmNyZWF0ZV9kYXRlICsgXFxcIsK3XFxcIiArIGljb25baXRlbS5kaXNjdXNzX3R5cGVdLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICB0eXBlOiBcXFwibG9uZ190ZXh0XFxcIixcXG4gICAgICAgICAgICAgICAgdGV4dDogaXRlbS5kaXNjdXNzX3RleHRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcImljb25fMl9yb3VuZFwiLFwibmFtZVwiOlwi6KeE5YiZ5YiX6KGoXCIsXCJwYXRoXCI6XCJydWxlc1wiLFwicnVsZVwiOlwianM6XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCQudG9TdHJpbmcoKCk9PntcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5iYWNrXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuZmlsdGVyXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UudHlwZVxcXCIpO1xcbiAgICBpZihnZXRWYXIoJ1dhcmVob3VzZS5jYW5fdXBsb2FkJywnJykpe1xcbiAgICAgICAgbG9nKCfmk43kvZzov4fnpoHmraLkuIrkvKA6JytnZXRWYXIoJ1dhcmVob3VzZS5jYW5fdXBsb2FkJykpO1xcbiAgICAgICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5jYW5fdXBsb2FkXFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgfVxcbn0pKTtcXG5cXG5pZiAoZ2V0VmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIpID09PSBcXFwiMVxcXCIpIHtcXG4gICAgYmFjayhmYWxzZSk7XFxufVxcblxcbmNvbnN0IHtcXG4gICAgZ2V0QXBpLFxcbiAgICBhcGksXFxuICAgIGNvbG9yLFxcbiAgICBzbWFsbCxcXG4gICAgbG9jYWxSdWxlVmVyLFxcbiAgICBodG1sVGFnLFxcbiAgICBtZFxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5jb25zdCB7IG1lcmdlU29ydCB9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2Uvc29ydFxcXCIpO1xcbmxldCB7XFxuICAgIGF2YXRhclVybCxcXG4gICAgcXEsXFxuICAgIGlkLFxcbiAgICBjYW5fdXBsb2FkXFxufSA9IE1ZX1BBUkFNUztcXG5sZXQgZGF0YVR5cGUgPSBnZXRWYXIoXFxcIldhcmVob3VzZS50eXBlXFxcIixcXFwiXFxcIik7XFxubGV0IGJhY2tDb2RlID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwicnVsZXNVcmxcXFwiKSArIFxcXCI/bmFtZT1cXFwiICsgcXErXFxcIiZkYXRhX3R5cGU9XFxcIitkYXRhVHlwZSkpO1xcbmxldCBkZXZOYW1lID0gYmFja0NvZGUuZGV2X25hbWU7XFxucHV0VmFyKFxcXCJXYXJlaG91c2UuZmlsdGVyXFxcIiwgZGV2TmFtZSk7XFxubGV0IHJ1bGVMaXN0ID0gYmFja0NvZGUucmVzdWx0O1xcbmxldCBzdWJVcmwgPSBnZXRBcGkoXFxcImpzb25MaXN0XFxcIikgKyBcXFwiP25hbWU9XFxcIiArIHFxO1xcbmxldCBoYXNTdWIgPSBoYXNIb21lU3ViKHN1YlVybCk7XFxubGV0IGRldkluZm8gPSBcXFwi6L+Z5Liq5Lq65b6I5oeSLOS7gOS5iOmDveayoeWGmeWTpn5cXFwiO1xcbmxldCB0bXBKc29uID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwiaW5mb0dldFVybFxcXCIpICsgcXEpKTtcXG5pZiAodG1wSnNvbi5zdGF0dXMgPT0gMCkge1xcbiAgICBkZXZJbmZvID0gdG1wSnNvbi5yZXN1bHQgfHwgZGV2SW5mbztcXG59XFxubGV0IHN1YkZsYWcgPSBoYXNTdWIgPyAn8J+GlycgOiAn8J+ToSc7XFxubGV0IGRhdGEgPSBbXTtcXG5yZXF1aXJlKG1kKTtcXG5kZXZJbmZvPW1hcmtlZC5wYXJzZShkZXZJbmZvKTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBkZXZOYW1lICsgXFxcIlxcXFxuXFxcXG5cXFwiICsgc21hbGwoaHRtbFRhZyhcXFwidVxcXCIsIFxcXCLngrnlh7vmn6XnnIvlrozmlbTlhazlkYpcXFwiKSksXFxuICAgIGRlc2M6IHNtYWxsKGRldkluZm8pLFxcbiAgICB1cmw6ICdoaWtlcjovL3BhZ2UvaW5mbycsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0ZXh0OiBkZXZJbmZvLFxcbiAgICAgICAgbmFtZTogZGV2TmFtZSxcXG4gICAgICAgIHR5cGU6XFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSxcXG4gICAgcGljX3VybDogYXZhdGFyVXJsLFxcbiAgICBjb2xfdHlwZTogJ21vdmllXzFfdmVydGljYWxfcGljJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwiPGJpZz7orqLpmIXnrqHnkIY8L2JpZz4mbmJzcDsmbmJzcDs8c21hbGw+KOW9k+WJjVxcXCIgKyAoaGFzU3ViID8gXFxcIuW3suiuoumYhVxcXCIgOiBcXFwi5pyq6K6i6ZiFXFxcIikgKyBcXFwiKTwvc21hbGw+XFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxufSk7XFxuXFxubGV0IHN1Yl9jb2RlID0gJ+a1t+mYlOinhueVjOWQiOmbhuinhOWImeiuoumYhe+/pWhvbWVfc3Vi77+lJyArIGRldk5hbWUgKyBcXFwi5ZCI6ZuGQEBcXFwiICsgc3ViVXJsO1xcbmxldCBydWxlc0NvZGUgPSAn5rW36ZiU6KeG55WM5ZCI6ZuG6KeE5YiZ77+laG9tZV9ydWxlX3VybO+/pScgKyBzdWJVcmw7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPuS4gOmUruiuoumYhTwvc3Bhbj4nLFxcbiAgICBkZXNjOiAn6K6i6ZiF4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjNWNmZjJjXFxcIj4nICsgZGV2TmFtZSArICc8L3NwYW4+55qE5omA5pyJ5Y2V6KeE5YiZ77yM5ZCI6ZuG6ZyA5Y2V54us6K6i6ZiFJyxcXG4gICAgdXJsOiBzdWJfY29kZSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzMnXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPuWvvOWFpeWFqOmDqDwvc3Bhbj4nLFxcbiAgICB1cmw6IHJ1bGVzQ29kZSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzMnXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPuWvvOWFpei9u+WQiOmbhjwvc3Bhbj4nLFxcbiAgICB1cmw6ICQoKS5sYXp5UnVsZSgoZGV2TmFtZSxzdWJVcmwsYXZhdGFyVXJsKT0+e1xcbiAgICAgICAgY29uc3Qge2dlblJ1bGV9PSQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2dlbkFwaVxcXCIpO1xcbiAgICAgICAgbG9nKFxcXCLovbvlkIjpm4blm77moIfpk77mjqU6XFxcIithdmF0YXJVcmwpO1xcbiAgICAgICAgbGV0IGltcG9ydF9ydWxlPWdlblJ1bGUoXFxcIui9u+WQiOmbhi5cXFwiK2Rldk5hbWUsc3ViVXJsLGF2YXRhclVybCk7XFxuICAgICAgICAvL2NvcHkoaW1wb3J0X3J1bGUpO1xcbiAgICAgICAgbGV0IHJ1bGVDb2RlPXBhcnNlUGFzdGUoaW1wb3J0X3J1bGUuc3BsaXQoXFxcIlxcXFxuXFxcIilbMF0pO1xcbiAgICAgICAgLy9yZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgcmV0dXJuIGltcG9ydFVybFxcbiAgICB9LGRldk5hbWUsc3ViVXJsLGF2YXRhclVybCksXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcbn0pO1xcbmxldCBjYW5fdXBsb2FkX2FwaSA9IGdldEFwaShcXFwibWFuQ2FuVXBsb2FkXFxcIikraWQ7XFxuaWYoZ2V0VmFyKCdob3VzZS5pc19tYW5hZ2VyJykpe1xcbiAgICBsZXQgdGlwcyA9IGNhbl91cGxvYWQ/J+iDvSc6J+WQpic7XFxuICAgIC8vIGxvZygndGlwczonK3RpcHMpO1xcbiAgICAvLyBsb2coJ2Nhbl91cGxvYWQ6JytjYW5fdXBsb2FkKTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifimqDog73lkKbkuIrkvKA6JysoZ2V0VmFyKCdXYXJlaG91c2UuY2FuX3VwbG9hZCcpfHx0aXBzKSxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDonaGlrZXI6Ly9lbXB0eSdcXG4gICAgfSk7XFxuICAgIGZ1bmN0aW9uIHNldFVwbG9hZChmbGFnLGNhbl91cGxvYWRfYXBpKSB7XFxuICAgICAgICBmbGFnID0gZmxhZyB8fCAnJztcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IGNvZGUgPSBmZXRjaChjYW5fdXBsb2FkX2FwaSwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcIlVzZXItQWdlbnRcXFwiOiBNT0JJTEVfVUF9LFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1c2VybmFtZVxcXCI6IGdldFZhcignaG91c2UudXNlcm5hbWUnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogZ2V0VmFyKCdob3VzZS5wYXNzd29yZCcpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiY2FuX3VwbG9hZFxcXCI6ICEhZmxhZ1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGNvZGUgPSBKU09OLnBhcnNlKGNvZGUpLnJlc3VsdDtcXG4gICAgICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBlLm1lc3NhZ2VcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6J/CfmqvnpoHmraLkuIrkvKAnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+emgeatouivpeW8gOWPkeiAheS4iuS8oOinhOWImT/kvaDnmoTmk43kvZzlsIbooqvns7vnu5/orrDlvZUnKS5jb25maXJtKChpZCxjYW5fdXBsb2FkX2FwaSxzZXRVcGxvYWQpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldFVwbG9hZChmYWxzZSxjYW5fdXBsb2FkX2FwaSk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHB1dFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnLCflkKYnKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXG4gICAgICAgIH0saWQsY2FuX3VwbG9hZF9hcGksc2V0VXBsb2FkKVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifinIXlhYHorrjkuIrkvKAnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+WFgeiuuOivpeW8gOWPkeiAheS4iuS8oOinhOWImT/kvaDnmoTmk43kvZzlsIbooqvns7vnu5/orrDlvZUnKS5jb25maXJtKChpZCxjYW5fdXBsb2FkX2FwaSxzZXRVcGxvYWQpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldFVwbG9hZCh0cnVlLGNhbl91cGxvYWRfYXBpKTtcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKCdXYXJlaG91c2UuY2FuX3VwbG9hZCcsJ+aYrycpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcbiAgICAgICAgfSxpZCxjYW5fdXBsb2FkX2FwaSxzZXRVcGxvYWQpXFxuICAgIH0pO1xcbn1cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIjxzbWFsbD7mj5DnpLrvvJrlvIDlj5HogIXljZXni6zliIbkuqvnmoTlkIjpm4bmlofku7blj6rog73ljZXni6zlr7zlhaXjgII8L3NtYWxsPlxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwiPGJpZz7op4TliJnliJfooag8L2JpZz4mbmJzcDsmbmJzcDs8c21hbGw+KOWFsVxcXCIgKyBydWxlTGlzdC5sZW5ndGggKyBcXFwi5p2hKTwvc21hbGw+XFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxufSk7XFxubGV0IGRhdGFUeXBlTGlzdCA9IHtcXG4gICAgXFxcIlxcXCI6XFxcIuWFqOmDqFxcXCIsXFxuICAgIFxcXCJob21lX3J1bGVfdXJsXFxcIjogJ+Wwj+eoi+W6jycsXFxuICAgIC8vXFxcInB1Ymxpc2hcXFwiOiAn5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZJyxcXG4gICAgXFxcImpzX3VybFxcXCI6ICfnvZHpobXmj5Lku7YnLFxcbiAgICBcXFwiaHRtbFxcXCI6ICfpnZnmgIHpobXpnaInLFxcbiAgICBcXFwiY29uZmlnXFxcIjogJ+S4u+mimCdcXG59O1xcbmZvcihsZXQga2V5IGluIGRhdGFUeXBlTGlzdCl7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTpkYXRhVHlwZT09PWtleT9cXFwi4oCc4oCcXFxcIitkYXRhVHlwZUxpc3Rba2V5XStcXFwi4oCd4oCdXFxcIjpkYXRhVHlwZUxpc3Rba2V5XSxcXG4gICAgICAgIHVybDokKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChrZXkpPT57XFxuICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UudHlwZVxcXCIsa2V5KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sa2V5KSxcXG4gICAgICAgIGNvbF90eXBlOlxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbiAgICB9KTtcXG59XFxuaWYgKHJ1bGVMaXN0Lmxlbmd0aCA+IDIwKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuaQnOe0olxcXCIsXFxuICAgICAgICB1cmw6ICQudG9TdHJpbmcobmFtZSA9PiBcXFwiaGlrZXI6Ly9zZWFyY2g/cz1cXFwiICsgaW5wdXQgKyBcXFwiJnJ1bGU9XFxcIiArIG5hbWUsIE1ZX1JVTEUudGl0bGUpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICBkZXNjOiBcXFwi5pCc57Si5b2T5YmN5byA5Y+R6ICF55qE6KeE5YiZXFxcIlxcbiAgICB9KTtcXG59XFxubGV0IGhvbWVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5ob21lKSk7XFxubGV0IG1SdWxlTGlzdCA9IFtdO1xcbmZvciAodmFyIGl0ZW0gb2YgcnVsZUxpc3QpIHtcXG4gICAgdmFyIG5hbWUgPSBpdGVtLm5hbWU7XFxuICAgIGlmIChpdGVtLmlzX3RhcCkge1xcbiAgICAgICAgbGV0IGxvY2F0aW9uID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwicnVsZUxpc3RKc29uXFxcIikgKyBcXFwiP2lkPVxcXCIgKyBpdGVtLmlkKSk7XFxuICAgICAgICBpdGVtLmlkID0gbG9jYXRpb24uaWQ7XFxuICAgICAgICBpdGVtLm5hbWUgPSBsb2NhdGlvbi5uYW1lO1xcbiAgICAgICAgaXRlbS5hdXRob3IgPSBsb2NhdGlvbi5hdXRob3I7XFxuICAgICAgICBpdGVtLmRhdGFfdHlwZSA9IGxvY2F0aW9uLmRhdGFfdHlwZTtcXG4gICAgICAgIGl0ZW0udmVyID0gbG9jYXRpb24udmVyXFxuICAgIH1cXG4gICAgaXRlbS52ZXJzaW9uID0gaXRlbS52ZXI7XFxuICAgIGxldCBsYWJlbCA9IFxcXCJcXFwiLFxcbiAgICAgICAgbHZlciA9IC0yO1xcbiAgICBpZiAoaXRlbS5pc19qc29uICYmIGl0ZW0uZGF0YV90eXBlID09PSBcXFwiaG9tZV9ydWxlX3VybFxcXCIpIHtcXG4gICAgICAgIGx2ZXIgPSBsb2NhbFJ1bGVWZXIoaG9tZUxpc3QsIGl0ZW0pO1xcbiAgICAgICAgaWYgKGx2ZXIgPT09IC0xKSB7XFxuICAgICAgICAgICAgbGFiZWwgPSBcXFwi8J+GlVxcXCI7XFxuICAgICAgICB9IGVsc2UgaWYgKGx2ZXIgPCBpdGVtLnZlcikge1xcbiAgICAgICAgICAgIGxhYmVsID0gXFxcIvCfhplcXFwiO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIG1SdWxlTGlzdC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBsYWJlbCArIG5hbWUsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBsdmVyOiBsdmVyLFxcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkXFxuICAgICAgICB9LFxcbiAgICAgICAgcGljX3VybDogaXRlbS5waWMsXFxuICAgIH0pO1xcbn1cXG4vKiDlvZLlubbmjpLluo8gU3RhcnQgKi9cXG5tUnVsZUxpc3QgPSBtZXJnZVNvcnQobVJ1bGVMaXN0KTtcXG4vKiDlvZLlubbmjpLluo8gRW5kICovXFxuZGF0YS5wdXNoLmFwcGx5KGRhdGEsIG1SdWxlTGlzdClcXG5zZXRSZXN1bHQoZGF0YSk7XFxuXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop4TliJnor6bnu4YtdXNlclwiLFwicGF0aFwiOlwicnVsZURldGFpbFwiLFwicnVsZVwiOlwianM6XFxuICAgIGNvbnN0IHtcXG4gICAgICAgIGdldEFwaSxcXG4gICAgICAgIGNvbG9yLFxcbiAgICAgICAgc21hbGwsXFxuICAgICAgICBodG1sVGFnLFxcbiAgICAgICAgYXBpLFxcbiAgICAgICAgbWRcXG4gICAgfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGlkLFxcbiAgICBsdmVyLFxcbiAgICBpc0FsbFxcbn0gPSBNWV9QQVJBTVM7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKChpc0FsbCkgPT4ge1xcbiAgICBpZighaXNBbGwpe1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICB9XFxufSxpc0FsbCkpO1xcbmxldCBkYXRhSXRlbSA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcImdldGJ5aWRcXFwiKSArIFxcXCI/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+IHtcXG4gICAgICAgICAgICBldmFsKGZldGNoKFxcXCJoaWtlcjovL2Fzc2V0cy9ob21lLmpzXFxcIikpO1xcbiAgICAgICAgICAgIEhpa2VySG9tZS5sb2FkKFxcXCJpbXBvcnRcXFwiLCBwYXNzd29yZCk7XFxuICAgICAgICB9LCBiYWNrQ29kZSk7XFxuICAgICAgICBicmVhaztcXG59XFxubGV0IG15X2NvbF90eXBlID0gXFxcInRleHRfMlxcXCI7XFxuaWYgKGltcG9ydFVybCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLlr7zlhaXop4TliJlcXFwiLFxcbiAgICAgICAgdXJsOiBkYXRhSXRlbS5pc19zYWZlP2ltcG9ydFVybDondG9hc3Q6Ly/po47pmanop4TliJnnpoHmraLlr7zlhaUhISEnLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pO1xcbn1cXG5pZiAocnVsZUNvZGUpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5YiG5Lqr5Y+j5LukXFxcIixcXG4gICAgICAgIHVybDogXFxcImNvcHk6Ly9cXFwiICsgcnVsZUNvZGUsXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSk7XFxufVxcblxcbmlmIChpbXBvcnRVcmwpIHtcXG4gICAgaWYgKGRhdGFJdGVtLmlzX2pzb25fbGlzdCAmJiAhaGFzU3ViKSB7XFxuICAgICAgICBsZXQgc3ViX3J1bGVfY29kZSA9ICfmtbfpmJTop4bnlYzlkIjpm4bop4TliJnorqLpmIXvv6Vob21lX3N1Yu+/pScgKyBkYXRhSXRlbS5uYW1lICsgXFxcIkBAXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkO1xcbiAgICAgICAgbGV0IHN1Yl91cmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUoc3ViX3J1bGVfY29kZSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn6K6i6ZiF5ZCI6ZuGJyxcXG4gICAgICAgICAgICB1cmw6IHN1Yl91cmwsXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPuWvvOWFpei9u+WQiOmbhjwvc3Bhbj4nLFxcbiAgICAgICAgICAgIHVybDogJCgpLmxhenlSdWxlKChkYXRhSXRlbSxzdWJVcmwpPT57XFxuICAgICAgICAgICAgICAgIGNvbnN0IHtnZW5SdWxlfT0kLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9nZW5BcGlcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IGltcG9ydF9ydWxlPWdlblJ1bGUoZGF0YUl0ZW0ubmFtZStcXFwiLlxcXCIrZGF0YUl0ZW0uYXV0aG9yLHN1YlVybCk7XFxuICAgICAgICAgICAgICAgIC8vY29weShpbXBvcnRfcnVsZSk7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlQ29kZT1wYXJzZVBhc3RlKGltcG9ydF9ydWxlLnNwbGl0KFxcXCJcXFxcblxcXCIpWzBdKTtcXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICAgICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBpbXBvcnRVcmxcXG4gICAgICAgICAgICB9LGRhdGFJdGVtLHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIjxzbWFsbD7mj5DnpLrvvJrlvIDlj5HogIXljZXni6zliIbkuqvnmoTlkIjpm4bmlofku7blj6rog73ljZXni6zlr7zlhaXjgII8L3NtYWxsPlxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfSBlbHNlIGlmICghZGF0YUl0ZW0uaXNfanNvbl9saXN0ICYmICFoYXNTdWIgJiYgZGF0YUl0ZW0uZGF0YV90eXBlID09ICdob21lX3J1bGVfdXJsJykge1xcbiAgICAgICAgbGV0IHN1Yl9ydWxlX2NvZGUgPSAn5rW36ZiU6KeG55WM5Y2V6KeE5YiZ6K6i6ZiF77+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+aMgWhpa2VyLGZpbGUsaHR0cCzkuLvpophcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgb25DaGFuZ2U6IFxcXCJwdXRWYXIoJ2hvdXNlLndlYl91cmwnLGlucHV0KVxcXCIsXFxuICAgICAgICB0aXRsZVZpc2libGU6IHRydWUsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6Z2V0VmFyKCdob3VzZS53ZWJfdXJsJylcXG4gICAgfSxcXG4gICAgdXJsOiQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgbGV0IGlucHV0ID0gZ2V0VmFyKCdob3VzZS53ZWJfdXJsJywnJyk7XFxuICAgICAgICBpZihpbnB1dC5sZW5ndGg8Mil7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mTvuaOpeS4jeWPr+S7peS4uuepuidcXG4gICAgICAgIH0gZWxzZSBpZigvXmhpa2VyOnxeZmlsZTp8Xmh0dHA6fF5odHRwczp8XlxcXFwvc3RvcmFnZVxcXFwvfF5cXFxcL3NkY2FyZFxcXFwvLy50ZXN0KGlucHV0KSl7XFxuICAgICAgICAgICAgaWYoL15cXFxcL3N0b3JhZ2VcXFxcL3xeXFxcXC9zZGNhcmRcXFxcLy8udGVzdChpbnB1dCkpe1xcbiAgICAgICAgICAgICAgICBpbnB1dCA9ICdmaWxlOi8vJytpbnB1dDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbG9nKCfmraPluLjpk77mjqU6JytpbnB1dCk7XFxuICAgICAgICAgICAgbGV0IHVhID0gZ2V0SXRlbSgnaG91c2UuZmlsZV91YScpPT09J+eUteiEkSc/J01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OC4wLjQzMjQuMTQ2IFNhZmFyaS81MzcuMzYnOidNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOTsgTUkgNikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg5LjAuNDM4OS45MCBNb2JpbGUgU2FmYXJpLzUzNy4zNic7XFxuICAgICAgICAgICAgbGV0IHdlYl91cmxfYXJyID0gaW5wdXQuc3BsaXQoJzsnKTtcXG4gICAgICAgICAgICBsZXQgd2ViX3VybCA9IHdlYl91cmxfYXJyWzBdO1xcbiAgICAgICAgICAgIGxldCBoZWFkZXJzID0ge1xcbiAgICAgICAgICAgICAgICAnUmVmZXJlcic6J2h0dHBzOi8vYmxvZy5jc2RuLm5ldCcsXFxuICAgICAgICAgICAgICAgICdVc2VyLUFnZW50Jzp1YSxcXG4gICAgICAgICAgICAgICAgJ0FjY2VwdCc6J2FwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCwgKi8qOyBxPTAuMDEnLFxcbiAgICAgICAgICAgICAgICAnQWNjZXB0LUxhbmd1YWdlJzonemgtQ04nLFxcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgaWYod2ViX3VybF9hcnIubGVuZ3RoPj0zJiZ3ZWJfdXJsX2FyclsyXS5sZW5ndGg+Mil7IC8v6K6+572u57yW56CBXFxuICAgICAgICAgICAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gJ2NoYXJzZXQ9Jyt3ZWJfdXJsX2FyclsyXS50b1VwcGVyQ2FzZSgpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgcGFyYW1zID0ge2hlYWRlcnM6aGVhZGVycyx3aXRoSGVhZGVyczpmYWxzZSxyZWRpcmVjdDpmYWxzZX07XFxuICAgICAgICAgICAgaWYod2ViX3VybF9hcnIubGVuZ3RoPj0yJiZ3ZWJfdXJsX2FyclsxXS5sZW5ndGg+Mil7IC8vIOiuvue9ruivt+axguaWueazlVxcbiAgICAgICAgICAgICAgICBwYXJhbXNbJ21ldGhvZCddID0gd2ViX3VybF9hcnJbMV0udG9VcHBlckNhc2UoKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbG9nKCflvIDlp4vojrflj5bmupDnoIEnKTtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAvKlxcbiAgICAgICAgICAgICAgICByZXF1ZXN0QXN5bmMod2ViX3VybCxwYXJhbXMsZnVuY3Rpb24gKGtleSxjb2RlKSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgYmFja19jb2RlID0gY29kZTtcXG4gICAgICAgICAgICAgICAgICAgIGlmKGJhY2tfY29kZS5sZW5ndGg+MjApe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1dFZhcignaG91c2UudXBsb2FkX2NvZGUnLGJhY2tfY29kZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+a6kOeggeW3suiOt+WPlizlubbpg6jliIbmj5LlhaXliLDmlofmnKzljLrln58nXFxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZSZ6K+v77yM5pys5qyh6I635Y+W5Yiw56m65paH5pys77yM55aR5Ly85L2g5rKh5pyJ5q2k5paH5Lu2ISc7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgICAgICBsZXQgYmFja19jb2RlID0gZ2V0SXRlbSgnaG91c2UuZmlsZV91YScpPT09J+eUteiEkSc/ZmV0Y2god2ViX3VybCxwYXJhbXMpOnJlcXVlc3Qod2ViX3VybCxwYXJhbXMpO1xcbiAgICAgICAgICAgICAgICBpZihiYWNrX2NvZGUubGVuZ3RoPjIwKXtcXG4gICAgICAgICAgICAgICAgICAgIHB1dFZhcignaG91c2UudXBsb2FkX2NvZGUnLGJhY2tfY29kZSk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/mupDnoIHlt7Lojrflj5Ys5bm26YOo5YiG5o+S5YWl5Yiw5paH5pys5Yy65Z+fJ1xcbiAgICAgICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/plJnor6/vvIzmnKzmrKHojrflj5bliLDnqbrmlofmnKzvvIznlpHkvLzkvaDmsqHmnInmraTmlofku7YhJztcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICBsb2coZS5tZXNzYWdlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+WPkeeUn+S6humUmeivrzpcXFxcbicrZS5tZXNzYWdlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1lbHNlIGlmKC/kuLvpopjvv6V85YWD57Sg77+lLy50ZXN0KGlucHV0KSl7XFxuICAgICAgICAgICAgbG9nKCfkuLvpopjpk77mjqUnKTtcXG4gICAgICAgICAgICBsZXQgd2ViX3VybF9hcnIgPSBpbnB1dC5zcGxpdCgn77+lJyk7XFxuICAgICAgICAgICAgbGV0IHdlYl91cmwgPSB3ZWJfdXJsX2Fyclt3ZWJfdXJsX2Fyci5sZW5ndGgtMV07XFxuICAgICAgICAgICAgbGV0IGJhY2tfY29kZSA9IHBhcnNlUGFzdGUod2ViX3VybCk7XFxuICAgICAgICAgICAgaWYoYmFja19jb2RlLmxlbmd0aD4yMCkge1xcbiAgICAgICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJyxiYWNrX2NvZGUpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+a6kOeggeW3suiOt+WPlizlubbpg6jliIbmj5LlhaXliLDmlofmnKzljLrln58nXFxuICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/plJnor6/vvIzmnKzmrKHojrflj5bov5Tlm57kuLo6XFxcXG4nK2JhY2tfY29kZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6Z2e5rOV6ZO+5o6lOlxcXFxuJytnZXRWYXIoJ2hvdXNlLndlYl91cmwnKTtcXG4gICAgICAgIH1cXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J+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+aekOWFjeWXhVwiLFwicGF0aFwiOlwiZ2xvYmFsUGFyc2VcIixcInJ1bGVcIjpcImpzOlxcbmZ1bmN0aW9uIGdldEhlYWRlcnMocGxheVVybCl7XFxuICAgIGxldCBoZWFkZXJzID0ge307XFxuICAgIGxldCByZWZlcj1wbGF5VXJsLnNwbGl0KFxcXCIvL1xcXCIpWzBdK1xcXCIvL1xcXCIrcGxheVVybC5zcGxpdChcXFwiLy9cXFwiKVsxXS5zcGxpdChcXFwiL1xcXCIpWzBdO1xcbiAgICBpZigvbGVjbG91ZFxcXFwuY29tfGJpbGl2aWRlb1xcXFwuY29tLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgIGhlYWRlcnMgPSB7XFxcIlJlZmVyZXJcXFwiOiAnaHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tLycsXFxcIlVzZXItQWdlbnRcXFwiOlxcXCJNb3ppbGxhLzUuMFxcXCJ9XFxuICAgIH1lbHNlIGlmKC9tZ3R2XFxcXC5jb20vLnRlc3QocGxheVVybCkpe1xcbiAgICAgICAgaGVhZGVycyA9IHtcXFwiUmVmZXJlclxcXCI6IHJlZmVyLFxcXCJVc2VyLUFnZW50XFxcIjpcXFwiTW96aWxsYS81LjBcXFwifVxcbiAgICB9ZWxzZSBpZigvaXhpZ3VhXFxcXC5jb20vLnRlc3QocGxheVVybCkpe1xcbiAgICAgICAgaGVhZGVycyA9IHtcXFwiUmVmZXJlclxcXCI6ICdodHRwczovL3d3dy5peGlndWEuY29tLycsXFxcIlVzZXItQWdlbnRcXFwiOlxcXCJNb3ppbGxhLzUuMFxcXCJ9XFxuICAgIH1lbHNle1xcbiAgICAgICAgaGVhZGVycyA9IHtcXFwiUmVmZXJlclxcXCI6IHJlZmVyLCdVc2VyLUFnZW50JzonRGFydC8yLjEzIChkYXJ0OmlvKSd9XFxuICAgIH1cXG4gICAgcmV0dXJuIGhlYWRlcnNcXG4gICAgfVxcbmZ1bmN0aW9uIGlzUGljKHN0cil7XFxuICAgIHJldHVybiAvXFxcXC4oZ2lmfGpwZ3xqcGVnfHBuZ3xHSUZ8SlBHfFBORykkLy50ZXN0KHN0cik7XFxufVxcbmZ1bmN0aW9uIGlzVmlkZW8ocGxheVVybCxyZWNoYW5nZSl7XFxuICAgIC8v5rOo5oSPLnBocOS4jeWPr+S7peiiq+aOkumZpOWQpuWImeiejeWFtOino+aekOS4jeS6hiB8LnBocCRcXG4gICAgLy/lpoLmnpzmmK/mkq3mlL7lnLDlnYDlsLHnm7TmjqXov5Tlm57lnLDlnYDliqDkuIpVQe+8jOS4jeaYr+eahOivneWwsei/lOWbnmZhbHNlXFxuICAgIHJlY2hhbmdlPXR5cGVvZihyZWNoYW5nZSk9PT1cXFwiZnVuY3Rpb25cXFwiP3JlY2hhbmdlOmZ1bmN0aW9uKHBsYXlVcmwpe3JldHVybiBwbGF5VXJsfTtcXG4gICAgbGV0IGV4Y2VwdFdvcmRzID0gJy5qcyR8LmNzcyR8LnRzJHwuaHRtbCR8Lmh0bSR8LmdpZiR8LmpwZyR8LmpwZWckfC5wbmckfC5pY28kfC5zdmckfC50eHQkJy5zcGxpdCgnfCcpLm1hcChpdD0+J1xcXFxcXFxcJytpdCkuam9pbignfCcpO1xcbiAgICB2YXIgZXhjZXB0S2V5cyA9IG5ldyBSZWdFeHAoZXhjZXB0V29yZHMpO1xcbiAgICBsZXQgZXhjZXB0V29yZHMxID0gJ3JlZmVyZXI9fHVybD0nLnNwbGl0KCd8JykubWFwKGl0PT5pdCkuam9pbignfCcpO1xcbiAgICB2YXIgZXhjZXB0S2V5czEgPSBuZXcgUmVnRXhwKGV4Y2VwdFdvcmRzMSk7XFxuICAgIGxldCByZXBsYWNlV29yZHMgPSAncGxheW0zdTh8bTN1OFxcXFwudHYnLnNwbGl0KCd8JykubWFwKGl0PT5pdCkuam9pbignfCcpO1xcbiAgICBsZXQgcmVwbGFjZUtleXMgPSBuZXcgUmVnRXhwKHJlcGxhY2VXb3JkcywnZycpO1xcbiAgICBsZXQgdmlkZW9Xb3JkcyA9IFxcXCIubXA0JHwubTN1OCR8LmZsdiR8LmF2aSR8LjNncCR8Lm1wZWckfC53bXYkfC5tb3YkfHJtdmJ8LmRhdCR8Lm1wMyR8Lm00YSR8cXFCRmRvd25sb2FkfG1pbWU9dmlkZW8lMkZ8bWltZV90eXBlPXZpZGVvX3x0eXBlPW0zdTh8cHQ9bTN1OFxcXCIuc3BsaXQoJ3wnKS5tYXAoKGl0KT0+e1xcbiAgICAgICAgLy90eXBlPW1wNFxcbiAgICAgICAgaWYoaXQuc3RhcnRzV2l0aChcXFwiLlxcXCIpKXtcXG4gICAgICAgICAgICByZXR1cm4gJ1xcXFxcXFxcJytpdFxcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuIGl0XFxuICAgICAgICB9XFxuICAgIH0pLmpvaW4oXFxcInxcXFwiKTtcXG4gICAgbGV0IHZpZGVvS2V5cyA9IG5ldyBSZWdFeHAodmlkZW9Xb3Jkcyk7XFxuICAgIGxldCBwVXJsPXBsYXlVcmwuc3BsaXQoXFxcIjtcXFwiKVswXTtcXG4gICAgbGV0IHBVcmwyPXBsYXlVcmwuc3BsaXQoXFxcIjtcXFwiKVswXS5zcGxpdChcXFwiJlxcXCIpWzBdLnNwbGl0KFxcXCI/XFxcIilbMF07XFxuICAgIGlmKCh2aWRlb0tleXMudGVzdChwVXJsKXx8dmlkZW9LZXlzLnRlc3QocFVybDIpKSYmIWV4Y2VwdEtleXMxLnRlc3QocFVybC5yZXBsYWNlKHBVcmwuc3BsaXQoXFxcIj9cXFwiKVswXSwnJykpKXtcXG4gICAgICAgIGxldCB0aXBzID0gJ+ajgOa1i+WIsOeWkeS8vOWkmuWqkuS9k+eahOWcsOWdgDonO1xcbiAgICAgICAgdHJ5e1xcbiAgICAgICAgICAgIGxvZyhcXFwianPkuK1cXFwiK3RpcHMrcFVybCk7XFxuICAgICAgICAgICAgLy8gbG9nKHBVcmwucmVwbGFjZShwVXJsLnNwbGl0KFxcXCI/XFxcIilbMF0sJycpKTtcXG4gICAgICAgICAgICAvLyBsb2coZXhjZXB0S2V5czEpO1xcbiAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgZnlfYnJpZGdlX2FwcC5sb2coJ3g15LitJyt0aXBzK3BVcmwpO1xcbiAgICAgICAgICAgIGZ5X2JyaWRnZV9hcHAubG9nKFxcXCLliIblibLpl67lj7flkI46XFxcIitwVXJsLnJlcGxhY2UocFVybC5zcGxpdChcXFwiP1xcXCIpWzBdLCcnKSk7XFxuICAgICAgICAgICAgLy8gZnlfYnJpZGdlX2FwcChleGNlcHRLZXlzMSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgLy8gbG9nKCcxOicrKHZpZGVvS2V5cy50ZXN0KHBVcmwpfHx2aWRlb0tleXMudGVzdChwVXJsMil8fHZpZGVvS2V5cy50ZXN0KHBVcmwucmVwbGFjZShyZXBsYWNlS2V5cyxcXFwiXFxcIikuc3BsaXQoXFxcIiZcXFwiKVswXS5zcGxpdChcXFwiP1xcXCIpWzBdKSkpO1xcbiAgICAvLyBsb2coJzI6JyshZXhjZXB0S2V5cy50ZXN0KHBVcmwuc3BsaXQoXFxcIj9cXFwiKVswXS5zcGxpdCgnJicpWzBdKSk7XFxuICAgIC8vIGxvZygnMzonKyFleGNlcHRLZXlzMS50ZXN0KHBVcmwucmVwbGFjZShwVXJsLnNwbGl0KFxcXCI/XFxcIilbMF0sJycpKSk7XFxuICAgIGlmICgodmlkZW9LZXlzLnRlc3QocFVybCl8fHZpZGVvS2V5cy50ZXN0KHBVcmwyKXx8dmlkZW9LZXlzLnRlc3QocFVybC5yZXBsYWNlKHJlcGxhY2VLZXlzLFxcXCJcXFwiKS5zcGxpdChcXFwiJlxcXCIpWzBdLnNwbGl0KFxcXCI/XFxcIilbMF0pICkmJiAhZXhjZXB0S2V5cy50ZXN0KHBVcmwuc3BsaXQoXFxcIj9cXFwiKVswXS5zcGxpdCgnJicpWzBdKSYmIWV4Y2VwdEtleXMxLnRlc3QocFVybC5yZXBsYWNlKHBVcmwuc3BsaXQoXFxcIj9cXFwiKVswXSwnJykpKSB7XFxuICAgICAgICBpZighKC9Vc2VyLUFnZW50fFJlZmVyZXJALy50ZXN0KHBsYXlVcmwpKSl7XFxuICAgICAgICAgICAgaWYoL2xlY2xvdWRcXFxcLmNvbXxiaWxpdmlkZW8vLnRlc3QocGxheVVybCkpe1xcbiAgICAgICAgICAgICAgICBwbGF5VXJsKz1cXFwiO3tSZWZlcmVyQGh0dHBzOi8vd3d3LmJpbGliaWxpLmNvbS8mJlVzZXItQWdlbnRATW96aWxsYS81LjB9XFxcIjtcXG4gICAgICAgICAgICB9ZWxzZSBpZigvaXhpZ3VhXFxcXC5jb20vLnRlc3QocGxheVVybCkpe1xcbiAgICAgICAgICAgICAgICBwbGF5VXJsKz1cXFwiIy5tcDQ7e1JlZmVyZXJAaHR0cHM6Ly93d3cuaXhpZ3VhLmNvbS8mJlVzZXItQWdlbnRATW96aWxsYS81LjB9XFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgZWxzZSBpZigvbWd0dlxcXFwuY29tfGJ5dGVhbW9uZS8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgICAgIHBsYXlVcmwrPVxcXCI7e1VzZXItQWdlbnRATW96aWxsYS81LjB9XFxcIjtcXG4gICAgICAgICAgICB9ZWxzZSBpZigvcHR3b1xcXFwud2tmaWxlXFxcXC5jb20vLnRlc3QocGxheVVybCkmJi91cmw9Ly50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICAgICAgcGxheVVybD1wbGF5VXJsLnNwbGl0KFxcXCJ1cmw9XFxcIilbMV0rXFxcIjt7UmVmZXJlckBodHRwczovL2ZhbnR1YW4udHZ9XFxcIlxcbiAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICBwbGF5VXJsPXJlY2hhbmdlKHBsYXlVcmwpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAvLyDlpITnkIblpKfluIjlhYTkuYvnsbvnmoRhcHBcXG4gICAgICAgICAgICAvLyBlbHNle1xcbiAgICAgICAgICAgIC8vICAgICBwbGF5VXJsKz1cXFwiO3tVc2VyLUFnZW50QE1vemlsbGEvNS4wfVxcXCI7XFxuICAgICAgICAgICAgLy8gfVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHBsYXlVcmwrXFxcIiNpc1ZpZGVvPXRydWUjXFxcIjtcXG4gICAgfWVsc2V7XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH1cXG59XFxuZnVuY3Rpb24gY29tUGFyc2UocGFyU3RyLGVqLG9ubHliYWNrLGh0bWwpe1xcbiAgICAvL+WIl+ihqO+8jOagh+mimO+8jOWbvueJh++8jOaPj+i/sO+8jOmTvuaOpe+8jOWGheWuuVxcbiAgICBlaiA9IGVqfHxmYWxzZTsvL+acieS6jOe6p1xcbiAgICBvbmx5YmFjaz1vbmx5YmFja3x8ZmFsc2U7Ly/lj6rov5Tlm57mlbDmja5cXG4gICAgaHRtbCA9IGh0bWx8fGdldFJlc0NvZGUoKTtcXG4gICAgaHRtbCA9IHR5cGVvZihodG1sKT09PSdzdHJpbmcnP2h0bWw6aHRtbC5odG1sO1xcbiAgICByZXR1cm4gJC50b1N0cmluZygocGFyU3RyLGVqLG9ubHliYWNrLGh0bWwsaXNQaWMpPT57XFxuICAgICAgICBsZXQgdD1wYXJTdHIuc3BsaXQoXFxcIjtcXFwiKTtcXG4gICAgICAgIGxldCBkPVtdO1xcbiAgICAgICAgLy8gbGV0IGxpc3Q9cGRmYShnZXRSZXNDb2RlKCksdFswXSk7XFxuICAgICAgICBsZXQgbGlzdD1wZGZhKGh0bWwsdFswXSk7XFxuICAgICAgICBsZXQgbGF6eSA9ICQoJycpLmxhenlSdWxlKCgpPT57XFxuICAgICAgICAgICAgY29uc3Qge2xhenlQYXJzZX0gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9nbG9iYWxQYXJzZT9ydWxlPemBk+mVv+S7k+W6k1BybycpO1xcbiAgICAgICAgICAgIHJldHVybiBsYXp5UGFyc2UoaW5wdXQpXFxuICAgICAgICB9KTtcXG4gICAgICAgIGZvcihsZXQgaSBpbiBsaXN0KXtcXG4gICAgICAgICAgICBsZXQgX3BpYyA9IHRbMl0/cGQobGlzdFtpXSx0WzJdKTonJztcXG4gICAgICAgICAgICBpZihpc1BpYyhfcGljKSYmIS9AUmVmZXJlcj0vLnRlc3QoX3BpYykpe1xcbiAgICAgICAgICAgICAgICBfcGljKz0nQFJlZmVyZXI9J1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgaXQ9e1xcbiAgICAgICAgICAgICAgICB0aXRsZTpwZGZoKGxpc3RbaV0sdFsxXSksXFxuICAgICAgICAgICAgICAgIHBpY191cmw6X3BpYyxcXG4gICAgICAgICAgICAgICAgZGVzYzpwZGZoKGxpc3RbaV0sdFszXSksXFxuICAgICAgICAgICAgICAgIHVybDplaj9wZChsaXN0W2ldLHRbNF0pOnBkKGxpc3RbaV0sdFs0XSkrbGF6eVxcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgaWYodC5sZW5ndGg+NSl7Ly/lhoXlrrnvvIznlKjkuo7mkJzntKJcXG4gICAgICAgICAgICAgICAgaXQuY29udGVudD1wZGZoKGxpc3RbaV0sdFs1XSlcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgZC5wdXNoKGl0KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmKG9ubHliYWNrKXtcXG4gICAgICAgICAgICByZXR1cm4gZFxcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgc2V0UmVzdWx0KGQpXFxuICAgICAgICB9XFxuICAgIH0scGFyU3RyLGVqLG9ubHliYWNrLGh0bWwsaXNQaWMpXFxufVxcblxcbmZ1bmN0aW9uIGxhenlQYXJzZShwbGF5VXJsLG1zLHRtLHJlY2hhbmdlKXtcXG4gICAgLy8gbG9nKCfosIPnlKjku5PlupPlhY3ll4XmjqLkvKDlj4LotoXml7bkuLo6Jyttcyk7XFxuICAgIHRtID0gcGFyc2VJbnQodG0pfHw1MDAwO1xcbiAgICBjb25zdCB7aXNWaWRlbyxnZXRIZWFkZXJzfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2dsb2JhbFBhcnNlP3J1bGU96YGT6ZW/5LuT5bqTUHJvJyk7XFxuICAgIGxldCByZWFsVXJsID0gaXNWaWRlbyhwbGF5VXJsLHJlY2hhbmdlKTtcXG4gICAgLy9sb2cocmVhbFVybCk7XFxuICAgIGlmKHR5cGVvZihyZWFsVXJsKT09J3N0cmluZycpey8vYm9vbOWAvOWwseaYr+Wksei0pVxcbiAgICAgICAgdHJ5e1xcbiAgICAgICAgICAgIGxldCBydXJsPXJlYWxVcmwuc3BsaXQoXFxcIjtcXFwiKVswXS5zcGxpdChcXFwiI1xcXCIpWzBdO1xcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlcXVlc3QocnVybCx7dGltZW91dDp0bX0pKS51cmxcXG4gICAgICAgIH1jYXRjaChlKXtcXG4gICAgICAgICAgICByZXR1cm4gcmVhbFVybFxcbiAgICAgICAgfVxcbiAgICAgICAgLy9yZXR1cm4gcmVhbFVybFxcbiAgICB9XFxuXFxuICAgIC8vbG9nKFxcXCLorr/pl67otoXml7Y6XFxcIit0bSk7XFxuICAgIGxvZyhcXFwi5bCd6K+V6YGT6ZW/5LuT5bqTeDXlhY3ll4U6XFxcIitwbGF5VXJsKTtcXG4gICAgY2xlYXJWYXIoXFxcIl94NWp4VXJsXFxcIik7XFxuICAgIGxldCBiYWQ9JChcXFwi572R57uc5LiN5L2z5oiW6ICF55aR5Ly85a+55pa5572R56uZ5oyC5LqG77yM5L2g6KaB5p+l55yL5YW2572R6aG15ZCX77yfXFxcIikuY29uZmlybSgocGxheVVybCk9PntcXG4gICAgICAgIGxvZyhcXFwi572R56uZ55yL6LW35p2l5oyC5LqGOlxcXCIrcGxheVVybCk7XFxuICAgICAgICByZXR1cm4gcGxheVVybFxcbiAgICB9LHBsYXlVcmwpO1xcbiAgICB0cnl7XFxuICAgICAgICAvLyB2YXIgYmFjaz1yZXF1ZXN0KHBsYXlVcmwse2hlYWRlcnM6IGdldEhlYWRlcnMocGxheVVybCksdGltZW91dDp0bX0pO1xcbiAgICAgICAgdmFyIGJhY2s9ZmV0Y2gocGxheVVybCxcXG4gICAgICAgICAgICB7aGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiBQQ19VQVxcbiAgICAgICAgICAgICAgICB9fSk7XFxuICAgICAgICBpZighYmFjayl7XFxuICAgICAgICAgICAgbG9nKFxcXCLnvZHnq5lcXFwiK3BsYXlVcmwrXFxcIuehruWunuWVpeS5n+ayoei/lOWbnlxcXCIpO1xcbiAgICAgICAgICAgIHJldHVybiBiYWRcXG4gICAgICAgIH1lbHNlIGlmKC8jRVhUSU5GLy50ZXN0KGJhY2spKXtcXG4gICAgICAgICAgICAvL2xldCBsY2FjaGU9XFxcIi9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvY2FjaGUvdmlkZW8ubTN1OFxcXCI7XFxuICAgICAgICAgICAgLy93cml0ZUZpbGUobGNhY2hlLGJhY2spO1xcbiAgICAgICAgICAgIC8vcmV0dXJuIGxjYWNoZStcXFwiIyNcXFwiK3BsYXlVcmwrXFxcIiNpc1ZpZGVvPXRydWUjXFxcIlxcbiAgICAgICAgICAgIHBsYXlVcmw9Y2FjaGVNM3U4KHBsYXlVcmwpO1xcbiAgICAgICAgICAgIHJldHVybiBwbGF5VXJsXFxuICAgICAgICB9ZWxzZSBpZigoIS/op6blj5HkuobpmLLnm5fpk7585pyq5o6I5p2DfOaOpeWPo+mYsuebly8udGVzdChiYWNrKSkmJighL2h0dHB8dXJsLy50ZXN0KGJhY2spKSYmKCEvbXNnfGNvZGV8aHRtbC8udGVzdChiYWNrKSkpe1xcbiAgICAgICAgICAgIGxvZyhiYWNrKTtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v55aR5Ly85a+55pa55pWw5o2u5Yqg5a+G5LqG77yM5YW35L2T5pWw5o2u55yL5pel5b+XJ1xcbiAgICAgICAgfVxcbiAgICB9Y2F0Y2goZSl7XFxuICAgICAgICBsb2coZS5tZXNzYWdlKTtcXG4gICAgICAgIHJldHVybiBiYWRcXG4gICAgfVxcbiAgICB0cnkge1xcbiAgICAgICAgYmFjaz1KU09OLnBhcnNlKGJhY2spO1xcbiAgICAgICAgbGV0IHJlYWxVcmw9YmFjay51cmw7XFxuICAgICAgICBpZih0eXBlb2YocmVhbFVybCk9PVxcXCJ1bmRlZmluZWRcXFwifHwhcmVhbFVybCl7XFxuICAgICAgICAgICAgbG9nKGJhY2spO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/pgZPplb/ku5PlupPop6PmnpDlpLHotKXvvIHov5Tlm57mkq3mlL7lnLDlnYDkuLrnqbpcXFwiXFxuICAgICAgICB9IGVsc2UgaWYodHlwZW9mKGlzVmlkZW8ocmVhbFVybCxyZWNoYW5nZSkpPT0nc3RyaW5nJyl7XFxuICAgICAgICAgICAgcmV0dXJuIGlzVmlkZW8ocmVhbFVybCxyZWNoYW5nZSk7XFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICByZXR1cm4gcmVhbFVybCtcXFwiI2lzVmlkZW89dHJ1ZSNcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgLy9lbHNle1xcbiAgICAgICAgLy9yZWFsVXJsKz1cXFwiO3tVc2VyLUFnZW50QE1vemlsbGEvNS4wfVxcXCI7XFxuICAgICAgICAvLyB9XFxuICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKFxcXCLmo4DmtYvliLDop6PmnpDlj6PpnZ5qc29u6ZSZ6K+vOlxcXCIrZS5tZXNzYWdlKycs5byA5aeLeDXlhY3ll4XmjqInKTtcXG4gICAgICAgIGxldCBtcyA9IHBhcnNlSW50KG1zKXx8NTAwMDtcXG4gICAgICAgIGxldCBtYXhfY291bnQ9TWF0aC5jZWlsKG1zLzI1MCk7XFxuICAgICAgICBsb2coXFxcIuacrOasoeWXheaOoui2heaXtjpcXFwiK21zK1xcXCLlhbHorqHlvoXmipPljIU6XFxcIittYXhfY291bnQrXFxcIuasoVxcXCIpO1xcbiAgICAgICAgc2hvd0xvYWRpbmcoJ+WXheaOouS4re+8jOiLpeWksei0peWwsemHjeijhXg1Li4uJyk7XFxuICAgICAgICBsZXQgX3g1ID0gJC50b1N0cmluZygoaXNWaWRlbyxyZWNoYW5nZSxwbGF5VXJsLG1heF9jb3VudCxQQ19VQSk9PntcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBpZih0eXBlb2YoZmJhKT09J3VuZGVmaW5lZCd8fCFmYmEpe1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZiYSA9IGZ5X2JyaWRnZV9hcHA7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZihyZXF1ZXN0KT09J3VuZGVmaW5lZCd8fCFyZXF1ZXN0KXtcXG4gICAgICAgICAgICAgICAgICAgICAgICBldmFsKGZiYS5nZXRJbnRlcm5hbEpzKCkpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBmYmEucHV0VmFyKFxcXCJfeDVqeFVybFxcXCIscGxheVVybCk7XFxuICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5jb3VudCA9PSBudWxsKXtcXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5jb3VudD0xO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGxldCB0ZXh0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXFxcImJvZHlcXFwiKS5pbm5lclRleHQ7XFxuICAgICAgICAgICAgICAgIGlmKC/op6blj5HkuobpmLLnm5fpk7585pyq5o6I5p2DfOaOpeWPo+mYsuebly8udGVzdCh0ZXh0KSYmd2luZG93LmNvdW50PT09MSl7XFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXCLmo4DmtYvliLDmnInmjojmnYPvvIzlvIDlp4vov4fmjojmnYNcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIC8vbG9jYXRpb24ucmVsb2FkKCk7XFxuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmPWZiYS5nZXRWYXIoXFxcIl94NWp4VXJsXFxcIik7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgd2luZG93LmNvdW50Kys7XFxuICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coJ2NvdW50Oicrd2luZG93LmNvdW50KycsbWF4X2NvdW50OicrbWF4X2NvdW50KTtcXG4gICAgICAgICAgICAgICAgaWYoIHdpbmRvdy5jb3VudCA+PSBtYXhfY291bnQpe1xcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwi6LaF6L+HXFxcIittYXhfY291bnQqMjUwK1xcXCLmr6vnp5LmnKrojrflj5bliLDotYTmupDlnLDlnYDvvIzot7PliLDmupDnvZHpobUs5Lul5LiL5piv5Yqg6L296L+H55qE5Zyw5Z2AXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxcXCJib2R5XFxcIikuaW5uZXJUZXh0O1xcbiAgICAgICAgICAgICAgICAgICAgLy8gZmJhLmxvZyh0ZXh0KTtcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coSlNPTi5zdHJpbmdpZnkoX2dldFVybHMoKSkpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZiYS5nZXRWYXIoXFxcIl94NWp4VXJsXFxcIik7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gbXV0ZU1lKGVsZW0pIHtcXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5wYXVzZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB2YXIgdmlkZW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwidmlkZW9cXFwiKSwgYXVkaW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwiYXVkaW9cXFwiKSwgdjIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXCJlbWJlZFxcXCIpLCB2MyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcIiNwbGF5ZXJcXFwiKTtcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2aWRlb3MsIGZ1bmN0aW9uICh2aWRlbykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGVNZSh2aWRlbyk7XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbChhdWRpb3MsIGZ1bmN0aW9uIChhdWRpbykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGVNZShhdWRpbyk7XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2MiwgZnVuY3Rpb24gKHYpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRlTWUodik7XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2MywgZnVuY3Rpb24gKHYpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRlTWUodik7XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cXG4gICAgICAgICAgICAgICAgdmFyIHVybHMgPSBfZ2V0VXJscygpO1xcbiAgICAgICAgICAgICAgICAvLyBmYmEubG9nKEpTT04uc3RyaW5naWZ5KHVybHMpKTtcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiB1cmxzKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHU9dXJsc1tpXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnl7dT1kZWNvZGVVUklDb21wb25lbnQodSk7fWNhdGNoKGUpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1PXVuZXNjYXBlKHUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKC91cmw9aHR0cC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSB1LnNwbGl0KFxcXCJ1cmw9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXCJ1cmzliIblibI6XFxcIit1KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZigvdXJsPVxcXFwvLy50ZXN0KHUpJiYvXFxcXC5tM3U4Ly50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvc3QgPSB1Lm1hdGNoKC8oLiopXFxcXC9cXFxcLyguKj8pXFxcXC8vKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IGhvc3QrdS5zcGxpdChcXFwidXJsPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwidXJs5YiG5YmyOlxcXCIrdSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoL3ZpZD1odHRwLy50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IHUuc3BsaXQoXFxcInZpZD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcInZpZOWIhuWJsjpcXFwiK3UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKC92aWQ9XFxcXC8vLnRlc3QodSkmJi9cXFxcLm0zdTgvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdCA9IHUubWF0Y2goLyguKilcXFxcL1xcXFwvKC4qPylcXFxcLy8pWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gaG9zdCt1LnNwbGl0KFxcXCJ2aWQ9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXCJ2aWTliIblibI6XFxcIit1KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigvXFxcXD8oLiopPWh0dHAvLnRlc3QodSkmJi9cXFxcLm0zdTgvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gXFxcImh0dHBcXFwiK3Uuc3BsaXQoL1xcXFw/KC4qKT1odHRwLykuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXCLlhbbku5bliIblibI6XFxcIit1KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgLy98aW5kZXhcXFxcLm0zdTgkXFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigvXFxcXC8xXFxcXC5tM3U4Ly50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHU9dS5yZXBsYWNlKC8mZnJvbT0uKnwmbmV4dD0uKnwmanVtcD0uKi8sJycpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFsVXJsID0gaXNWaWRlbyh1LHJlY2hhbmdlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YocmVhbFVybCk9PSdzdHJpbmcnKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwi5LuT5bqTeDXlhY3ll4Xnu5Pmnpw6XFxcIityZWFsVXJsKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9meV9icmlkZ2VfYXBwLnNldFdlYlVhKFBDX1VBKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxVcmxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhlLm1lc3NhZ2UpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgLy8gZnlfYnJpZGdlX2FwcC5sb2coJ3g15aSn6IyD5Zu06ZSZ6K+vOicrZS5tZXNzYWdlKTtcXG4gICAgICAgICAgICAgICAgYWxlcnQoJ3g15aSn6IyD5Zu06ZSZ6K+vOicrZS5tZXNzYWdlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+aKpemUmee7k+adn3g1J1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0saXNWaWRlbyxyZWNoYW5nZSxwbGF5VXJsLG1heF9jb3VudCxQQ19VQSk7XFxuICAgICAgICBjb25zdCBsc2c9JC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbG9jYWxTdG9yYWdlP3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgICAgICBsZXQgdXNlV2ViPWxzZy5nZXRJdGVtKFxcXCLpgJrlhY1cXFwiLFxcXCJYNVxcXCIpPT09XFxcIldFQlxcXCI7XFxuICAgICAgICAvL2xvZyhcXFwi5LuT5bqT5L2/55Sod2Vi6YCa5YWN5pu/5LujeDU6XFxcIit1c2VXZWIpO1xcbiAgICAgICAgbGV0IHJ1bGVIZWFkPXVzZVdlYiYmcGFyc2VJbnQoZ2V0QXBwVmVyc2lvbigpKT49MjMzOT9cXFwid2ViUnVsZTovL1xcXCI6XFxcIng1UnVsZTovL1xcXCI7XFxuICAgICAgICBsZXQgeDVVcmwgPSBydWxlSGVhZCtwbGF5VXJsKyAnQCcgK194NTtcXG4gICAgICAgIHJldHVybiB4NVVybFxcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIHg1UGFyc2VQcm8oeDVsaXN0LHg1VGltZW91dCxpc1ZpZGVvKXtcXG4gICAgbGV0IGJwYXRoID0gJ2ZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL3J1bGVzL2R6SG91c2UvaHRtbC/mtbfpmJTll4XmjqLlmaguaHRtbCc7XFxuICAgIGxldCBiY29kZSA9IGZldGNoKGJwYXRoKTtcXG4gICAgaWYoIWJjb2RlfHwhL2Z5X2JyaWRnZV9hcHAvLnRlc3QoYmNvZGUpKXtcXG4gICAgICAgIGxvZygn5pys5Zyw5pyq5a6J6KOF5ZeF5o6i5Zmo77yM5byA5aeL5a6J6KOFJyk7XFxuICAgICAgICBjb25zdCB7YXBpfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpO1xcbiAgICAgICAgbGV0IGh0bWwgPSBmZXRjaChhcGkuaG9zdCsnL3J1bGVsaXN0Lmpzb24/aWQ9MjA1NScpO1xcbiAgICAgICAgaWYoL+a1t+mYlOinhueVjC8udGVzdChodG1sKSl7XFxuICAgICAgICAgICAgd3JpdGVGaWxlKGJwYXRoLGh0bWwpO1xcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgd3JpdGVGaWxlKGJwYXRoLGZldGNoKCdodHRwczovL2hqZGhueC5jb2RpbmcubmV0L3AvaGlrZXIvZC9kci9naXQvcmF3L21hc3Rlci9odG1sL2dldFZpZGVvLmh0bWwnKSlcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICB4NVRpbWVvdXQgPSBwYXJzZUludCh4NVRpbWVvdXQpfHw1MDAwO1xcbiAgICBsZXQgbWF4X2NvdW50PSh4NVRpbWVvdXQvMjUwKTsgLy/moLnmja7otoXml7boh6rliqjorqHnrpfkuoblj6/miafooYznmoTmrKHmlbBcXG4gICAgcHV0VmFyKCd4NUxpc3QnLEpTT04uc3RyaW5naWZ5KHg1bGlzdCkpO1xcbiAgICBsZXQgX3g1ID0gJC50b1N0cmluZygoaXNWaWRlbywgbWF4X2NvdW50LHg1VGltZW91dCkgPT4ge1xcbiAgICAgICAgLy/liJ3lp4vljJZmYmHlkoxyZXF1c3RcXG4gICAgICAgIGlmICh0eXBlb2YgKGZiYSkgPT0gJ3VuZGVmaW5lZCcgfHwgIWZiYSkge1xcbiAgICAgICAgICAgIHZhciBmYmEgPSBmeV9icmlkZ2VfYXBwO1xcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBpZiAodHlwZW9mIChyZXF1ZXN0KSA9PSAndW5kZWZpbmVkJyB8fCAhcmVxdWVzdCkge1xcbiAgICAgICAgICAgICAgICBldmFsKGZiYS5nZXRJbnRlcm5hbEpzKCkpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBmYmEubG9nKGUubWVzc2FnZSk7XFxuICAgICAgICB9XFxuICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBpZiAod2luZG93LmNvdW50ID09IG51bGwpIHtcXG4gICAgICAgICAgICAgICAgd2luZG93LmNvdW50ID0gMTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHRleHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXFwiYm9keVxcXCIpLmlubmVyVGV4dDtcXG4gICAgICAgICAgICBpZigv6Kem5Y+R5LqG6Ziy55uX6ZO+fOacquaOiOadg3zmjqXlj6PpmLLnm5cvLnRlc3QodGV4dCkmJndpbmRvdy5jb3VudD09MSl7XFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xcbiAgICAgICAgICAgICAgICBmYmEubG9nKFxcXCLmo4DmtYvliLDmnInmjojmnYPvvIzlvIDlp4vov4fmjojmnYNcXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgd2luZG93LmNvdW50Kys7XFxuICAgICAgICAgICAgLy8gZmJhLmxvZygnY291bnQ6JyArIHdpbmRvdy5jb3VudCArICcsbWF4X2NvdW50OicgKyBtYXhfY291bnQpO1xcbiAgICAgICAgICAgIGlmICh3aW5kb3cuY291bnQgPj0gbWF4X2NvdW50KSB7XFxuICAgICAgICAgICAgICAgIGZiYS5jbGVhclZhcigneDVMaXN0Jyk7XFxuICAgICAgICAgICAgICAgIGZiYS5oaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgICAgICBsZXQgZm1zZyA9ICfpgZPplb/ku5PlupPpgJrlhY3op6PmnpDlpLHotKUs5Y6f5ZugOui2heaXticreDVUaW1lb3V0Kyfmr6vnp5InO1xcbiAgICAgICAgICAgICAgICBmYmEubG9nKGZtc2cpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytmbXNnO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKTtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGZ1bmN0aW9uIG11dGVNZShlbGVtKSB7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgZWxlbS5wYXVzZSgpO1xcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuXFxuICAgICAgICB2YXIgdmlkZW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwidmlkZW9cXFwiKSwgYXVkaW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwiYXVkaW9cXFwiKSxcXG4gICAgICAgICAgICB2MiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcImVtYmVkXFxcIiksIHYzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwiI3BsYXllclxcXCIpO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodmlkZW9zLCBmdW5jdGlvbiAodmlkZW8pIHtcXG4gICAgICAgICAgICAgICAgbXV0ZU1lKHZpZGVvKTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIH1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKGF1ZGlvcywgZnVuY3Rpb24gKGF1ZGlvKSB7XFxuICAgICAgICAgICAgICAgIG11dGVNZShhdWRpbyk7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB9XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2MiwgZnVuY3Rpb24gKHYpIHtcXG4gICAgICAgICAgICAgICAgbXV0ZU1lKHYpO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodjMsIGZ1bmN0aW9uICh2KSB7XFxuICAgICAgICAgICAgICAgIG11dGVNZSh2KTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIH1cXG4gICAgICAgIHZhciB1cmxzID0gX2dldFVybHMoKTtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgZm9yIChsZXQgaSBpbiB1cmxzKSB7XFxuICAgICAgICAgICAgICAgIGxldCB1PXVybHNbaV07XFxuICAgICAgICAgICAgICAgIC8vdT1kZWNvZGVVUklDb21wb25lbnQodSk7XFxuICAgICAgICAgICAgICAgIHRyeXt1PWRlY29kZVVSSUNvbXBvbmVudCh1KTt9Y2F0Y2goZSl7XFxuICAgICAgICAgICAgICAgICAgICB1PXVuZXNjYXBlKHUpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmKC91cmw9aHR0cC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICB1ID0gdS5zcGxpdChcXFwidXJsPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoL3ZpZD1odHRwLy50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgIHUgPSB1LnNwbGl0KFxcXCJ2aWQ9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZigvXFxcXD8oLiopPWh0dHAvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgdSA9IFxcXCJodHRwXFxcIit1LnNwbGl0KC9cXFxcPyguKik9aHR0cC8pLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgIC8vZmJhLmxvZyhcXFwi5YW25LuW5YiG5YmyOlxcXCIrdSk7XFxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKC9cXFxcLzFcXFxcLm0zdTgkLy50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHU9dS5yZXBsYWNlKC8mZnJvbT0uKnwmbmV4dD0uKnwmanVtcD0uKi8sJycpO1xcbiAgICAgICAgICAgICAgICBsZXQgcmVhbFVybCA9IGlzVmlkZW8odSk7XFxuICAgICAgICAgICAgICAgIGlmIChyZWFsVXJsKSB7XFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXCLku5PlupN4NeWFjeWXhee7k+aenDpcXFwiICsgcmVhbFVybCk7XFxuICAgICAgICAgICAgICAgICAgICBmYmEuY2xlYXJWYXIoJ3g1TGlzdCcpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxVcmxcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBmYmEubG9nKGUubWVzc2FnZSlcXG4gICAgICAgIH1cXG4gICAgfSwgaXNWaWRlbywgbWF4X2NvdW50LHg1VGltZW91dCk7XFxuICAgIGNvbnN0IGxzZz0kLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9sb2NhbFN0b3JhZ2U/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgbGV0IHVzZVdlYj1sc2cuZ2V0SXRlbShcXFwi6YCa5YWNXFxcIixcXFwiWDVcXFwiKT09PVxcXCJXRUJcXFwiO1xcbiAgICAvL2xvZyhcXFwi5LuT5bqT5L2/55Sod2Vi6YCa5YWN5pu/5LujeDU6XFxcIit1c2VXZWIpO1xcbiAgICBsZXQgcnVsZUhlYWQ9dXNlV2ViJiZwYXJzZUludChnZXRBcHBWZXJzaW9uKCkpPj0yMzM5P1xcXCJ3ZWJSdWxlOi8vXFxcIjpcXFwieDVSdWxlOi8vXFxcIjtcXG4gICAgcmV0dXJuIHJ1bGVIZWFkK2JwYXRoKydAJyArIF94NTtcXG59XFxuXFxuZnVuY3Rpb24gTGF6eVBhcnNlRmFzdChwbGF5VXJsTGlzdCxnZXRUaW1lb3V0LHg1VGltZW91dCl7XFxuICAgIGNvbnN0IHtpc1ZpZGVvLGdldEhlYWRlcnMseDVQYXJzZVByb30gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9nbG9iYWxQYXJzZT9ydWxlPemBk+mVv+S7k+W6k1BybycpO1xcbiAgICAvLyBsb2coJ+W8gOWni+aJp+ihjCcrcGxheVVybExpc3QubGVuZ3RoKyfkuKrlnLDlnYDnmoTmibnph4/ll4XmjqI6JytwbGF5VXJsTGlzdCk7XFxuICAgIGxvZygn5byA5aeL5omn6KGMJytwbGF5VXJsTGlzdC5sZW5ndGgrJ+S4quWcsOWdgOeahOaJuemHj+WXheaOoicpO1xcbiAgICBsZXQgcGxheVVybHMgPSBwbGF5VXJsTGlzdC5tYXAoKGl0KT0+e1xcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICB1cmw6aXQuc3BsaXQoXFxcIjtcXFwiKVswXSxcXG4gICAgICAgICAgICBvcHRpb25zOiB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIC8vXFxcIlVzZXItQWdlbnRcXFwiOiBcXFwiRGFydC8yLjEzIChkYXJ0OmlvKVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiVXNlci1BZ2VudFxcXCI6XFxcIk1vemlsbGEvNS4wXFxcIlxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiBnZXRUaW1lb3V0XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgbGV0IGJodG1sID0gYmF0Y2hGZXRjaChwbGF5VXJscyk7XFxuICAgIGxldCB2aWRlb3MgPSBbXTtcXG4gICAgbGV0IHg1bGlzdCA9IFtdO1xcbiAgICBmb3IobGV0IGkgaW4gYmh0bWwpe1xcbiAgICAgICAgbGV0IG9yZGVyID0gcGFyc2VJbnQoaSkrMTtcXG4gICAgICAgIGxldCB0bmFtZT1vcmRlcisn5Y+36Kej5p6Q572R5Z2AOic7XFxuICAgICAgICAvL2xvZyh0bmFtZSk7XFxuICAgICAgICBsZXQgdHVybD1wbGF5VXJsTGlzdFtpXS5zcGxpdChcXFwiO1xcXCIpWzBdO1xcbiAgICAgICAgbGV0IGpuYW1lPXBsYXlVcmxMaXN0W2ldLnNwbGl0KFxcXCI7XFxcIikubGVuZ3RoPjE/cGxheVVybExpc3RbaV0uc3BsaXQoXFxcIjtcXFwiKVsxXTpcXFwiXFxcIjtcXG4gICAgICAgIHRuYW1lKz1qbmFtZTtcXG4gICAgICAgIGxldCBiYWNrY29kZSA9IGJodG1sW2ldO1xcbiAgICAgICAgaWYoKCEvdXJsfGh0dHAvLnRlc3QoYmFja2NvZGUpKSYmKCEvI0VYVElORi8udGVzdChiYWNrY29kZSkpKXtcXG4gICAgICAgICAgICBsb2codG5hbWUrdHVybCsn5pyJ6Zeu6aKYLOWPr+iDveWKoOWvhuaIluiAheaMguS6hicpO1xcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgfWVsc2UgaWYoLyNFWFRJTkYvLnRlc3QoYmFja2NvZGUpKXtcXG4gICAgICAgICAgICAvL2xldCBsY2FjaGU9XFxcIi9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvY2FjaGUvdmlkZW9fXFxcIit0bmFtZStcXFwiLm0zdThcXFwiO1xcbiAgICAgICAgICAgIC8vd3JpdGVGaWxlKGxjYWNoZSxiYWNrY29kZSk7XFxuICAgICAgICAgICAgLy92aWRlb3MucHVzaChsY2FjaGUpO1xcbiAgICAgICAgICAgIGxldCBwVXJsPWNhY2hlTTN1OCh0dXJsKTtcXG4gICAgICAgICAgICB2aWRlb3MucHVzaChwVXJsKTtcXG4gICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgIH1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IHVybCA9IEpTT04ucGFyc2UoYmFja2NvZGUpLnVybDtcXG4gICAgICAgICAgICBpZigvXmh0dHAvLnRlc3QodXJsKSl7XFxuICAgICAgICAgICAgICAgIGxldCByZWFsVmlkZW8gPSBpc1ZpZGVvKHVybCk7XFxuICAgICAgICAgICAgICAgIGlmKHR5cGVvZihyZWFsVmlkZW8pPT0nc3RyaW5nJyl7XFxuICAgICAgICAgICAgICAgICAgICBsb2codG5hbWUrJ+W3suino+aekOWHuuinhumikTonK3JlYWxWaWRlbyk7XFxuICAgICAgICAgICAgICAgICAgICBpZihqbmFtZSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFZpZGVvKz1cXFwi4piFXFxcIitqbmFtZVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgdmlkZW9zLnB1c2gocmVhbFZpZGVvKTtcXG4gICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICBsb2codG5hbWUrJ+ino+aekOWHuuS4jeefpemBk+S7gOS5iOS4nOilvzonK3VybCk7XFxuICAgICAgICAgICAgICAgICAgICB1cmwrPVxcXCIjaXNWaWRlbz10cnVlI1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICBpZihqbmFtZSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsKz1cXFwi4piFXFxcIitqbmFtZVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgdmlkZW9zLnB1c2godXJsKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICBsb2codG5hbWUrJ+S4umpzb27mjqXlj6PkuJTml6Dov5Tlm57op4bpopHlnLDlnYDmlbDmja46JytwbGF5VXJsTGlzdFtpXSsnXFxcXG4nK2JhY2tjb2RlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2codG5hbWUrJ+S4ung15o6l5Y+jLOWKoOWFpXg15ZeF5o6i5YiX6KGoJyk7XFxuICAgICAgICAgICAgeDVsaXN0LnB1c2gocGxheVVybExpc3RbaV0pO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIC8vIGxvZyh2aWRlb3MpO1xcbiAgICBpZih2aWRlb3MubGVuZ3RoPjApe1xcbiAgICAgICAgaWYoZ2V0VmFyKCdkcC5jYWNoZVZpZGVvJywndHJ1ZScpPT09J3RydWUnJiZwYXJzZUludChnZXRBcHBWZXJzaW9uKCkpPj0yMjU1KVxcbiAgICAgICAge1xcbiAgICAgICAgICAgIGxvZyhcXFwi5bCK5pWs55qE6a2U5pat55So5oi377yM6KeG6aKR57yT5a2Y5bey5ZCv55So77yM6K+35bC95oOF5Lqr5Y+X55yL5Ymn5pe25YWJXFxcIik7XFxuICAgICAgICAgICAgbGV0IHZpZGVvc0NhY2hlPXZpZGVvcy5tYXAoKGl0KT0+e1xcbiAgICAgICAgICAgICAgICBsZXQgaGVhZGVycz17fTtcXG4gICAgICAgICAgICAgICAgaWYoaXQuc3BsaXQoXFxcIjtcXFwiKS5sZW5ndGg+MSl7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgaGVhZCA9IGl0LnNwbGl0KCc7JylbMV07XFxuICAgICAgICAgICAgICAgICAgICBpZigvQC8udGVzdChoZWFkKSYmL3t8fS8udGVzdChoZWFkKSl7XFxuLy9oZWFkID0gaGVhZC5yZXBsYWNlKC97fH0vZywnJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCA9IGhlYWQuc3BsaXQoXFxcIntcXFwiKVsxXS5zcGxpdChcXFwifVxcXCIpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQgPSBoZWFkLnNwbGl0KCcmJicpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiBoZWFkKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IGhlYWRbaV0uc3BsaXQoJ0AnKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID1oZWFkW2ldLnNwbGl0KCdAJylbMV0ucmVwbGFjZSgvOy8sJ++8m++8mycpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzW2tleV0gPSB2YWx1ZTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICAgICAgICAgIHVybDppdC5zcGxpdChcXFwiO1xcXCIpWzBdLnNwbGl0KFxcXCLimIVcXFwiKVswXSxcXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6e1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6aGVhZGVyc1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgdmFyIGRhdGE9YmF0Y2hDYWNoZU0zdTgodmlkZW9zQ2FjaGUpO1xcbiAgICAgICAgICAgIGRhdGE9ZGF0YS5tYXAoKGl0LGlkKT0+e1xcbiAgICAgICAgICAgICAgICBsZXQgZXh0cmE9XFxcIlxcXCI7XFxuICAgICAgICAgICAgICAgIGlmKHZpZGVvc1tpZF0uc3BsaXQoXFxcIjtcXFwiKS5sZW5ndGg+MSl7XFxuICAgICAgICAgICAgICAgICAgICBleHRyYT1cXFwiO1xcXCIrdmlkZW9zW2lkXS5zcGxpdChcXFwiO1xcXCIpWzFdO1xcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZih2aWRlb3NbaWRdLnNwbGl0KFxcXCLimIVcXFwiKS5sZW5ndGg+MSl7XFxuICAgICAgICAgICAgICAgICAgICBleHRyYT1cXFwi4piFXFxcIit2aWRlb3NbaWRdLnNwbGl0KFxcXCLimIVcXFwiKVsxXTtcXG4gICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgICAgICBpZihpdCtcXFwiXFxcIiE9XFxcIm51bGxcXFwiKXtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCtleHRyYVxcbiAgICAgICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2aWRlb3NbaWRdXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAvL2xvZyhkYXRhKTtcXG4gICAgICAgICAgICByZXR1cm4gZGF0YVxcbiAgICAgICAgICAgIC8vcmV0dXJuIHZpZGVvc1xcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuIHZpZGVvc1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGxvZygn5YWx5pyJJyt4NWxpc3QubGVuZ3RoKyfkuKp4NeWcsOWdgOi/m+ihjOi9rua1geWXheaOoicpO1xcbiAgICAvL+ayoeacieeahOivneWwseW8gOWni+S+neasoXg15ZeF5o6iXFxuICAgIHNob3dMb2FkaW5nKCfll4XmjqLkuK3vvIzoi6XlpLHotKXlsLHliIfmjaJ3ZWLll4XmjqIuLi4nKTtcXG4gICAgcmV0dXJuIHg1UGFyc2VQcm8oeDVsaXN0LHg1VGltZW91dCxpc1ZpZGVvKTtcXG59XFxudmFyIGxhenk9JCgnJykubGF6eVJ1bGUoKCk9PntcXG4gICAgdHJ5e1xcbiAgICAgICAgcmVhbFVybD1pbnB1dDtcXG4gICAgICAgIGV2YWwoXFxcInZhciBjb25maWdfZHAgPVxcXCIgKyBmZXRjaChcXFwiaGlrZXI6Ly9maWxlcy9jYWNoZS9NeVBhcnNlU2V0Lmpzb25cXFwiKSk7XFxuICAgICAgICBldmFsKGZldGNoKGNvbmZpZ19kcC5jaikpO1xcbiAgICAgICAgbG9nKGlucHV0KyctPuato+WcqOaWreaPkumtlOaUueeJiOino+aekC4uLicpO1xcbiAgICAgICAgLy8g5Yqg5YWl6LaF5pe26K6+572u77yM5bu66K6u5Zyo6aaW6aG16K6+572uXFxuICAgICAgICByZXR1cm4gYXl0bVBhcnNlKHJlYWxVcmwpXFxuICAgIH1jYXRjaChlKXtcXG4gICAgICAgIHJldHVybiBpbnB1dFxcbiAgICB9XFxufSk7XFxuJC5leHBvcnRzLmlzUGljPWlzUGljO1xcbiQuZXhwb3J0cy5pc1ZpZGVvPWlzVmlkZW87XFxuJC5leHBvcnRzLmNvbVBhcnNlPWNvbVBhcnNlO1xcbiQuZXhwb3J0cy5nZXRIZWFkZXJzPWdldEhlYWRlcnM7XFxuJC5leHBvcnRzLmxhenlQYXJzZT1sYXp5UGFyc2U7XFxuJC5leHBvcnRzLng1UGFyc2VQcm89eDVQYXJzZVBybztcXG4kLmV4cG9ydHMuTGF6eVBhcnNlRmFzdD1MYXp5UGFyc2VGYXN0O1xcbiQuZXhwb3J0cy5sYXp5PWxhenk7XCJ9LHtcIm5hbWVcIjpcIuS7u+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++8gSd9KTtcXG4gICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgICAgICB9XFxuICAgIH0pXFxufSk7XFxuXFxuc2V0UmVzdWx0KGQpO1wifV0sXCJwYXJhbXNcIjpcIntcXFwiaWRcXFwiOjM3NDMsXFxcImlzQWxsXFxcIjp0cnVlLFxcXCJsdmVyXFxcIjoxMDEwN31cIixcInNhdmVkXCI6ZmFsc2UsXCJ0aXRsZVwiOlwi6YGT6ZW/5LuT5bqTUHJvXCIsXCJ2ZXJzaW9uXCI6MCxcInVybFwiOlwiaGlrZXI6Ly9wYWdlL3J1bGVEZXRhaWwjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXCIsXCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwiZmluZF9ydWxlXCI6XCJqczpcXG4gICAgY29uc3Qge1xcbiAgICAgICAgZ2V0QXBpLFxcbiAgICAgICAgY29sb3IsXFxuICAgICAgICBzbWFsbCxcXG4gICAgICAgIGh0bWxUYWcsXFxuICAgICAgICBhcGksXFxuICAgICAgICBtZFxcbiAgICB9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgaWQsXFxuICAgIGx2ZXIsXFxuICAgIGlzQWxsXFxufSA9IE1ZX1BBUkFNUztcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKGlzQWxsKSA9PiB7XFxuICAgIGlmKCFpc0FsbCl7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgIH1cXG59LGlzQWxsKSk7XFxubGV0IGRhdGFJdGVtID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwiZ2V0YnlpZFxcXCIpICsgXFxcIj9pZD1cXFwiICsgaWQpKS5yZXN1bHQ7XFxuc2V0UGFnZVRpdGxlKFxcXCLjgIxcXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCLjgI1cXFwiKVxcbmxldCBydWxlTGlzdEpzb24gPSBnZXRBcGkoXFxcInJ1bGVMaXN0SnNvblxcXCIpICsgXFxcIj9pZD1cXFwiO1xcbmxldCBkYXRhID0gW107XFxudmFyIGhhc1N1YiA9IGZhbHNlO1xcblxcbmlmIChkYXRhSXRlbS5pc19qc29uX2xpc3QpIHtcXG4gICAgaGFzU3ViID0gaGFzSG9tZVN1YihydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCk7XFxufSBlbHNlIGlmICghZGF0YUl0ZW0uaXNfanNvbl9saXN0ICYmIGRhdGFJdGVtLmRhdGFfdHlwZSA9PSAnaG9tZV9ydWxlX3VybCcpIHtcXG4gICAgaGFzU3ViID0gaGFzSG9tZVN1YihydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArICcmZGVidWc9dHJ1ZScpO1xcbn1cXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIueJiOacrFxcXCIpLFxcbiAgICBkZXNjOiBcXFwi4oCc4oCc4oCd4oCd5byA5Y+R6ICF77yaXFxcIiArIGNvbG9yKGRhdGFJdGVtLmF1dGhvciwgXFxcIiMyMjhCRTZcXFwiKSArIFxcXCJcXFxcbuS6keerr+eJiOacrO+8mlxcXCIgKyBjb2xvcihkYXRhSXRlbS52ZXIsIFxcXCIjNWNmZjJjXFxcIikgKyBcXFwiXFxcXHRcXFxcdOacrOWcsOeJiOacrO+8mlxcXCIgKyBjb2xvcihsdmVyLCBcXFwiIzVjZmYyY1xcXCIpICsgXFxcIlxcXFxu5pu05paw5LqOOiBbXFxcIiArIGNvbG9yKGRhdGFJdGVtLmxhc3RfdXBkYXRlLCBcXFwiI2ZmNzAwMFxcXCIpICsgXFxcIl1cXFwiLFxcbiAgICB1cmw6ICQoXFxcIjzlvIDlj5HogIU+XFxcXG5cXFwiICsgZGF0YUl0ZW0uYXV0aG9yICsgXFxcIlxcXFxuPOWQjeensD5cXFxcblxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcIlxcXFxuPOS6keerr+eJiOacrD5cXFxcblxcXCIgKyBkYXRhSXRlbS52ZXIgKyBcXFwiXFxcXG485pys5Zyw54mI5pysPlxcXFxuXFxcIiArIGx2ZXIgKyBcXFwiXFxcXG485pu05paw5pe26Ze0PlxcXFxuW1xcXCIgKyBkYXRhSXRlbS5sYXN0X3VwZGF0ZSArIFxcXCJdXFxcIikuY29uZmlybSgoKSA9PiB7fSksXFxuICAgIGNvbF90eXBlOiAndGV4dF8xJ1xcbn0pO1xcbmxldCBkYXRhVHlwZSA9IHtcXG4gICAgaG9tZV9ydWxlX3VybDogJ+mmlumhteS6keinhOWImScsXFxuICAgIHB1Ymxpc2g6ICfmj5DkuqTkupHku5PlupPop4TliJknLFxcbiAgICBqc191cmw6ICfnvZHpobXmj5Lku7bop4TliJknLFxcbiAgICBodG1sOiAn6Z2Z5oCB6aG16Z2iJyxcXG4gICAgY29uZmlnOiAn5Li76aG16YWN572uJ1xcbn07XFxuXFxubGV0IGJhc2ljID0ge1xcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxufTtcXG5sZXQgZGF0YVR5cGVUaXBzID0gZGF0YVR5cGVbZGF0YUl0ZW0uZGF0YV90eXBlXSB8fCAn5pyq55+l6KeE5YiZ77yaJyArIGRhdGFJdGVtLmRhdGFfdHlwZTtcXG5cXG5sZXQgc2FmZV90aXA9ZGF0YUl0ZW0uaXNfc2FmZT9cXFwi5a6J5YWoXFxcIjpcXFwi5Y2x6ZmpXFxcIjtcXG5sZXQgZ29vZF90aXAgPSBkYXRhSXRlbS5pc19nb29kP3NtYWxsKGNvbG9yKFxcXCLjgJDkvJjotKjop4TliJnjgJFcXFwiLCcjZmY3MDAwJykpOlxcXCJcXFwiO1xcbmxldCBub3Rfc2FmZV9ub3RlPWRhdGFJdGVtLm5vdF9zYWZlX25vdGU7XFxuYmFzaWMudGl0bGUgPSBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi57G75Z6LXFxcIikgKyBcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIHNtYWxsKFxcXCIoaWQ6XFxcIiArIGRhdGFJdGVtLmlkICsgXFxcIilcXFwiKStcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIHNtYWxsKFxcXCIo6aOO6Zmp5qOA5rWLOlxcXCIgK3NhZmVfdGlwK1xcXCIpXFxcIikrZ29vZF90aXA7XFxuYmFzaWMuZGVzYyA9IFxcXCLmlbDmja7nsbvlnovvvJpcXFwiICsgY29sb3IoZGF0YVR5cGVUaXBzLCBcXFwiI2NiNTRmZlxcXCIpICsgXFxcIlxcXFxu5YiG5Lqr54q25oCB5Li677yaXFxcIiArIGRhdGFJdGVtLnN0YXRlO1xcbmlmIChbXFxcImh0bWxcXFwiLCBcXFwiY29uZmlnXFxcIiwgXFxcImpzX3VybFxcXCJdLmluY2x1ZGVzKGRhdGFJdGVtLmRhdGFfdHlwZSkpIHtcXG4gICAgYmFzaWMuZGVzYyArPSBcXFwiXFxcXG7igJzigJzigJ3igJ0gPT5cXFwiICsgc21hbGwoXFxcIueCueatpOmihOiniFxcXCIpO1xcbiAgICBiYXNpYy51cmwgPSBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXG59XFxuXFxuZGF0YS5wdXNoKGJhc2ljKTtcXG5sZXQgaGFzU3VicyA9IFxcXCJcXFwiO1xcbmlmIChoYXNTdWIpIHtcXG4gICAgaGFzU3VicyA9IFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoXFxcIuW3suiuoumYhVxcXCIpXFxufVxcblxcbmxldCBub3RlcyA9IHJlcXVlc3QoZ2V0QXBpKFxcXCJnZXRfcnVsZV9ub3RlXFxcIikgKyBpZCk7XFxubm90ZXMgPSBKU09OLnBhcnNlKG5vdGVzKS5yZXN1bHQ7XFxucmVxdWlyZShtZCk7XFxubGV0IG5vdGVzSHRtbD1cXFwiXFxcIlxcbnRyeXtcXG4gICAgbm90ZXNIdG1sPW1hcmtlZC5wYXJzZShub3Rlcyk7XFxufWNhdGNoKGUpe31cXG5cXG5pZiAobm90ZXMgIT09IGZhbHNlKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuWkh+azqFxcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChodG1sVGFnKFxcXCJ1XFxcIiwgXFxcIuafpeeci+WujOaVtOWFrOWRiiA+XFxcIikpLFxcbiAgICAgICAgZGVzYzogbm90ZXMsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHRleHQ6IG5vdGVzSHRtbCxcXG4gICAgICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lLFxcbiAgICAgICAgICAgIC8vIHR5cGU6IFxcXCJsb25nX3RleHRcXFwiXFxuICAgICAgICAgICAgdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgICAgIH1cXG4gICAgfSk7XFxufVxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi5pON5L2cXFxcIikgKyBoYXNTdWJzLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcInRvYXN0Oi8v5L2g5omN5piv5pyA5biF55qE6YKj5Liq5Lq677yBXFxcIlxcbn0pO1xcbmxldCBpbXBvcnRVcmwsIHJ1bGVDb2RlLCBzaGFyZVVybCwgYmFja0NvZGUgPSBcXFwiXFxcIjtcXG5pZiAoIWRhdGFJdGVtLmlzX2pzb24pIHtcXG4gICAgYmFja0NvZGUgPSByZXF1ZXN0KHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkKTtcXG59XFxuc3dpdGNoIChkYXRhSXRlbS5kYXRhX3R5cGUpIHtcXG4gICAgY2FzZSBcXFwiaG9tZV9ydWxlX3VybFxcXCI6XFxuICAgICAgICBydWxlQ29kZSA9IFxcXCLmtbfpmJTop4bnlYzpppbpobXpopHpgZPop4TliJnjgJBcXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCLjgJHvv6Vob21lX3J1bGVfdXJs77+lXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkO1xcbiAgICAgICAgaW1wb3J0VXJsID0gXFxcInJ1bGU6Ly9cXFwiICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKVxcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgJ3B1Ymxpc2gnOlxcbiAgICAgICAgcnVsZUNvZGUgPSAn5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77yaJyArIGRhdGFJdGVtLm5hbWUgKyAn77+lcHVibGlzaO+/pScgKyBiYXNlNjRFbmNvZGUoYmFja0NvZGUpO1xcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlICdqc191cmwnOlxcbiAgICAgICAgcnVsZUNvZGUgPSAn5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77ya572R6aG15o+S5Lu277+lanNfdXJs77+lJyArIGRhdGFJdGVtLm5hbWUgKyAnQGJhc2U2NDovLycgKyBiYXNlNjRFbmNvZGUoYmFja0NvZGUpO1xcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlICdodG1sJzpcXG4gICAgICAgIGxldCBmaWxlX3RtcCA9IGRhdGFJdGVtLm5hbWUuc3BsaXQoJy4nKTtcXG4gICAgICAgIGxldCBmaWxlX3BhdGggPSBmaWxlX3RtcC5sZW5ndGggPiAxID8gZmlsZV90bXBbZmlsZV90bXAubGVuZ3RoIC0gMV0gKyBcXFwiL1xcXCIgKyBkYXRhSXRlbS5uYW1lIDogZGF0YUl0ZW0ubmFtZTtcXG4gICAgICAgIHJ1bGVDb2RlID0gXFxcIua1t+mYlOinhueVjOacrOWcsOaWh+S7tuWIhuS6q++/pWZpbGVfdXJs77+laGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL1xcXCIgKyBmaWxlX3BhdGggKyBcXFwiQFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICBicmVha1xcbiAgICBjYXNlIFxcXCJjb25maWdcXFwiOlxcbiAgICAgICAgaW1wb3J0VXJsID0gJCgpLnJ1bGUocGFzc3dvcmQgPT4ge1xcbiAgICAgICAgICAgIGV2YWwoZmV0Y2goXFxcImhpa2VyOi8vYXNzZXRzL2hvbWUuanNcXFwiKSk7XFxuICAgICAgICAgICAgSGlrZXJIb21lLmxvYWQoXFxcImltcG9ydFxcXCIsIHBhc3N3b3JkKTtcXG4gICAgICAgIH0sIGJhY2tDb2RlKTtcXG4gICAgICAgIGJyZWFrO1xcbn1cXG5sZXQgbXlfY29sX3R5cGUgPSBcXFwidGV4dF8yXFxcIjtcXG5pZiAoaW1wb3J0VXJsKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWvvOWFpeinhOWImVxcXCIsXFxuICAgICAgICB1cmw6IGRhdGFJdGVtLmlzX3NhZmU/aW1wb3J0VXJsOid0b2FzdDovL+mjjumZqeinhOWImeemgeatouWvvOWFpSEhIScsXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSk7XFxufVxcbmlmIChydWxlQ29kZSkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLliIbkuqvlj6Pku6RcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiY29weTovL1xcXCIgKyBydWxlQ29kZSxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9KTtcXG59XFxuXFxuaWYgKGltcG9ydFVybCkge1xcbiAgICBpZiAoZGF0YUl0ZW0uaXNfanNvbl9saXN0ICYmICFoYXNTdWIpIHtcXG4gICAgICAgIGxldCBzdWJfcnVsZV9jb2RlID0gJ+a1t+mYlOinhueVjOWQiOmbhuinhOWImeiuoumYhe+/pWhvbWVfc3Vi77+lJyArIGRhdGFJdGVtLm5hbWUgKyBcXFwiQEBcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxuICAgICAgICBsZXQgc3ViX3VybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShzdWJfcnVsZV9jb2RlKTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICforqLpmIXlkIjpm4YnLFxcbiAgICAgICAgICAgIHVybDogc3ViX3VybCxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXCJjb2xvcjogI2ZmNzAwMFxcXCI+5a+85YWl6L275ZCI6ZuGPC9zcGFuPicsXFxuICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRhdGFJdGVtLHN1YlVybCk9PntcXG4gICAgICAgICAgICAgICAgY29uc3Qge2dlblJ1bGV9PSQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2dlbkFwaVxcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgaW1wb3J0X3J1bGU9Z2VuUnVsZShkYXRhSXRlbS5uYW1lK1xcXCIuXFxcIitkYXRhSXRlbS5hdXRob3Isc3ViVXJsKTtcXG4gICAgICAgICAgICAgICAgLy9jb3B5KGltcG9ydF9ydWxlKTtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVDb2RlPXBhcnNlUGFzdGUoaW1wb3J0X3J1bGUuc3BsaXQoXFxcIlxcXFxuXFxcIilbMF0pO1xcbiAgICAgICAgICAgICAgICAvL3JldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgICAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGltcG9ydFVybFxcbiAgICAgICAgICAgIH0sZGF0YUl0ZW0scnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwiPHNtYWxsPuaPkOekuu+8muW8gOWPkeiAheWNleeLrOWIhuS6q+eahOWQiOmbhuaWh+S7tuWPquiDveWNleeLrOWvvOWFpeOAgjwvc21hbGw+XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9IGVsc2UgaWYgKCFkYXRhSXRlbS5pc19qc29uX2xpc3QgJiYgIWhhc1N1YiAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT0gJ2hvbWVfcnVsZV91cmwnKSB7XFxuICAgICAgICBsZXQgc3ViX3J1bGVfY29kZSA9ICfmtbfpmJTop4bnlYzljZXop4TliJnorqLpmIXvv6Vob21lX3N1Yu+/pScgKyBkYXRhSXRlbS5uYW1lICsgXFxcIkBAXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgJyZkZWJ1Zz10cnVlJztcXG4gICAgICAgIGxldCBzdWJfdXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHN1Yl9ydWxlX2NvZGUpO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+iuoumYheinhOWImScsXFxuICAgICAgICAgICAgdXJsOiBzdWJfdXJsLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICAgICAgfSlcXG4gICAgfVxcbn1cXG5pZiAoZGF0YUl0ZW0uaXNfanNvbiAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT09IFxcXCJob21lX3J1bGVfdXJsXFxcIiAmJiAhZGF0YUl0ZW0uaXNfanNvbl9saXN0KSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+i/m+WFpemikemBkycsXFxuICAgICAgICB1cmw6ICQoIC8qXFxcIiNub0xvYWRpbmcjXFxcIiovICkubGF6eVJ1bGUoKG5hbWUsaG9tZSkgPT4ge1xcbiAgICAgICAgICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChob21lKSk7XFxuICAgICAgICAgICAgbGV0IGhhc1J1bGUgPSBydWxlTGlzdC5zb21lKGl0ZW0gPT4gaXRlbS50aXRsZSA9PT0gbmFtZSk7XFxuICAgICAgICAgICAgaWYgKGhhc1J1bGUpIHtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIsIFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvbWUrXFxcInNAXFxcIiArIG5hbWU7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acquWuieijhVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgZGF0YUl0ZW0ubmFtZSxhcGkuaG9tZSksXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSlcXG59XFxubGV0IG1hbl9ydWxlX3NhZmUgPSBnZXRBcGkoXFxcIm1hblJ1bGVTYWZlXFxcIikrZGF0YUl0ZW0uaWQ7XFxubGV0IG1hbl9ydWxlX2dvb2QgPSBnZXRBcGkoXFxcIm1hblJ1bGVHb29kXFxcIikrZGF0YUl0ZW0uaWQ7XFxuLy8gZGF0YUl0ZW0uaXNfc2FmZTtcXG5pZihnZXRWYXIoJ2hvdXNlLmlzX21hbmFnZXInKSl7XFxuICAgIGZ1bmN0aW9uIHNldElzU2FmZShmbGFnLG1hbl9ydWxlX3NhZmUpIHtcXG4gICAgICAgIGZsYWcgPSBmbGFnIHx8ICcnO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgY29kZSA9IGZldGNoKG1hbl9ydWxlX3NhZmUsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXCJVc2VyLUFnZW50XFxcIjogTU9CSUxFX1VBfSxcXG4gICAgICAgICAgICAgICAgYm9keToge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwidXNlcm5hbWVcXFwiOiBnZXRWYXIoJ2hvdXNlLnVzZXJuYW1lJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IGdldFZhcignaG91c2UucGFzc3dvcmQnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcImlzX3NhZmVcXFwiOiAhIWZsYWdcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBjb2RlID0gSlNPTi5wYXJzZShjb2RlKS5yZXN1bHQ7XFxuICAgICAgICAgICAgaWYgKGNvZGUuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlLmRldGFpbFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBjb2RlLmRldGFpbFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgZS5tZXNzYWdlXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgZnVuY3Rpb24gc2V0SXNHb29kKGZsYWcsbWFuX3J1bGVfZ29vZCkge1xcbiAgICAgICAgZmxhZyA9IGZsYWcgfHwgJyc7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBjb2RlID0gZmV0Y2gobWFuX3J1bGVfZ29vZCwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcIlVzZXItQWdlbnRcXFwiOiBNT0JJTEVfVUF9LFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1c2VybmFtZVxcXCI6IGdldFZhcignaG91c2UudXNlcm5hbWUnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogZ2V0VmFyKCdob3VzZS5wYXNzd29yZCcpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiaXNfZ29vZFxcXCI6ICEhZmxhZ1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGNvZGUgPSBKU09OLnBhcnNlKGNvZGUpLnJlc3VsdDtcXG4gICAgICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBlLm1lc3NhZ2VcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6J/Cfmqvpo47pmaknLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uumjjumZqT/po47pmanop4TliJnml6Dms5Xooqvlr7zlhaUnKS5jb25maXJtKChpZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSk9PntcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNTYWZlKGZhbHNlLG1hbl9ydWxlX3NhZmUpO1xcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSlcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon4pyF5q2j5bi4JyxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDokKCfmoIforrDor6Xop4TliJnkuLrmraPluLg/JykuY29uZmlybSgoaWQsbWFuX3J1bGVfc2FmZSxzZXRJc1NhZmUpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldElzU2FmZSh0cnVlLG1hbl9ydWxlX3NhZmUpO1xcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSlcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon4pml6Z2e5LyY6LSoJyxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDokKCfmoIforrDor6Xop4TliJnkuLrpnZ7kvJjotKg/JykuY29uZmlybSgoaWQsbWFuX3J1bGVfZ29vZCxzZXRJc0dvb2QpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldElzR29vZChmYWxzZSxtYW5fcnVsZV9nb29kKTtcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXG4gICAgICAgIH0sZGF0YUl0ZW0uaWQsbWFuX3J1bGVfZ29vZCxzZXRJc0dvb2QpXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6J/CfkpbkvJjotKgnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uuS8mOi0qD8nKS5jb25maXJtKChpZCxtYW5fcnVsZV9nb29kLHNldElzR29vZCk9PntcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNHb29kKHRydWUsbWFuX3J1bGVfZ29vZCk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX2dvb2Qsc2V0SXNHb29kKVxcbiAgICB9KTtcXG59XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBkYXRhSXRlbS5nb29kX251bSxcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/otZ4uc3ZnXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvTWFrZUFjb21tZW50I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lXFxuICAgIH1cXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogZGF0YUl0ZW0uYmFkX251bSxcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/ouKkuc3ZnXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvTWFrZUFjb21tZW50I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lLFxcbiAgICAgICAgZGVmYXVsdFR5cGU6XFxcImJhZFxcXCJcXG4gICAgfVxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6K+E6K66XFxcIixcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/or4Torrouc3ZnXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvTWFrZUFjb21tZW50I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lXFxuICAgIH1cXG59KTtcXG5sZXQgdG90YWxTdW0gPSBkYXRhSXRlbS5nb29kX251bSArIGRhdGFJdGVtLmJhZF9udW07XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLor4TorrooXFxcIiArIHRvdGFsU3VtICsgXFxcIilcXFwiKSArIFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoaHRtbFRhZyhcXFwidVxcXCIsIFxcXCLmn6XnnIvlhajpg6jor4TorrogPlxcXCIpKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvQ29tbWVudFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5I2Z5cGFnZSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgaWQ6IGRhdGFJdGVtLmlkLFxcbiAgICAgICAgdG90YWxTdW06IHRvdGFsU3VtLFxcbiAgICAgICAgbm9fYWN0aXZlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuLy9jb25zdCBsb25nZXN0U3VtPTEyMDtcXG5sZXQgaWNvbiA9IHtcXG4gICAgXFxcImdvb2RcXFwiOiBcXFwi8J+RjVxcXCIsXFxuICAgIFxcXCJiYWRcXFwiOiBcXFwi8J+RjlxcXCIsXFxuICAgIFxcXCJyZXBseVxcXCI6XFxcIuW8gOWPkeiAhfCfl6NcXFwiXFxufVxcbmlmICh0b3RhbFN1bSA9PT0gMCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCI8aDUgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz7kuIDmnaHor4TorrrkuZ/msqHmnInvvIzlv6vmnaXmiqLmspnlj5HlkKfvvIE8L2g1PlxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSk7XFxufSBlbHNlIHtcXG4gICAgbGV0IGNvbW1lbnRMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5kaXNfZ2V0ICsgZGF0YUl0ZW0uaWQgKyBcXFwiP2xpbWl0PTVcXFwiKSkucmVzdWx0O1xcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNvbW1lbnRMaXN0KSB7XFxuICAgICAgICBsZXQgUmVwbHkgPSBpdGVtLmRpc2N1c3NfdHlwZT09PVxcXCJyZXBseVxcXCImJml0ZW0ucmVwbHlfdG9fbmFtZSE9PWZhbHNlJiZpdGVtLnJlcGx5X3RvX2lkIT09ZmFsc2U/XFxcIuKAmOKAmOWbnuWkjUBcXFwiK2l0ZW0ucmVwbHlfdG9fbmFtZStcXFwiICNcXFwiK2l0ZW0uZGlzY3Vzc19pZCtcXFwi4oCZ4oCZXFxcXG5cXFwiOlxcXCJcXFwiO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lICsgXFxcIiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSdncmF5Jz48c21hbGw+I1xcXCIgKyBpdGVtLmlkICsgXFxcIjwvc21hbGw+PGZvbnQ+XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCIsXFxuICAgICAgICAgICAgLy91cmw6IFxcXCJ0b2FzdDovL1xcXCIgKyBpdGVtLnFxLFxcbiAgICAgICAgICAgIHVybDpcXFwibXFxd3BhOi8vaW0vY2hhdD9jaGF0X3R5cGU9d3BhJnVpbj1cXFwiK2l0ZW0ucXEsXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0uZGlzY3Vzc190ZXh0LFxcbiAgICAgICAgICAgIGRlc2M6IFJlcGx5K2l0ZW0uY3JlYXRlX2RhdGUgKyBcXFwiwrdcXFwiICsgaWNvbltpdGVtLmRpc2N1c3NfdHlwZV0sXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcIixcXG4gICAgICAgICAgICBleHRyYTp7XFxuICAgICAgICAgICAgICAgIG5hbWU6aXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICB0eXBlOlxcXCJsb25nX3RleHRcXFwiLFxcbiAgICAgICAgICAgICAgICB0ZXh0Oml0ZW0uZGlzY3Vzc190ZXh0XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbn1cXG5cXG5zZXRSZXN1bHQoZGF0YSk7XCIsXCJncm91cFwiOlwi4pGg5o6o6I2QXCIsXCJ1YVwiOlwibW9iaWxlXCIsXCJwcmVSdWxlXCI6XCJcIixcInBhZ2VzXCI6XCJbe1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5bel5YW3XFxcIixcXFwicGF0aFxcXCI6XFxcInV0aWxpeVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmxldCBob3N0ID0gXFxcXFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3NcXFxcXFxcIjtcXFxcbi8vbGV0IGhvc3QgPSBcXFxcXFxcImh0dHA6Ly8xOTIuMTY4LjMuOTQ6ODA3OVxcXFxcXFwiO1xcXFxubGV0IGhvbWUgPSBiYXNlNjREZWNvZGUoXFxcXFxcXCJhR2xyWlhJNkx5OW9iMjFsXFxcXFxcXCIpO1xcXFxudmFyIGFwaSA9IHtcXFxcbiAgICBob3N0OiBob3N0K1xcXFxcXFwiL2hpa2VydWxlXFxcXFxcXCIsXFxcXG4gICAgdXNlcnNVcmw6IFxcXFxcXFwiL2Rldi91c2Vycz9vcmRlcj1cXFxcXFxcIiwgLy/nlKjmiLfliJfooahcXFxcbiAgICBydWxlQ291bnRVcmw6IFxcXFxcXFwiL2Rldi9ydWxlY291bnRcXFxcXFxcIiwgLy/ojrflj5bop4TliJnmlbDph49cXFxcbiAgICBydWxlc1VybDogXFxcXFxcXCIvZGV2L2dldFxcXFxcXFwiLCAvL+eUqOaIt+WvueW6lOeahOinhOWImeWIl+ihqOS7heS7heiOt+WPluWFrOW8gFxcXFxuICAgIHJ1bGVzQWxsVXJsOiBcXFxcXFxcIi9kZXYvZ2V0YWxsXFxcXFxcXCIsIC8v5byA5Y+R6ICF5a+55bqU55qE6KeE5YiZ5YiX6KGo5Y+v6I635Y+W56eB5pyJXFxcXG4gICAgZGV2U2VsZjonL2Rldi9nZXRzZWxmJywvL+iOt+WPluW8gOWPkeiAheS/oeaBr1xcXFxuICAgIG1hbkNhblVwbG9hZDonL3NldF9jYW5fdXBsb2FkLycsLy/otoXnrqHorr7nva7lvIDlj5HogIXmmK/lkKblj6/kuIrkvKBcXFxcbiAgICBtYW5SdWxlU2FmZTonL3NldF9ydWxlX3NhZmUvJywvL+i2heeuoeiuvue9ruinhOWImeWuieWFqOaAp1xcXFxuICAgIG1hblJ1bGVHb29kOicvc2V0X3J1bGVfZ29vZC8nLC8v6LaF566h6K6+572u6KeE5YiZ5LyY6LSo5oCnXFxcXG4gICAgaW1wb3J0VXJsOiBcXFxcXFxcIi9ydWxlbGlzdC5qc29uP2lkPVxcXFxcXFwiLCAvL+inhOWImeivpuaDheWPr+WvvOWFpVxcXFxuICAgIGluZm9TZXRVcmw6IFxcXFxcXFwiL2Rldi9zZXRfaW5mb1xcXFxcXFwiLFxcXFxuICAgIG5vd0NvblVybDogXFxcXFxcXCIvc3FsX2luZm8vZ2V0X25vd19jb25cXFxcXFxcIixcXFxcbiAgICBpbmZvR2V0VXJsOiBcXFxcXFxcIi9kZXYvZ2V0X2luZm8/bmFtZT1cXFxcXFxcIixcXFxcbiAgICBzZXR0aW5nc0dldFVybDogXFxcXFxcXCIvZGV2L2dldF9zZXR0aW5ncz9uYW1lPVxcXFxcXFwiLFxcXFxuICAgIGd1cGxvYWQ6IFxcXFxcXFwiL2Rldi9ndXBsb2FkXFxcXFxcXCIsXFxcXG4gICAgZ3RpbWVvdmVyOiBcXFxcXFxcIi9kZXYvZ3RpbWVvdmVyXFxcXFxcXCIsXFxcXG4gICAgZ2V0YnlpZDogXFxcXFxcXCIvZGV2L2dldGJ5aWRcXFxcXFxcIixcXFxcbiAgICBydWxlTGlzdEpzb246IFxcXFxcXFwiL3J1bGVsaXN0Lmpzb25cXFxcXFxcIixcXFxcbiAgICBhdXRoOiBcXFxcXFxcIi9kZXYvZ2V0X2F1dGhcXFxcXFxcIixcXFxcbiAgICB0aW1lb3ZlcjogXFxcXFxcXCIvZGV2L3RpbWVvdmVyXFxcXFxcXCIsXFxcXG4gICAgc2hhcmU6IFxcXFxcXFwiL2Rldi9zaGFyZVxcXFxcXFwiLFxcXFxuICAgIGdlbkF1dGg6IFxcXFxcXFwiL2Rldi9nZW5fYXV0aFxcXFxcXFwiLFxcXFxuICAgIGRlbGV0ZVVybDogXFxcXFxcXCIvZGV2L2RlbGV0ZVxcXFxcXFwiLFxcXFxuICAgIGpzb25MaXN0OiBcXFxcXFxcIi9kZXYvanNvbl9saXN0XFxcXFxcXCIsXFxcXG4gICAgc2VhcmNoOiBcXFxcXFxcIi9kZXYvc2VhcmNoXFxcXFxcXCIsXFxcXG4gICAgbmV3X2RldjogXFxcXFxcXCIvZGV2X3JlZ2lzdC9uZXdcXFxcXFxcIixcXFxcbiAgICBuZXdfZ2V0SWQ6IFxcXFxcXFwiL2Rldl9yZWdpc3QvZ2V0X2lkXFxcXFxcXCIsXFxcXG4gICAgbmV3X2NvbmZpcm06IFxcXFxcXFwiL2Rldl9yZWdpc3QvY29uZmlybVxcXFxcXFwiLFxcXFxuICAgIG1vZGlmeV9wd2Q6IFxcXFxcXFwiL21vZGlmeS9wYXNzd29yZFxcXFxcXFwiLFxcXFxuICAgIG1vZGlmeV9uYW1lOiBcXFxcXFxcIi9tb2RpZnkvbmFtZVxcXFxcXFwiLFxcXFxuICAgIG1vZGlmeV9hdmE6IFxcXFxcXFwiL21vZGlmeS9hdmF0YXJcXFxcXFxcIixcXFxcbiAgICB1c2VyOiBcXFxcXFxcIi9kZXYvdXNlci9cXFxcXFxcIixcXFxcbiAgICBnZXRfcnVsZV9ub3RlOiBcXFxcXFxcIi9tb2RpZnkvZ2V0X3J1bGVfbm90ZS9cXFxcXFxcIixcXFxcbiAgICBzZXRfcnVsZV9waWM6IFxcXFxcXFwiL21vZGlmeS9ydWxlX3BpYy9cXFxcXFxcIixcXFxcbiAgICBzZXRfcnVsZV9ub3RlOiBcXFxcXFxcIi9tb2RpZnkvcnVsZV9ub3RlL1xcXFxcXFwiXFxcXG59XFxcXG4kLmV4cG9ydHMucmFuZ2UgPSBmdW5jdGlvbihtLCBuKSB7XFxcXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtIC0gbiArIDEpICsgbik7XFxcXG59XFxcXG4kLmV4cG9ydHMubWFwQ29sVHlwZSA9IGZ1bmN0aW9uKHRhcmdldCwgdHlwZSwgbikge1xcXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XFxcXG4gICAgICAgIHRhcmdldC5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiB0eXBlXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbn1cXFxcbnZhciBnZXRBcGkgPSBmdW5jdGlvbihrKSB7XFxcXG4gICAgcmV0dXJuIGFwaS5ob3N0ICsgYXBpW2tdO1xcXFxufTtcXFxcbiQuZXhwb3J0cy5nZXRBcGk9Z2V0QXBpO1xcXFxuJC5leHBvcnRzLm1kPWdldEFwaSgnaW1wb3J0VXJsJykrXFxcXFxcXCIzMTg3XFxcXFxcXCI7XFxcXG4kLmV4cG9ydHMubG9jYWxSdWxlVmVyID0gZnVuY3Rpb24obG9jYWxSdWxlTGlzdCwgcnVsZSkge1xcXFxuICAgIGxldCBsb2NhbFJ1bGU7XFxcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbFJ1bGVMaXN0Lmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgIGxldCBpdGVtID0gbG9jYWxSdWxlTGlzdFtpXTtcXFxcbiAgICAgICAgbGV0IGF1ID0gaXRlbS5hdXRob3IgfHwgXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgbGV0IHNhbWVBdT1hdS5sZW5ndGggPiAwICYmIHJ1bGUuYXV0aG9yLmluY2x1ZGVzKGF1KTtcXFxcbiAgICAgICAgc2FtZUF1PXRydWU7Ly/kuI3liKTmlq3kvZzogIXpu5jorqTkuLp0cnVlXFxcXG4gICAgICAgIGlmIChpdGVtLnRpdGxlID09PSBydWxlLm5hbWUgJiYgc2FtZUF1KSB7XFxcXG4gICAgICAgICAgICBsb2NhbFJ1bGUgPSBpdGVtO1xcXFxuICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgaWYgKGxvY2FsUnVsZSA9PT0gdm9pZCAwKSB7XFxcXG4gICAgICAgIHJldHVybiAtMTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICByZXR1cm4gbG9jYWxSdWxlLnZlcnNpb247XFxcXG4gICAgfVxcXFxufVxcXFxuJC5leHBvcnRzLmNvbG9yID0gZnVuY3Rpb24odGV4dCwgY29sb3IpIHtcXFxcbiAgICB0ZXh0ICs9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgaWYgKHRleHQuaW5kZXhPZihcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiKSA9PT0gMCkge1xcXFxuICAgICAgICB0ZXh0LnJlcGxhY2UoXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBcXFxcXFxcIuKAnOKAnOKAneKAnTxmb250IGNvbG9yPSdcXFxcXFxcIiArIGNvbG9yICsgXFxcXFxcXCInPlxcXFxcXFwiICsgdGV4dCArIFxcXFxcXFwiPC9mb250PlxcXFxcXFwiO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBodG1sVGFnKHRhZywgdGV4dCkge1xcXFxuICAgIHRleHQgKz0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICBpZiAodGV4dC5pbmRleE9mKFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIpID09PSAwKSB7XFxcXG4gICAgICAgIHRleHQucmVwbGFjZShcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBcXFxcXFxcIjxcXFxcXFxcIiArIHRhZyArIFxcXFxcXFwiPlxcXFxcXFwiICsgdGV4dCArIFxcXFxcXFwiPC9cXFxcXFxcIiArIHRhZyArIFxcXFxcXFwiPlxcXFxcXFwiO1xcXFxuXFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdldE5vd0Zvcm1hdERhdGUoKSB7XFxcXG4gICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKCk7XFxcXG4gICAgICAgICAgICBsZXQgc2VwZXJhdG9yMSA9IFxcXFxcXFwiLVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgbGV0IHNlcGVyYXRvcjIgPSBcXFxcXFxcIjpcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGxldCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSArIDE7XFxcXG4gICAgICAgICAgICBsZXQgc3RyRGF0ZSA9IGRhdGUuZ2V0RGF0ZSgpO1xcXFxuICAgICAgICAgICAgbGV0IHN0ckhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xcXFxuICAgICAgICAgICAgbGV0IHN0ck1pbnV0ZXMgPSBkYXRlLmdldE1pbnV0ZXMoKTtcXFxcbiAgICAgICAgICAgIGxldCBzdHJTZWNvbmRzID0gZGF0ZS5nZXRTZWNvbmRzKCkrMTtcXFxcbiAgICAgICAgICAgIGlmIChtb250aCA+PSAxICYmIG1vbnRoIDw9IDkpIHtcXFxcbiAgICAgICAgICAgICAgICBtb250aCA9IFxcXFxcXFwiMFxcXFxcXFwiICsgbW9udGhcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGlmIChzdHJEYXRlID49IDAgJiYgc3RyRGF0ZSA8PSA5KSB7XFxcXG4gICAgICAgICAgICAgICAgc3RyRGF0ZSA9IFxcXFxcXFwiMFxcXFxcXFwiICsgc3RyRGF0ZVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaWYgKHN0ckhvdXJzID49IDAgJiYgc3RySG91cnMgPD0gOSkge1xcXFxuICAgICAgICAgICAgICAgIHN0ckhvdXJzID0gXFxcXFxcXCIwXFxcXFxcXCIgKyBzdHJIb3Vyc1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaWYgKHN0ck1pbnV0ZXMgPj0gMCAmJiBzdHJNaW51dGVzIDw9IDkpIHtcXFxcbiAgICAgICAgICAgICAgICBzdHJNaW51dGVzID0gXFxcXFxcXCIwXFxcXFxcXCIgKyBzdHJNaW51dGVzXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZiAoc3RyU2Vjb25kcyA+PSAwICYmIHN0clNlY29uZHMgPD0gOSkge1xcXFxuICAgICAgICAgICAgICAgIHN0clNlY29uZHMgPSBcXFxcXFxcIjBcXFxcXFxcIiArIHN0clNlY29uZHNcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIC8vbGV0IGN1cnJlbnRkYXRlID0gZGF0ZS5nZXRGdWxsWWVhcigpICsgc2VwZXJhdG9yMSArIG1vbnRoICsgc2VwZXJhdG9yMSArIHN0ckRhdGUgKyBcXFxcXFxcIiBcXFxcXFxcIiArIHN0ckhvdXJzICsgc2VwZXJhdG9yMiArIHN0ck1pbnV0ZXMgKyBzZXBlcmF0b3IyICsgc3RyU2Vjb25kcztcXFxcbiAgICAgICAgICAgIGxldCBjdXJyZW50ZGF0ZSA9IChkYXRlLmdldEZ1bGxZZWFyKCktMjAyMCkrJycrIG1vbnRoICsnJysgc3RyRGF0ZSArJycrIHN0ckhvdXJzKycnICsgc3RyTWludXRlcyArJycrIE1hdGguY2VpbChzdHJTZWNvbmRzLzcpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGN1cnJlbnRkYXRlKVxcXFxuICAgICAgICB9XFxcXG4kLmV4cG9ydHMuZ2V0Tm93Rm9ybWF0RGF0ZSA9IGdldE5vd0Zvcm1hdERhdGU7XFxcXG4kLmV4cG9ydHMuaHRtbFRhZyA9IGh0bWxUYWc7XFxcXG4kLmV4cG9ydHMuc21hbGwgPSBmdW5jdGlvbih0ZXh0KSB7XFxcXG4gICAgcmV0dXJuIGh0bWxUYWcoXFxcXFxcXCJzbWFsbFxcXFxcXFwiLCB0ZXh0KTtcXFxcbn1cXFxcbiQuZXhwb3J0cy5nZXRGaWxlID0gZnVuY3Rpb24oKSB7XFxcXG4gICAgdmFyIEZpbGUgPSByZXF1ZXN0KFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiO1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEZpbGUpO1xcXFxuICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFxcXFxcIiwgXFxcXFxcXCJ7fVxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmV0dXJuIHt9O1xcXFxuICAgIH1cXFxcbn1cXFxcbiQuZXhwb3J0cy5nZXRVc2VyRGF0ZSA9ZnVuY3Rpb24oKXtcXFxcbiAgICB2YXIgRmlsZSA9IHJlcXVlc3QoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVJBLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiO1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEZpbGUpO1xcXFxuICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSQS5qc29uXFxcXFxcXCIsIFxcXFxcXFwiW11cXFxcXFxcIik7XFxcXG4gICAgICAgIHJldHVybiBbXTtcXFxcbiAgICB9XFxcXG59XFxcXG4kLmV4cG9ydHMuZXhpc3RGaWxlID0gZnVuY3Rpb24oc3BhdGgsIGlwYXRoLCBoZWFkZXJzKSB7XFxcXG4gICAgbGV0IHNjb2RlID0gcmVxdWVzdChzcGF0aCk7XFxcXG4gICAgaWYgKCFzY29kZSkge1xcXFxuICAgICAgICB3cml0ZUZpbGUoc3BhdGgsIHJlcXVlc3QoaXBhdGgsIGhlYWRlcnMpKTtcXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbmxldCBuZXdBcGkgPSB7XFxcXG4gICAgXFxcXFxcXCJkaXNfbmV3XFxcXFxcXCI6IFxcXFxcXFwiL2hpa2VydWxlL25ld19ydWxlX2Rpc2N1c3MvXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJkaXNfdmVyaWZ5XFxcXFxcXCI6IFxcXFxcXFwiL2hpa2VydWxlL3J1bGVfZGlzY3Vzcy9nZXRfeXptXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJkaXNfZ2V0XFxcXFxcXCI6IFxcXFxcXFwiL2hpa2VydWxlL3J1bGVfZGlzY3Vzcy9cXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImRpc19zZXRcXFxcXFxcIjogXFxcXFxcXCIvaGlrZXJ1bGUvbW9kaWZ5L2Nhbl9kaXNjdXNzL1xcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiZGlzX25ld191c2VyXFxcXFxcXCI6IFxcXFxcXFwiL2hpa2VydWxlL3J1bGVfZGlzY3Vzcy9uZXdfdXNlclxcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiZGlzX2xvZ2luXFxcXFxcXCI6XFxcXFxcXCIvaGlrZXJ1bGUvcnVsZV9kaXNjdXNzL3VzZXJfbG9naW5cXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImRpc19kZXZfZGlzY3Vzc1xcXFxcXFwiOlxcXFxcXFwiL2hpa2VydWxlL21vZGlmeS9kZXZfY2FuX2Rpc2N1c3NcXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImRpc19kZXZfY29udHJvbFxcXFxcXFwiOlxcXFxcXFwiL2hpa2VydWxlL3J1bGVfZGlzY3Vzcy9yZW1vdmUvXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJhbGxfcnVsZVxcXFxcXFwiOlxcXFxcXFwiL2hpa2VydWxlL2dldF9ydWxlc1xcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiZGlzX2dldF9yZXBseVxcXFxcXFwiOlxcXFxcXFwiL2hpa2VydWxlL2dldF9yZXBseV9ydWxlX2Rpc2N1c3NcXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImRpc19yZXBseVxcXFxcXFwiOlxcXFxcXFwiL2hpa2VydWxlL2Rldl9uZXdfcnVsZV9kaXNjdXNzL1xcXFxcXFwiLFxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBzZXRBcGkob2JqZWN0KSB7XFxcXG4gICAgbGV0IHRhcmdldCA9IHt9O1xcXFxuICAgIGZvciAobGV0IGtleSBpbiBvYmplY3QpIHtcXFxcbiAgICAgICAgdGFyZ2V0W2tleV09aG9zdCtvYmplY3Rba2V5XVxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gdGFyZ2V0O1xcXFxufVxcXFxuXFxcXG4kLmV4cG9ydHMuYXBpID0gc2V0QXBpKG5ld0FwaSk7XFxcXG4kLmV4cG9ydHMuYXBpLmhvc3Q9aG9zdDtcXFxcbiQuZXhwb3J0cy5hcGkuaG9tZT1ob21lO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuW8gOWPkeiAheeZu+W9lVxcXCIsXFxcInBhdGhcXFwiOlxcXCJkZXZMb2dpblxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIuW8gOWPkeiAheeZu+W9lVxcXFxcXFwiKTtcXFxcbmNvbnN0IHtcXFxcbiAgICBnZXRBcGksXFxcXG4gICAgaHRtbFRhZyxcXFxcbiAgICBtYXBDb2xUeXBlLFxcXFxuICAgIHNtYWxsLFxcXFxuZ2V0RmlsZVxcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG52YXIgZGF0YSA9IFtdO1xcXFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpPT57XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2VVc2VybmFtZVxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZVBhc3N3b3JkXFxcXFxcXCIpO1xcXFxufSkpXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiAn6LSm5Y+3JyxcXFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlVXNlcm5hbWUnLCcnKSxcXFxcbiAgICAgICAgdHlwZTpcXFxcXFxcIm51bWJlclxcXFxcXFwiLFxcXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZVVzZXJuYW1lXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0sIHtcXFxcbiAgICB0aXRsZTogJ+WvhueggScsXFxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZVBhc3N3b3JkJywgJycpLFxcXFxuICAgICAgICB0eXBlOiBcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCIsXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlUGFzc3dvcmRcXFxcXFxcIixpbnB1dCknXFxcXG4gICAgfVxcXFxufSk7XFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6XFxcXFxcXCImbmJzcDsmbmJzcDs8YSBocmVmPSdoaWtlcjovL3BhZ2UvUmVnaXN0ZXInPuazqOWGjDwvYT5cXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG59KTtcXFxcbm1hcENvbFR5cGUoZGF0YSwgXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCIsIDEpO1xcXFxubGV0IHVzZXIgPSBnZXRGaWxlKCk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXFxcXFwiYlxcXFxcXFwiLCBcXFxcXFxcIueZu+W9lVxcXFxcXFwiKSxcXFxcbiAgICB1cmw6ICQoKS5sYXp5UnVsZSgodXJsLCBmKT0+IHtcXFxcbiAgICAgICAgbGV0IHVzZXJuYW1lID0gZ2V0VmFyKCdXYXJlaG91c2VVc2VybmFtZScsICcnKSxcXFxcbiAgICAgICAgICAgIHBhc3N3b3JkID0gZ2V0VmFyKCdXYXJlaG91c2VQYXNzd29yZCcsICcnKTtcXFxcbiAgICAgICAgaWYodXNlcm5hbWUgPT09IFxcXFxcXFwiXFxcXFxcXCIgJiYgcGFzc3dvcmQgPT09XFxcXFxcXCJcXFxcXFxcIil7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+i0puWPt+WSjOWvhueggeS4jeiDveS4uuepulxcXFxcXFwiXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IG15VXJsID0gdXJsICsgJz9xcT0nICsgdXNlcm5hbWUgKyAnJnBhc3N3b3JkPScgKyBwYXNzd29yZDtcXFxcbiAgICAgICAgbGV0IGNvZGVfc3RyID0gcmVxdWVzdChteVVybCk7XFxcXG4gICAgICAgIGxldCBjb2RlID0gSlNPTi5wYXJzZShjb2RlX3N0cik7XFxcXG4gICAgICAgIGlmIChjb2RlLnN0YXR1cyA9PSAwKSB7XFxcXG4gICAgICAgICAgICBmLnVzZXJuYW1lPXVzZXJuYW1lO1xcXFxuICAgICAgICAgICAgZi5wYXNzd29yZD1wYXNzd29yZFxcXFxuICAgICAgICAgICAgd3JpdGVGaWxlKCdoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvbicsIEpTT04uc3RyaW5naWZ5KGYpKTtcXFxcbiAgICAgICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v55m75b2V5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/otKblj7fmiJblr4bnoIHplJnor69cXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sIGdldEFwaShcXFxcXFxcInJ1bGVzQWxsVXJsXFxcXFxcXCIpLHVzZXIpLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXFxcbn0pO1xcXFxuc2V0UmVzdWx0KGRhdGEpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJpY29uXzJfcm91bmRcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5byA5Y+R6ICF566h55CGXFxcIixcXFwicGF0aFxcXCI6XFxcImRldk1hbmFnZVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIuinhOWImeeuoeeQhlxcXFxcXFwiKTtcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJ2NsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLmJhY2tcXFxcXFxcIixcXFxcXFxcIlxcXFxcXFwiKTsnKTtcXFxcbmlmIChnZXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuYmFja1xcXFxcXFwiKSA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICBiYWNrKCk7XFxcXG59XFxcXG5jb25zdCB7XFxcXG4gICAgZ2V0QXBpLFxcXFxuICAgIGNvbG9yLFxcXFxuICAgIHNtYWxsLFxcXFxuICAgIGdldEZpbGUsXFxcXG4gICAgZXhpc3RGaWxlLFxcXFxuICAgIG1hcENvbFR5cGUsXFxcXG4gICAgYXBpXFxcXG59ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbmxldCB7XFxcXG4gICAgZGV2XFxcXG59ID0gTVlfUEFSQU1TO1xcXFxubGV0IHtcXFxcbiAgICB1c2VybmFtZSxcXFxcbiAgICBwYXNzd29yZCxcXFxcbn0gPSBnZXRGaWxlKCk7XFxcXG4vL2V4aXN0RmlsZShcXFxcXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9odG1sL+W8gOWPkeiAheWIhuS6qy5odG1sXFxcXFxcXCIsIFxcXFxcXFwiaHR0cHM6Ly9lcnAuc2N3aW5iYW8uY29tL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTM5XFxcXFxcXCIpO1xcXFxubGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFxcXFxcInJ1bGVzQWxsVXJsXFxcXFxcXCIpICsgJz9xcT0nICsgdXNlcm5hbWUgKyAnJnBhc3N3b3JkPScgKyBwYXNzd29yZCkpLnJlc3VsdDtcXFxcbmxldCBNT0JJTEVfVUEgPSAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDUuMDsgU00tRzkwMFAgQnVpbGQvTFJYMjFUKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODguMC40MzI0LjE0NiBNb2JpbGUgU2FmYXJpLzUzNy4zNic7XFxcXG5sZXQgaW5mb1NldFVybCA9IGdldEFwaShcXFxcXFxcImluZm9TZXRVcmxcXFxcXFxcIik7XFxcXG5sZXQgaW5mb0dldFVybCA9IGdldEFwaShcXFxcXFxcImluZm9HZXRVcmxcXFxcXFxcIikgKyB1c2VybmFtZTtcXFxcbmxldCBzZXR0aW5nc0dldFVybCA9IGdldEFwaShcXFxcXFxcInNldHRpbmdzR2V0VXJsXFxcXFxcXCIpICsgdXNlcm5hbWU7XFxcXG5wdXRNeVZhcihcXFxcXFxcImRldl9zZXRfaW5mb1xcXFxcXFwiLCBbdXNlcm5hbWUsIHBhc3N3b3JkLCBpbmZvU2V0VXJsLCBNT0JJTEVfVUEsIGluZm9HZXRVcmxdLmpvaW4oXFxcXFxcXCIkJFxcXFxcXFwiKSk7XFxcXG5sZXQgZGF0YSA9IFtdO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxiaWc+5LuT5bqT6K6+572uPC9iaWc+Jm5ic3A7Jm5ic3A7Jm5ic3A7PHNtYWxsPjx1Pu+8iCDkuKrkurrotYTmlpkgPu+8iTwvdT48L3NtYWxsPicsXFxcXG4gICAgZGVzYzogJ+KAnOKAnOKAneKAneaCqOWFseaciSA8c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiAjZmY3MDAwXFxcXFxcXCI+JyArIHJ1bGVMaXN0Lmxlbmd0aCArICc8L3NwYW4+JyArIFxcXFxcXFwiIOadoeinhOWImeOAglxcXFxcXFxcbueCueWHu+inhOWImeWPr+i/m+ihjOWIhuS6q+OAgeWIoOmZpOOAgeWvvOWFpeaTjeS9nOWPiuafpeeci+ivpuaDhVxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvUGVyc29uYWxEYXRhI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgIGV4dHJhOntpZDpkZXYuaWR9LFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF8xJ1xcXFxufSk7XFxcXG5tYXBDb2xUeXBlKGRhdGEsIFxcXFxcXFwibGluZVxcXFxcXFwiLCAyKTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IHNtYWxsKGNvbG9yKFxcXFxcXFwi5pu05pS55YWs5ZGK4pyNXFxcXFxcXCIsIFxcXFxcXFwiIzM0YjFmZlxcXFxcXFwiKSksXFxcXG4gICAgLy8gdXJsOiBcXFxcXFxcIng1Oi8vZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvcnVsZXMvZHpIb3VzZS9odG1sL2Rldl9pbmZvX2VkaXQuaHRtbFxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvZGV2SW5mb0VkaXRcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMydcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogc21hbGwoY29sb3IoXFxcXFxcXCLmm7TlpJrliIbkuqvwn5OyXFxcXFxcXCIsIFxcXFxcXFwiIzM0YjFmZlxcXFxcXFwiKSksXFxcXG4gICAgLy91cmw6IFxcXFxcXFwieDU6Ly9maWxlOi8vL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9ydWxlcy9kekhvdXNlL2h0bWwv5byA5Y+R6ICF5YiG5LqrLmh0bWxcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL21vcmVTaGFyZVxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBzbWFsbChjb2xvcihcXFxcXFxcIuWNh+e6p+S+nei1lvCfk6VcXFxcXFxcIiwgXFxcXFxcXCIjMzRiMWZmXFxcXFxcXCIpKSxcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCLljYfnuqfkvJrph43mlrDku47ku5PlupPmi4nlj5bnm7jlhbPnmoTpnZnmgIHpobXpnaLliLDmnKzlnLBcXFxcXFxcXG7noa7orqTljYfnuqflkJc/XFxcXFxcXCIpLmNvbmZpcm0oKGhvc3QpID0+IHtcXFxcbiAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwv5byA5Y+R6ICF5YiG5LqrLmh0bWxcXFxcXFxcIiwgcmVxdWVzdChob3N0KycvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MzknKSk7XFxcXG4gICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9odG1sL2Rldl9pbmZvX2VkaXQuaHRtbFxcXFxcXFwiLCByZXF1ZXN0KGhvc3QrJy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTQwMicpKTtcXFxcbiAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwvZGV2X2luZm9fZ2V0Lmh0bWxcXFxcXFxcIiwgcmVxdWVzdChob3N0KycvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD00MDQnKSk7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7Lph43nva7lvIDlj5HogIXliIbkuqss566A5LuL5p+l55yLLOeugOS7i+e8lui+keetiemdmeaAgeaWh+S7tlxcXFxcXFwiO1xcXFxuICAgIH0sYXBpLmhvc3QpLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcXFxufSk7XFxcXG5sZXQgZGV2U2V0QmFjaztcXFxcbnRyeSB7XFxcXG4gICAgZGV2U2V0QmFjayA9IEpTT04ucGFyc2UocmVxdWVzdChzZXR0aW5nc0dldFVybCkpO1xcXFxufSBjYXRjaCAoZSkge1xcXFxuICAgIGRldlNldEJhY2sgPSB7fTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gc2V0U2V0dGluZ0l0ZW0oYmFzaWMpIHtcXFxcbiAgICBsZXQgdGVtcCA9IHtcXFxcbiAgICAgICAgdGl0bGU6IGJhc2ljLnRpdGxlLFxcXFxuICAgICAgICBjb2xfdHlwZTogYmFzaWMuY29sX3R5cGUsXFxcXG4gICAgICAgIHVybDogJChiYXNpYy5jb25maXJtKS5jb25maXJtKCh1cmwsIG1zZykgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IGJhY2sgPSByZXF1ZXN0KHVybCk7XFxcXG4gICAgICAgICAgICBsZXQgcmV0ID0gSlNPTi5wYXJzZShiYWNrKTtcXFxcbiAgICAgICAgICAgIGlmIChyZXQuc3RhdHVzID09IDApIHtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgbXNnWzBdO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIG1zZ1sxXSArIFxcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXCIgKyByZXQuZGV0YWlsO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9LCBiYXNpYy51cmwsIGJhc2ljLm1zZylcXFxcbiAgICB9O1xcXFxuICAgIHJldHVybiB0ZW1wO1xcXFxufVxcXFxuaWYgKGRldlNldEJhY2suc3RhdHVzID09IDApIHtcXFxcbiAgICBsZXQgZGV2U2V0dGluZ3MgPSBkZXZTZXRCYWNrLnJlc3VsdDtcXFxcbiAgICBsZXQgc2hhcmUgPSB7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfM1xcXFxcXFwiXFxcXG4gICAgfTtcXFxcbiAgICBpZiAoZGV2U2V0dGluZ3Muc2hhcmVfcHVibGljKSB7XFxcXG4gICAgICAgIHNoYXJlLnRpdGxlID0gc21hbGwoY29sb3IoXFxcXFxcXCLlhazlvIDkuIrkvKBcXFxcXFxcIiwgXFxcXFxcXCJncmVlblxcXFxcXFwiKSArIGNvbG9yKFxcXFxcXFwiKOengeiXjylcXFxcXFxcIiwgXFxcXFxcXCIjMDBiZmZmXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgc2hhcmUudXJsID0gZ2V0QXBpKFxcXFxcXFwiZ3VwbG9hZFxcXFxcXFwiKSArIFxcXFxcXFwiP3FxPVxcXFxcXFwiICsgdXNlcm5hbWUgKyBcXFxcXFxcIiZwYXNzd29yZD1cXFxcXFxcIiArIHBhc3N3b3JkICsgXFxcXFxcXCImZmxhZz0xXFxcXFxcXCI7XFxcXG4gICAgICAgIHNoYXJlLmNvbmZpcm0gPSBcXFxcXFxcIuaYr+WQpuehruiupOengeiXj+S7peWQjuaPkOS6pOeahOinhOWImT9cXFxcXFxcIjtcXFxcbiAgICAgICAgc2hhcmUubXNnID0gW1xcXFxcXFwi5bey56eB6JePXFxcXFxcXCIsIFxcXFxcXFwi56eB6JeP5aSx6LSlXFxcXFxcXCJdO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIHNoYXJlLnRpdGxlID0gc21hbGwoY29sb3IoXFxcXFxcXCLnp4Hlr4bkuIrkvKBcXFxcXFxcIiwgXFxcXFxcXCJyZWRcXFxcXFxcIikgKyBjb2xvcihcXFxcXFxcIijlhazlvIApXFxcXFxcXCIsIFxcXFxcXFwiI2FkZmYyZlxcXFxcXFwiKSk7XFxcXG4gICAgICAgIHNoYXJlLnVybCA9IGdldEFwaShcXFxcXFxcImd1cGxvYWRcXFxcXFxcIikgKyBcXFxcXFxcIj9xcT1cXFxcXFxcIiArIHVzZXJuYW1lICsgXFxcXFxcXCImcGFzc3dvcmQ9XFxcXFxcXCIgKyBwYXNzd29yZDtcXFxcbiAgICAgICAgc2hhcmUuY29uZmlybSA9IFxcXFxcXFwi5piv5ZCm56Gu6K6k5YWs5byA5Lul5ZCO5o+Q5Lqk55qE6KeE5YiZP1xcXFxcXFwiO1xcXFxuICAgICAgICBzaGFyZS5tc2cgPSBbXFxcXFxcXCLlt7LlhazlvIBcXFxcXFxcIiwgXFxcXFxcXCLlhazlvIDlpLHotKVcXFxcXFxcIl07XFxcXG4gICAgfVxcXFxuICAgIGRhdGEucHVzaChzZXRTZXR0aW5nSXRlbShzaGFyZSkpO1xcXFxuICAgIGxldCB0aW1lT3ZlciA9IHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8zXFxcXFxcXCJcXFxcbiAgICB9O1xcXFxuICAgIGlmIChkZXZTZXR0aW5ncy50aW1lX292ZXIpIHtcXFxcbiAgICAgICAgdGltZU92ZXIudGl0bGUgPSBzbWFsbChjb2xvcihcXFxcXFxcIuefreaXtuenmOmSpVxcXFxcXFwiLCBcXFxcXFxcImdyZWVuXFxcXFxcXCIpICsgY29sb3IoXFxcXFxcXCIo5rC45LmFKVxcXFxcXFwiLCBcXFxcXFxcIiMwMGJmZmZcXFxcXFxcIikpO1xcXFxuICAgICAgICB0aW1lT3Zlci51cmwgPSBnZXRBcGkoXFxcXFxcXCJndGltZW92ZXJcXFxcXFxcIikgKyBcXFxcXFxcIj9xcT1cXFxcXFxcIiArIHVzZXJuYW1lICsgXFxcXFxcXCImcGFzc3dvcmQ9XFxcXFxcXCIgKyBwYXNzd29yZCArIFxcXFxcXFwiJmZsYWc9MVxcXFxcXFwiO1xcXFxuICAgICAgICB0aW1lT3Zlci5jb25maXJtID0gXFxcXFxcXCLmmK/lkKbnoa7orqTku6XlkI7nmoTnp4Hol4/op4TliJnliIbkuqvkuI3ov4fmnJ8/XFxcXFxcXCI7XFxcXG4gICAgICAgIHRpbWVPdmVyLm1zZyA9IFtcXFxcXFxcIuW3suiuvuS4uuawuOS5hVxcXFxcXFwiLCBcXFxcXFxcIuiuvuS4uuawuOS5heWksei0pVxcXFxcXFwiXTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICB0aW1lT3Zlci50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXFxcXFwi5rC45LmF56eY6ZKlXFxcXFxcXCIsIFxcXFxcXFwicmVkXFxcXFxcXCIpICsgY29sb3IoXFxcXFxcXCIo6L+H5pyfKVxcXFxcXFwiLCBcXFxcXFxcIiNhZGZmMmZcXFxcXFxcIikpO1xcXFxuICAgICAgICB0aW1lT3Zlci51cmwgPSBnZXRBcGkoXFxcXFxcXCJndGltZW92ZXJcXFxcXFxcIikgKyBcXFxcXFxcIj9xcT1cXFxcXFxcIiArIHVzZXJuYW1lICsgXFxcXFxcXCImcGFzc3dvcmQ9XFxcXFxcXCIgKyBwYXNzd29yZDtcXFxcbiAgICAgICAgdGltZU92ZXIuY29uZmlybSA9IFxcXFxcXFwi56Gu6K6k6KaB5Lul5ZCO5YiG5Lqr55qE56eB6JeP6KeE5YiZ6Ieq5Yqo5Yiw5pyfP1xcXFxcXFwiO1xcXFxuICAgICAgICB0aW1lT3Zlci5tc2cgPSBbXFxcXFxcXCLlt7Lorr7kuLrov4fmnJ9cXFxcXFxcIiwgXFxcXFxcXCLorr7kuLrov4fmnJ/lpLHotKVcXFxcXFxcIl07XFxcXG4gICAgfVxcXFxuICAgIGRhdGEucHVzaChzZXRTZXR0aW5nSXRlbSh0aW1lT3ZlcikpO1xcXFxuICAgIGxldCBkaXNjdXNzID0ge1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIlxcXFxuICAgIH07XFxcXG4gICAgaWYgKGRldlNldHRpbmdzLmNhbl9kaXNjdXNzKSB7XFxcXG4gICAgICAgIGRpc2N1c3MudGl0bGUgPSBzbWFsbChjb2xvcihcXFxcXFxcIuWFgeiuuOivhOiuulxcXFxcXFwiLCBcXFxcXFxcInJlZFxcXFxcXFwiKSArIGNvbG9yKFxcXFxcXFwiKOS4jeiuuClcXFxcXFxcIiwgXFxcXFxcXCIjYWRmZjJmXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgZGlzY3Vzcy51cmwgPSBhcGkuZGlzX2Rldl9kaXNjdXNzICsgXFxcXFxcXCI/cXE9XFxcXFxcXCIgKyB1c2VybmFtZSArIFxcXFxcXFwiJnBhc3N3b3JkPVxcXFxcXFwiICsgcGFzc3dvcmQrIFxcXFxcXFwiJmZsYWc9MVxcXFxcXFwiO1xcXFxuICAgICAgICBkaXNjdXNzLmNvbmZpcm0gPSBcXFxcXFxcIuaYr+WQpuehruiupOS7peWQjuS4iuS8oOeahOinhOWImeWFgeiuuOivhOiuuj9cXFxcXFxcIjtcXFxcbiAgICAgICAgZGlzY3Vzcy5tc2cgPSBbXFxcXFxcXCLlt7Lorr7kuLrkuI3orrhcXFxcXFxcIiwgXFxcXFxcXCLorr7nva7lpLHotKVcXFxcXFxcIl07XFxcXG5cXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICBkaXNjdXNzLnRpdGxlID0gc21hbGwoY29sb3IoXFxcXFxcXCLkuI3orrjor4TorrpcXFxcXFxcIiwgXFxcXFxcXCJncmVlblxcXFxcXFwiKSArIGNvbG9yKFxcXFxcXFwiKOWFgeiuuClcXFxcXFxcIiwgXFxcXFxcXCIjMDBiZmZmXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgZGlzY3Vzcy51cmwgPSBhcGkuZGlzX2Rldl9kaXNjdXNzICsgXFxcXFxcXCI/cXE9XFxcXFxcXCIgKyB1c2VybmFtZSArIFxcXFxcXFwiJnBhc3N3b3JkPVxcXFxcXFwiICsgcGFzc3dvcmQ7XFxcXG4gICAgICAgIGRpc2N1c3MuY29uZmlybSA9IFxcXFxcXFwi5piv5ZCm56Gu6K6k5Lul5ZCO5LiK5Lyg55qE6KeE5YiZ5YWB6K646K+E6K66P1xcXFxcXFwiO1xcXFxuICAgICAgICBkaXNjdXNzLm1zZyA9IFtcXFxcXFxcIuW3suiuvuS4uuWFgeiuuFxcXFxcXFwiLCBcXFxcXFxcIuiuvue9ruWksei0pVxcXFxcXFwiXTtcXFxcbiAgICB9XFxcXG4gICAgZGF0YS5wdXNoKHNldFNldHRpbmdJdGVtKGRpc2N1c3MpKTtcXFxcbn1cXFxcbm1hcENvbFR5cGUoZGF0YSwgXFxcXFxcXCJsaW5lXFxcXFxcXCIsIDIpO1xcXFxuZm9yIChsZXQgaXRlbSBvZiBydWxlTGlzdCkge1xcXFxuICAgIGxldCBteV90X2V4Y29kZTEgPSAnJztcXFxcbiAgICBsZXQgbXlfdF9leGNvZGUyID0gJyc7XFxcXG4gICAgaWYgKGl0ZW0uc3RhdGUgIT0gJ3B1YmxpYycpIHtcXFxcbiAgICAgICAgbXlfdF9leGNvZGUxICs9ICfjipnvuI8nO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIG15X3RfZXhjb2RlMSArPSAnJztcXFxcbiAgICB9XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IG15X3RfZXhjb2RlMSArIGl0ZW0ubmFtZSArIG15X3RfZXhjb2RlMixcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9tYW5hZ2VSdWxlI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgaWQ6IGl0ZW0uaWQsXFxcXG4gICAgICAgICAgICAvL3VzZXJuYW1lOiB1c2VybmFtZSxcXFxcbiAgICAgICAgICAgIC8vcGFzc3dvcmQ6IHBhc3N3b3JkXFxcXG4gICAgICAgIH0sXFxcXG4gICAgICAgIHBpY191cmw6IGl0ZW0ucGljLFxcXFxuICAgIH0pXFxcXG59XFxcXG5pZiAocnVsZUxpc3QubGVuZ3RoID09PSAwKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwiPGg1IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+5b+r5p2l5LiK5Lyg5L2g55qE56ys5LiA5p2h6KeE5YiZ5ZCn77yBPC9oNT5cXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn1cXFxcbnNldFJlc3VsdChkYXRhKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLop4TliJnor6bnu4YtZGV2XFxcIixcXFwicGF0aFxcXCI6XFxcIm1hbmFnZVJ1bGVcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCB7XFxcXG4gICAgZ2V0QXBpLFxcXFxuICAgIGNvbG9yLFxcXFxuICAgIHNtYWxsLFxcXFxuICAgIGdldEZpbGUsXFxcXG4gICAgZXhpc3RGaWxlLFxcXFxuICAgIG1hcENvbFR5cGUsXFxcXG4gICAgaHRtbFRhZyxcXFxcbiAgICBhcGlcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxubGV0IHtcXFxcbiAgICBpZFxcXFxufSA9IE1ZX1BBUkFNUztcXFxcbmxldCB7XFxcXG4gICAgdXNlcm5hbWUsXFxcXG4gICAgcGFzc3dvcmQsXFxcXG59ID0gZ2V0RmlsZSgpO1xcXFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG59KSk7XFxcXG5sZXQgZGF0YUl0ZW0gPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXFxcXFwiZ2V0YnlpZFxcXFxcXFwiKSArIFxcXFxcXFwiP2lkPVxcXFxcXFwiICsgaWQpKS5yZXN1bHQ7XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLnvJbovpHjgIxcXFxcXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFxcXFxcIuOAjVxcXFxcXFwiKTtcXFxcbmxldCByZXFCeUdldCA9IFxcXFxcXFwiP2lkPVxcXFxcXFwiICsgZGF0YUl0ZW0uaWQgKyBcXFxcXFxcIiZxcT1cXFxcXFxcIiArIHVzZXJuYW1lICsgXFxcXFxcXCImcGFzc3dvcmQ9XFxcXFxcXCIgKyBwYXNzd29yZDtcXFxcbmxldCBydWxlTGlzdEpzb24gPSBnZXRBcGkoXFxcXFxcXCJydWxlTGlzdEpzb25cXFxcXFxcIikgKyBcXFxcXFxcIj9pZD1cXFxcXFxcIjtcXFxcbmxldCBkYXRhID0gW107XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXFxcXFwiYmlnXFxcXFxcXCIsIFxcXFxcXFwi54mI5pysXFxcXFxcXCIpLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi4oCc4oCc4oCd4oCd5LqR56uv54mI5pysOlxcXFxcXFwiICsgY29sb3IoZGF0YUl0ZW0udmVyLCBcXFxcXFxcIiM1Y2ZmMmNcXFxcXFxcIikgKyBcXFxcXFxcIlxcXFxcXFxcbuS4iuasoeaPkOS6pOS6jjogW1xcXFxcXFwiICsgY29sb3IoZGF0YUl0ZW0ubGFzdF91cGRhdGUsIFxcXFxcXFwiI2ZmNzAwMFxcXFxcXFwiKSArIFxcXFxcXFwiXVxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIjzlvIDlj5HogIU+XFxcXFxcXFxuXFxcXFxcXCIgKyBkYXRhSXRlbS5hdXRob3IgKyBcXFxcXFxcIlxcXFxcXFxcbjzlkI3np7A+XFxcXFxcXFxuXFxcXFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcXFxcXCJcXFxcXFxcXG485LqR56uv54mI5pysPlxcXFxcXFxcblxcXFxcXFwiICsgZGF0YUl0ZW0udmVyICsgXFxcXFxcXCJcXFxcXFxcXG485pu05paw5pe26Ze0PlxcXFxcXFxcbltcXFxcXFxcIiArIGRhdGFJdGVtLmxhc3RfdXBkYXRlICsgXFxcXFxcXCJdXFxcXFxcXCIpLmNvbmZpcm0oKCkgPT4ge30pLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF8xJ1xcXFxufSk7XFxcXG5sZXQgZGF0YVR5cGUgPSB7XFxcXG4gICAgaG9tZV9ydWxlX3VybDogJ+mmlumhteS6keinhOWImScsXFxcXG4gICAgcHVibGlzaDogJ+aPkOS6pOS6keS7k+W6k+inhOWImScsXFxcXG4gICAganNfdXJsOiAn572R6aG15o+S5Lu26KeE5YiZJyxcXFxcbiAgICBodG1sOiAn6Z2Z5oCB6aG16Z2iJyxcXFxcbiAgICBjb25maWc6ICfkuLvpobXphY3nva4nXFxcXG59O1xcXFxuXFxcXG5sZXQgYmFzaWMgPSB7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxufTtcXFxcbmxldCBkYXRhVHlwZVRpcHMgPSBkYXRhVHlwZVtkYXRhSXRlbS5kYXRhX3R5cGVdIHx8ICfmnKrnn6Xop4TliJk6JyArIGRhdGFJdGVtLmRhdGFfdHlwZTtcXFxcblxcXFxuYmFzaWMudGl0bGUgPSBodG1sVGFnKFxcXFxcXFwiYmlnXFxcXFxcXCIsIFxcXFxcXFwi57G75Z6LXFxcXFxcXCIpICsgXFxcXFxcXCJcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcIiArIHNtYWxsKFxcXFxcXFwiKGlkOlxcXFxcXFwiICsgZGF0YUl0ZW0uaWQgKyBcXFxcXFxcIilcXFxcXFxcIik7XFxcXG5iYXNpYy5kZXNjID0gXFxcXFxcXCLmlbDmja7nsbvlnovvvJpcXFxcXFxcIiArIGNvbG9yKGRhdGFUeXBlVGlwcywgXFxcXFxcXCIjY2I1NGZmXFxcXFxcXCIpICsgXFxcXFxcXCJcXFxcXFxcXG7liIbkuqvnirbmgIHkuLrvvJpcXFxcXFxcIiArIGRhdGFJdGVtLnN0YXRlO1xcXFxuaWYgKFtcXFxcXFxcImh0bWxcXFxcXFxcIiwgXFxcXFxcXCJjb25maWdcXFxcXFxcIiwgXFxcXFxcXCJqc191cmxcXFxcXFxcIl0uaW5jbHVkZXMoZGF0YUl0ZW0uZGF0YV90eXBlKSkge1xcXFxuICAgIGJhc2ljLmRlc2MgKz0gXFxcXFxcXCJcXFxcXFxcXG7igJzigJzigJ3igJ0gPT5cXFxcXFxcIiArIHNtYWxsKFxcXFxcXFwi54K55q2k6aKE6KeIXFxcXFxcXCIpO1xcXFxuICAgIGJhc2ljLnVybCA9IHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkO1xcXFxufVxcXFxubGV0IGF1dGggPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuaWYgKGRhdGFJdGVtLnN0YXRlID09IFxcXFxcXFwicHJpdmF0ZVxcXFxcXFwiKSB7XFxcXG4gICAgbGV0IGF1dGhfYmFjayA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcXFxcXCJhdXRoXFxcXFxcXCIpICsgcmVxQnlHZXQpKTtcXFxcbiAgICBiYXNpYy50aXRsZSA9IGJhc2ljLnRpdGxlICsgXFxcXFxcXCJcXFxcXFxcXG5cXFxcXFxcIiArIHNtYWxsKGNvbG9yKGF1dGhfYmFjay5yZXN1bHQsIFxcXFxcXFwiZ3JleVxcXFxcXFwiKSk7XFxcXG4gICAgYXV0aCA9ICcmYXV0aD0nICsgYXV0aF9iYWNrLnJlc3VsdDtcXFxcbiAgICBiYXNpYy51cmwgPSBiYXNpYy51cmwgPT09IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiID8gYmFzaWMudXJsIDogYmFzaWMudXJsICsgYXV0aDtcXFxcbn1cXFxcbmRhdGEucHVzaChiYXNpYyk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXFxcXFwiYmlnXFxcXFxcXCIsIFxcXFxcXFwi5pON5L2cXFxcXFxcXCIpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJ0b2FzdDovL+S9oOaJjeaYr+acgOW4heeahOmCo+S4quS6uu+8gVxcXFxcXFwiXFxcXG59KTtcXFxcbmxldCBpbXBvcnRVcmwsIHJ1bGVDb2RlLCBzaGFyZVVybCwgYmFja0NvZGUgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuaWYgKCFkYXRhSXRlbS5pc19qc29uKSB7XFxcXG4gICAgYmFja0NvZGUgPSByZXF1ZXN0KHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgYXV0aCk7XFxcXG59XFxcXG5zd2l0Y2ggKGRhdGFJdGVtLmRhdGFfdHlwZSkge1xcXFxuICAgIGNhc2UgXFxcXFxcXCJob21lX3J1bGVfdXJsXFxcXFxcXCI6XFxcXG4gICAgICAgIHJ1bGVDb2RlID0gXFxcXFxcXCLmtbfpmJTop4bnlYzpppbpobXpopHpgZPop4TliJnjgJBcXFxcXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFxcXFxcIuOAke+/pWhvbWVfcnVsZV91cmzvv6VcXFxcXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgYXV0aDtcXFxcbiAgICAgICAgaW1wb3J0VXJsID0gXFxcXFxcXCJydWxlOi8vXFxcXFxcXCIgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpXFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgJ3B1Ymxpc2gnOlxcXFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJonICsgZGF0YUl0ZW0ubmFtZSArICfvv6VwdWJsaXNo77+lJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgJ2pzX3VybCc6XFxcXG4gICAgICAgIHJ1bGVDb2RlID0gJ+a1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8mue9kemhteaPkuS7tu+/pWpzX3VybO+/pScgKyBkYXRhSXRlbS5uYW1lICsgJ0BiYXNlNjQ6Ly8nICsgYmFzZTY0RW5jb2RlKGJhY2tDb2RlKTtcXFxcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXFxcbiAgICAgICAgYnJlYWs7XFxcXG4gICAgY2FzZSAnaHRtbCc6XFxcXG4gICAgICAgIGxldCBmaWxlX3RtcCA9IGRhdGFJdGVtLm5hbWUuc3BsaXQoJy4nKTtcXFxcbiAgICAgICAgbGV0IGZpbGVfcGF0aCA9IGZpbGVfdG1wLmxlbmd0aCA+IDEgPyBmaWxlX3RtcFtmaWxlX3RtcC5sZW5ndGggLSAxXSArIFxcXFxcXFwiL1xcXFxcXFwiICsgZGF0YUl0ZW0ubmFtZSA6IGRhdGFJdGVtLm5hbWU7XFxcXG4gICAgICAgIHJ1bGVDb2RlID0gXFxcXFxcXCLmtbfpmJTop4bnlYzmnKzlnLDmlofku7bliIbkuqvvv6VmaWxlX3VybO+/pWhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9cXFxcXFxcIiArIGZpbGVfcGF0aCArIFxcXFxcXFwiQFxcXFxcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyBhdXRoO1xcXFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcXFxuICAgICAgICBicmVha1xcXFxuICAgIGNhc2UgXFxcXFxcXCJjb25maWdcXFxcXFxcIjpcXFxcbiAgICAgICAgaW1wb3J0VXJsID0gJCgpLnJ1bGUocGFzc3dvcmQgPT4ge1xcXFxuICAgICAgICAgICAgZXZhbChmZXRjaChcXFxcXFxcImhpa2VyOi8vYXNzZXRzL2hvbWUuanNcXFxcXFxcIikpO1xcXFxuICAgICAgICAgICAgSGlrZXJIb21lLmxvYWQoXFxcXFxcXCJpbXBvcnRcXFxcXFxcIiwgcGFzc3dvcmQpO1xcXFxuICAgICAgICB9LCBiYWNrQ29kZSk7XFxcXG4gICAgICAgIGJyZWFrO1xcXFxufVxcXFxubGV0IG15X2NvbF90eXBlID0gXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIjtcXFxcbmlmIChpbXBvcnRVcmwpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLlr7zlhaXop4TliJlcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiBpbXBvcnRVcmwsXFxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcXFxuICAgIH0pO1xcXFxufVxcXFxuaWYgKHJ1bGVDb2RlKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5YiG5Lqr6KeE5YiZXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJjb3B5Oi8vXFxcXFxcXCIgKyBydWxlQ29kZSxcXFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG4gICAgfSk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHNldFNldHRpbmdJdGVtKGJhc2ljLCBwYXR0ZXJuKSB7XFxcXG4gICAgbGV0IHRlbXAgPSB7XFxcXG4gICAgICAgIHRpdGxlOiBiYXNpYy50aXRsZSxcXFxcbiAgICAgICAgY29sX3R5cGU6IGJhc2ljLmNvbF90eXBlLFxcXFxuICAgICAgICB1cmw6ICQoYmFzaWMuY29uZmlybSkuY29uZmlybSgodXJsLCBtc2csIHBhdHRlcm4pID0+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/XFxcXFxcXCLigJjigJjlm57lpI1AXFxcXFxcXCIraXRlbS5yZXBseV90b19uYW1lK1xcXFxcXFwiICNcXFxcXFxcIitpdGVtLmRpc2N1c3NfaWQrXFxcXFxcXCLigJnigJlcXFxcXFxcXG5cXFxcXFxcIjpcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0ubmFtZSArIFxcXFxcXFwiJm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9J2dyYXknPjxzbWFsbD4jXFxcXFxcXCIgKyBpdGVtLmlkICsgXFxcXFxcXCI8L3NtYWxsPjxmb250PlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYXZhdGFyXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1JlcGx5XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYTp7XFxcXG4gICAgICAgICAgICAgICAgcnVsZUlkOiBkYXRhSXRlbS5pZCxcXFxcbiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxcXFxuICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcXFxcbiAgICAgICAgICAgICAgICByZXBseUlkOml0ZW0uaWRcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5kaXNjdXNzX3RleHQsXFxcXG4gICAgICAgICAgICBkZXNjOiBSZXBseStpdGVtLmNyZWF0ZV9kYXRlICsgXFxcXFxcXCLCt1xcXFxcXFwiICsgaWNvbltpdGVtLmRpc2N1c3NfdHlwZV0sXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgdHlwZTogXFxcXFxcXCJsb25nX3RleHRcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB0ZXh0OiBpdGVtLmRpc2N1c3NfdGV4dFxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG59XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcImljb25fMl9yb3VuZFxcXCIsXFxcIm5hbWVcXFwiOlxcXCLop4TliJnliJfooahcXFwiLFxcXCJwYXRoXFxcIjpcXFwicnVsZXNcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsJC50b1N0cmluZygoKT0+e1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLmJhY2tcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UuZmlsdGVyXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLnR5cGVcXFxcXFxcIik7XFxcXG4gICAgaWYoZ2V0VmFyKCdXYXJlaG91c2UuY2FuX3VwbG9hZCcsJycpKXtcXFxcbiAgICAgICAgbG9nKCfmk43kvZzov4fnpoHmraLkuIrkvKA6JytnZXRWYXIoJ1dhcmVob3VzZS5jYW5fdXBsb2FkJykpO1xcXFxuICAgICAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5jYW5fdXBsb2FkXFxcXFxcXCIpO1xcXFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXFxcbiAgICB9XFxcXG59KSk7XFxcXG5cXFxcbmlmIChnZXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuYmFja1xcXFxcXFwiKSA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICBiYWNrKGZhbHNlKTtcXFxcbn1cXFxcblxcXFxuY29uc3Qge1xcXFxuICAgIGdldEFwaSxcXFxcbiAgICBhcGksXFxcXG4gICAgY29sb3IsXFxcXG4gICAgc21hbGwsXFxcXG4gICAgbG9jYWxSdWxlVmVyLFxcXFxuICAgIGh0bWxUYWcsXFxcXG4gICAgbWRcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxuY29uc3QgeyBtZXJnZVNvcnQgfSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9zb3J0XFxcXFxcXCIpO1xcXFxubGV0IHtcXFxcbiAgICBhdmF0YXJVcmwsXFxcXG4gICAgcXEsXFxcXG4gICAgaWQsXFxcXG4gICAgY2FuX3VwbG9hZFxcXFxufSA9IE1ZX1BBUkFNUztcXFxcbmxldCBkYXRhVHlwZSA9IGdldFZhcihcXFxcXFxcIldhcmVob3VzZS50eXBlXFxcXFxcXCIsXFxcXFxcXCJcXFxcXFxcIik7XFxcXG5sZXQgYmFja0NvZGUgPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXFxcXFwicnVsZXNVcmxcXFxcXFxcIikgKyBcXFxcXFxcIj9uYW1lPVxcXFxcXFwiICsgcXErXFxcXFxcXCImZGF0YV90eXBlPVxcXFxcXFwiK2RhdGFUeXBlKSk7XFxcXG5sZXQgZGV2TmFtZSA9IGJhY2tDb2RlLmRldl9uYW1lO1xcXFxucHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmZpbHRlclxcXFxcXFwiLCBkZXZOYW1lKTtcXFxcbmxldCBydWxlTGlzdCA9IGJhY2tDb2RlLnJlc3VsdDtcXFxcbmxldCBzdWJVcmwgPSBnZXRBcGkoXFxcXFxcXCJqc29uTGlzdFxcXFxcXFwiKSArIFxcXFxcXFwiP25hbWU9XFxcXFxcXCIgKyBxcTtcXFxcbmxldCBoYXNTdWIgPSBoYXNIb21lU3ViKHN1YlVybCk7XFxcXG5sZXQgZGV2SW5mbyA9IFxcXFxcXFwi6L+Z5Liq5Lq65b6I5oeSLOS7gOS5iOmDveayoeWGmeWTpn5cXFxcXFxcIjtcXFxcbmxldCB0bXBKc29uID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFxcXFxcImluZm9HZXRVcmxcXFxcXFxcIikgKyBxcSkpO1xcXFxuaWYgKHRtcEpzb24uc3RhdHVzID09IDApIHtcXFxcbiAgICBkZXZJbmZvID0gdG1wSnNvbi5yZXN1bHQgfHwgZGV2SW5mbztcXFxcbn1cXFxcbmxldCBzdWJGbGFnID0gaGFzU3ViID8gJ/CfhpcnIDogJ/Cfk6EnO1xcXFxubGV0IGRhdGEgPSBbXTtcXFxcbnJlcXVpcmUobWQpO1xcXFxuZGV2SW5mbz1tYXJrZWQucGFyc2UoZGV2SW5mbyk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgZGV2TmFtZSArIFxcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXFxuXFxcXFxcXCIgKyBzbWFsbChodG1sVGFnKFxcXFxcXFwidVxcXFxcXFwiLCBcXFxcXFxcIueCueWHu+afpeeci+WujOaVtOWFrOWRilxcXFxcXFwiKSksXFxcXG4gICAgZGVzYzogc21hbGwoZGV2SW5mbyksXFxcXG4gICAgdXJsOiAnaGlrZXI6Ly9wYWdlL2luZm8nLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIHRleHQ6IGRldkluZm8sXFxcXG4gICAgICAgIG5hbWU6IGRldk5hbWUsXFxcXG4gICAgICAgIHR5cGU6XFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxuICAgIH0sXFxcXG4gICAgcGljX3VybDogYXZhdGFyVXJsLFxcXFxuICAgIGNvbF90eXBlOiAnbW92aWVfMV92ZXJ0aWNhbF9waWMnXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwiPGJpZz7orqLpmIXnrqHnkIY8L2JpZz4mbmJzcDsmbmJzcDs8c21hbGw+KOW9k+WJjVxcXFxcXFwiICsgKGhhc1N1YiA/IFxcXFxcXFwi5bey6K6i6ZiFXFxcXFxcXCIgOiBcXFxcXFxcIuacquiuoumYhVxcXFxcXFwiKSArIFxcXFxcXFwiKTwvc21hbGw+XFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5sZXQgc3ViX2NvZGUgPSAn5rW36ZiU6KeG55WM5ZCI6ZuG6KeE5YiZ6K6i6ZiF77+laG9tZV9zdWLvv6UnICsgZGV2TmFtZSArIFxcXFxcXFwi5ZCI6ZuGQEBcXFxcXFxcIiArIHN1YlVybDtcXFxcbmxldCBydWxlc0NvZGUgPSAn5rW36ZiU6KeG55WM5ZCI6ZuG6KeE5YiZ77+laG9tZV9ydWxlX3VybO+/pScgKyBzdWJVcmw7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjogI2ZmNzAwMFxcXFxcXFwiPuS4gOmUruiuoumYhTwvc3Bhbj4nLFxcXFxuICAgIGRlc2M6ICforqLpmIXigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiAjNWNmZjJjXFxcXFxcXCI+JyArIGRldk5hbWUgKyAnPC9zcGFuPueahOaJgOacieWNleinhOWIme+8jOWQiOmbhumcgOWNleeLrOiuoumYhScsXFxcXG4gICAgdXJsOiBzdWJfY29kZSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMydcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICNmZjcwMDBcXFxcXFxcIj7lr7zlhaXlhajpg6g8L3NwYW4+JyxcXFxcbiAgICB1cmw6IHJ1bGVzQ29kZSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMydcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICNmZjcwMDBcXFxcXFxcIj7lr7zlhaXovbvlkIjpm4Y8L3NwYW4+JyxcXFxcbiAgICB1cmw6ICQoKS5sYXp5UnVsZSgoZGV2TmFtZSxzdWJVcmwsYXZhdGFyVXJsKT0+e1xcXFxuICAgICAgICBjb25zdCB7Z2VuUnVsZX09JC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2dlbkFwaVxcXFxcXFwiKTtcXFxcbiAgICAgICAgbG9nKFxcXFxcXFwi6L275ZCI6ZuG5Zu+5qCH6ZO+5o6lOlxcXFxcXFwiK2F2YXRhclVybCk7XFxcXG4gICAgICAgIGxldCBpbXBvcnRfcnVsZT1nZW5SdWxlKFxcXFxcXFwi6L275ZCI6ZuGLlxcXFxcXFwiK2Rldk5hbWUsc3ViVXJsLGF2YXRhclVybCk7XFxcXG4gICAgICAgIC8vY29weShpbXBvcnRfcnVsZSk7XFxcXG4gICAgICAgIGxldCBydWxlQ29kZT1wYXJzZVBhc3RlKGltcG9ydF9ydWxlLnNwbGl0KFxcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXCIpWzBdKTtcXFxcbiAgICAgICAgLy9yZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXFxcbiAgICAgICAgcmV0dXJuIGltcG9ydFVybFxcXFxuICAgIH0sZGV2TmFtZSxzdWJVcmwsYXZhdGFyVXJsKSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMydcXFxcbn0pO1xcXFxubGV0IGNhbl91cGxvYWRfYXBpID0gZ2V0QXBpKFxcXFxcXFwibWFuQ2FuVXBsb2FkXFxcXFxcXCIpK2lkO1xcXFxuaWYoZ2V0VmFyKCdob3VzZS5pc19tYW5hZ2VyJykpe1xcXFxuICAgIGxldCB0aXBzID0gY2FuX3VwbG9hZD8n6IO9Jzon5ZCmJztcXFxcbiAgICAvLyBsb2coJ3RpcHM6Jyt0aXBzKTtcXFxcbiAgICAvLyBsb2coJ2Nhbl91cGxvYWQ6JytjYW5fdXBsb2FkKTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTon4pqg6IO95ZCm5LiK5LygOicrKGdldFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnKXx8dGlwcyksXFxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXFxcbiAgICAgICAgdXJsOidoaWtlcjovL2VtcHR5J1xcXFxuICAgIH0pO1xcXFxuICAgIGZ1bmN0aW9uIHNldFVwbG9hZChmbGFnLGNhbl91cGxvYWRfYXBpKSB7XFxcXG4gICAgICAgIGZsYWcgPSBmbGFnIHx8ICcnO1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IGNvZGUgPSBmZXRjaChjYW5fdXBsb2FkX2FwaSwge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjogTU9CSUxFX1VBfSxcXFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJ1c2VybmFtZVxcXFxcXFwiOiBnZXRWYXIoJ2hvdXNlLnVzZXJuYW1lJyksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiOiBnZXRWYXIoJ2hvdXNlLnBhc3N3b3JkJyksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJjYW5fdXBsb2FkXFxcXFxcXCI6ICEhZmxhZ1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgY29kZSA9IEpTT04ucGFyc2UoY29kZSkucmVzdWx0O1xcXFxuICAgICAgICAgICAgaWYgKGNvZGUuc3RhdHVzID09PSAwKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUuZGV0YWlsXFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBjb2RlLmRldGFpbFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgZS5tZXNzYWdlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6J/CfmqvnpoHmraLkuIrkvKAnLFxcXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxcXG4gICAgICAgIHVybDokKCfnpoHmraLor6XlvIDlj5HogIXkuIrkvKDop4TliJk/5L2g55qE5pON5L2c5bCG6KKr57O757uf6K6w5b2VJykuY29uZmlybSgoaWQsY2FuX3VwbG9hZF9hcGksc2V0VXBsb2FkKT0+e1xcXFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldFVwbG9hZChmYWxzZSxjYW5fdXBsb2FkX2FwaSk7XFxcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXFxcbiAgICAgICAgICAgICAgICBwdXRWYXIoJ1dhcmVob3VzZS5jYW5fdXBsb2FkJywn5ZCmJyk7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxcXG4gICAgICAgIH0saWQsY2FuX3VwbG9hZF9hcGksc2V0VXBsb2FkKVxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOifinIXlhYHorrjkuIrkvKAnLFxcXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxcXG4gICAgICAgIHVybDokKCflhYHorrjor6XlvIDlj5HogIXkuIrkvKDop4TliJk/5L2g55qE5pON5L2c5bCG6KKr57O757uf6K6w5b2VJykuY29uZmlybSgoaWQsY2FuX3VwbG9hZF9hcGksc2V0VXBsb2FkKT0+e1xcXFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldFVwbG9hZCh0cnVlLGNhbl91cGxvYWRfYXBpKTtcXFxcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcXFxuICAgICAgICAgICAgICAgIHB1dFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnLCfmmK8nKTtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXFxcbiAgICAgICAgfSxpZCxjYW5fdXBsb2FkX2FwaSxzZXRVcGxvYWQpXFxcXG4gICAgfSk7XFxcXG59XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIjxzbWFsbD7mj5DnpLrvvJrlvIDlj5HogIXljZXni6zliIbkuqvnmoTlkIjpm4bmlofku7blj6rog73ljZXni6zlr7zlhaXjgII8L3NtYWxsPlxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwiPGJpZz7op4TliJnliJfooag8L2JpZz4mbmJzcDsmbmJzcDs8c21hbGw+KOWFsVxcXFxcXFwiICsgcnVsZUxpc3QubGVuZ3RoICsgXFxcXFxcXCLmnaEpPC9zbWFsbD5cXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxufSk7XFxcXG5sZXQgZGF0YVR5cGVMaXN0ID0ge1xcXFxuICAgIFxcXFxcXFwiXFxcXFxcXCI6XFxcXFxcXCLlhajpg6hcXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImhvbWVfcnVsZV91cmxcXFxcXFxcIjogJ+Wwj+eoi+W6jycsXFxcXG4gICAgLy9cXFxcXFxcInB1Ymxpc2hcXFxcXFxcIjogJ+aPkOS6pOS6keS7k+W6k+inhOWImScsXFxcXG4gICAgXFxcXFxcXCJqc191cmxcXFxcXFxcIjogJ+e9kemhteaPkuS7ticsXFxcXG4gICAgXFxcXFxcXCJodG1sXFxcXFxcXCI6ICfpnZnmgIHpobXpnaInLFxcXFxuICAgIFxcXFxcXFwiY29uZmlnXFxcXFxcXCI6ICfkuLvpopgnXFxcXG59O1xcXFxuZm9yKGxldCBrZXkgaW4gZGF0YVR5cGVMaXN0KXtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTpkYXRhVHlwZT09PWtleT9cXFxcXFxcIuKAnOKAnFxcXFxcXFwiK2RhdGFUeXBlTGlzdFtrZXldK1xcXFxcXFwi4oCd4oCdXFxcXFxcXCI6ZGF0YVR5cGVMaXN0W2tleV0sXFxcXG4gICAgICAgIHVybDokKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGtleSk9PntcXFxcbiAgICAgICAgICAgIHB1dFZhcihcXFxcXFxcIldhcmVob3VzZS50eXBlXFxcXFxcXCIsa2V5KTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSxrZXkpLFxcXFxuICAgICAgICBjb2xfdHlwZTpcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufVxcXFxuaWYgKHJ1bGVMaXN0Lmxlbmd0aCA+IDIwKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5pCc57SiXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJC50b1N0cmluZyhuYW1lID0+IFxcXFxcXFwiaGlrZXI6Ly9zZWFyY2g/cz1cXFxcXFxcIiArIGlucHV0ICsgXFxcXFxcXCImcnVsZT1cXFxcXFxcIiArIG5hbWUsIE1ZX1JVTEUudGl0bGUpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICAgICAgICBkZXNjOiBcXFxcXFxcIuaQnOe0ouW9k+WJjeW8gOWPkeiAheeahOinhOWImVxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59XFxcXG5sZXQgaG9tZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmhvbWUpKTtcXFxcbmxldCBtUnVsZUxpc3QgPSBbXTtcXFxcbmZvciAodmFyIGl0ZW0gb2YgcnVsZUxpc3QpIHtcXFxcbiAgICB2YXIgbmFtZSA9IGl0ZW0ubmFtZTtcXFxcbiAgICBpZiAoaXRlbS5pc190YXApIHtcXFxcbiAgICAgICAgbGV0IGxvY2F0aW9uID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFxcXFxcInJ1bGVMaXN0SnNvblxcXFxcXFwiKSArIFxcXFxcXFwiP2lkPVxcXFxcXFwiICsgaXRlbS5pZCkpO1xcXFxuICAgICAgICBpdGVtLmlkID0gbG9jYXRpb24uaWQ7XFxcXG4gICAgICAgIGl0ZW0ubmFtZSA9IGxvY2F0aW9uLm5hbWU7XFxcXG4gICAgICAgIGl0ZW0uYXV0aG9yID0gbG9jYXRpb24uYXV0aG9yO1xcXFxuICAgICAgICBpdGVtLmRhdGFfdHlwZSA9IGxvY2F0aW9uLmRhdGFfdHlwZTtcXFxcbiAgICAgICAgaXRlbS52ZXIgPSBsb2NhdGlvbi52ZXJcXFxcbiAgICB9XFxcXG4gICAgaXRlbS52ZXJzaW9uID0gaXRlbS52ZXI7XFxcXG4gICAgbGV0IGxhYmVsID0gXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgbHZlciA9IC0yO1xcXFxuICAgIGlmIChpdGVtLmlzX2pzb24gJiYgaXRlbS5kYXRhX3R5cGUgPT09IFxcXFxcXFwiaG9tZV9ydWxlX3VybFxcXFxcXFwiKSB7XFxcXG4gICAgICAgIGx2ZXIgPSBsb2NhbFJ1bGVWZXIoaG9tZUxpc3QsIGl0ZW0pO1xcXFxuICAgICAgICBpZiAobHZlciA9PT0gLTEpIHtcXFxcbiAgICAgICAgICAgIGxhYmVsID0gXFxcXFxcXCLwn4aVXFxcXFxcXCI7XFxcXG4gICAgICAgIH0gZWxzZSBpZiAobHZlciA8IGl0ZW0udmVyKSB7XFxcXG4gICAgICAgICAgICBsYWJlbCA9IFxcXFxcXFwi8J+GmVxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIG1SdWxlTGlzdC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGxhYmVsICsgbmFtZSxcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9ydWxlRGV0YWlsI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgbHZlcjogbHZlcixcXFxcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkXFxcXG4gICAgICAgIH0sXFxcXG4gICAgICAgIHBpY191cmw6IGl0ZW0ucGljLFxcXFxuICAgIH0pO1xcXFxufVxcXFxuLyog5b2S5bm25o6S5bqPIFN0YXJ0ICovXFxcXG5tUnVsZUxpc3QgPSBtZXJnZVNvcnQobVJ1bGVMaXN0KTtcXFxcbi8qIOW9kuW5tuaOkuW6jyBFbmQgKi9cXFxcbmRhdGEucHVzaC5hcHBseShkYXRhLCBtUnVsZUxpc3QpXFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcXG5cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLop4TliJnor6bnu4YtdXNlclxcXCIsXFxcInBhdGhcXFwiOlxcXCJydWxlRGV0YWlsXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuICAgIGNvbnN0IHtcXFxcbiAgICAgICAgZ2V0QXBpLFxcXFxuICAgICAgICBjb2xvcixcXFxcbiAgICAgICAgc21hbGwsXFxcXG4gICAgICAgIGh0bWxUYWcsXFxcXG4gICAgICAgIGFwaSxcXFxcbiAgICAgICAgbWRcXFxcbiAgICB9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbmxldCB7XFxcXG4gICAgaWQsXFxcXG4gICAgbHZlcixcXFxcbiAgICBpc0FsbFxcXFxufSA9IE1ZX1BBUkFNUztcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoaXNBbGwpID0+IHtcXFxcbiAgICBpZighaXNBbGwpe1xcXFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgfVxcXFxufSxpc0FsbCkpO1xcXFxubGV0IGRhdGFJdGVtID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFxcXFxcImdldGJ5aWRcXFxcXFxcIikgKyBcXFxcXFxcIj9pZD1cXFxcXFxcIiArIGlkKSkucmVzdWx0O1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi44CMXFxcXFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcXFxcXCLjgI1cXFxcXFxcIilcXFxcbmxldCBydWxlTGlzdEpzb24gPSBnZXRBcGkoXFxcXFxcXCJydWxlTGlzdEpzb25cXFxcXFxcIikgKyBcXFxcXFxcIj9pZD1cXFxcXFxcIjtcXFxcbmxldCBkYXRhID0gW107XFxcXG52YXIgaGFzU3ViID0gZmFsc2U7XFxcXG5cXFxcbmlmIChkYXRhSXRlbS5pc19qc29uX2xpc3QpIHtcXFxcbiAgICBoYXNTdWIgPSBoYXNIb21lU3ViKHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkKTtcXFxcbn0gZWxzZSBpZiAoIWRhdGFJdGVtLmlzX2pzb25fbGlzdCAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT0gJ2hvbWVfcnVsZV91cmwnKSB7XFxcXG4gICAgaGFzU3ViID0gaGFzSG9tZVN1YihydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArICcmZGVidWc9dHJ1ZScpO1xcXFxufVxcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXFxcXFwiYmlnXFxcXFxcXCIsIFxcXFxcXFwi54mI5pysXFxcXFxcXCIpLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi4oCc4oCc4oCd4oCd5byA5Y+R6ICF77yaXFxcXFxcXCIgKyBjb2xvcihkYXRhSXRlbS5hdXRob3IsIFxcXFxcXFwiIzIyOEJFNlxcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFxu5LqR56uv54mI5pys77yaXFxcXFxcXCIgKyBjb2xvcihkYXRhSXRlbS52ZXIsIFxcXFxcXFwiIzVjZmYyY1xcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFx0XFxcXFxcXFx05pys5Zyw54mI5pys77yaXFxcXFxcXCIgKyBjb2xvcihsdmVyLCBcXFxcXFxcIiM1Y2ZmMmNcXFxcXFxcIikgKyBcXFxcXFxcIlxcXFxcXFxcbuabtOaWsOS6jjogW1xcXFxcXFwiICsgY29sb3IoZGF0YUl0ZW0ubGFzdF91cGRhdGUsIFxcXFxcXFwiI2ZmNzAwMFxcXFxcXFwiKSArIFxcXFxcXFwiXVxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIjzlvIDlj5HogIU+XFxcXFxcXFxuXFxcXFxcXCIgKyBkYXRhSXRlbS5hdXRob3IgKyBcXFxcXFxcIlxcXFxcXFxcbjzlkI3np7A+XFxcXFxcXFxuXFxcXFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcXFxcXCJcXFxcXFxcXG485LqR56uv54mI5pysPlxcXFxcXFxcblxcXFxcXFwiICsgZGF0YUl0ZW0udmVyICsgXFxcXFxcXCJcXFxcXFxcXG485pys5Zyw54mI5pysPlxcXFxcXFxcblxcXFxcXFwiICsgbHZlciArIFxcXFxcXFwiXFxcXFxcXFxuPOabtOaWsOaXtumXtD5cXFxcXFxcXG5bXFxcXFxcXCIgKyBkYXRhSXRlbS5sYXN0X3VwZGF0ZSArIFxcXFxcXFwiXVxcXFxcXFwiKS5jb25maXJtKCgpID0+IHt9KSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMSdcXFxcbn0pO1xcXFxubGV0IGRhdGFUeXBlID0ge1xcXFxuICAgIGhvbWVfcnVsZV91cmw6ICfpppbpobXkupHop4TliJknLFxcXFxuICAgIHB1Ymxpc2g6ICfmj5DkuqTkupHku5PlupPop4TliJknLFxcXFxuICAgIGpzX3VybDogJ+e9kemhteaPkuS7tuinhOWImScsXFxcXG4gICAgaHRtbDogJ+mdmeaAgemhtemdoicsXFxcXG4gICAgY29uZmlnOiAn5Li76aG16YWN572uJ1xcXFxufTtcXFxcblxcXFxubGV0IGJhc2ljID0ge1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbn07XFxcXG5sZXQgZGF0YVR5cGVUaXBzID0gZGF0YVR5cGVbZGF0YUl0ZW0uZGF0YV90eXBlXSB8fCAn5pyq55+l6KeE5YiZ77yaJyArIGRhdGFJdGVtLmRhdGFfdHlwZTtcXFxcblxcXFxubGV0IHNhZmVfdGlwPWRhdGFJdGVtLmlzX3NhZmU/XFxcXFxcXCLlronlhahcXFxcXFxcIjpcXFxcXFxcIuWNsemZqVxcXFxcXFwiO1xcXFxubGV0IGdvb2RfdGlwID0gZGF0YUl0ZW0uaXNfZ29vZD9zbWFsbChjb2xvcihcXFxcXFxcIuOAkOS8mOi0qOinhOWImeOAkVxcXFxcXFwiLCcjZmY3MDAwJykpOlxcXFxcXFwiXFxcXFxcXCI7XFxcXG5sZXQgbm90X3NhZmVfbm90ZT1kYXRhSXRlbS5ub3Rfc2FmZV9ub3RlO1xcXFxuYmFzaWMudGl0bGUgPSBodG1sVGFnKFxcXFxcXFwiYmlnXFxcXFxcXCIsIFxcXFxcXFwi57G75Z6LXFxcXFxcXCIpICsgXFxcXFxcXCJcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcIiArIHNtYWxsKFxcXFxcXFwiKGlkOlxcXFxcXFwiICsgZGF0YUl0ZW0uaWQgKyBcXFxcXFxcIilcXFxcXFxcIikrXFxcXFxcXCJcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcIiArIHNtYWxsKFxcXFxcXFwiKOmjjumZqeajgOa1izpcXFxcXFxcIiArc2FmZV90aXArXFxcXFxcXCIpXFxcXFxcXCIpK2dvb2RfdGlwO1xcXFxuYmFzaWMuZGVzYyA9IFxcXFxcXFwi5pWw5o2u57G75Z6L77yaXFxcXFxcXCIgKyBjb2xvcihkYXRhVHlwZVRpcHMsIFxcXFxcXFwiI2NiNTRmZlxcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFxu5YiG5Lqr54q25oCB5Li677yaXFxcXFxcXCIgKyBkYXRhSXRlbS5zdGF0ZTtcXFxcbmlmIChbXFxcXFxcXCJodG1sXFxcXFxcXCIsIFxcXFxcXFwiY29uZmlnXFxcXFxcXCIsIFxcXFxcXFwianNfdXJsXFxcXFxcXCJdLmluY2x1ZGVzKGRhdGFJdGVtLmRhdGFfdHlwZSkpIHtcXFxcbiAgICBiYXNpYy5kZXNjICs9IFxcXFxcXFwiXFxcXFxcXFxu4oCc4oCc4oCd4oCdID0+XFxcXFxcXCIgKyBzbWFsbChcXFxcXFxcIueCueatpOmihOiniFxcXFxcXFwiKTtcXFxcbiAgICBiYXNpYy51cmwgPSBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXFxcbn1cXFxcblxcXFxuZGF0YS5wdXNoKGJhc2ljKTtcXFxcbmxldCBoYXNTdWJzID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbmlmIChoYXNTdWIpIHtcXFxcbiAgICBoYXNTdWJzID0gXFxcXFxcXCJcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcIiArIHNtYWxsKFxcXFxcXFwi5bey6K6i6ZiFXFxcXFxcXCIpXFxcXG59XFxcXG5cXFxcbmxldCBub3RlcyA9IHJlcXVlc3QoZ2V0QXBpKFxcXFxcXFwiZ2V0X3J1bGVfbm90ZVxcXFxcXFwiKSArIGlkKTtcXFxcbm5vdGVzID0gSlNPTi5wYXJzZShub3RlcykucmVzdWx0O1xcXFxucmVxdWlyZShtZCk7XFxcXG5sZXQgbm90ZXNIdG1sPVxcXFxcXFwiXFxcXFxcXCJcXFxcbnRyeXtcXFxcbiAgICBub3Rlc0h0bWw9bWFya2VkLnBhcnNlKG5vdGVzKTtcXFxcbn1jYXRjaChlKXt9XFxcXG5cXFxcbmlmIChub3RlcyAhPT0gZmFsc2UpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogaHRtbFRhZyhcXFxcXFxcImJpZ1xcXFxcXFwiLCBcXFxcXFxcIuWkh+azqFxcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXCIgKyBzbWFsbChodG1sVGFnKFxcXFxcXFwidVxcXFxcXFwiLCBcXFxcXFxcIuafpeeci+WujOaVtOWFrOWRiiA+XFxcXFxcXCIpKSxcXFxcbiAgICAgICAgZGVzYzogbm90ZXMsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIHRleHQ6IG5vdGVzSHRtbCxcXFxcbiAgICAgICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWUsXFxcXG4gICAgICAgICAgICAvLyB0eXBlOiBcXFxcXFxcImxvbmdfdGV4dFxcXFxcXFwiXFxcXG4gICAgICAgICAgICB0eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbn1cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcXFxcXCJiaWdcXFxcXFxcIiwgXFxcXFxcXCLmk43kvZxcXFxcXFxcIikgKyBoYXNTdWJzLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJ0b2FzdDovL+S9oOaJjeaYr+acgOW4heeahOmCo+S4quS6uu+8gVxcXFxcXFwiXFxcXG59KTtcXFxcbmxldCBpbXBvcnRVcmwsIHJ1bGVDb2RlLCBzaGFyZVVybCwgYmFja0NvZGUgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuaWYgKCFkYXRhSXRlbS5pc19qc29uKSB7XFxcXG4gICAgYmFja0NvZGUgPSByZXF1ZXN0KHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkKTtcXFxcbn1cXFxcbnN3aXRjaCAoZGF0YUl0ZW0uZGF0YV90eXBlKSB7XFxcXG4gICAgY2FzZSBcXFxcXFxcImhvbWVfcnVsZV91cmxcXFxcXFxcIjpcXFxcbiAgICAgICAgcnVsZUNvZGUgPSBcXFxcXFxcIua1t+mYlOinhueVjOmmlumhtemikemBk+inhOWImeOAkFxcXFxcXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXFxcXFwi44CR77+laG9tZV9ydWxlX3VybO+/pVxcXFxcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxcXG4gICAgICAgIGltcG9ydFVybCA9IFxcXFxcXFwicnVsZTovL1xcXFxcXFwiICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKVxcXFxuICAgICAgICBicmVhaztcXFxcbiAgICBjYXNlICdwdWJsaXNoJzpcXFxcbiAgICAgICAgcnVsZUNvZGUgPSAn5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77yaJyArIGRhdGFJdGVtLm5hbWUgKyAn77+lcHVibGlzaO+/pScgKyBiYXNlNjRFbmNvZGUoYmFja0NvZGUpO1xcXFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcXFxuICAgICAgICBicmVhaztcXFxcbiAgICBjYXNlICdqc191cmwnOlxcXFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJrnvZHpobXmj5Lku7bvv6Vqc191cmzvv6UnICsgZGF0YUl0ZW0ubmFtZSArICdAYmFzZTY0Oi8vJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgJ2h0bWwnOlxcXFxuICAgICAgICBsZXQgZmlsZV90bXAgPSBkYXRhSXRlbS5uYW1lLnNwbGl0KCcuJyk7XFxcXG4gICAgICAgIGxldCBmaWxlX3BhdGggPSBmaWxlX3RtcC5sZW5ndGggPiAxID8gZmlsZV90bXBbZmlsZV90bXAubGVuZ3RoIC0gMV0gKyBcXFxcXFxcIi9cXFxcXFxcIiArIGRhdGFJdGVtLm5hbWUgOiBkYXRhSXRlbS5uYW1lO1xcXFxuICAgICAgICBydWxlQ29kZSA9IFxcXFxcXFwi5rW36ZiU6KeG55WM5pys5Zyw5paH5Lu25YiG5Lqr77+lZmlsZV91cmzvv6VoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvXFxcXFxcXCIgKyBmaWxlX3BhdGggKyBcXFxcXFxcIkBcXFxcXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkO1xcXFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcXFxuICAgICAgICBicmVha1xcXFxuICAgIGNhc2UgXFxcXFxcXCJjb25maWdcXFxcXFxcIjpcXFxcbiAgICAgICAgaW1wb3J0VXJsID0gJCgpLnJ1bGUocGFzc3dvcmQgPT4ge1xcXFxuICAgICAgICAgICAgZXZhbChmZXRjaChcXFxcXFxcImhpa2VyOi8vYXNzZXRzL2hvbWUuanNcXFxcXFxcIikpO1xcXFxuICAgICAgICAgICAgSGlrZXJIb21lLmxvYWQoXFxcXFxcXCJpbXBvcnRcXFxcXFxcIiwgcGFzc3dvcmQpO1xcXFxuICAgICAgICB9LCBiYWNrQ29kZSk7XFxcXG4gICAgICAgIGJyZWFrO1xcXFxufVxcXFxubGV0IG15X2NvbF90eXBlID0gXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIjtcXFxcbmlmIChpbXBvcnRVcmwpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLlr7zlhaXop4TliJlcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiBkYXRhSXRlbS5pc19zYWZlP2ltcG9ydFVybDondG9hc3Q6Ly/po47pmanop4TliJnnpoHmraLlr7zlhaUhISEnLFxcXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbiAgICB9KTtcXFxcbn1cXFxcbmlmIChydWxlQ29kZSkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuWIhuS6q+WPo+S7pFxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6IFxcXFxcXFwiY29weTovL1xcXFxcXFwiICsgcnVsZUNvZGUsXFxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcXFxuICAgIH0pO1xcXFxufVxcXFxuXFxcXG5pZiAoaW1wb3J0VXJsKSB7XFxcXG4gICAgaWYgKGRhdGFJdGVtLmlzX2pzb25fbGlzdCAmJiAhaGFzU3ViKSB7XFxcXG4gICAgICAgIGxldCBzdWJfcnVsZV9jb2RlID0gJ+a1t+mYlOinhueVjOWQiOmbhuinhOWImeiuoumYhe+/pWhvbWVfc3Vi77+lJyArIGRhdGFJdGVtLm5hbWUgKyBcXFxcXFxcIkBAXFxcXFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXFxcbiAgICAgICAgbGV0IHN1Yl91cmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUoc3ViX3J1bGVfY29kZSk7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJ+iuoumYheWQiOmbhicsXFxcXG4gICAgICAgICAgICB1cmw6IHN1Yl91cmwsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICNmZjcwMDBcXFxcXFxcIj7lr7zlhaXovbvlkIjpm4Y8L3NwYW4+JyxcXFxcbiAgICAgICAgICAgIHVybDogJCgpLmxhenlSdWxlKChkYXRhSXRlbSxzdWJVcmwpPT57XFxcXG4gICAgICAgICAgICAgICAgY29uc3Qge2dlblJ1bGV9PSQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9nZW5BcGlcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGltcG9ydF9ydWxlPWdlblJ1bGUoZGF0YUl0ZW0ubmFtZStcXFxcXFxcIi5cXFxcXFxcIitkYXRhSXRlbS5hdXRob3Isc3ViVXJsKTtcXFxcbiAgICAgICAgICAgICAgICAvL2NvcHkoaW1wb3J0X3J1bGUpO1xcXFxuICAgICAgICAgICAgICAgIGxldCBydWxlQ29kZT1wYXJzZVBhc3RlKGltcG9ydF9ydWxlLnNwbGl0KFxcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXCIpWzBdKTtcXFxcbiAgICAgICAgICAgICAgICAvL3JldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGltcG9ydFVybFxcXFxuICAgICAgICAgICAgfSxkYXRhSXRlbSxydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCI8c21hbGw+5o+Q56S677ya5byA5Y+R6ICF5Y2V54us5YiG5Lqr55qE5ZCI6ZuG5paH5Lu25Y+q6IO95Y2V54us5a+85YWl44CCPC9zbWFsbD5cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH0gZWxzZSBpZiAoIWRhdGFJdGVtLmlzX2pzb25fbGlzdCAmJiAhaGFzU3ViICYmIGRhdGFJdGVtLmRhdGFfdHlwZSA9PSAnaG9tZV9ydWxlX3VybCcpIHtcXFxcbiAgICAgICAgbGV0IHN1Yl9ydWxlX2NvZGUgPSAn5rW36ZiU6KeG55WM5Y2V6KeE5YiZ6K6i6ZiF77+laG9tZV9zdWLvv6UnICsgZGF0YUl0ZW0ubmFtZSArIFxcXFxcXFwiQEBcXFxcXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgJyZkZWJ1Zz10cnVlJztcXFxcbiAgICAgICAgbGV0IHN1Yl91cmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUoc3ViX3J1bGVfY29kZSk7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJ+iuoumYheinhOWImScsXFxcXG4gICAgICAgICAgICB1cmw6IHN1Yl91cmwsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbiAgICAgICAgfSlcXFxcbiAgICB9XFxcXG59XFxcXG5pZiAoZGF0YUl0ZW0uaXNfanNvbiAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT09IFxcXFxcXFwiaG9tZV9ydWxlX3VybFxcXFxcXFwiICYmICFkYXRhSXRlbS5pc19qc29uX2xpc3QpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogJ+i/m+WFpemikemBkycsXFxcXG4gICAgICAgIHVybDogJCggLypcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIqLyApLmxhenlSdWxlKChuYW1lLGhvbWUpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChob21lKSk7XFxcXG4gICAgICAgICAgICBsZXQgaGFzUnVsZSA9IHJ1bGVMaXN0LnNvbWUoaXRlbSA9PiBpdGVtLnRpdGxlID09PSBuYW1lKTtcXFxcbiAgICAgICAgICAgIGlmIChoYXNSdWxlKSB7XFxcXG4gICAgICAgICAgICAgICAgcHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmJhY2tcXFxcXFxcIiwgXFxcXFxcXCIxXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gaG9tZStcXFxcXFxcInNAXFxcXFxcXCIgKyBuYW1lO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+acquWuieijhVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9LCBkYXRhSXRlbS5uYW1lLGFwaS5ob21lKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG4gICAgfSlcXFxcbn1cXFxcbmxldCBtYW5fcnVsZV9zYWZlID0gZ2V0QXBpKFxcXFxcXFwibWFuUnVsZVNhZmVcXFxcXFxcIikrZGF0YUl0ZW0uaWQ7XFxcXG5sZXQgbWFuX3J1bGVfZ29vZCA9IGdldEFwaShcXFxcXFxcIm1hblJ1bGVHb29kXFxcXFxcXCIpK2RhdGFJdGVtLmlkO1xcXFxuLy8gZGF0YUl0ZW0uaXNfc2FmZTtcXFxcbmlmKGdldFZhcignaG91c2UuaXNfbWFuYWdlcicpKXtcXFxcbiAgICBmdW5jdGlvbiBzZXRJc1NhZmUoZmxhZyxtYW5fcnVsZV9zYWZlKSB7XFxcXG4gICAgICAgIGZsYWcgPSBmbGFnIHx8ICcnO1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IGNvZGUgPSBmZXRjaChtYW5fcnVsZV9zYWZlLCB7XFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOiBNT0JJTEVfVUF9LFxcXFxuICAgICAgICAgICAgICAgIGJvZHk6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInVzZXJuYW1lXFxcXFxcXCI6IGdldFZhcignaG91c2UudXNlcm5hbWUnKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCI6IGdldFZhcignaG91c2UucGFzc3dvcmQnKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcImlzX3NhZmVcXFxcXFxcIjogISFmbGFnXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICBjb2RlID0gSlNPTi5wYXJzZShjb2RlKS5yZXN1bHQ7XFxcXG4gICAgICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT09IDApIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZS5kZXRhaWxcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGNvZGUuZGV0YWlsXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBlLm1lc3NhZ2VcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBmdW5jdGlvbiBzZXRJc0dvb2QoZmxhZyxtYW5fcnVsZV9nb29kKSB7XFxcXG4gICAgICAgIGZsYWcgPSBmbGFnIHx8ICcnO1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IGNvZGUgPSBmZXRjaChtYW5fcnVsZV9nb29kLCB7XFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOiBNT0JJTEVfVUF9LFxcXFxuICAgICAgICAgICAgICAgIGJvZHk6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInVzZXJuYW1lXFxcXFxcXCI6IGdldFZhcignaG91c2UudXNlcm5hbWUnKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCI6IGdldFZhcignaG91c2UucGFzc3dvcmQnKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcImlzX2dvb2RcXFxcXFxcIjogISFmbGFnXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICBjb2RlID0gSlNPTi5wYXJzZShjb2RlKS5yZXN1bHQ7XFxcXG4gICAgICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT09IDApIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZS5kZXRhaWxcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGNvZGUuZGV0YWlsXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBlLm1lc3NhZ2VcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTon8J+aq+mjjumZqScsXFxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uumjjumZqT/po47pmanop4TliJnml6Dms5Xooqvlr7zlhaUnKS5jb25maXJtKChpZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSk9PntcXFxcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc1NhZmUoZmFsc2UsbWFuX3J1bGVfc2FmZSk7XFxcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSlcXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTon4pyF5q2j5bi4JyxcXFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcXFxuICAgICAgICB1cmw6JCgn5qCH6K6w6K+l6KeE5YiZ5Li65q2j5bi4PycpLmNvbmZpcm0oKGlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKT0+e1xcXFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldElzU2FmZSh0cnVlLG1hbl9ydWxlX3NhZmUpO1xcXFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxcXG4gICAgICAgIH0sZGF0YUl0ZW0uaWQsbWFuX3J1bGVfc2FmZSxzZXRJc1NhZmUpXFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6J+KZpemdnuS8mOi0qCcsXFxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uumdnuS8mOi0qD8nKS5jb25maXJtKChpZCxtYW5fcnVsZV9nb29kLHNldElzR29vZCk9PntcXFxcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc0dvb2QoZmFsc2UsbWFuX3J1bGVfZ29vZCk7XFxcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9nb29kLHNldElzR29vZClcXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTon8J+SluS8mOi0qCcsXFxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uuS8mOi0qD8nKS5jb25maXJtKChpZCxtYW5fcnVsZV9nb29kLHNldElzR29vZCk9PntcXFxcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc0dvb2QodHJ1ZSxtYW5fcnVsZV9nb29kKTtcXFxcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcXFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX2dvb2Qsc2V0SXNHb29kKVxcXFxuICAgIH0pO1xcXFxufVxcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBkYXRhSXRlbS5nb29kX251bSxcXFxcbiAgICBwaWNfdXJsOiBcXFxcXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/otZ4uc3ZnXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl9zbWFsbF8zXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9NYWtlQWNvbW1lbnQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgaWQ6IGRhdGFJdGVtLmlkLFxcXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lXFxcXG4gICAgfVxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBkYXRhSXRlbS5iYWRfbnVtLFxcXFxuICAgIHBpY191cmw6IFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+i4qS5zdmdcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uX3NtYWxsXzNcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL01ha2VBY29tbWVudCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxcXG4gICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWUsXFxcXG4gICAgICAgIGRlZmF1bHRUeXBlOlxcXFxcXFwiYmFkXFxcXFxcXCJcXFxcbiAgICB9XFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi6K+E6K66XFxcXFxcXCIsXFxcXG4gICAgcGljX3VybDogXFxcXFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6K+E6K66LnN2Z1xcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fc21hbGxfM1xcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvTWFrZUFjb21tZW50I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXFxcbiAgICAgICAgbmFtZTogZGF0YUl0ZW0ubmFtZVxcXFxuICAgIH1cXFxcbn0pO1xcXFxubGV0IHRvdGFsU3VtID0gZGF0YUl0ZW0uZ29vZF9udW0gKyBkYXRhSXRlbS5iYWRfbnVtO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXFxcXFwiYmlnXFxcXFxcXCIsIFxcXFxcXFwi6K+E6K66KFxcXFxcXFwiICsgdG90YWxTdW0gKyBcXFxcXFxcIilcXFxcXFxcIikgKyBcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFwiICsgc21hbGwoaHRtbFRhZyhcXFxcXFxcInVcXFxcXFxcIiwgXFxcXFxcXCLmn6XnnIvlhajpg6jor4TorrogPlxcXFxcXFwiKSksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9Db21tZW50XFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHkjZnlwYWdlI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxcXG4gICAgICAgIHRvdGFsU3VtOiB0b3RhbFN1bSxcXFxcbiAgICAgICAgbm9fYWN0aXZlOiBmYWxzZVxcXFxuICAgIH1cXFxcbn0pO1xcXFxuLy9jb25zdCBsb25nZXN0U3VtPTEyMDtcXFxcbmxldCBpY29uID0ge1xcXFxuICAgIFxcXFxcXFwiZ29vZFxcXFxcXFwiOiBcXFxcXFxcIvCfkY1cXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImJhZFxcXFxcXFwiOiBcXFxcXFxcIvCfkY5cXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcInJlcGx5XFxcXFxcXCI6XFxcXFxcXCLlvIDlj5HogIXwn5ejXFxcXFxcXCJcXFxcbn1cXFxcbmlmICh0b3RhbFN1bSA9PT0gMCkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuS4gOadoeivhOiuuuS5n+ayoeacie+8jOW/q+adpeaKouaymeWPkeWQp++8gTwvaDU+XFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59IGVsc2Uge1xcXFxuICAgIGxldCBjb21tZW50TGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuZGlzX2dldCArIGRhdGFJdGVtLmlkICsgXFxcXFxcXCI/bGltaXQ9NVxcXFxcXFwiKSkucmVzdWx0O1xcXFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY29tbWVudExpc3QpIHtcXFxcbiAgICAgICAgbGV0IFJlcGx5ID0gaXRlbS5kaXNjdXNzX3R5cGU9PT1cXFxcXFxcInJlcGx5XFxcXFxcXCImJml0ZW0ucmVwbHlfdG9fbmFtZSE9PWZhbHNlJiZpdGVtLnJlcGx5X3RvX2lkIT09ZmFsc2U/XFxcXFxcXCLigJjigJjlm57lpI1AXFxcXFxcXCIraXRlbS5yZXBseV90b19uYW1lK1xcXFxcXFwiICNcXFxcXFxcIitpdGVtLmRpc2N1c3NfaWQrXFxcXFxcXCLigJnigJlcXFxcXFxcXG5cXFxcXFxcIjpcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0ubmFtZSArIFxcXFxcXFwiJm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9J2dyYXknPjxzbWFsbD4jXFxcXFxcXCIgKyBpdGVtLmlkICsgXFxcXFxcXCI8L3NtYWxsPjxmb250PlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYXZhdGFyXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAvL3VybDogXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgaXRlbS5xcSxcXFxcbiAgICAgICAgICAgIHVybDpcXFxcXFxcIm1xcXdwYTovL2ltL2NoYXQ/Y2hhdF90eXBlPXdwYSZ1aW49XFxcXFxcXCIraXRlbS5xcSxcXFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXFxcbiAgICAgICAgICAgIGRlc2M6IFJlcGx5K2l0ZW0uY3JlYXRlX2RhdGUgKyBcXFxcXFxcIsK3XFxcXFxcXCIgKyBpY29uW2l0ZW0uZGlzY3Vzc190eXBlXSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYTp7XFxcXG4gICAgICAgICAgICAgICAgbmFtZTppdGVtLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgdHlwZTpcXFxcXFxcImxvbmdfdGV4dFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHRleHQ6aXRlbS5kaXNjdXNzX3RleHRcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufVxcXFxuXFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcInJpY2hfdGV4dFxcXCIsXFxcIm5hbWVcXFwiOlxcXCLmn6XnnItcXFwiLFxcXCJwYXRoXFxcIjpcXFwiaW5mb1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIuafpeeci+OAjFxcXFxcXFwiK01ZX1BBUkFNUy5uYW1lK1xcXFxcXFwi44CNXFxcXFxcXCIpXFxcXG5zZXRSZXN1bHQoW3tcXFxcbiAgICB0aXRsZTogTVlfUEFSQU1TLnRleHQsXFxcXG4gICAgY29sX3R5cGU6TVlfUEFSQU1TLnR5cGVcXFxcbn1dKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlvIDlj5HogIXms6jlhoxcXFwiLFxcXCJwYXRoXFxcIjpcXFwiUmVnaXN0ZXJcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLlvIDlj5HogIXms6jlhoxcXFxcXFxcIik7XFxcXG5jb25zdCB7XFxcXG4gICAgZ2V0QXBpLFxcXFxuICAgIGh0bWxUYWcsXFxcXG4gICAgbWFwQ29sVHlwZSxcXFxcbiAgICBzbWFsbFxcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG52YXIgZGF0YSA9IFtdO1xcXFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5QYXNzd29yZFxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5Vc2VybmFtZVxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5EZXNjcmlwdGlvblxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5Vc2VyQWRkcmVzc1xcXFxcXFwiKTtcXFxcbn0pKTtcXFxcbmFkZExpc3RlbmVyKCdvblJlZnJlc2gnLCAkLnRvU3RyaW5nKCgpPT57XFxcXG4gICAgcHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLldhaXRcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG59KSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiAn6LSm5Y+3JyxcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuivt+i+k+WFpei0puWPtyjlv4XloaspXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5Vc2VybmFtZScsICcnKSxcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJudW1iZXJcXFxcXFxcIixcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuVXNlcm5hbWVcXFxcXFxcIixpbnB1dCknXFxcXG4gICAgfVxcXFxufSwge1xcXFxuICAgIHRpdGxlOiAn5a+G56CBJyxcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuivt+i+k+WFpeWvhueggSjlv4XloaspXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5QYXNzd29yZCcsICcnKSxcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiLFxcXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZS5QYXNzd29yZFxcXFxcXFwiLGlucHV0KSdcXFxcbiAgICB9XFxcXG59KTtcXFxcbm1hcENvbFR5cGUoZGF0YSwgXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCIsIDEpO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+aYteensCcsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLor7fovpPlhaXmmLXnp7Ao5b+F5aGrKVxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UuVXNlckFkZHJlc3MnLCAnJyksXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLlVzZXJBZGRyZXNzXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0sIHtcXFxcbiAgICB0aXRsZTogJ+aPj+i/sCcsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLor7Tor7TkuLrku4DkuYjopoHms6jlhozlkKdcXFxcXFxcXG4o5Y+v5Lul5aKe5Yqg6YCa6L+H5qaC546HLOmAieWhqylcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLkRlc2NyaXB0aW9uJywgJycpLFxcXFxuICAgICAgICB0eXBlOiBcXFxcXFxcInRleHRhcmVhXFxcXFxcXCIsXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLkRlc2NyaXB0aW9uXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0pXFxcXG5cXFxcbm1hcENvbFR5cGUoZGF0YSwgXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCIsIDEpO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXFxcXFwiYlxcXFxcXFwiLCBcXFxcXFxcIuazqOWGjFxcXFxcXFwiKSxcXFxcbiAgICB1cmw6ICQoZ2V0QXBpKFxcXFxcXFwibmV3X2RldlxcXFxcXFwiKStcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChnZXRJZCwgY29uZmlybSkgPT4ge1xcXFxuICAgICAgICBsZXQgdXNlcm5hbWUgPSBnZXRWYXIoJ1dhcmVob3VzZS5Vc2VybmFtZScsIFxcXFxcXFwiXFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgcGFzc3dvcmQgPSBnZXRWYXIoJ1dhcmVob3VzZS5QYXNzd29yZCcsIFxcXFxcXFwiXFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBnZXRWYXIoJ1dhcmVob3VzZS5EZXNjcmlwdGlvbicsIFxcXFxcXFwiXFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgbmFtZSA9IGdldFZhcihcXFxcXFxcIldhcmVob3VzZS5Vc2VyQWRkcmVzc1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgaWYgKFt1c2VybmFtZSwgcGFzc3dvcmQsIG5hbWVdLmluY2x1ZGVzKFxcXFxcXFwiXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+i0puWPtyzlr4bnoIHlkozmmLXnp7DkuI3og73kuLrnqbpcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBzaG93TG9hZGluZyhcXFxcXFxcIuato+WcqOaPkOS6pOeUs+ivt+ihqFxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQsIHtcXFxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJyZWFzb25cXFxcXFxcIjogZGVzY3JpcHRpb24sXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBuYW1lLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCI6IHBhc3N3b3JkLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInFxXFxcXFxcXCI6IHVzZXJuYW1lXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICBtZXRob2Q6ICdwb3N0J1xcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXFxcbiAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyByZXN1bHQuZGV0YWlsO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBpZHJlc3VsdCA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRJZCArIFxcXFxcXFwiP3FxPVxcXFxcXFwiICsgdXNlcm5hbWUpKTtcXFxcbiAgICAgICAgaWYgKGlkcmVzdWx0LnN0YXR1cyAhPT0gMCkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIGlkcmVzdWx0LmRldGFpbDtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBcXFxcbiAgICAgICAgcmV0dXJuICQoXFxcXFxcXCJcXFxcXFxcIiwgXFxcXFxcXCLovpPlhaXpgq7nrrHpqozor4HnoIFcXFxcXFxcXG5cXFxcXFxcIiArIHJlc3VsdC5kZXRhaWwpLmlucHV0KChjb25maXJtLCBpZCwgYWNjb3VudCkgPT4ge1xcXFxuICAgICAgICAgICAgc2hvd0xvYWRpbmcoXFxcXFxcXCLor7fogJDlv4PnrYnlvoVcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGNvbmZpcm0sIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcXFxuICAgICAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhcmFtc1xcXFxcXFwiOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJyZWdpc3RfaWRcXFxcXFxcIjogaWQsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJ5em1cXFxcXFxcIjogaW5wdXRcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXFxcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xcXFxuICAgICAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgcmVzdWx0LmRldGFpbDtcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICBwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2VVc2VybmFtZVxcXFxcXFwiLCBhY2NvdW50WzBdKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlUGFzc3dvcmRcXFxcXFxcIiwgYWNjb3VudFsxXSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/miJDlip/mj5DkuqTms6jlhozms6jlhoxcXFxcXFxcXG5cXFxcXFxcIityZXN1bHQuZGV0YWlsO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Ye66ZSZ5LqG5ZGQXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0sIGNvbmZpcm0sIGlkcmVzdWx0LnJlc3VsdCwgW3VzZXJuYW1lLCBwYXNzd29yZF0pO1xcXFxuICAgIH0sIGdldEFwaShcXFxcXFxcIm5ld19nZXRJZFxcXFxcXFwiKSwgZ2V0QXBpKFxcXFxcXFwibmV3X2NvbmZpcm1cXFxcXFxcIikpLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXFxcbn0pO1xcXFxuc2V0UmVzdWx0KGRhdGEpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJ0ZXh0XzFcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5Liq5Lq66LWE5paZXFxcIixcXFwicGF0aFxcXCI6XFxcIlBlcnNvbmFsRGF0YVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIuS4quS6uui1hOaWmVxcXFxcXFwiKTtcXFxcbnZhciBkYXRhPVtdO1xcXFxuY29uc3Qge1xcXFxuICAgIGdldEFwaSxcXFxcbiAgICBnZXRGaWxlLFxcXFxuICAgIGFwaVxcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5sZXQge3VzZXJuYW1lLHBhc3N3b3JkfSA9IGdldEZpbGUoKTtcXFxcbmxldCBkZXYgPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXFxcXFwidXNlclxcXFxcXFwiKStNWV9QQVJBTVMuaWQpKS5yZXN1bHQ7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOlxcXFxcXFwi5aS05YOPXFxcXFxcXCIsXFxcXG4gICAgZGVzYzpkZXYuYXZhdGFyLFxcXFxuICAgIHVybDpcXFxcXFxcImhpa2VyOi8vcGFnZS9tb2RpZnlfUGVyc29uYWxEYXRhI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgIGV4dHJhOntcXFxcbiAgICAgICAgZGV2OmRldixcXFxcbiAgICAgICAgdXNlcm5hbWU6dXNlcm5hbWUsXFxcXG4gICAgICAgIHBhc3N3b3JkOnBhc3N3b3JkLFxcXFxuICAgICAgICBQYXR0ZXJuOjBcXFxcbiAgICB9LFxcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6XFxcXFxcXCLmmLXnp7BcXFxcXFxcIixcXFxcbiAgICBkZXNjOmRldi5uYW1lLFxcXFxuICAgIHVybDpcXFxcXFxcImhpa2VyOi8vcGFnZS9tb2RpZnlfUGVyc29uYWxEYXRhI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgIGV4dHJhOntcXFxcbiAgICAgICAgZGV2OmRldixcXFxcbiAgICAgICAgdXNlcm5hbWU6dXNlcm5hbWUsXFxcXG4gICAgICAgIHBhc3N3b3JkOnBhc3N3b3JkLFxcXFxuICAgICAgICBQYXR0ZXJuOjFcXFxcbiAgICB9LFxcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOlxcXFxcXFwi5a+G56CBXFxcXFxcXCIsXFxcXG4gICAgdXJsOlxcXFxcXFwiaGlrZXI6Ly9wYWdlL21vZGlmeV9QZXJzb25hbERhdGEjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6e1xcXFxuICAgICAgICBkZXY6ZGV2LFxcXFxuICAgICAgICB1c2VybmFtZTp1c2VybmFtZSxcXFxcbiAgICAgICAgcGFzc3dvcmQ6cGFzc3dvcmQsXFxcXG4gICAgICAgIFBhdHRlcm46MlxcXFxuICAgIH0sXFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6XFxcXFxcXCLotKblj7fvvJpcXFxcXFxcIit1c2VybmFtZSxcXFxcbiAgICB1cmw6XFxcXFxcXCJjb3B5Oi8vXFxcXFxcXCIrdXNlcm5hbWUsXFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOlxcXFxcXFwiVUlE77yaXFxcXFxcXCIrZGV2LmlkLFxcXFxuICAgIHVybDpcXFxcXFxcImNvcHk6Ly9cXFxcXFxcIitkZXYuaWQsXFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6XFxcXFxcXCLmj5DkuqTkupHku5PlupPop4TliJlcXFxcXFxcIixcXFxcbiAgICB1cmw6JChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChob3N0KT0+e1xcXFxuICAgICAgICBsZXQgY29kZT1yZXF1ZXN0KGhvc3QrXFxcXFxcXCIvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD0xNDVcXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCB3b3JkPVxcXFxcXFwi77+lcHVibGlzaO+/pVxcXFxcXFwiK2Jhc2U2NEVuY29kZShjb2RlKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwicnVsZTovL1xcXFxcXFwiK2Jhc2U2NEVuY29kZSh3b3JkKTtcXFxcbiAgICB9LGFwaS5ob3N0KSxcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6XFxcXFxcXCLlkIzmraXmj5DkuqTkupHku5PlupPotKblj7flr4bnoIFcXFxcXFxcIixcXFxcbiAgICB1cmw6XFxcXFxcXCJydWxlOi8vXFxcXFxcXCIrYmFzZTY0RW5jb2RlKFxcXFxcXFwi77+lcHVibGlzaF9hY2NvdW5077+lXFxcXFxcXCIrdXNlcm5hbWUrXFxcXFxcXCJAXFxcXFxcXCIrcGFzc3dvcmQpLFxcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOlxcXFxcXFwi5L2g5LiA5YWx5Y+R5biD5LqG44CMXFxcXFxcXCIrZGV2LnJ1bGVfbnVtK1xcXFxcXFwi44CN5p2h6KeE5YiZXFxcXFxcXCIsXFxcXG4gICAgdXJsOlxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5sZXQgdXNlciA9IGdldEZpbGUoKTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6XFxcXFxcXCLms6jplIDnmbvlvZVcXFxcXFxcIixcXFxcbiAgICB1cmw6JChcXFxcXFxcIuehruiupOazqOmUgOeZu+W9lT9cXFxcXFxcIikuY29uZmlybShmID0+IHtcXFxcbiAgICAgICAgZi51c2VybmFtZT1cXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICBmLnBhc3N3b3JkPVxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb24nLCBKU09OLnN0cmluZ2lmeShmKSk7XFxcXG4gICAgICAgIHB1dFZhcihcXFxcXFxcIldhcmVob3VzZS5iYWNrXFxcXFxcXCIsXFxcXFxcXCIxXFxcXFxcXCIpO1xcXFxuICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey5rOo6ZSAXFxcXFxcXCI7XFxcXG4gICAgfSx1c2VyKSxcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIlxcXFxufSk7XFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5pu05pS55Liq5Lq66LWE5paZXFxcIixcXFwicGF0aFxcXCI6XFxcIm1vZGlmeV9QZXJzb25hbERhdGFcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCB7XFxcXG4gICAgZ2V0QXBpLFxcXFxuICAgIGNvbG9yLFxcXFxuICAgIHNtYWxsLFxcXFxuICAgIGdldEZpbGUsXFxcXG4gICAgaHRtbFRhZ1xcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5sZXQge1xcXFxuICAgIGRldixcXFxcbiAgICB1c2VybmFtZSxcXFxcbiAgICBwYXNzd29yZCxcXFxcbiAgICBQYXR0ZXJuXFxcXG59ID0gTVlfUEFSQU1TO1xcXFxudmFyIGRhdGEgPSBbXTtcXFxcbmxldCBwYXRoID0gXFxcXFxcXCI/cXE9XFxcXFxcXCIgKyB1c2VybmFtZSArIFxcXFxcXFwiJnBhc3N3b3JkPVxcXFxcXFwiICsgcGFzc3dvcmQ7XFxcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0ucGV0TmFtZVxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5tLmF2YXRhclxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLmNcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC54XFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQueVxcXFxcXFwiKTtcXFxcbn0pKTtcXFxcbmZ1bmN0aW9uIG1fcGV0TmFtZSgpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICAgICAgZGVzYzogXFxcXFxcXCLor7fovpPlhaXmlrDmmLXnp7BcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0ucGV0TmFtZScsICcnKXx8ZGV2Lm5hbWUsXFxcXG4gICAgICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZS5tLnBldE5hbWVcXFxcXFxcIixpbnB1dCknXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLkv53lrZhcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKGdldEFwaShcXFxcXFxcIm1vZGlmeV9uYW1lXFxcXFxcXCIpICsgcGF0aCkubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IG5ld1BldE5hbWUgPSBnZXRWYXIoJ1dhcmVob3VzZS5tLnBldE5hbWUnLCAnJyk7XFxcXG4gICAgICAgICAgICBpZiAobmV3UGV0TmFtZSA9PSBcXFxcXFxcIlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHloavllYohXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCArIFxcXFxcXFwiJm5hbWU9XFxcXFxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQobmV3UGV0TmFtZSkpO1xcXFxuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xcXFxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXFxcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxcXG4gICAgfSk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIG1fYXZhdGFyKCkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgICAgICBkZXNjOiBcXFxcXFxcIuivt+i+k+WFpeaWsOeahOWktOWDj+mTvuaOpVxcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5hdmF0YXInLCAnJykgfHwgZGV2LmF2YXRhcixcXFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0uYXZhdGFyXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5L+d5a2YXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcXFxcXCJtb2RpZnlfYXZhXFxcXFxcXCIpICsgcGF0aCkubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IG5ld0F2YXRhciA9IGdldFZhcignV2FyZWhvdXNlLm0uYXZhdGFyJywgJycpO1xcXFxuICAgICAgICAgICAgXFxcXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCArIFxcXFxcXFwiJmF2YXRhcl91cmw9XFxcXFxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQobmV3QXZhdGFyKSk7XFxcXG4gICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XFxcXG4gICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xcXFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgcmVzdWx0LmRldGFpbDtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gbV9wd2QoKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6XFxcXFxcXCLljp/lr4bnoIFcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgICAgIGRlc2M6IFxcXFxcXFwi6K+36L6T5YWl5Y6f5a+G56CBXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICB0eXBlOlxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC55JywgJycpLFxcXFxuICAgICAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC55XFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6XFxcXFxcXCLmlrDlr4bnoIFcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgICAgIGRlc2M6IFxcXFxcXFwi6K+36L6T5YWl5paw5a+G56CBXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICB0eXBlOlxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC54JywgJycpLFxcXFxuICAgICAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC54XFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6XFxcXFxcXCLph43lpI3mlrDlr4bnoIFcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgICAgIGRlc2M6IFxcXFxcXFwi6K+36YeN5aSN5paw5a+G56CBXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICB0eXBlOlxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQuYycsICcnKSxcXFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQuY1xcXFxcXFwiLGlucHV0KSdcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuS/neWtmFxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXFxcXFwibW9kaWZ5X3B3ZFxcXFxcXFwiKStwYXRoKS5sYXp5UnVsZSgocGFzc3dvcmQsdXNlcm5hbWUpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBvbGRfcGFzc3dvcmQgPSBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLnknLCAnJyk7XFxcXG4gICAgICAgICAgICBsZXQgbmV3X3Bhc3N3b3JkID0gZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC54JywgJycpO1xcXFxuICAgICAgICAgICAgbGV0IG5ld19wYXNzd29yZF9hZ2FpbiA9IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQuYycsICcnKTtcXFxcbiAgICAgICAgICAgIGlmIChvbGRfcGFzc3dvcmQhPT1wYXNzd29yZCkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Y6f5a+G56CB6ZSZ6K+vXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZihuZXdfcGFzc3dvcmQ9PT1cXFxcXFxcIlxcXFxcXFwiKXtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+ivt+i+k+WFpeaWsOWvhueggVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaWYobmV3X3Bhc3N3b3JkIT09bmV3X3Bhc3N3b3JkX2FnYWluKXtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S4pOasoeWvhueggeS4jeWQjFxcXFxcXFwiXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCArIFxcXFxcXFwiJm5ld19wYXNzd29yZD1cXFxcXFxcIiArIG5ld19wYXNzd29yZCtcXFxcXFxcIiZuZXdfcGFzc3dvcmRfcmU9XFxcXFxcXCIrbmV3X3Bhc3N3b3JkX2FnYWluKTtcXFxcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcXFxcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxcXG4gICAgICAgICAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFxcXFxcIixKU09OLnN0cmluZ2lmeSh7XFxcXG4gICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lOnVzZXJuYW1lLFxcXFxuICAgICAgICAgICAgICAgICAgICBwYXNzd29yZDpuZXdfcGFzc3dvcmRcXFxcbiAgICAgICAgICAgICAgICB9KSk7XFxcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyByZXN1bHQuZGV0YWlsO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9LHBhc3N3b3JkLHVzZXJuYW1lKSxcXFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcXFxuICAgIH0pO1xcXFxufVxcXFxuXFxcXG5zd2l0Y2ggKFBhdHRlcm4pIHtcXFxcbiAgICBjYXNlIDA6XFxcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFxcXFxcIuS/ruaUueWktOWDj1xcXFxcXFwiKTtcXFxcbiAgICAgICAgbV9hdmF0YXIoKTtcXFxcbiAgICAgICAgYnJlYWs7XFxcXG4gICAgY2FzZSAxOlxcXFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcXFxcXCLkv67mlLnmmLXnp7BcXFxcXFxcIik7XFxcXG4gICAgICAgIG1fcGV0TmFtZSgpO1xcXFxuICAgICAgICBicmVhaztcXFxcbiAgICBjYXNlIDI6XFxcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFxcXFxcIuS/ruaUueWvhueggVxcXFxcXFwiKTtcXFxcbiAgICAgICAgbV9wd2QoKTtcXFxcbiAgICAgICAgYnJlYWs7XFxcXG59XFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi57yW6L6R6KeE5YiZ5aSH5rOoXFxcIixcXFwicGF0aFxcXCI6XFxcInNldF9ydWxlX25vdGVzXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IGRhdGEgPSBbXTtcXFxcbmNvbnN0IHtcXFxcbiAgICBnZXRBcGlcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxubGV0IHtcXFxcbiAgICBpZCxcXFxcbiAgICB1c2VybmFtZSxcXFxcbiAgICBwYXNzd29yZCxcXFxcbiAgICBuYW1lXFxcXG59ID0gTVlfUEFSQU1TO1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi5aSH5rOo44CMXFxcXFxcXCIrbmFtZStcXFxcXFxcIuOAjVxcXFxcXFwiKTtcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJyxcXFxcXFxcImNsZWFyVmFyKCdXYXJlaG91c2UucnVsZS5ub3RlcycsICcnKVxcXFxcXFwiKTtcXFxcbmxldCBub3Rlcz1yZXF1ZXN0KGdldEFwaShcXFxcXFxcImdldF9ydWxlX25vdGVcXFxcXFxcIikraWQpO1xcXFxubm90ZXM9SlNPTi5wYXJzZShub3RlcykucmVzdWx0O1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuinhOWImeWkh+azqC4uLi4uLlxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UucnVsZS5ub3RlcycsICcnKXx8bm90ZXN8fFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgIHR5cGU6IFxcXFxcXFwidGV4dGFyZWFcXFxcXFxcIixcXFxcbiAgICAgICAgaGVpZ2h0Oi0xLFxcXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZS5ydWxlLm5vdGVzXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuS/neWtmFxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoZ2V0QXBpKFxcXFxcXFwic2V0X3J1bGVfbm90ZVxcXFxcXFwiKSArIGlkKS5sYXp5UnVsZSgodXNlcm5hbWUsIHBhc3N3b3JkKSA9PiB7XFxcXG4gICAgICAgIGxldCBub3RlcyA9IGdldFZhcignV2FyZWhvdXNlLnJ1bGUubm90ZXMnLCAnJyk7XFxcXG4gICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0LCB7XFxcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcInBhcmFtc1xcXFxcXFwiOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicXFcXFxcXFxcIjogdXNlcm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIjogcGFzc3dvcmQsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwibm90ZVxcXFxcXFwiOm5vdGVzXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXFxcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyByZXN1bHQuZGV0YWlsO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGJhY2soZmFsc2UpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXFxcXFwiO1xcXFxuICAgIH0sIHVzZXJuYW1lLCBwYXNzd29yZClcXFxcbn0pO1xcXFxuc2V0UmVzdWx0KGRhdGEpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJsaW5lXFxcIixcXFwibmFtZVxcXCI6XFxcIuivhOiuuuWIl+ihqFxcXCIsXFxcInBhdGhcXFwiOlxcXCJDb21tZW50XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi6K+E6K665YiX6KGoXFxcXFxcXCIpO1xcXFxuY29uc3Qge1xcXFxuICAgIGFwaVxcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5sZXQgZGF0YSA9IFtdO1xcXFxubGV0IHtcXFxcbiAgICB0b3RhbFN1bSxcXFxcbiAgICBpZCxcXFxcbiAgICBub19hY3RpdmUsXFxcXG4gICAgdXNlcm5hbWUsXFxcXG4gICAgcGFzc3dvcmRcXFxcbn0gPSBNWV9QQVJBTVM7XFxcXG5sZXQgcGFnZSA9IHBhcnNlSW50KE1ZX1VSTC5zcGxpdChcXFxcXFxcIiNcXFxcXFxcIilbMV0pO1xcXFxubGV0IGRpc2N1c3NfdHlwZSA9IGdldFZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbmlmIChwYWdlID09PSAxKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgcHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgIH0pKTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLlhajpg6hcXFxcXFxcIiArIChkaXNjdXNzX3R5cGUgPT09IFxcXFxcXFwiXFxcXFxcXCIgPyBcXFxcXFxcIuKXiVxcXFxcXFwiIDogXFxcXFxcXCLil4tcXFxcXFxcIiksXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgICAgICAgIHB1dFZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfNCdcXFxcblxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIvCfkY3otZ5cXFxcXFxcIiArIChkaXNjdXNzX3R5cGUgPT09IFxcXFxcXFwiZ29vZFxcXFxcXFwiID8gXFxcXFxcXCLil4lcXFxcXFxcIiA6IFxcXFxcXFwi4peLXFxcXFxcXCIpLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgICAgICBwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFxcXFxcIiwgXFxcXFxcXCJnb29kXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF80J1xcXFxuXFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi8J+Rjui4qVxcXFxcXFwiICsgKGRpc2N1c3NfdHlwZSA9PT0gXFxcXFxcXCJiYWRcXFxcXFxcIiA/IFxcXFxcXFwi4peJXFxcXFxcXCIgOiBcXFxcXFxcIuKXi1xcXFxcXFwiKSxcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICAgICAgcHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcXFxcXCIsIFxcXFxcXFwiYmFkXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF80J1xcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuWbnuWkjVxcXFxcXFwiICsgKGRpc2N1c3NfdHlwZSA9PT0gXFxcXFxcXCJyZXBseVxcXFxcXFwiID8gXFxcXFxcXCLil4lcXFxcXFxcIiA6IFxcXFxcXFwi4peLXFxcXFxcXCIpLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgICAgICBwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFxcXFxcIiwgXFxcXFxcXCJyZXBseVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfNCdcXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxuXFxcXG5sZXQgaWNvbiA9IHtcXFxcbiAgICBcXFxcXFxcImdvb2RcXFxcXFxcIjogXFxcXFxcXCLwn5GNXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJiYWRcXFxcXFxcIjogXFxcXFxcXCLwn5GOXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJyZXBseVxcXFxcXFwiOlxcXFxcXFwi5byA5Y+R6ICF8J+Xo1xcXFxcXFwiXFxcXG59XFxcXG5sZXQgY29udHJvbD0ocGlkLGFjdGl2ZSk9PnZvaWQgMDtcXFxcbmlmKG5vX2FjdGl2ZSl7XFxcXG4gICAgY29udHJvbD1mdW5jdGlvbihwaWQsYWN0aXZlKXtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOmFjdGl2ZT9cXFxcXFxcIumakOiXj+ivhOiuulxcXFxcXFwiOlxcXFxcXFwi5bGV56S66K+E6K66XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6JChhcGkuZGlzX2Rldl9jb250cm9sK3BpZCtcXFxcXFxcIj9xcT1cXFxcXFxcIiArIHVzZXJuYW1lICsgXFxcXFxcXCImcGFzc3dvcmQ9XFxcXFxcXCIgKyBwYXNzd29yZCtcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpPT57XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdD1KU09OLnBhcnNlKHJlcXVlc3QoaW5wdXQpKTtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiK3Jlc3VsdC5kZXRhaWw7XFxcXG4gICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOlxcXFxcXFwidGV4dF8yXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTpcXFxcXFxcIuWIoOmZpOivhOiuulxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiQoXFxcXFxcXCLnoa7orqTliKDpmaTor6Xor4Torro/XFxcXFxcXCIpLmNvbmZpcm0oKGlucHV0KT0+e1xcXFxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQ9SlNPTi5wYXJzZShyZXF1ZXN0KGlucHV0KSk7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIityZXN1bHQuZGV0YWlsO1xcXFxuICAgICAgICAgICAgfSxhcGkuZGlzX2Rldl9jb250cm9sK3BpZCtcXFxcXFxcIj9xcT1cXFxcXFxcIiArIHVzZXJuYW1lICsgXFxcXFxcXCImcGFzc3dvcmQ9XFxcXFxcXCIgKyBwYXNzd29yZCtcXFxcXFxcIiZkZWxldGU9MVxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOlxcXFxcXFwidGV4dF8yXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTpcXFxcXFxcImxpbmVcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOlxcXFxcXFwibGluZVxcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbn1cXFxcbmlmICh0b3RhbFN1bSA9PT0gMCkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuS4gOadoeivhOiuuuS5n+ayoeacie+8jOW/q+adpeaKouaymeWPkeWQp++8gTwvaDU+XFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59IGVsc2Uge1xcXFxuICAgIGxldCBjb21tZW50TGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuZGlzX2dldCArIGlkICsgXFxcXFxcXCI/bGltaXQ9NSZwYWdlPVxcXFxcXFwiICsgcGFnZSArIFxcXFxcXFwiJm5vX2FjdGl2ZT1cXFxcXFxcIiArIG5vX2FjdGl2ZSArIFxcXFxcXFwiJmRpc2N1c3NfdHlwZT1cXFxcXFxcIiArIGRpc2N1c3NfdHlwZSkpLnJlc3VsdDtcXFxcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNvbW1lbnRMaXN0KSB7XFxcXG4gICAgICAgIGxldCBSZXBseSA9IGl0ZW0uZGlzY3Vzc190eXBlPT09XFxcXFxcXCJyZXBseVxcXFxcXFwiJiZpdGVtLnJlcGx5X3RvX25hbWUhPT1mYWxzZSYmaXRlbS5yZXBseV90b19pZCE9PWZhbHNlP1xcXFxcXFwi4oCY4oCY5Zue5aSNQFxcXFxcXFwiK2l0ZW0ucmVwbHlfdG9fbmFtZStcXFxcXFxcIiAjXFxcXFxcXCIraXRlbS5kaXNjdXNzX2lkK1xcXFxcXFwi4oCZ4oCZXFxcXFxcXFxuXFxcXFxcXCI6XFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLm5hbWUgKyBcXFxcXFxcIiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSdncmF5Jz48c21hbGw+I1xcXFxcXFwiICsgaXRlbS5pZCArIFxcXFxcXFwiPC9zbWFsbD48Zm9udD5cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImF2YXRhclxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgLy91cmw6IG5vX2FjdGl2ZT9cXFxcXFxcImhpa2VyOi8vcGFnZS9SZXBseVxcXFxcXFwiOlxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIGl0ZW0ucXEsXFxcXG5cXFxcdFxcXFx0ICAgICAgIHVybDpub19hY3RpdmU/XFxcXFxcXCJoaWtlcjovL3BhZ2UvUmVwbHlcXFxcXFxcIjpcXFxcXFxcIm1xcXdwYTovL2ltL2NoYXQ/Y2hhdF90eXBlPXdwYSZ1aW49XFxcXFxcXCIraXRlbS5xcSxcXFxcbiAgICAgICAgICAgIGV4dHJhOntcXFxcbiAgICAgICAgICAgICAgICBydWxlSWQ6IGlkLFxcXFxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcXFxcbiAgICAgICAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXFxcXG4gICAgICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxcXFxuICAgICAgICAgICAgICAgIHJlcGx5SWQ6aXRlbS5pZFxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXFxcbiAgICAgICAgICAgIGRlc2M6IFJlcGx5K2l0ZW0uY3JlYXRlX2RhdGUgKyBcXFxcXFxcIsK3XFxcXFxcXCIgKyBpY29uW2l0ZW0uZGlzY3Vzc190eXBlXSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYTp7XFxcXG4gICAgICAgICAgICAgICAgbmFtZTppdGVtLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgdHlwZTpcXFxcXFxcImxvbmdfdGV4dFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHRleHQ6aXRlbS5kaXNjdXNzX3RleHRcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGNvbnRyb2woaXRlbS5pZCxpdGVtLmFjdGl2ZSk7XFxcXG4gICAgfVxcXFxuICAgIGlmIChjb21tZW50TGlzdC5sZW5ndGggPT09IDApIHtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbnNldFJlc3VsdChkYXRhKVxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuWPkeihqOivhOiuulxcXCIsXFxcInBhdGhcXFwiOlxcXCJNYWtlQWNvbW1lbnRcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5sZXQgZGF0YSA9IFtdO1xcXFxuY29uc3Qge1xcXFxuICAgIGFwaSxcXFxcbiAgICBnZXRGaWxlXFxcXG59ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbmxldCB7XFxcXG4gICAgaWQsXFxcXG4gICAgbmFtZSxcXFxcbiAgICBkZWZhdWx0VHlwZVxcXFxufSA9IE1ZX1BBUkFNUztcXFxcbmxldCB1c2VyPWdldEZpbGUoKS51c2VyfHxbXFxcXFxcXCJcXFxcXFxcIixcXFxcXFxcIlxcXFxcXFwiXTtcXFxcblxcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi6K+E6K66KFxcXFxcXFwiICsgbmFtZSArIFxcXFxcXFwiKVxcXFxcXFwiKTtcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC50eXBlXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQudGV4dFxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LnFxXFxcXFxcXCIpO1xcXFxuICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbn0pKTtcXFxcbmxldCB0eXBlID0gZ2V0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQudHlwZVxcXFxcXFwiKSB8fCBkZWZhdWx0VHlwZXx8XFxcXFxcXCJnb29kXFxcXFxcXCI7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGRlc2M6IFxcXFxcXFwi6K+E6K66Li4uLi4uXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5jb21tZW50LnRleHQnLCAnJyksXFxcXG4gICAgICAgIHR5cGU6IFxcXFxcXFwidGV4dGFyZWFcXFxcXFxcIixcXFxcbiAgICAgICAgaGVpZ2h0OjcsXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQudGV4dFxcXFxcXFwiLGlucHV0KSdcXFxcbiAgICB9XFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6XFxcXFxcXCLotKblj7fvvJpcXFxcXFxcIisodXNlclswXXx8XFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgZGVzYzpcXFxcXFxcIumqjOivgeegge+8mlxcXFxcXFwiKyh1c2VyWzFdfHxcXFxcXFxcIlxcXFxcXFwiKSxcXFxcbiAgICB1cmw6XFxcXFxcXCJoaWtlcjovL3BhZ2UvVXNlcnJlZ2lzdHJhdGlvblxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF8xJyxcXFxcbiAgICBcXFxcbn0pO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiAgKHR5cGUgPT09IFxcXFxcXFwiZ29vZFxcXFxcXFwiID8gXFxcXFxcXCLil4lcXFxcXFxcIiA6IFxcXFxcXFwi4peLXFxcXFxcXCIpK1xcXFxcXFwiIPCfkY1cXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgIHB1dFZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LnR5cGVcXFxcXFxcIiwgXFxcXFxcXCJnb29kXFxcXFxcXCIpO1xcXFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgfSksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzInXFxcXG5cXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogICh0eXBlID09PSBcXFxcXFxcImJhZFxcXFxcXFwiID8gXFxcXFxcXCLil4lcXFxcXFxcIiA6IFxcXFxcXFwi4peLXFxcXFxcXCIpK1xcXFxcXFwiIPCfkY5cXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgIHB1dFZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LnR5cGVcXFxcXFxcIiwgXFxcXFxcXCJiYWRcXFxcXFxcIik7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICB9KSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMidcXFxcbn0pO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuaPkOS6pFxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoYXBpLmRpc19uZXcgKyBpZCkubGF6eVJ1bGUoKEFjY291bnQpID0+IHtcXFxcbiAgICAgICAgbGV0IHRleHQgPSBnZXRWYXIoJ1dhcmVob3VzZS5jb21tZW50LnRleHQnLCAnJyk7XFxcXG4gICAgICAgIGxldCBbcXEsYXV0aF9jb2RlXSA9IEFjY291bnQ7XFxcXG4gICAgICAgIGxldCB0eXBlID0gZ2V0VmFyKCdXYXJlaG91c2UuY29tbWVudC50eXBlJykgfHwgJ2dvb2QnO1xcXFxuICAgICAgICBxcT1xcXx8XFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgYXV0aF9jb2RlPWF1dGhfY29kZXx8XFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgaWYocXE9PVxcXFxcXFwiXFxcXFxcXCJ8fGF1dGhfY29kZT09XFxcXFxcXCJcXFxcXFxcIil7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+acqueZu+W9lei0puWPt1xcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmKHRleHQ9PVxcXFxcXFwiXFxcXFxcXCIpe1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHlhpnllYpcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBmdW5jdGlvbiByKHApIHtcXFxcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0LCB7XFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwKSxcXFxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgcCA9IHtcXFxcbiAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6IHtcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcImRpc2N1c3NfdGV4dFxcXFxcXFwiOiB0ZXh0LFxcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwicXFcXFxcXFxcIjogcXEsXFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJkaXNjdXNzX3R5cGVcXFxcXFxcIjogdHlwZSxcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcImF1dGhfY29kZVxcXFxcXFwiOiBhdXRoX2NvZGVcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gcihwKTtcXFxcbiAgICAgICAgaWYocmVzdWx0LnN0YXR1cz09PTApe1xcXFxuICAgICAgICAgICAgYmFjayhmYWxzZSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIityZXN1bHQuZGV0YWlsO1xcXFxuXFxcXG4gICAgfSx1c2VyKVxcXFxufSk7XFxcXG5cXFxcbnNldFJlc3VsdChkYXRhKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLkvKrnlKjmiLfms6jlhoxcXFwiLFxcXCJwYXRoXFxcIjpcXFwiVXNlcnJlZ2lzdHJhdGlvblxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmNvbnN0IHtcXFxcbiAgICBhcGksXFxcXG4gICAgZ2V0RmlsZSxcXFxcbiAgICBnZXRVc2VyRGF0ZVxcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5sZXQgZGF0YSA9IFtdO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi55So5oi35YiX6KGo566h55CGXFxcXFxcXCIpO1xcXFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5tLnFxXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0ueXptXFxcXFxcXCIpO1xcXFxufSkpO1xcXFxubGV0IHVzZXIgPSBnZXRGaWxlKCk7XFxcXG5sZXQgdXNlck5hbWUgPSB1c2VyLnVzZXIgfHwgW1xcXFxcXFwiXFxcXFxcXCJdO1xcXFxudXNlck5hbWUgPSB1c2VyTmFtZVswXTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc4oCd4oCdPGJpZz4o5re75YqgL+mqjOivgSnotKblj7c8L2JpZz5cXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLojrflj5ZcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuivt+i+k+WFpXFxXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkLnRvU3RyaW5nKChhLCBiKSA9PiB7XFxcXG4gICAgICAgIGxldCBxcSA9IGlucHV0O1xcXFxuICAgICAgICBpZiAocXEgPT0gXFxcXFxcXCJcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHloavllYohXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgc2hvd0xvYWRpbmcoXFxcXFxcXCLojrflj5bkuK0uLi5cXFxcXFxcIilcXFxcbiAgICAgICAgcmV0dXJuICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgocXEsIGEsIGIpID0+IHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGEsIHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXFxcbiAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJxcVxcXFxcXFwiOiBxcVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXFxcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxcXG4gICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgcmVzdWx0LmRldGFpbDtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdDIgPSBKU09OLnBhcnNlKHJlcXVlc3QoYiArIFxcXFxcXFwiP3FxPVxcXFxcXFwiICsgcXEpKTtcXFxcbiAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyByZXN1bHQyLmRldGFpbDtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgICAgIHRocm93IGU7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgfSwgcXEsIGEsIGIpO1xcXFxuXFxcXG4gICAgfSwgYXBpLmRpc19uZXdfdXNlciwgYXBpLmRpc192ZXJpZnkpLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIHR5cGU6IFxcXFxcXFwibnVtYmVyXFxcXFxcXCIsXFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5xcScsICcnKSB8fCB1c2VyTmFtZSxcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UubS5xcVxcXFxcXFwiLGlucHV0KSdcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuivt+i+k+WFpemqjOivgeeggVxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS55em0nLCAnJyksXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0ueXptXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCcsXFxcXG4gICAgdGl0bGU6IFxcXFxcXFwiPHNtYWxsPuaPkOekuu+8mjEu5q+P5aSp5Y+q6IO96I635Y+WNeasoemqjOivgeeggS48YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi48cz7pqozor4HnoIHmnInmlYjmnJ/mjIHnu63kuIDlkajlt6blj7M8L3M+KOaaguaXtuS4jeS8mu+8jOW/mOiusOmqjOivgeeggeWPr+mAmui/h1FR5Y+36I635Y+WKTwvc21hbGw+XFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5sZXQgdXNlckxpc3QgPSBnZXRVc2VyRGF0ZSgpO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLpqozor4Ev55m75b2VXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwi56Gu5a6a5L+d5a2Y77yM6aqM6K+B56CB5aGr6ZSZ77yM5peg5rOV6K+E6K665ZOmXFxcXFxcXCIpLmNvbmZpcm0oKGYsIGwsIGxvZ2luKSA9PiB7XFxcXG4gICAgICAgIGxldCBxcSA9IGdldFZhcignV2FyZWhvdXNlLm0ucXEnLCAnJyk7XFxcXG4gICAgICAgIGxldCB5em0gPSBnZXRWYXIoJ1dhcmVob3VzZS5tLnl6bScsICcnKTtcXFxcbiAgICAgICAgaWYgKHFxID09IFxcXFxcXFwiXFxcXFxcXCIgfHwgeXptID09IFxcXFxcXFwiXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vcXHmiJbpqozor4HnoIHkuLrnqbpcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChsb2dpbiwge1xcXFxuICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInFxXFxcXFxcXCI6IHFxLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcImF1dGhfY29kZVxcXFxcXFwiOiB5em1cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcXFxuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xcXFxuICAgICAgICAgICAgZi51c2VyID0gW3FxLCB5em1dO1xcXFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoZikpO1xcXFxuICAgICAgICAgICAgbGV0IGluZGV4ID0gbC5maW5kSW5kZXgoaXRlbSA9PiBpdGVtWzBdID09PSBxcSk7XFxcXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xcXFxuICAgICAgICAgICAgICAgIGwuc3BsaWNlKGluZGV4LCAxLCBbcXEsIHl6bV0pO1xcXFxuICAgICAgICAgICAgfSBlbHNlIGlmIChsLmxlbmd0aCA8IDYpIHtcXFxcbiAgICAgICAgICAgICAgICBsLnB1c2goW3FxLCB5em1dKTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgbC5zcGxpY2UoMCwgMSk7XFxcXG4gICAgICAgICAgICAgICAgbC5wdXNoKFtxcSwgeXptXSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVJBLmpzb25cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkobCkpO1xcXFxuICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/pqozor4HmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgcmVzdWx0LmRldGFpbDtcXFxcbiAgICB9LCB1c2VyLCB1c2VyTGlzdCwgYXBpLmRpc19sb2dpbiksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnTxiaWc+6LSm5Y+35YiX6KGoPC9iaWc+XFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXFx0PHNtYWxsPijkv53nlZk15p2h6K6w5b2VKTwvc21hbGw+XFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxufSk7XFxcXG51c2VyTGlzdC5yZXZlcnNlKCk7XFxcXG5cXFxcbmZvciAobGV0IGl0ZW0gb2YgdXNlckxpc3QpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLotKblj7fvvJpcXFxcXFxcIiArIGl0ZW1bMF0gKyAodXNlck5hbWUgPT09IGl0ZW1bMF0gPyBcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdOKAnOKAnFvlvZPliY3otKblj7dd4oCd4oCdXFxcXFxcXCIgOiBcXFxcXFxcIlxcXFxcXFwiKSxcXFxcbiAgICAgICAgZGVzYzogXFxcXFxcXCLpqozor4HnoIHvvJpcXFxcXFxcIiArIGl0ZW1bMV0sXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIuaYr+WQpuWIh+aNouS4uuivpVtcXFxcXFxcIiArIGl0ZW1bMF0gKyBcXFxcXFxcIl3otKblj7dcXFxcXFxcIikuY29uZmlybSgoZiwgaXRlbSkgPT4ge1xcXFxuICAgICAgICAgICAgZi51c2VyID0gaXRlbTtcXFxcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGYpKTtcXFxcbiAgICAgICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5YiH5o2i5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgIH0sIHVzZXIsIGl0ZW0pLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufVxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLpgIDlh7rotKblj7dcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCLnoa7orqTpgIDlh7rnmbvlvZXnirbmgIFcXFxcXFxcIikuY29uZmlybSgoZikgPT4ge1xcXFxuICAgICAgICBmLnVzZXIgPSBbXTtcXFxcbiAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoZikpO1xcXFxuICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6YCA5Ye65oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgfSwgdXNlciksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcXFxufSk7XFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5YiX6KGo5o6S5bqP566X5rOVXFxcIixcXFwicGF0aFxcXCI6XFxcInNvcnRcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG4vKiDop4TliJnliJfooajmjpLluo8gWyBVUOOAgU5FV+OAgeaXoOabtOaWsCBdIOmhuuW6jyAqL1xcXFxuLyog5b2S5bm25o6S5bqPIFN0YXJ0ICovXFxcXG5mdW5jdGlvbiBtZXJnZVNvcnQoYXJyKSB7XFxcXG4gICAgdmFyIGxlbiA9IGFyci5sZW5ndGg7XFxcXG4gICAgaWYgKGxlbiA8IDIpIHtcXFxcbiAgICAgICAgcmV0dXJuIGFycjtcXFxcbiAgICB9XFxcXG4gICAgdmFyIG1pZGRsZSA9IE1hdGguZmxvb3IobGVuIC8gMiksXFxcXG4gICAgICAgIGxlZnQgPSBhcnIuc2xpY2UoMCwgbWlkZGxlKSxcXFxcbiAgICAgICAgcmlnaHQgPSBhcnIuc2xpY2UobWlkZGxlKTtcXFxcbiAgICByZXR1cm4gbWVyZ2UobWVyZ2VTb3J0KGxlZnQpLCBtZXJnZVNvcnQocmlnaHQpKTtcXFxcbn1cXFxcbmZ1bmN0aW9uIG1lcmdlKGxlZnQsIHJpZ2h0KSB7XFxcXG4gICAgdmFyIHJlc3VsdCA9IFtdO1xcXFxuICAgIHZhciBpc1RoaXNWZXJzaW9uTGlzdCA9IFtdO1xcXFxuXFxcXG4gICAgd2hpbGUgKGxlZnQubGVuZ3RoID4gMCAmJiByaWdodC5sZW5ndGggPiAwKSB7XFxcXG4gICAgICAgIGlmIChsZWZ0WzBdLnRpdGxlLmluY2x1ZGVzKFxcXFxcXFwi8J+GmVxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobGVmdC5zaGlmdCgpKTtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChyaWdodFswXS50aXRsZS5pbmNsdWRlcyhcXFxcXFxcIvCfhplcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJpZ2h0LnNoaWZ0KCkpO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKGxlZnRbMF0udGl0bGUuaW5jbHVkZXMoXFxcXFxcXCLwn4aVXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICByZXN1bHQucHVzaChsZWZ0LnNoaWZ0KCkpO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKHJpZ2h0WzBdLnRpdGxlLmluY2x1ZGVzKFxcXFxcXFwi8J+GlVxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgcmVzdWx0LnB1c2gocmlnaHQuc2hpZnQoKSk7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBpc1RoaXNWZXJzaW9uTGlzdC5wdXNoKGxlZnQuc2hpZnQoKSk7XFxcXG4gICAgICAgICAgICBpc1RoaXNWZXJzaW9uTGlzdC5wdXNoKHJpZ2h0LnNoaWZ0KCkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuXFxcXG4gICAgd2hpbGUgKGlzVGhpc1ZlcnNpb25MaXN0Lmxlbmd0aCkgcmVzdWx0LnB1c2goaXNUaGlzVmVyc2lvbkxpc3Quc2hpZnQoKSk7XFxcXG5cXFxcbiAgICB3aGlsZSAobGVmdC5sZW5ndGgpXFxcXG4gICAgICAgIHJlc3VsdC5wdXNoKGxlZnQuc2hpZnQoKSk7XFxcXG5cXFxcbiAgICB3aGlsZSAocmlnaHQubGVuZ3RoKVxcXFxuICAgICAgICByZXN1bHQucHVzaChyaWdodC5zaGlmdCgpKTtcXFxcblxcXFxuICAgIHJldHVybiByZXN1bHQ7XFxcXG59XFxcXG4kLmV4cG9ydHMubWVyZ2VTb3J0ID0gbWVyZ2VTb3J0O1xcXFxuLyog5b2S5bm25o6S5bqPIEVuZCAqL1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJpY29uXzJfcm91bmRcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5YWo6YOo5YWs5byA6KeE5YiZXFxcIixcXFwicGF0aFxcXCI6XFxcIkFsbFB1YmxpY1J1bGVcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG4gICAgY29uc3Qge1xcXFxuICAgICAgICBhcGksXFxcXG4gICAgICAgIGxvY2FsUnVsZVZlcixcXFxcbiAgICAgICAgZ2V0QXBpXFxcXG4gICAgfSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5jb25zdCB7XFxcXG4gICAgbWVyZ2VTb3J0XFxcXG59ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3NvcnRcXFxcXFxcIik7XFxcXG5sZXQgZGF0YVR5cGUgPSBnZXRWYXIoXFxcXFxcXCJXYXJlaG91c2UudHlwZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbmxldCBvcmRlciA9IGdldFZhcihcXFxcXFxcIldhcmVob3VzZS5vcmRlclxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG5sZXQgc29ydCA9IGdldFZhcihcXFxcXFxcIldhcmVob3VzZS5zb3J0XFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbmxldCBnb29kID0gZ2V0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmdvb2RcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG5sZXQgcGFnZSA9IE1ZX1VSTC5zcGxpdChcXFxcXFxcIiNcXFxcXFxcIilbMV0gfHwgMTtcXFxcbmxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuYWxsX3J1bGUgKyBcXFxcXFxcIj9kYXRhX3R5cGU9XFxcXFxcXCIgKyBkYXRhVHlwZSArIFxcXFxcXFwiJnBhZ2U9XFxcXFxcXCIgKyBwYWdlICsgXFxcXFxcXCImbGltaXQ9MjAmb3JkZXI9XFxcXFxcXCIgKyBvcmRlciArIFxcXFxcXFwiJnNvcnQ9XFxcXFxcXCIgKyBzb3J0KyBcXFxcXFxcIiZpc19nb29kPVxcXFxcXFwiICsgZ29vZCkpLnJlc3VsdDtcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UudHlwZVxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5vcmRlclxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5zb3J0XFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLmdvb2RcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UuYmFja1xcXFxcXFwiKTtcXFxcbn0pKTtcXFxcbmxldCBkYXRhID0gW107XFxcXG5pZiAoZ2V0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmJhY2tcXFxcXFxcIikgPT09IFxcXFxcXFwiMVxcXFxcXFwiKSB7XFxcXG4gICAgYmFjaygpO1xcXFxufVxcXFxuZnVuY3Rpb24gdGFiKGFyciwgdHlwZSwgY29udHJhc3QpIHtcXFxcbiAgICBmb3IgKGxldCBpdGVtIG9mIGFycikge1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW1bMV0gPT09IGNvbnRyYXN0ID8gXFxcXFxcXCLigJzigJxcXFxcXFxcIiArIGl0ZW1bMF0gKyBcXFxcXFxcIuKAneKAnVxcXFxcXFwiIDogaXRlbVswXSxcXFxcbiAgICAgICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChrZXksIHR5cGUpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBwdXRWYXIodHlwZSwga2V5KTtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfSwgaXRlbVsxXSwgdHlwZSksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJzY3JvbGxfYnV0dG9uXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImJsYW5rX2Jsb2NrXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn1cXFxcbmlmIChwYWdlID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgIHRhYihbXFxcXG4gICAgICAgIFtcXFxcXFxcIuWFqOmDqFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiXSxcXFxcbiAgICAgICAgW1xcXFxcXFwi5bCP56iL5bqPXFxcXFxcXCIsIFxcXFxcXFwiaG9tZV9ydWxlX3VybFxcXFxcXFwiXSxcXFxcbiAgICAgICAgW1xcXFxcXFwi5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZXFxcXFxcXCIsIFxcXFxcXFwicHVibGlzaFxcXFxcXFwiXSxcXFxcbiAgICAgICAgW1xcXFxcXFwi572R6aG15o+S5Lu2XFxcXFxcXCIsIFxcXFxcXFwianNfdXJsXFxcXFxcXCJdLFxcXFxuICAgICAgICBbXFxcXFxcXCLpnZnmgIHpobXpnaJcXFxcXFxcIiwgXFxcXFxcXCJodG1sXFxcXFxcXCJdLFxcXFxuICAgICAgICBbXFxcXFxcXCLkuLvpophcXFxcXFxcIiwgXFxcXFxcXCJjb25maWdcXFxcXFxcIl1cXFxcbiAgICBdLCBcXFxcXFxcIldhcmVob3VzZS50eXBlXFxcXFxcXCIsIGRhdGFUeXBlKTtcXFxcbiAgICB0YWIoW1xcXFxuICAgICAgICBbXFxcXFxcXCLml7bpl7RcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCJdLFxcXFxuICAgICAgICBbXFxcXFxcXCJJRFxcXFxcXFwiLCBcXFxcXFxcIjFcXFxcXFxcIl0sXFxcXG4gICAgICAgIFtcXFxcXFxcIuWlveivhOW6plxcXFxcXFwiLCBcXFxcXFxcIjJcXFxcXFxcIl0sXFxcXG4gICAgICAgIFtcXFxcXFxcIuW3ruivhOW6plxcXFxcXFwiLCBcXFxcXFxcIjNcXFxcXFxcIl0sXFxcXG4gICAgICAgIFtcXFxcXFxcIuWbnuWkjeaVsFxcXFxcXFwiLCBcXFxcXFxcIjRcXFxcXFxcIl1cXFxcbiAgICBdLCBcXFxcXFxcIldhcmVob3VzZS5vcmRlclxcXFxcXFwiLCBvcmRlcik7XFxcXG4gICAgdGFiKFtcXFxcbiAgICAgICAgW1xcXFxcXFwi5YCS5bqPXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiXSxcXFxcbiAgICAgICAgW1xcXFxcXFwi5q2j5bqPXFxcXFxcXCIsIFxcXFxcXFwiMVxcXFxcXFwiXVxcXFxuICAgIF0sIFxcXFxcXFwiV2FyZWhvdXNlLnNvcnRcXFxcXFxcIiwgc29ydCk7XFxcXG4gICAgdGFiKFtcXFxcbiAgICAgICAgW1xcXFxcXFwi5LiN6K66XFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCJdLFxcXFxuICAgICAgICBbXFxcXFxcXCLkvJjotKhcXFxcXFxcIiwgXFxcXFxcXCIxXFxcXFxcXCJdXFxcXG4gICAgXSwgXFxcXFxcXCJXYXJlaG91c2UuZ29vZFxcXFxcXFwiLCBnb29kKTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLmkJzntKJcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkLnRvU3RyaW5nKG5hbWUgPT4gXFxcXFxcXCJoaWtlcjovL3NlYXJjaD9zPVxcXFxcXFwiICsgaW5wdXQgKyBcXFxcXFxcIiZydWxlPVxcXFxcXFwiICsgbmFtZSwgTVlfUlVMRS50aXRsZSksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgICAgIGRlc2M6IFxcXFxcXFwi5pCc57Si5YWo6YOo6KeE5YiZXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxubGV0IGhvbWVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5ob21lKSk7XFxcXG5sZXQgbVJ1bGVMaXN0ID0gW107XFxcXG5mb3IgKHZhciBpdGVtIG9mIHJ1bGVMaXN0KSB7XFxcXG4gICAgdmFyIG5hbWUgPSBpdGVtLm5hbWU7XFxcXG4gICAgaWYgKGl0ZW0uaXNfdGFwKSB7XFxcXG4gICAgICAgIGxldCBsb2NhdGlvbiA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcXFxcXCJydWxlTGlzdEpzb25cXFxcXFxcIikgKyBcXFxcXFxcIj9pZD1cXFxcXFxcIiArIGl0ZW0uaWQpKTtcXFxcbiAgICAgICAgaXRlbS5pZCA9IGxvY2F0aW9uLmlkO1xcXFxuICAgICAgICBpdGVtLm5hbWUgPSBsb2NhdGlvbi5uYW1lO1xcXFxuICAgICAgICBpdGVtLmF1dGhvciA9IGxvY2F0aW9uLmF1dGhvcjtcXFxcbiAgICAgICAgaXRlbS5kYXRhX3R5cGUgPSBsb2NhdGlvbi5kYXRhX3R5cGU7XFxcXG4gICAgICAgIGl0ZW0udmVyID0gbG9jYXRpb24udmVyXFxcXG4gICAgfVxcXFxuICAgIGl0ZW0udmVyc2lvbiA9IGl0ZW0udmVyO1xcXFxuICAgIGxldCBsYWJlbCA9IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgIGx2ZXIgPSAtMjtcXFxcbiAgICBpZiAoaXRlbS5pc19qc29uICYmIGl0ZW0uZGF0YV90eXBlID09PSBcXFxcXFxcImhvbWVfcnVsZV91cmxcXFxcXFxcIikge1xcXFxuICAgICAgICBsdmVyID0gbG9jYWxSdWxlVmVyKGhvbWVMaXN0LCBpdGVtKTtcXFxcbiAgICAgICAgaWYgKGx2ZXIgPT09IC0xKSB7XFxcXG4gICAgICAgICAgICBsYWJlbCA9IFxcXFxcXFwi8J+GlVxcXFxcXFwiO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKGx2ZXIgPCBpdGVtLnZlcikge1xcXFxuICAgICAgICAgICAgbGFiZWwgPSBcXFxcXFxcIvCfhplcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBtUnVsZUxpc3QucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBsYWJlbCArIG5hbWUsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGx2ZXI6IGx2ZXIsXFxcXG4gICAgICAgICAgICBpZDogaXRlbS5pZCxcXFxcbiAgICAgICAgICAgIGlzQWxsOnRydWVcXFxcbiAgICAgICAgfSxcXFxcbiAgICAgICAgcGljX3VybDogaXRlbS5waWMsXFxcXG4gICAgfSlcXFxcbn1cXFxcbi8qIOW9kuW5tuaOkuW6jyBTdGFydCAqL1xcXFxuLy9tUnVsZUxpc3QgPSBtZXJnZVNvcnQobVJ1bGVMaXN0KTtcXFxcbi8qIOW9kuW5tuaOkuW6jyBFbmQgKi9cXFxcbmRhdGEucHVzaC5hcHBseShkYXRhLCBtUnVsZUxpc3QpXFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5Zue5aSNXFxcIixcXFwicGF0aFxcXCI6XFxcIlJlcGx5XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IGRhdGEgPSBbXTtcXFxcbmNvbnN0IHtcXFxcbiAgICBhcGlcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxubGV0IHtcXFxcbiAgICByZXBseUlkLFxcXFxuICAgIHJ1bGVJZCxcXFxcbiAgICBuYW1lLFxcXFxuICAgIHBhc3N3b3JkLFxcXFxuICAgIHVzZXJuYW1lXFxcXG59ID0gTVlfUEFSQU1TO1xcXFxuXFxcXG5cXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIuWbnuWkjShcXFxcXFxcIiArIG5hbWUgKyBcXFxcXFxcIilcXFxcXFxcIik7XFxcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQudGV4dFxcXFxcXFwiKTtcXFxcbiAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG59KSk7XFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgZGVzYzogXFxcXFxcXCLlm57lpI0uLi4uLi5cXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLmNvbW1lbnQudGV4dCcsICcnKSxcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJ0ZXh0YXJlYVxcXFxcXFwiLFxcXFxuICAgICAgICBoZWlnaHQ6NyxcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC50ZXh0XFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuXFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5o+Q5LqkXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogJChhcGkuZGlzX3JlcGx5ICsgcnVsZUlkKS5sYXp5UnVsZSgocGFzc3dvcmQsIHVzZXJuYW1lLCBydWxlSWQpID0+IHtcXFxcbiAgICAgICAgbGV0IHRleHQgPSBnZXRWYXIoJ1dhcmVob3VzZS5jb21tZW50LnRleHQnLCAnJyk7XFxcXG4gICAgICAgIGlmIChwYXNzd29yZCA9PSBcXFxcXFxcIlxcXFxcXFwiIHx8IHVzZXJuYW1lID09IFxcXFxcXFwiXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5pyq55m75b2V6LSm5Y+3XFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKHRleHQgPT0gXFxcXFxcXCJcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHlhpnllYpcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCwge1xcXFxuICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcImRpc2N1c3NfdGV4dFxcXFxcXFwiOiB0ZXh0LFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInFxXFxcXFxcXCI6IHVzZXJuYW1lLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCI6IHBhc3N3b3JkLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcImRpc2N1c3NfaWRcXFxcXFxcIjogcnVsZUlkXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXFxcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXFxcbiAgICAgICAgICAgIGJhY2soZmFsc2UpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyByZXN1bHQuZGV0YWlsO1xcXFxuXFxcXG4gICAgfSwgcGFzc3dvcmQsIHVzZXJuYW1lLCByZXBseUlkKVxcXFxufSk7XFxcXG5cXFxcbnNldFJlc3VsdChkYXRhKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLmiJHnmoTlm57lpI1cXFwiLFxcXCJwYXRoXFxcIjpcXFwiTXlSZXBseVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmNvbnN0IHtcXFxcbiAgICBhcGlcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxubGV0IHtcXFxcbiAgICBhdXRoX2NvZGUsXFxcXG4gICAgcXFcXFxcbn0gPSBNWV9QQVJBTVM7XFxcXG5sZXQgcGFnZSA9IHBhcnNlSW50KE1ZX1VSTC5zcGxpdChcXFxcXFxcIiNcXFxcXFxcIilbMV0pO1xcXFxubGV0IGRhdGE9W107XFxcXG5sZXQgY29tbWVudExpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmRpc19nZXRfcmVwbHkgKyBcXFxcXFxcIj9saW1pdD01JnBhZ2U9XFxcXFxcXCIgKyBwYWdlICsgXFxcXFxcXCImcXE9XFxcXFxcXCIgKyBxcSArIFxcXFxcXFwiJmF1dGhfY29kZT1cXFxcXFxcIiArIGF1dGhfY29kZSkpLnJlc3VsdDtcXFxcbmlmIChjb21tZW50TGlzdC5sZW5ndGggPT09IDApIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCI8aDUgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz7liKvmi4nkuobkuIDmnaHkuZ/kuI3liankuoY8L2g1PlxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufSBlbHNlIHtcXFxcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNvbW1lbnRMaXN0KSB7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lICsgXFxcXFxcXCImbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0nZ3JheSc+PHNtYWxsPiNcXFxcXFxcIiArIGl0ZW0uaWQgKyBcXFxcXFxcIjwvc21hbGw+PGZvbnQ+XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJhdmF0YXJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgbHZlcjogXFxcXFxcXCLlm57lpI3ov5vlhaXkuI3mlK/mjIHmn6XnnItcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICBpZDogaXRlbS5ydWxlX2lkWzBdXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0uZGlzY3Vzc190ZXh0LFxcXFxuICAgICAgICAgICAgZGVzYzogaXRlbS5jcmVhdGVfZGF0ZSArIFxcXFxcXFwiwrdcXFxcXFxcIitpdGVtLnJ1bGVfaWRbMV0rXFxcXFxcXCLCt1xcXFxcXFwiK1xcXFxcXFwi5byA5Y+R6ICF8J+Xo1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOntcXFxcbiAgICAgICAgICAgICAgICBuYW1lOml0ZW0ubmFtZSxcXFxcbiAgICAgICAgICAgICAgICB0eXBlOlxcXFxcXFwibG9uZ190ZXh0XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdGV4dDppdGVtLmRpc2N1c3NfdGV4dFxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgXFxcXG59XFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcXG5cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLmm7TlpJrliIbkuqtcXFwiLFxcXCJwYXRoXFxcIjpcXFwibW9yZVNoYXJlXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuICAgIGFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKT0+e1xcXFxuICAgICAgICBjbGVhclZhcihcXFxcXFxcImhvdXNlLnVwbG9hZF9jb2RlXFxcXFxcXCIpO1xcXFxuICAgIH0pKTtcXFxcbmNvbnN0IHtjb2xvcixzbWFsbCxhcGksIGdldEZpbGV9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbmxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXFxcbmxldCBwdXRfdXJsID0gYXBpLmhvc3QrJy9oaWtlcnVsZS9kZXYvcHV0JztcXFxcbmlmKCFob3VzZUZpbGUpe1xcXFxuICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcXFxufVxcXFxubGV0IGhvdXNlX2RhdGEgPSBob3VzZUZpbGUoKTtcXFxcbi8vIGxvZyhob3VzZV9kYXRhLnVzZXJuYW1lKyctJytob3VzZV9kYXRhLnBhc3N3b3JkKTtcXFxcbnZhciBjYW51cCA9IGhvdXNlX2RhdGEudXNlcm5hbWUubGVuZ3RoID49IDYgJiYgaG91c2VfZGF0YS5wYXNzd29yZC5sZW5ndGggPiAyO1xcXFxubG9nKCflj6/ku6XkuIrkvKA/JytjYW51cCk7XFxcXG5sZXQgZCA9IFtdO1xcXFxubGV0IGZpbGVfdHlwZSA9IFt7bmFtZTon6Z2Z5oCB5paH5Lu2Jyx2YWx1ZTonaHRtbCd9LHtuYW1lOifnvZHpobXmj5Lku7YnLHZhbHVlOidqc191cmwnfSx7bmFtZTon5Li76aG16YWN572uJyx2YWx1ZTonY29uZmlnJ31dOyAvL+S4iuS8oOexu+Wei1xcXFxubGV0IGZpbGVfcmVkaXJlY3QgPSBbe25hbWU6J+acrOWcsCcsdmFsdWU6J2ZhbHNlJ30se25hbWU6J+ebtOmTvjMwMicsdmFsdWU6J3RydWUnfV07IC8v5piv5ZCm6YeN5a6a5ZCRXFxcXG5sZXQgZmlsZV91YSA9IFt7bmFtZTon55S16ISRJyx2YWx1ZToncGMnfSx7bmFtZTon5omL5py6Jyx2YWx1ZTonbW9iaWxlJ31dO1xcXFxubGV0IGZpbGVfdHlwZV90aXRsZSA9IGZpbGVfdHlwZS5tYXAoKGl0ZW0pID0+IHtcXFxcbiAgICBsZXQgbmFtZSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfdHlwZScsJ+mdmeaAgeaWh+S7ticpO1xcXFxuICAgIGlmKGl0ZW0ubmFtZT09PW5hbWUpe1xcXFxuICAgICAgICByZXR1cm4gJ/CfkYknK2l0ZW0ubmFtZTtcXFxcbiAgICB9ZWxzZXtcXFxcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZTtcXFxcbiAgICB9XFxcXG59KTtcXFxcbmxldCBmaWxlX3JlZGlyZWN0X3RpdGxlID0gZmlsZV9yZWRpcmVjdC5tYXAoKGl0ZW0pID0+IHtcXFxcbiAgICBsZXQgbmFtZSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfcmVkaXJlY3QnLCfmnKzlnLAnKTtcXFxcbiAgICBpZihpdGVtLm5hbWU9PT1uYW1lKXtcXFxcbiAgICAgICAgcmV0dXJuICfwn5GJJytpdGVtLm5hbWU7XFxcXG4gICAgfWVsc2V7XFxcXG4gICAgICAgIHJldHVybiBpdGVtLm5hbWU7XFxcXG4gICAgfVxcXFxufSk7XFxcXG5sZXQgZmlsZV91YV90aXRsZSA9IGZpbGVfdWEubWFwKChpdGVtKSA9PiB7XFxcXG4gICAgbGV0IG5hbWUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJywn55S16ISRJyk7XFxcXG4gICAgaWYoaXRlbS5uYW1lPT09bmFtZSl7XFxcXG4gICAgICAgIHJldHVybiAn8J+RiScraXRlbS5uYW1lO1xcXFxuICAgIH1lbHNle1xcXFxuICAgICAgICByZXR1cm4gaXRlbS5uYW1lO1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuZC5wdXNoKHtjb2xfdHlwZTogJ3g1X3dlYnZpZXdfc2luZ2xlJywgZXh0cmE6IHtqczogJ2NvbnNvbGUubG9nKFxcXFxcXFwi5oiR5Yqg6L295LqGXFxcXFxcXCIpJ319KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfojrflj5YnLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi5paH5Lu26Lev5b6ELOaUr+aMgWhpa2VyLGZpbGUsaHR0cCzkuLvpophcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBvbkNoYW5nZTogXFxcXFxcXCJwdXRWYXIoJ2hvdXNlLndlYl91cmwnLGlucHV0KVxcXFxcXFwiLFxcXFxuICAgICAgICB0aXRsZVZpc2libGU6IHRydWUsXFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTpnZXRWYXIoJ2hvdXNlLndlYl91cmwnKVxcXFxuICAgIH0sXFxcXG4gICAgdXJsOiQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgICAgICBsZXQgaW5wdXQgPSBnZXRWYXIoJ2hvdXNlLndlYl91cmwnLCcnKTtcXFxcbiAgICAgICAgaWYoaW5wdXQubGVuZ3RoPDIpe1xcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mTvuaOpeS4jeWPr+S7peS4uuepuidcXFxcbiAgICAgICAgfSBlbHNlIGlmKC9eaGlrZXI6fF5maWxlOnxeaHR0cDp8Xmh0dHBzOnxeXFxcXFxcXFwvc3RvcmFnZVxcXFxcXFxcL3xeXFxcXFxcXFwvc2RjYXJkXFxcXFxcXFwvLy50ZXN0KGlucHV0KSl7XFxcXG4gICAgICAgICAgICBpZigvXlxcXFxcXFxcL3N0b3JhZ2VcXFxcXFxcXC98XlxcXFxcXFxcL3NkY2FyZFxcXFxcXFxcLy8udGVzdChpbnB1dCkpe1xcXFxuICAgICAgICAgICAgICAgIGlucHV0ID0gJ2ZpbGU6Ly8nK2lucHV0O1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgbG9nKCfmraPluLjpk77mjqU6JytpbnB1dCk7XFxcXG4gICAgICAgICAgICBsZXQgdWEgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJyk9PT0n55S16ISRJz8nTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg4LjAuNDMyNC4xNDYgU2FmYXJpLzUzNy4zNic6J01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA5OyBNSSA2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODkuMC40Mzg5LjkwIE1vYmlsZSBTYWZhcmkvNTM3LjM2JztcXFxcbiAgICAgICAgICAgIGxldCB3ZWJfdXJsX2FyciA9IGlucHV0LnNwbGl0KCc7Jyk7XFxcXG4gICAgICAgICAgICBsZXQgd2ViX3VybCA9IHdlYl91cmxfYXJyWzBdO1xcXFxuICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSB7XFxcXG4gICAgICAgICAgICAgICAgJ1JlZmVyZXInOidodHRwczovL2Jsb2cuY3Nkbi5uZXQnLFxcXFxuICAgICAgICAgICAgICAgICdVc2VyLUFnZW50Jzp1YSxcXFxcbiAgICAgICAgICAgICAgICAnQWNjZXB0JzonYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0LCAqLyo7IHE9MC4wMScsXFxcXG4gICAgICAgICAgICAgICAgJ0FjY2VwdC1MYW5ndWFnZSc6J3poLUNOJyxcXFxcbiAgICAgICAgICAgIH07XFxcXG4gICAgICAgICAgICBpZih3ZWJfdXJsX2Fyci5sZW5ndGg+PTMmJndlYl91cmxfYXJyWzJdLmxlbmd0aD4yKXsgLy/orr7nva7nvJbnoIFcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICdjaGFyc2V0PScrd2ViX3VybF9hcnJbMl0udG9VcHBlckNhc2UoKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7aGVhZGVyczpoZWFkZXJzLHdpdGhIZWFkZXJzOmZhbHNlLHJlZGlyZWN0OmZhbHNlfTtcXFxcbiAgICAgICAgICAgIGlmKHdlYl91cmxfYXJyLmxlbmd0aD49MiYmd2ViX3VybF9hcnJbMV0ubGVuZ3RoPjIpeyAvLyDorr7nva7or7fmsYLmlrnms5VcXFxcbiAgICAgICAgICAgICAgICBwYXJhbXNbJ21ldGhvZCddID0gd2ViX3VybF9hcnJbMV0udG9VcHBlckNhc2UoKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGxvZygn5byA5aeL6I635Y+W5rqQ56CBJyk7XFxcXG4gICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgIC8qXFxcXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFzeW5jKHdlYl91cmwscGFyYW1zLGZ1bmN0aW9uIChrZXksY29kZSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgYmFja19jb2RlID0gY29kZTtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYoYmFja19jb2RlLmxlbmd0aD4yMCl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJyxiYWNrX2NvZGUpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5rqQ56CB5bey6I635Y+WLOW5tumDqOWIhuaPkuWFpeWIsOaWh+acrOWMuuWfnydcXFxcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZSZ6K+v77yM5pys5qyh6I635Y+W5Yiw56m65paH5pys77yM55aR5Ly85L2g5rKh5pyJ5q2k5paH5Lu2ISc7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICAqL1xcXFxuICAgICAgICAgICAgICAgIGxldCBiYWNrX2NvZGUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJyk9PT0n55S16ISRJz9mZXRjaCh3ZWJfdXJsLHBhcmFtcyk6cmVxdWVzdCh3ZWJfdXJsLHBhcmFtcyk7XFxcXG4gICAgICAgICAgICAgICAgaWYoYmFja19jb2RlLmxlbmd0aD4yMCl7XFxcXG4gICAgICAgICAgICAgICAgICAgIHB1dFZhcignaG91c2UudXBsb2FkX2NvZGUnLGJhY2tfY29kZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5rqQ56CB5bey6I635Y+WLOW5tumDqOWIhuaPkuWFpeWIsOaWh+acrOWMuuWfnydcXFxcbiAgICAgICAgICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr++8jOacrOasoeiOt+WPluWIsOepuuaWh+acrO+8jOeWkeS8vOS9oOayoeacieatpOaWh+S7tiEnO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH1jYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/lj5HnlJ/kuobplJnor686XFxcXFxcXFxuJytlLm1lc3NhZ2U7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1lbHNlIGlmKC/kuLvpopjvv6V85YWD57Sg77+lLy50ZXN0KGlucHV0KSl7XFxcXG4gICAgICAgICAgICBsb2coJ+S4u+mimOmTvuaOpScpO1xcXFxuICAgICAgICAgICAgbGV0IHdlYl91cmxfYXJyID0gaW5wdXQuc3BsaXQoJ++/pScpO1xcXFxuICAgICAgICAgICAgbGV0IHdlYl91cmwgPSB3ZWJfdXJsX2Fyclt3ZWJfdXJsX2Fyci5sZW5ndGgtMV07XFxcXG4gICAgICAgICAgICBsZXQgYmFja19jb2RlID0gcGFyc2VQYXN0ZSh3ZWJfdXJsKTtcXFxcbiAgICAgICAgICAgIGlmKGJhY2tfY29kZS5sZW5ndGg+MjApIHtcXFxcbiAgICAgICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJyxiYWNrX2NvZGUpO1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/mupDnoIHlt7Lojrflj5Ys5bm26YOo5YiG5o+S5YWl5Yiw5paH5pys5Yy65Z+fJ1xcXFxuICAgICAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr++8jOacrOasoeiOt+WPlui/lOWbnuS4ujpcXFxcXFxcXG4nK2JhY2tfY29kZTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6Z2e5rOV6ZO+5o6lOlxcXFxcXFxcbicrZ2V0VmFyKCdob3VzZS53ZWJfdXJsJyk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9KSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTon5LiK5Lyg57G75Z6LJyxcXFxcbiAgICBkZXNjOifkuIrkvKDmlofku7bnmoTnsbvlnoss5b2T5YmN5Li6OicrY29sb3IoZ2V0SXRlbSgnaG91c2UuZmlsZV90eXBlJywn6Z2Z5oCB5paH5Lu2JyksJyNmZjcwMDAnKSxcXFxcbiAgICBjb2xfdHlwZTondGV4dF8xJyxcXFxcbiAgICB1cmw6JChmaWxlX3R5cGVfdGl0bGUsMikuc2VsZWN0KCgpID0+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/vvJpcXFxcXFxcIituYW1lO1xcXFxuICAgIHJldHVybiBpbXBvcnRfcnVsZTtcXFxcbn1cXFxcbiQuZXhwb3J0cy5nZW5SdWxlPWdlblJ1bGU7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5YWo5bGA6Kej5p6Q5YWN5ZeFXFxcIixcXFwicGF0aFxcXCI6XFxcImdsb2JhbFBhcnNlXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuZnVuY3Rpb24gZ2V0SGVhZGVycyhwbGF5VXJsKXtcXFxcbiAgICBsZXQgaGVhZGVycyA9IHt9O1xcXFxuICAgIGxldCByZWZlcj1wbGF5VXJsLnNwbGl0KFxcXFxcXFwiLy9cXFxcXFxcIilbMF0rXFxcXFxcXCIvL1xcXFxcXFwiK3BsYXlVcmwuc3BsaXQoXFxcXFxcXCIvL1xcXFxcXFwiKVsxXS5zcGxpdChcXFxcXFxcIi9cXFxcXFxcIilbMF07XFxcXG4gICAgaWYoL2xlY2xvdWRcXFxcXFxcXC5jb218YmlsaXZpZGVvXFxcXFxcXFwuY29tLy50ZXN0KHBsYXlVcmwpKXtcXFxcbiAgICAgICAgaGVhZGVycyA9IHtcXFxcXFxcIlJlZmVyZXJcXFxcXFxcIjogJ2h0dHBzOi8vd3d3LmJpbGliaWxpLmNvbS8nLFxcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOlxcXFxcXFwiTW96aWxsYS81LjBcXFxcXFxcIn1cXFxcbiAgICB9ZWxzZSBpZigvbWd0dlxcXFxcXFxcLmNvbS8udGVzdChwbGF5VXJsKSl7XFxcXG4gICAgICAgIGhlYWRlcnMgPSB7XFxcXFxcXCJSZWZlcmVyXFxcXFxcXCI6IHJlZmVyLFxcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOlxcXFxcXFwiTW96aWxsYS81LjBcXFxcXFxcIn1cXFxcbiAgICB9ZWxzZSBpZigvaXhpZ3VhXFxcXFxcXFwuY29tLy50ZXN0KHBsYXlVcmwpKXtcXFxcbiAgICAgICAgaGVhZGVycyA9IHtcXFxcXFxcIlJlZmVyZXJcXFxcXFxcIjogJ2h0dHBzOi8vd3d3Lml4aWd1YS5jb20vJyxcXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjpcXFxcXFxcIk1vemlsbGEvNS4wXFxcXFxcXCJ9XFxcXG4gICAgfWVsc2V7XFxcXG4gICAgICAgIGhlYWRlcnMgPSB7XFxcXFxcXCJSZWZlcmVyXFxcXFxcXCI6IHJlZmVyLCdVc2VyLUFnZW50JzonRGFydC8yLjEzIChkYXJ0OmlvKSd9XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBoZWFkZXJzXFxcXG4gICAgfVxcXFxuZnVuY3Rpb24gaXNQaWMoc3RyKXtcXFxcbiAgICByZXR1cm4gL1xcXFxcXFxcLihnaWZ8anBnfGpwZWd8cG5nfEdJRnxKUEd8UE5HKSQvLnRlc3Qoc3RyKTtcXFxcbn1cXFxcbmZ1bmN0aW9uIGlzVmlkZW8ocGxheVVybCxyZWNoYW5nZSl7XFxcXG4gICAgLy/ms6jmhI8ucGhw5LiN5Y+v5Lul6KKr5o6S6Zmk5ZCm5YiZ6J6N5YW06Kej5p6Q5LiN5LqGIHwucGhwJFxcXFxuICAgIC8v5aaC5p6c5piv5pKt5pS+5Zyw5Z2A5bCx55u05o6l6L+U5Zue5Zyw5Z2A5Yqg5LiKVUHvvIzkuI3mmK/nmoTor53lsLHov5Tlm55mYWxzZVxcXFxuICAgIHJlY2hhbmdlPXR5cGVvZihyZWNoYW5nZSk9PT1cXFxcXFxcImZ1bmN0aW9uXFxcXFxcXCI/cmVjaGFuZ2U6ZnVuY3Rpb24ocGxheVVybCl7cmV0dXJuIHBsYXlVcmx9O1xcXFxuICAgIGxldCBleGNlcHRXb3JkcyA9ICcuanMkfC5jc3MkfC50cyR8Lmh0bWwkfC5odG0kfC5naWYkfC5qcGckfC5qcGVnJHwucG5nJHwuaWNvJHwuc3ZnJHwudHh0JCcuc3BsaXQoJ3wnKS5tYXAoaXQ9PidcXFxcXFxcXFxcXFxcXFxcJytpdCkuam9pbignfCcpO1xcXFxuICAgIHZhciBleGNlcHRLZXlzID0gbmV3IFJlZ0V4cChleGNlcHRXb3Jkcyk7XFxcXG4gICAgbGV0IGV4Y2VwdFdvcmRzMSA9ICdyZWZlcmVyPXx1cmw9Jy5zcGxpdCgnfCcpLm1hcChpdD0+aXQpLmpvaW4oJ3wnKTtcXFxcbiAgICB2YXIgZXhjZXB0S2V5czEgPSBuZXcgUmVnRXhwKGV4Y2VwdFdvcmRzMSk7XFxcXG4gICAgbGV0IHJlcGxhY2VXb3JkcyA9ICdwbGF5bTN1OHxtM3U4XFxcXFxcXFwudHYnLnNwbGl0KCd8JykubWFwKGl0PT5pdCkuam9pbignfCcpO1xcXFxuICAgIGxldCByZXBsYWNlS2V5cyA9IG5ldyBSZWdFeHAocmVwbGFjZVdvcmRzLCdnJyk7XFxcXG4gICAgbGV0IHZpZGVvV29yZHMgPSBcXFxcXFxcIi5tcDQkfC5tM3U4JHwuZmx2JHwuYXZpJHwuM2dwJHwubXBlZyR8LndtdiR8Lm1vdiR8cm12YnwuZGF0JHwubXAzJHwubTRhJHxxcUJGZG93bmxvYWR8bWltZT12aWRlbyUyRnxtaW1lX3R5cGU9dmlkZW9ffHR5cGU9bTN1OHxwdD1tM3U4XFxcXFxcXCIuc3BsaXQoJ3wnKS5tYXAoKGl0KT0+e1xcXFxuICAgICAgICAvL3R5cGU9bXA0XFxcXG4gICAgICAgIGlmKGl0LnN0YXJ0c1dpdGgoXFxcXFxcXCIuXFxcXFxcXCIpKXtcXFxcbiAgICAgICAgICAgIHJldHVybiAnXFxcXFxcXFxcXFxcXFxcXCcraXRcXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICByZXR1cm4gaXRcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pLmpvaW4oXFxcXFxcXCJ8XFxcXFxcXCIpO1xcXFxuICAgIGxldCB2aWRlb0tleXMgPSBuZXcgUmVnRXhwKHZpZGVvV29yZHMpO1xcXFxuICAgIGxldCBwVXJsPXBsYXlVcmwuc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpWzBdO1xcXFxuICAgIGxldCBwVXJsMj1wbGF5VXJsLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKVswXS5zcGxpdChcXFxcXFxcIiZcXFxcXFxcIilbMF0uc3BsaXQoXFxcXFxcXCI/XFxcXFxcXCIpWzBdO1xcXFxuICAgIGlmKCh2aWRlb0tleXMudGVzdChwVXJsKXx8dmlkZW9LZXlzLnRlc3QocFVybDIpKSYmIWV4Y2VwdEtleXMxLnRlc3QocFVybC5yZXBsYWNlKHBVcmwuc3BsaXQoXFxcXFxcXCI/XFxcXFxcXCIpWzBdLCcnKSkpe1xcXFxuICAgICAgICBsZXQgdGlwcyA9ICfmo4DmtYvliLDnlpHkvLzlpJrlqpLkvZPnmoTlnLDlnYA6JztcXFxcbiAgICAgICAgdHJ5e1xcXFxuICAgICAgICAgICAgbG9nKFxcXFxcXFwianPkuK1cXFxcXFxcIit0aXBzK3BVcmwpO1xcXFxuICAgICAgICAgICAgLy8gbG9nKHBVcmwucmVwbGFjZShwVXJsLnNwbGl0KFxcXFxcXFwiP1xcXFxcXFwiKVswXSwnJykpO1xcXFxuICAgICAgICAgICAgLy8gbG9nKGV4Y2VwdEtleXMxKTtcXFxcbiAgICAgICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBmeV9icmlkZ2VfYXBwLmxvZygneDXkuK0nK3RpcHMrcFVybCk7XFxcXG4gICAgICAgICAgICBmeV9icmlkZ2VfYXBwLmxvZyhcXFxcXFxcIuWIhuWJsumXruWPt+WQjjpcXFxcXFxcIitwVXJsLnJlcGxhY2UocFVybC5zcGxpdChcXFxcXFxcIj9cXFxcXFxcIilbMF0sJycpKTtcXFxcbiAgICAgICAgICAgIC8vIGZ5X2JyaWRnZV9hcHAoZXhjZXB0S2V5czEpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIC8vIGxvZygnMTonKyh2aWRlb0tleXMudGVzdChwVXJsKXx8dmlkZW9LZXlzLnRlc3QocFVybDIpfHx2aWRlb0tleXMudGVzdChwVXJsLnJlcGxhY2UocmVwbGFjZUtleXMsXFxcXFxcXCJcXFxcXFxcIikuc3BsaXQoXFxcXFxcXCImXFxcXFxcXCIpWzBdLnNwbGl0KFxcXFxcXFwiP1xcXFxcXFwiKVswXSkpKTtcXFxcbiAgICAvLyBsb2coJzI6JyshZXhjZXB0S2V5cy50ZXN0KHBVcmwuc3BsaXQoXFxcXFxcXCI/XFxcXFxcXCIpWzBdLnNwbGl0KCcmJylbMF0pKTtcXFxcbiAgICAvLyBsb2coJzM6JyshZXhjZXB0S2V5czEudGVzdChwVXJsLnJlcGxhY2UocFVybC5zcGxpdChcXFxcXFxcIj9cXFxcXFxcIilbMF0sJycpKSk7XFxcXG4gICAgaWYgKCh2aWRlb0tleXMudGVzdChwVXJsKXx8dmlkZW9LZXlzLnRlc3QocFVybDIpfHx2aWRlb0tleXMudGVzdChwVXJsLnJlcGxhY2UocmVwbGFjZUtleXMsXFxcXFxcXCJcXFxcXFxcIikuc3BsaXQoXFxcXFxcXCImXFxcXFxcXCIpWzBdLnNwbGl0KFxcXFxcXFwiP1xcXFxcXFwiKVswXSkgKSYmICFleGNlcHRLZXlzLnRlc3QocFVybC5zcGxpdChcXFxcXFxcIj9cXFxcXFxcIilbMF0uc3BsaXQoJyYnKVswXSkmJiFleGNlcHRLZXlzMS50ZXN0KHBVcmwucmVwbGFjZShwVXJsLnNwbGl0KFxcXFxcXFwiP1xcXFxcXFwiKVswXSwnJykpKSB7XFxcXG4gICAgICAgIGlmKCEoL1VzZXItQWdlbnR8UmVmZXJlckAvLnRlc3QocGxheVVybCkpKXtcXFxcbiAgICAgICAgICAgIGlmKC9sZWNsb3VkXFxcXFxcXFwuY29tfGJpbGl2aWRlby8udGVzdChwbGF5VXJsKSl7XFxcXG4gICAgICAgICAgICAgICAgcGxheVVybCs9XFxcXFxcXCI7e1JlZmVyZXJAaHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tLyYmVXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1lbHNlIGlmKC9peGlndWFcXFxcXFxcXC5jb20vLnRlc3QocGxheVVybCkpe1xcXFxuICAgICAgICAgICAgICAgIHBsYXlVcmwrPVxcXFxcXFwiIy5tcDQ7e1JlZmVyZXJAaHR0cHM6Ly93d3cuaXhpZ3VhLmNvbS8mJlVzZXItQWdlbnRATW96aWxsYS81LjB9XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBlbHNlIGlmKC9tZ3R2XFxcXFxcXFwuY29tfGJ5dGVhbW9uZS8udGVzdChwbGF5VXJsKSl7XFxcXG4gICAgICAgICAgICAgICAgcGxheVVybCs9XFxcXFxcXCI7e1VzZXItQWdlbnRATW96aWxsYS81LjB9XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9ZWxzZSBpZigvcHR3b1xcXFxcXFxcLndrZmlsZVxcXFxcXFxcLmNvbS8udGVzdChwbGF5VXJsKSYmL3VybD0vLnRlc3QocGxheVVybCkpe1xcXFxuICAgICAgICAgICAgICAgIHBsYXlVcmw9cGxheVVybC5zcGxpdChcXFxcXFxcInVybD1cXFxcXFxcIilbMV0rXFxcXFxcXCI7e1JlZmVyZXJAaHR0cHM6Ly9mYW50dWFuLnR2fVxcXFxcXFwiXFxcXG4gICAgICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgICAgICBwbGF5VXJsPXJlY2hhbmdlKHBsYXlVcmwpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgLy8g5aSE55CG5aSn5biI5YWE5LmL57G755qEYXBwXFxcXG4gICAgICAgICAgICAvLyBlbHNle1xcXFxuICAgICAgICAgICAgLy8gICAgIHBsYXlVcmwrPVxcXFxcXFwiO3tVc2VyLUFnZW50QE1vemlsbGEvNS4wfVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgLy8gfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBwbGF5VXJsK1xcXFxcXFwiI2lzVmlkZW89dHJ1ZSNcXFxcXFxcIjtcXFxcbiAgICB9ZWxzZXtcXFxcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcXFxuICAgIH1cXFxcbn1cXFxcbmZ1bmN0aW9uIGNvbVBhcnNlKHBhclN0cixlaixvbmx5YmFjayxodG1sKXtcXFxcbiAgICAvL+WIl+ihqO+8jOagh+mimO+8jOWbvueJh++8jOaPj+i/sO+8jOmTvuaOpe+8jOWGheWuuVxcXFxuICAgIGVqID0gZWp8fGZhbHNlOy8v5pyJ5LqM57qnXFxcXG4gICAgb25seWJhY2s9b25seWJhY2t8fGZhbHNlOy8v5Y+q6L+U5Zue5pWw5o2uXFxcXG4gICAgaHRtbCA9IGh0bWx8fGdldFJlc0NvZGUoKTtcXFxcbiAgICBodG1sID0gdHlwZW9mKGh0bWwpPT09J3N0cmluZyc/aHRtbDpodG1sLmh0bWw7XFxcXG4gICAgcmV0dXJuICQudG9TdHJpbmcoKHBhclN0cixlaixvbmx5YmFjayxodG1sLGlzUGljKT0+e1xcXFxuICAgICAgICBsZXQgdD1wYXJTdHIuc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgZD1bXTtcXFxcbiAgICAgICAgLy8gbGV0IGxpc3Q9cGRmYShnZXRSZXNDb2RlKCksdFswXSk7XFxcXG4gICAgICAgIGxldCBsaXN0PXBkZmEoaHRtbCx0WzBdKTtcXFxcbiAgICAgICAgbGV0IGxhenkgPSAkKCcnKS5sYXp5UnVsZSgoKT0+e1xcXFxuICAgICAgICAgICAgY29uc3Qge2xhenlQYXJzZX0gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9nbG9iYWxQYXJzZT9ydWxlPemBk+mVv+S7k+W6k1BybycpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIGxhenlQYXJzZShpbnB1dClcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGZvcihsZXQgaSBpbiBsaXN0KXtcXFxcbiAgICAgICAgICAgIGxldCBfcGljID0gdFsyXT9wZChsaXN0W2ldLHRbMl0pOicnO1xcXFxuICAgICAgICAgICAgaWYoaXNQaWMoX3BpYykmJiEvQFJlZmVyZXI9Ly50ZXN0KF9waWMpKXtcXFxcbiAgICAgICAgICAgICAgICBfcGljKz0nQFJlZmVyZXI9J1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgbGV0IGl0PXtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTpwZGZoKGxpc3RbaV0sdFsxXSksXFxcXG4gICAgICAgICAgICAgICAgcGljX3VybDpfcGljLFxcXFxuICAgICAgICAgICAgICAgIGRlc2M6cGRmaChsaXN0W2ldLHRbM10pLFxcXFxuICAgICAgICAgICAgICAgIHVybDplaj9wZChsaXN0W2ldLHRbNF0pOnBkKGxpc3RbaV0sdFs0XSkrbGF6eVxcXFxuICAgICAgICAgICAgfTtcXFxcbiAgICAgICAgICAgIGlmKHQubGVuZ3RoPjUpey8v5YaF5a6577yM55So5LqO5pCc57SiXFxcXG4gICAgICAgICAgICAgICAgaXQuY29udGVudD1wZGZoKGxpc3RbaV0sdFs1XSlcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGQucHVzaChpdCk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYob25seWJhY2spe1xcXFxuICAgICAgICAgICAgcmV0dXJuIGRcXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICBzZXRSZXN1bHQoZClcXFxcbiAgICAgICAgfVxcXFxuICAgIH0scGFyU3RyLGVqLG9ubHliYWNrLGh0bWwsaXNQaWMpXFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGxhenlQYXJzZShwbGF5VXJsLG1zLHRtLHJlY2hhbmdlKXtcXFxcbiAgICAvLyBsb2coJ+iwg+eUqOS7k+W6k+WFjeWXheaOouS8oOWPgui2heaXtuS4ujonK21zKTtcXFxcbiAgICB0bSA9IHBhcnNlSW50KHRtKXx8NTAwMDtcXFxcbiAgICBjb25zdCB7aXNWaWRlbyxnZXRIZWFkZXJzfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2dsb2JhbFBhcnNlP3J1bGU96YGT6ZW/5LuT5bqTUHJvJyk7XFxcXG4gICAgbGV0IHJlYWxVcmwgPSBpc1ZpZGVvKHBsYXlVcmwscmVjaGFuZ2UpO1xcXFxuICAgIC8vbG9nKHJlYWxVcmwpO1xcXFxuICAgIGlmKHR5cGVvZihyZWFsVXJsKT09J3N0cmluZycpey8vYm9vbOWAvOWwseaYr+Wksei0pVxcXFxuICAgICAgICB0cnl7XFxcXG4gICAgICAgICAgICBsZXQgcnVybD1yZWFsVXJsLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKVswXS5zcGxpdChcXFxcXFxcIiNcXFxcXFxcIilbMF07XFxcXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXF1ZXN0KHJ1cmwse3RpbWVvdXQ6dG19KSkudXJsXFxcXG4gICAgICAgIH1jYXRjaChlKXtcXFxcbiAgICAgICAgICAgIHJldHVybiByZWFsVXJsXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgLy9yZXR1cm4gcmVhbFVybFxcXFxuICAgIH1cXFxcblxcXFxuICAgIC8vbG9nKFxcXFxcXFwi6K6/6Zeu6LaF5pe2OlxcXFxcXFwiK3RtKTtcXFxcbiAgICBsb2coXFxcXFxcXCLlsJ3or5XpgZPplb/ku5PlupN4NeWFjeWXhTpcXFxcXFxcIitwbGF5VXJsKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIl94NWp4VXJsXFxcXFxcXCIpO1xcXFxuICAgIGxldCBiYWQ9JChcXFxcXFxcIue9kee7nOS4jeS9s+aIluiAheeWkeS8vOWvueaWuee9keermeaMguS6hu+8jOS9oOimgeafpeeci+WFtue9kemhteWQl++8n1xcXFxcXFwiKS5jb25maXJtKChwbGF5VXJsKT0+e1xcXFxuICAgICAgICBsb2coXFxcXFxcXCLnvZHnq5nnnIvotbfmnaXmjILkuoY6XFxcXFxcXCIrcGxheVVybCk7XFxcXG4gICAgICAgIHJldHVybiBwbGF5VXJsXFxcXG4gICAgfSxwbGF5VXJsKTtcXFxcbiAgICB0cnl7XFxcXG4gICAgICAgIC8vIHZhciBiYWNrPXJlcXVlc3QocGxheVVybCx7aGVhZGVyczogZ2V0SGVhZGVycyhwbGF5VXJsKSx0aW1lb3V0OnRtfSk7XFxcXG4gICAgICAgIHZhciBiYWNrPWZldGNoKHBsYXlVcmwsXFxcXG4gICAgICAgICAgICB7aGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6IFBDX1VBXFxcXG4gICAgICAgICAgICAgICAgfX0pO1xcXFxuICAgICAgICBpZighYmFjayl7XFxcXG4gICAgICAgICAgICBsb2coXFxcXFxcXCLnvZHnq5lcXFxcXFxcIitwbGF5VXJsK1xcXFxcXFwi56Gu5a6e5ZWl5Lmf5rKh6L+U5ZueXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIGJhZFxcXFxuICAgICAgICB9ZWxzZSBpZigvI0VYVElORi8udGVzdChiYWNrKSl7XFxcXG4gICAgICAgICAgICAvL2xldCBsY2FjaGU9XFxcXFxcXCIvc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL2NhY2hlL3ZpZGVvLm0zdThcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIC8vd3JpdGVGaWxlKGxjYWNoZSxiYWNrKTtcXFxcbiAgICAgICAgICAgIC8vcmV0dXJuIGxjYWNoZStcXFxcXFxcIiMjXFxcXFxcXCIrcGxheVVybCtcXFxcXFxcIiNpc1ZpZGVvPXRydWUjXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIHBsYXlVcmw9Y2FjaGVNM3U4KHBsYXlVcmwpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIHBsYXlVcmxcXFxcbiAgICAgICAgfWVsc2UgaWYoKCEv6Kem5Y+R5LqG6Ziy55uX6ZO+fOacquaOiOadg3zmjqXlj6PpmLLnm5cvLnRlc3QoYmFjaykpJiYoIS9odHRwfHVybC8udGVzdChiYWNrKSkmJighL21zZ3xjb2RlfGh0bWwvLnRlc3QoYmFjaykpKXtcXFxcbiAgICAgICAgICAgIGxvZyhiYWNrKTtcXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/nlpHkvLzlr7nmlrnmlbDmja7liqDlr4bkuobvvIzlhbfkvZPmlbDmja7nnIvml6Xlv5cnXFxcXG4gICAgICAgIH1cXFxcbiAgICB9Y2F0Y2goZSl7XFxcXG4gICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcXFxuICAgICAgICByZXR1cm4gYmFkXFxcXG4gICAgfVxcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIGJhY2s9SlNPTi5wYXJzZShiYWNrKTtcXFxcbiAgICAgICAgbGV0IHJlYWxVcmw9YmFjay51cmw7XFxcXG4gICAgICAgIGlmKHR5cGVvZihyZWFsVXJsKT09XFxcXFxcXCJ1bmRlZmluZWRcXFxcXFxcInx8IXJlYWxVcmwpe1xcXFxuICAgICAgICAgICAgbG9nKGJhY2spO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/pgZPplb/ku5PlupPop6PmnpDlpLHotKXvvIHov5Tlm57mkq3mlL7lnLDlnYDkuLrnqbpcXFxcXFxcIlxcXFxuICAgICAgICB9IGVsc2UgaWYodHlwZW9mKGlzVmlkZW8ocmVhbFVybCxyZWNoYW5nZSkpPT0nc3RyaW5nJyl7XFxcXG4gICAgICAgICAgICByZXR1cm4gaXNWaWRlbyhyZWFsVXJsLHJlY2hhbmdlKTtcXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICByZXR1cm4gcmVhbFVybCtcXFxcXFxcIiNpc1ZpZGVvPXRydWUjXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgLy9lbHNle1xcXFxuICAgICAgICAvL3JlYWxVcmwrPVxcXFxcXFwiO3tVc2VyLUFnZW50QE1vemlsbGEvNS4wfVxcXFxcXFwiO1xcXFxuICAgICAgICAvLyB9XFxcXG4gICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgIGxvZyhcXFxcXFxcIuajgOa1i+WIsOino+aekOWPo+mdnmpzb27plJnor686XFxcXFxcXCIrZS5tZXNzYWdlKycs5byA5aeLeDXlhY3ll4XmjqInKTtcXFxcbiAgICAgICAgbGV0IG1zID0gcGFyc2VJbnQobXMpfHw1MDAwO1xcXFxuICAgICAgICBsZXQgbWF4X2NvdW50PU1hdGguY2VpbChtcy8yNTApO1xcXFxuICAgICAgICBsb2coXFxcXFxcXCLmnKzmrKHll4XmjqLotoXml7Y6XFxcXFxcXCIrbXMrXFxcXFxcXCLlhbHorqHlvoXmipPljIU6XFxcXFxcXCIrbWF4X2NvdW50K1xcXFxcXFwi5qyhXFxcXFxcXCIpO1xcXFxuICAgICAgICBzaG93TG9hZGluZygn5ZeF5o6i5Lit77yM6Iul5aSx6LSl5bCx6YeN6KOFeDUuLi4nKTtcXFxcbiAgICAgICAgbGV0IF94NSA9ICQudG9TdHJpbmcoKGlzVmlkZW8scmVjaGFuZ2UscGxheVVybCxtYXhfY291bnQsUENfVUEpPT57XFxcXG4gICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgIGlmKHR5cGVvZihmYmEpPT0ndW5kZWZpbmVkJ3x8IWZiYSl7XFxcXG4gICAgICAgICAgICAgICAgICAgIHZhciBmYmEgPSBmeV9icmlkZ2VfYXBwO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YocmVxdWVzdCk9PSd1bmRlZmluZWQnfHwhcmVxdWVzdCl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBldmFsKGZiYS5nZXRJbnRlcm5hbEpzKCkpO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgZmJhLnB1dFZhcihcXFxcXFxcIl94NWp4VXJsXFxcXFxcXCIscGxheVVybCk7XFxcXG4gICAgICAgICAgICAgICAgaWYod2luZG93LmNvdW50ID09IG51bGwpe1xcXFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuY291bnQ9MTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgbGV0IHRleHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXFxcXFxcImJvZHlcXFxcXFxcIikuaW5uZXJUZXh0O1xcXFxuICAgICAgICAgICAgICAgIGlmKC/op6blj5HkuobpmLLnm5fpk7585pyq5o6I5p2DfOaOpeWPo+mYsuebly8udGVzdCh0ZXh0KSYmd2luZG93LmNvdW50PT09MSl7XFxcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcXFxcXCLmo4DmtYvliLDmnInmjojmnYPvvIzlvIDlp4vov4fmjojmnYNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIC8vbG9jYXRpb24ucmVsb2FkKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWY9ZmJhLmdldFZhcihcXFxcXFxcIl94NWp4VXJsXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB3aW5kb3cuY291bnQrKztcXFxcbiAgICAgICAgICAgICAgICAvLyBmYmEubG9nKCdjb3VudDonK3dpbmRvdy5jb3VudCsnLG1heF9jb3VudDonK21heF9jb3VudCk7XFxcXG4gICAgICAgICAgICAgICAgaWYoIHdpbmRvdy5jb3VudCA+PSBtYXhfY291bnQpe1xcXFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXFxcXFwi6LaF6L+HXFxcXFxcXCIrbWF4X2NvdW50KjI1MCtcXFxcXFxcIuavq+enkuacquiOt+WPluWIsOi1hOa6kOWcsOWdgO+8jOi3s+WIsOa6kOe9kemhtSzku6XkuIvmmK/liqDovb3ov4fnmoTlnLDlnYBcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXFxcXFxcXCJib2R5XFxcXFxcXCIpLmlubmVyVGV4dDtcXFxcbiAgICAgICAgICAgICAgICAgICAgLy8gZmJhLmxvZyh0ZXh0KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhKU09OLnN0cmluZ2lmeShfZ2V0VXJscygpKSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYmEuZ2V0VmFyKFxcXFxcXFwiX3g1anhVcmxcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG11dGVNZShlbGVtKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnBhdXNlKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB2YXIgdmlkZW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFxcXFxcInZpZGVvXFxcXFxcXCIpLCBhdWRpb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXFxcXFwiYXVkaW9cXFxcXFxcIiksIHYyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFxcXFxcImVtYmVkXFxcXFxcXCIpLCB2MyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcXFxcXCIjcGxheWVyXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2aWRlb3MsIGZ1bmN0aW9uICh2aWRlbykge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZU1lKHZpZGVvKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cXFxcbiAgICAgICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwoYXVkaW9zLCBmdW5jdGlvbiAoYXVkaW8pIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGVNZShhdWRpbyk7XFxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHYyLCBmdW5jdGlvbiAodikge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZU1lKHYpO1xcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcXFxuICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2MywgZnVuY3Rpb24gKHYpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGVNZSh2KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cXFxcbiAgICAgICAgICAgICAgICB2YXIgdXJscyA9IF9nZXRVcmxzKCk7XFxcXG4gICAgICAgICAgICAgICAgLy8gZmJhLmxvZyhKU09OLnN0cmluZ2lmeSh1cmxzKSk7XFxcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHVybHMpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1PXVybHNbaV07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnl7dT1kZWNvZGVVUklDb21wb25lbnQodSk7fWNhdGNoKGUpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU9dW5lc2NhcGUodSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoL3VybD1odHRwLy50ZXN0KHUpKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gdS5zcGxpdChcXFxcXFxcInVybD1cXFxcXFxcIikuc2xpY2UoLTEpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcXFxcXCJ1cmzliIblibI6XFxcXFxcXCIrdSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZigvdXJsPVxcXFxcXFxcLy8udGVzdCh1KSYmL1xcXFxcXFxcLm0zdTgvLnRlc3QodSkpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3N0ID0gdS5tYXRjaCgvKC4qKVxcXFxcXFxcL1xcXFxcXFxcLyguKj8pXFxcXFxcXFwvLylbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IGhvc3QrdS5zcGxpdChcXFxcXFxcInVybD1cXFxcXFxcIikuc2xpY2UoLTEpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcXFxcXCJ1cmzliIblibI6XFxcXFxcXCIrdSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKC92aWQ9aHR0cC8udGVzdCh1KSl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IHUuc3BsaXQoXFxcXFxcXCJ2aWQ9XFxcXFxcXCIpLnNsaWNlKC0xKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXFxcXFwidmlk5YiG5YmyOlxcXFxcXFwiK3UpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoL3ZpZD1cXFxcXFxcXC8vLnRlc3QodSkmJi9cXFxcXFxcXC5tM3U4Ly50ZXN0KHUpKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdCA9IHUubWF0Y2goLyguKilcXFxcXFxcXC9cXFxcXFxcXC8oLio/KVxcXFxcXFxcLy8pWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBob3N0K3Uuc3BsaXQoXFxcXFxcXCJ2aWQ9XFxcXFxcXCIpLnNsaWNlKC0xKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXFxcXFwidmlk5YiG5YmyOlxcXFxcXFwiK3UpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigvXFxcXFxcXFw/KC4qKT1odHRwLy50ZXN0KHUpJiYvXFxcXFxcXFwubTN1OC8udGVzdCh1KSl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFxcXFxcXFwiaHR0cFxcXFxcXFwiK3Uuc3BsaXQoL1xcXFxcXFxcPyguKik9aHR0cC8pLnNsaWNlKC0xKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXFxcXFwi5YW25LuW5YiG5YmyOlxcXFxcXFwiK3UpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgLy98aW5kZXhcXFxcXFxcXC5tM3U4JFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigvXFxcXFxcXFwvMVxcXFxcXFxcLm0zdTgvLnRlc3QodSkpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdT11LnJlcGxhY2UoLyZmcm9tPS4qfCZuZXh0PS4qfCZqdW1wPS4qLywnJyk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhbFVybCA9IGlzVmlkZW8odSxyZWNoYW5nZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YocmVhbFVybCk9PSdzdHJpbmcnKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXFxcXFwi5LuT5bqTeDXlhY3ll4Xnu5Pmnpw6XFxcXFxcXCIrcmVhbFVybCk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9meV9icmlkZ2VfYXBwLnNldFdlYlVhKFBDX1VBKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbFVybFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH1jYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgICAgIC8vIGZ5X2JyaWRnZV9hcHAubG9nKCd4NeWkp+iMg+WbtOmUmeivrzonK2UubWVzc2FnZSk7XFxcXG4gICAgICAgICAgICAgICAgYWxlcnQoJ3g15aSn6IyD5Zu06ZSZ6K+vOicrZS5tZXNzYWdlKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5oql6ZSZ57uT5p2feDUnXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0saXNWaWRlbyxyZWNoYW5nZSxwbGF5VXJsLG1heF9jb3VudCxQQ19VQSk7XFxcXG4gICAgICAgIGNvbnN0IGxzZz0kLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvbG9jYWxTdG9yYWdlP3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgdXNlV2ViPWxzZy5nZXRJdGVtKFxcXFxcXFwi6YCa5YWNXFxcXFxcXCIsXFxcXFxcXCJYNVxcXFxcXFwiKT09PVxcXFxcXFwiV0VCXFxcXFxcXCI7XFxcXG4gICAgICAgIC8vbG9nKFxcXFxcXFwi5LuT5bqT5L2/55Sod2Vi6YCa5YWN5pu/5LujeDU6XFxcXFxcXCIrdXNlV2ViKTtcXFxcbiAgICAgICAgbGV0IHJ1bGVIZWFkPXVzZVdlYiYmcGFyc2VJbnQoZ2V0QXBwVmVyc2lvbigpKT49MjMzOT9cXFxcXFxcIndlYlJ1bGU6Ly9cXFxcXFxcIjpcXFxcXFxcIng1UnVsZTovL1xcXFxcXFwiO1xcXFxuICAgICAgICBsZXQgeDVVcmwgPSBydWxlSGVhZCtwbGF5VXJsKyAnQCcgK194NTtcXFxcbiAgICAgICAgcmV0dXJuIHg1VXJsXFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiB4NVBhcnNlUHJvKHg1bGlzdCx4NVRpbWVvdXQsaXNWaWRlbyl7XFxcXG4gICAgbGV0IGJwYXRoID0gJ2ZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL3J1bGVzL2R6SG91c2UvaHRtbC/mtbfpmJTll4XmjqLlmaguaHRtbCc7XFxcXG4gICAgbGV0IGJjb2RlID0gZmV0Y2goYnBhdGgpO1xcXFxuICAgIGlmKCFiY29kZXx8IS9meV9icmlkZ2VfYXBwLy50ZXN0KGJjb2RlKSl7XFxcXG4gICAgICAgIGxvZygn5pys5Zyw5pyq5a6J6KOF5ZeF5o6i5Zmo77yM5byA5aeL5a6J6KOFJyk7XFxcXG4gICAgICAgIGNvbnN0IHthcGl9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IGh0bWwgPSBmZXRjaChhcGkuaG9zdCsnL3J1bGVsaXN0Lmpzb24/aWQ9MjA1NScpO1xcXFxuICAgICAgICBpZigv5rW36ZiU6KeG55WMLy50ZXN0KGh0bWwpKXtcXFxcbiAgICAgICAgICAgIHdyaXRlRmlsZShicGF0aCxodG1sKTtcXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUoYnBhdGgsZmV0Y2goJ2h0dHBzOi8vaGpkaG54LmNvZGluZy5uZXQvcC9oaWtlci9kL2RyL2dpdC9yYXcvbWFzdGVyL2h0bWwvZ2V0VmlkZW8uaHRtbCcpKVxcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIHg1VGltZW91dCA9IHBhcnNlSW50KHg1VGltZW91dCl8fDUwMDA7XFxcXG4gICAgbGV0IG1heF9jb3VudD0oeDVUaW1lb3V0LzI1MCk7IC8v5qC55o2u6LaF5pe26Ieq5Yqo6K6h566X5LqG5Y+v5omn6KGM55qE5qyh5pWwXFxcXG4gICAgcHV0VmFyKCd4NUxpc3QnLEpTT04uc3RyaW5naWZ5KHg1bGlzdCkpO1xcXFxuICAgIGxldCBfeDUgPSAkLnRvU3RyaW5nKChpc1ZpZGVvLCBtYXhfY291bnQseDVUaW1lb3V0KSA9PiB7XFxcXG4gICAgICAgIC8v5Yid5aeL5YyWZmJh5ZKMcmVxdXN0XFxcXG4gICAgICAgIGlmICh0eXBlb2YgKGZiYSkgPT0gJ3VuZGVmaW5lZCcgfHwgIWZiYSkge1xcXFxuICAgICAgICAgICAgdmFyIGZiYSA9IGZ5X2JyaWRnZV9hcHA7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJlcXVlc3QpID09ICd1bmRlZmluZWQnIHx8ICFyZXF1ZXN0KSB7XFxcXG4gICAgICAgICAgICAgICAgZXZhbChmYmEuZ2V0SW50ZXJuYWxKcygpKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgZmJhLmxvZyhlLm1lc3NhZ2UpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tXFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBpZiAod2luZG93LmNvdW50ID09IG51bGwpIHtcXFxcbiAgICAgICAgICAgICAgICB3aW5kb3cuY291bnQgPSAxO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgbGV0IHRleHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXFxcXFxcImJvZHlcXFxcXFxcIikuaW5uZXJUZXh0O1xcXFxuICAgICAgICAgICAgaWYoL+inpuWPkeS6humYsuebl+mTvnzmnKrmjojmnYN85o6l5Y+j6Ziy55uXLy50ZXN0KHRleHQpJiZ3aW5kb3cuY291bnQ9PTEpe1xcXFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xcXFxuICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcXFxcXCLmo4DmtYvliLDmnInmjojmnYPvvIzlvIDlp4vov4fmjojmnYNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB3aW5kb3cuY291bnQrKztcXFxcbiAgICAgICAgICAgIC8vIGZiYS5sb2coJ2NvdW50OicgKyB3aW5kb3cuY291bnQgKyAnLG1heF9jb3VudDonICsgbWF4X2NvdW50KTtcXFxcbiAgICAgICAgICAgIGlmICh3aW5kb3cuY291bnQgPj0gbWF4X2NvdW50KSB7XFxcXG4gICAgICAgICAgICAgICAgZmJhLmNsZWFyVmFyKCd4NUxpc3QnKTtcXFxcbiAgICAgICAgICAgICAgICBmYmEuaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgZm1zZyA9ICfpgZPplb/ku5PlupPpgJrlhY3op6PmnpDlpLHotKUs5Y6f5ZugOui2heaXticreDVUaW1lb3V0Kyfmr6vnp5InO1xcXFxuICAgICAgICAgICAgICAgIGZiYS5sb2coZm1zZyk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrZm1zZztcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBmYmEubG9nKGUubWVzc2FnZSk7XFxcXG4gICAgICAgIH1cXFxcblxcXFxuICAgICAgICBmdW5jdGlvbiBtdXRlTWUoZWxlbSkge1xcXFxuICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICBlbGVtLnBhdXNlKCk7XFxcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcblxcXFxuICAgICAgICB2YXIgdmlkZW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFxcXFxcInZpZGVvXFxcXFxcXCIpLCBhdWRpb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXFxcXFwiYXVkaW9cXFxcXFxcIiksXFxcXG4gICAgICAgICAgICB2MiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcXFxcXCJlbWJlZFxcXFxcXFwiKSwgdjMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXFxcXFwiI3BsYXllclxcXFxcXFwiKTtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2aWRlb3MsIGZ1bmN0aW9uICh2aWRlbykge1xcXFxuICAgICAgICAgICAgICAgIG11dGVNZSh2aWRlbyk7XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwoYXVkaW9zLCBmdW5jdGlvbiAoYXVkaW8pIHtcXFxcbiAgICAgICAgICAgICAgICBtdXRlTWUoYXVkaW8pO1xcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHYyLCBmdW5jdGlvbiAodikge1xcXFxuICAgICAgICAgICAgICAgIG11dGVNZSh2KTtcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2MywgZnVuY3Rpb24gKHYpIHtcXFxcbiAgICAgICAgICAgICAgICBtdXRlTWUodik7XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHZhciB1cmxzID0gX2dldFVybHMoKTtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGZvciAobGV0IGkgaW4gdXJscykge1xcXFxuICAgICAgICAgICAgICAgIGxldCB1PXVybHNbaV07XFxcXG4gICAgICAgICAgICAgICAgLy91PWRlY29kZVVSSUNvbXBvbmVudCh1KTtcXFxcbiAgICAgICAgICAgICAgICB0cnl7dT1kZWNvZGVVUklDb21wb25lbnQodSk7fWNhdGNoKGUpe1xcXFxuICAgICAgICAgICAgICAgICAgICB1PXVuZXNjYXBlKHUpO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBpZigvdXJsPWh0dHAvLnRlc3QodSkpe1xcXFxuICAgICAgICAgICAgICAgICAgICB1ID0gdS5zcGxpdChcXFxcXFxcInVybD1cXFxcXFxcIikuc2xpY2UoLTEpWzBdO1xcXFxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKC92aWQ9aHR0cC8udGVzdCh1KSl7XFxcXG4gICAgICAgICAgICAgICAgICAgIHUgPSB1LnNwbGl0KFxcXFxcXFwidmlkPVxcXFxcXFwiKS5zbGljZSgtMSlbMF07XFxcXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoL1xcXFxcXFxcPyguKik9aHR0cC8udGVzdCh1KSl7XFxcXG4gICAgICAgICAgICAgICAgICAgIHUgPSBcXFxcXFxcImh0dHBcXFxcXFxcIit1LnNwbGl0KC9cXFxcXFxcXD8oLiopPWh0dHAvKS5zbGljZSgtMSlbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgIC8vZmJhLmxvZyhcXFxcXFxcIuWFtuS7luWIhuWJsjpcXFxcXFxcIit1KTtcXFxcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZigvXFxcXFxcXFwvMVxcXFxcXFxcLm0zdTgkLy50ZXN0KHUpKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIHU9dS5yZXBsYWNlKC8mZnJvbT0uKnwmbmV4dD0uKnwmanVtcD0uKi8sJycpO1xcXFxuICAgICAgICAgICAgICAgIGxldCByZWFsVXJsID0gaXNWaWRlbyh1KTtcXFxcbiAgICAgICAgICAgICAgICBpZiAocmVhbFVybCkge1xcXFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXFxcXFwi5LuT5bqTeDXlhY3ll4Xnu5Pmnpw6XFxcXFxcXCIgKyByZWFsVXJsKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgZmJhLmNsZWFyVmFyKCd4NUxpc3QnKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxVcmxcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKVxcXFxuICAgICAgICB9XFxcXG4gICAgfSwgaXNWaWRlbywgbWF4X2NvdW50LHg1VGltZW91dCk7XFxcXG4gICAgY29uc3QgbHNnPSQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9sb2NhbFN0b3JhZ2U/cnVsZT3pgZPplb/ku5PlupNQcm9cXFxcXFxcIik7XFxcXG4gICAgbGV0IHVzZVdlYj1sc2cuZ2V0SXRlbShcXFxcXFxcIumAmuWFjVxcXFxcXFwiLFxcXFxcXFwiWDVcXFxcXFxcIik9PT1cXFxcXFxcIldFQlxcXFxcXFwiO1xcXFxuICAgIC8vbG9nKFxcXFxcXFwi5LuT5bqT5L2/55Sod2Vi6YCa5YWN5pu/5LujeDU6XFxcXFxcXCIrdXNlV2ViKTtcXFxcbiAgICBsZXQgcnVsZUhlYWQ9dXNlV2ViJiZwYXJzZUludChnZXRBcHBWZXJzaW9uKCkpPj0yMzM5P1xcXFxcXFwid2ViUnVsZTovL1xcXFxcXFwiOlxcXFxcXFwieDVSdWxlOi8vXFxcXFxcXCI7XFxcXG4gICAgcmV0dXJuIHJ1bGVIZWFkK2JwYXRoKydAJyArIF94NTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gTGF6eVBhcnNlRmFzdChwbGF5VXJsTGlzdCxnZXRUaW1lb3V0LHg1VGltZW91dCl7XFxcXG4gICAgY29uc3Qge2lzVmlkZW8sZ2V0SGVhZGVycyx4NVBhcnNlUHJvfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2dsb2JhbFBhcnNlP3J1bGU96YGT6ZW/5LuT5bqTUHJvJyk7XFxcXG4gICAgLy8gbG9nKCflvIDlp4vmiafooYwnK3BsYXlVcmxMaXN0Lmxlbmd0aCsn5Liq5Zyw5Z2A55qE5om56YeP5ZeF5o6iOicrcGxheVVybExpc3QpO1xcXFxuICAgIGxvZygn5byA5aeL5omn6KGMJytwbGF5VXJsTGlzdC5sZW5ndGgrJ+S4quWcsOWdgOeahOaJuemHj+WXheaOoicpO1xcXFxuICAgIGxldCBwbGF5VXJscyA9IHBsYXlVcmxMaXN0Lm1hcCgoaXQpPT57XFxcXG4gICAgICAgIHJldHVybiB7XFxcXG4gICAgICAgICAgICB1cmw6aXQuc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpWzBdLFxcXFxuICAgICAgICAgICAgb3B0aW9uczoge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgLy9cXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjogXFxcXFxcXCJEYXJ0LzIuMTMgKGRhcnQ6aW8pXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOlxcXFxcXFwiTW96aWxsYS81LjBcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgdGltZW91dDogZ2V0VGltZW91dFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgbGV0IGJodG1sID0gYmF0Y2hGZXRjaChwbGF5VXJscyk7XFxcXG4gICAgbGV0IHZpZGVvcyA9IFtdO1xcXFxuICAgIGxldCB4NWxpc3QgPSBbXTtcXFxcbiAgICBmb3IobGV0IGkgaW4gYmh0bWwpe1xcXFxuICAgICAgICBsZXQgb3JkZXIgPSBwYXJzZUludChpKSsxO1xcXFxuICAgICAgICBsZXQgdG5hbWU9b3JkZXIrJ+WPt+ino+aekOe9keWdgDonO1xcXFxuICAgICAgICAvL2xvZyh0bmFtZSk7XFxcXG4gICAgICAgIGxldCB0dXJsPXBsYXlVcmxMaXN0W2ldLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKVswXTtcXFxcbiAgICAgICAgbGV0IGpuYW1lPXBsYXlVcmxMaXN0W2ldLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKS5sZW5ndGg+MT9wbGF5VXJsTGlzdFtpXS5zcGxpdChcXFxcXFxcIjtcXFxcXFxcIilbMV06XFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgdG5hbWUrPWpuYW1lO1xcXFxuICAgICAgICBsZXQgYmFja2NvZGUgPSBiaHRtbFtpXTtcXFxcbiAgICAgICAgaWYoKCEvdXJsfGh0dHAvLnRlc3QoYmFja2NvZGUpKSYmKCEvI0VYVElORi8udGVzdChiYWNrY29kZSkpKXtcXFxcbiAgICAgICAgICAgIGxvZyh0bmFtZSt0dXJsKyfmnInpl67popgs5Y+v6IO95Yqg5a+G5oiW6ICF5oyC5LqGJyk7XFxcXG4gICAgICAgICAgICBjb250aW51ZTtcXFxcbiAgICAgICAgfWVsc2UgaWYoLyNFWFRJTkYvLnRlc3QoYmFja2NvZGUpKXtcXFxcbiAgICAgICAgICAgIC8vbGV0IGxjYWNoZT1cXFxcXFxcIi9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvY2FjaGUvdmlkZW9fXFxcXFxcXCIrdG5hbWUrXFxcXFxcXCIubTN1OFxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgLy93cml0ZUZpbGUobGNhY2hlLGJhY2tjb2RlKTtcXFxcbiAgICAgICAgICAgIC8vdmlkZW9zLnB1c2gobGNhY2hlKTtcXFxcbiAgICAgICAgICAgIGxldCBwVXJsPWNhY2hlTTN1OCh0dXJsKTtcXFxcbiAgICAgICAgICAgIHZpZGVvcy5wdXNoKHBVcmwpO1xcXFxuICAgICAgICAgICAgY29udGludWU7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCB1cmwgPSBKU09OLnBhcnNlKGJhY2tjb2RlKS51cmw7XFxcXG4gICAgICAgICAgICBpZigvXmh0dHAvLnRlc3QodXJsKSl7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJlYWxWaWRlbyA9IGlzVmlkZW8odXJsKTtcXFxcbiAgICAgICAgICAgICAgICBpZih0eXBlb2YocmVhbFZpZGVvKT09J3N0cmluZycpe1xcXFxuICAgICAgICAgICAgICAgICAgICBsb2codG5hbWUrJ+W3suino+aekOWHuuinhumikTonK3JlYWxWaWRlbyk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmKGpuYW1lKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxWaWRlbys9XFxcXFxcXCLimIVcXFxcXFxcIitqbmFtZVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvcy5wdXNoKHJlYWxWaWRlbyk7XFxcXG4gICAgICAgICAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxvZyh0bmFtZSsn6Kej5p6Q5Ye65LiN55+l6YGT5LuA5LmI5Lic6KW/OicrdXJsKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsKz1cXFxcXFxcIiNpc1ZpZGVvPXRydWUjXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmKGpuYW1lKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybCs9XFxcXFxcXCLimIVcXFxcXFxcIitqbmFtZVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvcy5wdXNoKHVybCk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICAgICAgbG9nKHRuYW1lKyfkuLpqc29u5o6l5Y+j5LiU5peg6L+U5Zue6KeG6aKR5Zyw5Z2A5pWw5o2uOicrcGxheVVybExpc3RbaV0rJ1xcXFxcXFxcbicrYmFja2NvZGUpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIGxvZyh0bmFtZSsn5Li6eDXmjqXlj6Ms5Yqg5YWleDXll4XmjqLliJfooagnKTtcXFxcbiAgICAgICAgICAgIHg1bGlzdC5wdXNoKHBsYXlVcmxMaXN0W2ldKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICAvLyBsb2codmlkZW9zKTtcXFxcbiAgICBpZih2aWRlb3MubGVuZ3RoPjApe1xcXFxuICAgICAgICBpZihnZXRWYXIoJ2RwLmNhY2hlVmlkZW8nLCd0cnVlJyk9PT0ndHJ1ZScmJnBhcnNlSW50KGdldEFwcFZlcnNpb24oKSk+PTIyNTUpXFxcXG4gICAgICAgIHtcXFxcbiAgICAgICAgICAgIGxvZyhcXFxcXFxcIuWwiuaVrOeahOmtlOaWreeUqOaIt++8jOinhumikee8k+WtmOW3suWQr+eUqO+8jOivt+WwveaDheS6q+WPl+eci+WJp+aXtuWFiVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGxldCB2aWRlb3NDYWNoZT12aWRlb3MubWFwKChpdCk9PntcXFxcbiAgICAgICAgICAgICAgICBsZXQgaGVhZGVycz17fTtcXFxcbiAgICAgICAgICAgICAgICBpZihpdC5zcGxpdChcXFxcXFxcIjtcXFxcXFxcIikubGVuZ3RoPjEpe1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgaGVhZCA9IGl0LnNwbGl0KCc7JylbMV07XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmKC9ALy50ZXN0KGhlYWQpJiYve3x9Ly50ZXN0KGhlYWQpKXtcXFxcbi8vaGVhZCA9IGhlYWQucmVwbGFjZSgve3x9L2csJycpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCA9IGhlYWQuc3BsaXQoXFxcXFxcXCJ7XFxcXFxcXCIpWzFdLnNwbGl0KFxcXFxcXFwifVxcXFxcXFwiKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQgPSBoZWFkLnNwbGl0KCcmJicpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIGhlYWQpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSBoZWFkW2ldLnNwbGl0KCdAJylbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID1oZWFkW2ldLnNwbGl0KCdAJylbMV0ucmVwbGFjZSgvOy8sJ++8m++8mycpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IHZhbHVlO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIHJldHVybiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHVybDppdC5zcGxpdChcXFxcXFxcIjtcXFxcXFxcIilbMF0uc3BsaXQoXFxcXFxcXCLimIVcXFxcXFxcIilbMF0sXFxcXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6e1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczpoZWFkZXJzXFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIHZhciBkYXRhPWJhdGNoQ2FjaGVNM3U4KHZpZGVvc0NhY2hlKTtcXFxcbiAgICAgICAgICAgIGRhdGE9ZGF0YS5tYXAoKGl0LGlkKT0+e1xcXFxuICAgICAgICAgICAgICAgIGxldCBleHRyYT1cXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIGlmKHZpZGVvc1tpZF0uc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpLmxlbmd0aD4xKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE9XFxcXFxcXCI7XFxcXFxcXCIrdmlkZW9zW2lkXS5zcGxpdChcXFxcXFxcIjtcXFxcXFxcIilbMV07XFxcXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYodmlkZW9zW2lkXS5zcGxpdChcXFxcXFxcIuKYhVxcXFxcXFwiKS5sZW5ndGg+MSl7XFxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhPVxcXFxcXFwi4piFXFxcXFxcXCIrdmlkZW9zW2lkXS5zcGxpdChcXFxcXFxcIuKYhVxcXFxcXFwiKVsxXTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgICAgICAgICBpZihpdCtcXFxcXFxcIlxcXFxcXFwiIT1cXFxcXFxcIm51bGxcXFxcXFxcIil7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCtleHRyYVxcXFxuICAgICAgICAgICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlkZW9zW2lkXVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgLy9sb2coZGF0YSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gZGF0YVxcXFxuICAgICAgICAgICAgLy9yZXR1cm4gdmlkZW9zXFxcXG4gICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgcmV0dXJuIHZpZGVvc1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIGxvZygn5YWx5pyJJyt4NWxpc3QubGVuZ3RoKyfkuKp4NeWcsOWdgOi/m+ihjOi9rua1geWXheaOoicpO1xcXFxuICAgIC8v5rKh5pyJ55qE6K+d5bCx5byA5aeL5L6d5qyheDXll4XmjqJcXFxcbiAgICBzaG93TG9hZGluZygn5ZeF5o6i5Lit77yM6Iul5aSx6LSl5bCx5YiH5o2id2Vi5ZeF5o6iLi4uJyk7XFxcXG4gICAgcmV0dXJuIHg1UGFyc2VQcm8oeDVsaXN0LHg1VGltZW91dCxpc1ZpZGVvKTtcXFxcbn1cXFxcbnZhciBsYXp5PSQoJycpLmxhenlSdWxlKCgpPT57XFxcXG4gICAgdHJ5e1xcXFxuICAgICAgICByZWFsVXJsPWlucHV0O1xcXFxuICAgICAgICBldmFsKFxcXFxcXFwidmFyIGNvbmZpZ19kcCA9XFxcXFxcXCIgKyBmZXRjaChcXFxcXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvTXlQYXJzZVNldC5qc29uXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgZXZhbChmZXRjaChjb25maWdfZHAuY2opKTtcXFxcbiAgICAgICAgbG9nKGlucHV0KyctPuato+WcqOaWreaPkumtlOaUueeJiOino+aekC4uLicpO1xcXFxuICAgICAgICAvLyDliqDlhaXotoXml7borr7nva7vvIzlu7rorq7lnKjpppbpobXorr7nva5cXFxcbiAgICAgICAgcmV0dXJuIGF5dG1QYXJzZShyZWFsVXJsKVxcXFxuICAgIH1jYXRjaChlKXtcXFxcbiAgICAgICAgcmV0dXJuIGlucHV0XFxcXG4gICAgfVxcXFxufSk7XFxcXG4kLmV4cG9ydHMuaXNQaWM9aXNQaWM7XFxcXG4kLmV4cG9ydHMuaXNWaWRlbz1pc1ZpZGVvO1xcXFxuJC5leHBvcnRzLmNvbVBhcnNlPWNvbVBhcnNlO1xcXFxuJC5leHBvcnRzLmdldEhlYWRlcnM9Z2V0SGVhZGVycztcXFxcbiQuZXhwb3J0cy5sYXp5UGFyc2U9bGF6eVBhcnNlO1xcXFxuJC5leHBvcnRzLng1UGFyc2VQcm89eDVQYXJzZVBybztcXFxcbiQuZXhwb3J0cy5MYXp5UGFyc2VGYXN0PUxhenlQYXJzZUZhc3Q7XFxcXG4kLmV4cG9ydHMubGF6eT1sYXp5O1xcXCJ9LHtcXFwibmFtZVxcXCI6XFxcIuS7u+WKoeS7k+W6k+aOpeWPo1xcXCIsXFxcInBhdGhcXFwiOlxcXCJ0YXNrQ2FsbFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcblN0cmluZy5wcm90b3R5cGUuc3RyaXAgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnJlcGxhY2UoLyheXFxcXFxcXFxzKil8KFxcXFxcXFxccyokKS9nLCBcXFxcXFxcIlxcXFxcXFwiKTsgfTtcXFxcbmZ1bmN0aW9uIHRhc2tfcmVxKHRhc2tfYXBpLHRhc2spIHsgLy8g6YCa55So5Y+R6YCB5LuT5bqTcG9zdOiwg+eUqOS7u+WKoeivt+axglxcXFxuICAgIGNvbnN0IHtnZXRGaWxlfSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFxcXFxcIik7XFxcXG4gICAgbGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcXFxuICAgIGlmKCFob3VzZUZpbGUpe1xcXFxuICAgICAgICBzZXRJdGVtKCdpc19ob3VzZV92aXAnLCAnZmFsc2UnKTtcXFxcbiAgICB9XFxcXG4gICAgbGV0IGhvdXNlX2RhdGEgPSBob3VzZUZpbGUoKTtcXFxcbiAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdCh0YXNrX2FwaSwge1xcXFxuICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxcXG4gICAgICAgIH0sXFxcXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6IHtcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcImRhdGFcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInR5cGVcXFxcXFxcIjogdGFzay5tb2RlfHwncnVuJyxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJmdW5jXFxcXFxcXCI6IHRhc2suZnVuY3x8JycsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6IHRhc2sucGFyYW1zfHxbXVxcXFxuICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJhdXRoXFxcXFxcXCI6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJuYW1lXFxcXFxcXCI6IGhvdXNlX2RhdGEudXNlcm5hbWV8fFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIjogaG91c2VfZGF0YS5wYXNzd29yZHx8XFxcXFxcXCJcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnXFxcXG4gICAgfSk7XFxcXG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHRhc2tfdXBsb2FkKHRhc2speyAvLyDpgJrnlKjku7vliqHlj5HluIPmlrDlop7lj4rkv67mlLnlip/og71cXFxcbiAgICBjb25zdCB7YXBpLGdldEZpbGV9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXFxcXFwiKTtcXFxcbiAgICBsZXQgaG91c2VGaWxlID0gZ2V0RmlsZXx8ZmFsc2U7XFxcXG4gICAgaWYoIWhvdXNlRmlsZSl7XFxcXG4gICAgICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgYXBpX3VybCA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvdGFzay9hZGQnO1xcXFxuICAgIGxldCBob3VzZV9kYXRhID0gaG91c2VGaWxlKCk7XFxcXG4gICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoYXBpX3VybCwge1xcXFxuICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxcXG4gICAgICAgIH0sXFxcXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6IHtcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcImRhdGFcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogdGFzay5uYW1lLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInB5Y29kZVxcXFxcXFwiOiB0YXNrLnB5Y29kZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJub3RlXFxcXFxcXCI6IHRhc2subm90ZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJ0ZXN0X2NvZGVcXFxcXFxcIjogdGFzay50ZXN0X2NvZGUsXFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcImF1dGhcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogaG91c2VfZGF0YS51c2VybmFtZXx8XFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiOiBob3VzZV9kYXRhLnBhc3N3b3JkfHxcXFxcXFxcIlxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCdcXFxcbiAgICB9KTtcXFxcbiAgICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gdGFza19jYWxsKGlkLGZ1bmMscGFyYW1zKXtcXFxcbiAgICBjb25zdCB7YXBpfSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFxcXFxcIik7XFxcXG4gICAgbGV0IHRhc2tfYXBpID0gYXBpLmhvc3QrJy9oaWtlcnVsZS90YXNrL3J1bi8nK2lkO1xcXFxuICAgIGxldCB0YXNrID0ge1xcXFxuICAgICAgICBtb2RlOidjYWxsJyxcXFxcbiAgICAgICAgZnVuYzpmdW5jLFxcXFxuICAgICAgICBwYXJhbXM6cGFyYW1zfHxbXVxcXFxuICAgIH07XFxcXG4gICAgcmV0dXJuIHRhc2tfcmVxKHRhc2tfYXBpLHRhc2spO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiB0YXNrX3JlbmFtZShpZCxuZXdfdGFza19uYW1lKXtcXFxcbiAgICBjb25zdCB7YXBpLGdldEZpbGV9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXFxcXFwiKTtcXFxcbiAgICBsZXQgaG91c2VGaWxlID0gZ2V0RmlsZXx8ZmFsc2U7XFxcXG4gICAgaWYoIWhvdXNlRmlsZSl7XFxcXG4gICAgICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcXFxuICAgIGxldCB0YXNrX2FwaSA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvdGFzay9yZW5hbWUvJytpZDtcXFxcbiAgICB0YXNrX2FwaSA9IHRhc2tfYXBpKyc/bmFtZT0nK2hvdXNlX2RhdGEudXNlcm5hbWUrJyZwYXNzd29yZD0nK2hvdXNlX2RhdGEucGFzc3dvcmQrJyZ0YXNrX25hbWU9JytuZXdfdGFza19uYW1lO1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKGZldGNoKHRhc2tfYXBpLHt9KSk7XFxcXG4gICAgICAgIGlmKHJlc3VsdC5zdGF0dXM9PTApe1xcXFxuICAgICAgICAgICAgcmV0dXJuICByZXN1bHQuZGV0YWlsXFxcXG4gICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQrJycrcmVzdWx0LmRldGFpbFxcXFxuICAgICAgICB9XFxcXG4gICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcXFxuICAgICAgICByZXR1cm4gJycrZS5tZXNzYWdlXFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiB0YXNrX2NoYW5nZV9zdGF0ZShpZCl7XFxcXG4gICAgY29uc3Qge2FwaSxnZXRGaWxlfSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFxcXFxcIik7XFxcXG4gICAgbGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcXFxuICAgIGlmKCFob3VzZUZpbGUpe1xcXFxuICAgICAgICBzZXRJdGVtKCdpc19ob3VzZV92aXAnLCAnZmFsc2UnKTtcXFxcbiAgICB9XFxcXG4gICAgbGV0IGhvdXNlX2RhdGEgPSBob3VzZUZpbGUoKTtcXFxcbiAgICBsZXQgdGFza19hcGkgPSBhcGkuaG9zdCsnL2hpa2VydWxlL3Rhc2svY2hhbmdlX3N0YXRlLycraWQ7XFxcXG4gICAgdGFza19hcGkgPSB0YXNrX2FwaSsnP25hbWU9Jytob3VzZV9kYXRhLnVzZXJuYW1lKycmcGFzc3dvcmQ9Jytob3VzZV9kYXRhLnBhc3N3b3JkO1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKGZldGNoKHRhc2tfYXBpLHt9KSk7XFxcXG4gICAgICAgIGlmKHJlc3VsdC5zdGF0dXM9PTApe1xcXFxuICAgICAgICAgICAgcmV0dXJuICByZXN1bHQuZGV0YWlsXFxcXG4gICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQrJycrcmVzdWx0LmRldGFpbFxcXFxuICAgICAgICB9XFxcXG4gICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcXFxuICAgICAgICByZXR1cm4gJycrZS5tZXNzYWdlXFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiB0YXNrX3J1bihpZCl7XFxcXG4gICAgY29uc3Qge2FwaX0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcXFxcXCIpO1xcXFxuICAgIGxldCB0YXNrX2FwaSA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvdGFzay9ydW4vJytpZDtcXFxcbiAgICBsZXQgdGFzayA9IHt9O1xcXFxuICAgIHJldHVybiB0YXNrX3JlcSh0YXNrX2FwaSx0YXNrKTtcXFxcbn1cXFxcblxcXFxuJC5leHBvcnRzLnRhc2tDYWxsID0gdGFza19jYWxsO1xcXFxuJC5leHBvcnRzLnRhc2tSdW4gPSB0YXNrX3J1bjtcXFxcbiQuZXhwb3J0cy50YXNrUmVxID0gdGFza19yZXE7XFxcXG4kLmV4cG9ydHMudGFza1VwbG9hZCA9IHRhc2tfdXBsb2FkO1xcXFxuJC5leHBvcnRzLnRhc2tSZW5hbWUgPSB0YXNrX3JlbmFtZTtcXFxcbiQuZXhwb3J0cy50YXNrQ2hhbmdlU3RhdGUgPSB0YXNrX2NoYW5nZV9zdGF0ZTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlhajlsYDlgqjlrZhcXFwiLFxcXCJwYXRoXFxcIjpcXFwibG9jYWxTdG9yYWdlXFxcIixcXFwicnVsZVxcXCI6XFxcImxldCBsb2NhbFN0b3JhZ2UgPSAoZnVuY3Rpb24oKSB7XFxcXG4gICAgZXZhbFByaXZhdGVKUyhcXFxcXFxcImp3VUt3TlRpUEdjV1NMQ1hCNVh0QVh3YjZMUWJWeUhEKzBYSjdsMDdjZTA9XFxcXFxcXCIpO1xcXFxuICAgIC8vcGF0aHRvPXVuZGVmaW5lZDtcXFxcbiAgICBldmFsUHJpdmF0ZUpTKFxcXFxcXFwiNEMwWXhSWW5HQ1lrZ0ZSWHRwbC9DejV6TDVoaDRqQ0N6dGIrbmcrV29reW1ROG9VcnpTOWxBOHl4QzVhRmFkblNFbXlIS01icmFmbFJxWENuTlJIRGxrNnVlOHlIVE8xNmxCUHJwd2dzNWpmMFBockF0b1RKSUUwWkhuOW1LYVE0SmQyZXJxYjRJNTViZVdJZXVnS3NEczIxMVN6SU5RNXlKZ1NoMWRWdU56enhSR0pnNDBGbVR1Vm1YVmZOMXhnMldJR0hCRW1rVm5HeG1PUmhQT05BK1E1VndQbWRwNDEvaHplM2VJc1V2aG83VkNCZ0s0cmFKbVBhbElSQkJWbENWZ244RmtXbWZLcVpvK1ZXK29CY0g3aHJjcnNTbENTakJhbmdULzdzeVdIeEtZaGVoVTBrYU1Zam5XRmcxRW0wY21OUnRvbUNzSHoxQjhxMzJPZVFIb2F3ZFd4ektPYU1IT1hEQmpSb2pBOEUvYWgwV1JPeXppcVJTeGwvbThkaEJkMGY5cGhZei81U1UvekpENTJYLzlFQzE2V1ZWZHBTVzMzYWtSSFJzbFBwUmxUV0Y5K0F5Um1SdzBlWk9FczFvOVFNUEFRVWZBeGJZeUZIZ3p0dy9PMmRKUnBIeVRtaUJpYWFxVGNpdng2djl6eXZCejA0d0kxQWFTQ3VpK2RUdVUzbHU1eGRFdDNBanQ2WjNpRFhPVmNFUDBFREY3NDc0UFFVNkpFWnV3ZTk3U2NoNGJpMXdCMVhIWlNmSXRkbFlZb0dlZDNMTHBibURBSVJjaXYwckFvcDhWbVFjVHQySzNMZmgxUkRZWTBZdHZSY0g0OU92cERSSC94YTVGYzhNWTNEckZvQTdxY29GNGVDZ2lWQmZCZ0pSNjgrTHBRSzd0T2tnOGs5ZWMrM05TeEpUaGNsOGQ2eU53eFQ5VGsxN3plSmdkNk1veVlaSXBXUUxsRjZZdmJPZEVXaGptbkE3OHdDMGhXeitYbTZoUU1TcXRGdytiaEZmN2NCR1UzYWF0UEZtZENZMkVkWGZoMElZVzg1d2RPeU1maXdXNy92VlRwOWlFMDBJM0YwOXdHSGtHS2hWYkx1ZUFrWWU3enpKWFI3dGhhRm9yNkg3cUxtSmpiUlFrOWV2TnRCUVhOUjdEaWZpWHVRZjJsdDduT0g4MFNXbTFmREhIemptUHNOSXBzMlRYR1QraXdWVjY5Zy90V2lwVlE2RDhCVHgrY0NRcDQ3bm1USXJZK3FONGtoMkZZaDVMbHdYZGdJeXkxVkl1QzN4MDUzZXdBSUlVbWxZOW5pRXBxWXQrMWZGUFhPQ3RDR3RZYlNkMzd2VlIxRU9qMms1R3UvKzlKV2cycXZ3bDF0d2VsZzFKMHR4YXJJaTRrVGJUcnZybkZMTjkycG9mcFpRVWZvV280Y2U3SFdOZGJ1NEpLRXJhTFFVZmRmR0VQZDFUSXVmdXVSVmEzOWVxOUdaeVNEdUJMNjBNUGRsZHhLdzF6bytmQjVaWStZTWozTEwyZ0d0RGJzOTgrQXNSVjlMSldtVW1zeDkxaG1KdEZVTVdEM3huajhITVpXczBOUGxDRlVyOTQ4NUtxVHBvNWtSekdmRitrL05sMkp6cnY1Y3ZrcXRVbkxnS3BYRU9qL3NlL29Eek9BclFLSTVUTlVidll3Y3djZGpqTVNmaks2OEtyd2hzK242U21XWjRaZGdSSGdBSzVNb0ZpM1htTFY0N1AzdlNSV3U1enlFc01rNHkzdXVDRml1UlBSbHU0UTVwSnZ1T2VtN0g3VUxpSWhDZW12NURna0d0REwxY0dMNEVRaFlSQjZJU3pWdnNiMkVhUDl3UUU2RFZSbk03TytwblN6ZXQ2bHpwM3BGZEduYm94MUxSZkM2MHV0WForQ2pJbTRpRU1tdGJCMk41ekRTaEdiZU0zWFViSlFkQ0JpczhYSXJoaDJiaUI1aEJDVnduM1kzZXR0N0dEUFZ0b2kxR1JqeitKYmdNK1lSOTI4S2JkV1M1dEZhTU0zS2ozWHY2b3RJeHpNQm5EQzl1VzNkK0lYeDZ2TFBKMEpSdWgzeVA3cFRsYTZjM2lSNHA5bldZRHFKK1pTbXBySEZuRE96c0xXbUZqYXBqZS9NcXdNSmQ2VGszbkFXd2ljTU9QdVlwTXlxSUYwNGZsNG1xZ3RzSExTTVdSUk5IUFpqRVRROWdSbWVEWWU2YVJ0bFcwMnFMMm9sREVOcUxRTXRBZG9pck5XUmNQOVZMM1RkOEhhVU82ZlNsR05hYk1ha0pELzAwWENoT1NVT0lQKzdmTTdWMC9sMWJMV1B0RXoxaTdMeWdUVjdwZEdvRG50cVNDRW5KckJ5aEJBekxSZzVRSWM5NDM4SWhLbXlmbjAvM2F3b0QxSXI3ODBleXAvWGNJNnhOY3c2VHYvRVRmSGcwZTdpWUMwVVljSklFNVFVWHYwcytZb0dJRXE1R0l6S3ViOEhOalNUVXBzdm5rVngrZGJlMmpSbjNZYjlXN0pDWjVZUzZGNU15VVZzcGpNRDdOWWMrRFdqVUwyYjJzVnlBZmVZcEM4VWhhaDl0dW1hdmJCdjdhM2E5a2dGYnE1OGxySHh6WTdpSlFWaWd6cTNlMWEyQlNiMFBjVzFhSjhCRDdOa05waEtZYXlUeHlrZ3dpbEVSTDhqcXFCRW5pSFZkQnhESllMYitYdzNhbExtbHR1VEVWNktHdEJudEJYK3l6MzZSUERNeUdJS2UrM2Z6Y3hmbkNEbjIwTW9kVlZrVk5velBxTVhaMEc1TDRhTFRBUWFrWUtVanNWTVFqQWhRa1RsSEJlTy9hTFB4OXN4bCsrajFaNXJMZ0cxMlRONFhKMWVpY3Z3NEFWRTU4TG9yYXEwUWlFMGNTN1BIMXBiclpXcmZ0N0xZR2l5QlNob3I3KzBqaW9VaDFwZFdxMnFNWUxxZU1FZXVDUk9RdDU3bUZyT2p5UEg0OXFwOTdjV09yZ2VnMld5ZldTREdRUGplNStQMHlRb0NwRC9EM1JBTXVXbWI5d2xCdGNxMmo4V0pQdDkxRTNrS2F3dVFJeXZkMnIyVWp4NCtIVE50VktiOWtNTE9PODVJNjViTkdCSCs0aXJTeTVnUVlsRTI2QTJjU0dJY0xLUVJsdkpvTW5hN0wvOXd5cnk0SHpPcnprckF2TGRnc1NObFlqcEhRRVJpT0k4MHNKNWpOQ0NuZncwMTNGK0Erc0FmTG15Uy9CRExOUTFxYVEzcDZoOC9KcUFmaFg1T0dIZ1NpUlZPQ0VqdWFEQi9Nd1pOQ3UzUUw5ZWhob0FqN3VPZjhQa3IzbUlqYmhoOUhpanNqeDE5MSswZTJKUXJGYTAxQVZKS0VWdHVQdEljMmgvMXBQS012eWVueGpUTzJPeFBuamp0Kzg0bklLS2h4REovZ2hQdDdpdjhQbVRKMGxLS3lQUnNzbDhmL1FkSGR4dXBiNmpUc0k2VUttejlZNDZQTUJ1RDZQM3doOHFwMzZPNm9pYk5EaVFkMXNFMTB2Smg5ejFGeXNLSWU4RXFNcG5OZEVtRzJUZkVCeFJwbVFyaEtFcWVlMHA2K2E2c1FvOGNWbFJKa0tRQVlLYXdjYU5FUzVYYzZkUVk1bnFlaXE4c1VpemYxc3BmSGVIZWxEdTFNNkJSWHVDakZhZlhoejhpM2xQV2dZcVZwZngxM2lnVkNSZjQ3VUg2NTJ5TG5zbWVwQ0JXZ3lCVFdBY095RjFReDhZR3Rabm9iMVROKzZ4RXd6cGNXVnk3UU85UDkyc0tBOVNLKy9OSHNxZjEzQ090MEpIQ3RUVjFPbFRRVytKQUt5eGUxSGw3K3M5NXozS0NnRktRUyszQXMxSlY3TmErZytMQ1IySWV2dThkNUQwTDdHd29EcmVVdjQzNzRMUmFGa05zSE9xV2JVOW5oUWpkTVZyN2EvaThPLzRoYnB0YVN6cXFrZ1lGaU5GVS9vbVc1cXdJejdzcDRuc2NJVFJFM2d1YTZiemtsTVo4RUNuMWlxQVd0MGE2Z2VraTVEYUw4cVlhcFRDQ2hqbFdzRXhxRnV4aVdQMzVUVUNkZEVkOEFDYk1HcytnUUZ5RE9vemZCREcxN2RaTzBtQ3dXK1B6Q0wyamJJQ0ROYWk1L2ptMVFyNk1MNTZqelVhSUR6MEdMUFRTYWV4MVVERHdrUTlvN21YV0MwUjdqV256YmtIUldjb21WYldtR3FMMXJqZG9hY3MvUjl1anFVdUJBNkE1VkwvcWtRMXhITDQyRVhvb3ByQzh3cnJmUjY4ek1NRnhPd1U3Q1lISjdiaEcvUTRyTnNYREJjTW8xQWRpcTlMWGJYbS9RSmowdS9qZ1pHc3N6MG5uS0tVRkpjeHp1QU5LOTZ6V3dmMURYYXNVY09vRXVFYXRtMXJtUDV3ckJKbVcvWndUNmFCQmlSMk9TSjB4cjh0UTZPYm1kS2p5YisxZUVYYjE0MzdSMklkaERVZGs1UFJ6dEgyWUZ0MnBtdUw0L0xtSUxGQXZQZGl5TXRESE5qK0toNHNWNE1sWGJXUHJySTk3WUJPRnBGbFgrZ25ld0tLZkZaa0hFN2RpdHkzNGRVUTJHbmU2c0FHeDF6eHlqWnY1S0JNMjZsUkhGNDVYcUZOSjFSUTNoTXltSkhzeVlOc01PNDFCV3JHdjE5UEE0NjhlY3c5SGNSTjB3aGpVVGduczhaVmFDNGhpSnNnWTA3YUFFQkhtOTAvdWhoak8vV21iN3d1VmFkaGw5Um5IZVFqcHg0Z3dDckx6NWk1czVJdDFzQndmRGIwRmUrUENwTGtjK3dJSU5LMlk4NmtQdGhSNmdKd1c3NXp1b041QzBDQWlEd2ZVNzN2YUFaYWh6ZjRWTE5sTTBVMDRPdEhZQmkxM1lnUG9ObUdIUmVsWlZFeTJLdUtWWmdoRDE0dlNsWStKck1CRGRtMnkydGhGVitCcmloTDcrZlE1d2NZbnhHZWxhd0R1b1NSNStiRERrcjZSTDQwTDR4eWZBaHhsck9uMHVBMjhnaEdlV2d1YVdLRXY1bkJycnZldTF1ZVZ5MU12R1VZQlkrSWxFcjhOZEROUmRtRXpYdDM5a0dsZDg2eE9mQUgveEwxVm11Z2FYT0dhUEIycWM3V0RSa1c2azVGNm4zUGtJemRQWHlPTktwMURrT2czb2NTTVpNVHM2R0tqOUMzdk9EWjZaUXB3TkRZTE1UK0NtRUwxOEdSalhOY1psUC9MbmhpQUlzY1lUTDEraUhXRFl2Um12UE13dE9IaENuRVhJVTNGVGJQKzZRUkdBNnF5ZGJubmVxVmhYb3djTG1iTUl6MTZJQzFrd2haajc1L001M3NLWVgyelJnT1NUQWZOU0QvNWxaWVNOVXhKZktURGdpYUZFZ2dyQ3JkKzNDYytjaHpzbEkzekRYRUtUcnZsY1gySW5DOXVIK2ZzeXB5SHcrQXZZMk9tQkdRTUlJYzhmRTN0Tk8wZ0JUVnFYc2RzRTc2WXdIcjI5ZHpRY2t1c3V5SnNCZlNWY2xydnNOQ1oxUFFETDhIM2NSczNIRTluVWt4NWJiSllXc1B4YjgyNWduRXBXVTlaOUt0enZzbGk3L2hlT2xES3BIeEpiMXVDcldxZjhnUm5XbXEzemZTU3JVWEJIU0x1NjJNcmtYVGpXZ2FwVVZ4TUdrcm56UjBFNFBNeTFiRmN5RHBFUWUxNVRheVdCTTFCNmpySUcrMERSUjlPYUNVUHdEN2V4Tm1qWmI5TTgxdXMrQUlSZnl6SlBaR21mSHVUOVNOekZmTnVRZEZaeWlaVnRhWWFvdld1TjJpckkzelFhdEtDRG5RSVhwcjBWaEcwR29wOGMvenJvV0JvTi9hVkttbjhza1NGdkFET2pvWkFpeGc2SzF5OXdGaThwZUNtaW1GWjNaekNWc0c2RVU5U3ZsYnE1K3duN0Q2eStkQVlkYVBtczRnd0NyTHo1aTVzNUl0MXNCd2ZEYno0WDRWeHFJcGNUQzlOYVlLcUE3R0tLK2FUclpXVXd3TjIxUU90cjhlcXhTZ0oxVTllQ09jV1hRZCtwMzZHeTRmWSt0OWMyQ3NWTmJObDFnaHhhOWJJOFU2ZTZGVGQvdnZCYXE5anJLZGl0cTRtTkNhaW9nbWZQSzZNNDhVWUk4alpNQ2RkLzlDOEJxdlVqNGJZVTVieVdBU0VHNkJCR2RLOEtsZmkvYTRMV3QzaXZDNHU5UUJUZmIvdkNtTkppL1FBZmFiY1BHK1VzV21zWU5SSytnOGhNY3N1Qm1oaDQ4TnBoUnZlYlZRcXE2bmNLeGMxbkZIV01XNU02b2YrejhjMUhkZG5pZURQOUdhQnNxK3lzbGpLc2xZcnQ5ODlQWTl4c2Jta3IzWC9vQ2ZpRlU0TmZjT2hlZSsrbmdXMFhwWkFWdDFJMlFuYzFhbHdibm9OcU1NaFhJQjk1aWtMeFNGcUgyMjZacTlzRy90cmRyMlNBVnVybnlXc2ZITmp1SWxCV0tET3JkN1ZyWUZKdlE5eGJWb21LcVFqdWg5ZHpmMm52VnJCemJFRjBDWlk2aXprWS9SUVk1cjlrOTMveTJORzdvMDduTVlqT3RaWVllTlVvaWs3R2JLL0h6UWwxUzdzL0ZDaG50OU02ZkUwVXl1UG10dE85OGhxenhRYnRlTWFsTXRTY2UyV0xjanlYVkdmcHFkQmtZeW00Z1pCeWNjUzZhbnR0NG9MZGx1V1NTSnNIWDFJY1hoUXk2b0orQWhqdzloRll3WExIUExvQ28zakVsaVVBSzQxNzl3dFl0SHNPMGFiTHg0K2htdE01Rno3d1VWYWhCQTlzdXBPVGYvRkQ0c2laTU1vZjVXM3ZtNURlZGhxR0FObGh0M21JNlJtSWh2NDhRVnRuZU1zVXpZQzRORGhaRDRNNVI2cDdHWEJxY3B1M0ZhRUYvMEkwZTNMY2VYMUhOK2lEcUtSUHVHenZwYWMvMXRzR1BJdGVBRHh1OU9Zb2FwMnozRjFDelNnL1V1YThsL0tFenRBS0RjdmJoTlUvWVVjMmxoZ3hnZmRiNGUrUDlUWjdSYVg4MnM2Mjd1MENiRnNmR0UvMWhMcGI1TWMydmsxdURHcmRJY2JXQTZ4aHBZQUhZaEVZVWw5Yzc1WS9SLzBnbDZyOSttNmNJMEJ2Qlk1QWE1TkJSYzZVTXZzTy9QT3c1Q2NyNzlzSnppY2VhVjNZd3JZRWtqcDZLaStPWXJHdTk1NEFBK2RKOVdzdk5HQkZHTXJLQWZROVZVQy9BVGtKZlRsb01sdERlVjVBbzl6a2FheTNkS0FhNS9QeEFHUkRBVWNRTERGN3VWWGJEMXZGZ0UvK1JYaXd6UzVON2NyM2FGQmRSWTdYQW1Gei9mYjAvS1NwUjhDUS9sb2twbU0ybWx0Sjl2R1BnaXFiNW5abDlLdTdkMkdsZ0FkaUVSaFNYMXp2bGo5SC9TQnVqQlBvTzFmcG9PdTVGMzVjZEhhNWtTRnZBRE9qb1pBaXhnNksxeTl3RmxqMEV6NWtzVVczV1U2M0U3ZTRxdERVQ0tXd2pqVTVmMEZkNTdWeVZ6cEM2Q2RDU2NCallTelQ5clpMVnNrcTYxYU9XckREVU5LcUFRMytuWC9CQlczY1FURWNPVmRjMTVuZ1ZYY1NTL2FLMlFGTWRpS1FscW0xNWZFckpkd3F5ZXphN2hmbEtUaUN6VWR1NVZHbEZXOXFDdDhzeUhvb3NBMk56Zm9zSmRUZE44YldIbm9EcjVOMjVldCtwL252ampPelpSYUxZb1kvZnIvazVocXB0T2s9XFxcXFxcXCIpO1xcXFxuICAgIHJldHVybiAkLmV4cG9ydHM7XFxcXG59KSgpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIue8lui+keWFrOWRilxcXCIsXFxcInBhdGhcXFwiOlxcXCJkZXZJbmZvRWRpdFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKT0+e1xcXFxuICAgIHB1dE15VmFyKFxcXFxcXFwiZGV2SW5mb1xcXFxcXFwiLCcnKTsgLy/muIXpmaTljoblj7LlhazlkYpcXFxcbn0pKTtcXFxcbnNldFBhZ2VUaXRsZSgn57yW6L6R5YWs5ZGKJyk7XFxcXG4vLyBsZXQge25vd0p4LE15SmlleGksanhzUm91dGV9ID0gTVlfUEFSQU1TO1xcXFxuY29uc3Qge2NvbG9yLHNtYWxsLGFwaSwgZ2V0RmlsZSxnZXRBcGl9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbi8vIGxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXFxcbnZhciBkZXZfaW5mb191cmwgPSBnZXRBcGkoJ2luZm9HZXRVcmwnKTtcXFxcbi8vIGxvZyhkZXZfaW5mb191cmwpO1xcXFxudmFyIGdldF9pbmZvID0gZnVuY3Rpb24ocXEpe1xcXFxuICAgIHFxID0gcXF8fCc0MzQ4NTcwMDUnO1xcXFxuICAgIGxldCBkZXZfaW5mb191cmwgPSBkZXZfaW5mb191cmwrcXE7XFxcXG4gICAgbGV0IGJhY2tfY29kZSA9IEpTT04ucGFyc2UocmVxdWVzdChkZXZfaW5mb191cmwpKTtcXFxcbiAgICBsZXQgZGV2X2luZm89YmFja19jb2RlLnJlc3VsdHx8YmFja19jb2RlLmRldGFpbDtcXFxcbiAgICByZXR1cm4gZGV2X2luZm87XFxcXG59O1xcXFxudmFyIGJlZm9yZV9yZWZyZXNoID0gZnVuY3Rpb24oKXtcXFxcbiAgICBsZXQgZGV2X3NldF9pbmZvID0gZ2V0TXlWYXIoXFxcXFxcXCJkZXZfc2V0X2luZm9cXFxcXFxcIikuc3BsaXQoJyQkJyk7XFxcXG4gICAgbGV0IGRldl9pbmZvX3VybCA9IGRldl9zZXRfaW5mby5zbGljZSgtMSlbMF07XFxcXG4gICAgbGV0IGJhY2tfY29kZSA9IEpTT04ucGFyc2UocmVxdWVzdChkZXZfaW5mb191cmwpKTtcXFxcbiAgICBsZXQgZGV2X2luZm89YmFja19jb2RlLnJlc3VsdHx8YmFja19jb2RlLmRldGFpbDtcXFxcbiAgICBwdXRNeVZhcihcXFxcXFxcImRldkluZm9cXFxcXFxcIixkZXZfaW5mbyk7XFxcXG4gICAgcmV0dXJuIGRldl9pbmZvXFxcXG59O1xcXFxubGV0IGQgPSBbXTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6J+e8lui+keWFrOWRiicsXFxcXG4gICAgZGVzYzon5pSv5oyBbWTor63ms5Us54K55Ye76L+b5YWl5a2m5LmgTWTor63ms5VcXFxcXFxcXG7kv53lrZjlhazlkYrmjInpkq7lnKjmlofmnKzmoYbmnIDkuIvpnaInLFxcXFxuICAgIGNvbF90eXBlOid0ZXh0XzEnLFxcXFxuICAgIHVybDonaHR0cHM6Ly93d3cucnVub29iLmNvbS9tYXJrZG93bi9tZC10dXRvcmlhbC5odG1sJ1xcXFxufSk7XFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOifov5Tlm54nLFxcXFxuICAgIGNvbF90eXBlOid0ZXh0XzInLFxcXFxuICAgIHVybDokKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCgpPT57XFxcXG4gICAgICAgIGJhY2soZmFsc2UpO1xcXFxuICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxcXG4gICAgfSlcXFxcbn0pO1xcXFxuaWYoIWdldE15VmFyKCdkZXZJbmZvJykpe1xcXFxuICAgIGJlZm9yZV9yZWZyZXNoKCk7XFxcXG59XFxcXG5sZXQgZW1wdHkgPSAnaGlrZXI6Ly9lbXB0eSc7XFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOifpmIXop4jmn6XpmIUnLFxcXFxuICAgIGNvbF90eXBlOid0ZXh0XzInLFxcXFxuICAgIC8vIHVybDokKGdldE15VmFyKCdkZXZJbmZvJykpLmNvbmZpcm0oKVxcXFxuICAgIHVybDokKGVtcHR5KS5ydWxlKCgpPT57XFxcXG4gICAgICAgIHJlcXVpcmUoXFxcXFxcXCJodHRwczovL2dpdGxhYi5jb20vaGpkaG54L2hpa2VyLy0vcmF3L21haW4vanMvbWFya2VkLm1pbi5qc1xcXFxcXFwiKTtcXFxcbiAgICAgICBsZXQgZGV2SW5mbz1cXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgIHRyeXtcXFxcbiAgICAgICAgICBkZXZJbmZvPW1hcmtlZC5wYXJzZShnZXRNeVZhcignZGV2SW5mbycpKTtcXFxcbiAgICAgICB9Y2F0Y2goZSl7fVxcXFxuICAgICAgICBzZXRSZXN1bHQoW1xcXFxuICAgICAgICAgICAge1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOmRldkluZm8sXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6J3JpY2hfdGV4dCcsXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIF0pO1xcXFxuICAgIH0pXFxcXG59KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgZGVzYzogXFxcXFxcXCLlv6vmnaXnvJbovpHkvaDnmoTlhazlkYrlkKd+XFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcignZGV2SW5mbycsICcnKXx8XFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJ0ZXh0YXJlYVxcXFxcXFwiLFxcXFxuICAgICAgICBoZWlnaHQ6LTEsXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0TXlWYXIoXFxcXFxcXCJkZXZJbmZvXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTpcXFxcXFxcIuS/neWtmOWFrOWRilxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXFxcXG4gICAgdXJsOiQoJ+ehruiupOS/neWtmOWFrOWRiuWQl++8n+WwhuS8muS4jumBk+mVv+S7k+W6k+acjeWKoeWZqOmAmuiurycpLmNvbmZpcm0oKCk9PntcXFxcbiAgICAgICAgbGV0IGRldl9zZXRfaW5mbyA9IGdldE15VmFyKFxcXFxcXFwiZGV2X3NldF9pbmZvXFxcXFxcXCIpLnNwbGl0KCckJCcpO1xcXFxuICAgICAgICBsZXQgaW5wdXRfdGV4dCA9IGdldE15VmFyKCdkZXZJbmZvJywgJycpO1xcXFxuICAgICAgICBpZihpbnB1dF90ZXh0Lmxlbmd0aCA+PSA0KXtcXFxcbiAgICAgICAgICAgIGxldCBpbmZvX3NldF91cmw9IGRldl9zZXRfaW5mb1syXTtcXFxcbiAgICAgICAgICAgIGxldCBzZW5kX2RhdGEgPSB7XFxcXFxcXCJwYXJhbXNcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAge1xcXFxcXFwiZGF0YVxcXFxcXFwiOiB7XFxcXFxcXCJpbmZvXFxcXFxcXCI6IGlucHV0X3RleHR9LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJuYW1lXFxcXFxcXCI6IGRldl9zZXRfaW5mb1swXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIjogZGV2X3NldF9pbmZvWzFdfVxcXFxuICAgICAgICAgICAgfTtcXFxcbiAgICAgICAgICAgIC8vIGxvZyhzZW5kX2RhdGEpO1xcXFxuICAgICAgICAgICAgbGV0IHBhcjIgPSB7aGVhZGVyczp7J2NvbnRlbnQtdHlwZSc6J2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsJ1VzZXItQWdlbnQnOmRldl9zZXRfaW5mb1szXX0sYm9keTpKU09OLnN0cmluZ2lmeShzZW5kX2RhdGEpLG1ldGhvZDonUE9TVCd9O1xcXFxuICAgICAgICAgICAgLy8gcGFyMiA9IEpTT04uc3RyaW5naWZ5KHBhcjIpOyAvL3g16YeM6Z2i6K+35rGC5omN6ZyA6KaB57yW56CBXFxcXG4gICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgIGxldCBiYWNrX3JldCA9IHJlcXVlc3QoaW5mb19zZXRfdXJsLCBwYXIyKTtcXFxcbiAgICAgICAgICAgICAgICBiYWNrX3JldCA9IEpTT04ucGFyc2UoYmFja19yZXQpLnJlc3VsdDtcXFxcbiAgICAgICAgICAgICAgICBpZihiYWNrX3JldC5zdGF0dXM9PT0wKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+S/neWtmOaIkOWKn1xcXFxcXFxcbicrYmFja19yZXQuZGV0YWlsO1xcXFxuICAgICAgICAgICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L+d5a2Y5aSx6LSlXFxcXFxcXFxuJytiYWNrX3JldC5kZXRhaWw7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr1xcXFxcXFxcbicrZS5tZXNzYWdlO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgIGNvbmZpcm0oe3RpdGxlOifpgZPplb/mj5DnpLonLGNvbnRlbnQ6J+iZveeEtuS9oOW+iOaHku+8jOS9huaYr+WFrOWRiuiHs+WwkeWGmTTkuKrlrZflkKfvvIEnfSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KVxcXFxufSk7XFxcXG5cXFxcbnNldFJlc3VsdChkKTtcXFwifV1cIn0iLCJwaWNVcmwiOiJodHRwczovL2xhbm1laWd1b2ppYW5nLmNvbS90dWJpYW8vcS81Mi5wbmciLCJ0aXRsZSI6IuOAjOi9u+WQiOmbhi5hcHDjgI0ifQ==
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement