Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@α@eyJsYXN0X2NoYXB0ZXJfcnVsZSI6IiIsInRpdGxlIjoizrEiLCJhdXRob3IiOiJ6ZXRhbHBoYSIsInVybCI6Imhpa2VyOi8vZW1wdHkjIyIsInZlcnNpb24iOjIwMjMxMTEzMDEsImNvbF90eXBlIjoibW92aWVfMyIsImNsYXNzX25hbWUiOiIiLCJ0eXBlIjoib3RoZXIiLCJjbGFzc191cmwiOiIiLCJhcmVhX25hbWUiOiIiLCJhcmVhX3VybCI6IiIsInNvcnRfbmFtZSI6IiIsInllYXJfbmFtZSI6IiIsInNvcnRfdXJsIjoiIiwieWVhcl91cmwiOiIiLCJmaW5kX3J1bGUiOiJqczpcbnZhciBkPVtdO1xuZC5wdXNoKHtcbiAgICB0aXRsZTon5bCB6KOF5LiA5Lqb5pa55rOVJyxcbiAgICBjb2xfdHlwZTondGV4dF8xJyxcbiAgICB1cmw6J2hpa2VyOi8vZW1wdHknXG59KVxuXG5cbnNldFJlc3VsdChkKSIsInNlYXJjaF91cmwiOiIiLCJncm91cCI6IuW3peWFtyIsInNlYXJjaEZpbmQiOiIiLCJkZXRhaWxfY29sX3R5cGUiOiJtb3ZpZV8xIiwiZGV0YWlsX2ZpbmRfcnVsZSI6IiIsInNkZXRhaWxfY29sX3R5cGUiOiJtb3ZpZV8xIiwic2RldGFpbF9maW5kX3J1bGUiOiIiLCJ1YSI6Im1vYmlsZSIsInByZVJ1bGUiOiIiLCJwYWdlcyI6Ilt7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5LqM57qnXCIsXCJwYXRoXCI6XCJlclwiLFwicnVsZVwiOlwianM6XFxuLyp2ZXIgMjAyMzA5MzAgMi4wXFxuICovXFxuY29uc3QgY3VzdG9tcyA9IHt9O1xcblxcbi8v6aKE6K6+XFxuZnVuY3Rpb24gY3VzdG9tRGF0YShjdXN0b20pIHtcXG4gIE9iamVjdC5rZXlzKGN1c3RvbSkuZm9yRWFjaCgoaykgPT4ge1xcbiAgICBjdXN0b21zW2tdID0gY3VzdG9tW2tdO1xcbiAgfSlcXG59XFxuXFxuXFxubGV0IEVyamkgPSB7XFxuICDpgJrlhY06ICQoJycpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgdHJ5IHtcXG4gICAgICB2YXIgaHRtbCA9IEpTT04ucGFyc2UocmVxdWVzdChpbnB1dCkubWF0Y2goL3IgcGxheWVyXy4qPz0oLio/KTwvKVsxXSlcXG4gICAgICB2YXIgdXJsID0gaHRtbC51cmxcXG4gICAgICBpZiAoaHRtbC5lbmNyeXB0ID09ICcxJykge1xcbiAgICAgICAgdXJsID0gdW5lc2NhcGUodXJsKTtcXG4gICAgICB9IGVsc2UgaWYgKGh0bWwuZW5jcnlwdCA9PSAnMicpIHtcXG4gICAgICAgIHVybCA9IHVuZXNjYXBlKGJhc2U2NERlY29kZSh1cmwpKTtcXG4gICAgICB9XFxuICAgICAgaWYgKC9tM3U4fG1wNC8udGVzdCh1cmwpKSB7XFxuICAgICAgICByZXR1cm4gdXJsXFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiBcXFwidmlkZW86Ly9cXFwiICsgaW5wdXRcXG4gICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICByZXR1cm4gXFxcInZpZGVvOi8vXFxcIiArIGlucHV0XFxuICAgIH1cXG4gIH0pLFxcbiAgZXZhbEpTUnVsZTogZnVuY3Rpb24gKGl0ZW0sIGpzUnVsZSkge1xcbiAgICBsZXQgcnVsZSA9IGpzUnVsZS5yZXBsYWNlKFxcXCJAanM6XFxcIiwgXFxcIlxcXCIpO1xcbiAgICBydWxlID0gcnVsZS50cmltKCk7XFxuICAgIC8vbG9nKCQuc3RyaW5naWZ5KHJ1bGUpKVxcbiAgICBsZXQgaW5wdXQgPSBpdGVtO1xcbiAgICBpZiAocnVsZS5zdGFydHNXaXRoKFxcXCIoXFxcIikpIHtcXG4gICAgICBldmFsKFxcXCJyZXN1bHQgPSBcXFwiICsgcnVsZSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgLyoqXFxuICAgICAgKiDov5jljp/miJAgJC50b1N0cmluZyguLi4pIOeahOacgOe7iOe7k+aenO+8jOi+vuWIsOacgOe7iOWkhOeQhuaWueW8j+i3n+S4iumdoueahCBpZiDkuIDoh7TnmoTnm67nmoRcXG4gICAgICAqL1xcbiAgICAgIGV2YWwoXFxcInJlc3VsdCA9IFxcXCIgKyBcXFwiKCgpID0+IHtcXFwiICsgcnVsZSArIFxcXCJ9KSgpXFxcIik7XFxuICAgIH1cXG4gICAgcmV0dXJuIHJlc3VsdCB8fCBcXFwiXFxcIjtcXG4gIH0sXFxuICB1cGRhdGFSdWxlOiBmdW5jdGlvbiAocnVsZSwgaGVhZGVycykge1xcbiAgICBoZWFkZXJzID0gaGVhZGVycyAhPSB1bmRlZmluZWQgPyBoZWFkZXJzIDoge307XFxuICAgIHNldExhc3RDaGFwdGVyUnVsZSgnanM6JyArICQudG9TdHJpbmcoKHVybCwgcnVsZSwgaGVhZGVycykgPT4ge1xcbiAgICAgIHZhciBodG1sID0gZmV0Y2godXJsLCBoZWFkZXJzKTtcXG4gICAgICBzZXRSZXN1bHQoZXZhbChydWxlKSlcXG4gICAgfSwgTVlfVVJMLCBydWxlLCBoZWFkZXJzKSlcXG4gIH0sXFxuICB1cGRhdGFGdW46IGZ1bmN0aW9uIChtZXRob2QsIHBhcmFtcykge1xcbiAgICB2YXIgbWV0aG9kQXJncyA9IHRoaXMuZ2V0QXJncyhtZXRob2QpO1xcbiAgICB2YXIgYXJncyA9IG1ldGhvZEFyZ3MubWFwKGZ1bmN0aW9uKGFyZykge1xcbiAgICAgIHJldHVybiBwYXJhbXNbYXJnXTtcXG4gICAgfSk7XFxuICAgIC8vbWV0aG9kLmFwcGx5KG51bGwsIGFyZ3MpO1xcbiAgICBzZXRMYXN0Q2hhcHRlclJ1bGUoJ2pzOicgKyAkLnRvU3RyaW5nKChtZXRob2QsYXJncykgPT4ge1xcbiAgICAgIG1ldGhvZC5hcHBseShudWxsLCBhcmdzKTtcXG4gICAgfSwgbWV0aG9kLGFyZ3MpKVxcbiAgfSxcXG4gIHVwZGF0YTpmdW5jdGlvbihhcmdzMSxhcmdzMil7XFxuICAgICAgaWYoYXJnczEuY29uc3RydWN0b3I9PUZ1bmN0aW9uKXtcXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0YUZ1bihhcmdzMSxhcmdzMik7XFxuICAgICAgfWVsc2V7XFxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGFSdWxlKGFyZ3MxLGFyZ3MyKTtcXG4gICAgICB9XFxuICB9LFxcbiAgZ2V0QXJnczpmdW5jdGlvbihmdW5jKXtcXG4gICAgdmFyIGFyZ3MgPSBmdW5jLnRvU3RyaW5nKCkubWF0Y2goL2Z1bmN0aW9uXFxcXHMuKj9cXFxcKChbXildKilcXFxcKS8pWzFdO1xcbiAgICByZXR1cm4gYXJncy5zcGxpdChcXFwiLFxcXCIpLm1hcChmdW5jdGlvbiAoYXJnKSB7XFxuICAgICAgcmV0dXJuIGFyZy5yZXBsYWNlKC9cXFxcL1xcXFwqLipcXFxcKlxcXFwvLywgXFxcIlxcXCIpLnRyaW0oKTtcXG4gICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChhcmdzKSB7XFxuICAgICAgcmV0dXJuIGFyZ3M7XFxuICAgIH0pO1xcbiAgfSxcXG4gIG1heExpc3Q6IChhcnIpID0+IHsgXFxuICAgIHJldHVybiBhcnIucmVkdWNlKChhY2MsIGN1cnIpID0+IChjdXJyLmxlbmd0aCA+IGFjYy5sZW5ndGggPyBjdXJyIDogYWNjKSwgW10pIFxcbiAgfSxcXG4gIGNsb3NlOiBmdW5jdGlvbiAobGlzdCwgc29ydHMpIHtcXG4gICAgYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKChsaXN0LCBzb3J0cykgPT4ge1xcbiAgICAgIGxpc3QubWFwKHggPT4ge1xcbiAgICAgICAgY2xlYXJNeVZhcignZXJfJyArIHggKyAnZm9sZCcpO1xcbiAgICAgICAgY2xlYXJNeVZhcignZXJfJyArIHgpO1xcbiAgICAgIH0pXFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0czsgaSsrKSB7XFxuICAgICAgICBjbGVhck15VmFyKCdwbGF5bGlzdF8nICsgaSk7XFxuICAgICAgfVxcbiAgICAgIGNsZWFyTXlWYXIoJ2VyX3BsYXlsaXN0cycpO1xcbiAgICB9LCBsaXN0LCBzb3J0cykpXFxuICB9LFxcbiAgZGF0YUNvbnZlcnQ6IGZ1bmN0aW9uIChkYXRhKSB7XFxuICAgIHZhciBuZXdjbHNsaXN0ID0gZGF0YS5tYXAoZnVuY3Rpb24gKG9iaikge1xcbiAgICAgIHZhciBuZXdPYmogPSBPYmplY3QuYXNzaWduKHt9LCBvYmopO1xcbiAgICAgIGlmIChuZXdPYmouaGFzT3duUHJvcGVydHkoJ3R5cGUnKSkge1xcbiAgICAgICAgbmV3T2JqLmNvbF90eXBlID0gbmV3T2JqLnR5cGU7XFxuICAgICAgfVxcbiAgICAgIHJldHVybiBuZXdPYmo7XFxuICAgIH0pO1xcbiAgICByZXR1cm4gbmV3Y2xzbGlzdDtcXG4gIH0sXFxuICBwcmVMb2FkOiBmdW5jdGlvbiAoZnVuYykge1xcbiAgICBsZXQgbXlmdW5jID0gbnVsbFxcbiAgICBpZiAoZnVuYyAhPSB1bmRlZmluZWQgJiYgZnVuYy5jb25zdHJ1Y3RvciA9PSBGdW5jdGlvbikge1xcbiAgICAgIG15ZnVuYyA9IGZ1bmNcXG4gICAgfVxcbiAgICAkLmV4dGVuZCh7XFxuICAgICAgZGF0YUNvbnZlcnQ6IHRoaXMuZGF0YUNvbnZlcnQsXFxuICAgICAgbXNtOiBNZXRob2RzLk11bHRpU2VsZWN0TW9kZSxcXG4gICAgICBmdW5jOiBteWZ1bmMsXFxuICAgIH0pXFxuICB9LFxcbiAgc21hbGw6IGZ1bmN0aW9uIChzdHIsIGNvbG9yLGgpIHtcXG4gICAgaD1oPT11bmRlZmluZWQ/dHJ1ZTpoO1xcbiAgICByZXR1cm4gKGg/J+KAnOKAnOKAneKAnSc6JycpKyc8c21hbGw+PGZvbnQgY29sb3I9XFxcIicgKyAoY29sb3IgfHwgJycpICsgJ1xcXCI+JyArIHN0ciArICc8L2ZvbnQ+PC9zbWFsbD4nO1xcbiAgfSxcXG4gIOWjsOaYjjogZnVuY3Rpb24gKCkge1xcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiB0aGlzLnNtYWxsKCfku6XkuIrmlbDmja7mnaXmupDkuo7nvZHnu5zvvIzlpoLmgqjllpzmrKLvvIzor7fmlK/mjIHlrpjmlrnvvIEnLCAnIzg3MUY3OCcpLFxcbiAgICAgIGRlc2M6IHRoaXMuc21hbGwoJ+atpOinhOWImeS7hemZkOWtpuS5oOS6pOa1geS9v+eUqO+8jOivt+S6juWvvOWFpeWQjjI05bCP5pe25YaF5Yig6Zmk77yM5Lu75L2V57uE57uH5oiW5Liq5Lq65LiN5b6X5Lul5Lu75L2V5pa55byP5pa55rOV5Lyg5pKt5q2k6KeE5YiZ55qE5pW05L2T5oiW6YOo5YiG77yBJywgJyNGMjBDMDAnKSxcXG4gICAgICB1cmw6ICdoaWtlcjovL2VtcHR5JyxcXG4gICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxuICAgIH0pO1xcbiAgfSxcXG4gIHN1YnN0cjogZnVuY3Rpb24gKHN0ciwgbWF4TGVuZ3RoKSB7XFxuICAgIGxldCBsZW4gPSAwO1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xcbiAgICAgIGlmIChzdHIuY2hhckNvZGVBdChpKSA+IDI1NSkge1xcbiAgICAgICAgbGVuICs9IDI7XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIGxlbisrO1xcbiAgICAgIH1cXG4gICAgICBpZiAobGVuID4gbWF4TGVuZ3RoKSB7XFxuICAgICAgICByZXR1cm4gc3RyLnNsaWNlKDAsIGkpICsgJy4uLic7XFxuICAgICAgfVxcbiAgICB9XFxuICAgIHJldHVybiBzdHI7XFxuICB9LFxcbiAgc2V0RGVzYzogZnVuY3Rpb24gKGRlc2MsIG51bSkge1xcbiAgICB2YXIgY3VzdG9tID0gdGhpcy5nZXRQcmVzZXQoKTtcXG4gICAgZGVzYyA9IGRlc2MuY29uc3RydWN0b3IgPT0gQXJyYXkgPyBkZXNjLmpvaW4oJzxicj4nKSA6IGRlc2M7XFxuICAgIGlmIChkZXNjLnJlcGxhY2UoLyg8YnI+fFxcXFxzKykvZywgJycpLmxlbmd0aCA9PSAwKSB7XFxuICAgICAgcmV0dXJuXFxuICAgIH1cXG4gICAgdmFyIGluZm8gPSBzdG9yYWdlMC5nZXRNeVZhcignZXJfaW5mbycsICd7fScpXFxuICAgIGlmIChpbmZvWydkZXNjJ10gIT0gdW5kZWZpbmVkKSB7XFxuICAgICAgaW5mb1snZGVzYyddID0gaW5mb1snZGVzYyddICsgJyDnroDku4s6JyArIGRlc2M7XFxuICAgICAgc3RvcmFnZTAucHV0TXlWYXIoJ2VyX2luZm8nLCBpbmZvKTtcXG4gICAgfVxcblxcbiAgICBjb25zdCBtYXJrID0gJ2Rlc2MnO1xcbiAgICBudW0gPSB0eXBlb2YgKG51bSkgPT0gJ3VuZGVmaW5lZCcgPyAxMDAgOiBudW1cXG4gICAgZGVzYyA9IGRlc2Muc3RhcnRzV2l0aCgn44CA44CAJykgPyBkZXNjIDogJ+OAgOOAgCcgKyBkZXNjO1xcbiAgICBkZXNjID0gZGVzYy5yZXBsYWNlKC8nL2csIFxcXCImIzM5O1xcXCIpO1xcbiAgICBkZXNjID0gZGVzYy5yZXBsYWNlKC9cXFxcclxcXFxuL2csIFxcXCI8YnI+XFxcIik7XFxuXFxuXFxuICAgIGxldCBzZGVzYyA9IHRoaXMuc3Vic3RyKGRlc2MsIG51bSk7XFxuXFxuICAgIHZhciBjb2xvcnMgPSB7XFxuICAgICAgc2hvdzogY3VzdG9tLueugOS7i+WxleW8gCxcXG4gICAgICBoaWRlOiBjdXN0b20u566A5LuL5pS26LW3XFxuICAgIH1cXG5cXG4gICAgdmFyIGxhenkgPSAkKGAjbm9Mb2FkaW5nI2ApLmxhenlSdWxlKChkYywgc2RjLCBtLCBjcykgPT4ge1xcbiAgICAgIHZhciBzaG93ID0gc3RvcmFnZTAuZ2V0SXRlbShtLCAnMCcpO1xcbiAgICAgIHZhciB0aXRsZSA9IGZpbmRJdGVtKCdkZXNjJykudGl0bGU7XFxuICAgICAgdmFyIHJlID0gLyg8XFxcXC9zbWFsbD48YnI+Lio/PikuKy9nO1xcbiAgICAgIHZhciBleHAgPSAn5bGV5byAOic7XFxuICAgICAgdmFyIHJldCA9ICfmlLbotbc6JztcXG4gICAgICBpZiAoc2hvdyA9PSAnMScpIHtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oJ2Rlc2MnLCB7XFxuICAgICAgICAgIHRpdGxlOiB0aXRsZVxcbiAgICAgICAgICAgIC5yZXBsYWNlKHJldCwgZXhwKVxcbiAgICAgICAgICAgIC5yZXBsYWNlKHJlLCAnJDEnICsgc2RjICsgJzwvc21hbGw+JylcXG4gICAgICAgICAgICAucmVwbGFjZSgvKDxcXFxcL3NtYWxsPjxicj5cXFxcPGZvbnQgY29sb3I9XFxcIikuKj8oXFxcIj4pLywgJyQxJyArIGNzLmhpZGUgKyAnJDInKVxcblxcbiAgICAgICAgfSlcXG4gICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0obSwgJzAnKTtcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgdXBkYXRlSXRlbSgnZGVzYycsIHtcXG4gICAgICAgICAgdGl0bGU6IHRpdGxlXFxuICAgICAgICAgICAgLnJlcGxhY2UoZXhwLCByZXQpXFxuICAgICAgICAgICAgLnJlcGxhY2UocmUsICckMScgKyBkYyArICc8L3NtYWxsPicpXFxuICAgICAgICAgICAgLnJlcGxhY2UoLyg8XFxcXC9zbWFsbD48YnI+XFxcXDxmb250IGNvbG9yPVxcXCIpLio/KFxcXCI+KS8sICckMScgKyBjcy5zaG93ICsgJyQyJylcXG4gICAgICAgIH0pXFxuICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKG0sICcxJyk7XFxuICAgICAgfVxcbiAgICAgIHJldHVybiBgaGlrZXI6Ly9lbXB0eWBcXG4gICAgfSwgZGVzYywgc2Rlc2MsIG1hcmssIGNvbG9ycylcXG4gICAgdmFyIHNjID0gc3RvcmFnZTAuZ2V0SXRlbShtYXJrLCAnMCcpID09ICcwJyA/ICflsZXlvIA6JyA6ICfmlLbotbc6JztcXG4gICAgdmFyIGRjID0gc3RvcmFnZTAuZ2V0SXRlbShtYXJrLCAnMCcpID09ICcwJyA/IHNkZXNjIDogZGVzYztcXG4gICAgdmFyIGNzID0gc3RvcmFnZTAuZ2V0SXRlbShtYXJrLCAnMCcpID09ICcwJyA/IGNvbG9ycy5oaWRlIDogY29sb3JzLnNob3c7XFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6ICcnICsgJzxiPjxmb250IGNvbG9yPVxcXCIjMDk4QUMxXFxcIj7iiLfliafmg4XnroDku4tcXHQ8L2ZvbnQ+PC9iPicgKyBcXFwiPHNtYWxsPjxhIHN0eWxlPSd0ZXh0LWRlY29yYXRpb246IG5vbmU7JyBocmVmPSdcXFwiICsgbGF6eSArIFxcXCInPlxcXCIgKyBzYyArICc8L2E+PC9zbWFsbD48YnI+PGZvbnQgY29sb3I9XFxcIicgKyBjcyArICdcXFwiPicgKyBgJHtkY31gICsgJzwvc21hbGw+JyxcXG4gICAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCcsXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiAnZGVzYycsXFxuICAgICAgICBsaW5lU3BhY2luZzogNixcXG4gICAgICAgIHRleHRTaXplOiAxNSxcXG4gICAgICAgIGxpbmVWaXNpYmxlOiB0cnVlLFxcbiAgICAgIH1cXG4gICAgfSlcXG4gIH0sXFxuICBzZXREZXNjMjogZnVuY3Rpb24gKGRlc2MsIG51bSkge1xcbiAgICB2YXIgY3VzdG9tID0gdGhpcy5nZXRQcmVzZXQoKTtcXG4gICAgZGVzYyA9IGRlc2MuY29uc3RydWN0b3IgPT0gQXJyYXkgPyBkZXNjLmpvaW4oJzxicj4nKSA6IGRlc2M7XFxuICAgIGlmIChkZXNjLnJlcGxhY2UoLyg8YnI+fFxcXFxzKykvZywgJycpLmxlbmd0aCA9PSAwKSB7XFxuICAgICAgcmV0dXJuXFxuICAgIH1cXG4gICAgdmFyIGluZm8gPSBzdG9yYWdlMC5nZXRNeVZhcignZXJfaW5mbycsICd7fScpXFxuICAgIGlmIChpbmZvWydkZXNjJ10gIT0gdW5kZWZpbmVkKSB7XFxuICAgICAgaW5mb1snZGVzYyddID0gaW5mb1snZGVzYyddICsgJyDnroDku4s6JyArIGRlc2M7XFxuICAgICAgc3RvcmFnZTAucHV0TXlWYXIoJ2VyX2luZm8nLCBpbmZvKTtcXG4gICAgfVxcblxcbiAgICBjb25zdCBtYXJrID0gJ2Rlc2MnO1xcbiAgICBudW0gPSB0eXBlb2YgKG51bSkgPT0gJ3VuZGVmaW5lZCcgPyAxMDAgOiBudW1cXG4gICAgZGVzYyA9IGRlc2Muc3RhcnRzV2l0aCgn44CA44CAJykgPyBkZXNjIDogJ+OAgOOAgCcgKyBkZXNjO1xcbiAgICBkZXNjID0gZGVzYy5yZXBsYWNlKC8nL2csIFxcXCImIzM5O1xcXCIpO1xcbiAgICBkZXNjID0gZGVzYy5yZXBsYWNlKC9cXFxcclxcXFxuL2csIFxcXCI8YnI+XFxcIik7XFxuXFxuICAgIGxldCBzZGVzYyA9IHRoaXMuc3Vic3RyKGRlc2MsIG51bSk7XFxuXFxuICAgIHZhciBjb2xvcnMgPSB7XFxuICAgICAgc2hvdzogY3VzdG9tLueugOS7i+WxleW8gCxcXG4gICAgICBoaWRlOiBjdXN0b20u566A5LuL5pS26LW3XFxuICAgIH1cXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogJ+WJp+aDheeugOS7izxzcGFuIHN0eWxlPVxcXCJjb2xvcjojZmYwMDAwO1xcXCI+PGI+PHNtYWxsPicgKyAoc3RvcmFnZTAuZ2V0SXRlbShtYXJrLCAnMCcpPT0nMCc/J+WxleW8gCc6J+aUtui1tycpICsgJzwvc21hbGw+PC9iPjwvc3Bhbj46JyxcXG4gICAgICBjb2xfdHlwZTogJ2F2YXRhcicsXFxuICAgICAgaW1nOiAnaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9zeXN0ZW0vNzUucG5nJyxcXG4gICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKG1hcmssZGMsIHNkYyxjcykgPT4ge1xcbiAgICAgICAgdmFyIGRzID0gc3RvcmFnZTAuZ2V0SXRlbShtYXJrLCAnMCcpO1xcbiAgICAgICAgdmFyIHRpdGxlID0gZmluZEl0ZW0oJ2RzaG93JykudGl0bGU7XFxuICAgICAgICB2YXIgZHRpdGxlID0gZmluZEl0ZW0oJ2Rjb250ZW50JykudGl0bGU7XFxuICAgICAgICBpZiAoZHMgPT0gJzAnKSB7XFxuICAgICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0obWFyaywgJzEnKVxcbiAgICAgICAgICB1cGRhdGVJdGVtKCdkY29udGVudCcsIHtcXG4gICAgICAgICAgICB0aXRsZTogZHRpdGxlLnJlcGxhY2UoL1xcXFw+Lio/XFxcXDwvLCc+JytkYysnPCcpXFxuICAgICAgICAgICAgLnJlcGxhY2UoLyhjb2xvcj1cXFwiKS4qPyhcXFwiKS8sJyQxJytjcy5zaG93KyckMicpXFxuICAgICAgICAgIH0pO1xcbiAgICAgICAgICB1cGRhdGVJdGVtKCdkc2hvdycsIHtcXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUucmVwbGFjZSgn5bGV5byAJywgJ+aUtui1tycpICAgICAgICAgICAgICAgICAgICAgICAgXFxuICAgICAgICAgIH0pO1xcblxcblxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShtYXJrLCAnMCcpXFxuICAgICAgICAgIHVwZGF0ZUl0ZW0oJ2Rjb250ZW50Jywge1xcbiAgICAgICAgICAgIHRpdGxlOiBkdGl0bGUucmVwbGFjZSgvXFxcXD4uKj9cXFxcPC8sJz4nK3NkYysnPCcpXFxuICAgICAgICAgICAgLnJlcGxhY2UoLyhjb2xvcj1cXFwiKS4qPyhcXFwiKS8sJyQxJytjcy5oaWRlKyckMicpXFxuICAgICAgICAgIH0pO1xcbiAgICAgICAgICB1cGRhdGVJdGVtKCdkc2hvdycsIHtcXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUucmVwbGFjZSgn5pS26LW3JywgJ+WxleW8gCcpICAgICAgICAgICAgICAgICAgICAgICAgXFxuICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICAgIH0sbWFyaywgZGVzYywgc2Rlc2MsY29sb3JzKSxcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgaWQ6ICdkc2hvdycsXFxuICAgICAgfVxcbiAgICB9KVxcbiAgICB2YXIgc2M9c3RvcmFnZTAuZ2V0SXRlbShtYXJrLCAnMCcpID09ICcwJyA/IHNkZXNjLmZvbnRjb2xvcihjb2xvcnMuaGlkZSkgOiBkZXNjLmZvbnRjb2xvcihjb2xvcnMuc2hvdyk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6c2MsXFxuICAgICAgY29sX3R5cGU6ICdyaWNoX3RleHQnLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogJ2Rjb250ZW50JyxcXG4gICAgICAgIGxpbmVTcGFjaW5nOiA2LFxcbiAgICAgICAgdGV4dFNpemU6IDE1LFxcbiAgICAgICAgbGluZVZpc2libGU6IHRydWUsXFxuICAgICAgfVxcbiAgICB9KVxcbiAgfSxcXG4gIHN0ckNvbnZlcnQ6ZnVuY3Rpb24oYXJyLCBzcCkge1xcbiAgICAgIHNwID0gc3AgIT0gdW5kZWZpbmVkID8gc3AgOiAnLyc7XFxuICAgICAgdmFyIHJlZyA9IG5ldyBSZWdFeHAoc3ApO1xcblxcbiAgICAgIHJldHVybiBhcnIubWFwKHggPT4ge1xcbiAgICAgICAgc3RyID0geDtcXG4gICAgICAgIGlmIChyZWcudGVzdChzdHIpKSB7XFxuICAgICAgICAgIHN0ciA9IHN0ci5zcGxpdChzcCkubWFwKCh2YWwsIGluZGV4KSA9PiAoaW5kZXggPT09IDAgPyAnJyA6ICcnKSArIHZhbCkuc2xpY2UoMCwgNSkuam9pbignICcpLnJlcGxhY2UoLyAkLywgJycpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHN0clxcbiAgICAgIH0pXFxuICB9LFxcbiAgc2V0Q29udGVudDogZnVuY3Rpb24gKG9iaikge1xcbiAgICAvL2xvZyhvYmopXFxuICAgIHZhciBjdXN0b20gPSB0aGlzLmdldFByZXNldCgpO1xcbiAgICB2YXIgbnVtID0gb2JqLm51bSAhPSB1bmRlZmluZWQgPyBvYmoubnVtIDogMTAwO1xcbiAgICB2YXIgY29udGVudHMgPSBvYmoubWFpbjtcXG4gICAgaWYgKGNvbnRlbnRzLmNvbnN0cnVjdG9yID09IFN0cmluZykge1xcbiAgICAgIGNvbnRlbnRzID0gY29udGVudHMuc3BsaXQoJ1xcXFxuJyk7XFxuICAgIH1cXG4gICAgdmFyIHNvcnRPcmRlciA9IG9iai5zb3J0ID8gb2JqLnNvcnQgOiBbXTtcXG4gICAgdmFyIGZpbHRlcmxpc3QgPSBvYmouZmlsaXN0ID8gb2JqLmZpbGlzdCA6IFtdO1xcbiAgICB2YXIgaW1nID0gb2JqLmltZztcXG4gICAgdmFyIHRleHRzID0gY29udGVudHMubWFwKHggPT4ge1xcbiAgICAgIGlmICh4LmluY2x1ZGVzKCdocmVmJykpIHtcXG4gICAgICAgIHZhciBsaXN0ID0gcGRmYSh4LCAnYm9keSYmYScpLm1hcChrID0+IHBkZmgoaywgJ1RleHQnKSkuc2xpY2UoMCwgNSkuam9pbignICcpO1xcbiAgICAgICAgaWYgKGxpc3QgPT0gJycpIHtcXG4gICAgICAgICAgcmV0dXJuIHBkZmgoeCwgJ1RleHQnKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIHJldHVybiBwZGZoKHgsICc6bWF0Y2hUZXh0JiZUZXh0JykgKyBsaXN0O1xcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgICByZXR1cm4gcGRmaCh4LCAnVGV4dCcpO1xcbiAgICB9KTtcXG4gICAgdmFyIGFycmF5ID0gdGV4dHMuc29ydCgoYSwgYikgPT4ge1xcbiAgICAgIGNvbnN0IGluZGV4QSA9IHNvcnRPcmRlci5pbmRleE9mKGEuc3Vic3RyKDAsIDIpKTtcXG4gICAgICBjb25zdCBpbmRleEIgPSBzb3J0T3JkZXIuaW5kZXhPZihiLnN1YnN0cigwLCAyKSk7XFxuICAgICAgcmV0dXJuIGluZGV4QSAtIGluZGV4QjtcXG4gICAgfSlcXG4gICAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cCgnKCcgKyBzb3J0T3JkZXIuam9pbignfCcpICsgJyknKTtcXG4gICAgYXJyYXkgPSBhcnJheS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcXG4gICAgICByZXR1cm4gcmVnZXgudGVzdChpdGVtKTtcXG4gICAgfSk7XFxuXFxuICAgIHZhciBmaXJlZyA9IG5ldyBSZWdFeHAoJygnICsgZmlsdGVybGlzdC5qb2luKCd8JykgKyAnKScpO1xcbiAgICBpZiAoZmlsdGVybGlzdC5sZW5ndGggPiAwKSB7XFxuICAgICAgYXJyYXkgPSBhcnJheS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcXG4gICAgICAgIHJldHVybiAhZmlyZWcudGVzdChpdGVtKTtcXG4gICAgICB9KTtcXG4gICAgfVxcbiAgICAvL2xvZyhhcnJheSlcXG5cXG4gICAgLy9hcnJheSA9IHNvcnRPcmRlci5sZW5ndGg9PTA/YXJyYXk6dGhpcy5zdHJDb252ZXJ0KGFycmF5KTtcXG4gICAgYXJyYXkgPSB0aGlzLnN0ckNvbnZlcnQoYXJyYXksIG9iai5zcCk7XFxuXFxuICAgIGlmIChhcnJheS5sZW5ndGggPiA2KSB7XFxuICAgICAgYXJyYXkgPSBhcnJheS5zbGljZSgwLCA2KTtcXG4gICAgfVxcblxcbiAgICB2YXIgdGl0bGVzID0gW107XFxuICAgIHZhciBkZXNjcyA9IFtdO1xcblxcbiAgICBzd2l0Y2ggKGFycmF5Lmxlbmd0aCkge1xcbiAgICAgIGNhc2UgMjpcXG4gICAgICAgIHRpdGxlcyA9IGFycmF5WzBdO1xcbiAgICAgICAgZGVzY3MgPSBhcnJheVsxXTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICAgIGNhc2UgMzpcXG4gICAgICAgIHRpdGxlcyA9IGFycmF5LnNsaWNlKDAsIDEpO1xcbiAgICAgICAgZGVzY3MgPSBhcnJheS5zbGljZSgxKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICAgIGNhc2UgNDpcXG4gICAgICBjYXNlIDU6XFxuICAgICAgICB0aXRsZXMgPSBhcnJheS5zbGljZSgwLCAyKTtcXG4gICAgICAgIGRlc2NzID0gYXJyYXkuc2xpY2UoMik7XFxuICAgICAgICBicmVhaztcXG4gICAgICBjYXNlIDY6XFxuICAgICAgZGVmYXVsdDpcXG4gICAgICAgIHRpdGxlcyA9IGFycmF5LnNsaWNlKDAsIDMpO1xcbiAgICAgICAgZGVzY3MgPSBhcnJheS5zbGljZSgzKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICB9XFxuICAgIHN0b3JhZ2UwLnB1dE15VmFyKCdlcl9pbmZvJywge1xcbiAgICAgIGRlc2M6IGRlc2NzLmpvaW4oJ1xcXFxuJyksXFxuICAgICAgaW1nOiBpbWcsXFxuICAgIH0pXFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6ICc8Yj4nK3RpdGxlc1swXS5mb250Y29sb3IoY3VzdG9tLuagh+mimOminOiJsikrJzwvYj4nK3RoaXMuc21hbGwoICdcXFxcbicgKyB0aXRsZXMuc2xpY2UoMSwgMykuam9pbignXFxcXG4nKSwgY3VzdG9tLuaPj+i/sOS4iiksXFxuICAgICAgZGVzYzogdGhpcy5zbWFsbChkZXNjcy5qb2luKCdcXFxcbicpLCBjdXN0b20u5o+P6L+w5LiLKSxcXG4gICAgICBwaWNfdXJsOiBpbWcgKyAnQFJlZmVyZXI9JyxcXG4gICAgICB1cmw6IE1ZX1VSTCxcXG4gICAgICBjb2xfdHlwZTogJ21vdmllXzFfdmVydGljYWxfcGljX2JsdXInLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogXFxcImRldGFpbGlkXFxcIixcXG4gICAgICAgIGdyYWRpZW50OiBvYmou5riQ5Y+YID8gb2JqLua4kOWPmCA6IGZhbHNlLFxcbiAgICAgIH1cXG4gICAgfSlcXG4gICAgaWYgKG9iai5kZXNjICE9IHVuZGVmaW5lZCkge1xcbiAgICAgIHRoaXMuc2V0RGVzYyhvYmouZGVzYywgbnVtKTtcXG4gICAgfVxcbiAgfSxcXG4gIHNldEN1c3RvbTogZnVuY3Rpb24gKG9iaiwgaW1nLGNvbG9ycykge1xcbiAgICB2YXIgYXJyYXkgPSBbXTtcXG4gICAgaWYgKG9iai5jb25zdHJ1Y3RvciA9PSBBcnJheSkge1xcbiAgICAgIGFycmF5ID0gb2JqO1xcbiAgICB9XFxuICAgIHZhciB0aXRsZXMgPSBbXTtcXG4gICAgdmFyIGRlc2NzID0gW107XFxuICAgIGlmKCd0aXRsZXMnIGluIG9iail7XFxuICAgICAgdGl0bGVzPW9iai50aXRsZXM7XFxuICAgIH1cXG4gICAgaWYoJ2Rlc2NzJyBpbiBvYmope1xcbiAgICAgIGRlc2NzPW9iai5kZXNjcztcXG4gICAgfVxcbiAgICBcXG4gICAgaWYodGl0bGVzLmxlbmd0aD09MCYmZGVzY3MubGVuZ3RoPT0wKXtcXG4gICAgYXJyYXkgPSB0aGlzLnN0ckNvbnZlcnQoYXJyYXkpO1xcbiAgICBzd2l0Y2ggKGFycmF5Lmxlbmd0aCkge1xcbiAgICAgIGNhc2UgMjpcXG4gICAgICAgIHRpdGxlcyA9IGFycmF5WzBdO1xcbiAgICAgICAgZGVzY3MgPSBhcnJheVsxXTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICAgIGNhc2UgMzpcXG4gICAgICAgIHRpdGxlcyA9IGFycmF5LnNsaWNlKDAsIDEpO1xcbiAgICAgICAgZGVzY3MgPSBhcnJheS5zbGljZSgxKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICAgIGNhc2UgNDpcXG4gICAgICBjYXNlIDU6XFxuICAgICAgICB0aXRsZXMgPSBhcnJheS5zbGljZSgwLCAyKTtcXG4gICAgICAgIGRlc2NzID0gYXJyYXkuc2xpY2UoMik7XFxuICAgICAgICBicmVhaztcXG4gICAgICBjYXNlIDY6XFxuICAgICAgICB0aXRsZXMgPSBhcnJheS5zbGljZSgwLCAzKTtcXG4gICAgICAgIGRlc2NzID0gYXJyYXkuc2xpY2UoMyk7XFxuICAgICAgICBicmVhaztcXG4gICAgICB9XFxuICAgIH1cXG4gICAgXFxuICAgIFxcbiAgICBzdG9yYWdlMC5wdXRNeVZhcignZXJfaW5mbycsIHtcXG4gICAgICBkZXNjOiBkZXNjcy5qb2luKCdcXFxcbicpLFxcbiAgICAgIGltZzogaW1nLFxcbiAgICB9KVxcbiAgICBpZiAoY29sb3JzICE9IHVuZGVmaW5lZCkge1xcbiAgICAgIHZhciBjb2xvcl9saXN0PVtdO1xcblxcbiAgICAgIGZvciAodmFyIGtleSBpbiBjb2xvcnMpIHtcXG4gICAgICB2YXIgcmFuZ2UgPSBrZXkuc3BsaXQoJy0nKTtcXG4gICAgICB2YXIgc3RhcnQgPSBwYXJzZUludChyYW5nZVswXSk7XFxuICAgICAgdmFyIGVuZCA9IHJhbmdlWzFdID8gcGFyc2VJbnQocmFuZ2VbMV0pIDogc3RhcnQ7XFxuICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XFxuICAgICAgICBjb2xvcl9saXN0W2ktMV0gPSBjb2xvcnNba2V5XTtcXG4gICAgICAgIH1cXG4gICAgICB9XFxuXFxuICAgICAgXFxuICAgICAgaWYoY29sb3JfbGlzdCE9dGl0bGVzLmxlbmd0aCtkZXNjcy5sZW5ndGgpe1xcbiAgICAgICAgY29uc3QgZmlsbENvdW50ID0gKHRpdGxlcy5sZW5ndGgrZGVzY3MubGVuZ3RoKSAtIGNvbG9yX2xpc3QubGVuZ3RoOyAvLyDpnIDopoHooaXpvZDnmoTkuKrmlbBcXG4gICAgICAgIGNvbnN0IGZpbGxlZEFyciA9IEFycmF5KGZpbGxDb3VudCkuZmlsbCh7fSk7IC8vIOeUn+aIkOWhq+WFheaVsOe7hFxcbiAgICAgICAgY29sb3JfbGlzdD1jb2xvcl9saXN0LmNvbmNhdChmaWxsZWRBcnIpO1xcbiAgICAgIH1cXG4gIFxcbiAgICAgIHZhciBtaWRJbmRleCA9IE1hdGguZmxvb3IoY29sb3JfbGlzdC5sZW5ndGggLyAyKTsgXFxuICAgICAgdmFyIGZpcnN0SGFsZiA9IGNvbG9yX2xpc3Quc2xpY2UoMCwgbWlkSW5kZXgpO1xcbiAgICAgIHZhciBzZWNvbmRIYWxmID0gY29sb3JfbGlzdC5zbGljZShtaWRJbmRleCk7XFxuICAgICAgICAgICBcXG4gICAgICBmdW5jdGlvbiB0ZXh0QXJyYXkoc3R5bGUsdGV4dEFycmF5KSB7XFxuICAgICAgICB2YXIgbGlzdD1bXTtcXG4gICAgICAgIHN0eWxlLmZvckVhY2goKHgsIGkpID0+IHtcXG4gICAgICAgIHZhciBsZWZ0ID0gW107XFxuICAgICAgICB2YXIgcmlnaHQgPSBbXTtcXG4gICAgICAgIHZhciBzdHIgPSB0ZXh0QXJyYXlbaV07XFxuICAgICAgICBPYmplY3Qua2V5cyh4KS5mb3JFYWNoKGsgPT4ge1xcbiAgICAgICAgICAgIHN3aXRjaCAoaykge1xcbiAgICAgICAgICAgICAgICBjYXNlICdjb2xvcic6XFxuICAgICAgICAgICAgICAgICAgICBsZWZ0LnB1c2goJzxmb250IGNvbG9yPVxcXCInICsgeFtrXSArICdcXFwiPicpO1xcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQucHVzaCgnPC9mb250PicpO1xcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XFxuICAgICAgICAgICAgICAgICAgICBsZWZ0LnB1c2goYDwke2t9PmApO1xcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQucHVzaChgPC8ke2t9PmApO1xcbiAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgIGxpc3RbaV0gPSBsZWZ0LmpvaW4oJycpICsgc3RyICsgcmlnaHQuam9pbignJyk7XFxuICAgICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIGxpc3Q7XFxuICAgICAgfVxcbiAgICAgIHRpdGxlcz10ZXh0QXJyYXkoZmlyc3RIYWxmLHRpdGxlcyk7XFxuICAgICAgZGVzY3M9dGV4dEFycmF5KHNlY29uZEhhbGYsZGVzY3MpO1xcbiAgICAgIFxcbiAgICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTon4oCc4oCc4oCd4oCdJyt0aXRsZXNbMF0rJ1xcXFxuJyt0aXRsZXMuc2xpY2UoMSwzKS5qb2luKCdcXFxcbicpLFxcbiAgICAgICAgZGVzYzon4oCc4oCc4oCd4oCdJytkZXNjcy5qb2luKCdcXFxcbicpLFxcbiAgICAgICAgaW1nOmltZysnQFJlZmVyZXI9JytpbWcsXFxuICAgICAgICB1cmw6TVlfVVJMLFxcbiAgICAgICAgY29sX3R5cGU6J21vdmllXzFfdmVydGljYWxfcGljX2JsdXInLFxcbiAgICAgICAgZXh0cmE6e1xcbiAgICAgICAgICBpZDpcXFwiZGV0YWlsaWRcXFwiLFxcbiAgICAgICAgfVxcbiAgICAgIH0pXFxuICAgICAgXFxuICAgIH0gZWxzZSB7XFxuICAgICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiB0aXRsZXNbMF0gKyAnXFxcXG4nICsgdGhpcy5zbWFsbCh0aXRsZXMuc2xpY2UoMSwgMykuam9pbignXFxcXG4nKSksXFxuICAgICAgICBkZXNjOiB0aGlzLnNtYWxsKGRlc2NzLmpvaW4oJ1xcXFxuJykpLFxcbiAgICAgICAgcGljX3VybDogaW1nICsgJ0BSZWZlcmVyPScsXFxuICAgICAgICB1cmw6IE1ZX1VSTCxcXG4gICAgICAgIGNvbF90eXBlOiAnbW92aWVfMV92ZXJ0aWNhbF9waWNfYmx1cicsXFxuICAgICAgICBleHRyYTp7XFxuICAgICAgICAgIGlkOiBcXFwiZGV0YWlsaWRcXFwiLFxcbiAgICAgICAgfVxcbiAgICAgIH0pXFxuICB9XFxuICB9LFxcbiAgaXNDb2xvcjogZnVuY3Rpb24gKHRleHQpIHtcXG4gICAgY29uc3QgcmVnZXggPSAvXiMoWzAtOUEtRmEtZl17M318WzAtOUEtRmEtZl17Nn0pJHxeKFthLXpdKykkL2k7XFxuICAgIHJldHVybiByZWdleC50ZXN0KHRleHQpO1xcbiAgfSxcXG4gIGdldFByZXNldDogZnVuY3Rpb24gKGN1c3RvbSkge1xcbiAgICBpZiAodHlwZW9mIGN1c3RvbXMgPT0gJ29iamVjdCcgJiYgIWN1c3RvbSkge1xcbiAgICAgIGN1c3RvbSA9IGN1c3RvbXM7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgY3VzdG9tID0gY3VzdG9tID8gY3VzdG9tIDoge31cXG4gICAgfVxcbiAgICBjdXN0b20u5q2j5bqP6aKc6ImyID0gKGN1c3RvbS7mraPluo/popzoibIgJiYgdGhpcy5pc0NvbG9yKGN1c3RvbS7mraPluo/popzoibIpKSA/IGN1c3RvbS7mraPluo/popzoibIgOiAnIzFBQUQxOSc7XFxuICAgIGN1c3RvbS7pgIbluo/popzoibIgPSAoY3VzdG9tLumAhuW6j+minOiJsiAmJiB0aGlzLmlzQ29sb3IoY3VzdG9tLumAhuW6j+minOiJsikpID8gY3VzdG9tLumAhuW6j+minOiJsiA6ICcjRkYwMDAwJztcXG4gICAgY3VzdG9tLuWbvuaghyA9IGN1c3RvbS7lm77moIcgPyBjdXN0b20u5Zu+5qCHIDogJ2h0dHBzOi8vaTIuMTAwMDI0Lnh5ei8yMDIzLzA2LzEwL2g0ejYyNy53ZWJwJztcXG4gICAgY3VzdG9tLue6v+i3r+mAieS4rSA9IGN1c3RvbS7nur/ot6/pgInkuK0gPyBjdXN0b20u57q/6Lev6YCJ5LitIDogJyMwMDhCOEInO1xcbiAgICBjdXN0b20u57q/6Lev5qC35byPID0gY3VzdG9tLue6v+i3r+agt+W8jyA/IGN1c3RvbS7nur/ot6/moLflvI8gOiAnc2Nyb2xsX2J1dHRvbic7XFxuICAgIGN1c3RvbS7liIblibLmoLflvI8gPSBjdXN0b20u5YiG5Ymy5qC35byPID8gY3VzdG9tLuWIhuWJsuagt+W8jyA6ICdibGFua19ibG9jayc7XFxuICAgIGN1c3RvbS7nroDku4vlsZXlvIAgPSBjdXN0b20u566A5LuL5bGV5byAID8gY3VzdG9tLueugOS7i+WxleW8gCA6ICdibGFjayc7XFxuICAgIGN1c3RvbS7nroDku4vmlLbotbcgPSBjdXN0b20u566A5LuL5pS26LW3ID8gY3VzdG9tLueugOS7i+aUtui1tyA6ICdncmV5JztcXG4gICAgT2JqZWN0LmFzc2lnbih7fSwgY3VzdG9tcywgY3VzdG9tKTtcXG4gICAgLy9sb2coY3VzdG9tKVxcbiAgICByZXR1cm4gY3VzdG9tO1xcbiAgfSxcXG4gIGNyZWF0ZVBMaXN0OiBmdW5jdGlvbiAodGFicywgdmFyaSwgc2hzb3J0LCBjdXN0b20sIHBhcnNlKSB7XFxuICAgIHZhcmkgPSBcXFwiZXJfXFxcIiArIHZhcmk7XFxuICAgIGxldCBzdGFicyA9IHRhYnM7XFxuICAgIHRhYnMgPSB0YWJzLm1hcCh4ID0+IHgudGl0bGUhPXVuZGVmaW5lZD94LnRpdGxlOngpO1xcbiAgICB2YXIgaW5mbyA9IHsgcGFyc2U6IHBhcnNlLCBtYXJrOiBzaHNvcnQgfTtcXG4gICAgaWYgKHN0YWJzLnNvbWUoeCA9PiB4Lmhhc093blByb3BlcnR5KCd1cmwnKSkpIHtcXG4gICAgICBpbmZvWyd1cmxzJ10gPSBzdGFicy5tYXAoeCA9PiB4LnVybCk7XFxuICAgIH1cXG5cXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWJzLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgdmFyIHVybCA9ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHZhcmksIHNoc29ydCwgaSwgbGluZWMsIGluZm8pID0+IHtcXG5cXG4gICAgICAgIHZhciBsaXN0cyA9IHN0b3JhZ2UwLmdldE15VmFyKHNoc29ydCArICdfbGlzdCcsICdbXScpO1xcblxcbiAgICAgICAgaWYgKGdldE15VmFyKHZhcmkgKyAnZm9sZCcsICcxJykgPT0gJzAnKSB7XFxuICAgICAgICAgIHZhciBidG4gPSBmaW5kSXRlbShzaHNvcnQgKyAnX2J1dHRvbicpO1xcbiAgICAgICAgICB2YXIgZm9sZHMgPSBbJzxmb250IGNvbG9yPVxcXCIjRDNEM0QzXFxcIj7imLcnLCAnPGZvbnQgY29sb3I9XFxcIiNGRkE1MDBcXFwiPuKYsCddO1xcbiAgICAgICAgICB2YXIgcGxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcignZXJfcGxheWxpc3RzJywgJ3t9Jyk7XFxuXFxuICAgICAgICAgIHZhciBjb2wgPSBwbGlzdFtzaHNvcnRdLmNvbF90eXBlO1xcbiAgICAgICAgICB2YXIgY2xzID0gcGxpc3Rbc2hzb3J0XS5jbHM7XFxuICAgICAgICAgIHZhciBwaWMgPSBwbGlzdFtzaHNvcnRdLnBpYztcXG4gICAgICAgICAgdmFyIGV4dHJhID0gcGxpc3Rbc2hzb3J0XS5leHRyYTtcXG4gICAgICAgICAgLy9sb2coZXh0cmEpXFxuICAgICAgICAgIHVwZGF0ZUl0ZW0oYnRuLmV4dHJhLmlkLCB7XFxuICAgICAgICAgICAgdGl0bGU6IGJ0bi50aXRsZS5yZXBsYWNlKGZvbGRzWzBdLCBmb2xkc1sxXSksXFxuICAgICAgICAgIH0pXFxuXFxuICAgICAgICAgIHB1dE15VmFyKHZhcmkgKyAnZm9sZCcsICcxJyk7XFxuICAgICAgICAgIC8vcmV0dXJuICd0b2FzdDovL+WxleW8gOaJjeiDveaTjeS9nCc7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICB2YXIgcGxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcignZXJfcGxheWxpc3RzJywgJ3t9Jyk7XFxuXFxuICAgICAgICAgIHZhciBjb2wgPSBwbGlzdFtzaHNvcnRdLmNvbF90eXBlO1xcbiAgICAgICAgICB2YXIgY2xzID0gcGxpc3Rbc2hzb3J0XS5jbHM7XFxuICAgICAgICAgIHZhciBwaWMgPSBwbGlzdFtzaHNvcnRdLnBpYztcXG4gICAgICAgICAgdmFyIGV4dHJhID0gcGxpc3Rbc2hzb3J0XS5leHRyYTtcXG4gICAgICAgICAgLy9sb2coZXh0cmEpXFxuICAgICAgICB9XFxuICAgICAgICBwdXRNeVZhcih2YXJpLCBpKTtcXG5cXG4gICAgICAgIHZhciB4bGlzdCA9IGxpc3RzW2ldO1xcbiAgICAgICAgaWYgKCQuZnVuYyAhPSB1bmRlZmluZWQgJiYgJC5mdW5jLmNvbnN0cnVjdG9yID09IEZ1bmN0aW9uKSB7XFxuICAgICAgICAgIGRlbGV0ZUl0ZW1CeUNscyhzaHNvcnQpO1xcbiAgICAgICAgICBhZGRJdGVtQWZ0ZXIoc2hzb3J0ICsgJ19saW5lJywge1xcbiAgICAgICAgICAgIGNvbF90eXBlOiAncGljXzEnLFxcbiAgICAgICAgICAgIGltZzogJ2h0dHBzOi8vaW1nLm5pY2t5YW0uY29tL2ZpbGUvZmU0MWE3YTE3NDRhM2E4MTk0ZGYyLmdpZicsXFxuICAgICAgICAgICAgdXJsOiAndG9hc3Q6Ly9sb2FkaW5nJyxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgY2xzOiBzaHNvcnRcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH0pXFxuICAgICAgICAgIHhsaXN0ID0gJC5mdW5jKGksIGluZm8pO1xcbiAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihzaHNvcnQgKyAnX2xpc3QnLCB4bGlzdCk7XFxuICAgICAgICB9XFxuICAgICAgICB2YXIgcGxheXMgPSB4bGlzdC5tYXAoeCA9PiB7XFxuICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgdGl0bGU6IHgudGl0bGUsXFxuICAgICAgICAgICAgdXJsOiB4LnVybCxcXG4gICAgICAgICAgICBjb2xfdHlwZTogY29sLFxcbiAgICAgICAgICAgIHBpYzogcGljLFxcbiAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHt9LCBleHRyYSwge1xcbiAgICAgICAgICAgICAgaWQ6IHgudXJsLnJlcGxhY2UoL0BsYXp5UnVsZVtcXFxcc1xcXFxTXSsvZywgJycpLFxcbiAgICAgICAgICAgICAgY2xzOiBjbHMsXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgICAgIGlmIChnZXRNeVZhcihzaHNvcnQgKyAnX3NvcnQnKSA9PSAnMScpIHtcXG4gICAgICAgICAgcGxheXMucmV2ZXJzZSgpO1xcbiAgICAgICAgfVxcbiAgICAgICAgdmFyIHBjZmcgPSBzdG9yYWdlMC5nZXRNeVZhcihzaHNvcnQgKyAnX3B1c2hjZmcnLCAne30nKTtcXG4gICAgICAgIGlmIChwY2ZnWyfljZXmjqgnXSkge1xcbiAgICAgICAgICB1cGRhdGVJdGVtKHNoc29ydCArICdfcHVzaCcsIHtcXG4gICAgICAgICAgICB0aXRsZTogcGNmZ1snb2JqJ11bJ+WNleaOqCddWzBdXFxuICAgICAgICAgIH0pXFxuICAgICAgICAgIHBjZmdbJ+WNleaOqCddID0gZmFsc2U7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAocGNmZ1sn6YCJ5o6oJ10pIHtcXG4gICAgICAgICAgdXBkYXRlSXRlbShzaHNvcnQgKyAnX3B1c2hzJywge1xcbiAgICAgICAgICAgIHRpdGxlOiBwY2ZnWydvYmonXVsn6YCJ5o6oJ11bMF1cXG4gICAgICAgICAgfSlcXG4gICAgICAgICAgcGNmZ1sn6YCJ5o6oJ10gPSBmYWxzZTtcXG4gICAgICAgIH1cXG4gICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKHNoc29ydCArICdfcHVzaGNmZycsIHBjZmcpO1xcbiAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKHNoc29ydCk7XFxuICAgICAgICBhZGRJdGVtQWZ0ZXIoc2hzb3J0ICsgJ19saW5lJywgcGxheXMpO1xcblxcbiAgICAgICAgdmFyIHRhYnggPSBmaW5kSXRlbXNCeUNscyhzaHNvcnQgKyAnX3RhYicpO1xcbiAgICAgICAgdGFieC5mb3JFYWNoKCh4LCBpaSkgPT4ge1xcbiAgICAgICAgICB2YXIgdGl0bGUgPSB4LnRpdGxlO1xcbiAgICAgICAgICBpZiAoaSA9PSBpaSkge1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oeC5leHRyYS5pZCwge1xcbiAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLnJlcGxhY2UoLyMoXFxcXHcrKT8vZywgbGluZWMpLFxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh4LmV4dHJhLmlkLCB7XFxuICAgICAgICAgICAgICB0aXRsZTogdGl0bGUucmVwbGFjZSgvIyhcXFxcdyspPy9nLCAnIycpLFxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgIH1cXG4gICAgICAgIH0pXFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5YiH5o2i5oiQ5Yqf77yBJztcXG4gICAgICB9LCB2YXJpLCBzaHNvcnQsIGksIGN1c3RvbS7nur/ot6/pgInkuK0sIGluZm8pXFxuICAgICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIChnZXRNeVZhcih2YXJpLCAnMCcpID09IGkgPyB0YWJzW2ldLmZvbnRjb2xvcihjdXN0b20u57q/6Lev6YCJ5LitKSA6IHRhYnNbaV0uZm9udGNvbG9yKCcjJykpLFxcbiAgICAgICAgdXJsOiB1cmwsXFxuICAgICAgICBjb2xfdHlwZTogY3VzdG9tLue6v+i3r+agt+W8jyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgIGNsczogc2hzb3J0ICsgJ190YWInLFxcbiAgICAgICAgICBpZDogc2hzb3J0ICsgJ190YWJfJyArIGksXFxuICAgICAgICB9XFxuICAgICAgfSlcXG4gICAgfVxcbiAgICBkLnB1c2goe1xcbiAgICAgIGNvbF90eXBlOiBjdXN0b20u5YiG5Ymy5qC35byPLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogc2hzb3J0ICsgJ19saW5lJyxcXG4gICAgICB9XFxuICAgIH0pXFxuICB9LFxcbiAgcHVzaFRhYjogZnVuY3Rpb24gKHZhcmksIHNoc29ydCkge1xcbiAgICBhZGRMaXN0ZW5lcignb25SZWZyZXNoJywgJC50b1N0cmluZygoc2hzb3J0KSA9PiB7XFxuICAgICAgY2xlYXJNeVZhcihzaHNvcnQgKyAnX3B1c2hjZmcnKTtcXG4gICAgICBjbGVhck15VmFyKHNoc29ydCArICdfZHVvc2VsZWN0Jyk7XFxuICAgIH0sIHNoc29ydCkpXFxuICAgIHZhciBwb2JqID0ge1xcbiAgICAgICfljZXmjqgnOiBbJ+Kmv+WNleaOqCcsICc8Yj7ipr/ljZXmjqg8L2I+Jy5mb250Y29sb3IoJyMwMEZBOUEnKV0sXFxuICAgICAgJ+mAieaOqCc6IFsn4piR6YCJ5o6oJywgJzxiPuKYkemAieaOqDwvYj4nLmZvbnRjb2xvcignIzQ2ODJCNCcpXSxcXG4gICAgfVxcblxcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiAn4oyYJyxcXG4gICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgIHVybDogJ2hpa2VyOi8vZW1wdHknLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBjbHM6IHNoc29ydCArICdfcHVzaHRhYicsXFxuICAgICAgfVxcbiAgICB9LCB7XFxuICAgICAgdGl0bGU6IHBvYmpbJ+WNleaOqCddWzBdLFxcbiAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChzaHNvcnQsIHBvYmosIHZhcmkpID0+IHtcXG4gICAgICAgIGlmIChnZXRNeVZhcih2YXJpICsgJ2ZvbGQnLCAnMScpID09ICcwJykge1xcbiAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5bGV5byA5omN6IO95pON5L2cJztcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIHZhciB0aXRsZXMgPSBwb2JqWyfljZXmjqgnXTtcXG4gICAgICAgIHZhciBwY2ZnID0gc3RvcmFnZTAuZ2V0TXlWYXIoc2hzb3J0ICsgJ19wdXNoY2ZnJywgJ3t9Jyk7XFxuICAgICAgICBwY2ZnWydvYmonXSA9IHBvYmo7XFxuICAgICAgICB2YXIg5Y2V5o6oID0gcGNmZ1sn5Y2V5o6oJ10gPyBwY2ZnWyfljZXmjqgnXSA6IGZhbHNlO1xcblxcbiAgICAgICAgaWYgKOWNleaOqCkge1xcbiAgICAgICAgICB1cGRhdGVJdGVtKHNoc29ydCArICdfcHVzaCcsIHtcXG4gICAgICAgICAgICB0aXRsZTogdGl0bGVzWzBdLFxcbiAgICAgICAgICB9KVxcbiAgICAgICAgICBwY2ZnWyfljZXmjqgnXSA9IGZhbHNlO1xcbiAgICAgICAgICBwY2ZnWydwbGF5bGlzdCddLm1hcCgoeCkgPT4ge1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oeC5leHRyYS5pZCwge1xcbiAgICAgICAgICAgICAgdXJsOiB4LnVybCxcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgICB9KVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgdXBkYXRlSXRlbShzaHNvcnQgKyAnX3B1c2gnLCB7XFxuICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgdGl0bGVzWzFdLFxcbiAgICAgICAgICB9KVxcbiAgICAgICAgICB1cGRhdGVJdGVtKHNoc29ydCArICdfcHVzaHMnLCB7XFxuICAgICAgICAgICAgdGl0bGU6IHBvYmpbJ+mAieaOqCddWzBdLFxcbiAgICAgICAgICB9KVxcbiAgICAgICAgICBwY2ZnWyfljZXmjqgnXSA9IHRydWU7XFxuICAgICAgICAgIHBjZmdbJ+mAieaOqCddID0gZmFsc2U7XFxuICAgICAgICAgIHZhciBwbGF5bGlzdCA9IGZpbmRJdGVtc0J5Q2xzKHNoc29ydCk7XFxuICAgICAgICAgIHBjZmdbJ3BsYXlsaXN0J10gPSBwbGF5bGlzdDtcXG4gICAgICAgICAgZmluZEl0ZW1zQnlDbHMoc2hzb3J0KS5tYXAoeCA9PiB7XFxuICAgICAgICAgICAgdmFyIGRwdXNoID0ge1xcbiAgICAgICAgICAgICAgbmFtZTogZ2V0UGFnZVRpdGxlKCksXFxuICAgICAgICAgICAgICB1cmw6IHgudGl0bGUgKyAnJCcgKyB4LmV4dHJhLmlkXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oeC5leHRyYS5pZCwge1xcbiAgICAgICAgICAgICAgdXJsOiAkKCcnKS5sYXp5UnVsZSgoZHB1c2gpID0+IHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL3BhZ2UvcHVzaD9ydWxlPVhZUeaOqOmAgSZwdXNodXJsPScgKyBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoZHB1c2gpKTtcXG4gICAgICAgICAgICAgIH0sIGRwdXNoKVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgIH0pXFxuICAgICAgICB9XFxuICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihzaHNvcnQgKyAnX3B1c2hjZmcnLCBwY2ZnKTtcXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly8nICsgKCHljZXmjqggPyAn5Y2V5o6o5byA5ZCvJyA6ICfljZXmjqjlhbPpl60nKTtcXG4gICAgICB9LCBzaHNvcnQsIHBvYmosIHZhcmkpLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogc2hzb3J0ICsgJ19wdXNoJyxcXG4gICAgICAgIGNsczogc2hzb3J0ICsgJ19wdXNodGFiJyxcXG4gICAgICB9XFxuICAgIH0sIHtcXG4gICAgICB0aXRsZTogcG9ialsn6YCJ5o6oJ11bMF0sXFxuICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHNoc29ydCwgcG9iaiwgdmFyaSkgPT4ge1xcbiAgICAgICAgaWYgKGdldE15VmFyKHZhcmkgKyAnZm9sZCcsICcxJykgPT0gJzAnKSB7XFxuICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/lsZXlvIDmiY3og73mk43kvZwnO1xcbiAgICAgICAgfVxcbiAgICAgICAgdmFyIHRpdGxlcyA9IHBvYmpbJ+mAieaOqCddO1xcbiAgICAgICAgdmFyIHBjZmcgPSBzdG9yYWdlMC5nZXRNeVZhcihzaHNvcnQgKyAnX3B1c2hjZmcnLCAne30nKTtcXG4gICAgICAgIHBjZmdbJ29iaiddID0gcG9iajtcXG4gICAgICAgIHZhciDpgInmjqggPSBwY2ZnWyfpgInmjqgnXSA/IHBjZmdbJ+mAieaOqCddIDogZmFsc2U7XFxuICAgICAgICBpZiAo6YCJ5o6oKSB7XFxuICAgICAgICAgIHVwZGF0ZUl0ZW0oc2hzb3J0ICsgJ19wdXNocycsIHtcXG4gICAgICAgICAgICB0aXRsZTogdGl0bGVzWzBdLFxcbiAgICAgICAgICB9KVxcbiAgICAgICAgICBwY2ZnWyfpgInmjqgnXSA9IGZhbHNlO1xcbiAgICAgICAgICBwY2ZnWydwbGF5bGlzdCddLm1hcCgoeCkgPT4ge1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oeC5leHRyYS5pZCwge1xcbiAgICAgICAgICAgICAgdGl0bGU6IHgudGl0bGUsXFxuICAgICAgICAgICAgICB1cmw6IHgudXJsLFxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgIH0pXFxuICAgICAgICAgIHVwZGF0ZUl0ZW0oc2hzb3J0ICsgJ19wdXNodG8nLCB7XFxuICAgICAgICAgICAgdGl0bGU6ICfmjqjpgIHmnKzpobU9PlRWQm94JyxcXG4gICAgICAgICAgfSk7XFxuICAgICAgICAgIGNsZWFyTXlWYXIoc2hzb3J0ICsgJ19kdW9zZWxlY3QnKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIHVwZGF0ZUl0ZW0oc2hzb3J0ICsgJ19wdXNocycsIHtcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyB0aXRsZXNbMV0sXFxuICAgICAgICAgIH0pXFxuICAgICAgICAgIHBjZmdbJ+mAieaOqCddID0gdHJ1ZTtcXG4gICAgICAgICAgcGNmZ1sn5Y2V5o6oJ10gPSBmYWxzZTtcXG4gICAgICAgICAgdmFyIHBsYXlsaXN0ID0gZmluZEl0ZW1zQnlDbHMoc2hzb3J0KTtcXG4gICAgICAgICAgcGNmZ1sncGxheWxpc3QnXSA9IHBsYXlsaXN0O1xcbiAgICAgICAgICBsZXQgSWRzID0gcGxheWxpc3QubWFwKGl0ID0+IGl0LmV4dHJhLmlkKTtcXG4gICAgICAgICAgSWRzLmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgdmFyIHRpdGxlID0gZmluZEl0ZW0oeCkudGl0bGU7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh4LCB7XFxuICAgICAgICAgICAgICB1cmw6ICQubXNtKHRpdGxlLCB4LCBzaHNvcnQpLFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICB9KTtcXG4gICAgICAgICAgdXBkYXRlSXRlbShzaHNvcnQgKyAnX3B1c2gnLCB7XFxuICAgICAgICAgICAgdGl0bGU6IHBvYmpbJ+WNleaOqCddWzBdLFxcbiAgICAgICAgICB9KVxcbiAgICAgICAgICB1cGRhdGVJdGVtKHNoc29ydCArICdfcHVzaHRvJywge1xcbiAgICAgICAgICAgIHRpdGxlOiAn5o6o6YCB6YCJ5LitPT5UVkJveCcsXFxuICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoc2hzb3J0ICsgJ19wdXNoY2ZnJywgcGNmZyk7XFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJyArICgh6YCJ5o6oID8gJ+mAieaOqOW8gOWQrycgOiAn6YCJ5o6o5YWz6ZetJyk7XFxuICAgICAgfSwgc2hzb3J0LCBwb2JqLCB2YXJpKSxcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IHNoc29ydCArICdfcHVzaHMnLFxcbiAgICAgICAgY2xzOiBzaHNvcnQgKyAnX3B1c2h0YWInXFxuICAgICAgfVxcbiAgICB9LCB7XFxuICAgICAgdGl0bGU6IFxcXCLmjqjpgIHmnKzpobU9PlRWQm94XFxcIixcXG4gICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoc2hzb3J0LCB2YXJpKSA9PiB7XFxuICAgICAgICB2YXIgcGNmZyA9IHN0b3JhZ2UwLmdldE15VmFyKHNoc29ydCArICdfcHVzaGNmZycsICd7fScpO1xcbiAgICAgICAgdmFyIOWNleaOqCA9IHBjZmdbJ+WNleaOqCddID8gcGNmZ1sn5Y2V5o6oJ10gOiBmYWxzZTtcXG4gICAgICAgIHZhciDpgInmjqggPSBwY2ZnWyfpgInmjqgnXSA/IHBjZmdbJ+mAieaOqCddIDogZmFsc2U7XFxuICAgICAgICBpZiAoIeWNleaOqCAmJiAh6YCJ5o6oKSB7XFxuICAgICAgICAgIHZhciB0YWJzID0gc3RvcmFnZTAuZ2V0TXlWYXIoc2hzb3J0ICsgJ190YWJzJywgJ1tdJyk7XFxuICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgdmFyIHBscyA9IHN0b3JhZ2UwLmdldE15VmFyKHNoc29ydCArICdfbGlzdCcsICdbXScpLm1hcChsaSA9PiB7XFxuICAgICAgICAgICAgICByZXR1cm4gbGkubWFwKGl0ZW0gPT4gaXRlbS50aXRsZSArICckJyArIGl0ZW0udXJsLnJlcGxhY2UoL0BsYXp5UnVsZVtcXFxcc1xcXFxTXSsvZywgJycpKS5qb2luKCcjJylcXG4gICAgICAgICAgICB9KS5qb2luKCckJCQnKTtcXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHZhciBwbHMgPSBzdG9yYWdlMC5nZXRNeVZhcihzaHNvcnQgKyBcXFwiX2xpc3RcXFwiLCAnW10nKS5tYXAoeCA9PiB4LnRpdGxlICsgXFxcIiRcXFwiICsgeC51cmwucmVwbGFjZSgvQGxhenlSdWxlW1xcXFxzXFxcXFNdKy9nLCAnJykpLmpvaW4oXFxcIiNcXFwiKTtcXG4gICAgICAgICAgICB2YXIgdGFicyA9IFt0YWJzW2dldE15VmFyKHZhcmksICcwJyldXTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICAvL2xvZyhwbHMpXFxuICAgICAgICAgIC8vbG9nKHRhYnMpXFxuICAgICAgICB9XFxuICAgICAgICBpZiAo6YCJ5o6oKSB7XFxuICAgICAgICAgIHZhciBwbHMgPSBzdG9yYWdlMC5nZXRNeVZhcihzaHNvcnQgKyBcXFwiX2R1b3NlbGVjdFxcXCIsICdbXScpLm1hcCh4ID0+IHgudGl0bGUgKyBcXFwiJFxcXCIgKyB4LnVybCkuam9pbihcXFwiI1xcXCIpO1xcbiAgICAgICAgICBpZiAocGxzLmxlbmd0aCA9PSAwKSB7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mAieaLqeS4uuepuic7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgdmFyIHRhYnMgPSBbJ+aSreaUvuWIl+ihqCddO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgdmFyIGluZm8gPSBzdG9yYWdlMC5nZXRNeVZhcignZXJfaW5mbycsICd7fScpO1xcbiAgICAgICAgdmFyIGRlc2MgPSBpbmZvWydkZXNjJ107XFxuICAgICAgICB2YXIg5o6o6YCBID0ge1xcbiAgICAgICAgICBcXFwibmFtZVxcXCI6IGdldFBhZ2VUaXRsZSgpLFxcbiAgICAgICAgICBcXFwiY29udGVudFxcXCI6IGRlc2MgfHwgJycsXFxuICAgICAgICAgIFxcXCJwaWNcXFwiOiBpbmZvWydpbWcnXSB8fCAnJyxcXG4gICAgICAgICAgXFxcImZyb21cXFwiOiB0YWJzLmpvaW4oJyQkJCcpLFxcbiAgICAgICAgICBcXFwidXJsXFxcIjogcGxzLFxcbiAgICAgICAgfVxcbiAgICAgICAgLy9sb2co5o6o6YCBKVxcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvcHVzaD9ydWxlPVhZUeaOqOmAgSZwdXNodXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnko5o6o6YCBKSlcXG4gICAgICB9LCBzaHNvcnQsIHZhcmkpLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogc2hzb3J0ICsgJ19wdXNodG8nLFxcbiAgICAgICAgY2xzOiBzaHNvcnQgKyAnX3B1c2h0YWInXFxuICAgICAgfVxcbiAgICB9LCB7XFxuICAgICAgY29sX3R5cGU6ICdibGFua19ibG9jaycsXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGNsczogc2hzb3J0ICsgJ19wdXNodGFiJyxcXG4gICAgICB9XFxuICAgIH0pXFxuICB9LFxcbiAgc2V0TG9uZ2NsaWNrOiBmdW5jdGlvbiAoc2hzb3J0LCBjdXN0b20pIHtcXG4gICAgcmV0dXJuIFt7XFxuICAgICAgdGl0bGU6ICfmoLflvI/wn46oJyxcXG4gICAgICBqczogJC50b1N0cmluZygoc2hzb3J0KSA9PiB7XFxuICAgICAgICBsZXQgYWxsX2NvbHMgPSBbJyddLmNvbmNhdChnZXRDb2xUeXBlcygpKTtcXG4gICAgICAgIGFsbF9jb2xzID0gYWxsX2NvbHMuZmlsdGVyKHggPT5cXG4gICAgICAgICAgLyh0ZXh0X3xmbGV4KS4qLy50ZXN0KHgpICYmIHggIT0gJ3RleHRfaWNvbicpO1xcbiAgICAgICAgLy9sb2coYWxsX2NvbHMpXFxuICAgICAgICBsZXQgY2xzID0gc3RvcmFnZTAuZ2V0TXlWYXIoJ2VyX3BsYXlsaXN0cycsICd7fScpIHx8XFxuICAgICAgICAgICcnO1xcbiAgICAgICAgaWYgKGNsc1tzaHNvcnRdICE9ICcnKSB7XFxuICAgICAgICAgIGNvbCA9IGNsc1tzaHNvcnRdLmNvbF90eXBlO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IOaMiemSruagt+W8jyA9IGFsbF9jb2xzLm1hcCgoaXQpID0+IHtcXG4gICAgICAgICAgcmV0dXJuIGl0ID09PSBjb2wgPyAn4p6h77iPJyArIGl0IDogaXQ7XFxuICAgICAgICB9KTtcXG4gICAgICAgIGxldCB0aXBzID0gJ+ivt+mAieaLqemAiembhuaMiemSruagt+W8jyc7XFxuICAgICAgICByZXR1cm4gJCjmjInpkq7moLflvI8sIDIsIHRpcHMpLnNlbGVjdCgoc2hzb3J0LCBjbHMpID0+IHtcXG4gICAgICAgICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC/inqHvuI8vZywgJycpO1xcbiAgICAgICAgICAvKnN0b3JhZ2UwLnNldEl0ZW0oJ+aMiemSruagt+W8jycsIGlucHV0KTsqL1xcbiAgICAgICAgICBsZXQgb2xkSWRzID0gKGZpbmRJdGVtc0J5Q2xzKHNoc29ydCkgfHwgW10pLm1hcChpdCA9PiBpdC5leHRyYS5pZCk7IC8v6ICB5YWD57SgaWRzXFxuICAgICAgICAgIG9sZElkcy5mb3JFYWNoKHggPT4ge1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oeCwge1xcbiAgICAgICAgICAgICAgY29sX3R5cGU6IGlucHV0XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgIH0pO1xcbiAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5bey5YiH5o2i6YCJ6ZuG5oyJ6ZKu5qC35byP5Li6OicgKyBpbnB1dDtcXG4gICAgICAgIH0sIHNoc29ydCwgY2xzKTtcXG4gICAgICB9LCBzaHNvcnQsIGN1c3RvbSlcXG4gICAgfV1cXG4gIH0sXFxuICBzZXRUYWJzOiBmdW5jdGlvbiAodGFicywgdmFyaSwgc2hzb3J0LCBwYXJzZSkge1xcbiAgICBsZXQgY3VzdG9tID0gcGFyc2Uu6Ieq5a6a5LmJO1xcbiAgICBsZXQgc3RhYnMgPSB0YWJzO1xcbiAgICB0YWJzID0gdGFicy5tYXAoeCA9PiB4LnRpdGxlIT11bmRlZmluZWQ/eC50aXRsZTp4KTtcXG5cXG4gICAgY3VzdG9tID0gdGhpcy5nZXRQcmVzZXQoY3VzdG9tKTtcXG5cXG4gICAgc2hzb3J0ID0gc2hzb3J0ID8gc2hzb3J0IDogJ3Noc29ydCc7XFxuICAgIHZhciB0aXRsZSA9IChnZXRNeVZhcihzaHNvcnQgKyAnX3NvcnQnLCAnMCcpID09ICcxJykgPyAnPGI+PHNwYW4gc3R5bGU9XFxcImNvbG9yOiAnICsgY3VzdG9tLumAhuW6j+minOiJsiArICdcXFwiPumAhuW6jzwvc3Bhbj48L2I+JyA6ICc8Yj48c3BhbiBzdHlsZT1cXFwiY29sb3I6ICcgKyBjdXN0b20u5q2j5bqP6aKc6ImyICsgJ1xcXCI+5q2j5bqPPC9zcGFuPjwvYj4nXFxuICAgIFxcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiB2YXJpICsgJzonICsgdGl0bGUsXFxuICAgICAgZGVzYzogJ+WFsScgKyBTdHJpbmcodGFicy5sZW5ndGgpLmZvbnRjb2xvcignIzQ2ODJCNCcpICsgJ+adoee6v+i3rycsXFxuICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChzaHNvcnQsIHZhcmksIGN1c3RvbSkgPT4ge1xcbiAgICAgICAgbGV0IGNvbmYgPSBnZXRNeVZhcihzaHNvcnQgKyAnX3NvcnQnLCAnMCcpO1xcbiAgICAgICAgaWYgKGdldE15VmFyKCdlcl8nICsgdmFyaSArICdmb2xkJywgJzEnKSA9PSAnMCcpIHtcXG4gICAgICAgICAgcmV0dXJuICd0b2FzdDovL+WxleW8gOaJjeiDveaTjeS9nCc7XFxuICAgICAgICB9XFxuICAgICAgICB2YXIgY2xzbGlzdHMgPSBmaW5kSXRlbXNCeUNscyhzaHNvcnQpO1xcbiAgICAgICAgdmFyIG5ld2Nsc2xpc3QgPSAkLmRhdGFDb252ZXJ0KGNsc2xpc3RzKTtcXG5cXG4gICAgICAgIHZhciB0aXRsZXMgPSBbYCR7Y3VzdG9tLuato+W6j+minOiJsn1cXFwiPuato+W6j2AsIGAke2N1c3RvbS7pgIbluo/popzoibJ9XFxcIj7pgIbluo9gXTtcXG5cXG4gICAgICAgIGRlbGV0ZUl0ZW1CeUNscyhzaHNvcnQpO1xcbiAgICAgICAgbmV3Y2xzbGlzdC5yZXZlcnNlKCk7XFxuICAgICAgICBhZGRJdGVtQWZ0ZXIoc2hzb3J0ICsgJ19saW5lJywgbmV3Y2xzbGlzdCk7XFxuXFxuICAgICAgICB2YXIgb2JqID0gZmluZEl0ZW0oc2hzb3J0ICsgJ19hdmF0YXInKVxcblxcbiAgICAgICAgaWYgKGNvbmYgPT0gJzEnKSB7XFxuICAgICAgICAgIHVwZGF0ZUl0ZW0oc2hzb3J0ICsgJ19hdmF0YXInLCB7XFxuICAgICAgICAgICAgdGl0bGU6IG9iai50aXRsZS5yZXBsYWNlKHRpdGxlc1sxXSwgdGl0bGVzWzBdKSxcXG4gICAgICAgICAgfSlcXG4gICAgICAgICAgcHV0TXlWYXIoc2hzb3J0ICsgJ19zb3J0JywgJzAnKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIHVwZGF0ZUl0ZW0oc2hzb3J0ICsgJ19hdmF0YXInLCB7XFxuICAgICAgICAgICAgdGl0bGU6IG9iai50aXRsZS5yZXBsYWNlKHRpdGxlc1swXSwgdGl0bGVzWzFdKSxcXG4gICAgICAgICAgfSlcXG4gICAgICAgICAgcHV0TXlWYXIoc2hzb3J0ICsgJ19zb3J0JywgJzEnKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly/liIfmjaLmjpLluo/miJDlip8nO1xcbiAgICAgIH0sIHNoc29ydCwgdmFyaSwgY3VzdG9tKSxcXG4gICAgICBjb2xfdHlwZTogJ2F2YXRhcicsXFxuICAgICAgaW1nOiBjdXN0b20u5Zu+5qCHLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogc2hzb3J0ICsgJ19hdmF0YXInLFxcbiAgICAgICAgbG9uZ0NsaWNrOiB0aGlzLnNldExvbmdjbGljayhzaHNvcnQpLFxcbiAgICAgIH1cXG4gICAgfSlcXG4gICAgdmFyIOaKmOWPoCA9ICfigJzigJzigJ3igJ08Yj4nICsgJ+KYtycuZm9udGNvbG9yKFxcXCIjRDNEM0QzXFxcIik7XFxuICAgIHZhciDlsZXlvIAgPSAn4oCc4oCc4oCd4oCdPGI+JyArICfimLAnLmZvbnRjb2xvcihcXFwiI0ZGQTUwMFxcXCIpO1xcbiAgICB2YXIgZm9sZG5hbWUgPSAnZXJfJyArIHZhcmkgKyAnZm9sZCc7XFxuICAgIHZhciBmb2xkID0gZ2V0TXlWYXIoZm9sZG5hbWUsICcxJyk7XFxuICAgIGlmICh0eXBlb2YgKHBhcnNlWyfmjqjpgIEnXSkgIT0gJ3VuZGVmaW5lZCcgJiYgcGFyc2VbJ+aOqOmAgSddKVxcbiAgICAgIHRoaXMucHVzaFRhYignZXJfJyArIHZhcmksIHNoc29ydCk7XFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6IGZvbGQgPT09ICcwJyA/IOaKmOWPoCA6IOWxleW8gCxcXG4gICAgICBjb2xfdHlwZTogY3VzdG9tLue6v+i3r+agt+W8jyxcXG4gICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGZvbGRuYW1lLCBzaHNvcnQpID0+IHtcXG4gICAgICAgIHZhciBmb2xkID0gZ2V0TXlWYXIoZm9sZG5hbWUsICcxJyk7XFxuICAgICAgICB2YXIgb2JqID0gZmluZEl0ZW0oc2hzb3J0ICsgJ19saW5lJyk7XFxuICAgICAgICB2YXIgYnRuID0gZmluZEl0ZW0oc2hzb3J0ICsgJ19idXR0b24nKTtcXG4gICAgICAgIHZhciBmb2xkcyA9IFsnPGZvbnQgY29sb3I9XFxcIiNEM0QzRDNcXFwiPuKYtycsICc8Zm9udCBjb2xvcj1cXFwiI0ZGQTUwMFxcXCI+4piwJ107XFxuXFxuICAgICAgICBpZiAoZm9sZCA9PSAnMCcpIHtcXG4gICAgICAgICAgcHV0TXlWYXIoZm9sZG5hbWUsICcxJyk7XFxuICAgICAgICAgIHZhciBjcyA9IHN0b3JhZ2UwLmdldE15VmFyKHNoc29ydCArICdfY2xzJyk7XFxuICAgICAgICAgIGFkZEl0ZW1BZnRlcihvYmouZXh0cmEuaWQsIGNzKTtcXG4gICAgICAgICAgdXBkYXRlSXRlbShidG4uZXh0cmEuaWQsIHtcXG4gICAgICAgICAgICB0aXRsZTogYnRuLnRpdGxlLnJlcGxhY2UoZm9sZHNbMF0sIGZvbGRzWzFdKSxcXG4gICAgICAgICAgfSlcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChmb2xkID09ICcxJykge1xcbiAgICAgICAgICBwdXRNeVZhcihmb2xkbmFtZSwgJzAnKTtcXG4gICAgICAgICAgdmFyIHBjbHMgPSBmaW5kSXRlbXNCeUNscyhzaHNvcnQpO1xcbiAgICAgICAgICB2YXIgY3ggPSAkLmRhdGFDb252ZXJ0KHBjbHMpO1xcbiAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihzaHNvcnQgKyAnX2NscycsIGN4KTtcXG4gICAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKHNoc29ydCk7XFxuICAgICAgICAgIHVwZGF0ZUl0ZW0oYnRuLmV4dHJhLmlkLCB7XFxuICAgICAgICAgICAgdGl0bGU6IGJ0bi50aXRsZS5yZXBsYWNlKGZvbGRzWzFdLCBmb2xkc1swXSksXFxuICAgICAgICAgIH0pXFxuICAgICAgICB9XFxuXFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJyArIChmb2xkID09PSAnMScgPyAn5pS26LW3JyA6ICflsZXlvIAnKTtcXG4gICAgICB9LCBmb2xkbmFtZSwgc2hzb3J0KSxcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IHNoc29ydCArICdfYnV0dG9uJyxcXG4gICAgICB9XFxuICAgIH0pXFxuICAgIHRoaXMuY3JlYXRlUExpc3Qoc3RhYnMsIHZhcmksIHNoc29ydCwgY3VzdG9tLCBwYXJzZSk7XFxuICB9LFxcbiAgc2V0VGFiczI6IGZ1bmN0aW9uICh0YWJzLCB2YXJpLCBzaHNvcnQsIHBhcnNlLCBleHApIHtcXG4gICAgbGV0IGN1c3RvbSA9IHBhcnNlLuiHquWumuS5iTtcXG4gICAgbGV0IHN0YWJzID0gdGFicztcXG4gICAgdGFicyA9IHRhYnMubWFwKHggPT4geC50aXRsZSE9dW5kZWZpbmVkP3gudGl0bGU6eCk7XFxuICAgIGN1c3RvbSA9IHRoaXMuZ2V0UHJlc2V0KGN1c3RvbSk7XFxuICAgIHNoc29ydCA9IHNoc29ydCA/IHNoc29ydCA6ICdzaHNvcnQnO1xcbiAgICB2YXIgdGl0bGUgPSAoZ2V0TXlWYXIoc2hzb3J0ICsgJ19zb3J0JywgJzAnKSA9PSAnMScpID8gJzxiPjxzcGFuIHN0eWxlPVxcXCJjb2xvcjonICsgY3VzdG9tLumAhuW6j+minOiJsiArICdcXFwiPumAhuW6jzwvc3Bhbj48L2I+JyA6ICc8Yj48c3BhbiBzdHlsZT1cXFwiY29sb3I6JyArIGN1c3RvbS7mraPluo/popzoibIgKyAnXFxcIj7mraPluo88L3NwYW4+PC9iPidcXG5cXG4gICAgdmFyIOaKmOWPoCA9ICc8Yj7mipjlj6AnICsgJ+KYtycuZm9udGNvbG9yKFxcXCIjRDNEM0QzXFxcIik7XFxuICAgIHZhciDlsZXlvIAgPSAnPGI+5bGV5byAJyArICfimLAnLmZvbnRjb2xvcihcXFwiI0ZGQTUwMFxcXCIpO1xcbiAgICB2YXIgZm9sZG5hbWUgPSAnZXJfJyArIHZhcmkgKyAnZm9sZCc7XFxuICAgIHZhciBmb2xkID0gZ2V0TXlWYXIoZm9sZG5hbWUsICcxJyk7XFxuXFxuICAgIHZhciB1cmwgPSAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChmb2xkbmFtZSwgc2hzb3J0LCBwdXNoKSA9PiB7XFxuICAgICAgdmFyIHBsID0gc3RvcmFnZTAuZ2V0TXlWYXIoJ2VyX3BsYXlsaXN0cycsICd7fScpO1xcbiAgICAgIGlmIChPYmplY3Qua2V5cyhwbCkubGVuZ3RoID09IDEpIHtcXG4gICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgICB9XFxuXFxuICAgICAgdmFyIGZvbGQgPSBnZXRNeVZhcihmb2xkbmFtZSwgJzEnKTtcXG4gICAgICB2YXIgb2JqID0gZmluZEl0ZW0oc2hzb3J0ICsgJ19hdmF0YXInKVxcbiAgICAgIGlmIChmb2xkID09ICcxJykge1xcbiAgICAgICAgdmFyIGJjbHMgPSBmaW5kSXRlbShzaHNvcnQgKyAnX2J1dHRvbicpO1xcbiAgICAgICAgdmFyIHRjbHMgPSBmaW5kSXRlbXNCeUNscyhzaHNvcnQgKyAnX3RhYicpO1xcbiAgICAgICAgdmFyIGxjbHMgPSBmaW5kSXRlbShzaHNvcnQgKyAnX2xpbmUnKTtcXG5cXG4gICAgICAgIHZhciBwY2xzID0gZmluZEl0ZW1zQnlDbHMoc2hzb3J0KTtcXG4gICAgICAgIHZhciBjcyA9IFtiY2xzXS5jb25jYXQodGNscywgW2xjbHNdLCBwY2xzKTtcXG5cXG4gICAgICAgIGlmIChwdXNoKSB7XFxuICAgICAgICAgIHZhciBwY2xzID0gZmluZEl0ZW1zQnlDbHMoc2hzb3J0ICsgJ19wdXNodGFiJyk7XFxuICAgICAgICAgIGNzID0gcGNscy5jb25jYXQoY3MpO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgdmFyIGN4ID0gJC5kYXRhQ29udmVydChjcyk7XFxuICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihzaHNvcnQgKyAnX2NscycsIGN4KTtcXG4gICAgICAgIGlmIChwdXNoKSB7XFxuICAgICAgICAgIGRlbGV0ZUl0ZW1CeUNscyhzaHNvcnQgKyAnX3B1c2h0YWInKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGRlbGV0ZUl0ZW0oYmNscy5leHRyYS5pZCk7XFxuICAgICAgICBkZWxldGVJdGVtQnlDbHMoc2hzb3J0ICsgJ190YWInKTtcXG4gICAgICAgIGRlbGV0ZUl0ZW0oc2hzb3J0ICsgJ19saW5lJyk7XFxuICAgICAgICBkZWxldGVJdGVtQnlDbHMoc2hzb3J0KTtcXG5cXG4gICAgICAgIHVwZGF0ZUl0ZW0ob2JqLmV4dHJhLmlkLCB7XFxuICAgICAgICAgIGRlc2M6IG9iai5kZXNjLnJlcGxhY2UoJ+WxleW8gDxmb250IGNvbG9yPVxcXCIjRkZBNTAwXFxcIj7imLAnLCAn5oqY5Y+gPGZvbnQgY29sb3I9XFxcIiNEM0QzRDNcXFwiPuKYtycpLFxcbiAgICAgICAgfSlcXG4gICAgICB9XFxuICAgICAgaWYgKGZvbGQgPT0gJzAnKSB7XFxuICAgICAgICB2YXIgY3MgPSBzdG9yYWdlMC5nZXRNeVZhcihzaHNvcnQgKyAnX2NscycpO1xcbiAgICAgICAgYWRkSXRlbUFmdGVyKHNoc29ydCArICdfYXZhdGFyJywgY3MpO1xcbiAgICAgICAgdXBkYXRlSXRlbShvYmouZXh0cmEuaWQsIHtcXG4gICAgICAgICAgZGVzYzogb2JqLmRlc2MucmVwbGFjZSgn5oqY5Y+gPGZvbnQgY29sb3I9XFxcIiNEM0QzRDNcXFwiPuKYtycsICflsZXlvIA8Zm9udCBjb2xvcj1cXFwiI0ZGQTUwMFxcXCI+4piwJyksXFxuICAgICAgICB9KVxcbiAgICAgIH1cXG4gICAgICBwdXRNeVZhcihmb2xkbmFtZSwgZm9sZCA9PT0gJzEnID8gJzAnIDogJzEnKTtcXG4gICAgICByZXR1cm4gJ3RvYXN0Oi8vJyArIChmb2xkID09PSAnMScgPyAn5pS26LW3JyA6ICflsZXlvIAnKTtcXG4gICAgfSwgZm9sZG5hbWUsIHNoc29ydCwgKHBhcnNlWyfmjqjpgIEnXSA/IHRydWUgOiBmYWxzZSkpO1xcbiAgICB2YXIgZGVzYyA9IChmb2xkID09PSAnMCcgPyDmipjlj6AgOiDlsZXlvIApICsgJ1xcXFx0JztcXG5cXG4gICAgaWYgKGV4cC5sZW5ndGggPT0gMSkge1xcbiAgICAgIHVybCA9ICdoaWtlcjovL2VtcHR5JztcXG4gICAgICBkZXNjID0gJyc7XFxuICAgIH1cXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogdmFyaSArICc6XFxcXHRcXFxcdCcgKyAn5YWxJyArIFN0cmluZyh0YWJzLmxlbmd0aCkuZm9udGNvbG9yKCcjNDY4MkI0JykgKyAn5p2h57q/6LevJyxcXG4gICAgICBkZXNjOiBkZXNjLFxcbiAgICAgIGNvbF90eXBlOiAnYXZhdGFyJyxcXG4gICAgICBpbWc6IGN1c3RvbS7lm77moIcsXFxuICAgICAgdXJsOiB1cmwsXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBzaHNvcnQgKyAnX2F2YXRhcicsXFxuICAgICAgICBsb25nQ2xpY2s6IHRoaXMuc2V0TG9uZ2NsaWNrKHNoc29ydCksXFxuICAgICAgfVxcbiAgICB9KVxcbiAgICBpZiAodHlwZW9mIChwYXJzZVsn5o6o6YCBJ10pICE9ICd1bmRlZmluZWQnICYmIHBhcnNlWyfmjqjpgIEnXSlcXG4gICAgICB0aGlzLnB1c2hUYWIoJ2VyXycgKyB2YXJpLCBzaHNvcnQpO1xcblxcbiAgICBpZiAoZm9sZCA9PSAnMCcpIHtcXG4gICAgICByZXR1cm5cXG4gICAgfVxcblxcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIHRpdGxlLFxcbiAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgodmFyaSwgc2hzb3J0LCBjdXN0b20pID0+IHtcXG4gICAgICAgIGxldCBjb25mID0gZ2V0TXlWYXIoc2hzb3J0ICsgJ19zb3J0JywgJzAnKTtcXG4gICAgICAgIHZhciBjbHNsaXN0cyA9IGZpbmRJdGVtc0J5Q2xzKHNoc29ydCk7XFxuICAgICAgICB2YXIgbmV3Y2xzbGlzdCA9ICQuZGF0YUNvbnZlcnQoY2xzbGlzdHMpO1xcbiAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKHNoc29ydCk7XFxuICAgICAgICBuZXdjbHNsaXN0LnJldmVyc2UoKTtcXG4gICAgICAgIGFkZEl0ZW1BZnRlcihzaHNvcnQgKyAnX2xpbmUnLCBuZXdjbHNsaXN0KTtcXG5cXG4gICAgICAgIHZhciBvYmogPSBmaW5kSXRlbShzaHNvcnQgKyAnX2J1dHRvbicpXFxuICAgICAgICB2YXIgdGl0bGVzID0gW2Ake2N1c3RvbS7mraPluo/popzoibJ9XFxcIj7mraPluo9gLCBgJHtjdXN0b20u6YCG5bqP6aKc6ImyfVxcXCI+6YCG5bqPYF07XFxuXFxuICAgICAgICBpZiAoY29uZiA9PSAnMScpIHtcXG4gICAgICAgICAgdXBkYXRlSXRlbShzaHNvcnQgKyAnX2J1dHRvbicsIHtcXG4gICAgICAgICAgICB0aXRsZTogb2JqLnRpdGxlLnJlcGxhY2UodGl0bGVzWzFdLCB0aXRsZXNbMF0pLFxcbiAgICAgICAgICB9KVxcbiAgICAgICAgICBwdXRNeVZhcihzaHNvcnQgKyAnX3NvcnQnLCAnMCcpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgdXBkYXRlSXRlbShzaHNvcnQgKyAnX2J1dHRvbicsIHtcXG4gICAgICAgICAgICB0aXRsZTogb2JqLnRpdGxlLnJlcGxhY2UodGl0bGVzWzBdLCB0aXRsZXNbMV0pLFxcbiAgICAgICAgICB9KVxcbiAgICAgICAgICBwdXRNeVZhcihzaHNvcnQgKyAnX3NvcnQnLCAnMScpO1xcbiAgICAgICAgfVxcbiAgICAgICAgLy9yZWZyZXNoUGFnZSgpXFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5YiH5o2i5o6S5bqP5oiQ5YqfJ1xcbiAgICAgIH0sIHZhcmksIHNoc29ydCwgY3VzdG9tKSxcXG4gICAgICBjb2xfdHlwZTogY3VzdG9tLue6v+i3r+agt+W8jyxcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IHNoc29ydCArICdfYnV0dG9uJyxcXG4gICAgICB9XFxuICAgIH0pXFxuICAgIHRoaXMuY3JlYXRlUExpc3Qoc3RhYnMsIHZhcmksIHNoc29ydCwgY3VzdG9tLCBwYXJzZSk7XFxuICB9LFxcbiAgc2V0TGlzdHM6IGZ1bmN0aW9uIChsaXN0cywgaW5kZXgsIHNoc29ydCwgcGFyc2UpIHtcXG4gICAgLy9sb2cobGlzdHMpXFxuICAgIHNoc29ydCA9IHNoc29ydCA/IHNoc29ydCA6ICdzaHNvcnQnO1xcbiAgICBzdG9yYWdlMC5wdXRNeVZhcihzaHNvcnQgKyAnX2xpc3QnLCBsaXN0cyk7XFxuXFxuICAgIHBhcnNlID0gcGFyc2UgPyBwYXJzZSA6IHt9O1xcbiAgICB2YXIg5qC35byPID0gcGFyc2Uu5qC35byPID8gcGFyc2Uu5qC35byPIDogJyc7XFxuICAgIHZhciDlm77moIcgPSBwYXJzZS7lm77moIcgPyBwYXJzZS7lm77moIcgOiAnaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9tb3ZpZS8xMy5zdmcnO1xcbiAgICB2YXIgYWpheCA9IHBhcnNlLuWKqOaAgeaVsOaNriA/IHBhcnNlLuWKqOaAgeaVsOaNriA6IGZhbHNlO1xcblxcbiAgICBpZiAoYWpheCkge1xcbiAgICAgIHZhciBsaXN0ID0gbGlzdHM7XFxuICAgICAgaWYgKGdldE15VmFyKHNoc29ydCArICdfc29ydCcpID09ICcxJyAmJiBsaXN0cy5sZW5ndGggPiAwKSB7XFxuICAgICAgICBsaXN0ID0gbGlzdHMucmV2ZXJzZSgpO1xcbiAgICAgIH1cXG4gICAgfSBlbHNlIHtcXG4gICAgICB2YXIgbGlzdCA9IGxpc3RzW2luZGV4XTtcXG4gICAgICBpZiAoZ2V0TXlWYXIoc2hzb3J0ICsgJ19zb3J0JykgPT0gJzEnICYmIGxpc3RzLmxlbmd0aCA+IDApIHtcXG4gICAgICAgIGxpc3QgPSBsaXN0c1tpbmRleF0ucmV2ZXJzZSgpO1xcbiAgICAgIH1cXG4gICAgfVxcblxcblxcblxcbiAgICBpZiAo5qC35byPID09ICcnKSB7XFxuICAgICAg5qC35byPID0gbGlzdC5sZW5ndGggPiAzID8gJ3RleHRfNCcgOiAndGV4dF8yJ1xcbiAgICB9XFxuXFxuICAgIHZhciBleHRyYSA9ICcnO1xcblxcbiAgICBpZiAocGFyc2UuZXh0cmEgIT0gdW5kZWZpbmVkKSB7XFxuICAgICAgZXh0cmEgPSBwYXJzZS5leHRyYVxcbiAgICB9XFxuXFxuICAgIGlmIChsaXN0Lmxlbmd0aCA+IDApIHtcXG4gICAgICB2YXIgcGxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcignZXJfcGxheWxpc3RzJywgJ3t9Jyk7XFxuICAgICAgaWYgKCFwbGlzdC5oYXNPd25Qcm9wZXJ0eShzaHNvcnQpKSB7XFxuICAgICAgICBwbGlzdFtzaHNvcnRdID0ge307XFxuICAgICAgfVxcbiAgICAgIHBsaXN0W3Noc29ydF1bJ2NscyddID0gc2hzb3J0O1xcbiAgICAgIHBsaXN0W3Noc29ydF1bJ2NvbF90eXBlJ10gPSDmoLflvI87XFxuICAgICAgcGxpc3Rbc2hzb3J0XVsncGljJ10gPSDlm77moIc7XFxuICAgICAgcGxpc3Rbc2hzb3J0XVsnZXh0cmEnXSA9IGV4dHJhO1xcbiAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKCdlcl9wbGF5bGlzdHMnLCBwbGlzdCk7XFxuICAgIH1cXG5cXG5cXG5cXG4gICAgZm9yICh2YXIgaiBpbiBsaXN0KSB7XFxuXFxuICAgICAgbGV0IGx0ID0ge1xcbiAgICAgICAgdGl0bGU6IGxpc3Rbal0udGl0bGUsXFxuICAgICAgICB1cmw6IGxpc3Rbal0udXJsLFxcbiAgICAgICAgY29sX3R5cGU6IOagt+W8jyxcXG4gICAgICAgIHBpYzog5Zu+5qCHLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgaWQ6IGxpc3Rbal0udXJsLnJlcGxhY2UoL0BsYXp5UnVsZVtcXFxcc1xcXFxTXSsvZywgJycpLFxcbiAgICAgICAgICBjbHM6IHNoc29ydCxcXG4gICAgICAgIH1cXG4gICAgICB9O1xcbiAgICAgIGx0WydleHRyYSddID0gT2JqZWN0LmFzc2lnbih7fSwgbHRbJ2V4dHJhJ10sIGV4dHJhKTtcXG4gICAgICBkLnB1c2gobHQpO1xcbiAgICB9XFxuICB9LFxcbiAgZXZhbFJlOiBmdW5jdGlvbiAoaW5wdXQsIOWHveaVsCkge1xcbiAgICBsZXQgcmVzdWx0ID0gaW5wdXQ7XFxuICAgIHJlc3VsdCA9IGV2YWwoJ2lucHV0JyArIOWHveaVsCk7XFxuICAgIHJldHVybiByZXN1bHQ7XFxuICB9LFxcbiAgZ2V0VGFiczogZnVuY3Rpb24gKHBhcnNlKSB7XFxuICAgIHZhciB0YWJzID0gW107XFxuICAgIHZhciBhcnRzID0gW107XFxuICAgIGlmICh0eXBlb2YgcGFyc2Uu57q/6LevID09ICdvYmplY3QnKSB7XFxuICAgICAgYXJ0cyA9IHBhcnNlLue6v+i3rztcXG4gICAgfVxcbiAgICBpZiAoYXJ0cy5sZW5ndGggPT0gMCkge1xcbiAgICAgIGFydHMgPSBwZGZhKGh0bWwsIHBhcnNlLue6v+i3ryk7XFxuICAgIH1cXG4gICAgdmFyIOe6v+i3r+WQjSA9IHBhcnNlLue6v+i3r+WQjeensDtcXG4gICAgdmFyIOe6v+i3r+mTvuaOpSA9IHBhcnNlLue6v+i3r+mTvuaOpSA/IHBhcnNlLue6v+i3r+mTvuaOpSA6ICcnO1xcbiAgICB2YXIg5pu/5o2i5Ye95pWwID0gJyc7XFxuICAgIGlmIChwYXJzZS7nur/ot6/lkI3np7AuaW5jbHVkZXMoJ0BAJykpIHtcXG4gICAgICDnur/ot6/lkI0gPSBwYXJzZS7nur/ot6/lkI3np7Auc3BsaXQoJ0BAJylbMF07XFxuICAgICAg5pu/5o2i5Ye95pWwID0gcGFyc2Uu57q/6Lev5ZCN56ewLnNwbGl0KCdAQCcpWzFdO1xcbiAgICB9XFxuICAgIGZvciAodmFyIGkgaW4gYXJ0cykge1xcbiAgICAgIGxldCBsaW5lbmFtZSA9ICcnO1xcbiAgICAgIGlmICjnur/ot6/lkI0gPT0gJycpIHtcXG4gICAgICAgIGxpbmVuYW1lID0gYXJ0c1tpXTtcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgbGluZW5hbWUgPSBwZGZoKGFydHNbaV0sIOe6v+i3r+WQjSk7XFxuICAgICAgfVxcbiAgICAgIGlmICjmm7/mjaLlh73mlbAgIT0gJycpIHtcXG4gICAgICAgIGxpbmVuYW1lID0gdGhpcy5ldmFsUmUobGluZW5hbWUsIOabv+aNouWHveaVsCk7XFxuICAgICAgfVxcbiAgICAgIHRhYnMucHVzaCh7IHRpdGxlOiBsaW5lbmFtZSB9KTtcXG4gICAgICBpZiAo57q/6Lev6ZO+5o6lICE9ICcnKSB7XFxuICAgICAgICB0YWJzW2ldWyd1cmwnXSA9IHBkKGFydHNbaV0sIOe6v+i3r+mTvuaOpSk7XFxuICAgICAgfVxcbiAgICB9XFxuICAgIC8vbG9nKHRhYnMpO1xcbiAgICByZXR1cm4gdGFicztcXG4gIH0sXFxuICBnZXRMaXN0czogZnVuY3Rpb24gKHBhcnNlLCBzaHNvcnQsIGgpIHtcXG4gICAgaHRtbCA9IGggfHwgaHRtbDtcXG4gICAgc2hzb3J0ID0gc2hzb3J0ID8gc2hzb3J0IDogJ3Noc29ydCc7XFxuICAgIHZhciBsaXN0cyA9IFtdO1xcbiAgICB2YXIgY29udHMgPSBbXTtcXG4gICAgaWYgKHR5cGVvZiBwYXJzZS7pgInpm4YgPT0gJ29iamVjdCcpIHtcXG4gICAgICBjb250cyA9IHBhcnNlLumAiembhjtcXG4gICAgfVxcbiAgICBpZiAoY29udHMubGVuZ3RoID09IDApIHtcXG4gICAgICB0cnkge1xcbiAgICAgICAgY29udHMgPSBwZGZhKGh0bWwsIHBhcnNlLumAiembhik7XFxuICAgICAgfSBjYXRjaCB7XFxuICAgICAgICB0b2FzdCgn6YCJ6ZuG5a6a5L2N5pyJ6K+vJylcXG4gICAgICB9XFxuICAgIH1cXG5cXG4gICAgbGV0IOabv+aNouWHveaVsCA9ICcnO1xcbiAgICB2YXIg6YCJ6ZuG5ZCN56ewID0gcGFyc2Uu6YCJ6ZuG5ZCN56ewID8gcGFyc2Uu6YCJ6ZuG5ZCN56ewIDogJ2EmJlRleHQnO1xcbiAgICBpZiAo6YCJ6ZuG5ZCN56ewLmluY2x1ZGVzKCdAQCcpKSB7XFxuICAgICAg6YCJ6ZuG5ZCN56ewID0gcGFyc2Uu6YCJ6ZuG5ZCN56ewLnNwbGl0KCdAQCcpWzBdO1xcbiAgICAgIOabv+aNouWHveaVsCA9IHBhcnNlLumAiembhuWQjeensC5zcGxpdCgnQEAnKVsxXTtcXG4gICAgfVxcblxcbiAgICB2YXIg6YCJ6ZuG6ZO+5o6lID0gcGFyc2Uu6YCJ6ZuG6ZO+5o6lID8gcGFyc2Uu6YCJ6ZuG6ZO+5o6lIDogJ2EmJmhyZWYnO1xcbiAgICB2YXIg6Kej5p6QID0gcGFyc2Uu6Kej5p6QID8gcGFyc2Uu6Kej5p6QIDogJyc7XFxuICAgIHZhciB0ZW1wID0gW107XFxuXFxuICAgIGZvciAodmFyIGkgaW4gY29udHMpIHtcXG4gICAgICBpZiAocGFyc2Uu6YCJ6ZuG5YiX6KGoICE9IHVuZGVmaW5lZCkge1xcbiAgICAgICAgaWYgKHBhcnNlLumAiembhuWIl+ihqCA9PSAnb2JqZWN0Jykge1xcbiAgICAgICAgICBsaXN0cy5wdXNoKGNvbnRzW2ldLm1hcCh4ID0+IHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgdGl0bGU6IHgudGl0bGUsXFxuICAgICAgICAgICAgICB1cmw6IHgudXJsICsg6Kej5p6QLFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfSkpXFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICBsaXN0cy5wdXNoKHBkZmEoY29udHNbaV0sIHBhcnNlLumAiembhuWIl+ihqCkubWFwKHggPT4ge1xcbiAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICB0aXRsZTogcGRmaCh4LCDpgInpm4blkI3np7ApLFxcbiAgICAgICAgICAgICAgdXJsOiBwZCh4LCDpgInpm4bpk77mjqUpICsg6Kej5p6QLFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfSkpXFxuICAgICAgICB9XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIHZhciB1cmwgPSBwZChjb250c1tpXSwg6YCJ6ZuG6ZO+5o6lKTtcXG4gICAgICAgIGlmICgh6YCJ6ZuG6ZO+5o6lLmluY2x1ZGVzKCdocmVmJykpIHtcXG4gICAgICAgICAgdXJsID0gcGRmaChjb250c1tpXSwg6YCJ6ZuG6ZO+5o6lKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCB0aXRsZSA9IHBkZmgoY29udHNbaV0sIOmAiembhuWQjeensCk7XFxuICAgICAgICB0aXRsZSA9IOabv+aNouWHveaVsCAhPSAnJyA/IHRoaXMuZXZhbFJlKHRpdGxlLCDmm7/mjaLlh73mlbApIDogdGl0bGU7XFxuICAgICAgICB0ZW1wLnB1c2goe1xcbiAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgIHVybDogdXJsICsg6Kej5p6QLFxcbiAgICAgICAgfSlcXG4gICAgICB9XFxuICAgIH1cXG4gICAgbGV0IOWAkuW6jyA9IHBhcnNlLuWAkuW6jyA/IHBhcnNlLuWAkuW6jyA6IGZhbHNlO1xcbiAgICB2YXIgcmVzdWx0cyA9IGxpc3RzLmxlbmd0aCA/IGxpc3RzIDogW3RlbXBdO1xcbiAgICBpZiAo5YCS5bqPKSB7XFxuICAgICAgcmVzdWx0cyA9IHJlc3VsdHMubWFwKHggPT4geC5yZXZlcnNlKCkpO1xcbiAgICB9XFxuICAgIHZhciBwbGlzdCA9IHN0b3JhZ2UwLmdldE15VmFyKCdlcl9wbGF5bGlzdHMnLCAne30nKTtcXG4gICAgaWYgKHJlc3VsdHMuc29tZSh4ID0+IHgubGVuZ3RoID4gMCkpIHtcXG4gICAgICBpZiAoIXBsaXN0Lmhhc093blByb3BlcnR5KHNoc29ydCkpIHtcXG4gICAgICAgIHBsaXN0W3Noc29ydF0gPSB7fTtcXG4gICAgICB9XFxuICAgICAgcGxpc3Rbc2hzb3J0XVsnbGVuZ3RoJ10gPSByZXN1bHRzLmxlbmd0aDtcXG4gICAgfTtcXG4gICAgc3RvcmFnZTAucHV0TXlWYXIoJ2VyX3BsYXlsaXN0cycsIHBsaXN0KTtcXG4gICAgcmV0dXJuIHJlc3VsdHM7XFxuICB9LFxcbiAgZ2V0UGxheWVyczogZnVuY3Rpb24gKHBhcnNlLCBtb2RlLCBmdW5jKSB7XFxuICAgIC8vbG9nKG1vZGUpXFxuICAgIHZhciBwbGF5ID0gJ2VyX3BsYXlsaXN0Xyc7XFxuICAgIHRoaXMucHJlTG9hZChmdW5jKTtcXG4gICAgdGhpcy5jbG9zZShwYXJzZS5tYXAoeCA9PiB4Luexu+WeiyksIHBhcnNlLmxlbmd0aCk7XFxuICAgIG1vZGUgPSBtb2RlID8gbW9kZSA6IDE7XFxuXFxuICAgIGxldCBwZSA9IFsxXTtcXG4gICAgdHJ5IHtcXG4gICAgICBwZSA9IHBhcnNlLm1hcCh4ID0+IHBkZmEoaHRtbCwgeC7nur/ot68pLmxlbmd0aCkuZmlsdGVyKHkgPT4geSA+IDApO1xcbiAgICB9IGNhdGNoIHsgfVxcblxcblxcbiAgICBwYXJzZS5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XFxuICAgICAgdmFyIHRhYnMgPSBbeyB0aXRsZTogJ+S4u+e6vycgfV07XFxuICAgICAgaWYgKGl0ZW0u57q/6LevICE9IHVuZGVmaW5lZCkge1xcbiAgICAgICAgdGFicyA9IHRoaXMuZ2V0VGFicyhpdGVtKTtcXG4gICAgICB9XFxuICAgICAgcHV0TXlWYXIocGxheSArIGkgKyAnX3RhYnMnLCB0YWJzLm1hcCh4ID0+IHgudGl0bGUpKTtcXG5cXG4gICAgICBpZiAoaXRlbS7liqjmgIHmlbDmja4pIHtcXG4gICAgICAgIGlmIChtb2RlID09IDEpIHtcXG4gICAgICAgICAgdGhpcy5zZXRUYWJzKHRhYnMsIGl0ZW0u57G75Z6LLCBwbGF5ICsgaSwgaXRlbSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICB0aGlzLnNldFRhYnMyKHRhYnMsIGl0ZW0u57G75Z6LLCBwbGF5ICsgaSwgaXRlbSwgcGUpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcHV0TXlWYXIoJ2VyX2h0bWwnLCBodG1sKTtcXG4gICAgICAgIHB1dE15VmFyKCdlcl91cmwnLCBNWV9VUkwpO1xcbiAgICAgICAgdmFyIGluZm8gPSB7IHBhcnNlOiBpdGVtLCBtYXJrOiBwbGF5ICsgaSwgdXJsOiBNWV9VUkwgfTtcXG4gICAgICAgIGlmICh0YWJzLnNvbWUoeCA9PiB4LnVybCkpIHtcXG4gICAgICAgICAgaW5mb1sndXJscyddID0gdGFicy5tYXAoeCA9PiB4LnVybCk7XFxuICAgICAgICB9XFxuXFxuICAgICAgICB2YXIgbGlzdHMgPSBmdW5jKGdldE15VmFyKCdlcl8nICsgaXRlbS7nsbvlnossICcwJyksIGluZm8pO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICB2YXIgbGlzdHMgPSB0aGlzLmdldExpc3RzKGl0ZW0sIHBsYXkgKyBpKTtcXG5cXG4gICAgICAgIGlmIChsaXN0cy5zb21lKHggPT4geC5sZW5ndGggPiAwKSkge1xcbiAgICAgICAgICBpZiAobW9kZSA9PSAxKSB7XFxuICAgICAgICAgICAgdGhpcy5zZXRUYWJzKHRhYnMsIGl0ZW0u57G75Z6LLCBwbGF5ICsgaSwgaXRlbSk7XFxuICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdGhpcy5zZXRUYWJzMih0YWJzLCBpdGVtLuexu+WeiywgcGxheSArIGksIGl0ZW0sIHBlKTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgICBpZiAoZ2V0TXlWYXIoJ2VyXycgKyBpdGVtLuexu+WeiyArICdmb2xkJywgJzEnKSA9PSAnMScpIHtcXG4gICAgICAgIHRoaXMuc2V0TGlzdHMobGlzdHMsIGdldE15VmFyKCdlcl8nICsgaXRlbS7nsbvlnossICcwJyksIHBsYXkgKyBpLCBpdGVtKTtcXG4gICAgICB9XFxuICAgICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiAnYmxhbmtfYmxvY2snXFxuICAgICAgfSlcXG4gICAgfSlcXG4gIH1cXG59XFxuXFxuXFxubGV0IE1ldGhvZHMgPSB7XFxuICAvL+WkmumAieaooeWdl1xcbiAgTXVsdGlTZWxlY3RNb2RlOiBmdW5jdGlvbiAobmFtZSwgaWQsIHNoc29ydCkge1xcbiAgICByZXR1cm4gJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoZGF0YXRpdGxlLCBkYXRhdXJsLCBzaHNvcnQpID0+IHtcXG4gICAgICBmdW5jdGlvbiB1bmlxdWUoYXJyKSB7XFxuICAgICAgICBjb25zdCByZXMgPSBuZXcgTWFwKClcXG4gICAgICAgIHJldHVybiBhcnIuZmlsdGVyKChhKSA9PiAhcmVzLmhhcyhhLnVybCkgJiYgcmVzLnNldChhLnVybCwgMSkpXFxuICAgICAgfVxcbiAgICAgIGxldCBkdW9zZWxlY3QgPSBzdG9yYWdlMC5nZXRNeVZhcihzaHNvcnQgKyBcXFwiX2R1b3NlbGVjdFxcXCIpID8gc3RvcmFnZTAuZ2V0TXlWYXIoc2hzb3J0ICsgXFxcIl9kdW9zZWxlY3RcXFwiKSA6IFtdO1xcbiAgICAgIGlmIChkdW9zZWxlY3QuZmluZEluZGV4KHggPT4geC51cmwgPT09IGRhdGF1cmwpID09IC0xKSB7XFxuICAgICAgICBkdW9zZWxlY3QucHVzaCh7XFxuICAgICAgICAgIHRpdGxlOiBkYXRhdGl0bGUsXFxuICAgICAgICAgIHVybDogZGF0YXVybFxcbiAgICAgICAgfSlcXG4gICAgICAgIGR1b3NlbGVjdCA9IHVuaXF1ZShkdW9zZWxlY3QpXFxuICAgICAgICB1cGRhdGVJdGVtKGRhdGF1cmwsIHtcXG4gICAgICAgICAgdGl0bGU6IGDigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFwiY29sb3I6I0ZGNTczM1xcXCI+YCArIGRhdGF0aXRsZSxcXG4gICAgICAgIH0pO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICBmdW5jdGlvbiByZW1vdmVCeVZhbHVlKGFyciwgdmFsKSB7XFxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgaWYgKGFycltpXVsndXJsJ10gPT0gdmFsKSB7XFxuICAgICAgICAgICAgICBhcnIuc3BsaWNlKGksIDEpO1xcbiAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICByZW1vdmVCeVZhbHVlKGR1b3NlbGVjdCwgZGF0YXVybClcXG4gICAgICAgIHVwZGF0ZUl0ZW0oZGF0YXVybCwge1xcbiAgICAgICAgICB0aXRsZTogZGF0YXRpdGxlXFxuICAgICAgICB9KTtcXG4gICAgICB9XFxuICAgICAgc3RvcmFnZTAucHV0TXlWYXIoc2hzb3J0ICsgXFxcIl9kdW9zZWxlY3RcXFwiLCBkdW9zZWxlY3QpO1xcbiAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgfSwgbmFtZSwgaWQsIHNoc29ydClcXG4gIH0sXFxufVxcblxcblxcbiQuZXhwb3J0cyA9IHtcXG4gIEVyamk6IEVyamksXFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiZWMtY2FzYy1saXN0XCIsXCJwYXRoXCI6XCJlYy1jYXNjXCIsXCJydWxlXCI6XCJqczpcXG4vKlxcbuefreinhuaooeadv+WwgeijhVxcbnZlciAyMDIzMTExMyAxLjBcXG4qL1xcblxcbnZhciBnZXRSYW5nZUNvbG9ycyA9IGZ1bmN0aW9uKCkge8KgwqDCoMKgwqDCoMKgXFxuICAgIHJldHVybiAnIycgKyAoJzAwMDAwJyArIChNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwIDw8IDApLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC02KTvCoMKgwqDCoMKgXFxufVxcbmV2YWwoSlNPTi5wYXJzZShyZXF1ZXN0KCdoaWtlcjovL3BhZ2UveWk/cnVsZT3OsScpKS5ydWxlKTtcXG5cXG52YXIgX2RlYnVnID0gZmFsc2U7XFxuaWYgKHR5cGVvZiBkZWJ1ZyAhPSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZGVidWcgPT0gJ2Jvb2xlYW4nKSB7XFxuICAgIF9kZWJ1ZyA9IGRlYnVnO1xcbn1cXG5cXG52YXIgX+W8gOWQr+aQnOe0oiA9IHRydWU7XFxuaWYgKHR5cGVvZiDlvIDlkK/mkJzntKIgIT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIOW8gOWQr+aQnOe0oiA9PSAnYm9vbGVhbicpIHtcXG4gICAgX+W8gOWQr+aQnOe0oiA9IOW8gOWQr+aQnOe0ojtcXG59XFxuXFxudmFyIF/liqjmgIEgPSB0cnVlO1xcbmlmICh0eXBlb2Yg5Yqo5oCB5pWw5o2uICE9ICd1bmRlZmluZWQnICYmIHR5cGVvZiDliqjmgIHmlbDmja4gPT0gJ2Jvb2xlYW4nKSB7XFxuICAgIF/liqjmgIEgPSDliqjmgIHmlbDmja47XFxufVxcblxcbnZhciBf5YiX6KGoID0gXFxcIlxcXCI7XFxuaWYgKHR5cGVvZiDliJfooaggIT0gJ3VuZGVmaW5lZCcpIHtcXG4gICAgX+WIl+ihqCA9IOWIl+ihqDtcXG59XFxuXFxuZnVuY3Rpb24gbW9iYW5fcGhwKGhvc3QsIGR1cmwsIOWumuS9jeS/oeaBrywgb3B0aW9ucykge1xcbiAgICB2YXIgc291cmNlbmFtZSA9IE1ZX1VSTDtcXG4gICAgbGV0IOeKtuaAgSA9IE1ZX1JVTEUudXJsXFxuICAgIE1ZX1VSTCA9IGR1cmw7XFxuXFxuICAgIHZhciBvcHRpb24gPSB7XFxuICAgICAgICB1cmw6IFxcXCIvaW5kZXgucGhwL2FwaS92b2RcXFwiLFxcbiAgICB9XFxuICAgIGlmIChvcHRpb25zICE9IHVuZGVmaW5lZCkge1xcbiAgICAgICAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaChrID0+IHtcXG4gICAgICAgICAgICBvcHRpb25ba10gPSBvcHRpb25zW2tdO1xcbiAgICAgICAgfSlcXG4gICAgfVxcblxcbiAgICBsZXQgdHJ1ZV91cmwgPSBnZXRUcnVlbGluayhNWV9SVUxFLnVybCwgTVlfVVJMLCBwYWdlKTtcXG5cXG4gICAgaWYgKG9wdGlvbi5oYXNPd25Qcm9wZXJ0eSgndHJ1ZV91cmwnKSkge1xcbiAgICAgICAgdHJ1ZV91cmwgPSBvcHRpb24udHJ1ZV91cmw7XFxuICAgIH1cXG5cXG4gICAgLy9sb2codHJ1ZV91cmwpXFxuICAgIHZhciBodG1sID0gZmV0Y2godHJ1ZV91cmwpXFxuICAgIGlmICghb3B0aW9uLmhhc093blByb3BlcnR5KCd0eXBlJykpIHtcXG4gICAgICAgIG9wdGlvblsndHlwZSddID0gcGRmaChodG1sLCAnI2RhdGFMaXN0JiZkYXRhLXR5cGUnKTtcXG4gICAgfVxcblxcbiAgICBjb25zdCDmuIXpmaTplK4gPSBbJ2R0X2NsYXNzJywgJ2R0X2FyZWEnLCAnZHRfeWVhcicsICdkdF9sYW5nJywgJ2R0X2xldHRlcicsICdkdF90aW1lJywgJ2R0X3ZlcnNpb24nLCAnZHRfc3RhdGUnXTtcXG4gICAgY29uc3QgZGMgPSBkeW5hbWljQ2xhc3Moe1xcbiAgICAgICAg5YiG57G76aKc6ImyOiBnZXRSYW5nZUNvbG9ycygpXFxuICAgIH0pO1xcbiAgICBkYy7lvIDlkK/mkJzntKIoX+W8gOWQr+aQnOe0oiku5byA5ZCv5oqY5Y+gKHRydWUpLua4hemZpCjmuIXpmaTplK4pLumhteeggShwYWdlKS7nlYzpnaIoZCku5rqQ56CBKGh0bWwpLueKtuaAgSjnirbmgIEpLuWIm+W7uuWKqOaAgeWIhuexuyjlrprkvY3kv6Hmga8pXFxuXFxuICAgIHRyeSB7XFxuICAgICAgICBpZiAocGRmYShodG1sLCBf5YiX6KGoKS5sZW5ndGggIT0gMCkge1xcbiAgICAgICAgICAgIHJldHVybiBodG1sO1xcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIHt9XFxuXFxuICAgIGlmICghX+WKqOaAgSkge1xcbiAgICAgICAgcmV0dXJuIGh0bWw7XFxuICAgIH1cXG5cXG4gICAgdmFyIHR5cGUgPSBvcHRpb24udHlwZTtcXG5cXG4gICAgdGltZSA9ICcnICsgTWF0aC5jZWlsKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCk7XFxuICAgIHZhciBrZXkgPSBldmFsUHJpdmF0ZUpTKCdaTU5LUUU1dzRIVXBXSDZHRzBydWsrdkZ4R1J4a2dKV3VhaHBCODV3YXJERGFSM3d5OU5Eak5hcHNaa1laWmhWJyk7XFxuXFxuICAgIC8vbG9nKG9wdGlvbilcXG5cXG4gICAgdmFyIHJlc3VsdCA9IHBvc3QoaG9zdCArIG9wdGlvbi51cmwsIHtcXG4gICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICBSZWZlcmVyOiBNWV9VUkwsXFxuICAgICAgICB9LFxcbiAgICAgICAgYm9keToge1xcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXFxuICAgICAgICAgICAgcGFnZTogcGFnZSxcXG4gICAgICAgICAgICB0aW1lOiB0aW1lLFxcbiAgICAgICAgICAgIGtleToga2V5LFxcbiAgICAgICAgICAgIGNsYXNzOiBnZXRNeVZhcignZHRfY2xhc3MnLCAnJyksXFxuICAgICAgICAgICAgYXJlYTogZ2V0TXlWYXIoJ2R0X2FyZWEnLCAnJyksXFxuICAgICAgICAgICAgeWVhcjogZ2V0TXlWYXIoJ2R0X3llYXInLCAnJyksXFxuICAgICAgICAgICAgbGFuZzogZ2V0TXlWYXIoJ2R0X2xhbmcnLCAnJyksXFxuICAgICAgICAgICAgbGV0dGVyOiBnZXRNeVZhcignZHRfbGV0dGVyJywgJycpLFxcbiAgICAgICAgICAgIHN0YXRlOiBnZXRNeVZhcignZHRfc3RhdGUnLCAnJyksXFxuICAgICAgICAgICAgdmVyc2lvbjogZ2V0TXlWYXIoJ2R0X3ZlcnNpb24nLCAnJyksXFxuICAgICAgICAgICAgYnk6IGdldE15VmFyKCdkdF90aW1lJywgJycpLFxcbiAgICAgICAgfVxcbiAgICB9KVxcblxcbiAgICB2YXIgbGlzdCA9IFtdO1xcbiAgICB0cnkge1xcbiAgICAgICAgbGlzdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcXG4gICAgfSBjYXRjaCB7fVxcblxcbiAgICByZXR1cm4gbGlzdFxcbn1cXG5cXG52YXIgb3B0aW9uLCDlrprkvY07XFxuaWYgKHR5cGVvZiBvcHRpb25zICE9ICd1bmRlZmluZWQnKSB7XFxuICAgIG9wdGlvbiA9IG9wdGlvbnM7XFxufVxcblxcbnZhciDlrprkvY0gPSBbe1xcbiAgICDlpKfnsbvlrprkvY06ICcuZWMtY2FzYy1saXN0JiZ1bCwwOjEnLFxcbiAgICAvL+Wwj+exuzogJ2JvZHkmJmEnXFxufSwge1xcbiAgICDkuIDnuqflrprkvY06ICdib2R5JiYubmF2LXN3aXBlcjpub3QoOmhhcyg6bWF0Y2hlcyjpopHpgZMpKSk6aGFzKGxpOm50aC1jaGlsZChuKzMpKScsXFxuICAgIOWwj+exuzogJ2JvZHkmJmxpOm5vdCg6bWF0Y2hlcyjliIbnsbvotYTmupB85YiG57G75LiN5Luj6KGoKSknLFxcbiAgICAvL+agh+mimDogJ2EmJlRleHQnLFxcbiAgICDpk77mjqU6ICdAanM6JyArICQudG9TdHJpbmcoKHQpID0+IHtcXG4gICAgICAgIHZhciB1cmwgPSBwZGZoKGlucHV0LCAnYSYmaHJlZicpO1xcbiAgICAgICAgbGV0IHR5cGUgPSBwZGZoKGlucHV0LCAnbGkmJmRhdGEtdHlwZScpO1xcbiAgICAgICAgbGV0IHZhbHVlID0gcGRmaChpbnB1dCwgJ2xpJiZkYXRhLXZhbCcpO1xcbiAgICAgICAgaWYgKHZhbHVlID09ICcnICYmIHVybCAhPSBcXFwiamF2YXNjcmlwdDpcXFwiKSB7XFxuICAgICAgICAgICAgaWYgKHVybC5zdGFydHNXaXRoKCdqYXZhc2NyaXB0JykpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBkKGlucHV0LCAnYSYmaHJlZicpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJy8nKSkge1xcbiAgICAgICAgICAgICAgICB1cmwgPSBnZXRIb21lKHQpICsgdXJsO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gdXJsO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxcbiAgICAgICAgfTtcXG4gICAgfSwgdHJ1ZV91cmwpXFxufSwge1xcbiAgICDkuIDnuqflrprkvY06ICcuc2l0ZS10YWJzJyxcXG4gICAg6ZO+5o6lOiAnQGpzOicgKyAkLnRvU3RyaW5nKCh0KSA9PiB7XFxuICAgICAgICB2YXIgdXJsID0gcGRmaChpbnB1dCwgJ2EmJmhyZWYnKTtcXG4gICAgICAgIGxldCB0eXBlID0gJ3RpbWUnO1xcbiAgICAgICAgbGV0IHZhbHVlID0gcGRmaChpbnB1dCwgJ2EmJmRhdGEtdHlwZScpO1xcbiAgICAgICAgaWYgKHZhbHVlID09ICcnICYmIHVybCAhPSBcXFwiamF2YXNjcmlwdDpcXFwiKSB7XFxuICAgICAgICAgICAgaWYgKHVybC5zdGFydHNXaXRoKCdqYXZhc2NyaXB0JykpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBkKGlucHV0LCAnYSYmaHJlZicpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJy8nKSkge1xcbiAgICAgICAgICAgICAgICB1cmwgPSBnZXRIb21lKHQpICsgdXJsO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gdXJsO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxcbiAgICAgICAgfTtcXG4gICAgfSwgdHJ1ZV91cmwpLFxcbiAgICAvL+WinuWKoDpbJzxhIGRhdGEtdHlwZT1cXFwiXFxcIj7lhajpg6g8L2E+J10sXFxuICAgIC8v6KGl5YWFOltdLFxcbn1dXFxuXFxuaWYgKHR5cGVvZiDlrprkvY3kv6Hmga8gIT0gJ3VuZGVmaW5lZCcpIHtcXG4gICAg5a6a5L2NID0g5a6a5L2N5L+h5oGvO1xcbn1cXG5cXG5pZiAodHlwZW9mIOWkp+exu+WumuS9jSAhPSAndW5kZWZpbmVkJykge1xcbiAgICDlrprkvY1bMF1bJ+Wkp+exu+WumuS9jSddID0g5aSn57G75a6a5L2NO1xcbn1cXG5cXG5pZiAodHlwZW9mIOaLvOaOpeWIhuexuyAhPSAndW5kZWZpbmVkJykge1xcbiAgICDlrprkvY1bMV1bJ+S4gOe6p+WumuS9jSddID0g5ou85o6l5YiG57G7O1xcbn1cXG5cXG5pZiAoX2RlYnVnKSB7XFxuICAgIGxvZygn5a6a5L2N5L+h5oGvJyk7XFxuICAgIGxvZyjlrprkvY0pO1xcbiAgICBsb2coJ3RydWVfdXJsJylcXG4gICAgbG9nKHRydWVfdXJsKTtcXG4gICAgbG9nKCdvcHRpb25zJylcXG4gICAgbG9nKG9wdGlvbilcXG59XFxuXFxudmFyIHJlc3VsdCA9IG1vYmFuX3BocChnZXRIb21lKHRydWVfdXJsKSwgdHJ1ZV91cmwsIOWumuS9jSwgb3B0aW9uKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuS4gOe6p+WwgeijhVwiLFwicGF0aFwiOlwieWlcIixcInJ1bGVcIjpcImpzOlxcbi8qXFxuYnkgzrEoemV0YWxwaGEpXFxu5LiA57qn5bCB6KOFXFxu5Yqo5oCB5YiG57G7IOWIl+ihqOWIm+W7uiDoh6rliqjkuIvkuIDpobVcXG52ZXIgMjAyMzEwMTcgMS4wXFxuKi9cXG5cXG4vL+maj+acuuminOiJslxcbnZhciBnZXRSYW5nZUNvbG9ycyA9IGZ1bmN0aW9uKCkge1xcbiAgICByZXR1cm4gJyMnICsgKCcwMDAwMCcgKyAoTWF0aC5yYW5kb20oKSAqIDB4MTAwMDAwMCA8PCAwKS50b1N0cmluZygxNikpLnN1YnN0cigtNik7XFxufVxcblxcbi8v5Yqo5oCB5YiG57G7XFxuZnVuY3Rpb24gZHluYW1pY0NsYXNzKG9wdGlvbnMpIHtcXG4gICAgY29uc3Qgb2JqID0ge1xcbiAgICAgICAgLy/pu5jorqTlgLxcXG4gICAgICAgIGxheW91dDogXFxcInVuZGVmaW5lZFxcXCIsXFxuICAgICAgICBodG1sOiBcXFwiZW1wdHlcXFwiLFxcbiAgICAgICAgcGFnZTogMCxcXG4gICAgICAgIOWIhuexu+minOiJsjogXFxcIiNGQTcyOThcXFwiLFxcbiAgICAgICAg5oqY5Y+gOiBcXFwi4oCc4oCc4oCd4oCdPGI+XFxcIiArIFxcXCLiiKdcXFwiLmZvbnRjb2xvcihcXFwiIzFhYWQxOVxcXCIpICsgXFxcIjwvYj5cXFwiLFxcbiAgICAgICAg5bGV5byAOiBcXFwi4oCc4oCc4oCd4oCdPGI+XFxcIiArIFxcXCLiiKhcXFwiLmZvbnRjb2xvcihcXFwiI0ZGMDAwMFxcXCIpICsgXFxcIjwvYj5cXFwiLFxcbiAgICAgICAgb3BlbjogdHJ1ZSxcXG4gICAgICAgIHN0YXRlOiBNWV9SVUxFLnVybCxcXG4gICAgICAgIHNlYXJjaDogZmFsc2UsXFxuICAgICAgICBjbGVhcnM6IFtdLFxcbiAgICAgICAgY2xlYXJhbGw6IFtcXFwieWlfZmlyc3RwYWdlXFxcIl0sXFxuICAgICAgICBkZWJ1ZzogZmFsc2UsXFxuXFxuICAgICAgICDpooTorr4ocGFyYW0pIHtcXG4gICAgICAgICAgICBpZiAocGFyYW0gPT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgICAgICAgIHBhcmFtID0gW107XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHBhcmFtKS5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xcbiAgICAgICAgICAgICAgICAvLyDlr7nmr4/kuKrlsZ7mgKflkI3miafooYzmk43kvZxcXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbVtwcm9wZXJ0eV07IC8vIOiOt+WPluWxnuaAp+WAvFxcbiAgICAgICAgICAgICAgICAvLyDlnKjov5nph4zmiafooYzmgqjnmoTmk43kvZxcXG4gICAgICAgICAgICAgICAgdGhpc1twcm9wZXJ0eV0gPSB2YWx1ZTtcXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHByb3BlcnR5ICsgXFxcIjpcXFwiICsgdmFsdWUpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9LFxcbiAgICAgICAgZXZhbEpTUnVsZShpdGVtLFxcbiAgICAgICAgICAgIGpzUnVsZSkge1xcbiAgICAgICAgICAgIGxldCBydWxlID0ganNSdWxlLnJlcGxhY2UoXFxcIkBqczpcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiXFxcIik7XFxuICAgICAgICAgICAgcnVsZSA9IHJ1bGUudHJpbSgpO1xcbiAgICAgICAgICAgIC8vbG9nKCQuc3RyaW5naWZ5KHJ1bGUpKVxcbiAgICAgICAgICAgIGxldCBpbnB1dCA9IGl0ZW07XFxuICAgICAgICAgICAgaWYgKHJ1bGUuc3RhcnRzV2l0aChcXFwiKFxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIGV2YWwoXFxcInJlc3VsdCA9IFxcXCIgKyBydWxlKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgICAgICog6L+Y5Y6f5oiQICQudG9TdHJpbmcoLi4uKSDnmoTmnIDnu4jnu5PmnpzvvIzovr7liLDmnIDnu4jlpITnkIbmlrnlvI/ot5/kuIrpnaLnmoQgaWYg5LiA6Ie055qE55uu55qEXFxuICAgICAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgICAgICBldmFsKFxcXCJyZXN1bHQgPSBcXFwiICsgXFxcIigoKSA9PiB7XFxcIiArIHJ1bGUgKyBcXFwifSkoKVxcXCIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0IHx8IFxcXCJcXFwiO1xcbiAgICAgICAgfSxcXG4gICAgICAgIGdldFRpdGxlKHNyYywgY2F0ZWdvcnkpIHtcXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICBsZXQgdGl0bGVSdWxlID0gY2F0ZWdvcnkgfHwgXFxcImEmJlRleHRcXFwiO1xcbiAgICAgICAgICAgIGlmICh0aXRsZVJ1bGUuc3RhcnRzV2l0aChcXFwiQGpzOlxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIHRpdGxlID0gdGhpcy5ldmFsSlNSdWxlKHNyYywgdGl0bGVSdWxlKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB0aXRsZSA9IHBhcnNlRG9tRm9ySHRtbChzcmMsIHRpdGxlUnVsZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiB0aXRsZSB8fCBcXFwiXFxcIjtcXG4gICAgICAgIH0sXFxuICAgICAgICBnZXRVcmwoc3JjLCBjYXRlZ29yeSkge1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICBsZXQgdXJsUnVsZSA9IGNhdGVnb3J5LumTvuaOpSB8fCBcXFwiYSYmaHJlZlxcXCI7XFxuICAgICAgICAgICAgaWYgKHVybFJ1bGUuc3RhcnRzV2l0aChcXFwiQGpzOlxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIHVybCA9IHRoaXMuZXZhbEpTUnVsZShzcmMsIHVybFJ1bGUpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHVybCA9IHBkKHNyYywgdXJsUnVsZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2F0ZWdvcnku6ZO+5o6l5aSE55CGID09IFxcXCJmdW5jdGlvblxcXCIpIHtcXG4gICAgICAgICAgICAgICAgdXJsID0gY2F0ZWdvcnku6ZO+5o6l5aSE55CGKHVybCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiB1cmwgfHwgXFxcIlxcXCI7XFxuICAgICAgICB9LFxcbiAgICAgICAgaXNOdWxsKHBhcmFtKSB7XFxuICAgICAgICAgICAgaWYgKHBhcmFtID09IG51bGwpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgICAgIH0sXFxuICAgICAgICBpc0Jvb2xlYW4odmFyaWFibGUpIHtcXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhcmlhYmxlICE9PSBcXFwiYm9vbGVhblxcXCIpIHtcXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLlvIDlkK/mipjlj6Dor7fkvKDlhaXluIPlsJTlgLxcXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LFxcbiAgICAgICAg5riF6ZmkKGxpc3QpIHtcXG4gICAgICAgICAgICBpZiAodGhpcy5pc051bGwobGlzdCkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChsaXN0LmNvbnN0cnVjdG9yID09IFN0cmluZykge1xcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIua4hemZpOaKpemUmTror7fkvKDliJfooahcXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdGhpcy5jbGVhcnMgPSBsaXN0O1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfSxcXG4gICAgICAgIOWFqOa4hShsaXN0KSB7XFxuICAgICAgICAgICAgaWYgKHRoaXMuaXNOdWxsKGxpc3QpKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB2YXIgYyA9IHRoaXMuY2xlYXJhbGw7XFxuICAgICAgICAgICAgbGlzdCA9IGMuY29uY2F0KGxpc3QpO1xcbiAgICAgICAgICAgIHRoaXMuY2xlYXJhbGwgPSBsaXN0O1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfSxcXG4gICAgICAgIOa6kOeggShpbnB1dCkge1xcbiAgICAgICAgICAgIHRoaXMuaHRtbCA9IGlucHV0O1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfSxcXG4gICAgICAgIOeVjOmdoihpbnB1dCkge1xcbiAgICAgICAgICAgIHRoaXMubGF5b3V0ID0gaW5wdXQ7XFxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgICAgICB9LFxcbiAgICAgICAg6aG156CBKGlucHV0KSB7XFxuICAgICAgICAgICAgdGhpcy5wYWdlID0gaW5wdXQ7XFxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgICAgICB9LFxcbiAgICAgICAg54q25oCBKGlucHV0KSB7XFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IGlucHV0O1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfSxcXG4gICAgICAgIOW8gOWQr+aQnOe0oihpbnB1dCkge1xcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PSB1bmRlZmluZWQpIHtcXG4gICAgICAgICAgICAgICAgaW5wdXQgPSB0cnVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aGlzLnNlYXJjaCA9IGlucHV0O1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfSxcXG4gICAgICAgIOW8gOWQr+aKmOWPoChpbnB1dCkge1xcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PSB1bmRlZmluZWQpIHtcXG4gICAgICAgICAgICAgICAgaW5wdXQgPSB0cnVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aGlzLmlzQm9vbGVhbihpbnB1dCk7XFxuICAgICAgICAgICAgdGhpcy5vcGVuID0gaW5wdXQ7XFxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgICAgICB9LFxcbiAgICAgICAgc2V0VGl0bGUoaywgaSwgdCkge1xcbiAgICAgICAgICAgIHJldHVybiBrID09IGkgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIHQuZm9udGNvbG9yKHRoaXMu5YiG57G76aKc6ImyKSA6IHQ7XFxuICAgICAgICB9LFxcbiAgICAgICAgYWN0aW9uKG9iaikge1xcbiAgICAgICAgICAgIHJldHVybiBbe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIua4hemZpOeKtuaAgVxcXCIsXFxuICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChvYmopID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhvYmopO1xcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcihvYmouc3RhdGUpO1xcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwiaGVhZC5jYXRlXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKCdjYXRlX2J1dHRvbicpO1xcbiAgICAgICAgICAgICAgICAgICAgb2JqLmFsbC5mb3JFYWNoKChpdGVtKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcihpdGVtKTtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgb2JqLmNsLmZvckVhY2goKGl0ZW0pID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKGl0ZW0pO1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICB9LCBvYmopLFxcbiAgICAgICAgICAgIH0sIF07XFxuICAgICAgICB9LFxcbiAgICAgICAgY2hlY2tQYXJhbSgpIHtcXG4gICAgICAgICAgICB2YXIgb2JqID0ge307XFxuICAgICAgICAgICAgaWYgKHRoaXMucGFnZSA9PSAwICYmIHR5cGVvZiBwYWdlID09IFxcXCJ1bmRlZmluZWRcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+35Lyg5YWl6aG156CBXFxcIik7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYWdlID09IFxcXCJ1bmRlZmluZWRcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICBvYmpbXFxcIumhteeggVxcXCJdID0gdGhpcy5wYWdlO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgb2JqW1xcXCLpobXnoIFcXFwiXSA9IHBhZ2U7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHRoaXMuaHRtbCA9PSBcXFwiZW1wdHlcXFwiICYmIHR5cGVvZiBodG1sID09IFxcXCJ1bmRlZmluZWRcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+35Lyg5YWl5rqQ56CBXFxcIik7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBodG1sID09IFxcXCJ1bmRlZmluZWRcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICBvYmpbXFxcIua6kOeggVxcXCJdID0gdGhpcy5odG1sO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgb2JqW1xcXCLmupDnoIFcXFwiXSA9IGh0bWw7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHRoaXMubGF5b3V0ID09IFxcXCJ1bmRlZmluZWRcXFwiICYmIHR5cGVvZiBkID09IFxcXCJ1bmRlZmluZWRcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+35Lyg5YWl55WM6Z2iXFxcIik7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkID09IFxcXCJ1bmRlZmluZWRcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICBvYmpbXFxcIueVjOmdolxcXCJdID0gdGhpcy5sYXlvdXQ7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBvYmpbXFxcIueVjOmdolxcXCJdID0gZDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gb2JqO1xcbiAgICAgICAgfSxcXG4gICAgICAgIOWIm+W7uuWKqOaAgeWIhuexuyhydWxlT2JqKSB7XFxuICAgICAgICAgICAgbGV0IGl0ZW1zID0gW107XFxuICAgICAgICAgICAgbGV0IGNhdGVzID0gW107XFxuICAgICAgICAgICAgaWYgKHJ1bGVPYmogPT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVPYmogPSBbXTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgLy/liJ3lp4vljJblj5jph4/lvIDlp4tcXG4gICAgICAgICAgICBjb25zdCBwYXJhbSA9IHRoaXMuY2hlY2tQYXJhbSgpO1xcbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBwYXJhbS7pobXnoIE7XFxuICAgICAgICAgICAgY29uc3QgaHRtbCA9IHBhcmFtLua6kOeggTtcXG4gICAgICAgICAgICBjb25zdCBkID0gcGFyYW0u55WM6Z2iO1xcbiAgICAgICAgICAgIGNvbnN0IOeKtuaAgSA9IHRoaXMuc3RhdGU7XFxuICAgICAgICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zZWFyY2g7XFxuICAgICAgICAgICAgY29uc3QgZW1wdHkgPSBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgY29uc3Qg5oqY5Y+g54q25oCBID0gdGhpcy5vcGVuO1xcbiAgICAgICAgICAgIHZhciDlsZXlvIAgPSB0aGlzLuWxleW8gDtcXG4gICAgICAgICAgICB2YXIg5oqY5Y+gID0gdGhpcy7mipjlj6A7XFxuICAgICAgICAgICAgdmFyIOWFqOa4hSA9IHRoaXMuY2xlYXJhbGw7XFxuICAgICAgICAgICAgdmFyIOa4hemZpCA9IHRoaXMuY2xlYXJzO1xcbiAgICAgICAgICAgIC8v5Yid5aeL5YyW5Y+Y6YeP57uT5p2fXFxuICAgICAgICAgICAgbGV0IGluaXRfY2F0ZSA9IG5ldyBBcnJheSgyMCkuZmlsbChcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgIGNvbnN0IGZvbGQgPSBnZXRNeVZhcihNWV9SVUxFLmdyb3VwLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgIGNvbnN0IGNhdGVfdGVtcCA9IEpTT04ucGFyc2UoXFxuICAgICAgICAgICAgICAgIGdldE15VmFyKFxcXCJoZWFkLmNhdGVcXFwiLCBKU09OLnN0cmluZ2lmeShpbml0X2NhdGUpKVxcbiAgICAgICAgICAgICk7XFxuICAgICAgICAgICAgaWYgKHNlYXJjaCAmJiBwYWdlID09IDEpIHtcXG4gICAgICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXCInaGlrZXI6Ly9zZWFyY2g/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZSArIFxcXCImcz0nK2lucHV0XFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IFxcXCLmkJzntKLlhbPplK7or41cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoXFxcImtleXdvcmRcXFwiLCBcXFwiXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwia2V5d29yZFxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBjb25zdCBjYXRlZ29yaWVzID0gW107XFxuICAgICAgICAgICAgcnVsZU9iai5mb3JFYWNoKCh4KSA9PiB7XFxuICAgICAgICAgICAgICAgIHZhciBsaXN0ID0gW107XFxuICAgICAgICAgICAgICAgIC8vbG9nKHgpXFxuICAgICAgICAgICAgICAgIGlmICh4Lmpzb24gIT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgICAgICAgICAgICB4Lmpzb24ubWFwKGsgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3JpZXMucHVzaChKU09OLnN0cmluZ2lmeShrKS5yZXBsYWNlKC9eXFxcXFt8XFxcXF0kL2csICcnKSlcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICAvL2NhdGVnb3JpZXMucHVzaCh4Lmpzb24pXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKHgu5LiA57qn5a6a5L2NKSB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoeC7kuIDnuqflrprkvY0uc3RhcnRzV2l0aChcXFwiQGpzOlxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCA9IHRoaXMuZXZhbEpTUnVsZShodG1sLCB4LuS4gOe6p+WumuS9jSk7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgPSBwZGZhKGh0bWwsIHgu5LiA57qn5a6a5L2NKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAoeC7lpKfnsbvlrprkvY0pIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh4LuWkp+exu+WumuS9jS5zdGFydHNXaXRoKFxcXCJAanM6XFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ID0gdGhpcy5ldmFsSlNSdWxlKGh0bWwsIHgu5aSn57G75a6a5L2NKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCA9IFtwZGZhKGh0bWwsIHgu5aSn57G75a6a5L2NKS5qb2luKCdcXFxcbicpXTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAvLy0t6aKd5aSW5aSE55CGLS1cXG4gICAgICAgICAgICAgICAgaWYgKCgn5aKe5YqgJyBpbiB4KSkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHgu5aKe5YqgLmNvbnN0cnVjdG9yID09IFN0cmluZykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHgu5aKe5YqgID0gZXZhbCh4LuWinuWKoCk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBzbGlzdCA9IHgu5aKe5YqgLmNvbmNhdChzbGlzdCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKCgn6KGl5YWFJyBpbiB4KSkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHgu6KGl5YWFLmNvbnN0cnVjdG9yID09IFN0cmluZykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHgu6KGl5YWFID0gZXZhbCh4LuihpeWFhSk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBzbGlzdCA9IHNsaXN0LmNvbmNhdCh4LuihpeWFhSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgLy8tLemineWkluWkhOeQhi0tXFxuICAgICAgICAgICAgICAgIHZhciDkuIDnuqcgPSBsaXN0Lm1hcCgocykgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNsaXN0ID0gW107XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIShcXFwi5bCP57G7XFxcIiBpbiB4KSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHgu5bCP57G7ID0gXFxcImJvZHkmJmE6bm90KDptYXRjaGVzKOmmlumhtSkpOm5vdChhOm5vdChbaHJlZl0pKVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBpZiAoeC7lsI/nsbsuc3RhcnRzV2l0aChcXFwiQGpzOlxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc2xpc3QgPSB0aGlzLmV2YWxKU1J1bGUocywgeC7lsI/nsbspO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzbGlzdCA9IHBkZmEocywgeC7lsI/nsbspO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgdmFyIOWumuS9jSA9IHNsaXN0Lm1hcCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9IHRoaXMuZ2V0VGl0bGUoaXRlbSwgeC7moIfpopgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSB0aGlzLmdldFVybChpdGVtLCB4KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdXJsXFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqKTtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIOWumuS9jTtcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIC8vbG9nKOS4gOe6pylcXG4gICAgICAgICAgICAgICAgLy9sb2co5LiA57qnLmxlbmd0aClcXG4gICAgICAgICAgICAgICAgaWYgKOS4gOe6py5sZW5ndGggPT0gMSkge1xcbiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKOS4gOe6py5qb2luKFxcXCJcXFxcblxcXCIpKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIOS4gOe6py5mb3JFYWNoKChpdGVtKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKGl0ZW0uam9pbihcXFwiLFxcXCIpKTtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIC8vbG9nKGNhdGVnb3JpZXMpXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgaWYgKOaKmOWPoOeKtuaAgSkge1xcbiAgICAgICAgICAgICAgICBpZiAocGFnZSA9PSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogZm9sZCA9PT0gXFxcIjFcXFwiID8g5oqY5Y+gIDog5bGV5byALFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpdGxlLCBmb2xkLCB1LCBhbGwsIGV4cHMpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmb2xkID0gZ2V0TXlWYXIoTVlfUlVMRS5ncm91cCwgZm9sZCk7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgW+WxleW8gCwg5oqY5Y+gXSA9IGV4cHM7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9sZCA9PSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN4ID0gZmluZEl0ZW1zQnlDbHModGl0bGUgKyAnY2F0ZV9idXR0b24nKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcignY2F0ZV9idXR0b24nLCBjeCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKHRpdGxlICsgJ2NhdGVfYnV0dG9uJyk7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjeCA9IHN0b3JhZ2UwLmdldE15VmFyKCdjYXRlX2J1dHRvbicsIFtdKS5tYXAoeCA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhbJ2NvbF90eXBlJ10gPSB4Wydjb2xfdHlwZSddID8geFsnY29sX3R5cGUnXSA6IHhbJ3R5cGUnXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkSXRlbUFmdGVyKHRpdGxlICsgJ2NhdGVfbGluZScsIGN4KVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyphbGwuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKGl0ZW0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ki9cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0odGl0bGUgKyAnY2F0ZV9leHAnLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGZvbGQgPT0gMSA/IOWxleW8gCA6IOaKmOWPoCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihNWV9SVUxFLmdyb3VwLCBmb2xkID09PSBcXFwiMVxcXCIgPyBcXFwiMFxcXCIgOiBcXFwiMVxcXCIpO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNWV9SVUxFLnRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICDnirbmgIEsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIOWFqOa4hSwgW+WxleW8gCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOaKmOWPoFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogTVlfUlVMRS50aXRsZSArICdjYXRlX2V4cCcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdDbGljazogdGhpcy5hY3Rpb24oe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IOeKtuaAgSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbDog5YWo5riFLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6IOa4hemZpCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChwYWdlID09IDEpIHtcXG4gICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5mb3JFYWNoKChjYXRlZ29yeSwgaW5kZXgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIC8vbG9nKGNhdGVnb3J5KVxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN1Yl9jYXRlZ29yaWVzID0gW107XFxuICAgICAgICAgICAgICAgICAgICAvKmlmICjlsI/nsbvlrprkvY0uaW5jbHVkZXMoXFxcIjtcXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICBzdWJfY2F0ZWdvcmllcyA9IHBkZmEoY2F0ZWdvcnksIOWwj+exu+WumuS9jS5zcGxpdChcXFwiO1xcXCIpWzBdKTtcXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Yl9jYXRlZ29yaWVzLmxlbmd0aCA9PSAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc3ViX2NhdGVnb3JpZXMgPSBwZGZhKGNhdGVnb3J5LCDlsI/nsbvlrprkvY0uc3BsaXQoXFxcIjtcXFwiKVsxXSk7XFxuICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ki9cXG4gICAgICAgICAgICAgICAgICAgIC8vbG9nKGluZGV4KVxcbiAgICAgICAgICAgICAgICAgICAgc3ViX2NhdGVnb3JpZXMgPSBKU09OLnBhcnNlKGBbJHtjYXRlZ29yeX1dYCk7XFxuICAgICAgICAgICAgICAgICAgICAvL2xvZyhzdWJfY2F0ZWdvcmllcylcXG4gICAgICAgICAgICAgICAgICAgIC8vIHN1Yl9jYXRlZ29yaWVzID0gcGRmYShjYXRlZ29yeSwg5bCP57G75a6a5L2NKTtcXG4gICAgICAgICAgICAgICAgICAgIC8vfVxcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgLy/lpKfnsbtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJfY2F0ZWdvcmllcy5mb3JFYWNoKChpdGVtLCBrZXkpID0+IHtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgdGl0bGUgPSBwZGZoKGl0ZW0sIF/lpKfnsbvmoIfpopgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBpdGVtLnRpdGxlO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIOaOkumZpCAhPSBcXFwidW5kZWZpbmVkXFxcIiAmJiDmjpLpmaQgIT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUucmVwbGFjZShuZXdSZWdFeHAo5o6S6ZmkLCBcXFwiZ1xcXCIpLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGpzb24gPSAnJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uID0gaXRlbS51cmw7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlX3RlbXA6IGNhdGVfdGVtcCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleToga2V5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogcGFnZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyczog5riF6ZmkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbjoganNvbixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiDnirbmgIEsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxjbGVhcnM6IOWFqOa4hSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgdXJsID0gcGQoaXRlbSwgX+Wkp+exu+mTvuaOpSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBpdGVtLnVybDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppZiAo5aSn57G75aSE55CGKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0g5LiA57qn5YiG57G75aSE55CGKHVybCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0qL1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xvZyh1cmwpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuc2V0VGl0bGUoa2V5LnRvU3RyaW5nKCksIGNhdGVfdGVtcFtpbmRleF0sIHRpdGxlKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQoXFxcImhpa2VyOi8vZW1wdHkjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld19jYXRlID0gW107XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jbGVhcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcihpdGVtKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5hbGxjbGVhcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcihpdGVtKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoJ2NhdGVfYnV0dG9uJyk7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jYXRlX3RlbXAuZm9yRWFjaCgoY2F0ZSwgaW5kZXgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19jYXRlLnB1c2goaW5kZXggPT09IDAgPyBwYXJhbXMua2V5LnRvU3RyaW5nKCkgOiBcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcImhlYWQuY2F0ZVxcXCIsIEpTT04uc3RyaW5naWZ5KG5ld19jYXRlKSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuanNvbi5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiZHRfXFxcIiArIHBhcmFtcy5qc29uLnR5cGUsIHBhcmFtcy5qc29uLnZhbHVlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhcmFtcy5zdGF0ZSwgcGFyYW1zLmpzb24pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYmxhbmtfYmxvY2tcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX1JVTEUudGl0bGUgKyAnY2F0ZV9saW5lJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAvL+Wwj+exu1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXh0cmFwb3MgPSBmYWxzZTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppZiAoaXRlbS5pbmNsdWRlcygndHlwZT1cXFwiQGV4dHJhXFxcIicpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFwb3MgPSB0cnVlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbG9nKCfpmYTliqDlrprkvY0nKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ki9cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhcG9zKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGl0bGUgPSBwZGZoKGl0ZW0sIFxcXCJhJiZUZXh0XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIOaOkumZpCAhPSBcXFwidW5kZWZpbmVkXFxcIiAmJiDmjpLpmaQgIT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnJlcGxhY2UobmV3IFJlZ0V4cCjmjpLpmaQsIFxcXCJnXFxcIiksIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqc29uID0ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHBkZmgoaXRlbSwgXFxcImEmJnN0YXRlXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBkZmgoaXRlbSwgXFxcImEmJnZhbHVlXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXIgdGl0bGUgPSBwZGZoKGl0ZW0sIOWIhuexu+agh+mimCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGl0bGUgPSBpdGVtLnRpdGxlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiDmjpLpmaQgIT0gXFxcInVuZGVmaW5lZFxcXCIgJiYg5o6S6ZmkICE9IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5yZXBsYWNlKG5ldyBSZWdFeHAo5o6S6ZmkLCBcXFwiZ1xcXCIpLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIganNvbiA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypzd2l0Y2ggKHRydWUpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSDliIbnsbvpk77mjqUuaW5jbHVkZXMoXFxcIkBAQFxcXCIpOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gPSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBwZGZoKGl0ZW0sIOWIhuexu+mTvuaOpS5zcGxpdChcXFwiQEBAXFxcIilbMF0pLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBkZmgoaXRlbSwg5YiG57G76ZO+5o6lLnNwbGl0KFxcXCJAQEBcXFwiKVsxXSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSDliIbnsbvpk77mjqUuaW5jbHVkZXMoXFxcIkBAXFxcIik6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbiA9IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IOWIhuexu+mTvuaOpS5zcGxpdChcXFwiQEBcXFwiKVswXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwZGZoKGl0ZW0sIOWIhuexu+mTvuaOpS5zcGxpdChcXFwiQEBcXFwiKVsxXSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uID0gaXRlbS51cmw7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganNvbiA9IHBkKGl0ZW0sIOWIhuexu+mTvuaOpSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ki9cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gPSBpdGVtLnVybDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdmFyIGpzb2495YiG57G76ZO+5o6lLmluY2x1ZGVzKCdAQEAnKT97XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOnBkZmgoaXRlbSzliIbnsbvpk77mjqUuc3BsaXQoJ0BAQCcpWzBdKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOnBkZmgoaXRlbSzliIbnsbvpk77mjqUuc3BsaXQoJ0BAQCcpWzFdKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTpwZChpdGVtLOWIhuexu+mTvuaOpSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb2495YiG57G76ZO+5o6lLmluY2x1ZGVzKCdAQCcpP3tcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU65YiG57G76ZO+5o6lLnNwbGl0KCdAQCcpWzBdLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6cGRmaChpdGVtLOWIhuexu+mTvuaOpS5zcGxpdCgnQEAnKVsxXSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH06cGQoaXRlbSzliIbnsbvpk77mjqUpOyovXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVfdGVtcDogY2F0ZV90ZW1wLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBrZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiBwYWdlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbjoganNvbixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiDnirbmgIEsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxjbGVhcnM6IOWFqOa4hSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5zZXRUaXRsZShrZXkudG9TdHJpbmcoKSwgY2F0ZV90ZW1wW2luZGV4XSwgdGl0bGUpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKFxcXCJoaWtlcjovL2VtcHR5XFxcIiArIFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmFsbGNsZWFycy5mb3JFYWNoKChpdGVtKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKGl0ZW0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcignY2F0ZV9idXR0b24nKTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNhdGVfdGVtcFtwYXJhbXMuaW5kZXhdID0gcGFyYW1zLmtleS50b1N0cmluZygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiaGVhZC5jYXRlXFxcIiwgSlNPTi5zdHJpbmdpZnkocGFyYW1zLmNhdGVfdGVtcCkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmpzb24uY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcImR0X1xcXCIgKyBwYXJhbXMuanNvbi50eXBlLCBwYXJhbXMuanNvbi52YWx1ZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihwYXJhbXMuc3RhdGUsIHBhcmFtcy5qc29uKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsczogTVlfUlVMRS50aXRsZSArICdjYXRlX2J1dHRvbicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVzLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsczogTVlfUlVMRS50aXRsZSArICdjYXRlX2J1dHRvbicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChmb2xkID09PSBcXFwiMVxcXCIgfHwg5oqY5Y+g54q25oCBID09IGZhbHNlKSB7XFxuICAgICAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KGNhdGVzKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKGZvbGQgPT09IFxcXCIwXFxcIikge1xcbiAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcignY2F0ZV9idXR0b24nLCBjYXRlcylcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRQcmVSZXN1bHQgIT0gJ3VuZGVmaW5lZCcpIHtcXG4gICAgICAgICAgICAgICAgaXRlbXMgPSBkLmNvbmNhdChpdGVtcyk7XFxuICAgICAgICAgICAgICAgIC8v5riF56m657un5om/5pWw57uEXFxuICAgICAgICAgICAgICAgIGQubGVuZ3RoID0gMDtcXG4gICAgICAgICAgICAgICAgc2V0UHJlUmVzdWx0KGl0ZW1zKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgZC5wdXNoKGl0ZW0pO1xcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuICAgIH07XFxuICAgIG9iai7pooTorr4ob3B0aW9ucyk7XFxuICAgIHJldHVybiBvYmo7XFxufVxcblxcbnZhciDnirbmgIEgPVxcbiAgICB0eXBlb2Yg54q25oCB5qCH6K6wICE9IFxcXCJ1bmRlZmluZWRcXFwiICYmIOeKtuaAgeagh+iusCAhPSBcXFwiXFxcIiA/IOeKtuaAgeagh+iusCA6IE1ZX1JVTEUudXJsO1xcblxcbmxldCBkdF9kZWJ1ZyA9IGZhbHNlO1xcblxcbmFkZExpc3RlbmVyKFxcbiAgICBcXFwib25DbG9zZVxcXCIsXFxuICAgICQudG9TdHJpbmcoKCkgPT4ge30pXFxuKTtcXG5cXG52YXIgQ3JlYXRlID0ge1xcbiAgICBuZXh0UGFnZTogZnVuY3Rpb24oKSB7XFxuICAgICAgICB2YXIgcmVzdWx0ID0gZmFsc2U7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIHZhciBuZXh0ID0gZXZhbCjkuIvkuIDpobUpO1xcbiAgICAgICAgICAgIC8vbG9nKCduOicrbmV4dClcXG4gICAgICAgICAgICBpZiAobmV4dCA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ+S4i+S4gOmhtemTvuaOpeS4uuepuicpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XFxuICAgICAgICAgICAgaWYgKHRydWVfdXJsID09IG5leHQpIHtcXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIC8vbG9nKFxcXCLlj6/og73kuI3lrZjlnKjkuIvkuIDpobXmiJbogIXkuIvkuIDpobXlrprkvY3mnInpl67pophcXFwiKTtcXG4gICAgICAgICAgICBsb2coXFxcIumUmeivr+S/oeaBrzpcXFwiICsgZS5tZXNzYWdlKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICgobmV4dCA9PSBcXFwiXFxcIiB8fCBuZXh0ID09IHVuZGVmaW5lZCkgJiYgcGFnZSA9PSAxKSB7XFxuICAgICAgICAgICAgbmV4dCA9IHRydWVfdXJsO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAvL3Jlc3VsdD1mYWxzZTtcXG4gICAgICAgICAgICBuZXh0ID0gZ2V0TXlWYXIo54q25oCBKTtcXG4gICAgICAgIH1cXG4gICAgICAgIC8vbG9nKCdsJyt0cnVlX3VybClcXG4gICAgICAgIC8vbG9nKCduJytuZXh0KVxcbiAgICAgICAgaWYgKHBhZ2UgIT0gMSkge1xcbiAgICAgICAgICAgIGlmICh0cnVlX3VybCA9PSBuZXh0ICYmICFyZXN1bHQpIHtcXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICAgICAgLy9wdXRNeVZhcijnirbmgIEsIG5leHQpO1xcbiAgICB9LFxcbiAgICBnZXRCYWNrSW1hZ2U6IGZ1bmN0aW9uKGltZ3VybCkge1xcbiAgICAgICAgdmFyIHJlc3VsdCA9IGltZ3VybDtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgcmVzdWx0ID0gL3VybCg/OlxcXFxzKyk/XFxcXCgoLio/KVxcXFwpL2dcXG4gICAgICAgICAgICAgICAgLmV4ZWMoaW1ndXJsKVsxXVxcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvKCd8XFxcInwmcXVvdDspL2dtLCBcXFwiXFxcIik7XFxuICAgICAgICB9IGNhdGNoIHt9XFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICB9LFxcbiAgICBodHRwSGFuZGxlOiBmdW5jdGlvbihpbnB1dCkge1xcbiAgICAgICAgaWYgKGlucHV0LnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcXG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuc3RhcnRzV2l0aChcXFwiLy9cXFwiKSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaHR0cHM6XFxcIiArIGlucHV0O1xcbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5zdGFydHNXaXRoKFxcXCIvXFxcIikpIHtcXG4gICAgICAgICAgICByZXR1cm4gTVlfSE9NRSArIGlucHV0O1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICBpbWdIYW5kbGU6IGZ1bmN0aW9uKGl0ZW0sIHJ1bGUpIHtcXG4gICAgICAgIHZhciBpbWcgPSBcXFwiXFxcIjtcXG4gICAgICAgIGlmIChydWxlLmltZy5zdGFydHNXaXRoKFxcXCJwZFxcXCIpKSB7XFxuICAgICAgICAgICAgaW1nID0gZXZhbChydWxlLmltZyk7XFxuICAgICAgICB9IGVsc2UgaWYgKHJ1bGUuYmFja2ltZykge1xcbiAgICAgICAgICAgIGltZyA9IHBkZmgoaXRlbSwgcnVsZS5pbWcpO1xcbiAgICAgICAgICAgIGltZyA9IHRoaXMuZ2V0QmFja0ltYWdlKGltZyk7XFxuICAgICAgICAgICAgaW1nID0gdGhpcy5odHRwSGFuZGxlKGltZyk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGltZyA9IHBkZmgoaXRlbSwgcnVsZS5pbWcpO1xcbiAgICAgICAgICAgIGlmICghaW1nLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgICAgICAgICAgICBpbWcgPSBwZChpdGVtLCBydWxlLmltZyk7XFxuICAgICAgICAgICAgICAgIGltZyA9IHRoaXMuaHR0cEhhbmRsZShpbWcpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBpbWcgKyBydWxlLnJlZjtcXG4gICAgfSxcXG4gICAgdXJsSGFuZGxlOiBmdW5jdGlvbihpdGVtLCBydWxlKSB7XFxuICAgICAgICB2YXIgaHJlZiA9IFxcXCJcXFwiO1xcbiAgICAgICAgaWYgKHJ1bGUudXJsLnN0YXJ0c1dpdGgoXFxcInBkXFxcIikpIHtcXG4gICAgICAgICAgICBocmVmID0gZXZhbChydWxlLnVybCk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGhyZWYgPSBwZChpdGVtLCBydWxlLnVybCk7XFxuICAgICAgICB9XFxuICAgICAgICBocmVmID0gcnVsZS5pbXQgPyBocmVmICsgXFxcIiNpbW1lcnNpdmVUaGVtZSNcXFwiIDogaHJlZjtcXG4gICAgICAgIHJldHVybiBocmVmO1xcbiAgICB9LFxcbiAgICBzZXRDb250ZW50OiBmdW5jdGlvbihpdGVtLCBpbnB1dCkge1xcbiAgICAgICAgbGV0IG91dHB1dCA9IFxcXCJcXFwiO1xcbiAgICAgICAgaWYgKGlucHV0ID09IHVuZGVmaW5lZCkge1xcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aChcXFwicGRcXFwiKSkge1xcbiAgICAgICAgICAgIG91dHB1dCA9IGV2YWwoaW5wdXQpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBvdXRwdXQgPSBwZGZoKGl0ZW0sIGlucHV0KTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XFxuICAgIH0sXFxuICAgIHJlZnJlc2g6IGZ1bmN0aW9uKCkge1xcbiAgICAgICAgYWRkTGlzdGVuZXIoXFxuICAgICAgICAgICAgXFxcIm9uUmVmcmVzaFxcXCIsXFxuICAgICAgICAgICAgJC50b1N0cmluZygodSkgPT4ge1xcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJ5aWxpc3RcXFwiKTtcXG4gICAgICAgICAgICAgICAgLy92YXIgcCA9IHN0b3JhZ2UwLmdldE15VmFyKCdzcGFnZScsICcnKTtcXG4gICAgICAgICAgICAgICAgLy9wdXRNeVZhcih1LCBwKTtcXG4gICAgICAgICAgICB9LCDnirbmgIEpXFxuICAgICAgICApO1xcbiAgICB9LFxcbiAgICBnZXRCb29sZWFuVmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcXG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gQm9vbGVhbih2YWx1ZSkgOiAoZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiB0cnVlKTtcXG4gICAgfSxcXG4gICAgZGVidWdsb2c6IGZ1bmN0aW9uKGksIGl0ZW0sIHJ1bGUsIG9iaikge1xcbiAgICAgICAgbG9nKCctLS0tLS0tLS0tJyArIChpICsgMSkgKyAnOuiwg+ivleW8gOWniy0tLS0tLS0tLS0nKTtcXG4gICAgICAgIGlmIChpdGVtLmNvbnN0cnVjdG9yID09IE9iamVjdCkge1xcbiAgICAgICAgICAgIGl0ZW0gPSBKU09OLnN0cmluZ2lmeShpdGVtKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxvZygnaXRlbeWGheWuuTpcXFxcclxcXFxuJyArIGl0ZW0gKyAnXFxcXHJcXFxcbicgK1xcbiAgICAgICAgICAgIGBcXFxcblxcXFx0dGl0bGXlrprkvY06ICAke3J1bGUudGl0bGV9ICAtLS0+IOe7k+aenDogICR7b2JqLnRpdGxlfWAgK1xcbiAgICAgICAgICAgIGBcXFxcblxcXFx0ZGVzY+WumuS9jTogICR7cnVsZS5kZXNjfSAgLS0tPiDnu5Pmnpw6ICAke29iai5kZXNjfWAgK1xcbiAgICAgICAgICAgIGBcXFxcblxcXFx0aW1n5a6a5L2NOiAgJHtydWxlLmltZ30gIC0tLT4g57uT5p6cOiAgJHtvYmouaW1nfWAgK1xcbiAgICAgICAgICAgIChydWxlLmNvbnRlbnQgIT0gdW5kZWZpbmVkID8gYFxcXFxuXFxcXHRjb250ZW505a6a5L2NOiAgJHtydWxlLmNvbnRlbnR9ICAtLS0+IOe7k+aenDogICR7b2JqLmNvbnRlbnR9YCA6ICcnKSArXFxuICAgICAgICAgICAgYFxcXFxuXFxcXHR1cmzlrprkvY06ICAke3J1bGUudXJsfSAgLS0tPiDnu5Pmnpw6ICAke29iai51cmx9YFxcbiAgICAgICAgKTtcXG4gICAgICAgIGxvZygnLS0tLS0tLS0tLScgKyAoaSArIDEpICsgJzrosIPor5Xnu5PmnZ8tLS0tLS0tLS0tJyk7XFxuICAgIH0sXFxuICAgIGpzb25MaXN0OiBmdW5jdGlvbihhcnIsIGpzb24sIHJ1bGUpIHtcXG4gICAgICAgIGlmIChqc29uLmNvbnN0cnVjdG9yICE9IE9iamVjdCkge1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGpzb24gPSBKU09OLnBhcnNlKGpzb24pO1xcbiAgICAgICAgICAgIH0gY2F0Y2gge31cXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChqc29uW3J1bGUubGlzdF0gPT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgICAgYXJyLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxmb250IGNvbG9yPVxcXCJncmV5XFxcIj48c21hbGw+5peg5YaF5a65PC9zbWFsbD48L2ZvbnQ+JyxcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7fSxcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm47XFxuICAgICAgICB9XFxuICAgICAgICB2YXIgZGVidWcgPSB0aGlzLmdldEJvb2xlYW5WYWx1ZShydWxlLmRlYnVnLCBmYWxzZSk7XFxuICAgICAgICB2YXIgZW1wdHkgPSB0aGlzLmdldEJvb2xlYW5WYWx1ZShydWxlLmVtcHR5KTtcXG4gICAgICAgIGlmIChkZWJ1Zykge1xcbiAgICAgICAgICAgIGxvZygn5a6a5L2N5YiX6KGoOicgKyBydWxlLmxpc3QpO1xcbiAgICAgICAgfVxcbiAgICAgICAganNvbltydWxlLmxpc3RdLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcXG4gICAgICAgICAgICB2YXIgdGl0bGUgPSBldmFsKHJ1bGUudGl0bGUpO1xcbiAgICAgICAgICAgIHZhciBkZXNjID0gZXZhbChydWxlLmRlc2MpO1xcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gZXZhbChydWxlLmNvbnRlbnQpO1xcbiAgICAgICAgICAgIHZhciBpbWcgPSBldmFsKHJ1bGUuaW1nKSArIHJ1bGUucmVmO1xcbiAgICAgICAgICAgIHZhciBocmVmID0gZXZhbChydWxlLnVybCk7XFxuICAgICAgICAgICAgdmFyIHVybCA9IHJ1bGUuaW10ID8gaHJlZiArIFxcXCIjaW1tZXJzaXZlVGhlbWUjXFxcIiA6IGhyZWY7XFxuICAgICAgICAgICAgdmFyIGxhenkgPSBydWxlLmxhenkgPyBydWxlLmxhenkgOiBcXFwiXFxcIjtcXG5cXG4gICAgICAgICAgICB2YXIgZGQgPSB7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgZGVzYzogZGVzYyxcXG4gICAgICAgICAgICAgICAgY29udGVudDogY29udGVudCxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogaW1nLFxcbiAgICAgICAgICAgICAgICB1cmw6IChlbXB0eSA/IFxcXCJoaWtlcjovL2VtcHR5IyNcXFwiIDogJycpICsgdXJsLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogcnVsZS5jb2xfdHlwZSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGltZzogaW1nLFxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIH07XFxuXFxuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XFxuICAgICAgICAgICAgICAgIHZhciByeCA9IHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYyxcXG4gICAgICAgICAgICAgICAgICAgIGltZyxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsXFxuICAgICAgICAgICAgICAgICAgICB1cmxcXG4gICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1Z2xvZyhpLCBpdGVtLCBydWxlLCByeCk7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGlmIChsYXp5ICE9IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGRkW1xcXCJ1cmxcXFwiXSA9IGhyZWYgKyBsYXp5O1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBhcnIucHVzaChkZCk7XFxuICAgICAgICB9KTtcXG4gICAgfSxcXG4gICAgcnVsZUxpc3Q6IGZ1bmN0aW9uKGFyciwgaHRtbCwgcnVsZSkge1xcbiAgICAgICAgdmFyIGxpc3QgPSBwZGZhKGh0bWwsXFxuICAgICAgICAgICAgcnVsZS5saXN0KTtcXG4gICAgICAgIHZhciBkZWJ1ZyA9IHRoaXMuZ2V0Qm9vbGVhblZhbHVlKHJ1bGUuZGVidWcsXFxuICAgICAgICAgICAgZmFsc2UpO1xcbiAgICAgICAgdmFyIGVtcHR5ID0gdGhpcy5nZXRCb29sZWFuVmFsdWUocnVsZS5lbXB0eSk7XFxuICAgICAgICBpZiAoZGVidWcpIHtcXG4gICAgICAgICAgICBsb2coJ+WumuS9jeWIl+ihqDonICsgcnVsZS5saXN0KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxpc3QuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xcbiAgICAgICAgICAgIHZhciB0aXRsZSA9IHRoaXMuc2V0Q29udGVudChpdGVtLCBydWxlLnRpdGxlKTtcXG4gICAgICAgICAgICB2YXIgZGVzYyA9IHRoaXMuc2V0Q29udGVudChpdGVtLCBydWxlLmRlc2MpO1xcbiAgICAgICAgICAgIHZhciBpbWcgPSB0aGlzLmltZ0hhbmRsZShpdGVtLCBydWxlKTtcXG4gICAgICAgICAgICB2YXIgdXJsID0gdGhpcy51cmxIYW5kbGUoaXRlbSwgcnVsZSk7XFxuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSB0aGlzLnNldENvbnRlbnQoaXRlbSwgcnVsZS5jb250ZW50KTtcXG5cXG4gICAgICAgICAgICBpZiAoZGVidWcpIHtcXG4gICAgICAgICAgICAgICAgdmFyIHJ4ID0ge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjLFxcbiAgICAgICAgICAgICAgICAgICAgaW1nLFxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCxcXG4gICAgICAgICAgICAgICAgICAgIHVybFxcbiAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnbG9nKGksIGl0ZW0sIHJ1bGUsIHJ4KTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgdmFyIGxhenkgPSBydWxlLmxhenkgPyBydWxlLmxhenkgOiBcXFwiXFxcIjtcXG4gICAgICAgICAgICB2YXIgZGQgPSB7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgZGVzYzogZGVzYyxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogaW1nLFxcbiAgICAgICAgICAgICAgICB1cmw6IChlbXB0eSA/IFxcXCJoaWtlcjovL2VtcHR5IyNcXFwiIDogJycpICsgdXJsLFxcbiAgICAgICAgICAgICAgICBjb250ZW50OiBjb250ZW50LFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogcnVsZS5jb2xfdHlwZSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGltZzogaW1nLFxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgaWYgKGxhenkgIT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgZGRbXFxcInVybFxcXCJdID0gdXJsICsgbGF6eTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgYXJyLnB1c2goZGQpO1xcbiAgICAgICAgfSk7XFxuICAgIH0sXFxuICAgIExpc3Q6IGZ1bmN0aW9uKGFyciwgaHRtbCwgcnVsZSwgcGFyYW0pIHtcXG4gICAgICAgIHBhcmFtID0gcGFyYW0gPyBwYXJhbSA6IHt9O1xcbiAgICAgICAgdmFyIGF1dG8gPSBwYXJhbS5hdXRvID8gcGFyYW0uYXV0byA6IGZhbHNlO1xcbiAgICAgICAgdmFyIHNob3cgPSBwYXJhbS5zaG93ID8gcGFyYW0uc2hvdyA6IGZhbHNlO1xcbiAgICAgICAgaWYgKHBhZ2UgPT0gMSkge1xcbiAgICAgICAgICAgIC8vdGhpcy5zcGFnZS5zZXQodHJ1ZV91cmwpO1xcbiAgICAgICAgfVxcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XFxuICAgICAgICB2YXIgZGVidWcgPSB0aGlzLmdldEJvb2xlYW5WYWx1ZShydWxlLmRlYnVnLCBmYWxzZSk7XFxuICAgICAgICB2YXIgZW1wdHkgPSB0aGlzLmdldEJvb2xlYW5WYWx1ZShydWxlLmVtcHR5KTtcXG4gICAgICAgIHZhciBsaXN0ID0gcGRmYShodG1sLCBydWxlLmxpc3QpO1xcbiAgICAgICAgaWYgKGRlYnVnKSB7XFxuICAgICAgICAgICAgbG9nKCflrprkvY3liJfooag6JyArIHJ1bGUubGlzdCk7XFxuICAgICAgICB9XFxuICAgICAgICAvL2xvZyh0aGlzLm5leHRQYWdlKCkpXFxuICAgICAgICBpZiAoKHN0b3JhZ2UwLmdldE15VmFyKCd5aV9pc25leHQnLCAndCcpID09ICd0JyAmJiBsaXN0Lmxlbmd0aCA+IDApIHx8IHBhZ2UgPT0gMSkge1xcbiAgICAgICAgICAgIGxpc3QuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xcbiAgICAgICAgICAgICAgICBkZWxldGVJdGVtKFxcXCJwYWdlbnVtXFxcIik7XFxuICAgICAgICAgICAgICAgIGRlbGV0ZUl0ZW0oXFxcInBhZ2VsaW5lXFxcIik7XFxuICAgICAgICAgICAgICAgIHZhciBpZCA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICB2YXIgY2xzID0gXFxcIlxcXCI7XFxuICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9IHRoaXMuc2V0Q29udGVudChpdGVtLCBydWxlLnRpdGxlKTtcXG4gICAgICAgICAgICAgICAgdmFyIGRlc2MgPSB0aGlzLnNldENvbnRlbnQoaXRlbSwgcnVsZS5kZXNjKTtcXG4gICAgICAgICAgICAgICAgdmFyIGltZyA9IHRoaXMuaW1nSGFuZGxlKGl0ZW0sIHJ1bGUpO1xcbiAgICAgICAgICAgICAgICB2YXIgdXJsID0gdGhpcy51cmxIYW5kbGUoaXRlbSwgcnVsZSk7XFxuICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gdGhpcy5zZXRDb250ZW50KGl0ZW0sIHJ1bGUuY29udGVudCk7XFxuXFxuICAgICAgICAgICAgICAgIGlmIChkZWJ1Zykge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJ4ID0ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MsXFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsXFxuICAgICAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1Z2xvZyhpLCBpdGVtLCBydWxlLCByeCk7XFxuICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gbGlzdC5sZW5ndGggLSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICBpZCA9IFxcXCJsYXN0aWRfXFxcIiArIHBhZ2U7XFxuICAgICAgICAgICAgICAgICAgICBjbHMgPSBcXFwibGFzdG1hcmtcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBkZXNjLFxcbiAgICAgICAgICAgICAgICAgICAgcGljX3VybDogaW1nLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAoZW1wdHkgPyBcXFwiaGlrZXI6Ly9lbXB0eSMjXFxcIiA6ICcnKSArIHVybCxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogcnVsZS5jb2xfdHlwZSxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nOiBpbWcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGlkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsczogY2xzLFxcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIGlmIChpID09IGxpc3QubGVuZ3RoIC0gMSAmJiBzaG93KSB7XFxuICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFxcXCJwYWdlbGluZVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcblxcbiAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnTxzbWFsbD7liqDovb3kuK0uLi48L3NtYWxsPlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogXFxcInBhZ2VudW1cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKFxcXCJwYWdlbnVtXFxcIiwge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxmb250IGNvbG9yPVxcXCJncmV5XFxcIj48c21hbGw+5Yiw5bqV5LqGPC9zbWFsbD48L2ZvbnQ+JyxcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogXFxcImxhc3RcXFwiLFxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09IDAgJiYgcGFnZSA9PSAxKSB7XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIixcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxmb250IGNvbG9yPVxcXCJncmV5XFxcIj48c21hbGw+5peg5YaF5a65PC9zbWFsbD48L2ZvbnQ+JyxcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7fSxcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICh0aGlzLm5leHRQYWdlKCkpIHtcXG4gICAgICAgICAgICAvL2xvZygndCcpO1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKCd5aV9pc25leHQnLCAndCcpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAvL2xvZygnZicpO1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKCd5aV9pc25leHQnLCAnZicpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGF1dG8pIHtcXG4gICAgICAgICAgICAvL2NyZWF0ZU5leHRQYWdlKCk7XFxuICAgICAgICAgICAgYXV0b1BhZ2UoKTtcXG4gICAgICAgIH1cXG4gICAgfSxcXG59O1xcblxcbnZhciBleHRNZXRob2QgPSB7XFxuICAgIFRvUGFyYW1zOiBmdW5jdGlvbigpIHtcXG4gICAgICAgIHZhciBqc29uID0gYXJndW1lbnRzWzBdO1xcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGpzb24pXFxuICAgICAgICAgICAgLm1hcCgoa2V5KSA9PiBrZXkgKyBcXFwiPVxcXCIgKyBqc29uW2tleV0pXFxuICAgICAgICAgICAgLmpvaW4oXFxcIiZcXFwiKTtcXG4gICAgfSxcXG4gICAgdXJsUGFyc2U6IGZ1bmN0aW9uKHUpIHtcXG4gICAgICAgIHZhciBkaWN0ID0ge307XFxuICAgICAgICBkaWN0LlNvdXJjZSA9IHU7XFxuICAgICAgICBsZXQgcGFyYW1zID0gKHVybCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBxdWVyeVBhcmFtcyA9IHt9O1xcbiAgICAgICAgICAgIGxldCByZWcgPSAvKFtePz0mXSspPShbXj89Jl0rKS9nO1xcbiAgICAgICAgICAgIHVybC5yZXBsYWNlKHJlZywgZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zW2FyZ3VtZW50c1sxXV0gPSBhcmd1bWVudHNbMl07XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW1zO1xcbiAgICAgICAgfTtcXG4gICAgICAgIHZhciBqYXZhVXJsID0gSmF2YUltcG9ydGVyKGphdmEubmV0LlVSTCk7XFxuICAgICAgICB3aXRoKGphdmFVcmwpIHtcXG4gICAgICAgICAgICB2YXIgdXJsID0gbmV3IFVSTCh1KTtcXG4gICAgICAgICAgICBkaWN0LlByb3RvY29sID0gdXJsLmdldFByb3RvY29sKCk7XFxuICAgICAgICAgICAgZGljdC5Ib3N0ID0gdXJsLmdldEhvc3QoKTtcXG4gICAgICAgICAgICBkaWN0LlBvcnQgPSB1cmwuZ2V0UG9ydCgpO1xcbiAgICAgICAgICAgIGRpY3QuRmlsZSA9IHVybC5nZXRGaWxlKCk7XFxuICAgICAgICAgICAgZGljdC5QYXRoID0gdXJsLmdldFBhdGgoKTtcXG4gICAgICAgICAgICBkaWN0LlJlZiA9IHVybC5nZXRSZWYoKTtcXG4gICAgICAgICAgICBkaWN0Lkhvc3RzID0gYCR7ZGljdC5Qcm90b2NvbH06Ly8ke3VybC5nZXRIb3N0KCl9YDtcXG4gICAgICAgIH1cXG4gICAgICAgIGRpY3QuUGFyYW1zID0gcGFyYW1zKHUpO1xcbiAgICAgICAgcmV0dXJuIGRpY3Q7XFxuICAgIH0sXFxuICAgIGlzRXF1YWw6IGZ1bmN0aW9uKHgsIHkpIHtcXG4gICAgICAgIGNvbnN0IG9rID0gT2JqZWN0LmtleXMsXFxuICAgICAgICAgICAgdHggPSB0eXBlb2YgeCxcXG4gICAgICAgICAgICB0eSA9IHR5cGVvZiB5O1xcbiAgICAgICAgcmV0dXJuIHggJiYgeSAmJiB0eCA9PT0gXFxcIm9iamVjdFxcXCIgJiYgdHggPT09IHR5ID9cXG4gICAgICAgICAgICBvayh4KS5sZW5ndGggPT09IG9rKHkpLmxlbmd0aCAmJlxcbiAgICAgICAgICAgIG9rKHgpLmV2ZXJ5KChrZXkpID0+IHRoaXMuaXNFcXVhbCh4W2tleV0sIHlba2V5XSkpIDogeCA9PT0geTtcXG4gICAgfSxcXG4gICAgZmluZERpZmZlcmVudEluZGV4OiBmdW5jdGlvbihzdHIxLCBzdHIyKSB7XFxuICAgICAgICBjb25zdCBkaWZmQ2hhcnMgPSBbXTtcXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyMi5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgIGlmIChzdHIxW2ldICE9PSBzdHIyW2ldKSB7XFxuICAgICAgICAgICAgICAgIGRpZmZDaGFycy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBpLFxcbiAgICAgICAgICAgICAgICAgICAgczE6IHN0cjFbaV0sXFxuICAgICAgICAgICAgICAgICAgICBzMjogc3RyMltpXSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGRpZmZDaGFycztcXG4gICAgfSxcXG4gICAgcmVwbGFjZUNoYXJBdDogZnVuY3Rpb24oc3RyLCBpbmRleCwgcmVwbGFjZW1lbnQpIHtcXG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc3RyLmxlbmd0aCkge1xcbiAgICAgICAgICAgIHJldHVybiBzdHI7XFxuICAgICAgICB9XFxuICAgICAgICAvL2xvZyhpbmRleClcXG4gICAgICAgIGNvbnN0IGFyciA9IHN0ci5zcGxpdChcXFwiXFxcIik7XFxuICAgICAgICBhcnJbaW5kZXhdID0gcmVwbGFjZW1lbnQ7XFxuICAgICAgICByZXR1cm4gYXJyLmpvaW4oXFxcIlxcXCIpO1xcbiAgICB9LFxcbiAgICBnZXRPYmplY3RLZXlzRGlmZjogZnVuY3Rpb24ob2JqMSwgb2JqMikge1xcbiAgICAgICAgY29uc3QgZGlmZmVyZW50S2V5cyA9IFtdO1xcbiAgICAgICAgZm9yIChsZXQga2V5IGluIG9iajEpIHtcXG4gICAgICAgICAgICBpZiAoIW9iajIuaGFzT3duUHJvcGVydHkoa2V5KSB8fCBvYmoxW2tleV0gIT09IG9iajJba2V5XSkge1xcbiAgICAgICAgICAgICAgICBkaWZmZXJlbnRLZXlzLnB1c2goa2V5KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gb2JqMikge1xcbiAgICAgICAgICAgIGlmICghb2JqMS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XFxuICAgICAgICAgICAgICAgIGRpZmZlcmVudEtleXMucHVzaChrZXkpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBkaWZmZXJlbnRLZXlzO1xcbiAgICB9LFxcbiAgICBnZXROZXh0VXJsOiBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgcGFyYW1zKSB7XFxuICAgICAgICB2YXIgdTEgPSB0aGlzLnVybFBhcnNlKHNvdXJjZSk7XFxuICAgICAgICB2YXIgdTIgPSB0aGlzLnVybFBhcnNlKHRhcmdldCk7XFxuICAgICAgICB2YXIgcGEgPSB1bmRlZmluZWQ7XFxuICAgICAgICBpZiAodHlwZW9mIHBhcmFtcyA9PSBcXFwib2JqZWN0XFxcIikge1xcbiAgICAgICAgICAgIHBhID0gcGFyYW1zLmhhc093blByb3BlcnR5KFxcXCLnibnlvoFcXFwiKSA/IHBhcmFtcy7nibnlvoEgOiB1bmRlZmluZWQ7XFxuICAgICAgICB9XFxuICAgICAgICB2YXIgbmV4dHVybCA9IHNvdXJjZTtcXG4gICAgICAgIHZhciBjYSA9IE9iamVjdC5rZXlzKHUyLlBhcmFtcykubGVuZ3RoID09IDAgPyBcXFwiXFxcIiA6IFxcXCI/XFxcIjtcXG4gICAgICAgIGlmIChwYSAhPSB1bmRlZmluZWQpIHtcXG4gICAgICAgICAgICB2YXIgcnMgPSBTdHJpbmcodTIuUGF0aCkucmVwbGFjZShuZXcgUmVnRXhwKHBhKSwgXFxcIiQxZnlwYWdlXFxcIik7XFxuICAgICAgICAgICAgbmV4dHVybCA9IHUyLkhvc3RzICsgcnMgKyBjYSArIHRoaXMuVG9QYXJhbXModTIuUGFyYW1zKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgaWYgKHRoaXMuaXNFcXVhbCh1MS5QYXJhbXMsIHUyLlBhcmFtcykpIHtcXG4gICAgICAgICAgICAgICAgaWYgKGR0X2RlYnVnKSB7XFxuICAgICAgICAgICAgICAgICAgICBsb2codTEuUGF0aCk7XFxuICAgICAgICAgICAgICAgICAgICBsb2codTIuUGF0aCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgdmFyIGRmID0gdGhpcy5maW5kRGlmZmVyZW50SW5kZXgoU3RyaW5nKHUxLlBhdGgpLCBTdHJpbmcodTIuUGF0aCkpO1xcbiAgICAgICAgICAgICAgICBpZiAoZHRfZGVidWcpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhkZik7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKGRmLmxlbmd0aCA9PSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSBkZlswXS5pbmRleDtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBmID0gZGYuZmlsdGVyKCh4KSA9PiAvXFxcXGQrLy50ZXN0KHguczIpKTtcXG4gICAgICAgICAgICAgICAgICAgIHZhciByZSA9IGZbMF0uaW5kZXg7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgdmFyIGVxID0gdGhpcy5yZXBsYWNlQ2hhckF0KFN0cmluZyh1Mi5QYXRoKSwgcmUsIFxcXCJmeXBhZ2VcXFwiKTtcXG4gICAgICAgICAgICAgICAgbmV4dHVybCA9IHUyLkhvc3RzICsgZXEgKyBjYSArIHRoaXMuVG9QYXJhbXModTIuUGFyYW1zKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB2YXIgZXAgPSB0aGlzLmdldE9iamVjdEtleXNEaWZmKHUxLlBhcmFtcywgdTIuUGFyYW1zKVxcbiAgICAgICAgICAgICAgICBpZiAoZXAubGVuZ3RoID09IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHUxLlBhcmFtc1tlcFswXV0gPSAnZnlwYWdlJ1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgbG9nKGVwKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB2YXIgZXEgPSBTdHJpbmcodTEuUGF0aCkucmVwbGFjZSgvXFxcXGQrLywgXFxcImZ5cGFnZVxcXCIpO1xcbiAgICAgICAgICAgICAgICBuZXh0dXJsID0gdTEuSG9zdHMgKyBlcSArIGNhICsgdGhpcy5Ub1BhcmFtcyh1MS5QYXJhbXMpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIC8vbG9nKCduZXh0OicrbmV4dHVybClcXG4gICAgICAgIHJldHVybiBuZXh0dXJsO1xcbiAgICB9LFxcbn07XFxuXFxuZnVuY3Rpb24gZ2V0VHJ1ZWxpbmsobWFyaywgdXJsLCBwYWdlKSB7XFxuICAgIHZhciBwID0gZ2V0TXlWYXIobWFyaywgdXJsKS5yZXBsYWNlKFxcXCJmeXBhZ2VcXFwiLCBwYWdlKTtcXG4gICAgaWYgKHBhZ2UgPT0gMSkge1xcbiAgICAgICAgcmV0dXJuIGdldE15VmFyKFxcXCJ5aV9maXJzdHBhZ2VcXFwiLCBwKTtcXG4gICAgfSBlbHNlIGlmIChwICE9IFxcXCJcXFwiKSB7XFxuICAgICAgICByZXR1cm4gcDtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiB1cmw7XFxuICAgIH1cXG59XFxuLy/mnoTlu7pcXG5mdW5jdGlvbiBjcmVhdGVOZXh0UGFnZSgpIHtcXG4gICAgbGV0IHN0YXJ0bnVtID0gMTtcXG4gICAgdmFyIG9iaiA9IGFyZ3VtZW50c1swXTtcXG4gICAgaWYgKHRydWVfdXJsICE9IGdldE15VmFyKFxcXCJ5aV9wYWdldXJsXFxcIiwgXFxcIlxcXCIpKSB7XFxuICAgICAgICBjbGVhck15VmFyKFxcXCJ5aV9wYWdldXJsXFxcIik7XFxuICAgIH1cXG4gICAgaWYgKHBhZ2UgPT0gc3RhcnRudW0gJiYgZ2V0TXlWYXIoXFxcInlpX3BhZ2V1cmxcXFwiKSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcInlpX2ZpcnN0cGFnZVxcXCIsIHRydWVfdXJsKTtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgdmFyIG5leHQgPSBldmFsKOS4i+S4gOmhtSk7XFxuICAgICAgICAgICAgLy9sb2coXFxcIm5leHRcXFwiKTtcXG4gICAgICAgICAgICAvL2xvZyhuZXh0KTtcXG4gICAgICAgIH0gY2F0Y2gge1xcbiAgICAgICAgICAgIGxvZyhcXFwi5Y+v6IO95LiN5a2Y5Zyo5LiL5LiA6aG15oiW6ICF5LiL5LiA6aG15a6a5L2N5pyJ6Zeu6aKYXFxcIik7XFxuICAgICAgICAgICAgbmV4dCA9IFxcXCJcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKG5leHQgIT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICB2YXIgbnh1cmwgPSBleHRNZXRob2QuZ2V0TmV4dFVybCh0cnVlX3VybCwgbmV4dCwgb2JqKTtcXG4gICAgICAgICAgICAvL2xvZyhcXFwibnh1cmw6XFxcIiArIG54dXJsKTtcXG4gICAgICAgICAgICBwdXRNeVZhcijnirbmgIEsIG54dXJsKTtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwieWlfcGFnZXVybFxcXCIsIG54dXJsKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBhdXRvUGFnZSgpIHtcXG4gICAgaWYgKHBhZ2UgPT0gMSkge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcInlpX2ZpcnN0cGFnZVxcXCIsIHRydWVfdXJsKTtcXG4gICAgfVxcbiAgICB0cnkge1xcbiAgICAgICAgdmFyIG5leHQgPSBldmFsKOS4i+S4gOmhtSk7XFxuICAgICAgICAvL2xvZyhcXFwibmV4dFxcXCIpO1xcbiAgICAgICAgLy9sb2coJ25leHQ6JytuZXh0KTtcXG4gICAgfSBjYXRjaCB7XFxuICAgICAgICBsb2coXFxcIuWPr+iDveS4jeWtmOWcqOS4i+S4gOmhteaIluiAheS4i+S4gOmhteWumuS9jeaciemXrumimFxcXCIpO1xcbiAgICAgICAgbmV4dCA9IFxcXCJcXFwiO1xcbiAgICB9XFxuICAgIGlmIChuZXh0ICE9IFxcXCJcXFwiKSB7XFxuICAgICAgICBwdXRNeVZhcijnirbmgIEsIG5leHQpO1xcbiAgICB9XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi546v5aKD5bCB6KOFXCIsXCJwYXRoXCI6XCJyZXBhaXJcIixcInJ1bGVcIjpcImpzOlxcbi8qXFxuMjAyMy0xMC0xNSBieSDOsVxcbiovXFxuXFxudmFyIGRvY3VtZW50ID0ge307XFxudmFyIHdpbmRvdyA9IHtcXG4gICAgbG9jYXRpb246IHtcXG4gICAgICAgIHJlbG9hZDogZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgfVxcbiAgICB9XFxufTtcXG5cXG4vLyDlrprkuYnkuIDkuKrlr7nosaHnlKjkuo7lrZjlgqggY29va2llIOWQjeensOWSjOWAvOeahOmUruWAvOWvuVxcbnZhciBjb29raWVzID0ge307XFxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnY29va2llJywge1xcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXFxuICAgIGdldDogZnVuY3Rpb24oKSB7XFxuICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29va2llcykubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX09JHt2YWx1ZX1gKS5qb2luKCc7ICcpO1xcbiAgICB9LFxcbiAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XFxuICAgICAgICB2YXIgbGlzdCA9IFtdO1xcbiAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKCc7JykpIHtcXG4gICAgICAgICAgICBsaXN0ID0gdmFsdWUuc3BsaXQoJzsnKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGlzdCA9IFt2YWx1ZV07XFxuICAgICAgICB9XFxuICAgICAgICBsaXN0LmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgdmFyIGluZGV4ID0geC5pbmRleE9mKFxcXCI9XFxcIik7XFxuICAgICAgICAgICAgdmFyIGtleSA9IHguc3Vic3RyaW5nKDAsIGluZGV4KS50cmltKCk7XFxuICAgICAgICAgICAgdmFyIHZhbHVlID0geC5zdWJzdHJpbmcoaW5kZXggKyAxKTtcXG4gICAgICAgICAgICBjb29raWVzW2tleV0gPSB2YWx1ZTtcXG4gICAgICAgIH0pXFxuICAgIH1cXG59KTtcXG5cXG5mdW5jdGlvbiBndWFyZCh1cmwsIGhlYWRvYmopIHtcXG4gICAgdmFyIGhlYWQgPSBoZWFkb2JqID8gaGVhZG9iaiA6IHt9O1xcbiAgICBoZWFkWydoZWFkZXJzJ10gPSBoZWFkWydoZWFkZXJzJ10gPyBoZWFkWydoZWFkZXJzJ10gOiB7fTtcXG4gICAgaGVhZFsnaGVhZGVycyddWydDb29raWUnXSA9IGdldENvb2tpZSh1cmwpO1xcbiAgICAvL2xvZyhoZWFkKVxcbiAgICB2YXIgaHRtbCA9IGZldGNoKHVybCwgaGVhZCk7XFxuICAgIGlmIChodG1sLmluY2x1ZGVzKCdfZ3VhcmQvYXV0by5qcycpKSB7XFxuICAgICAgICBkb2N1bWVudFtcXFwiY29va2llXFxcIl0gPSBnZXRDb29raWUodXJsKTtcXG4gICAgICAgIGV2YWwoZmV0Y2goZ2V0SG9tZSh1cmwpICsgJy9fZ3VhcmQvYXV0by5qcycpKVxcbiAgICAgICAgaGVhZFsnaGVhZGVycyddWydDb29raWUnXSA9IGRvY3VtZW50W1xcXCJjb29raWVcXFwiXTtcXG4gICAgICAgIGh0bWwgPSBmZXRjaCh1cmwsIGhlYWQpO1xcbiAgICB9XFxuICAgIC8vbG9nKGRvY3VtZW50W1xcXCJjb29raWVcXFwiXSlcXG4gICAgcmV0dXJuIGh0bWw7XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6K6+572uXCIsXCJwYXRoXCI6XCJzZXR0aW5nXCIsXCJydWxlXCI6XCJqczpcXG5ldmFsKGZldGNoKCdmaWxlOi8vL3N0b3JhZ2UvZW11bGF0ZWQvMC9Eb3dubG9hZC93ZWIvc2V0dWkuanMnKSlcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIum7mOiupOWPguaVsFwiLFwicGF0aFwiOlwiZGVmXCIsXCJydWxlXCI6XCJqczpcXG52YXIgb25maWxlID0gdHJ1ZTtcXG5sZXQgZGVmID0ge307XFxuaWYgKG9uZmlsZSkge1xcbiAgICBldmFsKGZldGNoKCdmaWxlOi8vL3N0b3JhZ2UvZW11bGF0ZWQvMC9Eb3dubG9hZC93ZWIvZGVmLmpzJykpXFxufSBlbHNlIHtcXG4gICAgZGVmID0ge1xcbiAgICAgICAgc3R5bGU6ICcxJyxcXG4gICAgICAgIOavj+mhteaVsOmHjzogMzAsXFxuICAgICAgICDliIbpobXpmIjlgLw6IDMwLFxcbiAgICB9XFxufVxcblxcblwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Yqo5oCB5YiG57G75pS5XCIsXCJwYXRoXCI6XCJkdGZsXCIsXCJydWxlXCI6XCJqczpcXG4vKlxcblZlciAyMDIzLTEwLTI4IDEuMFxcbuWkh+azqO+8muS4jeimgeeUqOa1t+mYlOS7o+eggeagvOW8j+WMliDlhoXlrrnkvJrlh7rplJlcXG7lv4Xpobvlj4LmlbDvvJpcXG7liIbnsbvpopzoibIg5aSn57G75a6a5L2NIFxcbuWwj+exu+WumuS9jSDliIbnsbvmoIfpopgg5YiG57G76ZO+5o6lXFxuaHRtbCA9Pua6kOeggSBwYWdlID0+6aG156CBXFxu5Y+v6YCJ5Y+C5pWw77yaXFxu5ou85o6l5YiG57G7IOaKmOWPoOagh+iusCDlsZXlvIDmoIforrAg5o6S6ZmkXFxu5aSn57G76ZO+5o6lIOWkp+exu+agh+mimCDmuIXpmaTplK4g5byA5ZCv5oqY5Y+gXFxu6ZmE5Yqg5a6a5L2NXFxu6K+05piO77yaXFxu5aSW6Z2i55SoZ2V0TXlWYXIoTVlfUlVMRS51cmwpIOaIluiAhSDnirbmgIEg5Y+W6ZO+5o6lXFxu6a2U5pS5Os6xXFxuKi9cXG5cXG5sZXQgZW1wdHkgPSBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxubGV0IGNhdGVnb3JpZXMgPSBbXTtcXG5pZiAodHlwZW9mICjmi7zmjqXliIbnsbspICE9ICd1bmRlZmluZWQnICYmIOaLvOaOpeWIhuexuyAhPSAnJykge1xcbiAgICBjYXRlZ29yaWVzID0gW3BkZmEoaHRtbCwg5aSn57G75a6a5L2NKS5qb2luKCdcXFxcbicpXTtcXG4gICAgaWYgKOaLvOaOpeWIhuexuy5pbmNsdWRlcygnOycpKSB7XFxuICAgICAgICDmi7zmjqXliIbnsbsgPSDmi7zmjqXliIbnsbsuc3BsaXQoJzsnKTtcXG4gICAgfVxcbiAgICBpZiAo5ou85o6l5YiG57G7LmNvbnN0cnVjdG9yID09IEFycmF5KSB7XFxuICAgICAgICDmi7zmjqXliIbnsbsuZm9yRWFjaChpdGVtID0+IHtcXG4gICAgICAgICAgICBjYXRlZ29yaWVzID0gY2F0ZWdvcmllcy5jb25jYXQocGRmYShodG1sLCBpdGVtKSk7XFxuICAgICAgICB9KVxcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgY2F0ZWdvcmllcyA9IFtwZGZhKGh0bWwsIOWkp+exu+WumuS9jSkuam9pbignXFxcXG4nKV0uY29uY2F0KHBkZmEoaHRtbCwg5ou85o6l5YiG57G7KSk7XFxuICAgIH1cXG4gICAgaWYgKHR5cGVvZiAo6ZmE5Yqg5a6a5L2NKSAhPSAndW5kZWZpbmVkJyAmJiDpmYTliqDlrprkvY0ubGVuZ3RoID4gMCkge1xcbiAgICAgICAg6ZmE5Yqg5a6a5L2NLmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgdmFyIOS4gOe6pyA9IHBkZmEoaHRtbCwgeC7kuIDnuqflrprkvY0pLm1hcChzID0+IHtcXG4gICAgICAgICAgICAgICAgdmFyIOWumuS9jSA9IHBkZmEocywgeC7lsI/nsbspLm1hcChxID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9IHBkZmgocSwgeC7moIfpopgpO1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVybCA9ICdhJ1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHgu6ZO+5o6lLmluY2x1ZGVzKCdAQCcpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSB4LumTvuaOpS5zcGxpdCgnQEAnKVswXVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGRmaChxLCB4LumTvuaOpS5zcGxpdCgnQEAnKVsxXSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgu6L2s5o2iID09IHRydWUpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8bGkgZGF0YS10eXBlPVxcXCIke3N0YXRlfVxcXCIgZGF0YS12YWw9XFxcIiR7dmFsdWV9XFxcIj48YSBocmVmPVxcXCJcXFwiPiR7dGl0bGV9PC9hPjwvbGk+YFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgPGEgdHlwZT1cXFwiQGV4dHJhXFxcIiBzdGF0ZT1cXFwiJHtzdGF0ZX1cXFwiIHZhbHVlPVxcXCIke3ZhbHVlfVxcXCI+JHt0aXRsZX08L2E+YDtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWYgPSBwZChxLCB4LumTvuaOpSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8YSBocmVmPVxcXCIke2hyZWZ9XFxcIj4ke3RpdGxlfTwvYT5gO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIOWumuS9jTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBjYXRlZ29yaWVzLnB1c2go5LiA57qnLmpvaW4oJ1xcXFxuJykpO1xcbiAgICAgICAgfSk7XFxuICAgIH1cXG59IGVsc2Uge1xcbiAgICBjYXRlZ29yaWVzID0gW3BkZmEoaHRtbCwg5aSn57G75a6a5L2NKS5qb2luKCdcXFxcbicpXTtcXG59XFxuXFxubGV0IGl0ZW1zID0gW107XFxubGV0IGNhdGVzID0gW107XFxubGV0IGluaXRfY2F0ZSA9IG5ldyBBcnJheSgyMCkuZmlsbChcXFwiMFxcXCIpO1xcbmNvbnN0IGZvbGQgPSBnZXRNeVZhcihNWV9SVUxFLmdyb3VwLCBcXFwiMFxcXCIpO1xcbmNvbnN0IGNhdGVfdGVtcCA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoXFxcImhlYWQuY2F0ZVxcXCIsIEpTT04uc3RyaW5naWZ5KGluaXRfY2F0ZSkpKTtcXG52YXIg5oqY5Y+g54q25oCBID0gKHR5cGVvZiAo5byA5ZCv5oqY5Y+gKSAhPSAndW5kZWZpbmVkJykgPyDlvIDlkK/mipjlj6AgOiB0cnVlO1xcbnZhciDmipjlj6AgPSAodHlwZW9mICjmipjlj6DmoIforrApICE9ICd1bmRlZmluZWQnICYmIOaKmOWPoOagh+iusCAhPSAnJykgPyDmipjlj6DmoIforrAgOiAn4oCc4oCc4oCd4oCdJyArICfiiKgnLmZvbnRjb2xvcihcXFwiI0ZGMDAwMFxcXCIpO1xcbnZhciDlsZXlvIAgPSAodHlwZW9mICjlsZXlvIDmoIforrApICE9ICd1bmRlZmluZWQnICYmIOWxleW8gOagh+iusCAhPSAnJykgPyDlsZXlvIDmoIforrAgOiAn4oCc4oCc4oCd4oCdJyArICfiiKcnLmZvbnRjb2xvcihcXFwiIzFhYWQxOVxcXCIpO1xcbnZhciDmuIXpmaQgPSAodHlwZW9mICjmuIXpmaTplK4pICE9ICd1bmRlZmluZWQnICYmIOa4hemZpOmUriAhPSAnJykgPyDmuIXpmaTplK4gOiBbXTtcXG52YXIg54q25oCBID0gKHR5cGVvZiAo54q25oCB5qCH6K6wKSAhPSAndW5kZWZpbmVkJyAmJiDnirbmgIHmoIforrAgIT0gJycpID8g54q25oCB5qCH6K6wIDogTVlfUlVMRS51cmw7XFxudmFyIOWkp+exu+WkhOeQhiA9IHR5cGVvZiAo5LiA57qn5YiG57G75aSE55CGKSAhPSAndW5kZWZpbmVkJyA/IHRydWUgOiBmYWxzZTtcXG52YXIg5pCc57SiID0gdHlwZW9mICjlvIDlkK/mkJzntKIpICE9ICd1bmRlZmluZWQnID8g5byA5ZCv5pCc57SiIDogZmFsc2U7XFxudmFyIOWFqOa4hSA9ICh0eXBlb2YgKOWFqOa4hemUrikgIT0gJ3VuZGVmaW5lZCcgJiYg5YWo5riF6ZSuICE9ICcnKSA/IOWFqOa4hemUriA6IFtdO1xcbuWFqOa4hS51bnNoaWZ0KCd5aV9maXJzdHBhZ2UnKTtcXG5cXG5cXG5pZiAocGFyc2VJbnQocGFnZSkgPT09IDEpIHtcXG4gICAgaWYgKOaQnOe0oikge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIlxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiJ2hpa2VyOi8vc2VhcmNoP3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFwiJnM9JytpbnB1dFxcXCIsXFxuICAgICAgICAgICAgZGVzYzogXFxcIuaQnOe0ouWFs+mUruivjVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcigna2V5d29yZCcsICcnKSxcXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoJ2tleXdvcmQnLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgfVxcbiAgICBpZiAo5oqY5Y+g54q25oCBKSB7XFxuICAgICAgICBpZiAocGFnZSA9PSAxKSB7XFxuICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBmb2xkID09PSAnMScgPyDmipjlj6AgOiDlsZXlvIAsXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgodGl0bGUsIGZvbGQsIHUsIGFsbCwgZXhwcykgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZvbGQgPSBnZXRNeVZhcihNWV9SVUxFLmdyb3VwLCBmb2xkKTtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBb5bGV5byALCDmipjlj6BdID0gZXhwcztcXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb2xkID09IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3ggPSBmaW5kSXRlbXNCeUNscyh0aXRsZSArICdjYXRlX2J1dHRvbicpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKCdjYXRlX2J1dHRvbicsIGN4KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVJdGVtQnlDbHModGl0bGUgKyAnY2F0ZV9idXR0b24nKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN4ID0gc3RvcmFnZTAuZ2V0TXlWYXIoJ2NhdGVfYnV0dG9uJywgW10pLm1hcCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFsnY29sX3R5cGUnXSA9IHhbJ2NvbF90eXBlJ10gPyB4Wydjb2xfdHlwZSddIDogeFsndHlwZSddO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geDtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJdGVtQWZ0ZXIodGl0bGUgKyAnY2F0ZV9saW5lJywgY3gpXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAvKmFsbC5mb3JFYWNoKChpdGVtKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoaXRlbSk7XFxuICAgICAgICAgICAgICAgICAgICB9KTsqL1xcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbSh0aXRsZSArICdjYXRlX2V4cCcsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogZm9sZCA9PSAxID8g5bGV5byAIDog5oqY5Y+gLFxcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKE1ZX1JVTEUuZ3JvdXAsIGZvbGQgPT09IFxcXCIxXFxcIiA/IFxcXCIwXFxcIiA6IFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICB9LCBNWV9SVUxFLnRpdGxlLCBmb2xkLCDnirbmgIEsIOWFqOa4hSwgW+WxleW8gCwg5oqY5Y+gXSksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfUlVMRS50aXRsZSArICdjYXRlX2V4cCcsXFxuICAgICAgICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfmuIXpmaTnirbmgIEnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKCh4LCBhbGwsIGNsKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoeCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoJ2hlYWQuY2F0ZScpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcihpdGVtKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbC5mb3JFYWNoKChpdGVtKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKGl0ZW0pXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwg54q25oCBLCDlhajmuIUsIOa4hemZpClcXG4gICAgICAgICAgICAgICAgICAgIH1dXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGxldCBzZXRUaXRsZSA9IChrLCBpLCB0KSA9PiB7XFxuICAgICAgICByZXR1cm4gayA9PSBpID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyB0LmZvbnRjb2xvcijliIbnsbvpopzoibIpIDogdFxcbiAgICB9XFxuICAgIGNhdGVnb3JpZXMuZm9yRWFjaCgoY2F0ZWdvcnksIGluZGV4KSA9PiB7XFxuICAgICAgICBsZXQgc3ViX2NhdGVnb3JpZXMgPSBbXTtcXG4gICAgICAgIGlmICjlsI/nsbvlrprkvY0uaW5jbHVkZXMoJzsnKSkge1xcbiAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzID0gcGRmYShjYXRlZ29yeSwg5bCP57G75a6a5L2NLnNwbGl0KCc7JylbMF0pO1xcbiAgICAgICAgICAgIGlmIChzdWJfY2F0ZWdvcmllcy5sZW5ndGggPT0gMCkge1xcbiAgICAgICAgICAgICAgICBzdWJfY2F0ZWdvcmllcyA9IHBkZmEoY2F0ZWdvcnksIOWwj+exu+WumuS9jS5zcGxpdCgnOycpWzFdKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzID0gcGRmYShjYXRlZ29yeSwg5bCP57G75a6a5L2NKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xcbiAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgX+Wkp+exu+mTvuaOpSA9ICh0eXBlb2YgKOWkp+exu+mTvuaOpSkgIT0gJ3VuZGVmaW5lZCcgJiYg5aSn57G76ZO+5o6lICE9ICcnKSA/IOWkp+exu+mTvuaOpSA6IOWIhuexu+mTvuaOpTtcXG5cXG4gICAgICAgICAgICAgICAgbGV0IF/lpKfnsbvmoIfpopggPSAodHlwZW9mICjlpKfnsbvmoIfpopgpICE9ICd1bmRlZmluZWQnICYmIOWkp+exu+agh+mimCAhPSAnJykgPyDlpKfnsbvmoIfpopggOiDliIbnsbvmoIfpopg7XFxuXFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHBkZmgoaXRlbSwgX+Wkp+exu+agh+mimCk7XFxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKOaOkumZpCkgIT0gJ3VuZGVmaW5lZCcgJiYg5o6S6ZmkICE9ICcnKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnJlcGxhY2UobmV3IFJlZ0V4cCjmjpLpmaQsIFxcXCJnXFxcIiksIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1zID0ge1xcbiAgICAgICAgICAgICAgICAgICAgY2F0ZV90ZW1wOiBjYXRlX3RlbXAsIGtleToga2V5LCBwYWdlOiBwYWdlLCBjbGVhcnM6IOa4hemZpCwgc3RhdGU6IOeKtuaAgSwgYWxsY2xlYXJzOiDlhajmuIVcXG4gICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgICAgICBsZXQgdXJsID0gcGQoaXRlbSwgX+Wkp+exu+mTvuaOpSk7XFxuICAgICAgICAgICAgICAgIGlmICjlpKfnsbvlpITnkIYpIHtcXG4gICAgICAgICAgICAgICAgICAgIC8vbG9nKOS4gOe6p+WIhuexu+WkhOeQhilcXG4gICAgICAgICAgICAgICAgICAgIC8vbG9nKCQuc3RyaW5naWZ5KOS4gOe6p+WIhuexu+WkhOeQhikpXFxuICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXQgPSB1cmw7XFxuICAgICAgICAgICAgICAgICAgICBldmFsKFxcXCJyZXN1bHQgPSBcXFwiICsg5LiA57qn5YiG57G75aSE55CGKTtcXG4gICAgICAgICAgICAgICAgICAgIC8vbG9nKHJlc3VsdClcXG4gICAgICAgICAgICAgICAgICAgIHVybCA9IHJlc3VsdDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBzZXRUaXRsZShrZXkudG9TdHJpbmcoKSwgY2F0ZV90ZW1wW2luZGV4XSwgdGl0bGUpLFxcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogJCh1cmwgKyAnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgocGFyYW1zKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld19jYXRlID0gW107XFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNsZWFycy5mb3JFYWNoKChpdGVtKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoaXRlbSlcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5hbGxjbGVhcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKGl0ZW0pXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2F0ZV90ZW1wLmZvckVhY2goKGNhdGUsIGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19jYXRlLnB1c2goaW5kZXggPT09IDAgPyBwYXJhbXMua2V5LnRvU3RyaW5nKCkgOiBcXFwiMFxcXCIpXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiaGVhZC5jYXRlXFxcIiwgSlNPTi5zdHJpbmdpZnkobmV3X2NhdGUpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihwYXJhbXMuc3RhdGUsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfSwgcGFyYW1zKVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfUlVMRS50aXRsZSArICdjYXRlX2xpbmUnLFxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSlcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgc3ViX2NhdGVnb3JpZXMuZm9yRWFjaCgoaXRlbSwga2V5KSA9PiB7XFxuICAgICAgICAgICAgICAgIHZhciBleHRyYXBvcyA9IGZhbHNlO1xcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5pbmNsdWRlcygndHlwZT1cXFwiQGV4dHJhXFxcIicpKSB7XFxuICAgICAgICAgICAgICAgICAgICBleHRyYXBvcyA9IHRydWU7XFxuICAgICAgICAgICAgICAgICAgICAvL2xvZygn6ZmE5Yqg5a6a5L2NJylcXG4gICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgICAgICBpZiAoZXh0cmFwb3MpIHtcXG4gICAgICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9IHBkZmgoaXRlbSwgJ2EmJlRleHQnKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKOaOkumZpCkgIT0gJ3VuZGVmaW5lZCcgJiYg5o6S6ZmkICE9ICcnKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5yZXBsYWNlKG5ldyBSZWdFeHAo5o6S6ZmkLCBcXFwiZ1xcXCIpLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB2YXIganNvbiA9IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBwZGZoKGl0ZW0sICdhJiZzdGF0ZScpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwZGZoKGl0ZW0sICdhJiZ2YWx1ZScpLFxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcblxcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRpdGxlID0gcGRmaChpdGVtLCDliIbnsbvmoIfpopgpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAo5o6S6ZmkKSAhPSAndW5kZWZpbmVkJyAmJiDmjpLpmaQgIT0gJycpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnJlcGxhY2UobmV3IFJlZ0V4cCjmjpLpmaQsIFxcXCJnXFxcIiksIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgICAgICAgIHZhciBqc29uID0gJyc7XFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRydWUpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIOWIhuexu+mTvuaOpS5pbmNsdWRlcygnQEBAJyk6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gPSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBwZGZoKGl0ZW0sIOWIhuexu+mTvuaOpS5zcGxpdCgnQEBAJylbMF0pLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBkZmgoaXRlbSwg5YiG57G76ZO+5o6lLnNwbGl0KCdAQEAnKVsxXSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSDliIbnsbvpk77mjqUuaW5jbHVkZXMoJ0BAJyk6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gPSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiDliIbnsbvpk77mjqUuc3BsaXQoJ0BAJylbMF0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcGRmaChpdGVtLCDliIbnsbvpk77mjqUuc3BsaXQoJ0BAJylbMV0pLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gPSBwZChpdGVtLCDliIbnsbvpk77mjqUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIC8qdmFyIGpzb2495YiG57G76ZO+5o6lLmluY2x1ZGVzKCdAQEAnKT97XFxuICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6cGRmaChpdGVtLOWIhuexu+mTvuaOpS5zcGxpdCgnQEBAJylbMF0pLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTpwZGZoKGl0ZW0s5YiG57G76ZO+5o6lLnNwbGl0KCdAQEAnKVsxXSksXFxuICAgICAgICAgICAgICAgICAgICAgfTpwZChpdGVtLOWIhuexu+mTvuaOpSk7XFxuICAgICAgICAgICAgICAgICAgICAgXFxuICAgICAgICAgICAgICAgICAgICAganNvbj3liIbnsbvpk77mjqUuaW5jbHVkZXMoJ0BAJyk/e1xcbiAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOuWIhuexu+mTvuaOpS5zcGxpdCgnQEAnKVswXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6cGRmaChpdGVtLOWIhuexu+mTvuaOpS5zcGxpdCgnQEAnKVsxXSksXFxuICAgICAgICAgICAgICAgICAgICAgfTpwZChpdGVtLOWIhuexu+mTvuaOpSk7Ki9cXG5cXG4gICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1zID0ge1xcbiAgICAgICAgICAgICAgICAgICAgY2F0ZV90ZW1wOiBjYXRlX3RlbXAsIGluZGV4OiBpbmRleCwga2V5OiBrZXksIHBhZ2U6IHBhZ2UsIGpzb246IGpzb24sIHN0YXRlOiDnirbmgIEsIGFsbGNsZWFyczog5YWo5riFXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgY2F0ZXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogc2V0VGl0bGUoa2V5LnRvU3RyaW5nKCksIGNhdGVfdGVtcFtpbmRleF0sIHRpdGxlKSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogJCgnaGlrZXI6Ly9lbXB0eScgKyAnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgocGFyYW1zKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmFsbGNsZWFycy5mb3JFYWNoKChpdGVtKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoaXRlbSlcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jYXRlX3RlbXBbcGFyYW1zLmluZGV4XSA9IHBhcmFtcy5rZXkudG9TdHJpbmcoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiaGVhZC5jYXRlXFxcIiwgSlNPTi5zdHJpbmdpZnkocGFyYW1zLmNhdGVfdGVtcCkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuanNvbi5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKCdkdF8nICsgcGFyYW1zLmpzb24udHlwZSwgcGFyYW1zLmpzb24udmFsdWUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhcmFtcy5zdGF0ZSwgcGFyYW1zLmpzb24pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfSwgcGFyYW1zKSxcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsczogTVlfUlVMRS50aXRsZSArICdjYXRlX2J1dHRvbicsXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGNhdGVzLnB1c2goe1xcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGNsczogTVlfUlVMRS50aXRsZSArICdjYXRlX2J1dHRvbicsXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgfSlcXG59XFxuXFxuXFxuaWYgKGZvbGQgPT09IFxcXCIxXFxcIiB8fCDmipjlj6DnirbmgIEgPT0gZmFsc2UpIHtcXG4gICAgaXRlbXMgPSBpdGVtcy5jb25jYXQoY2F0ZXMpO1xcbn1cXG5pZiAoZm9sZCA9PT0gXFxcIjBcXFwiKSB7XFxuICAgIHN0b3JhZ2UwLnB1dE15VmFyKCdjYXRlX2J1dHRvbicsIGNhdGVzKVxcbn1cXG5pZiAodHlwZW9mIHNldFByZVJlc3VsdCAhPSAndW5kZWZpbmVkJykge1xcbiAgICBpdGVtcyA9IGQuY29uY2F0KGl0ZW1zKTtcXG4gICAgLy/muIXnqbrnu6fmib/mlbDnu4RcXG4gICAgZC5sZW5ndGggPSAwO1xcbiAgICBzZXRQcmVSZXN1bHQoaXRlbXMpO1xcbn0gZWxzZSB7XFxuICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XFxuICAgICAgICBkLnB1c2goaXRlbSk7XFxuICAgIH0pXFxufVxcblwifV0iLCJpY29uIjoiIiwicHJveHkiOiIifQ==
Add Comment
Please, Sign In to add comment