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 · cumplimiento PPTO v18
Cerrar sesión
ENJOY LOS ÁNGELES / ANÁLISIS DE MÁQUINAS DE AZAR
Panorama de rendimiento
Explora el desempeño de tu parque de máquinas.
↑ Actualizar matriz
Leyendo matriz…
Desde
Hasta
Restablecer filtros
Guardar vista
Mis vistas guardadas
Agrupar por
Indicador
Evolución
Mensual
Semanal
Diaria
Referencia de ratios
Total del período, sin filtros de categorías
Salón de cada grupo
Selección filtrada
↓ Exportar consulta
CmZ1bmN0aW9uIGF4aXNQZXJpb2RWMTQobGFiZWwpewogY29uc3QgbT1TdHJpbmcobGFiZWwpLm1hdGNoKC9eKC4qPylccysoPzrCt1xzKik/KFxkezR9KSQvKTsKIHJldHVybiBtID8gZXNjKG1bMV0pKyc8dHNwYW4geD0iMCIgZHk9IjE3Ij4nK21bMl0rJzwvdHNwYW4+JyA6IGVzYyhsYWJlbCk7Cn0KZnVuY3Rpb24gYXhpc0RhdGVzVjE0KHJhbmdlKXsKIGNvbnN0IG1vbnRocz17ZW5lcm86JzAxJyxmZWJyZXJvOicwMicsbWFyem86JzAzJyxhYnJpbDonMDQnLG1heW86JzA1JyxqdW5pbzonMDYnLGp1bGlvOicwNycsYWdvc3RvOicwOCcsc2VwdGllbWJyZTonMDknLG9jdHVicmU6JzEwJyxub3ZpZW1icmU6JzExJyxkaWNpZW1icmU6JzEyJ307CiByZXR1cm4gU3RyaW5nKHJhbmdlKS5yZXBsYWNlKC8oXGR7MSwyfSkgKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmUpIFxkezR9L2csKG0sZCxtb250aCk9PmQucGFkU3RhcnQoMiwnMCcpKycvJyttb250aHNbbW9udGhdKS5yZXBsYWNlKCcg4oaSICcsJyDigJMgJyk7Cn0KY29uc3QgJD1zPT5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHMpLCBlc2M9cz0+U3RyaW5nKHM/PydTaW4gZGF0bycpLnJlcGxhY2UoL1smPD4iJ10vZyxjPT4oeycmJzonJmFtcDsnLCc8JzonJmx0OycsJz4nOicmZ3Q7JywnIic6JyZxdW90OycsIiciOicmIzM5Oyd9W2NdKSk7CmNvbnN0IGRpbXM9ezE6J03DoXF1aW5hJywyOidNYXJjYSAvIEZhYnJpY2FudGUnLDM6J1BsYXRhZm9ybWEnLDQ6J01vZGVsbyAvIEp1ZWdvJyw5OidCYW5jbyAvIEJsb3F1ZScsODonUG96byAvIElELVByb2cnLDU6J1NlY3RvciAvIFNlY2Npw7NuJyw3OidTYWzDs24nfTsKY29uc3QgbWV0cmljcz17d2luOidXaW4gb3BlcmFjaW9uYWwnLGNvaW46J0NvaW4gSW4nLHdkOidXaW4gLyBkw61hIHJlZ2lzdHJhZG8nLGNkOidDb2luIEluIC8gZMOtYSByZWdpc3RyYWRvJyxiZXQ6J0FwdWVzdGEgcHJvbWVkaW8nLHBvOidQYXlvdXQnLHBvbjonUGF5b3V0IGNvbiBOQ0MnLGRldjonRGVzdmlhY2nDs24gTkNDJyxzcGluOidTcGlucycsc2Q6J1NwaW5zIC8gZMOtYSByZWdpc3RyYWRvJyxyYXRpbzonUmF0aW8gQ29pbiBJbiAvIGTDrWEnLHJzOidSYXRpbyBzcGlucyAvIGTDrWEnLHJiOidSYXRpbyBhcHVlc3RhIHByb21lZGlvJyxvY2M6J09jdXBhY2nDs24gbWVkaWEnLHByaXplOidQcmVtaW9zJyxwcm9tbzonUHJvbW8gbmV0YSd9OwpsZXQgZGF0YSx0YWI9J1Jlc3VtZW4nLHBhZ2U9MCxzb3J0PSd3aW4nLGRlc2M9dHJ1ZSx0YWJsZVJvd3M9W10scXVlcnk9Jyc7CmNvbnN0IG51bT0odik9PnR5cGVvZiB2PT09J251bWJlcicmJk51bWJlci5pc0Zpbml0ZSh2KT92OjAsIGRpdj0oYSxiKT0+YT09bnVsbHx8Yj09bnVsbHx8Yj09PTA/bnVsbDphL2I7CmNvbnN0IGZtdD0odixrKT0+dj09bnVsbD8n4oCUJzpbJ3BvJywncG9uJywnZGV2Jywnb2NjJ10uaW5jbHVkZXMoayk/KHYqMTAwKS50b0xvY2FsZVN0cmluZygnZXMtQ0wnLHttYXhpbXVtRnJhY3Rpb25EaWdpdHM6Mn0pKyclJzpbJ3JhdGlvJywncnMnLCdyYiddLmluY2x1ZGVzKGspP3YudG9GaXhlZCgyKSsnw5cnOnYudG9Mb2NhbGVTdHJpbmcoJ2VzLUNMJyx7bWF4aW11bUZyYWN0aW9uRGlnaXRzOk1hdGguYWJzKHYpPDEwMD8yOjB9KTsKY29uc3QgY29tcGFjdD0odixrKT0+dj09bnVsbD8n4oCUJzpbJ3BvJywncG9uJywnZGV2Jywnb2NjJywncmF0aW8nLCdycycsJ3JiJ10uaW5jbHVkZXMoayk/Zm10KHYsayk6TWF0aC5hYnModik+PTFlNj8odi8xZTYpLnRvTG9jYWxlU3RyaW5nKCdlcy1DTCcse21heGltdW1GcmFjdGlvbkRpZ2l0czoxfSkrJyBNJzpmbXQodixrKTsKZnVuY3Rpb24gYWdnKHJvd3Mpe2xldCBhPXt3aW46MCxjb2luOjAsc3BpbjowLHByaXplOjAscHJvbW86MCxvYzowLG46MCxkYXlzOjB9LGRheXM9bmV3IFNldDtmb3IoY29uc3QgciBvZiByb3dzKXthLndpbis9bnVtKHJbMTZdKTthLmNvaW4rPW51bShyWzE4XSk7YS5zcGluKz1udW0oclsyMF0pO2EucHJpemUrPW51bShyWzE1XSk7YS5wcm9tbys9bnVtKHJbMjZdKS1udW0oclsyN10pO2lmKHR5cGVvZiByWzIyXT09PSdudW1iZXInKXthLm9jKz1yWzIyXTthLm4rK31pZihyWzFdIT1udWxsKWRheXMuYWRkKHJbMF0rJ3wnK3JbMV0pfWEuZGF5cz1kYXlzLnNpemU7YS53ZD1kaXYoYS53aW4sYS5kYXlzKTthLmNkPWRpdihhLmNvaW4sYS5kYXlzKTthLnNkPWRpdihhLnNwaW4sYS5kYXlzKTthLmJldD1kaXYoYS5jb2luLGEuc3Bpbik7YS5wbz1hLmNvaW4/MS1hLndpbi9hLmNvaW46bnVsbDthLnBvbj1hLmNvaW4/MS0oYS53aW4rYS5wcm9tbykvYS5jb2luOm51bGw7YS5kZXY9YS5wbz09bnVsbD9udWxsOmEucG8tYS5wb247YS5vY2M9ZGl2KGEub2MsYS5uKTtyZXR1cm4gYX0KZnVuY3Rpb24gc2VsZWN0ZWQoKXtyZXR1cm4gT2JqZWN0LmtleXMoZGltcykubWFwKGs9PlsrayxbLi4uJCgnI2YnK2spLnNlbGVjdGVkT3B0aW9uc10ubWFwKG89Pm8udmFsdWUpXSkuZmlsdGVyKHg9PnhbMV0ubGVuZ3RoKX0KZnVuY3Rpb24gZGF0ZWQoKXtyZXR1cm4gZGF0YS5yb3dzLmZpbHRlcihyPT4oISQoJyNmcm9tJykudmFsdWV8fHJbMF0+PSQoJyNmcm9tJykudmFsdWUpJiYoISQoJyN0bycpLnZhbHVlfHxyWzBdPD0kKCcjdG8nKS52YWx1ZSkpfQpmdW5jdGlvbiBmaWx0ZXJlZCgpe2xldCBzZWw9c2VsZWN0ZWQoKTtyZXR1cm4gZGF0ZWQoKS5maWx0ZXIocj0+c2VsLmV2ZXJ5KChbayx2XSk9PnYuaW5jbHVkZXMoU3RyaW5nKHJba10/PydTaW4gZGF0bycpKSkpfQpmdW5jdGlvbiBpbml0KCl7bGV0IGRhdGVzPWRhdGEucm93cy5tYXAocj0+clswXSkuc29ydCgpOyQoJyNmcm9tJykudmFsdWU9ZGF0ZXNbMF07JCgnI3RvJykudmFsdWU9ZGF0ZXMuYXQoLTEpOyQoJyNmaWx0ZXJzJykuaW5uZXJIVE1MPU9iamVjdC5lbnRyaWVzKGRpbXMpLm1hcCgoW2ssdl0pPT5gPGxhYmVsPiR7dn08c2VsZWN0IGlkPSJmJHtrfSIgbXVsdGlwbGUgYXJpYS1sYWJlbD0iJHt2fSI+JHtbLi4ubmV3IFNldChkYXRhLnJvd3MubWFwKHI9PlN0cmluZyhyW2tdPz8nU2luIGRhdG8nKSkpXS5maWx0ZXIodmFsdWU9PnZhbHVlLnRyaW0oKS50b0xvY2FsZVVwcGVyQ2FzZSgnZXMnKSE9PSdFWFBJUkFET1MnKS5zb3J0KChhLGIpPT5hLmxvY2FsZUNvbXBhcmUoYix1bmRlZmluZWQse251bWVyaWM6dHJ1ZX0pKS5tYXAodj0+YDxvcHRpb24gdmFsdWU9IiR7ZXNjKHYpfSI+JHtlc2Modil9PC9vcHRpb24+YCkuam9pbignJyl9PC9zZWxlY3Q+PC9sYWJlbD5gKS5qb2luKCcnKTskKCcjc3RhdHVzJykudGV4dENvbnRlbnQ9YCR7ZGF0YS5uYW1lfSDCtyAke2ZtdChkYXRhLnJvd3MubGVuZ3RoKX0gcmVnaXN0cm9zIMK3ICR7ZGF0ZXNbMF19IOKGkiAke2RhdGVzLmF0KC0xKX0gwrcgQ3RybC9DbWQgKyBjbGljIHBhcmEgc2VsZWNjacOzbiBtw7psdGlwbGVgOyQoJyNmb290JykudGV4dENvbnRlbnQ9J0RhdG9zIGFjdHVhbGl6YWRvcyBoYXN0YSAnK2RhdGVzLmF0KC0xKTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZmlsdGVycyBzZWxlY3QnKS5mb3JFYWNoKGU9PmUub25jaGFuZ2U9KCk9PntwYWdlPTA7cmVuZGVyKCl9KTtyZW5kZXIoKX0KZnVuY3Rpb24gZ3JvdXBzKHJvd3Msa2V5KXtsZXQgbT1uZXcgTWFwO2ZvcihsZXQgciBvZiByb3dzKXtsZXQgaz1rZXkocik7aWYoIW0uaGFzKGspKW0uc2V0KGssW10pO20uZ2V0KGspLnB1c2gocil9cmV0dXJuIFsuLi5tXS5tYXAoKFtuYW1lLHJvd3NdKT0+KHtuYW1lLHJvd3MsLi4uYWdnKHJvd3MpfSkpfQpmdW5jdGlvbiByYXRpb3MoYSxyZWYpe2EucmF0aW89ZGl2KGEuY2QscmVmLmNkKTthLnJzPWRpdihhLnNkLHJlZi5zZCk7YS5yYj1kaXYoYS5iZXQscmVmLmJldCk7cmV0dXJuIGF9CmZ1bmN0aW9uIGxlZ2FjeVJlbmRlcigpe2lmKCFkYXRhKXJldHVybjtsZXQgcm93cz1maWx0ZXJlZCgpLGJhc2U9ZGF0ZWQoKSxhPWFnZyhyb3dzKSxyZWZlcmVuY2U9YWdnKCQoJyNyZWYnKS52YWx1ZT09PSdmaWx0ZXJlZCc/cm93czpiYXNlKSxnPSskKCcjZ3JvdXAnKS52YWx1ZSxrPSQoJyNtZXRyaWMnKS52YWx1ZTtyYXRpb3MoYSxyZWZlcmVuY2UpO3RhYmxlUm93cz1ncm91cHMocm93cyxyPT5TdHJpbmcocltnXT8/J1NpbiBkYXRvJykpO2xldCBzYWxvbkNhY2hlPW5ldyBNYXA7Zm9yKGxldCBpdGVtIG9mIHRhYmxlUm93cyl7bGV0IHJlZj1yZWZlcmVuY2U7aWYoJCgnI3JlZicpLnZhbHVlPT09J3NhbG9uJyl7bGV0IHNhbG9ucz1bLi4ubmV3IFNldChpdGVtLnJvd3MubWFwKHI9PnJbN10pKV0uc29ydCgpLGtleT1KU09OLnN0cmluZ2lmeShzYWxvbnMpO2lmKCFzYWxvbkNhY2hlLmhhcyhrZXkpKXNhbG9uQ2FjaGUuc2V0KGtleSxhZ2coYmFzZS5maWx0ZXIocj0+c2Fsb25zLmluY2x1ZGVzKHJbN10pKSkpO3JlZj1zYWxvbkNhY2hlLmdldChrZXkpfXJhdGlvcyhpdGVtLHJlZil9JCgnI3RpdGxlJykudGV4dENvbnRlbnQ9KHtSZXN1bWVuOidQYW5vcmFtYSBkZSByZW5kaW1pZW50bycsQ29tcGFyYXRpdm9zOidDb21wYXJhdGl2b3MgZGVsIHBhcnF1ZScsRXZvbHVjacOzbjonRXZvbHVjacOzbiBkZSBpbmRpY2Fkb3JlcycsUmF0aW9zOidSYXRpb3MgZGUgcmVuZGltaWVudG8nLE1ldG9kb2xvZ8OtYTonQ8OhbGN1bG9zIHkgYWN0dWFsaXphY2nDs24nfSlbdGFiXTtpZih0YWI9PT0nTWV0b2RvbG9nw61hJyl7bWV0aG9kKCk7cmV0dXJufWxldCBjYXJkcz1bJ3dpbicsJ2NvaW4nLCdwbycsJ2JldCddOyQoJyNjb250ZW50JykuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJrcGlzIj4ke2NhcmRzLm1hcChrPT5gPGRpdiBjbGFzcz0iY2FyZCBrcGkiPjxzbWFsbD4ke21ldHJpY3Nba10udG9VcHBlckNhc2UoKX08L3NtYWxsPjxzdHJvbmc+JHtjb21wYWN0KGFba10sayl9PC9zdHJvbmc+PHNwYW4+JHtbJ3dpbicsJ2NvaW4nLCdiZXQnXS5pbmNsdWRlcyhrKT8nQ0xQIMK3ICc6Jyd9JHtrPT09J3BvJz8nQ2FsY3VsYWRvIHNvYnJlIHRvdGFsZXMnOmZtdChhLmRheXMpKycgbcOhcXVpbmFzLWTDrWEgcmVnaXN0cmFkYXMnfTwvc3Bhbj48L2Rpdj5gKS5qb2luKCcnKX08L2Rpdj4keyFyb3dzLmxlbmd0aD8nPGRpdiBjbGFzcz0iY2FyZCBlbXB0eSI+Tm8gaGF5IHJlZ2lzdHJvcyBwYXJhIGVzdGEgc2VsZWNjacOzbi4gQWp1c3RhIGxvcyBmaWx0cm9zLjwvZGl2Pic6YDxkaXYgY2xhc3M9ImNoYXJ0cyI+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPiR7dGFiPT09J1JhdGlvcyc/J1JlbmRpbWllbnRvIHJlbGF0aXZvJzonUmFua2luZyBwb3IgJyttZXRyaWNzW2tdfTwvaDI+PGRpdiBjbGFzcz0ic3VidGl0bGUiPiR7ZGltc1tnXX0gwrcgU2VsZWNjacOzbiBhY3R1YWwgwrcgVG9wIDg8L2Rpdj48ZGl2IGlkPSJiYXJzIj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+RXZvbHVjacOzbiBkZSAke21ldHJpY3Nba119PC9oMj48ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+JHskKCcjZ3JhaW4nKS5zZWxlY3RlZE9wdGlvbnNbMF0udGV4dH0gwrcgJHtzZWxlY3RlZERhdGVUZXh0VjgoJ2dsb2JhbCcpfTwvZGl2PjxkaXYgaWQ9ImxpbmUiPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImNhcmQiPjxkaXYgY2xhc3M9InRhYmxldG9wIj48ZGl2PjxoMj5EZXRhbGxlIGNvbXBhcmF0aXZvPC9oMj48c3BhbiBjbGFzcz0ic3VidGl0bGUiPk9yZGVuYSBkZXNkZSBsb3MgZW5jYWJlemFkb3MgwrcgUmF0aW9zOiAxw5cgPSByZWZlcmVuY2lhPC9zcGFuPjwvZGl2PjxpbnB1dCBpZD0ic2VhcmNoIiBwbGFjZWhvbGRlcj0iQnVzY2FyIGdydXBv4oCmIiB2YWx1ZT0iJHtlc2MocXVlcnkpfSI+PC9kaXY+PGRpdiBjbGFzcz0idGFibGV3cmFwIiBpZD0idGFibGUiPjwvZGl2PjxkaXYgY2xhc3M9InBhZ2VyIj48c3BhbiBpZD0iY291bnQiPjwvc3Bhbj48ZGl2PjxidXR0b24gaWQ9InByZXYiPuKGkDwvYnV0dG9uPiA8YnV0dG9uIGlkPSJuZXh0Ij7ihpI8L2J1dHRvbj48L2Rpdj48L2Rpdj48L2Rpdj5gfWA7aWYoIXJvd3MubGVuZ3RoKXJldHVybjtsZXQgcmFua2VkPVsuLi50YWJsZVJvd3NdLnNvcnQoKGEsYik9PihiW2tdPz8tSW5maW5pdHkpLShhW2tdPz8tSW5maW5pdHkpKS5zbGljZSgwLDgpLG1heD1NYXRoLm1heCguLi5yYW5rZWQubWFwKHI9Pk1hdGguYWJzKHJba118fDApKSwxKTskKCcjYmFycycpLmlubmVySFRNTD1yYW5rZWQubWFwKHI9PmA8ZGl2IGNsYXNzPSJiYXJyb3ciPjxzcGFuIGNsYXNzPSJiYXJsYWJlbCIgdGl0bGU9IiR7ZXNjKHIubmFtZSl9Ij4ke2VzYyhyLm5hbWUpfTwvc3Bhbj48ZGl2IGNsYXNzPSJ0cmFjayI+PGRpdiBjbGFzcz0iYmFyICR7cltrXTwwPyduZWdhdGl2ZSc6Jyd9IiBzdHlsZT0id2lkdGg6JHtNYXRoLm1heCgwLE1hdGguYWJzKHJba118fDApL21heCoxMDApfSUiPjwvZGl2PjwvZGl2PjxiPiR7Y29tcGFjdChyW2tdLGspfTwvYj48L2Rpdj5gKS5qb2luKCcnKTtsZXQgdHJlbmQ9Z3JvdXBzKHJvd3Mscj0+JCgnI2dyYWluJykudmFsdWU9PT0nbW9udGgnP3JbMF0uc2xpY2UoMCw3KTokKCcjZ3JhaW4nKS52YWx1ZT09PSd3ZWVrJz9yWzBdLnNsaWNlKDAsNCkrJyDCtyBTJytTdHJpbmcoclszMF0pLnBhZFN0YXJ0KDIsJzAnKTpyWzBdKS5zb3J0KChhLGIpPT5hLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTt0cmVuZC5mb3JFYWNoKHQ9PnJhdGlvcyh0LHJlZmVyZW5jZSkpO2xldCB2YWxzPXRyZW5kLm1hcCh0PT50W2tdKSxsbz1NYXRoLm1pbigwLC4uLnZhbHMuZmlsdGVyKHY9PnYhPW51bGwpKSxoaT1NYXRoLm1heCguLi52YWxzLmZpbHRlcih2PT52IT1udWxsKSwxKSxyYW5nZT1oaS1sb3x8MTskKCcjbGluZScpLmlubmVySFRNTD1gPHN2ZyB2aWV3Qm94PSIwIDAgNTAwIDIyMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJFdm9sdWNpw7NuIj48bGluZSB4MT0iMTAiIHkxPSIxODUiIHgyPSI0OTAiIHkyPSIxODUiIHN0cm9rZT0iI2RjZTdlOSIvPjxwb2x5bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiMxZDllOGQiIHN0cm9rZS13aWR0aD0iMyIgcG9pbnRzPSIke3RyZW5kLmZpbHRlcih0PT50W2tdIT1udWxsKS5tYXAodD0+YCR7MTArdHJlbmQuaW5kZXhPZih0KS9NYXRoLm1heCgxLHRyZW5kLmxlbmd0aC0xKSo0ODB9LCR7MTgwLSh0W2tdLWxvKS9yYW5nZSoxNTB9YCkuam9pbignICcpfSIvPiR7dHJlbmQubWFwKCh0LGkpPT5gPGNpcmNsZSBjeD0iJHsxMCtpL01hdGgubWF4KDEsdHJlbmQubGVuZ3RoLTEpKjQ4MH0iIGN5PSIke3Rba109PW51bGw/MTg1OjE4MC0odFtrXS1sbykvcmFuZ2UqMTUwfSIgcj0iMyIgZmlsbD0iIzFkOWU4ZCI+PHRpdGxlPiR7ZXNjKHQubmFtZSl9OiAke2ZtdCh0W2tdLGspfTwvdGl0bGU+PC9jaXJjbGU+YCkuam9pbignJyl9PHRleHQgeD0iMTAiIHk9IjIxNCIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzdiOTA5YiI+JHtlc2ModHJlbmRbMF0/Lm5hbWUpfTwvdGV4dD48dGV4dCB4PSI0OTAiIHk9IjIxNCIgdGV4dC1hbmNob3I9ImVuZCIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzdiOTA5YiI+JHtlc2ModHJlbmQuYXQoLTEpPy5uYW1lKX08L3RleHQ+PHRleHQgeD0iMTAiIHk9IjE0IiBmb250LXNpemU9IjExIiBmaWxsPSIjN2I5MDliIj5Nw6F4LiAke2NvbXBhY3QoaGksayl9PC90ZXh0Pjwvc3ZnPmA7JCgnI3NlYXJjaCcpLm9uaW5wdXQ9ZT0+e3F1ZXJ5PWUudGFyZ2V0LnZhbHVlO3BhZ2U9MDt0YWJsZSgpfTskKCcjcHJldicpLm9uY2xpY2s9KCk9PntwYWdlPU1hdGgubWF4KDAscGFnZS0xKTt0YWJsZSgpfTskKCcjbmV4dCcpLm9uY2xpY2s9KCk9PntpZigocGFnZSsxKSoyMDx2aXNpYmxlUm93cygpLmxlbmd0aClwYWdlKys7dGFibGUoKX07dGFibGUoKX0KZnVuY3Rpb24gdmlzaWJsZVJvd3MoKXtyZXR1cm4gdGFibGVSb3dzLmZpbHRlcihyPT5yLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKSkuc29ydCgoYSxiKT0+c29ydD09PSduYW1lJz8oZGVzYz8tMToxKSphLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpOihkZXNjPy0xOjEpKigoYVtzb3J0XT8/LUluZmluaXR5KS0oYltzb3J0XT8/LUluZmluaXR5KSkpfQpmdW5jdGlvbiB0YWJsZSgpe2xldCBjb2xzPXRhYj09PSdSYXRpb3MnP1snY2QnLCdzZCcsJ2JldCcsJ3JhdGlvJywncnMnLCdyYiddOlsnd2luJywnY29pbicsJ3dkJywncG8nLCdwb24nLCdiZXQnLCdzcGluJywncmF0aW8nXTtsZXQgYWxsPXZpc2libGVSb3dzKCk7JCgnI3RhYmxlJykuaW5uZXJIVE1MPWA8dGFibGU+PHRoZWFkPjx0cj48dGggZGF0YS1rPSJuYW1lIj4ke2RpbXNbJCgnI2dyb3VwJykudmFsdWVdfSDihpU8L3RoPiR7Y29scy5tYXAoaz0+YDx0aCBkYXRhLWs9IiR7a30iPiR7bWV0cmljc1trXX0g4oaVPC90aD5gKS5qb2luKCcnKX08L3RyPjwvdGhlYWQ+PHRib2R5PiR7YWxsLnNsaWNlKHBhZ2UqMjAscGFnZSoyMCsyMCkubWFwKHI9PmA8dHI+PHRkPiR7ZXNjKHIubmFtZSl9PC90ZD4ke2NvbHMubWFwKGs9PmA8dGQ+JHtbJ3JhdGlvJywncnMnLCdyYiddLmluY2x1ZGVzKGspP2A8c3BhbiBkYXRhLXJhdGlvLXY2PSIke3Jba10/PycnfSIgY2xhc3M9InBpbGwgJHtyW2tdPDE/J2xvdyc6Jyd9Ij4ke2ZtdChyW2tdLGspfTwvc3Bhbj5gOmZtdChyW2tdLGspfTwvdGQ+YCkuam9pbignJyl9PC90cj5gKS5qb2luKCcnKX08L3Rib2R5PjwvdGFibGU+YDskKCcjY291bnQnKS50ZXh0Q29udGVudD1gJHthbGwubGVuZ3RofSBncnVwb3MgwrcgUMOhZ2luYSAke3BhZ2UrMX0gZGUgJHtNYXRoLm1heCgxLE1hdGguY2VpbChhbGwubGVuZ3RoLzIwKSl9YDtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0aCcpLmZvckVhY2godGg9PnRoLm9uY2xpY2s9KCk9PntkZXNjPXNvcnQ9PT10aC5kYXRhc2V0Lms/IWRlc2M6dHJ1ZTtzb3J0PXRoLmRhdGFzZXQuazt0YWJsZSgpfSl9CmZ1bmN0aW9uIG1ldGhvZCgpeyQoJyNjb250ZW50JykuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJub3RpY2UiPkFjdHVhbGl6YSBjb24gdW4gRXhjZWwgLnhsc3ggcXVlIGluY2x1eWEgbGEgcGVzdGHDsWEgTWF0cml6IHkgbG9zIG1pc21vcyBlbmNhYmV6YWRvcy4gTGEgY2FyZ2EgcGVybWl0ZSBhY3R1YWxpemFyIGTDrWFzIHJlY2liaWRvcyBvIHJlZW1wbGF6YXIgdG9kbyBlbCBoaXN0w7NyaWNvOyByZXZpc2EgbGEgdmlzdGEgcHJldmlhLiBHdWFyZGEgZWwgRXhjZWwgZW4gc3UgYXBsaWNhY2nDs24gYW50ZXMgZGUgY2FyZ2FybG8gcGFyYSBhY3R1YWxpemFyIGxvcyByZXN1bHRhZG9zIGRlIHN1cyBmw7NybXVsYXMuPC9kaXY+PGRpdiBjbGFzcz0iZm9ybXVsYXMiPiR7W1snV2luIG9wZXJhY2lvbmFsJywnU1VNQShNYXRyaXohUTpRKScsJ1NlIHVzYSBsYSBwcmltZXJhIGNvbHVtbmEgV2luIChRKS4gTGEgc2VndW5kYSwgWCwgY29ycmVzcG9uZGUgYSBvdHJvIHZhbG9yIGRlbCBhcmNoaXZvIHkgbm8gc2UgbWV6Y2xhLiddLFsnUGF5b3V0IHkgTkNDJywnUE8gPSAxIOKIkiBXaW4gLyBDb2luIEluPGJyPlBPIE5DQyA9IDEg4oiSIChXaW4gKyBQcm9tbyBuZXRhKSAvIENvaW4gSW48YnI+RGVzdmlhY2nDs24gPSBQTyDiiJIgUE8gTkNDJywnUmVwbGljYSBsYXMgZsOzcm11bGFzIGRlIFJlcG9ydGUgU2VtYW5hIHkgUmVwb3J0ZSBNZXMuIFByb21vIG5ldGEgPSBQcm9tbyBJbiDiiJIgUHJvbW8gT3V0LiddLFsnQXB1ZXN0YSBwcm9tZWRpbycsJ1NVTUEoQ29pbiBJbikgLyBTVU1BKFNwaW4pJywnU2UgY2FsY3VsYSBzb2JyZSB0b3RhbGVzOyBubyBlcyBlbCBwcm9tZWRpbyBkZSBhcHVlc3RhcyBkZSBjYWRhIGZpbGEuJ10sWydSZW5kaW1pZW50byBkaWFyaW8nLCdDb2luIEluIC8gbcOhcXVpbmFzLWTDrWEgcmVnaXN0cmFkYXM8YnI+V2luIC8gbcOhcXVpbmFzLWTDrWEgcmVnaXN0cmFkYXM8YnI+U3BpbnMgLyBtw6FxdWluYXMtZMOtYSByZWdpc3RyYWRhcycsJ0NhZGEgY29tYmluYWNpw7NuIMO6bmljYSBkZSBmZWNoYSB5IG3DoXF1aW5hIGN1ZW50YSB1bmEgdmV6LiBObyBzZSBpbXB1dGFuIGTDrWFzIHNpbiByZWdpc3Ryby4nXSxbJ1JhdGlvcyBjb21wYXJhdGl2b3MnLCdSYXRpbyBDSSA9IENJIGRpYXJpbyBkZWwgZ3J1cG8gLyBDSSBkaWFyaW8gZGUgcmVmZXJlbmNpYTxicj5SYXRpbyBTcGlucyA9IFNwaW5zIGRpYXJpb3MgLyBTcGlucyBkaWFyaW9zIGRlIHJlZmVyZW5jaWE8YnI+UmF0aW8gQXB1ZXN0YSA9IEFwdWVzdGEgcHJvbWVkaW8gLyBBcHVlc3RhIGRlIHJlZmVyZW5jaWEnLCdJbnNwaXJhZG8gZW4gUmF0aW8uIFJlZmVyZW5jaWEgY29uZmlndXJhYmxlOiB0b3RhbCBkZWwgcGVyw61vZG8sIHNhbMOzbiBvIHNlbGVjY2nDs24gZmlsdHJhZGEuIEVuIGdydXBvcyBkZSB2YXJpb3Mgc2Fsb25lcyBzZSB1c2Egc3UgY29uanVudG8uIExhIHNlcmllIHRlbXBvcmFsIGRlIHJhdGlvcyB1c2EgbGEgcmVmZXJlbmNpYSBkZWwgcGVyw61vZG8gY29tcGxldG8uJ10sWydGaWx0cm9zIHkgcGVyc2lzdGVuY2lhJywnQmFuY28gPSBCbG9xdWUgwrcgUG96byA9IElELVByb2c8YnI+U2VjdG9yID0gU2VjY2nDs24gwrcgTWFyY2EgPSBGYWJyaWNhbnRlJywnRXN0YXMgZXF1aXZhbGVuY2lhcyBzb24gc3VwdWVzdG9zIHZpc2libGVzLiBMYXMgdmlzdGFzIHkgbGEgbWF0cml6IHNlIGd1YXJkYW4gZW4gR29vZ2xlLiBBbCBhYnJpciBsYSB3ZWIgZGVzZGUgb3RybyBkaXNwb3NpdGl2byBzZSBjYXJnYSBsYSDDumx0aW1hIG1hdHJpeiBndWFyZGFkYS4gUmVjYXJnYSBsYSBww6FnaW5hIHBhcmEgdmVyIGNhbWJpb3MgaGVjaG9zIGVuIG90cmEgc2VzacOzbi4nXSxbJ0NhbGlkYWQgZGUgZGF0b3MnLCdTaW4gZGVub21pbmFkb3Ig4oaSIOKAlDxicj5PY3VwYWNpw7NuID0gcHJvbWVkaW8gZGUgY2VsZGFzIG51bcOpcmljYXMgZGUgJSBPY3VwJywnU2UgaW5jbHV5ZW4gdG9kb3MgbG9zIHJlZ2lzdHJvcyBkZSBNYXRyaXosIHRhbWJpw6luIGFqdXN0ZXMgeSBjYXRlZ29yw61hcyBzaW4gZGF0by4gTm8gc2UgZWxpbWluYW4gZHVwbGljYWRvcyBhdXRvbcOhdGljYW1lbnRlLiBMb3MgaW1wb3J0ZXMgZXN0w6FuIGVuIENMUCwgbm8gZW4gbWlsbG9uZXMgc2Fsdm8gcXVlIHNlIGluZGlxdWUgTS4nXSxbJ0bDs3JtdWxhcyBkZWwgRXhjZWwnLCdTZSBsZWVuIHJlc3VsdGFkb3MgZ3VhcmRhZG9zLCBubyBzZSBlamVjdXRhbiBmw7NybXVsYXMgYXJiaXRyYXJpYXMnLCdTZSByZWN1cGVyYW4gZGVzY3JpcGNpb25lcyBkZXNkZSBKdWVnb3MgY3VhbmRvIGZhbHRhbiByZXN1bHRhZG9zIGRlIGLDunNxdWVkYS4gU2VtYW5hIHNpZ3VlIFdFRUtOVU0oZmVjaGEsMikuIFNpIGZhbHRhbiByZXN1bHRhZG9zIG51bcOpcmljb3MgbmVjZXNhcmlvcywgbGEgY2FyZ2Egc2UgcmVjaGF6YS4nXV0ubWFwKChbaCxmLHBdKT0+YDxkaXYgY2xhc3M9ImNhcmQiPjxoMj4ke2h9PC9oMj48ZGl2IGNsYXNzPSJmb3JtdWxhIj4ke2Z9PC9kaXY+PHA+JHtwfTwvcD48L2Rpdj5gKS5qb2luKCcnKX08L2Rpdj5gfQpmdW5jdGlvbiBycGMobmFtZSwuLi5hcmdzKXtyZXR1cm4gbmV3IFByb21pc2UoKG9rLG5vKT0+Z29vZ2xlLnNjcmlwdC5ydW4ud2l0aFN1Y2Nlc3NIYW5kbGVyKG9rKS53aXRoRmFpbHVyZUhhbmRsZXIobm8pW25hbWVdKC4uLmFyZ3MpKX0KYXN5bmMgZnVuY3Rpb24gY2FjaGVkKCl7cmV0dXJuIEpTT04ucGFyc2UoYXdhaXQgcnBjKCdnZXRNYXRyaXgnKSl9CmFzeW5jIGZ1bmN0aW9uIHBlcnNpc3Qodil7YXdhaXQgcnBjKCdzYXZlTWF0cml4JyxKU09OLnN0cmluZ2lmeSh2KSl9CmxldCBzYXZlZFZpZXdzPVtdOwphc3luYyBmdW5jdGlvbiBzeW5jVmlld3MoKXthd2FpdCBycGMoJ3NhdmVWaWV3cycsSlNPTi5zdHJpbmdpZnkoc2F2ZWRWaWV3cykpfQokKCcjbmF2JykuaW5uZXJIVE1MPVsnUmVzdW1lbicsJ0NvbXBhcmF0aXZvcycsJ0V2b2x1Y2nDs24nLCdSYXRpb3MnLCdNZXRvZG9sb2fDrWEnXS5tYXAoKHQsaSk9PmA8YnV0dG9uIGNsYXNzPSIke2k/Jyc6J2FjdGl2ZSd9Ij4ke1sn4perJywn4pakJywn4oaXJywn4peOJywn4pOYJ11baV19ICZuYnNwOyAke3R9PC9idXR0b24+YCkuam9pbignJyk7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbmF2IGJ1dHRvbicpLmZvckVhY2goYj0+Yi5vbmNsaWNrPSgpPT57dGFiPWIudGV4dENvbnRlbnQudHJpbSgpLnNwbGl0KC9ccysvKS5hdCgtMSk7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbmF2IGJ1dHRvbicpLmZvckVhY2goZT0+ZS5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLGU9PT1iKSk7aWYodGFiPT09J1JhdGlvcycpJCgnI21ldHJpYycpLnZhbHVlPSdyYXRpbyc7cGFnZT0wO3JlbmRlcigpfSk7JCgnI2dyb3VwJykuaW5uZXJIVE1MPU9iamVjdC5lbnRyaWVzKGRpbXMpLm1hcCgoW2ssdl0pPT5gPG9wdGlvbiB2YWx1ZT0iJHtrfSI+JHt2fTwvb3B0aW9uPmApLmpvaW4oJycpOyQoJyNncm91cCcpLnZhbHVlPScyJzskKCcjbWV0cmljJykuaW5uZXJIVE1MPU9iamVjdC5lbnRyaWVzKG1ldHJpY3MpLm1hcCgoW2ssdl0pPT5gPG9wdGlvbiB2YWx1ZT0iJHtrfSI+JHt2fTwvb3B0aW9uPmApLmpvaW4oJycpO1snZ3JvdXAnLCdtZXRyaWMnLCdncmFpbicsJ3JlZicsJ2Zyb20nLCd0byddLmZvckVhY2goaWQ9PiQoJyMnK2lkKS5vbmNoYW5nZT0oKT0+e3BhZ2U9MDtyZW5kZXIoKX0pOyQoJyNyZXNldCcpLm9uY2xpY2s9KCk9PntxdWVyeT0nJztwYWdlPTA7aW5pdCgpfTsKZnVuY3Rpb24gbG9hZFZpZXdzKCl7bGV0IHY9c2F2ZWRWaWV3czskKCcjdmlld3MnKS5pbm5lckhUTUw9JzxvcHRpb24gdmFsdWU9IiI+TWlzIHZpc3RhcyBndWFyZGFkYXM8L29wdGlvbj4nK3YubWFwKCh4LGkpPT5gPG9wdGlvbiB2YWx1ZT0iJHtpfSI+JHtlc2MoeC5uYW1lKX08L29wdGlvbj5gKS5qb2luKCcnKX0kKCcjc2F2ZScpLm9uY2xpY2s9KCk9PntsZXQgbmFtZT1wcm9tcHQoJ05vbWJyZSBkZSBsYSB2aXN0YScpO2lmKCFuYW1lKXJldHVybjtsZXQgdj1zYXZlZFZpZXdzO3YucHVzaCh7bmFtZSxzZWw6c2VsZWN0ZWQoKSxzZXR0aW5nczpPYmplY3QuZnJvbUVudHJpZXMoWydmcm9tJywndG8nLCdncm91cCcsJ21ldHJpYycsJ2dyYWluJywncmVmJ10ubWFwKGs9PltrLCQoJyMnK2spLnZhbHVlXSkpfSk7c2F2ZWRWaWV3cz12O3N5bmNWaWV3cygpLnRoZW4obG9hZFZpZXdzKS5jYXRjaChlPT5hbGVydCgnTm8gc2UgZ3VhcmTDsyBsYSB2aXN0YTogJytlLm1lc3NhZ2UpKX07JCgnI3ZpZXdzJykub25jaGFuZ2U9KCk9PntpZigkKCcjdmlld3MnKS52YWx1ZT09PScnKXJldHVybjtsZXQgdj1zYXZlZFZpZXdzWyQoJyN2aWV3cycpLnZhbHVlXTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZmlsdGVycyBvcHRpb24nKS5mb3JFYWNoKG89Pm8uc2VsZWN0ZWQ9ZmFsc2UpO3Yuc2VsLmZvckVhY2goKFtrLHZhbHNdKT0+Wy4uLiQoJyNmJytrKS5vcHRpb25zXS5mb3JFYWNoKG89Pm8uc2VsZWN0ZWQ9dmFscy5pbmNsdWRlcyhvLnZhbHVlKSkpO09iamVjdC5lbnRyaWVzKHYuc2V0dGluZ3MpLmZvckVhY2goKFtrLHZdKT0+JCgnIycraykudmFsdWU9dik7cGFnZT0wO3JlbmRlcigpfTskKCcjZXhwb3J0Jykub25jbGljaz0oKT0+e2xldCBrZXlzPVsnd2luJywnY29pbicsJ3dkJywnY2QnLCdwbycsJ3BvbicsJ2JldCcsJ3NwaW4nLCdyYXRpbycsJ3JzJywncmInXSxjc3Y9J1x1ZmVmZicrW1tkaW1zWyQoJyNncm91cCcpLnZhbHVlXSwuLi5rZXlzLm1hcChrPT5tZXRyaWNzW2tdKV0sLi4udmlzaWJsZVJvd3MoKS5tYXAocj0+W3IubmFtZSwuLi5rZXlzLm1hcChrPT5yW2tdPz8nJyldKV0ubWFwKHJvdz0+cm93Lm1hcCh2PT4nIicrU3RyaW5nKHYpLnJlcGxhY2UoLyIvZywnIiInKSsnIicpLmpvaW4oJzsnKSkuam9pbignXHJcbicpO2xldCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTthLmhyZWY9VVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbY3N2XSx7dHlwZTondGV4dC9jc3Y7Y2hhcnNldD11dGYtOCd9KSk7YS5kb3dubG9hZD0nY29uc3VsdGEtbWFxdWluYXMuY3N2JzthLmNsaWNrKCk7c2V0VGltZW91dCgoKT0+VVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpLDEwMDApfTsKLy8gTWluaW1hbCBaSVAvWE1MIHJlYWRlcjogWExTWCBpcyBhIFpJUCBvZiBYTUwgZG9jdW1lbnRzLiBObyBleHRlcm5hbCBzY3JpcHRzLgphc3luYyBmdW5jdGlvbiByZWFkWGxzeChmaWxlKXtsZXQgYnVmPWF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKTtpZihidWYuYnl0ZUxlbmd0aDwyMil0aHJvdyBFcnJvcignQXJjaGl2byBYTFNYIG5vIHbDoWxpZG8nKTtsZXQgdmlldz1uZXcgRGF0YVZpZXcoYnVmKSx1PW5ldyBVaW50OEFycmF5KGJ1ZiksZW5kPXUubGVuZ3RoLTIyO3doaWxlKGVuZD49TWF0aC5tYXgoMCx1Lmxlbmd0aC02NTU1NykmJnZpZXcuZ2V0VWludDMyKGVuZCx0cnVlKSE9PTB4MDYwNTRiNTApZW5kLS07aWYoZW5kPE1hdGgubWF4KDAsdS5sZW5ndGgtNjU1NTcpKXRocm93IEVycm9yKCdBcmNoaXZvIFhMU1ggbm8gdsOhbGlkbycpO2xldCBwb3M9dmlldy5nZXRVaW50MzIoZW5kKzE2LHRydWUpLGNvdW50PXZpZXcuZ2V0VWludDE2KGVuZCsxMCx0cnVlKSxlbnRyaWVzPXt9O2ZvcihsZXQgaT0wO2k8Y291bnQ7aSsrKXtpZih2aWV3LmdldFVpbnQzMihwb3MsdHJ1ZSkhPT0weDAyMDE0YjUwKXRocm93IEVycm9yKCdEaXJlY3RvcmlvIFpJUCBpbnbDoWxpZG8nKTtsZXQgbWV0aG9kPXZpZXcuZ2V0VWludDE2KHBvcysxMCx0cnVlKSxzaXplPXZpZXcuZ2V0VWludDMyKHBvcysyMCx0cnVlKSxubD12aWV3LmdldFVpbnQxNihwb3MrMjgsdHJ1ZSksZWw9dmlldy5nZXRVaW50MTYocG9zKzMwLHRydWUpLGNsPXZpZXcuZ2V0VWludDE2KHBvcyszMix0cnVlKSxvZmZzZXQ9dmlldy5nZXRVaW50MzIocG9zKzQyLHRydWUpLG5hbWU9bmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHUuc2xpY2UocG9zKzQ2LHBvcys0NitubCkpO2VudHJpZXNbbmFtZV09e21ldGhvZCxzaXplLG9mZnNldH07cG9zKz00NitubCtlbCtjbH1hc3luYyBmdW5jdGlvbiB4bWwobmFtZSl7bGV0IGU9ZW50cmllc1tuYW1lXTtpZighZSlyZXR1cm4gbnVsbDtsZXQgb2ZmPWUub2Zmc2V0KzMwK3ZpZXcuZ2V0VWludDE2KGUub2Zmc2V0KzI2LHRydWUpK3ZpZXcuZ2V0VWludDE2KGUub2Zmc2V0KzI4LHRydWUpLGJ5dGVzPXUuc2xpY2Uob2ZmLG9mZitlLnNpemUpO2xldCB0ZXh0PWUubWV0aG9kPT09MD9uZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoYnl0ZXMpOmUubWV0aG9kPT09OD9hd2FpdCBuZXcgUmVzcG9uc2UobmV3IEJsb2IoW2J5dGVzXSkuc3RyZWFtKCkucGlwZVRocm91Z2gobmV3IERlY29tcHJlc3Npb25TdHJlYW0oJ2RlZmxhdGUtcmF3JykpKS50ZXh0KCk6bnVsbDtpZih0ZXh0PT1udWxsKXRocm93IEVycm9yKCdDb21wcmVzacOzbiBubyBjb21wYXRpYmxlJyk7cmV0dXJuIG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcodGV4dCwnYXBwbGljYXRpb24veG1sJyl9CmxldCBzaGFyZWQ9YXdhaXQgeG1sKCd4bC9zaGFyZWRTdHJpbmdzLnhtbCcpLHN0cmluZ3M9c2hhcmVkP1suLi5zaGFyZWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NpJyldLm1hcChuPT5bLi4ubi5nZXRFbGVtZW50c0J5VGFnTmFtZSgndCcpXS5tYXAodD0+dC50ZXh0Q29udGVudCkuam9pbignJykpOltdO3NoYXJlZD1udWxsO2xldCB3b3JrYm9vaz1hd2FpdCB4bWwoJ3hsL3dvcmtib29rLnhtbCcpLHJlbHM9YXdhaXQgeG1sKCd4bC9fcmVscy93b3JrYm9vay54bWwucmVscycpLHRhcmdldHM9e307Wy4uLnJlbHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ1JlbGF0aW9uc2hpcCcpXS5mb3JFYWNoKHI9PnRhcmdldHNbci5nZXRBdHRyaWJ1dGUoJ0lkJyldPXIuZ2V0QXR0cmlidXRlKCdUYXJnZXQnKSk7YXN5bmMgZnVuY3Rpb24gc2hlZXQobmFtZSl7bGV0IHM9Wy4uLndvcmtib29rLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzaGVldCcpXS5maW5kKHM9PnMuZ2V0QXR0cmlidXRlKCduYW1lJykudHJpbSgpLnRvTG93ZXJDYXNlKCk9PT1uYW1lLnRvTG93ZXJDYXNlKCkpO2lmKCFzKXJldHVybiBudWxsO2xldCBwYXRoPXRhcmdldHNbcy5nZXRBdHRyaWJ1dGUoJ3I6aWQnKV07cGF0aD1wYXRoLnN0YXJ0c1dpdGgoJy8nKT9wYXRoLnNsaWNlKDEpOid4bC8nK3BhdGg7bGV0IGRvYz1hd2FpdCB4bWwocGF0aCk7cmV0dXJuIFsuLi5kb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3JvdycpXS5tYXAocm93PT57bGV0IGE9W107Zm9yKGxldCBjIG9mIHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYycpKXtsZXQgY29sPWMuZ2V0QXR0cmlidXRlKCdyJykubWF0Y2goL1tBLVpdKy8pWzBdLGlkeD0wO2ZvcihsZXQgY2ggb2YgY29sKWlkeD1pZHgqMjYrY2guY2hhckNvZGVBdCgwKS02NDtsZXQgdj1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2JylbMF0/LnRleHRDb250ZW50LHQ9Yy5nZXRBdHRyaWJ1dGUoJ3QnKTthW2lkeC0xXT10PT09J3MnP3N0cmluZ3NbK3ZdOnQ9PT0naW5saW5lU3RyJz9bLi4uYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgndCcpXS5tYXAodD0+dC50ZXh0Q29udGVudCkuam9pbignJyk6dD09PSdlJz92OnY9PW51bGw/bnVsbDp0PT09J3N0cic/djpOdW1iZXIodil9cmV0dXJuIGF9KX1yZXR1cm4gbm9ybWFsaXplV29ya2Jvb2soYXdhaXQgc2hlZXQoJ01hdHJpeicpLGF3YWl0IHNoZWV0KCdKdWVnb3MnKSxmaWxlLm5hbWUsWycxJywndHJ1ZSddLmluY2x1ZGVzKHdvcmtib29rLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd3b3JrYm9va1ByJylbMF0/LmdldEF0dHJpYnV0ZSgnZGF0ZTE5MDQnKSksYXdhaXQgc2hlZXQoJ1VUSUxJREFEIFJFU1VNRU4nKSk7fQokKCcjZmlsZScpLm9uY2hhbmdlPWFzeW5jIGU9PntsZXQgZj1lLnRhcmdldC5maWxlc1swXTtpZighZilyZXR1cm47JCgnI3N0YXR1cycpLnRleHRDb250ZW50PSdMZXllbmRvICcrZi5uYW1lKyfigKYnO3RyeXtsZXQgbmV4dD1hd2FpdCByZWFkWGxzeChmKTthd2FpdCBwZXJzaXN0KG5leHQpO2RhdGE9bmV4dDtwYWdlPTA7cXVlcnk9Jyc7aW5pdCgpOyQoJyNzdGF0dXMnKS50ZXh0Q29udGVudCs9JyDCtyBHdWFyZGFkYSBlbiBTdXBhYmFzZSDCtyBEaXNwb25pYmxlIGVuIHR1cyBkaXNwb3NpdGl2b3MnfWNhdGNoKGVycil7JCgnI3N0YXR1cycpLnRleHRDb250ZW50PSdObyBzZSBjYW1iacOzIGxhIG1hdHJpejogJytlcnIubWVzc2FnZX1maW5hbGx5e2UudGFyZ2V0LnZhbHVlPScnfX07Ci8vIFYyOiBpbmRlcGVuZGVudCBhbmFseXRpY2FsIHZpZXdzIGFuZCBjb21wYXJpc29uIHBlcmlvZHMuCmNvbnN0IHZpZXdTdGF0ZT17CiAgQTp7bmFtZTonU2VsZWNjacOzbiBBJyxmcm9tOicnLHRvOicnLGZpbHRlcnM6e319LAogIEI6e25hbWU6J1NlbGVjY2nDs24gQicsZnJvbTonJyx0bzonJyxmaWx0ZXJzOnt9fSwKICBldm9sdXRpb246e2ZpbHRlcnM6e30sbWV0cmljOid3aW4nLGdyYWluOidtb250aCcsc2VyaWVzOid0b3RhbCd9LAogIHJhdGlvczp7ZmlsdGVyczp7fSxncm91cDonMScsbWV0cmljOidyYXRpbycscmVmZXJlbmNlOidhbGwnfQp9OwpsZXQgZXhwb3J0Um93cz1bXTsKY29uc3QgaXNFeHBpcmVkPXY9PlN0cmluZyh2Pz8nJykudHJpbSgpLnRvTG9jYWxlVXBwZXJDYXNlKCdlcycpPT09J0VYUElSQURPUyc7CmxldCBvcHRpb25zRm9yPWs9PlsuLi5uZXcgU2V0KGRhdGEucm93cy5tYXAocj0+U3RyaW5nKHJba10/PydTaW4gZGF0bycpKSldLmZpbHRlcih2PT4haXNFeHBpcmVkKHYpKS5zb3J0KChhLGIpPT5hLmxvY2FsZUNvbXBhcmUoYix1bmRlZmluZWQse251bWVyaWM6dHJ1ZX0pKTsKY29uc3QgZGF0ZVJhbmdlPSgpPT57Y29uc3QgZGF0ZXM9ZGF0YS5yb3dzLm1hcChyPT5yWzBdKS5zb3J0KCk7cmV0dXJuW2RhdGVzWzBdLGRhdGVzLmF0KC0xKV19OwpmdW5jdGlvbiBzbGljZVJvd3MoZmlsdGVycz17fSxmcm9tPSQoJyNmcm9tJykudmFsdWUsdG89JCgnI3RvJykudmFsdWUpewogcmV0dXJuIGRhdGEucm93cy5maWx0ZXIocj0+KCFmcm9tfHxyWzBdPj1mcm9tKSYmKCF0b3x8clswXTw9dG8pJiZPYmplY3QuZW50cmllcyhmaWx0ZXJzKS5ldmVyeSgoW2ssdmFsc10pPT4hdmFscy5sZW5ndGh8fHZhbHMuaW5jbHVkZXMoU3RyaW5nKHJba10/PydTaW4gZGF0bycpKSkpOwp9CmZ1bmN0aW9uIGZpbHRlckZpZWxkcyhzdGF0ZSxwcmVmaXgsa2V5cz1PYmplY3Qua2V5cyhkaW1zKSl7CiByZXR1cm4ga2V5cy5tYXAoaz0+YDxsYWJlbD4ke2RpbXNba119PHNlbGVjdCBtdWx0aXBsZSBkYXRhLWZpbHRlcj0iJHtrfSIgZGF0YS1vd25lcj0iJHtwcmVmaXh9Ij4ke29wdGlvbnNGb3IoaykubWFwKHY9PmA8b3B0aW9uIHZhbHVlPSIke2VzYyh2KX0iICR7KHN0YXRlLmZpbHRlcnNba118fFtdKS5pbmNsdWRlcyh2KT8nc2VsZWN0ZWQnOicnfT4ke2VzYyh2KX08L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48L2xhYmVsPmApLmpvaW4oJycpOwp9CmZ1bmN0aW9uIHNlbGVjdG9yKGxhYmVsLGlkLHZhbHVlLG9wdGlvbnMpe3JldHVybiBgPGxhYmVsPiR7bGFiZWx9PHNlbGVjdCBpZD0iJHtpZH0iPiR7T2JqZWN0LmVudHJpZXMob3B0aW9ucykubWFwKChbayx2XSk9PmA8b3B0aW9uIHZhbHVlPSIke2t9IiAke1N0cmluZyh2YWx1ZSk9PT1TdHJpbmcoayk/J3NlbGVjdGVkJzonJ30+JHt2fTwvb3B0aW9uPmApLmpvaW4oJycpfTwvc2VsZWN0PjwvbGFiZWw+YH0KZnVuY3Rpb24gYmluZEZpbHRlcnMoKXtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1maWx0ZXJdJykuZm9yRWFjaChlbD0+ZWwub25jaGFuZ2U9KCk9Pnt2aWV3U3RhdGVbZWwuZGF0YXNldC5vd25lcl0uZmlsdGVyc1tlbC5kYXRhc2V0LmZpbHRlcl09Wy4uLmVsLnNlbGVjdGVkT3B0aW9uc10ubWFwKG89Pm8udmFsdWUpO3JlbmRlcigpfSl9CmZ1bmN0aW9uIGJhbm5lcih0aXRsZSxkZXNjcmlwdGlvbil7cmV0dXJuIGA8ZGl2IGNsYXNzPSJ2aWV3YmFubmVyIj48aDI+JHt0aXRsZX08L2gyPjxwPiR7ZGVzY3JpcHRpb259PC9wPjwvZGl2PmB9CmZ1bmN0aW9uIG1hY2hpbmVDb3VudChyb3dzKXtyZXR1cm4gbmV3IFNldChyb3dzLmZpbHRlcihyPT5yWzFdIT1udWxsJiYhaXNFeHBpcmVkKHJbMV0pKS5tYXAocj0+clsxXSkpLnNpemV9CmZ1bmN0aW9uIHN0YXRDYXJkcyhpdGVtcyl7cmV0dXJuIGA8ZGl2IGNsYXNzPSJrcGlzIj4ke2l0ZW1zLm1hcCgoW2xhYmVsLHZhbHVlLG5vdGVdKT0+YDxkaXYgY2xhc3M9ImNhcmQga3BpIj48c21hbGw+JHtsYWJlbH08L3NtYWxsPjxzdHJvbmc+JHt2YWx1ZX08L3N0cm9uZz48c3Bhbj4ke25vdGV9PC9zcGFuPjwvZGl2PmApLmpvaW4oJycpfTwvZGl2PmB9CmZ1bmN0aW9uIGJhcnNWMihpdGVtcyxrZXksY29sb3I9J3ZhcigtLXRlYWwpJyl7CiBsZXQgbWF4PU1hdGgubWF4KDEsLi4uaXRlbXMubWFwKHg9Pk1hdGguYWJzKHhba2V5XXx8MCkpKTsKIHJldHVybiBpdGVtcy5tYXAoeD0+YDxkaXYgY2xhc3M9ImJhcnJvdyI+PHNwYW4gY2xhc3M9ImJhcmxhYmVsIiB0aXRsZT0iJHtlc2MoeC5uYW1lKX0iPiR7ZXNjKHgubmFtZSl9PC9zcGFuPjxkaXYgY2xhc3M9InRyYWNrIj48ZGl2IGNsYXNzPSJiYXIiIHN0eWxlPSJiYWNrZ3JvdW5kOiR7eFtrZXldPDA/JyNiODZkNjInOmNvbG9yfTt3aWR0aDoke01hdGguYWJzKHhba2V5XXx8MCkvbWF4KjEwMH0lIj48L2Rpdj48L2Rpdj48Yj4ke2NvbXBhY3QoeFtrZXldLGtleSl9PC9iPjwvZGl2PmApLmpvaW4oJycpOwp9CmZ1bmN0aW9uIGNoYXJ0VjIoc2VyaWVzLGtleSl7CiBjb25zdCBsYWJlbHM9Wy4uLm5ldyBTZXQoc2VyaWVzLmZsYXRNYXAocz0+cy5wb2ludHMubWFwKHA9PnAubmFtZSkpKV0uc29ydCgpOwogaWYoIWxhYmVscy5sZW5ndGgpcmV0dXJuICc8ZGl2IGNsYXNzPSJlbXB0eSI+U2luIGRhdG9zIHBhcmEgZXN0ZSBwZXLDrW9kby48L2Rpdj4nOwogY29uc3QgdmFsdWVzPXNlcmllcy5mbGF0TWFwKHM9PnMucG9pbnRzLm1hcChwPT5wW2tleV0pKS5maWx0ZXIodj0+diE9bnVsbCYmTnVtYmVyLmlzRmluaXRlKHYpKTsKIGNvbnN0IGxvPU1hdGgubWluKDAsLi4udmFsdWVzKSxoaT1NYXRoLm1heCgxLC4uLnZhbHVlcyksc3Bhbj1oaS1sb3x8MTsKIGNvbnN0IGNvbG9ycz1bJyMxMjhmOTEnLCcjMTgzYjYwJywnIzVkODNhMicsJyM3NWE4OTgnLCcjOTQ3ZDU1JywnIzU0NmM4NycsJyM5NDdjOWUnLCcjYjA2YTYzJ107CiBjb25zdCB4PWk9PjM1K2kvTWF0aC5tYXgoMSxsYWJlbHMubGVuZ3RoLTEpKjUzMCx5PXY9PjE5MC0odi1sbykvc3BhbioxNTA7CiByZXR1cm4gYDxzdmcgdmlld0JveD0iMCAwIDYwMCAyMzUiIGFyaWEtbGFiZWw9IlNlcmllIHRlbXBvcmFsIiByb2xlPSJpbWciPjxsaW5lIHgxPSIzNSIgeTE9IjE5MCIgeDI9IjU2NSIgeTI9IjE5MCIgc3Ryb2tlPSIjZDllM2ViIi8+PHRleHQgeD0iMzUiIHk9IjIwIiBmb250LXNpemU9IjEwIiBmaWxsPSIjNzE4Njk0Ij4ke2NvbXBhY3QoaGksa2V5KX08L3RleHQ+JHtzZXJpZXMubWFwKChzLGkpPT57bGV0IHBvaW50cz1zLnBvaW50cy5maWx0ZXIocD0+cFtrZXldIT1udWxsKTtyZXR1cm4gYDxwb2x5bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiR7Y29sb3JzW2klOF19IiBzdHJva2Utd2lkdGg9IjIuNSIgcG9pbnRzPSIke3BvaW50cy5tYXAocD0+YCR7eChsYWJlbHMuaW5kZXhPZihwLm5hbWUpKX0sJHt5KHBba2V5XSl9YCkuam9pbignICcpfSIvPiR7cG9pbnRzLm1hcChwPT5gPGNpcmNsZSBjeD0iJHt4KGxhYmVscy5pbmRleE9mKHAubmFtZSkpfSIgY3k9IiR7eShwW2tleV0pfSIgcj0iMyIgZmlsbD0iJHtjb2xvcnNbaSU4XX0iPjx0aXRsZT4ke2VzYyhzLm5hbWUpfSDCtyAke2VzYyhwLm5hbWUpfTogJHtmbXQocFtrZXldLGtleSl9PC90aXRsZT48L2NpcmNsZT5gKS5qb2luKCcnKX1gfSkuam9pbignJyl9PHRleHQgeD0iMzUiIHk9IjIyMCIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzcxODY5NCI+JHtlc2MobGFiZWxzWzBdKX08L3RleHQ+PHRleHQgeD0iNTY1IiB5PSIyMjAiIHRleHQtYW5jaG9yPSJlbmQiIGZvbnQtc2l6ZT0iMTEiIGZpbGw9IiM3MTg2OTQiPiR7ZXNjKGxhYmVscy5hdCgtMSkpfTwvdGV4dD48L3N2Zz48ZGl2IGNsYXNzPSJsZWdlbmQiPiR7c2VyaWVzLm1hcCgocyxpKT0+YDxzcGFuPjxpIHN0eWxlPSJiYWNrZ3JvdW5kOiR7Y29sb3JzW2klOF19Ij48L2k+JHtlc2Mocy5uYW1lKX08L3NwYW4+YCkuam9pbignJyl9PC9kaXY+YDsKfQpmdW5jdGlvbiBzdW1tYXJ5VmlldygpewogY29uc3Qgcm93cz1zbGljZVJvd3MoKSxhPWFnZyhyb3dzKTsKIGNvbnN0IGJyYW5kcz1ncm91cHMocm93cyxyPT5TdHJpbmcoclsyXT8/J1NpbiBkYXRvJykpLnNvcnQoKHgseSk9Pnkud2luLXgud2luKTsKIGNvbnN0IHNlY3RvcnM9Z3JvdXBzKHJvd3Mscj0+U3RyaW5nKHJbNV0/PydTaW4gZGF0bycpKS5zb3J0KCh4LHkpPT55LmNvaW4teC5jb2luKTsKIGNvbnN0IG1vbnRobHk9Z3JvdXBzKHJvd3Mscj0+clswXS5zbGljZSgwLDcpKS5zb3J0KCh4LHkpPT54Lm5hbWUubG9jYWxlQ29tcGFyZSh5Lm5hbWUpKTsKIGV4cG9ydFJvd3M9W1snTWFyY2EnLCdXaW4gQ0xQJywnQ29pbiBJbiBDTFAnLCdNw6FxdWluYXMnXSwuLi5icmFuZHMubWFwKHg9Plt4Lm5hbWUseC53aW4seC5jb2luLG1hY2hpbmVDb3VudCh4LnJvd3MpXSldOwogJCgnI2NvbnRlbnQnKS5pbm5lckhUTUw9YmFubmVyKCdWaXNpw7NuIGdlbmVyYWwgZGVsIHBhcnF1ZScsJ1RvZG8gZWwgcGFycXVlIGRlbnRybyBkZSBsYXMgZmVjaGFzIHNlbGVjY2lvbmFkYXMuIEVzdGEgdmlzdGEgbm8gYXBsaWNhIGZpbHRyb3MgZGUgbcOhcXVpbmFzLCBiYW5jb3Mgbmkgc2VjdG9yZXMuJykrc3RhdENhcmRzKFsKIFsnV0lOIE9QRVJBQ0lPTkFMJyxjb21wYWN0KGEud2luLCd3aW4nKSwnQ0xQIMK3IFRvdGFsIGRlbCBwYXJxdWUnXSxbJ0NPSU4gSU4nLGNvbXBhY3QoYS5jb2luLCdjb2luJyksJ0NMUCDCtyBUb3RhbCBhcG9zdGFkbyddLFsnTcOBUVVJTkFTJyxmbXQobWFjaGluZUNvdW50KHJvd3MpKSwnSWRlbnRpZmljYWRvcmVzIMO6bmljb3MgZW4gZWwgcGVyw61vZG8nXSxbJ1BBWU9VVCcsZm10KGEucG8sJ3BvJyksJ0NhbGN1bGFkbyBzb2JyZSBsb3MgdG90YWxlcyddCiBdKStgPGRpdiBjbGFzcz0iY2hhcnRzIj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+RXZvbHVjacOzbiBtZW5zdWFsIGRlbCBXaW48L2gyPjxkaXYgY2xhc3M9InN1YnRpdGxlIj5QYW5vcmFtYSBnZW5lcmFsIMK3IENMUDwvZGl2PiR7Y2hhcnRWMihbe25hbWU6J1RvZG8gZWwgcGFycXVlJyxwb2ludHM6bW9udGhseX1dLCd3aW4nKX08L2Rpdj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+V2luIHBvciBtYXJjYTwvaDI+PGRpdiBjbGFzcz0ic3VidGl0bGUiPlRvcCA4IMK3IENMUDwvZGl2PiR7YmFyc1YyKGJyYW5kcy5zbGljZSgwLDgpLCd3aW4nKX08L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjaGFydHMiPjxkaXYgY2xhc3M9ImNhcmQiPjxoMj5BY3RpdmlkYWQgcG9yIHNlY3RvcjwvaDI+PGRpdiBjbGFzcz0ic3VidGl0bGUiPkNvaW4gSW4gwrcgVG9wIDg8L2Rpdj4ke2JhcnNWMihzZWN0b3JzLnNsaWNlKDAsOCksJ2NvaW4nLCd2YXIoLS1uYXZ5KScpfTwvZGl2PjxkaXYgY2xhc3M9ImNhcmQiPjxoMj5JbmRpY2Fkb3JlcyBkZWwgcGVyw61vZG88L2gyPjxkaXYgY2xhc3M9InRhYmxld3JhcCI+PHRhYmxlPjx0Ym9keT4ke1tbJ1dpbiBwb3IgbcOhcXVpbmEtZMOtYScsZm10KGEud2QpXSxbJ0NvaW4gSW4gcG9yIG3DoXF1aW5hLWTDrWEnLGZtdChhLmNkKV0sWydBcHVlc3RhIHByb21lZGlvJyxmbXQoYS5iZXQpXSxbJ1NwaW5zJyxmbXQoYS5zcGluKV0sWydNw6FxdWluYXMtZMOtYSByZWdpc3RyYWRhcycsZm10KGEuZGF5cyldLFsnUHJvbW8gbmV0YScsZm10KGEucHJvbW8pXSxbJ1ByZW1pb3MnLGZtdChhLnByaXplKV1dLm1hcCgoW2ssdl0pPT5gPHRyPjx0ZD4ke2t9PC90ZD48dGQ+JHt2fTwvdGQ+PC90cj5gKS5qb2luKCcnKX08L3Rib2R5PjwvdGFibGU+PC9kaXY+PC9kaXY+PC9kaXY+YDsKfQpmdW5jdGlvbiBjb21wYXJlUGFuZWwoa2V5KXtjb25zdCBzPXZpZXdTdGF0ZVtrZXldO3JldHVybiBgPHNlY3Rpb24gY2xhc3M9ImNhcmQgY29tcGFyZXBhbmVsIHNpZGUke2tleX0iPjxkaXYgY2xhc3M9InNpZGVoZWFkaW5nIj48Yj4ke2tleX08L2I+PGlucHV0IGlkPSJuYW1lJHtrZXl9IiBhcmlhLWxhYmVsPSJOb21icmUgZGUgc2VsZWNjacOzbiAke2tleX0iIHZhbHVlPSIke2VzYyhzLm5hbWUpfSI+PC9kaXY+PGRpdiBjbGFzcz0iY29tcGFyZURhdGVzIj48bGFiZWw+RGVzZGU8aW5wdXQgdHlwZT0iZGF0ZSIgaWQ9ImZyb20ke2tleX0iIHZhbHVlPSIke3MuZnJvbX0iPjwvbGFiZWw+PGxhYmVsPkhhc3RhPGlucHV0IHR5cGU9ImRhdGUiIGlkPSJ0byR7a2V5fSIgdmFsdWU9IiR7cy50b30iPjwvbGFiZWw+PC9kaXY+PGRpdiBjbGFzcz0iZmlsdGVyZ3JpZCI+JHtmaWx0ZXJGaWVsZHMocyxrZXkpfTwvZGl2PjxidXR0b24gaWQ9ImNsZWFyJHtrZXl9IiBjbGFzcz0ic3VidGxlIj5MaW1waWFyIGZpbHRyb3MgJHtrZXl9PC9idXR0b24+PC9zZWN0aW9uPmB9CmZ1bmN0aW9uIGRlbHRhKGEsYixrZXkpe2lmKGE9PW51bGx8fGI9PW51bGwpcmV0dXJuICfigJQnO2xldCBkPWItYTtpZihbJ3BvJywncG9uJywnb2NjJywnZGV2J10uaW5jbHVkZXMoa2V5KSlyZXR1cm4gKGQqMTAwKS50b0xvY2FsZVN0cmluZygnZXMtQ0wnLHttYXhpbXVtRnJhY3Rpb25EaWdpdHM6Mn0pKycgcHAnO3JldHVybiAoZD4wPycrJzonJykrZm10KGQsa2V5KX0KZnVuY3Rpb24gY29tcGFyZVZpZXcoKXsKIGxldCBbbWluLG1heF09ZGF0ZVJhbmdlKCk7Zm9yKGxldCBrZXkgb2YgWydBJywnQiddKXt2aWV3U3RhdGVba2V5XS5mcm9tfHw9bWluO3ZpZXdTdGF0ZVtrZXldLnRvfHw9bWF4fQogY29uc3QgQT12aWV3U3RhdGUuQSxCPXZpZXdTdGF0ZS5CLHJhPXNsaWNlUm93cyhBLmZpbHRlcnMsQS5mcm9tLEEudG8pLHJiPXNsaWNlUm93cyhCLmZpbHRlcnMsQi5mcm9tLEIudG8pLGE9YWdnKHJhKSxiPWFnZyhyYik7CiBjb25zdCBrZXlzPVsnd2luJywnY29pbicsJ3dkJywnY2QnLCdzcGluJywnc2QnLCdiZXQnLCdwbycsJ3BvbicsJ3Byb21vJywncHJpemUnLCdvY2MnXTsKIGNvbnN0IGJSZWNvcmRzPW5ldyBTZXQocmIpO2NvbnN0IG92ZXJsYXA9cmEuZmlsdGVyKHI9PmJSZWNvcmRzLmhhcyhyKSkubGVuZ3RoOwogZXhwb3J0Um93cz1bWydJbmRpY2Fkb3InLEEubmFtZSxCLm5hbWUsJ0RpZmVyZW5jaWEgQiAtIEEnLCdWYXJpYWNpw7NuICUnXSwuLi5rZXlzLm1hcChrPT5bbWV0cmljc1trXSxhW2tdPz8nJyxiW2tdPz8nJyxhW2tdPT1udWxsfHxiW2tdPT1udWxsPycnOmJba10tYVtrXSxhW2tdPygoYltrXS1hW2tdKS9NYXRoLmFicyhhW2tdKSkqMTAwOicnXSldOwogJCgnI2NvbnRlbnQnKS5pbm5lckhUTUw9YmFubmVyKCdEb3Mgc2VsZWNjaW9uZXMsIGRvcyBwZXLDrW9kb3MnLCdDb21wYXJhIGVsIG1pc21vIGJhbmNvIGFudGVzIHkgZGVzcHXDqXMsIGRvcyB1YmljYWNpb25lcywgbcOhcXVpbmFzIG8gZ3J1cG9zLiBBIHkgQiB0aWVuZW4gZmVjaGFzIHkgZmlsdHJvcyBpbmRlcGVuZGllbnRlcy4nKStgPGRpdiBjbGFzcz0iY29tcGFyZXRvb2xzIj48YnV0dG9uIGlkPSJjb3B5QUIiPkNvcGlhciBmaWx0cm9zIHkgZmVjaGFzIEEg4oaSIEI8L2J1dHRvbj48YnV0dG9uIGlkPSJzd2FwQUIiPkludGVyY2FtYmlhciBBIOKGlCBCPC9idXR0b24+PC9kaXY+PGRpdiBjbGFzcz0iY29tcGFyZWdyaWQiPiR7Y29tcGFyZVBhbmVsKCdBJyl9JHtjb21wYXJlUGFuZWwoJ0InKX08L2Rpdj48ZGl2IGNsYXNzPSJjb21wYXJpc29uTm90ZSI+QTogJHtmbXQocmEubGVuZ3RoKX0gcmVnaXN0cm9zIMK3ICR7bWFjaGluZUNvdW50KHJhKX0gbcOhcXVpbmFzIMK3ICR7Zm10KGEuZGF5cyl9IG3DoXF1aW5hcy1kw61hLiAmbmJzcDsgQjogJHtmbXQocmIubGVuZ3RoKX0gcmVnaXN0cm9zIMK3ICR7bWFjaGluZUNvdW50KHJiKX0gbcOhcXVpbmFzIMK3ICR7Zm10KGIuZGF5cyl9IG3DoXF1aW5hcy1kw61hLiR7b3ZlcmxhcD9gIEhheSAke2ZtdChvdmVybGFwKX0gcmVnaXN0cm9zIGNvbXBhcnRpZG9zIGVudHJlIGxhcyBzZWxlY2Npb25lcy5gOicnfSBMYXMgZGlmZXJlbmNpYXMgc2UgZXhwcmVzYW4gY29tbyBCIOKIkiBBLiBQYXJhIHBlcsOtb2RvcyBkZSBkaXN0aW50YSBkdXJhY2nDs24sIGNvbXBhcmEgbG9zIGluZGljYWRvcmVzIGRpYXJpb3MuPC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPiR7ZXNjKEEubmFtZSl9IGZyZW50ZSBhICR7ZXNjKEIubmFtZSl9PC9oMj48ZGl2IGNsYXNzPSJ0YWJsZXdyYXAiPjx0YWJsZT48dGhlYWQ+PHRyPjx0aD5JbmRpY2Fkb3I8L3RoPjx0aCBjbGFzcz0iY29sQSI+JHtlc2MoQS5uYW1lKX08YnI+JHtlc2Moc2VsZWN0ZWREYXRlVGV4dFY4KCdBJykpfTwvdGg+PHRoIGNsYXNzPSJjb2xCIj4ke2VzYyhCLm5hbWUpfTxicj4ke2VzYyhzZWxlY3RlZERhdGVUZXh0VjgoJ0InKSl9PC90aD48dGg+RGlmZXJlbmNpYSBCIOKIkiBBPC90aD48dGg+VmFyaWFjacOzbiByZWxhdGl2YTwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT4ke2tleXMubWFwKGs9PmA8dHI+PHRkPiR7bWV0cmljc1trXX08L3RkPjx0ZD4ke2ZtdChhW2tdLGspfTwvdGQ+PHRkPiR7Zm10KGJba10sayl9PC90ZD48dGQ+JHtkZWx0YShhW2tdLGJba10sayl9PC90ZD48dGQ+JHthW2tdPT1udWxsfHxiW2tdPT1udWxsfHxhW2tdPT09MD8n4oCUJzooKGJba10tYVtrXSkvTWF0aC5hYnMoYVtrXSkqMTAwKS50b0xvY2FsZVN0cmluZygnZXMtQ0wnLHttYXhpbXVtRnJhY3Rpb25EaWdpdHM6MX0pKyclJ308L3RkPjwvdHI+YCkuam9pbignJyl9PC90Ym9keT48L3RhYmxlPjwvZGl2PjwvZGl2PmA7CiBiaW5kRmlsdGVycygpO2ZvcihsZXQga2V5IG9mIFsnQScsJ0InXSl7CiAgZm9yKGxldCBmaWVsZCBvZiBbJ2Zyb20nLCd0bycsJ25hbWUnXSkkKCcjJytmaWVsZCtrZXkpLm9uY2hhbmdlPWU9Pnt2aWV3U3RhdGVba2V5XVtmaWVsZF09ZS50YXJnZXQudmFsdWU7cmVuZGVyKCl9OwogICQoJyNjbGVhcicra2V5KS5vbmNsaWNrPSgpPT57dmlld1N0YXRlW2tleV0uZmlsdGVycz17fTtyZW5kZXIoKX07CiB9CiAkKCcjY29weUFCJykub25jbGljaz0oKT0+e3ZpZXdTdGF0ZS5CPXsuLi5KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZpZXdTdGF0ZS5BKSksbmFtZTp2aWV3U3RhdGUuQi5uYW1lfTtyZW5kZXIoKX07CiAkKCcjc3dhcEFCJykub25jbGljaz0oKT0+e1t2aWV3U3RhdGUuQSx2aWV3U3RhdGUuQl09W3ZpZXdTdGF0ZS5CLHZpZXdTdGF0ZS5BXTtyZW5kZXIoKX07Cn0KZnVuY3Rpb24gcGVyaW9kS2V5KHIsZ3JhaW4pe3JldHVybiBncmFpbj09PSdtb250aCc/clswXS5zbGljZSgwLDcpOmdyYWluPT09J3dlZWsnP3JbMF0uc2xpY2UoMCw0KSsnIMK3IFMnK1N0cmluZyhyWzMwXSkucGFkU3RhcnQoMiwnMCcpOnJbMF19CmZ1bmN0aW9uIGV2b2x1dGlvblZpZXcoKXsKIGNvbnN0IHM9dmlld1N0YXRlLmV2b2x1dGlvbixyb3dzPXNsaWNlUm93cyhzLmZpbHRlcnMpLGs9cy5tZXRyaWM7CiBjb25zdCBieT1zLnNlcmllcz09PSd0b3RhbCc/W3tuYW1lOidTZWxlY2Npw7NuIGNvbXBsZXRhJyxyb3dzLC4uLmFnZyhyb3dzKX1dOmdyb3Vwcyhyb3dzLHI9PlN0cmluZyhyW3Muc2VyaWVzXT8/J1NpbiBkYXRvJykpLnNvcnQoKGEsYik9PmIuY29pbi1hLmNvaW4pLnNsaWNlKDAsOCk7CiBjb25zdCBzZXJpZXM9YnkubWFwKGc9Pih7bmFtZTpnLm5hbWUscG9pbnRzOmdyb3VwcyhnLnJvd3Mscj0+cGVyaW9kS2V5KHIscy5ncmFpbikpLnNvcnQoKGEsYik9PmEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpfSkpOwogY29uc3QgYXZhaWxhYmxlPU9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhtZXRyaWNzKS5maWx0ZXIoKFtrXSk9PiFbJ3JhdGlvJywncnMnLCdyYiddLmluY2x1ZGVzKGspKSk7CiBleHBvcnRSb3dzPVtbJ1NlcmllJywnUGVyw61vZG8nLG1ldHJpY3Nba11dLC4uLnNlcmllcy5mbGF0TWFwKHM9PnMucG9pbnRzLm1hcChwPT5bcy5uYW1lLHAubmFtZSxwW2tdPz8nJ10pKV07CiAkKCcjY29udGVudCcpLmlubmVySFRNTD1iYW5uZXIoJ0NvbXBvcnRhbWllbnRvIGEgdHJhdsOpcyBkZWwgdGllbXBvJywnU2lndWUgdW5hIG3DoXF1aW5hLCBiYW5jbyBvIHNlY3Rvci4gRWxpZ2UgZWwgaW5kaWNhZG9yLCBsYSBmcmVjdWVuY2lhIHkgbGFzIHNlcmllcyBxdWUgcXVpZXJlcyB2ZXIuJykrYDxzZWN0aW9uIGNsYXNzPSJjYXJkIj48ZGl2IGNsYXNzPSJmaWx0ZXJncmlkIGV2b2x1dGlvbmZpbHRlcnMiPiR7ZmlsdGVyRmllbGRzKHMsJ2V2b2x1dGlvbicsWzEsMiwzLDksNSw3XSl9PC9kaXY+PGRpdiBjbGFzcz0idmlld2NvbnRyb2xzIj4ke3NlbGVjdG9yKCdJbmRpY2Fkb3InLCdlbWV0cmljJyxrLGF2YWlsYWJsZSl9JHtzZWxlY3RvcignRnJlY3VlbmNpYScsJ2VncmFpbicscy5ncmFpbix7bW9udGg6J01lbnN1YWwnLHdlZWs6J1NlbWFuYWwnLGRheTonRGlhcmlhJ30pfSR7c2VsZWN0b3IoJ1NlcGFyYXIgbMOtbmVhcyBwb3InLCdlc2VyaWVzJyxzLnNlcmllcyx7dG90YWw6J1RvZGEgbGEgc2VsZWNjacOzbicsMTonTcOhcXVpbmEnLDI6J01hcmNhJyw5OidCYW5jbycsNTonU2VjdG9yJ30pfTwvZGl2Pjwvc2VjdGlvbj48ZGl2IGNsYXNzPSJjYXJkIGxhcmdlY2hhcnQiPjxoMj4ke21ldHJpY3Nba119IMK3ICR7c2VsZWN0ZWREYXRlVGV4dFY4KCdnbG9iYWwnKX08L2gyPjxkaXYgY2xhc3M9InN1YnRpdGxlIj5Nw6F4aW1vIDggc2VyaWVzLCBwcmlvcml6YWRhcyBwb3IgQ29pbiBJbi4gUGFzYSBlbCBjdXJzb3IgcG9yIGxvcyBwdW50b3MgcGFyYSB2ZXIgbG9zIHZhbG9yZXMuPC9kaXY+JHtjaGFydFYyKHNlcmllcyxrKX08L2Rpdj5gOwogYmluZEZpbHRlcnMoKTtmb3IobGV0IFtpZCxrZXldb2YgW1snZW1ldHJpYycsJ21ldHJpYyddLFsnZWdyYWluJywnZ3JhaW4nXSxbJ2VzZXJpZXMnLCdzZXJpZXMnXV0pJCgnIycraWQpLm9uY2hhbmdlPWU9PntzW2tleV09ZS50YXJnZXQudmFsdWU7cmVuZGVyKCl9Owp9CmZ1bmN0aW9uIHJhdGlvc1ZpZXcoKXsKIGNvbnN0IHM9dmlld1N0YXRlLnJhdGlvcyxyb3dzPXNsaWNlUm93cyhzLmZpbHRlcnMpLGJhc2U9c2xpY2VSb3dzKCkscmVmZXJlbmNlPWFnZyhzLnJlZmVyZW5jZT09PSdmaWx0ZXJlZCc/cm93czpiYXNlKTsKIGxldCBsaXN0PWdyb3Vwcyhyb3dzLHI9PlN0cmluZyhyW3MuZ3JvdXBdPz8nU2luIGRhdG8nKSk7CiBjb25zdCByZWZzPW5ldyBNYXA7CiBmb3IoY29uc3QgZyBvZiBsaXN0KXtsZXQgcmVmPXJlZmVyZW5jZTtpZihzLnJlZmVyZW5jZT09PSdzYWxvbicpe2xldCBzYWxvbnM9Wy4uLm5ldyBTZXQoZy5yb3dzLm1hcChyPT5yWzddKSldLGtleT1KU09OLnN0cmluZ2lmeShzYWxvbnMuc29ydCgpKTtpZighcmVmcy5oYXMoa2V5KSlyZWZzLnNldChrZXksYWdnKGJhc2UuZmlsdGVyKHI9PnNhbG9ucy5pbmNsdWRlcyhyWzddKSkpKTtyZWY9cmVmcy5nZXQoa2V5KX1yYXRpb3MoZyxyZWYpfQogbGlzdC5zb3J0KChhLGIpPT4oYltzLm1ldHJpY10/Py1JbmZpbml0eSktKGFbcy5tZXRyaWNdPz8tSW5maW5pdHkpKTsKIGNvbnN0IGNvbHM9WydjZCcsJ3NkJywnYmV0JywncmF0aW8nLCdycycsJ3JiJ107CiBleHBvcnRSb3dzPVtbZGltc1tzLmdyb3VwXSwuLi5jb2xzLm1hcChrPT5tZXRyaWNzW2tdKV0sLi4ubGlzdC5tYXAoZz0+W2cubmFtZSwuLi5jb2xzLm1hcChrPT5nW2tdPz8nJyldKV07CiAkKCcjY29udGVudCcpLmlubmVySFRNTD1iYW5uZXIoJ1JlbmRpbWllbnRvIHJlbGF0aXZvJywnMcOXIGVxdWl2YWxlIGEgbGEgcmVmZXJlbmNpYS4gTcOhcyBkZSAxw5cgc3VwZXJhIGVzZSBuaXZlbDsgbWVub3MgZGUgMcOXIHF1ZWRhIHBvciBkZWJham8uIENvbXBhcmEgYWN0aXZpZGFkIHkgYXB1ZXN0YSwgbm8gcmVudGFiaWxpZGFkIHBvciBzw60gc29sYS4nKStgPHNlY3Rpb24gY2xhc3M9ImNhcmQiPjxkaXYgY2xhc3M9ImZpbHRlcmdyaWQiPiR7ZmlsdGVyRmllbGRzKHMsJ3JhdGlvcycpfTwvZGl2PjxkaXYgY2xhc3M9InZpZXdjb250cm9scyI+JHtzZWxlY3RvcignQWdydXBhciBwb3InLCdyZ3JvdXAnLHMuZ3JvdXAsZGltcyl9JHtzZWxlY3RvcignUmF0aW8gZGVsIHJhbmtpbmcnLCdybWV0cmljJyxzLm1ldHJpYyx7cmF0aW86J0NvaW4gSW4gcG9yIG3DoXF1aW5hLWTDrWEnLHJzOidTcGlucyBwb3IgbcOhcXVpbmEtZMOtYScscmI6J0FwdWVzdGEgcHJvbWVkaW8nfSl9JHtzZWxlY3RvcignUmVmZXJlbmNpYScsJ3JyZWZlcmVuY2UnLHMucmVmZXJlbmNlLHthbGw6J1RvZG8gZWwgcGFycXVlIGVuIGVzdGFzIGZlY2hhcycsc2Fsb246J1NhbMOzbiBkZSBjYWRhIGdydXBvJyxmaWx0ZXJlZDonU2VsZWNjacOzbiBmaWx0cmFkYSd9KX08L2Rpdj48L3NlY3Rpb24+PGRpdiBjbGFzcz0iY2hhcnRzIHJhdGlvY2hhcnRzIj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+UmFua2luZyDCtyAke21ldHJpY3Nbcy5tZXRyaWNdfTwvaDI+JHtiYXJzVjIobGlzdC5zbGljZSgwLDEwKSxzLm1ldHJpYyl9PC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPkPDs21vIGxlZXIgZWwgcmVzdWx0YWRvPC9oMj48cD4xLDIww5cgcmVwcmVzZW50YSB1biBuaXZlbCAyMCUgc3VwZXJpb3IgYSBsYSByZWZlcmVuY2lhLiAwLDgww5cgcmVwcmVzZW50YSB1biBuaXZlbCAyMCUgaW5mZXJpb3IuPC9wPjxwPkxvcyByYXRpb3MgZGUgQ29pbiBJbiB5IHNwaW5zIHV0aWxpemFuIG3DoXF1aW5hcy1kw61hIHJlZ2lzdHJhZGFzIHBhcmEgbm9ybWFsaXphciBsYSBleHBvc2ljacOzbi4gTGEgYXB1ZXN0YSBzZSBjYWxjdWxhIGNvbW8gQ29pbiBJbiB0b3RhbCAvIHNwaW5zIHRvdGFsZXMuPC9wPjxwPkxhIHJlZmVyZW5jaWEgdXNhIGxhcyBtaXNtYXMgZmVjaGFzLiDCq1RvZG8gZWwgcGFycXVlwrsgbm8gYXBsaWNhIGxvcyBmaWx0cm9zIGRlIGNhdGVnb3LDrWFzOyDCq1NlbGVjY2nDs24gZmlsdHJhZGHCuyBzw60gbG9zIGFwbGljYS48L3A+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPkRldGFsbGUgZGUgcmF0aW9zIMK3ICR7bGlzdC5sZW5ndGh9IGdydXBvczwvaDI+PGRpdiBjbGFzcz0idGFibGV3cmFwIj48dGFibGU+PHRoZWFkPjx0cj48dGg+JHtkaW1zW3MuZ3JvdXBdfTwvdGg+JHtjb2xzLm1hcChrPT5gPHRoPiR7bWV0cmljc1trXX08L3RoPmApLmpvaW4oJycpfTwvdHI+PC90aGVhZD48dGJvZHk+JHtsaXN0Lm1hcChnPT5gPHRyPjx0ZD4ke2VzYyhnLm5hbWUpfTwvdGQ+JHtjb2xzLm1hcChrPT5gPHRkPiR7WydyYXRpbycsJ3JzJywncmInXS5pbmNsdWRlcyhrKT9gPHNwYW4gZGF0YS1yYXRpby12Nj0iJHtnW2tdPz8nJ30iIGNsYXNzPSJwaWxsICR7Z1trXTwxPydsb3cnOicnfSI+JHtmbXQoZ1trXSxrKX08L3NwYW4+YDpmbXQoZ1trXSxrKX08L3RkPmApLmpvaW4oJycpfTwvdHI+YCkuam9pbignJyl9PC90Ym9keT48L3RhYmxlPjwvZGl2PjwvZGl2PmA7CiBiaW5kRmlsdGVycygpO2ZvcihsZXQgW2lkLGtleV1vZiBbWydyZ3JvdXAnLCdncm91cCddLFsncm1ldHJpYycsJ21ldHJpYyddLFsncnJlZmVyZW5jZScsJ3JlZmVyZW5jZSddXSkkKCcjJytpZCkub25jaGFuZ2U9ZT0+e3Nba2V5XT1lLnRhcmdldC52YWx1ZTtyZW5kZXIoKX07Cn0KZnVuY3Rpb24gcmVuZGVyKCl7CiBpZighZGF0YSlyZXR1cm47CiAkKCcjZmlsdGVycycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOyQoJyNjb250cm9scycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZpbHRlcnMnKS5zdHlsZS5kaXNwbGF5PVsnQ29tcGFyYXRpdm9zJywnTWV0b2RvbG9nw61hJ10uaW5jbHVkZXModGFiKT8nbm9uZSc6J2Jsb2NrJzsKIGRvY3VtZW50LmJvZHkuZGF0YXNldC52aWV3PXRhYjsKICQoJyN0aXRsZScpLnRleHRDb250ZW50PXtSZXN1bWVuOidSZXN1bWVuIGRlbCBwYXJxdWUnLENvbXBhcmF0aXZvczonQ29tcGFyYXIgc2VsZWNjaW9uZXMgeSBwZXLDrW9kb3MnLEV2b2x1Y2nDs246J0V2b2x1Y2nDs24gZGVsIHJlbmRpbWllbnRvJyxSYXRpb3M6J1JhdGlvcyBkZSByZW5kaW1pZW50bycsTWV0b2RvbG9nw61hOidNZXRvZG9sb2fDrWEgeSBjw6FsY3Vsb3MnfVt0YWJdOwogJCgnI3ZpZXdIZWxwJykudGV4dENvbnRlbnQ9dGFiPT09J0NvbXBhcmF0aXZvcyc/J0EgeSBCIHRpZW5lbiBmZWNoYXMgaW5kZXBlbmRpZW50ZXMuJzp0YWI9PT0nUmVzdW1lbic/J0ZlY2hhcyBkZWwgcGFub3JhbWEgZ2VuZXJhbCBkZWwgcGFycXVlLic6J0ZlY2hhcyBkZSBlc3RhIGNvbnN1bHRhLic7CiBpZih0YWI9PT0nUmVzdW1lbicpc3VtbWFyeVZpZXcoKTtlbHNlIGlmKHRhYj09PSdDb21wYXJhdGl2b3MnKWNvbXBhcmVWaWV3KCk7ZWxzZSBpZih0YWI9PT0nRXZvbHVjacOzbicpZXZvbHV0aW9uVmlldygpO2Vsc2UgaWYodGFiPT09J1JhdGlvcycpcmF0aW9zVmlldygpO2Vsc2V7bWV0aG9kKCk7JCgnI2NvbnRlbnQnKS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLCc8ZGl2IGNsYXNzPSJub3RpY2UiPkNvbXBhcmF0aXZvcyBwZXJtaXRlIGZlY2hhcyB5IGZpbHRyb3MgaW5kZXBlbmRpZW50ZXMgcGFyYSBBIHkgQi4gTG9zIGNhbWJpb3MgaGlzdMOzcmljb3MgZGUgdWJpY2FjacOzbiBzb2xvIHNlIHB1ZWRlbiBhbmFsaXphciBzaSBsYSBtYXRyaXogY29uc2VydmEgbGEgdWJpY2FjacOzbiByZWFsIGRlIGNhZGEgZmVjaGEuIEVYUElSQURPUyBzZSBvY3VsdGEgZGUgbG9zIGZpbHRyb3MsIHkgc2UgZXhjbHV5ZSBkZSBsb3MgdG90YWxlcy48L2Rpdj4nKX0KfQovLyBSZXBsYWNlIG5hdmlnYXRpb24gYW5kIHZpZXcgcGVyc2lzdGVuY2Ugd2l0aCBzdGF0ZSBzcGVjaWZpYyB0byBlYWNoIHNlY3Rpb24uCmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kYXRlcm93JykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywnPHNwYW4gaWQ9InZpZXdIZWxwIiBjbGFzcz0iZGF0ZWhlbHAiPjwvc3Bhbj4nKTsKZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZGVyIHAnKS50ZXh0Q29udGVudD0nUGFub3JhbWEgZ2VuZXJhbCwgY29tcGFyYWNpb25lcyBpbmRlcGVuZGllbnRlcywgZXZvbHVjacOzbiB5IHJhdGlvcy4nOwpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkZXInKS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyZW5kJywnPGRpdiBjbGFzcz0id29ya3NwYWNlYmFyIj48YnV0dG9uIGlkPSJ2MnNhdmUiPkd1YXJkYXIgdmlzdGEgYWN0dWFsPC9idXR0b24+PHNlbGVjdCBpZD0idjJ2aWV3cyI+PG9wdGlvbiB2YWx1ZT0iIj5WaXN0YXMgZ3VhcmRhZGFzPC9vcHRpb24+PC9zZWxlY3Q+PGJ1dHRvbiBpZD0idjJleHBvcnQiPuKGkyBFeHBvcnRhciBlc3RhIGNvbnN1bHRhPC9idXR0b24+PC9kaXY+Jyk7CiQoJyNzYXZlJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7JCgnI3ZpZXdzJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ25hdiBidXR0b24nKS5mb3JFYWNoKChidXR0b24saSk9PmJ1dHRvbi5vbmNsaWNrPSgpPT57dGFiPVsnUmVzdW1lbicsJ0NvbXBhcmF0aXZvcycsJ0V2b2x1Y2nDs24nLCdSYXRpb3MnLCdNZXRvZG9sb2fDrWEnXVtpXTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCduYXYgYnV0dG9uJykuZm9yRWFjaChiPT5iLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsYj09PWJ1dHRvbikpO3JlbmRlcigpfSk7CmxvYWRWaWV3cz1mdW5jdGlvbigpe2NvbnN0IHNlbGVjdD0kKCcjdjJ2aWV3cycpO3NlbGVjdC5pbm5lckhUTUw9JzxvcHRpb24gdmFsdWU9IiI+VmlzdGFzIGd1YXJkYWRhczwvb3B0aW9uPicrc2F2ZWRWaWV3cy5tYXAoKHYsaSk9PmA8b3B0aW9uIHZhbHVlPSIke2l9Ij4ke2VzYyh2Lm5hbWUpfSR7di52ZXJzaW9uPT09Mj8nJzonIChhbnRlcmlvciknfTwvb3B0aW9uPmApLmpvaW4oJycpfTsKJCgnI3Yyc2F2ZScpLm9uY2xpY2s9YXN5bmMoKT0+e2lmKCFkYXRhKXJldHVybjtjb25zdCBuYW1lPXByb21wdCgnTm9tYnJlIGRlIGxhIHZpc3RhJyk7aWYoIW5hbWUpcmV0dXJuO2xldCBuZXh0PVsuLi5zYXZlZFZpZXdzLHt2ZXJzaW9uOjIsbmFtZSx0YWIsZnJvbTokKCcjZnJvbScpLnZhbHVlLHRvOiQoJyN0bycpLnZhbHVlLHN0YXRlOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmlld1N0YXRlKSl9XTt0cnl7YXdhaXQgcnBjKCdzYXZlVmlld3MnLEpTT04uc3RyaW5naWZ5KG5leHQpKTtzYXZlZFZpZXdzPW5leHQ7bG9hZFZpZXdzKCl9Y2F0Y2goZSl7YWxlcnQoJ05vIHNlIGd1YXJkw7M6ICcrZS5tZXNzYWdlKX19OwokKCcjdjJ2aWV3cycpLm9uY2hhbmdlPSgpPT57aWYoJCgnI3Yydmlld3MnKS52YWx1ZT09PScnKXJldHVybjtjb25zdCB2PXNhdmVkVmlld3NbJCgnI3Yydmlld3MnKS52YWx1ZV07aWYodi52ZXJzaW9uIT09Mil7YWxlcnQoJ0VzdGEgdmlzdGEgcGVydGVuZWNlIGFsIGRpc2XDsW8gYW50ZXJpb3IuIENyZWEgdW5hIG51ZXZhIGNvbiBsb3MgZmlsdHJvcyBhY3R1YWxlcy4nKTtyZXR1cm59T2JqZWN0LmFzc2lnbih2aWV3U3RhdGUsSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2LnN0YXRlKSkpOyQoJyNmcm9tJykudmFsdWU9di5mcm9tOyQoJyN0bycpLnZhbHVlPXYudG87dGFiPXYudGFiO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ25hdiBidXR0b24nKS5mb3JFYWNoKChiLGkpPT5iLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsWydSZXN1bWVuJywnQ29tcGFyYXRpdm9zJywnRXZvbHVjacOzbicsJ1JhdGlvcycsJ01ldG9kb2xvZ8OtYSddW2ldPT09dGFiKSk7cmVuZGVyKCl9OwokKCcjcmVzZXQnKS5vbmNsaWNrPSgpPT57Y29uc3QgW2Zyb20sdG9dPWRhdGVSYW5nZSgpOyQoJyNmcm9tJykudmFsdWU9ZnJvbTskKCcjdG8nKS52YWx1ZT10bztpZih0YWI9PT0nRXZvbHVjacOzbicpdmlld1N0YXRlLmV2b2x1dGlvbi5maWx0ZXJzPXt9O2lmKHRhYj09PSdSYXRpb3MnKXZpZXdTdGF0ZS5yYXRpb3MuZmlsdGVycz17fTtyZW5kZXIoKX07CiQoJyN2MmV4cG9ydCcpLm9uY2xpY2s9KCk9PntpZih0YWI9PT0nTWV0b2RvbG9nw61hJ3x8IWV4cG9ydFJvd3MubGVuZ3RoKXJldHVybjtjb25zdCBjc3Y9J1x1ZmVmZicrZXhwb3J0Um93cy5tYXAocm93PT5yb3cubWFwKHY9PiciJytTdHJpbmcodikucmVwbGFjZSgvIi9nLCciIicpKyciJykuam9pbignOycpKS5qb2luKCdcclxuJyk7bGV0IGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO2EuaHJlZj1VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtjc3ZdLHt0eXBlOid0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04J30pKTthLmRvd25sb2FkPSdMQS0nK3RhYisnLmNzdic7YS5jbGljaygpO3NldFRpbWVvdXQoKCk9PlVSTC5yZXZva2VPYmplY3RVUkwoYS5ocmVmKSwxMDAwKX07Cgpjb25zdCBjYW5vbmljYWxIZWFkZXJzPVsnRmVjaGEnLCdNw6FxdWluYScsJ0ZhYnJpY2FudGUnLCdQbGF0YWZvcm1hJywnTW9kZWxvJywnU2VjY2nDs24nLCdWYWxvcicsJ1NhbMOzbicsJ0lELVByb2cnLCdCbG9xdWUnLCdUaWNrZXQgSW4nLCdUaWNrZXQgT3V0JywnQmlsbGV0ZScsJ1ZwcCcsJ0V4cGlyYWRvcycsJ1ByZW1pb3MnLCdXaW4nLCdXRFAnLCdDb2luIEluJywnQ29pbiBPdXQnLCdTcGluJywnQXB1ZXN0YScsJyUgT2N1cCcsJ1dpbicsJ0RhdG9zIFdpbk1ldHJvIE1DQycsJ07CsDEgRGlmZXJlbmNpYScsJ1Byb21vIEluJywnUHJvbW8gT3V0JywnRGlmZXJlbmNpYSBXaW4gUmVhbCcsJ0hvcmEnLCdTZW1hbmEnLCdNZXMnLCdEaWFTZW0nLCdBw7FvIEZhYicsJ0FudGlndWVkYWQnLCdjaGVjayddOwpmdW5jdGlvbiBoZWFkZXJLZXkocyl7cmV0dXJuIFN0cmluZyhzPz8nJykubm9ybWFsaXplKCdORkQnKS5yZXBsYWNlKC9bXHUwMzAwLVx1MDM2Zl0vZywnJykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0vZywnJyl9CmZ1bmN0aW9uIGV4Y2VsRGF0ZSh2LGRhdGUxOTA0PWZhbHNlKXsKIGlmKHR5cGVvZiB2PT09J251bWJlcicpe2NvbnN0IGQ9bmV3IERhdGUoKGRhdGUxOTA0P0RhdGUuVVRDKDE5MDQsMCwxKTpEYXRlLlVUQygxODk5LDExLDMwKSkrTWF0aC5mbG9vcih2KSo4NjRlNSk7cmV0dXJuIE51bWJlci5pc0Zpbml0ZShkLmdldFRpbWUoKSk/ZC50b0lTT1N0cmluZygpLnNsaWNlKDAsMTApOm51bGx9CiBjb25zdCBzPVN0cmluZyh2Pz8nJykudHJpbSgpO2xldCBtPXMubWF0Y2goL14oXGR7NH0pLShcZHsyfSktKFxkezJ9KS8pO2lmKCFtKXtsZXQgbG9jYWw9cy5tYXRjaCgvXihcZHsxLDJ9KVtcLy1dKFxkezEsMn0pW1wvLV0oXGR7NH0pJC8pO2lmKGxvY2FsKW09W2xvY2FsWzBdLGxvY2FsWzNdLGxvY2FsWzJdLnBhZFN0YXJ0KDIsJzAnKSxsb2NhbFsxXS5wYWRTdGFydCgyLCcwJyldfQogaWYoIW0pcmV0dXJuIG51bGw7bGV0IHJlc3VsdD1gJHttWzFdfS0ke21bMl19LSR7bVszXX1gLGQ9bmV3IERhdGUocmVzdWx0KydUMDA6MDA6MDBaJyk7cmV0dXJuIE51bWJlci5pc0Zpbml0ZShkLmdldFRpbWUoKSkmJmQudG9JU09TdHJpbmcoKS5zbGljZSgwLDEwKT09PXJlc3VsdD9yZXN1bHQ6bnVsbDsKfQpmdW5jdGlvbiBub3JtYWxpemVXb3JrYm9vayhtYXRyaXgsanVlZ29zLG5hbWUsZGF0ZTE5MDQ9ZmFsc2UsdXRpbGl0eT1udWxsKXsKIGlmKCFtYXRyaXgpdGhyb3cgRXJyb3IoJ0VsIGFyY2hpdm8gZGViZSBpbmNsdWlyIGxhIHBlc3Rhw7FhIE1hdHJpei4nKTsKIGxldCBzdGFydD1tYXRyaXguZmluZEluZGV4KHI9PnIuc29tZSh2PT5oZWFkZXJLZXkodik9PT0nZmVjaGEnKSYmci5zb21lKHY9PmhlYWRlcktleSh2KT09PSdtYXF1aW5hJykpOwogaWYoc3RhcnQ8MCl0aHJvdyBFcnJvcignTm8gc2UgZW5jb250cmFyb24gbG9zIGVuY2FiZXphZG9zIEZlY2hhIHkgTcOhcXVpbmEuJyk7CiBjb25zdCBoZWFkZXJzPW1hdHJpeFtzdGFydF0scG9zaXRpb25zPXt9O2hlYWRlcnMuZm9yRWFjaCgodixpKT0+e2xldCBrZXk9aGVhZGVyS2V5KHYpOyhwb3NpdGlvbnNba2V5XT8/PVtdKS5wdXNoKGkpfSk7CiBjb25zdCBtYXBwaW5nPWNhbm9uaWNhbEhlYWRlcnMubWFwKGg9PnBvc2l0aW9uc1toZWFkZXJLZXkoaCldPy5bMF0/Py0xKTsKIG1hcHBpbmdbMjNdPXBvc2l0aW9ucy53aW4/LlsxXT8/LTE7CiBtYXBwaW5nWzI0XT1wb3NpdGlvbnMuZGF0b3N3aW5tZXRyb21jYz8uWzBdPz8tMTttYXBwaW5nWzI1XT1wb3NpdGlvbnMubjFkaWZlcm5jaWE/LlswXT8/cG9zaXRpb25zLm4xZGlmZXJlbmNpYT8uWzBdPz8tMTsKIGZvcihsZXQgaSBvZiBbMCwxLDE2LDE4LDIwLDI2LDI3XSlpZihtYXBwaW5nW2ldPDApdGhyb3cgRXJyb3IoJ0ZhbHRhIGxhIGNvbHVtbmEgJytjYW5vbmljYWxIZWFkZXJzW2ldKTsKIGNvbnN0IGpTdGFydD0oanVlZ29zfHxbXSkuZmluZEluZGV4KHI9PnIuc29tZSh2PT5oZWFkZXJLZXkodik9PT0nbWFxdWluYScpKTsKIGNvbnN0IGRlc2NyaXB0aW9ucz1uZXcgTWFwOwogaWYoalN0YXJ0Pj0wKXtjb25zdCBqaD1qdWVnb3NbalN0YXJ0XS5tYXAoaGVhZGVyS2V5KSxtaz1qaC5pbmRleE9mKCdtYXF1aW5hJyk7Zm9yKGNvbnN0IHJvdyBvZiBqdWVnb3Muc2xpY2UoalN0YXJ0KzEpKWlmKHJvd1tta10hPW51bGwpZGVzY3JpcHRpb25zLnNldChTdHJpbmcocm93W21rXSkse3JvdyxoZWFkZXJzOmpofSl9CiBsZXQgc2tpcHBlZD0wLG1pc3NpbmdEZXNjcmlwdGlvbnM9MCxlcnJvcnM9MDtjb25zdCByb3dzPVtdOwogZm9yKGxldCBpPXN0YXJ0KzE7aTxtYXRyaXgubGVuZ3RoO2krKyl7CiAgY29uc3Qgc291cmNlPW1hdHJpeFtpXTtpZihtYXBwaW5nLnNsaWNlKDAsMzApLmZpbHRlcihrPT5rPj0wKS5ldmVyeShrPT5zb3VyY2Vba109PW51bGx8fHNvdXJjZVtrXT09PScnKSl7c2tpcHBlZCsrO2NvbnRpbnVlfQogIGNvbnN0IGR2PXNvdXJjZVttYXBwaW5nWzBdXTtpZigvXnRvdGFsKCBnZW5lcmFsKT8kL2kudGVzdChTdHJpbmcoZHY/PycnKS50cmltKCkpKXtza2lwcGVkKys7Y29udGludWV9CiAgY29uc3QgZGF0ZT1leGNlbERhdGUoZHYsZGF0ZTE5MDQpO2lmKCFkYXRlKXRocm93IEVycm9yKGBGaWxhICR7aSsxfTogZmVjaGEgdmFjw61hIG8gbm8gdsOhbGlkYS5gKTsKICBsZXQgcj1jYW5vbmljYWxIZWFkZXJzLm1hcCgoaCxrKT0+bWFwcGluZ1trXTwwP251bGw6c291cmNlW21hcHBpbmdba11dPz9udWxsKTtyWzBdPWRhdGU7CiAgZm9yKGxldCBrIG9mIFsxNiwxOCwyMCwyNiwyN10paWYodHlwZW9mIHJba10hPT0nbnVtYmVyJ3x8IU51bWJlci5pc0Zpbml0ZShyW2tdKSl0aHJvdyBFcnJvcihgRmlsYSAke2krMX06ICR7Y2Fub25pY2FsSGVhZGVyc1trXX0gbm8gdGllbmUgcmVzdWx0YWRvIG51bcOpcmljby4gUmVjYWxjdWxhIHkgZ3VhcmRhIGVsIEV4Y2VsLmApOwogIGNvbnN0IGRlc2M9ZGVzY3JpcHRpb25zLmdldChTdHJpbmcoclsxXSkpO2ZvcihsZXQgaz0yO2s8PTk7aysrKXtpZihyW2tdPT1udWxsJiZkZXNjKXtsZXQgaXg9ZGVzYy5oZWFkZXJzLmluZGV4T2YoaGVhZGVyS2V5KGNhbm9uaWNhbEhlYWRlcnNba10pKTtpZihpeD49MClyW2tdPWRlc2Mucm93W2l4XT8/bnVsbH19CiAgZm9yKGxldCBrPTA7azxyLmxlbmd0aDtrKyspaWYodHlwZW9mIHJba109PT0nc3RyaW5nJyYmL14jKFJFRiF8TlwvQXxWQUxVRSF8RElWXC8wIXxOQU1FXD98TlVNIXxOVUxMISkvLnRlc3QocltrXSkpe3Jba109bnVsbDtlcnJvcnMrK30KICBpZihyWzJdPT1udWxsJiYhaXNFeHBpcmVkKHJbNV0pJiYhaXNFeHBpcmVkKHJbN10pKW1pc3NpbmdEZXNjcmlwdGlvbnMrKzsKICBjb25zdCBkPW5ldyBEYXRlKGRhdGUrJ1QwMDowMDowMFonKSxmaXJzdD1uZXcgRGF0ZShEYXRlLlVUQyhkLmdldFVUQ0Z1bGxZZWFyKCksMCwxKSk7clszMF09TWF0aC5mbG9vcigoKGQtZmlyc3QpLzg2NGU1KyhmaXJzdC5nZXRVVENEYXkoKSs2KSU3KS83KSsxO3JbMzFdPWQuZ2V0VVRDTW9udGgoKSsxO3JbMzJdPShkLmdldFVUQ0RheSgpKzYpJTcrMTsKICAvLyBUaGUgbGFzdCBjb2x1bW5zIG9mIFdpbiBUaXR0byBhcmUgdmFsaWRhdGlvbiBmaWVsZHMsIG5vdCBjYWxlbmRhci9tYW51ZmFjdHVyZSBmaWVsZHMuCiAgZm9yKGxldCBrIG9mIFszMywzNCwzNV0paWYobWFwcGluZ1trXTwwKXJba109bnVsbDsKICByb3dzLnB1c2gocik7CiB9CiBpZighcm93cy5sZW5ndGgpdGhyb3cgRXJyb3IoJ0xhIHBlc3Rhw7FhIE1hdHJpeiBubyBjb250aWVuZSByZWdpc3Ryb3MgdsOhbGlkb3MuJyk7CiBsZXQgY29udHJvbHM9W107CiBpZih1dGlsaXR5KXtmb3IobGV0IHJvdyBvZiB1dGlsaXR5KXtjb25zdCBkYXRlPWV4Y2VsRGF0ZShyb3dbMF0sZGF0ZTE5MDQpO2lmKGRhdGUmJnR5cGVvZiByb3dbNF09PT0nbnVtYmVyJyljb250cm9scy5wdXNoKHtkYXRlLG5ldDpyb3dbMV0sdnBwOnJvd1syXSxleHBpcmVkOnJvd1szXSx3aW46cm93WzRdfSl9fQogY29uc3QgZGF0ZXM9Wy4uLm5ldyBTZXQocm93cy5tYXAocj0+clswXSkpXS5zb3J0KCksa2V5cz1uZXcgU2V0O2NvbnRyb2xzPWNvbnRyb2xzLmZpbHRlcihjPT5kYXRlcy5pbmNsdWRlcyhjLmRhdGUpKTtsZXQgZHVwbGljYXRlcz0wO2ZvcihsZXQgciBvZiByb3dzKXtsZXQga2V5PXJbMF0rJ3wnK3JbMV07aWYoa2V5cy5oYXMoa2V5KSlkdXBsaWNhdGVzKys7a2V5cy5hZGQoa2V5KX0KIHJldHVybiB7aGVhZGVyczpjYW5vbmljYWxIZWFkZXJzLHJvd3MsbmFtZSxjb250cm9scyxpbXBvcnRJbmZvOntza2lwcGVkLG1pc3NpbmdEZXNjcmlwdGlvbnMsZXJyb3JzLGR1cGxpY2F0ZXMsZnJvbTpkYXRlc1swXSx0bzpkYXRlcy5hdCgtMSksZGF0ZXM6ZGF0ZXMubGVuZ3RoLGZvcm1hdDpwb3NpdGlvbnMuZXN0YWRvZGVtYXF1aW5hPydXaW4gVGl0dG8nOidNYXRyaXogLyBSZXBvcnRlIExBJ319Owp9CmZ1bmN0aW9uIGNvbWJpbmVNYXRyaWNlcyhwcmV2aW91cyxpbmNvbWluZyxtb2RlKXsKIGlmKG1vZGU9PT0ncmVwbGFjZSd8fCFwcmV2aW91cylyZXR1cm4gey4uLmluY29taW5nfTsKIGNvbnN0IGRhdGVzPW5ldyBTZXQoaW5jb21pbmcucm93cy5tYXAocj0+clswXSkpOwogY29uc3Qgcm93cz1bLi4ucHJldmlvdXMucm93cy5maWx0ZXIocj0+IWRhdGVzLmhhcyhyWzBdKSksLi4uaW5jb21pbmcucm93c10uc29ydCgoYSxiKT0+YVswXS5sb2NhbGVDb21wYXJlKGJbMF0pfHxTdHJpbmcoYVsxXSkubG9jYWxlQ29tcGFyZShTdHJpbmcoYlsxXSksdW5kZWZpbmVkLHtudW1lcmljOnRydWV9KSk7CiBjb25zdCBjb250cm9scz1bLi4uKHByZXZpb3VzLmNvbnRyb2xzfHxbXSkuZmlsdGVyKGM9PiFkYXRlcy5oYXMoYy5kYXRlKSksLi4uKGluY29taW5nLmNvbnRyb2xzfHxbXSldOwogcmV0dXJuIHsuLi5pbmNvbWluZyxyb3dzLGNvbnRyb2xzLG5hbWU6J0hpc3TDs3JpY28gwrcgJytpbmNvbWluZy5uYW1lfTsKfQpsZXQgcGVuZGluZ0ltcG9ydD1udWxsOwpmdW5jdGlvbiBzaG93SW1wb3J0UHJldmlldyhpbmNvbWluZyl7CiBwZW5kaW5nSW1wb3J0PWluY29taW5nO2NvbnN0IGRhdGVzPW5ldyBTZXQoaW5jb21pbmcucm93cy5tYXAocj0+clswXSkpLG9sZD0oZGF0YT8ucm93c3x8W10pLmZpbHRlcihyPT5kYXRlcy5oYXMoclswXSkpLGE9YWdnKGluY29taW5nLnJvd3MpLGluZm89aW5jb21pbmcuaW1wb3J0SW5mbzsKIGNvbnN0IGRpYWxvZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaWFsb2cnKTtkaWFsb2cuaWQ9J2ltcG9ydERpYWxvZyc7ZGlhbG9nLmlubmVySFRNTD1gPGRpdiBjbGFzcz0iaW1wb3J0Ym94Ij48aDI+UmV2aXNhciBhY3R1YWxpemFjacOzbjwvaDI+PHA+JHtlc2MoaW5jb21pbmcubmFtZSl9IMK3ICR7aW5mby5mb3JtYXR9PC9wPjxkaXYgY2xhc3M9Im5vdGljZSI+JHtpbmZvLmZyb219IOKGkiAke2luZm8udG99IMK3ICR7Zm10KGluY29taW5nLnJvd3MubGVuZ3RoKX0gcmVnaXN0cm9zIMK3ICR7aW5mby5kYXRlc30gZMOtYXMuPGJyPldpbjogJHtmbXQoYS53aW4pfSBDTFAgwrcgQ29pbiBJbjogJHtmbXQoYS5jb2luKX0gQ0xQLjxicj4ke2luZm8uc2tpcHBlZH0gZmlsYXMgdmFjw61hcyBvIGRlIHRvdGFsZXMgb21pdGlkYXMuICR7aW5mby5kdXBsaWNhdGVzfSBjbGF2ZXMgZmVjaGEvbcOhcXVpbmEgcmVwZXRpZGFzIChzZSBjb25zZXJ2YW4pLiAke2luZm8ubWlzc2luZ0Rlc2NyaXB0aW9uc30gcmVnaXN0cm9zIHNpbiBmYWJyaWNhbnRlLiAke2luZm8uZXJyb3JzfSBlcnJvcmVzIGVuIGNvbHVtbmFzIGF1eGlsaWFyZXMgc2UgbWFyY2Fyb24gY29tbyBzaW4gZGF0by48L2Rpdj48bGFiZWw+Q8OzbW8gYWN0dWFsaXphcjxzZWxlY3QgaWQ9ImltcG9ydE1vZGUiPjxvcHRpb24gdmFsdWU9Im1lcmdlIj5BY3R1YWxpemFyIGxvcyBkw61hcyByZWNpYmlkb3MgeSBjb25zZXJ2YXIgZWwgcmVzdG8gZGVsIGhpc3TDs3JpY288L29wdGlvbj48b3B0aW9uIHZhbHVlPSJyZXBsYWNlIj5SZWVtcGxhemFyIFRPRE8gZWwgaGlzdMOzcmljbyBwb3IgZXN0ZSBhcmNoaXZvPC9vcHRpb24+PC9zZWxlY3Q+PC9sYWJlbD48cD5FbiBtb2RvIGhpc3TDs3JpY28gc2UgcmVlbXBsYXphbiAke2ZtdChvbGQubGVuZ3RoKX0gcmVnaXN0cm9zIGRlIGxvcyBkw61hcyByZWNpYmlkb3MuIExvcyBkZW3DoXMgZMOtYXMgc2UgY29uc2VydmFuLiBSZXBldGlyIGVsIG1pc21vIGFyY2hpdm8gbm8gZHVwbGljYSBkYXRvcy4gQ2FkYSBkw61hIGRlbCBhcmNoaXZvIHNlIGNvbnNpZGVyYSBjb21wbGV0by48L3A+PHAgaWQ9ImltcG9ydE1lc3NhZ2UiPjwvcD48ZGl2IGNsYXNzPSJjb21wYXJldG9vbHMiPjxidXR0b24gaWQ9ImNhbmNlbEltcG9ydCI+Q2FuY2VsYXI8L2J1dHRvbj48YnV0dG9uIGlkPSJjb25maXJtSW1wb3J0IiBjbGFzcz0icHJpbWFyeSI+Q29uZmlybWFyIGFjdHVhbGl6YWNpw7NuPC9idXR0b24+PC9kaXY+PC9kaXY+YDsKIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGlhbG9nKTtkaWFsb2cuc2hvd01vZGFsKCk7JCgnI2NhbmNlbEltcG9ydCcpLm9uY2xpY2s9KCk9PntkaWFsb2cuY2xvc2UoKTtkaWFsb2cucmVtb3ZlKCk7cGVuZGluZ0ltcG9ydD1udWxsfTsKICQoJyNjb25maXJtSW1wb3J0Jykub25jbGljaz1hc3luYygpPT57CiAgY29uc3QgbW9kZT0kKCcjaW1wb3J0TW9kZScpLnZhbHVlO2lmKG1vZGU9PT0ncmVwbGFjZScmJiFjb25maXJtKCdFc3RvIHJlZW1wbGF6YXLDoSBUT0RPIGVsIGhpc3TDs3JpY28gYWN0dWFsLiDCv0NvbnRpbnVhcj8nKSlyZXR1cm47CiAgJCgnI2NvbmZpcm1JbXBvcnQnKS5kaXNhYmxlZD10cnVlOyQoJyNjYW5jZWxJbXBvcnQnKS5kaXNhYmxlZD10cnVlOyQoJyNpbXBvcnRNZXNzYWdlJykudGV4dENvbnRlbnQ9J0d1YXJkYW5kbyBlbiBHb29nbGUgRHJpdmXigKYnOwogIHRyeXtjb25zdCBuZXh0PWNvbWJpbmVNYXRyaWNlcyhkYXRhLGluY29taW5nLG1vZGUpLHJlc3BvbnNlPWF3YWl0IHJwYygnaW1wb3J0TWF0cml4JyxKU09OLnN0cmluZ2lmeShpbmNvbWluZyksbW9kZSxkYXRhPy5zdG9yYWdlUmV2aXNpb24/Pydpbml0aWFsJyk7bmV4dC5zdG9yYWdlUmV2aXNpb249cmVzcG9uc2UucmV2aXNpb247bmV4dC5zdG9yYWdlVXBkYXRlZEF0PXJlc3BvbnNlLnVwZGF0ZWRBdDtkYXRhPW5leHQ7Zm9yKGxldCBrZXkgb2YgWydBJywnQiddKXt2aWV3U3RhdGVba2V5XS5mcm9tPScnO3ZpZXdTdGF0ZVtrZXldLnRvPScnfWRpYWxvZy5jbG9zZSgpO2RpYWxvZy5yZW1vdmUoKTtwZW5kaW5nSW1wb3J0PW51bGw7aW5pdCgpOyQoJyNzdGF0dXMnKS50ZXh0Q29udGVudCs9YCDCtyBIaXN0w7NyaWNvIGFjdHVhbGl6YWRvIGVuIERyaXZlIMK3ICR7cmVzcG9uc2Uucm93c30gcmVnaXN0cm9zYH0KICBjYXRjaChlcnIpeyQoJyNpbXBvcnRNZXNzYWdlJykudGV4dENvbnRlbnQ9J05vIHNlIGd1YXJkw7M6ICcrZXJyLm1lc3NhZ2U7JCgnI2NvbmZpcm1JbXBvcnQnKS5kaXNhYmxlZD1mYWxzZTskKCcjY2FuY2VsSW1wb3J0JykuZGlzYWJsZWQ9ZmFsc2V9CiB9Owp9CiQoJyNmaWxlJykub25jaGFuZ2U9YXN5bmMgZT0+e2NvbnN0IGZpbGU9ZS50YXJnZXQuZmlsZXNbMF07aWYoIWZpbGUpcmV0dXJuOyQoJyNzdGF0dXMnKS50ZXh0Q29udGVudD0nTGV5ZW5kbyB5IHZhbGlkYW5kbyAnK2ZpbGUubmFtZSsn4oCmJzt0cnl7c2hvd0ltcG9ydFByZXZpZXcoYXdhaXQgcmVhZFhsc3goZmlsZSkpOyQoJyNzdGF0dXMnKS50ZXh0Q29udGVudD0nQXJjaGl2byB2YWxpZGFkby4gUmV2aXNhIHkgY29uZmlybWEgbGEgYWN0dWFsaXphY2nDs24uJ31jYXRjaChlcnIpeyQoJyNzdGF0dXMnKS50ZXh0Q29udGVudD0nTm8gc2UgbW9kaWZpY2Fyb24gbG9zIGRhdG9zOiAnK2Vyci5tZXNzYWdlfWZpbmFsbHl7ZS50YXJnZXQudmFsdWU9Jyd9fTsKCmNvbnN0IHRhYnNWMz1bJ1Jlc3VtZW4nLCdDb21wYXJhdGl2b3MnLCdFdm9sdWNpw7NuJywnUmF0aW9zJywnUmVwb3J0ZSBzZW1hbmFsJywnUmVwb3J0ZSBtZW5zdWFsJywnRXZvbHV0aXZvIG1lbnN1YWwnLCdPdHJvcyBpbmZvcm1lcycsJ01ldG9kb2xvZ8OtYSddOwpmb3IoY29uc3Qga2V5IG9mIFsnd2Vla2x5JywnbW9udGhseScsJ21vbnRobHlFdm9sdXRpb24nLCdleHRyYSddKXZpZXdTdGF0ZVtrZXldPz89e2ZpbHRlcnM6e30sbGltaXQ6JzEyJyxraW5kOidzYWxvbid9OwpmdW5jdGlvbiByZXBvcnRQZXJpb2Qocix0eXBlKXtyZXR1cm4gdHlwZT09PSd3ZWVrJz9yWzBdLnNsaWNlKDAsNCkrJyDCtyBTJytTdHJpbmcoclszMF0pLnBhZFN0YXJ0KDIsJzAnKTpyWzBdLnNsaWNlKDAsNyl9CmZ1bmN0aW9uIHByZWZlcmVuY2lhbChyKXtyZXR1cm4gaGVhZGVyS2V5KHJbNV0pLmluY2x1ZGVzKCdwcmVmZXJlbmNpYWwnKXx8aGVhZGVyS2V5KHJbN10pLmluY2x1ZGVzKCdwcmVmZXJlbmNpYWwnKX0KZnVuY3Rpb24gcmVwb3J0U2VyaWVzKHJvd3MsdHlwZSl7cmV0dXJuIGdyb3Vwcyhyb3dzLHI9PnJlcG9ydFBlcmlvZChyLHR5cGUpKS5zb3J0KChhLGIpPT5hLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKX0KZnVuY3Rpb24gcmVwb3J0VGFibGUobGlzdCxjb2xzLHBlcmlvZExhYmVsPSdQZXLDrW9kbycpewogcmV0dXJuIGA8ZGl2IGNsYXNzPSJ0YWJsZXdyYXAiPjx0YWJsZT48dGhlYWQ+PHRyPjx0aD4ke3BlcmlvZExhYmVsfTwvdGg+PHRoPkNvYmVydHVyYTwvdGg+JHtjb2xzLm1hcChrPT5gPHRoPiR7bWV0cmljc1trXX08L3RoPmApLmpvaW4oJycpfTwvdHI+PC90aGVhZD48dGJvZHk+JHtsaXN0Lm1hcCh4PT5gPHRyPjx0ZD4ke2VzYyh4Lm5hbWUpfTwvdGQ+PHRkPiR7Y292ZXJhZ2VMYWJlbCh4LnJvd3MpfTwvdGQ+JHtjb2xzLm1hcChrPT5gPHRkPiR7Zm10KHhba10sayl9PC90ZD5gKS5qb2luKCcnKX08L3RyPmApLmpvaW4oJycpfTwvdGJvZHk+PC90YWJsZT48L2Rpdj5gOwp9CmZ1bmN0aW9uIGNvdmVyYWdlTGFiZWwocm93cyl7aWYoIXJvd3MubGVuZ3RoKXJldHVybiAnU2luIGRhdG9zJztsZXQgZGF0ZXM9Wy4uLm5ldyBTZXQocm93cy5tYXAocj0+clswXSkpXS5zb3J0KCksbW9udGhzPW5ldyBTZXQoZGF0ZXMubWFwKGQ9PmQuc2xpY2UoMCw3KSkpO2lmKG1vbnRocy5zaXplPT09MSl7bGV0W3ksbV09ZGF0ZXNbMF0uc3BsaXQoJy0nKS5tYXAoTnVtYmVyKSxkYXlzPW5ldyBEYXRlKERhdGUuVVRDKHksbSwwKSkuZ2V0VVRDRGF0ZSgpO3JldHVybiBgJHtkYXRlcy5sZW5ndGh9IGTDrWFzIHJlZ2lzdHJhZG9zYH1yZXR1cm4gYCR7ZGF0ZXMubGVuZ3RofSBkw61hcyByZWdpc3RyYWRvc2B9CmZ1bmN0aW9uIGNvbWJpbmVkQ2hhcnQocG9pbnRzLGZpcnN0LHNlY29uZCl7CiBjb25zdCB2YWxpZD1wb2ludHMuZmlsdGVyKHA9PnBbZmlyc3RdIT1udWxsfHxwW3NlY29uZF0hPW51bGwpO2lmKCF2YWxpZC5sZW5ndGgpcmV0dXJuICc8cD5TaW4gZGF0b3MuPC9wPic7CiBjb25zdCBsZWZ0PXZhbGlkLm1hcChwPT5wW2ZpcnN0XSkuZmlsdGVyKHY9PnYhPW51bGwpLHJpZ2h0PXZhbGlkLm1hcChwPT5wW3NlY29uZF0pLmZpbHRlcih2PT52IT1udWxsKTsKIGNvbnN0IGxvMT1NYXRoLm1pbigwLC4uLmxlZnQpLGhpMT1NYXRoLm1heCgxLC4uLmxlZnQpLGxvMj1NYXRoLm1pbigwLC4uLnJpZ2h0KSxoaTI9TWF0aC5tYXgoMC4wMDAwMDEsLi4ucmlnaHQpLHg9aT0+NDUraS9NYXRoLm1heCgxLHZhbGlkLmxlbmd0aC0xKSo0OTA7CiBjb25zdCB5MT12PT4xODUtKHYtbG8xKS8oaGkxLWxvMXx8MSkqMTMwLHkyPXY9PjE4NS0odi1sbzIpLyhoaTItbG8yfHwxKSoxMzA7CiByZXR1cm4gYDxkaXYgY2xhc3M9ImR1YWxMZWdlbmQiPjxzcGFuPuKXjyBJenF1aWVyZGE6ICR7bWV0cmljc1tmaXJzdF19PC9zcGFuPjxzcGFuPuKXjyBEZXJlY2hhOiAke21ldHJpY3Nbc2Vjb25kXX08L3NwYW4+PC9kaXY+PHN2ZyB2aWV3Qm94PSIwIDAgNjAwIDI0MCIgYXJpYS1sYWJlbD0iJHttZXRyaWNzW2ZpcnN0XX0geSAke21ldHJpY3Nbc2Vjb25kXX0sIGVqZXMgaW5kZXBlbmRpZW50ZXMiIHJvbGU9ImltZyI+PGxpbmUgeDE9IjQ1IiB5MT0iMTg1IiB4Mj0iNTM1IiB5Mj0iMTg1IiBzdHJva2U9IiNkOWUzZWIiLz48dGV4dCB4PSIxNSIgeT0iMzUiIGZvbnQtc2l6ZT0iMTAiIGZpbGw9IiMxNzM2NTIiPiR7Y29tcGFjdChoaTEsZmlyc3QpfTwvdGV4dD48dGV4dCB4PSI1ODAiIHk9IjM1IiB0ZXh0LWFuY2hvcj0iZW5kIiBmb250LXNpemU9IjEwIiBmaWxsPSIjMTM4ZjkzIj4ke2NvbXBhY3QoaGkyLHNlY29uZCl9PC90ZXh0Pjxwb2x5bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiMxNzM2NTIiIHN0cm9rZS13aWR0aD0iMi41IiBwb2ludHM9IiR7dmFsaWQuZmlsdGVyKHA9PnBbZmlyc3RdIT1udWxsKS5tYXAocD0+YCR7eCh2YWxpZC5pbmRleE9mKHApKX0sJHt5MShwW2ZpcnN0XSl9YCkuam9pbignICcpfSIvPjxwb2x5bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiMxMzhmOTMiIHN0cm9rZS13aWR0aD0iMi41IiBwb2ludHM9IiR7dmFsaWQuZmlsdGVyKHA9PnBbc2Vjb25kXSE9bnVsbCkubWFwKHA9PmAke3godmFsaWQuaW5kZXhPZihwKSl9LCR7eTIocFtzZWNvbmRdKX1gKS5qb2luKCcgJyl9Ii8+JHt2YWxpZC5tYXAoKHAsaSk9PmAke3BbZmlyc3RdPT1udWxsPycnOmA8Y2lyY2xlIGN4PSIke3goaSl9IiBjeT0iJHt5MShwW2ZpcnN0XSl9IiByPSIzIiBmaWxsPSIjMTczNjUyIj48dGl0bGU+JHtlc2MocC5uYW1lKX0gwrcgJHttZXRyaWNzW2ZpcnN0XX06ICR7Zm10KHBbZmlyc3RdLGZpcnN0KX08L3RpdGxlPjwvY2lyY2xlPmB9JHtwW3NlY29uZF09PW51bGw/Jyc6YDxjaXJjbGUgY3g9IiR7eChpKX0iIGN5PSIke3kyKHBbc2Vjb25kXSl9IiByPSIzIiBmaWxsPSIjMTM4ZjkzIj48dGl0bGU+JHtlc2MocC5uYW1lKX0gwrcgJHttZXRyaWNzW3NlY29uZF19OiAke2ZtdChwW3NlY29uZF0sc2Vjb25kKX08L3RpdGxlPjwvY2lyY2xlPmB9YCkuam9pbignJyl9PHRleHQgeD0iNDUiIHk9IjIyMCIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzcxODY5NCI+JHtlc2ModmFsaWRbMF0ubmFtZSl9PC90ZXh0Pjx0ZXh0IHg9IjUzNSIgeT0iMjIwIiB0ZXh0LWFuY2hvcj0iZW5kIiBmb250LXNpemU9IjExIiBmaWxsPSIjNzE4Njk0Ij4ke2VzYyh2YWxpZC5hdCgtMSkubmFtZSl9PC90ZXh0Pjwvc3ZnPmA7Cn0KZnVuY3Rpb24gZ3JhcGhDYXJkKHRpdGxlLGh0bWwsbm90ZT0nJyl7cmV0dXJuIGA8ZGl2IGNsYXNzPSJjYXJkIj48aDI+JHt0aXRsZX08L2gyPiR7bm90ZT9gPGRpdiBjbGFzcz0ic3VidGl0bGUiPiR7bm90ZX08L2Rpdj5gOicnfSR7aHRtbH08L2Rpdj5gfQpmdW5jdGlvbiByZXBvcnRGaWx0ZXJzKGtleSxleHRyYT0nJyl7CiBjb25zdCBzPXZpZXdTdGF0ZVtrZXldO3JldHVybiBgPHNlY3Rpb24gY2xhc3M9ImNhcmQiPjxkaXYgY2xhc3M9ImZpbHRlcmdyaWQiPiR7ZmlsdGVyRmllbGRzKHMsa2V5LFsyLDMsNSw3LDksMSw4LDRdKX08L2Rpdj48ZGl2IGNsYXNzPSJ2aWV3Y29udHJvbHMiPiR7c2VsZWN0b3IoJ01vc3RyYXIgcGVyw61vZG9zJywncmVwb3J0TGltaXQnLHMubGltaXQsezY6J8OabHRpbW9zIDYnLDEyOifDmmx0aW1vcyAxMicsMjQ6J8OabHRpbW9zIDI0JyxhbGw6J1RvZG9zIGVuIGxhcyBmZWNoYXMnfSl9JHtleHRyYX08L2Rpdj48L3NlY3Rpb24+YDsKfQpmdW5jdGlvbiBiaW5kUmVwb3J0KGtleSl7YmluZEZpbHRlcnMoKTskKCcjcmVwb3J0TGltaXQnKS5vbmNoYW5nZT1lPT57dmlld1N0YXRlW2tleV0ubGltaXQ9ZS50YXJnZXQudmFsdWU7cmVuZGVyKCl9fQpmdW5jdGlvbiBwZXJpb2RSZXBvcnRzKHR5cGUpewogY29uc3Qga2V5PXR5cGU9PT0nd2Vlayc/J3dlZWtseSc6J21vbnRobHknLHM9dmlld1N0YXRlW2tleV0scm93cz1zbGljZVJvd3Mocy5maWx0ZXJzKSxhbGw9cmVwb3J0U2VyaWVzKHJvd3MsdHlwZSksbGlzdD1zLmxpbWl0PT09J2FsbCc/YWxsOmFsbC5zbGljZSgtTnVtYmVyKHMubGltaXQpKTsKIGNvbnN0IHBlcmlvZHM9bmV3IFNldChsaXN0Lm1hcCh4PT54Lm5hbWUpKSx2aXNpYmxlPXJvd3MuZmlsdGVyKHI9PnBlcmlvZHMuaGFzKHJlcG9ydFBlcmlvZChyLHR5cGUpKSksdG90YWw9YWdnKHZpc2libGUpLHNhbG9uPXJlcG9ydFNlcmllcyh2aXNpYmxlLmZpbHRlcihwcmVmZXJlbmNpYWwpLHR5cGUpOwogY29uc3QgYWxpZ25lZD1zYWxvbi5tYXAocD0+KHsuLi5wfSkpO2NvbnN0IGNvbHM9Wyd3aW4nLCdjb2luJywnc3BpbicsJ2JldCcsJ3BvJywncG9uJywnZGV2JywncHJvbW8nLCdwcml6ZSddOwogZXhwb3J0Um93cz1bWydQZXLDrW9kbycsJ0TDrWFzIHJlZ2lzdHJhZG9zJywuLi5jb2xzLm1hcChrPT5tZXRyaWNzW2tdKV0sLi4ubGlzdC5tYXAocD0+W3AubmFtZSxuZXcgU2V0KHAucm93cy5tYXAocj0+clswXSkpLnNpemUsLi4uY29scy5tYXAoaz0+cFtrXT8/JycpXSldOwogY29uc3QgY2hhcnRzPVtncmFwaENhcmQoJ1dpbiB5IHBheW91dCcsY29tYmluZWRDaGFydChsaXN0LCd3aW4nLCdwbycpLCdDTFAgeSAlIMK3IEVqZXMgaW5kZXBlbmRpZW50ZXMnKSxncmFwaENhcmQoJ0NvaW4gSW4geSBhcHVlc3RhIHByb21lZGlvJyxjb21iaW5lZENoYXJ0KGxpc3QsJ2NvaW4nLCdiZXQnKSwnQ0xQIMK3IEVqZXMgaW5kZXBlbmRpZW50ZXMnKSxncmFwaENhcmQoJ1BheW91dCB5IGRlc3ZpYWNpw7NuIE5DQycsY29tYmluZWRDaGFydChsaXN0LCdwbycsJ2RldicpLCclIMK3IEVqZXMgaW5kZXBlbmRpZW50ZXMnKSxncmFwaENhcmQoJ1BheW91dCB5IHBheW91dCBjb24gTkNDJyxjaGFydFYyKFt7bmFtZTonUGF5b3V0Jyxwb2ludHM6bGlzdH0se25hbWU6J1BheW91dCBOQ0MnLHBvaW50czpsaXN0Lm1hcChwPT4oey4uLnAscG86cC5wb259KSl9XSwncG8nKSksZ3JhcGhDYXJkKCdQcm9tbyBuZXRhIHkgZGVzdmlhY2nDs24gTkNDJyxjb21iaW5lZENoYXJ0KGxpc3QsJ3Byb21vJywnZGV2JyksJ0NMUCB5ICUgwrcgRWplcyBpbmRlcGVuZGllbnRlcycpLGdyYXBoQ2FyZCgnUHJlbWlvcycsY2hhcnRWMihbe25hbWU6J1ByZW1pb3MnLHBvaW50czpsaXN0fV0sJ3ByaXplJykpXTsKIGNoYXJ0cy5wdXNoKGdyYXBoQ2FyZCgnV2luIHkgZGVzdmlhY2nDs24gTkNDJyxjb21iaW5lZENoYXJ0KGxpc3QsJ3dpbicsJ2RldicpLCdDTFAgeSAlIMK3IEVqZXMgaW5kZXBlbmRpZW50ZXMnKSk7CiBpZih0eXBlPT09J3dlZWsnKWNoYXJ0cy5wdXNoKGdyYXBoQ2FyZCgnV2luIMK3IFNlbGVjY2nDs24geSBzYWzDs24gcHJlZmVyZW5jaWFsJyxjaGFydFYyKFt7bmFtZTonU2VsZWNjacOzbiBjb21wbGV0YScscG9pbnRzOmxpc3R9LHtuYW1lOidQcmVmZXJlbmNpYWwgZGVudHJvIGRlIHNlbGVjY2nDs24nLHBvaW50czphbGlnbmVkfV0sJ3dpbicpLCdFbCBzYWzDs24gZXMgcGFydGUgZGVsIHRvdGFsOyBubyBzdW1hciBhbWJhcyBsw61uZWFzLicpLGdyYXBoQ2FyZCgnQ29pbiBJbiDCtyBTZWxlY2Npw7NuIHkgc2Fsw7NuIHByZWZlcmVuY2lhbCcsY2hhcnRWMihbe25hbWU6J1NlbGVjY2nDs24gY29tcGxldGEnLHBvaW50czpsaXN0fSx7bmFtZTonUHJlZmVyZW5jaWFsIGRlbnRybyBkZSBzZWxlY2Npw7NuJyxwb2ludHM6YWxpZ25lZH1dLCdjb2luJyksJ0VsIHNhbMOzbiBlcyBwYXJ0ZSBkZWwgdG90YWw7IG5vIHN1bWFyIGFtYmFzIGzDrW5lYXMuJykpOwogJCgnI2NvbnRlbnQnKS5pbm5lckhUTUw9YmFubmVyKHR5cGU9PT0nd2Vlayc/J1JlcG9ydGUgc2VtYW5hbCc6J1JlcG9ydGUgbWVuc3VhbCcsJ0luZGljYWRvcmVzIHkgY29tYmluYWNpb25lcyBkZSBncsOhZmljb3MgYmFzYWRvcyBlbiBsYXMgcGVzdGHDsWFzIFJlcG9ydGUgU2VtYW5hIHkgUmVwb3J0ZSBNZXMuIExvcyBwZXLDrW9kb3MgeSB2YWxvcmVzIHNlIHJlY2FsY3VsYW4gY29uIHR1IGhpc3TDs3JpY28uJykrcmVwb3J0RmlsdGVycyhrZXkpK3N0YXRDYXJkcyhbWydXSU4nLGNvbXBhY3QodG90YWwud2luLCd3aW4nKSwnQ0xQIMK3IFBlcsOtb2RvcyBtb3N0cmFkb3MnXSxbJ0NPSU4gSU4nLGNvbXBhY3QodG90YWwuY29pbiwnY29pbicpLCdDTFAgwrcgUGVyw61vZG9zIG1vc3RyYWRvcyddLFsnUEFZT1VUJyxmbXQodG90YWwucG8sJ3BvJyksJ0NhbGN1bGFkbyBzb2JyZSB0b3RhbGVzJ10sWydBUFVFU1RBIFBST01FRElPJyxmbXQodG90YWwuYmV0KSwnQ0xQIHBvciBzcGluJ11dKStgPGRpdiBjbGFzcz0ibm90aWNlIj4ke3R5cGU9PT0nd2Vlayc/J1NlbWFuYSBkZSBFeGNlbCBXRUVLTlVNKGZlY2hhLDIpLCBjb24gbHVuZXMgY29tbyBpbmljaW8uJzonTWVzIGNhbGVuZGFyaW8uJ30gTGFzIHRhYmxhcyBpbmNsdXllbiBzb2xvIGZlY2hhcyBwcmVzZW50ZXMgZW4gZWwgaGlzdMOzcmljbyB5IGVuIHR1IHNlbGVjY2nDs24uIExvcyBwZXLDrW9kb3MgY29uIG1lbm9zIGTDrWFzIHB1ZWRlbiBlc3RhciBpbmNvbXBsZXRvczsgdXNhIGxvcyBpbmRpY2Fkb3JlcyBkaWFyaW9zIHBhcmEgY29tcGFyYXJsb3MuPC9kaXY+PGRpdiBjbGFzcz0icmVwb3J0Y2hhcnRzIj4ke2NoYXJ0cy5qb2luKCcnKX08L2Rpdj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+RGV0YWxsZSAke3R5cGU9PT0nd2Vlayc/J3NlbWFuYWwnOidtZW5zdWFsJ308L2gyPiR7cmVwb3J0VGFibGUobGlzdCxjb2xzKX08L2Rpdj5gOwogYmluZFJlcG9ydChrZXkpOwp9CmZ1bmN0aW9uIG1vbnRobHlFdm9sdXRpb25SZXBvcnQoKXsKIGNvbnN0IHM9dmlld1N0YXRlLm1vbnRobHlFdm9sdXRpb24scm93cz1zbGljZVJvd3Mocy5maWx0ZXJzKSxhbGw9cmVwb3J0U2VyaWVzKHJvd3MsJ21vbnRoJyksbGlzdD1zLmxpbWl0PT09J2FsbCc/YWxsOmFsbC5zbGljZSgtTnVtYmVyKHMubGltaXQpKSxwZXJpb2RzPW5ldyBTZXQobGlzdC5tYXAocD0+cC5uYW1lKSksdmlzaWJsZT1yb3dzLmZpbHRlcihyPT5wZXJpb2RzLmhhcyhyZXBvcnRQZXJpb2QociwnbW9udGgnKSkpLGJhc2U9YWdnKHZpc2libGUpOwogY29uc3QgcGxhdGZvcm1zPWdyb3Vwcyh2aXNpYmxlLHI9PlN0cmluZyhyWzNdPz8nU2luIGRhdG8nKSkuc29ydCgoYSxiKT0+Yi5jZC1hLmNkKTsKIGNvbnN0IGNvbHM9WydjZCcsJ3dkJywnc2QnLCdiZXQnLCdwbycsJ2RldicsJ3Byb21vJywnd2luJywnY29pbiddOwogZXhwb3J0Um93cz1bWydNZXMnLC4uLmNvbHMubWFwKGs9Pm1ldHJpY3Nba10pXSwuLi5saXN0Lm1hcChwPT5bcC5uYW1lLC4uLmNvbHMubWFwKGs9PnBba10/PycnKV0pXTsKICQoJyNjb250ZW50JykuaW5uZXJIVE1MPWJhbm5lcignRXZvbHV0aXZvIG1lbnN1YWwnLCdTZWd1aW1pZW50byBtZW5zdWFsIGRlbCBDb2luIEluLCBXaW4geSBzcGlucyBwb3IgbcOhcXVpbmEtZMOtYSwgY29uIGNvbXBhcmFjacOzbiBkZSBwbGF0YWZvcm1hcyBmcmVudGUgYWwgcHJvbWVkaW8gZGUgbGEgc2VsZWNjacOzbi4nKStyZXBvcnRGaWx0ZXJzKCdtb250aGx5RXZvbHV0aW9uJykrYDxkaXYgY2xhc3M9InJlcG9ydGNoYXJ0cyI+JHtncmFwaENhcmQoJ0NvaW4gSW4gcG9yIG3DoXF1aW5hLWTDrWEnLGNoYXJ0VjIoW3tuYW1lOidTZWxlY2Npw7NuJyxwb2ludHM6bGlzdH1dLCdjZCcpKX0ke2dyYXBoQ2FyZCgnV2luIHBvciBtw6FxdWluYS1kw61hJyxjaGFydFYyKFt7bmFtZTonU2VsZWNjacOzbicscG9pbnRzOmxpc3R9XSwnd2QnKSl9JHtncmFwaENhcmQoJ1NwaW5zIHBvciBtw6FxdWluYS1kw61hJyxjaGFydFYyKFt7bmFtZTonU2VsZWNjacOzbicscG9pbnRzOmxpc3R9XSwnc2QnKSl9JHtncmFwaENhcmQoJ0FwdWVzdGEgcHJvbWVkaW8geSBwYXlvdXQnLGNvbWJpbmVkQ2hhcnQobGlzdCwnYmV0JywncG8nKSwnQ0xQIHkgJSDCtyBFamVzIGluZGVwZW5kaWVudGVzJyl9PC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPkluZGljYWRvcmVzIG1lbnN1YWxlczwvaDI+JHtyZXBvcnRUYWJsZShsaXN0LGNvbHMsJ01lcycpfTwvZGl2PjxkaXYgY2xhc3M9ImNhcmQiPjxoMj5QbGF0YWZvcm1hcyBmcmVudGUgYSBsYSBzZWxlY2Npw7NuPC9oMj48ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+VmFyaWFjacOzbiA9IGluZGljYWRvciBkZSBsYSBwbGF0YWZvcm1hIC8gaW5kaWNhZG9yIGRlIGxhIHNlbGVjY2nDs24g4oiSIDEuIE1pc21hcyBmZWNoYXMuPC9kaXY+PGRpdiBjbGFzcz0idGFibGV3cmFwIj48dGFibGU+PHRoZWFkPjx0cj48dGg+UGxhdGFmb3JtYTwvdGg+PHRoPkNvaW4gSW4gLyBkw61hPC90aD48dGg+VmFyaWFjacOzbiBDSTwvdGg+PHRoPldpbiAvIGTDrWE8L3RoPjx0aD5WYXJpYWNpw7NuIFdpbjwvdGg+PHRoPlNwaW5zIC8gZMOtYTwvdGg+PHRoPlZhcmlhY2nDs24gc3BpbnM8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+JHtwbGF0Zm9ybXMubWFwKHA9PmA8dHI+PHRkPiR7ZXNjKHAubmFtZSl9PC90ZD4ke1snY2QnLCd3ZCcsJ3NkJ10ubWFwKGs9PmA8dGQ+JHtmbXQocFtrXSl9PC90ZD48dGQ+JHshYmFzZVtrXT8n4oCUJzooKHBba10vYmFzZVtrXS0xKSoxMDApLnRvTG9jYWxlU3RyaW5nKCdlcy1DTCcse21heGltdW1GcmFjdGlvbkRpZ2l0czoxfSkrJyUnfTwvdGQ+YCkuam9pbignJyl9PC90cj5gKS5qb2luKCcnKX08L3Rib2R5PjwvdGFibGU+PC9kaXY+PC9kaXY+YDsKIGJpbmRSZXBvcnQoJ21vbnRobHlFdm9sdXRpb24nKTsKfQpmdW5jdGlvbiBleHRyYVJlcG9ydHMoKXsKIGNvbnN0IHM9dmlld1N0YXRlLmV4dHJhLHJvd3M9c2xpY2VSb3dzKHMuZmlsdGVycyk7bGV0IGNvbnRlbnQ9JycsZXhwb3J0RGF0YT1bXTsKIGlmKHMua2luZD09PSd3aW5sb3NlJyl7CiAgY29uc3QgbWFjaGluZXM9Z3JvdXBzKHJvd3Mscj0+U3RyaW5nKHJbMV0/PydTaW4gZGF0bycpKSx3aW5zPW1hY2hpbmVzLmZpbHRlcihwPT5wLndpbj49MCkuc29ydCgoYSxiKT0+Yi53aW4tYS53aW4pLGxvc3Nlcz1tYWNoaW5lcy5maWx0ZXIocD0+cC53aW48MCkuc29ydCgoYSxiKT0+YS53aW4tYi53aW4pLGNvbHM9Wyd3aW4nLCdwbycsJ3BvbicsJ2RldicsJ3ByaXplJywncHJvbW8nXTsKICBjb25zdCBkZXRhaWw9aXRlbXM9PmA8ZGl2IGNsYXNzPSJ0YWJsZXdyYXAiPjx0YWJsZT48dGhlYWQ+PHRyPjx0aD5Nw6FxdWluYSAvIE1vZGVsbzwvdGg+JHtjb2xzLm1hcChrPT5gPHRoPiR7bWV0cmljc1trXX08L3RoPmApLmpvaW4oJycpfTwvdHI+PC90aGVhZD48dGJvZHk+JHtpdGVtcy5tYXAocD0+YDx0cj48dGQ+JHtlc2MocC5uYW1lKX0gwrcgJHtlc2MocC5yb3dzLmF0KC0xKT8uWzRdKX08L3RkPiR7Y29scy5tYXAoaz0+YDx0ZD4ke2ZtdChwW2tdLGspfTwvdGQ+YCkuam9pbignJyl9PC90cj5gKS5qb2luKCcnKX08L3Rib2R5PjwvdGFibGU+PC9kaXY+YDsKICBjb250ZW50PWA8ZGl2IGNsYXNzPSJjaGFydHMiPiR7Z3JhcGhDYXJkKCdNYXlvciBXaW4gb3BlcmFjaW9uYWwnLGJhcnNWMih3aW5zLnNsaWNlKDAsMTApLCd3aW4nKSl9JHtncmFwaENhcmQoJ01lbm9yIFdpbiBvcGVyYWNpb25hbCcsYmFyc1YyKGxvc3Nlcy5zbGljZSgwLDEwKSwnd2luJykpfTwvZGl2PjxkaXYgY2xhc3M9ImNhcmQiPjxoMj5XaW4gcG9zaXRpdm8gbyBjZXJvIMK3ICR7d2lucy5sZW5ndGh9IG3DoXF1aW5hczwvaDI+JHtkZXRhaWwod2lucyl9PC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPldpbiBuZWdhdGl2byDCtyAke2xvc3Nlcy5sZW5ndGh9IG3DoXF1aW5hczwvaDI+JHtkZXRhaWwobG9zc2VzKX08L2Rpdj5gOwogIGV4cG9ydERhdGE9W1snTcOhcXVpbmEnLC4uLmNvbHMubWFwKGs9Pm1ldHJpY3Nba10pXSwuLi5tYWNoaW5lcy5tYXAocD0+W3AubmFtZSwuLi5jb2xzLm1hcChrPT5wW2tdPz8nJyldKV07CiB9ZWxzZSBpZihzLmtpbmQ9PT0nc2Fsb24nKXsKICBjb25zdCBwcmVmPXJvd3MuZmlsdGVyKHByZWZlcmVuY2lhbCksbW9udGhzPXJlcG9ydFNlcmllcyhwcmVmLCdtb250aCcpLHdlZWtzPXJlcG9ydFNlcmllcyhwcmVmLCd3ZWVrJyksYT1hZ2cocHJlZik7CiAgY29udGVudD1zdGF0Q2FyZHMoW1snV0lOIFBSRUZFUkVOQ0lBTCcsY29tcGFjdChhLndpbiwnd2luJyksJ0NMUCddLFsnQ09JTiBJTiBQUkVGRVJFTkNJQUwnLGNvbXBhY3QoYS5jb2luLCdjb2luJyksJ0NMUCddLFsnQ09JTiBJTiAvIETDjUEnLGZtdChhLmNkKSwnUG9yIG3DoXF1aW5hLWTDrWEgcmVnaXN0cmFkbyddLFsnV0lOIC8gRMONQScsZm10KGEud2QpLCdQb3IgbcOhcXVpbmEtZMOtYSByZWdpc3RyYWRvJ11dKStgPGRpdiBjbGFzcz0iY2hhcnRzIj4ke2dyYXBoQ2FyZCgnU2VndWltaWVudG8gc2VtYW5hbCDCtyBDb2luIEluIHBvciBkw61hJyxjaGFydFYyKFt7bmFtZTonUHJlZmVyZW5jaWFsJyxwb2ludHM6d2Vla3N9XSwnY2QnKSl9JHtncmFwaENhcmQoJ1NlZ3VpbWllbnRvIHNlbWFuYWwgwrcgV2luIHBvciBkw61hJyxjaGFydFYyKFt7bmFtZTonUHJlZmVyZW5jaWFsJyxwb2ludHM6d2Vla3N9XSwnd2QnKSl9PC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPkV2b2x1dGl2byBtZW5zdWFsIGRlbCBzYWzDs24gcHJlZmVyZW5jaWFsPC9oMj4ke3JlcG9ydFRhYmxlKG1vbnRocyxbJ2NkJywnd2QnLCdzZCcsJ2JldCcsJ3BvJywncG9uJywnd2luJywnY29pbiddKX08L2Rpdj5gOwogIGV4cG9ydERhdGE9W1snTWVzJywnQ29pbiBJbiBwb3IgZMOtYScsJ1dpbiBwb3IgZMOtYScsJ1NwaW5zIHBvciBkw61hJ10sLi4ubW9udGhzLm1hcChwPT5bcC5uYW1lLHAuY2QscC53ZCxwLnNkXSldOwogfWVsc2UgaWYocy5raW5kPT09J3F1YWxpdHknKXsKICBjb25zdCBieURhdGU9bmV3IE1hcChncm91cHMoc2xpY2VSb3dzKCkscj0+clswXSkubWFwKHA9PltwLm5hbWUscF0pKSxjb250cm9scz0oZGF0YS5jb250cm9sc3x8W10pLmZpbHRlcihjPT5hY2NlcHRzQ2FsZW5kYXJWOChbYy5kYXRlXSxjYWxlbmRhclN0YXRlVjgoJ2dsb2JhbCcpLCQoJyNmcm9tJykudmFsdWUsJCgnI3RvJykudmFsdWUpKSxkZXRhaWxzPWNvbnRyb2xzLm1hcChjPT4oe2RhdGU6Yy5kYXRlLHNvdXJjZTpjLndpbixhY3R1YWw6YnlEYXRlLmdldChjLmRhdGUpPy53aW4/P251bGx9KSk7CiAgY29udGVudD1gPGRpdiBjbGFzcz0ibm90aWNlIj5Db25jaWxpYWNpw7NuIGNvbnRyYSBXSU4gZmluYWwgZGUgVVRJTElEQUQgUkVTVU1FTiBkZWwgYXJjaGl2byBXaW4gVGl0dG8uIFNlIGNvbnN1bHRhIHRvZG8gZWwgcGFycXVlIGVuIGxhcyBmZWNoYXMsIHNpbiBmaWx0cm9zIGRlIGNhdGVnb3LDrWFzLiBTb2xvIGhheSBjb250cm9sZXMgcGFyYSBmZWNoYXMgaW1wb3J0YWRhcyBkZXNkZSB1biBhcmNoaXZvIGNvbiBlc2EgcGVzdGHDsWEuIExvcyBjb250cm9sZXMgZGUgbGEgZnVlbnRlIHNlIGFqdXN0YW4gYSBsYSBtaXNtYSBwb2JsYWNpw7NuIGRlIHJlZ2lzdHJvcyBhcGxpY2FibGVzIHV0aWxpemFkYSBlbiBsb3MgaW5mb3JtZXMuPC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPkNvbmNpbGlhY2nDs24gZGlhcmlhPC9oMj48ZGl2IGNsYXNzPSJ0YWJsZXdyYXAiPjx0YWJsZT48dGhlYWQ+PHRyPjx0aD5GZWNoYTwvdGg+PHRoPldJTiBmdWVudGUgYWp1c3RhZG88L3RoPjx0aD5XaW4gYXBsaWNhYmxlIGRlIE1hdHJpejwvdGg+PHRoPkRpZmVyZW5jaWE8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+JHtkZXRhaWxzLm1hcChjPT5gPHRyPjx0ZD4ke2MuZGF0ZX08L3RkPjx0ZD4ke2ZtdChjLnNvdXJjZSl9PC90ZD48dGQ+JHtmbXQoYy5hY3R1YWwpfTwvdGQ+PHRkPiR7Yy5hY3R1YWw9PW51bGw/J1NpbiByZWdpc3Rybyc6Zm10KGMuYWN0dWFsLWMuc291cmNlKX08L3RkPjwvdHI+YCkuam9pbignJyl8fCc8dHI+PHRkIGNvbHNwYW49IjQiPlNpbiBjb250cm9sZXMgZGUgVVRJTElEQUQgUkVTVU1FTiBwYXJhIGVzdGFzIGZlY2hhcy48L3RkPjwvdHI+J308L3Rib2R5PjwvdGFibGU+PC9kaXY+PC9kaXY+YDsKICBleHBvcnREYXRhPVtbJ0ZlY2hhJywnV0lOIGZ1ZW50ZSBhanVzdGFkbycsJ1dpbiBNYXRyaXonLCdEaWZlcmVuY2lhJ10sLi4uZGV0YWlscy5tYXAoYz0+W2MuZGF0ZSxjLnNvdXJjZSxjLmFjdHVhbCxjLmFjdHVhbD09bnVsbD8nJzpjLmFjdHVhbC1jLnNvdXJjZV0pXTsKIH1lbHNlewogIGNvbnN0IGRpbT1zLmtpbmQ9PT0nYnJhbmRzJz8yOjMsbGlzdD1ncm91cHMocm93cyxyPT5TdHJpbmcocltkaW1dPz8nU2luIGRhdG8nKSkuc29ydCgoYSxiKT0+Yi5jZC1hLmNkKSxjb2xzPVsnY2QnLCd3ZCcsJ2JldCcsJ3BvJywncG9uJywncHJvbW8nLCd3aW4nLCdjb2luJywnc2QnXTsKICBjb250ZW50PWA8ZGl2IGNsYXNzPSJjaGFydHMiPiR7Z3JhcGhDYXJkKCdDb2luIEluIHBvciBtw6FxdWluYS1kw61hJyxiYXJzVjIobGlzdC5zbGljZSgwLDEyKSwnY2QnKSl9JHtncmFwaENhcmQoJ1dpbiBwb3IgbcOhcXVpbmEtZMOtYScsYmFyc1YyKFsuLi5saXN0XS5zb3J0KChhLGIpPT5iLndkLWEud2QpLnNsaWNlKDAsMTIpLCd3ZCcpKX08L2Rpdj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+UmVuZGltaWVudG8gcG9yICR7ZGltPT09Mj8nZmFicmljYW50ZSc6J3BsYXRhZm9ybWEnfTwvaDI+JHtyZXBvcnRUYWJsZShsaXN0LGNvbHMsZGltc1tkaW1dKX08L2Rpdj48cCBjbGFzcz0ic3VidGl0bGUiPkVsIGFyY2hpdm8gV2luIFRpdHRvIG5vIGluY2x1eWUgYcOxbyBkZSBmYWJyaWNhY2nDs246IG5vIHNlIGluZmllcmUgYW50aWfDvGVkYWQgcGFyYSBsb3MgZ3LDoWZpY29zIGRlbCBwYXJxdWUgcG9yIGVkYWQuPC9wPmA7CiAgZXhwb3J0RGF0YT1bW2RpbXNbZGltXSwuLi5jb2xzLm1hcChrPT5tZXRyaWNzW2tdKV0sLi4ubGlzdC5tYXAocD0+W3AubmFtZSwuLi5jb2xzLm1hcChrPT5wW2tdPz8nJyldKV07CiB9CiBleHBvcnRSb3dzPWV4cG9ydERhdGE7CiAkKCcjY29udGVudCcpLmlubmVySFRNTD1iYW5uZXIoJ03DoXMgaW5mb3JtZXMgZGVsIEV4Y2VsJywnU2Fsw7NuIHByZWZlcmVuY2lhbCwgV2luIC8gTG9zZSwgZmFicmljYW50ZXMsIHBsYXRhZm9ybWFzIHkgY29uY2lsaWFjacOzbiBkZSBsYSBmdWVudGUuJykrYDxzZWN0aW9uIGNsYXNzPSJjYXJkIj48ZGl2IGNsYXNzPSJ2aWV3Y29udHJvbHMiPiR7c2VsZWN0b3IoJ0luZm9ybWUnLCdleHRyYUtpbmQnLHMua2luZCx7c2Fsb246J1NhbMOzbiBwcmVmZXJlbmNpYWwnLHdpbmxvc2U6J1dpbiAvIExvc2UgcG9yIG3DoXF1aW5hJyxicmFuZHM6J0ZhYnJpY2FudGVzJyxwbGF0Zm9ybXM6J1BsYXRhZm9ybWFzJyxxdWFsaXR5OidDb25jaWxpYWNpw7NuIGRlIFdpbiBUaXR0byd9KX08L2Rpdj4ke3Mua2luZD09PSdxdWFsaXR5Jz8nJzpgPGRpdiBjbGFzcz0iZmlsdGVyZ3JpZCI+JHtmaWx0ZXJGaWVsZHMocywnZXh0cmEnKX08L2Rpdj5gfTwvc2VjdGlvbj5gK2NvbnRlbnQ7CiBiaW5kRmlsdGVycygpOyQoJyNleHRyYUtpbmQnKS5vbmNoYW5nZT1lPT57cy5raW5kPWUudGFyZ2V0LnZhbHVlO3JlbmRlcigpfTsKfQpjb25zdCByZW5kZXJCZWZvcmVSZXBvcnRzPXJlbmRlcjsKcmVuZGVyPWZ1bmN0aW9uKCl7CiBpZighZGF0YSlyZXR1cm47CiBpZihbJ1JlcG9ydGUgc2VtYW5hbCcsJ1JlcG9ydGUgbWVuc3VhbCcsJ0V2b2x1dGl2byBtZW5zdWFsJywnT3Ryb3MgaW5mb3JtZXMnXS5pbmNsdWRlcyh0YWIpKXsKICAkKCcjZmlsdGVycycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOyQoJyNjb250cm9scycpLnN0eWxlLmRpc3BsYXk9J25vbmUnO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5maWx0ZXJzJykuc3R5bGUuZGlzcGxheT0nYmxvY2snO2RvY3VtZW50LmJvZHkuZGF0YXNldC52aWV3PXRhYjskKCcjdmlld0hlbHAnKS50ZXh0Q29udGVudD0nRmVjaGFzIGRlIGVzdGUgaW5mb3JtZS4nOyQoJyN0aXRsZScpLnRleHRDb250ZW50PXRhYjsKICBpZih0YWI9PT0nUmVwb3J0ZSBzZW1hbmFsJylwZXJpb2RSZXBvcnRzKCd3ZWVrJyk7ZWxzZSBpZih0YWI9PT0nUmVwb3J0ZSBtZW5zdWFsJylwZXJpb2RSZXBvcnRzKCdtb250aCcpO2Vsc2UgaWYodGFiPT09J0V2b2x1dGl2byBtZW5zdWFsJyltb250aGx5RXZvbHV0aW9uUmVwb3J0KCk7ZWxzZSBleHRyYVJlcG9ydHMoKTsKIH1lbHNle3JlbmRlckJlZm9yZVJlcG9ydHMoKTtpZih0YWI9PT0nTWV0b2RvbG9nw61hJykkKCcjY29udGVudCcpLmluc2VydEFkamFjZW50SFRNTCgnYWZ0ZXJiZWdpbicsJzxkaXYgY2xhc3M9Im5vdGljZSI+Q2FyZ2EgZGlyZWN0YTogV2luIFRpdHRvIG8gUmVwb3J0ZSBMQSDihpIgTWF0cml6LiBTZSBhc2lnbmFuIGNvbHVtbmFzIHBvciBlbmNhYmV6YWRvIHkgc2UgY2FsY3VsYW4gU2VtYW5hLCBNZXMgeSBkw61hLiBQb3IgZGVmZWN0bywgbG9zIGTDrWFzIHJlY2liaWRvcyByZWVtcGxhemFuIGVzb3MgZMOtYXMgZGVsIGhpc3TDs3JpY287IGxvcyBkZW3DoXMgc2UgY29uc2VydmFuLiBMb3MgaW5mb3JtZXMgdXNhbiByZWdpc3Ryb3MgZGVsIGhpc3TDs3JpY28sIG5vIHRhYmxhcyBkaW7DoW1pY2FzIGd1YXJkYWRhcy4gTG9zIGdyw6FmaWNvcyBjb21iaW5hZG9zIHRpZW5lbiBlamVzIGluZGVwZW5kaWVudGVzIHkgdW5pZGFkZXMgaW5kaWNhZGFzLiBObyBzZSByZXByb2R1Y2VuIHJlZmVyZW5jaWFzIGRlZmVjdHVvc2FzIGRlbCBFeGNlbCBuaSBzZSBpbnZlbnRhIGVsIGHDsW8gZGUgZmFicmljYWNpw7NuIHF1ZSBubyB0cmFlIFdpbiBUaXR0by48L2Rpdj4nKX0KfTsKJCgnI25hdicpLmlubmVySFRNTD10YWJzVjMubWFwKCh0LGkpPT5gPGJ1dHRvbiBkYXRhLXRhYj0iJHt0fSIgY2xhc3M9IiR7dD09PXRhYj8nYWN0aXZlJzonJ30iPiR7Wyfil6snLCfilqQnLCfihpcnLCfil44nLCfilqUnLCfilqYnLCfijIEnLCfilqMnLCfik5gnXVtpXX0gJm5ic3A7ICR7dH08L2J1dHRvbj5gKS5qb2luKCcnKTsKZnVuY3Rpb24gYWN0aXZhdGVUYWJWMyh0KXt0YWI9dDtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCduYXYgYnV0dG9uJykuZm9yRWFjaChiPT5iLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsYi5kYXRhc2V0LnRhYj09PXRhYikpO3JlbmRlcigpfQpkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCduYXYgYnV0dG9uJykuZm9yRWFjaChiPT5iLm9uY2xpY2s9KCk9PmFjdGl2YXRlVGFiVjMoYi5kYXRhc2V0LnRhYikpOwokKCcjdjJzYXZlJykub25jbGljaz1hc3luYygpPT57aWYoIWRhdGEpcmV0dXJuO2NvbnN0IG5hbWU9cHJvbXB0KCdOb21icmUgZGUgbGEgdmlzdGEnKTtpZighbmFtZSlyZXR1cm47bGV0IG5leHQ9Wy4uLnNhdmVkVmlld3Mse3ZlcnNpb246MyxuYW1lLHRhYixmcm9tOiQoJyNmcm9tJykudmFsdWUsdG86JCgnI3RvJykudmFsdWUsc3RhdGU6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2aWV3U3RhdGUpKX1dO3RyeXthd2FpdCBycGMoJ3NhdmVWaWV3cycsSlNPTi5zdHJpbmdpZnkobmV4dCkpO3NhdmVkVmlld3M9bmV4dDtsb2FkVmlld3MoKX1jYXRjaChlKXthbGVydCgnTm8gc2UgZ3VhcmTDszogJytlLm1lc3NhZ2UpfX07CmxvYWRWaWV3cz1mdW5jdGlvbigpeyQoJyN2MnZpZXdzJykuaW5uZXJIVE1MPSc8b3B0aW9uIHZhbHVlPSIiPlZpc3RhcyBndWFyZGFkYXM8L29wdGlvbj4nK3NhdmVkVmlld3MubWFwKCh2LGkpPT5gPG9wdGlvbiB2YWx1ZT0iJHtpfSI+JHtlc2Modi5uYW1lKX0ke3YudmVyc2lvbj49Mj8nJzonIChhbnRlcmlvciknfTwvb3B0aW9uPmApLmpvaW4oJycpfTsKJCgnI3Yydmlld3MnKS5vbmNoYW5nZT0oKT0+e2lmKCQoJyN2MnZpZXdzJykudmFsdWU9PT0nJylyZXR1cm47Y29uc3Qgdj1zYXZlZFZpZXdzWyQoJyN2MnZpZXdzJykudmFsdWVdO2lmKHYudmVyc2lvbjwyfHwhdi5zdGF0ZSl7YWxlcnQoJ0NyZWEgZGUgbnVldm8gZXN0YSB2aXN0YSBkZWwgZGlzZcOxbyBpbmljaWFsLicpO3JldHVybn1PYmplY3QuYXNzaWduKHZpZXdTdGF0ZSxKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHYuc3RhdGUpKSk7JCgnI2Zyb20nKS52YWx1ZT12LmZyb207JCgnI3RvJykudmFsdWU9di50bzthY3RpdmF0ZVRhYlYzKHYudGFiKX07CmNvbnN0IHJlc2V0QmVmb3JlUmVwb3J0cz0kKCcjcmVzZXQnKS5vbmNsaWNrOyQoJyNyZXNldCcpLm9uY2xpY2s9KCk9Pntjb25zdCBrZXk9eydSZXBvcnRlIHNlbWFuYWwnOid3ZWVrbHknLCdSZXBvcnRlIG1lbnN1YWwnOidtb250aGx5JywnRXZvbHV0aXZvIG1lbnN1YWwnOidtb250aGx5RXZvbHV0aW9uJywnT3Ryb3MgaW5mb3JtZXMnOidleHRyYSd9W3RhYl07aWYoa2V5KXt2aWV3U3RhdGVba2V5XS5maWx0ZXJzPXt9O2xldFttaW4sbWF4XT1kYXRlUmFuZ2UoKTskKCcjZnJvbScpLnZhbHVlPW1pbjskKCcjdG8nKS52YWx1ZT1tYXg7cmVuZGVyKCl9ZWxzZSByZXNldEJlZm9yZVJlcG9ydHMoKX07Ci8vIEFkanVzdG1lbnRzIGRvIG5vdCBhcHBlYXIgYXMgc2VsZWN0YWJsZSBtYWNoaW5lcywgYmFua3MsIHNlY3RvcnMgb3IgbWFudWZhY3R1cmVycy4KY29uc3Qgb3B0aW9uc0JlZm9yZVJlcG9ydHM9b3B0aW9uc0ZvcjsKb3B0aW9uc0Zvcj1mdW5jdGlvbihrKXtyZXR1cm4gWy4uLm5ldyBTZXQoZGF0YS5yb3dzLmZpbHRlcihyPT4haXNFeHBpcmVkKHJbNV0pJiYhaXNFeHBpcmVkKHJbN10pKS5tYXAocj0+U3RyaW5nKHJba10/PydTaW4gZGF0bycpKSldLmZpbHRlcih2PT4haXNFeHBpcmVkKHYpKS5zb3J0KChhLGIpPT5hLmxvY2FsZUNvbXBhcmUoYix1bmRlZmluZWQse251bWVyaWM6dHJ1ZX0pKX07CgpsZXQgY2hhcnRDb3VudGVyVjQ9MDsKY29uc3QgY2hhcnRQb2ludHNWND1uZXcgTWFwKCk7CmZ1bmN0aW9uIHBlcmlvZERlc2NyaXB0aW9uVjQobmFtZSxwb2ludHMpewogY29uc3Qgcm93cz1wb2ludHMuZmxhdE1hcChwPT5wLnJvd3N8fFtdKSxkYXRlcz1bLi4ubmV3IFNldChyb3dzLm1hcChyPT5yWzBdKSldLnNvcnQoKTsKIGlmKCFkYXRlcy5sZW5ndGgpcmV0dXJuIHtsYWJlbDpuYW1lLHJhbmdlOicnLGZ1bGw6bmFtZX07CiBjb25zdCByYW5nZT1kYXRlc1swXT09PWRhdGVzLmF0KC0xKT9kYXRlc1swXTpkYXRlc1swXSsnIOKGkiAnK2RhdGVzLmF0KC0xKTsKIHJldHVybiB7bGFiZWw6bmFtZSxyYW5nZSxmdWxsOm5hbWUrJyDCtyBEYXRvczogJytyYW5nZSsnIMK3ICcrZGF0ZXMubGVuZ3RoKycgZMOtYXMgcmVnaXN0cmFkb3MnfTsKfQpmdW5jdGlvbiB2YWx1ZVY0KHZhbHVlLGtleSl7cmV0dXJuIGZtdCh2YWx1ZSxrZXkpKyhbJ3dpbicsJ2NvaW4nLCd3ZCcsJ2NkJywnYmV0JywncHJvbW8nLCdwcml6ZSddLmluY2x1ZGVzKGtleSkmJnZhbHVlIT1udWxsPycgQ0xQJzonJyl9CmZ1bmN0aW9uIGxhYmVsZWRDaGFydFY0KHNlcmllcyxrZXksZHVhbEtleXM9bnVsbCl7CiBjb25zdCBsYWJlbHM9Wy4uLm5ldyBTZXQoc2VyaWVzLmZsYXRNYXAocz0+cy5wb2ludHMubWFwKHA9PnAubmFtZSkpKV0uc29ydCgpOwogaWYoIWxhYmVscy5sZW5ndGgpcmV0dXJuICc8ZGl2IGNsYXNzPSJlbXB0eSI+U2luIGRhdG9zIHBhcmEgZXN0ZSBwZXLDrW9kby48L2Rpdj4nOwogY29uc3QgaWQ9J2NoYXJ0djQtJysoKytjaGFydENvdW50ZXJWNCksY29sb3JzPVsnIzI3YjhiZCcsJyM2NjhmY2InLCcjOGVjNmExJywnI2MwYTVkZicsJyNkOWFkNmUnLCcjZTY5NDhjJywnIzhjYmJjOScsJyNjNGNiODYnXTsKIGNvbnN0IGVudHJpZXM9bGFiZWxzLm1hcChsYWJlbD0+e2NvbnN0IHBvaW50cz1zZXJpZXMubWFwKHM9PnMucG9pbnRzLmZpbmQocD0+cC5uYW1lPT09bGFiZWwpKTtyZXR1cm4ge3BlcmlvZDpwZXJpb2REZXNjcmlwdGlvblY0KGxhYmVsLHBvaW50cy5maWx0ZXIoQm9vbGVhbikpLHZhbHVlczpwb2ludHMubWFwKChwLGkpPT5wPy5bZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5XT8/bnVsbCl9fSk7CiBjb25zdCB3aWR0aD1NYXRoLm1heCg2ODAsbGFiZWxzLmxlbmd0aCoxMDArMTIwKSxsZWZ0PTYwLHJpZ2h0PXdpZHRoLTYwLHRvcD03MCxib3R0b209MjQwLHg9aT0+bGFiZWxzLmxlbmd0aD09PTE/d2lkdGgvMjpsZWZ0K2kvKGxhYmVscy5sZW5ndGgtMSkqKHJpZ2h0LWxlZnQpOwogY29uc3QgYWxsVmFsdWVzPWVudHJpZXMuZmxhdE1hcChlPT5lLnZhbHVlcykuZmlsdGVyKHY9PnYhPW51bGwmJk51bWJlci5pc0Zpbml0ZSh2KSk7CiBjb25zdCBjb21tb249e2xvOk1hdGgubWluKDAsLi4uYWxsVmFsdWVzKSxoaTpNYXRoLm1heCgxLC4uLmFsbFZhbHVlcyl9OwogY29uc3Qgc2NhbGVzPXNlcmllcy5tYXAoKHMsaSk9PntpZighZHVhbEtleXMpcmV0dXJuIGNvbW1vbjtsZXQgdmFscz1lbnRyaWVzLm1hcChlPT5lLnZhbHVlc1tpXSkuZmlsdGVyKHY9PnYhPW51bGwmJk51bWJlci5pc0Zpbml0ZSh2KSk7cmV0dXJuIHtsbzpNYXRoLm1pbigwLC4uLnZhbHMpLGhpOk1hdGgubWF4KDAuMDAwMDAxLC4uLnZhbHMpfX0pOwogY29uc3QgeT0odixpKT0+Ym90dG9tLSh2LXNjYWxlc1tpXS5sbykvKHNjYWxlc1tpXS5oaS1zY2FsZXNbaV0ubG98fDEpKihib3R0b20tdG9wKTsKIGNvbnN0IHRleHRzPWVudHJpZXMubWFwKGU9PmUucGVyaW9kLmZ1bGwrJyB8ICcrc2VyaWVzLm1hcCgocyxpKT0+cy5uYW1lKyc6ICcrdmFsdWVWNChlLnZhbHVlc1tpXSxkdWFsS2V5cz9kdWFsS2V5c1tpXTprZXkpKS5qb2luKCcgfCAnKSk7Y2hhcnRQb2ludHNWNC5zZXQoaWQsdGV4dHMpOwogY29uc3QgbGVnZW5kPWA8ZGl2IGNsYXNzPSJsZWdlbmQgbGFiZWxlZGxlZ2VuZCI+JHtzZXJpZXMubWFwKChzLGkpPT5gPHNwYW4+PGkgc3R5bGU9ImJhY2tncm91bmQ6JHtjb2xvcnNbaSVjb2xvcnMubGVuZ3RoXX0iPjwvaT4ke2VzYyhzLm5hbWUpfSR7ZHVhbEtleXM/KGk9PT0wPycgwrcgZWplIGl6cXVpZXJkbyc6JyDCtyBlamUgZGVyZWNobycpOicnfTwvc3Bhbj5gKS5qb2luKCcnKX08L2Rpdj5gOwogbGV0IGxpbmVzPXNlcmllcy5tYXAoKHMsaSk9PnsKICBjb25zdCB2YWxpZD1lbnRyaWVzLm1hcCgoZSxqKT0+KHtlLGp9KSkuZmlsdGVyKCh7ZX0pPT5lLnZhbHVlc1tpXSE9bnVsbCk7CiAgcmV0dXJuIGA8cG9seWxpbmUgZmlsbD0ibm9uZSIgc3Ryb2tlPSIke2NvbG9yc1tpJWNvbG9ycy5sZW5ndGhdfSIgc3Ryb2tlLXdpZHRoPSIzIiBwb2ludHM9IiR7dmFsaWQubWFwKCh7ZSxqfSk9PmAke3goail9LCR7eShlLnZhbHVlc1tpXSxpKX1gKS5qb2luKCcgJyl9Ii8+JHt2YWxpZC5tYXAoKHtlLGp9KT0+ewogICBjb25zdCBjeT15KGUudmFsdWVzW2ldLGkpLG90aGVyPWR1YWxLZXlzJiZlLnZhbHVlc1sxLWldIT1udWxsP3koZS52YWx1ZXNbMS1pXSwxLWkpOm51bGw7CiAgIGNvbnN0IG9mZnNldD1vdGhlcj09bnVsbD8tMTM6KGN5PD1vdGhlcj8tMTM6MjIpOwogICByZXR1cm4gYDxjaXJjbGUgY3g9IiR7eChqKX0iIGN5PSIke2N5fSIgcj0iNiIgZmlsbD0iJHtwb2ludENvbG9yVjYoZW50cmllcyxqLGksZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5KX0iIHN0cm9rZT0idmFyKC0tcGxvdGJnKSIgc3Ryb2tlLXdpZHRoPSIyIiB0YWJpbmRleD0iMCIgcm9sZT0iYnV0dG9uIiBkYXRhLWNoYXJ0djQ9IiR7aWR9IiBkYXRhLXBvaW50djQ9IiR7an0iIGFyaWEtbGFiZWw9IiR7ZXNjKHRleHRzW2pdKX0iPjx0aXRsZT4ke2VzYyh0ZXh0c1tqXSl9PC90aXRsZT48L2NpcmNsZT4ke3Nlcmllcy5sZW5ndGg8PTI/YDx0ZXh0IHg9IiR7eChqKX0iIHk9IiR7Y3krb2Zmc2V0fSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iJHtwb2ludENvbG9yVjYoZW50cmllcyxqLGksZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5KX0iPiR7ZXNjKGNvbXBhY3QoZS52YWx1ZXNbaV0sZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5KSl9PC90ZXh0PmA6Jyd9YDsKICB9KS5qb2luKCcnKX1gOwogfSkuam9pbignJyk7CiBjb25zdCB0aWNrcz1bMCwuNSwxXS5tYXAoZj0+e2NvbnN0IHl5PWJvdHRvbS1mKihib3R0b20tdG9wKTtyZXR1cm4gYDxsaW5lIHgxPSIke2xlZnR9IiB5MT0iJHt5eX0iIHgyPSIke3JpZ2h0fSIgeTI9IiR7eXl9IiBzdHJva2U9InZhcigtLXBsb3RncmlkKSIgc3Ryb2tlLWRhc2hhcnJheT0iMyA0Ii8+PHRleHQgeD0iJHtsZWZ0LTEyfSIgeT0iJHt5eSs0fSIgdGV4dC1hbmNob3I9ImVuZCIgZm9udC1zaXplPSIxMCIgZmlsbD0idmFyKC0tcGxvdHRleHQpIj4ke2VzYyhjb21wYWN0KHNjYWxlc1swXS5sbytmKihzY2FsZXNbMF0uaGktc2NhbGVzWzBdLmxvKSxkdWFsS2V5cz9kdWFsS2V5c1swXTprZXkpKX08L3RleHQ+JHtkdWFsS2V5cz9gPHRleHQgeD0iJHtyaWdodCsxMn0iIHk9IiR7eXkrNH0iIGZvbnQtc2l6ZT0iMTAiIGZpbGw9InZhcigtLXBsb3R0ZXh0KSI+JHtlc2MoY29tcGFjdChzY2FsZXNbMV0ubG8rZiooc2NhbGVzWzFdLmhpLXNjYWxlc1sxXS5sbyksZHVhbEtleXNbMV0pKX08L3RleHQ+YDonJ31gfSkuam9pbignJyk7CiBjb25zdCBwZXJpb2RzPWVudHJpZXMubWFwKChlLGopPT5gPHRleHQgeD0iJHt4KGopfSIgeT0iMjg1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEyIiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSJ2YXIoLS1wbG90dGV4dCkiPiR7YXhpc1BlcmlvZFYxNChlLnBlcmlvZC5sYWJlbCkucmVwbGFjZSgneD0iMCInLCd4PSInK3goaikrJyInKX08L3RleHQ+PHRleHQgeD0iJHt4KGopfSIgeT0iMzI2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEwIiBmaWxsPSJ2YXIoLS1wbG90dGV4dCkiPiR7ZXNjKGF4aXNEYXRlc1YxNChlLnBlcmlvZC5yYW5nZSkpfTwvdGV4dD5gKS5qb2luKCcnKTsKIGNvbnN0IGRldGFpbHM9YDxkaXYgY2xhc3M9ImNoYXJ0ZGF0YXdyYXAiPjx0YWJsZSBjbGFzcz0iY2hhcnRkYXRhdGFibGUiPjxjYXB0aW9uPlZhbG9yZXMgZXhhY3RvcyBkZSB0b2RvcyBsb3MgcHVudG9zPC9jYXB0aW9uPjx0aGVhZD48dHI+PHRoPlBlcsOtb2RvPC90aD48dGg+RmVjaGFzIGNvbiBkYXRvczwvdGg+JHtzZXJpZXMubWFwKHM9PmA8dGg+JHtlc2Mocy5uYW1lKX08L3RoPmApLmpvaW4oJycpfTwvdHI+PC90aGVhZD48dGJvZHk+JHtlbnRyaWVzLm1hcChlPT5gPHRyPjx0ZD4ke2VzYyhlLnBlcmlvZC5sYWJlbCl9PC90ZD48dGQ+JHtlc2MoZS5wZXJpb2QucmFuZ2V8fCfigJQnKX08L3RkPiR7ZS52YWx1ZXMubWFwKCh2LGkpPT57Y29uc3QgaW5kZXg9ZW50cmllcy5pbmRleE9mKGUpLHNpZ25hbD1wb2ludFNpZ25hbFY2KGVudHJpZXMsaW5kZXgsaSxkdWFsS2V5cz9kdWFsS2V5c1tpXTprZXkpO3JldHVybiBgPHRkIGNsYXNzPSJ0cmFmZmljLSR7c2lnbmFsLnN0YXRlfSIgdGl0bGU9IiR7ZXNjKHNpZ25hbC5sYWJlbCl9Ij4ke3NpZ25hbC5zdGF0ZT09PSduZXV0cmFsJz8nJzon4pePICd9JHt2YWx1ZVY0KHYsZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5KX08L3RkPmB9KS5qb2luKCcnKX08L3RyPmApLmpvaW4oJycpfTwvdGJvZHk+PC90YWJsZT48L2Rpdj5gOwogcmV0dXJuIGxlZ2VuZCtgPGRpdiBjbGFzcz0iY2hhcnRzY3JvbGwiPjxzdmcgY2xhc3M9ImxhYmVsZWRzdmciIHN0eWxlPSJmb250LWZhbWlseTpBcmlhbCxzYW5zLXNlcmlmO3dpZHRoOiR7d2lkdGh9cHg7bWluLXdpZHRoOjEwMCU7aGVpZ2h0OjM1MHB4IiB2aWV3Qm94PSIwIDAgJHt3aWR0aH0gMzUwIiByb2xlPSJpbWciIGFyaWEtbGFiZWw9IiR7ZXNjKHNlcmllcy5tYXAocz0+cy5uYW1lKS5qb2luKCcgeSAnKSl9Ij4ke3RpY2tzfSR7bGluZXN9JHtwZXJpb2RzfTwvc3ZnPjwvZGl2PjxkaXYgaWQ9IiR7aWR9IiBjbGFzcz0iY2hhcnRyZWFkb3V0IiBhcmlhLWxpdmU9InBvbGl0ZSI+UGFzYSBlbCBjdXJzb3IsIHRvY2EgbyBlbmZvY2EgdW4gcHVudG8gcGFyYSB2ZXIgc3UgcGVyw61vZG8geSB0b2RvcyBzdXMgdmFsb3Jlcy4gU2kgaGF5IG11Y2hvcyBwZXLDrW9kb3MsIGRlc2xpemEgZWwgZ3LDoWZpY28gaG9yaXpvbnRhbG1lbnRlLjwvZGl2PmArZGV0YWlsczsKfQpjaGFydFYyPWZ1bmN0aW9uKHNlcmllcyxrZXkpe3JldHVybiBsYWJlbGVkQ2hhcnRWNChzZXJpZXMsa2V5KX07CmNvbWJpbmVkQ2hhcnQ9ZnVuY3Rpb24ocG9pbnRzLGZpcnN0LHNlY29uZCl7cmV0dXJuIGxhYmVsZWRDaGFydFY0KFt7bmFtZTptZXRyaWNzW2ZpcnN0XSxwb2ludHN9LHtuYW1lOm1ldHJpY3Nbc2Vjb25kXSxwb2ludHN9XSxudWxsLFtmaXJzdCxzZWNvbmRdKX07CmZ1bmN0aW9uIGluc3BlY3RQb2ludFY0KGV2ZW50KXtjb25zdCB0YXJnZXQ9ZXZlbnQudGFyZ2V0LmNsb3Nlc3Q/LignW2RhdGEtY2hhcnR2NF0nKTtpZighdGFyZ2V0KXJldHVybjtjb25zdCB2YWx1ZXM9Y2hhcnRQb2ludHNWNC5nZXQodGFyZ2V0LmRhdGFzZXQuY2hhcnR2NCkscmVhZG91dD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YXJnZXQuZGF0YXNldC5jaGFydHY0KTtpZih2YWx1ZXMmJnJlYWRvdXQpcmVhZG91dC50ZXh0Q29udGVudD12YWx1ZXNbK3RhcmdldC5kYXRhc2V0LnBvaW50djRdfQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyb3ZlcicsaW5zcGVjdFBvaW50VjQpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLGluc3BlY3RQb2ludFY0KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsaW5zcGVjdFBvaW50VjQpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGV2ZW50PT57aWYoZXZlbnQua2V5PT09J0VudGVyJ3x8ZXZlbnQua2V5PT09JyAnKXtpZihldmVudC50YXJnZXQuY2xvc2VzdD8uKCdbZGF0YS1jaGFydHY0XScpKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2luc3BlY3RQb2ludFY0KGV2ZW50KX19fSk7CmNvbnN0IHJlbmRlckJlZm9yZVY0PXJlbmRlcjtyZW5kZXI9ZnVuY3Rpb24oKXtjaGFydFBvaW50c1Y0LmNsZWFyKCk7cmVuZGVyQmVmb3JlVjQoKX07Cgpjb25zdCBtb250aE5hbWVzVjU9WydlbmVybycsJ2ZlYnJlcm8nLCdtYXJ6bycsJ2FicmlsJywnbWF5bycsJ2p1bmlvJywnanVsaW8nLCdhZ29zdG8nLCdzZXB0aWVtYnJlJywnb2N0dWJyZScsJ25vdmllbWJyZScsJ2RpY2llbWJyZSddOwpmdW5jdGlvbiBkaXNwbGF5RGF0ZXNWNSh2YWx1ZSl7CiByZXR1cm4gU3RyaW5nKHZhbHVlPz8nJykucmVwbGFjZSgvXGIoXGR7NH0pLShcZHsyfSktKFxkezJ9KVxiL2csKG1hdGNoLHksbSxkKT0+ewogIGNvbnN0IG1vbnRoPSttO2lmKG1vbnRoPDF8fG1vbnRoPjEyfHwrZDwxfHwrZD4zMSlyZXR1cm4gbWF0Y2g7CiAgcmV0dXJuIGAke051bWJlcihkKX0gJHttb250aE5hbWVzVjVbbW9udGgtMV19ICR7eX1gOwogfSkucmVwbGFjZSgvXGIoXGR7NH0pLShcZHsyfSlcYi9nLChtYXRjaCx5LG0pPT57CiAgY29uc3QgbW9udGg9K207aWYobW9udGg8MXx8bW9udGg+MTIpcmV0dXJuIG1hdGNoOwogIGNvbnN0IG5hbWU9bW9udGhOYW1lc1Y1W21vbnRoLTFdO3JldHVybiBuYW1lWzBdLnRvVXBwZXJDYXNlKCkrbmFtZS5zbGljZSgxKSsnICcreTsKIH0pLnJlcGxhY2UoL1xiKFxkezR9KSDCtyBTKFxkezEsMn0pXGIvZywobWF0Y2gseSx3KT0+YFNlbWFuYSAke051bWJlcih3KX0gwrcgJHt5fWApOwp9CmNvbnN0IHBlcmlvZERlc2NyaXB0aW9uQmVmb3JlVjU9cGVyaW9kRGVzY3JpcHRpb25WNDsKcGVyaW9kRGVzY3JpcHRpb25WND1mdW5jdGlvbihuYW1lLHBvaW50cyl7CiBjb25zdCBwPXBlcmlvZERlc2NyaXB0aW9uQmVmb3JlVjUobmFtZSxwb2ludHMpOwogcmV0dXJuIHtsYWJlbDpkaXNwbGF5RGF0ZXNWNShwLmxhYmVsKSxyYW5nZTpkaXNwbGF5RGF0ZXNWNShwLnJhbmdlKSxmdWxsOmRpc3BsYXlEYXRlc1Y1KHAuZnVsbCl9Owp9OwpmdW5jdGlvbiBmb3JtYXRUZXh0RGF0ZXNWNShyb290KXsKIGlmKCFyb290KXJldHVybjsKIGlmKHJvb3Qubm9kZVR5cGU9PT0zKXsKICBpZihyb290LnBhcmVudEVsZW1lbnQ/LmNsb3Nlc3QoJ3NjcmlwdCxzdHlsZSxvcHRpb24sdGV4dGFyZWEsW2NvbnRlbnRlZGl0YWJsZT0idHJ1ZSJdJykpcmV0dXJuOwogIGNvbnN0IHRleHQ9ZGlzcGxheURhdGVzVjUocm9vdC5ub2RlVmFsdWUpO2lmKHRleHQhPT1yb290Lm5vZGVWYWx1ZSlyb290Lm5vZGVWYWx1ZT10ZXh0OwogIHJldHVybjsKIH0KIGlmKHJvb3Qubm9kZVR5cGU9PT0xKXsKICBpZihyb290Lm1hdGNoZXMoJ3NjcmlwdCxzdHlsZSxvcHRpb24sdGV4dGFyZWEsW2NvbnRlbnRlZGl0YWJsZT0idHJ1ZSJdJykpcmV0dXJuOwogIGZvcihjb25zdCBjaGlsZCBvZiByb290LmNoaWxkTm9kZXMpZm9ybWF0VGV4dERhdGVzVjUoY2hpbGQpOwogfQp9CmNvbnN0IHJlbmRlckJlZm9yZVY1PXJlbmRlcjsKcmVuZGVyPWZ1bmN0aW9uKCl7cmVuZGVyQmVmb3JlVjUoKTtmb3JtYXRUZXh0RGF0ZXNWNShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtYWluJykpfTsKLy8gU3RhdHVzIG1lc3NhZ2VzIGFuZCBpbnRlcmFjdGl2ZSBwb2ludCBkZXRhaWxzIGNhbiB1cGRhdGUgYWZ0ZXIgYSByZW5kZXIuCmNvbnN0IGRhdGVPYnNlcnZlclY1PW5ldyBNdXRhdGlvbk9ic2VydmVyKHJlY29yZHM9PnsKIGZvcihjb25zdCByZWNvcmQgb2YgcmVjb3Jkcyl7CiAgaWYocmVjb3JkLnR5cGU9PT0nY2hhcmFjdGVyRGF0YScpZm9ybWF0VGV4dERhdGVzVjUocmVjb3JkLnRhcmdldCk7CiAgZWxzZSBmb3IoY29uc3Qgbm9kZSBvZiByZWNvcmQuYWRkZWROb2Rlcylmb3JtYXRUZXh0RGF0ZXNWNShub2RlKTsKIH0KfSk7CmRhdGVPYnNlcnZlclY1Lm9ic2VydmUoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWFpbicpLHtjaGlsZExpc3Q6dHJ1ZSxjaGFyYWN0ZXJEYXRhOnRydWUsc3VidHJlZTp0cnVlfSk7CmNvbnN0IGV4cG9ydEJlZm9yZVY1PSQoJyN2MmV4cG9ydCcpLm9uY2xpY2s7CiQoJyN2MmV4cG9ydCcpLm9uY2xpY2s9ZnVuY3Rpb24oKXsKIGNvbnN0IG9yaWdpbmFsPWV4cG9ydFJvd3M7CiB0cnl7ZXhwb3J0Um93cz1vcmlnaW5hbC5tYXAocm93PT5yb3cubWFwKHY9PnR5cGVvZiB2PT09J3N0cmluZyc/ZGlzcGxheURhdGVzVjUodik6dikpO3JldHVybiBleHBvcnRCZWZvcmVWNSgpfQogZmluYWxseXtleHBvcnRSb3dzPW9yaWdpbmFsfQp9OwoKY29uc3QgcmF0aW9LZXlzVjY9WydyYXRpbycsJ3JzJywncmInXTsKY29uc3QgdHJhZmZpY0NvbG9yc1Y2PXtyZWQ6JyNkNzQ3NDcnLHllbGxvdzonI2Q2OWIxNicsZ3JlZW46JyMxNjg0NTQnLG5ldXRyYWw6JyM4Mzk1YTUnfTsKZnVuY3Rpb24gcmF0aW9MaW1pdHNWNigpe2NvbnN0IHM9dmlld1N0YXRlLnJhdGlvcztyZXR1cm4ge3JlZDpOdW1iZXIuaXNGaW5pdGUocy5yZWRMaW1pdCk/cy5yZWRMaW1pdDouNjUsZ3JlZW46TnVtYmVyLmlzRmluaXRlKHMuZ3JlZW5MaW1pdCk/cy5ncmVlbkxpbWl0OjF9fQpmdW5jdGlvbiByYXRpb1NpZ25hbFY2KHZhbHVlKXsKIGlmKHZhbHVlPT1udWxsfHwhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSlyZXR1cm4ge3N0YXRlOiduZXV0cmFsJyxsYWJlbDonU2luIHJlZmVyZW5jaWEgZGlzcG9uaWJsZSd9OwogY29uc3QgbGltaXRzPXJhdGlvTGltaXRzVjYoKTsKIHJldHVybiB2YWx1ZTxsaW1pdHMucmVkP3tzdGF0ZToncmVkJyxsYWJlbDonQmFqbzogbWVub3IgcXVlICcrbGltaXRzLnJlZCsnw5cnfTp2YWx1ZTxsaW1pdHMuZ3JlZW4/e3N0YXRlOid5ZWxsb3cnLGxhYmVsOidNZWRpbyBhIGJham86IGVudHJlICcrbGltaXRzLnJlZCsnw5cgeSAnK2xpbWl0cy5ncmVlbisnw5cnfTp7c3RhdGU6J2dyZWVuJyxsYWJlbDonRW4gbyBzb2JyZSBlbCBuaXZlbCBlc3BlcmFkbzogZGVzZGUgJytsaW1pdHMuZ3JlZW4rJ8OXJ307Cn0KZnVuY3Rpb24gcmVwb3J0U2lnbmFsVjYodmFsdWUscHJldmlvdXMsa2V5KXsKIGlmKHJhdGlvS2V5c1Y2LmluY2x1ZGVzKGtleSkpcmV0dXJuIHJhdGlvU2lnbmFsVjYodmFsdWUpOwogaWYodmFsdWU9PW51bGx8fCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKXJldHVybiB7c3RhdGU6J25ldXRyYWwnLGxhYmVsOidTaW4gZGF0b3MnfTsKIGlmKCFbJ3dpbicsJ3dkJywnY29pbicsJ2NkJywnc3BpbicsJ3NkJ10uaW5jbHVkZXMoa2V5KSlyZXR1cm4ge3N0YXRlOiduZXV0cmFsJyxsYWJlbDonU2luIG1ldGEgZGVmaW5pZGE6IG5vIHNlIGNhbGlmaWNhIGNvbW8gYnVlbm8gbyBtYWxvJ307CiBpZigoa2V5PT09J3dpbid8fGtleT09PSd3ZCcpJiZ2YWx1ZTwwKXJldHVybiB7c3RhdGU6J3JlZCcsbGFiZWw6J1dpbiBuZWdhdGl2byd9OwogaWYocHJldmlvdXM9PW51bGx8fCFOdW1iZXIuaXNGaW5pdGUocHJldmlvdXMpKXJldHVybiB7c3RhdGU6J25ldXRyYWwnLGxhYmVsOidTaW4gcGVyw61vZG8gYW50ZXJpb3IgZGlzcG9uaWJsZSd9OwogaWYoKGtleT09PSd3aW4nfHxrZXk9PT0nd2QnKSYmcHJldmlvdXM8MClyZXR1cm4ge3N0YXRlOidncmVlbicsbGFiZWw6J1dpbiBwYXPDsyBkZSBuZWdhdGl2byBhIG5vIG5lZ2F0aXZvJ307CiByZXR1cm4gdmFsdWU+PXByZXZpb3VzP3tzdGF0ZTonZ3JlZW4nLGxhYmVsOidJZ3VhbCBvIHN1cGVyaW9yIGFsIHBlcsOtb2RvIGFudGVyaW9yIG1vc3RyYWRvJ306e3N0YXRlOidyZWQnLGxhYmVsOidJbmZlcmlvciBhbCBwZXLDrW9kbyBhbnRlcmlvciBtb3N0cmFkbyd9Owp9CmZ1bmN0aW9uIHBvaW50U2lnbmFsVjYoZW50cmllcyxqLGksa2V5KXtyZXR1cm4gcmVwb3J0U2lnbmFsVjYoZW50cmllc1tqXS52YWx1ZXNbaV0saj9lbnRyaWVzW2otMV0udmFsdWVzW2ldOm51bGwsa2V5KX0KZnVuY3Rpb24gcG9pbnRDb2xvclY2KGVudHJpZXMsaixpLGtleSl7cmV0dXJuIHRyYWZmaWNDb2xvcnNWNltwb2ludFNpZ25hbFY2KGVudHJpZXMsaixpLGtleSkuc3RhdGVdfQpmdW5jdGlvbiBzaWduYWxDZWxsVjYodmFsdWUsa2V5LHByZXZpb3VzKXtjb25zdCBzaWduYWw9cmVwb3J0U2lnbmFsVjYodmFsdWUscHJldmlvdXMsa2V5KTtyZXR1cm4gYDx0ZCBjbGFzcz0idHJhZmZpYy0ke3NpZ25hbC5zdGF0ZX0iIHRpdGxlPSIke2VzYyhzaWduYWwubGFiZWwpfSI+JHtzaWduYWwuc3RhdGU9PT0nbmV1dHJhbCc/Jyc6YDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj7il48gPC9zcGFuPmB9JHtmbXQodmFsdWUsa2V5KX08L3RkPmB9CmNvbnN0IGJhcnNCZWZvcmVWNj1iYXJzVjI7CmJhcnNWMj1mdW5jdGlvbihpdGVtcyxrZXksY29sb3IpewogaWYoIXJhdGlvS2V5c1Y2LmluY2x1ZGVzKGtleSkpcmV0dXJuIGJhcnNCZWZvcmVWNihpdGVtcyxrZXksY29sb3IpOwogY29uc3QgbWF4PU1hdGgubWF4KDEsLi4uaXRlbXMubWFwKHI9Pk1hdGguYWJzKHJba2V5XT8/MCkpKTsKIHJldHVybiBpdGVtcy5tYXAocj0+e2NvbnN0IHNpZ25hbD1yYXRpb1NpZ25hbFY2KHJba2V5XSk7cmV0dXJuIGA8ZGl2IGNsYXNzPSJiYXJyb3ciIHRpdGxlPSIke2VzYyhzaWduYWwubGFiZWwpfSI+PHNwYW4gY2xhc3M9ImJhcmxhYmVsIj4ke2VzYyhyLm5hbWUpfTwvc3Bhbj48ZGl2IGNsYXNzPSJ0cmFjayI+PGRpdiBjbGFzcz0iYmFyIiBzdHlsZT0id2lkdGg6JHtNYXRoLmFicyhyW2tleV0/PzApL21heCoxMDB9JTtiYWNrZ3JvdW5kOiR7dHJhZmZpY0NvbG9yc1Y2W3NpZ25hbC5zdGF0ZV19Ij48L2Rpdj48L2Rpdj48YiBjbGFzcz0idHJhZmZpYy0ke3NpZ25hbC5zdGF0ZX0iPiR7Zm10KHJba2V5XSxrZXkpfTwvYj48L2Rpdj5gfSkuam9pbignJyk7Cn07CnJlcG9ydFRhYmxlPWZ1bmN0aW9uKGxpc3QsY29scyxwZXJpb2RMYWJlbD0nUGVyw61vZG8nKXsKIGNvbnN0IHRlbXBvcmFsPWxpc3QuZXZlcnkocj0+L15cZHs0fSgtXGR7Mn18IMK3IFNcZHsxLDJ9fC1UWzEtNF0pJC8udGVzdChyLm5hbWUpKTsKIHJldHVybiBgPGRpdiBjbGFzcz0idGFibGV3cmFwIj48dGFibGU+PHRoZWFkPjx0cj48dGg+JHtwZXJpb2RMYWJlbH08L3RoPjx0aD5Db2JlcnR1cmE8L3RoPiR7Y29scy5tYXAoaz0+YDx0aD4ke21ldHJpY3Nba119PC90aD5gKS5qb2luKCcnKX08L3RyPjwvdGhlYWQ+PHRib2R5PiR7bGlzdC5tYXAoKHIsaSk9PmA8dHI+PHRkPiR7ZXNjKHIubmFtZSl9PC90ZD48dGQ+JHtjb3ZlcmFnZUxhYmVsKHIucm93cyl9PC90ZD4ke2NvbHMubWFwKGs9PnNpZ25hbENlbGxWNihyW2tdLGssdGVtcG9yYWwmJmk/bGlzdFtpLTFdW2tdOm51bGwpKS5qb2luKCcnKX08L3RyPmApLmpvaW4oJycpfTwvdGJvZHk+PC90YWJsZT48L2Rpdj48cCBjbGFzcz0ic2lnbmFsbm90ZSI+U2Vtw6Fmb3JvIHRlbXBvcmFsOiBXaW4sIGFjdGl2aWRhZCB5IHNwaW5zIGZyZW50ZSBhbCBwZXLDrW9kbyBhbnRlcmlvciBtb3N0cmFkby4gVmVyZGUgPSBpZ3VhbCBvIHN1cGVyaW9yOyByb2pvID0gaW5mZXJpb3IgbyBXaW4gbmVnYXRpdm8uIFByaW1lciBwZXLDrW9kbyB5IG3DqXRyaWNhcyBzaW4gbWV0YTogbmV1dHJvcy4gUmV2aXNhIGxhIGNvYmVydHVyYSBkZSBkw61hcyBhbnRlcyBkZSBjb21wYXJhciB0b3RhbGVzLjwvcD5gOwp9OwpmdW5jdGlvbiBhcHBseVJhdGlvQ2VsbHNWNigpe2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjb250ZW50IC5waWxsJykuZm9yRWFjaChlbD0+e2NvbnN0IHJhdz1lbC5kYXRhc2V0LnJhdGlvVjYsdGV4dD1lbC50ZXh0Q29udGVudC50cmltKCk7aWYocmF3PT1udWxsJiYhdGV4dC5lbmRzV2l0aCgnw5cnKSlyZXR1cm47Y29uc3QgdmFsdWU9cmF3PT09Jyc/bnVsbDpyYXchPW51bGw/TnVtYmVyKHJhdyk6TnVtYmVyKHRleHQuc2xpY2UoMCwtMSkucmVwbGFjZSgnLCcsJy4nKSk7Y29uc3Qgcz1yYXRpb1NpZ25hbFY2KHZhbHVlKTtlbC5jbGFzc0xpc3QucmVtb3ZlKCdsb3cnKTtlbC5jbGFzc0xpc3QuYWRkKCdyYXRpby0nK3Muc3RhdGUpO2VsLnRpdGxlPXMubGFiZWx9KX0KZnVuY3Rpb24gdHJhZmZpY0xlZ2VuZFY2KCl7Y29uc3QgbGltaXRzPXJhdGlvTGltaXRzVjYoKTtyZXR1cm4gYDxkaXYgY2xhc3M9InRyYWZmaWNMZWdlbmQiPjxzcGFuIGNsYXNzPSJ0cmFmZmljLXJlZCI+4pePIEJham86ICZsdDsgJHtsaW1pdHMucmVkfcOXPC9zcGFuPjxzcGFuIGNsYXNzPSJ0cmFmZmljLXllbGxvdyI+4pePIE1lZGlvIGEgYmFqbzogJHtsaW1pdHMucmVkfcOXIGEgJmx0OyAke2xpbWl0cy5ncmVlbn3Dlzwvc3Bhbj48c3BhbiBjbGFzcz0idHJhZmZpYy1ncmVlbiI+4pePIEVzcGVyYWRvIG8gc3VwZXJpb3I6IOKJpSAke2xpbWl0cy5ncmVlbn3Dlzwvc3Bhbj48L2Rpdj5gfQpjb25zdCByZW5kZXJCZWZvcmVWNj1yZW5kZXI7CnJlbmRlcj1mdW5jdGlvbigpewogcmVuZGVyQmVmb3JlVjYoKTtpZighZGF0YSlyZXR1cm47YXBwbHlSYXRpb0NlbGxzVjYoKTsKIGlmKHRhYj09PSdSYXRpb3MnKXsKICBjb25zdCBsaW1pdHM9cmF0aW9MaW1pdHNWNigpO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb250ZW50IC52aWV3YmFubmVyJykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmVuZCcsYDxzZWN0aW9uIGNsYXNzPSJjYXJkIHRyYWZmaWNTZXR0aW5ncyI+PGgyPkNvbmZpZ3VyYWNpw7NuIGRlbCBzZW3DoWZvcm8gZGUgcmF0aW9zPC9oMj48ZGl2IGNsYXNzPSJ2aWV3Y29udHJvbHMiPjxsYWJlbD5Mw61taXRlIHJvam8gLyBhbWFyaWxsbzxpbnB1dCBpZD0icmVkUmF0aW9WNiIgdHlwZT0ibnVtYmVyIiBtaW49IjAiIHN0ZXA9IjAuMDUiIHZhbHVlPSIke2xpbWl0cy5yZWR9Ij48L2xhYmVsPjxsYWJlbD5OaXZlbCBlc3BlcmFkbzogaW5pY2lvIGRlbCB2ZXJkZTxpbnB1dCBpZD0iZ3JlZW5SYXRpb1Y2IiB0eXBlPSJudW1iZXIiIG1pbj0iMC4wMSIgc3RlcD0iMC4wNSIgdmFsdWU9IiR7bGltaXRzLmdyZWVufSI+PC9sYWJlbD48YnV0dG9uIGlkPSJhcHBseVJhdGlvVjYiPkFwbGljYXIgZXNjYWxhPC9idXR0b24+PC9kaXY+JHt0cmFmZmljTGVnZW5kVjYoKX08cCBjbGFzcz0ic2lnbmFsbm90ZSI+TGEgZXNjYWxhIHNlIGFwbGljYSBzb2xvIGEgcmF0aW9zLiAxw5cgZXMgZWwgdmFsb3IgZGUgbGEgcmVmZXJlbmNpYSBlbGVnaWRhLiBQdWVkZXMgZ3VhcmRhciBsYSBjb25maWd1cmFjacOzbiBqdW50byBjb24gbGEgdmlzdGEuPC9wPjwvc2VjdGlvbj5gKTsKICAkKCcjYXBwbHlSYXRpb1Y2Jykub25jbGljaz0oKT0+e2NvbnN0IHJlZD1OdW1iZXIoJCgnI3JlZFJhdGlvVjYnKS52YWx1ZSksZ3JlZW49TnVtYmVyKCQoJyNncmVlblJhdGlvVjYnKS52YWx1ZSk7aWYoIU51bWJlci5pc0Zpbml0ZShyZWQpfHwhTnVtYmVyLmlzRmluaXRlKGdyZWVuKXx8cmVkPDB8fGdyZWVuPD1yZWQpe2FsZXJ0KCdFbCBsw61taXRlIHJvam8gZGViZSBzZXIgY2VybyBvIG1heW9yIHkgZWwgbml2ZWwgdmVyZGUgZGViZSBzZXIgc3VwZXJpb3IgYWwgcm9qby4nKTtyZXR1cm59dmlld1N0YXRlLnJhdGlvcy5yZWRMaW1pdD1yZWQ7dmlld1N0YXRlLnJhdGlvcy5ncmVlbkxpbWl0PWdyZWVuO3JlbmRlcigpfTsKIH1lbHNlIGlmKHRhYiE9PSdNZXRvZG9sb2fDrWEnKSQoJyNjb250ZW50JykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywnPGRpdiBjbGFzcz0ic2lnbmFsbm90ZSB0cmFmZmljSW50cm8iPlB1bnRvcyBkZSBsb3MgZ3LDoWZpY29zOiB2ZXJkZSA9IGlndWFsIG8gc3VwZXJpb3IgYWwgcGVyw61vZG8gYW50ZXJpb3IgbW9zdHJhZG87IHJvam8gPSBpbmZlcmlvciBvIFdpbiBuZWdhdGl2by4gR3JpcyA9IHNpbiBjb21wYXJhY2nDs24gbyBzaW4gbWV0YS4gUGF5b3V0LCBhcHVlc3RhLCBwcmVtaW9zIHkgcHJvbW8gc2UgbWFudGllbmVuIG5ldXRyb3MgYWwgbm8gdGVuZXIgdW5hIG1ldGEgZGVmaW5pZGEuIExhIGVzY2FsYSBkZSB0cmVzIGNvbG9yZXMgc2UgcmVzZXJ2YSBwYXJhIHJhdGlvcy48L2Rpdj4nKTsKfTsKCmZ1bmN0aW9uIGV4Y2x1ZGVkUmVjb3JkVjcocm93KXtyZXR1cm4gWzEsMiwzLDQsNSw3LDgsOV0uc29tZShrPT57Y29uc3Qgdj1TdHJpbmcocm93W2tdPz8nJykudHJpbSgpLnRvTG9jYWxlVXBwZXJDYXNlKCdlcycpO3JldHVybiB2PT09J0VYUElSQURPUyd8fC9eWy3igJPigJRdezMsfSQvLnRlc3Qodil9KX0KZnVuY3Rpb24gY2xlYW5NYXRyaXhWNyhtYXRyaXgpewogY29uc3QgcmVtb3ZlZD1tYXRyaXgucm93cy5maWx0ZXIoZXhjbHVkZWRSZWNvcmRWNyk7aWYoIXJlbW92ZWQubGVuZ3RoKXJldHVybiBtYXRyaXg7CiBjb25zdCBhZGp1c3RtZW50PW5ldyBNYXA7Zm9yKGNvbnN0IHIgb2YgcmVtb3ZlZClhZGp1c3RtZW50LnNldChyWzBdLChhZGp1c3RtZW50LmdldChyWzBdKXx8MCkrKHR5cGVvZiByWzE2XT09PSdudW1iZXInP3JbMTZdOjApKTsKIHJldHVybiB7Li4ubWF0cml4LHJvd3M6bWF0cml4LnJvd3MuZmlsdGVyKHI9PiFleGNsdWRlZFJlY29yZFY3KHIpKSxjb250cm9sczoobWF0cml4LmNvbnRyb2xzfHxbXSkubWFwKGM9Pih7Li4uYyx3aW46Yy53aW4tKGFkanVzdG1lbnQuZ2V0KGMuZGF0ZSl8fDApfSkpfTsKfQpjb25zdCBjYWNoZWRCZWZvcmVWNz1jYWNoZWQ7Y2FjaGVkPWFzeW5jIGZ1bmN0aW9uKCl7cmV0dXJuIGNsZWFuTWF0cml4VjcoYXdhaXQgY2FjaGVkQmVmb3JlVjcoKSl9Owpjb25zdCBub3JtYWxpemVCZWZvcmVWNz1ub3JtYWxpemVXb3JrYm9vaztub3JtYWxpemVXb3JrYm9vaz1mdW5jdGlvbiguLi5hcmdzKXtjb25zdCBjbGVhbmVkPWNsZWFuTWF0cml4Vjcobm9ybWFsaXplQmVmb3JlVjcoLi4uYXJncykpO2lmKCFjbGVhbmVkLnJvd3MubGVuZ3RoKXRocm93IEVycm9yKCdFbCBhcmNoaXZvIG5vIGNvbnRpZW5lIHJlZ2lzdHJvcyBhcGxpY2FibGVzLicpO3JldHVybiBjbGVhbmVkfTsKY29uc3QgY29tYmluZUJlZm9yZVY3PWNvbWJpbmVNYXRyaWNlcztjb21iaW5lTWF0cmljZXM9ZnVuY3Rpb24ocHJldmlvdXMsaW5jb21pbmcsbW9kZSl7cmV0dXJuIGNsZWFuTWF0cml4VjcoY29tYmluZUJlZm9yZVY3KHByZXZpb3VzP2NsZWFuTWF0cml4VjcocHJldmlvdXMpOnByZXZpb3VzLGNsZWFuTWF0cml4VjcoaW5jb21pbmcpLG1vZGUpKX07CmNvbnN0IGluaXRCZWZvcmVWNz1pbml0O2luaXQ9ZnVuY3Rpb24oKXtkYXRhPWNsZWFuTWF0cml4VjcoZGF0YSk7aW5pdEJlZm9yZVY3KCl9OwoKY29uc3QgbW9udGhTaG9ydFY4PVsnRU5FJywnRkVCJywnTUFSJywnQUJSJywnTUFZJywnSlVOJywnSlVMJywnQUdPJywnU0VQJywnT0NUJywnTk9WJywnRElDJ107CmZ1bmN0aW9uIGNhbGVuZGFyU3RhdGVWOChzY29wZSl7dmlld1N0YXRlLmNhbGVuZGFycz8/PXt9O3JldHVybiB2aWV3U3RhdGUuY2FsZW5kYXJzW3Njb3BlXT8/PXttb2RlOidyYW5nZScsZGF0ZXM6W10sbW9udGg6Jycsd2Vla3M6W10scXVhcnRlcjonJ319CmZ1bmN0aW9uIHdlZWtOdW1iZXJWOChkYXRlKXtjb25zdCBkPW5ldyBEYXRlKGRhdGUrJ1QwMDowMDowMFonKSxmaXJzdD1uZXcgRGF0ZShEYXRlLlVUQyhkLmdldFVUQ0Z1bGxZZWFyKCksMCwxKSk7cmV0dXJuIE1hdGguZmxvb3IoKChkLWZpcnN0KS84NjRlNSsoZmlyc3QuZ2V0VVRDRGF5KCkrNiklNykvNykrMX0KZnVuY3Rpb24gcXVhcnRlcktleVY4KGRhdGUpe3JldHVybiBkYXRlLnNsaWNlKDAsNCkrJy1UJytNYXRoLmNlaWwoTnVtYmVyKGRhdGUuc2xpY2UoNSw3KSkvMyl9CmZ1bmN0aW9uIGFjY2VwdHNDYWxlbmRhclY4KHJvdyxzdGF0ZSxmcm9tLHRvKXsKIGNvbnN0IGRhdGU9cm93WzBdOwogaWYoc3RhdGUubW9kZT09PSdkYXRlcycpcmV0dXJuIHN0YXRlLmRhdGVzLmluY2x1ZGVzKGRhdGUpOwogaWYoc3RhdGUubW9kZT09PSdtb250aCcpcmV0dXJuICFzdGF0ZS5tb250aHx8ZGF0ZS5zdGFydHNXaXRoKHN0YXRlLm1vbnRoKTsKIGlmKHN0YXRlLm1vZGU9PT0nd2VlaycpcmV0dXJuICghc3RhdGUubW9udGh8fGRhdGUuc3RhcnRzV2l0aChzdGF0ZS5tb250aCkpJiYoIXN0YXRlLndlZWtzLmxlbmd0aHx8c3RhdGUud2Vla3MuaW5jbHVkZXMoU3RyaW5nKHdlZWtOdW1iZXJWOChkYXRlKSkpKTsKIGlmKHN0YXRlLm1vZGU9PT0ncXVhcnRlcicpcmV0dXJuICFzdGF0ZS5xdWFydGVyfHxxdWFydGVyS2V5VjgoZGF0ZSk9PT1zdGF0ZS5xdWFydGVyOwogcmV0dXJuICghZnJvbXx8ZGF0ZT49ZnJvbSkmJighdG98fGRhdGU8PXRvKTsKfQpzbGljZVJvd3M9ZnVuY3Rpb24oZmlsdGVycz17fSxmcm9tPSQoJyNmcm9tJykudmFsdWUsdG89JCgnI3RvJykudmFsdWUpewogY29uc3Qgc2NvcGU9ZmlsdGVycz09PXZpZXdTdGF0ZS5BLmZpbHRlcnM/J0EnOmZpbHRlcnM9PT12aWV3U3RhdGUuQi5maWx0ZXJzPydCJzonZ2xvYmFsJyxzdGF0ZT1jYWxlbmRhclN0YXRlVjgoc2NvcGUpOwogcmV0dXJuIGRhdGEucm93cy5maWx0ZXIocj0+YWNjZXB0c0NhbGVuZGFyVjgocixzdGF0ZSxmcm9tLHRvKSYmT2JqZWN0LmVudHJpZXMoZmlsdGVycykuZXZlcnkoKFtrLHZhbHVlc10pPT4hdmFsdWVzLmxlbmd0aHx8dmFsdWVzLmluY2x1ZGVzKFN0cmluZyhyW2tdPz8nU2luIGRhdG8nKSkpKTsKfTsKZnVuY3Rpb24gd2Vla0xhYmVsVjgoeWVhcix3ZWVrLHJvd3M9W10pewogbGV0IGRhdGVzPVsuLi5uZXcgU2V0KHJvd3MuZmlsdGVyKHI9PnJbMF0uc3RhcnRzV2l0aCh5ZWFyKSYmd2Vla051bWJlclY4KHJbMF0pPT09TnVtYmVyKHdlZWspKS5tYXAocj0+clswXSkpXS5zb3J0KCk7CiBpZighZGF0ZXMubGVuZ3RoKXtjb25zdCBmaXJzdD1uZXcgRGF0ZShEYXRlLlVUQyhOdW1iZXIoeWVhciksMCwxKSksb2Zmc2V0PShmaXJzdC5nZXRVVENEYXkoKSs2KSU3LGQ9bmV3IERhdGUoZmlyc3QuZ2V0VGltZSgpK01hdGgubWF4KDAsKE51bWJlcih3ZWVrKS0xKSo3LW9mZnNldCkqODY0ZTUpO2RhdGVzPVtkLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwxMCldfQogY29uc3QgbW9udGhzPVsuLi5uZXcgU2V0KGRhdGVzLm1hcChkPT5tb250aFNob3J0VjhbTnVtYmVyKGQuc2xpY2UoNSw3KSktMV0pKV07cmV0dXJuIG1vbnRocy5qb2luKCcvJykrJy0nK051bWJlcih3ZWVrKSsnIMK3ICcreWVhcjsKfQpjb25zdCBkaXNwbGF5QmVmb3JlVjg9ZGlzcGxheURhdGVzVjU7CmRpc3BsYXlEYXRlc1Y1PWZ1bmN0aW9uKHZhbHVlKXtsZXQgdGV4dD1TdHJpbmcodmFsdWU/PycnKS5yZXBsYWNlKC9cYihcZHs0fSkgwrcgUyhcZHsxLDJ9KVxiL2csKG0seSx3KT0+d2Vla0xhYmVsRmFzdExBKHksdykpLnJlcGxhY2UoL1xiKFxkezR9KS1UKFsxLTRdKVxiL2csKG0seSxxKT0+YFRyaW1lc3RyZSAke3F9IMK3ICR7eX1gKTtyZXR1cm4gZGlzcGxheUJlZm9yZVY4KHRleHQpfTsKY29uc3QgZGVzY3JpcHRpb25CZWZvcmVWOD1wZXJpb2REZXNjcmlwdGlvblY0OwpwZXJpb2REZXNjcmlwdGlvblY0PWZ1bmN0aW9uKG5hbWUscG9pbnRzKXtjb25zdCByZXN1bHQ9ZGVzY3JpcHRpb25CZWZvcmVWOChuYW1lLHBvaW50cyksbWF0Y2g9bmFtZS5tYXRjaCgvXihcZHs0fSkgwrcgUyhcZHsxLDJ9KSQvKTtpZihtYXRjaCl7cmVzdWx0LmxhYmVsPXdlZWtMYWJlbFY4KG1hdGNoWzFdLG1hdGNoWzJdLHBvaW50cy5mbGF0TWFwKHA9PnAucm93c3x8W10pKTtyZXN1bHQuZnVsbD1yZXN1bHQubGFiZWwrJyDCtyBEYXRvczogJytyZXN1bHQucmFuZ2V9cmV0dXJuIHJlc3VsdH07CmNvbnN0IGtleUJlZm9yZVY4PXBlcmlvZEtleTsKcGVyaW9kS2V5PWZ1bmN0aW9uKHJvdyxncmFpbil7cmV0dXJuIGdyYWluPT09J3F1YXJ0ZXInP3F1YXJ0ZXJLZXlWOChyb3dbMF0pOmtleUJlZm9yZVY4KHJvdyxncmFpbil9Owpjb25zdCByZXBvcnRQZXJpb2RCZWZvcmVWOD1yZXBvcnRQZXJpb2Q7CnJlcG9ydFBlcmlvZD1mdW5jdGlvbihyb3csdHlwZSl7Y29uc3Qgc3RhdGU9dGFiPT09J1JlcG9ydGUgc2VtYW5hbCc/dmlld1N0YXRlLndlZWtseTp0YWI9PT0nUmVwb3J0ZSBtZW5zdWFsJz92aWV3U3RhdGUubW9udGhseTp0YWI9PT0nRXZvbHV0aXZvIG1lbnN1YWwnP3ZpZXdTdGF0ZS5tb250aGx5RXZvbHV0aW9uOm51bGw7cmV0dXJuIHN0YXRlPy5ncm91cFF1YXJ0ZXI/cXVhcnRlcktleVY4KHJvd1swXSk6cmVwb3J0UGVyaW9kQmVmb3JlVjgocm93LHR5cGUpfTsKZnVuY3Rpb24gbW9udGhDaG9pY2VzVjgoKXtyZXR1cm4gWy4uLm5ldyBTZXQoZGF0YS5yb3dzLm1hcChyPT5yWzBdLnNsaWNlKDAsNykpKV0uc29ydCgpfQpmdW5jdGlvbiBjYWxlbmRhclBhbmVsVjgoc2NvcGUpewogY29uc3Qgc3RhdGU9Y2FsZW5kYXJTdGF0ZVY4KHNjb3BlKSxtb250aHM9bW9udGhDaG9pY2VzVjgoKSxxdWFydGVycz1bLi4ubmV3IFNldChkYXRhLnJvd3MubWFwKHI9PnF1YXJ0ZXJLZXlWOChyWzBdKSkpXS5zb3J0KCk7c3RhdGUubW9udGh8fD1tb250aHMuYXQoLTEpfHwnJztzdGF0ZS5xdWFydGVyfHw9cXVhcnRlcnMuYXQoLTEpfHwnJzsKIGNvbnN0IHdlZWtzPVsuLi5uZXcgU2V0KGRhdGEucm93cy5maWx0ZXIocj0+clswXS5zdGFydHNXaXRoKHN0YXRlLm1vbnRoKSkubWFwKHI9PndlZWtOdW1iZXJWOChyWzBdKSkpXS5zb3J0KChhLGIpPT5hLWIpOwogbGV0IGRldGFpbHM9Jyc7CiBpZihzdGF0ZS5tb2RlPT09J2RhdGVzJylkZXRhaWxzPWA8bGFiZWw+QWdyZWdhciB1bmEgZmVjaGEgY29uIGNhbGVuZGFyaW88aW5wdXQgdHlwZT0iZGF0ZSIgaWQ9ImRheS0ke3Njb3BlfSI+PC9sYWJlbD48YnV0dG9uIGRhdGEtYWRkZGF5PSIke3Njb3BlfSI+QWdyZWdhciBkw61hPC9idXR0b24+PGRpdiBjbGFzcz0iZGF0ZWNoaXBzIj4ke3N0YXRlLmRhdGVzLm1hcChkPT5gPGJ1dHRvbiBkYXRhLXJlbW92ZWRheT0iJHtzY29wZX18JHtkfSI+JHtkaXNwbGF5RGF0ZXNWNShkKX0gw5c8L2J1dHRvbj5gKS5qb2luKCcnKXx8JzxzcGFuPkVsaWdlIHVubyBvIHZhcmlvcyBkw61hcyBlc3BlY8OtZmljb3MuPC9zcGFuPid9PC9kaXY+YDsKIGlmKFsnbW9udGgnLCd3ZWVrJ10uaW5jbHVkZXMoc3RhdGUubW9kZSkpZGV0YWlscz1gPGxhYmVsPjEuIE1lczxzZWxlY3QgZGF0YS1jYWxtb250aD0iJHtzY29wZX0iPiR7bW9udGhzLm1hcChtPT5gPG9wdGlvbiB2YWx1ZT0iJHttfSIgJHttPT09c3RhdGUubW9udGg/J3NlbGVjdGVkJzonJ30+JHtkaXNwbGF5RGF0ZXNWNShtKX08L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48L2xhYmVsPiR7c3RhdGUubW9kZT09PSd3ZWVrJz9gPGxhYmVsPjIuIFNlbWFuYXMgZGVsIG1lczxzZWxlY3QgbXVsdGlwbGUgZGF0YS1jYWx3ZWVrcz0iJHtzY29wZX0iPiR7d2Vla3MubWFwKHc9Pntjb25zdCBkYXRlcz1kYXRhLnJvd3MuZmlsdGVyKHI9PnJbMF0uc3RhcnRzV2l0aChzdGF0ZS5tb250aCkmJndlZWtOdW1iZXJWOChyWzBdKT09PXcpLm1hcChyPT5yWzBdKS5zb3J0KCk7cmV0dXJuIGA8b3B0aW9uIHZhbHVlPSIke3d9IiAke3N0YXRlLndlZWtzLmluY2x1ZGVzKFN0cmluZyh3KSk/J3NlbGVjdGVkJzonJ30+JHttb250aFNob3J0VjhbTnVtYmVyKHN0YXRlLm1vbnRoLnNsaWNlKDUpKS0xXX0tJHt3fSDCtyAke2Rpc3BsYXlEYXRlc1Y1KGRhdGVzWzBdKX0gYSAke2Rpc3BsYXlEYXRlc1Y1KGRhdGVzLmF0KC0xKSl9PC9vcHRpb24+YH0pLmpvaW4oJycpfTwvc2VsZWN0PjwvbGFiZWw+PHNtYWxsPlNpbiBzZWxlY2Npw7NuIGRlIHNlbWFuYTogdG9kbyBlbCBtZXMuIEN0cmwvQ21kICsgY2xpYyBwZXJtaXRlIGVsZWdpciB2YXJpYXMuIFVuYSBzZW1hbmEgcXVlIGNydXphIGRlIG1lcyBpbmNsdXllIGFxdcOtIHNvbG8gbG9zIGTDrWFzIGRlbCBtZXMgZWxlZ2lkby48L3NtYWxsPmA6Jyd9YDsKIGlmKHN0YXRlLm1vZGU9PT0ncXVhcnRlcicpZGV0YWlscz1gPGxhYmVsPlRyaW1lc3RyZTxzZWxlY3QgZGF0YS1jYWxxdWFydGVyPSIke3Njb3BlfSI+JHtxdWFydGVycy5tYXAocT0+YDxvcHRpb24gdmFsdWU9IiR7cX0iICR7cT09PXN0YXRlLnF1YXJ0ZXI/J3NlbGVjdGVkJzonJ30+JHtkaXNwbGF5RGF0ZXNWNShxKX08L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48L2xhYmVsPmA7CiByZXR1cm4gYDxkaXYgY2xhc3M9ImNhbGVuZGFyUGFuZWwiIGRhdGEtY2FsZW5kYXJwYW5lbD0iJHtzY29wZX0iPjxkaXYgY2xhc3M9ImNhbGVuZGFyQ29udHJvbHMiPjxsYWJlbD5TZWxlY2Npb25hciBmZWNoYXMgcG9yPHNlbGVjdCBkYXRhLWNhbG1vZGU9IiR7c2NvcGV9Ij4ke09iamVjdC5lbnRyaWVzKHtyYW5nZTonUmFuZ28gY29uIGNhbGVuZGFyaW8nLGRhdGVzOidEw61hcyBlc3BlY8OtZmljb3MnLG1vbnRoOidNZXMnLHdlZWs6J01lcyB5IHNlbWFuYXMnLHF1YXJ0ZXI6J1RyaW1lc3RyZSd9KS5tYXAoKFtrLHZdKT0+YDxvcHRpb24gdmFsdWU9IiR7a30iICR7c3RhdGUubW9kZT09PWs/J3NlbGVjdGVkJzonJ30+JHt2fTwvb3B0aW9uPmApLmpvaW4oJycpfTwvc2VsZWN0PjwvbGFiZWw+JHtkZXRhaWxzfTwvZGl2PjwvZGl2PmA7Cn0KZnVuY3Rpb24gc2VsZWN0ZWREYXRlVGV4dFY4KHNjb3BlKXtjb25zdCBzdGF0ZT1jYWxlbmRhclN0YXRlVjgoc2NvcGUpO2lmKHN0YXRlLm1vZGU9PT0nZGF0ZXMnKXJldHVybiBzdGF0ZS5kYXRlcy5sZW5ndGg/c3RhdGUuZGF0ZXMubWFwKGRpc3BsYXlEYXRlc1Y1KS5qb2luKCcsICcpOidTaW4gZMOtYXMgZWxlZ2lkb3MnO2lmKHN0YXRlLm1vZGU9PT0nbW9udGgnKXJldHVybiBkaXNwbGF5RGF0ZXNWNShzdGF0ZS5tb250aCk7aWYoc3RhdGUubW9kZT09PSd3ZWVrJylyZXR1cm4gZGlzcGxheURhdGVzVjUoc3RhdGUubW9udGgpKyhzdGF0ZS53ZWVrcy5sZW5ndGg/JyDCtyBTZW1hbmFzICcrc3RhdGUud2Vla3Muam9pbignLCAnKTonIMK3IFRvZGFzIGxhcyBzZW1hbmFzJyk7aWYoc3RhdGUubW9kZT09PSdxdWFydGVyJylyZXR1cm4gZGlzcGxheURhdGVzVjUoc3RhdGUucXVhcnRlcik7Y29uc3QgZnJvbT1zY29wZT09PSdnbG9iYWwnPyQoJyNmcm9tJykudmFsdWU6dmlld1N0YXRlW3Njb3BlXS5mcm9tLHRvPXNjb3BlPT09J2dsb2JhbCc/JCgnI3RvJykudmFsdWU6dmlld1N0YXRlW3Njb3BlXS50bztyZXR1cm4gZGlzcGxheURhdGVzVjUoZnJvbSkrJyDihpIgJytkaXNwbGF5RGF0ZXNWNSh0byl9CmZ1bmN0aW9uIGJpbmRDYWxlbmRhcnNWOCgpewogZm9yKGNvbnN0IFthdHRyaWJ1dGUsa2V5XW9mIFtbJ2NhbG1vZGUnLCdtb2RlJ10sWydjYWxtb250aCcsJ21vbnRoJ10sWydjYWxxdWFydGVyJywncXVhcnRlciddXSlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS0nK2F0dHJpYnV0ZSsnXScpLmZvckVhY2goZWw9PmVsLm9uY2hhbmdlPSgpPT57bGV0IHN0YXRlPWNhbGVuZGFyU3RhdGVWOChlbC5kYXRhc2V0W2F0dHJpYnV0ZV0pO3N0YXRlW2tleV09ZWwudmFsdWU7aWYoa2V5PT09J21vbnRoJylzdGF0ZS53ZWVrcz1bXTtyZW5kZXIoKX0pOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY2Fsd2Vla3NdJykuZm9yRWFjaChlbD0+ZWwub25jaGFuZ2U9KCk9PntjYWxlbmRhclN0YXRlVjgoZWwuZGF0YXNldC5jYWx3ZWVrcykud2Vla3M9Wy4uLmVsLnNlbGVjdGVkT3B0aW9uc10ubWFwKG89Pm8udmFsdWUpO3JlbmRlcigpfSk7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hZGRkYXldJykuZm9yRWFjaChlbD0+ZWwub25jbGljaz0oKT0+e2NvbnN0IHNjb3BlPWVsLmRhdGFzZXQuYWRkZGF5LGQ9JCgnI2RheS0nK3Njb3BlKS52YWx1ZTtpZighZClyZXR1cm47Y29uc3Qgc3RhdGU9Y2FsZW5kYXJTdGF0ZVY4KHNjb3BlKTtpZighc3RhdGUuZGF0ZXMuaW5jbHVkZXMoZCkpc3RhdGUuZGF0ZXMucHVzaChkKTtzdGF0ZS5kYXRlcy5zb3J0KCk7cmVuZGVyKCl9KTsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXJlbW92ZWRheV0nKS5mb3JFYWNoKGVsPT5lbC5vbmNsaWNrPSgpPT57bGV0W3Njb3BlLGRheV09ZWwuZGF0YXNldC5yZW1vdmVkYXkuc3BsaXQoJ3wnKTtjYWxlbmRhclN0YXRlVjgoc2NvcGUpLmRhdGVzPWNhbGVuZGFyU3RhdGVWOChzY29wZSkuZGF0ZXMuZmlsdGVyKGQ9PmQhPT1kYXkpO3JlbmRlcigpfSk7Cn0KY29uc3QgY29weUJlZm9yZVY4PWNvbXBhcmVWaWV3Owpjb21wYXJlVmlldz1mdW5jdGlvbigpe2NvcHlCZWZvcmVWOCgpO2Zvcihjb25zdCBzY29wZSBvZiBbJ0EnLCdCJ10pe2NvbnN0IHBhbmVsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zaWRlJytzY29wZSk7cGFuZWwucXVlcnlTZWxlY3RvcignLmNvbXBhcmVEYXRlcycpLmluc2VydEFkamFjZW50SFRNTCgnYWZ0ZXJlbmQnLGNhbGVuZGFyUGFuZWxWOChzY29wZSkpO3BhbmVsLnF1ZXJ5U2VsZWN0b3IoJy5jb21wYXJlRGF0ZXMnKS5zdHlsZS5kaXNwbGF5PWNhbGVuZGFyU3RhdGVWOChzY29wZSkubW9kZT09PSdyYW5nZSc/J2dyaWQnOidub25lJztwYW5lbC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsYDxwIGNsYXNzPSJzaWduYWxub3RlIj5QZXLDrW9kbyAke3Njb3BlfTogJHtlc2Moc2VsZWN0ZWREYXRlVGV4dFY4KHNjb3BlKSl9PC9wPmApfQogY29uc3QgY29weT0kKCcjY29weUFCJykub25jbGljayxzd2FwPSQoJyNzd2FwQUInKS5vbmNsaWNrOyQoJyNjb3B5QUInKS5vbmNsaWNrPSgpPT57dmlld1N0YXRlLmNhbGVuZGFycz8/PXt9O3ZpZXdTdGF0ZS5jYWxlbmRhcnMuQj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNhbGVuZGFyU3RhdGVWOCgnQScpKSk7Y29weSgpfTskKCcjc3dhcEFCJykub25jbGljaz0oKT0+e2NvbnN0IGE9Y2FsZW5kYXJTdGF0ZVY4KCdBJyksYj1jYWxlbmRhclN0YXRlVjgoJ0InKTt2aWV3U3RhdGUuY2FsZW5kYXJzLkE9Yjt2aWV3U3RhdGUuY2FsZW5kYXJzLkI9YTtzd2FwKCl9Owp9Owpjb25zdCByZW5kZXJCZWZvcmVWOD1yZW5kZXI7CnJlbmRlcj1mdW5jdGlvbigpewogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNhbGVuZGFyUGFuZWwnKS5mb3JFYWNoKHBhbmVsPT5wYW5lbC5yZW1vdmUoKSk7CiBpZihkYXRhKXtmb3IoY29uc3Qgc2NvcGUgb2YgWydnbG9iYWwnLCdBJywnQiddKXtjb25zdCBzdGF0ZT1jYWxlbmRhclN0YXRlVjgoc2NvcGUpO3N0YXRlLm1vbnRofHw9bW9udGhDaG9pY2VzVjgoKS5hdCgtMSl8fCcnO3N0YXRlLnF1YXJ0ZXJ8fD1bLi4ubmV3IFNldChkYXRhLnJvd3MubWFwKHI9PnF1YXJ0ZXJLZXlWOChyWzBdKSkpXS5zb3J0KCkuYXQoLTEpfHwnJ319CiByZW5kZXJCZWZvcmVWOCgpO2lmKCFkYXRhKXJldHVybjsKIGlmKCFbJ0NvbXBhcmF0aXZvcycsJ01ldG9kb2xvZ8OtYSddLmluY2x1ZGVzKHRhYikpewogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5maWx0ZXJzJykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLGNhbGVuZGFyUGFuZWxWOCgnZ2xvYmFsJykpO2Zvcihjb25zdCBpZCBvZiBbJ2Zyb20nLCd0byddKSQoJyMnK2lkKS5jbG9zZXN0KCdsYWJlbCcpLnN0eWxlLmRpc3BsYXk9Y2FsZW5kYXJTdGF0ZVY4KCdnbG9iYWwnKS5tb2RlPT09J3JhbmdlJz8nZmxleCc6J25vbmUnOyQoJyN2aWV3SGVscCcpLnRleHRDb250ZW50PXNlbGVjdGVkRGF0ZVRleHRWOCgnZ2xvYmFsJyk7CiB9CiBjb25zdCBzdGF0ZT10YWI9PT0nUmVwb3J0ZSBzZW1hbmFsJz92aWV3U3RhdGUud2Vla2x5OnRhYj09PSdSZXBvcnRlIG1lbnN1YWwnP3ZpZXdTdGF0ZS5tb250aGx5OnRhYj09PSdFdm9sdXRpdm8gbWVuc3VhbCc/dmlld1N0YXRlLm1vbnRobHlFdm9sdXRpb246bnVsbDsKIGlmKHN0YXRlKXtjb25zdCBjb250cm9scz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY29udGVudCAudmlld2NvbnRyb2xzJyk7Y29udHJvbHMuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLHNlbGVjdG9yKCdBZ3J1cGFjacOzbiBkZWwgaW5mb3JtZScsJ3F1YXJ0ZXJHcm91cFY4JyxzdGF0ZS5ncm91cFF1YXJ0ZXI/J3F1YXJ0ZXInOidvcmlnaW5hbCcse29yaWdpbmFsOnRhYj09PSdSZXBvcnRlIHNlbWFuYWwnPydTZW1hbmFsJzonTWVuc3VhbCcscXVhcnRlcjonVHJpbWVzdHJhbCd9KSk7JCgnI3F1YXJ0ZXJHcm91cFY4Jykub25jaGFuZ2U9ZT0+e3N0YXRlLmdyb3VwUXVhcnRlcj1lLnRhcmdldC52YWx1ZT09PSdxdWFydGVyJztyZW5kZXIoKX19CiBpZih0YWI9PT0nRXZvbHVjacOzbicpe2NvbnN0IHNlbGVjdD0kKCcjZWdyYWluJyk7aWYoIVsuLi5zZWxlY3Qub3B0aW9uc10uc29tZShvPT5vLnZhbHVlPT09J3F1YXJ0ZXInKSlzZWxlY3QuYWRkKG5ldyBPcHRpb24oJ1RyaW1lc3RyYWwnLCdxdWFydGVyJykpO3NlbGVjdC52YWx1ZT12aWV3U3RhdGUuZXZvbHV0aW9uLmdyYWlufQogaWYodGFiIT09J01ldG9kb2xvZ8OtYScpJCgnI2NvbnRlbnQnKS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLGA8ZGl2IGNsYXNzPSJkYXRlU3VtbWFyeVY4Ij4ke3RhYj09PSdDb21wYXJhdGl2b3MnP2BBOiAke2VzYyhzZWxlY3RlZERhdGVUZXh0VjgoJ0EnKSl9PGJyPkI6ICR7ZXNjKHNlbGVjdGVkRGF0ZVRleHRWOCgnQicpKX1gOidQZXLDrW9kbyBzZWxlY2Npb25hZG86ICcrZXNjKHNlbGVjdGVkRGF0ZVRleHRWOCgnZ2xvYmFsJykpfTwvZGl2PmApOwogYmluZENhbGVuZGFyc1Y4KCk7ZGVjb3JhdGVDaGFydHNWOCgpO2Zvcm1hdFRleHREYXRlc1Y1KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21haW4nKSk7Cn07CmNvbnN0IHJlc2V0QmVmb3JlVjg9JCgnI3Jlc2V0Jykub25jbGljazskKCcjcmVzZXQnKS5vbmNsaWNrPSgpPT57dmlld1N0YXRlLmNhbGVuZGFycz8/PXt9O2RlbGV0ZSB2aWV3U3RhdGUuY2FsZW5kYXJzLmdsb2JhbDtyZXNldEJlZm9yZVY4KCl9OwoKYXN5bmMgZnVuY3Rpb24gY2hhcnRQbmdWOChzdmcsdGl0bGUsbGVnZW5kKXsKIGNvbnN0IGNsb25lPXN2Zy5jbG9uZU5vZGUodHJ1ZSksYm94PXN2Zy52aWV3Qm94LmJhc2VWYWwsd2lkdGg9Ym94LndpZHRofHw2MDAsaGVpZ2h0PWJveC5oZWlnaHR8fDM1MDsKIGNvbnN0IHN0eWxlPWdldENvbXB1dGVkU3R5bGUoc3ZnKSxiZz1zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXBsb3RiZycpLnRyaW0oKXx8JyNmZmYnLGZnPXN0eWxlLmdldFByb3BlcnR5VmFsdWUoJy0tcGxvdHRleHQnKS50cmltKCl8fCcjMjc0NTU5JyxncmlkPXN0eWxlLmdldFByb3BlcnR5VmFsdWUoJy0tcGxvdGdyaWQnKS50cmltKCl8fCcjZGJlNWVkJzsKIGNsb25lLnNldEF0dHJpYnV0ZSgneG1sbnMnLCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycpO2Nsb25lLnNldEF0dHJpYnV0ZSgnd2lkdGgnLHdpZHRoKTtjbG9uZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsaGVpZ2h0KTtjbG9uZS5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7Y2xvbmUuc2V0QXR0cmlidXRlKCdmb250LWZhbWlseScsJ0FyaWFsLCBzYW5zLXNlcmlmJyk7CiBsZXQgc2VyaWFsaXplZD1uZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKGNsb25lKS5yZXBsYWNlKC92YXJcKC0tcGxvdGJnXCkvZyxiZykucmVwbGFjZSgvdmFyXCgtLXBsb3R0ZXh0XCkvZyxmZykucmVwbGFjZSgvdmFyXCgtLXBsb3RncmlkXCkvZyxncmlkKTsKIGNvbnN0IHVybD1VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtzZXJpYWxpemVkXSx7dHlwZTonaW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04J30pKTsKIHRyeXtjb25zdCBpbWFnZT1hd2FpdCBuZXcgUHJvbWlzZSgob2ssbm8pPT57Y29uc3QgaT1uZXcgSW1hZ2U7aS5vbmxvYWQ9KCk9Pm9rKGkpO2kub25lcnJvcj0oKT0+bm8oRXJyb3IoJ05vIHNlIHB1ZG8gY29udmVydGlyIGVsIGdyw6FmaWNvIGEgaW1hZ2VuLicpKTtpLnNyYz11cmx9KTtjb25zdCBzY2FsZT1NYXRoLm1pbigyLDgwMDAvd2lkdGgpLGNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtjYW52YXMud2lkdGg9TWF0aC5jZWlsKHdpZHRoKnNjYWxlKTtjYW52YXMuaGVpZ2h0PU1hdGguY2VpbCgoaGVpZ2h0KzEzMCkqc2NhbGUpO2NvbnN0IGN0eD1jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtjdHguc2NhbGUoc2NhbGUsc2NhbGUpO2N0eC5maWxsU3R5bGU9Ymc7Y3R4LmZpbGxSZWN0KDAsMCx3aWR0aCxoZWlnaHQrMTMwKTtjdHguZmlsbFN0eWxlPWZnO2N0eC5mb250PSdib2xkIDI4cHggQXJpYWwnO2N0eC5maWxsVGV4dCh0aXRsZSwyNCw0MCx3aWR0aC00OCk7Y3R4LmZvbnQ9JzE2cHggQXJpYWwnO2N0eC5maWxsVGV4dChsZWdlbmQuc2xpY2UoMCxNYXRoLmZsb29yKHdpZHRoLzkpKSwyNCw3MCx3aWR0aC00OCk7Y3R4LmRyYXdJbWFnZShpbWFnZSwwLDEwMCx3aWR0aCxoZWlnaHQpO3JldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgob2ssbm8pPT5jYW52YXMudG9CbG9iKGJsb2I9PmJsb2I/b2soYmxvYik6bm8oRXJyb3IoJ05vIHNlIHB1ZG8gZ2VuZXJhciBlbCBQTkcuJykpLCdpbWFnZS9wbmcnKSl9ZmluYWxseXtVUkwucmV2b2tlT2JqZWN0VVJMKHVybCl9Cn0KZnVuY3Rpb24gZG93bmxvYWRCbG9iVjgoYmxvYixuYW1lKXtjb25zdCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTthLmhyZWY9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTthLmRvd25sb2FkPW5hbWU7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTthLmNsaWNrKCk7YS5yZW1vdmUoKTtzZXRUaW1lb3V0KCgpPT5VUkwucmV2b2tlT2JqZWN0VVJMKGEuaHJlZiksMjAwMCl9CmZ1bmN0aW9uIGRlY29yYXRlQ2hhcnRzVjgoKXsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjb250ZW50IC5jaGFydHNjcm9sbCcpLmZvckVhY2goKGhvc3QsaW5kZXgpPT57CiAgY29uc3Qgc3ZnPWhvc3QucXVlcnlTZWxlY3Rvcignc3ZnJyk7aWYoIXN2ZylyZXR1cm47Y29uc3QgY2FyZD1ob3N0LmNsb3Nlc3QoJy5jYXJkJyksdGl0bGU9Y2FyZD8ucXVlcnlTZWxlY3RvcignaDInKT8udGV4dENvbnRlbnR8fCdHcsOhZmljbycsbGVnZW5kPWNhcmQ/LnF1ZXJ5U2VsZWN0b3IoJy5sYWJlbGVkbGVnZW5kJyk/LnRleHRDb250ZW50fHwnJzsKICBjb25zdCBiYXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7YmFyLmNsYXNzTmFtZT0nY2hhcnRUb29sc1Y4JztiYXIuaW5uZXJIVE1MPSc8YnV0dG9uPkNvcGlhciBpbWFnZW48L2J1dHRvbj48YnV0dG9uPkRlc2NhcmdhciBQTkc8L2J1dHRvbj48c3BhbiByb2xlPSJzdGF0dXMiPjwvc3Bhbj4nO2hvc3QuYmVmb3JlKGJhcik7Y29uc3RbY29weSxzYXZlXT1iYXIucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJyksc3RhdHVzPWJhci5xdWVyeVNlbGVjdG9yKCdzcGFuJyk7CiAgc2F2ZS5vbmNsaWNrPWFzeW5jKCk9Pnt0cnl7c3RhdHVzLnRleHRDb250ZW50PSdHZW5lcmFuZG/igKYnO2Rvd25sb2FkQmxvYlY4KGF3YWl0IGNoYXJ0UG5nVjgoc3ZnLHRpdGxlLGxlZ2VuZCksJ0xBLWdyYWZpY28tJysoaW5kZXgrMSkrJy5wbmcnKTtzdGF0dXMudGV4dENvbnRlbnQ9J0ltYWdlbiBkZXNjYXJnYWRhJ31jYXRjaChlKXtzdGF0dXMudGV4dENvbnRlbnQ9ZS5tZXNzYWdlfX07CiAgY29weS5vbmNsaWNrPWFzeW5jKCk9Pntjb25zdCBwbmc9Y2hhcnRQbmdWOChzdmcsdGl0bGUsbGVnZW5kKTt0cnl7aWYoIW5hdmlnYXRvci5jbGlwYm9hcmQ/LndyaXRlfHx0eXBlb2YgQ2xpcGJvYXJkSXRlbT09PSd1bmRlZmluZWQnKXRocm93IEVycm9yKCdQb3J0YXBhcGVsZXMgbm8gZGlzcG9uaWJsZScpO2F3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGUoW25ldyBDbGlwYm9hcmRJdGVtKHsnaW1hZ2UvcG5nJzpwbmd9KV0pO3N0YXR1cy50ZXh0Q29udGVudD0nQ29waWFkby4gUHVlZGVzIHBlZ2FybG8gZW4gV29yZCwgUG93ZXJQb2ludCBvIGNvcnJlby4nfWNhdGNoKGUpe3RyeXtkb3dubG9hZEJsb2JWOChhd2FpdCBwbmcsJ0xBLWdyYWZpY28tJysoaW5kZXgrMSkrJy5wbmcnKTtzdGF0dXMudGV4dENvbnRlbnQ9J0VsIG5hdmVnYWRvciBubyBwZXJtaXRpw7MgY29waWFyLiBTZSBkZXNjYXJnw7MgZWwgUE5HLid9Y2F0Y2goZXJyKXtzdGF0dXMudGV4dENvbnRlbnQ9ZXJyLm1lc3NhZ2V9fX07CiB9KTsKfQovLyBNaW5pbWFsIFhMU1ggd3JpdGVyOiBpbmxpbmUgc3RyaW5ncyArIG51bWJlcnMgaW4gYW4gdW5jb21wcmVzc2VkIFpJUC4KLy8gRGF0YSBpcyBnZW5lcmF0ZWQgaW4gdGhlIGJyb3dzZXI7IG5vIGV4dHJhIHNlcnZpY2Ugb3IgZXh0ZXJuYWwgbGlicmFyeSBpcyB1c2VkLgpmdW5jdGlvbiB4bWxFc2NhcGVWOCh2YWx1ZSl7cmV0dXJuIFN0cmluZyh2YWx1ZT8/JycpLnJlcGxhY2UoL1tcdTAwMDAtXHUwMDA4XHUwMDBCXHUwMDBDXHUwMDBFLVx1MDAxRl0vZywnJykucmVwbGFjZSgvWyY8PiInXS9nLGM9Pih7JyYnOicmYW1wOycsJzwnOicmbHQ7JywnPic6JyZndDsnLCciJzonJnF1b3Q7JywiJyI6JyZhcG9zOyd9W2NdKSl9CmZ1bmN0aW9uIGNvbE5hbWVWOChpKXtsZXQgcz0nJztmb3IoaSsrO2k7aT1NYXRoLmZsb29yKChpLTEpLzI2KSlzPVN0cmluZy5mcm9tQ2hhckNvZGUoNjUrKGktMSklMjYpK3M7cmV0dXJuIHN9CmZ1bmN0aW9uIHNoZWV0WG1sVjgocm93cyl7cmV0dXJuIGA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+PHdvcmtzaGVldCB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIj48c2hlZXRWaWV3cz48c2hlZXRWaWV3IHdvcmtib29rVmlld0lkPSIwIj48cGFuZSB5U3BsaXQ9IjEiIHRvcExlZnRDZWxsPSJBMiIgYWN0aXZlUGFuZT0iYm90dG9tTGVmdCIgc3RhdGU9ImZyb3plbiIvPjwvc2hlZXRWaWV3Pjwvc2hlZXRWaWV3cz48c2hlZXRGb3JtYXRQciBkZWZhdWx0Um93SGVpZ2h0PSIxOCIvPjxjb2xzPjxjb2wgbWluPSIxIiBtYXg9IjEiIHdpZHRoPSIzMiIgY3VzdG9tV2lkdGg9IjEiLz48Y29sIG1pbj0iMiIgbWF4PSIxMDAiIHdpZHRoPSIyNCIgY3VzdG9tV2lkdGg9IjEiLz48L2NvbHM+PHNoZWV0RGF0YT4ke3Jvd3MubWFwKChyb3cscik9PmA8cm93IHI9IiR7cisxfSI+JHtyb3cubWFwKCh2LGMpPT57Y29uc3QgcmVmPWNvbE5hbWVWOChjKSsocisxKTtyZXR1cm4gdHlwZW9mIHY9PT0nbnVtYmVyJyYmTnVtYmVyLmlzRmluaXRlKHYpP2A8YyByPSIke3JlZn0iIHM9IiR7cj09PTA/MTovcGF5b3V0fGRlc3ZpYWNpw7NuIG5jY3xjdW1wbGltaWVudG8uKiUvaS50ZXN0KFN0cmluZyhyb3dzWzBdPy5bY10/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/aWQ9ZXEuMSZzZWxlY3Q9cGF5bG9hZCxyZXZpc2lvbix1cGRhdGVkX2F0Jyx7fSx0b2tlbik7CiAgaWYoIWxpc3QubGVuZ3RoKXRocm93IEVycm9yKCdBw7puIG5vIGhheSBtYXRyaXouIEFkbWluaXN0cmFjacOzbiBkZWJlIGltcG9ydGFyIGVsIGhpc3TDs3JpY28gaW5pY2lhbCBjb24gZWwgYm90w7NuIGRlbCBpbmdyZXNvLicpOwogIHJldHVybiB7Li4ubGlzdFswXS5wYXlsb2FkLHN0b3JhZ2VSZXZpc2lvbjpsaXN0WzBdLnJldmlzaW9uLHN0b3JhZ2VVcGRhdGVkQXQ6bGlzdFswXS51cGRhdGVkX2F0fTsKIH0KIGlmKG5hbWU9PT0nZ2V0Vmlld3MnKXsKICBjb25zdCBsaXN0PWF3YWl0IHN1cGFiYXNlUmVxdWVzdExBKCcvcmVzdC92MS9sYV92aWV3cz9zZWxlY3Q9cGF5bG9hZCcse30sdG9rZW4pO3JldHVybiBKU09OLnN0cmluZ2lmeShsaXN0WzBdPy5wYXlsb2FkfHxbXSk7CiB9CiBpZihuYW1lPT09J3NhdmVWaWV3cycpewogIGNvbnN0IHBheWxvYWQ9SlNPTi5wYXJzZShhcmdzWzBdKTtpZighQXJyYXkuaXNBcnJheShwYXlsb2FkKXx8SlNPTi5zdHJpbmdpZnkocGF5bG9hZCkubGVuZ3RoPjg1MDApdGhyb3cgRXJyb3IoJ1Zpc3RhcyBubyB2w6FsaWRhcyBvIGRlbWFzaWFkbyBncmFuZGVzLicpOwogIGNvbnN0IHByb2ZpbGU9YXdhaXQgc3VwYWJhc2VQcm9maWxlTEEodG9rZW4pOwogIGF3YWl0IHN1cGFiYXNlUmVxdWVzdExBKCcvcmVzdC92MS9sYV92aWV3cz9vbl9jb25mbGljdD11c2VyX2lkJyx7bWV0aG9kOidQT1NUJyxoZWFkZXJzOntQcmVmZXI6J3Jlc29sdXRpb249bWVyZ2UtZHVwbGljYXRlcyd9LGJvZHk6SlNPTi5zdHJpbmdpZnkoe3VzZXJfaWQ6cHJvZmlsZS51c2VyX2lkLHBheWxvYWR9KX0sdG9rZW4pO3JldHVybiB0cnVlOwogfQogaWYobmFtZT09PSdpbXBvcnRNYXRyaXgnKXsKICBjb25zdCBpbmNvbWluZz1jbGVhbk1hdHJpeFY3KEpTT04ucGFyc2UoYXJnc1swXSkpOwogIHJldHVybiB1cGxvYWRDaHVua3NMQShpbmNvbWluZyxhcmdzWzFdLGFyZ3NbMl0sdG9rZW4pOwogfQogdGhyb3cgRXJyb3IoJ09wZXJhY2nDs24gbm8gZGlzcG9uaWJsZTogJytuYW1lKTsKfQoKY29uc3QgZGlyZWN0UnBjVjE1PXN1cGFiYXNlUnBjTEE7CmZ1bmN0aW9uIGxvZ2luU2NyZWVuVjE1KG1lc3NhZ2U9JycpewogZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdsb2NrZWRWMTUnKTskKCcjbG9naW5WMTUnKS5oaWRkZW49ZmFsc2U7JCgnI2xvZ2luTWVzc2FnZVYxNScpLnRleHRDb250ZW50PW1lc3NhZ2U7JCgnI3Bhc3N3b3JkVjE1JykudmFsdWU9Jyc7Cn0KZnVuY3Rpb24gZW5kTG9jYWxTZXNzaW9uVjE1KG1lc3NhZ2U9JycpewogYXBwU2Vzc2lvblYxNT1udWxsO2RhdGE9bnVsbDtzYXZlZFZpZXdzPVtdO2NoYXJ0UG9pbnRzVjQuY2xlYXIoKTskKCcjY29udGVudCcpLmlubmVySFRNTD0nJzt0cnl7c2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgnTEFfQVVUSF9TRVNTSU9OJyl9Y2F0Y2goZSl7fWxvZ2luU2NyZWVuVjE1KG1lc3NhZ2UpOwp9CnJwYz1mdW5jdGlvbihuYW1lLC4uLmFyZ3MpewogaWYoIWFwcFNlc3Npb25WMTUpcmV0dXJuIFByb21pc2UucmVqZWN0KEVycm9yKCdBVVRIX1JFUVVJUkVEOiBJbmljaWEgc2VzacOzbi4nKSk7CiByZXR1cm4gbmV3IFByb21pc2UoKG9rLG5vKT0+e2NvbnN0IHRpbWVvdXQ9c2V0VGltZW91dCgoKT0+bm8oRXJyb3IoJ0VsIHNlcnZpY2lvIG5vIHJlc3BvbmRpw7MuIEludGVudGEgbnVldmFtZW50ZS4nKSksbmFtZT09PSdpbXBvcnRNYXRyaXgnPzkwMDAwMDpuYW1lPT09J2dldFZpZXdzJz8xNTAwMDo5MDAwMCk7CiBkaXJlY3RScGNWMTUobmFtZSwuLi5hcmdzLGFwcFNlc3Npb25WMTUudG9rZW4pLnRoZW4odmFsdWU9PntjbGVhclRpbWVvdXQodGltZW91dCk7b2sodmFsdWUpfSxlcnJvcj0+e2NsZWFyVGltZW91dCh0aW1lb3V0KTtpZihTdHJpbmcoZXJyb3IubWVzc2FnZXx8ZXJyb3IpLmluY2x1ZGVzKCdBVVRIX1JFUVVJUkVEOicpKWVuZExvY2FsU2Vzc2lvblYxNSgnTGEgc2VzacOzbiB0ZXJtaW7Dsy4gVnVlbHZlIGEgaW5ncmVzYXIuJyk7bm8oZXJyb3IpfSl9KTsKfTsKZnVuY3Rpb24gcm9sZUludGVyZmFjZVYxNSgpewogaWYoIWFwcFNlc3Npb25WMTUpcmV0dXJuOwogZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCd2aWV3ZXJWMTUnLGFwcFNlc3Npb25WMTUucm9sZSE9PSdhZG1pbicpOwogJCgnI3Nlc3Npb25OYW1lVjE1JykudGV4dENvbnRlbnQ9YXBwU2Vzc2lvblYxNS51c2VybmFtZSsnIMK3ICcrKGFwcFNlc3Npb25WMTUucm9sZT09PSdhZG1pbic/J0FkbWluaXN0cmFjacOzbic6J0NvbnN1bHRhJyk7CiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2xvY2tlZFYxNScpOyQoJyNsb2dpblYxNScpLmhpZGRlbj10cnVlOwp9CmFzeW5jIGZ1bmN0aW9uIG9wZW5TZXNzaW9uVjE1KHNlc3Npb24pewogYXBwU2Vzc2lvblYxNT1zZXNzaW9uO3RyeXtzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdMQV9BVVRIX1NFU1NJT04nLEpTT04uc3RyaW5naWZ5KHNlc3Npb24pKX1jYXRjaChlKXt9cm9sZUludGVyZmFjZVYxNSgpO3N0YXJ0ZWRTZXNzaW9uVjE1PXRydWU7YXdhaXQgc3RhcnREYXNoYm9hcmRWOSgpOwp9CiQoJyNsb2dpbkZvcm1WMTUnKS5vbnN1Ym1pdD1hc3luYyBldmVudD0+ewogZXZlbnQucHJldmVudERlZmF1bHQoKTskKCcjbG9naW5CdXR0b25WMTUnKS5kaXNhYmxlZD10cnVlOyQoJyNsb2dpbk1lc3NhZ2VWMTUnKS50ZXh0Q29udGVudD0nVmFsaWRhbmRvIGFjY2Vzb+KApic7CiBjb25zdCBwYXNzd29yZD0kKCcjcGFzc3dvcmRWMTUnKS52YWx1ZTskKCcjcGFzc3dvcmRWMTUnKS52YWx1ZT0nJzsKIHRyeXtjb25zdCBzZXNzaW9uPWF3YWl0IGRpcmVjdFJwY1YxNSgnbG9naW4nLCQoJyN1c2VybmFtZVYxNScpLnZhbHVlLHBhc3N3b3JkKTthd2FpdCBvcGVuU2Vzc2lvblYxNShzZXNzaW9uKX1jYXRjaChlcnJvcil7bG9naW5TY3JlZW5WMTUoZXJyb3IubWVzc2FnZXx8U3RyaW5nKGVycm9yKSl9ZmluYWxseXskKCcjbG9naW5CdXR0b25WMTUnKS5kaXNhYmxlZD1mYWxzZX0KfTsKJCgnI2xvZ291dFYxNScpLm9uY2xpY2s9YXN5bmMoKT0+e2NvbnN0IHRva2VuPWFwcFNlc3Npb25WMTU/LnRva2VuO2VuZExvY2FsU2Vzc2lvblYxNSgnU2VzacOzbiBjZXJyYWRhLicpO2lmKHRva2VuKXRyeXthd2FpdCBkaXJlY3RScGNWMTUoJ2xvZ291dCcsdG9rZW4pfWNhdGNoKGUpe319Owpjb25zdCBmaWxlSGFuZGxlckJlZm9yZVYxNT0kKCcjZmlsZScpLm9uY2hhbmdlOwokKCcjZmlsZScpLm9uY2hhbmdlPWV2ZW50PT57aWYoYXBwU2Vzc2lvblYxNT8ucm9sZSE9PSdhZG1pbicpe2V2ZW50LnRhcmdldC52YWx1ZT0nJzthbGVydCgnU29sbyBhZG1pbmlzdHJhY2nDs24gcHVlZGUgY2FyZ2FyIG1hdHJpY2VzLicpO3JldHVybn1yZXR1cm4gZmlsZUhhbmRsZXJCZWZvcmVWMTUoZXZlbnQpfTsKY29uc3QgcHJldmlld0JlZm9yZVYxNT1zaG93SW1wb3J0UHJldmlldzsKc2hvd0ltcG9ydFByZXZpZXc9ZnVuY3Rpb24oaW5jb21pbmcpe2lmKGFwcFNlc3Npb25WMTU/LnJvbGUhPT0nYWRtaW4nKXRocm93IEVycm9yKCdTb2xvIGFkbWluaXN0cmFjacOzbiBwdWVkZSBjYXJnYXIgbWF0cmljZXMuJyk7cmV0dXJuIHByZXZpZXdCZWZvcmVWMTUoaW5jb21pbmcpfTsKLy8gUHJldmVudCBhdXRvbWF0aWMgcmVzdGFydCBhZnRlciBzaWduLW91dCB3aGlsZSBhbiBlYXJsaWVyIGxvYWQgaXMgc3RpbGwgY29tcGxldGluZy4KY29uc3QgaW5pdEJlZm9yZVYxNT1pbml0O2luaXQ9ZnVuY3Rpb24oKXtpZighYXBwU2Vzc2lvblYxNSl7ZGF0YT1udWxsO3JldHVybn1pbml0QmVmb3JlVjE1KCk7cm9sZUludGVyZmFjZVYxNSgpfTsKKGFzeW5jKCk9Pntsb2dpblNjcmVlblYxNSgpO3RyeXtjb25zdCBzdG9yZWQ9SlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdMQV9BVVRIX1NFU1NJT04nKXx8J251bGwnKTtpZihzdG9yZWQ/LnRva2VuKXtjb25zdCBpbmZvPWF3YWl0IGRpcmVjdFJwY1YxNSgnc2Vzc2lvbkluZm8nLHN0b3JlZC50b2tlbik7aWYoaW5mby5leHBpcmVzPkRhdGUubm93KCkpYXdhaXQgb3BlblNlc3Npb25WMTUoey4uLmluZm8sdG9rZW46c3RvcmVkLnRva2VufSl9fWNhdGNoKGVycm9yKXtlbmRMb2NhbFNlc3Npb25WMTUoKX19KSgpOwoKCgpjb25zdCBFTkpPWV9MT0dPX1YxNj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUF4b0FBQUZHQ0FZQUFBRHRrK24zQUFBQUNYQklXWE1BQUM0akFBQXVJd0Y0cFQ5MkFBQUJObWxEUTFCUWFHOTBiM05vYjNBZ1NVTkRJSEJ5YjJacGJHVUFBSGphclk2eFNzTlFGRURQaTZMaVVDc0VjWEI0a3lnb3R1cGd4cVF0UlJDczFTSEoxcVNoU21rU1hsN1Zmb1NqV3djWGQ3L0F5VkZ3VVB3Qy8wQng2dUFRSVlPRENKN3AzTVBsY3NHbzJIV25ZWlJoRUd2VmJqclM5WHc1KzhRTVV3RFFDYlBVYnJVT0FPSWtqdmpCNXlzQzRIblRyanNOL3NaOG1Db05USUR0YnBTRklDcEEvMEtuR3NRWU1JTitxa0hjQWFZNmFkZEFQQUNsWHU0dlFDbkkvUTBvS2RmelFYd0Facy8xZkREbUFEUElmUVV3ZFhTcEFXcEpPbEpudlZNdHE1WmxTYnViQkpFOEhtVTZHbVJ5UHc0VGxTYXFvNk11a1A4SHdHSysyRzQ2Y3ExcVdYdnIvRE91NTh2YzNvOFFnRmg2TEZwQk9GVG4zeXFNbmQvbjRzWjRHUTV2WVhwU3ROMHJ1Tm1BaGV1aXJWYWh2QVgzNHkvQXhrLzk2RnBQWWdBQUFDQmpTRkpOQUFCNkpRQUFnSU1BQVBuL0FBQ0E2QUFBVWdnQUFSVllBQUE2bHdBQUYyL1hXaCtRQUFCVWVVbEVRVlI0MnV6ZGQ1Z2J4ZjNIOGZlNWR4c2JqREROcHNnVVk0cnBKZlJPYUFsZ2FpQWtpRjVDQ1RXaDF3Q21CQkF0UUtnaGRBZ2RUT2pWcG9RaWlrMnhrWTBON3QzbjN4OHo5L1A1TE4xSnA5bmQyZDNQNjNuMndlaWsxZTdzN0dxL096UGZBUkdKdldJdXUxc3hseDJza2hBUkVSRmZ0RkVSaU1RK3lGZ051QmZvcnRJUUVSRVJYN1JURVloNEZUUXNBVndKL0RPVEw3eGN3ZnQ3QUkvYUlLTzlTbEJFUkVSOG9SWU5FWTlrOG9WZmdNK0FsNHE1N01mRlhQYklZaTdidFV5UTBRYlRrakZRSlNjaUlpSUtORVNrSmRjQW80QkJ3STNBRDhWYzl1cGlMcnR5ay9lZEIreXE0aElSRVJFZjFha0lSUHhUekdYM0JoNXE4dklDNEduZ09xQWI4R0NUdisrUXlSZWVWK21KaUlpSUQ5U2lJZUtoVEw3d01QQktpUWNEdTloZzQ4RVNIK3Vxa2hNUkVSRUZHaUxTa2hNeHJSZ2lJaUlpQ2pSRXhJMU12akFTdUUwbElTSWlJZ28wUk1TMXM0R3BGYjYzcDRwTFJFUkVGR2lJU0lzeStjSTQ0S0lLMzM1dE1aZmRTS1VtSWlJaUNqUkVwQklmVmZpK0hzQnpDalpFUkVSRWdZYUlOS3VZeTI3RDRtbHVGV3lJaUlpSTl6U1Bob2pmUWNhVFFPZFdmSHdLWmw2TnQxV1NJaUlpb2tCRFJCcUNqRzJCSjFvWlpEUU9OcmJMNUF2dnFrUkZSRVFrYk9vNkplSmZrTEU3WmxLK3pqV3VxZ2Z3bjJJdXU1WktWVVJFUk1LbUZnMFIvNEtNZndQdDdVdmpnWDlpNXRONEcramU1Q05uQUc4QkdhQWZzRFN3YkpQLzFnUGJaUEtGajFYQ0lpSWlFcFoyS2dJUjc0S01OcGl4R2JjRFQyYnloYm4yNy9PYmZHUTRjRmttWDFqUXdubzdBbDFWd2lJaUloSW10V2lJK0JOa1hBemNEZHlaeVJkK0xQR2UwY0NLOW45bkFJTXkrY0lvbFo2SWlJajRTQzBhSXRFSEdSMkJjY0JhTGJST3pHdjA3N01VWklpSWlJZ0NEUkVwSzVNdnpNYU12MmpKTlB2ZjE0QnJWWElpSWlMaU0yV2RFb21QT2NCczRQQk12bEN2NGhBUkVSRUZHaUxpd2d6Z25FeStVRkJSaUlpSWlBSU5FWEZsT0hDVmlrRkVSRVJFUkp3cDVyTHRWUW9pSWlJaUlpSWlJaUlpSWlJaUlpSWlJaUlpSWlJaUloS2xZaTdiUWFVZ0lpSWlFaDVsblpLMHVOcVRnRWNEdWtWRVJFU0Joa2dTRkhQWkk0RURQZG1jUzRxNTdPbzZLaUlpSXFKQVF5VGVRY1lRWUpoSG16UWVlS3VZeSs2Z295TWlJaUlLTkVUaUdXVDBBdjRGZFBSb3M5NEFlZ0JQRjNQWlkzV1VSRVJFUklHR1NMeUNqRHJnSDhCS25tM2FlOEJjZSs1ZFY4eGxieWptc3UwYzczc24xUUFSRVJGUm9DRVNqRDhCZS9xMlVabDhZUll3b3RGTFIyRmFOM281Q0REYUZuUFpVNEdjRHIrSWlJZ28wSkRVS3VheVN4UnoyZjJLdVd4bngrdmRGTGpVNDExL3M4bi9iNGNadDdGcURmdThLakFjdUJ4NFViVkxSRVJFRkdoSWFtWHloVitBbWNDb1lpNTdkVEdYSGVnZ3lGZ1NNeTZqbmNlNy9rYUoxd2JhWUdPckt2ZTNycGpMSG9OcEpka2MrRDZUTDN5aTJpVWlJaUlLTkNUdHdjYmp3QkhBY2NEbnhWejJ4V0l1KzV2V3pEZFJ6R1hiQVBjQ3kzcSsyMitVZWIwMzhGd3hsLzFqaGZ1N0F2QThjRDNRMWI3OEg5VXFFUkVSVWFBaHNqRFkrQjFRRDJ3RC9CdjR0cGpMbmwvTVpaZXZZbFZuQTl2SFlIOS9BSDRvOCtmMndNM0ZYUGJLWWk3YnRwa2c0ekRnRTJEYkpuOVNvQ0VpSWlKZXFGTVJpQytLdWV4QndEK2J2RndQUEFIY0JEeVh5UmZxeTN4MlcrQzVab0xueVpsOG9aZEgrL29Bc0c4TGIzc0syRCtUTDB4dDlMa01jQ3V3YTRuM3p3RjZaL0tGNmFwTklpSWlFalcxYUlnM012bkMzY0RSSmVyb0hzRFR3SmZGWFBZME93Nmo4VTE3UDB5WHFUalY1emNyZU0rdXdCdkZYTGEvM2MraHdQL0tCQmtBd3hWa2lJaUlpQy9Vb2lIZXNSUFpYZGZNVytZQUQySmFPZDRDWGdLMmFHRzF2clZvYkFpOFhlSGJ4OXYzL3JxRjk1MlV5UmVHcVFhSmlJaUlEOVNpSWQ3SjVBdlhBMmMwODVZT3dJSEFxNWl4RGx2RWNEZEhBTE1xZkcvZkNvSU1NRjJ0UkVSRVJCUm9pRFFUYkZ3Sy9LV0N0eTRkMC8yYmk1a2wzSld2TS9uQ2w2bzVJaUlpb2tCRHBPV2I4UXVBeXhLOGkyODRYSmRhTTBSRVJFU0Joa2dWd2NicHdOVU9WdFc5bU12ZVhjeGxEMm82bUR4Q2J6cGNsOUxhaW9pSWlGYzBHRnk4WnlmdmV4TVk0bWlWQzRCM2dXY3gyYXpleWVRTDh5UFlyNzdBT0Flcm1vbEphenRMdFVWRVJFUVVhSWkwZkNQZURUZ2NPQmxZUHNDditoa3pCOGZUd0RPWmZHRjhpUHY0RmJCeWphdDVJcE12N0s0YUl5SWlJajVwcHlJUUR3T01KWUhqTVhOcTlBbmhLM3NEUSsyeW9KakxqZ1F1eitRTDl3ZTRqMjJBZzRBZURsYjN0R3FOaUlpSUtOQVFLWC96M1IvVGVuRTQwRG1pelhnT015Ymt1WUQyc1E0ekFlRkZ3QnFPVnF2eEdTSWlJcUpBUTZURXpmZGc0TS9BZmtEYkNEWmhGbkEzY0hVbVgvZzB3UDNjQnJnWTJNamhhbWNEazFXTFJFUkVSSUdHeU1JYjd5MkIwNEdkSXRxRWNjRDFRRDZUTC93VTRINXVhQU9NYlFOWWZVZmdWT0FzMVNnUkVSSHhpUWFEUzFSQlJqZGdCMkR0Umt2L2tMNytRMkFZY0c4bVg1Z1Q0RDZ1Z2VraXRXZkErek1kV0NXVEx4UlZzMFJFUkVTQmhzamlOK1k5R2dVZGcrMS8xOExOZUkwRm1FbnRyczdrQ3k4RnZCOHJBdWNCQnhQZVhEWFhaZktGNDFXTFJFUkVSSUdHU0dVMzdXMkJWVmkwNVdNSWtLbHdGWE9BVzRGck12bENJZUJ0elFCbkFrY0M3VU11cXJuQXFwbDg0VnZWR2hFUkVWR2dJZEs2Ry9wVmdDOHJmUHMxbVh6aHhJQzNweGRtbk1RSlFOY0lpK2JPVEw1d3FHcUlpSWlJS05BUWFmM04vY2ZBb0FyZXVrWW1YL2dzb0czb2JJT0xQd085V25qN1pHQWlabkxBaG1VNVlIT0htMVFQckJWazVpd1JFUkdSU2lucmxNVFZveFVFR3E4RUdHUU1BWTdGWkgyNnh3WU9FK3gvZjJrU1VQeWN5UmZtbDFqSExZNERqVGJBaGNEZXFoNGlJaUlTTmJWb1NDelpHLzMzV25qYmZwbDg0VjhlNzhNb2dzbTB0VUVtWDNoUHRVUkVSRVNpMUVaRklESDFBZkI5TTM4ZmgybjE4RFhJV0tYQ0lHTXVaa0I3TlM1VzlSQVJFUkVGR2lLdGtNa1hGclFRU054VzZSd1p4VngyNlFoMllmc0szak1CMkE0emx1TU1vTktNVXRzWGM5bXRWRXRFUkVSRWdZWkk2NVFMTkJZQU4xZXhudjJMdWV5K25nVWFuMkM2UVAwM2t5LzhsTWtYTGdWV0F2WUFuckg3Mkp4TFZUMUVSRVJFZ1laSTY3eUNHWGpkMUZOVnppZlJFYmlwbU1zdUc4WkcyN2xCdG03bUxVOEFtMmJ5aGRHTlg4emtDL1daZk9IeFRMNndNN0FxY0dXWi9RZllxSmpMN3FFcUlpSWlJZ28wUktwa016azlVZUpQTjFXNXFzN0FFc0NkeFZ3MmpBUUo2MU0rSGU1bHdKNlpmR0ZxQy92K2RTWmZPQVZZRmppTTBnUGpMeXptc2pySFJVUkVSSUdHU0NzODB1VC92d1dlcm5JZFBleC90OFhNaXhHMFV0Mm1aZ01IWi9LRjB6UDVRbjBWd2RiTVRMNXdSeVpmMkFEWUVMalRyZ3RNK3Q4RFZFVkVSRVJFZ1laSTlaNEZaalg2LzV1cnVWRzNPamI2OTZYRlhIYk5rQU9OY2NCV21Yemg3bHBXbXNrWDNyVXpnL2ZEekZUK0RYQnVNWmZ0b0dvaUlpSWlDalJFcXJ1NW5tbUREVENwWUc5dHhXcTZOZ2s2N2kzbXNoMkQyTjVpTHRzVjJLVFJTeU13Zzc3ZmNsZ21QMmZ5aGI5aHhuRWNCNnltbWlJaUlpSmgwOHpna2dTUFlMSXhQWnpKRjhhMzR2UGRtdnovWU13TTI2Y0dzSzFiQWUzdHZ4OENEc25rQ3pNQ0NzTHFxYjRibVlpSWlJZ1RhdEdRSkhnQ3FLZjZRZUFOU3JWZW5CelFYQlRiMmYrZUIrd1RWSkFoSWlJaW9rQkRwRWFaZk9GbjRNWk12akM4bGF2b1h1SzFPdUN1WWk3YnkvSG1iZ29NemVRTDU5cEpCMFZFUkVRVWFJaDRySlp1VGwzS3ZMNDg4SGRYRzFqTVpUc0JSMlh5aFFkMHVFUkVSQ1RwNmxRRWtuYkZYSFlrc0hZemI5ay9reS9jcjVJU0VSRVJxWnhhTkVUS1Q1N1g0S1ppTHJ1OGlrbEVSRVJFZ1laSU5WcEtaZHNUTTJ1NHpoY1JFUkVSQlJvaUZldGN3WHUyQms1U1VZbUlpSWdvMEJDcFZJOEszM2R4TVpjZHJPSVNFUkVSVWFBaDBxeGlMdHVleXBNaWRBRHV0dG1qUkVSRVJFU0Joa2haWGF0OC8xckF4UUVIUDJzVWM5bnppcmxzUm9kSFJFUkVGR2lJeEZPM1Zuem1wR0l1dTYzajRHS2xZaTU3ZWpHWC9SajRIN0IwSmw4bzZ2Q0lpSWhJWExWVEVVaktkV3psNSs0czVySnJaZktGWDJvSUx2b0J2d1VPQURacTlLZWZnRE4wYUVSRVJFU0Joa2g4ZFcvbDU1WUZiZ1NHVmhsYzlBYjJCdllIdHFKMHErTHB0UVF3Vld6TEpzQXZtWHpoYzFVREVSRVJVYUFoNGxhWEdqNjdYekdYZlNLVEw5elR3ZzE5TitEWG1KYUxIWUgyemJ6OUxlQWZJUVFadllCN2diMVVCVVJFUkVTQmhvaDdIV3I4L0EzRlhQYTFUTDd3YlpNYitZN0F6cGdXajkycGJLNk8rY0NSbVh4aFFRajdmU3ZRWDRkZlJFUkVGR2lJQktOWGpaL3ZBZHhWekdXM3hxVEozUmJZRHpQMm9rZVY2N29oa3k5OEdQUU9GM1BaSTRIZjJQL3RxQ29nSWlJaUNqUkUzSE54by8wcjRCbGdIV0NwVnE1alBIQk9DRUhHV3NEVmpWN3FyQ29nSWlJaUNqUkUzSE4xbzcxOWpaLy9VeVpmbUZ4Qm9MQXVzQzd3WUNaZm1GcGxrTkVWdUIvUWhJTWlJaUlTT00yaklXblh3NE50K0M5bVlIYUxNdm5DQ0V3cnpKaGlMbnVielJ4VnFXdUFOWnE4VnFjcUlDSWlJZ28wUk55TGVvekNmT0NZYWdhQVovS0ZHNEUvQTc4SDNpam1zdjhyNXJKL0t1YXlTNWI3VERHWEhRb2NYdUpQUFZVRlJFUkVSSUdHaUh0ZEkvNytxelA1d2lmVmZzZ0dHMGZiLzEwRHVCSVlXOHhsSHl6bXNqc1djOWsyallLTWxZRzhEcldJaUlnbzBCQUpUN2NJdjNzc2NINXJQOXdrMkFBelA4ZHZNUVBUUnhWejJYT0x1ZXlxbUhFWlBYU29SVVJFUklHR1NBanNrLzVWSTl5RWs2c2QwRjFCc05GZ0JlQ3ZRQUZZdjVsVmRGVk5FQkVSa1NBbzY1U2tKYWpvQkt3SGJBNXNBbXdLOUkxd2sxN0k1QXYzdTFoUkpsKzRzWmpMQXR6UWlvKzNWKzBRRVJHUklDampqQ1Exc09obmc0bE5iV0F4eEtPYjZybkE0RXkrOExuamZUNnFGY0hHUk9CNTRBVWIvSHlyMmlNaUlpSXVxRVZEa2hCVXRBTUdOd29zTmdWVzlIaVRyM0lkWkZpamdCK0E1YXI0VEI5Z3FGMG81ckpmTndvOFhzN2tDeityaG9tSWlFaHJxRVZENGhoWTlBWTJ4blNEMmhqWUNPZ1NrODMvRGxnOWt5L01jRlFXZGNCdXdGbTJIRnlhRDF3TW5KdkpGK3BWODBSRVJLUWFhdEVRMzRPS09tQTFZRE1XanExWUxjYTdkSktMSU1PbXI5MExPQnRZSjRBQTQzN2c4a3krOEpGcW9ZaUlpTFNHV2pURXQ4Q2lHN0NoRFNvYWdvdGVDZG05WnpQNXdrNDFsazg3WUIvZ0hHQjF4OXMzSGJnTnVES1RMM3luMmlnaUlpSzFVSXVHUkIxWVpJQnRHZ1VWZzRHMkNkelYyY0F4TlpaVlcrQTBZSGVnbjhOdG13aGNBOXlReVJjbXFsYUtpSWlJQzJyUmlOZXg2b09aWUs2YkRSTGJzL2c4Q1BYQUZQdnZXY0F2d00rWVRFYytCaHB0TUhOWnJJdEpQOXZ3Mzk0Sk8zNFhaUEtGdnpndXUyVXhzNEt2YVplR2YvZXNjQldqTURPSzM1N0pGMmJxRkJNUkVSRUZHc25UQytnUERMQkxmOHlFYTMxdGNOSEgzbmpYY3J5bTI2QmpBbVpHNnUvdDhnTm1nSElCR09OUkFMS0NEVGdhQngvOVlucDhSd0ZyaG5VejN5aTE3NFBOdk8xOVlPTk12akJQcDUrSWlJZ28wSWkvTHNBZ1lDMU1GNkdHeFplbjkxT0J6NEhQN1BLK1hieEljVnJNWmZzMkNUeldCVmFPd1hIL2JTWmZlQ2lDOG5yZmxsTXBSMmJ5aGJ4T1NSRVJFUW1LeG1nRWF3RG15ZkxtbURFSWd6d1A3cm9ERzlpbHNWSEF1OEE3d0N2QUNFeG1vbEJsOG9YeHdETjJhYmlaN29uSnVqU2swWDhINHRjNGp3VVJmZStEWlFLTkdjQjlPajFGUkVRa1NHclJjSHd2RE93RTdBaHNDU3lUMFAyY0Fyd0tEQWRlc29ISEFsODJycGpMZGdiV2JoS0FEQVk2UkxSSlYyYnloVk1pS0llVmdhOUsvT25PVEw1d3FFNVhFUkVSVWFEaHI3YVlsb3FkN2JKMlNzdmhSK0FwNEVuTWpOTFRmZHZBWWk3YkhqZ0F1Q09DcjM4emt5OXNHdEYrbCtvKzlhdE12dkNxVGw4UkVSRlJvT0dYTmphNDJBL1lGMWhLUmJLSTJjRHp3RDAyOEpqbVViRHhJaWFWYnRqbUFEMHkrY0xzQ1BiNWRPQ1NSaThWTXZuQ1FGVlRFUkVSQ2VPbVdTcXpBWEFkSmt2VGZ6RnpJaWpJV0Z4SFlEZk1HSUJ4bUJtbWQvQWd5Tmd0b2lBRFRKZXQ5U0w2N3FhWnAyNVZGUlVSRVJFRkd0SHJaUU9La1ppQjBNZVMzSEVYUWVpQ2FmbjVROFJCUmp2ZzBvakxZck1vdmpTVEwzd05mR0QvZHg1d2w2cWxpSWlJaEVGWnAwcmJCRGdTMkFmb3JPS28yYnNSZi8vdk1SUFpSVjJub3RLUWZlcUpUTDR3VHRWUlJFUkV3cUFXalVYTDRqZkE2OEFid0NFS01weDVQNm92THVheTNZRHpQQ2lEVFNQODdvYnVVN2VwS29xSWlJZ0NqZkIwd1hTUCtnTDRkOFEzaEVtMEFIZ3Z3dTgvRlpOMk9HcVpZaTY3VWlSZmJMcFBQVTZqK1VkRVJFUkVncGJtcmxPZGdSeHdCdEJYVlNFd0JjeThHNkVyNXJMOWdGTThLb3VOZ1c4aSt1N0RNL25DZkZWSEVSRVJDVXNhV3pRNkFFZmJHNzZyRldRRTd2MEl2L3Q4VEl1Vkx6YVA2b3N6K2NJRVZVVVJFUkZSb0JIY3ZoNkdtU241Ny9qUm5TWU5JaGtJWHN4bDE3TEh1eGJmQTBjQjF6dmFySTFWSFVSRVJFU0JSckpzamtsUGV6dXd2QTU3OGdNTjRQSWE2bmNST0FuSVp2S0Ztekw1d25HWVdjVnJuZkY4YlRzNFhVUkVSQ1R4a2o0eitBckFaY0JRSGVwSTFBTTlITnlnVnhjbDVMTGJZV1lucjlaRTRHL0FkWmw4WVhxSjlhNk9TUml3UmcyYnQyMG1YM2hKVlVORVJFU1NMcWt0R3UyQk16R1pwQlJrUk9mVENJS01Oc0NWVlg1c01pWUY3c3FaZk9IU1VrRUdRQ1pmK0F6WUNEUHJlV3NwcTVtSWlJaWtRaEt6VHEyUG1TOWdzQTV2NUtMb05uVklGY2QrT21iOHhSV1pmR0ZpSlIvSTVBdlRnQU9LdWV6cm1HUUM3UlZvaUlpSWlDd3VTVjJudWdBWEFpZWcrVUY4Y1N4bTRIMG9pcmxzWitCTFlOa1czam9MeUFPWFpmS0ZIMnY0dmcweFhhbXFHZmN6Q2VpZHlSY1dxSHFJaUloSWtpWGxobnhUNEJQTUFGNEZHZjRJdTBYajVCYUNqTGsyd0JpWXlSZE9yQ1hJQU1qa0MrOEE2d0xQVnZHeFhzQnFxaG9pSWlLaVFNTnY3VEI5NjE4RkJ1aHdlbVVlOEdGWVgxYk1aZnNDcDVYNTgzemdUbUNOVEw1d1pDWmYrTTdWOTlvdVY3c0E1MklHdjFkaU0xVVBFUkVSU2JvNGo5RllDYmdiMkVTSDBVc2ZBN05EL0w1emdlNU5YbHNBL0FzNFA1TXZmQnJVRjJmeWhYcmd2R0l1K3lad0w5Q25oWTlzQXR5cUtpSWlJaUpKRnRjV2phSEFTQVVaWG5zbnJDOHE1cklEZ1NPYXZQd1lNQ1NUTHd3Tk1zaG9FbkE4aCtsSzlYWUxiOVdBY0JFUkVWR2c0WmwybUV3Lzk3SDQwMnZ4eS9zaGZ0ZmxRRnY3NzJlQlRUTDV3cDZaZkdGRTJEdWR5UmUrQjM0RlhOZk0yMVlyNXJLOVZVVkVSRVFreWVLVWRTb0RQR0J2NHRMdUt4dHNOUjBUTUJ1WTZjSDJ6UU1lQW40TStvdUt1ZXlXd0hEZ0ZlRGNUTDR3M0plRFZNeGw5OE9rV3U1YTRzKzdadktGLzZncWk0aUlpQUtOYUcyQ1NTUGFUNGZzLzcwTEhBKzhsZFlDS09heWRaaVdneWN6K2NJem5tNWp1ZG5FTDg3a0MyZXBHb3VJaUVoU3hhSHIxTDdBeXdveUZyTUI4Q1ltbTlJeUtTNkg0M3dOTXFEWjJjUTF2a2hFUkVRU3pmY1dqVDhEbCtvd3RXZ3FackxDWWNBY0ZZZWZpcm5zTVN5Y1RYdzYwQ3VUTDh4VHlZaUlpRWdTK2RxaTBSWXpzWnFDak1wMEJ5N0RURnE0aTRyRFQ1bDg0ZS9BNXNEM21IRWJnMVVxSWlJaW9rQWpQRjJBcDFnOFhhbTBiRlZiZHYreC94Yi9nbzNHczRtcis1U0lpSWdrbG05ZHAzb0Nqd0JiNjlEVWJDNm1tODZGbUs1VjRwRmlMdHNHV0MrVEw3eW4wcWhaQjJBMVlBQ3dBckFjMEJ0WXdsNVQyamQ1L3p4Z01qQUorQm1USFcwTThBMVFzSDhUUDYxZ2ovTks5amozeFV5UTJjVWU2N29teDNrUzhBc3dIdE9TT0FyNERQaE9SU2tPTFlWSitER3dVZDNzQnl3SjlBSjZBQjJCVG8wK004UCtUamZVMFovc2RlZ0g0R3ZnVStCellJcUtWeFJvdU5FTDg1UjNReDBXdC9lMHdPbkFYWmlac2tYaWZzMWFHOU1GYlZOZ2ZXQmwzTGJPL2dpTXdHUjJldzE0dzk0VVNMaTYyZU84alQzTzY5amcwWVhKbUVsRjN3Q2V4MHl5cWZGU2l4dGtiNVpyOVI0d0xTRmwwaFpZRDlnV2sraGpRNEpOVmxOb2RDMTZBWlBlM2tlRE1ROTRYUHJjM3NNa1dRYnpvTXkxanpBUDBseHBaNi9KYzZyOVBmUWwwRmdLZU1sZTFDUVlid1BIMlF1V1NKeDBCSFlBZmd2c2hIbUtIYWJaOWtmK1VVeUw2NWdFbGUzV21KYUFXcjBHVEhDd25yN0Ezc0ErbURtVDJvVlVEci9ZWTN1di9TM1NReG5qVVdBUEIrdFpGeGdaODZCM0YxczNkM0owenJUV3Q4RGp3SVBBNnl3K24xWlU5clRua0V0dkFGdDR0SSt1dGJIWFR0ZmRxTC9BUEppWlZjTTZlbU95dnU0RURNRzAwaldZaG1seCt5OW16alR2cDFsWUN2allYdGkxQkx2VVl5YVFXMXEvbnhJRFE0Q2JNVStmZlRxSG5nT0dZcnBzeGQxSVIrV3lWWTNic1JWbVF0WTVIaHpqTCsxRG1jNDZCWG5VVVptdUU5UDkzeEtUUW42NnA3L3Azd01YWUxvVCt1Q2VBUGJ4dUFTZlgwY0ZVRjd6Z1kxcjJLWWxNQmxNWjFieG5lL2JnTVJMUFRGZEZCUUVoTHRNQms1bThiN3JJbEdyd3p4QmZUTUc1OUVQd0duMmFhY0NqZGJaeVQ0TjgvSDRqZ09PSmJ4V0ZRVWFmdWdBSElycGVoS25oNGdQWWJxVFJxa1BwcXVUeTMyYkJxeVl3SE9yWDBBUDBhNm9ZWnQyeG94bmE3ck9lZllCelB1WTdLYlR5bnozZlpnc3FON29pdW5Pb3h2LzZKYlBnUjExYnl1ZTJKVjR0bTcrQkp3UTA4QTlxa0JqRFJaMlVmSjkrUXd6VmtTQlJySURqWFkyd0JnVjg5LzFaekVUK2taNUhROWluNUxtb1lEdTZUcTFjbnVPd2JTR05GN2Y0OEJ1bUdRYmpiV3hkV3hZaWFEalEweFBwY2gxaWRHUFRCcVd4ekFEYWtXaU1CQXp5REh1NTlHbm1LNFdDalRLYXc5Y2hNbTJFN2R1cDFlUmpPNXlDalFXdDdWOVVwdWszL1Y3Z0dVaUtzODdBdGlmM3lYb3ZOb2R2N3BNSFZiaXQyeWpDaitiS1hHZCtKQ0lXemJhWWdZTTZRYmZyMlUyY0FueDdnWWk4ZElPK0l1dGUwazZsNjZ0NGFsU2tnT05WVEhaaCtKOGJOOGwyQXhEQ2pUQzFRZTRPOEcvNjFNeDNmL0NUdnpUQzVNMHcrVytUQ1FaNDB1N1k5SnIrOUpsYXIwbXY4SFBOTG9QSEdEUDNjYkxRRXlQcE1icU1GTXBOTjZldTZNczVHdDBVKy8xTWdZNEFQL21XSkZrV1JsLysrYTdXRDRCVmxHZzhmKzJ4V1IyU3NLeEhZdEo1YWxBSTk2Qnh1NjRIMC9nNi9JeVpnNmFNQVhSaGVwZkNUaW5ncmdIYm0yWHFUYkFCNDNXOHhhTGRwTXFkLzdQeDJTY2F0cnFjVjJUOTBVeVFQdzQzY2pIWm5uZFJyb2lydTJHbWFRcTZlZlFMOEQyQ2pRNGtQaDFsYW9rb2NaR0tUaFhreGhvdEFmK2xzTGY5Sjh4ZzMzRGRHc0ErN0Zuak0rbkRWaDhIRVNVWGFhR05sclBkQllmZE45dy90Y0RvKzFEbG5tTlBqTURXTFBKdWRYNE4rWHRLSjRlekVjMzhISHJsM3d6NGM5YklNbDFocTFYYVRtSDVnRDdwempRT0NyQjEvM0ptTWtqRldqRUo5RG9ZNS9FcHZsMy9XekM2N0hRQS9mZGhNWml1bWJGVFR1SDExdFhXYWJlYUxTZWM1czUveWMxQ1NZYWQ1TzZ1c2xudG1xeWZhRTlzQjVzSXgvZHZNZjN5ZXdKcER2Tm85U21MWEI5U3MrZitmYXBmdG9DamYxVGNHekhrY3pVbTBrTU5MS1lXYlgxbXc1M0VWNWlneDBDMlA1YlkzZ3VuUlpBT2RTU1pXcTVSdXVaUytsTVVhVUNEVEJqWlJvKyszQ0p6eldldHVMQ01BcDNDZUJybmRpSldQNEhiSmZDbStUdGdhZXBmVkt5TkFjWjk2VDgzSmtQN0plaVFPTlgrREg1WGhqTENCWlAvNmhBdzY5QVl5MU1HbXI5amk5Y25naXgzdDRTd1BadkU2UHphS1VBSHJiWE9qSGZnU3c2aG9jcUFvMUJqVDU3ZlluUG5kSG83NjhFWGJodGdLZDBRaWR1ZVFSL1ppSU5TbnZnSUV5YXRvYjlMaEpkdXNDNGFxTWdZNUhNYnI3Tnh4QkVvTEVjTUNGbHgvWm1CUnJlQmhycms1eEVCSzZYbDBJS05ucGcrdmk3M1Bhdll4VGdQeHZBc2J1aXhtMjZxTkc2THFzaTBPaHVIN3cyZkhhSEVwL2JzdEhmeHdkZHVPZnFSRTdzTWhPNElJRlA4cnBqWmswdjE2LzBWVFNqZWpXRzZWeFpaSmxBK05sZndndzAyZ0d2cGZUWTdxbEF3N3RBWXcyMVpMUzQvSWR3dWxGdEhjQzJYeG1EYytqQUFQYTdsaTVURFc1dnRMN2pXamovNTlwL1A4ZWlpVnl1TC9PNUZSdHZiNUI5N25mRzVNaVhaT3FFR1ZSMktIQXE4SUN0VkhHMUxHWWN5aEZBejJiZXR6bHdPWENTcWtDTFRyWmxHb1d4UU1GZUZDZGpaaThGa3grOEcyWXVoQUdZeVliQzFBZDRFTmdDMDdVb2FVNEZOZ3RvM1F1QTd6RXpONC9IekJFd0ZUT3d0YWQ5NkxFc0pxMXdGQWtzYmdTR3MzZzNBNG5HY3ZiR2FNa0l2bnN5cGpYOFMrQmJHK3o4M09TYzd3ajB4dlIzNzIvcjdXRENuK2hzWitCT1RGcjdJSC9EWHdadUFJNTJ1TTRUZ2ZzeDg5djRxRGVMRDVhdVZiMjk3NXBWNDNyYU5QcjN2QmJlMnc3WXcvNTdQbkFmY0Mvd1pKbjNUdzJqY0plMlB3UjZXcENlNWIvRU13UExXdllpVzIxLzhsMzFPOTdpajFkWTJZWm1BeThDWjJMNnJGYnpROTBOTXdibnI0UTdyOGNsbmh5bmtiaHIwY2phSHo5WFpUUUwwK1hnSkdBVG9IT1ZQL0I3WXA1NC9oRGljYjAyWWVmeG84U3pSYU1MaTg0UEVNYkVlUDhHL29DWm1MSzE2b0RWTU5uYUhzUDBIQWhySHk0SzRiaDBzdzhLWE05WjVHc3ZnOXZ4cjh0VWd4c2FyZk92TFp6L2sxbjRNSG1CRFhTYWsyWFJGTGpPMWFGeEdXa2U4QnFYM1BMYllXYkFiTzIramljWnM1UUdZU1hDNlJQOUlhYkpkd25IMjM1T0NBOUthaDNJNTJPZzhaeWpkYjBESElicDErMUNHOHlFZ2MrRVVDZm5BYXNyMElnODBMZy9wTis4NFpqc2FwMEQybzl1OXFidXpaRDI1NEFRanMzV3VFOXgvbGNQejUydDhMUExWSU5UV1hUY2JYUG4veVJNNi84aysvOVRhSDZjN3U2TjF2MVJFSVY3ckc2NFU3dThpdDh6aXJmRDlKY2M0V2gvbjBJenFEZlZQb1NXZ1RjSVBnTllaK0I0VEhlSElHY1BqenBsdEt0QTR4SUg2M2dOazYwcVNCc0Q3d1ZjUCs5WG9CRnBvQkhHUGNoamhEK2g3YWJBOHdIdjF6UVduWUF0S01OdzM2cTlwa2ZuVFNmZ0M4OGZUbTNIb25NQ2RXd2gwQUE0a2tVelZaVzcvMms4KzduelJCbHI0cmJwWEV0OGxybVlsR2MrNmtiekE3eHJXWTVWYkxHSUN3T3NZei9aSjI1aEJuZDlNVG5uZzlxblB5VWswS2lsaTBlUmNGUC90Z1BPSXJpdWZmV1k3aThLTk1JUE5BYlptODRnSHc1c0dmRXgyUWt6OWlQSU5QYWRBdDZITGdIc3cxc3NPdTRnU3VjSGNGeXVjTHlOblRGZC9ocldmMGdGZ1VZYkZwM2s3NGd5UWRZNEF1cG0zZzU0WHpmY3FWMnV3RC85Z0V0Wk5FdUM2MlU2eVUvMVc2bDFNVjFIZ2lqbnB5azlvVkJZRGlXWS90S1RjTnYxSzZwQW81WmMvbjBpMnZmZDdCUGNJUGJyMW9TYzAzRUtOTm9IV0ovblk4WXcrRElXb0hPVHA4YXVsNnREMkljdGNOK0Y2a1FQanMwYXVKOUR5R1dYcWNZYWp5SDVza1NyUnROQW95R1luOHZDTGxSTnN5aWUwR2lkMytHNDFmNFUzV3luZHZrZTZPclpEMlFud3BzdzdBWFVoYW90d1EyK3ZOaVQ4aDFDTUtreUwwOXBvSEdoQjhkMUkvdXd3UFcrelFCNktkQUlOZEE0bStCYVVuMmRxSFlQVExlWElGcmx0Z2hoKzRjNTN1NXBFVC80cXdOZUR5RElEV284M3hvczJySjdaUVdCQnZZM3VmRkR3QVlyTjJrbE9jTGx4cTZNKzFrUHRjUm4yZHZUaTNDWVpYQjR5Z09OSXdONmluaWtaL3M1TUlCZ1l6clJwT0NNTXRBNHlxTmp1bU5BRHlXT1VhQVJXcUF4Z0dCYUhMKzA5emMrVzlNKzdBdWlDMVhRTFRpZDdOTjZsOXY5WElRUE1JTDRIUXk2dDhqMVRiNnY4Vy91VU14OGVLYzMrVXhuelBRVjU5cWxINmJId1dlTjF2TTJEcnV5MWRrbnVycmhUdWZ5bE1jWDRNa2hsc01rMGp0cmVDK0NtUW5hMStCdFNBQTNOZWVsS05BNDJzTmplbW9BKy9tcUFvM1FBbzFIQWpoK0h4TnRkODFxTEFkOEZVQVpuQnJDdG0rTSsvRlNoMFZ3REpiQmZUZnRvTHBNTmRZVitMVEo5NTVUWlpDd0ptYmVxb2JQVDhSeHk5S2h1dGxPOWV6Z0szbDg4UjBiY25uY2s5SkE0N3dBeXZMUG51L3pBWTczZHdLbHMzNGtMZEM0eE5QaldZZTc5THlOdTUvRS9lRkRIQUtOelFLb3A0VVlCUm1OZ3czWExSdVRDR2NNMVJXT3Qvc1h3cCtNOVYvRXA4dFVVLzFaZkw2aHR6Q3BpSnV6Rkdic1V1TWtVSk54UE0xQkR4WWRYYTRsWGN2Wm5sOTR2NHFnVExZZ1haYkUvWURhTzJPeTc3YzUzdStERXg1b1BJM2ZZNWxXd24zR29pTmpmbjdISWRCNHhmRXhHK2Y1QTdTV25peTdmcXArVlFqYkhVUVhxb2RDTFBmZGlGK1hxYVpXeExUaU5kMk9UekZqTnc3QlRJSzZENllyMVZNbHJwZmZZcExDT0hXNWJyWlR1M3dSMFJOWW41L1dOa3dpMTQ3MCtBdnVtNHE3eFdUZmUyRlNzOGE1cTAxWTU4Z1lvc3N1VlkzTEFnaXVGR2dFRjJoczZmaDR6U1g2OUxVdWJucGRabk9haVVuekhiUU5jWisxTUl6eG85MXduem8vakM1VHBYUzJnV1ZyanNOdEJKQkJjUlhDeStxanhiOWx1eGhjY0YrSnFHeVNNQWkwMG91U3k0SFI4ekhqSCtMa0VNZDFwMzlDQTQxZFkzSThlK00yQzlWVVRFWTJCUnJCZU5weFBUMHJJZGRtMTEyUkxnMXB1eTl5dk4xRmdzLytkalh4N1RKVnprckF0Ulg4dmsvRnBNaGR3L2NMa0piNExmZkY1R0w3ZEVUbE13SFRyVERwRG5WY2JzTmlXQVp0V0h3Z1hTM0xtUWtNTlA0ZHMyTjZvK1A5WHkvRzU3alBnY1pxam8vVDJ5U25OYm9USm11VXl6RVBZYVN3NzRpWkZOSGxjYjA5d08xZEgvY0QyWDJhazZ5dDNjZkRnYi9hMytpTE1CTVZid0YwQ1BMTHQ5Yk5kbXFYS2NSbmdPTy9JeXluQzFJUWFMemhPRGpySHROeU9NaGhPYnlmc0VCakp1RzMwdFJxc09NeU9FR0JSaUNCeHJVT2o5RXNrak9iZStPYllKZGRrWTZNNlhZdkFMWVBZRHZiNFg3dXFLaTZUSG5wTGQxd3AzWTVQa2IxOUk0SXkya2F5VTUzNi9wcDRxa3hMb3VPOW9tZnE3SllMa0dCeHJDWUh0UFBTRjhMY0p3Q2pZNjRIZlI4Y1VLdjB6YzRMS01SSVc3M0JZNnZRNk53M3lMamVwSnFIN3BNZVdNbjNXeW5kaGxCdlBvYlh4dHhlZDJRNE92QStRN0xhU0ptdkVlY1hlK3dQSTRJY2J1REREVG1BTXZIOUhpNlRISXdVb0dHODBCakg0Zkg1eWVTMjlWMWFSYWRxYm5XWlhCSTI5MCtnR3VUeTRjZS9YRS9TZlVWQ0dCU0U3NnZHKzVVTHZVNHpvM2M2TW5VUmJTY3I3azFMb200ek9ZQUt5VDBXdkNGdzNLNkpBSGw4U3VINWZGQVFnS05mSXlQcDh1NUdXYmhjSVpjQlJvQVBPencrQnliOFB1MnMyTjZNN3dPSmd1WWp5MEd6NkF1VTRIWlV6ZmNxVjJDdUdsWW40VUR2OFlCeXpwZS96a2VsTnROQ2J3T1pCMEhzTXNub0V6YVljWXZ1WHJDR3RaOEUwRUdHbXZGK0hoMmNQekVNcTd6TXZnWWFIVEdqUDF4c1YzalUzQ0QxeE4zclJwZmg3enQ1enErSm4xQzdXbjU5MGRkcGdJMVFqZmNxVnpHWTlJK3V0TFFpdEYwd05jYnVNMWljS0lIWlRlVDVJM1ZjTmszOWFVRWxjc2pEc3RsWU13RGpiY1RjRHhmZFZnZU95dlFjR1lQaDhmbDNKVGN1N25zUmp3NHhPMXVIOEI5WnkzSGZBbmNUMUtkK0M1VDFUVG5iayt3czN1S3YwNERmbmEwcm8weG1Sck9aUEh4SHBzQWYzTzQzVk04S0x0T3dKOFRWaDljenFGeVg0TEs1UjJINjlvbzVtVnhjd0tPNTBjTzE3VWM0c3BPanRZekI1UEtPQTJ1c1RlMUxvUTVKODVjNEdCN3JGdzVDeGpVeXM5ZWdkdkpDNy9BOUx3UTYxbjBaRCtOeTZ1NDZjYlJ5WjZrbGVTY1BzQlJuUjNxU1JsT3cyMkxVSlRhMmYxeDFXMnFiNEt1a1RzN3JETi9EMm1iUndaUTMrY1MvQ1JaWVRqZVlabWNHZE15ZUJUL1dqUytkTFJORDZYc0h1NUZSK1gyWWdUYmZwYmphOVE3VkovWXh2VXM5T295MWNSYXV1Rk81VEszaHNpL3NZMHhnNTBxL2Q3cGpyNzMxeDZWNVdrSnVSWnM2TEJNUGtqWWRYSlp4d0YrWEFPTkZ4SnlQSGR3V0NiWEtkRHc3aHpiTDJYM2NVYzZLcmRaaEQrdXBSM3dudVByMUorcStQNk9WZDdEcU10VUk1VjJuVHBac1ZZcURjTU1ubXF0enZaa2VwM3ErcHgzd1dRVnFUWGw0RlNQeXZKWWtqSHI3QVlPMS9Wc3dzNlhNVFk0ZC9Wd0o2NGVUY2p4L05IaHV2b2lMbXppYUQzVGdjZFRWbllQWXNaRjFxb2pzRzdJMno0UE9CUzNYYWd1cFBJa0RXZmlkdHhjcXJwTVZSSm9aSERYbFVYaTR3ZHFHelMxQmFhUDh5bTBMclhqcXBnSjkycnB0dVZUb0xFOHNKY0NqVVc4bWNEelpxeWo5ZlFrdnRtNG5reklzUnp2Y0YxOTlKUGl4SWFPMXZNc0psRkhta3pFWFV2cEpoRnMveWVZVkwydWRBWnVxZUFlWTNYZ2RJZmZXMitEcGxrS05CWTZGRFB5WDlMbEJNeFRuMnAxd2JTRXZBS3NVdU0yN0VWdE0wWlA5NnhNajA5QXZYQ1pjZVR0Qko0M1l4MnVhK1VZN3Y4WVlIUkNqdVZQRHRmVkRuRmhpS1Axdkp6UzhudkpzK05RcmFzYy8yNXNBL3krbWIvWFlSSmJkSEM4RDIvcFZGNjBrTDlDWXhYU3RqelZ5dnF5QmU0RzZqVWVNTlhheWZ4VzhMQnNWNC81Z3dsWGN3djhrTkJyNW5NTzY4cmhJV3p2U01mMSs3NkVIYzg1cER2ZDc2UDROVWFqNkdoN0JwRk9tenNxdjQ4aTNJZlZNSzBCcnE1Wms0QitaYjdyQ01mWHgxUk96TmRTaThiV01YMnFKcTAzQ3ppdXlzOTB3NlRQYzlHS1VhcU8zay9ySnZPYjRtSDVIaDdqdXJFQ3ByblpoYzhTZXY3TWNMaXVPRTd5OW9xT1owa2RrVnIxQVpaMnNKNkp3UDlTV29idjRLYkx6bXBFMTlQbGM5eU9iK2dKM0ZEaTlReHd1Y1B2U1YyWHFRWXROZWYrUWRlMjFMa0krS2FLOTI4TjNBNzBEM0NiK21JR3NtMUZkWVBCcG5wWXZnY0RaK0J1MEhDWVhCN2pzUUhYR1YrdnFkVllOb2I3UDBLWDBKSTZxQWhxdG9yRE9yb2dwV1U0Qi9nVVdLL0c5YlRIUEhqNk9xTDl1QW96Y2VObWp0YTNCN0NQdmM5b01Nd0dJUzYzV1YybW11Z056RWJkaU5LMGZFSGxUOTY2WVhMOWg3bDkxN2FpSHZ0WWgrTTZLUHhRblNPaExzK0ZjRXhIT3R6ZWVudGRTSkpKanNwbWRFejMvMUg4NlRxMXY2TnRHWmJ5ZTdzN0hKWGo5aEh2eDZxNDY4cTdBTk10cnlGcHd5Nm95NVF6elhXZDJrdFBZVkxuR0h0ajNwS3RnWStCbzBQZXZ1T29QZ1BhZEEvTCthQ1kxbzkrT2tWQ3RVek10bmNVWmpKSGtTRDBkN1NlajFOZWpxNjZqUTJJZUQrK3hPMUVtRXNEVndKZGNUdGpmR3E3VEZVU2FPeXY2MXFxM0UvTEUyMzF3R1JnZUlub3VyM2NBcXhaeGZ0OUhLZXhDL0Y4OHB2UmFSS3F1TTBtLzdFT21jVGcrdk5GeXN2eE04K09SeTJ1QlY1enVMN2ZBVTlndW9XNWt2b3VVK1VDamI2MFB0T1B4TTlVV3A0bGN3ZE1IdXMvUnJ5dERaUDVkYS93L1Q0K1llMEU3Qm5EZXFKSng4SVZ0N2tYUnV1UVNZQ1dkclNlc1NrdlIxY1RVZnJRNGxvUEhJYmJuZ3N1NzMxVE5URmZ0WUhHM3JSdWtqV0pwN09idWZqMHdMUWlQSXMvRTRobHFYd3l2K21lbHZsK01hd25QWFNxaEtvajhackQ2RHNkTWduUVVnbzB2TnIvcFR6Wm42K0FQM3RZenFudk10VlNvTEdQcm1tcE1SSXpxTHVVSFRHdEdENW1IOXNiT0xtQzk4M3d0Tngzd0cxR2l6QjAwK2tTdXE0S05FUUFOdzg2SnVuR2ovSDJKdGlINCtIS0RjQnd6OHBaV2FhYUNUU1d3S1FSbGVSYkFCeUptUlN2c1Y2WUZvTm44S2NWbzVSTEs2aXJrejNkOWc1RW43VWp6ajhzYVZFWG8yMzlYb2RMQXRUZHdUb21xUmlaajV2VTc5MDkycWNGbUJtK2ZlbkJvQzVUTFFRYU82QnVVMmx4QzR2UFdMc3JKaXZGNzJLdy9XMHhnOWlieTRia2N4YWNYVlVGcFFWeGF2V2FvTU1sQVhLUkhuU3lpdEZaT1hUMmJKOUdBYWQ2c0IzcU1sVkJvTEdUaWlVVmZzSk1ITmVnRjZZVjQwbmlsY1owYWN3a08rWDZzcy93ZU50M0psNVByRFc3c1RUbkZ4V0JoSHkvVXEwRktrWm41ZERXdy8yNkNYZys0bTFRbDZrV1R0dzZUTDk4U2I3VGdKL3R2L2NnUHEwWXBXd0svSzNNMzZaN3ZOMUxBK3NxMEpCbWRJL1J0aXJRa0NDNTZMcXBGZzEzNWVEanRXa0Jaa3pwMUlpK1gxMm1LZ2cwMWlaK2swUko5VjREN3NTa3o3d0hNL3RyM0Nkak94NFlHc01mbGwxaVZNWlRkT3FFcm0xTXRuTXllbG9zRWhkSlBsZS9vN0pFTWE2cHkxU0ZnY1lPS3BMRW13Y2N4Y0pXakFNU3RHKzNzdmhrZnRNOTMrWXRWU1VsQWZTa1dJSTIwOEU2dXFvWUFUY1pCR2Q2dkgrM0FzK0YvSjNxTWxWaG9MRzVpaVR4L29rWm0vRUk3aVpBOGtWWEZwL016L2RBWXhPZ1hVektkNzVPSHlsRHJSa1N0TmtPMXRGZXhRaU9mbk5tZTd4L0RWbW93bm9Bb2k1VEZRWWFkWmkrN3BKcys1R3NWb3ltbWs3bU44UHo3ZTBLckIrVHNwMnEwMGRFSWpMUHdUcTZxeGdCTnkwYTh6emZ4ekhBaVNGOGo3cE1WUkhWRHNUMDJaZGs2NUtDZld5WXpPOXZ4Q052K2hiRW84blZaVm5lZ2tsSUlNa0k3aWJwVUVrTXpvWE9La1puZ1VZY3h1emRnWm1BT3NpeGtPb3lWVVdnc1ptS1F4TGtVdUE5L084NkJmRnBTWFI1MDl0Zk42Y2lVZ1VYM1dENllucHkxS2U0SEh2akpvTmdYSktESElFWmp4ckVuRVRxTWxXQk5nbzBKS0VhSnZQckZZTnRIUktUTWgzdmNGMERWVVZGcEFvVEhmMHVMSjN5Y3N3NFdzOVBNZG5mTWNDeEFheFhYYVphRVdnTVVYRkl3aXdOWEIyRDdWd2VXQ3BsZ2NZS3VHbStGNUYwY0hYOVdUYmw1ZWdxbGYxUE1kcm51NEhISEs5VFhhYXFERFRhQTJ1b09DU0I0dktqRW9kQS8wZkg2MXRmMVZORUtsUjB0SjdsVWw2T0szbjZleEMwSTNIWGxmcHIxR1dxNmtCak5lS1RZbE1raWVJUWFIenJlSDBiNmJDTFNNalhuN1ZTWG82REhLM251eGdHcWhNY3Jlc1QxR1dxNmtCanNJcENKRkp4K1BIN3h2SDZOdEZoRjVFS2pYSzBuclVWYUhqNWV5QUtORVFrUUhFWUhEMEdtT053ZlZ1aGxsUVJDZmZHTnUwdEdvTTlPeDZTa2tCalRSV0ZTS1N5TEp4azBGZjF3R2NPMTljVDJGaUhYa1FxOEQxdVVxcXVRakNwVHVOZ05kek1sL1l0OFVnZEx4NEZHaXVyS0VRaTFRV1RmY3AzSHpsZTM4NDY5Q0pTb1U4YzNmZHNuZEx5MjhyVDN3RkpRYUF4UUVVaEVybHNETGJ4WThmcjIxZUhYVVFxOUtHajlXeXZRTU9MNHlBcENUUXl1SmtsVWtScUU0ZVd4VGNkcjI4VjFIMUtSQ3JqYXQ2Q05BWWE3WUVkUFAwZGtJUUhHdjFWRENKZWlNT2NIKzhEOHh5djgyQWRlaEdwd051TzFyTXE2UnVidWgyd2hHZkhRVklTYUt5a1loQlJvRkdobWNCN2p0ZDVDT2tkbkNraWxmc0NkeFAzSFpLeXNqdkEwWG8rQmlhcUtrbzFnY1p5S2dZUkw4VGxYSHplOGZxNkFYL1U0UmVSQ3J6b2FEMEhzWENjYXRKMUEvWnd0SzRYVkFXbDJrQ2pqNHBCeEFzcnBEVFFBRGdlNktBcUlDSXRlTmJSZXZvQk82YWt6QTREdW50Vy9xSkFRMFJDRnBkejhRM2dKOGZyWEI0NFZsVkF4Q3Z0UGR5bXA0RDVqdFoxVWtydTgwNXd0SzRwd01zNkxhVGFDcmlVaWtIRUMwdkVaRHZuQTA4RXNONnpnRjZxQmlMZTZPcmhOdjBNdk9Kb1hkc0RReEorRFBmQ1hVYkRwNEE1T2kyazJrQmpTUldEaUJmYVlmclN4c0cvQWxobmIrQjhWUU1SYi9oNmYzQ2Z3M1ZkblBEZkZKZjdkNDlPQ1dsTm9LR3VVeUwrNkJXVDdYd2VHQlBBZW84RnRsQTFFUEdDcnowZUhnUm1PVnJYRGlSM3JNYVJ1SnNJZGp3YW55R3RERFE2cVJoRXZCR1g3bFAxd0IwQnJMY091STM0dE95SUpGVTNvSytuMnpZWmVNamgrcTRoZVJNWDl3SCs2bkI5ZCtKK0RpVkpTYURSUzhVZzRvMDRCZjU1M0EzS2JHeFZHMnlJU0hRR2VyNTkxenZlMTNNU2R2eHV4RjNYdHdYQURUb2xwTFdCaG9qNG8ydU10dlY3VEJlR0lPd0wvRW5WUVNReUczaStmVzhCN3p0YzMrbkFwZ2s1ZGtPQmZSeXU3MUZndEU0SmFXMmcwVm5GSUNLdGRIbUE2NzRDK0UzQ3kyOXBWU0h4MU9ZTzF6VXJvRzI4ME9HNjJtSUdtY2M5RStkS3VHOTl1RlNuZzlRU2FHaVNMQkYveEsyZjhBamdzUUN2VC9jQnV5ZjBXSjhGN0s4cUx4NXFDK3dTZzBEamNlQXpoK3RiQWROS0c5ZjdvbTZZMWdlWFkvMmVCZDdSS1NHMS9KQ0xpRC9pMk1MNEY4emc4Q0MwQi80TjdKbWdZOXdEdUF1M1QyTkZYTnJXOGMzcWxJQzJzeDdUNWNtbExlMzUyVFpteDZ5RHZWYXU1WENkQzRBemRUcUlBZzBSaWRKSHdDMEJycjg5SnNQTVVRa29xNzJCVDRDRFZXM0VZOGM2WE5kTXpDUjdRWGtjZU4zeE92ZkRKS1NJUzdEUkVHUzRUdE43SC9DQlRnZFJvQ0dTSE5OaXV0MW5CM3d6MFFiVDcvZzI0cG1TZTBmZ05Sc3dMYTlxTGg1YkI5ak40ZnErQzJHYmo4TjlxK3J2N0kyMjc5Mm91dGpyeXE4RCtDMDZUYWVES05BUVNaYTQ1aW1mQUJ3Znd2ZjhIdk9FYmQwWWxFa1g0SERNT0pabmdNMVV2Y1Z6ZFpnNUplb2Nybk5VQ05zOUF2aDdBT3ZkQjNnSmY1TTJMQXU4N0Rnd2JQQlhncG1VVlZJWWFFeFJNWWlJQS9jQVQ0WHdQYXNEN3dKWDR0ODhRSFhBcnpCempJd0Zic1U4SVJhSmc5TnMvWFVwcks0M1p4Rk1DdGJOYkNDem5XZkhha2RNZXQ4TkExajMyemJnRkhFU2FDeFFNY1RhZk9BbjRGdTdmTlBvMzlOVVBMRXpPZWJiZnlqaFBBVnJpNWxuNHl2Z1pLS2RTYnd0c0JWd3JUM3ZYZ0dPQUhxcU9rdU03QTFjSE1CNnc4cFlOQlU0TEtCN21tV0E1NEdiaVA3aFJtL2daa3dyYVJBdExUT0JRd2htTWxaSnFlL3RpYW5GMzZXSVNURjNKZkFIWUh2TVRLWTlLamkrN1lGK21JbUlEZ1F1d0tRakhhTnk5WElabElCcnl1YkEzSkRMYlNKbVRvOVZROXJIZnZhbTVnSGdseHEyKzhTSWo5VklSK1UvTXFHL2o1TWNsYzlvei9mejk4Q2NnTTdOc0xzZFhSVHd0V1lDY0FMaFp3anNiSzhYRXdMZXY4TVRmTDg3MmxFWlBhclFvVG9mNitiT3k4RGlEa3htbXBVQ1BQWURNRStnLytYd0IxVkxiY3V5Q2JtdUhCbGhHYjRGL0JsWUczZDl6WmZEWktJWjV2RG1YSUdHQW8yb0xZVko1UnJrdVJpMnRwaFd4YUN2TXo5aWttQmtBdDZmalAyZUgwUFlwenNTZnIrclFDTWlyK25tem90bGpHMnhXQiszQS9FcTFSNHpNZG9Ed0d3ZGo4aVdMZ202dGx6bFFYbE9CUDVqbjNJZWhPbHZ2U0ttKzBQVDFKWGRiRXZGSmpZQXZ4aDRHUGdod08xVG9LRkFveFpyQWh1MTRuTXJBNWVGOElEcHp4RWR0NzRPYnlwYld1Wml1akg5MFQ2UWNQVmc0d2pnYVV5Q2tERDI0MjNpT1krVEFnM1B0Yk1YR29uR0Fuc1Q5SGRNMTZqNkNMZGxMaVlmK2VQMkl2MUhUQzcxakE1VGFHWURNeEswUHlkakp2MDZOTUp0NkEzc2JKZFM1bUQ2SkhkSFdmZ2tmallBL29FWm0vZWdmWEQ0QmFZN1gwTUd1KzZZbHRLVjdJT3NyUWduYTF1OWZYQVZoZkdZVEV5dlUxa1g0MXJ2bzNaazRSd1dvK3hOK3hmQWwwQUJNNDV5bXIyK04xemplMkRHY1MyRG1aRjhWV0N3RFJ3SGhGeGUzd0Y3Mkd1aGlITjNvNmZJWVM5ejdJL0RLcDdYamM0MjJOQjRqbkNXSHhONGZXbUx5VWFsNDZzV2pUaWFoTjh0R29kNlhMY2Y4dUQ0Ylcxdm5uV3RLYi84Qkt5V2t2dmQwYWhGSTNSdFVKN2tzTjBIWkRFRFNiL3lmRnRuQXRmYjdUMlBaRDF0OTlIUENkeW4rWml4UmpmcDhJcWt5dFVlYk1QTG1MRlZjM1U0U3BvQzdBUjhycUtRSUFPTnNTcUdVSXpBTklrZWdQOFpTSnFhRHB5TDZRLzhyQTVsWUw1UDZIN1ZBMGRoOHR5TFNQSTlqdW5HNWN1Mi9GYkJ4bUltQUR0ZzV1SVFDVFRRK0ZIRkVLaFp3Q21ZU1hYZWlmbStqTVk4L1RqY0JoL2kxbmNKMzcrTE1ibjZOYitMU0hMTndZelA4aTN3MlVYWG52LzNJN0FOWml5SlNPQ0J4ZzhxaHNCOEJBekJaSk9hbDZEOXVoMVlEL2hRaDlpcDcxT3dqNC9ZdWpOU2gxc2trYzdIejI3Qkx3QmI2SjZIRHpHOUt6NVdWWld3QW8zdlZBeUJ1QVhUaXZGcFF2ZXZnSmtFOEQ0ZGFtZlM4Z1A0SmJBeGNBbWFmVllrU1Y0Q0x2VjQrMGJhMytYL3B2VDRQR2lEcmU5VlZTWE1RR01NcG51UHVERVh5R0Z5WU05TytMN093SXc1K1lzT3V4TnBDdnBuQTJkaW5xeTlxME12a29nSENQdkc0T0hCajhDMk5pQmFrS0xyN2ZIMitFeFZWWld3QTQwRitKLzlLQzZtQUxzQ042ZHN2eThBZmsrMDg0QWt3UmNwM09mM01hMGJoNUcrOFdJTFNHYW1NVW1mTVpoNUpDYkdaSHZuQVdjQVc2YmcvdWQ5ekx3cDE2bWFTbFNCQmdvMG5KaUFtUWpwK1pUdS96K0FRMUJYbU5hYVNucjdEdGNEZDJCbUt6NEpLQ1o4Zjc4R3pnSDZBM2VwNmt2TWZZYnBSanNxaHR2K0tyQTJKbEhGbklRZGx5bkFDWmdIT1orcG1rclVMa09UMXRRNjRjMWFxa2FBeVNvMFgzV2k2a1hkaHhicWlKbUliR1NDanU5WXpCUEZ6WUU2ajhyYVZSbVBUR2hkbklRbTdHdHVlUnpvbFpCanZUSnd2MzN3RWZjSmdXOENsdFpQeVdKR293bjdJbk9BYnZRVVpEajBlOVdMcXBjN1ZXMUsyc2orYUU2SzRUSDkxZ1lYVzdDdzlkZzNDalFVYUxSbW1RTDgwYk9nMlpWMU1ZT200L2JBYkJad3F3MllSSUdHTjlyWi8zNmtvbWlWYWNET2hKc21yZzJ3T3JBSlpzYnVsWUFWZ2FXQXprQW5vQzB3MmY0WWZHbTM3MzFNdDY0d0JvTGRicCttWEt3cVVyRlBWUVFsdlcyWDR6QURPUGZDNU1OZnpzTnRuUTI4QWZ3SGVBYjRKQWJsTzlWZUsxeXNKNGttTzFyUGxJU1V4d0xnWDhCcEpEZDV4UWhnSDJDQXZlNGNEQ3pwOGZaK2IzOXpid1RHNlNkRGZBNDRacU9ueXRVczg0RHRRem8rUFlIZkFVOEF2MUJiaytyendGQ2dmUWpiL1UvVms0cVg3WFVacXNycXdESEF2Wmd4RDFFY3MzSEEwOERwbUM1UkhYUllKR1NIaGxUWDV3TC9CZ2Fuc0l3N0FML0JkS3VhNXNudnhjODJ1TmdSZjF0TGZUUWF0V2lFcm5HejUvdVlpYlNrTXNjQ2Z3LzRPemJGekxDNld3QTNNV09CcTRGckNXNFFYRWZNWUxzTlZGMWExQWRsSUtxMS9OYXl5MEJNUzk4QVRHdGZad2ZueWxmQU41ajVZejdDUFBVY3EyS1hpRzFpZjRmV0RXajlIOXNiN050SmZwS0dTblRHSkgzWkR0UEN1bFpJTi9yejdEM2FDOENMd0dzMitKUHEvQVhvN2VpOHVFM0ZXWDJna2NmTS9TQXR1eFhUUHpVbzIySm1WOTAwaEgwWlpZT1pSd0phL3dEZ0E1SXpZREFJWHdHcnFoZ0MweFhvQnl3QmRMZExyeVkzRHpNeGcwQ24ySCtQeDdSWVRDQjUyV2drZVhvRFF4b3Rhd0tyVUYzTDlUeE1kNzhSbUM2QXo2Qlp0Q3U1dGpTVStlckFhcGd4RXBsV0JpRHo3QU9NcnpHWm9qN0hKQW9aaWVZN2t3UUVHci9EcEppVWxpUFpEUU02NlZjRXJzSmtiZ3JiM1ppdUtFSDBKZjR0Wm5DZGxQWUFwanViaUlncjdUQXBsTE9ZTVhOTEFEM3MzNlppQmp1UHg4eUI4UU9tcjcrQ2FuZGx2elJtYk1jU21BY2JiUnFWUDVqeFAvV1k3dEMvWUI1cWpFUHpVVW1DWlZFLytaYVc2ZmFwUlJBQjM5R1ltYmFqM0w5UndEb0IxYTk3VkgvS0xpZnI4aU1pSWlKSk4wRTNmYzB1SndSUTV0MkJoenpheDZtWXJENnU5YkZQejFTUEZsL1cxNlZIUkVSRWt1NVIzZlNWWFY3Ri9hQ3ZGVEFEUzMzYjEvbkFnUUhVcjBOVmp4WmJKbVBTRVl1SWlJZ2sybkc2OFN1YjJtODF4Mlc5Q3FaZnJLLzdIRVN3VVFlOHJ2cTB5UEtZTGpzaUlpS1NCcXZyeHEva2NtWEtnb3pHd2NadkhlLzdwcXBQaXl3bjZySWpJaUlpYWZHOWJ2NFdXWDVpMFV3UnRlcUx5Y2NmbC8yZmljblY3dEpqcWxmL3Z3eldKVWRFUkVUUzRoKzYrUXZzaVhONzR0bDE2RWRnR1lmbHNLN3FGUXRzVUM4aUlpS1NHbnZyQm5DUkc4SE9Ec3Yyc2hpWHhYTXNPdTlLclo1Ui9lSUdYVzVFUkVRa1RicGh1c3NvMERDRDQxM1pLUUhsY2JURDh0aEc5U3VRTk1JaUlpSWlYbnRTTjRGTXRFR1hDMTFKeHRpWGFaaVV2QzdVQVorbHVINU5CenJwVWlNaUlpSkpWVzVlaUVkVk5OeG9iNnhkT0FkWUxnRmwwaFc0eU5HNkZ0Z3lUcXVuZ1ZrNnpVUkVSQ1J0bHNMTUhaSFdwODN6Z2VVZGxlV3F3SndFbFUwOXNKNmpzdW1UNG5yMkcxMW1SRVJFSksyZVNuR2c4WVREY3J3amdlWGpjcEs1eDFOWXZ5YmpOc21BaUlpSWlIZmFOUE8zZTFKY0x2OXd0SjRWZ0FNU1dENi9CZ1k0V3RkOUtheGZqMkVTTG9pSWlJaWtVbGZNR0lVMFBtM3U2S2dNcjBsd09ibWFMYjBYNmVzK3RaTXVMeUlpSXBKMi8weGhvT0dxTmFNOU1DSEI1VFNPNWx2RXF2RkNpdXJYOTBCYlhWcEVSRVFrNlZxNlVidzVoV1h5c0tQMTdJb1o3SnhVZllGTkhhM3JtUlRWcjlzd3lRWkVSRVJFVWgxb3ZJcVo2eUF0WmdFdk9sclhnU2tvcjcwY3JXZDRTdXFYeXhZekVSRVJrVmdIR3BDdVZvMlhnQmtPMXRNVzJENEY1Yld0by9WOEFFeEtRWGs5QTN5cnk0NklpSWdvMEREdWNuVHpIUWZQTzFyUFJrRFBGSlRYSUV6U2dGclZBKytrb0x4dTBpVkhSRVJFRkdnczlETm1Mb2cwR081b1BkdWxwTHphQWtNY3JldmRoSmZWbDhDVHV1U0lpSWlJQW8xRk5hUnBUYklwd01lTzFyVkJpdXJRSUFVYUZia2EwM0lqSWlJaW9rQ2prUUxKZnhyN0R1NnlBYTJkb2pyVTM5RjZQazV3R2YwTTNLbkxqWWlJaUNqUUtPMktoSmZGZTQ3V3N3U3d2QUtOcW8wbXViTmwzMGg2eGptSmlJaUlWQjFvdkFxOGt1Q3ljTlYxWjJESzZsQS9SK3VwQjc1SVlQbE1CNGJwVWlNaUlpSUtOSnAzYm9MTHdsWFhuZVZTVm9lNk9WelhxQVNXei9XWUdlSkZSRVJFRkdnMFl6aW1aU05wNWdMZk9GclhzaW1yUTEwZHJtdDB3c3BtT3ZBM1hXWkVSRVFramRxMTRqUG40MjYrQ1Y5OGpydUI0RE5JZGhlenBvb08xNVcweWV6VW1pRWlJaUpTcGVjeDZXNlRzanlxUStxRm9RbXFVNU9BSlhWSVJVUkVKSzNhdFBKenA1S3NlVFZHcXlwNDRhY0U3Y3ZGcURWRFJFUkVGR2hVYlNSd3J3SU5jU3dwTitiZkF0ZnFjSXFJaUlnQ2pkWTVHNWlWa0hJWXE2cmdoY2tKMlk4ekUzUnVpSWlJaUlRZWFJd0dMa2xJT1l4VFZmRENsQVRzd3p2QWZUcVVJaUlpSXJYcGhKbjdJTzREZDFmWG9mUkMrNWpYby9uQWVqcU1Jb25TRGRnV3FGTlJpSWlFYi9jRUJCcEw2VEI2STg3MTZCb2RQcEhFdWQrZTM1OEFSd0NkVlNRaUl1RjZMT1kzaUoxMENCVm8xTGo4Q1BUUTRSTkpsT05Mbk9zVE1Wbmw5SUJLUkNRa3kySUc4c2J4Qm5HZURwOENEUWZMZmpwMElvbXlDVENuelBsK0syclpFQkVKMVIrSjc4UnFva0NqbHVVUkhUYVJSRmtLK0tIRXVUNGQrSjJLUjBRa2ZIWEF5ekc4U2Z4SmgwNkJSbzMxUjEwb1JKS2pMZkJDaVhQOU0yQk5GWStJU0hSV0pINWRxRWJyc0NuUXFHSFpSNGRNSkZFdUxIR2UzNDNKUGlVaUlsVm81M2g5M3dMSEFQOVUwVW9LUEFBOHFHSVFTWXplUUZjV3pTQTNFcmhEUlNNaTRvK0dkSUJxMFpCcXhhWGVqQUtXME9FU0VSRVJDZGNTbU5hTnRBVWFEeFAvT1VXMHRMek1CVGJXYVM0aUlpSlNYcnVBMXZzTHB1LzZhNWpabm4zVzBlRzZwcWhLcGNKWndGc3FCbFlCbGl2eCtsZVlqRDF4VTRjWjdQc3JZSFZnSlV3M21zNlliRVBqN0w2OWI2OXRFenkrcHYwSzJBQVl3TUprQmRNeHlRdStCVDRBM3JPdnlVSy9BWlp2OHRwODRPOUF2UWZidHc3UXE4bHJNNEczSGF4N1NXQlFpZGQvc1BVK1NwMHdEM2MyQVZZRCt0bHpzeDZUb240YzhCMW1Vc1czZ0M4aTJNYmw3RFV4U0tOeDN3dWozSGI3Y054TFdaL2d4MHU5QmN3S2FYLzZBdHNBZzRIK1FCY1daa1Q5RWZqU1hxdi81OGsxeUR2SGthNzB0amVqcC8xSlg1NjJONlFDdzhxVTBZa3gyNDhWZ01zcG5jNjAzRklQdkFRY0ZPQURtMnF0Q054Z0gzaFVzZyt6Z1A4QSs4YmdnVkJZUC9penk1VFZyejNaeHVGbHRtOS9CK3Zlczh5NmgwVzR2eHRqeHNkTXEvSTYvVFZ3UG1hT3I3Q2NHTUx2ejdraGJ2Y3dUOC9Ua1NHVWMvOFE5bU5IVEhhNytncTNxUWpjQ0F6UnBYcHhEK0IvTjVpZ2I3eTBKR1A1Q28zTFNGS2dzU1J3aTMwaVdrdTkrQTRZR3VGKzFBR24yTUNobG4zNFBkQW14Zlg1TDgyVXo0dWVCeHJUcUQzMXJrK0J4a0FiQk5kNnpaNERYTTNpclVBS05CUm9SQlZvOUFZZXEzSDduc08wN01SQ0dEOHFod01mZVZ3RzdYRFhmVXJkRUpKcnV2MGgva1ZGa1FoN1licFgvQUV6YjBJdGxnZnVzemRHUzBZUVpOd0JYRkhqZFd4NTREWk1sN0NCS2F3UEhZQ2ptL243TnNCYUhtOS9WK0Fob0hzQ2pzV0o5cDVoWndmcmFtL1g5ejlnSjEzMkpHTExBZThBdTllNG51MHgzU1d2d1hRclRIMmdNYzBXcXM4VDQvVnd0SjdKT284UzYyQk0vMStKdi9Nd2lSdDZPMTd2enBpeEQydUV1QzhYQW9jNFhOOG1tREVvcTZTc1Rnd0ZscTdnQnRobkE0SGJpVy9YenZiQVhaZ1dpQTZPMTkzUFBnajRreTUvRXBGT3RnNnU3UEQrL1hoTTY0Ylh3dXBiL0MxbWtOMkwrTmtYZUVsSGdkQVluVXVKdlRGOVJNV1FDRmRXZUxNeEIvZ2NNeGh2cnIxR3JFYkxYVENXQjE0QnRnUStEWGhmMWdGT2IrYnZNNEIzN2ZXM0h1aURHZXc3b0lYMVBvK2ZnMENEVkVrUWNhQXRiNThmbXYzVzdzdlZNU3YvdHNDL01LM0dMZm5abnBzVDdNMWJIeHNZOTJ6aGMvWDQzYnRDa3Uwc21tOFYvZEZlcjMrMjU4UHlsRTcrME5TTkNqUVdlaFU0QXZpSGgrWFFGL2pNd1hyRzZseEtuTHRzb0NISnVKbHNLY2g0QXNoakJuclBiUEszT21CdFRBdkNFWmp1S3VVZVhEeUQ2VU03UHNEOU9ZUFNyZEp6Z2I4QzF3TlRTL3g5UmN3QThDTXhtYldhL3RqOU1XWDFZZ3RnM1FyZTE5R1cyUVdlNzgvbG1DdzFyOGJvR0Z6VlFwQXhGOU5hYzV2ZHR3VWx6czFCd043MjNPeFhZaDNIWWdiZmh1MGEzSTEzbUtUTGVMUG5zYXRzaDY2ekpuWnY1bUhHYU14RTEwK1hxTmR0Z0EzdGI4NGhKWDV6N3NGMDI1VW16c0cvUWI3N090cTNGZEdBNlNRdHorRytDVDlKaGhHZndlQWIycHVWY3NmNlUyQ2pLdGEzRlBCUG9zdFExdGtHUXFXK2Q3OEsxOUVHT05RK0lHbjQ3QTRwck1jUFVUcXIySndTcjQrTitKb3d2TUpyMTFnZ1UrVzY5eVNhUWNGN3RyQXYveTBSRURlbkEzQXFpMmFxdWk2a0J4bGhEZUFPWTd1SGVicTlJNGt1VTFScjdVdjVURkxMVkxpT0pURXQ4ZzNKUzBiVGNpdGVxdDNvMlEzbEtZNzJxdzNsMHlOcWlkZnlvVTdpeEFRYTdURGphOG9kNnlkb2ZWNzI0ekR6TEpSYjk0RUI3ZE5HWmI3dmcxYXNxd2ZtU2ZIVkthekQvY3NjdnllYUNTUVBpa0dnc2NDK3Q1cGVDMUVFR3QweHJXamw5dUVXV3QvZE9vdnBLdlVNdFNkOFVLQ2hRS01XVjVYWjV0TmJzYTdCd0FoZ3M3aGNaS05LWlhnczhLaEg1YkNpby9YVUUzeS9iQW5lMThBdWFIQi9VdnlCOHFrL1g4R01INXZXeW5WZlo2OW41VnhDTUUvQSs1VjV2VFVKQzZaZ3NnT21jYURzY1dWK0I2OXI1a2JyeEpqczI1YTIvdm5zTk1xM3ZEeU02UWJWMmhUMEJVeHlnLzFzTUNrU0ZaZlg2NDh3YzJtOHJrQ2plZlB0eWYrTUorWGdNaExXWUxONEd3TnNod2IySjBWYmV6TlR5Z1JNay9hY0dyL2pSdUR1TW45YkhqZVRxVFZWN2tsMUxlbDFGNlNzYm5TelFXaFRuMk1HeEw4UHZGbmk3ME9BelQzYmx5bGxYajhGTTI3QjEvSXZGNlNQQmc1elVDZW5vd2RHRXIwT2pxL1hzWm9oUE1ySm1lWmduaVMrN0VFNXJPNXdYZS9vbklxdDhjQlc5a2RPa21FN3ltZFpPaE4zZzdWUGF1YUc1ZzhCN05la01xOXZRM1g5MmRQc01FcW5Ocit1MFEzdU5XVStlNEpuKy9KSHlqLzV2d05ZMWNQeTM1dnlHWFZPYVNaNEVvbWJDV1ZlL3ozeFRVY2RpMEFEVFByRjNUeTRPUitBdTBuNzN0UTVGZHNMd1hha0w2MW4wdTFUNXZXeDlnYk1aZjM1ZTVtL2JVYjFBM05iOGtXWjF6dGluc2F2cjBQZjRtL2ZjU1ZlbjRMSk5OZmdJVXEzYnU2RnV5NjNMcnhEK1M1ZDNUSGRrTHA2ZGd6S0pTMzR6RzZ2U0ZKOFh1YjFMVEJabzNvbmVlZmJlTEFOTTRCdGliWmxvdzBtUjc0TEg2S20ycmo1RWZNaytHTVZSZUpzVStiMXUybDkzKzl5YmkvemVoMm1wY3lsNzVyNThWckozbmcrQXV5S01xZVZzZ3Vsbi9MZnpxTGpkZVlCTjVSNFgxdWFINXNUaFJzd0E5aExHUVRjNU5HMnRxVjg5N083U0Y4M1BrbTI1MW9JdUwvQlpKUWFsTVNkYitmSmRrekR0R3c4aXBsYVBRcERiSkJRcS9tWUhQeDc2ZHlLaFRIMkpsQXRHY25UaC9MZHBwNE40UHUrdGpmL3BSNWFyQVBjNy9qN2hqVno4MWlIeVNLMEorWXAvWE9ZQ1ZOZnBueHJTSnFjV09LMUJaaTVSNXE2R1pPV3ZWT1QxLytBbVdObm1rZjdkUlJtVHBCU055d0hZVnJjYi9CZ093ZFN1dHNhd0ZNSnEydjlIVHhvK0lUeTNXL0UySmpheHR2T0ExNExhTnMrWWVGRXJxWDB4Q1RqK0pQOUhYbkdYcXRmeGt6Z3AwRERrWVp1VkE4Q3UwY1VhTnp1YUYxUEtkQ0loYTh4clduZnFpZ1NhWlZtL3ZaQlFOLzVUcGxBWStVQXZ1dFdlL1BZMHNEa0hwZ1pvMzlyLy84N0czZzhhZ091ZVNtckYydlo4NzdVZGZ2ckVxOVBBTzdGOUtkdXJCZG1FcTBiUE5xMzZaaXhEKytWdVpFZmhobmsvbmJFMjFsdXpNZ2M0SDhWcm1NRnlyZFl0dVNPRVBmMWQzYXB4Vjc0bGFuVFI3Vk9YRGVabG1maHJzV1JtSm0vVzBxbHZqSm1BcjlqTUlPKzM3ZUJ4d05WbkJ2U2dyYVluTzVoejV2d25zTjlXSXJtYyt0cmlYNzVnTW9ueXBIU2h1SDNQQnE3bDltK3FRRis1NFdVbjlNZ0NIMkF0Mm80RDhaaFVxQXVtYUo2ZTB1WnNtaHVzc0sxeTN6bUM4SWR6RG1jeXVZUTJMdVpZLzVkbWVPOUorSE5wM0JZbWUrcXBtVjV6eHJxZlJCT0RQRDNhczhBNjlTSkpHTWVqVnFYU1NGcys5YjJlMXE3alNNd2s2eTJpOU1GdDQySDJ6UWZrOVA5dkpDL2QxM0tOK1ZXNnlkTTl5bngwN09ZSnN3ZlZSU0oxcW5NNnpNRC9NNXlQMVpkQXZxK2lTeWNMNkUxWTA3NllpYU5HbzNKd3RVMjRYVmlTVXBQdU5lUTByYWNEOHNFaTFsZ1p3LzM4MkhnaWpKL1d4N3o5RGZLWTExdU10UnBpQ1RYeThCNkxWeHJtck1POEE5TXdvUnQ0ckxUYlR6ZXRuTXhrL1hNQzdFc05uVzR2anQxVG5ucEg4Q3ZDZmFwdHZoaFRwVUJpQXZsTXZ2TUNQQTdaOXNnb1Q5d0dlWkJSMnUyK3lMZ2FWby9TM29jNU1vYy84WXBiY3U1dHN6ckozcTZyMmRnK29XWHNoM3cxd2kzcmR6NTBGbVhMVW00YnpDdHA1dGp1c08xNWg1M0ZlQUZUQnBvQlJvMXVnWFlFZmdscE8vYndlRzZIZzV4dTZWbEM0Q3pNSzFsYzFVY3FWRHUvT3VPdTliTHBzcWxzUTFqUU45WVRPdEVQOHhUOXJ6OVVhdkc5c0MvU0dadTl3N0EwU1ZlYjVyU3RwekhLVDJlYTN2S3p6d2ZwZm5BVU1xMzNKNkR5VW9XaFhJdEYrck9LbW54T21ic3pkS1l4QktQVVYzRzBqcE1xK1h2ZmQvUk9QVHplZ25ZQUhnU2R5bG95OWtaTStyZmhSbVl3WnFuNm55SzNGVGdBRnVISkQxR04vTzNkU24vdExjV2E1ZDUvZXNROTNzZVp2RGdNL2IvQjJBR1AyK0ZlWml5VkFYWHdVTklYcXZzUGpZSWErcDJLdXV5TXgvVDh2RzNFbjg3QWRNQzc1dWkzZS9oWlg3di80bEpoRExLazNPek83QWM4RU1GNjVoTXk1a2lWeUg2K1VPdW9mYnhEdU9SbG14UlliMHBKNnJadG4vR2pFdStEZE9kY1gzTVdJNXRnVi9SY25yeWEreERFR1VsYzZDSExjeWdCd212NG5DYlY4QjAzOURnNitpV0wwSUlVTk5xR0g0UEJxK3pGL0ZTMjNoQkFOL1hzNW56L1VCUHlxU3REVGp1dFFGSnVmTW1pWFBLdkJQZ2RXWUdabUIrMElaVDJXRHdwazZpK2NRWW5RaDNNSGl2WnJibjRCREtLd2dubHZtdWN6MC9MMDRrR1lQQit5ZndtdFVUTS9qN3ZSYXVQMmY3dkJOdFlsVGdVNEE5TUYwRDVnZjRQYjkxdUs3dk1HTUNKQnFQQWh0UmZtSXpTYllGd0t0bC9uWXc3bHQwOXdYYWwvbmJLNTZVeVh4NzgzVUFabUJob2N6N0JnSExKcWd1YklwcEdROUtaL3hzMFdod05TWjFmQ25yVW5yK2tDQk53Z3hvTFdVZlhicEVBTk5xZDRlOWRoMUcrVzdmdS9xOEUyMWlWdWdMTUlNZHR5RzRqRUd1TDNLWFVuNVFxZ1JqRG5BY0pzWGpKQlZINm9QTlVsWUU5bmY0UGUyQWs4djg3VzFxYTlJUHlpZVk4UVhsc25DdGxLQjZjR0lJMzNGTU00R21EdzZuL0VPWHcrMk5USmllTHZQNmJwU2ZaME1ralJiWWdPT2tNbjhmb0VERHZmOWluc1lGTVlQb2VwaFpTMTBaaGVuWEsrSDRDdGdFODRSdWdZb2o5UjdHVEdKV3ltVkFiMGZmYzBJejF3MmZXelcvby93Y0gzMFRVZ2RXc0E4ZGdyWXNibHZFWFpzSy9LYVo4eUhzaVhMdkx2TjZIWENsTGwwaWl5azNiczdyZVpEYXhMakF4MlBTbEI2Tis3ejRmM0M4dmdzd0UyTkpzRzZ6Z2VJSEtncXhKZ00zbC9uYk1wakJzTFhPSjdBeEpqVnNLZU9vTEtOUmF4MWtyNE8xS0pjUmEzNUM2c0N4aERkbnhBbWVsOFdubU5ZTEg0ekFaTjRwNWRlWVZNUWlTZEVXMDhObCtScldNWTNTM2FlOGZxamFMdVlIYmdGd0l5WXoxVDJZN0JrdUhJeEpoZXFxeTlOa1RKUFh2VHJYQWpFVzB6LzZLUldGbEhBcHBsdElyeEovMjhVR0c0ZTI4bnpmQ0hnQzZGam03K2NRM0FTQm0yTXlKclVETHNaTWN0cWExTTJEbWptdjRxNHJwUjhjemJWQldpM1grTnVCSlVyVWg0MHhzN1g3NmdITW1KWGpQZGlXdndBdmx2bmI5VFlJZmxDWE1FbUF5ekRkYXcrMXl6T3RXTWRBU25mUEhLUGlEUzlhUEJXVC9jTkZGcEdEQXRqR1IxQVdLTmZMUFNWKzdDVWN3L0E3NjFSanVSYnEwVnRVMTJXeURqaktCaEhsMXZrcXdiVWFEOENrTTJ6OGZTT0F6YXBjejIvS2JQc3NncHZOUEV4SGxkbS9menBZOXhWbDFuMS9nUHN6SERjWmQ5b0RiMVI0alIwVzhERjZzSm52cnNmMENPaFE1VG83MnlCbUxzbzYxZHJ0SHVicDlvNGtmbG1uL2xCaWUyK24vTHhMNVg1enlwMHJEK2wySkZ5cllxWjVyL1VHOXIwQXRtMHBURjV6QlFpMUw5OWdua2FMQWcwWE56UUxNRSszODVqdWQrVjB0UThoUnJTd3JwOHc4d0VFb1NlbUMweTU3MzRXazZxMFF3czNtc2RTUGgzdll3bW9uM1dZd2MrbDltOWpCK3RmeWQ0SU4xMzN2QUNQdmF0QUE4eVlrbkVlQkJwOWdPOWIySVl2N2MxYXR3cU95UVVWN0pjQ0RRVWFZZG1xbWV2c1RFekwzVG90ckNOakgyQ1VxODhIK0g0aFRxSTZ6SVJUbDFQYmdNWnRiTkRpMGpiQTg4UjdmRXlVNW1LZUpGNUljRjFTcFBKQUk4Zys2VXZnTm10WUYrQUZUTEtBbG93RjNzZGtpNXBqdDJVVlRKckJsaklMelFTMkJONE5xRnhPdGRlMmxrekhQTFgrSDZacGZSN21TZS9xd0U0MFAzSGZyeWlmR2pndWRnYitVK0wxZDRFTkhYM0hrNVJPTFhrWkpoVjdFSUhHbGlWZUgwRHpFMVNXczdVOUo1cjdQYm9taEljSDYyQlNRUGRvNFgyek1WbmNQckxCL0R6TVFOamxiUEJZU2YvM1dmWThDT0tHL2VveTJ6ekwwWGU4aHNuS0ZjWjJ1N0t1RFE1Y0JocWxKa2FkaXJ0Sjk0N0dYVmYzOTZpc1cvOFl6SmlsTDFrNCtkNVM5clBiTlBPNzh5MlFSZGxOSTlQVFhpVG4wYnFuNXNNRDJxNC9veGFKMWl6UDI1c2s4U2ZRQ1BKNDl3cm9tdkJ5Z05zOEVkTlBQK2dIS1dkakJtc0hzUSszSmFSK1BrUHdFOEx0WE9ZN2ZpYVlybWZEY2Y4MDkzU2liZEZvc0pFOWY0Szhwb3pDM1ZqT1VqZnNRZjhHRG8vaGRxL2plSHRIaGxET2h6cmMzajZZY2NSQmJldE91aFh4d3lCTXp1N1dITVJ0QTlxbWZ5aHdxSGo1RkhXVFVxRGhUa2NXcGo5MnVid1ByQnhpK1crTW1mbmU1VDY4UlBtQjdYR3llcG45Rys5NC85cGdVbXFYK3E0Z3NpWUZFV2pVWWVhYmlUclFBTlAxT1lnYnlYcE05cmtlQVc2N0FnMEZHczFkSjA3RTNSamlodVVFeER2YjB2SlU3azJYRVFUVHphbEREY0ZQV3BieHdKSEVQenVhQWcyL0FvMEcyMkJtSjY1MU82ZGh1ak5GTVZsYkIvdGpNOTdCZnR4STlZTnVmWFZUbVgyOElJRHZPcW1aQnlTdXV5Y0hFV2hnejdXdjhLT3ZmaWRNMWtkWE4yVXZBdXVIc04wS05CUm90R1JaekNEd3VUVnUzeVJnUDkyQytLdk9IcUJQcXppb1FjMlkyb1ZnbTlUaXVrekFOT2QzVTNWVm9CR3dOc0JRekhpRWFyZHZOQ2F6VFc4UGprVkhlNTE2a2VxNlZOVmp4akZzbXFCNjJidk1UZXBjKzBQdjJoTE4zQlR2R0pOQUEyQndtZjBZRnRGeFhBbzRIek9wWkxYbjVpK1lGb3doSVc2dkFnMEZHcFZhRGpQTzlLc3F0MnN5Y0JVeG0wdzFxWVBCSzczQjJOZmVLTFRVNy84bllEWEtUMnhWYTdEeEpHWlFYdHBOQlA2RzZkWXlUY1hodlEyQk5RSmMvNzJFTzhCdEJXQUhUSXJZMWV6L2Q4VTg1WitPeVJqM0ZXWXc2a3VZUWNVK1RwUzBKR1l3OTRhWVFZSXJZTHFNdExjM1lEOWpzcmE5aldsVkhadXdldGtmayttbDFQWGxpWUMrYzBmTUJKQk5mV2JMMlpXZEtKMFM4OStPcnBtYllib3ZOZllwOEU3RXY5VWJZUWJCYjRCSnlyQU1Dd2QwVDdPLzBWOENId0wveFNSQkNIdHc3QnE0U3pKUVRwSFd6YjhRNVhZLzd2amVhZmNRSHU2OFpxLzFZVmpOWHEvWHNYVzdMMllzNFZ4YmJoTXhDVDMrYXg4a0tRbE9UQU9PZmV5UFFYT1I1SzBCYmtOblRCN2t0TFpnak1aMFAxQUxob2lJaUlnazBtYVlKMFAxWlc2SWR3and1OXRpbnVhbktjQjRGOU9OVFdNd1JFUkVSQ1FWQmdBWHMvamtlbU1JdnNudUFFeFRjRktEaXhuQUhTU3JUN2lJaUlpSVNGWGFZN3BWdmNqQ1ZvNkhDWDVzUzVhRi9iK1RzbndNSEVjNEEzeEZSRVJFUkdKaldVd0t5NUhBS1NGOFh6dk14SDZ1OHk2SHVYeUhtY1Y3UFZVZkVSRVJFWkdXWlFrdlk5Y0t3RDB4Q2k1K3dPVGozNEpnNWg4UkVSRVJFUkdIQmdIM0EvUHdjMUQzWDRGMVNYZktaQkVSRVJHUjJGb0J1SWpXVFdMa2F2a2NNL1B1VUdCcEhSSVJFUkVSYVVwUG4rT3JEU1p6MCs2WXlhTFdDdWg0VGdNK3dFelk5Qjd3Q2lZYmw0aUlpSWlJQW8wVVdBSXp1K2ZhbUpuT0IyQUdzUGRtOFpTOE16R3pwczZ3Ly8zRkJnOC9BdU13TXdVWGdVK0FMekFadDBSRVJFUkVLdlovQXdEV2I4aDNwTGF0Q3dBQUFBQkpSVTVFcmtKZ2dnPT0iOwpsZXQgZW5qb3lMb2dvUHJvbWlzZVYxNjsKZnVuY3Rpb24gZW5qb3lMb2dvVjE2KCl7cmV0dXJuIGVuam95TG9nb1Byb21pc2VWMTY/Pz1uZXcgUHJvbWlzZSgob2ssbm8pPT57Y29uc3QgaW1hZ2U9bmV3IEltYWdlO2ltYWdlLm9ubG9hZD0oKT0+b2soaW1hZ2UpO2ltYWdlLm9uZXJyb3I9KCk9Pm5vKEVycm9yKCdObyBzZSBwdWRvIGNhcmdhciBlbCBsb2dvIGRlIEVuam95LicpKTtpbWFnZS5zcmM9RU5KT1lfTE9HT19WMTZ9KX0KY2hhcnRQbmdWOD1hc3luYyBmdW5jdGlvbihzdmcsdGl0bGUsbGVnZW5kKXsKIGNvbnN0IGNsb25lPXN2Zy5jbG9uZU5vZGUodHJ1ZSksYm94PXN2Zy52aWV3Qm94LmJhc2VWYWwsd2lkdGg9Ym94LndpZHRofHw2ODAsaGVpZ2h0PWJveC5oZWlnaHR8fDM1MDsKIGNvbnN0IHN0eWxlPWdldENvbXB1dGVkU3R5bGUoc3ZnKSxiZz1zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXBsb3RiZycpLnRyaW0oKXx8JyNmZmYnLGZnPXN0eWxlLmdldFByb3BlcnR5VmFsdWUoJy0tcGxvdHRleHQnKS50cmltKCl8fCcjMjc0NTU5JyxncmlkPXN0eWxlLmdldFByb3BlcnR5VmFsdWUoJy0tcGxvdGdyaWQnKS50cmltKCl8fCcjZGJlNWVkJzsKIGNsb25lLnNldEF0dHJpYnV0ZSgneG1sbnMnLCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycpO2Nsb25lLnNldEF0dHJpYnV0ZSgnd2lkdGgnLHdpZHRoKTtjbG9uZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsaGVpZ2h0KTtjbG9uZS5zZXRBdHRyaWJ1dGUoJ2ZvbnQtZmFtaWx5JywnQXJpYWwsIHNhbnMtc2VyaWYnKTtjbG9uZS5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7CiBjb25zdCBzZXJpYWxpemVkPW5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoY2xvbmUpLnJlcGxhY2UoL3ZhclwoLS1wbG90YmdcKS9nLGJnKS5yZXBsYWNlKC92YXJcKC0tcGxvdHRleHRcKS9nLGZnKS5yZXBsYWNlKC92YXJcKC0tcGxvdGdyaWRcKS9nLGdyaWQpOwogY29uc3QgdXJsPVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3NlcmlhbGl6ZWRdLHt0eXBlOidpbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgnfSkpOwogdHJ5ewogIGNvbnN0IFtpbWFnZSxsb2dvXT1hd2FpdCBQcm9taXNlLmFsbChbbmV3IFByb21pc2UoKG9rLG5vKT0+e2NvbnN0IGltYWdlPW5ldyBJbWFnZTtpbWFnZS5vbmxvYWQ9KCk9Pm9rKGltYWdlKTtpbWFnZS5vbmVycm9yPSgpPT5ubyhFcnJvcignTm8gc2UgcHVkbyBjb252ZXJ0aXIgZWwgZ3LDoWZpY28gYSBpbWFnZW4uJykpO2ltYWdlLnNyYz11cmx9KSxlbmpveUxvZ29WMTYoKV0pOwogIGNvbnN0IHNjYWxlPU1hdGgubWluKDIsODAwMC93aWR0aCksY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO2NhbnZhcy53aWR0aD1NYXRoLmNlaWwod2lkdGgqc2NhbGUpO2NhbnZhcy5oZWlnaHQ9TWF0aC5jZWlsKChoZWlnaHQrMjIwKSpzY2FsZSk7CiAgY29uc3QgY3R4PWNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO2N0eC5zY2FsZShzY2FsZSxzY2FsZSk7Y3R4LmZpbGxTdHlsZT1iZztjdHguZmlsbFJlY3QoMCwwLHdpZHRoLGhlaWdodCsyMjApO2N0eC5maWxsU3R5bGU9Zmc7CiAgY3R4LmZvbnQ9J2JvbGQgMjhweCBBcmlhbCc7Y3R4LmZpbGxUZXh0KHRpdGxlLDI0LDQwLHdpZHRoLTQ4KTtjdHguZm9udD0nMTZweCBBcmlhbCc7Y3R4LmZpbGxUZXh0KGxlZ2VuZC5zbGljZSgwLE1hdGguZmxvb3Iod2lkdGgvOSkpLDI0LDcwLHdpZHRoLTQ4KTtjdHguZHJhd0ltYWdlKGltYWdlLDAsMTAwLHdpZHRoLGhlaWdodCk7CiAgY29uc3QgbG9nb1dpZHRoPU1hdGgubWluKDE1MCx3aWR0aCouMTkpLGxvZ29IZWlnaHQ9bG9nb1dpZHRoKjMyNi83OTQseD13aWR0aC1sb2dvV2lkdGgtMjQseT1oZWlnaHQrMTMyOwogIGN0eC5maWxsU3R5bGU9JyNmZmZmZmYnO2N0eC5maWxsUmVjdCh4LTkseS05LGxvZ29XaWR0aCsxOCxsb2dvSGVpZ2h0KzE4KTtjdHguZHJhd0ltYWdlKGxvZ28seCx5LGxvZ29XaWR0aCxsb2dvSGVpZ2h0KTsKICBjdHguZmlsbFN0eWxlPWZnO2N0eC5mb250PScxMnB4IEFyaWFsJztjdHguZmlsbFRleHQoJ0Vuam95IExvcyDDgW5nZWxlcyDCtyBBbsOhbGlzaXMgZGUgbcOhcXVpbmFzIGRlIGF6YXInLDI0LGhlaWdodCsxNjgsTWF0aC5tYXgoMTAwLHdpZHRoLWxvZ29XaWR0aC04NSkpOwogIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgob2ssbm8pPT5jYW52YXMudG9CbG9iKGJsb2I9PmJsb2I/b2soYmxvYik6bm8oRXJyb3IoJ05vIHNlIHB1ZG8gZ2VuZXJhciBlbCBQTkcuJykpLCdpbWFnZS9wbmcnKSk7CiB9ZmluYWxseXtVUkwucmV2b2tlT2JqZWN0VVJMKHVybCl9Cn07CmRvY3VtZW50LnRpdGxlPSdFbmpveSBMb3Mgw4FuZ2VsZXMgwrcgQW7DoWxpc2lzIGRlIG3DoXF1aW5hcyBkZSBhemFyJzsKCmxldCBkYXNoYm9hcmRSZWFkeVYxNz1mYWxzZTsKbG9naW5TY3JlZW5WMTU9ZnVuY3Rpb24obWVzc2FnZT0nJyl7CiBkYXNoYm9hcmRSZWFkeVYxNz1mYWxzZTtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2xvY2tlZFYxNScpOwogY29uc3QgcGFuZWw9JCgnI2xvZ2luVjE1Jyk7cGFuZWwuaGlkZGVuPWZhbHNlO3BhbmVsLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywnZmxleCcsJ2ltcG9ydGFudCcpOwogJCgnI2xvZ2luTWVzc2FnZVYxNScpLnRleHRDb250ZW50PW1lc3NhZ2U7JCgnI3Bhc3N3b3JkVjE1JykudmFsdWU9Jyc7Cn07CnJvbGVJbnRlcmZhY2VWMTU9ZnVuY3Rpb24oKXsKIGlmKCFhcHBTZXNzaW9uVjE1fHwhZGFzaGJvYXJkUmVhZHlWMTcpcmV0dXJuOwogZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCd2aWV3ZXJWMTUnLGFwcFNlc3Npb25WMTUucm9sZSE9PSdhZG1pbicpOwogJCgnI3Nlc3Npb25OYW1lVjE1JykudGV4dENvbnRlbnQ9YXBwU2Vzc2lvblYxNS51c2VybmFtZSsnIMK3ICcrKGFwcFNlc3Npb25WMTUucm9sZT09PSdhZG1pbic/J0FkbWluaXN0cmFjacOzbic6J0NvbnN1bHRhJyk7CiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2xvY2tlZFYxNScpOwogY29uc3QgbWFpbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtYWluJyksYXNpZGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYXNpZGUnKTtpZihtYWluKXttYWluLmhpZGRlbj1mYWxzZTttYWluLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdkaXNwbGF5Jyl9aWYoYXNpZGUpe2FzaWRlLmhpZGRlbj1mYWxzZTthc2lkZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpfQogY29uc3QgcGFuZWw9JCgnI2xvZ2luVjE1Jyk7cGFuZWwuaGlkZGVuPXRydWU7cGFuZWwuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCdub25lJywnaW1wb3J0YW50Jyk7Cn07Cm9wZW5TZXNzaW9uVjE1PWFzeW5jIGZ1bmN0aW9uKHNlc3Npb24pewogYXBwU2Vzc2lvblYxNT1zZXNzaW9uO2Rhc2hib2FyZFJlYWR5VjE3PWZhbHNlOwogdHJ5e3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ0xBX0FVVEhfU0VTU0lPTicsSlNPTi5zdHJpbmdpZnkoc2Vzc2lvbikpfWNhdGNoKGUpe30KICQoJyNsb2dpblYxNScpLmhpZGRlbj1mYWxzZTskKCcjbG9naW5WMTUnKS5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsJ2ZsZXgnLCdpbXBvcnRhbnQnKTtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2xvY2tlZFYxNScpOwogJCgnI2xvZ2luTWVzc2FnZVYxNScpLnRleHRDb250ZW50PSdBY2Nlc28gdmFsaWRhZG8uIFJlY3VwZXJhbmRvIGxhIG1hdHJpeiBwcml2YWRh4oCmJzsKIHRyeXsKICBjb25zdCBpbmNvbWluZz1hd2FpdCBjYWNoZWQoKTtpZihhcHBTZXNzaW9uVjE1Py50b2tlbiE9PXNlc3Npb24udG9rZW4pcmV0dXJuOwogIGRhdGE9aW5jb21pbmc7c2F2ZWRWaWV3cz1bXTtsb2FkVmlld3MoKTskKCcjbG9naW5NZXNzYWdlVjE1JykudGV4dENvbnRlbnQ9J01hdHJpeiByZWNpYmlkYS4gUHJlcGFyYW5kbyBpbmZvcm1lc+KApic7CiAgYXdhaXQgbmV3IFByb21pc2Uob2s9PnNldFRpbWVvdXQob2ssMjApKTtpZihhcHBTZXNzaW9uVjE1Py50b2tlbiE9PXNlc3Npb24udG9rZW4pcmV0dXJuOwogIGluaXQoKTtpZighJCgnI2NvbnRlbnQnKS5pbm5lckhUTUwudHJpbSgpKXRocm93IEVycm9yKCdObyBzZSBnZW5lcsOzIGVsIGNvbnRlbmlkbyBkZWwgaW5mb3JtZS4nKTsKICBkYXNoYm9hcmRSZWFkeVYxNz10cnVlO3N0YXJ0ZWRTZXNzaW9uVjE1PXRydWU7cm9sZUludGVyZmFjZVYxNSgpOwogIHJwYygnZ2V0Vmlld3MnKS50aGVuKHZhbHVlPT57aWYoYXBwU2Vzc2lvblYxNT8udG9rZW4hPT1zZXNzaW9uLnRva2VuKXJldHVybjtjb25zdCB2aWV3cz1KU09OLnBhcnNlKHZhbHVlKTtpZihBcnJheS5pc0FycmF5KHZpZXdzKSl7c2F2ZWRWaWV3cz12aWV3cztsb2FkVmlld3MoKX19KS5jYXRjaChlcnJvcj0+e2lmKGFwcFNlc3Npb25WMTU/LnRva2VuPT09c2Vzc2lvbi50b2tlbikkKCcjc3RhdHVzJykudGV4dENvbnRlbnQrPScgwrcgTm8gc2UgY2FyZ2Fyb24gbGFzIHZpc3RhcyBndWFyZGFkYXMuJ30pOwogfWNhdGNoKGVycm9yKXsKICBkYXNoYm9hcmRSZWFkeVYxNz1mYWxzZTtkYXRhPW51bGw7JCgnI2NvbnRlbnQnKS5pbm5lckhUTUw9Jyc7dHJ5e3Nlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ0xBX0FVVEhfU0VTU0lPTicpfWNhdGNoKGUpe30KICBhcHBTZXNzaW9uVjE1PW51bGw7bG9naW5TY3JlZW5WMTUoJ05vIHNlIHB1ZG8gYWJyaXIgZWwgZGFzaGJvYXJkOiAnKyhlcnJvci5tZXNzYWdlfHxTdHJpbmcoZXJyb3IpKSsnLiBQdWVkZXMgdm9sdmVyIGEgaW5ncmVzYXIuJyk7dGhyb3cgZXJyb3I7CiB9Cn07CgpmdW5jdGlvbiBzaG93TG9naW5WMTgobWVzc2FnZT0nJyl7CiBkYXNoYm9hcmRSZWFkeVYxNz1mYWxzZTsKIGNvbnN0IHJvb3Q9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hib2FyZFJvb3RWMTgnKSxsb2dpbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9naW5WMTUnKTsKIGlmKHJvb3Qpe3Jvb3QuaGlkZGVuPXRydWU7cm9vdC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsJ25vbmUnLCdpbXBvcnRhbnQnKX0KIGlmKGxvZ2luKXtsb2dpbi5oaWRkZW49ZmFsc2U7bG9naW4uc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCdmbGV4JywnaW1wb3J0YW50Jyl9CiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2xvY2tlZFYxNScpOwogJCgnI2xvZ2luTWVzc2FnZVYxNScpLnRleHRDb250ZW50PW1lc3NhZ2U7JCgnI3Bhc3N3b3JkVjE1JykudmFsdWU9Jyc7Cn0KbG9naW5TY3JlZW5WMTU9c2hvd0xvZ2luVjE4Owpyb2xlSW50ZXJmYWNlVjE1PWZ1bmN0aW9uKCl7CiBpZighYXBwU2Vzc2lvblYxNXx8IWRhc2hib2FyZFJlYWR5VjE3KXJldHVybjsKIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgndmlld2VyVjE1JyxhcHBTZXNzaW9uVjE1LnJvbGUhPT0nYWRtaW4nKTtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2xvY2tlZFYxNScpOwogJCgnI3Nlc3Npb25OYW1lVjE1JykudGV4dENvbnRlbnQ9YXBwU2Vzc2lvblYxNS51c2VybmFtZSsnIMK3ICcrKGFwcFNlc3Npb25WMTUucm9sZT09PSdhZG1pbic/J0FkbWluaXN0cmFjacOzbic6J0NvbnN1bHRhJyk7CiBjb25zdCByb290PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoYm9hcmRSb290VjE4Jyk7cm9vdC5oaWRkZW49ZmFsc2U7cm9vdC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsJ2Jsb2NrJywnaW1wb3J0YW50Jyk7CiBmb3IoY29uc3Qgc2VsZWN0b3Igb2YgWydtYWluJywnYXNpZGUnXSl7Y29uc3QgZWxlbWVudD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtpZihlbGVtZW50KXtlbGVtZW50LmhpZGRlbj1mYWxzZTtlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywnYmxvY2snLCdpbXBvcnRhbnQnKX19CiAkKCcjbG9naW5WMTUnKS5oaWRkZW49dHJ1ZTskKCcjbG9naW5WMTUnKS5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsJ25vbmUnLCdpbXBvcnRhbnQnKTsKfTsKY29uc3Qgc3VibWl0QmVmb3JlVjE4PSQoJyNsb2dpbkZvcm1WMTUnKS5vbnN1Ym1pdDsKbGV0IHN1Ym1pdHRpbmdWMTg9ZmFsc2U7CmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdExvZ2luVjE4KGV2ZW50KXsKIGlmKGV2ZW50KXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2V2ZW50LnN0b3BQcm9wYWdhdGlvbj8uKCl9CiBpZihzdWJtaXR0aW5nVjE4KXJldHVybjtjb25zdCBmb3JtPSQoJyNsb2dpbkZvcm1WMTUnKTtpZihmb3JtLnJlcG9ydFZhbGlkaXR5JiYhZm9ybS5yZXBvcnRWYWxpZGl0eSgpKXJldHVybjsKIHN1Ym1pdHRpbmdWMTg9dHJ1ZTt0cnl7YXdhaXQgc3VibWl0QmVmb3JlVjE4KHtwcmV2ZW50RGVmYXVsdCgpe319KX1jYXRjaChlcnJvcil7c2hvd0xvZ2luVjE4KCdObyBzZSBwdWRvIGluZ3Jlc2FyOiAnKyhlcnJvci5tZXNzYWdlfHxlcnJvcikpfWZpbmFsbHl7c3VibWl0dGluZ1YxOD1mYWxzZX0KfQovLyBBIG5vbi1zdWJtaXQgYnV0dG9uIGNhbm5vdCBuYXZpZ2F0ZS9yZWxvYWQgdGhlIEFwcHMgU2NyaXB0IGlmcmFtZS4KJCgnI2xvZ2luQnV0dG9uVjE1JykudHlwZT0nYnV0dG9uJzskKCcjbG9naW5CdXR0b25WMTUnKS5vbmNsaWNrPXN1Ym1pdExvZ2luVjE4OwokKCcjbG9naW5Gb3JtVjE1Jykub25zdWJtaXQ9ZXZlbnQ9PntldmVudC5wcmV2ZW50RGVmYXVsdCgpO2V2ZW50LnN0b3BQcm9wYWdhdGlvbj8uKCk7c3VibWl0TG9naW5WMTgoZXZlbnQpO3JldHVybiBmYWxzZX07CiQoJyNsb2dpbkZvcm1WMTUnKS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxldmVudD0+e2lmKGV2ZW50LmtleT09PSdFbnRlcicpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7c3VibWl0TG9naW5WMTgoZXZlbnQpfX0pOwp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLGV2ZW50PT57aWYoIWRhc2hib2FyZFJlYWR5VjE3KXNob3dMb2dpblYxOCgnRXJyb3IgZGUgbGEgcMOhZ2luYTogJytldmVudC5tZXNzYWdlKX0pOwp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndW5oYW5kbGVkcmVqZWN0aW9uJyxldmVudD0+e2lmKCFkYXNoYm9hcmRSZWFkeVYxNylzaG93TG9naW5WMTgoJ05vIHNlIGNvbXBsZXTDsyBlbCBpbmdyZXNvOiAnKyhldmVudC5yZWFzb24/Lm1lc3NhZ2V8fFN0cmluZyhldmVudC5yZWFzb24pKSl9KTsKLy8gUmVjb3ZlciBhIHZpc2libHkgZW1wdHkgc2hlbGwgd2l0aG91dCByZXF1ZXN0aW5nIG9yIGV4cG9zaW5nIGFueSBkYXRhLgpzZXRUaW1lb3V0KCgpPT57aWYoIWRhc2hib2FyZFJlYWR5VjE3KXtjb25zdCBwYW5lbD0kKCcjbG9naW5WMTUnKTtwYW5lbC5oaWRkZW49ZmFsc2U7cGFuZWwuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCdmbGV4JywnaW1wb3J0YW50Jyk7aWYoISQoJyNsb2dpbk1lc3NhZ2VWMTUnKS50ZXh0Q29udGVudCkkKCcjbG9naW5NZXNzYWdlVjE1JykudGV4dENvbnRlbnQ9J0luZ3Jlc2EgY29uIHR1IHVzdWFyaW8geSBjb250cmFzZcOxYS4nfX0sMjUwMCk7CgoKZnVuY3Rpb24gY29tcGFyaXNvbkNvbWJpbmVkVjIyKGVudHJpZXMpewogY29uc3Qga2V5cz1bJ2NvaW4nLCd3aW4nXSx2YWx1ZXM9ZW50cmllcy5mbGF0TWFwKGU9PmtleXMubWFwKGs9Pk51bWJlcihlLnRvdGFsW2tdKXx8MCkpOwogY29uc3QgbG89TWF0aC5taW4oMCwuLi52YWx1ZXMpLGhpPU1hdGgubWF4KDAsLi4udmFsdWVzKSxzcGFuPWhpLWxvfHwxLHk9dj0+MjE1LSh2LWxvKS9zcGFuKjE2NSx6ZXJvPXkoMCk7CiBjb25zdCBjb2xvcj17Y29pbjonIzE3MzY1Micsd2luOicjMTM4ZjkzJ307CiByZXR1cm4gYDxkaXYgY2xhc3M9ImNoYXJ0c2Nyb2xsIj48c3ZnIHZpZXdCb3g9IjAgMCA3NjAgMzIwIiByb2xlPSJpbWciIGFyaWEtbGFiZWw9IkNvaW4gSW4geSBXaW46IGNvbXBhcmFjacOzbiBBIHkgQiwgZXNjYWxhIGNvbcO6biBlbiBDTFAiIHN0eWxlPSJoZWlnaHQ6MzIwcHgiPjx0ZXh0IHg9IjI1IiB5PSIyMCIgZm9udC1zaXplPSIxMiIgZmlsbD0idmFyKC0tcGxvdHRleHQsIzQyNWM3MCkiIGZvbnQtZmFtaWx5PSJBcmlhbCI+Q0xQIMK3IEVzY2FsYSBjb23Dum48L3RleHQ+PGxpbmUgeDE9IjM1IiB5MT0iJHt6ZXJvfSIgeDI9IjcyNSIgeTI9IiR7emVyb30iIHN0cm9rZT0iI2E2YmJjOCIvPiR7ZW50cmllcy5tYXAoKGUsaSk9Pntjb25zdCBjZW50ZXI9MjEwK2kqMzQwO3JldHVybiBrZXlzLm1hcCgoa2V5LGopPT57Y29uc3QgeD1jZW50ZXIrKGo/NjI6LTYyKSx2PU51bWJlcihlLnRvdGFsW2tleV0pfHwwO3JldHVybiBgPHJlY3QgeD0iJHt4LTM4fSIgeT0iJHtNYXRoLm1pbih5KHYpLHplcm8pfSIgd2lkdGg9Ijc2IiBoZWlnaHQ9IiR7TWF0aC5hYnMoeSh2KS16ZXJvKX0iIGZpbGw9IiR7Y29sb3Jba2V5XX0iIHJ4PSIzIj48dGl0bGU+JHtlc2MoZS5zY29wZSsnIMK3ICcrZS5uYW1lKycgwrcgJytlLnBlcmlvZCsnIMK3ICcrbWV0cmljc1trZXldKyc6ICcrZm10KHYsa2V5KSl9PC90aXRsZT48L3JlY3Q+PHRleHQgeD0iJHt4fSIgeT0iJHt2Pj0wP3kodiktOTp5KHYpKzE5fSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmaWxsPSJ2YXIoLS1wbG90dGV4dCwjNDI1YzcwKSI+JHtlc2MoY29tcGFjdCh2LGtleSkpfTwvdGV4dD48dGV4dCB4PSIke3h9IiB5PSIyNTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZvbnQtZmFtaWx5PSJBcmlhbCIgZmlsbD0idmFyKC0tcGxvdHRleHQsIzQyNWM3MCkiPiR7ZXNjKG1ldHJpY3Nba2V5XSl9PC90ZXh0PmB9KS5qb2luKCcnKStgPHRleHQgeD0iJHtjZW50ZXJ9IiB5PSIyODIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTYiIGZvbnQtZmFtaWx5PSJBcmlhbCIgZmlsbD0idmFyKC0tcGxvdHRleHQsIzQyNWM3MCkiPlNlbGVjY2nDs24gJHtlLnNjb3BlfTwvdGV4dD5gfSkuam9pbignJyl9PC9zdmc+PC9kaXY+YDsKfQpjb25zdCBjb21wYXJlQmVmb3JlVjIyPWNvbXBhcmVWaWV3Owpjb21wYXJlVmlldz1mdW5jdGlvbigpewogY29tcGFyZUJlZm9yZVYyMigpOwogY29uc3QgZW50cmllcz1bJ0EnLCdCJ10ubWFwKHNjb3BlPT57Y29uc3Qgcz12aWV3U3RhdGVbc2NvcGVdLHJvd3M9c2xpY2VSb3dzKHMuZmlsdGVycyxzLmZyb20scy50byk7cmV0dXJue3Njb3BlLG5hbWU6cy5uYW1lLHBlcmlvZDpzZWxlY3RlZERhdGVUZXh0Vjgoc2NvcGUpLHRvdGFsOmFnZyhyb3dzKSxjb3VudDpyb3dzLmxlbmd0aH19KTsKIGNvbnN0IGh0bWw9YDxkaXYgY2xhc3M9ImNhcmQiIGlkPSJjb21wYXJpc29uQ2hhcnRzVjIyIj48aDI+Q29pbiBJbiB5IFdpbiDCtyBDb21wYXJhY2nDs24gQSB5IEI8L2gyPjxkaXYgY2xhc3M9ImxhYmVsZWRsZWdlbmQiPjxwPkF6dWwgbWFyaW5vOiBDb2luIEluIMK3IFR1cnF1ZXNhOiBXaW48L3A+JHtlbnRyaWVzLm1hcChlPT5gPHA+PGI+JHtlLnNjb3BlfTogJHtlc2MoZS5uYW1lKX08L2I+IMK3ICR7ZXNjKGUucGVyaW9kKX0ke2UuY291bnQ/Jyc6JyDCtyBTaW4gcmVnaXN0cm9zJ308L3A+YCkuam9pbignJyl9PC9kaXY+JHtjb21wYXJpc29uQ29tYmluZWRWMjIoZW50cmllcyl9PHAgY2xhc3M9InNpZ25hbG5vdGUiPlRvdGFsZXMgZW4gQ0xQIGVuIHVuYSBtaXNtYSBlc2NhbGEuIFBhcmEgcGVyw61vZG9zIGRlIGRpc3RpbnRhIGR1cmFjacOzbiwgcmV2aXNhIHRhbWJpw6luIGxvcyBpbmRpY2Fkb3JlcyBkaWFyaW9zIGRlIGxhIHRhYmxhLjwvcD48L2Rpdj5gOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NvbnRlbnQgLmNvbXBhcmlzb25Ob3RlJykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmVuZCcsaHRtbCk7Cn07CgpjYWNoZWQ9YXN5bmMgZnVuY3Rpb24oKXsKICQoJyNzdGF0dXMnKS50ZXh0Q29udGVudD0nUmVjdXBlcmFuZG8gbGEgbWF0cml6IHByaXZhZGHigKYnOwogY29uc3QgcmVzcG9uc2U9YXdhaXQgcnBjKCdnZXRNYXRyaXgnKTsKIGNvbnN0IHJlc3VsdD1jbGVhbk1hdHJpeFY3KHR5cGVvZiByZXNwb25zZT09PSdzdHJpbmcnP0pTT04ucGFyc2UocmVzcG9uc2UpOnJlc3BvbnNlKTsKIGlmKCFyZXN1bHQucm93cz8ubGVuZ3RoKXRocm93IEVycm9yKCdMYSBtYXRyaXogbm8gY29udGllbmUgcmVnaXN0cm9zIGFwbGljYWJsZXMuJyk7cmV0dXJuIHJlc3VsdDsKfTsKLy8gRmlyc3QgaW1wb3J0IHVzZXMgdGhlIHNhbWUgYXV0aGVudGljYXRlZCBSUEMgYW5kIFJMUyBhcyBsYXRlciBhZG1pbiB1cGRhdGVzLgokKCcjbG9naW5Gb3JtVjE1JykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCc8ZGV0YWlscyBzdHlsZT0ibWFyZ2luLXRvcDoxOHB4Ij48c3VtbWFyeT5BZG1pbmlzdHJhY2nDs246IGltcG9ydGFyIGhpc3TDs3JpY28gaW5pY2lhbDwvc3VtbWFyeT48cD5Fc2NyaWJlIHVzdWFyaW8geSBjb250cmFzZcOxYSBkZSBhZG1pbmlzdHJhY2nDs24gYXJyaWJhLCBzZWxlY2Npb25hIGVsIEV4Y2VsIGhpc3TDs3JpY28gY29tcGxldG8geSBwdWxzYSBlc3RlIGJvdMOzbi4gVmVyw6FzIGVsIGF2YW5jZSBwb3IgYmxvcXVlcy48L3A+PGlucHV0IGlkPSJzZWVkTWF0cml4TEEiIHR5cGU9ImZpbGUiIGFjY2VwdD0iLnhsc3gsLmpzb24iPjxidXR0b24gaWQ9InNlZWRJbXBvcnRMQSIgdHlwZT0iYnV0dG9uIj5JbXBvcnRhciBoaXN0w7NyaWNvIGluaWNpYWw8L2J1dHRvbj48L2RldGFpbHM+Jyk7CiQoJyNzZWVkSW1wb3J0TEEnKS5vbmNsaWNrPWFzeW5jIGZ1bmN0aW9uKCl7CiBjb25zdCBtZXNzYWdlPSQoJyNsb2dpbk1lc3NhZ2VWMTUnKSxmaWxlPSQoJyNzZWVkTWF0cml4TEEnKS5maWxlc1swXTsKIGlmKCFmaWxlKXttZXNzYWdlLnRleHRDb250ZW50PSdTZWxlY2Npb25hIGVsIEV4Y2VsIGhpc3TDs3JpY28gY29tcGxldG8gbyBzdSBjb3BpYSBKU09OLic7cmV0dXJufQogdGhpcy5kaXNhYmxlZD10cnVlOwogdHJ5ewogIGlmKCFhcHBTZXNzaW9uVjE1KXsKICAgbWVzc2FnZS50ZXh0Q29udGVudD0nVmFsaWRhbmRvIGFkbWluaXN0cmFjacOzbuKApic7CiAgIGNvbnN0IHBhc3N3b3JkPSQoJyNwYXNzd29yZFYxNScpLnZhbHVlOyQoJyNwYXNzd29yZFYxNScpLnZhbHVlPScnOwogICBhcHBTZXNzaW9uVjE1PWF3YWl0IGRpcmVjdFJwY1YxNSgnbG9naW4nLCQoJyN1c2VybmFtZVYxNScpLnZhbHVlLHBhc3N3b3JkKTsKICB9CiAgaWYoYXBwU2Vzc2lvblYxNS5yb2xlIT09J2FkbWluJyl0aHJvdyBFcnJvcignU29sbyBhZG1pbmlzdHJhY2nDs24gcHVlZGUgaW1wb3J0YXIgZWwgaGlzdMOzcmljby4nKTsKICBtZXNzYWdlLnRleHRDb250ZW50PSdWYWxpZGFuZG8gaGlzdMOzcmljbyBpbmljaWFs4oCmJzsKICBjb25zdCBleGlzdGluZz1hd2FpdCBzdXBhYmFzZVJlcXVlc3RMQSgnL3Jlc3QvdjEvbGFfbWF0cml4P2lkPWVxLjEmc2VsZWN0PXJldmlzaW9uJyx7fSxhcHBTZXNzaW9uVjE1LnRva2VuKTsKICBpZihleGlzdGluZy5sZW5ndGgpdGhyb3cgRXJyb3IoJ1lhIGhheSB1bmEgbWF0cml6LiBBY3R1YWzDrXphbGEgZGVzZGUgZWwgZGFzaGJvYXJkOyBlbCBpbXBvcnRhZG9yIGluaWNpYWwgbm8gcmVlbXBsYXphIGRhdG9zIGV4aXN0ZW50ZXMuJyk7CiAgY29uc3QgaW5jb21pbmc9Y2xlYW5NYXRyaXhWNyhmaWxlLm5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnLmpzb24nKT9KU09OLnBhcnNlKGF3YWl0IGZpbGUudGV4dCgpKTphd2FpdCByZWFkWGxzeChmaWxlKSk7CiAgYXdhaXQgcnBjKCdpbXBvcnRNYXRyaXgnLEpTT04uc3RyaW5naWZ5KGluY29taW5nKSwncmVwbGFjZScsbnVsbCk7CiAgbWVzc2FnZS50ZXh0Q29udGVudD0nSGlzdMOzcmljbyBndWFyZGFkby4gQWJyaWVuZG8gZGFzaGJvYXJk4oCmJzthd2FpdCBvcGVuU2Vzc2lvblYxNShhcHBTZXNzaW9uVjE1KTsKIH1jYXRjaChlcnJvcil7bWVzc2FnZS50ZXh0Q29udGVudD1lcnJvci5tZXNzYWdlfWZpbmFsbHl7dGhpcy5kaXNhYmxlZD1mYWxzZX0KfTsKCi8vIFByZW1pb3MgaXMgY2Fub25pY2FsIGNvbHVtbiBQIChpbmRleCAxNSkuIEl0IGlzIHNlcGFyYXRlIGZyb20gQ29pbiBPdXQgYW5kIFRpY2tldCBPdXQuCmZ1bmN0aW9uIHByaXplV2Vla0tleUxBKHJvdyl7cmV0dXJuIHJvd1swXS5zbGljZSgwLDQpKycgwrcgUycrU3RyaW5nKHdlZWtOdW1iZXJWOChyb3dbMF0pKS5wYWRTdGFydCgyLCcwJyk7fQpmdW5jdGlvbiBwcml6ZVN1bW1hcnlMQShyb3dzKXsKIGNvbnN0IG1hY2hpbmVzPW5ldyBNYXAoKSx3ZWVrcz1uZXcgTWFwKCksZGF0ZXM9bmV3IFNldCgpO2xldCBwYWlkPTAsYWRqdXN0bWVudHM9MCxyZWNvcmRzPTA7CiBmb3IoY29uc3QgciBvZiByb3dzKXsKICBpZihleGNsdWRlZFJlY29yZFY3KHIpKWNvbnRpbnVlOwogIGNvbnN0IGFtb3VudD10eXBlb2YgclsxNV09PT0nbnVtYmVyJyYmTnVtYmVyLmlzRmluaXRlKHJbMTVdKT9yWzE1XTowOwogIGNvbnN0IGtleT1wcml6ZVdlZWtLZXlMQShyKTtpZighd2Vla3MuaGFzKGtleSkpd2Vla3Muc2V0KGtleSx7bmFtZTprZXkscHJpemU6MCxwYWlkOjAsYWRqdXN0bWVudHM6MCxyb3dzOltdfSk7CiAgY29uc3Qgdz13ZWVrcy5nZXQoa2V5KTt3LnByaXplKz1hbW91bnQ7dy5wYWlkKz1NYXRoLm1heCgwLGFtb3VudCk7dy5hZGp1c3RtZW50cys9TWF0aC5taW4oMCxhbW91bnQpO3cucm93cy5wdXNoKHIpO2RhdGVzLmFkZChyWzBdKTsKICBwYWlkKz1NYXRoLm1heCgwLGFtb3VudCk7YWRqdXN0bWVudHMrPU1hdGgubWluKDAsYW1vdW50KTtpZihhbW91bnQ+MClyZWNvcmRzKys7CiAgaWYoIWFtb3VudCljb250aW51ZTsKICBjb25zdCBpZD1TdHJpbmcoclsxXT8/JycpLnRyaW0oKSxtYWNoaW5lS2V5PWlkfHwnX19taXNzaW5nX2lkX18nOwogIGlmKCFtYWNoaW5lcy5oYXMobWFjaGluZUtleSkpbWFjaGluZXMuc2V0KG1hY2hpbmVLZXkse2lkOmlkfHwnU2luIGlkZW50aWZpY2FjacOzbicsaWRlbnRpZmllZDohIWlkLHBhaWQ6MCxhZGp1c3RtZW50czowLG5ldDowLHJlY29yZHM6MCxkYXlzOm5ldyBTZXQoKSxsb2NhdGlvbnM6T2JqZWN0LmZyb21FbnRyaWVzKFsyLDMsNCw1LDcsOCw5XS5tYXAoaz0+W2ssbmV3IFNldCgpXSkpfSk7CiAgY29uc3QgbT1tYWNoaW5lcy5nZXQobWFjaGluZUtleSk7bS5wYWlkKz1NYXRoLm1heCgwLGFtb3VudCk7bS5hZGp1c3RtZW50cys9TWF0aC5taW4oMCxhbW91bnQpO20ubmV0Kz1hbW91bnQ7CiAgaWYoYW1vdW50PjApe20ucmVjb3JkcysrO20uZGF5cy5hZGQoclswXSk7fQogIGZvcihjb25zdCBrIG9mIFsyLDMsNCw1LDcsOCw5XSl7Y29uc3QgdmFsdWU9U3RyaW5nKHJba10/PycnKS50cmltKCk7aWYodmFsdWUpbS5sb2NhdGlvbnNba10uYWRkKHZhbHVlKTt9CiB9CiBjb25zdCBsaXN0PVsuLi5tYWNoaW5lcy52YWx1ZXMoKV0uc29ydCgoYSxiKT0+Yi5wYWlkLWEucGFpZHx8YS5pZC5sb2NhbGVDb21wYXJlKGIuaWQsdW5kZWZpbmVkLHtudW1lcmljOnRydWV9KSk7CiByZXR1cm4ge3BhaWQsYWRqdXN0bWVudHMsbmV0OnBhaWQrYWRqdXN0bWVudHMscmVjb3JkcyxkYXRlczpbLi4uZGF0ZXNdLnNvcnQoKSxtYWNoaW5lczpsaXN0LG1hY2hpbmVDb3VudDpsaXN0LmZpbHRlcihtPT5tLmlkZW50aWZpZWQmJm0ucGFpZD4wKS5sZW5ndGgsd2Vla3M6Wy4uLndlZWtzLnZhbHVlcygpXS5zb3J0KChhLGIpPT5hLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKX07Cn0KZnVuY3Rpb24gcHJpemVTdGF0ZUxBKCl7CiBpZighdmlld1N0YXRlLnByaXplcyl7Y29uc3Qga2V5cz1bLi4ubmV3IFNldChkYXRhLnJvd3MuZmlsdGVyKHI9PiFleGNsdWRlZFJlY29yZFY3KHIpKS5tYXAocHJpemVXZWVrS2V5TEEpKV0uc29ydCgpO3ZpZXdTdGF0ZS5wcml6ZXM9e3dlZWtzOmtleXMubGVuZ3RoP1trZXlzLmF0KC0xKV06W10sbW9udGg6JycsZmlsdGVyczp7fSxzZWFyY2g6Jycsb25seVBhaWQ6dHJ1ZX07fQogcmV0dXJuIHZpZXdTdGF0ZS5wcml6ZXM7Cn0KZnVuY3Rpb24gcHJpemVXZWVrTGFiZWxMQShrZXkscm93cyl7Y29uc3RbeSx3XT1rZXkuc3BsaXQoJyDCtyBTJyk7cmV0dXJuIHdlZWtMYWJlbFY4KHksdyxyb3dzKTt9CmZ1bmN0aW9uIHByaXplUGVyaW9kVGV4dExBKCl7Y29uc3Qgc3RhdGU9cHJpemVTdGF0ZUxBKCk7cmV0dXJuIHN0YXRlLndlZWtzLmxlbmd0aD9zdGF0ZS53ZWVrcy5tYXAoaz0+cHJpemVXZWVrTGFiZWxMQShrLGRhdGEucm93cykpLmpvaW4oJywgJyk6J1NpbiBzZW1hbmFzIHNlbGVjY2lvbmFkYXMnO30KZnVuY3Rpb24gcHJpemVSYW5raW5nTEEobGlzdCl7CiBjb25zdCBlbnRyaWVzPWxpc3QuZmlsdGVyKG09Pm0ucGFpZD4wKS5zbGljZSgwLDEwKTtpZighZW50cmllcy5sZW5ndGgpcmV0dXJuICc8cD5TaW4gcHJlbWlvcyBwb3NpdGl2b3MgZW4gZXN0YSBzZWxlY2Npw7NuLjwvcD4nOwogY29uc3QgbWF4PU1hdGgubWF4KC4uLmVudHJpZXMubWFwKG09Pm0ucGFpZCkpLGhlaWdodD02NStlbnRyaWVzLmxlbmd0aCozOTsKIHJldHVybiBgPGRpdiBjbGFzcz0iY2hhcnRzY3JvbGwiPjxzdmcgdmlld0JveD0iMCAwIDc0MCAke2hlaWdodH0iIHN0eWxlPSJoZWlnaHQ6JHtoZWlnaHR9cHgiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iTcOhcXVpbmFzIGNvbiBtYXlvcmVzIHByZW1pb3MgcGFnYWRvcyI+PHRleHQgeD0iMjAiIHk9IjI0IiBmb250LXNpemU9IjEzIiBmaWxsPSJ2YXIoLS1wbG90dGV4dCkiPlByZW1pb3MgcG9zaXRpdm9zIMK3IENMUCDCtyBUb3AgMTA8L3RleHQ+JHtlbnRyaWVzLm1hcCgobSxpKT0+e2NvbnN0IHk9NTIraSozOTtyZXR1cm4gYDx0ZXh0IHg9IjIwIiB5PSIke3krMTV9IiBmb250LXNpemU9IjEyIiBmaWxsPSJ2YXIoLS1wbG90dGV4dCkiPiR7ZXNjKG0uaWQpfTwvdGV4dD48cmVjdCB4PSIxODAiIHk9IiR7eX0iIHdpZHRoPSIke20ucGFpZC9tYXgqMzUwfSIgaGVpZ2h0PSIyMyIgcng9IjMiIGZpbGw9IiMxMzhmOTMiPjx0aXRsZT5Nw6FxdWluYSAke2VzYyhtLmlkKX06ICR7ZXNjKGZtdChtLnBhaWQsJ3ByaXplJykpfSBDTFA8L3RpdGxlPjwvcmVjdD48dGV4dCB4PSI1NTAiIHk9IiR7eSsxNn0iIGZvbnQtc2l6ZT0iMTIiIGZpbGw9InZhcigtLXBsb3R0ZXh0KSI+JHtlc2MoY29tcGFjdChtLnBhaWQsJ3ByaXplJykpfTwvdGV4dD5gfSkuam9pbignJyl9PC9zdmc+PC9kaXY+YDsKfQpmdW5jdGlvbiBwcml6ZU1hY2hpbmVSb3dzTEEobGlzdCl7CiByZXR1cm4gW1snTcOhcXVpbmEnLCdNYXJjYScsJ1BsYXRhZm9ybWEnLCdNb2RlbG8nLCdCYW5jbycsJ1NlY3RvcicsJ1NhbMOzbicsJ1Bvem8nLCdQcmVtaW9zIHBvc2l0aXZvcyBDTFAnLCdBanVzdGVzIG5lZ2F0aXZvcyBDTFAnLCdQcmVtaW9zIG5ldG9zIENMUCcsJ0TDrWFzIGNvbiBwcmVtaW9zJywnUmVnaXN0cm9zIGNvbiBwcmVtaW9zJ10sLi4ubGlzdC5tYXAobT0+W20uaWQsLi4uWzIsMyw0LDksNSw3LDhdLm1hcChrPT5bLi4ubS5sb2NhdGlvbnNba11dLmpvaW4oJyAvICcpKSxtLnBhaWQsbS5hZGp1c3RtZW50cyxtLm5ldCxtLmRheXMuc2l6ZSxtLnJlY29yZHNdKV07Cn0KbGV0IGN1cnJlbnRQcml6ZVJlcG9ydExBPW51bGw7CmZ1bmN0aW9uIHJlbmRlclByaXplc0xBKCl7CiBjb25zdCBzdGF0ZT1wcml6ZVN0YXRlTEEoKSxhbGw9ZGF0YS5yb3dzLmZpbHRlcihyPT4hZXhjbHVkZWRSZWNvcmRWNyhyKSksbW9udGhzPVsuLi5uZXcgU2V0KGFsbC5tYXAocj0+clswXS5zbGljZSgwLDcpKSldLnNvcnQoKTsKIGNvbnN0IHdlZWtNYXA9bmV3IE1hcCgpO2Zvcihjb25zdCByIG9mIGFsbCl7Y29uc3Qgaz1wcml6ZVdlZWtLZXlMQShyKTtpZighd2Vla01hcC5oYXMoaykpd2Vla01hcC5zZXQoayxbXSk7d2Vla01hcC5nZXQoaykucHVzaChyKTt9CiBjb25zdCBjaG9pY2VzPVsuLi53ZWVrTWFwXS5maWx0ZXIoKFtrLHJvd3NdKT0+IXN0YXRlLm1vbnRofHxyb3dzLnNvbWUocj0+clswXS5zdGFydHNXaXRoKHN0YXRlLm1vbnRoKSkpLnNvcnQoKFthXSxbYl0pPT5hLmxvY2FsZUNvbXBhcmUoYikpOwogY29uc3Qgd2Vla1Jvd3M9YWxsLmZpbHRlcihyPT5zdGF0ZS53ZWVrcy5pbmNsdWRlcyhwcml6ZVdlZWtLZXlMQShyKSkpOwogY29uc3QgZmlsdGVyZWQ9d2Vla1Jvd3MuZmlsdGVyKHI9Pk9iamVjdC5lbnRyaWVzKHN0YXRlLmZpbHRlcnMpLmV2ZXJ5KChbayx2YWx1ZV0pPT4hdmFsdWV8fFN0cmluZyhyW2tdPz8nJyk9PT12YWx1ZSkpOwogY29uc3Qgc3VtbWFyeT1wcml6ZVN1bW1hcnlMQShmaWx0ZXJlZCksc2VhcmNoPXN0YXRlLnNlYXJjaC50cmltKCkudG9Mb2NhbGVMb3dlckNhc2UoJ2VzJyk7CiBjb25zdCB2aXNpYmxlPXN1bW1hcnkubWFjaGluZXMuZmlsdGVyKG09Pighc3RhdGUub25seVBhaWR8fG0ucGFpZD4wKSYmKCFzZWFyY2h8fFttLmlkLC4uLk9iamVjdC52YWx1ZXMobS5sb2NhdGlvbnMpLmZsYXRNYXAocz0+Wy4uLnNdKV0uam9pbignICcpLnRvTG9jYWxlTG93ZXJDYXNlKCdlcycpLmluY2x1ZGVzKHNlYXJjaCkpKTsKIGN1cnJlbnRQcml6ZVJlcG9ydExBPXtzdW1tYXJ5LHZpc2libGUscm93czpmaWx0ZXJlZH07ZXhwb3J0Um93cz1wcml6ZU1hY2hpbmVSb3dzTEEodmlzaWJsZSk7CiBkb2N1bWVudC5ib2R5LmRhdGFzZXQudmlldz0nUHJlbWlvcyBzZW1hbmFsZXMnOyQoJyN0aXRsZScpLnRleHRDb250ZW50PSdQcmVtaW9zIHBhZ2Fkb3MgcG9yIG3DoXF1aW5hJzsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5maWx0ZXJzJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7JCgnI2NvbnRyb2xzJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7JCgnI2ZpbHRlcnMnKS5zdHlsZS5kaXNwbGF5PSdub25lJzsKIGNvbnN0IHBlcmlvZD1wcml6ZVBlcmlvZFRleHRMQSgpLHJhbmdlPXN1bW1hcnkuZGF0ZXMubGVuZ3RoP2Rpc3BsYXlEYXRlc1Y1KHN1bW1hcnkuZGF0ZXNbMF0pKycg4oaSICcrZGlzcGxheURhdGVzVjUoc3VtbWFyeS5kYXRlcy5hdCgtMSkpOidTaW4gcmVnaXN0cm9zJzsKIGNvbnN0IGZpZWxkcz1bMSw5LDUsNywyLDNdOwogJCgnI2NvbnRlbnQnKS5pbm5lckhUTUw9YmFubmVyKCdQcmVtaW9zIHNlbWFuYWxlcyBkZWwgY2FzaW5vJywnQ29uc3VsdGEgbG9zIGltcG9ydGVzIGRlIGxhIGNvbHVtbmEgUHJlbWlvcyB5IGxhcyBtw6FxdWluYXMgcXVlIHJlZ2lzdHJhcm9uIHBhZ29zIGVuIHVuYSBvIHZhcmlhcyBzZW1hbmFzLicpK2A8c2VjdGlvbiBjbGFzcz0iY2FyZCI+PGRpdiBjbGFzcz0iZmlsdGVyZ3JpZCI+PGxhYmVsPk1lcyBwYXJhIGJ1c2NhciBzZW1hbmFzPHNlbGVjdCBpZD0icHJpemVNb250aExBIj48b3B0aW9uIHZhbHVlPSIiPlRvZG9zIGxvcyBtZXNlczwvb3B0aW9uPiR7bW9udGhzLm1hcChtPT5gPG9wdGlvbiB2YWx1ZT0iJHttfSIgJHttPT09c3RhdGUubW9udGg/J3NlbGVjdGVkJzonJ30+JHtlc2MoZGlzcGxheURhdGVzVjUobSkpfTwvb3B0aW9uPmApLmpvaW4oJycpfTwvc2VsZWN0PjwvbGFiZWw+PGRpdj48bGFiZWw+U2VtYW5hczwvbGFiZWw+PGRldGFpbHMgY2xhc3M9ImV4Y2VsRHJvcGRvd25WMTMiPjxzdW1tYXJ5PiR7c3RhdGUud2Vla3MubGVuZ3RofSBzZW1hbmEocykgc2VsZWNjaW9uYWRhKHMpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9ImV4Y2VsTWVudVYxMyIgc3R5bGU9Im1pbi13aWR0aDozMTBweCI+PGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2dhcDo4cHgiPjxidXR0b24gdHlwZT0iYnV0dG9uIiBpZD0icHJpemVBbGxMQSI+U2VsZWNjaW9uYXIgdG9kYXM8L2J1dHRvbj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9InByaXplTm9uZUxBIj5MaW1waWFyPC9idXR0b24+PC9kaXY+PGRpdiBzdHlsZT0ibWF4LWhlaWdodDoyNDBweDtvdmVyZmxvdzphdXRvIj4ke2Nob2ljZXMubWFwKChba2V5LHJvd3NdKT0+e2NvbnN0IGRhdGVzPVsuLi5uZXcgU2V0KHJvd3MubWFwKHI9PnJbMF0pKV0uc29ydCgpO3JldHVybiBgPGxhYmVsIGNsYXNzPSJjaGVja0l0ZW1WMTIiIHN0eWxlPSJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2FsaWduLWl0ZW1zOmNlbnRlciI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBkYXRhLXByaXpld2Vlaz0iJHtrZXl9IiAke3N0YXRlLndlZWtzLmluY2x1ZGVzKGtleSk/J2NoZWNrZWQnOicnfT4ke2VzYyhwcml6ZVdlZWtMYWJlbExBKGtleSxyb3dzKSl9IMK3ICR7ZXNjKGRpc3BsYXlEYXRlc1Y1KGRhdGVzWzBdKSl9IGEgJHtlc2MoZGlzcGxheURhdGVzVjUoZGF0ZXMuYXQoLTEpKSl9PC9sYWJlbD5gfSkuam9pbignJyl9PC9kaXY+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJwcmltYXJ5IiBpZD0icHJpemVBcHBseUxBIj5BcGxpY2FyIHNlbWFuYXM8L2J1dHRvbj48L2Rpdj48L2RldGFpbHM+PC9kaXY+JHtmaWVsZHMubWFwKGs9Pntjb25zdCBvcHRzPVsuLi5uZXcgU2V0KHdlZWtSb3dzLm1hcChyPT5TdHJpbmcocltrXT8/JycpKSldLmZpbHRlcihCb29sZWFuKS5zb3J0KChhLGIpPT5hLmxvY2FsZUNvbXBhcmUoYix1bmRlZmluZWQse251bWVyaWM6dHJ1ZX0pKTtyZXR1cm4gYDxsYWJlbD4ke2RpbXNba119PHNlbGVjdCBkYXRhLXByaXplZmlsdGVyPSIke2t9Ij48b3B0aW9uIHZhbHVlPSIiPlRvZG9zPC9vcHRpb24+JHtvcHRzLm1hcCh2PT5gPG9wdGlvbiB2YWx1ZT0iJHtlc2Modil9IiAke3N0YXRlLmZpbHRlcnNba109PT12PydzZWxlY3RlZCc6Jyd9PiR7ZXNjKHYpfTwvb3B0aW9uPmApLmpvaW4oJycpfTwvc2VsZWN0PjwvbGFiZWw+YH0pLmpvaW4oJycpfTwvZGl2PjxwPlBlcsOtb2RvOiAke2VzYyhwZXJpb2QpfSDCtyBGZWNoYXMgY29uIGRhdG9zOiAke2VzYyhyYW5nZSl9IMK3ICR7c3VtbWFyeS5kYXRlcy5sZW5ndGh9IGTDrWFzIHJlZ2lzdHJhZG9zLjwvcD48cCBjbGFzcz0ic2lnbmFsbm90ZSI+RWwgbWVzIGF5dWRhIGEgYnVzY2FyIHNlbWFuYXMuIENhZGEgc2VtYW5hIGluY2x1eWUgdG9kb3Mgc3VzIGTDrWFzIGRpc3BvbmlibGVzLCBpbmNsdXNvIHNpIGNydXphIGRlIG1lcy4gTG9zIGltcG9ydGVzIGNvcnJlc3BvbmRlbiBhIGxvcyBkYXRvcyBjYXJnYWRvczsgbGEgw7psdGltYSBzZW1hbmEgcHVlZGUgZXN0YXIgaW5jb21wbGV0YS48L3A+PGJ1dHRvbiBpZD0icHJpemVSZXNldExBIj5MaW1waWFyIGZpbHRyb3MgZGUgbcOhcXVpbmFzIHkgdWJpY2FjaW9uZXM8L2J1dHRvbj48L3NlY3Rpb24+PGRpdiBjbGFzcz0ia3BpcyI+JHtbWydQcmVtaW9zIHBhZ2Fkb3MgcG9zaXRpdm9zJyxmbXQoc3VtbWFyeS5wYWlkLCdwcml6ZScpKycgQ0xQJywnU3VtYSBkZSBpbXBvcnRlcyBtYXlvcmVzIHF1ZSBjZXJvJ10sWydNw6FxdWluYXMgcXVlIHBhZ2Fyb24nLGZtdChzdW1tYXJ5Lm1hY2hpbmVDb3VudCksJ03DoXF1aW5hcyBpZGVudGlmaWNhZGFzIGNvbiBwcmVtaW9zIHBvc2l0aXZvcyddLFsnQWp1c3RlcyBuZWdhdGl2b3MnLGZtdChzdW1tYXJ5LmFkanVzdG1lbnRzLCdwcml6ZScpKycgQ0xQJywnUmVnaXN0cm9zIG5lZ2F0aXZvcyBzZXBhcmFkb3MgZGUgbG9zIHBhZ29zJ10sWydQcmVtaW9zIG5ldG9zJyxmbXQoc3VtbWFyeS5uZXQsJ3ByaXplJykrJyBDTFAnLCdQcmVtaW9zIHBvc2l0aXZvcyBtw6FzIGFqdXN0ZXMgbmVnYXRpdm9zJ11dLm1hcCgoW2xhYmVsLHZhbHVlLGhlbHBdKT0+YDxkaXYgY2xhc3M9ImNhcmQga3BpIj48c21hbGw+JHtsYWJlbH08L3NtYWxsPjxzdHJvbmcgc3R5bGU9ImZvbnQtc2l6ZToyNHB4Ij4ke3ZhbHVlfTwvc3Ryb25nPjxzcGFuPiR7aGVscH08L3NwYW4+PC9kaXY+YCkuam9pbignJyl9PC9kaXY+PGRpdiBjbGFzcz0icmVwb3J0Y2hhcnRzIj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+UHJlbWlvcyBuZXRvcyBwb3Igc2VtYW5hPC9oMj4ke3N1bW1hcnkud2Vla3MubGVuZ3RoP2NoYXJ0VjIoW3tuYW1lOidQcmVtaW9zIG5ldG9zJyxwb2ludHM6c3VtbWFyeS53ZWVrc31dLCdwcml6ZScpOic8cD5TZWxlY2Npb25hIGFsIG1lbm9zIHVuYSBzZW1hbmEuPC9wPid9PC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPk3DoXF1aW5hcyBjb24gbWF5b3JlcyBwcmVtaW9zPC9oMj4ke3ByaXplUmFua2luZ0xBKHN1bW1hcnkubWFjaGluZXMpfTwvZGl2PjwvZGl2PjxzZWN0aW9uIGNsYXNzPSJjYXJkIj48aDI+TcOhcXVpbmFzIHkgcHJlbWlvcyDCtyAke3Zpc2libGUubGVuZ3RofSBmaWxhczwvaDI+PGRpdiBjbGFzcz0idmlld2NvbnRyb2xzIj48bGFiZWw+QnVzY2FyIG3DoXF1aW5hLCBiYW5jbyBvIG1hcmNhPGlucHV0IGlkPSJwcml6ZVNlYXJjaExBIiB2YWx1ZT0iJHtlc2Moc3RhdGUuc2VhcmNoKX0iIHBsYWNlaG9sZGVyPSJCdXNjYXIgeSBwdWxzYXIgRW50ZXIiPjwvbGFiZWw+PGxhYmVsIHN0eWxlPSJmbGV4LWRpcmVjdGlvbjpyb3c7YWxpZ24taXRlbXM6Y2VudGVyIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJwcml6ZU9ubHlMQSIgJHtzdGF0ZS5vbmx5UGFpZD8nY2hlY2tlZCc6Jyd9PlNvbG8gbcOhcXVpbmFzIGNvbiBwYWdvcyBwb3NpdGl2b3M8L2xhYmVsPjwvZGl2PjxwPiR7c3VtbWFyeS5yZWNvcmRzfSByZWdpc3Ryb3MgY29uIHByZW1pb3MgcG9zaXRpdm9zLiBTb24gcmVnaXN0cm9zIGRlIGxhIG1hdHJpeiwgbm8gY2FudGlkYWQgZGUgcHJlbWlvcyBpbmRpdmlkdWFsZXMuIExhcyB1YmljYWNpb25lcyBtw7psdGlwbGVzIHNlIG11ZXN0cmFuIHNlcGFyYWRhcyBwb3IgwqsvwrsuPC9wPjxkaXYgY2xhc3M9InRhYmxld3JhcCI+PHRhYmxlPjx0aGVhZD48dHI+JHtleHBvcnRSb3dzWzBdLm1hcChoPT5gPHRoPiR7ZXNjKGgpfTwvdGg+YCkuam9pbignJyl9PC90cj48L3RoZWFkPjx0Ym9keT4ke3Zpc2libGUubWFwKG09PmA8dHI+PHRkPiR7ZXNjKG0uaWQpfTwvdGQ+JHtbMiwzLDQsOSw1LDcsOF0ubWFwKGs9PmA8dGQ+JHtlc2MoWy4uLm0ubG9jYXRpb25zW2tdXS5qb2luKCcgLyAnKXx8J+KAlCcpfTwvdGQ+YCkuam9pbignJyl9PHRkPiR7Zm10KG0ucGFpZCwncHJpemUnKX08L3RkPjx0ZD4ke2ZtdChtLmFkanVzdG1lbnRzLCdwcml6ZScpfTwvdGQ+PHRkPiR7Zm10KG0ubmV0LCdwcml6ZScpfTwvdGQ+PHRkPiR7bS5kYXlzLnNpemV9PC90ZD48dGQ+JHttLnJlY29yZHN9PC90ZD48L3RyPmApLmpvaW4oJycpfHwnPHRyPjx0ZCBjb2xzcGFuPSIxMyI+U2luIG3DoXF1aW5hcyBwYXJhIGVzdGEgc2VsZWNjacOzbi48L3RkPjwvdHI+J308L3Rib2R5PjwvdGFibGU+PC9kaXY+PC9zZWN0aW9uPjxkaXYgY2xhc3M9Im5vdGljZSI+RnVlbnRlOiBjb2x1bW5hIFByZW1pb3MgZGUgTWF0cml6IChQKS4gTm8gc2Ugc3VtYSBUaWNrZXQgT3V0IG5pIENvaW4gT3V0LiBFc3RlIGluZm9ybWUgbm8gaWRlbnRpZmljYSBqYWNrcG90cywgcGFnb3MgbWFudWFsZXMgdSBvdHJhcyBjbGFzZXMgZGUgcHJlbWlvIHNpIGVsIGFyY2hpdm8gbm8gdHJhZSBlc2EgY2xhc2lmaWNhY2nDs24uIEVsIHRvdGFsIGluY2x1eWUgZmlsYXMgc2luIGlkZW50aWZpY2FjacOzbiBkZSBtw6FxdWluYTsgYXBhcmVjZW4gY29tbyDCq1NpbiBpZGVudGlmaWNhY2nDs27CuyB5IG5vIGF1bWVudGFuIGVsIGNvbnRhZG9yIGRlIG3DoXF1aW5hcyBpZGVudGlmaWNhZGFzLjwvZGl2PmA7CiAkKCcjcHJpemVNb250aExBJykub25jaGFuZ2U9ZT0+e3N0YXRlLm1vbnRoPWUudGFyZ2V0LnZhbHVlO3N0YXRlLndlZWtzPVtdO3JlbmRlcigpO307CiAkKCcjcHJpemVBcHBseUxBJykub25jbGljaz0oKT0+e3N0YXRlLndlZWtzPVsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1wcml6ZXdlZWtdOmNoZWNrZWQnKV0ubWFwKGU9PmUuZGF0YXNldC5wcml6ZXdlZWspO3JlbmRlcigpO307CiAkKCcjcHJpemVBbGxMQScpLm9uY2xpY2s9KCk9PmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXByaXpld2Vla10nKS5mb3JFYWNoKGU9PmUuY2hlY2tlZD10cnVlKTsKICQoJyNwcml6ZU5vbmVMQScpLm9uY2xpY2s9KCk9PmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXByaXpld2Vla10nKS5mb3JFYWNoKGU9PmUuY2hlY2tlZD1mYWxzZSk7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1wcml6ZWZpbHRlcl0nKS5mb3JFYWNoKGU9PmUub25jaGFuZ2U9KCk9PntzdGF0ZS5maWx0ZXJzW2UuZGF0YXNldC5wcml6ZWZpbHRlcl09ZS52YWx1ZTtyZW5kZXIoKTt9KTsKICQoJyNwcml6ZVJlc2V0TEEnKS5vbmNsaWNrPSgpPT57c3RhdGUuZmlsdGVycz17fTtzdGF0ZS5zZWFyY2g9Jyc7cmVuZGVyKCk7fTsKICQoJyNwcml6ZVNlYXJjaExBJykub25jaGFuZ2U9ZT0+e3N0YXRlLnNlYXJjaD1lLnRhcmdldC52YWx1ZTtyZW5kZXIoKTt9OwogJCgnI3ByaXplT25seUxBJykub25jaGFuZ2U9ZT0+e3N0YXRlLm9ubHlQYWlkPWUudGFyZ2V0LmNoZWNrZWQ7cmVuZGVyKCk7fTsKIGRlY29yYXRlQ2hhcnRzVjgoKTtmb3JtYXRUZXh0RGF0ZXNWNShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtYWluJykpOwp9CmNvbnN0IHJlbmRlckJlZm9yZVByaXplc0xBPXJlbmRlcjsKcmVuZGVyPWZ1bmN0aW9uKCl7aWYoZGF0YSYmdGFiPT09J1ByZW1pb3Mgc2VtYW5hbGVzJyl7Y2hhcnRQb2ludHNWNC5jbGVhcigpO3JlbmRlclByaXplc0xBKCk7fWVsc2UgcmVuZGVyQmVmb3JlUHJpemVzTEEoKTt9Owpjb25zdCBkYXRlVGV4dEJlZm9yZVByaXplc0xBPXNlbGVjdGVkRGF0ZVRleHRWODsKc2VsZWN0ZWREYXRlVGV4dFY4PWZ1bmN0aW9uKHNjb3BlKXtyZXR1cm4gdGFiPT09J1ByZW1pb3Mgc2VtYW5hbGVzJyYmc2NvcGU9PT0nZ2xvYmFsJz9wcml6ZVBlcmlvZFRleHRMQSgpOmRhdGVUZXh0QmVmb3JlUHJpemVzTEEoc2NvcGUpO307CmNvbnN0IHByaXplVGFiQnV0dG9uTEE9JzxidXR0b24gZGF0YS10YWI9IlByZW1pb3Mgc2VtYW5hbGVzIj7imaIgJm5ic3A7IFByZW1pb3Mgc2VtYW5hbGVzPC9idXR0b24+JzsKZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbmF2IGJ1dHRvbltkYXRhLXRhYj0iTWV0b2RvbG9nw61hIl0nKS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWJlZ2luJyxwcml6ZVRhYkJ1dHRvbkxBKTsKZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbmF2IGJ1dHRvbltkYXRhLXRhYj0iUHJlbWlvcyBzZW1hbmFsZXMiXScpLm9uY2xpY2s9KCk9PmFjdGl2YXRlVGFiVjMoJ1ByZW1pb3Mgc2VtYW5hbGVzJyk7CmNvbnN0IGV4cG9ydEJlZm9yZVByaXplc0xBPSQoJyN2MmV4cG9ydCcpLm9uY2xpY2s7CiQoJyN2MmV4cG9ydCcpLm9uY2xpY2s9ZnVuY3Rpb24oKXsKIGlmKHRhYiE9PSdQcmVtaW9zIHNlbWFuYWxlcycpcmV0dXJuIGV4cG9ydEJlZm9yZVByaXplc0xBKCk7CiBjb25zdCByZXBvcnQ9Y3VycmVudFByaXplUmVwb3J0TEE7aWYoIXJlcG9ydClyZXR1cm47CiBjb25zdCB3ZWVrcz1bWydTZW1hbmEnLCdQcmVtaW9zIHBvc2l0aXZvcyBDTFAnLCdBanVzdGVzIG5lZ2F0aXZvcyBDTFAnLCdQcmVtaW9zIG5ldG9zIENMUCddLC4uLnJlcG9ydC5zdW1tYXJ5LndlZWtzLm1hcCh3PT5bcHJpemVXZWVrTGFiZWxMQSh3Lm5hbWUsdy5yb3dzKSx3LnBhaWQsdy5hZGp1c3RtZW50cyx3LnByaXplXSldOwogY29uc3QgZGV0YWlsPVtbJ0ZlY2hhJywnU2VtYW5hJywnTcOhcXVpbmEnLCdNYXJjYScsJ0JhbmNvJywnU2VjdG9yJywnU2Fsw7NuJywnUHJlbWlvcyBDTFAnXSwuLi5yZXBvcnQucm93cy5maWx0ZXIocj0+dHlwZW9mIHJbMTVdPT09J251bWJlcicmJnJbMTVdIT09MCkubWFwKHI9PltkaXNwbGF5RGF0ZXNWNShyWzBdKSxwcml6ZVdlZWtMYWJlbExBKHByaXplV2Vla0tleUxBKHIpLFtyXSksclsxXT8/J1NpbiBpZGVudGlmaWNhY2nDs24nLHJbMl0/PycnLHJbOV0/PycnLHJbNV0/PycnLHJbN10/PycnLHJbMTVdXSldOwogY29uc3QgY29uc3VsdGF0aW9uPVtbJ1BhcsOhbWV0cm8nLCdWYWxvciddLFsnSW5mb3JtZScsJ1ByZW1pb3Mgc2VtYW5hbGVzJ10sWydTZW1hbmFzJyxwcml6ZVBlcmlvZFRleHRMQSgpXSxbJ0ZpbHRyb3MnLEpTT04uc3RyaW5naWZ5KHByaXplU3RhdGVMQSgpLmZpbHRlcnMpXSxbJ0Z1ZW50ZScsJ1ByZW1pb3MgZGUgTWF0cml6LCBjb2x1bW5hIFAuIE5vIGVxdWl2YWxlIGEgY2FudGlkYWQgZGUgcHJlbWlvcyBpbmRpdmlkdWFsZXMuJ10sWydQcmVtaW9zIHBvc2l0aXZvcyBDTFAnLHJlcG9ydC5zdW1tYXJ5LnBhaWRdLFsnQWp1c3RlcyBuZWdhdGl2b3MgQ0xQJyxyZXBvcnQuc3VtbWFyeS5hZGp1c3RtZW50c10sWydQcmVtaW9zIG5ldG9zIENMUCcscmVwb3J0LnN1bW1hcnkubmV0XSxbJ0LDunNxdWVkYSBkZWwgZGV0YWxsZScscHJpemVTdGF0ZUxBKCkuc2VhcmNoXSxbJ1NvbG8gbcOhcXVpbmFzIGNvbiBwYWdvcyBwb3NpdGl2b3MnLHByaXplU3RhdGVMQSgpLm9ubHlQYWlkPydTw60nOidObyddXTsKIGRvd25sb2FkQmxvYlY4KHdvcmtib29rQmxvYlY4KFt7bmFtZTonTWFxdWluYXMnLHJvd3M6cHJpemVNYWNoaW5lUm93c0xBKHJlcG9ydC52aXNpYmxlKX0se25hbWU6J1NlbWFuYXMnLHJvd3M6d2Vla3N9LHtuYW1lOidEZXRhbGxlIGRpYXJpbycscm93czpkZXRhaWx9LHtuYW1lOidDb25zdWx0YScscm93czpjb25zdWx0YXRpb259XSksJ0xBLVByZW1pb3Mtc2VtYW5hbGVzLnhsc3gnKTsKfTsKCi8vIEhpZGUgY29udHJvbHMsIHJldGFpbiBzZXR0aW5ncyBhbmQgZGF0YS4gU2F2ZWQgUG96byBmaWx0ZXJzIG11c3Qgbm90IHJlbWFpbiBhY3RpdmUgaW52aXNpYmx5LgpmdW5jdGlvbiBjbGVhclBvem9GaWx0ZXJzTEEoKXsKIGZvcihjb25zdCBzdGF0ZSBvZiBPYmplY3QudmFsdWVzKHZpZXdTdGF0ZSkpe2lmKHN0YXRlJiZ0eXBlb2Ygc3RhdGU9PT0nb2JqZWN0JyYmc3RhdGUuZmlsdGVycylkZWxldGUgc3RhdGUuZmlsdGVyc1snOCddO30KIGNvbnN0IGxlZ2FjeT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZjgnKTtpZihsZWdhY3kpZm9yKGNvbnN0IG9wdGlvbiBvZiBsZWdhY3kub3B0aW9ucylvcHRpb24uc2VsZWN0ZWQ9ZmFsc2U7Cn0KY29uc3QgZmlsdGVyRmllbGRzQmVmb3JlQ29tcGFjdExBPWZpbHRlckZpZWxkczsKZmlsdGVyRmllbGRzPWZ1bmN0aW9uKHN0YXRlLHByZWZpeCxrZXlzPU9iamVjdC5rZXlzKGRpbXMpKXtyZXR1cm4gZmlsdGVyRmllbGRzQmVmb3JlQ29tcGFjdExBKHN0YXRlLHByZWZpeCxrZXlzLmZpbHRlcihrPT5OdW1iZXIoaykhPT04KSk7fTsKZnVuY3Rpb24gZm9sZENvbnRyb2xMQShub2RlLGtleSx0ZXh0KXsKIGlmKCFub2RlKXJldHVybiBudWxsOwogdmlld1N0YXRlLmNvbXBhY3RQYW5lbHM/Pz17fTsKIGxldCBmb2xkPW5vZGUucGFyZW50RWxlbWVudD8uZGF0YXNldD8uZm9sZEtleT09PWtleT9ub2RlLnBhcmVudEVsZW1lbnQ6bnVsbDsKIGlmKCFmb2xkKXsKICBmb2xkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtmb2xkLmNsYXNzTmFtZT0nY29tcGFjdEZvbGRMQSc7Zm9sZC5kYXRhc2V0LmZvbGRLZXk9a2V5OwogIGNvbnN0IHN1bW1hcnk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO2ZvbGQuYXBwZW5kQ2hpbGQoc3VtbWFyeSk7CiAgbm9kZS5iZWZvcmUoZm9sZCk7Zm9sZC5hcHBlbmRDaGlsZChub2RlKTtmb2xkLm9wZW49ISF2aWV3U3RhdGUuY29tcGFjdFBhbmVsc1trZXldOwogIGZvbGQuYWRkRXZlbnRMaXN0ZW5lcigndG9nZ2xlJywoKT0+e3ZpZXdTdGF0ZS5jb21wYWN0UGFuZWxzPz89e307dmlld1N0YXRlLmNvbXBhY3RQYW5lbHNba2V5XT1mb2xkLm9wZW47fSk7CiB9CiBjb25zdCBzdW1tYXJ5PWZvbGQucXVlcnlTZWxlY3Rvcignc3VtbWFyeScpO3N1bW1hcnkudGV4dENvbnRlbnQ9dGV4dDtzdW1tYXJ5LnRpdGxlPXRleHQ7cmV0dXJuIGZvbGQ7Cn0KZnVuY3Rpb24gY29tcGFjdENvbnRyb2xzTEEoKXsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWZpbHRlcj0iOCJdLFtkYXRhLXByaXplZmlsdGVyPSI4Il0sI2Y4JykuZm9yRWFjaChlbD0+ZWwuY2xvc2VzdCgnbGFiZWwnKT8ucmVtb3ZlKCkpOwogY29uc3QgZ2xvYmFsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5maWx0ZXJzJyk7CiBpZihnbG9iYWwpewogIGNvbnN0IHZpc2libGU9Z2xvYmFsLnN0eWxlLmRpc3BsYXkhPT0nbm9uZScmJiFbJ0NvbXBhcmF0aXZvcycsJ01ldG9kb2xvZ8OtYScsJ1ByZW1pb3Mgc2VtYW5hbGVzJ10uaW5jbHVkZXModGFiKTsKICBjb25zdCBmb2xkPWZvbGRDb250cm9sTEEoZ2xvYmFsLCdkYXRlcy1nbG9iYWwnLCdGZWNoYXMgwrcgJytzZWxlY3RlZERhdGVUZXh0VjgoJ2dsb2JhbCcpKycgwrcgYWJyaXIgcGFyYSBjYW1iaWFyJyk7CiAgZm9sZC5zdHlsZS5kaXNwbGF5PXZpc2libGU/J2Jsb2NrJzonbm9uZSc7CiB9CiBpZih0YWI9PT0nUmF0aW9zJyl7CiAgY29uc3QgbGltaXRzPXJhdGlvTGltaXRzVjYoKTtmb2xkQ29udHJvbExBKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50cmFmZmljU2V0dGluZ3MnKSwncmF0aW8tc2V0dGluZ3MnLCdDb25maWd1cmFyIHNlbcOhZm9ybyBkZSByYXRpb3MgwrcgUm9qbyA8ICcrbGltaXRzLnJlZCsnw5cgwrcgVmVyZGUg4omlICcrbGltaXRzLmdyZWVuKyfDlycpOwogfQogaWYodGFiPT09J0NvbXBhcmF0aXZvcycpZm9yKGNvbnN0IHNjb3BlIG9mIFsnQScsJ0InXSl7CiAgY29uc3QgcGFuZWw9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNpZGUnK3Njb3BlKTtpZighcGFuZWwpY29udGludWU7CiAgY29uc3QgZGF0ZXM9cGFuZWwucXVlcnlTZWxlY3RvcignLmNvbXBhcmVEYXRlcycpLGNhbGVuZGFyPXBhbmVsLnF1ZXJ5U2VsZWN0b3IoJy5jYWxlbmRhclBhbmVsJyk7CiAgY29uc3QgZm9sZD1mb2xkQ29udHJvbExBKGRhdGVzLCdkYXRlcy0nK3Njb3BlLCdGZWNoYXMgJytzY29wZSsnIMK3ICcrc2VsZWN0ZWREYXRlVGV4dFY4KHNjb3BlKSk7aWYoY2FsZW5kYXIpZm9sZC5hcHBlbmRDaGlsZChjYWxlbmRhcik7CiB9CiBpZih0YWI9PT0nUHJlbWlvcyBzZW1hbmFsZXMnKWZvbGRDb250cm9sTEEoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NvbnRlbnQgc2VjdGlvbi5jYXJkJyksJ3ByaXplLWZpbHRlcnMnLCdGaWx0cmFyIHNlbWFuYXMgeSBtw6FxdWluYXMgwrcgJytwcml6ZVBlcmlvZFRleHRMQSgpKTsKfQpjb25zdCByZW5kZXJCZWZvcmVDb21wYWN0TEE9cmVuZGVyOwpyZW5kZXI9ZnVuY3Rpb24oKXtjbGVhclBvem9GaWx0ZXJzTEEoKTtyZW5kZXJCZWZvcmVDb21wYWN0TEEoKTtpZihkYXRhKWNvbXBhY3RDb250cm9sc0xBKCk7fTsKCmNvbnN0IG1vbnRoc1NwYW5pc2hMQT1bJ0VuZXJvJywnRmVicmVybycsJ01hcnpvJywnQWJyaWwnLCdNYXlvJywnSnVuaW8nLCdKdWxpbycsJ0Fnb3N0bycsJ1NlcHRpZW1icmUnLCdPY3R1YnJlJywnTm92aWVtYnJlJywnRGljaWVtYnJlJ107CmZ1bmN0aW9uIGRhdGVQYXJ0c1NwYW5pc2hMQSh2YWx1ZSl7CiBjb25zdCBtYXRjaD0vXihcZHs0fSktKFxkezJ9KS0oXGR7Mn0pJC8uZXhlYyh2YWx1ZXx8JycpO2lmKCFtYXRjaClyZXR1cm4gbnVsbDsKIGNvbnN0IHllYXI9TnVtYmVyKG1hdGNoWzFdKSxtb250aD1OdW1iZXIobWF0Y2hbMl0pLTEsZGF5PU51bWJlcihtYXRjaFszXSksZGF0ZT1uZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLG1vbnRoLGRheSkpOwogcmV0dXJuIGRhdGUuZ2V0VVRDRnVsbFllYXIoKT09PXllYXImJmRhdGUuZ2V0VVRDTW9udGgoKT09PW1vbnRoJiZkYXRlLmdldFVUQ0RhdGUoKT09PWRheT97eWVhcixtb250aCxkYXl9Om51bGw7Cn0KZnVuY3Rpb24gZGF0ZUlzb1NwYW5pc2hMQSh5ZWFyLG1vbnRoLGRheSl7cmV0dXJuIFN0cmluZyh5ZWFyKS5wYWRTdGFydCg0LCcwJykrJy0nK1N0cmluZyhtb250aCsxKS5wYWRTdGFydCgyLCcwJykrJy0nK1N0cmluZyhkYXkpLnBhZFN0YXJ0KDIsJzAnKTt9CmZ1bmN0aW9uIGRhdGVMYWJlbFNwYW5pc2hMQSh2YWx1ZSl7Y29uc3QgZD1kYXRlUGFydHNTcGFuaXNoTEEodmFsdWUpO3JldHVybiBkP1N0cmluZyhkLmRheSkucGFkU3RhcnQoMiwnMCcpKycgJyttb250aHNTcGFuaXNoTEFbZC5tb250aF0udG9Mb3dlckNhc2UoKSsnICcrZC55ZWFyOidTZWxlY2Npb25hciBmZWNoYSc7fQpmdW5jdGlvbiBkYXRlR3JpZFNwYW5pc2hMQSh5ZWFyLG1vbnRoKXsKIGNvbnN0IG9mZnNldD0obmV3IERhdGUoRGF0ZS5VVEMoeWVhcixtb250aCwxKSkuZ2V0VVRDRGF5KCkrNiklNyxkYXlzPW5ldyBEYXRlKERhdGUuVVRDKHllYXIsbW9udGgrMSwwKSkuZ2V0VVRDRGF0ZSgpOwogcmV0dXJuIFsuLi5BcnJheShvZmZzZXQpLmZpbGwobnVsbCksLi4uQXJyYXkuZnJvbSh7bGVuZ3RoOmRheXN9LChfLGkpPT5kYXRlSXNvU3BhbmlzaExBKHllYXIsbW9udGgsaSsxKSldOwp9CmxldCBzcGFuaXNoQ2FsZW5kYXJMQT1udWxsLHNwYW5pc2hDYWxlbmRhckNvdW50ZXJMQT0wOwpmdW5jdGlvbiBjbG9zZVNwYW5pc2hDYWxlbmRhckxBKGZvY3VzPXRydWUpewogaWYoIXNwYW5pc2hDYWxlbmRhckxBKXJldHVybjtjb25zdCB7cG9wdXAsdHJpZ2dlcn09c3BhbmlzaENhbGVuZGFyTEE7c3BhbmlzaENhbGVuZGFyTEE9bnVsbDtwb3B1cC5yZW1vdmUoKTt0cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsJ2ZhbHNlJyk7aWYoZm9jdXMmJnRyaWdnZXIuaXNDb25uZWN0ZWQpdHJpZ2dlci5mb2N1cygpOwp9CmZ1bmN0aW9uIHNob3dTcGFuaXNoQ2FsZW5kYXJMQShpbnB1dCx0cmlnZ2VyKXsKIGNsb3NlU3BhbmlzaENhbGVuZGFyTEEoZmFsc2UpO2NvbnN0IG5vdz1uZXcgRGF0ZSgpLGluaXRpYWw9ZGF0ZVBhcnRzU3BhbmlzaExBKGlucHV0LnZhbHVlKXx8e3llYXI6bm93LmdldEZ1bGxZZWFyKCksbW9udGg6bm93LmdldE1vbnRoKCl9OwogY29uc3QgcG9wdXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7cG9wdXAuY2xhc3NOYW1lPSdzcGFuaXNoQ2FsZW5kYXJMQSc7cG9wdXAubGFuZz0nZXMtQ0wnO3BvcHVwLnNldEF0dHJpYnV0ZSgncm9sZScsJ2RpYWxvZycpO3BvcHVwLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsJ1NlbGVjY2lvbmFyIGZlY2hhJyk7cG9wdXAuaWQ9J3NwYW5pc2gtY2FsZW5kYXItbGEnOwogZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwb3B1cCk7c3BhbmlzaENhbGVuZGFyTEE9e3BvcHVwLGlucHV0LHRyaWdnZXIseWVhcjppbml0aWFsLnllYXIsbW9udGg6aW5pdGlhbC5tb250aH07dHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCd0cnVlJyk7CiBmdW5jdGlvbiBzZWxlY3QodmFsdWUpewogIGlucHV0LnZhbHVlPXZhbHVlO3RyaWdnZXIudGV4dENvbnRlbnQ9ZGF0ZUxhYmVsU3BhbmlzaExBKHZhbHVlKTtjbG9zZVNwYW5pc2hDYWxlbmRhckxBKCk7CiAgaW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0Jyx7YnViYmxlczp0cnVlfSkpO2lucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnLHtidWJibGVzOnRydWV9KSk7CiB9CiBmdW5jdGlvbiBwYWludCgpewogIGNvbnN0IHN0YXRlPXNwYW5pc2hDYWxlbmRhckxBO2lmKCFzdGF0ZSlyZXR1cm47Y29uc3Qge3llYXIsbW9udGh9PXN0YXRlOwogIGNvbnN0IHNlbGVjdGVkPWlucHV0LnZhbHVlLHRvZGF5PWRhdGVJc29TcGFuaXNoTEEobm93LmdldEZ1bGxZZWFyKCksbm93LmdldE1vbnRoKCksbm93LmdldERhdGUoKSk7CiAgY29uc3QgbWluWWVhcj1NYXRoLm1pbigxOTAwLHllYXIpLG1heFllYXI9TWF0aC5tYXgoMjEwMCx5ZWFyKTsKICBwb3B1cC5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InNwYW5pc2hDYWxIZWFkaW5nTEEiPjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLWNhbHByZXYgYXJpYS1sYWJlbD0iTWVzIGFudGVyaW9yIj7igLk8L2J1dHRvbj48c2VsZWN0IGRhdGEtY2FsbW9udGgtZXMgYXJpYS1sYWJlbD0iTWVzIj4ke21vbnRoc1NwYW5pc2hMQS5tYXAoKG5hbWUsaSk9PmA8b3B0aW9uIHZhbHVlPSIke2l9IiAke2k9PT1tb250aD8nc2VsZWN0ZWQnOicnfT4ke25hbWV9PC9vcHRpb24+YCkuam9pbignJyl9PC9zZWxlY3Q+PHNlbGVjdCBkYXRhLWNhbHllYXItZXMgYXJpYS1sYWJlbD0iQcOxbyI+JHtBcnJheS5mcm9tKHtsZW5ndGg6bWF4WWVhci1taW5ZZWFyKzF9LChfLGkpPT5taW5ZZWFyK2kpLm1hcCh5PT5gPG9wdGlvbiAke3k9PT15ZWFyPydzZWxlY3RlZCc6Jyd9PiR7eX08L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1jYWxuZXh0IGFyaWEtbGFiZWw9Ik1lcyBzaWd1aWVudGUiPuKAujwvYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9InNwYW5pc2hDYWxEYXlzTEEiPiR7WydMdW4nLCdNYXInLCdNacOpJywnSnVlJywnVmllJywnU8OhYicsJ0RvbSddLm1hcChkPT5gPHNwYW4+JHtkfTwvc3Bhbj5gKS5qb2luKCcnKX0ke2RhdGVHcmlkU3BhbmlzaExBKHllYXIsbW9udGgpLm1hcChpc289Pmlzbz9gPGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtY2FsZGF5LWVzPSIke2lzb30iICR7aW5wdXQubWluJiZpc288aW5wdXQubWlufHxpbnB1dC5tYXgmJmlzbz5pbnB1dC5tYXg/J2Rpc2FibGVkJzonJ30gJHtpc289PT1zZWxlY3RlZD8nYXJpYS1jdXJyZW50PSJkYXRlIic6Jyd9IHRpdGxlPSIke2RhdGVMYWJlbFNwYW5pc2hMQShpc28pfSIgY2xhc3M9IiR7aXNvPT09c2VsZWN0ZWQ/J3NlbGVjdGVkICc6Jyd9JHtpc289PT10b2RheT8ndG9kYXknOicnfSI+JHtOdW1iZXIoaXNvLnNsaWNlKC0yKSl9PC9idXR0b24+YDonPHNwYW4+PC9zcGFuPicpLmpvaW4oJycpfTwvZGl2PjxkaXYgY2xhc3M9InNwYW5pc2hDYWxBY3Rpb25zTEEiPjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLWNhbHRvZGF5LWVzPkhveTwvYnV0dG9uPjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLWNhbGNsZWFyLWVzPkxpbXBpYXI8L2J1dHRvbj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1jYWxjbG9zZS1lcz5DZXJyYXI8L2J1dHRvbj48L2Rpdj5gOwogIHBvcHVwLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNhbHByZXZdJykub25jbGljaz0oKT0+e3N0YXRlLm1vbnRoLS07aWYoc3RhdGUubW9udGg8MCl7c3RhdGUubW9udGg9MTE7c3RhdGUueWVhci0tO31wYWludCgpO307CiAgcG9wdXAucXVlcnlTZWxlY3RvcignW2RhdGEtY2FsbmV4dF0nKS5vbmNsaWNrPSgpPT57c3RhdGUubW9udGgrKztpZihzdGF0ZS5tb250aD4xMSl7c3RhdGUubW9udGg9MDtzdGF0ZS55ZWFyKys7fXBhaW50KCk7fTsKICBwb3B1cC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jYWxtb250aC1lc10nKS5vbmNoYW5nZT1lPT57c3RhdGUubW9udGg9TnVtYmVyKGUudGFyZ2V0LnZhbHVlKTtwYWludCgpO307CiAgcG9wdXAucXVlcnlTZWxlY3RvcignW2RhdGEtY2FseWVhci1lc10nKS5vbmNoYW5nZT1lPT57c3RhdGUueWVhcj1OdW1iZXIoZS50YXJnZXQudmFsdWUpO3BhaW50KCk7fTsKICBwb3B1cC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jYWxkYXktZXNdJykuZm9yRWFjaChidXR0b249PmJ1dHRvbi5vbmNsaWNrPSgpPT5zZWxlY3QoYnV0dG9uLmRhdGFzZXQuY2FsZGF5RXMpKTsKICBwb3B1cC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jYWx0b2RheS1lc10nKS5vbmNsaWNrPSgpPT57aWYoaW5wdXQubWluJiZ0b2RheTxpbnB1dC5taW58fGlucHV0Lm1heCYmdG9kYXk+aW5wdXQubWF4KXJldHVybjtzZWxlY3QodG9kYXkpO307CiAgcG9wdXAucXVlcnlTZWxlY3RvcignW2RhdGEtY2FsY2xlYXItZXNdJykub25jbGljaz0oKT0+c2VsZWN0KCcnKTtwb3B1cC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jYWxjbG9zZS1lc10nKS5vbmNsaWNrPSgpPT5jbG9zZVNwYW5pc2hDYWxlbmRhckxBKCk7CiAgY29uc3QgcmVjdD10cmlnZ2VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3BvcHVwLnN0eWxlLmxlZnQ9TWF0aC5tYXgoOCxNYXRoLm1pbihyZWN0LmxlZnQsd2luZG93LmlubmVyV2lkdGgtMzI4KSkrJ3B4Jztwb3B1cC5zdHlsZS50b3A9TWF0aC5tYXgoOCxNYXRoLm1pbihyZWN0LmJvdHRvbSs2LHdpbmRvdy5pbm5lckhlaWdodC1wb3B1cC5vZmZzZXRIZWlnaHQtOCkpKydweCc7CiB9CiBwYWludCgpOyhwb3B1cC5xdWVyeVNlbGVjdG9yKCdbYXJpYS1jdXJyZW50PSJkYXRlIl0nKXx8cG9wdXAucXVlcnlTZWxlY3RvcignW2RhdGEtY2FsZGF5LWVzXTpub3QoOmRpc2FibGVkKScpKT8uZm9jdXMoKTsKfQpmdW5jdGlvbiBkZWNvcmF0ZVNwYW5pc2hEYXRlc0xBKCl7CiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubGFuZz0nZXMtQ0wnOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT0iZGF0ZSJdJykuZm9yRWFjaChpbnB1dD0+ewogIGlucHV0Lmxhbmc9J2VzLUNMJztsZXQgdHJpZ2dlcj1pbnB1dC5fc3BhbmlzaFRyaWdnZXJMQTsKICBpZighdHJpZ2dlcnx8IXRyaWdnZXIuaXNDb25uZWN0ZWQpewogICB0cmlnZ2VyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO3RyaWdnZXIudHlwZT0nYnV0dG9uJzt0cmlnZ2VyLmNsYXNzTmFtZT0nc3BhbmlzaERhdGVUcmlnZ2VyTEEnO3RyaWdnZXIuc2V0QXR0cmlidXRlKCdhcmlhLWhhc3BvcHVwJywnZGlhbG9nJyk7dHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCdmYWxzZScpOwogICB0cmlnZ2VyLmlkPSdkYXRlLXRyaWdnZXItbGEtJysoKytzcGFuaXNoQ2FsZW5kYXJDb3VudGVyTEEpO3RyaWdnZXIuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywoaW5wdXQuY2xvc2VzdCgnbGFiZWwnKT8udGV4dENvbnRlbnQudHJpbSgpfHwnRmVjaGEnKSsnOiBhYnJpciBjYWxlbmRhcmlvIGVuIGVzcGHDsW9sJyk7CiAgIGlucHV0LmhpZGRlbj10cnVlO2lucHV0LnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5Jywnbm9uZScsJ2ltcG9ydGFudCcpO2lucHV0LmFmdGVyKHRyaWdnZXIpO2lucHV0Ll9zcGFuaXNoVHJpZ2dlckxBPXRyaWdnZXI7CiAgIHRyaWdnZXIub25jbGljaz1ldmVudD0+e2V2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7aWYoc3BhbmlzaENhbGVuZGFyTEE/LmlucHV0PT09aW5wdXQpY2xvc2VTcGFuaXNoQ2FsZW5kYXJMQSgpO2Vsc2Ugc2hvd1NwYW5pc2hDYWxlbmRhckxBKGlucHV0LHRyaWdnZXIpO307CiAgfQogIHRyaWdnZXIudGV4dENvbnRlbnQ9ZGF0ZUxhYmVsU3BhbmlzaExBKGlucHV0LnZhbHVlKTsKIH0pOwp9CmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxldmVudD0+e2lmKHNwYW5pc2hDYWxlbmRhckxBJiYhc3BhbmlzaENhbGVuZGFyTEEucG9wdXAuY29udGFpbnMoZXZlbnQudGFyZ2V0KSYmIXNwYW5pc2hDYWxlbmRhckxBLnRyaWdnZXIuY29udGFpbnMoZXZlbnQudGFyZ2V0KSljbG9zZVNwYW5pc2hDYWxlbmRhckxBKGZhbHNlKTt9KTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZXZlbnQ9PntpZihldmVudC5rZXk9PT0nRXNjYXBlJyYmc3BhbmlzaENhbGVuZGFyTEEpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7Y2xvc2VTcGFuaXNoQ2FsZW5kYXJMQSgpO319KTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsKCk9PmNsb3NlU3BhbmlzaENhbGVuZGFyTEEoZmFsc2UpKTsKY29uc3QgcmVuZGVyQmVmb3JlU3BhbmlzaExBPXJlbmRlcjsKcmVuZGVyPWZ1bmN0aW9uKCl7Y2xvc2VTcGFuaXNoQ2FsZW5kYXJMQShmYWxzZSk7cmVuZGVyQmVmb3JlU3BhbmlzaExBKCk7aWYoZGF0YSlkZWNvcmF0ZVNwYW5pc2hEYXRlc0xBKCk7fTsKCmZ1bmN0aW9uIGRhdGVFeHRlbnRMQShyb3dzKXtsZXQgZmlyc3Q9JycsbGFzdD0nJztjb25zdCBkYXlzPW5ldyBTZXQoKTtmb3IoY29uc3QgciBvZiByb3dzKXtjb25zdCBkPXJbMF07aWYoIWZpcnN0fHxkPGZpcnN0KWZpcnN0PWQ7aWYoZD5sYXN0KWxhc3Q9ZDtkYXlzLmFkZChkKTt9cmV0dXJue2ZpcnN0LGxhc3QsZGF5c307fQpmdW5jdGlvbiBzaGlmdERhdGVMQShpc28sZGF5cyl7Y29uc3QgZD1uZXcgRGF0ZShpc28rJ1QwMDowMDowMFonKTtkLnNldFVUQ0RhdGUoZC5nZXRVVENEYXRlKCkrZGF5cyk7cmV0dXJuIGQudG9JU09TdHJpbmcoKS5zbGljZSgwLDEwKTt9CmZ1bmN0aW9uIGFsZXJ0V2luZG93c0xBKGVuZCxkYXlzKXtyZXR1cm4ge2Zyb206c2hpZnREYXRlTEEoZW5kLDEtZGF5cyksdG86ZW5kLHByZXZpb3VzRnJvbTpzaGlmdERhdGVMQShlbmQsMS1kYXlzKjIpLHByZXZpb3VzVG86c2hpZnREYXRlTEEoZW5kLC1kYXlzKX07fQpmdW5jdGlvbiBidWlsZEFsZXJ0c0xBKHJvd3Msc2V0dGluZ3MpewogY29uc3Qgd2luZG93cz1hbGVydFdpbmRvd3NMQShzZXR0aW5ncy5lbmQsc2V0dGluZ3MuZGF5cyksbWFwPW5ldyBNYXAoKSxjdXJyZW50RGF0ZXM9bmV3IFNldCgpLHByZXZpb3VzRGF0ZXM9bmV3IFNldCgpOwogZm9yKGNvbnN0IHIgb2Ygcm93cyl7CiAgaWYoZXhjbHVkZWRSZWNvcmRWNyhyKXx8IU9iamVjdC5lbnRyaWVzKHNldHRpbmdzLmZpbHRlcnN8fHt9KS5ldmVyeSgoW2ssdmFsdWVzXSk9Pk51bWJlcihrKT09PTh8fCF2YWx1ZXMubGVuZ3RofHx2YWx1ZXMuaW5jbHVkZXMoU3RyaW5nKHJba10/PydTaW4gZGF0bycpKSkpY29udGludWU7CiAgY29uc3QgY3VycmVudD1yWzBdPj13aW5kb3dzLmZyb20mJnJbMF08PXdpbmRvd3MudG8scHJldmlvdXM9clswXT49d2luZG93cy5wcmV2aW91c0Zyb20mJnJbMF08PXdpbmRvd3MucHJldmlvdXNUbzsKICBpZighY3VycmVudCYmIXByZXZpb3VzKWNvbnRpbnVlO2NvbnN0IGtleT1TdHJpbmcocltzZXR0aW5ncy5ncm91cF0/PydTaW4gaWRlbnRpZmljYWNpw7NuJyk7aWYoIW1hcC5oYXMoa2V5KSltYXAuc2V0KGtleSx7bmFtZTprZXksY3VycmVudDpbXSxwcmV2aW91czpbXX0pOwogIG1hcC5nZXQoa2V5KVtjdXJyZW50PydjdXJyZW50JzoncHJldmlvdXMnXS5wdXNoKHIpOyhjdXJyZW50P2N1cnJlbnREYXRlczpwcmV2aW91c0RhdGVzKS5hZGQoclswXSk7CiB9CiBjb25zdCBlbnRyaWVzPVsuLi5tYXAudmFsdWVzKCldLm1hcChnPT57CiAgY29uc3QgYT1hZ2coZy5wcmV2aW91cyksYj1hZ2coZy5jdXJyZW50KSxkYXlzQT1uZXcgU2V0KGcucHJldmlvdXMubWFwKHI9PnJbMF0pKS5zaXplLGRheXNCPW5ldyBTZXQoZy5jdXJyZW50Lm1hcChyPT5yWzBdKSkuc2l6ZSxvbGQ9YVtzZXR0aW5ncy5tZXRyaWNdLHZhbHVlPWJbc2V0dGluZ3MubWV0cmljXTsKICBsZXQgc3RhdHVzPSdvaycscmVhc29uPSdTaW4gY2HDrWRhIHN1cGVyaW9yIGFsIHVtYnJhbCcsY2hhbmdlPW51bGw7CiAgaWYoIWcuY3VycmVudC5sZW5ndGgpe3N0YXR1cz0naW5mbyc7cmVhc29uPSdTaW4gcmVnaXN0cm9zIGFjdHVhbGVzJzt9CiAgZWxzZSBpZihkYXlzQTxzZXR0aW5ncy5taW5EYXlzfHxkYXlzQjxzZXR0aW5ncy5taW5EYXlzKXtzdGF0dXM9J2luZm8nO3JlYXNvbj0nQ29iZXJ0dXJhIGluc3VmaWNpZW50ZSBwYXJhIGNvbXBhcmFyJzt9CiAgZWxzZSBpZihvbGQ9PW51bGx8fG9sZDw9MCl7c3RhdHVzPSdpbmZvJztyZWFzb249J1NpbiBiYXNlIHBvc2l0aXZhIGNvbXBhcmFibGUnO30KICBlbHNlIHtjaGFuZ2U9KHZhbHVlLW9sZCkvTWF0aC5hYnMob2xkKSoxMDA7aWYoY2hhbmdlPD0tc2V0dGluZ3MudGhyZXNob2xkKXtzdGF0dXM9J2Ryb3AnO3JlYXNvbj0nQ2HDrWRhIGRlICcrTWF0aC5hYnMoY2hhbmdlKS50b0ZpeGVkKDEpLnJlcGxhY2UoJy4nLCcsJykrJyUnO319CiAgaWYoc2V0dGluZ3MubWV0cmljPT09J3dkJyYmdmFsdWU8MCYmZy5jdXJyZW50Lmxlbmd0aCl7c3RhdHVzPSdkcm9wJztyZWFzb249J1dpbiBwb3IgbcOhcXVpbmEtZMOtYSBuZWdhdGl2bycrKGNoYW5nZT09bnVsbD8nIMK3IHNpbiB2YXJpYWNpw7NuIGNvbXBhcmFibGUnOicnKTt9CiAgcmV0dXJuIHsuLi5nLG9sZCx2YWx1ZSxkYXlzQSxkYXlzQixjaGFuZ2Usc3RhdHVzLHJlYXNvbixtYWNoaW5lRGF5c0E6YS5kYXlzLG1hY2hpbmVEYXlzQjpiLmRheXN9OwogfSkuc29ydCgoYSxiKT0+KGEuc3RhdHVzPT09J2Ryb3AnPzA6YS5zdGF0dXM9PT0naW5mbyc/MToyKS0oYi5zdGF0dXM9PT0nZHJvcCc/MDpiLnN0YXR1cz09PSdpbmZvJz8xOjIpfHwoYS5jaGFuZ2U/PzApLShiLmNoYW5nZT8/MCl8fGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpOwogcmV0dXJue3dpbmRvd3MsZW50cmllcyxjdXJyZW50RGF5czpjdXJyZW50RGF0ZXMuc2l6ZSxwcmV2aW91c0RheXM6cHJldmlvdXNEYXRlcy5zaXplfTsKfQpsZXQgZGVuc2l0eUxBPSdjb21wYWN0Jzt0cnl7ZGVuc2l0eUxBPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCdMQV9ERU5TSVRZJyk9PT0nY29tZm9ydGFibGUnPydjb21mb3J0YWJsZSc6J2NvbXBhY3QnO31jYXRjaChlKXt9CmRvY3VtZW50LmJvZHkuZGF0YXNldC5kZW5zaXR5PWRlbnNpdHlMQTsKZnVuY3Rpb24gc2V0dXBFeHBlcmllbmNlSGVhZGVyTEEoKXsKIGlmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVuc2l0eUxBJykpewogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZXNzaW9uQmFyVjE1JykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJyxgPGxhYmVsIGNsYXNzPSJkZW5zaXR5Q29udHJvbExBIj5WaXN0YTxzZWxlY3QgaWQ9ImRlbnNpdHlMQSI+PG9wdGlvbiB2YWx1ZT0iY29tcGFjdCI+Q29tcGFjdGE8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJjb21mb3J0YWJsZSI+Q8OzbW9kYTwvb3B0aW9uPjwvc2VsZWN0PjwvbGFiZWw+YCk7CiAgJCgnI2RlbnNpdHlMQScpLnZhbHVlPWRlbnNpdHlMQTskKCcjZGVuc2l0eUxBJykub25jaGFuZ2U9ZT0+e2RlbnNpdHlMQT1lLnRhcmdldC52YWx1ZTtkb2N1bWVudC5ib2R5LmRhdGFzZXQuZGVuc2l0eT1kZW5zaXR5TEE7dHJ5e2xvY2FsU3RvcmFnZS5zZXRJdGVtKCdMQV9ERU5TSVRZJyxkZW5zaXR5TEEpfWNhdGNoKGVycm9yKXt9fTsKIH0KIGxldCBiYWNrdXBzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXBzTEEnKTsKIGlmKCFiYWNrdXBzKXtiYWNrdXBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO2JhY2t1cHMuaWQ9J2JhY2t1cHNMQSc7YmFja3Vwcy50ZXh0Q29udGVudD0nUmVzcGFsZG9zJztiYWNrdXBzLm9uY2xpY2s9b3BlbkJhY2t1cHNMQTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2Vzc2lvbkJhclYxNScpLmFwcGVuZENoaWxkKGJhY2t1cHMpO30KIGJhY2t1cHMuaGlkZGVuPWFwcFNlc3Npb25WMTU/LnJvbGUhPT0nYWRtaW4nOwp9CmZ1bmN0aW9uIGZvcm1hdFVwZGF0ZUxBKHZhbHVlKXtpZighdmFsdWUpcmV0dXJuICdTaW4gZmVjaGEgZGlzcG9uaWJsZSc7Y29uc3QgZGF0ZT1uZXcgRGF0ZSh2YWx1ZSk7cmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSk/J1NpbiBmZWNoYSBkaXNwb25pYmxlJzpkYXRlLnRvTG9jYWxlU3RyaW5nKCdlcy1DTCcse3RpbWVab25lOidBbWVyaWNhL1NhbnRpYWdvJyxkYXk6JzItZGlnaXQnLG1vbnRoOidsb25nJyx5ZWFyOidudW1lcmljJyxob3VyOicyLWRpZ2l0JyxtaW51dGU6JzItZGlnaXQnfSk7fQpsZXQgZXh0ZW50Q2FjaGVMQT1udWxsOwpmdW5jdGlvbiBkYXRhU3RhdHVzTEEoKXsKIGlmKGV4dGVudENhY2hlTEE/Lm1hdHJpeCE9PWRhdGEpZXh0ZW50Q2FjaGVMQT17bWF0cml4OmRhdGEsLi4uZGF0ZUV4dGVudExBKGRhdGEucm93cyl9OwogY29uc3QgZT1leHRlbnRDYWNoZUxBLGRheT1uZXcgRGF0ZShlLmxhc3QrJ1QwMDowMDowMFonKSxzdGFydD1zaGlmdERhdGVMQShlLmxhc3QsLSgoZGF5LmdldFVUQ0RheSgpKzYpJTcpKTsKIGNvbnN0IGNvdmVyZWQ9Wy4uLmUuZGF5c10uZmlsdGVyKGQ9PmQ+PXN0YXJ0JiZkPD1lLmxhc3QpLmxlbmd0aDsKIHJldHVybiBgPHNwYW4+RGF0b3MgaGFzdGEgPGI+JHtlc2MoZGlzcGxheURhdGVzVjUoZS5sYXN0KSl9PC9iPjwvc3Bhbj48c3Bhbj5BY3R1YWxpemFjacOzbjogJHtlc2MoZm9ybWF0VXBkYXRlTEEoZGF0YS5zdG9yYWdlVXBkYXRlZEF0KSl9IMK3IGhvcmEgZGUgQ2hpbGU8L3NwYW4+PHNwYW4gY2xhc3M9IiR7Y292ZXJlZDw3Pydjb3ZlcmFnZUxBJzonJ30iPsOabHRpbWEgc2VtYW5hOiAke2NvdmVyZWR9LzcgZMOtYXMgY29uIGRhdG9zJHtjb3ZlcmVkPDc/JyDCtyBjb2JlcnR1cmEgcGFyY2lhbCc6Jyd9PC9zcGFuPmA7Cn0KZnVuY3Rpb24gZmlsdGVyVGV4dExBKGZpbHRlcnMscHJlZml4PScnKXsKIHJldHVybiBPYmplY3QuZW50cmllcyhmaWx0ZXJzfHx7fSkuZmlsdGVyKChbayx2XSk9Pk51bWJlcihrKSE9PTgmJihBcnJheS5pc0FycmF5KHYpP3YubGVuZ3RoOiEhdikpLm1hcCgoW2ssdl0pPT57Y29uc3QgbGlzdD1BcnJheS5pc0FycmF5KHYpP3Y6W3ZdO3JldHVybiBwcmVmaXgrKGRpbXNba118fGspKyc6ICcrKGxpc3QubGVuZ3RoPjI/bGlzdC5sZW5ndGgrJyBzZWxlY2Npb25hZG9zJzpsaXN0LmpvaW4oJywgJykpO30pOwp9CmZ1bmN0aW9uIGFjdGl2ZUZpbHRlcnNMQSgpewogaWYodGFiPT09J01ldG9kb2xvZ8OtYScpcmV0dXJuICcnOwogbGV0IGNoaXBzPVtdOwogaWYodGFiPT09J0NvbXBhcmF0aXZvcycpZm9yKGNvbnN0IHNjb3BlIG9mIFsnQScsJ0InXSl7Y2hpcHMucHVzaChzY29wZSsnOiAnK3NlbGVjdGVkRGF0ZVRleHRWOChzY29wZSksLi4uZmlsdGVyVGV4dExBKHZpZXdTdGF0ZVtzY29wZV0uZmlsdGVycyxzY29wZSsnIMK3ICcpKTt9CiBlbHNlIGlmKHRhYj09PSdBbGVydGFzJyl7Y29uc3Qgcz1hbGVydFNldHRpbmdzTEEoKSx3PWFsZXJ0V2luZG93c0xBKHMuZW5kLHMuZGF5cyk7Y2hpcHM9W2Rpc3BsYXlEYXRlc1Y1KHcuZnJvbSkrJyDihpIgJytkaXNwbGF5RGF0ZXNWNSh3LnRvKSwuLi5maWx0ZXJUZXh0TEEocy5maWx0ZXJzKSxkaW1zW3MuZ3JvdXBdKycgwrcgJyttZXRyaWNzW3MubWV0cmljXV07fQogZWxzZSB7Y2hpcHM9W3NlbGVjdGVkRGF0ZVRleHRWOCgnZ2xvYmFsJyldO2NvbnN0IGtleT17RXZvbHVjacOzbjonZXZvbHV0aW9uJyxSYXRpb3M6J3JhdGlvcycsJ1JlcG9ydGUgc2VtYW5hbCc6J3dlZWtseScsJ1JlcG9ydGUgbWVuc3VhbCc6J21vbnRobHknLCdFdm9sdXRpdm8gbWVuc3VhbCc6J21vbnRobHlFdm9sdXRpb24nLCdPdHJvcyBpbmZvcm1lcyc6J2V4dHJhJywnUHJlbWlvcyBzZW1hbmFsZXMnOidwcml6ZXMnfVt0YWJdO2NoaXBzLnB1c2goLi4uZmlsdGVyVGV4dExBKHZpZXdTdGF0ZVtrZXldPy5maWx0ZXJzKSk7aWYodGFiPT09J1Jlc3VtZW4nKWNoaXBzLnB1c2goJ1RvZG8gZWwgcGFycXVlJyk7fQogcmV0dXJuIGA8ZGl2IGNsYXNzPSJhY3RpdmVGaWx0ZXJzTEEiIGFyaWEtbGFiZWw9IkZpbHRyb3MgYWN0aXZvcyIgc3R5bGU9InBvc2l0aW9uOnN0aWNreTt0b3A6MDt6LWluZGV4OjgiPjxiPkNvbnN1bHRhIGFjdHVhbDwvYj4ke2NoaXBzLm1hcCh0ZXh0PT5gPHNwYW4gY2xhc3M9ImZpbHRlckNoaXBMQSIgdGl0bGU9IiR7ZXNjKHRleHQpfSI+JHtlc2ModGV4dCl9PC9zcGFuPmApLmpvaW4oJycpfTwvZGl2PmA7Cn0KZnVuY3Rpb24gc29ydGFibGVWYWx1ZUxBKHRleHQpe2NvbnN0IHJhdz1TdHJpbmcodGV4dCkudHJpbSgpO2NvbnN0IHZhbHVlPXJhdy5yZXBsYWNlKC9b4pePXHNdL2csJycpLnJlcGxhY2UoL0NMUHxwcHwlfMOXL2csJycpO2lmKC9eWystXT9bXGQuXSsoPzosXGQrKT8kLy50ZXN0KHZhbHVlKSlyZXR1cm57bnVtYmVyOk51bWJlcih2YWx1ZS5yZXBsYWNlKC9cLi9nLCcnKS5yZXBsYWNlKCcsJywnLicpKX07cmV0dXJue3RleHQ6cmF3LnRvTG9jYWxlTG93ZXJDYXNlKCdlcycpfTt9CmZ1bmN0aW9uIGVuaGFuY2VUYWJsZXNMQSgpewogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NvbnRlbnQgLnRhYmxld3JhcCwjY29udGVudCAuY2hhcnRkYXRhd3JhcCcpLmZvckVhY2goaG9zdD0+ewogIGNvbnN0IHRhYmxlPWhvc3QucXVlcnlTZWxlY3RvcigndGFibGUnKTtpZighdGFibGV8fCF0YWJsZS50SGVhZHx8IXRhYmxlLnRCb2RpZXMubGVuZ3RofHxob3N0LmRhdGFzZXQuZW5oYW5jZWRMYSlyZXR1cm47CiAgaG9zdC5kYXRhc2V0LmVuaGFuY2VkTGE9J3RydWUnO2hvc3QuY2xhc3NMaXN0LmFkZCgnc21hcnRUYWJsZUxBJyk7CiAgY29uc3Qgcm93cz1bLi4udGFibGUudEJvZGllc1swXS5yb3dzXTtpZihyb3dzLmxlbmd0aD44KXsKICAgY29uc3QgdG9vbHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7dG9vbHMuY2xhc3NOYW1lPSd0YWJsZVNlYXJjaExBJzt0b29scy5pbm5lckhUTUw9JzxpbnB1dCB0eXBlPSJzZWFyY2giIGFyaWEtbGFiZWw9IkJ1c2NhciBlbiBlc3RhIHRhYmxhIiBwbGFjZWhvbGRlcj0iQnVzY2FyIGVuIGVzdGEgdGFibGHigKYiPjxzcGFuPkxhIGLDunNxdWVkYSB2aXN1YWwgbm8gY2FtYmlhIGxvcyB0b3RhbGVzIG5pIGxhIGV4cG9ydGFjacOzbi48L3NwYW4+JzsKICAgaG9zdC5iZWZvcmUodG9vbHMpO3Rvb2xzLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jykub25pbnB1dD1lPT57Y29uc3QgcT1lLnRhcmdldC52YWx1ZS50cmltKCkudG9Mb2NhbGVMb3dlckNhc2UoJ2VzJyk7cm93cy5mb3JFYWNoKHI9PnIuaGlkZGVuPSEhcSYmIXIudGV4dENvbnRlbnQudG9Mb2NhbGVMb3dlckNhc2UoJ2VzJykuaW5jbHVkZXMocSkpO307CiAgfQogIFsuLi50YWJsZS50SGVhZC5yb3dzWzBdLmNlbGxzXS5mb3JFYWNoKCh0aCxpbmRleCk9PnsKICAgaWYodGgub25jbGljaylyZXR1cm47dGgudGFiSW5kZXg9MDt0aC50aXRsZT0nT3JkZW5hciBwb3IgJyt0aC50ZXh0Q29udGVudC50cmltKCk7dGguc2V0QXR0cmlidXRlKCdhcmlhLXNvcnQnLCdub25lJyk7CiAgIGZ1bmN0aW9uIHNvcnRSb3dzKCl7Y29uc3QgYXNjZW5kaW5nPXRoLmdldEF0dHJpYnV0ZSgnYXJpYS1zb3J0JykhPT0nYXNjZW5kaW5nJztbLi4udGFibGUudEhlYWQucm93c1swXS5jZWxsc10uZm9yRWFjaChjPT5jLnNldEF0dHJpYnV0ZSgnYXJpYS1zb3J0Jywnbm9uZScpKTt0aC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc29ydCcsYXNjZW5kaW5nPydhc2NlbmRpbmcnOidkZXNjZW5kaW5nJyk7CiAgICBjb25zdCBzb3J0ZWQ9cm93cy5tYXAoKHJvdyxwb3NpdGlvbik9Pih7cm93LHBvc2l0aW9uLHZhbHVlOnNvcnRhYmxlVmFsdWVMQShyb3cuY2VsbHNbaW5kZXhdPy50ZXh0Q29udGVudHx8JycpfSkpLnNvcnQoKGEsYik9Pntjb25zdCByZXN1bHQ9YS52YWx1ZS5udW1iZXIhPW51bGwmJmIudmFsdWUubnVtYmVyIT1udWxsP2EudmFsdWUubnVtYmVyLWIudmFsdWUubnVtYmVyOihhLnZhbHVlLnRleHQ/P1N0cmluZyhhLnZhbHVlLm51bWJlcikpLmxvY2FsZUNvbXBhcmUoYi52YWx1ZS50ZXh0Pz9TdHJpbmcoYi52YWx1ZS5udW1iZXIpLCdlcycse251bWVyaWM6dHJ1ZX0pO3JldHVybihhc2NlbmRpbmc/cmVzdWx0Oi1yZXN1bHQpfHxhLnBvc2l0aW9uLWIucG9zaXRpb247fSk7CiAgICBzb3J0ZWQuZm9yRWFjaCgoe3Jvd30pPT50YWJsZS50Qm9kaWVzWzBdLmFwcGVuZENoaWxkKHJvdykpO30KICAgdGgub25jbGljaz1zb3J0Um93czt0aC5vbmtleWRvd249ZT0+e2lmKGUua2V5PT09J0VudGVyJ3x8ZS5rZXk9PT0nICcpe2UucHJldmVudERlZmF1bHQoKTtzb3J0Um93cygpO319OwogIH0pOwogfSk7Cn0KZnVuY3Rpb24gY29tcGFyaXNvbk5vcm1hbGl6ZWRMQSgpewogaWYodGFiIT09J0NvbXBhcmF0aXZvcycpcmV0dXJuOwogY29uc3QgYm94PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wYXJpc29uQ2hhcnRzVjIyJyk7aWYoIWJveClyZXR1cm47CiB2aWV3U3RhdGUuY29tcGFyZVVuaXRzPz89J3RvdGFsJzsKIGJveC5jbGFzc0xpc3QuYWRkKCdub3JtYWxpemF0aW9uTEEnKTtib3gucXVlcnlTZWxlY3RvcignLmxhYmVsZWRsZWdlbmQnKS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWJlZ2luJyxgPGRpdiBjbGFzcz0idmlld2NvbnRyb2xzIj48bGFiZWw+TW9zdHJhciBncsOhZmljbyBwb3I8c2VsZWN0IGlkPSJjb21wYXJlVW5pdHNMQSI+PG9wdGlvbiB2YWx1ZT0idG90YWwiPlRvdGFsIGRlbCBwZXLDrW9kbzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImRheSI+RMOtYSBjb24gcmVnaXN0cm9zPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibWFjaGluZURheSI+TcOhcXVpbmEtZMOtYSByZWdpc3RyYWRhPC9vcHRpb24+PC9zZWxlY3Q+PC9sYWJlbD48L2Rpdj5gKTsKICQoJyNjb21wYXJlVW5pdHNMQScpLnZhbHVlPXZpZXdTdGF0ZS5jb21wYXJlVW5pdHM7JCgnI2NvbXBhcmVVbml0c0xBJykub25jaGFuZ2U9ZT0+e3ZpZXdTdGF0ZS5jb21wYXJlVW5pdHM9ZS50YXJnZXQudmFsdWU7cmVuZGVyKCk7fTsKIGNvbnN0IHVuaXQ9dmlld1N0YXRlLmNvbXBhcmVVbml0cztpZih1bml0PT09J3RvdGFsJylyZXR1cm47CiBjb25zdCBlbnRyaWVzPVsnQScsJ0InXS5tYXAoc2NvcGU9Pntjb25zdCBzPXZpZXdTdGF0ZVtzY29wZV0scm93cz1zbGljZVJvd3Mocy5maWx0ZXJzLHMuZnJvbSxzLnRvKSx0b3RhbD1hZ2cocm93cyksZGVub21pbmF0b3I9dW5pdD09PSdkYXknP25ldyBTZXQocm93cy5tYXAocj0+clswXSkpLnNpemU6dG90YWwuZGF5cztyZXR1cm57c2NvcGUsbmFtZTpzLm5hbWUscGVyaW9kOnNlbGVjdGVkRGF0ZVRleHRWOChzY29wZSksdG90YWw6e2NvaW46ZGVub21pbmF0b3I/dG90YWwuY29pbi9kZW5vbWluYXRvcjowLHdpbjpkZW5vbWluYXRvcj90b3RhbC53aW4vZGVub21pbmF0b3I6MH19O30pOwogY29uc3QgaG9zdD1ib3gucXVlcnlTZWxlY3RvcignLmNoYXJ0c2Nyb2xsJyk7aG9zdC5vdXRlckhUTUw9Y29tcGFyaXNvbkNvbWJpbmVkVjIyKGVudHJpZXMpOwogYm94LnF1ZXJ5U2VsZWN0b3IoJ2gyJykudGV4dENvbnRlbnQ9J0NvaW4gSW4geSBXaW4gwrcgJysodW5pdD09PSdkYXknPydwb3IgZMOtYSBjb24gcmVnaXN0cm9zJzoncG9yIG3DoXF1aW5hLWTDrWEgcmVnaXN0cmFkYScpOwogY29uc3Qgc3ZnPWJveC5xdWVyeVNlbGVjdG9yKCdzdmcnKTtzdmcuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJyxib3gucXVlcnlTZWxlY3RvcignaDInKS50ZXh0Q29udGVudCk7c3ZnLnF1ZXJ5U2VsZWN0b3IoJ3RleHQnKS50ZXh0Q29udGVudD0nQ0xQIC8gJysodW5pdD09PSdkYXknPydkw61hIGNvbiByZWdpc3Ryb3MnOidtw6FxdWluYS1kw61hIHJlZ2lzdHJhZGEnKTsKIGJveC5xdWVyeVNlbGVjdG9yKCcuc2lnbmFsbm90ZScpLnRleHRDb250ZW50PSdFbCBncsOhZmljbyBkaXZpZGUgY2FkYSBzZWxlY2Npw7NuIHBvciBzdXMgJysodW5pdD09PSdkYXknPydkw61hcyBkaXN0aW50b3MgY29uIHJlZ2lzdHJvcyc6J2NvbWJpbmFjaW9uZXMgw7puaWNhcyBkZSBtw6FxdWluYSB5IGZlY2hhJykrJy4gTGEgdGFibGEgY29uc2VydmEgbG9zIHRvdGFsZXMgeSBsb3MgaW5kaWNhZG9yZXMgZGlhcmlvcy4gQ2VybyBleHBvc2ljacOzbiBzZSByZXByZXNlbnRhIGNvbW8gY2VybyBlbiBlbCBncsOhZmljbzsgcmV2aXNhIGxvcyByZWdpc3Ryb3MgZGUgY2FkYSBzZWxlY2Npw7NuLic7CiAvLyBFeGlzdGluZyBQTkcgaGFuZGxlcnMgcmVmZXJlbmNlIHRoZSByZXBsYWNlZCBTVkc6IHJlcGxhY2UganVzdCB0aGVpciB0b29sYmFycyBhbmQgYmluZCBhZ2Fpbi4KIGJveC5xdWVyeVNlbGVjdG9yQWxsKCcuY2hhcnRUb29sc1Y4JykuZm9yRWFjaChlbD0+ZWwucmVtb3ZlKCkpOwogY29uc3QgbG9jYWw9Ym94LnF1ZXJ5U2VsZWN0b3IoJy5jaGFydHNjcm9sbCcpO2xvY2FsLmRhdGFzZXQubm9ybWFsaXplZExhPSd0cnVlJzsKIGNvbnN0IGJhcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtiYXIuY2xhc3NOYW1lPSdjaGFydFRvb2xzVjgnO2Jhci5pbm5lckhUTUw9JzxidXR0b24+Q29waWFyIGltYWdlbjwvYnV0dG9uPjxidXR0b24+RGVzY2FyZ2FyIFBORzwvYnV0dG9uPjxzcGFuIHJvbGU9InN0YXR1cyI+PC9zcGFuPic7bG9jYWwuYmVmb3JlKGJhcik7CiBjb25zdCBbY29weSxzYXZlXT1iYXIucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJyksc3RhdHVzPWJhci5xdWVyeVNlbGVjdG9yKCdzcGFuJyksdGl0bGU9Ym94LnF1ZXJ5U2VsZWN0b3IoJ2gyJykudGV4dENvbnRlbnQsbGVnZW5kPWJveC5xdWVyeVNlbGVjdG9yKCcubGFiZWxlZGxlZ2VuZCcpLnRleHRDb250ZW50Owogc2F2ZS5vbmNsaWNrPWFzeW5jKCk9Pnt0cnl7ZG93bmxvYWRCbG9iVjgoYXdhaXQgY2hhcnRQbmdWOChzdmcsdGl0bGUsbGVnZW5kKSwnTEEtY29tcGFyYXRpdm8ucG5nJyk7c3RhdHVzLnRleHRDb250ZW50PSdEZXNjYXJnYWRvJzt9Y2F0Y2goZSl7c3RhdHVzLnRleHRDb250ZW50PWUubWVzc2FnZTt9fTsKIGNvcHkub25jbGljaz1hc3luYygpPT57dHJ5e2NvbnN0IGJsb2I9YXdhaXQgY2hhcnRQbmdWOChzdmcsdGl0bGUsbGVnZW5kKTtpZighbmF2aWdhdG9yLmNsaXBib2FyZD8ud3JpdGV8fHR5cGVvZiBDbGlwYm9hcmRJdGVtPT09J3VuZGVmaW5lZCcpe2Rvd25sb2FkQmxvYlY4KGJsb2IsJ0xBLWNvbXBhcmF0aXZvLnBuZycpO3N0YXR1cy50ZXh0Q29udGVudD0nSW1hZ2VuIGRlc2NhcmdhZGEnO3JldHVybjt9YXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZShbbmV3IENsaXBib2FyZEl0ZW0oeydpbWFnZS9wbmcnOmJsb2J9KV0pO3N0YXR1cy50ZXh0Q29udGVudD0nQ29waWFkbyc7fWNhdGNoKGUpe3N0YXR1cy50ZXh0Q29udGVudD1lLm1lc3NhZ2U7fX07Cn0KZnVuY3Rpb24gYWxlcnRTZXR0aW5nc0xBKCl7dmlld1N0YXRlLmFsZXJ0cz8/PXtkYXlzOjcsZW5kOmRhdGVFeHRlbnRMQShkYXRhLnJvd3MpLmxhc3QsZ3JvdXA6JzknLG1ldHJpYzonY2QnLHRocmVzaG9sZDoxNSxtaW5EYXlzOjMsb25seURyb3BzOnRydWUsZmlsdGVyczp7fX07cmV0dXJuIHZpZXdTdGF0ZS5hbGVydHM7fQpsZXQgYWxlcnRSZXBvcnRMQT1udWxsOwpmdW5jdGlvbiByZW5kZXJBbGVydHNMQSgpewogY29uc3Qgcz1hbGVydFNldHRpbmdzTEEoKSxyZXBvcnQ9YnVpbGRBbGVydHNMQShkYXRhLnJvd3Mscyk7YWxlcnRSZXBvcnRMQT1yZXBvcnQ7CiBjb25zdCB2aXNpYmxlPXJlcG9ydC5lbnRyaWVzLmZpbHRlcihnPT4hcy5vbmx5RHJvcHN8fGcuc3RhdHVzPT09J2Ryb3AnKSx3PXJlcG9ydC53aW5kb3dzOwogZG9jdW1lbnQuYm9keS5kYXRhc2V0LnZpZXc9dGFiOyQoJyN0aXRsZScpLnRleHRDb250ZW50PSdBbGVydGFzIGRlIHJlbmRpbWllbnRvJztkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmlsdGVycycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOyQoJyNjb250cm9scycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOwogZXhwb3J0Um93cz1bWydHcnVwbycsJ0VzdGFkbycsJ01vdGl2bycsJ1ZhbG9yIGFudGVyaW9yJywnVmFsb3IgYWN0dWFsJywnVmFyaWFjacOzbiAlJywnRMOtYXMgYW50ZXJpb3JlcycsJ0TDrWFzIGFjdHVhbGVzJywnTcOhcXVpbmFzLWTDrWEgYW50ZXJpb3JlcycsJ03DoXF1aW5hcy1kw61hIGFjdHVhbGVzJ10sLi4udmlzaWJsZS5tYXAoZz0+W2cubmFtZSxnLnN0YXR1cyxnLnJlYXNvbixnLm9sZD8/JycsZy52YWx1ZT8/JycsZy5jaGFuZ2U/PycnLGcuZGF5c0EsZy5kYXlzQixnLm1hY2hpbmVEYXlzQSxnLm1hY2hpbmVEYXlzQl0pXTsKICQoJyNjb250ZW50JykuaW5uZXJIVE1MPWJhbm5lcignRGV0ZWN0YXIgY2HDrWRhcyBjb24gY29udGV4dG8nLCdDb21wYXJhIHZlbnRhbmFzIGRlIGlndWFsIGR1cmFjacOzbiBjb24gbcOpdHJpY2FzIHBvciBtw6FxdWluYS1kw61hLiBMYSBjb2JlcnR1cmEgZGUgcmVnaXN0cm9zIHNlIG11ZXN0cmEgYW50ZXMgZGUgaW50ZXJwcmV0YXIgdW5hIGNhw61kYS4nKStgPHNlY3Rpb24gY2xhc3M9ImNhcmQiIGlkPSJhbGVydENvbmZpZ0xBIj48ZGl2IGNsYXNzPSJhbGVydFNldHRpbmdzTEEiPiR7c2VsZWN0b3IoJ1ZlbnRhbmEgZGUgZMOtYXMnLCdhbGVydERheXNMQScscy5kYXlzLHs3Oic3IGTDrWFzJywxNDonMTQgZMOtYXMnLDI4OicyOCBkw61hcyd9KX08bGFiZWw+SGFzdGE8aW5wdXQgdHlwZT0iZGF0ZSIgaWQ9ImFsZXJ0RW5kTEEiIHZhbHVlPSIke3MuZW5kfSI+PC9sYWJlbD4ke3NlbGVjdG9yKCdBZ3J1cGFyJywnYWxlcnRHcm91cExBJyxzLmdyb3VwLHs5OidCYW5jbycsMTonTcOhcXVpbmEnfSl9JHtzZWxlY3RvcignSW5kaWNhZG9yJywnYWxlcnRNZXRyaWNMQScscy5tZXRyaWMse2NkOidDb2luIEluIC8gbcOhcXVpbmEtZMOtYScsd2Q6J1dpbiAvIG3DoXF1aW5hLWTDrWEnLHNkOidTcGlucyAvIG3DoXF1aW5hLWTDrWEnfSl9PGxhYmVsPlVtYnJhbCBkZSBjYcOtZGEgKCUpPGlucHV0IGlkPSJhbGVydFRocmVzaG9sZExBIiB0eXBlPSJudW1iZXIiIG1pbj0iMSIgbWF4PSIxMDAiIHZhbHVlPSIke3MudGhyZXNob2xkfSI+PC9sYWJlbD48bGFiZWw+TcOtbmltbyBkZSBkw61hcyBwb3IgZ3J1cG88aW5wdXQgaWQ9ImFsZXJ0TWluTEEiIHR5cGU9Im51bWJlciIgbWluPSIxIiBtYXg9IiR7cy5kYXlzfSIgdmFsdWU9IiR7cy5taW5EYXlzfSI+PC9sYWJlbD48L2Rpdj48ZGl2IGNsYXNzPSJmaWx0ZXJncmlkIiBzdHlsZT0ibWFyZ2luLXRvcDoxNHB4Ij4ke2ZpbHRlckZpZWxkcyhzLCdhbGVydHMnLFsyLDMsNSw3XSl9PC9kaXY+PGJ1dHRvbiBjbGFzcz0icHJpbWFyeSIgaWQ9ImFsZXJ0QXBwbHlMQSIgc3R5bGU9Im1hcmdpbi10b3A6MTRweCI+QXBsaWNhciB1bWJyYWwgeSBmZWNoYTwvYnV0dG9uPjwvc2VjdGlvbj48ZGl2IGNsYXNzPSJjb21wYXJpc29uTm90ZSI+QWN0dWFsOiAke2Rpc3BsYXlEYXRlc1Y1KHcuZnJvbSl9IOKGkiAke2Rpc3BsYXlEYXRlc1Y1KHcudG8pfSDCtyAke3JlcG9ydC5jdXJyZW50RGF5c30vJHtzLmRheXN9IGTDrWFzIGNvbiBkYXRvcyBlbiBsYSBzZWxlY2Npw7NuLjxicj5BbnRlcmlvcjogJHtkaXNwbGF5RGF0ZXNWNSh3LnByZXZpb3VzRnJvbSl9IOKGkiAke2Rpc3BsYXlEYXRlc1Y1KHcucHJldmlvdXNUbyl9IMK3ICR7cmVwb3J0LnByZXZpb3VzRGF5c30vJHtzLmRheXN9IGTDrWFzIGNvbiBkYXRvcy48L2Rpdj48ZGl2IGNsYXNzPSJrcGlzIj4ke3N0YXRDYXJkcyhbWydBTEVSVEFTJyxyZXBvcnQuZW50cmllcy5maWx0ZXIoZz0+Zy5zdGF0dXM9PT0nZHJvcCcpLmxlbmd0aCwnQ2HDrWRhIGRlIGFsIG1lbm9zICcrcy50aHJlc2hvbGQrJyUgbyBXaW4gZGlhcmlvIG5lZ2F0aXZvJ10sWydTSU4gQ09NUEFSQUNJw5NOJyxyZXBvcnQuZW50cmllcy5maWx0ZXIoZz0+Zy5zdGF0dXM9PT0naW5mbycpLmxlbmd0aCwnU2luIGJhc2UgcG9zaXRpdmEsIHJlZ2lzdHJvcyBvIGNvYmVydHVyYSBzdWZpY2llbnRlJ10sWydHUlVQT1MnLHJlcG9ydC5lbnRyaWVzLmxlbmd0aCwnQ29uIHJlZ2lzdHJvcyBlbiBhbGd1bmEgZGUgbGFzIGRvcyB2ZW50YW5hcyddXSkucmVwbGFjZSgvXjxkaXYgY2xhc3M9ImtwaXMiPnw8XC9kaXY+JC9nLCcnKX08L2Rpdj48c2VjdGlvbiBjbGFzcz0iY2FyZCI+PGgyPlJlc3VsdGFkb3MgcG9yICR7ZGltc1tzLmdyb3VwXX08L2gyPjxsYWJlbCBzdHlsZT0iZmxleC1kaXJlY3Rpb246cm93O2FsaWduLWl0ZW1zOmNlbnRlciI+PGlucHV0IGlkPSJhbGVydE9ubHlMQSIgdHlwZT0iY2hlY2tib3giICR7cy5vbmx5RHJvcHM/J2NoZWNrZWQnOicnfT5Nb3N0cmFyIHNvbG8gYWxlcnRhczwvbGFiZWw+PGRpdiBjbGFzcz0idGFibGV3cmFwIj48dGFibGU+PHRoZWFkPjx0cj4ke2V4cG9ydFJvd3NbMF0ubWFwKGg9PmA8dGg+JHtlc2MoaCl9PC90aD5gKS5qb2luKCcnKX08L3RyPjwvdGhlYWQ+PHRib2R5PiR7dmlzaWJsZS5tYXAoZz0+YDx0cj48dGQ+JHtlc2MoZy5uYW1lKX08L3RkPjx0ZD48c3BhbiBjbGFzcz0iYWxlcnRCYWRnZUxBICR7Zy5zdGF0dXN9Ij4ke2cuc3RhdHVzPT09J2Ryb3AnPydSZXZpc2FyJzpnLnN0YXR1cz09PSdvayc/J1NpbiBjYcOtZGEnOidTaW4gY29tcGFyYWNpw7NuJ308L3NwYW4+PC90ZD48dGQ+JHtlc2MoZy5yZWFzb24pfTwvdGQ+PHRkPiR7Zm10KGcub2xkLHMubWV0cmljKX08L3RkPjx0ZD4ke2ZtdChnLnZhbHVlLHMubWV0cmljKX08L3RkPjx0ZD4ke2cuY2hhbmdlPT1udWxsPyfigJQnOmcuY2hhbmdlLnRvTG9jYWxlU3RyaW5nKCdlcy1DTCcse21heGltdW1GcmFjdGlvbkRpZ2l0czoxfSkrJyUnfTwvdGQ+PHRkPiR7Zy5kYXlzQX08L3RkPjx0ZD4ke2cuZGF5c0J9PC90ZD48dGQ+JHtnLm1hY2hpbmVEYXlzQX08L3RkPjx0ZD4ke2cubWFjaGluZURheXNCfTwvdGQ+PC90cj5gKS5qb2luKCcnKXx8Jzx0cj48dGQgY29sc3Bhbj0iMTAiPlNpbiBhbGVydGFzIGNvbiBsb3MgY3JpdGVyaW9zIGFjdHVhbGVzLiBEZXNtYXJjYSDCq01vc3RyYXIgc29sbyBhbGVydGFzwrsgcGFyYSByZXZpc2FyIGxhIGNvYmVydHVyYSBkZSB0b2RvcyBsb3MgZ3J1cG9zLjwvdGQ+PC90cj4nfTwvdGJvZHk+PC90YWJsZT48L2Rpdj48cCBjbGFzcz0ic2lnbmFsbm90ZSI+VW5hIGFsZXJ0YSBlcyB1bmEgc2XDsWFsIGRlIHJldmlzacOzbiwgbm8gdW5hIGV4cGxpY2FjacOzbiBkZSBzdSBjYXVzYS4gTm8gc2UgY29uc2lkZXJhIGNlcm8gdW4gcGVyw61vZG8gc2luIHJlZ2lzdHJvcy4gTG9zIGNhbWJpb3MgZGUgdWJpY2FjacOzbiBzZSBpbnRlcnByZXRhbiBzZWfDum4gbGEgdWJpY2FjacOzbiBoaXN0w7NyaWNhIGNhcmdhZGEuIFVuIFdpbiBuZWdhdGl2byBzZSBzZcOxYWxhIGF1biBzaW4gcmVmZXJlbmNpYSBjb21wYXJhYmxlLjwvcD48L3NlY3Rpb24+YDsKIGJpbmRGaWx0ZXJzKCk7Zm9yKGNvbnN0W2lkLGtleV1vZiBbWydhbGVydERheXNMQScsJ2RheXMnXSxbJ2FsZXJ0R3JvdXBMQScsJ2dyb3VwJ10sWydhbGVydE1ldHJpY0xBJywnbWV0cmljJ11dKSQoJyMnK2lkKS5vbmNoYW5nZT1lPT57c1trZXldPWtleT09PSdkYXlzJz9OdW1iZXIoZS50YXJnZXQudmFsdWUpOmUudGFyZ2V0LnZhbHVlO3MubWluRGF5cz1NYXRoLm1pbihzLm1pbkRheXMscy5kYXlzKTtyZW5kZXIoKTt9OwogJCgnI2FsZXJ0QXBwbHlMQScpLm9uY2xpY2s9KCk9Pntjb25zdCB0aHJlc2hvbGQ9TnVtYmVyKCQoJyNhbGVydFRocmVzaG9sZExBJykudmFsdWUpLG1pbkRheXM9TnVtYmVyKCQoJyNhbGVydE1pbkxBJykudmFsdWUpLGVuZD0kKCcjYWxlcnRFbmRMQScpLnZhbHVlO2lmKCFlbmR8fHRocmVzaG9sZDwxfHx0aHJlc2hvbGQ+MTAwfHxtaW5EYXlzPDF8fG1pbkRheXM+cy5kYXlzfHwhTnVtYmVyLmlzSW50ZWdlcihtaW5EYXlzKSl7YWxlcnQoJ1JldmlzYSBsYSBmZWNoYSwgZWwgdW1icmFsICgxIGEgMTAwJSkgeSBlbCBtw61uaW1vIGRlIGTDrWFzLicpO3JldHVybjt9T2JqZWN0LmFzc2lnbihzLHt0aHJlc2hvbGQsbWluRGF5cyxlbmR9KTtyZW5kZXIoKTt9OwogJCgnI2FsZXJ0T25seUxBJykub25jaGFuZ2U9ZT0+e3Mub25seURyb3BzPWUudGFyZ2V0LmNoZWNrZWQ7cmVuZGVyKCk7fTsKIGZvbGRDb250cm9sTEEoJCgnI2FsZXJ0Q29uZmlnTEEnKSwnYWxlcnQtY29uZmlnJywnQ29uZmlndXJhciBhbGVydGFzIMK3ICcrcy5kYXlzKycgZMOtYXMgwrcgY2HDrWRhIOKJpSAnK3MudGhyZXNob2xkKyclIMK3IGFicmlyIHBhcmEgY2FtYmlhcicpOwp9CmFzeW5jIGZ1bmN0aW9uIG9wZW5CYWNrdXBzTEEoKXsKIGlmKGFwcFNlc3Npb25WMTU/LnJvbGUhPT0nYWRtaW4nKXJldHVybjsKIGNvbnN0IGRpYWxvZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaWFsb2cnKTtkaWFsb2cuY2xhc3NOYW1lPSdleHBlcmllbmNlRGlhbG9nTEEnO2RpYWxvZy5pbm5lckhUTUw9JzxoMj5SZXNwYWxkb3MgZGUgbWF0cmljZXM8L2gyPjxwPlNlIGNvbnNlcnZhbiBsYXMgdHJlcyBtYXRyaWNlcyBhbnRlcmlvcmVzLiBDYWRhIGFjdHVhbGl6YWNpw7NuIGd1YXJkYSBsYSBtYXRyaXogYWN0aXZhIGFudGVzIGRlIHN1c3RpdHVpcmxhOyBsYSBwcmltZXJhIGNhcmdhIG5vIHRpZW5lIHVuYSB2ZXJzacOzbiBwcmV2aWEuPC9wPjxwIGNsYXNzPSJiYWNrdXBTdGF0dXNMQSI+Q29uc3VsdGFuZG8gcmVzcGFsZG9z4oCmPC9wPjx1bCBjbGFzcz0iYmFja3VwTGlzdExBIj48L3VsPjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLWJhY2t1cGRvd25sb2FkPkRlc2NhcmdhciBtYXRyaXogYWN0dWFsIChKU09OKTwvYnV0dG9uPiA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1iYWNrdXBjbG9zZT5DZXJyYXI8L2J1dHRvbj4nOwogZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaWFsb2cpO2RpYWxvZy5zaG93TW9kYWwoKTtkaWFsb2cucXVlcnlTZWxlY3RvcignW2RhdGEtYmFja3VwY2xvc2VdJykub25jbGljaz0oKT0+e2RpYWxvZy5jbG9zZSgpO2RpYWxvZy5yZW1vdmUoKTt9OwogZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWJhY2t1cGRvd25sb2FkXScpLm9uY2xpY2s9KCk9PmRvd25sb2FkQmxvYlY4KG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShkYXRhKV0se3R5cGU6J2FwcGxpY2F0aW9uL2pzb24nfSksJ0xBLW1hdHJpei1yZXNwYWxkby5qc29uJyk7CiBjb25zdCBzdGF0dXM9ZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5iYWNrdXBTdGF0dXNMQScpOwogdHJ5ewogIGNvbnN0IGJhY2t1cHM9YXdhaXQgc3VwYWJhc2VSZXF1ZXN0TEEoJy9yZXN0L3YxL2xhX2JhY2t1cHM/c2VsZWN0PWlkLGNyZWF0ZWRfYXQsc291cmNlX3VwZGF0ZWRfYXQscm93X2NvdW50LHNvdXJjZV9uYW1lJm9yZGVyPXZlcnNpb25fc2VxLmRlc2MmbGltaXQ9Mycse30sYXBwU2Vzc2lvblYxNS50b2tlbik7CiAgc3RhdHVzLnRleHRDb250ZW50PWJhY2t1cHMubGVuZ3RoPydSZXN0YXVyYXIgcmVlbXBsYXphIGxhIG1hdHJpeiBhY3RpdmEgeSBndWFyZGEgdW4gcmVzcGFsZG8gZGUgbGEgcXVlIGVzdMOhIHVzYW5kbyBhaG9yYS4nOidBw7puIG5vIGhheSB2ZXJzaW9uZXMgYW50ZXJpb3Jlcy4gRWwgc2lndWllbnRlIGNhbWJpbyBkZSBtYXRyaXogZ2VuZXJhcsOhIGVsIHByaW1lciByZXNwYWxkby4nOwogIGRpYWxvZy5xdWVyeVNlbGVjdG9yKCcuYmFja3VwTGlzdExBJykuaW5uZXJIVE1MPWJhY2t1cHMubWFwKGI9PmA8bGk+PHNwYW4+PGI+JHtlc2MoYi5zb3VyY2VfbmFtZXx8J01hdHJpeicpfTwvYj48YnI+JHtlc2MoZm9ybWF0VXBkYXRlTEEoYi5jcmVhdGVkX2F0KSl9IMK3ICR7Zm10KGIucm93X2NvdW50KX0gcmVnaXN0cm9zPC9zcGFuPjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLXJlc3RvcmViYWNrdXA9IiR7Yi5pZH0iPlJlc3RhdXJhcjwvYnV0dG9uPjwvbGk+YCkuam9pbignJyk7CiAgZGlhbG9nLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXJlc3RvcmViYWNrdXBdJykuZm9yRWFjaChidXR0b249PmJ1dHRvbi5vbmNsaWNrPWFzeW5jKCk9PnsKICAgaWYoIWNvbmZpcm0oJ8K/UmVzdGF1cmFyIGVzdGEgbWF0cml6IGFudGVyaW9yPyBMYSBtYXRyaXogYWN0dWFsIHF1ZWRhcsOhIHJlc3BhbGRhZGEuJykpcmV0dXJuOwogICBkaWFsb2cucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJykuZm9yRWFjaChiPT5iLmRpc2FibGVkPXRydWUpO3N0YXR1cy50ZXh0Q29udGVudD0nUmVzdGF1cmFuZG/igKYnOwogICB0cnl7YXdhaXQgc3VwYWJhc2VSZXF1ZXN0TEEoJy9yZXN0L3YxL3JwYy9sYV9yZXN0b3JlX2JhY2t1cCcse21ldGhvZDonUE9TVCcsYm9keTpKU09OLnN0cmluZ2lmeSh7cF9iYWNrdXA6YnV0dG9uLmRhdGFzZXQucmVzdG9yZWJhY2t1cCxwX3JldmlzaW9uOmRhdGEuc3RvcmFnZVJldmlzaW9ufSl9LGFwcFNlc3Npb25WMTUudG9rZW4pO2RhdGE9YXdhaXQgY2FjaGVkKCk7ZGlhbG9nLmNsb3NlKCk7ZGlhbG9nLnJlbW92ZSgpO2luaXQoKTt9CiAgIGNhdGNoKGVycm9yKXtzdGF0dXMudGV4dENvbnRlbnQ9ZXJyb3IubWVzc2FnZTtkaWFsb2cucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJykuZm9yRWFjaChiPT5iLmRpc2FibGVkPWZhbHNlKTt9CiAgfSk7CiB9Y2F0Y2goZXJyb3Ipe3N0YXR1cy50ZXh0Q29udGVudD1lcnJvci5zdGF0dXM9PT00MDQ/J0ZhbHRhIGVqZWN1dGFyIHJlc3BhbGRvcy12NS5zcWwgZW4gU3VwYWJhc2UuIFB1ZWRlcyBkZXNjYXJnYXIgdW5hIGNvcGlhIEpTT04gbWllbnRyYXMgdGFudG8uJzplcnJvci5tZXNzYWdlO30KfQpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCduYXYgYnV0dG9uW2RhdGEtdGFiPSJNZXRvZG9sb2fDrWEiXScpLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlYmVnaW4nLCc8YnV0dG9uIGRhdGEtdGFiPSJBbGVydGFzIj7impEgJm5ic3A7IEFsZXJ0YXM8L2J1dHRvbj4nKTsKZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbmF2IGJ1dHRvbltkYXRhLXRhYj0iQWxlcnRhcyJdJykub25jbGljaz0oKT0+YWN0aXZhdGVUYWJWMygnQWxlcnRhcycpOwpjb25zdCBleHBvcnRCZWZvcmVFeHBlcmllbmNlTEE9JCgnI3YyZXhwb3J0Jykub25jbGljazsKJCgnI3YyZXhwb3J0Jykub25jbGljaz1mdW5jdGlvbigpe2lmKHRhYiE9PSdBbGVydGFzJylyZXR1cm4gZXhwb3J0QmVmb3JlRXhwZXJpZW5jZUxBKCk7ZG93bmxvYWRCbG9iVjgod29ya2Jvb2tCbG9iVjgoW3tuYW1lOidBbGVydGFzJyxyb3dzOmV4cG9ydFJvd3N9LHtuYW1lOidDb25maWd1cmFjaW9uJyxyb3dzOltbJ1BhcsOhbWV0cm8nLCdWYWxvciddLC4uLk9iamVjdC5lbnRyaWVzKGFsZXJ0U2V0dGluZ3NMQSgpKS5tYXAoKFtrLHZdKT0+W2ssdHlwZW9mIHY9PT0nb2JqZWN0Jz9KU09OLnN0cmluZ2lmeSh2KTp2XSksWydWZW50YW5hcycsSlNPTi5zdHJpbmdpZnkoYWxlcnRSZXBvcnRMQS53aW5kb3dzKV0sWydVbmlkYWRlcycsJ0NMUCBvIHNwaW5zIHBvciBtw6FxdWluYS1kw61hIHJlZ2lzdHJhZGEsIHNlZ8O6biBpbmRpY2Fkb3InXV19XSksJ0xBLWFsZXJ0YXMueGxzeCcpO307CmNvbnN0IHJlbmRlckJlZm9yZUV4cGVyaWVuY2VMQT1yZW5kZXI7CnJlbmRlcj1mdW5jdGlvbigpewogaWYoZGF0YSYmdGFiPT09J0FsZXJ0YXMnKXtjbG9zZVNwYW5pc2hDYWxlbmRhckxBKGZhbHNlKTtyZW5kZXJBbGVydHNMQSgpO2NvbXBhY3RDb250cm9sc0xBKCk7ZGVjb3JhdGVTcGFuaXNoRGF0ZXNMQSgpO31lbHNlIHJlbmRlckJlZm9yZUV4cGVyaWVuY2VMQSgpOwogaWYoIWRhdGEpcmV0dXJuO3NldHVwRXhwZXJpZW5jZUhlYWRlckxBKCk7CiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGF0YVN0YXR1c0xBJyk/LnJlbW92ZSgpO2NvbnN0IHN0YXR1cz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtzdGF0dXMuaWQ9J2RhdGFTdGF0dXNMQSc7c3RhdHVzLmNsYXNzTmFtZT0nZGF0YVN0YXR1c0xBJztzdGF0dXMuaW5uZXJIVE1MPWRhdGFTdGF0dXNMQSgpO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWRlcicpLmFmdGVyKHN0YXR1cyk7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY29udGVudCAuYWN0aXZlRmlsdGVyc0xBJyk/LnJlbW92ZSgpOyQoJyNjb250ZW50JykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJyxhY3RpdmVGaWx0ZXJzTEEoKSk7Y29tcGFyaXNvbk5vcm1hbGl6ZWRMQSgpO2VuaGFuY2VUYWJsZXNMQSgpOwp9OwoKY29uc3QgcmVzcG9uc2l2ZUNoYXJ0TW9kZWxzTEE9bmV3IE1hcCgpOwpmdW5jdGlvbiBjaGFydFRpY2tJbmRleGVzTEEoY291bnQsc3BhY2luZyxtaW5pbXVtKXsKIGlmKGNvdW50PDIpcmV0dXJuIGNvdW50P1swXTpbXTsKIGNvbnN0IHN0ZXA9TWF0aC5tYXgoMSxNYXRoLmNlaWwobWluaW11bS9NYXRoLm1heChzcGFjaW5nLDEpKSksaW5kZXhlcz1bXTsKIGZvcihsZXQgaT0wO2k8Y291bnQ7aSs9c3RlcClpbmRleGVzLnB1c2goaSk7CiBpZihpbmRleGVzLmF0KC0xKSE9PWNvdW50LTEpe2lmKGluZGV4ZXMubGVuZ3RoPjEmJihjb3VudC0xLWluZGV4ZXMuYXQoLTEpKSpzcGFjaW5nPG1pbmltdW0paW5kZXhlcy5wb3AoKTtpbmRleGVzLnB1c2goY291bnQtMSk7fQogcmV0dXJuIGluZGV4ZXM7Cn0KZnVuY3Rpb24gcmVzcG9uc2l2ZUNoYXJ0TGF5b3V0TEEobW9kZWwscmVxdWVzdGVkV2lkdGgpewogY29uc3Qge3NlcmllcyxrZXksZHVhbEtleXMsaWR9PW1vZGVsLGNvbG9ycz10eXBlb2YgY2hhcnRTZXJpZXNDb2xvcnNWaXN1YWxMQT09PSdmdW5jdGlvbic/Y2hhcnRTZXJpZXNDb2xvcnNWaXN1YWxMQShtb2RlbCk6WycjMTZhOWFlJywnIzU0N2ZjNScsJyM2N2E3ODInLCcjYTU4OGMyJywnI2M3OGU0NScsJyNkNjgxNzgnLCcjNWE5ZmE0JywnI2EyYTg2NiddOwogY29uc3QgYXhlcz1kdWFsS2V5cz8obW9kZWwucGVyaW9kVjEwP1suLi5uZXcgU2V0KGR1YWxLZXlzKV06ZHVhbEtleXMuc2xpY2UoMCwyKSk6W2tleV0sYXhpc1Nlcmllcz1heGVzLm1hcChtZXRyaWM9PmR1YWxLZXlzP2R1YWxLZXlzLmluZGV4T2YobWV0cmljKTowKTsKIGNvbnN0IHdpZHRoPU1hdGgubWF4KDI2MCxNYXRoLnJvdW5kKHJlcXVlc3RlZFdpZHRofHw2NDApKSxhbGxEYWlseUxhYmVscz0hIW1vZGVsLmFsaWduZWRXZWVrc1YxMCxwYWNrTGFiZWxzPWFsbERhaWx5TGFiZWxzfHwobW9kZWwucGVyaW9kVjEwJiZzZXJpZXMubGVuZ3RoPjIpLGhlaWdodD1wYWNrTGFiZWxzP01hdGgubWF4KDM0MCwyMDArc2VyaWVzLmxlbmd0aCood2lkdGg8NTAwPyhheGVzLmxlbmd0aD4yPzUyOjM0KToxOCkpOjM0MCxsZWZ0PXdpZHRoPDM4MD80OTo2MCxyaWdodD13aWR0aC0oYXhlcy5sZW5ndGg+Mj8xMjA6ZHVhbEtleXM/NTU6MjgpLHRvcD01OCxib3R0b209aGVpZ2h0LTExNTsKIGNvbnN0IGxhYmVscz1bLi4ubmV3IFNldChzZXJpZXMuZmxhdE1hcChzPT5zLnBvaW50cy5tYXAocD0+cC5uYW1lKSkpXS5zb3J0KCk7CiBjb25zdCBlbnRyaWVzPWxhYmVscy5tYXAobGFiZWw9Pntjb25zdCBwb2ludHM9c2VyaWVzLm1hcChzPT5zLnBvaW50cy5maW5kKHA9PnAubmFtZT09PWxhYmVsKSk7cmV0dXJue3BlcmlvZDpwZXJpb2REZXNjcmlwdGlvblY0KGxhYmVsLHBvaW50cy5maWx0ZXIoQm9vbGVhbikpLHZhbHVlczpwb2ludHMubWFwKChwLGkpPT5wPy5bZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5XT8/bnVsbCl9O30pOwogY29uc3QgdmFsdWVzPWVudHJpZXMuZmxhdE1hcChlPT5lLnZhbHVlcykuZmlsdGVyKHY9PnYhPW51bGwmJk51bWJlci5pc0Zpbml0ZSh2KSksY29tbW9uPXtsbzpNYXRoLm1pbigwLC4uLnZhbHVlcyksaGk6TWF0aC5tYXgoMSwuLi52YWx1ZXMpfTsKIGNvbnN0IHNjYWxlcz1zZXJpZXMubWFwKChzLGkpPT57aWYoIWR1YWxLZXlzKXJldHVybiBjb21tb247Y29uc3QgbGlzdD0obW9kZWwuYWxpZ25lZFdlZWtzVjEwfHxtb2RlbC5zaGFyZWRNZXRyaWNTY2FsZXNWMTI/ZW50cmllcy5mbGF0TWFwKGU9PmUudmFsdWVzLmZpbHRlcigodixqKT0+ZHVhbEtleXNbal09PT1kdWFsS2V5c1tpXSkpOmVudHJpZXMubWFwKGU9PmUudmFsdWVzW2ldKSkuZmlsdGVyKHY9PnYhPW51bGwmJk51bWJlci5pc0Zpbml0ZSh2KSk7cmV0dXJue2xvOk1hdGgubWluKDAsLi4ubGlzdCksaGk6TWF0aC5tYXgoLjAwMDAwMSwuLi5saXN0KX07fSk7CiBjb25zdCBzcGFjaW5nPWxhYmVscy5sZW5ndGg+MT8ocmlnaHQtbGVmdCkvKGxhYmVscy5sZW5ndGgtMSk6cmlnaHQtbGVmdCx4PWo9PmxhYmVscy5sZW5ndGg9PT0xPyhsZWZ0K3JpZ2h0KS8yOmxlZnQraipzcGFjaW5nLHk9KHYsaSk9PmJvdHRvbS0odi1zY2FsZXNbaV0ubG8pLyhzY2FsZXNbaV0uaGktc2NhbGVzW2ldLmxvfHwxKSooYm90dG9tLXRvcCk7CiBjb25zdCB0ZXh0cz1lbnRyaWVzLm1hcChlPT5lLnBlcmlvZC5mdWxsKycgfCAnK3Nlcmllcy5tYXAoKHMsaSk9PnMubmFtZSsnOiAnK3ZhbHVlVjQoZS52YWx1ZXNbaV0sZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5KSkuam9pbignIHwgJykpOwogY2hhcnRQb2ludHNWNC5zZXQoaWQsdGV4dHMpOwogY29uc3QgbWF4TGFiZWw9TWF0aC5tYXgoNDAsLi4udmFsdWVzLm1hcCgodik9PmNvbXBhY3QodixrZXl8fGR1YWxLZXlzPy5bMF0pLmxlbmd0aCo2KzE0KSk7CiBjb25zdCB2aXNpYmxlVmFsdWVzPW5ldyBTZXQoYWxsRGFpbHlMYWJlbHM/bGFiZWxzLm1hcCgoXyxpKT0+aSk6Y2hhcnRUaWNrSW5kZXhlc0xBKGxhYmVscy5sZW5ndGgsc3BhY2luZyxtYXhMYWJlbCkpOwogY29uc3QgYXhpc0luZGV4ZXM9Y2hhcnRUaWNrSW5kZXhlc0xBKGxhYmVscy5sZW5ndGgsc3BhY2luZyx3aWR0aDwzODA/ODU6MTAwKTsKIGNvbnN0IGxhYmVsUG9zaXRpb25zPWVudHJpZXMubWFwKGU9PnsKICBjb25zdCBwb3M9ZS52YWx1ZXMubWFwKCh2LGkpPT52PT1udWxsP251bGw6eSh2LGkpLTEzKTsKICBpZihzZXJpZXMubGVuZ3RoPT09MiYmZS52YWx1ZXMuZXZlcnkodj0+diE9bnVsbCkmJk1hdGguYWJzKHkoZS52YWx1ZXNbMF0sMCkteShlLnZhbHVlc1sxXSwxKSk8MjgpewogICBjb25zdCB1cHBlcj15KGUudmFsdWVzWzBdLDApPD15KGUudmFsdWVzWzFdLDEpPzA6MSxsb3dlcj0xLXVwcGVyOwogICBwb3NbdXBwZXJdPXkoZS52YWx1ZXNbdXBwZXJdLHVwcGVyKS0xNTtwb3NbbG93ZXJdPXkoZS52YWx1ZXNbbG93ZXJdLGxvd2VyKSsyMzsKICB9CiAgcmV0dXJuIHBvczsKIH0pOwogY29uc3QgbGFiZWxGb250PXBhY2tMYWJlbHM/MTA6MTEsbGFiZWxCb3hlcz1bXTsKIGlmKHBhY2tMYWJlbHMpewogIGNvbnN0IHNsb3RzPUFycmF5LmZyb20oe2xlbmd0aDpNYXRoLmZsb29yKChib3R0b20rMjItMTIpLzE1KSsxfSwoXyxpKT0+MTIraSoxNSk7CiAgZW50cmllcy5mb3JFYWNoKChlbnRyeSxqKT0+ewogICBpZighdmlzaWJsZVZhbHVlcy5oYXMoaikpcmV0dXJuOwogICBjb25zdCBvcmRlcmVkPWVudHJ5LnZhbHVlcy5tYXAoKHZhbHVlLGkpPT4oe3ZhbHVlLGl9KSkuZmlsdGVyKHA9PnAudmFsdWUhPW51bGwpLnNvcnQoKGEsYik9PnkoYS52YWx1ZSxhLmkpLXkoYi52YWx1ZSxiLmkpKTsKICAgZm9yKGNvbnN0e3ZhbHVlLGl9b2Ygb3JkZXJlZCl7CiAgICBjb25zdCB0ZXh0PWNvbXBhY3QodmFsdWUsZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5KSx3PXRleHQubGVuZ3RoKmxhYmVsRm9udCouNjIrNixhbmNob3I9aj09PTA/J3N0YXJ0JzpqPT09ZW50cmllcy5sZW5ndGgtMT8nZW5kJzonbWlkZGxlJyxsZWZ0RWRnZT14KGopLShhbmNob3I9PT0nZW5kJz93OmFuY2hvcj09PSdtaWRkbGUnP3cvMjowKSxkZXNpcmVkPXkodmFsdWUsaSktMTM7CiAgICBjb25zdCBjYW5kaWRhdGVzPVsuLi5zbG90c10uc29ydCgoYSxiKT0+TWF0aC5hYnMoYS1kZXNpcmVkKS1NYXRoLmFicyhiLWRlc2lyZWQpKTsKICAgIGNvbnN0IGNob3Nlbj1jYW5kaWRhdGVzLmZpbmQoY3k9PiFsYWJlbEJveGVzLnNvbWUoYm94PT5sZWZ0RWRnZTxib3gucmlnaHQmJmxlZnRFZGdlK3c+Ym94LmxlZnQmJmN5LTExPGJveC5ib3R0b20mJmN5KzM+Ym94LnRvcCkpOwogICAgY29uc3QgY3k9Y2hvc2VuPz9jYW5kaWRhdGVzWzBdO2xhYmVsUG9zaXRpb25zW2pdW2ldPWN5O2xhYmVsQm94ZXMucHVzaCh7bGVmdDpsZWZ0RWRnZSxyaWdodDpsZWZ0RWRnZSt3LHRvcDpjeS0xMSxib3R0b206Y3krMyxqLGl9KTsKICAgfQogIH0pOwogfQogY29uc3QgdGlja3M9WzAsLjUsMV0ubWFwKGY9Pntjb25zdCBjeT1ib3R0b20tZiooYm90dG9tLXRvcCk7cmV0dXJuIGA8bGluZSB4MT0iJHtsZWZ0fSIgeTE9IiR7Y3l9IiB4Mj0iJHtyaWdodH0iIHkyPSIke2N5fSIgc3Ryb2tlPSJ2YXIoLS1wbG90Z3JpZCkiIHN0cm9rZS1kYXNoYXJyYXk9IjMgNCIvPmArYXhlcy5tYXAoKG1ldHJpYyxhKT0+e2NvbnN0IHNjYWxlPXNjYWxlc1theGlzU2VyaWVzW2FdXSxjb2xvcj1heGVzLmxlbmd0aD4yP2NvbG9yc1theGlzU2VyaWVzW2FdJWNvbG9ycy5sZW5ndGhdOid2YXIoLS1wbG90dGV4dCknO3JldHVybiBgPHRleHQgZGF0YS1heGlzLW1ldHJpYy1sYT0iJHtlc2MobWV0cmljKX0iIHg9IiR7YT09PTA/bGVmdC04OnJpZ2h0KzgrKGEtMSkqNjJ9IiB5PSIke2N5KzR9IiAke2E9PT0wPyd0ZXh0LWFuY2hvcj0iZW5kIic6Jyd9IGZvbnQtc2l6ZT0iMTAiIGZpbGw9IiR7Y29sb3J9Ij4ke2VzYyhjb21wYWN0KHNjYWxlLmxvK2YqKHNjYWxlLmhpLXNjYWxlLmxvKSxtZXRyaWMpKX08L3RleHQ+YDt9KS5qb2luKCcnKTt9KS5qb2luKCcnKTsKIGNvbnN0IGxpbmVzPXNlcmllcy5tYXAoKHMsaSk9PnsKICBjb25zdCBtZXRyaWM9ZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5LHZhbGlkPWVudHJpZXMubWFwKChlLGopPT4oe2Usan0pKS5maWx0ZXIoKHtlfSk9PmUudmFsdWVzW2ldIT1udWxsKTsKICBjb25zdCBjb2xvcj1qPT50eXBlb2YgcmF0aW9LZXlzVjYhPT0ndW5kZWZpbmVkJyYmcmF0aW9LZXlzVjYuaW5jbHVkZXMobWV0cmljKT9wb2ludENvbG9yVjYoZW50cmllcyxqLGksbWV0cmljKTp0eXBlb2YgY2hhcnRTZXJpZXNDb2xvcnNWaXN1YWxMQT09PSdmdW5jdGlvbic/Y29sb3JzW2klY29sb3JzLmxlbmd0aF06WydwbycsJ3BvbicsJ2RldicsJ2JldCcsJ3ByaXplJywncHJvbW8nLCdvY2MnXS5pbmNsdWRlcyhtZXRyaWMpP2NvbG9yc1tpJWNvbG9ycy5sZW5ndGhdOnBvaW50Q29sb3JWNihlbnRyaWVzLGosaSxtZXRyaWMpOwogIGNvbnN0IHNlZ21lbnRzPVtdO2xldCBzZWdtZW50PVtdO2ZvcihsZXQgaj0wO2o8ZW50cmllcy5sZW5ndGg7aisrKXtpZihlbnRyaWVzW2pdLnZhbHVlc1tpXSE9bnVsbCl7c2VnbWVudC5wdXNoKHtlOmVudHJpZXNbal0san0pO31lbHNlIGlmKG1vZGVsLnBlcmlvZFYxMCYmc2VnbWVudC5sZW5ndGgpe3NlZ21lbnRzLnB1c2goc2VnbWVudCk7c2VnbWVudD1bXTt9fWlmKHNlZ21lbnQubGVuZ3RoKXNlZ21lbnRzLnB1c2goc2VnbWVudCk7CiAgY29uc3QgZGFzaD10eXBlb2Ygc2VyaWVzU3R5bGVWMTM9PT0nZnVuY3Rpb24nP3Nlcmllc1N0eWxlVjEzKG1vZGVsLGkpLmRhc2g6bW9kZWwuYWxpZ25lZFdlZWtzVjEwP1snJywnOCA0JywnMyAzJywnMTAgMyAyIDMnXVtNYXRoLmZsb29yKGkvKG1vZGVsLm1ldHJpY0NvdW50VjEwfHwxKSklNF06KGk9PT0xPyc3IDMnOicnKTsKICBjb25zdCBwYXRocz0obW9kZWwucGVyaW9kVjEwP3NlZ21lbnRzOlt2YWxpZF0pLm1hcChwYXJ0PT5gPHBvbHlsaW5lIGZpbGw9Im5vbmUiIHN0cm9rZT0iJHtjb2xvcnNbaSVjb2xvcnMubGVuZ3RoXX0iIHN0cm9rZS13aWR0aD0iMi41IiAke2Rhc2g/J3N0cm9rZS1kYXNoYXJyYXk9IicrZGFzaCsnIic6Jyd9IHBvaW50cz0iJHtwYXJ0Lm1hcCgoe2Usan0pPT5gJHt4KGopfSwke3koZS52YWx1ZXNbaV0saSl9YCkuam9pbignICcpfSIvPmApLmpvaW4oJycpOwogIHJldHVybiBwYXRocytgJHt2YWxpZC5tYXAoKHtlLGp9KT0+YCR7cGFja0xhYmVscyYmdmlzaWJsZVZhbHVlcy5oYXMoaikmJk1hdGguYWJzKGxhYmVsUG9zaXRpb25zW2pdW2ldLSh5KGUudmFsdWVzW2ldLGkpLTEzKSk+MTA/YDxsaW5lIHgxPSIke3goail9IiB5MT0iJHt5KGUudmFsdWVzW2ldLGkpfSIgeDI9IiR7eChqKX0iIHkyPSIke2xhYmVsUG9zaXRpb25zW2pdW2ldLTR9IiBzdHJva2U9IiR7Y29sb3Ioail9IiBzdHJva2Utb3BhY2l0eT0iLjM1Ii8+YDonJ308Y2lyY2xlIGN4PSIke3goail9IiBjeT0iJHt5KGUudmFsdWVzW2ldLGkpfSIgcj0iJHtzcGFjaW5nPDE4PzM6NX0iIGZpbGw9IiR7Y29sb3Ioail9IiBzdHJva2U9InZhcigtLXBsb3RiZykiIHN0cm9rZS13aWR0aD0iMS41IiB0YWJpbmRleD0iMCIgcm9sZT0iYnV0dG9uIiBkYXRhLWNoYXJ0djQ9IiR7aWR9IiBkYXRhLXBvaW50djQ9IiR7an0iIGFyaWEtbGFiZWw9IiR7ZXNjKHRleHRzW2pdKX0iPjx0aXRsZT4ke2VzYyh0ZXh0c1tqXSl9PC90aXRsZT48L2NpcmNsZT4keyhzZXJpZXMubGVuZ3RoPD0yfHxtb2RlbC5wZXJpb2RWMTApJiZ2aXNpYmxlVmFsdWVzLmhhcyhqKT9gPHRleHQgZGF0YS12YWx1ZS1sYWJlbC1sYT0iJHtqfS0ke2l9IiB4PSIke3goail9IiB5PSIke2xhYmVsUG9zaXRpb25zW2pdW2ldfSIgdGV4dC1hbmNob3I9IiR7cGFja0xhYmVscz8oaj09PTA/J3N0YXJ0JzpqPT09ZW50cmllcy5sZW5ndGgtMT8nZW5kJzonbWlkZGxlJyk6J21pZGRsZSd9IiBmb250LXNpemU9IiR7bGFiZWxGb250fSIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iJHtjb2xvcihqKX0iIHN0cm9rZT0idmFyKC0tcGxvdGJnKSIgc3Ryb2tlLXdpZHRoPSIzIiBwYWludC1vcmRlcj0ic3Ryb2tlIj4ke2VzYyhjb21wYWN0KGUudmFsdWVzW2ldLG1ldHJpYykpfTwvdGV4dD5gOicnfWApLmpvaW4oJycpfWA7CiB9KS5qb2luKCcnKTsKIGNvbnN0IHBlcmlvZHM9YXhpc0luZGV4ZXMubWFwKGo9Pntjb25zdCBlPWVudHJpZXNbal0sYW5jaG9yPWo9PT0wPydzdGFydCc6aj09PWVudHJpZXMubGVuZ3RoLTE/J2VuZCc6J21pZGRsZSc7cmV0dXJuIGA8dGV4dCB4PSIke3goail9IiB5PSIke2JvdHRvbSs0Mn0iIHRleHQtYW5jaG9yPSIke2FuY2hvcn0iIGZvbnQtc2l6ZT0iMTEiIGZvbnQtd2VpZ2h0PSI2MDAiIGZpbGw9InZhcigtLXBsb3R0ZXh0KSI+JHtheGlzUGVyaW9kVjE0KGUucGVyaW9kLmxhYmVsKS5yZXBsYWNlKCd4PSIwIicsJ3g9IicreChqKSsnIicpfTwvdGV4dD48dGV4dCB4PSIke3goail9IiB5PSIke2JvdHRvbSs4NX0iIHRleHQtYW5jaG9yPSIke2FuY2hvcn0iIGZvbnQtc2l6ZT0iOS41IiBmaWxsPSJ2YXIoLS1wbG90dGV4dCkiPiR7ZXNjKGF4aXNEYXRlc1YxNChlLnBlcmlvZC5yYW5nZSkpfTwvdGV4dD5gO30pLmpvaW4oJycpOwogY29uc3QgdmFsdWVUZXh0UGF0dGVybj0vPHRleHQgZGF0YS12YWx1ZS1sYWJlbC1sYT0iW14iXSsiW1xzXFNdKj88XC90ZXh0Pi9nLHZhbHVlVGV4dHM9bGluZXMubWF0Y2godmFsdWVUZXh0UGF0dGVybil8fFtdLGdlb21ldHJ5PWxpbmVzLnJlcGxhY2UodmFsdWVUZXh0UGF0dGVybiwnJyk7CiByZXR1cm57d2lkdGgsaGVpZ2h0LGlubmVyOnRpY2tzK2dlb21ldHJ5K3BlcmlvZHMrdmFsdWVUZXh0cy5qb2luKCcnKSxsYWJlbFBvc2l0aW9ucyxsYWJlbEJveGVzLGF4ZXMsc2NhbGVzLHZpc2libGVWYWx1ZXM6Wy4uLnZpc2libGVWYWx1ZXNdLGF4aXNJbmRleGVzLGVudHJpZXN9Owp9CmNvbnN0IGxhYmVsZWRDaGFydEJlZm9yZVJlc3BvbnNpdmVMQT1sYWJlbGVkQ2hhcnRWNDsKbGFiZWxlZENoYXJ0VjQ9ZnVuY3Rpb24oc2VyaWVzLGtleSxkdWFsS2V5cz1udWxsKXsKIGNvbnN0IGh0bWw9bGFiZWxlZENoYXJ0QmVmb3JlUmVzcG9uc2l2ZUxBKHNlcmllcyxrZXksZHVhbEtleXMpLGlkPWh0bWwubWF0Y2goL2lkPSIoY2hhcnR2NC1cZCspIi8pPy5bMV07CiBpZighaWQpcmV0dXJuIGh0bWw7cmVzcG9uc2l2ZUNoYXJ0TW9kZWxzTEEuc2V0KGlkLHtzZXJpZXMsa2V5LGR1YWxLZXlzLGlkfSk7CiByZXR1cm4gaHRtbC5yZXBsYWNlKCc8ZGl2IGNsYXNzPSJjaGFydHNjcm9sbCI+JywnPGRpdiBjbGFzcz0iY2hhcnRzY3JvbGwgcmVzcG9uc2l2ZUNoYXJ0TEEiIGRhdGEtcmVzcG9uc2l2ZS1jaGFydC1sYT0iJytpZCsnIj4nKTsKfTsKZnVuY3Rpb24gZml0UmVzcG9uc2l2ZUNoYXJ0c0xBKCl7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yZXNwb25zaXZlLWNoYXJ0LWxhXScpLmZvckVhY2goaG9zdD0+ewogIGNvbnN0IGlkPWhvc3QuZGF0YXNldC5yZXNwb25zaXZlQ2hhcnRMYSxtb2RlbD1yZXNwb25zaXZlQ2hhcnRNb2RlbHNMQS5nZXQoaWQpLHN2Zz1ob3N0LnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpO2lmKCFtb2RlbHx8IXN2ZylyZXR1cm47CiAgaWYoaG9zdC5jbG9zZXN0KCcuY2FyZCcpPy5oaWRkZW4pcmV0dXJuOwogIGNvbnN0IG1lYXN1cmVkPWhvc3QuY2xpZW50V2lkdGh8fGhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0Py4oKS53aWR0aHx8NjQwOwogIGNvbnN0IGxheW91dD1yZXNwb25zaXZlQ2hhcnRMYXlvdXRMQShtb2RlbCxtZWFzdXJlZCk7CiAgaWYoaG9zdC5kYXRhc2V0LmZpdFdpZHRoTGE9PT1TdHJpbmcobGF5b3V0LndpZHRoKSYmc3ZnLmRhdGFzZXQuZml0TGEpcmV0dXJuOwogIGhvc3QuZGF0YXNldC5maXRXaWR0aExhPVN0cmluZyhsYXlvdXQud2lkdGgpO3N2Zy5kYXRhc2V0LmZpdExhPSd0cnVlJztzdmcuc2V0QXR0cmlidXRlKCd2aWV3Qm94JyxgMCAwICR7bGF5b3V0LndpZHRofSAke2xheW91dC5oZWlnaHR9YCk7CiAgc3ZnLnN0eWxlLndpZHRoPScxMDAlJztzdmcuc3R5bGUubWluV2lkdGg9JzAnO3N2Zy5zdHlsZS5tYXhXaWR0aD0nMTAwJSc7c3ZnLnN0eWxlLmhlaWdodD1sYXlvdXQuaGVpZ2h0KydweCc7c3ZnLnNldEF0dHJpYnV0ZSgncHJlc2VydmVBc3BlY3RSYXRpbycsJ3hNaWRZTWlkIG1lZXQnKTtzdmcuaW5uZXJIVE1MPWxheW91dC5pbm5lcjsKICBjb25zdCByZWFkb3V0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtpZihyZWFkb3V0KXJlYWRvdXQudGV4dENvbnRlbnQ9J0dyw6FmaWNvIGNvbXBsZXRvIGFqdXN0YWRvIGFsIGFuY2hvLiBUb2NhIG8gZW5mb2NhIHVuIHB1bnRvIHBhcmEgdmVyIHN1IHBlcsOtb2RvIHkgdG9kb3MgbG9zIHZhbG9yZXMuIEVuIHNlbGVjY2lvbmVzIGV4dGVuc2FzIHNlIGVzcGFjaWFuIGxhcyBldGlxdWV0YXM7IGxhIHRhYmxhIGNvbnNlcnZhIHRvZG9zIGxvcyBkYXRvcy4nOwogIGNvbnN0IGxlZ2VuZD1ob3N0LmNsb3Nlc3QoJy5jYXJkJyk/LnF1ZXJ5U2VsZWN0b3JBbGwoJy5sYWJlbGVkbGVnZW5kIGknKSxwYWxldHRlPXR5cGVvZiBjaGFydFNlcmllc0NvbG9yc1Zpc3VhbExBPT09J2Z1bmN0aW9uJz9jaGFydFNlcmllc0NvbG9yc1Zpc3VhbExBKG1vZGVsKTpbJyMxNmE5YWUnLCcjNTQ3ZmM1JywnIzY3YTc4MicsJyNhNTg4YzInLCcjYzc4ZTQ1JywnI2Q2ODE3OCcsJyM1YTlmYTQnLCcjYTJhODY2J107bGVnZW5kPy5mb3JFYWNoKChpdGVtLGkpPT5pdGVtLnN0eWxlLmJhY2tncm91bmQ9cGFsZXR0ZVtpJXBhbGV0dGUubGVuZ3RoXSk7CiAgaWYodHlwZW9mIGRlY29yYXRlU2VyaWVzTGVnZW5kVjEzPT09J2Z1bmN0aW9uJylkZWNvcmF0ZVNlcmllc0xlZ2VuZFYxMyhob3N0LG1vZGVsKTsKIH0pOwp9CmxldCByZXNwb25zaXZlQ2hhcnRPYnNlcnZlckxBPW51bGw7CmlmKHR5cGVvZiBSZXNpemVPYnNlcnZlciE9PSd1bmRlZmluZWQnKXsKIHJlc3BvbnNpdmVDaGFydE9ic2VydmVyTEE9bmV3IFJlc2l6ZU9ic2VydmVyKCgpPT5maXRSZXNwb25zaXZlQ2hhcnRzTEEoKSk7CiByZXNwb25zaXZlQ2hhcnRPYnNlcnZlckxBLm9ic2VydmUoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWFpbicpKTsKfWVsc2Ugd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsZml0UmVzcG9uc2l2ZUNoYXJ0c0xBKTsKY29uc3QgcmVuZGVyQmVmb3JlUmVzcG9uc2l2ZUxBPXJlbmRlcjsKcmVuZGVyPWZ1bmN0aW9uKCl7cmVzcG9uc2l2ZUNoYXJ0TW9kZWxzTEEuY2xlYXIoKTtyZW5kZXJCZWZvcmVSZXNwb25zaXZlTEEoKTtpZihkYXRhKWZpdFJlc3BvbnNpdmVDaGFydHNMQSgpO307CgpmdW5jdGlvbiByZXBvcnRDaGFydFN0YXRlTEEodGl0bGVzKXsKIGNvbnN0IGtleT10YWI9PT0nQW7DoWxpc2lzIHBvciBwZXLDrW9kbyc/J3BlcmlvZEFuYWx5c2lzJzp0YWI9PT0nUmVwb3J0ZSBzZW1hbmFsJz8nd2Vla2x5JzonbW9udGhseScsc3RhdGU9dmlld1N0YXRlW2tleV07CiBpZighQXJyYXkuaXNBcnJheShzdGF0ZS5jaGFydFNlbGVjdGlvbikpewogIGxldCBzYXZlZDt0cnl7c2F2ZWQ9SlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnTEFfUkVQT1JUX0NIQVJUU18nK2tleSl8fCdudWxsJyl9Y2F0Y2goZSl7fQogIHN0YXRlLmNoYXJ0U2VsZWN0aW9uPUFycmF5LmlzQXJyYXkoc2F2ZWQ/LnNlbGVjdGlvbik/c2F2ZWQuc2VsZWN0aW9uLmZpbHRlcih0PT50aXRsZXMuaW5jbHVkZXModCkpOlsuLi50aXRsZXNdOwogIHN0YXRlLmNoYXJ0Q29sdW1ucz1bMSwyLDRdLmluY2x1ZGVzKHNhdmVkPy5jb2x1bW5zKT9zYXZlZC5jb2x1bW5zOjI7CiB9CiBzdGF0ZS5jaGFydENvbHVtbnM9WzEsMiw0XS5pbmNsdWRlcyhOdW1iZXIoc3RhdGUuY2hhcnRDb2x1bW5zKSk/TnVtYmVyKHN0YXRlLmNoYXJ0Q29sdW1ucyk6MjsKIHJldHVybiB7a2V5LHN0YXRlfTsKfQpmdW5jdGlvbiByZW1lbWJlclJlcG9ydENoYXJ0c0xBKGtleSxzdGF0ZSl7dHJ5e2xvY2FsU3RvcmFnZS5zZXRJdGVtKCdMQV9SRVBPUlRfQ0hBUlRTXycra2V5LEpTT04uc3RyaW5naWZ5KHtzZWxlY3Rpb246c3RhdGUuY2hhcnRTZWxlY3Rpb24sY29sdW1uczpzdGF0ZS5jaGFydENvbHVtbnN9KSl9Y2F0Y2goZSl7fX0KZnVuY3Rpb24gY29uZmlndXJlUmVwb3J0Q2hhcnRzTEEoKXsKIGlmKCFbJ1JlcG9ydGUgc2VtYW5hbCcsJ1JlcG9ydGUgbWVuc3VhbCcsJ0Fuw6FsaXNpcyBwb3IgcGVyw61vZG8nXS5pbmNsdWRlcyh0YWIpKXJldHVybjsKIGNvbnN0IGdyaWQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NvbnRlbnQgLnJlcG9ydGNoYXJ0cycpO2lmKCFncmlkfHxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVwb3J0Q2hhcnRzVG9vbGJhckxBJykpcmV0dXJuOwogY29uc3QgY2FyZHM9Wy4uLmdyaWQuY2hpbGRyZW5dLmZpbHRlcihlbD0+ZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdjYXJkJykpLHRpdGxlcz1jYXJkcy5tYXAoY2FyZD0+Y2FyZC5kYXRhc2V0LmNoYXJ0U2xvdFRpdGxlfHxjYXJkLnF1ZXJ5U2VsZWN0b3IoJ2gyJyk/LnRleHRDb250ZW50LnRyaW0oKXx8J0dyw6FmaWNvJyksZGlzcGxheVRpdGxlcz1jYXJkcy5tYXAoKGNhcmQsaSk9PihjYXJkLmRhdGFzZXQucGVyaW9kQ2hhcnRTbG90IT1udWxsPydHcsOhZmljbyAnKyhpKzEpKycgwrcgJzonJykrKGNhcmQucXVlcnlTZWxlY3RvcignaDInKT8udGV4dENvbnRlbnQudHJpbSgpfHx0aXRsZXNbaV0pKTsKIGNvbnN0IHtrZXksc3RhdGV9PXJlcG9ydENoYXJ0U3RhdGVMQSh0aXRsZXMpO2dyaWQuY2xhc3NMaXN0LmFkZCgncmVwb3J0Q2hhcnRHcmlkTEEnKTsKIGNvbnN0IHRvb2xiYXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO3Rvb2xiYXIuaWQ9J3JlcG9ydENoYXJ0c1Rvb2xiYXJMQSc7dG9vbGJhci5jbGFzc05hbWU9J3JlcG9ydENoYXJ0c1Rvb2xiYXJMQSc7CiB0b29sYmFyLmlubmVySFRNTD1gPGRpdiBjbGFzcz0iZHJvcGRvd25GaWVsZFYxMyI+PHNwYW4+R3LDoWZpY29zIHF1ZSBxdWllcmVzIHZlcjwvc3Bhbj48ZGV0YWlscyBjbGFzcz0iZXhjZWxEcm9wZG93blYxMyIgaWQ9InJlcG9ydENoYXJ0c01lbnVMQSI+PHN1bW1hcnk+PHNwYW4gaWQ9InJlcG9ydENoYXJ0c0NhcHRpb25MQSI+PC9zcGFuPjxiPuKWvjwvYj48L3N1bW1hcnk+PGRpdiBjbGFzcz0iZXhjZWxNZW51VjEzIj48ZGl2IGNsYXNzPSJkcm9wZG93bkFjdGlvbnNWMTMiPjxidXR0b24gdHlwZT0iYnV0dG9uIiBpZD0icmVwb3J0Q2hhcnRzQWxsTEEiPk1hcmNhciB0b2RvczwvYnV0dG9uPjxidXR0b24gdHlwZT0iYnV0dG9uIiBpZD0icmVwb3J0Q2hhcnRzTm9uZUxBIj5MaW1waWFyPC9idXR0b24+PC9kaXY+PGRpdiBjbGFzcz0icmVwb3J0Q2hhcnRDaGVja3NMQSI+JHt0aXRsZXMubWFwKCh0aXRsZSxpbmRleCk9PmA8bGFiZWwgY2xhc3M9ImNoZWNrSXRlbVYxMiI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBkYXRhLXJlcG9ydC1jaGFydC1sYT0iJHtpbmRleH0iICR7c3RhdGUuY2hhcnRTZWxlY3Rpb24uaW5jbHVkZXModGl0bGUpPydjaGVja2VkJzonJ30+PHNwYW4+JHtlc2MoZGlzcGxheVRpdGxlc1tpbmRleF0pfTwvc3Bhbj48L2xhYmVsPmApLmpvaW4oJycpfTwvZGl2PjxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0icHJpbWFyeSIgaWQ9InJlcG9ydENoYXJ0c0FwcGx5TEEiPkFwbGljYXIgc2VsZWNjacOzbjwvYnV0dG9uPjwvZGl2PjwvZGV0YWlscz48L2Rpdj48bGFiZWw+RGlzdHJpYnVjacOzbjxzZWxlY3QgaWQ9InJlcG9ydENoYXJ0Q29sdW1uc0xBIj48b3B0aW9uIHZhbHVlPSIxIj4xIGdyw6FmaWNvIHBvciBmaWxhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iMiI+MiBwb3IgZmlsYSDCtyBjdWF0cm8gZW4gZG9zIGZpbGFzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iNCI+NCBwb3IgZmlsYSDCtyBwYW50YWxsYSBhbXBsaWE8L29wdGlvbj48L3NlbGVjdD48L2xhYmVsPjxzcGFuIGlkPSJyZXBvcnRDaGFydHNDb3VudExBIiBhcmlhLWxpdmU9InBvbGl0ZSI+PC9zcGFuPmA7CiBncmlkLmJlZm9yZSh0b29sYmFyKTskKCcjcmVwb3J0Q2hhcnRDb2x1bW5zTEEnKS52YWx1ZT1TdHJpbmcoc3RhdGUuY2hhcnRDb2x1bW5zKTsKIGNvbnN0IGVtcHR5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO2VtcHR5LmNsYXNzTmFtZT0ncmVwb3J0Q2hhcnRFbXB0eUxBJztlbXB0eS50ZXh0Q29udGVudD0nTWFyY2EgdW5vIG8gdmFyaW9zIGdyw6FmaWNvcyBlbiBlbCBtZW7DuiBwYXJhIG1vc3RyYXJsb3MuJztncmlkLmFmdGVyKGVtcHR5KTsKIGZ1bmN0aW9uIGFwcGx5KCl7CiAgbGV0IHZpc2libGU9MDtjYXJkcy5mb3JFYWNoKChjYXJkLGluZGV4KT0+e2NhcmQuaGlkZGVuPSFzdGF0ZS5jaGFydFNlbGVjdGlvbi5pbmNsdWRlcyh0aXRsZXNbaW5kZXhdKTtpZighY2FyZC5oaWRkZW4pdmlzaWJsZSsrO30pOwogIGdyaWQuZGF0YXNldC5jb2x1bW5zPVN0cmluZyhzdGF0ZS5jaGFydENvbHVtbnMpO2dyaWQuaGlkZGVuPSF2aXNpYmxlO2VtcHR5LmhpZGRlbj0hIXZpc2libGU7CiAgJCgnI3JlcG9ydENoYXJ0c0NhcHRpb25MQScpLnRleHRDb250ZW50PXZpc2libGUrJyBkZSAnK2NhcmRzLmxlbmd0aCsnIHNlbGVjY2lvbmFkb3MnOyQoJyNyZXBvcnRDaGFydHNDb3VudExBJykudGV4dENvbnRlbnQ9dmlzaWJsZSsnIGdyw6FmaWNvcyB2aXNpYmxlcyDCtyBlbCBkZXRhbGxlIGRlbCBpbmZvcm1lIHNlIGNvbnNlcnZhIGFiYWpvJzsKICBncmlkLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXJlc3BvbnNpdmUtY2hhcnQtbGFdJykuZm9yRWFjaChob3N0PT5ob3N0LmRhdGFzZXQuZml0V2lkdGhMYT0nJyk7Zml0UmVzcG9uc2l2ZUNoYXJ0c0xBKCk7cmVtZW1iZXJSZXBvcnRDaGFydHNMQShrZXksc3RhdGUpOwogfQogJCgnI3JlcG9ydENoYXJ0c0FsbExBJykub25jbGljaz0oKT0+dG9vbGJhci5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yZXBvcnQtY2hhcnQtbGFdJykuZm9yRWFjaChpbnB1dD0+aW5wdXQuY2hlY2tlZD10cnVlKTsKICQoJyNyZXBvcnRDaGFydHNOb25lTEEnKS5vbmNsaWNrPSgpPT50b29sYmFyLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXJlcG9ydC1jaGFydC1sYV0nKS5mb3JFYWNoKGlucHV0PT5pbnB1dC5jaGVja2VkPWZhbHNlKTsKICQoJyNyZXBvcnRDaGFydHNBcHBseUxBJykub25jbGljaz0oKT0+e3N0YXRlLmNoYXJ0U2VsZWN0aW9uPVsuLi50b29sYmFyLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXJlcG9ydC1jaGFydC1sYV06Y2hlY2tlZCcpXS5tYXAoaW5wdXQ9PnRpdGxlc1tOdW1iZXIoaW5wdXQuZGF0YXNldC5yZXBvcnRDaGFydExhKV0pOyQoJyNyZXBvcnRDaGFydHNNZW51TEEnKS5vcGVuPWZhbHNlO2FwcGx5KCk7fTsKICQoJyNyZXBvcnRDaGFydENvbHVtbnNMQScpLm9uY2hhbmdlPWU9PntzdGF0ZS5jaGFydENvbHVtbnM9TnVtYmVyKGUudGFyZ2V0LnZhbHVlKTthcHBseSgpO307CiAvLyBLZWVwIHRoZSBleGFjdCBkYXRhIGF0IGhhbmQgd2l0aG91dCBtYWtpbmcgZWFjaCBjaGFydCBjYXJkIHVubmVjZXNzYXJpbHkgdGFsbC4KIGNhcmRzLmZvckVhY2goKGNhcmQsaW5kZXgpPT57CiAgY29uc3QgdmFsdWVzPWNhcmQucXVlcnlTZWxlY3RvcignLmNoYXJ0ZGF0YXdyYXAnKTtpZighdmFsdWVzKXJldHVybjsKICBzdGF0ZS5jaGFydFZhbHVlc09wZW4/Pz17fTtjb25zdCBkZXRhaWxzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtkZXRhaWxzLmNsYXNzTmFtZT0ncmVwb3J0Q2hhcnRWYWx1ZXNMQSc7CiAgY29uc3Qgc3VtbWFyeT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7c3VtbWFyeS50ZXh0Q29udGVudD0nVmVyIHZhbG9yZXMgZXhhY3Rvcyc7ZGV0YWlscy5hcHBlbmRDaGlsZChzdW1tYXJ5KTsKICBjb25zdCBzZWFyY2g9dmFsdWVzLnByZXZpb3VzRWxlbWVudFNpYmxpbmc/LmNsYXNzTGlzdC5jb250YWlucygndGFibGVTZWFyY2hMQScpP3ZhbHVlcy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOm51bGw7CiAgdmFsdWVzLmJlZm9yZShkZXRhaWxzKTtpZihzZWFyY2gpZGV0YWlscy5hcHBlbmRDaGlsZChzZWFyY2gpO2RldGFpbHMuYXBwZW5kQ2hpbGQodmFsdWVzKTtkZXRhaWxzLm9wZW49ISFzdGF0ZS5jaGFydFZhbHVlc09wZW5bdGl0bGVzW2luZGV4XV07CiAgZGV0YWlscy5hZGRFdmVudExpc3RlbmVyKCd0b2dnbGUnLCgpPT57c3RhdGUuY2hhcnRWYWx1ZXNPcGVuW3RpdGxlc1tpbmRleF1dPWRldGFpbHMub3Blbjt9KTsKIH0pOwogYXBwbHkoKTsKfQpjb25zdCByZW5kZXJCZWZvcmVSZXBvcnRTZWxlY3RvckxBPXJlbmRlcjsKcmVuZGVyPWZ1bmN0aW9uKCl7cmVuZGVyQmVmb3JlUmVwb3J0U2VsZWN0b3JMQSgpO2lmKGRhdGEpY29uZmlndXJlUmVwb3J0Q2hhcnRzTEEoKTt9Owpjb25zdCBleHBvcnRCZWZvcmVSZXBvcnRTZWxlY3RvckxBPSQoJyN2MmV4cG9ydCcpLm9uY2xpY2s7CiQoJyN2MmV4cG9ydCcpLm9uY2xpY2s9ZnVuY3Rpb24oKXsKIGlmKCFbJ1JlcG9ydGUgc2VtYW5hbCcsJ1JlcG9ydGUgbWVuc3VhbCddLmluY2x1ZGVzKHRhYikpcmV0dXJuIGV4cG9ydEJlZm9yZVJlcG9ydFNlbGVjdG9yTEEoKTsKIGNvbnN0IGtleT10YWI9PT0nUmVwb3J0ZSBzZW1hbmFsJz8nd2Vla2x5JzonbW9udGhseScscz12aWV3U3RhdGVba2V5XTsKIGNvbnN0IHNoZWV0cz1be25hbWU6J0RhdG9zJyxyb3dzOmV4cG9ydFJvd3N9LHtuYW1lOidDb25zdWx0YScscm93czpbWydQYXLDoW1ldHJvJywnU2VsZWNjacOzbiddLFsnSW5mb3JtZScsdGFiXSxbJ0ZlY2hhcycsc2VsZWN0ZWREYXRlVGV4dFY4KCdnbG9iYWwnKV0sWydGaWx0cm9zJyxKU09OLnN0cmluZ2lmeShzLmZpbHRlcnMpXSxbJ0dyw6FmaWNvcyB2aXNpYmxlcycsKHMuY2hhcnRTZWxlY3Rpb258fFtdKS5qb2luKCcgLyAnKV0sWydEaXN0cmlidWNpw7NuJyxzLmNoYXJ0Q29sdW1ucysnIHBvciBmaWxhJ10sWydDb250ZW5pZG8nLCdEYXRvcyBjb25zZXJ2YSB0b2RvcyBsb3MgaW5kaWNhZG9yZXMgZGVsIGluZm9ybWU7IGxhcyB0YWJsYXMgZGUgZ3LDoWZpY29zIGluY2x1eWVuIHNvbG8gbG9zIHNlbGVjY2lvbmFkb3MuJ11dfV07CiBsZXQgaW5kZXg9MTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY29udGVudCB0YWJsZScpLmZvckVhY2godGFibGU9PntpZih0YWJsZS5jbG9zZXN0KCcucmVwb3J0Q2hhcnRHcmlkTEE+LmNhcmRbaGlkZGVuXScpKXJldHVybjtjb25zdCByb3dzPVsuLi50YWJsZS5yb3dzXS5tYXAocm93PT5bLi4ucm93LmNlbGxzXS5tYXAoY2VsbD0+KGNlbGwuaW5uZXJUZXh0fHxjZWxsLnRleHRDb250ZW50KS50cmltKCkpKTtpZihyb3dzLmxlbmd0aClzaGVldHMucHVzaCh7bmFtZTonVGFibGEgJytpbmRleCsrLHJvd3N9KTt9KTsKIGRvd25sb2FkQmxvYlY4KHdvcmtib29rQmxvYlY4KHNoZWV0cyksJ0xBLScra2V5KycueGxzeCcpOwp9OwoKbGV0IG1hdHJpeEluZGV4TEE9bnVsbCx3ZWVrTGFiZWxDYWNoZUxBPW51bGw7CmZ1bmN0aW9uIG1hdHJpeEluZGV4RmFzdExBKCl7CiBpZihtYXRyaXhJbmRleExBPy5tYXRyaXg9PT1kYXRhKXJldHVybiBtYXRyaXhJbmRleExBOwogY29uc3QgZGF0ZXM9bmV3IFNldCgpLGNhdGVnb3JpZXM9bmV3IE1hcChPYmplY3Qua2V5cyhkaW1zKS5tYXAoaz0+W051bWJlcihrKSxuZXcgU2V0KCldKSk7CiBmb3IoY29uc3QgciBvZiBkYXRhLnJvd3Mpe2RhdGVzLmFkZChyWzBdKTtmb3IoY29uc3Rbayx2YWx1ZXNdb2YgY2F0ZWdvcmllcyl2YWx1ZXMuYWRkKFN0cmluZyhyW2tdPz8nU2luIGRhdG8nKSk7fQogbWF0cml4SW5kZXhMQT17bWF0cml4OmRhdGEsZGF0ZXM6Wy4uLmRhdGVzXS5zb3J0KCksY2F0ZWdvcmllczpuZXcgTWFwKFsuLi5jYXRlZ29yaWVzXS5tYXAoKFtrLHZdKT0+W2ssWy4uLnZdLmZpbHRlcih4PT4haXNFeHBpcmVkKHgpKS5zb3J0KChhLGIpPT5hLmxvY2FsZUNvbXBhcmUoYix1bmRlZmluZWQse251bWVyaWM6dHJ1ZX0pKV0pKX07cmV0dXJuIG1hdHJpeEluZGV4TEE7Cn0KY29uc3Qgd2Vla051bWJlckJlZm9yZUZhc3RMQT13ZWVrTnVtYmVyVjgsd2Vla051bWJlckNhY2hlTEE9bmV3IE1hcCgpOwp3ZWVrTnVtYmVyVjg9ZnVuY3Rpb24oZGF0ZSl7aWYoIXdlZWtOdW1iZXJDYWNoZUxBLmhhcyhkYXRlKSl3ZWVrTnVtYmVyQ2FjaGVMQS5zZXQoZGF0ZSx3ZWVrTnVtYmVyQmVmb3JlRmFzdExBKGRhdGUpKTtyZXR1cm4gd2Vla051bWJlckNhY2hlTEEuZ2V0KGRhdGUpO307CmNvbnN0IG9wdGlvbnNCZWZvcmVGYXN0TEE9b3B0aW9uc0ZvcjsKb3B0aW9uc0Zvcj1mdW5jdGlvbihrKXtyZXR1cm4gZGF0YT9tYXRyaXhJbmRleEZhc3RMQSgpLmNhdGVnb3JpZXMuZ2V0KE51bWJlcihrKSl8fFtdOm9wdGlvbnNCZWZvcmVGYXN0TEEoayk7fTsKbW9udGhDaG9pY2VzVjg9ZnVuY3Rpb24oKXtyZXR1cm4gWy4uLm5ldyBTZXQobWF0cml4SW5kZXhGYXN0TEEoKS5kYXRlcy5tYXAoZD0+ZC5zbGljZSgwLDcpKSldO307CmZ1bmN0aW9uIHdlZWtMYWJlbEZhc3RMQSh5ZWFyLHdlZWspewogaWYoIWRhdGEpcmV0dXJuIHdlZWtMYWJlbFY4KHllYXIsd2VlayxbXSk7CiBjb25zdCBzaWduYXR1cmU9KCQoJyNmcm9tJyk/LnZhbHVlfHwnJykrJ3wnKygkKCcjdG8nKT8udmFsdWV8fCcnKSsnfCcrSlNPTi5zdHJpbmdpZnkodmlld1N0YXRlLmNhbGVuZGFycz8uZ2xvYmFsfHx7fSk7CiBpZih3ZWVrTGFiZWxDYWNoZUxBPy5tYXRyaXghPT1kYXRhfHx3ZWVrTGFiZWxDYWNoZUxBLnNpZ25hdHVyZSE9PXNpZ25hdHVyZSl7CiAgY29uc3QgZGF0ZXM9bmV3IFNldChzbGljZVJvd3MoKS5tYXAocj0+clswXSkpLG1hcD1uZXcgTWFwKCk7Zm9yKGNvbnN0IGRhdGUgb2YgWy4uLmRhdGVzXS5zb3J0KCkpe2NvbnN0IGtleT1kYXRlLnNsaWNlKDAsNCkrJ3wnK3dlZWtOdW1iZXJWOChkYXRlKTtpZighbWFwLmhhcyhrZXkpKW1hcC5zZXQoa2V5LG5ldyBTZXQoKSk7bWFwLmdldChrZXkpLmFkZChtb250aFNob3J0VjhbTnVtYmVyKGRhdGUuc2xpY2UoNSw3KSktMV0pO30KICB3ZWVrTGFiZWxDYWNoZUxBPXttYXRyaXg6ZGF0YSxzaWduYXR1cmUsbWFwfTsKIH0KIGNvbnN0IG1vbnRocz13ZWVrTGFiZWxDYWNoZUxBLm1hcC5nZXQoeWVhcisnfCcrTnVtYmVyKHdlZWspKTtyZXR1cm4gbW9udGhzP1suLi5tb250aHNdLmpvaW4oJy8nKSsnLScrTnVtYmVyKHdlZWspKycgwrcgJyt5ZWFyOndlZWtMYWJlbFY4KHllYXIsd2VlayxbXSk7Cn0KY29uc3Qgc2xpY2VCZWZvcmVGYXN0TEE9c2xpY2VSb3dzLGFnZ3JlZ2F0ZUJlZm9yZUZhc3RMQT1hZ2c7CmxldCBzbGljZUNhY2hlRmFzdExBPW5ldyBNYXAoKSxhZ2dyZWdhdGVDYWNoZUZhc3RMQT1uZXcgV2Vha01hcCgpOwpzbGljZVJvd3M9ZnVuY3Rpb24oZmlsdGVycz17fSxmcm9tPSQoJyNmcm9tJykudmFsdWUsdG89JCgnI3RvJykudmFsdWUpewogY29uc3Qgc2NvcGU9ZmlsdGVycz09PXZpZXdTdGF0ZS5BLmZpbHRlcnM/J0EnOmZpbHRlcnM9PT12aWV3U3RhdGUuQi5maWx0ZXJzPydCJzonZ2xvYmFsJzsKIGNvbnN0IGtleT1zY29wZSsnfCcrZnJvbSsnfCcrdG8rJ3wnK0pTT04uc3RyaW5naWZ5KGZpbHRlcnMpKyd8JytKU09OLnN0cmluZ2lmeSh2aWV3U3RhdGUuY2FsZW5kYXJzPy5bc2NvcGVdfHx7fSk7CiBpZighc2xpY2VDYWNoZUZhc3RMQS5oYXMoa2V5KSlzbGljZUNhY2hlRmFzdExBLnNldChrZXksc2xpY2VCZWZvcmVGYXN0TEEoZmlsdGVycyxmcm9tLHRvKSk7cmV0dXJuIHNsaWNlQ2FjaGVGYXN0TEEuZ2V0KGtleSk7Cn07CmFnZz1mdW5jdGlvbihyb3dzKXtpZighYWdncmVnYXRlQ2FjaGVGYXN0TEEuaGFzKHJvd3MpKWFnZ3JlZ2F0ZUNhY2hlRmFzdExBLnNldChyb3dzLGFnZ3JlZ2F0ZUJlZm9yZUZhc3RMQShyb3dzKSk7cmV0dXJuey4uLmFnZ3JlZ2F0ZUNhY2hlRmFzdExBLmdldChyb3dzKX07fTsKY29uc3QgcHJlZmVyZW5jaWFsQ2FjaGVMQT1uZXcgV2Vha01hcCgpLHByZWZlcmVuY2lhbEJlZm9yZUZhc3RMQT1wcmVmZXJlbmNpYWw7CnByZWZlcmVuY2lhbD1mdW5jdGlvbihyb3cpe2lmKCFwcmVmZXJlbmNpYWxDYWNoZUxBLmhhcyhyb3cpKXByZWZlcmVuY2lhbENhY2hlTEEuc2V0KHJvdyxwcmVmZXJlbmNpYWxCZWZvcmVGYXN0TEEocm93KSk7cmV0dXJuIHByZWZlcmVuY2lhbENhY2hlTEEuZ2V0KHJvdyk7fTsKd2Vla0NoZWNrc1YxMj1mdW5jdGlvbihzY29wZSxtb250aHMsc2VsZWN0ZWRXZWVrcyl7CiBjb25zdCBzZWxlY3RlZD1tb250aHMubGVuZ3RoP21vbnRoczptb250aENob2ljZXNWOCgpLGRhdGVzPW1hdHJpeEluZGV4RmFzdExBKCkuZGF0ZXM7CiByZXR1cm4gc2VsZWN0ZWQubWFwKG1vbnRoPT57CiAgY29uc3Qgd2Vla3M9bmV3IE1hcCgpO2Zvcihjb25zdCBkYXRlIG9mIGRhdGVzKXtpZighZGF0ZS5zdGFydHNXaXRoKG1vbnRoKSljb250aW51ZTtjb25zdCB3PXdlZWtOdW1iZXJWOChkYXRlKTtpZighd2Vla3MuaGFzKHcpKXdlZWtzLnNldCh3LFtdKTt3ZWVrcy5nZXQodykucHVzaChkYXRlKTt9CiAgcmV0dXJuIGA8ZGl2IGNsYXNzPSJ3ZWVrTW9udGhWMTIiPjxiPiR7ZGlzcGxheURhdGVzVjUobW9udGgpfTwvYj4ke1suLi53ZWVrc10uc29ydCgoYSxiKT0+YVswXS1iWzBdKS5tYXAoKFt3LGRheXNdKT0+e2NvbnN0IHZhbHVlPW1vbnRoKyd8Jyt3O3JldHVybiBgPGxhYmVsIGNsYXNzPSJjaGVja0l0ZW1WMTIiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGF0YS13ZWVrY2hlY2s9IiR7c2NvcGV9IiB2YWx1ZT0iJHt2YWx1ZX0iICR7c2VsZWN0ZWRXZWVrcy5pbmNsdWRlcyh2YWx1ZSk/J2NoZWNrZWQnOicnfT48c3Bhbj4ke21vbnRoU2hvcnRWOFtOdW1iZXIobW9udGguc2xpY2UoNSkpLTFdfS0ke3d9IMK3ICR7bW9udGguc2xpY2UoMCw0KX08c21hbGw+JHtkaXNwbGF5RGF0ZXNWNShkYXlzWzBdKX0g4oaSICR7ZGlzcGxheURhdGVzVjUoZGF5cy5hdCgtMSkpfTwvc21hbGw+PC9zcGFuPjwvbGFiZWw+YDt9KS5qb2luKCcnKX08L2Rpdj5gOwogfSkuam9pbignJyk7Cn07CmNvbnN0IHJlbmRlckJlZm9yZUZhc3RMQT1yZW5kZXI7CnJlbmRlcj1mdW5jdGlvbigpe3NsaWNlQ2FjaGVGYXN0TEE9bmV3IE1hcCgpO2FnZ3JlZ2F0ZUNhY2hlRmFzdExBPW5ldyBXZWFrTWFwKCk7cmVuZGVyQmVmb3JlRmFzdExBKCk7fTsKCi8vIE5vcm1hbGl6ZSBieSBvYnNlcnZlZCBkYXRlcyBhbmQgbWFjaGluZS1kYXlzOyBhYnNlbmNlIGlzIG5ldmVyIHplcm8gYWN0aXZpdHkuCmZ1bmN0aW9uIGRhaWx5UGFya0xBKHJvd3MpewogY29uc3QgbWFwPW5ldyBNYXAoKTtmb3IoY29uc3QgciBvZiByb3dzKXtjb25zdCBpZD1TdHJpbmcoclsxXT8/JycpLnRyaW0oKTtpZighaWQpY29udGludWU7Y29uc3Qga2V5PUpTT04uc3RyaW5naWZ5KFtyWzBdLGlkXSk7aWYoIW1hcC5oYXMoa2V5KSltYXAuc2V0KGtleSx7aWQsZGF0ZTpyWzBdLGNvaW46MCx3aW46MCxzcGluOjAscHJpemU6MCxwcm9tbzowLHByb21vdGVkOmZhbHNlLGxvY2F0aW9uczpuZXcgU2V0KCl9KTtjb25zdCBkPW1hcC5nZXQoa2V5KTtmb3IoY29uc3RbayxpXW9mIFtbJ2NvaW4nLDE4XSxbJ3dpbicsMTZdLFsnc3BpbicsMjBdLFsncHJpemUnLDE1XV0pZFtrXSs9bnVtKHJbaV0pO2QucHJvbW8rPW51bShyWzI2XSktbnVtKHJbMjddKTtkLnByb21vdGVkfHw9bnVtKHJbMjZdKSE9PTB8fG51bShyWzI3XSkhPT0wO2QubG9jYXRpb25zLmFkZChKU09OLnN0cmluZ2lmeShbcls5XT8/Jycscls1XT8/Jycscls3XT8/JyddKSk7fXJldHVybiBbLi4ubWFwLnZhbHVlcygpXTsKfQpmdW5jdGlvbiB3ZWVrZGF5UGFya0xBKHJvd3MpewogY29uc3QgbmFtZXM9WydMdW5lcycsJ01hcnRlcycsJ01pw6lyY29sZXMnLCdKdWV2ZXMnLCdWaWVybmVzJywnU8OhYmFkbycsJ0RvbWluZ28nXSxsaXN0PW5hbWVzLm1hcChuYW1lPT4oe25hbWUscm93czpbXSxkYXRlczpuZXcgU2V0KCl9KSk7Zm9yKGNvbnN0IHIgb2Ygcm93cyl7Y29uc3QgaT0obmV3IERhdGUoclswXSsnVDEyOjAwOjAwWicpLmdldFVUQ0RheSgpKzYpJTc7aWYoIWxpc3RbaV0pY29udGludWU7bGlzdFtpXS5yb3dzLnB1c2gocik7bGlzdFtpXS5kYXRlcy5hZGQoclswXSk7fXJldHVybiBsaXN0Lm1hcChnPT57Y29uc3QgYT1hZ2coZy5yb3dzKTtyZXR1cm57bmFtZTpnLm5hbWUsLi4uYSxjYWxlbmRhckRheXM6Zy5kYXRlcy5zaXplLHdpbkRhdGU6ZGl2KGEud2luLGcuZGF0ZXMuc2l6ZSksY29pbkRhdGU6ZGl2KGEuY29pbixnLmRhdGVzLnNpemUpfTt9KTsKfQpmdW5jdGlvbiBzdGFiaWxpdHlQYXJrTEEoZGF5cyxtaW5EYXlzPTcpewogY29uc3QgbWFwPW5ldyBNYXAoKTtmb3IoY29uc3QgZCBvZiBkYXlzKXtpZighbWFwLmhhcyhkLmlkKSltYXAuc2V0KGQuaWQsW10pO21hcC5nZXQoZC5pZCkucHVzaChkKTt9cmV0dXJuIFsuLi5tYXBdLm1hcCgoW2lkLGxpc3RdKT0+e2NvbnN0IGNvdW50PWxpc3QubGVuZ3RoLG1lYW49bGlzdC5yZWR1Y2UoKHMsZCk9PnMrZC5jb2luLDApL2NvdW50LHNkPU1hdGguc3FydChsaXN0LnJlZHVjZSgocyxkKT0+cysoZC5jb2luLW1lYW4pKioyLDApL2NvdW50KSxwb3NpdGl2ZVdpbj1saXN0LnJlZHVjZSgocyxkKT0+cytNYXRoLm1heCgwLGQud2luKSwwKTtyZXR1cm57aWQsY291bnQsbWVhbixzZCxjdjpjb3VudD49bWluRGF5cyYmbWVhbj4wP3NkL21lYW46bnVsbCxiZXN0V2luU2hhcmU6cG9zaXRpdmVXaW4/TWF0aC5tYXgoLi4ubGlzdC5tYXAoZD0+TWF0aC5tYXgoMCxkLndpbikpKS9wb3NpdGl2ZVdpbjpudWxsLHdpbjpsaXN0LnJlZHVjZSgocyxkKT0+cytkLndpbiwwKX07fSkuc29ydCgoYSxiKT0+KGIuY3Y/Py0xKS0oYS5jdj8/LTEpKTsKfQpmdW5jdGlvbiBhY3Rpdml0eVBhcmtMQShkYXlzLHBhcmtEYXRlcyx0aHJlc2hvbGQ9MC4yNSl7CiBjb25zdCBtYXA9bmV3IE1hcCgpO2Zvcihjb25zdCBkIG9mIGRheXMpe2lmKCFtYXAuaGFzKGQuaWQpKW1hcC5zZXQoZC5pZCxbXSk7bWFwLmdldChkLmlkKS5wdXNoKGQpO31yZXR1cm4gWy4uLm1hcF0ubWFwKChbaWQsbGlzdF0pPT57bGlzdC5zb3J0KChhLGIpPT5hLmRhdGUubG9jYWxlQ29tcGFyZShiLmRhdGUpKTtjb25zdCB2YWx1ZXM9bGlzdC5maWx0ZXIoZD0+ZC5jb2luPjApLm1hcChkPT5kLmNvaW4pLnNvcnQoKGEsYik9PmEtYiksbj12YWx1ZXMubGVuZ3RoLG1lZGlhbj1uPyh2YWx1ZXNbTWF0aC5mbG9vcihuLzIpXSt2YWx1ZXNbTWF0aC5jZWlsKG4vMiktMV0pLzI6MCxmaXJzdD1saXN0WzBdLmRhdGUsbGFzdD1saXN0LmF0KC0xKS5kYXRlO3JldHVybntpZCxmaXJzdCxsYXN0LGRheXM6bGlzdC5sZW5ndGgsbWlzc2luZzpwYXJrRGF0ZXMuZmlsdGVyKGQ9PmQ+PWZpcnN0JiZkPD1sYXN0KS5sZW5ndGgtbGlzdC5sZW5ndGgsemVybzpsaXN0LmZpbHRlcihkPT5kLmNvaW49PT0wJiZkLnNwaW49PT0wKS5sZW5ndGgsbG93Om1lZGlhbj9saXN0LmZpbHRlcihkPT5kLmNvaW4+MCYmZC5jb2luPG1lZGlhbip0aHJlc2hvbGQpLmxlbmd0aDowLG1lZGlhbn07fSkuc29ydCgoYSxiKT0+KGIubWlzc2luZytiLnplcm8rYi5sb3cpLShhLm1pc3NpbmcrYS56ZXJvK2EubG93KSk7Cn0KZnVuY3Rpb24gcHJvbW90aW9uUGFya0xBKGRheXMpe3JldHVybiBbdHJ1ZSxmYWxzZV0ubWFwKHByb21vdGVkPT57Y29uc3QgYT17bmFtZTpwcm9tb3RlZD8nQ29uIG1vdmltaWVudG9zIHByb21vY2lvbmFsZXMnOidTaW4gbW92aW1pZW50b3MgcHJvbW9jaW9uYWxlcycsZGF5czowLGNvaW46MCx3aW46MCxzcGluOjAscHJvbW86MH07Zm9yKGNvbnN0IGQgb2YgZGF5cylpZihkLnByb21vdGVkPT09cHJvbW90ZWQpe2EuZGF5cysrO2Zvcihjb25zdCBrIG9mIFsnY29pbicsJ3dpbicsJ3NwaW4nLCdwcm9tbyddKWFba10rPWRba107fXJldHVybnsuLi5hLGNkOmRpdihhLmNvaW4sYS5kYXlzKSx3ZDpkaXYoYS53aW4sYS5kYXlzKSxzZDpkaXYoYS5zcGluLGEuZGF5cykscG86YS5jb2luPzEtYS53aW4vYS5jb2luOm51bGwscG9uOmEuY29pbj8xLShhLndpbithLnByb21vKS9hLmNvaW46bnVsbH07fSk7fQpmdW5jdGlvbiBwYXJldG9QYXJrTEEocm93cyxrZXksbWV0cmljKXtjb25zdCBsaXN0PWdyb3Vwcyhyb3dzLHI9PlN0cmluZyhyW2tleV0/PydTaW4gaWRlbnRpZmljYWNpw7NuJykpLnNvcnQoKGEsYik9PmJbbWV0cmljXS1hW21ldHJpY10pLGJhc2U9bGlzdC5yZWR1Y2UoKHMsZyk9PnMrTWF0aC5tYXgoMCxnW21ldHJpY10pLDApO2xldCBjdW11bGF0aXZlPTA7cmV0dXJuIGxpc3QubWFwKGc9Pntjb25zdCBzaGFyZT1iYXNlP01hdGgubWF4KDAsZ1ttZXRyaWNdKS9iYXNlOm51bGw7Y3VtdWxhdGl2ZSs9c2hhcmV8fDA7cmV0dXJue25hbWU6Zy5uYW1lLHZhbHVlOmdbbWV0cmljXSxzaGFyZSxjdW11bGF0aXZlOmJhc2U/Y3VtdWxhdGl2ZTpudWxsfTt9KTt9CmZ1bmN0aW9uIG1vdmVzUGFya0xBKGRheXMsd2luZG93RGF5cz0xNCl7CiBjb25zdCBtYXA9bmV3IE1hcCgpO2Zvcihjb25zdCBkIG9mIGRheXMpe2lmKCFtYXAuaGFzKGQuaWQpKW1hcC5zZXQoZC5pZCxbXSk7bWFwLmdldChkLmlkKS5wdXNoKGQpO31jb25zdCByZXN1bHQ9W107Zm9yKGNvbnN0W2lkLGxpc3Rdb2YgbWFwKXtsaXN0LnNvcnQoKGEsYik9PmEuZGF0ZS5sb2NhbGVDb21wYXJlKGIuZGF0ZSkpO2xldCBwcmV2aW91cz1udWxsO2Zvcihjb25zdCBkIG9mIGxpc3Qpe2lmKGQubG9jYXRpb25zLnNpemUhPT0xKXtwcmV2aW91cz1udWxsO2NvbnRpbnVlO31jb25zdCBsb2NhdGlvbj1bLi4uZC5sb2NhdGlvbnNdWzBdO2lmKHByZXZpb3VzJiZwcmV2aW91cyE9PWxvY2F0aW9uKXtjb25zdCBhPWxpc3QuZmlsdGVyKHg9PnguZGF0ZTxkLmRhdGUmJnguZGF0ZT49c2hpZnREYXRlTEEoZC5kYXRlLC13aW5kb3dEYXlzKSYmeC5sb2NhdGlvbnMuc2l6ZT09PTEmJngubG9jYXRpb25zLmhhcyhwcmV2aW91cykpLGI9bGlzdC5maWx0ZXIoeD0+eC5kYXRlPj1kLmRhdGUmJnguZGF0ZTw9c2hpZnREYXRlTEEoZC5kYXRlLHdpbmRvd0RheXMtMSkmJngubG9jYXRpb25zLnNpemU9PT0xJiZ4LmxvY2F0aW9ucy5oYXMobG9jYXRpb24pKSxtZWFuPShpdGVtcyxrKT0+ZGl2KGl0ZW1zLnJlZHVjZSgocyx4KT0+cyt4W2tdLDApLGl0ZW1zLmxlbmd0aCk7cmVzdWx0LnB1c2goe2lkLGRhdGU6ZC5kYXRlLG9sZDpKU09OLnBhcnNlKHByZXZpb3VzKSxuZXh0OkpTT04ucGFyc2UobG9jYXRpb24pLGJlZm9yZTphLmxlbmd0aCxhZnRlcjpiLmxlbmd0aCxjb2luQTptZWFuKGEsJ2NvaW4nKSxjb2luQjptZWFuKGIsJ2NvaW4nKSx3aW5BOm1lYW4oYSwnd2luJyksd2luQjptZWFuKGIsJ3dpbicpfSk7fXByZXZpb3VzPWxvY2F0aW9uO319cmV0dXJuIHJlc3VsdC5zb3J0KChhLGIpPT5iLmRhdGUubG9jYWxlQ29tcGFyZShhLmRhdGUpfHxhLmlkLmxvY2FsZUNvbXBhcmUoYi5pZCkpOwp9CmZ1bmN0aW9uIHF1YWxpdHlQYXJrTEEocm93cyl7Y29uc3Qgc2Vlbj1uZXcgU2V0KCk7bGV0IGR1cGxpY2F0ZXM9MCxtaXNzaW5nPTAsaW52YWxpZERhdGVzPTAsaW52YWxpZE51bWJlcnM9MDtmb3IoY29uc3QgciBvZiByb3dzKXtjb25zdCBpZD1TdHJpbmcoclsxXT8/JycpLnRyaW0oKTtpZighaWQpbWlzc2luZysrO2Vsc2V7Y29uc3Qga2V5PUpTT04uc3RyaW5naWZ5KFtyWzBdLGlkXSk7aWYoc2Vlbi5oYXMoa2V5KSlkdXBsaWNhdGVzKys7c2Vlbi5hZGQoa2V5KTt9Y29uc3QgbXM9RGF0ZS5wYXJzZShyWzBdKydUMDA6MDA6MDBaJyk7aWYoIS9eXGR7NH0tXGR7Mn0tXGR7Mn0kLy50ZXN0KHJbMF0pfHwhTnVtYmVyLmlzRmluaXRlKG1zKXx8bmV3IERhdGUobXMpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwxMCkhPT1yWzBdKWludmFsaWREYXRlcysrO2Zvcihjb25zdCBrIG9mIFsxNSwxNiwxOCwyMCwyNiwyN10paWYocltrXSE9bnVsbCYmcltrXSE9PScnJiYodHlwZW9mIHJba10hPT0nbnVtYmVyJ3x8IU51bWJlci5pc0Zpbml0ZShyW2tdKSkpaW52YWxpZE51bWJlcnMrKzt9cmV0dXJue2R1cGxpY2F0ZXMsbWlzc2luZyxpbnZhbGlkRGF0ZXMsaW52YWxpZE51bWJlcnMsYW1iaWd1b3VzOmRhaWx5UGFya0xBKHJvd3MpLmZpbHRlcihkPT5kLmxvY2F0aW9ucy5zaXplPjEpLmxlbmd0aH07fQpmdW5jdGlvbiBwZXJzaXN0ZW50UGFya0xBKGVudHJpZXMscyl7cmV0dXJuIGVudHJpZXMubWFwKGc9Pntjb25zdCBkYXlzPWdyb3VwcyhnLmN1cnJlbnQscj0+clswXSkuc29ydCgoYSxiKT0+Yi5uYW1lLmxvY2FsZUNvbXBhcmUoYS5uYW1lKSk7bGV0IHN0cmVhaz0wO2Zvcihjb25zdCBkIG9mIGRheXMpe2lmKGQubmFtZSE9PXNoaWZ0RGF0ZUxBKHMuZW5kLC1zdHJlYWspfHxnLm9sZD09bnVsbHx8Zy5vbGQ8PTB8fGRbcy5tZXRyaWNdPT1udWxsfHxkW3MubWV0cmljXT5nLm9sZCooMS1zLnRocmVzaG9sZC8xMDApKWJyZWFrO3N0cmVhaysrO31yZXR1cm57bmFtZTpnLm5hbWUsc3RyZWFrLG9sZDpnLm9sZCxkYXlzOmcuZGF5c0IsemVybzpkYWlseVBhcmtMQShnLmN1cnJlbnQpLmZpbHRlcihkPT5kLmNvaW49PT0wJiZkLnNwaW49PT0wKS5sZW5ndGgsY292ZXJhZ2U6Zy5tYWNoaW5lRGF5c0IscHJldmlvdXNDb3ZlcmFnZTpnLm1hY2hpbmVEYXlzQX07fSkuc29ydCgoYSxiKT0+Yi5zdHJlYWstYS5zdHJlYWt8fGIuemVyby1hLnplcm8pO30KY29uc3QgcGVyY2VudFBhcmtMQT12PT52PT1udWxsPyfigJQnOigxMDAqdikudG9Mb2NhbGVTdHJpbmcoJ2VzLUNMJyx7bWF4aW11bUZyYWN0aW9uRGlnaXRzOjJ9KSsnJSc7Ci8vIE9ubHkgNTAgcm93cyBlbnRlciB0aGUgRE9NLCB3aGlsZSBleHBvcnRzIHJldGFpbiB0aGUgY29tcGxldGUgcmVwb3J0LgpmdW5jdGlvbiBwYXJrVGFibGVMQShob3N0LGhlYWRlcnMscm93cyxmb3JtYXRzPVtdKXtsZXQgcGFnZT0wO2hvc3QuaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJ0YWJsZXdyYXAiPjx0YWJsZT48dGhlYWQ+PHRyPicraGVhZGVycy5tYXAoaD0+Jzx0aD4nK2VzYyhoKSsnPC90aD4nKS5qb2luKCcnKSsnPC90cj48L3RoZWFkPjx0Ym9keT48L3Rib2R5PjwvdGFibGU+PC9kaXY+PGRpdiBjbGFzcz0icGFya1BhZ2VzTEEiPjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLXByZXY+QW50ZXJpb3I8L2J1dHRvbj48c3Bhbj48L3NwYW4+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtbmV4dD5TaWd1aWVudGU8L2J1dHRvbj48L2Rpdj4nO2NvbnN0IGRyYXc9KCk9Pntob3N0LnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5JykuaW5uZXJIVE1MPXJvd3Muc2xpY2UocGFnZSo1MCxwYWdlKjUwKzUwKS5tYXAocm93PT4nPHRyPicrcm93Lm1hcCgodixpKT0+Jzx0ZD4nK2VzYyhmb3JtYXRzW2ldP2Zvcm1hdHNbaV0odik6dHlwZW9mIHY9PT0nbnVtYmVyJz9mbXQodik6dj8/J+KAlCcpKyc8L3RkPicpLmpvaW4oJycpKyc8L3RyPicpLmpvaW4oJycpfHwnPHRyPjx0ZCBjb2xzcGFuPSInK2hlYWRlcnMubGVuZ3RoKyciPlNpbiByZWdpc3Ryb3MgcGFyYSBlc3RhIHNlbGVjY2nDs24uPC90ZD48L3RyPic7aG9zdC5xdWVyeVNlbGVjdG9yKCcucGFya1BhZ2VzTEEgc3BhbicpLnRleHRDb250ZW50PXJvd3MubGVuZ3RoKycgZmlsYXMgwrcgUMOhZ2luYSAnKyhwYWdlKzEpKycgZGUgJytNYXRoLm1heCgxLE1hdGguY2VpbChyb3dzLmxlbmd0aC81MCkpO2hvc3QucXVlcnlTZWxlY3RvcignW2RhdGEtcHJldl0nKS5kaXNhYmxlZD1wYWdlPT09MDtob3N0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW5leHRdJykuZGlzYWJsZWQ9KHBhZ2UrMSkqNTA+PXJvd3MubGVuZ3RoO307aG9zdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wcmV2XScpLm9uY2xpY2s9KCk9PntwYWdlLS07ZHJhdygpO307aG9zdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1uZXh0XScpLm9uY2xpY2s9KCk9PntwYWdlKys7ZHJhdygpO307ZHJhdygpO30KZnVuY3Rpb24gcGFya0V4cG9ydEJ1dHRvbkxBKGhvc3QsaGVhZGVycyxyb3dzLG5hbWUpe2NvbnN0IGJ1dHRvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtidXR0b24udHlwZT0nYnV0dG9uJztidXR0b24udGV4dENvbnRlbnQ9J0Rlc2NhcmdhciBlc3RlIGFuw6FsaXNpcyBlbiBFeGNlbCc7YnV0dG9uLm9uY2xpY2s9KCk9PmRvd25sb2FkQmxvYlY4KHdvcmtib29rQmxvYlY4KFt7bmFtZTonQW5hbGlzaXMnLHJvd3M6W2hlYWRlcnMsLi4ucm93c119LHtuYW1lOidDb25zdWx0YScscm93czpbWydQZXLDrW9kbycsc2VsZWN0ZWREYXRlVGV4dFY4KCdnbG9iYWwnKV0sWydOb3RhJywnRMOtYXMgcmVnaXN0cmFkb3MgeSBtw6FxdWluYXMtZMOtYTsgZGF0b3MgYXVzZW50ZXMgbm8gc2UgY3VlbnRhbiBjb21vIGNlcm9zLiddXX1dKSxuYW1lKycueGxzeCcpO2hvc3QuYXBwZW5kQ2hpbGQoYnV0dG9uKTt9CmZ1bmN0aW9uIGFkZFBhcmtGb2xkTEEoaWQsdGl0bGUsYnVpbGQpe2lmKCQoJyMnK2lkKSlyZXR1cm47JCgnI2NvbnRlbnQnKS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsJzxkZXRhaWxzIGNsYXNzPSJjYXJkIHBhcmtGb2xkTEEiIGlkPSInK2lkKyciPjxzdW1tYXJ5PicrZXNjKHRpdGxlKSsnPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhcmtGb2xkQm9keUxBIj48L2Rpdj48L2RldGFpbHM+Jyk7Y29uc3QgZm9sZD0kKCcjJytpZCk7Zm9sZC5vbnRvZ2dsZT0oKT0+e2lmKGZvbGQub3BlbiYmIWZvbGQuZGF0YXNldC5yZWFkeSl7Zm9sZC5kYXRhc2V0LnJlYWR5PSd0cnVlJztidWlsZChmb2xkLnF1ZXJ5U2VsZWN0b3IoJy5wYXJrRm9sZEJvZHlMQScpKTt9fTt9CmZ1bmN0aW9uIHJlbmRlclBhcmtMQSgpewogdmlld1N0YXRlLnBhcms/Pz17ZmlsdGVyczp7fSxraW5kOid3ZWVrZGF5cycsbWluRGF5czo3LGxvd1BlcmNlbnQ6MjV9O2NvbnN0IHM9dmlld1N0YXRlLnBhcmsscm93cz1zbGljZVJvd3Mocy5maWx0ZXJzKSxkYXlzPWRhaWx5UGFya0xBKHJvd3MpLGtpbmRzPXt3ZWVrZGF5czonRMOtYXMgZGUgbGEgc2VtYW5hJyxzdGFiaWxpdHk6J0VzdGFiaWxpZGFkIHBvciBtw6FxdWluYScsYWN0aXZpdHk6J0FjdGl2aWRhZCBiYWphIG8gc2luIHJlZ2lzdHJvJyxwcm9tb3Rpb25zOidQcm9tb2Npb25lcyB5IHJlbmRpbWllbnRvJ307CiBkb2N1bWVudC5ib2R5LmRhdGFzZXQudmlldz10YWI7JCgnI3RpdGxlJykudGV4dENvbnRlbnQ9J0Fuw6FsaXNpcyBkZWwgcGFycXVlJztkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmlsdGVycycpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzskKCcjY29udHJvbHMnKS5zdHlsZS5kaXNwbGF5PSdub25lJzskKCcjZmlsdGVycycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOwogJCgnI2NvbnRlbnQnKS5pbm5lckhUTUw9YmFubmVyKCdBbsOhbGlzaXMgZGVsIHBhcnF1ZScsJ1NlbGVjY2lvbmEgdW4gYW7DoWxpc2lzIHkgdXRpbGl6YSBsYXMgZmVjaGFzIGdlbmVyYWxlcyB5IGZpbHRyb3MgZGUgZXN0YSBwZXN0YcOxYS4nKStgPHNlY3Rpb24gY2xhc3M9ImNhcmQiPjxkaXYgY2xhc3M9InZpZXdjb250cm9scyI+JHtzZWxlY3RvcignQW7DoWxpc2lzJywncGFya0tpbmRMQScscy5raW5kLGtpbmRzKX08bGFiZWw+TcOtbmltbyBkZSBkw61hcyBwYXJhIGVzdGFiaWxpZGFkPGlucHV0IGlkPSJwYXJrTWluRGF5c0xBIiB0eXBlPSJudW1iZXIiIG1pbj0iMiIgbWF4PSIzNjYiIHZhbHVlPSIke3MubWluRGF5c30iPjwvbGFiZWw+PGxhYmVsPkFjdGl2aWRhZCBiYWphOiBtZW5vcyBkZWwgJSBkZSBzdSBtZWRpYW5hPGlucHV0IGlkPSJwYXJrTG93TEEiIHR5cGU9Im51bWJlciIgbWluPSIxIiBtYXg9Ijk5IiB2YWx1ZT0iJHtzLmxvd1BlcmNlbnR9Ij48L2xhYmVsPjxidXR0b24gaWQ9InBhcmtBcHBseUxBIj5BcGxpY2FyPC9idXR0b24+PC9kaXY+PGRldGFpbHMgY2xhc3M9ImNvbXBhY3RGb2xkTEEiPjxzdW1tYXJ5PkZpbHRyYXIgbcOhcXVpbmFzLCBiYW5jb3MsIG1hcmNhcyB5IHViaWNhY2lvbmVzPC9zdW1tYXJ5PjxkaXYgY2xhc3M9ImZpbHRlcmdyaWQiPiR7ZmlsdGVyRmllbGRzKHMsJ3BhcmsnLFsxLDIsMyw0LDksNSw3XSl9PC9kaXY+PC9kZXRhaWxzPjwvc2VjdGlvbj48c2VjdGlvbiBjbGFzcz0iY2FyZCI+PGgyPiR7a2luZHNbcy5raW5kXX08L2gyPjxwIGlkPSJwYXJrSGVscExBIiBjbGFzcz0ic2lnbmFsbm90ZSI+PC9wPjxkaXYgaWQ9InBhcmtSZXN1bHRzTEEiPjwvZGl2Pjwvc2VjdGlvbj5gOwogbGV0IGhlYWRlcnMsYm9keSxmb3JtYXRzPVtdOwogaWYocy5raW5kPT09J3dlZWtkYXlzJyl7aGVhZGVycz1bJ0TDrWEnLCdGZWNoYXMgY29uIGRhdG9zJywnTcOhcXVpbmFzLWTDrWEnLCdXaW4gdG90YWwgQ0xQJywnQ29pbiBJbiB0b3RhbCBDTFAnLCdXaW4gcG9yIGZlY2hhIENMUCcsJ0NvaW4gSW4gcG9yIGZlY2hhIENMUCcsJ1dpbiAvIG3DoXF1aW5hLWTDrWEnLCdDb2luIEluIC8gbcOhcXVpbmEtZMOtYScsJ1BheW91dCddO2JvZHk9d2Vla2RheVBhcmtMQShyb3dzKS5tYXAoZz0+W2cubmFtZSxnLmNhbGVuZGFyRGF5cyxnLmRheXMsZy53aW4sZy5jb2luLGcud2luRGF0ZSxnLmNvaW5EYXRlLGcud2QsZy5jZCxnLnBvXSk7Zm9ybWF0c1s5XT1wZXJjZW50UGFya0xBOyQoJyNwYXJrSGVscExBJykudGV4dENvbnRlbnQ9J0NvbXBhcmEgcHJvbWVkaW9zIHBvciBmZWNoYSBvIG3DoXF1aW5hLWTDrWE6IGxvcyB0b3RhbGVzIGRlcGVuZGVuIGRlIGN1w6FudG9zIGx1bmVzLCBtYXJ0ZXMsIGV0Yy4gaGF5YSBlbiBsYSBzZWxlY2Npw7NuLic7fQogZWxzZSBpZihzLmtpbmQ9PT0nc3RhYmlsaXR5Jyl7aGVhZGVycz1bJ03DoXF1aW5hJywnRMOtYXMgcmVnaXN0cmFkb3MnLCdDb2luIEluIG1lZGlvIGRpYXJpbycsJ0Rlc3ZpYWNpw7NuIGVzdMOhbmRhciBkaWFyaWEnLCdWYXJpYWJpbGlkYWQgQ29pbiBJbiAoQ1YpJywnTWF5b3IgZMOtYSAvIFdpbiBwb3NpdGl2bycsJ1dpbiB0b3RhbCBDTFAnXTtib2R5PXN0YWJpbGl0eVBhcmtMQShkYXlzLHMubWluRGF5cykubWFwKGc9PltnLmlkLGcuY291bnQsZy5tZWFuLGcuc2QsZy5jdixnLmJlc3RXaW5TaGFyZSxnLndpbl0pO2Zvcm1hdHNbNF09cGVyY2VudFBhcmtMQTtmb3JtYXRzWzVdPXBlcmNlbnRQYXJrTEE7JCgnI3BhcmtIZWxwTEEnKS50ZXh0Q29udGVudD0nQ1YgPSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgcG9ibGFjaW9uYWwgLyBwcm9tZWRpbyBkaWFyaW8gZGUgQ29pbiBJbi4gU2Ugb2N1bHRhIGNvbiBwb2NvcyBkw61hcyBvIHByb21lZGlvIG5vIHBvc2l0aXZvLiBMYSBjb25jZW50cmFjacOzbiBkZSBXaW4gdXNhIHNvbG8gZMOtYXMgY29uIFdpbiBwb3NpdGl2bzsgbm8gZXhwbGljYSBzdXMgY2F1c2FzLic7fQogZWxzZSBpZihzLmtpbmQ9PT0nYWN0aXZpdHknKXtoZWFkZXJzPVsnTcOhcXVpbmEnLCdQcmltZXIgcmVnaXN0cm8nLCfDmmx0aW1vIHJlZ2lzdHJvJywnRMOtYXMgcmVnaXN0cmFkb3MnLCdEw61hcyBpbnRlcm1lZGlvcyBzaW4gcmVnaXN0cm8nLCdEw61hcyBjb24gQ29pbiBJbiB5IHNwaW5zIGNlcm8nLCdEw61hcyBjb24gQ29pbiBJbiBiYWpvJywnTWVkaWFuYSBDb2luIEluIHBvc2l0aXZvJ107Ym9keT1hY3Rpdml0eVBhcmtMQShkYXlzLFsuLi5uZXcgU2V0KHNsaWNlUm93cygpLm1hcChyPT5yWzBdKSldLnNvcnQoKSxzLmxvd1BlcmNlbnQvMTAwKS5tYXAoZz0+W2cuaWQsZy5maXJzdCxnLmxhc3QsZy5kYXlzLGcubWlzc2luZyxnLnplcm8sZy5sb3csZy5tZWRpYW5dKTskKCcjcGFya0hlbHBMQScpLnRleHRDb250ZW50PSdTaW4gcmVnaXN0cm86IGZlY2hhIGNvbiBkYXRvcyBkZWwgcGFycXVlIGVudHJlIGVsIHByaW1lciB5IMO6bHRpbW8gcmVnaXN0cm8gZGUgZXNhIG3DoXF1aW5hLiBDZXJvOiBleGlzdGUgcmVnaXN0cm8gY29uIENvaW4gSW4geSBzcGlucyBpZ3VhbGVzIGEgY2Vyby4gQmFqbzogQ29pbiBJbiBwb3NpdGl2byBpbmZlcmlvciBhbCB1bWJyYWwgZGUgc3UgcHJvcGlhIG1lZGlhbmEgcG9zaXRpdmEuIE5pbmd1bm8gY29uZmlybWEgdW5hIGZhbGxhIHTDqWNuaWNhLic7fQogZWxzZXtoZWFkZXJzPVsnVGlwbyBkZSBtw6FxdWluYS1kw61hJywnTcOhcXVpbmFzLWTDrWEnLCdDb2luIEluIENMUCcsJ1dpbiBDTFAnLCdQcm9tbyBuZXRhIENMUCcsJ0NvaW4gSW4gLyBtw6FxdWluYS1kw61hJywnV2luIC8gbcOhcXVpbmEtZMOtYScsJ1NwaW5zIC8gbcOhcXVpbmEtZMOtYScsJ1BheW91dCcsJ1BheW91dCBjb24gTkNDJ107Ym9keT1wcm9tb3Rpb25QYXJrTEEoZGF5cykubWFwKGc9PltnLm5hbWUsZy5kYXlzLGcuY29pbixnLndpbixnLnByb21vLGcuY2QsZy53ZCxnLnNkLGcucG8sZy5wb25dKTtmb3JtYXRzWzhdPWZvcm1hdHNbOV09cGVyY2VudFBhcmtMQTskKCcjcGFya0hlbHBMQScpLnRleHRDb250ZW50PSdDb24gcHJvbW9jacOzbiBzaWduaWZpY2EgYWxnw7puIG1vdmltaWVudG8gUHJvbW8gSW4gdSBPdXQsIGluY2x1c28gY3VhbmRvIGVsIG5ldG8gZXMgY2Vyby4gQ29tcGFyYWNpw7NuIGRlc2NyaXB0aXZhOiBubyBtaWRlIGVmZWN0byBjYXVzYWwgbmkgcmVudGFiaWxpZGFkIGRlIGxhIHByb21vY2nDs24gc2luIHN1cyBjb3N0b3MgeSBjb25kaWNpb25lcy4nO30KIGV4cG9ydFJvd3M9W2hlYWRlcnMsLi4uYm9keV07cGFya1RhYmxlTEEoJCgnI3BhcmtSZXN1bHRzTEEnKSxoZWFkZXJzLGJvZHksZm9ybWF0cyk7YmluZEZpbHRlcnMoKTskKCcjcGFya0tpbmRMQScpLm9uY2hhbmdlPWU9PntzLmtpbmQ9ZS50YXJnZXQudmFsdWU7cmVuZGVyKCk7fTskKCcjcGFya0FwcGx5TEEnKS5vbmNsaWNrPSgpPT57cy5taW5EYXlzPU1hdGgubWF4KDIsTWF0aC5taW4oMzY2LE51bWJlcigkKCcjcGFya01pbkRheXNMQScpLnZhbHVlKXx8NykpO3MubG93UGVyY2VudD1NYXRoLm1heCgxLE1hdGgubWluKDk5LE51bWJlcigkKCcjcGFya0xvd0xBJykudmFsdWUpfHwyNSkpO3JlbmRlcigpO307JCgnI2NvbnRlbnQnKS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLGFjdGl2ZUZpbHRlcnNMQSgpKTsKfQpjb25zdCBzdW1tYXJ5QmVmb3JlUGFya0xBPXN1bW1hcnlWaWV3OwpzdW1tYXJ5Vmlldz1mdW5jdGlvbigpe3N1bW1hcnlCZWZvcmVQYXJrTEEoKTthZGRQYXJrRm9sZExBKCdwYXJldG9QYXJrTEEnLCdDb25jZW50cmFjacOzbiBkZWwgcmVzdWx0YWRvIMK3IFBhcmV0byBwb3IgbcOhcXVpbmFzIHkgYmFuY29zJyxob3N0PT57aG9zdC5pbm5lckhUTUw9JzxkaXYgY2xhc3M9InZpZXdjb250cm9scyI+JytzZWxlY3RvcignQWdydXBhcicsJ3BhcmV0b0dyb3VwTEEnLCcxJyx7MTonTcOhcXVpbmEnLDk6J0JhbmNvJ30pK3NlbGVjdG9yKCdJbmRpY2Fkb3InLCdwYXJldG9NZXRyaWNMQScsJ2NvaW4nLHtjb2luOidDb2luIEluJyx3aW46J1dpbiBvcGVyYWNpb25hbCd9KSsnPC9kaXY+PHAgY2xhc3M9InNpZ25hbG5vdGUiPlBvcmNlbnRhamVzIHNvYnJlIGNvbnRyaWJ1Y2lvbmVzIHBvc2l0aXZhcy4gTG9zIGdydXBvcyBjb24gV2luIG5lZ2F0aXZvIHNlIG11ZXN0cmFuLCBwZXJvIG5vIGF1bWVudGFuIGxhIGJhc2UgbmkgZWwgYWN1bXVsYWRvLjwvcD48ZGl2IGRhdGEtcGFyZXRvdGFibGU+PC9kaXY+PGRpdiBkYXRhLXBhcmV0b2V4cG9ydD48L2Rpdj4nO2NvbnN0IGRyYXc9KCk9Pntjb25zdCBtZXRyaWM9JCgnI3BhcmV0b01ldHJpY0xBJykudmFsdWUsaGVhZGVycz1bJ0dydXBvJyxtZXRyaWNzW21ldHJpY10rJyBDTFAnLCdQYXJ0aWNpcGFjacOzbiBwb3NpdGl2YScsJ0FjdW11bGFkbyBwb3NpdGl2byddLHJvd3M9cGFyZXRvUGFya0xBKHNsaWNlUm93cygpLE51bWJlcigkKCcjcGFyZXRvR3JvdXBMQScpLnZhbHVlKSxtZXRyaWMpLm1hcChnPT5bZy5uYW1lLGcudmFsdWUsZy5zaGFyZSxnLmN1bXVsYXRpdmVdKTtwYXJrVGFibGVMQShob3N0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhcmV0b3RhYmxlXScpLGhlYWRlcnMscm93cyxbbnVsbCxudWxsLHBlcmNlbnRQYXJrTEEscGVyY2VudFBhcmtMQV0pO2hvc3QucXVlcnlTZWxlY3RvcignW2RhdGEtcGFyZXRvZXhwb3J0XScpLmlubmVySFRNTD0nJztwYXJrRXhwb3J0QnV0dG9uTEEoaG9zdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYXJldG9leHBvcnRdJyksaGVhZGVycyxyb3dzLCdMQS1QYXJldG8nKTt9OyQoJyNwYXJldG9Hcm91cExBJykub25jaGFuZ2U9ZHJhdzskKCcjcGFyZXRvTWV0cmljTEEnKS5vbmNoYW5nZT1kcmF3O2RyYXcoKTt9KTt9Owpjb25zdCBjb21wYXJlQmVmb3JlUGFya0xBPWNvbXBhcmVWaWV3Owpjb21wYXJlVmlldz1mdW5jdGlvbigpe2NvbXBhcmVCZWZvcmVQYXJrTEEoKTthZGRQYXJrRm9sZExBKCdtb3Zlc1BhcmtMQScsJ1JldWJpY2FjaW9uZXMgZGV0ZWN0YWRhcyDCtyBjb21wYXJhciBhbnRlcyB5IGRlc3B1w6lzJyxob3N0PT57aG9zdC5pbm5lckhUTUw9JzxkaXYgY2xhc3M9InZpZXdjb250cm9scyI+JytzZWxlY3RvcignVmVudGFuYSBhbnRlcyB5IGRlc3B1w6lzJywnbW92ZURheXNMQScsJzE0Jyx7NzonNyBkw61hcycsMTQ6JzE0IGTDrWFzJywyODonMjggZMOtYXMnfSkrJzwvZGl2PjxwIGNsYXNzPSJzaWduYWxub3RlIj5DYW1iaW9zIGRlIGJhbmNvLCBzZWN0b3IgbyBzYWzDs24gb2JzZXJ2YWRvcyBlbiB0b2RvIGVsIGhpc3TDs3JpY28uIExhIGZlY2hhIGVzIGVsIHByaW1lciByZWdpc3RybyBlbiBsYSBudWV2YSB1YmljYWNpw7NuLCBubyBjb25maXJtYSBlbCBtb21lbnRvIGRlbCB0cmFzbGFkby4gU2UgZGVzY2FydGFuIGTDrWFzIGNvbiB1YmljYWNpb25lcyBjb250cmFkaWN0b3JpYXMuIFByb21lZGlvcyBwb3IgZMOtYSByZWdpc3RyYWRvOiBjb21wYXJhIGxhIGNvYmVydHVyYSBhbnRlcyBkZSBjb25jbHVpci48L3A+PGRpdiBkYXRhLW1vdmV0YWJsZT48L2Rpdj48ZGl2IGRhdGEtbW92ZWV4cG9ydD48L2Rpdj4nO2NvbnN0IGRyYXc9KCk9Pntjb25zdCBoZWFkZXJzPVsnTcOhcXVpbmEnLCdQcmltZXIgcmVnaXN0cm8gbnVldmEgdWJpY2FjacOzbicsJ0FudGVzOiBiYW5jbyAvIHNlY3RvciAvIHNhbMOzbicsJ0Rlc3B1w6lzOiBiYW5jbyAvIHNlY3RvciAvIHNhbMOzbicsJ0TDrWFzIGFudGVzJywnRMOtYXMgZGVzcHXDqXMnLCdDb2luIEluL2TDrWEgYW50ZXMnLCdDb2luIEluL2TDrWEgZGVzcHXDqXMnLCdXaW4vZMOtYSBhbnRlcycsJ1dpbi9kw61hIGRlc3B1w6lzJ10scm93cz1tb3Zlc1BhcmtMQShkYWlseVBhcmtMQShkYXRhLnJvd3MpLE51bWJlcigkKCcjbW92ZURheXNMQScpLnZhbHVlKSkubWFwKG09PlttLmlkLG0uZGF0ZSxtLm9sZC5qb2luKCcgLyAnKSxtLm5leHQuam9pbignIC8gJyksbS5iZWZvcmUsbS5hZnRlcixtLmNvaW5BLG0uY29pbkIsbS53aW5BLG0ud2luQl0pO3BhcmtUYWJsZUxBKGhvc3QucXVlcnlTZWxlY3RvcignW2RhdGEtbW92ZXRhYmxlXScpLGhlYWRlcnMscm93cyk7aG9zdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1tb3ZlZXhwb3J0XScpLmlubmVySFRNTD0nJztwYXJrRXhwb3J0QnV0dG9uTEEoaG9zdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1tb3ZlZXhwb3J0XScpLGhlYWRlcnMscm93cywnTEEtUmV1YmljYWNpb25lcycpO307JCgnI21vdmVEYXlzTEEnKS5vbmNoYW5nZT1kcmF3O2RyYXcoKTt9KTt9Owpjb25zdCBwcml6ZXNCZWZvcmVQYXJrTEE9cmVuZGVyUHJpemVzTEE7CnJlbmRlclByaXplc0xBPWZ1bmN0aW9uKCl7cHJpemVzQmVmb3JlUGFya0xBKCk7YWRkUGFya0ZvbGRMQSgncHJpemVzQWN0aXZpdHlMQScsJ1ByZW1pb3MgZnJlbnRlIGEgYWN0aXZpZGFkIMK3IHNlbWFuYXMgeSBtw6FxdWluYXMnLGhvc3Q9Pntjb25zdCByb3dzPWN1cnJlbnRQcml6ZVJlcG9ydExBLnJvd3MsaGVhZGVycz1bJ03DoXF1aW5hJywnUHJlbWlvcyBuZXRvcyBDTFAnLCdDb2luIEluIENMUCcsJ1NwaW5zJywnUHJlbWlvcyAvIENvaW4gSW4nLCdQcmVtaW9zIHBvciAxLjAwMCBzcGlucycsJ1ByZW1pb3MgLyBDb2luIEluIGhpc3TDs3JpY28gZGUgbcOhcXVpbmEnXSxoaXN0b3J5PW5ldyBNYXAoZ3JvdXBzKGRhdGEucm93cyxyPT5TdHJpbmcoclsxXT8/J1NpbiBpZGVudGlmaWNhY2nDs24nKSkubWFwKGc9PltnLm5hbWUsZGl2KGcucHJpemUsZy5jb2luKV0pKSxib2R5PWdyb3Vwcyhyb3dzLHI9PlN0cmluZyhyWzFdPz8nU2luIGlkZW50aWZpY2FjacOzbicpKS5zb3J0KChhLGIpPT5iLnByaXplLWEucHJpemUpLm1hcChnPT5bZy5uYW1lLGcucHJpemUsZy5jb2luLGcuc3BpbixkaXYoZy5wcml6ZSxnLmNvaW4pLGcuc3Bpbj9nLnByaXplL2cuc3BpbioxMDAwOm51bGwsaGlzdG9yeS5nZXQoZy5uYW1lKV0pLHRvdGFsPWFnZyhyb3dzKTtob3N0LmlubmVySFRNTD0nPHAgY2xhc3M9InNpZ25hbG5vdGUiPlVzYSBsYXMgc2VtYW5hcyB5IGZpbHRyb3Mgc2VsZWNjaW9uYWRvcyBhcnJpYmEuIFByZW1pb3MgbmV0b3MgaW5jbHV5ZW4gYWp1c3RlcyBuZWdhdGl2b3MuIExhIHJlZmVyZW5jaWEgaGlzdMOzcmljYSB1c2EgdG9kb3MgbG9zIGTDrWFzIGNhcmdhZG9zIGRlIGxhIG3DoXF1aW5hLCBpbmNsdWlkYSBsYSBzZWxlY2Npw7NuOyBubyBjbGFzaWZpY2EgdGlwb3MgZGUgcHJlbWlvcy48L3A+JytzdGF0Q2FyZHMoW1snUFJFTUlPUyAvIENPSU4gSU4nLHBlcmNlbnRQYXJrTEEoZGl2KHRvdGFsLnByaXplLHRvdGFsLmNvaW4pKSwnUHJvcG9yY2nDs24gc29icmUgZWwgQ29pbiBJbiBzZWxlY2Npb25hZG8nXSxbJ1BSRU1JT1MgLyAxLjAwMCBTUElOUycsZm10KHRvdGFsLnNwaW4/dG90YWwucHJpemUvdG90YWwuc3BpbioxMDAwOm51bGwpLCdDTFAgcG9yIG1pbCBzcGlucyddXSkrJzxkaXYgZGF0YS1wcml6ZXNhY3Rpdml0eT48L2Rpdj4nO3BhcmtUYWJsZUxBKGhvc3QucXVlcnlTZWxlY3RvcignW2RhdGEtcHJpemVzYWN0aXZpdHldJyksaGVhZGVycyxib2R5LFtudWxsLG51bGwsbnVsbCxudWxsLHBlcmNlbnRQYXJrTEEsbnVsbCxwZXJjZW50UGFya0xBXSk7cGFya0V4cG9ydEJ1dHRvbkxBKGhvc3QsaGVhZGVycyxib2R5LCdMQS1QcmVtaW9zLWFjdGl2aWRhZCcpO30pO307CmNvbnN0IGFsZXJ0c0JlZm9yZVBhcmtMQT1yZW5kZXJBbGVydHNMQTsKcmVuZGVyQWxlcnRzTEE9ZnVuY3Rpb24oKXthbGVydHNCZWZvcmVQYXJrTEEoKTthZGRQYXJrRm9sZExBKCdwZXJzaXN0ZW50UGFya0xBJywnUGVyc2lzdGVuY2lhIGRlIGNhw61kYXMgeSByZWdpc3Ryb3MgZGUgYWN0aXZpZGFkIGNlcm8nLGhvc3Q9Pntjb25zdCBoZWFkZXJzPVsnR3J1cG8nLCdEw61hcyBjb25zZWN1dGl2b3MgZGUgY2HDrWRhIGhhc3RhIGZlY2hhIGZpbmFsJywnQmFzZSBhbnRlcmlvciAvIG3DoXF1aW5hLWTDrWEnLCdEw61hcyBhY3R1YWxlcyByZWdpc3RyYWRvcycsJ03DoXF1aW5hcy1kw61hIGNvbiBhY3RpdmlkYWQgY2VybycsJ03DoXF1aW5hcy1kw61hIGFjdHVhbGVzJywnTcOhcXVpbmFzLWTDrWEgYW50ZXJpb3JlcyddLHJvd3M9cGVyc2lzdGVudFBhcmtMQShhbGVydFJlcG9ydExBLmVudHJpZXMsYWxlcnRTZXR0aW5nc0xBKCkpLm1hcChnPT5bZy5uYW1lLGcuc3RyZWFrLGcub2xkLGcuZGF5cyxnLnplcm8sZy5jb3ZlcmFnZSxnLnByZXZpb3VzQ292ZXJhZ2VdKTtob3N0LmlubmVySFRNTD0nPHAgY2xhc3M9InNpZ25hbG5vdGUiPkxhIHJhY2hhIGNvbXBhcmEgY2FkYSBkw61hIGNvbiBlbCBwcm9tZWRpbyBhbnRlcmlvciB5IGVsIHVtYnJhbCBjb25maWd1cmFkby4gU29sbyBjdWVudGEgZMOtYXMgY29uc2VjdXRpdm9zIGhhc3RhIGxhIGZlY2hhIGZpbmFsOyBsb3MgZMOtYXMgc2luIHJlZ2lzdHJvcyBpbnRlcnJ1bXBlbiBsYSByYWNoYS4gQ2VybyByZXF1aWVyZSBDb2luIEluIHkgc3BpbnMgY2Vybzsgbm8gc2UgaW50ZXJwcmV0YSBjb21vIGF2ZXLDrWEuPC9wPjxkaXYgZGF0YS1wZXJzaXN0ZW50dGFibGU+PC9kaXY+JztwYXJrVGFibGVMQShob3N0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBlcnNpc3RlbnR0YWJsZV0nKSxoZWFkZXJzLHJvd3MpO3BhcmtFeHBvcnRCdXR0b25MQShob3N0LGhlYWRlcnMscm93cywnTEEtUGVyc2lzdGVuY2lhLWFsZXJ0YXMnKTt9KTt9Owpjb25zdCBleHRyYUJlZm9yZVBhcmtMQT1leHRyYVJlcG9ydHM7CmV4dHJhUmVwb3J0cz1mdW5jdGlvbigpe2V4dHJhQmVmb3JlUGFya0xBKCk7aWYodmlld1N0YXRlLmV4dHJhLmtpbmQ9PT0ncXVhbGl0eScpYWRkUGFya0ZvbGRMQSgncXVhbGl0eVBhcmtMQScsJ0NhbGlkYWQgZGVsIGhpc3TDs3JpY28gwrcgaWRlbnRpZmljYWRvcmVzLCBkdXBsaWNhZG9zIHkgdWJpY2FjaW9uZXMnLGhvc3Q9Pntjb25zdCBxPXF1YWxpdHlQYXJrTEEoc2xpY2VSb3dzKCkpLGhlYWRlcnM9WydDb250cm9sJywnQ2FudGlkYWQnLCdJbnRlcnByZXRhY2nDs24nXSxyb3dzPVtbJ0ZpbGFzIGFkaWNpb25hbGVzIGRlIHVuYSBtw6FxdWluYSB5IGZlY2hhJyxxLmR1cGxpY2F0ZXMsJ1JldmlzYXIgZ3JhbnVsYXJpZGFkOyBubyBzZSBlbGltaW5hbiBhdXRvbcOhdGljYW1lbnRlJ10sWydGaWxhcyBzaW4gbcOhcXVpbmEnLHEubWlzc2luZywnRXhjbHVpZGFzIGRlbCBhbsOhbGlzaXMgcG9yIG3DoXF1aW5hLWTDrWEgZGUgZXN0YSBudWV2YSBwZXN0YcOxYSddLFsnRmVjaGFzIGludsOhbGlkYXMnLHEuaW52YWxpZERhdGVzLCdTb2JyZSBsYSBtYXRyaXogeWEgY2FyZ2FkYSddLFsnQ2VsZGFzIG51bcOpcmljYXMgaW52w6FsaWRhcycscS5pbnZhbGlkTnVtYmVycywnUHJlbWlvcywgV2luLCBDb2luIEluLCBzcGlucyB5IHByb21vY2lvbmVzJ10sWydNw6FxdWluYXMtZMOtYSBjb24gdWJpY2FjaW9uZXMgY29udHJhZGljdG9yaWFzJyxxLmFtYmlndW91cywnU2Ugb21pdGVuIGFsIGRldGVjdGFyIHRyYXNsYWRvcyddXTtwYXJrVGFibGVMQShob3N0LGhlYWRlcnMscm93cyk7cGFya0V4cG9ydEJ1dHRvbkxBKGhvc3QsaGVhZGVycyxyb3dzLCdMQS1DYWxpZGFkJyk7fSk7fTsKY29uc3QgZmlsdGVyc0JlZm9yZVBhcmtMQT1hY3RpdmVGaWx0ZXJzTEE7CmFjdGl2ZUZpbHRlcnNMQT1mdW5jdGlvbigpe2lmKHRhYiE9PSdBbsOhbGlzaXMgZGVsIHBhcnF1ZScpcmV0dXJuIGZpbHRlcnNCZWZvcmVQYXJrTEEoKTtjb25zdCBzPXZpZXdTdGF0ZS5wYXJrfHx7ZmlsdGVyczp7fX0sbGFiZWxzPU9iamVjdC5lbnRyaWVzKHMuZmlsdGVycykuZmlsdGVyKChbLHZdKT0+di5sZW5ndGgpLm1hcCgoW2ssdl0pPT5kaW1zW2tdKyc6ICcrdi5qb2luKCcsICcpKTtyZXR1cm4gJzxkaXYgY2xhc3M9ImFjdGl2ZUZpbHRlcnNMQSI+PGI+Q29uc3VsdGEgYWN0dWFsPC9iPjxzcGFuPicrZXNjKHNlbGVjdGVkRGF0ZVRleHRWOCgnZ2xvYmFsJykpKyc8L3NwYW4+JytsYWJlbHMubWFwKHY9Pic8c3Bhbj4nK2VzYyh2KSsnPC9zcGFuPicpLmpvaW4oJycpKyc8L2Rpdj4nO307CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ25hdiBidXR0b25bZGF0YS10YWI9Ik1ldG9kb2xvZ8OtYSJdJykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmViZWdpbicsJzxidXR0b24gZGF0YS10YWI9IkFuw6FsaXNpcyBkZWwgcGFycXVlIj7ilqcgJm5ic3A7IEFuw6FsaXNpcyBkZWwgcGFycXVlPC9idXR0b24+Jyk7ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbmF2IGJ1dHRvbltkYXRhLXRhYj0iQW7DoWxpc2lzIGRlbCBwYXJxdWUiXScpLm9uY2xpY2s9KCk9PmFjdGl2YXRlVGFiVjMoJ0Fuw6FsaXNpcyBkZWwgcGFycXVlJyk7CmNvbnN0IHJlbmRlckJlZm9yZVBhcmtMQT1yZW5kZXI7CnJlbmRlcj1mdW5jdGlvbigpe3JlbmRlckJlZm9yZVBhcmtMQSgpO2lmKGRhdGEmJnRhYj09PSdBbsOhbGlzaXMgZGVsIHBhcnF1ZScpe3JlbmRlclBhcmtMQSgpO2Zvcm1hdFRleHREYXRlc1Y1KCQoJyNjb250ZW50JykpO319Owpjb25zdCBleHBvcnRCZWZvcmVQYXJrTEE9JCgnI3YyZXhwb3J0Jykub25jbGljazsKJCgnI3YyZXhwb3J0Jykub25jbGljaz1mdW5jdGlvbigpe2lmKHRhYiE9PSdBbsOhbGlzaXMgZGVsIHBhcnF1ZScpcmV0dXJuIGV4cG9ydEJlZm9yZVBhcmtMQSgpO2Rvd25sb2FkQmxvYlY4KHdvcmtib29rQmxvYlY4KFt7bmFtZTonQW5hbGlzaXMgZGVsIHBhcnF1ZScscm93czpleHBvcnRSb3dzfSx7bmFtZTonQ29uc3VsdGEnLHJvd3M6W1snUGVyw61vZG8nLHNlbGVjdGVkRGF0ZVRleHRWOCgnZ2xvYmFsJyldLFsnQ29uZmlndXJhY2nDs24nLEpTT04uc3RyaW5naWZ5KHZpZXdTdGF0ZS5wYXJrKV0sWydMaW1pdGFjaW9uZXMnLCQoJyNwYXJrSGVscExBJykudGV4dENvbnRlbnRdXX1dKSwnTEEtQW5hbGlzaXMtZGVsLXBhcnF1ZS54bHN4Jyk7fTsKCmNvbnN0IG1ldHJpY0NvbG9yc1Zpc3VhbExBPXtjb2luOicjMDA4Zjk1Jyx3aW46JyMzNjVmYjYnLHBvOicjYTg3NTE0Jyxwb246JyM4MDU3YjMnLGRldjonI2IyNGQ3MCcsYmV0OicjMjQ3YzliJyxwcml6ZTonIzgxNTRhYScscHJvbW86JyM5YTY0MWUnLHNwaW46JyMzNzgxNmMnLG9jYzonIzUzNmM4NCd9OwpmdW5jdGlvbiBtZXRyaWNWaXN1YWxMQShsYWJlbCl7Y29uc3QgdGV4dD1TdHJpbmcobGFiZWwpLm5vcm1hbGl6ZSgnTkZEJykucmVwbGFjZSgvW1x1MDMwMC1cdTAzNmZdL2csJycpLnRvVXBwZXJDYXNlKCk7aWYoL0RFU1ZJQUNJT04vLnRlc3QodGV4dCkpcmV0dXJuICdkZXYnO2lmKC9QQVlPVVQuKk5DQy8udGVzdCh0ZXh0KSlyZXR1cm4gJ3Bvbic7aWYoL1BBWU9VVC8udGVzdCh0ZXh0KSlyZXR1cm4gJ3BvJztpZigvQ09JTiBJTi8udGVzdCh0ZXh0KSlyZXR1cm4gJ2NvaW4nO2lmKC9XSU4vLnRlc3QodGV4dCkpcmV0dXJuICd3aW4nO2lmKC9BUFVFU1RBLy50ZXN0KHRleHQpKXJldHVybiAnYmV0JztpZigvUFJFTUlPLy50ZXN0KHRleHQpKXJldHVybiAncHJpemUnO2lmKC9QUk9NTy8udGVzdCh0ZXh0KSlyZXR1cm4gJ3Byb21vJztpZigvU1BJTi8udGVzdCh0ZXh0KSlyZXR1cm4gJ3NwaW4nO3JldHVybiBudWxsO30KZnVuY3Rpb24gY2hhcnRTZXJpZXNDb2xvcnNWaXN1YWxMQShtb2RlbCl7CiByZXR1cm4gbW9kZWwuc2VyaWVzLm1hcCgoc2VyaWVzLGkpPT57bGV0IG1ldHJpYz1tb2RlbC5kdWFsS2V5cz9tb2RlbC5kdWFsS2V5c1tpXTptb2RlbC5rZXk7aWYobWV0cmljPT09J3BvJyYmL05DQy9pLnRlc3Qoc2VyaWVzLm5hbWUpKW1ldHJpYz0ncG9uJztjb25zdCBiYXNlPW1ldHJpY0NvbG9yc1Zpc3VhbExBW21ldHJpY107aWYoIWJhc2UpcmV0dXJuIFsnIzAwOGY5NScsJyMzNjVmYjYnLCcjODA1N2IzJywnI2IyNGQ3MCcsJyMzNzgxNmMnLCcjOWE2NDFlJ11baSU2XTtpZihtb2RlbC5kdWFsS2V5c3x8bW9kZWwuc2VyaWVzLmxlbmd0aD09PTF8fG1ldHJpYyE9PW1vZGVsLmtleSlyZXR1cm4gYmFzZTsKIC8vIENvbXBhcmlzb25zIG9mIHNldmVyYWwgZ3JvdXBzIHJldGFpbiBkaXN0aW5jdCBzZXJpZXMsIHdoaWxlIHRoZSBtYWluIG1ldHJpYyBrZWVwcyBpdHMgY29sb3IuCiByZXR1cm4gaT09PTA/YmFzZTpbJyM1MzZjODQnLCcjODA1N2IzJywnI2IyNGQ3MCcsJyMzNzgxNmMnLCcjOWE2NDFlJ11bKChpLTEpJTUpXTt9KTsKfQpjb25zdCBmaWx0ZXJPcGVuVmlzdWFsTEE9bmV3IFNldCgpOwpjb25zdCBiYXJzQmVmb3JlVmlzdWFsTEE9YmFyc1YyOwpiYXJzVjI9ZnVuY3Rpb24oaXRlbXMsa2V5LGNvbG9yKXtyZXR1cm4gYmFyc0JlZm9yZVZpc3VhbExBKGl0ZW1zLGtleSxtZXRyaWNDb2xvcnNWaXN1YWxMQVtrZXldfHxjb2xvcik7fTsKZnVuY3Rpb24gcG9saXNoVmlzdWFsTEEoKXsKIGlmKCFkYXRhKXJldHVybjsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjb250ZW50IC5rcGknKS5mb3JFYWNoKGNhcmQ9Pntjb25zdCBsYWJlbD1jYXJkLnF1ZXJ5U2VsZWN0b3IoJ3NtYWxsJyk/LnRleHRDb250ZW50fHwnJyxtZXRyaWM9bWV0cmljVmlzdWFsTEEobGFiZWwpO2lmKG1ldHJpYyl7Y2FyZC5kYXRhc2V0Lm1ldHJpY1Zpc3VhbExhPW1ldHJpYztjYXJkLnN0eWxlLnNldFByb3BlcnR5KCctLW1ldHJpYy1hY2NlbnQtbGEnLG1ldHJpY0NvbG9yc1Zpc3VhbExBW21ldHJpY10pO31jb25zdCB2YWx1ZT1jYXJkLnF1ZXJ5U2VsZWN0b3IoJ3N0cm9uZycpO2lmKHZhbHVlKXZhbHVlLnRpdGxlPXZhbHVlLnRleHRDb250ZW50O30pOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NvbnRlbnQgLmZpbHRlcmdyaWQnKS5mb3JFYWNoKChncmlkLGkpPT57CiAgaWYoZ3JpZC5jbG9zZXN0KCdkZXRhaWxzJyl8fGdyaWQuY2xvc2VzdCgnLmNvbXBhcmVwYW5lbCcpfHxncmlkLmNsb3Nlc3QoJyNhbGVydENvbmZpZ0xBJykpcmV0dXJuOwogIGNvbnN0IGtleT10YWIrJ3wnK2ksZm9sZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7Zm9sZC5jbGFzc05hbWU9J2NvbXBhY3RGb2xkTEEgdmlzdWFsRmlsdGVyc0xBJztmb2xkLm9wZW49ZmlsdGVyT3BlblZpc3VhbExBLmhhcyhrZXkpOwogIGNvbnN0IHN1bW1hcnk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO2NvbnN0IGxhYmVscz1bLi4uZ3JpZC5xdWVyeVNlbGVjdG9yQWxsKCdzZWxlY3RbZGF0YS1maWx0ZXJdJyldLHNlbGVjdGVkPWxhYmVscy5yZWR1Y2UoKG4sZWwpPT5uK1suLi5lbC5zZWxlY3RlZE9wdGlvbnNdLmxlbmd0aCwwKTtzdW1tYXJ5LnRleHRDb250ZW50PSdGaWx0cm9zIGRlIG3DoXF1aW5hcyB5IHViaWNhY2lvbmVzJysoc2VsZWN0ZWQ/JyDCtyAnK3NlbGVjdGVkKycgc2VsZWNjacOzbihlcykgYWN0aXZhcyc6JyDCtyB0b2RvcycpO2ZvbGQuYXBwZW5kQ2hpbGQoc3VtbWFyeSk7Z3JpZC5iZWZvcmUoZm9sZCk7Zm9sZC5hcHBlbmRDaGlsZChncmlkKTtmb2xkLm9udG9nZ2xlPSgpPT57aWYoZm9sZC5vcGVuKWZpbHRlck9wZW5WaXN1YWxMQS5hZGQoa2V5KTtlbHNlIGZpbHRlck9wZW5WaXN1YWxMQS5kZWxldGUoa2V5KTt9OwogfSk7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY29udGVudCAudGFibGV3cmFwLCNjb250ZW50IC5jaGFydGRhdGF3cmFwJykuZm9yRWFjaChob3N0PT57aG9zdC5jbGFzc0xpc3QuYWRkKCd2aXN1YWxUYWJsZUxBJyk7aWYoIWhvc3QuaGFzQXR0cmlidXRlKCd0YWJpbmRleCcpKWhvc3QudGFiSW5kZXg9MDtpZighaG9zdC5oYXNBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSlob3N0LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsJ1RhYmxhIGRlIGRhdG9zOyBwdWVkZXMgZGVzcGxhemFydGUgcGFyYSB2ZXIgdG9kYXMgbGFzIGNvbHVtbmFzJyk7fSk7Cn0KLy8gUmVhbCBvcGVyYXRpb24gc3RhZ2VzLCBub3QgYW4gaW52ZW50ZWQgY29tcGxldGlvbiBwZXJjZW50YWdlLgpjb25zdCBidXN5T3BlcmF0aW9uc1Zpc3VhbExBPW5ldyBNYXAoKTtsZXQgYnVzeVNlcXVlbmNlVmlzdWFsTEE9MDsKZnVuY3Rpb24gZHJhd0J1c3lWaXN1YWxMQSgpewogbGV0IGJveD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnVzeVZpc3VhbExBJyk7aWYoIWJveCl7Ym94PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO2JveC5pZD0nYnVzeVZpc3VhbExBJztib3guc2V0QXR0cmlidXRlKCdyb2xlJywnc3RhdHVzJyk7Ym94LnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywncG9saXRlJyk7Ym94LmlubmVySFRNTD0nPHNwYW4gY2xhc3M9ImJ1c3lTcGlubmVyTEEiIGFyaWEtaGlkZGVuPSJ0cnVlIj48L3NwYW4+PHNwYW4gZGF0YS1idXN5LWxhYmVsPjwvc3Bhbj4nO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYm94KTt9CiBjb25zdCBhY3RpdmU9Wy4uLmJ1c3lPcGVyYXRpb25zVmlzdWFsTEEudmFsdWVzKCldLmF0KC0xKTtib3guaGlkZGVuPSFhY3RpdmU7Ym94LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWJ1c3ktbGFiZWxdJykudGV4dENvbnRlbnQ9YWN0aXZlfHwnJztkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtYWluJyk/LnNldEF0dHJpYnV0ZSgnYXJpYS1idXN5JyxhY3RpdmU/J3RydWUnOidmYWxzZScpOwp9CmFzeW5jIGZ1bmN0aW9uIHdpdGhCdXN5VmlzdWFsTEEobGFiZWwsb3BlcmF0aW9uKXtjb25zdCBpZD0rK2J1c3lTZXF1ZW5jZVZpc3VhbExBO2J1c3lPcGVyYXRpb25zVmlzdWFsTEEuc2V0KGlkLGxhYmVsKTtkcmF3QnVzeVZpc3VhbExBKCk7dHJ5e3JldHVybiBhd2FpdCBvcGVyYXRpb24oKTt9ZmluYWxseXtidXN5T3BlcmF0aW9uc1Zpc3VhbExBLmRlbGV0ZShpZCk7ZHJhd0J1c3lWaXN1YWxMQSgpO319CmNvbnN0IGNhY2hlZEJlZm9yZVZpc3VhbExBPWNhY2hlZDsKY2FjaGVkPWFzeW5jIGZ1bmN0aW9uKCl7cmV0dXJuIHdpdGhCdXN5VmlzdWFsTEEoJ0Rlc2NhcmdhbmRvIHkgdmFsaWRhbmRvIGxvcyBkYXRvc+KApicsKCk9PmNhY2hlZEJlZm9yZVZpc3VhbExBKCkpO307CmNvbnN0IG9wZW5TZXNzaW9uQmVmb3JlVmlzdWFsTEE9b3BlblNlc3Npb25WMTU7Cm9wZW5TZXNzaW9uVjE1PWFzeW5jIGZ1bmN0aW9uKHNlc3Npb24pe3JldHVybiB3aXRoQnVzeVZpc3VhbExBKCdQcmVwYXJhbmRvIGVsIGluZm9ybWUgaW5pY2lhbOKApicsKCk9Pm9wZW5TZXNzaW9uQmVmb3JlVmlzdWFsTEEoc2Vzc2lvbikpO307Ci8vIFlpZWxkIGJlZm9yZSBhIHJlcG9ydCBpcyBjYWxjdWxhdGVkIHNvIHRoZSBicm93c2VyIGNhbiBwYWludCBpdHMgbG9hZGluZyBzdGF0ZS4KbGV0IHBlbmRpbmdOYXZpZ2F0aW9uVmlzdWFsTEE9MDsKYXN5bmMgZnVuY3Rpb24gbmF2aWdhdGVWaXN1YWxMQShuZXh0KXtjb25zdCB0aWNrZXQ9KytwZW5kaW5nTmF2aWdhdGlvblZpc3VhbExBO3JldHVybiB3aXRoQnVzeVZpc3VhbExBKCdQcmVwYXJhbmRvICcrbmV4dC50b0xvY2FsZUxvd2VyQ2FzZSgnZXMnKSsn4oCmJyxhc3luYygpPT57YXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZT0+c2V0VGltZW91dChyZXNvbHZlLDMyKSk7aWYodGlja2V0IT09cGVuZGluZ05hdmlnYXRpb25WaXN1YWxMQXx8IWRhdGEpcmV0dXJuO2FjdGl2YXRlVGFiVjMobmV4dCk7fSk7fQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZXZlbnQ9Pntjb25zdCBidXR0b249ZXZlbnQudGFyZ2V0LmNsb3Nlc3Q/LignbmF2IGJ1dHRvbltkYXRhLXRhYl0nKTtpZighYnV0dG9ufHwhZGF0YSlyZXR1cm47ZXZlbnQucHJldmVudERlZmF1bHQoKTtldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtuYXZpZ2F0ZVZpc3VhbExBKGJ1dHRvbi5kYXRhc2V0LnRhYikuY2F0Y2goZXJyb3I9Pntjb25zdCBzdGF0dXM9JCgnI3N0YXR1cycpO2lmKHN0YXR1cylzdGF0dXMudGV4dENvbnRlbnQ9J05vIHNlIHB1ZG8gcHJlcGFyYXIgZWwgaW5mb3JtZTogJytlcnJvci5tZXNzYWdlO30pO30sdHJ1ZSk7CmNvbnN0IHJlbmRlckJlZm9yZVZpc3VhbExBPXJlbmRlcjsKcmVuZGVyPWZ1bmN0aW9uKCl7cmVuZGVyQmVmb3JlVmlzdWFsTEEoKTtwb2xpc2hWaXN1YWxMQSgpO307CmNvbnN0IHBhcmtUYWJsZUJlZm9yZVZpc3VhbExBPXBhcmtUYWJsZUxBOwpwYXJrVGFibGVMQT1mdW5jdGlvbiguLi5hcmdzKXtwYXJrVGFibGVCZWZvcmVWaXN1YWxMQSguLi5hcmdzKTthcmdzWzBdLnF1ZXJ5U2VsZWN0b3IoJy50YWJsZXdyYXAnKT8uY2xhc3NMaXN0LmFkZCgndmlzdWFsVGFibGVMQScpO307Cgpjb25zdCBwZXJpb2RUYWJWMTA9J0Fuw6FsaXNpcyBwb3IgcGVyw61vZG8nLHBlcmlvZERheXNWMTA9WydMdW5lcycsJ01hcnRlcycsJ01pw6lyY29sZXMnLCdKdWV2ZXMnLCdWaWVybmVzJywnU8OhYmFkbycsJ0RvbWluZ28nXSxwZXJpb2RNZXRyaWNzVjEwPVsnd2luJywnY29pbicsJ3NwaW4nLCdiZXQnLCdwbycsJ3BvbicsJ2RldicsJ3Byb21vJywncHJpemUnLCd3ZCcsJ2NkJywnc2QnLCdvY2MnXTsKZnVuY3Rpb24gbW9uZGF5VjEwKGRhdGUpe3JldHVybiBzaGlmdERhdGVMQShkYXRlLC0oKG5ldyBEYXRlKGRhdGUrJ1QxMjowMDowMFonKS5nZXRVVENEYXkoKSs2KSU3KSk7fQpmdW5jdGlvbiBzaG9ydERhdGVQZXJpb2RWMTAoZGF0ZSl7cmV0dXJuIGRhdGUuc2xpY2UoOCwxMCkrJy8nK2RhdGUuc2xpY2UoNSw3KSsnLycrZGF0ZS5zbGljZSgwLDQpO30KZnVuY3Rpb24gd2Vla1RleHRWMTAoc3RhcnQpe3JldHVybiBzaG9ydERhdGVQZXJpb2RWMTAoc3RhcnQpKycg4oaSICcrc2hvcnREYXRlUGVyaW9kVjEwKHNoaWZ0RGF0ZUxBKHN0YXJ0LDYpKTt9CmZ1bmN0aW9uIGNhdGFsb2dQZXJpb2RWMTAocm93cyl7CiBjb25zdCBkYXRlcz1bLi4ubmV3IFNldChyb3dzLm1hcChyPT5yWzBdKSldLnNvcnQoKSx3ZWVrcz1uZXcgTWFwKCk7Zm9yKGNvbnN0IGRhdGUgb2YgZGF0ZXMpe2NvbnN0IGtleT1tb25kYXlWMTAoZGF0ZSk7aWYoIXdlZWtzLmhhcyhrZXkpKXdlZWtzLnNldChrZXkse2tleSxtb250aHM6bmV3IFNldCgpLGRhdGVzOltdfSk7d2Vla3MuZ2V0KGtleSkubW9udGhzLmFkZChkYXRlLnNsaWNlKDAsNykpO3dlZWtzLmdldChrZXkpLmRhdGVzLnB1c2goZGF0ZSk7fQogcmV0dXJue2RhdGVzLG1vbnRoczpbLi4ubmV3IFNldChkYXRlcy5tYXAoZD0+ZC5zbGljZSgwLDcpKSldLHdlZWtzOlsuLi53ZWVrcy52YWx1ZXMoKV0uc29ydCgoYSxiKT0+YS5rZXkubG9jYWxlQ29tcGFyZShiLmtleSkpfTsKfQpsZXQgY2F0YWxvZ0NhY2hlUGVyaW9kVjEwPW51bGwsY3VycmVudFBlcmlvZFJlcG9ydFYxMD1udWxsOwpmdW5jdGlvbiBjYXRhbG9nQ3VycmVudFYxMCgpe2lmKGNhdGFsb2dDYWNoZVBlcmlvZFYxMD8ubWF0cml4IT09ZGF0YSljYXRhbG9nQ2FjaGVQZXJpb2RWMTA9e21hdHJpeDpkYXRhLGNhdGFsb2c6Y2F0YWxvZ1BlcmlvZFYxMChkYXRhLnJvd3MpfTtyZXR1cm4gY2F0YWxvZ0NhY2hlUGVyaW9kVjEwLmNhdGFsb2c7fQpmdW5jdGlvbiBhdmFpbGFibGVXZWVrc1YxMChjYXRhbG9nLG1vbnRocyl7cmV0dXJuIGNhdGFsb2cud2Vla3MuZmlsdGVyKHc9PiFtb250aHMubGVuZ3RofHxbLi4udy5tb250aHNdLnNvbWUobT0+bW9udGhzLmluY2x1ZGVzKG0pKSk7fQpmdW5jdGlvbiBzdGF0ZVBlcmlvZFYxMChsZWdhY3kpewogaWYoIXZpZXdTdGF0ZS5wZXJpb2RBbmFseXNpcyl7Y29uc3Qgb2xkPWxlZ2FjeT92aWV3U3RhdGVbbGVnYWN5XTp2aWV3U3RhdGUud2Vla2x5O3ZpZXdTdGF0ZS5wZXJpb2RBbmFseXNpcz17ZmlsdGVyczpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9sZD8uZmlsdGVyc3x8e30pKSxncmFpbjpsZWdhY3k9PT0nbW9udGhseSc/J21vbnRoJzond2VlaycsbW9udGhzOmxlZ2FjeT9bXTpbY2F0YWxvZ0N1cnJlbnRWMTAoKS5tb250aHMuYXQoLTEpXS5maWx0ZXIoQm9vbGVhbiksd2Vla3M6W10sd2Vla2RheXM6WzAsMSwyLDMsNCw1LDZdLGNoYXJ0Q29sdW1uczpvbGQ/LmNoYXJ0Q29sdW1uc3x8MiwuLi4oQXJyYXkuaXNBcnJheShvbGQ/LmNoYXJ0U2VsZWN0aW9uKT97Y2hhcnRTZWxlY3Rpb246Wy4uLm9sZC5jaGFydFNlbGVjdGlvbl19Ont9KX07fQogY29uc3Qgcz12aWV3U3RhdGUucGVyaW9kQW5hbHlzaXM7cy5maWx0ZXJzPz89e307ZGVsZXRlIHMuZmlsdGVyc1snOCddO3MubW9udGhzPUFycmF5LmlzQXJyYXkocy5tb250aHMpP3MubW9udGhzOltdO3Mud2Vla3M9QXJyYXkuaXNBcnJheShzLndlZWtzKT9zLndlZWtzOltdO3Mud2Vla2RheXM9QXJyYXkuaXNBcnJheShzLndlZWtkYXlzKT9zLndlZWtkYXlzOlswLDEsMiwzLDQsNSw2XTtpZighWydkYXknLCd3ZWVrJywnbW9udGgnLCdvdmVybGF5J10uaW5jbHVkZXMocy5ncmFpbikpcy5ncmFpbj0nd2Vlayc7cmV0dXJuIHM7Cn0KZnVuY3Rpb24gYnVpbGRQZXJpb2RWMTAocm93cyxzLGNhdGFsb2cpewogY29uc3QgYXZhaWxhYmxlPWF2YWlsYWJsZVdlZWtzVjEwKGNhdGFsb2cscy5tb250aHMpLHdlZWtLZXlzPXMud2Vla3MubGVuZ3RoP3Mud2Vla3MuZmlsdGVyKGs9PmF2YWlsYWJsZS5zb21lKHc9Pncua2V5PT09aykpOmF2YWlsYWJsZS5tYXAodz0+dy5rZXkpLHdlZWtTZXQ9bmV3IFNldCh3ZWVrS2V5cyksd2Vla2RheVNldD1uZXcgU2V0KHMud2Vla2RheXMubWFwKE51bWJlcikpOwogY29uc3QgbW9udGhNYXRjaD1kPT4hcy5tb250aHMubGVuZ3RofHxzLm1vbnRocy5pbmNsdWRlcyhkLnNsaWNlKDAsNykpLGxlZ2FjeURhdGVzPUFycmF5LmlzQXJyYXkocy5sZWdhY3lEYXRlcyk/bmV3IFNldChzLmxlZ2FjeURhdGVzKTpudWxsOwogY29uc3QgZGF0ZU1hdGNoPWQ9PntpZihsZWdhY3lEYXRlcyYmIWxlZ2FjeURhdGVzLmhhcyhkKSlyZXR1cm4gZmFsc2U7Y29uc3QgaW5XZWVrPXdlZWtTZXQuaGFzKG1vbmRheVYxMChkKSk7cmV0dXJuIChzLmdyYWluPT09J3dlZWsnfHxzLmdyYWluPT09J292ZXJsYXknfHxzLndlZWtzLmxlbmd0aD9pbldlZWs6dHJ1ZSkmJihzLmdyYWluPT09J21vbnRoJ3x8KHMuZ3JhaW49PT0nZGF5JyYmIXMud2Vla3MubGVuZ3RoKT9tb250aE1hdGNoKGQpOnRydWUpJiZ3ZWVrZGF5U2V0LmhhcygobmV3IERhdGUoZCsnVDEyOjAwOjAwWicpLmdldFVUQ0RheSgpKzYpJTcpO307CiBjb25zdCBhY2NlcHRlZERhdGVzPW5ldyBTZXQoY2F0YWxvZy5kYXRlcy5maWx0ZXIoZGF0ZU1hdGNoKSk7CiBjb25zdCBzZWxlY3RlZD1yb3dzLmZpbHRlcihyPT5hY2NlcHRlZERhdGVzLmhhcyhyWzBdKSYmT2JqZWN0LmVudHJpZXMocy5maWx0ZXJzKS5ldmVyeSgoW2ssdl0pPT4hdi5sZW5ndGh8fHYuaW5jbHVkZXMoU3RyaW5nKHJba10/PydTaW4gZGF0bycpKSkpOwogY29uc3QgYnlEYXRlPW5ldyBNYXAoKTtmb3IoY29uc3QgciBvZiBzZWxlY3RlZCl7aWYoIWJ5RGF0ZS5oYXMoclswXSkpYnlEYXRlLnNldChyWzBdLFtdKTtieURhdGUuZ2V0KHJbMF0pLnB1c2gocik7fQogY29uc3QgcG9pbnQ9KG5hbWUsc291cmNlLGxhYmVsLHJhbmdlKT0+KHtuYW1lLHJvd3M6c291cmNlLC4uLihzb3VyY2UubGVuZ3RoP2FnZyhzb3VyY2UpOk9iamVjdC5mcm9tRW50cmllcyhwZXJpb2RNZXRyaWNzVjEwLm1hcChrPT5bayxudWxsXSkpKSxsYWJlbFYxMDpsYWJlbCxyYW5nZVYxMDpyYW5nZSxvYnNlcnZlZDpzb3VyY2UubGVuZ3RoPjAsZGF5c09ic2VydmVkOm5ldyBTZXQoc291cmNlLm1hcChyPT5yWzBdKSkuc2l6ZX0pOwogY29uc3QgZGFpbHk9KHN0YXJ0LG92ZXJsYXkpPT5zLndlZWtkYXlzLm1hcChOdW1iZXIpLnNvcnQoKGEsYik9PmEtYikubWFwKGRheT0+e2NvbnN0IGRhdGU9c2hpZnREYXRlTEEoc3RhcnQsZGF5KTtyZXR1cm57Li4ucG9pbnQob3ZlcmxheT9TdHJpbmcoZGF5KzEpLnBhZFN0YXJ0KDIsJzAnKSsnIMK3ICcrcGVyaW9kRGF5c1YxMFtkYXldOmRhdGUsYnlEYXRlLmdldChkYXRlKXx8W10sb3ZlcmxheT9wZXJpb2REYXlzVjEwW2RheV06c2hvcnREYXRlUGVyaW9kVjEwKGRhdGUpLG92ZXJsYXk/Jyc6c2hvcnREYXRlUGVyaW9kVjEwKGRhdGUpKSxkYXRlLHdlZWs6c3RhcnQsZGF5fTt9KTsKIGxldCBsaXN0PVtdLHNlcmllcz1bXTsKIGlmKHMuZ3JhaW49PT0nb3ZlcmxheScpe3Nlcmllcz13ZWVrS2V5cy5tYXAoc3RhcnQ9Pih7bmFtZTp3ZWVrVGV4dFYxMChzdGFydCksd2VlazpzdGFydCxwb2ludHM6ZGFpbHkoc3RhcnQsdHJ1ZSl9KSk7bGlzdD1zZXJpZXMuZmxhdE1hcChnPT5nLnBvaW50cy5tYXAocD0+KHsuLi5wLG5hbWU6Zy53ZWVrKyd8JytwLmRhdGUsbGFiZWxWMTA6ZGlzcGxheURhdGVzVjUocC5kYXRlKX0pKSk7fQogZWxzZSBpZihzLmdyYWluPT09J3dlZWsnKXtjb25zdCBncm91cGVkPW5ldyBNYXAod2Vla0tleXMubWFwKGs9PltrLFtdXSkpO2Zvcihjb25zdCByIG9mIHNlbGVjdGVkKWdyb3VwZWQuZ2V0KG1vbmRheVYxMChyWzBdKSk/LnB1c2gocik7bGlzdD1bLi4uZ3JvdXBlZF0ubWFwKChbc3RhcnQsc291cmNlXSk9Pih7Li4ucG9pbnQoJ1d8JytzdGFydCxzb3VyY2UsJ1MnK3dlZWtOdW1iZXJWOChzdGFydCkrJyDCtyAnK3N0YXJ0LnNsaWNlKDgpKycvJytzdGFydC5zbGljZSg1LDcpKycgJytzdGFydC5zbGljZSgwLDQpLHN0YXJ0LnNsaWNlKDgpKycvJytzdGFydC5zbGljZSg1LDcpKyfigJMnK3NoaWZ0RGF0ZUxBKHN0YXJ0LDYpLnNsaWNlKDgpKycvJytzaGlmdERhdGVMQShzdGFydCw2KS5zbGljZSg1LDcpKSx3ZWVrOnN0YXJ0fSkpO30KIGVsc2UgaWYocy5ncmFpbj09PSdtb250aCcpe2NvbnN0IG1vbnRocz1zLm1vbnRocy5sZW5ndGg/Y2F0YWxvZy5tb250aHMuZmlsdGVyKG09PnMubW9udGhzLmluY2x1ZGVzKG0pKTpjYXRhbG9nLm1vbnRocyxncm91cGVkPW5ldyBNYXAobW9udGhzLm1hcChrPT5bayxbXV0pKTtmb3IoY29uc3QgciBvZiBzZWxlY3RlZClncm91cGVkLmdldChyWzBdLnNsaWNlKDAsNykpPy5wdXNoKHIpO2xpc3Q9Wy4uLmdyb3VwZWRdLm1hcCgoW21vbnRoLHNvdXJjZV0pPT5wb2ludChtb250aCxzb3VyY2UsZGlzcGxheURhdGVzVjUobW9udGgpLG1vbnRoKSk7fQogZWxzZSBpZihzLndlZWtzLmxlbmd0aCl7bGlzdD13ZWVrS2V5cy5mbGF0TWFwKHN0YXJ0PT5kYWlseShzdGFydCxmYWxzZSkpLnNvcnQoKGEsYik9PmEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO30KIGVsc2UgbGlzdD1jYXRhbG9nLmRhdGVzLmZpbHRlcihkYXRlTWF0Y2gpLm1hcChkYXRlPT4oey4uLnBvaW50KGRhdGUsYnlEYXRlLmdldChkYXRlKXx8W10sZGlzcGxheURhdGVzVjUoZGF0ZSksZGlzcGxheURhdGVzVjUoZGF0ZSkpLGRhdGUsd2Vlazptb25kYXlWMTAoZGF0ZSl9KSk7CiByZXR1cm57cm93czpzZWxlY3RlZCxsaXN0LHNlcmllcyx3ZWVrczp3ZWVrS2V5cyxzdW1tYXJ5OmFnZyhzZWxlY3RlZCl9Owp9CmZ1bmN0aW9uIHRleHRQZXJpb2RWMTAoKXtjb25zdCBzPXN0YXRlUGVyaW9kVjEwKCksZ3JhaW49e2RheTonRMOtYXMnLHdlZWs6J1NlbWFuYXMnLG1vbnRoOidNZXNlcycsb3ZlcmxheTonQ29tcGFyYWNpw7NuIGx1bmVzIGEgZG9taW5nbyd9W3MuZ3JhaW5dLGRheXM9cy53ZWVrZGF5cy5sZW5ndGg9PT03PydUb2RvcyBsb3MgZMOtYXMnOnMud2Vla2RheXMubGVuZ3RoP3Mud2Vla2RheXMubWFwKGk9PnBlcmlvZERheXNWMTBbaV0pLmpvaW4oJywgJyk6J1NpbiBkw61hcyBzZWxlY2Npb25hZG9zJztyZXR1cm4gZ3JhaW4rJyDCtyAnKyhzLm1vbnRocy5sZW5ndGg/cy5tb250aHMubWFwKGRpc3BsYXlEYXRlc1Y1KS5qb2luKCcsICcpOidUb2RvcyBsb3MgbWVzZXMnKSsnIMK3ICcrKHMud2Vla3MubGVuZ3RoP3Mud2Vla3MubGVuZ3RoKycgc2VtYW5hcyBlbGVnaWRhcyc6J1RvZGFzIGxhcyBzZW1hbmFzIGRpc3BvbmlibGVzJykrJyDCtyAnK2RheXMrKEFycmF5LmlzQXJyYXkocy5sZWdhY3lEYXRlcyk/JyDCtyBWaXN0YSBhbnRlcmlvcjogJytzLmxlZ2FjeURhdGVzLmxlbmd0aCsnIGZlY2hhcyBvcmlnaW5hbGVzOyBBcGxpY2FyIHNlbGVjY2nDs24gYWN0dWFsaXphIGVsIHBlcsOtb2RvJzonJyk7fQpjb25zdCBkZXNjcmliZUJlZm9yZVBlcmlvZFYxMD1wZXJpb2REZXNjcmlwdGlvblY0OwpwZXJpb2REZXNjcmlwdGlvblY0PWZ1bmN0aW9uKG5hbWUscG9pbnRzKXtjb25zdCBwb2ludD1wb2ludHMuZmluZChwPT5wLmxhYmVsVjEwKTtyZXR1cm4gcG9pbnQ/e2xhYmVsOnBvaW50LmxhYmVsVjEwLHJhbmdlOnBvaW50LnJhbmdlVjEwLGZ1bGw6cG9pbnQubGFiZWxWMTArJyDCtyAnK3BvaW50LnJhbmdlVjEwfTpkZXNjcmliZUJlZm9yZVBlcmlvZFYxMChuYW1lLHBvaW50cyk7fTsKY29uc3QgY29sb3JzQmVmb3JlUGVyaW9kVjEwPWNoYXJ0U2VyaWVzQ29sb3JzVmlzdWFsTEE7CmNoYXJ0U2VyaWVzQ29sb3JzVmlzdWFsTEE9ZnVuY3Rpb24obW9kZWwpe2NvbnN0IGNvbG9ycz1jb2xvcnNCZWZvcmVQZXJpb2RWMTAobW9kZWwpO2lmKCFtb2RlbC5hbGlnbmVkV2Vla3NWMTApcmV0dXJuIGNvbG9ycztyZXR1cm4gY29sb3JzLm1hcCgoY29sb3IsaSk9Pntjb25zdCB3ZWVrPU1hdGguZmxvb3IoaS8obW9kZWwubWV0cmljQ291bnRWMTB8fDEpKSxuPXdlZWslNjtpZighbnx8IS9eI1tcZGEtZl17Nn0kL2kudGVzdChjb2xvcikpcmV0dXJuIGNvbG9yO3JldHVybiAnIycrWzEsMyw1XS5tYXAoaz0+TWF0aC5yb3VuZChwYXJzZUludChjb2xvci5zbGljZShrLGsrMiksMTYpKigxLW4qLjEwKSkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsJzAnKSkuam9pbignJyk7fSk7fTsKZnVuY3Rpb24gcHJlZmVyUG9pbnRQZXJpb2RWMTAocG9pbnQpe2NvbnN0IHJvd3M9cG9pbnQucm93cy5maWx0ZXIocHJlZmVyZW5jaWFsKTtyZXR1cm57Li4ucG9pbnQscm93cywuLi4ocm93cy5sZW5ndGg/YWdnKHJvd3MpOk9iamVjdC5mcm9tRW50cmllcyhwZXJpb2RNZXRyaWNzVjEwLm1hcChrPT5bayxudWxsXSkpKSxvYnNlcnZlZDpyb3dzLmxlbmd0aD4wLGRheXNPYnNlcnZlZDpuZXcgU2V0KHJvd3MubWFwKHI9PnJbMF0pKS5zaXplfTt9CmZ1bmN0aW9uIGNoYXJ0UGVyaW9kVjEwKHJlcG9ydCxzLGtleXMscHJlZmVyZW50aWFsPWZhbHNlKXsKIGxldCBzZXJpZXMsZHVhbD1udWxsLGtleT1rZXlzLmxlbmd0aD09PTE/a2V5c1swXTpudWxsOwogaWYocy5ncmFpbj09PSdvdmVybGF5Jyl7c2VyaWVzPXJlcG9ydC5zZXJpZXMuZmxhdE1hcChncm91cD0+a2V5cy5tYXAobWV0cmljPT4oe25hbWU6Z3JvdXAubmFtZSsnIMK3ICcrbWV0cmljc1ttZXRyaWNdLHBvaW50czpncm91cC5wb2ludHN9KSkpO2lmKGtleXMubGVuZ3RoPjEpZHVhbD1yZXBvcnQuc2VyaWVzLmZsYXRNYXAoKCk9PmtleXMpO30KIGVsc2V7c2VyaWVzPWtleXMubWFwKG1ldHJpYz0+KHtuYW1lOm1ldHJpY3NbbWV0cmljXSxwb2ludHM6cmVwb3J0Lmxpc3R9KSk7aWYoa2V5cy5sZW5ndGg+MSlkdWFsPWtleXM7fQogaWYocHJlZmVyZW50aWFsKXtjb25zdCBncm91cHM9cy5ncmFpbj09PSdvdmVybGF5Jz9yZXBvcnQuc2VyaWVzOlt7bmFtZTonJyxwb2ludHM6cmVwb3J0Lmxpc3R9XTtzZXJpZXM9Z3JvdXBzLmZsYXRNYXAoZ3JvdXA9PmtleXMuZmxhdE1hcChtZXRyaWM9Plt7bmFtZTpncm91cC5uYW1lKycgwrcgJyttZXRyaWNzW21ldHJpY10rJyDCtyBTZWxlY2Npw7NuIGNvbXBsZXRhJyxwb2ludHM6Z3JvdXAucG9pbnRzfSx7bmFtZTpncm91cC5uYW1lKycgwrcgJyttZXRyaWNzW21ldHJpY10rJyDCtyBQcmVmZXJlbmNpYWwnLHBvaW50czpncm91cC5wb2ludHMubWFwKHByZWZlclBvaW50UGVyaW9kVjEwKX1dKSk7ZHVhbD1rZXlzLmxlbmd0aD4xP2dyb3Vwcy5mbGF0TWFwKCgpPT5rZXlzLmZsYXRNYXAoaz0+W2ssa10pKTpudWxsO30KIGNvbnN0IGh0bWw9bGFiZWxlZENoYXJ0VjQoc2VyaWVzLGtleSxkdWFsKSxpZD1odG1sLm1hdGNoKC9kYXRhLXJlc3BvbnNpdmUtY2hhcnQtbGE9IihbXiJdKykiLyk/LlsxXSxtb2RlbD1yZXNwb25zaXZlQ2hhcnRNb2RlbHNMQS5nZXQoaWQpO2lmKG1vZGVsKXttb2RlbC5wZXJpb2RWMTA9dHJ1ZTttb2RlbC5zaGFyZWRNZXRyaWNTY2FsZXNWMTI9dHJ1ZTttb2RlbC5hbGlnbmVkV2Vla3NWMTA9cy5ncmFpbj09PSdvdmVybGF5Jzttb2RlbC5tZXRyaWNDb3VudFYxMD1rZXlzLmxlbmd0aCoocHJlZmVyZW50aWFsPzI6MSk7fQogaWYoZHVhbCl7Y29uc3QgYXhlcz1bLi4ubmV3IFNldChkdWFsKV07bGV0IGluZGV4PTA7cmV0dXJuIGh0bWwucmVwbGFjZSgvIMK3IGVqZSAoPzppenF1aWVyZG98ZGVyZWNobykvZywoKT0+e2NvbnN0IGF4aXM9YXhlcy5pbmRleE9mKGR1YWxbaW5kZXgrK10pO3JldHVybiBheGlzPT09MD8nIMK3IGVqZSBpenF1aWVyZG8nOmF4aXM9PT0xPycgwrcgZWplIGRlcmVjaG8nOicgwrcgZWplIGRlcmVjaG8gMic7fSk7fQogcmV0dXJuIGh0bWw7Cn0KZnVuY3Rpb24gY2hvaWNlc1BlcmlvZFYxMChzLGNhdGFsb2cpe2NvbnN0IHdlZWtDaG9pY2VzPWNhdGFsb2cud2Vla3MsYXZhaWxhYmxlPW5ldyBTZXQoYXZhaWxhYmxlV2Vla3NWMTAoY2F0YWxvZyxzLm1vbnRocykubWFwKHc9Pncua2V5KSk7cmV0dXJuIGA8c2VjdGlvbiBjbGFzcz0iY2FyZCBwZXJpb2RDb250cm9sc1YxMCI+PGRpdiBjbGFzcz0icGVyaW9kQ29udHJvbFJvd1YxMCI+JHtzZWxlY3RvcignVmVyIHBvcicsJ3BlcmlvZEdyYWluVjEwJyxzLmdyYWluLHt3ZWVrOidTZW1hbmFzIGRlbCBtZXMnLGRheTonRMOtYXMnLG1vbnRoOidNZXNlcycsb3ZlcmxheTonQ29tcGFyYXIgc2VtYW5hcyDCtyBsdW5lcyBhIGRvbWluZ28nfSl9PGRldGFpbHMgY2xhc3M9ImV4Y2VsRHJvcGRvd25WMTMiPjxzdW1tYXJ5Pk1lc2VzIMK3ICR7cy5tb250aHMubGVuZ3RofHwndG9kb3MnfTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJleGNlbE1lbnVWMTMiPjxwPlNpbiBtYXJjYXI6IHRvZG9zIGxvcyBtZXNlcy48L3A+PGRpdiBjbGFzcz0icGVyaW9kQ2hvaWNlc1YxMCI+JHtjYXRhbG9nLm1vbnRocy5tYXAobT0+YDxsYWJlbCBjbGFzcz0iY2hlY2tJdGVtVjEyIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGRhdGEtcGVyaW9kLW1vbnRoPSIke219IiAke3MubW9udGhzLmluY2x1ZGVzKG0pPydjaGVja2VkJzonJ30+PHNwYW4+JHtlc2MoZGlzcGxheURhdGVzVjUobSkpfTwvc3Bhbj48L2xhYmVsPmApLmpvaW4oJycpfTwvZGl2PjwvZGl2PjwvZGV0YWlscz48ZGV0YWlscyBjbGFzcz0iZXhjZWxEcm9wZG93blYxMyI+PHN1bW1hcnk+U2VtYW5hcyDCtyAke3Mud2Vla3MubGVuZ3RofHwndG9kYXMnfTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJleGNlbE1lbnVWMTMiPjxwPlNlbWFuYXMgZGlzcG9uaWJsZXMgZW4gbG9zIG1lc2VzIGVsZWdpZG9zLiBTaW4gbWFyY2FyOiB0b2Rhcy4gU2UgaW5jbHV5ZSBsYSBzZW1hbmEgY29tcGxldGEgYWwgdmVyIHBvciBkw61hcywgc2VtYW5hcyBvIGNvbXBhcmFyLjwvcD48ZGl2IGNsYXNzPSJwZXJpb2RDaG9pY2VzVjEwIj4ke3dlZWtDaG9pY2VzLm1hcCh3PT5gPGxhYmVsIGNsYXNzPSJjaGVja0l0ZW1WMTIiICR7YXZhaWxhYmxlLmhhcyh3LmtleSk/Jyc6J2hpZGRlbid9PjxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGF0YS1wZXJpb2Qtd2Vlaz0iJHt3LmtleX0iICR7cy53ZWVrcy5pbmNsdWRlcyh3LmtleSk/J2NoZWNrZWQnOicnfT48c3Bhbj4ke2VzYyh3ZWVrVGV4dFYxMCh3LmtleSkpfTxzbWFsbD4ke3cuZGF0ZXMubGVuZ3RofS83IGTDrWFzIGVuIGVsIGhpc3TDs3JpY288L3NtYWxsPjwvc3Bhbj48L2xhYmVsPmApLmpvaW4oJycpfTwvZGl2PjwvZGl2PjwvZGV0YWlscz48ZGV0YWlscyBjbGFzcz0iZXhjZWxEcm9wZG93blYxMyI+PHN1bW1hcnk+RMOtYXMgwrcgJHtzLndlZWtkYXlzLmxlbmd0aD09PTc/J3RvZG9zJzpzLndlZWtkYXlzLmxlbmd0aCsnIGVsZWdpZG9zJ308L3N1bW1hcnk+PGRpdiBjbGFzcz0iZXhjZWxNZW51VjEzIj48ZGl2IGNsYXNzPSJkcm9wZG93bkFjdGlvbnNWMTMiPjxidXR0b24gdHlwZT0iYnV0dG9uIiBpZD0icGVyaW9kQWxsRGF5c1YxMCI+VG9kb3M8L2J1dHRvbj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9InBlcmlvZE5vRGF5c1YxMCI+TmluZ3VubzwvYnV0dG9uPjwvZGl2PiR7cGVyaW9kRGF5c1YxMC5tYXAoKGRheSxpKT0+YDxsYWJlbCBjbGFzcz0iY2hlY2tJdGVtVjEyIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGRhdGEtcGVyaW9kLWRheT0iJHtpfSIgJHtzLndlZWtkYXlzLmluY2x1ZGVzKGkpPydjaGVja2VkJzonJ30+PHNwYW4+JHtkYXl9PC9zcGFuPjwvbGFiZWw+YCkuam9pbignJyl9PC9kaXY+PC9kZXRhaWxzPjxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0icHJpbWFyeSIgaWQ9InBlcmlvZEFwcGx5VjEwIj5BcGxpY2FyIHNlbGVjY2nDs248L2J1dHRvbj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9InBlcmlvZFJlc2V0VjEwIj7Dmmx0aW1vIG1lcyDCtyB0b2RvcyBsb3MgZMOtYXM8L2J1dHRvbj48L2Rpdj48cCBjbGFzcz0ic2lnbmFsbm90ZSIgaWQ9InBlcmlvZFBlbmRpbmdWMTAiPkxvcyBtZXNlcyBkZWxpbWl0YW4gbGFzIHNlbWFuYXMgZGlzcG9uaWJsZXMuIFBhcmEgY29tcGFyYXIgc2VtYW5hcyBkZSBkaXN0aW50b3MgbWVzZXMsIG1hcmNhIGVzb3MgbWVzZXMgeSBkZXNwdcOpcyBsYXMgc2VtYW5hcy48L3A+PGRldGFpbHMgY2xhc3M9ImNvbXBhY3RGb2xkTEEiPjxzdW1tYXJ5Pk3DoXF1aW5hcywgYmFuY29zIHkgdWJpY2FjaW9uZXMgwrcgJHtPYmplY3QudmFsdWVzKHMuZmlsdGVycykuZmlsdGVyKHY9PnYubGVuZ3RoKS5sZW5ndGh9IGZpbHRyb3MgYWN0aXZvczwvc3VtbWFyeT48ZGl2IGNsYXNzPSJmaWx0ZXJncmlkIj4ke2ZpbHRlckZpZWxkcyhzLCdwZXJpb2RBbmFseXNpcycsWzEsMiwzLDQsOSw1LDddKX08L2Rpdj48L2RldGFpbHM+PC9zZWN0aW9uPmA7fQpmdW5jdGlvbiBiaW5kUGVyaW9kVjEwKHMsY2F0YWxvZyl7CiBjb25zdCBjaGVja2VkPWtleT0+Wy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXBlcmlvZC0nK2tleSsnXScpXS5maWx0ZXIoZWw9PmVsLmNoZWNrZWQpLm1hcChlbD0+ZWwuZGF0YXNldFsncGVyaW9kJytrZXlbMF0udG9VcHBlckNhc2UoKStrZXkuc2xpY2UoMSldKTsKIGNvbnN0IG1hcmtQZW5kaW5nPSgpPT57JCgnI3BlcmlvZFBlbmRpbmdWMTAnKS50ZXh0Q29udGVudD0nU2VsZWNjacOzbiBwZW5kaWVudGUuIFB1bHNhIEFwbGljYXIgc2VsZWNjacOzbiBwYXJhIGFjdHVhbGl6YXIgbG9zIGdyw6FmaWNvcy4nO307CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1wZXJpb2QtbW9udGhdJykuZm9yRWFjaChlbD0+ZWwub25jaGFuZ2U9KCk9Pntjb25zdCBtb250aHM9Y2hlY2tlZCgnbW9udGgnKSxhdmFpbGFibGU9YXZhaWxhYmxlV2Vla3NWMTAoY2F0YWxvZyxtb250aHMpO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXBlcmlvZC13ZWVrXScpLmZvckVhY2goaW5wdXQ9Pntjb25zdCB2aXNpYmxlPWF2YWlsYWJsZS5zb21lKHc9Pncua2V5PT09aW5wdXQuZGF0YXNldC5wZXJpb2RXZWVrKTtpbnB1dC5jbG9zZXN0KCdsYWJlbCcpLmhpZGRlbj0hdmlzaWJsZTtpZighdmlzaWJsZSlpbnB1dC5jaGVja2VkPWZhbHNlO30pO21hcmtQZW5kaW5nKCk7fSk7CiAvLyBBbGwgd2Vla3MgZXhpc3QgaW4gdGhlIHNlbGVjdG9yOyBtb250aCBjaGFuZ2VzIHJldmVhbCBvcHRpb25zIHdpdGhvdXQgcmVuZGVyaW5nIHRoZSByZXBvcnQuCiAkKCcjcGVyaW9kQXBwbHlWMTAnKS5vbmNsaWNrPSgpPT57ZGVsZXRlIHMubGVnYWN5RGF0ZXM7cy5ncmFpbj0kKCcjcGVyaW9kR3JhaW5WMTAnKS52YWx1ZTtzLm1vbnRocz1jaGVja2VkKCdtb250aCcpO3Mud2Vla3M9Y2hlY2tlZCgnd2VlaycpO3Mud2Vla2RheXM9Y2hlY2tlZCgnZGF5JykubWFwKE51bWJlcik7cmVuZGVyKCk7fTsKICQoJyNwZXJpb2RHcmFpblYxMCcpLm9uY2hhbmdlPW1hcmtQZW5kaW5nO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXBlcmlvZC13ZWVrXSxbZGF0YS1wZXJpb2QtZGF5XScpLmZvckVhY2goZWw9PmVsLm9uY2hhbmdlPW1hcmtQZW5kaW5nKTsKICQoJyNwZXJpb2RBbGxEYXlzVjEwJykub25jbGljaz0oKT0+e2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXBlcmlvZC1kYXldJykuZm9yRWFjaChlbD0+ZWwuY2hlY2tlZD10cnVlKTttYXJrUGVuZGluZygpO307JCgnI3BlcmlvZE5vRGF5c1YxMCcpLm9uY2xpY2s9KCk9Pntkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1wZXJpb2QtZGF5XScpLmZvckVhY2goZWw9PmVsLmNoZWNrZWQ9ZmFsc2UpO21hcmtQZW5kaW5nKCk7fTsKICQoJyNwZXJpb2RSZXNldFYxMCcpLm9uY2xpY2s9KCk9PntkZWxldGUgcy5sZWdhY3lEYXRlcztzLm1vbnRocz1bY2F0YWxvZy5tb250aHMuYXQoLTEpXS5maWx0ZXIoQm9vbGVhbik7cy53ZWVrcz1bXTtzLndlZWtkYXlzPVswLDEsMiwzLDQsNSw2XTtyZW5kZXIoKTt9O2JpbmRGaWx0ZXJzKCk7Cn0KZnVuY3Rpb24gcmVuZGVyUGVyaW9kVjEwKCl7CiBjb25zdCBzPXN0YXRlUGVyaW9kVjEwKCksY2F0YWxvZz1jYXRhbG9nQ3VycmVudFYxMCgpLHJlcG9ydD1idWlsZFBlcmlvZFYxMChkYXRhLnJvd3MscyxjYXRhbG9nKTtjdXJyZW50UGVyaW9kUmVwb3J0VjEwPXJlcG9ydDtjaGFydFBvaW50c1Y0LmNsZWFyKCk7cmVzcG9uc2l2ZUNoYXJ0TW9kZWxzTEEuY2xlYXIoKTsKIGRvY3VtZW50LmJvZHkuZGF0YXNldC52aWV3PXBlcmlvZFRhYlYxMDskKCcjdGl0bGUnKS50ZXh0Q29udGVudD1wZXJpb2RUYWJWMTA7JCgnI3ZpZXdIZWxwJykudGV4dENvbnRlbnQ9J0xvcyBwZXLDrW9kb3Mgc2UgZWxpZ2VuIGRlbnRybyBkZSBlc3RlIGluZm9ybWUuJztkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmlsdGVycycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOyQoJyNjb250cm9scycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOyQoJyNmaWx0ZXJzJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7CiBjb25zdCBzcGVjPVtbJ1dpbiB5IHBheW91dCcsWyd3aW4nLCdwbyddXSxbJ0NvaW4gSW4geSBhcHVlc3RhIHByb21lZGlvJyxbJ2NvaW4nLCdiZXQnXV0sWydQYXlvdXQgeSBkZXN2aWFjacOzbiBOQ0MnLFsncG8nLCdkZXYnXV0sWydQYXlvdXQgeSBwYXlvdXQgY29uIE5DQycsWydwbycsJ3BvbiddXSxbJ1Byb21vIG5ldGEgeSBkZXN2aWFjacOzbiBOQ0MnLFsncHJvbW8nLCdkZXYnXV0sWydQcmVtaW9zJyxbJ3ByaXplJ11dLFsnV2luIHkgZGVzdmlhY2nDs24gTkNDJyxbJ3dpbicsJ2RldiddXSxbJ0NvaW4gSW4gcG9yIG3DoXF1aW5hLWTDrWEnLFsnY2QnXV0sWydXaW4gcG9yIG3DoXF1aW5hLWTDrWEnLFsnd2QnXV0sWydXaW4gwrcgU2VsZWNjacOzbiB5IHNhbMOzbiBwcmVmZXJlbmNpYWwnLFsnd2luJ10sdHJ1ZV0sWydDb2luIEluIMK3IFNlbGVjY2nDs24geSBzYWzDs24gcHJlZmVyZW5jaWFsJyxbJ2NvaW4nXSx0cnVlXV07CiBjb25zdCBjaGFydHM9dHlwZW9mIGVkaXRhYmxlQ2FyZHNQZXJpb2RWMTI9PT0nZnVuY3Rpb24nP2VkaXRhYmxlQ2FyZHNQZXJpb2RWMTIoc3BlYyxyZXBvcnQscyk6c3BlYy5tYXAoKFt0aXRsZSxrZXlzLHByZWZdKT0+Z3JhcGhDYXJkKHRpdGxlLGNoYXJ0UGVyaW9kVjEwKHJlcG9ydCxzLGtleXMscHJlZiksKHByZWY/J0VsIHNhbMOzbiBlc3TDoSBpbmNsdWlkbyBlbiBlbCB0b3RhbDsgbm8gc3VtYXIgbMOtbmVhcy4gwrcgJzprZXlzLmxlbmd0aD4xPydFamVzIGluZGVwZW5kaWVudGVzIMK3ICc6JycpKyhzLmdyYWluPT09J292ZXJsYXknPydDYWRhIHNlbWFuYSBzZSBjb21wYXJhIGVuIGxvcyBtaXNtb3MgZMOtYXM7IGxvcyBodWVjb3Mgbm8gZXF1aXZhbGVuIGEgY2Vyby4nOidBZ3JlZ2Fkb3MgZGUgbGEgc2VsZWNjacOzbjsgcmV2aXNhciBkw61hcyBkaXNwb25pYmxlcy4nKSkpLmpvaW4oJycpLHRvdGFsPXJlcG9ydC5zdW1tYXJ5OwogY29uc3QgaGVhZGVycz1bJ1BlcsOtb2RvJywnRXN0YWRvJywnRMOtYXMgcmVnaXN0cmFkb3MnLCdNw6FxdWluYXMtZMOtYScsLi4ucGVyaW9kTWV0cmljc1YxMC5tYXAoaz0+bWV0cmljc1trXSldLGRldGFpbD1yZXBvcnQubGlzdC5tYXAocD0+W3AubGFiZWxWMTArKHAud2Vlaz8nIMK3ICcrd2Vla1RleHRWMTAocC53ZWVrKTonJykscC5vYnNlcnZlZD8nQ29uIHJlZ2lzdHJvcyc6J1NpbiByZWdpc3RybycscC5kYXlzT2JzZXJ2ZWQscC5vYnNlcnZlZD9hZ2cocC5yb3dzKS5kYXlzOm51bGwsLi4ucGVyaW9kTWV0cmljc1YxMC5tYXAoaz0+cFtrXT8/bnVsbCldKTtleHBvcnRSb3dzPVtoZWFkZXJzLC4uLmRldGFpbF07CiAkKCcjY29udGVudCcpLmlubmVySFRNTD1iYW5uZXIocGVyaW9kVGFiVjEwLCdVbiDDum5pY28gaW5mb3JtZSBwYXJhIGFncnVwYXIgcG9yIGTDrWFzLCBzZW1hbmFzIG8gbWVzZXMgeSBzdXBlcnBvbmVyIHNlbWFuYXMgYW50ZXJpb3Jlcy4nKStjaG9pY2VzUGVyaW9kVjEwKHMsY2F0YWxvZykrc3RhdENhcmRzKFtbJ1dJTicsY29tcGFjdChyZXBvcnQucm93cy5sZW5ndGg/dG90YWwud2luOm51bGwsJ3dpbicpLCdDTFAgwrcgU2VsZWNjacOzbiBhY3R1YWwnXSxbJ0NPSU4gSU4nLGNvbXBhY3QocmVwb3J0LnJvd3MubGVuZ3RoP3RvdGFsLmNvaW46bnVsbCwnY29pbicpLCdDTFAgwrcgU2VsZWNjacOzbiBhY3R1YWwnXSxbJ1BBWU9VVCcsZm10KHRvdGFsLnBvLCdwbycpLCdTb2JyZSBsb3MgdG90YWxlcywgbm8gcHJvbWVkaW8gZGUgcG9yY2VudGFqZXMnXSxbJ0FQVUVTVEEgUFJPTUVESU8nLGZtdCh0b3RhbC5iZXQpLCdDTFAgcG9yIHNwaW4nXV0pK2A8ZGl2IGNsYXNzPSJub3RpY2UiPlNlbWFuYXMgZGUgbHVuZXMgYSBkb21pbmdvLCBpZGVudGlmaWNhZGFzIHBvciBzdSBmZWNoYSBkZSBpbmljaW8uIEFsIGVsZWdpciBzZW1hbmFzIHNlIGluY2x1eWVuIHN1cyBkw61hcyBjb21wbGV0b3MgYXVucXVlIGNydWNlbiBkZSBtZXMuIEVuIHZpc3RhIG1lbnN1YWwgc2UgcmVzcGV0YW4gbG9zIGzDrW1pdGVzIGRlbCBtZXMuIETDrWFzIHNpbiByZWdpc3Ryb3M6IMKr4oCUwrs7IGTDrWFzIGNvbiByZWdpc3Ryb3MgeSB2YWxvcmVzIGNlcm86IDAuIExhcyBzZW1hbmFzIHBhcmNpYWxlcyBwdWVkZW4gbm8gc2VyIGNvbXBhcmFibGVzIHBvciB0b3RhbGVzOyB0YW1iacOpbiB0aWVuZXMgaW5kaWNhZG9yZXMgcG9yIG3DoXF1aW5hLWTDrWEuPC9kaXY+PGRpdiBjbGFzcz0icGVyaW9kQ292ZXJhZ2VWMTAiPiR7cmVwb3J0LnJvd3MubGVuZ3RoLnRvTG9jYWxlU3RyaW5nKCdlcy1DTCcpfSByZWdpc3Ryb3MgwrcgJHtuZXcgU2V0KHJlcG9ydC5yb3dzLm1hcChyPT5yWzBdKSkuc2l6ZX0gZmVjaGFzIGNvbiBkYXRvcyDCtyAke3MuZ3JhaW49PT0nb3ZlcmxheSc/cmVwb3J0LnNlcmllcy5sZW5ndGgrJyBzZW1hbmFzIHN1cGVycHVlc3Rhcyc6cmVwb3J0Lmxpc3QubGVuZ3RoKycgcGVyw61vZG9zJ308L2Rpdj48ZGl2IGNsYXNzPSJyZXBvcnRjaGFydHMiPiR7Y2hhcnRzfTwvZGl2PjxzZWN0aW9uIGNsYXNzPSJjYXJkIj48aDI+RGV0YWxsZSBkZSBwZXLDrW9kb3MgeSBjb2JlcnR1cmE8L2gyPjxkaXYgaWQ9InBlcmlvZERldGFpbFYxMCI+PC9kaXY+PC9zZWN0aW9uPmA7CiBwYXJrVGFibGVMQSgkKCcjcGVyaW9kRGV0YWlsVjEwJyksaGVhZGVycyxkZXRhaWwsaGVhZGVycy5tYXAoKGgsaSk9PlsncG8nLCdwb24nLCdkZXYnLCdvY2MnXS5pbmNsdWRlcyhwZXJpb2RNZXRyaWNzVjEwW2ktNF0pP3BlcmNlbnRQYXJrTEE6bnVsbCkpO2JpbmRQZXJpb2RWMTAocyxjYXRhbG9nKTsKICQoJyNjb250ZW50JykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJyxhY3RpdmVGaWx0ZXJzTEEoKSk7ZGVjb3JhdGVDaGFydHNWOCgpO2VuaGFuY2VUYWJsZXNMQSgpO2NvbmZpZ3VyZVJlcG9ydENoYXJ0c0xBKCk7Zml0UmVzcG9uc2l2ZUNoYXJ0c0xBKCk7cG9saXNoVmlzdWFsTEEoKTtmb3JtYXRUZXh0RGF0ZXNWNSgkKCcjY29udGVudCcpKTsKIGlmKHR5cGVvZiBiaW5kRWRpdGFibGVQZXJpb2RWMTI9PT0nZnVuY3Rpb24nKWJpbmRFZGl0YWJsZVBlcmlvZFYxMihzcGVjKTsKIHNldHVwRXhwZXJpZW5jZUhlYWRlckxBKCk7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RhdGFTdGF0dXNMQScpPy5yZW1vdmUoKTtjb25zdCBzdGF0dXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7c3RhdHVzLmlkPSdkYXRhU3RhdHVzTEEnO3N0YXR1cy5jbGFzc05hbWU9J2RhdGFTdGF0dXNMQSc7c3RhdHVzLmlubmVySFRNTD1kYXRhU3RhdHVzTEEoKTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkZXInKS5hZnRlcihzdGF0dXMpOwogLy8gUmVzdG9yZSB2aXNpYmlsaXR5IG9mIHRoZSBnZW5lcmFsIGRhdGUgcGFuZWwgd2hlbiB2aXNpdGluZyBhIGRpZmZlcmVudCB0YWIuCiBjb25zdCBmb2xkPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5maWx0ZXJzJyk/LmNsb3Nlc3QoJ2RldGFpbHMuY29tcGFjdEZvbGRMQScpO2lmKGZvbGQpZm9sZC5zdHlsZS5kaXNwbGF5PSdub25lJzsKfQpjb25zdCBhY3RpdmVGaWx0ZXJzQmVmb3JlUGVyaW9kVjEwPWFjdGl2ZUZpbHRlcnNMQTsKYWN0aXZlRmlsdGVyc0xBPWZ1bmN0aW9uKCl7aWYodGFiIT09cGVyaW9kVGFiVjEwKXJldHVybiBhY3RpdmVGaWx0ZXJzQmVmb3JlUGVyaW9kVjEwKCk7cmV0dXJuICc8ZGl2IGNsYXNzPSJhY3RpdmVGaWx0ZXJzTEEiPjxiPkNvbnN1bHRhIGFjdHVhbDwvYj48c3Bhbj4nK2VzYyh0ZXh0UGVyaW9kVjEwKCkpKyc8L3NwYW4+JytmaWx0ZXJUZXh0TEEoc3RhdGVQZXJpb2RWMTAoKS5maWx0ZXJzKS5tYXAodD0+JzxzcGFuIGNsYXNzPSJmaWx0ZXJDaGlwTEEiPicrZXNjKHQpKyc8L3NwYW4+Jykuam9pbignJykrJzwvZGl2Pic7fTsKY29uc3Qgc2VsZWN0ZWRCZWZvcmVQZXJpb2RWMTA9c2VsZWN0ZWREYXRlVGV4dFY4OwpzZWxlY3RlZERhdGVUZXh0Vjg9ZnVuY3Rpb24oc2NvcGUpe3JldHVybiB0YWI9PT1wZXJpb2RUYWJWMTAmJnNjb3BlPT09J2dsb2JhbCc/dGV4dFBlcmlvZFYxMCgpOnNlbGVjdGVkQmVmb3JlUGVyaW9kVjEwKHNjb3BlKTt9Owpjb25zdCBhY3RpdmF0ZUJlZm9yZVBlcmlvZFYxMD1hY3RpdmF0ZVRhYlYzOwphY3RpdmF0ZVRhYlYzPWZ1bmN0aW9uKG5leHQpe2lmKG5leHQ9PT0nUmVwb3J0ZSBzZW1hbmFsJ3x8bmV4dD09PSdSZXBvcnRlIG1lbnN1YWwnKXtjb25zdCBrZXk9bmV4dD09PSdSZXBvcnRlIG1lbnN1YWwnPydtb250aGx5Jzond2Vla2x5JyxzPXN0YXRlUGVyaW9kVjEwKGtleSk7Y2xlYXJQb3pvRmlsdGVyc0xBKCk7cy5ncmFpbj1rZXk9PT0nbW9udGhseSc/J21vbnRoJzond2Vlayc7cy5maWx0ZXJzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmlld1N0YXRlW2tleV0/LmZpbHRlcnN8fHt9KSk7cy5sZWdhY3lEYXRlcz1bLi4ubmV3IFNldChzbGljZVJvd3Mocy5maWx0ZXJzKS5tYXAocj0+clswXSkpXS5zb3J0KCk7cy5tb250aHM9Wy4uLm5ldyBTZXQocy5sZWdhY3lEYXRlcy5tYXAoZD0+ZC5zbGljZSgwLDcpKSldO3Mud2Vla3M9a2V5PT09J3dlZWtseSc/Wy4uLm5ldyBTZXQocy5sZWdhY3lEYXRlcy5tYXAobW9uZGF5VjEwKSldOltdO25leHQ9cGVyaW9kVGFiVjEwO31hY3RpdmF0ZUJlZm9yZVBlcmlvZFYxMChuZXh0KTt9Owpjb25zdCB3ZWVrbHlCdXR0b25WMTA9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbmF2IGJ1dHRvbltkYXRhLXRhYj0iUmVwb3J0ZSBzZW1hbmFsIl0nKTt3ZWVrbHlCdXR0b25WMTAuZGF0YXNldC50YWI9cGVyaW9kVGFiVjEwO3dlZWtseUJ1dHRvblYxMC50ZXh0Q29udGVudD0n4pamICAnK3BlcmlvZFRhYlYxMDt3ZWVrbHlCdXR0b25WMTAub25jbGljaz0oKT0+YWN0aXZhdGVUYWJWMyhwZXJpb2RUYWJWMTApO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ25hdiBidXR0b25bZGF0YS10YWI9IlJlcG9ydGUgbWVuc3VhbCJdJyk/LnJlbW92ZSgpOwpjb25zdCBvbGRXZWVrVGFiSW5kZXhWMTA9dGFic1YzLmluZGV4T2YoJ1JlcG9ydGUgc2VtYW5hbCcpO2lmKG9sZFdlZWtUYWJJbmRleFYxMD49MCl0YWJzVjNbb2xkV2Vla1RhYkluZGV4VjEwXT1wZXJpb2RUYWJWMTA7Y29uc3Qgb2xkTW9udGhUYWJJbmRleFYxMD10YWJzVjMuaW5kZXhPZignUmVwb3J0ZSBtZW5zdWFsJyk7aWYob2xkTW9udGhUYWJJbmRleFYxMD49MCl0YWJzVjMuc3BsaWNlKG9sZE1vbnRoVGFiSW5kZXhWMTAsMSk7CmNvbnN0IHJlbmRlckJlZm9yZVBlcmlvZFYxMD1yZW5kZXI7CnJlbmRlcj1mdW5jdGlvbigpe2lmKGRhdGEmJnRhYj09PXBlcmlvZFRhYlYxMCl7c2xpY2VDYWNoZUZhc3RMQT1uZXcgTWFwKCk7YWdncmVnYXRlQ2FjaGVGYXN0TEE9bmV3IFdlYWtNYXAoKTtjbGVhclBvem9GaWx0ZXJzTEEoKTtjbG9zZVNwYW5pc2hDYWxlbmRhckxBKGZhbHNlKTtyZW5kZXJQZXJpb2RWMTAoKTt9ZWxzZSByZW5kZXJCZWZvcmVQZXJpb2RWMTAoKTt9Owpjb25zdCBleHBvcnRCZWZvcmVQZXJpb2RWMTA9JCgnI3YyZXhwb3J0Jykub25jbGljazsKJCgnI3YyZXhwb3J0Jykub25jbGljaz1mdW5jdGlvbigpewogaWYodGFiIT09cGVyaW9kVGFiVjEwKXJldHVybiBleHBvcnRCZWZvcmVQZXJpb2RWMTAoKTtjb25zdCBzPXN0YXRlUGVyaW9kVjEwKCkscj1jdXJyZW50UGVyaW9kUmVwb3J0VjEwLGRhaWx5PXIuc2VyaWVzLmxlbmd0aD9yLnNlcmllcy5mbGF0TWFwKGc9PmcucG9pbnRzKTpzLmdyYWluPT09J2RheSc/ci5saXN0Omdyb3VwcyhyLnJvd3Mscm93PT5yb3dbMF0pLnNvcnQoKGEsYik9PmEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpLm1hcChnPT4oey4uLmcsZGF0ZTpnLm5hbWUsd2Vlazptb25kYXlWMTAoZy5uYW1lKSxkYXk6KG5ldyBEYXRlKGcubmFtZSsnVDEyOjAwOjAwWicpLmdldFVUQ0RheSgpKzYpJTcsb2JzZXJ2ZWQ6dHJ1ZX0pKTsKIGNvbnN0IHJvd3M9W1snU2VtYW5hIGRlc2RlJywnRmVjaGEnLCdEw61hJywnRXN0YWRvJywuLi5wZXJpb2RNZXRyaWNzVjEwLm1hcChrPT5tZXRyaWNzW2tdKV0sLi4uZGFpbHkubWFwKHA9PltwLndlZWt8fCcnLHAuZGF0ZSxwLmRheSE9bnVsbD9wZXJpb2REYXlzVjEwW3AuZGF5XTpwLmxhYmVsVjEwLHAub2JzZXJ2ZWQ/J0NvbiByZWdpc3Ryb3MnOidTaW4gcmVnaXN0cm8nLC4uLnBlcmlvZE1ldHJpY3NWMTAubWFwKGs9PnBba10/P251bGwpXSldLHByZWY9W2V4cG9ydFJvd3NbMF0sLi4uci5saXN0Lm1hcChwcmVmZXJQb2ludFBlcmlvZFYxMCkubWFwKHA9PltwLmxhYmVsVjEwKyhwLndlZWs/JyDCtyAnK3dlZWtUZXh0VjEwKHAud2Vlayk6JycpLHAub2JzZXJ2ZWQ/J0NvbiByZWdpc3Ryb3MnOidTaW4gcmVnaXN0cm8nLHAuZGF5c09ic2VydmVkLHAub2JzZXJ2ZWQ/YWdnKHAucm93cykuZGF5czpudWxsLC4uLnBlcmlvZE1ldHJpY3NWMTAubWFwKGs9PnBba10/P251bGwpXSldOwogZG93bmxvYWRCbG9iVjgod29ya2Jvb2tCbG9iVjgoW3tuYW1lOidQZXJpb2Rvcycscm93czpleHBvcnRSb3dzfSx7bmFtZTonQ29tcGFyYWNpb24gZGlhcmlhJyxyb3dzfSx7bmFtZTonUHJlZmVyZW5jaWFsJyxyb3dzOnByZWZ9LHtuYW1lOidDb25zdWx0YScscm93czpbWydJbmZvcm1lJyxwZXJpb2RUYWJWMTBdLFsnU2VsZWNjacOzbicsdGV4dFBlcmlvZFYxMCgpXSxbJ0NvbmZpZ3VyYWNpw7NuJyxKU09OLnN0cmluZ2lmeShzKV0sWydHcsOhZmljb3MgZWxlZ2lkb3MnLChzLmNoYXJ0U2VsZWN0aW9ufHxbXSkuam9pbignIC8gJyldLFsnTm90YScsJ1NlbWFuYXMgbHVuZXMtZG9taW5nby4gQXVzZW50ZSA9IGNlbGRhIHZhY8OtYSwgbm8gY2VybzsgcG9yY2VudGFqZXMgc29icmUgbG9zIHRvdGFsZXMuJ11dfV0pLCdMQS1BbmFsaXNpcy1wb3ItcGVyaW9kby54bHN4Jyk7Cn07CgpmdW5jdGlvbiBub3JtYWxpemVDaGFydEtleXNWMTIoa2V5cyxmYWxsYmFjayl7Y29uc3QgdmFsaWQ9QXJyYXkuaXNBcnJheShrZXlzKT9bLi4ubmV3IFNldChrZXlzLmZpbHRlcihrPT5wZXJpb2RNZXRyaWNzVjEwLmluY2x1ZGVzKGspKSldOltdO3JldHVybiB2YWxpZC5sZW5ndGgmJnZhbGlkLmxlbmd0aDw9Mz92YWxpZDpbLi4uZmFsbGJhY2tdO30KZnVuY3Rpb24gc2V0dGluZ3NDaGFydHNWMTIoc3RhdGUpe2lmKCFzdGF0ZS5jaGFydE1ldHJpY3NWMTIpe2xldCBzYXZlZDt0cnl7c2F2ZWQ9SlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnTEFfUEVSSU9EX0VESVRBQkxFX1YxMicpfHwnbnVsbCcpfWNhdGNoKGUpe31zdGF0ZS5jaGFydE1ldHJpY3NWMTI9c2F2ZWQmJnR5cGVvZiBzYXZlZD09PSdvYmplY3QnJiYhQXJyYXkuaXNBcnJheShzYXZlZCk/c2F2ZWQ6e307fXJldHVybiBzdGF0ZS5jaGFydE1ldHJpY3NWMTI7fQpmdW5jdGlvbiBlZGl0YWJsZUNhcmRzUGVyaW9kVjEyKHNwZWMscmVwb3J0LHN0YXRlKXsKIGNvbnN0IHNldHRpbmdzPXNldHRpbmdzQ2hhcnRzVjEyKHN0YXRlKTtyZXR1cm4gc3BlYy5tYXAoKFtvcmlnaW5hbCxkZWZhdWx0cyxwcmVmRGVmYXVsdF0saW5kZXgpPT57CiAgY29uc3Qgc2F2ZWQ9c2V0dGluZ3NbaW5kZXhdLGtleXM9bm9ybWFsaXplQ2hhcnRLZXlzVjEyKHNhdmVkPy5rZXlzLGRlZmF1bHRzKSxwcmVmPXR5cGVvZiBzYXZlZD8ucHJlZmVyZW50aWFsPT09J2Jvb2xlYW4nP3NhdmVkLnByZWZlcmVudGlhbDohIXByZWZEZWZhdWx0OwogIGNvbnN0IG9wdGlvbnM9c2VsZWN0ZWQ9PnBlcmlvZE1ldHJpY3NWMTAubWFwKGs9PmA8b3B0aW9uIHZhbHVlPSIke2t9IiAke2s9PT1zZWxlY3RlZD8nc2VsZWN0ZWQnOicnfT4ke2VzYyhtZXRyaWNzW2tdKX08L29wdGlvbj5gKS5qb2luKCcnKTsKICBjb25zdCBlZGl0b3I9YDxkZXRhaWxzIGNsYXNzPSJjaGFydEVkaXRvclYxMiIgZGF0YS1jaGFydC1lZGl0b3I9IiR7aW5kZXh9Ij48c3VtbWFyeT5FZGl0YXIgaW5kaWNhZG9yZXMgwrcgJHtrZXlzLmxlbmd0aH0gZGUgMzwvc3VtbWFyeT48ZGl2IGNsYXNzPSJjaGFydEVkaXRvckZpZWxkc1YxMiI+JHtbMCwxLDJdLm1hcChpPT5gPGxhYmVsPkRhdG8gJHtpKzF9JHtpPycgwrcgb3BjaW9uYWwnOicnfTxzZWxlY3QgZGF0YS1jaGFydC1tZXRyaWMtc2xvdD0iJHtpbmRleH0iIGRhdGEtY2hhcnQtbWV0cmljLXBvc2l0aW9uPSIke2l9Ij4ke2k/JzxvcHRpb24gdmFsdWU9IiI+U2luIGRhdG8gYWRpY2lvbmFsPC9vcHRpb24+JzonJ30ke29wdGlvbnMoa2V5c1tpXSl9PC9zZWxlY3Q+PC9sYWJlbD5gKS5qb2luKCcnKX08bGFiZWwgY2xhc3M9ImNoYXJ0UHJlZlYxMiI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBkYXRhLWNoYXJ0LXByZWZlcmVudGlhbD0iJHtpbmRleH0iICR7cHJlZj8nY2hlY2tlZCc6Jyd9PkNvbXBhcmFyIGNvbiBzYWzDs24gcHJlZmVyZW5jaWFsPC9sYWJlbD48ZGl2PjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLWNoYXJ0LWFwcGx5PSIke2luZGV4fSIgY2xhc3M9InByaW1hcnkiPkFwbGljYXIgYSBlc3RlIGdyw6FmaWNvPC9idXR0b24+IDxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLWNoYXJ0LXJlc2V0PSIke2luZGV4fSI+UmVzdGFibGVjZXIgZXN0ZSBncsOhZmljbzwvYnV0dG9uPjwvZGl2PjxzcGFuIGRhdGEtY2hhcnQtZWRpdG9yLXN0YXR1cz0iJHtpbmRleH0iIHJvbGU9InN0YXR1cyI+PC9zcGFuPjwvZGl2PjwvZGV0YWlscz5gOwogIHJldHVybiBgPGRpdiBjbGFzcz0iY2FyZCIgZGF0YS1wZXJpb2QtY2hhcnQtc2xvdD0iJHtpbmRleH0iIGRhdGEtY2hhcnQtc2xvdC10aXRsZT0iJHtlc2Mob3JpZ2luYWwpfSI+PHNtYWxsIGNsYXNzPSJjaGFydFNsb3RWMTIiPkdyw6FmaWNvICR7aW5kZXgrMX08L3NtYWxsPjxoMj4ke2tleXMubWFwKGs9PmVzYyhtZXRyaWNzW2tdKSkuam9pbignICsgJyl9JHtwcmVmPycgwrcgc2VsZWNjacOzbiB5IHByZWZlcmVuY2lhbCc6Jyd9PC9oMj4ke2VkaXRvcn08cCBjbGFzcz0ic2lnbmFsbm90ZSI+JHtrZXlzLmxlbmd0aD4xPydDYWRhIGluZGljYWRvciB0aWVuZSBzdSBwcm9waWEgZXNjYWxhOyBjb21wYXJhIHN1cyB1bmlkYWRlcywgbm8gbGEgYWx0dXJhIGVudHJlIGluZGljYWRvcmVzLiAnOicnfSR7cHJlZj8nUHJlZmVyZW5jaWFsIGVzdMOhIGluY2x1aWRvIGVuIGxhIHNlbGVjY2nDs247IG5vIHN1bWFyIGzDrW5lYXMuICc6Jyd9JHtzdGF0ZS5ncmFpbj09PSdvdmVybGF5Jz8nU2UgY29tcGFyYW4gbG9zIG1pc21vcyBkw61hcyBkZSBjYWRhIHNlbWFuYS4nOidQZXLDrW9kb3MgZGUgbGEgc2VsZWNjacOzbiBhY3R1YWwuJ308L3A+JHtjaGFydFBlcmlvZFYxMChyZXBvcnQsc3RhdGUsa2V5cyxwcmVmKX08L2Rpdj5gOwogfSkuam9pbignJyk7Cn0KZnVuY3Rpb24gYmluZEVkaXRhYmxlUGVyaW9kVjEyKHNwZWMpewogY29uc3Qgc3RhdGU9c3RhdGVQZXJpb2RWMTAoKSxzZXR0aW5ncz1zZXR0aW5nc0NoYXJ0c1YxMihzdGF0ZSk7CiBjb25zdCByZW1lbWJlcj0oKT0+e3RyeXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnTEFfUEVSSU9EX0VESVRBQkxFX1YxMicsSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpKTt9Y2F0Y2goZSl7fX07CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jaGFydC1hcHBseV0nKS5mb3JFYWNoKGJ1dHRvbj0+YnV0dG9uLm9uY2xpY2s9YXN5bmMoKT0+ewogIGNvbnN0IGluZGV4PU51bWJlcihidXR0b24uZGF0YXNldC5jaGFydEFwcGx5KSxrZXlzPVsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jaGFydC1tZXRyaWMtc2xvdD0iJytpbmRleCsnIl0nKV0ubWFwKGVsPT5lbC52YWx1ZSkuZmlsdGVyKEJvb2xlYW4pLHN0YXR1cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jaGFydC1lZGl0b3Itc3RhdHVzPSInK2luZGV4KyciXScpOwogIGlmKCFrZXlzLmxlbmd0aHx8a2V5cy5sZW5ndGg+M3x8bmV3IFNldChrZXlzKS5zaXplIT09a2V5cy5sZW5ndGgpe3N0YXR1cy50ZXh0Q29udGVudD0nRWxpZ2UgZW50cmUgdW5vIHkgdHJlcyBpbmRpY2Fkb3JlcyBkaXN0aW50b3MuJztyZXR1cm47fQogIHNldHRpbmdzW2luZGV4XT17a2V5cyxwcmVmZXJlbnRpYWw6ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2hhcnQtcHJlZmVyZW50aWFsPSInK2luZGV4KyciXScpLmNoZWNrZWR9O3JlbWVtYmVyKCk7YXdhaXQgbmF2aWdhdGVWaXN1YWxMQShwZXJpb2RUYWJWMTApOwogfSk7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jaGFydC1yZXNldF0nKS5mb3JFYWNoKGJ1dHRvbj0+YnV0dG9uLm9uY2xpY2s9YXN5bmMoKT0+e2NvbnN0IGluZGV4PU51bWJlcihidXR0b24uZGF0YXNldC5jaGFydFJlc2V0KTtkZWxldGUgc2V0dGluZ3NbaW5kZXhdO3JlbWVtYmVyKCk7YXdhaXQgbmF2aWdhdGVWaXN1YWxMQShwZXJpb2RUYWJWMTApO30pOwp9Cgpjb25zdCBzZXJpZXNQYWxldHRlVjEzPVtbJyMxODU5YjUnLCdhenVsJ10sWycjY2Y1NzAwJywnbmFyYW5qYSddLFsnIzAwN2Y2NCcsJ3ZlcmRlJ10sWycjNzY0NGI3JywndmlvbGV0YSddLFsnI2JlMjg2YScsJ21hZ2VudGEnXSxbJyM2YTc0MDAnLCdvbGl2YSddLFsnI2I4MzIyNycsJ3Jvam8nXSxbJyMwMDdhOTknLCdhenVsIHBldHLDs2xlbyddLFsnIzc5NTAzNycsJ21hcnLDs24nXSxbJyM0NjU2NmEnLCdncmlzIHBpemFycmEnXSxbJyNhNzdjMDAnLCdvY3JlJ11dOwpjb25zdCBzZXJpZXNQYXR0ZXJuc1YxMz1bWycnLCdsw61uZWEgY29udGludWEnXSxbJzkgNCcsJ2zDrW5lYSBkaXNjb250aW51YSddLFsnMiA0JywnbMOtbmVhIGRlIHB1bnRvcyddLFsnMTAgMyAyIDMnLCdsw61uZWEgZGUgcmF5YSB5IHB1bnRvJ10sWycxMCAzIDIgMyAyIDMnLCdsw61uZWEgZGUgcmF5YSB5IGRvcyBwdW50b3MnXSxbJzQgMycsJ2zDrW5lYSBkZSB0cmF6b3MgY29ydG9zJ11dOwpmdW5jdGlvbiBzZXJpZXNTdHlsZVYxMyhtb2RlbCxpbmRleCl7Y29uc3RbY29sb3IsY29sb3JOYW1lXT1zZXJpZXNQYWxldHRlVjEzW2luZGV4JXNlcmllc1BhbGV0dGVWMTMubGVuZ3RoXSxncm91cD1tb2RlbC5hbGlnbmVkV2Vla3NWMTA/TWF0aC5mbG9vcihpbmRleC8obW9kZWwubWV0cmljQ291bnRWMTB8fDEpKTppbmRleCxbZGFzaCxsaW5lTmFtZV09c2VyaWVzUGF0dGVybnNWMTNbZ3JvdXAlc2VyaWVzUGF0dGVybnNWMTMubGVuZ3RoXTtyZXR1cm57Y29sb3IsY29sb3JOYW1lLGRhc2gsbGluZU5hbWV9O30KY2hhcnRTZXJpZXNDb2xvcnNWaXN1YWxMQT1mdW5jdGlvbihtb2RlbCl7cmV0dXJuIG1vZGVsLnNlcmllcy5tYXAoKF8saSk9PnNlcmllc1N0eWxlVjEzKG1vZGVsLGkpLmNvbG9yKTt9OwpmdW5jdGlvbiBkZWNvcmF0ZVNlcmllc0xlZ2VuZFYxMyhob3N0LG1vZGVsKXsKIGNvbnN0IGxlZ2VuZD1ob3N0LmNsb3Nlc3QoJy5jYXJkJyk/LnF1ZXJ5U2VsZWN0b3IoJy5sYWJlbGVkbGVnZW5kJyk7aWYoIWxlZ2VuZClyZXR1cm47CiBbLi4ubGVnZW5kLmNoaWxkcmVuXS5maWx0ZXIoZWw9PmVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09PSdzcGFuJykuZm9yRWFjaCgoZW50cnksaSk9PnsKICBpZighbW9kZWwuc2VyaWVzW2ldKXJldHVybjtjb25zdCBzdHlsZT1zZXJpZXNTdHlsZVYxMyhtb2RlbCxpKSxsYWJlbD1lbnRyeS5kYXRhc2V0Lm9yaWdpbmFsTGVnZW5kVjEzfHxlbnRyeS50ZXh0Q29udGVudC50cmltKCk7ZW50cnkuZGF0YXNldC5vcmlnaW5hbExlZ2VuZFYxMz1sYWJlbDsKICBlbnRyeS50ZXh0Q29udGVudD0nJztjb25zdCBzYW1wbGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsJ3N2ZycpO3NhbXBsZS5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCcwIDAgNDggMTYnKTtzYW1wbGUuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsJ3RydWUnKTtzYW1wbGUuY2xhc3NMaXN0LmFkZCgnc2VyaWVzU3dhdGNoVjEzJyk7c2FtcGxlLnN0eWxlLndpZHRoPSc0OHB4JztzYW1wbGUuc3R5bGUuaGVpZ2h0PScxNnB4JztzYW1wbGUuc3R5bGUubWluV2lkdGg9JzQ4cHgnOwogIHNhbXBsZS5pbm5lckhUTUw9YDxsaW5lIHgxPSIyIiB5MT0iOCIgeDI9IjQ2IiB5Mj0iOCIgc3Ryb2tlPSIke3N0eWxlLmNvbG9yfSIgc3Ryb2tlLXdpZHRoPSIzIiAke3N0eWxlLmRhc2g/J3N0cm9rZS1kYXNoYXJyYXk9Iicrc3R5bGUuZGFzaCsnIic6Jyd9Lz5gOwogIGVudHJ5LmFwcGVuZENoaWxkKHNhbXBsZSk7ZW50cnkuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobGFiZWwrJyDCtyAnK3N0eWxlLmxpbmVOYW1lKycgwrcgJytzdHlsZS5jb2xvck5hbWUpKTtlbnRyeS50aXRsZT1sYWJlbCsnIMK3ICcrc3R5bGUubGluZU5hbWUrJyDCtyAnK3N0eWxlLmNvbG9yTmFtZTtlbnRyeS5kYXRhc2V0LnNlcmllc0NvbG9yVjEzPXN0eWxlLmNvbG9yO2VudHJ5LmRhdGFzZXQuc2VyaWVzRGFzaFYxMz1zdHlsZS5kYXNoOwogfSk7Cn0KY29uc3QgYmFyc0JlZm9yZUNvbnRyYXN0VjEzPWJhcnNWMjsKYmFyc1YyPWZ1bmN0aW9uKGl0ZW1zLGtleSxjb2xvcil7Y29uc3QgaHRtbD1iYXJzQmVmb3JlQ29udHJhc3RWMTMoaXRlbXMsa2V5LGNvbG9yKTtpZihyYXRpb0tleXNWNi5pbmNsdWRlcyhrZXkpKXJldHVybiBodG1sO2xldCBpPTA7cmV0dXJuIGh0bWwucmVwbGFjZSgvKDxkaXYgY2xhc3M9ImJhciIgc3R5bGU9IlteIl0qYmFja2dyb3VuZDopW147IlxzXSsvZywoXyxwcmVmaXgpPT5wcmVmaXgrc2VyaWVzUGFsZXR0ZVYxM1soaSsrKSVzZXJpZXNQYWxldHRlVjEzLmxlbmd0aF1bMF0pO307CmNvbnN0IHByaXplUmFua2luZ0JlZm9yZUNvbnRyYXN0VjEzPXByaXplUmFua2luZ0xBOwpwcml6ZVJhbmtpbmdMQT1mdW5jdGlvbihsaXN0KXtsZXQgaT0wO3JldHVybiBwcml6ZVJhbmtpbmdCZWZvcmVDb250cmFzdFYxMyhsaXN0KS5yZXBsYWNlKC8oPHJlY3RcYltePl0qZmlsbD0iKSMxMzhmOTMvZywoXyxwcmVmaXgpPT5wcmVmaXgrc2VyaWVzUGFsZXR0ZVYxM1soaSsrKSVzZXJpZXNQYWxldHRlVjEzLmxlbmd0aF1bMF0pO307CgovLyBBZGphY2VudCBwZXJpb2RzIHVzZSBpbmNsdXNpdmUgVVRDIGNhbGVuZGFyIGRheXMsIGluZGVwZW5kZW50IG9mIHJlY29yZGVkIGFjdGl2aXR5Lgp2aWV3U3RhdGUuY29tcGFyZUNhbGVuZGFyVjE1Pz89J21hbnVhbCc7CmZ1bmN0aW9uIGFkamFjZW50Q2FsZW5kYXJWMTUoZnJvbSx0byxkaXJlY3Rpb24pewogaWYoIWRhdGVQYXJ0c1NwYW5pc2hMQShmcm9tKXx8IWRhdGVQYXJ0c1NwYW5pc2hMQSh0bykpcmV0dXJuIG51bGw7CiBjb25zdCBzdGFydD1EYXRlLnBhcnNlKGZyb20rJ1QwMDowMDowMFonKSxlbmQ9RGF0ZS5wYXJzZSh0bysnVDAwOjAwOjAwWicpOwogaWYoZW5kPHN0YXJ0KXJldHVybiBudWxsOwogY29uc3QgZGF5PTg2NDAwMDAwLGRheXM9TWF0aC5yb3VuZCgoZW5kLXN0YXJ0KS9kYXkpKzE7CiBjb25zdCBiU3RhcnQ9ZGlyZWN0aW9uPT09J3ByZXZpb3VzJz9zdGFydC1kYXlzKmRheTplbmQrZGF5OwogcmV0dXJuIHtmcm9tOm5ldyBEYXRlKGJTdGFydCkudG9JU09TdHJpbmcoKS5zbGljZSgwLDEwKSx0bzpuZXcgRGF0ZShiU3RhcnQrKGRheXMtMSkqZGF5KS50b0lTT1N0cmluZygpLnNsaWNlKDAsMTApLGRheXN9Owp9CmNvbnN0IGNvbXBhcmVCZWZvcmVDYWxlbmRhclYxNT1jb21wYXJlVmlldzsKY29tcGFyZVZpZXc9ZnVuY3Rpb24oKXsKIGNvbnN0IG1vZGU9dmlld1N0YXRlLmNvbXBhcmVDYWxlbmRhclYxNTsKIGlmKCFbJ21hbnVhbCcsJ3ByZXZpb3VzJywnbmV4dCddLmluY2x1ZGVzKG1vZGUpKXZpZXdTdGF0ZS5jb21wYXJlQ2FsZW5kYXJWMTU9J21hbnVhbCc7CiBsZXQgcmVzdWx0PW51bGw7CiBpZihtb2RlPT09J3ByZXZpb3VzJ3x8bW9kZT09PSduZXh0Jyl7CiAgaWYoY2FsZW5kYXJTdGF0ZVY4KCdBJykubW9kZSE9PSdyYW5nZScpdmlld1N0YXRlLmNvbXBhcmVDYWxlbmRhclYxNT0nbWFudWFsJzsKICBlbHNlewogICBjb25zdCBib3VuZHM9ZGF0ZVJhbmdlKCk7CiAgIHZpZXdTdGF0ZS5BLmZyb218fD1ib3VuZHNbMF07dmlld1N0YXRlLkEudG98fD1ib3VuZHNbMV07CiAgIHJlc3VsdD1hZGphY2VudENhbGVuZGFyVjE1KHZpZXdTdGF0ZS5BLmZyb20sdmlld1N0YXRlLkEudG8sbW9kZSk7CiAgIGlmKHJlc3VsdCl7T2JqZWN0LmFzc2lnbih2aWV3U3RhdGUuQix7ZnJvbTpyZXN1bHQuZnJvbSx0bzpyZXN1bHQudG99KTtjYWxlbmRhclN0YXRlVjgoJ0InKS5tb2RlPSdyYW5nZSc7fQogIH0KIH0KIGNvbXBhcmVCZWZvcmVDYWxlbmRhclYxNSgpOwogY29uc3QgdG9vbHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbXBhcmV0b29scycpO2lmKCF0b29scylyZXR1cm47CiB0b29scy5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyZW5kJyxgPGRpdiBjbGFzcz0iY2FyZCBjb21wYXJlQ2FsZW5kYXJWMTUiPjxsYWJlbD5GZWNoYXMgZGUgQiByZXNwZWN0byBkZSBBPHNlbGVjdCBpZD0iY29tcGFyZUNhbGVuZGFyVjE1Ij48b3B0aW9uIHZhbHVlPSJtYW51YWwiPkVsZWdpciBmZWNoYXMgbWFudWFsbWVudGU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJwcmV2aW91cyI+UGVyw61vZG8gYW50ZXJpb3IgwrcgbWlzbW9zIGTDrWFzIGNhbGVuZGFyaW88L29wdGlvbj48b3B0aW9uIHZhbHVlPSJuZXh0Ij5QZXLDrW9kbyBwb3N0ZXJpb3IgwrcgbWlzbW9zIGTDrWFzIGNhbGVuZGFyaW88L29wdGlvbj48L3NlbGVjdD48L2xhYmVsPjxwIGlkPSJjb21wYXJlQ2FsZW5kYXJOb3RlVjE1IiBjbGFzcz0ic3VidGl0bGUiPiR7cmVzdWx0P2BBOiAke2RhdGVMYWJlbFNwYW5pc2hMQSh2aWV3U3RhdGUuQS5mcm9tKX0g4oaSICR7ZGF0ZUxhYmVsU3BhbmlzaExBKHZpZXdTdGF0ZS5BLnRvKX0gwrcgJHtyZXN1bHQuZGF5c30gZMOtYXMuIEI6ICR7ZGF0ZUxhYmVsU3BhbmlzaExBKHJlc3VsdC5mcm9tKX0g4oaSICR7ZGF0ZUxhYmVsU3BhbmlzaExBKHJlc3VsdC50byl9IMK3ICR7cmVzdWx0LmRheXN9IGTDrWFzLmA6dmlld1N0YXRlLmNvbXBhcmVDYWxlbmRhclYxNT09PSdtYW51YWwnPydTZWxlY2Npb25hIGxhcyBmZWNoYXMgZGUgQSB5IGVsaWdlIGVsIHBlcsOtb2RvIGFudGVyaW9yIG8gcG9zdGVyaW9yIHBhcmEgY2FsY3VsYXIgQiBhdXRvbcOhdGljYW1lbnRlLic6J1JldmlzYSBsYXMgZmVjaGFzIGRlIEE6IGVsIGluaWNpbyBkZWJlIHNlciBhbnRlcmlvciBvIGlndWFsIGFsIGZpbmFsLid9IFNlIGN1ZW50YW4gYW1ib3MgZXh0cmVtb3MsIGluY2x1c28gZMOtYXMgc2luIHJlZ2lzdHJvcy4gTG9zIGZpbHRyb3MgZGUgbcOhcXVpbmFzIGRlIEIgc2UgbWFudGllbmVuLjwvcD48L2Rpdj5gKTsKICQoJyNjb21wYXJlQ2FsZW5kYXJWMTUnKS52YWx1ZT12aWV3U3RhdGUuY29tcGFyZUNhbGVuZGFyVjE1OwogJCgnI2NvbXBhcmVDYWxlbmRhclYxNScpLm9uY2hhbmdlPWU9Pnt2aWV3U3RhdGUuY29tcGFyZUNhbGVuZGFyVjE1PWUudGFyZ2V0LnZhbHVlO2lmKGUudGFyZ2V0LnZhbHVlIT09J21hbnVhbCcpY2FsZW5kYXJTdGF0ZVY4KCdBJykubW9kZT0ncmFuZ2UnO3JlbmRlcigpO307CiBmb3IoY29uc3QgaWQgb2YgWydmcm9tQicsJ3RvQicsJ2NvcHlBQicsJ3N3YXBBQiddKXtjb25zdCBub2RlPSQoJyMnK2lkKSxvbGQ9bm9kZT8uW2lkLnN0YXJ0c1dpdGgoJ2Zyb20nKXx8aWQuc3RhcnRzV2l0aCgndG8nKT8nb25jaGFuZ2UnOidvbmNsaWNrJ107aWYobm9kZSl7Y29uc3QgZXZlbnQ9aWQ9PT0nZnJvbUInfHxpZD09PSd0b0InPydvbmNoYW5nZSc6J29uY2xpY2snO25vZGVbZXZlbnRdPWU9Pnt2aWV3U3RhdGUuY29tcGFyZUNhbGVuZGFyVjE1PSdtYW51YWwnO29sZD8uY2FsbChub2RlLGUpO307fX0KIC8vIENob29zaW5nIGFub3RoZXIgQiBjYWxlbmRhciBtb2RlIGlzIGFuIGV4cGxpY2l0IHJldHVybiB0byBpbmRlcGVuZGVudCBkYXRlcy4KIGNvbnN0IGJNb2RlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNhbG1vZGU9IkIiXScpO2lmKGJNb2RlKXtjb25zdCBvbGQ9Yk1vZGUub25jaGFuZ2U7Yk1vZGUub25jaGFuZ2U9ZT0+e3ZpZXdTdGF0ZS5jb21wYXJlQ2FsZW5kYXJWMTU9J21hbnVhbCc7b2xkPy5jYWxsKGJNb2RlLGUpO307fQp9OwoKLy8gRGFpbHkgcGFyay13aWRlIHRhcmdldHMgYXJlIHByaXZhdGUsIGF1dGhlbnRpY2F0ZWQgZGF0YTsgbmV2ZXIgZW1iZWRkZWQgaW4gdGhlIHB1YmxpYyBidW5kbGUuCmNvbnN0IGJ1ZGdldFRhYlYxOD0nQ3VtcGxpbWllbnRvIFBQVE8nOwp2aWV3U3RhdGUuYnVkZ2V0VjE4Pz89e2Zyb206JycsdG86JycsZ3JhaW46J3dlZWsnLG1ldHJpYzond2luJ307CmxldCBidWRnZXRSb3dzVjE4PW51bGwsYnVkZ2V0T3duZXJWMTg9bnVsbCxidWRnZXRMb2FkaW5nVjE4PWZhbHNlLGJ1ZGdldEVycm9yVjE4PScnLGJ1ZGdldFN0b3JhZ2VWMTg9bnVsbCxjdXJyZW50QnVkZ2V0VjE4PW51bGw7CmZ1bmN0aW9uIHZhbGlkYXRlQnVkZ2V0VjE4KHJvd3MpewogaWYoIUFycmF5LmlzQXJyYXkocm93cykpdGhyb3cgRXJyb3IoJ0VsIHByZXN1cHVlc3RvIG5vIHRpZW5lIHVuIGZvcm1hdG8gdsOhbGlkby4nKTsKIGNvbnN0IHNlZW49bmV3IFNldCgpO3JldHVybiByb3dzLm1hcChyPT57aWYoIWRhdGVQYXJ0c1NwYW5pc2hMQShyLmRhdGUpfHxzZWVuLmhhcyhyLmRhdGUpfHxyLndpbj09bnVsbHx8ci5jb2luPT1udWxsfHwhTnVtYmVyLmlzRmluaXRlKE51bWJlcihyLndpbikpfHwhTnVtYmVyLmlzRmluaXRlKE51bWJlcihyLmNvaW4pKXx8TnVtYmVyKHIud2luKTwwfHxOdW1iZXIoci5jb2luKTwwKXRocm93IEVycm9yKCdIYXkgZmVjaGFzIGR1cGxpY2FkYXMgbyBtZXRhcyBpbnbDoWxpZGFzIGVuIGVsIHByZXN1cHVlc3RvLicpO3NlZW4uYWRkKHIuZGF0ZSk7cmV0dXJuIHtkYXRlOnIuZGF0ZSx3aW46TnVtYmVyKHIud2luKSxjb2luOk51bWJlcihyLmNvaW4pLHNvdXJjZTpTdHJpbmcoci5zb3VyY2V8fCdQcmVzdXB1ZXN0byBkaWFyaW8nKX07fSkuc29ydCgoYSxiKT0+YS5kYXRlLmxvY2FsZUNvbXBhcmUoYi5kYXRlKSk7Cn0KZnVuY3Rpb24gYnVpbGRCdWRnZXRWMTgocm93cyx0YXJnZXRzLHMpewogaWYoIWRhdGVQYXJ0c1NwYW5pc2hMQShzLmZyb20pfHwhZGF0ZVBhcnRzU3BhbmlzaExBKHMudG8pfHxzLmZyb20+cy50byl0aHJvdyBFcnJvcignU2VsZWNjaW9uYSB1biByYW5nbyBkZSBmZWNoYXMgdsOhbGlkby4nKTsKIGNvbnN0IHRhcmdldE1hcD1uZXcgTWFwKHZhbGlkYXRlQnVkZ2V0VjE4KHRhcmdldHMpLmZpbHRlcihyPT5yLmRhdGU+PXMuZnJvbSYmci5kYXRlPD1zLnRvKS5tYXAocj0+W3IuZGF0ZSxyXSkpOwogY29uc3QgYWN0dWFsPW5ldyBNYXAoKTtmb3IoY29uc3QgciBvZiByb3dzKXtpZihyWzBdPHMuZnJvbXx8clswXT5zLnRvfHxleGNsdWRlZFJlY29yZFY3KHIpKWNvbnRpbnVlO2xldCBhPWFjdHVhbC5nZXQoclswXSk7aWYoIWEpe2E9e3dpbjowLGNvaW46MH07YWN0dWFsLnNldChyWzBdLGEpO31hLndpbis9bnVtKHJbMTZdKTthLmNvaW4rPW51bShyWzE4XSk7fQogY29uc3QgZGF0ZXM9Wy4uLm5ldyBTZXQoWy4uLnRhcmdldE1hcC5rZXlzKCksLi4uYWN0dWFsLmtleXMoKV0pXS5zb3J0KCksdG90YWxzPXthY3R1YWw6e3dpbjowLGNvaW46MH0sdGFyZ2V0Ont3aW46MCxjb2luOjB9LGZ1bGxUYXJnZXQ6e3dpbjowLGNvaW46MH19LGRhaWx5PWRhdGVzLm1hcChkYXRlPT57Y29uc3QgYT1hY3R1YWwuZ2V0KGRhdGUpLGI9dGFyZ2V0TWFwLmdldChkYXRlKSxtYXRjaGVkPSEhYSYmISFiO2Zvcihjb25zdCBrIG9mIFsnd2luJywnY29pbiddKXtpZihiKXRvdGFscy5mdWxsVGFyZ2V0W2tdKz1iW2tdO2lmKG1hdGNoZWQpe3RvdGFscy5hY3R1YWxba10rPWFba107dG90YWxzLnRhcmdldFtrXSs9YltrXTt9fXJldHVybntkYXRlLGFjdHVhbDphfHxudWxsLHRhcmdldDpifHxudWxsLG1hdGNoZWR9O30pOwogY29uc3QgZ3JvdXBlZD1uZXcgTWFwKCk7Zm9yKGNvbnN0IGQgb2YgZGFpbHkpe2NvbnN0IGtleT1zLmdyYWluPT09J21vbnRoJz9kLmRhdGUuc2xpY2UoMCw3KTpzLmdyYWluPT09J2RheSc/ZC5kYXRlOm1vbmRheVYxMChkLmRhdGUpO2lmKCFncm91cGVkLmhhcyhrZXkpKWdyb3VwZWQuc2V0KGtleSx7bmFtZTprZXksZnJvbTpkLmRhdGUsdG86ZC5kYXRlLGFjdHVhbDp7d2luOjAsY29pbjowfSx0YXJnZXQ6e3dpbjowLGNvaW46MH0sbWF0Y2hlZDowLGJ1ZGdldERheXM6MCxhY3R1YWxEYXlzOjB9KTtjb25zdCBnPWdyb3VwZWQuZ2V0KGtleSk7Zy50bz1kLmRhdGU7aWYoZC5hY3R1YWwpZy5hY3R1YWxEYXlzKys7aWYoZC50YXJnZXQpZy5idWRnZXREYXlzKys7aWYoZC5tYXRjaGVkKXtnLm1hdGNoZWQrKztmb3IoY29uc3QgayBvZiBbJ3dpbicsJ2NvaW4nXSl7Zy5hY3R1YWxba10rPWQuYWN0dWFsW2tdO2cudGFyZ2V0W2tdKz1kLnRhcmdldFtrXTt9fX0KIGxldCBhY2N1bXVsYXRlZEE9MCxhY2N1bXVsYXRlZEI9MDtjb25zdCBjdW11bGF0aXZlPWRhaWx5Lm1hcChkPT57aWYoIWQubWF0Y2hlZClyZXR1cm57bmFtZTpkLmRhdGUsd2luOm51bGwsY29pbjpudWxsfTthY2N1bXVsYXRlZEErPWQuYWN0dWFsW3MubWV0cmljXTthY2N1bXVsYXRlZEIrPWQudGFyZ2V0W3MubWV0cmljXTtyZXR1cm57bmFtZTpkLmRhdGUsd2luOmFjY3VtdWxhdGVkQSxjb2luOmFjY3VtdWxhdGVkQn07fSk7CiByZXR1cm57ZGFpbHksbGlzdDpbLi4uZ3JvdXBlZC52YWx1ZXMoKV0sdG90YWxzLGN1bXVsYXRpdmUsbWF0Y2hlZDpkYWlseS5maWx0ZXIoZD0+ZC5tYXRjaGVkKS5sZW5ndGgsbWlzc2luZ0J1ZGdldDpkYWlseS5maWx0ZXIoZD0+ZC5hY3R1YWwmJiFkLnRhcmdldCkubGVuZ3RoLG1pc3NpbmdBY3R1YWw6ZGFpbHkuZmlsdGVyKGQ9PmQudGFyZ2V0JiYhZC5hY3R1YWwpLmxlbmd0aCxhY3R1YWxEYXlzOmFjdHVhbC5zaXplLGJ1ZGdldERheXM6dGFyZ2V0TWFwLnNpemUsY2FsZW5kYXJEYXlzOk1hdGgucm91bmQoKERhdGUucGFyc2Uocy50byktRGF0ZS5wYXJzZShzLmZyb20pKS84NjQwMDAwMCkrMX07Cn0KZnVuY3Rpb24gcmF0aW9CdWRnZXRWMTgocmVhbCx0YXJnZXQpe3JldHVybiBOdW1iZXIuaXNGaW5pdGUocmVhbCkmJk51bWJlci5pc0Zpbml0ZSh0YXJnZXQpJiZ0YXJnZXQ+MD9yZWFsL3RhcmdldDpudWxsO30KZnVuY3Rpb24gYnVkZ2V0UGVyY2VudFYxOCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT1udWxsPyfigJQnOih2YWx1ZSoxMDApLnRvTG9jYWxlU3RyaW5nKCdlcy1DTCcse21heGltdW1GcmFjdGlvbkRpZ2l0czoxfSkrJyAlJzt9CmZ1bmN0aW9uIGdhdWdlQnVkZ2V0VjE4KGxhYmVsLGFjdHVhbCx0YXJnZXQpewogY29uc3QgcmF0aW89cmF0aW9CdWRnZXRWMTgoYWN0dWFsLHRhcmdldCksdG9uZT1yYXRpbz09bnVsbD8nbmV1dHJhbCc6cmF0aW8+PTE/J3N1Y2Nlc3MnOnJhdGlvPj0uOT8nbmVhcic6J2JlaGluZCcscHJvZ3Jlc3M9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHJhdGlvfHwwKSksbW9uZXk9dj0+dj09bnVsbD8n4oCUJzpmbXQodiwnd2luJykrJyBDTFAnOwogcmV0dXJuIGA8YXJ0aWNsZSBjbGFzcz0iY2FyZCBidWRnZXRIZXJvVjE4ICR7dG9uZX0iPjxkaXY+PHNtYWxsPiR7ZXNjKGxhYmVsKX0gwrcgQ1VNUExJTUlFTlRPPC9zbWFsbD48aDI+JHtidWRnZXRQZXJjZW50VjE4KHJhdGlvKX08L2gyPjxwPiR7cmF0aW89PW51bGw/J1NpbiBtZXRhIGNvbXBhcmFibGUnOnJhdGlvPj0xPydNZXRhIGFsY2FuemFkYSc6J0Jham8gbGEgbWV0YSBkZWwgcGVyw61vZG8gY29tcGFyYWJsZSd9PC9wPjwvZGl2PjxzdmcgY2xhc3M9ImJ1ZGdldEdhdWdlVjE4IiB2aWV3Qm94PSIwIDAgMTYwIDE2MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSIke2VzYyhsYWJlbCl9OiAke2J1ZGdldFBlcmNlbnRWMTgocmF0aW8pfSBkZSBjdW1wbGltaWVudG8iPjxjaXJjbGUgY3g9IjgwIiBjeT0iODAiIHI9IjY0IiBmaWxsPSJub25lIiBzdHJva2U9IiNlY2U5ZTYiIHN0cm9rZS13aWR0aD0iMTMiLz48Y2lyY2xlIGN4PSI4MCIgY3k9IjgwIiByPSI2NCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMTMiIHN0cm9rZS1kYXNoYXJyYXk9IiR7cHJvZ3Jlc3MqNDAyLjEyNH0gNDAyLjEyNCIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDgwIDgwKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+PHRleHQgeD0iODAiIHk9Ijg2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMjUyNTI1IiBmb250LWZhbWlseT0iQXJpYWwiIGZvbnQtc2l6ZT0iMjIiIGZvbnQtd2VpZ2h0PSJib2xkIj4ke2J1ZGdldFBlcmNlbnRWMTgocmF0aW8pfTwvdGV4dD48L3N2Zz48ZGw+PGRpdj48ZHQ+UmVhbDwvZHQ+PGRkPiR7bW9uZXkoYWN0dWFsKX08L2RkPjwvZGl2PjxkaXY+PGR0PlBQVE8gwrcgbWlzbW9zIGTDrWFzPC9kdD48ZGQ+JHttb25leSh0YXJnZXQpfTwvZGQ+PC9kaXY+PGRpdj48ZHQ+QnJlY2hhIHJlYWwg4oiSIFBQVE88L2R0PjxkZD4ke3JhdGlvPT1udWxsPyfigJQnOm1vbmV5KGFjdHVhbC10YXJnZXQpfTwvZGQ+PC9kaXY+PC9kbD48cCBjbGFzcz0iYnVkZ2V0Tm90ZVYxOCI+U29icmUgZMOtYXMgY29uIHJlZ2lzdHJvcyByZWFsZXMgeSBwcmVzdXB1ZXN0byBkZWwgbWlzbW8gYcOxby4gRWwgYW5pbGxvIHNlIGNvbXBsZXRhIGFsIDEwMCAlOyBsYSBjaWZyYSBtdWVzdHJhIGVsIHBvcmNlbnRhamUgc2luIGzDrW1pdGUuPC9wPjwvYXJ0aWNsZT5gOwp9CmFzeW5jIGZ1bmN0aW9uIGxvYWRCdWRnZXRWMTgoZm9yY2U9ZmFsc2UpewogY29uc3Qgb3duZXI9YXBwU2Vzc2lvblYxNT8udG9rZW47aWYoIW93bmVyfHwoYnVkZ2V0TG9hZGluZ1YxOCYmYnVkZ2V0T3duZXJWMTg9PT1vd25lcikpcmV0dXJuOwogaWYoIWZvcmNlJiZidWRnZXRPd25lclYxOD09PW93bmVyJiYoYnVkZ2V0Um93c1YxOCE9PW51bGx8fGJ1ZGdldEVycm9yVjE4KSlyZXR1cm47CiBidWRnZXRMb2FkaW5nVjE4PXRydWU7YnVkZ2V0T3duZXJWMTg9b3duZXI7YnVkZ2V0RXJyb3JWMTg9Jyc7YnVkZ2V0Um93c1YxOD1udWxsO2J1ZGdldFN0b3JhZ2VWMTg9bnVsbDsKIHRyeXtsZXQgbGlzdD1bXTtmb3IobGV0IG9mZnNldD0wO29mZnNldDwyMDAwMDtvZmZzZXQrPTEwMDApe2NvbnN0IGNodW5rPWF3YWl0IHN1cGFiYXNlUmVxdWVzdExBKCcvcmVzdC92MS9sYV9idWRnZXRfZGFpbHk/c2VsZWN0PWRhdGUsd2luLGNvaW4sc291cmNlJm9yZGVyPWRhdGUmbGltaXQ9MTAwMCZvZmZzZXQ9JytvZmZzZXQse30sb3duZXIpO2lmKCFBcnJheS5pc0FycmF5KGNodW5rKSl0aHJvdyBFcnJvcignTm8gc2UgcHVkbyBsZWVyIGVsIHByZXN1cHVlc3RvLicpO2xpc3QucHVzaCguLi5jaHVuayk7aWYoY2h1bmsubGVuZ3RoPDEwMDApYnJlYWs7aWYob2Zmc2V0PT09MTkwMDApdGhyb3cgRXJyb3IoJ0VsIHByZXN1cHVlc3RvIHN1cGVyYSBlbCBsw61taXRlIGRlIGZlY2hhcyBhZG1pdGlkYXMuJyk7fWNvbnN0IHZhbGlkPXZhbGlkYXRlQnVkZ2V0VjE4KGxpc3QpO2lmKGFwcFNlc3Npb25WMTU/LnRva2VuIT09b3duZXIpcmV0dXJuO2J1ZGdldFJvd3NWMTg9dmFsaWQ7CiAgaWYoYXBwU2Vzc2lvblYxNT8ucm9sZT09PSdhZG1pbicpdHJ5e2NvbnN0IHVzYWdlPWF3YWl0IHN1cGFiYXNlUmVxdWVzdExBKCcvcmVzdC92MS9ycGMvbGFfc3RvcmFnZV9zdGF0dXNfdjE4Jyx7bWV0aG9kOidQT1NUJyxib2R5Oid7fSd9LG93bmVyKTtpZihhcHBTZXNzaW9uVjE1Py50b2tlbj09PW93bmVyKWJ1ZGdldFN0b3JhZ2VWMTg9dXNhZ2U7fWNhdGNoKGUpey8qIEEgdXNhZ2UgZXJyb3IgZG9lcyBub3QgaGlkZSB0aGUgYnVkZ2V0LiAqL30KIH1jYXRjaChlKXtpZihhcHBTZXNzaW9uVjE1Py50b2tlbj09PW93bmVyKWJ1ZGdldEVycm9yVjE4PWUubWVzc2FnZTt9CiBmaW5hbGx5e2lmKGJ1ZGdldE93bmVyVjE4PT09b3duZXIpYnVkZ2V0TG9hZGluZ1YxOD1mYWxzZTtpZihhcHBTZXNzaW9uVjE1Py50b2tlbj09PW93bmVyJiZ0YWI9PT1idWRnZXRUYWJWMTgpcmVuZGVyKCk7fQp9CmZ1bmN0aW9uIHJlbmRlckJ1ZGdldFYxOCgpewogY2hhcnRQb2ludHNWNC5jbGVhcigpO3Jlc3BvbnNpdmVDaGFydE1vZGVsc0xBLmNsZWFyKCk7Y29uc3Qgcz12aWV3U3RhdGUuYnVkZ2V0VjE4Pz89e2Zyb206JycsdG86JycsZ3JhaW46J3dlZWsnLG1ldHJpYzond2luJ30sYm91bmRzPWRhdGVSYW5nZSgpO3MuZnJvbXx8PWJvdW5kc1swXTtzLnRvfHw9Ym91bmRzWzFdO2lmKCFbJ2RheScsJ3dlZWsnLCdtb250aCddLmluY2x1ZGVzKHMuZ3JhaW4pKXMuZ3JhaW49J3dlZWsnO2lmKCFbJ3dpbicsJ2NvaW4nXS5pbmNsdWRlcyhzLm1ldHJpYykpcy5tZXRyaWM9J3dpbic7CiBkb2N1bWVudC5ib2R5LmRhdGFzZXQudmlldz1idWRnZXRUYWJWMTg7JCgnI3RpdGxlJykudGV4dENvbnRlbnQ9YnVkZ2V0VGFiVjE4OyQoJyN2aWV3SGVscCcpLnRleHRDb250ZW50PSdQYXJxdWUgVEdNIGNvbXBsZXRvIMK3IHByZXN1cHVlc3RvIGRpYXJpbyBwb3IgZmVjaGEgZXhhY3RhJztkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmlsdGVycycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOyQoJyNjb250cm9scycpLnN0eWxlLmRpc3BsYXk9J25vbmUnO2NvbnN0IGZvbGQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZpbHRlcnMnKT8uY2xvc2VzdCgnZGV0YWlscy5jb21wYWN0Rm9sZExBJyk7aWYoZm9sZClmb2xkLnN0eWxlLmRpc3BsYXk9J25vbmUnOwogbGV0IGNvbnRlbnQ9Jyc7Y3VycmVudEJ1ZGdldFYxOD1udWxsOwogaWYoYnVkZ2V0T3duZXJWMTghPT1hcHBTZXNzaW9uVjE1Py50b2tlbnx8YnVkZ2V0Um93c1YxOD09PW51bGwpe2NvbnRlbnQ9YDxkaXYgY2xhc3M9ImNhcmQiPjxwIHJvbGU9InN0YXR1cyI+JHtlc2MoYnVkZ2V0RXJyb3JWMTh8fCdDYXJnYW5kbyBwcmVzdXB1ZXN0byBwcml2YWRv4oCmJyl9PC9wPiR7YnVkZ2V0RXJyb3JWMTg/JzxidXR0b24gaWQ9ImJ1ZGdldFJldHJ5VjE4Ij5Wb2x2ZXIgYSBpbnRlbnRhcjwvYnV0dG9uPic6Jyd9PC9kaXY+YDt9CiBlbHNlIHRyeXtjb25zdCByPWJ1aWxkQnVkZ2V0VjE4KGRhdGEucm93cyxidWRnZXRSb3dzVjE4LHMpO2N1cnJlbnRCdWRnZXRWMTg9cjtjb25zdCBrPXMubWV0cmljLGxhYmVsPWs9PT0nd2luJz8nV2luIG9wZXJhY2lvbmFsJzonQ29pbiBJbicsaGVhZGVycz1bJ1BlcsOtb2RvJywnRGVzZGUnLCdIYXN0YScsJ0TDrWFzIGNvbXBhcmFibGVzJywnRMOtYXMgY29uIFBQVE8nLCdEw61hcyByZWFsZXMnLCdXaW4gcmVhbCBDTFAnLCdXaW4gUFBUTyBjb21wYXJhYmxlIENMUCcsJ0N1bXBsaW1pZW50byBXaW4gJScsJ0JyZWNoYSBXaW4gQ0xQJywnQ29pbiBJbiByZWFsIENMUCcsJ0NvaW4gSW4gUFBUTyBjb21wYXJhYmxlIENMUCcsJ0N1bXBsaW1pZW50byBDb2luIEluICUnLCdCcmVjaGEgQ29pbiBJbiBDTFAnXTsKICBjb25zdCBkZXRhaWw9ci5saXN0Lm1hcChnPT5bcy5ncmFpbj09PSd3ZWVrJz8nU2VtYW5hIGRlbCAnK2RhdGVMYWJlbFNwYW5pc2hMQShnLm5hbWUpOmRpc3BsYXlEYXRlc1Y1KGcubmFtZSksZy5mcm9tLGcudG8sZy5tYXRjaGVkLGcuYnVkZ2V0RGF5cyxnLmFjdHVhbERheXMsZy5tYXRjaGVkP2cuYWN0dWFsLndpbjpudWxsLGcubWF0Y2hlZD9nLnRhcmdldC53aW46bnVsbCxyYXRpb0J1ZGdldFYxOChnLmFjdHVhbC53aW4sZy50YXJnZXQud2luKSxnLm1hdGNoZWQ/Zy5hY3R1YWwud2luLWcudGFyZ2V0LndpbjpudWxsLGcubWF0Y2hlZD9nLmFjdHVhbC5jb2luOm51bGwsZy5tYXRjaGVkP2cudGFyZ2V0LmNvaW46bnVsbCxyYXRpb0J1ZGdldFYxOChnLmFjdHVhbC5jb2luLGcudGFyZ2V0LmNvaW4pLGcubWF0Y2hlZD9nLmFjdHVhbC5jb2luLWcudGFyZ2V0LmNvaW46bnVsbF0pO2V4cG9ydFJvd3M9W2hlYWRlcnMsLi4uZGV0YWlsXTsKICBjb25zdCByZWFsPXIubGlzdC5tYXAoZz0+KHtuYW1lOmcubmFtZSxba106Zy5tYXRjaGVkP2cuYWN0dWFsW2tdOm51bGx9KSksdGFyZ2V0PXIubGlzdC5tYXAoZz0+KHtuYW1lOmcubmFtZSxba106Zy5tYXRjaGVkP2cudGFyZ2V0W2tdOm51bGx9KSk7CiAgY29udGVudD1gPGRpdiBjbGFzcz0iYnVkZ2V0Q292ZXJhZ2VWMTgiPjxiPiR7ci5tYXRjaGVkfSBkw61hcyBjb21wYXJhYmxlcyBkZSAke3IuY2FsZW5kYXJEYXlzfSBkw61hcyBjYWxlbmRhcmlvPC9iPjxzcGFuPiR7ci5taXNzaW5nQWN0dWFsfSBkw61hcyBjb24gUFBUTyBzaW4gZGF0b3MgcmVhbGVzIMK3ICR7ci5taXNzaW5nQnVkZ2V0fSBkw61hcyByZWFsZXMgc2luIFBQVE88L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0iYnVkZ2V0SGVyb2VzVjE4Ij4ke2dhdWdlQnVkZ2V0VjE4KCdXaW4gb3BlcmFjaW9uYWwnLHIubWF0Y2hlZD9yLnRvdGFscy5hY3R1YWwud2luOm51bGwsci5tYXRjaGVkP3IudG90YWxzLnRhcmdldC53aW46bnVsbCl9JHtnYXVnZUJ1ZGdldFYxOCgnQ29pbiBJbicsci5tYXRjaGVkP3IudG90YWxzLmFjdHVhbC5jb2luOm51bGwsci5tYXRjaGVkP3IudG90YWxzLnRhcmdldC5jb2luOm51bGwpfTwvZGl2PjxzZWN0aW9uIGNsYXNzPSJjYXJkIGJ1ZGdldEZ1bGxWMTgiPjxoMj5QUFRPIGNvbXBsZXRvIGRlbCByYW5nbyBzZWxlY2Npb25hZG88L2gyPjxwPldpbjogPGI+JHtmbXQoci50b3RhbHMuZnVsbFRhcmdldC53aW4sJ3dpbicpfSBDTFA8L2I+IMK3IENvaW4gSW46IDxiPiR7Zm10KHIudG90YWxzLmZ1bGxUYXJnZXQuY29pbiwnY29pbicpfSBDTFA8L2I+IMK3ICR7ci5idWRnZXREYXlzfSBmZWNoYXMgY29uIG1ldGEuPC9wPjxwIGNsYXNzPSJzdWJ0aXRsZSI+RWwgY3VtcGxpbWllbnRvIHN1cGVyaW9yIHVzYSDDum5pY2FtZW50ZSBmZWNoYXMgcXVlIHRpZW5lbiBhbWJvcyBkYXRvcy4gTG9zIGTDrWFzIHNpbiByZWdpc3Ryb3Mgbm8gc2UgY29udmllcnRlbiBlbiBjZXJvIHkgbm8gc2UgY29tcGFyYW4gbWV0YXMgZGUgb3RybyBhw7FvLjwvcD48L3NlY3Rpb24+PGRpdiBjbGFzcz0iY2hhcnRzIj48c2VjdGlvbiBjbGFzcz0iY2FyZCI+PGgyPiR7bGFiZWx9IHJlYWwgZnJlbnRlIGFsIFBQVE88L2gyPjxwIGNsYXNzPSJzdWJ0aXRsZSI+VG90YWxlcyBjb21wYXJhYmxlcyBwb3IgJHtzLmdyYWluPT09J2RheSc/J2TDrWEnOnMuZ3JhaW49PT0nd2Vlayc/J3NlbWFuYSc6J21lcyd9IMK3IENMUDwvcD4ke3IubWF0Y2hlZD9jaGFydFYyKFt7bmFtZTpsYWJlbCsnIHJlYWwnLHBvaW50czpyZWFsfSx7bmFtZTonUFBUTyDCtyBtaXNtb3MgZMOtYXMnLHBvaW50czp0YXJnZXR9XSxrKTonPHA+U2luIGZlY2hhcyBjb21wYXJhYmxlcy4gUmV2aXNhIGVsIGHDsW8geSBsb3MgZGF0b3MgY2FyZ2Fkb3MuPC9wPid9PC9zZWN0aW9uPjxzZWN0aW9uIGNsYXNzPSJjYXJkIj48aDI+QXZhbmNlIGFjdW11bGFkbyDCtyAke2xhYmVsfTwvaDI+PHAgY2xhc3M9InN1YnRpdGxlIj5BY3VtdWxhZG8gc29sbyBkZSBkw61hcyBjb21wYXJhYmxlcyDCtyBDTFAgwrcgbG9zIGh1ZWNvcyBubyBlcXVpdmFsZW4gYSBjZXJvPC9wPiR7ci5tYXRjaGVkP2NoYXJ0VjIoW3tuYW1lOmxhYmVsKycgYWN1bXVsYWRvIHJlYWwnLHBvaW50czpyLmN1bXVsYXRpdmUubWFwKHA9Pih7bmFtZTpwLm5hbWUsd2luOnAud2lufSkpfSx7bmFtZTonUFBUTyBhY3VtdWxhZG8nLHBvaW50czpyLmN1bXVsYXRpdmUubWFwKHA9Pih7bmFtZTpwLm5hbWUsd2luOnAuY29pbn0pKX1dLCd3aW4nKTonPHA+U2luIGRhdG9zIHBhcmEgZWwgYWN1bXVsYWRvLjwvcD4nfTwvc2VjdGlvbj48L2Rpdj48c2VjdGlvbiBjbGFzcz0iY2FyZCI+PGgyPkN1bXBsaW1pZW50byBwb3IgcGVyw61vZG8gwrcgJHtsYWJlbH08L2gyPjxwIGNsYXNzPSJzdWJ0aXRsZSI+TMOtbmVhIGRlIHJlZmVyZW5jaWE6IDEwMCAlIGRlIGxhIG1ldGEgwrcgY2FkYSBiYXJyYSBjb25zZXJ2YSBzdSBwb3JjZW50YWplIGV4YWN0bzwvcD48ZGl2IGNsYXNzPSJidWRnZXRCYXJzVjE4Ij4ke3IubGlzdC5tYXAoZz0+e2NvbnN0IHE9cmF0aW9CdWRnZXRWMTgoZy5hY3R1YWxba10sZy50YXJnZXRba10pO3JldHVybiBgPGRpdiBjbGFzcz0iYnVkZ2V0QmFyUm93VjE4Ij48c3Bhbj4ke2VzYyhzLmdyYWluPT09J3dlZWsnPydTZW1hbmEgZGVsICcrZGF0ZUxhYmVsU3BhbmlzaExBKGcubmFtZSk6ZGlzcGxheURhdGVzVjUoZy5uYW1lKSl9PHNtYWxsPiR7Zy5tYXRjaGVkfS8ke2cuYnVkZ2V0RGF5c30gZMOtYXMgY29uIG1ldGEgY29tcGFyYWRvczwvc21hbGw+PC9zcGFuPjxkaXYgY2xhc3M9ImJ1ZGdldFRyYWNrVjE4Ij48aSBzdHlsZT0id2lkdGg6JHtNYXRoLm1heCgwLE1hdGgubWluKDEwMCwocXx8MCkqMTAwLzEuNSkpfSU7YmFja2dyb3VuZDoke3E+PTE/JyMyMzczNTQnOicjZTE1YjE2J30iPjwvaT48YiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9iPjwvZGl2PjxzdHJvbmc+JHtidWRnZXRQZXJjZW50VjE4KHEpfTwvc3Ryb25nPjwvZGl2PmA7fSkuam9pbignJyl8fCc8cD5ObyBoYXkgZmVjaGFzIGRlbnRybyBkZWwgcmFuZ28uPC9wPid9PC9kaXY+PC9zZWN0aW9uPjxzZWN0aW9uIGNsYXNzPSJjYXJkIj48aDI+RGV0YWxsZSBkZSBjdW1wbGltaWVudG8geSBjb2JlcnR1cmE8L2gyPjxkaXYgaWQ9ImJ1ZGdldERldGFpbFYxOCI+PC9kaXY+PC9zZWN0aW9uPjxkZXRhaWxzIGNsYXNzPSJjYXJkIGJ1ZGdldE1ldGhvZFYxOCI+PHN1bW1hcnk+RnVlbnRlLCBjw6FsY3VsbyB5IGFsbWFjZW5hbWllbnRvPC9zdW1tYXJ5PjxwPkZ1ZW50ZTogJHtlc2MoWy4uLm5ldyBTZXQoYnVkZ2V0Um93c1YxOC5tYXAocj0+ci5zb3VyY2UpKV0uam9pbignLCAnKSl8fCdTaW4gcHJlc3VwdWVzdG8gY2FyZ2Fkbyd9IMK3IGhvamEgYmFzZXMsIEEgPSBmZWNoYSwgRCA9IFdJTiBUR00geSBFID0gQ09JTiBJTi4gVmFsb3JlcyBlbiBDTFAuIFJlYWw6IHByaW1lciBXaW4gb3BlcmFjaW9uYWwgKGNvbHVtbmEgUSkgeSBDb2luIEluIChTKSBkZSBsYSBtYXRyaXouIFNlIGV4Y2x1eWVuIEVYUElSQURPUyB5IHNlcGFyYWRvcmVzLjwvcD48cD5DdW1wbGltaWVudG8gPSBzdW1hIHJlYWwgw7cgc3VtYSBQUFRPIHBhcmEgbGFzIG1pc21hcyBmZWNoYXMuIEJyZWNoYSA9IHJlYWwg4oiSIFBQVE8uIExhcyBtZXRhcyBzb24gZGVsIHBhcnF1ZSBjb21wbGV0bzsgbm8gc2UgcmVwYXJ0ZW4gZW50cmUgbcOhcXVpbmFzIG5pIHNlIHByb21lZGlhbiBwb3JjZW50YWplcyBkaWFyaW9zLiBObyBzZSByZWFsaXphIHByb3llY2Npw7NuIGF1dG9tw6F0aWNhLiBTZW1hbmFzIGRlIGx1bmVzIGEgZG9taW5nbywgcmVjb3J0YWRhcyBhbCByYW5nbyBzb2xpY2l0YWRvLjwvcD4ke2J1ZGdldFN0b3JhZ2VWMTg/YDxwPjxiPlVzbyByZWFsIGRlIGxhIGJhc2UgY29tcGxldGE6ICR7KGJ1ZGdldFN0b3JhZ2VWMTguZGF0YWJhc2VCeXRlcy8xZTYpLnRvTG9jYWxlU3RyaW5nKCdlcy1DTCcse21heGltdW1GcmFjdGlvbkRpZ2l0czoxfSl9IE1CPC9iPiBkZSBsb3MgNTAwIE1CIGRlbCBwbGFuIGdyYXR1aXRvICgkeyhidWRnZXRTdG9yYWdlVjE4LmRhdGFiYXNlQnl0ZXMvNWU2KS50b0xvY2FsZVN0cmluZygnZXMtQ0wnLHttYXhpbXVtRnJhY3Rpb25EaWdpdHM6MX0pfSAlKS4gQ29uc3VsdGEgcHVudHVhbDsgZWwgdXNvIGNhbWJpYSBjb24gbGFzIGNhcmdhcy4gSW5jbHV5ZSBvdHJhcyBhcGxpY2FjaW9uZXMgZGVsIG1pc21vIHByb3llY3RvLjwvcD5gOicnfTxwPkV4Y2VsIG9yaWdpbmFsIHkgYXJjaGl2byBoaXN0w7NyaWNvOiA8YSBocmVmPSJodHRwczovL2RyaXZlLmdvb2dsZS5jb20vZHJpdmUvZm9sZGVycy8xNTQtWWVIajRRVnNzZXdCMDJDUWJ5dFVkYjBpdkJjeVAiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIj5jYXJwZXRhIGRlIERyaXZlPC9hPi4gTG9zIGRhdG9zIGFjdGl2b3MgcGVybWFuZWNlbiBlbiBTdXBhYmFzZS4gRXN0YSBjYXJwZXRhIG5vIGltcGxpY2EgcmVzcGFsZG9zIGF1dG9tw6F0aWNvcyBkZSBmdXR1cmFzIGNhcmdhcy48L3A+PC9kZXRhaWxzPmA7CiAgJCgnI2NvbnRlbnQnKS5pbm5lckhUTUw9Jyc7IC8vIFRoZSBmaW5hbCBET00gaXMgY29tbWl0dGVkIGJlbG93IG9ubHkgYWZ0ZXIgY2FsY3VsYXRpb24gc3VjY2VlZHMuCiAgY3VycmVudEJ1ZGdldFYxOC5kZXRhaWw9e2hlYWRlcnMscm93czpkZXRhaWx9OwogfWNhdGNoKGUpe2NvbnRlbnQ9JzxkaXYgY2xhc3M9Im5vdGljZSI+Jytlc2MoZS5tZXNzYWdlKSsnPC9kaXY+Jzt9CiAkKCcjY29udGVudCcpLmlubmVySFRNTD1iYW5uZXIoJ0N1bXBsaW1pZW50byBkZWwgcHJlc3VwdWVzdG8gVEdNJywnV2luIHkgQ29pbiBJbiBmcmVudGUgYSBsYXMgbWV0YXMgZGlhcmlhcyBkZWwgbWlzbW8gYcOxbywgY29uIGNvYmVydHVyYSB2aXNpYmxlIHkgbW9udG9zIGNvbXBhcmFibGVzLicpK2A8c2VjdGlvbiBjbGFzcz0iY2FyZCBidWRnZXRDb250cm9sc1YxOCI+PGxhYmVsPkRlc2RlPGlucHV0IHR5cGU9ImRhdGUiIGlkPSJidWRnZXRGcm9tVjE4IiB2YWx1ZT0iJHtlc2Mocy5mcm9tKX0iPjwvbGFiZWw+PGxhYmVsPkhhc3RhPGlucHV0IHR5cGU9ImRhdGUiIGlkPSJidWRnZXRUb1YxOCIgdmFsdWU9IiR7ZXNjKHMudG8pfSI+PC9sYWJlbD48bGFiZWw+QWdydXBhciBwb3I8c2VsZWN0IGlkPSJidWRnZXRHcmFpblYxOCI+PG9wdGlvbiB2YWx1ZT0iZGF5Ij5Ew61hPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0id2VlayI+U2VtYW5hPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibW9udGgiPk1lczwvb3B0aW9uPjwvc2VsZWN0PjwvbGFiZWw+PGxhYmVsPkluZGljYWRvciBlbiBncsOhZmljb3M8c2VsZWN0IGlkPSJidWRnZXRNZXRyaWNWMTgiPjxvcHRpb24gdmFsdWU9IndpbiI+V2luIG9wZXJhY2lvbmFsPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iY29pbiI+Q29pbiBJbjwvb3B0aW9uPjwvc2VsZWN0PjwvbGFiZWw+PGJ1dHRvbiBpZD0iYnVkZ2V0QXBwbHlWMTgiIGNsYXNzPSJwcmltYXJ5Ij5BcGxpY2FyPC9idXR0b24+PGJ1dHRvbiBpZD0iYnVkZ2V0UmVsb2FkVjE4Ij5BY3R1YWxpemFyIFBQVE88L2J1dHRvbj48cD5Ub2RvIGVsIHBhcnF1ZSDCtyBsb3MgZmlsdHJvcyBkZSBtw6FxdWluYXMgZGUgb3RyYXMgcGVzdGHDsWFzIG5vIHNlIGFwbGljYW4gYSBlc3RhIG1ldGEgZ2VuZXJhbC48L3A+PC9zZWN0aW9uPmArY29udGVudDsKICQoJyNidWRnZXRHcmFpblYxOCcpLnZhbHVlPXMuZ3JhaW47JCgnI2J1ZGdldE1ldHJpY1YxOCcpLnZhbHVlPXMubWV0cmljOwogJCgnI2J1ZGdldEFwcGx5VjE4Jykub25jbGljaz0oKT0+e3MuZnJvbT0kKCcjYnVkZ2V0RnJvbVYxOCcpLnZhbHVlO3MudG89JCgnI2J1ZGdldFRvVjE4JykudmFsdWU7cy5ncmFpbj0kKCcjYnVkZ2V0R3JhaW5WMTgnKS52YWx1ZTtzLm1ldHJpYz0kKCcjYnVkZ2V0TWV0cmljVjE4JykudmFsdWU7cmVuZGVyKCk7fTsKICQoJyNidWRnZXRSZWxvYWRWMTgnKS5vbmNsaWNrPSgpPT57bG9hZEJ1ZGdldFYxOCh0cnVlKTtyZW5kZXIoKTt9O2NvbnN0IHJldHJ5PSQoJyNidWRnZXRSZXRyeVYxOCcpO2lmKHJldHJ5KXJldHJ5Lm9uY2xpY2s9KCk9Pntsb2FkQnVkZ2V0VjE4KHRydWUpO3JlbmRlcigpO307CiBpZihjdXJyZW50QnVkZ2V0VjE4Py5kZXRhaWwpe2NvbnN0IHtoZWFkZXJzLHJvd3N9PWN1cnJlbnRCdWRnZXRWMTguZGV0YWlsO3BhcmtUYWJsZUxBKCQoJyNidWRnZXREZXRhaWxWMTgnKSxoZWFkZXJzLHJvd3MsaGVhZGVycy5tYXAoKGgsaSk9Pls4LDEyXS5pbmNsdWRlcyhpKT9wZXJjZW50UGFya0xBOm51bGwpKTt9CiBkZWNvcmF0ZUNoYXJ0c1Y4KCk7ZW5oYW5jZVRhYmxlc0xBKCk7Zml0UmVzcG9uc2l2ZUNoYXJ0c0xBKCk7cG9saXNoVmlzdWFsTEEoKTtkZWNvcmF0ZVNwYW5pc2hEYXRlc0xBKCk7c2V0dXBFeHBlcmllbmNlSGVhZGVyTEEoKTsKIGlmKGJ1ZGdldE93bmVyVjE4IT09YXBwU2Vzc2lvblYxNT8udG9rZW58fCghYnVkZ2V0TG9hZGluZ1YxOCYmYnVkZ2V0Um93c1YxOD09PW51bGwmJiFidWRnZXRFcnJvclYxOCkpbG9hZEJ1ZGdldFYxOCgpOwp9CmNvbnN0IGJ1ZGdldE5hdlYxOD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtidWRnZXROYXZWMTguZGF0YXNldC50YWI9YnVkZ2V0VGFiVjE4O2J1ZGdldE5hdlYxOC50ZXh0Q29udGVudD0n4peOICAnK2J1ZGdldFRhYlYxODtidWRnZXROYXZWMTgub25jbGljaz0oKT0+YWN0aXZhdGVUYWJWMyhidWRnZXRUYWJWMTgpO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ25hdiBidXR0b25bZGF0YS10YWI9Ik1ldG9kb2xvZ8OtYSJdJykuYmVmb3JlKGJ1ZGdldE5hdlYxOCk7CmNvbnN0IHJlbmRlckJlZm9yZUJ1ZGdldFYxOD1yZW5kZXI7CnJlbmRlcj1mdW5jdGlvbigpe2lmKGRhdGEmJnRhYj09PWJ1ZGdldFRhYlYxOCl7c2xpY2VDYWNoZUZhc3RMQT1uZXcgTWFwKCk7YWdncmVnYXRlQ2FjaGVGYXN0TEE9bmV3IFdlYWtNYXAoKTtyZW5kZXJCdWRnZXRWMTgoKTt9ZWxzZSByZW5kZXJCZWZvcmVCdWRnZXRWMTgoKTt9Owpjb25zdCBleHBvcnRCZWZvcmVCdWRnZXRWMTg9JCgnI3YyZXhwb3J0Jykub25jbGljazsKJCgnI3YyZXhwb3J0Jykub25jbGljaz1mdW5jdGlvbigpe2lmKHRhYiE9PWJ1ZGdldFRhYlYxOClyZXR1cm4gZXhwb3J0QmVmb3JlQnVkZ2V0VjE4KCk7Y29uc3Qgcj1jdXJyZW50QnVkZ2V0VjE4O2lmKCFyKXthbGVydCgnRXNwZXJhIGEgcXVlIHNlIGNhcmd1ZSBlbCBwcmVzdXB1ZXN0byB5IHNlbGVjY2lvbmEgZmVjaGFzIHbDoWxpZGFzLicpO3JldHVybjt9ZG93bmxvYWRCbG9iVjgod29ya2Jvb2tCbG9iVjgoW3tuYW1lOidDdW1wbGltaWVudG8nLHJvd3M6ZXhwb3J0Um93c30se25hbWU6J0RpYXJpbycscm93czpbWydGZWNoYScsJ1dpbiByZWFsIENMUCcsJ1dpbiBQUFRPIENMUCcsJ0NvaW4gSW4gcmVhbCBDTFAnLCdDb2luIEluIFBQVE8gQ0xQJywnQ29tcGFyYWJsZSddLC4uLnIuZGFpbHkubWFwKGQ9PltkLmRhdGUsZC5hY3R1YWw/Lndpbj8/bnVsbCxkLnRhcmdldD8ud2luPz9udWxsLGQuYWN0dWFsPy5jb2luPz9udWxsLGQudGFyZ2V0Py5jb2luPz9udWxsLGQubWF0Y2hlZD8nU8OtJzonTm8nXSldfSx7bmFtZTonQ29uc3VsdGEnLHJvd3M6W1snUGVyw61vZG8nLHZpZXdTdGF0ZS5idWRnZXRWMTguZnJvbSsnIGEgJyt2aWV3U3RhdGUuYnVkZ2V0VjE4LnRvXSxbJ0Z1ZW50ZScsJ0NJRVJSRSBQUFRPIDIwMjUueGxzeCDCtyBiYXNlcyBBLEQsRSDCtyBjb250aWVuZSBtZXRhcyAyMDI1IHkgMjAyNiddLFsnQWxjYW5jZScsJ1RvZG8gZWwgcGFycXVlLiBDdW1wbGltaWVudG8gc29icmUgbGFzIG1pc21hcyBmZWNoYXMgY29uIGRhdG9zIHJlYWxlcyB5IG1ldGEuIETDrWFzIGF1c2VudGVzIG5vIHNvbiBjZXJvLiddXX1dKSwnTEEtQ3VtcGxpbWllbnRvLVBQVE8ueGxzeCcpO307CmNvbnN0IGVuZEJlZm9yZUJ1ZGdldFYxOD1lbmRMb2NhbFNlc3Npb25WMTU7CmVuZExvY2FsU2Vzc2lvblYxNT1mdW5jdGlvbihtZXNzYWdlKXtidWRnZXRSb3dzVjE4PW51bGw7YnVkZ2V0T3duZXJWMTg9bnVsbDtidWRnZXRFcnJvclYxOD0nJztidWRnZXRTdG9yYWdlVjE4PW51bGw7Y3VycmVudEJ1ZGdldFYxOD1udWxsO3JldHVybiBlbmRCZWZvcmVCdWRnZXRWMTgobWVzc2FnZSk7fTsKDQoNCgovLyBPbmx5IHF1ZXJ5IGNvbmZpZ3VyYXRpb24gaXMgcGVyc2lzdGVkLCBzY29wZWQgdG8gdGhlIGN1cnJlbnQgYWNjb3VudCBhbmQgcHJvamVjdC4KY29uc3QgZGVmYXVsdFN0YXRlUXVlcnlWMTQ9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2aWV3U3RhdGUpKTsKbGV0IG93bmVyUXVlcnlWMTQ9bnVsbCxwZW5kaW5nUXVlcnlWMTQ9bnVsbCxib290UXVlcnlWMTQ9ZmFsc2UsdGltZXJRdWVyeVYxND1udWxsLHJlc3RvcmVkUXVlcnlWMTQ9ZmFsc2U7CmZ1bmN0aW9uIGtleVF1ZXJ5VjE0KCl7Y29uc3QgdXNlcm5hbWU9U3RyaW5nKGFwcFNlc3Npb25WMTU/LnVzZXJuYW1lfHwnJykudHJpbSgpLnRvVXBwZXJDYXNlKCk7cmV0dXJuIHVzZXJuYW1lPydMQV9MQVNUX1FVRVJZX1YxNHwnK1N0cmluZyh3aW5kb3cuTEFfQ09ORklHPy5zdXBhYmFzZVVybHx8JycpKyd8Jyt1c2VybmFtZTpudWxsO30KZnVuY3Rpb24gY2xlYW5KU09OUXVlcnlWMTQodmFsdWUpe3JldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlLChrZXksaXRlbSk9PlsnX19wcm90b19fJywnY29uc3RydWN0b3InLCdwcm90b3R5cGUnLCd0b2tlbicsJ3Bhc3N3b3JkJywnYWNjZXNzX3Rva2VuJywncmVmcmVzaF90b2tlbicsJ3Jvd3MnLCdwYXlsb2FkJ10uaW5jbHVkZXMoa2V5KT91bmRlZmluZWQ6aXRlbSkpO30KZnVuY3Rpb24gY2FwdHVyZVF1ZXJ5VjE0KCl7cmV0dXJue3ZlcnNpb246MSxzYXZlZEF0Om5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSx0YWIsZnJvbTokKCcjZnJvbScpPy52YWx1ZXx8JycsdG86JCgnI3RvJyk/LnZhbHVlfHwnJyxzdGF0ZTpjbGVhbkpTT05RdWVyeVYxNCh2aWV3U3RhdGUpLGRlbnNpdHk6ZGVuc2l0eUxBfTt9CmZ1bmN0aW9uIGxvYWRRdWVyeVYxNChrZXkpe3RyeXtjb25zdCByYXc9bG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtpZighcmF3fHxyYXcubGVuZ3RoPjI1MDAwMClyZXR1cm4gbnVsbDtjb25zdCBzYXZlZD1KU09OLnBhcnNlKHJhdywobmFtZSx2YWx1ZSk9PlsnX19wcm90b19fJywnY29uc3RydWN0b3InLCdwcm90b3R5cGUnXS5pbmNsdWRlcyhuYW1lKT91bmRlZmluZWQ6dmFsdWUpO2lmKHNhdmVkPy52ZXJzaW9uIT09MXx8IXNhdmVkLnN0YXRlfHx0eXBlb2Ygc2F2ZWQuc3RhdGUhPT0nb2JqZWN0J3x8QXJyYXkuaXNBcnJheShzYXZlZC5zdGF0ZSkpcmV0dXJuIG51bGw7Zm9yKGNvbnN0IHZhbHVlIG9mIE9iamVjdC52YWx1ZXMoc2F2ZWQuc3RhdGUpKWlmKHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWU9PT0nb2JqZWN0JyYmQXJyYXkuaXNBcnJheSh2YWx1ZSkpcmV0dXJuIG51bGw7cmV0dXJuIHNhdmVkO31jYXRjaChlcnJvcil7cmV0dXJuIG51bGw7fX0KZnVuY3Rpb24gc3RhdHVzUXVlcnlWMTQobWVzc2FnZSl7bGV0IGJhZGdlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXN0UXVlcnlTdGF0dXNWMTQnKTtpZighYmFkZ2Upe2NvbnN0IGJhcj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud29ya3NwYWNlYmFyJyk7aWYoIWJhcilyZXR1cm47YmFkZ2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO2JhZGdlLmlkPSdsYXN0UXVlcnlTdGF0dXNWMTQnO2JhZGdlLnNldEF0dHJpYnV0ZSgncm9sZScsJ3N0YXR1cycpO2Jhci5hcHBlbmRDaGlsZChiYWRnZSk7fWJhZGdlLnRleHRDb250ZW50PW1lc3NhZ2U7YmFkZ2UudGl0bGU9J0ZlY2hhcywgZmlsdHJvcyB5IGdyw6FmaWNvcyBzZSByZWN1ZXJkYW4gcG9yIHVzdWFyaW8gZW4gZXN0ZSBuYXZlZ2Fkb3IuIE5vIHNlIGd1YXJkYW4gY29udHJhc2XDsWFzIG5pIG1hdHJpY2VzLic7fQpmdW5jdGlvbiBzYXZlUXVlcnlWMTQoKXsKIGlmKGJvb3RRdWVyeVYxNHx8IWRhdGF8fCFvd25lclF1ZXJ5VjE0fHxvd25lclF1ZXJ5VjE0IT09a2V5UXVlcnlWMTQoKSlyZXR1cm4gZmFsc2U7CiBpZih0aW1lclF1ZXJ5VjE0KXtjbGVhclRpbWVvdXQodGltZXJRdWVyeVYxNCk7dGltZXJRdWVyeVYxND1udWxsO30KIHRyeXtjb25zdCB0ZXh0PUpTT04uc3RyaW5naWZ5KGNhcHR1cmVRdWVyeVYxNCgpKTtpZih0ZXh0Lmxlbmd0aD4yNTAwMDApdGhyb3cgRXJyb3IoJ0NvbmZpZ3VyYWNpw7NuIGRlbWFzaWFkbyBncmFuZGUnKTtsb2NhbFN0b3JhZ2Uuc2V0SXRlbShvd25lclF1ZXJ5VjE0LHRleHQpO3N0YXR1c1F1ZXJ5VjE0KCdDb25zdWx0YSBndWFyZGFkYSBlbiBlc3RlIGVxdWlwbycpO3JldHVybiB0cnVlO31jYXRjaChlcnJvcil7c3RhdHVzUXVlcnlWMTQoJ0VzdGUgbmF2ZWdhZG9yIG5vIHBlcm1pdGUgZ3VhcmRhciBsYSBjb25zdWx0YScpO3JldHVybiBmYWxzZTt9Cn0KZnVuY3Rpb24gcXVldWVRdWVyeVYxNCgpe2lmKGJvb3RRdWVyeVYxNHx8IW93bmVyUXVlcnlWMTQpcmV0dXJuO2lmKHRpbWVyUXVlcnlWMTQpY2xlYXJUaW1lb3V0KHRpbWVyUXVlcnlWMTQpO3RpbWVyUXVlcnlWMTQ9c2V0VGltZW91dChzYXZlUXVlcnlWMTQsMTgwKTt9CmZ1bmN0aW9uIHJlc2V0U3RhdGVRdWVyeVYxNCgpe2Zvcihjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmlld1N0YXRlKSlkZWxldGUgdmlld1N0YXRlW2tleV07T2JqZWN0LmFzc2lnbih2aWV3U3RhdGUsSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkZWZhdWx0U3RhdGVRdWVyeVYxNCkpKTt9CmZ1bmN0aW9uIGFwcGx5UXVlcnlWMTQoc2F2ZWQpewogcmVzZXRTdGF0ZVF1ZXJ5VjE0KCk7aWYoc2F2ZWQpT2JqZWN0LmFzc2lnbih2aWV3U3RhdGUsY2xlYW5KU09OUXVlcnlWMTQoc2F2ZWQuc3RhdGUpKTsKIGNvbnN0IGF2YWlsYWJsZT1bLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbmF2IGJ1dHRvbltkYXRhLXRhYl0nKV0ubWFwKGJ1dHRvbj0+YnV0dG9uLmRhdGFzZXQudGFiKTt0YWI9c2F2ZWQmJmF2YWlsYWJsZS5pbmNsdWRlcyhzYXZlZC50YWIpP3NhdmVkLnRhYjonUmVzdW1lbic7CiBpZihzYXZlZCl7Zm9yKGNvbnN0IG5hbWUgb2YgWydmcm9tJywndG8nXSlpZihzYXZlZFtuYW1lXT09PScnfHwvXlxkezR9LVxkezJ9LVxkezJ9JC8udGVzdChzYXZlZFtuYW1lXSkpJCgnIycrbmFtZSkudmFsdWU9c2F2ZWRbbmFtZV07ZGVuc2l0eUxBPXNhdmVkLmRlbnNpdHk9PT0nY29tZm9ydGFibGUnPydjb21mb3J0YWJsZSc6J2NvbXBhY3QnO2RvY3VtZW50LmJvZHkuZGF0YXNldC5kZW5zaXR5PWRlbnNpdHlMQTtjb25zdCBzZWxlY3Q9JCgnI2RlbnNpdHlMQScpO2lmKHNlbGVjdClzZWxlY3QudmFsdWU9ZGVuc2l0eUxBO30KIGNsZWFyUG96b0ZpbHRlcnNMQSgpO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ25hdiBidXR0b25bZGF0YS10YWJdJykuZm9yRWFjaChidXR0b249PmJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLGJ1dHRvbi5kYXRhc2V0LnRhYj09PXRhYikpOwp9CmNvbnN0IGluaXRCZWZvcmVRdWVyeVYxND1pbml0Owppbml0PWZ1bmN0aW9uKCl7CiBjb25zdCBrZXk9a2V5UXVlcnlWMTQoKTtpZigha2V5KXJldHVybiBpbml0QmVmb3JlUXVlcnlWMTQoKTsKIGlmKHRpbWVyUXVlcnlWMTQpe2NsZWFyVGltZW91dCh0aW1lclF1ZXJ5VjE0KTt0aW1lclF1ZXJ5VjE0PW51bGw7fW93bmVyUXVlcnlWMTQ9a2V5O3BlbmRpbmdRdWVyeVYxND17c2F2ZWQ6bG9hZFF1ZXJ5VjE0KGtleSl9O2Jvb3RRdWVyeVYxND10cnVlOwogdHJ5e2luaXRCZWZvcmVRdWVyeVYxNCgpO31maW5hbGx5e2Jvb3RRdWVyeVYxND1mYWxzZTtwZW5kaW5nUXVlcnlWMTQ9bnVsbDt9CiBzYXZlUXVlcnlWMTQoKTsKfTsKY29uc3QgcmVuZGVyQmVmb3JlUXVlcnlWMTQ9cmVuZGVyOwpyZW5kZXI9ZnVuY3Rpb24oKXsKIGNvbnN0IHJlc3RvcmU9cGVuZGluZ1F1ZXJ5VjE0O3BlbmRpbmdRdWVyeVYxND1udWxsOwogaWYocmVzdG9yZSl7YXBwbHlRdWVyeVYxNChyZXN0b3JlLnNhdmVkKTtyZXN0b3JlZFF1ZXJ5VjE0PSEhcmVzdG9yZS5zYXZlZDt9CiB0cnl7cmVuZGVyQmVmb3JlUXVlcnlWMTQoKTt9Y2F0Y2goZXJyb3Ipe2lmKCFyZXN0b3JlPy5zYXZlZCl0aHJvdyBlcnJvcjtyZXNldFN0YXRlUXVlcnlWMTQoKTt0YWI9J1Jlc3VtZW4nO2NvbnN0IGRhdGVzPW1hdHJpeEluZGV4RmFzdExBKCkuZGF0ZXM7JCgnI2Zyb20nKS52YWx1ZT1kYXRlc1swXXx8Jyc7JCgnI3RvJykudmFsdWU9ZGF0ZXMuYXQoLTEpfHwnJztkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCduYXYgYnV0dG9uW2RhdGEtdGFiXScpLmZvckVhY2goYnV0dG9uPT5idXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJyxidXR0b24uZGF0YXNldC50YWI9PT10YWIpKTtyZW5kZXJCZWZvcmVRdWVyeVYxNCgpO3Jlc3RvcmVkUXVlcnlWMTQ9ZmFsc2U7c3RhdHVzUXVlcnlWMTQoJ05vIHNlIHB1ZG8gcmVjdXBlcmFyIGxhIGNvbnN1bHRhIGFudGVyaW9yJyk7fQogaWYocmVzdG9yZWRRdWVyeVYxNCYmcmVzdG9yZSlzdGF0dXNRdWVyeVYxNCgnw5psdGltYSBjb25zdWx0YSByZWN1cGVyYWRhJyk7cXVldWVRdWVyeVYxNCgpOwp9Owpjb25zdCBlbmRTZXNzaW9uQmVmb3JlUXVlcnlWMTQ9ZW5kTG9jYWxTZXNzaW9uVjE1OwplbmRMb2NhbFNlc3Npb25WMTU9ZnVuY3Rpb24oLi4uYXJncyl7c2F2ZVF1ZXJ5VjE0KCk7b3duZXJRdWVyeVYxND1udWxsO2lmKHRpbWVyUXVlcnlWMTQpe2NsZWFyVGltZW91dCh0aW1lclF1ZXJ5VjE0KTt0aW1lclF1ZXJ5VjE0PW51bGw7fXJldHVybiBlbmRTZXNzaW9uQmVmb3JlUXVlcnlWMTQoLi4uYXJncyk7fTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJywoKT0+c2F2ZVF1ZXJ5VjE0KCkpOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywoKT0+e2lmKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZT09PSdoaWRkZW4nKXNhdmVRdWVyeVYxNCgpO30pOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCgpPT57aWYoZGF0YSYmb3duZXJRdWVyeVYxNClxdWV1ZVF1ZXJ5VjE0KCk7fSk7CgpsZXQgZGVza3RvcEhpZGRlblYxNj1mYWxzZSxtb2JpbGVPcGVuVjE2PWZhbHNlOwp0cnl7ZGVza3RvcEhpZGRlblYxNj1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnTEFfTkFWX0hJRERFTl9WMTYnKT09PScxJzt9Y2F0Y2goZSl7fQpmdW5jdGlvbiBtb2JpbGVOYXZpZ2F0aW9uVjE2KCl7cmV0dXJuIHdpbmRvdy5pbm5lcldpZHRoPD05MDA7fQpmdW5jdGlvbiBzZXROYXZpZ2F0aW9uVjE2KG9wZW4sZm9jdXM9ZmFsc2UpewogaWYobW9iaWxlTmF2aWdhdGlvblYxNigpKW1vYmlsZU9wZW5WMTY9b3BlbjsKIGVsc2V7ZGVza3RvcEhpZGRlblYxNj0hb3Blbjt0cnl7bG9jYWxTdG9yYWdlLnNldEl0ZW0oJ0xBX05BVl9ISURERU5fVjE2JyxvcGVuPycwJzonMScpO31jYXRjaChlKXt9fQogdXBkYXRlTmF2aWdhdGlvblYxNigpOwogaWYoZm9jdXMpe2NvbnN0IHRhcmdldD1vcGVuP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2FzaWRlIG5hdiBidXR0b24uYWN0aXZlLGFzaWRlIG5hdiBidXR0b24nKTokKCcjbmF2VG9nZ2xlVjE2Jyk7dGFyZ2V0Py5mb2N1cygpO30KIGlmKHR5cGVvZiBmaXRSZXNwb25zaXZlQ2hhcnRzTEE9PT0nZnVuY3Rpb24nKWZpdFJlc3BvbnNpdmVDaGFydHNMQSgpOwp9CmZ1bmN0aW9uIHVwZGF0ZU5hdmlnYXRpb25WMTYoKXsKIGNvbnN0IG1vYmlsZT1tb2JpbGVOYXZpZ2F0aW9uVjE2KCksb3Blbj1tb2JpbGU/bW9iaWxlT3BlblYxNjohZGVza3RvcEhpZGRlblYxNixhc2lkZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdhc2lkZScpOwogZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCduYXZIaWRkZW5WMTYnLCFvcGVuKTtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ25hdk1vYmlsZU9wZW5WMTYnLG1vYmlsZSYmb3Blbik7CiBpZihhc2lkZSl7YXNpZGUuaWQ9J25hdmlnYXRpb25QYW5lbFYxNic7YXNpZGUuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywnTWVuw7ogZGUgYW7DoWxpc2lzJyk7YXNpZGUuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsU3RyaW5nKCFvcGVuKSk7YXNpZGUuaW5lcnQ9IW9wZW47fQogY29uc3QgdG9nZ2xlPSQoJyNuYXZUb2dnbGVWMTYnKTtpZih0b2dnbGUpe3RvZ2dsZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLFN0cmluZyhvcGVuKSk7dG9nZ2xlLnRleHRDb250ZW50PW9wZW4/J+KYsCBPY3VsdGFyIG1lbsO6Jzon4piwIE1lbsO6Jzt9CiBjb25zdCBjdXJyZW50PSQoJyNuYXZDdXJyZW50VjE2Jyk7aWYoY3VycmVudCljdXJyZW50LnRleHRDb250ZW50PXRhYjsKIGNvbnN0IGJhY2tkcm9wPSQoJyNuYXZCYWNrZHJvcFYxNicpO2lmKGJhY2tkcm9wKWJhY2tkcm9wLmhpZGRlbj0hKG1vYmlsZSYmb3Blbik7Cn0KZnVuY3Rpb24gc2V0dXBOYXZpZ2F0aW9uVjE2KCl7CiBjb25zdCBtYWluPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21haW4nKSxhc2lkZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdhc2lkZScpO2lmKCFtYWlufHwhYXNpZGUpcmV0dXJuOwogaWYoISQoJyNuYXZUb29sYmFyVjE2JykpewogIGNvbnN0IGJhcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtiYXIuaWQ9J25hdlRvb2xiYXJWMTYnO2Jhci5pbm5lckhUTUw9JzxidXR0b24gdHlwZT0iYnV0dG9uIiBpZD0ibmF2VG9nZ2xlVjE2IiBhcmlhLWNvbnRyb2xzPSJuYXZpZ2F0aW9uUGFuZWxWMTYiIGFyaWEtZXhwYW5kZWQ9ImZhbHNlIj7imLAgTWVuw7o8L2J1dHRvbj48c3BhbiBpZD0ibmF2Q3VycmVudFYxNiI+PC9zcGFuPic7bWFpbi5wcmVwZW5kKGJhcik7CiAgJCgnI25hdlRvZ2dsZVYxNicpLm9uY2xpY2s9KCk9PnNldE5hdmlnYXRpb25WMTYobW9iaWxlTmF2aWdhdGlvblYxNigpPyFtb2JpbGVPcGVuVjE2OmRlc2t0b3BIaWRkZW5WMTYsdHJ1ZSk7CiAgY29uc3QgY2xvc2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7Y2xvc2UuaWQ9J25hdkNsb3NlVjE2JztjbG9zZS50eXBlPSdidXR0b24nO2Nsb3NlLnRleHRDb250ZW50PSfinJUgQ2VycmFyIG1lbsO6JztjbG9zZS5vbmNsaWNrPSgpPT5zZXROYXZpZ2F0aW9uVjE2KGZhbHNlLHRydWUpO2FzaWRlLnByZXBlbmQoY2xvc2UpOwogIGNvbnN0IGJhY2tkcm9wPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO2JhY2tkcm9wLmlkPSduYXZCYWNrZHJvcFYxNic7YmFja2Ryb3AudHlwZT0nYnV0dG9uJztiYWNrZHJvcC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCdDZXJyYXIgbWVuw7onKTtiYWNrZHJvcC50YWJJbmRleD0tMTtiYWNrZHJvcC5oaWRkZW49dHJ1ZTtiYWNrZHJvcC5vbmNsaWNrPSgpPT5zZXROYXZpZ2F0aW9uVjE2KGZhbHNlLHRydWUpO21haW4uYmVmb3JlKGJhY2tkcm9wKTsKICBhc2lkZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZT0+e2lmKGUudGFyZ2V0LmNsb3Nlc3QoJ25hdiBidXR0b24nKSYmbW9iaWxlTmF2aWdhdGlvblYxNigpKXNldE5hdmlnYXRpb25WMTYoZmFsc2UsdHJ1ZSk7fSk7CiB9CiB1cGRhdGVOYXZpZ2F0aW9uVjE2KCk7Cn0KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZXZlbnQ9PnsKIGlmKCFtb2JpbGVOYXZpZ2F0aW9uVjE2KCl8fCFtb2JpbGVPcGVuVjE2KXJldHVybjsKIGlmKGV2ZW50LmtleT09PSdFc2NhcGUnKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3NldE5hdmlnYXRpb25WMTYoZmFsc2UsdHJ1ZSk7fQogaWYoZXZlbnQua2V5PT09J1RhYicpewogIGNvbnN0IGl0ZW1zPVsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdhc2lkZSBidXR0b24sYXNpZGUgYVtocmVmXSxhc2lkZSBpbnB1dCxhc2lkZSBzZWxlY3QnKV0uZmlsdGVyKGVsPT4hZWwuZGlzYWJsZWQmJiFlbC5oaWRkZW4pLGZpcnN0PWl0ZW1zWzBdLGxhc3Q9aXRlbXMuYXQoLTEpOwogIGlmKGV2ZW50LnNoaWZ0S2V5JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09Zmlyc3Qpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7bGFzdD8uZm9jdXMoKTt9CiAgZWxzZSBpZighZXZlbnQuc2hpZnRLZXkmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1sYXN0KXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2ZpcnN0Py5mb2N1cygpO30KIH0KfSk7CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCgpPT57bW9iaWxlT3BlblYxNj1mYWxzZTt1cGRhdGVOYXZpZ2F0aW9uVjE2KCk7fSk7CmNvbnN0IHJlbmRlckJlZm9yZU5hdmlnYXRpb25WMTY9cmVuZGVyOwpyZW5kZXI9ZnVuY3Rpb24oKXtyZW5kZXJCZWZvcmVOYXZpZ2F0aW9uVjE2KCk7aWYoZGF0YSlzZXR1cE5hdmlnYXRpb25WMTYoKTt9OwoKZnVuY3Rpb24gcHJpemVQZXJpb2RzVjE3KHJlcG9ydCl7cmV0dXJuIHJlcG9ydC5zdW1tYXJ5LndlZWtzLm1hcCh3PT57Y29uc3QgZGF0ZXM9Wy4uLm5ldyBTZXQody5yb3dzLm1hcChyPT5yWzBdKSldLnNvcnQoKTtyZXR1cm4ge2xhYmVsOnByaXplV2Vla0xhYmVsTEEody5uYW1lLHcucm93cyksZnJvbTpkYXRlc1swXSx0bzpkYXRlcy5hdCgtMSkscGFpZDp3LnBhaWQsbmV0OncucHJpemUsYWRqdXN0bWVudHM6dy5hZGp1c3RtZW50c307fSk7fQpmdW5jdGlvbiBwcml6ZVNoYXJlQmxvYlYxNyhyZXBvcnQpewogY29uc3QgcGVyaW9kcz1wcml6ZVBlcmlvZHNWMTcocmVwb3J0KSxjYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7Y2FudmFzLndpZHRoPTEyMDA7Y2FudmFzLmhlaWdodD02ODArcGVyaW9kcy5sZW5ndGgqNzY7CiBjb25zdCBjdHg9Y2FudmFzLmdldENvbnRleHQoJzJkJyksbW9uZXk9dj0+Zm10KHYsJ3ByaXplJykrJyBDTFAnOwogY3R4LmZpbGxTdHlsZT0nIzEwMmU0NCc7Y3R4LmZpbGxSZWN0KDAsMCxjYW52YXMud2lkdGgsY2FudmFzLmhlaWdodCk7CiBjb25zdCB0ZXh0PSh2YWx1ZSx4LHksc2l6ZT0yNCxjb2xvcj0nIzE3MzY1MicpPT57Y3R4LmZvbnQ9YCR7c2l6ZT49MzA/J2JvbGQgJzonJ30ke3NpemV9cHggQXJpYWxgO2N0eC5maWxsU3R5bGU9Y29sb3I7Y3R4LmZpbGxUZXh0KHZhbHVlLHgseSk7fTsKIHRleHQoJ2Vuam95IMK3IExPUyDDgU5HRUxFUycsNDgsNjUsMzQsJyNmZmZmZmYnKTt0ZXh0KCdSZXN1bWVuIGRlIHByZW1pb3MgcGFnYWRvcycsNDgsMTEwLDI2LCcjZmZmZmZmJyk7CiBjdHguZmlsbFN0eWxlPScjZmZmZmZmJztjdHguZmlsbFJlY3QoMzIsMTQwLDExMzYsY2FudmFzLmhlaWdodC0xNzIpOwogdGV4dCgnUFJFTUlPUyBQQUdBRE9TIFBPU0lUSVZPUycsNjAsMTg1LDIwKTt0ZXh0KG1vbmV5KHJlcG9ydC5zdW1tYXJ5LnBhaWQpLDYwLDIzOCw0Mik7CiB0ZXh0KCdNw4FRVUlOQVMgUVVFIFBBR0FST04nLDc2MCwxODUsMjApO3RleHQoU3RyaW5nKHJlcG9ydC5zdW1tYXJ5Lm1hY2hpbmVDb3VudCksNzYwLDIzOCw0Mik7CiB0ZXh0KCdBanVzdGVzOiAnK21vbmV5KHJlcG9ydC5zdW1tYXJ5LmFkanVzdG1lbnRzKSsnICAgwrcgICBOZXRvOiAnK21vbmV5KHJlcG9ydC5zdW1tYXJ5Lm5ldCksNjAsMjgzLDIwKTsKIHRleHQoJ1BFUsONT0RPUyDCtyBGRUNIQVMgQ09OIERBVE9TJyw2MCwzMzAsMjIpOwogcGVyaW9kcy5mb3JFYWNoKChwLGkpPT57Y29uc3QgeT0zNzAraSo3Njt0ZXh0KHAubGFiZWwsNjAseSwyMik7dGV4dChkYXRlTGFiZWxTcGFuaXNoTEEocC5mcm9tKSsnIOKGkiAnK2RhdGVMYWJlbFNwYW5pc2hMQShwLnRvKSw2MCx5KzI4LDE4KTt0ZXh0KG1vbmV5KHAucGFpZCksODAwLHkrMTIsMjUpO30pOwogY29uc3QgdG9wPTQxMCtwZXJpb2RzLmxlbmd0aCo3Nixib3R0b209dG9wKzE2MCxsbz1NYXRoLm1pbigwLC4uLnBlcmlvZHMubWFwKHA9PnAubmV0KSksaGk9TWF0aC5tYXgoMSwuLi5wZXJpb2RzLm1hcChwPT5wLm5ldCkpLGNoYXJ0WT12PT5ib3R0b20tMTMwKih2LWxvKS8oaGktbG8pOwogdGV4dCgnUHJlbWlvcyBuZXRvcyBwb3Igc2VtYW5hIMK3IENMUCcsNjAsdG9wLTE4LDIyKTsKIGN0eC5zdHJva2VTdHlsZT0nI2Q0ZTBlOCc7Y3R4LmJlZ2luUGF0aCgpO2N0eC5tb3ZlVG8oNzAsYm90dG9tKTtjdHgubGluZVRvKDExMTAsYm90dG9tKTtjdHguc3Ryb2tlKCk7CiBwZXJpb2RzLmZvckVhY2goKHAsaSk9Pntjb25zdCB4PTEyMCtpKjk2MC9NYXRoLm1heCgxLHBlcmlvZHMubGVuZ3RoLTEpLHk9Y2hhcnRZKHAubmV0KTtjdHguZmlsbFN0eWxlPScjMTg1OWI1JztjdHguYmVnaW5QYXRoKCk7Y3R4LmFyYyh4LHksNiwwLE1hdGguUEkqMik7Y3R4LmZpbGwoKTtpZihpKXtjb25zdCBwcmV2PXBlcmlvZHNbaS0xXSxweD0xMjArKGktMSkqOTYwL01hdGgubWF4KDEscGVyaW9kcy5sZW5ndGgtMSk7Y3R4LnN0cm9rZVN0eWxlPScjMTg1OWI1JztjdHgubGluZVdpZHRoPTM7Y3R4LmJlZ2luUGF0aCgpO2N0eC5tb3ZlVG8ocHgsY2hhcnRZKHByZXYubmV0KSk7Y3R4LmxpbmVUbyh4LHkpO2N0eC5zdHJva2UoKTt9dGV4dChjb21wYWN0KHAubmV0LCdwcml6ZScpLE1hdGgubWluKHgtMjgsMTA0MCkseS0xNSwxOCk7fSk7CiB0ZXh0KCdGdWVudGU6IGNvbHVtbmEgUHJlbWlvcyDCtyBzZWxlY2Npw7NuIGFjdHVhbCDCtyBmZWNoYXMgY29uIHJlZ2lzdHJvcywgcHVlZGUgaW5jbHVpciBwZXLDrW9kb3MgaW5jb21wbGV0b3MuJyw2MCxjYW52YXMuaGVpZ2h0LTU4LDE2KTsKIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT5jYW52YXMudG9CbG9iKGJsb2I9PmJsb2I/cmVzb2x2ZShibG9iKTpyZWplY3QoRXJyb3IoJ05vIHNlIHB1ZG8gZ2VuZXJhciBsYSBpbWFnZW4uJykpLCdpbWFnZS9wbmcnKSk7Cn0KY29uc3QgcmVuZGVyUHJpemVzQmVmb3JlU2hhcmVWMTc9cmVuZGVyUHJpemVzTEE7CnJlbmRlclByaXplc0xBPWZ1bmN0aW9uKCl7CiByZW5kZXJQcml6ZXNCZWZvcmVTaGFyZVYxNygpO2NvbnN0IHJlcG9ydD1jdXJyZW50UHJpemVSZXBvcnRMQTtpZighcmVwb3J0KXJldHVybjsKIGNvbnN0IGtwaXM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NvbnRlbnQgLmtwaXMnKSxjaGFydHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NvbnRlbnQgLnJlcG9ydGNoYXJ0cycpO2lmKCFrcGlzfHwhY2hhcnRzKXJldHVybjsKIGtwaXMuY2xhc3NMaXN0LmFkZCgncHJpemVTdW1tYXJ5VjE3Jyk7CiBjb25zdCBwZXJpb2RzPXByaXplUGVyaW9kc1YxNyhyZXBvcnQpOwogY2hhcnRzLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlYmVnaW4nLGA8c2VjdGlvbiBjbGFzcz0iY2FyZCIgaWQ9InByaXplUGVyaW9kc1YxNyI+PGgyPlBlcsOtb2RvcyB5IHByZW1pb3MgcGFnYWRvczwvaDI+PHAgY2xhc3M9InN1YnRpdGxlIj5GZWNoYXMgY29uIHJlZ2lzdHJvcyBkZSBsYSBzZWxlY2Npw7NuIGFjdHVhbC4gTG9zIHBhZ29zIHBvc2l0aXZvcyBzZSBtdWVzdHJhbiBzZXBhcmFkb3MgZGUgbG9zIGFqdXN0ZXMuPC9wPjxkaXYgY2xhc3M9InRhYmxld3JhcCI+PHRhYmxlPjx0aGVhZD48dHI+PHRoPlNlbWFuYTwvdGg+PHRoPkRlc2RlPC90aD48dGg+SGFzdGE8L3RoPjx0aD5Ub3RhbCBwYWdhZG8gcG9zaXRpdm88L3RoPjx0aD5BanVzdGVzPC90aD48dGg+TmV0bzwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT4ke3BlcmlvZHMubWFwKHA9PmA8dHI+PHRkPiR7ZXNjKHAubGFiZWwpfTwvdGQ+PHRkPiR7ZXNjKGRhdGVMYWJlbFNwYW5pc2hMQShwLmZyb20pKX08L3RkPjx0ZD4ke2VzYyhkYXRlTGFiZWxTcGFuaXNoTEEocC50bykpfTwvdGQ+PHRkPiR7Zm10KHAucGFpZCwncHJpemUnKX0gQ0xQPC90ZD48dGQ+JHtmbXQocC5hZGp1c3RtZW50cywncHJpemUnKX0gQ0xQPC90ZD48dGQ+JHtmbXQocC5uZXQsJ3ByaXplJyl9IENMUDwvdGQ+PC90cj5gKS5qb2luKCcnKXx8Jzx0cj48dGQgY29sc3Bhbj0iNiI+U2luIHJlZ2lzdHJvcyBwYXJhIGxhIHNlbGVjY2nDs24uPC90ZD48L3RyPid9PC90Ym9keT48L3RhYmxlPjwvZGl2PjxkaXYgY2xhc3M9InZpZXdjb250cm9scyI+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGlkPSJwcml6ZUNvcHlWMTciPkNvcGlhciByZXN1bWVuIGNvbW8gaW1hZ2VuPC9idXR0b24+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGlkPSJwcml6ZURvd25sb2FkVjE3Ij5EZXNjYXJnYXIgcmVzdW1lbiBQTkc8L2J1dHRvbj48c3BhbiBpZD0icHJpemVTaGFyZVN0YXR1c1YxNyIgcm9sZT0ic3RhdHVzIj48L3NwYW4+PC9kaXY+PC9zZWN0aW9uPmApOwogY29uc3Qgc2hhcmU9YXN5bmMgY29weT0+e2NvbnN0IHN0YXR1cz0kKCcjcHJpemVTaGFyZVN0YXR1c1YxNycpO3RyeXtzdGF0dXMudGV4dENvbnRlbnQ9J1ByZXBhcmFuZG8gaW1hZ2Vu4oCmJztjb25zdCBibG9iPWF3YWl0IHByaXplU2hhcmVCbG9iVjE3KHJlcG9ydCk7aWYoY29weSYmbmF2aWdhdG9yLmNsaXBib2FyZD8ud3JpdGUmJnR5cGVvZiBDbGlwYm9hcmRJdGVtIT09J3VuZGVmaW5lZCcpe3RyeXthd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlKFtuZXcgQ2xpcGJvYXJkSXRlbSh7J2ltYWdlL3BuZyc6YmxvYn0pXSk7c3RhdHVzLnRleHRDb250ZW50PSdJbWFnZW4gY29waWFkYS4gUHVlZGVzIHBlZ2FybGEgZW4gdHUgbWVuc2FqZS4nO3JldHVybjt9Y2F0Y2goZSl7fX1kb3dubG9hZEJsb2JWOChibG9iLCdFbmpveS1wcmVtaW9zLScrKHBlcmlvZHNbMF0/LmZyb218fCdzZWxlY2Npb24nKSsnLScrKHBlcmlvZHMuYXQoLTEpPy50b3x8J2FjdHVhbCcpKycucG5nJyk7c3RhdHVzLnRleHRDb250ZW50PWNvcHk/J1NlIGRlc2NhcmfDsyBlbCBQTkc7IGVzdGUgbmF2ZWdhZG9yIG5vIHBlcm1pdGnDsyBjb3BpYXJsby4nOidJbWFnZW4gZGVzY2FyZ2FkYS4nO31jYXRjaChlKXtzdGF0dXMudGV4dENvbnRlbnQ9J05vIHNlIHB1ZG8gZ2VuZXJhciBsYSBpbWFnZW46ICcrZS5tZXNzYWdlO319OwogJCgnI3ByaXplQ29weVYxNycpLm9uY2xpY2s9KCk9PnNoYXJlKHRydWUpOyQoJyNwcml6ZURvd25sb2FkVjE3Jykub25jbGljaz0oKT0+c2hhcmUoZmFsc2UpOwp9OwoNCg==