Análisis de máquinas de azar
Ingresa con tu cuenta autorizada.
Usuario
Contraseña
Ingresar
Ingresa con tu cuenta autorizada.
Enjoy Los Ángeles · Supabase · análisis y rendimiento v8
Cerrar sesión
ENJOY LOS ÁNGELES / ANÁLISIS DE MÁQUINAS DE AZAR
Panorama de rendimiento
Explora el desempeño de tu parque de máquinas.
↑ Actualizar matriz
Leyendo matriz…
Desde
Hasta
Restablecer filtros
Guardar vista
Mis vistas guardadas
Agrupar por
Indicador
Evolución
Mensual
Semanal
Diaria
Referencia de ratios
Total del período, sin filtros de categorías
Salón de cada grupo
Selección filtrada
↓ Exportar consulta
CmZ1bmN0aW9uIGF4aXNQZXJpb2RWMTQobGFiZWwpewogY29uc3QgbT1TdHJpbmcobGFiZWwpLm1hdGNoKC9eKC4qPylccysoPzrCt1xzKik/KFxkezR9KSQvKTsKIHJldHVybiBtID8gZXNjKG1bMV0pKyc8dHNwYW4geD0iMCIgZHk9IjE3Ij4nK21bMl0rJzwvdHNwYW4+JyA6IGVzYyhsYWJlbCk7Cn0KZnVuY3Rpb24gYXhpc0RhdGVzVjE0KHJhbmdlKXsKIGNvbnN0IG1vbnRocz17ZW5lcm86JzAxJyxmZWJyZXJvOicwMicsbWFyem86JzAzJyxhYnJpbDonMDQnLG1heW86JzA1JyxqdW5pbzonMDYnLGp1bGlvOicwNycsYWdvc3RvOicwOCcsc2VwdGllbWJyZTonMDknLG9jdHVicmU6JzEwJyxub3ZpZW1icmU6JzExJyxkaWNpZW1icmU6JzEyJ307CiByZXR1cm4gU3RyaW5nKHJhbmdlKS5yZXBsYWNlKC8oXGR7MSwyfSkgKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmUpIFxkezR9L2csKG0sZCxtb250aCk9PmQucGFkU3RhcnQoMiwnMCcpKycvJyttb250aHNbbW9udGhdKS5yZXBsYWNlKCcg4oaSICcsJyDigJMgJyk7Cn0KY29uc3QgJD1zPT5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHMpLCBlc2M9cz0+U3RyaW5nKHM/PydTaW4gZGF0bycpLnJlcGxhY2UoL1smPD4iJ10vZyxjPT4oeycmJzonJmFtcDsnLCc8JzonJmx0OycsJz4nOicmZ3Q7JywnIic6JyZxdW90OycsIiciOicmIzM5Oyd9W2NdKSk7CmNvbnN0IGRpbXM9ezE6J03DoXF1aW5hJywyOidNYXJjYSAvIEZhYnJpY2FudGUnLDM6J1BsYXRhZm9ybWEnLDQ6J01vZGVsbyAvIEp1ZWdvJyw5OidCYW5jbyAvIEJsb3F1ZScsODonUG96byAvIElELVByb2cnLDU6J1NlY3RvciAvIFNlY2Npw7NuJyw3OidTYWzDs24nfTsKY29uc3QgbWV0cmljcz17d2luOidXaW4gb3BlcmFjaW9uYWwnLGNvaW46J0NvaW4gSW4nLHdkOidXaW4gLyBkw61hIHJlZ2lzdHJhZG8nLGNkOidDb2luIEluIC8gZMOtYSByZWdpc3RyYWRvJyxiZXQ6J0FwdWVzdGEgcHJvbWVkaW8nLHBvOidQYXlvdXQnLHBvbjonUGF5b3V0IGNvbiBOQ0MnLGRldjonRGVzdmlhY2nDs24gTkNDJyxzcGluOidTcGlucycsc2Q6J1NwaW5zIC8gZMOtYSByZWdpc3RyYWRvJyxyYXRpbzonUmF0aW8gQ29pbiBJbiAvIGTDrWEnLHJzOidSYXRpbyBzcGlucyAvIGTDrWEnLHJiOidSYXRpbyBhcHVlc3RhIHByb21lZGlvJyxvY2M6J09jdXBhY2nDs24gbWVkaWEnLHByaXplOidQcmVtaW9zJyxwcm9tbzonUHJvbW8gbmV0YSd9OwpsZXQgZGF0YSx0YWI9J1Jlc3VtZW4nLHBhZ2U9MCxzb3J0PSd3aW4nLGRlc2M9dHJ1ZSx0YWJsZVJvd3M9W10scXVlcnk9Jyc7CmNvbnN0IG51bT0odik9PnR5cGVvZiB2PT09J251bWJlcicmJk51bWJlci5pc0Zpbml0ZSh2KT92OjAsIGRpdj0oYSxiKT0+YT09bnVsbHx8Yj09bnVsbHx8Yj09PTA/bnVsbDphL2I7CmNvbnN0IGZtdD0odixrKT0+dj09bnVsbD8n4oCUJzpbJ3BvJywncG9uJywnZGV2Jywnb2NjJ10uaW5jbHVkZXMoayk/KHYqMTAwKS50b0xvY2FsZVN0cmluZygnZXMtQ0wnLHttYXhpbXVtRnJhY3Rpb25EaWdpdHM6Mn0pKyclJzpbJ3JhdGlvJywncnMnLCdyYiddLmluY2x1ZGVzKGspP3YudG9GaXhlZCgyKSsnw5cnOnYudG9Mb2NhbGVTdHJpbmcoJ2VzLUNMJyx7bWF4aW11bUZyYWN0aW9uRGlnaXRzOk1hdGguYWJzKHYpPDEwMD8yOjB9KTsKY29uc3QgY29tcGFjdD0odixrKT0+dj09bnVsbD8n4oCUJzpbJ3BvJywncG9uJywnZGV2Jywnb2NjJywncmF0aW8nLCdycycsJ3JiJ10uaW5jbHVkZXMoayk/Zm10KHYsayk6TWF0aC5hYnModik+PTFlNj8odi8xZTYpLnRvTG9jYWxlU3RyaW5nKCdlcy1DTCcse21heGltdW1GcmFjdGlvbkRpZ2l0czoxfSkrJyBNJzpmbXQodixrKTsKZnVuY3Rpb24gYWdnKHJvd3Mpe2xldCBhPXt3aW46MCxjb2luOjAsc3BpbjowLHByaXplOjAscHJvbW86MCxvYzowLG46MCxkYXlzOjB9LGRheXM9bmV3IFNldDtmb3IoY29uc3QgciBvZiByb3dzKXthLndpbis9bnVtKHJbMTZdKTthLmNvaW4rPW51bShyWzE4XSk7YS5zcGluKz1udW0oclsyMF0pO2EucHJpemUrPW51bShyWzE1XSk7YS5wcm9tbys9bnVtKHJbMjZdKS1udW0oclsyN10pO2lmKHR5cGVvZiByWzIyXT09PSdudW1iZXInKXthLm9jKz1yWzIyXTthLm4rK31pZihyWzFdIT1udWxsKWRheXMuYWRkKHJbMF0rJ3wnK3JbMV0pfWEuZGF5cz1kYXlzLnNpemU7YS53ZD1kaXYoYS53aW4sYS5kYXlzKTthLmNkPWRpdihhLmNvaW4sYS5kYXlzKTthLnNkPWRpdihhLnNwaW4sYS5kYXlzKTthLmJldD1kaXYoYS5jb2luLGEuc3Bpbik7YS5wbz1hLmNvaW4/MS1hLndpbi9hLmNvaW46bnVsbDthLnBvbj1hLmNvaW4/MS0oYS53aW4rYS5wcm9tbykvYS5jb2luOm51bGw7YS5kZXY9YS5wbz09bnVsbD9udWxsOmEucG8tYS5wb247YS5vY2M9ZGl2KGEub2MsYS5uKTtyZXR1cm4gYX0KZnVuY3Rpb24gc2VsZWN0ZWQoKXtyZXR1cm4gT2JqZWN0LmtleXMoZGltcykubWFwKGs9PlsrayxbLi4uJCgnI2YnK2spLnNlbGVjdGVkT3B0aW9uc10ubWFwKG89Pm8udmFsdWUpXSkuZmlsdGVyKHg9PnhbMV0ubGVuZ3RoKX0KZnVuY3Rpb24gZGF0ZWQoKXtyZXR1cm4gZGF0YS5yb3dzLmZpbHRlcihyPT4oISQoJyNmcm9tJykudmFsdWV8fHJbMF0+PSQoJyNmcm9tJykudmFsdWUpJiYoISQoJyN0bycpLnZhbHVlfHxyWzBdPD0kKCcjdG8nKS52YWx1ZSkpfQpmdW5jdGlvbiBmaWx0ZXJlZCgpe2xldCBzZWw9c2VsZWN0ZWQoKTtyZXR1cm4gZGF0ZWQoKS5maWx0ZXIocj0+c2VsLmV2ZXJ5KChbayx2XSk9PnYuaW5jbHVkZXMoU3RyaW5nKHJba10/PydTaW4gZGF0bycpKSkpfQpmdW5jdGlvbiBpbml0KCl7bGV0IGRhdGVzPWRhdGEucm93cy5tYXAocj0+clswXSkuc29ydCgpOyQoJyNmcm9tJykudmFsdWU9ZGF0ZXNbMF07JCgnI3RvJykudmFsdWU9ZGF0ZXMuYXQoLTEpOyQoJyNmaWx0ZXJzJykuaW5uZXJIVE1MPU9iamVjdC5lbnRyaWVzKGRpbXMpLm1hcCgoW2ssdl0pPT5gPGxhYmVsPiR7dn08c2VsZWN0IGlkPSJmJHtrfSIgbXVsdGlwbGUgYXJpYS1sYWJlbD0iJHt2fSI+JHtbLi4ubmV3IFNldChkYXRhLnJvd3MubWFwKHI9PlN0cmluZyhyW2tdPz8nU2luIGRhdG8nKSkpXS5maWx0ZXIodmFsdWU9PnZhbHVlLnRyaW0oKS50b0xvY2FsZVVwcGVyQ2FzZSgnZXMnKSE9PSdFWFBJUkFET1MnKS5zb3J0KChhLGIpPT5hLmxvY2FsZUNvbXBhcmUoYix1bmRlZmluZWQse251bWVyaWM6dHJ1ZX0pKS5tYXAodj0+YDxvcHRpb24gdmFsdWU9IiR7ZXNjKHYpfSI+JHtlc2Modil9PC9vcHRpb24+YCkuam9pbignJyl9PC9zZWxlY3Q+PC9sYWJlbD5gKS5qb2luKCcnKTskKCcjc3RhdHVzJykudGV4dENvbnRlbnQ9YCR7ZGF0YS5uYW1lfSDCtyAke2ZtdChkYXRhLnJvd3MubGVuZ3RoKX0gcmVnaXN0cm9zIMK3ICR7ZGF0ZXNbMF19IOKGkiAke2RhdGVzLmF0KC0xKX0gwrcgQ3RybC9DbWQgKyBjbGljIHBhcmEgc2VsZWNjacOzbiBtw7psdGlwbGVgOyQoJyNmb290JykudGV4dENvbnRlbnQ9J0RhdG9zIGFjdHVhbGl6YWRvcyBoYXN0YSAnK2RhdGVzLmF0KC0xKTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZmlsdGVycyBzZWxlY3QnKS5mb3JFYWNoKGU9PmUub25jaGFuZ2U9KCk9PntwYWdlPTA7cmVuZGVyKCl9KTtyZW5kZXIoKX0KZnVuY3Rpb24gZ3JvdXBzKHJvd3Msa2V5KXtsZXQgbT1uZXcgTWFwO2ZvcihsZXQgciBvZiByb3dzKXtsZXQgaz1rZXkocik7aWYoIW0uaGFzKGspKW0uc2V0KGssW10pO20uZ2V0KGspLnB1c2gocil9cmV0dXJuIFsuLi5tXS5tYXAoKFtuYW1lLHJvd3NdKT0+KHtuYW1lLHJvd3MsLi4uYWdnKHJvd3MpfSkpfQpmdW5jdGlvbiByYXRpb3MoYSxyZWYpe2EucmF0aW89ZGl2KGEuY2QscmVmLmNkKTthLnJzPWRpdihhLnNkLHJlZi5zZCk7YS5yYj1kaXYoYS5iZXQscmVmLmJldCk7cmV0dXJuIGF9CmZ1bmN0aW9uIGxlZ2FjeVJlbmRlcigpe2lmKCFkYXRhKXJldHVybjtsZXQgcm93cz1maWx0ZXJlZCgpLGJhc2U9ZGF0ZWQoKSxhPWFnZyhyb3dzKSxyZWZlcmVuY2U9YWdnKCQoJyNyZWYnKS52YWx1ZT09PSdmaWx0ZXJlZCc/cm93czpiYXNlKSxnPSskKCcjZ3JvdXAnKS52YWx1ZSxrPSQoJyNtZXRyaWMnKS52YWx1ZTtyYXRpb3MoYSxyZWZlcmVuY2UpO3RhYmxlUm93cz1ncm91cHMocm93cyxyPT5TdHJpbmcocltnXT8/J1NpbiBkYXRvJykpO2xldCBzYWxvbkNhY2hlPW5ldyBNYXA7Zm9yKGxldCBpdGVtIG9mIHRhYmxlUm93cyl7bGV0IHJlZj1yZWZlcmVuY2U7aWYoJCgnI3JlZicpLnZhbHVlPT09J3NhbG9uJyl7bGV0IHNhbG9ucz1bLi4ubmV3IFNldChpdGVtLnJvd3MubWFwKHI9PnJbN10pKV0uc29ydCgpLGtleT1KU09OLnN0cmluZ2lmeShzYWxvbnMpO2lmKCFzYWxvbkNhY2hlLmhhcyhrZXkpKXNhbG9uQ2FjaGUuc2V0KGtleSxhZ2coYmFzZS5maWx0ZXIocj0+c2Fsb25zLmluY2x1ZGVzKHJbN10pKSkpO3JlZj1zYWxvbkNhY2hlLmdldChrZXkpfXJhdGlvcyhpdGVtLHJlZil9JCgnI3RpdGxlJykudGV4dENvbnRlbnQ9KHtSZXN1bWVuOidQYW5vcmFtYSBkZSByZW5kaW1pZW50bycsQ29tcGFyYXRpdm9zOidDb21wYXJhdGl2b3MgZGVsIHBhcnF1ZScsRXZvbHVjacOzbjonRXZvbHVjacOzbiBkZSBpbmRpY2Fkb3JlcycsUmF0aW9zOidSYXRpb3MgZGUgcmVuZGltaWVudG8nLE1ldG9kb2xvZ8OtYTonQ8OhbGN1bG9zIHkgYWN0dWFsaXphY2nDs24nfSlbdGFiXTtpZih0YWI9PT0nTWV0b2RvbG9nw61hJyl7bWV0aG9kKCk7cmV0dXJufWxldCBjYXJkcz1bJ3dpbicsJ2NvaW4nLCdwbycsJ2JldCddOyQoJyNjb250ZW50JykuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJrcGlzIj4ke2NhcmRzLm1hcChrPT5gPGRpdiBjbGFzcz0iY2FyZCBrcGkiPjxzbWFsbD4ke21ldHJpY3Nba10udG9VcHBlckNhc2UoKX08L3NtYWxsPjxzdHJvbmc+JHtjb21wYWN0KGFba10sayl9PC9zdHJvbmc+PHNwYW4+JHtbJ3dpbicsJ2NvaW4nLCdiZXQnXS5pbmNsdWRlcyhrKT8nQ0xQIMK3ICc6Jyd9JHtrPT09J3BvJz8nQ2FsY3VsYWRvIHNvYnJlIHRvdGFsZXMnOmZtdChhLmRheXMpKycgbcOhcXVpbmFzLWTDrWEgcmVnaXN0cmFkYXMnfTwvc3Bhbj48L2Rpdj5gKS5qb2luKCcnKX08L2Rpdj4keyFyb3dzLmxlbmd0aD8nPGRpdiBjbGFzcz0iY2FyZCBlbXB0eSI+Tm8gaGF5IHJlZ2lzdHJvcyBwYXJhIGVzdGEgc2VsZWNjacOzbi4gQWp1c3RhIGxvcyBmaWx0cm9zLjwvZGl2Pic6YDxkaXYgY2xhc3M9ImNoYXJ0cyI+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPiR7dGFiPT09J1JhdGlvcyc/J1JlbmRpbWllbnRvIHJlbGF0aXZvJzonUmFua2luZyBwb3IgJyttZXRyaWNzW2tdfTwvaDI+PGRpdiBjbGFzcz0ic3VidGl0bGUiPiR7ZGltc1tnXX0gwrcgU2VsZWNjacOzbiBhY3R1YWwgwrcgVG9wIDg8L2Rpdj48ZGl2IGlkPSJiYXJzIj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+RXZvbHVjacOzbiBkZSAke21ldHJpY3Nba119PC9oMj48ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+JHskKCcjZ3JhaW4nKS5zZWxlY3RlZE9wdGlvbnNbMF0udGV4dH0gwrcgJHtzZWxlY3RlZERhdGVUZXh0VjgoJ2dsb2JhbCcpfTwvZGl2PjxkaXYgaWQ9ImxpbmUiPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImNhcmQiPjxkaXYgY2xhc3M9InRhYmxldG9wIj48ZGl2PjxoMj5EZXRhbGxlIGNvbXBhcmF0aXZvPC9oMj48c3BhbiBjbGFzcz0ic3VidGl0bGUiPk9yZGVuYSBkZXNkZSBsb3MgZW5jYWJlemFkb3MgwrcgUmF0aW9zOiAxw5cgPSByZWZlcmVuY2lhPC9zcGFuPjwvZGl2PjxpbnB1dCBpZD0ic2VhcmNoIiBwbGFjZWhvbGRlcj0iQnVzY2FyIGdydXBv4oCmIiB2YWx1ZT0iJHtlc2MocXVlcnkpfSI+PC9kaXY+PGRpdiBjbGFzcz0idGFibGV3cmFwIiBpZD0idGFibGUiPjwvZGl2PjxkaXYgY2xhc3M9InBhZ2VyIj48c3BhbiBpZD0iY291bnQiPjwvc3Bhbj48ZGl2PjxidXR0b24gaWQ9InByZXYiPuKGkDwvYnV0dG9uPiA8YnV0dG9uIGlkPSJuZXh0Ij7ihpI8L2J1dHRvbj48L2Rpdj48L2Rpdj48L2Rpdj5gfWA7aWYoIXJvd3MubGVuZ3RoKXJldHVybjtsZXQgcmFua2VkPVsuLi50YWJsZVJvd3NdLnNvcnQoKGEsYik9PihiW2tdPz8tSW5maW5pdHkpLShhW2tdPz8tSW5maW5pdHkpKS5zbGljZSgwLDgpLG1heD1NYXRoLm1heCguLi5yYW5rZWQubWFwKHI9Pk1hdGguYWJzKHJba118fDApKSwxKTskKCcjYmFycycpLmlubmVySFRNTD1yYW5rZWQubWFwKHI9PmA8ZGl2IGNsYXNzPSJiYXJyb3ciPjxzcGFuIGNsYXNzPSJiYXJsYWJlbCIgdGl0bGU9IiR7ZXNjKHIubmFtZSl9Ij4ke2VzYyhyLm5hbWUpfTwvc3Bhbj48ZGl2IGNsYXNzPSJ0cmFjayI+PGRpdiBjbGFzcz0iYmFyICR7cltrXTwwPyduZWdhdGl2ZSc6Jyd9IiBzdHlsZT0id2lkdGg6JHtNYXRoLm1heCgwLE1hdGguYWJzKHJba118fDApL21heCoxMDApfSUiPjwvZGl2PjwvZGl2PjxiPiR7Y29tcGFjdChyW2tdLGspfTwvYj48L2Rpdj5gKS5qb2luKCcnKTtsZXQgdHJlbmQ9Z3JvdXBzKHJvd3Mscj0+JCgnI2dyYWluJykudmFsdWU9PT0nbW9udGgnP3JbMF0uc2xpY2UoMCw3KTokKCcjZ3JhaW4nKS52YWx1ZT09PSd3ZWVrJz9yWzBdLnNsaWNlKDAsNCkrJyDCtyBTJytTdHJpbmcoclszMF0pLnBhZFN0YXJ0KDIsJzAnKTpyWzBdKS5zb3J0KChhLGIpPT5hLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTt0cmVuZC5mb3JFYWNoKHQ9PnJhdGlvcyh0LHJlZmVyZW5jZSkpO2xldCB2YWxzPXRyZW5kLm1hcCh0PT50W2tdKSxsbz1NYXRoLm1pbigwLC4uLnZhbHMuZmlsdGVyKHY9PnYhPW51bGwpKSxoaT1NYXRoLm1heCguLi52YWxzLmZpbHRlcih2PT52IT1udWxsKSwxKSxyYW5nZT1oaS1sb3x8MTskKCcjbGluZScpLmlubmVySFRNTD1gPHN2ZyB2aWV3Qm94PSIwIDAgNTAwIDIyMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJFdm9sdWNpw7NuIj48bGluZSB4MT0iMTAiIHkxPSIxODUiIHgyPSI0OTAiIHkyPSIxODUiIHN0cm9rZT0iI2RjZTdlOSIvPjxwb2x5bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiMxZDllOGQiIHN0cm9rZS13aWR0aD0iMyIgcG9pbnRzPSIke3RyZW5kLmZpbHRlcih0PT50W2tdIT1udWxsKS5tYXAodD0+YCR7MTArdHJlbmQuaW5kZXhPZih0KS9NYXRoLm1heCgxLHRyZW5kLmxlbmd0aC0xKSo0ODB9LCR7MTgwLSh0W2tdLWxvKS9yYW5nZSoxNTB9YCkuam9pbignICcpfSIvPiR7dHJlbmQubWFwKCh0LGkpPT5gPGNpcmNsZSBjeD0iJHsxMCtpL01hdGgubWF4KDEsdHJlbmQubGVuZ3RoLTEpKjQ4MH0iIGN5PSIke3Rba109PW51bGw/MTg1OjE4MC0odFtrXS1sbykvcmFuZ2UqMTUwfSIgcj0iMyIgZmlsbD0iIzFkOWU4ZCI+PHRpdGxlPiR7ZXNjKHQubmFtZSl9OiAke2ZtdCh0W2tdLGspfTwvdGl0bGU+PC9jaXJjbGU+YCkuam9pbignJyl9PHRleHQgeD0iMTAiIHk9IjIxNCIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzdiOTA5YiI+JHtlc2ModHJlbmRbMF0/Lm5hbWUpfTwvdGV4dD48dGV4dCB4PSI0OTAiIHk9IjIxNCIgdGV4dC1hbmNob3I9ImVuZCIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzdiOTA5YiI+JHtlc2ModHJlbmQuYXQoLTEpPy5uYW1lKX08L3RleHQ+PHRleHQgeD0iMTAiIHk9IjE0IiBmb250LXNpemU9IjExIiBmaWxsPSIjN2I5MDliIj5Nw6F4LiAke2NvbXBhY3QoaGksayl9PC90ZXh0Pjwvc3ZnPmA7JCgnI3NlYXJjaCcpLm9uaW5wdXQ9ZT0+e3F1ZXJ5PWUudGFyZ2V0LnZhbHVlO3BhZ2U9MDt0YWJsZSgpfTskKCcjcHJldicpLm9uY2xpY2s9KCk9PntwYWdlPU1hdGgubWF4KDAscGFnZS0xKTt0YWJsZSgpfTskKCcjbmV4dCcpLm9uY2xpY2s9KCk9PntpZigocGFnZSsxKSoyMDx2aXNpYmxlUm93cygpLmxlbmd0aClwYWdlKys7dGFibGUoKX07dGFibGUoKX0KZnVuY3Rpb24gdmlzaWJsZVJvd3MoKXtyZXR1cm4gdGFibGVSb3dzLmZpbHRlcihyPT5yLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKSkuc29ydCgoYSxiKT0+c29ydD09PSduYW1lJz8oZGVzYz8tMToxKSphLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpOihkZXNjPy0xOjEpKigoYVtzb3J0XT8/LUluZmluaXR5KS0oYltzb3J0XT8/LUluZmluaXR5KSkpfQpmdW5jdGlvbiB0YWJsZSgpe2xldCBjb2xzPXRhYj09PSdSYXRpb3MnP1snY2QnLCdzZCcsJ2JldCcsJ3JhdGlvJywncnMnLCdyYiddOlsnd2luJywnY29pbicsJ3dkJywncG8nLCdwb24nLCdiZXQnLCdzcGluJywncmF0aW8nXTtsZXQgYWxsPXZpc2libGVSb3dzKCk7JCgnI3RhYmxlJykuaW5uZXJIVE1MPWA8dGFibGU+PHRoZWFkPjx0cj48dGggZGF0YS1rPSJuYW1lIj4ke2RpbXNbJCgnI2dyb3VwJykudmFsdWVdfSDihpU8L3RoPiR7Y29scy5tYXAoaz0+YDx0aCBkYXRhLWs9IiR7a30iPiR7bWV0cmljc1trXX0g4oaVPC90aD5gKS5qb2luKCcnKX08L3RyPjwvdGhlYWQ+PHRib2R5PiR7YWxsLnNsaWNlKHBhZ2UqMjAscGFnZSoyMCsyMCkubWFwKHI9PmA8dHI+PHRkPiR7ZXNjKHIubmFtZSl9PC90ZD4ke2NvbHMubWFwKGs9PmA8dGQ+JHtbJ3JhdGlvJywncnMnLCdyYiddLmluY2x1ZGVzKGspP2A8c3BhbiBkYXRhLXJhdGlvLXY2PSIke3Jba10/PycnfSIgY2xhc3M9InBpbGwgJHtyW2tdPDE/J2xvdyc6Jyd9Ij4ke2ZtdChyW2tdLGspfTwvc3Bhbj5gOmZtdChyW2tdLGspfTwvdGQ+YCkuam9pbignJyl9PC90cj5gKS5qb2luKCcnKX08L3Rib2R5PjwvdGFibGU+YDskKCcjY291bnQnKS50ZXh0Q29udGVudD1gJHthbGwubGVuZ3RofSBncnVwb3MgwrcgUMOhZ2luYSAke3BhZ2UrMX0gZGUgJHtNYXRoLm1heCgxLE1hdGguY2VpbChhbGwubGVuZ3RoLzIwKSl9YDtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0aCcpLmZvckVhY2godGg9PnRoLm9uY2xpY2s9KCk9PntkZXNjPXNvcnQ9PT10aC5kYXRhc2V0Lms/IWRlc2M6dHJ1ZTtzb3J0PXRoLmRhdGFzZXQuazt0YWJsZSgpfSl9CmZ1bmN0aW9uIG1ldGhvZCgpeyQoJyNjb250ZW50JykuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJub3RpY2UiPkFjdHVhbGl6YSBjb24gdW4gRXhjZWwgLnhsc3ggcXVlIGluY2x1eWEgbGEgcGVzdGHDsWEgTWF0cml6IHkgbG9zIG1pc21vcyBlbmNhYmV6YWRvcy4gTGEgY2FyZ2EgcGVybWl0ZSBhY3R1YWxpemFyIGTDrWFzIHJlY2liaWRvcyBvIHJlZW1wbGF6YXIgdG9kbyBlbCBoaXN0w7NyaWNvOyByZXZpc2EgbGEgdmlzdGEgcHJldmlhLiBHdWFyZGEgZWwgRXhjZWwgZW4gc3UgYXBsaWNhY2nDs24gYW50ZXMgZGUgY2FyZ2FybG8gcGFyYSBhY3R1YWxpemFyIGxvcyByZXN1bHRhZG9zIGRlIHN1cyBmw7NybXVsYXMuPC9kaXY+PGRpdiBjbGFzcz0iZm9ybXVsYXMiPiR7W1snV2luIG9wZXJhY2lvbmFsJywnU1VNQShNYXRyaXohUTpRKScsJ1NlIHVzYSBsYSBwcmltZXJhIGNvbHVtbmEgV2luIChRKS4gTGEgc2VndW5kYSwgWCwgY29ycmVzcG9uZGUgYSBvdHJvIHZhbG9yIGRlbCBhcmNoaXZvIHkgbm8gc2UgbWV6Y2xhLiddLFsnUGF5b3V0IHkgTkNDJywnUE8gPSAxIOKIkiBXaW4gLyBDb2luIEluPGJyPlBPIE5DQyA9IDEg4oiSIChXaW4gKyBQcm9tbyBuZXRhKSAvIENvaW4gSW48YnI+RGVzdmlhY2nDs24gPSBQTyDiiJIgUE8gTkNDJywnUmVwbGljYSBsYXMgZsOzcm11bGFzIGRlIFJlcG9ydGUgU2VtYW5hIHkgUmVwb3J0ZSBNZXMuIFByb21vIG5ldGEgPSBQcm9tbyBJbiDiiJIgUHJvbW8gT3V0LiddLFsnQXB1ZXN0YSBwcm9tZWRpbycsJ1NVTUEoQ29pbiBJbikgLyBTVU1BKFNwaW4pJywnU2UgY2FsY3VsYSBzb2JyZSB0b3RhbGVzOyBubyBlcyBlbCBwcm9tZWRpbyBkZSBhcHVlc3RhcyBkZSBjYWRhIGZpbGEuJ10sWydSZW5kaW1pZW50byBkaWFyaW8nLCdDb2luIEluIC8gbcOhcXVpbmFzLWTDrWEgcmVnaXN0cmFkYXM8YnI+V2luIC8gbcOhcXVpbmFzLWTDrWEgcmVnaXN0cmFkYXM8YnI+U3BpbnMgLyBtw6FxdWluYXMtZMOtYSByZWdpc3RyYWRhcycsJ0NhZGEgY29tYmluYWNpw7NuIMO6bmljYSBkZSBmZWNoYSB5IG3DoXF1aW5hIGN1ZW50YSB1bmEgdmV6LiBObyBzZSBpbXB1dGFuIGTDrWFzIHNpbiByZWdpc3Ryby4nXSxbJ1JhdGlvcyBjb21wYXJhdGl2b3MnLCdSYXRpbyBDSSA9IENJIGRpYXJpbyBkZWwgZ3J1cG8gLyBDSSBkaWFyaW8gZGUgcmVmZXJlbmNpYTxicj5SYXRpbyBTcGlucyA9IFNwaW5zIGRpYXJpb3MgLyBTcGlucyBkaWFyaW9zIGRlIHJlZmVyZW5jaWE8YnI+UmF0aW8gQXB1ZXN0YSA9IEFwdWVzdGEgcHJvbWVkaW8gLyBBcHVlc3RhIGRlIHJlZmVyZW5jaWEnLCdJbnNwaXJhZG8gZW4gUmF0aW8uIFJlZmVyZW5jaWEgY29uZmlndXJhYmxlOiB0b3RhbCBkZWwgcGVyw61vZG8sIHNhbMOzbiBvIHNlbGVjY2nDs24gZmlsdHJhZGEuIEVuIGdydXBvcyBkZSB2YXJpb3Mgc2Fsb25lcyBzZSB1c2Egc3UgY29uanVudG8uIExhIHNlcmllIHRlbXBvcmFsIGRlIHJhdGlvcyB1c2EgbGEgcmVmZXJlbmNpYSBkZWwgcGVyw61vZG8gY29tcGxldG8uJ10sWydGaWx0cm9zIHkgcGVyc2lzdGVuY2lhJywnQmFuY28gPSBCbG9xdWUgwrcgUG96byA9IElELVByb2c8YnI+U2VjdG9yID0gU2VjY2nDs24gwrcgTWFyY2EgPSBGYWJyaWNhbnRlJywnRXN0YXMgZXF1aXZhbGVuY2lhcyBzb24gc3VwdWVzdG9zIHZpc2libGVzLiBMYXMgdmlzdGFzIHkgbGEgbWF0cml6IHNlIGd1YXJkYW4gZW4gR29vZ2xlLiBBbCBhYnJpciBsYSB3ZWIgZGVzZGUgb3RybyBkaXNwb3NpdGl2byBzZSBjYXJnYSBsYSDDumx0aW1hIG1hdHJpeiBndWFyZGFkYS4gUmVjYXJnYSBsYSBww6FnaW5hIHBhcmEgdmVyIGNhbWJpb3MgaGVjaG9zIGVuIG90cmEgc2VzacOzbi4nXSxbJ0NhbGlkYWQgZGUgZGF0b3MnLCdTaW4gZGVub21pbmFkb3Ig4oaSIOKAlDxicj5PY3VwYWNpw7NuID0gcHJvbWVkaW8gZGUgY2VsZGFzIG51bcOpcmljYXMgZGUgJSBPY3VwJywnU2UgaW5jbHV5ZW4gdG9kb3MgbG9zIHJlZ2lzdHJvcyBkZSBNYXRyaXosIHRhbWJpw6luIGFqdXN0ZXMgeSBjYXRlZ29yw61hcyBzaW4gZGF0by4gTm8gc2UgZWxpbWluYW4gZHVwbGljYWRvcyBhdXRvbcOhdGljYW1lbnRlLiBMb3MgaW1wb3J0ZXMgZXN0w6FuIGVuIENMUCwgbm8gZW4gbWlsbG9uZXMgc2Fsdm8gcXVlIHNlIGluZGlxdWUgTS4nXSxbJ0bDs3JtdWxhcyBkZWwgRXhjZWwnLCdTZSBsZWVuIHJlc3VsdGFkb3MgZ3VhcmRhZG9zLCBubyBzZSBlamVjdXRhbiBmw7NybXVsYXMgYXJiaXRyYXJpYXMnLCdTZSByZWN1cGVyYW4gZGVzY3JpcGNpb25lcyBkZXNkZSBKdWVnb3MgY3VhbmRvIGZhbHRhbiByZXN1bHRhZG9zIGRlIGLDunNxdWVkYS4gU2VtYW5hIHNpZ3VlIFdFRUtOVU0oZmVjaGEsMikuIFNpIGZhbHRhbiByZXN1bHRhZG9zIG51bcOpcmljb3MgbmVjZXNhcmlvcywgbGEgY2FyZ2Egc2UgcmVjaGF6YS4nXV0ubWFwKChbaCxmLHBdKT0+YDxkaXYgY2xhc3M9ImNhcmQiPjxoMj4ke2h9PC9oMj48ZGl2IGNsYXNzPSJmb3JtdWxhIj4ke2Z9PC9kaXY+PHA+JHtwfTwvcD48L2Rpdj5gKS5qb2luKCcnKX08L2Rpdj5gfQpmdW5jdGlvbiBycGMobmFtZSwuLi5hcmdzKXtyZXR1cm4gbmV3IFByb21pc2UoKG9rLG5vKT0+Z29vZ2xlLnNjcmlwdC5ydW4ud2l0aFN1Y2Nlc3NIYW5kbGVyKG9rKS53aXRoRmFpbHVyZUhhbmRsZXIobm8pW25hbWVdKC4uLmFyZ3MpKX0KYXN5bmMgZnVuY3Rpb24gY2FjaGVkKCl7cmV0dXJuIEpTT04ucGFyc2UoYXdhaXQgcnBjKCdnZXRNYXRyaXgnKSl9CmFzeW5jIGZ1bmN0aW9uIHBlcnNpc3Qodil7YXdhaXQgcnBjKCdzYXZlTWF0cml4JyxKU09OLnN0cmluZ2lmeSh2KSl9CmxldCBzYXZlZFZpZXdzPVtdOwphc3luYyBmdW5jdGlvbiBzeW5jVmlld3MoKXthd2FpdCBycGMoJ3NhdmVWaWV3cycsSlNPTi5zdHJpbmdpZnkoc2F2ZWRWaWV3cykpfQokKCcjbmF2JykuaW5uZXJIVE1MPVsnUmVzdW1lbicsJ0NvbXBhcmF0aXZvcycsJ0V2b2x1Y2nDs24nLCdSYXRpb3MnLCdNZXRvZG9sb2fDrWEnXS5tYXAoKHQsaSk9PmA8YnV0dG9uIGNsYXNzPSIke2k/Jyc6J2FjdGl2ZSd9Ij4ke1sn4perJywn4pakJywn4oaXJywn4peOJywn4pOYJ11baV19ICZuYnNwOyAke3R9PC9idXR0b24+YCkuam9pbignJyk7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbmF2IGJ1dHRvbicpLmZvckVhY2goYj0+Yi5vbmNsaWNrPSgpPT57dGFiPWIudGV4dENvbnRlbnQudHJpbSgpLnNwbGl0KC9ccysvKS5hdCgtMSk7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbmF2IGJ1dHRvbicpLmZvckVhY2goZT0+ZS5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLGU9PT1iKSk7aWYodGFiPT09J1JhdGlvcycpJCgnI21ldHJpYycpLnZhbHVlPSdyYXRpbyc7cGFnZT0wO3JlbmRlcigpfSk7JCgnI2dyb3VwJykuaW5uZXJIVE1MPU9iamVjdC5lbnRyaWVzKGRpbXMpLm1hcCgoW2ssdl0pPT5gPG9wdGlvbiB2YWx1ZT0iJHtrfSI+JHt2fTwvb3B0aW9uPmApLmpvaW4oJycpOyQoJyNncm91cCcpLnZhbHVlPScyJzskKCcjbWV0cmljJykuaW5uZXJIVE1MPU9iamVjdC5lbnRyaWVzKG1ldHJpY3MpLm1hcCgoW2ssdl0pPT5gPG9wdGlvbiB2YWx1ZT0iJHtrfSI+JHt2fTwvb3B0aW9uPmApLmpvaW4oJycpO1snZ3JvdXAnLCdtZXRyaWMnLCdncmFpbicsJ3JlZicsJ2Zyb20nLCd0byddLmZvckVhY2goaWQ9PiQoJyMnK2lkKS5vbmNoYW5nZT0oKT0+e3BhZ2U9MDtyZW5kZXIoKX0pOyQoJyNyZXNldCcpLm9uY2xpY2s9KCk9PntxdWVyeT0nJztwYWdlPTA7aW5pdCgpfTsKZnVuY3Rpb24gbG9hZFZpZXdzKCl7bGV0IHY9c2F2ZWRWaWV3czskKCcjdmlld3MnKS5pbm5lckhUTUw9JzxvcHRpb24gdmFsdWU9IiI+TWlzIHZpc3RhcyBndWFyZGFkYXM8L29wdGlvbj4nK3YubWFwKCh4LGkpPT5gPG9wdGlvbiB2YWx1ZT0iJHtpfSI+JHtlc2MoeC5uYW1lKX08L29wdGlvbj5gKS5qb2luKCcnKX0kKCcjc2F2ZScpLm9uY2xpY2s9KCk9PntsZXQgbmFtZT1wcm9tcHQoJ05vbWJyZSBkZSBsYSB2aXN0YScpO2lmKCFuYW1lKXJldHVybjtsZXQgdj1zYXZlZFZpZXdzO3YucHVzaCh7bmFtZSxzZWw6c2VsZWN0ZWQoKSxzZXR0aW5nczpPYmplY3QuZnJvbUVudHJpZXMoWydmcm9tJywndG8nLCdncm91cCcsJ21ldHJpYycsJ2dyYWluJywncmVmJ10ubWFwKGs9PltrLCQoJyMnK2spLnZhbHVlXSkpfSk7c2F2ZWRWaWV3cz12O3N5bmNWaWV3cygpLnRoZW4obG9hZFZpZXdzKS5jYXRjaChlPT5hbGVydCgnTm8gc2UgZ3VhcmTDsyBsYSB2aXN0YTogJytlLm1lc3NhZ2UpKX07JCgnI3ZpZXdzJykub25jaGFuZ2U9KCk9PntpZigkKCcjdmlld3MnKS52YWx1ZT09PScnKXJldHVybjtsZXQgdj1zYXZlZFZpZXdzWyQoJyN2aWV3cycpLnZhbHVlXTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZmlsdGVycyBvcHRpb24nKS5mb3JFYWNoKG89Pm8uc2VsZWN0ZWQ9ZmFsc2UpO3Yuc2VsLmZvckVhY2goKFtrLHZhbHNdKT0+Wy4uLiQoJyNmJytrKS5vcHRpb25zXS5mb3JFYWNoKG89Pm8uc2VsZWN0ZWQ9dmFscy5pbmNsdWRlcyhvLnZhbHVlKSkpO09iamVjdC5lbnRyaWVzKHYuc2V0dGluZ3MpLmZvckVhY2goKFtrLHZdKT0+JCgnIycraykudmFsdWU9dik7cGFnZT0wO3JlbmRlcigpfTskKCcjZXhwb3J0Jykub25jbGljaz0oKT0+e2xldCBrZXlzPVsnd2luJywnY29pbicsJ3dkJywnY2QnLCdwbycsJ3BvbicsJ2JldCcsJ3NwaW4nLCdyYXRpbycsJ3JzJywncmInXSxjc3Y9J1x1ZmVmZicrW1tkaW1zWyQoJyNncm91cCcpLnZhbHVlXSwuLi5rZXlzLm1hcChrPT5tZXRyaWNzW2tdKV0sLi4udmlzaWJsZVJvd3MoKS5tYXAocj0+W3IubmFtZSwuLi5rZXlzLm1hcChrPT5yW2tdPz8nJyldKV0ubWFwKHJvdz0+cm93Lm1hcCh2PT4nIicrU3RyaW5nKHYpLnJlcGxhY2UoLyIvZywnIiInKSsnIicpLmpvaW4oJzsnKSkuam9pbignXHJcbicpO2xldCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTthLmhyZWY9VVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbY3N2XSx7dHlwZTondGV4dC9jc3Y7Y2hhcnNldD11dGYtOCd9KSk7YS5kb3dubG9hZD0nY29uc3VsdGEtbWFxdWluYXMuY3N2JzthLmNsaWNrKCk7c2V0VGltZW91dCgoKT0+VVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpLDEwMDApfTsKLy8gTWluaW1hbCBaSVAvWE1MIHJlYWRlcjogWExTWCBpcyBhIFpJUCBvZiBYTUwgZG9jdW1lbnRzLiBObyBleHRlcm5hbCBzY3JpcHRzLgphc3luYyBmdW5jdGlvbiByZWFkWGxzeChmaWxlKXtsZXQgYnVmPWF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKTtpZihidWYuYnl0ZUxlbmd0aDwyMil0aHJvdyBFcnJvcignQXJjaGl2byBYTFNYIG5vIHbDoWxpZG8nKTtsZXQgdmlldz1uZXcgRGF0YVZpZXcoYnVmKSx1PW5ldyBVaW50OEFycmF5KGJ1ZiksZW5kPXUubGVuZ3RoLTIyO3doaWxlKGVuZD49TWF0aC5tYXgoMCx1Lmxlbmd0aC02NTU1NykmJnZpZXcuZ2V0VWludDMyKGVuZCx0cnVlKSE9PTB4MDYwNTRiNTApZW5kLS07aWYoZW5kPE1hdGgubWF4KDAsdS5sZW5ndGgtNjU1NTcpKXRocm93IEVycm9yKCdBcmNoaXZvIFhMU1ggbm8gdsOhbGlkbycpO2xldCBwb3M9dmlldy5nZXRVaW50MzIoZW5kKzE2LHRydWUpLGNvdW50PXZpZXcuZ2V0VWludDE2KGVuZCsxMCx0cnVlKSxlbnRyaWVzPXt9O2ZvcihsZXQgaT0wO2k8Y291bnQ7aSsrKXtpZih2aWV3LmdldFVpbnQzMihwb3MsdHJ1ZSkhPT0weDAyMDE0YjUwKXRocm93IEVycm9yKCdEaXJlY3RvcmlvIFpJUCBpbnbDoWxpZG8nKTtsZXQgbWV0aG9kPXZpZXcuZ2V0VWludDE2KHBvcysxMCx0cnVlKSxzaXplPXZpZXcuZ2V0VWludDMyKHBvcysyMCx0cnVlKSxubD12aWV3LmdldFVpbnQxNihwb3MrMjgsdHJ1ZSksZWw9dmlldy5nZXRVaW50MTYocG9zKzMwLHRydWUpLGNsPXZpZXcuZ2V0VWludDE2KHBvcyszMix0cnVlKSxvZmZzZXQ9dmlldy5nZXRVaW50MzIocG9zKzQyLHRydWUpLG5hbWU9bmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHUuc2xpY2UocG9zKzQ2LHBvcys0NitubCkpO2VudHJpZXNbbmFtZV09e21ldGhvZCxzaXplLG9mZnNldH07cG9zKz00NitubCtlbCtjbH1hc3luYyBmdW5jdGlvbiB4bWwobmFtZSl7bGV0IGU9ZW50cmllc1tuYW1lXTtpZighZSlyZXR1cm4gbnVsbDtsZXQgb2ZmPWUub2Zmc2V0KzMwK3ZpZXcuZ2V0VWludDE2KGUub2Zmc2V0KzI2LHRydWUpK3ZpZXcuZ2V0VWludDE2KGUub2Zmc2V0KzI4LHRydWUpLGJ5dGVzPXUuc2xpY2Uob2ZmLG9mZitlLnNpemUpO2xldCB0ZXh0PWUubWV0aG9kPT09MD9uZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoYnl0ZXMpOmUubWV0aG9kPT09OD9hd2FpdCBuZXcgUmVzcG9uc2UobmV3IEJsb2IoW2J5dGVzXSkuc3RyZWFtKCkucGlwZVRocm91Z2gobmV3IERlY29tcHJlc3Npb25TdHJlYW0oJ2RlZmxhdGUtcmF3JykpKS50ZXh0KCk6bnVsbDtpZih0ZXh0PT1udWxsKXRocm93IEVycm9yKCdDb21wcmVzacOzbiBubyBjb21wYXRpYmxlJyk7cmV0dXJuIG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcodGV4dCwnYXBwbGljYXRpb24veG1sJyl9CmxldCBzaGFyZWQ9YXdhaXQgeG1sKCd4bC9zaGFyZWRTdHJpbmdzLnhtbCcpLHN0cmluZ3M9c2hhcmVkP1suLi5zaGFyZWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NpJyldLm1hcChuPT5bLi4ubi5nZXRFbGVtZW50c0J5VGFnTmFtZSgndCcpXS5tYXAodD0+dC50ZXh0Q29udGVudCkuam9pbignJykpOltdO3NoYXJlZD1udWxsO2xldCB3b3JrYm9vaz1hd2FpdCB4bWwoJ3hsL3dvcmtib29rLnhtbCcpLHJlbHM9YXdhaXQgeG1sKCd4bC9fcmVscy93b3JrYm9vay54bWwucmVscycpLHRhcmdldHM9e307Wy4uLnJlbHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ1JlbGF0aW9uc2hpcCcpXS5mb3JFYWNoKHI9PnRhcmdldHNbci5nZXRBdHRyaWJ1dGUoJ0lkJyldPXIuZ2V0QXR0cmlidXRlKCdUYXJnZXQnKSk7YXN5bmMgZnVuY3Rpb24gc2hlZXQobmFtZSl7bGV0IHM9Wy4uLndvcmtib29rLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzaGVldCcpXS5maW5kKHM9PnMuZ2V0QXR0cmlidXRlKCduYW1lJykudHJpbSgpLnRvTG93ZXJDYXNlKCk9PT1uYW1lLnRvTG93ZXJDYXNlKCkpO2lmKCFzKXJldHVybiBudWxsO2xldCBwYXRoPXRhcmdldHNbcy5nZXRBdHRyaWJ1dGUoJ3I6aWQnKV07cGF0aD1wYXRoLnN0YXJ0c1dpdGgoJy8nKT9wYXRoLnNsaWNlKDEpOid4bC8nK3BhdGg7bGV0IGRvYz1hd2FpdCB4bWwocGF0aCk7cmV0dXJuIFsuLi5kb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3JvdycpXS5tYXAocm93PT57bGV0IGE9W107Zm9yKGxldCBjIG9mIHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYycpKXtsZXQgY29sPWMuZ2V0QXR0cmlidXRlKCdyJykubWF0Y2goL1tBLVpdKy8pWzBdLGlkeD0wO2ZvcihsZXQgY2ggb2YgY29sKWlkeD1pZHgqMjYrY2guY2hhckNvZGVBdCgwKS02NDtsZXQgdj1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2JylbMF0/LnRleHRDb250ZW50LHQ9Yy5nZXRBdHRyaWJ1dGUoJ3QnKTthW2lkeC0xXT10PT09J3MnP3N0cmluZ3NbK3ZdOnQ9PT0naW5saW5lU3RyJz9bLi4uYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgndCcpXS5tYXAodD0+dC50ZXh0Q29udGVudCkuam9pbignJyk6dD09PSdlJz92OnY9PW51bGw/bnVsbDp0PT09J3N0cic/djpOdW1iZXIodil9cmV0dXJuIGF9KX1yZXR1cm4gbm9ybWFsaXplV29ya2Jvb2soYXdhaXQgc2hlZXQoJ01hdHJpeicpLGF3YWl0IHNoZWV0KCdKdWVnb3MnKSxmaWxlLm5hbWUsWycxJywndHJ1ZSddLmluY2x1ZGVzKHdvcmtib29rLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd3b3JrYm9va1ByJylbMF0/LmdldEF0dHJpYnV0ZSgnZGF0ZTE5MDQnKSksYXdhaXQgc2hlZXQoJ1VUSUxJREFEIFJFU1VNRU4nKSk7fQokKCcjZmlsZScpLm9uY2hhbmdlPWFzeW5jIGU9PntsZXQgZj1lLnRhcmdldC5maWxlc1swXTtpZighZilyZXR1cm47JCgnI3N0YXR1cycpLnRleHRDb250ZW50PSdMZXllbmRvICcrZi5uYW1lKyfigKYnO3RyeXtsZXQgbmV4dD1hd2FpdCByZWFkWGxzeChmKTthd2FpdCBwZXJzaXN0KG5leHQpO2RhdGE9bmV4dDtwYWdlPTA7cXVlcnk9Jyc7aW5pdCgpOyQoJyNzdGF0dXMnKS50ZXh0Q29udGVudCs9JyDCtyBHdWFyZGFkYSBlbiBTdXBhYmFzZSDCtyBEaXNwb25pYmxlIGVuIHR1cyBkaXNwb3NpdGl2b3MnfWNhdGNoKGVycil7JCgnI3N0YXR1cycpLnRleHRDb250ZW50PSdObyBzZSBjYW1iacOzIGxhIG1hdHJpejogJytlcnIubWVzc2FnZX1maW5hbGx5e2UudGFyZ2V0LnZhbHVlPScnfX07Ci8vIFYyOiBpbmRlcGVuZGVudCBhbmFseXRpY2FsIHZpZXdzIGFuZCBjb21wYXJpc29uIHBlcmlvZHMuCmNvbnN0IHZpZXdTdGF0ZT17CiAgQTp7bmFtZTonU2VsZWNjacOzbiBBJyxmcm9tOicnLHRvOicnLGZpbHRlcnM6e319LAogIEI6e25hbWU6J1NlbGVjY2nDs24gQicsZnJvbTonJyx0bzonJyxmaWx0ZXJzOnt9fSwKICBldm9sdXRpb246e2ZpbHRlcnM6e30sbWV0cmljOid3aW4nLGdyYWluOidtb250aCcsc2VyaWVzOid0b3RhbCd9LAogIHJhdGlvczp7ZmlsdGVyczp7fSxncm91cDonMScsbWV0cmljOidyYXRpbycscmVmZXJlbmNlOidhbGwnfQp9OwpsZXQgZXhwb3J0Um93cz1bXTsKY29uc3QgaXNFeHBpcmVkPXY9PlN0cmluZyh2Pz8nJykudHJpbSgpLnRvTG9jYWxlVXBwZXJDYXNlKCdlcycpPT09J0VYUElSQURPUyc7CmxldCBvcHRpb25zRm9yPWs9PlsuLi5uZXcgU2V0KGRhdGEucm93cy5tYXAocj0+U3RyaW5nKHJba10/PydTaW4gZGF0bycpKSldLmZpbHRlcih2PT4haXNFeHBpcmVkKHYpKS5zb3J0KChhLGIpPT5hLmxvY2FsZUNvbXBhcmUoYix1bmRlZmluZWQse251bWVyaWM6dHJ1ZX0pKTsKY29uc3QgZGF0ZVJhbmdlPSgpPT57Y29uc3QgZGF0ZXM9ZGF0YS5yb3dzLm1hcChyPT5yWzBdKS5zb3J0KCk7cmV0dXJuW2RhdGVzWzBdLGRhdGVzLmF0KC0xKV19OwpmdW5jdGlvbiBzbGljZVJvd3MoZmlsdGVycz17fSxmcm9tPSQoJyNmcm9tJykudmFsdWUsdG89JCgnI3RvJykudmFsdWUpewogcmV0dXJuIGRhdGEucm93cy5maWx0ZXIocj0+KCFmcm9tfHxyWzBdPj1mcm9tKSYmKCF0b3x8clswXTw9dG8pJiZPYmplY3QuZW50cmllcyhmaWx0ZXJzKS5ldmVyeSgoW2ssdmFsc10pPT4hdmFscy5sZW5ndGh8fHZhbHMuaW5jbHVkZXMoU3RyaW5nKHJba10/PydTaW4gZGF0bycpKSkpOwp9CmZ1bmN0aW9uIGZpbHRlckZpZWxkcyhzdGF0ZSxwcmVmaXgsa2V5cz1PYmplY3Qua2V5cyhkaW1zKSl7CiByZXR1cm4ga2V5cy5tYXAoaz0+YDxsYWJlbD4ke2RpbXNba119PHNlbGVjdCBtdWx0aXBsZSBkYXRhLWZpbHRlcj0iJHtrfSIgZGF0YS1vd25lcj0iJHtwcmVmaXh9Ij4ke29wdGlvbnNGb3IoaykubWFwKHY9PmA8b3B0aW9uIHZhbHVlPSIke2VzYyh2KX0iICR7KHN0YXRlLmZpbHRlcnNba118fFtdKS5pbmNsdWRlcyh2KT8nc2VsZWN0ZWQnOicnfT4ke2VzYyh2KX08L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48L2xhYmVsPmApLmpvaW4oJycpOwp9CmZ1bmN0aW9uIHNlbGVjdG9yKGxhYmVsLGlkLHZhbHVlLG9wdGlvbnMpe3JldHVybiBgPGxhYmVsPiR7bGFiZWx9PHNlbGVjdCBpZD0iJHtpZH0iPiR7T2JqZWN0LmVudHJpZXMob3B0aW9ucykubWFwKChbayx2XSk9PmA8b3B0aW9uIHZhbHVlPSIke2t9IiAke1N0cmluZyh2YWx1ZSk9PT1TdHJpbmcoayk/J3NlbGVjdGVkJzonJ30+JHt2fTwvb3B0aW9uPmApLmpvaW4oJycpfTwvc2VsZWN0PjwvbGFiZWw+YH0KZnVuY3Rpb24gYmluZEZpbHRlcnMoKXtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1maWx0ZXJdJykuZm9yRWFjaChlbD0+ZWwub25jaGFuZ2U9KCk9Pnt2aWV3U3RhdGVbZWwuZGF0YXNldC5vd25lcl0uZmlsdGVyc1tlbC5kYXRhc2V0LmZpbHRlcl09Wy4uLmVsLnNlbGVjdGVkT3B0aW9uc10ubWFwKG89Pm8udmFsdWUpO3JlbmRlcigpfSl9CmZ1bmN0aW9uIGJhbm5lcih0aXRsZSxkZXNjcmlwdGlvbil7cmV0dXJuIGA8ZGl2IGNsYXNzPSJ2aWV3YmFubmVyIj48aDI+JHt0aXRsZX08L2gyPjxwPiR7ZGVzY3JpcHRpb259PC9wPjwvZGl2PmB9CmZ1bmN0aW9uIG1hY2hpbmVDb3VudChyb3dzKXtyZXR1cm4gbmV3IFNldChyb3dzLmZpbHRlcihyPT5yWzFdIT1udWxsJiYhaXNFeHBpcmVkKHJbMV0pKS5tYXAocj0+clsxXSkpLnNpemV9CmZ1bmN0aW9uIHN0YXRDYXJkcyhpdGVtcyl7cmV0dXJuIGA8ZGl2IGNsYXNzPSJrcGlzIj4ke2l0ZW1zLm1hcCgoW2xhYmVsLHZhbHVlLG5vdGVdKT0+YDxkaXYgY2xhc3M9ImNhcmQga3BpIj48c21hbGw+JHtsYWJlbH08L3NtYWxsPjxzdHJvbmc+JHt2YWx1ZX08L3N0cm9uZz48c3Bhbj4ke25vdGV9PC9zcGFuPjwvZGl2PmApLmpvaW4oJycpfTwvZGl2PmB9CmZ1bmN0aW9uIGJhcnNWMihpdGVtcyxrZXksY29sb3I9J3ZhcigtLXRlYWwpJyl7CiBsZXQgbWF4PU1hdGgubWF4KDEsLi4uaXRlbXMubWFwKHg9Pk1hdGguYWJzKHhba2V5XXx8MCkpKTsKIHJldHVybiBpdGVtcy5tYXAoeD0+YDxkaXYgY2xhc3M9ImJhcnJvdyI+PHNwYW4gY2xhc3M9ImJhcmxhYmVsIiB0aXRsZT0iJHtlc2MoeC5uYW1lKX0iPiR7ZXNjKHgubmFtZSl9PC9zcGFuPjxkaXYgY2xhc3M9InRyYWNrIj48ZGl2IGNsYXNzPSJiYXIiIHN0eWxlPSJiYWNrZ3JvdW5kOiR7eFtrZXldPDA/JyNiODZkNjInOmNvbG9yfTt3aWR0aDoke01hdGguYWJzKHhba2V5XXx8MCkvbWF4KjEwMH0lIj48L2Rpdj48L2Rpdj48Yj4ke2NvbXBhY3QoeFtrZXldLGtleSl9PC9iPjwvZGl2PmApLmpvaW4oJycpOwp9CmZ1bmN0aW9uIGNoYXJ0VjIoc2VyaWVzLGtleSl7CiBjb25zdCBsYWJlbHM9Wy4uLm5ldyBTZXQoc2VyaWVzLmZsYXRNYXAocz0+cy5wb2ludHMubWFwKHA9PnAubmFtZSkpKV0uc29ydCgpOwogaWYoIWxhYmVscy5sZW5ndGgpcmV0dXJuICc8ZGl2IGNsYXNzPSJlbXB0eSI+U2luIGRhdG9zIHBhcmEgZXN0ZSBwZXLDrW9kby48L2Rpdj4nOwogY29uc3QgdmFsdWVzPXNlcmllcy5mbGF0TWFwKHM9PnMucG9pbnRzLm1hcChwPT5wW2tleV0pKS5maWx0ZXIodj0+diE9bnVsbCYmTnVtYmVyLmlzRmluaXRlKHYpKTsKIGNvbnN0IGxvPU1hdGgubWluKDAsLi4udmFsdWVzKSxoaT1NYXRoLm1heCgxLC4uLnZhbHVlcyksc3Bhbj1oaS1sb3x8MTsKIGNvbnN0IGNvbG9ycz1bJyMxMjhmOTEnLCcjMTgzYjYwJywnIzVkODNhMicsJyM3NWE4OTgnLCcjOTQ3ZDU1JywnIzU0NmM4NycsJyM5NDdjOWUnLCcjYjA2YTYzJ107CiBjb25zdCB4PWk9PjM1K2kvTWF0aC5tYXgoMSxsYWJlbHMubGVuZ3RoLTEpKjUzMCx5PXY9PjE5MC0odi1sbykvc3BhbioxNTA7CiByZXR1cm4gYDxzdmcgdmlld0JveD0iMCAwIDYwMCAyMzUiIGFyaWEtbGFiZWw9IlNlcmllIHRlbXBvcmFsIiByb2xlPSJpbWciPjxsaW5lIHgxPSIzNSIgeTE9IjE5MCIgeDI9IjU2NSIgeTI9IjE5MCIgc3Ryb2tlPSIjZDllM2ViIi8+PHRleHQgeD0iMzUiIHk9IjIwIiBmb250LXNpemU9IjEwIiBmaWxsPSIjNzE4Njk0Ij4ke2NvbXBhY3QoaGksa2V5KX08L3RleHQ+JHtzZXJpZXMubWFwKChzLGkpPT57bGV0IHBvaW50cz1zLnBvaW50cy5maWx0ZXIocD0+cFtrZXldIT1udWxsKTtyZXR1cm4gYDxwb2x5bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiR7Y29sb3JzW2klOF19IiBzdHJva2Utd2lkdGg9IjIuNSIgcG9pbnRzPSIke3BvaW50cy5tYXAocD0+YCR7eChsYWJlbHMuaW5kZXhPZihwLm5hbWUpKX0sJHt5KHBba2V5XSl9YCkuam9pbignICcpfSIvPiR7cG9pbnRzLm1hcChwPT5gPGNpcmNsZSBjeD0iJHt4KGxhYmVscy5pbmRleE9mKHAubmFtZSkpfSIgY3k9IiR7eShwW2tleV0pfSIgcj0iMyIgZmlsbD0iJHtjb2xvcnNbaSU4XX0iPjx0aXRsZT4ke2VzYyhzLm5hbWUpfSDCtyAke2VzYyhwLm5hbWUpfTogJHtmbXQocFtrZXldLGtleSl9PC90aXRsZT48L2NpcmNsZT5gKS5qb2luKCcnKX1gfSkuam9pbignJyl9PHRleHQgeD0iMzUiIHk9IjIyMCIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzcxODY5NCI+JHtlc2MobGFiZWxzWzBdKX08L3RleHQ+PHRleHQgeD0iNTY1IiB5PSIyMjAiIHRleHQtYW5jaG9yPSJlbmQiIGZvbnQtc2l6ZT0iMTEiIGZpbGw9IiM3MTg2OTQiPiR7ZXNjKGxhYmVscy5hdCgtMSkpfTwvdGV4dD48L3N2Zz48ZGl2IGNsYXNzPSJsZWdlbmQiPiR7c2VyaWVzLm1hcCgocyxpKT0+YDxzcGFuPjxpIHN0eWxlPSJiYWNrZ3JvdW5kOiR7Y29sb3JzW2klOF19Ij48L2k+JHtlc2Mocy5uYW1lKX08L3NwYW4+YCkuam9pbignJyl9PC9kaXY+YDsKfQpmdW5jdGlvbiBzdW1tYXJ5VmlldygpewogY29uc3Qgcm93cz1zbGljZVJvd3MoKSxhPWFnZyhyb3dzKTsKIGNvbnN0IGJyYW5kcz1ncm91cHMocm93cyxyPT5TdHJpbmcoclsyXT8/J1NpbiBkYXRvJykpLnNvcnQoKHgseSk9Pnkud2luLXgud2luKTsKIGNvbnN0IHNlY3RvcnM9Z3JvdXBzKHJvd3Mscj0+U3RyaW5nKHJbNV0/PydTaW4gZGF0bycpKS5zb3J0KCh4LHkpPT55LmNvaW4teC5jb2luKTsKIGNvbnN0IG1vbnRobHk9Z3JvdXBzKHJvd3Mscj0+clswXS5zbGljZSgwLDcpKS5zb3J0KCh4LHkpPT54Lm5hbWUubG9jYWxlQ29tcGFyZSh5Lm5hbWUpKTsKIGV4cG9ydFJvd3M9W1snTWFyY2EnLCdXaW4gQ0xQJywnQ29pbiBJbiBDTFAnLCdNw6FxdWluYXMnXSwuLi5icmFuZHMubWFwKHg9Plt4Lm5hbWUseC53aW4seC5jb2luLG1hY2hpbmVDb3VudCh4LnJvd3MpXSldOwogJCgnI2NvbnRlbnQnKS5pbm5lckhUTUw9YmFubmVyKCdWaXNpw7NuIGdlbmVyYWwgZGVsIHBhcnF1ZScsJ1RvZG8gZWwgcGFycXVlIGRlbnRybyBkZSBsYXMgZmVjaGFzIHNlbGVjY2lvbmFkYXMuIEVzdGEgdmlzdGEgbm8gYXBsaWNhIGZpbHRyb3MgZGUgbcOhcXVpbmFzLCBiYW5jb3Mgbmkgc2VjdG9yZXMuJykrc3RhdENhcmRzKFsKIFsnV0lOIE9QRVJBQ0lPTkFMJyxjb21wYWN0KGEud2luLCd3aW4nKSwnQ0xQIMK3IFRvdGFsIGRlbCBwYXJxdWUnXSxbJ0NPSU4gSU4nLGNvbXBhY3QoYS5jb2luLCdjb2luJyksJ0NMUCDCtyBUb3RhbCBhcG9zdGFkbyddLFsnTcOBUVVJTkFTJyxmbXQobWFjaGluZUNvdW50KHJvd3MpKSwnSWRlbnRpZmljYWRvcmVzIMO6bmljb3MgZW4gZWwgcGVyw61vZG8nXSxbJ1BBWU9VVCcsZm10KGEucG8sJ3BvJyksJ0NhbGN1bGFkbyBzb2JyZSBsb3MgdG90YWxlcyddCiBdKStgPGRpdiBjbGFzcz0iY2hhcnRzIj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+RXZvbHVjacOzbiBtZW5zdWFsIGRlbCBXaW48L2gyPjxkaXYgY2xhc3M9InN1YnRpdGxlIj5QYW5vcmFtYSBnZW5lcmFsIMK3IENMUDwvZGl2PiR7Y2hhcnRWMihbe25hbWU6J1RvZG8gZWwgcGFycXVlJyxwb2ludHM6bW9udGhseX1dLCd3aW4nKX08L2Rpdj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+V2luIHBvciBtYXJjYTwvaDI+PGRpdiBjbGFzcz0ic3VidGl0bGUiPlRvcCA4IMK3IENMUDwvZGl2PiR7YmFyc1YyKGJyYW5kcy5zbGljZSgwLDgpLCd3aW4nKX08L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjaGFydHMiPjxkaXYgY2xhc3M9ImNhcmQiPjxoMj5BY3RpdmlkYWQgcG9yIHNlY3RvcjwvaDI+PGRpdiBjbGFzcz0ic3VidGl0bGUiPkNvaW4gSW4gwrcgVG9wIDg8L2Rpdj4ke2JhcnNWMihzZWN0b3JzLnNsaWNlKDAsOCksJ2NvaW4nLCd2YXIoLS1uYXZ5KScpfTwvZGl2PjxkaXYgY2xhc3M9ImNhcmQiPjxoMj5JbmRpY2Fkb3JlcyBkZWwgcGVyw61vZG88L2gyPjxkaXYgY2xhc3M9InRhYmxld3JhcCI+PHRhYmxlPjx0Ym9keT4ke1tbJ1dpbiBwb3IgbcOhcXVpbmEtZMOtYScsZm10KGEud2QpXSxbJ0NvaW4gSW4gcG9yIG3DoXF1aW5hLWTDrWEnLGZtdChhLmNkKV0sWydBcHVlc3RhIHByb21lZGlvJyxmbXQoYS5iZXQpXSxbJ1NwaW5zJyxmbXQoYS5zcGluKV0sWydNw6FxdWluYXMtZMOtYSByZWdpc3RyYWRhcycsZm10KGEuZGF5cyldLFsnUHJvbW8gbmV0YScsZm10KGEucHJvbW8pXSxbJ1ByZW1pb3MnLGZtdChhLnByaXplKV1dLm1hcCgoW2ssdl0pPT5gPHRyPjx0ZD4ke2t9PC90ZD48dGQ+JHt2fTwvdGQ+PC90cj5gKS5qb2luKCcnKX08L3Rib2R5PjwvdGFibGU+PC9kaXY+PC9kaXY+PC9kaXY+YDsKfQpmdW5jdGlvbiBjb21wYXJlUGFuZWwoa2V5KXtjb25zdCBzPXZpZXdTdGF0ZVtrZXldO3JldHVybiBgPHNlY3Rpb24gY2xhc3M9ImNhcmQgY29tcGFyZXBhbmVsIHNpZGUke2tleX0iPjxkaXYgY2xhc3M9InNpZGVoZWFkaW5nIj48Yj4ke2tleX08L2I+PGlucHV0IGlkPSJuYW1lJHtrZXl9IiBhcmlhLWxhYmVsPSJOb21icmUgZGUgc2VsZWNjacOzbiAke2tleX0iIHZhbHVlPSIke2VzYyhzLm5hbWUpfSI+PC9kaXY+PGRpdiBjbGFzcz0iY29tcGFyZURhdGVzIj48bGFiZWw+RGVzZGU8aW5wdXQgdHlwZT0iZGF0ZSIgaWQ9ImZyb20ke2tleX0iIHZhbHVlPSIke3MuZnJvbX0iPjwvbGFiZWw+PGxhYmVsPkhhc3RhPGlucHV0IHR5cGU9ImRhdGUiIGlkPSJ0byR7a2V5fSIgdmFsdWU9IiR7cy50b30iPjwvbGFiZWw+PC9kaXY+PGRpdiBjbGFzcz0iZmlsdGVyZ3JpZCI+JHtmaWx0ZXJGaWVsZHMocyxrZXkpfTwvZGl2PjxidXR0b24gaWQ9ImNsZWFyJHtrZXl9IiBjbGFzcz0ic3VidGxlIj5MaW1waWFyIGZpbHRyb3MgJHtrZXl9PC9idXR0b24+PC9zZWN0aW9uPmB9CmZ1bmN0aW9uIGRlbHRhKGEsYixrZXkpe2lmKGE9PW51bGx8fGI9PW51bGwpcmV0dXJuICfigJQnO2xldCBkPWItYTtpZihbJ3BvJywncG9uJywnb2NjJywnZGV2J10uaW5jbHVkZXMoa2V5KSlyZXR1cm4gKGQqMTAwKS50b0xvY2FsZVN0cmluZygnZXMtQ0wnLHttYXhpbXVtRnJhY3Rpb25EaWdpdHM6Mn0pKycgcHAnO3JldHVybiAoZD4wPycrJzonJykrZm10KGQsa2V5KX0KZnVuY3Rpb24gY29tcGFyZVZpZXcoKXsKIGxldCBbbWluLG1heF09ZGF0ZVJhbmdlKCk7Zm9yKGxldCBrZXkgb2YgWydBJywnQiddKXt2aWV3U3RhdGVba2V5XS5mcm9tfHw9bWluO3ZpZXdTdGF0ZVtrZXldLnRvfHw9bWF4fQogY29uc3QgQT12aWV3U3RhdGUuQSxCPXZpZXdTdGF0ZS5CLHJhPXNsaWNlUm93cyhBLmZpbHRlcnMsQS5mcm9tLEEudG8pLHJiPXNsaWNlUm93cyhCLmZpbHRlcnMsQi5mcm9tLEIudG8pLGE9YWdnKHJhKSxiPWFnZyhyYik7CiBjb25zdCBrZXlzPVsnd2luJywnY29pbicsJ3dkJywnY2QnLCdzcGluJywnc2QnLCdiZXQnLCdwbycsJ3BvbicsJ3Byb21vJywncHJpemUnLCdvY2MnXTsKIGNvbnN0IGJSZWNvcmRzPW5ldyBTZXQocmIpO2NvbnN0IG92ZXJsYXA9cmEuZmlsdGVyKHI9PmJSZWNvcmRzLmhhcyhyKSkubGVuZ3RoOwogZXhwb3J0Um93cz1bWydJbmRpY2Fkb3InLEEubmFtZSxCLm5hbWUsJ0RpZmVyZW5jaWEgQiAtIEEnLCdWYXJpYWNpw7NuICUnXSwuLi5rZXlzLm1hcChrPT5bbWV0cmljc1trXSxhW2tdPz8nJyxiW2tdPz8nJyxhW2tdPT1udWxsfHxiW2tdPT1udWxsPycnOmJba10tYVtrXSxhW2tdPygoYltrXS1hW2tdKS9NYXRoLmFicyhhW2tdKSkqMTAwOicnXSldOwogJCgnI2NvbnRlbnQnKS5pbm5lckhUTUw9YmFubmVyKCdEb3Mgc2VsZWNjaW9uZXMsIGRvcyBwZXLDrW9kb3MnLCdDb21wYXJhIGVsIG1pc21vIGJhbmNvIGFudGVzIHkgZGVzcHXDqXMsIGRvcyB1YmljYWNpb25lcywgbcOhcXVpbmFzIG8gZ3J1cG9zLiBBIHkgQiB0aWVuZW4gZmVjaGFzIHkgZmlsdHJvcyBpbmRlcGVuZGllbnRlcy4nKStgPGRpdiBjbGFzcz0iY29tcGFyZXRvb2xzIj48YnV0dG9uIGlkPSJjb3B5QUIiPkNvcGlhciBmaWx0cm9zIHkgZmVjaGFzIEEg4oaSIEI8L2J1dHRvbj48YnV0dG9uIGlkPSJzd2FwQUIiPkludGVyY2FtYmlhciBBIOKGlCBCPC9idXR0b24+PC9kaXY+PGRpdiBjbGFzcz0iY29tcGFyZWdyaWQiPiR7Y29tcGFyZVBhbmVsKCdBJyl9JHtjb21wYXJlUGFuZWwoJ0InKX08L2Rpdj48ZGl2IGNsYXNzPSJjb21wYXJpc29uTm90ZSI+QTogJHtmbXQocmEubGVuZ3RoKX0gcmVnaXN0cm9zIMK3ICR7bWFjaGluZUNvdW50KHJhKX0gbcOhcXVpbmFzIMK3ICR7Zm10KGEuZGF5cyl9IG3DoXF1aW5hcy1kw61hLiAmbmJzcDsgQjogJHtmbXQocmIubGVuZ3RoKX0gcmVnaXN0cm9zIMK3ICR7bWFjaGluZUNvdW50KHJiKX0gbcOhcXVpbmFzIMK3ICR7Zm10KGIuZGF5cyl9IG3DoXF1aW5hcy1kw61hLiR7b3ZlcmxhcD9gIEhheSAke2ZtdChvdmVybGFwKX0gcmVnaXN0cm9zIGNvbXBhcnRpZG9zIGVudHJlIGxhcyBzZWxlY2Npb25lcy5gOicnfSBMYXMgZGlmZXJlbmNpYXMgc2UgZXhwcmVzYW4gY29tbyBCIOKIkiBBLiBQYXJhIHBlcsOtb2RvcyBkZSBkaXN0aW50YSBkdXJhY2nDs24sIGNvbXBhcmEgbG9zIGluZGljYWRvcmVzIGRpYXJpb3MuPC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPiR7ZXNjKEEubmFtZSl9IGZyZW50ZSBhICR7ZXNjKEIubmFtZSl9PC9oMj48ZGl2IGNsYXNzPSJ0YWJsZXdyYXAiPjx0YWJsZT48dGhlYWQ+PHRyPjx0aD5JbmRpY2Fkb3I8L3RoPjx0aCBjbGFzcz0iY29sQSI+JHtlc2MoQS5uYW1lKX08YnI+JHtlc2Moc2VsZWN0ZWREYXRlVGV4dFY4KCdBJykpfTwvdGg+PHRoIGNsYXNzPSJjb2xCIj4ke2VzYyhCLm5hbWUpfTxicj4ke2VzYyhzZWxlY3RlZERhdGVUZXh0VjgoJ0InKSl9PC90aD48dGg+RGlmZXJlbmNpYSBCIOKIkiBBPC90aD48dGg+VmFyaWFjacOzbiByZWxhdGl2YTwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT4ke2tleXMubWFwKGs9PmA8dHI+PHRkPiR7bWV0cmljc1trXX08L3RkPjx0ZD4ke2ZtdChhW2tdLGspfTwvdGQ+PHRkPiR7Zm10KGJba10sayl9PC90ZD48dGQ+JHtkZWx0YShhW2tdLGJba10sayl9PC90ZD48dGQ+JHthW2tdPT1udWxsfHxiW2tdPT1udWxsfHxhW2tdPT09MD8n4oCUJzooKGJba10tYVtrXSkvTWF0aC5hYnMoYVtrXSkqMTAwKS50b0xvY2FsZVN0cmluZygnZXMtQ0wnLHttYXhpbXVtRnJhY3Rpb25EaWdpdHM6MX0pKyclJ308L3RkPjwvdHI+YCkuam9pbignJyl9PC90Ym9keT48L3RhYmxlPjwvZGl2PjwvZGl2PmA7CiBiaW5kRmlsdGVycygpO2ZvcihsZXQga2V5IG9mIFsnQScsJ0InXSl7CiAgZm9yKGxldCBmaWVsZCBvZiBbJ2Zyb20nLCd0bycsJ25hbWUnXSkkKCcjJytmaWVsZCtrZXkpLm9uY2hhbmdlPWU9Pnt2aWV3U3RhdGVba2V5XVtmaWVsZF09ZS50YXJnZXQudmFsdWU7cmVuZGVyKCl9OwogICQoJyNjbGVhcicra2V5KS5vbmNsaWNrPSgpPT57dmlld1N0YXRlW2tleV0uZmlsdGVycz17fTtyZW5kZXIoKX07CiB9CiAkKCcjY29weUFCJykub25jbGljaz0oKT0+e3ZpZXdTdGF0ZS5CPXsuLi5KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZpZXdTdGF0ZS5BKSksbmFtZTp2aWV3U3RhdGUuQi5uYW1lfTtyZW5kZXIoKX07CiAkKCcjc3dhcEFCJykub25jbGljaz0oKT0+e1t2aWV3U3RhdGUuQSx2aWV3U3RhdGUuQl09W3ZpZXdTdGF0ZS5CLHZpZXdTdGF0ZS5BXTtyZW5kZXIoKX07Cn0KZnVuY3Rpb24gcGVyaW9kS2V5KHIsZ3JhaW4pe3JldHVybiBncmFpbj09PSdtb250aCc/clswXS5zbGljZSgwLDcpOmdyYWluPT09J3dlZWsnP3JbMF0uc2xpY2UoMCw0KSsnIMK3IFMnK1N0cmluZyhyWzMwXSkucGFkU3RhcnQoMiwnMCcpOnJbMF19CmZ1bmN0aW9uIGV2b2x1dGlvblZpZXcoKXsKIGNvbnN0IHM9dmlld1N0YXRlLmV2b2x1dGlvbixyb3dzPXNsaWNlUm93cyhzLmZpbHRlcnMpLGs9cy5tZXRyaWM7CiBjb25zdCBieT1zLnNlcmllcz09PSd0b3RhbCc/W3tuYW1lOidTZWxlY2Npw7NuIGNvbXBsZXRhJyxyb3dzLC4uLmFnZyhyb3dzKX1dOmdyb3Vwcyhyb3dzLHI9PlN0cmluZyhyW3Muc2VyaWVzXT8/J1NpbiBkYXRvJykpLnNvcnQoKGEsYik9PmIuY29pbi1hLmNvaW4pLnNsaWNlKDAsOCk7CiBjb25zdCBzZXJpZXM9YnkubWFwKGc9Pih7bmFtZTpnLm5hbWUscG9pbnRzOmdyb3VwcyhnLnJvd3Mscj0+cGVyaW9kS2V5KHIscy5ncmFpbikpLnNvcnQoKGEsYik9PmEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpfSkpOwogY29uc3QgYXZhaWxhYmxlPU9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhtZXRyaWNzKS5maWx0ZXIoKFtrXSk9PiFbJ3JhdGlvJywncnMnLCdyYiddLmluY2x1ZGVzKGspKSk7CiBleHBvcnRSb3dzPVtbJ1NlcmllJywnUGVyw61vZG8nLG1ldHJpY3Nba11dLC4uLnNlcmllcy5mbGF0TWFwKHM9PnMucG9pbnRzLm1hcChwPT5bcy5uYW1lLHAubmFtZSxwW2tdPz8nJ10pKV07CiAkKCcjY29udGVudCcpLmlubmVySFRNTD1iYW5uZXIoJ0NvbXBvcnRhbWllbnRvIGEgdHJhdsOpcyBkZWwgdGllbXBvJywnU2lndWUgdW5hIG3DoXF1aW5hLCBiYW5jbyBvIHNlY3Rvci4gRWxpZ2UgZWwgaW5kaWNhZG9yLCBsYSBmcmVjdWVuY2lhIHkgbGFzIHNlcmllcyBxdWUgcXVpZXJlcyB2ZXIuJykrYDxzZWN0aW9uIGNsYXNzPSJjYXJkIj48ZGl2IGNsYXNzPSJmaWx0ZXJncmlkIGV2b2x1dGlvbmZpbHRlcnMiPiR7ZmlsdGVyRmllbGRzKHMsJ2V2b2x1dGlvbicsWzEsMiwzLDksNSw3XSl9PC9kaXY+PGRpdiBjbGFzcz0idmlld2NvbnRyb2xzIj4ke3NlbGVjdG9yKCdJbmRpY2Fkb3InLCdlbWV0cmljJyxrLGF2YWlsYWJsZSl9JHtzZWxlY3RvcignRnJlY3VlbmNpYScsJ2VncmFpbicscy5ncmFpbix7bW9udGg6J01lbnN1YWwnLHdlZWs6J1NlbWFuYWwnLGRheTonRGlhcmlhJ30pfSR7c2VsZWN0b3IoJ1NlcGFyYXIgbMOtbmVhcyBwb3InLCdlc2VyaWVzJyxzLnNlcmllcyx7dG90YWw6J1RvZGEgbGEgc2VsZWNjacOzbicsMTonTcOhcXVpbmEnLDI6J01hcmNhJyw5OidCYW5jbycsNTonU2VjdG9yJ30pfTwvZGl2Pjwvc2VjdGlvbj48ZGl2IGNsYXNzPSJjYXJkIGxhcmdlY2hhcnQiPjxoMj4ke21ldHJpY3Nba119IMK3ICR7c2VsZWN0ZWREYXRlVGV4dFY4KCdnbG9iYWwnKX08L2gyPjxkaXYgY2xhc3M9InN1YnRpdGxlIj5Nw6F4aW1vIDggc2VyaWVzLCBwcmlvcml6YWRhcyBwb3IgQ29pbiBJbi4gUGFzYSBlbCBjdXJzb3IgcG9yIGxvcyBwdW50b3MgcGFyYSB2ZXIgbG9zIHZhbG9yZXMuPC9kaXY+JHtjaGFydFYyKHNlcmllcyxrKX08L2Rpdj5gOwogYmluZEZpbHRlcnMoKTtmb3IobGV0IFtpZCxrZXldb2YgW1snZW1ldHJpYycsJ21ldHJpYyddLFsnZWdyYWluJywnZ3JhaW4nXSxbJ2VzZXJpZXMnLCdzZXJpZXMnXV0pJCgnIycraWQpLm9uY2hhbmdlPWU9PntzW2tleV09ZS50YXJnZXQudmFsdWU7cmVuZGVyKCl9Owp9CmZ1bmN0aW9uIHJhdGlvc1ZpZXcoKXsKIGNvbnN0IHM9dmlld1N0YXRlLnJhdGlvcyxyb3dzPXNsaWNlUm93cyhzLmZpbHRlcnMpLGJhc2U9c2xpY2VSb3dzKCkscmVmZXJlbmNlPWFnZyhzLnJlZmVyZW5jZT09PSdmaWx0ZXJlZCc/cm93czpiYXNlKTsKIGxldCBsaXN0PWdyb3Vwcyhyb3dzLHI9PlN0cmluZyhyW3MuZ3JvdXBdPz8nU2luIGRhdG8nKSk7CiBjb25zdCByZWZzPW5ldyBNYXA7CiBmb3IoY29uc3QgZyBvZiBsaXN0KXtsZXQgcmVmPXJlZmVyZW5jZTtpZihzLnJlZmVyZW5jZT09PSdzYWxvbicpe2xldCBzYWxvbnM9Wy4uLm5ldyBTZXQoZy5yb3dzLm1hcChyPT5yWzddKSldLGtleT1KU09OLnN0cmluZ2lmeShzYWxvbnMuc29ydCgpKTtpZighcmVmcy5oYXMoa2V5KSlyZWZzLnNldChrZXksYWdnKGJhc2UuZmlsdGVyKHI9PnNhbG9ucy5pbmNsdWRlcyhyWzddKSkpKTtyZWY9cmVmcy5nZXQoa2V5KX1yYXRpb3MoZyxyZWYpfQogbGlzdC5zb3J0KChhLGIpPT4oYltzLm1ldHJpY10/Py1JbmZpbml0eSktKGFbcy5tZXRyaWNdPz8tSW5maW5pdHkpKTsKIGNvbnN0IGNvbHM9WydjZCcsJ3NkJywnYmV0JywncmF0aW8nLCdycycsJ3JiJ107CiBleHBvcnRSb3dzPVtbZGltc1tzLmdyb3VwXSwuLi5jb2xzLm1hcChrPT5tZXRyaWNzW2tdKV0sLi4ubGlzdC5tYXAoZz0+W2cubmFtZSwuLi5jb2xzLm1hcChrPT5nW2tdPz8nJyldKV07CiAkKCcjY29udGVudCcpLmlubmVySFRNTD1iYW5uZXIoJ1JlbmRpbWllbnRvIHJlbGF0aXZvJywnMcOXIGVxdWl2YWxlIGEgbGEgcmVmZXJlbmNpYS4gTcOhcyBkZSAxw5cgc3VwZXJhIGVzZSBuaXZlbDsgbWVub3MgZGUgMcOXIHF1ZWRhIHBvciBkZWJham8uIENvbXBhcmEgYWN0aXZpZGFkIHkgYXB1ZXN0YSwgbm8gcmVudGFiaWxpZGFkIHBvciBzw60gc29sYS4nKStgPHNlY3Rpb24gY2xhc3M9ImNhcmQiPjxkaXYgY2xhc3M9ImZpbHRlcmdyaWQiPiR7ZmlsdGVyRmllbGRzKHMsJ3JhdGlvcycpfTwvZGl2PjxkaXYgY2xhc3M9InZpZXdjb250cm9scyI+JHtzZWxlY3RvcignQWdydXBhciBwb3InLCdyZ3JvdXAnLHMuZ3JvdXAsZGltcyl9JHtzZWxlY3RvcignUmF0aW8gZGVsIHJhbmtpbmcnLCdybWV0cmljJyxzLm1ldHJpYyx7cmF0aW86J0NvaW4gSW4gcG9yIG3DoXF1aW5hLWTDrWEnLHJzOidTcGlucyBwb3IgbcOhcXVpbmEtZMOtYScscmI6J0FwdWVzdGEgcHJvbWVkaW8nfSl9JHtzZWxlY3RvcignUmVmZXJlbmNpYScsJ3JyZWZlcmVuY2UnLHMucmVmZXJlbmNlLHthbGw6J1RvZG8gZWwgcGFycXVlIGVuIGVzdGFzIGZlY2hhcycsc2Fsb246J1NhbMOzbiBkZSBjYWRhIGdydXBvJyxmaWx0ZXJlZDonU2VsZWNjacOzbiBmaWx0cmFkYSd9KX08L2Rpdj48L3NlY3Rpb24+PGRpdiBjbGFzcz0iY2hhcnRzIHJhdGlvY2hhcnRzIj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+UmFua2luZyDCtyAke21ldHJpY3Nbcy5tZXRyaWNdfTwvaDI+JHtiYXJzVjIobGlzdC5zbGljZSgwLDEwKSxzLm1ldHJpYyl9PC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPkPDs21vIGxlZXIgZWwgcmVzdWx0YWRvPC9oMj48cD4xLDIww5cgcmVwcmVzZW50YSB1biBuaXZlbCAyMCUgc3VwZXJpb3IgYSBsYSByZWZlcmVuY2lhLiAwLDgww5cgcmVwcmVzZW50YSB1biBuaXZlbCAyMCUgaW5mZXJpb3IuPC9wPjxwPkxvcyByYXRpb3MgZGUgQ29pbiBJbiB5IHNwaW5zIHV0aWxpemFuIG3DoXF1aW5hcy1kw61hIHJlZ2lzdHJhZGFzIHBhcmEgbm9ybWFsaXphciBsYSBleHBvc2ljacOzbi4gTGEgYXB1ZXN0YSBzZSBjYWxjdWxhIGNvbW8gQ29pbiBJbiB0b3RhbCAvIHNwaW5zIHRvdGFsZXMuPC9wPjxwPkxhIHJlZmVyZW5jaWEgdXNhIGxhcyBtaXNtYXMgZmVjaGFzLiDCq1RvZG8gZWwgcGFycXVlwrsgbm8gYXBsaWNhIGxvcyBmaWx0cm9zIGRlIGNhdGVnb3LDrWFzOyDCq1NlbGVjY2nDs24gZmlsdHJhZGHCuyBzw60gbG9zIGFwbGljYS48L3A+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPkRldGFsbGUgZGUgcmF0aW9zIMK3ICR7bGlzdC5sZW5ndGh9IGdydXBvczwvaDI+PGRpdiBjbGFzcz0idGFibGV3cmFwIj48dGFibGU+PHRoZWFkPjx0cj48dGg+JHtkaW1zW3MuZ3JvdXBdfTwvdGg+JHtjb2xzLm1hcChrPT5gPHRoPiR7bWV0cmljc1trXX08L3RoPmApLmpvaW4oJycpfTwvdHI+PC90aGVhZD48dGJvZHk+JHtsaXN0Lm1hcChnPT5gPHRyPjx0ZD4ke2VzYyhnLm5hbWUpfTwvdGQ+JHtjb2xzLm1hcChrPT5gPHRkPiR7WydyYXRpbycsJ3JzJywncmInXS5pbmNsdWRlcyhrKT9gPHNwYW4gZGF0YS1yYXRpby12Nj0iJHtnW2tdPz8nJ30iIGNsYXNzPSJwaWxsICR7Z1trXTwxPydsb3cnOicnfSI+JHtmbXQoZ1trXSxrKX08L3NwYW4+YDpmbXQoZ1trXSxrKX08L3RkPmApLmpvaW4oJycpfTwvdHI+YCkuam9pbignJyl9PC90Ym9keT48L3RhYmxlPjwvZGl2PjwvZGl2PmA7CiBiaW5kRmlsdGVycygpO2ZvcihsZXQgW2lkLGtleV1vZiBbWydyZ3JvdXAnLCdncm91cCddLFsncm1ldHJpYycsJ21ldHJpYyddLFsncnJlZmVyZW5jZScsJ3JlZmVyZW5jZSddXSkkKCcjJytpZCkub25jaGFuZ2U9ZT0+e3Nba2V5XT1lLnRhcmdldC52YWx1ZTtyZW5kZXIoKX07Cn0KZnVuY3Rpb24gcmVuZGVyKCl7CiBpZighZGF0YSlyZXR1cm47CiAkKCcjZmlsdGVycycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOyQoJyNjb250cm9scycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZpbHRlcnMnKS5zdHlsZS5kaXNwbGF5PVsnQ29tcGFyYXRpdm9zJywnTWV0b2RvbG9nw61hJ10uaW5jbHVkZXModGFiKT8nbm9uZSc6J2Jsb2NrJzsKIGRvY3VtZW50LmJvZHkuZGF0YXNldC52aWV3PXRhYjsKICQoJyN0aXRsZScpLnRleHRDb250ZW50PXtSZXN1bWVuOidSZXN1bWVuIGRlbCBwYXJxdWUnLENvbXBhcmF0aXZvczonQ29tcGFyYXIgc2VsZWNjaW9uZXMgeSBwZXLDrW9kb3MnLEV2b2x1Y2nDs246J0V2b2x1Y2nDs24gZGVsIHJlbmRpbWllbnRvJyxSYXRpb3M6J1JhdGlvcyBkZSByZW5kaW1pZW50bycsTWV0b2RvbG9nw61hOidNZXRvZG9sb2fDrWEgeSBjw6FsY3Vsb3MnfVt0YWJdOwogJCgnI3ZpZXdIZWxwJykudGV4dENvbnRlbnQ9dGFiPT09J0NvbXBhcmF0aXZvcyc/J0EgeSBCIHRpZW5lbiBmZWNoYXMgaW5kZXBlbmRpZW50ZXMuJzp0YWI9PT0nUmVzdW1lbic/J0ZlY2hhcyBkZWwgcGFub3JhbWEgZ2VuZXJhbCBkZWwgcGFycXVlLic6J0ZlY2hhcyBkZSBlc3RhIGNvbnN1bHRhLic7CiBpZih0YWI9PT0nUmVzdW1lbicpc3VtbWFyeVZpZXcoKTtlbHNlIGlmKHRhYj09PSdDb21wYXJhdGl2b3MnKWNvbXBhcmVWaWV3KCk7ZWxzZSBpZih0YWI9PT0nRXZvbHVjacOzbicpZXZvbHV0aW9uVmlldygpO2Vsc2UgaWYodGFiPT09J1JhdGlvcycpcmF0aW9zVmlldygpO2Vsc2V7bWV0aG9kKCk7JCgnI2NvbnRlbnQnKS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLCc8ZGl2IGNsYXNzPSJub3RpY2UiPkNvbXBhcmF0aXZvcyBwZXJtaXRlIGZlY2hhcyB5IGZpbHRyb3MgaW5kZXBlbmRpZW50ZXMgcGFyYSBBIHkgQi4gTG9zIGNhbWJpb3MgaGlzdMOzcmljb3MgZGUgdWJpY2FjacOzbiBzb2xvIHNlIHB1ZWRlbiBhbmFsaXphciBzaSBsYSBtYXRyaXogY29uc2VydmEgbGEgdWJpY2FjacOzbiByZWFsIGRlIGNhZGEgZmVjaGEuIEVYUElSQURPUyBzZSBvY3VsdGEgZGUgbG9zIGZpbHRyb3MsIHkgc2UgZXhjbHV5ZSBkZSBsb3MgdG90YWxlcy48L2Rpdj4nKX0KfQovLyBSZXBsYWNlIG5hdmlnYXRpb24gYW5kIHZpZXcgcGVyc2lzdGVuY2Ugd2l0aCBzdGF0ZSBzcGVjaWZpYyB0byBlYWNoIHNlY3Rpb24uCmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kYXRlcm93JykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywnPHNwYW4gaWQ9InZpZXdIZWxwIiBjbGFzcz0iZGF0ZWhlbHAiPjwvc3Bhbj4nKTsKZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZGVyIHAnKS50ZXh0Q29udGVudD0nUGFub3JhbWEgZ2VuZXJhbCwgY29tcGFyYWNpb25lcyBpbmRlcGVuZGllbnRlcywgZXZvbHVjacOzbiB5IHJhdGlvcy4nOwpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkZXInKS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyZW5kJywnPGRpdiBjbGFzcz0id29ya3NwYWNlYmFyIj48YnV0dG9uIGlkPSJ2MnNhdmUiPkd1YXJkYXIgdmlzdGEgYWN0dWFsPC9idXR0b24+PHNlbGVjdCBpZD0idjJ2aWV3cyI+PG9wdGlvbiB2YWx1ZT0iIj5WaXN0YXMgZ3VhcmRhZGFzPC9vcHRpb24+PC9zZWxlY3Q+PGJ1dHRvbiBpZD0idjJleHBvcnQiPuKGkyBFeHBvcnRhciBlc3RhIGNvbnN1bHRhPC9idXR0b24+PC9kaXY+Jyk7CiQoJyNzYXZlJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7JCgnI3ZpZXdzJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ25hdiBidXR0b24nKS5mb3JFYWNoKChidXR0b24saSk9PmJ1dHRvbi5vbmNsaWNrPSgpPT57dGFiPVsnUmVzdW1lbicsJ0NvbXBhcmF0aXZvcycsJ0V2b2x1Y2nDs24nLCdSYXRpb3MnLCdNZXRvZG9sb2fDrWEnXVtpXTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCduYXYgYnV0dG9uJykuZm9yRWFjaChiPT5iLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsYj09PWJ1dHRvbikpO3JlbmRlcigpfSk7CmxvYWRWaWV3cz1mdW5jdGlvbigpe2NvbnN0IHNlbGVjdD0kKCcjdjJ2aWV3cycpO3NlbGVjdC5pbm5lckhUTUw9JzxvcHRpb24gdmFsdWU9IiI+VmlzdGFzIGd1YXJkYWRhczwvb3B0aW9uPicrc2F2ZWRWaWV3cy5tYXAoKHYsaSk9PmA8b3B0aW9uIHZhbHVlPSIke2l9Ij4ke2VzYyh2Lm5hbWUpfSR7di52ZXJzaW9uPT09Mj8nJzonIChhbnRlcmlvciknfTwvb3B0aW9uPmApLmpvaW4oJycpfTsKJCgnI3Yyc2F2ZScpLm9uY2xpY2s9YXN5bmMoKT0+e2lmKCFkYXRhKXJldHVybjtjb25zdCBuYW1lPXByb21wdCgnTm9tYnJlIGRlIGxhIHZpc3RhJyk7aWYoIW5hbWUpcmV0dXJuO2xldCBuZXh0PVsuLi5zYXZlZFZpZXdzLHt2ZXJzaW9uOjIsbmFtZSx0YWIsZnJvbTokKCcjZnJvbScpLnZhbHVlLHRvOiQoJyN0bycpLnZhbHVlLHN0YXRlOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmlld1N0YXRlKSl9XTt0cnl7YXdhaXQgcnBjKCdzYXZlVmlld3MnLEpTT04uc3RyaW5naWZ5KG5leHQpKTtzYXZlZFZpZXdzPW5leHQ7bG9hZFZpZXdzKCl9Y2F0Y2goZSl7YWxlcnQoJ05vIHNlIGd1YXJkw7M6ICcrZS5tZXNzYWdlKX19OwokKCcjdjJ2aWV3cycpLm9uY2hhbmdlPSgpPT57aWYoJCgnI3Yydmlld3MnKS52YWx1ZT09PScnKXJldHVybjtjb25zdCB2PXNhdmVkVmlld3NbJCgnI3Yydmlld3MnKS52YWx1ZV07aWYodi52ZXJzaW9uIT09Mil7YWxlcnQoJ0VzdGEgdmlzdGEgcGVydGVuZWNlIGFsIGRpc2XDsW8gYW50ZXJpb3IuIENyZWEgdW5hIG51ZXZhIGNvbiBsb3MgZmlsdHJvcyBhY3R1YWxlcy4nKTtyZXR1cm59T2JqZWN0LmFzc2lnbih2aWV3U3RhdGUsSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2LnN0YXRlKSkpOyQoJyNmcm9tJykudmFsdWU9di5mcm9tOyQoJyN0bycpLnZhbHVlPXYudG87dGFiPXYudGFiO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ25hdiBidXR0b24nKS5mb3JFYWNoKChiLGkpPT5iLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsWydSZXN1bWVuJywnQ29tcGFyYXRpdm9zJywnRXZvbHVjacOzbicsJ1JhdGlvcycsJ01ldG9kb2xvZ8OtYSddW2ldPT09dGFiKSk7cmVuZGVyKCl9OwokKCcjcmVzZXQnKS5vbmNsaWNrPSgpPT57Y29uc3QgW2Zyb20sdG9dPWRhdGVSYW5nZSgpOyQoJyNmcm9tJykudmFsdWU9ZnJvbTskKCcjdG8nKS52YWx1ZT10bztpZih0YWI9PT0nRXZvbHVjacOzbicpdmlld1N0YXRlLmV2b2x1dGlvbi5maWx0ZXJzPXt9O2lmKHRhYj09PSdSYXRpb3MnKXZpZXdTdGF0ZS5yYXRpb3MuZmlsdGVycz17fTtyZW5kZXIoKX07CiQoJyN2MmV4cG9ydCcpLm9uY2xpY2s9KCk9PntpZih0YWI9PT0nTWV0b2RvbG9nw61hJ3x8IWV4cG9ydFJvd3MubGVuZ3RoKXJldHVybjtjb25zdCBjc3Y9J1x1ZmVmZicrZXhwb3J0Um93cy5tYXAocm93PT5yb3cubWFwKHY9PiciJytTdHJpbmcodikucmVwbGFjZSgvIi9nLCciIicpKyciJykuam9pbignOycpKS5qb2luKCdcclxuJyk7bGV0IGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO2EuaHJlZj1VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtjc3ZdLHt0eXBlOid0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04J30pKTthLmRvd25sb2FkPSdMQS0nK3RhYisnLmNzdic7YS5jbGljaygpO3NldFRpbWVvdXQoKCk9PlVSTC5yZXZva2VPYmplY3RVUkwoYS5ocmVmKSwxMDAwKX07Cgpjb25zdCBjYW5vbmljYWxIZWFkZXJzPVsnRmVjaGEnLCdNw6FxdWluYScsJ0ZhYnJpY2FudGUnLCdQbGF0YWZvcm1hJywnTW9kZWxvJywnU2VjY2nDs24nLCdWYWxvcicsJ1NhbMOzbicsJ0lELVByb2cnLCdCbG9xdWUnLCdUaWNrZXQgSW4nLCdUaWNrZXQgT3V0JywnQmlsbGV0ZScsJ1ZwcCcsJ0V4cGlyYWRvcycsJ1ByZW1pb3MnLCdXaW4nLCdXRFAnLCdDb2luIEluJywnQ29pbiBPdXQnLCdTcGluJywnQXB1ZXN0YScsJyUgT2N1cCcsJ1dpbicsJ0RhdG9zIFdpbk1ldHJvIE1DQycsJ07CsDEgRGlmZXJlbmNpYScsJ1Byb21vIEluJywnUHJvbW8gT3V0JywnRGlmZXJlbmNpYSBXaW4gUmVhbCcsJ0hvcmEnLCdTZW1hbmEnLCdNZXMnLCdEaWFTZW0nLCdBw7FvIEZhYicsJ0FudGlndWVkYWQnLCdjaGVjayddOwpmdW5jdGlvbiBoZWFkZXJLZXkocyl7cmV0dXJuIFN0cmluZyhzPz8nJykubm9ybWFsaXplKCdORkQnKS5yZXBsYWNlKC9bXHUwMzAwLVx1MDM2Zl0vZywnJykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0vZywnJyl9CmZ1bmN0aW9uIGV4Y2VsRGF0ZSh2LGRhdGUxOTA0PWZhbHNlKXsKIGlmKHR5cGVvZiB2PT09J251bWJlcicpe2NvbnN0IGQ9bmV3IERhdGUoKGRhdGUxOTA0P0RhdGUuVVRDKDE5MDQsMCwxKTpEYXRlLlVUQygxODk5LDExLDMwKSkrTWF0aC5mbG9vcih2KSo4NjRlNSk7cmV0dXJuIE51bWJlci5pc0Zpbml0ZShkLmdldFRpbWUoKSk/ZC50b0lTT1N0cmluZygpLnNsaWNlKDAsMTApOm51bGx9CiBjb25zdCBzPVN0cmluZyh2Pz8nJykudHJpbSgpO2xldCBtPXMubWF0Y2goL14oXGR7NH0pLShcZHsyfSktKFxkezJ9KS8pO2lmKCFtKXtsZXQgbG9jYWw9cy5tYXRjaCgvXihcZHsxLDJ9KVtcLy1dKFxkezEsMn0pW1wvLV0oXGR7NH0pJC8pO2lmKGxvY2FsKW09W2xvY2FsWzBdLGxvY2FsWzNdLGxvY2FsWzJdLnBhZFN0YXJ0KDIsJzAnKSxsb2NhbFsxXS5wYWRTdGFydCgyLCcwJyldfQogaWYoIW0pcmV0dXJuIG51bGw7bGV0IHJlc3VsdD1gJHttWzFdfS0ke21bMl19LSR7bVszXX1gLGQ9bmV3IERhdGUocmVzdWx0KydUMDA6MDA6MDBaJyk7cmV0dXJuIE51bWJlci5pc0Zpbml0ZShkLmdldFRpbWUoKSkmJmQudG9JU09TdHJpbmcoKS5zbGljZSgwLDEwKT09PXJlc3VsdD9yZXN1bHQ6bnVsbDsKfQpmdW5jdGlvbiBub3JtYWxpemVXb3JrYm9vayhtYXRyaXgsanVlZ29zLG5hbWUsZGF0ZTE5MDQ9ZmFsc2UsdXRpbGl0eT1udWxsKXsKIGlmKCFtYXRyaXgpdGhyb3cgRXJyb3IoJ0VsIGFyY2hpdm8gZGViZSBpbmNsdWlyIGxhIHBlc3Rhw7FhIE1hdHJpei4nKTsKIGxldCBzdGFydD1tYXRyaXguZmluZEluZGV4KHI9PnIuc29tZSh2PT5oZWFkZXJLZXkodik9PT0nZmVjaGEnKSYmci5zb21lKHY9PmhlYWRlcktleSh2KT09PSdtYXF1aW5hJykpOwogaWYoc3RhcnQ8MCl0aHJvdyBFcnJvcignTm8gc2UgZW5jb250cmFyb24gbG9zIGVuY2FiZXphZG9zIEZlY2hhIHkgTcOhcXVpbmEuJyk7CiBjb25zdCBoZWFkZXJzPW1hdHJpeFtzdGFydF0scG9zaXRpb25zPXt9O2hlYWRlcnMuZm9yRWFjaCgodixpKT0+e2xldCBrZXk9aGVhZGVyS2V5KHYpOyhwb3NpdGlvbnNba2V5XT8/PVtdKS5wdXNoKGkpfSk7CiBjb25zdCBtYXBwaW5nPWNhbm9uaWNhbEhlYWRlcnMubWFwKGg9PnBvc2l0aW9uc1toZWFkZXJLZXkoaCldPy5bMF0/Py0xKTsKIG1hcHBpbmdbMjNdPXBvc2l0aW9ucy53aW4/LlsxXT8/LTE7CiBtYXBwaW5nWzI0XT1wb3NpdGlvbnMuZGF0b3N3aW5tZXRyb21jYz8uWzBdPz8tMTttYXBwaW5nWzI1XT1wb3NpdGlvbnMubjFkaWZlcm5jaWE/LlswXT8/cG9zaXRpb25zLm4xZGlmZXJlbmNpYT8uWzBdPz8tMTsKIGZvcihsZXQgaSBvZiBbMCwxLDE2LDE4LDIwLDI2LDI3XSlpZihtYXBwaW5nW2ldPDApdGhyb3cgRXJyb3IoJ0ZhbHRhIGxhIGNvbHVtbmEgJytjYW5vbmljYWxIZWFkZXJzW2ldKTsKIGNvbnN0IGpTdGFydD0oanVlZ29zfHxbXSkuZmluZEluZGV4KHI9PnIuc29tZSh2PT5oZWFkZXJLZXkodik9PT0nbWFxdWluYScpKTsKIGNvbnN0IGRlc2NyaXB0aW9ucz1uZXcgTWFwOwogaWYoalN0YXJ0Pj0wKXtjb25zdCBqaD1qdWVnb3NbalN0YXJ0XS5tYXAoaGVhZGVyS2V5KSxtaz1qaC5pbmRleE9mKCdtYXF1aW5hJyk7Zm9yKGNvbnN0IHJvdyBvZiBqdWVnb3Muc2xpY2UoalN0YXJ0KzEpKWlmKHJvd1tta10hPW51bGwpZGVzY3JpcHRpb25zLnNldChTdHJpbmcocm93W21rXSkse3JvdyxoZWFkZXJzOmpofSl9CiBsZXQgc2tpcHBlZD0wLG1pc3NpbmdEZXNjcmlwdGlvbnM9MCxlcnJvcnM9MDtjb25zdCByb3dzPVtdOwogZm9yKGxldCBpPXN0YXJ0KzE7aTxtYXRyaXgubGVuZ3RoO2krKyl7CiAgY29uc3Qgc291cmNlPW1hdHJpeFtpXTtpZihtYXBwaW5nLnNsaWNlKDAsMzApLmZpbHRlcihrPT5rPj0wKS5ldmVyeShrPT5zb3VyY2Vba109PW51bGx8fHNvdXJjZVtrXT09PScnKSl7c2tpcHBlZCsrO2NvbnRpbnVlfQogIGNvbnN0IGR2PXNvdXJjZVttYXBwaW5nWzBdXTtpZigvXnRvdGFsKCBnZW5lcmFsKT8kL2kudGVzdChTdHJpbmcoZHY/PycnKS50cmltKCkpKXtza2lwcGVkKys7Y29udGludWV9CiAgY29uc3QgZGF0ZT1leGNlbERhdGUoZHYsZGF0ZTE5MDQpO2lmKCFkYXRlKXRocm93IEVycm9yKGBGaWxhICR7aSsxfTogZmVjaGEgdmFjw61hIG8gbm8gdsOhbGlkYS5gKTsKICBsZXQgcj1jYW5vbmljYWxIZWFkZXJzLm1hcCgoaCxrKT0+bWFwcGluZ1trXTwwP251bGw6c291cmNlW21hcHBpbmdba11dPz9udWxsKTtyWzBdPWRhdGU7CiAgZm9yKGxldCBrIG9mIFsxNiwxOCwyMCwyNiwyN10paWYodHlwZW9mIHJba10hPT0nbnVtYmVyJ3x8IU51bWJlci5pc0Zpbml0ZShyW2tdKSl0aHJvdyBFcnJvcihgRmlsYSAke2krMX06ICR7Y2Fub25pY2FsSGVhZGVyc1trXX0gbm8gdGllbmUgcmVzdWx0YWRvIG51bcOpcmljby4gUmVjYWxjdWxhIHkgZ3VhcmRhIGVsIEV4Y2VsLmApOwogIGNvbnN0IGRlc2M9ZGVzY3JpcHRpb25zLmdldChTdHJpbmcoclsxXSkpO2ZvcihsZXQgaz0yO2s8PTk7aysrKXtpZihyW2tdPT1udWxsJiZkZXNjKXtsZXQgaXg9ZGVzYy5oZWFkZXJzLmluZGV4T2YoaGVhZGVyS2V5KGNhbm9uaWNhbEhlYWRlcnNba10pKTtpZihpeD49MClyW2tdPWRlc2Mucm93W2l4XT8/bnVsbH19CiAgZm9yKGxldCBrPTA7azxyLmxlbmd0aDtrKyspaWYodHlwZW9mIHJba109PT0nc3RyaW5nJyYmL14jKFJFRiF8TlwvQXxWQUxVRSF8RElWXC8wIXxOQU1FXD98TlVNIXxOVUxMISkvLnRlc3QocltrXSkpe3Jba109bnVsbDtlcnJvcnMrK30KICBpZihyWzJdPT1udWxsJiYhaXNFeHBpcmVkKHJbNV0pJiYhaXNFeHBpcmVkKHJbN10pKW1pc3NpbmdEZXNjcmlwdGlvbnMrKzsKICBjb25zdCBkPW5ldyBEYXRlKGRhdGUrJ1QwMDowMDowMFonKSxmaXJzdD1uZXcgRGF0ZShEYXRlLlVUQyhkLmdldFVUQ0Z1bGxZZWFyKCksMCwxKSk7clszMF09TWF0aC5mbG9vcigoKGQtZmlyc3QpLzg2NGU1KyhmaXJzdC5nZXRVVENEYXkoKSs2KSU3KS83KSsxO3JbMzFdPWQuZ2V0VVRDTW9udGgoKSsxO3JbMzJdPShkLmdldFVUQ0RheSgpKzYpJTcrMTsKICAvLyBUaGUgbGFzdCBjb2x1bW5zIG9mIFdpbiBUaXR0byBhcmUgdmFsaWRhdGlvbiBmaWVsZHMsIG5vdCBjYWxlbmRhci9tYW51ZmFjdHVyZSBmaWVsZHMuCiAgZm9yKGxldCBrIG9mIFszMywzNCwzNV0paWYobWFwcGluZ1trXTwwKXJba109bnVsbDsKICByb3dzLnB1c2gocik7CiB9CiBpZighcm93cy5sZW5ndGgpdGhyb3cgRXJyb3IoJ0xhIHBlc3Rhw7FhIE1hdHJpeiBubyBjb250aWVuZSByZWdpc3Ryb3MgdsOhbGlkb3MuJyk7CiBsZXQgY29udHJvbHM9W107CiBpZih1dGlsaXR5KXtmb3IobGV0IHJvdyBvZiB1dGlsaXR5KXtjb25zdCBkYXRlPWV4Y2VsRGF0ZShyb3dbMF0sZGF0ZTE5MDQpO2lmKGRhdGUmJnR5cGVvZiByb3dbNF09PT0nbnVtYmVyJyljb250cm9scy5wdXNoKHtkYXRlLG5ldDpyb3dbMV0sdnBwOnJvd1syXSxleHBpcmVkOnJvd1szXSx3aW46cm93WzRdfSl9fQogY29uc3QgZGF0ZXM9Wy4uLm5ldyBTZXQocm93cy5tYXAocj0+clswXSkpXS5zb3J0KCksa2V5cz1uZXcgU2V0O2NvbnRyb2xzPWNvbnRyb2xzLmZpbHRlcihjPT5kYXRlcy5pbmNsdWRlcyhjLmRhdGUpKTtsZXQgZHVwbGljYXRlcz0wO2ZvcihsZXQgciBvZiByb3dzKXtsZXQga2V5PXJbMF0rJ3wnK3JbMV07aWYoa2V5cy5oYXMoa2V5KSlkdXBsaWNhdGVzKys7a2V5cy5hZGQoa2V5KX0KIHJldHVybiB7aGVhZGVyczpjYW5vbmljYWxIZWFkZXJzLHJvd3MsbmFtZSxjb250cm9scyxpbXBvcnRJbmZvOntza2lwcGVkLG1pc3NpbmdEZXNjcmlwdGlvbnMsZXJyb3JzLGR1cGxpY2F0ZXMsZnJvbTpkYXRlc1swXSx0bzpkYXRlcy5hdCgtMSksZGF0ZXM6ZGF0ZXMubGVuZ3RoLGZvcm1hdDpwb3NpdGlvbnMuZXN0YWRvZGVtYXF1aW5hPydXaW4gVGl0dG8nOidNYXRyaXogLyBSZXBvcnRlIExBJ319Owp9CmZ1bmN0aW9uIGNvbWJpbmVNYXRyaWNlcyhwcmV2aW91cyxpbmNvbWluZyxtb2RlKXsKIGlmKG1vZGU9PT0ncmVwbGFjZSd8fCFwcmV2aW91cylyZXR1cm4gey4uLmluY29taW5nfTsKIGNvbnN0IGRhdGVzPW5ldyBTZXQoaW5jb21pbmcucm93cy5tYXAocj0+clswXSkpOwogY29uc3Qgcm93cz1bLi4ucHJldmlvdXMucm93cy5maWx0ZXIocj0+IWRhdGVzLmhhcyhyWzBdKSksLi4uaW5jb21pbmcucm93c10uc29ydCgoYSxiKT0+YVswXS5sb2NhbGVDb21wYXJlKGJbMF0pfHxTdHJpbmcoYVsxXSkubG9jYWxlQ29tcGFyZShTdHJpbmcoYlsxXSksdW5kZWZpbmVkLHtudW1lcmljOnRydWV9KSk7CiBjb25zdCBjb250cm9scz1bLi4uKHByZXZpb3VzLmNvbnRyb2xzfHxbXSkuZmlsdGVyKGM9PiFkYXRlcy5oYXMoYy5kYXRlKSksLi4uKGluY29taW5nLmNvbnRyb2xzfHxbXSldOwogcmV0dXJuIHsuLi5pbmNvbWluZyxyb3dzLGNvbnRyb2xzLG5hbWU6J0hpc3TDs3JpY28gwrcgJytpbmNvbWluZy5uYW1lfTsKfQpsZXQgcGVuZGluZ0ltcG9ydD1udWxsOwpmdW5jdGlvbiBzaG93SW1wb3J0UHJldmlldyhpbmNvbWluZyl7CiBwZW5kaW5nSW1wb3J0PWluY29taW5nO2NvbnN0IGRhdGVzPW5ldyBTZXQoaW5jb21pbmcucm93cy5tYXAocj0+clswXSkpLG9sZD0oZGF0YT8ucm93c3x8W10pLmZpbHRlcihyPT5kYXRlcy5oYXMoclswXSkpLGE9YWdnKGluY29taW5nLnJvd3MpLGluZm89aW5jb21pbmcuaW1wb3J0SW5mbzsKIGNvbnN0IGRpYWxvZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaWFsb2cnKTtkaWFsb2cuaWQ9J2ltcG9ydERpYWxvZyc7ZGlhbG9nLmlubmVySFRNTD1gPGRpdiBjbGFzcz0iaW1wb3J0Ym94Ij48aDI+UmV2aXNhciBhY3R1YWxpemFjacOzbjwvaDI+PHA+JHtlc2MoaW5jb21pbmcubmFtZSl9IMK3ICR7aW5mby5mb3JtYXR9PC9wPjxkaXYgY2xhc3M9Im5vdGljZSI+JHtpbmZvLmZyb219IOKGkiAke2luZm8udG99IMK3ICR7Zm10KGluY29taW5nLnJvd3MubGVuZ3RoKX0gcmVnaXN0cm9zIMK3ICR7aW5mby5kYXRlc30gZMOtYXMuPGJyPldpbjogJHtmbXQoYS53aW4pfSBDTFAgwrcgQ29pbiBJbjogJHtmbXQoYS5jb2luKX0gQ0xQLjxicj4ke2luZm8uc2tpcHBlZH0gZmlsYXMgdmFjw61hcyBvIGRlIHRvdGFsZXMgb21pdGlkYXMuICR7aW5mby5kdXBsaWNhdGVzfSBjbGF2ZXMgZmVjaGEvbcOhcXVpbmEgcmVwZXRpZGFzIChzZSBjb25zZXJ2YW4pLiAke2luZm8ubWlzc2luZ0Rlc2NyaXB0aW9uc30gcmVnaXN0cm9zIHNpbiBmYWJyaWNhbnRlLiAke2luZm8uZXJyb3JzfSBlcnJvcmVzIGVuIGNvbHVtbmFzIGF1eGlsaWFyZXMgc2UgbWFyY2Fyb24gY29tbyBzaW4gZGF0by48L2Rpdj48bGFiZWw+Q8OzbW8gYWN0dWFsaXphcjxzZWxlY3QgaWQ9ImltcG9ydE1vZGUiPjxvcHRpb24gdmFsdWU9Im1lcmdlIj5BY3R1YWxpemFyIGxvcyBkw61hcyByZWNpYmlkb3MgeSBjb25zZXJ2YXIgZWwgcmVzdG8gZGVsIGhpc3TDs3JpY288L29wdGlvbj48b3B0aW9uIHZhbHVlPSJyZXBsYWNlIj5SZWVtcGxhemFyIFRPRE8gZWwgaGlzdMOzcmljbyBwb3IgZXN0ZSBhcmNoaXZvPC9vcHRpb24+PC9zZWxlY3Q+PC9sYWJlbD48cD5FbiBtb2RvIGhpc3TDs3JpY28gc2UgcmVlbXBsYXphbiAke2ZtdChvbGQubGVuZ3RoKX0gcmVnaXN0cm9zIGRlIGxvcyBkw61hcyByZWNpYmlkb3MuIExvcyBkZW3DoXMgZMOtYXMgc2UgY29uc2VydmFuLiBSZXBldGlyIGVsIG1pc21vIGFyY2hpdm8gbm8gZHVwbGljYSBkYXRvcy4gQ2FkYSBkw61hIGRlbCBhcmNoaXZvIHNlIGNvbnNpZGVyYSBjb21wbGV0by48L3A+PHAgaWQ9ImltcG9ydE1lc3NhZ2UiPjwvcD48ZGl2IGNsYXNzPSJjb21wYXJldG9vbHMiPjxidXR0b24gaWQ9ImNhbmNlbEltcG9ydCI+Q2FuY2VsYXI8L2J1dHRvbj48YnV0dG9uIGlkPSJjb25maXJtSW1wb3J0IiBjbGFzcz0icHJpbWFyeSI+Q29uZmlybWFyIGFjdHVhbGl6YWNpw7NuPC9idXR0b24+PC9kaXY+PC9kaXY+YDsKIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGlhbG9nKTtkaWFsb2cuc2hvd01vZGFsKCk7JCgnI2NhbmNlbEltcG9ydCcpLm9uY2xpY2s9KCk9PntkaWFsb2cuY2xvc2UoKTtkaWFsb2cucmVtb3ZlKCk7cGVuZGluZ0ltcG9ydD1udWxsfTsKICQoJyNjb25maXJtSW1wb3J0Jykub25jbGljaz1hc3luYygpPT57CiAgY29uc3QgbW9kZT0kKCcjaW1wb3J0TW9kZScpLnZhbHVlO2lmKG1vZGU9PT0ncmVwbGFjZScmJiFjb25maXJtKCdFc3RvIHJlZW1wbGF6YXLDoSBUT0RPIGVsIGhpc3TDs3JpY28gYWN0dWFsLiDCv0NvbnRpbnVhcj8nKSlyZXR1cm47CiAgJCgnI2NvbmZpcm1JbXBvcnQnKS5kaXNhYmxlZD10cnVlOyQoJyNjYW5jZWxJbXBvcnQnKS5kaXNhYmxlZD10cnVlOyQoJyNpbXBvcnRNZXNzYWdlJykudGV4dENvbnRlbnQ9J0d1YXJkYW5kbyBlbiBHb29nbGUgRHJpdmXigKYnOwogIHRyeXtjb25zdCBuZXh0PWNvbWJpbmVNYXRyaWNlcyhkYXRhLGluY29taW5nLG1vZGUpLHJlc3BvbnNlPWF3YWl0IHJwYygnaW1wb3J0TWF0cml4JyxKU09OLnN0cmluZ2lmeShpbmNvbWluZyksbW9kZSxkYXRhPy5zdG9yYWdlUmV2aXNpb24/Pydpbml0aWFsJyk7bmV4dC5zdG9yYWdlUmV2aXNpb249cmVzcG9uc2UucmV2aXNpb247bmV4dC5zdG9yYWdlVXBkYXRlZEF0PXJlc3BvbnNlLnVwZGF0ZWRBdDtkYXRhPW5leHQ7Zm9yKGxldCBrZXkgb2YgWydBJywnQiddKXt2aWV3U3RhdGVba2V5XS5mcm9tPScnO3ZpZXdTdGF0ZVtrZXldLnRvPScnfWRpYWxvZy5jbG9zZSgpO2RpYWxvZy5yZW1vdmUoKTtwZW5kaW5nSW1wb3J0PW51bGw7aW5pdCgpOyQoJyNzdGF0dXMnKS50ZXh0Q29udGVudCs9YCDCtyBIaXN0w7NyaWNvIGFjdHVhbGl6YWRvIGVuIERyaXZlIMK3ICR7cmVzcG9uc2Uucm93c30gcmVnaXN0cm9zYH0KICBjYXRjaChlcnIpeyQoJyNpbXBvcnRNZXNzYWdlJykudGV4dENvbnRlbnQ9J05vIHNlIGd1YXJkw7M6ICcrZXJyLm1lc3NhZ2U7JCgnI2NvbmZpcm1JbXBvcnQnKS5kaXNhYmxlZD1mYWxzZTskKCcjY2FuY2VsSW1wb3J0JykuZGlzYWJsZWQ9ZmFsc2V9CiB9Owp9CiQoJyNmaWxlJykub25jaGFuZ2U9YXN5bmMgZT0+e2NvbnN0IGZpbGU9ZS50YXJnZXQuZmlsZXNbMF07aWYoIWZpbGUpcmV0dXJuOyQoJyNzdGF0dXMnKS50ZXh0Q29udGVudD0nTGV5ZW5kbyB5IHZhbGlkYW5kbyAnK2ZpbGUubmFtZSsn4oCmJzt0cnl7c2hvd0ltcG9ydFByZXZpZXcoYXdhaXQgcmVhZFhsc3goZmlsZSkpOyQoJyNzdGF0dXMnKS50ZXh0Q29udGVudD0nQXJjaGl2byB2YWxpZGFkby4gUmV2aXNhIHkgY29uZmlybWEgbGEgYWN0dWFsaXphY2nDs24uJ31jYXRjaChlcnIpeyQoJyNzdGF0dXMnKS50ZXh0Q29udGVudD0nTm8gc2UgbW9kaWZpY2Fyb24gbG9zIGRhdG9zOiAnK2Vyci5tZXNzYWdlfWZpbmFsbHl7ZS50YXJnZXQudmFsdWU9Jyd9fTsKCmNvbnN0IHRhYnNWMz1bJ1Jlc3VtZW4nLCdDb21wYXJhdGl2b3MnLCdFdm9sdWNpw7NuJywnUmF0aW9zJywnUmVwb3J0ZSBzZW1hbmFsJywnUmVwb3J0ZSBtZW5zdWFsJywnRXZvbHV0aXZvIG1lbnN1YWwnLCdPdHJvcyBpbmZvcm1lcycsJ01ldG9kb2xvZ8OtYSddOwpmb3IoY29uc3Qga2V5IG9mIFsnd2Vla2x5JywnbW9udGhseScsJ21vbnRobHlFdm9sdXRpb24nLCdleHRyYSddKXZpZXdTdGF0ZVtrZXldPz89e2ZpbHRlcnM6e30sbGltaXQ6JzEyJyxraW5kOidzYWxvbid9OwpmdW5jdGlvbiByZXBvcnRQZXJpb2Qocix0eXBlKXtyZXR1cm4gdHlwZT09PSd3ZWVrJz9yWzBdLnNsaWNlKDAsNCkrJyDCtyBTJytTdHJpbmcoclszMF0pLnBhZFN0YXJ0KDIsJzAnKTpyWzBdLnNsaWNlKDAsNyl9CmZ1bmN0aW9uIHByZWZlcmVuY2lhbChyKXtyZXR1cm4gaGVhZGVyS2V5KHJbNV0pLmluY2x1ZGVzKCdwcmVmZXJlbmNpYWwnKXx8aGVhZGVyS2V5KHJbN10pLmluY2x1ZGVzKCdwcmVmZXJlbmNpYWwnKX0KZnVuY3Rpb24gcmVwb3J0U2VyaWVzKHJvd3MsdHlwZSl7cmV0dXJuIGdyb3Vwcyhyb3dzLHI9PnJlcG9ydFBlcmlvZChyLHR5cGUpKS5zb3J0KChhLGIpPT5hLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKX0KZnVuY3Rpb24gcmVwb3J0VGFibGUobGlzdCxjb2xzLHBlcmlvZExhYmVsPSdQZXLDrW9kbycpewogcmV0dXJuIGA8ZGl2IGNsYXNzPSJ0YWJsZXdyYXAiPjx0YWJsZT48dGhlYWQ+PHRyPjx0aD4ke3BlcmlvZExhYmVsfTwvdGg+PHRoPkNvYmVydHVyYTwvdGg+JHtjb2xzLm1hcChrPT5gPHRoPiR7bWV0cmljc1trXX08L3RoPmApLmpvaW4oJycpfTwvdHI+PC90aGVhZD48dGJvZHk+JHtsaXN0Lm1hcCh4PT5gPHRyPjx0ZD4ke2VzYyh4Lm5hbWUpfTwvdGQ+PHRkPiR7Y292ZXJhZ2VMYWJlbCh4LnJvd3MpfTwvdGQ+JHtjb2xzLm1hcChrPT5gPHRkPiR7Zm10KHhba10sayl9PC90ZD5gKS5qb2luKCcnKX08L3RyPmApLmpvaW4oJycpfTwvdGJvZHk+PC90YWJsZT48L2Rpdj5gOwp9CmZ1bmN0aW9uIGNvdmVyYWdlTGFiZWwocm93cyl7aWYoIXJvd3MubGVuZ3RoKXJldHVybiAnU2luIGRhdG9zJztsZXQgZGF0ZXM9Wy4uLm5ldyBTZXQocm93cy5tYXAocj0+clswXSkpXS5zb3J0KCksbW9udGhzPW5ldyBTZXQoZGF0ZXMubWFwKGQ9PmQuc2xpY2UoMCw3KSkpO2lmKG1vbnRocy5zaXplPT09MSl7bGV0W3ksbV09ZGF0ZXNbMF0uc3BsaXQoJy0nKS5tYXAoTnVtYmVyKSxkYXlzPW5ldyBEYXRlKERhdGUuVVRDKHksbSwwKSkuZ2V0VVRDRGF0ZSgpO3JldHVybiBgJHtkYXRlcy5sZW5ndGh9IGTDrWFzIHJlZ2lzdHJhZG9zYH1yZXR1cm4gYCR7ZGF0ZXMubGVuZ3RofSBkw61hcyByZWdpc3RyYWRvc2B9CmZ1bmN0aW9uIGNvbWJpbmVkQ2hhcnQocG9pbnRzLGZpcnN0LHNlY29uZCl7CiBjb25zdCB2YWxpZD1wb2ludHMuZmlsdGVyKHA9PnBbZmlyc3RdIT1udWxsfHxwW3NlY29uZF0hPW51bGwpO2lmKCF2YWxpZC5sZW5ndGgpcmV0dXJuICc8cD5TaW4gZGF0b3MuPC9wPic7CiBjb25zdCBsZWZ0PXZhbGlkLm1hcChwPT5wW2ZpcnN0XSkuZmlsdGVyKHY9PnYhPW51bGwpLHJpZ2h0PXZhbGlkLm1hcChwPT5wW3NlY29uZF0pLmZpbHRlcih2PT52IT1udWxsKTsKIGNvbnN0IGxvMT1NYXRoLm1pbigwLC4uLmxlZnQpLGhpMT1NYXRoLm1heCgxLC4uLmxlZnQpLGxvMj1NYXRoLm1pbigwLC4uLnJpZ2h0KSxoaTI9TWF0aC5tYXgoMC4wMDAwMDEsLi4ucmlnaHQpLHg9aT0+NDUraS9NYXRoLm1heCgxLHZhbGlkLmxlbmd0aC0xKSo0OTA7CiBjb25zdCB5MT12PT4xODUtKHYtbG8xKS8oaGkxLWxvMXx8MSkqMTMwLHkyPXY9PjE4NS0odi1sbzIpLyhoaTItbG8yfHwxKSoxMzA7CiByZXR1cm4gYDxkaXYgY2xhc3M9ImR1YWxMZWdlbmQiPjxzcGFuPuKXjyBJenF1aWVyZGE6ICR7bWV0cmljc1tmaXJzdF19PC9zcGFuPjxzcGFuPuKXjyBEZXJlY2hhOiAke21ldHJpY3Nbc2Vjb25kXX08L3NwYW4+PC9kaXY+PHN2ZyB2aWV3Qm94PSIwIDAgNjAwIDI0MCIgYXJpYS1sYWJlbD0iJHttZXRyaWNzW2ZpcnN0XX0geSAke21ldHJpY3Nbc2Vjb25kXX0sIGVqZXMgaW5kZXBlbmRpZW50ZXMiIHJvbGU9ImltZyI+PGxpbmUgeDE9IjQ1IiB5MT0iMTg1IiB4Mj0iNTM1IiB5Mj0iMTg1IiBzdHJva2U9IiNkOWUzZWIiLz48dGV4dCB4PSIxNSIgeT0iMzUiIGZvbnQtc2l6ZT0iMTAiIGZpbGw9IiMxNzM2NTIiPiR7Y29tcGFjdChoaTEsZmlyc3QpfTwvdGV4dD48dGV4dCB4PSI1ODAiIHk9IjM1IiB0ZXh0LWFuY2hvcj0iZW5kIiBmb250LXNpemU9IjEwIiBmaWxsPSIjMTM4ZjkzIj4ke2NvbXBhY3QoaGkyLHNlY29uZCl9PC90ZXh0Pjxwb2x5bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiMxNzM2NTIiIHN0cm9rZS13aWR0aD0iMi41IiBwb2ludHM9IiR7dmFsaWQuZmlsdGVyKHA9PnBbZmlyc3RdIT1udWxsKS5tYXAocD0+YCR7eCh2YWxpZC5pbmRleE9mKHApKX0sJHt5MShwW2ZpcnN0XSl9YCkuam9pbignICcpfSIvPjxwb2x5bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiMxMzhmOTMiIHN0cm9rZS13aWR0aD0iMi41IiBwb2ludHM9IiR7dmFsaWQuZmlsdGVyKHA9PnBbc2Vjb25kXSE9bnVsbCkubWFwKHA9PmAke3godmFsaWQuaW5kZXhPZihwKSl9LCR7eTIocFtzZWNvbmRdKX1gKS5qb2luKCcgJyl9Ii8+JHt2YWxpZC5tYXAoKHAsaSk9PmAke3BbZmlyc3RdPT1udWxsPycnOmA8Y2lyY2xlIGN4PSIke3goaSl9IiBjeT0iJHt5MShwW2ZpcnN0XSl9IiByPSIzIiBmaWxsPSIjMTczNjUyIj48dGl0bGU+JHtlc2MocC5uYW1lKX0gwrcgJHttZXRyaWNzW2ZpcnN0XX06ICR7Zm10KHBbZmlyc3RdLGZpcnN0KX08L3RpdGxlPjwvY2lyY2xlPmB9JHtwW3NlY29uZF09PW51bGw/Jyc6YDxjaXJjbGUgY3g9IiR7eChpKX0iIGN5PSIke3kyKHBbc2Vjb25kXSl9IiByPSIzIiBmaWxsPSIjMTM4ZjkzIj48dGl0bGU+JHtlc2MocC5uYW1lKX0gwrcgJHttZXRyaWNzW3NlY29uZF19OiAke2ZtdChwW3NlY29uZF0sc2Vjb25kKX08L3RpdGxlPjwvY2lyY2xlPmB9YCkuam9pbignJyl9PHRleHQgeD0iNDUiIHk9IjIyMCIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzcxODY5NCI+JHtlc2ModmFsaWRbMF0ubmFtZSl9PC90ZXh0Pjx0ZXh0IHg9IjUzNSIgeT0iMjIwIiB0ZXh0LWFuY2hvcj0iZW5kIiBmb250LXNpemU9IjExIiBmaWxsPSIjNzE4Njk0Ij4ke2VzYyh2YWxpZC5hdCgtMSkubmFtZSl9PC90ZXh0Pjwvc3ZnPmA7Cn0KZnVuY3Rpb24gZ3JhcGhDYXJkKHRpdGxlLGh0bWwsbm90ZT0nJyl7cmV0dXJuIGA8ZGl2IGNsYXNzPSJjYXJkIj48aDI+JHt0aXRsZX08L2gyPiR7bm90ZT9gPGRpdiBjbGFzcz0ic3VidGl0bGUiPiR7bm90ZX08L2Rpdj5gOicnfSR7aHRtbH08L2Rpdj5gfQpmdW5jdGlvbiByZXBvcnRGaWx0ZXJzKGtleSxleHRyYT0nJyl7CiBjb25zdCBzPXZpZXdTdGF0ZVtrZXldO3JldHVybiBgPHNlY3Rpb24gY2xhc3M9ImNhcmQiPjxkaXYgY2xhc3M9ImZpbHRlcmdyaWQiPiR7ZmlsdGVyRmllbGRzKHMsa2V5LFsyLDMsNSw3LDksMSw4LDRdKX08L2Rpdj48ZGl2IGNsYXNzPSJ2aWV3Y29udHJvbHMiPiR7c2VsZWN0b3IoJ01vc3RyYXIgcGVyw61vZG9zJywncmVwb3J0TGltaXQnLHMubGltaXQsezY6J8OabHRpbW9zIDYnLDEyOifDmmx0aW1vcyAxMicsMjQ6J8OabHRpbW9zIDI0JyxhbGw6J1RvZG9zIGVuIGxhcyBmZWNoYXMnfSl9JHtleHRyYX08L2Rpdj48L3NlY3Rpb24+YDsKfQpmdW5jdGlvbiBiaW5kUmVwb3J0KGtleSl7YmluZEZpbHRlcnMoKTskKCcjcmVwb3J0TGltaXQnKS5vbmNoYW5nZT1lPT57dmlld1N0YXRlW2tleV0ubGltaXQ9ZS50YXJnZXQudmFsdWU7cmVuZGVyKCl9fQpmdW5jdGlvbiBwZXJpb2RSZXBvcnRzKHR5cGUpewogY29uc3Qga2V5PXR5cGU9PT0nd2Vlayc/J3dlZWtseSc6J21vbnRobHknLHM9dmlld1N0YXRlW2tleV0scm93cz1zbGljZVJvd3Mocy5maWx0ZXJzKSxhbGw9cmVwb3J0U2VyaWVzKHJvd3MsdHlwZSksbGlzdD1zLmxpbWl0PT09J2FsbCc/YWxsOmFsbC5zbGljZSgtTnVtYmVyKHMubGltaXQpKTsKIGNvbnN0IHBlcmlvZHM9bmV3IFNldChsaXN0Lm1hcCh4PT54Lm5hbWUpKSx2aXNpYmxlPXJvd3MuZmlsdGVyKHI9PnBlcmlvZHMuaGFzKHJlcG9ydFBlcmlvZChyLHR5cGUpKSksdG90YWw9YWdnKHZpc2libGUpLHNhbG9uPXJlcG9ydFNlcmllcyh2aXNpYmxlLmZpbHRlcihwcmVmZXJlbmNpYWwpLHR5cGUpOwogY29uc3QgYWxpZ25lZD1zYWxvbi5tYXAocD0+KHsuLi5wfSkpO2NvbnN0IGNvbHM9Wyd3aW4nLCdjb2luJywnc3BpbicsJ2JldCcsJ3BvJywncG9uJywnZGV2JywncHJvbW8nLCdwcml6ZSddOwogZXhwb3J0Um93cz1bWydQZXLDrW9kbycsJ0TDrWFzIHJlZ2lzdHJhZG9zJywuLi5jb2xzLm1hcChrPT5tZXRyaWNzW2tdKV0sLi4ubGlzdC5tYXAocD0+W3AubmFtZSxuZXcgU2V0KHAucm93cy5tYXAocj0+clswXSkpLnNpemUsLi4uY29scy5tYXAoaz0+cFtrXT8/JycpXSldOwogY29uc3QgY2hhcnRzPVtncmFwaENhcmQoJ1dpbiB5IHBheW91dCcsY29tYmluZWRDaGFydChsaXN0LCd3aW4nLCdwbycpLCdDTFAgeSAlIMK3IEVqZXMgaW5kZXBlbmRpZW50ZXMnKSxncmFwaENhcmQoJ0NvaW4gSW4geSBhcHVlc3RhIHByb21lZGlvJyxjb21iaW5lZENoYXJ0KGxpc3QsJ2NvaW4nLCdiZXQnKSwnQ0xQIMK3IEVqZXMgaW5kZXBlbmRpZW50ZXMnKSxncmFwaENhcmQoJ1BheW91dCB5IGRlc3ZpYWNpw7NuIE5DQycsY29tYmluZWRDaGFydChsaXN0LCdwbycsJ2RldicpLCclIMK3IEVqZXMgaW5kZXBlbmRpZW50ZXMnKSxncmFwaENhcmQoJ1BheW91dCB5IHBheW91dCBjb24gTkNDJyxjaGFydFYyKFt7bmFtZTonUGF5b3V0Jyxwb2ludHM6bGlzdH0se25hbWU6J1BheW91dCBOQ0MnLHBvaW50czpsaXN0Lm1hcChwPT4oey4uLnAscG86cC5wb259KSl9XSwncG8nKSksZ3JhcGhDYXJkKCdQcm9tbyBuZXRhIHkgZGVzdmlhY2nDs24gTkNDJyxjb21iaW5lZENoYXJ0KGxpc3QsJ3Byb21vJywnZGV2JyksJ0NMUCB5ICUgwrcgRWplcyBpbmRlcGVuZGllbnRlcycpLGdyYXBoQ2FyZCgnUHJlbWlvcycsY2hhcnRWMihbe25hbWU6J1ByZW1pb3MnLHBvaW50czpsaXN0fV0sJ3ByaXplJykpXTsKIGNoYXJ0cy5wdXNoKGdyYXBoQ2FyZCgnV2luIHkgZGVzdmlhY2nDs24gTkNDJyxjb21iaW5lZENoYXJ0KGxpc3QsJ3dpbicsJ2RldicpLCdDTFAgeSAlIMK3IEVqZXMgaW5kZXBlbmRpZW50ZXMnKSk7CiBpZih0eXBlPT09J3dlZWsnKWNoYXJ0cy5wdXNoKGdyYXBoQ2FyZCgnV2luIMK3IFNlbGVjY2nDs24geSBzYWzDs24gcHJlZmVyZW5jaWFsJyxjaGFydFYyKFt7bmFtZTonU2VsZWNjacOzbiBjb21wbGV0YScscG9pbnRzOmxpc3R9LHtuYW1lOidQcmVmZXJlbmNpYWwgZGVudHJvIGRlIHNlbGVjY2nDs24nLHBvaW50czphbGlnbmVkfV0sJ3dpbicpLCdFbCBzYWzDs24gZXMgcGFydGUgZGVsIHRvdGFsOyBubyBzdW1hciBhbWJhcyBsw61uZWFzLicpLGdyYXBoQ2FyZCgnQ29pbiBJbiDCtyBTZWxlY2Npw7NuIHkgc2Fsw7NuIHByZWZlcmVuY2lhbCcsY2hhcnRWMihbe25hbWU6J1NlbGVjY2nDs24gY29tcGxldGEnLHBvaW50czpsaXN0fSx7bmFtZTonUHJlZmVyZW5jaWFsIGRlbnRybyBkZSBzZWxlY2Npw7NuJyxwb2ludHM6YWxpZ25lZH1dLCdjb2luJyksJ0VsIHNhbMOzbiBlcyBwYXJ0ZSBkZWwgdG90YWw7IG5vIHN1bWFyIGFtYmFzIGzDrW5lYXMuJykpOwogJCgnI2NvbnRlbnQnKS5pbm5lckhUTUw9YmFubmVyKHR5cGU9PT0nd2Vlayc/J1JlcG9ydGUgc2VtYW5hbCc6J1JlcG9ydGUgbWVuc3VhbCcsJ0luZGljYWRvcmVzIHkgY29tYmluYWNpb25lcyBkZSBncsOhZmljb3MgYmFzYWRvcyBlbiBsYXMgcGVzdGHDsWFzIFJlcG9ydGUgU2VtYW5hIHkgUmVwb3J0ZSBNZXMuIExvcyBwZXLDrW9kb3MgeSB2YWxvcmVzIHNlIHJlY2FsY3VsYW4gY29uIHR1IGhpc3TDs3JpY28uJykrcmVwb3J0RmlsdGVycyhrZXkpK3N0YXRDYXJkcyhbWydXSU4nLGNvbXBhY3QodG90YWwud2luLCd3aW4nKSwnQ0xQIMK3IFBlcsOtb2RvcyBtb3N0cmFkb3MnXSxbJ0NPSU4gSU4nLGNvbXBhY3QodG90YWwuY29pbiwnY29pbicpLCdDTFAgwrcgUGVyw61vZG9zIG1vc3RyYWRvcyddLFsnUEFZT1VUJyxmbXQodG90YWwucG8sJ3BvJyksJ0NhbGN1bGFkbyBzb2JyZSB0b3RhbGVzJ10sWydBUFVFU1RBIFBST01FRElPJyxmbXQodG90YWwuYmV0KSwnQ0xQIHBvciBzcGluJ11dKStgPGRpdiBjbGFzcz0ibm90aWNlIj4ke3R5cGU9PT0nd2Vlayc/J1NlbWFuYSBkZSBFeGNlbCBXRUVLTlVNKGZlY2hhLDIpLCBjb24gbHVuZXMgY29tbyBpbmljaW8uJzonTWVzIGNhbGVuZGFyaW8uJ30gTGFzIHRhYmxhcyBpbmNsdXllbiBzb2xvIGZlY2hhcyBwcmVzZW50ZXMgZW4gZWwgaGlzdMOzcmljbyB5IGVuIHR1IHNlbGVjY2nDs24uIExvcyBwZXLDrW9kb3MgY29uIG1lbm9zIGTDrWFzIHB1ZWRlbiBlc3RhciBpbmNvbXBsZXRvczsgdXNhIGxvcyBpbmRpY2Fkb3JlcyBkaWFyaW9zIHBhcmEgY29tcGFyYXJsb3MuPC9kaXY+PGRpdiBjbGFzcz0icmVwb3J0Y2hhcnRzIj4ke2NoYXJ0cy5qb2luKCcnKX08L2Rpdj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+RGV0YWxsZSAke3R5cGU9PT0nd2Vlayc/J3NlbWFuYWwnOidtZW5zdWFsJ308L2gyPiR7cmVwb3J0VGFibGUobGlzdCxjb2xzKX08L2Rpdj5gOwogYmluZFJlcG9ydChrZXkpOwp9CmZ1bmN0aW9uIG1vbnRobHlFdm9sdXRpb25SZXBvcnQoKXsKIGNvbnN0IHM9dmlld1N0YXRlLm1vbnRobHlFdm9sdXRpb24scm93cz1zbGljZVJvd3Mocy5maWx0ZXJzKSxhbGw9cmVwb3J0U2VyaWVzKHJvd3MsJ21vbnRoJyksbGlzdD1zLmxpbWl0PT09J2FsbCc/YWxsOmFsbC5zbGljZSgtTnVtYmVyKHMubGltaXQpKSxwZXJpb2RzPW5ldyBTZXQobGlzdC5tYXAocD0+cC5uYW1lKSksdmlzaWJsZT1yb3dzLmZpbHRlcihyPT5wZXJpb2RzLmhhcyhyZXBvcnRQZXJpb2QociwnbW9udGgnKSkpLGJhc2U9YWdnKHZpc2libGUpOwogY29uc3QgcGxhdGZvcm1zPWdyb3Vwcyh2aXNpYmxlLHI9PlN0cmluZyhyWzNdPz8nU2luIGRhdG8nKSkuc29ydCgoYSxiKT0+Yi5jZC1hLmNkKTsKIGNvbnN0IGNvbHM9WydjZCcsJ3dkJywnc2QnLCdiZXQnLCdwbycsJ2RldicsJ3Byb21vJywnd2luJywnY29pbiddOwogZXhwb3J0Um93cz1bWydNZXMnLC4uLmNvbHMubWFwKGs9Pm1ldHJpY3Nba10pXSwuLi5saXN0Lm1hcChwPT5bcC5uYW1lLC4uLmNvbHMubWFwKGs9PnBba10/PycnKV0pXTsKICQoJyNjb250ZW50JykuaW5uZXJIVE1MPWJhbm5lcignRXZvbHV0aXZvIG1lbnN1YWwnLCdTZWd1aW1pZW50byBtZW5zdWFsIGRlbCBDb2luIEluLCBXaW4geSBzcGlucyBwb3IgbcOhcXVpbmEtZMOtYSwgY29uIGNvbXBhcmFjacOzbiBkZSBwbGF0YWZvcm1hcyBmcmVudGUgYWwgcHJvbWVkaW8gZGUgbGEgc2VsZWNjacOzbi4nKStyZXBvcnRGaWx0ZXJzKCdtb250aGx5RXZvbHV0aW9uJykrYDxkaXYgY2xhc3M9InJlcG9ydGNoYXJ0cyI+JHtncmFwaENhcmQoJ0NvaW4gSW4gcG9yIG3DoXF1aW5hLWTDrWEnLGNoYXJ0VjIoW3tuYW1lOidTZWxlY2Npw7NuJyxwb2ludHM6bGlzdH1dLCdjZCcpKX0ke2dyYXBoQ2FyZCgnV2luIHBvciBtw6FxdWluYS1kw61hJyxjaGFydFYyKFt7bmFtZTonU2VsZWNjacOzbicscG9pbnRzOmxpc3R9XSwnd2QnKSl9JHtncmFwaENhcmQoJ1NwaW5zIHBvciBtw6FxdWluYS1kw61hJyxjaGFydFYyKFt7bmFtZTonU2VsZWNjacOzbicscG9pbnRzOmxpc3R9XSwnc2QnKSl9JHtncmFwaENhcmQoJ0FwdWVzdGEgcHJvbWVkaW8geSBwYXlvdXQnLGNvbWJpbmVkQ2hhcnQobGlzdCwnYmV0JywncG8nKSwnQ0xQIHkgJSDCtyBFamVzIGluZGVwZW5kaWVudGVzJyl9PC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPkluZGljYWRvcmVzIG1lbnN1YWxlczwvaDI+JHtyZXBvcnRUYWJsZShsaXN0LGNvbHMsJ01lcycpfTwvZGl2PjxkaXYgY2xhc3M9ImNhcmQiPjxoMj5QbGF0YWZvcm1hcyBmcmVudGUgYSBsYSBzZWxlY2Npw7NuPC9oMj48ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+VmFyaWFjacOzbiA9IGluZGljYWRvciBkZSBsYSBwbGF0YWZvcm1hIC8gaW5kaWNhZG9yIGRlIGxhIHNlbGVjY2nDs24g4oiSIDEuIE1pc21hcyBmZWNoYXMuPC9kaXY+PGRpdiBjbGFzcz0idGFibGV3cmFwIj48dGFibGU+PHRoZWFkPjx0cj48dGg+UGxhdGFmb3JtYTwvdGg+PHRoPkNvaW4gSW4gLyBkw61hPC90aD48dGg+VmFyaWFjacOzbiBDSTwvdGg+PHRoPldpbiAvIGTDrWE8L3RoPjx0aD5WYXJpYWNpw7NuIFdpbjwvdGg+PHRoPlNwaW5zIC8gZMOtYTwvdGg+PHRoPlZhcmlhY2nDs24gc3BpbnM8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+JHtwbGF0Zm9ybXMubWFwKHA9PmA8dHI+PHRkPiR7ZXNjKHAubmFtZSl9PC90ZD4ke1snY2QnLCd3ZCcsJ3NkJ10ubWFwKGs9PmA8dGQ+JHtmbXQocFtrXSl9PC90ZD48dGQ+JHshYmFzZVtrXT8n4oCUJzooKHBba10vYmFzZVtrXS0xKSoxMDApLnRvTG9jYWxlU3RyaW5nKCdlcy1DTCcse21heGltdW1GcmFjdGlvbkRpZ2l0czoxfSkrJyUnfTwvdGQ+YCkuam9pbignJyl9PC90cj5gKS5qb2luKCcnKX08L3Rib2R5PjwvdGFibGU+PC9kaXY+PC9kaXY+YDsKIGJpbmRSZXBvcnQoJ21vbnRobHlFdm9sdXRpb24nKTsKfQpmdW5jdGlvbiBleHRyYVJlcG9ydHMoKXsKIGNvbnN0IHM9dmlld1N0YXRlLmV4dHJhLHJvd3M9c2xpY2VSb3dzKHMuZmlsdGVycyk7bGV0IGNvbnRlbnQ9JycsZXhwb3J0RGF0YT1bXTsKIGlmKHMua2luZD09PSd3aW5sb3NlJyl7CiAgY29uc3QgbWFjaGluZXM9Z3JvdXBzKHJvd3Mscj0+U3RyaW5nKHJbMV0/PydTaW4gZGF0bycpKSx3aW5zPW1hY2hpbmVzLmZpbHRlcihwPT5wLndpbj49MCkuc29ydCgoYSxiKT0+Yi53aW4tYS53aW4pLGxvc3Nlcz1tYWNoaW5lcy5maWx0ZXIocD0+cC53aW48MCkuc29ydCgoYSxiKT0+YS53aW4tYi53aW4pLGNvbHM9Wyd3aW4nLCdwbycsJ3BvbicsJ2RldicsJ3ByaXplJywncHJvbW8nXTsKICBjb25zdCBkZXRhaWw9aXRlbXM9PmA8ZGl2IGNsYXNzPSJ0YWJsZXdyYXAiPjx0YWJsZT48dGhlYWQ+PHRyPjx0aD5Nw6FxdWluYSAvIE1vZGVsbzwvdGg+JHtjb2xzLm1hcChrPT5gPHRoPiR7bWV0cmljc1trXX08L3RoPmApLmpvaW4oJycpfTwvdHI+PC90aGVhZD48dGJvZHk+JHtpdGVtcy5tYXAocD0+YDx0cj48dGQ+JHtlc2MocC5uYW1lKX0gwrcgJHtlc2MocC5yb3dzLmF0KC0xKT8uWzRdKX08L3RkPiR7Y29scy5tYXAoaz0+YDx0ZD4ke2ZtdChwW2tdLGspfTwvdGQ+YCkuam9pbignJyl9PC90cj5gKS5qb2luKCcnKX08L3Rib2R5PjwvdGFibGU+PC9kaXY+YDsKICBjb250ZW50PWA8ZGl2IGNsYXNzPSJjaGFydHMiPiR7Z3JhcGhDYXJkKCdNYXlvciBXaW4gb3BlcmFjaW9uYWwnLGJhcnNWMih3aW5zLnNsaWNlKDAsMTApLCd3aW4nKSl9JHtncmFwaENhcmQoJ01lbm9yIFdpbiBvcGVyYWNpb25hbCcsYmFyc1YyKGxvc3Nlcy5zbGljZSgwLDEwKSwnd2luJykpfTwvZGl2PjxkaXYgY2xhc3M9ImNhcmQiPjxoMj5XaW4gcG9zaXRpdm8gbyBjZXJvIMK3ICR7d2lucy5sZW5ndGh9IG3DoXF1aW5hczwvaDI+JHtkZXRhaWwod2lucyl9PC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPldpbiBuZWdhdGl2byDCtyAke2xvc3Nlcy5sZW5ndGh9IG3DoXF1aW5hczwvaDI+JHtkZXRhaWwobG9zc2VzKX08L2Rpdj5gOwogIGV4cG9ydERhdGE9W1snTcOhcXVpbmEnLC4uLmNvbHMubWFwKGs9Pm1ldHJpY3Nba10pXSwuLi5tYWNoaW5lcy5tYXAocD0+W3AubmFtZSwuLi5jb2xzLm1hcChrPT5wW2tdPz8nJyldKV07CiB9ZWxzZSBpZihzLmtpbmQ9PT0nc2Fsb24nKXsKICBjb25zdCBwcmVmPXJvd3MuZmlsdGVyKHByZWZlcmVuY2lhbCksbW9udGhzPXJlcG9ydFNlcmllcyhwcmVmLCdtb250aCcpLHdlZWtzPXJlcG9ydFNlcmllcyhwcmVmLCd3ZWVrJyksYT1hZ2cocHJlZik7CiAgY29udGVudD1zdGF0Q2FyZHMoW1snV0lOIFBSRUZFUkVOQ0lBTCcsY29tcGFjdChhLndpbiwnd2luJyksJ0NMUCddLFsnQ09JTiBJTiBQUkVGRVJFTkNJQUwnLGNvbXBhY3QoYS5jb2luLCdjb2luJyksJ0NMUCddLFsnQ09JTiBJTiAvIETDjUEnLGZtdChhLmNkKSwnUG9yIG3DoXF1aW5hLWTDrWEgcmVnaXN0cmFkbyddLFsnV0lOIC8gRMONQScsZm10KGEud2QpLCdQb3IgbcOhcXVpbmEtZMOtYSByZWdpc3RyYWRvJ11dKStgPGRpdiBjbGFzcz0iY2hhcnRzIj4ke2dyYXBoQ2FyZCgnU2VndWltaWVudG8gc2VtYW5hbCDCtyBDb2luIEluIHBvciBkw61hJyxjaGFydFYyKFt7bmFtZTonUHJlZmVyZW5jaWFsJyxwb2ludHM6d2Vla3N9XSwnY2QnKSl9JHtncmFwaENhcmQoJ1NlZ3VpbWllbnRvIHNlbWFuYWwgwrcgV2luIHBvciBkw61hJyxjaGFydFYyKFt7bmFtZTonUHJlZmVyZW5jaWFsJyxwb2ludHM6d2Vla3N9XSwnd2QnKSl9PC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPkV2b2x1dGl2byBtZW5zdWFsIGRlbCBzYWzDs24gcHJlZmVyZW5jaWFsPC9oMj4ke3JlcG9ydFRhYmxlKG1vbnRocyxbJ2NkJywnd2QnLCdzZCcsJ2JldCcsJ3BvJywncG9uJywnd2luJywnY29pbiddKX08L2Rpdj5gOwogIGV4cG9ydERhdGE9W1snTWVzJywnQ29pbiBJbiBwb3IgZMOtYScsJ1dpbiBwb3IgZMOtYScsJ1NwaW5zIHBvciBkw61hJ10sLi4ubW9udGhzLm1hcChwPT5bcC5uYW1lLHAuY2QscC53ZCxwLnNkXSldOwogfWVsc2UgaWYocy5raW5kPT09J3F1YWxpdHknKXsKICBjb25zdCBieURhdGU9bmV3IE1hcChncm91cHMoc2xpY2VSb3dzKCkscj0+clswXSkubWFwKHA9PltwLm5hbWUscF0pKSxjb250cm9scz0oZGF0YS5jb250cm9sc3x8W10pLmZpbHRlcihjPT5hY2NlcHRzQ2FsZW5kYXJWOChbYy5kYXRlXSxjYWxlbmRhclN0YXRlVjgoJ2dsb2JhbCcpLCQoJyNmcm9tJykudmFsdWUsJCgnI3RvJykudmFsdWUpKSxkZXRhaWxzPWNvbnRyb2xzLm1hcChjPT4oe2RhdGU6Yy5kYXRlLHNvdXJjZTpjLndpbixhY3R1YWw6YnlEYXRlLmdldChjLmRhdGUpPy53aW4/P251bGx9KSk7CiAgY29udGVudD1gPGRpdiBjbGFzcz0ibm90aWNlIj5Db25jaWxpYWNpw7NuIGNvbnRyYSBXSU4gZmluYWwgZGUgVVRJTElEQUQgUkVTVU1FTiBkZWwgYXJjaGl2byBXaW4gVGl0dG8uIFNlIGNvbnN1bHRhIHRvZG8gZWwgcGFycXVlIGVuIGxhcyBmZWNoYXMsIHNpbiBmaWx0cm9zIGRlIGNhdGVnb3LDrWFzLiBTb2xvIGhheSBjb250cm9sZXMgcGFyYSBmZWNoYXMgaW1wb3J0YWRhcyBkZXNkZSB1biBhcmNoaXZvIGNvbiBlc2EgcGVzdGHDsWEuIExvcyBjb250cm9sZXMgZGUgbGEgZnVlbnRlIHNlIGFqdXN0YW4gYSBsYSBtaXNtYSBwb2JsYWNpw7NuIGRlIHJlZ2lzdHJvcyBhcGxpY2FibGVzIHV0aWxpemFkYSBlbiBsb3MgaW5mb3JtZXMuPC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPkNvbmNpbGlhY2nDs24gZGlhcmlhPC9oMj48ZGl2IGNsYXNzPSJ0YWJsZXdyYXAiPjx0YWJsZT48dGhlYWQ+PHRyPjx0aD5GZWNoYTwvdGg+PHRoPldJTiBmdWVudGUgYWp1c3RhZG88L3RoPjx0aD5XaW4gYXBsaWNhYmxlIGRlIE1hdHJpejwvdGg+PHRoPkRpZmVyZW5jaWE8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+JHtkZXRhaWxzLm1hcChjPT5gPHRyPjx0ZD4ke2MuZGF0ZX08L3RkPjx0ZD4ke2ZtdChjLnNvdXJjZSl9PC90ZD48dGQ+JHtmbXQoYy5hY3R1YWwpfTwvdGQ+PHRkPiR7Yy5hY3R1YWw9PW51bGw/J1NpbiByZWdpc3Rybyc6Zm10KGMuYWN0dWFsLWMuc291cmNlKX08L3RkPjwvdHI+YCkuam9pbignJyl8fCc8dHI+PHRkIGNvbHNwYW49IjQiPlNpbiBjb250cm9sZXMgZGUgVVRJTElEQUQgUkVTVU1FTiBwYXJhIGVzdGFzIGZlY2hhcy48L3RkPjwvdHI+J308L3Rib2R5PjwvdGFibGU+PC9kaXY+PC9kaXY+YDsKICBleHBvcnREYXRhPVtbJ0ZlY2hhJywnV0lOIGZ1ZW50ZSBhanVzdGFkbycsJ1dpbiBNYXRyaXonLCdEaWZlcmVuY2lhJ10sLi4uZGV0YWlscy5tYXAoYz0+W2MuZGF0ZSxjLnNvdXJjZSxjLmFjdHVhbCxjLmFjdHVhbD09bnVsbD8nJzpjLmFjdHVhbC1jLnNvdXJjZV0pXTsKIH1lbHNlewogIGNvbnN0IGRpbT1zLmtpbmQ9PT0nYnJhbmRzJz8yOjMsbGlzdD1ncm91cHMocm93cyxyPT5TdHJpbmcocltkaW1dPz8nU2luIGRhdG8nKSkuc29ydCgoYSxiKT0+Yi5jZC1hLmNkKSxjb2xzPVsnY2QnLCd3ZCcsJ2JldCcsJ3BvJywncG9uJywncHJvbW8nLCd3aW4nLCdjb2luJywnc2QnXTsKICBjb250ZW50PWA8ZGl2IGNsYXNzPSJjaGFydHMiPiR7Z3JhcGhDYXJkKCdDb2luIEluIHBvciBtw6FxdWluYS1kw61hJyxiYXJzVjIobGlzdC5zbGljZSgwLDEyKSwnY2QnKSl9JHtncmFwaENhcmQoJ1dpbiBwb3IgbcOhcXVpbmEtZMOtYScsYmFyc1YyKFsuLi5saXN0XS5zb3J0KChhLGIpPT5iLndkLWEud2QpLnNsaWNlKDAsMTIpLCd3ZCcpKX08L2Rpdj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+UmVuZGltaWVudG8gcG9yICR7ZGltPT09Mj8nZmFicmljYW50ZSc6J3BsYXRhZm9ybWEnfTwvaDI+JHtyZXBvcnRUYWJsZShsaXN0LGNvbHMsZGltc1tkaW1dKX08L2Rpdj48cCBjbGFzcz0ic3VidGl0bGUiPkVsIGFyY2hpdm8gV2luIFRpdHRvIG5vIGluY2x1eWUgYcOxbyBkZSBmYWJyaWNhY2nDs246IG5vIHNlIGluZmllcmUgYW50aWfDvGVkYWQgcGFyYSBsb3MgZ3LDoWZpY29zIGRlbCBwYXJxdWUgcG9yIGVkYWQuPC9wPmA7CiAgZXhwb3J0RGF0YT1bW2RpbXNbZGltXSwuLi5jb2xzLm1hcChrPT5tZXRyaWNzW2tdKV0sLi4ubGlzdC5tYXAocD0+W3AubmFtZSwuLi5jb2xzLm1hcChrPT5wW2tdPz8nJyldKV07CiB9CiBleHBvcnRSb3dzPWV4cG9ydERhdGE7CiAkKCcjY29udGVudCcpLmlubmVySFRNTD1iYW5uZXIoJ03DoXMgaW5mb3JtZXMgZGVsIEV4Y2VsJywnU2Fsw7NuIHByZWZlcmVuY2lhbCwgV2luIC8gTG9zZSwgZmFicmljYW50ZXMsIHBsYXRhZm9ybWFzIHkgY29uY2lsaWFjacOzbiBkZSBsYSBmdWVudGUuJykrYDxzZWN0aW9uIGNsYXNzPSJjYXJkIj48ZGl2IGNsYXNzPSJ2aWV3Y29udHJvbHMiPiR7c2VsZWN0b3IoJ0luZm9ybWUnLCdleHRyYUtpbmQnLHMua2luZCx7c2Fsb246J1NhbMOzbiBwcmVmZXJlbmNpYWwnLHdpbmxvc2U6J1dpbiAvIExvc2UgcG9yIG3DoXF1aW5hJyxicmFuZHM6J0ZhYnJpY2FudGVzJyxwbGF0Zm9ybXM6J1BsYXRhZm9ybWFzJyxxdWFsaXR5OidDb25jaWxpYWNpw7NuIGRlIFdpbiBUaXR0byd9KX08L2Rpdj4ke3Mua2luZD09PSdxdWFsaXR5Jz8nJzpgPGRpdiBjbGFzcz0iZmlsdGVyZ3JpZCI+JHtmaWx0ZXJGaWVsZHMocywnZXh0cmEnKX08L2Rpdj5gfTwvc2VjdGlvbj5gK2NvbnRlbnQ7CiBiaW5kRmlsdGVycygpOyQoJyNleHRyYUtpbmQnKS5vbmNoYW5nZT1lPT57cy5raW5kPWUudGFyZ2V0LnZhbHVlO3JlbmRlcigpfTsKfQpjb25zdCByZW5kZXJCZWZvcmVSZXBvcnRzPXJlbmRlcjsKcmVuZGVyPWZ1bmN0aW9uKCl7CiBpZighZGF0YSlyZXR1cm47CiBpZihbJ1JlcG9ydGUgc2VtYW5hbCcsJ1JlcG9ydGUgbWVuc3VhbCcsJ0V2b2x1dGl2byBtZW5zdWFsJywnT3Ryb3MgaW5mb3JtZXMnXS5pbmNsdWRlcyh0YWIpKXsKICAkKCcjZmlsdGVycycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOyQoJyNjb250cm9scycpLnN0eWxlLmRpc3BsYXk9J25vbmUnO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5maWx0ZXJzJykuc3R5bGUuZGlzcGxheT0nYmxvY2snO2RvY3VtZW50LmJvZHkuZGF0YXNldC52aWV3PXRhYjskKCcjdmlld0hlbHAnKS50ZXh0Q29udGVudD0nRmVjaGFzIGRlIGVzdGUgaW5mb3JtZS4nOyQoJyN0aXRsZScpLnRleHRDb250ZW50PXRhYjsKICBpZih0YWI9PT0nUmVwb3J0ZSBzZW1hbmFsJylwZXJpb2RSZXBvcnRzKCd3ZWVrJyk7ZWxzZSBpZih0YWI9PT0nUmVwb3J0ZSBtZW5zdWFsJylwZXJpb2RSZXBvcnRzKCdtb250aCcpO2Vsc2UgaWYodGFiPT09J0V2b2x1dGl2byBtZW5zdWFsJyltb250aGx5RXZvbHV0aW9uUmVwb3J0KCk7ZWxzZSBleHRyYVJlcG9ydHMoKTsKIH1lbHNle3JlbmRlckJlZm9yZVJlcG9ydHMoKTtpZih0YWI9PT0nTWV0b2RvbG9nw61hJykkKCcjY29udGVudCcpLmluc2VydEFkamFjZW50SFRNTCgnYWZ0ZXJiZWdpbicsJzxkaXYgY2xhc3M9Im5vdGljZSI+Q2FyZ2EgZGlyZWN0YTogV2luIFRpdHRvIG8gUmVwb3J0ZSBMQSDihpIgTWF0cml6LiBTZSBhc2lnbmFuIGNvbHVtbmFzIHBvciBlbmNhYmV6YWRvIHkgc2UgY2FsY3VsYW4gU2VtYW5hLCBNZXMgeSBkw61hLiBQb3IgZGVmZWN0bywgbG9zIGTDrWFzIHJlY2liaWRvcyByZWVtcGxhemFuIGVzb3MgZMOtYXMgZGVsIGhpc3TDs3JpY287IGxvcyBkZW3DoXMgc2UgY29uc2VydmFuLiBMb3MgaW5mb3JtZXMgdXNhbiByZWdpc3Ryb3MgZGVsIGhpc3TDs3JpY28sIG5vIHRhYmxhcyBkaW7DoW1pY2FzIGd1YXJkYWRhcy4gTG9zIGdyw6FmaWNvcyBjb21iaW5hZG9zIHRpZW5lbiBlamVzIGluZGVwZW5kaWVudGVzIHkgdW5pZGFkZXMgaW5kaWNhZGFzLiBObyBzZSByZXByb2R1Y2VuIHJlZmVyZW5jaWFzIGRlZmVjdHVvc2FzIGRlbCBFeGNlbCBuaSBzZSBpbnZlbnRhIGVsIGHDsW8gZGUgZmFicmljYWNpw7NuIHF1ZSBubyB0cmFlIFdpbiBUaXR0by48L2Rpdj4nKX0KfTsKJCgnI25hdicpLmlubmVySFRNTD10YWJzVjMubWFwKCh0LGkpPT5gPGJ1dHRvbiBkYXRhLXRhYj0iJHt0fSIgY2xhc3M9IiR7dD09PXRhYj8nYWN0aXZlJzonJ30iPiR7Wyfil6snLCfilqQnLCfihpcnLCfil44nLCfilqUnLCfilqYnLCfijIEnLCfilqMnLCfik5gnXVtpXX0gJm5ic3A7ICR7dH08L2J1dHRvbj5gKS5qb2luKCcnKTsKZnVuY3Rpb24gYWN0aXZhdGVUYWJWMyh0KXt0YWI9dDtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCduYXYgYnV0dG9uJykuZm9yRWFjaChiPT5iLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsYi5kYXRhc2V0LnRhYj09PXRhYikpO3JlbmRlcigpfQpkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCduYXYgYnV0dG9uJykuZm9yRWFjaChiPT5iLm9uY2xpY2s9KCk9PmFjdGl2YXRlVGFiVjMoYi5kYXRhc2V0LnRhYikpOwokKCcjdjJzYXZlJykub25jbGljaz1hc3luYygpPT57aWYoIWRhdGEpcmV0dXJuO2NvbnN0IG5hbWU9cHJvbXB0KCdOb21icmUgZGUgbGEgdmlzdGEnKTtpZighbmFtZSlyZXR1cm47bGV0IG5leHQ9Wy4uLnNhdmVkVmlld3Mse3ZlcnNpb246MyxuYW1lLHRhYixmcm9tOiQoJyNmcm9tJykudmFsdWUsdG86JCgnI3RvJykudmFsdWUsc3RhdGU6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2aWV3U3RhdGUpKX1dO3RyeXthd2FpdCBycGMoJ3NhdmVWaWV3cycsSlNPTi5zdHJpbmdpZnkobmV4dCkpO3NhdmVkVmlld3M9bmV4dDtsb2FkVmlld3MoKX1jYXRjaChlKXthbGVydCgnTm8gc2UgZ3VhcmTDszogJytlLm1lc3NhZ2UpfX07CmxvYWRWaWV3cz1mdW5jdGlvbigpeyQoJyN2MnZpZXdzJykuaW5uZXJIVE1MPSc8b3B0aW9uIHZhbHVlPSIiPlZpc3RhcyBndWFyZGFkYXM8L29wdGlvbj4nK3NhdmVkVmlld3MubWFwKCh2LGkpPT5gPG9wdGlvbiB2YWx1ZT0iJHtpfSI+JHtlc2Modi5uYW1lKX0ke3YudmVyc2lvbj49Mj8nJzonIChhbnRlcmlvciknfTwvb3B0aW9uPmApLmpvaW4oJycpfTsKJCgnI3Yydmlld3MnKS5vbmNoYW5nZT0oKT0+e2lmKCQoJyN2MnZpZXdzJykudmFsdWU9PT0nJylyZXR1cm47Y29uc3Qgdj1zYXZlZFZpZXdzWyQoJyN2MnZpZXdzJykudmFsdWVdO2lmKHYudmVyc2lvbjwyfHwhdi5zdGF0ZSl7YWxlcnQoJ0NyZWEgZGUgbnVldm8gZXN0YSB2aXN0YSBkZWwgZGlzZcOxbyBpbmljaWFsLicpO3JldHVybn1PYmplY3QuYXNzaWduKHZpZXdTdGF0ZSxKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHYuc3RhdGUpKSk7JCgnI2Zyb20nKS52YWx1ZT12LmZyb207JCgnI3RvJykudmFsdWU9di50bzthY3RpdmF0ZVRhYlYzKHYudGFiKX07CmNvbnN0IHJlc2V0QmVmb3JlUmVwb3J0cz0kKCcjcmVzZXQnKS5vbmNsaWNrOyQoJyNyZXNldCcpLm9uY2xpY2s9KCk9Pntjb25zdCBrZXk9eydSZXBvcnRlIHNlbWFuYWwnOid3ZWVrbHknLCdSZXBvcnRlIG1lbnN1YWwnOidtb250aGx5JywnRXZvbHV0aXZvIG1lbnN1YWwnOidtb250aGx5RXZvbHV0aW9uJywnT3Ryb3MgaW5mb3JtZXMnOidleHRyYSd9W3RhYl07aWYoa2V5KXt2aWV3U3RhdGVba2V5XS5maWx0ZXJzPXt9O2xldFttaW4sbWF4XT1kYXRlUmFuZ2UoKTskKCcjZnJvbScpLnZhbHVlPW1pbjskKCcjdG8nKS52YWx1ZT1tYXg7cmVuZGVyKCl9ZWxzZSByZXNldEJlZm9yZVJlcG9ydHMoKX07Ci8vIEFkanVzdG1lbnRzIGRvIG5vdCBhcHBlYXIgYXMgc2VsZWN0YWJsZSBtYWNoaW5lcywgYmFua3MsIHNlY3RvcnMgb3IgbWFudWZhY3R1cmVycy4KY29uc3Qgb3B0aW9uc0JlZm9yZVJlcG9ydHM9b3B0aW9uc0ZvcjsKb3B0aW9uc0Zvcj1mdW5jdGlvbihrKXtyZXR1cm4gWy4uLm5ldyBTZXQoZGF0YS5yb3dzLmZpbHRlcihyPT4haXNFeHBpcmVkKHJbNV0pJiYhaXNFeHBpcmVkKHJbN10pKS5tYXAocj0+U3RyaW5nKHJba10/PydTaW4gZGF0bycpKSldLmZpbHRlcih2PT4haXNFeHBpcmVkKHYpKS5zb3J0KChhLGIpPT5hLmxvY2FsZUNvbXBhcmUoYix1bmRlZmluZWQse251bWVyaWM6dHJ1ZX0pKX07CgpsZXQgY2hhcnRDb3VudGVyVjQ9MDsKY29uc3QgY2hhcnRQb2ludHNWND1uZXcgTWFwKCk7CmZ1bmN0aW9uIHBlcmlvZERlc2NyaXB0aW9uVjQobmFtZSxwb2ludHMpewogY29uc3Qgcm93cz1wb2ludHMuZmxhdE1hcChwPT5wLnJvd3N8fFtdKSxkYXRlcz1bLi4ubmV3IFNldChyb3dzLm1hcChyPT5yWzBdKSldLnNvcnQoKTsKIGlmKCFkYXRlcy5sZW5ndGgpcmV0dXJuIHtsYWJlbDpuYW1lLHJhbmdlOicnLGZ1bGw6bmFtZX07CiBjb25zdCByYW5nZT1kYXRlc1swXT09PWRhdGVzLmF0KC0xKT9kYXRlc1swXTpkYXRlc1swXSsnIOKGkiAnK2RhdGVzLmF0KC0xKTsKIHJldHVybiB7bGFiZWw6bmFtZSxyYW5nZSxmdWxsOm5hbWUrJyDCtyBEYXRvczogJytyYW5nZSsnIMK3ICcrZGF0ZXMubGVuZ3RoKycgZMOtYXMgcmVnaXN0cmFkb3MnfTsKfQpmdW5jdGlvbiB2YWx1ZVY0KHZhbHVlLGtleSl7cmV0dXJuIGZtdCh2YWx1ZSxrZXkpKyhbJ3dpbicsJ2NvaW4nLCd3ZCcsJ2NkJywnYmV0JywncHJvbW8nLCdwcml6ZSddLmluY2x1ZGVzKGtleSkmJnZhbHVlIT1udWxsPycgQ0xQJzonJyl9CmZ1bmN0aW9uIGxhYmVsZWRDaGFydFY0KHNlcmllcyxrZXksZHVhbEtleXM9bnVsbCl7CiBjb25zdCBsYWJlbHM9Wy4uLm5ldyBTZXQoc2VyaWVzLmZsYXRNYXAocz0+cy5wb2ludHMubWFwKHA9PnAubmFtZSkpKV0uc29ydCgpOwogaWYoIWxhYmVscy5sZW5ndGgpcmV0dXJuICc8ZGl2IGNsYXNzPSJlbXB0eSI+U2luIGRhdG9zIHBhcmEgZXN0ZSBwZXLDrW9kby48L2Rpdj4nOwogY29uc3QgaWQ9J2NoYXJ0djQtJysoKytjaGFydENvdW50ZXJWNCksY29sb3JzPVsnIzI3YjhiZCcsJyM2NjhmY2InLCcjOGVjNmExJywnI2MwYTVkZicsJyNkOWFkNmUnLCcjZTY5NDhjJywnIzhjYmJjOScsJyNjNGNiODYnXTsKIGNvbnN0IGVudHJpZXM9bGFiZWxzLm1hcChsYWJlbD0+e2NvbnN0IHBvaW50cz1zZXJpZXMubWFwKHM9PnMucG9pbnRzLmZpbmQocD0+cC5uYW1lPT09bGFiZWwpKTtyZXR1cm4ge3BlcmlvZDpwZXJpb2REZXNjcmlwdGlvblY0KGxhYmVsLHBvaW50cy5maWx0ZXIoQm9vbGVhbikpLHZhbHVlczpwb2ludHMubWFwKChwLGkpPT5wPy5bZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5XT8/bnVsbCl9fSk7CiBjb25zdCB3aWR0aD1NYXRoLm1heCg2ODAsbGFiZWxzLmxlbmd0aCoxMDArMTIwKSxsZWZ0PTYwLHJpZ2h0PXdpZHRoLTYwLHRvcD03MCxib3R0b209MjQwLHg9aT0+bGFiZWxzLmxlbmd0aD09PTE/d2lkdGgvMjpsZWZ0K2kvKGxhYmVscy5sZW5ndGgtMSkqKHJpZ2h0LWxlZnQpOwogY29uc3QgYWxsVmFsdWVzPWVudHJpZXMuZmxhdE1hcChlPT5lLnZhbHVlcykuZmlsdGVyKHY9PnYhPW51bGwmJk51bWJlci5pc0Zpbml0ZSh2KSk7CiBjb25zdCBjb21tb249e2xvOk1hdGgubWluKDAsLi4uYWxsVmFsdWVzKSxoaTpNYXRoLm1heCgxLC4uLmFsbFZhbHVlcyl9OwogY29uc3Qgc2NhbGVzPXNlcmllcy5tYXAoKHMsaSk9PntpZighZHVhbEtleXMpcmV0dXJuIGNvbW1vbjtsZXQgdmFscz1lbnRyaWVzLm1hcChlPT5lLnZhbHVlc1tpXSkuZmlsdGVyKHY9PnYhPW51bGwmJk51bWJlci5pc0Zpbml0ZSh2KSk7cmV0dXJuIHtsbzpNYXRoLm1pbigwLC4uLnZhbHMpLGhpOk1hdGgubWF4KDAuMDAwMDAxLC4uLnZhbHMpfX0pOwogY29uc3QgeT0odixpKT0+Ym90dG9tLSh2LXNjYWxlc1tpXS5sbykvKHNjYWxlc1tpXS5oaS1zY2FsZXNbaV0ubG98fDEpKihib3R0b20tdG9wKTsKIGNvbnN0IHRleHRzPWVudHJpZXMubWFwKGU9PmUucGVyaW9kLmZ1bGwrJyB8ICcrc2VyaWVzLm1hcCgocyxpKT0+cy5uYW1lKyc6ICcrdmFsdWVWNChlLnZhbHVlc1tpXSxkdWFsS2V5cz9kdWFsS2V5c1tpXTprZXkpKS5qb2luKCcgfCAnKSk7Y2hhcnRQb2ludHNWNC5zZXQoaWQsdGV4dHMpOwogY29uc3QgbGVnZW5kPWA8ZGl2IGNsYXNzPSJsZWdlbmQgbGFiZWxlZGxlZ2VuZCI+JHtzZXJpZXMubWFwKChzLGkpPT5gPHNwYW4+PGkgc3R5bGU9ImJhY2tncm91bmQ6JHtjb2xvcnNbaSVjb2xvcnMubGVuZ3RoXX0iPjwvaT4ke2VzYyhzLm5hbWUpfSR7ZHVhbEtleXM/KGk9PT0wPycgwrcgZWplIGl6cXVpZXJkbyc6JyDCtyBlamUgZGVyZWNobycpOicnfTwvc3Bhbj5gKS5qb2luKCcnKX08L2Rpdj5gOwogbGV0IGxpbmVzPXNlcmllcy5tYXAoKHMsaSk9PnsKICBjb25zdCB2YWxpZD1lbnRyaWVzLm1hcCgoZSxqKT0+KHtlLGp9KSkuZmlsdGVyKCh7ZX0pPT5lLnZhbHVlc1tpXSE9bnVsbCk7CiAgcmV0dXJuIGA8cG9seWxpbmUgZmlsbD0ibm9uZSIgc3Ryb2tlPSIke2NvbG9yc1tpJWNvbG9ycy5sZW5ndGhdfSIgc3Ryb2tlLXdpZHRoPSIzIiBwb2ludHM9IiR7dmFsaWQubWFwKCh7ZSxqfSk9PmAke3goail9LCR7eShlLnZhbHVlc1tpXSxpKX1gKS5qb2luKCcgJyl9Ii8+JHt2YWxpZC5tYXAoKHtlLGp9KT0+ewogICBjb25zdCBjeT15KGUudmFsdWVzW2ldLGkpLG90aGVyPWR1YWxLZXlzJiZlLnZhbHVlc1sxLWldIT1udWxsP3koZS52YWx1ZXNbMS1pXSwxLWkpOm51bGw7CiAgIGNvbnN0IG9mZnNldD1vdGhlcj09bnVsbD8tMTM6KGN5PD1vdGhlcj8tMTM6MjIpOwogICByZXR1cm4gYDxjaXJjbGUgY3g9IiR7eChqKX0iIGN5PSIke2N5fSIgcj0iNiIgZmlsbD0iJHtwb2ludENvbG9yVjYoZW50cmllcyxqLGksZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5KX0iIHN0cm9rZT0idmFyKC0tcGxvdGJnKSIgc3Ryb2tlLXdpZHRoPSIyIiB0YWJpbmRleD0iMCIgcm9sZT0iYnV0dG9uIiBkYXRhLWNoYXJ0djQ9IiR7aWR9IiBkYXRhLXBvaW50djQ9IiR7an0iIGFyaWEtbGFiZWw9IiR7ZXNjKHRleHRzW2pdKX0iPjx0aXRsZT4ke2VzYyh0ZXh0c1tqXSl9PC90aXRsZT48L2NpcmNsZT4ke3Nlcmllcy5sZW5ndGg8PTI/YDx0ZXh0IHg9IiR7eChqKX0iIHk9IiR7Y3krb2Zmc2V0fSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iJHtwb2ludENvbG9yVjYoZW50cmllcyxqLGksZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5KX0iPiR7ZXNjKGNvbXBhY3QoZS52YWx1ZXNbaV0sZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5KSl9PC90ZXh0PmA6Jyd9YDsKICB9KS5qb2luKCcnKX1gOwogfSkuam9pbignJyk7CiBjb25zdCB0aWNrcz1bMCwuNSwxXS5tYXAoZj0+e2NvbnN0IHl5PWJvdHRvbS1mKihib3R0b20tdG9wKTtyZXR1cm4gYDxsaW5lIHgxPSIke2xlZnR9IiB5MT0iJHt5eX0iIHgyPSIke3JpZ2h0fSIgeTI9IiR7eXl9IiBzdHJva2U9InZhcigtLXBsb3RncmlkKSIgc3Ryb2tlLWRhc2hhcnJheT0iMyA0Ii8+PHRleHQgeD0iJHtsZWZ0LTEyfSIgeT0iJHt5eSs0fSIgdGV4dC1hbmNob3I9ImVuZCIgZm9udC1zaXplPSIxMCIgZmlsbD0idmFyKC0tcGxvdHRleHQpIj4ke2VzYyhjb21wYWN0KHNjYWxlc1swXS5sbytmKihzY2FsZXNbMF0uaGktc2NhbGVzWzBdLmxvKSxkdWFsS2V5cz9kdWFsS2V5c1swXTprZXkpKX08L3RleHQ+JHtkdWFsS2V5cz9gPHRleHQgeD0iJHtyaWdodCsxMn0iIHk9IiR7eXkrNH0iIGZvbnQtc2l6ZT0iMTAiIGZpbGw9InZhcigtLXBsb3R0ZXh0KSI+JHtlc2MoY29tcGFjdChzY2FsZXNbMV0ubG8rZiooc2NhbGVzWzFdLmhpLXNjYWxlc1sxXS5sbyksZHVhbEtleXNbMV0pKX08L3RleHQ+YDonJ31gfSkuam9pbignJyk7CiBjb25zdCBwZXJpb2RzPWVudHJpZXMubWFwKChlLGopPT5gPHRleHQgeD0iJHt4KGopfSIgeT0iMjg1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEyIiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSJ2YXIoLS1wbG90dGV4dCkiPiR7YXhpc1BlcmlvZFYxNChlLnBlcmlvZC5sYWJlbCkucmVwbGFjZSgneD0iMCInLCd4PSInK3goaikrJyInKX08L3RleHQ+PHRleHQgeD0iJHt4KGopfSIgeT0iMzI2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEwIiBmaWxsPSJ2YXIoLS1wbG90dGV4dCkiPiR7ZXNjKGF4aXNEYXRlc1YxNChlLnBlcmlvZC5yYW5nZSkpfTwvdGV4dD5gKS5qb2luKCcnKTsKIGNvbnN0IGRldGFpbHM9YDxkaXYgY2xhc3M9ImNoYXJ0ZGF0YXdyYXAiPjx0YWJsZSBjbGFzcz0iY2hhcnRkYXRhdGFibGUiPjxjYXB0aW9uPlZhbG9yZXMgZXhhY3RvcyBkZSB0b2RvcyBsb3MgcHVudG9zPC9jYXB0aW9uPjx0aGVhZD48dHI+PHRoPlBlcsOtb2RvPC90aD48dGg+RmVjaGFzIGNvbiBkYXRvczwvdGg+JHtzZXJpZXMubWFwKHM9PmA8dGg+JHtlc2Mocy5uYW1lKX08L3RoPmApLmpvaW4oJycpfTwvdHI+PC90aGVhZD48dGJvZHk+JHtlbnRyaWVzLm1hcChlPT5gPHRyPjx0ZD4ke2VzYyhlLnBlcmlvZC5sYWJlbCl9PC90ZD48dGQ+JHtlc2MoZS5wZXJpb2QucmFuZ2V8fCfigJQnKX08L3RkPiR7ZS52YWx1ZXMubWFwKCh2LGkpPT57Y29uc3QgaW5kZXg9ZW50cmllcy5pbmRleE9mKGUpLHNpZ25hbD1wb2ludFNpZ25hbFY2KGVudHJpZXMsaW5kZXgsaSxkdWFsS2V5cz9kdWFsS2V5c1tpXTprZXkpO3JldHVybiBgPHRkIGNsYXNzPSJ0cmFmZmljLSR7c2lnbmFsLnN0YXRlfSIgdGl0bGU9IiR7ZXNjKHNpZ25hbC5sYWJlbCl9Ij4ke3NpZ25hbC5zdGF0ZT09PSduZXV0cmFsJz8nJzon4pePICd9JHt2YWx1ZVY0KHYsZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5KX08L3RkPmB9KS5qb2luKCcnKX08L3RyPmApLmpvaW4oJycpfTwvdGJvZHk+PC90YWJsZT48L2Rpdj5gOwogcmV0dXJuIGxlZ2VuZCtgPGRpdiBjbGFzcz0iY2hhcnRzY3JvbGwiPjxzdmcgY2xhc3M9ImxhYmVsZWRzdmciIHN0eWxlPSJmb250LWZhbWlseTpBcmlhbCxzYW5zLXNlcmlmO3dpZHRoOiR7d2lkdGh9cHg7bWluLXdpZHRoOjEwMCU7aGVpZ2h0OjM1MHB4IiB2aWV3Qm94PSIwIDAgJHt3aWR0aH0gMzUwIiByb2xlPSJpbWciIGFyaWEtbGFiZWw9IiR7ZXNjKHNlcmllcy5tYXAocz0+cy5uYW1lKS5qb2luKCcgeSAnKSl9Ij4ke3RpY2tzfSR7bGluZXN9JHtwZXJpb2RzfTwvc3ZnPjwvZGl2PjxkaXYgaWQ9IiR7aWR9IiBjbGFzcz0iY2hhcnRyZWFkb3V0IiBhcmlhLWxpdmU9InBvbGl0ZSI+UGFzYSBlbCBjdXJzb3IsIHRvY2EgbyBlbmZvY2EgdW4gcHVudG8gcGFyYSB2ZXIgc3UgcGVyw61vZG8geSB0b2RvcyBzdXMgdmFsb3Jlcy4gU2kgaGF5IG11Y2hvcyBwZXLDrW9kb3MsIGRlc2xpemEgZWwgZ3LDoWZpY28gaG9yaXpvbnRhbG1lbnRlLjwvZGl2PmArZGV0YWlsczsKfQpjaGFydFYyPWZ1bmN0aW9uKHNlcmllcyxrZXkpe3JldHVybiBsYWJlbGVkQ2hhcnRWNChzZXJpZXMsa2V5KX07CmNvbWJpbmVkQ2hhcnQ9ZnVuY3Rpb24ocG9pbnRzLGZpcnN0LHNlY29uZCl7cmV0dXJuIGxhYmVsZWRDaGFydFY0KFt7bmFtZTptZXRyaWNzW2ZpcnN0XSxwb2ludHN9LHtuYW1lOm1ldHJpY3Nbc2Vjb25kXSxwb2ludHN9XSxudWxsLFtmaXJzdCxzZWNvbmRdKX07CmZ1bmN0aW9uIGluc3BlY3RQb2ludFY0KGV2ZW50KXtjb25zdCB0YXJnZXQ9ZXZlbnQudGFyZ2V0LmNsb3Nlc3Q/LignW2RhdGEtY2hhcnR2NF0nKTtpZighdGFyZ2V0KXJldHVybjtjb25zdCB2YWx1ZXM9Y2hhcnRQb2ludHNWNC5nZXQodGFyZ2V0LmRhdGFzZXQuY2hhcnR2NCkscmVhZG91dD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YXJnZXQuZGF0YXNldC5jaGFydHY0KTtpZih2YWx1ZXMmJnJlYWRvdXQpcmVhZG91dC50ZXh0Q29udGVudD12YWx1ZXNbK3RhcmdldC5kYXRhc2V0LnBvaW50djRdfQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyb3ZlcicsaW5zcGVjdFBvaW50VjQpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLGluc3BlY3RQb2ludFY0KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsaW5zcGVjdFBvaW50VjQpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGV2ZW50PT57aWYoZXZlbnQua2V5PT09J0VudGVyJ3x8ZXZlbnQua2V5PT09JyAnKXtpZihldmVudC50YXJnZXQuY2xvc2VzdD8uKCdbZGF0YS1jaGFydHY0XScpKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2luc3BlY3RQb2ludFY0KGV2ZW50KX19fSk7CmNvbnN0IHJlbmRlckJlZm9yZVY0PXJlbmRlcjtyZW5kZXI9ZnVuY3Rpb24oKXtjaGFydFBvaW50c1Y0LmNsZWFyKCk7cmVuZGVyQmVmb3JlVjQoKX07Cgpjb25zdCBtb250aE5hbWVzVjU9WydlbmVybycsJ2ZlYnJlcm8nLCdtYXJ6bycsJ2FicmlsJywnbWF5bycsJ2p1bmlvJywnanVsaW8nLCdhZ29zdG8nLCdzZXB0aWVtYnJlJywnb2N0dWJyZScsJ25vdmllbWJyZScsJ2RpY2llbWJyZSddOwpmdW5jdGlvbiBkaXNwbGF5RGF0ZXNWNSh2YWx1ZSl7CiByZXR1cm4gU3RyaW5nKHZhbHVlPz8nJykucmVwbGFjZSgvXGIoXGR7NH0pLShcZHsyfSktKFxkezJ9KVxiL2csKG1hdGNoLHksbSxkKT0+ewogIGNvbnN0IG1vbnRoPSttO2lmKG1vbnRoPDF8fG1vbnRoPjEyfHwrZDwxfHwrZD4zMSlyZXR1cm4gbWF0Y2g7CiAgcmV0dXJuIGAke051bWJlcihkKX0gJHttb250aE5hbWVzVjVbbW9udGgtMV19ICR7eX1gOwogfSkucmVwbGFjZSgvXGIoXGR7NH0pLShcZHsyfSlcYi9nLChtYXRjaCx5LG0pPT57CiAgY29uc3QgbW9udGg9K207aWYobW9udGg8MXx8bW9udGg+MTIpcmV0dXJuIG1hdGNoOwogIGNvbnN0IG5hbWU9bW9udGhOYW1lc1Y1W21vbnRoLTFdO3JldHVybiBuYW1lWzBdLnRvVXBwZXJDYXNlKCkrbmFtZS5zbGljZSgxKSsnICcreTsKIH0pLnJlcGxhY2UoL1xiKFxkezR9KSDCtyBTKFxkezEsMn0pXGIvZywobWF0Y2gseSx3KT0+YFNlbWFuYSAke051bWJlcih3KX0gwrcgJHt5fWApOwp9CmNvbnN0IHBlcmlvZERlc2NyaXB0aW9uQmVmb3JlVjU9cGVyaW9kRGVzY3JpcHRpb25WNDsKcGVyaW9kRGVzY3JpcHRpb25WND1mdW5jdGlvbihuYW1lLHBvaW50cyl7CiBjb25zdCBwPXBlcmlvZERlc2NyaXB0aW9uQmVmb3JlVjUobmFtZSxwb2ludHMpOwogcmV0dXJuIHtsYWJlbDpkaXNwbGF5RGF0ZXNWNShwLmxhYmVsKSxyYW5nZTpkaXNwbGF5RGF0ZXNWNShwLnJhbmdlKSxmdWxsOmRpc3BsYXlEYXRlc1Y1KHAuZnVsbCl9Owp9OwpmdW5jdGlvbiBmb3JtYXRUZXh0RGF0ZXNWNShyb290KXsKIGlmKCFyb290KXJldHVybjsKIGlmKHJvb3Qubm9kZVR5cGU9PT0zKXsKICBpZihyb290LnBhcmVudEVsZW1lbnQ/LmNsb3Nlc3QoJ3NjcmlwdCxzdHlsZSxvcHRpb24sdGV4dGFyZWEsW2NvbnRlbnRlZGl0YWJsZT0idHJ1ZSJdJykpcmV0dXJuOwogIGNvbnN0IHRleHQ9ZGlzcGxheURhdGVzVjUocm9vdC5ub2RlVmFsdWUpO2lmKHRleHQhPT1yb290Lm5vZGVWYWx1ZSlyb290Lm5vZGVWYWx1ZT10ZXh0OwogIHJldHVybjsKIH0KIGlmKHJvb3Qubm9kZVR5cGU9PT0xKXsKICBpZihyb290Lm1hdGNoZXMoJ3NjcmlwdCxzdHlsZSxvcHRpb24sdGV4dGFyZWEsW2NvbnRlbnRlZGl0YWJsZT0idHJ1ZSJdJykpcmV0dXJuOwogIGZvcihjb25zdCBjaGlsZCBvZiByb290LmNoaWxkTm9kZXMpZm9ybWF0VGV4dERhdGVzVjUoY2hpbGQpOwogfQp9CmNvbnN0IHJlbmRlckJlZm9yZVY1PXJlbmRlcjsKcmVuZGVyPWZ1bmN0aW9uKCl7cmVuZGVyQmVmb3JlVjUoKTtmb3JtYXRUZXh0RGF0ZXNWNShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtYWluJykpfTsKLy8gU3RhdHVzIG1lc3NhZ2VzIGFuZCBpbnRlcmFjdGl2ZSBwb2ludCBkZXRhaWxzIGNhbiB1cGRhdGUgYWZ0ZXIgYSByZW5kZXIuCmNvbnN0IGRhdGVPYnNlcnZlclY1PW5ldyBNdXRhdGlvbk9ic2VydmVyKHJlY29yZHM9PnsKIGZvcihjb25zdCByZWNvcmQgb2YgcmVjb3Jkcyl7CiAgaWYocmVjb3JkLnR5cGU9PT0nY2hhcmFjdGVyRGF0YScpZm9ybWF0VGV4dERhdGVzVjUocmVjb3JkLnRhcmdldCk7CiAgZWxzZSBmb3IoY29uc3Qgbm9kZSBvZiByZWNvcmQuYWRkZWROb2Rlcylmb3JtYXRUZXh0RGF0ZXNWNShub2RlKTsKIH0KfSk7CmRhdGVPYnNlcnZlclY1Lm9ic2VydmUoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWFpbicpLHtjaGlsZExpc3Q6dHJ1ZSxjaGFyYWN0ZXJEYXRhOnRydWUsc3VidHJlZTp0cnVlfSk7CmNvbnN0IGV4cG9ydEJlZm9yZVY1PSQoJyN2MmV4cG9ydCcpLm9uY2xpY2s7CiQoJyN2MmV4cG9ydCcpLm9uY2xpY2s9ZnVuY3Rpb24oKXsKIGNvbnN0IG9yaWdpbmFsPWV4cG9ydFJvd3M7CiB0cnl7ZXhwb3J0Um93cz1vcmlnaW5hbC5tYXAocm93PT5yb3cubWFwKHY9PnR5cGVvZiB2PT09J3N0cmluZyc/ZGlzcGxheURhdGVzVjUodik6dikpO3JldHVybiBleHBvcnRCZWZvcmVWNSgpfQogZmluYWxseXtleHBvcnRSb3dzPW9yaWdpbmFsfQp9OwoKY29uc3QgcmF0aW9LZXlzVjY9WydyYXRpbycsJ3JzJywncmInXTsKY29uc3QgdHJhZmZpY0NvbG9yc1Y2PXtyZWQ6JyNkNzQ3NDcnLHllbGxvdzonI2Q2OWIxNicsZ3JlZW46JyMxNjg0NTQnLG5ldXRyYWw6JyM4Mzk1YTUnfTsKZnVuY3Rpb24gcmF0aW9MaW1pdHNWNigpe2NvbnN0IHM9dmlld1N0YXRlLnJhdGlvcztyZXR1cm4ge3JlZDpOdW1iZXIuaXNGaW5pdGUocy5yZWRMaW1pdCk/cy5yZWRMaW1pdDouNjUsZ3JlZW46TnVtYmVyLmlzRmluaXRlKHMuZ3JlZW5MaW1pdCk/cy5ncmVlbkxpbWl0OjF9fQpmdW5jdGlvbiByYXRpb1NpZ25hbFY2KHZhbHVlKXsKIGlmKHZhbHVlPT1udWxsfHwhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSlyZXR1cm4ge3N0YXRlOiduZXV0cmFsJyxsYWJlbDonU2luIHJlZmVyZW5jaWEgZGlzcG9uaWJsZSd9OwogY29uc3QgbGltaXRzPXJhdGlvTGltaXRzVjYoKTsKIHJldHVybiB2YWx1ZTxsaW1pdHMucmVkP3tzdGF0ZToncmVkJyxsYWJlbDonQmFqbzogbWVub3IgcXVlICcrbGltaXRzLnJlZCsnw5cnfTp2YWx1ZTxsaW1pdHMuZ3JlZW4/e3N0YXRlOid5ZWxsb3cnLGxhYmVsOidNZWRpbyBhIGJham86IGVudHJlICcrbGltaXRzLnJlZCsnw5cgeSAnK2xpbWl0cy5ncmVlbisnw5cnfTp7c3RhdGU6J2dyZWVuJyxsYWJlbDonRW4gbyBzb2JyZSBlbCBuaXZlbCBlc3BlcmFkbzogZGVzZGUgJytsaW1pdHMuZ3JlZW4rJ8OXJ307Cn0KZnVuY3Rpb24gcmVwb3J0U2lnbmFsVjYodmFsdWUscHJldmlvdXMsa2V5KXsKIGlmKHJhdGlvS2V5c1Y2LmluY2x1ZGVzKGtleSkpcmV0dXJuIHJhdGlvU2lnbmFsVjYodmFsdWUpOwogaWYodmFsdWU9PW51bGx8fCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKXJldHVybiB7c3RhdGU6J25ldXRyYWwnLGxhYmVsOidTaW4gZGF0b3MnfTsKIGlmKCFbJ3dpbicsJ3dkJywnY29pbicsJ2NkJywnc3BpbicsJ3NkJ10uaW5jbHVkZXMoa2V5KSlyZXR1cm4ge3N0YXRlOiduZXV0cmFsJyxsYWJlbDonU2luIG1ldGEgZGVmaW5pZGE6IG5vIHNlIGNhbGlmaWNhIGNvbW8gYnVlbm8gbyBtYWxvJ307CiBpZigoa2V5PT09J3dpbid8fGtleT09PSd3ZCcpJiZ2YWx1ZTwwKXJldHVybiB7c3RhdGU6J3JlZCcsbGFiZWw6J1dpbiBuZWdhdGl2byd9OwogaWYocHJldmlvdXM9PW51bGx8fCFOdW1iZXIuaXNGaW5pdGUocHJldmlvdXMpKXJldHVybiB7c3RhdGU6J25ldXRyYWwnLGxhYmVsOidTaW4gcGVyw61vZG8gYW50ZXJpb3IgZGlzcG9uaWJsZSd9OwogaWYoKGtleT09PSd3aW4nfHxrZXk9PT0nd2QnKSYmcHJldmlvdXM8MClyZXR1cm4ge3N0YXRlOidncmVlbicsbGFiZWw6J1dpbiBwYXPDsyBkZSBuZWdhdGl2byBhIG5vIG5lZ2F0aXZvJ307CiByZXR1cm4gdmFsdWU+PXByZXZpb3VzP3tzdGF0ZTonZ3JlZW4nLGxhYmVsOidJZ3VhbCBvIHN1cGVyaW9yIGFsIHBlcsOtb2RvIGFudGVyaW9yIG1vc3RyYWRvJ306e3N0YXRlOidyZWQnLGxhYmVsOidJbmZlcmlvciBhbCBwZXLDrW9kbyBhbnRlcmlvciBtb3N0cmFkbyd9Owp9CmZ1bmN0aW9uIHBvaW50U2lnbmFsVjYoZW50cmllcyxqLGksa2V5KXtyZXR1cm4gcmVwb3J0U2lnbmFsVjYoZW50cmllc1tqXS52YWx1ZXNbaV0saj9lbnRyaWVzW2otMV0udmFsdWVzW2ldOm51bGwsa2V5KX0KZnVuY3Rpb24gcG9pbnRDb2xvclY2KGVudHJpZXMsaixpLGtleSl7cmV0dXJuIHRyYWZmaWNDb2xvcnNWNltwb2ludFNpZ25hbFY2KGVudHJpZXMsaixpLGtleSkuc3RhdGVdfQpmdW5jdGlvbiBzaWduYWxDZWxsVjYodmFsdWUsa2V5LHByZXZpb3VzKXtjb25zdCBzaWduYWw9cmVwb3J0U2lnbmFsVjYodmFsdWUscHJldmlvdXMsa2V5KTtyZXR1cm4gYDx0ZCBjbGFzcz0idHJhZmZpYy0ke3NpZ25hbC5zdGF0ZX0iIHRpdGxlPSIke2VzYyhzaWduYWwubGFiZWwpfSI+JHtzaWduYWwuc3RhdGU9PT0nbmV1dHJhbCc/Jyc6YDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj7il48gPC9zcGFuPmB9JHtmbXQodmFsdWUsa2V5KX08L3RkPmB9CmNvbnN0IGJhcnNCZWZvcmVWNj1iYXJzVjI7CmJhcnNWMj1mdW5jdGlvbihpdGVtcyxrZXksY29sb3IpewogaWYoIXJhdGlvS2V5c1Y2LmluY2x1ZGVzKGtleSkpcmV0dXJuIGJhcnNCZWZvcmVWNihpdGVtcyxrZXksY29sb3IpOwogY29uc3QgbWF4PU1hdGgubWF4KDEsLi4uaXRlbXMubWFwKHI9Pk1hdGguYWJzKHJba2V5XT8/MCkpKTsKIHJldHVybiBpdGVtcy5tYXAocj0+e2NvbnN0IHNpZ25hbD1yYXRpb1NpZ25hbFY2KHJba2V5XSk7cmV0dXJuIGA8ZGl2IGNsYXNzPSJiYXJyb3ciIHRpdGxlPSIke2VzYyhzaWduYWwubGFiZWwpfSI+PHNwYW4gY2xhc3M9ImJhcmxhYmVsIj4ke2VzYyhyLm5hbWUpfTwvc3Bhbj48ZGl2IGNsYXNzPSJ0cmFjayI+PGRpdiBjbGFzcz0iYmFyIiBzdHlsZT0id2lkdGg6JHtNYXRoLmFicyhyW2tleV0/PzApL21heCoxMDB9JTtiYWNrZ3JvdW5kOiR7dHJhZmZpY0NvbG9yc1Y2W3NpZ25hbC5zdGF0ZV19Ij48L2Rpdj48L2Rpdj48YiBjbGFzcz0idHJhZmZpYy0ke3NpZ25hbC5zdGF0ZX0iPiR7Zm10KHJba2V5XSxrZXkpfTwvYj48L2Rpdj5gfSkuam9pbignJyk7Cn07CnJlcG9ydFRhYmxlPWZ1bmN0aW9uKGxpc3QsY29scyxwZXJpb2RMYWJlbD0nUGVyw61vZG8nKXsKIGNvbnN0IHRlbXBvcmFsPWxpc3QuZXZlcnkocj0+L15cZHs0fSgtXGR7Mn18IMK3IFNcZHsxLDJ9fC1UWzEtNF0pJC8udGVzdChyLm5hbWUpKTsKIHJldHVybiBgPGRpdiBjbGFzcz0idGFibGV3cmFwIj48dGFibGU+PHRoZWFkPjx0cj48dGg+JHtwZXJpb2RMYWJlbH08L3RoPjx0aD5Db2JlcnR1cmE8L3RoPiR7Y29scy5tYXAoaz0+YDx0aD4ke21ldHJpY3Nba119PC90aD5gKS5qb2luKCcnKX08L3RyPjwvdGhlYWQ+PHRib2R5PiR7bGlzdC5tYXAoKHIsaSk9PmA8dHI+PHRkPiR7ZXNjKHIubmFtZSl9PC90ZD48dGQ+JHtjb3ZlcmFnZUxhYmVsKHIucm93cyl9PC90ZD4ke2NvbHMubWFwKGs9PnNpZ25hbENlbGxWNihyW2tdLGssdGVtcG9yYWwmJmk/bGlzdFtpLTFdW2tdOm51bGwpKS5qb2luKCcnKX08L3RyPmApLmpvaW4oJycpfTwvdGJvZHk+PC90YWJsZT48L2Rpdj48cCBjbGFzcz0ic2lnbmFsbm90ZSI+U2Vtw6Fmb3JvIHRlbXBvcmFsOiBXaW4sIGFjdGl2aWRhZCB5IHNwaW5zIGZyZW50ZSBhbCBwZXLDrW9kbyBhbnRlcmlvciBtb3N0cmFkby4gVmVyZGUgPSBpZ3VhbCBvIHN1cGVyaW9yOyByb2pvID0gaW5mZXJpb3IgbyBXaW4gbmVnYXRpdm8uIFByaW1lciBwZXLDrW9kbyB5IG3DqXRyaWNhcyBzaW4gbWV0YTogbmV1dHJvcy4gUmV2aXNhIGxhIGNvYmVydHVyYSBkZSBkw61hcyBhbnRlcyBkZSBjb21wYXJhciB0b3RhbGVzLjwvcD5gOwp9OwpmdW5jdGlvbiBhcHBseVJhdGlvQ2VsbHNWNigpe2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjb250ZW50IC5waWxsJykuZm9yRWFjaChlbD0+e2NvbnN0IHJhdz1lbC5kYXRhc2V0LnJhdGlvVjYsdGV4dD1lbC50ZXh0Q29udGVudC50cmltKCk7aWYocmF3PT1udWxsJiYhdGV4dC5lbmRzV2l0aCgnw5cnKSlyZXR1cm47Y29uc3QgdmFsdWU9cmF3PT09Jyc/bnVsbDpyYXchPW51bGw/TnVtYmVyKHJhdyk6TnVtYmVyKHRleHQuc2xpY2UoMCwtMSkucmVwbGFjZSgnLCcsJy4nKSk7Y29uc3Qgcz1yYXRpb1NpZ25hbFY2KHZhbHVlKTtlbC5jbGFzc0xpc3QucmVtb3ZlKCdsb3cnKTtlbC5jbGFzc0xpc3QuYWRkKCdyYXRpby0nK3Muc3RhdGUpO2VsLnRpdGxlPXMubGFiZWx9KX0KZnVuY3Rpb24gdHJhZmZpY0xlZ2VuZFY2KCl7Y29uc3QgbGltaXRzPXJhdGlvTGltaXRzVjYoKTtyZXR1cm4gYDxkaXYgY2xhc3M9InRyYWZmaWNMZWdlbmQiPjxzcGFuIGNsYXNzPSJ0cmFmZmljLXJlZCI+4pePIEJham86ICZsdDsgJHtsaW1pdHMucmVkfcOXPC9zcGFuPjxzcGFuIGNsYXNzPSJ0cmFmZmljLXllbGxvdyI+4pePIE1lZGlvIGEgYmFqbzogJHtsaW1pdHMucmVkfcOXIGEgJmx0OyAke2xpbWl0cy5ncmVlbn3Dlzwvc3Bhbj48c3BhbiBjbGFzcz0idHJhZmZpYy1ncmVlbiI+4pePIEVzcGVyYWRvIG8gc3VwZXJpb3I6IOKJpSAke2xpbWl0cy5ncmVlbn3Dlzwvc3Bhbj48L2Rpdj5gfQpjb25zdCByZW5kZXJCZWZvcmVWNj1yZW5kZXI7CnJlbmRlcj1mdW5jdGlvbigpewogcmVuZGVyQmVmb3JlVjYoKTtpZighZGF0YSlyZXR1cm47YXBwbHlSYXRpb0NlbGxzVjYoKTsKIGlmKHRhYj09PSdSYXRpb3MnKXsKICBjb25zdCBsaW1pdHM9cmF0aW9MaW1pdHNWNigpO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb250ZW50IC52aWV3YmFubmVyJykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmVuZCcsYDxzZWN0aW9uIGNsYXNzPSJjYXJkIHRyYWZmaWNTZXR0aW5ncyI+PGgyPkNvbmZpZ3VyYWNpw7NuIGRlbCBzZW3DoWZvcm8gZGUgcmF0aW9zPC9oMj48ZGl2IGNsYXNzPSJ2aWV3Y29udHJvbHMiPjxsYWJlbD5Mw61taXRlIHJvam8gLyBhbWFyaWxsbzxpbnB1dCBpZD0icmVkUmF0aW9WNiIgdHlwZT0ibnVtYmVyIiBtaW49IjAiIHN0ZXA9IjAuMDUiIHZhbHVlPSIke2xpbWl0cy5yZWR9Ij48L2xhYmVsPjxsYWJlbD5OaXZlbCBlc3BlcmFkbzogaW5pY2lvIGRlbCB2ZXJkZTxpbnB1dCBpZD0iZ3JlZW5SYXRpb1Y2IiB0eXBlPSJudW1iZXIiIG1pbj0iMC4wMSIgc3RlcD0iMC4wNSIgdmFsdWU9IiR7bGltaXRzLmdyZWVufSI+PC9sYWJlbD48YnV0dG9uIGlkPSJhcHBseVJhdGlvVjYiPkFwbGljYXIgZXNjYWxhPC9idXR0b24+PC9kaXY+JHt0cmFmZmljTGVnZW5kVjYoKX08cCBjbGFzcz0ic2lnbmFsbm90ZSI+TGEgZXNjYWxhIHNlIGFwbGljYSBzb2xvIGEgcmF0aW9zLiAxw5cgZXMgZWwgdmFsb3IgZGUgbGEgcmVmZXJlbmNpYSBlbGVnaWRhLiBQdWVkZXMgZ3VhcmRhciBsYSBjb25maWd1cmFjacOzbiBqdW50byBjb24gbGEgdmlzdGEuPC9wPjwvc2VjdGlvbj5gKTsKICAkKCcjYXBwbHlSYXRpb1Y2Jykub25jbGljaz0oKT0+e2NvbnN0IHJlZD1OdW1iZXIoJCgnI3JlZFJhdGlvVjYnKS52YWx1ZSksZ3JlZW49TnVtYmVyKCQoJyNncmVlblJhdGlvVjYnKS52YWx1ZSk7aWYoIU51bWJlci5pc0Zpbml0ZShyZWQpfHwhTnVtYmVyLmlzRmluaXRlKGdyZWVuKXx8cmVkPDB8fGdyZWVuPD1yZWQpe2FsZXJ0KCdFbCBsw61taXRlIHJvam8gZGViZSBzZXIgY2VybyBvIG1heW9yIHkgZWwgbml2ZWwgdmVyZGUgZGViZSBzZXIgc3VwZXJpb3IgYWwgcm9qby4nKTtyZXR1cm59dmlld1N0YXRlLnJhdGlvcy5yZWRMaW1pdD1yZWQ7dmlld1N0YXRlLnJhdGlvcy5ncmVlbkxpbWl0PWdyZWVuO3JlbmRlcigpfTsKIH1lbHNlIGlmKHRhYiE9PSdNZXRvZG9sb2fDrWEnKSQoJyNjb250ZW50JykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywnPGRpdiBjbGFzcz0ic2lnbmFsbm90ZSB0cmFmZmljSW50cm8iPlB1bnRvcyBkZSBsb3MgZ3LDoWZpY29zOiB2ZXJkZSA9IGlndWFsIG8gc3VwZXJpb3IgYWwgcGVyw61vZG8gYW50ZXJpb3IgbW9zdHJhZG87IHJvam8gPSBpbmZlcmlvciBvIFdpbiBuZWdhdGl2by4gR3JpcyA9IHNpbiBjb21wYXJhY2nDs24gbyBzaW4gbWV0YS4gUGF5b3V0LCBhcHVlc3RhLCBwcmVtaW9zIHkgcHJvbW8gc2UgbWFudGllbmVuIG5ldXRyb3MgYWwgbm8gdGVuZXIgdW5hIG1ldGEgZGVmaW5pZGEuIExhIGVzY2FsYSBkZSB0cmVzIGNvbG9yZXMgc2UgcmVzZXJ2YSBwYXJhIHJhdGlvcy48L2Rpdj4nKTsKfTsKCmZ1bmN0aW9uIGV4Y2x1ZGVkUmVjb3JkVjcocm93KXtyZXR1cm4gWzEsMiwzLDQsNSw3LDgsOV0uc29tZShrPT57Y29uc3Qgdj1TdHJpbmcocm93W2tdPz8nJykudHJpbSgpLnRvTG9jYWxlVXBwZXJDYXNlKCdlcycpO3JldHVybiB2PT09J0VYUElSQURPUyd8fC9eWy3igJPigJRdezMsfSQvLnRlc3Qodil9KX0KZnVuY3Rpb24gY2xlYW5NYXRyaXhWNyhtYXRyaXgpewogY29uc3QgcmVtb3ZlZD1tYXRyaXgucm93cy5maWx0ZXIoZXhjbHVkZWRSZWNvcmRWNyk7aWYoIXJlbW92ZWQubGVuZ3RoKXJldHVybiBtYXRyaXg7CiBjb25zdCBhZGp1c3RtZW50PW5ldyBNYXA7Zm9yKGNvbnN0IHIgb2YgcmVtb3ZlZClhZGp1c3RtZW50LnNldChyWzBdLChhZGp1c3RtZW50LmdldChyWzBdKXx8MCkrKHR5cGVvZiByWzE2XT09PSdudW1iZXInP3JbMTZdOjApKTsKIHJldHVybiB7Li4ubWF0cml4LHJvd3M6bWF0cml4LnJvd3MuZmlsdGVyKHI9PiFleGNsdWRlZFJlY29yZFY3KHIpKSxjb250cm9sczoobWF0cml4LmNvbnRyb2xzfHxbXSkubWFwKGM9Pih7Li4uYyx3aW46Yy53aW4tKGFkanVzdG1lbnQuZ2V0KGMuZGF0ZSl8fDApfSkpfTsKfQpjb25zdCBjYWNoZWRCZWZvcmVWNz1jYWNoZWQ7Y2FjaGVkPWFzeW5jIGZ1bmN0aW9uKCl7cmV0dXJuIGNsZWFuTWF0cml4VjcoYXdhaXQgY2FjaGVkQmVmb3JlVjcoKSl9Owpjb25zdCBub3JtYWxpemVCZWZvcmVWNz1ub3JtYWxpemVXb3JrYm9vaztub3JtYWxpemVXb3JrYm9vaz1mdW5jdGlvbiguLi5hcmdzKXtjb25zdCBjbGVhbmVkPWNsZWFuTWF0cml4Vjcobm9ybWFsaXplQmVmb3JlVjcoLi4uYXJncykpO2lmKCFjbGVhbmVkLnJvd3MubGVuZ3RoKXRocm93IEVycm9yKCdFbCBhcmNoaXZvIG5vIGNvbnRpZW5lIHJlZ2lzdHJvcyBhcGxpY2FibGVzLicpO3JldHVybiBjbGVhbmVkfTsKY29uc3QgY29tYmluZUJlZm9yZVY3PWNvbWJpbmVNYXRyaWNlcztjb21iaW5lTWF0cmljZXM9ZnVuY3Rpb24ocHJldmlvdXMsaW5jb21pbmcsbW9kZSl7cmV0dXJuIGNsZWFuTWF0cml4VjcoY29tYmluZUJlZm9yZVY3KHByZXZpb3VzP2NsZWFuTWF0cml4VjcocHJldmlvdXMpOnByZXZpb3VzLGNsZWFuTWF0cml4VjcoaW5jb21pbmcpLG1vZGUpKX07CmNvbnN0IGluaXRCZWZvcmVWNz1pbml0O2luaXQ9ZnVuY3Rpb24oKXtkYXRhPWNsZWFuTWF0cml4VjcoZGF0YSk7aW5pdEJlZm9yZVY3KCl9OwoKY29uc3QgbW9udGhTaG9ydFY4PVsnRU5FJywnRkVCJywnTUFSJywnQUJSJywnTUFZJywnSlVOJywnSlVMJywnQUdPJywnU0VQJywnT0NUJywnTk9WJywnRElDJ107CmZ1bmN0aW9uIGNhbGVuZGFyU3RhdGVWOChzY29wZSl7dmlld1N0YXRlLmNhbGVuZGFycz8/PXt9O3JldHVybiB2aWV3U3RhdGUuY2FsZW5kYXJzW3Njb3BlXT8/PXttb2RlOidyYW5nZScsZGF0ZXM6W10sbW9udGg6Jycsd2Vla3M6W10scXVhcnRlcjonJ319CmZ1bmN0aW9uIHdlZWtOdW1iZXJWOChkYXRlKXtjb25zdCBkPW5ldyBEYXRlKGRhdGUrJ1QwMDowMDowMFonKSxmaXJzdD1uZXcgRGF0ZShEYXRlLlVUQyhkLmdldFVUQ0Z1bGxZZWFyKCksMCwxKSk7cmV0dXJuIE1hdGguZmxvb3IoKChkLWZpcnN0KS84NjRlNSsoZmlyc3QuZ2V0VVRDRGF5KCkrNiklNykvNykrMX0KZnVuY3Rpb24gcXVhcnRlcktleVY4KGRhdGUpe3JldHVybiBkYXRlLnNsaWNlKDAsNCkrJy1UJytNYXRoLmNlaWwoTnVtYmVyKGRhdGUuc2xpY2UoNSw3KSkvMyl9CmZ1bmN0aW9uIGFjY2VwdHNDYWxlbmRhclY4KHJvdyxzdGF0ZSxmcm9tLHRvKXsKIGNvbnN0IGRhdGU9cm93WzBdOwogaWYoc3RhdGUubW9kZT09PSdkYXRlcycpcmV0dXJuIHN0YXRlLmRhdGVzLmluY2x1ZGVzKGRhdGUpOwogaWYoc3RhdGUubW9kZT09PSdtb250aCcpcmV0dXJuICFzdGF0ZS5tb250aHx8ZGF0ZS5zdGFydHNXaXRoKHN0YXRlLm1vbnRoKTsKIGlmKHN0YXRlLm1vZGU9PT0nd2VlaycpcmV0dXJuICghc3RhdGUubW9udGh8fGRhdGUuc3RhcnRzV2l0aChzdGF0ZS5tb250aCkpJiYoIXN0YXRlLndlZWtzLmxlbmd0aHx8c3RhdGUud2Vla3MuaW5jbHVkZXMoU3RyaW5nKHdlZWtOdW1iZXJWOChkYXRlKSkpKTsKIGlmKHN0YXRlLm1vZGU9PT0ncXVhcnRlcicpcmV0dXJuICFzdGF0ZS5xdWFydGVyfHxxdWFydGVyS2V5VjgoZGF0ZSk9PT1zdGF0ZS5xdWFydGVyOwogcmV0dXJuICghZnJvbXx8ZGF0ZT49ZnJvbSkmJighdG98fGRhdGU8PXRvKTsKfQpzbGljZVJvd3M9ZnVuY3Rpb24oZmlsdGVycz17fSxmcm9tPSQoJyNmcm9tJykudmFsdWUsdG89JCgnI3RvJykudmFsdWUpewogY29uc3Qgc2NvcGU9ZmlsdGVycz09PXZpZXdTdGF0ZS5BLmZpbHRlcnM/J0EnOmZpbHRlcnM9PT12aWV3U3RhdGUuQi5maWx0ZXJzPydCJzonZ2xvYmFsJyxzdGF0ZT1jYWxlbmRhclN0YXRlVjgoc2NvcGUpOwogcmV0dXJuIGRhdGEucm93cy5maWx0ZXIocj0+YWNjZXB0c0NhbGVuZGFyVjgocixzdGF0ZSxmcm9tLHRvKSYmT2JqZWN0LmVudHJpZXMoZmlsdGVycykuZXZlcnkoKFtrLHZhbHVlc10pPT4hdmFsdWVzLmxlbmd0aHx8dmFsdWVzLmluY2x1ZGVzKFN0cmluZyhyW2tdPz8nU2luIGRhdG8nKSkpKTsKfTsKZnVuY3Rpb24gd2Vla0xhYmVsVjgoeWVhcix3ZWVrLHJvd3M9W10pewogbGV0IGRhdGVzPVsuLi5uZXcgU2V0KHJvd3MuZmlsdGVyKHI9PnJbMF0uc3RhcnRzV2l0aCh5ZWFyKSYmd2Vla051bWJlclY4KHJbMF0pPT09TnVtYmVyKHdlZWspKS5tYXAocj0+clswXSkpXS5zb3J0KCk7CiBpZighZGF0ZXMubGVuZ3RoKXtjb25zdCBmaXJzdD1uZXcgRGF0ZShEYXRlLlVUQyhOdW1iZXIoeWVhciksMCwxKSksb2Zmc2V0PShmaXJzdC5nZXRVVENEYXkoKSs2KSU3LGQ9bmV3IERhdGUoZmlyc3QuZ2V0VGltZSgpK01hdGgubWF4KDAsKE51bWJlcih3ZWVrKS0xKSo3LW9mZnNldCkqODY0ZTUpO2RhdGVzPVtkLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwxMCldfQogY29uc3QgbW9udGhzPVsuLi5uZXcgU2V0KGRhdGVzLm1hcChkPT5tb250aFNob3J0VjhbTnVtYmVyKGQuc2xpY2UoNSw3KSktMV0pKV07cmV0dXJuIG1vbnRocy5qb2luKCcvJykrJy0nK051bWJlcih3ZWVrKSsnIMK3ICcreWVhcjsKfQpjb25zdCBkaXNwbGF5QmVmb3JlVjg9ZGlzcGxheURhdGVzVjU7CmRpc3BsYXlEYXRlc1Y1PWZ1bmN0aW9uKHZhbHVlKXtsZXQgdGV4dD1TdHJpbmcodmFsdWU/PycnKS5yZXBsYWNlKC9cYihcZHs0fSkgwrcgUyhcZHsxLDJ9KVxiL2csKG0seSx3KT0+d2Vla0xhYmVsRmFzdExBKHksdykpLnJlcGxhY2UoL1xiKFxkezR9KS1UKFsxLTRdKVxiL2csKG0seSxxKT0+YFRyaW1lc3RyZSAke3F9IMK3ICR7eX1gKTtyZXR1cm4gZGlzcGxheUJlZm9yZVY4KHRleHQpfTsKY29uc3QgZGVzY3JpcHRpb25CZWZvcmVWOD1wZXJpb2REZXNjcmlwdGlvblY0OwpwZXJpb2REZXNjcmlwdGlvblY0PWZ1bmN0aW9uKG5hbWUscG9pbnRzKXtjb25zdCByZXN1bHQ9ZGVzY3JpcHRpb25CZWZvcmVWOChuYW1lLHBvaW50cyksbWF0Y2g9bmFtZS5tYXRjaCgvXihcZHs0fSkgwrcgUyhcZHsxLDJ9KSQvKTtpZihtYXRjaCl7cmVzdWx0LmxhYmVsPXdlZWtMYWJlbFY4KG1hdGNoWzFdLG1hdGNoWzJdLHBvaW50cy5mbGF0TWFwKHA9PnAucm93c3x8W10pKTtyZXN1bHQuZnVsbD1yZXN1bHQubGFiZWwrJyDCtyBEYXRvczogJytyZXN1bHQucmFuZ2V9cmV0dXJuIHJlc3VsdH07CmNvbnN0IGtleUJlZm9yZVY4PXBlcmlvZEtleTsKcGVyaW9kS2V5PWZ1bmN0aW9uKHJvdyxncmFpbil7cmV0dXJuIGdyYWluPT09J3F1YXJ0ZXInP3F1YXJ0ZXJLZXlWOChyb3dbMF0pOmtleUJlZm9yZVY4KHJvdyxncmFpbil9Owpjb25zdCByZXBvcnRQZXJpb2RCZWZvcmVWOD1yZXBvcnRQZXJpb2Q7CnJlcG9ydFBlcmlvZD1mdW5jdGlvbihyb3csdHlwZSl7Y29uc3Qgc3RhdGU9dGFiPT09J1JlcG9ydGUgc2VtYW5hbCc/dmlld1N0YXRlLndlZWtseTp0YWI9PT0nUmVwb3J0ZSBtZW5zdWFsJz92aWV3U3RhdGUubW9udGhseTp0YWI9PT0nRXZvbHV0aXZvIG1lbnN1YWwnP3ZpZXdTdGF0ZS5tb250aGx5RXZvbHV0aW9uOm51bGw7cmV0dXJuIHN0YXRlPy5ncm91cFF1YXJ0ZXI/cXVhcnRlcktleVY4KHJvd1swXSk6cmVwb3J0UGVyaW9kQmVmb3JlVjgocm93LHR5cGUpfTsKZnVuY3Rpb24gbW9udGhDaG9pY2VzVjgoKXtyZXR1cm4gWy4uLm5ldyBTZXQoZGF0YS5yb3dzLm1hcChyPT5yWzBdLnNsaWNlKDAsNykpKV0uc29ydCgpfQpmdW5jdGlvbiBjYWxlbmRhclBhbmVsVjgoc2NvcGUpewogY29uc3Qgc3RhdGU9Y2FsZW5kYXJTdGF0ZVY4KHNjb3BlKSxtb250aHM9bW9udGhDaG9pY2VzVjgoKSxxdWFydGVycz1bLi4ubmV3IFNldChkYXRhLnJvd3MubWFwKHI9PnF1YXJ0ZXJLZXlWOChyWzBdKSkpXS5zb3J0KCk7c3RhdGUubW9udGh8fD1tb250aHMuYXQoLTEpfHwnJztzdGF0ZS5xdWFydGVyfHw9cXVhcnRlcnMuYXQoLTEpfHwnJzsKIGNvbnN0IHdlZWtzPVsuLi5uZXcgU2V0KGRhdGEucm93cy5maWx0ZXIocj0+clswXS5zdGFydHNXaXRoKHN0YXRlLm1vbnRoKSkubWFwKHI9PndlZWtOdW1iZXJWOChyWzBdKSkpXS5zb3J0KChhLGIpPT5hLWIpOwogbGV0IGRldGFpbHM9Jyc7CiBpZihzdGF0ZS5tb2RlPT09J2RhdGVzJylkZXRhaWxzPWA8bGFiZWw+QWdyZWdhciB1bmEgZmVjaGEgY29uIGNhbGVuZGFyaW88aW5wdXQgdHlwZT0iZGF0ZSIgaWQ9ImRheS0ke3Njb3BlfSI+PC9sYWJlbD48YnV0dG9uIGRhdGEtYWRkZGF5PSIke3Njb3BlfSI+QWdyZWdhciBkw61hPC9idXR0b24+PGRpdiBjbGFzcz0iZGF0ZWNoaXBzIj4ke3N0YXRlLmRhdGVzLm1hcChkPT5gPGJ1dHRvbiBkYXRhLXJlbW92ZWRheT0iJHtzY29wZX18JHtkfSI+JHtkaXNwbGF5RGF0ZXNWNShkKX0gw5c8L2J1dHRvbj5gKS5qb2luKCcnKXx8JzxzcGFuPkVsaWdlIHVubyBvIHZhcmlvcyBkw61hcyBlc3BlY8OtZmljb3MuPC9zcGFuPid9PC9kaXY+YDsKIGlmKFsnbW9udGgnLCd3ZWVrJ10uaW5jbHVkZXMoc3RhdGUubW9kZSkpZGV0YWlscz1gPGxhYmVsPjEuIE1lczxzZWxlY3QgZGF0YS1jYWxtb250aD0iJHtzY29wZX0iPiR7bW9udGhzLm1hcChtPT5gPG9wdGlvbiB2YWx1ZT0iJHttfSIgJHttPT09c3RhdGUubW9udGg/J3NlbGVjdGVkJzonJ30+JHtkaXNwbGF5RGF0ZXNWNShtKX08L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48L2xhYmVsPiR7c3RhdGUubW9kZT09PSd3ZWVrJz9gPGxhYmVsPjIuIFNlbWFuYXMgZGVsIG1lczxzZWxlY3QgbXVsdGlwbGUgZGF0YS1jYWx3ZWVrcz0iJHtzY29wZX0iPiR7d2Vla3MubWFwKHc9Pntjb25zdCBkYXRlcz1kYXRhLnJvd3MuZmlsdGVyKHI9PnJbMF0uc3RhcnRzV2l0aChzdGF0ZS5tb250aCkmJndlZWtOdW1iZXJWOChyWzBdKT09PXcpLm1hcChyPT5yWzBdKS5zb3J0KCk7cmV0dXJuIGA8b3B0aW9uIHZhbHVlPSIke3d9IiAke3N0YXRlLndlZWtzLmluY2x1ZGVzKFN0cmluZyh3KSk/J3NlbGVjdGVkJzonJ30+JHttb250aFNob3J0VjhbTnVtYmVyKHN0YXRlLm1vbnRoLnNsaWNlKDUpKS0xXX0tJHt3fSDCtyAke2Rpc3BsYXlEYXRlc1Y1KGRhdGVzWzBdKX0gYSAke2Rpc3BsYXlEYXRlc1Y1KGRhdGVzLmF0KC0xKSl9PC9vcHRpb24+YH0pLmpvaW4oJycpfTwvc2VsZWN0PjwvbGFiZWw+PHNtYWxsPlNpbiBzZWxlY2Npw7NuIGRlIHNlbWFuYTogdG9kbyBlbCBtZXMuIEN0cmwvQ21kICsgY2xpYyBwZXJtaXRlIGVsZWdpciB2YXJpYXMuIFVuYSBzZW1hbmEgcXVlIGNydXphIGRlIG1lcyBpbmNsdXllIGFxdcOtIHNvbG8gbG9zIGTDrWFzIGRlbCBtZXMgZWxlZ2lkby48L3NtYWxsPmA6Jyd9YDsKIGlmKHN0YXRlLm1vZGU9PT0ncXVhcnRlcicpZGV0YWlscz1gPGxhYmVsPlRyaW1lc3RyZTxzZWxlY3QgZGF0YS1jYWxxdWFydGVyPSIke3Njb3BlfSI+JHtxdWFydGVycy5tYXAocT0+YDxvcHRpb24gdmFsdWU9IiR7cX0iICR7cT09PXN0YXRlLnF1YXJ0ZXI/J3NlbGVjdGVkJzonJ30+JHtkaXNwbGF5RGF0ZXNWNShxKX08L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48L2xhYmVsPmA7CiByZXR1cm4gYDxkaXYgY2xhc3M9ImNhbGVuZGFyUGFuZWwiIGRhdGEtY2FsZW5kYXJwYW5lbD0iJHtzY29wZX0iPjxkaXYgY2xhc3M9ImNhbGVuZGFyQ29udHJvbHMiPjxsYWJlbD5TZWxlY2Npb25hciBmZWNoYXMgcG9yPHNlbGVjdCBkYXRhLWNhbG1vZGU9IiR7c2NvcGV9Ij4ke09iamVjdC5lbnRyaWVzKHtyYW5nZTonUmFuZ28gY29uIGNhbGVuZGFyaW8nLGRhdGVzOidEw61hcyBlc3BlY8OtZmljb3MnLG1vbnRoOidNZXMnLHdlZWs6J01lcyB5IHNlbWFuYXMnLHF1YXJ0ZXI6J1RyaW1lc3RyZSd9KS5tYXAoKFtrLHZdKT0+YDxvcHRpb24gdmFsdWU9IiR7a30iICR7c3RhdGUubW9kZT09PWs/J3NlbGVjdGVkJzonJ30+JHt2fTwvb3B0aW9uPmApLmpvaW4oJycpfTwvc2VsZWN0PjwvbGFiZWw+JHtkZXRhaWxzfTwvZGl2PjwvZGl2PmA7Cn0KZnVuY3Rpb24gc2VsZWN0ZWREYXRlVGV4dFY4KHNjb3BlKXtjb25zdCBzdGF0ZT1jYWxlbmRhclN0YXRlVjgoc2NvcGUpO2lmKHN0YXRlLm1vZGU9PT0nZGF0ZXMnKXJldHVybiBzdGF0ZS5kYXRlcy5sZW5ndGg/c3RhdGUuZGF0ZXMubWFwKGRpc3BsYXlEYXRlc1Y1KS5qb2luKCcsICcpOidTaW4gZMOtYXMgZWxlZ2lkb3MnO2lmKHN0YXRlLm1vZGU9PT0nbW9udGgnKXJldHVybiBkaXNwbGF5RGF0ZXNWNShzdGF0ZS5tb250aCk7aWYoc3RhdGUubW9kZT09PSd3ZWVrJylyZXR1cm4gZGlzcGxheURhdGVzVjUoc3RhdGUubW9udGgpKyhzdGF0ZS53ZWVrcy5sZW5ndGg/JyDCtyBTZW1hbmFzICcrc3RhdGUud2Vla3Muam9pbignLCAnKTonIMK3IFRvZGFzIGxhcyBzZW1hbmFzJyk7aWYoc3RhdGUubW9kZT09PSdxdWFydGVyJylyZXR1cm4gZGlzcGxheURhdGVzVjUoc3RhdGUucXVhcnRlcik7Y29uc3QgZnJvbT1zY29wZT09PSdnbG9iYWwnPyQoJyNmcm9tJykudmFsdWU6dmlld1N0YXRlW3Njb3BlXS5mcm9tLHRvPXNjb3BlPT09J2dsb2JhbCc/JCgnI3RvJykudmFsdWU6dmlld1N0YXRlW3Njb3BlXS50bztyZXR1cm4gZGlzcGxheURhdGVzVjUoZnJvbSkrJyDihpIgJytkaXNwbGF5RGF0ZXNWNSh0byl9CmZ1bmN0aW9uIGJpbmRDYWxlbmRhcnNWOCgpewogZm9yKGNvbnN0IFthdHRyaWJ1dGUsa2V5XW9mIFtbJ2NhbG1vZGUnLCdtb2RlJ10sWydjYWxtb250aCcsJ21vbnRoJ10sWydjYWxxdWFydGVyJywncXVhcnRlciddXSlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS0nK2F0dHJpYnV0ZSsnXScpLmZvckVhY2goZWw9PmVsLm9uY2hhbmdlPSgpPT57bGV0IHN0YXRlPWNhbGVuZGFyU3RhdGVWOChlbC5kYXRhc2V0W2F0dHJpYnV0ZV0pO3N0YXRlW2tleV09ZWwudmFsdWU7aWYoa2V5PT09J21vbnRoJylzdGF0ZS53ZWVrcz1bXTtyZW5kZXIoKX0pOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY2Fsd2Vla3NdJykuZm9yRWFjaChlbD0+ZWwub25jaGFuZ2U9KCk9PntjYWxlbmRhclN0YXRlVjgoZWwuZGF0YXNldC5jYWx3ZWVrcykud2Vla3M9Wy4uLmVsLnNlbGVjdGVkT3B0aW9uc10ubWFwKG89Pm8udmFsdWUpO3JlbmRlcigpfSk7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hZGRkYXldJykuZm9yRWFjaChlbD0+ZWwub25jbGljaz0oKT0+e2NvbnN0IHNjb3BlPWVsLmRhdGFzZXQuYWRkZGF5LGQ9JCgnI2RheS0nK3Njb3BlKS52YWx1ZTtpZighZClyZXR1cm47Y29uc3Qgc3RhdGU9Y2FsZW5kYXJTdGF0ZVY4KHNjb3BlKTtpZighc3RhdGUuZGF0ZXMuaW5jbHVkZXMoZCkpc3RhdGUuZGF0ZXMucHVzaChkKTtzdGF0ZS5kYXRlcy5zb3J0KCk7cmVuZGVyKCl9KTsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXJlbW92ZWRheV0nKS5mb3JFYWNoKGVsPT5lbC5vbmNsaWNrPSgpPT57bGV0W3Njb3BlLGRheV09ZWwuZGF0YXNldC5yZW1vdmVkYXkuc3BsaXQoJ3wnKTtjYWxlbmRhclN0YXRlVjgoc2NvcGUpLmRhdGVzPWNhbGVuZGFyU3RhdGVWOChzY29wZSkuZGF0ZXMuZmlsdGVyKGQ9PmQhPT1kYXkpO3JlbmRlcigpfSk7Cn0KY29uc3QgY29weUJlZm9yZVY4PWNvbXBhcmVWaWV3Owpjb21wYXJlVmlldz1mdW5jdGlvbigpe2NvcHlCZWZvcmVWOCgpO2Zvcihjb25zdCBzY29wZSBvZiBbJ0EnLCdCJ10pe2NvbnN0IHBhbmVsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zaWRlJytzY29wZSk7cGFuZWwucXVlcnlTZWxlY3RvcignLmNvbXBhcmVEYXRlcycpLmluc2VydEFkamFjZW50SFRNTCgnYWZ0ZXJlbmQnLGNhbGVuZGFyUGFuZWxWOChzY29wZSkpO3BhbmVsLnF1ZXJ5U2VsZWN0b3IoJy5jb21wYXJlRGF0ZXMnKS5zdHlsZS5kaXNwbGF5PWNhbGVuZGFyU3RhdGVWOChzY29wZSkubW9kZT09PSdyYW5nZSc/J2dyaWQnOidub25lJztwYW5lbC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsYDxwIGNsYXNzPSJzaWduYWxub3RlIj5QZXLDrW9kbyAke3Njb3BlfTogJHtlc2Moc2VsZWN0ZWREYXRlVGV4dFY4KHNjb3BlKSl9PC9wPmApfQogY29uc3QgY29weT0kKCcjY29weUFCJykub25jbGljayxzd2FwPSQoJyNzd2FwQUInKS5vbmNsaWNrOyQoJyNjb3B5QUInKS5vbmNsaWNrPSgpPT57dmlld1N0YXRlLmNhbGVuZGFycz8/PXt9O3ZpZXdTdGF0ZS5jYWxlbmRhcnMuQj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNhbGVuZGFyU3RhdGVWOCgnQScpKSk7Y29weSgpfTskKCcjc3dhcEFCJykub25jbGljaz0oKT0+e2NvbnN0IGE9Y2FsZW5kYXJTdGF0ZVY4KCdBJyksYj1jYWxlbmRhclN0YXRlVjgoJ0InKTt2aWV3U3RhdGUuY2FsZW5kYXJzLkE9Yjt2aWV3U3RhdGUuY2FsZW5kYXJzLkI9YTtzd2FwKCl9Owp9Owpjb25zdCByZW5kZXJCZWZvcmVWOD1yZW5kZXI7CnJlbmRlcj1mdW5jdGlvbigpewogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNhbGVuZGFyUGFuZWwnKS5mb3JFYWNoKHBhbmVsPT5wYW5lbC5yZW1vdmUoKSk7CiBpZihkYXRhKXtmb3IoY29uc3Qgc2NvcGUgb2YgWydnbG9iYWwnLCdBJywnQiddKXtjb25zdCBzdGF0ZT1jYWxlbmRhclN0YXRlVjgoc2NvcGUpO3N0YXRlLm1vbnRofHw9bW9udGhDaG9pY2VzVjgoKS5hdCgtMSl8fCcnO3N0YXRlLnF1YXJ0ZXJ8fD1bLi4ubmV3IFNldChkYXRhLnJvd3MubWFwKHI9PnF1YXJ0ZXJLZXlWOChyWzBdKSkpXS5zb3J0KCkuYXQoLTEpfHwnJ319CiByZW5kZXJCZWZvcmVWOCgpO2lmKCFkYXRhKXJldHVybjsKIGlmKCFbJ0NvbXBhcmF0aXZvcycsJ01ldG9kb2xvZ8OtYSddLmluY2x1ZGVzKHRhYikpewogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5maWx0ZXJzJykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLGNhbGVuZGFyUGFuZWxWOCgnZ2xvYmFsJykpO2Zvcihjb25zdCBpZCBvZiBbJ2Zyb20nLCd0byddKSQoJyMnK2lkKS5jbG9zZXN0KCdsYWJlbCcpLnN0eWxlLmRpc3BsYXk9Y2FsZW5kYXJTdGF0ZVY4KCdnbG9iYWwnKS5tb2RlPT09J3JhbmdlJz8nZmxleCc6J25vbmUnOyQoJyN2aWV3SGVscCcpLnRleHRDb250ZW50PXNlbGVjdGVkRGF0ZVRleHRWOCgnZ2xvYmFsJyk7CiB9CiBjb25zdCBzdGF0ZT10YWI9PT0nUmVwb3J0ZSBzZW1hbmFsJz92aWV3U3RhdGUud2Vla2x5OnRhYj09PSdSZXBvcnRlIG1lbnN1YWwnP3ZpZXdTdGF0ZS5tb250aGx5OnRhYj09PSdFdm9sdXRpdm8gbWVuc3VhbCc/dmlld1N0YXRlLm1vbnRobHlFdm9sdXRpb246bnVsbDsKIGlmKHN0YXRlKXtjb25zdCBjb250cm9scz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY29udGVudCAudmlld2NvbnRyb2xzJyk7Y29udHJvbHMuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLHNlbGVjdG9yKCdBZ3J1cGFjacOzbiBkZWwgaW5mb3JtZScsJ3F1YXJ0ZXJHcm91cFY4JyxzdGF0ZS5ncm91cFF1YXJ0ZXI/J3F1YXJ0ZXInOidvcmlnaW5hbCcse29yaWdpbmFsOnRhYj09PSdSZXBvcnRlIHNlbWFuYWwnPydTZW1hbmFsJzonTWVuc3VhbCcscXVhcnRlcjonVHJpbWVzdHJhbCd9KSk7JCgnI3F1YXJ0ZXJHcm91cFY4Jykub25jaGFuZ2U9ZT0+e3N0YXRlLmdyb3VwUXVhcnRlcj1lLnRhcmdldC52YWx1ZT09PSdxdWFydGVyJztyZW5kZXIoKX19CiBpZih0YWI9PT0nRXZvbHVjacOzbicpe2NvbnN0IHNlbGVjdD0kKCcjZWdyYWluJyk7aWYoIVsuLi5zZWxlY3Qub3B0aW9uc10uc29tZShvPT5vLnZhbHVlPT09J3F1YXJ0ZXInKSlzZWxlY3QuYWRkKG5ldyBPcHRpb24oJ1RyaW1lc3RyYWwnLCdxdWFydGVyJykpO3NlbGVjdC52YWx1ZT12aWV3U3RhdGUuZXZvbHV0aW9uLmdyYWlufQogaWYodGFiIT09J01ldG9kb2xvZ8OtYScpJCgnI2NvbnRlbnQnKS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLGA8ZGl2IGNsYXNzPSJkYXRlU3VtbWFyeVY4Ij4ke3RhYj09PSdDb21wYXJhdGl2b3MnP2BBOiAke2VzYyhzZWxlY3RlZERhdGVUZXh0VjgoJ0EnKSl9PGJyPkI6ICR7ZXNjKHNlbGVjdGVkRGF0ZVRleHRWOCgnQicpKX1gOidQZXLDrW9kbyBzZWxlY2Npb25hZG86ICcrZXNjKHNlbGVjdGVkRGF0ZVRleHRWOCgnZ2xvYmFsJykpfTwvZGl2PmApOwogYmluZENhbGVuZGFyc1Y4KCk7ZGVjb3JhdGVDaGFydHNWOCgpO2Zvcm1hdFRleHREYXRlc1Y1KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21haW4nKSk7Cn07CmNvbnN0IHJlc2V0QmVmb3JlVjg9JCgnI3Jlc2V0Jykub25jbGljazskKCcjcmVzZXQnKS5vbmNsaWNrPSgpPT57dmlld1N0YXRlLmNhbGVuZGFycz8/PXt9O2RlbGV0ZSB2aWV3U3RhdGUuY2FsZW5kYXJzLmdsb2JhbDtyZXNldEJlZm9yZVY4KCl9OwoKYXN5bmMgZnVuY3Rpb24gY2hhcnRQbmdWOChzdmcsdGl0bGUsbGVnZW5kKXsKIGNvbnN0IGNsb25lPXN2Zy5jbG9uZU5vZGUodHJ1ZSksYm94PXN2Zy52aWV3Qm94LmJhc2VWYWwsd2lkdGg9Ym94LndpZHRofHw2MDAsaGVpZ2h0PWJveC5oZWlnaHR8fDM1MDsKIGNvbnN0IHN0eWxlPWdldENvbXB1dGVkU3R5bGUoc3ZnKSxiZz1zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXBsb3RiZycpLnRyaW0oKXx8JyNmZmYnLGZnPXN0eWxlLmdldFByb3BlcnR5VmFsdWUoJy0tcGxvdHRleHQnKS50cmltKCl8fCcjMjc0NTU5JyxncmlkPXN0eWxlLmdldFByb3BlcnR5VmFsdWUoJy0tcGxvdGdyaWQnKS50cmltKCl8fCcjZGJlNWVkJzsKIGNsb25lLnNldEF0dHJpYnV0ZSgneG1sbnMnLCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycpO2Nsb25lLnNldEF0dHJpYnV0ZSgnd2lkdGgnLHdpZHRoKTtjbG9uZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsaGVpZ2h0KTtjbG9uZS5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7Y2xvbmUuc2V0QXR0cmlidXRlKCdmb250LWZhbWlseScsJ0FyaWFsLCBzYW5zLXNlcmlmJyk7CiBsZXQgc2VyaWFsaXplZD1uZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKGNsb25lKS5yZXBsYWNlKC92YXJcKC0tcGxvdGJnXCkvZyxiZykucmVwbGFjZSgvdmFyXCgtLXBsb3R0ZXh0XCkvZyxmZykucmVwbGFjZSgvdmFyXCgtLXBsb3RncmlkXCkvZyxncmlkKTsKIGNvbnN0IHVybD1VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtzZXJpYWxpemVkXSx7dHlwZTonaW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04J30pKTsKIHRyeXtjb25zdCBpbWFnZT1hd2FpdCBuZXcgUHJvbWlzZSgob2ssbm8pPT57Y29uc3QgaT1uZXcgSW1hZ2U7aS5vbmxvYWQ9KCk9Pm9rKGkpO2kub25lcnJvcj0oKT0+bm8oRXJyb3IoJ05vIHNlIHB1ZG8gY29udmVydGlyIGVsIGdyw6FmaWNvIGEgaW1hZ2VuLicpKTtpLnNyYz11cmx9KTtjb25zdCBzY2FsZT1NYXRoLm1pbigyLDgwMDAvd2lkdGgpLGNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtjYW52YXMud2lkdGg9TWF0aC5jZWlsKHdpZHRoKnNjYWxlKTtjYW52YXMuaGVpZ2h0PU1hdGguY2VpbCgoaGVpZ2h0KzEzMCkqc2NhbGUpO2NvbnN0IGN0eD1jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtjdHguc2NhbGUoc2NhbGUsc2NhbGUpO2N0eC5maWxsU3R5bGU9Ymc7Y3R4LmZpbGxSZWN0KDAsMCx3aWR0aCxoZWlnaHQrMTMwKTtjdHguZmlsbFN0eWxlPWZnO2N0eC5mb250PSdib2xkIDI4cHggQXJpYWwnO2N0eC5maWxsVGV4dCh0aXRsZSwyNCw0MCx3aWR0aC00OCk7Y3R4LmZvbnQ9JzE2cHggQXJpYWwnO2N0eC5maWxsVGV4dChsZWdlbmQuc2xpY2UoMCxNYXRoLmZsb29yKHdpZHRoLzkpKSwyNCw3MCx3aWR0aC00OCk7Y3R4LmRyYXdJbWFnZShpbWFnZSwwLDEwMCx3aWR0aCxoZWlnaHQpO3JldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgob2ssbm8pPT5jYW52YXMudG9CbG9iKGJsb2I9PmJsb2I/b2soYmxvYik6bm8oRXJyb3IoJ05vIHNlIHB1ZG8gZ2VuZXJhciBlbCBQTkcuJykpLCdpbWFnZS9wbmcnKSl9ZmluYWxseXtVUkwucmV2b2tlT2JqZWN0VVJMKHVybCl9Cn0KZnVuY3Rpb24gZG93bmxvYWRCbG9iVjgoYmxvYixuYW1lKXtjb25zdCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTthLmhyZWY9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTthLmRvd25sb2FkPW5hbWU7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTthLmNsaWNrKCk7YS5yZW1vdmUoKTtzZXRUaW1lb3V0KCgpPT5VUkwucmV2b2tlT2JqZWN0VVJMKGEuaHJlZiksMjAwMCl9CmZ1bmN0aW9uIGRlY29yYXRlQ2hhcnRzVjgoKXsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjb250ZW50IC5jaGFydHNjcm9sbCcpLmZvckVhY2goKGhvc3QsaW5kZXgpPT57CiAgY29uc3Qgc3ZnPWhvc3QucXVlcnlTZWxlY3Rvcignc3ZnJyk7aWYoIXN2ZylyZXR1cm47Y29uc3QgY2FyZD1ob3N0LmNsb3Nlc3QoJy5jYXJkJyksdGl0bGU9Y2FyZD8ucXVlcnlTZWxlY3RvcignaDInKT8udGV4dENvbnRlbnR8fCdHcsOhZmljbycsbGVnZW5kPWNhcmQ/LnF1ZXJ5U2VsZWN0b3IoJy5sYWJlbGVkbGVnZW5kJyk/LnRleHRDb250ZW50fHwnJzsKICBjb25zdCBiYXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7YmFyLmNsYXNzTmFtZT0nY2hhcnRUb29sc1Y4JztiYXIuaW5uZXJIVE1MPSc8YnV0dG9uPkNvcGlhciBpbWFnZW48L2J1dHRvbj48YnV0dG9uPkRlc2NhcmdhciBQTkc8L2J1dHRvbj48c3BhbiByb2xlPSJzdGF0dXMiPjwvc3Bhbj4nO2hvc3QuYmVmb3JlKGJhcik7Y29uc3RbY29weSxzYXZlXT1iYXIucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJyksc3RhdHVzPWJhci5xdWVyeVNlbGVjdG9yKCdzcGFuJyk7CiAgc2F2ZS5vbmNsaWNrPWFzeW5jKCk9Pnt0cnl7c3RhdHVzLnRleHRDb250ZW50PSdHZW5lcmFuZG/igKYnO2Rvd25sb2FkQmxvYlY4KGF3YWl0IGNoYXJ0UG5nVjgoc3ZnLHRpdGxlLGxlZ2VuZCksJ0xBLWdyYWZpY28tJysoaW5kZXgrMSkrJy5wbmcnKTtzdGF0dXMudGV4dENvbnRlbnQ9J0ltYWdlbiBkZXNjYXJnYWRhJ31jYXRjaChlKXtzdGF0dXMudGV4dENvbnRlbnQ9ZS5tZXNzYWdlfX07CiAgY29weS5vbmNsaWNrPWFzeW5jKCk9Pntjb25zdCBwbmc9Y2hhcnRQbmdWOChzdmcsdGl0bGUsbGVnZW5kKTt0cnl7aWYoIW5hdmlnYXRvci5jbGlwYm9hcmQ/LndyaXRlfHx0eXBlb2YgQ2xpcGJvYXJkSXRlbT09PSd1bmRlZmluZWQnKXRocm93IEVycm9yKCdQb3J0YXBhcGVsZXMgbm8gZGlzcG9uaWJsZScpO2F3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGUoW25ldyBDbGlwYm9hcmRJdGVtKHsnaW1hZ2UvcG5nJzpwbmd9KV0pO3N0YXR1cy50ZXh0Q29udGVudD0nQ29waWFkby4gUHVlZGVzIHBlZ2FybG8gZW4gV29yZCwgUG93ZXJQb2ludCBvIGNvcnJlby4nfWNhdGNoKGUpe3RyeXtkb3dubG9hZEJsb2JWOChhd2FpdCBwbmcsJ0xBLWdyYWZpY28tJysoaW5kZXgrMSkrJy5wbmcnKTtzdGF0dXMudGV4dENvbnRlbnQ9J0VsIG5hdmVnYWRvciBubyBwZXJtaXRpw7MgY29waWFyLiBTZSBkZXNjYXJnw7MgZWwgUE5HLid9Y2F0Y2goZXJyKXtzdGF0dXMudGV4dENvbnRlbnQ9ZXJyLm1lc3NhZ2V9fX07CiB9KTsKfQovLyBNaW5pbWFsIFhMU1ggd3JpdGVyOiBpbmxpbmUgc3RyaW5ncyArIG51bWJlcnMgaW4gYW4gdW5jb21wcmVzc2VkIFpJUC4KLy8gRGF0YSBpcyBnZW5lcmF0ZWQgaW4gdGhlIGJyb3dzZXI7IG5vIGV4dHJhIHNlcnZpY2Ugb3IgZXh0ZXJuYWwgbGlicmFyeSBpcyB1c2VkLgpmdW5jdGlvbiB4bWxFc2NhcGVWOCh2YWx1ZSl7cmV0dXJuIFN0cmluZyh2YWx1ZT8/JycpLnJlcGxhY2UoL1tcdTAwMDAtXHUwMDA4XHUwMDBCXHUwMDBDXHUwMDBFLVx1MDAxRl0vZywnJykucmVwbGFjZSgvWyY8PiInXS9nLGM9Pih7JyYnOicmYW1wOycsJzwnOicmbHQ7JywnPic6JyZndDsnLCciJzonJnF1b3Q7JywiJyI6JyZhcG9zOyd9W2NdKSl9CmZ1bmN0aW9uIGNvbE5hbWVWOChpKXtsZXQgcz0nJztmb3IoaSsrO2k7aT1NYXRoLmZsb29yKChpLTEpLzI2KSlzPVN0cmluZy5mcm9tQ2hhckNvZGUoNjUrKGktMSklMjYpK3M7cmV0dXJuIHN9CmZ1bmN0aW9uIHNoZWV0WG1sVjgocm93cyl7cmV0dXJuIGA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+PHdvcmtzaGVldCB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIj48c2hlZXRWaWV3cz48c2hlZXRWaWV3IHdvcmtib29rVmlld0lkPSIwIj48cGFuZSB5U3BsaXQ9IjEiIHRvcExlZnRDZWxsPSJBMiIgYWN0aXZlUGFuZT0iYm90dG9tTGVmdCIgc3RhdGU9ImZyb3plbiIvPjwvc2hlZXRWaWV3Pjwvc2hlZXRWaWV3cz48c2hlZXRGb3JtYXRQciBkZWZhdWx0Um93SGVpZ2h0PSIxOCIvPjxjb2xzPjxjb2wgbWluPSIxIiBtYXg9IjEiIHdpZHRoPSIzMiIgY3VzdG9tV2lkdGg9IjEiLz48Y29sIG1pbj0iMiIgbWF4PSIxMDAiIHdpZHRoPSIyNCIgY3VzdG9tV2lkdGg9IjEiLz48L2NvbHM+PHNoZWV0RGF0YT4ke3Jvd3MubWFwKChyb3cscik9PmA8cm93IHI9IiR7cisxfSI+JHtyb3cubWFwKCh2LGMpPT57Y29uc3QgcmVmPWNvbE5hbWVWOChjKSsocisxKTtyZXR1cm4gdHlwZW9mIHY9PT0nbnVtYmVyJyYmTnVtYmVyLmlzRmluaXRlKHYpP2A8YyByPSIke3JlZn0iIHM9IiR7cj09PTA/MTovcGF5b3V0fGRlc3ZpYWNpw7NuIG5jYy9pLnRlc3QoU3RyaW5nKHJvd3NbMF0/LltjXT8/JycpKT8zOjJ9Ij48dj4ke3Z9PC92PjwvYz5gOmA8YyByPSIke3JlZn0iIHM9IiR7cj09PTA/MTowfSIgdD0iaW5saW5lU3RyIj48aXM+PHQgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+JHt4bWxFc2NhcGVWOCh0eXBlb2Ygdj09PSdzdHJpbmcnP2Rpc3BsYXlEYXRlc1Y1KHYpOnYpfTwvdD48L2lzPjwvYz5gfSkuam9pbignJyl9PC9yb3c+YCkuam9pbignJyl9PC9zaGVldERhdGE+JHtyb3dzLmxlbmd0aD4xP2A8YXV0b0ZpbHRlciByZWY9IkExOiR7Y29sTmFtZVY4KE1hdGgubWF4KC4uLnJvd3MubWFwKHI9PnIubGVuZ3RoKSwxKS0xKX0ke3Jvd3MubGVuZ3RofSIvPmA6Jyd9PC93b3Jrc2hlZXQ+YH0KZnVuY3Rpb24gY3JjMzJWOChieXRlcyl7bGV0IGNyYz0weGZmZmZmZmZmO2Zvcihjb25zdCBiIG9mIGJ5dGVzKXtjcmNePWI7Zm9yKGxldCBrPTA7azw4O2srKyljcmM9KGNyYz4+PjEpXigoY3JjJjEpPzB4ZWRiODgzMjA6MCl9cmV0dXJuIChjcmNeMHhmZmZmZmZmZik+Pj4wfQpmdW5jdGlvbiB6aXBGaWxlc1Y4KGZpbGVzKXtjb25zdCBlbmNvZGVyPW5ldyBUZXh0RW5jb2Rlcixsb2NhbD1bXSxjZW50cmFsPVtdO2xldCBvZmZzZXQ9MDtmb3IoY29uc3RbbmFtZSx0ZXh0XW9mIGZpbGVzKXtjb25zdCBuPWVuY29kZXIuZW5jb2RlKG5hbWUpLGRhdGE9ZW5jb2Rlci5lbmNvZGUodGV4dCksY3JjPWNyYzMyVjgoZGF0YSksbGg9bmV3IFVpbnQ4QXJyYXkoMzApLGx2PW5ldyBEYXRhVmlldyhsaC5idWZmZXIpO2x2LnNldFVpbnQzMigwLDB4MDQwMzRiNTAsdHJ1ZSk7bHYuc2V0VWludDE2KDQsMjAsdHJ1ZSk7bHYuc2V0VWludDE2KDYsMHg4MDAsdHJ1ZSk7bHYuc2V0VWludDMyKDE0LGNyYyx0cnVlKTtsdi5zZXRVaW50MzIoMTgsZGF0YS5sZW5ndGgsdHJ1ZSk7bHYuc2V0VWludDMyKDIyLGRhdGEubGVuZ3RoLHRydWUpO2x2LnNldFVpbnQxNigyNixuLmxlbmd0aCx0cnVlKTtsb2NhbC5wdXNoKGxoLG4sZGF0YSk7Y29uc3QgY2g9bmV3IFVpbnQ4QXJyYXkoNDYpLGN2PW5ldyBEYXRhVmlldyhjaC5idWZmZXIpO2N2LnNldFVpbnQzMigwLDB4MDIwMTRiNTAsdHJ1ZSk7Y3Yuc2V0VWludDE2KDQsMjAsdHJ1ZSk7Y3Yuc2V0VWludDE2KDYsMjAsdHJ1ZSk7Y3Yuc2V0VWludDE2KDgsMHg4MDAsdHJ1ZSk7Y3Yuc2V0VWludDMyKDE2LGNyYyx0cnVlKTtjdi5zZXRVaW50MzIoMjAsZGF0YS5sZW5ndGgsdHJ1ZSk7Y3Yuc2V0VWludDMyKDI0LGRhdGEubGVuZ3RoLHRydWUpO2N2LnNldFVpbnQxNigyOCxuLmxlbmd0aCx0cnVlKTtjdi5zZXRVaW50MzIoNDIsb2Zmc2V0LHRydWUpO2NlbnRyYWwucHVzaChjaCxuKTtvZmZzZXQrPTMwK24ubGVuZ3RoK2RhdGEubGVuZ3RofWNvbnN0IGNlbnRyYWxTaXplPWNlbnRyYWwucmVkdWNlKChzLHgpPT5zK3gubGVuZ3RoLDApLGVuZD1uZXcgVWludDhBcnJheSgyMiksZXY9bmV3IERhdGFWaWV3KGVuZC5idWZmZXIpO2V2LnNldFVpbnQzMigwLDB4MDYwNTRiNTAsdHJ1ZSk7ZXYuc2V0VWludDE2KDgsZmlsZXMubGVuZ3RoLHRydWUpO2V2LnNldFVpbnQxNigxMCxmaWxlcy5sZW5ndGgsdHJ1ZSk7ZXYuc2V0VWludDMyKDEyLGNlbnRyYWxTaXplLHRydWUpO2V2LnNldFVpbnQzMigxNixvZmZzZXQsdHJ1ZSk7cmV0dXJuIG5ldyBCbG9iKFsuLi5sb2NhbCwuLi5jZW50cmFsLGVuZF0se3R5cGU6J2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0J30pfQpmdW5jdGlvbiB3b3JrYm9va0Jsb2JWOChzaGVldHMpewogY29uc3QgbnM9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZycsZmlsZXM9W107CiBmaWxlcy5wdXNoKFsnW0NvbnRlbnRfVHlwZXNdLnhtbCcsYDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PFR5cGVzIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L2NvbnRlbnQtdHlwZXMiPjxEZWZhdWx0IEV4dGVuc2lvbj0icmVscyIgQ29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1wYWNrYWdlLnJlbGF0aW9uc2hpcHMreG1sIi8+PERlZmF1bHQgRXh0ZW5zaW9uPSJ4bWwiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48T3ZlcnJpZGUgUGFydE5hbWU9Ii94bC93b3JrYm9vay54bWwiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldC5tYWluK3htbCIvPjxPdmVycmlkZSBQYXJ0TmFtZT0iL3hsL3N0eWxlcy54bWwiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zdHlsZXMreG1sIi8+JHtzaGVldHMubWFwKChzLGkpPT5gPE92ZXJyaWRlIFBhcnROYW1lPSIveGwvd29ya3NoZWV0cy9zaGVldCR7aSsxfS54bWwiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC53b3Jrc2hlZXQreG1sIi8+YCkuam9pbignJyl9PC9UeXBlcz5gXSk7CiBmaWxlcy5wdXNoKFsnX3JlbHMvLnJlbHMnLGA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjxSZWxhdGlvbnNoaXBzIHhtbG5zPSIke25zfS9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcyI+PFJlbGF0aW9uc2hpcCBJZD0icklkMSIgVHlwZT0iJHtuc30vb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL29mZmljZURvY3VtZW50IiBUYXJnZXQ9InhsL3dvcmtib29rLnhtbCIvPjwvUmVsYXRpb25zaGlwcz5gXSk7CiBmaWxlcy5wdXNoKFsneGwvd29ya2Jvb2sueG1sJyxgPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48d29ya2Jvb2sgeG1sbnM9IiR7bnN9L3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIiB4bWxuczpyPSIke25zfS9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMiPjxzaGVldHM+JHtzaGVldHMubWFwKChzLGkpPT5gPHNoZWV0IG5hbWU9IiR7eG1sRXNjYXBlVjgocy5uYW1lKX0iIHNoZWV0SWQ9IiR7aSsxfSIgcjppZD0icklkJHtpKzF9Ii8+YCkuam9pbignJyl9PC9zaGVldHM+PGNhbGNQciBjYWxjSWQ9IjE5MTAyOSIvPjwvd29ya2Jvb2s+YF0pOwogZmlsZXMucHVzaChbJ3hsL19yZWxzL3dvcmtib29rLnhtbC5yZWxzJyxgPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48UmVsYXRpb25zaGlwcyB4bWxucz0iJHtuc30vcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMiPiR7c2hlZXRzLm1hcCgocyxpKT0+YDxSZWxhdGlvbnNoaXAgSWQ9InJJZCR7aSsxfSIgVHlwZT0iJHtuc30vb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3dvcmtzaGVldCIgVGFyZ2V0PSJ3b3Jrc2hlZXRzL3NoZWV0JHtpKzF9LnhtbCIvPmApLmpvaW4oJycpfTxSZWxhdGlvbnNoaXAgSWQ9InJJZCR7c2hlZXRzLmxlbmd0aCsxfSIgVHlwZT0iJHtuc30vb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3N0eWxlcyIgVGFyZ2V0PSJzdHlsZXMueG1sIi8+PC9SZWxhdGlvbnNoaXBzPmBdKTsKIGZpbGVzLnB1c2goWyd4bC9zdHlsZXMueG1sJyxgPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3R5bGVTaGVldCB4bWxucz0iJHtuc30vc3ByZWFkc2hlZXRtbC8yMDA2L21haW4iPjxmb250cyBjb3VudD0iMiI+PGZvbnQ+PHN6IHZhbD0iMTEiLz48bmFtZSB2YWw9IkNhbGlicmkiLz48L2ZvbnQ+PGZvbnQ+PGIvPjxjb2xvciByZ2I9IkZGRkZGRkZGIi8+PHN6IHZhbD0iMTEiLz48bmFtZSB2YWw9IkNhbGlicmkiLz48L2ZvbnQ+PC9mb250cz48ZmlsbHMgY291bnQ9IjMiPjxmaWxsPjxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0ibm9uZSIvPjwvZmlsbD48ZmlsbD48cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9ImdyYXkxMjUiLz48L2ZpbGw+PGZpbGw+PHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSJzb2xpZCI+PGZnQ29sb3IgcmdiPSJGRjE3MzY1MiIvPjxiZ0NvbG9yIGluZGV4ZWQ9IjY0Ii8+PC9wYXR0ZXJuRmlsbD48L2ZpbGw+PC9maWxscz48Ym9yZGVycyBjb3VudD0iMSI+PGJvcmRlcj48bGVmdC8+PHJpZ2h0Lz48dG9wLz48Ym90dG9tLz48ZGlhZ29uYWwvPjwvYm9yZGVyPjwvYm9yZGVycz48Y2VsbFN0eWxlWGZzIGNvdW50PSIxIj48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIvPjwvY2VsbFN0eWxlWGZzPjxjZWxsWGZzIGNvdW50PSI0Ij48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgeGZJZD0iMCIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIxIiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIwIiB4ZklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIvPjx4ZiBudW1GbXRJZD0iNCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iMTAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48L2NlbGxYZnM+PGNlbGxTdHlsZXMgY291bnQ9IjEiPjxjZWxsU3R5bGUgbmFtZT0iTm9ybWFsIiB4ZklkPSIwIiBidWlsdGluSWQ9IjAiLz48L2NlbGxTdHlsZXM+PC9zdHlsZVNoZWV0PmBdKTsKIHNoZWV0cy5mb3JFYWNoKChzaGVldCxpKT0+ZmlsZXMucHVzaChbYHhsL3dvcmtzaGVldHMvc2hlZXQke2krMX0ueG1sYCxzaGVldFhtbFY4KHNoZWV0LnJvd3MpXSkpO3JldHVybiB6aXBGaWxlc1Y4KGZpbGVzKTsKfQpmdW5jdGlvbiBleHBvcnRFeGNlbFY4KCl7CiBpZighZGF0YXx8dGFiPT09J01ldG9kb2xvZ8OtYScpcmV0dXJuOwogY29uc3Qgc2VsZWN0aW9uPVtbJ1BhcsOhbWV0cm8nLCdTZWxlY2Npw7NuJ10sWydJbmZvcm1lJyx0YWJdLFsnQXJjaGl2byBmdWVudGUnLGRhdGEubmFtZV0sWydGZWNoYXMnLHRhYj09PSdDb21wYXJhdGl2b3MnPydWZXIgc2VsZWNjaW9uZXMgQSB5IEInOnNlbGVjdGVkRGF0ZVRleHRWOCgnZ2xvYmFsJyldLFsnRmlsdHJvcyB5IGNvbmZpZ3VyYWNpw7NuJyxKU09OLnN0cmluZ2lmeSh2aWV3U3RhdGUpXSxbJ1VuaWRhZGVzJywnSW1wb3J0ZXMgZW4gQ0xQLiBFbiBEYXRvcywgcGF5b3V0L3BvcmNlbnRhamVzIHNlIGV4cG9ydGFuIGNvbW8gZnJhY2Npw7NuICgwLDk1ID0gOTUlKS4gUmF0aW9zIGVuIG3Dumx0aXBsb3MgZGUgcmVmZXJlbmNpYS4nXSxbJ0NvbnRlbmlkbycsJ1RhYmxhcyB5IHZhbG9yZXMgZGVsIGluZm9ybWUuIExvcyBncsOhZmljb3Mgc2UgcHVlZGVuIGNvcGlhciBvIGRlc2NhcmdhciBjb21vIFBORyBkZXNkZSBsYSB3ZWIuJ11dOwogaWYodGFiPT09J0NvbXBhcmF0aXZvcycpc2VsZWN0aW9uLnB1c2goWydGZWNoYXMgQScsc2VsZWN0ZWREYXRlVGV4dFY4KCdBJyldLFsnRmVjaGFzIEInLHNlbGVjdGVkRGF0ZVRleHRWOCgnQicpXSk7CiBjb25zdCBzaGVldHM9W3tuYW1lOidEYXRvcycscm93czpleHBvcnRSb3dzLmxlbmd0aD9leHBvcnRSb3dzOltbJ1NpbiBkYXRvcyddXX0se25hbWU6J0NvbnN1bHRhJyxyb3dzOnNlbGVjdGlvbn1dOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NvbnRlbnQgdGFibGUnKS5mb3JFYWNoKCh0YWJsZSxpKT0+e2NvbnN0IHJvd3M9Wy4uLnRhYmxlLnJvd3NdLm1hcChyPT5bLi4uci5jZWxsc10ubWFwKGM9PmMuaW5uZXJUZXh0LnRyaW0oKSkpO2lmKHJvd3MubGVuZ3RoKXNoZWV0cy5wdXNoKHtuYW1lOidUYWJsYSAnKyhpKzEpLHJvd3N9KX0pOwogZG93bmxvYWRCbG9iVjgod29ya2Jvb2tCbG9iVjgoc2hlZXRzKSwnTEEtJyt0YWIucmVwbGFjZSgvW15hLXrDocOpw63Ds8O6w7EwLTldL2dpLCctJykrJy54bHN4Jyk7Cn0KY29uc3QgY3N2RXhwb3J0QmVmb3JlVjg9JCgnI3YyZXhwb3J0Jykub25jbGljazskKCcjdjJleHBvcnQnKS50ZXh0Q29udGVudD0n4oaTIEV4cG9ydGFyIEV4Y2VsJzskKCcjdjJleHBvcnQnKS5vbmNsaWNrPWV4cG9ydEV4Y2VsVjg7Cgpjb25zdCBycGNCZWZvcmVWOT1ycGM7CnJwYz1mdW5jdGlvbihuYW1lLC4uLmFyZ3Mpe3JldHVybiBuZXcgUHJvbWlzZSgob2ssbm8pPT57Y29uc3QgdGltZW91dD1zZXRUaW1lb3V0KCgpPT5ubyhFcnJvcignR29vZ2xlIG5vIHJlc3BvbmRpw7MgYSAnK25hbWUrJyBkZW50cm8gZGVsIHRpZW1wbyBlc3BlcmFkby4gUmVjYXJnYSBsYSB3ZWIgeSBjb21wcnVlYmEgdHUgc2VzacOzbi4nKSksbmFtZT09PSdpbXBvcnRNYXRyaXgnPzkwMDAwMDpuYW1lPT09J2dldFZpZXdzJz8xNTAwMDo5MDAwMCk7cnBjQmVmb3JlVjkobmFtZSwuLi5hcmdzKS50aGVuKHZhbHVlPT57Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO29rKHZhbHVlKX0sZXJyb3I9PntjbGVhclRpbWVvdXQodGltZW91dCk7bm8oZXJyb3IpfSl9KX07CmNhY2hlZD1hc3luYyBmdW5jdGlvbigpewogJCgnI3N0YXR1cycpLnRleHRDb250ZW50PSdSZWN1cGVyYW5kbyBsYSBtYXRyaXogcHJpdmFkYeKApic7CiBjb25zdCB0cmFuc3BvcnQ9YXdhaXQgcnBjKCdnZXRNYXRyaXhUcmFuc3BvcnQnKTsKIGlmKCF0cmFuc3BvcnR8fHRyYW5zcG9ydC5lbmNvZGluZyE9PSdnemlwLWJhc2U2NCd8fHR5cGVvZiB0cmFuc3BvcnQuZGF0YSE9PSdzdHJpbmcnKXRocm93IEVycm9yKCdMYSByZXNwdWVzdGEgZGVsIHNlcnZpZG9yIG5vIHRpZW5lIGVsIGZvcm1hdG8gZXNwZXJhZG8uIEFjdHVhbGl6YSB0YW1iacOpbiBDb2RlLmdzIHkgcHVibGljYSBhbWJvcyBhcmNoaXZvcyBqdW50b3MuJyk7CiAkKCcjc3RhdHVzJykudGV4dENvbnRlbnQ9J01hdHJpeiByZWNpYmlkYS4gUHJlcGFyYW5kbyBpbmZvcm1lc+KApic7CiBsZXQganNvbjsKIGlmKHR5cGVvZiBEZWNvbXByZXNzaW9uU3RyZWFtPT09J3VuZGVmaW5lZCcpanNvbj1hd2FpdCBycGMoJ2dldE1hdHJpeCcpOwogZWxzZXtjb25zdCBiaW5hcnk9YXRvYih0cmFuc3BvcnQuZGF0YSksYnl0ZXM9bmV3IFVpbnQ4QXJyYXkoYmluYXJ5Lmxlbmd0aCk7Zm9yKGxldCBpPTA7aTxiaW5hcnkubGVuZ3RoO2krKylieXRlc1tpXT1iaW5hcnkuY2hhckNvZGVBdChpKTtqc29uPWF3YWl0IG5ldyBSZXNwb25zZShuZXcgQmxvYihbYnl0ZXNdKS5zdHJlYW0oKS5waXBlVGhyb3VnaChuZXcgRGVjb21wcmVzc2lvblN0cmVhbSgnZ3ppcCcpKSkudGV4dCgpfQogY29uc3QgcmVzdWx0PWNsZWFuTWF0cml4VjcoSlNPTi5wYXJzZShqc29uKSk7aWYoIUFycmF5LmlzQXJyYXkocmVzdWx0LnJvd3MpfHwhcmVzdWx0LnJvd3MubGVuZ3RoKXRocm93IEVycm9yKCdMYSBtYXRyaXogbm8gY29udGllbmUgcmVnaXN0cm9zIGFwbGljYWJsZXMuJyk7cmV0dXJuIHJlc3VsdDsKfTsKYXN5bmMgZnVuY3Rpb24gc3RhcnREYXNoYm9hcmRWOSgpewogdHJ5ewogIGRhdGE9YXdhaXQgY2FjaGVkKCk7c2F2ZWRWaWV3cz1bXTtsb2FkVmlld3MoKTsKICAvLyBZaWVsZCBiZWZvcmUgcmVuZGVyaW5nIHNvIHRoZSByZWNlaXZlZC1kYXRhIHN0YXR1cyBjYW4gYmUgcGFpbnRlZC4KICBhd2FpdCBuZXcgUHJvbWlzZShvaz0+c2V0VGltZW91dChvaywwKSk7aW5pdCgpOwogIC8vIFNhdmVkIHZpZXdzIGFyZSBvcHRpb25hbDsgdGhleSBtdXN0IG5ldmVyIGJsb2NrIHRoZSBtYXRyaXgvZGFzaGJvYXJkLgogIHJwYygnZ2V0Vmlld3MnKS50aGVuKHZhbHVlPT57dHJ5e2NvbnN0IHZpZXdzPUpTT04ucGFyc2UodmFsdWUpO2lmKCFBcnJheS5pc0FycmF5KHZpZXdzKSl0aHJvdyBFcnJvcignRm9ybWF0byBkZSB2aXN0YXMgbm8gdsOhbGlkbycpO3NhdmVkVmlld3M9dmlld3M7bG9hZFZpZXdzKCl9Y2F0Y2goZXJyb3IpeyQoJyNzdGF0dXMnKS50ZXh0Q29udGVudCs9JyDCtyBObyBzZSBjYXJnYXJvbiBsYXMgdmlzdGFzIGd1YXJkYWRhczogJytlcnJvci5tZXNzYWdlfX0pLmNhdGNoKGVycm9yPT57JCgnI3N0YXR1cycpLnRleHRDb250ZW50Kz0nIMK3IE1hdHJpeiBkaXNwb25pYmxlOyBsYXMgdmlzdGFzIGd1YXJkYWRhcyBubyByZXNwb25kaWVyb24uJ30pOwogfWNhdGNoKGVycm9yKXskKCcjc3RhdHVzJykudGV4dENvbnRlbnQ9J05vIHNlIHB1ZG8gaW5pY2lhcjogJytlcnJvci5tZXNzYWdlKycgU2kgYXBhcmVjZSBnZXRNYXRyaXhUcmFuc3BvcnQsIHJlZW1wbGF6YSB0YW1iacOpbiBDb2RlLmdzIHBvciBsYSB2ZXJzacOzbiBudWV2YSB5IHZ1ZWx2ZSBhIGltcGxlbWVudGFyLic7Y29uc29sZS5lcnJvcihlcnJvcil9Cn0KY29uc3QgY2FsZW5kYXJCZWZvcmVWMTE9Y2FsZW5kYXJTdGF0ZVY4OwpjYWxlbmRhclN0YXRlVjg9ZnVuY3Rpb24oc2NvcGUpe2NvbnN0IHN0YXRlPWNhbGVuZGFyQmVmb3JlVjExKHNjb3BlKTtpZighQXJyYXkuaXNBcnJheShzdGF0ZS5tb250aHMpKXN0YXRlLm1vbnRocz1zdGF0ZS5tb250aD9bc3RhdGUubW9udGhdOltdO3N0YXRlLndlZWtzPShzdGF0ZS53ZWVrc3x8W10pLm1hcCh3PT5TdHJpbmcodykuaW5jbHVkZXMoJ3wnKT9TdHJpbmcodyk6KHN0YXRlLm1vbnRoP3N0YXRlLm1vbnRoKyd8Jyt3OlN0cmluZyh3KSkpO3JldHVybiBzdGF0ZX07CmNvbnN0IGFjY2VwdEJlZm9yZVYxMT1hY2NlcHRzQ2FsZW5kYXJWODsKYWNjZXB0c0NhbGVuZGFyVjg9ZnVuY3Rpb24ocm93LHN0YXRlLGZyb20sdG8pewogaWYoIVsnbW9udGgnLCd3ZWVrJ10uaW5jbHVkZXMoc3RhdGUubW9kZSkpcmV0dXJuIGFjY2VwdEJlZm9yZVYxMShyb3csc3RhdGUsZnJvbSx0byk7CiBjb25zdCBtb250aD1yb3dbMF0uc2xpY2UoMCw3KSxtb250aHM9QXJyYXkuaXNBcnJheShzdGF0ZS5tb250aHMpP3N0YXRlLm1vbnRoczpzdGF0ZS5tb250aD9bc3RhdGUubW9udGhdOltdOwogaWYobW9udGhzLmxlbmd0aCYmIW1vbnRocy5pbmNsdWRlcyhtb250aCkpcmV0dXJuIGZhbHNlOwogaWYoc3RhdGUubW9kZT09PSdtb250aCcpcmV0dXJuIHRydWU7CiBjb25zdCBrZXk9bW9udGgrJ3wnK3dlZWtOdW1iZXJWOChyb3dbMF0pO3JldHVybiAhc3RhdGUud2Vla3MubGVuZ3RofHxzdGF0ZS53ZWVrcy5pbmNsdWRlcyhrZXkpfHwoIUFycmF5LmlzQXJyYXkoc3RhdGUubW9udGhzKSYmc3RhdGUud2Vla3MuaW5jbHVkZXMoU3RyaW5nKHdlZWtOdW1iZXJWOChyb3dbMF0pKSkpOwp9Owpjb25zdCBwYW5lbEJlZm9yZVYxMT1jYWxlbmRhclBhbmVsVjg7CmNhbGVuZGFyUGFuZWxWOD1mdW5jdGlvbihzY29wZSl7CiBjb25zdCBzdGF0ZT1jYWxlbmRhclN0YXRlVjgoc2NvcGUpO2lmKCFbJ21vbnRoJywnd2VlayddLmluY2x1ZGVzKHN0YXRlLm1vZGUpKXJldHVybiBwYW5lbEJlZm9yZVYxMShzY29wZSk7CiBjb25zdCBtb250aHM9bW9udGhDaG9pY2VzVjgoKTtpZighc3RhdGUubW9udGhzLmxlbmd0aCYmc3RhdGUubW9udGgmJiFzdGF0ZS5tb250aHNJbml0aWFsaXplZCl7c3RhdGUubW9udGhzPVtzdGF0ZS5tb250aF07c3RhdGUubW9udGhzSW5pdGlhbGl6ZWQ9dHJ1ZX0KIGNvbnN0IHNlbGVjdGVkPXN0YXRlLm1vbnRocy5sZW5ndGg/c3RhdGUubW9udGhzOm1vbnRoczsKIGNvbnN0IG1vbnRoT3B0aW9ucz1tb250aHMubWFwKG09PmA8b3B0aW9uIHZhbHVlPSIke219IiAke3N0YXRlLm1vbnRocy5pbmNsdWRlcyhtKT8nc2VsZWN0ZWQnOicnfT4ke2Rpc3BsYXlEYXRlc1Y1KG0pfTwvb3B0aW9uPmApLmpvaW4oJycpOwogY29uc3Qgd2Vla09wdGlvbnM9c2VsZWN0ZWQubWFwKG09Pntjb25zdCB3ZWVrTWFwPW5ldyBNYXA7Zm9yKGNvbnN0IHIgb2YgZGF0YS5yb3dzKXtpZighclswXS5zdGFydHNXaXRoKG0pKWNvbnRpbnVlO2xldCB3PXdlZWtOdW1iZXJWOChyWzBdKTtpZighd2Vla01hcC5oYXModykpd2Vla01hcC5zZXQodyxbXSk7d2Vla01hcC5nZXQodykucHVzaChyWzBdKX1yZXR1cm4gYDxvcHRncm91cCBsYWJlbD0iJHtkaXNwbGF5RGF0ZXNWNShtKX0iPiR7Wy4uLndlZWtNYXBdLnNvcnQoKGEsYik9PmFbMF0tYlswXSkubWFwKChbdyxkYXRlc10pPT57ZGF0ZXMuc29ydCgpO2xldCBrZXk9bSsnfCcrdztyZXR1cm4gYDxvcHRpb24gdmFsdWU9IiR7a2V5fSIgJHtzdGF0ZS53ZWVrcy5pbmNsdWRlcyhrZXkpPydzZWxlY3RlZCc6Jyd9PiR7bW9udGhTaG9ydFY4W051bWJlcihtLnNsaWNlKDUpKS0xXX0tJHt3fSDCtyAke20uc2xpY2UoMCw0KX0gwrcgJHtkaXNwbGF5RGF0ZXNWNShkYXRlc1swXSl9IGEgJHtkaXNwbGF5RGF0ZXNWNShkYXRlcy5hdCgtMSkpfTwvb3B0aW9uPmB9KS5qb2luKCcnKX08L29wdGdyb3VwPmB9KS5qb2luKCcnKTsKIHJldHVybiBgPGRpdiBjbGFzcz0iY2FsZW5kYXJQYW5lbCIgZGF0YS1jYWxlbmRhcnBhbmVsPSIke3Njb3BlfSI+PGRpdiBjbGFzcz0iY2FsZW5kYXJDb250cm9scyI+PGxhYmVsPlNlbGVjY2lvbmFyIGZlY2hhcyBwb3I8c2VsZWN0IGRhdGEtY2FsbW9kZT0iJHtzY29wZX0iPiR7T2JqZWN0LmVudHJpZXMoe3JhbmdlOidSYW5nbyBjb24gY2FsZW5kYXJpbycsZGF0ZXM6J0TDrWFzIGVzcGVjw61maWNvcycsbW9udGg6J01lc2VzJyx3ZWVrOidNZXNlcyB5IHNlbWFuYXMnLHF1YXJ0ZXI6J1RyaW1lc3RyZSd9KS5tYXAoKFtrLHZdKT0+YDxvcHRpb24gdmFsdWU9IiR7a30iICR7c3RhdGUubW9kZT09PWs/J3NlbGVjdGVkJzonJ30+JHt2fTwvb3B0aW9uPmApLmpvaW4oJycpfTwvc2VsZWN0PjwvbGFiZWw+PGxhYmVsPjEuIE1lc2VzIMK3IEN0cmwvQ21kICsgY2xpYzxzZWxlY3QgbXVsdGlwbGUgZGF0YS1jYWxtb250aD0iJHtzY29wZX0iIGFyaWEtbGFiZWw9Ik1lc2VzIHNlbGVjY2lvbmFkb3MiPiR7bW9udGhPcHRpb25zfTwvc2VsZWN0PjwvbGFiZWw+JHtzdGF0ZS5tb2RlPT09J3dlZWsnP2A8bGFiZWw+Mi4gU2VtYW5hcyBkZSBsb3MgbWVzZXMgZWxlZ2lkb3M8c2VsZWN0IG11bHRpcGxlIGRhdGEtY2Fsd2Vla3M9IiR7c2NvcGV9Ij4ke3dlZWtPcHRpb25zfTwvc2VsZWN0PjwvbGFiZWw+YDonJ308c21hbGw+Q3RybC9DbWQgKyBjbGljIHBhcmEgc2VsZWNjaW9uYXIgdmFyaW9zIG1lc2VzJHtzdGF0ZS5tb2RlPT09J3dlZWsnPycgbyBzZW1hbmFzJzonJ30uIFNpbiBtZXNlcyBzZWxlY2Npb25hZG9zOiB0b2RvcyBsb3MgbWVzZXMuJHtzdGF0ZS5tb2RlPT09J3dlZWsnPycgU2luIHNlbWFuYXMgc2VsZWNjaW9uYWRhczogdG9kYXMgbGFzIHNlbWFuYXMgZGUgbG9zIG1lc2VzIGVsZWdpZG9zLiBDYWRhIHNlbWFuYSBpbmNsdXllIHNvbG8gbG9zIGTDrWFzIGRlIHN1IG1lcy4nOicnfTwvc21hbGw+PC9kaXY+PC9kaXY+YDsKfTsKY29uc3QgYmluZEJlZm9yZVYxMT1iaW5kQ2FsZW5kYXJzVjg7CmJpbmRDYWxlbmRhcnNWOD1mdW5jdGlvbigpe2JpbmRCZWZvcmVWMTEoKTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jYWxtb250aF0nKS5mb3JFYWNoKGVsPT5lbC5vbmNoYW5nZT0oKT0+e2NvbnN0IHN0YXRlPWNhbGVuZGFyU3RhdGVWOChlbC5kYXRhc2V0LmNhbG1vbnRoKTtzdGF0ZS5tb250aHM9Wy4uLmVsLnNlbGVjdGVkT3B0aW9uc10ubWFwKG89Pm8udmFsdWUpO3N0YXRlLm1vbnRoc0luaXRpYWxpemVkPXRydWU7c3RhdGUubW9udGg9c3RhdGUubW9udGhzWzBdfHwnJztzdGF0ZS53ZWVrcz1bXTtyZW5kZXIoKX0pO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWNhbHdlZWtzXScpLmZvckVhY2goZWw9PmVsLm9uY2hhbmdlPSgpPT57Y2FsZW5kYXJTdGF0ZVY4KGVsLmRhdGFzZXQuY2Fsd2Vla3MpLndlZWtzPVsuLi5lbC5zZWxlY3RlZE9wdGlvbnNdLm1hcChvPT5vLnZhbHVlKTtyZW5kZXIoKX0pfTsKY29uc3Qgc2VsZWN0ZWRCZWZvcmVWMTE9c2VsZWN0ZWREYXRlVGV4dFY4OwpzZWxlY3RlZERhdGVUZXh0Vjg9ZnVuY3Rpb24oc2NvcGUpe2NvbnN0IHM9Y2FsZW5kYXJTdGF0ZVY4KHNjb3BlKTtpZighWydtb250aCcsJ3dlZWsnXS5pbmNsdWRlcyhzLm1vZGUpKXJldHVybiBzZWxlY3RlZEJlZm9yZVYxMShzY29wZSk7Y29uc3QgbW9udGhzPXMubW9udGhzLmxlbmd0aD9zLm1vbnRocy5tYXAoZGlzcGxheURhdGVzVjUpLmpvaW4oJywgJyk6J1RvZG9zIGxvcyBtZXNlcyc7cmV0dXJuIG1vbnRocysocy5tb2RlPT09J3dlZWsnPyhzLndlZWtzLmxlbmd0aD8nIMK3ICcrcy53ZWVrcy5tYXAoa2V5PT57Y29uc3RbbSx3XT1rZXkuc3BsaXQoJ3wnKTtyZXR1cm4gbW9udGhTaG9ydFY4W051bWJlcihtLnNsaWNlKDUpKS0xXSsnLScrdysnIMK3ICcrbS5zbGljZSgwLDQpfSkuam9pbignLCAnKTonIMK3IFRvZGFzIGxhcyBzZW1hbmFzJyk6JycpfTsKCmNvbnN0IHBhbmVsQmVmb3JlVjEyPWNhbGVuZGFyUGFuZWxWODsKZnVuY3Rpb24gd2Vla0NoZWNrc1YxMihzY29wZSxtb250aHMsc2VsZWN0ZWRXZWVrcyl7CiBjb25zdCBhdmFpbGFibGU9bW9udGhzLmxlbmd0aD9tb250aHM6bW9udGhDaG9pY2VzVjgoKTsKIHJldHVybiBhdmFpbGFibGUubWFwKG1vbnRoPT57Y29uc3Qgd2Vla3M9bmV3IE1hcDtmb3IoY29uc3QgciBvZiBkYXRhLnJvd3Mpe2lmKCFyWzBdLnN0YXJ0c1dpdGgobW9udGgpKWNvbnRpbnVlO2NvbnN0IHc9d2Vla051bWJlclY4KHJbMF0pO2lmKCF3ZWVrcy5oYXModykpd2Vla3Muc2V0KHcsW10pO3dlZWtzLmdldCh3KS5wdXNoKHJbMF0pfXJldHVybiBgPGRpdiBjbGFzcz0id2Vla01vbnRoVjEyIj48Yj4ke2Rpc3BsYXlEYXRlc1Y1KG1vbnRoKX08L2I+JHtbLi4ud2Vla3NdLnNvcnQoKGEsYik9PmFbMF0tYlswXSkubWFwKChbdyxkYXRlc10pPT57ZGF0ZXMuc29ydCgpO2NvbnN0IHZhbHVlPW1vbnRoKyd8Jyt3O3JldHVybiBgPGxhYmVsIGNsYXNzPSJjaGVja0l0ZW1WMTIiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGF0YS13ZWVrY2hlY2s9IiR7c2NvcGV9IiB2YWx1ZT0iJHt2YWx1ZX0iICR7c2VsZWN0ZWRXZWVrcy5pbmNsdWRlcyh2YWx1ZSk/J2NoZWNrZWQnOicnfT48c3Bhbj4ke21vbnRoU2hvcnRWOFtOdW1iZXIobW9udGguc2xpY2UoNSkpLTFdfS0ke3d9IMK3ICR7bW9udGguc2xpY2UoMCw0KX08c21hbGw+JHtkaXNwbGF5RGF0ZXNWNShkYXRlc1swXSl9IOKGkiAke2Rpc3BsYXlEYXRlc1Y1KGRhdGVzLmF0KC0xKSl9PC9zbWFsbD48L3NwYW4+PC9sYWJlbD5gfSkuam9pbignJyl9PC9kaXY+YH0pLmpvaW4oJycpOwp9CmNhbGVuZGFyUGFuZWxWOD1mdW5jdGlvbihzY29wZSl7CiBjb25zdCBzdGF0ZT1jYWxlbmRhclN0YXRlVjgoc2NvcGUpO2lmKCFbJ21vbnRoJywnd2VlayddLmluY2x1ZGVzKHN0YXRlLm1vZGUpKXJldHVybiBwYW5lbEJlZm9yZVYxMihzY29wZSk7CiBjb25zdCBtb250aHM9bW9udGhDaG9pY2VzVjgoKTtpZighc3RhdGUubW9udGhzLmxlbmd0aCYmc3RhdGUubW9udGgmJiFzdGF0ZS5tb250aHNJbml0aWFsaXplZCl7c3RhdGUubW9udGhzPVtzdGF0ZS5tb250aF07c3RhdGUubW9udGhzSW5pdGlhbGl6ZWQ9dHJ1ZX0KIHJldHVybiBgPGRpdiBjbGFzcz0iY2FsZW5kYXJQYW5lbCIgZGF0YS1jYWxlbmRhcnBhbmVsPSIke3Njb3BlfSI+PGRpdiBjbGFzcz0iY2FsZW5kYXJDb250cm9scyI+PGxhYmVsPlNlbGVjY2lvbmFyIGZlY2hhcyBwb3I8c2VsZWN0IGRhdGEtY2FsbW9kZT0iJHtzY29wZX0iPiR7T2JqZWN0LmVudHJpZXMoe3JhbmdlOidSYW5nbyBjb24gY2FsZW5kYXJpbycsZGF0ZXM6J0TDrWFzIGVzcGVjw61maWNvcycsbW9udGg6J01lc2VzJyx3ZWVrOidNZXNlcyB5IHNlbWFuYXMnLHF1YXJ0ZXI6J1RyaW1lc3RyZSd9KS5tYXAoKFtrLHZdKT0+YDxvcHRpb24gdmFsdWU9IiR7a30iICR7c3RhdGUubW9kZT09PWs/J3NlbGVjdGVkJzonJ30+JHt2fTwvb3B0aW9uPmApLmpvaW4oJycpfTwvc2VsZWN0PjwvbGFiZWw+PC9kaXY+PGRpdiBjbGFzcz0ibW9udGhBY3Rpb25zVjEyIj48Yj4xLiBNYXJjYSBsb3MgbWVzZXMgcXVlIHF1aWVyYXMgY29uc3VsdGFyPC9iPjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLW1vbnRoYWxsPSIke3Njb3BlfSI+VG9kb3M8L2J1dHRvbj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1tb250aGNsZWFyPSIke3Njb3BlfSI+TGltcGlhcjwvYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9Im1vbnRoQ2hlY2tzVjEyIj4ke21vbnRocy5tYXAobT0+YDxsYWJlbCBjbGFzcz0iY2hlY2tJdGVtVjEyIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGRhdGEtbW9udGhjaGVjaz0iJHtzY29wZX0iIHZhbHVlPSIke219IiAke3N0YXRlLm1vbnRocy5pbmNsdWRlcyhtKT8nY2hlY2tlZCc6Jyd9PjxzcGFuPiR7ZGlzcGxheURhdGVzVjUobSl9PC9zcGFuPjwvbGFiZWw+YCkuam9pbignJyl9PC9kaXY+JHtzdGF0ZS5tb2RlPT09J3dlZWsnP2A8cD48Yj4yLiBNYXJjYSBsYXMgc2VtYW5hcyBkZSBlc29zIG1lc2VzPC9iPjwvcD48ZGl2IGNsYXNzPSJ3ZWVrQ2hlY2tzVjEyIiBkYXRhLXdlZWtsaXN0PSIke3Njb3BlfSI+JHt3ZWVrQ2hlY2tzVjEyKHNjb3BlLHN0YXRlLm1vbnRocyxzdGF0ZS53ZWVrcyl9PC9kaXY+YDonJ308ZGl2IGNsYXNzPSJhcHBseU1vbnRoc1YxMiI+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJwcmltYXJ5IiBkYXRhLWFwcGx5bW9udGhzPSIke3Njb3BlfSI+QXBsaWNhciBzZWxlY2Npw7NuPC9idXR0b24+PHNwYW4gZGF0YS1tb250aG1lc3NhZ2U9IiR7c2NvcGV9Ij5QdWVkZXMgbWFyY2FyIHZhcmlvcyBzaW4gdXNhciBDdHJsLiBMb3MgaW5mb3JtZXMgY2FtYmlhbiBhbCBwdWxzYXIgQXBsaWNhciBzZWxlY2Npw7NuLjwvc3Bhbj48L2Rpdj48cCBjbGFzcz0ic2lnbmFsbm90ZSI+U2luIG1lc2VzIG1hcmNhZG9zIHNlIGNvbnN1bHRhbiB0b2RvcyBsb3MgbWVzZXMuJHtzdGF0ZS5tb2RlPT09J3dlZWsnPycgU2luIHNlbWFuYXMgbWFyY2FkYXMgc2UgY29uc3VsdGFuIHRvZGFzIGxhcyBzZW1hbmFzIGRlIGxvcyBtZXNlcyBlbGVnaWRvcy4nOicnfTwvcD48L2Rpdj5gOwp9OwpmdW5jdGlvbiBjaGVja2VkVmFsdWVzVjEyKHNjb3BlLHR5cGUpe3JldHVybiBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtJyt0eXBlKyc9Iicrc2NvcGUrJyJdJyldLmZpbHRlcihlbD0+ZWwuY2hlY2tlZCkubWFwKGVsPT5lbC52YWx1ZSl9CmZ1bmN0aW9uIHJlZnJlc2hXZWVrc1YxMihzY29wZSl7Y29uc3QgY29udGFpbmVyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXdlZWtsaXN0PSInK3Njb3BlKyciXScpO2lmKGNvbnRhaW5lcil7Y29uc3Qgd2Vla3M9Y2hlY2tlZFZhbHVlc1YxMihzY29wZSwnd2Vla2NoZWNrJyk7Y29udGFpbmVyLmlubmVySFRNTD13ZWVrQ2hlY2tzVjEyKHNjb3BlLGNoZWNrZWRWYWx1ZXNWMTIoc2NvcGUsJ21vbnRoY2hlY2snKSx3ZWVrcyl9Y29uc3QgbWVzc2FnZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1tb250aG1lc3NhZ2U9Iicrc2NvcGUrJyJdJyk7aWYobWVzc2FnZSltZXNzYWdlLnRleHRDb250ZW50PSdTZWxlY2Npw7NuIHBlbmRpZW50ZS4gUHVsc2EgQXBsaWNhciBzZWxlY2Npw7NuIHBhcmEgYWN0dWFsaXphciBlbCBpbmZvcm1lLid9CmNvbnN0IGJpbmRCZWZvcmVWMTI9YmluZENhbGVuZGFyc1Y4OwpiaW5kQ2FsZW5kYXJzVjg9ZnVuY3Rpb24oKXsKIGJpbmRCZWZvcmVWMTIoKTsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW1vbnRoY2hlY2tdJykuZm9yRWFjaChlbD0+ZWwub25jaGFuZ2U9KCk9PnJlZnJlc2hXZWVrc1YxMihlbC5kYXRhc2V0Lm1vbnRoY2hlY2spKTsKIGZvcihjb25zdFt0eXBlLGNoZWNrZWRdb2YgW1snbW9udGhhbGwnLHRydWVdLFsnbW9udGhjbGVhcicsZmFsc2VdXSlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS0nK3R5cGUrJ10nKS5mb3JFYWNoKGJ1dHRvbj0+YnV0dG9uLm9uY2xpY2s9KCk9Pntjb25zdCBzY29wZT1idXR0b24uZGF0YXNldFt0eXBlXTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1tb250aGNoZWNrPSInK3Njb3BlKyciXScpLmZvckVhY2goZWw9PmVsLmNoZWNrZWQ9Y2hlY2tlZCk7cmVmcmVzaFdlZWtzVjEyKHNjb3BlKX0pOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYXBwbHltb250aHNdJykuZm9yRWFjaChidXR0b249PmJ1dHRvbi5vbmNsaWNrPSgpPT57Y29uc3Qgc2NvcGU9YnV0dG9uLmRhdGFzZXQuYXBwbHltb250aHMsc3RhdGU9Y2FsZW5kYXJTdGF0ZVY4KHNjb3BlKTtzdGF0ZS5tb250aHM9Y2hlY2tlZFZhbHVlc1YxMihzY29wZSwnbW9udGhjaGVjaycpO3N0YXRlLm1vbnRoc0luaXRpYWxpemVkPXRydWU7c3RhdGUubW9udGg9c3RhdGUubW9udGhzWzBdfHwnJztzdGF0ZS53ZWVrcz1zdGF0ZS5tb2RlPT09J3dlZWsnP2NoZWNrZWRWYWx1ZXNWMTIoc2NvcGUsJ3dlZWtjaGVjaycpOltdO3JlbmRlcigpfSk7Cn07Cgpjb25zdCBwYW5lbEJlZm9yZVYxMz1jYWxlbmRhclBhbmVsVjg7CmZ1bmN0aW9uIHNlbGVjdGlvbkNhcHRpb25WMTModmFsdWVzLHR5cGUpe2lmKCF2YWx1ZXMubGVuZ3RoKXJldHVybiB0eXBlPT09J21vbnRoJz8nVG9kb3MgbG9zIG1lc2VzJzonVG9kYXMgbGFzIHNlbWFuYXMnO2lmKHZhbHVlcy5sZW5ndGg+MilyZXR1cm4gdmFsdWVzLmxlbmd0aCsodHlwZT09PSdtb250aCc/JyBtZXNlcyBzZWxlY2Npb25hZG9zJzonIHNlbWFuYXMgc2VsZWNjaW9uYWRhcycpO3JldHVybiB2YWx1ZXMubWFwKHZhbHVlPT57aWYodHlwZT09PSdtb250aCcpcmV0dXJuIGRpc3BsYXlEYXRlc1Y1KHZhbHVlKTtjb25zdFttLHddPXZhbHVlLnNwbGl0KCd8Jyk7cmV0dXJuIG1vbnRoU2hvcnRWOFtOdW1iZXIobS5zbGljZSg1KSktMV0rJy0nK3crJyDCtyAnK20uc2xpY2UoMCw0KX0pLmpvaW4oJywgJyl9CmNhbGVuZGFyUGFuZWxWOD1mdW5jdGlvbihzY29wZSl7CiBjb25zdCBzdGF0ZT1jYWxlbmRhclN0YXRlVjgoc2NvcGUpO2lmKCFbJ21vbnRoJywnd2VlayddLmluY2x1ZGVzKHN0YXRlLm1vZGUpKXJldHVybiBwYW5lbEJlZm9yZVYxMyhzY29wZSk7CiBjb25zdCBtb250aHM9bW9udGhDaG9pY2VzVjgoKTtpZighc3RhdGUubW9udGhzLmxlbmd0aCYmc3RhdGUubW9udGgmJiFzdGF0ZS5tb250aHNJbml0aWFsaXplZCl7c3RhdGUubW9udGhzPVtzdGF0ZS5tb250aF07c3RhdGUubW9udGhzSW5pdGlhbGl6ZWQ9dHJ1ZX0KIGNvbnN0IGNoZWNrcz1tb250aHMubWFwKG09PmA8bGFiZWwgY2xhc3M9ImNoZWNrSXRlbVYxMiI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBkYXRhLW1vbnRoY2hlY2s9IiR7c2NvcGV9IiB2YWx1ZT0iJHttfSIgJHtzdGF0ZS5tb250aHMuaW5jbHVkZXMobSk/J2NoZWNrZWQnOicnfT48c3Bhbj4ke2Rpc3BsYXlEYXRlc1Y1KG0pfTwvc3Bhbj48L2xhYmVsPmApLmpvaW4oJycpOwogcmV0dXJuIGA8ZGl2IGNsYXNzPSJjYWxlbmRhclBhbmVsIGNvbXBhY3RDYWxlbmRhclYxMyIgZGF0YS1jYWxlbmRhcnBhbmVsPSIke3Njb3BlfSI+PGRpdiBjbGFzcz0iY29tcGFjdFJvd1YxMyI+PGxhYmVsPlNlbGVjY2lvbmFyIGZlY2hhcyBwb3I8c2VsZWN0IGRhdGEtY2FsbW9kZT0iJHtzY29wZX0iPiR7T2JqZWN0LmVudHJpZXMoe3JhbmdlOidSYW5nbyBjb24gY2FsZW5kYXJpbycsZGF0ZXM6J0TDrWFzIGVzcGVjw61maWNvcycsbW9udGg6J01lc2VzJyx3ZWVrOidNZXNlcyB5IHNlbWFuYXMnLHF1YXJ0ZXI6J1RyaW1lc3RyZSd9KS5tYXAoKFtrLHZdKT0+YDxvcHRpb24gdmFsdWU9IiR7a30iICR7c3RhdGUubW9kZT09PWs/J3NlbGVjdGVkJzonJ30+JHt2fTwvb3B0aW9uPmApLmpvaW4oJycpfTwvc2VsZWN0PjwvbGFiZWw+PGRpdiBjbGFzcz0iZHJvcGRvd25GaWVsZFYxMyI+PHNwYW4+TWVzZXM8L3NwYW4+PGRldGFpbHMgY2xhc3M9ImV4Y2VsRHJvcGRvd25WMTMiIGRhdGEtZXhjZWxkcm9wPSIke3Njb3BlfS1tb250aCI+PHN1bW1hcnk+PHNwYW4gZGF0YS1tb250aGNhcHRpb249IiR7c2NvcGV9Ij4ke2VzYyhzZWxlY3Rpb25DYXB0aW9uVjEzKHN0YXRlLm1vbnRocywnbW9udGgnKSl9PC9zcGFuPjxiPuKWvjwvYj48L3N1bW1hcnk+PGRpdiBjbGFzcz0iZXhjZWxNZW51VjEzIj48aW5wdXQgdHlwZT0ic2VhcmNoIiBwbGFjZWhvbGRlcj0iQnVzY2FyIG1lc+KApiIgYXJpYS1sYWJlbD0iQnVzY2FyIG1lcyIgZGF0YS1kcm9wZG93bnNlYXJjaD0ibW9udGgtJHtzY29wZX0iPjxkaXYgY2xhc3M9ImRyb3Bkb3duQWN0aW9uc1YxMyI+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtbW9udGhhbGw9IiR7c2NvcGV9Ij5TZWxlY2Npb25hciB0b2RvczwvYnV0dG9uPjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLW1vbnRoY2xlYXI9IiR7c2NvcGV9Ij5MaW1waWFyPC9idXR0b24+PC9kaXY+PGRpdiBjbGFzcz0ibW9udGhDaGVja3NWMTIiIGRhdGEtc2VhcmNobGlzdD0ibW9udGgtJHtzY29wZX0iPiR7Y2hlY2tzfTwvZGl2PjxzbWFsbD5NYXJjYSB2YXJpb3MgbWVzZXMgc2luIHVzYXIgQ3RybC48L3NtYWxsPjwvZGl2PjwvZGV0YWlscz48L2Rpdj4ke3N0YXRlLm1vZGU9PT0nd2Vlayc/YDxkaXYgY2xhc3M9ImRyb3Bkb3duRmllbGRWMTMiPjxzcGFuPlNlbWFuYXMgZGUgZXNvcyBtZXNlczwvc3Bhbj48ZGV0YWlscyBjbGFzcz0iZXhjZWxEcm9wZG93blYxMyIgZGF0YS1leGNlbGRyb3A9IiR7c2NvcGV9LXdlZWsiPjxzdW1tYXJ5PjxzcGFuIGRhdGEtd2Vla2NhcHRpb249IiR7c2NvcGV9Ij4ke2VzYyhzZWxlY3Rpb25DYXB0aW9uVjEzKHN0YXRlLndlZWtzLCd3ZWVrJykpfTwvc3Bhbj48Yj7ilr48L2I+PC9zdW1tYXJ5PjxkaXYgY2xhc3M9ImV4Y2VsTWVudVYxMyI+PGlucHV0IHR5cGU9InNlYXJjaCIgcGxhY2Vob2xkZXI9IkJ1c2NhciBzZW1hbmHigKYiIGFyaWEtbGFiZWw9IkJ1c2NhciBzZW1hbmEiIGRhdGEtZHJvcGRvd25zZWFyY2g9IndlZWstJHtzY29wZX0iPjxkaXYgY2xhc3M9ImRyb3Bkb3duQWN0aW9uc1YxMyI+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtd2Vla2FsbHYxMz0iJHtzY29wZX0iPlNlbGVjY2lvbmFyIHRvZGFzPC9idXR0b24+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtd2Vla2NsZWFydjEzPSIke3Njb3BlfSI+TGltcGlhcjwvYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9IndlZWtDaGVja3NWMTIiIGRhdGEtd2Vla2xpc3Q9IiR7c2NvcGV9IiBkYXRhLXNlYXJjaGxpc3Q9IndlZWstJHtzY29wZX0iPiR7d2Vla0NoZWNrc1YxMihzY29wZSxzdGF0ZS5tb250aHMsc3RhdGUud2Vla3MpfTwvZGl2PjxzbWFsbD5TaW4gc2VtYW5hcyBtYXJjYWRhczogdG9kYXMgbGFzIGRlIGxvcyBtZXNlcyBlbGVnaWRvcy48L3NtYWxsPjwvZGl2PjwvZGV0YWlscz48L2Rpdj5gOicnfTxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0icHJpbWFyeSIgZGF0YS1hcHBseW1vbnRocz0iJHtzY29wZX0iPkFwbGljYXIgc2VsZWNjacOzbjwvYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9ImNvbXBhY3RNZXNzYWdlVjEzIiBkYXRhLW1vbnRobWVzc2FnZT0iJHtzY29wZX0iPlNlbGVjY2lvbmEgbWVzZXMke3N0YXRlLm1vZGU9PT0nd2Vlayc/JyB5IHNlbWFuYXMnOicnfSB5IHB1bHNhIEFwbGljYXIgc2VsZWNjacOzbi48L2Rpdj48L2Rpdj5gOwp9OwpmdW5jdGlvbiB1cGRhdGVDYXB0aW9uc1YxMyhzY29wZSl7Y29uc3QgbW9udGg9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtbW9udGhjYXB0aW9uPSInK3Njb3BlKyciXScpLHdlZWs9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtd2Vla2NhcHRpb249Iicrc2NvcGUrJyJdJyk7aWYobW9udGgpbW9udGgudGV4dENvbnRlbnQ9c2VsZWN0aW9uQ2FwdGlvblYxMyhjaGVja2VkVmFsdWVzVjEyKHNjb3BlLCdtb250aGNoZWNrJyksJ21vbnRoJyk7aWYod2Vlayl3ZWVrLnRleHRDb250ZW50PXNlbGVjdGlvbkNhcHRpb25WMTMoY2hlY2tlZFZhbHVlc1YxMihzY29wZSwnd2Vla2NoZWNrJyksJ3dlZWsnKX0KY29uc3QgcmVmcmVzaEJlZm9yZVYxMz1yZWZyZXNoV2Vla3NWMTI7CnJlZnJlc2hXZWVrc1YxMj1mdW5jdGlvbihzY29wZSl7cmVmcmVzaEJlZm9yZVYxMyhzY29wZSk7dXBkYXRlQ2FwdGlvbnNWMTMoc2NvcGUpfTsKY29uc3QgYmluZEJlZm9yZVYxMz1iaW5kQ2FsZW5kYXJzVjg7CmJpbmRDYWxlbmRhcnNWOD1mdW5jdGlvbigpewogYmluZEJlZm9yZVYxMygpOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtd2Vla2NoZWNrXScpLmZvckVhY2goZWw9PmVsLm9uY2hhbmdlPSgpPT57dXBkYXRlQ2FwdGlvbnNWMTMoZWwuZGF0YXNldC53ZWVrY2hlY2spfSk7CiBmb3IoY29uc3RbdHlwZSxjaGVja2VkXW9mIFtbJ3dlZWthbGx2MTMnLHRydWVdLFsnd2Vla2NsZWFydjEzJyxmYWxzZV1dKWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLScrdHlwZSsnXScpLmZvckVhY2goYnV0dG9uPT5idXR0b24ub25jbGljaz0oKT0+e2NvbnN0IHNjb3BlPWJ1dHRvbi5kYXRhc2V0W3R5cGVdO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXdlZWtjaGVjaz0iJytzY29wZSsnIl0nKS5mb3JFYWNoKGVsPT5lbC5jaGVja2VkPWNoZWNrZWQpO3VwZGF0ZUNhcHRpb25zVjEzKHNjb3BlKX0pOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZHJvcGRvd25zZWFyY2hdJykuZm9yRWFjaChpbnB1dD0+aW5wdXQub25pbnB1dD0oKT0+e2NvbnN0IGxpc3Q9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtc2VhcmNobGlzdD0iJytpbnB1dC5kYXRhc2V0LmRyb3Bkb3duc2VhcmNoKyciXScpO2lmKCFsaXN0KXJldHVybjtjb25zdCBzZWFyY2g9aW5wdXQudmFsdWUudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKCdlcycpO2xpc3QucXVlcnlTZWxlY3RvckFsbCgnLmNoZWNrSXRlbVYxMicpLmZvckVhY2gobGFiZWw9PmxhYmVsLnN0eWxlLmRpc3BsYXk9bGFiZWwudGV4dENvbnRlbnQudG9Mb2NhbGVMb3dlckNhc2UoJ2VzJykuaW5jbHVkZXMoc2VhcmNoKT8nZmxleCc6J25vbmUnKX0pOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmV4Y2VsRHJvcGRvd25WMTMnKS5mb3JFYWNoKGRyb3A9PmRyb3AuYWRkRXZlbnRMaXN0ZW5lcigndG9nZ2xlJywoKT0+e2lmKGRyb3Aub3Blbilkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZXhjZWxEcm9wZG93blYxMycpLmZvckVhY2gob3RoZXI9PntpZihvdGhlciE9PWRyb3Apb3RoZXIub3Blbj1mYWxzZX0pfSkpOwp9OwovLyBXZWVrIG9wdGlvbnMgYXJlIHJlZ2VuZXJhdGVkIHdoZW4gbW9udGhzIGNoYW5nZTogaGFuZGxlIHRoZWlyIGNhcHRpb25zIGJ5IGRlbGVnYXRpb24uCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsZXZlbnQ9PntpZihldmVudC50YXJnZXQubWF0Y2hlcz8uKCdbZGF0YS13ZWVrY2hlY2tdJykpdXBkYXRlQ2FwdGlvbnNWMTMoZXZlbnQudGFyZ2V0LmRhdGFzZXQud2Vla2NoZWNrKX0pOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZXZlbnQ9PmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5leGNlbERyb3Bkb3duVjEzW29wZW5dJykuZm9yRWFjaChkcm9wPT57aWYoIWRyb3AuY29udGFpbnMoZXZlbnQudGFyZ2V0KSlkcm9wLm9wZW49ZmFsc2V9KSk7CmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGV2ZW50PT57aWYoZXZlbnQua2V5PT09J0VzY2FwZScpZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmV4Y2VsRHJvcGRvd25WMTNbb3Blbl0nKS5mb3JFYWNoKGRyb3A9PmRyb3Aub3Blbj1mYWxzZSl9KTsKCmxldCBhcHBTZXNzaW9uVjE1PW51bGwsc3RhcnRlZFNlc3Npb25WMTU9ZmFsc2U7CmZ1bmN0aW9uIHVwbG9hZFByb2dyZXNzTEEodGV4dCl7CiBmb3IoY29uc3QgaWQgb2YgWydsb2dpbk1lc3NhZ2VWMTUnLCdzdGF0dXMnXSl7Y29uc3QgZWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO2lmKGVsKWVsLnRleHRDb250ZW50PXRleHQ7fQp9CmFzeW5jIGZ1bmN0aW9uIHVwbG9hZENodW5rc0xBKGluY29taW5nLG1vZGUsZXhwZWN0ZWRSZXZpc2lvbix0b2tlbil7CiBpZighaW5jb21pbmc/LnJvd3M/Lmxlbmd0aCl0aHJvdyBFcnJvcignTGEgbWF0cml6IG5vIHRpZW5lIHJlZ2lzdHJvcyBhcGxpY2FibGVzLicpOwogaWYoaW5jb21pbmcucm93cy5sZW5ndGg+MjAwMDAwKXRocm93IEVycm9yKCdMYSBpbXBvcnRhY2nDs24gc3VwZXJhIDIwMC4wMDAgcmVnaXN0cm9zLicpOwogY29uc3QgZW5jb2RlZD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoaW5jb21pbmcpKTsKIGlmKGVuY29kZWQuYnl0ZUxlbmd0aD40MDAwMDAwMCl0aHJvdyBFcnJvcignRWwgYXJjaGl2byBub3JtYWxpemFkbyBzdXBlcmEgNDAgTUIuJyk7CiBjb25zdCBkaWdlc3Q9YXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoJ1NIQS0yNTYnLGVuY29kZWQpLGZpbmdlcnByaW50PUFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkoZGlnZXN0KSx4PT54LnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCcwJykpLmpvaW4oJycpOwogY29uc3QgcmV2aXNpb249ZXhwZWN0ZWRSZXZpc2lvbiYmZXhwZWN0ZWRSZXZpc2lvbiE9PSdpbml0aWFsJz9leHBlY3RlZFJldmlzaW9uOm51bGw7CiBjb25zdCBzdG9yYWdlS2V5PSdMQV9VUExPQUQ6JytmaW5nZXJwcmludCsnOicrbW9kZSsnOicrKHJldmlzaW9ufHwnaW5pdGlhbCcpOwogbGV0IHVwbG9hZElkO3RyeXt1cGxvYWRJZD1zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHN0b3JhZ2VLZXkpfWNhdGNoKGUpe30KIGlmKCF1cGxvYWRJZCl7dXBsb2FkSWQ9Y3J5cHRvLnJhbmRvbVVVSUQoKTt0cnl7c2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShzdG9yYWdlS2V5LHVwbG9hZElkKX1jYXRjaChlKXt9fQogY29uc3Qge3Jvd3MsLi4ubWV0YWRhdGF9PWluY29taW5nO2RlbGV0ZSBtZXRhZGF0YS5zdG9yYWdlUmV2aXNpb247CiBjb25zdCBwYXJ0cz1NYXRoLmNlaWwocm93cy5sZW5ndGgvNTAwKTsKIGFzeW5jIGZ1bmN0aW9uIGNhbGwobmFtZSxib2R5KXsKICBsZXQgbGFzdDsKICBmb3IobGV0IGF0dGVtcHQ9MDthdHRlbXB0PDM7YXR0ZW1wdCsrKXsKICAgdHJ5e3JldHVybiBhd2FpdCBzdXBhYmFzZVJlcXVlc3RMQSgnL3Jlc3QvdjEvcnBjLycrbmFtZSx7bWV0aG9kOidQT1NUJyxib2R5OkpTT04uc3RyaW5naWZ5KGJvZHkpfSx0b2tlbil9CiAgIGNhdGNoKGVycm9yKXtsYXN0PWVycm9yO2lmKGVycm9yLnN0YXR1cyYmZXJyb3Iuc3RhdHVzPDUwMCl0aHJvdyBlcnJvcjtpZihhdHRlbXB0PDIpYXdhaXQgbmV3IFByb21pc2Uob2s9PnNldFRpbWVvdXQob2ssKGF0dGVtcHQrMSkqMTAwMCkpO30KICB9CiAgdGhyb3cgRXJyb3IoJ0NhcmdhIGludGVycnVtcGlkYTogJytsYXN0Lm1lc3NhZ2UrJy4gVnVlbHZlIGEgc2VsZWNjaW9uYXIgZWwgbWlzbW8gYXJjaGl2byBwYXJhIHJlYW51ZGFyLicpOwogfQogdXBsb2FkUHJvZ3Jlc3NMQSgnSW5pY2lhbmRvIGNhcmdhIHBvciBibG9xdWVz4oCmJyk7CiBjb25zdCBzdGF0ZT1hd2FpdCBjYWxsKCdsYV91cGxvYWRfYmVnaW4nLHtwX3VwbG9hZDp1cGxvYWRJZCxwX21ldGFkYXRhOm1ldGFkYXRhLHBfbW9kZTptb2RlLHBfcmV2aXNpb246cmV2aXNpb24scF9wYXJ0czpwYXJ0cyxwX3Jvd3M6cm93cy5sZW5ndGgscF9maW5nZXJwcmludDpmaW5nZXJwcmludH0pOwogaWYoc3RhdGUucmVzdWx0KXt0cnl7c2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yYWdlS2V5KX1jYXRjaChlKXt9cmV0dXJuIHN0YXRlLnJlc3VsdH0KIGNvbnN0IHJlY2VpdmVkPW5ldyBTZXQoc3RhdGUucmVjZWl2ZWR8fFtdKTsKIGZvcihsZXQgcGFydD0wO3BhcnQ8cGFydHM7cGFydCsrKXsKICBpZighcmVjZWl2ZWQuaGFzKHBhcnQpKWF3YWl0IGNhbGwoJ2xhX3VwbG9hZF9wYXJ0Jyx7cF91cGxvYWQ6dXBsb2FkSWQscF9wYXJ0OnBhcnQscF9yb3dzOnJvd3Muc2xpY2UocGFydCo1MDAsKHBhcnQrMSkqNTAwKX0pOwogIHVwbG9hZFByb2dyZXNzTEEoJ0NhcmdhbmRvIGhpc3TDs3JpY286IGJsb3F1ZSAnKyhwYXJ0KzEpKycgZGUgJytwYXJ0cysnIMK3ICcrTWF0aC5taW4ocm93cy5sZW5ndGgsKHBhcnQrMSkqNTAwKS50b0xvY2FsZVN0cmluZygnZXMtQ0wnKSsnIHJlZ2lzdHJvcycpOwogfQogdXBsb2FkUHJvZ3Jlc3NMQSgnVG9kb3MgbG9zIGJsb3F1ZXMgcmVjaWJpZG9zLiBBY3RpdmFuZG8gaGlzdMOzcmljb+KApicpOwogY29uc3QgcmVzdWx0PWF3YWl0IGNhbGwoJ2xhX3VwbG9hZF9maW5pc2gnLHtwX3VwbG9hZDp1cGxvYWRJZH0pOwogdHJ5e3Nlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oc3RvcmFnZUtleSl9Y2F0Y2goZSl7fXJldHVybiByZXN1bHQ7Cn0KCi8vIFJlcGxhY2VzIEdvb2dsZSBSUEMsIGtlZXBpbmcgZGFzaGJvYXJkIGNhbGN1bGF0aW9ucyBhbmQgcmVwb3J0cyBpbnRhY3QuCmFzeW5jIGZ1bmN0aW9uIHN1cGFiYXNlUmVxdWVzdExBKHBhdGgsb3B0aW9ucz17fSx0b2tlbj1udWxsKXsKIGNvbnN0IGNvbmZpZz13aW5kb3cuTEFfQ09ORklHfHx7fTsKIGlmKCEvXmh0dHBzOlwvXC9bYS16MC05LV0rXC5zdXBhYmFzZVwuY28kLy50ZXN0KGNvbmZpZy5zdXBhYmFzZVVybHx8JycpfHwhY29uZmlnLnB1Ymxpc2hhYmxlS2V5KXRocm93IEVycm9yKCdGYWx0YSBjb25maWd1cmFyIGxhIFVSTCB5IGxhIGNsYXZlIHDDumJsaWNhIGRlIFN1cGFiYXNlIGVuIGNvbmZpZy5qcy4nKTsKIGlmKC9ec2Jfc2VjcmV0Xy8udGVzdChjb25maWcucHVibGlzaGFibGVLZXkpKXRocm93IEVycm9yKCdMYSBjb25maWd1cmFjacOzbiBjb250aWVuZSB1bmEgY2xhdmUgc2VjcmV0YS4gUmV0w61yYWxhIHkgcsOzdGFsYSBlbiBTdXBhYmFzZS4nKTsKIGlmKGNvbmZpZy5wdWJsaXNoYWJsZUtleS5zdGFydHNXaXRoKCdleUonKSl7CiAgbGV0IGNsYWltczt0cnl7Y2xhaW1zPUpTT04ucGFyc2UoYXRvYihjb25maWcucHVibGlzaGFibGVLZXkuc3BsaXQoJy4nKVsxXS5yZXBsYWNlKC8tL2csJysnKS5yZXBsYWNlKC9fL2csJy8nKSkpfWNhdGNoKGUpe3Rocm93IEVycm9yKCdDbGF2ZSBww7pibGljYSBoZXJlZGFkYSBubyB2w6FsaWRhLicpfQogIGlmKGNsYWltcy5yb2xlIT09J2Fub24nKXRocm93IEVycm9yKCdTb2xvIHNlIGFkbWl0ZSBsYSBjbGF2ZSBww7pibGljYSBhbm9uOyBudW5jYSBzZXJ2aWNlX3JvbGUuJyk7CiB9CiBjb25zdCBjb250cm9sbGVyPW5ldyBBYm9ydENvbnRyb2xsZXIoKSx0aW1lcj1zZXRUaW1lb3V0KCgpPT5jb250cm9sbGVyLmFib3J0KCksOTAwMDApOwogdHJ5ewogIGNvbnN0IGhlYWRlcnM9e2FwaWtleTpjb25maWcucHVibGlzaGFibGVLZXksJ0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9uL2pzb24nLC4uLih0b2tlbj97QXV0aG9yaXphdGlvbjonQmVhcmVyICcrdG9rZW59Ont9KSwuLi4ob3B0aW9ucy5oZWFkZXJzfHx7fSl9OwogIGNvbnN0IHJlc3BvbnNlPWF3YWl0IGZldGNoKGNvbmZpZy5zdXBhYmFzZVVybCtwYXRoLHsuLi5vcHRpb25zLGhlYWRlcnMsc2lnbmFsOmNvbnRyb2xsZXIuc2lnbmFsfSk7CiAgY29uc3QgdGV4dD1hd2FpdCByZXNwb25zZS50ZXh0KCk7bGV0IHJlc3VsdDt0cnl7cmVzdWx0PXRleHQ/SlNPTi5wYXJzZSh0ZXh0KTpudWxsfWNhdGNoKGUpe3Rocm93IEVycm9yKCdFbCBzZXJ2aWRvciBkZXZvbHZpw7MgdW5hIHJlc3B1ZXN0YSBubyB2w6FsaWRhLicpfQogIGlmKCFyZXNwb25zZS5vayl7Y29uc3QgZXJyb3I9RXJyb3IocmVzcG9uc2Uuc3RhdHVzPT09NDAxPydBVVRIX1JFUVVJUkVEOiBMYSBzZXNpw7NuIHRlcm1pbsOzIG8gbGFzIGNyZWRlbmNpYWxlcyBubyBzb24gdsOhbGlkYXMuJzpyZXN1bHQ/Lm1zZ3x8cmVzdWx0Py5tZXNzYWdlfHxyZXN1bHQ/LmVycm9yX2Rlc2NyaXB0aW9ufHwnRXJyb3IgZGUgY29uZXhpw7NuICgnK3Jlc3BvbnNlLnN0YXR1cysnKS4nKTtlcnJvci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzO3Rocm93IGVycm9yO30KICByZXR1cm4gcmVzdWx0OwogfWNhdGNoKGVycm9yKXtpZihlcnJvci5uYW1lPT09J0Fib3J0RXJyb3InKXRocm93IEVycm9yKCdMYSBjb25leGnDs24gdGFyZMOzIGRlbWFzaWFkby4gSW50ZW50YSBudWV2YW1lbnRlLicpO3Rocm93IGVycm9yfWZpbmFsbHl7Y2xlYXJUaW1lb3V0KHRpbWVyKX0KfQphc3luYyBmdW5jdGlvbiBzdXBhYmFzZVByb2ZpbGVMQSh0b2tlbil7CiBjb25zdCBsaXN0PWF3YWl0IHN1cGFiYXNlUmVxdWVzdExBKCcvcmVzdC92MS9sYV9wcm9maWxlcz9zZWxlY3Q9dXNlcl9pZCx1c2VybmFtZSxyb2xlJyx7fSx0b2tlbik7CiBpZighQXJyYXkuaXNBcnJheShsaXN0KXx8bGlzdC5sZW5ndGghPT0xKXRocm93IEVycm9yKCdFc3RhIGN1ZW50YSBhw7puIG5vIHRpZW5lIHVuIHBlcm1pc28gYXNpZ25hZG8gZW4gZWwgZGFzaGJvYXJkLicpO3JldHVybiBsaXN0WzBdOwp9CmFzeW5jIGZ1bmN0aW9uIHN1cGFiYXNlUnBjTEEobmFtZSwuLi5hcmdzKXsKIGlmKG5hbWU9PT0nbG9naW4nKXsKICBjb25zdCB1c2VybmFtZT1TdHJpbmcoYXJnc1swXXx8JycpLnRyaW0oKS50b1VwcGVyQ2FzZSgpLGVtYWlsPXdpbmRvdy5MQV9DT05GSUc/LmFjY291bnRzPy5bdXNlcm5hbWVdOwogIGlmKCFlbWFpbCl0aHJvdyBFcnJvcignVXN1YXJpbyBvIGNvbnRyYXNlw7FhIG5vIHbDoWxpZG9zLicpOwogIGNvbnN0IHJlc3VsdD1hd2FpdCBzdXBhYmFzZVJlcXVlc3RMQSgnL2F1dGgvdjEvdG9rZW4/Z3JhbnRfdHlwZT1wYXNzd29yZCcse21ldGhvZDonUE9TVCcsYm9keTpKU09OLnN0cmluZ2lmeSh7ZW1haWwscGFzc3dvcmQ6YXJnc1sxXX0pfSk7CiAgY29uc3QgcHJvZmlsZT1hd2FpdCBzdXBhYmFzZVByb2ZpbGVMQShyZXN1bHQuYWNjZXNzX3Rva2VuKTsKICByZXR1cm4gey4uLnByb2ZpbGUsdG9rZW46cmVzdWx0LmFjY2Vzc190b2tlbixleHBpcmVzOkRhdGUubm93KCkrcmVzdWx0LmV4cGlyZXNfaW4qMTAwMH07CiB9CiBjb25zdCB0b2tlbj1hcmdzLmF0KC0xKTsKIGlmKG5hbWU9PT0nc2Vzc2lvbkluZm8nKXJldHVybiB7Li4uYXdhaXQgc3VwYWJhc2VQcm9maWxlTEEodG9rZW4pLGV4cGlyZXM6SlNPTi5wYXJzZShhdG9iKHRva2VuLnNwbGl0KCcuJylbMV0ucmVwbGFjZSgvLS9nLCcrJykucmVwbGFjZSgvXy9nLCcvJykpKS5leHAqMTAwMH07CiBpZihuYW1lPT09J2xvZ291dCcpe2F3YWl0IHN1cGFiYXNlUmVxdWVzdExBKCcvYXV0aC92MS9sb2dvdXQnLHttZXRob2Q6J1BPU1QnfSx0b2tlbik7cmV0dXJuIHRydWV9CiBpZihuYW1lPT09J2dldE1hdHJpeCcpewogIGNvbnN0IGxpc3Q9YXdhaXQgc3VwYWJhc2VSZXF1ZXN0TEEoJy9yZXN0L3YxL2xhX21hdHJpeD9pZD1lcS4xJnNlbGVjdD1wYXlsb2FkLHJldmlzaW9uLHVwZGF0ZWRfYXQnLHt9LHRva2VuKTsKICBpZighbGlzdC5sZW5ndGgpdGhyb3cgRXJyb3IoJ0HDum4gbm8gaGF5IG1hdHJpei4gQWRtaW5pc3RyYWNpw7NuIGRlYmUgaW1wb3J0YXIgZWwgaGlzdMOzcmljbyBpbmljaWFsIGNvbiBlbCBib3TDs24gZGVsIGluZ3Jlc28uJyk7CiAgcmV0dXJuIHsuLi5saXN0WzBdLnBheWxvYWQsc3RvcmFnZVJldmlzaW9uOmxpc3RbMF0ucmV2aXNpb24sc3RvcmFnZVVwZGF0ZWRBdDpsaXN0WzBdLnVwZGF0ZWRfYXR9OwogfQogaWYobmFtZT09PSdnZXRWaWV3cycpewogIGNvbnN0IGxpc3Q9YXdhaXQgc3VwYWJhc2VSZXF1ZXN0TEEoJy9yZXN0L3YxL2xhX3ZpZXdzP3NlbGVjdD1wYXlsb2FkJyx7fSx0b2tlbik7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGxpc3RbMF0/LnBheWxvYWR8fFtdKTsKIH0KIGlmKG5hbWU9PT0nc2F2ZVZpZXdzJyl7CiAgY29uc3QgcGF5bG9hZD1KU09OLnBhcnNlKGFyZ3NbMF0pO2lmKCFBcnJheS5pc0FycmF5KHBheWxvYWQpfHxKU09OLnN0cmluZ2lmeShwYXlsb2FkKS5sZW5ndGg+ODUwMCl0aHJvdyBFcnJvcignVmlzdGFzIG5vIHbDoWxpZGFzIG8gZGVtYXNpYWRvIGdyYW5kZXMuJyk7CiAgY29uc3QgcHJvZmlsZT1hd2FpdCBzdXBhYmFzZVByb2ZpbGVMQSh0b2tlbik7CiAgYXdhaXQgc3VwYWJhc2VSZXF1ZXN0TEEoJy9yZXN0L3YxL2xhX3ZpZXdzP29uX2NvbmZsaWN0PXVzZXJfaWQnLHttZXRob2Q6J1BPU1QnLGhlYWRlcnM6e1ByZWZlcjoncmVzb2x1dGlvbj1tZXJnZS1kdXBsaWNhdGVzJ30sYm9keTpKU09OLnN0cmluZ2lmeSh7dXNlcl9pZDpwcm9maWxlLnVzZXJfaWQscGF5bG9hZH0pfSx0b2tlbik7cmV0dXJuIHRydWU7CiB9CiBpZihuYW1lPT09J2ltcG9ydE1hdHJpeCcpewogIGNvbnN0IGluY29taW5nPWNsZWFuTWF0cml4VjcoSlNPTi5wYXJzZShhcmdzWzBdKSk7CiAgcmV0dXJuIHVwbG9hZENodW5rc0xBKGluY29taW5nLGFyZ3NbMV0sYXJnc1syXSx0b2tlbik7CiB9CiB0aHJvdyBFcnJvcignT3BlcmFjacOzbiBubyBkaXNwb25pYmxlOiAnK25hbWUpOwp9Cgpjb25zdCBkaXJlY3RScGNWMTU9c3VwYWJhc2VScGNMQTsKZnVuY3Rpb24gbG9naW5TY3JlZW5WMTUobWVzc2FnZT0nJyl7CiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2xvY2tlZFYxNScpOyQoJyNsb2dpblYxNScpLmhpZGRlbj1mYWxzZTskKCcjbG9naW5NZXNzYWdlVjE1JykudGV4dENvbnRlbnQ9bWVzc2FnZTskKCcjcGFzc3dvcmRWMTUnKS52YWx1ZT0nJzsKfQpmdW5jdGlvbiBlbmRMb2NhbFNlc3Npb25WMTUobWVzc2FnZT0nJyl7CiBhcHBTZXNzaW9uVjE1PW51bGw7ZGF0YT1udWxsO3NhdmVkVmlld3M9W107Y2hhcnRQb2ludHNWNC5jbGVhcigpOyQoJyNjb250ZW50JykuaW5uZXJIVE1MPScnO3RyeXtzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdMQV9BVVRIX1NFU1NJT04nKX1jYXRjaChlKXt9bG9naW5TY3JlZW5WMTUobWVzc2FnZSk7Cn0KcnBjPWZ1bmN0aW9uKG5hbWUsLi4uYXJncyl7CiBpZighYXBwU2Vzc2lvblYxNSlyZXR1cm4gUHJvbWlzZS5yZWplY3QoRXJyb3IoJ0FVVEhfUkVRVUlSRUQ6IEluaWNpYSBzZXNpw7NuLicpKTsKIHJldHVybiBuZXcgUHJvbWlzZSgob2ssbm8pPT57Y29uc3QgdGltZW91dD1zZXRUaW1lb3V0KCgpPT5ubyhFcnJvcignRWwgc2VydmljaW8gbm8gcmVzcG9uZGnDsy4gSW50ZW50YSBudWV2YW1lbnRlLicpKSxuYW1lPT09J2ltcG9ydE1hdHJpeCc/OTAwMDAwOm5hbWU9PT0nZ2V0Vmlld3MnPzE1MDAwOjkwMDAwKTsKIGRpcmVjdFJwY1YxNShuYW1lLC4uLmFyZ3MsYXBwU2Vzc2lvblYxNS50b2tlbikudGhlbih2YWx1ZT0+e2NsZWFyVGltZW91dCh0aW1lb3V0KTtvayh2YWx1ZSl9LGVycm9yPT57Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO2lmKFN0cmluZyhlcnJvci5tZXNzYWdlfHxlcnJvcikuaW5jbHVkZXMoJ0FVVEhfUkVRVUlSRUQ6JykpZW5kTG9jYWxTZXNzaW9uVjE1KCdMYSBzZXNpw7NuIHRlcm1pbsOzLiBWdWVsdmUgYSBpbmdyZXNhci4nKTtubyhlcnJvcil9KX0pOwp9OwpmdW5jdGlvbiByb2xlSW50ZXJmYWNlVjE1KCl7CiBpZighYXBwU2Vzc2lvblYxNSlyZXR1cm47CiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ3ZpZXdlclYxNScsYXBwU2Vzc2lvblYxNS5yb2xlIT09J2FkbWluJyk7CiAkKCcjc2Vzc2lvbk5hbWVWMTUnKS50ZXh0Q29udGVudD1hcHBTZXNzaW9uVjE1LnVzZXJuYW1lKycgwrcgJysoYXBwU2Vzc2lvblYxNS5yb2xlPT09J2FkbWluJz8nQWRtaW5pc3RyYWNpw7NuJzonQ29uc3VsdGEnKTsKIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbG9ja2VkVjE1Jyk7JCgnI2xvZ2luVjE1JykuaGlkZGVuPXRydWU7Cn0KYXN5bmMgZnVuY3Rpb24gb3BlblNlc3Npb25WMTUoc2Vzc2lvbil7CiBhcHBTZXNzaW9uVjE1PXNlc3Npb247dHJ5e3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ0xBX0FVVEhfU0VTU0lPTicsSlNPTi5zdHJpbmdpZnkoc2Vzc2lvbikpfWNhdGNoKGUpe31yb2xlSW50ZXJmYWNlVjE1KCk7c3RhcnRlZFNlc3Npb25WMTU9dHJ1ZTthd2FpdCBzdGFydERhc2hib2FyZFY5KCk7Cn0KJCgnI2xvZ2luRm9ybVYxNScpLm9uc3VibWl0PWFzeW5jIGV2ZW50PT57CiBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyQoJyNsb2dpbkJ1dHRvblYxNScpLmRpc2FibGVkPXRydWU7JCgnI2xvZ2luTWVzc2FnZVYxNScpLnRleHRDb250ZW50PSdWYWxpZGFuZG8gYWNjZXNv4oCmJzsKIGNvbnN0IHBhc3N3b3JkPSQoJyNwYXNzd29yZFYxNScpLnZhbHVlOyQoJyNwYXNzd29yZFYxNScpLnZhbHVlPScnOwogdHJ5e2NvbnN0IHNlc3Npb249YXdhaXQgZGlyZWN0UnBjVjE1KCdsb2dpbicsJCgnI3VzZXJuYW1lVjE1JykudmFsdWUscGFzc3dvcmQpO2F3YWl0IG9wZW5TZXNzaW9uVjE1KHNlc3Npb24pfWNhdGNoKGVycm9yKXtsb2dpblNjcmVlblYxNShlcnJvci5tZXNzYWdlfHxTdHJpbmcoZXJyb3IpKX1maW5hbGx5eyQoJyNsb2dpbkJ1dHRvblYxNScpLmRpc2FibGVkPWZhbHNlfQp9OwokKCcjbG9nb3V0VjE1Jykub25jbGljaz1hc3luYygpPT57Y29uc3QgdG9rZW49YXBwU2Vzc2lvblYxNT8udG9rZW47ZW5kTG9jYWxTZXNzaW9uVjE1KCdTZXNpw7NuIGNlcnJhZGEuJyk7aWYodG9rZW4pdHJ5e2F3YWl0IGRpcmVjdFJwY1YxNSgnbG9nb3V0Jyx0b2tlbil9Y2F0Y2goZSl7fX07CmNvbnN0IGZpbGVIYW5kbGVyQmVmb3JlVjE1PSQoJyNmaWxlJykub25jaGFuZ2U7CiQoJyNmaWxlJykub25jaGFuZ2U9ZXZlbnQ9PntpZihhcHBTZXNzaW9uVjE1Py5yb2xlIT09J2FkbWluJyl7ZXZlbnQudGFyZ2V0LnZhbHVlPScnO2FsZXJ0KCdTb2xvIGFkbWluaXN0cmFjacOzbiBwdWVkZSBjYXJnYXIgbWF0cmljZXMuJyk7cmV0dXJufXJldHVybiBmaWxlSGFuZGxlckJlZm9yZVYxNShldmVudCl9Owpjb25zdCBwcmV2aWV3QmVmb3JlVjE1PXNob3dJbXBvcnRQcmV2aWV3OwpzaG93SW1wb3J0UHJldmlldz1mdW5jdGlvbihpbmNvbWluZyl7aWYoYXBwU2Vzc2lvblYxNT8ucm9sZSE9PSdhZG1pbicpdGhyb3cgRXJyb3IoJ1NvbG8gYWRtaW5pc3RyYWNpw7NuIHB1ZWRlIGNhcmdhciBtYXRyaWNlcy4nKTtyZXR1cm4gcHJldmlld0JlZm9yZVYxNShpbmNvbWluZyl9OwovLyBQcmV2ZW50IGF1dG9tYXRpYyByZXN0YXJ0IGFmdGVyIHNpZ24tb3V0IHdoaWxlIGFuIGVhcmxpZXIgbG9hZCBpcyBzdGlsbCBjb21wbGV0aW5nLgpjb25zdCBpbml0QmVmb3JlVjE1PWluaXQ7aW5pdD1mdW5jdGlvbigpe2lmKCFhcHBTZXNzaW9uVjE1KXtkYXRhPW51bGw7cmV0dXJufWluaXRCZWZvcmVWMTUoKTtyb2xlSW50ZXJmYWNlVjE1KCl9OwooYXN5bmMoKT0+e2xvZ2luU2NyZWVuVjE1KCk7dHJ5e2NvbnN0IHN0b3JlZD1KU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ0xBX0FVVEhfU0VTU0lPTicpfHwnbnVsbCcpO2lmKHN0b3JlZD8udG9rZW4pe2NvbnN0IGluZm89YXdhaXQgZGlyZWN0UnBjVjE1KCdzZXNzaW9uSW5mbycsc3RvcmVkLnRva2VuKTtpZihpbmZvLmV4cGlyZXM+RGF0ZS5ub3coKSlhd2FpdCBvcGVuU2Vzc2lvblYxNSh7Li4uaW5mbyx0b2tlbjpzdG9yZWQudG9rZW59KX19Y2F0Y2goZXJyb3Ipe2VuZExvY2FsU2Vzc2lvblYxNSgpfX0pKCk7CgoKCmNvbnN0IEVOSk9ZX0xPR09fVjE2PSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQXhvQUFBRkdDQVlBQUFEdGsrbjNBQUFBQ1hCSVdYTUFBQzRqQUFBdUl3RjRwVDkyQUFBQk5tbERRMUJRYUc5MGIzTm9iM0FnU1VORElIQnliMlpwYkdVQUFIamFyWTZ4U3NOUUZFRFBpNkxpVUNzRWNYQjRreWdvdHVwZ3hxUXRSUkNzMVNISjFxU2hTbWtTWGw3VmZvU2pXd2NYZDcvQXlWRndVUHdDLzBCeDZ1QVFJWU9EQ0o3cDNNUGxjc0dvMkhXbllaUmhFR3ZWYmpyUzlYdzUrOFFNVXdEUUNiUFViclVPQU9Ja2p2akI1eXNDNEhuVHJqc04vc1o4bUNvTlRJRHRicFNGSUNwQS8wS25Hc1FZTUlOK3FrSGNBYVk2YWRkQVBBQ2xYdTR2UUNuSS9RMG9LZGZ6UVh3QVpzLzFmRERtQURQSWZRVXdkWFNwQVdwSk9sSm52Vk10cTVabFNidWJCSkU4SG1VNkdtUnlQdzRUbFNhcW82TXVrUDhId0dLKzJHNDZjcTFxV1h2ci9ET3U1OHZjM284UWdGaDZMRnBCT0ZUbjN5cU1uZC9uNHNaNEdRNXZZWHBTdE4wcnVObUFoZXVpclZhaHZBWDM0eS9BeGsvOTZGcFBZZ0FBQUNCalNGSk5BQUI2SlFBQWdJTUFBUG4vQUFDQTZBQUFVZ2dBQVJWWUFBQTZsd0FBRjIvWFdoK1FBQUJVZVVsRVFWUjQydXpkZDVnYnhmM0g4ZmU1ZHhzYmpERE5wc2dVWTRycEpmUk9hQWxnYWlBa2lGNUNDVFdoMXdDbUJCQXRRS2doZEFnZFRPalZwb1FpaWsyeGtZME43dDNuM3g4ejkvUDVMTjFKcDluZDJkM1A2M24yd2VpazFlN3M3R3EvT3pQZkFSR0p2V0l1dTFzeGx4MnNraEFSRVJGZnRGRVJpTVEreUZnTnVCZm9ydElRRVJFUlg3UlRFWWg0RlRRc0FWd0ovRE9UTDd4Y3dmdDdBSS9hSUtPOVNsQkVSRVI4b1JZTkVZOWs4b1ZmZ00rQWw0cTU3TWZGWFBiSVlpN2J0VXlRMFFiVGtqRlFKU2NpSWlJS05FU2tKZGNBbzRCQndJM0FEOFZjOXVwaUxydHlrL2VkQit5cTRoSVJFUkVmMWFrSVJQeFR6R1gzQmg1cTh2SUM0R25nT3FBYjhHQ1R2KytReVJlZVYrbUppSWlJRDlTaUllS2hUTDd3TVBCS2lRY0R1OWhnNDhFU0grdXFraE1SRVJFRkdpTFNraE14clJnaUlpSWlDalJFeEkxTXZqQVN1RTBsSVNJaUlnbzBSTVMxczRHcEZiNjNwNHBMUkVSRUZHaUlTSXN5K2NJNDRLSUszMzV0TVpmZFNLVW1JaUlpQ2pSRXBCSWZWZmkrSHNCekNqWkVSRVJFZ1lhSU5LdVl5MjdENG1sdUZXeUlpSWlJOXpTUGhvamZRY2FUUU9kV2ZId0tabDZOdDFXU0lpSWlva0JEUkJxQ2pHMkJKMW9aWkRRT05yYkw1QXZ2cWtSRlJFUWtiT282SmVKZmtMRTdabEsrempXdXFnZnduMkl1dTVaS1ZVUkVSTUttRmcwUi80S01md1B0N1V2amdYOWk1dE40RytqZTVDTm5BRzhCR2FBZnNEU3diSlAvMWdQYlpQS0ZqMVhDSWlJaUVwWjJLZ0lSNzRLTU5waXhHYmNEVDJieWhibjI3L09iZkdRNGNGa21YMWpRd25vN0FsMVZ3aUlpSWhJbXRXaUkrQk5rWEF6Y0RkeVp5UmQrTFBHZTBjQ0s5bjluQUlNeStjSW9sWjZJaUlqNFNDMGFJdEVIR1IyQmNjQmFMYlJPekd2MDc3TVVaSWlJaUlnQ0RSRXBLNU12ek1hTXYyakpOUHZmMTRCclZYSWlJaUxpTTJXZEVvbVBPY0JzNFBCTXZsQ3Y0aEFSRVJFRkdpTGl3Z3pnbkV5K1VGQlJpSWlJaUFJTkVYRmxPSENWaWtGRVJFUkVSSndwNXJMdFZRb2lJaUlpSWlJaUlpSWlJaUlpSWlJaUlpSWlJaUlpSWhLbFlpN2JRYVVnSWlJaUVoNWxuWkswdU5xVGdFY0R1a1ZFUkVTQmhrZ1NGSFBaSTRFRFBkbWNTNHE1N09vNktpSWlJcUpBUXlUZVFjWVFZSmhIbXpRZWVLdVl5KzZnb3lNaUlpSUtORVRpR1dUMEF2NEZkUFJvczk0QWVnQlBGM1BaWTNXVVJFUkVSSUdHU0x5Q2pEcmdIOEJLbm0zYWU4QmNlKzVkVjh4bGJ5am1zdTBjNzNzbjFRQVJFUkZSb0NFU2pEOEJlL3EyVVpsOFlSWXdvdEZMUjJGYU4zbzVDRERhRm5QWlU0R2NEcitJaUlnbzBKRFVLdWF5U3hSejJmMkt1V3hueCt2ZEZMalU0MTEvczhuL2I0Y1p0N0ZxRGZ1OEtqQWN1Qng0VWJWTFJFUkVGR2hJYW1YeWhWK0FtY0NvWWk1N2RUR1hIZWdneUZnU015NmpuY2U3L2thSjF3YmFZR09yS3ZlM3JwakxIb05wSmRrYytENlRMM3lpMmlVaUlpSUtOQ1R0d2NiandCSEFjY0RueFZ6MnhXSXUrNXZXekRkUnpHWGJBUGNDeTNxKzIyK1VlYjAzOEZ3eGwvMWpoZnU3QXZBOGNEM1ExYjc4SDlVcUVSRVJVYUFoc2pEWStCMVFEMndEL0J2NHRwakxubC9NWlpldllsVm5BOXZIWUg5L0FING84K2Yyd00zRlhQYktZaTdidHBrZzR6RGdFMkRiSm45U29DRWlJaUplcUZNUmlDK0t1ZXhCd0QrYnZGd1BQQUhjQkR5WHlSZnF5M3gyVytDNVpvTG55Wmw4b1pkSCsvb0FzRzhMYjNzSzJEK1RMMHh0OUxrTWNDdXdhNG4zendGNlovS0Y2YXBOSWlJaUVqVzFhSWczTXZuQzNjRFJKZXJvSHNEVHdKZkZYUFkwT3c2ajhVMTdQMHlYcVRqVjV6Y3JlTSt1d0J2RlhMYS8zYytod1AvS0JCa0F3eFZraUlpSWlDL1VvaUhlc1JQWlhkZk1XK1lBRDJKYU9kNENYZ0syYUdHMXZyVm9iQWk4WGVIYng5djMvcnFGOTUyVXlSZUdxUWFKaUlpSUQ5U2lJZDdKNUF2WEEyYzA4NVlPd0lIQXE1aXhEbHZFY0RkSEFMTXFmRy9mQ29JTU1GMnRSRVJFUkJSb2lEUVRiRndLL0tXQ3R5NGQwLzJiaTVrbDNKV3ZNL25DbDZvNUlpSWlva0JEcE9XYjhRdUF5eEs4aTI4NFhKZGFNMFJFUkVTQmhrZ1Z3Y2Jwd05VT1Z0VzltTXZlWGN4bEQybzZtRHhDYnpwY2w5TGFpb2lJaUZjMEdGeThaeWZ2ZXhNWTRtaVZDNEIzZ1djeDJhemV5ZVFMOHlQWXI3N0FPQWVybW9sSmF6dEx0VVZFUkVRVWFJaTBmQ1BlRFRnY09CbFlQc0N2K2hrekI4ZlR3RE9aZkdGOGlQdjRGYkJ5amF0NUlwTXY3SzRhSXlJaUlqNXBweUlRRHdPTUpZSGpNWE5xOUFuaEszc0RRKzJ5b0pqTGpnUXV6K1FMOXdlNGoyMkFnNEFlRGxiM3RHcU5pSWlJS05BUUtYL3ozUi9UZW5FNDBEbWl6WGdPTXlia3VZRDJzUTR6QWVGRndCcU9WcXZ4R1NJaUlxSkFRNlRFemZkZzRNL0Fma0RiQ0RaaEZuQTNjSFVtWC9nMHdQM2NCcmdZMk1qaGFtY0RrMVdMUkVSRVJJR0d5TUliN3kyQjA0R2RJdHFFY2NEMVFENlRML3dVNEg1dWFBT01iUU5ZZlVmZ1ZPQXMxU2dSRVJIeGlRYURTMVJCUmpkZ0IyRHRSa3Yva0w3K1EyQVljRzhtWDVnVDRENnVnZWtpdFdmQSt6TWRXQ1dUTHhSVnMwUkVSRVNCaHNqaU4rWTlHZ1VkZysxLzE4TE5lSTBGbUVudHJzN2tDeThGdkI4ckF1Y0JCeFBlWERYWFpmS0Y0MVdMUkVSRVJJR0dTR1UzN1cyQlZWaTA1V01Ja0tsd0ZYT0FXNEZyTXZsQ0llQnR6UUJuQWtjQzdVTXVxcm5BcXBsODRWdlZHaEVSRVZHZ0lkSzZHL3BWZ0M4cmZQczFtWHpoeElDM3B4ZG1uTVFKUU5jSWkrYk9UTDV3cUdxSWlJaUlLTkFRYWYzTi9jZkFvQXJldWtZbVgvZ3NvRzNvYklPTFB3TzlXbmo3WkdBaVpuTEFobVU1WUhPSG0xUVByQlZrNWl3UkVSR1JTaW5ybE1UVm94VUVHcThFR0dRTUFZN0ZaSDI2eHdZT0UreC9mMmtTVVB5Y3lSZm1sMWpITFk0RGpUYkFoY0RlcWg0aUlpSVNOYlZvU0N6WkcvMzNXbmpiZnBsODRWOGU3OE1vZ3NtMHRVRW1YM2hQdFVSRVJFU2kxRVpGSURIMUFmQjlNMzhmaDJuMThEWElXS1hDSUdNdVprQjdOUzVXOVJBUkVSRUZHaUt0a01rWEZyUVFTTnhXNlJ3WnhWeDI2UWgyWWZzSzNqTUIyQTR6bHVNTW9OS01VdHNYYzltdFZFdEVSRVJFZ1laSTY1UUxOQllBTjFleG52Mkx1ZXkrbmdVYW4yQzZRUDAza3kvOGxNa1hMZ1ZXQXZZQW5ySDcySnhMVlQxRVJFUkVnWVpJNjd5Q0dYamQxRk5WemlmUkViaXBtTXN1RzhaRzI3bEJ0bTdtTFU4QW0yYnloZEdOWDh6a0MvV1pmT0h4VEw2d003QXFjR1daL1FmWXFKakw3cUVxSWlJaUlnbzBSS3BrTXprOVVlSlBOMVc1cXM3QUVzQ2R4VncyakFRSjYxTStIZTVsd0o2WmZHRnFDL3YrZFNaZk9BVllGamlNMGdQakx5em1zanJIUlVSRVJJR0dTQ3M4MHVUL3Z3V2VybklkUGV4L3Q4WE1peEcwVXQybVpnTUhaL0tGMHpQNVFuMFZ3ZGJNVEw1d1J5WmYyQURZRUxqVHJndE0rdDhEVkVWRVJFUkVnWVpJOVo0RlpqWDYvNXVydVZHM09qYjY5NlhGWEhiTmtBT05jY0JXbVh6aDdscFdtc2tYM3JVemcvZkR6RlQrRFhCdU1aZnRvR29pSWlJaUNqUkVxcnU1bm1tRERUQ3BZRzl0eFdxNk5nazY3aTNtc2gyRDJONWlMdHNWMktUUlN5TXdnNzdmY2xnbVAyZnloYjloeG5FY0I2eW1taUlpSWlKaDA4emdrZ1NQWUxJeFBaekpGOGEzNHZQZG12ei9ZTXdNMjZjR3NLMWJBZTN0dng4Q0RzbmtDek1DQ3NMcXFiNGJtWWlJaUlnVGF0R1FKSGdDcUtmNlFlQU5TclZlbkJ6UVhCVGIyZitlQit3VFZKQWhJaUlpb2tCRHBFYVpmT0ZuNE1aTXZqQzhsYXZvWHVLMU91Q3VZaTdieS9IbWJnb016ZVFMNTlwSkIwVkVSRVFVYUloNHJKWnVUbDNLdkw0ODhIZFhHMWpNWlRzQlIyWHloUWQwdUVSRVJDVHA2bFFFa25iRlhIWWtzSFl6YjlrL2t5L2NyNUlTRVJFUnFaeGFORVRLVDU3WDRLWmlMcnU4aWtsRVJFUkVnWVpJTlZwS1pkc1RNMnU0emhjUkVSRVJCUm9pRmV0Y3dYdTJCazVTVVltSWlJZ28wQkNwVkk4SzMzZHhNWmNkck9JU0VSRVJVYUFoMHF4aUx0dWV5cE1pZEFEdXR0bWpSRVJFUkVTQmhraFpYYXQ4LzFyQXhRRUhQMnNVYzluemlybHNSb2RIUkVSRUZHaUl4Rk8zVm56bXBHSXV1NjNqNEdLbFlpNTdlakdYL1JqNEg3QjBKbDhvNnZDSWlJaElYTFZURVVqS2RXemw1KzRzNXJKclpmS0ZYMm9JTHZvQnZ3VU9BRFpxOUtlZmdETjBhRVJFUkVTQmhraDhkVy9sNTVZRmJnU0dWaGxjOUFiMkJ2WUh0cUowcStMcHRRUXdWV3pMSnNBdm1YemhjMVVERVJFUlVhQWg0bGFYR2o2N1h6R1hmU0tUTDl6VHdnMTlOK0RYbUphTEhZSDJ6Yno5TGVBZklRUVp2WUI3Z2IxVUJVUkVSRVNCaG9oN0hXcjgvQTNGWFBhMVRMN3diWk1iK1k3QXpwZ1dqOTJwYks2TytjQ1JtWHhoUVFqN2ZTdlFYNGRmUkVSRUZHaUlCS05YalovdkFkeFZ6R1czeHFUSjNSYllEelAyb2tlVjY3b2hreTk4R1BRT0YzUFpJNEhmMlAvdHFDb2dJaUlpQ2pSRTNITnhvLzByNEJsZ0hXQ3BWcTVqUEhCT0NFSEdXc0RWalY3cXJDb2dJaUlpQ2pSRTNITjFvNzE5alovL1V5WmZtRnhCb0xBdXNDN3dZQ1pmbUZwbGtORVZ1Qi9RaElNaUlpSVNPTTJqSVduWHc0TnQrQzltWUhhTE12bkNDRXdyekpoaUxudWJ6UnhWcVd1QU5acThWcWNxSUNJaUlnbzBSTnlMZW96Q2ZPQ1lhZ2FBWi9LRkc0RS9BNzhIM2lqbXN2OHI1ckovS3VheVM1YjdUREdYSFFvY1h1SlBQVlVGUkVSRVJJR0dpSHRkSS83K3F6UDV3aWZWZnNnR0cwZmIvMTBEdUJJWVc4eGxIeXptc2pzV2M5azJqWUtNbFlHOERyV0lpSWdvMEJBSlQ3Y0l2M3NzY0g1clA5d2syQUF6UDhkdk1RUFRSeFZ6MlhPTHVleXFtSEVaUFhTb1JVUkVSSUdHU0Fqc2svNVZJOXlFazZzZDBGMUJzTkZnQmVDdlFBRll2NWxWZEZWTkVCRVJrU0FvNjVTa0pham9CS3dIYkE1c0Ftd0s5STF3azE3STVBdjN1MWhSSmwrNHNaakxBdHpRaW8rM1YrMFFFUkdSSUNqampDUTFzT2huZzRsTmJXQXh4S09iNnJuQTRFeSs4TG5qZlQ2cUZjSEdST0I1NEFVYi9IeXIyaU1pSWlJdXFFVkRraEJVdEFNR053b3NOZ1ZXOUhpVHIzSWRaRmlqZ0IrQTVhcjRUQjlncUYwbzVySmZOd284WHM3a0N6K3Job21JaUVocnFFVkQ0aGhZOUFZMnhuU0QyaGpZQ09nU2s4My9EbGc5a3kvTWNGUVdkY0J1d0ZtMkhGeWFEMXdNbkp2SkYrcFY4MFJFUktRYWF0RVEzNE9LT21BMVlETVdqcTFZTGNhN2RKS0xJTU9tcjkwTE9CdFlKNEFBNDM3ZzhreSs4SkZxb1lpSWlMU0dXalRFdDhDaUc3Q2hEU29hZ290ZUNkbTlaelA1d2s0MWxrODdZQi9nSEdCMXg5czNIYmdOdURLVEwzeW4yaWdpSWlLMVVJdUdSQjFZWklCdEdnVVZnNEcyQ2R6VjJjQXhOWlpWVytBMFlIZWduOE50bXdoY0E5eVF5UmNtcWxhS2lJaUlDMnJSaU5leDZvT1pZSzZiRFJMYnMvZzhDUFhBRlB2dldjQXZ3TStZVEVjK0JocHRNSE5ackl0SlA5dnczOTRKTzM0WFpQS0Z2emd1dTJVeHM0S3ZhWmVHZi9lc2NCV2pNRE9LMzU3SkYyYnFGQk1SRVJFRkdzblRDK2dQRExCTGY4eUVhMzF0Y05ISDNualhjcnltMjZCakFtWkc2dS90OGdObWdISUJHT05SQUxLQ0RUZ2FCeC85WW5wOFJ3RnJoblV6M3lpMTc0UE52TzE5WU9OTXZqQlBwNStJaUlnbzBJaS9Mc0FnWUMxTUY2R0d4WmVuOTFPQno0SFA3UEsrWGJ4SWNWck1aZnMyQ1R6V0JWYU93WEgvYlNaZmVDaUM4bnJmbGxNcFIyYnloYnhPU1JFUkVRbUt4bWdFYXdEbXlmTG1tREVJZ3p3UDdyb0RHOWlsc1ZIQXU4QTd3Q3ZBQ0V4bW9sQmw4b1h4d0ROMmFiaVo3b25KdWpTazBYOEg0dGM0andVUmZlK0RaUUtOR2NCOU9qMUZSRVFrU0dyUmNId3ZET3dFN0Foc0NTeVQwUDJjQXJ3S0RBZGVzb0hIQWw4MnJwakxkZ2JXYmhLQURBWTZSTFJKVjJieWhWTWlLSWVWZ2E5Sy9Pbk9UTDV3cUU1WEVSRVJVYURocjdhWWxvcWQ3YkoyU3N2aFIrQXA0RW5Nak5MVGZkdkFZaTdiSGpnQXVDT0NyMzh6a3k5c0d0RitsK28rOWF0TXZ2Q3FUbDhSRVJGUm9PR1hOamE0MkEvWUYxaEtSYktJMmNEendEMDI4SmptVWJEeElpYVZidGptQUQweStjTHNDUGI1ZE9DU1JpOFZNdm5DUUZWVEVSRVJDZU9tV1NxekFYQWRKa3ZUZnpGeklpaklXRnhIWURmTUdJQnhtQm1tZC9BZ3lOZ3RvaUFEVEpldDlTTDY3cWFacDI1VkZSVVJFUkVGR3RIclpRT0trWmlCME1lUzNIRVhRZWlDYWZuNVE4UkJSanZnMG9qTFlyTW92alNUTDN3TmZHRC9keDV3bDZxbGlJaUloRUZacDByYkJEZ1MyQWZvck9LbzJic1JmLy92TVJQWlJWMm5vdEtRZmVxSlRMNHdUdFZSUkVSRXdxQVdqVVhMNGpmQTY4QWJ3Q0VLTXB4NVA2b3ZMdWF5M1lEelBDaURUU1A4N29idVU3ZXBLb3FJaUlnQ2pmQjB3WFNQK2dMNGQ4UTNoRW0wQUhndnd1OC9GWk4yT0dxWllpNjdVaVJmYkxwUFBVNmorVWRFUkVSRWdwYm1ybE9kZ1J4d0J0QlhWU0V3QmN5OEc2RXI1ckw5Z0ZNOEtvdU5nVzhpK3U3RE0vbkNmRlZIRVJFUkNVc2FXelE2QUVmYkc3NnJGV1FFN3YwSXYvdDhUSXVWTHphUDZvc3orY0lFVlVVUkVSRlJvQkhjdmg2R21TbjU3L2pSblNZTkloa0lYc3hsMTdMSHV4YmZBMGNCMXp2YXJJMVZIVVJFUkVTQlJySnNqa2xQZXp1d3ZBNTc4Z01ONFBJYTZuY1JPQW5JWnZLRm16TDV3bkdZV2NWcm5mRjhiVHM0WFVSRVJDVHhrajR6K0FyQVpjQlFIZXBJMUFNOUhOeWdWeGNsNUxMYllXWW5yOVpFNEcvQWRabDhZWHFKOWE2T1NSaXdSZzJidDIwbVgzaEpWVU5FUkVTU0xxa3RHdTJCTXpHWnBCUmtST2ZUQ0lLTU5zQ1ZWWDVzTWlZRjdzcVpmT0hTVWtFR1FDWmYrQXpZQ0RQcmVXc3BxNW1JaUlpa1FoS3pUcTJQbVM5Z3NBNXY1S0xvTm5WSUZjZCtPbWI4eFJXWmZHRmlKUi9JNUF2VGdBT0t1ZXpybUdRQzdSVm9pSWlJaUN3dVNWMm51Z0FYQWllZytVRjhjU3htNEgwb2lybHNaK0JMWU5rVzNqb0x5QU9YWmZLRkgydjR2ZzB4WGFtcUdmY3pDZWlkeVJjV3FIcUlpSWhJa2lYbGhueFQ0QlBNQUY0RkdmNEl1MFhqNUJhQ2pMazJ3QmlZeVJkT3JDWElBTWprQys4QTZ3TFBWdkd4WHNCcXFob2lJaUtpUU1OdjdUQjk2MThGQnVod2VtVWU4R0ZZWDFiTVpmc0NwNVg1ODN6Z1RtQ05UTDV3WkNaZitNN1Y5OW91VjdzQTUySUd2MWRpTTFVUEVSRVJTYm80ajlGWUNiZ2IyRVNIMFVzZkE3TkQvTDV6Z2U1Tlhsc0EvQXM0UDVNdmZCclVGMmZ5aFhyZ3ZHSXUreVp3TDlDbmhZOXNBdHlxS2lJaUlpSkpGdGNXamFIQVNBVVpYbnNuckM4cTVySURnU09hdlB3WU1DU1RMd3dOTXNob0VuQThoK2xLOVhZTGI5V0FjQkVSRVZHZzRabDJtRXcvOTdINDAydnh5L3NoZnRmbFFGdjc3MmVCVFRMNXdwNlpmR0ZFMkR1ZHlSZStCMzRGWE5mTTIxWXI1cks5VlVWRVJFUWt5ZUtVZFNvRFBHQnY0dEx1S3h0c05SMFRNQnVZNmNIMnpRTWVBbjRNK291S3VleVd3SERnRmVEY1RMNHczSmVEVk14bDk4T2tXdTVhNHMrN1p2S0YvNmdxaTRpSWlBS05hRzJDU1NQYVQ0ZnMvNzBMSEErOGxkWUNLT2F5ZFppV2d5Y3orY0l6bm01anVkbkVMODdrQzJlcEdvdUlpRWhTeGFIcjFMN0F5d295RnJNQjhDWW1tOUl5S1M2SDQzd05NcURaMmNRMXZraEVSRVFTemZjV2pUOERsK293dFdncVpyTENZY0FjRlllZmlybnNNU3ljVFh3NjBDdVRMOHhUeVlpSWlFZ1MrZHFpMFJZenNacUNqTXAwQnk3RFRGcTRpNHJEVDVsODRlL0E1c0QzbUhFYmcxVXFJaUlpb2tBalBGMkFwMWc4WGFtMGJGVmJkdit4L3hiL2dvM0dzNG1yKzVTSWlJZ2tsbTlkcDNvQ2p3QmI2OURVYkM2bW04NkZtSzVWNHBGaUx0c0dXQytUTDd5bjBxaFpCMkExWUFDd0FyQWMwQnRZd2w1VDJqZDUvenhnTWpBSitCbVRIVzBNOEExUXNIOFRQNjFnai9OSzlqajN4VXlRMmNVZTY3b214M2tTOEFzd0h0T1NPQXI0RFBoT1JTa09MWVZKK0RHd1VkM3NCeXdKOUFKNkFCMkJUbzArTThQK1RqZlUwWi9zZGVnSDRHdmdVK0J6WUlxS1Z4Um91TkVMODVSM1F4MFd0L2Uwd09uQVhaaVpza1hpZnMxYUc5TUZiVk5nZldCbDNMYk8vZ2lNd0dSMmV3MTR3OTRVU0xpNjJlTzhqVDNPNjlqZzBZWEptRWxGM3dDZXgweXlxZkZTaXh0a2I1WnI5UjR3TFNGbDBoWllEOWdXaytoalE0Sk5WbE5vZEMxNkFaUGUza2VETVE5NFhQcmMzc01rV1Fiem9NeTFqekFQMGx4cFo2L0pjNnI5UGZRbDBGZ0tlTWxlMUNRWWJ3UEgyUXVXU0p4MEJIWUFmZ3ZzaEhtS0hhYlo5a2YrVVV5TDY1Z0VsZTNXbUphQVdyMEdUSEN3bnI3QTNzQSttRG1UMm9WVURyL1lZM3V2L1MzU1F4bmpVV0FQQit0WkZ4Z1o4NkIzRjFzM2QzSjB6clRXdDhEandJUEE2eXcrbjFaVTlyVG5rRXR2QUZ0NHRJK3V0YkhYVHRmZHFML0FQSmlaVmNNNmVtT3l2dTRFRE1HMDBqV1lobWx4K3k5bXpqVHZwMWxZQ3ZqWVh0aTFCTHZVWXlhUVcxcS9ueElEUTRDYk1VK2ZmVHFIbmdPR1lycHN4ZDFJUitXeVZZM2JzUlZtUXRZNUhoempMKzFEbWM0NkJYblVVWm11RTlQOTN4S1RRbjY2cDcvcDN3TVhZTG9UK3VDZUFQYnh1QVNmWDBjRlVGN3pnWTFyMktZbE1CbE1aMWJ4bmUvYmdNUkxQVEZkRkJRRWhMdE1CazVtOGI3cklsR3J3enhCZlRNRzU5RVB3R24yYWFjQ2pkYlp5VDROOC9INGpnT09KYnhXRlFVYWZ1Z0FISXJwZWhLbmg0Z1BZYnFUUnFrUHBxdVR5MzJiQnF5WXdIT3JYMEFQMGE2b1ladDJ4b3huYTdyT2VmWUJ6UHVZN0tiVHluejNmWmdzcU43b2l1bk9veHYvNkpiUGdSMTFieXVlMkpWNHRtNytCSndRMDhBOXFrQmpEUloyVWZKOStRd3pWa1NCUnJJRGpYWTJ3QmdWODkvMVp6RVQra1o1SFE5aW41TG1vWUR1NlRxMWNudU93YlNHTkY3ZjQ4QnVtR1FiamJXeGRXeFlpYURqUTB4UHBjaDFpZEdQVEJxV3h6QURha1dpTUJBenlESHU1OUdubUs0V0NqVEthdzljaE1tMkU3ZHVwMWVSak81eUNqUVd0N1Y5VXB1azMvVjdnR1VpS3M4N0F0aWYzeVhvdk5vZHY3cE1IVmJpdDJ5akNqK2JLWEdkK0pDSVd6YmFZZ1lNNlFiZnIyVTJjQW54N2dZaThkSU8rSXV0ZTBrNmw2NnQ0YWxTa2dPTlZUSFpoK0o4Yk44bDJBeERDalRDMVFlNE84Ry82MU14M2YvQ1R2elRDNU0wdytXK1RDUVo0MHU3WTlKcis5SmxhcjBtdjhIUE5Mb1BIR0RQM2NiTFFFeVBwTWJxTUZNcE5ONmV1Nk1zNUd0MFUrLzFNZ1k0QVAvbVdKRmtXUmwvKythN1dENEJWbEdnOGYrMnhXUjJTc0t4SFl0SjVhbEFJOTZCeHU2NEgwL2c2L0l5Wmc2YU1BWFJoZXBmQ1RpbmdyZ0hibTJYcVRiQUI0M1c4eGFMZHBNcWQvN1B4MlNjYXRycWNWMlQ5MFV5UVB3NDNjakhabm5kUnJvaXJ1MkdtYVFxNmVmUUw4RDJDalE0a1BoMWxhb2tvY1pHS1RoWGt4aG90QWYrbHNMZjlKOHhnMzNEZEdzQSs3Rm5qTStuRFZoOEhFU1VYYWFHTmxyUGRCWWZkTjl3L3RjRG8rMURsbm1OUGpNRFdMUEp1ZFg0TitYdEtKNGV6RWMzOEhIcmwzd3o0YzliSU1sMWhxMVhhVG1INWdEN3B6alFPQ3JCMS8zSm1Na2pGV2pFSjlEb1k1L0VwdmwzL1d6QzY3SFFBL2ZkaE1aaXVtYkZUVHVIMTF0WFdhYmVhTFNlYzVzNS95YzFDU1lhZDVPNnVzbG50bXF5ZmFFOXNCNXNJeC9kdk1mM3lld0pwRHZObzlTbUxYQjlTcytmK2ZhcGZ0b0NqZjFUY0d6SGtjelVtMGtNTkxLWVdiWDFtdzUzRVY1aWd4MEMyUDViWTNndW5SWkFPZFNTWldxNVJ1dVpTK2xNVWFVQ0RUQmpaUm8rKzNDSnp6V2V0dUxDTUFwM0NlQnJuZGlKV1A0SGJKZkNtK1R0Z2FlcGZWS3lOQWNaOTZUODNKa1A3SmVpUU9OWCtESDVYaGpMQ0JaUC82aEF3NjlBWXkxTUdtcjlqaTljbmdpeDN0NFN3UFp2RTZQemFLVUFIcmJYT2pIZmdTdzZob2NxQW8xQmpUNTdmWW5QbmRIbzc2OEVYYmh0Z0tkMFFpZHVlUVIvWmlJTlNudmdJRXlhdG9iOUxoSmR1c0M0YXFNZ1k1SE1icjdOeHhCRW9MRWNNQ0ZseC9abUJScmVCaHJyazV4RUJLNlhsMElLTm5wZyt2aTczUGF2WXhUZ1B4dkFzYnVpeG0yNnFORzZMcXNpME9odUg3dzJmSGFIRXAvYnN0SGZ4d2RkdU9mcVJFN3NNaE80SUlGUDhycGpaazB2MTYvMFZUU2plaldHNlZ4WlpKbEErTmxmd2d3MDJnR3ZwZlRZN3FsQXc3dEFZdzIxWkxTNC9JZHd1bEZ0SGNDMlh4bURjK2pBQVBhN2xpNVREVzV2dEw3aldqai81OXAvUDhlaWlWeXVML081RlJ0dmI1Qjk3bmZHNU1pWFpPcUVHVlIyS0hBcThJQ3RWSEcxTEdZY3loRkF6MmJldHpsd09YQ1Nxa0NMVHJabEdvV3hRTUZlRkNkalppOEZreCs4RzJZdWhBR1l5WWJDMUFkNEVOZ0MwN1VvYVU0Rk5ndG8zUXVBN3pFek40L0h6QkV3RlRPd3RhZDk2TEVzSnExd0ZBa3NiZ1NHczNnM0E0bkdjdmJHYU1rSXZuc3lwalg4UytCYkcrejgzT1NjN3dqMHh2UjM3Mi9yN1dEQ24raHNaK0JPVEZyN0lIL0RYd1p1QUk1MnVNNFRnZnN4ODl2NHFEZUxENWF1VmIyOTc1cFY0M3JhTlByM3ZCYmUydzdZdy81N1BuQWZjQy93WkpuM1R3MmpjSmUyUHdSNldwQ2U1Yi9FTXdQTFd2WWlXMjEvOGwzMU85N2lqMWRZMllabUF5OENaMkw2ckZielE5ME5Nd2JucjRRN3I4Y2xuaHlua2JocjBjamFIejlYWlRRTDArWGdKR0FUb0hPVlAvQjdZcDU0L2hEaWNiMDJZZWZ4bzhTelJhTUxpODRQRU1iRWVQOEcvb0NabUxLMTZvRFZNTm5hSHNQMEhBaHJIeTRLNGJoMHN3OEtYTTlaNUdzdmc5dnhyOHRVZ3hzYXJmT3ZMWnovazFuNE1IbUJEWFNhazJYUkZMak8xYUZ4R1drZThCcVgzUExiWVdiQWJPMitqaWNaczVRR1lTWEM2UlA5SWFiSmR3bkgyMzVPQ0E5S2FoM0k1Mk9nOFp5amRiMERISWJwMSsxQ0c4eUVnYytFVUNmbkFhc3IwSWc4MExnL3BOKzg0WmpzYXAwRDJvOXU5cWJ1elpEMjU0QVFqczNXdUU5eC9sY1B6NTJ0OExQTFZJTlRXWFRjYlhQbi95Uk02LzhrKy85VGFINmM3dTZOMXYxUkVJVjdyRzY0VTd1OGl0OHppcmZEOUpjYzRXaC9uMEl6cURmVlBvU1dnVGNJUGdOWVorQjRUSGVISUdjUGp6cGx0S3RBNHhJSDYzZ05rNjBxU0JzRDd3VmNQKzlYb0JGcG9CSEdQY2hqaEQraDdhYkE4d0h2MXpRV25ZQXRLTU53MzZxOXBrZm5UU2ZnQzg4ZlRtM0hvbk1DZFd3aDBBQTRra1V6VlpXNy8yazgrN256UkJscjRyYnBYRXQ4bHJtWWxHYys2a2J6QTd4cldZNVZiTEdJQ3dPc1l6L1pKMjVoQm5kOU1Ubm5nOXFuUHlVazBLaWxpMGVSY0ZQL3RnUE9Jcml1ZmZXWTdpOEtOTUlQTkFiWm04NGdIdzVzR2ZFeDJRa3o5aVBJTlBhZEF0NkhMZ0hzdzFzc091NGdTdWNIY0Z5dWNMeU5uVEZkL2hyV2YwZ0ZnVVliRnAzazc0Z3lRZFk0QXVwbTNnNTRYemZjcVYydXdELzlnRXRaTkV1QzYyVTZ5VS8xVzZsMU1WMUhnaWpucHlrOW9WQllEaVdZL3RLVGNOdjFLNnBBbzVaYy9uMGkydmZkN0JQY0lQYnIxb1NjMDNFS05Ob0hXSi9uWThZdytESVdvSE9UcDhhdWw2dEQySWN0Y04rRjZrUVBqczBhdUo5RHlHV1hxY1lhanlINXNrU3JSdE5Bb3lHWW44dkNMbFJOc3lpZTBHaWQzK0c0MWY0VTNXeW5kdmtlNk9yWkQyUW53cHN3N0FYVWhhb3R3UTIrdk5pVDhoMUNNS2t5TDA5cG9IR2hCOGQxSS91d3dQVyt6UUI2S2RBSU5kQTRtK0JhVW4yZHFIWVBUTGVYSUZybHRnaGgrNGM1M3U1cEVULzRxd05lRHlESURXbzgzeG9zMnJKN1pRV0JCdlkzdWZGRHdBWXJOMmtsT2NMbHhxNk0rMWtQdGNSbjJkdlRpM0NZWlhCNHlnT05Jd042aW5pa1ovczVNSUJnWXpyUnBPQ01NdEE0eXFOanVtTkFEeVdPVWFBUldxQXhnR0JhSEwrMDl6YytXOU0rN0F1aUMxWFFMVGlkN05ONmw5djlYSVFQTUlMNEhReTZ0OGoxVGI2djhXL3VVTXg4ZUtjMytVeG56UFFWNTlxbEg2Ykh3V2VOMXZNMkRydXkxZGtudXJyaFR1ZnlsTWNYNE1raGxzTWswanRyZUMrQ21RbmExK0J0U0FBM05lZWxLTkE0MnNOamVtb0ErL21xQW8zUUFvMUhBamgrSHhOdGQ4MXFMQWQ4RlVBWm5CckN0bStNKy9GU2gwVndESmJCZlRmdG9McE1OZFlWK0xUSjk1NVRaWkN3Sm1iZXFvYlBUOFJ4eTlLaHV0bE85ZXpnSzNsODhSMGJjbm5jazlKQTQ3d0F5dkxQbnUvekFZNzNkd0tsczM0a0xkQzR4TlBqV1llNzlMeU51NS9FL2VGREhBS056UUtvcDRVWUJSbU5ndzNYTFJ1VENHY00xUldPdC9zWHdwK005Vi9FcDh0VVUvMVpmTDZodHpDcGlKdXpGR2JzVXVNa1VKTnhQTTFCRHhZZFhhNGxYY3Zabmw5NHY0cWdUTFlnWFpiRS9ZRGFPMk95NzdjNTN1K0RFeDVvUEkzZlk1bFd3bjNHb2lOamZuN0hJZEI0eGZFeEcrZjVBN1NXbml5N2ZxcCtWUWpiSFVRWHFvZENMUGZkaUYrWHFhWld4TFRpTmQyT1R6RmpOdzdCVElLNkQ2WXIxVk1scnBmZllwTENPSFc1YnJaVHUzd1IwUk5ZbjUvV05rd2kxNDcwK0F2dW00cTd4V1RmZTJGU3M4YTVxMDFZNThnWW9zc3VWWTNMQWdpdUZHZ0VGMmhzNmZoNHpTWDY5TFV1Ym5wZFpuT2FpVW56SGJRTmNaKzFNSXp4bzkxd256by9qQzVUcFhTMmdXVnJqc050QkpCQmNSWEN5K3FqeGI5bHV4aGNjRitKcUd5U01BaTAwb3VTeTRIUjh6SGpIK0xrRU1kMXAzOUNBNDFkWTNJOGUrTTJDOVZVVEVZMkJSckJlTnB4UFQwcklkZG0xMTJSTGcxcHV5OXl2TjFGZ3MvK2RqWHg3VEpWemtyQXRSWDh2ay9GcE1oZHcvY0xrSmI0TGZmRjVHTDdkRVRsTXdIVHJURHBEblZjYnNOaVdBWnRXSHdnWFMzTG1Ra01OUDRkczJONm8rUDlYeS9HNTdqUGdjWnFqby9UMnlTbk5ib1RKbXVVeXpFUFlhU3c3NGlaRk5IbGNiMDl3TzFkSC9jRDJYMmFrNnl0M2NmRGdiL2EzK2lMTUJNVmJ3RjBDUExMdDliTmRtcVhLY1JuZ09PL0l5eW5DMUlRYUx6aE9EanJIdE55T01oaE9ieWZzRUJqSnVHMzB0UnFzT015T0VHQlJpQ0J4clVPajlFc2tqT2JlK09iWUpkZGtZNk02WFl2QUxZUFlEdmI0WDd1cUtpNlRIbnBMZDF3cDNZNVBrYjE5STRJeTJrYXlVNTM2L3BwNHFreExvdU85b21mcTdKWUxrR0J4ckNZSHRQUFNGOExjSndDalk2NEhmUjhjVUt2MHpjNExLTVJJVzczQlk2dlE2TnczeUxqZXBKcUg3cE1lV01uM1d5bmRobEJ2UG9iWHh0eGVkMlE0T3ZBK1E3TGFTSm12RWVjWGUrd1BJNEljYnVERERUbUFNdkg5SGk2VEhJd1VvR0c4MEJqSDRmSDV5ZVMyOVYxYVJhZHFibldaWEJJMjkwK2dHdVR5NGNlL1hFL1NmVVZDR0JTRTc2dkcrNVVMdlU0em8zYzZNblVSYlNjcjdrMUxvbTR6T1lBS3lUMFd2Q0Z3M0s2SkFIbDhTdUg1ZkZBUWdLTmZJeVBwOHU1R1diaGNJWmNCUm9BUE96dytCeWI4UHUyczJONk03d09KZ3VZankwR3o2QXVVNEhaVXpmY3FWMkN1R2xZbjRVRHY4WUJ5enBlL3prZWxOdE5DYndPWkIwSHNNc25vRXphWWNZdnVYckNHdFo4RTBFR0dtdkYrSGgyY1B6RU1xN3pNdmdZYUhUR2pQMXhzVjNqVTNDRDF4TjNyUnBmaDd6dDV6cStKbjFDN1duNTkwZGRwZ0kxUWpmY3FWekdZOUkrdXRMUWl0RjB3TmNidU0xaWNLSUhaVGVUNUkzVmNOazM5YVVFbGNzakRzdGxZTXdEamJjVGNEeGZkVmdlT3l2UWNHWVBoOGZsM0pUY3U3bnNSanc0eE8xdUg4QjlaeTNIZkFuY1QxS2QrQzVUMVRUbmJrK3dzM3VLdjA0RGZuYTBybzB4bVJyT1pQSHhIcHNBZjNPNDNWTThLTHRPd0o4VFZoOWN6cUZ5WDRMSzVSMkg2OW9vNW1WeGN3S081MGNPMTdVYzRzcE9qdFl6QjVQS09BMnVzVGUxTG9RNUo4NWM0R0I3ckZ3NUN4alV5czllZ2R2SkM3L0E5THdRNjFuMFpEK055NnU0NmNiUnlaNmtsZVNjUHNCUm5SM3FTUmxPdzIyTFVKVGEyZjF4MVcycWI0S3VrVHM3ckROL0QybWJSd1pRMytjUy9DUlpZVGplWVptY0dkTXllQlQvV2pTK2RMUk5ENlhzSHU1RlIrWDJZZ1RiZnBiamE5UTdWSi9ZeHZVczlPb3kxY1JhdXVGTzVUSzNoc2kvc1kweGc1MHEvZDdwanI3MzF4NlY1V2tKdVJaczZMQk1Qa2pZZFhKWnh3RitYQU9ORnhKeVBIZHdXQ2JYS2REdzdoemJMMlgzY1VjNktyZFpoRCt1cFIzd251UHIxSitxK1A2T1ZkN0RxTXRVSTVWMm5UcFpzVllxRGNNTW5tcXR6dlprZXAzcStweDN3V1FWcVRYbDRGU1B5dkpZa2pIcjdBWU8xL1Zzd3M2WE1UWTRkL1Z3SjY0ZVRjangvTkhodXZvaUxtemlhRDNUZ2NkVFZuWVBZc1pGMXFvanNHN0kyejRQT0JTM1hhZ3VwUElrRFdmaWR0eGNxcnBNVlJKb1pIRFhsVVhpNHdkcUd6UzFCYWFQOHltMExyWGpxcGdKOTJycHR1VlRvTEU4c0pjQ2pVVzhtY0R6WnF5ajlmUWt2dG00bmt6SXNSenZjRjE5OUpQaXhJYU8xdk1zSmxGSG1rekVYVXZwSmhGcy95ZVlWTDJ1ZEFadXFlQWVZM1hnZElmZlcyK0RwbGtLTkJZNkZEUHlYOUxsQk14VG4ycDF3YlNFdkFLc1V1TTI3RVZ0TTBaUDk2eE1qMDlBdlhDWmNlVHRCSjQzWXgydWErVVk3djhZWUhSQ2p1VlBEdGZWRG5GaGlLUDF2SnpTOG52SnMrTlFyYXNjLzI1c0EveSttYi9YWVJKYmRIQzhEMi9wVkY2MGtMOUNZeFhTdGp6Vnl2cXlCZTRHNmpVZU1OWGF5ZnhXOExCc1Y0LzVnd2xYY3d2OGtOQnI1bk1PNjhyaElXenZTTWYxKzc2RUhjODVwRHZkNzZQNE5VYWo2R2g3QnBGT216c3F2NDhpM0lmVk1LMEJycTVaazRCK1piN3JDTWZYeDFST3pOZFNpOGJXTVgycUpxMDNDeml1eXM5MHc2VFBjOUdLVWFxTzNrL3JKdk9iNG1INUhoN2p1ckVDcHJuWmhjOFNldjdNY0xpdU9FN3k5b3FPWjBrZGtWcjFBWloyc0o2SndQOVNXb2J2NEtiTHptcEUxOVBsYzl5T2IrZ0ozRkRpOVF4d3VjUHZTVjJYcVFZdE5lZitRZGUyMUxrSStLYUs5MjhOM0E3MEQzQ2IrbUlHc20xRmRZUEJwbnBZdmdjRForQnUwSENZWEI3anNRSFhHVit2cWRWWU5vYjdQMEtYMEpJNnFBaHF0b3JET3JvZ3BXVTRCL2dVV0svRzliVEhQSGo2T3FMOXVBb3pjZU5tanRhM0I3Q1B2YzlvTU13R0lTNjNXVjJtbXVnTnpFYmRpTkswZkVIbFQ5NjZZWEw5aDdsOTE3YWlIdnRZaCtNNktQeFFuU09oTHMrRmNFeEhPdHplZW50ZFNKSkpqc3BtZEV6My8xSDg2VHExdjZOdEdaYnllN3M3SEpYajloSHZ4NnE0NjhxN0FOTXRyeUZwd3k2b3k1UXp6WFdkMmt0UFlWTG5HSHRqM3BLdGdZK0JvMFBldnVPb1BnUGFkQS9MK2FDWTFvOStPa1ZDdFV6TXRuY1VaakpIa1NEMGQ3U2VqMU5lanE2NmpRMkllRCsreE8xRW1Fc0RWd0pkY1R0amZHcTdURlVTYU95djYxcXEzRS9MRTIzMXdHUmdlSW5vdXIzY0FxeFp4ZnQ5SEtleEMvRjg4cHZSYVJLcXVNMG0vN0VPbWNUZyt2TkZ5c3Z4TTgrT1J5MnVCVjV6dUw3ZkFVOWd1b1c1a3ZvdVUrVUNqYjYwUHRPUHhNOVVXcDRsY3dkTUh1cy9Scnl0RFpQNWRhL3cvVDQrWWUwRTdCbkRlcUpKeDhJVnQ3a1hSdXVRU1lDV2RyU2VzU2t2UjFjVFVmclE0bG9QSEliYm5nc3U3MzFUTlRGZnRZSEczclJ1a2pXSnA3T2J1Zmowd0xRaVBJcy9FNGhscVh3eXYrbWVsdmwrTWF3blBYU3FoS29qOFpyRDZEc2RNZ25RVWdvMHZOci9wVHpabjYrQVAzdFl6cW52TXRWU29MR1BybW1wTVJJenFMdVVIVEd0R0Q1bUg5c2JPTG1DOTgzd3ROeDN3RzFHaXpCMDAra1N1cTRLTkVRQU53ODZKdW5Hai9IMkp0aUg0K0hLRGNCd3o4cFpXYWFhQ1RTV3dLUVJsZVJiQUJ5Sm1SU3ZzVjZZRm9ObjhLY1ZvNVJMSzZpcmt6M2Q5ZzVFbjdVanpqOHNhVkVYbzIzOVhvZExBdFRkd1RvbXFSaVpqNXZVNzkwOTJxY0ZtQm0rZmVuQm9DNVRMUVFhTzZCdVUybHhDNHZQV0xzckppdkY3Mkt3L1cweGc5aWJ5NGJrY3hhY1hWVUZwUVZ4YXZXYW9NTWxBWEtSSG5TeWl0RlpPWFQyYko5R0FhZDZzQjNxTWxWQm9MR1RpaVVWZnNKTUhOZWdGNllWNDBuaWxjWjBhY3drTytYNnNzL3dlTnQzSmw1UHJEVzdzVFRuRnhXQmhIeS9VcTBGS2tabjVkRFd3LzI2Q1hnKzRtMVFsNmtXVHR3NlRMOThTYjdUZ0ovdHYvY2dQcTBZcFd3Sy9LM00zNlo3dk4xTEErc3EwSkJtZEkvUnRpclFrQ0M1NkxxcEZnMTM1ZURqdFdrQlprenAxSWkrWDEybUtnZzAxaVorazBSSjlWNEQ3c1Nrejd3SE0vdHIzQ2RqT3g0WUdzTWZsbDFpVk1aVGRPcUVybTFNdG5NeWVsb3NFaGRKUGxlL283SkVNYTZweTFTRmdjWU9LcExFbXdjY3hjSldqQU1TdEcrM3N2aGtmdE05MytZdFZTVWxBZlNrV0lJMjA4RTZ1cW9ZQVRjWkJHZDZ2SCszQXMrRi9KM3FNbFZob0xHNWlpVHgvb2tabS9FSTdpWkE4a1ZYRnAvTXovZEFZeE9nWFV6S2Q3NU9IeWxEclJrU3ROa08xdEZleFFpT2ZuTm1lN3gvRFZtb3dub0FvaTVURlFZYWRaaSs3cEpzKzVHc1ZveW1tazdtTjhQejdlMEtyQitUc3AycTAwZEVJakxQd1RxNnF4Z0JOeTBhOHp6Znh6SEFpU0Y4ajdwTVZSSFZEc1QwMlpkazY1S0NmV3lZek85dnhDTnYraGJFbzhuVlpWbmVna2xJSU1rSTdpYnBVRWtNem9YT0trWm5nVVljeHV6ZGdabUFPc2l4a09veVZVV2dzWm1LUXhMa1V1QTkvTzg2QmZGcFNYUjUwOXRmTjZjaVVnVVgzV0Q2WW5weTFLZTRISHZqSm9OZ1hKS0RISUVaanhyRW5FVHFNbFdCTmdvMEpLRWFKdlByRllOdEhSS1RNaDN2Y0YwRFZVVkZwQW9USGYwdUxKM3ljc3c0V3M5UE1kbmZNY0N4QWF4WFhhWmFFV2dNVVhGSXdpd05YQjJEN1Z3ZVdDcGxnY1lLdUdtK0Y1RjBjSFg5V1RibDVlZ3FsZjFQTWRybnU0SEhISzlUWGFhcUREVGFBMnVvT0NTQjR2S2pFb2RBLzBmSDYxdGYxVk5FS2xSMHRKN2xVbDZPSzNuNmV4QzBJM0hYbGZwcjFHV3E2a0JqTmVLVFlsTWtpZUlRYUh6cmVIMGI2YkNMU01qWG43VlNYbzZESEszbnV4Z0dxaE1jcmVzVDFHV3E2a0Jqc0lwQ0pGSngrUEg3eHZINk50RmhGNUVLalhLMG5yVVZhSGo1ZXlBS05FUWtRSEVZSEQwR21PTndmVnVobGxRUkNmZkdOdTB0R29NOU94NlNra0JqVFJXRlNLU3lMSnhrMEZmMXdHY08xOWNUMkZpSFhrUXE4RDF1VXFxdVFqQ3BUdU5nTmR6TWwvWXQ4VWdkTHg0RkdpdXJLRVFpMVFXVGZjcDNIemxlMzg0NjlDSlNvVThjM2Zkc25kTHkyOHJUM3dGSlFhQXhRRVVoRXJsc0RMYnhZOGZyMjFlSFhVUXE5S0dqOVd5dlFNT0w0eUFwQ1RReXVKa2xVa1JxRTRlV3hUY2RyMjhWMUgxS1JDcmphdDZDTkFZYTdZRWRQUDBka0lRSEd2MVZEQ0plaU1PY0grOEQ4eHl2ODJBZGVoR3B3TnVPMXJNcTZSdWJ1aDJ3aEdmSFFWSVNhS3lrWWhCUm9GR2htY0I3anRkNUNPa2RuQ2tpbGZzQ2R4UDNIWkt5c2p2QTBYbytCaWFxS2tvMWdjWnlLZ1lSTDhUbFhIemU4ZnE2QVgvVTRSZVJDcnpvYUQwSHNYQ2NhdEoxQS9ad3RLNFhWQVdsMmtDamo0cEJ4QXNycERUUUFEZ2U2S0FxSUNJdGVOYlJldm9CTzZha3pBNER1bnRXL3FKQVEwUkNGcGR6OFEzZ0o4ZnJYQjQ0VmxWQXhDdnRQZHltcDRENWp0WjFVa3J1ODA1d3RLNHB3TXM2TGFUYUNyaVVpa0hFQzB2RVpEdm5BMDhFc042emdGNnFCaUxlNk9yaE52ME12T0pvWGRzRFF4SitEUGZDWFViRHA0QTVPaTJrMmtCalNSV0RpQmZhWWZyU3hzRy9BbGhuYitCOFZRTVJiL2g2ZjNDZnczVmRuUERmRkpmN2Q0OU9DV2xOb0tHdVV5TCs2QldUN1h3ZUdCUEFlbzhGdGxBMUVQR0NyejBlSGdSbU9WclhEaVIzck1hUnVKc0lkandhbnlHdEREUTZxUmhFdkJHWDdsUDF3QjBCckxjT3VJMzR0T3lJSkZVM29LK24yellaZU1qaCtxNGhlUk1YOXdIKzZuQjlkK0orRGlWSlNhRFJTOFVnNG8wNEJmNTUzQTNLYkd4VkcyeUlTSFFHZXI1OTF6dmUxM01TZHZ4dXhGM1h0d1hBRFRvbHBMV0Job2o0bzJ1TXR2VjdUQmVHSU93TC9FblZRU1F5RzNpK2ZXOEI3enRjMytuQXBnazVka09CZlJ5dTcxRmd0RTRKYVcyZzBWbkZJQ0t0ZEhtQTY3NEMrRTNDeTI5cFZTSHgxT1lPMXpVcm9HMjgwT0c2Mm1JR21jYzlFK2RLdUc5OXVGU25nOVFTYUdpU0xCRi94SzJmOEFqZ3NRQ3ZUL2NCdXlmMFdKOEY3SzhxTHg1cUMrd1NnMERqY2VBemgrdGJBZE5LRzlmN29tNlkxZ2VYWS8yZUJkN1JLU0cxL0pDTGlEL2kyTUw0Rjh6ZzhDQzBCLzRON0ptZ1k5d0R1QXUzVDJORlhOclc4YzNxbElDMnN4N1Q1Y21sTGUzNTJUWm14NnlEdlZhdTVYQ2RDNEF6ZFRxSUFnMFJpZEpId0MwQnJyODlKc1BNVVFrb3E3MkJUNENEVlczRVk4YzZYTmRNekNSN1FYa2NlTjN4T3ZmREpLU0lTN0RSRUdTNFR0TjdIL0NCVGdkUm9DR1NITk5pdXQxbkIzd3owUWJUNy9nMjRwbVNlMGZnTlJzd0xhOXFMaDViQjlqTjRmcStDMkdiajhOOXErcnY3STIyNzkyb3V0anJ5cThEK0MwNlRhZURLTkFRU1phNDVpbWZBQndmd3ZmOEh2T0ViZDBZbEVrWDRIRE1PSlpuZ00xVXZjVnpkWmc1SmVvY3JuTlVDTnM5QXZoN0FPdmRCM2dKZjVNMkxBdTg3RGd3YlBCWGdwbVVWVklZYUV4Uk1ZaUlBL2NBVDRYd1Bhc0Q3d0pYNHQ4OFFIWEFyekJ6akl3RmJzVThJUmFKZzlOcy9YVXBySzQzWnhGTUN0Yk5iQ0N6bldmSGFrZE1ldDhOQTFqMzJ6YmdGSEVTYUN4UU1jVGFmT0FuNEZ1N2ZOUG8zOU5VUExFek9lYmJmeWpoUEFWcmk1bG40eXZnWktLZFNid3RzQlZ3clQzdlhnR09BSHFxT2t1TTdBMWNITUI2dzhwWU5CVTRMS0I3bW1XQTU0R2JpUDdoUm0vZ1prd3JhUkF0TFRPQlF3aG1NbFpKcWUvdGlhbkYzNldJU1RGM0pmQUhZSHZNVEtZOUtqaSs3WUYrbUltSURnUXV3S1FqSGFOeTlYSVpsSUJyeXViQTNKRExiU0ptVG85VlE5ckhmdmFtNWdIZ2x4cTIrOFNJajlWSVIrVS9NcUcvajVNY2xjOW96L2Z6OThDY2dNN05zTHNkWFJUd3RXWUNjQUxoWndqc2JLOFhFd0xldjhNVGZMODcybEVaUGFyUW9Ub2Y2K2JPeThEaURreG1tcFVDUFBZRE1FK2cvK1h3QjFWTGJjdXlDYm11SEJsaEdiNEYvQmxZRzNkOXpaZkRaS0laNXZEbVhJR0dBbzJvTFlWSjVScmt1UmkydHBoV3hhQ3ZNejlpa21Ca0F0NmZqUDJlSDBQWXB6c1NmcityUUNNaXIrbm16b3RsakcyeFdCKzNBL0VxMVI0ek1kb0R3R3dkajhpV0xnbTZ0bHpsUVhsT0JQNWpuM0llaE9sdnZTS20rMFBUMUpYZGJFdkZKallBdnhoNEdQZ2h3TzFUb0tGQW94WnJBaHUxNG5NckE1ZUY4SURwenhFZHQ3NE9ieXBiV3VaaXVqSDkwVDZRY1BWZzR3amdhVXlDa0REMjQyM2lPWStUQWczUHRiTVhHb25HQW5zVDlIZE0xNmo2Q0xkbExpWWYrZVAySXYxSFRDNzFqQTVUYUdZRE14SzBQeWRqSnYwNk5NSnQ2QTNzYkpkUzVtRDZKSGRIV2Zna2ZqWUEvb0VabS9lZ2ZYRDRCYVk3WDBNR3UrNllsdEtWN0lPc3JRZ25hMXU5ZlhBVmhmR1lURXl2VTFrWDQxcnZvM1prNFJ3V28reE4reGZBbDBBQk00NXltcjIrTjF6amUyREdjUzJEbVpGOFZXQ3dEUndIaEZ4ZTN3RjcyR3VoaUhOM282ZklZUzl6N0kvREtwN1hqYzQyMk5CNGpuQ1dIeE40ZldtTHlVYWw0NnNXalRpYWhOOHRHb2Q2WExjZjh1RDRiVzF2bm5XdEtiLzhCS3lXa3Z2ZDBhaEZJM1J0VUo3a3NOMEhaREVEU2IveWZGdG5BdGZiN1QyUFpEMXQ5OUhQQ2R5bitaaXhSamZwOElxa3l0VWViTVBMbUxGVmMzVTRTcG9DN0FSOHJxS1FJQU9Oc1NxR1VJekFOSWtlZ1A4WlNKcWFEcHlMNlEvOHJBNWxZTDVQNkg3VkEwZGg4dHlMU1BJOWp1bkc1Y3UyL0ZiQnhtSW1BRHRnNXVJUUNUVFErRkhGRUtoWndDbVlTWFhlaWZtK2pNWTgvVGpjQmgvaTFuY0ozNytMTWJuNk5iK0xTSExOd1l6UDhpM3cyVVhYbnYvM0k3QU5aaXlKU09DQnhnOHFoc0I4QkF6QlpKT2FsNkQ5dWgxWUQvaFFoOWlwNzFPd2o0L1l1ak5TaDFza2tjN0h6MjdCTHdCYjZKNkhEekc5S3o1V1ZaV3dBbzN2VkF5QnVBWFRpdkZwUXZldmdKa0U4RDRkYW1mUzhnUDRKYkF4Y0FtYWZWWWtTVjRDTHZWNCswYmEzK1gvcHZUNFBHaURyZTlWVlNYTVFHTU1wbnVQdURFWHlHRnlZTTlPK0w3T3dJdzUrWXNPdXhOcEN2cG5BMmRpbnF5OXEwTXZrb2dIQ1B2RzRPSEJqOEMyTmlCYWtLTHI3ZkgyK0V4VlZaV3dBNDBGK0ovOUtDNm1BTHNDTjZkc3Z5OEFmayswODRBa3dSY3AzT2YzTWEwYmg1Rys4V0lMU0dhbU1VbWZNWmg1SkNiR1pIdm5BV2NBVzZiZy91ZDl6THdwMTZtYVNsU0JCZ28wbkppQW1RanArWlR1L3orQVExQlhtTmFhU25yN0R0Y0RkMkJtS3o0SktDWjhmNzhHemdINkEzZXA2a3ZNZllicFJqc3FodHYrS3JBMkpsSEZuSVFkbHluQUNaZ0hPWitwbWtyVUxrT1QxdFE2NGMxYXFrYUF5U28wWDNXaTZrWGRoeGJxaUptSWJHU0NqdTlZekJQRnpZRTZqOHJhVlJtUFRHaGRuSVFtN0d0dWVSem9sWkJqdlRKd3YzM3dFZmNKZ1c4Q2x0WlB5V0pHb3duN0luT0FidlFVWkRqMGU5V0xxcGM3VlcxSzJzaithRTZLNFRIOTFnWVhXN0N3OWRnM0NqUVVhTFJtbVFMODBiT2cyWlYxTVlPbTQvYkFiQlp3cXcyWVJJR0dOOXJaLzM2a29taVZhY0RPaEpzbXJnMndPckFKWnNidWxZQVZnYVdBemtBbm9DMHcyZjRZZkdtMzczMU10NjR3Qm9MZGJwK21YS3dxVXJGUFZRUWx2VzJYNHpBRE9QZkM1TU5menNOdG5RMjhBZndIZUFiNEpBYmxPOVZlSzF5c0o0a21PMXJQbElTVXh3TGdYOEJwSkRkNXhRaGdIMkNBdmU0Y0RDenA4ZlorYjM5emJ3VEc2U2REZkE0NFpxT255dFVzODREdFF6bytQWUhmQVU4QXYxQmJrK3J6d0ZDZ2ZRamIvVS9WazRxWDdYVVpxc3Jxd0RIQXZaZ3hEMUVjczNIQTA4RHBtQzVSSFhSWUpHU0hobFRYNXdML0JnYW5zSXc3QUwvQmRLdWE1c252eGM4MnVOZ1JmMXRMZlRRYXRXaUVybkd6NS91WWliU2tNc2NDZncvNE96YkZ6TEM2V3dBM01XT0JxNEZyQ1c0UVhFZk1ZTHNOVkYxYTFBZGxJS3ExL05heXkwQk1TOThBVEd0Zlp3Zm55bGZBTjVqNVl6N0NQUFVjcTJLWGlHMWlmNGZXRFdqOUg5c2I3TnRKZnBLR1NuVEdKSDNaRHRQQ3VsWklOL3J6N0QzYUM4Q0x3R3MyK0pQcS9BWG83ZWk4dUUzRldYMmdrY2ZNL1NBdHV4WFRQelVvMjJKbVY5MDBoSDBaWllPWlJ3SmEvd0RnQTVJellEQUlYd0dycWhnQzB4WG9CeXdCZExkTHJ5WTNEek14ZzBDbjJIK1B4N1JZVENCNTJXZ2tlWG9EUXhvdGF3S3JVRjNMOVR4TWQ3OFJtQzZBejZCWnRDdTV0alNVK2VyQWFwZ3hFcGxXQmlEejdBT01yekdab2o3SEpBb1ppZVk3a3dRRUdyL0RwSmlVbGlQWkRRTTY2VmNFcnNKa2JncmIzWml1S0VIMEpmNHRabkNkbFBZQXBqdWJpSWdyN1RBcGxMT1lNWE5MQUQzczM2WmlCanVQeDh5QjhRT21yNytDYW5kbHZ6Um1iTWNTbUFjYmJScVZQNWp4UC9XWTd0Qy9ZQjVxakVQelVVbUNaVkUvK1phVzZmYXBSUkFCMzlHWW1iYWozTDlSd0RvQjFhOTdWSC9LTGlmcjhpTWlJaUpKTjBFM2ZjMHVKd1JRNXQyQmh6emF4Nm1ZckQ2dTliRlB6MVNQRmwvVzE2VkhSRVJFa3U1UjNmU1ZYVjdGL2FDdkZUQURTMzNiMS9uQWdRSFVyME5WanhaYkptUFNFWXVJaUlnazJuRzY4U3ViMm04MXgyVzlDcVpmcksvN0hFU3dVUWU4cnZxMHlQS1lManNpSWlLU0JxdnJ4cS9rY21YS2dvekd3Y1p2SGUvN3BxcFBpeXduNnJJaklpSWlhZkc5YnY0V1dYNWkwVXdSdGVxTHljY2ZsLzJmaWNuVjd0SmpxbGYvdnd6V0pVZEVSRVRTNGgrNitRdnNpWE43NHRsMTZFZGdHWWZsc0s3cUZRdHNVQzhpSWlLU0dudnJCbkNSRzhIT0RzdjJzaGlYeFhNc091OUtyWjVSL2VJR1hXNUVSRVFrVGJwaHVzc28wRENENDEzWktRSGxjYlREOHRoRzlTdVFOTUlpSWlJaVhudFNONEZNdEVHWEMxMUp4dGlYYVppVXZDN1VBWitsdUg1TkJ6cnBVaU1pSWlKSlZXNWVpRWRWTk54b2I2eGRPQWRZTGdGbDBoVzR5Tkc2RnRneVRxdW5nVms2elVSRVJDUnRsc0xNSFpIV3A4M3pnZVVkbGVXcXdKd0VsVTA5c0o2anN1bVQ0bnIyRzExbVJFUkVKSzJlU25HZzhZVERjcndqZ2VYamNwSzV4MU5Zdnliak5zbUFpSWlJaUhmYU5QTzNlMUpjTHY5d3RKNFZnQU1TV0Q2L0JnWTRXdGQ5S2F4ZmoyRVNMb2lJaUlpa1VsZk1HSVUwUG0zdTZLZ01yMGx3T2JtYUxiMFg2ZXMrdFpNdUx5SWlJcEoyLzB4aG9PR3FOYU05TUNIQjVUU081bHZFcXZGQ2l1clg5MEJiWFZwRVJFUWs2VnE2VWJ3NWhXWHlzS1AxN0lvWjdKeFVmWUZOSGEzcm1SVFZyOXN3eVFaRVJFUkVVaDFvdklxWjZ5QXRaZ0V2T2xyWGdTa29yNzBjcldkNFN1cVh5eFl6RVJFUmtWZ0hHcEN1Vm8yWGdCa08xdE1XMkQ0RjViV3RvL1Y4QUV4S1FYazlBM3lyeTQ2SWlJZ28wRER1Y25UekhRZlBPMXJQUmtEUEZKVFhJRXpTZ0ZyVkErK2tvTHh1MGlWSFJFUkVGR2dzOURObUxvZzBHTzVvUGR1bHBMemFBa01jcmV2ZGhKZlZsOENUdXVTSWlJaUlBbzFGTmFScFRiSXB3TWVPMXJWQml1clFJQVVhRmJrYTAzSWpJaUlpb2tDamtRTEpmeHI3RHU2eUFhMmRvanJVMzlGNlBrNXdHZjBNM0tuTGpZaUlpQ2pRS08yS2hKZkZlNDdXc3dTd3ZBS05xbzBtdWJObDMwaDZ4am1KaUlpSVZCMW92QXE4a3VDeWNOVjFaMkRLNmxBL1IrdXBCNzVJWVBsTUI0YnBVaU1pSWlJS05KcDNib0xMd2xYWG5lVlNWb2U2T1Z6WHFBU1d6L1dZR2VKRlJFUkVGR2cwWXppbVpTTnA1Z0xmT0ZyWHNpbXJRMTBkcm10MHdzcG1PdkEzWFdaRVJFUWtqZHExNGpQbjQyNitDVjk4anJ1QjRETklkaGV6cG9vTzE1VzB5ZXpVbWlFaUlpSlNwZWN4Nlc2VHNqeXFRK3FGb1FtcVU1T0FKWFZJUlVSRUpLM2F0UEp6cDVLc2VUVkdxeXA0NGFjRTdjdkZxRFZEUkVSRUZHaFViU1J3cndJTmNTd3BOK2JmQXRmcWNJcUlpSWdDamRZNUc1aVZrSElZcTZyZ2hja0oyWTh6RTNSdWlJaUlpSVFlYUl3R0xrbElPWXhUVmZEQ2xBVHN3enZBZlRxVUlpSWlJclhwaEpuN0lPNERkMWZYb2ZSQys1alhvL25BZWpxTUlvblNEZGdXcUZOUmlJaUViL2NFQkJwTDZUQjZJODcxNkJvZFBwSEV1ZCtlMzU4QVJ3Q2RWU1FpSXVGNkxPWTNpSjEwQ0JWbzFMajhDUFRRNFJOSmxPTkxuT3NUTVZubDlJQktSQ1FreTJJRzhzYnhCbkdlRHA4Q0RRZkxmanAwSW9teUNUQ256UGwrSzJyWkVCRUoxUitKNzhScW9rQ2psdVVSSFRhUlJGa0srS0hFdVQ0ZCtKMktSMFFrZkhYQXl6RzhTZnhKaDA2QlJvMzFSMTBvUkpLakxmQkNpWFA5TTJCTkZZK0lTSFJXSkg1ZHFFYnJzQ25RcUdIWlI0ZE1KRkV1TEhHZTM0M0pQaVVpSWxWbzUzaDkzd0xIQVA5VTBVb0tQQUE4cUdJUVNZemVRRmNXelNBM0VyaERSU01pNG8rR2RJQnEwWkJxeGFYZWpBS1cwT0VTRVJFUkNkY1NtTmFOdEFVYUR4UC9PVVcwdEx6TUJUYldhUzRpSWlKU1hydUExdnNMcHUvNmE1alpubjNXMGVHNnBxaEtwY0pad0ZzcUJsWUJsaXZ4K2xlWWpEMXhVNGNaN1BzcllIVmdKVXczbXM2WWJFUGo3TDY5YjY5dEV6eStwdjBLMkFBWXdNSmtCZE14eVF1K0JUNEEzck92eVVLL0FaWnY4dHA4NE85QXZRZmJ0dzdRcThsck00RzNIYXg3U1dCUWlkZC9zUFUrU3Awd0QzYzJBVllEK3RsenN4NlRvbjRjOEIxbVVzVzNnQzhpMk1ibDdEVXhTS054M3d1ajNIYjdjTnhMV1ovZ3gwdTlCY3dLYVgvNkF0c0FnNEgrUUJjV1prVDlFZmpTWHF2LzU4azF5RHZIa2E3MHRqZWpwLzFKWDU2Mk42UUN3OHFVMFlreDI0OFZnTXNwbmM2MDNGSVB2QVFjRk9BRG0ycXRDTnhnSDNoVXNnK3pnUDhBKzhiZ2dWQllQL2l6eTVUVnJ6M1p4dUZsdG05L0IrdmVzOHk2aDBXNHZ4dGp4c2RNcS9JNi9UVndQbWFPcjdDY0dNTHZ6N2toYnZjd1Q4L1RrU0dVYy84UTltTkhUSGE3K2dxM3FRamNDQXpScFhweEQrQi9ONWlnYjd5MEpHUDVDbzNMU0ZLZ3NTUndpMzBpV2t1OStBNFlHdUYrMUFHbjJNQ2hsbjM0UGRBbXhmWDVMODJVejR1ZUJ4clRxRDMxcmsrQnhrQWJCTmQ2elo0RFhNM2lyVUFLTkJSb1JCVm85QVllcTNIN25zTzA3TVJDR0Q4cWh3TWZlVndHN1hEWGZVcmRFSkpydXYwaC9rVkZrUWg3WWJwWC9BRXpiMEl0bGdmdXN6ZEdTMFlRWk53QlhGSGpkV3g1NERaTWw3Q0JLYXdQSFlDam0vbjdOc0JhSG05L1YrQWhvSHNDanNXSjlwNWhad2ZyYW0vWDl6OWdKMTMySkdMTEFlOEF1OWU0bnUweDNTV3Z3WFFyVEgyZ01jMFdxczhUNC9Wd3RKN0pPbzhTNjJCTS8xK0p2L013aVJ0Nk8xN3Z6cGl4RDJ1RXVDOFhBb2M0WE44bW1ERW9xNlNzVGd3RmxxN2dCdGhuQTRIYmlXL1h6dmJBWFpnV2lBNk8xOTNQUGdqNGt5NS9FcEZPdGc2dTdQRCsvWGhNNjRiWHd1cGIvQzFta04yTCtOa1hlRWxIZ2RBWW5VdUp2VEY5Uk1XUUNGZFdlTE14Qi9nY014aHZycjFHckViTFhUQ1dCMTRCdGdRK0RYaGYxZ0ZPYitidk00QjM3ZlczSHVpREdldzdvSVgxUG8rZmcwQ0RWRWtRY2FBdGI1OGZtdjNXN3N2Vk1Tdi90c0MvTUszR0xmblpucHNUN00xYkh4c1k5MnpoYy9YNDNidENrdTBzbW04Vi9kRmVyMysyNThQeWxFNyswTlNOQ2pRV2VoVTRBdmlIaCtYUUYvak13WHJHNmx4S25MdHNvQ0hKdUpsc0tjaDRBc2hqQm5yUGJQSzNPbUJ0VEF2Q0VaanVLdVVlWER5RDZVTTdQc0Q5T1lQU3JkSnpnYjhDMXdOVFMveDlSY3dBOENNeG1iV2EvdGo5TVdYMVlndGczUXJlMTlHVzJRV2U3OC9sbUN3MXI4Ym9HRnpWUXBBeEY5TmFjNXZkdHdVbHpzMUJ3TjcyM094WFloM0hZZ2JmaHUwYTNJMTNtS1RMZUxQbnNhdHNoNjZ6Sm5adjVtSEdhTXhFMTArWHFOZHRnQTN0Yjg0aEpYNXo3c0YwMjVVbXpzRy9RYjc3T3RxM0ZkR0E2U1F0eitHK0NUOUpoaEdmd2VBYjJwdVZjc2Y2VTJDakt0YTNGUEJQb3N0UTF0a0dRcVcrZDc4SzE5RUdPTlErSUduNDdBNHByTWNQVVRxcjJKd1NyNCtOK0pvd3ZNSnIxMWdnVStXNjl5U2FRY0Y3dHJBdi95MFJFRGVuQTNBcWkyYXF1aTZrQnhsaERlQU9ZN3VIZWJxOUk0a3VVMVJyN1V2NVRGTExWTGlPSlRFdDhnM0pTMGJUY2l0ZXF0M28yUTNsS1k3MnF3M2wweU5xaWRmeW9VN2l4QVFhN1REamE4b2Q2eWRvZlY3MjR6RHpMSlJiOTRFQjdkTkdaYjd2ZzFhc3F3Zm1TZkhWS2F6RC9jc2N2eWVhQ1NRUGlrR2dzY0MrdDVwZUMxRUVHdDB4cldqbDl1RVdXdC9kT292cEt2VU10U2Q4VUtDaFFLTVdWNVhaNXROYnNhN0J3QWhnczdoY1pLTktaWGdzOEtoSDViQ2lvL1hVRTN5L2JBbmUxOEF1YUhCL1V2eUI4cWsvWDhHTUg1dld5blZmWjY5bjVWeENNRS9BKzVWNXZUVUpDNlpnc2dPbWNhRHNjV1YrQjY5cjVrYnJ4SmpzMjVhMi92bnNOTXEzdkR5TTZRYlYyaFQwQlV4eWcvMXNNQ2tTRlpmWDY0OHdjMm04cmtDamVmUHR5ZitNSitYZ01oTFdZTE40R3dOc2h3YjJKMFZiZXpOVHlnUk1rL2FjR3IvalJ1RHVNbjliSGplVHFUVlY3a2wxTGVsMUY2U3NiblN6UVdoVG4yTUd4TDhQdkZuaTcwT0F6VDNibHlsbFhqOEZNMjdCMS9JdkY2U1BCZzV6VUNlbm93ZEdFcjBPanEvWHNab2hQTXJKbWVaZ25pUys3RUU1ck81d1hlL29uSXF0OGNCVzlrZE9rbUU3eW1kWk9oTjNnN1ZQYXVhRzVnOEI3TmVrTXE5dlEzWDkyZFBzTUVxbk5yK3UwUTN1TldVK2U0Sm4rL0pIeWovNXZ3TlkxY1B5MzV2eUdYVk9hU1o0RW9tYkNXVmUvejN4VFVjZGkwQURUUHJGM1R5NE9SK0F1MG43M3RRNUZkc0x3WGFrTDYxbjB1MVQ1dld4OWdiTVpmMzVlNW0vYlViMUEzTmI4a1daMXp0aW5zYXZyMFBmNG0vZmNTVmVuNExKTk5mZ0lVcTNidTZGdXk2M0xyeEQrUzVkM1RIZGtMcDZkZ3pLSlMzNHpHNnZTRko4WHViMUxUQlpvM29uZWVmYmVMQU5NNEJ0aWJabG93MG1SNzRMSDZLbTJyajVFZk1rK0dNVlJlSnNVK2IxdTJsOTMrOXliaS96ZWgybXBjeWw3NXI1OFZySjNuZytBdXlLTXFlVnNndWxuL0xmenFMamRlWUJONVI0WDF1YUg1c1RoUnN3QTloTEdRVGM1TkcydHFWODk3TzdTRjgzUGttMjUxb0l1TC9CWkpRYWxNU2RiK2ZKZGt6RHRHdzhpcGxhUFFwRGJKQlFxL21ZSFB4NzZkeUtoVEgySmxBdEdjblRoL0xkcHA0TjRQdSt0amYvcFI1YXJBUGM3L2o3aGpWejgxaUh5U0swSitZcC9YT1lDVk5mcG54clNKcWNXT0sxQlppNVI1cTZHWk9XdlZPVDEvK0FtV05ubWtmN2RSUm1UcEJTTnl3SFlWcmNiL0JnT3dkU3V0c2F3Rk1KcTJ2OUhUeG8rSVR5M1cvRTJKamF4dHZPQTE0TGFOcytZZUZFcnFYMHhDVGorSlA5SFhuR1hxdGZ4a3pncDBERGtZWnVWQThDdTBjVWFOenVhRjFQS2RDSWhhOHhyV25mcWlnU2FaVm0vdlpCUU4vNVRwbEFZK1VBdnV0V2UvUFkwc0RrSHBnWm8zOXIvLzg3RzNnOGFnT3VlU21yRjJ2Wjg3N1VkZnZyRXE5UEFPN0Y5S2R1ckJkbUVxMGJQTnEzNlppeEQrK1Z1WkVmaGhuay9uYkUyMWx1ek1nYzRIOFZybU1GeXJkWXR1U09FUGYxZDNhcHhWNzRsYW5UUjdWT1hEZVpsbWZocnNXUm1KbS9XMHFsdmpKbUFyOWpNSU8rMzdlQnh3TlZuQnZTZ3JhWW5PNWh6NXZ3bnNOOVdJcm1jK3RyaVg3NWdNb255cEhTaHVIM1BCcTdsOW0rcVFGKzU0V1VuOU1nQ0gyQXQybzREOFpoVXFBdW1hSjZlMHVac21odXNzSzF5M3ptQzhJZHpEbWN5dVlRMkx1WlkvNWRtZU85SitITnAzQlltZStxcG1WNXp4cnFmUkJPRFBEM2FzOEE2OVNKSkdNZWpWcVhTU0ZzKzliMmUxcTdqU013azZ5Mmk5TUZ0NDJIMnpRZms5UDl2SkMvZDEzS04rVlc2eWRNOXlueDA3T1lKc3dmVlJTSjFxbk02ek1EL001eVAxWmRBdnEraVN5Y0w2RTFZMDc2WWlhTkdvM0p3dFUyNFhWaVNVcFB1TmVRMHJhY0Q4c0VpMWxnWncvMzgySGdpakovV3g3ejlEZktZMTF1TXRScGlDVFh5OEI2TFZ4cm1yTU84QTlNd29SdDRyTFRiVHpldG5NeGsvWE1DN0VzTm5XNHZqdDFUbm5wSDhDdkNmYXB0dmhoVHBVQmlBdmxNdnZNQ1BBN1o5c2dvVDl3R2VaQlIydTIreUxnYVZvL1Mzb2M1TW9jLzhZcGJjdTV0c3pySjNxNnIyZGcrb1dYc2gzdzF3aTNyZHo1MEZtWExVbTRiekN0cDV0anVzTzE1aDUzRmVBRlRCcG9CUm8xdWdYWUVmZ2xwTy9id2VHNkhnNXh1NlZsQzRDek1LMWxjMVVjcVZEdS9PdU91OWJMcHNxbHNRMWpRTjlZVE90RVA4eFQ5cno5VWF2RzlzQy9TR1p1OXc3QTBTVmViNXJTdHB6SEtUMmVhM3ZLenp3ZnBmbkFVTXEzM0o2RHlVb1doWEl0RityT0ttbnhPbWJzemRLWXhCS1BVVjNHMGpwTXErWHZmZC9ST1BUemVnbllBSGdTZHlsb3k5a1pNK3JmaFJtWXdacW42bnlLM0ZUZ0FGdUhKRDFHTi9PM2RTbi90TGNXYTVkNS9lc1E5M3NlWnZEZ00vYi9CMkFHUDIrRmVaaXlWQVhYd1VOSVhxdnNQallJYStwMkt1dXlNeC9UOHZHM0VuODdBZE1DNzV1aTNlL2haWDd2LzRsSmhETEtrM096TzdBYzhFTUY2NWhNeTVraVZ5SDYrVU91b2ZieER1T1JsbXhSWWIwcEo2clp0bi9HakV1K0RkT2RjWDNNV0k1dGdWL1JjbnJ5YSt4REVHVWxjNkNITGN5Z0J3bXY0bkNiVjhCMDM5RGc2K2lXTDBJSVVOTnFHSDRQQnErekYvRlMyM2hCQU4vWHM1bnovVUJQeXFTdERUanV0UUZKdWZNbWlYUEt2QlBnZFdZR1ptQiswSVpUMldEd3BrNmkrY1FZblFoM01IaXZacmJuNEJES0t3Z25sdm11Y3owL0wwNGtHWVBCK3lmd210VVRNL2o3dlJhdVAyZjd2Qk50WWxUZ1U0QTlNRjBENWdmNFBiOTF1Szd2TUdNQ0pCcVBBaHRSZm1JelNiWUZ3S3RsL25ZdzdsdDA5d1hhbC9uYks1NlV5WHg3ODNVQVptQmhvY3o3QmdITEpxZ3ViSXBwR1E5S1oveHMwV2h3TlNaMWZDbnJVbnIra0NCTndneG9MV1VmWGJwRUFOTnFkNGU5ZGgxRytXN2Z1L3E4RTIxaVZ1Z0xNSU1kdHlHNGpFR3VMM0tYVW41UXFnUmpEbkFjSnNYakpCVkg2b1BOVWxZRTluZjRQZTJBazh2ODdXMXFhOUlQeWllWThRWGxzbkN0bEtCNmNHSUkzM0ZNTTRHbUR3Nm4vRU9YdysyTlRKaWVMdlA2YnBTZlowTWtqUmJZZ09Pa01uOGZvRUREdmY5aW5zWUZNWVBvZXBoWlMxMFpoZW5YSytINEN0Z0U4NFJ1Z1lvajlSN0dUR0pXeW1WQWIwZmZjMEl6MXcyZld6Vy9vL3djSDMwVFVnZFdzQThkZ3JZc2JsdkVYWnNLL0thWjh5SHNpWEx2THZONkhYQ2xMbDBpaXlrM2JzN3JlWkRheExqQXgyUFNsQjZOKzd6NGYzQzh2Z3N3RTJOSnNHNnpnZUlIS2dxeEpnTTNsL25iTXBqQnNMWE9KN0F4SmpWc0tlT29MS05SYXgxa3I0TzFLSmNSYTM1QzZzQ3hoRGRueEFtZWw4V25tTllMSDR6QVpONHA1ZGVZVk1RaVNkRVcwOE5sK1JyV01ZM1MzYWU4ZnFqYUx1WUhiZ0Z3SXlZejFUMlk3Qmt1SEl4SmhlcXF5OU5rVEpQWHZUclhBakVXMHovNktSV0ZsSEFwcGx0SXJ4Si8yOFVHRzRlMjhuemZDSGdDNkZqbTcrY1EzQVNCbTJNeUpyVURMc1pNY3RxYTFNMkRtam12NHE0cnBSOGN6YlZCV2kzWCtOdUJKVXJVaDQweHM3WDc2Z0hNbUpYalBkaVd2d0F2bHZuYjlUWUlmbENYTUVtQXl6RGRhdysxeXpPdFdNZEFTbmZQSEtQaURTOWFQQldUL2NORkZwR0RBdGpHUjFBV0tOZkxQU1YrN0NVY3cvQTc2MVJqdVJicTBWdFUxMld5RGpqS0JoSGwxdmtxd2JVYUQ4Q2tNMno4ZlNPQXphcGN6Mi9LYlBzc2dwdk5QRXhIbGRtL2Z6cFk5eFZsMW4xL2dQc3pIRGNaZDlvRGIxUjRqUjBXOERGNnNKbnZyc2YwQ09oUTVUbzcyeUJtTHNvNjFkcnRIdWJwOW80a2ZsbW4vbEJpZTIrbi9MeEw1WDV6eXAwckQrbDJKRnlyWXFaNXIvVUc5cjBBdG0wcFRGNXpCUWkxTDk5Z25rYUxBZzBYTnpRTE1FKzM4NWp1ZCtWMHRROGhSclN3cnA4dzh3RUVvU2VtQzB5NTczNFdrNnEwUXdzM21zZFNQaDN2WXdtb24zV1l3YytsOW05akIrdGZ5ZDRJTjEzM3ZBQ1B2YXRBQTh5WWtuRWVCQnA5Z085YjJJWXY3YzFhdHdxT3lRVVY3SmNDRFFVYVlkbXFtZXZzVEV6TDNUb3RyQ05qSDJDVXE4OEgrSDRoVHFJNnpJUlRsMVBiZ01adGJORGkwamJBODhSN2ZFeVU1bUtlSkY1SWNGMVNwUEpBSThnKzZVdmdObXRZRitBRlRMS0Fsb3dGM3Nka2k1cGp0MlVWVEpyQmxqSUx6UVMyQk40TnFGeE90ZGUybGt6SFBMWCtINlpwZlI3bVNlL3F3RTQwUDNIZnJ5aWZHamd1ZGdiK1UrTDFkNEVOSFgzSGs1Uk9MWGtaSmhWN0VJSEdsaVZlSDBEekUxU1dzN1U5SjVyN1Bib21oSWNINjJCU1FQZG80WDJ6TVZuY1ByTEIvRHpNUU5qbGJQQllTZi8zV2ZZOENPS0cvZW95Mnp6TDBYZThoc25LRmNaMnU3S3VEUTVjQmhxbEprYWRpcnRKOTQ3R1hWZjM5NmlzVy84WXpKaWxMMWs0K2Q1UzlyUGJOUE83OHkyUVJkbE5JOVBUWGlUbjBicW41c01EMnE0L294YUoxaXpQMjVzazhTZlFDUEo0OXdyb212QnlnTnM4RWROUFArZ0hLV2RqQm1zSHNRKzNKYVIrUGtQd0U4THRYT1k3ZmlhWXJtZkRjZjgwOTNTaWJkRm9zSkU5ZjRLOHBvekMzVmpPVWpmc1FmOEdEby9oZHEvamVIdEhobERPaHpyYzNqNlljY1JCYmV0T3VoWHh3eUJNenU3V0hNUnRBOXFtZnlod3FIajVGSFdUVXFEaFRrY1dwajkydWJ3UHJCeGkrVytNbWZuZTVUNjhSUG1CN1hHeWVwbjlHKzk0LzlwZ1VtcVgrcTRnc2lZRkVXalVZZWFiaVRyUUFOUDFPWWdieVhwTTlya2VBVzY3QWcwRkdzMWRKMDdFM1JqaWh1VUV4RHZiMHZKVTdrMlhFUVRUemFsRERjRlBXcGJ4d0pIRVB6dWFBZzIvQW8wRzIyQm1KNjUxTzZkaHVqTkZNVmxiQi90ak05N0JmdHhJOVlOdWZYVlRtWDI4SUlEdk9xbVpCeVN1dXljSEVXaGd6N1d2OEtPdmZpZE0xa2RYTjJVdkF1dUhzTjBLTkJSb3RHUlp6Q0R3dVRWdTN5UmdQOTJDK0t2T0hxQlBxemlvUWMyWTJvVmdtOVRpdWt6QU5PZDNVM1ZWb0JHd05zQlF6SGlFYXJkdk5DYXpUVzhQamtWSGU1MTZrZXE2Vk5WanhqRnNtcUI2MmJ2TVRlcGMrMFB2MmhMTjNCVHZHSk5BQTJCd21mMFlGdEZ4WEFvNEh6T3BaTFhuNWkrWUZvd2hJVzZ2QWcwRkdwVmFEalBPOUtzcXQyc3ljQlV4bTB3MXFZUEJLNzNCMk5mZUtMVFU3LzhuWURYS1QyeFZhN0R4SkdaUVh0cE5CUDZHNmRZeVRjWGh2UTJCTlFKYy83MkVPOEJ0QldBSFRJclkxZXovZDhVODVaK095UmozRldZdzZrdVlRY1UrVHBTMEpHWXc5NGFZUVlJcllMcU10TGMzWUQ5anNyYTlqV2xWSFp1d2V0a2ZrK21sMVBYbGlZQytjMGZNQkpCTmZXYkwyWldkS0owUzg5K09ycG1iWWJvdk5mWXA4RTdFdjlVYllRYkJiNEJKeXJBTUN3ZDBUN08vMFY4Q0h3TC94U1JCQ0h0dzdCcTRTekpRVHBIV3piOFE1WFkvN3ZqZWFmY1FIdTY4WnEvMVlWak5YcS9Yc1hXN0wyWXM0VnhiYmhNeENUMytheDhrS1FsT1RBT09mZXlQUVhPUjVLMEJia05uVEI3a3RMWmdqTVowUDFBTGhvaUlpSWdrMG1hWUowUDFaVzZJZHdqd3U5dGludWFuS2NCNEY5T05UV013UkVSRVJDUVZCZ0FYcy9qa2VtTUl2c251QUV4VGNGS0RpeG5BSFNTclQ3aUlpSWlJU0ZYYVk3cFZ2Y2pDVm82SENYNXNTNWFGL2IrVHNud01IRWM0QTN4RlJFUkVSR0pqV1V3S3k1SEFLU0Y4WHp2TXhINnU4eTZIdVh5SG1jVjdQVlVmRVJFUkVaR1daUWt2WTljS3dEMHhDaTUrd09UajM0Smc1aDhSRVJFUkVSR0hCZ0gzQS9Qd2MxRDNYNEYxU1hmS1pCRVJFUkdSMkZvQnVJaldUV0xrYXZrY00vUHVVR0JwSFJJUkVSRVJhVXBQbitPckRTWnowKzZZeWFMV0N1aDRUZ00rd0V6WTlCN3dDaVlibDRpSWlJaUlBbzBVV0FJenUrZmFtSm5PQjJBR3NQZG04WlM4TXpHenBzNncvLzNGQmc4L0F1TXdNd1VYZ1UrQUx6QVp0MFJFUkVSRUt2Wi9Bd0RXYjhoM3BMYXRDd0FBQUFCSlJVNUVya0pnZ2c9PSI7CmxldCBlbmpveUxvZ29Qcm9taXNlVjE2OwpmdW5jdGlvbiBlbmpveUxvZ29WMTYoKXtyZXR1cm4gZW5qb3lMb2dvUHJvbWlzZVYxNj8/PW5ldyBQcm9taXNlKChvayxubyk9Pntjb25zdCBpbWFnZT1uZXcgSW1hZ2U7aW1hZ2Uub25sb2FkPSgpPT5vayhpbWFnZSk7aW1hZ2Uub25lcnJvcj0oKT0+bm8oRXJyb3IoJ05vIHNlIHB1ZG8gY2FyZ2FyIGVsIGxvZ28gZGUgRW5qb3kuJykpO2ltYWdlLnNyYz1FTkpPWV9MT0dPX1YxNn0pfQpjaGFydFBuZ1Y4PWFzeW5jIGZ1bmN0aW9uKHN2Zyx0aXRsZSxsZWdlbmQpewogY29uc3QgY2xvbmU9c3ZnLmNsb25lTm9kZSh0cnVlKSxib3g9c3ZnLnZpZXdCb3guYmFzZVZhbCx3aWR0aD1ib3gud2lkdGh8fDY4MCxoZWlnaHQ9Ym94LmhlaWdodHx8MzUwOwogY29uc3Qgc3R5bGU9Z2V0Q29tcHV0ZWRTdHlsZShzdmcpLGJnPXN0eWxlLmdldFByb3BlcnR5VmFsdWUoJy0tcGxvdGJnJykudHJpbSgpfHwnI2ZmZicsZmc9c3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1wbG90dGV4dCcpLnRyaW0oKXx8JyMyNzQ1NTknLGdyaWQ9c3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1wbG90Z3JpZCcpLnRyaW0oKXx8JyNkYmU1ZWQnOwogY2xvbmUuc2V0QXR0cmlidXRlKCd4bWxucycsJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyk7Y2xvbmUuc2V0QXR0cmlidXRlKCd3aWR0aCcsd2lkdGgpO2Nsb25lLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JyxoZWlnaHQpO2Nsb25lLnNldEF0dHJpYnV0ZSgnZm9udC1mYW1pbHknLCdBcmlhbCwgc2Fucy1zZXJpZicpO2Nsb25lLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTsKIGNvbnN0IHNlcmlhbGl6ZWQ9bmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhjbG9uZSkucmVwbGFjZSgvdmFyXCgtLXBsb3RiZ1wpL2csYmcpLnJlcGxhY2UoL3ZhclwoLS1wbG90dGV4dFwpL2csZmcpLnJlcGxhY2UoL3ZhclwoLS1wbG90Z3JpZFwpL2csZ3JpZCk7CiBjb25zdCB1cmw9VVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbc2VyaWFsaXplZF0se3R5cGU6J2ltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCd9KSk7CiB0cnl7CiAgY29uc3QgW2ltYWdlLGxvZ29dPWF3YWl0IFByb21pc2UuYWxsKFtuZXcgUHJvbWlzZSgob2ssbm8pPT57Y29uc3QgaW1hZ2U9bmV3IEltYWdlO2ltYWdlLm9ubG9hZD0oKT0+b2soaW1hZ2UpO2ltYWdlLm9uZXJyb3I9KCk9Pm5vKEVycm9yKCdObyBzZSBwdWRvIGNvbnZlcnRpciBlbCBncsOhZmljbyBhIGltYWdlbi4nKSk7aW1hZ2Uuc3JjPXVybH0pLGVuam95TG9nb1YxNigpXSk7CiAgY29uc3Qgc2NhbGU9TWF0aC5taW4oMiw4MDAwL3dpZHRoKSxjYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7Y2FudmFzLndpZHRoPU1hdGguY2VpbCh3aWR0aCpzY2FsZSk7Y2FudmFzLmhlaWdodD1NYXRoLmNlaWwoKGhlaWdodCsyMjApKnNjYWxlKTsKICBjb25zdCBjdHg9Y2FudmFzLmdldENvbnRleHQoJzJkJyk7Y3R4LnNjYWxlKHNjYWxlLHNjYWxlKTtjdHguZmlsbFN0eWxlPWJnO2N0eC5maWxsUmVjdCgwLDAsd2lkdGgsaGVpZ2h0KzIyMCk7Y3R4LmZpbGxTdHlsZT1mZzsKICBjdHguZm9udD0nYm9sZCAyOHB4IEFyaWFsJztjdHguZmlsbFRleHQodGl0bGUsMjQsNDAsd2lkdGgtNDgpO2N0eC5mb250PScxNnB4IEFyaWFsJztjdHguZmlsbFRleHQobGVnZW5kLnNsaWNlKDAsTWF0aC5mbG9vcih3aWR0aC85KSksMjQsNzAsd2lkdGgtNDgpO2N0eC5kcmF3SW1hZ2UoaW1hZ2UsMCwxMDAsd2lkdGgsaGVpZ2h0KTsKICBjb25zdCBsb2dvV2lkdGg9TWF0aC5taW4oMTUwLHdpZHRoKi4xOSksbG9nb0hlaWdodD1sb2dvV2lkdGgqMzI2Lzc5NCx4PXdpZHRoLWxvZ29XaWR0aC0yNCx5PWhlaWdodCsxMzI7CiAgY3R4LmZpbGxTdHlsZT0nI2ZmZmZmZic7Y3R4LmZpbGxSZWN0KHgtOSx5LTksbG9nb1dpZHRoKzE4LGxvZ29IZWlnaHQrMTgpO2N0eC5kcmF3SW1hZ2UobG9nbyx4LHksbG9nb1dpZHRoLGxvZ29IZWlnaHQpOwogIGN0eC5maWxsU3R5bGU9Zmc7Y3R4LmZvbnQ9JzEycHggQXJpYWwnO2N0eC5maWxsVGV4dCgnRW5qb3kgTG9zIMOBbmdlbGVzIMK3IEFuw6FsaXNpcyBkZSBtw6FxdWluYXMgZGUgYXphcicsMjQsaGVpZ2h0KzE2OCxNYXRoLm1heCgxMDAsd2lkdGgtbG9nb1dpZHRoLTg1KSk7CiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChvayxubyk9PmNhbnZhcy50b0Jsb2IoYmxvYj0+YmxvYj9vayhibG9iKTpubyhFcnJvcignTm8gc2UgcHVkbyBnZW5lcmFyIGVsIFBORy4nKSksJ2ltYWdlL3BuZycpKTsKIH1maW5hbGx5e1VSTC5yZXZva2VPYmplY3RVUkwodXJsKX0KfTsKZG9jdW1lbnQudGl0bGU9J0Vuam95IExvcyDDgW5nZWxlcyDCtyBBbsOhbGlzaXMgZGUgbcOhcXVpbmFzIGRlIGF6YXInOwoKbGV0IGRhc2hib2FyZFJlYWR5VjE3PWZhbHNlOwpsb2dpblNjcmVlblYxNT1mdW5jdGlvbihtZXNzYWdlPScnKXsKIGRhc2hib2FyZFJlYWR5VjE3PWZhbHNlO2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnbG9ja2VkVjE1Jyk7CiBjb25zdCBwYW5lbD0kKCcjbG9naW5WMTUnKTtwYW5lbC5oaWRkZW49ZmFsc2U7cGFuZWwuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCdmbGV4JywnaW1wb3J0YW50Jyk7CiAkKCcjbG9naW5NZXNzYWdlVjE1JykudGV4dENvbnRlbnQ9bWVzc2FnZTskKCcjcGFzc3dvcmRWMTUnKS52YWx1ZT0nJzsKfTsKcm9sZUludGVyZmFjZVYxNT1mdW5jdGlvbigpewogaWYoIWFwcFNlc3Npb25WMTV8fCFkYXNoYm9hcmRSZWFkeVYxNylyZXR1cm47CiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ3ZpZXdlclYxNScsYXBwU2Vzc2lvblYxNS5yb2xlIT09J2FkbWluJyk7CiAkKCcjc2Vzc2lvbk5hbWVWMTUnKS50ZXh0Q29udGVudD1hcHBTZXNzaW9uVjE1LnVzZXJuYW1lKycgwrcgJysoYXBwU2Vzc2lvblYxNS5yb2xlPT09J2FkbWluJz8nQWRtaW5pc3RyYWNpw7NuJzonQ29uc3VsdGEnKTsKIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbG9ja2VkVjE1Jyk7CiBjb25zdCBtYWluPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21haW4nKSxhc2lkZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdhc2lkZScpO2lmKG1haW4pe21haW4uaGlkZGVuPWZhbHNlO21haW4uc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2Rpc3BsYXknKX1pZihhc2lkZSl7YXNpZGUuaGlkZGVuPWZhbHNlO2FzaWRlLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdkaXNwbGF5Jyl9CiBjb25zdCBwYW5lbD0kKCcjbG9naW5WMTUnKTtwYW5lbC5oaWRkZW49dHJ1ZTtwYW5lbC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsJ25vbmUnLCdpbXBvcnRhbnQnKTsKfTsKb3BlblNlc3Npb25WMTU9YXN5bmMgZnVuY3Rpb24oc2Vzc2lvbil7CiBhcHBTZXNzaW9uVjE1PXNlc3Npb247ZGFzaGJvYXJkUmVhZHlWMTc9ZmFsc2U7CiB0cnl7c2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnTEFfQVVUSF9TRVNTSU9OJyxKU09OLnN0cmluZ2lmeShzZXNzaW9uKSl9Y2F0Y2goZSl7fQogJCgnI2xvZ2luVjE1JykuaGlkZGVuPWZhbHNlOyQoJyNsb2dpblYxNScpLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywnZmxleCcsJ2ltcG9ydGFudCcpO2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnbG9ja2VkVjE1Jyk7CiAkKCcjbG9naW5NZXNzYWdlVjE1JykudGV4dENvbnRlbnQ9J0FjY2VzbyB2YWxpZGFkby4gUmVjdXBlcmFuZG8gbGEgbWF0cml6IHByaXZhZGHigKYnOwogdHJ5ewogIGNvbnN0IGluY29taW5nPWF3YWl0IGNhY2hlZCgpO2lmKGFwcFNlc3Npb25WMTU/LnRva2VuIT09c2Vzc2lvbi50b2tlbilyZXR1cm47CiAgZGF0YT1pbmNvbWluZztzYXZlZFZpZXdzPVtdO2xvYWRWaWV3cygpOyQoJyNsb2dpbk1lc3NhZ2VWMTUnKS50ZXh0Q29udGVudD0nTWF0cml6IHJlY2liaWRhLiBQcmVwYXJhbmRvIGluZm9ybWVz4oCmJzsKICBhd2FpdCBuZXcgUHJvbWlzZShvaz0+c2V0VGltZW91dChvaywyMCkpO2lmKGFwcFNlc3Npb25WMTU/LnRva2VuIT09c2Vzc2lvbi50b2tlbilyZXR1cm47CiAgaW5pdCgpO2lmKCEkKCcjY29udGVudCcpLmlubmVySFRNTC50cmltKCkpdGhyb3cgRXJyb3IoJ05vIHNlIGdlbmVyw7MgZWwgY29udGVuaWRvIGRlbCBpbmZvcm1lLicpOwogIGRhc2hib2FyZFJlYWR5VjE3PXRydWU7c3RhcnRlZFNlc3Npb25WMTU9dHJ1ZTtyb2xlSW50ZXJmYWNlVjE1KCk7CiAgcnBjKCdnZXRWaWV3cycpLnRoZW4odmFsdWU9PntpZihhcHBTZXNzaW9uVjE1Py50b2tlbiE9PXNlc3Npb24udG9rZW4pcmV0dXJuO2NvbnN0IHZpZXdzPUpTT04ucGFyc2UodmFsdWUpO2lmKEFycmF5LmlzQXJyYXkodmlld3MpKXtzYXZlZFZpZXdzPXZpZXdzO2xvYWRWaWV3cygpfX0pLmNhdGNoKGVycm9yPT57aWYoYXBwU2Vzc2lvblYxNT8udG9rZW49PT1zZXNzaW9uLnRva2VuKSQoJyNzdGF0dXMnKS50ZXh0Q29udGVudCs9JyDCtyBObyBzZSBjYXJnYXJvbiBsYXMgdmlzdGFzIGd1YXJkYWRhcy4nfSk7CiB9Y2F0Y2goZXJyb3IpewogIGRhc2hib2FyZFJlYWR5VjE3PWZhbHNlO2RhdGE9bnVsbDskKCcjY29udGVudCcpLmlubmVySFRNTD0nJzt0cnl7c2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgnTEFfQVVUSF9TRVNTSU9OJyl9Y2F0Y2goZSl7fQogIGFwcFNlc3Npb25WMTU9bnVsbDtsb2dpblNjcmVlblYxNSgnTm8gc2UgcHVkbyBhYnJpciBlbCBkYXNoYm9hcmQ6ICcrKGVycm9yLm1lc3NhZ2V8fFN0cmluZyhlcnJvcikpKycuIFB1ZWRlcyB2b2x2ZXIgYSBpbmdyZXNhci4nKTt0aHJvdyBlcnJvcjsKIH0KfTsKCmZ1bmN0aW9uIHNob3dMb2dpblYxOChtZXNzYWdlPScnKXsKIGRhc2hib2FyZFJlYWR5VjE3PWZhbHNlOwogY29uc3Qgcm9vdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGJvYXJkUm9vdFYxOCcpLGxvZ2luPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dpblYxNScpOwogaWYocm9vdCl7cm9vdC5oaWRkZW49dHJ1ZTtyb290LnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5Jywnbm9uZScsJ2ltcG9ydGFudCcpfQogaWYobG9naW4pe2xvZ2luLmhpZGRlbj1mYWxzZTtsb2dpbi5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsJ2ZsZXgnLCdpbXBvcnRhbnQnKX0KIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnbG9ja2VkVjE1Jyk7CiAkKCcjbG9naW5NZXNzYWdlVjE1JykudGV4dENvbnRlbnQ9bWVzc2FnZTskKCcjcGFzc3dvcmRWMTUnKS52YWx1ZT0nJzsKfQpsb2dpblNjcmVlblYxNT1zaG93TG9naW5WMTg7CnJvbGVJbnRlcmZhY2VWMTU9ZnVuY3Rpb24oKXsKIGlmKCFhcHBTZXNzaW9uVjE1fHwhZGFzaGJvYXJkUmVhZHlWMTcpcmV0dXJuOwogZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCd2aWV3ZXJWMTUnLGFwcFNlc3Npb25WMTUucm9sZSE9PSdhZG1pbicpO2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbG9ja2VkVjE1Jyk7CiAkKCcjc2Vzc2lvbk5hbWVWMTUnKS50ZXh0Q29udGVudD1hcHBTZXNzaW9uVjE1LnVzZXJuYW1lKycgwrcgJysoYXBwU2Vzc2lvblYxNS5yb2xlPT09J2FkbWluJz8nQWRtaW5pc3RyYWNpw7NuJzonQ29uc3VsdGEnKTsKIGNvbnN0IHJvb3Q9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hib2FyZFJvb3RWMTgnKTtyb290LmhpZGRlbj1mYWxzZTtyb290LnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywnYmxvY2snLCdpbXBvcnRhbnQnKTsKIGZvcihjb25zdCBzZWxlY3RvciBvZiBbJ21haW4nLCdhc2lkZSddKXtjb25zdCBlbGVtZW50PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO2lmKGVsZW1lbnQpe2VsZW1lbnQuaGlkZGVuPWZhbHNlO2VsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCdibG9jaycsJ2ltcG9ydGFudCcpfX0KICQoJyNsb2dpblYxNScpLmhpZGRlbj10cnVlOyQoJyNsb2dpblYxNScpLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5Jywnbm9uZScsJ2ltcG9ydGFudCcpOwp9Owpjb25zdCBzdWJtaXRCZWZvcmVWMTg9JCgnI2xvZ2luRm9ybVYxNScpLm9uc3VibWl0OwpsZXQgc3VibWl0dGluZ1YxOD1mYWxzZTsKYXN5bmMgZnVuY3Rpb24gc3VibWl0TG9naW5WMTgoZXZlbnQpewogaWYoZXZlbnQpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uPy4oKX0KIGlmKHN1Ym1pdHRpbmdWMTgpcmV0dXJuO2NvbnN0IGZvcm09JCgnI2xvZ2luRm9ybVYxNScpO2lmKGZvcm0ucmVwb3J0VmFsaWRpdHkmJiFmb3JtLnJlcG9ydFZhbGlkaXR5KCkpcmV0dXJuOwogc3VibWl0dGluZ1YxOD10cnVlO3RyeXthd2FpdCBzdWJtaXRCZWZvcmVWMTgoe3ByZXZlbnREZWZhdWx0KCl7fX0pfWNhdGNoKGVycm9yKXtzaG93TG9naW5WMTgoJ05vIHNlIHB1ZG8gaW5ncmVzYXI6ICcrKGVycm9yLm1lc3NhZ2V8fGVycm9yKSl9ZmluYWxseXtzdWJtaXR0aW5nVjE4PWZhbHNlfQp9Ci8vIEEgbm9uLXN1Ym1pdCBidXR0b24gY2Fubm90IG5hdmlnYXRlL3JlbG9hZCB0aGUgQXBwcyBTY3JpcHQgaWZyYW1lLgokKCcjbG9naW5CdXR0b25WMTUnKS50eXBlPSdidXR0b24nOyQoJyNsb2dpbkJ1dHRvblYxNScpLm9uY2xpY2s9c3VibWl0TG9naW5WMTg7CiQoJyNsb2dpbkZvcm1WMTUnKS5vbnN1Ym1pdD1ldmVudD0+e2V2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uPy4oKTtzdWJtaXRMb2dpblYxOChldmVudCk7cmV0dXJuIGZhbHNlfTsKJCgnI2xvZ2luRm9ybVYxNScpLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGV2ZW50PT57aWYoZXZlbnQua2V5PT09J0VudGVyJyl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtzdWJtaXRMb2dpblYxOChldmVudCl9fSk7CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsZXZlbnQ9PntpZighZGFzaGJvYXJkUmVhZHlWMTcpc2hvd0xvZ2luVjE4KCdFcnJvciBkZSBsYSBww6FnaW5hOiAnK2V2ZW50Lm1lc3NhZ2UpfSk7CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd1bmhhbmRsZWRyZWplY3Rpb24nLGV2ZW50PT57aWYoIWRhc2hib2FyZFJlYWR5VjE3KXNob3dMb2dpblYxOCgnTm8gc2UgY29tcGxldMOzIGVsIGluZ3Jlc286ICcrKGV2ZW50LnJlYXNvbj8ubWVzc2FnZXx8U3RyaW5nKGV2ZW50LnJlYXNvbikpKX0pOwovLyBSZWNvdmVyIGEgdmlzaWJseSBlbXB0eSBzaGVsbCB3aXRob3V0IHJlcXVlc3Rpbmcgb3IgZXhwb3NpbmcgYW55IGRhdGEuCnNldFRpbWVvdXQoKCk9PntpZighZGFzaGJvYXJkUmVhZHlWMTcpe2NvbnN0IHBhbmVsPSQoJyNsb2dpblYxNScpO3BhbmVsLmhpZGRlbj1mYWxzZTtwYW5lbC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsJ2ZsZXgnLCdpbXBvcnRhbnQnKTtpZighJCgnI2xvZ2luTWVzc2FnZVYxNScpLnRleHRDb250ZW50KSQoJyNsb2dpbk1lc3NhZ2VWMTUnKS50ZXh0Q29udGVudD0nSW5ncmVzYSBjb24gdHUgdXN1YXJpbyB5IGNvbnRyYXNlw7FhLid9fSwyNTAwKTsKCgpmdW5jdGlvbiBjb21wYXJpc29uQ29tYmluZWRWMjIoZW50cmllcyl7CiBjb25zdCBrZXlzPVsnY29pbicsJ3dpbiddLHZhbHVlcz1lbnRyaWVzLmZsYXRNYXAoZT0+a2V5cy5tYXAoaz0+TnVtYmVyKGUudG90YWxba10pfHwwKSk7CiBjb25zdCBsbz1NYXRoLm1pbigwLC4uLnZhbHVlcyksaGk9TWF0aC5tYXgoMCwuLi52YWx1ZXMpLHNwYW49aGktbG98fDEseT12PT4yMTUtKHYtbG8pL3NwYW4qMTY1LHplcm89eSgwKTsKIGNvbnN0IGNvbG9yPXtjb2luOicjMTczNjUyJyx3aW46JyMxMzhmOTMnfTsKIHJldHVybiBgPGRpdiBjbGFzcz0iY2hhcnRzY3JvbGwiPjxzdmcgdmlld0JveD0iMCAwIDc2MCAzMjAiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iQ29pbiBJbiB5IFdpbjogY29tcGFyYWNpw7NuIEEgeSBCLCBlc2NhbGEgY29tw7puIGVuIENMUCIgc3R5bGU9ImhlaWdodDozMjBweCI+PHRleHQgeD0iMjUiIHk9IjIwIiBmb250LXNpemU9IjEyIiBmaWxsPSJ2YXIoLS1wbG90dGV4dCwjNDI1YzcwKSIgZm9udC1mYW1pbHk9IkFyaWFsIj5DTFAgwrcgRXNjYWxhIGNvbcO6bjwvdGV4dD48bGluZSB4MT0iMzUiIHkxPSIke3plcm99IiB4Mj0iNzI1IiB5Mj0iJHt6ZXJvfSIgc3Ryb2tlPSIjYTZiYmM4Ii8+JHtlbnRyaWVzLm1hcCgoZSxpKT0+e2NvbnN0IGNlbnRlcj0yMTAraSozNDA7cmV0dXJuIGtleXMubWFwKChrZXksaik9Pntjb25zdCB4PWNlbnRlcisoaj82MjotNjIpLHY9TnVtYmVyKGUudG90YWxba2V5XSl8fDA7cmV0dXJuIGA8cmVjdCB4PSIke3gtMzh9IiB5PSIke01hdGgubWluKHkodiksemVybyl9IiB3aWR0aD0iNzYiIGhlaWdodD0iJHtNYXRoLmFicyh5KHYpLXplcm8pfSIgZmlsbD0iJHtjb2xvcltrZXldfSIgcng9IjMiPjx0aXRsZT4ke2VzYyhlLnNjb3BlKycgwrcgJytlLm5hbWUrJyDCtyAnK2UucGVyaW9kKycgwrcgJyttZXRyaWNzW2tleV0rJzogJytmbXQodixrZXkpKX08L3RpdGxlPjwvcmVjdD48dGV4dCB4PSIke3h9IiB5PSIke3Y+PTA/eSh2KS05OnkodikrMTl9IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE1IiBmb250LWZhbWlseT0iQXJpYWwiIGZpbGw9InZhcigtLXBsb3R0ZXh0LCM0MjVjNzApIj4ke2VzYyhjb21wYWN0KHYsa2V5KSl9PC90ZXh0Pjx0ZXh0IHg9IiR7eH0iIHk9IjI1MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZm9udC1mYW1pbHk9IkFyaWFsIiBmaWxsPSJ2YXIoLS1wbG90dGV4dCwjNDI1YzcwKSI+JHtlc2MobWV0cmljc1trZXldKX08L3RleHQ+YH0pLmpvaW4oJycpK2A8dGV4dCB4PSIke2NlbnRlcn0iIHk9IjI4MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC1mYW1pbHk9IkFyaWFsIiBmaWxsPSJ2YXIoLS1wbG90dGV4dCwjNDI1YzcwKSI+U2VsZWNjacOzbiAke2Uuc2NvcGV9PC90ZXh0PmB9KS5qb2luKCcnKX08L3N2Zz48L2Rpdj5gOwp9CmNvbnN0IGNvbXBhcmVCZWZvcmVWMjI9Y29tcGFyZVZpZXc7CmNvbXBhcmVWaWV3PWZ1bmN0aW9uKCl7CiBjb21wYXJlQmVmb3JlVjIyKCk7CiBjb25zdCBlbnRyaWVzPVsnQScsJ0InXS5tYXAoc2NvcGU9Pntjb25zdCBzPXZpZXdTdGF0ZVtzY29wZV0scm93cz1zbGljZVJvd3Mocy5maWx0ZXJzLHMuZnJvbSxzLnRvKTtyZXR1cm57c2NvcGUsbmFtZTpzLm5hbWUscGVyaW9kOnNlbGVjdGVkRGF0ZVRleHRWOChzY29wZSksdG90YWw6YWdnKHJvd3MpLGNvdW50OnJvd3MubGVuZ3RofX0pOwogY29uc3QgaHRtbD1gPGRpdiBjbGFzcz0iY2FyZCIgaWQ9ImNvbXBhcmlzb25DaGFydHNWMjIiPjxoMj5Db2luIEluIHkgV2luIMK3IENvbXBhcmFjacOzbiBBIHkgQjwvaDI+PGRpdiBjbGFzcz0ibGFiZWxlZGxlZ2VuZCI+PHA+QXp1bCBtYXJpbm86IENvaW4gSW4gwrcgVHVycXVlc2E6IFdpbjwvcD4ke2VudHJpZXMubWFwKGU9PmA8cD48Yj4ke2Uuc2NvcGV9OiAke2VzYyhlLm5hbWUpfTwvYj4gwrcgJHtlc2MoZS5wZXJpb2QpfSR7ZS5jb3VudD8nJzonIMK3IFNpbiByZWdpc3Ryb3MnfTwvcD5gKS5qb2luKCcnKX08L2Rpdj4ke2NvbXBhcmlzb25Db21iaW5lZFYyMihlbnRyaWVzKX08cCBjbGFzcz0ic2lnbmFsbm90ZSI+VG90YWxlcyBlbiBDTFAgZW4gdW5hIG1pc21hIGVzY2FsYS4gUGFyYSBwZXLDrW9kb3MgZGUgZGlzdGludGEgZHVyYWNpw7NuLCByZXZpc2EgdGFtYmnDqW4gbG9zIGluZGljYWRvcmVzIGRpYXJpb3MgZGUgbGEgdGFibGEuPC9wPjwvZGl2PmA7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY29udGVudCAuY29tcGFyaXNvbk5vdGUnKS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyZW5kJyxodG1sKTsKfTsKCmNhY2hlZD1hc3luYyBmdW5jdGlvbigpewogJCgnI3N0YXR1cycpLnRleHRDb250ZW50PSdSZWN1cGVyYW5kbyBsYSBtYXRyaXogcHJpdmFkYeKApic7CiBjb25zdCByZXNwb25zZT1hd2FpdCBycGMoJ2dldE1hdHJpeCcpOwogY29uc3QgcmVzdWx0PWNsZWFuTWF0cml4VjcodHlwZW9mIHJlc3BvbnNlPT09J3N0cmluZyc/SlNPTi5wYXJzZShyZXNwb25zZSk6cmVzcG9uc2UpOwogaWYoIXJlc3VsdC5yb3dzPy5sZW5ndGgpdGhyb3cgRXJyb3IoJ0xhIG1hdHJpeiBubyBjb250aWVuZSByZWdpc3Ryb3MgYXBsaWNhYmxlcy4nKTtyZXR1cm4gcmVzdWx0Owp9OwovLyBGaXJzdCBpbXBvcnQgdXNlcyB0aGUgc2FtZSBhdXRoZW50aWNhdGVkIFJQQyBhbmQgUkxTIGFzIGxhdGVyIGFkbWluIHVwZGF0ZXMuCiQoJyNsb2dpbkZvcm1WMTUnKS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsJzxkZXRhaWxzIHN0eWxlPSJtYXJnaW4tdG9wOjE4cHgiPjxzdW1tYXJ5PkFkbWluaXN0cmFjacOzbjogaW1wb3J0YXIgaGlzdMOzcmljbyBpbmljaWFsPC9zdW1tYXJ5PjxwPkVzY3JpYmUgdXN1YXJpbyB5IGNvbnRyYXNlw7FhIGRlIGFkbWluaXN0cmFjacOzbiBhcnJpYmEsIHNlbGVjY2lvbmEgZWwgRXhjZWwgaGlzdMOzcmljbyBjb21wbGV0byB5IHB1bHNhIGVzdGUgYm90w7NuLiBWZXLDoXMgZWwgYXZhbmNlIHBvciBibG9xdWVzLjwvcD48aW5wdXQgaWQ9InNlZWRNYXRyaXhMQSIgdHlwZT0iZmlsZSIgYWNjZXB0PSIueGxzeCwuanNvbiI+PGJ1dHRvbiBpZD0ic2VlZEltcG9ydExBIiB0eXBlPSJidXR0b24iPkltcG9ydGFyIGhpc3TDs3JpY28gaW5pY2lhbDwvYnV0dG9uPjwvZGV0YWlscz4nKTsKJCgnI3NlZWRJbXBvcnRMQScpLm9uY2xpY2s9YXN5bmMgZnVuY3Rpb24oKXsKIGNvbnN0IG1lc3NhZ2U9JCgnI2xvZ2luTWVzc2FnZVYxNScpLGZpbGU9JCgnI3NlZWRNYXRyaXhMQScpLmZpbGVzWzBdOwogaWYoIWZpbGUpe21lc3NhZ2UudGV4dENvbnRlbnQ9J1NlbGVjY2lvbmEgZWwgRXhjZWwgaGlzdMOzcmljbyBjb21wbGV0byBvIHN1IGNvcGlhIEpTT04uJztyZXR1cm59CiB0aGlzLmRpc2FibGVkPXRydWU7CiB0cnl7CiAgaWYoIWFwcFNlc3Npb25WMTUpewogICBtZXNzYWdlLnRleHRDb250ZW50PSdWYWxpZGFuZG8gYWRtaW5pc3RyYWNpw7Nu4oCmJzsKICAgY29uc3QgcGFzc3dvcmQ9JCgnI3Bhc3N3b3JkVjE1JykudmFsdWU7JCgnI3Bhc3N3b3JkVjE1JykudmFsdWU9Jyc7CiAgIGFwcFNlc3Npb25WMTU9YXdhaXQgZGlyZWN0UnBjVjE1KCdsb2dpbicsJCgnI3VzZXJuYW1lVjE1JykudmFsdWUscGFzc3dvcmQpOwogIH0KICBpZihhcHBTZXNzaW9uVjE1LnJvbGUhPT0nYWRtaW4nKXRocm93IEVycm9yKCdTb2xvIGFkbWluaXN0cmFjacOzbiBwdWVkZSBpbXBvcnRhciBlbCBoaXN0w7NyaWNvLicpOwogIG1lc3NhZ2UudGV4dENvbnRlbnQ9J1ZhbGlkYW5kbyBoaXN0w7NyaWNvIGluaWNpYWzigKYnOwogIGNvbnN0IGV4aXN0aW5nPWF3YWl0IHN1cGFiYXNlUmVxdWVzdExBKCcvcmVzdC92MS9sYV9tYXRyaXg/aWQ9ZXEuMSZzZWxlY3Q9cmV2aXNpb24nLHt9LGFwcFNlc3Npb25WMTUudG9rZW4pOwogIGlmKGV4aXN0aW5nLmxlbmd0aCl0aHJvdyBFcnJvcignWWEgaGF5IHVuYSBtYXRyaXouIEFjdHVhbMOtemFsYSBkZXNkZSBlbCBkYXNoYm9hcmQ7IGVsIGltcG9ydGFkb3IgaW5pY2lhbCBubyByZWVtcGxhemEgZGF0b3MgZXhpc3RlbnRlcy4nKTsKICBjb25zdCBpbmNvbWluZz1jbGVhbk1hdHJpeFY3KGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcuanNvbicpP0pTT04ucGFyc2UoYXdhaXQgZmlsZS50ZXh0KCkpOmF3YWl0IHJlYWRYbHN4KGZpbGUpKTsKICBhd2FpdCBycGMoJ2ltcG9ydE1hdHJpeCcsSlNPTi5zdHJpbmdpZnkoaW5jb21pbmcpLCdyZXBsYWNlJyxudWxsKTsKICBtZXNzYWdlLnRleHRDb250ZW50PSdIaXN0w7NyaWNvIGd1YXJkYWRvLiBBYnJpZW5kbyBkYXNoYm9hcmTigKYnO2F3YWl0IG9wZW5TZXNzaW9uVjE1KGFwcFNlc3Npb25WMTUpOwogfWNhdGNoKGVycm9yKXttZXNzYWdlLnRleHRDb250ZW50PWVycm9yLm1lc3NhZ2V9ZmluYWxseXt0aGlzLmRpc2FibGVkPWZhbHNlfQp9OwoKLy8gUHJlbWlvcyBpcyBjYW5vbmljYWwgY29sdW1uIFAgKGluZGV4IDE1KS4gSXQgaXMgc2VwYXJhdGUgZnJvbSBDb2luIE91dCBhbmQgVGlja2V0IE91dC4KZnVuY3Rpb24gcHJpemVXZWVrS2V5TEEocm93KXtyZXR1cm4gcm93WzBdLnNsaWNlKDAsNCkrJyDCtyBTJytTdHJpbmcod2Vla051bWJlclY4KHJvd1swXSkpLnBhZFN0YXJ0KDIsJzAnKTt9CmZ1bmN0aW9uIHByaXplU3VtbWFyeUxBKHJvd3MpewogY29uc3QgbWFjaGluZXM9bmV3IE1hcCgpLHdlZWtzPW5ldyBNYXAoKSxkYXRlcz1uZXcgU2V0KCk7bGV0IHBhaWQ9MCxhZGp1c3RtZW50cz0wLHJlY29yZHM9MDsKIGZvcihjb25zdCByIG9mIHJvd3MpewogIGlmKGV4Y2x1ZGVkUmVjb3JkVjcocikpY29udGludWU7CiAgY29uc3QgYW1vdW50PXR5cGVvZiByWzE1XT09PSdudW1iZXInJiZOdW1iZXIuaXNGaW5pdGUoclsxNV0pP3JbMTVdOjA7CiAgY29uc3Qga2V5PXByaXplV2Vla0tleUxBKHIpO2lmKCF3ZWVrcy5oYXMoa2V5KSl3ZWVrcy5zZXQoa2V5LHtuYW1lOmtleSxwcml6ZTowLHBhaWQ6MCxhZGp1c3RtZW50czowLHJvd3M6W119KTsKICBjb25zdCB3PXdlZWtzLmdldChrZXkpO3cucHJpemUrPWFtb3VudDt3LnBhaWQrPU1hdGgubWF4KDAsYW1vdW50KTt3LmFkanVzdG1lbnRzKz1NYXRoLm1pbigwLGFtb3VudCk7dy5yb3dzLnB1c2gocik7ZGF0ZXMuYWRkKHJbMF0pOwogIHBhaWQrPU1hdGgubWF4KDAsYW1vdW50KTthZGp1c3RtZW50cys9TWF0aC5taW4oMCxhbW91bnQpO2lmKGFtb3VudD4wKXJlY29yZHMrKzsKICBpZighYW1vdW50KWNvbnRpbnVlOwogIGNvbnN0IGlkPVN0cmluZyhyWzFdPz8nJykudHJpbSgpLG1hY2hpbmVLZXk9aWR8fCdfX21pc3NpbmdfaWRfXyc7CiAgaWYoIW1hY2hpbmVzLmhhcyhtYWNoaW5lS2V5KSltYWNoaW5lcy5zZXQobWFjaGluZUtleSx7aWQ6aWR8fCdTaW4gaWRlbnRpZmljYWNpw7NuJyxpZGVudGlmaWVkOiEhaWQscGFpZDowLGFkanVzdG1lbnRzOjAsbmV0OjAscmVjb3JkczowLGRheXM6bmV3IFNldCgpLGxvY2F0aW9uczpPYmplY3QuZnJvbUVudHJpZXMoWzIsMyw0LDUsNyw4LDldLm1hcChrPT5bayxuZXcgU2V0KCldKSl9KTsKICBjb25zdCBtPW1hY2hpbmVzLmdldChtYWNoaW5lS2V5KTttLnBhaWQrPU1hdGgubWF4KDAsYW1vdW50KTttLmFkanVzdG1lbnRzKz1NYXRoLm1pbigwLGFtb3VudCk7bS5uZXQrPWFtb3VudDsKICBpZihhbW91bnQ+MCl7bS5yZWNvcmRzKys7bS5kYXlzLmFkZChyWzBdKTt9CiAgZm9yKGNvbnN0IGsgb2YgWzIsMyw0LDUsNyw4LDldKXtjb25zdCB2YWx1ZT1TdHJpbmcocltrXT8/JycpLnRyaW0oKTtpZih2YWx1ZSltLmxvY2F0aW9uc1trXS5hZGQodmFsdWUpO30KIH0KIGNvbnN0IGxpc3Q9Wy4uLm1hY2hpbmVzLnZhbHVlcygpXS5zb3J0KChhLGIpPT5iLnBhaWQtYS5wYWlkfHxhLmlkLmxvY2FsZUNvbXBhcmUoYi5pZCx1bmRlZmluZWQse251bWVyaWM6dHJ1ZX0pKTsKIHJldHVybiB7cGFpZCxhZGp1c3RtZW50cyxuZXQ6cGFpZCthZGp1c3RtZW50cyxyZWNvcmRzLGRhdGVzOlsuLi5kYXRlc10uc29ydCgpLG1hY2hpbmVzOmxpc3QsbWFjaGluZUNvdW50Omxpc3QuZmlsdGVyKG09Pm0uaWRlbnRpZmllZCYmbS5wYWlkPjApLmxlbmd0aCx3ZWVrczpbLi4ud2Vla3MudmFsdWVzKCldLnNvcnQoKGEsYik9PmEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpfTsKfQpmdW5jdGlvbiBwcml6ZVN0YXRlTEEoKXsKIGlmKCF2aWV3U3RhdGUucHJpemVzKXtjb25zdCBrZXlzPVsuLi5uZXcgU2V0KGRhdGEucm93cy5maWx0ZXIocj0+IWV4Y2x1ZGVkUmVjb3JkVjcocikpLm1hcChwcml6ZVdlZWtLZXlMQSkpXS5zb3J0KCk7dmlld1N0YXRlLnByaXplcz17d2Vla3M6a2V5cy5sZW5ndGg/W2tleXMuYXQoLTEpXTpbXSxtb250aDonJyxmaWx0ZXJzOnt9LHNlYXJjaDonJyxvbmx5UGFpZDp0cnVlfTt9CiByZXR1cm4gdmlld1N0YXRlLnByaXplczsKfQpmdW5jdGlvbiBwcml6ZVdlZWtMYWJlbExBKGtleSxyb3dzKXtjb25zdFt5LHddPWtleS5zcGxpdCgnIMK3IFMnKTtyZXR1cm4gd2Vla0xhYmVsVjgoeSx3LHJvd3MpO30KZnVuY3Rpb24gcHJpemVQZXJpb2RUZXh0TEEoKXtjb25zdCBzdGF0ZT1wcml6ZVN0YXRlTEEoKTtyZXR1cm4gc3RhdGUud2Vla3MubGVuZ3RoP3N0YXRlLndlZWtzLm1hcChrPT5wcml6ZVdlZWtMYWJlbExBKGssZGF0YS5yb3dzKSkuam9pbignLCAnKTonU2luIHNlbWFuYXMgc2VsZWNjaW9uYWRhcyc7fQpmdW5jdGlvbiBwcml6ZVJhbmtpbmdMQShsaXN0KXsKIGNvbnN0IGVudHJpZXM9bGlzdC5maWx0ZXIobT0+bS5wYWlkPjApLnNsaWNlKDAsMTApO2lmKCFlbnRyaWVzLmxlbmd0aClyZXR1cm4gJzxwPlNpbiBwcmVtaW9zIHBvc2l0aXZvcyBlbiBlc3RhIHNlbGVjY2nDs24uPC9wPic7CiBjb25zdCBtYXg9TWF0aC5tYXgoLi4uZW50cmllcy5tYXAobT0+bS5wYWlkKSksaGVpZ2h0PTY1K2VudHJpZXMubGVuZ3RoKjM5OwogcmV0dXJuIGA8ZGl2IGNsYXNzPSJjaGFydHNjcm9sbCI+PHN2ZyB2aWV3Qm94PSIwIDAgNzQwICR7aGVpZ2h0fSIgc3R5bGU9ImhlaWdodDoke2hlaWdodH1weCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJNw6FxdWluYXMgY29uIG1heW9yZXMgcHJlbWlvcyBwYWdhZG9zIj48dGV4dCB4PSIyMCIgeT0iMjQiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9InZhcigtLXBsb3R0ZXh0KSI+UHJlbWlvcyBwb3NpdGl2b3MgwrcgQ0xQIMK3IFRvcCAxMDwvdGV4dD4ke2VudHJpZXMubWFwKChtLGkpPT57Y29uc3QgeT01MitpKjM5O3JldHVybiBgPHRleHQgeD0iMjAiIHk9IiR7eSsxNX0iIGZvbnQtc2l6ZT0iMTIiIGZpbGw9InZhcigtLXBsb3R0ZXh0KSI+JHtlc2MobS5pZCl9PC90ZXh0PjxyZWN0IHg9IjE4MCIgeT0iJHt5fSIgd2lkdGg9IiR7bS5wYWlkL21heCozNTB9IiBoZWlnaHQ9IjIzIiByeD0iMyIgZmlsbD0iIzEzOGY5MyI+PHRpdGxlPk3DoXF1aW5hICR7ZXNjKG0uaWQpfTogJHtlc2MoZm10KG0ucGFpZCwncHJpemUnKSl9IENMUDwvdGl0bGU+PC9yZWN0Pjx0ZXh0IHg9IjU1MCIgeT0iJHt5KzE2fSIgZm9udC1zaXplPSIxMiIgZmlsbD0idmFyKC0tcGxvdHRleHQpIj4ke2VzYyhjb21wYWN0KG0ucGFpZCwncHJpemUnKSl9PC90ZXh0PmB9KS5qb2luKCcnKX08L3N2Zz48L2Rpdj5gOwp9CmZ1bmN0aW9uIHByaXplTWFjaGluZVJvd3NMQShsaXN0KXsKIHJldHVybiBbWydNw6FxdWluYScsJ01hcmNhJywnUGxhdGFmb3JtYScsJ01vZGVsbycsJ0JhbmNvJywnU2VjdG9yJywnU2Fsw7NuJywnUG96bycsJ1ByZW1pb3MgcG9zaXRpdm9zIENMUCcsJ0FqdXN0ZXMgbmVnYXRpdm9zIENMUCcsJ1ByZW1pb3MgbmV0b3MgQ0xQJywnRMOtYXMgY29uIHByZW1pb3MnLCdSZWdpc3Ryb3MgY29uIHByZW1pb3MnXSwuLi5saXN0Lm1hcChtPT5bbS5pZCwuLi5bMiwzLDQsOSw1LDcsOF0ubWFwKGs9PlsuLi5tLmxvY2F0aW9uc1trXV0uam9pbignIC8gJykpLG0ucGFpZCxtLmFkanVzdG1lbnRzLG0ubmV0LG0uZGF5cy5zaXplLG0ucmVjb3Jkc10pXTsKfQpsZXQgY3VycmVudFByaXplUmVwb3J0TEE9bnVsbDsKZnVuY3Rpb24gcmVuZGVyUHJpemVzTEEoKXsKIGNvbnN0IHN0YXRlPXByaXplU3RhdGVMQSgpLGFsbD1kYXRhLnJvd3MuZmlsdGVyKHI9PiFleGNsdWRlZFJlY29yZFY3KHIpKSxtb250aHM9Wy4uLm5ldyBTZXQoYWxsLm1hcChyPT5yWzBdLnNsaWNlKDAsNykpKV0uc29ydCgpOwogY29uc3Qgd2Vla01hcD1uZXcgTWFwKCk7Zm9yKGNvbnN0IHIgb2YgYWxsKXtjb25zdCBrPXByaXplV2Vla0tleUxBKHIpO2lmKCF3ZWVrTWFwLmhhcyhrKSl3ZWVrTWFwLnNldChrLFtdKTt3ZWVrTWFwLmdldChrKS5wdXNoKHIpO30KIGNvbnN0IGNob2ljZXM9Wy4uLndlZWtNYXBdLmZpbHRlcigoW2sscm93c10pPT4hc3RhdGUubW9udGh8fHJvd3Muc29tZShyPT5yWzBdLnN0YXJ0c1dpdGgoc3RhdGUubW9udGgpKSkuc29ydCgoW2FdLFtiXSk9PmEubG9jYWxlQ29tcGFyZShiKSk7CiBjb25zdCB3ZWVrUm93cz1hbGwuZmlsdGVyKHI9PnN0YXRlLndlZWtzLmluY2x1ZGVzKHByaXplV2Vla0tleUxBKHIpKSk7CiBjb25zdCBmaWx0ZXJlZD13ZWVrUm93cy5maWx0ZXIocj0+T2JqZWN0LmVudHJpZXMoc3RhdGUuZmlsdGVycykuZXZlcnkoKFtrLHZhbHVlXSk9PiF2YWx1ZXx8U3RyaW5nKHJba10/PycnKT09PXZhbHVlKSk7CiBjb25zdCBzdW1tYXJ5PXByaXplU3VtbWFyeUxBKGZpbHRlcmVkKSxzZWFyY2g9c3RhdGUuc2VhcmNoLnRyaW0oKS50b0xvY2FsZUxvd2VyQ2FzZSgnZXMnKTsKIGNvbnN0IHZpc2libGU9c3VtbWFyeS5tYWNoaW5lcy5maWx0ZXIobT0+KCFzdGF0ZS5vbmx5UGFpZHx8bS5wYWlkPjApJiYoIXNlYXJjaHx8W20uaWQsLi4uT2JqZWN0LnZhbHVlcyhtLmxvY2F0aW9ucykuZmxhdE1hcChzPT5bLi4uc10pXS5qb2luKCcgJykudG9Mb2NhbGVMb3dlckNhc2UoJ2VzJykuaW5jbHVkZXMoc2VhcmNoKSkpOwogY3VycmVudFByaXplUmVwb3J0TEE9e3N1bW1hcnksdmlzaWJsZSxyb3dzOmZpbHRlcmVkfTtleHBvcnRSb3dzPXByaXplTWFjaGluZVJvd3NMQSh2aXNpYmxlKTsKIGRvY3VtZW50LmJvZHkuZGF0YXNldC52aWV3PSdQcmVtaW9zIHNlbWFuYWxlcyc7JCgnI3RpdGxlJykudGV4dENvbnRlbnQ9J1ByZW1pb3MgcGFnYWRvcyBwb3IgbcOhcXVpbmEnOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZpbHRlcnMnKS5zdHlsZS5kaXNwbGF5PSdub25lJzskKCcjY29udHJvbHMnKS5zdHlsZS5kaXNwbGF5PSdub25lJzskKCcjZmlsdGVycycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOwogY29uc3QgcGVyaW9kPXByaXplUGVyaW9kVGV4dExBKCkscmFuZ2U9c3VtbWFyeS5kYXRlcy5sZW5ndGg/ZGlzcGxheURhdGVzVjUoc3VtbWFyeS5kYXRlc1swXSkrJyDihpIgJytkaXNwbGF5RGF0ZXNWNShzdW1tYXJ5LmRhdGVzLmF0KC0xKSk6J1NpbiByZWdpc3Ryb3MnOwogY29uc3QgZmllbGRzPVsxLDksNSw3LDIsM107CiAkKCcjY29udGVudCcpLmlubmVySFRNTD1iYW5uZXIoJ1ByZW1pb3Mgc2VtYW5hbGVzIGRlbCBjYXNpbm8nLCdDb25zdWx0YSBsb3MgaW1wb3J0ZXMgZGUgbGEgY29sdW1uYSBQcmVtaW9zIHkgbGFzIG3DoXF1aW5hcyBxdWUgcmVnaXN0cmFyb24gcGFnb3MgZW4gdW5hIG8gdmFyaWFzIHNlbWFuYXMuJykrYDxzZWN0aW9uIGNsYXNzPSJjYXJkIj48ZGl2IGNsYXNzPSJmaWx0ZXJncmlkIj48bGFiZWw+TWVzIHBhcmEgYnVzY2FyIHNlbWFuYXM8c2VsZWN0IGlkPSJwcml6ZU1vbnRoTEEiPjxvcHRpb24gdmFsdWU9IiI+VG9kb3MgbG9zIG1lc2VzPC9vcHRpb24+JHttb250aHMubWFwKG09PmA8b3B0aW9uIHZhbHVlPSIke219IiAke209PT1zdGF0ZS5tb250aD8nc2VsZWN0ZWQnOicnfT4ke2VzYyhkaXNwbGF5RGF0ZXNWNShtKSl9PC9vcHRpb24+YCkuam9pbignJyl9PC9zZWxlY3Q+PC9sYWJlbD48ZGl2PjxsYWJlbD5TZW1hbmFzPC9sYWJlbD48ZGV0YWlscyBjbGFzcz0iZXhjZWxEcm9wZG93blYxMyI+PHN1bW1hcnk+JHtzdGF0ZS53ZWVrcy5sZW5ndGh9IHNlbWFuYShzKSBzZWxlY2Npb25hZGEocyk8L3N1bW1hcnk+PGRpdiBjbGFzcz0iZXhjZWxNZW51VjEzIiBzdHlsZT0ibWluLXdpZHRoOjMxMHB4Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjhweCI+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGlkPSJwcml6ZUFsbExBIj5TZWxlY2Npb25hciB0b2RhczwvYnV0dG9uPjxidXR0b24gdHlwZT0iYnV0dG9uIiBpZD0icHJpemVOb25lTEEiPkxpbXBpYXI8L2J1dHRvbj48L2Rpdj48ZGl2IHN0eWxlPSJtYXgtaGVpZ2h0OjI0MHB4O292ZXJmbG93OmF1dG8iPiR7Y2hvaWNlcy5tYXAoKFtrZXkscm93c10pPT57Y29uc3QgZGF0ZXM9Wy4uLm5ldyBTZXQocm93cy5tYXAocj0+clswXSkpXS5zb3J0KCk7cmV0dXJuIGA8bGFiZWwgY2xhc3M9ImNoZWNrSXRlbVYxMiIgc3R5bGU9ImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7YWxpZ24taXRlbXM6Y2VudGVyIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGRhdGEtcHJpemV3ZWVrPSIke2tleX0iICR7c3RhdGUud2Vla3MuaW5jbHVkZXMoa2V5KT8nY2hlY2tlZCc6Jyd9PiR7ZXNjKHByaXplV2Vla0xhYmVsTEEoa2V5LHJvd3MpKX0gwrcgJHtlc2MoZGlzcGxheURhdGVzVjUoZGF0ZXNbMF0pKX0gYSAke2VzYyhkaXNwbGF5RGF0ZXNWNShkYXRlcy5hdCgtMSkpKX08L2xhYmVsPmB9KS5qb2luKCcnKX08L2Rpdj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InByaW1hcnkiIGlkPSJwcml6ZUFwcGx5TEEiPkFwbGljYXIgc2VtYW5hczwvYnV0dG9uPjwvZGl2PjwvZGV0YWlscz48L2Rpdj4ke2ZpZWxkcy5tYXAoaz0+e2NvbnN0IG9wdHM9Wy4uLm5ldyBTZXQod2Vla1Jvd3MubWFwKHI9PlN0cmluZyhyW2tdPz8nJykpKV0uZmlsdGVyKEJvb2xlYW4pLnNvcnQoKGEsYik9PmEubG9jYWxlQ29tcGFyZShiLHVuZGVmaW5lZCx7bnVtZXJpYzp0cnVlfSkpO3JldHVybiBgPGxhYmVsPiR7ZGltc1trXX08c2VsZWN0IGRhdGEtcHJpemVmaWx0ZXI9IiR7a30iPjxvcHRpb24gdmFsdWU9IiI+VG9kb3M8L29wdGlvbj4ke29wdHMubWFwKHY9PmA8b3B0aW9uIHZhbHVlPSIke2VzYyh2KX0iICR7c3RhdGUuZmlsdGVyc1trXT09PXY/J3NlbGVjdGVkJzonJ30+JHtlc2Modil9PC9vcHRpb24+YCkuam9pbignJyl9PC9zZWxlY3Q+PC9sYWJlbD5gfSkuam9pbignJyl9PC9kaXY+PHA+UGVyw61vZG86ICR7ZXNjKHBlcmlvZCl9IMK3IEZlY2hhcyBjb24gZGF0b3M6ICR7ZXNjKHJhbmdlKX0gwrcgJHtzdW1tYXJ5LmRhdGVzLmxlbmd0aH0gZMOtYXMgcmVnaXN0cmFkb3MuPC9wPjxwIGNsYXNzPSJzaWduYWxub3RlIj5FbCBtZXMgYXl1ZGEgYSBidXNjYXIgc2VtYW5hcy4gQ2FkYSBzZW1hbmEgaW5jbHV5ZSB0b2RvcyBzdXMgZMOtYXMgZGlzcG9uaWJsZXMsIGluY2x1c28gc2kgY3J1emEgZGUgbWVzLiBMb3MgaW1wb3J0ZXMgY29ycmVzcG9uZGVuIGEgbG9zIGRhdG9zIGNhcmdhZG9zOyBsYSDDumx0aW1hIHNlbWFuYSBwdWVkZSBlc3RhciBpbmNvbXBsZXRhLjwvcD48YnV0dG9uIGlkPSJwcml6ZVJlc2V0TEEiPkxpbXBpYXIgZmlsdHJvcyBkZSBtw6FxdWluYXMgeSB1YmljYWNpb25lczwvYnV0dG9uPjwvc2VjdGlvbj48ZGl2IGNsYXNzPSJrcGlzIj4ke1tbJ1ByZW1pb3MgcGFnYWRvcyBwb3NpdGl2b3MnLGZtdChzdW1tYXJ5LnBhaWQsJ3ByaXplJykrJyBDTFAnLCdTdW1hIGRlIGltcG9ydGVzIG1heW9yZXMgcXVlIGNlcm8nXSxbJ03DoXF1aW5hcyBxdWUgcGFnYXJvbicsZm10KHN1bW1hcnkubWFjaGluZUNvdW50KSwnTcOhcXVpbmFzIGlkZW50aWZpY2FkYXMgY29uIHByZW1pb3MgcG9zaXRpdm9zJ10sWydBanVzdGVzIG5lZ2F0aXZvcycsZm10KHN1bW1hcnkuYWRqdXN0bWVudHMsJ3ByaXplJykrJyBDTFAnLCdSZWdpc3Ryb3MgbmVnYXRpdm9zIHNlcGFyYWRvcyBkZSBsb3MgcGFnb3MnXSxbJ1ByZW1pb3MgbmV0b3MnLGZtdChzdW1tYXJ5Lm5ldCwncHJpemUnKSsnIENMUCcsJ1ByZW1pb3MgcG9zaXRpdm9zIG3DoXMgYWp1c3RlcyBuZWdhdGl2b3MnXV0ubWFwKChbbGFiZWwsdmFsdWUsaGVscF0pPT5gPGRpdiBjbGFzcz0iY2FyZCBrcGkiPjxzbWFsbD4ke2xhYmVsfTwvc21hbGw+PHN0cm9uZyBzdHlsZT0iZm9udC1zaXplOjI0cHgiPiR7dmFsdWV9PC9zdHJvbmc+PHNwYW4+JHtoZWxwfTwvc3Bhbj48L2Rpdj5gKS5qb2luKCcnKX08L2Rpdj48ZGl2IGNsYXNzPSJyZXBvcnRjaGFydHMiPjxkaXYgY2xhc3M9ImNhcmQiPjxoMj5QcmVtaW9zIG5ldG9zIHBvciBzZW1hbmE8L2gyPiR7c3VtbWFyeS53ZWVrcy5sZW5ndGg/Y2hhcnRWMihbe25hbWU6J1ByZW1pb3MgbmV0b3MnLHBvaW50czpzdW1tYXJ5LndlZWtzfV0sJ3ByaXplJyk6JzxwPlNlbGVjY2lvbmEgYWwgbWVub3MgdW5hIHNlbWFuYS48L3A+J308L2Rpdj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+TcOhcXVpbmFzIGNvbiBtYXlvcmVzIHByZW1pb3M8L2gyPiR7cHJpemVSYW5raW5nTEEoc3VtbWFyeS5tYWNoaW5lcyl9PC9kaXY+PC9kaXY+PHNlY3Rpb24gY2xhc3M9ImNhcmQiPjxoMj5Nw6FxdWluYXMgeSBwcmVtaW9zIMK3ICR7dmlzaWJsZS5sZW5ndGh9IGZpbGFzPC9oMj48ZGl2IGNsYXNzPSJ2aWV3Y29udHJvbHMiPjxsYWJlbD5CdXNjYXIgbcOhcXVpbmEsIGJhbmNvIG8gbWFyY2E8aW5wdXQgaWQ9InByaXplU2VhcmNoTEEiIHZhbHVlPSIke2VzYyhzdGF0ZS5zZWFyY2gpfSIgcGxhY2Vob2xkZXI9IkJ1c2NhciB5IHB1bHNhciBFbnRlciI+PC9sYWJlbD48bGFiZWwgc3R5bGU9ImZsZXgtZGlyZWN0aW9uOnJvdzthbGlnbi1pdGVtczpjZW50ZXIiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InByaXplT25seUxBIiAke3N0YXRlLm9ubHlQYWlkPydjaGVja2VkJzonJ30+U29sbyBtw6FxdWluYXMgY29uIHBhZ29zIHBvc2l0aXZvczwvbGFiZWw+PC9kaXY+PHA+JHtzdW1tYXJ5LnJlY29yZHN9IHJlZ2lzdHJvcyBjb24gcHJlbWlvcyBwb3NpdGl2b3MuIFNvbiByZWdpc3Ryb3MgZGUgbGEgbWF0cml6LCBubyBjYW50aWRhZCBkZSBwcmVtaW9zIGluZGl2aWR1YWxlcy4gTGFzIHViaWNhY2lvbmVzIG3Dumx0aXBsZXMgc2UgbXVlc3RyYW4gc2VwYXJhZGFzIHBvciDCqy/Cuy48L3A+PGRpdiBjbGFzcz0idGFibGV3cmFwIj48dGFibGU+PHRoZWFkPjx0cj4ke2V4cG9ydFJvd3NbMF0ubWFwKGg9PmA8dGg+JHtlc2MoaCl9PC90aD5gKS5qb2luKCcnKX08L3RyPjwvdGhlYWQ+PHRib2R5PiR7dmlzaWJsZS5tYXAobT0+YDx0cj48dGQ+JHtlc2MobS5pZCl9PC90ZD4ke1syLDMsNCw5LDUsNyw4XS5tYXAoaz0+YDx0ZD4ke2VzYyhbLi4ubS5sb2NhdGlvbnNba11dLmpvaW4oJyAvICcpfHwn4oCUJyl9PC90ZD5gKS5qb2luKCcnKX08dGQ+JHtmbXQobS5wYWlkLCdwcml6ZScpfTwvdGQ+PHRkPiR7Zm10KG0uYWRqdXN0bWVudHMsJ3ByaXplJyl9PC90ZD48dGQ+JHtmbXQobS5uZXQsJ3ByaXplJyl9PC90ZD48dGQ+JHttLmRheXMuc2l6ZX08L3RkPjx0ZD4ke20ucmVjb3Jkc308L3RkPjwvdHI+YCkuam9pbignJyl8fCc8dHI+PHRkIGNvbHNwYW49IjEzIj5TaW4gbcOhcXVpbmFzIHBhcmEgZXN0YSBzZWxlY2Npw7NuLjwvdGQ+PC90cj4nfTwvdGJvZHk+PC90YWJsZT48L2Rpdj48L3NlY3Rpb24+PGRpdiBjbGFzcz0ibm90aWNlIj5GdWVudGU6IGNvbHVtbmEgUHJlbWlvcyBkZSBNYXRyaXogKFApLiBObyBzZSBzdW1hIFRpY2tldCBPdXQgbmkgQ29pbiBPdXQuIEVzdGUgaW5mb3JtZSBubyBpZGVudGlmaWNhIGphY2twb3RzLCBwYWdvcyBtYW51YWxlcyB1IG90cmFzIGNsYXNlcyBkZSBwcmVtaW8gc2kgZWwgYXJjaGl2byBubyB0cmFlIGVzYSBjbGFzaWZpY2FjacOzbi4gRWwgdG90YWwgaW5jbHV5ZSBmaWxhcyBzaW4gaWRlbnRpZmljYWNpw7NuIGRlIG3DoXF1aW5hOyBhcGFyZWNlbiBjb21vIMKrU2luIGlkZW50aWZpY2FjacOzbsK7IHkgbm8gYXVtZW50YW4gZWwgY29udGFkb3IgZGUgbcOhcXVpbmFzIGlkZW50aWZpY2FkYXMuPC9kaXY+YDsKICQoJyNwcml6ZU1vbnRoTEEnKS5vbmNoYW5nZT1lPT57c3RhdGUubW9udGg9ZS50YXJnZXQudmFsdWU7c3RhdGUud2Vla3M9W107cmVuZGVyKCk7fTsKICQoJyNwcml6ZUFwcGx5TEEnKS5vbmNsaWNrPSgpPT57c3RhdGUud2Vla3M9Wy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXByaXpld2Vla106Y2hlY2tlZCcpXS5tYXAoZT0+ZS5kYXRhc2V0LnByaXpld2Vlayk7cmVuZGVyKCk7fTsKICQoJyNwcml6ZUFsbExBJykub25jbGljaz0oKT0+ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcHJpemV3ZWVrXScpLmZvckVhY2goZT0+ZS5jaGVja2VkPXRydWUpOwogJCgnI3ByaXplTm9uZUxBJykub25jbGljaz0oKT0+ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcHJpemV3ZWVrXScpLmZvckVhY2goZT0+ZS5jaGVja2VkPWZhbHNlKTsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXByaXplZmlsdGVyXScpLmZvckVhY2goZT0+ZS5vbmNoYW5nZT0oKT0+e3N0YXRlLmZpbHRlcnNbZS5kYXRhc2V0LnByaXplZmlsdGVyXT1lLnZhbHVlO3JlbmRlcigpO30pOwogJCgnI3ByaXplUmVzZXRMQScpLm9uY2xpY2s9KCk9PntzdGF0ZS5maWx0ZXJzPXt9O3N0YXRlLnNlYXJjaD0nJztyZW5kZXIoKTt9OwogJCgnI3ByaXplU2VhcmNoTEEnKS5vbmNoYW5nZT1lPT57c3RhdGUuc2VhcmNoPWUudGFyZ2V0LnZhbHVlO3JlbmRlcigpO307CiAkKCcjcHJpemVPbmx5TEEnKS5vbmNoYW5nZT1lPT57c3RhdGUub25seVBhaWQ9ZS50YXJnZXQuY2hlY2tlZDtyZW5kZXIoKTt9OwogZGVjb3JhdGVDaGFydHNWOCgpO2Zvcm1hdFRleHREYXRlc1Y1KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21haW4nKSk7Cn0KY29uc3QgcmVuZGVyQmVmb3JlUHJpemVzTEE9cmVuZGVyOwpyZW5kZXI9ZnVuY3Rpb24oKXtpZihkYXRhJiZ0YWI9PT0nUHJlbWlvcyBzZW1hbmFsZXMnKXtjaGFydFBvaW50c1Y0LmNsZWFyKCk7cmVuZGVyUHJpemVzTEEoKTt9ZWxzZSByZW5kZXJCZWZvcmVQcml6ZXNMQSgpO307CmNvbnN0IGRhdGVUZXh0QmVmb3JlUHJpemVzTEE9c2VsZWN0ZWREYXRlVGV4dFY4OwpzZWxlY3RlZERhdGVUZXh0Vjg9ZnVuY3Rpb24oc2NvcGUpe3JldHVybiB0YWI9PT0nUHJlbWlvcyBzZW1hbmFsZXMnJiZzY29wZT09PSdnbG9iYWwnP3ByaXplUGVyaW9kVGV4dExBKCk6ZGF0ZVRleHRCZWZvcmVQcml6ZXNMQShzY29wZSk7fTsKY29uc3QgcHJpemVUYWJCdXR0b25MQT0nPGJ1dHRvbiBkYXRhLXRhYj0iUHJlbWlvcyBzZW1hbmFsZXMiPuKZoiAmbmJzcDsgUHJlbWlvcyBzZW1hbmFsZXM8L2J1dHRvbj4nOwpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCduYXYgYnV0dG9uW2RhdGEtdGFiPSJNZXRvZG9sb2fDrWEiXScpLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlYmVnaW4nLHByaXplVGFiQnV0dG9uTEEpOwpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCduYXYgYnV0dG9uW2RhdGEtdGFiPSJQcmVtaW9zIHNlbWFuYWxlcyJdJykub25jbGljaz0oKT0+YWN0aXZhdGVUYWJWMygnUHJlbWlvcyBzZW1hbmFsZXMnKTsKY29uc3QgZXhwb3J0QmVmb3JlUHJpemVzTEE9JCgnI3YyZXhwb3J0Jykub25jbGljazsKJCgnI3YyZXhwb3J0Jykub25jbGljaz1mdW5jdGlvbigpewogaWYodGFiIT09J1ByZW1pb3Mgc2VtYW5hbGVzJylyZXR1cm4gZXhwb3J0QmVmb3JlUHJpemVzTEEoKTsKIGNvbnN0IHJlcG9ydD1jdXJyZW50UHJpemVSZXBvcnRMQTtpZighcmVwb3J0KXJldHVybjsKIGNvbnN0IHdlZWtzPVtbJ1NlbWFuYScsJ1ByZW1pb3MgcG9zaXRpdm9zIENMUCcsJ0FqdXN0ZXMgbmVnYXRpdm9zIENMUCcsJ1ByZW1pb3MgbmV0b3MgQ0xQJ10sLi4ucmVwb3J0LnN1bW1hcnkud2Vla3MubWFwKHc9Pltwcml6ZVdlZWtMYWJlbExBKHcubmFtZSx3LnJvd3MpLHcucGFpZCx3LmFkanVzdG1lbnRzLHcucHJpemVdKV07CiBjb25zdCBkZXRhaWw9W1snRmVjaGEnLCdTZW1hbmEnLCdNw6FxdWluYScsJ01hcmNhJywnQmFuY28nLCdTZWN0b3InLCdTYWzDs24nLCdQcmVtaW9zIENMUCddLC4uLnJlcG9ydC5yb3dzLmZpbHRlcihyPT50eXBlb2YgclsxNV09PT0nbnVtYmVyJyYmclsxNV0hPT0wKS5tYXAocj0+W2Rpc3BsYXlEYXRlc1Y1KHJbMF0pLHByaXplV2Vla0xhYmVsTEEocHJpemVXZWVrS2V5TEEociksW3JdKSxyWzFdPz8nU2luIGlkZW50aWZpY2FjacOzbicsclsyXT8/Jycscls5XT8/Jycscls1XT8/Jycscls3XT8/JycsclsxNV1dKV07CiBjb25zdCBjb25zdWx0YXRpb249W1snUGFyw6FtZXRybycsJ1ZhbG9yJ10sWydJbmZvcm1lJywnUHJlbWlvcyBzZW1hbmFsZXMnXSxbJ1NlbWFuYXMnLHByaXplUGVyaW9kVGV4dExBKCldLFsnRmlsdHJvcycsSlNPTi5zdHJpbmdpZnkocHJpemVTdGF0ZUxBKCkuZmlsdGVycyldLFsnRnVlbnRlJywnUHJlbWlvcyBkZSBNYXRyaXosIGNvbHVtbmEgUC4gTm8gZXF1aXZhbGUgYSBjYW50aWRhZCBkZSBwcmVtaW9zIGluZGl2aWR1YWxlcy4nXSxbJ1ByZW1pb3MgcG9zaXRpdm9zIENMUCcscmVwb3J0LnN1bW1hcnkucGFpZF0sWydBanVzdGVzIG5lZ2F0aXZvcyBDTFAnLHJlcG9ydC5zdW1tYXJ5LmFkanVzdG1lbnRzXSxbJ1ByZW1pb3MgbmV0b3MgQ0xQJyxyZXBvcnQuc3VtbWFyeS5uZXRdLFsnQsO6c3F1ZWRhIGRlbCBkZXRhbGxlJyxwcml6ZVN0YXRlTEEoKS5zZWFyY2hdLFsnU29sbyBtw6FxdWluYXMgY29uIHBhZ29zIHBvc2l0aXZvcycscHJpemVTdGF0ZUxBKCkub25seVBhaWQ/J1PDrSc6J05vJ11dOwogZG93bmxvYWRCbG9iVjgod29ya2Jvb2tCbG9iVjgoW3tuYW1lOidNYXF1aW5hcycscm93czpwcml6ZU1hY2hpbmVSb3dzTEEocmVwb3J0LnZpc2libGUpfSx7bmFtZTonU2VtYW5hcycscm93czp3ZWVrc30se25hbWU6J0RldGFsbGUgZGlhcmlvJyxyb3dzOmRldGFpbH0se25hbWU6J0NvbnN1bHRhJyxyb3dzOmNvbnN1bHRhdGlvbn1dKSwnTEEtUHJlbWlvcy1zZW1hbmFsZXMueGxzeCcpOwp9OwoKLy8gSGlkZSBjb250cm9scywgcmV0YWluIHNldHRpbmdzIGFuZCBkYXRhLiBTYXZlZCBQb3pvIGZpbHRlcnMgbXVzdCBub3QgcmVtYWluIGFjdGl2ZSBpbnZpc2libHkuCmZ1bmN0aW9uIGNsZWFyUG96b0ZpbHRlcnNMQSgpewogZm9yKGNvbnN0IHN0YXRlIG9mIE9iamVjdC52YWx1ZXModmlld1N0YXRlKSl7aWYoc3RhdGUmJnR5cGVvZiBzdGF0ZT09PSdvYmplY3QnJiZzdGF0ZS5maWx0ZXJzKWRlbGV0ZSBzdGF0ZS5maWx0ZXJzWyc4J107fQogY29uc3QgbGVnYWN5PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmOCcpO2lmKGxlZ2FjeSlmb3IoY29uc3Qgb3B0aW9uIG9mIGxlZ2FjeS5vcHRpb25zKW9wdGlvbi5zZWxlY3RlZD1mYWxzZTsKfQpjb25zdCBmaWx0ZXJGaWVsZHNCZWZvcmVDb21wYWN0TEE9ZmlsdGVyRmllbGRzOwpmaWx0ZXJGaWVsZHM9ZnVuY3Rpb24oc3RhdGUscHJlZml4LGtleXM9T2JqZWN0LmtleXMoZGltcykpe3JldHVybiBmaWx0ZXJGaWVsZHNCZWZvcmVDb21wYWN0TEEoc3RhdGUscHJlZml4LGtleXMuZmlsdGVyKGs9Pk51bWJlcihrKSE9PTgpKTt9OwpmdW5jdGlvbiBmb2xkQ29udHJvbExBKG5vZGUsa2V5LHRleHQpewogaWYoIW5vZGUpcmV0dXJuIG51bGw7CiB2aWV3U3RhdGUuY29tcGFjdFBhbmVscz8/PXt9OwogbGV0IGZvbGQ9bm9kZS5wYXJlbnRFbGVtZW50Py5kYXRhc2V0Py5mb2xkS2V5PT09a2V5P25vZGUucGFyZW50RWxlbWVudDpudWxsOwogaWYoIWZvbGQpewogIGZvbGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO2ZvbGQuY2xhc3NOYW1lPSdjb21wYWN0Rm9sZExBJztmb2xkLmRhdGFzZXQuZm9sZEtleT1rZXk7CiAgY29uc3Qgc3VtbWFyeT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7Zm9sZC5hcHBlbmRDaGlsZChzdW1tYXJ5KTsKICBub2RlLmJlZm9yZShmb2xkKTtmb2xkLmFwcGVuZENoaWxkKG5vZGUpO2ZvbGQub3Blbj0hIXZpZXdTdGF0ZS5jb21wYWN0UGFuZWxzW2tleV07CiAgZm9sZC5hZGRFdmVudExpc3RlbmVyKCd0b2dnbGUnLCgpPT57dmlld1N0YXRlLmNvbXBhY3RQYW5lbHM/Pz17fTt2aWV3U3RhdGUuY29tcGFjdFBhbmVsc1trZXldPWZvbGQub3Blbjt9KTsKIH0KIGNvbnN0IHN1bW1hcnk9Zm9sZC5xdWVyeVNlbGVjdG9yKCdzdW1tYXJ5Jyk7c3VtbWFyeS50ZXh0Q29udGVudD10ZXh0O3N1bW1hcnkudGl0bGU9dGV4dDtyZXR1cm4gZm9sZDsKfQpmdW5jdGlvbiBjb21wYWN0Q29udHJvbHNMQSgpewogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZmlsdGVyPSI4Il0sW2RhdGEtcHJpemVmaWx0ZXI9IjgiXSwjZjgnKS5mb3JFYWNoKGVsPT5lbC5jbG9zZXN0KCdsYWJlbCcpPy5yZW1vdmUoKSk7CiBjb25zdCBnbG9iYWw9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZpbHRlcnMnKTsKIGlmKGdsb2JhbCl7CiAgY29uc3QgdmlzaWJsZT1nbG9iYWwuc3R5bGUuZGlzcGxheSE9PSdub25lJyYmIVsnQ29tcGFyYXRpdm9zJywnTWV0b2RvbG9nw61hJywnUHJlbWlvcyBzZW1hbmFsZXMnXS5pbmNsdWRlcyh0YWIpOwogIGNvbnN0IGZvbGQ9Zm9sZENvbnRyb2xMQShnbG9iYWwsJ2RhdGVzLWdsb2JhbCcsJ0ZlY2hhcyDCtyAnK3NlbGVjdGVkRGF0ZVRleHRWOCgnZ2xvYmFsJykrJyDCtyBhYnJpciBwYXJhIGNhbWJpYXInKTsKICBmb2xkLnN0eWxlLmRpc3BsYXk9dmlzaWJsZT8nYmxvY2snOidub25lJzsKIH0KIGlmKHRhYj09PSdSYXRpb3MnKXsKICBjb25zdCBsaW1pdHM9cmF0aW9MaW1pdHNWNigpO2ZvbGRDb250cm9sTEEoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRyYWZmaWNTZXR0aW5ncycpLCdyYXRpby1zZXR0aW5ncycsJ0NvbmZpZ3VyYXIgc2Vtw6Fmb3JvIGRlIHJhdGlvcyDCtyBSb2pvIDwgJytsaW1pdHMucmVkKyfDlyDCtyBWZXJkZSDiiaUgJytsaW1pdHMuZ3JlZW4rJ8OXJyk7CiB9CiBpZih0YWI9PT0nQ29tcGFyYXRpdm9zJylmb3IoY29uc3Qgc2NvcGUgb2YgWydBJywnQiddKXsKICBjb25zdCBwYW5lbD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2lkZScrc2NvcGUpO2lmKCFwYW5lbCljb250aW51ZTsKICBjb25zdCBkYXRlcz1wYW5lbC5xdWVyeVNlbGVjdG9yKCcuY29tcGFyZURhdGVzJyksY2FsZW5kYXI9cGFuZWwucXVlcnlTZWxlY3RvcignLmNhbGVuZGFyUGFuZWwnKTsKICBjb25zdCBmb2xkPWZvbGRDb250cm9sTEEoZGF0ZXMsJ2RhdGVzLScrc2NvcGUsJ0ZlY2hhcyAnK3Njb3BlKycgwrcgJytzZWxlY3RlZERhdGVUZXh0Vjgoc2NvcGUpKTtpZihjYWxlbmRhcilmb2xkLmFwcGVuZENoaWxkKGNhbGVuZGFyKTsKIH0KIGlmKHRhYj09PSdQcmVtaW9zIHNlbWFuYWxlcycpZm9sZENvbnRyb2xMQShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY29udGVudCBzZWN0aW9uLmNhcmQnKSwncHJpemUtZmlsdGVycycsJ0ZpbHRyYXIgc2VtYW5hcyB5IG3DoXF1aW5hcyDCtyAnK3ByaXplUGVyaW9kVGV4dExBKCkpOwp9CmNvbnN0IHJlbmRlckJlZm9yZUNvbXBhY3RMQT1yZW5kZXI7CnJlbmRlcj1mdW5jdGlvbigpe2NsZWFyUG96b0ZpbHRlcnNMQSgpO3JlbmRlckJlZm9yZUNvbXBhY3RMQSgpO2lmKGRhdGEpY29tcGFjdENvbnRyb2xzTEEoKTt9OwoKY29uc3QgbW9udGhzU3BhbmlzaExBPVsnRW5lcm8nLCdGZWJyZXJvJywnTWFyem8nLCdBYnJpbCcsJ01heW8nLCdKdW5pbycsJ0p1bGlvJywnQWdvc3RvJywnU2VwdGllbWJyZScsJ09jdHVicmUnLCdOb3ZpZW1icmUnLCdEaWNpZW1icmUnXTsKZnVuY3Rpb24gZGF0ZVBhcnRzU3BhbmlzaExBKHZhbHVlKXsKIGNvbnN0IG1hdGNoPS9eKFxkezR9KS0oXGR7Mn0pLShcZHsyfSkkLy5leGVjKHZhbHVlfHwnJyk7aWYoIW1hdGNoKXJldHVybiBudWxsOwogY29uc3QgeWVhcj1OdW1iZXIobWF0Y2hbMV0pLG1vbnRoPU51bWJlcihtYXRjaFsyXSktMSxkYXk9TnVtYmVyKG1hdGNoWzNdKSxkYXRlPW5ldyBEYXRlKERhdGUuVVRDKHllYXIsbW9udGgsZGF5KSk7CiByZXR1cm4gZGF0ZS5nZXRVVENGdWxsWWVhcigpPT09eWVhciYmZGF0ZS5nZXRVVENNb250aCgpPT09bW9udGgmJmRhdGUuZ2V0VVRDRGF0ZSgpPT09ZGF5P3t5ZWFyLG1vbnRoLGRheX06bnVsbDsKfQpmdW5jdGlvbiBkYXRlSXNvU3BhbmlzaExBKHllYXIsbW9udGgsZGF5KXtyZXR1cm4gU3RyaW5nKHllYXIpLnBhZFN0YXJ0KDQsJzAnKSsnLScrU3RyaW5nKG1vbnRoKzEpLnBhZFN0YXJ0KDIsJzAnKSsnLScrU3RyaW5nKGRheSkucGFkU3RhcnQoMiwnMCcpO30KZnVuY3Rpb24gZGF0ZUxhYmVsU3BhbmlzaExBKHZhbHVlKXtjb25zdCBkPWRhdGVQYXJ0c1NwYW5pc2hMQSh2YWx1ZSk7cmV0dXJuIGQ/U3RyaW5nKGQuZGF5KS5wYWRTdGFydCgyLCcwJykrJyAnK21vbnRoc1NwYW5pc2hMQVtkLm1vbnRoXS50b0xvd2VyQ2FzZSgpKycgJytkLnllYXI6J1NlbGVjY2lvbmFyIGZlY2hhJzt9CmZ1bmN0aW9uIGRhdGVHcmlkU3BhbmlzaExBKHllYXIsbW9udGgpewogY29uc3Qgb2Zmc2V0PShuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLG1vbnRoLDEpKS5nZXRVVENEYXkoKSs2KSU3LGRheXM9bmV3IERhdGUoRGF0ZS5VVEMoeWVhcixtb250aCsxLDApKS5nZXRVVENEYXRlKCk7CiByZXR1cm4gWy4uLkFycmF5KG9mZnNldCkuZmlsbChudWxsKSwuLi5BcnJheS5mcm9tKHtsZW5ndGg6ZGF5c30sKF8saSk9PmRhdGVJc29TcGFuaXNoTEEoeWVhcixtb250aCxpKzEpKV07Cn0KbGV0IHNwYW5pc2hDYWxlbmRhckxBPW51bGwsc3BhbmlzaENhbGVuZGFyQ291bnRlckxBPTA7CmZ1bmN0aW9uIGNsb3NlU3BhbmlzaENhbGVuZGFyTEEoZm9jdXM9dHJ1ZSl7CiBpZighc3BhbmlzaENhbGVuZGFyTEEpcmV0dXJuO2NvbnN0IHtwb3B1cCx0cmlnZ2VyfT1zcGFuaXNoQ2FsZW5kYXJMQTtzcGFuaXNoQ2FsZW5kYXJMQT1udWxsO3BvcHVwLnJlbW92ZSgpO3RyaWdnZXIuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywnZmFsc2UnKTtpZihmb2N1cyYmdHJpZ2dlci5pc0Nvbm5lY3RlZCl0cmlnZ2VyLmZvY3VzKCk7Cn0KZnVuY3Rpb24gc2hvd1NwYW5pc2hDYWxlbmRhckxBKGlucHV0LHRyaWdnZXIpewogY2xvc2VTcGFuaXNoQ2FsZW5kYXJMQShmYWxzZSk7Y29uc3Qgbm93PW5ldyBEYXRlKCksaW5pdGlhbD1kYXRlUGFydHNTcGFuaXNoTEEoaW5wdXQudmFsdWUpfHx7eWVhcjpub3cuZ2V0RnVsbFllYXIoKSxtb250aDpub3cuZ2V0TW9udGgoKX07CiBjb25zdCBwb3B1cD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtwb3B1cC5jbGFzc05hbWU9J3NwYW5pc2hDYWxlbmRhckxBJztwb3B1cC5sYW5nPSdlcy1DTCc7cG9wdXAuc2V0QXR0cmlidXRlKCdyb2xlJywnZGlhbG9nJyk7cG9wdXAuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywnU2VsZWNjaW9uYXIgZmVjaGEnKTtwb3B1cC5pZD0nc3BhbmlzaC1jYWxlbmRhci1sYSc7CiBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBvcHVwKTtzcGFuaXNoQ2FsZW5kYXJMQT17cG9wdXAsaW5wdXQsdHJpZ2dlcix5ZWFyOmluaXRpYWwueWVhcixtb250aDppbml0aWFsLm1vbnRofTt0cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsJ3RydWUnKTsKIGZ1bmN0aW9uIHNlbGVjdCh2YWx1ZSl7CiAgaW5wdXQudmFsdWU9dmFsdWU7dHJpZ2dlci50ZXh0Q29udGVudD1kYXRlTGFiZWxTcGFuaXNoTEEodmFsdWUpO2Nsb3NlU3BhbmlzaENhbGVuZGFyTEEoKTsKICBpbnB1dC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnaW5wdXQnLHtidWJibGVzOnRydWV9KSk7aW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScse2J1YmJsZXM6dHJ1ZX0pKTsKIH0KIGZ1bmN0aW9uIHBhaW50KCl7CiAgY29uc3Qgc3RhdGU9c3BhbmlzaENhbGVuZGFyTEE7aWYoIXN0YXRlKXJldHVybjtjb25zdCB7eWVhcixtb250aH09c3RhdGU7CiAgY29uc3Qgc2VsZWN0ZWQ9aW5wdXQudmFsdWUsdG9kYXk9ZGF0ZUlzb1NwYW5pc2hMQShub3cuZ2V0RnVsbFllYXIoKSxub3cuZ2V0TW9udGgoKSxub3cuZ2V0RGF0ZSgpKTsKICBjb25zdCBtaW5ZZWFyPU1hdGgubWluKDE5MDAseWVhciksbWF4WWVhcj1NYXRoLm1heCgyMTAwLHllYXIpOwogIHBvcHVwLmlubmVySFRNTD1gPGRpdiBjbGFzcz0ic3BhbmlzaENhbEhlYWRpbmdMQSI+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtY2FscHJldiBhcmlhLWxhYmVsPSJNZXMgYW50ZXJpb3IiPuKAuTwvYnV0dG9uPjxzZWxlY3QgZGF0YS1jYWxtb250aC1lcyBhcmlhLWxhYmVsPSJNZXMiPiR7bW9udGhzU3BhbmlzaExBLm1hcCgobmFtZSxpKT0+YDxvcHRpb24gdmFsdWU9IiR7aX0iICR7aT09PW1vbnRoPydzZWxlY3RlZCc6Jyd9PiR7bmFtZX08L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48c2VsZWN0IGRhdGEtY2FseWVhci1lcyBhcmlhLWxhYmVsPSJBw7FvIj4ke0FycmF5LmZyb20oe2xlbmd0aDptYXhZZWFyLW1pblllYXIrMX0sKF8saSk9Pm1pblllYXIraSkubWFwKHk9PmA8b3B0aW9uICR7eT09PXllYXI/J3NlbGVjdGVkJzonJ30+JHt5fTwvb3B0aW9uPmApLmpvaW4oJycpfTwvc2VsZWN0PjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLWNhbG5leHQgYXJpYS1sYWJlbD0iTWVzIHNpZ3VpZW50ZSI+4oC6PC9idXR0b24+PC9kaXY+PGRpdiBjbGFzcz0ic3BhbmlzaENhbERheXNMQSI+JHtbJ0x1bicsJ01hcicsJ01pw6knLCdKdWUnLCdWaWUnLCdTw6FiJywnRG9tJ10ubWFwKGQ9PmA8c3Bhbj4ke2R9PC9zcGFuPmApLmpvaW4oJycpfSR7ZGF0ZUdyaWRTcGFuaXNoTEEoeWVhcixtb250aCkubWFwKGlzbz0+aXNvP2A8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1jYWxkYXktZXM9IiR7aXNvfSIgJHtpbnB1dC5taW4mJmlzbzxpbnB1dC5taW58fGlucHV0Lm1heCYmaXNvPmlucHV0Lm1heD8nZGlzYWJsZWQnOicnfSAke2lzbz09PXNlbGVjdGVkPydhcmlhLWN1cnJlbnQ9ImRhdGUiJzonJ30gdGl0bGU9IiR7ZGF0ZUxhYmVsU3BhbmlzaExBKGlzbyl9IiBjbGFzcz0iJHtpc289PT1zZWxlY3RlZD8nc2VsZWN0ZWQgJzonJ30ke2lzbz09PXRvZGF5Pyd0b2RheSc6Jyd9Ij4ke051bWJlcihpc28uc2xpY2UoLTIpKX08L2J1dHRvbj5gOic8c3Bhbj48L3NwYW4+Jykuam9pbignJyl9PC9kaXY+PGRpdiBjbGFzcz0ic3BhbmlzaENhbEFjdGlvbnNMQSI+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtY2FsdG9kYXktZXM+SG95PC9idXR0b24+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtY2FsY2xlYXItZXM+TGltcGlhcjwvYnV0dG9uPjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLWNhbGNsb3NlLWVzPkNlcnJhcjwvYnV0dG9uPjwvZGl2PmA7CiAgcG9wdXAucXVlcnlTZWxlY3RvcignW2RhdGEtY2FscHJldl0nKS5vbmNsaWNrPSgpPT57c3RhdGUubW9udGgtLTtpZihzdGF0ZS5tb250aDwwKXtzdGF0ZS5tb250aD0xMTtzdGF0ZS55ZWFyLS07fXBhaW50KCk7fTsKICBwb3B1cC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jYWxuZXh0XScpLm9uY2xpY2s9KCk9PntzdGF0ZS5tb250aCsrO2lmKHN0YXRlLm1vbnRoPjExKXtzdGF0ZS5tb250aD0wO3N0YXRlLnllYXIrKzt9cGFpbnQoKTt9OwogIHBvcHVwLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNhbG1vbnRoLWVzXScpLm9uY2hhbmdlPWU9PntzdGF0ZS5tb250aD1OdW1iZXIoZS50YXJnZXQudmFsdWUpO3BhaW50KCk7fTsKICBwb3B1cC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jYWx5ZWFyLWVzXScpLm9uY2hhbmdlPWU9PntzdGF0ZS55ZWFyPU51bWJlcihlLnRhcmdldC52YWx1ZSk7cGFpbnQoKTt9OwogIHBvcHVwLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWNhbGRheS1lc10nKS5mb3JFYWNoKGJ1dHRvbj0+YnV0dG9uLm9uY2xpY2s9KCk9PnNlbGVjdChidXR0b24uZGF0YXNldC5jYWxkYXlFcykpOwogIHBvcHVwLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNhbHRvZGF5LWVzXScpLm9uY2xpY2s9KCk9PntpZihpbnB1dC5taW4mJnRvZGF5PGlucHV0Lm1pbnx8aW5wdXQubWF4JiZ0b2RheT5pbnB1dC5tYXgpcmV0dXJuO3NlbGVjdCh0b2RheSk7fTsKICBwb3B1cC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jYWxjbGVhci1lc10nKS5vbmNsaWNrPSgpPT5zZWxlY3QoJycpO3BvcHVwLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNhbGNsb3NlLWVzXScpLm9uY2xpY2s9KCk9PmNsb3NlU3BhbmlzaENhbGVuZGFyTEEoKTsKICBjb25zdCByZWN0PXRyaWdnZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cG9wdXAuc3R5bGUubGVmdD1NYXRoLm1heCg4LE1hdGgubWluKHJlY3QubGVmdCx3aW5kb3cuaW5uZXJXaWR0aC0zMjgpKSsncHgnO3BvcHVwLnN0eWxlLnRvcD1NYXRoLm1heCg4LE1hdGgubWluKHJlY3QuYm90dG9tKzYsd2luZG93LmlubmVySGVpZ2h0LXBvcHVwLm9mZnNldEhlaWdodC04KSkrJ3B4JzsKIH0KIHBhaW50KCk7KHBvcHVwLnF1ZXJ5U2VsZWN0b3IoJ1thcmlhLWN1cnJlbnQ9ImRhdGUiXScpfHxwb3B1cC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jYWxkYXktZXNdOm5vdCg6ZGlzYWJsZWQpJykpPy5mb2N1cygpOwp9CmZ1bmN0aW9uIGRlY29yYXRlU3BhbmlzaERhdGVzTEEoKXsKIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5sYW5nPSdlcy1DTCc7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPSJkYXRlIl0nKS5mb3JFYWNoKGlucHV0PT57CiAgaW5wdXQubGFuZz0nZXMtQ0wnO2xldCB0cmlnZ2VyPWlucHV0Ll9zcGFuaXNoVHJpZ2dlckxBOwogIGlmKCF0cmlnZ2VyfHwhdHJpZ2dlci5pc0Nvbm5lY3RlZCl7CiAgIHRyaWdnZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7dHJpZ2dlci50eXBlPSdidXR0b24nO3RyaWdnZXIuY2xhc3NOYW1lPSdzcGFuaXNoRGF0ZVRyaWdnZXJMQSc7dHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGFzcG9wdXAnLCdkaWFsb2cnKTt0cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsJ2ZhbHNlJyk7CiAgIHRyaWdnZXIuaWQ9J2RhdGUtdHJpZ2dlci1sYS0nKygrK3NwYW5pc2hDYWxlbmRhckNvdW50ZXJMQSk7dHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLChpbnB1dC5jbG9zZXN0KCdsYWJlbCcpPy50ZXh0Q29udGVudC50cmltKCl8fCdGZWNoYScpKyc6IGFicmlyIGNhbGVuZGFyaW8gZW4gZXNwYcOxb2wnKTsKICAgaW5wdXQuaGlkZGVuPXRydWU7aW5wdXQuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCdub25lJywnaW1wb3J0YW50Jyk7aW5wdXQuYWZ0ZXIodHJpZ2dlcik7aW5wdXQuX3NwYW5pc2hUcmlnZ2VyTEE9dHJpZ2dlcjsKICAgdHJpZ2dlci5vbmNsaWNrPWV2ZW50PT57ZXZlbnQucHJldmVudERlZmF1bHQoKTtldmVudC5zdG9wUHJvcGFnYXRpb24oKTtpZihzcGFuaXNoQ2FsZW5kYXJMQT8uaW5wdXQ9PT1pbnB1dCljbG9zZVNwYW5pc2hDYWxlbmRhckxBKCk7ZWxzZSBzaG93U3BhbmlzaENhbGVuZGFyTEEoaW5wdXQsdHJpZ2dlcik7fTsKICB9CiAgdHJpZ2dlci50ZXh0Q29udGVudD1kYXRlTGFiZWxTcGFuaXNoTEEoaW5wdXQudmFsdWUpOwogfSk7Cn0KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGV2ZW50PT57aWYoc3BhbmlzaENhbGVuZGFyTEEmJiFzcGFuaXNoQ2FsZW5kYXJMQS5wb3B1cC5jb250YWlucyhldmVudC50YXJnZXQpJiYhc3BhbmlzaENhbGVuZGFyTEEudHJpZ2dlci5jb250YWlucyhldmVudC50YXJnZXQpKWNsb3NlU3BhbmlzaENhbGVuZGFyTEEoZmFsc2UpO30pOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxldmVudD0+e2lmKGV2ZW50LmtleT09PSdFc2NhcGUnJiZzcGFuaXNoQ2FsZW5kYXJMQSl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtjbG9zZVNwYW5pc2hDYWxlbmRhckxBKCk7fX0pOwp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywoKT0+Y2xvc2VTcGFuaXNoQ2FsZW5kYXJMQShmYWxzZSkpOwpjb25zdCByZW5kZXJCZWZvcmVTcGFuaXNoTEE9cmVuZGVyOwpyZW5kZXI9ZnVuY3Rpb24oKXtjbG9zZVNwYW5pc2hDYWxlbmRhckxBKGZhbHNlKTtyZW5kZXJCZWZvcmVTcGFuaXNoTEEoKTtpZihkYXRhKWRlY29yYXRlU3BhbmlzaERhdGVzTEEoKTt9OwoKZnVuY3Rpb24gZGF0ZUV4dGVudExBKHJvd3Mpe2xldCBmaXJzdD0nJyxsYXN0PScnO2NvbnN0IGRheXM9bmV3IFNldCgpO2Zvcihjb25zdCByIG9mIHJvd3Mpe2NvbnN0IGQ9clswXTtpZighZmlyc3R8fGQ8Zmlyc3QpZmlyc3Q9ZDtpZihkPmxhc3QpbGFzdD1kO2RheXMuYWRkKGQpO31yZXR1cm57Zmlyc3QsbGFzdCxkYXlzfTt9CmZ1bmN0aW9uIHNoaWZ0RGF0ZUxBKGlzbyxkYXlzKXtjb25zdCBkPW5ldyBEYXRlKGlzbysnVDAwOjAwOjAwWicpO2Quc2V0VVRDRGF0ZShkLmdldFVUQ0RhdGUoKStkYXlzKTtyZXR1cm4gZC50b0lTT1N0cmluZygpLnNsaWNlKDAsMTApO30KZnVuY3Rpb24gYWxlcnRXaW5kb3dzTEEoZW5kLGRheXMpe3JldHVybiB7ZnJvbTpzaGlmdERhdGVMQShlbmQsMS1kYXlzKSx0bzplbmQscHJldmlvdXNGcm9tOnNoaWZ0RGF0ZUxBKGVuZCwxLWRheXMqMikscHJldmlvdXNUbzpzaGlmdERhdGVMQShlbmQsLWRheXMpfTt9CmZ1bmN0aW9uIGJ1aWxkQWxlcnRzTEEocm93cyxzZXR0aW5ncyl7CiBjb25zdCB3aW5kb3dzPWFsZXJ0V2luZG93c0xBKHNldHRpbmdzLmVuZCxzZXR0aW5ncy5kYXlzKSxtYXA9bmV3IE1hcCgpLGN1cnJlbnREYXRlcz1uZXcgU2V0KCkscHJldmlvdXNEYXRlcz1uZXcgU2V0KCk7CiBmb3IoY29uc3QgciBvZiByb3dzKXsKICBpZihleGNsdWRlZFJlY29yZFY3KHIpfHwhT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MuZmlsdGVyc3x8e30pLmV2ZXJ5KChbayx2YWx1ZXNdKT0+TnVtYmVyKGspPT09OHx8IXZhbHVlcy5sZW5ndGh8fHZhbHVlcy5pbmNsdWRlcyhTdHJpbmcocltrXT8/J1NpbiBkYXRvJykpKSljb250aW51ZTsKICBjb25zdCBjdXJyZW50PXJbMF0+PXdpbmRvd3MuZnJvbSYmclswXTw9d2luZG93cy50byxwcmV2aW91cz1yWzBdPj13aW5kb3dzLnByZXZpb3VzRnJvbSYmclswXTw9d2luZG93cy5wcmV2aW91c1RvOwogIGlmKCFjdXJyZW50JiYhcHJldmlvdXMpY29udGludWU7Y29uc3Qga2V5PVN0cmluZyhyW3NldHRpbmdzLmdyb3VwXT8/J1NpbiBpZGVudGlmaWNhY2nDs24nKTtpZighbWFwLmhhcyhrZXkpKW1hcC5zZXQoa2V5LHtuYW1lOmtleSxjdXJyZW50OltdLHByZXZpb3VzOltdfSk7CiAgbWFwLmdldChrZXkpW2N1cnJlbnQ/J2N1cnJlbnQnOidwcmV2aW91cyddLnB1c2gocik7KGN1cnJlbnQ/Y3VycmVudERhdGVzOnByZXZpb3VzRGF0ZXMpLmFkZChyWzBdKTsKIH0KIGNvbnN0IGVudHJpZXM9Wy4uLm1hcC52YWx1ZXMoKV0ubWFwKGc9PnsKICBjb25zdCBhPWFnZyhnLnByZXZpb3VzKSxiPWFnZyhnLmN1cnJlbnQpLGRheXNBPW5ldyBTZXQoZy5wcmV2aW91cy5tYXAocj0+clswXSkpLnNpemUsZGF5c0I9bmV3IFNldChnLmN1cnJlbnQubWFwKHI9PnJbMF0pKS5zaXplLG9sZD1hW3NldHRpbmdzLm1ldHJpY10sdmFsdWU9YltzZXR0aW5ncy5tZXRyaWNdOwogIGxldCBzdGF0dXM9J29rJyxyZWFzb249J1NpbiBjYcOtZGEgc3VwZXJpb3IgYWwgdW1icmFsJyxjaGFuZ2U9bnVsbDsKICBpZighZy5jdXJyZW50Lmxlbmd0aCl7c3RhdHVzPSdpbmZvJztyZWFzb249J1NpbiByZWdpc3Ryb3MgYWN0dWFsZXMnO30KICBlbHNlIGlmKGRheXNBPHNldHRpbmdzLm1pbkRheXN8fGRheXNCPHNldHRpbmdzLm1pbkRheXMpe3N0YXR1cz0naW5mbyc7cmVhc29uPSdDb2JlcnR1cmEgaW5zdWZpY2llbnRlIHBhcmEgY29tcGFyYXInO30KICBlbHNlIGlmKG9sZD09bnVsbHx8b2xkPD0wKXtzdGF0dXM9J2luZm8nO3JlYXNvbj0nU2luIGJhc2UgcG9zaXRpdmEgY29tcGFyYWJsZSc7fQogIGVsc2Uge2NoYW5nZT0odmFsdWUtb2xkKS9NYXRoLmFicyhvbGQpKjEwMDtpZihjaGFuZ2U8PS1zZXR0aW5ncy50aHJlc2hvbGQpe3N0YXR1cz0nZHJvcCc7cmVhc29uPSdDYcOtZGEgZGUgJytNYXRoLmFicyhjaGFuZ2UpLnRvRml4ZWQoMSkucmVwbGFjZSgnLicsJywnKSsnJSc7fX0KICBpZihzZXR0aW5ncy5tZXRyaWM9PT0nd2QnJiZ2YWx1ZTwwJiZnLmN1cnJlbnQubGVuZ3RoKXtzdGF0dXM9J2Ryb3AnO3JlYXNvbj0nV2luIHBvciBtw6FxdWluYS1kw61hIG5lZ2F0aXZvJysoY2hhbmdlPT1udWxsPycgwrcgc2luIHZhcmlhY2nDs24gY29tcGFyYWJsZSc6JycpO30KICByZXR1cm4gey4uLmcsb2xkLHZhbHVlLGRheXNBLGRheXNCLGNoYW5nZSxzdGF0dXMscmVhc29uLG1hY2hpbmVEYXlzQTphLmRheXMsbWFjaGluZURheXNCOmIuZGF5c307CiB9KS5zb3J0KChhLGIpPT4oYS5zdGF0dXM9PT0nZHJvcCc/MDphLnN0YXR1cz09PSdpbmZvJz8xOjIpLShiLnN0YXR1cz09PSdkcm9wJz8wOmIuc3RhdHVzPT09J2luZm8nPzE6Mil8fChhLmNoYW5nZT8/MCktKGIuY2hhbmdlPz8wKXx8YS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7CiByZXR1cm57d2luZG93cyxlbnRyaWVzLGN1cnJlbnREYXlzOmN1cnJlbnREYXRlcy5zaXplLHByZXZpb3VzRGF5czpwcmV2aW91c0RhdGVzLnNpemV9Owp9CmxldCBkZW5zaXR5TEE9J2NvbXBhY3QnO3RyeXtkZW5zaXR5TEE9bG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0xBX0RFTlNJVFknKT09PSdjb21mb3J0YWJsZSc/J2NvbWZvcnRhYmxlJzonY29tcGFjdCc7fWNhdGNoKGUpe30KZG9jdW1lbnQuYm9keS5kYXRhc2V0LmRlbnNpdHk9ZGVuc2l0eUxBOwpmdW5jdGlvbiBzZXR1cEV4cGVyaWVuY2VIZWFkZXJMQSgpewogaWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZW5zaXR5TEEnKSl7CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlc3Npb25CYXJWMTUnKS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLGA8bGFiZWwgY2xhc3M9ImRlbnNpdHlDb250cm9sTEEiPlZpc3RhPHNlbGVjdCBpZD0iZGVuc2l0eUxBIj48b3B0aW9uIHZhbHVlPSJjb21wYWN0Ij5Db21wYWN0YTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImNvbWZvcnRhYmxlIj5Dw7Ntb2RhPC9vcHRpb24+PC9zZWxlY3Q+PC9sYWJlbD5gKTsKICAkKCcjZGVuc2l0eUxBJykudmFsdWU9ZGVuc2l0eUxBOyQoJyNkZW5zaXR5TEEnKS5vbmNoYW5nZT1lPT57ZGVuc2l0eUxBPWUudGFyZ2V0LnZhbHVlO2RvY3VtZW50LmJvZHkuZGF0YXNldC5kZW5zaXR5PWRlbnNpdHlMQTt0cnl7bG9jYWxTdG9yYWdlLnNldEl0ZW0oJ0xBX0RFTlNJVFknLGRlbnNpdHlMQSl9Y2F0Y2goZXJyb3Ipe319OwogfQogbGV0IGJhY2t1cHM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cHNMQScpOwogaWYoIWJhY2t1cHMpe2JhY2t1cHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7YmFja3Vwcy5pZD0nYmFja3Vwc0xBJztiYWNrdXBzLnRleHRDb250ZW50PSdSZXNwYWxkb3MnO2JhY2t1cHMub25jbGljaz1vcGVuQmFja3Vwc0xBO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZXNzaW9uQmFyVjE1JykuYXBwZW5kQ2hpbGQoYmFja3Vwcyk7fQogYmFja3Vwcy5oaWRkZW49YXBwU2Vzc2lvblYxNT8ucm9sZSE9PSdhZG1pbic7Cn0KZnVuY3Rpb24gZm9ybWF0VXBkYXRlTEEodmFsdWUpe2lmKCF2YWx1ZSlyZXR1cm4gJ1NpbiBmZWNoYSBkaXNwb25pYmxlJztjb25zdCBkYXRlPW5ldyBEYXRlKHZhbHVlKTtyZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKT8nU2luIGZlY2hhIGRpc3BvbmlibGUnOmRhdGUudG9Mb2NhbGVTdHJpbmcoJ2VzLUNMJyx7dGltZVpvbmU6J0FtZXJpY2EvU2FudGlhZ28nLGRheTonMi1kaWdpdCcsbW9udGg6J2xvbmcnLHllYXI6J251bWVyaWMnLGhvdXI6JzItZGlnaXQnLG1pbnV0ZTonMi1kaWdpdCd9KTt9CmxldCBleHRlbnRDYWNoZUxBPW51bGw7CmZ1bmN0aW9uIGRhdGFTdGF0dXNMQSgpewogaWYoZXh0ZW50Q2FjaGVMQT8ubWF0cml4IT09ZGF0YSlleHRlbnRDYWNoZUxBPXttYXRyaXg6ZGF0YSwuLi5kYXRlRXh0ZW50TEEoZGF0YS5yb3dzKX07CiBjb25zdCBlPWV4dGVudENhY2hlTEEsZGF5PW5ldyBEYXRlKGUubGFzdCsnVDAwOjAwOjAwWicpLHN0YXJ0PXNoaWZ0RGF0ZUxBKGUubGFzdCwtKChkYXkuZ2V0VVRDRGF5KCkrNiklNykpOwogY29uc3QgY292ZXJlZD1bLi4uZS5kYXlzXS5maWx0ZXIoZD0+ZD49c3RhcnQmJmQ8PWUubGFzdCkubGVuZ3RoOwogcmV0dXJuIGA8c3Bhbj5EYXRvcyBoYXN0YSA8Yj4ke2VzYyhkaXNwbGF5RGF0ZXNWNShlLmxhc3QpKX08L2I+PC9zcGFuPjxzcGFuPkFjdHVhbGl6YWNpw7NuOiAke2VzYyhmb3JtYXRVcGRhdGVMQShkYXRhLnN0b3JhZ2VVcGRhdGVkQXQpKX0gwrcgaG9yYSBkZSBDaGlsZTwvc3Bhbj48c3BhbiBjbGFzcz0iJHtjb3ZlcmVkPDc/J2NvdmVyYWdlTEEnOicnfSI+w5psdGltYSBzZW1hbmE6ICR7Y292ZXJlZH0vNyBkw61hcyBjb24gZGF0b3Mke2NvdmVyZWQ8Nz8nIMK3IGNvYmVydHVyYSBwYXJjaWFsJzonJ308L3NwYW4+YDsKfQpmdW5jdGlvbiBmaWx0ZXJUZXh0TEEoZmlsdGVycyxwcmVmaXg9JycpewogcmV0dXJuIE9iamVjdC5lbnRyaWVzKGZpbHRlcnN8fHt9KS5maWx0ZXIoKFtrLHZdKT0+TnVtYmVyKGspIT09OCYmKEFycmF5LmlzQXJyYXkodik/di5sZW5ndGg6ISF2KSkubWFwKChbayx2XSk9Pntjb25zdCBsaXN0PUFycmF5LmlzQXJyYXkodik/djpbdl07cmV0dXJuIHByZWZpeCsoZGltc1trXXx8aykrJzogJysobGlzdC5sZW5ndGg+Mj9saXN0Lmxlbmd0aCsnIHNlbGVjY2lvbmFkb3MnOmxpc3Quam9pbignLCAnKSk7fSk7Cn0KZnVuY3Rpb24gYWN0aXZlRmlsdGVyc0xBKCl7CiBpZih0YWI9PT0nTWV0b2RvbG9nw61hJylyZXR1cm4gJyc7CiBsZXQgY2hpcHM9W107CiBpZih0YWI9PT0nQ29tcGFyYXRpdm9zJylmb3IoY29uc3Qgc2NvcGUgb2YgWydBJywnQiddKXtjaGlwcy5wdXNoKHNjb3BlKyc6ICcrc2VsZWN0ZWREYXRlVGV4dFY4KHNjb3BlKSwuLi5maWx0ZXJUZXh0TEEodmlld1N0YXRlW3Njb3BlXS5maWx0ZXJzLHNjb3BlKycgwrcgJykpO30KIGVsc2UgaWYodGFiPT09J0FsZXJ0YXMnKXtjb25zdCBzPWFsZXJ0U2V0dGluZ3NMQSgpLHc9YWxlcnRXaW5kb3dzTEEocy5lbmQscy5kYXlzKTtjaGlwcz1bZGlzcGxheURhdGVzVjUody5mcm9tKSsnIOKGkiAnK2Rpc3BsYXlEYXRlc1Y1KHcudG8pLC4uLmZpbHRlclRleHRMQShzLmZpbHRlcnMpLGRpbXNbcy5ncm91cF0rJyDCtyAnK21ldHJpY3Nbcy5tZXRyaWNdXTt9CiBlbHNlIHtjaGlwcz1bc2VsZWN0ZWREYXRlVGV4dFY4KCdnbG9iYWwnKV07Y29uc3Qga2V5PXtFdm9sdWNpw7NuOidldm9sdXRpb24nLFJhdGlvczoncmF0aW9zJywnUmVwb3J0ZSBzZW1hbmFsJzond2Vla2x5JywnUmVwb3J0ZSBtZW5zdWFsJzonbW9udGhseScsJ0V2b2x1dGl2byBtZW5zdWFsJzonbW9udGhseUV2b2x1dGlvbicsJ090cm9zIGluZm9ybWVzJzonZXh0cmEnLCdQcmVtaW9zIHNlbWFuYWxlcyc6J3ByaXplcyd9W3RhYl07Y2hpcHMucHVzaCguLi5maWx0ZXJUZXh0TEEodmlld1N0YXRlW2tleV0/LmZpbHRlcnMpKTtpZih0YWI9PT0nUmVzdW1lbicpY2hpcHMucHVzaCgnVG9kbyBlbCBwYXJxdWUnKTt9CiByZXR1cm4gYDxkaXYgY2xhc3M9ImFjdGl2ZUZpbHRlcnNMQSIgYXJpYS1sYWJlbD0iRmlsdHJvcyBhY3Rpdm9zIiBzdHlsZT0icG9zaXRpb246c3RpY2t5O3RvcDowO3otaW5kZXg6OCI+PGI+Q29uc3VsdGEgYWN0dWFsPC9iPiR7Y2hpcHMubWFwKHRleHQ9PmA8c3BhbiBjbGFzcz0iZmlsdGVyQ2hpcExBIiB0aXRsZT0iJHtlc2ModGV4dCl9Ij4ke2VzYyh0ZXh0KX08L3NwYW4+YCkuam9pbignJyl9PC9kaXY+YDsKfQpmdW5jdGlvbiBzb3J0YWJsZVZhbHVlTEEodGV4dCl7Y29uc3QgcmF3PVN0cmluZyh0ZXh0KS50cmltKCk7Y29uc3QgdmFsdWU9cmF3LnJlcGxhY2UoL1vil49cc10vZywnJykucmVwbGFjZSgvQ0xQfHBwfCV8w5cvZywnJyk7aWYoL15bKy1dP1tcZC5dKyg/OixcZCspPyQvLnRlc3QodmFsdWUpKXJldHVybntudW1iZXI6TnVtYmVyKHZhbHVlLnJlcGxhY2UoL1wuL2csJycpLnJlcGxhY2UoJywnLCcuJykpfTtyZXR1cm57dGV4dDpyYXcudG9Mb2NhbGVMb3dlckNhc2UoJ2VzJyl9O30KZnVuY3Rpb24gZW5oYW5jZVRhYmxlc0xBKCl7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY29udGVudCAudGFibGV3cmFwLCNjb250ZW50IC5jaGFydGRhdGF3cmFwJykuZm9yRWFjaChob3N0PT57CiAgY29uc3QgdGFibGU9aG9zdC5xdWVyeVNlbGVjdG9yKCd0YWJsZScpO2lmKCF0YWJsZXx8IXRhYmxlLnRIZWFkfHwhdGFibGUudEJvZGllcy5sZW5ndGh8fGhvc3QuZGF0YXNldC5lbmhhbmNlZExhKXJldHVybjsKICBob3N0LmRhdGFzZXQuZW5oYW5jZWRMYT0ndHJ1ZSc7aG9zdC5jbGFzc0xpc3QuYWRkKCdzbWFydFRhYmxlTEEnKTsKICBjb25zdCByb3dzPVsuLi50YWJsZS50Qm9kaWVzWzBdLnJvd3NdO2lmKHJvd3MubGVuZ3RoPjgpewogICBjb25zdCB0b29scz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTt0b29scy5jbGFzc05hbWU9J3RhYmxlU2VhcmNoTEEnO3Rvb2xzLmlubmVySFRNTD0nPGlucHV0IHR5cGU9InNlYXJjaCIgYXJpYS1sYWJlbD0iQnVzY2FyIGVuIGVzdGEgdGFibGEiIHBsYWNlaG9sZGVyPSJCdXNjYXIgZW4gZXN0YSB0YWJsYeKApiI+PHNwYW4+TGEgYsO6c3F1ZWRhIHZpc3VhbCBubyBjYW1iaWEgbG9zIHRvdGFsZXMgbmkgbGEgZXhwb3J0YWNpw7NuLjwvc3Bhbj4nOwogICBob3N0LmJlZm9yZSh0b29scyk7dG9vbHMucXVlcnlTZWxlY3RvcignaW5wdXQnKS5vbmlucHV0PWU9Pntjb25zdCBxPWUudGFyZ2V0LnZhbHVlLnRyaW0oKS50b0xvY2FsZUxvd2VyQ2FzZSgnZXMnKTtyb3dzLmZvckVhY2gocj0+ci5oaWRkZW49ISFxJiYhci50ZXh0Q29udGVudC50b0xvY2FsZUxvd2VyQ2FzZSgnZXMnKS5pbmNsdWRlcyhxKSk7fTsKICB9CiAgWy4uLnRhYmxlLnRIZWFkLnJvd3NbMF0uY2VsbHNdLmZvckVhY2goKHRoLGluZGV4KT0+ewogICBpZih0aC5vbmNsaWNrKXJldHVybjt0aC50YWJJbmRleD0wO3RoLnRpdGxlPSdPcmRlbmFyIHBvciAnK3RoLnRleHRDb250ZW50LnRyaW0oKTt0aC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc29ydCcsJ25vbmUnKTsKICAgZnVuY3Rpb24gc29ydFJvd3MoKXtjb25zdCBhc2NlbmRpbmc9dGguZ2V0QXR0cmlidXRlKCdhcmlhLXNvcnQnKSE9PSdhc2NlbmRpbmcnO1suLi50YWJsZS50SGVhZC5yb3dzWzBdLmNlbGxzXS5mb3JFYWNoKGM9PmMuc2V0QXR0cmlidXRlKCdhcmlhLXNvcnQnLCdub25lJykpO3RoLnNldEF0dHJpYnV0ZSgnYXJpYS1zb3J0Jyxhc2NlbmRpbmc/J2FzY2VuZGluZyc6J2Rlc2NlbmRpbmcnKTsKICAgIGNvbnN0IHNvcnRlZD1yb3dzLm1hcCgocm93LHBvc2l0aW9uKT0+KHtyb3cscG9zaXRpb24sdmFsdWU6c29ydGFibGVWYWx1ZUxBKHJvdy5jZWxsc1tpbmRleF0/LnRleHRDb250ZW50fHwnJyl9KSkuc29ydCgoYSxiKT0+e2NvbnN0IHJlc3VsdD1hLnZhbHVlLm51bWJlciE9bnVsbCYmYi52YWx1ZS5udW1iZXIhPW51bGw/YS52YWx1ZS5udW1iZXItYi52YWx1ZS5udW1iZXI6KGEudmFsdWUudGV4dD8/U3RyaW5nKGEudmFsdWUubnVtYmVyKSkubG9jYWxlQ29tcGFyZShiLnZhbHVlLnRleHQ/P1N0cmluZyhiLnZhbHVlLm51bWJlciksJ2VzJyx7bnVtZXJpYzp0cnVlfSk7cmV0dXJuKGFzY2VuZGluZz9yZXN1bHQ6LXJlc3VsdCl8fGEucG9zaXRpb24tYi5wb3NpdGlvbjt9KTsKICAgIHNvcnRlZC5mb3JFYWNoKCh7cm93fSk9PnRhYmxlLnRCb2RpZXNbMF0uYXBwZW5kQ2hpbGQocm93KSk7fQogICB0aC5vbmNsaWNrPXNvcnRSb3dzO3RoLm9ua2V5ZG93bj1lPT57aWYoZS5rZXk9PT0nRW50ZXInfHxlLmtleT09PScgJyl7ZS5wcmV2ZW50RGVmYXVsdCgpO3NvcnRSb3dzKCk7fX07CiAgfSk7CiB9KTsKfQpmdW5jdGlvbiBjb21wYXJpc29uTm9ybWFsaXplZExBKCl7CiBpZih0YWIhPT0nQ29tcGFyYXRpdm9zJylyZXR1cm47CiBjb25zdCBib3g9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBhcmlzb25DaGFydHNWMjInKTtpZighYm94KXJldHVybjsKIHZpZXdTdGF0ZS5jb21wYXJlVW5pdHM/Pz0ndG90YWwnOwogYm94LmNsYXNzTGlzdC5hZGQoJ25vcm1hbGl6YXRpb25MQScpO2JveC5xdWVyeVNlbGVjdG9yKCcubGFiZWxlZGxlZ2VuZCcpLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlYmVnaW4nLGA8ZGl2IGNsYXNzPSJ2aWV3Y29udHJvbHMiPjxsYWJlbD5Nb3N0cmFyIGdyw6FmaWNvIHBvcjxzZWxlY3QgaWQ9ImNvbXBhcmVVbml0c0xBIj48b3B0aW9uIHZhbHVlPSJ0b3RhbCI+VG90YWwgZGVsIHBlcsOtb2RvPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iZGF5Ij5Ew61hIGNvbiByZWdpc3Ryb3M8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJtYWNoaW5lRGF5Ij5Nw6FxdWluYS1kw61hIHJlZ2lzdHJhZGE8L29wdGlvbj48L3NlbGVjdD48L2xhYmVsPjwvZGl2PmApOwogJCgnI2NvbXBhcmVVbml0c0xBJykudmFsdWU9dmlld1N0YXRlLmNvbXBhcmVVbml0czskKCcjY29tcGFyZVVuaXRzTEEnKS5vbmNoYW5nZT1lPT57dmlld1N0YXRlLmNvbXBhcmVVbml0cz1lLnRhcmdldC52YWx1ZTtyZW5kZXIoKTt9OwogY29uc3QgdW5pdD12aWV3U3RhdGUuY29tcGFyZVVuaXRzO2lmKHVuaXQ9PT0ndG90YWwnKXJldHVybjsKIGNvbnN0IGVudHJpZXM9WydBJywnQiddLm1hcChzY29wZT0+e2NvbnN0IHM9dmlld1N0YXRlW3Njb3BlXSxyb3dzPXNsaWNlUm93cyhzLmZpbHRlcnMscy5mcm9tLHMudG8pLHRvdGFsPWFnZyhyb3dzKSxkZW5vbWluYXRvcj11bml0PT09J2RheSc/bmV3IFNldChyb3dzLm1hcChyPT5yWzBdKSkuc2l6ZTp0b3RhbC5kYXlzO3JldHVybntzY29wZSxuYW1lOnMubmFtZSxwZXJpb2Q6c2VsZWN0ZWREYXRlVGV4dFY4KHNjb3BlKSx0b3RhbDp7Y29pbjpkZW5vbWluYXRvcj90b3RhbC5jb2luL2Rlbm9taW5hdG9yOjAsd2luOmRlbm9taW5hdG9yP3RvdGFsLndpbi9kZW5vbWluYXRvcjowfX07fSk7CiBjb25zdCBob3N0PWJveC5xdWVyeVNlbGVjdG9yKCcuY2hhcnRzY3JvbGwnKTtob3N0Lm91dGVySFRNTD1jb21wYXJpc29uQ29tYmluZWRWMjIoZW50cmllcyk7CiBib3gucXVlcnlTZWxlY3RvcignaDInKS50ZXh0Q29udGVudD0nQ29pbiBJbiB5IFdpbiDCtyAnKyh1bml0PT09J2RheSc/J3BvciBkw61hIGNvbiByZWdpc3Ryb3MnOidwb3IgbcOhcXVpbmEtZMOtYSByZWdpc3RyYWRhJyk7CiBjb25zdCBzdmc9Ym94LnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpO3N2Zy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLGJveC5xdWVyeVNlbGVjdG9yKCdoMicpLnRleHRDb250ZW50KTtzdmcucXVlcnlTZWxlY3RvcigndGV4dCcpLnRleHRDb250ZW50PSdDTFAgLyAnKyh1bml0PT09J2RheSc/J2TDrWEgY29uIHJlZ2lzdHJvcyc6J23DoXF1aW5hLWTDrWEgcmVnaXN0cmFkYScpOwogYm94LnF1ZXJ5U2VsZWN0b3IoJy5zaWduYWxub3RlJykudGV4dENvbnRlbnQ9J0VsIGdyw6FmaWNvIGRpdmlkZSBjYWRhIHNlbGVjY2nDs24gcG9yIHN1cyAnKyh1bml0PT09J2RheSc/J2TDrWFzIGRpc3RpbnRvcyBjb24gcmVnaXN0cm9zJzonY29tYmluYWNpb25lcyDDum5pY2FzIGRlIG3DoXF1aW5hIHkgZmVjaGEnKSsnLiBMYSB0YWJsYSBjb25zZXJ2YSBsb3MgdG90YWxlcyB5IGxvcyBpbmRpY2Fkb3JlcyBkaWFyaW9zLiBDZXJvIGV4cG9zaWNpw7NuIHNlIHJlcHJlc2VudGEgY29tbyBjZXJvIGVuIGVsIGdyw6FmaWNvOyByZXZpc2EgbG9zIHJlZ2lzdHJvcyBkZSBjYWRhIHNlbGVjY2nDs24uJzsKIC8vIEV4aXN0aW5nIFBORyBoYW5kbGVycyByZWZlcmVuY2UgdGhlIHJlcGxhY2VkIFNWRzogcmVwbGFjZSBqdXN0IHRoZWlyIHRvb2xiYXJzIGFuZCBiaW5kIGFnYWluLgogYm94LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jaGFydFRvb2xzVjgnKS5mb3JFYWNoKGVsPT5lbC5yZW1vdmUoKSk7CiBjb25zdCBsb2NhbD1ib3gucXVlcnlTZWxlY3RvcignLmNoYXJ0c2Nyb2xsJyk7bG9jYWwuZGF0YXNldC5ub3JtYWxpemVkTGE9J3RydWUnOwogY29uc3QgYmFyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO2Jhci5jbGFzc05hbWU9J2NoYXJ0VG9vbHNWOCc7YmFyLmlubmVySFRNTD0nPGJ1dHRvbj5Db3BpYXIgaW1hZ2VuPC9idXR0b24+PGJ1dHRvbj5EZXNjYXJnYXIgUE5HPC9idXR0b24+PHNwYW4gcm9sZT0ic3RhdHVzIj48L3NwYW4+Jztsb2NhbC5iZWZvcmUoYmFyKTsKIGNvbnN0IFtjb3B5LHNhdmVdPWJhci5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKSxzdGF0dXM9YmFyLnF1ZXJ5U2VsZWN0b3IoJ3NwYW4nKSx0aXRsZT1ib3gucXVlcnlTZWxlY3RvcignaDInKS50ZXh0Q29udGVudCxsZWdlbmQ9Ym94LnF1ZXJ5U2VsZWN0b3IoJy5sYWJlbGVkbGVnZW5kJykudGV4dENvbnRlbnQ7CiBzYXZlLm9uY2xpY2s9YXN5bmMoKT0+e3RyeXtkb3dubG9hZEJsb2JWOChhd2FpdCBjaGFydFBuZ1Y4KHN2Zyx0aXRsZSxsZWdlbmQpLCdMQS1jb21wYXJhdGl2by5wbmcnKTtzdGF0dXMudGV4dENvbnRlbnQ9J0Rlc2NhcmdhZG8nO31jYXRjaChlKXtzdGF0dXMudGV4dENvbnRlbnQ9ZS5tZXNzYWdlO319OwogY29weS5vbmNsaWNrPWFzeW5jKCk9Pnt0cnl7Y29uc3QgYmxvYj1hd2FpdCBjaGFydFBuZ1Y4KHN2Zyx0aXRsZSxsZWdlbmQpO2lmKCFuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZXx8dHlwZW9mIENsaXBib2FyZEl0ZW09PT0ndW5kZWZpbmVkJyl7ZG93bmxvYWRCbG9iVjgoYmxvYiwnTEEtY29tcGFyYXRpdm8ucG5nJyk7c3RhdHVzLnRleHRDb250ZW50PSdJbWFnZW4gZGVzY2FyZ2FkYSc7cmV0dXJuO31hd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlKFtuZXcgQ2xpcGJvYXJkSXRlbSh7J2ltYWdlL3BuZyc6YmxvYn0pXSk7c3RhdHVzLnRleHRDb250ZW50PSdDb3BpYWRvJzt9Y2F0Y2goZSl7c3RhdHVzLnRleHRDb250ZW50PWUubWVzc2FnZTt9fTsKfQpmdW5jdGlvbiBhbGVydFNldHRpbmdzTEEoKXt2aWV3U3RhdGUuYWxlcnRzPz89e2RheXM6NyxlbmQ6ZGF0ZUV4dGVudExBKGRhdGEucm93cykubGFzdCxncm91cDonOScsbWV0cmljOidjZCcsdGhyZXNob2xkOjE1LG1pbkRheXM6Myxvbmx5RHJvcHM6dHJ1ZSxmaWx0ZXJzOnt9fTtyZXR1cm4gdmlld1N0YXRlLmFsZXJ0czt9CmxldCBhbGVydFJlcG9ydExBPW51bGw7CmZ1bmN0aW9uIHJlbmRlckFsZXJ0c0xBKCl7CiBjb25zdCBzPWFsZXJ0U2V0dGluZ3NMQSgpLHJlcG9ydD1idWlsZEFsZXJ0c0xBKGRhdGEucm93cyxzKTthbGVydFJlcG9ydExBPXJlcG9ydDsKIGNvbnN0IHZpc2libGU9cmVwb3J0LmVudHJpZXMuZmlsdGVyKGc9PiFzLm9ubHlEcm9wc3x8Zy5zdGF0dXM9PT0nZHJvcCcpLHc9cmVwb3J0LndpbmRvd3M7CiBkb2N1bWVudC5ib2R5LmRhdGFzZXQudmlldz10YWI7JCgnI3RpdGxlJykudGV4dENvbnRlbnQ9J0FsZXJ0YXMgZGUgcmVuZGltaWVudG8nO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5maWx0ZXJzJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7JCgnI2NvbnRyb2xzJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7CiBleHBvcnRSb3dzPVtbJ0dydXBvJywnRXN0YWRvJywnTW90aXZvJywnVmFsb3IgYW50ZXJpb3InLCdWYWxvciBhY3R1YWwnLCdWYXJpYWNpw7NuICUnLCdEw61hcyBhbnRlcmlvcmVzJywnRMOtYXMgYWN0dWFsZXMnLCdNw6FxdWluYXMtZMOtYSBhbnRlcmlvcmVzJywnTcOhcXVpbmFzLWTDrWEgYWN0dWFsZXMnXSwuLi52aXNpYmxlLm1hcChnPT5bZy5uYW1lLGcuc3RhdHVzLGcucmVhc29uLGcub2xkPz8nJyxnLnZhbHVlPz8nJyxnLmNoYW5nZT8/JycsZy5kYXlzQSxnLmRheXNCLGcubWFjaGluZURheXNBLGcubWFjaGluZURheXNCXSldOwogJCgnI2NvbnRlbnQnKS5pbm5lckhUTUw9YmFubmVyKCdEZXRlY3RhciBjYcOtZGFzIGNvbiBjb250ZXh0bycsJ0NvbXBhcmEgdmVudGFuYXMgZGUgaWd1YWwgZHVyYWNpw7NuIGNvbiBtw6l0cmljYXMgcG9yIG3DoXF1aW5hLWTDrWEuIExhIGNvYmVydHVyYSBkZSByZWdpc3Ryb3Mgc2UgbXVlc3RyYSBhbnRlcyBkZSBpbnRlcnByZXRhciB1bmEgY2HDrWRhLicpK2A8c2VjdGlvbiBjbGFzcz0iY2FyZCIgaWQ9ImFsZXJ0Q29uZmlnTEEiPjxkaXYgY2xhc3M9ImFsZXJ0U2V0dGluZ3NMQSI+JHtzZWxlY3RvcignVmVudGFuYSBkZSBkw61hcycsJ2FsZXJ0RGF5c0xBJyxzLmRheXMsezc6JzcgZMOtYXMnLDE0OicxNCBkw61hcycsMjg6JzI4IGTDrWFzJ30pfTxsYWJlbD5IYXN0YTxpbnB1dCB0eXBlPSJkYXRlIiBpZD0iYWxlcnRFbmRMQSIgdmFsdWU9IiR7cy5lbmR9Ij48L2xhYmVsPiR7c2VsZWN0b3IoJ0FncnVwYXInLCdhbGVydEdyb3VwTEEnLHMuZ3JvdXAsezk6J0JhbmNvJywxOidNw6FxdWluYSd9KX0ke3NlbGVjdG9yKCdJbmRpY2Fkb3InLCdhbGVydE1ldHJpY0xBJyxzLm1ldHJpYyx7Y2Q6J0NvaW4gSW4gLyBtw6FxdWluYS1kw61hJyx3ZDonV2luIC8gbcOhcXVpbmEtZMOtYScsc2Q6J1NwaW5zIC8gbcOhcXVpbmEtZMOtYSd9KX08bGFiZWw+VW1icmFsIGRlIGNhw61kYSAoJSk8aW5wdXQgaWQ9ImFsZXJ0VGhyZXNob2xkTEEiIHR5cGU9Im51bWJlciIgbWluPSIxIiBtYXg9IjEwMCIgdmFsdWU9IiR7cy50aHJlc2hvbGR9Ij48L2xhYmVsPjxsYWJlbD5Nw61uaW1vIGRlIGTDrWFzIHBvciBncnVwbzxpbnB1dCBpZD0iYWxlcnRNaW5MQSIgdHlwZT0ibnVtYmVyIiBtaW49IjEiIG1heD0iJHtzLmRheXN9IiB2YWx1ZT0iJHtzLm1pbkRheXN9Ij48L2xhYmVsPjwvZGl2PjxkaXYgY2xhc3M9ImZpbHRlcmdyaWQiIHN0eWxlPSJtYXJnaW4tdG9wOjE0cHgiPiR7ZmlsdGVyRmllbGRzKHMsJ2FsZXJ0cycsWzIsMyw1LDddKX08L2Rpdj48YnV0dG9uIGNsYXNzPSJwcmltYXJ5IiBpZD0iYWxlcnRBcHBseUxBIiBzdHlsZT0ibWFyZ2luLXRvcDoxNHB4Ij5BcGxpY2FyIHVtYnJhbCB5IGZlY2hhPC9idXR0b24+PC9zZWN0aW9uPjxkaXYgY2xhc3M9ImNvbXBhcmlzb25Ob3RlIj5BY3R1YWw6ICR7ZGlzcGxheURhdGVzVjUody5mcm9tKX0g4oaSICR7ZGlzcGxheURhdGVzVjUody50byl9IMK3ICR7cmVwb3J0LmN1cnJlbnREYXlzfS8ke3MuZGF5c30gZMOtYXMgY29uIGRhdG9zIGVuIGxhIHNlbGVjY2nDs24uPGJyPkFudGVyaW9yOiAke2Rpc3BsYXlEYXRlc1Y1KHcucHJldmlvdXNGcm9tKX0g4oaSICR7ZGlzcGxheURhdGVzVjUody5wcmV2aW91c1RvKX0gwrcgJHtyZXBvcnQucHJldmlvdXNEYXlzfS8ke3MuZGF5c30gZMOtYXMgY29uIGRhdG9zLjwvZGl2PjxkaXYgY2xhc3M9ImtwaXMiPiR7c3RhdENhcmRzKFtbJ0FMRVJUQVMnLHJlcG9ydC5lbnRyaWVzLmZpbHRlcihnPT5nLnN0YXR1cz09PSdkcm9wJykubGVuZ3RoLCdDYcOtZGEgZGUgYWwgbWVub3MgJytzLnRocmVzaG9sZCsnJSBvIFdpbiBkaWFyaW8gbmVnYXRpdm8nXSxbJ1NJTiBDT01QQVJBQ0nDk04nLHJlcG9ydC5lbnRyaWVzLmZpbHRlcihnPT5nLnN0YXR1cz09PSdpbmZvJykubGVuZ3RoLCdTaW4gYmFzZSBwb3NpdGl2YSwgcmVnaXN0cm9zIG8gY29iZXJ0dXJhIHN1ZmljaWVudGUnXSxbJ0dSVVBPUycscmVwb3J0LmVudHJpZXMubGVuZ3RoLCdDb24gcmVnaXN0cm9zIGVuIGFsZ3VuYSBkZSBsYXMgZG9zIHZlbnRhbmFzJ11dKS5yZXBsYWNlKC9ePGRpdiBjbGFzcz0ia3BpcyI+fDxcL2Rpdj4kL2csJycpfTwvZGl2PjxzZWN0aW9uIGNsYXNzPSJjYXJkIj48aDI+UmVzdWx0YWRvcyBwb3IgJHtkaW1zW3MuZ3JvdXBdfTwvaDI+PGxhYmVsIHN0eWxlPSJmbGV4LWRpcmVjdGlvbjpyb3c7YWxpZ24taXRlbXM6Y2VudGVyIj48aW5wdXQgaWQ9ImFsZXJ0T25seUxBIiB0eXBlPSJjaGVja2JveCIgJHtzLm9ubHlEcm9wcz8nY2hlY2tlZCc6Jyd9Pk1vc3RyYXIgc29sbyBhbGVydGFzPC9sYWJlbD48ZGl2IGNsYXNzPSJ0YWJsZXdyYXAiPjx0YWJsZT48dGhlYWQ+PHRyPiR7ZXhwb3J0Um93c1swXS5tYXAoaD0+YDx0aD4ke2VzYyhoKX08L3RoPmApLmpvaW4oJycpfTwvdHI+PC90aGVhZD48dGJvZHk+JHt2aXNpYmxlLm1hcChnPT5gPHRyPjx0ZD4ke2VzYyhnLm5hbWUpfTwvdGQ+PHRkPjxzcGFuIGNsYXNzPSJhbGVydEJhZGdlTEEgJHtnLnN0YXR1c30iPiR7Zy5zdGF0dXM9PT0nZHJvcCc/J1JldmlzYXInOmcuc3RhdHVzPT09J29rJz8nU2luIGNhw61kYSc6J1NpbiBjb21wYXJhY2nDs24nfTwvc3Bhbj48L3RkPjx0ZD4ke2VzYyhnLnJlYXNvbil9PC90ZD48dGQ+JHtmbXQoZy5vbGQscy5tZXRyaWMpfTwvdGQ+PHRkPiR7Zm10KGcudmFsdWUscy5tZXRyaWMpfTwvdGQ+PHRkPiR7Zy5jaGFuZ2U9PW51bGw/J+KAlCc6Zy5jaGFuZ2UudG9Mb2NhbGVTdHJpbmcoJ2VzLUNMJyx7bWF4aW11bUZyYWN0aW9uRGlnaXRzOjF9KSsnJSd9PC90ZD48dGQ+JHtnLmRheXNBfTwvdGQ+PHRkPiR7Zy5kYXlzQn08L3RkPjx0ZD4ke2cubWFjaGluZURheXNBfTwvdGQ+PHRkPiR7Zy5tYWNoaW5lRGF5c0J9PC90ZD48L3RyPmApLmpvaW4oJycpfHwnPHRyPjx0ZCBjb2xzcGFuPSIxMCI+U2luIGFsZXJ0YXMgY29uIGxvcyBjcml0ZXJpb3MgYWN0dWFsZXMuIERlc21hcmNhIMKrTW9zdHJhciBzb2xvIGFsZXJ0YXPCuyBwYXJhIHJldmlzYXIgbGEgY29iZXJ0dXJhIGRlIHRvZG9zIGxvcyBncnVwb3MuPC90ZD48L3RyPid9PC90Ym9keT48L3RhYmxlPjwvZGl2PjxwIGNsYXNzPSJzaWduYWxub3RlIj5VbmEgYWxlcnRhIGVzIHVuYSBzZcOxYWwgZGUgcmV2aXNpw7NuLCBubyB1bmEgZXhwbGljYWNpw7NuIGRlIHN1IGNhdXNhLiBObyBzZSBjb25zaWRlcmEgY2VybyB1biBwZXLDrW9kbyBzaW4gcmVnaXN0cm9zLiBMb3MgY2FtYmlvcyBkZSB1YmljYWNpw7NuIHNlIGludGVycHJldGFuIHNlZ8O6biBsYSB1YmljYWNpw7NuIGhpc3TDs3JpY2EgY2FyZ2FkYS4gVW4gV2luIG5lZ2F0aXZvIHNlIHNlw7FhbGEgYXVuIHNpbiByZWZlcmVuY2lhIGNvbXBhcmFibGUuPC9wPjwvc2VjdGlvbj5gOwogYmluZEZpbHRlcnMoKTtmb3IoY29uc3RbaWQsa2V5XW9mIFtbJ2FsZXJ0RGF5c0xBJywnZGF5cyddLFsnYWxlcnRHcm91cExBJywnZ3JvdXAnXSxbJ2FsZXJ0TWV0cmljTEEnLCdtZXRyaWMnXV0pJCgnIycraWQpLm9uY2hhbmdlPWU9PntzW2tleV09a2V5PT09J2RheXMnP051bWJlcihlLnRhcmdldC52YWx1ZSk6ZS50YXJnZXQudmFsdWU7cy5taW5EYXlzPU1hdGgubWluKHMubWluRGF5cyxzLmRheXMpO3JlbmRlcigpO307CiAkKCcjYWxlcnRBcHBseUxBJykub25jbGljaz0oKT0+e2NvbnN0IHRocmVzaG9sZD1OdW1iZXIoJCgnI2FsZXJ0VGhyZXNob2xkTEEnKS52YWx1ZSksbWluRGF5cz1OdW1iZXIoJCgnI2FsZXJ0TWluTEEnKS52YWx1ZSksZW5kPSQoJyNhbGVydEVuZExBJykudmFsdWU7aWYoIWVuZHx8dGhyZXNob2xkPDF8fHRocmVzaG9sZD4xMDB8fG1pbkRheXM8MXx8bWluRGF5cz5zLmRheXN8fCFOdW1iZXIuaXNJbnRlZ2VyKG1pbkRheXMpKXthbGVydCgnUmV2aXNhIGxhIGZlY2hhLCBlbCB1bWJyYWwgKDEgYSAxMDAlKSB5IGVsIG3DrW5pbW8gZGUgZMOtYXMuJyk7cmV0dXJuO31PYmplY3QuYXNzaWduKHMse3RocmVzaG9sZCxtaW5EYXlzLGVuZH0pO3JlbmRlcigpO307CiAkKCcjYWxlcnRPbmx5TEEnKS5vbmNoYW5nZT1lPT57cy5vbmx5RHJvcHM9ZS50YXJnZXQuY2hlY2tlZDtyZW5kZXIoKTt9OwogZm9sZENvbnRyb2xMQSgkKCcjYWxlcnRDb25maWdMQScpLCdhbGVydC1jb25maWcnLCdDb25maWd1cmFyIGFsZXJ0YXMgwrcgJytzLmRheXMrJyBkw61hcyDCtyBjYcOtZGEg4omlICcrcy50aHJlc2hvbGQrJyUgwrcgYWJyaXIgcGFyYSBjYW1iaWFyJyk7Cn0KYXN5bmMgZnVuY3Rpb24gb3BlbkJhY2t1cHNMQSgpewogaWYoYXBwU2Vzc2lvblYxNT8ucm9sZSE9PSdhZG1pbicpcmV0dXJuOwogY29uc3QgZGlhbG9nPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpYWxvZycpO2RpYWxvZy5jbGFzc05hbWU9J2V4cGVyaWVuY2VEaWFsb2dMQSc7ZGlhbG9nLmlubmVySFRNTD0nPGgyPlJlc3BhbGRvcyBkZSBtYXRyaWNlczwvaDI+PHA+U2UgY29uc2VydmFuIGxhcyB0cmVzIG1hdHJpY2VzIGFudGVyaW9yZXMuIENhZGEgYWN0dWFsaXphY2nDs24gZ3VhcmRhIGxhIG1hdHJpeiBhY3RpdmEgYW50ZXMgZGUgc3VzdGl0dWlybGE7IGxhIHByaW1lcmEgY2FyZ2Egbm8gdGllbmUgdW5hIHZlcnNpw7NuIHByZXZpYS48L3A+PHAgY2xhc3M9ImJhY2t1cFN0YXR1c0xBIj5Db25zdWx0YW5kbyByZXNwYWxkb3PigKY8L3A+PHVsIGNsYXNzPSJiYWNrdXBMaXN0TEEiPjwvdWw+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtYmFja3VwZG93bmxvYWQ+RGVzY2FyZ2FyIG1hdHJpeiBhY3R1YWwgKEpTT04pPC9idXR0b24+IDxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLWJhY2t1cGNsb3NlPkNlcnJhcjwvYnV0dG9uPic7CiBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpYWxvZyk7ZGlhbG9nLnNob3dNb2RhbCgpO2RpYWxvZy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1iYWNrdXBjbG9zZV0nKS5vbmNsaWNrPSgpPT57ZGlhbG9nLmNsb3NlKCk7ZGlhbG9nLnJlbW92ZSgpO307CiBkaWFsb2cucXVlcnlTZWxlY3RvcignW2RhdGEtYmFja3VwZG93bmxvYWRdJykub25jbGljaz0oKT0+ZG93bmxvYWRCbG9iVjgobmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KGRhdGEpXSx7dHlwZTonYXBwbGljYXRpb24vanNvbid9KSwnTEEtbWF0cml6LXJlc3BhbGRvLmpzb24nKTsKIGNvbnN0IHN0YXR1cz1kaWFsb2cucXVlcnlTZWxlY3RvcignLmJhY2t1cFN0YXR1c0xBJyk7CiB0cnl7CiAgY29uc3QgYmFja3Vwcz1hd2FpdCBzdXBhYmFzZVJlcXVlc3RMQSgnL3Jlc3QvdjEvbGFfYmFja3Vwcz9zZWxlY3Q9aWQsY3JlYXRlZF9hdCxzb3VyY2VfdXBkYXRlZF9hdCxyb3dfY291bnQsc291cmNlX25hbWUmb3JkZXI9dmVyc2lvbl9zZXEuZGVzYyZsaW1pdD0zJyx7fSxhcHBTZXNzaW9uVjE1LnRva2VuKTsKICBzdGF0dXMudGV4dENvbnRlbnQ9YmFja3Vwcy5sZW5ndGg/J1Jlc3RhdXJhciByZWVtcGxhemEgbGEgbWF0cml6IGFjdGl2YSB5IGd1YXJkYSB1biByZXNwYWxkbyBkZSBsYSBxdWUgZXN0w6EgdXNhbmRvIGFob3JhLic6J0HDum4gbm8gaGF5IHZlcnNpb25lcyBhbnRlcmlvcmVzLiBFbCBzaWd1aWVudGUgY2FtYmlvIGRlIG1hdHJpeiBnZW5lcmFyw6EgZWwgcHJpbWVyIHJlc3BhbGRvLic7CiAgZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5iYWNrdXBMaXN0TEEnKS5pbm5lckhUTUw9YmFja3Vwcy5tYXAoYj0+YDxsaT48c3Bhbj48Yj4ke2VzYyhiLnNvdXJjZV9uYW1lfHwnTWF0cml6Jyl9PC9iPjxicj4ke2VzYyhmb3JtYXRVcGRhdGVMQShiLmNyZWF0ZWRfYXQpKX0gwrcgJHtmbXQoYi5yb3dfY291bnQpfSByZWdpc3Ryb3M8L3NwYW4+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtcmVzdG9yZWJhY2t1cD0iJHtiLmlkfSI+UmVzdGF1cmFyPC9idXR0b24+PC9saT5gKS5qb2luKCcnKTsKICBkaWFsb2cucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcmVzdG9yZWJhY2t1cF0nKS5mb3JFYWNoKGJ1dHRvbj0+YnV0dG9uLm9uY2xpY2s9YXN5bmMoKT0+ewogICBpZighY29uZmlybSgnwr9SZXN0YXVyYXIgZXN0YSBtYXRyaXogYW50ZXJpb3I/IExhIG1hdHJpeiBhY3R1YWwgcXVlZGFyw6EgcmVzcGFsZGFkYS4nKSlyZXR1cm47CiAgIGRpYWxvZy5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKS5mb3JFYWNoKGI9PmIuZGlzYWJsZWQ9dHJ1ZSk7c3RhdHVzLnRleHRDb250ZW50PSdSZXN0YXVyYW5kb+KApic7CiAgIHRyeXthd2FpdCBzdXBhYmFzZVJlcXVlc3RMQSgnL3Jlc3QvdjEvcnBjL2xhX3Jlc3RvcmVfYmFja3VwJyx7bWV0aG9kOidQT1NUJyxib2R5OkpTT04uc3RyaW5naWZ5KHtwX2JhY2t1cDpidXR0b24uZGF0YXNldC5yZXN0b3JlYmFja3VwLHBfcmV2aXNpb246ZGF0YS5zdG9yYWdlUmV2aXNpb259KX0sYXBwU2Vzc2lvblYxNS50b2tlbik7ZGF0YT1hd2FpdCBjYWNoZWQoKTtkaWFsb2cuY2xvc2UoKTtkaWFsb2cucmVtb3ZlKCk7aW5pdCgpO30KICAgY2F0Y2goZXJyb3Ipe3N0YXR1cy50ZXh0Q29udGVudD1lcnJvci5tZXNzYWdlO2RpYWxvZy5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKS5mb3JFYWNoKGI9PmIuZGlzYWJsZWQ9ZmFsc2UpO30KICB9KTsKIH1jYXRjaChlcnJvcil7c3RhdHVzLnRleHRDb250ZW50PWVycm9yLnN0YXR1cz09PTQwND8nRmFsdGEgZWplY3V0YXIgcmVzcGFsZG9zLXY1LnNxbCBlbiBTdXBhYmFzZS4gUHVlZGVzIGRlc2NhcmdhciB1bmEgY29waWEgSlNPTiBtaWVudHJhcyB0YW50by4nOmVycm9yLm1lc3NhZ2U7fQp9CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ25hdiBidXR0b25bZGF0YS10YWI9Ik1ldG9kb2xvZ8OtYSJdJykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmViZWdpbicsJzxidXR0b24gZGF0YS10YWI9IkFsZXJ0YXMiPuKakSAmbmJzcDsgQWxlcnRhczwvYnV0dG9uPicpOwpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCduYXYgYnV0dG9uW2RhdGEtdGFiPSJBbGVydGFzIl0nKS5vbmNsaWNrPSgpPT5hY3RpdmF0ZVRhYlYzKCdBbGVydGFzJyk7CmNvbnN0IGV4cG9ydEJlZm9yZUV4cGVyaWVuY2VMQT0kKCcjdjJleHBvcnQnKS5vbmNsaWNrOwokKCcjdjJleHBvcnQnKS5vbmNsaWNrPWZ1bmN0aW9uKCl7aWYodGFiIT09J0FsZXJ0YXMnKXJldHVybiBleHBvcnRCZWZvcmVFeHBlcmllbmNlTEEoKTtkb3dubG9hZEJsb2JWOCh3b3JrYm9va0Jsb2JWOChbe25hbWU6J0FsZXJ0YXMnLHJvd3M6ZXhwb3J0Um93c30se25hbWU6J0NvbmZpZ3VyYWNpb24nLHJvd3M6W1snUGFyw6FtZXRybycsJ1ZhbG9yJ10sLi4uT2JqZWN0LmVudHJpZXMoYWxlcnRTZXR0aW5nc0xBKCkpLm1hcCgoW2ssdl0pPT5bayx0eXBlb2Ygdj09PSdvYmplY3QnP0pTT04uc3RyaW5naWZ5KHYpOnZdKSxbJ1ZlbnRhbmFzJyxKU09OLnN0cmluZ2lmeShhbGVydFJlcG9ydExBLndpbmRvd3MpXSxbJ1VuaWRhZGVzJywnQ0xQIG8gc3BpbnMgcG9yIG3DoXF1aW5hLWTDrWEgcmVnaXN0cmFkYSwgc2Vnw7puIGluZGljYWRvciddXX1dKSwnTEEtYWxlcnRhcy54bHN4Jyk7fTsKY29uc3QgcmVuZGVyQmVmb3JlRXhwZXJpZW5jZUxBPXJlbmRlcjsKcmVuZGVyPWZ1bmN0aW9uKCl7CiBpZihkYXRhJiZ0YWI9PT0nQWxlcnRhcycpe2Nsb3NlU3BhbmlzaENhbGVuZGFyTEEoZmFsc2UpO3JlbmRlckFsZXJ0c0xBKCk7Y29tcGFjdENvbnRyb2xzTEEoKTtkZWNvcmF0ZVNwYW5pc2hEYXRlc0xBKCk7fWVsc2UgcmVuZGVyQmVmb3JlRXhwZXJpZW5jZUxBKCk7CiBpZighZGF0YSlyZXR1cm47c2V0dXBFeHBlcmllbmNlSGVhZGVyTEEoKTsKIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXRhU3RhdHVzTEEnKT8ucmVtb3ZlKCk7Y29uc3Qgc3RhdHVzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO3N0YXR1cy5pZD0nZGF0YVN0YXR1c0xBJztzdGF0dXMuY2xhc3NOYW1lPSdkYXRhU3RhdHVzTEEnO3N0YXR1cy5pbm5lckhUTUw9ZGF0YVN0YXR1c0xBKCk7ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZGVyJykuYWZ0ZXIoc3RhdHVzKTsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb250ZW50IC5hY3RpdmVGaWx0ZXJzTEEnKT8ucmVtb3ZlKCk7JCgnI2NvbnRlbnQnKS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLGFjdGl2ZUZpbHRlcnNMQSgpKTtjb21wYXJpc29uTm9ybWFsaXplZExBKCk7ZW5oYW5jZVRhYmxlc0xBKCk7Cn07Cgpjb25zdCByZXNwb25zaXZlQ2hhcnRNb2RlbHNMQT1uZXcgTWFwKCk7CmZ1bmN0aW9uIGNoYXJ0VGlja0luZGV4ZXNMQShjb3VudCxzcGFjaW5nLG1pbmltdW0pewogaWYoY291bnQ8MilyZXR1cm4gY291bnQ/WzBdOltdOwogY29uc3Qgc3RlcD1NYXRoLm1heCgxLE1hdGguY2VpbChtaW5pbXVtL01hdGgubWF4KHNwYWNpbmcsMSkpKSxpbmRleGVzPVtdOwogZm9yKGxldCBpPTA7aTxjb3VudDtpKz1zdGVwKWluZGV4ZXMucHVzaChpKTsKIGlmKGluZGV4ZXMuYXQoLTEpIT09Y291bnQtMSl7aWYoaW5kZXhlcy5sZW5ndGg+MSYmKGNvdW50LTEtaW5kZXhlcy5hdCgtMSkpKnNwYWNpbmc8bWluaW11bSlpbmRleGVzLnBvcCgpO2luZGV4ZXMucHVzaChjb3VudC0xKTt9CiByZXR1cm4gaW5kZXhlczsKfQpmdW5jdGlvbiByZXNwb25zaXZlQ2hhcnRMYXlvdXRMQShtb2RlbCxyZXF1ZXN0ZWRXaWR0aCl7CiBjb25zdCB7c2VyaWVzLGtleSxkdWFsS2V5cyxpZH09bW9kZWwsY29sb3JzPVsnIzE2YTlhZScsJyM1NDdmYzUnLCcjNjdhNzgyJywnI2E1ODhjMicsJyNjNzhlNDUnLCcjZDY4MTc4JywnIzVhOWZhNCcsJyNhMmE4NjYnXTsKIGNvbnN0IHdpZHRoPU1hdGgubWF4KDI2MCxNYXRoLnJvdW5kKHJlcXVlc3RlZFdpZHRofHw2NDApKSxoZWlnaHQ9MzQwLGxlZnQ9d2lkdGg8MzgwPzQ5OjYwLHJpZ2h0PXdpZHRoLShkdWFsS2V5cz81NToyOCksdG9wPTU4LGJvdHRvbT0yMjU7CiBjb25zdCBsYWJlbHM9Wy4uLm5ldyBTZXQoc2VyaWVzLmZsYXRNYXAocz0+cy5wb2ludHMubWFwKHA9PnAubmFtZSkpKV0uc29ydCgpOwogY29uc3QgZW50cmllcz1sYWJlbHMubWFwKGxhYmVsPT57Y29uc3QgcG9pbnRzPXNlcmllcy5tYXAocz0+cy5wb2ludHMuZmluZChwPT5wLm5hbWU9PT1sYWJlbCkpO3JldHVybntwZXJpb2Q6cGVyaW9kRGVzY3JpcHRpb25WNChsYWJlbCxwb2ludHMuZmlsdGVyKEJvb2xlYW4pKSx2YWx1ZXM6cG9pbnRzLm1hcCgocCxpKT0+cD8uW2R1YWxLZXlzP2R1YWxLZXlzW2ldOmtleV0/P251bGwpfTt9KTsKIGNvbnN0IHZhbHVlcz1lbnRyaWVzLmZsYXRNYXAoZT0+ZS52YWx1ZXMpLmZpbHRlcih2PT52IT1udWxsJiZOdW1iZXIuaXNGaW5pdGUodikpLGNvbW1vbj17bG86TWF0aC5taW4oMCwuLi52YWx1ZXMpLGhpOk1hdGgubWF4KDEsLi4udmFsdWVzKX07CiBjb25zdCBzY2FsZXM9c2VyaWVzLm1hcCgocyxpKT0+e2lmKCFkdWFsS2V5cylyZXR1cm4gY29tbW9uO2NvbnN0IGxpc3Q9ZW50cmllcy5tYXAoZT0+ZS52YWx1ZXNbaV0pLmZpbHRlcih2PT52IT1udWxsJiZOdW1iZXIuaXNGaW5pdGUodikpO3JldHVybntsbzpNYXRoLm1pbigwLC4uLmxpc3QpLGhpOk1hdGgubWF4KC4wMDAwMDEsLi4ubGlzdCl9O30pOwogY29uc3Qgc3BhY2luZz1sYWJlbHMubGVuZ3RoPjE/KHJpZ2h0LWxlZnQpLyhsYWJlbHMubGVuZ3RoLTEpOnJpZ2h0LWxlZnQseD1qPT5sYWJlbHMubGVuZ3RoPT09MT8obGVmdCtyaWdodCkvMjpsZWZ0K2oqc3BhY2luZyx5PSh2LGkpPT5ib3R0b20tKHYtc2NhbGVzW2ldLmxvKS8oc2NhbGVzW2ldLmhpLXNjYWxlc1tpXS5sb3x8MSkqKGJvdHRvbS10b3ApOwogY29uc3QgdGV4dHM9ZW50cmllcy5tYXAoZT0+ZS5wZXJpb2QuZnVsbCsnIHwgJytzZXJpZXMubWFwKChzLGkpPT5zLm5hbWUrJzogJyt2YWx1ZVY0KGUudmFsdWVzW2ldLGR1YWxLZXlzP2R1YWxLZXlzW2ldOmtleSkpLmpvaW4oJyB8ICcpKTsKIGNoYXJ0UG9pbnRzVjQuc2V0KGlkLHRleHRzKTsKIGNvbnN0IG1heExhYmVsPU1hdGgubWF4KDQwLC4uLnZhbHVlcy5tYXAoKHYpPT5jb21wYWN0KHYsa2V5fHxkdWFsS2V5cz8uWzBdKS5sZW5ndGgqNisxNCkpOwogY29uc3QgdmlzaWJsZVZhbHVlcz1uZXcgU2V0KGNoYXJ0VGlja0luZGV4ZXNMQShsYWJlbHMubGVuZ3RoLHNwYWNpbmcsbWF4TGFiZWwpKTsKIGNvbnN0IGF4aXNJbmRleGVzPWNoYXJ0VGlja0luZGV4ZXNMQShsYWJlbHMubGVuZ3RoLHNwYWNpbmcsd2lkdGg8MzgwPzg1OjEwMCk7CiBjb25zdCBsYWJlbFBvc2l0aW9ucz1lbnRyaWVzLm1hcChlPT57CiAgY29uc3QgcG9zPWUudmFsdWVzLm1hcCgodixpKT0+dj09bnVsbD9udWxsOnkodixpKS0xMyk7CiAgaWYoc2VyaWVzLmxlbmd0aD09PTImJmUudmFsdWVzLmV2ZXJ5KHY9PnYhPW51bGwpJiZNYXRoLmFicyh5KGUudmFsdWVzWzBdLDApLXkoZS52YWx1ZXNbMV0sMSkpPDI4KXsKICAgY29uc3QgdXBwZXI9eShlLnZhbHVlc1swXSwwKTw9eShlLnZhbHVlc1sxXSwxKT8wOjEsbG93ZXI9MS11cHBlcjsKICAgcG9zW3VwcGVyXT15KGUudmFsdWVzW3VwcGVyXSx1cHBlciktMTU7cG9zW2xvd2VyXT15KGUudmFsdWVzW2xvd2VyXSxsb3dlcikrMjM7CiAgfQogIHJldHVybiBwb3M7CiB9KTsKIGNvbnN0IHRpY2tzPVswLC41LDFdLm1hcChmPT57Y29uc3QgY3k9Ym90dG9tLWYqKGJvdHRvbS10b3ApO3JldHVybiBgPGxpbmUgeDE9IiR7bGVmdH0iIHkxPSIke2N5fSIgeDI9IiR7cmlnaHR9IiB5Mj0iJHtjeX0iIHN0cm9rZT0idmFyKC0tcGxvdGdyaWQpIiBzdHJva2UtZGFzaGFycmF5PSIzIDQiLz48dGV4dCB4PSIke2xlZnQtOH0iIHk9IiR7Y3krNH0iIHRleHQtYW5jaG9yPSJlbmQiIGZvbnQtc2l6ZT0iMTAiIGZpbGw9InZhcigtLXBsb3R0ZXh0KSI+JHtlc2MoY29tcGFjdChzY2FsZXNbMF0ubG8rZiooc2NhbGVzWzBdLmhpLXNjYWxlc1swXS5sbyksZHVhbEtleXM/ZHVhbEtleXNbMF06a2V5KSl9PC90ZXh0PiR7ZHVhbEtleXM/YDx0ZXh0IHg9IiR7cmlnaHQrOH0iIHk9IiR7Y3krNH0iIGZvbnQtc2l6ZT0iMTAiIGZpbGw9InZhcigtLXBsb3R0ZXh0KSI+JHtlc2MoY29tcGFjdChzY2FsZXNbMV0ubG8rZiooc2NhbGVzWzFdLmhpLXNjYWxlc1sxXS5sbyksZHVhbEtleXNbMV0pKX08L3RleHQ+YDonJ31gO30pLmpvaW4oJycpOwogY29uc3QgbGluZXM9c2VyaWVzLm1hcCgocyxpKT0+ewogIGNvbnN0IG1ldHJpYz1kdWFsS2V5cz9kdWFsS2V5c1tpXTprZXksdmFsaWQ9ZW50cmllcy5tYXAoKGUsaik9Pih7ZSxqfSkpLmZpbHRlcigoe2V9KT0+ZS52YWx1ZXNbaV0hPW51bGwpOwogIGNvbnN0IGNvbG9yPWo9PlsncG8nLCdwb24nLCdkZXYnLCdiZXQnLCdwcml6ZScsJ3Byb21vJywnb2NjJ10uaW5jbHVkZXMobWV0cmljKT9jb2xvcnNbaSVjb2xvcnMubGVuZ3RoXTpwb2ludENvbG9yVjYoZW50cmllcyxqLGksbWV0cmljKTsKICByZXR1cm4gYDxwb2x5bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiR7Y29sb3JzW2klY29sb3JzLmxlbmd0aF19IiBzdHJva2Utd2lkdGg9IjIuNSIgJHtpPT09MT8nc3Ryb2tlLWRhc2hhcnJheT0iNyAzIic6Jyd9IHBvaW50cz0iJHt2YWxpZC5tYXAoKHtlLGp9KT0+YCR7eChqKX0sJHt5KGUudmFsdWVzW2ldLGkpfWApLmpvaW4oJyAnKX0iLz4ke3ZhbGlkLm1hcCgoe2Usan0pPT5gPGNpcmNsZSBjeD0iJHt4KGopfSIgY3k9IiR7eShlLnZhbHVlc1tpXSxpKX0iIHI9IiR7c3BhY2luZzwxOD8zOjV9IiBmaWxsPSIke2NvbG9yKGopfSIgc3Ryb2tlPSJ2YXIoLS1wbG90YmcpIiBzdHJva2Utd2lkdGg9IjEuNSIgdGFiaW5kZXg9IjAiIHJvbGU9ImJ1dHRvbiIgZGF0YS1jaGFydHY0PSIke2lkfSIgZGF0YS1wb2ludHY0PSIke2p9IiBhcmlhLWxhYmVsPSIke2VzYyh0ZXh0c1tqXSl9Ij48dGl0bGU+JHtlc2ModGV4dHNbal0pfTwvdGl0bGU+PC9jaXJjbGU+JHtzZXJpZXMubGVuZ3RoPD0yJiZ2aXNpYmxlVmFsdWVzLmhhcyhqKT9gPHRleHQgZGF0YS12YWx1ZS1sYWJlbC1sYT0iJHtqfS0ke2l9IiB4PSIke3goail9IiB5PSIke2xhYmVsUG9zaXRpb25zW2pdW2ldfSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMSIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iJHtjb2xvcihqKX0iPiR7ZXNjKGNvbXBhY3QoZS52YWx1ZXNbaV0sbWV0cmljKSl9PC90ZXh0PmA6Jyd9YCkuam9pbignJyl9YDsKIH0pLmpvaW4oJycpOwogY29uc3QgcGVyaW9kcz1heGlzSW5kZXhlcy5tYXAoaj0+e2NvbnN0IGU9ZW50cmllc1tqXSxhbmNob3I9aj09PTA/J3N0YXJ0JzpqPT09ZW50cmllcy5sZW5ndGgtMT8nZW5kJzonbWlkZGxlJztyZXR1cm4gYDx0ZXh0IHg9IiR7eChqKX0iIHk9IjI2NyIgdGV4dC1hbmNob3I9IiR7YW5jaG9yfSIgZm9udC1zaXplPSIxMSIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0idmFyKC0tcGxvdHRleHQpIj4ke2F4aXNQZXJpb2RWMTQoZS5wZXJpb2QubGFiZWwpLnJlcGxhY2UoJ3g9IjAiJywneD0iJyt4KGopKyciJyl9PC90ZXh0Pjx0ZXh0IHg9IiR7eChqKX0iIHk9IjMxMCIgdGV4dC1hbmNob3I9IiR7YW5jaG9yfSIgZm9udC1zaXplPSI5LjUiIGZpbGw9InZhcigtLXBsb3R0ZXh0KSI+JHtlc2MoYXhpc0RhdGVzVjE0KGUucGVyaW9kLnJhbmdlKSl9PC90ZXh0PmA7fSkuam9pbignJyk7CiByZXR1cm57d2lkdGgsaGVpZ2h0LGlubmVyOnRpY2tzK2xpbmVzK3BlcmlvZHMsbGFiZWxQb3NpdGlvbnMsdmlzaWJsZVZhbHVlczpbLi4udmlzaWJsZVZhbHVlc10sYXhpc0luZGV4ZXMsZW50cmllc307Cn0KY29uc3QgbGFiZWxlZENoYXJ0QmVmb3JlUmVzcG9uc2l2ZUxBPWxhYmVsZWRDaGFydFY0OwpsYWJlbGVkQ2hhcnRWND1mdW5jdGlvbihzZXJpZXMsa2V5LGR1YWxLZXlzPW51bGwpewogY29uc3QgaHRtbD1sYWJlbGVkQ2hhcnRCZWZvcmVSZXNwb25zaXZlTEEoc2VyaWVzLGtleSxkdWFsS2V5cyksaWQ9aHRtbC5tYXRjaCgvaWQ9IihjaGFydHY0LVxkKykiLyk/LlsxXTsKIGlmKCFpZClyZXR1cm4gaHRtbDtyZXNwb25zaXZlQ2hhcnRNb2RlbHNMQS5zZXQoaWQse3NlcmllcyxrZXksZHVhbEtleXMsaWR9KTsKIHJldHVybiBodG1sLnJlcGxhY2UoJzxkaXYgY2xhc3M9ImNoYXJ0c2Nyb2xsIj4nLCc8ZGl2IGNsYXNzPSJjaGFydHNjcm9sbCByZXNwb25zaXZlQ2hhcnRMQSIgZGF0YS1yZXNwb25zaXZlLWNoYXJ0LWxhPSInK2lkKyciPicpOwp9OwpmdW5jdGlvbiBmaXRSZXNwb25zaXZlQ2hhcnRzTEEoKXsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXJlc3BvbnNpdmUtY2hhcnQtbGFdJykuZm9yRWFjaChob3N0PT57CiAgY29uc3QgaWQ9aG9zdC5kYXRhc2V0LnJlc3BvbnNpdmVDaGFydExhLG1vZGVsPXJlc3BvbnNpdmVDaGFydE1vZGVsc0xBLmdldChpZCksc3ZnPWhvc3QucXVlcnlTZWxlY3Rvcignc3ZnJyk7aWYoIW1vZGVsfHwhc3ZnKXJldHVybjsKICBpZihob3N0LmNsb3Nlc3QoJy5jYXJkJyk/LmhpZGRlbilyZXR1cm47CiAgY29uc3QgbWVhc3VyZWQ9aG9zdC5jbGllbnRXaWR0aHx8aG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/LigpLndpZHRofHw2NDA7CiAgY29uc3QgbGF5b3V0PXJlc3BvbnNpdmVDaGFydExheW91dExBKG1vZGVsLG1lYXN1cmVkKTsKICBpZihob3N0LmRhdGFzZXQuZml0V2lkdGhMYT09PVN0cmluZyhsYXlvdXQud2lkdGgpJiZzdmcuZGF0YXNldC5maXRMYSlyZXR1cm47CiAgaG9zdC5kYXRhc2V0LmZpdFdpZHRoTGE9U3RyaW5nKGxheW91dC53aWR0aCk7c3ZnLmRhdGFzZXQuZml0TGE9J3RydWUnO3N2Zy5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLGAwIDAgJHtsYXlvdXQud2lkdGh9ICR7bGF5b3V0LmhlaWdodH1gKTsKICBzdmcuc3R5bGUud2lkdGg9JzEwMCUnO3N2Zy5zdHlsZS5taW5XaWR0aD0nMCc7c3ZnLnN0eWxlLm1heFdpZHRoPScxMDAlJztzdmcuc3R5bGUuaGVpZ2h0PWxheW91dC5oZWlnaHQrJ3B4Jztzdmcuc2V0QXR0cmlidXRlKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywneE1pZFlNaWQgbWVldCcpO3N2Zy5pbm5lckhUTUw9bGF5b3V0LmlubmVyOwogIGNvbnN0IHJlYWRvdXQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO2lmKHJlYWRvdXQpcmVhZG91dC50ZXh0Q29udGVudD0nR3LDoWZpY28gY29tcGxldG8gYWp1c3RhZG8gYWwgYW5jaG8uIFRvY2EgbyBlbmZvY2EgdW4gcHVudG8gcGFyYSB2ZXIgc3UgcGVyw61vZG8geSB0b2RvcyBsb3MgdmFsb3Jlcy4gRW4gc2VsZWNjaW9uZXMgZXh0ZW5zYXMgc2UgZXNwYWNpYW4gbGFzIGV0aXF1ZXRhczsgbGEgdGFibGEgY29uc2VydmEgdG9kb3MgbG9zIGRhdG9zLic7CiAgY29uc3QgbGVnZW5kPWhvc3QuY2xvc2VzdCgnLmNhcmQnKT8ucXVlcnlTZWxlY3RvckFsbCgnLmxhYmVsZWRsZWdlbmQgaScpO2xlZ2VuZD8uZm9yRWFjaCgoaXRlbSxpKT0+aXRlbS5zdHlsZS5iYWNrZ3JvdW5kPVsnIzE2YTlhZScsJyM1NDdmYzUnLCcjNjdhNzgyJywnI2E1ODhjMicsJyNjNzhlNDUnLCcjZDY4MTc4JywnIzVhOWZhNCcsJyNhMmE4NjYnXVtpJThdKTsKIH0pOwp9CmxldCByZXNwb25zaXZlQ2hhcnRPYnNlcnZlckxBPW51bGw7CmlmKHR5cGVvZiBSZXNpemVPYnNlcnZlciE9PSd1bmRlZmluZWQnKXsKIHJlc3BvbnNpdmVDaGFydE9ic2VydmVyTEE9bmV3IFJlc2l6ZU9ic2VydmVyKCgpPT5maXRSZXNwb25zaXZlQ2hhcnRzTEEoKSk7CiByZXNwb25zaXZlQ2hhcnRPYnNlcnZlckxBLm9ic2VydmUoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWFpbicpKTsKfWVsc2Ugd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsZml0UmVzcG9uc2l2ZUNoYXJ0c0xBKTsKY29uc3QgcmVuZGVyQmVmb3JlUmVzcG9uc2l2ZUxBPXJlbmRlcjsKcmVuZGVyPWZ1bmN0aW9uKCl7cmVzcG9uc2l2ZUNoYXJ0TW9kZWxzTEEuY2xlYXIoKTtyZW5kZXJCZWZvcmVSZXNwb25zaXZlTEEoKTtpZihkYXRhKWZpdFJlc3BvbnNpdmVDaGFydHNMQSgpO307CgpmdW5jdGlvbiByZXBvcnRDaGFydFN0YXRlTEEodGl0bGVzKXsKIGNvbnN0IGtleT10YWI9PT0nUmVwb3J0ZSBzZW1hbmFsJz8nd2Vla2x5JzonbW9udGhseScsc3RhdGU9dmlld1N0YXRlW2tleV07CiBpZighQXJyYXkuaXNBcnJheShzdGF0ZS5jaGFydFNlbGVjdGlvbikpewogIGxldCBzYXZlZDt0cnl7c2F2ZWQ9SlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnTEFfUkVQT1JUX0NIQVJUU18nK2tleSl8fCdudWxsJyl9Y2F0Y2goZSl7fQogIHN0YXRlLmNoYXJ0U2VsZWN0aW9uPUFycmF5LmlzQXJyYXkoc2F2ZWQ/LnNlbGVjdGlvbik/c2F2ZWQuc2VsZWN0aW9uLmZpbHRlcih0PT50aXRsZXMuaW5jbHVkZXModCkpOlsuLi50aXRsZXNdOwogIHN0YXRlLmNoYXJ0Q29sdW1ucz1bMSwyLDRdLmluY2x1ZGVzKHNhdmVkPy5jb2x1bW5zKT9zYXZlZC5jb2x1bW5zOjI7CiB9CiBzdGF0ZS5jaGFydENvbHVtbnM9WzEsMiw0XS5pbmNsdWRlcyhOdW1iZXIoc3RhdGUuY2hhcnRDb2x1bW5zKSk/TnVtYmVyKHN0YXRlLmNoYXJ0Q29sdW1ucyk6MjsKIHJldHVybiB7a2V5LHN0YXRlfTsKfQpmdW5jdGlvbiByZW1lbWJlclJlcG9ydENoYXJ0c0xBKGtleSxzdGF0ZSl7dHJ5e2xvY2FsU3RvcmFnZS5zZXRJdGVtKCdMQV9SRVBPUlRfQ0hBUlRTXycra2V5LEpTT04uc3RyaW5naWZ5KHtzZWxlY3Rpb246c3RhdGUuY2hhcnRTZWxlY3Rpb24sY29sdW1uczpzdGF0ZS5jaGFydENvbHVtbnN9KSl9Y2F0Y2goZSl7fX0KZnVuY3Rpb24gY29uZmlndXJlUmVwb3J0Q2hhcnRzTEEoKXsKIGlmKCFbJ1JlcG9ydGUgc2VtYW5hbCcsJ1JlcG9ydGUgbWVuc3VhbCddLmluY2x1ZGVzKHRhYikpcmV0dXJuOwogY29uc3QgZ3JpZD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY29udGVudCAucmVwb3J0Y2hhcnRzJyk7aWYoIWdyaWR8fGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXBvcnRDaGFydHNUb29sYmFyTEEnKSlyZXR1cm47CiBjb25zdCBjYXJkcz1bLi4uZ3JpZC5jaGlsZHJlbl0uZmlsdGVyKGVsPT5lbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NhcmQnKSksdGl0bGVzPWNhcmRzLm1hcChjYXJkPT5jYXJkLnF1ZXJ5U2VsZWN0b3IoJ2gyJyk/LnRleHRDb250ZW50LnRyaW0oKXx8J0dyw6FmaWNvJyk7CiBjb25zdCB7a2V5LHN0YXRlfT1yZXBvcnRDaGFydFN0YXRlTEEodGl0bGVzKTtncmlkLmNsYXNzTGlzdC5hZGQoJ3JlcG9ydENoYXJ0R3JpZExBJyk7CiBjb25zdCB0b29sYmFyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTt0b29sYmFyLmlkPSdyZXBvcnRDaGFydHNUb29sYmFyTEEnO3Rvb2xiYXIuY2xhc3NOYW1lPSdyZXBvcnRDaGFydHNUb29sYmFyTEEnOwogdG9vbGJhci5pbm5lckhUTUw9YDxkaXYgY2xhc3M9ImRyb3Bkb3duRmllbGRWMTMiPjxzcGFuPkdyw6FmaWNvcyBxdWUgcXVpZXJlcyB2ZXI8L3NwYW4+PGRldGFpbHMgY2xhc3M9ImV4Y2VsRHJvcGRvd25WMTMiIGlkPSJyZXBvcnRDaGFydHNNZW51TEEiPjxzdW1tYXJ5PjxzcGFuIGlkPSJyZXBvcnRDaGFydHNDYXB0aW9uTEEiPjwvc3Bhbj48Yj7ilr48L2I+PC9zdW1tYXJ5PjxkaXYgY2xhc3M9ImV4Y2VsTWVudVYxMyI+PGRpdiBjbGFzcz0iZHJvcGRvd25BY3Rpb25zVjEzIj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9InJlcG9ydENoYXJ0c0FsbExBIj5NYXJjYXIgdG9kb3M8L2J1dHRvbj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9InJlcG9ydENoYXJ0c05vbmVMQSI+TGltcGlhcjwvYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9InJlcG9ydENoYXJ0Q2hlY2tzTEEiPiR7dGl0bGVzLm1hcCgodGl0bGUsaW5kZXgpPT5gPGxhYmVsIGNsYXNzPSJjaGVja0l0ZW1WMTIiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGF0YS1yZXBvcnQtY2hhcnQtbGE9IiR7aW5kZXh9IiAke3N0YXRlLmNoYXJ0U2VsZWN0aW9uLmluY2x1ZGVzKHRpdGxlKT8nY2hlY2tlZCc6Jyd9PjxzcGFuPiR7ZXNjKHRpdGxlKX08L3NwYW4+PC9sYWJlbD5gKS5qb2luKCcnKX08L2Rpdj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InByaW1hcnkiIGlkPSJyZXBvcnRDaGFydHNBcHBseUxBIj5BcGxpY2FyIHNlbGVjY2nDs248L2J1dHRvbj48L2Rpdj48L2RldGFpbHM+PC9kaXY+PGxhYmVsPkRpc3RyaWJ1Y2nDs248c2VsZWN0IGlkPSJyZXBvcnRDaGFydENvbHVtbnNMQSI+PG9wdGlvbiB2YWx1ZT0iMSI+MSBncsOhZmljbyBwb3IgZmlsYTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjIiPjIgcG9yIGZpbGEgwrcgY3VhdHJvIGVuIGRvcyBmaWxhczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjQiPjQgcG9yIGZpbGEgwrcgcGFudGFsbGEgYW1wbGlhPC9vcHRpb24+PC9zZWxlY3Q+PC9sYWJlbD48c3BhbiBpZD0icmVwb3J0Q2hhcnRzQ291bnRMQSIgYXJpYS1saXZlPSJwb2xpdGUiPjwvc3Bhbj5gOwogZ3JpZC5iZWZvcmUodG9vbGJhcik7JCgnI3JlcG9ydENoYXJ0Q29sdW1uc0xBJykudmFsdWU9U3RyaW5nKHN0YXRlLmNoYXJ0Q29sdW1ucyk7CiBjb25zdCBlbXB0eT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtlbXB0eS5jbGFzc05hbWU9J3JlcG9ydENoYXJ0RW1wdHlMQSc7ZW1wdHkudGV4dENvbnRlbnQ9J01hcmNhIHVubyBvIHZhcmlvcyBncsOhZmljb3MgZW4gZWwgbWVuw7ogcGFyYSBtb3N0cmFybG9zLic7Z3JpZC5hZnRlcihlbXB0eSk7CiBmdW5jdGlvbiBhcHBseSgpewogIGxldCB2aXNpYmxlPTA7Y2FyZHMuZm9yRWFjaCgoY2FyZCxpbmRleCk9PntjYXJkLmhpZGRlbj0hc3RhdGUuY2hhcnRTZWxlY3Rpb24uaW5jbHVkZXModGl0bGVzW2luZGV4XSk7aWYoIWNhcmQuaGlkZGVuKXZpc2libGUrKzt9KTsKICBncmlkLmRhdGFzZXQuY29sdW1ucz1TdHJpbmcoc3RhdGUuY2hhcnRDb2x1bW5zKTtncmlkLmhpZGRlbj0hdmlzaWJsZTtlbXB0eS5oaWRkZW49ISF2aXNpYmxlOwogICQoJyNyZXBvcnRDaGFydHNDYXB0aW9uTEEnKS50ZXh0Q29udGVudD12aXNpYmxlKycgZGUgJytjYXJkcy5sZW5ndGgrJyBzZWxlY2Npb25hZG9zJzskKCcjcmVwb3J0Q2hhcnRzQ291bnRMQScpLnRleHRDb250ZW50PXZpc2libGUrJyBncsOhZmljb3MgdmlzaWJsZXMgwrcgZWwgZGV0YWxsZSBkZWwgaW5mb3JtZSBzZSBjb25zZXJ2YSBhYmFqbyc7CiAgZ3JpZC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yZXNwb25zaXZlLWNoYXJ0LWxhXScpLmZvckVhY2goaG9zdD0+aG9zdC5kYXRhc2V0LmZpdFdpZHRoTGE9JycpO2ZpdFJlc3BvbnNpdmVDaGFydHNMQSgpO3JlbWVtYmVyUmVwb3J0Q2hhcnRzTEEoa2V5LHN0YXRlKTsKIH0KICQoJyNyZXBvcnRDaGFydHNBbGxMQScpLm9uY2xpY2s9KCk9PnRvb2xiYXIucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcmVwb3J0LWNoYXJ0LWxhXScpLmZvckVhY2goaW5wdXQ9PmlucHV0LmNoZWNrZWQ9dHJ1ZSk7CiAkKCcjcmVwb3J0Q2hhcnRzTm9uZUxBJykub25jbGljaz0oKT0+dG9vbGJhci5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yZXBvcnQtY2hhcnQtbGFdJykuZm9yRWFjaChpbnB1dD0+aW5wdXQuY2hlY2tlZD1mYWxzZSk7CiAkKCcjcmVwb3J0Q2hhcnRzQXBwbHlMQScpLm9uY2xpY2s9KCk9PntzdGF0ZS5jaGFydFNlbGVjdGlvbj1bLi4udG9vbGJhci5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yZXBvcnQtY2hhcnQtbGFdOmNoZWNrZWQnKV0ubWFwKGlucHV0PT50aXRsZXNbTnVtYmVyKGlucHV0LmRhdGFzZXQucmVwb3J0Q2hhcnRMYSldKTskKCcjcmVwb3J0Q2hhcnRzTWVudUxBJykub3Blbj1mYWxzZTthcHBseSgpO307CiAkKCcjcmVwb3J0Q2hhcnRDb2x1bW5zTEEnKS5vbmNoYW5nZT1lPT57c3RhdGUuY2hhcnRDb2x1bW5zPU51bWJlcihlLnRhcmdldC52YWx1ZSk7YXBwbHkoKTt9OwogLy8gS2VlcCB0aGUgZXhhY3QgZGF0YSBhdCBoYW5kIHdpdGhvdXQgbWFraW5nIGVhY2ggY2hhcnQgY2FyZCB1bm5lY2Vzc2FyaWx5IHRhbGwuCiBjYXJkcy5mb3JFYWNoKChjYXJkLGluZGV4KT0+ewogIGNvbnN0IHZhbHVlcz1jYXJkLnF1ZXJ5U2VsZWN0b3IoJy5jaGFydGRhdGF3cmFwJyk7aWYoIXZhbHVlcylyZXR1cm47CiAgc3RhdGUuY2hhcnRWYWx1ZXNPcGVuPz89e307Y29uc3QgZGV0YWlscz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7ZGV0YWlscy5jbGFzc05hbWU9J3JlcG9ydENoYXJ0VmFsdWVzTEEnOwogIGNvbnN0IHN1bW1hcnk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO3N1bW1hcnkudGV4dENvbnRlbnQ9J1ZlciB2YWxvcmVzIGV4YWN0b3MnO2RldGFpbHMuYXBwZW5kQ2hpbGQoc3VtbWFyeSk7CiAgY29uc3Qgc2VhcmNoPXZhbHVlcy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nPy5jbGFzc0xpc3QuY29udGFpbnMoJ3RhYmxlU2VhcmNoTEEnKT92YWx1ZXMucHJldmlvdXNFbGVtZW50U2libGluZzpudWxsOwogIHZhbHVlcy5iZWZvcmUoZGV0YWlscyk7aWYoc2VhcmNoKWRldGFpbHMuYXBwZW5kQ2hpbGQoc2VhcmNoKTtkZXRhaWxzLmFwcGVuZENoaWxkKHZhbHVlcyk7ZGV0YWlscy5vcGVuPSEhc3RhdGUuY2hhcnRWYWx1ZXNPcGVuW3RpdGxlc1tpbmRleF1dOwogIGRldGFpbHMuYWRkRXZlbnRMaXN0ZW5lcigndG9nZ2xlJywoKT0+e3N0YXRlLmNoYXJ0VmFsdWVzT3Blblt0aXRsZXNbaW5kZXhdXT1kZXRhaWxzLm9wZW47fSk7CiB9KTsKIGFwcGx5KCk7Cn0KY29uc3QgcmVuZGVyQmVmb3JlUmVwb3J0U2VsZWN0b3JMQT1yZW5kZXI7CnJlbmRlcj1mdW5jdGlvbigpe3JlbmRlckJlZm9yZVJlcG9ydFNlbGVjdG9yTEEoKTtpZihkYXRhKWNvbmZpZ3VyZVJlcG9ydENoYXJ0c0xBKCk7fTsKY29uc3QgZXhwb3J0QmVmb3JlUmVwb3J0U2VsZWN0b3JMQT0kKCcjdjJleHBvcnQnKS5vbmNsaWNrOwokKCcjdjJleHBvcnQnKS5vbmNsaWNrPWZ1bmN0aW9uKCl7CiBpZighWydSZXBvcnRlIHNlbWFuYWwnLCdSZXBvcnRlIG1lbnN1YWwnXS5pbmNsdWRlcyh0YWIpKXJldHVybiBleHBvcnRCZWZvcmVSZXBvcnRTZWxlY3RvckxBKCk7CiBjb25zdCBrZXk9dGFiPT09J1JlcG9ydGUgc2VtYW5hbCc/J3dlZWtseSc6J21vbnRobHknLHM9dmlld1N0YXRlW2tleV07CiBjb25zdCBzaGVldHM9W3tuYW1lOidEYXRvcycscm93czpleHBvcnRSb3dzfSx7bmFtZTonQ29uc3VsdGEnLHJvd3M6W1snUGFyw6FtZXRybycsJ1NlbGVjY2nDs24nXSxbJ0luZm9ybWUnLHRhYl0sWydGZWNoYXMnLHNlbGVjdGVkRGF0ZVRleHRWOCgnZ2xvYmFsJyldLFsnRmlsdHJvcycsSlNPTi5zdHJpbmdpZnkocy5maWx0ZXJzKV0sWydHcsOhZmljb3MgdmlzaWJsZXMnLChzLmNoYXJ0U2VsZWN0aW9ufHxbXSkuam9pbignIC8gJyldLFsnRGlzdHJpYnVjacOzbicscy5jaGFydENvbHVtbnMrJyBwb3IgZmlsYSddLFsnQ29udGVuaWRvJywnRGF0b3MgY29uc2VydmEgdG9kb3MgbG9zIGluZGljYWRvcmVzIGRlbCBpbmZvcm1lOyBsYXMgdGFibGFzIGRlIGdyw6FmaWNvcyBpbmNsdXllbiBzb2xvIGxvcyBzZWxlY2Npb25hZG9zLiddXX1dOwogbGV0IGluZGV4PTE7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NvbnRlbnQgdGFibGUnKS5mb3JFYWNoKHRhYmxlPT57aWYodGFibGUuY2xvc2VzdCgnLnJlcG9ydENoYXJ0R3JpZExBPi5jYXJkW2hpZGRlbl0nKSlyZXR1cm47Y29uc3Qgcm93cz1bLi4udGFibGUucm93c10ubWFwKHJvdz0+Wy4uLnJvdy5jZWxsc10ubWFwKGNlbGw9PihjZWxsLmlubmVyVGV4dHx8Y2VsbC50ZXh0Q29udGVudCkudHJpbSgpKSk7aWYocm93cy5sZW5ndGgpc2hlZXRzLnB1c2goe25hbWU6J1RhYmxhICcraW5kZXgrKyxyb3dzfSk7fSk7CiBkb3dubG9hZEJsb2JWOCh3b3JrYm9va0Jsb2JWOChzaGVldHMpLCdMQS0nK2tleSsnLnhsc3gnKTsKfTsKCmxldCBtYXRyaXhJbmRleExBPW51bGwsd2Vla0xhYmVsQ2FjaGVMQT1udWxsOwpmdW5jdGlvbiBtYXRyaXhJbmRleEZhc3RMQSgpewogaWYobWF0cml4SW5kZXhMQT8ubWF0cml4PT09ZGF0YSlyZXR1cm4gbWF0cml4SW5kZXhMQTsKIGNvbnN0IGRhdGVzPW5ldyBTZXQoKSxjYXRlZ29yaWVzPW5ldyBNYXAoT2JqZWN0LmtleXMoZGltcykubWFwKGs9PltOdW1iZXIoayksbmV3IFNldCgpXSkpOwogZm9yKGNvbnN0IHIgb2YgZGF0YS5yb3dzKXtkYXRlcy5hZGQoclswXSk7Zm9yKGNvbnN0W2ssdmFsdWVzXW9mIGNhdGVnb3JpZXMpdmFsdWVzLmFkZChTdHJpbmcocltrXT8/J1NpbiBkYXRvJykpO30KIG1hdHJpeEluZGV4TEE9e21hdHJpeDpkYXRhLGRhdGVzOlsuLi5kYXRlc10uc29ydCgpLGNhdGVnb3JpZXM6bmV3IE1hcChbLi4uY2F0ZWdvcmllc10ubWFwKChbayx2XSk9PltrLFsuLi52XS5maWx0ZXIoeD0+IWlzRXhwaXJlZCh4KSkuc29ydCgoYSxiKT0+YS5sb2NhbGVDb21wYXJlKGIsdW5kZWZpbmVkLHtudW1lcmljOnRydWV9KSldKSl9O3JldHVybiBtYXRyaXhJbmRleExBOwp9CmNvbnN0IHdlZWtOdW1iZXJCZWZvcmVGYXN0TEE9d2Vla051bWJlclY4LHdlZWtOdW1iZXJDYWNoZUxBPW5ldyBNYXAoKTsKd2Vla051bWJlclY4PWZ1bmN0aW9uKGRhdGUpe2lmKCF3ZWVrTnVtYmVyQ2FjaGVMQS5oYXMoZGF0ZSkpd2Vla051bWJlckNhY2hlTEEuc2V0KGRhdGUsd2Vla051bWJlckJlZm9yZUZhc3RMQShkYXRlKSk7cmV0dXJuIHdlZWtOdW1iZXJDYWNoZUxBLmdldChkYXRlKTt9Owpjb25zdCBvcHRpb25zQmVmb3JlRmFzdExBPW9wdGlvbnNGb3I7Cm9wdGlvbnNGb3I9ZnVuY3Rpb24oayl7cmV0dXJuIGRhdGE/bWF0cml4SW5kZXhGYXN0TEEoKS5jYXRlZ29yaWVzLmdldChOdW1iZXIoaykpfHxbXTpvcHRpb25zQmVmb3JlRmFzdExBKGspO307Cm1vbnRoQ2hvaWNlc1Y4PWZ1bmN0aW9uKCl7cmV0dXJuIFsuLi5uZXcgU2V0KG1hdHJpeEluZGV4RmFzdExBKCkuZGF0ZXMubWFwKGQ9PmQuc2xpY2UoMCw3KSkpXTt9OwpmdW5jdGlvbiB3ZWVrTGFiZWxGYXN0TEEoeWVhcix3ZWVrKXsKIGlmKCFkYXRhKXJldHVybiB3ZWVrTGFiZWxWOCh5ZWFyLHdlZWssW10pOwogY29uc3Qgc2lnbmF0dXJlPSgkKCcjZnJvbScpPy52YWx1ZXx8JycpKyd8JysoJCgnI3RvJyk/LnZhbHVlfHwnJykrJ3wnK0pTT04uc3RyaW5naWZ5KHZpZXdTdGF0ZS5jYWxlbmRhcnM/Lmdsb2JhbHx8e30pOwogaWYod2Vla0xhYmVsQ2FjaGVMQT8ubWF0cml4IT09ZGF0YXx8d2Vla0xhYmVsQ2FjaGVMQS5zaWduYXR1cmUhPT1zaWduYXR1cmUpewogIGNvbnN0IGRhdGVzPW5ldyBTZXQoc2xpY2VSb3dzKCkubWFwKHI9PnJbMF0pKSxtYXA9bmV3IE1hcCgpO2Zvcihjb25zdCBkYXRlIG9mIFsuLi5kYXRlc10uc29ydCgpKXtjb25zdCBrZXk9ZGF0ZS5zbGljZSgwLDQpKyd8Jyt3ZWVrTnVtYmVyVjgoZGF0ZSk7aWYoIW1hcC5oYXMoa2V5KSltYXAuc2V0KGtleSxuZXcgU2V0KCkpO21hcC5nZXQoa2V5KS5hZGQobW9udGhTaG9ydFY4W051bWJlcihkYXRlLnNsaWNlKDUsNykpLTFdKTt9CiAgd2Vla0xhYmVsQ2FjaGVMQT17bWF0cml4OmRhdGEsc2lnbmF0dXJlLG1hcH07CiB9CiBjb25zdCBtb250aHM9d2Vla0xhYmVsQ2FjaGVMQS5tYXAuZ2V0KHllYXIrJ3wnK051bWJlcih3ZWVrKSk7cmV0dXJuIG1vbnRocz9bLi4ubW9udGhzXS5qb2luKCcvJykrJy0nK051bWJlcih3ZWVrKSsnIMK3ICcreWVhcjp3ZWVrTGFiZWxWOCh5ZWFyLHdlZWssW10pOwp9CmNvbnN0IHNsaWNlQmVmb3JlRmFzdExBPXNsaWNlUm93cyxhZ2dyZWdhdGVCZWZvcmVGYXN0TEE9YWdnOwpsZXQgc2xpY2VDYWNoZUZhc3RMQT1uZXcgTWFwKCksYWdncmVnYXRlQ2FjaGVGYXN0TEE9bmV3IFdlYWtNYXAoKTsKc2xpY2VSb3dzPWZ1bmN0aW9uKGZpbHRlcnM9e30sZnJvbT0kKCcjZnJvbScpLnZhbHVlLHRvPSQoJyN0bycpLnZhbHVlKXsKIGNvbnN0IHNjb3BlPWZpbHRlcnM9PT12aWV3U3RhdGUuQS5maWx0ZXJzPydBJzpmaWx0ZXJzPT09dmlld1N0YXRlLkIuZmlsdGVycz8nQic6J2dsb2JhbCc7CiBjb25zdCBrZXk9c2NvcGUrJ3wnK2Zyb20rJ3wnK3RvKyd8JytKU09OLnN0cmluZ2lmeShmaWx0ZXJzKSsnfCcrSlNPTi5zdHJpbmdpZnkodmlld1N0YXRlLmNhbGVuZGFycz8uW3Njb3BlXXx8e30pOwogaWYoIXNsaWNlQ2FjaGVGYXN0TEEuaGFzKGtleSkpc2xpY2VDYWNoZUZhc3RMQS5zZXQoa2V5LHNsaWNlQmVmb3JlRmFzdExBKGZpbHRlcnMsZnJvbSx0bykpO3JldHVybiBzbGljZUNhY2hlRmFzdExBLmdldChrZXkpOwp9OwphZ2c9ZnVuY3Rpb24ocm93cyl7aWYoIWFnZ3JlZ2F0ZUNhY2hlRmFzdExBLmhhcyhyb3dzKSlhZ2dyZWdhdGVDYWNoZUZhc3RMQS5zZXQocm93cyxhZ2dyZWdhdGVCZWZvcmVGYXN0TEEocm93cykpO3JldHVybnsuLi5hZ2dyZWdhdGVDYWNoZUZhc3RMQS5nZXQocm93cyl9O307CmNvbnN0IHByZWZlcmVuY2lhbENhY2hlTEE9bmV3IFdlYWtNYXAoKSxwcmVmZXJlbmNpYWxCZWZvcmVGYXN0TEE9cHJlZmVyZW5jaWFsOwpwcmVmZXJlbmNpYWw9ZnVuY3Rpb24ocm93KXtpZighcHJlZmVyZW5jaWFsQ2FjaGVMQS5oYXMocm93KSlwcmVmZXJlbmNpYWxDYWNoZUxBLnNldChyb3cscHJlZmVyZW5jaWFsQmVmb3JlRmFzdExBKHJvdykpO3JldHVybiBwcmVmZXJlbmNpYWxDYWNoZUxBLmdldChyb3cpO307CndlZWtDaGVja3NWMTI9ZnVuY3Rpb24oc2NvcGUsbW9udGhzLHNlbGVjdGVkV2Vla3MpewogY29uc3Qgc2VsZWN0ZWQ9bW9udGhzLmxlbmd0aD9tb250aHM6bW9udGhDaG9pY2VzVjgoKSxkYXRlcz1tYXRyaXhJbmRleEZhc3RMQSgpLmRhdGVzOwogcmV0dXJuIHNlbGVjdGVkLm1hcChtb250aD0+ewogIGNvbnN0IHdlZWtzPW5ldyBNYXAoKTtmb3IoY29uc3QgZGF0ZSBvZiBkYXRlcyl7aWYoIWRhdGUuc3RhcnRzV2l0aChtb250aCkpY29udGludWU7Y29uc3Qgdz13ZWVrTnVtYmVyVjgoZGF0ZSk7aWYoIXdlZWtzLmhhcyh3KSl3ZWVrcy5zZXQodyxbXSk7d2Vla3MuZ2V0KHcpLnB1c2goZGF0ZSk7fQogIHJldHVybiBgPGRpdiBjbGFzcz0id2Vla01vbnRoVjEyIj48Yj4ke2Rpc3BsYXlEYXRlc1Y1KG1vbnRoKX08L2I+JHtbLi4ud2Vla3NdLnNvcnQoKGEsYik9PmFbMF0tYlswXSkubWFwKChbdyxkYXlzXSk9Pntjb25zdCB2YWx1ZT1tb250aCsnfCcrdztyZXR1cm4gYDxsYWJlbCBjbGFzcz0iY2hlY2tJdGVtVjEyIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGRhdGEtd2Vla2NoZWNrPSIke3Njb3BlfSIgdmFsdWU9IiR7dmFsdWV9IiAke3NlbGVjdGVkV2Vla3MuaW5jbHVkZXModmFsdWUpPydjaGVja2VkJzonJ30+PHNwYW4+JHttb250aFNob3J0VjhbTnVtYmVyKG1vbnRoLnNsaWNlKDUpKS0xXX0tJHt3fSDCtyAke21vbnRoLnNsaWNlKDAsNCl9PHNtYWxsPiR7ZGlzcGxheURhdGVzVjUoZGF5c1swXSl9IOKGkiAke2Rpc3BsYXlEYXRlc1Y1KGRheXMuYXQoLTEpKX08L3NtYWxsPjwvc3Bhbj48L2xhYmVsPmA7fSkuam9pbignJyl9PC9kaXY+YDsKIH0pLmpvaW4oJycpOwp9Owpjb25zdCByZW5kZXJCZWZvcmVGYXN0TEE9cmVuZGVyOwpyZW5kZXI9ZnVuY3Rpb24oKXtzbGljZUNhY2hlRmFzdExBPW5ldyBNYXAoKTthZ2dyZWdhdGVDYWNoZUZhc3RMQT1uZXcgV2Vha01hcCgpO3JlbmRlckJlZm9yZUZhc3RMQSgpO307CgovLyBOb3JtYWxpemUgYnkgb2JzZXJ2ZWQgZGF0ZXMgYW5kIG1hY2hpbmUtZGF5czsgYWJzZW5jZSBpcyBuZXZlciB6ZXJvIGFjdGl2aXR5LgpmdW5jdGlvbiBkYWlseVBhcmtMQShyb3dzKXsKIGNvbnN0IG1hcD1uZXcgTWFwKCk7Zm9yKGNvbnN0IHIgb2Ygcm93cyl7Y29uc3QgaWQ9U3RyaW5nKHJbMV0/PycnKS50cmltKCk7aWYoIWlkKWNvbnRpbnVlO2NvbnN0IGtleT1KU09OLnN0cmluZ2lmeShbclswXSxpZF0pO2lmKCFtYXAuaGFzKGtleSkpbWFwLnNldChrZXkse2lkLGRhdGU6clswXSxjb2luOjAsd2luOjAsc3BpbjowLHByaXplOjAscHJvbW86MCxwcm9tb3RlZDpmYWxzZSxsb2NhdGlvbnM6bmV3IFNldCgpfSk7Y29uc3QgZD1tYXAuZ2V0KGtleSk7Zm9yKGNvbnN0W2ssaV1vZiBbWydjb2luJywxOF0sWyd3aW4nLDE2XSxbJ3NwaW4nLDIwXSxbJ3ByaXplJywxNV1dKWRba10rPW51bShyW2ldKTtkLnByb21vKz1udW0oclsyNl0pLW51bShyWzI3XSk7ZC5wcm9tb3RlZHx8PW51bShyWzI2XSkhPT0wfHxudW0oclsyN10pIT09MDtkLmxvY2F0aW9ucy5hZGQoSlNPTi5zdHJpbmdpZnkoW3JbOV0/PycnLHJbNV0/PycnLHJbN10/PycnXSkpO31yZXR1cm4gWy4uLm1hcC52YWx1ZXMoKV07Cn0KZnVuY3Rpb24gd2Vla2RheVBhcmtMQShyb3dzKXsKIGNvbnN0IG5hbWVzPVsnTHVuZXMnLCdNYXJ0ZXMnLCdNacOpcmNvbGVzJywnSnVldmVzJywnVmllcm5lcycsJ1PDoWJhZG8nLCdEb21pbmdvJ10sbGlzdD1uYW1lcy5tYXAobmFtZT0+KHtuYW1lLHJvd3M6W10sZGF0ZXM6bmV3IFNldCgpfSkpO2Zvcihjb25zdCByIG9mIHJvd3Mpe2NvbnN0IGk9KG5ldyBEYXRlKHJbMF0rJ1QxMjowMDowMFonKS5nZXRVVENEYXkoKSs2KSU3O2lmKCFsaXN0W2ldKWNvbnRpbnVlO2xpc3RbaV0ucm93cy5wdXNoKHIpO2xpc3RbaV0uZGF0ZXMuYWRkKHJbMF0pO31yZXR1cm4gbGlzdC5tYXAoZz0+e2NvbnN0IGE9YWdnKGcucm93cyk7cmV0dXJue25hbWU6Zy5uYW1lLC4uLmEsY2FsZW5kYXJEYXlzOmcuZGF0ZXMuc2l6ZSx3aW5EYXRlOmRpdihhLndpbixnLmRhdGVzLnNpemUpLGNvaW5EYXRlOmRpdihhLmNvaW4sZy5kYXRlcy5zaXplKX07fSk7Cn0KZnVuY3Rpb24gc3RhYmlsaXR5UGFya0xBKGRheXMsbWluRGF5cz03KXsKIGNvbnN0IG1hcD1uZXcgTWFwKCk7Zm9yKGNvbnN0IGQgb2YgZGF5cyl7aWYoIW1hcC5oYXMoZC5pZCkpbWFwLnNldChkLmlkLFtdKTttYXAuZ2V0KGQuaWQpLnB1c2goZCk7fXJldHVybiBbLi4ubWFwXS5tYXAoKFtpZCxsaXN0XSk9Pntjb25zdCBjb3VudD1saXN0Lmxlbmd0aCxtZWFuPWxpc3QucmVkdWNlKChzLGQpPT5zK2QuY29pbiwwKS9jb3VudCxzZD1NYXRoLnNxcnQobGlzdC5yZWR1Y2UoKHMsZCk9PnMrKGQuY29pbi1tZWFuKSoqMiwwKS9jb3VudCkscG9zaXRpdmVXaW49bGlzdC5yZWR1Y2UoKHMsZCk9PnMrTWF0aC5tYXgoMCxkLndpbiksMCk7cmV0dXJue2lkLGNvdW50LG1lYW4sc2QsY3Y6Y291bnQ+PW1pbkRheXMmJm1lYW4+MD9zZC9tZWFuOm51bGwsYmVzdFdpblNoYXJlOnBvc2l0aXZlV2luP01hdGgubWF4KC4uLmxpc3QubWFwKGQ9Pk1hdGgubWF4KDAsZC53aW4pKSkvcG9zaXRpdmVXaW46bnVsbCx3aW46bGlzdC5yZWR1Y2UoKHMsZCk9PnMrZC53aW4sMCl9O30pLnNvcnQoKGEsYik9PihiLmN2Pz8tMSktKGEuY3Y/Py0xKSk7Cn0KZnVuY3Rpb24gYWN0aXZpdHlQYXJrTEEoZGF5cyxwYXJrRGF0ZXMsdGhyZXNob2xkPTAuMjUpewogY29uc3QgbWFwPW5ldyBNYXAoKTtmb3IoY29uc3QgZCBvZiBkYXlzKXtpZighbWFwLmhhcyhkLmlkKSltYXAuc2V0KGQuaWQsW10pO21hcC5nZXQoZC5pZCkucHVzaChkKTt9cmV0dXJuIFsuLi5tYXBdLm1hcCgoW2lkLGxpc3RdKT0+e2xpc3Quc29ydCgoYSxiKT0+YS5kYXRlLmxvY2FsZUNvbXBhcmUoYi5kYXRlKSk7Y29uc3QgdmFsdWVzPWxpc3QuZmlsdGVyKGQ9PmQuY29pbj4wKS5tYXAoZD0+ZC5jb2luKS5zb3J0KChhLGIpPT5hLWIpLG49dmFsdWVzLmxlbmd0aCxtZWRpYW49bj8odmFsdWVzW01hdGguZmxvb3Iobi8yKV0rdmFsdWVzW01hdGguY2VpbChuLzIpLTFdKS8yOjAsZmlyc3Q9bGlzdFswXS5kYXRlLGxhc3Q9bGlzdC5hdCgtMSkuZGF0ZTtyZXR1cm57aWQsZmlyc3QsbGFzdCxkYXlzOmxpc3QubGVuZ3RoLG1pc3Npbmc6cGFya0RhdGVzLmZpbHRlcihkPT5kPj1maXJzdCYmZDw9bGFzdCkubGVuZ3RoLWxpc3QubGVuZ3RoLHplcm86bGlzdC5maWx0ZXIoZD0+ZC5jb2luPT09MCYmZC5zcGluPT09MCkubGVuZ3RoLGxvdzptZWRpYW4/bGlzdC5maWx0ZXIoZD0+ZC5jb2luPjAmJmQuY29pbjxtZWRpYW4qdGhyZXNob2xkKS5sZW5ndGg6MCxtZWRpYW59O30pLnNvcnQoKGEsYik9PihiLm1pc3NpbmcrYi56ZXJvK2IubG93KS0oYS5taXNzaW5nK2EuemVybythLmxvdykpOwp9CmZ1bmN0aW9uIHByb21vdGlvblBhcmtMQShkYXlzKXtyZXR1cm4gW3RydWUsZmFsc2VdLm1hcChwcm9tb3RlZD0+e2NvbnN0IGE9e25hbWU6cHJvbW90ZWQ/J0NvbiBtb3ZpbWllbnRvcyBwcm9tb2Npb25hbGVzJzonU2luIG1vdmltaWVudG9zIHByb21vY2lvbmFsZXMnLGRheXM6MCxjb2luOjAsd2luOjAsc3BpbjowLHByb21vOjB9O2Zvcihjb25zdCBkIG9mIGRheXMpaWYoZC5wcm9tb3RlZD09PXByb21vdGVkKXthLmRheXMrKztmb3IoY29uc3QgayBvZiBbJ2NvaW4nLCd3aW4nLCdzcGluJywncHJvbW8nXSlhW2tdKz1kW2tdO31yZXR1cm57Li4uYSxjZDpkaXYoYS5jb2luLGEuZGF5cyksd2Q6ZGl2KGEud2luLGEuZGF5cyksc2Q6ZGl2KGEuc3BpbixhLmRheXMpLHBvOmEuY29pbj8xLWEud2luL2EuY29pbjpudWxsLHBvbjphLmNvaW4/MS0oYS53aW4rYS5wcm9tbykvYS5jb2luOm51bGx9O30pO30KZnVuY3Rpb24gcGFyZXRvUGFya0xBKHJvd3Msa2V5LG1ldHJpYyl7Y29uc3QgbGlzdD1ncm91cHMocm93cyxyPT5TdHJpbmcocltrZXldPz8nU2luIGlkZW50aWZpY2FjacOzbicpKS5zb3J0KChhLGIpPT5iW21ldHJpY10tYVttZXRyaWNdKSxiYXNlPWxpc3QucmVkdWNlKChzLGcpPT5zK01hdGgubWF4KDAsZ1ttZXRyaWNdKSwwKTtsZXQgY3VtdWxhdGl2ZT0wO3JldHVybiBsaXN0Lm1hcChnPT57Y29uc3Qgc2hhcmU9YmFzZT9NYXRoLm1heCgwLGdbbWV0cmljXSkvYmFzZTpudWxsO2N1bXVsYXRpdmUrPXNoYXJlfHwwO3JldHVybntuYW1lOmcubmFtZSx2YWx1ZTpnW21ldHJpY10sc2hhcmUsY3VtdWxhdGl2ZTpiYXNlP2N1bXVsYXRpdmU6bnVsbH07fSk7fQpmdW5jdGlvbiBtb3Zlc1BhcmtMQShkYXlzLHdpbmRvd0RheXM9MTQpewogY29uc3QgbWFwPW5ldyBNYXAoKTtmb3IoY29uc3QgZCBvZiBkYXlzKXtpZighbWFwLmhhcyhkLmlkKSltYXAuc2V0KGQuaWQsW10pO21hcC5nZXQoZC5pZCkucHVzaChkKTt9Y29uc3QgcmVzdWx0PVtdO2Zvcihjb25zdFtpZCxsaXN0XW9mIG1hcCl7bGlzdC5zb3J0KChhLGIpPT5hLmRhdGUubG9jYWxlQ29tcGFyZShiLmRhdGUpKTtsZXQgcHJldmlvdXM9bnVsbDtmb3IoY29uc3QgZCBvZiBsaXN0KXtpZihkLmxvY2F0aW9ucy5zaXplIT09MSl7cHJldmlvdXM9bnVsbDtjb250aW51ZTt9Y29uc3QgbG9jYXRpb249Wy4uLmQubG9jYXRpb25zXVswXTtpZihwcmV2aW91cyYmcHJldmlvdXMhPT1sb2NhdGlvbil7Y29uc3QgYT1saXN0LmZpbHRlcih4PT54LmRhdGU8ZC5kYXRlJiZ4LmRhdGU+PXNoaWZ0RGF0ZUxBKGQuZGF0ZSwtd2luZG93RGF5cykmJngubG9jYXRpb25zLnNpemU9PT0xJiZ4LmxvY2F0aW9ucy5oYXMocHJldmlvdXMpKSxiPWxpc3QuZmlsdGVyKHg9PnguZGF0ZT49ZC5kYXRlJiZ4LmRhdGU8PXNoaWZ0RGF0ZUxBKGQuZGF0ZSx3aW5kb3dEYXlzLTEpJiZ4LmxvY2F0aW9ucy5zaXplPT09MSYmeC5sb2NhdGlvbnMuaGFzKGxvY2F0aW9uKSksbWVhbj0oaXRlbXMsayk9PmRpdihpdGVtcy5yZWR1Y2UoKHMseCk9PnMreFtrXSwwKSxpdGVtcy5sZW5ndGgpO3Jlc3VsdC5wdXNoKHtpZCxkYXRlOmQuZGF0ZSxvbGQ6SlNPTi5wYXJzZShwcmV2aW91cyksbmV4dDpKU09OLnBhcnNlKGxvY2F0aW9uKSxiZWZvcmU6YS5sZW5ndGgsYWZ0ZXI6Yi5sZW5ndGgsY29pbkE6bWVhbihhLCdjb2luJyksY29pbkI6bWVhbihiLCdjb2luJyksd2luQTptZWFuKGEsJ3dpbicpLHdpbkI6bWVhbihiLCd3aW4nKX0pO31wcmV2aW91cz1sb2NhdGlvbjt9fXJldHVybiByZXN1bHQuc29ydCgoYSxiKT0+Yi5kYXRlLmxvY2FsZUNvbXBhcmUoYS5kYXRlKXx8YS5pZC5sb2NhbGVDb21wYXJlKGIuaWQpKTsKfQpmdW5jdGlvbiBxdWFsaXR5UGFya0xBKHJvd3Mpe2NvbnN0IHNlZW49bmV3IFNldCgpO2xldCBkdXBsaWNhdGVzPTAsbWlzc2luZz0wLGludmFsaWREYXRlcz0wLGludmFsaWROdW1iZXJzPTA7Zm9yKGNvbnN0IHIgb2Ygcm93cyl7Y29uc3QgaWQ9U3RyaW5nKHJbMV0/PycnKS50cmltKCk7aWYoIWlkKW1pc3NpbmcrKztlbHNle2NvbnN0IGtleT1KU09OLnN0cmluZ2lmeShbclswXSxpZF0pO2lmKHNlZW4uaGFzKGtleSkpZHVwbGljYXRlcysrO3NlZW4uYWRkKGtleSk7fWNvbnN0IG1zPURhdGUucGFyc2UoclswXSsnVDAwOjAwOjAwWicpO2lmKCEvXlxkezR9LVxkezJ9LVxkezJ9JC8udGVzdChyWzBdKXx8IU51bWJlci5pc0Zpbml0ZShtcyl8fG5ldyBEYXRlKG1zKS50b0lTT1N0cmluZygpLnNsaWNlKDAsMTApIT09clswXSlpbnZhbGlkRGF0ZXMrKztmb3IoY29uc3QgayBvZiBbMTUsMTYsMTgsMjAsMjYsMjddKWlmKHJba10hPW51bGwmJnJba10hPT0nJyYmKHR5cGVvZiByW2tdIT09J251bWJlcid8fCFOdW1iZXIuaXNGaW5pdGUocltrXSkpKWludmFsaWROdW1iZXJzKys7fXJldHVybntkdXBsaWNhdGVzLG1pc3NpbmcsaW52YWxpZERhdGVzLGludmFsaWROdW1iZXJzLGFtYmlndW91czpkYWlseVBhcmtMQShyb3dzKS5maWx0ZXIoZD0+ZC5sb2NhdGlvbnMuc2l6ZT4xKS5sZW5ndGh9O30KZnVuY3Rpb24gcGVyc2lzdGVudFBhcmtMQShlbnRyaWVzLHMpe3JldHVybiBlbnRyaWVzLm1hcChnPT57Y29uc3QgZGF5cz1ncm91cHMoZy5jdXJyZW50LHI9PnJbMF0pLnNvcnQoKGEsYik9PmIubmFtZS5sb2NhbGVDb21wYXJlKGEubmFtZSkpO2xldCBzdHJlYWs9MDtmb3IoY29uc3QgZCBvZiBkYXlzKXtpZihkLm5hbWUhPT1zaGlmdERhdGVMQShzLmVuZCwtc3RyZWFrKXx8Zy5vbGQ9PW51bGx8fGcub2xkPD0wfHxkW3MubWV0cmljXT09bnVsbHx8ZFtzLm1ldHJpY10+Zy5vbGQqKDEtcy50aHJlc2hvbGQvMTAwKSlicmVhaztzdHJlYWsrKzt9cmV0dXJue25hbWU6Zy5uYW1lLHN0cmVhayxvbGQ6Zy5vbGQsZGF5czpnLmRheXNCLHplcm86ZGFpbHlQYXJrTEEoZy5jdXJyZW50KS5maWx0ZXIoZD0+ZC5jb2luPT09MCYmZC5zcGluPT09MCkubGVuZ3RoLGNvdmVyYWdlOmcubWFjaGluZURheXNCLHByZXZpb3VzQ292ZXJhZ2U6Zy5tYWNoaW5lRGF5c0F9O30pLnNvcnQoKGEsYik9PmIuc3RyZWFrLWEuc3RyZWFrfHxiLnplcm8tYS56ZXJvKTt9CmNvbnN0IHBlcmNlbnRQYXJrTEE9dj0+dj09bnVsbD8n4oCUJzooMTAwKnYpLnRvTG9jYWxlU3RyaW5nKCdlcy1DTCcse21heGltdW1GcmFjdGlvbkRpZ2l0czoyfSkrJyUnOwovLyBPbmx5IDUwIHJvd3MgZW50ZXIgdGhlIERPTSwgd2hpbGUgZXhwb3J0cyByZXRhaW4gdGhlIGNvbXBsZXRlIHJlcG9ydC4KZnVuY3Rpb24gcGFya1RhYmxlTEEoaG9zdCxoZWFkZXJzLHJvd3MsZm9ybWF0cz1bXSl7bGV0IHBhZ2U9MDtob3N0LmlubmVySFRNTD0nPGRpdiBjbGFzcz0idGFibGV3cmFwIj48dGFibGU+PHRoZWFkPjx0cj4nK2hlYWRlcnMubWFwKGg9Pic8dGg+Jytlc2MoaCkrJzwvdGg+Jykuam9pbignJykrJzwvdHI+PC90aGVhZD48dGJvZHk+PC90Ym9keT48L3RhYmxlPjwvZGl2PjxkaXYgY2xhc3M9InBhcmtQYWdlc0xBIj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1wcmV2PkFudGVyaW9yPC9idXR0b24+PHNwYW4+PC9zcGFuPjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLW5leHQ+U2lndWllbnRlPC9idXR0b24+PC9kaXY+Jztjb25zdCBkcmF3PSgpPT57aG9zdC5xdWVyeVNlbGVjdG9yKCd0Ym9keScpLmlubmVySFRNTD1yb3dzLnNsaWNlKHBhZ2UqNTAscGFnZSo1MCs1MCkubWFwKHJvdz0+Jzx0cj4nK3Jvdy5tYXAoKHYsaSk9Pic8dGQ+Jytlc2MoZm9ybWF0c1tpXT9mb3JtYXRzW2ldKHYpOnR5cGVvZiB2PT09J251bWJlcic/Zm10KHYpOnY/PyfigJQnKSsnPC90ZD4nKS5qb2luKCcnKSsnPC90cj4nKS5qb2luKCcnKXx8Jzx0cj48dGQgY29sc3Bhbj0iJytoZWFkZXJzLmxlbmd0aCsnIj5TaW4gcmVnaXN0cm9zIHBhcmEgZXN0YSBzZWxlY2Npw7NuLjwvdGQ+PC90cj4nO2hvc3QucXVlcnlTZWxlY3RvcignLnBhcmtQYWdlc0xBIHNwYW4nKS50ZXh0Q29udGVudD1yb3dzLmxlbmd0aCsnIGZpbGFzIMK3IFDDoWdpbmEgJysocGFnZSsxKSsnIGRlICcrTWF0aC5tYXgoMSxNYXRoLmNlaWwocm93cy5sZW5ndGgvNTApKTtob3N0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByZXZdJykuZGlzYWJsZWQ9cGFnZT09PTA7aG9zdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1uZXh0XScpLmRpc2FibGVkPShwYWdlKzEpKjUwPj1yb3dzLmxlbmd0aDt9O2hvc3QucXVlcnlTZWxlY3RvcignW2RhdGEtcHJldl0nKS5vbmNsaWNrPSgpPT57cGFnZS0tO2RyYXcoKTt9O2hvc3QucXVlcnlTZWxlY3RvcignW2RhdGEtbmV4dF0nKS5vbmNsaWNrPSgpPT57cGFnZSsrO2RyYXcoKTt9O2RyYXcoKTt9CmZ1bmN0aW9uIHBhcmtFeHBvcnRCdXR0b25MQShob3N0LGhlYWRlcnMscm93cyxuYW1lKXtjb25zdCBidXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7YnV0dG9uLnR5cGU9J2J1dHRvbic7YnV0dG9uLnRleHRDb250ZW50PSdEZXNjYXJnYXIgZXN0ZSBhbsOhbGlzaXMgZW4gRXhjZWwnO2J1dHRvbi5vbmNsaWNrPSgpPT5kb3dubG9hZEJsb2JWOCh3b3JrYm9va0Jsb2JWOChbe25hbWU6J0FuYWxpc2lzJyxyb3dzOltoZWFkZXJzLC4uLnJvd3NdfSx7bmFtZTonQ29uc3VsdGEnLHJvd3M6W1snUGVyw61vZG8nLHNlbGVjdGVkRGF0ZVRleHRWOCgnZ2xvYmFsJyldLFsnTm90YScsJ0TDrWFzIHJlZ2lzdHJhZG9zIHkgbcOhcXVpbmFzLWTDrWE7IGRhdG9zIGF1c2VudGVzIG5vIHNlIGN1ZW50YW4gY29tbyBjZXJvcy4nXV19XSksbmFtZSsnLnhsc3gnKTtob3N0LmFwcGVuZENoaWxkKGJ1dHRvbik7fQpmdW5jdGlvbiBhZGRQYXJrRm9sZExBKGlkLHRpdGxlLGJ1aWxkKXtpZigkKCcjJytpZCkpcmV0dXJuOyQoJyNjb250ZW50JykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCc8ZGV0YWlscyBjbGFzcz0iY2FyZCBwYXJrRm9sZExBIiBpZD0iJytpZCsnIj48c3VtbWFyeT4nK2VzYyh0aXRsZSkrJzwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYXJrRm9sZEJvZHlMQSI+PC9kaXY+PC9kZXRhaWxzPicpO2NvbnN0IGZvbGQ9JCgnIycraWQpO2ZvbGQub250b2dnbGU9KCk9PntpZihmb2xkLm9wZW4mJiFmb2xkLmRhdGFzZXQucmVhZHkpe2ZvbGQuZGF0YXNldC5yZWFkeT0ndHJ1ZSc7YnVpbGQoZm9sZC5xdWVyeVNlbGVjdG9yKCcucGFya0ZvbGRCb2R5TEEnKSk7fX07fQpmdW5jdGlvbiByZW5kZXJQYXJrTEEoKXsKIHZpZXdTdGF0ZS5wYXJrPz89e2ZpbHRlcnM6e30sa2luZDond2Vla2RheXMnLG1pbkRheXM6Nyxsb3dQZXJjZW50OjI1fTtjb25zdCBzPXZpZXdTdGF0ZS5wYXJrLHJvd3M9c2xpY2VSb3dzKHMuZmlsdGVycyksZGF5cz1kYWlseVBhcmtMQShyb3dzKSxraW5kcz17d2Vla2RheXM6J0TDrWFzIGRlIGxhIHNlbWFuYScsc3RhYmlsaXR5OidFc3RhYmlsaWRhZCBwb3IgbcOhcXVpbmEnLGFjdGl2aXR5OidBY3RpdmlkYWQgYmFqYSBvIHNpbiByZWdpc3RybycscHJvbW90aW9uczonUHJvbW9jaW9uZXMgeSByZW5kaW1pZW50byd9OwogZG9jdW1lbnQuYm9keS5kYXRhc2V0LnZpZXc9dGFiOyQoJyN0aXRsZScpLnRleHRDb250ZW50PSdBbsOhbGlzaXMgZGVsIHBhcnF1ZSc7ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZpbHRlcnMnKS5zdHlsZS5kaXNwbGF5PSdibG9jayc7JCgnI2NvbnRyb2xzJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7JCgnI2ZpbHRlcnMnKS5zdHlsZS5kaXNwbGF5PSdub25lJzsKICQoJyNjb250ZW50JykuaW5uZXJIVE1MPWJhbm5lcignQW7DoWxpc2lzIGRlbCBwYXJxdWUnLCdTZWxlY2Npb25hIHVuIGFuw6FsaXNpcyB5IHV0aWxpemEgbGFzIGZlY2hhcyBnZW5lcmFsZXMgeSBmaWx0cm9zIGRlIGVzdGEgcGVzdGHDsWEuJykrYDxzZWN0aW9uIGNsYXNzPSJjYXJkIj48ZGl2IGNsYXNzPSJ2aWV3Y29udHJvbHMiPiR7c2VsZWN0b3IoJ0Fuw6FsaXNpcycsJ3BhcmtLaW5kTEEnLHMua2luZCxraW5kcyl9PGxhYmVsPk3DrW5pbW8gZGUgZMOtYXMgcGFyYSBlc3RhYmlsaWRhZDxpbnB1dCBpZD0icGFya01pbkRheXNMQSIgdHlwZT0ibnVtYmVyIiBtaW49IjIiIG1heD0iMzY2IiB2YWx1ZT0iJHtzLm1pbkRheXN9Ij48L2xhYmVsPjxsYWJlbD5BY3RpdmlkYWQgYmFqYTogbWVub3MgZGVsICUgZGUgc3UgbWVkaWFuYTxpbnB1dCBpZD0icGFya0xvd0xBIiB0eXBlPSJudW1iZXIiIG1pbj0iMSIgbWF4PSI5OSIgdmFsdWU9IiR7cy5sb3dQZXJjZW50fSI+PC9sYWJlbD48YnV0dG9uIGlkPSJwYXJrQXBwbHlMQSI+QXBsaWNhcjwvYnV0dG9uPjwvZGl2PjxkZXRhaWxzIGNsYXNzPSJjb21wYWN0Rm9sZExBIj48c3VtbWFyeT5GaWx0cmFyIG3DoXF1aW5hcywgYmFuY29zLCBtYXJjYXMgeSB1YmljYWNpb25lczwvc3VtbWFyeT48ZGl2IGNsYXNzPSJmaWx0ZXJncmlkIj4ke2ZpbHRlckZpZWxkcyhzLCdwYXJrJyxbMSwyLDMsNCw5LDUsN10pfTwvZGl2PjwvZGV0YWlscz48L3NlY3Rpb24+PHNlY3Rpb24gY2xhc3M9ImNhcmQiPjxoMj4ke2tpbmRzW3Mua2luZF19PC9oMj48cCBpZD0icGFya0hlbHBMQSIgY2xhc3M9InNpZ25hbG5vdGUiPjwvcD48ZGl2IGlkPSJwYXJrUmVzdWx0c0xBIj48L2Rpdj48L3NlY3Rpb24+YDsKIGxldCBoZWFkZXJzLGJvZHksZm9ybWF0cz1bXTsKIGlmKHMua2luZD09PSd3ZWVrZGF5cycpe2hlYWRlcnM9WydEw61hJywnRmVjaGFzIGNvbiBkYXRvcycsJ03DoXF1aW5hcy1kw61hJywnV2luIHRvdGFsIENMUCcsJ0NvaW4gSW4gdG90YWwgQ0xQJywnV2luIHBvciBmZWNoYSBDTFAnLCdDb2luIEluIHBvciBmZWNoYSBDTFAnLCdXaW4gLyBtw6FxdWluYS1kw61hJywnQ29pbiBJbiAvIG3DoXF1aW5hLWTDrWEnLCdQYXlvdXQnXTtib2R5PXdlZWtkYXlQYXJrTEEocm93cykubWFwKGc9PltnLm5hbWUsZy5jYWxlbmRhckRheXMsZy5kYXlzLGcud2luLGcuY29pbixnLndpbkRhdGUsZy5jb2luRGF0ZSxnLndkLGcuY2QsZy5wb10pO2Zvcm1hdHNbOV09cGVyY2VudFBhcmtMQTskKCcjcGFya0hlbHBMQScpLnRleHRDb250ZW50PSdDb21wYXJhIHByb21lZGlvcyBwb3IgZmVjaGEgbyBtw6FxdWluYS1kw61hOiBsb3MgdG90YWxlcyBkZXBlbmRlbiBkZSBjdcOhbnRvcyBsdW5lcywgbWFydGVzLCBldGMuIGhheWEgZW4gbGEgc2VsZWNjacOzbi4nO30KIGVsc2UgaWYocy5raW5kPT09J3N0YWJpbGl0eScpe2hlYWRlcnM9WydNw6FxdWluYScsJ0TDrWFzIHJlZ2lzdHJhZG9zJywnQ29pbiBJbiBtZWRpbyBkaWFyaW8nLCdEZXN2aWFjacOzbiBlc3TDoW5kYXIgZGlhcmlhJywnVmFyaWFiaWxpZGFkIENvaW4gSW4gKENWKScsJ01heW9yIGTDrWEgLyBXaW4gcG9zaXRpdm8nLCdXaW4gdG90YWwgQ0xQJ107Ym9keT1zdGFiaWxpdHlQYXJrTEEoZGF5cyxzLm1pbkRheXMpLm1hcChnPT5bZy5pZCxnLmNvdW50LGcubWVhbixnLnNkLGcuY3YsZy5iZXN0V2luU2hhcmUsZy53aW5dKTtmb3JtYXRzWzRdPXBlcmNlbnRQYXJrTEE7Zm9ybWF0c1s1XT1wZXJjZW50UGFya0xBOyQoJyNwYXJrSGVscExBJykudGV4dENvbnRlbnQ9J0NWID0gZGVzdmlhY2nDs24gZXN0w6FuZGFyIHBvYmxhY2lvbmFsIC8gcHJvbWVkaW8gZGlhcmlvIGRlIENvaW4gSW4uIFNlIG9jdWx0YSBjb24gcG9jb3MgZMOtYXMgbyBwcm9tZWRpbyBubyBwb3NpdGl2by4gTGEgY29uY2VudHJhY2nDs24gZGUgV2luIHVzYSBzb2xvIGTDrWFzIGNvbiBXaW4gcG9zaXRpdm87IG5vIGV4cGxpY2Egc3VzIGNhdXNhcy4nO30KIGVsc2UgaWYocy5raW5kPT09J2FjdGl2aXR5Jyl7aGVhZGVycz1bJ03DoXF1aW5hJywnUHJpbWVyIHJlZ2lzdHJvJywnw5psdGltbyByZWdpc3RybycsJ0TDrWFzIHJlZ2lzdHJhZG9zJywnRMOtYXMgaW50ZXJtZWRpb3Mgc2luIHJlZ2lzdHJvJywnRMOtYXMgY29uIENvaW4gSW4geSBzcGlucyBjZXJvJywnRMOtYXMgY29uIENvaW4gSW4gYmFqbycsJ01lZGlhbmEgQ29pbiBJbiBwb3NpdGl2byddO2JvZHk9YWN0aXZpdHlQYXJrTEEoZGF5cyxbLi4ubmV3IFNldChzbGljZVJvd3MoKS5tYXAocj0+clswXSkpXS5zb3J0KCkscy5sb3dQZXJjZW50LzEwMCkubWFwKGc9PltnLmlkLGcuZmlyc3QsZy5sYXN0LGcuZGF5cyxnLm1pc3NpbmcsZy56ZXJvLGcubG93LGcubWVkaWFuXSk7JCgnI3BhcmtIZWxwTEEnKS50ZXh0Q29udGVudD0nU2luIHJlZ2lzdHJvOiBmZWNoYSBjb24gZGF0b3MgZGVsIHBhcnF1ZSBlbnRyZSBlbCBwcmltZXIgeSDDumx0aW1vIHJlZ2lzdHJvIGRlIGVzYSBtw6FxdWluYS4gQ2VybzogZXhpc3RlIHJlZ2lzdHJvIGNvbiBDb2luIEluIHkgc3BpbnMgaWd1YWxlcyBhIGNlcm8uIEJham86IENvaW4gSW4gcG9zaXRpdm8gaW5mZXJpb3IgYWwgdW1icmFsIGRlIHN1IHByb3BpYSBtZWRpYW5hIHBvc2l0aXZhLiBOaW5ndW5vIGNvbmZpcm1hIHVuYSBmYWxsYSB0w6ljbmljYS4nO30KIGVsc2V7aGVhZGVycz1bJ1RpcG8gZGUgbcOhcXVpbmEtZMOtYScsJ03DoXF1aW5hcy1kw61hJywnQ29pbiBJbiBDTFAnLCdXaW4gQ0xQJywnUHJvbW8gbmV0YSBDTFAnLCdDb2luIEluIC8gbcOhcXVpbmEtZMOtYScsJ1dpbiAvIG3DoXF1aW5hLWTDrWEnLCdTcGlucyAvIG3DoXF1aW5hLWTDrWEnLCdQYXlvdXQnLCdQYXlvdXQgY29uIE5DQyddO2JvZHk9cHJvbW90aW9uUGFya0xBKGRheXMpLm1hcChnPT5bZy5uYW1lLGcuZGF5cyxnLmNvaW4sZy53aW4sZy5wcm9tbyxnLmNkLGcud2QsZy5zZCxnLnBvLGcucG9uXSk7Zm9ybWF0c1s4XT1mb3JtYXRzWzldPXBlcmNlbnRQYXJrTEE7JCgnI3BhcmtIZWxwTEEnKS50ZXh0Q29udGVudD0nQ29uIHByb21vY2nDs24gc2lnbmlmaWNhIGFsZ8O6biBtb3ZpbWllbnRvIFByb21vIEluIHUgT3V0LCBpbmNsdXNvIGN1YW5kbyBlbCBuZXRvIGVzIGNlcm8uIENvbXBhcmFjacOzbiBkZXNjcmlwdGl2YTogbm8gbWlkZSBlZmVjdG8gY2F1c2FsIG5pIHJlbnRhYmlsaWRhZCBkZSBsYSBwcm9tb2Npw7NuIHNpbiBzdXMgY29zdG9zIHkgY29uZGljaW9uZXMuJzt9CiBleHBvcnRSb3dzPVtoZWFkZXJzLC4uLmJvZHldO3BhcmtUYWJsZUxBKCQoJyNwYXJrUmVzdWx0c0xBJyksaGVhZGVycyxib2R5LGZvcm1hdHMpO2JpbmRGaWx0ZXJzKCk7JCgnI3BhcmtLaW5kTEEnKS5vbmNoYW5nZT1lPT57cy5raW5kPWUudGFyZ2V0LnZhbHVlO3JlbmRlcigpO307JCgnI3BhcmtBcHBseUxBJykub25jbGljaz0oKT0+e3MubWluRGF5cz1NYXRoLm1heCgyLE1hdGgubWluKDM2NixOdW1iZXIoJCgnI3BhcmtNaW5EYXlzTEEnKS52YWx1ZSl8fDcpKTtzLmxvd1BlcmNlbnQ9TWF0aC5tYXgoMSxNYXRoLm1pbig5OSxOdW1iZXIoJCgnI3BhcmtMb3dMQScpLnZhbHVlKXx8MjUpKTtyZW5kZXIoKTt9OyQoJyNjb250ZW50JykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJyxhY3RpdmVGaWx0ZXJzTEEoKSk7Cn0KY29uc3Qgc3VtbWFyeUJlZm9yZVBhcmtMQT1zdW1tYXJ5VmlldzsKc3VtbWFyeVZpZXc9ZnVuY3Rpb24oKXtzdW1tYXJ5QmVmb3JlUGFya0xBKCk7YWRkUGFya0ZvbGRMQSgncGFyZXRvUGFya0xBJywnQ29uY2VudHJhY2nDs24gZGVsIHJlc3VsdGFkbyDCtyBQYXJldG8gcG9yIG3DoXF1aW5hcyB5IGJhbmNvcycsaG9zdD0+e2hvc3QuaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJ2aWV3Y29udHJvbHMiPicrc2VsZWN0b3IoJ0FncnVwYXInLCdwYXJldG9Hcm91cExBJywnMScsezE6J03DoXF1aW5hJyw5OidCYW5jbyd9KStzZWxlY3RvcignSW5kaWNhZG9yJywncGFyZXRvTWV0cmljTEEnLCdjb2luJyx7Y29pbjonQ29pbiBJbicsd2luOidXaW4gb3BlcmFjaW9uYWwnfSkrJzwvZGl2PjxwIGNsYXNzPSJzaWduYWxub3RlIj5Qb3JjZW50YWplcyBzb2JyZSBjb250cmlidWNpb25lcyBwb3NpdGl2YXMuIExvcyBncnVwb3MgY29uIFdpbiBuZWdhdGl2byBzZSBtdWVzdHJhbiwgcGVybyBubyBhdW1lbnRhbiBsYSBiYXNlIG5pIGVsIGFjdW11bGFkby48L3A+PGRpdiBkYXRhLXBhcmV0b3RhYmxlPjwvZGl2PjxkaXYgZGF0YS1wYXJldG9leHBvcnQ+PC9kaXY+Jztjb25zdCBkcmF3PSgpPT57Y29uc3QgbWV0cmljPSQoJyNwYXJldG9NZXRyaWNMQScpLnZhbHVlLGhlYWRlcnM9WydHcnVwbycsbWV0cmljc1ttZXRyaWNdKycgQ0xQJywnUGFydGljaXBhY2nDs24gcG9zaXRpdmEnLCdBY3VtdWxhZG8gcG9zaXRpdm8nXSxyb3dzPXBhcmV0b1BhcmtMQShzbGljZVJvd3MoKSxOdW1iZXIoJCgnI3BhcmV0b0dyb3VwTEEnKS52YWx1ZSksbWV0cmljKS5tYXAoZz0+W2cubmFtZSxnLnZhbHVlLGcuc2hhcmUsZy5jdW11bGF0aXZlXSk7cGFya1RhYmxlTEEoaG9zdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYXJldG90YWJsZV0nKSxoZWFkZXJzLHJvd3MsW251bGwsbnVsbCxwZXJjZW50UGFya0xBLHBlcmNlbnRQYXJrTEFdKTtob3N0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhcmV0b2V4cG9ydF0nKS5pbm5lckhUTUw9Jyc7cGFya0V4cG9ydEJ1dHRvbkxBKGhvc3QucXVlcnlTZWxlY3RvcignW2RhdGEtcGFyZXRvZXhwb3J0XScpLGhlYWRlcnMscm93cywnTEEtUGFyZXRvJyk7fTskKCcjcGFyZXRvR3JvdXBMQScpLm9uY2hhbmdlPWRyYXc7JCgnI3BhcmV0b01ldHJpY0xBJykub25jaGFuZ2U9ZHJhdztkcmF3KCk7fSk7fTsKY29uc3QgY29tcGFyZUJlZm9yZVBhcmtMQT1jb21wYXJlVmlldzsKY29tcGFyZVZpZXc9ZnVuY3Rpb24oKXtjb21wYXJlQmVmb3JlUGFya0xBKCk7YWRkUGFya0ZvbGRMQSgnbW92ZXNQYXJrTEEnLCdSZXViaWNhY2lvbmVzIGRldGVjdGFkYXMgwrcgY29tcGFyYXIgYW50ZXMgeSBkZXNwdcOpcycsaG9zdD0+e2hvc3QuaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJ2aWV3Y29udHJvbHMiPicrc2VsZWN0b3IoJ1ZlbnRhbmEgYW50ZXMgeSBkZXNwdcOpcycsJ21vdmVEYXlzTEEnLCcxNCcsezc6JzcgZMOtYXMnLDE0OicxNCBkw61hcycsMjg6JzI4IGTDrWFzJ30pKyc8L2Rpdj48cCBjbGFzcz0ic2lnbmFsbm90ZSI+Q2FtYmlvcyBkZSBiYW5jbywgc2VjdG9yIG8gc2Fsw7NuIG9ic2VydmFkb3MgZW4gdG9kbyBlbCBoaXN0w7NyaWNvLiBMYSBmZWNoYSBlcyBlbCBwcmltZXIgcmVnaXN0cm8gZW4gbGEgbnVldmEgdWJpY2FjacOzbiwgbm8gY29uZmlybWEgZWwgbW9tZW50byBkZWwgdHJhc2xhZG8uIFNlIGRlc2NhcnRhbiBkw61hcyBjb24gdWJpY2FjaW9uZXMgY29udHJhZGljdG9yaWFzLiBQcm9tZWRpb3MgcG9yIGTDrWEgcmVnaXN0cmFkbzogY29tcGFyYSBsYSBjb2JlcnR1cmEgYW50ZXMgZGUgY29uY2x1aXIuPC9wPjxkaXYgZGF0YS1tb3ZldGFibGU+PC9kaXY+PGRpdiBkYXRhLW1vdmVleHBvcnQ+PC9kaXY+Jztjb25zdCBkcmF3PSgpPT57Y29uc3QgaGVhZGVycz1bJ03DoXF1aW5hJywnUHJpbWVyIHJlZ2lzdHJvIG51ZXZhIHViaWNhY2nDs24nLCdBbnRlczogYmFuY28gLyBzZWN0b3IgLyBzYWzDs24nLCdEZXNwdcOpczogYmFuY28gLyBzZWN0b3IgLyBzYWzDs24nLCdEw61hcyBhbnRlcycsJ0TDrWFzIGRlc3B1w6lzJywnQ29pbiBJbi9kw61hIGFudGVzJywnQ29pbiBJbi9kw61hIGRlc3B1w6lzJywnV2luL2TDrWEgYW50ZXMnLCdXaW4vZMOtYSBkZXNwdcOpcyddLHJvd3M9bW92ZXNQYXJrTEEoZGFpbHlQYXJrTEEoZGF0YS5yb3dzKSxOdW1iZXIoJCgnI21vdmVEYXlzTEEnKS52YWx1ZSkpLm1hcChtPT5bbS5pZCxtLmRhdGUsbS5vbGQuam9pbignIC8gJyksbS5uZXh0LmpvaW4oJyAvICcpLG0uYmVmb3JlLG0uYWZ0ZXIsbS5jb2luQSxtLmNvaW5CLG0ud2luQSxtLndpbkJdKTtwYXJrVGFibGVMQShob3N0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1vdmV0YWJsZV0nKSxoZWFkZXJzLHJvd3MpO2hvc3QucXVlcnlTZWxlY3RvcignW2RhdGEtbW92ZWV4cG9ydF0nKS5pbm5lckhUTUw9Jyc7cGFya0V4cG9ydEJ1dHRvbkxBKGhvc3QucXVlcnlTZWxlY3RvcignW2RhdGEtbW92ZWV4cG9ydF0nKSxoZWFkZXJzLHJvd3MsJ0xBLVJldWJpY2FjaW9uZXMnKTt9OyQoJyNtb3ZlRGF5c0xBJykub25jaGFuZ2U9ZHJhdztkcmF3KCk7fSk7fTsKY29uc3QgcHJpemVzQmVmb3JlUGFya0xBPXJlbmRlclByaXplc0xBOwpyZW5kZXJQcml6ZXNMQT1mdW5jdGlvbigpe3ByaXplc0JlZm9yZVBhcmtMQSgpO2FkZFBhcmtGb2xkTEEoJ3ByaXplc0FjdGl2aXR5TEEnLCdQcmVtaW9zIGZyZW50ZSBhIGFjdGl2aWRhZCDCtyBzZW1hbmFzIHkgbcOhcXVpbmFzJyxob3N0PT57Y29uc3Qgcm93cz1jdXJyZW50UHJpemVSZXBvcnRMQS5yb3dzLGhlYWRlcnM9WydNw6FxdWluYScsJ1ByZW1pb3MgbmV0b3MgQ0xQJywnQ29pbiBJbiBDTFAnLCdTcGlucycsJ1ByZW1pb3MgLyBDb2luIEluJywnUHJlbWlvcyBwb3IgMS4wMDAgc3BpbnMnLCdQcmVtaW9zIC8gQ29pbiBJbiBoaXN0w7NyaWNvIGRlIG3DoXF1aW5hJ10saGlzdG9yeT1uZXcgTWFwKGdyb3VwcyhkYXRhLnJvd3Mscj0+U3RyaW5nKHJbMV0/PydTaW4gaWRlbnRpZmljYWNpw7NuJykpLm1hcChnPT5bZy5uYW1lLGRpdihnLnByaXplLGcuY29pbildKSksYm9keT1ncm91cHMocm93cyxyPT5TdHJpbmcoclsxXT8/J1NpbiBpZGVudGlmaWNhY2nDs24nKSkuc29ydCgoYSxiKT0+Yi5wcml6ZS1hLnByaXplKS5tYXAoZz0+W2cubmFtZSxnLnByaXplLGcuY29pbixnLnNwaW4sZGl2KGcucHJpemUsZy5jb2luKSxnLnNwaW4/Zy5wcml6ZS9nLnNwaW4qMTAwMDpudWxsLGhpc3RvcnkuZ2V0KGcubmFtZSldKSx0b3RhbD1hZ2cocm93cyk7aG9zdC5pbm5lckhUTUw9JzxwIGNsYXNzPSJzaWduYWxub3RlIj5Vc2EgbGFzIHNlbWFuYXMgeSBmaWx0cm9zIHNlbGVjY2lvbmFkb3MgYXJyaWJhLiBQcmVtaW9zIG5ldG9zIGluY2x1eWVuIGFqdXN0ZXMgbmVnYXRpdm9zLiBMYSByZWZlcmVuY2lhIGhpc3TDs3JpY2EgdXNhIHRvZG9zIGxvcyBkw61hcyBjYXJnYWRvcyBkZSBsYSBtw6FxdWluYSwgaW5jbHVpZGEgbGEgc2VsZWNjacOzbjsgbm8gY2xhc2lmaWNhIHRpcG9zIGRlIHByZW1pb3MuPC9wPicrc3RhdENhcmRzKFtbJ1BSRU1JT1MgLyBDT0lOIElOJyxwZXJjZW50UGFya0xBKGRpdih0b3RhbC5wcml6ZSx0b3RhbC5jb2luKSksJ1Byb3BvcmNpw7NuIHNvYnJlIGVsIENvaW4gSW4gc2VsZWNjaW9uYWRvJ10sWydQUkVNSU9TIC8gMS4wMDAgU1BJTlMnLGZtdCh0b3RhbC5zcGluP3RvdGFsLnByaXplL3RvdGFsLnNwaW4qMTAwMDpudWxsKSwnQ0xQIHBvciBtaWwgc3BpbnMnXV0pKyc8ZGl2IGRhdGEtcHJpemVzYWN0aXZpdHk+PC9kaXY+JztwYXJrVGFibGVMQShob3N0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByaXplc2FjdGl2aXR5XScpLGhlYWRlcnMsYm9keSxbbnVsbCxudWxsLG51bGwsbnVsbCxwZXJjZW50UGFya0xBLG51bGwscGVyY2VudFBhcmtMQV0pO3BhcmtFeHBvcnRCdXR0b25MQShob3N0LGhlYWRlcnMsYm9keSwnTEEtUHJlbWlvcy1hY3RpdmlkYWQnKTt9KTt9Owpjb25zdCBhbGVydHNCZWZvcmVQYXJrTEE9cmVuZGVyQWxlcnRzTEE7CnJlbmRlckFsZXJ0c0xBPWZ1bmN0aW9uKCl7YWxlcnRzQmVmb3JlUGFya0xBKCk7YWRkUGFya0ZvbGRMQSgncGVyc2lzdGVudFBhcmtMQScsJ1BlcnNpc3RlbmNpYSBkZSBjYcOtZGFzIHkgcmVnaXN0cm9zIGRlIGFjdGl2aWRhZCBjZXJvJyxob3N0PT57Y29uc3QgaGVhZGVycz1bJ0dydXBvJywnRMOtYXMgY29uc2VjdXRpdm9zIGRlIGNhw61kYSBoYXN0YSBmZWNoYSBmaW5hbCcsJ0Jhc2UgYW50ZXJpb3IgLyBtw6FxdWluYS1kw61hJywnRMOtYXMgYWN0dWFsZXMgcmVnaXN0cmFkb3MnLCdNw6FxdWluYXMtZMOtYSBjb24gYWN0aXZpZGFkIGNlcm8nLCdNw6FxdWluYXMtZMOtYSBhY3R1YWxlcycsJ03DoXF1aW5hcy1kw61hIGFudGVyaW9yZXMnXSxyb3dzPXBlcnNpc3RlbnRQYXJrTEEoYWxlcnRSZXBvcnRMQS5lbnRyaWVzLGFsZXJ0U2V0dGluZ3NMQSgpKS5tYXAoZz0+W2cubmFtZSxnLnN0cmVhayxnLm9sZCxnLmRheXMsZy56ZXJvLGcuY292ZXJhZ2UsZy5wcmV2aW91c0NvdmVyYWdlXSk7aG9zdC5pbm5lckhUTUw9JzxwIGNsYXNzPSJzaWduYWxub3RlIj5MYSByYWNoYSBjb21wYXJhIGNhZGEgZMOtYSBjb24gZWwgcHJvbWVkaW8gYW50ZXJpb3IgeSBlbCB1bWJyYWwgY29uZmlndXJhZG8uIFNvbG8gY3VlbnRhIGTDrWFzIGNvbnNlY3V0aXZvcyBoYXN0YSBsYSBmZWNoYSBmaW5hbDsgbG9zIGTDrWFzIHNpbiByZWdpc3Ryb3MgaW50ZXJydW1wZW4gbGEgcmFjaGEuIENlcm8gcmVxdWllcmUgQ29pbiBJbiB5IHNwaW5zIGNlcm87IG5vIHNlIGludGVycHJldGEgY29tbyBhdmVyw61hLjwvcD48ZGl2IGRhdGEtcGVyc2lzdGVudHRhYmxlPjwvZGl2Pic7cGFya1RhYmxlTEEoaG9zdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wZXJzaXN0ZW50dGFibGVdJyksaGVhZGVycyxyb3dzKTtwYXJrRXhwb3J0QnV0dG9uTEEoaG9zdCxoZWFkZXJzLHJvd3MsJ0xBLVBlcnNpc3RlbmNpYS1hbGVydGFzJyk7fSk7fTsKY29uc3QgZXh0cmFCZWZvcmVQYXJrTEE9ZXh0cmFSZXBvcnRzOwpleHRyYVJlcG9ydHM9ZnVuY3Rpb24oKXtleHRyYUJlZm9yZVBhcmtMQSgpO2lmKHZpZXdTdGF0ZS5leHRyYS5raW5kPT09J3F1YWxpdHknKWFkZFBhcmtGb2xkTEEoJ3F1YWxpdHlQYXJrTEEnLCdDYWxpZGFkIGRlbCBoaXN0w7NyaWNvIMK3IGlkZW50aWZpY2Fkb3JlcywgZHVwbGljYWRvcyB5IHViaWNhY2lvbmVzJyxob3N0PT57Y29uc3QgcT1xdWFsaXR5UGFya0xBKHNsaWNlUm93cygpKSxoZWFkZXJzPVsnQ29udHJvbCcsJ0NhbnRpZGFkJywnSW50ZXJwcmV0YWNpw7NuJ10scm93cz1bWydGaWxhcyBhZGljaW9uYWxlcyBkZSB1bmEgbcOhcXVpbmEgeSBmZWNoYScscS5kdXBsaWNhdGVzLCdSZXZpc2FyIGdyYW51bGFyaWRhZDsgbm8gc2UgZWxpbWluYW4gYXV0b23DoXRpY2FtZW50ZSddLFsnRmlsYXMgc2luIG3DoXF1aW5hJyxxLm1pc3NpbmcsJ0V4Y2x1aWRhcyBkZWwgYW7DoWxpc2lzIHBvciBtw6FxdWluYS1kw61hIGRlIGVzdGEgbnVldmEgcGVzdGHDsWEnXSxbJ0ZlY2hhcyBpbnbDoWxpZGFzJyxxLmludmFsaWREYXRlcywnU29icmUgbGEgbWF0cml6IHlhIGNhcmdhZGEnXSxbJ0NlbGRhcyBudW3DqXJpY2FzIGludsOhbGlkYXMnLHEuaW52YWxpZE51bWJlcnMsJ1ByZW1pb3MsIFdpbiwgQ29pbiBJbiwgc3BpbnMgeSBwcm9tb2Npb25lcyddLFsnTcOhcXVpbmFzLWTDrWEgY29uIHViaWNhY2lvbmVzIGNvbnRyYWRpY3RvcmlhcycscS5hbWJpZ3VvdXMsJ1NlIG9taXRlbiBhbCBkZXRlY3RhciB0cmFzbGFkb3MnXV07cGFya1RhYmxlTEEoaG9zdCxoZWFkZXJzLHJvd3MpO3BhcmtFeHBvcnRCdXR0b25MQShob3N0LGhlYWRlcnMscm93cywnTEEtQ2FsaWRhZCcpO30pO307CmNvbnN0IGZpbHRlcnNCZWZvcmVQYXJrTEE9YWN0aXZlRmlsdGVyc0xBOwphY3RpdmVGaWx0ZXJzTEE9ZnVuY3Rpb24oKXtpZih0YWIhPT0nQW7DoWxpc2lzIGRlbCBwYXJxdWUnKXJldHVybiBmaWx0ZXJzQmVmb3JlUGFya0xBKCk7Y29uc3Qgcz12aWV3U3RhdGUucGFya3x8e2ZpbHRlcnM6e319LGxhYmVscz1PYmplY3QuZW50cmllcyhzLmZpbHRlcnMpLmZpbHRlcigoWyx2XSk9PnYubGVuZ3RoKS5tYXAoKFtrLHZdKT0+ZGltc1trXSsnOiAnK3Yuam9pbignLCAnKSk7cmV0dXJuICc8ZGl2IGNsYXNzPSJhY3RpdmVGaWx0ZXJzTEEiPjxiPkNvbnN1bHRhIGFjdHVhbDwvYj48c3Bhbj4nK2VzYyhzZWxlY3RlZERhdGVUZXh0VjgoJ2dsb2JhbCcpKSsnPC9zcGFuPicrbGFiZWxzLm1hcCh2PT4nPHNwYW4+Jytlc2ModikrJzwvc3Bhbj4nKS5qb2luKCcnKSsnPC9kaXY+Jzt9Owpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCduYXYgYnV0dG9uW2RhdGEtdGFiPSJNZXRvZG9sb2fDrWEiXScpLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlYmVnaW4nLCc8YnV0dG9uIGRhdGEtdGFiPSJBbsOhbGlzaXMgZGVsIHBhcnF1ZSI+4panICZuYnNwOyBBbsOhbGlzaXMgZGVsIHBhcnF1ZTwvYnV0dG9uPicpO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ25hdiBidXR0b25bZGF0YS10YWI9IkFuw6FsaXNpcyBkZWwgcGFycXVlIl0nKS5vbmNsaWNrPSgpPT5hY3RpdmF0ZVRhYlYzKCdBbsOhbGlzaXMgZGVsIHBhcnF1ZScpOwpjb25zdCByZW5kZXJCZWZvcmVQYXJrTEE9cmVuZGVyOwpyZW5kZXI9ZnVuY3Rpb24oKXtyZW5kZXJCZWZvcmVQYXJrTEEoKTtpZihkYXRhJiZ0YWI9PT0nQW7DoWxpc2lzIGRlbCBwYXJxdWUnKXtyZW5kZXJQYXJrTEEoKTtmb3JtYXRUZXh0RGF0ZXNWNSgkKCcjY29udGVudCcpKTt9fTsKY29uc3QgZXhwb3J0QmVmb3JlUGFya0xBPSQoJyN2MmV4cG9ydCcpLm9uY2xpY2s7CiQoJyN2MmV4cG9ydCcpLm9uY2xpY2s9ZnVuY3Rpb24oKXtpZih0YWIhPT0nQW7DoWxpc2lzIGRlbCBwYXJxdWUnKXJldHVybiBleHBvcnRCZWZvcmVQYXJrTEEoKTtkb3dubG9hZEJsb2JWOCh3b3JrYm9va0Jsb2JWOChbe25hbWU6J0FuYWxpc2lzIGRlbCBwYXJxdWUnLHJvd3M6ZXhwb3J0Um93c30se25hbWU6J0NvbnN1bHRhJyxyb3dzOltbJ1BlcsOtb2RvJyxzZWxlY3RlZERhdGVUZXh0VjgoJ2dsb2JhbCcpXSxbJ0NvbmZpZ3VyYWNpw7NuJyxKU09OLnN0cmluZ2lmeSh2aWV3U3RhdGUucGFyayldLFsnTGltaXRhY2lvbmVzJywkKCcjcGFya0hlbHBMQScpLnRleHRDb250ZW50XV19XSksJ0xBLUFuYWxpc2lzLWRlbC1wYXJxdWUueGxzeCcpO307Cg==