Produit ajouté à votre devis. Allez sur la page de devis pour demander votre devis, nous vous contacterons dès que possible.
gnKXsgdGljay5zdHlsZS5sZWZ0PXBvcysncHgnOyB9IGVsc2UgeyB0aWNrLnN0eWxlLnRvcD1wb3MrJ3B4JzsgfQogICAgICBmcmFnTWFqb3IuYXBwZW5kQ2hpbGQodGljayk7CiAgICAgIGlmKGlzTWFqb3IpewogICAgICAgIHZhciBsYmw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgIGxibC5jbGFzc05hbWU9J3JsYWJlbCc7CiAgICAgICAgbGJsLnRleHRDb250ZW50PU1hdGgucm91bmQodik7CiAgICAgICAgaWYoYXhpcz09PSd4Jyl7IGxibC5zdHlsZS5sZWZ0PXBvcysncHgnOyB9IGVsc2UgeyBsYmwuc3R5bGUudG9wPXBvcysncHgnOyB9CiAgICAgICAgZnJhZ01ham9yLmFwcGVuZENoaWxkKGxibCk7CiAgICAgIH0KICAgIH0KICAgIGVsLmFwcGVuZENoaWxkKGZyYWdNYWpvcik7CiAgfQogIGZ1bmN0aW9uIHJlY29tcHV0ZU1ldHJpY3MoKXsKICAgIC8qIHN0YXRlLndpZHRoQ20vaGVpZ2h0Q20gPSB6b25lIG1hcnF1w6llIFVUSUxFIChjZSBxdWUgbGUgY2xpZW50IGNvbW1hbmRlIGV0IHBhaWUpLgogICAgICAgTGEgcGxhcXVlIHLDqWVsbGVtZW50IGZhYnJpcXXDqWUgZXN0IHBsdXMgZ3JhbmRlLCBwb3VyIGxvZ2VyIGxhIG1hcmdlIGRlIHPDqWN1cml0w6kgdG91dCBhdXRvdXIuICovCiAgICB2YXIgbWFyZ2luTW09bWFyZ2luTW1Gb3Ioc3RhdGUud2lkdGhDbSxzdGF0ZS5oZWlnaHRDbSk7CiAgICB2YXIgbWFyZ2luQ209bWFyZ2luTW0vMTA7CiAgICB2YXIgb3V0ZXJXPXN0YXRlLndpZHRoQ20rMiptYXJnaW5DbTsKICAgIHZhciBvdXRlckg9c3RhdGUuaGVpZ2h0Q20rMiptYXJnaW5DbTsKICAgIHZhciBzY2FsZT1TVEFHRV9NQVgvTWF0aC5tYXgob3V0ZXJXLG91dGVySCk7CiAgICBtZXRyaWNzLnNjYWxlPXNjYWxlOwogICAgbWV0cmljcy53PW91dGVyVypzY2FsZTsKICAgIG1ldHJpY3MuaD1vdXRlckgqc2NhbGU7CiAgICBtZXRyaWNzLm91dGVyV2lkdGhDbT1vdXRlclc7CiAgICBtZXRyaWNzLm91dGVySGVpZ2h0Q209b3V0ZXJIOwogICAgc3RhZ2Uuc3R5bGUud2lkdGg9bWV0cmljcy53KydweCc7CiAgICBzdGFnZS5zdHlsZS5oZWlnaHQ9bWV0cmljcy5oKydweCc7CiAgICBydWxlclRvcC5zdHlsZS53aWR0aD1tZXRyaWNzLncrJ3B4JzsKICAgIHJ1bGVyTGVmdC5zdHlsZS5oZWlnaHQ9bWV0cmljcy5oKydweCc7CiAgICBidWlsZFJ1bGVyKHJ1bGVyVG9wLCBvdXRlclcsIHNjYWxlLCAneCcpOwogICAgYnVpbGRSdWxlcihydWxlckxlZnQsIG91dGVySCwgc2NhbGUsICd5Jyk7CiAgICB2YXIgbWFyZ2luUHg9bWFyZ2luQ20qc2NhbGU7CiAgICBtZXRyaWNzLm1hcmdpbk1tPW1hcmdpbk1tOwogICAgbWV0cmljcy5tYXJnaW5QeD1tYXJnaW5QeDsKICAgIG1ldHJpY3MubWFyZ2luRnJhY1g9bWFyZ2luUHgvbWV0cmljcy53OwogICAgbWV0cmljcy5tYXJnaW5GcmFjWT1tYXJnaW5QeC9tZXRyaWNzLmg7CiAgICBzYWZlWm9uZUxpbmUuc3R5bGUuaW5zZXQ9bWFyZ2luUHgrJ3B4JzsKICAgIHNhZmVab25lLnN0eWxlLmJveFNoYWRvdz0naW5zZXQgMCAwIDAgJyttYXJnaW5QeCsncHggcmdiYSgxOTYsNjQsNjQsLjA4KSc7CiAgICBzYWZlWm9uZUxhYmVsLnRleHRDb250ZW50PSdab25lIG5vbiBpbXByaW1hYmxlIOKAlCBtYXJnZSAnK01hdGgucm91bmQobWFyZ2luTW0pKycgbW0nOwogICAgdmFyIGRpbVN0cj1mbXRDbShzdGF0ZS53aWR0aENtKSsnIMOXICcrZm10Q20oc3RhdGUuaGVpZ2h0Q20pKycgY20nOwogICAgZGltQ2hpcC50ZXh0Q29udGVudD1kaW1TdHI7CiAgICBkaW1SZWFkb3V0LnRleHRDb250ZW50PWRpbVN0cjsKICAgIHBsYXRlRGltUmVhZG91dC50ZXh0Q29udGVudD1mbXRDbShvdXRlclcpKycgw5cgJytmbXRDbShvdXRlckgpKycgY20nOwogIH0KCiAgLyogLS0tLS0tLS0tLSBzaGFwZXMgKHBpY3RvZ3JhbXMpLCBtb25vY2hyb21lLCBpbmxpbmUgU1ZHLCBXb3JkLWxpa2UgY2F0ZWdvcmllcyAtLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gZ2VhcklubmVyKCl7CiAgICB2YXIgdGVldGg9Jyc7CiAgICBmb3IodmFyIGk9MDtpPDg7aSsrKXsKICAgICAgdmFyIGFuZ2xlPWkqNDU7CiAgICAgIHRlZXRoKz0nPHJlY3QgeD0iNDciIHk9IjEiIHdpZHRoPSI2IiBoZWlnaHQ9IjE3IiByeD0iMiIgZmlsbD0iJytJTksrJyIgdHJhbnNmb3JtPSJyb3RhdGUoJythbmdsZSsnIDUwIDUwKSIvPic7CiAgICB9CiAgICByZXR1cm4gdGVldGgrJzxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjMxIiBmaWxsPSInK0lOSysnIi8+PGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iMTIiIGZpbGw9IicrICd2YXIoLS1wYXBlci1ob2xlKScgKyciIHN0eWxlPSJmaWxsOiNmNGYyZWUiLz4nOwogIH0KICAvKiBwYXJhbWV0cmljIHN0YXIvYnVyc3QgZ2VuZXJhdG9yIOKAlCBhdm9pZHMgaGFuZC1hdXRob3JpbmcgZWFjaCBzdGFyJ3MgcGF0aCBkYXRhICovCiAgZnVuY3Rpb24gc3RhclBvaW50cyhzcGlrZXMsb3V0ZXJSLGlubmVyUixjeCxjeSl7CiAgICB2YXIgcHRzPVtdLHJvdD0tTWF0aC5QSS8yLHN0ZXA9TWF0aC5QSS9zcGlrZXM7CiAgICBmb3IodmFyIGk9MDtpPHNwaWtlcztpKyspewogICAgICBwdHMucHVzaCgoY3grTWF0aC5jb3Mocm90KSpvdXRlclIpLnRvRml4ZWQoMSkrJywnKyhjeStNYXRoLnNpbihyb3QpKm91dGVyUikudG9GaXhlZCgxKSk7CiAgICAgIHJvdCs9c3RlcDsKICAgICAgcHRzLnB1c2goKGN4K01hdGguY29zKHJvdCkqaW5uZXJSKS50b0ZpeGVkKDEpKycsJysoY3krTWF0aC5zaW4ocm90KSppbm5lclIpLnRvRml4ZWQoMSkpOwogICAgICByb3QrPXN0ZXA7CiAgICB9CiAgICByZXR1cm4gcHRzLmpvaW4oJyAnKTsKICB9CiAgZnVuY3Rpb24gc3RhcklubmVyKHNwaWtlcyxvdXRlclIsaW5uZXJSKXsKICAgIHJldHVybiAnPHBvbHlnb24gcG9pbnRzPSInK3N0YXJQb2ludHMoc3Bpa2VzLG91dGVyUixpbm5lclIsNTAsNTApKyciIGZpbGw9IicrSU5LKyciLz4nOwogIH0KCiAgdmFyIENBVEVHT1JJRVM9WwogICAge25hbWU6J0xpZ25lcycsIHNoYXBlczpbCiAgICAgIHtrZXk6J2xpbmUtc3RyYWlnaHQnLCBsYWJlbDonTGlnbmUnLCBpbm5lcjonPGxpbmUgeDE9IjYiIHkxPSI1MCIgeDI9Ijk0IiB5Mj0iNTAiIHN0cm9rZT0iJytJTksrJyIgc3Ryb2tlLXdpZHRoPSI4IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4nfSwKICAgICAge2tleTonbGluZS1kaWFnb25hbCcsIGxhYmVsOidMaWduZSBkaWFnb25hbGUnLCBpbm5lcjonPGxpbmUgeDE9IjEwIiB5MT0iODgiIHgyPSI5MCIgeTI9IjEyIiBzdHJva2U9IicrSU5LKyciIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+J30sCiAgICAgIHtrZXk6J2xpbmUtYXJyb3cnLCBsYWJlbDonTGlnbmUgZmzDqGNoZScsIGlubmVyOic8bGluZSB4MT0iOCIgeTE9IjUwIiB4Mj0iNzIiIHkyPSI1MCIgc3Ryb2tlPSInK0lOSysnIiBzdHJva2Utd2lkdGg9IjgiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPjxwb2x5Z29uIHBvaW50cz0iNjYsMzAgOTYsNTAgNjYsNzAiIGZpbGw9IicrSU5LKyciLz4nfSwKICAgICAge2tleTonbGluZS1kb3VibGUtYXJyb3cnLCBsYWJlbDonRmzDqGNoZSBkb3VibGUnLCBpbm5lcjonPGxpbmUgeDE9IjI0IiB5MT0iNTAiIHgyPSI3NiIgeTI9IjUwIiBzdHJva2U9IicrSU5LKyciIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+PHBvbHlnb24gcG9pbnRzPSIzMCwzMCA0LDUwIDMwLDcwIiBmaWxsPSInK0lOSysnIi8+PHBvbHlnb24gcG9pbnRzPSI3MCwzMCA5Niw1MCA3MCw3MCIgZmlsbD0iJytJTksrJyIvPid9LAogICAgICB7a2V5OidsaW5lLWVsYm93JywgbGFiZWw6J0Nvbm5lY3RldXIgY291ZMOpJywgaW5uZXI6JzxwYXRoIGQ9Ik0xMCwyMCBINjAgVjgwIEg5MCIgc3Ryb2tlPSInK0lOSysnIiBzdHJva2Utd2lkdGg9IjgiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPid9LAogICAgICB7a2V5OidicmFjZScsIGxhYmVsOidBY2NvbGFkZScsIGlubmVyOic8cGF0aCBkPSJNNzAsNCBDNTAsNCA1NiwyMiA1NiwzMiBDNTYsNDIgNDYsNDYgMzgsNTAgQzQ2LDU0IDU2LDU4IDU2LDY4IEM1Niw3OCA1MCw5NiA3MCw5NiIgc3Ryb2tlPSInK0lOSysnIiBzdHJva2Utd2lkdGg9IjciIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPid9CiAgICBdfSwKICAgIHtuYW1lOidSZWN0YW5nbGVzJywgc2hhcGVzOlsKICAgICAge2tleToncmVjdCcsIGxhYmVsOidSZWN0YW5nbGUnLCBpbm5lcjonPHJlY3QgeD0iOCIgeT0iMjQiIHdpZHRoPSI4NCIgaGVpZ2h0PSI1MiIgZmlsbD0iJytJTksrJyIvPid9LAogICAgICB7a2V5OidyZWN0LXJvdW5kJywgbGFiZWw6J1JlY3RhbmdsZSBhcnJvbmRpJywgaW5uZXI6JzxyZWN0IHg9IjgiIHk9IjI0IiB3aWR0aD0iODQiIGhlaWdodD0iNTIiIHJ4PSIxMiIgZmlsbD0iJytJTksrJyIvPid9LAogICAgICB7a2V5OidzcXVhcmUnLCBsYWJlbDonQ2FycsOpJywgaW5uZXI6JzxyZWN0IHg9IjEyIiB5PSIxMiIgd2lkdGg9Ijc2IiBoZWlnaHQ9Ijc2IiBmaWxsPSInK0lOSysnIi8+J30sCiAgICAgIHtrZXk6J3NxdWFyZS1yb3VuZCcsIGxhYmVsOidDYXJyw6kgYXJyb25kaScsIGlubmVyOic8cmVjdCB4PSIxMiIgeT0iMTIiIHdpZHRoPSI3NiIgaGVpZ2h0PSI3NiIgcng9IjE0IiBmaWxsPSInK0lOSysnIi8+J30KICAgIF19LAogICAge25hbWU6J0Zvcm1lcyBkZSBiYXNlJywgc2hhcGVzOlsKICAgICAge2tleTonb3ZhbCcsIGxhYmVsOidPdmFsZScsIGlubmVyOic8ZWxsaXBzZSBjeD0iNTAiIGN5PSI1MCIgcng9IjQ2IiByeT0iMzAiIGZpbGw9IicrSU5LKyciLz4nfSwKICAgICAge2tleTonY2lyY2xlJywgbGFiZWw6J0NlcmNsZScsIGlubmVyOic8Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSI0MiIgZmlsbD0iJytJTksrJyIvPid9LAogICAgICB7a2V5Oid0cmlhbmdsZScsIGxhYmVsOidUcmlhbmdsZScsIGlubmVyOic8cG9seWdvbiBwb2ludHM9IjUwLDggOTIsODggOCw4OCIgZmlsbD0iJytJTksrJyIvPid9LAogICAgICB7a2V5OidyaWdodC10cmlhbmdsZScsIGxhYmVsOidUcmlhbmdsZSByZWN0YW5nbGUnLCBpbm5lcjonPHBvbHlnb24gcG9pbnRzPSIxMCwxMCAxMCw5MCA5MCw5MCIgZmlsbD0iJytJTksrJyIvPid9LAogICAgICB7a2V5OidwYXJhbGxlbG9ncmFtJywgbGFiZWw6J1BhcmFsbMOpbG9ncmFtbWUnLCBpbm5lcjonPHBvbHlnb24gcG9pbnRzPSIyNiwyMCA5NiwyMCA3NCw4MCA0LDgwIiBmaWxsPSInK0lOSysnIi8+J30sCiAgICAgIHtrZXk6J3RyYXBlem9pZCcsIGxhYmVsOidUcmFww6h6ZScsIGlubmVyOic8cG9seWdvbiBwb2ludHM9IjI4LDIwIDcyLDIwIDkyLDgwIDgsODAiIGZpbGw9IicrSU5LKyciLz4nfSwKICAgICAge2tleTonZGlhbW9uZCcsIGxhYmVsOidMb3NhbmdlJywgaW5uZXI6Jzxwb2x5Z29uIHBvaW50cz0iNTAsNSA5NSw1MCA1MCw5NSA1LDUwIiBmaWxsPSInK0lOSysnIi8+J30sCiAgICAgIHtrZXk6J3BlbnRhZ29uJywgbGFiZWw6J1BlbnRhZ29uZScsIGlubmVyOic8cG9seWdvbiBwb2ludHM9IjUwLDQgOTUsMzcgNzgsOTAgMjIsOTAgNSwzNyIgZmlsbD0iJytJTksrJyIvPid9LAogICAgICB7a2V5OidoZXhhZ29uJywgbGFiZWw6J0hleGFnb25lJywgaW5uZXI6Jzxwb2x5Z29uIHBvaW50cz0iNTAsMyA5MywyNiA5Myw3NCA1MCw5NyA3LDc0IDcsMjYiIGZpbGw9IicrSU5LKyciLz4nfSwKICAgICAge2tleTonb2N0YWdvbicsIGxhYmVsOidPY3RvZ29uZScsIGlubmVyOic8cG9seWdvbiBwb2ludHM9IjMyLDQgNjgsNCA5NiwzMiA5Niw2OCA2OCw5NiAzMiw5NiA0LDY4IDQsMzIiIGZpbGw9IicrSU5LKyciLz4nfSwKICAgICAge2tleToncGx1cycsIGxhYmVsOidQbHVzJywgaW5uZXI6JzxwYXRoIGQ9Ik0zOCw0IEg2MiBWMzggSDk2IFY2MiBINjIgVjk2IEgzOCBWNjIgSDQgVjM4IEgzOCBaIiBmaWxsPSInK0lOSysnIi8+J30sCiAgICAgIHtrZXk6J3JpbmcnLCBsYWJlbDonQW5uZWF1JywgaW5uZXI6JzxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjM0IiBmaWxsPSJub25lIiBzdHJva2U9IicrSU5LKyciIHN0cm9rZS13aWR0aD0iMTgiLz4nfSwKICAgICAge2tleTonaGVhcnQnLCBsYWJlbDonQ8WTdXInLCBpbm5lcjonPHBhdGggZD0iTTUwLDkwIEMxMCw2MiA2LDM0IDI0LDIwIEMzNiwxMCA0OCwxNiA1MCwzMCBDNTIsMTYgNjQsMTAgNzYsMjAgQzk0LDM0IDkwLDYyIDUwLDkwIFoiIGZpbGw9IicrSU5LKyciLz4nfSwKICAgICAge2tleTonbW9vbicsIGxhYmVsOidDcm9pc3NhbnQnLCBpbm5lcjonPHBhdGggZD0iTTYyLDggQTQyLDQyIDAgMSAwIDYyLDkyIEEzNCwzNCAwIDEgMSA2Miw4IFoiIGZpbGw9IicrSU5LKyciLz4nfSwKICAgICAge2tleTondGVhcmRyb3AnLCBsYWJlbDonR291dHRlJywgaW5uZXI6JzxwYXRoIGQ9Ik01MCw2IEM3MiwzNCA4Niw1MiA4Niw2OCBBMzYsMzYgMCAxIDEgMTQsNjggQzE0LDUyIDI4LDM0IDUwLDYgWiIgZmlsbD0iJytJTksrJyIvPid9LAogICAgICB7a2V5OidjbG91ZCcsIGxhYmVsOidOdWFnZScsIGlubmVyOic8Y2lyY2xlIGN4PSIzMCIgY3k9IjU4IiByPSIxNiIgZmlsbD0iJytJTksrJyIvPjxjaXJjbGUgY3g9IjQ4IiBjeT0iNDQiIHI9IjIxIiBmaWxsPSInK0lOSysnIi8+PGNpcmNsZSBjeD0iNjkiIGN5PSI1NiIgcj0iMTUiIGZpbGw9IicrSU5LKyciLz48cmVjdCB4PSIyNCIgeT0iNTYiIHdpZHRoPSI1MiIgaGVpZ2h0PSIyMCIgcng9IjEwIiBmaWxsPSInK0lOSysnIi8+J30KICAgIF19LAogICAge25hbWU6J0Zsw6hjaGVzIGxhcmdlcycsIHNoYXBlczpbCiAgICAgIHtrZXk6J2Fycm93LXJpZ2h0JywgbGFiZWw6J0Zsw6hjaGUgZHJvaXRlJywgaW5uZXI6Jzxwb2x5Z29uIHBvaW50cz0iOCwzNSA2MCwzNSA2MCwxNSA5NSw1MCA2MCw4NSA2MCw2NSA4LDY1IiBmaWxsPSInK0lOSysnIi8+J30sCiAgICAgIHtrZXk6J2Fycm93LWxlZnQnLCBsYWJlbDonRmzDqGNoZSBnYXVjaGUnLCBpbm5lcjonPHBvbHlnb24gcG9pbnRzPSI5MiwzNSA0MCwzNSA0MCwxNSA1LDUwIDQwLDg1IDQwLDY1IDkyLDY1IiBmaWxsPSInK0lOSysnIi8+J30sCiAgICAgIHtrZXk6J2Fycm93LXVwJywgbGFiZWw6J0Zsw6hjaGUgaGF1dCcsIGlubmVyOic8cG9seWdvbiBwb2ludHM9IjM1LDkyIDM1LDQwIDE1LDQwIDUwLDUgODUsNDAgNjUsNDAgNjUsOTIiIGZpbGw9IicrSU5LKyciLz4nfSwKICAgICAge2tleTonYXJyb3ctZG93bicsIGxhYmVsOidGbMOoY2hlIGJhcycsIGlubmVyOic8cG9seWdvbiBwb2ludHM9IjM1LDggMzUsNjAgMTUsNjAgNTAsOTUgODUsNjAgNjUsNjAgNjUsOCIgZmlsbD0iJytJTksrJyIvPid9LAogICAgICB7a2V5OidjaGV2cm9uJywgbGFiZWw6J0NoZXZyb24nLCBpbm5lcjonPHBvbHlnb24gcG9pbnRzPSIxMiwxMCA1NSw1MCAxMiw5MCAzMCw5MCA3Myw1MCAzMCwxMCIgZmlsbD0iJytJTksrJyIvPid9LAogICAgICB7a2V5Oidkb3VibGUtY2hldnJvbicsIGxhYmVsOidEb3VibGUgY2hldnJvbicsIGlubmVyOic8cG9seWdvbiBwb2ludHM9IjQsMTAgMzQsNTAgNCw5MCAyMCw5MCA1MCw1MCAyMCwxMCIgZmlsbD0iJytJTksrJyIvPjxwb2x5Z29uIHBvaW50cz0iNDYsMTAgNzYsNTAgNDYsOTAgNjIsOTAgOTIsNTAgNjIsMTAiIGZpbGw9IicrSU5LKyciLz4nfSwKICAgICAge2tleTonY3VydmUnLCBsYWJlbDonRmzDqGNoZSBjb3VyYsOpZScsIGlubmVyOic8cGF0aCBkPSJNMTIsNzIgQzEyLDIyIDg4LDIyIDg4LDUyIiBzdHJva2U9IicrSU5LKyciIHN0cm9rZS13aWR0aD0iOSIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+PHBvbHlnb24gcG9pbnRzPSI3Niw0MiA5Nyw1MiA3OSw2OCIgZmlsbD0iJytJTksrJyIvPid9LAogICAgICB7a2V5Oidub3RjaGVkLWFycm93JywgbGFiZWw6J0Zsw6hjaGUgZmFuaW9uJywgaW5uZXI6Jzxwb2x5Z29uIHBvaW50cz0iNiwzMCA2NiwzMCA2NiwxMCA5Niw1MCA2Niw5MCA2Niw3MCA2LDcwIiBmaWxsPSInK0lOSysnIi8+J30KICAgIF19LAogICAge25hbWU6J8OJdG9pbGVzICZhbXA7IGJhbm5pw6hyZXMnLCBzaGFwZXM6WwogICAgICB7a2V5OidzdGFyNCcsIGxhYmVsOifDiXRvaWxlIMOgIDQgYnJhbmNoZXMnLCBpbm5lcjogc3RhcklubmVyKDQsNDYsMTUpfSwKICAgICAge2tleTonc3RhcicsIGxhYmVsOifDiXRvaWxlJywgaW5uZXI6IHN0YXJJbm5lcig1LDQ2LDE4KX0sCiAgICAgIHtrZXk6J3N0YXI2JywgbGFiZWw6J8OJdG9pbGUgw6AgNiBicmFuY2hlcycsIGlubmVyOiBzdGFySW5uZXIoNiw0NCwyMyl9LAogICAgICB7a2V5OidzdGFyOGJ1cnN0JywgbGFiZWw6J8OJY2xhdCDDoCA4IHBvaW50ZXMnLCBpbm5lcjogc3RhcklubmVyKDgsNDYsMjkpfSwKICAgICAge2tleTonYmFubmVyJywgbGFiZWw6J0Jhbm5pw6hyZScsIGlubmVyOic8cG9seWdvbiBwb2ludHM9IjYsMjAgNzYsMjAgOTYsNTAgNzYsODAgNiw4MCAyMiw1MCIgZmlsbD0iJytJTksrJyIvPid9CiAgICBdfSwKICAgIHtuYW1lOidPcmdhbmlncmFtbWUnLCBzaGFwZXM6WwogICAgICB7a2V5OidmbG93LXByb2Nlc3MnLCBsYWJlbDonUHJvY2Vzc3VzJywgaW5uZXI6JzxyZWN0IHg9IjEwIiB5PSIyNiIgd2lkdGg9IjgwIiBoZWlnaHQ9IjQ4IiBmaWxsPSInK0lOSysnIi8+J30sCiAgICAgIHtrZXk6J2Zsb3ctZGVjaXNpb24nLCBsYWJlbDonRMOpY2lzaW9uJywgaW5uZXI6Jzxwb2x5Z29uIHBvaW50cz0iNTAsNiA5NCw1MCA1MCw5NCA2LDUwIiBmaWxsPSInK0lOSysnIi8+J30sCiAgICAgIHtrZXk6J2Zsb3ctdGVybWluYWwnLCBsYWJlbDonVGVybWluYXRldXInLCBpbm5lcjonPHJlY3QgeD0iNiIgeT0iMzAiIHdpZHRoPSI4OCIgaGVpZ2h0PSI0MCIgcng9IjIwIiBmaWxsPSInK0lOSysnIi8+J30sCiAgICAgIHtrZXk6J2Zsb3ctZGF0YScsIGxhYmVsOidEb25uw6llcycsIGlubmVyOic8cG9seWdvbiBwb2ludHM9IjI0LDI2IDk2LDI2IDc2LDc0IDQsNzQiIGZpbGw9IicrSU5LKyciLz4nfSwKICAgICAge2tleTonZmxvdy1jb25uZWN0b3InLCBsYWJlbDonQ29ubmVjdGV1cicsIGlubmVyOic8Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSIzOCIgZmlsbD0iJytJTksrJyIvPid9CiAgICBdfSwKICAgIHtuYW1lOidTeW1ib2xlcycsIHNoYXBlczpbCiAgICAgIHtrZXk6J2NoZWNrJywgbGFiZWw6J0NvY2hlJywgaW5uZXI6JzxwYXRoIGQ9Ik0xMiw1MiBMNDAsODAgTDkwLDIwIiBzdHJva2U9IicrSU5LKyciIHN0cm9rZS13aWR0aD0iMTMiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPid9LAogICAgICB7a2V5Oidjcm9zcycsIGxhYmVsOidDcm9peCcsIGlubmVyOic8cGF0aCBkPSJNMTUsMTUgTDg1LDg1IE04NSwxNSBMMTUsODUiIHN0cm9rZT0iJytJTksrJyIgc3Ryb2tlLXdpZHRoPSIxMyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+J30sCiAgICAgIHtrZXk6J3dhcm5pbmcnLCBsYWJlbDonQXZlcnRpc3NlbWVudCcsIGlubmVyOic8cG9seWdvbiBwb2ludHM9IjUwLDcgOTYsOTAgNCw5MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSInK0lOSysnIiBzdHJva2Utd2lkdGg9IjciIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48cmVjdCB4PSI0NSIgeT0iMzQiIHdpZHRoPSIxMCIgaGVpZ2h0PSIyOCIgcng9IjMiIGZpbGw9IicrSU5LKyciLz48Y2lyY2xlIGN4PSI1MCIgY3k9Ijc1IiByPSI2IiBmaWxsPSInK0lOSysnIi8+J30sCiAgICAgIHtrZXk6J2RpdmlkZXInLCBsYWJlbDonU8OpcGFyYXRldXInLCBpbm5lcjonPHJlY3QgeD0iNSIgeT0iNDIiIHdpZHRoPSI5MCIgaGVpZ2h0PSI5IiByeD0iNC41IiBmaWxsPSInK0lOSysnIi8+J30sCiAgICAgIHtrZXk6J2dlYXInLCBsYWJlbDonRW5ncmVuYWdlJywgaW5uZXI6IGdlYXJJbm5lcigpfSwKICAgICAge2tleTonYm9sdCcsIGxhYmVsOifDiWNsYWlyJywgaW5uZXI6Jzxwb2x5Z29uIHBvaW50cz0iNTUsNCAxOCw1NSA0MSw1NSAzNCw5NiA4Miw0MiA1Niw0MiA2Niw0IiBmaWxsPSInK0lOSysnIi8+J30sCiAgICAgIHtrZXk6J2J1bGInLCBsYWJlbDonQW1wb3VsZScsIGlubmVyOic8Y2lyY2xlIGN4PSI1MCIgY3k9IjQwIiByPSIyOCIgZmlsbD0iJytJTksrJyIvPjxyZWN0IHg9IjM4IiB5PSI2NiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjEwIiByeD0iMyIgZmlsbD0iJytJTksrJyIvPjxyZWN0IHg9IjQxIiB5PSI3OCIgd2lkdGg9IjE4IiBoZWlnaHQ9IjgiIHJ4PSIzIiBmaWxsPSInK0lOSysnIi8+J30sCiAgICAgIHtrZXk6J2xvY2snLCBsYWJlbDonQ2FkZW5hcycsIGlubmVyOic8cmVjdCB4PSIyMiIgeT0iNDYiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0MiIgcng9IjgiIGZpbGw9IicrSU5LKyciLz48cGF0aCBkPSJNMzIsNDYgVjMyIEExOCwxOCAwIDAsMSA2OCwzMiBWNDYiIHN0cm9rZT0iJytJTksrJyIgc3Ryb2tlLXdpZHRoPSI5IiBmaWxsPSJub25lIi8+J30KICAgIF19CiAgXTsKICB2YXIgU0hBUEVfTUFQPXt9OwogIENBVEVHT1JJRVMuZm9yRWFjaChmdW5jdGlvbihjYXQpeyBjYXQuc2hhcGVzLmZvckVhY2goZnVuY3Rpb24oc2gpeyBTSEFQRV9NQVBbc2gua2V5XT1zaDsgfSk7IH0pOwoKICBmdW5jdGlvbiBzaGFwZVN2Z01hcmt1cChpbm5lcixzaXplKXsKICAgIHNpemU9c2l6ZXx8MTAwOwogICAgcmV0dXJuICc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHdpZHRoPSInK3NpemUrJyIgaGVpZ2h0PSInK3NpemUrJyI+Jytpbm5lcisnPC9zdmc+JzsKICB9CiAgZnVuY3Rpb24gc2hhcGVEYXRhVXJpKGlubmVyKXsKICAgIHJldHVybiAnZGF0YTppbWFnZS9zdmcreG1sLCcrZW5jb2RlVVJJQ29tcG9uZW50KHNoYXBlU3ZnTWFya3VwKGlubmVyKSk7CiAgfQoKICB2YXIgc2hhcGVDYXRlZ29yaWVzRWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXBlQ2F0ZWdvcmllcycpOwogIHZhciBPUEVOX0JZX0RFRkFVTFQ9eydGb3JtZXMgZGUgYmFzZSc6dHJ1ZSwnU3ltYm9sZXMnOnRydWV9OwogIENBVEVHT1JJRVMuZm9yRWFjaChmdW5jdGlvbihjYXQpewogICAgdmFyIHdyYXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICB3cmFwLmNsYXNzTmFtZT0nc2hhcGUtY2F0JzsKICAgIHZhciBvcGVuPSEhT1BFTl9CWV9ERUZBVUxUW2NhdC5uYW1lXTsKICAgIHZhciBoZWFkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogICAgaGVhZC50eXBlPSdidXR0b24nOwogICAgaGVhZC5jbGFzc05hbWU9J3NoYXBlLWNhdC1oZWFkJysob3Blbj8nIG9wZW4nOicnKTsKICAgIGhlYWQuaW5uZXJIVE1MPSc8c3ZnIGNsYXNzPSJjaGV2IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjMiPjxwYXRoIGQ9Ik05IDZsNiA2LTYgNiIvPjwvc3ZnPjxzcGFuPicrY2F0Lm5hbWUrJzwvc3Bhbj48c3BhbiBjbGFzcz0iY291bnQiPicrY2F0LnNoYXBlcy5sZW5ndGgrJzwvc3Bhbj4nOwogICAgdmFyIGdyaWQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBncmlkLmNsYXNzTmFtZT0nc2hhcGUtY2F0LWdyaWQnKyhvcGVuPycgb3Blbic6JycpOwogICAgY2F0LnNoYXBlcy5mb3JFYWNoKGZ1bmN0aW9uKHNoKXsKICAgICAgdmFyIGJ0bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgICAgYnRuLmNsYXNzTmFtZT0nc2hhcGUtYnRuJzsKICAgICAgYnRuLnRpdGxlPXNoLmxhYmVsOwogICAgICBidG4uaW5uZXJIVE1MPXNoYXBlU3ZnTWFya3VwKHNoLmlubmVyLDI4KTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgICAgIGFkZEltYWdlRWxlbWVudChzaGFwZURhdGFVcmkoc2guaW5uZXIpLDEwMCwxMDAse3N1YnR5cGU6J3NoYXBlJyx3RnJhYzowLjE2fSk7CiAgICAgIH0pOwogICAgICBncmlkLmFwcGVuZENoaWxkKGJ0bik7CiAgICB9KTsKICAgIGhlYWQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICAgIHZhciB3aWxsT3Blbj0haGVhZC5jbGFzc0xpc3QuY29udGFpbnMoJ29wZW4nKTsKICAgICAgaGVhZC5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyx3aWxsT3Blbik7CiAgICAgIGdyaWQuY2xhc3NMaXN0LnRvZ2dsZSgnb3Blbicsd2lsbE9wZW4pOwogICAgfSk7CiAgICB3cmFwLmFwcGVuZENoaWxkKGhlYWQpOwogICAgd3JhcC5hcHBlbmRDaGlsZChncmlkKTsKICAgIHNoYXBlQ2F0ZWdvcmllc0VsLmFwcGVuZENoaWxkKHdyYXApOwogIH0pOwoKICBmdW5jdGlvbiBwbGFjZWhvbGRlckxvZ28oKXsKICAgIHZhciBpbm5lcj0nPHJlY3QgeD0iMyIgeT0iMyIgd2lkdGg9IjE5NCIgaGVpZ2h0PSIxMzQiIHJ4PSI4IiBmaWxsPSIjZWZlY2U0IiBzdHJva2U9IiNiOWIzYTQiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWRhc2hhcnJheT0iNiA1IiB0cmFuc2Zvcm09InNjYWxlKDAuNSwwLjcyKSIvPic7CiAgICAvLyBidWlsZCBkaXJlY3RseSBhdCBpdHMgb3duIHZpZXdCb3ggaW5zdGVhZCBvZiByZXVzaW5nIHRoZSAxMDB4MTAwIGhlbHBlcgogICAgdmFyIHN2Zz0nPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMDAiIGhlaWdodD0iMTQwIiB2aWV3Qm94PSIwIDAgMjAwIDE0MCI+JysKICAgICAgJzxyZWN0IHg9IjMiIHk9IjMiIHdpZHRoPSIxOTQiIGhlaWdodD0iMTM0IiByeD0iOCIgZmlsbD0iI2VmZWNlNCIgc3Ryb2tlPSIjYjliM2E0IiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1kYXNoYXJyYXk9IjYgNSIvPicrCiAgICAgICc8Y2lyY2xlIGN4PSIxMDAiIGN5PSI1NiIgcj0iMjYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzhhODU3OCIgc3Ryb2tlLXdpZHRoPSI0Ii8+JysKICAgICAgJzxwYXRoIGQ9Ik03OCA1NmEyMiAyMiAwIDAxNDQgMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSInK0lOSysnIiBzdHJva2Utd2lkdGg9IjQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPicrCiAgICAgICc8dGV4dCB4PSIxMDAiIHk9IjEwNCIgZm9udC1mYW1pbHk9IkFyaWFsLHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTciIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiM2YjY4NjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGxldHRlci1zcGFjaW5nPSIyIj5MT0dPIENMSUVOVDwvdGV4dD4nKwogICAgICAnPC9zdmc+JzsKICAgIHJldHVybiAnZGF0YTppbWFnZS9zdmcreG1sLCcrZW5jb2RlVVJJQ29tcG9uZW50KHN2Zyk7CiAgfQoKICAvKiAtLS0tLS0tLS0tIGVsZW1lbnQgRE9NIC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBjcmVhdGVOb2RlKGVsKXsKICAgIHZhciB3cmFwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgd3JhcC5jbGFzc05hbWU9J2VsJysoZWwudHlwZSE9PSd0ZXh0Jz8nIGVsLWltYWdlJzonJyk7CiAgICB3cmFwLmRhdGFzZXQuaWQ9ZWwuaWQ7CgogICAgdmFyIGdyaXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBncmlwLmNsYXNzTmFtZT0nZWwtZ3JpcCc7CiAgICBncmlwLnRleHRDb250ZW50PSfioL/ioL8nOwogICAgd3JhcC5hcHBlbmRDaGlsZChncmlwKTsKCiAgICB2YXIgcm90YXRlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgcm90YXRlLmNsYXNzTmFtZT0nZWwtcm90YXRlJzsKICAgIHJvdGF0ZS50aXRsZT0nRmFpcmUgcGl2b3Rlcic7CiAgICB3cmFwLmFwcGVuZENoaWxkKHJvdGF0ZSk7CgogICAgdmFyIGNvbnRlbnQ7CiAgICBpZihlbC50eXBlPT09J3RleHQnKXsKICAgICAgY29udGVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgY29udGVudC5jbGFzc05hbWU9J2VsLWNvbnRlbnQgdGV4dC1jb250ZW50JzsKICAgICAgY29udGVudC5jb250ZW50RWRpdGFibGU9J3RydWUnOwogICAgICBjb250ZW50LnNwZWxsY2hlY2s9ZmFsc2U7CiAgICAgIGNvbnRlbnQuaW5uZXJUZXh0PWVsLnRleHQ7CiAgICAgIGNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLGZ1bmN0aW9uKCl7IGVsLnRleHQ9Y29udGVudC5pbm5lclRleHQ7IH0pOwogICAgICBjb250ZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJyxmdW5jdGlvbihlKXsgZS5zdG9wUHJvcGFnYXRpb24oKTsgc2VsZWN0RWxlbWVudChlbC5pZCk7IH0pOwogICAgfSBlbHNlIHsKICAgICAgY29udGVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKICAgICAgY29udGVudC5jbGFzc05hbWU9J2VsLWNvbnRlbnQgaW1nLWNvbnRlbnQnOwogICAgICBjb250ZW50LnNyYz1lbC5zcmM7CiAgICAgIGNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLGZ1bmN0aW9uKGUpeyBlLnN0b3BQcm9wYWdhdGlvbigpOyBzZWxlY3RFbGVtZW50KGVsLmlkKTsgfSk7CiAgICB9CiAgICB3cmFwLmFwcGVuZENoaWxkKGNvbnRlbnQpOwoKICAgIHZhciByZXNpemU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICByZXNpemUuY2xhc3NOYW1lPSdlbC1yZXNpemUnKyhlbC50eXBlPT09J3RleHQnPycgdy1vbmx5JzonJyk7CiAgICB3cmFwLmFwcGVuZENoaWxkKHJlc2l6ZSk7CgogICAgZ3JpcC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsZnVuY3Rpb24oZSl7IHN0YXJ0RHJhZyhlLGVsKTsgfSk7CiAgICByZXNpemUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLGZ1bmN0aW9uKGUpeyBzdGFydFJlc2l6ZShlLGVsKTsgfSk7CiAgICByb3RhdGUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLGZ1bmN0aW9uKGUpeyBzdGFydFJvdGF0ZShlLGVsKTsgfSk7CiAgICB3cmFwLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJyxmdW5jdGlvbihlKXsgaWYoZS50YXJnZXQ9PT13cmFwKSBzZWxlY3RFbGVtZW50KGVsLmlkKTsgfSk7CgogICAgc3RhZ2UuYXBwZW5kQ2hpbGQod3JhcCk7CiAgICBub2Rlc1tlbC5pZF09e3dyYXA6d3JhcCxjb250ZW50OmNvbnRlbnQsZ3JpcDpncmlwLHJlc2l6ZTpyZXNpemUscm90YXRlOnJvdGF0ZX07CiAgfQoKICBmdW5jdGlvbiBhcHBseVRleHRFZmZlY3QoY29udGVudEVsLGVsLGZvbnRQeCl7CiAgICBjb250ZW50RWwuc3R5bGUud2Via2l0VGV4dFN0cm9rZT0nJzsKICAgIGNvbnRlbnRFbC5zdHlsZS50ZXh0U2hhZG93PSdub25lJzsKICAgIGNvbnRlbnRFbC5zdHlsZS5jb2xvcj1JTks7CiAgICB2YXIgc3Ryb2tlPU1hdGgubWF4KDEsZm9udFB4KjAuMDQ1KTsKICAgIHZhciBvZmY9TWF0aC5tYXgoMS41LGZvbnRQeCowLjA3KTsKICAgIGlmKGVsLmVmZmVjdD09PSdvdXRsaW5lJyl7CiAgICAgIGNvbnRlbnRFbC5zdHlsZS5jb2xvcj0ndHJhbnNwYXJlbnQnOwogICAgICBjb250ZW50RWwuc3R5bGUud2Via2l0VGV4dFN0cm9rZT1zdHJva2UrJ3B4ICcrSU5LOwogICAgfSBlbHNlIGlmKGVsLmVmZmVjdD09PSdzaGFkb3cnKXsKICAgICAgY29udGVudEVsLnN0eWxlLnRleHRTaGFkb3c9b2ZmKydweCAnK29mZisncHggMCByZ2JhKDI4LDI4LDI1LC40KSc7CiAgICB9IGVsc2UgaWYoZWwuZWZmZWN0PT09J3JlbGllZicpewogICAgICBjb250ZW50RWwuc3R5bGUudGV4dFNoYWRvdz0KICAgICAgICAob2ZmKjAuMzUpKydweCAnKyhvZmYqMC4zNSkrJ3B4IDAgIzRkNGQ0NywnKwogICAgICAgIChvZmYqMC43KSsncHggJysob2ZmKjAuNykrJ3B4IDAgIzNhM2EzNSwnKwogICAgICAgIG9mZisncHggJytvZmYrJ3B4IDAgIzI3MjcyMyc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzdHlsZU5vZGUoZWwpewogICAgdmFyIG49bm9kZXNbZWwuaWRdOwogICAgaWYoIW4pIHJldHVybjsKICAgIHZhciBsZWZ0PWVsLnhGcmFjKm1ldHJpY3MudywgdG9wPWVsLnlGcmFjKm1ldHJpY3MuaCwgdz1lbC53RnJhYyptZXRyaWNzLnc7CiAgICBuLndyYXAuc3R5bGUubGVmdD1sZWZ0KydweCc7CiAgICBuLndyYXAuc3R5bGUudG9wPXRvcCsncHgnOwogICAgbi53cmFwLnN0eWxlLndpZHRoPXcrJ3B4JzsKICAgIG4ud3JhcC5zdHlsZS56SW5kZXg9ZWwuejsKICAgIG4ud3JhcC5jbGFzc0xpc3QudG9nZ2xlKCdzZWxlY3RlZCcsIHN0YXRlLnNlbGVjdGVkSWQ9PT1lbC5pZCk7CiAgICBuLndyYXAuY2xhc3NMaXN0LnRvZ2dsZSgnbG9ja2VkLWVsJywgc3RhdGUubG9ja2VkKTsKICAgIG4ud3JhcC5zdHlsZS50cmFuc2Zvcm0gPSBlbC5yb3QgPyAncm90YXRlKCcrZWwucm90KydkZWcpJyA6ICcnOwoKICAgIGlmKGVsLnR5cGU9PT0ndGV4dCcpewogICAgICBuLmNvbnRlbnQuY29udGVudEVkaXRhYmxlID0gc3RhdGUubG9ja2VkPyAnZmFsc2UnOid0cnVlJzsKICAgICAgbi5jb250ZW50LnN0eWxlLmZvbnRGYW1pbHk9ZWwuZm9udEZhbWlseTsKICAgICAgdmFyIGZvbnRQeD1lbC5mb250U2l6ZUZyYWMqbWV0cmljcy5oOwogICAgICBuLmNvbnRlbnQuc3R5bGUuZm9udFNpemU9Zm9udFB4KydweCc7CiAgICAgIG4uY29udGVudC5zdHlsZS5mb250V2VpZ2h0PWVsLmJvbGQ/JzcwMCc6JzUwMCc7CiAgICAgIG4uY29udGVudC5zdHlsZS5mb250U3R5bGU9ZWwuaXRhbGljPydpdGFsaWMnOidub3JtYWwnOwogICAgICB2YXIgZGVjbz1bXTsgaWYoZWwudW5kZXJsaW5lKSBkZWNvLnB1c2goJ3VuZGVybGluZScpOyBpZihlbC5zdHJpa2UpIGRlY28ucHVzaCgnbGluZS10aHJvdWdoJyk7CiAgICAgIG4uY29udGVudC5zdHlsZS50ZXh0RGVjb3JhdGlvbj1kZWNvLmxlbmd0aD9kZWNvLmpvaW4oJyAnKTonbm9uZSc7CiAgICAgIG4uY29udGVudC5zdHlsZS50ZXh0QWxpZ249ZWwuYWxpZ247CiAgICAgIG4uY29udGVudC5zdHlsZS5saW5lSGVpZ2h0PScxLjE1JzsKICAgICAgYXBwbHlUZXh0RWZmZWN0KG4uY29udGVudCxlbCxmb250UHgpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGg9ZWwuaEZyYWMqbWV0cmljcy5oOwogICAgICBuLndyYXAuc3R5bGUuaGVpZ2h0PWgrJ3B4JzsKICAgICAgdmFyIGZsaXBQYXJ0cz1bXTsKICAgICAgaWYoZWwuZmxpcEgpIGZsaXBQYXJ0cy5wdXNoKCdzY2FsZVgoLTEpJyk7CiAgICAgIGlmKGVsLmZsaXBWKSBmbGlwUGFydHMucHVzaCgnc2NhbGVZKC0xKScpOwogICAgICBuLmNvbnRlbnQuc3R5bGUudHJhbnNmb3JtPWZsaXBQYXJ0cy5qb2luKCcgJyk7CiAgICB9CiAgfQoKICAvKiBnYXJkZSBjaGFxdWUgw6lsw6ltZW50IMOgIGwnaW50w6lyaWV1ciBkZSBsYSBtYXJnZSBkZSBzw6ljdXJpdMOpLCB5IGNvbXByaXMgcXVhbmQgbGUgZm9ybWF0IGR1IHBvY2hvaXIgY2hhbmdlICovCiAgZnVuY3Rpb24gY2xhbXBUb1NhZmVab25lKGVsKXsKICAgIHZhciBtZng9bWV0cmljcy5tYXJnaW5GcmFjWHx8MCwgbWZ5PW1ldHJpY3MubWFyZ2luRnJhY1l8fDA7CiAgICBpZihlbC50eXBlPT09J3RleHQnKXsKICAgICAgZWwud0ZyYWM9TWF0aC5taW4oZWwud0ZyYWMsIE1hdGgubWF4KDAuMSwxLTIqbWZ4KSk7CiAgICAgIGVsLnhGcmFjPWNsYW1wKGVsLnhGcmFjLCBtZngsIE1hdGgubWF4KG1meCwxLW1meC1lbC53RnJhYykpOwogICAgICBlbC55RnJhYz1jbGFtcChlbC55RnJhYywgbWZ5LCBNYXRoLm1heChtZnksMS1tZnkpKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsLndGcmFjPU1hdGgubWluKGVsLndGcmFjLCBNYXRoLm1heCgwLjA0LDEtMiptZngpKTsKICAgICAgZWwuaEZyYWM9TWF0aC5taW4oZWwuaEZyYWMsIE1hdGgubWF4KDAuMDMsMS0yKm1meSkpOwogICAgICBlbC54RnJhYz1jbGFtcChlbC54RnJhYywgbWZ4LCBNYXRoLm1heChtZngsMS1tZngtZWwud0ZyYWMpKTsKICAgICAgZWwueUZyYWM9Y2xhbXAoZWwueUZyYWMsIG1meSwgTWF0aC5tYXgobWZ5LDEtbWZ5LWVsLmhGcmFjKSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHJlbmRlckFsbCgpewogICAgcmVjb21wdXRlTWV0cmljcygpOwogICAgc3RhdGUuZWxzLmZvckVhY2goY2xhbXBUb1NhZmVab25lKTsKICAgIHN0YXRlLmVscy5mb3JFYWNoKHN0eWxlTm9kZSk7CiAgICB1cGRhdGVTaWRlUGFuZWwoKTsKICB9CgogIC8qIC0tLS0tLS0tLS0gYWRkIGVsZW1lbnRzIC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBhZGRUZXh0KCl7CiAgICBpZihzdGF0ZS5sb2NrZWQpIHJldHVybjsKICAgIHZhciBlbD17aWQ6dWlkKCksdHlwZTondGV4dCcseEZyYWM6MC4yMix5RnJhYzowLjQyLHdGcmFjOjAuNTYsaEZyYWM6MCwKICAgICAgZm9udEZhbWlseToiJ0lCTSBQbGV4IFNhbnMgQ29uZGVuc2VkJyxBcmlhbCxzYW5zLXNlcmlmIixmb250U2l6ZUZyYWM6MC4wOSwKICAgICAgYm9sZDpmYWxzZSxpdGFsaWM6ZmFsc2UsdW5kZXJsaW5lOmZhbHNlLHN0cmlrZTpmYWxzZSxhbGlnbjonY2VudGVyJyxlZmZlY3Q6J2ZpbGwnLAogICAgICB6Oisrc3RhdGUuekNvdW50ZXIsdGV4dDonVk9UUkUgVEVYVEUnfTsKICAgIHN0YXRlLmVscy5wdXNoKGVsKTsKICAgIGNyZWF0ZU5vZGUoZWwpOwogICAgc3R5bGVOb2RlKGVsKTsKICAgIHNlbGVjdEVsZW1lbnQoZWwuaWQpOwogIH0KCiAgZnVuY3Rpb24gYWRkSW1hZ2VFbGVtZW50KGRhdGFVcmwsbmF0dXJhbFcsbmF0dXJhbEgsb3B0cyl7CiAgICBpZihzdGF0ZS5sb2NrZWQpIHJldHVybjsKICAgIG9wdHM9b3B0c3x8e307CiAgICB2YXIgd0ZyYWM9b3B0cy53RnJhY3x8MC4zOwogICAgdmFyIHdQeD13RnJhYyptZXRyaWNzLnc7CiAgICB2YXIgaFB4PXdQeCoobmF0dXJhbEgvbmF0dXJhbFcpOwogICAgdmFyIGhGcmFjPWNsYW1wKGhQeC9tZXRyaWNzLmgsIDAuMDMsIDAuODUpOwogICAgdmFyIGVsPXtpZDp1aWQoKSx0eXBlOidpbWFnZScsc3VidHlwZTpvcHRzLnN1YnR5cGV8fCdsb2dvJywKICAgICAgeEZyYWM6Y2xhbXAoMC41LXdGcmFjLzIsMCwxKSwgeUZyYWM6Y2xhbXAoMC41LWhGcmFjLzIsMCwxKSwgd0ZyYWM6d0ZyYWMsIGhGcmFjOmhGcmFjLAogICAgICByb3Q6MCwgZmxpcEg6ZmFsc2UsIGZsaXBWOmZhbHNlLAogICAgICB6Oisrc3RhdGUuekNvdW50ZXIsc3JjOmRhdGFVcmwscXJUZXh0Om9wdHMucXJUZXh0fHwnJ307CiAgICBzdGF0ZS5lbHMucHVzaChlbCk7CiAgICBjcmVhdGVOb2RlKGVsKTsKICAgIHN0eWxlTm9kZShlbCk7CiAgICBzZWxlY3RFbGVtZW50KGVsLmlkKTsKICAgIHJldHVybiBlbDsKICB9CgogIC8qIC0tLS0tLS0tLS0gc2VsZWN0aW9uICYgc2lkZWJhciAtLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gc2VsZWN0RWxlbWVudChpZCl7CiAgICBpZihzdGF0ZS5sb2NrZWQpeyBzdGF0ZS5zZWxlY3RlZElkPW51bGw7IH0KICAgIGVsc2UgeyBzdGF0ZS5zZWxlY3RlZElkPWlkOyB9CiAgICBzdGF0ZS5lbHMuZm9yRWFjaChzdHlsZU5vZGUpOwogICAgdXBkYXRlU2lkZVBhbmVsKCk7CiAgfQogIHN0YWdlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJyxmdW5jdGlvbihlKXsgaWYoZS50YXJnZXQ9PT1zdGFnZSl7IHNlbGVjdEVsZW1lbnQobnVsbCk7IH0gfSk7CgogIGZ1bmN0aW9uIGdldFNlbGVjdGVkKCl7CiAgICByZXR1cm4gc3RhdGUuZWxzLmZpbmQoZnVuY3Rpb24oZSl7IHJldHVybiBlLmlkPT09c3RhdGUuc2VsZWN0ZWRJZDsgfSk7CiAgfQoKICB2YXIgcGFuZWxEZWZhdWx0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYW5lbERlZmF1bHQnKTsKICB2YXIgcGFuZWxUZXh0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYW5lbFRleHQnKTsKICB2YXIgcGFuZWxJbWFnZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFuZWxJbWFnZScpOwogIHZhciBpbWFnZVBhbmVsVGl0bGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlUGFuZWxUaXRsZScpOwogIHZhciBpbWFnZVBhbmVsSGludD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2VQYW5lbEhpbnQnKTsKICB2YXIgZm9udFNlbGVjdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9udFNlbGVjdCcpOwogIHZhciBmb250U2l6ZVJhbmdlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb250U2l6ZVJhbmdlJyk7CiAgdmFyIGVmZmVjdFNlbGVjdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWZmZWN0U2VsZWN0Jyk7CiAgdmFyIGJvbGRCdG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvbGRCdG4nKSwgaXRhbGljQnRuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpdGFsaWNCdG4nKSwgdW5kZXJsaW5lQnRuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1bmRlcmxpbmVCdG4nKSwgc3RyaWtlQnRuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdHJpa2VCdG4nKTsKICB2YXIgYWxpZ25MZWZ0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGlnbkxlZnQnKSwgYWxpZ25DZW50ZXI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsaWduQ2VudGVyJyksIGFsaWduUmlnaHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsaWduUmlnaHQnKTsKICB2YXIgZmxpcEhCdG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZsaXBIQnRuJyksIGZsaXBWQnRuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmbGlwVkJ0bicpOwoKICB2YXIgU1VCVFlQRV9MQUJFTFM9e2xvZ286WydQcm9wcmnDqXTDqXMgZHUgbG9nbycsJ0ZhaXRlcyBnbGlzc2VyIGxhIHBvaWduw6llIGJsZXVlIHBvdXIgcmVwb3NpdGlvbm5lciwgb3UgbGUgY29pbiBwb3VyIHJlZGltZW5zaW9ubmVyIChwcm9wb3J0aW9ucyBjb25zZXJ2w6llcykuJ10sCiAgICBzaGFwZTpbJ1Byb3ByacOpdMOpcyBkdSBwaWN0b2dyYW1tZScsJ1JlcG9zaXRpb25uZXogb3UgcmVkaW1lbnNpb25uZXogbGEgZm9ybWUgZGVwdWlzIGxlcyBwb2lnbsOpZXMgYmxldWVzLiddLAogICAgcXI6WydQcm9wcmnDqXTDqXMgZHUgUVIgY29kZScsJyddfTsKCiAgZnVuY3Rpb24gdXBkYXRlU2lkZVBhbmVsKCl7CiAgICB2YXIgZWw9Z2V0U2VsZWN0ZWQoKTsKICAgIHBhbmVsRGVmYXVsdC5oaWRkZW4gPSAhIWVsOwogICAgcGFuZWxUZXh0LmhpZGRlbiA9ICEoZWwgJiYgZWwudHlwZT09PSd0ZXh0Jyk7CiAgICBwYW5lbEltYWdlLmhpZGRlbiA9ICEoZWwgJiYgZWwudHlwZT09PSdpbWFnZScpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZFRleHRCdG4nKS5kaXNhYmxlZD1zdGF0ZS5sb2NrZWQ7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkTG9nb0J0bicpLmRpc2FibGVkPXN0YXRlLmxvY2tlZDsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxckdlbmVyYXRlQnRuJykuZGlzYWJsZWQ9c3RhdGUubG9ja2VkOwogICAgaWYoZWwgJiYgZWwudHlwZT09PSd0ZXh0Jyl7CiAgICAgIGZvbnRTZWxlY3QudmFsdWU9ZWwuZm9udEZhbWlseTsKICAgICAgZm9udFNpemVSYW5nZS52YWx1ZT0oZWwuZm9udFNpemVGcmFjKjEwMCkudG9GaXhlZCgxKTsKICAgICAgZWZmZWN0U2VsZWN0LnZhbHVlPWVsLmVmZmVjdDsKICAgICAgYm9sZEJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLGVsLmJvbGQpOwogICAgICBpdGFsaWNCdG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJyxlbC5pdGFsaWMpOwogICAgICB1bmRlcmxpbmVCdG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJyxlbC51bmRlcmxpbmUpOwogICAgICBzdHJpa2VCdG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJyxlbC5zdHJpa2UpOwogICAgICBhbGlnbkxlZnQuY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJyxlbC5hbGlnbj09PSdsZWZ0Jyk7CiAgICAgIGFsaWduQ2VudGVyLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsZWwuYWxpZ249PT0nY2VudGVyJyk7CiAgICAgIGFsaWduUmlnaHQuY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJyxlbC5hbGlnbj09PSdyaWdodCcpOwogICAgfQogICAgaWYoZWwgJiYgZWwudHlwZT09PSdpbWFnZScpewogICAgICB2YXIgbGJsPVNVQlRZUEVfTEFCRUxTW2VsLnN1YnR5cGVdfHxTVUJUWVBFX0xBQkVMUy5sb2dvOwogICAgICBpbWFnZVBhbmVsVGl0bGUudGV4dENvbnRlbnQ9bGJsWzBdOwogICAgICBpbWFnZVBhbmVsSGludC50ZXh0Q29udGVudCA9IGVsLnN1YnR5cGU9PT0ncXInICYmIGVsLnFyVGV4dCA/ICdRUiBjb2RlIGfDqW7DqXLDqSBwb3VyIDogJytlbC5xclRleHQgOiBsYmxbMV07CiAgICAgIGZsaXBIQnRuLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsISFlbC5mbGlwSCk7CiAgICAgIGZsaXBWQnRuLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsISFlbC5mbGlwVik7CiAgICB9CiAgfQoKICBmb250U2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsZnVuY3Rpb24oKXsgdmFyIGVsPWdldFNlbGVjdGVkKCk7IGlmKGVsKXsgZWwuZm9udEZhbWlseT1mb250U2VsZWN0LnZhbHVlOyBzdHlsZU5vZGUoZWwpO30gfSk7CiAgZm9udFNpemVSYW5nZS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsZnVuY3Rpb24oKXsgdmFyIGVsPWdldFNlbGVjdGVkKCk7IGlmKGVsKXsgZWwuZm9udFNpemVGcmFjPWZvbnRTaXplUmFuZ2UudmFsdWUvMTAwOyBzdHlsZU5vZGUoZWwpO30gfSk7CiAgZWZmZWN0U2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsZnVuY3Rpb24oKXsgdmFyIGVsPWdldFNlbGVjdGVkKCk7IGlmKGVsKXsgZWwuZWZmZWN0PWVmZmVjdFNlbGVjdC52YWx1ZTsgc3R5bGVOb2RlKGVsKTt9IH0pOwogIGJvbGRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7IHZhciBlbD1nZXRTZWxlY3RlZCgpOyBpZihlbCl7IGVsLmJvbGQ9IWVsLmJvbGQ7IHN0eWxlTm9kZShlbCk7IHVwZGF0ZVNpZGVQYW5lbCgpOyB9IH0pOwogIGl0YWxpY0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsgdmFyIGVsPWdldFNlbGVjdGVkKCk7IGlmKGVsKXsgZWwuaXRhbGljPSFlbC5pdGFsaWM7IHN0eWxlTm9kZShlbCk7IHVwZGF0ZVNpZGVQYW5lbCgpOyB9IH0pOwogIHVuZGVybGluZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsgdmFyIGVsPWdldFNlbGVjdGVkKCk7IGlmKGVsKXsgZWwudW5kZXJsaW5lPSFlbC51bmRlcmxpbmU7IHN0eWxlTm9kZShlbCk7IHVwZGF0ZVNpZGVQYW5lbCgpOyB9IH0pOwogIHN0cmlrZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsgdmFyIGVsPWdldFNlbGVjdGVkKCk7IGlmKGVsKXsgZWwuc3RyaWtlPSFlbC5zdHJpa2U7IHN0eWxlTm9kZShlbCk7IHVwZGF0ZVNpZGVQYW5lbCgpOyB9IH0pOwogIGFsaWduTGVmdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsgdmFyIGVsPWdldFNlbGVjdGVkKCk7IGlmKGVsKXsgZWwuYWxpZ249J2xlZnQnOyBzdHlsZU5vZGUoZWwpOyB1cGRhdGVTaWRlUGFuZWwoKTsgfSB9KTsKICBhbGlnbkNlbnRlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsgdmFyIGVsPWdldFNlbGVjdGVkKCk7IGlmKGVsKXsgZWwuYWxpZ249J2NlbnRlcic7IHN0eWxlTm9kZShlbCk7IHVwZGF0ZVNpZGVQYW5lbCgpOyB9IH0pOwogIGFsaWduUmlnaHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7IHZhciBlbD1nZXRTZWxlY3RlZCgpOyBpZihlbCl7IGVsLmFsaWduPSdyaWdodCc7IHN0eWxlTm9kZShlbCk7IHVwZGF0ZVNpZGVQYW5lbCgpOyB9IH0pOwoKICBmdW5jdGlvbiBicmluZ0Zyb250KCl7IHZhciBlbD1nZXRTZWxlY3RlZCgpOyBpZihlbCl7IGVsLno9KytzdGF0ZS56Q291bnRlcjsgc3R5bGVOb2RlKGVsKTt9IH0KICBmdW5jdGlvbiBzZW5kQmFjaygpeyB2YXIgZWw9Z2V0U2VsZWN0ZWQoKTsgaWYoZWwpeyBlbC56PS0tc3RhdGUuekNvdW50ZXI7IHN0eWxlTm9kZShlbCk7fSB9CiAgZnVuY3Rpb24gZGVsZXRlU2VsZWN0ZWQoKXsKICAgIHZhciBlbD1nZXRTZWxlY3RlZCgpOyBpZighZWwpIHJldHVybjsKICAgIHZhciBuPW5vZGVzW2VsLmlkXTsgaWYobikgbi53cmFwLnJlbW92ZSgpOwogICAgZGVsZXRlIG5vZGVzW2VsLmlkXTsKICAgIHN0YXRlLmVscz1zdGF0ZS5lbHMuZmlsdGVyKGZ1bmN0aW9uKGUpeyByZXR1cm4gZS5pZCE9PWVsLmlkOyB9KTsKICAgIHNlbGVjdEVsZW1lbnQobnVsbCk7CiAgfQogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmcm9udEJ0blQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsYnJpbmdGcm9udCk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2tCdG5UJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHNlbmRCYWNrKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlQnRuVCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxkZWxldGVTZWxlY3RlZCk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zyb250QnRuSScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxicmluZ0Zyb250KTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja0J0bkknKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsc2VuZEJhY2spOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGVCdG5JJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGRlbGV0ZVNlbGVjdGVkKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncm90YXRlTGVmdEJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpeyB2YXIgZWw9Z2V0U2VsZWN0ZWQoKTsgaWYoZWwpeyBlbC5yb3Q9KCgoZWwucm90fHwwKS05MCklMzYwKzM2MCklMzYwOyBzdHlsZU5vZGUoZWwpO30gfSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JvdGF0ZVJpZ2h0QnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7IHZhciBlbD1nZXRTZWxlY3RlZCgpOyBpZihlbCl7IGVsLnJvdD0oKChlbC5yb3R8fDApKzkwKSUzNjArMzYwKSUzNjA7IHN0eWxlTm9kZShlbCk7fSB9KTsKICBmbGlwSEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsgdmFyIGVsPWdldFNlbGVjdGVkKCk7IGlmKGVsKXsgZWwuZmxpcEg9IWVsLmZsaXBIOyBzdHlsZU5vZGUoZWwpOyB1cGRhdGVTaWRlUGFuZWwoKTsgfSB9KTsKICBmbGlwVkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsgdmFyIGVsPWdldFNlbGVjdGVkKCk7IGlmKGVsKXsgZWwuZmxpcFY9IWVsLmZsaXBWOyBzdHlsZU5vZGUoZWwpOyB1cGRhdGVTaWRlUGFuZWwoKTsgfSB9KTsKCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZFRleHRCdG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsYWRkVGV4dCk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZExvZ29CdG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ29JbnB1dCcpLmNsaWNrKCk7IH0pOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvSW5wdXQnKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLGZ1bmN0aW9uKGUpewogICAgdmFyIGZpbGU9ZS50YXJnZXQuZmlsZXNbMF07IGlmKCFmaWxlKSByZXR1cm47CiAgICB2YXIgcmVhZGVyPW5ldyBGaWxlUmVhZGVyKCk7CiAgICByZWFkZXIub25sb2FkPWZ1bmN0aW9uKGV2KXsKICAgICAgdmFyIGltZz1uZXcgSW1hZ2UoKTsKICAgICAgaW1nLm9ubG9hZD1mdW5jdGlvbigpeyBhZGRJbWFnZUVsZW1lbnQoZXYudGFyZ2V0LnJlc3VsdCxpbWcubmF0dXJhbFdpZHRofHwyMDAsaW1nLm5hdHVyYWxIZWlnaHR8fDE0MCx7c3VidHlwZTonbG9nbyd9KTsgfTsKICAgICAgaW1nLnNyYz1ldi50YXJnZXQucmVzdWx0OwogICAgfTsKICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpOwogICAgZS50YXJnZXQudmFsdWU9Jyc7CiAgfSk7CgogIC8qIC0tLS0tLS0tLS0gUVIgY29kZSAtLS0tLS0tLS0tICovCiAgdmFyIHFyVXJsSW5wdXQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3FyVXJsSW5wdXQnKTsKICB2YXIgcXJFcnJvcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXJFcnJvcicpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxckdlbmVyYXRlQnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICBpZihzdGF0ZS5sb2NrZWQpIHJldHVybjsKICAgIHZhciB2YWw9cXJVcmxJbnB1dC52YWx1ZS50cmltKCk7CiAgICBpZighdmFsKXsgcXJFcnJvci5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7IHJldHVybjsgfQogICAgcXJFcnJvci5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7CiAgICB2YXIgaG9sZGVyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxckhpZGRlbicpOwogICAgaG9sZGVyLmlubmVySFRNTD0nJzsKICAgIHRyeXsKICAgICAgbmV3IFFSQ29kZShob2xkZXIse3RleHQ6dmFsLHdpZHRoOjIyMCxoZWlnaHQ6MjIwLGNvbG9yRGFyazpJTkssY29sb3JMaWdodDonI2Y0ZjJlZScsY29ycmVjdExldmVsOlFSQ29kZS5Db3JyZWN0TGV2ZWwuTX0pOwogICAgfWNhdGNoKGVycil7IHFyRXJyb3IudGV4dENvbnRlbnQ9J0ltcG9zc2libGUgZGUgZ8OpbsOpcmVyIGNlIFFSIGNvZGUuJzsgcXJFcnJvci5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7IHJldHVybjsgfQogICAgdmFyIGNhbnZhc0VsPWhvbGRlci5xdWVyeVNlbGVjdG9yKCdjYW52YXMnKTsKICAgIHZhciBkYXRhVXJsID0gY2FudmFzRWwgPyBjYW52YXNFbC50b0RhdGFVUkwoJ2ltYWdlL3BuZycpIDogKGhvbGRlci5xdWVyeVNlbGVjdG9yKCdpbWcnKXx8e30pLnNyYzsKICAgIGlmKCFkYXRhVXJsKSByZXR1cm47CiAgICBhZGRJbWFnZUVsZW1lbnQoZGF0YVVybCwyMjAsMjIwLHtzdWJ0eXBlOidxcicscXJUZXh0OnZhbCx3RnJhYzowLjIyfSk7CiAgfSk7CgogIC8qIC0tLS0tLS0tLS0gZHJhZyAmIHJlc2l6ZSAtLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gc3RhcnREcmFnKGUsZWwpewogICAgaWYoc3RhdGUubG9ja2VkKSByZXR1cm47CiAgICBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBzZWxlY3RFbGVtZW50KGVsLmlkKTsKICAgIHZhciBzdGFydFg9ZS5jbGllbnRYLCBzdGFydFk9ZS5jbGllbnRZOwogICAgdmFyIHN4PWVsLnhGcmFjLCBzeT1lbC55RnJhYzsKICAgIHZhciBtZng9bWV0cmljcy5tYXJnaW5GcmFjWHx8MCwgbWZ5PW1ldHJpY3MubWFyZ2luRnJhY1l8fDA7CiAgICB2YXIgbWF4WUZyYWMgPSBlbC50eXBlPT09J2ltYWdlJyA/IDEtbWZ5LWVsLmhGcmFjIDogMS1tZnk7CiAgICBmdW5jdGlvbiBvbk1vdmUoZXYpewogICAgICB2YXIgZHg9ZXYuY2xpZW50WC1zdGFydFgsIGR5PWV2LmNsaWVudFktc3RhcnRZOwogICAgICBlbC54RnJhYz1jbGFtcChzeCtkeC9tZXRyaWNzLncsIG1meCwgMS1tZngtZWwud0ZyYWMpOwogICAgICBlbC55RnJhYz1jbGFtcChzeStkeS9tZXRyaWNzLmgsIG1meSwgbWF4WUZyYWMpOwogICAgICBzdHlsZU5vZGUoZWwpOwogICAgfQogICAgZnVuY3Rpb24gb25VcCgpeyBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsb25Nb3ZlKTsgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJyxvblVwKTsgfQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLG9uTW92ZSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLG9uVXApOwogIH0KCiAgZnVuY3Rpb24gc3RhcnRSZXNpemUoZSxlbCl7CiAgICBpZihzdGF0ZS5sb2NrZWQpIHJldHVybjsKICAgIGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgIHNlbGVjdEVsZW1lbnQoZWwuaWQpOwogICAgdmFyIHN0YXJ0WD1lLmNsaWVudFgsIHN0YXJ0WT1lLmNsaWVudFk7CiAgICB2YXIgc3c9ZWwud0ZyYWMsIHNoPWVsLmhGcmFjOwogICAgdmFyIHRoZXRhPShlbC5yb3R8fDApKk1hdGguUEkvMTgwLCBjb3NUPU1hdGguY29zKHRoZXRhKSwgc2luVD1NYXRoLnNpbih0aGV0YSk7CiAgICB2YXIgbWZ4PW1ldHJpY3MubWFyZ2luRnJhY1h8fDAsIG1meT1tZXRyaWNzLm1hcmdpbkZyYWNZfHwwOwogICAgZnVuY3Rpb24gb25Nb3ZlKGV2KXsKICAgICAgdmFyIGR4U2NyZWVuPWV2LmNsaWVudFgtc3RhcnRYLCBkeVNjcmVlbj1ldi5jbGllbnRZLXN0YXJ0WTsKICAgICAgLyogcHJvamVjdCB0aGUgc2NyZWVuLXNwYWNlIGRyYWcgb250byB0aGUgc2hhcGUncyBvd24gKHBvc3NpYmx5IHJvdGF0ZWQpIHgtYXhpcyAqLwogICAgICB2YXIgZHggPSBkeFNjcmVlbipjb3NUICsgZHlTY3JlZW4qc2luVDsKICAgICAgaWYoZWwudHlwZT09PSd0ZXh0Jyl7CiAgICAgICAgZWwud0ZyYWM9Y2xhbXAoc3crZHgvbWV0cmljcy53LCAwLjEsIDEtbWZ4LWVsLnhGcmFjKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgcmF0aW89c2gvc3c7CiAgICAgICAgdmFyIG53PWNsYW1wKHN3K2R4L21ldHJpY3MudywgMC4wNCwgMS1tZngtZWwueEZyYWMpOwogICAgICAgIGVsLndGcmFjPW53OwogICAgICAgIGVsLmhGcmFjPWNsYW1wKG53KnJhdGlvLCAwLjAzLCAxLW1meS1lbC55RnJhYyk7CiAgICAgIH0KICAgICAgc3R5bGVOb2RlKGVsKTsKICAgIH0KICAgIGZ1bmN0aW9uIG9uVXAoKXsgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLG9uTW92ZSk7IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsb25VcCk7IH0KICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJyxvbk1vdmUpOwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJyxvblVwKTsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0Um90YXRlKGUsZWwpewogICAgaWYoc3RhdGUubG9ja2VkKSByZXR1cm47CiAgICBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBzZWxlY3RFbGVtZW50KGVsLmlkKTsKICAgIHZhciBuPW5vZGVzW2VsLmlkXTsKICAgIHZhciByZWN0PW4ud3JhcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIHZhciBjeD1yZWN0LmxlZnQrcmVjdC53aWR0aC8yLCBjeT1yZWN0LnRvcCtyZWN0LmhlaWdodC8yOwogICAgdmFyIHN0YXJ0Um90PWVsLnJvdHx8MDsKICAgIHZhciBzdGFydEFuZ2xlPU1hdGguYXRhbjIoZS5jbGllbnRZLWN5LCBlLmNsaWVudFgtY3gpKjE4MC9NYXRoLlBJOwogICAgZnVuY3Rpb24gb25Nb3ZlKGV2KXsKICAgICAgdmFyIGFuZ2xlPU1hdGguYXRhbjIoZXYuY2xpZW50WS1jeSwgZXYuY2xpZW50WC1jeCkqMTgwL01hdGguUEk7CiAgICAgIHZhciBuZXdSb3Q9c3RhcnRSb3QrKGFuZ2xlLXN0YXJ0QW5nbGUpOwogICAgICBpZihldi5zaGlmdEtleSl7IG5ld1JvdD1NYXRoLnJvdW5kKG5ld1JvdC8xNSkqMTU7IH0KICAgICAgZWwucm90PSgobmV3Um90JTM2MCkrMzYwKSUzNjA7CiAgICAgIHN0eWxlTm9kZShlbCk7CiAgICB9CiAgICBmdW5jdGlvbiBvblVwKCl7IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJyxvbk1vdmUpOyBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLG9uVXApOyB9CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsb25Nb3ZlKTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsb25VcCk7CiAgfQoKICAvKiAtLS0tLS0tLS0tIHNpemUgY29udHJvbHMgLS0tLS0tLS0tLSAqLwogIHZhciB3aWR0aFJhbmdlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3aWR0aFJhbmdlJyksIGhlaWdodFJhbmdlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWlnaHRSYW5nZScpOwogIHZhciB3aWR0aExhYmVsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3aWR0aExhYmVsJyksIGhlaWdodExhYmVsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWlnaHRMYWJlbCcpOwogIHZhciBwcmljZVZhbHVlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmljZVZhbHVlJyk7CgogIGZ1bmN0aW9uIHNldFNpemUodyxoKXsKICAgIHN0YXRlLndpZHRoQ209Y2xhbXAodyxNSU5fVyxNQVhfVyk7CiAgICBzdGF0ZS5oZWlnaHRDbT1jbGFtcChoLE1JTl9ILE1BWF9IKTsKICAgIHdpZHRoUmFuZ2UudmFsdWU9c3RhdGUud2lkdGhDbTsKICAgIGhlaWdodFJhbmdlLnZhbHVlPXN0YXRlLmhlaWdodENtOwogICAgd2lkdGhMYWJlbC50ZXh0Q29udGVudD1mbXRDbShzdGF0ZS53aWR0aENtKSsnIGNtJzsKICAgIGhlaWdodExhYmVsLnRleHRDb250ZW50PWZtdENtKHN0YXRlLmhlaWdodENtKSsnIGNtJzsKICAgIHByaWNlVmFsdWUudGV4dENvbnRlbnQ9Zm10UHJpY2UoY29tcHV0ZVByaWNlKHN0YXRlLndpZHRoQ20sc3RhdGUuaGVpZ2h0Q20pKTsKICAgIHJlbmRlckFsbCgpOwogIH0KICB3aWR0aFJhbmdlLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JyxmdW5jdGlvbigpeyBzZXRTaXplKCt3aWR0aFJhbmdlLnZhbHVlLCBzdGF0ZS5oZWlnaHRDbSk7IH0pOwogIGhlaWdodFJhbmdlLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JyxmdW5jdGlvbigpeyBzZXRTaXplKHN0YXRlLndpZHRoQ20sICtoZWlnaHRSYW5nZS52YWx1ZSk7IH0pOwogIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnByZXNldC1idG4nKSxmdW5jdGlvbihidG4pewogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpeyBpZihzdGF0ZS5sb2NrZWQpIHJldHVybjsgc2V0U2l6ZSgrYnRuLmRhdGFzZXQudywgK2J0bi5kYXRhc2V0LmgpOyB9KTsKICB9KTsKCiAgLyogLS0tLS0tLS0tLSB2YWxpZGF0ZSAvIGNvbmZpcm0gLS0tLS0tLS0tLSAqLwogIHZhciBzaXplUGFuZWxFZGl0aW5nPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaXplUGFuZWxFZGl0aW5nJyk7CiAgdmFyIHNpemVQYW5lbENvbmZpcm09ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpemVQYW5lbENvbmZpcm0nKTsKICB2YXIgY29uZmlybURpbT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybURpbScpLCBjb25maXJtUGxhdGVEaW09ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm1QbGF0ZURpbScpLCBjb25maXJtUHJpY2U9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm1QcmljZScpOwogIHZhciB0b2FzdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9hc3QnKTsKCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZhbGlkYXRlQnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICBzdGF0ZS5sb2NrZWQ9dHJ1ZTsKICAgIHNlbGVjdEVsZW1lbnQobnVsbCk7CiAgICBzaXplUGFuZWxFZGl0aW5nLmhpZGRlbj10cnVlOwogICAgc2l6ZVBhbmVsQ29uZmlybS5oaWRkZW49ZmFsc2U7CiAgICBjb25maXJtRGltLnRleHRDb250ZW50PWZtdENtKHN0YXRlLndpZHRoQ20pKycgw5cgJytmbXRDbShzdGF0ZS5oZWlnaHRDbSkrJyBjbSc7CiAgICBjb25maXJtUGxhdGVEaW0udGV4dENvbnRlbnQ9Zm10Q20obWV0cmljcy5vdXRlcldpZHRoQ20pKycgw5cgJytmbXRDbShtZXRyaWNzLm91dGVySGVpZ2h0Q20pKycgY20nOwogICAgY29uZmlybVByaWNlLnRleHRDb250ZW50PWZtdFByaWNlKGNvbXB1dGVQcmljZShzdGF0ZS53aWR0aENtLHN0YXRlLmhlaWdodENtKSk7CiAgICBzdGFnZS5jbGFzc0xpc3QuYWRkKCdsb2NrZWQnKTsKICAgIHJlbmRlckFsbCgpOwogIH0pOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0QWdhaW5CdG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICAgIHN0YXRlLmxvY2tlZD1mYWxzZTsKICAgIHNpemVQYW5lbEVkaXRpbmcuaGlkZGVuPWZhbHNlOwogICAgc2l6ZVBhbmVsQ29uZmlybS5oaWRkZW49dHJ1ZTsKICAgIHN0YWdlLmNsYXNzTGlzdC5yZW1vdmUoJ2xvY2tlZCcpOwogICAgcmVuZGVyQWxsKCk7CiAgfSk7CiAgdmFyIGFkZENhcnRCdG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZENhcnRCdG4nKTsKICB2YXIgUFJPRFVDVF9VUkw9J2h0dHBzOi8vd3d3LmNvcmUtaW5kdXN0cmlhbC5mci9Qb2Nob2lyLWRlLW1hcnF1YWdlLXN1ci1tZXN1cmUtY29uZmlndXJhdGV1cic7CgogIGZ1bmN0aW9uIHNob3dUb2FzdChtc2csZHVyYXRpb24pewogICAgdG9hc3QudGV4dENvbnRlbnQ9bXNnOwogICAgdG9hc3QuY2xhc3NMaXN0LmFkZCgnc2hvdycpOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpeyB0b2FzdC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7IH0sZHVyYXRpb258fDIyMDApOwogIH0KCiAgZnVuY3Rpb24gZXhwb3J0UGRmKCl7CiAgICBpZih0eXBlb2YgaHRtbDJjYW52YXM9PT0ndW5kZWZpbmVkJyB8fCAhd2luZG93LmpzcGRmKXsKICAgICAgc2hvd1RvYXN0KCdQREYgaW5kaXNwb25pYmxlIOKAlCByw6llc3NheWV6IGRhbnMgcXVlbHF1ZXMgc2Vjb25kZXMuJywzMjAwKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgYWRkQ2FydEJ0bi5kaXNhYmxlZD10cnVlOwogICAgYWRkQ2FydEJ0bi50ZXh0Q29udGVudD0nR8OpbsOpcmF0aW9uIGR1IFBERuKApic7CiAgICBzYWZlWm9uZS5zdHlsZS52aXNpYmlsaXR5PSdoaWRkZW4nOwogICAgZGltQ2hpcC5zdHlsZS52aXNpYmlsaXR5PSdoaWRkZW4nOwogICAgaHRtbDJjYW52YXMoc3RhZ2Use2JhY2tncm91bmRDb2xvcjonI2ZmZmZmZicsc2NhbGU6NH0pLnRoZW4oZnVuY3Rpb24oY2FudmFzKXsKICAgICAgc2FmZVpvbmUuc3R5bGUudmlzaWJpbGl0eT0nJzsKICAgICAgZGltQ2hpcC5zdHlsZS52aXNpYmlsaXR5PScnOwogICAgICB2YXIgaW1nRGF0YT1jYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTsKICAgICAgdmFyIGpzUERGQ3Rvcj13aW5kb3cuanNwZGYuanNQREY7CiAgICAgIHZhciB3TW09bWV0cmljcy5vdXRlcldpZHRoQ20qMTAsIGhNbT1tZXRyaWNzLm91dGVySGVpZ2h0Q20qMTA7CiAgICAgIHZhciBwZGY9bmV3IGpzUERGQ3Rvcih7b3JpZW50YXRpb246KHdNbT49aE1tPydsJzoncCcpLHVuaXQ6J21tJyxmb3JtYXQ6W3dNbSxoTW1dfSk7CiAgICAgIHBkZi5hZGRJbWFnZShpbWdEYXRhLCdQTkcnLDAsMCx3TW0saE1tKTsKICAgICAgcGRmLnNhdmUoJ3BvY2hvaXItY29yZS1pbmR1c3RyaWFsLScrTWF0aC5yb3VuZChzdGF0ZS53aWR0aENtKjEwKSsneCcrTWF0aC5yb3VuZChzdGF0ZS5oZWlnaHRDbSoxMCkrJ21tLnBkZicpOwogICAgICBhZGRDYXJ0QnRuLmRpc2FibGVkPWZhbHNlOwogICAgICBhZGRDYXJ0QnRuLnRleHRDb250ZW50PSdUw6lsw6ljaGFyZ2VyIGxlIFBERiAoSEQpJzsKICAgICAgc2hvd1RvYXN0KCfinJMgUERGIHTDqWzDqWNoYXJnw6knKTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCl7CiAgICAgIHNhZmVab25lLnN0eWxlLnZpc2liaWxpdHk9Jyc7CiAgICAgIGRpbUNoaXAuc3R5bGUudmlzaWJpbGl0eT0nJzsKICAgICAgYWRkQ2FydEJ0bi5kaXNhYmxlZD1mYWxzZTsKICAgICAgYWRkQ2FydEJ0bi50ZXh0Q29udGVudD0nVMOpbMOpY2hhcmdlciBsZSBQREYgKEhEKSc7CiAgICAgIHNob3dUb2FzdCgnRXJyZXVyIGxvcnMgZGUgbGEgZ8OpbsOpcmF0aW9uIGR1IFBERi4nLDMyMDApOwogICAgfSk7CiAgfQoKICBhZGRDYXJ0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxleHBvcnRQZGYpOwoKICAvKiAtLS0tLS0tLS0tIHNhbXBsZSBzdGFydGluZyBjb250ZW50IC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBzZWVkKCl7CiAgICBzZXRTaXplKDIxLDE0LjgpOwogICAgdmFyIHQxPXtpZDp1aWQoKSx0eXBlOid0ZXh0Jyx4RnJhYzowLjEzLHlGcmFjOjAuMjAsd0ZyYWM6MC43NCxoRnJhYzowLAogICAgICBmb250RmFtaWx5OiInT3N3YWxkJyxBcmlhbCxzYW5zLXNlcmlmIixmb250U2l6ZUZyYWM6MC4xMDUsCiAgICAgIGJvbGQ6dHJ1ZSxpdGFsaWM6ZmFsc2UsdW5kZXJsaW5lOmZhbHNlLHN0cmlrZTpmYWxzZSxhbGlnbjonY2VudGVyJyxlZmZlY3Q6J2ZpbGwnLAogICAgICB6Oisrc3RhdGUuekNvdW50ZXIsdGV4dDonQUNJRVIgSU5PWCAzMTZMJ307CiAgICB2YXIgdDI9e2lkOnVpZCgpLHR5cGU6J3RleHQnLHhGcmFjOjAuMjIseUZyYWM6MC40Mix3RnJhYzowLjU2LGhGcmFjOjAsCiAgICAgIGZvbnRGYW1pbHk6IidJQk0gUGxleCBNb25vJywnQ291cmllciBOZXcnLG1vbm9zcGFjZSIsZm9udFNpemVGcmFjOjAuMDc1LAogICAgICBib2xkOmZhbHNlLGl0YWxpYzpmYWxzZSx1bmRlcmxpbmU6ZmFsc2Usc3RyaWtlOmZhbHNlLGFsaWduOidjZW50ZXInLGVmZmVjdDonb3V0bGluZScsCiAgICAgIHo6KytzdGF0ZS56Q291bnRlcix0ZXh0OidMT1QgTsKwIDI0LTA4MTcnfTsKICAgIHN0YXRlLmVscy5wdXNoKHQxLHQyKTsKICAgIGNyZWF0ZU5vZGUodDEpOyBjcmVhdGVOb2RlKHQyKTsKICAgIHZhciBsb2dvPWFkZEltYWdlRWxlbWVudChwbGFjZWhvbGRlckxvZ28oKSwyMDAsMTQwLHtzdWJ0eXBlOidsb2dvJyx3RnJhYzowLjJ9KTsKICAgIGxvZ28ueEZyYWM9MC4xNTsgbG9nby55RnJhYz0wLjYwOwogICAgdmFyIGdlYXJTaGFwZT1TSEFQRV9NQVBbJ2dlYXInXTsKICAgIHZhciBnZWFyPWFkZEltYWdlRWxlbWVudChzaGFwZURhdGFVcmkoZ2VhclNoYXBlLmlubmVyKSwxMDAsMTAwLHtzdWJ0eXBlOidzaGFwZScsd0ZyYWM6MC4xMn0pOwogICAgZ2Vhci54RnJhYz0wLjY4OyBnZWFyLnlGcmFjPTAuNjA7CiAgICBzdGF0ZS5zZWxlY3RlZElkPW51bGw7CiAgICByZW5kZXJBbGwoKTsKICB9CgogIHNlZWQoKTsKfSkoKTsKPC9zY3JpcHQ+Cg==