LyohIHJlc3BvbnNpdmVDYXJvdXNlbC5KUyAtIHYxLjIuMA0KICogaHR0cDovL2Jhc2lsaW8uZ2l0aHViLmNvbS9yZXNwb25zaXZlQ2Fyb3VzZWwNCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMTMgQmFzaWxpbyBDh2NlcmVzIDxiYXNpbGlvLmNhY2VyZXNAZ21haWwuY29tPjsNCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSAqLw0KDQooZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2UuZm4uY2Fyb3VzZWw9ZnVuY3Rpb24odCl7dmFyIG4scjtuPXtpbmZpbml0ZTp0cnVlLHZpc2libGU6MSxzcGVlZDoiZmFzdCIsb3ZlcmZsb3c6ZmFsc2UsYXV0b1JvdGF0ZTpmYWxzZSxuYXZpZ2F0aW9uOmUodGhpcykuZGF0YSgibmF2aWdhdGlvbiIpLGl0ZW1NaW5XaWR0aDowLGl0ZW1FcXVhbEhlaWdodDpmYWxzZSxpdGVtTWFyZ2luOjAsaXRlbUNsYXNzQWN0aXZlOiJjcnNsLWFjdGl2ZSIsaW1hZ2VXaWRlQ2xhc3M6IndpZGUtaW1hZ2UiLGNhcm91c2VsOnRydWV9O3JldHVybiBlKHRoaXMpLmVhY2goZnVuY3Rpb24oKXtyPWUodGhpcyk7aWYoZS5pc0VtcHR5T2JqZWN0KHQpPT09ZmFsc2UpZS5leHRlbmQobix0KTtpZihlLmlzRW1wdHlPYmplY3QoZShyKS5kYXRhKCJjcnNsIikpPT09ZmFsc2UpZS5leHRlbmQobixlKHIpLmRhdGEoImNyc2wiKSk7bi5pc1RvdWNoPSJvbnRvdWNoc3RhcnQiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkfEJsYWNrQmVycnl8aVBob25lfGlQYWR8aVBvZHxPcGVyYSBNaW5pfElFTW9iaWxlL2kpP3RydWU6ZmFsc2U7ci5pbml0PWZ1bmN0aW9uKCl7bi50b3RhbD1lKHIpLmZpbmQoIi5jcnNsLWl0ZW0iKS5sZW5ndGg7bi5pdGVtV2lkdGg9ZShyKS5vdXRlcldpZHRoKCk7bi52aXNpYmxlRGVmYXVsdD1uLnZpc2libGU7bi5zd2lwZURpc3RhbmNlPW51bGw7bi5zd2lwZU1pbkRpc3RhbmNlPTEwMDtuLnN0YXJ0Q29vcmRzPXt9O24uZW5kQ29vcmRzPXt9O2UocikuY3NzKHt3aWR0aDoiMTAwJSJ9KTtlKHIpLmZpbmQoIi5jcnNsLWl0ZW0iKS5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsImZsb2F0IjoibGVmdCIsb3ZlcmZsb3c6ImhpZGRlbiIsaGVpZ2h0OiJhdXRvIn0pO2UocikuZmluZCgiLiIrbi5pbWFnZVdpZGVDbGFzcykuZWFjaChmdW5jdGlvbigpe2UodGhpcykuY3NzKHtkaXNwbGF5OiJibG9jayIsd2lkdGg6IjEwMCUiLGhlaWdodDoiYXV0byJ9KX0pO2UocikuZmluZCgiLmNyc2wtaXRlbSBpZnJhbWUiKS5hdHRyKHt3aWR0aDoiMTAwJSJ9KTtpZihuLmNhcm91c2VsKWUocikuZmluZCgiLmNyc2wtaXRlbTpmaXJzdC1jaGlsZCIpLmFkZENsYXNzKG4uaXRlbUNsYXNzQWN0aXZlKTtpZihuLmNhcm91c2VsJiZuLmluZmluaXRlJiZuLnZpc2libGU8bi50b3RhbCllKHIpLmZpbmQoIi5jcnNsLWl0ZW06Zmlyc3QtY2hpbGQiKS5iZWZvcmUoZSgiLmNyc2wtaXRlbTpsYXN0LWNoaWxkIixyKSk7aWYobi5vdmVyZmxvdz09PWZhbHNlKXtlKHIpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KX1lbHNle2UoImh0bWwsIGJvZHkiKS5jc3MoeyJvdmVyZmxvdy14IjoiaGlkZGVuIn0pfWUocikudHJpZ2dlcigiaW5pdENhcm91c2VsIixbbixyXSk7ci50ZXN0UHJlbG9hZCgpO3IuY29uZmlnKCk7ci5pbml0Um90YXRlKCk7ci50cmlnZ2VyTmF2cygpfTtyLnRlc3RQcmVsb2FkPWZ1bmN0aW9uKCl7aWYoZShyKS5maW5kKCJpbWciKS5sZW5ndGg+MCl7dmFyIHQ9ZShyKS5maW5kKCJpbWciKS5sZW5ndGgsaT0xO2UocikuZmluZCgiaW1nIikuZWFjaChmdW5jdGlvbigpe3IucHJlbG9hZEltYWdlKHRoaXMsaSx0KTtpKyt9KX1lbHNle2UocikudHJpZ2dlcigibG9hZGVkQ2Fyb3VzZWwiLFtuLHJdKX19O3IucHJlbG9hZEltYWdlPWZ1bmN0aW9uKHQsaSxzKXt2YXIgbz1uZXcgSW1hZ2UsdT17fTt1LnNyYz1lKHQpLmF0dHIoInNyYyIpIT09dW5kZWZpbmVkP3Quc3JjOiIiO3UuYWx0PWUodCkuYXR0cigiYWx0IikhPT11bmRlZmluZWQ/dC5hbHQ6IiI7ZShvKS5hdHRyKHUpO2Uobykub24oImxvYWQiLGZ1bmN0aW9uKCl7aWYoaT09PTEpZShyKS50cmlnZ2VyKCJsb2FkaW5nSW1hZ2VzQ2Fyb3VzZWwiLFtuLHJdKTtpZihpPT09cyllKHIpLnRyaWdnZXIoImxvYWRlZEltYWdlc0Nhcm91c2VsIixbbixyXSl9KX07ci5jb25maWc9ZnVuY3Rpb24oKXtuLml0ZW1XaWR0aD1NYXRoLmZsb29yKChlKHIpLm91dGVyV2lkdGgoKS1uLml0ZW1NYXJnaW4qKG4udmlzaWJsZURlZmF1bHQtMSkpL24udmlzaWJsZURlZmF1bHQpO2lmKG4uaXRlbVdpZHRoPD1uLml0ZW1NaW5XaWR0aCl7bi52aXNpYmxlPU1hdGguZmxvb3IoKGUocikub3V0ZXJXaWR0aCgpLW4uaXRlbU1hcmdpbioobi52aXNpYmxlLTEpKS9uLml0ZW1NaW5XaWR0aCk9PT0xP01hdGguZmxvb3IoZShyKS5vdXRlcldpZHRoKCkvbi5pdGVtTWluV2lkdGgpOk1hdGguZmxvb3IoKGUocikub3V0ZXJXaWR0aCgpLW4uaXRlbU1hcmdpbikvbi5pdGVtTWluV2lkdGgpO24udmlzaWJsZT1uLnZpc2libGU8MT8xOm4udmlzaWJsZTtuLml0ZW1XaWR0aD1uLnZpc2libGU9PT0xP01hdGguZmxvb3IoZShyKS5vdXRlcldpZHRoKCkpOk1hdGguZmxvb3IoKGUocikub3V0ZXJXaWR0aCgpLW4uaXRlbU1hcmdpbioobi52aXNpYmxlLTEpKS9uLnZpc2libGUpfWVsc2V7bi52aXNpYmxlPW4udmlzaWJsZURlZmF1bHR9aWYobi5jYXJvdXNlbCl7ci53cmFwV2lkdGg9TWF0aC5mbG9vcigobi5pdGVtV2lkdGgrbi5pdGVtTWFyZ2luKSpuLnRvdGFsKTtyLndyYXBNYXJnaW49ci53cmFwTWFyZ2luRGVmYXVsdD1uLmluZmluaXRlJiZuLnZpc2libGU8bi50b3RhbD9wYXJzZUludCgobi5pdGVtV2lkdGgrbi5pdGVtTWFyZ2luKSotMSwxMCk6MDtpZihuLmluZmluaXRlJiZuLnZpc2libGU8bi50b3RhbCYmZShyKS5maW5kKCIuY3JzbC1pdGVtLiIrbi5pdGVtQ2xhc3NBY3RpdmUpLmluZGV4KCk9PT0wKXtlKHIpLmZpbmQoIi5jcnNsLWl0ZW06Zmlyc3QtY2hpbGQiKS5iZWZvcmUoZSgiLmNyc2wtaXRlbTpsYXN0LWNoaWxkIixyKSk7ci53cmFwTWFyZ2luPXIud3JhcE1hcmdpbkRlZmF1bHQ9cGFyc2VJbnQoKG4uaXRlbVdpZHRoK24uaXRlbU1hcmdpbikqLTEsMTApfWUocikuZmluZCgiLmNyc2wtd3JhcCIpLmNzcyh7d2lkdGg6ci53cmFwV2lkdGgrInB4IixtYXJnaW5MZWZ0OnIud3JhcE1hcmdpbn0pfWVsc2V7ci53cmFwV2lkdGg9ZShyKS5vdXRlcldpZHRoKCk7ZShyKS5maW5kKCIuY3JzbC13cmFwIikuY3NzKHt3aWR0aDpyLndyYXBXaWR0aCtuLml0ZW1NYXJnaW4rInB4In0pO2UoIiMiK24ubmF2aWdhdGlvbikuaGlkZSgpfWUocikuZmluZCgiLmNyc2wtaXRlbSIpLmNzcyh7d2lkdGg6bi5pdGVtV2lkdGgrInB4IixtYXJnaW5SaWdodDpuLml0ZW1NYXJnaW4rInB4In0pO3IuZXF1YWxIZWlnaHRzKCk7aWYobi5jYXJvdXNlbCl7aWYobi52aXNpYmxlPj1uLnRvdGFsKXtuLmF1dG9Sb3RhdGU9ZmFsc2U7ZSgiIyIrbi5uYXZpZ2F0aW9uKS5oaWRlKCl9ZWxzZXtlKCIjIituLm5hdmlnYXRpb24pLnNob3coKX19fTtyLmVxdWFsSGVpZ2h0cz1mdW5jdGlvbigpe2lmKG4uaXRlbUVxdWFsSGVpZ2h0IT09ZmFsc2Upe3ZhciB0PTA7ZShyKS5maW5kKCIuY3JzbC1pdGVtIikuZWFjaChmdW5jdGlvbigpe2UodGhpcykuY3NzKHtoZWlnaHQ6ImF1dG8ifSk7aWYoZSh0aGlzKS5vdXRlckhlaWdodCgpPnQpe3Q9ZSh0aGlzKS5vdXRlckhlaWdodCgpfX0pO2UocikuZmluZCgiLmNyc2wtaXRlbSIpLmNzcyh7aGVpZ2h0OnQrInB4In0pfXJldHVybiB0cnVlfTtyLmluaXRSb3RhdGU9ZnVuY3Rpb24oKXtpZihuLmF1dG9Sb3RhdGUhPT1mYWxzZSl7ci5yb3RhdGVUaW1lPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3Iucm90YXRlKCl9LG4uYXV0b1JvdGF0ZSl9fTtyLnRyaWdnZXJOYXZzPWZ1bmN0aW9uKCl7ZSgiIyIrbi5uYXZpZ2F0aW9uKS5kZWxlZ2F0ZSgiLnByZXZpb3VzLCAubmV4dCIsImNsaWNrIixmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCk7ci5wcmVwYXJlRXhlY3V0ZSgpO2lmKGUodGhpcykuaGFzQ2xhc3MoInByZXZpb3VzIikmJnIudGVzdFByZXZpb3VzKHIuaXRlbUFjdGl2ZSkpe3IucHJldmlvdXMoKX1lbHNlIGlmKGUodGhpcykuaGFzQ2xhc3MoIm5leHQiKSYmci50ZXN0TmV4dCgpKXtyLm5leHQoKX1lbHNle3JldHVybn19KX07ci5wcmVwYXJlRXhlY3V0ZT1mdW5jdGlvbigpe2lmKG4uYXV0b1JvdGF0ZSl7Y2xlYXJJbnRlcnZhbChyLnJvdGF0ZVRpbWUpfXIucHJldmVudEFuaW1hdGVFdmVudCgpO3IuaXRlbUFjdGl2ZT1lKHIpLmZpbmQoIi5jcnNsLWl0ZW0uIituLml0ZW1DbGFzc0FjdGl2ZSk7cmV0dXJuIHRydWV9O3IucHJldmVudEFuaW1hdGVFdmVudD1mdW5jdGlvbigpe2lmKGUocikuZmluZCgiLmNyc2wtd3JhcDphbmltYXRlZCIpLmxlbmd0aD4wKXtyZXR1cm4gZmFsc2V9fTtyLnJvdGF0ZT1mdW5jdGlvbigpe3IucHJldmVudEFuaW1hdGVFdmVudCgpO3IuaXRlbUFjdGl2ZT1lKHIpLmZpbmQoIi5jcnNsLWl0ZW0uIituLml0ZW1DbGFzc0FjdGl2ZSk7ci5uZXh0KCk7cmV0dXJuIHRydWV9O3IudGVzdFByZXZpb3VzPWZ1bmN0aW9uKHQpe3JldHVybiBlKCIuY3JzbC13cmFwIixyKS5maW5kKCIuY3JzbC1pdGVtIikuaW5kZXgodCk+MH07ci50ZXN0TmV4dD1mdW5jdGlvbigpe3JldHVybiFuLmluZmluaXRlJiZyLndyYXBXaWR0aD49KG4uaXRlbVdpZHRoK24uaXRlbU1hcmdpbikqKG4udmlzaWJsZSsxKS1yLndyYXBNYXJnaW58fG4uaW5maW5pdGV9O3IucHJldmlvdXM9ZnVuY3Rpb24oKXtyLndyYXBNYXJnaW49bi5pbmZpbml0ZT9yLndyYXBNYXJnaW5EZWZhdWx0K2Uoci5pdGVtQWN0aXZlKS5vdXRlcldpZHRoKHRydWUpOnIud3JhcE1hcmdpbitlKHIuaXRlbUFjdGl2ZSkub3V0ZXJXaWR0aCh0cnVlKTt2YXIgdD1lKHIuaXRlbUFjdGl2ZSkuaW5kZXgoKTt2YXIgaT1lKHIuaXRlbUFjdGl2ZSkucHJldigiLmNyc2wtaXRlbSIpO3ZhciBzPSJwcmV2aW91cyI7ZShyKS50cmlnZ2VyKCJiZWdpbkNhcm91c2VsIixbbixyLHNdKTtlKHIpLmZpbmQoIi5jcnNsLXdyYXAiKS5hbmltYXRlKHttYXJnaW5MZWZ0OnIud3JhcE1hcmdpbisicHgifSxuLnNwZWVkLGZ1bmN0aW9uKCl7ZShyLml0ZW1BY3RpdmUpLnJlbW92ZUNsYXNzKG4uaXRlbUNsYXNzQWN0aXZlKTtlKGkpLmFkZENsYXNzKG4uaXRlbUNsYXNzQWN0aXZlKTtpZihuLmluZmluaXRlKXtlKHRoaXMpLmNzcyh7bWFyZ2luTGVmdDpyLndyYXBNYXJnaW5EZWZhdWx0fSkuZmluZCgiLmNyc2wtaXRlbTpmaXJzdC1jaGlsZCIpLmJlZm9yZShlKCIuY3JzbC1pdGVtOmxhc3QtY2hpbGQiLHIpKX1lbHNle2lmKHIudGVzdFByZXZpb3VzKGkpPT09ZmFsc2UpZSgiIyIrbi5uYXZpZ2F0aW9uKS5maW5kKCIucHJldmlvdXMiKS5hZGRDbGFzcygicHJldmlvdXMtaW5hY3RpdmUiKTtpZihyLnRlc3ROZXh0KCkpZSgiIyIrbi5uYXZpZ2F0aW9uKS5maW5kKCIubmV4dCIpLnJlbW92ZUNsYXNzKCJuZXh0LWluYWN0aXZlIil9ZSh0aGlzKS50cmlnZ2VyKCJlbmRDYXJvdXNlbCIsW24scixzXSl9KX07ci5uZXh0PWZ1bmN0aW9uKCl7ci53cmFwTWFyZ2luPW4uaW5maW5pdGU/ci53cmFwTWFyZ2luRGVmYXVsdC1lKHIuaXRlbUFjdGl2ZSkub3V0ZXJXaWR0aCh0cnVlKTpyLndyYXBNYXJnaW4tZShyLml0ZW1BY3RpdmUpLm91dGVyV2lkdGgodHJ1ZSk7dmFyIHQ9ZShyLml0ZW1BY3RpdmUpLmluZGV4KCk7dmFyIGk9ZShyLml0ZW1BY3RpdmUpLm5leHQoIi5jcnNsLWl0ZW0iKTt2YXIgcz0ibmV4dCI7ZShyKS50cmlnZ2VyKCJiZWdpbkNhcm91c2VsIixbbixyLHNdKTtlKHIpLmZpbmQoIi5jcnNsLXdyYXAiKS5hbmltYXRlKHttYXJnaW5MZWZ0OnIud3JhcE1hcmdpbisicHgifSxuLnNwZWVkLGZ1bmN0aW9uKCl7ZShyLml0ZW1BY3RpdmUpLnJlbW92ZUNsYXNzKG4uaXRlbUNsYXNzQWN0aXZlKTtlKGkpLmFkZENsYXNzKG4uaXRlbUNsYXNzQWN0aXZlKTtpZihuLmluZmluaXRlKXtlKHRoaXMpLmNzcyh7bWFyZ2luTGVmdDpyLndyYXBNYXJnaW5EZWZhdWx0fSkuZmluZCgiLmNyc2wtaXRlbTpsYXN0LWNoaWxkIikuYWZ0ZXIoZSgiLmNyc2wtaXRlbTpmaXJzdC1jaGlsZCIscikpfWVsc2V7aWYoci50ZXN0UHJldmlvdXMoaSkpZSgiIyIrbi5uYXZpZ2F0aW9uKS5maW5kKCIucHJldmlvdXMiKS5yZW1vdmVDbGFzcygicHJldmlvdXMtaW5hY3RpdmUiKTtpZihyLnRlc3ROZXh0KCk9PT1mYWxzZSllKCIjIituLm5hdmlnYXRpb24pLmZpbmQoIi5uZXh0IikuYWRkQ2xhc3MoIm5leHQtaW5hY3RpdmUiKX1lKHRoaXMpLnRyaWdnZXIoImVuZENhcm91c2VsIixbbixyLHNdKX0pfTt2YXIgaT1mYWxzZSxzO2Uod2luZG93KS5vbigibW91c2VsZWF2ZSIsZnVuY3Rpb24odCl7aWYodC50YXJnZXQpcz10LnRhcmdldDtlbHNlIGlmKHQuc3JjRWxlbWVudClzPXQuc3JjRWxlbWVudDtpZihlKHIpLmF0dHIoImlkIikmJmUocykucGFyZW50cygiLmNyc2wtaXRlbXMiKS5hdHRyKCJpZCIpPT09ZShyKS5hdHRyKCJpZCIpfHxlKHMpLnBhcmVudHMoIi5jcnNsLWl0ZW1zIikuZGF0YSgibmF2aWdhdGlvbiIpPT09ZShyKS5kYXRhKCJuYXZpZ2F0aW9uIikpe2k9dHJ1ZX1lbHNle2k9ZmFsc2V9cmV0dXJuIGZhbHNlfSk7ZSh3aW5kb3cpLm9uKCJrZXlkb3duIixmdW5jdGlvbihlKXtpZihpPT09dHJ1ZSl7aWYoZS5rZXlDb2RlPT09Mzcpe3IucHJlcGFyZUV4ZWN1dGUoKTtyLnByZXZpb3VzKCl9ZWxzZSBpZihlLmtleUNvZGU9PT0zOSl7ci5wcmVwYXJlRXhlY3V0ZSgpO3IubmV4dCgpfX1yZXR1cm59KTtpZihuLmlzVG91Y2gpe2Uocikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKHQpe2UocikuYWRkQ2xhc3MoInRvdWNoaW5nIik7bi5zdGFydENvb3Jkcz10Lm9yaWdpbmFsRXZlbnQudGFyZ2V0VG91Y2hlc1swXTtuLmVuZENvb3Jkcz10Lm9yaWdpbmFsRXZlbnQudGFyZ2V0VG91Y2hlc1swXTtlKCIudG91Y2hpbmciKS5vbigidG91Y2htb3ZlIixmdW5jdGlvbihlKXtuLmVuZENvb3Jkcz1lLm9yaWdpbmFsRXZlbnQudGFyZ2V0VG91Y2hlc1swXTtpZihNYXRoLmFicyhwYXJzZUludChuLmVuZENvb3Jkcy5wYWdlWC1uLnN0YXJ0Q29vcmRzLnBhZ2VYLDEwKSk+TWF0aC5hYnMocGFyc2VJbnQobi5lbmRDb29yZHMucGFnZVktbi5zdGFydENvb3Jkcy5wYWdlWSwxMCkpKXtlLnByZXZlbnREZWZhdWx0KCk7ZS5zdG9wUHJvcGFnYXRpb24oKX19KX0pLm9uKCJ0b3VjaGVuZCIsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpO3Quc3RvcFByb3BhZ2F0aW9uKCk7bi5zd2lwZURpc3RhbmNlPW4uZW5kQ29vcmRzLnBhZ2VYLW4uc3RhcnRDb29yZHMucGFnZVg7aWYobi5zd2lwZURpc3RhbmNlPj1uLnN3aXBlTWluRGlzdGFuY2Upe3IucHJldmlvdXMoKX1lbHNlIGlmKG4uc3dpcGVEaXN0YW5jZTw9LW4uc3dpcGVNaW5EaXN0YW5jZSl7ci5uZXh0KCl9ZSgiLnRvdWNoaW5nIikub2ZmKCJ0b3VjaG1vdmUiKS5yZW1vdmVDbGFzcygidG91Y2hpbmciKX0pfWUocikub24oImxvYWRlZENhcm91c2VsIGxvYWRlZEltYWdlc0Nhcm91c2VsIixmdW5jdGlvbigpe3IuZXF1YWxIZWlnaHRzKCl9KTtlKHdpbmRvdykub24oImNhcm91c2VsUmVzaXplRW5kIixmdW5jdGlvbigpe2lmKG4uaXRlbVdpZHRoIT09ZShyKS5vdXRlcldpZHRoKCkpci5jb25maWcoKX0pO2Uod2luZG93KS5yZWFkeShmdW5jdGlvbigpe2UocikudHJpZ2dlcigicHJlcGFyZUNhcm91c2VsIixbbixyXSk7ci5pbml0KCk7ZSh3aW5kb3cpLm9uKCJyZXNpemUiLGZ1bmN0aW9uKCl7aWYodGhpcy5jYXJvdXNlbFJlc2l6ZVRvKWNsZWFyVGltZW91dCh0aGlzLmNhcm91c2VsUmVzaXplVG8pO3RoaXMuY2Fyb3VzZWxSZXNpemVUbz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSh0aGlzKS50cmlnZ2VyKCJjYXJvdXNlbFJlc2l6ZUVuZCIpfSwxMCl9KX0pO2Uod2luZG93KS5sb2FkKGZ1bmN0aW9uKCl7ci50ZXN0UHJlbG9hZCgpO3IuY29uZmlnKCl9KX0pfX0pKGpRdWVyeSk=