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 · mejoras integrales v5
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+d2Vla0xhYmVsVjgoeSx3LGRhdGE/c2xpY2VSb3dzKCk6W10pKS5yZXBsYWNlKC9cYihcZHs0fSktVChbMS00XSlcYi9nLChtLHkscSk9PmBUcmltZXN0cmUgJHtxfSDCtyAke3l9YCk7cmV0dXJuIGRpc3BsYXlCZWZvcmVWOCh0ZXh0KX07CmNvbnN0IGRlc2NyaXB0aW9uQmVmb3JlVjg9cGVyaW9kRGVzY3JpcHRpb25WNDsKcGVyaW9kRGVzY3JpcHRpb25WND1mdW5jdGlvbihuYW1lLHBvaW50cyl7Y29uc3QgcmVzdWx0PWRlc2NyaXB0aW9uQmVmb3JlVjgobmFtZSxwb2ludHMpLG1hdGNoPW5hbWUubWF0Y2goL14oXGR7NH0pIMK3IFMoXGR7MSwyfSkkLyk7aWYobWF0Y2gpe3Jlc3VsdC5sYWJlbD13ZWVrTGFiZWxWOChtYXRjaFsxXSxtYXRjaFsyXSxwb2ludHMuZmxhdE1hcChwPT5wLnJvd3N8fFtdKSk7cmVzdWx0LmZ1bGw9cmVzdWx0LmxhYmVsKycgwrcgRGF0b3M6ICcrcmVzdWx0LnJhbmdlfXJldHVybiByZXN1bHR9Owpjb25zdCBrZXlCZWZvcmVWOD1wZXJpb2RLZXk7CnBlcmlvZEtleT1mdW5jdGlvbihyb3csZ3JhaW4pe3JldHVybiBncmFpbj09PSdxdWFydGVyJz9xdWFydGVyS2V5Vjgocm93WzBdKTprZXlCZWZvcmVWOChyb3csZ3JhaW4pfTsKY29uc3QgcmVwb3J0UGVyaW9kQmVmb3JlVjg9cmVwb3J0UGVyaW9kOwpyZXBvcnRQZXJpb2Q9ZnVuY3Rpb24ocm93LHR5cGUpe2NvbnN0IHN0YXRlPXRhYj09PSdSZXBvcnRlIHNlbWFuYWwnP3ZpZXdTdGF0ZS53ZWVrbHk6dGFiPT09J1JlcG9ydGUgbWVuc3VhbCc/dmlld1N0YXRlLm1vbnRobHk6dGFiPT09J0V2b2x1dGl2byBtZW5zdWFsJz92aWV3U3RhdGUubW9udGhseUV2b2x1dGlvbjpudWxsO3JldHVybiBzdGF0ZT8uZ3JvdXBRdWFydGVyP3F1YXJ0ZXJLZXlWOChyb3dbMF0pOnJlcG9ydFBlcmlvZEJlZm9yZVY4KHJvdyx0eXBlKX07CmZ1bmN0aW9uIG1vbnRoQ2hvaWNlc1Y4KCl7cmV0dXJuIFsuLi5uZXcgU2V0KGRhdGEucm93cy5tYXAocj0+clswXS5zbGljZSgwLDcpKSldLnNvcnQoKX0KZnVuY3Rpb24gY2FsZW5kYXJQYW5lbFY4KHNjb3BlKXsKIGNvbnN0IHN0YXRlPWNhbGVuZGFyU3RhdGVWOChzY29wZSksbW9udGhzPW1vbnRoQ2hvaWNlc1Y4KCkscXVhcnRlcnM9Wy4uLm5ldyBTZXQoZGF0YS5yb3dzLm1hcChyPT5xdWFydGVyS2V5VjgoclswXSkpKV0uc29ydCgpO3N0YXRlLm1vbnRofHw9bW9udGhzLmF0KC0xKXx8Jyc7c3RhdGUucXVhcnRlcnx8PXF1YXJ0ZXJzLmF0KC0xKXx8Jyc7CiBjb25zdCB3ZWVrcz1bLi4ubmV3IFNldChkYXRhLnJvd3MuZmlsdGVyKHI9PnJbMF0uc3RhcnRzV2l0aChzdGF0ZS5tb250aCkpLm1hcChyPT53ZWVrTnVtYmVyVjgoclswXSkpKV0uc29ydCgoYSxiKT0+YS1iKTsKIGxldCBkZXRhaWxzPScnOwogaWYoc3RhdGUubW9kZT09PSdkYXRlcycpZGV0YWlscz1gPGxhYmVsPkFncmVnYXIgdW5hIGZlY2hhIGNvbiBjYWxlbmRhcmlvPGlucHV0IHR5cGU9ImRhdGUiIGlkPSJkYXktJHtzY29wZX0iPjwvbGFiZWw+PGJ1dHRvbiBkYXRhLWFkZGRheT0iJHtzY29wZX0iPkFncmVnYXIgZMOtYTwvYnV0dG9uPjxkaXYgY2xhc3M9ImRhdGVjaGlwcyI+JHtzdGF0ZS5kYXRlcy5tYXAoZD0+YDxidXR0b24gZGF0YS1yZW1vdmVkYXk9IiR7c2NvcGV9fCR7ZH0iPiR7ZGlzcGxheURhdGVzVjUoZCl9IMOXPC9idXR0b24+YCkuam9pbignJyl8fCc8c3Bhbj5FbGlnZSB1bm8gbyB2YXJpb3MgZMOtYXMgZXNwZWPDrWZpY29zLjwvc3Bhbj4nfTwvZGl2PmA7CiBpZihbJ21vbnRoJywnd2VlayddLmluY2x1ZGVzKHN0YXRlLm1vZGUpKWRldGFpbHM9YDxsYWJlbD4xLiBNZXM8c2VsZWN0IGRhdGEtY2FsbW9udGg9IiR7c2NvcGV9Ij4ke21vbnRocy5tYXAobT0+YDxvcHRpb24gdmFsdWU9IiR7bX0iICR7bT09PXN0YXRlLm1vbnRoPydzZWxlY3RlZCc6Jyd9PiR7ZGlzcGxheURhdGVzVjUobSl9PC9vcHRpb24+YCkuam9pbignJyl9PC9zZWxlY3Q+PC9sYWJlbD4ke3N0YXRlLm1vZGU9PT0nd2Vlayc/YDxsYWJlbD4yLiBTZW1hbmFzIGRlbCBtZXM8c2VsZWN0IG11bHRpcGxlIGRhdGEtY2Fsd2Vla3M9IiR7c2NvcGV9Ij4ke3dlZWtzLm1hcCh3PT57Y29uc3QgZGF0ZXM9ZGF0YS5yb3dzLmZpbHRlcihyPT5yWzBdLnN0YXJ0c1dpdGgoc3RhdGUubW9udGgpJiZ3ZWVrTnVtYmVyVjgoclswXSk9PT13KS5tYXAocj0+clswXSkuc29ydCgpO3JldHVybiBgPG9wdGlvbiB2YWx1ZT0iJHt3fSIgJHtzdGF0ZS53ZWVrcy5pbmNsdWRlcyhTdHJpbmcodykpPydzZWxlY3RlZCc6Jyd9PiR7bW9udGhTaG9ydFY4W051bWJlcihzdGF0ZS5tb250aC5zbGljZSg1KSktMV19LSR7d30gwrcgJHtkaXNwbGF5RGF0ZXNWNShkYXRlc1swXSl9IGEgJHtkaXNwbGF5RGF0ZXNWNShkYXRlcy5hdCgtMSkpfTwvb3B0aW9uPmB9KS5qb2luKCcnKX08L3NlbGVjdD48L2xhYmVsPjxzbWFsbD5TaW4gc2VsZWNjacOzbiBkZSBzZW1hbmE6IHRvZG8gZWwgbWVzLiBDdHJsL0NtZCArIGNsaWMgcGVybWl0ZSBlbGVnaXIgdmFyaWFzLiBVbmEgc2VtYW5hIHF1ZSBjcnV6YSBkZSBtZXMgaW5jbHV5ZSBhcXXDrSBzb2xvIGxvcyBkw61hcyBkZWwgbWVzIGVsZWdpZG8uPC9zbWFsbD5gOicnfWA7CiBpZihzdGF0ZS5tb2RlPT09J3F1YXJ0ZXInKWRldGFpbHM9YDxsYWJlbD5UcmltZXN0cmU8c2VsZWN0IGRhdGEtY2FscXVhcnRlcj0iJHtzY29wZX0iPiR7cXVhcnRlcnMubWFwKHE9PmA8b3B0aW9uIHZhbHVlPSIke3F9IiAke3E9PT1zdGF0ZS5xdWFydGVyPydzZWxlY3RlZCc6Jyd9PiR7ZGlzcGxheURhdGVzVjUocSl9PC9vcHRpb24+YCkuam9pbignJyl9PC9zZWxlY3Q+PC9sYWJlbD5gOwogcmV0dXJuIGA8ZGl2IGNsYXNzPSJjYWxlbmRhclBhbmVsIiBkYXRhLWNhbGVuZGFycGFuZWw9IiR7c2NvcGV9Ij48ZGl2IGNsYXNzPSJjYWxlbmRhckNvbnRyb2xzIj48bGFiZWw+U2VsZWNjaW9uYXIgZmVjaGFzIHBvcjxzZWxlY3QgZGF0YS1jYWxtb2RlPSIke3Njb3BlfSI+JHtPYmplY3QuZW50cmllcyh7cmFuZ2U6J1JhbmdvIGNvbiBjYWxlbmRhcmlvJyxkYXRlczonRMOtYXMgZXNwZWPDrWZpY29zJyxtb250aDonTWVzJyx3ZWVrOidNZXMgeSBzZW1hbmFzJyxxdWFydGVyOidUcmltZXN0cmUnfSkubWFwKChbayx2XSk9PmA8b3B0aW9uIHZhbHVlPSIke2t9IiAke3N0YXRlLm1vZGU9PT1rPydzZWxlY3RlZCc6Jyd9PiR7dn08L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48L2xhYmVsPiR7ZGV0YWlsc308L2Rpdj48L2Rpdj5gOwp9CmZ1bmN0aW9uIHNlbGVjdGVkRGF0ZVRleHRWOChzY29wZSl7Y29uc3Qgc3RhdGU9Y2FsZW5kYXJTdGF0ZVY4KHNjb3BlKTtpZihzdGF0ZS5tb2RlPT09J2RhdGVzJylyZXR1cm4gc3RhdGUuZGF0ZXMubGVuZ3RoP3N0YXRlLmRhdGVzLm1hcChkaXNwbGF5RGF0ZXNWNSkuam9pbignLCAnKTonU2luIGTDrWFzIGVsZWdpZG9zJztpZihzdGF0ZS5tb2RlPT09J21vbnRoJylyZXR1cm4gZGlzcGxheURhdGVzVjUoc3RhdGUubW9udGgpO2lmKHN0YXRlLm1vZGU9PT0nd2VlaycpcmV0dXJuIGRpc3BsYXlEYXRlc1Y1KHN0YXRlLm1vbnRoKSsoc3RhdGUud2Vla3MubGVuZ3RoPycgwrcgU2VtYW5hcyAnK3N0YXRlLndlZWtzLmpvaW4oJywgJyk6JyDCtyBUb2RhcyBsYXMgc2VtYW5hcycpO2lmKHN0YXRlLm1vZGU9PT0ncXVhcnRlcicpcmV0dXJuIGRpc3BsYXlEYXRlc1Y1KHN0YXRlLnF1YXJ0ZXIpO2NvbnN0IGZyb209c2NvcGU9PT0nZ2xvYmFsJz8kKCcjZnJvbScpLnZhbHVlOnZpZXdTdGF0ZVtzY29wZV0uZnJvbSx0bz1zY29wZT09PSdnbG9iYWwnPyQoJyN0bycpLnZhbHVlOnZpZXdTdGF0ZVtzY29wZV0udG87cmV0dXJuIGRpc3BsYXlEYXRlc1Y1KGZyb20pKycg4oaSICcrZGlzcGxheURhdGVzVjUodG8pfQpmdW5jdGlvbiBiaW5kQ2FsZW5kYXJzVjgoKXsKIGZvcihjb25zdCBbYXR0cmlidXRlLGtleV1vZiBbWydjYWxtb2RlJywnbW9kZSddLFsnY2FsbW9udGgnLCdtb250aCddLFsnY2FscXVhcnRlcicsJ3F1YXJ0ZXInXV0pZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtJythdHRyaWJ1dGUrJ10nKS5mb3JFYWNoKGVsPT5lbC5vbmNoYW5nZT0oKT0+e2xldCBzdGF0ZT1jYWxlbmRhclN0YXRlVjgoZWwuZGF0YXNldFthdHRyaWJ1dGVdKTtzdGF0ZVtrZXldPWVsLnZhbHVlO2lmKGtleT09PSdtb250aCcpc3RhdGUud2Vla3M9W107cmVuZGVyKCl9KTsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWNhbHdlZWtzXScpLmZvckVhY2goZWw9PmVsLm9uY2hhbmdlPSgpPT57Y2FsZW5kYXJTdGF0ZVY4KGVsLmRhdGFzZXQuY2Fsd2Vla3MpLndlZWtzPVsuLi5lbC5zZWxlY3RlZE9wdGlvbnNdLm1hcChvPT5vLnZhbHVlKTtyZW5kZXIoKX0pOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYWRkZGF5XScpLmZvckVhY2goZWw9PmVsLm9uY2xpY2s9KCk9Pntjb25zdCBzY29wZT1lbC5kYXRhc2V0LmFkZGRheSxkPSQoJyNkYXktJytzY29wZSkudmFsdWU7aWYoIWQpcmV0dXJuO2NvbnN0IHN0YXRlPWNhbGVuZGFyU3RhdGVWOChzY29wZSk7aWYoIXN0YXRlLmRhdGVzLmluY2x1ZGVzKGQpKXN0YXRlLmRhdGVzLnB1c2goZCk7c3RhdGUuZGF0ZXMuc29ydCgpO3JlbmRlcigpfSk7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yZW1vdmVkYXldJykuZm9yRWFjaChlbD0+ZWwub25jbGljaz0oKT0+e2xldFtzY29wZSxkYXldPWVsLmRhdGFzZXQucmVtb3ZlZGF5LnNwbGl0KCd8Jyk7Y2FsZW5kYXJTdGF0ZVY4KHNjb3BlKS5kYXRlcz1jYWxlbmRhclN0YXRlVjgoc2NvcGUpLmRhdGVzLmZpbHRlcihkPT5kIT09ZGF5KTtyZW5kZXIoKX0pOwp9CmNvbnN0IGNvcHlCZWZvcmVWOD1jb21wYXJlVmlldzsKY29tcGFyZVZpZXc9ZnVuY3Rpb24oKXtjb3B5QmVmb3JlVjgoKTtmb3IoY29uc3Qgc2NvcGUgb2YgWydBJywnQiddKXtjb25zdCBwYW5lbD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2lkZScrc2NvcGUpO3BhbmVsLnF1ZXJ5U2VsZWN0b3IoJy5jb21wYXJlRGF0ZXMnKS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyZW5kJyxjYWxlbmRhclBhbmVsVjgoc2NvcGUpKTtwYW5lbC5xdWVyeVNlbGVjdG9yKCcuY29tcGFyZURhdGVzJykuc3R5bGUuZGlzcGxheT1jYWxlbmRhclN0YXRlVjgoc2NvcGUpLm1vZGU9PT0ncmFuZ2UnPydncmlkJzonbm9uZSc7cGFuZWwuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLGA8cCBjbGFzcz0ic2lnbmFsbm90ZSI+UGVyw61vZG8gJHtzY29wZX06ICR7ZXNjKHNlbGVjdGVkRGF0ZVRleHRWOChzY29wZSkpfTwvcD5gKX0KIGNvbnN0IGNvcHk9JCgnI2NvcHlBQicpLm9uY2xpY2ssc3dhcD0kKCcjc3dhcEFCJykub25jbGljazskKCcjY29weUFCJykub25jbGljaz0oKT0+e3ZpZXdTdGF0ZS5jYWxlbmRhcnM/Pz17fTt2aWV3U3RhdGUuY2FsZW5kYXJzLkI9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjYWxlbmRhclN0YXRlVjgoJ0EnKSkpO2NvcHkoKX07JCgnI3N3YXBBQicpLm9uY2xpY2s9KCk9Pntjb25zdCBhPWNhbGVuZGFyU3RhdGVWOCgnQScpLGI9Y2FsZW5kYXJTdGF0ZVY4KCdCJyk7dmlld1N0YXRlLmNhbGVuZGFycy5BPWI7dmlld1N0YXRlLmNhbGVuZGFycy5CPWE7c3dhcCgpfTsKfTsKY29uc3QgcmVuZGVyQmVmb3JlVjg9cmVuZGVyOwpyZW5kZXI9ZnVuY3Rpb24oKXsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jYWxlbmRhclBhbmVsJykuZm9yRWFjaChwYW5lbD0+cGFuZWwucmVtb3ZlKCkpOwogaWYoZGF0YSl7Zm9yKGNvbnN0IHNjb3BlIG9mIFsnZ2xvYmFsJywnQScsJ0InXSl7Y29uc3Qgc3RhdGU9Y2FsZW5kYXJTdGF0ZVY4KHNjb3BlKTtzdGF0ZS5tb250aHx8PW1vbnRoQ2hvaWNlc1Y4KCkuYXQoLTEpfHwnJztzdGF0ZS5xdWFydGVyfHw9Wy4uLm5ldyBTZXQoZGF0YS5yb3dzLm1hcChyPT5xdWFydGVyS2V5VjgoclswXSkpKV0uc29ydCgpLmF0KC0xKXx8Jyd9fQogcmVuZGVyQmVmb3JlVjgoKTtpZighZGF0YSlyZXR1cm47CiBpZighWydDb21wYXJhdGl2b3MnLCdNZXRvZG9sb2fDrWEnXS5pbmNsdWRlcyh0YWIpKXsKICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmlsdGVycycpLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJyxjYWxlbmRhclBhbmVsVjgoJ2dsb2JhbCcpKTtmb3IoY29uc3QgaWQgb2YgWydmcm9tJywndG8nXSkkKCcjJytpZCkuY2xvc2VzdCgnbGFiZWwnKS5zdHlsZS5kaXNwbGF5PWNhbGVuZGFyU3RhdGVWOCgnZ2xvYmFsJykubW9kZT09PSdyYW5nZSc/J2ZsZXgnOidub25lJzskKCcjdmlld0hlbHAnKS50ZXh0Q29udGVudD1zZWxlY3RlZERhdGVUZXh0VjgoJ2dsb2JhbCcpOwogfQogY29uc3Qgc3RhdGU9dGFiPT09J1JlcG9ydGUgc2VtYW5hbCc/dmlld1N0YXRlLndlZWtseTp0YWI9PT0nUmVwb3J0ZSBtZW5zdWFsJz92aWV3U3RhdGUubW9udGhseTp0YWI9PT0nRXZvbHV0aXZvIG1lbnN1YWwnP3ZpZXdTdGF0ZS5tb250aGx5RXZvbHV0aW9uOm51bGw7CiBpZihzdGF0ZSl7Y29uc3QgY29udHJvbHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NvbnRlbnQgLnZpZXdjb250cm9scycpO2NvbnRyb2xzLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJyxzZWxlY3RvcignQWdydXBhY2nDs24gZGVsIGluZm9ybWUnLCdxdWFydGVyR3JvdXBWOCcsc3RhdGUuZ3JvdXBRdWFydGVyPydxdWFydGVyJzonb3JpZ2luYWwnLHtvcmlnaW5hbDp0YWI9PT0nUmVwb3J0ZSBzZW1hbmFsJz8nU2VtYW5hbCc6J01lbnN1YWwnLHF1YXJ0ZXI6J1RyaW1lc3RyYWwnfSkpOyQoJyNxdWFydGVyR3JvdXBWOCcpLm9uY2hhbmdlPWU9PntzdGF0ZS5ncm91cFF1YXJ0ZXI9ZS50YXJnZXQudmFsdWU9PT0ncXVhcnRlcic7cmVuZGVyKCl9fQogaWYodGFiPT09J0V2b2x1Y2nDs24nKXtjb25zdCBzZWxlY3Q9JCgnI2VncmFpbicpO2lmKCFbLi4uc2VsZWN0Lm9wdGlvbnNdLnNvbWUobz0+by52YWx1ZT09PSdxdWFydGVyJykpc2VsZWN0LmFkZChuZXcgT3B0aW9uKCdUcmltZXN0cmFsJywncXVhcnRlcicpKTtzZWxlY3QudmFsdWU9dmlld1N0YXRlLmV2b2x1dGlvbi5ncmFpbn0KIGlmKHRhYiE9PSdNZXRvZG9sb2fDrWEnKSQoJyNjb250ZW50JykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJyxgPGRpdiBjbGFzcz0iZGF0ZVN1bW1hcnlWOCI+JHt0YWI9PT0nQ29tcGFyYXRpdm9zJz9gQTogJHtlc2Moc2VsZWN0ZWREYXRlVGV4dFY4KCdBJykpfTxicj5COiAke2VzYyhzZWxlY3RlZERhdGVUZXh0VjgoJ0InKSl9YDonUGVyw61vZG8gc2VsZWNjaW9uYWRvOiAnK2VzYyhzZWxlY3RlZERhdGVUZXh0VjgoJ2dsb2JhbCcpKX08L2Rpdj5gKTsKIGJpbmRDYWxlbmRhcnNWOCgpO2RlY29yYXRlQ2hhcnRzVjgoKTtmb3JtYXRUZXh0RGF0ZXNWNShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtYWluJykpOwp9Owpjb25zdCByZXNldEJlZm9yZVY4PSQoJyNyZXNldCcpLm9uY2xpY2s7JCgnI3Jlc2V0Jykub25jbGljaz0oKT0+e3ZpZXdTdGF0ZS5jYWxlbmRhcnM/Pz17fTtkZWxldGUgdmlld1N0YXRlLmNhbGVuZGFycy5nbG9iYWw7cmVzZXRCZWZvcmVWOCgpfTsKCmFzeW5jIGZ1bmN0aW9uIGNoYXJ0UG5nVjgoc3ZnLHRpdGxlLGxlZ2VuZCl7CiBjb25zdCBjbG9uZT1zdmcuY2xvbmVOb2RlKHRydWUpLGJveD1zdmcudmlld0JveC5iYXNlVmFsLHdpZHRoPWJveC53aWR0aHx8NjAwLGhlaWdodD1ib3guaGVpZ2h0fHwzNTA7CiBjb25zdCBzdHlsZT1nZXRDb21wdXRlZFN0eWxlKHN2ZyksYmc9c3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1wbG90YmcnKS50cmltKCl8fCcjZmZmJyxmZz1zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXBsb3R0ZXh0JykudHJpbSgpfHwnIzI3NDU1OScsZ3JpZD1zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXBsb3RncmlkJykudHJpbSgpfHwnI2RiZTVlZCc7CiBjbG9uZS5zZXRBdHRyaWJ1dGUoJ3htbG5zJywnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnKTtjbG9uZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJyx3aWR0aCk7Y2xvbmUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLGhlaWdodCk7Y2xvbmUucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO2Nsb25lLnNldEF0dHJpYnV0ZSgnZm9udC1mYW1pbHknLCdBcmlhbCwgc2Fucy1zZXJpZicpOwogbGV0IHNlcmlhbGl6ZWQ9bmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhjbG9uZSkucmVwbGFjZSgvdmFyXCgtLXBsb3RiZ1wpL2csYmcpLnJlcGxhY2UoL3ZhclwoLS1wbG90dGV4dFwpL2csZmcpLnJlcGxhY2UoL3ZhclwoLS1wbG90Z3JpZFwpL2csZ3JpZCk7CiBjb25zdCB1cmw9VVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbc2VyaWFsaXplZF0se3R5cGU6J2ltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCd9KSk7CiB0cnl7Y29uc3QgaW1hZ2U9YXdhaXQgbmV3IFByb21pc2UoKG9rLG5vKT0+e2NvbnN0IGk9bmV3IEltYWdlO2kub25sb2FkPSgpPT5vayhpKTtpLm9uZXJyb3I9KCk9Pm5vKEVycm9yKCdObyBzZSBwdWRvIGNvbnZlcnRpciBlbCBncsOhZmljbyBhIGltYWdlbi4nKSk7aS5zcmM9dXJsfSk7Y29uc3Qgc2NhbGU9TWF0aC5taW4oMiw4MDAwL3dpZHRoKSxjYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7Y2FudmFzLndpZHRoPU1hdGguY2VpbCh3aWR0aCpzY2FsZSk7Y2FudmFzLmhlaWdodD1NYXRoLmNlaWwoKGhlaWdodCsxMzApKnNjYWxlKTtjb25zdCBjdHg9Y2FudmFzLmdldENvbnRleHQoJzJkJyk7Y3R4LnNjYWxlKHNjYWxlLHNjYWxlKTtjdHguZmlsbFN0eWxlPWJnO2N0eC5maWxsUmVjdCgwLDAsd2lkdGgsaGVpZ2h0KzEzMCk7Y3R4LmZpbGxTdHlsZT1mZztjdHguZm9udD0nYm9sZCAyOHB4IEFyaWFsJztjdHguZmlsbFRleHQodGl0bGUsMjQsNDAsd2lkdGgtNDgpO2N0eC5mb250PScxNnB4IEFyaWFsJztjdHguZmlsbFRleHQobGVnZW5kLnNsaWNlKDAsTWF0aC5mbG9vcih3aWR0aC85KSksMjQsNzAsd2lkdGgtNDgpO2N0eC5kcmF3SW1hZ2UoaW1hZ2UsMCwxMDAsd2lkdGgsaGVpZ2h0KTtyZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKG9rLG5vKT0+Y2FudmFzLnRvQmxvYihibG9iPT5ibG9iP29rKGJsb2IpOm5vKEVycm9yKCdObyBzZSBwdWRvIGdlbmVyYXIgZWwgUE5HLicpKSwnaW1hZ2UvcG5nJykpfWZpbmFsbHl7VVJMLnJldm9rZU9iamVjdFVSTCh1cmwpfQp9CmZ1bmN0aW9uIGRvd25sb2FkQmxvYlY4KGJsb2IsbmFtZSl7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7YS5ocmVmPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7YS5kb3dubG9hZD1uYW1lO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7YS5jbGljaygpO2EucmVtb3ZlKCk7c2V0VGltZW91dCgoKT0+VVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpLDIwMDApfQpmdW5jdGlvbiBkZWNvcmF0ZUNoYXJ0c1Y4KCl7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY29udGVudCAuY2hhcnRzY3JvbGwnKS5mb3JFYWNoKChob3N0LGluZGV4KT0+ewogIGNvbnN0IHN2Zz1ob3N0LnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpO2lmKCFzdmcpcmV0dXJuO2NvbnN0IGNhcmQ9aG9zdC5jbG9zZXN0KCcuY2FyZCcpLHRpdGxlPWNhcmQ/LnF1ZXJ5U2VsZWN0b3IoJ2gyJyk/LnRleHRDb250ZW50fHwnR3LDoWZpY28nLGxlZ2VuZD1jYXJkPy5xdWVyeVNlbGVjdG9yKCcubGFiZWxlZGxlZ2VuZCcpPy50ZXh0Q29udGVudHx8Jyc7CiAgY29uc3QgYmFyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO2Jhci5jbGFzc05hbWU9J2NoYXJ0VG9vbHNWOCc7YmFyLmlubmVySFRNTD0nPGJ1dHRvbj5Db3BpYXIgaW1hZ2VuPC9idXR0b24+PGJ1dHRvbj5EZXNjYXJnYXIgUE5HPC9idXR0b24+PHNwYW4gcm9sZT0ic3RhdHVzIj48L3NwYW4+Jztob3N0LmJlZm9yZShiYXIpO2NvbnN0W2NvcHksc2F2ZV09YmFyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpLHN0YXR1cz1iYXIucXVlcnlTZWxlY3Rvcignc3BhbicpOwogIHNhdmUub25jbGljaz1hc3luYygpPT57dHJ5e3N0YXR1cy50ZXh0Q29udGVudD0nR2VuZXJhbmRv4oCmJztkb3dubG9hZEJsb2JWOChhd2FpdCBjaGFydFBuZ1Y4KHN2Zyx0aXRsZSxsZWdlbmQpLCdMQS1ncmFmaWNvLScrKGluZGV4KzEpKycucG5nJyk7c3RhdHVzLnRleHRDb250ZW50PSdJbWFnZW4gZGVzY2FyZ2FkYSd9Y2F0Y2goZSl7c3RhdHVzLnRleHRDb250ZW50PWUubWVzc2FnZX19OwogIGNvcHkub25jbGljaz1hc3luYygpPT57Y29uc3QgcG5nPWNoYXJ0UG5nVjgoc3ZnLHRpdGxlLGxlZ2VuZCk7dHJ5e2lmKCFuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZXx8dHlwZW9mIENsaXBib2FyZEl0ZW09PT0ndW5kZWZpbmVkJyl0aHJvdyBFcnJvcignUG9ydGFwYXBlbGVzIG5vIGRpc3BvbmlibGUnKTthd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlKFtuZXcgQ2xpcGJvYXJkSXRlbSh7J2ltYWdlL3BuZyc6cG5nfSldKTtzdGF0dXMudGV4dENvbnRlbnQ9J0NvcGlhZG8uIFB1ZWRlcyBwZWdhcmxvIGVuIFdvcmQsIFBvd2VyUG9pbnQgbyBjb3JyZW8uJ31jYXRjaChlKXt0cnl7ZG93bmxvYWRCbG9iVjgoYXdhaXQgcG5nLCdMQS1ncmFmaWNvLScrKGluZGV4KzEpKycucG5nJyk7c3RhdHVzLnRleHRDb250ZW50PSdFbCBuYXZlZ2Fkb3Igbm8gcGVybWl0acOzIGNvcGlhci4gU2UgZGVzY2FyZ8OzIGVsIFBORy4nfWNhdGNoKGVycil7c3RhdHVzLnRleHRDb250ZW50PWVyci5tZXNzYWdlfX19OwogfSk7Cn0KLy8gTWluaW1hbCBYTFNYIHdyaXRlcjogaW5saW5lIHN0cmluZ3MgKyBudW1iZXJzIGluIGFuIHVuY29tcHJlc3NlZCBaSVAuCi8vIERhdGEgaXMgZ2VuZXJhdGVkIGluIHRoZSBicm93c2VyOyBubyBleHRyYSBzZXJ2aWNlIG9yIGV4dGVybmFsIGxpYnJhcnkgaXMgdXNlZC4KZnVuY3Rpb24geG1sRXNjYXBlVjgodmFsdWUpe3JldHVybiBTdHJpbmcodmFsdWU/PycnKS5yZXBsYWNlKC9bXHUwMDAwLVx1MDAwOFx1MDAwQlx1MDAwQ1x1MDAwRS1cdTAwMUZdL2csJycpLnJlcGxhY2UoL1smPD4iJ10vZyxjPT4oeycmJzonJmFtcDsnLCc8JzonJmx0OycsJz4nOicmZ3Q7JywnIic6JyZxdW90OycsIiciOicmYXBvczsnfVtjXSkpfQpmdW5jdGlvbiBjb2xOYW1lVjgoaSl7bGV0IHM9Jyc7Zm9yKGkrKztpO2k9TWF0aC5mbG9vcigoaS0xKS8yNikpcz1TdHJpbmcuZnJvbUNoYXJDb2RlKDY1KyhpLTEpJTI2KStzO3JldHVybiBzfQpmdW5jdGlvbiBzaGVldFhtbFY4KHJvd3Mpe3JldHVybiBgPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pjx3b3Jrc2hlZXQgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpbiI+PHNoZWV0Vmlld3M+PHNoZWV0VmlldyB3b3JrYm9va1ZpZXdJZD0iMCI+PHBhbmUgeVNwbGl0PSIxIiB0b3BMZWZ0Q2VsbD0iQTIiIGFjdGl2ZVBhbmU9ImJvdHRvbUxlZnQiIHN0YXRlPSJmcm96ZW4iLz48L3NoZWV0Vmlldz48L3NoZWV0Vmlld3M+PHNoZWV0Rm9ybWF0UHIgZGVmYXVsdFJvd0hlaWdodD0iMTgiLz48Y29scz48Y29sIG1pbj0iMSIgbWF4PSIxIiB3aWR0aD0iMzIiIGN1c3RvbVdpZHRoPSIxIi8+PGNvbCBtaW49IjIiIG1heD0iMTAwIiB3aWR0aD0iMjQiIGN1c3RvbVdpZHRoPSIxIi8+PC9jb2xzPjxzaGVldERhdGE+JHtyb3dzLm1hcCgocm93LHIpPT5gPHJvdyByPSIke3IrMX0iPiR7cm93Lm1hcCgodixjKT0+e2NvbnN0IHJlZj1jb2xOYW1lVjgoYykrKHIrMSk7cmV0dXJuIHR5cGVvZiB2PT09J251bWJlcicmJk51bWJlci5pc0Zpbml0ZSh2KT9gPGMgcj0iJHtyZWZ9IiBzPSIke3I9PT0wPzE6L3BheW91dHxkZXN2aWFjacOzbiBuY2MvaS50ZXN0KFN0cmluZyhyb3dzWzBdPy5bY10/PycnKSk/MzoyfSI+PHY+JHt2fTwvdj48L2M+YDpgPGMgcj0iJHtyZWZ9IiBzPSIke3I9PT0wPzE6MH0iIHQ9ImlubGluZVN0ciI+PGlzPjx0IHhtbDpzcGFjZT0icHJlc2VydmUiPiR7eG1sRXNjYXBlVjgodHlwZW9mIHY9PT0nc3RyaW5nJz9kaXNwbGF5RGF0ZXNWNSh2KTp2KX08L3Q+PC9pcz48L2M+YH0pLmpvaW4oJycpfTwvcm93PmApLmpvaW4oJycpfTwvc2hlZXREYXRhPiR7cm93cy5sZW5ndGg+MT9gPGF1dG9GaWx0ZXIgcmVmPSJBMToke2NvbE5hbWVWOChNYXRoLm1heCguLi5yb3dzLm1hcChyPT5yLmxlbmd0aCksMSktMSl9JHtyb3dzLmxlbmd0aH0iLz5gOicnfTwvd29ya3NoZWV0PmB9CmZ1bmN0aW9uIGNyYzMyVjgoYnl0ZXMpe2xldCBjcmM9MHhmZmZmZmZmZjtmb3IoY29uc3QgYiBvZiBieXRlcyl7Y3JjXj1iO2ZvcihsZXQgaz0wO2s8ODtrKyspY3JjPShjcmM+Pj4xKV4oKGNyYyYxKT8weGVkYjg4MzIwOjApfXJldHVybiAoY3JjXjB4ZmZmZmZmZmYpPj4+MH0KZnVuY3Rpb24gemlwRmlsZXNWOChmaWxlcyl7Y29uc3QgZW5jb2Rlcj1uZXcgVGV4dEVuY29kZXIsbG9jYWw9W10sY2VudHJhbD1bXTtsZXQgb2Zmc2V0PTA7Zm9yKGNvbnN0W25hbWUsdGV4dF1vZiBmaWxlcyl7Y29uc3Qgbj1lbmNvZGVyLmVuY29kZShuYW1lKSxkYXRhPWVuY29kZXIuZW5jb2RlKHRleHQpLGNyYz1jcmMzMlY4KGRhdGEpLGxoPW5ldyBVaW50OEFycmF5KDMwKSxsdj1uZXcgRGF0YVZpZXcobGguYnVmZmVyKTtsdi5zZXRVaW50MzIoMCwweDA0MDM0YjUwLHRydWUpO2x2LnNldFVpbnQxNig0LDIwLHRydWUpO2x2LnNldFVpbnQxNig2LDB4ODAwLHRydWUpO2x2LnNldFVpbnQzMigxNCxjcmMsdHJ1ZSk7bHYuc2V0VWludDMyKDE4LGRhdGEubGVuZ3RoLHRydWUpO2x2LnNldFVpbnQzMigyMixkYXRhLmxlbmd0aCx0cnVlKTtsdi5zZXRVaW50MTYoMjYsbi5sZW5ndGgsdHJ1ZSk7bG9jYWwucHVzaChsaCxuLGRhdGEpO2NvbnN0IGNoPW5ldyBVaW50OEFycmF5KDQ2KSxjdj1uZXcgRGF0YVZpZXcoY2guYnVmZmVyKTtjdi5zZXRVaW50MzIoMCwweDAyMDE0YjUwLHRydWUpO2N2LnNldFVpbnQxNig0LDIwLHRydWUpO2N2LnNldFVpbnQxNig2LDIwLHRydWUpO2N2LnNldFVpbnQxNig4LDB4ODAwLHRydWUpO2N2LnNldFVpbnQzMigxNixjcmMsdHJ1ZSk7Y3Yuc2V0VWludDMyKDIwLGRhdGEubGVuZ3RoLHRydWUpO2N2LnNldFVpbnQzMigyNCxkYXRhLmxlbmd0aCx0cnVlKTtjdi5zZXRVaW50MTYoMjgsbi5sZW5ndGgsdHJ1ZSk7Y3Yuc2V0VWludDMyKDQyLG9mZnNldCx0cnVlKTtjZW50cmFsLnB1c2goY2gsbik7b2Zmc2V0Kz0zMCtuLmxlbmd0aCtkYXRhLmxlbmd0aH1jb25zdCBjZW50cmFsU2l6ZT1jZW50cmFsLnJlZHVjZSgocyx4KT0+cyt4Lmxlbmd0aCwwKSxlbmQ9bmV3IFVpbnQ4QXJyYXkoMjIpLGV2PW5ldyBEYXRhVmlldyhlbmQuYnVmZmVyKTtldi5zZXRVaW50MzIoMCwweDA2MDU0YjUwLHRydWUpO2V2LnNldFVpbnQxNig4LGZpbGVzLmxlbmd0aCx0cnVlKTtldi5zZXRVaW50MTYoMTAsZmlsZXMubGVuZ3RoLHRydWUpO2V2LnNldFVpbnQzMigxMixjZW50cmFsU2l6ZSx0cnVlKTtldi5zZXRVaW50MzIoMTYsb2Zmc2V0LHRydWUpO3JldHVybiBuZXcgQmxvYihbLi4ubG9jYWwsLi4uY2VudHJhbCxlbmRdLHt0eXBlOidhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCd9KX0KZnVuY3Rpb24gd29ya2Jvb2tCbG9iVjgoc2hlZXRzKXsKIGNvbnN0IG5zPSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcnLGZpbGVzPVtdOwogZmlsZXMucHVzaChbJ1tDb250ZW50X1R5cGVzXS54bWwnLGA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjxUeXBlcyB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9jb250ZW50LXR5cGVzIj48RGVmYXVsdCBFeHRlbnNpb249InJlbHMiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtcGFja2FnZS5yZWxhdGlvbnNoaXBzK3htbCIvPjxEZWZhdWx0IEV4dGVuc2lvbj0ieG1sIiBDb250ZW50VHlwZT0iYXBwbGljYXRpb24veG1sIi8+PE92ZXJyaWRlIFBhcnROYW1lPSIveGwvd29ya2Jvb2sueG1sIiBDb250ZW50VHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQubWFpbit4bWwiLz48T3ZlcnJpZGUgUGFydE5hbWU9Ii94bC9zdHlsZXMueG1sIiBDb250ZW50VHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc3R5bGVzK3htbCIvPiR7c2hlZXRzLm1hcCgocyxpKT0+YDxPdmVycmlkZSBQYXJ0TmFtZT0iL3hsL3dvcmtzaGVldHMvc2hlZXQke2krMX0ueG1sIiBDb250ZW50VHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwud29ya3NoZWV0K3htbCIvPmApLmpvaW4oJycpfTwvVHlwZXM+YF0pOwogZmlsZXMucHVzaChbJ19yZWxzLy5yZWxzJyxgPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48UmVsYXRpb25zaGlwcyB4bWxucz0iJHtuc30vcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMiPjxSZWxhdGlvbnNoaXAgSWQ9InJJZDEiIFR5cGU9IiR7bnN9L29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9vZmZpY2VEb2N1bWVudCIgVGFyZ2V0PSJ4bC93b3JrYm9vay54bWwiLz48L1JlbGF0aW9uc2hpcHM+YF0pOwogZmlsZXMucHVzaChbJ3hsL3dvcmtib29rLnhtbCcsYDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PHdvcmtib29rIHhtbG5zPSIke25zfS9zcHJlYWRzaGVldG1sLzIwMDYvbWFpbiIgeG1sbnM6cj0iJHtuc30vb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzIj48c2hlZXRzPiR7c2hlZXRzLm1hcCgocyxpKT0+YDxzaGVldCBuYW1lPSIke3htbEVzY2FwZVY4KHMubmFtZSl9IiBzaGVldElkPSIke2krMX0iIHI6aWQ9InJJZCR7aSsxfSIvPmApLmpvaW4oJycpfTwvc2hlZXRzPjxjYWxjUHIgY2FsY0lkPSIxOTEwMjkiLz48L3dvcmtib29rPmBdKTsKIGZpbGVzLnB1c2goWyd4bC9fcmVscy93b3JrYm9vay54bWwucmVscycsYDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PFJlbGF0aW9uc2hpcHMgeG1sbnM9IiR7bnN9L3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzIj4ke3NoZWV0cy5tYXAoKHMsaSk9PmA8UmVsYXRpb25zaGlwIElkPSJySWQke2krMX0iIFR5cGU9IiR7bnN9L29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy93b3Jrc2hlZXQiIFRhcmdldD0id29ya3NoZWV0cy9zaGVldCR7aSsxfS54bWwiLz5gKS5qb2luKCcnKX08UmVsYXRpb25zaGlwIElkPSJySWQke3NoZWV0cy5sZW5ndGgrMX0iIFR5cGU9IiR7bnN9L29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9zdHlsZXMiIFRhcmdldD0ic3R5bGVzLnhtbCIvPjwvUmVsYXRpb25zaGlwcz5gXSk7CiBmaWxlcy5wdXNoKFsneGwvc3R5bGVzLnhtbCcsYDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PHN0eWxlU2hlZXQgeG1sbnM9IiR7bnN9L3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIj48Zm9udHMgY291bnQ9IjIiPjxmb250PjxzeiB2YWw9IjExIi8+PG5hbWUgdmFsPSJDYWxpYnJpIi8+PC9mb250Pjxmb250PjxiLz48Y29sb3IgcmdiPSJGRkZGRkZGRiIvPjxzeiB2YWw9IjExIi8+PG5hbWUgdmFsPSJDYWxpYnJpIi8+PC9mb250PjwvZm9udHM+PGZpbGxzIGNvdW50PSIzIj48ZmlsbD48cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9Im5vbmUiLz48L2ZpbGw+PGZpbGw+PHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSJncmF5MTI1Ii8+PC9maWxsPjxmaWxsPjxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0ic29saWQiPjxmZ0NvbG9yIHJnYj0iRkYxNzM2NTIiLz48YmdDb2xvciBpbmRleGVkPSI2NCIvPjwvcGF0dGVybkZpbGw+PC9maWxsPjwvZmlsbHM+PGJvcmRlcnMgY291bnQ9IjEiPjxib3JkZXI+PGxlZnQvPjxyaWdodC8+PHRvcC8+PGJvdHRvbS8+PGRpYWdvbmFsLz48L2JvcmRlcj48L2JvcmRlcnM+PGNlbGxTdHlsZVhmcyBjb3VudD0iMSI+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiLz48L2NlbGxTdHlsZVhmcz48Y2VsbFhmcyBjb3VudD0iNCI+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIHhmSWQ9IjAiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSIyIiBib3JkZXJJZD0iMCIgeGZJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiLz48eGYgbnVtRm10SWQ9IjQiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjEwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PC9jZWxsWGZzPjxjZWxsU3R5bGVzIGNvdW50PSIxIj48Y2VsbFN0eWxlIG5hbWU9Ik5vcm1hbCIgeGZJZD0iMCIgYnVpbHRpbklkPSIwIi8+PC9jZWxsU3R5bGVzPjwvc3R5bGVTaGVldD5gXSk7CiBzaGVldHMuZm9yRWFjaCgoc2hlZXQsaSk9PmZpbGVzLnB1c2goW2B4bC93b3Jrc2hlZXRzL3NoZWV0JHtpKzF9LnhtbGAsc2hlZXRYbWxWOChzaGVldC5yb3dzKV0pKTtyZXR1cm4gemlwRmlsZXNWOChmaWxlcyk7Cn0KZnVuY3Rpb24gZXhwb3J0RXhjZWxWOCgpewogaWYoIWRhdGF8fHRhYj09PSdNZXRvZG9sb2fDrWEnKXJldHVybjsKIGNvbnN0IHNlbGVjdGlvbj1bWydQYXLDoW1ldHJvJywnU2VsZWNjacOzbiddLFsnSW5mb3JtZScsdGFiXSxbJ0FyY2hpdm8gZnVlbnRlJyxkYXRhLm5hbWVdLFsnRmVjaGFzJyx0YWI9PT0nQ29tcGFyYXRpdm9zJz8nVmVyIHNlbGVjY2lvbmVzIEEgeSBCJzpzZWxlY3RlZERhdGVUZXh0VjgoJ2dsb2JhbCcpXSxbJ0ZpbHRyb3MgeSBjb25maWd1cmFjacOzbicsSlNPTi5zdHJpbmdpZnkodmlld1N0YXRlKV0sWydVbmlkYWRlcycsJ0ltcG9ydGVzIGVuIENMUC4gRW4gRGF0b3MsIHBheW91dC9wb3JjZW50YWplcyBzZSBleHBvcnRhbiBjb21vIGZyYWNjacOzbiAoMCw5NSA9IDk1JSkuIFJhdGlvcyBlbiBtw7psdGlwbG9zIGRlIHJlZmVyZW5jaWEuJ10sWydDb250ZW5pZG8nLCdUYWJsYXMgeSB2YWxvcmVzIGRlbCBpbmZvcm1lLiBMb3MgZ3LDoWZpY29zIHNlIHB1ZWRlbiBjb3BpYXIgbyBkZXNjYXJnYXIgY29tbyBQTkcgZGVzZGUgbGEgd2ViLiddXTsKIGlmKHRhYj09PSdDb21wYXJhdGl2b3MnKXNlbGVjdGlvbi5wdXNoKFsnRmVjaGFzIEEnLHNlbGVjdGVkRGF0ZVRleHRWOCgnQScpXSxbJ0ZlY2hhcyBCJyxzZWxlY3RlZERhdGVUZXh0VjgoJ0InKV0pOwogY29uc3Qgc2hlZXRzPVt7bmFtZTonRGF0b3MnLHJvd3M6ZXhwb3J0Um93cy5sZW5ndGg/ZXhwb3J0Um93czpbWydTaW4gZGF0b3MnXV19LHtuYW1lOidDb25zdWx0YScscm93czpzZWxlY3Rpb259XTsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjb250ZW50IHRhYmxlJykuZm9yRWFjaCgodGFibGUsaSk9Pntjb25zdCByb3dzPVsuLi50YWJsZS5yb3dzXS5tYXAocj0+Wy4uLnIuY2VsbHNdLm1hcChjPT5jLmlubmVyVGV4dC50cmltKCkpKTtpZihyb3dzLmxlbmd0aClzaGVldHMucHVzaCh7bmFtZTonVGFibGEgJysoaSsxKSxyb3dzfSl9KTsKIGRvd25sb2FkQmxvYlY4KHdvcmtib29rQmxvYlY4KHNoZWV0cyksJ0xBLScrdGFiLnJlcGxhY2UoL1teYS16w6HDqcOtw7PDusOxMC05XS9naSwnLScpKycueGxzeCcpOwp9CmNvbnN0IGNzdkV4cG9ydEJlZm9yZVY4PSQoJyN2MmV4cG9ydCcpLm9uY2xpY2s7JCgnI3YyZXhwb3J0JykudGV4dENvbnRlbnQ9J+KGkyBFeHBvcnRhciBFeGNlbCc7JCgnI3YyZXhwb3J0Jykub25jbGljaz1leHBvcnRFeGNlbFY4OwoKY29uc3QgcnBjQmVmb3JlVjk9cnBjOwpycGM9ZnVuY3Rpb24obmFtZSwuLi5hcmdzKXtyZXR1cm4gbmV3IFByb21pc2UoKG9rLG5vKT0+e2NvbnN0IHRpbWVvdXQ9c2V0VGltZW91dCgoKT0+bm8oRXJyb3IoJ0dvb2dsZSBubyByZXNwb25kacOzIGEgJytuYW1lKycgZGVudHJvIGRlbCB0aWVtcG8gZXNwZXJhZG8uIFJlY2FyZ2EgbGEgd2ViIHkgY29tcHJ1ZWJhIHR1IHNlc2nDs24uJykpLG5hbWU9PT0naW1wb3J0TWF0cml4Jz85MDAwMDA6bmFtZT09PSdnZXRWaWV3cyc/MTUwMDA6OTAwMDApO3JwY0JlZm9yZVY5KG5hbWUsLi4uYXJncykudGhlbih2YWx1ZT0+e2NsZWFyVGltZW91dCh0aW1lb3V0KTtvayh2YWx1ZSl9LGVycm9yPT57Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO25vKGVycm9yKX0pfSl9OwpjYWNoZWQ9YXN5bmMgZnVuY3Rpb24oKXsKICQoJyNzdGF0dXMnKS50ZXh0Q29udGVudD0nUmVjdXBlcmFuZG8gbGEgbWF0cml6IHByaXZhZGHigKYnOwogY29uc3QgdHJhbnNwb3J0PWF3YWl0IHJwYygnZ2V0TWF0cml4VHJhbnNwb3J0Jyk7CiBpZighdHJhbnNwb3J0fHx0cmFuc3BvcnQuZW5jb2RpbmchPT0nZ3ppcC1iYXNlNjQnfHx0eXBlb2YgdHJhbnNwb3J0LmRhdGEhPT0nc3RyaW5nJyl0aHJvdyBFcnJvcignTGEgcmVzcHVlc3RhIGRlbCBzZXJ2aWRvciBubyB0aWVuZSBlbCBmb3JtYXRvIGVzcGVyYWRvLiBBY3R1YWxpemEgdGFtYmnDqW4gQ29kZS5ncyB5IHB1YmxpY2EgYW1ib3MgYXJjaGl2b3MganVudG9zLicpOwogJCgnI3N0YXR1cycpLnRleHRDb250ZW50PSdNYXRyaXogcmVjaWJpZGEuIFByZXBhcmFuZG8gaW5mb3JtZXPigKYnOwogbGV0IGpzb247CiBpZih0eXBlb2YgRGVjb21wcmVzc2lvblN0cmVhbT09PSd1bmRlZmluZWQnKWpzb249YXdhaXQgcnBjKCdnZXRNYXRyaXgnKTsKIGVsc2V7Y29uc3QgYmluYXJ5PWF0b2IodHJhbnNwb3J0LmRhdGEpLGJ5dGVzPW5ldyBVaW50OEFycmF5KGJpbmFyeS5sZW5ndGgpO2ZvcihsZXQgaT0wO2k8YmluYXJ5Lmxlbmd0aDtpKyspYnl0ZXNbaV09YmluYXJ5LmNoYXJDb2RlQXQoaSk7anNvbj1hd2FpdCBuZXcgUmVzcG9uc2UobmV3IEJsb2IoW2J5dGVzXSkuc3RyZWFtKCkucGlwZVRocm91Z2gobmV3IERlY29tcHJlc3Npb25TdHJlYW0oJ2d6aXAnKSkpLnRleHQoKX0KIGNvbnN0IHJlc3VsdD1jbGVhbk1hdHJpeFY3KEpTT04ucGFyc2UoanNvbikpO2lmKCFBcnJheS5pc0FycmF5KHJlc3VsdC5yb3dzKXx8IXJlc3VsdC5yb3dzLmxlbmd0aCl0aHJvdyBFcnJvcignTGEgbWF0cml6IG5vIGNvbnRpZW5lIHJlZ2lzdHJvcyBhcGxpY2FibGVzLicpO3JldHVybiByZXN1bHQ7Cn07CmFzeW5jIGZ1bmN0aW9uIHN0YXJ0RGFzaGJvYXJkVjkoKXsKIHRyeXsKICBkYXRhPWF3YWl0IGNhY2hlZCgpO3NhdmVkVmlld3M9W107bG9hZFZpZXdzKCk7CiAgLy8gWWllbGQgYmVmb3JlIHJlbmRlcmluZyBzbyB0aGUgcmVjZWl2ZWQtZGF0YSBzdGF0dXMgY2FuIGJlIHBhaW50ZWQuCiAgYXdhaXQgbmV3IFByb21pc2Uob2s9PnNldFRpbWVvdXQob2ssMCkpO2luaXQoKTsKICAvLyBTYXZlZCB2aWV3cyBhcmUgb3B0aW9uYWw7IHRoZXkgbXVzdCBuZXZlciBibG9jayB0aGUgbWF0cml4L2Rhc2hib2FyZC4KICBycGMoJ2dldFZpZXdzJykudGhlbih2YWx1ZT0+e3RyeXtjb25zdCB2aWV3cz1KU09OLnBhcnNlKHZhbHVlKTtpZighQXJyYXkuaXNBcnJheSh2aWV3cykpdGhyb3cgRXJyb3IoJ0Zvcm1hdG8gZGUgdmlzdGFzIG5vIHbDoWxpZG8nKTtzYXZlZFZpZXdzPXZpZXdzO2xvYWRWaWV3cygpfWNhdGNoKGVycm9yKXskKCcjc3RhdHVzJykudGV4dENvbnRlbnQrPScgwrcgTm8gc2UgY2FyZ2Fyb24gbGFzIHZpc3RhcyBndWFyZGFkYXM6ICcrZXJyb3IubWVzc2FnZX19KS5jYXRjaChlcnJvcj0+eyQoJyNzdGF0dXMnKS50ZXh0Q29udGVudCs9JyDCtyBNYXRyaXogZGlzcG9uaWJsZTsgbGFzIHZpc3RhcyBndWFyZGFkYXMgbm8gcmVzcG9uZGllcm9uLid9KTsKIH1jYXRjaChlcnJvcil7JCgnI3N0YXR1cycpLnRleHRDb250ZW50PSdObyBzZSBwdWRvIGluaWNpYXI6ICcrZXJyb3IubWVzc2FnZSsnIFNpIGFwYXJlY2UgZ2V0TWF0cml4VHJhbnNwb3J0LCByZWVtcGxhemEgdGFtYmnDqW4gQ29kZS5ncyBwb3IgbGEgdmVyc2nDs24gbnVldmEgeSB2dWVsdmUgYSBpbXBsZW1lbnRhci4nO2NvbnNvbGUuZXJyb3IoZXJyb3IpfQp9CmNvbnN0IGNhbGVuZGFyQmVmb3JlVjExPWNhbGVuZGFyU3RhdGVWODsKY2FsZW5kYXJTdGF0ZVY4PWZ1bmN0aW9uKHNjb3BlKXtjb25zdCBzdGF0ZT1jYWxlbmRhckJlZm9yZVYxMShzY29wZSk7aWYoIUFycmF5LmlzQXJyYXkoc3RhdGUubW9udGhzKSlzdGF0ZS5tb250aHM9c3RhdGUubW9udGg/W3N0YXRlLm1vbnRoXTpbXTtzdGF0ZS53ZWVrcz0oc3RhdGUud2Vla3N8fFtdKS5tYXAodz0+U3RyaW5nKHcpLmluY2x1ZGVzKCd8Jyk/U3RyaW5nKHcpOihzdGF0ZS5tb250aD9zdGF0ZS5tb250aCsnfCcrdzpTdHJpbmcodykpKTtyZXR1cm4gc3RhdGV9Owpjb25zdCBhY2NlcHRCZWZvcmVWMTE9YWNjZXB0c0NhbGVuZGFyVjg7CmFjY2VwdHNDYWxlbmRhclY4PWZ1bmN0aW9uKHJvdyxzdGF0ZSxmcm9tLHRvKXsKIGlmKCFbJ21vbnRoJywnd2VlayddLmluY2x1ZGVzKHN0YXRlLm1vZGUpKXJldHVybiBhY2NlcHRCZWZvcmVWMTEocm93LHN0YXRlLGZyb20sdG8pOwogY29uc3QgbW9udGg9cm93WzBdLnNsaWNlKDAsNyksbW9udGhzPUFycmF5LmlzQXJyYXkoc3RhdGUubW9udGhzKT9zdGF0ZS5tb250aHM6c3RhdGUubW9udGg/W3N0YXRlLm1vbnRoXTpbXTsKIGlmKG1vbnRocy5sZW5ndGgmJiFtb250aHMuaW5jbHVkZXMobW9udGgpKXJldHVybiBmYWxzZTsKIGlmKHN0YXRlLm1vZGU9PT0nbW9udGgnKXJldHVybiB0cnVlOwogY29uc3Qga2V5PW1vbnRoKyd8Jyt3ZWVrTnVtYmVyVjgocm93WzBdKTtyZXR1cm4gIXN0YXRlLndlZWtzLmxlbmd0aHx8c3RhdGUud2Vla3MuaW5jbHVkZXMoa2V5KXx8KCFBcnJheS5pc0FycmF5KHN0YXRlLm1vbnRocykmJnN0YXRlLndlZWtzLmluY2x1ZGVzKFN0cmluZyh3ZWVrTnVtYmVyVjgocm93WzBdKSkpKTsKfTsKY29uc3QgcGFuZWxCZWZvcmVWMTE9Y2FsZW5kYXJQYW5lbFY4OwpjYWxlbmRhclBhbmVsVjg9ZnVuY3Rpb24oc2NvcGUpewogY29uc3Qgc3RhdGU9Y2FsZW5kYXJTdGF0ZVY4KHNjb3BlKTtpZighWydtb250aCcsJ3dlZWsnXS5pbmNsdWRlcyhzdGF0ZS5tb2RlKSlyZXR1cm4gcGFuZWxCZWZvcmVWMTEoc2NvcGUpOwogY29uc3QgbW9udGhzPW1vbnRoQ2hvaWNlc1Y4KCk7aWYoIXN0YXRlLm1vbnRocy5sZW5ndGgmJnN0YXRlLm1vbnRoJiYhc3RhdGUubW9udGhzSW5pdGlhbGl6ZWQpe3N0YXRlLm1vbnRocz1bc3RhdGUubW9udGhdO3N0YXRlLm1vbnRoc0luaXRpYWxpemVkPXRydWV9CiBjb25zdCBzZWxlY3RlZD1zdGF0ZS5tb250aHMubGVuZ3RoP3N0YXRlLm1vbnRoczptb250aHM7CiBjb25zdCBtb250aE9wdGlvbnM9bW9udGhzLm1hcChtPT5gPG9wdGlvbiB2YWx1ZT0iJHttfSIgJHtzdGF0ZS5tb250aHMuaW5jbHVkZXMobSk/J3NlbGVjdGVkJzonJ30+JHtkaXNwbGF5RGF0ZXNWNShtKX08L29wdGlvbj5gKS5qb2luKCcnKTsKIGNvbnN0IHdlZWtPcHRpb25zPXNlbGVjdGVkLm1hcChtPT57Y29uc3Qgd2Vla01hcD1uZXcgTWFwO2Zvcihjb25zdCByIG9mIGRhdGEucm93cyl7aWYoIXJbMF0uc3RhcnRzV2l0aChtKSljb250aW51ZTtsZXQgdz13ZWVrTnVtYmVyVjgoclswXSk7aWYoIXdlZWtNYXAuaGFzKHcpKXdlZWtNYXAuc2V0KHcsW10pO3dlZWtNYXAuZ2V0KHcpLnB1c2goclswXSl9cmV0dXJuIGA8b3B0Z3JvdXAgbGFiZWw9IiR7ZGlzcGxheURhdGVzVjUobSl9Ij4ke1suLi53ZWVrTWFwXS5zb3J0KChhLGIpPT5hWzBdLWJbMF0pLm1hcCgoW3csZGF0ZXNdKT0+e2RhdGVzLnNvcnQoKTtsZXQga2V5PW0rJ3wnK3c7cmV0dXJuIGA8b3B0aW9uIHZhbHVlPSIke2tleX0iICR7c3RhdGUud2Vla3MuaW5jbHVkZXMoa2V5KT8nc2VsZWN0ZWQnOicnfT4ke21vbnRoU2hvcnRWOFtOdW1iZXIobS5zbGljZSg1KSktMV19LSR7d30gwrcgJHttLnNsaWNlKDAsNCl9IMK3ICR7ZGlzcGxheURhdGVzVjUoZGF0ZXNbMF0pfSBhICR7ZGlzcGxheURhdGVzVjUoZGF0ZXMuYXQoLTEpKX08L29wdGlvbj5gfSkuam9pbignJyl9PC9vcHRncm91cD5gfSkuam9pbignJyk7CiByZXR1cm4gYDxkaXYgY2xhc3M9ImNhbGVuZGFyUGFuZWwiIGRhdGEtY2FsZW5kYXJwYW5lbD0iJHtzY29wZX0iPjxkaXYgY2xhc3M9ImNhbGVuZGFyQ29udHJvbHMiPjxsYWJlbD5TZWxlY2Npb25hciBmZWNoYXMgcG9yPHNlbGVjdCBkYXRhLWNhbG1vZGU9IiR7c2NvcGV9Ij4ke09iamVjdC5lbnRyaWVzKHtyYW5nZTonUmFuZ28gY29uIGNhbGVuZGFyaW8nLGRhdGVzOidEw61hcyBlc3BlY8OtZmljb3MnLG1vbnRoOidNZXNlcycsd2VlazonTWVzZXMgeSBzZW1hbmFzJyxxdWFydGVyOidUcmltZXN0cmUnfSkubWFwKChbayx2XSk9PmA8b3B0aW9uIHZhbHVlPSIke2t9IiAke3N0YXRlLm1vZGU9PT1rPydzZWxlY3RlZCc6Jyd9PiR7dn08L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48L2xhYmVsPjxsYWJlbD4xLiBNZXNlcyDCtyBDdHJsL0NtZCArIGNsaWM8c2VsZWN0IG11bHRpcGxlIGRhdGEtY2FsbW9udGg9IiR7c2NvcGV9IiBhcmlhLWxhYmVsPSJNZXNlcyBzZWxlY2Npb25hZG9zIj4ke21vbnRoT3B0aW9uc308L3NlbGVjdD48L2xhYmVsPiR7c3RhdGUubW9kZT09PSd3ZWVrJz9gPGxhYmVsPjIuIFNlbWFuYXMgZGUgbG9zIG1lc2VzIGVsZWdpZG9zPHNlbGVjdCBtdWx0aXBsZSBkYXRhLWNhbHdlZWtzPSIke3Njb3BlfSI+JHt3ZWVrT3B0aW9uc308L3NlbGVjdD48L2xhYmVsPmA6Jyd9PHNtYWxsPkN0cmwvQ21kICsgY2xpYyBwYXJhIHNlbGVjY2lvbmFyIHZhcmlvcyBtZXNlcyR7c3RhdGUubW9kZT09PSd3ZWVrJz8nIG8gc2VtYW5hcyc6Jyd9LiBTaW4gbWVzZXMgc2VsZWNjaW9uYWRvczogdG9kb3MgbG9zIG1lc2VzLiR7c3RhdGUubW9kZT09PSd3ZWVrJz8nIFNpbiBzZW1hbmFzIHNlbGVjY2lvbmFkYXM6IHRvZGFzIGxhcyBzZW1hbmFzIGRlIGxvcyBtZXNlcyBlbGVnaWRvcy4gQ2FkYSBzZW1hbmEgaW5jbHV5ZSBzb2xvIGxvcyBkw61hcyBkZSBzdSBtZXMuJzonJ308L3NtYWxsPjwvZGl2PjwvZGl2PmA7Cn07CmNvbnN0IGJpbmRCZWZvcmVWMTE9YmluZENhbGVuZGFyc1Y4OwpiaW5kQ2FsZW5kYXJzVjg9ZnVuY3Rpb24oKXtiaW5kQmVmb3JlVjExKCk7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY2FsbW9udGhdJykuZm9yRWFjaChlbD0+ZWwub25jaGFuZ2U9KCk9Pntjb25zdCBzdGF0ZT1jYWxlbmRhclN0YXRlVjgoZWwuZGF0YXNldC5jYWxtb250aCk7c3RhdGUubW9udGhzPVsuLi5lbC5zZWxlY3RlZE9wdGlvbnNdLm1hcChvPT5vLnZhbHVlKTtzdGF0ZS5tb250aHNJbml0aWFsaXplZD10cnVlO3N0YXRlLm1vbnRoPXN0YXRlLm1vbnRoc1swXXx8Jyc7c3RhdGUud2Vla3M9W107cmVuZGVyKCl9KTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jYWx3ZWVrc10nKS5mb3JFYWNoKGVsPT5lbC5vbmNoYW5nZT0oKT0+e2NhbGVuZGFyU3RhdGVWOChlbC5kYXRhc2V0LmNhbHdlZWtzKS53ZWVrcz1bLi4uZWwuc2VsZWN0ZWRPcHRpb25zXS5tYXAobz0+by52YWx1ZSk7cmVuZGVyKCl9KX07CmNvbnN0IHNlbGVjdGVkQmVmb3JlVjExPXNlbGVjdGVkRGF0ZVRleHRWODsKc2VsZWN0ZWREYXRlVGV4dFY4PWZ1bmN0aW9uKHNjb3BlKXtjb25zdCBzPWNhbGVuZGFyU3RhdGVWOChzY29wZSk7aWYoIVsnbW9udGgnLCd3ZWVrJ10uaW5jbHVkZXMocy5tb2RlKSlyZXR1cm4gc2VsZWN0ZWRCZWZvcmVWMTEoc2NvcGUpO2NvbnN0IG1vbnRocz1zLm1vbnRocy5sZW5ndGg/cy5tb250aHMubWFwKGRpc3BsYXlEYXRlc1Y1KS5qb2luKCcsICcpOidUb2RvcyBsb3MgbWVzZXMnO3JldHVybiBtb250aHMrKHMubW9kZT09PSd3ZWVrJz8ocy53ZWVrcy5sZW5ndGg/JyDCtyAnK3Mud2Vla3MubWFwKGtleT0+e2NvbnN0W20sd109a2V5LnNwbGl0KCd8Jyk7cmV0dXJuIG1vbnRoU2hvcnRWOFtOdW1iZXIobS5zbGljZSg1KSktMV0rJy0nK3crJyDCtyAnK20uc2xpY2UoMCw0KX0pLmpvaW4oJywgJyk6JyDCtyBUb2RhcyBsYXMgc2VtYW5hcycpOicnKX07Cgpjb25zdCBwYW5lbEJlZm9yZVYxMj1jYWxlbmRhclBhbmVsVjg7CmZ1bmN0aW9uIHdlZWtDaGVja3NWMTIoc2NvcGUsbW9udGhzLHNlbGVjdGVkV2Vla3MpewogY29uc3QgYXZhaWxhYmxlPW1vbnRocy5sZW5ndGg/bW9udGhzOm1vbnRoQ2hvaWNlc1Y4KCk7CiByZXR1cm4gYXZhaWxhYmxlLm1hcChtb250aD0+e2NvbnN0IHdlZWtzPW5ldyBNYXA7Zm9yKGNvbnN0IHIgb2YgZGF0YS5yb3dzKXtpZighclswXS5zdGFydHNXaXRoKG1vbnRoKSljb250aW51ZTtjb25zdCB3PXdlZWtOdW1iZXJWOChyWzBdKTtpZighd2Vla3MuaGFzKHcpKXdlZWtzLnNldCh3LFtdKTt3ZWVrcy5nZXQodykucHVzaChyWzBdKX1yZXR1cm4gYDxkaXYgY2xhc3M9IndlZWtNb250aFYxMiI+PGI+JHtkaXNwbGF5RGF0ZXNWNShtb250aCl9PC9iPiR7Wy4uLndlZWtzXS5zb3J0KChhLGIpPT5hWzBdLWJbMF0pLm1hcCgoW3csZGF0ZXNdKT0+e2RhdGVzLnNvcnQoKTtjb25zdCB2YWx1ZT1tb250aCsnfCcrdztyZXR1cm4gYDxsYWJlbCBjbGFzcz0iY2hlY2tJdGVtVjEyIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGRhdGEtd2Vla2NoZWNrPSIke3Njb3BlfSIgdmFsdWU9IiR7dmFsdWV9IiAke3NlbGVjdGVkV2Vla3MuaW5jbHVkZXModmFsdWUpPydjaGVja2VkJzonJ30+PHNwYW4+JHttb250aFNob3J0VjhbTnVtYmVyKG1vbnRoLnNsaWNlKDUpKS0xXX0tJHt3fSDCtyAke21vbnRoLnNsaWNlKDAsNCl9PHNtYWxsPiR7ZGlzcGxheURhdGVzVjUoZGF0ZXNbMF0pfSDihpIgJHtkaXNwbGF5RGF0ZXNWNShkYXRlcy5hdCgtMSkpfTwvc21hbGw+PC9zcGFuPjwvbGFiZWw+YH0pLmpvaW4oJycpfTwvZGl2PmB9KS5qb2luKCcnKTsKfQpjYWxlbmRhclBhbmVsVjg9ZnVuY3Rpb24oc2NvcGUpewogY29uc3Qgc3RhdGU9Y2FsZW5kYXJTdGF0ZVY4KHNjb3BlKTtpZighWydtb250aCcsJ3dlZWsnXS5pbmNsdWRlcyhzdGF0ZS5tb2RlKSlyZXR1cm4gcGFuZWxCZWZvcmVWMTIoc2NvcGUpOwogY29uc3QgbW9udGhzPW1vbnRoQ2hvaWNlc1Y4KCk7aWYoIXN0YXRlLm1vbnRocy5sZW5ndGgmJnN0YXRlLm1vbnRoJiYhc3RhdGUubW9udGhzSW5pdGlhbGl6ZWQpe3N0YXRlLm1vbnRocz1bc3RhdGUubW9udGhdO3N0YXRlLm1vbnRoc0luaXRpYWxpemVkPXRydWV9CiByZXR1cm4gYDxkaXYgY2xhc3M9ImNhbGVuZGFyUGFuZWwiIGRhdGEtY2FsZW5kYXJwYW5lbD0iJHtzY29wZX0iPjxkaXYgY2xhc3M9ImNhbGVuZGFyQ29udHJvbHMiPjxsYWJlbD5TZWxlY2Npb25hciBmZWNoYXMgcG9yPHNlbGVjdCBkYXRhLWNhbG1vZGU9IiR7c2NvcGV9Ij4ke09iamVjdC5lbnRyaWVzKHtyYW5nZTonUmFuZ28gY29uIGNhbGVuZGFyaW8nLGRhdGVzOidEw61hcyBlc3BlY8OtZmljb3MnLG1vbnRoOidNZXNlcycsd2VlazonTWVzZXMgeSBzZW1hbmFzJyxxdWFydGVyOidUcmltZXN0cmUnfSkubWFwKChbayx2XSk9PmA8b3B0aW9uIHZhbHVlPSIke2t9IiAke3N0YXRlLm1vZGU9PT1rPydzZWxlY3RlZCc6Jyd9PiR7dn08L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48L2xhYmVsPjwvZGl2PjxkaXYgY2xhc3M9Im1vbnRoQWN0aW9uc1YxMiI+PGI+MS4gTWFyY2EgbG9zIG1lc2VzIHF1ZSBxdWllcmFzIGNvbnN1bHRhcjwvYj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1tb250aGFsbD0iJHtzY29wZX0iPlRvZG9zPC9idXR0b24+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtbW9udGhjbGVhcj0iJHtzY29wZX0iPkxpbXBpYXI8L2J1dHRvbj48L2Rpdj48ZGl2IGNsYXNzPSJtb250aENoZWNrc1YxMiI+JHttb250aHMubWFwKG09PmA8bGFiZWwgY2xhc3M9ImNoZWNrSXRlbVYxMiI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBkYXRhLW1vbnRoY2hlY2s9IiR7c2NvcGV9IiB2YWx1ZT0iJHttfSIgJHtzdGF0ZS5tb250aHMuaW5jbHVkZXMobSk/J2NoZWNrZWQnOicnfT48c3Bhbj4ke2Rpc3BsYXlEYXRlc1Y1KG0pfTwvc3Bhbj48L2xhYmVsPmApLmpvaW4oJycpfTwvZGl2PiR7c3RhdGUubW9kZT09PSd3ZWVrJz9gPHA+PGI+Mi4gTWFyY2EgbGFzIHNlbWFuYXMgZGUgZXNvcyBtZXNlczwvYj48L3A+PGRpdiBjbGFzcz0id2Vla0NoZWNrc1YxMiIgZGF0YS13ZWVrbGlzdD0iJHtzY29wZX0iPiR7d2Vla0NoZWNrc1YxMihzY29wZSxzdGF0ZS5tb250aHMsc3RhdGUud2Vla3MpfTwvZGl2PmA6Jyd9PGRpdiBjbGFzcz0iYXBwbHlNb250aHNWMTIiPjxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0icHJpbWFyeSIgZGF0YS1hcHBseW1vbnRocz0iJHtzY29wZX0iPkFwbGljYXIgc2VsZWNjacOzbjwvYnV0dG9uPjxzcGFuIGRhdGEtbW9udGhtZXNzYWdlPSIke3Njb3BlfSI+UHVlZGVzIG1hcmNhciB2YXJpb3Mgc2luIHVzYXIgQ3RybC4gTG9zIGluZm9ybWVzIGNhbWJpYW4gYWwgcHVsc2FyIEFwbGljYXIgc2VsZWNjacOzbi48L3NwYW4+PC9kaXY+PHAgY2xhc3M9InNpZ25hbG5vdGUiPlNpbiBtZXNlcyBtYXJjYWRvcyBzZSBjb25zdWx0YW4gdG9kb3MgbG9zIG1lc2VzLiR7c3RhdGUubW9kZT09PSd3ZWVrJz8nIFNpbiBzZW1hbmFzIG1hcmNhZGFzIHNlIGNvbnN1bHRhbiB0b2RhcyBsYXMgc2VtYW5hcyBkZSBsb3MgbWVzZXMgZWxlZ2lkb3MuJzonJ308L3A+PC9kaXY+YDsKfTsKZnVuY3Rpb24gY2hlY2tlZFZhbHVlc1YxMihzY29wZSx0eXBlKXtyZXR1cm4gWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLScrdHlwZSsnPSInK3Njb3BlKyciXScpXS5maWx0ZXIoZWw9PmVsLmNoZWNrZWQpLm1hcChlbD0+ZWwudmFsdWUpfQpmdW5jdGlvbiByZWZyZXNoV2Vla3NWMTIoc2NvcGUpe2NvbnN0IGNvbnRhaW5lcj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS13ZWVrbGlzdD0iJytzY29wZSsnIl0nKTtpZihjb250YWluZXIpe2NvbnN0IHdlZWtzPWNoZWNrZWRWYWx1ZXNWMTIoc2NvcGUsJ3dlZWtjaGVjaycpO2NvbnRhaW5lci5pbm5lckhUTUw9d2Vla0NoZWNrc1YxMihzY29wZSxjaGVja2VkVmFsdWVzVjEyKHNjb3BlLCdtb250aGNoZWNrJyksd2Vla3MpfWNvbnN0IG1lc3NhZ2U9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtbW9udGhtZXNzYWdlPSInK3Njb3BlKyciXScpO2lmKG1lc3NhZ2UpbWVzc2FnZS50ZXh0Q29udGVudD0nU2VsZWNjacOzbiBwZW5kaWVudGUuIFB1bHNhIEFwbGljYXIgc2VsZWNjacOzbiBwYXJhIGFjdHVhbGl6YXIgZWwgaW5mb3JtZS4nfQpjb25zdCBiaW5kQmVmb3JlVjEyPWJpbmRDYWxlbmRhcnNWODsKYmluZENhbGVuZGFyc1Y4PWZ1bmN0aW9uKCl7CiBiaW5kQmVmb3JlVjEyKCk7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1tb250aGNoZWNrXScpLmZvckVhY2goZWw9PmVsLm9uY2hhbmdlPSgpPT5yZWZyZXNoV2Vla3NWMTIoZWwuZGF0YXNldC5tb250aGNoZWNrKSk7CiBmb3IoY29uc3RbdHlwZSxjaGVja2VkXW9mIFtbJ21vbnRoYWxsJyx0cnVlXSxbJ21vbnRoY2xlYXInLGZhbHNlXV0pZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtJyt0eXBlKyddJykuZm9yRWFjaChidXR0b249PmJ1dHRvbi5vbmNsaWNrPSgpPT57Y29uc3Qgc2NvcGU9YnV0dG9uLmRhdGFzZXRbdHlwZV07ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbW9udGhjaGVjaz0iJytzY29wZSsnIl0nKS5mb3JFYWNoKGVsPT5lbC5jaGVja2VkPWNoZWNrZWQpO3JlZnJlc2hXZWVrc1YxMihzY29wZSl9KTsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFwcGx5bW9udGhzXScpLmZvckVhY2goYnV0dG9uPT5idXR0b24ub25jbGljaz0oKT0+e2NvbnN0IHNjb3BlPWJ1dHRvbi5kYXRhc2V0LmFwcGx5bW9udGhzLHN0YXRlPWNhbGVuZGFyU3RhdGVWOChzY29wZSk7c3RhdGUubW9udGhzPWNoZWNrZWRWYWx1ZXNWMTIoc2NvcGUsJ21vbnRoY2hlY2snKTtzdGF0ZS5tb250aHNJbml0aWFsaXplZD10cnVlO3N0YXRlLm1vbnRoPXN0YXRlLm1vbnRoc1swXXx8Jyc7c3RhdGUud2Vla3M9c3RhdGUubW9kZT09PSd3ZWVrJz9jaGVja2VkVmFsdWVzVjEyKHNjb3BlLCd3ZWVrY2hlY2snKTpbXTtyZW5kZXIoKX0pOwp9OwoKY29uc3QgcGFuZWxCZWZvcmVWMTM9Y2FsZW5kYXJQYW5lbFY4OwpmdW5jdGlvbiBzZWxlY3Rpb25DYXB0aW9uVjEzKHZhbHVlcyx0eXBlKXtpZighdmFsdWVzLmxlbmd0aClyZXR1cm4gdHlwZT09PSdtb250aCc/J1RvZG9zIGxvcyBtZXNlcyc6J1RvZGFzIGxhcyBzZW1hbmFzJztpZih2YWx1ZXMubGVuZ3RoPjIpcmV0dXJuIHZhbHVlcy5sZW5ndGgrKHR5cGU9PT0nbW9udGgnPycgbWVzZXMgc2VsZWNjaW9uYWRvcyc6JyBzZW1hbmFzIHNlbGVjY2lvbmFkYXMnKTtyZXR1cm4gdmFsdWVzLm1hcCh2YWx1ZT0+e2lmKHR5cGU9PT0nbW9udGgnKXJldHVybiBkaXNwbGF5RGF0ZXNWNSh2YWx1ZSk7Y29uc3RbbSx3XT12YWx1ZS5zcGxpdCgnfCcpO3JldHVybiBtb250aFNob3J0VjhbTnVtYmVyKG0uc2xpY2UoNSkpLTFdKyctJyt3KycgwrcgJyttLnNsaWNlKDAsNCl9KS5qb2luKCcsICcpfQpjYWxlbmRhclBhbmVsVjg9ZnVuY3Rpb24oc2NvcGUpewogY29uc3Qgc3RhdGU9Y2FsZW5kYXJTdGF0ZVY4KHNjb3BlKTtpZighWydtb250aCcsJ3dlZWsnXS5pbmNsdWRlcyhzdGF0ZS5tb2RlKSlyZXR1cm4gcGFuZWxCZWZvcmVWMTMoc2NvcGUpOwogY29uc3QgbW9udGhzPW1vbnRoQ2hvaWNlc1Y4KCk7aWYoIXN0YXRlLm1vbnRocy5sZW5ndGgmJnN0YXRlLm1vbnRoJiYhc3RhdGUubW9udGhzSW5pdGlhbGl6ZWQpe3N0YXRlLm1vbnRocz1bc3RhdGUubW9udGhdO3N0YXRlLm1vbnRoc0luaXRpYWxpemVkPXRydWV9CiBjb25zdCBjaGVja3M9bW9udGhzLm1hcChtPT5gPGxhYmVsIGNsYXNzPSJjaGVja0l0ZW1WMTIiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGF0YS1tb250aGNoZWNrPSIke3Njb3BlfSIgdmFsdWU9IiR7bX0iICR7c3RhdGUubW9udGhzLmluY2x1ZGVzKG0pPydjaGVja2VkJzonJ30+PHNwYW4+JHtkaXNwbGF5RGF0ZXNWNShtKX08L3NwYW4+PC9sYWJlbD5gKS5qb2luKCcnKTsKIHJldHVybiBgPGRpdiBjbGFzcz0iY2FsZW5kYXJQYW5lbCBjb21wYWN0Q2FsZW5kYXJWMTMiIGRhdGEtY2FsZW5kYXJwYW5lbD0iJHtzY29wZX0iPjxkaXYgY2xhc3M9ImNvbXBhY3RSb3dWMTMiPjxsYWJlbD5TZWxlY2Npb25hciBmZWNoYXMgcG9yPHNlbGVjdCBkYXRhLWNhbG1vZGU9IiR7c2NvcGV9Ij4ke09iamVjdC5lbnRyaWVzKHtyYW5nZTonUmFuZ28gY29uIGNhbGVuZGFyaW8nLGRhdGVzOidEw61hcyBlc3BlY8OtZmljb3MnLG1vbnRoOidNZXNlcycsd2VlazonTWVzZXMgeSBzZW1hbmFzJyxxdWFydGVyOidUcmltZXN0cmUnfSkubWFwKChbayx2XSk9PmA8b3B0aW9uIHZhbHVlPSIke2t9IiAke3N0YXRlLm1vZGU9PT1rPydzZWxlY3RlZCc6Jyd9PiR7dn08L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48L2xhYmVsPjxkaXYgY2xhc3M9ImRyb3Bkb3duRmllbGRWMTMiPjxzcGFuPk1lc2VzPC9zcGFuPjxkZXRhaWxzIGNsYXNzPSJleGNlbERyb3Bkb3duVjEzIiBkYXRhLWV4Y2VsZHJvcD0iJHtzY29wZX0tbW9udGgiPjxzdW1tYXJ5PjxzcGFuIGRhdGEtbW9udGhjYXB0aW9uPSIke3Njb3BlfSI+JHtlc2Moc2VsZWN0aW9uQ2FwdGlvblYxMyhzdGF0ZS5tb250aHMsJ21vbnRoJykpfTwvc3Bhbj48Yj7ilr48L2I+PC9zdW1tYXJ5PjxkaXYgY2xhc3M9ImV4Y2VsTWVudVYxMyI+PGlucHV0IHR5cGU9InNlYXJjaCIgcGxhY2Vob2xkZXI9IkJ1c2NhciBtZXPigKYiIGFyaWEtbGFiZWw9IkJ1c2NhciBtZXMiIGRhdGEtZHJvcGRvd25zZWFyY2g9Im1vbnRoLSR7c2NvcGV9Ij48ZGl2IGNsYXNzPSJkcm9wZG93bkFjdGlvbnNWMTMiPjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLW1vbnRoYWxsPSIke3Njb3BlfSI+U2VsZWNjaW9uYXIgdG9kb3M8L2J1dHRvbj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1tb250aGNsZWFyPSIke3Njb3BlfSI+TGltcGlhcjwvYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9Im1vbnRoQ2hlY2tzVjEyIiBkYXRhLXNlYXJjaGxpc3Q9Im1vbnRoLSR7c2NvcGV9Ij4ke2NoZWNrc308L2Rpdj48c21hbGw+TWFyY2EgdmFyaW9zIG1lc2VzIHNpbiB1c2FyIEN0cmwuPC9zbWFsbD48L2Rpdj48L2RldGFpbHM+PC9kaXY+JHtzdGF0ZS5tb2RlPT09J3dlZWsnP2A8ZGl2IGNsYXNzPSJkcm9wZG93bkZpZWxkVjEzIj48c3Bhbj5TZW1hbmFzIGRlIGVzb3MgbWVzZXM8L3NwYW4+PGRldGFpbHMgY2xhc3M9ImV4Y2VsRHJvcGRvd25WMTMiIGRhdGEtZXhjZWxkcm9wPSIke3Njb3BlfS13ZWVrIj48c3VtbWFyeT48c3BhbiBkYXRhLXdlZWtjYXB0aW9uPSIke3Njb3BlfSI+JHtlc2Moc2VsZWN0aW9uQ2FwdGlvblYxMyhzdGF0ZS53ZWVrcywnd2VlaycpKX08L3NwYW4+PGI+4pa+PC9iPjwvc3VtbWFyeT48ZGl2IGNsYXNzPSJleGNlbE1lbnVWMTMiPjxpbnB1dCB0eXBlPSJzZWFyY2giIHBsYWNlaG9sZGVyPSJCdXNjYXIgc2VtYW5h4oCmIiBhcmlhLWxhYmVsPSJCdXNjYXIgc2VtYW5hIiBkYXRhLWRyb3Bkb3duc2VhcmNoPSJ3ZWVrLSR7c2NvcGV9Ij48ZGl2IGNsYXNzPSJkcm9wZG93bkFjdGlvbnNWMTMiPjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLXdlZWthbGx2MTM9IiR7c2NvcGV9Ij5TZWxlY2Npb25hciB0b2RhczwvYnV0dG9uPjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLXdlZWtjbGVhcnYxMz0iJHtzY29wZX0iPkxpbXBpYXI8L2J1dHRvbj48L2Rpdj48ZGl2IGNsYXNzPSJ3ZWVrQ2hlY2tzVjEyIiBkYXRhLXdlZWtsaXN0PSIke3Njb3BlfSIgZGF0YS1zZWFyY2hsaXN0PSJ3ZWVrLSR7c2NvcGV9Ij4ke3dlZWtDaGVja3NWMTIoc2NvcGUsc3RhdGUubW9udGhzLHN0YXRlLndlZWtzKX08L2Rpdj48c21hbGw+U2luIHNlbWFuYXMgbWFyY2FkYXM6IHRvZGFzIGxhcyBkZSBsb3MgbWVzZXMgZWxlZ2lkb3MuPC9zbWFsbD48L2Rpdj48L2RldGFpbHM+PC9kaXY+YDonJ308YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InByaW1hcnkiIGRhdGEtYXBwbHltb250aHM9IiR7c2NvcGV9Ij5BcGxpY2FyIHNlbGVjY2nDs248L2J1dHRvbj48L2Rpdj48ZGl2IGNsYXNzPSJjb21wYWN0TWVzc2FnZVYxMyIgZGF0YS1tb250aG1lc3NhZ2U9IiR7c2NvcGV9Ij5TZWxlY2Npb25hIG1lc2VzJHtzdGF0ZS5tb2RlPT09J3dlZWsnPycgeSBzZW1hbmFzJzonJ30geSBwdWxzYSBBcGxpY2FyIHNlbGVjY2nDs24uPC9kaXY+PC9kaXY+YDsKfTsKZnVuY3Rpb24gdXBkYXRlQ2FwdGlvbnNWMTMoc2NvcGUpe2NvbnN0IG1vbnRoPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1vbnRoY2FwdGlvbj0iJytzY29wZSsnIl0nKSx3ZWVrPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXdlZWtjYXB0aW9uPSInK3Njb3BlKyciXScpO2lmKG1vbnRoKW1vbnRoLnRleHRDb250ZW50PXNlbGVjdGlvbkNhcHRpb25WMTMoY2hlY2tlZFZhbHVlc1YxMihzY29wZSwnbW9udGhjaGVjaycpLCdtb250aCcpO2lmKHdlZWspd2Vlay50ZXh0Q29udGVudD1zZWxlY3Rpb25DYXB0aW9uVjEzKGNoZWNrZWRWYWx1ZXNWMTIoc2NvcGUsJ3dlZWtjaGVjaycpLCd3ZWVrJyl9CmNvbnN0IHJlZnJlc2hCZWZvcmVWMTM9cmVmcmVzaFdlZWtzVjEyOwpyZWZyZXNoV2Vla3NWMTI9ZnVuY3Rpb24oc2NvcGUpe3JlZnJlc2hCZWZvcmVWMTMoc2NvcGUpO3VwZGF0ZUNhcHRpb25zVjEzKHNjb3BlKX07CmNvbnN0IGJpbmRCZWZvcmVWMTM9YmluZENhbGVuZGFyc1Y4OwpiaW5kQ2FsZW5kYXJzVjg9ZnVuY3Rpb24oKXsKIGJpbmRCZWZvcmVWMTMoKTsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXdlZWtjaGVja10nKS5mb3JFYWNoKGVsPT5lbC5vbmNoYW5nZT0oKT0+e3VwZGF0ZUNhcHRpb25zVjEzKGVsLmRhdGFzZXQud2Vla2NoZWNrKX0pOwogZm9yKGNvbnN0W3R5cGUsY2hlY2tlZF1vZiBbWyd3ZWVrYWxsdjEzJyx0cnVlXSxbJ3dlZWtjbGVhcnYxMycsZmFsc2VdXSlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS0nK3R5cGUrJ10nKS5mb3JFYWNoKGJ1dHRvbj0+YnV0dG9uLm9uY2xpY2s9KCk9Pntjb25zdCBzY29wZT1idXR0b24uZGF0YXNldFt0eXBlXTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS13ZWVrY2hlY2s9Iicrc2NvcGUrJyJdJykuZm9yRWFjaChlbD0+ZWwuY2hlY2tlZD1jaGVja2VkKTt1cGRhdGVDYXB0aW9uc1YxMyhzY29wZSl9KTsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWRyb3Bkb3duc2VhcmNoXScpLmZvckVhY2goaW5wdXQ9PmlucHV0Lm9uaW5wdXQ9KCk9Pntjb25zdCBsaXN0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNlYXJjaGxpc3Q9IicraW5wdXQuZGF0YXNldC5kcm9wZG93bnNlYXJjaCsnIl0nKTtpZighbGlzdClyZXR1cm47Y29uc3Qgc2VhcmNoPWlucHV0LnZhbHVlLnRyaW0oKS50b0xvY2FsZUxvd2VyQ2FzZSgnZXMnKTtsaXN0LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jaGVja0l0ZW1WMTInKS5mb3JFYWNoKGxhYmVsPT5sYWJlbC5zdHlsZS5kaXNwbGF5PWxhYmVsLnRleHRDb250ZW50LnRvTG9jYWxlTG93ZXJDYXNlKCdlcycpLmluY2x1ZGVzKHNlYXJjaCk/J2ZsZXgnOidub25lJyl9KTsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5leGNlbERyb3Bkb3duVjEzJykuZm9yRWFjaChkcm9wPT5kcm9wLmFkZEV2ZW50TGlzdGVuZXIoJ3RvZ2dsZScsKCk9PntpZihkcm9wLm9wZW4pZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmV4Y2VsRHJvcGRvd25WMTMnKS5mb3JFYWNoKG90aGVyPT57aWYob3RoZXIhPT1kcm9wKW90aGVyLm9wZW49ZmFsc2V9KX0pKTsKfTsKLy8gV2VlayBvcHRpb25zIGFyZSByZWdlbmVyYXRlZCB3aGVuIG1vbnRocyBjaGFuZ2U6IGhhbmRsZSB0aGVpciBjYXB0aW9ucyBieSBkZWxlZ2F0aW9uLgpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLGV2ZW50PT57aWYoZXZlbnQudGFyZ2V0Lm1hdGNoZXM/LignW2RhdGEtd2Vla2NoZWNrXScpKXVwZGF0ZUNhcHRpb25zVjEzKGV2ZW50LnRhcmdldC5kYXRhc2V0LndlZWtjaGVjayl9KTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGV2ZW50PT5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZXhjZWxEcm9wZG93blYxM1tvcGVuXScpLmZvckVhY2goZHJvcD0+e2lmKCFkcm9wLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpZHJvcC5vcGVuPWZhbHNlfSkpOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxldmVudD0+e2lmKGV2ZW50LmtleT09PSdFc2NhcGUnKWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5leGNlbERyb3Bkb3duVjEzW29wZW5dJykuZm9yRWFjaChkcm9wPT5kcm9wLm9wZW49ZmFsc2UpfSk7CgpsZXQgYXBwU2Vzc2lvblYxNT1udWxsLHN0YXJ0ZWRTZXNzaW9uVjE1PWZhbHNlOwpmdW5jdGlvbiB1cGxvYWRQcm9ncmVzc0xBKHRleHQpewogZm9yKGNvbnN0IGlkIG9mIFsnbG9naW5NZXNzYWdlVjE1Jywnc3RhdHVzJ10pe2NvbnN0IGVsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtpZihlbCllbC50ZXh0Q29udGVudD10ZXh0O30KfQphc3luYyBmdW5jdGlvbiB1cGxvYWRDaHVua3NMQShpbmNvbWluZyxtb2RlLGV4cGVjdGVkUmV2aXNpb24sdG9rZW4pewogaWYoIWluY29taW5nPy5yb3dzPy5sZW5ndGgpdGhyb3cgRXJyb3IoJ0xhIG1hdHJpeiBubyB0aWVuZSByZWdpc3Ryb3MgYXBsaWNhYmxlcy4nKTsKIGlmKGluY29taW5nLnJvd3MubGVuZ3RoPjIwMDAwMCl0aHJvdyBFcnJvcignTGEgaW1wb3J0YWNpw7NuIHN1cGVyYSAyMDAuMDAwIHJlZ2lzdHJvcy4nKTsKIGNvbnN0IGVuY29kZWQ9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGluY29taW5nKSk7CiBpZihlbmNvZGVkLmJ5dGVMZW5ndGg+NDAwMDAwMDApdGhyb3cgRXJyb3IoJ0VsIGFyY2hpdm8gbm9ybWFsaXphZG8gc3VwZXJhIDQwIE1CLicpOwogY29uc3QgZGlnZXN0PWF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCdTSEEtMjU2JyxlbmNvZGVkKSxmaW5nZXJwcmludD1BcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGRpZ2VzdCkseD0+eC50b1N0cmluZygxNikucGFkU3RhcnQoMiwnMCcpKS5qb2luKCcnKTsKIGNvbnN0IHJldmlzaW9uPWV4cGVjdGVkUmV2aXNpb24mJmV4cGVjdGVkUmV2aXNpb24hPT0naW5pdGlhbCc/ZXhwZWN0ZWRSZXZpc2lvbjpudWxsOwogY29uc3Qgc3RvcmFnZUtleT0nTEFfVVBMT0FEOicrZmluZ2VycHJpbnQrJzonK21vZGUrJzonKyhyZXZpc2lvbnx8J2luaXRpYWwnKTsKIGxldCB1cGxvYWRJZDt0cnl7dXBsb2FkSWQ9c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlS2V5KX1jYXRjaChlKXt9CiBpZighdXBsb2FkSWQpe3VwbG9hZElkPWNyeXB0by5yYW5kb21VVUlEKCk7dHJ5e3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oc3RvcmFnZUtleSx1cGxvYWRJZCl9Y2F0Y2goZSl7fX0KIGNvbnN0IHtyb3dzLC4uLm1ldGFkYXRhfT1pbmNvbWluZztkZWxldGUgbWV0YWRhdGEuc3RvcmFnZVJldmlzaW9uOwogY29uc3QgcGFydHM9TWF0aC5jZWlsKHJvd3MubGVuZ3RoLzUwMCk7CiBhc3luYyBmdW5jdGlvbiBjYWxsKG5hbWUsYm9keSl7CiAgbGV0IGxhc3Q7CiAgZm9yKGxldCBhdHRlbXB0PTA7YXR0ZW1wdDwzO2F0dGVtcHQrKyl7CiAgIHRyeXtyZXR1cm4gYXdhaXQgc3VwYWJhc2VSZXF1ZXN0TEEoJy9yZXN0L3YxL3JwYy8nK25hbWUse21ldGhvZDonUE9TVCcsYm9keTpKU09OLnN0cmluZ2lmeShib2R5KX0sdG9rZW4pfQogICBjYXRjaChlcnJvcil7bGFzdD1lcnJvcjtpZihlcnJvci5zdGF0dXMmJmVycm9yLnN0YXR1czw1MDApdGhyb3cgZXJyb3I7aWYoYXR0ZW1wdDwyKWF3YWl0IG5ldyBQcm9taXNlKG9rPT5zZXRUaW1lb3V0KG9rLChhdHRlbXB0KzEpKjEwMDApKTt9CiAgfQogIHRocm93IEVycm9yKCdDYXJnYSBpbnRlcnJ1bXBpZGE6ICcrbGFzdC5tZXNzYWdlKycuIFZ1ZWx2ZSBhIHNlbGVjY2lvbmFyIGVsIG1pc21vIGFyY2hpdm8gcGFyYSByZWFudWRhci4nKTsKIH0KIHVwbG9hZFByb2dyZXNzTEEoJ0luaWNpYW5kbyBjYXJnYSBwb3IgYmxvcXVlc+KApicpOwogY29uc3Qgc3RhdGU9YXdhaXQgY2FsbCgnbGFfdXBsb2FkX2JlZ2luJyx7cF91cGxvYWQ6dXBsb2FkSWQscF9tZXRhZGF0YTptZXRhZGF0YSxwX21vZGU6bW9kZSxwX3JldmlzaW9uOnJldmlzaW9uLHBfcGFydHM6cGFydHMscF9yb3dzOnJvd3MubGVuZ3RoLHBfZmluZ2VycHJpbnQ6ZmluZ2VycHJpbnR9KTsKIGlmKHN0YXRlLnJlc3VsdCl7dHJ5e3Nlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oc3RvcmFnZUtleSl9Y2F0Y2goZSl7fXJldHVybiBzdGF0ZS5yZXN1bHR9CiBjb25zdCByZWNlaXZlZD1uZXcgU2V0KHN0YXRlLnJlY2VpdmVkfHxbXSk7CiBmb3IobGV0IHBhcnQ9MDtwYXJ0PHBhcnRzO3BhcnQrKyl7CiAgaWYoIXJlY2VpdmVkLmhhcyhwYXJ0KSlhd2FpdCBjYWxsKCdsYV91cGxvYWRfcGFydCcse3BfdXBsb2FkOnVwbG9hZElkLHBfcGFydDpwYXJ0LHBfcm93czpyb3dzLnNsaWNlKHBhcnQqNTAwLChwYXJ0KzEpKjUwMCl9KTsKICB1cGxvYWRQcm9ncmVzc0xBKCdDYXJnYW5kbyBoaXN0w7NyaWNvOiBibG9xdWUgJysocGFydCsxKSsnIGRlICcrcGFydHMrJyDCtyAnK01hdGgubWluKHJvd3MubGVuZ3RoLChwYXJ0KzEpKjUwMCkudG9Mb2NhbGVTdHJpbmcoJ2VzLUNMJykrJyByZWdpc3Ryb3MnKTsKIH0KIHVwbG9hZFByb2dyZXNzTEEoJ1RvZG9zIGxvcyBibG9xdWVzIHJlY2liaWRvcy4gQWN0aXZhbmRvIGhpc3TDs3JpY2/igKYnKTsKIGNvbnN0IHJlc3VsdD1hd2FpdCBjYWxsKCdsYV91cGxvYWRfZmluaXNoJyx7cF91cGxvYWQ6dXBsb2FkSWR9KTsKIHRyeXtzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKHN0b3JhZ2VLZXkpfWNhdGNoKGUpe31yZXR1cm4gcmVzdWx0Owp9CgovLyBSZXBsYWNlcyBHb29nbGUgUlBDLCBrZWVwaW5nIGRhc2hib2FyZCBjYWxjdWxhdGlvbnMgYW5kIHJlcG9ydHMgaW50YWN0Lgphc3luYyBmdW5jdGlvbiBzdXBhYmFzZVJlcXVlc3RMQShwYXRoLG9wdGlvbnM9e30sdG9rZW49bnVsbCl7CiBjb25zdCBjb25maWc9d2luZG93LkxBX0NPTkZJR3x8e307CiBpZighL15odHRwczpcL1wvW2EtejAtOS1dK1wuc3VwYWJhc2VcLmNvJC8udGVzdChjb25maWcuc3VwYWJhc2VVcmx8fCcnKXx8IWNvbmZpZy5wdWJsaXNoYWJsZUtleSl0aHJvdyBFcnJvcignRmFsdGEgY29uZmlndXJhciBsYSBVUkwgeSBsYSBjbGF2ZSBww7pibGljYSBkZSBTdXBhYmFzZSBlbiBjb25maWcuanMuJyk7CiBpZigvXnNiX3NlY3JldF8vLnRlc3QoY29uZmlnLnB1Ymxpc2hhYmxlS2V5KSl0aHJvdyBFcnJvcignTGEgY29uZmlndXJhY2nDs24gY29udGllbmUgdW5hIGNsYXZlIHNlY3JldGEuIFJldMOtcmFsYSB5IHLDs3RhbGEgZW4gU3VwYWJhc2UuJyk7CiBpZihjb25maWcucHVibGlzaGFibGVLZXkuc3RhcnRzV2l0aCgnZXlKJykpewogIGxldCBjbGFpbXM7dHJ5e2NsYWltcz1KU09OLnBhcnNlKGF0b2IoY29uZmlnLnB1Ymxpc2hhYmxlS2V5LnNwbGl0KCcuJylbMV0ucmVwbGFjZSgvLS9nLCcrJykucmVwbGFjZSgvXy9nLCcvJykpKX1jYXRjaChlKXt0aHJvdyBFcnJvcignQ2xhdmUgcMO6YmxpY2EgaGVyZWRhZGEgbm8gdsOhbGlkYS4nKX0KICBpZihjbGFpbXMucm9sZSE9PSdhbm9uJyl0aHJvdyBFcnJvcignU29sbyBzZSBhZG1pdGUgbGEgY2xhdmUgcMO6YmxpY2EgYW5vbjsgbnVuY2Egc2VydmljZV9yb2xlLicpOwogfQogY29uc3QgY29udHJvbGxlcj1uZXcgQWJvcnRDb250cm9sbGVyKCksdGltZXI9c2V0VGltZW91dCgoKT0+Y29udHJvbGxlci5hYm9ydCgpLDkwMDAwKTsKIHRyeXsKICBjb25zdCBoZWFkZXJzPXthcGlrZXk6Y29uZmlnLnB1Ymxpc2hhYmxlS2V5LCdDb250ZW50LVR5cGUnOidhcHBsaWNhdGlvbi9qc29uJywuLi4odG9rZW4/e0F1dGhvcml6YXRpb246J0JlYXJlciAnK3Rva2VufTp7fSksLi4uKG9wdGlvbnMuaGVhZGVyc3x8e30pfTsKICBjb25zdCByZXNwb25zZT1hd2FpdCBmZXRjaChjb25maWcuc3VwYWJhc2VVcmwrcGF0aCx7Li4ub3B0aW9ucyxoZWFkZXJzLHNpZ25hbDpjb250cm9sbGVyLnNpZ25hbH0pOwogIGNvbnN0IHRleHQ9YXdhaXQgcmVzcG9uc2UudGV4dCgpO2xldCByZXN1bHQ7dHJ5e3Jlc3VsdD10ZXh0P0pTT04ucGFyc2UodGV4dCk6bnVsbH1jYXRjaChlKXt0aHJvdyBFcnJvcignRWwgc2Vydmlkb3IgZGV2b2x2acOzIHVuYSByZXNwdWVzdGEgbm8gdsOhbGlkYS4nKX0KICBpZighcmVzcG9uc2Uub2spe2NvbnN0IGVycm9yPUVycm9yKHJlc3BvbnNlLnN0YXR1cz09PTQwMT8nQVVUSF9SRVFVSVJFRDogTGEgc2VzacOzbiB0ZXJtaW7DsyBvIGxhcyBjcmVkZW5jaWFsZXMgbm8gc29uIHbDoWxpZGFzLic6cmVzdWx0Py5tc2d8fHJlc3VsdD8ubWVzc2FnZXx8cmVzdWx0Py5lcnJvcl9kZXNjcmlwdGlvbnx8J0Vycm9yIGRlIGNvbmV4acOzbiAoJytyZXNwb25zZS5zdGF0dXMrJykuJyk7ZXJyb3Iuc3RhdHVzPXJlc3BvbnNlLnN0YXR1czt0aHJvdyBlcnJvcjt9CiAgcmV0dXJuIHJlc3VsdDsKIH1jYXRjaChlcnJvcil7aWYoZXJyb3IubmFtZT09PSdBYm9ydEVycm9yJyl0aHJvdyBFcnJvcignTGEgY29uZXhpw7NuIHRhcmTDsyBkZW1hc2lhZG8uIEludGVudGEgbnVldmFtZW50ZS4nKTt0aHJvdyBlcnJvcn1maW5hbGx5e2NsZWFyVGltZW91dCh0aW1lcil9Cn0KYXN5bmMgZnVuY3Rpb24gc3VwYWJhc2VQcm9maWxlTEEodG9rZW4pewogY29uc3QgbGlzdD1hd2FpdCBzdXBhYmFzZVJlcXVlc3RMQSgnL3Jlc3QvdjEvbGFfcHJvZmlsZXM/c2VsZWN0PXVzZXJfaWQsdXNlcm5hbWUscm9sZScse30sdG9rZW4pOwogaWYoIUFycmF5LmlzQXJyYXkobGlzdCl8fGxpc3QubGVuZ3RoIT09MSl0aHJvdyBFcnJvcignRXN0YSBjdWVudGEgYcO6biBubyB0aWVuZSB1biBwZXJtaXNvIGFzaWduYWRvIGVuIGVsIGRhc2hib2FyZC4nKTtyZXR1cm4gbGlzdFswXTsKfQphc3luYyBmdW5jdGlvbiBzdXBhYmFzZVJwY0xBKG5hbWUsLi4uYXJncyl7CiBpZihuYW1lPT09J2xvZ2luJyl7CiAgY29uc3QgdXNlcm5hbWU9U3RyaW5nKGFyZ3NbMF18fCcnKS50cmltKCkudG9VcHBlckNhc2UoKSxlbWFpbD13aW5kb3cuTEFfQ09ORklHPy5hY2NvdW50cz8uW3VzZXJuYW1lXTsKICBpZighZW1haWwpdGhyb3cgRXJyb3IoJ1VzdWFyaW8gbyBjb250cmFzZcOxYSBubyB2w6FsaWRvcy4nKTsKICBjb25zdCByZXN1bHQ9YXdhaXQgc3VwYWJhc2VSZXF1ZXN0TEEoJy9hdXRoL3YxL3Rva2VuP2dyYW50X3R5cGU9cGFzc3dvcmQnLHttZXRob2Q6J1BPU1QnLGJvZHk6SlNPTi5zdHJpbmdpZnkoe2VtYWlsLHBhc3N3b3JkOmFyZ3NbMV19KX0pOwogIGNvbnN0IHByb2ZpbGU9YXdhaXQgc3VwYWJhc2VQcm9maWxlTEEocmVzdWx0LmFjY2Vzc190b2tlbik7CiAgcmV0dXJuIHsuLi5wcm9maWxlLHRva2VuOnJlc3VsdC5hY2Nlc3NfdG9rZW4sZXhwaXJlczpEYXRlLm5vdygpK3Jlc3VsdC5leHBpcmVzX2luKjEwMDB9OwogfQogY29uc3QgdG9rZW49YXJncy5hdCgtMSk7CiBpZihuYW1lPT09J3Nlc3Npb25JbmZvJylyZXR1cm4gey4uLmF3YWl0IHN1cGFiYXNlUHJvZmlsZUxBKHRva2VuKSxleHBpcmVzOkpTT04ucGFyc2UoYXRvYih0b2tlbi5zcGxpdCgnLicpWzFdLnJlcGxhY2UoLy0vZywnKycpLnJlcGxhY2UoL18vZywnLycpKSkuZXhwKjEwMDB9OwogaWYobmFtZT09PSdsb2dvdXQnKXthd2FpdCBzdXBhYmFzZVJlcXVlc3RMQSgnL2F1dGgvdjEvbG9nb3V0Jyx7bWV0aG9kOidQT1NUJ30sdG9rZW4pO3JldHVybiB0cnVlfQogaWYobmFtZT09PSdnZXRNYXRyaXgnKXsKICBjb25zdCBsaXN0PWF3YWl0IHN1cGFiYXNlUmVxdWVzdExBKCcvcmVzdC92MS9sYV9tYXRyaXg/aWQ9ZXEuMSZzZWxlY3Q9cGF5bG9hZCxyZXZpc2lvbix1cGRhdGVkX2F0Jyx7fSx0b2tlbik7CiAgaWYoIWxpc3QubGVuZ3RoKXRocm93IEVycm9yKCdBw7puIG5vIGhheSBtYXRyaXouIEFkbWluaXN0cmFjacOzbiBkZWJlIGltcG9ydGFyIGVsIGhpc3TDs3JpY28gaW5pY2lhbCBjb24gZWwgYm90w7NuIGRlbCBpbmdyZXNvLicpOwogIHJldHVybiBKU09OLnN0cmluZ2lmeSh7Li4ubGlzdFswXS5wYXlsb2FkLHN0b3JhZ2VSZXZpc2lvbjpsaXN0WzBdLnJldmlzaW9uLHN0b3JhZ2VVcGRhdGVkQXQ6bGlzdFswXS51cGRhdGVkX2F0fSk7CiB9CiBpZihuYW1lPT09J2dldFZpZXdzJyl7CiAgY29uc3QgbGlzdD1hd2FpdCBzdXBhYmFzZVJlcXVlc3RMQSgnL3Jlc3QvdjEvbGFfdmlld3M/c2VsZWN0PXBheWxvYWQnLHt9LHRva2VuKTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobGlzdFswXT8ucGF5bG9hZHx8W10pOwogfQogaWYobmFtZT09PSdzYXZlVmlld3MnKXsKICBjb25zdCBwYXlsb2FkPUpTT04ucGFyc2UoYXJnc1swXSk7aWYoIUFycmF5LmlzQXJyYXkocGF5bG9hZCl8fEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLmxlbmd0aD44NTAwKXRocm93IEVycm9yKCdWaXN0YXMgbm8gdsOhbGlkYXMgbyBkZW1hc2lhZG8gZ3JhbmRlcy4nKTsKICBjb25zdCBwcm9maWxlPWF3YWl0IHN1cGFiYXNlUHJvZmlsZUxBKHRva2VuKTsKICBhd2FpdCBzdXBhYmFzZVJlcXVlc3RMQSgnL3Jlc3QvdjEvbGFfdmlld3M/b25fY29uZmxpY3Q9dXNlcl9pZCcse21ldGhvZDonUE9TVCcsaGVhZGVyczp7UHJlZmVyOidyZXNvbHV0aW9uPW1lcmdlLWR1cGxpY2F0ZXMnfSxib2R5OkpTT04uc3RyaW5naWZ5KHt1c2VyX2lkOnByb2ZpbGUudXNlcl9pZCxwYXlsb2FkfSl9LHRva2VuKTtyZXR1cm4gdHJ1ZTsKIH0KIGlmKG5hbWU9PT0naW1wb3J0TWF0cml4Jyl7CiAgY29uc3QgaW5jb21pbmc9Y2xlYW5NYXRyaXhWNyhKU09OLnBhcnNlKGFyZ3NbMF0pKTsKICByZXR1cm4gdXBsb2FkQ2h1bmtzTEEoaW5jb21pbmcsYXJnc1sxXSxhcmdzWzJdLHRva2VuKTsKIH0KIHRocm93IEVycm9yKCdPcGVyYWNpw7NuIG5vIGRpc3BvbmlibGU6ICcrbmFtZSk7Cn0KCmNvbnN0IGRpcmVjdFJwY1YxNT1zdXBhYmFzZVJwY0xBOwpmdW5jdGlvbiBsb2dpblNjcmVlblYxNShtZXNzYWdlPScnKXsKIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnbG9ja2VkVjE1Jyk7JCgnI2xvZ2luVjE1JykuaGlkZGVuPWZhbHNlOyQoJyNsb2dpbk1lc3NhZ2VWMTUnKS50ZXh0Q29udGVudD1tZXNzYWdlOyQoJyNwYXNzd29yZFYxNScpLnZhbHVlPScnOwp9CmZ1bmN0aW9uIGVuZExvY2FsU2Vzc2lvblYxNShtZXNzYWdlPScnKXsKIGFwcFNlc3Npb25WMTU9bnVsbDtkYXRhPW51bGw7c2F2ZWRWaWV3cz1bXTtjaGFydFBvaW50c1Y0LmNsZWFyKCk7JCgnI2NvbnRlbnQnKS5pbm5lckhUTUw9Jyc7dHJ5e3Nlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ0xBX0FVVEhfU0VTU0lPTicpfWNhdGNoKGUpe31sb2dpblNjcmVlblYxNShtZXNzYWdlKTsKfQpycGM9ZnVuY3Rpb24obmFtZSwuLi5hcmdzKXsKIGlmKCFhcHBTZXNzaW9uVjE1KXJldHVybiBQcm9taXNlLnJlamVjdChFcnJvcignQVVUSF9SRVFVSVJFRDogSW5pY2lhIHNlc2nDs24uJykpOwogcmV0dXJuIG5ldyBQcm9taXNlKChvayxubyk9Pntjb25zdCB0aW1lb3V0PXNldFRpbWVvdXQoKCk9Pm5vKEVycm9yKCdFbCBzZXJ2aWNpbyBubyByZXNwb25kacOzLiBJbnRlbnRhIG51ZXZhbWVudGUuJykpLG5hbWU9PT0naW1wb3J0TWF0cml4Jz85MDAwMDA6bmFtZT09PSdnZXRWaWV3cyc/MTUwMDA6OTAwMDApOwogZGlyZWN0UnBjVjE1KG5hbWUsLi4uYXJncyxhcHBTZXNzaW9uVjE1LnRva2VuKS50aGVuKHZhbHVlPT57Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO29rKHZhbHVlKX0sZXJyb3I9PntjbGVhclRpbWVvdXQodGltZW91dCk7aWYoU3RyaW5nKGVycm9yLm1lc3NhZ2V8fGVycm9yKS5pbmNsdWRlcygnQVVUSF9SRVFVSVJFRDonKSllbmRMb2NhbFNlc3Npb25WMTUoJ0xhIHNlc2nDs24gdGVybWluw7MuIFZ1ZWx2ZSBhIGluZ3Jlc2FyLicpO25vKGVycm9yKX0pfSk7Cn07CmZ1bmN0aW9uIHJvbGVJbnRlcmZhY2VWMTUoKXsKIGlmKCFhcHBTZXNzaW9uVjE1KXJldHVybjsKIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgndmlld2VyVjE1JyxhcHBTZXNzaW9uVjE1LnJvbGUhPT0nYWRtaW4nKTsKICQoJyNzZXNzaW9uTmFtZVYxNScpLnRleHRDb250ZW50PWFwcFNlc3Npb25WMTUudXNlcm5hbWUrJyDCtyAnKyhhcHBTZXNzaW9uVjE1LnJvbGU9PT0nYWRtaW4nPydBZG1pbmlzdHJhY2nDs24nOidDb25zdWx0YScpOwogZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdsb2NrZWRWMTUnKTskKCcjbG9naW5WMTUnKS5oaWRkZW49dHJ1ZTsKfQphc3luYyBmdW5jdGlvbiBvcGVuU2Vzc2lvblYxNShzZXNzaW9uKXsKIGFwcFNlc3Npb25WMTU9c2Vzc2lvbjt0cnl7c2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnTEFfQVVUSF9TRVNTSU9OJyxKU09OLnN0cmluZ2lmeShzZXNzaW9uKSl9Y2F0Y2goZSl7fXJvbGVJbnRlcmZhY2VWMTUoKTtzdGFydGVkU2Vzc2lvblYxNT10cnVlO2F3YWl0IHN0YXJ0RGFzaGJvYXJkVjkoKTsKfQokKCcjbG9naW5Gb3JtVjE1Jykub25zdWJtaXQ9YXN5bmMgZXZlbnQ9PnsKIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7JCgnI2xvZ2luQnV0dG9uVjE1JykuZGlzYWJsZWQ9dHJ1ZTskKCcjbG9naW5NZXNzYWdlVjE1JykudGV4dENvbnRlbnQ9J1ZhbGlkYW5kbyBhY2Nlc2/igKYnOwogY29uc3QgcGFzc3dvcmQ9JCgnI3Bhc3N3b3JkVjE1JykudmFsdWU7JCgnI3Bhc3N3b3JkVjE1JykudmFsdWU9Jyc7CiB0cnl7Y29uc3Qgc2Vzc2lvbj1hd2FpdCBkaXJlY3RScGNWMTUoJ2xvZ2luJywkKCcjdXNlcm5hbWVWMTUnKS52YWx1ZSxwYXNzd29yZCk7YXdhaXQgb3BlblNlc3Npb25WMTUoc2Vzc2lvbil9Y2F0Y2goZXJyb3Ipe2xvZ2luU2NyZWVuVjE1KGVycm9yLm1lc3NhZ2V8fFN0cmluZyhlcnJvcikpfWZpbmFsbHl7JCgnI2xvZ2luQnV0dG9uVjE1JykuZGlzYWJsZWQ9ZmFsc2V9Cn07CiQoJyNsb2dvdXRWMTUnKS5vbmNsaWNrPWFzeW5jKCk9Pntjb25zdCB0b2tlbj1hcHBTZXNzaW9uVjE1Py50b2tlbjtlbmRMb2NhbFNlc3Npb25WMTUoJ1Nlc2nDs24gY2VycmFkYS4nKTtpZih0b2tlbil0cnl7YXdhaXQgZGlyZWN0UnBjVjE1KCdsb2dvdXQnLHRva2VuKX1jYXRjaChlKXt9fTsKY29uc3QgZmlsZUhhbmRsZXJCZWZvcmVWMTU9JCgnI2ZpbGUnKS5vbmNoYW5nZTsKJCgnI2ZpbGUnKS5vbmNoYW5nZT1ldmVudD0+e2lmKGFwcFNlc3Npb25WMTU/LnJvbGUhPT0nYWRtaW4nKXtldmVudC50YXJnZXQudmFsdWU9Jyc7YWxlcnQoJ1NvbG8gYWRtaW5pc3RyYWNpw7NuIHB1ZWRlIGNhcmdhciBtYXRyaWNlcy4nKTtyZXR1cm59cmV0dXJuIGZpbGVIYW5kbGVyQmVmb3JlVjE1KGV2ZW50KX07CmNvbnN0IHByZXZpZXdCZWZvcmVWMTU9c2hvd0ltcG9ydFByZXZpZXc7CnNob3dJbXBvcnRQcmV2aWV3PWZ1bmN0aW9uKGluY29taW5nKXtpZihhcHBTZXNzaW9uVjE1Py5yb2xlIT09J2FkbWluJyl0aHJvdyBFcnJvcignU29sbyBhZG1pbmlzdHJhY2nDs24gcHVlZGUgY2FyZ2FyIG1hdHJpY2VzLicpO3JldHVybiBwcmV2aWV3QmVmb3JlVjE1KGluY29taW5nKX07Ci8vIFByZXZlbnQgYXV0b21hdGljIHJlc3RhcnQgYWZ0ZXIgc2lnbi1vdXQgd2hpbGUgYW4gZWFybGllciBsb2FkIGlzIHN0aWxsIGNvbXBsZXRpbmcuCmNvbnN0IGluaXRCZWZvcmVWMTU9aW5pdDtpbml0PWZ1bmN0aW9uKCl7aWYoIWFwcFNlc3Npb25WMTUpe2RhdGE9bnVsbDtyZXR1cm59aW5pdEJlZm9yZVYxNSgpO3JvbGVJbnRlcmZhY2VWMTUoKX07Cihhc3luYygpPT57bG9naW5TY3JlZW5WMTUoKTt0cnl7Y29uc3Qgc3RvcmVkPUpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnTEFfQVVUSF9TRVNTSU9OJyl8fCdudWxsJyk7aWYoc3RvcmVkPy50b2tlbil7Y29uc3QgaW5mbz1hd2FpdCBkaXJlY3RScGNWMTUoJ3Nlc3Npb25JbmZvJyxzdG9yZWQudG9rZW4pO2lmKGluZm8uZXhwaXJlcz5EYXRlLm5vdygpKWF3YWl0IG9wZW5TZXNzaW9uVjE1KHsuLi5pbmZvLHRva2VuOnN0b3JlZC50b2tlbn0pfX1jYXRjaChlcnJvcil7ZW5kTG9jYWxTZXNzaW9uVjE1KCl9fSkoKTsKCgoKY29uc3QgRU5KT1lfTE9HT19WMTY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBeG9BQUFGR0NBWUFBQUR0aytuM0FBQUFDWEJJV1hNQUFDNGpBQUF1SXdGNHBUOTJBQUFCTm1sRFExQlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYXJZNnhTc05RRkVEUGk2TGlVQ3NFY1hCNGt5Z290dXBneHFRdFJSQ3MxU0hKMXFTaFNta1NYbDdWZm9Tald3Y1hkNy9BeVZGd1VQd0MvMEJ4NnVBUUlZT0RDSjdwM01QbGNzR28ySFduWVpSaEVHdlZianJTOVh3NSs4UU1Vd0RRQ2JQVWJyVU9BT0lranZqQjV5c0M0SG5UcmpzTi9zWjhtQ29OVElEdGJwU0ZJQ3BBLzBLbkdzUVlNSU4rcWtIY0FhWTZhZGRBUEFDbFh1NHZRQ25JL1Ewb0tkZnpRWHdBWnMvMWZERG1BRFBJZlFVd2RYU3BBV3BKT2xKbnZWTXRxNVpsU2J1YkJKRThIbVU2R21SeVB3NFRsU2FxbzZNdWtQOEh3R0srMkc0NmNxMXFXWHZyL0RPdTU4dmMzbzhRZ0ZoNkxGcEJPRlRuM3lxTW5kL240c1o0R1E1dllYcFN0TjBydU5tQWhldWlyVmFodkFYMzR5L0F4ay85NkZwUFlnQUFBQ0JqU0ZKTkFBQjZKUUFBZ0lNQUFQbi9BQUNBNkFBQVVnZ0FBUlZZQUFBNmx3QUFGMi9YV2grUUFBQlVlVWxFUVZSNDJ1emRkNWdieGYzSDhmZTVkeHNiakRETnBzZ1VZNHJwSmZST2FBbGdhaUFraUY1Q0NUV2gxd0NtQkJBdFFLZ2hkQWdkVE9qVnBvUWlpazJ4a1kwTjd0M24zeDh6OS9QNUxOMUpwOW5kMmQzUDYzbjJ3ZWlrMWU3czdHcS9PelBmQVJHSnZXSXV1MXN4bHgyc2toQVJFUkZmdEZFUmlNUSt5RmdOdUJmb3J0SVFFUkVSWDdSVEVZaDRGVFFzQVZ3Si9ET1RMN3hjd2Z0N0FJL2FJS085U2xCRVJFUjhvUllORVk5azhvVmZnTStBbDRxNTdNZkZYUGJJWWk3YnRVeVEwUWJUa2pGUUpTY2lJaUlLTkVTa0pkY0FvNEJCd0kzQUQ4VmM5dXBpTHJ0eWsvZWRCK3lxNGhJUkVSRWYxYWtJUlB4VHpHWDNCaDVxOHZJQzRHbmdPcUFiOEdDVHYrK1F5UmVlVittSmlJaUlEOVNpSWVLaFRMN3dNUEJLaVFjRHU5aGc0OEVTSCt1cWtoTVJFUkVGR2lMU2toTXhyUmdpSWlJaUNqUkV4STFNdmpBU3VFMGxJU0lpSWdvMFJNUzFzNEdwRmI2M3A0cExSRVJFRkdpSVNJc3krY0k0NEtJSzMzNXRNWmZkU0tVbUlpSWlDalJFcEJJZlZmaStIc0J6Q2paRVJFUkVnWWFJTkt1WXkyN0Q0bWx1Rld5SWlJaUk5elNQaG9qZlFjYVRRT2RXZkh3S1psNk50MVdTSWlJaW9rQkRSQnFDakcyQkoxb1paRFFPTnJiTDVBdnZxa1JGUkVRa2JPbzZKZUpma0xFN1psSyt6ald1cWdmd24ySXV1NVpLVlVSRVJNS21GZzBSLzRLTWZ3UHQ3VXZqZ1g5aTV0TjRHK2plNUNObkFHOEJHYUFmc0RTd2JKUC8xZ1BiWlBLRmoxWENJaUlpRXBaMktnSVI3NEtNTnBpeEdiY0RUMmJ5aGJuMjcvT2JmR1E0Y0ZrbVgxalF3bm83QWwxVndpSWlJaEltdFdpSStCTmtYQXpjRGR5WnlSZCtMUEdlMGNDSzluOW5BSU15K2NJb2xaNklpSWo0U0MwYUl0RUhHUjJCY2NCYUxiUk96R3YwNzdNVVpJaUlpSWdDRFJFcEs1TXZ6TWFNdjJqSk5QdmYxNEJyVlhJaUlpTGlNMldkRW9tUE9jQnM0UEJNdmxDdjRoQVJFUkVGR2lMaXdnemduRXkrVUZCUmlJaUlpQUlORVhGbE9IQ1Zpa0ZFUkVSRVJKd3A1ckx0VlFvaUlpSWlJaUlpSWlJaUlpSWlJaUlpSWlJaUlpSWlJaEtsWWk3YlFhVWdJaUlpRWg1bG5aSzB1TnFUZ0VjRHVrVkVSRVNCaGtnU0ZIUFpJNEVEUGRtY1M0cTU3T282S2lJaUlxSkFReVRlUWNZUVlKaEhtelFlZUt1WXkrNmdveU1pSWlJS05FVGlHV1QwQXY0RmRQUm9zOTRBZWdCUEYzUFpZM1dVUkVSRVJJR0dTTHlDakRyZ0g4QktubTNhZThCY2UrNWRWOHhsYnlqbXN1MGM3M3NuMVFBUkVSRlJvQ0VTakQ4QmUvcTJVWmw4WVJZd290RkxSMkZhTjNvNUNERGFGblBaVTRHY0RyK0lpSWdvMEpEVUt1YXlTeFJ6MmYyS3VXeG54K3ZkRkxqVTQxMS9zOG4vYjRjWnQ3RnFEZnU4S2pBY3VCeDRVYlZMUkVSRUZHaElhbVh5aFYrQW1jQ29ZaTU3ZFRHWEhlZ2d5RmdTTXk2am5jZTcva2FKMXdiYVlHT3JLdmUzcnBqTEhvTnBKZGtjK0Q2VEwzeWkyaVVpSWlJS05DVHR3Y2Jqd0JIQWNjRG54VnoyeFdJdSs1dld6RGRSekdYYkFQY0N5M3ErMjIrVWViMDM4Rnd4bC8xamhmdTdBdkE4Y0QzUTFiNzhIOVVxRVJFUlVhQWhzakRZK0IxUUQyd0QvQnY0dHBqTG5sL01aWmV2WWxWbkE5dkhZSDkvQUg0bzgrZjJ3TTNGWFBiS1lpN2J0cGtnNHpEZ0UyRGJKbjlTb0NFaUlpSmVxRk1SaUMrS3VleEJ3RCtidkZ3UFBBSGNCRHlYeVJmcXkzeDJXK0M1Wm9MbnlabDhvWmRIKy9vQXNHOExiM3NLMkQrVEwweHQ5TGtNY0N1d2E0bjN6d0Y2Wi9LRjZhcE5JaUlpRWpXMWFJZzNNdm5DM2NEUkplcm9Ic0RUd0pmRlhQWTBPdzZqOFUxN1AweVhxVGpWNXpjcmVNK3V3QnZGWExhLzNjK2h3UC9LQkJrQXd4VmtpSWlJaUMvVW9pSGVzUlBaWGRmTVcrWUFEMkphT2Q0Q1hnSzJhR0cxdnJWb2JBaThYZUhieDl2My9ycUY5NTJVeVJlR3FRYUppSWlJRDlTaUlkN0o1QXZYQTJjMDg1WU93SUhBcTVpeERsdkVjRGRIQUxNcWZHL2ZDb0lNTUYydFJFUkVSQlJvaURRVGJGd0svS1dDdHk0ZDAvMmJpNWtsM0pXdk0vbkNsNm81SWlJaW9rQkRwT1diOFF1QXl4SzhpMjg0WEpkYU0wUkVSRVNCaGtnVndjYnB3TlVPVnRXOW1NdmVYY3hsRDJvNm1EeENienBjbDlMYWlvaUlpRmMwR0Z5OFp5ZnZleE1ZNG1pVkM0QjNnV2N4MmF6ZXllUUw4eVBZcjc3QU9BZXJtb2xKYXp0THRVVkVSRVFVYUlpMGZDUGVEVGdjT0JsWVBzQ3YraGt6QjhmVHdET1pmR0Y4aVB2NEZiQnlqYXQ1SXBNdjdLNGFJeUlpSWo1cHB5SVFEd09NSllIak1YTnE5QW5oSzNzRFErMnlvSmpMamdRdXorUUw5d2U0ajIyQWc0QWVEbGIzdEdxTmlJaUlLTkFRS1gvejNSL1RlbkU0MERtaXpYZ09NeWJrdVlEMnNRNHpBZUZGd0JxT1ZxdnhHU0lpSXFKQVE2VEV6ZmRnNE0vQWZrRGJDRFpoRm5BM2NIVW1YL2cwd1AzY0JyZ1kyTWpoYW1jRGsxV0xSRVJFUklHR3lNSWI3eTJCMDRHZEl0cUVjY0QxUUQ2VEwvd1U0SDV1YUFPTWJRTllmVWZnVk9BczFTZ1JFUkh4aVFhRFMxUkJSamRnQjJEdFJrdi9rTDcrUTJBWWNHOG1YNWdUNEQ2dWdla2l0V2ZBK3pNZFdDV1RMeFJWczBSRVJFU0Joc2ppTitZOUdnVWRnKzEvMThMTmVJMEZtRW50cnM3a0N5OEZ2QjhyQXVjQkJ4UGVYRFhYWmZLRjQxV0xSRVJFUklHR1NHVTM3VzJCVlZpMDVXTUlrS2x3RlhPQVc0RnJNdmxDSWVCdHpRQm5Ba2NDN1VNdXFybkFxcGw4NFZ2VkdoRVJFVkdnSWRLNkcvcFZnQzhyZlBzMW1Yemh4SUMzcHhkbW5NUUpRTmNJaStiT1RMNXdxR3FJaUlpSUtOQVFhZjNOL2NmQW9BcmV1a1ltWC9nc29HM29iSU9MUHdPOVduajdaR0FpWm5MQWhtVTVZSE9IbTFRUHJCVms1aXdSRVJHUlNpbnJsTVRWb3hVRUdxOEVHR1FNQVk3RlpIMjZ4d1lPRSt4L2Yya1NVUHljeVJmbWwxakhMWTREalRiQWhjRGVxaDRpSWlJU05iVm9TQ3paRy8zM1duamJmcGw4NFY4ZTc4TW9nc20wdFVFbVgzaFB0VVJFUkVTaTFFWkZJREgxQWZCOU0zOGZoMm4xOERYSVdLWENJR011WmtCN05TNVc5UkFSRVJFRkdpS3RrTWtYRnJRUVNOeFc2UndaeFZ4MjZRaDJZZnNLM2pNQjJBNHpsdU1Nb05LTVV0c1hjOW10VkV0RVJFUkVnWVpJNjVRTE5CWUFOMWV4bnYyTHVleStuZ1VhbjJDNlFQMDNreS84bE1rWExnVldBdllBbnJINzJKeExWVDFFUkVSRWdZWkk2N3lDR1hqZDFGTlZ6aWZSRWJpcG1Nc3VHOFpHMjdsQnRtN21MVThBbTJieWhkR05YOHprQy9XWmZPSHhUTDZ3TTdBcWNHV1ovUWZZcUpqTDdxRXFJaUlpSWdvMFJLcGtNems5VWVKUE4xVzVxczdBRXNDZHhWdzJqQVFKNjFNK0hlNWx3SjZaZkdGcUMvditkU1pmT0FWWUZqaU0wZ1BqTHl6bXNqckhSVVJFUklHR1NDczgwdVQvdndXZXJuSWRQZXgvdDhYTWl4RzBVdDJtWmdNSFovS0YwelA1UW4wVndkYk1UTDV3UnlaZjJBRFlFTGpUcmd0TSt0OERWRVZFUkVSRWdZWkk5WjRGWmpYNi81dXJ1VkczT2piNjk2WEZYSGJOa0FPTmNjQldtWHpoN2xwV21za1gzclV6Zy9mRHpGVCtEWEJ1TVpmdG9Hb2lJaUlpQ2pSRXFydTVubW1ERFRDcFlHOXR4V3E2TmdrNjdpM21zaDJEMk41aUx0c1YyS1RSU3lNd2c3N2ZjbGdtUDJmeWhiOWh4bkVjQjZ5bW1pSWlJaUpoMDh6Z2tnU1BZTEl4UFp6SkY4YTM0dlBkbXZ6L1lNd00yNmNHc0sxYkFlM3R2eDhDRHNua0N6TUNDc0xxcWI0Ym1ZaUlpSWdUYXRHUUpIZ0NxS2Y2UWVBTlNyVmVuQnpRWEJUYjJmK2VCK3dUVkpBaElpSWlva0JEcEVhWmZPRm40TVpNdmpDOGxhdm9YdUsxT3VDdVlpN2J5L0htYmdvTXplUUw1OXBKQjBWRVJFUVVhSWg0ckpadVRsM0t2TDQ4OEhkWEcxak1aVHNCUjJYeWhRZDB1RVJFUkNUcDZsUUVrbmJGWEhZa3NIWXpiOWsva3kvY3I1SVNFUkVScVp4YU5FVEtUNTdYNEtaaUxydThpa2xFUkVSRWdZWklOVnBLWmRzVE0ydTR6aGNSRVJFUkJSb2lGZXRjd1h1MkJrNVNVWW1JaUlnbzBCQ3BWSThLMzNkeE1aY2RyT0lTRVJFUlVhQWgwcXhpTHR1ZXlwTWlkQUR1dHRtalJFUkVSRVNCaGtoWlhhdDgvMXJBeFFFSFAyc1VjOW56aXJsc1JvZEhSRVJFRkdpSXhGTzNWbnptcEdJdXU2M2o0R0tsWWk1N2VqR1gvUmo0SDdCMEpsOG82dkNJaUloSVhMVlRFVWpLZFd6bDUrNHM1ckpyWmZLRlgyb0lMdm9CdndVT0FEWnE5S2VmZ0ROMGFFUkVSRVNCaGtoOGRXL2w1NVlGYmdTR1ZobGM5QWIyQnZZSHRxSjBxK0xwdFFRd1ZXekxKc0F2bVh6aGMxVURFUkVSVWFBaDRsYVhHajY3WHpHWGZTS1RMOXpUd2cxOU4rRFhtSmFMSFlIMnpiejlMZUFmSVFRWnZZQjdnYjFVQlVSRVJFU0Job2g3SFdyOC9BM0ZYUGExVEw3d2JaTWIrWTdBenBnV2o5MnBiSzZPK2NDUm1YeGhRUWo3ZlN2UVg0ZGZSRVJFRkdpSUJLTlhqWi92QWR4VnpHVzN4cVRKM1JiWUR6UDJva2VWNjdvaGt5OThHUFFPRjNQWkk0SGYyUC90cUNvZ0lpSWlDalJFM0hOeG8vMHI0QmxnSFdDcFZxNWpQSEJPQ0VIR1dzRFZqVjdxckNvZ0lpSWlDalJFM0hOMW83MTlqWi8vVXlaZm1GeEJvTEF1c0M3d1lDWmZtRnBsa05FVnVCL1FoSU1pSWlJU09NMmpJV25YdzROdCtDOW1ZSGFMTXZuQ0NFd3J6SmhpTG51YnpSeFZxV3VBTlpxOFZxY3FJQ0lpSWdvMFJOeUxlb3pDZk9DWWFnYUFaL0tGRzRFL0E3OEgzaWptc3Y4cjVySi9LdWF5UzViN1RER1hIUW9jWHVKUFBWVUZSRVJFUklHR2lIdGRJLzcrcXpQNXdpZlZmc2dHRzBmYi8xMER1QklZVzh4bEh5em1zanNXYzlrMmpZS01sWUc4RHJXSWlJZ28wQkFKVDdjSXYzc3NjSDVyUDl3azJBQXpQOGR2TVFQVFJ4VnoyWE9MdWV5cW1IRVpQWFNvUlVSRVJJR0dTQWpzay81Vkk5eUVrNnNkMEYxQnNORmdCZUN2UUFGWXY1bFZkRlZORUJFUmtTQW82NVNrSmFqb0JLd0hiQTVzQW13SzlJMXdrMTdJNUF2M3UxaFJKbCs0c1pqTEF0elFpbyszViswUUVSR1JJQ2pqakNRMXNPaG5nNGxOYldBeHhLT2I2cm5BNEV5KzhMbmpmVDZxRmNIR1JPQjU0QVViL0h5cjJpTWlJaUl1cUVWRGtoQlV0QU1HTndvc05nVlc5SGlUcjNJZFpGaWpnQitBNWFyNFRCOWdxRjBvNXJKZk53bzhYczdrQ3orcmhvbUlpRWhycUVWRDRoaFk5QVkyeG5TRDJoallDT2dTazgzL0RsZzlreS9NY0ZRV2RjQnV3Rm0ySEZ5YUQxd01uSnZKRitwVjgwUkVSS1FhYXRFUTM0T0tPbUExWURNV2pxMVlMY2E3ZEpLTElNT21yOTBMT0J0WUo0QUE0MzdnOGt5KzhKRnFvWWlJaUxTR1dqVEV0OENpRzdDaERTb2Fnb3RlQ2RtOVp6UDV3azQxbGs4N1lCL2dIR0IxeDlzM0hiZ051REtUTDN5bjJpZ2lJaUsxVUl1R1JCMVlaSUJ0R2dVVmc0RzJDZHpWMmNBeE5aWlZXK0EwWUhlZ244TnRtd2hjQTl5UXlSY21xbGFLaUlpSUMyclJpTmV4Nm9PWllLNmJEUkxicy9nOENQWEFGUHZ2V2NBdndNK1lURWMrQmhwdE1ITlpySXRKUDl2dzM5NEpPMzRYWlBLRnZ6Z3V1MlV4czRLdmFaZUdmL2VzY0JXak1ET0szNTdKRjJicUZCTVJFUkVGR3NuVEMrZ1BETEJMZjh5RWEzMXRjTkhIM25qWGNyeW0yNkJqQW1aRzZ1L3Q4Z05tZ0hJQkdPTlJBTEtDRFRnYUJ4LzlZbnA4UndGcmhuVXozeWkxNzRQTnZPMTlZT05NdmpCUHA1K0lpSWdvMElpL0xzQWdZQzFNRjZHR3haZW45MU9CejRIUDdQSytYYnhJY1ZyTVpmczJDVHpXQlZhT3dYSC9iU1pmZUNpQzhucmZsbE1wUjJieWhieE9TUkVSRVFtS3htZ0Vhd0RteWZMbW1ERUlnendQN3JvREc5aWxzVkhBdThBN3dDdkFDRXhtb2xCbDhvWHh3RE4yYWJpWjdvbkp1alNrMFg4SDR0YzRqd1VSZmUrRFpRS05HY0I5T2oxRlJFUWtTR3JSY0h3dkRPd0U3QWhzQ1N5VDBQMmNBcndLREFkZXNvSEhBbDgycnBqTGRnYldiaEtBREFZNlJMUkpWMmJ5aFZNaUtJZVZnYTlLL09uT1RMNXdxRTVYRVJFUlVhRGhyN2FZbG9xZDdiSjJTc3ZoUitBcDRFbk1qTkxUZmR2QVlpN2JIamdBdUNPQ3IzOHpreTlzR3RGK2wrbys5YXRNdnZDcVRsOFJFUkZSb09HWE5qYTQyQS9ZRjFoS1JiS0kyY0R6d0QwMjhKam1VYkR4SWlhVmJ0am1BRDB5K2NMc0NQYjVkT0NTUmk4Vk12bkNRRlZURVJFUkNlT21XU3F6QVhBZEprdlRmekZ6SWlqSVdGeEhZRGZNR0lCeG1CbW1kL0FneU5ndG9pQURUSmV0OVNMNjdxYVpwMjVWRlJVUkVSRUZHdEhyWlFPS2taaUIwTWVTM0hFWFFlaUNhZm41UThSQlJqdmcwb2pMWXJNb3ZqU1RMM3dOZkdEL2R4NXdsNnFsaUlpSWhFRlpwMHJiQkRnUzJBZm9yT0tvMmJzUmYvL3ZNUlBaUlYybm90S1FmZXFKVEw0d1R0VlJSRVJFd3FBV2pVWEw0amZBNjhBYndDRUtNcHg1UDZvdkx1YXkzWUR6UENpRFRTUDg3b2J1VTdlcEtvcUlpSWdDamZCMHdYU1ArZ0w0ZDhRM2hFbTBBSGd2d3U4L0ZaTjJPR3FaWWk2N1VpUmZiTHBQUFU2aitVZEVSRVJFZ3BibXJsT2RnUnh3QnRCWFZTRXdCY3k4RzZFcjVyTDlnRk04S291TmdXOGkrdTdETS9uQ2ZGVkhFUkVSQ1VzYVd6UTZBRWZiRzc2ckZXUUU3djBJdi90OFRJdVZMemFQNm9zeitjSUVWVVVSRVJGUm9CSGN2aDZHbVNuNTcvalJuU1lOSWhrSVhzeGwxN0xIdXhiZkEwY0IxenZhckkxVkhVUkVSRVNCUnJKc2prbFBlenV3dkE1NzhnTU40UElhNm5jUk9BbkladktGbXpMNXduR1lXY1ZybmZGOGJUczRYVVJFUkNUeGtqNHorQXJBWmNCUUhlcEkxQU05SE55Z1Z4Y2w1TExiWVdZbnI5WkU0Ry9BZFpsOFlYcUo5YTZPU1Jpd1JnMmJ0MjBtWDNoSlZVTkVSRVNTTHFrdEd1MkJNekdacEJSa1JPZlRDSUtNTnNDVlZYNXNNaVlGN3NxWmZPSFNVa0VHUUNaZitBellDRFByZVdzcHE1bUlpSWlrUWhLelRxMlBtUzlnc0E1djVLTG9OblZJRmNkK09tYjh4UldaZkdGaUpSL0k1QXZUZ0FPS3VlenJtR1FDN1JWb2lJaUlpQ3d1U1YybnVnQVhBaWVnK1VGOGNTeG00SDBvaXJsc1orQkxZTmtXM2pvTHlBT1haZktGSDJ2NHZnMHhYYW1xR2ZjekNlaWR5UmNXcUhxSWlJaElraVhsaG54VDRCUE1BRjRGR2Y0SXUwWGo1QmFDakxrMndCaVl5UmRPckNYSUFNamtDKzhBNndMUFZ2R3hYc0JxcWhvaUlpS2lRTU52N1RCOTYxOEZCdWh3ZW1VZThHRllYMWJNWmZzQ3A1WDU4M3pnVG1DTlRMNXdaQ1pmK003Vjk5b3VWN3NBNTJJR3YxZGlNMVVQRVJFUlNibzRqOUZZQ2JnYjJFU0gwVXNmQTdORC9MNXpnZTVOWGxzQS9BczRQNU12ZkJyVUYyZnloWHJndkdJdSt5WndMOUNuaFk5c0F0eXFLaUlpSWlKSkZ0Y1dqYUhBU0FVWlhuc25yQzhxNXJJRGdTT2F2UHdZTUNTVEx3d05Nc2hvRW5BOGgrbEs5WFlMYjlXQWNCRVJFVkdnNFpsMm1Fdy85N0g0MDJ2eHkvc2hmdGZsUUZ2NzcyZUJUVEw1d3A2WmZHRkUyRHVkeVJlK0IzNEZYTmZNMjFZcjVySzlWVVZFUkVRa3llS1VkU29EUEdCdjR0THVLeHRzTlIwVE1CdVk2Y0gyelFNZUFuNE0rb3VLdWV5V3dIRGdGZURjVEw0dzNKZURWTXhsOThPa1d1NWE0cys3WnZLRi82Z3FpNGlJaUFLTmFHMkNTU1BhVDRmcy83MExIQSs4bGRZQ0tPYXlkWmlXZ3ljeitjSXpubTVqdWRuRUw4N2tDMmVwR291SWlFaFN4YUhyMUw3QXl3b3lGck1COENZbW05SXlLUzZINDN3Tk1xRFoyY1ExdmtoRVJFUVN6ZmNXalQ4RGwrb3d0V2dxWnJMQ1ljQWNGWWVmaXJuc01TeWNUWHc2MEN1VEw4eFR5WWlJaUVnUytkcWkwUll6c1pxQ2pNcDBCeTdEVEZxNGk0ckRUNWw4NGUvQTVzRDNtSEViZzFVcUlpSWlva0FqUEYyQXAxZzhYYW0wYkZWYmR2K3gveGIvZ28zR3M0bXIrNVNJaUlna2xtOWRwM29DandCYjY5RFViQzZtbTg2Rm1LNVY0cEZpTHRzR1dDK1RMN3luMHFoWkIyQTFZQUN3QXJBYzBCdFl3bDVUMmpkNS96eGdNakFKK0JtVEhXME04QTFRc0g4VFA2MWdqL05LOWpqM3hVeVEyY1VlNjdvbXgza1M4QXN3SHRPU09BcjREUGhPUlNrT0xZVkorREd3VWQzc0J5d0o5QUo2QUIyQlRvMCtNOFArVGpmVTBaL3NkZWdINEd2Z1UrQnpZSXFLVnhSb3VORUw4NVIzUXgwV3QvZTB3T25BWFppWnNrWGlmczFhRzlNRmJWTmdmV0JsM0xiTy9naU13R1IyZXcxNHc5NFVTTGk2MmVPOGpUM082OWpnMFlYSm1FbEYzd0NleDB5eXFmRlNpeHRrYjVacjlSNHdMU0ZsMGhaWUQ5Z1drK2hqUTRKTlZsTm9kQzE2QVpQZTNrZURNUTk0WFByYzNzTWtXUWJ6b015MWp6QVAwbHhwWjYvSmM2cjlQZlFsMEZnS2VNbGUxQ1FZYndQSDJRdVdTSngwQkhZQWZndnNoSG1LSGFiWjlrZitVVXlMNjVnRWxlM1dtSmFBV3IwR1RIQ3ducjdBM3NBK21EbVQyb1ZVRHIvWVkzdXYvUzNTUXhualVXQVBCK3RaRnhnWjg2QjNGMXMzZDNKMHpyVFd0OERqd0lQQTZ5dytuMVpVOXJUbmtFdHZBRnQ0dEkrdXRiSFhUdGZkcUwvQVBKaVpWY002ZW1PeXZ1NEVETUcwMGpXWWhtbHgreTltempUdnAxbFlDdmpZWHRpMUJMdlVZeWFRVzFxL254SURRNENiTVUrZmZUcUhuZ09HWXJwc3hkMUlSK1d5VlkzYnNSVm1RdFk1SGh6akwrMURtYzQ2QlhuVVVabXVFOVA5M3hLVFFuNjZwNy9wM3dNWFlMb1QrdUNlQVBieHVBU2ZYMGNGVUY3emdZMXIyS1lsTUJsTVoxYnhuZS9iZ01STFBURmRGQlFFaEx0TUJrNW04YjdySWxHcnd6eEJmVE1HNTlFUHdHbjJhYWNDamRiWnlUNE44L0g0amdPT0pieFdGUVVhZnVnQUhJcnBlaEtuaDRnUFlicVRScWtQcHF1VHkzMmJCcXlZd0hPclgwQVAwYTZvWVp0MnhveG5hN3JPZWZZQnpQdVk3S2JUeW56M2ZaZ3NxTjdvaXVuT294di82SmJQZ1IxMWJ5dWUySlY0dG03K0JKd1EwOEE5cWtCakRSWjJVZko5K1F3elZrU0JScklEalhZMndCZ1Y4OS8xWnpFVCtrWjVIUTlpbjVMbW9ZRHU2VHExY251T3diU0dORjdmNDhCdW1HUWJqYld4ZFd4WWlhRGpRMHhQcGNoMWlkR1BUQnFXeHpBRGFrV2lNQkF6eURIdTU5R25tSzRXQ2pUS2F3OWNoTW0yRTdkdXAxZVJqTzV5Q2pRV3Q3VjlVcHVrMy9WN2dHVWlLczg3QXRpZjN5WG92Tm9kdjdwTUhWYml0MnlqQ2orYktYR2QrSkNJV3piYVlnWU02UWJmcjJVMmNBbng3Z1lpOGRJTytJdXRlMGs2bDY2dDRhbFNrZ09OVlRIWmgrSjhiTjhsMkF4RENqVEMxUWU0TzhHLzYxTXgzZi9DVHZ6VEM1TTB3K1crVENRWjQwdTdZOUpyKzlKbGFyMG12OEhQTkxvUEhHRFAzY2JMUUV5UHBNYnFNRk1wTk42ZXU2TXM1R3QwVSsvMU1nWTRBUC9tV0pGa1dSbC8rK2E3V0Q0QlZsR2c4ZisyeFdSMlNzS3hIWXRKNWFsQUk5NkJ4dTY0SDAvZzYvSXlaZzZhTUFYUmhlcGZDVGluZ3JnSGJtMlhxVGJBQjQzVzh4YUxkcE1xZC83UHgyU2NhdHJxY1YyVDkwVXlRUHc0M2NqSFpubmRScm9pcnUyR21hUXE2ZWZRTDhEMkNqUTRrUGgxbGFva29jWkdLVGhYa3hob3RBZitsc0xmOUo4eGczM0RkR3NBKzdGbmpNK25EVmg4SEVTVVhhYUdObHJQZEJZZmROOXcvdGNEbysxRGxubU5Qak1EV0xQSnVkWDROK1h0S0o0ZXpFYzM4SEhybDN3ejRjOWJJTWwxaHExWGFUbUg1Z0Q3cHpqUU9DckIxLzNKbU1rakZXakVKOURvWTUvRXB2bDMvV3pDNjdIUUEvZmRoTVppdW1iRlRUdUgxMXRYV2FiZWFMU2VjNXM1L3ljMUNTWWFkNU82dXNsbnRtcXlmYUU5c0I1c0l4L2R2TWYzeWV3SnBEdk5vOVNtTFhCOVNzK2YrZmFwZnRvQ2pmMVRjR3pIa2N6VW0wa01OTEtZV2JYMW13NTNFVjVpZ3gwQzJQNWJZM2d1blJaQU9kU1NaV3E1UnV1WlMrbE1VYVVDRFRCalpSbysrM0NKenpXZXR1TENNQXAzQ2VCcm5kaUpXUDRIYkpmQ20rVHRnYWVwZlZLeU5BY1o5NlQ4M0prUDdKZWlRT05YK0RINVhoakxDQlpQLzZoQXc2OUFZeTFNR21yOWppOWNuZ2l4M3Q0U3dQWnZFNlB6YUtVQUhyYlhPakhmZ1N3NmhvY3FBbzFCalQ1N2ZZblBuZEhvNzY4RVhiaHRnS2QwUWlkdWVRUi9aaUlOU252Z0lFeWF0b2I5TGhKZHVzQzRhcU1nWTVITWJyN054eEJFb0xFY01DRmx4L1ptQlJyZUJocnJrNXhFQks2WGwwSUtObnBnK3ZpNzNQYXZZeFRnUHh2QXNidWl4bTI2cU5HNkxxc2kwT2h1SDd3MmZIYUhFcC9ic3RIZnh3ZGR1T2ZxUkU3c01oTzRJSUZQOHJwalprMHYxNi8wVlRTamVqV0c2VnhaWkpsQStObGZ3Z3cwMmdHdnBmVFk3cWxBdzd0QVl3MjFaTFM0L0lkd3VsRnRIY0MyWHhtRGMrakFBUGE3bGk1VERXNXZ0TDdqV2pqLzU5cC9QOGVpaVZ5dUwvTzVGUnR2YjVCOTduZkc1TWlYWk9xRUdWUjJLSEFxOElDdFZIRzFMR1ljeWhGQXoyYmV0emx3T1hDU3FrQ0xUclpsR29XeFFNRmVGQ2RqWmk4Rmt4KzhHMll1aEFHWXlZYkMxQWQ0RU5nQzA3VW9hVTRGTmd0bzNRdUE3ekV6TjQvSHpCRXdGVE93dGFkOTZMRXNKcTF3RkFrc2JnU0dzM2czQTRuR2N2YkdhTWtJdm5zeXBqWDhTK0JiRyt6ODNPU2M3d2oweHZSMzcyL3I3V0RDbitoc1orQk9URnI3SUgvRFh3WnVBSTUydU00VGdmc3g4OXY0cURlTEQ1YXVWYjI5NzVwVjQzcmFOUHIzdkJiZTJ3N1l3LzU3UG5BZmNDL3daSm4zVHcyamNKZTJQd1I2V3BDZTViL0VNd1BMV3ZZaVcyMS84bDMxTzk3aWoxZFkyWVptQXk4Q1oyTDZyRmJ6UTkwTk13Ym5yNFE3cjhjbG5oeW5rYmhyMGNqYUh6OVhaVFFMMCtYZ0pHQVRvSE9WUC9CN1lwNTQvaERpY2IwMlllZnhvOFN6UmFNTGk4NFBFTWJFZVA4Ry9vQ1ptTEsxNm9EVk1ObmFIc1AwSEFockh5NEs0Ymgwc3c4S1hNOVo1R3N2Zzl2eHI4dFVneHNhcmZPdkxaei9rMW40TUhtQkRYU2FrMlhSRkxqTzFhRnhHV2tlOEJxWDNQTGJZV2JBYk8yK2ppY1pzNVFHWVNYQzZSUDlJYWJKZHduSDIzNU9DQTlLYWgzSTUyT2c4WnlqZGIwREhJYnAxKzFDRzh5RWdjK0VVQ2ZuQWFzcjBJZzgwTGcvcE4rODRaanNhcDBEMm85dTlxYnV6WkQyNTRBUWpzM1d1RTl4L2xjUHo1MnQ4TFBMVklOVFdYVGNiWFBuL3lSTTYvOGsrLzlUYUg2Yzd1Nk4xdjFSRUlWN3JHNjRVN3U4aXQ4emlyZkQ5SmNjNFdoL24wSXpxRGZWUG9TV2dUY0lQZ05ZWitCNFRIZUhJR2NQanpwbHRLdEE0eElINjNnTms2MHFTQnNEN3dWY1ArOVhvQkZwb0JIR1BjaGpoRCtoN2FiQTh3SHYxelFXbllBdEtNTnczNnE5cGtmblRTZmdDODhmVG0zSG9uTUNkV3doMEFBNGtrVXpWWlc3LzJrOCs3bnpSQmxyNHJicFhFdDhscm1ZbEdjKzZrYnpBN3hyV1k1VmJMR0lDd09zWXovWkoyNWhCbmQ5TVRubmc5cW5QeVVrMEtpbGkwZVJjRlAvdGdQT0lyaXVmZldZN2k4S05NSVBOQWJabTg0Z0h3NXNHZkV4MlFrejlpUElOUGFkQXQ2SExnSHN3MXNzT3U0Z1N1Y0hjRnl1Y0x5Tm5URmQvaHJXZjBnRmdVWWJGcDNrNzRneVFkWTRBdXBtM2c1NFh6ZmNxVjJ1d0QvOWdFdFpORXVDNjJVNnlVLzFXNmwxTVYxSGdpam5weWs5b1ZCWURpV1kvdEtUY052MUs2cEFvNVpjL24waTJ2ZmQ3QlBjSVBicjFvU2MwM0VLTk5vSFdKL25ZOFl3K0RJV29IT1RwOGF1bDZ0RDJJY3RjTitGNmtRUGpzMGF1SjlEeUdXWHFjWWFqeUg1c2tTclJ0TkFveUdZbjh2Q0xsUk5zeWllMEdpZDMrRzQxZjRVM1d5bmR2a2U2T3JaRDJRbndwc3c3QVhVaGFvdHdRMit2TmlUOGgxQ01La3lMMDlwb0hHaEI4ZDFJL3V3d1BXK3pRQjZLZEFJTmRBNG0rQmFVbjJkcUhZUFRMZVhJRnJsdGdoaCs0YzUzdTVwRVQvNHF3TmVEeURJRFdvODN4b3Mycko3WlFXQkJ2WTN1ZkZEd0FZck4ya2xPY0xseHE2TSsxa1B0Y1JuMmR2VGkzQ1laWEI0eWdPTkl3TjZpbmlrWi9zNU1JQmdZenJScE9DTU10QTR5cU5qdW1OQUR5V09VYUFSV3FBeGdHQmFITCswOXpjK1c5TSs3QXVpQzFYUUxUaWQ3Tk42bDl2OVhJUVBNSUw0SFF5NnQ4ajFUYjZ2OFcvdVVNeDhlS2MzK1V4bnpQUVY1OXFsSDZiSHdXZU4xdk0yRHJ1eTFka251cnJoVHVmeWxNY1g0TWtobHNNazBqdHJlQytDbVFuYTErQnRTQUEzTmVlbEtOQTQyc05qZW1vQSsvbXFBbzNRQW8xSEFqaCtIeE50ZDgxcUxBZDhGVUFabkJyQ3RtK00rL0ZTaDBWd0RKYkJmVGZ0b0xwTU5kWVYrTFRKOTU1VFpaQ3dKbWJlcW9iUFQ4Unh5OUtodXRsTzllemdLM2w4OFIwYmNubmNrOUpBNDd3QXl2TFBudS96QVk3M2R3S2xzMzRrTGRDNHhOUGpXWWU3OUx5TnU1L0UvZUZESEFLTnpRS29wNFVZQlJtTmd3M1hMUnVUQ0djTTFSV090L3NYd3ArTTlWL0VwOHRVVS8xWmZMNmh0ekNwaUp1ekZHYnNVdU1rVUpOeFBNMUJEeFlkWGE0bFhjdlpubDk0djRxZ1RMWWdYWmJFL1lEYU8yT3k3N2M1M3UrREV4NW9QSTNmWTVsV3duM0dvaU5qZm43SElkQjR4ZkV4RytmNUE3U1duaXk3ZnFwK1ZRamJIVVFYcW9kQ0xQZmRpRitYcWFaV3hMVGlOZDJPVHpGak53N0JUSUs2RDZZcjFWTWxycGZmWXBMQ09IVzViclpUdTN3UjBSTlluNS9XTmt3aTE0NzArQXZ1bTRxN3hXVGZlMkZTczhhNXEwMVk1OGdZb3NzdVZZM0xBZ2l1RkdnRUYyaHM2Zmg0elNYNjlMVXVibnBkWm5PYWlVbnpIYlFOY1orMU1JenhvOTF3bnpvL2pDNVRwWFMyZ1dWcmpzTnRCSkJCY1JYQ3krcWp4YjlsdXhoY2NGK0pxR3lTTUFpMDBvdVN5NEhSOHpIakgrTGtFTWQxcDM5Q0E0MWRZM0k4ZStNMkM5VlVURVkyQlJyQmVOcHhQVDBySWRkbTExMlJMZzFwdXk5eXZOMUZncy8rZGpYeDdUSlZ6a3JBdFJYOHZrL0ZwTWhkdy9jTGtKYjRMZmZGNUdMN2RFVGxNd0hUclREcERuVmNic05pV0FadFdId2dYUzNMbVFrTU5QNGRzMk42bytQOVh5L0c1N2pQZ2NacWpvL1QyeVNuTmJvVEptdVV5ekVQWWFTdzc0aVpGTkhsY2IwOXdPMWRIL2NEMlgyYWs2eXQzY2ZEZ2IvYTMraUxNQk1WYndGMENQTEx0OWJOZG1xWEtjUm5nT08vSXl5bkMxSVFhTHpoT0Rqckh0TnlPTWhoT2J5ZnNFQmpKdUczMHRScXNPTXlPRUdCUmlDQnhyVU9qOUVza2pPYmUrT2JZSmRka1k2TTZYWXZBTFlQWUR2YjRYN3VxS2k2VEhucExkMXdwM1k1UGtiMTlJNEl5MmtheVU1MzYvcHA0cWt4TG91TzlvbWZxN0pZTGtHQnhyQ1lIdFBQU0Y4TGNKd0NqWTY0SGZSOGNVS3YwemM0TEtNUklXNzNCWTZ2UTZOdzN5TGplcEpxSDdwTWVXTW4zV3luZGhsQnZQb2JYeHR4ZWQyUTRPdkErUTdMYVNKbXZFZWNYZSt3UEk0SWNidURERFRtQU12SDlIaTZUSEl3VW9HRzgwQmpINGZINXllUzI5VjFhUmFkcWJuV1pYQkkyOTArZ0d1VHk0Y2UvWEUvU2ZVVkNHQlNFNzZ2Rys1VUx2VTR6bzNjNk1uVVJiU2NyN2sxTG9tNHpPWUFLeVQwV3ZDRnczSzZKQUhsOFN1SDVmRkFRZ0tOZkl5UHA4dTVHV2JoY0laY0JSb0FQT3p3K0J5YjhQdTJzMk42TTd3T0pndVlqeTBHejZBdVU0SFpVemZjcVYyQ3VHbFluNFVEdjhZQnl6cGUvemtlbE50TkNid09aQjBIc01zbm9FemFZY1l2dVhyQ0d0WjhFMEVHR212RitIaDJjUHpFTXE3ek12Z1lhSFRHalAxeHNWM2pVM0NEMXhOM3JScGZoN3p0NXpxK0puMUM3V241OTBkZHBnSTFRamZjcVZ6R1k5SSt1dExRaXRGMHdOY2J1TTFpY0tJSFpUZVQ1STNWY05rMzlhVUVsY3NqRHN0bFlNd0RqYmNUY0R4ZmRWZ2VPeXZRY0dZUGg4ZmwzSlRjdTduc1JqdzR4TzF1SDhCOVp5M0hmQW5jVDFLZCtDNVQxVFRuYmsrd3MzdUt2MDREZm5hMHJvMHhtUnJPWlBIeEhwc0FmM080M1ZNOEtMdE93SjhUVmg5Y3pxRnlYNExLNVIySDY5b281bVZ4Y3dLTzUwY08xN1VjNHNwT2p0WXpCNVBLT0EydXNUZTFMb1E1Sjg1YzRHQjdyRnc1Q3hqVXlzOWVnZHZKQzcvQTlMd1E2MW4wWkQrTnk2dTQ2Y2JSeVo2a2xlU2NQc0JSblIzcVNSbE93MjJMVUpUYTJmMXgxVzJxYjRLdWtUczdyRE4vRDJtYlJ3WlEzK2NTL0NSWllUamVZWm1jR2RNeWVCVC9XalMrZExSTkQ2WHNIdTVGUitYMllnVGJmcGJqYTlRN1ZKL1l4dlVzOU9veTFjUmF1dUZPNVRLM2hzaS9zWTB4ZzUwcS9kN3BqcjczMXg2VjVXa0p1UlpzNkxCTVBrallkWEpaeHdGK1hBT05GeEp5UEhkd1dDYlhLZER3N2h6YkwyWDNjVWM2S3JkWmhEK3VwUjN3bnVQcjFKK3ErUDZPVmQ3RHFNdFVJNVYyblRwWnNWWXFEY01Nbm1xdHp2WmtlcDNxK3B4M3dXUVZxVFhsNEZTUHl2SllrakhyN0FZTzEvVnN3czZYTVRZNGQvVndKNjRlVGNqeC9OSGh1dm9pTG16aWFEM1RnY2RUVm5ZUFlzWkYxcW9qc0c3STJ6NFBPQlMzWGFndXBQSWtEV2ZpZHR4Y3FycE1WUkpvWkhEWGxVWGk0d2RxR3pTMUJhYVA4eW0wTHJYanFwZ0o5MnJwdHVWVG9MRThzSmNDalVXOG1jRHpacXlqOWZRa3Z0bTRua3pJc1J6dmNGMTk5SlBpeElhTzF2TXNKbEZIbWt6RVhVdnBKaEZzL3llWVZMMnVkQVp1cWVBZVkzWGdkSWZmVzIrRHBsa0tOQlk2RkRQeVg5TGxCTXhUbjJwMXdiU0V2QUtzVXVNMjdFVnRNMFpQOTZ4TWowOUF2WENaY2VUdEJKNDNZeDJ1YStVWTd2OFlZSFJDanVWUER0ZlZEbkZoaUtQMXZKelM4bnZKcytOUXJhc2MvMjVzQS95K21iL1hZUkpiZEhDOEQyL3BWRjYwa0w5Q1l4WFN0anpWeXZxeUJlNEc2alVlTU5YYXlmeFc4TEJzVjQvNWd3bFhjd3Y4a05CcjVuTU82OHJoSVd6dlNNZjErNzZFSGM4NXBEdmQ3NlA0TlVhajZHaDdCcEZPbXpzcXY0OGkzSWZWTUswQnJxNVprNEIrWmI3ckNNZlh4MVJPek5kU2k4YldNWDJxSnEwM0N6aXV5czkwdzZUUGM5R0tVYXFPM2svckp2T2I0bUg1SGg3anVyRUNwcm5aaGM4U2V2N01jTGl1T0U3eTlvcU9aMGtka1ZyMUFaWjJzSjZKd1A5U1dvYnY0S2JMem1wRTE5UGxjOXlPYitnSjNGRGk5UXh3dWNQdlNWMlhxUVl0TmVmK1FkZTIxTGtJK0thSzkyOE4zQTcwRDNDYittSUdzbTFGZFlQQnBucFl2Z2NEWitCdTBIQ1lYQjdqc1FIWEdWK3ZxZFZZTm9iN1AwS1gwSkk2cUFocXRvckRPcm9ncFdVNEIvZ1VXSy9HOWJUSFBIajZPcUw5dUFvemNlTm1qdGEzQjdDUHZjOW9NTXdHSVM2M1dWMm1tdWdOekViZGlOSzBmRUhsVDk2NllYTDloN2w5MTdhaUh2dFloK002S1B4UW5TT2hMcytGY0V4SE90emVlbnRkU0pKSmpzcG1kRXozLzFIODZUcTF2Nk50R1pieWU3czdISlhqOWhIdng2cTQ2OHE3QU5NdHJ5RnB3eTZveTVRenpYV2Qya3RQWVZMbkdIdGozcEt0Z1krQm8wUGV2dU9vUGdQYWRBL0wrYUNZMW85K09rVkN0VXpNdG5jVVpqSkhrU0QwZDdTZWoxTmVqcTY2alEySWVEKyt4TzFFbUVzRFZ3SmRjVHRqZkdxN1RGVVNhT3l2NjFxcTNFL0xFMjMxd0dSZ2VJbm91cjNjQXF4WnhmdDlIS2V4Qy9GODhwdlJhUktxdU0wbS83RU9tY1RnK3ZORnlzdnhNOCtPUnkydUJWNXp1TDdmQVU5Z3VvVzVrdm91VStVQ2piNjBQdE9QeE05VVdwNGxjd2RNSHVzL1JyeXREWlA1ZGEvdy9UNCtZZTBFN0JuRGVxSkp4OElWdDdrWFJ1dVFTWUNXZHJTZXNTa3ZSMWNUVWZyUTRsb1BISWJibmdzdTczMVROVEZmdFlIRzNyUnVraldKcDdPYnVmajB3TFFpUElzL0U0aGxxWHd5dittZWx2bCtNYXduUFhTcWhLb2o4WnJENkRzZE1nblFVZ28wdk5yL3BUelpuNitBUDN0WXpxbnZNdFZTb0xHUHJtbXBNUkl6cUx1VUhUR3RHRDVtSDlzYk9MbUM5ODN3dE54M3dHMUdpekIwMCtrU3VxNEtORVFBTnc4Nkp1bkdqL0gySnRpSDQrSEtEY0J3ejhwWldhYWFDVFNXd0tRUmxlUmJBQnlKbVJTdnNWNllGb05uOEtjVm81UkxLNmlya3ozZDlnNUVuN1Vqemo4c2FWRVhvMjM5WG9kTEF0VGR3VG9tcVJpWmo1dlU3OTA5MnFjRm1CbStmZW5Cb0M1VExRUWFPNkJ1VTJseEM0dlBXTHNySml2RjcyS3cvVzB4ZzlpYnk0YmtjeGFjWFZVRnBRVnhhdldhb01NbEFYS1JIblN5aXRGWk9YVDJiSjlHQWFkNnNCM3FNbFZCb0xHVGlpVVZmc0pNSE5lZ0Y2WVY0MG5pbGNaMGFjd2tPK1g2c3Mvd2VOdDNKbDVQckRXN3NUVG5GeFdCaEh5L1VxMEZLa1puNWREV3cvMjZDWGcrNG0xUWw2a1dUdHc2VEw5OFNiN1RnSi90di9jZ1BxMFlwV3dLL0szTTM2Wjd2TjFMQStzcTBKQm1kSS9SdGlyUWtDQzU2THFwRmcxMzVlRGp0V2tCWmt6cDFJaStYMTJtS2dnMDFpWitrMFJKOVY0RDdzU2t6N3dITS90cjNDZGpPeDRZR3NNZmxsMWlWTVpUZE9xRXJtMU10bk15ZWxvc0VoZEpQbGUvbzdKRU1hNnB5MVNGZ2NZT0twTEVtd2NjeGNKV2pBTVN0Ryszc3Zoa2Z0TTkzK1l0VlNVbEFmU2tXSUkyMDhFNnVxb1lBVGNaQkdkNnZIKzNBcytGL0ozcU1sVmhvTEc1aWlUeC9va1ptL0VJN2laQThrVlhGcC9Nei9kQVl4T2dYVXpLZDc1T0h5bERyUmtTdE5rTzF0RmV4UWlPZm5ObWU3eC9EVm1vd25vQW9pNVRGUVlhZFppKzdwSnMrNUdzVm95bW1rN21OOFB6N2UwS3JCK1RzcDJxMDBkRUlqTFB3VHE2cXhnQk55MGE4enpmeHpIQWlTRjhqN3BNVlJIVkRzVDAyWmRrNjVLQ2ZXeVl6Tzl2eENOditoYkVvOG5WWlZuZWdrbElJTWtJN2licFVFa016b1hPS2tabmdVWWN4dXpkZ1ptQU9zaXhrT295VlVXZ3NabUtReExrVXVBOS9PODZCZkZwU1hSNTA5dGZONmNpVWdVWDNXRDZZbnB5MUtlNEhIdmpKb05nWEpLREhJRVpqeHJFbkVUcU1sV0JOZ28wSktFYUp2UHJGWU50SFJLVE1oM3ZjRjBEVlVWRnBBb1RIZjB1TEozeWNzdzRXczlQTWRuZk1jQ3hBYXhYWGFaYUVXZ01VWEZJd2l3TlhCMkQ3VndlV0NwbGdjWUt1R20rRjVGMGNIWDlXVGJsNWVncWxmMVBNZHJudTRISEhLOVRYYWFxRERUYUEydW9PQ1NCNHZLakVvZEEvMGZINjF0ZjFWTkVLbFIwdEo3bFVsNk9LM242ZXhDMEkzSFhsZnByMUdXcTZrQmpOZUtUWWxNa2llSVFhSHpyZUgwYjZiQ0xTTWpYbjdWU1hvNkRISzNudXhnR3FoTWNyZXNUMUdXcTZrQmpzSXBDSkZKeCtQSDd4dkg2TnRGaEY1RUtqWEswbnJVVmFIajVleUFLTkVRa1FIRVlIRDBHbU9Od2ZWdWhsbFFSQ2ZmR051MHRHb005T3g2U2trQmpUUldGU0tTeUxKeGswRmYxd0djTzE5Y1QyRmlIWGtRcThEMXVVcXF1UWpDcFR1TmdOZHpNbC9ZdDhVZ2RMeDRGR2l1cktFUWkxUVdUZmNwM0h6bGUzODQ2OUNKU29VOGMzZmRzbmRMeTI4clQzd0ZKUWFBeFFFVWhFcmxzRExieFk4ZnIyMWVIWFVRcTlLR2o5V3l2UU1PTDR5QXBDVFF5dUprbFVrUnFFNGVXeFRjZHIyOFYxSDFLUkNyamF0NkNOQVlhN1lFZFBQMGRrSVFIR3YxVkRDSmVpTU9jSCs4RDh4eXY4MkFkZWhHcHdOdU8xck1xNlJ1YnVoMndoR2ZIUVZJU2FLeWtZaEJSb0ZHaG1jQjdqdGQ1Q09rZG5Da2lsZnNDZHhQM0haS3lzanZBMFhvK0JpYXFLa28xZ2NaeUtnWVJMOFRsWEh6ZThmcTZBWC9VNFJlUkNyem9hRDBIc1hDY2F0SjFBL1p3dEs0WFZBV2wya0NqajRwQnhBc3JwRFRRQURnZTZLQXFJQ0l0ZU5iUmV2b0JPNmFrekE0RHVudFcvcUpBUTBSQ0ZwZHo4UTNnSjhmclhCNDRWbFZBeEN2dFBkeW1wNEQ1anRaMVVrcnU4MDV3dEs0cHdNczZMYVRhQ3JpVWlrSEVDMHZFWkR2bkEwOEVzTjZ6Z0Y2cUJpTGU2T3JoTnYwTXZPSm9YZHNEUXhKK0RQZkNYVWJEcDRBNU9pMmsya0JqU1JXRGlCZmFZZnJTeHNHL0FsaG5iK0I4VlFNUmIvaDZmM0NmdzNWZG5QRGZGSmY3ZDQ5T0NXbE5vS0d1VXlMKzZCV1Q3WHdlR0JQQWVvOEZ0bEExRVBHQ3J6MGVIZ1JtT1ZyWERpUjNyTWFSdUpzSWRqd2FueUd0RERRNnFSaEV2QkdYN2xQMXdCMEJyTGNPdUkzNHRPeUlKRlUzb0srbjJ6WVplTWpoK3E0aGVSTVg5d0grNm5COWQrSitEaVZKU2FEUlM4VWc0bzA0QmY1NTNBM0tiR3hWRzJ5SVNIUUdlcjU5MXp2ZTEzTVNkdnh1eEYzWHR3WEFEVG9scExXQmhvajRvMnVNdHZWN1RCZUdJT3dML0VuVlFTUXlHM2krZlc4Qjd6dGMzK25BcGdrNWRrT0JmUnl1NzFGZ3RFNEphVzJnMFZuRklDS3RkSG1BNjc0QytFM0N5MjlwVlNIeDFPWU8xelVyb0cyODBPRzYybUlHbWNjOUUrZEt1Rzk5dUZTbmc5UVNhR2lTTEJGL3hLMmY4QWpnc1FDdlQvY0J1eWYwV0o4RjdLOHFMeDVxQyt3U2cwRGpjZUF6aCt0YkFkTktHOWY3b202WTFnZVhZLzJlQmQ3UktTRzEvSkNMaUQvaTJNTDRGOHpnOENDMEIvNE43Sm1nWTl3RHVBdTNUMk5GWE5yVzhjM3FsSUMyc3g3VDVjbWxMZTM1MlRabXg2eUR2VmF1NVhDZEM0QXpkVHFJQWcwUmlkSkh3QzBCcnI4OUpzUE1VUWtvcTcyQlQ0Q0RWVzNFWThjNlhOZE16Q1I3UVhrY2VOM3hPdmZESktTSVM3RFJFR1M0VHRON0gvQ0JUZ2RSb0NHU0hOTml1dDFuQjN3ejBRYlQ3L2cyNHBtU2UwZmdOUnN3TGE5cUxoNWJCOWpONGZxK0MyR2JqOE45cStydjdJMjI3OTJvdXRqcnlxOEQrQzA2VGFlREtOQVFTWmE0NWltZkFCd2Z3dmY4SHZPRWJkMFlsRWtYNEhETU9KWm5nTTFVdmNWemRaZzVKZW9jcm5OVUNOczlBdmg3QU92ZEIzZ0pmNU0yTEF1ODdEZ3diUEJYZ3BtVVZWSVlhRXhSTVlpSUEvY0FUNFh3UGFzRDd3Slg0dDg4UUhYQXJ6QnpqSXdGYnNVOElSYUpnOU5zL1hVcHJLNDNaeEZNQ3RiTmJDQ3puV2ZIYWtkTWV0OE5BMWozMnpiZ0ZIRVNhQ3hRTWNUYWZPQW40RnU3Zk5QbzM5TlVQTEV6T2ViYmZ5amhQQVZyaTVsbjR5dmdaS0tkU2J3dHNCVndyVDN2WGdHT0FIcXFPa3VNN0ExY0hNQjZ3OHBZTkJVNExLQjdtbVdBNTRHYmlQN2hSbS9nWmt3cmFSQXRMVE9CUXdobU1sWkpxZS90aWFuRjM2V0lTVEYzSmZBSFlIdk1US1k5S2ppKzdZRittSW1JRGdRdXdLUWpIYU55OVhJWmxJQnJ5dWJBM0pETGJTSm1UbzlWUTlySGZ2YW01Z0hnbHhxMis4U0lqOVZJUitVL01xRy9qNU1jbGM5b3ovZno5OENjZ003TnNMc2RYUlR3dFdZQ2NBTGhad2pzYks4WEV3TGV2OE1UZkw4NzJsRVpQYXJRb1RvZjYrYk95OERpRGt4bW1wVUNQUFlETUUrZy8rWHdCMVZMYmN1eUNibXVIQmxoR2I0Ri9CbFlHM2Q5elpmRFpLSVo1dkRtWElHR0FvMm9MWVZKNVJya3VSaTJ0cGhXeGFDdk16OWlrbUJrQXQ2ZmpQMmVIMFBZcHpzU2ZyK3JRQ01pcitubXpvdGxqRzJ4V0IrM0EvRXExUjR6TWRvRHdHd2RqOGlXTGdtNnRsemxRWGxPQlA1am4zSWVoT2x2dlNLbSswUFQxSlhkYkV2RkpqWUF2eGg0R1BnaHdPMVRvS0ZBb3hackFodTE0bk1yQTVlRjhJRHB6eEVkdDc0T2J5cGJXdVppdWpIOTBUNlFjUFZnNHdqZ2FVeUNrREQyNDIzaU9ZK1RBZzNQdGJNWEdvbkdBbnNUOUhkTTE2ajZDTGRsTGlZZitlUDJJdjFIVEM3MWpBNVRhR1lETXhLMFB5ZGpKdjA2Tk1KdDZBM3NiSmRTNW1ENkpIZEhXZmdrZmpZQS9vRVptL2VnZlhENEJhWTdYME1HdSs2WWx0S1Y3SU9zclFnbmExdTlmWEFWaGZHWVRFeXZVMWtYNDFydm8zWms0UndXbyt4Tit4ZkFsMEFCTTQ1eW1yMitOMXpqZTJER2NTMkRtWkY4VldDd0RSd0hoRnhlM3dGNzJHdWhpSE4zbzZmSVlTOXo3SS9ES3A3WGpjNDIyTkI0am5DV0h4TjRmV21MeVVhbDQ2c1dqVGlhaE44dEdvZDZYTGNmOHVENGJXMXZubld0S2IvOEJLeVdrdnZkMGFoRkkzUnRVSjdrc04wSFpERURTYi95ZkZ0bkF0ZmI3VDJQWkQxdDk5SFBDZHluK1ppeFJqZnA4SXFreXRVZWJNUExtTEZWYzNVNFNwb0M3QVI4cnFLUUlBT05zU3FHVUl6QU5Ja2VnUDhaU0pxYURweUw2US84ckE1bFlMNVA2SDdWQTBkaDh0eUxTUEk5anVuRzVjdTIvRmJCeG1JbUFEdGc1dUlRQ1RUUStGSEZFS2had0NtWVNYWGVpZm0rak1ZOC9UamNCaC9pMW5jSjM3K0xNYm42TmIrTFNITE53WXpQOGkzdzJVWFhudi8zSTdBTlppeUpTT0NCeGc4cWhzQjhCQXpCWkpPYWw2RDl1aDFZRC9oUWg5aXA3MU93ajQvWXVqTlNoMXNra2M3SHoyN0JMd0JiNko2SER6RzlLejVXVlpXd0FvM3ZWQXlCdUFYVGl2RnBRdmV2Z0prRThENGRhbWZTOGdQNEpiQXhjQW1hZlZZa1NWNENMdlY0KzBiYTMrWC9wdlQ0UEdpRHJlOVZWU1hNUUdNTXBudVB1REVYeUdGeVlNOU8rTDdPd0l3NStZc091eE5wQ3ZwbkEyZGlucXk5cTBNdmtvZ0hDUHZHNE9IQmo4QzJOaUJha0tMcjdmSDIrRXhWVlpXd0E0MEYrSi85S0M2bUFMc0NONmRzdnk4QWZrKzA4NEFrd1JjcDNPZjNNYTBiaDVHKzhXSUxTR2FtTVVtZk1aaDVKQ2JHWkh2bkFXY0FXNmJnL3VkOXpMd3AxNm1hU2xTQkJnbzBuSmlBbVFqcCtaVHUveitBUTFCWG1OYWFTbnI3RHRjRGQyQm1LejRKS0NaOGY3OEd6Z0g2QTNlcDZrdk1mWWJwUmpzcWh0ditLckEySmxIRm5JUWRseW5BQ1pnSE9aK3Bta3JVTGtPVDF0UTY0YzFhcWthQXlTbzBYM1dpNmtYZGh4YnFpSm1JYkdTQ2p1OVl6QlBGellFNmo4cmFWUm1QVEdoZG5JUW03R3R1ZVJ6b2xaQmp2VEp3djMzd0VmY0pnVzhDbHRaUHlXSkdvd243SW5PQWJ2UVVaRGowZTlXTHFwYzdWVzFLMnNqK2FFNks0VEg5MWdZWFc3Q3c5ZGczQ2pRVWFMUm1tUUw4MGJPZzJaVjFNWU9tNC9iQWJCWndxdzJZUklHR045clovMzZrb21pVmFjRE9oSnNtcmcyd09yQUpac2J1bFlBVmdhV0F6a0Fub0MwdzJmNFlmR20zNzMxTXQ2NHdCb0xkYnArbVhLd3FVckZQVlFRbHZXMlg0ekFET1BmQzVNTmZ6c050blEyOEFmd0hlQWI0SkFibE85VmVLMXlzSjRrbU8xclBsSVNVeHdMZ1g4QnBKRGQ1eFFoZ0gyQ0F2ZTRjREN6cDhmWitiMzl6YndURzZTZERmQTQ0WnFPbnl0VXM4NER0UXpvK1BZSGZBVThBdjFCYmsrcnp3RkNnZlFqYi9VL1ZrNHFYN1hVWnFzcnF3REhBdlpneEQxRWNzM0hBMDhEcG1DNVJIWFJZSkdTSGhsVFg1d0wvQmdhbnNJdzdBTC9CZEt1YTVzbnZ4YzgydU5nUmYxdExmVFFhdFdpRXJuR3o1L3VZaWJTa01zY0Nmdy80T3piRnpMQzZXd0EzTVdPQnE0RnJDVzRRWEVmTVlMc05WRjFhMUFkbElLcTEvTmF5eTBCTVM5OEFUR3RmWndmbnlsZkFONWo1WXo3Q1BQVWNxMktYaUcxaWY0ZldEV2o5SDlzYjdOdEpmcEtHU25UR0pIM1pEdFBDdWxaSU4vcno3RDNhQzhDTHdHczIrSlBxL0FYbzdlaTh1RTNGV1gyZ2tjZk0vU0F0dXhYVFB6VW8yMkptVjkwMGhIMFpaWU9aUndKYS93RGdBNUl6WURBSVh3R3JxaGdDMHhYb0J5d0JkTGRMcnlZM0R6TXhnMENuMkgrUHg3UllUQ0I1Mldna2VYb0RReG90YXdLclVGM0w5VHhNZDc4Um1DNkF6NkJadEN1NXRqU1UrZXJBYXBneEVwbFdCaUR6N0FPTXJ6R1pvajdISkFvWmllWTdrd1FFR3IvRHBKaVVsaVBaRFFNNjZWY0Vyc0prYmdyYjNaaXVLRUgwSmY0dFpuQ2RsUFlBcGp1YmlJZ3I3VEFwbExPWU1YTkxBRDNzMzZaaUJqdVB4OHlCOFFPbXI3K0NhbmRsdnpSbWJNY1NtQWNiYlJxVlA1anhQL1dZN3RDL1lCNXFqRVB6VVVtQ1pWRS8rWmFXNmZhcFJSQUIzOUdZbWJhajNMOVJ3RG9CMWE5N1ZIL0tMaWZyOGlNaUlpSkpOMEUzZmMwdUp3UlE1dDJCaHp6YXg2bVlyRDZ1OWJGUHoxU1BGbC9XMTZWSFJFUkVrdTVSM2ZTVlhWN0YvYUN2RlRBRFMzM2IxL25BZ1FIVXIwTlZqeFpiSm1QU0VZdUlpSWdrMm5HNjhTdWIybTgxeDJXOUNxWmZySy83SEVTd1VRZThydnEweVBLWUxqc2lJaUtTQnF2cnhxL2tjbVhLZ296R3djWnZIZS83cHFwUGl5d242cklqSWlJaWFmRzlidjRXV1g1aTBVd1J0ZXFMeWNjZmwvMmZpY25WN3RKanFsZi92d3pXSlVkRVJFVFM0aCs2K1F2c2lYTjc0dGwxNkVkZ0dZZmxzSzdxRlF0c1VDOGlJaUtTR252ckJuQ1JHOEhPRHN2MnNoaVh4WE1zT3U5S3JaNVIvZUlHWFc1RVJFUWtUYnBodXNzbzBEQ0Q0MTNaS1FIbGNiVEQ4dGhHOVN1UU5NSWlJaUlpWG50U040Rk10RUdYQzExSnh0aVhhWmlVdkM3VUFaK2x1SDVOQnpycFVpTWlJaUpKVlc1ZWlFZFZOTnhvYjZ4ZE9BZFlMZ0ZsMGhXNHlORzZGdGd5VHF1bmdWazZ6VVJFUkNSdGxzTE1IWkhXcDgzemdlVWRsZVdxd0p3RWxVMDlzSjZqc3VtVDRucjJHMTFtUkVSRUpLMmVTbkdnOFlURGNyd2pnZVhqY3BLNXgxTll2eWJqTnNtQWlJaUlpSGZhTlBPM2UxSmNMdjl3dEo0VmdBTVNXRDYvQmdZNFd0ZDlLYXhmajJFU0xvaUlpSWlrVWxmTUdJVTBQbTN1NktnTXIwbHdPYm1hTGIwWDZlcyt0Wk11THlJaUlwSjIvMHhob09HcU5hTTlNQ0hCNVRTTzVsdkVxdkZDaXVyWDkwQmJYVnBFUkVRazZWcTZVYnc1aFdYeXNLUDE3SW9aN0p4VWZZRk5IYTNybVJUVnI5c3d5UVpFUkVSRVVoMW92SXFaNnlBdFpnRXZPbHJYZ1Nrb3I3MGNyV2Q0U3VxWHl4WXpFUkVSa1ZnSEdwQ3VWbzJYZ0JrTzF0TVcyRDRGNWJXdG8vVjhBRXhLUVhrOUEzeXJ5NDZJaUlnbzBERHVjblR6SFFmUE8xclBSa0RQRkpUWElFelNnRnJWQSsra29MeHUwaVZIUkVSRUZHZ3M5RE5tTG9nMEdPNW9QZHVscEx6YUFrTWNyZXZkaEpmVmw4Q1R1dVNJaUlpSUFvMUZOYVJwVGJJcHdNZU8xclZCaXVyUUlBVWFGYmthMDNJaklpSWlva0Nqa1FMSmZ4cjdEdTZ5QWEyZG9qclUzOUY2UGs1d0dmME0zS25MallpSWlDalFLTzJLaEpmRmU0N1dzd1N3dkFLTnFvMG11Yk5sMzBoNnhqbUppSWlJVkIxb3ZBcThrdUN5Y05WMVoyREs2bEEvUit1cEI3NUlZUGxNQjRicFVpTWlJaUlLTkpwM2JvTEx3bFhYbmVWU1ZvZTZPVnpYcUFTV3ovV1lHZUpGUkVSRUZHZzBZemltWlNOcDVnTGZPRnJYc2ltclExMGRybXQwd3NwbU92QTNYV1pFUkVRa2pkcTE0alBuNDI2K0NWOThqcnVCNEROSWRoZXpwb29PMTVXMHllelVtaUVpSWlKU3BlY3g2VzZUc2p5cVErcUZvUW1xVTVPQUpYVklSVVJFSkszYXRQSnpwNUtzZVRWR3F5cDQ0YWNFN2N2RnFEVkRSRVJFRkdoVWJTUndyd0lOY1N3cE4rYmZBdGZxY0lxSWlJZ0NqZFk1RzVpVmtISVlxNnJnaGNrSjJZOHpFM1J1aUlpSWlJUWVhSXdHTGtsSU9ZeFRWZkRDbEFUc3d6dkFmVHFVSWlJaUlyWHBoSm43SU80RGQxZlhvZlJDKzVqWG8vbkFlanFNSW9uU0RkZ1dxRk5SaUlpRWIvY0VCQnBMNlRCNkk4NzE2Qm9kUHBIRXVkK2UzNThBUndDZFZTUWlJdUY2TE9ZM2lKMTBDQlZvMUxqOENQVFE0Uk5KbE9OTG5Pc1RNVm5sOUlCS1JDUWt5MklHOHNieEJuR2VEcDhDRFFmTGZqcDBJb215Q1RDbnpQbCtLMnJaRUJFSjFSK0o3OFJxb2tDamx1VVJIVGFSUkZrSytLSEV1VDRkK0oyS1IwUWtmSFhBeXpHOFNmeEpoMDZCUm8zMVIxMG9SSktqTGZCQ2lYUDlNMkJORlkrSVNIUldKSDVkcUVicnNDblFxR0haUjRkTUpGRXVMSEdlMzQzSlBpVWlJbFZvNTNoOTN3TEhBUDlVMFVvS1BBQThxR0lRU1l6ZVFGY1d6U0EzRXJoRFJTTWk0bytHZElCcTBaQnF4YVhlakFLVzBPRVNFUkVSQ2RjU21OYU50QVVhRHhQL09VVzB0THpNQlRiV2FTNGlJaUpTWHJ1QTF2c0xwdS82YTVqWm5uM1cwZUc2cHFoS3BjSlp3RnNxQmxZQmxpdngrbGVZakQxeFU0Y1o3UHNyWUhWZ0pVdzNtczZZYkVQajdMNjliNjl0RXp5K3B2MEsyQUFZd01Ka0JkTXh5UXUrQlQ0QTNyT3Z5VUsvQVpadjh0cDg0TzlBdlFmYnR3N1FxOGxyTTRHM0hheDdTV0JRaWRkL3NQVStTcDB3RDNjMkFWWUQrdGx6c3g2VG9uNGM4QjFtVXNXM2dDOGkyTWJsN0RVeFNLTngzd3VqM0hiN2NOeExXWi9neDB1OUJjd0thWC82QXRzQWc0SCtRQmNXWmtUOUVmalNYcXYvNThrMXlEdkhrYTcwdGplanAvMUpYNTYyTjZRQ3c4cVUwWWt4MjQ4VmdNc3BuYzYwM0ZJUHZBUWNGT0FEbTJxdENOeGdIM2hVc2cremdQOEErOGJnZ1ZCWVAvaXp5NVRWcnozWnh1Rmx0bTkvQit2ZXM4eTZoMFc0dnh0anhzZE1xL0k2L1RWd1BtYU9yN0NjR01Mdno3a2hidmN3VDgvVGtTR1VjLzhROW1OSFRIYTcrZ3EzcVFqY0NBelJwWHB4RCtCL041aWdiN3kwSkdQNUNvM0xTRktnc1NSd2kzMGlXa3U5K0E0WUd1RisxQUduMk1DaGxuMzRQZEFteGZYNUw4MlV6NHVlQnhyVHFEMzFyaytCeGtBYkJOZDZ6WjREWE0zaXJVQUtOQlJvUkJWbzlBWWVxM0g3bnNPMDdNUkNHRDhxaHdNZmVWd0c3WERYZlVyZEVKSnJ1djBoL2tWRmtRaDdZYnBYL0FFemIwSXRsZ2Z1c3pkR1MwWVFaTndCWEZIamRXeDU0RFpNbDdDQkthd1BIWUNqbS9uN05zQmFIbTkvVitBaG9Ic0Nqc1dKOXA1aFp3ZnJhbS9YOXo5Z0oxMzJKR0xMQWU4QXU5ZTRudTB4M1NXdndYUXJUSDJnTWMwV3FzOFQ0L1Z3dEo3Sk9vOFM2MkJNLzErSnYvTXdpUnQ2TzE3dnpwaXhEMnVFdUM4WEFvYzRYTjhtbURFb3E2U3NUZ3dGbHE3Z0J0aG5BNEhiaVcvWHp2YkFYWmdXaUE2TzE5M1BQZ2o0a3k1L0VwRk90ZzZ1N1BEKy9YaE02NGJYd3VwYi9DMW1rTjJMK05rWGVFbEhnZEFZblV1SnZURjlSTVdRQ0ZkV2VMTXhCL2djTXhodnJyMUdyRWJMWFRDV0IxNEJ0Z1ErRFhoZjFnRk9iK2J2TTRCMzdmVzNIdWlER2V3N29JWDFQbytmZzBDRFZFa1FjYUF0YjU4Zm12M1c3c3ZWTVN2L3RzQy9NSzNHTGZuWm5wc1Q3TTFiSHhzWTkyemhjL1g0M2J0Q2t1MHNtbThWL2RGZXIzKzI1OFB5bEU3KzBOU05DalFXZWhVNEF2aUhoK1hRRi9qTXdYckc2bHhLbkx0c29DSEp1SmxzS2NoNEFzaGpCbnJQYlBLM09tQnRUQXZDRVpqdUt1VWVYRHlENlVNN1BzRDlPWVBTcmRKemdiOEMxd05UUy94OVJjd0E4Q014bWJXYS90ajlNV1gxWWd0ZzNRcmUxOUdXMlFXZTc4L2xtQ3cxcjhib0dGelZRcEF4RjlOYWM1dmR0d1VsenMxQndONzIzT3hYWWgzSFlnYmZodTBhM0kxM21LVExlTFBuc2F0c2g2NnpKblp2NW1IR2FNeEUxMCtYcU5kdGdBM3RiODRoSlg1ejdzRjAyNVVtenNHL1FiNzdPdHEzRmRHQTZTUXR6K0crQ1Q5SmhoR2Z3ZUFiMnB1VmNzZjZVMkNqS3RhM0ZQQlBvc3RRMXRrR1FxVytkNzhLMTlFR09OUStJR240N0E0cHJNY1BVVHFyMkp3U3I0K04rSm93dk1KcjExZ2dVK1c2OXlTYVFjRjd0ckF2L3kwUkVEZW5BM0FxaTJhcXVpNmtCeGxoRGVBT1k3dUhlYnE5STRrdVUxUnI3VXY1VEZMTFZMaU9KVEV0OGczSlMwYlRjaXRlcXQzbzJRM2xLWTcycXczbDB5TnFpZGZ5b1U3aXhBUWE3VERqYThvZDZ5ZG9mVjcyNHpEekxKUmI5NEVCN2ROR1piN3ZnMWFzcXdmbVNmSFZLYXpEL2NzY3Z5ZWFDU1FQaWtHZ3NjQyt0NXBlQzFFRUd0MHhyV2psOXVFV1d0L2RPb3ZwS3ZVTXRTZDhVS0NoUUtNV1Y1WFo1dE5ic2E3QndBaGdzN2hjWktOS1pYZ3M4S2hINWJDaW8vWFVFM3kvYkFuZTE4QXVhSEIvVXZ5Qjhxay9YOEdNSDV2V3luVmZaNjluNVZ4Q01FL0ErNVY1dlRVSkM2WmdzZ09tY2FEc2NXVitCNjlyNWticnhKanMyNWEyL3Zuc05NcTN2RHlNNlFiVjJoVDBCVXh5Zy8xc01Da1NGWmZYNjQ4d2MybThya0NqZWZQdHlmK01KK1hnTWhMV1lMTjRHd05zaHdiMkowVmJlek5UeWdSTWsvYWNHci9qUnVEdU1uOWJIamVUcVRWVjdrbDFMZWwxRjZTc2JuU3pRV2hUbjJNR3hMOFB2Rm5pNzBPQXpUM2JseWxsWGo4Rk0yN0IxL0l2RjZTUEJnNXpVQ2Vub3dkR0VyME9qcS9Yc1pvaFBNckptZVpnbmlTKzdFRTVyTzV3WGUvb25JcXQ4Y0JXOWtkT2ttRTd5bWRaT2hOM2c3VlBhdWFHNWc4QjdOZWtNcTl2UTNYOTJkUHNNRXFuTnIrdTBRM3VOV1UrZTRKbisvSkh5ai81dndOWTFjUHkzNXZ5R1hWT2FTWjRFb21iQ1dWZS96M3hUVWNkaTBBRFRQckYzVHk0T1IrQXUwbjczdFE1RmRzTHdYYWtMNjFuMHUxVDV2V3g5Z2JNWmYzNWU1bS9iVWIxQTNOYjhrV1oxenRpbnNhdnIwUGY0bS9mY1NWZW40TEpOTmZnSVVxM2J1NkZ1eTYzTHJ4RCtTNWQzVEhka0xwNmRnektKUzM0ekc2dlNGSjhYdWIxTFRCWm8zb25lZWZiZUxBTk00QnRpYlpsb3cwbVI3NExINkttMnJqNUVmTWsrR01WUmVKc1UrYjF1Mmw5Mys5eWJpL3plaDJtcGN5bDc1cjU4VnJKM25nK0F1eUtNcWVWc2d1bG4vTGZ6cUxqZGVZQk41UjRYMXVhSDVzVGhSc3dBOWhMR1FUYzVORzJ0cVY4OTdPN1NGODNQa20yNTFvSXVML0JaSlFhbE1TZGIrZkpka3pEdEd3OGlwbGFQUXBEYkpCUXEvbVlIUHg3NmR5S2hUSDJKbEF0R2NuVGgvTGRwcDRONFB1K3RqZi9wUjVhckFQYzcvajdoalZ6ODFpSHlTSzBKK1lwL1hPWUNWTmZwbnhyU0pxY1dPSzFCWmk1UjVxNkdaT1d2Vk9UMS8rQW1XTm5ta2Y3ZFJSbVRwQlNOeXdIWVZyY2IvQmdPd2RTdXRzYXdGTUpxMnY5SFR4bytJVHkzVy9FMkpqYXh0dk9BMTRMYU5zK1llRkVycVgweENUaitKUDlIWG5HWHF0ZnhremdwMEREa1ladVZBOEN1MGNVYU56dWFGMVBLZENJaGE4eHJXbmZxaWdTYVpWbS92WkJRTi81VHBsQVkrVUF2dXRXZS9QWTBzRGtIcGdabzM5ci8vODdHM2c4YWdPdWVTbXJGMnZaODc3VWRmdnJFcTlQQU83RjlLZHVyQmRtRXEwYlBOcTM2Wml4RCsrVnVaRWZoaG5rL25iRTIxbHV6TWdjNEg4VnJtTUZ5cmRZdHVTT0VQZjFkM2FweFY3NGxhblRSN1ZPWERlWmxtZmhyc1dSbUptL1cwcWx2akptQXI5ak1JTyszN2VCeHdOVm5CdlNncmFZbk81aHo1dnduc045V0lybWMrdHJpWDc1Z01vbnlwSFNodUgzUEJxN2w5bStxUUYrNTRXVW45TWdDSDJBdDJvNEQ4WmhVcUF1bWFKNmUwdVpzbWh1c3NLMXkzem1DOElkekRtY3l1WVEyTHVaWS81ZG1lTzlKK0hOcDNCWW1lK3FwbVY1enhycWZSQk9EUEQzYXM4QTY5U0pKR01lalZxWFNTRnMrOWIyZTFxN2pTTXdrNnkyaTlNRnQ0MkgyelFmazlQOXZKQy9kMTNLTitWVzZ5ZE05eW54MDdPWUpzd2ZWUlNKMXFuTTZ6TUQvTTV5UDFaZEF2cStpU3ljTDZFMVkwNzZZaWFOR28zSnd0VTI0WFZpU1VwUHVOZVEwcmFjRDhzRWkxbGdady8zODJIZ2lqSi9XeDd6OURmS1kxMXVNdFJwaUNUWHk4QjZMVnhybXJNTzhBOU13b1J0NHJMVGJUemV0bk14ay9YTUM3RXNOblc0dmp0MVRubnBIOEN2Q2ZhcHR2aGhUcFVCaUF2bE12dk1DUEE3WjlzZ29UOXdHZVpCUjJ1Mit5TGdhVm8vUzNvYzVNb2MvOFlwYmN1NXRzenJKM3E2cjJkZytvV1hzaDN3MXdpM3JkejUwRm1YTFVtNGJ6Q3RwNXRqdXNPMTVoNTNGZUFGVEJwb0JSbzF1Z1hZRWZnbHBPL2J3ZUc2SGc1eHU2VmxDNEN6TUsxbGMxVWNxVkR1L091T3U5Ykxwc3Fsc1ExalFOOVlUT3RFUDh4VDlyejlVYXZHOXNDL1NHWnU5dzdBMFNWZWI1clN0cHpIS1QyZWEzdkt6endmcGZuQVVNcTMzSjZEeVVvV2hYSXRGK3JPS21ueE9tYnN6ZEtZeEJLUFVWM0cwanBNcStYdmZkL1JPUFR6ZWduWUFIZ1NkeWxveTlrWk0rcmZoUm1Zd1pxbjZueUszRlRnQUZ1SEpEMUdOL08zZFNuL3RMY1dhNWQ1L2VzUTkzc2VadkRnTS9iL0IyQUdQMitGZVppeVZBWFh3VU5JWHF2c1BqWUlhK3AyS3V1eU14L1Q4dkczRW44N0FkTUM3NXVpM2UvaFpYN3YvNGxKaERMS2szT3pPN0FjOEVNRjY1aE15NWtpVnlINitVT3VvZmJ4RHVPUmxteFJZYjBwSjZyWnRuL0dqRXUrRGRPZGNYM01XSTV0Z1YvUmNucnlhK3hERUdVbGM2Q0hMY3lnQndtdjRuQ2JWOEIwMzlEZzYraVdMMElJVU5OcUdINFBCcSt6Ri9GUzIzaEJBTi9YczVuei9VQlB5cVN0RFRqdXRRRkp1Zk1taVhQS3ZCUGdkV1lHWm1CKzBJWlQyV0R3cGs2aStjUVluUWgzTUhpdlpyYm40QkRLS3dnbmx2bXVjejAvTDA0a0dZUEIreWZ3bXRVVE0vajd2UmF1UDJmN3ZCTnRZbFRnVTRBOU1GMEQ1Z2Y0UGI5MXVLN3ZNR01DSkJxUEFodFJmbUl6U2JZRndLdGwvbll3N2x0MDl3WGFsL25iSzU2VXlYeDc4M1VBWm1CaG9jejdCZ0hMSnFndWJJcHBHUTlLWi94czBXaHdOU1oxZkNuclVucitrQ0JOd2d4b0xXVWZYYnBFQU5OcWQ0ZTlkaDFHK1c3ZnUvcThFMjFpVnVnTE1JTWR0eUc0akVHdUwzS1hVbjVRcWdSakRuQWNKc1hqSkJWSDZvUE5VbFlFOW5mNFBlMkFrOHY4N1cxcWE5SVB5aWVZOFFYbHNuQ3RsS0I2Y0dJSTMzRk1NNEdtRHc2bi9FT1h3KzJOVEppZUx2UDZicFNmWjBNa2pSYllnT09rTW44Zm9FRER2ZjlpbnNZRk1ZUG9lcGhaUzEwWmhlblhLK0g0Q3RnRTg0UnVnWW9qOVI3R1RHSld5bVZBYjBmZmMwSXoxdzJmV3pXL28vd2NIMzBUVWdkV3NBOGRncllzYmx2RVhac0svS2FaOHlIc2lYTHZMdk42SFhDbExsMGlpeWszYnM3cmVaRGF4TGpBeDJQU2xCNk4rN3o0ZjNDOHZnc3dFMk5Kc0c2emdlSUhLZ3F4SmdNM2wvbmJNcGpCc0xYT0o3QXhKalZzS2VPb0xLTlJheDFrcjRPMUtKY1JhMzVDNnNDeGhEZG54QW1lbDhXbm1OWUxINHpBWk40cDVkZVlWTVFpU2RFVzA4TmwrUnJXTVkzUzNhZThmcWphTHVZSGJnRndJeVl6MVQyWTdCa3VISXhKaGVxcXk5TmtUSlBYdlRyWEFqRVcwei82S1JXRmxIQXBwbHRJcnhKLzI4VUdHNGUyOG56ZkNIZ0M2RmptNytjUTNBU0JtMk15SnJVRExzWk1jdHFhMU0yRG1qbXY0cTRycFI4Y3piVkJXaTNYK051QkpVclVoNDB4czdYNzZnSE1tSlhqUGRpV3Z3QXZsdm5iOVRZSWZsQ1hNRW1BeXpEZGF3KzF5ek90V01kQVNuZlBIS1BpRFM5YVBCV1QvY05GRnBHREF0akdSMUFXS05mTFBTVis3Q1Vjdy9BNzYxUmp1UmJxMFZ0VTEyV3lEampLQmhIbDF2a3F3YlVhRDhDa00yejhmU09BemFwY3oyL0tiUHNzZ3B2TlBFeEhsZG0vZnpwWTl4VmwxbjEvZ1BzekhEY1pkOW9EYjFSNGpSMFc4REY2c0pudnJzZjBDT2hRNVRvNzJ5Qm1Mc282MWRydEh1YnA5bzRrZmxtbi9sQmllMituL0x4TDVYNXp5cDByRCtsMkpGeXJZcVo1ci9VRzlyMEF0bTBwVEY1ekJRaTFMOTlnbmthTEFnMFhOelFMTUUrMzg1anVkK1YwdFE4aFJyU3dycDh3OHdFRW9TZW1DMHk1NzM0V2s2cTBRd3MzbXNkU1BoM3ZZd21vbjNXWXdjK2w5bTlqQit0ZnlkNElOMTMzdkFDUHZhdEFBOHlZa25FZUJCcDlnTzliMklZdjdjMWF0d3FPeVFVVjdKY0NEUVVhWWRtcW1ldnNURXpMM1RvdHJDTmpIMkNVcTg4SCtINGhUcUk2eklSVGwxUGJnTVp0Yk5EaTBqYkE4OFI3ZkV5VTVtS2VKRjVJY0YxU3BQSkFJOGcrNlV2Z05tdFlGK0FGVExLQWxvd0Yzc2RraTVwanQyVVZUSnJCbGpJTHpRUzJCTjROcUZ4T3RkZTJsa3pIUExYK0g2WnBmUjdtU2UvcXdFNDBQM0hmcnlpZkdqZ3VkZ2IrVStMMWQ0RU5IWDNIazVST0xYa1pKaFY3RUlIR2xpVmVIMER6RTFTV3M3VTlKNXI3UGJvbWhJY0g2MkJTUVBkbzRYMnpNVm5jUHJMQi9Eek1RTmpsYlBCWVNmLzNXZlk4Q09LRy9lb3kyenpMMFhlOGhzbktGY1oydTdLdURRNWNCaHFsSmthZGlydEo5NDdHWFZmMzk2aXNXLzhZekppbEwxazQrZDVTOXJQYk5QTzc4eTJRUmRsTkk5UFRYaVRuMGJxbjVzTUQycTQvb3hhSjFpelAyNXNrOFNmUUNQSjQ5d3JvbXZCeWdOczhFZE5QUCtnSEtXZGpCbXNIc1ErM0phUitQa1B3RThMdFhPWTdmaWFZcm1mRGNmODA5M1NpYmRGb3NKRTlmNEs4cG96QzNWak9VamZzUWY4R0RvL2hkcS9qZUh0SGhsRE9oenJjM2o2WWNjUkJiZXRPdWhYeHd5Qk16dTdXSE1SdEE5cW1meWh3cUhqNUZIV1RVcURoVGtjV3BqOTJ1YndQckJ4aStXK01tZm5lNVQ2OFJQbUI3WEd5ZXBuOUcrOTQvOXBnVW1xWCtxNGdzaVlGRVdqVVllYWJpVHJRQU5QMU9ZZ2J5WHBNOXJrZUFXNjdBZzBGR3MxZEowN0UzUmppaHVVRXhEdmIwdkpVN2syWEVRVFR6YWxERGNGUFdwYnh3SkhFUHp1YUFnMi9BbzBHMjJCbUo2NTFPNmRodWpORk1WbGJCL3RqTTk3QmZ0eEk5WU51ZlhWVG1YMjhJSUR2T3FtWkJ5U3V1eWNIRVdoZ3o3V3Y4S092ZmlkTTFrZFhOMlV2QXV1SHNOMEtOQlJvdEdSWnpDRHd1VFZ1M3lSZ1A5MkMrS3ZPSHFCUHF6aW9RYzJZMm9WZ205VGl1a3pBTk9kM1UzVlZvQkd3TnNCUXpIaUVhcmR2TkNhelRXOFBqa1ZIZTUxNmtlcTZWTlZqeGpGc21xQjYyYnZNVGVwYyswUHYyaExOM0JUdkdKTkFBMkJ3bWYwWUZ0RnhYQW80SHpPcFpMWG41aStZRm93aElXNnZBZzBGR3BWYURqUE85S3NxdDJzeWNCVXhtMHcxcVlQQks3M0IyTmZlS0xUVTcvOG5ZRFhLVDJ4VmE3RHhKR1pRWHRwTkJQNkc2ZFl5VGNYaHZRMkJOUUpjLzcyRU84QnRCV0FIVElyWTFlei9kOFU4NVorT3lSajNGV1l3Nmt1WVFjVStUcFMwSkdZdzk0YVlRWUlyWUxxTXRMYzNZRDlqc3JhOWpXbFZIWnV3ZXRrZmsrbWwxUFhsaVlDK2MwZk1CSkJOZldiTDJaV2RLSjBTODkrT3JwbWJZYm92TmZZcDhFN0V2OVViWVFiQmI0Qkp5ckFNQ3dkMFQ3Ty8wVjhDSHdML3hTUkJDSHR3N0JxNFN6SlFUcEhXemI4UTVYWS83dmplYWZjUUh1NjhacS8xWVZqTlhxL1hzWFc3TDJZczRWeGJiaE14Q1QzK2F4OGtLUWxPVEFPT2ZleVBRWE9SNUswQmJrTm5UQjdrdExaZ2pNWjBQMUFMaG9pSWlJZ2swbWFZSjBQMVpXNklkd2p3dTl0aW51YW5LY0I0RjlPTlRXTXdSRVJFUkNRVkJnQVhzL2prZW1NSXZzbnVBRXhUY0ZLRGl4bkFIU1NyVDdpSWlJaUlTRlhhWTdwVnZjakNWbzZIQ1g1c1M1YUYvYitUc253TUhFYzRBM3hGUkVSRVJHSmpXVXdLeTVIQUtTRjhYenZNeEg2dTh5Nkh1WHlIbWNWN1BWVWZFUkVSRVpHV1pRa3ZZOWNLd0QweENpNSt3T1RqMzRKZzVoOFJFUkVSRVJHSEJnSDNBL1B3YzFEM1g0RjFTWGZLWkJFUkVSR1IyRm9CdUlqV1RXTGthdmtjTS9QdVVHQnBIUklSRVJFUmFVcFBuK09yRFNaejArNll5YUxXQ3VoNFRnTSt3RXpZOUI3d0NpWWJsNGlJaUlpSUFvMFVXQUl6dStmYW1Kbk9CMkFHc1BkbThaUzhNekd6cHM2dy8vM0ZCZzgvQXVNd013VVhnVStBTHpBWnQwUkVSRVJFS3ZaL0F3RFdiOGgzcExhdEN3QUFBQUJKUlU1RXJrSmdnZz09IjsKbGV0IGVuam95TG9nb1Byb21pc2VWMTY7CmZ1bmN0aW9uIGVuam95TG9nb1YxNigpe3JldHVybiBlbmpveUxvZ29Qcm9taXNlVjE2Pz89bmV3IFByb21pc2UoKG9rLG5vKT0+e2NvbnN0IGltYWdlPW5ldyBJbWFnZTtpbWFnZS5vbmxvYWQ9KCk9Pm9rKGltYWdlKTtpbWFnZS5vbmVycm9yPSgpPT5ubyhFcnJvcignTm8gc2UgcHVkbyBjYXJnYXIgZWwgbG9nbyBkZSBFbmpveS4nKSk7aW1hZ2Uuc3JjPUVOSk9ZX0xPR09fVjE2fSl9CmNoYXJ0UG5nVjg9YXN5bmMgZnVuY3Rpb24oc3ZnLHRpdGxlLGxlZ2VuZCl7CiBjb25zdCBjbG9uZT1zdmcuY2xvbmVOb2RlKHRydWUpLGJveD1zdmcudmlld0JveC5iYXNlVmFsLHdpZHRoPWJveC53aWR0aHx8NjgwLGhlaWdodD1ib3guaGVpZ2h0fHwzNTA7CiBjb25zdCBzdHlsZT1nZXRDb21wdXRlZFN0eWxlKHN2ZyksYmc9c3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1wbG90YmcnKS50cmltKCl8fCcjZmZmJyxmZz1zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXBsb3R0ZXh0JykudHJpbSgpfHwnIzI3NDU1OScsZ3JpZD1zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXBsb3RncmlkJykudHJpbSgpfHwnI2RiZTVlZCc7CiBjbG9uZS5zZXRBdHRyaWJ1dGUoJ3htbG5zJywnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnKTtjbG9uZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJyx3aWR0aCk7Y2xvbmUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLGhlaWdodCk7Y2xvbmUuc2V0QXR0cmlidXRlKCdmb250LWZhbWlseScsJ0FyaWFsLCBzYW5zLXNlcmlmJyk7Y2xvbmUucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpOwogY29uc3Qgc2VyaWFsaXplZD1uZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKGNsb25lKS5yZXBsYWNlKC92YXJcKC0tcGxvdGJnXCkvZyxiZykucmVwbGFjZSgvdmFyXCgtLXBsb3R0ZXh0XCkvZyxmZykucmVwbGFjZSgvdmFyXCgtLXBsb3RncmlkXCkvZyxncmlkKTsKIGNvbnN0IHVybD1VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtzZXJpYWxpemVkXSx7dHlwZTonaW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04J30pKTsKIHRyeXsKICBjb25zdCBbaW1hZ2UsbG9nb109YXdhaXQgUHJvbWlzZS5hbGwoW25ldyBQcm9taXNlKChvayxubyk9Pntjb25zdCBpbWFnZT1uZXcgSW1hZ2U7aW1hZ2Uub25sb2FkPSgpPT5vayhpbWFnZSk7aW1hZ2Uub25lcnJvcj0oKT0+bm8oRXJyb3IoJ05vIHNlIHB1ZG8gY29udmVydGlyIGVsIGdyw6FmaWNvIGEgaW1hZ2VuLicpKTtpbWFnZS5zcmM9dXJsfSksZW5qb3lMb2dvVjE2KCldKTsKICBjb25zdCBzY2FsZT1NYXRoLm1pbigyLDgwMDAvd2lkdGgpLGNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtjYW52YXMud2lkdGg9TWF0aC5jZWlsKHdpZHRoKnNjYWxlKTtjYW52YXMuaGVpZ2h0PU1hdGguY2VpbCgoaGVpZ2h0KzIyMCkqc2NhbGUpOwogIGNvbnN0IGN0eD1jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtjdHguc2NhbGUoc2NhbGUsc2NhbGUpO2N0eC5maWxsU3R5bGU9Ymc7Y3R4LmZpbGxSZWN0KDAsMCx3aWR0aCxoZWlnaHQrMjIwKTtjdHguZmlsbFN0eWxlPWZnOwogIGN0eC5mb250PSdib2xkIDI4cHggQXJpYWwnO2N0eC5maWxsVGV4dCh0aXRsZSwyNCw0MCx3aWR0aC00OCk7Y3R4LmZvbnQ9JzE2cHggQXJpYWwnO2N0eC5maWxsVGV4dChsZWdlbmQuc2xpY2UoMCxNYXRoLmZsb29yKHdpZHRoLzkpKSwyNCw3MCx3aWR0aC00OCk7Y3R4LmRyYXdJbWFnZShpbWFnZSwwLDEwMCx3aWR0aCxoZWlnaHQpOwogIGNvbnN0IGxvZ29XaWR0aD1NYXRoLm1pbigxNTAsd2lkdGgqLjE5KSxsb2dvSGVpZ2h0PWxvZ29XaWR0aCozMjYvNzk0LHg9d2lkdGgtbG9nb1dpZHRoLTI0LHk9aGVpZ2h0KzEzMjsKICBjdHguZmlsbFN0eWxlPScjZmZmZmZmJztjdHguZmlsbFJlY3QoeC05LHktOSxsb2dvV2lkdGgrMTgsbG9nb0hlaWdodCsxOCk7Y3R4LmRyYXdJbWFnZShsb2dvLHgseSxsb2dvV2lkdGgsbG9nb0hlaWdodCk7CiAgY3R4LmZpbGxTdHlsZT1mZztjdHguZm9udD0nMTJweCBBcmlhbCc7Y3R4LmZpbGxUZXh0KCdFbmpveSBMb3Mgw4FuZ2VsZXMgwrcgQW7DoWxpc2lzIGRlIG3DoXF1aW5hcyBkZSBhemFyJywyNCxoZWlnaHQrMTY4LE1hdGgubWF4KDEwMCx3aWR0aC1sb2dvV2lkdGgtODUpKTsKICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKG9rLG5vKT0+Y2FudmFzLnRvQmxvYihibG9iPT5ibG9iP29rKGJsb2IpOm5vKEVycm9yKCdObyBzZSBwdWRvIGdlbmVyYXIgZWwgUE5HLicpKSwnaW1hZ2UvcG5nJykpOwogfWZpbmFsbHl7VVJMLnJldm9rZU9iamVjdFVSTCh1cmwpfQp9Owpkb2N1bWVudC50aXRsZT0nRW5qb3kgTG9zIMOBbmdlbGVzIMK3IEFuw6FsaXNpcyBkZSBtw6FxdWluYXMgZGUgYXphcic7CgpsZXQgZGFzaGJvYXJkUmVhZHlWMTc9ZmFsc2U7CmxvZ2luU2NyZWVuVjE1PWZ1bmN0aW9uKG1lc3NhZ2U9JycpewogZGFzaGJvYXJkUmVhZHlWMTc9ZmFsc2U7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdsb2NrZWRWMTUnKTsKIGNvbnN0IHBhbmVsPSQoJyNsb2dpblYxNScpO3BhbmVsLmhpZGRlbj1mYWxzZTtwYW5lbC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsJ2ZsZXgnLCdpbXBvcnRhbnQnKTsKICQoJyNsb2dpbk1lc3NhZ2VWMTUnKS50ZXh0Q29udGVudD1tZXNzYWdlOyQoJyNwYXNzd29yZFYxNScpLnZhbHVlPScnOwp9Owpyb2xlSW50ZXJmYWNlVjE1PWZ1bmN0aW9uKCl7CiBpZighYXBwU2Vzc2lvblYxNXx8IWRhc2hib2FyZFJlYWR5VjE3KXJldHVybjsKIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgndmlld2VyVjE1JyxhcHBTZXNzaW9uVjE1LnJvbGUhPT0nYWRtaW4nKTsKICQoJyNzZXNzaW9uTmFtZVYxNScpLnRleHRDb250ZW50PWFwcFNlc3Npb25WMTUudXNlcm5hbWUrJyDCtyAnKyhhcHBTZXNzaW9uVjE1LnJvbGU9PT0nYWRtaW4nPydBZG1pbmlzdHJhY2nDs24nOidDb25zdWx0YScpOwogZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdsb2NrZWRWMTUnKTsKIGNvbnN0IG1haW49ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWFpbicpLGFzaWRlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2FzaWRlJyk7aWYobWFpbil7bWFpbi5oaWRkZW49ZmFsc2U7bWFpbi5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpfWlmKGFzaWRlKXthc2lkZS5oaWRkZW49ZmFsc2U7YXNpZGUuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2Rpc3BsYXknKX0KIGNvbnN0IHBhbmVsPSQoJyNsb2dpblYxNScpO3BhbmVsLmhpZGRlbj10cnVlO3BhbmVsLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5Jywnbm9uZScsJ2ltcG9ydGFudCcpOwp9OwpvcGVuU2Vzc2lvblYxNT1hc3luYyBmdW5jdGlvbihzZXNzaW9uKXsKIGFwcFNlc3Npb25WMTU9c2Vzc2lvbjtkYXNoYm9hcmRSZWFkeVYxNz1mYWxzZTsKIHRyeXtzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdMQV9BVVRIX1NFU1NJT04nLEpTT04uc3RyaW5naWZ5KHNlc3Npb24pKX1jYXRjaChlKXt9CiAkKCcjbG9naW5WMTUnKS5oaWRkZW49ZmFsc2U7JCgnI2xvZ2luVjE1Jykuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCdmbGV4JywnaW1wb3J0YW50Jyk7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdsb2NrZWRWMTUnKTsKICQoJyNsb2dpbk1lc3NhZ2VWMTUnKS50ZXh0Q29udGVudD0nQWNjZXNvIHZhbGlkYWRvLiBSZWN1cGVyYW5kbyBsYSBtYXRyaXogcHJpdmFkYeKApic7CiB0cnl7CiAgY29uc3QgaW5jb21pbmc9YXdhaXQgY2FjaGVkKCk7aWYoYXBwU2Vzc2lvblYxNT8udG9rZW4hPT1zZXNzaW9uLnRva2VuKXJldHVybjsKICBkYXRhPWluY29taW5nO3NhdmVkVmlld3M9W107bG9hZFZpZXdzKCk7JCgnI2xvZ2luTWVzc2FnZVYxNScpLnRleHRDb250ZW50PSdNYXRyaXogcmVjaWJpZGEuIFByZXBhcmFuZG8gaW5mb3JtZXPigKYnOwogIGF3YWl0IG5ldyBQcm9taXNlKG9rPT5zZXRUaW1lb3V0KG9rLDIwKSk7aWYoYXBwU2Vzc2lvblYxNT8udG9rZW4hPT1zZXNzaW9uLnRva2VuKXJldHVybjsKICBpbml0KCk7aWYoISQoJyNjb250ZW50JykuaW5uZXJIVE1MLnRyaW0oKSl0aHJvdyBFcnJvcignTm8gc2UgZ2VuZXLDsyBlbCBjb250ZW5pZG8gZGVsIGluZm9ybWUuJyk7CiAgZGFzaGJvYXJkUmVhZHlWMTc9dHJ1ZTtzdGFydGVkU2Vzc2lvblYxNT10cnVlO3JvbGVJbnRlcmZhY2VWMTUoKTsKICBycGMoJ2dldFZpZXdzJykudGhlbih2YWx1ZT0+e2lmKGFwcFNlc3Npb25WMTU/LnRva2VuIT09c2Vzc2lvbi50b2tlbilyZXR1cm47Y29uc3Qgdmlld3M9SlNPTi5wYXJzZSh2YWx1ZSk7aWYoQXJyYXkuaXNBcnJheSh2aWV3cykpe3NhdmVkVmlld3M9dmlld3M7bG9hZFZpZXdzKCl9fSkuY2F0Y2goZXJyb3I9PntpZihhcHBTZXNzaW9uVjE1Py50b2tlbj09PXNlc3Npb24udG9rZW4pJCgnI3N0YXR1cycpLnRleHRDb250ZW50Kz0nIMK3IE5vIHNlIGNhcmdhcm9uIGxhcyB2aXN0YXMgZ3VhcmRhZGFzLid9KTsKIH1jYXRjaChlcnJvcil7CiAgZGFzaGJvYXJkUmVhZHlWMTc9ZmFsc2U7ZGF0YT1udWxsOyQoJyNjb250ZW50JykuaW5uZXJIVE1MPScnO3RyeXtzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdMQV9BVVRIX1NFU1NJT04nKX1jYXRjaChlKXt9CiAgYXBwU2Vzc2lvblYxNT1udWxsO2xvZ2luU2NyZWVuVjE1KCdObyBzZSBwdWRvIGFicmlyIGVsIGRhc2hib2FyZDogJysoZXJyb3IubWVzc2FnZXx8U3RyaW5nKGVycm9yKSkrJy4gUHVlZGVzIHZvbHZlciBhIGluZ3Jlc2FyLicpO3Rocm93IGVycm9yOwogfQp9OwoKZnVuY3Rpb24gc2hvd0xvZ2luVjE4KG1lc3NhZ2U9JycpewogZGFzaGJvYXJkUmVhZHlWMTc9ZmFsc2U7CiBjb25zdCByb290PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoYm9hcmRSb290VjE4JyksbG9naW49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ2luVjE1Jyk7CiBpZihyb290KXtyb290LmhpZGRlbj10cnVlO3Jvb3Quc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCdub25lJywnaW1wb3J0YW50Jyl9CiBpZihsb2dpbil7bG9naW4uaGlkZGVuPWZhbHNlO2xvZ2luLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywnZmxleCcsJ2ltcG9ydGFudCcpfQogZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdsb2NrZWRWMTUnKTsKICQoJyNsb2dpbk1lc3NhZ2VWMTUnKS50ZXh0Q29udGVudD1tZXNzYWdlOyQoJyNwYXNzd29yZFYxNScpLnZhbHVlPScnOwp9CmxvZ2luU2NyZWVuVjE1PXNob3dMb2dpblYxODsKcm9sZUludGVyZmFjZVYxNT1mdW5jdGlvbigpewogaWYoIWFwcFNlc3Npb25WMTV8fCFkYXNoYm9hcmRSZWFkeVYxNylyZXR1cm47CiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ3ZpZXdlclYxNScsYXBwU2Vzc2lvblYxNS5yb2xlIT09J2FkbWluJyk7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdsb2NrZWRWMTUnKTsKICQoJyNzZXNzaW9uTmFtZVYxNScpLnRleHRDb250ZW50PWFwcFNlc3Npb25WMTUudXNlcm5hbWUrJyDCtyAnKyhhcHBTZXNzaW9uVjE1LnJvbGU9PT0nYWRtaW4nPydBZG1pbmlzdHJhY2nDs24nOidDb25zdWx0YScpOwogY29uc3Qgcm9vdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGJvYXJkUm9vdFYxOCcpO3Jvb3QuaGlkZGVuPWZhbHNlO3Jvb3Quc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCdibG9jaycsJ2ltcG9ydGFudCcpOwogZm9yKGNvbnN0IHNlbGVjdG9yIG9mIFsnbWFpbicsJ2FzaWRlJ10pe2NvbnN0IGVsZW1lbnQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7aWYoZWxlbWVudCl7ZWxlbWVudC5oaWRkZW49ZmFsc2U7ZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsJ2Jsb2NrJywnaW1wb3J0YW50Jyl9fQogJCgnI2xvZ2luVjE1JykuaGlkZGVuPXRydWU7JCgnI2xvZ2luVjE1Jykuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCdub25lJywnaW1wb3J0YW50Jyk7Cn07CmNvbnN0IHN1Ym1pdEJlZm9yZVYxOD0kKCcjbG9naW5Gb3JtVjE1Jykub25zdWJtaXQ7CmxldCBzdWJtaXR0aW5nVjE4PWZhbHNlOwphc3luYyBmdW5jdGlvbiBzdWJtaXRMb2dpblYxOChldmVudCl7CiBpZihldmVudCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtldmVudC5zdG9wUHJvcGFnYXRpb24/LigpfQogaWYoc3VibWl0dGluZ1YxOClyZXR1cm47Y29uc3QgZm9ybT0kKCcjbG9naW5Gb3JtVjE1Jyk7aWYoZm9ybS5yZXBvcnRWYWxpZGl0eSYmIWZvcm0ucmVwb3J0VmFsaWRpdHkoKSlyZXR1cm47CiBzdWJtaXR0aW5nVjE4PXRydWU7dHJ5e2F3YWl0IHN1Ym1pdEJlZm9yZVYxOCh7cHJldmVudERlZmF1bHQoKXt9fSl9Y2F0Y2goZXJyb3Ipe3Nob3dMb2dpblYxOCgnTm8gc2UgcHVkbyBpbmdyZXNhcjogJysoZXJyb3IubWVzc2FnZXx8ZXJyb3IpKX1maW5hbGx5e3N1Ym1pdHRpbmdWMTg9ZmFsc2V9Cn0KLy8gQSBub24tc3VibWl0IGJ1dHRvbiBjYW5ub3QgbmF2aWdhdGUvcmVsb2FkIHRoZSBBcHBzIFNjcmlwdCBpZnJhbWUuCiQoJyNsb2dpbkJ1dHRvblYxNScpLnR5cGU9J2J1dHRvbic7JCgnI2xvZ2luQnV0dG9uVjE1Jykub25jbGljaz1zdWJtaXRMb2dpblYxODsKJCgnI2xvZ2luRm9ybVYxNScpLm9uc3VibWl0PWV2ZW50PT57ZXZlbnQucHJldmVudERlZmF1bHQoKTtldmVudC5zdG9wUHJvcGFnYXRpb24/LigpO3N1Ym1pdExvZ2luVjE4KGV2ZW50KTtyZXR1cm4gZmFsc2V9OwokKCcjbG9naW5Gb3JtVjE1JykuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZXZlbnQ9PntpZihldmVudC5rZXk9PT0nRW50ZXInKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3N1Ym1pdExvZ2luVjE4KGV2ZW50KX19KTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJyxldmVudD0+e2lmKCFkYXNoYm9hcmRSZWFkeVYxNylzaG93TG9naW5WMTgoJ0Vycm9yIGRlIGxhIHDDoWdpbmE6ICcrZXZlbnQubWVzc2FnZSl9KTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3VuaGFuZGxlZHJlamVjdGlvbicsZXZlbnQ9PntpZighZGFzaGJvYXJkUmVhZHlWMTcpc2hvd0xvZ2luVjE4KCdObyBzZSBjb21wbGV0w7MgZWwgaW5ncmVzbzogJysoZXZlbnQucmVhc29uPy5tZXNzYWdlfHxTdHJpbmcoZXZlbnQucmVhc29uKSkpfSk7Ci8vIFJlY292ZXIgYSB2aXNpYmx5IGVtcHR5IHNoZWxsIHdpdGhvdXQgcmVxdWVzdGluZyBvciBleHBvc2luZyBhbnkgZGF0YS4Kc2V0VGltZW91dCgoKT0+e2lmKCFkYXNoYm9hcmRSZWFkeVYxNyl7Y29uc3QgcGFuZWw9JCgnI2xvZ2luVjE1Jyk7cGFuZWwuaGlkZGVuPWZhbHNlO3BhbmVsLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywnZmxleCcsJ2ltcG9ydGFudCcpO2lmKCEkKCcjbG9naW5NZXNzYWdlVjE1JykudGV4dENvbnRlbnQpJCgnI2xvZ2luTWVzc2FnZVYxNScpLnRleHRDb250ZW50PSdJbmdyZXNhIGNvbiB0dSB1c3VhcmlvIHkgY29udHJhc2XDsWEuJ319LDI1MDApOwoKCmZ1bmN0aW9uIGNvbXBhcmlzb25Db21iaW5lZFYyMihlbnRyaWVzKXsKIGNvbnN0IGtleXM9Wydjb2luJywnd2luJ10sdmFsdWVzPWVudHJpZXMuZmxhdE1hcChlPT5rZXlzLm1hcChrPT5OdW1iZXIoZS50b3RhbFtrXSl8fDApKTsKIGNvbnN0IGxvPU1hdGgubWluKDAsLi4udmFsdWVzKSxoaT1NYXRoLm1heCgwLC4uLnZhbHVlcyksc3Bhbj1oaS1sb3x8MSx5PXY9PjIxNS0odi1sbykvc3BhbioxNjUsemVybz15KDApOwogY29uc3QgY29sb3I9e2NvaW46JyMxNzM2NTInLHdpbjonIzEzOGY5Myd9OwogcmV0dXJuIGA8ZGl2IGNsYXNzPSJjaGFydHNjcm9sbCI+PHN2ZyB2aWV3Qm94PSIwIDAgNzYwIDMyMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJDb2luIEluIHkgV2luOiBjb21wYXJhY2nDs24gQSB5IEIsIGVzY2FsYSBjb23Dum4gZW4gQ0xQIiBzdHlsZT0iaGVpZ2h0OjMyMHB4Ij48dGV4dCB4PSIyNSIgeT0iMjAiIGZvbnQtc2l6ZT0iMTIiIGZpbGw9InZhcigtLXBsb3R0ZXh0LCM0MjVjNzApIiBmb250LWZhbWlseT0iQXJpYWwiPkNMUCDCtyBFc2NhbGEgY29tw7puPC90ZXh0PjxsaW5lIHgxPSIzNSIgeTE9IiR7emVyb30iIHgyPSI3MjUiIHkyPSIke3plcm99IiBzdHJva2U9IiNhNmJiYzgiLz4ke2VudHJpZXMubWFwKChlLGkpPT57Y29uc3QgY2VudGVyPTIxMCtpKjM0MDtyZXR1cm4ga2V5cy5tYXAoKGtleSxqKT0+e2NvbnN0IHg9Y2VudGVyKyhqPzYyOi02Miksdj1OdW1iZXIoZS50b3RhbFtrZXldKXx8MDtyZXR1cm4gYDxyZWN0IHg9IiR7eC0zOH0iIHk9IiR7TWF0aC5taW4oeSh2KSx6ZXJvKX0iIHdpZHRoPSI3NiIgaGVpZ2h0PSIke01hdGguYWJzKHkodiktemVybyl9IiBmaWxsPSIke2NvbG9yW2tleV19IiByeD0iMyI+PHRpdGxlPiR7ZXNjKGUuc2NvcGUrJyDCtyAnK2UubmFtZSsnIMK3ICcrZS5wZXJpb2QrJyDCtyAnK21ldHJpY3Nba2V5XSsnOiAnK2ZtdCh2LGtleSkpfTwvdGl0bGU+PC9yZWN0Pjx0ZXh0IHg9IiR7eH0iIHk9IiR7dj49MD95KHYpLTk6eSh2KSsxOX0iIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZvbnQtZmFtaWx5PSJBcmlhbCIgZmlsbD0idmFyKC0tcGxvdHRleHQsIzQyNWM3MCkiPiR7ZXNjKGNvbXBhY3QodixrZXkpKX08L3RleHQ+PHRleHQgeD0iJHt4fSIgeT0iMjUyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmb250LWZhbWlseT0iQXJpYWwiIGZpbGw9InZhcigtLXBsb3R0ZXh0LCM0MjVjNzApIj4ke2VzYyhtZXRyaWNzW2tleV0pfTwvdGV4dD5gfSkuam9pbignJykrYDx0ZXh0IHg9IiR7Y2VudGVyfSIgeT0iMjgyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2IiBmb250LWZhbWlseT0iQXJpYWwiIGZpbGw9InZhcigtLXBsb3R0ZXh0LCM0MjVjNzApIj5TZWxlY2Npw7NuICR7ZS5zY29wZX08L3RleHQ+YH0pLmpvaW4oJycpfTwvc3ZnPjwvZGl2PmA7Cn0KY29uc3QgY29tcGFyZUJlZm9yZVYyMj1jb21wYXJlVmlldzsKY29tcGFyZVZpZXc9ZnVuY3Rpb24oKXsKIGNvbXBhcmVCZWZvcmVWMjIoKTsKIGNvbnN0IGVudHJpZXM9WydBJywnQiddLm1hcChzY29wZT0+e2NvbnN0IHM9dmlld1N0YXRlW3Njb3BlXSxyb3dzPXNsaWNlUm93cyhzLmZpbHRlcnMscy5mcm9tLHMudG8pO3JldHVybntzY29wZSxuYW1lOnMubmFtZSxwZXJpb2Q6c2VsZWN0ZWREYXRlVGV4dFY4KHNjb3BlKSx0b3RhbDphZ2cocm93cyksY291bnQ6cm93cy5sZW5ndGh9fSk7CiBjb25zdCBodG1sPWA8ZGl2IGNsYXNzPSJjYXJkIiBpZD0iY29tcGFyaXNvbkNoYXJ0c1YyMiI+PGgyPkNvaW4gSW4geSBXaW4gwrcgQ29tcGFyYWNpw7NuIEEgeSBCPC9oMj48ZGl2IGNsYXNzPSJsYWJlbGVkbGVnZW5kIj48cD5BenVsIG1hcmlubzogQ29pbiBJbiDCtyBUdXJxdWVzYTogV2luPC9wPiR7ZW50cmllcy5tYXAoZT0+YDxwPjxiPiR7ZS5zY29wZX06ICR7ZXNjKGUubmFtZSl9PC9iPiDCtyAke2VzYyhlLnBlcmlvZCl9JHtlLmNvdW50PycnOicgwrcgU2luIHJlZ2lzdHJvcyd9PC9wPmApLmpvaW4oJycpfTwvZGl2PiR7Y29tcGFyaXNvbkNvbWJpbmVkVjIyKGVudHJpZXMpfTxwIGNsYXNzPSJzaWduYWxub3RlIj5Ub3RhbGVzIGVuIENMUCBlbiB1bmEgbWlzbWEgZXNjYWxhLiBQYXJhIHBlcsOtb2RvcyBkZSBkaXN0aW50YSBkdXJhY2nDs24sIHJldmlzYSB0YW1iacOpbiBsb3MgaW5kaWNhZG9yZXMgZGlhcmlvcyBkZSBsYSB0YWJsYS48L3A+PC9kaXY+YDsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb250ZW50IC5jb21wYXJpc29uTm90ZScpLmluc2VydEFkamFjZW50SFRNTCgnYWZ0ZXJlbmQnLGh0bWwpOwp9OwoKY2FjaGVkPWFzeW5jIGZ1bmN0aW9uKCl7CiAkKCcjc3RhdHVzJykudGV4dENvbnRlbnQ9J1JlY3VwZXJhbmRvIGxhIG1hdHJpeiBwcml2YWRh4oCmJzsKIGNvbnN0IHJlc3VsdD1jbGVhbk1hdHJpeFY3KEpTT04ucGFyc2UoYXdhaXQgcnBjKCdnZXRNYXRyaXgnKSkpOwogaWYoIXJlc3VsdC5yb3dzPy5sZW5ndGgpdGhyb3cgRXJyb3IoJ0xhIG1hdHJpeiBubyBjb250aWVuZSByZWdpc3Ryb3MgYXBsaWNhYmxlcy4nKTtyZXR1cm4gcmVzdWx0Owp9OwovLyBGaXJzdCBpbXBvcnQgdXNlcyB0aGUgc2FtZSBhdXRoZW50aWNhdGVkIFJQQyBhbmQgUkxTIGFzIGxhdGVyIGFkbWluIHVwZGF0ZXMuCiQoJyNsb2dpbkZvcm1WMTUnKS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsJzxkZXRhaWxzIHN0eWxlPSJtYXJnaW4tdG9wOjE4cHgiPjxzdW1tYXJ5PkFkbWluaXN0cmFjacOzbjogaW1wb3J0YXIgaGlzdMOzcmljbyBpbmljaWFsPC9zdW1tYXJ5PjxwPkVzY3JpYmUgdXN1YXJpbyB5IGNvbnRyYXNlw7FhIGRlIGFkbWluaXN0cmFjacOzbiBhcnJpYmEsIHNlbGVjY2lvbmEgZWwgRXhjZWwgaGlzdMOzcmljbyBjb21wbGV0byB5IHB1bHNhIGVzdGUgYm90w7NuLiBWZXLDoXMgZWwgYXZhbmNlIHBvciBibG9xdWVzLjwvcD48aW5wdXQgaWQ9InNlZWRNYXRyaXhMQSIgdHlwZT0iZmlsZSIgYWNjZXB0PSIueGxzeCwuanNvbiI+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+KApic7CiAgIHRyeXthd2FpdCBzdXBhYmFzZVJlcXVlc3RMQSgnL3Jlc3QvdjEvcnBjL2xhX3Jlc3RvcmVfYmFja3VwJyx7bWV0aG9kOidQT1NUJyxib2R5OkpTT04uc3RyaW5naWZ5KHtwX2JhY2t1cDpidXR0b24uZGF0YXNldC5yZXN0b3JlYmFja3VwLHBfcmV2aXNpb246ZGF0YS5zdG9yYWdlUmV2aXNpb259KX0sYXBwU2Vzc2lvblYxNS50b2tlbik7ZGF0YT1hd2FpdCBjYWNoZWQoKTtkaWFsb2cuY2xvc2UoKTtkaWFsb2cucmVtb3ZlKCk7aW5pdCgpO30KICAgY2F0Y2goZXJyb3Ipe3N0YXR1cy50ZXh0Q29udGVudD1lcnJvci5tZXNzYWdlO2RpYWxvZy5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKS5mb3JFYWNoKGI9PmIuZGlzYWJsZWQ9ZmFsc2UpO30KICB9KTsKIH1jYXRjaChlcnJvcil7c3RhdHVzLnRleHRDb250ZW50PWVycm9yLnN0YXR1cz09PTQwND8nRmFsdGEgZWplY3V0YXIgcmVzcGFsZG9zLXY1LnNxbCBlbiBTdXBhYmFzZS4gUHVlZGVzIGRlc2NhcmdhciB1bmEgY29waWEgSlNPTiBtaWVudHJhcyB0YW50by4nOmVycm9yLm1lc3NhZ2U7fQp9CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ25hdiBidXR0b25bZGF0YS10YWI9Ik1ldG9kb2xvZ8OtYSJdJykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmViZWdpbicsJzxidXR0b24gZGF0YS10YWI9IkFsZXJ0YXMiPuKakSAmbmJzcDsgQWxlcnRhczwvYnV0dG9uPicpOwpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCduYXYgYnV0dG9uW2RhdGEtdGFiPSJBbGVydGFzIl0nKS5vbmNsaWNrPSgpPT5hY3RpdmF0ZVRhYlYzKCdBbGVydGFzJyk7CmNvbnN0IGV4cG9ydEJlZm9yZUV4cGVyaWVuY2VMQT0kKCcjdjJleHBvcnQnKS5vbmNsaWNrOwokKCcjdjJleHBvcnQnKS5vbmNsaWNrPWZ1bmN0aW9uKCl7aWYodGFiIT09J0FsZXJ0YXMnKXJldHVybiBleHBvcnRCZWZvcmVFeHBlcmllbmNlTEEoKTtkb3dubG9hZEJsb2JWOCh3b3JrYm9va0Jsb2JWOChbe25hbWU6J0FsZXJ0YXMnLHJvd3M6ZXhwb3J0Um93c30se25hbWU6J0NvbmZpZ3VyYWNpb24nLHJvd3M6W1snUGFyw6FtZXRybycsJ1ZhbG9yJ10sLi4uT2JqZWN0LmVudHJpZXMoYWxlcnRTZXR0aW5nc0xBKCkpLm1hcCgoW2ssdl0pPT5bayx0eXBlb2Ygdj09PSdvYmplY3QnP0pTT04uc3RyaW5naWZ5KHYpOnZdKSxbJ1ZlbnRhbmFzJyxKU09OLnN0cmluZ2lmeShhbGVydFJlcG9ydExBLndpbmRvd3MpXSxbJ1VuaWRhZGVzJywnQ0xQIG8gc3BpbnMgcG9yIG3DoXF1aW5hLWTDrWEgcmVnaXN0cmFkYSwgc2Vnw7puIGluZGljYWRvciddXX1dKSwnTEEtYWxlcnRhcy54bHN4Jyk7fTsKY29uc3QgcmVuZGVyQmVmb3JlRXhwZXJpZW5jZUxBPXJlbmRlcjsKcmVuZGVyPWZ1bmN0aW9uKCl7CiBpZihkYXRhJiZ0YWI9PT0nQWxlcnRhcycpe2Nsb3NlU3BhbmlzaENhbGVuZGFyTEEoZmFsc2UpO3JlbmRlckFsZXJ0c0xBKCk7Y29tcGFjdENvbnRyb2xzTEEoKTtkZWNvcmF0ZVNwYW5pc2hEYXRlc0xBKCk7fWVsc2UgcmVuZGVyQmVmb3JlRXhwZXJpZW5jZUxBKCk7CiBpZighZGF0YSlyZXR1cm47c2V0dXBFeHBlcmllbmNlSGVhZGVyTEEoKTsKIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXRhU3RhdHVzTEEnKT8ucmVtb3ZlKCk7Y29uc3Qgc3RhdHVzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO3N0YXR1cy5pZD0nZGF0YVN0YXR1c0xBJztzdGF0dXMuY2xhc3NOYW1lPSdkYXRhU3RhdHVzTEEnO3N0YXR1cy5pbm5lckhUTUw9ZGF0YVN0YXR1c0xBKCk7ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZGVyJykuYWZ0ZXIoc3RhdHVzKTsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb250ZW50IC5hY3RpdmVGaWx0ZXJzTEEnKT8ucmVtb3ZlKCk7JCgnI2NvbnRlbnQnKS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLGFjdGl2ZUZpbHRlcnNMQSgpKTtjb21wYXJpc29uTm9ybWFsaXplZExBKCk7ZW5oYW5jZVRhYmxlc0xBKCk7Cn07Cg==