Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:二级页面详情¥page_detail¥看漫@@eyJkYXRhIjoie1wiYXNzb2NpYXRlZE1vZGVsc01hcEZvckpvaW5UYWJsZVwiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhGS1wiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhvdXRGS1wiOnt9LFwiZmllbGRzVG9TZXRUb0RlZmF1bHRcIjpbXSxcImlkXCI6MCxcImxhc3RfY2hhcHRlcl9ydWxlXCI6XCJcIixcImxpc3RUb0NsZWFyQXNzb2NpYXRlZEZLXCI6W10sXCJsaXN0VG9DbGVhclNlbGZGS1wiOltdLFwicGFnZUxpc3RcIjpbe1wiY29sX3R5cGVcIjpcInRleHRfMVwiLFwibmFtZVwiOlwiQ2xhc3NUYWJcIixcInBhdGhcIjpcIkNsYXNzVGFiXCIsXCJydWxlXCI6XCJ2YXIge1xcbiAgICBRSU5HX1RJVExFLCB0aXRsZSwgdXJsLFxcbiAgICBjbGFzc19uYW1lLCBjbGFzc191cmwsXFxuICAgIGFyZWFfbmFtZSwgYXJlYV91cmwsXFxuICAgIHllYXJfbmFtZSwgeWVhcl91cmwsXFxuICAgIHNvcnRfbmFtZSwgc29ydF91cmxcXG59ID0gJC5pbXBvcnRQYXJhbVxcbmNvbnN0IENsYXNzVGFiID0gZnVuY3Rpb24oY2xhc3NBcnJheSwgcGFyYW1zKSB7XFxuICAgIE9iamVjdC5hc3NpZ24odGhpcywgcGFyYW1zKVxcbiAgICB0aGlzLmFyciA9IGNsYXNzQXJyYXkubWFwKHYgPT4gdGhpcy5pbml0KHYpKVxcbiAgICB0aGlzLnNpZ24gPSAnJCcgKyBRSU5HX1RJVExFICsgJ18nICsgKHRoaXMubmFtZSB8fCAnJykgKyAnXydcXG4gICAgdGhpcy5jb2xvciA9IHRoaXMuY29sb3IgfHwgJyMxMmI2NjgnXFxuICAgIHRoaXMuYm91bmRhcnkgPSB0aGlzLmJvdW5kYXJ5IHx8ICdibGFua19ibG9jaydcXG59XFxuQ2xhc3NUYWIucHJvdG90eXBlID0ge1xcbiAgICBjb25zdHJ1Y3RvcjogQ2xhc3NUYWIsXFxuICAgIGxvYWQoZWwpIHtcXG4gICAgICAgIGxldCBmb2xkZWQgPSB0aGlzLmZvbGQgJiYgZ2V0VmFyKCckZm9sZF8nICsgdGhpcy5zaWduLCAnJylcXG4gICAgICAgIGlmICh0aGlzLmFyci5sZW5ndGggPiAxICYmIHRoaXMuZm9sZCkgZWwucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgKGZvbGRlZCA/ICfilrYnIDogJ+KWvCcpLmZvbnRjb2xvcignIzA0OWVmZicpLFxcbiAgICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoc2lnbiwgZm9sZGVkKSA9PiB7XFxuICAgICAgICAgICAgICAgIHB1dFZhcignJGZvbGRfJyArIHNpZ24sIGZvbGRlZCA/ICcnIDogJ1QnKVxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXG4gICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICAgICAgICAgIH0sIHRoaXMuc2lnbiwgZm9sZGVkKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxuICAgICAgICB9KVxcbiAgICAgICAgbGV0IGFyciA9IGZvbGRlZCA/IFt0aGlzLmFyclswXV0gOiB0aGlzLmFyclxcbiAgICAgICAgYXJyLmZvckVhY2goKHYpID0+IHtcXG4gICAgICAgICAgICBsZXQgeyBpZCwgY2xhc3NfbmFtZSwgY2xhc3NfdXJsIH0gPSB2LFxcbiAgICAgICAgICAgIHNlbGVjdGVkID0gSlNPTi5zdHJpbmdpZnkodGhpcy5nZXRDbGFzcyhpZCkpXFxuICAgICAgICAgICAgY2xhc3NfbmFtZS5mb3JFYWNoKChuYW1lLCBpKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCB1cmwgPSBjbGFzc191cmxbaV0sXFxuICAgICAgICAgICAgICAgICAgICBub3cgPSBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IG5hbWUsIHVybDogdXJsIH0pXFxuICAgICAgICAgICAgICAgIGVsLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHNlbGVjdGVkID09IG5vdyA/ICfigJzigJzigJ3igJ0nICsgbmFtZS5mb250Y29sb3IodGhpcy5jb2xvcikuYm9sZCgpIDogbmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogc2VsZWN0ZWQgPT0gbm93ID8gJ2hpa2VyOi8vZW1wdHknIDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoc2lnbiwgaWQsIG5vdykgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1dFZhcihzaWduICsgaWQsIG5vdylcXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnNpZ24sIGlkLCBub3cpLFxcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJ1xcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgZWwucHVzaCh7IGNvbF90eXBlOiB0aGlzLmJvdW5kYXJ5IH0pXFxuICAgICAgICB9KVxcbiAgICB9LFxcbiAgICBpbml0KGNsYXNzT2JqZWN0KSB7XFxuICAgICAgICBpZiAodHlwZW9mIGNsYXNzT2JqZWN0LmNsYXNzX25hbWUgPT0gJ3N0cmluZycpXFxuICAgICAgICAgICAgY2xhc3NPYmplY3QuY2xhc3NfbmFtZSA9IGNsYXNzT2JqZWN0LmNsYXNzX25hbWUuc3BsaXQoJyYnKVxcbiAgICAgICAgaWYgKHR5cGVvZiBjbGFzc09iamVjdC5jbGFzc191cmwgPT0gJ3N0cmluZycpXFxuICAgICAgICAgICAgY2xhc3NPYmplY3QuY2xhc3NfdXJsID0gY2xhc3NPYmplY3QuY2xhc3NfdXJsLnNwbGl0KCcmJykubWFwKCh2KSA9PiB2LnRyaW0oKSlcXG4gICAgICAgIHJldHVybiBjbGFzc09iamVjdFxcbiAgICB9LFxcbiAgICBwdXNoKGNsYXNzT2JqZWN0KSB7XFxuICAgICAgICB0aGlzLmFyci5wdXNoKHRoaXMuaW5pdChjbGFzc09iamVjdCkpXFxuICAgIH0sXFxuICAgIGdldENsYXNzKGlkKSB7XFxuICAgICAgICBsZXQgZGVmYXVsdENsYXNzID0gdGhpcy5hcnIuZmluZChpdGVtID0+IGl0ZW0uaWQgPT0gaWQpXFxuICAgICAgICBkZWZhdWx0Q2xhc3MgPSBKU09OLnN0cmluZ2lmeShkZWZhdWx0Q2xhc3MgPyB7XFxuICAgICAgICAgICAgbmFtZTogZGVmYXVsdENsYXNzLmNsYXNzX25hbWVbMF0sXFxuICAgICAgICAgICAgdXJsOiBkZWZhdWx0Q2xhc3MuY2xhc3NfdXJsWzBdXFxuICAgICAgICB9IDogeyBuYW1lOiAgJ2Nhbm5vdCBmaW5kIGlkOiAnICsgaWQgKyAnIGluIGNsYXNzVGFiOiAnICsgdGhpcy5zaWduLCB1cmw6ICcnfSlcXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGdldFZhcih0aGlzLnNpZ24gKyBpZCwgZGVmYXVsdENsYXNzKSlcXG4gICAgfSxcXG4gICAgc2V0VXJsKHVybCkge1xcbiAgICAgICAgcmV0dXJuIHVybC5yZXBsYWNlKC9cXFxcJFxcXFx7KFtefV0qKVxcXFx9L2csIChfLCBpZCkgPT4gdGhpcy5nZXRDbGFzcyhpZCkudXJsKVxcbiAgICB9XFxufVxcbi8vIOeUn+aIkOWktOmDqOWIhuexu1xcbmxldCBmeUFsbCA9IHVybC5pbmNsdWRlcygnZnlBbGwnKSxcXG4gICAgdGFiSGVhZGVyID0gW11cXG5pZiAoY2xhc3NfbmFtZSkgdGFiSGVhZGVyLnB1c2goe1xcbiAgICBpZDogZnlBbGwgPyAnZnlBbGwnIDogJ2Z5Y2xhc3MnLFxcbiAgICBjbGFzc19uYW1lOiBjbGFzc19uYW1lLFxcbiAgICBjbGFzc191cmw6IGNsYXNzX3VybFxcbn0pXFxuaWYgKGFyZWFfbmFtZSkgdGFiSGVhZGVyLnB1c2goe1xcbiAgICBpZDogZnlBbGwgPyAnZnlBbGwnIDogJ2Z5YXJlYScsXFxuICAgIGNsYXNzX25hbWU6IGFyZWFfbmFtZSxcXG4gICAgY2xhc3NfdXJsOiBhcmVhX3VybFxcbn0pXFxuaWYgKHllYXJfbmFtZSkgdGFiSGVhZGVyLnB1c2goe1xcbiAgICBpZDogZnlBbGwgPyAnZnlBbGwnIDogJ2Z5eWVhcicsXFxuICAgIGNsYXNzX25hbWU6IHllYXJfbmFtZSxcXG4gICAgY2xhc3NfdXJsOiB5ZWFyX3VybFxcbn0pXFxuaWYgKHNvcnRfbmFtZSkgdGFiSGVhZGVyLnB1c2goe1xcbiAgICBpZDogZnlBbGwgPyAnZnlBbGwnIDogJ2Z5c29ydCcsXFxuICAgIGNsYXNzX25hbWU6IHNvcnRfbmFtZSxcXG4gICAgY2xhc3NfdXJsOiBzb3J0X3VybFxcbn0pXFxuJC5leHBvcnRzID0ge1xcbiAgICBmeUFsbDogZnlBbGwsXFxuICAgIHRhYkhlYWRlcjogbmV3IENsYXNzVGFiKHRhYkhlYWRlciwgeyBuYW1lOiB0aXRsZSwgZm9sZDogcmVhZEZpbGUoJ3RhYkZvbGQnKSwgfSlcXG59XFxuXCJ9LHtcImNvbF90eXBlXCI6XCJpY29uXzJfcm91bmRcIixcIm5hbWVcIjpcIuiuvue9rlwiLFwicGF0aFwiOlwiQ29uZmlnXCIsXCJydWxlXCI6XCJqczpcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICdjbGVhck15VmFyKFxcXCJzb3J0RmxhZ1xcXCIpO3JlZnJlc2hQYWdlKCknKVxcbnNldFBhZ2VUaXRsZSgn4pqZIOi9u+WQiOmbhuiuvue9riDimpknKVxcbmNvbnN0IFFJTkdfVElUTEUgPSBnZXRNeVZhcignbXlDb2xsZWN0aW9uJyksXFxuICAgIHVybCA9IGdldE15VmFyKCdyZW1vdGVVcmwnKVxcbmxldCBkYXRhID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZGF0YUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRSwgdHJ1ZSksXFxuICAgIGVsID0gW3tcXG4gICAgICAgIHRpdGxlOiAnPGI+IOa4hemZpOe8k+WtmO+8jOeri+WNs+abtOaWsCA8c21hbGw+IO+8iOWfuuS6jui/nOeoi+S7k+W6k++8jOayoeS6i+WIq+eCue+8iScsXFxuICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHVybCkgPT4ge1xcbiAgICAgICAgICAgIGlmKGZpbGVFeGlzdCh1cmwpKXtcXG4gICAgICAgICAgICAgICAgZGVsZXRlRmlsZSh1cmwpXFxuICAgICAgICAgICAgcmVxdWlyZURvd25sb2FkKCdodHRwczovL2FnaXQuYWkvRHJlYW1Pdk8vSnVNYW4vcmF3L2JyYW5jaC9tYXN0ZXIvSk0nLCB1cmwpXFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmVxdWlyZURvd25sb2FkKCdodHRwczovL2FnaXQuYWkvRHJlYW1Pdk8vSnVNYW4vcmF3L2JyYW5jaC9tYXN0ZXIvSk0nLCB1cmwpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpXFxuICAgICAgICAgICAgYmFjayhmYWxzZSlcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5bey5pu05pawJ1xcbiAgICAgICAgfSwgdXJsKSxcXG4gICAgICAgIGltZzogJ2hpa2VyOi8vaW1hZ2VzL2ljb240JyxcXG4gICAgICAgIGNvbF90eXBlOiAnYXZhdGFyJ1xcbiAgICB9XSxcXG4gICAgdXBkYXRlSW50ZXJ2YWwgPSByZWFkRmlsZSgndXBkYXRlSW50ZXJ2YWwnKSB8fCAnMScsXFxuICAgIG5ld1dpbmRvdyA9IHJlYWRGaWxlKCduZXdXaW5kb3cnKSxcXG4gICAgdGFiRm9sZCA9IHJlYWRGaWxlKCd0YWJGb2xkJyksXFxuICAgIGRpc2FibGVDdXN0b20gPSByZWFkRmlsZSgnZGlzYWJsZUN1c3RvbScpLFxcbiAgICBlZGl0TW9kZSA9IGRpc2FibGVDdXN0b20gPyAn5a+85YWl5rW36ZiUJyA6IGdldE15VmFyKCdlZGl0TW9kZScsICflkK/nlKgv56aB55SoJylcXG5cXG5lbC5wdXNoKHtcXG4gICAgdGl0bGU6ICcgIPCfkqEg5pu05paw6aKR546HOiAnICsgKHVwZGF0ZUludGVydmFsID09IDAgPyAn5omL5YqoJyA6IHVwZGF0ZUludGVydmFsICsgJ+WkqScpICsgJyAgJyxcXG4gICAgdXJsOiAkKHVwZGF0ZUludGVydmFsLCAn6L6T5YWl5pu05paw6Ze06ZqU77yI5aSp77yJ77yM5Li6MOWImeaJi+WKqOabtOaWsFxcXFxu5pys5Zyw5paH5Lu26ZO+5o6l5peg5pWIJykuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgaW5wdXQgPSBwYXJzZUludChpbnB1dClcXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4oaW5wdXQpKSBpbnB1dCA9IDFcXG4gICAgICAgIGVsc2UgaWYgKGlucHV0IDwgMSkgaW5wdXQgPSAwXFxuICAgICAgICBzYXZlRmlsZSgndXBkYXRlSW50ZXJ2YWwnLCBpbnB1dC50b1N0cmluZygpKVxcbiAgICAgICAgcmVmcmVzaFBhZ2UoKVxcbiAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJ1xcbn0sIHtcXG4gICAgdGl0bGU6ICcgIPCflqUg54us56uL6aaW6aG1OiAnICsgKG5ld1dpbmRvdyA/ICfmmK8nIDogJ+WQpicpICsgJyAgJyxcXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChuZXdXaW5kb3cpID0+IHtcXG4gICAgICAgIHNhdmVGaWxlKCduZXdXaW5kb3cnLCBuZXdXaW5kb3cgPyAnJyA6ICdUJylcXG4gICAgICAgIHJlZnJlc2hQYWdlKClcXG4gICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgfSwgbmV3V2luZG93KSxcXG4gICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJ1xcbn0sIHtcXG4gICAgdGl0bGU6ICcgIPCfkqAg5YiG57G75oqY5Y+gOiAnICsgKHRhYkZvbGQgPyAn5pivJyA6ICflkKYnKSArICcgICcsXFxuICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgodGFiRm9sZCkgPT4ge1xcbiAgICAgICAgc2F2ZUZpbGUoJ3RhYkZvbGQnLCB0YWJGb2xkID8gJycgOiAnVCcpXFxuICAgICAgICByZWZyZXNoUGFnZSgpXFxuICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgIH0sIHRhYkZvbGQpLFxcbiAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxufSwge1xcbiAgICB0aXRsZTogJyAg8J+SvCDlpIfku73mgaLlpI0gICcsXFxuICAgIHVybDogJChbJ+Wkh+S7vScsICfmgaLlpI0nXSwgMSkuc2VsZWN0KChRSU5HX1RJVExFLCB1cGRhdGVJbnRlcnZhbCwgbmV3V2luZG93LCB0YWJGb2xkLCBkaXNhYmxlQ3VzdG9tKSA9PiB7XFxuICAgICAgICBsZXQgdXJsID0gZ2V0TXlWYXIoJ3JlbW90ZVVybCcpXFxuICAgICAgICBpZiAoIXVybC5zdGFydHNXaXRoKCdoaWtlcjovLycpICYmICF1cmwuc3RhcnRzV2l0aCgnZmlsZTovLycpKVxcbiAgICAgICAgICAgIHVybCA9ICdoaWtlcjovL2ZpbGVzL2xpYnMvJyArIG1kNSh1cmwpICsgJy5qcydcXG4gICAgICAgIGVsc2UgaWYgKHVybC5zdGFydHNXaXRoKCdoaWtlcjovL3BhZ2UvJykpIHVybCA9ICdoaWtlcjovL2VtcHR5J1xcbiAgICAgICAgaWYgKGlucHV0ID09ICflpIfku70nKSByZXR1cm4gJCgnaGlrZXI6Ly9maWxlcy90bXAvJyArIFFJTkdfVElUTEUgKyAnX2JhY2t1cC5qc29uJywgJ+i+k+WFpeWkh+S7vei3r+W+hCcpXFxuICAgICAgICAgICAgLmlucHV0KCh1cmwsIHVwZGF0ZUludGVydmFsLCBuZXdXaW5kb3csIHRhYkZvbGQsIGRpc2FibGVDdXN0b20pID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gcmVxdWVzdCh1cmwpLFxcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRGF0YSA9IHJlYWRGaWxlKCdjdXN0b21EYXRhJylcXG4gICAgICAgICAgICAgICAgd3JpdGVGaWxlKGlucHV0LCBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJbnRlcnZhbDogdXBkYXRlSW50ZXJ2YWwsXFxuICAgICAgICAgICAgICAgICAgICBuZXdXaW5kb3c6IG5ld1dpbmRvdyxcXG4gICAgICAgICAgICAgICAgICAgIHRhYkZvbGQ6IHRhYkZvbGQsXFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlQ3VzdG9tOiBkaXNhYmxlQ3VzdG9tLFxcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRGF0YTogY3VzdG9tRGF0YSxcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVzOiBydWxlc1xcbiAgICAgICAgICAgICAgICB9KSlcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+W3suWkh+S7ve+8jOazqOaEj+iLpeS7k+W6k+S4uuWtkOmhtemdouWImeS4jeWkh+S7vSdcXG4gICAgICAgICAgICB9LCB1cmwsIHVwZGF0ZUludGVydmFsLCBuZXdXaW5kb3csIHRhYkZvbGQsIGRpc2FibGVDdXN0b20pXFxuICAgICAgICBlbHNlIHJldHVybiAkKCdoaWtlcjovL2ZpbGVzL3RtcC8nICsgUUlOR19USVRMRSArICdfYmFja3VwLmpzb24nLCAn6L6T5YWl5aSH5Lu96Lev5b6EJykuaW5wdXQoKHVybCkgPT4ge1xcbiAgICAgICAgICAgIGxldCB7IHVwZGF0ZUludGVydmFsLCBuZXdXaW5kb3csIHRhYkZvbGQsIGRpc2FibGVDdXN0b20sIGN1c3RvbURhdGEsIHJ1bGVzIH0gPSBKU09OLnBhcnNlKHJlcXVlc3QoaW5wdXQpKVxcbiAgICAgICAgICAgIHNhdmVGaWxlKCd1cGRhdGVJbnRlcnZhbCcsIHVwZGF0ZUludGVydmFsKVxcbiAgICAgICAgICAgIHNhdmVGaWxlKCduZXdXaW5kb3cnLCBuZXdXaW5kb3cpXFxuICAgICAgICAgICAgc2F2ZUZpbGUoJ3RhYkZvbGQnLCB0YWJGb2xkKVxcbiAgICAgICAgICAgIHNhdmVGaWxlKCdkaXNhYmxlQ3VzdG9tJywgZGlzYWJsZUN1c3RvbSlcXG4gICAgICAgICAgICBzYXZlRmlsZSgnY3VzdG9tRGF0YScsIGN1c3RvbURhdGEpXFxuICAgICAgICAgICAgaWYgKHJ1bGVzKSB3cml0ZUZpbGUodXJsLCBydWxlcylcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+W3suaBouWkje+8jOWmguaenOS4jeaDs+WQjOatpei/nOeoi+S7k+W6k++8jOWPr+S7peiuvue9ruabtOaWsOmikeeOh+S4uuaJi+WKqCdcXG4gICAgICAgIH0sIHVybClcXG4gICAgfSwgUUlOR19USVRMRSwgdXBkYXRlSW50ZXJ2YWwsIG5ld1dpbmRvdywgdGFiRm9sZCwgZGlzYWJsZUN1c3RvbSksXFxuICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXG59LCB7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGZvbnQgY29sb3I9XFxcIiM2NjY2NjZcXFwiPjxzbWFsbD7nibnliKvpuKPosKLvvIzlsI/nqIvluo/mj5DkvpvogIXvvJpcXFxcbicgK1xcbiAgICAgICAgZGF0YS5yZWR1Y2UoKHNlbGYsIHYpID0+IHYuYXV0aG9yID8gc2VsZi5jb25jYXQodi5hdXRob3Iuc3BsaXQoJyYnKSkgOiBzZWxmLCBbXSlcXG4gICAgICAgIC5maWx0ZXIoKHYsIGksIGFycikgPT4gdiAmJiBhcnIuaW5kZXhPZih2KSA9PSBpKS5qb2luKCfjgIEnKSxcXG4gICAgdXJsOiAnaGlrZXI6Ly9lbXB0eScsXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG59KVxcblxcbmVsLnB1c2goeyBjb2xfdHlwZTogJ2xpbmUnIH0sIHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgJ/Cfk50nLnNtYWxsKCkgKyAnJm5ic3Ag6L275ZCI6ZuG6Ieq5a6a5LmJICZuYnNwJy5ib2xkKCkuZm9udGNvbG9yKCcjNzU3NTc1JykgKyAoZGlzYWJsZUN1c3RvbSA/ICfinYwnIDogJ+KtlScpLnNtYWxsKCksXFxuICAgIHVybDogJChbKGRpc2FibGVDdXN0b20gPyAn5ZCv55SoJyA6ICfnpoHnlKgnKSArICflkIjpm4boh6rlrprkuYknLCAn5riF6Zmk6Ieq5a6a5LmJ5pWw5o2uJ10sIDEpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICBpZiAoaW5wdXQgPT0gJ+a4hemZpOiHquWumuS5ieaVsOaNricpIHtcXG4gICAgICAgICAgICBkZWxldGVGaWxlKCdjdXN0b21EYXRhJylcXG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT0gJ+WQr+eUqOWQiOmbhuiHquWumuS5iScpIHtcXG4gICAgICAgICAgICBzYXZlRmlsZSgnZGlzYWJsZUN1c3RvbScsICcnKVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBzYXZlRmlsZSgnZGlzYWJsZUN1c3RvbScsICdUJylcXG4gICAgICAgICAgICBpbnB1dCArPSAnXFxcXG7lsI/nqIvluo/lkK/nlKgv56aB55So44CB6YeN5paw5o6S5bqP562J5pON5L2c5Z2H5LiN5Lya5L2T546w5Zyo6aaW6aG15bCP56iL5bqP5YiX6KGo5LitJ1xcbiAgICAgICAgfVxcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5beyJyArIGlucHV0XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcbiAgICBleHRyYTogeyBsaW5lVmlzaWJsZTogZmFsc2UgfVxcbn0pO1xcbihkaXNhYmxlQ3VzdG9tID8gWyflr7zlhaXmtbfpmJQnXSA6IFsn5ZCv55SoL+emgeeUqCcsICfph43mlrDmjpLluo8nLCAn5pu05pS55Zu+5qCHJywgJ+WvvOWFpea1t+mYlCddKS5mb3JFYWNoKCh2KSA9PiB7XFxuICAgIGVsLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IHYgPT0gZWRpdE1vZGUgPyAn4oCc4oCc4oCd4oCdJyArIHYuYm9sZCgpLmZvbnRjb2xvcignIzEyYjY2OCcpIDogdixcXG4gICAgICAgIHVybDogdiA9PSBlZGl0TW9kZSA/ICdoaWtlcjovL2VtcHR5JyA6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHYpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcignZWRpdE1vZGUnLCB2KVxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcbiAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgICAgIH0sIHYpLFxcbiAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJ1xcbiAgICB9KVxcbn0pO1xcbmlmIChlZGl0TW9kZSA9PSAn5a+85YWl5rW36ZiUJykgZWwucHVzaCh7XFxuICAgIHRpdGxlOiAn5YWo6YOo5a+85YWlJyxcXG4gICAgdXJsOiAn5rW36ZiU6KeG55WM77+laG9tZV9ydWxlX3VybO+/pScgKyAodXJsLnN0YXJ0c1dpdGgoJ2hpa2VyOi8vJykgfHwgdXJsLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKSA/IHVybCA6ICdoaWtlcjovL2ZpbGVzL2xpYnMvJyArIG1kNSh1cmwpICsgJy5qcycpLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcbiAgICBleHRyYTogeyBsaW5lVmlzaWJsZTogZmFsc2UgfVxcbn0pO1xcbihkaXNhYmxlQ3VzdG9tID8gZGF0YSA6IEpTT04ucGFyc2UocmVhZEZpbGUoJ2N1c3RvbURhdGEnKSB8fCAnW10nKSkuZm9yRWFjaCgodiwgaSkgPT4ge1xcbiAgICBsZXQgZCA9IHsgdGl0bGU6IHYudGl0bGUsIGltZzogZGF0YVtpXS5pY29uIH1cXG4gICAgc3dpdGNoIChlZGl0TW9kZSkge1xcbiAgICAgICAgY2FzZSAn5ZCv55SoL+emgeeUqCc6XFxuICAgICAgICAgICAgZC50aXRsZSA9ICh2LnZpc2libGUgPyAn8J+foiAgJyA6ICfwn5S0ICAnKSArIGQudGl0bGVcXG4gICAgICAgICAgICBkLnVybCA9ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGkpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gSlNPTi5wYXJzZShyZWFkRmlsZSgnY3VzdG9tRGF0YScpIHx8ICdbXScpXFxuICAgICAgICAgICAgICAgIHJ1bGVzW2ldLnZpc2libGUgPSAhcnVsZXNbaV0udmlzaWJsZVxcbiAgICAgICAgICAgICAgICBzYXZlRmlsZSgnY3VzdG9tRGF0YScsIEpTT04uc3RyaW5naWZ5KHJ1bGVzKSlcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxuICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgICAgICAgICB9LCBpKVxcbiAgICAgICAgICAgIGJyZWFrXFxuICAgICAgICBjYXNlICfph43mlrDmjpLluo8nOlxcbiAgICAgICAgICAgIGxldCBzb3J0RmxhZyA9IHBhcnNlSW50KGdldE15VmFyKCdzb3J0RmxhZycsICctMScpKVxcbiAgICAgICAgICAgIGQudGl0bGUgPSAoc29ydEZsYWcgPT0gaSA/ICfwn5SDICAnIDogJycpICsgZC50aXRsZVxcbiAgICAgICAgICAgIGlmIChzb3J0RmxhZyA9PSAtMSlcXG4gICAgICAgICAgICAgICAgZC51cmwgPSAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChpKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcignc29ydEZsYWcnLCBpLnRvU3RyaW5nKCkpXFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/pgInmi6nopoHnp7vliqjliLDnmoTkvY3nva4nXFxuICAgICAgICAgICAgICAgIH0sIGkpXFxuICAgICAgICAgICAgZWxzZVxcbiAgICAgICAgICAgICAgICBkLnVybCA9ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKG9sZEluZGV4LCBuZXdJbmRleCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gSlNPTi5wYXJzZShyZWFkRmlsZSgnY3VzdG9tRGF0YScpIHx8ICdbXScpXFxuICAgICAgICAgICAgICAgICAgICBydWxlcy5zcGxpY2UobmV3SW5kZXgsIDAsIHJ1bGVzLnNwbGljZShvbGRJbmRleCwgMSlbMF0pXFxuICAgICAgICAgICAgICAgICAgICBzYXZlRmlsZSgnY3VzdG9tRGF0YScsIEpTT04uc3RyaW5naWZ5KHJ1bGVzKSlcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKCdzb3J0RmxhZycsICctMScpXFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgICAgICAgICAgICAgfSwgc29ydEZsYWcsIGkpXFxuICAgICAgICAgICAgYnJlYWtcXG4gICAgICAgIGNhc2UgJ+abtOaUueWbvuaghyc6XFxuICAgICAgICAgICAgZC51cmwgPSAkKHYuaWNvbiB8fCAnJywgJ+i+k+WFpeaWsOWbvuagh+WcsOWdgOaIluminOiJsuS7o+egge+8micpLmlucHV0KChpKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IEpTT04ucGFyc2UocmVhZEZpbGUoJ2N1c3RvbURhdGEnKSB8fCAnW10nKVxcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQpXFxuICAgICAgICAgICAgICAgICAgICBydWxlc1tpXS5pY29uID0gaW5wdXRcXG4gICAgICAgICAgICAgICAgZWxzZVxcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJ1bGVzW2ldLmljb25cXG4gICAgICAgICAgICAgICAgc2F2ZUZpbGUoJ2N1c3RvbURhdGEnLCBKU09OLnN0cmluZ2lmeShydWxlcykpXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgICAgICAgICAgfSwgaSlcXG4gICAgICAgICAgICBicmVha1xcbiAgICAgICAgY2FzZSAn5a+85YWl5rW36ZiUJzpcXG4gICAgICAgICAgICBkLnVybCA9ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGkpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9kYXRhTG9hZD9ydWxlPScgKyBnZXRNeVZhcignbXlDb2xsZWN0aW9uJyksIHRydWUpXFxuICAgICAgICAgICAgICAgIHJldHVybiAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoZGF0YVtpXSkpXFxuICAgICAgICAgICAgfSwgaSlcXG4gICAgICAgICAgICBicmVha1xcbiAgICB9XFxuICAgIGVsLnB1c2goZClcXG59KVxcbnNldFJlc3VsdChlbClcXG5cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIumhtemdoui9veWFpVwiLFwicGF0aFwiOlwiZnJhbWVMb2FkXCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBRSU5HX1RJVExFID0gZ2V0TXlWYXIoJ215Q29sbGVjdGlvbicpXFxudmFyIG15Q29sbF9lbCA9IFtdXFxuZXZhbChKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL3BhZ2UvaGlqYWNrRW52P3J1bGU9JyArIFFJTkdfVElUTEUpKS5ydWxlKVxcblxcbmlmICghaXNJbmRleCkge1xcbiAgICBpZiAocGFnZVRpdGxlKSBzZXRQYWdlVGl0bGUocGFnZVRpdGxlKVxcbiAgICBzZXRMYXN0Q2hhcHRlclJ1bGUob3JpUlVMRS5sYXN0X2NoYXB0ZXJfcnVsZSlcXG4gICAgTVlfUEFSQU1TID0gTVlfUlVMRS5wYXJhbXNcXG59IGVsc2UgaWYgKE1ZX1BBR0UgPT0gMSkge1xcbiAgICB0YWJIZWFkZXIubG9hZChteUNvbGxfZWwpXFxuICAgIGlmIChSVUxFLnNlYXJjaF91cmwpIG15Q29sbF9lbC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5pCc57SiXFxcIixcXG4gICAgICAgIGRlc2M6IFxcXCLov5nmmK/ogZrmvKvnmoTmkJzntKLlk6Z+flxcXCIsXFxuICAgICAgICB1cmw6ICdcXFwiaGlrZXI6Ly9zZWFyY2g/cz1cXFwiK2lucHV0JyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgcnVsZXM6ICQudG9TdHJpbmcoKFFJTkdfVElUTEUsIHRpdGxlKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlcyA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2RhdGFMb2FkP3J1bGU9JyArIFFJTkdfVElUTEUpXFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gW3J1bGVzLmZpbmQoKHYpID0+IHYudGl0bGUgPT0gdGl0bGUpXVxcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocnVsZXMpXFxuICAgICAgICAgICAgfSwgUUlOR19USVRMRSwgUlVMRS50aXRsZSksXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcignc2VhcmNoS2V5JywgJycpLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBcXFwicHV0TXlWYXIoJ3NlYXJjaEtleScsaW5wdXQpXFxcIlxcbiAgICAgICAgfSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICB9KVxcbn1cXG4vLyDmraPmlofop6PmnpBcXG52YXIge1xcbiAgICBwYXJhbUhhbmRsZSxcXG4gICAgcnVuUHJlUnVsZSxcXG4gICAgZ2VuRXhVcmwsXFxuICAgIGhpamFja0xhenlSdWxlXFxufSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2Z1bmNUb29scz9ydWxlPScgKyBRSU5HX1RJVExFKVxcbnJ1blByZVJ1bGUob3JpUlVMRS5wcmVSdWxlKVxcbmlmIChNWV9SVUxFLmZpbmRfcnVsZS5zdGFydHNXaXRoKCdqczonKSkge1xcbiAgICBsZXQgeyBoaWphY2tFbCB9ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZnVuY1Rvb2xzP3J1bGU9JyArIFFJTkdfVElUTEUpXFxuICAgIHNldFJlc3VsdCA9IGZ1bmN0aW9uKHBhcmFtMCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMykge1xcbiAgICAgICAgcGFyYW0xID0gQ0FMTEJBQ0tfS0VZXFxuICAgICAgICBwYXJhbTIgPSBNWV9SVUxFXFxuICAgICAgICBwYXJhbTMgPSBNWV9UWVBFXFxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbTAuZGF0YSkpIHBhcmFtMCA9IHBhcmFtMC5kYXRhXFxuICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShteUNvbGxfZWwsIHBhcmFtMC5tYXAoaGlqYWNrRWwpKVxcbiAgICAgICAgbWV0aG9kX3NldFJlc3VsdC5pbnZva2UoamF2YUNvbnRleHQsIG15Q29sbF9lbCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMylcXG4gICAgfVxcbiAgICBzZXRIb21lUmVzdWx0ID0gc2V0UmVzdWx0XFxuICAgIHNldFNlYXJjaFJlc3VsdCA9IHNldFJlc3VsdFxcblxcbiAgICBldmFsKE1ZX1JVTEUuZmluZF9ydWxlLnNsaWNlKDMpKVxcbn0gZWxzZSB7XFxuICAgIGxldCB7IHJ1bkNvZGUgfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2Z1bmNUb29scz9ydWxlPScgKyBRSU5HX1RJVExFKSxcXG4gICAgICAgIFtfLCBmaW5kUnVsZSwgZGV0YWlsRmluZFJ1bGVdID0gTVlfUlVMRS5maW5kX3J1bGUubWF0Y2goL14oW1xcXFxzXFxcXFNdKj8pKD86PT0+KFtcXFxcc1xcXFxTXSopKT8kLylcXG4gICAgZmluZFJ1bGUgPSBmaW5kUnVsZS5zcGxpdCgnOycpXFxuICAgIHBhcnNlRG9tRm9yQXJyYXkoZ2V0UmVzQ29kZSgpLCBmaW5kUnVsZS5zaGlmdCgpKS5mb3JFYWNoKChkYXRhKSA9PiB7XFxuICAgICAgICBsZXQgW3RpdGxlLCBpbWcsIGRlc2MsIHVybF0gPSBmaW5kUnVsZS5tYXAoKHYsIGkpID0+IHtcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh2ID09ICcqJykgcmV0dXJuICcnXFxuICAgICAgICAgICAgICAgICAgICBlbHNlIHYgPSAoaSA9PSAxIHx8IGkgPT0gMykgP1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlRG9tKGRhdGEsIHYpIDpcXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZURvbUZvckh0bWwoZGF0YSwgdilcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpICE9IDMpIHYgPSBydW5Db2RlKHYpXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdlxcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IHJldHVybiAnJyB9XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgcmVzID0ge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsIHVybDogdXJsLFxcbiAgICAgICAgICAgICAgICBkZXNjOiBkZXNjLCBpbWc6IGltZyxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IE1ZX1JVTEUuY29sX3R5cGVcXG4gICAgICAgICAgICB9XFxuICAgICAgICBpZiAocmVzLnVybCkge1xcbiAgICAgICAgICAgIGlmIChyZXMudXJsLmluY2x1ZGVzKCdAbGF6eVJ1bGU9JykpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHJlSW5kZXggPSByZXMudXJsLmluZGV4T2YoJy5qczonKVxcbiAgICAgICAgICAgICAgICBpZiAocmVJbmRleCA+PSAwKSByZXMudXJsID0gcmVzLnVybC5zbGljZSgwLCByZUluZGV4KSArICcuanM6JyArIGhpamFja0xhenlSdWxlICsgJzsnICsgcmVzLnVybC5zbGljZShyZUluZGV4ICsgNClcXG4gICAgICAgICAgICB9IGVsc2UgIGlmIChkZXRhaWxGaW5kUnVsZSkge1xcbiAgICAgICAgICAgICAgICByZXMuZXh0cmEgPSB7XFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGdlbkV4VXJsKHVybCksXFxuICAgICAgICAgICAgICAgICAgICBSVUxFOiBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmFzc2lnbihnZW5NeVJ1bGUoKSwgeyBkZXRhaWxfZmluZF9ydWxlOiBkZXRhaWxGaW5kUnVsZSB9KSkpLFxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlOiBpc0luZGV4ICYmIHRpdGxlXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmVzLnVybCA9ICdoaWtlcjovL3BhZ2UvZnJhbWVMb2FkP3J1bGU9JyArIFFJTkdfVElUTEVcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKE1ZX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSkge1xcbiAgICAgICAgICAgICAgICByZXMuZXh0cmEgPSB7XFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGdlbkV4VXJsKHVybCksXFxuICAgICAgICAgICAgICAgICAgICBSVUxFOiBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoZ2VuTXlSdWxlKCkpKSxcXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUaXRsZTogaXNJbmRleCAmJiB0aXRsZVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJlcy51cmwgPSAnaGlrZXI6Ly9wYWdlL2ZyYW1lTG9hZD9ydWxlPScgKyBRSU5HX1RJVExFXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgbXlDb2xsX2VsLnB1c2gocmVzKVxcbiAgICB9KVxcbiAgICBzZXRSZXN1bHQobXlDb2xsX2VsKVxcbn1cXG5cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuaVsOaNrui9veWFpVwiLFwicGF0aFwiOlwiZGF0YUxvYWRcIixcInJ1bGVcIjpcImxldCBzaG93QWxsID0gJC5pbXBvcnRQYXJhbSxcXG4gICAgdXJsID0gZ2V0TXlWYXIoJ3JlbW90ZVVybCcpLFxcbiAgICBkYXRhID0gW11cXG5pZiAodXJsLnN0YXJ0c1dpdGgoJ2hpa2VyOi8vJykgfHwgdXJsLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKSkge1xcbiAgICAvLyDlpoLmnpzkuLrmnKzlnLDmlofku7bliJnkuI3ov5vooYznvJPlrZhcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBvcmlEYXRhID0gZmV0Y2godXJsKVxcbiAgICAgICAgaWYgKHVybC5zdGFydHNXaXRoKCdoaWtlcjovL3BhZ2UvJykpXFxuICAgICAgICAgICAgb3JpRGF0YSA9IEpTT04ucGFyc2Uob3JpRGF0YSkucnVsZVxcbiAgICAgICAgZGF0YSA9IEpTT04ucGFyc2Uob3JpRGF0YSlcXG4gICAgfSBjYXRjaCAoZSkge31cXG59IGVsc2Uge1xcbiAgICAvLyDojrflj5bov5znqIvmlbDmja7vvIzmo4Dmn6Xpl7TpmpTpu5jorqTkuIDlpKlcXG4gICAgbGV0IGludGVydmFsID0gcGFyc2VJbnQocmVhZEZpbGUoJ3VwZGF0ZUludGVydmFsJykgfHwgJzEnKSxcXG4gICAgICAgIG9sZERhdGEgPSBmZXRjaCgnaGlrZXI6Ly9maWxlcy9saWJzLycgKyBtZDUodXJsKSArICcuanMnKSxcXG4gICAgICAgIHJlbW90ZURhdGEgPSBbXVxcbiAgICBpZiAoaW50ZXJ2YWwgPT0gMCkgaW50ZXJ2YWwgPSAtMVxcbiAgICB0cnkgeyByZW1vdGVEYXRhID0gSlNPTi5wYXJzZShmZXRjaENhY2hlKHVybCwgMjQgKiBpbnRlcnZhbCwgeyB0aW1lb3V0OiA1MDAwMCB9KSkgfSBjYXRjaCAoZSkge31cXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlbW90ZURhdGEpKSByZW1vdGVEYXRhID0gW11cXG4gICAgaWYgKHJlbW90ZURhdGEubGVuZ3RoIDwgMykge1xcbiAgICAgICAgbG9nKCfmnKrojrflj5bliLDmlbDmja4nKVxcbiAgICAgICAgaWYgKG9sZERhdGEpIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9saWJzLycgKyBtZDUodXJsKSArICcuanMnLCBvbGREYXRhKVxcbiAgICAgICAgZGF0YSA9IEpTT04ucGFyc2Uob2xkRGF0YSB8fCAnW10nKVxcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgbG9nKCflt7Lojrflj5bliLDmlbDmja4nKVxcbiAgICAgICAgZGF0YSA9IHJlbW90ZURhdGFcXG4gICAgfVxcbn1cXG5kYXRhID0gZGF0YS5maWx0ZXIoKHYpID0+IHYudGl0bGUgIT0gZ2V0TXlWYXIoJ215Q29sbGVjdGlvbicpICYmICEodi5hdXRob3IgfHwgJycpLmluY2x1ZGVzKCfovbvlkIjpm4bnlJ/miJDlmagnKSlcXG5pZiAocmVhZEZpbGUoJ2Rpc2FibGVDdXN0b20nKSkgJC5leHBvcnRzID0gZGF0YVxcbmVsc2UgeyAvLyDlhpnlhaXoh6rlrprkuYnmlbDmja5cXG4gICAgbGV0IGN1c3RvbURhdGEgPSBKU09OLnBhcnNlKHJlYWRGaWxlKCdjdXN0b21EYXRhJykgfHwgJ1tdJyksXFxuICAgICAgICByZXdyaXRlRGF0YSA9IFtdXFxuICAgIGN1c3RvbURhdGEgPSBjdXN0b21EYXRhLnJlZHVjZSgoc2VsZiwgdikgPT4ge1xcbiAgICAgICAgbGV0IGluZGV4ID0gZGF0YS5maW5kSW5kZXgoKHZ2KSA9PiB2LnRpdGxlID09IHZ2LnRpdGxlKVxcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcXG4gICAgICAgICAgICBzZWxmLnB1c2godilcXG4gICAgICAgICAgICBsZXQgcnVsZSA9IGRhdGEuc3BsaWNlKGluZGV4LCAxKVswXVxcbiAgICAgICAgICAgIGlmIChzaG93QWxsIHx8IHYudmlzaWJsZSlcXG4gICAgICAgICAgICAgICAgcmV3cml0ZURhdGEucHVzaChPYmplY3QuYXNzaWduKHJ1bGUsIHYpKVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG4gICAgfSwgW10pXFxuICAgIGRhdGEuZm9yRWFjaCgodikgPT4gY3VzdG9tRGF0YS5wdXNoKHsgdGl0bGU6IHYudGl0bGUsIHZpc2libGU6IHRydWUgfSkpXFxuICAgIHNhdmVGaWxlKCdjdXN0b21EYXRhJywgSlNPTi5zdHJpbmdpZnkoY3VzdG9tRGF0YSkpXFxuICAgICQuZXhwb3J0cyA9IHJld3JpdGVEYXRhLmNvbmNhdChkYXRhKVxcbn1cXG5cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIumTvuaOpeWkhOeQhipcIixcInBhdGhcIjpcInVybFBhcnNlXCIsXCJydWxlXCI6XCIvLyDpppbpobXpk77mjqXmm7/mjaLliIbnsbtcXG5mdW5jdGlvbiBpbmRleFVybChwYXJhbSkge1xcbiAgICBmdW5jdGlvbiBydW5Db2RlKHJ1bGUpIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IFtpbnB1dCwgY29kZV0gPSBydWxlLnNwbGl0KCcuanM6JylcXG4gICAgICAgICAgICByZXR1cm4gY29kZSA/IGV2YWwoY29kZSkgOiBydWxlXFxuICAgICAgICB9IGNhdGNoIChlKSB7IHJldHVybiBydWxlIH1cXG4gICAgfVxcbiAgICBsZXQgeyBSVUxFLCBwYWdlTnVtLCBRSU5HX1RJVExFIH0gPSBKU09OLnBhcnNlKHBhcmFtLnNwbGl0KCcjIyMnKVsxXSlcXG4gICAgUlVMRSA9IEpTT04ucGFyc2UoYmFzZTY0RGVjb2RlKFJVTEUpKVxcbiAgICBwYWdlTnVtID0gcGFyc2VJbnQocGFnZU51bSlcXG4gICAgbGV0IHVybCA9IFJVTEUudXJsXFxuXFxuICAgIGV2YWwoSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9wYWdlL0NsYXNzVGFiP3J1bGU9JyArIFFJTkdfVElUTEUpKS5ydWxlKVxcbiAgICB1cmwgPSB0YWJIZWFkZXIuc2V0VXJsKGZ5QWxsID8gdXJsLnJlcGxhY2UoL2Z5QWxsL2csICckJHtmeUFsbH0nKSA6IHVybC5yZXBsYWNlKC9meShjbGFzc3xhcmVhfHllYXJ8c29ydCkvZywgJyQke2Z5JDF9JykpXFxuICAgIHVybCA9IHVybC5yZXBsYWNlKC9meXBhZ2UoPzpAKC0/XFxcXGQrKUApPyg/OlxcXFwqKFxcXFxkKylAKT8vZywgKF8sIHN0YXJ0LCBzcGFjZSkgPT4gcGFyc2VJbnQoc3RhcnQgfHwgMCkgKyAxICsgKHBhZ2VOdW0gLSAxKSAqIHBhcnNlSW50KHNwYWNlIHx8IDEpKVxcbiAgICB1cmwgPSAvXihbXFxcXHNcXFxcU10qPykoPzpcXFxcW2ZpcnN0UGFnZT0oW1xcXFxzXFxcXFNdKj8pXFxcXF0pPyg/OihcXFxcLmpzOltcXFxcc1xcXFxTXSo/KSk/JC8uZXhlYyh1cmwpXFxuICAgIGlmIChwYWdlTnVtID09IDEgJiYgdXJsWzJdKSB1cmxbMV0gPSB1cmxbMl1cXG4gICAgaWYgKHVybFszXSAmJiAhdXJsWzFdLmluY2x1ZGVzKCcuanM6JykpIHVybFsxXSArPSB1cmxbM11cXG4gICAgcmV0dXJuIHJ1bkNvZGUodXJsWzFdKVxcbn1cXG5mdW5jdGlvbiBwYXJhbUhhbmRsZSh1cmxQYXJhbSwgdWEsIHVybFRtcCkge1xcbiAgICBsZXQgY2hhcnNldCwgcGFyYW1UbXBcXG4gICAgdHJ5IHsgLy8g6ZO+5o6l55qE57yW56CB44CBVUHlkoxSZWZlcmVy5bqU6K+l5piv6aaW5YWI57un5om/6aaW6aG16ZO+5o6lXFxuICAgICAgICBbLCAsIGNoYXJzZXQsIHBhcmFtVG1wXSA9IHVybFRtcC5zcGxpdCgnOycpXFxuICAgICAgICBwYXJhbVRtcCA9IHBhcmFtVG1wLm1hdGNoKC9eeyguKil9JC8pWzFdLnNwbGl0KCcmJicpXFxuICAgIH0gY2F0Y2ggKGUpIHsgcGFyYW1UbXAgPSBbXSB9XFxuICAgIGxldCBVc2VyQWdlbnQgPSBwYXJhbVRtcC5maW5kKCh2KSA9PiB2LnN0YXJ0c1dpdGgoJ1VzZXItQWdlbnRAJykpLFxcbiAgICAgICAgUmVmZXJlciA9IHBhcmFtVG1wLmZpbmQoKHYpID0+IHYuc3RhcnRzV2l0aCgnUmVmZXJlckAnKSlcXG4gICAgdXJsUGFyYW1bMF0gPSB1cmxQYXJhbVswXSB8fCAnR0VUJ1xcbiAgICB1cmxQYXJhbVsxXSA9IHVybFBhcmFtWzFdIHx8IGNoYXJzZXQgfHwgJ1VURi04J1xcbiAgICB0cnkge1xcbiAgICAgICAgdXJsUGFyYW1bMl0gPSB1cmxQYXJhbVsyXS5tYXRjaCgvXnsoLiopfSQvKVsxXS5zcGxpdCgnJiYnKVxcbiAgICB9IGNhdGNoIChlKSB7IHVybFBhcmFtWzJdID0gW10gfVxcbiAgICAvLyDmt7vliqDlhajlsYBVQeWSjOS4iue6p1JlZmVyZXJcXG4gICAgaWYgKCF1cmxQYXJhbVsyXS5zb21lKCh2KSA9PiB2LnN0YXJ0c1dpdGgoJ1VzZXItQWdlbnRAJykpKSB7XFxuICAgICAgICBpZiAoVXNlckFnZW50KSB1cmxQYXJhbVsyXS5wdXNoKFVzZXJBZ2VudClcXG4gICAgICAgIGVsc2UgaWYgKHVhID09ICdwYycpXFxuICAgICAgICAgICAgdXJsUGFyYW1bMl0ucHVzaCgnVXNlci1BZ2VudEAnICsgUENfVUEucmVwbGFjZSgvOy9nLCAn77yb77ybJykucmVwbGFjZSgvXFxcXD8vLCAn77yf77yfJykpXFxuICAgICAgICBlbHNlIGlmICh1YSA9PSAnbW9iaWxlJylcXG4gICAgICAgICAgICB1cmxQYXJhbVsyXS5wdXNoKCdVc2VyLUFnZW50QCcgKyBNT0JJTEVfVUEucmVwbGFjZSgvOy9nLCAn77yb77ybJykucmVwbGFjZSgvXFxcXD8vLCAn77yf77yfJykpXFxuICAgIH1cXG4gICAgaWYgKFJlZmVyZXIgJiYgIXVybFBhcmFtWzJdLnNvbWUoKHYpID0+IHYuc3RhcnRzV2l0aCgnUmVmZXJlckAnKSkpXFxuICAgICAgICB1cmxQYXJhbVsyXS5wdXNoKFJlZmVyZXIpXFxuICAgIHVybFBhcmFtWzJdID0gJ3snICsgdXJsUGFyYW1bMl0uam9pbignJiYnKSArICd9J1xcbiAgICByZXR1cm4gdXJsUGFyYW0uam9pbignOycpXFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5LqM57qnW+S4gF0qXCIsXCJwYXRoXCI6XCJlanRvb2xcIixcInJ1bGVcIjpcImZ1bmN0aW9uIGNvdmVyKOagh+mimCwg5L2c6ICFLCDliIbnsbssIOeKtuaAgSwg56ug6IqCLCDmm7TmlrAsIOeugOS7iyzlsIHpnaLlm77niYcsdHJ1ZV91cmwsIGhhc0xpbmUpIHtcXHJcXG52YXIg5qCH6aKYLCDkvZzogIUsIOWIhuexuywg54q25oCBLCDnq6DoioIsIOabtOaWsCwg566A5LuLLOWwgemdouWbvueJhyx0cnVlX3VybCwgaGFzTGluZTtcXHJcXG5cXHR0cnkge1xcclxcblxcdFxcdGQucHVzaCh7XFxyXFxuXFx0XFx0XFx0dGl0bGU6ICfigJjigJjigJnigJk8c21hbGw+PGZvbnQgY29sb3I9XFxcIiNGQTcyOThcXFwiPicr5L2c6ICFLnNsaWNlKDAsMTUpK1xcXCImbmJzcDtcXFwiK+eKtuaAgSsnPC9mb250Pjwvc21hbGw+Jysn4oCY4oCY4oCZ4oCZPHNtYWxsPjxmb250IGNvbG9yPVxcXCIjQjE1QkZGXFxcIj4nK1xcXCJcXFxcblxcXCIr5YiG57G7Kyc8L2ZvbnQ+PC9zbWFsbD4nKyfigJjigJjigJnigJk8c21hbGw+PGZvbnQgY29sb3I9XFxcIiNGRjM1OUFcXFwiPicrXFxcIlxcXFxuXFxcIivnq6DoioIrXFxcIiZuYnNwO1xcXCIr5pu05pawKyc8L2ZvbnQ+PC9zbWFsbD4nLFxcclxcblxcdFxcdFxcdGRlc2M6J+KAmOKAmOKAmeKAmTxzbWFsbD4nICvnroDku4srICc8L3NtYWxsPicsXFxyXFxuXFx0XFx0XFx0cGljX3VybDogIOWwgemdouWbvueJhyxcXHJcXG5cXHRcXHRcXHR1cmw6IHRydWVfdXJsLFxcclxcblxcdFxcdFxcdGNvbF90eXBlOiAnbW92aWVfMV92ZXJ0aWNhbF9waWNfYmx1cidcXHJcXG5cXHRcXHR9KTtcXG5cXHRcXHRkLnB1c2goe1xcclxcblxcdFxcdFxcdGNvbF90eXBlOiAnbGluZV9ibGFuaycsXFxyXFxuXFx0XFx0fSk7XFxuXFx0XFx0ZC5wdXNoKHtcXHJcXG5cXHRcXHRcXHRjb2xfdHlwZTogJ2xpbmUnLFxcclxcblxcdFxcdH0pO1xcclxcblxcdFxcdGlmIChoYXNMaW5lKSB7XFxyXFxuXFx0XFx0XFx0aXRlbS5leHRyYSA9IHtcXHJcXG5cXHRcXHRcXHRcXHRsaW5lVmlzaWJsZTogZmFsc2VcXHJcXG5cXHRcXHRcXHR9XFxyXFxuXFx0XFx0fVxcclxcblxcdFxcdGQucHVzaChpdGVtKTtcXHJcXG5cXHR9IGNhdGNoIChlKSB7fVxcclxcbn1cXHJcXG5mdW5jdGlvbiBjaGFwdGVyKHRpdGxlLHBpY191cmwsY2hhcHRlckxpc3QsIGNoYXB0ZXJUaXRsZSwgY2hhcHRlclVybCwgZGVmYXVsdE9yZGVyLCBoYXNMaW5lLGRvd25sb2FkbGF6eSkge1xcclxcblxcdHZhciBsaXN0ID0gY2hhcHRlckxpc3Q7XFxyXFxuXFx0dmFyIG9yaWdpbmFsID0gW3tcXHJcXG5cXHRcXHR1cmw6IE1ZX1VSTCxcXHJcXG5cXHRcXHRvcmRlcjogZGVmYXVsdE9yZGVyXFxyXFxuXFx0fV07XFxyXFxuXFx0IWZpbGVFeGlzdCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnKSA/ICh3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvY29taWMvY29taWNMb2dGaWxlLmpzJywgSlNPTi5zdHJpbmdpZnkob3JpZ2luYWwpKSkgOiAwO1xcclxcblxcdHZhciBsb2cgPSBKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycpKTtcXHJcXG5cXHRmb3IgKHZhciBpIGluIGxvZykge1xcclxcblxcdFxcdGlmIChsb2dbaV0udXJsID09IE1ZX1VSTCkge1xcclxcblxcdFxcdFxcdHZhciBub3cgPSBpO1xcclxcblxcdFxcdFxcdHZhciBvcmRlciA9IGxvZ1tpXS5vcmRlcjtcXHJcXG5cXHRcXHRcXHRicmVhaztcXHJcXG5cXHRcXHR9IGVsc2Uge1xcclxcblxcdFxcdFxcdHZhciBub3cgPSAnJztcXHJcXG5cXHRcXHRcXHR2YXIgb3JkZXIgPSBkZWZhdWx0T3JkZXI7XFxyXFxuXFx0XFx0fVxcclxcblxcdH1cXHJcXG5cXHRsZXQgb3JkZXJJdGVtID0ge1xcclxcblxcdFxcdHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArICc8c3Ryb25nPjxmb250IGNvbG9yPVxcXCIjMDk4QUMxXFxcIj4nICsgJ+eroOiKguaOkuW6j+KHhScgKyAnPC9mb250Pjwvc3Ryb25nPicsXFxyXFxuXFx0XFx0dXJsOiBNWV9VUkwgKyBgQGxhenlSdWxlPS5qczp2YXIgbG9nID0gSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnKSk7dmFyIG5vdz0nYCArIG5vdyArIGAnO2lmKG5vdyE9Jycpe3ZhciBub3c9cGFyc2VJbnQobm93KTt2YXIgb3JkZXI9bG9nW25vd10ub3JkZXJ9ZWxzZXt2YXIgbm93PXBhcnNlSW50KGxvZy5sZW5ndGgpO3ZhciBvcmRlcj1gICsgZGVmYXVsdE9yZGVyICsgYDtsb2cucHVzaCh7dXJsOmlucHV0LG9yZGVyOm9yZGVyfSk7fWlmKGxvZ1tub3ddLm9yZGVyKXtsb2dbbm93XS5vcmRlcj0wO31lbHNle2xvZ1tub3ddLm9yZGVyPTE7fTt3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvY29taWMvY29taWNMb2dGaWxlLmpzJywgSlNPTi5zdHJpbmdpZnkobG9nKSk7cmVmcmVzaFBhZ2UoKTsnaGlrZXI6Ly9lbXB0eSdgLFxcclxcblxcdFxcdGNvbF90eXBlOiAndGV4dF8yJ1xcclxcblxcdH1cXHJcXG5cXHRpZiAoaGFzTGluZSkge1xcclxcblxcdFxcdG9yZGVySXRlbS50aXRsZSA9IFxcXCLigJzigJzigJ3igJ1cXFwiICsgJzxzdHJvbmc+PGZvbnQgY29sb3I9XFxcIiMwOThBQzFcXFwiPicgKyAn6ZuG5pWw5o6S5bqP4oeFJyArICc8L2ZvbnQ+PC9zdHJvbmc+JztcXHJcXG5cXHRcXHRvcmRlckl0ZW0uY29sX3R5cGUgPSBcXFwidGV4dF8yXFxcIlxcclxcblxcdH1cXHJcXG5cXHRsZXQgY2hhcHRlckxpc3RzID0gbGlzdC5tYXAoKGl0ZW0pPT4oe1xcclxcblxcdFxcdHRpdGxlOiBwZGZoKGl0ZW0sXFxcImEmJlRleHRcXFwiKSxcXHJcXG5cXHRcXHR1cmw6IHBkKGl0ZW0sXFxcImEmJmhyZWZcXFwiKSxcXHJcXG5cXHR9KSk7XFxyXFxuZC5wdXNoKHtcXHJcXG5cXHR0aXRsZTogJ+KAmOKAmOKAmeKAmTxzdHJvbmc+PGZvbnQgY29sb3I9IFxcXCIjMDk4QUMxXFxcIj4nICsgXFxcIuS4i+i9vea8q+eUu1xcXCIgKyAnPC9mcm9udD48L3N0cm9uZz4nLFxcclxcblxcdHVybDogXFxcImhpa2VyOi8vcGFnZS9kb3dubG9hZC52aWV3I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5IyNub1JlZnJlc2gjP3J1bGU95pys5Zyw6LWE5rqQ566h55CGXFxcIixcXHJcXG5cXHRjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxyXFxuXFx0ZXh0cmE6IHtcXHJcXG5cXHRcXHRjaGFwdGVyTGlzdDogY2hhcHRlckxpc3RzLFxcclxcblxcdFxcdGluZm86e1xcclxcblxcdFxcdFxcdGJvb2tOYW1lOiB0aXRsZSxcXHJcXG5cXHRcXHRcXHRydWxlTmFtZTogTVlfUlVMRS50aXRsZSxcXHJcXG5cXHRcXHRcXHRib29rVG9wUGljOiBwaWNfdXJsLFxcclxcblxcdFxcdFxcdHBhcnNlQ29kZTogZG93bmxvYWRsYXp5XFxyXFxuXFx0XFx0fSxcXHJcXG5cXHRcXHRkZWZhdWx0VmlldzpcXFwiMVxcXCJcXHJcXG5cXHR9XFxyXFxufSk7XFxyXFxuXFx0ZC5wdXNoKHtcXHJcXG5cXHRcXHR0aXRsZTogJ+KAmOKAmOKAmeKAmTxzdHJvbmc+PGZvbnQgY29sb3I9IFxcXCIjMDk4QUMxXFxcIj4nICsgXFxcIuacrOWcsOS5puaetlxcXCIgKyAnPC9mcm9udD48L3N0cm9uZz4nLFxcclxcblxcdFxcdHVybDogXFxcImhpa2VyOi8vcGFnZS9NYWluLnZpZXc/cnVsZT3mnKzlnLDotYTmupDnrqHnkIZcXFwiLFxcclxcblxcdFxcdGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXHJcXG5cXHR9KTsgIFxcclxcblxcdGQucHVzaChvcmRlckl0ZW0pO1xcclxcblxcdGQucHVzaCh7Y29sX3R5cGU6ICdsaW5lJ30pO1xcdFxcclxcblxcdHZhciBsaXN0ID0gb3JkZXIgPyBsaXN0IDogbGlzdC5yZXZlcnNlKCk7XFxuXFx0aWYoIWxpc3R8fGxpc3Q9PVxcXCJcXFwiKXtcXHJcXG5cXHRcXHRkLnB1c2goe1xcclxcblxcdFxcdFxcdHRpdGxlOiAn5q2k5ryr55S75bey5LiL5p62ISEnLFxcclxcblxcdFxcdFxcdGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXFxyXFxuXFx0XFx0fSk7XFxyXFxuXFx0fVxcclxcblxcdGZvciAodmFyIGkgaW4gbGlzdCkge1xcclxcblxcdFxcdHRyeSB7XFxyXFxuXFx0XFx0XFx0ZC5wdXNoKHtcXHJcXG5cXHRcXHRcXHRcXHR0aXRsZTogcGRmaChsaXN0W2ldLCBjaGFwdGVyVGl0bGUpLFxcclxcblxcdFxcdFxcdFxcdHVybDogcGQobGlzdFtpXSwgY2hhcHRlclVybCkgKyBsYXp5LFxcclxcblxcdFxcdFxcdFxcdGNvbF90eXBlOiAndGV4dF8yJyxcXHJcXG5cXHRcXHRcXHR9KTtcXHJcXG5cXHRcXHR9Y2F0Y2ggKGUpIHt9XFxyXFxuXFx0fVxcclxcbn1cXHJcXG5cXHJcXG5mdW5jdGlvbiBsaW5lKGxpbmVMaXN0LCBsaW5lVGl0bGVSdWxlLCB2YXJLZXkpIHtcXHJcXG5cXHRsZXQgbGlzdCA9IGxpbmVMaXN0XFxyXFxuXFx0dmFyS2V5ID0gdmFyS2V5ID09IG51bGwgPyAoTVlfUlVMRS51cmwgKyAnI2xpbmUtaW5kZXgnKTogdmFyS2V5O1xcclxcblxcdGFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoa2V5TGlzdCkgPT4ge1xcclxcblxcdFxcdGZvciAobGV0IGkgaW4ga2V5TGlzdCkge2NsZWFyVmFyKGtleUxpc3RbaV0pfVxcclxcblxcdH0sIFt2YXJLZXksIE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnXSkpXFxyXFxuXFx0bGV0IGxpbmUwVGl0bGUgPSAnJztcXHJcXG5cXHR0cnkge1xcclxcblxcdFxcdGxpbmUwVGl0bGUgPSBwZGZoKGxpc3RbMF0sIGxpbmVUaXRsZVJ1bGUpLnJlcGxhY2UoXFxcIueroOiKguWIl+ihqO+8mlxcXCIsXFxcIlxcXCIpO1xcclxcblxcdH0gY2F0Y2ggKGUpIHt9XFxyXFxuXFx0bG9nKE1ZX1JVTEUudGl0bGUgKyBnZXRWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSkpXFxyXFxuXFx0Zm9yIChsZXQgaSBpbiBsaXN0KSB7XFxyXFxuXFx0XFx0dHJ5IHtcXHJcXG5cXHRcXHRcXHRsZXQgbGluZVRpdGxlID0gcGRmaChsaXN0W2ldLCBsaW5lVGl0bGVSdWxlKS5yZXBsYWNlKFxcXCLnq6DoioLliJfooajvvJpcXFwiLFxcXCJcXFwiKTtcXHJcXG5cXHRcXHRcXHRkLnB1c2goe1xcclxcblxcdFxcdFxcdFxcdHRpdGxlOiBnZXRWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSwgbGluZTBUaXRsZSkgPT09IGxpbmVUaXRsZSA/IFxcXCLliIfmjaI64oCY4oCYXFxcIiArIGxpbmVUaXRsZStcXFwiXFxcIjpsaW5lVGl0bGUrXFxcIuKAmOKAmDrliIfmjaJcXFwiLFxcclxcblxcdFxcdFxcdFxcdHVybDogJCgpLmxhenlSdWxlKCh2YXJLZXksIGxpbmVJbmRleCwgbGluZVRpdGxlKSA9PiB7XFxyXFxuXFx0XFx0XFx0XFx0XFx0cHV0VmFyKHZhcktleSwgbGluZUluZGV4LnRvU3RyaW5nKCkpO1xcclxcblxcdFxcdFxcdFxcdFxcdHB1dFZhcigoTVlfUlVMRS50aXRsZSArICcjbGluZS10aXRsZScpLCBsaW5lVGl0bGUpO1xcclxcblxcdFxcdFxcdFxcdFxcdGxvZyhNWV9SVUxFLnRpdGxlICsgZ2V0VmFyKChNWV9SVUxFLnRpdGxlICsgJyNsaW5lLXRpdGxlJykpKTtcXHJcXG5cXHRcXHRcXHRcXHRcXHRyZWZyZXNoUGFnZSgpO1xcclxcblxcdFxcdFxcdFxcdFxcdHJldHVybiBcXFwidG9hc3Q6Ly/lt7LliIfmjaLoh7NcXFwiICsgbGluZVRpdGxlO1xcclxcblxcdFxcdFxcdFxcdH0sIHZhcktleSwgaSwgbGluZVRpdGxlKSxcXHJcXG5cXHRcXHRcXHRcXHRjb2xfdHlwZTogJ3RleHRfMicsXFxyXFxuXFx0XFx0XFx0fSk7XFxyXFxuXFx0XFx0fSBjYXRjaCAoZSkge31cXHJcXG5cXHR9XFxyXFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5LqM57qnW+S6jF0qXCIsXCJwYXRoXCI6XCJjb21pY0Z1bmN0aW9uRmlsZS5qc1wiLFwicnVsZVwiOlwiZnVuY3Rpb24gY292ZXIoY292ZXJUaXRsZSwgY292ZXJUaXRsZTEsIGNvdmVyVGl0bGUyLCBjb3ZlclRpdGxlMywgY292ZXJEZXNjLCBjb3ZlclBpYywgY292ZXJVcmwsIGhhc0xpbmUpIHtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGNvbnN0IENvbG9yID0gXFxcIiMxOUI4OURcXFwiO1xcbiAgICAgICAgdmFyIGRlc19kZXNjID0gcGRmaChodG1sLCBjb3ZlckRlc2MpLnJlcGxhY2UoJ+eugOOAgOOAgOS7i++8micsICcnKS5yZXBsYWNlKCfmvKvnlLvnroDku4vvvJonLCAnJyk7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPD48Zm9udCBjb2xvcj1cXFwiI0ZBNzI5OFxcXCI+JyArIHBkZmgoaHRtbCwgY292ZXJUaXRsZSkgKyAnXFxcXG4nICsgJ+KAmOKAmOKAmeKAmTw+PGZvbnQgY29sb3I9XFxcIiM3MzQzMzhcXFwiPicgKyBwZGZoKGh0bWwsIGNvdmVyVGl0bGUxKSArICdcXFxcbicsXFxuICAgICAgICAgICAgZGVzYzogJ+KAmOKAmOKAmeKAmTw+PGZvbnQgY29sb3I9XFxcIiM5NTRBNDVcXFwiPicgKyBwZGZoKGh0bWwsIGNvdmVyVGl0bGUyKSArICdcXFxcbicgKyAn4oCY4oCY4oCZ4oCZPD48Zm9udCBjb2xvcj1cXFwiIzk1NEE0NVxcXCI+JyArIHBkZmgoaHRtbCwgY292ZXJUaXRsZTMpLFxcbiAgICAgICAgICAgIHBpY191cmw6IHBkKGh0bWwsIGNvdmVyUGljKSxcXG4gICAgICAgICAgICB1cmw6IGNvdmVyVXJsLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnbW92aWVfMV92ZXJ0aWNhbF9waWNfYmx1cidcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ2xpbmUnXFxuICAgICAgICB9KTtcXG4gICAgICAgIC8vdmFyIGpqID0gZ2V0VmFyKFxcXCJqanNcXFwiLCBcXFwi5pS26LW3XFxcIik7XFxuICAgICAgICAvL3ZhciBqanVybCA9ICdoaWtlcjovL2VtcHR5QGxhenlSdWxlPS5qczpnZXRWYXIoXFxcImpqc1xcXCIpID09IFxcXCLmlLbotbdcXFwiP3B1dFZhcihcXFwiampzXFxcIixcXFwi5bGV5byAXFxcIik6cHV0VmFyKFxcXCJqanNcXFwiLFxcXCLmlLbotbdcXFwiKTtcXFwiaGlrZXI6Ly9lbXB0eVxcXCInO1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+eugOS7iyA8c21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPVxcXCJjb2xvcjojMTlCODlEXFxcIj7lsZXlvIA+PC9zcGFuPjwvc21hbGw+PC9zbWFsbD4nLFxcbiAgICAgICAgICAgIGltZzogXFxcImh0dHBzOi8vbGFubWVpZ3VvamlhbmcuY29tL3R1Ymlhby9tb3JlLzE5Ny5wbmdcXFwiLFxcbiAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoamppZCwgZGVjaWQsIGRlc19kZXNjKSA9PiB7XFxuICAgICAgICAgICAgICAgIGlmIChnZXRWYXIoXFxcImpqc1xcXCIsIFxcXCLmlLbotbdcXFwiKSA9PSBcXFwi5pS26LW3XFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKFxcXCJqanNcXFwiLCBcXFwi5bGV5byAXFxcIik7XFxuXFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogamppZFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfnroDku4sgPHNtYWxsPjxzbWFsbD48c3BhbiBzdHlsZT1cXFwiY29sb3I6IzE5Qjg5RFxcXCI+5pS26LW3Pjwvc3Bhbj48L3NtYWxsPjwvc21hbGw+J1xcbiAgICAgICAgICAgICAgICAgICAgfSlcXG5cXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTaXplOiAxNCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVNwYWNpbmc6IDMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBkZWNpZFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICc8c3BhbiBzdHlsZT1cXFwiY29sb3I6IzgwODA4MFxcXCI+JyArIGRlc19kZXNjICsgJy4uLjwvc3Bhbj4nXFxuICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKFxcXCJqanNcXFwiLCBcXFwi5pS26LW3XFxcIik7XFxuXFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogamppZFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfnroDku4sgPHNtYWxsPjxzbWFsbD48c3BhbiBzdHlsZT1cXFwiY29sb3I6IzE5Qjg5RFxcXCI+5bGV5byAPjwvc3Bhbj48L3NtYWxsPjwvc21hbGw+J1xcbiAgICAgICAgICAgICAgICAgICAgfSlcXG5cXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTaXplOiAxNCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVNwYWNpbmc6IDMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBkZWNpZFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICc8c3BhbiBzdHlsZT1cXFwiY29sb3I6IzgwODA4MFxcXCI+JyArIGRlc19kZXNjLnN1YnN0cigwLCAzMCkgKyAnLi4uPC9zcGFuPidcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICB9LCBNWV9SVUxFICsgXFxcIl9qamlkXFxcIiwgTVlfUlVMRSArIFxcXCJfZGVjaWRcXFwiLCBkZXNfZGVzYyksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBNWV9SVUxFICsgXFxcIl9qamlkXFxcIlxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcblxcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJzxzcGFuIHN0eWxlPVxcXCJjb2xvcjojODA4MDgwXFxcIj4nICsgZGVzX2Rlc2Muc3Vic3RyKDAsIDMwKSArICcuLi48L3NwYW4+JyxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgdGV4dFNpemU6IDE0LFxcbiAgICAgICAgICAgICAgICBsaW5lU3BhY2luZzogMyxcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX1JVTEUgKyBcXFwiX2RlY2lkXFxcIlxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ2xpbmUnXFxuICAgICAgICB9KVxcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ2xpbmUnXFxuICAgICAgICB9KVxcbiAgICB9IGNhdGNoIChlKSB7fVxcbn1cXG5cXG5mdW5jdGlvbiBkb3duKFRpdGxlLCBjaGFwdGVyUGljLCBsaXN0LCBjaGFwdGVyVGl0bGUsIGNoYXB0ZXJMaW5lLCBkb3dubG9hZGxhenkpIHtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBkb0xpc3QgPSBsaXN0Lm1hcCgoaXRlbSkgPT4gKHtcXG4gICAgICAgICAgICB0aXRsZTogcGRmaChpdGVtLCBjaGFwdGVyVGl0bGUpLFxcbiAgICAgICAgICAgIHVybDogcGQoaXRlbSwgY2hhcHRlckxpbmUpLFxcbiAgICAgICAgfSkpO1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxiPjxzcGFuIHN0eWxlPVxcXCJjb2xvcjogIzFhYWQxOVxcXCI+5LiL6L295ryr55S78J+UuTwvc3Bhbj48L2I+JyxcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvZG93bmxvYWQudmlldyNub1JlY29yZEhpc3RvcnkjI25vUmVmcmVzaCM/cnVsZT3mnKzlnLDotYTmupDnrqHnkIZcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgY2hhcHRlckxpc3Q6IGRvTGlzdCxcXG4gICAgICAgICAgICAgICAgaW5mbzoge1xcbiAgICAgICAgICAgICAgICAgICAgYm9va05hbWU6IHBkZmgoaHRtbCwgVGl0bGUpLFxcbiAgICAgICAgICAgICAgICAgICAgcnVsZU5hbWU6IE1ZX1JVTEUudGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICBib29rVG9wUGljOiBwZChodG1sLCBjaGFwdGVyUGljKSxcXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlQ29kZTogZG93bmxvYWRsYXp5XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWaWV3OiBcXFwiMVxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6ICdsaW5lJ1xcbiAgICAgICAgfSk7XFxuICAgIH0gY2F0Y2ggKGUpIHt9XFxufVxcblxcbmZ1bmN0aW9uIGNoYXB0ZXIoY2hhcHRlckxpc3QsIGNoYXB0ZXJUaXRsZSwgY2hhcHRlclVybCwgZGVmYXVsdE9yZGVyLCBoYXNMaW5lKSB7XFxuICAgIHZhciBsaXN0ID0gY2hhcHRlckxpc3Q7XFxuICAgIHZhciBvcmlnaW5hbCA9IFt7XFxuICAgICAgICB1cmw6IE1ZX1VSTCxcXG4gICAgICAgIG9yZGVyOiBkZWZhdWx0T3JkZXJcXG4gICAgfV07XFxuICAgICFmaWxlRXhpc3QoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvY29taWMvY29taWNMb2dGaWxlLmpzJykgPyAod3JpdGVGaWxlKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycsIEpTT04uc3RyaW5naWZ5KG9yaWdpbmFsKSkpIDogMDtcXG4gICAgdmFyIGxvZyA9IEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vZmlsZXMvcnVsZXMvY29taWMvY29taWNMb2dGaWxlLmpzJykpO1xcbiAgICBmb3IgKHZhciBpIGluIGxvZykge1xcbiAgICAgICAgaWYgKGxvZ1tpXS51cmwgPT0gTVlfVVJMKSB7XFxuICAgICAgICAgICAgdmFyIG5vdyA9IGk7XFxuICAgICAgICAgICAgdmFyIG9yZGVyID0gbG9nW2ldLm9yZGVyO1xcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB2YXIgbm93ID0gJyc7XFxuICAgICAgICAgICAgdmFyIG9yZGVyID0gZGVmYXVsdE9yZGVyO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGxldCBvcmRlckl0ZW0gPSB7XFxuICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyAnPGZvbnQgY29sb3I9XFxcIiNmMzczMzVcXFwiPicgKyAn56ug6IqC5o6S5bqP4oeFJyArICc8L2ZvbnQ+JyxcXG4gICAgICAgIHVybDogTVlfVVJMICsgYEBsYXp5UnVsZT0uanM6dmFyIGxvZyA9IEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vZmlsZXMvcnVsZXMvY29taWMvY29taWNMb2dGaWxlLmpzJykpO3ZhciBub3c9J2AgKyBub3cgKyBgJztpZihub3chPScnKXt2YXIgbm93PXBhcnNlSW50KG5vdyk7dmFyIG9yZGVyPWxvZ1tub3ddLm9yZGVyfWVsc2V7dmFyIG5vdz1wYXJzZUludChsb2cubGVuZ3RoKTt2YXIgb3JkZXI9YCArIGRlZmF1bHRPcmRlciArIGA7bG9nLnB1c2goe3VybDppbnB1dCxvcmRlcjpvcmRlcn0pO31pZihsb2dbbm93XS5vcmRlcil7bG9nW25vd10ub3JkZXI9MDt9ZWxzZXtsb2dbbm93XS5vcmRlcj0xO307d3JpdGVGaWxlKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycsIEpTT04uc3RyaW5naWZ5KGxvZykpO3JlZnJlc2hQYWdlKCk7J2hpa2VyOi8vZW1wdHknYCxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG4gICAgfVxcbiAgICBpZiAoaGFzTGluZSkge1xcbiAgICAgICAgb3JkZXJJdGVtLnRpdGxlID0gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyAnPGZvbnQgY29sb3I9XFxcIiNmMzczMzVcXFwiPicgKyAn6ZuG5pWw5o6S5bqP4oeFJyArICc8L2ZvbnQ+JztcXG4gICAgICAgIG9yZGVySXRlbS5jb2xfdHlwZSA9IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbiAgICB9XFxuICAgIGQucHVzaChvcmRlckl0ZW0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6ICdsaW5lJ1xcbiAgICB9KTtcXG5cXG4gICAgdmFyIGxpc3QgPSBvcmRlciA/IGxpc3QgOiBsaXN0LnJldmVyc2UoKTtcXG4gICAgZm9yIChsZXQgaSBpbiBsaXN0KSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBwZGZoKGxpc3RbaV0sIGNoYXB0ZXJUaXRsZSksXFxuICAgICAgICAgICAgICAgIHVybDogcGQobGlzdFtpXSwgY2hhcHRlclVybCkgKyBsYXp5LFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogcGRmaChsaXN0WzBdLCBjaGFwdGVyVGl0bGUpLmxlbmd0aCA+IDYgPyAndGV4dF8yJyA6ICd0ZXh0XzMnLFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge31cXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBsaW5lKGxpbmVMaXN0LCBsaW5lVGl0bGVSdWxlLCB2YXJLZXkpIHtcXG4gICAgbGV0IGxpc3QgPSBsaW5lTGlzdFxcbiAgICB2YXJLZXkgPSB2YXJLZXkgPT0gbnVsbCA/IChNWV9SVUxFLnVybCArICcjbGluZS1pbmRleCcpIDogdmFyS2V5O1xcbiAgICBhZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKGtleUxpc3QpID0+IHtcXG4gICAgICAgIGZvciAobGV0IGkgaW4ga2V5TGlzdCkge1xcbiAgICAgICAgICAgIGNsZWFyVmFyKGtleUxpc3RbaV0pXFxuICAgICAgICB9XFxuXFxuICAgIH0sIFt2YXJLZXksIE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnXSkpXFxuICAgIGxldCBsaW5lMFRpdGxlID0gJydcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxpbmUwVGl0bGUgPSBwZGZoKGxpc3RbMF0sIGxpbmVUaXRsZVJ1bGUpO1xcbiAgICB9IGNhdGNoIChlKSB7fVxcbiAgICBsb2coTVlfUlVMRS50aXRsZSArIGdldFZhcigoTVlfUlVMRS50aXRsZSArICcjbGluZS10aXRsZScpKSlcXG4gICAgZm9yIChsZXQgaSBpbiBsaXN0KSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBsaW5lVGl0bGUgPSBwZGZoKGxpc3RbaV0sIGxpbmVUaXRsZVJ1bGUpO1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBnZXRWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSwgbGluZTBUaXRsZSkgPT09IGxpbmVUaXRsZSA/IFxcXCLliIfmjaI64oCY4oCYXFxcIiArIGxpbmVUaXRsZSArIFxcXCJcXFwiIDogbGluZVRpdGxlICsgXFxcIuKAmOKAmDrliIfmjaJcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoKS5sYXp5UnVsZSgodmFyS2V5LCBsaW5lSW5kZXgsIGxpbmVUaXRsZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKHZhcktleSwgbGluZUluZGV4LnRvU3RyaW5nKCkpXFxuICAgICAgICAgICAgICAgICAgICAvLyBsb2coTVlfUlVMRS51cmwpXFxuICAgICAgICAgICAgICAgICAgICBwdXRWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSwgbGluZVRpdGxlKVxcbiAgICAgICAgICAgICAgICAgICAgbG9nKE1ZX1JVTEUudGl0bGUgKyBnZXRWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSkpXFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5YiH5o2i6IezXFxcIiArIGxpbmVUaXRsZVxcbiAgICAgICAgICAgICAgICB9LCB2YXJLZXksIGksIGxpbmVUaXRsZSksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnZmxleF9idXR0b24nXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICB9XFxuICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnbGluZSdcXG4gICAgICAgICAgICB9KTtcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop6PmnpBb5YyFXSpcIixcInBhdGhcIjpcImJ6anNcIixcInJ1bGVcIjpcInZhciDmvKvnlLvop6PmnpAgPSAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgdmFyIGlkID0gdHJ1ZTtcXG4gICAgdmFyIGNvZGUgPSByZXF1ZXN0KGlucHV0KVxcbiAgICB2YXIgcGljcyA9IFtdO1xcbiAgICB2YXIgdG9fUmVwZWF0ID0gZmFsc2U7XFxuXFxuXFxuICAgIHdoaWxlIChpZCkge1xcbiAgICAgICAgcGRmYShjb2RlLCBcXFwiLmNoYXB0ZXItbWFpbiYmYW1wLWltZ1xcXCIpXFxuICAgICAgICAgICAgLmZvckVhY2goZGF0YSA9PiBwaWNzLnB1c2gocGRmaChkYXRhLCBcXFwiYW1wLWltZyYmc3JjXFxcIikgKyAnQFJlZmVyZXI9aHR0cHM6Ly9jbi5iYW96aW1oLmNvbS8nKSk7XFxuICAgICAgICB2YXIgbmV4dF9QYWdlID0gcGRmaChjb2RlLCBcXFwiLm5leHRfY2hhcHRlciwtMSYmSHRtbFxcXCIpXFxuICAgICAgICBpZiAobmV4dF9QYWdlLmluY2x1ZGVzKCfkuIvkuIDpobUnKSkge1xcbiAgICAgICAgICAgIGNvZGUgPSByZXF1ZXN0KHBkZmgobmV4dF9QYWdlLCBcXFwiYSYmaHJlZlxcXCIpKVxcbiAgICAgICAgICAgIHRvX1JlcGVhdCA9IHRydWU7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGlkID0gZmFsc2U7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgLy/ljrvpmaTph43lpI3lm77niYdcXG4gICAgaWYgKHRvX1JlcGVhdCkge1xcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwaWNzLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgd2hpbGUgKHBpY3MuaW5kZXhPZihwaWNzW2ldLCBpICsgMSkgIT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgcGljcy5zcGxpY2UocGljcy5pbmRleE9mKHBpY3NbaV0sIGkgKyAxKSwgMSlcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgcmV0dXJuIFxcXCJwaWNzOi8vXFxcIiArIHBpY3Muam9pbihcXFwiJiZcXFwiKTtcXG59KVxcblxcbmxldCBsYXp5ID0gYEBsYXp5UnVsZT0uanM6YCArIOa8q+eUu+ino+aekDtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWKqOaAgVvkuoxdKlwiLFwicGF0aFwiOlwiZHRmbFwiLFwicnVsZVwiOlwiY29uc3QgZW1wdHkgPSBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG5cXG50cnkge1xcbiAgICB2YXIgY2F0ZWdvcmllcyA9IHBkZmEoaHRtbCwg5aSn57G75a6a5L2NKS5jb25jYXQocGRmYShodG1sLCDmi7zmjqXliIbnsbspKVxcbn0gY2F0Y2ggKGUpIHtcXG4gICAgdmFyIGNhdGVnb3JpZXMgPSBwZGZhKGh0bWwsIOWkp+exu+WumuS9jSlcXG59XFxuXFxubGV0IGluaXRfY2F0ZSA9IFtdXFxuXFxuZm9yIChsZXQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7XFxuICAgIGluaXRfY2F0ZS5wdXNoKFxcXCIwXFxcIilcXG59XFxuXFxuY29uc3QgZm9sZCA9IGdldFZhcihNWV9SVUxFLmdyb3VwLCBcXFwiMVxcXCIpXFxuY29uc3QgY2F0ZV90ZW1wX2pzb24gPSBnZXRWYXIoTVlfUlVMRS50aXRsZSwgSlNPTi5zdHJpbmdpZnkoaW5pdF9jYXRlKSlcXG5jb25zdCBjYXRlX3RlbXAgPSBKU09OLnBhcnNlKGNhdGVfdGVtcF9qc29uKVxcblxcbmlmIChwYXJzZUludChwYWdlKSA9PT0gMSkge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGZvbGQgPT09ICcxJyA/ICfigJzigJzigJ3igJ08Yj48c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNGRjAwMDBcXFwiPuKIqDwvc3Bhbj48L2I+JyA6ICfigJzigJzigJ3igJ08Yj48c3BhbiBzdHlsZT1cXFwiY29sb3I6ICMxYWFkMTlcXFwiPuKIpzwvc3Bhbj48L2I+JyxcXG4gICAgICAgIHVybDogJCgpLmxhenlSdWxlKChmb2xkKSA9PiB7XFxuICAgICAgICAgICAgcHV0VmFyKE1ZX1JVTEUuZ3JvdXAsIGZvbGQgPT09ICcxJyA/ICcwJyA6ICcxJyk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgIH0sIGZvbGQpLFxcbiAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgfSlcXG5cXG5cXG4gICAgY2F0ZWdvcmllcy5mb3JFYWNoKChjYXRlZ29yeSwgaW5kZXgpID0+IHtcXG4gICAgICAgIGxldCBzdWJfY2F0ZWdvcmllcyA9IHBkZmEoY2F0ZWdvcnksIOWwj+exu+WumuS9jSk7XFxuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcXG4gICAgICAgICAgICBzdWJfY2F0ZWdvcmllcy5mb3JFYWNoKChpdGVtLCBrZXkpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcGRmaChpdGVtLCDliIbnsbvmoIfpopgpXFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZToga2V5LnRvU3RyaW5nKCkgPT09IGNhdGVfdGVtcFtpbmRleF0gPyAn4oCc4oCc4oCd4oCdPGI+PHNwYW4gc3R5bGU9XFxcImNvbG9yOiAnICsg5YiG57G76aKc6ImyICsgJ1xcXCI+JyArIHRpdGxlICsgJzwvc3Bhbj48L2I+JyA6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAkKHBkKGl0ZW0sIOWIhuexu+mTvuaOpSkgKyAnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgocGFyYW1zKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld19jYXRlID0gW11cXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2F0ZV90ZW1wLmZvckVhY2goKGNhdGUsIGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19jYXRlLnB1c2goaW5kZXggPT09IDAgPyBwYXJhbXMua2V5LnRvU3RyaW5nKCkgOiBcXFwiMFxcXCIpXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRWYXIoTVlfUlVMRS50aXRsZSwgSlNPTi5zdHJpbmdpZnkobmV3X2NhdGUpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1dFZhcihNWV9SVUxFLnVybCwgaW5wdXQpXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSlcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZV90ZW1wOiBjYXRlX3RlbXAsXFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBrZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogcGFnZSxcXG4gICAgICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYmxhbmtfYmxvY2tcXFwiXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2UgaWYgKGZvbGQgPT09ICcxJykge1xcbiAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBwZGZoKGl0ZW0sIOWIhuexu+agh+mimClcXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBrZXkudG9TdHJpbmcoKSA9PT0gY2F0ZV90ZW1wW2luZGV4XSA/ICfigJzigJzigJ3igJ08Yj48c3BhbiBzdHlsZT1cXFwiY29sb3I6ICcgKyDliIbnsbvpopzoibIgKyAnXFxcIj4nICsgdGl0bGUgKyAnPC9zcGFuPjwvYj4nIDogdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6ICQocGQoaXRlbSwg5YiG57G76ZO+5o6lKSArICcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2F0ZV90ZW1wW3BhcmFtcy5pbmRleF0gPSBwYXJhbXMua2V5LnRvU3RyaW5nKClcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRWYXIoTVlfUlVMRS50aXRsZSwgSlNPTi5zdHJpbmdpZnkocGFyYW1zLmNhdGVfdGVtcCkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0VmFyKE1ZX1JVTEUudXJsLCBpbnB1dClcXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlX3RlbXA6IGNhdGVfdGVtcCxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBrZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogcGFnZSxcXG4gICAgICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYmxhbmtfYmxvY2tcXFwiXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH0pXFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Yqo5oCBW+S4gF0qXCIsXCJwYXRoXCI6XCJjYXRlZ29yaWVzLWhlYWRlclwiLFwicnVsZVwiOlwiY29uc3Qgc3ltYm9sTWFwID0ge1xcbiAgICAvLyBjaGVja1BhcmFtczogU3ltYm9sKCdjaGVja1BhcmFtcycpLFxcbiAgICBtTGF5b3V0OiBTeW1ib2woJ21MYXlvdXQnKSxcXG4gICAgdHJ1ZV91cmw6IFN5bWJvbCgndHJ1ZV91cmwnKSxcXG4gICAgbVBhZ2U6IFN5bWJvbCgnbVBhZ2UnKSxcXG4gICAgc3JjOiBTeW1ib2woJ3NyYycpLFxcbiAgICBydWxlT2JqTGlzdDogU3ltYm9sKCdydWxlT2JqTGlzdCcpLFxcbiAgICBtRm9sZDogU3ltYm9sKCdtRm9sZCcpLFxcbiAgICBtRm9sZElubmVyRW5hYmxlOiBTeW1ib2woJ21Gb2xkSW5uZXJFbmFibGUnKSxcXG4gICAgbUZvbGRJbmRleDogU3ltYm9sKCdtRm9sZEluZGV4JyksXFxuICAgIG1Gb2xkTGF5b3V0OiBTeW1ib2woJ21Gb2xkTGF5b3V0JyksXFxuICAgIG1Db2xvcjogU3ltYm9sKCdtQ29sb3InKSxcXG4gICAgbVRhZzogU3ltYm9sKCdtVGFnJyksXFxufVxcblxcbmZ1bmN0aW9uIENhdGVnb3JpZXNIZWFkZXIoY29sb3IpIHtcXG4gICAgLy8gJ3VzZSBzdHJpY3QnO1xcbiAgICAvLyAuLi5cXG4gICAgLy8gdGhpc1tzeW1ib2xNYXAubGlzdFJ1bGVdID0gW11cXG4gICAgLy8gdGhpc1tzeW1ib2xNYXAuc3ViTGlzdFJ1bGVdID0gW11cXG4gICAgdGhpc1tzeW1ib2xNYXAubUNvbG9yXSA9IGNvbG9yIHx8IFxcXCIjRkE3Mjk4XFxcIjtcXG4gICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdID0gW11cXG4gICAgdGhpcy5WQVJNQVAgPSB7XFxuICAgICAgICBDQVRFR09SWTogXFxcImhlYWRlci5jYXRlZ29yeVxcXCIsXFxuICAgICAgICBVUkw6IFxcXCJoZWFkZXIudXJsXFxcIixcXG4gICAgICAgIEZPTEQ6IFxcXCJoZWFkZXIuZm9sZFxcXCIsXFxuICAgIH1cXG4gICAgdGhpc1tzeW1ib2xNYXAubUZvbGRMYXlvdXRdID0ge1xcbiAgICAgICAgaW5qZWN0SW5kZXg6IDFcXG4gICAgfVxcbiAgICB0aGlzW3N5bWJvbE1hcC5tRm9sZEluZGV4XSA9IDFcXG59XFxuXFxuT2JqZWN0LmFzc2lnbihDYXRlZ29yaWVzSGVhZGVyLnByb3RvdHlwZSwge1xcbiAgICAvLyBPdmVycmlkZSDmnoTpgKDmlrnms5XvvIznm7jlvZPkuo4gZnVuY3Rpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gKC4uLikgPT4gey4uLn3vvIxuZXcgZnVuY3Rpb24oKSDnmoTml7blgJnkvJroh6rliqjmiafooYxcXG4gICAgY29uc3RydWN0b3I6IENhdGVnb3JpZXNIZWFkZXIsXFxuICAgIC8vIOWumuS5ieengeacieaWueazlVxcbiAgICBWRVJTSU9OOiAyMDIxMTIwMTE5MDAsXFxuICAgIGNoZWNrUGFyYW1zKCkge1xcbiAgICAgICAgaWYgKCF0aGlzW3N5bWJvbE1hcC5tTGF5b3V0XSkge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+36LCD55SoIGxheW91dChkKSDkvKDlhaXlvZPliY3nlYzpnaJcXFwiKVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKCEodGhpc1tzeW1ib2xNYXAuc3JjXSB8fCB0aGlzW3N5bWJvbE1hcC50cnVlX3VybF0pKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLor7fosIPnlKggdHJ1ZVVybCh1cmwpIOS8oOWFpeW9k+WJjeWIhuexu+eahOmTvuaOpeaIluiwg+eUqCBodG1sKG1IdG1sKSDkvKDlhaXlvZPliY3liIbnsbvpobXpnaLnmoTmupDnoIFcXFwiKVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKCF0aGlzW3N5bWJvbE1hcC5tUGFnZV0pIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuivt+iwg+eUqCBwYWdlKG1QYWdlKSDkvKDlhaXlvZPliY3pobXmlbBcXFwiKVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XS5sZW5ndGggPCAxKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLor7fosIPnlKjnm7jlhbPmlrnms5XkvKDlhaXlrprkvY3op4TliJlcXFwiKVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKCF0aGlzW3N5bWJvbE1hcC5tRm9sZF0pIHtcXG4gICAgICAgICAgICB0aGlzW3N5bWJvbE1hcC5tRm9sZF0gPSAnMCdcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAgbGF5b3V0KG1MYXlvdXQpIHtcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLm1MYXlvdXRdID0gbUxheW91dFxcbiAgICAgICAgcmV0dXJuIHRoaXNcXG4gICAgfSxcXG4gICAgdHJ1ZVVybCh1cmwpIHtcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnRydWVfdXJsXSA9IHVybFxcbiAgICAgICAgcmV0dXJuIHRoaXNcXG4gICAgfSxcXG4gICAgcGFnZShtUGFnZSkge1xcbiAgICAgICAgaWYgKHR5cGVvZiAobVBhZ2UpID09PSAnc3RyaW5nJykge1xcbiAgICAgICAgICAgIG1QYWdlID0gcGFyc2VJbnQobVBhZ2UpXFxuICAgICAgICB9XFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5tUGFnZV0gPSBtUGFnZVxcbiAgICAgICAgcmV0dXJuIHRoaXNcXG4gICAgfSxcXG4gICAgaHRtbChtU3JjKSB7XFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5zcmNdID0gbVNyY1xcbiAgICAgICAgcmV0dXJuIHRoaXNcXG4gICAgfSxcXG4gICAgbGlzdChydWxlKSB7XFxuICAgICAgICBpZiAodGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcImxpc3QocnVsZSkgYWRkKHJ1bGVPYmopIOWPquiDveS6jOmAieS4gO+8gVxcXCIpXFxuICAgICAgICB9XFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF0gPSBbe31dXFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0ubGlzdFJ1bGUgPSBydWxlXFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF1bJ+S4gOe6p+WIhuexuyddID0gcnVsZVxcbiAgICAgICAgcmV0dXJuIHRoaXNcXG4gICAgfSxcXG4gICAgc3ViTGlzdChydWxlKSB7XFxuICAgICAgICBpZiAodGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdLmxlbmd0aCA+IDEpIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcInN1Ykxpc3QocnVsZSkgYWRkKHJ1bGVPYmopIOWPquiDveS6jOmAieS4gO+8gVxcXCIpXFxuICAgICAgICB9XFxuICAgICAgICBpZiAoIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXSB8fCAoIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS5saXN0UnVsZSAmJiAhdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdWyfkuIDnuqfliIbnsbsnXSkpIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuivt+WFiOiwg+eUqCBsaXN0KHJ1bGUpIOaIliDkuIDnuqfliIbnsbsocnVsZSkg5a6a5L2N5LiA57qn5YiG57G7XFxcIilcXG4gICAgICAgIH1cXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS5zdWJMaXN0UnVsZSA9IHJ1bGVcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXVsn5a2Q5YiG57G7J10gPSBydWxlXFxuICAgICAgICByZXR1cm4gdGhpc1xcbiAgICB9LFxcbiAgICB0aXRsZShydWxlKSB7XFxuICAgICAgICBpZiAodGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdLmxlbmd0aCA+IDEpIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcInRpdGxlKHJ1bGUpIGFkZChydWxlT2JqKSDlj6rog73kuozpgInkuIDvvIFcXFwiKVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKCF0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0gfHwgKCF0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0ubGlzdFJ1bGUgJiYgIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXVsn5LiA57qn5YiG57G7J10pKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLor7flhYjosIPnlKggbGlzdChydWxlKSDmiJYg5LiA57qn5YiG57G7KHJ1bGUpIOWumuS9jeS4gOe6p+WIhuexu1xcXCIpXFxuICAgICAgICB9XFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0udGl0bGVSdWxlID0gcnVsZVxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdWyfliIbnsbvmoIfpopgnXSA9IHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS50aXRsZVJ1bGVcXG4gICAgICAgIHJldHVybiB0aGlzXFxuICAgIH0sXFxuICAgIHVybChydWxlKSB7XFxuICAgICAgICBpZiAodGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdLmxlbmd0aCA+IDEpIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcInVybChydWxlKSBhZGQocnVsZU9iaikg5Y+q6IO95LqM6YCJ5LiA77yBXFxcIilcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICghdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdIHx8ICghdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdLmxpc3RSdWxlICYmICF0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF1bJ+S4gOe6p+WIhuexuyddKSkge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+35YWI6LCD55SoIGxpc3QocnVsZSkg5oiWIOS4gOe6p+WIhuexuyhydWxlKSDlrprkvY3kuIDnuqfliIbnsbtcXFwiKVxcbiAgICAgICAgfVxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdLnVybFJ1bGUgPSBydWxlXFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF1bJ+WIhuexu+mTvuaOpSddID0gdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdLnVybFJ1bGVcXG4gICAgICAgIHJldHVybiB0aGlzXFxuICAgIH0sXFxuICAgIC8qKlxcbiAgICAgKiDmmK/lkKblvIDlkK/mipjlj6Dlip/og71cXG4gICAgICpcXG4gICAgICogQHBhcmFtIGVuYWJsZWQgdHJ1ZSDooajnpLrlvIDlkK/vvIxmYWxzZSDooajnpLrnpoHnlKhcXG4gICAgICogQHJldHVybnMge0NhdGVnb3JpZXNIZWFkZXJ9XFxuICAgICAqL1xcbiAgICBmb2xkSW5uZXIoZW5hYmxlZCkge1xcbiAgICAgICAgaWYgKCEodHlwZW9mIChlbmFibGVkKSA9PT0gJ2Jvb2xlYW4nKSkge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+35Lyg5YWlIHRydWUg5oiWIGZhbHNlIOihqOekuuW8gOWQr+aIluWFs+mXreaKmOWPoOWKn+iDve+8gVxcXCIpXFxuICAgICAgICB9XFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5tRm9sZElubmVyRW5hYmxlXSA9IGVuYWJsZWRcXG4gICAgICAgIHJldHVybiB0aGlzXFxuICAgIH0sXFxuICAgIC8qKlxcbiAgICAgKiDku47nrKwgaW5kZXgg6KGM5byA5aeL5oqY5Y+gXFxuICAgICAqXFxuICAgICAqIEBwYXJhbSBpbmRleCDlvIDlp4vmipjlj6DnmoTooYzmlbBcXG4gICAgICogQHJldHVybnMge0NhdGVnb3JpZXNIZWFkZXJ9XFxuICAgICAqL1xcbiAgICBmb2xkSW5kZXgoaW5kZXgpIHtcXG4gICAgICAgIGlmICghKHR5cGVvZiAoaW5kZXgpID09PSAnbnVtYmVyJykpIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuW8gOWni+aKmOWPoOihjOivt+S8oOWFpeaVsOWtl++8gVxcXCIpXFxuICAgICAgICB9XFxuICAgICAgICBpZiAoaW5kZXggPCAxKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLlvIDlp4vmipjlj6DooYzor7fkvKDlhaXlpKfkuo4gMCDnmoTmlbTmlbDvvIFcXFwiKVxcbiAgICAgICAgfVxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRJbmRleF0gPSBpbmRleCB8fCAxO1xcbiAgICAgICAgcmV0dXJuIHRoaXNcXG4gICAgfSxcXG4gICAgLyoqXFxuICAgICAqIOaKmOWPoOaMiemSrueahOeVjOmdolxcbiAgICAgKlxcbiAgICAgKiBAcGFyYW0gbGF5b3V0IOS4jiBkLnB1c2gg57uT5p6E5LiA6Ie077yMXFxuICAgICAqICAgICAgICDkvovvvJp7IHRpdGxlOlxcXCLmoIfpopgxXFxcIiwgdXJsOlxcXCJ4eHhcXFwiLCBjb2xfdHlwZTpcXFwic2Nyb2xsX2J1dHRvblxcXCIgfTtcXG4gICAgICogICAgICAgIOWPguaVsOmHh+eUqOWPr+mAieimhuebluaooeW8j++8jOS4jeWGmeeahOWPguaVsOWImeS9v+eUqOm7mOiupDtcXG4gICAgICogICAgICAgIOavlOWmguS8oOWFpSB7IGNvbF90eXBlOlxcXCJ0ZXh0XzFcXFwiIH3vvIzpgqPmnIDnu4jnu5PmnpzlsLHmmK8geyB0aXRsZTpcXFwi5qCH6aKYMVxcXCIsIHVybDpcXFwieHh4XFxcIiwgY29sX3R5cGU6XFxcInRleHRfMVxcXCIgfVxcbiAgICAgKiBAcmV0dXJucyB7Q2F0ZWdvcmllc0hlYWRlcn1cXG4gICAgICovXFxuICAgIGZvbGRMYXlvdXQobGF5b3V0KSB7XFxuICAgICAgICBpZiAodHlwZW9mIGxheW91dCA9PT0gJ29iamVjdCcpIHtcXG4gICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKGxheW91dClcXG4gICAgICAgICAgICBsZXQgaW5qZWN0SW5kZXggPSBsYXlvdXQuaW5qZWN0SW5kZXggfHwgbGF5b3V0Wyfmipjlj6DmjInpkq7mj5LlhaXooYwnXVxcbiAgICAgICAgICAgIGlmIChsYXlvdXQudGl0bGUgfHwgbGF5b3V0LnVybCB8fCBsYXlvdXQuY29sX3R5cGUgfHwgaW5qZWN0SW5kZXgpIHtcXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldXFxuICAgICAgICAgICAgICAgICAgICB0aGlzW3N5bWJvbE1hcC5tRm9sZExheW91dF1ba2V5XSA9IGxheW91dFtrZXldO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLor7fkvKDlhaXmraPnoa7nmoTmipjlj6DnlYzpnaLlhYPntKDvvIFcXFwiKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAvLyBpbmplY3RJbmRleCDmipjlj6DmjInpkq7mj5LlhaXnrKwgaW5qZWN0SW5kZXgg6KGMXFxuICAgICAgICAgICAgaWYgKGluamVjdEluZGV4KSB7XFxuICAgICAgICAgICAgICAgIGlmICghKHR5cGVvZiAoaW5qZWN0SW5kZXgpID09PSAnbnVtYmVyJykpIHtcXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi5oqY5Y+g5oyJ6ZKu5o+S5YWl6KGM6K+35Lyg5YWl5pWw5a2X77yBXFxcIilcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAoaW5qZWN0SW5kZXggPCAxKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuaKmOWPoOaMiemSruaPkuWFpeihjOivt+S8oOWFpeWkp+S6jiAwIOeahOaVtOaVsO+8gVxcXCIpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKGluamVjdEluZGV4ID4gdGhpc1tzeW1ib2xNYXAubUZvbGRJbmRleF0pIHtcXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi5oqY5Y+g5oyJ6ZKu5o+S5YWl6KGM5LiN5b6X5aSn5LqO5pi+56S65oqY5Y+g6KGM5pWw77yB6K+36LCD55SoIC5mb2xkSW5kZXgoaW5kZXgpIOaIliAu56ys5Yeg6KGM5byA5aeL5oqY5Y+gKGluZGV4KSDkvKDlhaXmraPnoa7nmoTmmL7npLrmipjlj6DooYzmlbBcXFwiKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1Gb2xkTGF5b3V0XS5pbmplY3RJbmRleCA9IGluamVjdEluZGV4IHx8IDE7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuivt+S8oOWFpeato+ehrueahOaKmOWPoOeVjOmdouWFg+e0oO+8gVxcXCIpXFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgLy8g5b2T5YmN5piv5ZCm5oqY5Y+gXFxuICAgIGZvbGQoaXNGb2xkKSB7XFxuICAgICAgICBpZiAodHlwZW9mIChpc0ZvbGQpID09PSAnc3RyaW5nJykge1xcbiAgICAgICAgICAgIGlzRm9sZCA9IGlzRm9sZCA9PT0gJzEnXFxuICAgICAgICB9XFxuICAgICAgICBpZiAoaXNGb2xkKSB7XFxuICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRdID0gJzEnO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB0aGlzW3N5bWJvbE1hcC5tRm9sZF0gPSAnMCc7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gdGhpc1xcbiAgICB9LFxcbiAgICBjb2xvcihtQ29sb3IpIHtcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLm1Db2xvcl0gPSBtQ29sb3JcXG4gICAgICAgIHJldHVybiB0aGlzXFxuICAgIH0sXFxuICAgIHRhZyhtVGFnKSB7XFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5tVGFnXSA9IG1UYWdcXG4gICAgICAgIHJldHVybiB0aGlzXFxuICAgIH0sXFxuICAgIGFkZChydWxlT2JqKSB7XFxuICAgICAgICAvLyBsb2coJC5zdHJpbmdpZnkocnVsZU9iaikpXFxuICAgICAgICBpZiAocnVsZU9iai5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHtcXG4gICAgICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF0gPSB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF0uY29uY2F0KHJ1bGVPYmopXFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XS5wdXNoKHJ1bGVPYmopXFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgZXZhbEpTUnVsZShpdGVtLCBqc1J1bGUpIHtcXG4gICAgICAgIGxldCBydWxlID0ganNSdWxlLnJlcGxhY2UoXFxcIkBqczpcXFwiLCBcXFwiXFxcIilcXG4gICAgICAgIHJ1bGUgPSBydWxlLnRyaW0oKVxcbiAgICAgICAgLy8gbG9nKCQuc3RyaW5naWZ5KHJ1bGUpKVxcbiAgICAgICAgbGV0IGlucHV0ID0gaXRlbVxcbiAgICAgICAgaWYgKHJ1bGUuc3RhcnRzV2l0aChcXFwiKFxcXCIpKSB7XFxuICAgICAgICAgICAgZXZhbCgncmVzdWx0ID0gJyArIHJ1bGUpXFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIOi/mOWOn+aIkCAkLnRvU3RyaW5nKC4uLikg55qE5pyA57uI57uT5p6c77yM6L6+5Yiw5pyA57uI5aSE55CG5pa55byP6Lef5LiK6Z2i55qEIGlmIOS4gOiHtOeahOebrueahFxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGV2YWwoJ3Jlc3VsdCA9ICcgKyAnKCgpID0+IHsnICsgcnVsZSArICd9KSgpJylcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiAocmVzdWx0IHx8ICcnKVxcbiAgICB9LFxcbiAgICBnZXRUaXRsZShzcmMsIGNhdGVnb3J5KSB7XFxuICAgICAgICBsZXQgdGl0bGUgPSAnJ1xcbiAgICAgICAgbGV0IHRpdGxlUnVsZSA9IGNhdGVnb3J5LnRpdGxlUnVsZSB8fCAnYSYmVGV4dCdcXG4gICAgICAgIGlmICh0aXRsZVJ1bGUuc3RhcnRzV2l0aChcXFwiQGpzOlxcXCIpKSB7XFxuICAgICAgICAgICAgdGl0bGUgPSB0aGlzLmV2YWxKU1J1bGUoc3JjLCB0aXRsZVJ1bGUpXFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHRpdGxlID0gcGFyc2VEb21Gb3JIdG1sKHNyYywgdGl0bGVSdWxlKVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHRpdGxlIHx8IFxcXCJcXFwiO1xcbiAgICB9LFxcbiAgICBnZXRVcmwoc3JjLCBjYXRlZ29yeSkge1xcbiAgICAgICAgbGV0IHVybCA9ICcnXFxuICAgICAgICBsZXQgdXJsUnVsZSA9IGNhdGVnb3J5LnVybFJ1bGUgfHwgJ2EmJmhyZWYnXFxuICAgICAgICBpZiAodHlwZW9mIHVybFJ1bGUgPT09ICdvYmplY3QnKSB7XFxuICAgICAgICAgICAgbGV0IG1VcmxSdWxlID0gdXJsUnVsZS5ydWxlIHx8IHVybFJ1bGVbJ+ino+aekOinhOWImSddIHx8ICdhJiZocmVmJztcXG4gICAgICAgICAgICBpZiAobVVybFJ1bGUuc3RhcnRzV2l0aChcXFwiQGpzOlxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIHVybCA9IHRoaXMuZXZhbEpTUnVsZShzcmMsIG1VcmxSdWxlKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBsZXQgcGFyc2UgPSBwYXJzZURvbTtcXG4gICAgICAgICAgICAgICAgaWYgKHVybFJ1bGUucGFyc2VPcHRpb24pIHtcXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodXJsUnVsZS5wYXJzZU9wdGlvbikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcInBhcnNlRG9tXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCJwZFxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlID0gcGFyc2VEb207XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcInBhcnNlRG9tRm9ySHRtbFxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwicGRmaFxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlID0gcGFyc2VEb21Gb3JIdG1sO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZSA9IHBhcnNlRG9tO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHVybFJ1bGVbXFxcIuino+aekOaWueazlVxcXCJdKSB7XFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHVybFJ1bGVbXFxcIuino+aekOaWueazlVxcXCJdKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwicGFyc2VEb21cXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcInBkXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2UgPSBwYXJzZURvbTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwicGFyc2VEb21Gb3JIdG1sXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCJwZGZoXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2UgPSBwYXJzZURvbUZvckh0bWw7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlID0gcGFyc2VEb207XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgdXJsID0gcGFyc2Uoc3JjLCBtVXJsUnVsZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmICh1cmxSdWxlLmRlYWxVcmwpIHtcXG4gICAgICAgICAgICAgICAgdXJsID0gdXJsUnVsZS5kZWFsVXJsKHVybClcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHVybFJ1bGVbJ+S6jOasoeWkhOeQhiddKSB7XFxuICAgICAgICAgICAgICAgIHVybCA9IHVybFJ1bGVbJ+S6jOasoeWkhOeQhiddKHVybClcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGlmICh1cmxSdWxlLnN0YXJ0c1dpdGgoXFxcIkBqczpcXFwiKSkge1xcbiAgICAgICAgICAgICAgICB1cmwgPSB0aGlzLmV2YWxKU1J1bGUoc3JjLCB1cmxSdWxlKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB1cmwgPSBwYXJzZURvbShzcmMsIHVybFJ1bGUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB1cmwgfHwgXFxcIlxcXCI7XFxuICAgIH0sXFxuICAgIGJ1aWxkKCkge1xcbiAgICAgICAgLy8g5qOA5rWL5piv5ZCm5Lyg5YWl6ZyA6KaB55qE5Y+C5pWwXFxuICAgICAgICB0aGlzLmNoZWNrUGFyYW1zKClcXG4gICAgICAgIC8vIOavj+S4gOS4quWIhuexu+eahOWUr+S4gOagh+ivhlxcbiAgICAgICAgbGV0IG1UYWcgPSB0aGlzW3N5bWJvbE1hcC5tVGFnXSB8fCBcXFwiXFxcIlxcbiAgICAgICAgLy/nv7vpobUg6ZyA6KaB5qC55o2u5a6e6ZmF5pu/5o2iXFxuICAgICAgICBjb25zdCBodG1sID0gdGhpc1tzeW1ib2xNYXAuc3JjXSB8fCByZXF1ZXN0KHRoaXNbc3ltYm9sTWFwLnRydWVfdXJsXSlcXG4gICAgICAgIGNvbnN0IGVtcHR5ID0gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICAvL+iOt+WPluWIl+ihqFxcbiAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFtdXFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF0ubWFwKHJ1bGVPYmogPT4ge1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0gW11cXG4gICAgICAgICAgICBsZXQgbGlzdFJ1bGUgPSBydWxlT2JqLmxpc3RSdWxlIHx8IHJ1bGVPYmpbXFxcIuS4gOe6p+WIhuexu1xcXCJdXFxuICAgICAgICAgICAgaWYgKGxpc3RSdWxlLnN0YXJ0c1dpdGgoXFxcIkBqczpcXFwiKSkge1xcbiAgICAgICAgICAgICAgICAvLyBsb2coJC5zdHJpbmdpZnkobGlzdFJ1bGUpKVxcbiAgICAgICAgICAgICAgICBsaXN0ID0gdGhpcy5ldmFsSlNSdWxlKGh0bWwsIGxpc3RSdWxlKVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGxpc3QgPSBwYXJzZURvbUZvckFycmF5KGh0bWwsIGxpc3RSdWxlKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAvLyBsb2cobGlzdClcXG4gICAgICAgICAgICBsaXN0Lm1hcChjYXRlZ29yeSA9PiB7XFxuICAgICAgICAgICAgICAgIGNhdGVnb3JpZXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICBsaXN0OiBjYXRlZ29yeSxcXG4gICAgICAgICAgICAgICAgICAgIHN1Ykxpc3RSdWxlOiBydWxlT2JqLnN1Ykxpc3RSdWxlIHx8IHJ1bGVPYmpbXFxcIuWtkOWIhuexu1xcXCJdLFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVSdWxlOiBydWxlT2JqLnRpdGxlUnVsZSB8fCBydWxlT2JqW1xcXCLliIbnsbvmoIfpophcXFwiXSxcXG4gICAgICAgICAgICAgICAgICAgIHVybFJ1bGU6IHJ1bGVPYmoudXJsUnVsZSB8fCBydWxlT2JqW1xcXCLliIbnsbvpk77mjqVcXFwiXSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSlcXG4gICAgICAgIH0pXFxuXFxuICAgICAgICAvLyBsb2coJC5zdHJpbmdpZnkoY2F0ZWdvcmllcykpXFxuXFxuICAgICAgICBsZXQgaW5pdF9jYXRlID0gW11cXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjA7IGkrKykge1xcbiAgICAgICAgICAgIGluaXRfY2F0ZS5wdXNoKFxcXCIwXFxcIilcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGNvbnN0IGNhdGVfdGVtcF9qc29uID0gZ2V0TXlWYXIobVRhZyArIHRoaXMuVkFSTUFQLkNBVEVHT1JZLCBKU09OLnN0cmluZ2lmeShpbml0X2NhdGUpKVxcbiAgICAgICAgY29uc3QgY2F0ZV90ZW1wID0gSlNPTi5wYXJzZShjYXRlX3RlbXBfanNvbilcXG5cXG4gICAgICAgIGlmICh0aGlzW3N5bWJvbE1hcC5tUGFnZV0gPT09IDEpIHtcXG5cXG4gICAgICAgICAgICBjYXRlZ29yaWVzLmZvckVhY2goKGNhdGVnb3J5LCBpbmRleCkgPT4ge1xcblxcbiAgICAgICAgICAgICAgICAvLyDmipjlj6AgVUlcXG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbc3ltYm9sTWFwLm1Gb2xkSW5uZXJFbmFibGVdICYmIHRoaXNbc3ltYm9sTWFwLm1Gb2xkTGF5b3V0XS5pbmplY3RJbmRleCA9PT0gKGluZGV4KzEpKSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgZm9sZExheW91dCA9IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpc1tzeW1ib2xNYXAubUZvbGRMYXlvdXRdLnRpdGxlIHx8ICh0aGlzW3N5bWJvbE1hcC5tRm9sZF0gPT09ICcxJyA/ICfigJzigJzigJ3igJ08Yj48c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNGRjAwMDBcXFwiPuKIqDwvc3Bhbj48L2I+JyA6ICfigJzigJzigJ3igJ08Yj48c3BhbiBzdHlsZT1cXFwiY29sb3I6ICMxYWFkMTlcXFwiPuKIpzwvc3Bhbj48L2I+JyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0aGlzW3N5bWJvbE1hcC5tRm9sZExheW91dF0udXJsIHx8ICQoXFxcImhpa2VyOi8vZW1wdHkjbm9IaXN0b3J5I1xcXCIpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIocGFyYW1zLm1UYWcgKyBwYXJhbXMuVkFSTUFQLkZPTEQsIGdldE15VmFyKHBhcmFtcy5tVGFnICsgcGFyYW1zLlZBUk1BUC5GT0xELCBwYXJhbXMuaXNGb2xkKSA9PT0gJzEnID8gJzAnIDogJzEnKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UYWc6IG1UYWcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRm9sZDogdGhpc1tzeW1ib2xNYXAubUZvbGRdLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJNQVA6IHRoaXMuVkFSTUFQXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IHRoaXNbc3ltYm9sTWFwLm1Gb2xkTGF5b3V0XS5jb2xfdHlwZSB8fCBcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB0aGlzW3N5bWJvbE1hcC5tTGF5b3V0XS5wdXNoKGZvbGRMYXlvdXQpXFxuICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgICAgLy/lhbfkvZPliJfooajkuIvnmoTliIbnsbtcXG4gICAgICAgICAgICAgICAgbGV0IHN1Yl9jYXRlZ29yaWVzID0gW107XFxuICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeS5zdWJMaXN0UnVsZS5zdGFydHNXaXRoKFxcXCJAanM6XFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzID0gdGhpcy5ldmFsSlNSdWxlKGNhdGVnb3J5Lmxpc3QsIGNhdGVnb3J5LnN1Ykxpc3RSdWxlKVxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgc3ViX2NhdGVnb3JpZXMgPSBwYXJzZURvbUZvckFycmF5KGNhdGVnb3J5Lmxpc3QsIGNhdGVnb3J5LnN1Ykxpc3RSdWxlKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAodGhpc1tzeW1ib2xNYXAubUZvbGRJbmRleF0gfHwgMSkpIHtcXG4gICAgICAgICAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHRoaXMuZ2V0VGl0bGUoaXRlbSwgY2F0ZWdvcnkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IHRoaXMuZ2V0VXJsKGl0ZW0sIGNhdGVnb3J5KVxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1MYXlvdXRdLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZToga2V5LnRvU3RyaW5nKCkgPT09IGNhdGVfdGVtcFtpbmRleF0gPyAn4oCc4oCc4oCd4oCdPGI+PGZvbnQgY29sb3I9JyArIHRoaXNbc3ltYm9sTWFwLm1Db2xvcl0gKyAnPicgKyB0aXRsZSArICcgPC9mb250PjwvYj4nIDogdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJCh1cmwpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdfY2F0ZSA9IFtdXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmluZGV4ID09PSAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNhdGVfdGVtcC5mb3JFYWNoKChjYXRlLCBpbmRleCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfY2F0ZS5wdXNoKGluZGV4ID09PSAwID8gcGFyYW1zLmtleS50b1N0cmluZygpIDogXFxcIjBcXFwiKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2F0ZV90ZW1wW3BhcmFtcy5pbmRleF0gPSBwYXJhbXMua2V5LnRvU3RyaW5nKClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhcmFtcy50YWcgKyBwYXJhbXMuVkFSTUFQLkNBVEVHT1JZLCBKU09OLnN0cmluZ2lmeShwYXJhbXMuaW5kZXggPT09IDAgPyBuZXdfY2F0ZSA6IHBhcmFtcy5jYXRlX3RlbXApKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIocGFyYW1zLnRhZyArIHBhcmFtcy5WQVJNQVAuVVJMLCBpbnB1dClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVfdGVtcDogY2F0ZV90ZW1wLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSTUFQOiB0aGlzLlZBUk1BUCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZzogbVRhZyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleToga2V5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogdGhpc1tzeW1ib2xNYXAubVBhZ2VdLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1MYXlvdXRdLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYmxhbmtfYmxvY2tcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzW3N5bWJvbE1hcC5tRm9sZF0gPT09ICcwJykge1xcbiAgICAgICAgICAgICAgICAgICAgc3ViX2NhdGVnb3JpZXMuZm9yRWFjaCgoaXRlbSwga2V5KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gdGhpcy5nZXRUaXRsZShpdGVtLCBjYXRlZ29yeSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gdGhpcy5nZXRVcmwoaXRlbSwgY2F0ZWdvcnkpXFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUxheW91dF0ucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBrZXkudG9TdHJpbmcoKSA9PT0gY2F0ZV90ZW1wW2luZGV4XSA/ICfigJzigJzigJ3igJ08Yj48Zm9udCBjb2xvcj0nICsgdGhpc1tzeW1ib2xNYXAubUNvbG9yXSArICc+JyArIHRpdGxlICsgJyA8L2ZvbnQ+PC9iPicgOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKHVybCkubGF6eVJ1bGUoKHBhcmFtcykgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNhdGVfdGVtcFtwYXJhbXMuaW5kZXhdID0gcGFyYW1zLmtleS50b1N0cmluZygpXFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihwYXJhbXMudGFnICsgcGFyYW1zLlZBUk1BUC5DQVRFR09SWSwgSlNPTi5zdHJpbmdpZnkocGFyYW1zLmNhdGVfdGVtcCkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihwYXJhbXMudGFnICsgcGFyYW1zLlZBUk1BUC5VUkwsIGlucHV0KVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZV90ZW1wOiBjYXRlX3RlbXAsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJNQVA6IHRoaXMuVkFSTUFQLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnOiBtVGFnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBrZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiB0aGlzW3N5bWJvbE1hcC5tUGFnZV0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUxheW91dF0ucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCJcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH0sXFxuXFxuICAgIOeVjOmdoihsYXlvdXQpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dChsYXlvdXQpXFxuICAgIH0sXFxuICAgIOWIhuexu+mTvuaOpSh0cnVlVXJsKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy50cnVlVXJsKHRydWVVcmwpO1xcbiAgICB9LFxcbiAgICDpobXnoIEocGFnZSkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnZShwYWdlKTtcXG4gICAgfSxcXG4gICAg5rqQ56CBKGh0bWwpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmh0bWwoaHRtbCk7XFxuICAgIH0sXFxuICAgIOWumuS9jeS4gOe6p+WIhuexuyhsaXN0KSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5saXN0KGxpc3QpO1xcbiAgICB9LFxcbiAgICDlrprkvY3lrZDliIbnsbsoc3ViTGlzdCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ViTGlzdChzdWJMaXN0KTtcXG4gICAgfSxcXG4gICAg5a6a5L2N5YiG57G75qCH6aKYKHRpdGxlKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy50aXRsZSh0aXRsZSk7XFxuICAgIH0sXFxuICAgIOWumuS9jeWIhuexu+mTvuaOpSh1cmwpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLnVybCh1cmwpO1xcbiAgICB9LFxcbiAgICDlvIDlkK/lhoXnva7mipjlj6Dlip/og70oKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5mb2xkSW5uZXIodHJ1ZSk7XFxuICAgIH0sXFxuICAgIOWFs+mXreWGhee9ruaKmOWPoOWKn+iDvSgpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmZvbGRJbm5lcihmYWxzZSk7XFxuICAgIH0sXFxuICAgIOesrOWHoOihjOW8gOWni+aKmOWPoChpbmRleCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9sZEluZGV4KGluZGV4KTtcXG4gICAgfSxcXG4gICAg5oqY5Y+g5oyJ6ZKu5qC35byPKGxheW91dCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9sZExheW91dChsYXlvdXQpXFxuICAgIH0sXFxuICAgIOaKmOWPoChmb2xkKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5mb2xkKGZvbGQpO1xcbiAgICB9LFxcbiAgICDpgInkuK3nmoTliIbnsbvpopzoibIoY29sb3IpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmNvbG9yKGNvbG9yKTtcXG4gICAgfSxcXG4gICAg5ZSv5LiA5qCH6K+GKG1UYWcpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLnRhZyhtVGFnKVxcbiAgICB9LFxcbiAgICDmt7vliqDliIbnsbvlrprkvY0ocnVsZU9iaikge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkKHJ1bGVPYmopO1xcbiAgICB9LFxcbiAgICDlvIDlp4vmiZPpgKDliIbnsbsoKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5idWlsZCgpO1xcbiAgICB9LFxcblxcbn0pXFxuJC5leHBvcnRzID0gbmV3IENhdGVnb3JpZXNIZWFkZXIoKTtcXG4kLmV4cG9ydHNcXG5cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIumTvuaOpeWkhOeQhlvkuoxdKlwiLFwicGF0aFwiOlwidXJsLXByb2Nlc3NvclwiLFwicnVsZVwiOlwiLyoqXFxuICog5pys5Zyw572R6aG15o+S5Lu26ZO+5o6lIGhpa2VyOi8vZmlsZXMvcnVsZXMvanMvVXJsUHJvY2Vzc29yLmpzXFxuICog5a2Q6aG16Z2i6ZO+5o6lIGhpa2VyOi8vcGFnZS91cmwtcHJvY2Vzc29yXFxuICog6YGT6ZW/5LuT5bqT6ZO+5o6lIGh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTI4NDlcXG4gKiDnoIHkupEgR2l0ZWUg6ZO+5o6lIGh0dHBzOi8vZ2l0ZWUuY29tL3JlYm9ybjAvSGlrZXJSdWxlcy9yYXcvbWFzdGVyL3BsdWdpbnMvVXJsUHJvY2Vzc29yLmpzXFxuICovXFxuZnVuY3Rpb24gVXJsUHJvY2Vzc29yKCkge1xcbiAgICB0aGlzLnBhcmFtcyA9IHt9XFxuICAgIHRoaXMucmVnZXhNYXAgPSBbXFxuICAgICAgICB7XFxuICAgICAgICAgICAgcmVnOiAnKHZvZHR5cGV8dmlkZW90KVxcXFxcXFxcL1xcXFxcXFxcdysnLFxcbiAgICAgICAgICAgIGV4ZWM6ICgpID0+IHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1zLnVybFxcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLy1cXFxcZCsuaHRtbC8sICctJyArIHRoaXMucGFyYW1zLnBhZ2UgKyAnLmh0bWwnKVxcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLygodm9kdHlwZXx2aWRlb3QpXFxcXC9cXFxcdyspLmh0bWwvLCAnJDEtJyArIHRoaXMucGFyYW1zLnBhZ2UgKyAnLmh0bWwnKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuICAgICAgICB7XFxuICAgICAgICAgICAgcmVnOiAnXFxcXFxcXFwvP1tcXFxcXFxcXHdcXFxcXFxcXGRdKy0uKj8tLio/LS4qPy0uKj8tLio/LS4qPy0uKj8tXFxcXFxcXFxkKi0tLVxcXFxcXFxcZCouaHRtbCcsXFxuICAgICAgICAgICAgZXhlYzogKCkgPT4ge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJhbXMudXJsXFxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXGQqKC0tLS5odG1sKS8sIHRoaXMucGFyYW1zLnBhZ2UgKyAnJDEnKVxcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLygtLS1cXFxcZCsuaHRtbCkvLCB0aGlzLnBhcmFtcy5wYWdlICsgJyQxJyk7IC8vIOaLvOaOpemhteeggVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuICAgICAgICB7XFxuICAgICAgICAgICAgcmVnOiAnKChcXFxcXFxcXC92b2RcXFxcXFxcXC9zaG93KT8oXFxcXFxcXFwvYXJlYVxcXFxcXFxcL1tcXFxcXFxcXHdcXFxcXFxcXGQlXSspPyhcXFxcXFxcXC9ieVxcXFxcXFxcL1tcXFxcXFxcXHdcXFxcXFxcXGQlXSspPyhcXFxcXFxcXC9pZFxcXFxcXFxcL1xcXFxcXFxcZCspPyhcXFxcXFxcXC9sZXR0ZXJcXFxcXFxcXC9bXFxcXFxcXFx3XFxcXFxcXFxkJV0rKT8pKFxcXFxcXFxcL3BhZ2VcXFxcXFxcXC9cXFxcXFxcXGQrKT8oXFxcXFxcXFwveWVhclxcXFxcXFxcL1xcXFxcXFxcZCspP1xcXFxcXFxcLmh0bWwnLFxcbiAgICAgICAgICAgIGV4ZWM6ICgpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IHJlZ0V4cCA9IC8oKFxcXFwvdm9kXFxcXC9zaG93KT8oXFxcXC9hcmVhXFxcXC9bXFxcXHdcXFxcZCVdKyk/KFxcXFwvYnlcXFxcL1tcXFxcd1xcXFxkJV0rKT8oXFxcXC9pZFxcXFwvXFxcXGQrKT8oXFxcXC9sZXR0ZXJcXFxcL1tcXFxcd1xcXFxkJV0rKT8pKFxcXFwvcGFnZVxcXFwvXFxcXGQrKT8oXFxcXC95ZWFyXFxcXC9cXFxcZCspP1xcXFwuaHRtbC9cXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1zLnVybFxcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UocmVnRXhwLCAnJDEnICsgKFxcXCIvcGFnZS9cXFwiICsgdGhpcy5wYXJhbXMucGFnZSkgKyAnJDgnICsgXFxcIi5odG1sXFxcIilcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIF1cXG59XFxuXFxuT2JqZWN0LmFzc2lnbihVcmxQcm9jZXNzb3IucHJvdG90eXBlLCB7XFxuICAgIGNvbnN0cnVjdG9yOiBVcmxQcm9jZXNzb3IsXFxuICAgIGNoZWNrUGFyYW1zKCkge1xcbiAgICAgICAgaWYgKCF0aGlzLnBhcmFtcy51cmwpIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuivt+WFiOiwg+eUqCAuYmFzZVVybCh1cmwpIOS8oOWFpemTvuaOpei/m+ihjOWIneWni+WMliFcXFwiKVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKCF0aGlzLnBhcmFtcy5wYWdlKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLor7flhYjosIPnlKggLnBhZ2UocGFnZSkg5Lyg5YWl6aG156CB6L+b6KGM5Yid5aeL5YyWIVxcXCIpXFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIGJhc2VVcmwodXJsKXtcXG4gICAgICAgIHRoaXMucGFyYW1zLnVybCA9IHVybFxcbiAgICAgICAgcmV0dXJuIHRoaXNcXG4gICAgfSxcXG4gICAgcGFnZShwYWdlKXtcXG4gICAgICAgIHRoaXMucGFyYW1zLnBhZ2UgPSBwYWdlXFxuICAgICAgICByZXR1cm4gdGhpc1xcbiAgICB9LFxcbiAgICBhZGRFeHRyYShyZWdFeHApIHtcXG4gICAgICAgIGlmIChyZWdFeHAuY29uc3RydWN0b3IgPT09IEFycmF5KSB7XFxuICAgICAgICAgICAgdGhpcy5yZWdleE1hcCA9IHRoaXMucmVnZXhNYXAuY29uY2F0KHJlZ0V4cClcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdGhpcy5yZWdleE1hcC5wdXNoKHJlZ0V4cClcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBkZWJ1ZygpIHtcXG4gICAgICAgIHRoaXMucGFyYW1zLmRlYnVnID0gdHJ1ZVxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIGV4ZWMoKSB7XFxuICAgICAgICB0aGlzLmNoZWNrUGFyYW1zKClcXG4gICAgICAgIGxldCB0cnVlX3VybCA9ICcnXFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmVnZXhNYXAubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICBsZXQgcmVnT2JqID0gdGhpcy5yZWdleE1hcFtpXTtcXG4gICAgICAgICAgICBsZXQgdXJsRXhwID0gcmVnT2JqLnJlZztcXG4gICAgICAgICAgICBpZiAodHlwZW9mIHVybEV4cCA9PT0gJ3N0cmluZycpIHtcXG4gICAgICAgICAgICAgICAgdXJsRXhwID0gbmV3IFJlZ0V4cCh1cmxFeHApXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmICh1cmxFeHAudGVzdCh0aGlzLnBhcmFtcy51cmwpKSB7XFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtcy5kZWJ1Zykge1xcbiAgICAgICAgICAgICAgICAgICAgbG9nKHVybEV4cC50b1N0cmluZygpKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHRydWVfdXJsID0gcmVnT2JqLmV4ZWMoKTtcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHRydWVfdXJsKSB7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWVfdXJsO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJhbXMudXJsXFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIOiOt+WPluWkhOeQhue7k+aenCgpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmV4ZWMoKVxcbiAgICB9LFxcbiAgICDpk77mjqUodXJsKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5iYXNlVXJsKHVybClcXG4gICAgfSxcXG4gICAg6aG156CBKHBhZ2UpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2UocGFnZSlcXG4gICAgfSxcXG4gICAg5o+S5YWl5paw5aSE55CG6KeE5YiZKHJlZ0V4cCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRXh0cmEocmVnRXhwKVxcbiAgICB9LFxcbiAgICDosIPor5XmqKHlvI8oKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5kZWJ1ZygpO1xcbiAgICB9XFxufSlcXG4kLmV4cG9ydHM9bmV3IFVybFByb2Nlc3NvcigpXFxuJC5leHBvcnRzXFxuXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLkuIDnuqcqXCIsXCJwYXRoXCI6XCJ5anRvb2xcIixcInJ1bGVcIjpcImZ1bmN0aW9uIGNvbnZlcnQxKHN0cikge1xcbiAgICBsZXQgYyA9IHN0ci5zcGxpdChcXFwiO1xcXCIpXFxuICAgIHJldHVybiB7XFxuICAgICAgICDliJfooag6IGNbMF0sXFxuICAgICAgICDmoIfpopg6IGNbMV0sXFxuICAgICAgICDlm77niYc6IGNbMl0sXFxuICAgICAgICDmj4/ov7A6IGNbM10sXFxuICAgICAgICDpk77mjqU6IGNbNF1cXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBtZXJnZShzb3VyY2UsIHRhcmdldCkge1xcbiAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSlcXG4gICAgZm9yIChsZXQgaSBpbiBrZXlzKSB7XFxuICAgICAgICB0YXJnZXRba2V5c1tpXV0gPSBzb3VyY2Vba2V5c1tpXV1cXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiDkuIDnuqcob2JqKSB7XFxuICAgIHZhciBkID0gW107XFxuICAgIGlmICgkLnR5cGUob2JqKSA9PSBcXFwic3RyaW5nXFxcIikge1xcbiAgICAgICAgb2JqID0gY29udmVydDEob2JqKVxcbiAgICB9XFxuICAgIGlmIChvYmou6KeE5YiZKSB7XFxuICAgICAgICBsZXQgYyA9IGNvbnZlcnQxKG9iai7op4TliJkpXFxuICAgICAgICBtZXJnZShjLCBvYmopXFxuICAgIH1cXG4gICAgbGV0IGFyciA9IHBkZmEoZ2V0UmVzQ29kZSgpLCBvYmou5YiX6KGoKTtcXG4gICAgICAgaWYgKG9iai7liJfooajlpITnkIYgIT0gbnVsbCkge1xcbiAgICAgICAgICAgIGFyciA9IG9iai7pk77mjqXlpITnkIYoYXJyKVxcbiAgICAgICAgfVxcbiAgICBmb3IgKGxldCBpdCBvZiBhcnIpIHtcXG4gICAgICAgIGxldCB1cmwgPSBwZChpdCwgb2JqLumTvuaOpSlcXG4gICAgICAgIGlmIChvYmou6ZO+5o6l5aSE55CGICE9IG51bGwpIHtcXG4gICAgICAgICAgICB1cmwgPSBvYmou6ZO+5o6l5aSE55CGKHVybClcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBwaWMgPSBwZChpdCwgb2JqLuWbvueJhylcXG4gICAgICAgIGlmIChvYmou5Zu+54mH5aSE55CGICE9IG51bGwpIHtcXG4gICAgICAgICAgICBwaWMgPSBvYmou5Zu+54mH5aSE55CGKHBpYylcXG4gICAgICAgIH1cXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IHBkZmgoaXQsIG9iai7moIfpopgpLFxcbiAgICAgICAgICAgIHVybDogdXJsKycjYXV0b0NhY2hlIycsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIGRlc2M6IG9iai7mj4/ov7AgPyBwZGZoKGl0LCBvYmou5o+P6L+wKSA6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIHBpY191cmw6IHBpY1xcbiAgICAgICAgfSk7XFxuXFxuICAgIH1cXG4gICAgc2V0UmVzdWx0KGQpO1xcbn1cXG52YXIgdG9vbCA9IHtcXG4gICAg5LiA57qnOiDkuIDnuqdcXG59XFxuJC5leHBvcnRzID0gdG9vbFwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5LiA57qnW+S6jF0qXCIsXCJwYXRoXCI6XCJ5aWppXCIsXCJydWxlXCI6XCJmdW5jdGlvbiDkuIDnuqcoKSB7fTtcXHJcXG5PYmplY3QuYXNzaWduKOS4gOe6py5wcm90b3R5cGUsIHtcXHJcXG5cXHRjb25zdHJ1Y3Rvcjog5LiA57qnLFxcclxcblxcdHRlc3QoKSB7fSxcXHJcXG5cXHTojrflj5bmupDnoIEodXJsLCBoZWFkZXIpIHtyZXR1cm4gZmV0Y2godHJ1ZV91cmwsIHtoZWFkZXJzOiBoZWFkZXIgfHwgeydVc2VyLUFnZW50JzogUENfVUF9fSkgfSwvLyDpu5jorqTnu5/kuIDkvb/nlKhNT0JJTEVfVUFcXHJcXG5cXHTmkJzntKLmoYbmnrYocGFnZSkge1xcclxcblxcdFxcdGlmIChwYWdlID09ICcxJykge1xcbi8qXFxyXFxuXFx0XFx0XFx0ZC5wdXNoKHtcXHJcXG5cXHRcXHRcXHRcXHR0aXRsZTogXFxcIuaQnOe0ouacrOinhOWImVxcXCIsXFxyXFxuXFx0XFx0XFx0XFx0dXJsOiBcXFwiJ2hpa2VyOi8vc2VhcmNoP3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFwiJnM9JytpbnB1dFxcXCIsXFxyXFxuXFx0XFx0XFx0XFx0ZGVzYzogXFxcIiBcXFwiLFxcclxcblxcdFxcdFxcdFxcdGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiXFxyXFxuXFx0XFx0XFx0fSk7XFxuKi9cXHJcXG5cXHRcXHR9XFxyXFxuXFx0fSxcXHJcXG5cXHTojrflj5bpk77mjqUocGFnZSwgcmVnZXgpIHtcXHJcXG5cXHRcXHRsZXQgdHJ1ZV91cmwgPSBnZXRNeVZhcignaGVhZGVyLnVybCcsIE1ZX1VSTCk7XFxyXFxuXFx0XFx0Ly9sZXQg6ZO+5o6l5aSE55CG5bel5YW3ID0gcmVxdWlyZUNhY2hlKGNvbmZpZy7pk77mjqXlpITnkIblt6Xlhbfkvp3otZYpXFxyXFxuXFx0XFx0Ly9sZXQg6ZO+5o6l5aSE55CG5bel5YW3ID0gcmVxdWlyZUNhY2hlKCdodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD0yODQ5JylcXHJcXG5cXHRcXHQvL2xldCDpk77mjqXlpITnkIblt6XlhbcgPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS91cmwtcHJvY2Vzc29yJylcXHJcXG5cXHRcXHRsZXQg6ZO+5o6l5aSE55CG5bel5YW3ID0gcmVxdWlyZUNhY2hlKCdodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD0yODQ5JylcXHJcXG5cXHRcXHR0cnVlX3VybCA9IOmTvuaOpeWkhOeQhuW3peWFt1xcclxcblxcdFxcdFxcdC7pk77mjqUodHJ1ZV91cmwpXFxyXFxuXFx0XFx0XFx0LumhteeggShwYWdlKVxcclxcblxcdFxcdFxcdC7mj5LlhaXmlrDlpITnkIbop4TliJkocmVnZXggfHwgW10pXFxyXFxuXFx0XFx0XFx0LuiOt+WPluWkhOeQhue7k+aenCgpO1xcclxcblxcdFxcdHJldHVybiB0cnVlX3VybDtcXHJcXG5cXHR9LFxcclxcblxcdOaJk+mAoOWIhuexuyhydWxlTGlzdCkge1xcclxcblxcdFxcdC8vICBsZXQgaHRtbENhdGVnb3JpZXMgPSByZXF1aXJlQ2FjaGUoY29uZmlnLuWKqOaAgeWIhuexu+S+nei1lilcXHJcXG5cXHRcXHQvL2xldCBodG1sQ2F0ZWdvcmllcyA9IHJlcXVpcmVDYWNoZSgnaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9MjcwNScpXFxyXFxuXFx0XFx0aWYgKCFydWxlTGlzdCkge1xcclxcblxcdFxcdFxcdGxldCDliIbnsbvlrprkvY0gPSBbe1xcclxcblxcdFxcdFxcdFxcdFxcdOS4gOe6p+WIhuexuzog5LiA57qn5a6a5L2NQSxcXHJcXG5cXHRcXHRcXHRcXHRcXHTlrZDliIbnsbs6IOe7n+S4gOWumuS9jUIgfHwg5LiA57qn5a6a5L2NQixcXHJcXG5cXHRcXHRcXHRcXHRcXHTliIbnsbvpk77mjqU6IHvkuozmrKHlpITnkIYodXJsKSB7dHJ5IHtyZXR1cm4g5LiA57qn5aSE55CGQyh1cmwpfSBjYXRjaCAoZSkge3JldHVybiB1cmx9fX1cXHJcXG5cXHRcXHRcXHR9XVxcclxcblxcdFxcdFxcdGlmICjkuoznuqflrprkvY1BICYmICjnu5/kuIDlrprkvY1CIHx8IOS6jOe6p+WumuS9jUIpKSB7XFxyXFxuXFx0XFx0XFx0XFx05YiG57G75a6a5L2NLnB1c2goe1xcclxcblxcdFxcdFxcdFxcdFxcdFxcdOS4gOe6p+WIhuexuzog5LqM57qn5a6a5L2NQSxcXHJcXG5cXHRcXHRcXHRcXHRcXHRcXHTlrZDliIbnsbs6IOe7n+S4gOWumuS9jUIgfHwg5LqM57qn5a6a5L2NQixcXHJcXG5cXHRcXHRcXHRcXHRcXHRcXHTliIbnsbvpk77mjqU6IHvkuozmrKHlpITnkIYodXJsKSB7dHJ5IHtyZXR1cm4g5LqM57qn5aSE55CGQyh1cmwpfSBjYXRjaCAoZSkge3JldHVybiB1cmx9fX1cXHJcXG5cXHRcXHRcXHRcXHR9KVxcclxcblxcdFxcdFxcdH1cXHJcXG5cXHRcXHRcXHRpZiAo5LiJ57qn5a6a5L2NQSAmJiAo57uf5LiA5a6a5L2NQiB8fCDkuInnuqflrprkvY1CKSkge1xcclxcblxcdFxcdFxcdFxcdOWIhuexu+WumuS9jS5wdXNoKHtcXHJcXG5cXHRcXHRcXHRcXHRcXHRcXHTkuIDnuqfliIbnsbs6IOS4iee6p+WumuS9jUEsXFxyXFxuXFx0XFx0XFx0XFx0XFx0XFx05a2Q5YiG57G7OiDnu5/kuIDlrprkvY1CIHx8IOS4iee6p+WumuS9jUIsXFxyXFxuXFx0XFx0XFx0XFx0XFx0XFx05YiG57G76ZO+5o6lOiB75LqM5qyh5aSE55CGKHVybCkge3RyeSB7cmV0dXJuIOS4iee6p+WkhOeQhkModXJsKX0gY2F0Y2ggKGUpIHtyZXR1cm4gdXJsfX19XFxyXFxuXFx0XFx0XFx0XFx0fSlcXHJcXG5cXHRcXHRcXHR9XFxyXFxuXFx0XFx0XFx0aWYgKOWbm+e6p+WumuS9jUEgJiYgKOe7n+S4gOWumuS9jUIgfHwg5Zub57qn5a6a5L2NQikpIHtcXHJcXG5cXHRcXHRcXHRcXHTliIbnsbvlrprkvY0ucHVzaCh7XFxyXFxuXFx0XFx0XFx0XFx0XFx0XFx05LiA57qn5YiG57G7OiDlm5vnuqflrprkvY1BLFxcclxcblxcdFxcdFxcdFxcdFxcdFxcdOWtkOWIhuexuzog57uf5LiA5a6a5L2NQiB8fCDlm5vnuqflrprkvY1CLFxcclxcblxcdFxcdFxcdFxcdFxcdFxcdOWIhuexu+mTvuaOpToge+S6jOasoeWkhOeQhih1cmwpIHt0cnkge3JldHVybiDlm5vnuqflpITnkIZDKHVybCl9IGNhdGNoIChlKSB7cmV0dXJuIHVybH19fVxcclxcblxcdFxcdFxcdFxcdH0pXFxyXFxuXFx0XFx0XFx0fVxcclxcblxcdFxcdFxcdHJ1bGVMaXN0ID0g5YiG57G75a6a5L2NO1xcclxcblxcdFxcdH1cXHJcXG5cXHRcXHQvLyAnMCcg5Li66buY6K6k5LiN5oqY5Y+g77yMJzEnIOS4uum7mOiupOaKmOWPoFxcclxcblxcdFxcdGNvbnN0IOW9k+WJjeaKmOWPoOeKtuaAgSA9IGdldE15VmFyKCdoZWFkZXIuZm9sZCcsICcwJylcXHJcXG5cXHRcXHQvLyDlvJXlhaXliqjmgIHliIbnsbvkvp3otZZcXHJcXG5cXHRcXHRsZXQgaHRtbENhdGVnb3JpZXMgPSByZXF1aXJlQ2FjaGUoJ2h0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTI3MDUnKVxcclxcblxcdFxcdHZhciBnZXRSYW5nZUNvbG9ycyA9IGZ1bmN0aW9uKCkge1xcclxcblxcdFxcdFxcdHJldHVybiAnIycgKyAoJzAwMDAwJyArIChNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwIDw8IDApLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC02KTtcXHJcXG5cXHRcXHR9IC8vIOmaj+acuumAieS4reeahOWIhuexu+minOiJslxcclxcblxcdFxcdHZhciBjb2xvdXI7XFxyXFxuXFx0XFx0aWYgKOWIhuexu+minOiJsiAhPT0gJycpIHtcXHJcXG5cXHRcXHRcXHRjb2xvdXIgPSDliIbnsbvpopzoibJcXHJcXG5cXHRcXHR9IGVsc2Uge1xcclxcblxcdFxcdFxcdGNvbG91ciA9IGdldFJhbmdlQ29sb3JzKClcXHJcXG5cXHRcXHR9XFxyXFxuXFx0XFx0aHRtbENhdGVnb3JpZXMu55WM6Z2iKGQpXFxyXFxuXFx0XFx0XFx0Ly8u5YiG57G76ZO+5o6lKHRydWVfdXJsKVxcclxcblxcdFxcdFxcdC7mupDnoIEoaHRtbClcXHJcXG5cXHRcXHRcXHQu6aG156CBKHBhZ2UpXFxyXFxuXFx0XFx0XFx0Lua3u+WKoOWIhuexu+WumuS9jShydWxlTGlzdClcXHJcXG5cXHRcXHRcXHQu5byA5ZCv5YaF572u5oqY5Y+g5Yqf6IO9KCkgLy8g5b+F6aG7XFxyXFxuXFx0XFx0XFx0LuaKmOWPoCjlvZPliY3mipjlj6DnirbmgIEpIC8vIOW/hemhu1xcclxcblxcdFxcdFxcdC7mipjlj6DmjInpkq7moLflvI8oe1xcclxcblxcdFxcdFxcdFxcdHRpdGxlOiDlvZPliY3mipjlj6DnirbmgIEgPT0gXFxcIjFcXFwiID8gXFxcIuKAnOKAnOKAneKAnTxiaWc+PGI+PGZvbnQgY29sb3I9JyM1OTU5QUInPlxcXCIgKyDliqjmgIHnvKnlsI8gKyBcXFwiPC9mb250PjwvYj48L2JpZz5cXFwiIDogXFxcIuKAnOKAnOKAneKAnTxiaWc+PGI+PGZvbnQgY29sb3I9JyNGNzVENTknPlxcXCIgKyDliqjmgIHmianlsZUgKyBcXFwiPC9mb250PjwvYj48L2JpZz5cXFwiXFxyXFxuXFx0XFx0XFx0fSkgLy8g5Y+v6YCJXFxyXFxuXFx0XFx0XFx0Ly8gLuesrOWHoOihjOW8gOWni+aKmOWPoCgyKSAvLyDlj6/pgIlcXHJcXG5cXHRcXHRcXHQvLyAu5oqY5Y+g5oyJ6ZKu5qC35byPKHsg5oqY5Y+g5oyJ6ZKu5o+S5YWl6KGMOiAyIH0pICAvLyDlj6/pgInvvIzkvYblv4XpobvlhYjosIPnlKggLuesrOWHoOihjOW8gOWni+aKmOWPoChpbmRleCnvvIznhLblkI7lho3kvKDlhaUgeyDmipjlj6DmjInpkq7mj5LlhaXooYw6IGluZGV4IH1cXHJcXG5cXHRcXHRcXHQu6YCJ5Lit55qE5YiG57G76aKc6ImyKGNvbG91cilcXHJcXG5cXHRcXHRcXHQu5byA5aeL5omT6YCg5YiG57G7KCk7XFxyXFxuXFx0fSxcXHJcXG5cXHJcXG5cXHTnlJ/miJDniYfljZUoZCxodG1sKSB7XFxyXFxuXFxyXFxuXFx0XFx0dmFyIOWIl+ihqFxcclxcblxcdFxcdHZhciDmoIfpophcXHJcXG5cXHRcXHR2YXIg5o+P6L+wXFxyXFxuXFx0XFx0dmFyIOWbvueJh1xcclxcblxcdFxcdHZhciDpk77mjqVcXHJcXG5cXHJcXG5cXHRcXHRpZiAo5qGG5p6257G75Z6LID09PSAnbXl1aS12b2RsaXN0Jykge1xcclxcblxcdFxcdFxcdOWIl+ihqCA9ICcubXl1aS12b2RsaXN0JiZsaSc7XFxyXFxuXFx0XFx0XFx05qCH6aKYID0gJ2g0JiZUZXh0JztcXHJcXG5cXHRcXHRcXHTmj4/ov7AgPSAnLnBpYy10YWd8fC5waWMtdGV4dCYmVGV4dCc7XFxyXFxuXFx0XFx0XFx05Zu+54mHID0gJy5sYXp5bG9hZCYmZGF0YS1vcmlnaW5hbCc7XFxyXFxuXFx0XFx0XFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcclxcblxcdFxcdFxcdC8vbG9nKCfmoYbmnrbnsbvlnovCt215dWktdm9kbGlzdCcpXFxyXFxuXFx0XFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICcjZGF0YV9saXN0Jykge1xcclxcblxcdFxcdFxcdOWIl+ihqCA9ICcjZGF0YV9saXN0JiZsaSc7XFxyXFxuXFx0XFx0XFx05qCH6aKYID0gJ2EmJnRpdGxlJztcXHJcXG5cXHRcXHRcXHTmj4/ov7AgPSAnZW0mJlRleHQnO1xcclxcblxcdFxcdFxcdOWbvueJhyA9ICdpbWcmJmRhdGEtc3JjbCc7XFxyXFxuXFx0XFx0XFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcclxcblxcdFxcdFxcdC8vbG9nKCfmoYbmnrbnsbvlnovCt2RhdGFfbGlzdCcpXFxyXFxuXFx0XFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICdmZWQtbGlzdC10aXRsZScpIHtcXHJcXG5cXHRcXHRcXHTliJfooaggPSAnLmZlZC1saXN0LWluZm8mJmxpJztcXHJcXG5cXHRcXHRcXHTmoIfpopggPSAnLmZlZC1saXN0LXRpdGxlJiZUZXh0JztcXHJcXG5cXHRcXHRcXHTmj4/ov7AgPSAnLmZlZC10ZXh0LWNlbnRlciYmVGV4dCc7XFxyXFxuXFx0XFx0XFx05Zu+54mHID0gJ2EmJmRhdGEtb3JpZ2luYWwnO1xcclxcblxcdFxcdFxcdOmTvuaOpSA9ICdhJiZocmVmJztcXHJcXG5cXHRcXHRcXHQvL2xvZygn5qGG5p6257G75Z6LwrcuZmVkLWxpc3QtaW5mbycpXFxyXFxuXFx0XFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICdpdGVtJykge1xcclxcblxcdFxcdFxcdOWIl+ihqCA9ICdib2R5JiYuaXRlbSc7XFxyXFxuXFx0XFx0XFx05qCH6aKYID0gJ2ltZyYmYWx0JztcXHJcXG5cXHRcXHRcXHTmj4/ov7AgPSAncCYmVGV4dCc7XFxyXFxuXFx0XFx0XFx05Zu+54mHID0gJ2ltZyYmc3JjbCc7XFxyXFxuXFx0XFx0XFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcclxcblxcdFxcdH0gZWxzZSBpZiAo5qGG5p6257G75Z6LID09PSAnbW9kdWxlLWl0ZW1zJykge1xcclxcblxcdFxcdFxcdOWIl+ihqCA9ICcubW9kdWxlLWl0ZW1zJiYubW9kdWxlLWl0ZW0nO1xcclxcblxcdFxcdFxcdOagh+mimCA9ICdhJiZ0aXRsZSc7XFxyXFxuXFx0XFx0XFx05o+P6L+wID0gJy5tb2R1bGUtaXRlbS10ZXh0JiZUZXh0JztcXHJcXG5cXHRcXHRcXHTlm77niYcgPSAnaW1nfHwubGF6eSYmZGF0YS1zcmMnO1xcclxcblxcdFxcdFxcdOmTvuaOpSA9ICdhJiZocmVmJztcXHJcXG5cXHRcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJ3BhY2steWtwYWNrJykge1xcclxcblxcdFxcdFxcdOWIl+ihqCA9ICdib2R5JiYucGFjay15a3BhY2snO1xcclxcblxcdFxcdFxcdOagh+mimCA9ICdhJiZ0aXRsZSc7XFxyXFxuXFx0XFx0XFx05o+P6L+wID0gJ3NwYW4sLTEmJlRleHQnO1xcclxcblxcdFxcdFxcdOWbvueJhyA9ICcuZWNsYXp5JiZkYXRhLW9yaWdpbmFsJztcXHJcXG5cXHRcXHRcXHTpk77mjqUgPSAnYSYmaHJlZic7XFxyXFxuXFx0XFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICdzdHVpLXZvZGxpc3QnKSB7XFxyXFxuXFx0XFx0XFx05YiX6KGoID0gJy5zdHVpLXZvZGxpc3QmJmxpJztcXHJcXG5cXHRcXHRcXHTmoIfpopggPSAnYSYmdGl0bGUnO1xcclxcblxcdFxcdFxcdOaPj+i/sCA9ICcucGljLXRleHQmJlRleHQnO1xcclxcblxcdFxcdFxcdOWbvueJhyA9ICcubGF6eWxvYWR8fGEmJmRhdGEtb3JpZ2luYWwnO1xcclxcblxcdFxcdFxcdOmTvuaOpSA9ICdhJiZocmVmJztcXHJcXG5cXHRcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJ3ZvZGxpc3QnKSB7XFxyXFxuXFx0XFx0XFx05YiX6KGoID0gJy52b2RsaXN0JiZsaSc7XFxyXFxuXFx0XFx0XFx05qCH6aKYID0gJ2EmJnRpdGxlJztcXHJcXG5cXHRcXHRcXHTmj4/ov7AgPSAnYSYmVGV4dCc7XFxyXFxuXFx0XFx0XFx05Zu+54mHID0gJy5sYXp5bG9hZCYmZGF0YS1vcmlnaW5hbCc7XFxyXFxuXFx0XFx0XFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcclxcblxcdFxcdH0gZWxzZSBpZiAo5qGG5p6257G75Z6LID09PSAn5rWL6K+VJykge1xcclxcblxcdFxcdFxcdOWIl+ihqCA9ICdib2R5JiZhJztcXHJcXG5cXHRcXHRcXHTmoIfpopggPSAnYm9keSYmYSc7XFxyXFxuXFx0XFx0XFx05o+P6L+wID0gJ2JvZHkmJmEnO1xcclxcblxcdFxcdFxcdOWbvueJhyA9ICdib2R5JiZhJztcXHJcXG5cXHRcXHRcXHTpk77mjqUgPSAnYm9keSYmYSc7XFxyXFxuXFx0XFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICcnKSB7XFxyXFxuXFx0XFx0XFx05YiX6KGoID0g5qGG5p625YiX6KGoO1xcclxcblxcdFxcdFxcdOagh+mimCA9IOahhuaetuagh+mimDtcXHJcXG5cXHRcXHRcXHTmj4/ov7AgPSDmoYbmnrbmj4/ov7A7XFxyXFxuXFx0XFx0XFx05Zu+54mHID0g5qGG5p625Zu+54mHO1xcclxcblxcdFxcdFxcdOmTvuaOpSA9IOahhuaetumTvuaOpTtcXHJcXG5cXHRcXHR9XFxyXFxuXFx0XFx0bGV0IGxpc3QgPSBwZGZhKGh0bWwsIOWIl+ihqCk7XFxyXFxuXFx0XFx0Zm9yIChsZXQgayBpbiBsaXN0KSB7XFxyXFxuXFx0XFx0XFx0ZC5wdXNoKHtcXHJcXG5cXHRcXHRcXHRcXHR0aXRsZTogcGRmaChsaXN0W2tdLCDmoIfpopgpLFxcclxcblxcdFxcdFxcdFxcdGRlc2M6IHBkZmgobGlzdFtrXSwg5o+P6L+wKSxcXHJcXG5cXHRcXHRcXHRcXHRpbWc6IHBkKGxpc3Rba10sIOWbvueJhykgKyAnQFJlZmVyZXI9JyxcXHJcXG5cXHRcXHRcXHRcXHR1cmw6IHBkKGxpc3Rba10sIOmTvuaOpSkrXFxcIiNpbW1lcnNpdmVUaGVtZSMjYXV0b0NhY2hlI1xcXCIsXFxyXFxuXFx0XFx0XFx0fSk7XFxyXFxuXFx0XFx0fVxcclxcblxcdFxcdGQucHVzaCh7XFxyXFxuXFx0XFx0XFx0Y29sX3R5cGU6ICdiaWdfYmlnX2JsYW5rX2Jsb2NrJyxcXHJcXG5cXHRcXHR9KTtcXHJcXG5cXHR9XFxyXFxufSlcXHJcXG5cXHJcXG4kLmV4cG9ydHMgPSBuZXcg5LiA57qnKCk7XFxyXFxuJC5leHBvcnRzXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlh73mlbDnu4Tku7YqXCIsXCJwYXRoXCI6XCJxc1wiLFwicnVsZVwiOlwiZnVuY3Rpb24g5LyY5YyW6Lev57q/56ug6IqC5pWw5o2uKOWkmui3r+e6v+WQpiwg5rqQ5pWw5o2uLCDot6/nur/liJfooagsIOi3r+e6v+WQjSwg6YCJ6ZuG5oC75YiX6KGoLCDpgInpm4bliJfooagsIOmbhuWQjSwg6ZuGdXJsLCDliY3nvIAsIOagh+mimCwg5Zu+54mHKSB7XFxuXFxuICAgIC8v5b2T5aSa6Lev57q/5ZCmIOmAiembhuaAu+WIl+ihqOS4uuepulxcbiAgICAvL+acgOe7iOi/lOWbniBbe3RpdGxlOiAn6Lev57q/5ZCNJyxsaXN0OiBbe3RpdGxlOifpgInpm4blkI0nLHVybDon6YCJ6ZuGdXJsJywuLi59XSxzanNzOifkuIvovb3otYTmlpknfSwuLi4uXVxcbiAgICAvL+mAiembhuWIl+ihqCDnrKzkuIDpobnmmK9jc3PpgInmi6nlmajvvIzkuYvlkI7lj6/ku6XnlKgk5YiG5Ymy5re75Yqg6KaB5Yig6Zmk56ug6IqC5ZCNXFxuXFxuXFxuICAgIHZhciDnq6DoioJqc29uID0gW107XFxuICAgIHZhciDljZXot6/nur/nq6DoioIgPSAn56ug6IqC5YiX6KGoJ1xcblxcbiAgICB2YXIg5YiX6KGo5ZCNID0gW107XFxuICAgIGlmICgh5aSa6Lev57q/5ZCmKSB7XFxuXFxuICAgICAgICDliJfooajlkI0ucHVzaCjljZXot6/nur/nq6DoioIpXFxuXFxuICAgIH0gZWxzZSB7XFxuXFxuICAgICAgICBwZGZhKOa6kOaVsOaNriwg6Lev57q/5YiX6KGoKS5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHtcXG4gICAgICAgICAgICDliJfooajlkI0ucHVzaChwZGZoKGRhdGEsIOi3r+e6v+WQjSkpXFxuICAgICAgICB9KTtcXG5cXG4gICAgfVxcblxcbiAgICB2YXIg6ZuG5pWw57uEID0gW107XFxuXFxuXFxudmFyIOaOkumZpOeroOiKgiA9IFtdO1xcbmlmKOmAiembhuWIl+ihqC5pbmNsdWRlcygnJCcpKXtcXG7mjpLpmaTnq6DoioIgPSDpgInpm4bliJfooaguc3BsaXQoJyQnKVxcbumAiembhuWIl+ihqCA9IOaOkumZpOeroOiKgi5zaGlmdCgpXFxufVxcblxcbiAgICBpZiAoIeWkmui3r+e6v+WQpikge1xcbiAgICAgICAg6ZuG5pWw57uELnB1c2gocGRmYSjmupDmlbDmja4sIOmAiembhuWIl+ihqCkpXFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBwZGZhKOa6kOaVsOaNriwg6YCJ6ZuG5oC75YiX6KGoKS5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHtcXG4gICAgICAgICAgICDpm4bmlbDnu4QucHVzaChwZGZhKGRhdGEsIOmAiembhuWIl+ihqCkpXFxuICAgICAgICB9KTtcXG4gICAgfVxcblxcblxcbiAgICBmb3IgKGxldCBpIGluIOmbhuaVsOe7hCkge1xcblxcbiAgICAgICAgdmFyIGRvTGlzdCA9IFtdO1xcblxcbuaOkumZpOeroOiKgi5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHtcXG4gICAgdmFyIOagh+ivhmlkID0g6ZuG5pWw57uEW2ldLmZpbmRJbmRleCjov5Tlm54gPT4g6L+U5ZueLmluZGV4T2YoZGF0YSkgIT0gLTEpO1xcbiAgICBpZiAo5qCH6K+GaWQgIT0gLTEpIHtcXG4gICAgICDpm4bmlbDnu4RbaV0uc3BsaWNlKOagh+ivhmlkLCAxKVxcbiAgICB9O1xcbiAgfSk7XFxuXFxuICAgICAgICBmb3IgKGxldCBpdCBvZiDpm4bmlbDnu4RbaV0pIHtcXG4gICAgICAgICAgICB2YXIgZG9MaXN0dXJsID0gcGRmaChpdCwg6ZuGdXJsKVxcbiAgICAgICAgICAgIGRvTGlzdHVybCA9IGRvTGlzdHVybC5pbmNsdWRlcyhcXFwiaHR0cFxcXCIpID8gZG9MaXN0dXJsIDog5YmN57yAICsgZG9MaXN0dXJsXFxuICAgICAgICAgICAgZG9MaXN0LnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChpdCwg6ZuG5ZCNKSxcXG4gICAgICAgICAgICAgICAgdXJsOiBkb0xpc3R1cmxcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgfVxcblxcbiAgICAgICAgdmFyIGJvb2tOYW1lID0gIeWkmui3r+e6v+WQpiA/IOagh+mimCA6IOagh+mimCArICctJyArIOWIl+ihqOWQjVtpXVxcblxcbiAgICAgICAg56ug6IqCanNvbi5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTog5YiX6KGo5ZCNW2ldLFxcbiAgICAgICAgICAgIGxpc3Q6IGRvTGlzdCxcXG4gICAgICAgICAgICBzanNzOiB7XFxuICAgICAgICAgICAgICAgIGNoYXB0ZXJMaXN0OiBkb0xpc3QsXFxuICAgICAgICAgICAgICAgIGluZm86IHtcXG4gICAgICAgICAgICAgICAgICAgIGJvb2tOYW1lOiBib29rTmFtZSwgLy/mvKvnlLvlkI3np7AsXFxuICAgICAgICAgICAgICAgICAgICBydWxlTmFtZTogTVlfUlVMRS50aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgIGJvb2tUb3BQaWM6IOWbvueJhyxcXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlQ29kZTog5ryr55S76Kej5p6QLFxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmlldzogXFxcIjFcXFwiXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgfVxcbiAgICByZXR1cm4g56ug6IqCanNvblxcbn1cXG5cXG5cXG5mdW5jdGlvbiDmt7vliqDlpLTpg6jliJfooagoZCwg5qCH6aKYLCDlm77niYcsIOaPj+i/sCwg5L2c6ICFLCDml7bpl7QsIOWIhuexuyzpobVVUkwpIHtcXG5cXG4gICAg5qCH6aKYID0gIeagh+mimCA/ICcnIDog5qCH6aKYICsgJ1xcXFxuJ1xcbiAgICDlm77niYcgPSAh5Zu+54mHID8gJycgOiDlm77niYdcXG4gICAg5o+P6L+wID0gIeaPj+i/sCA/ICcnIDog5o+P6L+wLnJlcGxhY2UoXFxcIuabtOaWsOiHs++8mlxcXCIsICcnKVxcblxcbiAgICDkvZzogIUgPSAh5L2c6ICFID8gJycgOiAnXFxcXG4nICsg5L2c6ICFXFxuICAgIOaXtumXtCA9ICHml7bpl7QgPyAnJyA6ICdcXFxcbicgKyDml7bpl7RcXG4gICAg5YiG57G7ID0gIeWIhuexuyA/ICcnIDogJ1xcXFxuJyArIOWIhuexu1xcblxcblxcbiAgICB2YXIg5aS06YOodGl0bGUgPSBbJ+KAmOKAmOKAmeKAmTxiPicsJzwvYj4gPHNtYWxsPjxmb250IGNvbG9yPSNGQTcyOTg+JywnPC9mb250PicsJzwvc21hbGw+J11cXG4gICAgdmFyIOWktOmDqGRlc2MgPSBbJ+KAmOKAmOKAmeKAmTxmb250IGNvbG9yPSNmOGVjYzk+JywnPC9mb250PiddXFxuXFxuXFxuXFxuICAgIOWktOmDqHRpdGxlID0g5aS06YOodGl0bGVbMF0r5qCH6aKYK+WktOmDqHRpdGxlWzFdK+aPj+i/sCvlpLTpg6h0aXRsZVsyXSvkvZzogIUr5aS06YOodGl0bGVbM11cXG5cXG4gICAg5aS06YOoZGVzYyA9IOWktOmDqGRlc2NbMF0r5pe26Ze0K+WIhuexuyvlpLTpg6hkZXNjWzFdXFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTog5aS06YOodGl0bGUsXFxuICAgICAgICBkZXNjOiDlpLTpg6hkZXNjLFxcbiAgICAgICAgcGljX3VybDog5Zu+54mHLFxcbiAgICAgICAgdXJsOiDpobVVUkwgKyBcXFwiI25vSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6ICdtb3ZpZV8xX3ZlcnRpY2FsX3BpY19ibHVyJ1xcbiAgICB9KTtcXG5cXG59XFxuXFxuXFxuZnVuY3Rpb24g5re75Yqg566A5LuLKGQsIOaVsOaNrua6kCwg6aG1VVJMLCDlm77niYcpIHtcXG4gICAgLy/ojrflj5bmlbDmja5cXG4gICAgdmFyIOeugOS7i+WGheWuuSA9IOaVsOaNrua6kFxcbiAgICDnroDku4vlhoXlrrkgPSDnroDku4vlhoXlrrkucmVwbGFjZShcXFwi566A5LuL77yaXFxcIiwgXFxcIlxcXCIpLnJlcGxhY2UoXFxcIuS7i+e7jTpcXFwiLCBcXFwiXFxcIikucmVwbGFjZShcXFwi5ryr55S7XFxcIiwgXFxcIlxcXCIpLnJlcGxhY2UoXFxcIuKApuKAplxcXCIsIFxcXCJcXFwiKS5yZXBsYWNlKFxcXCLnroDku4tcXFwiLCBcXFwiXFxcIilcXG5cXG4gICAgdmFyIOeugOS7i+WGheWuueaUtjtcXG4gICAgaWYgKOeugOS7i+WGheWuuS5sZW5ndGggPiA0NSkge1xcbiAgICAgICAg566A5LuL5YaF5a655pS2ID0g566A5LuL5YaF5a65LnN1YnN0cigwLCA0NSkgKyAnLi4uJ1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAg566A5LuL5YaF5a655pS2ID0g566A5LuL5YaF5a65ICsgJy4uLidcXG4gICAgfVxcblxcbiAgICAvL+Wbvuagh+iOt+WPllxcbiAgICBpZiAoIeWbvueJhykge1xcbiAgICAgICAg5Zu+54mHID0gJ2h0dHBzOi8vbGFubWVpZ3VvamlhbmcuY29tL3R1Ymlhby9xLzEwNy5wbmcnXFxuICAgIH1cXG5cXG4gICAgLy/pobVVUkwg6I635Y+WXFxuICAgIGlmICgh6aG1VVJMKSB7XFxuICAgICAgICDpobVVUkwgPSBNWV9SVUxFLnRpdGxlXFxuICAgIH1cXG5cXG4gICAgLy/moIfpopjkuI7nroDku4vmoLflvI9cXG4gICAgdmFyIG16dGV4dCA9IFxcXCImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8c21hbGw+566A5LuLPC9zbWFsbD48YnI+XFxcIlxcbiAgICB2YXIgYnR0aXRsZSA9ICc8Zm9udCBjb2xvcj1cXFwiIzA5OEFDMVxcXCI+5ryr55S7566A5LuLICA8L2ZvbnQ+PHNtYWxsPjxzbWFsbD48Zm9udCBjb2xvcj1cXFwiI2Y0Nzk4M1xcXCI+566A5LuL5pS2PjwvZm9udD48L3NtYWxsPjwvc21hbGw+J1xcblxcbiAgICAvL+WxleW8gOS4juaUtue8qeaTjeS9nFxcbiAgICB2YXIgamogPSBnZXRWYXIo6aG1VVJMICsgXFxcIueugOS7i+aUtlxcXCIsIFxcXCLlt7LmlLbotbdcXFwiKTtcXG4gICAgdmFyIGpqdXJsID0gJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgo566A5LuL5YaF5a65LCDnroDku4vlhoXlrrnmlLYsIOaUtiwg5pS25YaF5a65LCDlvZPliY1VUkwpID0+IHtcXG4gICAgICAgIHZhciBqc2JsID0g5b2T5YmNVVJMICsgXFxcIueugOS7i+aUtlxcXCI7XFxuICAgICAgICB2YXIgamogPSBnZXRWYXIo5b2T5YmNVVJMICsgXFxcIueugOS7i+aUtlxcXCIsIFxcXCLlt7LmlLbotbdcXFwiKTtcXG4gICAgICAgIGpqID0gamogPT0gXFxcIuW3suaUtui1t1xcXCIgPyBcXFwi5bGV5byAXFxcIiA6IFxcXCLlt7LmlLbotbdcXFwiO1xcbiAgICAgICAgcHV0VmFyKGpzYmwsIGpqKVxcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IOW9k+WJjVVSTCArIFxcXCJfYnRcXFwiXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICB0aXRsZTog5pS2LnJlcGxhY2UoXFxcIueugOS7i+aUtlxcXCIsIGpqKVxcbiAgICAgICAgfSlcXG5cXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiDlvZPliY1VUkwgKyBcXFwiX216XFxcIlxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgdGl0bGU6IGpqID09IFxcXCLlt7LmlLbotbdcXFwiID8g5pS25YaF5a65LnJlcGxhY2UoXFxcIueugOS7i1xcXCIsIOeugOS7i+WGheWuueaUtikgOiDmlLblhoXlrrkucmVwbGFjZShcXFwi566A5LuLXFxcIiwg566A5LuL5YaF5a65KVxcbiAgICAgICAgfSlcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgfSwg566A5LuL5YaF5a65LCDnroDku4vlhoXlrrnmlLYsIGJ0dGl0bGUsIG16dGV4dCwg6aG1VVJMKVxcblxcblxcbiAgICAvL+agh+mimFxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGJ0dGl0bGUucmVwbGFjZShcXFwi566A5LuL5pS2XFxcIiwgamopLFxcbiAgICAgICAgdXJsOiBqanVybCxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgIHBpY191cmw6IOWbvueJhyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IOmhtVVSTCArIFxcXCJfYnRcXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcblxcbiAgICAvL+eugOS7i1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGpqID09IFxcXCLlt7LmlLbotbdcXFwiID8gbXp0ZXh0LnJlcGxhY2UoXFxcIueugOS7i1xcXCIsIOeugOS7i+WGheWuueaUtikgOiBtenRleHQucmVwbGFjZShcXFwi566A5LuLXFxcIiwg566A5LuL5YaF5a65KSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IOmhtVVSTCArIFxcXCJfbXpcXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcblxcbn1cXG5cXG5mdW5jdGlvbiDmt7vliqDliJfooajnq6DoioIoZCwg5qCH6aKY5pWw5o2uLCDliJfooajmlbDmja4sIOino+aekOS7o+eggSwg6aG1VVJMLCDlm77niYcpIHtcXG5cXG5cXG4gICAgLy9k5LiO5aSW55WMZO+8jOS4uuWQjOWGheWtmOWcsOWdgO+8jOS4jeeUqOi/lOWbnlxcbiAgICAvL+agh+mimOaVsOaNriAg5Y2z5qCH6aKY5ZCN5a2XXFxuICAgIC8v5YiX6KGo5pWw5o2u5b+F6aG75pivSlNPTiAg5qC85byP5pivW3t0aXRsZTonJyx1cmw6JycsfSwuLi4uLl0gIOS4lHVybOW/hemhu+acieWJjee8gFxcblxcbiAgICAvL+Wbvuagh+iOt+WPllxcbiAgICBpZiAoIeWbvueJhykge1xcbiAgICAgICAg5Zu+54mHID0gJ2h0dHBzOi8vbGFubWVpZ3VvamlhbmcuY29tL3R1Ymlhby9xLzE4LnBuZydcXG4gICAgfVxcblxcbiAgICAvL+mhtVVSTCDojrflj5ZcXG4gICAgaWYgKCHpobVVUkwpIHtcXG4gICAgICAgIOmhtVVSTCA9IE1ZX1JVTEUudGl0bGVcXG4gICAgfVxcblxcbiAgICAvL+agh+mimOWQjVxcbiAgICB2YXIg5qCH6aKY5ZCNID0gJzxiPui3r+e6vzwvYj4gIDxzbWFsbD48c21hbGw+PGZvbnQgY29sb3I9I2Y5OTA2Zj7mjpLluo8gPjwvZm9udD48L3NtYWxsPjwvc21hbGw+J1xcblxcblxcbiAgICB2YXIg5o6S5bqPID0gZ2V0VmFyKOmhtVVSTCArIFxcXCLnq6DoioLmjpLluo9cXFwiLCBcXFwi5q2j5bqPXFxcIik7XFxuICAgIHZhciDmj5DnpLogPSDmjpLluo8gPT0gJ+WAkuW6jycgPyAn5q2j5bqPJyA6ICflgJLluo8nO1xcblxcbiAgICB2YXIg5o6S5bqPdXJsID0gJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgo5qCH6aKY5ZCNLCDmoIfpopjmlbDmja4sIOWIl+ihqOaVsOaNriwg6Kej5p6Q5Luj56CBLCDpobVVUkwpID0+IHtcXG4gICAgICAgIHZhciDmjpLluo8gPSBnZXRWYXIo6aG1VVJMICsgXFxcIueroOiKguaOkuW6j1xcXCIsIFxcXCLmraPluo9cXFwiKTtcXG4gICAgICAgIHZhciDmj5DnpLogPSDmjpLluo8gPT0gJ+WAkuW6jycgPyAn5q2j5bqPJyA6ICflgJLluo8nO1xcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IOmhtVVSTCArIFxcXCJf5o6S5bqPXFxcIlxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgdGl0bGU6IOagh+mimOWQjS5yZXBsYWNlKCfot6/nur8nLCDmoIfpopjmlbDmja4pLnJlcGxhY2UoJ+aOkuW6jycsIOaPkOekuilcXG4gICAgICAgIH0pXFxuXFxuXFxuICAgICAgICBpZiAo5o+Q56S6ID09ICflgJLluo8nKSB7XFxuICAgICAgICAgICAg5YiX6KGo5pWw5o2uLnJldmVyc2UoKVxcbiAgICAgICAgfVxcbiAgICAgICAg5YiX6KGo5pWw5o2uLmZvckVhY2goZnVuY3Rpb24oZGF0YSwgc3NpZCkge1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogZGF0YS50aXRsZSxcXG4gICAgICAgICAgICAgICAgdXJsOiBkYXRhLnVybCArIOino+aekOS7o+eggSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiDpobVVUkwgKyBcXFwiX+mAiembhlxcXCIgKyBzc2lkXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0pO1xcblxcblxcbiAgICAgICAgcHV0VmFyKOmhtVVSTCArIFxcXCLnq6DoioLmjpLluo9cXFwiLCDmj5DnpLopXFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgIH0sIOagh+mimOWQjSwg5qCH6aKY5pWw5o2uLCDliJfooajmlbDmja4sIOino+aekOS7o+eggSwg6aG1VVJMKVxcblxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IOagh+mimOWQjS5yZXBsYWNlKCfot6/nur8nLCDmoIfpopjmlbDmja4pLnJlcGxhY2UoJ+aOkuW6jycsIOaOkuW6jyksXFxuICAgICAgICBwaWNfdXJsOiDlm77niYcsXFxuICAgICAgICB1cmw6IOaOkuW6j3VybCxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IOmhtVVSTCArIFxcXCJf5o6S5bqPXFxcIlxcbiAgICAgICAgfVxcbiAgICB9KTtcXG5cXG4gICAgaWYgKOaOkuW6jyA9PSAn5YCS5bqPJykge1xcbiAgICAgICAg5YiX6KGo5pWw5o2uLnJldmVyc2UoKVxcbiAgICB9XFxuXFxuICAgIOWIl+ihqOaVsOaNri5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEsIGlkKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBkYXRhLnRpdGxlLFxcbiAgICAgICAgICAgIHVybDogZGF0YS51cmwgKyDop6PmnpDku6PnoIEsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiDpobVVUkwgKyBcXFwiX+mAiembhlxcXCIgKyBpZFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9KTtcXG5cXG59XFxuXFxuLypcXG5mdW5jdGlvbiDmt7vliqDpmLLmraLnvZHpobUo6aG5dXJsLCBVQSkge1xcblxcbiAgICAvL+S4iue6p+i3s+i9rOWIsOW9k+WJjemhteeahOmTvuaOpeW/hemhu+aYr2hpa2VyOi8vZW1wdHnvvJvkuI3nhLbkuIDliLfmlrDov5jmmK/kvJrph43lpI3liqDovb1cXG4gICAgLy9VQSAnJ+aIlmZhbHNl5oiWJ+aJi+acuicg6buY6K6k5piv5omL5py656uvIDsg55S16ISRICdQQydcXG5cXG4gICAgdmFyIOWIt+aWsOmHjeWkjSA9IE1ZX1JVTEUudGl0bGUgKyBcXFwi572R6aG15rqQ56CBXFxcIlxcbiAgICB2YXIgcGPpk77mjqUgPSDpobl1cmwucmVwbGFjZShcXFwibS5cXFwiLCBcXFwid3d3LlxcXCIpXFxuICAgIHZhciDmiYvmnLrpk77mjqUgPSDpobl1cmwucmVwbGFjZShcXFwid3d3LlxcXCIsIFxcXCJtLlxcXCIpXFxuXFxuICAgIHZhciBjb2RlO1xcbiAgICBpZiAoZ2V0VmFyKOWIt+aWsOmHjeWkjSwgXFxcImZhbHNlXFxcIikgPT0gXFxcImZhbHNlXFxcIikge1xcblxcbiAgICAgICAgY29kZSA9IFVBID09ICdQQycgPyBmZXRjaChwY+mTvuaOpSkgOiByZXF1ZXN0KOaJi+acuumTvuaOpSk7XFxuICAgICAgICBwdXRWYXIo5Yi35paw6YeN5aSNLCBnZXRQYXJhbSgndXJsJykgKyBcXFwi77+lJu+/pVxcXCIgKyBjb2RlKVxcblxcbiAgICB9IGVsc2Uge1xcblxcbiAgICAgICAgdmFyIHBtID0gZ2V0VmFyKOWIt+aWsOmHjeWkjSkuc3BsaXQoXFxcIu+/pSbvv6VcXFwiKVxcbiAgICAgICAgaWYgKHBtWzBdID09IGdldFBhcmFtKCd1cmwnKSkge1xcbiAgICAgICAgICAgIGNvZGUgPSBwbVsxXVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBjb2RlID0gVUEgPT0gJ1BDJyA/IGZldGNoKHBj6ZO+5o6lKSA6IHJlcXVlc3Qo5omL5py66ZO+5o6lKTtcXG4gICAgICAgICAgICBwdXRWYXIo5Yi35paw6YeN5aSNLCBnZXRQYXJhbSgndXJsJykgKyBcXFwi77+lJu+/pVxcXCIgKyBjb2RlKVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHJldHVybiBjb2RlXFxufVxcbiovXFxuXFxuZnVuY3Rpb24g5re75Yqg6YCJ5oup6Lev57q/KGQsIOi3r+e6v+aVsOaNriwg6aG1VVJMLCDlpJrot6/nur/lkKYpIHtcXG5cXG4gICAgLy/ot6/nur/mlbDmja4g5qC85byPW3t0aXRsZTon6Lev57q/5ZCNJ30sLi4uLl1cXG4gICAgLy/lpJrot6/nur/lkKYgIGZhbHNlIOWImeS4jeWQr+eUqOmAieaLqei3r+e6v++8m3RydWUg5YiZ5ZCv55SoXFxuXFxuICAgIHZhciDpgInmi6nliJfooaggPSBnZXRJdGVtKOmhtVVSTCArIFxcXCLpgInmi6nliJfooahcXFwiLCBcXFwiMFxcXCIpXFxuXFxuICAgIGlmICjlpJrot6/nur/lkKYpIHtcXG5cXG4gICAgICAgIHZhciDot6/nur/pgInkuK0gPSAn4oCY4oCY4oCZ4oCZPGZvbnQgY29sb3I9IzA5OEFDMT7pgInkuK08L2ZvbnQ+J1xcblxcblxcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+KAmOKAmOKAmeKAmfCfk5Y8Zm9udCBjb2xvcj1cXFwiI0ZBNzI5OFxcXCI+IOWbvua6kOWIl+ihqDwvZm9udD4g77yaJyxcXG4gICAgICAgICAgICB1cmw6IFxcXCJ0b2FzdDovL+eCueaIkeW5suWVpeWRolxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6ICdmbGV4X2J1dHRvbidcXG4gICAgICAgIH0pO1xcblxcblxcbiAgICAgICAg6Lev57q/5pWw5o2uLmZvckVhY2goZnVuY3Rpb24oZGF0YSwgaWQpIHtcXG5cXG4gICAgICAgICAgICB2YXIgamp1cmwgPSAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCjpobVVUkwsaWQpID0+IHtcXG4gICAgICAgICAgICAgICAgc2V0SXRlbSjpobVVUkwgKyAn6YCJ5oup5YiX6KGoJyxpZCsnJyk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICB9LOmhtVVSTCxpZCk7XFxuXFxuICAgICAgICAgICAgdmFyIOagh+mimOWQjSA9IGlkID09IOmAieaLqeWIl+ihqCA/IOi3r+e6v+mAieS4rS5yZXBsYWNlKCfpgInkuK0nLCBkYXRhLnRpdGxlKSA6IGRhdGEudGl0bGU7XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IOagh+mimOWQjSxcXG4gICAgICAgICAgICAgICAgdXJsOiBqanVybCxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6ICdmbGV4X2J1dHRvbicsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDog6aG1VVJMICsgXFxcIl/ot6/nur9cXFwiICsgaWRcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSk7XFxuXFxuICAgIH1cXG4gICAgcmV0dXJuIOmAieaLqeWIl+ihqFxcbn1cXG5cXG5cXG5mdW5jdGlvbiDmt7vliqDpgInmi6nkuIvovb0oZCwg6Lev57q/5pWw5o2uLCDlpJrot6/nur/lkKYpIHtcXG5cXG4gICAgLy/ot6/nur/mlbDmja4g5qC85byPW3t0aXRsZTon6Lev57q/5ZCNJyxzanNzOifkuIvovb3otYTmlpnkv6Hmga8nfSwuLi4uXVxcbiAgICAvL+Wkmui3r+e6v+WQpiAgZmFsc2Ug5YiZ5Y+q5pyJ4pGg5Liq5LiL6L29IOagh+mimOS4uiDngrnlh7vkuIvovb3vvJt0cnVlIOWImeWkmuS4quS4i+i9vVxcblxcbmlmKOWkmui3r+e6v+WQpil7XFxuXFxuZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZ8J+TpTxmb250IGNvbG9yPVxcXCIjZjQ3OTgzXFxcIj4g5LiL6L29PC9mb250PiDvvJonLFxcbiAgICAgICAgdXJsOiBcXFwidG9hc3Q6Ly/ngrnmiJHlubLllaXlkaJcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJ1xcbiAgICB9KTtcXG5cXG59XFxuXFxuICAgIOi3r+e6v+aVsOaNri5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEsIGlkKSB7XFxuXFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBkYXRhLnRpdGxlLmluY2x1ZGVzKCfnq6DoioLliJfooagnKSA/ICfngrnlh7vkuIvovb0nIDogZGF0YS50aXRsZSxcXG4gICAgICAgICAgICB1cmw6ICdoaWtlcjovL3BhZ2UvZG93bmxvYWQudmlldyNub1JlY29yZEhpc3RvcnkjI25vUmVmcmVzaCMjbm9IaXN0b3J5Iz9ydWxlPeacrOWcsOi1hOa6kOeuoeeQhicsXFxuICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgICBleHRyYTogZGF0YS5zanNzXFxuICAgICAgICB9KTtcXG4gICAgfSk7XFxuXFxuICAgIGlmICjlpJrot6/nur/lkKYpIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG5cXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJDU1PpgInmi6nlmajmqKHniYgqXCIsXCJwYXRoXCI6XCJlandiLmpzXCIsXCJydWxlXCI6XCJmdW5jdGlvbiDkuIDnuqco5YiX6KGoLCDmoIfpopgsIOWbvueJhywg6ZuG5pWwLCDpk77mjqUsIOiuv+mXruWktCkge1xcbiAgICDorr/pl67lpLQgPSAh6K6/6Zeu5aS0ID8gJycgOiDorr/pl67lpLRcXG4gICAgdmFyIGQgPSBbXTtcXG4gICAgdmFyIGNvZGUgPSBnZXRDb2RlKClcXG4gICAgcGRmYShjb2RlLCDliJfooagpLmZvckVhY2goZnVuY3Rpb24oZGF0YSkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogcGRmaChkYXRhLCDmoIfpopgpLFxcbiAgICAgICAgICAgIGRlc2M6IHBkZmgoZGF0YSwg6ZuG5pWwKSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBwZChkYXRhLCDlm77niYcpICsgXFxcIkBSZWZlcmVyPVxcXCIgKyDorr/pl67lpLQsXFxuICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9lbXB0eSNpbW1lcnNpdmVUaGVtZSMjYXV0b0NhY2hlIycsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJtb3ZpZV8zXFxcIixcXG5leHRyYToge1xcbiAgICAgICAgICAgIG5hbWU6IHBkZmgoZGF0YSwg5qCH6aKYKSxcXG4gICAgICAgICAgICB1cmw6IHBkKGRhdGEsIOmTvuaOpSksXFxuICAgICAgICAgICAgcXo6IE1ZX0hPTUVcXG4gICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9KTtcXG4gICAgc2V0UmVzdWx0KGQpO1xcbn1cXG5cXG5cXG5cXG5mdW5jdGlvbiDmkJzntKIo5YiX6KGoLCDmoIfpopgsIOmTvuaOpSwg5o+P6L+wLCDor6bmg4UsIOWbvueJhywg6K6/6Zeu5aS0KSB7XFxuICAgIHZhciBkID0gW107XFxuICAgIOiuv+mXruWktCA9ICHorr/pl67lpLQgPyAnJyA6IOiuv+mXruWktFxcbiAgICBwZGZhKGdldFJlc0NvZGUoKSwg5YiX6KGoKS5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IHBkZmgoZGF0YSwg5qCH6aKYKSxcXG4gICAgICAgICAgICBkZXNjOiBwZGZoKGRhdGEsIOaPj+i/sCksXFxuICAgICAgICAgICAgcGljX3VybDogcGQoZGF0YSwg5Zu+54mHKSArIFxcXCJAUmVmZXJlcj1cXFwiICsg6K6/6Zeu5aS0LFxcbiAgICAgICAgICAgIHVybDogJ2hpa2VyOi8vZW1wdHkjaW1tZXJzaXZlVGhlbWUjI2F1dG9DYWNoZSMnLFxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHBkZmgoZGF0YSwg6K+m5oOFKSxcXG5cXG5leHRyYToge1xcbiAgICAgICAgICAgIG5hbWU6IHBkZmgoZGF0YSwg5qCH6aKYKSxcXG4gICAgICAgICAgICB1cmw6IHBkKGRhdGEsIOmTvuaOpSksXFxuICAgICAgICAgICAgcXo6IE1ZX0hPTUVcXG4gICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9KTtcXG4gICAgc2V0UmVzdWx0KGQpO1xcbn1cXG5cXG5cXG5cXG5cXG5mdW5jdGlvbiDmnIDmlrAo6YCJ5oup5ZmoLCBVQSkge1xcbiAgICBpZiAoVUEgPT0gXFxcIlBDXFxcIikge1xcbiAgICAgICAgdmFyIGNvZGUgPSBmZXRjaChnZXRQYXJhbSgndXJsJykucmVwbGFjZShcXFwibS5cXFwiLCBcXFwid3d3LlxcXCIpKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHZhciBjb2RlID0gcmVxdWVzdChnZXRQYXJhbSgndXJsJykucmVwbGFjZShcXFwid3d3LlxcXCIsIFxcXCJtLlxcXCIpKTtcXG4gICAgfVxcbiAgICBzZXRSZXN1bHQocGRmaChjb2RlLCDpgInmi6nlmagpKVxcbn1cXG5cXG5cXG5cXG5ldmFsKEpTT04ucGFyc2UocmVxdWVzdChcXFwiaGlrZXI6Ly9wYWdlL3FzP3J1bGU96IGa5ryr8J+UrlxcXCIpKS5ydWxlKVxcblxcbmZ1bmN0aW9uIOS6jOe6pyjlpLTpg6jliJfooagsIOagh+mimCwg5Zu+54mHLCDmj4/ov7AsIOiuv+mXruWktCwg5L2c6ICFLCDml7bpl7QsIOWIhuexuywg566A5LuLLCDlpJrot6/nur/lkKYsIOi3r+e6v+WIl+ihqCwg6Lev57q/5ZCNLCDpgInpm4bmgLvliJfooagsIOmAiembhuWIl+ihqCwg6ZuG5ZCNLCDpm4Z1cmwsIOa8q+eUu+ino+aekCzlvZPliY1VUkws5b2T5YmN6aG15ZCNLOWJjee8gCxVQSzpmLLph43ovb3lkKYpIHtcXG4gICAgdmFyIGQgPSBbXTtcXG5cXG4vL+WktOmDqOWIl+ihqCAg5YiZ6buY6K6k5L2/55SoIGNvZGUg5p2l5L2c5Li65aS06YOo5YiX6KGo5pWw5o2uXFxuLy/lpJrot6/nur/lkKYgIHRydWUg5YiZ5L2/55So5aSa6Lev57q/77ybZmFsc2Ug5YiZ5L2/55So56ug6Lev57q/XFxuLy9VQSAg5LiN5aGr5YiZ5L2/55So5omL5py656uvICAnUEMn5YiZ5omL5py656uvXFxuXFxuaWYgKOW9k+WJjemhteWQjSkge1xcbiAgICBzZXRQYWdlVGl0bGUo5b2T5YmN6aG15ZCNKVxcbn1cXG5cXG5pZijpmLLph43ovb3lkKYpe1xcbi8v572R6aG15YaF5a65K+mYsuatoumHjeaLiVxcbiAgICB2YXIgY29kZSA9IOa3u+WKoOmYsuatoue9kemhtSjlvZPliY1VUkwsIFVBKVxcbn1lbHNle1xcbiAgICB2YXIgY29kZSA9IGdldENvZGUoKVxcbn1cXG4gICAgXFxuXFxuICAgIC8v5aS06YOo5YiX6KGo5pWw5o2uXFxuICAgIHZhciDlpLTpg6ggPSAh5aS06YOo5YiX6KGoID8gY29kZSA6IHBkZmEoY29kZSwg5aS06YOo5YiX6KGoKVswXTtcXG4gICAg5qCH6aKYID0gcGRmaCjlpLTpg6gsIOagh+mimClcXG4gICAg5Zu+54mHID0gcGRmaCjlpLTpg6gsIOWbvueJhylcXG4gICAgaWYgKOWbvueJhykge1xcbiAgICAgICAg5Zu+54mHID0g5Zu+54mHLmluY2x1ZGVzKCdodHRwJykgPyDlm77niYcgOiDliY3nvIAgKyDlm77niYdcXG4gICAgICAgIGlmICgh6K6/6Zeu5aS0KSB7fSBlbHNlIGlmICjorr/pl67lpLQuc3Vic3RyKDAsIDEpID09ICdAJykge1xcbiAgICAgICAgICAgIOWbvueJhyA9IOWbvueJhyArIOiuv+mXruWktFxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICDlm77niYcgPSDlm77niYcgKyBcXFwiQFJlZmVyZXI9XFxcIiArIOiuv+mXruWktFxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIFxcbuaPj+i/sCA9IOaPj+i/sC5pbmNsdWRlcygnJCcpID8g5o+P6L+wLnNwbGl0KCckJylbMV0gKyBwZGZoKOWktOmDqCwg5o+P6L+wLnNwbGl0KCckJylbMF0pIDogcGRmaCjlpLTpg6gsIOaPj+i/sClcXG5cXG7kvZzogIUgPSDkvZzogIUuaW5jbHVkZXMoJyQnKSA/IOS9nOiAhS5zcGxpdCgnJCcpWzFdICsgcGRmaCjlpLTpg6gsIOS9nOiAhS5zcGxpdCgnJCcpWzBdKSA6IHBkZmgo5aS06YOoLCDkvZzogIUpXFxuICAgIFxcbuaXtumXtCA9IOaXtumXtC5pbmNsdWRlcygnJCcpID8g5pe26Ze0LnNwbGl0KCckJylbMV0gKyBwZGZoKOWktOmDqCwg5pe26Ze0LnNwbGl0KCckJylbMF0pIDogcGRmaCjlpLTpg6gsIOaXtumXtClcXG5cXG7liIbnsbsgPSDliIbnsbsuaW5jbHVkZXMoJyQnKSA/IOWIhuexuy5zcGxpdCgnJCcpWzFdICsgcGRmaCjlpLTpg6gsIOWIhuexuy5zcGxpdCgnJCcpWzBdKSA6IHBkZmgo5aS06YOoLCDliIbnsbspXFxuXFxuICAgIFxcbiAgICAvL+WktOmDqOWIl+ihqFxcbiAgICDmt7vliqDlpLTpg6jliJfooagoZCwg5qCH6aKYLCDlm77niYcsIOaPj+i/sCwg5L2c6ICFLCDml7bpl7QsIOWIhuexuyzlvZPliY1VUkwpXFxuICAgIFxcbiAgICAvL+i3r+e6v+WQjeS4jumAiembhuaVsOaNrlxcbiAgICB2YXIg56ug6IqCanNvbiA9IOS8mOWMlui3r+e6v+eroOiKguaVsOaNrijlpJrot6/nur/lkKYsIGNvZGUsIOi3r+e6v+WIl+ihqCzot6/nur/lkI0s6YCJ6ZuG5oC75YiX6KGoLOmAiembhuWIl+ihqCzpm4blkI0s6ZuGdXJsLOWJjee8gCzlvZPliY3pobXlkI0s5Zu+54mHKVxcblxcbiAgICAvL+eugOS7i1xcbiAgICDmt7vliqDnroDku4soZCwgcGRmaChjb2RlLCDnroDku4spLCDlvZPliY1VUkwsICcnKVxcblxcbiAgIC8v5b2T5rKh5pyJ56ug6IqC5YaF5a6577yM5bCx5LiN5pi+56S6XFxuICAgIGlmICjnq6DoioJqc29uLmxlbmd0aCA+IDApIHtcXG5cXG4gICAgICAgIC8v6Lev57q/6YCJ5oupXFxuICAgICAgICB2YXIg6YCJ5oup5YiX6KGoID0g5re75Yqg6YCJ5oup6Lev57q/KGQsIOeroOiKgmpzb24sIOW9k+WJjVVSTCwg5aSa6Lev57q/5ZCmKVxcblxcbiAgICAgICAgLy/pgInmi6nkuIvovb1cXG4gICAgICAgIOa3u+WKoOmAieaLqeS4i+i9vShkLCDnq6DoioJqc29uLOWkmui3r+e6v+WQpilcXG5cXG4gICAgICAgIC8v5o6S5bqP5LiO6YCJ6ZuGXFxuICAgICAgICB2YXIgbGF6eSA9IGBAbGF6eVJ1bGU9LmpzOmAgKyDmvKvnlLvop6PmnpA7XFxuICAgICAgICDmt7vliqDliJfooajnq6DoioIoZCwg56ug6IqCanNvblvpgInmi6nliJfooahdLnRpdGxlLCDnq6DoioJqc29uW+mAieaLqeWIl+ihqF0ubGlzdCwgbGF6eSwg5b2T5YmNVVJMLCAnJylcXG5cXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsb25nX3RleHRcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBzZXRSZXN1bHQoZClcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLkuoznuqfliJfooagqXCIsXCJwYXRoXCI6XCJlamxiXCIsXCJydWxlXCI6XCJ2YXIgdGFicyA9IFtdXFxudmFyIGxpc3RzID0gW11cXG52YXIgYXJ0cyA9IHBkZmEoaHRtbCwg57q/6LevKTtcXG5hcnRzLmZvckVhY2goKGRhdGEsIGlkKSA9PiB7XFxuICAgIHRhYnMucHVzaChwZGZoKGRhdGEsIOe6v+i3r+WQjSkpXFxufSlcXG52YXIgY29udHMgPSBwZGZhKGh0bWwsIOmAiembhik7XFxuY29udHMuZm9yRWFjaCgoZGF0YSwgaWQpID0+IHtcXG4gICAgbGlzdHMucHVzaChwZGZhKGRhdGEsIOmAiembhuWIl+ihqCkpXFxufSlcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhck15VmFyKFxcXCJsaXN0c1xcXCIpO1xcbn0pKTtcXG5zdG9yYWdlMC5wdXRNeVZhcihcXFwibGlzdHNcXFwiLCBsaXN0cyk7XFxudmFyIGxpc3QgPSBsaXN0c1tnZXRNeVZhcihNWV9VUkwsICcwJyldO1xcbnZhciDmjpLluo8gPSBnZXRNeVZhcihNWV9VUkwgKyBcXFwi56ug6IqC5o6S5bqPXFxcIiwgJyMxYWFkMTlcXFwiPuato+W6jycpO1xcbnZhciDmj5DnpLogPSDmjpLluo8gPT0gJyNGRjAwMDBcXFwiPuWAkuW6jycgPyAnIzFhYWQxOVxcXCI+5q2j5bqPJyA6ICcjRkYwMDAwXFxcIj7lgJLluo8nO1xcbnZhciDmjpLluo/lkI0gPSAn4oCc4oCc4oCd4oCdPGI+PHNwYW4gc3R5bGU9XFxcImNvbG9yOuaOkuW6jzwvc3Bhbj48L2I+J1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGI+PHNwYW4gc3R5bGU9XFxcImNvbG9yOiAnICsg5o6S5bqPICsgJzwvc3Bhbj48L2I+JyxcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCjmjpLluo/lkI0sIGxhenkpID0+IHtcXG4gICAgICAgIHZhciBsaXN0cyA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJsaXN0c1xcXCIpO1xcbiAgICAgICAgdmFyIOeroOiKgiA9IGxpc3RzW2dldE15VmFyKE1ZX1VSTCwgJzAnKV07XFxuICAgICAgICB2YXIg5o6S5bqPID0gZ2V0TXlWYXIoTVlfVVJMICsgXFxcIueroOiKguaOkuW6j1xcXCIsICcjMWFhZDE5XFxcIj7mraPluo8nKTtcXG4gICAgICAgIHZhciDmj5DnpLogPSDmjpLluo8gPT0gJyNGRjAwMDBcXFwiPuWAkuW6jycgPyAnIzFhYWQxOVxcXCI+5q2j5bqPJyA6ICcjRkYwMDAwXFxcIj7lgJLluo8nO1xcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX1VSTCArIFxcXCJf5o6S5bqPXFxcIlxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgdGl0bGU6IOaOkuW6j+WQjS5yZXBsYWNlKCfmjpLluo8nLCDmj5DnpLopXFxuICAgICAgICB9KVxcbiAgICAgICAgaWYgKOaOkuW6jyA9PSAnIzFhYWQxOVxcXCI+5q2j5bqPJykge1xcbiAgICAgICAgICAgIOeroOiKgi5yZXZlcnNlKClcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBjcCA9IOeroOiKgi5tYXAoKGRhdGEsIHNzaWQpID0+IHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChkYXRhLCAnYSYmVGV4dCcpLFxcbiAgICAgICAgICAgICAgICB1cmw6IHBkKGRhdGEsICdhJiZocmVmJykgKyBsYXp5LFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTog56ug6IqCLmxlbmd0aCA+IDMgPyAndGV4dF80JyA6ICd0ZXh0XzInLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBNWV9VUkwgKyBcXFwiX+mAiembhlxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH07XFxuICAgICAgICB9KTtcXG4gICAgICAgIGRlbGV0ZUl0ZW1CeUNscyhNWV9VUkwgKyBcXFwiX+mAiembhlxcXCIpO1xcbiAgICAgICAgYWRkSXRlbUJlZm9yZShNWV9VUkwgKyBcXFwiZm9vdGVyXFxcIiwgY3ApO1xcbiAgICAgICAgcHV0TXlWYXIoTVlfVVJMICsgXFxcIueroOiKguaOkuW6j1xcXCIsIOaPkOekuilcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgfSwg5o6S5bqP5ZCNLCBsYXp5KSxcXG4gICAgY29sX3R5cGU6ICdmbGV4X2J1dHRvbicsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogTVlfVVJMICsgXFxcIl/mjpLluo9cXFwiXFxuICAgIH1cXG59KVxcbnRhYnMuZm9yRWFjaCgoZGF0YSwgaWQpID0+IHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBnZXRNeVZhcihNWV9VUkwsICcwJykgPT0gaWQgPyAn4oCc4oCcJyArIGRhdGEgKyAn4oCd4oCdJyA6IGRhdGEsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKOe6v+i3rywgbGF6eSwgaWQpID0+IHtcXG4gICAgICAgICAgICB2YXIgbGlzdHMgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwibGlzdHNcXFwiKTtcXG4gICAgICAgICAgICB2YXIg5o6S5bqPID0gZ2V0TXlWYXIoTVlfVVJMICsgXFxcIueroOiKguaOkuW6j1xcXCIsICcjMWFhZDE5XFxcIj7mraPluo8nKTtcXG4gICAgICAgICAgICB2YXIg5o+Q56S6ID0g5o6S5bqPID09ICcjRkYwMDAwXFxcIj7lgJLluo8nID8gJyMxYWFkMTlcXFwiPuato+W6jycgOiAnI0ZGMDAwMFxcXCI+5YCS5bqPJztcXG5cXG4gICAgICAgICAgICDnur/ot68uZm9yRWFjaCgoZGF0YSwgeGxpZCkgPT4ge1xcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpZCA9PSB4bGlkID8gJ+KAnOKAnCcgKyBkYXRhICsgJ+KAneKAnScgOiBkYXRhLFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogTVlfVVJMICsgXFxcIl/nur/ot69cXFwiICsgeGxpZFxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX1VSTCwgaWQpXFxuICAgICAgICAgICAgdmFyIOeroOiKgiA9IGxpc3RzW2dldE15VmFyKE1ZX1VSTCwgJzAnKV07XFxuICAgICAgICAgICAgaWYgKOaOkuW6jyA9PSAnI0ZGMDAwMFxcXCI+5YCS5bqPJykge1xcbiAgICAgICAgICAgICAgICDnq6DoioIucmV2ZXJzZSgpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBjcCA9IOeroOiKgi5tYXAoKGRhdGEsIHNzaWQpID0+IHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBwZGZoKGRhdGEsICdhJiZUZXh0JyksXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHBkKGRhdGEsICdhJiZocmVmJykgKyBsYXp5LFxcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IOeroOiKgi5sZW5ndGggPiAzID8gJ3RleHRfNCcgOiAndGV4dF8yJyxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xzOiBNWV9VUkwgKyBcXFwiX+mAiembhlxcXCJcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBkZWxldGVJdGVtQnlDbHMoTVlfVVJMICsgXFxcIl/pgInpm4ZcXFwiKTtcXG4gICAgICAgICAgICBhZGRJdGVtQmVmb3JlKE1ZX1VSTCArIFxcXCJmb290ZXJcXFwiLCBjcCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgfSwgdGFicywgbGF6eSwgaWQpLFxcbiAgICAgICAgY29sX3R5cGU6ICdmbGV4X2J1dHRvbicsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBNWV9VUkwgKyBcXFwiX+e6v+i3r1xcXCIgKyBpZFxcbiAgICAgICAgfVxcbiAgICB9KTtcXG59KVxcblxcbmlmICjmjpLluo8gPT0gJyNGRjAwMDBcXFwiPuWAkuW6jycpIHtcXG4gICAgbGlzdC5yZXZlcnNlKClcXG59XFxubGlzdC5mb3JFYWNoKChkYXRhLCBpZCkgPT4ge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IHBkZmgoZGF0YSwgJ2EmJlRleHQnKSxcXG4gICAgICAgIHVybDogcGQoZGF0YSwgJ2EmJmhyZWYnKSArIGxhenksXFxuICAgICAgICBjb2xfdHlwZTogbGlzdC5sZW5ndGggPiAzID8gJ3RleHRfNCcgOiAndGV4dF8yJyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgY2xzOiBNWV9VUkwgKyBcXFwiX+mAiembhlxcXCJcXG4gICAgICAgIH1cXG4gICAgfSk7XFxufSlcXG5sZXQgbmV3c3RpcCA9IGxpc3QubGVuZ3RoO1xcbmlmIChuZXdzdGlwKSB7XFxuICAgIHNldExhc3RDaGFwdGVyUnVsZSgnanM6JyArICQudG9TdHJpbmcoKG5ld3N0aXApID0+IHtcXG4gICAgICAgIHNldFJlc3VsdCgn5pu05paw6IezOiDnrKwnICsgbmV3c3RpcCArIFxcXCLpm4ZcXFwiKTtcXG4gICAgfSwgbmV3c3RpcCkpO1xcbn1cXG5cXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImJpZ19ibGFua19ibG9ja1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogTVlfVVJMICsgXFxcImZvb3RlclxcXCJcXG4gICAgfVxcbn0pO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi546v5aKD5Yqr5oyBXCIsXCJwYXRoXCI6XCJoaWphY2tFbnZcIixcInJ1bGVcIjpcInZhciB7IFJVTEUsIGlzSW5kZXgsIHBhZ2VUaXRsZSB9ID0gTVlfUEFSQU1TXFxuUlVMRSA9IEpTT04ucGFyc2UoYmFzZTY0RGVjb2RlKFJVTEUpKVxcbnZhciBvcmlSVUxFID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZGF0YUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRSkuZmluZCgodikgPT4gdi50aXRsZSA9PSBSVUxFLnRpdGxlKVxcbmlmIChpc0luZGV4KSB7XFxuICAgIFJVTEUgPSBvcmlSVUxFXFxuICAgIHZhciB7IHRhYkhlYWRlciwgZnlBbGwgfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL0NsYXNzVGFiP3J1bGU9JyArIFFJTkdfVElUTEUsIE9iamVjdC5hc3NpZ24oeyBRSU5HX1RJVExFOiBRSU5HX1RJVExFIH0sIFJVTEUpKVxcbiAgICAvLyDlpITnkIZNWV9SVUxFXFxuICAgIE1ZX1JVTEUuY2xhc3NfdXJsID0gdGFiSGVhZGVyLmdldENsYXNzKGZ5QWxsID8gJ2Z5QWxsJyA6ICdmeWNsYXNzJykudXJsXFxuICAgIE1ZX1JVTEUuYXJlYV91cmwgPSBmeUFsbCA/IE1ZX1JVTEUuY2xhc3NfdXJsIDogdGFiSGVhZGVyLmdldENsYXNzKCdmeWFyZWEnKS51cmxcXG4gICAgTVlfUlVMRS55ZWFyX3VybCA9IGZ5QWxsID8gTVlfUlVMRS5jbGFzc191cmwgOiB0YWJIZWFkZXIuZ2V0Q2xhc3MoJ2Z5eWVhcicpLnVybFxcbiAgICBNWV9SVUxFLnNvcnRfdXJsID0gZnlBbGwgPyBNWV9SVUxFLmNsYXNzX3VybCA6IHRhYkhlYWRlci5nZXRDbGFzcygnZnlzb3J0JykudXJsXFxuICAgIE1ZX1JVTEUudXJsID0gUlVMRS51cmxcXG4gICAgTVlfUlVMRS5jb2xfdHlwZSA9IFJVTEUuY29sX3R5cGVcXG4gICAgTVlfUlVMRS5kZXRhaWxfY29sX3R5cGUgPSBSVUxFLmRldGFpbF9jb2xfdHlwZVxcbiAgICBNWV9SVUxFLmZpbmRfcnVsZSA9IFJVTEUuZmluZF9ydWxlXFxuICAgIE1ZX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSA9IFJVTEUuZGV0YWlsX2ZpbmRfcnVsZVxcbiAgICBNWV9SVUxFLnBhcmFtcyA9IHt9XFxufSBlbHNlIHtcXG4gICAgUlVMRS5wYWdlcyA9IG9yaVJVTEUucGFnZXNcXG4gICAgLy8g5aSE55CGTVlfUlVMRVxcbiAgICBNWV9SVUxFLnVybCA9IE1ZX1BBUkFNUy51cmxcXG4gICAgTVlfUlVMRS5jb2xfdHlwZSA9IFJVTEUuZGV0YWlsX2NvbF90eXBlXFxuICAgIE1ZX1JVTEUuZmluZF9ydWxlID0gUlVMRS5kZXRhaWxfZmluZF9ydWxlXFxuICAgIE1ZX1JVTEUucGFyYW1zID0gUlVMRS5wYXJhbXNcXG59XFxuTVlfUlVMRS5wYWdlcyA9IFJVTEUucGFnZXNcXG5NWV9SVUxFLnBhZ2VMaXN0ID0gSlNPTi5wYXJzZShNWV9SVUxFLnBhZ2VzIHx8ICdbXScpXFxuTVlfUlVMRS50aXRsZSA9IFJVTEUudGl0bGVcXG5NWV9SVUxFLnVhID0gUlVMRS51YVxcbi8vIOi9veWFpeWHveaVsOW3peWFt1xcbnZhciB7IGdlbk15UnVsZSB9ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZnVuY1Rvb2xzP3J1bGU9JyArIFFJTkdfVElUTEUsIHtcXG4gICAgUUlOR19USVRMRTogUUlOR19USVRMRSxcXG4gICAgTVlfUlVMRTogTVlfUlVMRSxcXG4gICAgaXNJbmRleDogaXNJbmRleFxcbn0pXFxuLy8g6Ziy5q2icmVxdWlyZeWkmuasoei/kOihjFxcbmNvbnN0IG15Q29sbF9yZXF1aXJlZCA9IHt9XFxucmVxdWlyZSA9IGZ1bmN0aW9uKHBhcmFtMCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KSB7XFxuICAgIGlmIChteUNvbGxfcmVxdWlyZWRbcGFyYW0wXSkgcmV0dXJuXFxuICAgIG15Q29sbF9yZXF1aXJlZFtwYXJhbTBdID0gdHJ1ZVxcbiAgICBwYXJhbTIgPSBwYXJhbTIgIT0gbnVsbCA/IHBhcmFtMiA6IDBcXG4gICAgcGFyYW0zID0gTVlfVElDS0VUXFxuICAgIHBhcmFtNCA9IGV2YWxcXG4gICAgcmV0dXJuIG1ldGhvZF9yZXF1aXJlLmludm9rZShqYXZhQ29udGV4dCwgcGFyYW0wLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpXFxufVxcbnJlcXVpcmVDYWNoZSA9IGZ1bmN0aW9uKHBhcmFtMCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUpIHtcXG4gICAgaWYgKG15Q29sbF9yZXF1aXJlZFtwYXJhbTBdKSByZXR1cm5cXG4gICAgbXlDb2xsX3JlcXVpcmVkW3BhcmFtMF0gPSB0cnVlXFxuICAgIHBhcmFtMyA9IHBhcmFtMyAhPSBudWxsID8gcGFyYW0zIDogMFxcbiAgICBwYXJhbTQgPSBNWV9USUNLRVRcXG4gICAgcGFyYW01ID0gZXZhbFxcbiAgICByZXR1cm4gbWV0aG9kX3JlcXVpcmVDYWNoZS5pbnZva2UoamF2YUNvbnRleHQsIHBhcmFtMCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUpXFxufVxcbnJjID0gcmVxdWlyZUNhY2hlXFxuLy8g5pyA5paw56ug6IqC6KeE5YiZ546v5aKD5Yqr5oyBXFxuc2V0TGFzdENoYXB0ZXJSdWxlID0gZnVuY3Rpb24ocGFyYW0wKSB7XFxuICAgIGlmIChwYXJhbTAuc3RhcnRzV2l0aChcXFwianM6XFxcIikpIHtcXG4gICAgICAgIHBhcmFtMCA9ICdqczonICsgJC50b1N0cmluZygoUUlOR19USVRMRSwgTVlfUEFSQU1TKSA9PiB7XFxuICAgICAgICAgICAgZXZhbChKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL3BhZ2UvaGlqYWNrRW52P3J1bGU9JyArIFFJTkdfVElUTEUpKS5ydWxlKVxcbiAgICAgICAgICAgIHZhciB7IHJ1blByZVJ1bGUgfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2Z1bmNUb29scz9ydWxlPScgKyBRSU5HX1RJVExFKVxcbiAgICAgICAgICAgIHJ1blByZVJ1bGUob3JpUlVMRS5wcmVSdWxlKVxcbiAgICAgICAgfSwgUUlOR19USVRMRSwgeyB1cmw6IE1ZX1JVTEUudXJsLCBSVUxFOiBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoZ2VuTXlSdWxlKCkpKSwgaXNJbmRleDogaXNJbmRleCB9KSArICc7JyArIHBhcmFtMC5zbGljZSgzKVxcbiAgICB9XFxuICAgIG1ldGhvZF9zZXRMYXN0Q2hhcHRlclJ1bGUuaW52b2tlKGphdmFDb250ZXh0LCBwYXJhbTApXFxufVxcbi8vIOWKqOaAgeaWsOWinuWHveaVsOWKq+aMgVxcbmFkZEl0ZW1BZnRlciA9IGZ1bmN0aW9uKHBhcmFtMCwgcGFyYW0xKSB7XFxuICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtMSkpIHBhcmFtMSA9IHBhcmFtMS5tYXAoaGlqYWNrRWwpXFxuICAgIGVsc2UgcGFyYW0xID0gaGlqYWNrRWwocGFyYW0xKVxcbiAgICBtZXRob2RfYWRkSXRlbUFmdGVyLmludm9rZShqYXZhQ29udGV4dCwgcGFyYW0wLCBwYXJhbTEpXFxufVxcbmFkZEl0ZW1CZWZvcmUgPSBmdW5jdGlvbihwYXJhbTAsIHBhcmFtMSkge1xcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbTEpKSBwYXJhbTEgPSBwYXJhbTEubWFwKGhpamFja0VsKVxcbiAgICBlbHNlIHBhcmFtMSA9IGhpamFja0VsKHBhcmFtMSlcXG4gICAgbWV0aG9kX2FkZEl0ZW1CZWZvcmUuaW52b2tlKGphdmFDb250ZXh0LCBwYXJhbTAsIHBhcmFtMSlcXG59XFxuXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlh73mlbDlt6XlhbdcIixcInBhdGhcIjpcImZ1bmNUb29sc1wiLFwicnVsZVwiOlwibGV0IHsgUUlOR19USVRMRSwgTVlfUlVMRSwgaXNJbmRleCB9ID0gJC5pbXBvcnRQYXJhbVxcbmlmICghTVlfUlVMRSkgTVlfUlVMRSA9IHt9XFxuXFxuZnVuY3Rpb24gcnVuQ29kZShydWxlKSB7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgW2lucHV0LCBjb2RlXSA9IHJ1bGUuc3BsaXQoJy5qczonKVxcbiAgICAgICAgcmV0dXJuIGNvZGUgPyBldmFsKGNvZGUpIDogcnVsZVxcbiAgICB9IGNhdGNoIChlKSB7IHJldHVybiBydWxlIH1cXG59XFxuLy8g6aaW6aG16ZO+5o6l5pu/5o2i5YiG57G7XFxuZnVuY3Rpb24gaW5kZXhVcmwocGFyYW0pIHtcXG4gICAgTVlfUlVMRSA9IEpTT04ucGFyc2UoYmFzZTY0RGVjb2RlKE1ZX1JVTEUpKVxcbiAgICBsZXQgcGFnZU51bSA9IHBhcnNlSW50KHBhcmFtLnNwbGl0KCcjIyMnKVsxXSksXFxuICAgICAgICB1cmwgPSBNWV9SVUxFLnVybCxcXG4gICAgICAgIHsgZnlBbGwsIHRhYkhlYWRlciB9ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvQ2xhc3NUYWI/cnVsZT0nICsgUUlOR19USVRMRSwgT2JqZWN0LmFzc2lnbih7IFFJTkdfVElUTEU6IFFJTkdfVElUTEUgfSwgTVlfUlVMRSkpXFxuXFxuICAgIHVybCA9IHRhYkhlYWRlci5zZXRVcmwoZnlBbGwgPyB1cmwucmVwbGFjZSgvZnlBbGwvZywgJyQke2Z5QWxsfScpIDogdXJsLnJlcGxhY2UoL2Z5KGNsYXNzfGFyZWF8eWVhcnxzb3J0KS9nLCAnJCR7ZnkkMX0nKSlcXG4gICAgdXJsID0gdXJsLnJlcGxhY2UoL2Z5cGFnZSg/OkAoLT9cXFxcZCspQCk/KD86XFxcXCooXFxcXGQrKUApPy9nLCAoXywgc3RhcnQsIHNwYWNlKSA9PiBwYXJzZUludChzdGFydCB8fCAwKSArIDEgKyAocGFnZU51bSAtIDEpICogcGFyc2VJbnQoc3BhY2UgfHwgMSkpXFxuICAgIHVybCA9IC9eKFtcXFxcc1xcXFxTXSo/KSg/OlxcXFxbZmlyc3RQYWdlPShbXFxcXHNcXFxcU10qPylcXFxcXSk/KD86KFxcXFwuanM6W1xcXFxzXFxcXFNdKj8pKT8kLy5leGVjKHVybClcXG4gICAgaWYgKHBhZ2VOdW0gPT0gMSAmJiB1cmxbMl0pIHVybFsxXSA9IHVybFsyXVxcbiAgICBpZiAodXJsWzNdICYmICF1cmxbMV0uaW5jbHVkZXMoJy5qczonKSkgdXJsWzFdICs9IHVybFszXVxcbiAgICByZXR1cm4gcnVuQ29kZSh1cmxbMV0pXFxufVxcblxcbmZ1bmN0aW9uIHBhcmFtSGFuZGxlKHVybFBhcmFtLCB1YSwgdXJsVG1wKSB7XFxuICAgIGxldCBjaGFyc2V0LCBwYXJhbVRtcFxcbiAgICB0cnkgeyAvLyDpk77mjqXnmoTnvJbnoIHjgIFVQeWSjFJlZmVyZXLlupTor6XmmK/pppblhYjnu6fmib/pppbpobXpk77mjqVcXG4gICAgICAgIFssICwgY2hhcnNldCwgcGFyYW1UbXBdID0gdXJsVG1wLnNwbGl0KCc7JylcXG4gICAgICAgIHBhcmFtVG1wID0gcGFyYW1UbXAubWF0Y2goL157KC4qKX0kLylbMV0uc3BsaXQoJyYmJylcXG4gICAgfSBjYXRjaCAoZSkgeyBwYXJhbVRtcCA9IFtdIH1cXG4gICAgbGV0IFVzZXJBZ2VudCA9IHBhcmFtVG1wLmZpbmQoKHYpID0+IHYuc3RhcnRzV2l0aCgnVXNlci1BZ2VudEAnKSksXFxuICAgICAgICBSZWZlcmVyID0gcGFyYW1UbXAuZmluZCgodikgPT4gdi5zdGFydHNXaXRoKCdSZWZlcmVyQCcpKVxcbiAgICB1cmxQYXJhbVswXSA9IHVybFBhcmFtWzBdIHx8ICdHRVQnXFxuICAgIHVybFBhcmFtWzFdID0gdXJsUGFyYW1bMV0gfHwgY2hhcnNldCB8fCAnVVRGLTgnXFxuICAgIHRyeSB7XFxuICAgICAgICB1cmxQYXJhbVsyXSA9IHVybFBhcmFtWzJdLm1hdGNoKC9eeyguKil9JC8pWzFdLnNwbGl0KCcmJicpXFxuICAgIH0gY2F0Y2ggKGUpIHsgdXJsUGFyYW1bMl0gPSBbXSB9XFxuICAgIC8vIOa3u+WKoOWFqOWxgFVB5ZKM5LiK57qnUmVmZXJlclxcbiAgICBpZiAoIXVybFBhcmFtWzJdLnNvbWUoKHYpID0+IHYuc3RhcnRzV2l0aCgnVXNlci1BZ2VudEAnKSkpIHtcXG4gICAgICAgIGlmIChVc2VyQWdlbnQpIHVybFBhcmFtWzJdLnB1c2goVXNlckFnZW50KVxcbiAgICAgICAgZWxzZSBpZiAodWEgPT0gJ3BjJylcXG4gICAgICAgICAgICB1cmxQYXJhbVsyXS5wdXNoKCdVc2VyLUFnZW50QCcgKyBQQ19VQS5yZXBsYWNlKC87L2csICfvvJvvvJsnKS5yZXBsYWNlKC9cXFxcPy8sICfvvJ/vvJ8nKSlcXG4gICAgICAgIGVsc2UgaWYgKHVhID09ICdtb2JpbGUnKVxcbiAgICAgICAgICAgIHVybFBhcmFtWzJdLnB1c2goJ1VzZXItQWdlbnRAJyArIE1PQklMRV9VQS5yZXBsYWNlKC87L2csICfvvJvvvJsnKS5yZXBsYWNlKC9cXFxcPy8sICfvvJ/vvJ8nKSlcXG4gICAgfVxcbiAgICBpZiAoUmVmZXJlciAmJiAhdXJsUGFyYW1bMl0uc29tZSgodikgPT4gdi5zdGFydHNXaXRoKCdSZWZlcmVyQCcpKSlcXG4gICAgICAgIHVybFBhcmFtWzJdLnB1c2goUmVmZXJlcilcXG4gICAgdXJsUGFyYW1bMl0gPSAneycgKyB1cmxQYXJhbVsyXS5qb2luKCcmJicpICsgJ30nXFxuICAgIHJldHVybiB1cmxQYXJhbS5qb2luKCc7JylcXG59XFxuLy8vIOmihOWkhOeQhuW5tuWIneWni+WMlmNvbmZpZ1xcbmZ1bmN0aW9uIHJ1blByZVJ1bGUocnVsZSkge1xcbiAgICBpZiAoKHR5cGVvZiBNWV9QQUdFICE9ICd1bmRlZmluZWQnICYmICBNWV9QQUdFID09IDEpICYmXFxuICAgICAgICAgKGlzSW5kZXggfHwgIWdldE15VmFyKCckcHJlUnVsZV8nICsgTVlfUlVMRS50aXRsZSkpKSB7XFxuICAgICAgICBldmFsKHJ1bGUpXFxuICAgICAgICBwdXRNeVZhcignJHByZVJ1bGVfJyArIE1ZX1JVTEUudGl0bGUsICdUJylcXG4gICAgfVxcbiAgICBsZXQgX2NmZyA9IGdldE15VmFyKCdpbml0Q29uZmlnJywgJ3t9JylcXG4gICAgaWYgKF9jZmcgJiYgX2NmZy5sZW5ndGggPiAwKSB7XFxuICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKF9jZmcpXFxuICAgIH1cXG59XFxuLy8g5q2j5paH6Kej5p6Q6YCa55So5Y+Y6YePXFxuZnVuY3Rpb24gZ2VuTXlSdWxlKCkge1xcbiAgICBsZXQgUlVMRSA9IE9iamVjdC5hc3NpZ24oe30sIE1ZX1JVTEUpXFxuICAgIGRlbGV0ZSBSVUxFLmxhc3RfY2hhcHRlcl9ydWxlXFxuICAgIGRlbGV0ZSBSVUxFLnByZVJ1bGVcXG4gICAgZGVsZXRlIFJVTEUucGFnZUxpc3RcXG4gICAgZGVsZXRlIFJVTEUucGFnZXNcXG4gICAgcmV0dXJuIFJVTEVcXG59XFxuXFxuZnVuY3Rpb24gZ2VuRXhVcmwodXJsKSB7XFxuICAgIHVybCA9IHVybC5zcGxpdCgnOycpXFxuICAgIHJldHVybiB1cmwuc2hpZnQoKSArICc7JyArIHBhcmFtSGFuZGxlKHVybCwgTVlfUlVMRS51YSwgTVlfUlVMRS51cmwpXFxufVxcblxcbmhpamFja0xhenlSdWxlID0gJC50b1N0cmluZygoUUlOR19USVRMRSwgTVlfUEFSQU1TKSA9PiB7XFxuICAgIGlmICghTVlfUlVMRSkgTVlfUlVMRSA9IHt9XFxuICAgIGV2YWwoSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9wYWdlL2hpamFja0Vudj9ydWxlPScgKyBRSU5HX1RJVExFKSkucnVsZSlcXG4gICAgdmFyIHtcXG4gICAgICAgIHBhcmFtSGFuZGxlLFxcbiAgICAgICAgZ2VuRXhVcmwsXFxuICAgICAgICBoaWphY2tMYXp5UnVsZSxcXG4gICAgICAgIGhpamFja0VsXFxuICAgIH0gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9mdW5jVG9vbHM/cnVsZT0nICsgUUlOR19USVRMRSlcXG59LCBRSU5HX1RJVExFLCB7IHVybDogTVlfUlVMRS51cmwsIFJVTEU6IGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShnZW5NeVJ1bGUoKSkpLCBpc0luZGV4OiBpc0luZGV4IH0pXFxuXFxuZnVuY3Rpb24gaGlqYWNrRWwoZWwpIHtcXG4gICAgaWYoIWVsIHx8IHR5cGVvZiBlbCAhPSAnb2JqZWN0JykgcmV0dXJuXFxuICAgIGlmICghZWwuZXh0cmEpIGVsLmV4dHJhID0ge31cXG4gICAgZWwuY29sX3R5cGUgPSBlbC5jb2xfdHlwZSB8fCBNWV9SVUxFLmNvbF90eXBlXFxuICAgIGxldCBOT1dfUlVMRSA9IE9iamVjdC5hc3NpZ24oZ2VuTXlSdWxlKCksIHsgcGFyYW1zOiBlbC5leHRyYSB9KVxcblxcbiAgICBpZiAodHlwZW9mIGVsLnVybCAhPSAnc3RyaW5nJyB8fFxcbiAgICAgICAgWyd4NV93ZWJ2aWV3X3NpbmdsZScsICdpbnB1dCddLmZpbmQoKHYpID0+IGVsLmNvbF90eXBlID09IHYpIHx8XFxuICAgICAgICBbJ+a1t+mYlOinhueVjCcsICdqYXZhc2NyaXB0OiddLmZpbmQoKHYpID0+IGVsLnVybC5zdGFydHNXaXRoKHYpKSB8fFxcbiAgICAgICAgWydydWxlJywgJ3BpY3MnLCAndG9hc3QnLCAnY29weScsICdlZGl0RmlsZScsICd4NScsICd4NVdlYlZpZXcnLCAneDVQbGF5JywgJ3dlYicsICd4NVJ1bGUnLCAnd2ViUnVsZScsXFxuICAgICAgICAgICAgJ2Rvd25sb2FkJywgJ3NoYXJlJywgJ2ZpbGVTZWxlY3QnLCAndmlkZW8nXS5maW5kKCh2KSA9PiBlbC51cmwuc3RhcnRzV2l0aCh2ICsgJzovLycpKSkge1xcbiAgICAgICAgcmV0dXJuIGVsXFxuICAgIH0gZWxzZSBpZiAoZWwudXJsLnN0YXJ0c1dpdGgoJ2lucHV0Oi8vJykpIHtcXG4gICAgICAgIGxldCBwYXJhID0gSlNPTi5wYXJzZShlbC51cmwuc2xpY2UoOCkpXFxuICAgICAgICBpZiAocGFyYS5qcykgcGFyYS5qcyA9IGhpamFja0xhenlSdWxlICsgJzsnICsgcGFyYS5qc1xcbiAgICAgICAgZWwudXJsID0gJ2lucHV0Oi8vJyArIEpTT04uc3RyaW5naWZ5KHBhcmEpXFxuICAgICAgICByZXR1cm4gZWxcXG4gICAgfSBlbHNlIGlmIChlbC51cmwuc3RhcnRzV2l0aCgnY29uZmlybTovLycpKSB7XFxuICAgICAgICBsZXQgcmVJbmRleCA9IGVsLnVybC5pbmRleE9mKCcuanM6JylcXG4gICAgICAgIGlmIChyZUluZGV4ID49IDApIGVsLnVybCA9IGVsLnVybC5zbGljZSgwLCByZUluZGV4KSArICcuanM6JyArIGhpamFja0xhenlSdWxlICsgJzsnICsgZWwudXJsLnNsaWNlKHJlSW5kZXggKyA0KVxcbiAgICAgICAgcmV0dXJuIGVsXFxuICAgIH0gZWxzZSBpZiAoZWwudXJsLnN0YXJ0c1dpdGgoJ3NlbGVjdDovLycpKSB7XFxuICAgICAgICBsZXQgcGFyYSA9IEpTT04ucGFyc2UoZWwudXJsLnNsaWNlKDkpKVxcbiAgICAgICAgaWYgKHBhcmEuanMpIHBhcmEuanMgPSBoaWphY2tMYXp5UnVsZSArICc7JyArIHBhcmEuanNcXG4gICAgICAgIGVsLnVybCA9ICdzZWxlY3Q6Ly8nICsgSlNPTi5zdHJpbmdpZnkocGFyYSlcXG4gICAgICAgIHJldHVybiBlbFxcbiAgICB9IGVsc2UgaWYgKGVsLnVybC5pbmNsdWRlcygnQHJ1bGU9JykpIHtcXG4gICAgICAgIGxldCBbXywgdXJsLCBydWxlXSA9IGVsLnVybC5tYXRjaCgvXihbXFxcXHNcXFxcU10qPylAcnVsZT0oW1xcXFxzXFxcXFNdKikkLylcXG4gICAgICAgIGVsLnVybCA9IHVybFxcbiAgICAgICAgTk9XX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSA9IHJ1bGVcXG4gICAgICAgIE5PV19SVUxFLmRldGFpbF9jb2xfdHlwZSA9IE1ZX1JVTEUuY29sX3R5cGVcXG4gICAgfSBlbHNlIGlmIChlbC51cmwuc3RhcnRzV2l0aCgnaGlrZXI6Ly9wYWdlLycpKSB7XFxuICAgICAgICBpZiAoZWwudXJsLmluY2x1ZGVzKCdydWxlPScpIHx8IGVsLmV4dHJhLnJ1bGUpXFxuICAgICAgICAgICAgcmV0dXJuIGVsXFxuICAgICAgICBsZXQgW18sIHBhdGgsIGZsYWcsIHBhcmFtc10gPSBlbC51cmwubWF0Y2goL15oaWtlcjpcXFxcL1xcXFwvcGFnZVxcXFwvKC4rPykoIy4qPyk/KD86XFxcXD8oLiopKT8kLyksXFxuICAgICAgICAgICAgc3ViUGFnZSA9IE1ZX1JVTEUucGFnZUxpc3QuZmluZCgodikgPT4gdi5wYXRoID09IHBhdGgpLFxcbiAgICAgICAgICAgIHN1YlVybCA9IChwYXJhbXMgfHwgJycpLnNwbGl0KCcmJykuZmluZCgodikgPT4gdi5zdGFydHNXaXRoKCd1cmw9JykpXFxuICAgICAgICBlbC51cmwgPSAoc3ViVXJsID8gc3ViVXJsLnNsaWNlKDQpLnJlcGxhY2UoL++8n++8ny9nLCAnPycpLnJlcGxhY2UoL++8hu+8hi9nLCAnJicpIDogKGVsLmV4dHJhIHx8IHt9KS51cmwpIHx8ICdoaWtlcjovL2VtcHR5JyArIGZsYWcgKyAnPycgKyAocGFyYW1zIHx8ICcnKVxcbiAgICAgICAgTk9XX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSA9IHN1YlBhZ2UucnVsZVxcbiAgICAgICAgTk9XX1JVTEUuZGV0YWlsX2NvbF90eXBlID0gc3ViUGFnZS5jb2xfdHlwZVxcbiAgICB9IGVsc2UgaWYgKGVsLnVybC5pbmNsdWRlcygnQGxhenlSdWxlPScpKSB7XFxuICAgICAgICBsZXQgcmVJbmRleCA9IGVsLnVybC5pbmRleE9mKCcuanM6JylcXG4gICAgICAgIGlmIChyZUluZGV4ID49IDApIGVsLnVybCA9IGVsLnVybC5zbGljZSgwLCByZUluZGV4KSArICcuanM6JyArIGhpamFja0xhenlSdWxlICsgJzsnICsgZWwudXJsLnNsaWNlKHJlSW5kZXggKyA0KVxcbiAgICAgICAgcmV0dXJuIGVsXFxuICAgIH0gZWxzZSBpZiAoaXNJbmRleCkge1xcbiAgICAgICAgaWYgKCFNWV9SVUxFLmRldGFpbF9maW5kX3J1bGUgfHwgL2hpa2VyOlxcXFwvXFxcXC8oPyFlbXB0eS4rJCkvLnRlc3QoZWwudXJsKSkgcmV0dXJuIGVsXFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gZWxcXG4gICAgfVxcbiAgICBlbC5leHRyYSA9IE9iamVjdC5hc3NpZ24oe30sIGVsLmV4dHJhLCB7XFxuICAgICAgICB1cmw6IGdlbkV4VXJsKGVsLnVybCksXFxuICAgICAgICBSVUxFOiBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoTk9XX1JVTEUpKSxcXG4gICAgICAgIHBhZ2VUaXRsZTogaXNJbmRleCAmJiBlbC50aXRsZVxcbiAgICB9KVxcbiAgICBlbC51cmwgPSAnaGlrZXI6Ly9wYWdlL2ZyYW1lTG9hZD9ydWxlPScgKyBRSU5HX1RJVExFXFxuICAgIHJldHVybiBlbFxcbn1cXG4kLmV4cG9ydHMgPSB7XFxuICAgIHJ1bkNvZGU6IHJ1bkNvZGUsXFxuICAgIGluZGV4VXJsOiBpbmRleFVybCxcXG4gICAgcGFyYW1IYW5kbGU6IHBhcmFtSGFuZGxlLFxcbiAgICBydW5QcmVSdWxlOiBydW5QcmVSdWxlLFxcbiAgICBnZW5NeVJ1bGU6IGdlbk15UnVsZSxcXG4gICAgZ2VuRXhVcmw6IGdlbkV4VXJsLFxcbiAgICBoaWphY2tMYXp5UnVsZTogaGlqYWNrTGF6eVJ1bGUsXFxuICAgIGhpamFja0VsOiBoaWphY2tFbFxcbn1cXG5cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIueIseexs+aOqOexu+ino+aekCpcIixcInBhdGhcIjpcImpzXCIsXCJydWxlXCI6XCJ2YXIg5ryr55S76Kej5p6QID0gJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgdmFyIHVybCA9IGlucHV0LnJlcGxhY2UoJ20nLCd3d3cnKTtcXG4gICAgICAgICAgICBldmFsKHBkZmgoZmV0Y2hQQyh1cmwpLCBcXFwiYm9keSYmc2NyaXB0JiZIdG1sXFxcIikpO1xcbiAgICAgICAgICAgIHZhciBwaWNzID0gW107XFxuICAgICAgICAgICAgaWYgKGNoYXB0ZXJJbWFnZXMubGVuZ3RoID4gMSkge1xcbiAgICAgICAgICAgICAgICBjaGFwdGVySW1hZ2VzLmZvckVhY2goaW1nID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHBpY3MucHVzaChpbWcrJ0BSZWZlcmVyPScrdXJsKVxcbiAgICAgICAgICAgICAgICB9KX0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IHJlcXVlc3QoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBwZGZhKGh0bWwsICdib2R5JiYuc2Nyb2xsLWl0ZW0nKTtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IHBkZmEoaHRtbCwgJ2JvZHkmJiNpbWFnZScpO1xcbiAgICAgICAgICAgICAgICAgICAgbGlzdCA9IGZpcnN0LmNvbmNhdChsaXN0KTtcXG4gICAgICAgICAgICAgICAgICAgIGxpc3QuZm9yRWFjaChpbWcgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNzLnB1c2gocGRmaChpbWcsICdpbWcmJmRhdGEtc3JjfHxzcmMnKSsnQFJlZmVyZXI9JytpbnB1dClcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJwaWNzOi8vXFxcIiArIHBpY3Muam9pbihcXFwiJiZcXFwiKVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICB2YXIgbGF6eSA9IGBAbGF6eVJ1bGU9LmpzOmAgKyDmvKvnlLvop6PmnpA7XCJ9XSxcInBhcmFtc1wiOlwie1xcXCJSVUxFXFxcIjpcXFwiZXlKMGFYUnNaU0k2SXVlY2krYThxeUo5XFxcIixcXFwiaXNJbmRleFxcXCI6dHJ1ZSxcXFwidXJsXFxcIjpcXFwiaHR0cHM6Ly9tLnRhb21hbmh1YS5jb20vI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5IyMjIzEuanM6bGV0IHsgcnVuQ29kZSwgaW5kZXhVcmwgfSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9mdW5jVG9vbHPvvJ/vvJ9ydWxlPeiBmua8q/CflK5cXFxcXFxcIiwge1xcXFxcXFwiTVlfUlVMRVxcXFxcXFwiOlxcXFxcXFwiZXlKMGFYUnNaU0k2SXVlY2krYThxeUlzSW5WeWJDSTZJbWgwZEhCek9pOHZiUzUwWVc5dFlXNW9kV0V1WTI5dEx5SXNJbU5zWVhOelgyNWhiV1VpT2lJaUxDSmpiR0Z6YzE5MWNtd2lPaUlpTENKaGNtVmhYMjVoYldVaU9pSWlMQ0poY21WaFgzVnliQ0k2SWlJc0lubGxZWEpmYm1GdFpTSTZJaUlzSW5sbFlYSmZkWEpzSWpvaUlpd2ljMjl5ZEY5dVlXMWxJam9pSWl3aWMyOXlkRjkxY213aU9pSWlmUT09XFxcXFxcXCIsXFxcXFxcXCJRSU5HX1RJVExFXFxcXFxcXCI6XFxcXFxcXCLogZrmvKvwn5SuXFxcXFxcXCJ9Ke+8m++8m2luZGV4VXJsKGlucHV0KTtHRVQ7VVRGLTg7e1VzZXItQWdlbnRATW96aWxsYS81LjAgKExpbnV477yb77ybIEFuZHJvaWQgMTLvvJvvvJsgUERITTAwIEJ1aWxkL1JLUTEuMjExMTAzLjAwMu+8m++8myB3dikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzk3LjAuNDY5Mi45OCBNb2JpbGUgU2FmYXJpLzUzNy4zNn1cXFwifVwiLFwic2F2ZWRcIjpmYWxzZSxcInRpdGxlXCI6XCLogZrmvKvwn5SuXCIsXCJ2ZXJzaW9uXCI6MCxcInVybFwiOlwiaHR0cHM6Ly9tLnRhb21hbmh1YS5jb20vI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5IyMjIzEuanM6bGV0IHsgcnVuQ29kZSwgaW5kZXhVcmwgfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2Z1bmNUb29sc++8n++8n3J1bGU96IGa5ryr8J+UrlxcXCIsIHtcXFwiTVlfUlVMRVxcXCI6XFxcImV5SjBhWFJzWlNJNkl1ZWNpK2E4cXlJc0luVnliQ0k2SW1oMGRIQnpPaTh2YlM1MFlXOXRZVzVvZFdFdVkyOXRMeUlzSW1Oc1lYTnpYMjVoYldVaU9pSWlMQ0pqYkdGemMxOTFjbXdpT2lJaUxDSmhjbVZoWDI1aGJXVWlPaUlpTENKaGNtVmhYM1Z5YkNJNklpSXNJbmxsWVhKZmJtRnRaU0k2SWlJc0lubGxZWEpmZFhKc0lqb2lJaXdpYzI5eWRGOXVZVzFsSWpvaUlpd2ljMjl5ZEY5MWNtd2lPaUlpZlE9PVxcXCIsXFxcIlFJTkdfVElUTEVcXFwiOlxcXCLogZrmvKvwn5SuXFxcIn0p77yb77ybaW5kZXhVcmwoaW5wdXQpO0dFVDtVVEYtODt7VXNlci1BZ2VudEBNb3ppbGxhLzUuMCAoTGludXjvvJvvvJsgQW5kcm9pZCAxMu+8m++8myBQREhNMDAgQnVpbGQvUktRMS4yMTExMDMuMDAy77yb77ybIHd2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBDaHJvbWUvOTcuMC40NjkyLjk4IE1vYmlsZSBTYWZhcmkvNTM3LjM2fVwiLFwiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcImZpbmRfcnVsZVwiOlwianM6XFxuY29uc3QgUUlOR19USVRMRSA9IGdldE15VmFyKCdteUNvbGxlY3Rpb24nKVxcbnZhciBteUNvbGxfZWwgPSBbXVxcbmV2YWwoSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9wYWdlL2hpamFja0Vudj9ydWxlPScgKyBRSU5HX1RJVExFKSkucnVsZSlcXG5cXG5pZiAoIWlzSW5kZXgpIHtcXG4gICAgaWYgKHBhZ2VUaXRsZSkgc2V0UGFnZVRpdGxlKHBhZ2VUaXRsZSlcXG4gICAgc2V0TGFzdENoYXB0ZXJSdWxlKG9yaVJVTEUubGFzdF9jaGFwdGVyX3J1bGUpXFxuICAgIE1ZX1BBUkFNUyA9IE1ZX1JVTEUucGFyYW1zXFxufSBlbHNlIGlmIChNWV9QQUdFID09IDEpIHtcXG4gICAgdGFiSGVhZGVyLmxvYWQobXlDb2xsX2VsKVxcbiAgICBpZiAoUlVMRS5zZWFyY2hfdXJsKSBteUNvbGxfZWwucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuaQnOe0olxcXCIsXFxuICAgICAgICBkZXNjOiBcXFwi6L+Z5piv6IGa5ryr55qE5pCc57Si5ZOmfn5cXFwiLFxcbiAgICAgICAgdXJsOiAnXFxcImhpa2VyOi8vc2VhcmNoP3M9XFxcIitpbnB1dCcsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHJ1bGVzOiAkLnRvU3RyaW5nKChRSU5HX1RJVExFLCB0aXRsZSkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9kYXRhTG9hZD9ydWxlPScgKyBRSU5HX1RJVExFKVxcbiAgICAgICAgICAgICAgICBydWxlcyA9IFtydWxlcy5maW5kKCh2KSA9PiB2LnRpdGxlID09IHRpdGxlKV1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJ1bGVzKVxcbiAgICAgICAgICAgIH0sIFFJTkdfVElUTEUsIFJVTEUudGl0bGUpLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoJ3NlYXJjaEtleScsICcnKSxcXG4gICAgICAgICAgICBvbkNoYW5nZTogXFxcInB1dE15VmFyKCdzZWFyY2hLZXknLGlucHV0KVxcXCJcXG4gICAgICAgIH0sXFxuICAgICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgfSlcXG59XFxuLy8g5q2j5paH6Kej5p6QXFxudmFyIHtcXG4gICAgcGFyYW1IYW5kbGUsXFxuICAgIHJ1blByZVJ1bGUsXFxuICAgIGdlbkV4VXJsLFxcbiAgICBoaWphY2tMYXp5UnVsZVxcbn0gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9mdW5jVG9vbHM/cnVsZT0nICsgUUlOR19USVRMRSlcXG5ydW5QcmVSdWxlKG9yaVJVTEUucHJlUnVsZSlcXG5pZiAoTVlfUlVMRS5maW5kX3J1bGUuc3RhcnRzV2l0aCgnanM6JykpIHtcXG4gICAgbGV0IHsgaGlqYWNrRWwgfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2Z1bmNUb29scz9ydWxlPScgKyBRSU5HX1RJVExFKVxcbiAgICBzZXRSZXN1bHQgPSBmdW5jdGlvbihwYXJhbTAsIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpIHtcXG4gICAgICAgIHBhcmFtMSA9IENBTExCQUNLX0tFWVxcbiAgICAgICAgcGFyYW0yID0gTVlfUlVMRVxcbiAgICAgICAgcGFyYW0zID0gTVlfVFlQRVxcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW0wLmRhdGEpKSBwYXJhbTAgPSBwYXJhbTAuZGF0YVxcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkobXlDb2xsX2VsLCBwYXJhbTAubWFwKGhpamFja0VsKSlcXG4gICAgICAgIG1ldGhvZF9zZXRSZXN1bHQuaW52b2tlKGphdmFDb250ZXh0LCBteUNvbGxfZWwsIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpXFxuICAgIH1cXG4gICAgc2V0SG9tZVJlc3VsdCA9IHNldFJlc3VsdFxcbiAgICBzZXRTZWFyY2hSZXN1bHQgPSBzZXRSZXN1bHRcXG5cXG4gICAgZXZhbChNWV9SVUxFLmZpbmRfcnVsZS5zbGljZSgzKSlcXG59IGVsc2Uge1xcbiAgICBsZXQgeyBydW5Db2RlIH0gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9mdW5jVG9vbHM/cnVsZT0nICsgUUlOR19USVRMRSksXFxuICAgICAgICBbXywgZmluZFJ1bGUsIGRldGFpbEZpbmRSdWxlXSA9IE1ZX1JVTEUuZmluZF9ydWxlLm1hdGNoKC9eKFtcXFxcc1xcXFxTXSo/KSg/Oj09PihbXFxcXHNcXFxcU10qKSk/JC8pXFxuICAgIGZpbmRSdWxlID0gZmluZFJ1bGUuc3BsaXQoJzsnKVxcbiAgICBwYXJzZURvbUZvckFycmF5KGdldFJlc0NvZGUoKSwgZmluZFJ1bGUuc2hpZnQoKSkuZm9yRWFjaCgoZGF0YSkgPT4ge1xcbiAgICAgICAgbGV0IFt0aXRsZSwgaW1nLCBkZXNjLCB1cmxdID0gZmluZFJ1bGUubWFwKCh2LCBpKSA9PiB7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSAnKicpIHJldHVybiAnJ1xcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB2ID0gKGkgPT0gMSB8fCBpID09IDMpID9cXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZURvbShkYXRhLCB2KSA6XFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VEb21Gb3JIdG1sKGRhdGEsIHYpXFxuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSAzKSB2ID0gcnVuQ29kZSh2KVxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gJycgfVxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIHJlcyA9IHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLCB1cmw6IHVybCxcXG4gICAgICAgICAgICAgICAgZGVzYzogZGVzYywgaW1nOiBpbWcsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBNWV9SVUxFLmNvbF90eXBlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgaWYgKHJlcy51cmwpIHtcXG4gICAgICAgICAgICBpZiAocmVzLnVybC5pbmNsdWRlcygnQGxhenlSdWxlPScpKSB7XFxuICAgICAgICAgICAgICAgIGxldCByZUluZGV4ID0gcmVzLnVybC5pbmRleE9mKCcuanM6JylcXG4gICAgICAgICAgICAgICAgaWYgKHJlSW5kZXggPj0gMCkgcmVzLnVybCA9IHJlcy51cmwuc2xpY2UoMCwgcmVJbmRleCkgKyAnLmpzOicgKyBoaWphY2tMYXp5UnVsZSArICc7JyArIHJlcy51cmwuc2xpY2UocmVJbmRleCArIDQpXFxuICAgICAgICAgICAgfSBlbHNlICBpZiAoZGV0YWlsRmluZFJ1bGUpIHtcXG4gICAgICAgICAgICAgICAgcmVzLmV4dHJhID0ge1xcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBnZW5FeFVybCh1cmwpLFxcbiAgICAgICAgICAgICAgICAgICAgUlVMRTogYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KE9iamVjdC5hc3NpZ24oZ2VuTXlSdWxlKCksIHsgZGV0YWlsX2ZpbmRfcnVsZTogZGV0YWlsRmluZFJ1bGUgfSkpKSxcXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUaXRsZTogaXNJbmRleCAmJiB0aXRsZVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJlcy51cmwgPSAnaGlrZXI6Ly9wYWdlL2ZyYW1lTG9hZD9ydWxlPScgKyBRSU5HX1RJVExFXFxuICAgICAgICAgICAgfSBlbHNlIGlmIChNWV9SVUxFLmRldGFpbF9maW5kX3J1bGUpIHtcXG4gICAgICAgICAgICAgICAgcmVzLmV4dHJhID0ge1xcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBnZW5FeFVybCh1cmwpLFxcbiAgICAgICAgICAgICAgICAgICAgUlVMRTogYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KGdlbk15UnVsZSgpKSksXFxuICAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IGlzSW5kZXggJiYgdGl0bGVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXMudXJsID0gJ2hpa2VyOi8vcGFnZS9mcmFtZUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIG15Q29sbF9lbC5wdXNoKHJlcylcXG4gICAgfSlcXG4gICAgc2V0UmVzdWx0KG15Q29sbF9lbClcXG59XFxuXCIsXCJncm91cFwiOlwi6IGa5ZCIXCIsXCJ1YVwiOlwibW9iaWxlXCIsXCJwcmVSdWxlXCI6XCJwdXRNeVZhcignbXlDb2xsZWN0aW9uJywgTVlfUlVMRS50aXRsZSlcXG5wdXRNeVZhcigncmVtb3RlVXJsJywgJ2hpa2VyOi8vZmlsZXMvL3J1bGVzL1R6L0pNJylcXG4vLyBcXG4vKlxcbiovXCIsXCJwYWdlc1wiOlwiW3tcXFwiY29sX3R5cGVcXFwiOlxcXCJ0ZXh0XzFcXFwiLFxcXCJuYW1lXFxcIjpcXFwiQ2xhc3NUYWJcXFwiLFxcXCJwYXRoXFxcIjpcXFwiQ2xhc3NUYWJcXFwiLFxcXCJydWxlXFxcIjpcXFwidmFyIHtcXFxcbiAgICBRSU5HX1RJVExFLCB0aXRsZSwgdXJsLFxcXFxuICAgIGNsYXNzX25hbWUsIGNsYXNzX3VybCxcXFxcbiAgICBhcmVhX25hbWUsIGFyZWFfdXJsLFxcXFxuICAgIHllYXJfbmFtZSwgeWVhcl91cmwsXFxcXG4gICAgc29ydF9uYW1lLCBzb3J0X3VybFxcXFxufSA9ICQuaW1wb3J0UGFyYW1cXFxcbmNvbnN0IENsYXNzVGFiID0gZnVuY3Rpb24oY2xhc3NBcnJheSwgcGFyYW1zKSB7XFxcXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBwYXJhbXMpXFxcXG4gICAgdGhpcy5hcnIgPSBjbGFzc0FycmF5Lm1hcCh2ID0+IHRoaXMuaW5pdCh2KSlcXFxcbiAgICB0aGlzLnNpZ24gPSAnJCcgKyBRSU5HX1RJVExFICsgJ18nICsgKHRoaXMubmFtZSB8fCAnJykgKyAnXydcXFxcbiAgICB0aGlzLmNvbG9yID0gdGhpcy5jb2xvciB8fCAnIzEyYjY2OCdcXFxcbiAgICB0aGlzLmJvdW5kYXJ5ID0gdGhpcy5ib3VuZGFyeSB8fCAnYmxhbmtfYmxvY2snXFxcXG59XFxcXG5DbGFzc1RhYi5wcm90b3R5cGUgPSB7XFxcXG4gICAgY29uc3RydWN0b3I6IENsYXNzVGFiLFxcXFxuICAgIGxvYWQoZWwpIHtcXFxcbiAgICAgICAgbGV0IGZvbGRlZCA9IHRoaXMuZm9sZCAmJiBnZXRWYXIoJyRmb2xkXycgKyB0aGlzLnNpZ24sICcnKVxcXFxuICAgICAgICBpZiAodGhpcy5hcnIubGVuZ3RoID4gMSAmJiB0aGlzLmZvbGQpIGVsLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgKGZvbGRlZCA/ICfilrYnIDogJ+KWvCcpLmZvbnRjb2xvcignIzA0OWVmZicpLFxcXFxuICAgICAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChzaWduLCBmb2xkZWQpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBwdXRWYXIoJyRmb2xkXycgKyBzaWduLCBmb2xkZWQgPyAnJyA6ICdUJylcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxcXG4gICAgICAgICAgICB9LCB0aGlzLnNpZ24sIGZvbGRlZCksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxcXG4gICAgICAgIH0pXFxcXG4gICAgICAgIGxldCBhcnIgPSBmb2xkZWQgPyBbdGhpcy5hcnJbMF1dIDogdGhpcy5hcnJcXFxcbiAgICAgICAgYXJyLmZvckVhY2goKHYpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCB7IGlkLCBjbGFzc19uYW1lLCBjbGFzc191cmwgfSA9IHYsXFxcXG4gICAgICAgICAgICBzZWxlY3RlZCA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZ2V0Q2xhc3MoaWQpKVxcXFxuICAgICAgICAgICAgY2xhc3NfbmFtZS5mb3JFYWNoKChuYW1lLCBpKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IGNsYXNzX3VybFtpXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgbm93ID0gSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiBuYW1lLCB1cmw6IHVybCB9KVxcXFxuICAgICAgICAgICAgICAgIGVsLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogc2VsZWN0ZWQgPT0gbm93ID8gJ+KAnOKAnOKAneKAnScgKyBuYW1lLmZvbnRjb2xvcih0aGlzLmNvbG9yKS5ib2xkKCkgOiBuYW1lLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHNlbGVjdGVkID09IG5vdyA/ICdoaWtlcjovL2VtcHR5JyA6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHNpZ24sIGlkLCBub3cpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1dFZhcihzaWduICsgaWQsIG5vdylcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcXFxuICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnNpZ24sIGlkLCBub3cpLFxcXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxcXG4gICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICBlbC5wdXNoKHsgY29sX3R5cGU6IHRoaXMuYm91bmRhcnkgfSlcXFxcbiAgICAgICAgfSlcXFxcbiAgICB9LFxcXFxuICAgIGluaXQoY2xhc3NPYmplY3QpIHtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiBjbGFzc09iamVjdC5jbGFzc19uYW1lID09ICdzdHJpbmcnKVxcXFxuICAgICAgICAgICAgY2xhc3NPYmplY3QuY2xhc3NfbmFtZSA9IGNsYXNzT2JqZWN0LmNsYXNzX25hbWUuc3BsaXQoJyYnKVxcXFxuICAgICAgICBpZiAodHlwZW9mIGNsYXNzT2JqZWN0LmNsYXNzX3VybCA9PSAnc3RyaW5nJylcXFxcbiAgICAgICAgICAgIGNsYXNzT2JqZWN0LmNsYXNzX3VybCA9IGNsYXNzT2JqZWN0LmNsYXNzX3VybC5zcGxpdCgnJicpLm1hcCgodikgPT4gdi50cmltKCkpXFxcXG4gICAgICAgIHJldHVybiBjbGFzc09iamVjdFxcXFxuICAgIH0sXFxcXG4gICAgcHVzaChjbGFzc09iamVjdCkge1xcXFxuICAgICAgICB0aGlzLmFyci5wdXNoKHRoaXMuaW5pdChjbGFzc09iamVjdCkpXFxcXG4gICAgfSxcXFxcbiAgICBnZXRDbGFzcyhpZCkge1xcXFxuICAgICAgICBsZXQgZGVmYXVsdENsYXNzID0gdGhpcy5hcnIuZmluZChpdGVtID0+IGl0ZW0uaWQgPT0gaWQpXFxcXG4gICAgICAgIGRlZmF1bHRDbGFzcyA9IEpTT04uc3RyaW5naWZ5KGRlZmF1bHRDbGFzcyA/IHtcXFxcbiAgICAgICAgICAgIG5hbWU6IGRlZmF1bHRDbGFzcy5jbGFzc19uYW1lWzBdLFxcXFxuICAgICAgICAgICAgdXJsOiBkZWZhdWx0Q2xhc3MuY2xhc3NfdXJsWzBdXFxcXG4gICAgICAgIH0gOiB7IG5hbWU6ICAnY2Fubm90IGZpbmQgaWQ6ICcgKyBpZCArICcgaW4gY2xhc3NUYWI6ICcgKyB0aGlzLnNpZ24sIHVybDogJyd9KVxcXFxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShnZXRWYXIodGhpcy5zaWduICsgaWQsIGRlZmF1bHRDbGFzcykpXFxcXG4gICAgfSxcXFxcbiAgICBzZXRVcmwodXJsKSB7XFxcXG4gICAgICAgIHJldHVybiB1cmwucmVwbGFjZSgvXFxcXFxcXFwkXFxcXFxcXFx7KFtefV0qKVxcXFxcXFxcfS9nLCAoXywgaWQpID0+IHRoaXMuZ2V0Q2xhc3MoaWQpLnVybClcXFxcbiAgICB9XFxcXG59XFxcXG4vLyDnlJ/miJDlpLTpg6jliIbnsbtcXFxcbmxldCBmeUFsbCA9IHVybC5pbmNsdWRlcygnZnlBbGwnKSxcXFxcbiAgICB0YWJIZWFkZXIgPSBbXVxcXFxuaWYgKGNsYXNzX25hbWUpIHRhYkhlYWRlci5wdXNoKHtcXFxcbiAgICBpZDogZnlBbGwgPyAnZnlBbGwnIDogJ2Z5Y2xhc3MnLFxcXFxuICAgIGNsYXNzX25hbWU6IGNsYXNzX25hbWUsXFxcXG4gICAgY2xhc3NfdXJsOiBjbGFzc191cmxcXFxcbn0pXFxcXG5pZiAoYXJlYV9uYW1lKSB0YWJIZWFkZXIucHVzaCh7XFxcXG4gICAgaWQ6IGZ5QWxsID8gJ2Z5QWxsJyA6ICdmeWFyZWEnLFxcXFxuICAgIGNsYXNzX25hbWU6IGFyZWFfbmFtZSxcXFxcbiAgICBjbGFzc191cmw6IGFyZWFfdXJsXFxcXG59KVxcXFxuaWYgKHllYXJfbmFtZSkgdGFiSGVhZGVyLnB1c2goe1xcXFxuICAgIGlkOiBmeUFsbCA/ICdmeUFsbCcgOiAnZnl5ZWFyJyxcXFxcbiAgICBjbGFzc19uYW1lOiB5ZWFyX25hbWUsXFxcXG4gICAgY2xhc3NfdXJsOiB5ZWFyX3VybFxcXFxufSlcXFxcbmlmIChzb3J0X25hbWUpIHRhYkhlYWRlci5wdXNoKHtcXFxcbiAgICBpZDogZnlBbGwgPyAnZnlBbGwnIDogJ2Z5c29ydCcsXFxcXG4gICAgY2xhc3NfbmFtZTogc29ydF9uYW1lLFxcXFxuICAgIGNsYXNzX3VybDogc29ydF91cmxcXFxcbn0pXFxcXG4kLmV4cG9ydHMgPSB7XFxcXG4gICAgZnlBbGw6IGZ5QWxsLFxcXFxuICAgIHRhYkhlYWRlcjogbmV3IENsYXNzVGFiKHRhYkhlYWRlciwgeyBuYW1lOiB0aXRsZSwgZm9sZDogcmVhZEZpbGUoJ3RhYkZvbGQnKSwgfSlcXFxcbn1cXFxcblxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJpY29uXzJfcm91bmRcXFwiLFxcXCJuYW1lXFxcIjpcXFwi6K6+572uXFxcIixcXFwicGF0aFxcXCI6XFxcIkNvbmZpZ1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJ2NsZWFyTXlWYXIoXFxcXFxcXCJzb3J0RmxhZ1xcXFxcXFwiKTtyZWZyZXNoUGFnZSgpJylcXFxcbnNldFBhZ2VUaXRsZSgn4pqZIOi9u+WQiOmbhuiuvue9riDimpknKVxcXFxuY29uc3QgUUlOR19USVRMRSA9IGdldE15VmFyKCdteUNvbGxlY3Rpb24nKSxcXFxcbiAgICB1cmwgPSBnZXRNeVZhcigncmVtb3RlVXJsJylcXFxcbmxldCBkYXRhID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZGF0YUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRSwgdHJ1ZSksXFxcXG4gICAgZWwgPSBbe1xcXFxuICAgICAgICB0aXRsZTogJzxiPiDmuIXpmaTnvJPlrZjvvIznq4vljbPmm7TmlrAgPHNtYWxsPiDvvIjln7rkuo7ov5znqIvku5PlupPvvIzmsqHkuovliKvngrnvvIknLFxcXFxuICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHVybCkgPT4ge1xcXFxuICAgICAgICAgICAgaWYoZmlsZUV4aXN0KHVybCkpe1xcXFxuICAgICAgICAgICAgICAgIGRlbGV0ZUZpbGUodXJsKVxcXFxuICAgICAgICAgICAgcmVxdWlyZURvd25sb2FkKCdodHRwczovL2FnaXQuYWkvRHJlYW1Pdk8vSnVNYW4vcmF3L2JyYW5jaC9tYXN0ZXIvSk0nLCB1cmwpXFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJlcXVpcmVEb3dubG9hZCgnaHR0cHM6Ly9hZ2l0LmFpL0RyZWFtT3ZPL0p1TWFuL3Jhdy9icmFuY2gvbWFzdGVyL0pNJywgdXJsKVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSlcXFxcbiAgICAgICAgICAgIGJhY2soZmFsc2UpXFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5bey5pu05pawJ1xcXFxuICAgICAgICB9LCB1cmwpLFxcXFxuICAgICAgICBpbWc6ICdoaWtlcjovL2ltYWdlcy9pY29uNCcsXFxcXG4gICAgICAgIGNvbF90eXBlOiAnYXZhdGFyJ1xcXFxuICAgIH1dLFxcXFxuICAgIHVwZGF0ZUludGVydmFsID0gcmVhZEZpbGUoJ3VwZGF0ZUludGVydmFsJykgfHwgJzEnLFxcXFxuICAgIG5ld1dpbmRvdyA9IHJlYWRGaWxlKCduZXdXaW5kb3cnKSxcXFxcbiAgICB0YWJGb2xkID0gcmVhZEZpbGUoJ3RhYkZvbGQnKSxcXFxcbiAgICBkaXNhYmxlQ3VzdG9tID0gcmVhZEZpbGUoJ2Rpc2FibGVDdXN0b20nKSxcXFxcbiAgICBlZGl0TW9kZSA9IGRpc2FibGVDdXN0b20gPyAn5a+85YWl5rW36ZiUJyA6IGdldE15VmFyKCdlZGl0TW9kZScsICflkK/nlKgv56aB55SoJylcXFxcblxcXFxuZWwucHVzaCh7XFxcXG4gICAgdGl0bGU6ICcgIPCfkqEg5pu05paw6aKR546HOiAnICsgKHVwZGF0ZUludGVydmFsID09IDAgPyAn5omL5YqoJyA6IHVwZGF0ZUludGVydmFsICsgJ+WkqScpICsgJyAgJyxcXFxcbiAgICB1cmw6ICQodXBkYXRlSW50ZXJ2YWwsICfovpPlhaXmm7TmlrDpl7TpmpTvvIjlpKnvvInvvIzkuLow5YiZ5omL5Yqo5pu05pawXFxcXFxcXFxu5pys5Zyw5paH5Lu26ZO+5o6l5peg5pWIJykuaW5wdXQoKCkgPT4ge1xcXFxuICAgICAgICBpbnB1dCA9IHBhcnNlSW50KGlucHV0KVxcXFxuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGlucHV0KSkgaW5wdXQgPSAxXFxcXG4gICAgICAgIGVsc2UgaWYgKGlucHV0IDwgMSkgaW5wdXQgPSAwXFxcXG4gICAgICAgIHNhdmVGaWxlKCd1cGRhdGVJbnRlcnZhbCcsIGlucHV0LnRvU3RyaW5nKCkpXFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKClcXFxcbiAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcXFxuICAgIH0pLFxcXFxuICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXFxcbn0sIHtcXFxcbiAgICB0aXRsZTogJyAg8J+WpSDni6znq4vpppbpobU6ICcgKyAobmV3V2luZG93ID8gJ+aYrycgOiAn5ZCmJykgKyAnICAnLFxcXFxuICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgobmV3V2luZG93KSA9PiB7XFxcXG4gICAgICAgIHNhdmVGaWxlKCduZXdXaW5kb3cnLCBuZXdXaW5kb3cgPyAnJyA6ICdUJylcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UoKVxcXFxuICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxcXG4gICAgfSwgbmV3V2luZG93KSxcXFxcbiAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxcXG59LCB7XFxcXG4gICAgdGl0bGU6ICcgIPCfkqAg5YiG57G75oqY5Y+gOiAnICsgKHRhYkZvbGQgPyAn5pivJyA6ICflkKYnKSArICcgICcsXFxcXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCh0YWJGb2xkKSA9PiB7XFxcXG4gICAgICAgIHNhdmVGaWxlKCd0YWJGb2xkJywgdGFiRm9sZCA/ICcnIDogJ1QnKVxcXFxuICAgICAgICByZWZyZXNoUGFnZSgpXFxcXG4gICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICB9LCB0YWJGb2xkKSxcXFxcbiAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxcXG59LCB7XFxcXG4gICAgdGl0bGU6ICcgIPCfkrwg5aSH5Lu95oGi5aSNICAnLFxcXFxuICAgIHVybDogJChbJ+Wkh+S7vScsICfmgaLlpI0nXSwgMSkuc2VsZWN0KChRSU5HX1RJVExFLCB1cGRhdGVJbnRlcnZhbCwgbmV3V2luZG93LCB0YWJGb2xkLCBkaXNhYmxlQ3VzdG9tKSA9PiB7XFxcXG4gICAgICAgIGxldCB1cmwgPSBnZXRNeVZhcigncmVtb3RlVXJsJylcXFxcbiAgICAgICAgaWYgKCF1cmwuc3RhcnRzV2l0aCgnaGlrZXI6Ly8nKSAmJiAhdXJsLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKSlcXFxcbiAgICAgICAgICAgIHVybCA9ICdoaWtlcjovL2ZpbGVzL2xpYnMvJyArIG1kNSh1cmwpICsgJy5qcydcXFxcbiAgICAgICAgZWxzZSBpZiAodXJsLnN0YXJ0c1dpdGgoJ2hpa2VyOi8vcGFnZS8nKSkgdXJsID0gJ2hpa2VyOi8vZW1wdHknXFxcXG4gICAgICAgIGlmIChpbnB1dCA9PSAn5aSH5Lu9JykgcmV0dXJuICQoJ2hpa2VyOi8vZmlsZXMvdG1wLycgKyBRSU5HX1RJVExFICsgJ19iYWNrdXAuanNvbicsICfovpPlhaXlpIfku73ot6/lvoQnKVxcXFxuICAgICAgICAgICAgLmlucHV0KCh1cmwsIHVwZGF0ZUludGVydmFsLCBuZXdXaW5kb3csIHRhYkZvbGQsIGRpc2FibGVDdXN0b20pID0+IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSByZXF1ZXN0KHVybCksXFxcXG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbURhdGEgPSByZWFkRmlsZSgnY3VzdG9tRGF0YScpXFxcXG4gICAgICAgICAgICAgICAgd3JpdGVGaWxlKGlucHV0LCBKU09OLnN0cmluZ2lmeSh7XFxcXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUludGVydmFsOiB1cGRhdGVJbnRlcnZhbCxcXFxcbiAgICAgICAgICAgICAgICAgICAgbmV3V2luZG93OiBuZXdXaW5kb3csXFxcXG4gICAgICAgICAgICAgICAgICAgIHRhYkZvbGQ6IHRhYkZvbGQsXFxcXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVDdXN0b206IGRpc2FibGVDdXN0b20sXFxcXG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbURhdGE6IGN1c3RvbURhdGEsXFxcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVzOiBydWxlc1xcXFxuICAgICAgICAgICAgICAgIH0pKVxcXFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/lt7LlpIfku73vvIzms6jmhI/oi6Xku5PlupPkuLrlrZDpobXpnaLliJnkuI3lpIfku70nXFxcXG4gICAgICAgICAgICB9LCB1cmwsIHVwZGF0ZUludGVydmFsLCBuZXdXaW5kb3csIHRhYkZvbGQsIGRpc2FibGVDdXN0b20pXFxcXG4gICAgICAgIGVsc2UgcmV0dXJuICQoJ2hpa2VyOi8vZmlsZXMvdG1wLycgKyBRSU5HX1RJVExFICsgJ19iYWNrdXAuanNvbicsICfovpPlhaXlpIfku73ot6/lvoQnKS5pbnB1dCgodXJsKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgeyB1cGRhdGVJbnRlcnZhbCwgbmV3V2luZG93LCB0YWJGb2xkLCBkaXNhYmxlQ3VzdG9tLCBjdXN0b21EYXRhLCBydWxlcyB9ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGlucHV0KSlcXFxcbiAgICAgICAgICAgIHNhdmVGaWxlKCd1cGRhdGVJbnRlcnZhbCcsIHVwZGF0ZUludGVydmFsKVxcXFxuICAgICAgICAgICAgc2F2ZUZpbGUoJ25ld1dpbmRvdycsIG5ld1dpbmRvdylcXFxcbiAgICAgICAgICAgIHNhdmVGaWxlKCd0YWJGb2xkJywgdGFiRm9sZClcXFxcbiAgICAgICAgICAgIHNhdmVGaWxlKCdkaXNhYmxlQ3VzdG9tJywgZGlzYWJsZUN1c3RvbSlcXFxcbiAgICAgICAgICAgIHNhdmVGaWxlKCdjdXN0b21EYXRhJywgY3VzdG9tRGF0YSlcXFxcbiAgICAgICAgICAgIGlmIChydWxlcykgd3JpdGVGaWxlKHVybCwgcnVsZXMpXFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpXFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5bey5oGi5aSN77yM5aaC5p6c5LiN5oOz5ZCM5q2l6L+c56iL5LuT5bqT77yM5Y+v5Lul6K6+572u5pu05paw6aKR546H5Li65omL5YqoJ1xcXFxuICAgICAgICB9LCB1cmwpXFxcXG4gICAgfSwgUUlOR19USVRMRSwgdXBkYXRlSW50ZXJ2YWwsIG5ld1dpbmRvdywgdGFiRm9sZCwgZGlzYWJsZUN1c3RvbSksXFxcXG4gICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJ1xcXFxufSwge1xcXFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGZvbnQgY29sb3I9XFxcXFxcXCIjNjY2NjY2XFxcXFxcXCI+PHNtYWxsPueJueWIq+m4o+iwou+8jOWwj+eoi+W6j+aPkOS+m+iAhe+8mlxcXFxcXFxcbicgK1xcXFxuICAgICAgICBkYXRhLnJlZHVjZSgoc2VsZiwgdikgPT4gdi5hdXRob3IgPyBzZWxmLmNvbmNhdCh2LmF1dGhvci5zcGxpdCgnJicpKSA6IHNlbGYsIFtdKVxcXFxuICAgICAgICAuZmlsdGVyKCh2LCBpLCBhcnIpID0+IHYgJiYgYXJyLmluZGV4T2YodikgPT0gaSkuam9pbign44CBJyksXFxcXG4gICAgdXJsOiAnaGlrZXI6Ly9lbXB0eScsXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcXFxufSlcXFxcblxcXFxuZWwucHVzaCh7IGNvbF90eXBlOiAnbGluZScgfSwge1xcXFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArICfwn5OdJy5zbWFsbCgpICsgJyZuYnNwIOi9u+WQiOmbhuiHquWumuS5iSAmbmJzcCcuYm9sZCgpLmZvbnRjb2xvcignIzc1NzU3NScpICsgKGRpc2FibGVDdXN0b20gPyAn4p2MJyA6ICfirZUnKS5zbWFsbCgpLFxcXFxuICAgIHVybDogJChbKGRpc2FibGVDdXN0b20gPyAn5ZCv55SoJyA6ICfnpoHnlKgnKSArICflkIjpm4boh6rlrprkuYknLCAn5riF6Zmk6Ieq5a6a5LmJ5pWw5o2uJ10sIDEpLnNlbGVjdCgoKSA9PiB7XFxcXG4gICAgICAgIGlmIChpbnB1dCA9PSAn5riF6Zmk6Ieq5a6a5LmJ5pWw5o2uJykge1xcXFxuICAgICAgICAgICAgZGVsZXRlRmlsZSgnY3VzdG9tRGF0YScpXFxcXG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT0gJ+WQr+eUqOWQiOmbhuiHquWumuS5iScpIHtcXFxcbiAgICAgICAgICAgIHNhdmVGaWxlKCdkaXNhYmxlQ3VzdG9tJywgJycpXFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBzYXZlRmlsZSgnZGlzYWJsZUN1c3RvbScsICdUJylcXFxcbiAgICAgICAgICAgIGlucHV0ICs9ICdcXFxcXFxcXG7lsI/nqIvluo/lkK/nlKgv56aB55So44CB6YeN5paw5o6S5bqP562J5pON5L2c5Z2H5LiN5Lya5L2T546w5Zyo6aaW6aG15bCP56iL5bqP5YiX6KGo5LitJ1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcXFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5beyJyArIGlucHV0XFxcXG4gICAgfSksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXFxcbiAgICBleHRyYTogeyBsaW5lVmlzaWJsZTogZmFsc2UgfVxcXFxufSk7XFxcXG4oZGlzYWJsZUN1c3RvbSA/IFsn5a+85YWl5rW36ZiUJ10gOiBbJ+WQr+eUqC/npoHnlKgnLCAn6YeN5paw5o6S5bqPJywgJ+abtOaUueWbvuaghycsICflr7zlhaXmtbfpmJQnXSkuZm9yRWFjaCgodikgPT4ge1xcXFxuICAgIGVsLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogdiA9PSBlZGl0TW9kZSA/ICfigJzigJzigJ3igJ0nICsgdi5ib2xkKCkuZm9udGNvbG9yKCcjMTJiNjY4JykgOiB2LFxcXFxuICAgICAgICB1cmw6IHYgPT0gZWRpdE1vZGUgPyAnaGlrZXI6Ly9lbXB0eScgOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCh2KSA9PiB7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcignZWRpdE1vZGUnLCB2KVxcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxcXG4gICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxcXG4gICAgICAgIH0sIHYpLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxcXG4gICAgfSlcXFxcbn0pO1xcXFxuaWYgKGVkaXRNb2RlID09ICflr7zlhaXmtbfpmJQnKSBlbC5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+WFqOmDqOWvvOWFpScsXFxcXG4gICAgdXJsOiAn5rW36ZiU6KeG55WM77+laG9tZV9ydWxlX3VybO+/pScgKyAodXJsLnN0YXJ0c1dpdGgoJ2hpa2VyOi8vJykgfHwgdXJsLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKSA/IHVybCA6ICdoaWtlcjovL2ZpbGVzL2xpYnMvJyArIG1kNSh1cmwpICsgJy5qcycpLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXFxcXG4gICAgZXh0cmE6IHsgbGluZVZpc2libGU6IGZhbHNlIH1cXFxcbn0pO1xcXFxuKGRpc2FibGVDdXN0b20gPyBkYXRhIDogSlNPTi5wYXJzZShyZWFkRmlsZSgnY3VzdG9tRGF0YScpIHx8ICdbXScpKS5mb3JFYWNoKCh2LCBpKSA9PiB7XFxcXG4gICAgbGV0IGQgPSB7IHRpdGxlOiB2LnRpdGxlLCBpbWc6IGRhdGFbaV0uaWNvbiB9XFxcXG4gICAgc3dpdGNoIChlZGl0TW9kZSkge1xcXFxuICAgICAgICBjYXNlICflkK/nlKgv56aB55SoJzpcXFxcbiAgICAgICAgICAgIGQudGl0bGUgPSAodi52aXNpYmxlID8gJ/Cfn6IgICcgOiAn8J+UtCAgJykgKyBkLnRpdGxlXFxcXG4gICAgICAgICAgICBkLnVybCA9ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGkpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBKU09OLnBhcnNlKHJlYWRGaWxlKCdjdXN0b21EYXRhJykgfHwgJ1tdJylcXFxcbiAgICAgICAgICAgICAgICBydWxlc1tpXS52aXNpYmxlID0gIXJ1bGVzW2ldLnZpc2libGVcXFxcbiAgICAgICAgICAgICAgICBzYXZlRmlsZSgnY3VzdG9tRGF0YScsIEpTT04uc3RyaW5naWZ5KHJ1bGVzKSlcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxcXG4gICAgICAgICAgICB9LCBpKVxcXFxuICAgICAgICAgICAgYnJlYWtcXFxcbiAgICAgICAgY2FzZSAn6YeN5paw5o6S5bqPJzpcXFxcbiAgICAgICAgICAgIGxldCBzb3J0RmxhZyA9IHBhcnNlSW50KGdldE15VmFyKCdzb3J0RmxhZycsICctMScpKVxcXFxuICAgICAgICAgICAgZC50aXRsZSA9IChzb3J0RmxhZyA9PSBpID8gJ/CflIMgICcgOiAnJykgKyBkLnRpdGxlXFxcXG4gICAgICAgICAgICBpZiAoc29ydEZsYWcgPT0gLTEpXFxcXG4gICAgICAgICAgICAgICAgZC51cmwgPSAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChpKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKCdzb3J0RmxhZycsIGkudG9TdHJpbmcoKSlcXFxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/pgInmi6nopoHnp7vliqjliLDnmoTkvY3nva4nXFxcXG4gICAgICAgICAgICAgICAgfSwgaSlcXFxcbiAgICAgICAgICAgIGVsc2VcXFxcbiAgICAgICAgICAgICAgICBkLnVybCA9ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKG9sZEluZGV4LCBuZXdJbmRleCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBKU09OLnBhcnNlKHJlYWRGaWxlKCdjdXN0b21EYXRhJykgfHwgJ1tdJylcXFxcbiAgICAgICAgICAgICAgICAgICAgcnVsZXMuc3BsaWNlKG5ld0luZGV4LCAwLCBydWxlcy5zcGxpY2Uob2xkSW5kZXgsIDEpWzBdKVxcXFxuICAgICAgICAgICAgICAgICAgICBzYXZlRmlsZSgnY3VzdG9tRGF0YScsIEpTT04uc3RyaW5naWZ5KHJ1bGVzKSlcXFxcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoJ3NvcnRGbGFnJywgJy0xJylcXFxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICAgICAgICAgICAgICB9LCBzb3J0RmxhZywgaSlcXFxcbiAgICAgICAgICAgIGJyZWFrXFxcXG4gICAgICAgIGNhc2UgJ+abtOaUueWbvuaghyc6XFxcXG4gICAgICAgICAgICBkLnVybCA9ICQodi5pY29uIHx8ICcnLCAn6L6T5YWl5paw5Zu+5qCH5Zyw5Z2A5oiW6aKc6Imy5Luj56CB77yaJykuaW5wdXQoKGkpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBKU09OLnBhcnNlKHJlYWRGaWxlKCdjdXN0b21EYXRhJykgfHwgJ1tdJylcXFxcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQpXFxcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLmljb24gPSBpbnB1dFxcXFxuICAgICAgICAgICAgICAgIGVsc2VcXFxcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJ1bGVzW2ldLmljb25cXFxcbiAgICAgICAgICAgICAgICBzYXZlRmlsZSgnY3VzdG9tRGF0YScsIEpTT04uc3RyaW5naWZ5KHJ1bGVzKSlcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxcXG4gICAgICAgICAgICB9LCBpKVxcXFxuICAgICAgICAgICAgYnJlYWtcXFxcbiAgICAgICAgY2FzZSAn5a+85YWl5rW36ZiUJzpcXFxcbiAgICAgICAgICAgIGQudXJsID0gJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZGF0YUxvYWQ/cnVsZT0nICsgZ2V0TXlWYXIoJ215Q29sbGVjdGlvbicpLCB0cnVlKVxcXFxuICAgICAgICAgICAgICAgIHJldHVybiAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoZGF0YVtpXSkpXFxcXG4gICAgICAgICAgICB9LCBpKVxcXFxuICAgICAgICAgICAgYnJlYWtcXFxcbiAgICB9XFxcXG4gICAgZWwucHVzaChkKVxcXFxufSlcXFxcbnNldFJlc3VsdChlbClcXFxcblxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIumhtemdoui9veWFpVxcXCIsXFxcInBhdGhcXFwiOlxcXCJmcmFtZUxvYWRcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCBRSU5HX1RJVExFID0gZ2V0TXlWYXIoJ215Q29sbGVjdGlvbicpXFxcXG52YXIgbXlDb2xsX2VsID0gW11cXFxcbmV2YWwoSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9wYWdlL2hpamFja0Vudj9ydWxlPScgKyBRSU5HX1RJVExFKSkucnVsZSlcXFxcblxcXFxuaWYgKCFpc0luZGV4KSB7XFxcXG4gICAgaWYgKHBhZ2VUaXRsZSkgc2V0UGFnZVRpdGxlKHBhZ2VUaXRsZSlcXFxcbiAgICBzZXRMYXN0Q2hhcHRlclJ1bGUob3JpUlVMRS5sYXN0X2NoYXB0ZXJfcnVsZSlcXFxcbiAgICBNWV9QQVJBTVMgPSBNWV9SVUxFLnBhcmFtc1xcXFxufSBlbHNlIGlmIChNWV9QQUdFID09IDEpIHtcXFxcbiAgICB0YWJIZWFkZXIubG9hZChteUNvbGxfZWwpXFxcXG4gICAgaWYgKFJVTEUuc2VhcmNoX3VybCkgbXlDb2xsX2VsLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLmkJzntKJcXFxcXFxcIixcXFxcbiAgICAgICAgZGVzYzogXFxcXFxcXCLov5nmmK/ogZrmvKvnmoTmkJzntKLlk6Z+flxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICdcXFxcXFxcImhpa2VyOi8vc2VhcmNoP3M9XFxcXFxcXCIraW5wdXQnLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgcnVsZXM6ICQudG9TdHJpbmcoKFFJTkdfVElUTEUsIHRpdGxlKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZGF0YUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRSlcXFxcbiAgICAgICAgICAgICAgICBydWxlcyA9IFtydWxlcy5maW5kKCh2KSA9PiB2LnRpdGxlID09IHRpdGxlKV1cXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocnVsZXMpXFxcXG4gICAgICAgICAgICB9LCBRSU5HX1RJVExFLCBSVUxFLnRpdGxlKSxcXFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoJ3NlYXJjaEtleScsICcnKSxcXFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBcXFxcXFxcInB1dE15VmFyKCdzZWFyY2hLZXknLGlucHV0KVxcXFxcXFwiXFxcXG4gICAgICAgIH0sXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgfSlcXFxcbn1cXFxcbi8vIOato+aWh+ino+aekFxcXFxudmFyIHtcXFxcbiAgICBwYXJhbUhhbmRsZSxcXFxcbiAgICBydW5QcmVSdWxlLFxcXFxuICAgIGdlbkV4VXJsLFxcXFxuICAgIGhpamFja0xhenlSdWxlXFxcXG59ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZnVuY1Rvb2xzP3J1bGU9JyArIFFJTkdfVElUTEUpXFxcXG5ydW5QcmVSdWxlKG9yaVJVTEUucHJlUnVsZSlcXFxcbmlmIChNWV9SVUxFLmZpbmRfcnVsZS5zdGFydHNXaXRoKCdqczonKSkge1xcXFxuICAgIGxldCB7IGhpamFja0VsIH0gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9mdW5jVG9vbHM/cnVsZT0nICsgUUlOR19USVRMRSlcXFxcbiAgICBzZXRSZXN1bHQgPSBmdW5jdGlvbihwYXJhbTAsIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpIHtcXFxcbiAgICAgICAgcGFyYW0xID0gQ0FMTEJBQ0tfS0VZXFxcXG4gICAgICAgIHBhcmFtMiA9IE1ZX1JVTEVcXFxcbiAgICAgICAgcGFyYW0zID0gTVlfVFlQRVxcXFxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbTAuZGF0YSkpIHBhcmFtMCA9IHBhcmFtMC5kYXRhXFxcXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KG15Q29sbF9lbCwgcGFyYW0wLm1hcChoaWphY2tFbCkpXFxcXG4gICAgICAgIG1ldGhvZF9zZXRSZXN1bHQuaW52b2tlKGphdmFDb250ZXh0LCBteUNvbGxfZWwsIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpXFxcXG4gICAgfVxcXFxuICAgIHNldEhvbWVSZXN1bHQgPSBzZXRSZXN1bHRcXFxcbiAgICBzZXRTZWFyY2hSZXN1bHQgPSBzZXRSZXN1bHRcXFxcblxcXFxuICAgIGV2YWwoTVlfUlVMRS5maW5kX3J1bGUuc2xpY2UoMykpXFxcXG59IGVsc2Uge1xcXFxuICAgIGxldCB7IHJ1bkNvZGUgfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2Z1bmNUb29scz9ydWxlPScgKyBRSU5HX1RJVExFKSxcXFxcbiAgICAgICAgW18sIGZpbmRSdWxlLCBkZXRhaWxGaW5kUnVsZV0gPSBNWV9SVUxFLmZpbmRfcnVsZS5tYXRjaCgvXihbXFxcXFxcXFxzXFxcXFxcXFxTXSo/KSg/Oj09PihbXFxcXFxcXFxzXFxcXFxcXFxTXSopKT8kLylcXFxcbiAgICBmaW5kUnVsZSA9IGZpbmRSdWxlLnNwbGl0KCc7JylcXFxcbiAgICBwYXJzZURvbUZvckFycmF5KGdldFJlc0NvZGUoKSwgZmluZFJ1bGUuc2hpZnQoKSkuZm9yRWFjaCgoZGF0YSkgPT4ge1xcXFxuICAgICAgICBsZXQgW3RpdGxlLCBpbWcsIGRlc2MsIHVybF0gPSBmaW5kUnVsZS5tYXAoKHYsIGkpID0+IHtcXFxcbiAgICAgICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSAnKicpIHJldHVybiAnJ1xcXFxuICAgICAgICAgICAgICAgICAgICBlbHNlIHYgPSAoaSA9PSAxIHx8IGkgPT0gMykgP1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VEb20oZGF0YSwgdikgOlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VEb21Gb3JIdG1sKGRhdGEsIHYpXFxcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpICE9IDMpIHYgPSBydW5Db2RlKHYpXFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2XFxcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gJycgfVxcXFxuICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICByZXMgPSB7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLCB1cmw6IHVybCxcXFxcbiAgICAgICAgICAgICAgICBkZXNjOiBkZXNjLCBpbWc6IGltZyxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogTVlfUlVMRS5jb2xfdHlwZVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICBpZiAocmVzLnVybCkge1xcXFxuICAgICAgICAgICAgaWYgKHJlcy51cmwuaW5jbHVkZXMoJ0BsYXp5UnVsZT0nKSkge1xcXFxuICAgICAgICAgICAgICAgIGxldCByZUluZGV4ID0gcmVzLnVybC5pbmRleE9mKCcuanM6JylcXFxcbiAgICAgICAgICAgICAgICBpZiAocmVJbmRleCA+PSAwKSByZXMudXJsID0gcmVzLnVybC5zbGljZSgwLCByZUluZGV4KSArICcuanM6JyArIGhpamFja0xhenlSdWxlICsgJzsnICsgcmVzLnVybC5zbGljZShyZUluZGV4ICsgNClcXFxcbiAgICAgICAgICAgIH0gZWxzZSAgaWYgKGRldGFpbEZpbmRSdWxlKSB7XFxcXG4gICAgICAgICAgICAgICAgcmVzLmV4dHJhID0ge1xcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGdlbkV4VXJsKHVybCksXFxcXG4gICAgICAgICAgICAgICAgICAgIFJVTEU6IGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShPYmplY3QuYXNzaWduKGdlbk15UnVsZSgpLCB7IGRldGFpbF9maW5kX3J1bGU6IGRldGFpbEZpbmRSdWxlIH0pKSksXFxcXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUaXRsZTogaXNJbmRleCAmJiB0aXRsZVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICByZXMudXJsID0gJ2hpa2VyOi8vcGFnZS9mcmFtZUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRVxcXFxuICAgICAgICAgICAgfSBlbHNlIGlmIChNWV9SVUxFLmRldGFpbF9maW5kX3J1bGUpIHtcXFxcbiAgICAgICAgICAgICAgICByZXMuZXh0cmEgPSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogZ2VuRXhVcmwodXJsKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgUlVMRTogYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KGdlbk15UnVsZSgpKSksXFxcXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUaXRsZTogaXNJbmRleCAmJiB0aXRsZVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICByZXMudXJsID0gJ2hpa2VyOi8vcGFnZS9mcmFtZUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIG15Q29sbF9lbC5wdXNoKHJlcylcXFxcbiAgICB9KVxcXFxuICAgIHNldFJlc3VsdChteUNvbGxfZWwpXFxcXG59XFxcXG5cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLmlbDmja7ovb3lhaVcXFwiLFxcXCJwYXRoXFxcIjpcXFwiZGF0YUxvYWRcXFwiLFxcXCJydWxlXFxcIjpcXFwibGV0IHNob3dBbGwgPSAkLmltcG9ydFBhcmFtLFxcXFxuICAgIHVybCA9IGdldE15VmFyKCdyZW1vdGVVcmwnKSxcXFxcbiAgICBkYXRhID0gW11cXFxcbmlmICh1cmwuc3RhcnRzV2l0aCgnaGlrZXI6Ly8nKSB8fCB1cmwuc3RhcnRzV2l0aCgnZmlsZTovLycpKSB7XFxcXG4gICAgLy8g5aaC5p6c5Li65pys5Zyw5paH5Lu25YiZ5LiN6L+b6KGM57yT5a2YXFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgbGV0IG9yaURhdGEgPSBmZXRjaCh1cmwpXFxcXG4gICAgICAgIGlmICh1cmwuc3RhcnRzV2l0aCgnaGlrZXI6Ly9wYWdlLycpKVxcXFxuICAgICAgICAgICAgb3JpRGF0YSA9IEpTT04ucGFyc2Uob3JpRGF0YSkucnVsZVxcXFxuICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShvcmlEYXRhKVxcXFxuICAgIH0gY2F0Y2ggKGUpIHt9XFxcXG59IGVsc2Uge1xcXFxuICAgIC8vIOiOt+WPlui/nOeoi+aVsOaNru+8jOajgOafpemXtOmalOm7mOiupOS4gOWkqVxcXFxuICAgIGxldCBpbnRlcnZhbCA9IHBhcnNlSW50KHJlYWRGaWxlKCd1cGRhdGVJbnRlcnZhbCcpIHx8ICcxJyksXFxcXG4gICAgICAgIG9sZERhdGEgPSBmZXRjaCgnaGlrZXI6Ly9maWxlcy9saWJzLycgKyBtZDUodXJsKSArICcuanMnKSxcXFxcbiAgICAgICAgcmVtb3RlRGF0YSA9IFtdXFxcXG4gICAgaWYgKGludGVydmFsID09IDApIGludGVydmFsID0gLTFcXFxcbiAgICB0cnkgeyByZW1vdGVEYXRhID0gSlNPTi5wYXJzZShmZXRjaENhY2hlKHVybCwgMjQgKiBpbnRlcnZhbCwgeyB0aW1lb3V0OiA1MDAwMCB9KSkgfSBjYXRjaCAoZSkge31cXFxcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVtb3RlRGF0YSkpIHJlbW90ZURhdGEgPSBbXVxcXFxuICAgIGlmIChyZW1vdGVEYXRhLmxlbmd0aCA8IDMpIHtcXFxcbiAgICAgICAgbG9nKCfmnKrojrflj5bliLDmlbDmja4nKVxcXFxuICAgICAgICBpZiAob2xkRGF0YSkgd3JpdGVGaWxlKCdoaWtlcjovL2ZpbGVzL2xpYnMvJyArIG1kNSh1cmwpICsgJy5qcycsIG9sZERhdGEpXFxcXG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKG9sZERhdGEgfHwgJ1tdJylcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICBsb2coJ+W3suiOt+WPluWIsOaVsOaNricpXFxcXG4gICAgICAgIGRhdGEgPSByZW1vdGVEYXRhXFxcXG4gICAgfVxcXFxufVxcXFxuZGF0YSA9IGRhdGEuZmlsdGVyKCh2KSA9PiB2LnRpdGxlICE9IGdldE15VmFyKCdteUNvbGxlY3Rpb24nKSAmJiAhKHYuYXV0aG9yIHx8ICcnKS5pbmNsdWRlcygn6L275ZCI6ZuG55Sf5oiQ5ZmoJykpXFxcXG5pZiAocmVhZEZpbGUoJ2Rpc2FibGVDdXN0b20nKSkgJC5leHBvcnRzID0gZGF0YVxcXFxuZWxzZSB7IC8vIOWGmeWFpeiHquWumuS5ieaVsOaNrlxcXFxuICAgIGxldCBjdXN0b21EYXRhID0gSlNPTi5wYXJzZShyZWFkRmlsZSgnY3VzdG9tRGF0YScpIHx8ICdbXScpLFxcXFxuICAgICAgICByZXdyaXRlRGF0YSA9IFtdXFxcXG4gICAgY3VzdG9tRGF0YSA9IGN1c3RvbURhdGEucmVkdWNlKChzZWxmLCB2KSA9PiB7XFxcXG4gICAgICAgIGxldCBpbmRleCA9IGRhdGEuZmluZEluZGV4KCh2dikgPT4gdi50aXRsZSA9PSB2di50aXRsZSlcXFxcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcXFxcbiAgICAgICAgICAgIHNlbGYucHVzaCh2KVxcXFxuICAgICAgICAgICAgbGV0IHJ1bGUgPSBkYXRhLnNwbGljZShpbmRleCwgMSlbMF1cXFxcbiAgICAgICAgICAgIGlmIChzaG93QWxsIHx8IHYudmlzaWJsZSlcXFxcbiAgICAgICAgICAgICAgICByZXdyaXRlRGF0YS5wdXNoKE9iamVjdC5hc3NpZ24ocnVsZSwgdikpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIHNlbGZcXFxcbiAgICB9LCBbXSlcXFxcbiAgICBkYXRhLmZvckVhY2goKHYpID0+IGN1c3RvbURhdGEucHVzaCh7IHRpdGxlOiB2LnRpdGxlLCB2aXNpYmxlOiB0cnVlIH0pKVxcXFxuICAgIHNhdmVGaWxlKCdjdXN0b21EYXRhJywgSlNPTi5zdHJpbmdpZnkoY3VzdG9tRGF0YSkpXFxcXG4gICAgJC5leHBvcnRzID0gcmV3cml0ZURhdGEuY29uY2F0KGRhdGEpXFxcXG59XFxcXG5cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLpk77mjqXlpITnkIYqXFxcIixcXFwicGF0aFxcXCI6XFxcInVybFBhcnNlXFxcIixcXFwicnVsZVxcXCI6XFxcIi8vIOmmlumhtemTvuaOpeabv+aNouWIhuexu1xcXFxuZnVuY3Rpb24gaW5kZXhVcmwocGFyYW0pIHtcXFxcbiAgICBmdW5jdGlvbiBydW5Db2RlKHJ1bGUpIHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCBbaW5wdXQsIGNvZGVdID0gcnVsZS5zcGxpdCgnLmpzOicpXFxcXG4gICAgICAgICAgICByZXR1cm4gY29kZSA/IGV2YWwoY29kZSkgOiBydWxlXFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIHJ1bGUgfVxcXFxuICAgIH1cXFxcbiAgICBsZXQgeyBSVUxFLCBwYWdlTnVtLCBRSU5HX1RJVExFIH0gPSBKU09OLnBhcnNlKHBhcmFtLnNwbGl0KCcjIyMnKVsxXSlcXFxcbiAgICBSVUxFID0gSlNPTi5wYXJzZShiYXNlNjREZWNvZGUoUlVMRSkpXFxcXG4gICAgcGFnZU51bSA9IHBhcnNlSW50KHBhZ2VOdW0pXFxcXG4gICAgbGV0IHVybCA9IFJVTEUudXJsXFxcXG5cXFxcbiAgICBldmFsKEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vcGFnZS9DbGFzc1RhYj9ydWxlPScgKyBRSU5HX1RJVExFKSkucnVsZSlcXFxcbiAgICB1cmwgPSB0YWJIZWFkZXIuc2V0VXJsKGZ5QWxsID8gdXJsLnJlcGxhY2UoL2Z5QWxsL2csICckJHtmeUFsbH0nKSA6IHVybC5yZXBsYWNlKC9meShjbGFzc3xhcmVhfHllYXJ8c29ydCkvZywgJyQke2Z5JDF9JykpXFxcXG4gICAgdXJsID0gdXJsLnJlcGxhY2UoL2Z5cGFnZSg/OkAoLT9cXFxcXFxcXGQrKUApPyg/OlxcXFxcXFxcKihcXFxcXFxcXGQrKUApPy9nLCAoXywgc3RhcnQsIHNwYWNlKSA9PiBwYXJzZUludChzdGFydCB8fCAwKSArIDEgKyAocGFnZU51bSAtIDEpICogcGFyc2VJbnQoc3BhY2UgfHwgMSkpXFxcXG4gICAgdXJsID0gL14oW1xcXFxcXFxcc1xcXFxcXFxcU10qPykoPzpcXFxcXFxcXFtmaXJzdFBhZ2U9KFtcXFxcXFxcXHNcXFxcXFxcXFNdKj8pXFxcXFxcXFxdKT8oPzooXFxcXFxcXFwuanM6W1xcXFxcXFxcc1xcXFxcXFxcU10qPykpPyQvLmV4ZWModXJsKVxcXFxuICAgIGlmIChwYWdlTnVtID09IDEgJiYgdXJsWzJdKSB1cmxbMV0gPSB1cmxbMl1cXFxcbiAgICBpZiAodXJsWzNdICYmICF1cmxbMV0uaW5jbHVkZXMoJy5qczonKSkgdXJsWzFdICs9IHVybFszXVxcXFxuICAgIHJldHVybiBydW5Db2RlKHVybFsxXSlcXFxcbn1cXFxcbmZ1bmN0aW9uIHBhcmFtSGFuZGxlKHVybFBhcmFtLCB1YSwgdXJsVG1wKSB7XFxcXG4gICAgbGV0IGNoYXJzZXQsIHBhcmFtVG1wXFxcXG4gICAgdHJ5IHsgLy8g6ZO+5o6l55qE57yW56CB44CBVUHlkoxSZWZlcmVy5bqU6K+l5piv6aaW5YWI57un5om/6aaW6aG16ZO+5o6lXFxcXG4gICAgICAgIFssICwgY2hhcnNldCwgcGFyYW1UbXBdID0gdXJsVG1wLnNwbGl0KCc7JylcXFxcbiAgICAgICAgcGFyYW1UbXAgPSBwYXJhbVRtcC5tYXRjaCgvXnsoLiopfSQvKVsxXS5zcGxpdCgnJiYnKVxcXFxuICAgIH0gY2F0Y2ggKGUpIHsgcGFyYW1UbXAgPSBbXSB9XFxcXG4gICAgbGV0IFVzZXJBZ2VudCA9IHBhcmFtVG1wLmZpbmQoKHYpID0+IHYuc3RhcnRzV2l0aCgnVXNlci1BZ2VudEAnKSksXFxcXG4gICAgICAgIFJlZmVyZXIgPSBwYXJhbVRtcC5maW5kKCh2KSA9PiB2LnN0YXJ0c1dpdGgoJ1JlZmVyZXJAJykpXFxcXG4gICAgdXJsUGFyYW1bMF0gPSB1cmxQYXJhbVswXSB8fCAnR0VUJ1xcXFxuICAgIHVybFBhcmFtWzFdID0gdXJsUGFyYW1bMV0gfHwgY2hhcnNldCB8fCAnVVRGLTgnXFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgdXJsUGFyYW1bMl0gPSB1cmxQYXJhbVsyXS5tYXRjaCgvXnsoLiopfSQvKVsxXS5zcGxpdCgnJiYnKVxcXFxuICAgIH0gY2F0Y2ggKGUpIHsgdXJsUGFyYW1bMl0gPSBbXSB9XFxcXG4gICAgLy8g5re75Yqg5YWo5bGAVUHlkozkuIrnuqdSZWZlcmVyXFxcXG4gICAgaWYgKCF1cmxQYXJhbVsyXS5zb21lKCh2KSA9PiB2LnN0YXJ0c1dpdGgoJ1VzZXItQWdlbnRAJykpKSB7XFxcXG4gICAgICAgIGlmIChVc2VyQWdlbnQpIHVybFBhcmFtWzJdLnB1c2goVXNlckFnZW50KVxcXFxuICAgICAgICBlbHNlIGlmICh1YSA9PSAncGMnKVxcXFxuICAgICAgICAgICAgdXJsUGFyYW1bMl0ucHVzaCgnVXNlci1BZ2VudEAnICsgUENfVUEucmVwbGFjZSgvOy9nLCAn77yb77ybJykucmVwbGFjZSgvXFxcXFxcXFw/LywgJ++8n++8nycpKVxcXFxuICAgICAgICBlbHNlIGlmICh1YSA9PSAnbW9iaWxlJylcXFxcbiAgICAgICAgICAgIHVybFBhcmFtWzJdLnB1c2goJ1VzZXItQWdlbnRAJyArIE1PQklMRV9VQS5yZXBsYWNlKC87L2csICfvvJvvvJsnKS5yZXBsYWNlKC9cXFxcXFxcXD8vLCAn77yf77yfJykpXFxcXG4gICAgfVxcXFxuICAgIGlmIChSZWZlcmVyICYmICF1cmxQYXJhbVsyXS5zb21lKCh2KSA9PiB2LnN0YXJ0c1dpdGgoJ1JlZmVyZXJAJykpKVxcXFxuICAgICAgICB1cmxQYXJhbVsyXS5wdXNoKFJlZmVyZXIpXFxcXG4gICAgdXJsUGFyYW1bMl0gPSAneycgKyB1cmxQYXJhbVsyXS5qb2luKCcmJicpICsgJ30nXFxcXG4gICAgcmV0dXJuIHVybFBhcmFtLmpvaW4oJzsnKVxcXFxufVxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuS6jOe6p1vkuIBdKlxcXCIsXFxcInBhdGhcXFwiOlxcXCJlanRvb2xcXFwiLFxcXCJydWxlXFxcIjpcXFwiZnVuY3Rpb24gY292ZXIo5qCH6aKYLCDkvZzogIUsIOWIhuexuywg54q25oCBLCDnq6DoioIsIOabtOaWsCwg566A5LuLLOWwgemdouWbvueJhyx0cnVlX3VybCwgaGFzTGluZSkge1xcXFxyXFxcXG52YXIg5qCH6aKYLCDkvZzogIUsIOWIhuexuywg54q25oCBLCDnq6DoioIsIOabtOaWsCwg566A5LuLLOWwgemdouWbvueJhyx0cnVlX3VybCwgaGFzTGluZTtcXFxcclxcXFxuXFxcXHR0cnkge1xcXFxyXFxcXG5cXFxcdFxcXFx0ZC5wdXNoKHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0dGl0bGU6ICfigJjigJjigJnigJk8c21hbGw+PGZvbnQgY29sb3I9XFxcXFxcXCIjRkE3Mjk4XFxcXFxcXCI+JyvkvZzogIUuc2xpY2UoMCwxNSkrXFxcXFxcXCImbmJzcDtcXFxcXFxcIivnirbmgIErJzwvZm9udD48L3NtYWxsPicrJ+KAmOKAmOKAmeKAmTxzbWFsbD48Zm9udCBjb2xvcj1cXFxcXFxcIiNCMTVCRkZcXFxcXFxcIj4nK1xcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXCIr5YiG57G7Kyc8L2ZvbnQ+PC9zbWFsbD4nKyfigJjigJjigJnigJk8c21hbGw+PGZvbnQgY29sb3I9XFxcXFxcXCIjRkYzNTlBXFxcXFxcXCI+JytcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFwiK+eroOiKgitcXFxcXFxcIiZuYnNwO1xcXFxcXFwiK+abtOaWsCsnPC9mb250Pjwvc21hbGw+JyxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0ZGVzYzon4oCY4oCY4oCZ4oCZPHNtYWxsPicgK+eugOS7iysgJzwvc21hbGw+JyxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0cGljX3VybDogIOWwgemdouWbvueJhyxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0dXJsOiB0cnVlX3VybCxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Y29sX3R5cGU6ICdtb3ZpZV8xX3ZlcnRpY2FsX3BpY19ibHVyJ1xcXFxyXFxcXG5cXFxcdFxcXFx0fSk7XFxcXG5cXFxcdFxcXFx0ZC5wdXNoKHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Y29sX3R5cGU6ICdsaW5lX2JsYW5rJyxcXFxcclxcXFxuXFxcXHRcXFxcdH0pO1xcXFxuXFxcXHRcXFxcdGQucHVzaCh7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdGNvbF90eXBlOiAnbGluZScsXFxcXHJcXFxcblxcXFx0XFxcXHR9KTtcXFxcclxcXFxuXFxcXHRcXFxcdGlmIChoYXNMaW5lKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdGl0ZW0uZXh0cmEgPSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0bGluZVZpc2libGU6IGZhbHNlXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdH1cXFxcclxcXFxuXFxcXHRcXFxcdH1cXFxcclxcXFxuXFxcXHRcXFxcdGQucHVzaChpdGVtKTtcXFxcclxcXFxuXFxcXHR9IGNhdGNoIChlKSB7fVxcXFxyXFxcXG59XFxcXHJcXFxcbmZ1bmN0aW9uIGNoYXB0ZXIodGl0bGUscGljX3VybCxjaGFwdGVyTGlzdCwgY2hhcHRlclRpdGxlLCBjaGFwdGVyVXJsLCBkZWZhdWx0T3JkZXIsIGhhc0xpbmUsZG93bmxvYWRsYXp5KSB7XFxcXHJcXFxcblxcXFx0dmFyIGxpc3QgPSBjaGFwdGVyTGlzdDtcXFxcclxcXFxuXFxcXHR2YXIgb3JpZ2luYWwgPSBbe1xcXFxyXFxcXG5cXFxcdFxcXFx0dXJsOiBNWV9VUkwsXFxcXHJcXFxcblxcXFx0XFxcXHRvcmRlcjogZGVmYXVsdE9yZGVyXFxcXHJcXFxcblxcXFx0fV07XFxcXHJcXFxcblxcXFx0IWZpbGVFeGlzdCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnKSA/ICh3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvY29taWMvY29taWNMb2dGaWxlLmpzJywgSlNPTi5zdHJpbmdpZnkob3JpZ2luYWwpKSkgOiAwO1xcXFxyXFxcXG5cXFxcdHZhciBsb2cgPSBKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycpKTtcXFxcclxcXFxuXFxcXHRmb3IgKHZhciBpIGluIGxvZykge1xcXFxyXFxcXG5cXFxcdFxcXFx0aWYgKGxvZ1tpXS51cmwgPT0gTVlfVVJMKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdHZhciBub3cgPSBpO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHR2YXIgb3JkZXIgPSBsb2dbaV0ub3JkZXI7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdGJyZWFrO1xcXFxyXFxcXG5cXFxcdFxcXFx0fSBlbHNlIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0dmFyIG5vdyA9ICcnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHR2YXIgb3JkZXIgPSBkZWZhdWx0T3JkZXI7XFxcXHJcXFxcblxcXFx0XFxcXHR9XFxcXHJcXFxcblxcXFx0fVxcXFxyXFxcXG5cXFxcdGxldCBvcmRlckl0ZW0gPSB7XFxcXHJcXFxcblxcXFx0XFxcXHR0aXRsZTogXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArICc8c3Ryb25nPjxmb250IGNvbG9yPVxcXFxcXFwiIzA5OEFDMVxcXFxcXFwiPicgKyAn56ug6IqC5o6S5bqP4oeFJyArICc8L2ZvbnQ+PC9zdHJvbmc+JyxcXFxcclxcXFxuXFxcXHRcXFxcdHVybDogTVlfVVJMICsgYEBsYXp5UnVsZT0uanM6dmFyIGxvZyA9IEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vZmlsZXMvcnVsZXMvY29taWMvY29taWNMb2dGaWxlLmpzJykpO3ZhciBub3c9J2AgKyBub3cgKyBgJztpZihub3chPScnKXt2YXIgbm93PXBhcnNlSW50KG5vdyk7dmFyIG9yZGVyPWxvZ1tub3ddLm9yZGVyfWVsc2V7dmFyIG5vdz1wYXJzZUludChsb2cubGVuZ3RoKTt2YXIgb3JkZXI9YCArIGRlZmF1bHRPcmRlciArIGA7bG9nLnB1c2goe3VybDppbnB1dCxvcmRlcjpvcmRlcn0pO31pZihsb2dbbm93XS5vcmRlcil7bG9nW25vd10ub3JkZXI9MDt9ZWxzZXtsb2dbbm93XS5vcmRlcj0xO307d3JpdGVGaWxlKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycsIEpTT04uc3RyaW5naWZ5KGxvZykpO3JlZnJlc2hQYWdlKCk7J2hpa2VyOi8vZW1wdHknYCxcXFxcclxcXFxuXFxcXHRcXFxcdGNvbF90eXBlOiAndGV4dF8yJ1xcXFxyXFxcXG5cXFxcdH1cXFxcclxcXFxuXFxcXHRpZiAoaGFzTGluZSkge1xcXFxyXFxcXG5cXFxcdFxcXFx0b3JkZXJJdGVtLnRpdGxlID0gXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArICc8c3Ryb25nPjxmb250IGNvbG9yPVxcXFxcXFwiIzA5OEFDMVxcXFxcXFwiPicgKyAn6ZuG5pWw5o6S5bqP4oeFJyArICc8L2ZvbnQ+PC9zdHJvbmc+JztcXFxcclxcXFxuXFxcXHRcXFxcdG9yZGVySXRlbS5jb2xfdHlwZSA9IFxcXFxcXFwidGV4dF8yXFxcXFxcXCJcXFxcclxcXFxuXFxcXHR9XFxcXHJcXFxcblxcXFx0bGV0IGNoYXB0ZXJMaXN0cyA9IGxpc3QubWFwKChpdGVtKT0+KHtcXFxcclxcXFxuXFxcXHRcXFxcdHRpdGxlOiBwZGZoKGl0ZW0sXFxcXFxcXCJhJiZUZXh0XFxcXFxcXCIpLFxcXFxyXFxcXG5cXFxcdFxcXFx0dXJsOiBwZChpdGVtLFxcXFxcXFwiYSYmaHJlZlxcXFxcXFwiKSxcXFxcclxcXFxuXFxcXHR9KSk7XFxcXHJcXFxcbmQucHVzaCh7XFxcXHJcXFxcblxcXFx0dGl0bGU6ICfigJjigJjigJnigJk8c3Ryb25nPjxmb250IGNvbG9yPSBcXFxcXFxcIiMwOThBQzFcXFxcXFxcIj4nICsgXFxcXFxcXCLkuIvovb3mvKvnlLtcXFxcXFxcIiArICc8L2Zyb250Pjwvc3Ryb25nPicsXFxcXHJcXFxcblxcXFx0dXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9kb3dubG9hZC52aWV3I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5IyNub1JlZnJlc2gjP3J1bGU95pys5Zyw6LWE5rqQ566h55CGXFxcXFxcXCIsXFxcXHJcXFxcblxcXFx0Y29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCIsXFxcXHJcXFxcblxcXFx0ZXh0cmE6IHtcXFxcclxcXFxuXFxcXHRcXFxcdGNoYXB0ZXJMaXN0OiBjaGFwdGVyTGlzdHMsXFxcXHJcXFxcblxcXFx0XFxcXHRpbmZvOntcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Ym9va05hbWU6IHRpdGxlLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRydWxlTmFtZTogTVlfUlVMRS50aXRsZSxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Ym9va1RvcFBpYzogcGljX3VybCxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0cGFyc2VDb2RlOiBkb3dubG9hZGxhenlcXFxcclxcXFxuXFxcXHRcXFxcdH0sXFxcXHJcXFxcblxcXFx0XFxcXHRkZWZhdWx0VmlldzpcXFxcXFxcIjFcXFxcXFxcIlxcXFxyXFxcXG5cXFxcdH1cXFxcclxcXFxufSk7XFxcXHJcXFxcblxcXFx0ZC5wdXNoKHtcXFxcclxcXFxuXFxcXHRcXFxcdHRpdGxlOiAn4oCY4oCY4oCZ4oCZPHN0cm9uZz48Zm9udCBjb2xvcj0gXFxcXFxcXCIjMDk4QUMxXFxcXFxcXCI+JyArIFxcXFxcXFwi5pys5Zyw5Lmm5p62XFxcXFxcXCIgKyAnPC9mcm9udD48L3N0cm9uZz4nLFxcXFxyXFxcXG5cXFxcdFxcXFx0dXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9NYWluLnZpZXc/cnVsZT3mnKzlnLDotYTmupDnrqHnkIZcXFxcXFxcIixcXFxcclxcXFxuXFxcXHRcXFxcdGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiLFxcXFxyXFxcXG5cXFxcdH0pOyAgXFxcXHJcXFxcblxcXFx0ZC5wdXNoKG9yZGVySXRlbSk7XFxcXHJcXFxcblxcXFx0ZC5wdXNoKHtjb2xfdHlwZTogJ2xpbmUnfSk7XFxcXHRcXFxcclxcXFxuXFxcXHR2YXIgbGlzdCA9IG9yZGVyID8gbGlzdCA6IGxpc3QucmV2ZXJzZSgpO1xcXFxuXFxcXHRpZighbGlzdHx8bGlzdD09XFxcXFxcXCJcXFxcXFxcIil7XFxcXHJcXFxcblxcXFx0XFxcXHRkLnB1c2goe1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHR0aXRsZTogJ+atpOa8q+eUu+W3suS4i+aetiEhJyxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Y29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXFxcclxcXFxuXFxcXHRcXFxcdH0pO1xcXFxyXFxcXG5cXFxcdH1cXFxcclxcXFxuXFxcXHRmb3IgKHZhciBpIGluIGxpc3QpIHtcXFxcclxcXFxuXFxcXHRcXFxcdHRyeSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdGQucHVzaCh7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0dGl0bGU6IHBkZmgobGlzdFtpXSwgY2hhcHRlclRpdGxlKSxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHR1cmw6IHBkKGxpc3RbaV0sIGNoYXB0ZXJVcmwpICsgbGF6eSxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRjb2xfdHlwZTogJ3RleHRfMicsXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdH0pO1xcXFxyXFxcXG5cXFxcdFxcXFx0fWNhdGNoIChlKSB7fVxcXFxyXFxcXG5cXFxcdH1cXFxcclxcXFxufVxcXFxyXFxcXG5cXFxcclxcXFxuZnVuY3Rpb24gbGluZShsaW5lTGlzdCwgbGluZVRpdGxlUnVsZSwgdmFyS2V5KSB7XFxcXHJcXFxcblxcXFx0bGV0IGxpc3QgPSBsaW5lTGlzdFxcXFxyXFxcXG5cXFxcdHZhcktleSA9IHZhcktleSA9PSBudWxsID8gKE1ZX1JVTEUudXJsICsgJyNsaW5lLWluZGV4Jyk6IHZhcktleTtcXFxcclxcXFxuXFxcXHRhZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKGtleUxpc3QpID0+IHtcXFxcclxcXFxuXFxcXHRcXFxcdGZvciAobGV0IGkgaW4ga2V5TGlzdCkge2NsZWFyVmFyKGtleUxpc3RbaV0pfVxcXFxyXFxcXG5cXFxcdH0sIFt2YXJLZXksIE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnXSkpXFxcXHJcXFxcblxcXFx0bGV0IGxpbmUwVGl0bGUgPSAnJztcXFxcclxcXFxuXFxcXHR0cnkge1xcXFxyXFxcXG5cXFxcdFxcXFx0bGluZTBUaXRsZSA9IHBkZmgobGlzdFswXSwgbGluZVRpdGxlUnVsZSkucmVwbGFjZShcXFxcXFxcIueroOiKguWIl+ihqO+8mlxcXFxcXFwiLFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxyXFxcXG5cXFxcdH0gY2F0Y2ggKGUpIHt9XFxcXHJcXFxcblxcXFx0bG9nKE1ZX1JVTEUudGl0bGUgKyBnZXRWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSkpXFxcXHJcXFxcblxcXFx0Zm9yIChsZXQgaSBpbiBsaXN0KSB7XFxcXHJcXFxcblxcXFx0XFxcXHR0cnkge1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRsZXQgbGluZVRpdGxlID0gcGRmaChsaXN0W2ldLCBsaW5lVGl0bGVSdWxlKS5yZXBsYWNlKFxcXFxcXFwi56ug6IqC5YiX6KGo77yaXFxcXFxcXCIsXFxcXFxcXCJcXFxcXFxcIik7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdGQucHVzaCh7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0dGl0bGU6IGdldFZhcigoTVlfUlVMRS50aXRsZSArICcjbGluZS10aXRsZScpLCBsaW5lMFRpdGxlKSA9PT0gbGluZVRpdGxlID8gXFxcXFxcXCLliIfmjaI64oCY4oCYXFxcXFxcXCIgKyBsaW5lVGl0bGUrXFxcXFxcXCJcXFxcXFxcIjpsaW5lVGl0bGUrXFxcXFxcXCLigJjigJg65YiH5o2iXFxcXFxcXCIsXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0dXJsOiAkKCkubGF6eVJ1bGUoKHZhcktleSwgbGluZUluZGV4LCBsaW5lVGl0bGUpID0+IHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdHB1dFZhcih2YXJLZXksIGxpbmVJbmRleC50b1N0cmluZygpKTtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdHB1dFZhcigoTVlfUlVMRS50aXRsZSArICcjbGluZS10aXRsZScpLCBsaW5lVGl0bGUpO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0bG9nKE1ZX1JVTEUudGl0bGUgKyBnZXRWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSkpO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0cmVmcmVzaFBhZ2UoKTtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey5YiH5o2i6IezXFxcXFxcXCIgKyBsaW5lVGl0bGU7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0fSwgdmFyS2V5LCBpLCBsaW5lVGl0bGUpLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdGNvbF90eXBlOiAndGV4dF8yJyxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0fSk7XFxcXHJcXFxcblxcXFx0XFxcXHR9IGNhdGNoIChlKSB7fVxcXFxyXFxcXG5cXFxcdH1cXFxcclxcXFxufVxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuS6jOe6p1vkuoxdKlxcXCIsXFxcInBhdGhcXFwiOlxcXCJjb21pY0Z1bmN0aW9uRmlsZS5qc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJmdW5jdGlvbiBjb3Zlcihjb3ZlclRpdGxlLCBjb3ZlclRpdGxlMSwgY292ZXJUaXRsZTIsIGNvdmVyVGl0bGUzLCBjb3ZlckRlc2MsIGNvdmVyUGljLCBjb3ZlclVybCwgaGFzTGluZSkge1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIGNvbnN0IENvbG9yID0gXFxcXFxcXCIjMTlCODlEXFxcXFxcXCI7XFxcXG4gICAgICAgIHZhciBkZXNfZGVzYyA9IHBkZmgoaHRtbCwgY292ZXJEZXNjKS5yZXBsYWNlKCfnroDjgIDjgIDku4vvvJonLCAnJykucmVwbGFjZSgn5ryr55S7566A5LuL77yaJywgJycpO1xcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6ICfigJjigJjigJnigJk8Pjxmb250IGNvbG9yPVxcXFxcXFwiI0ZBNzI5OFxcXFxcXFwiPicgKyBwZGZoKGh0bWwsIGNvdmVyVGl0bGUpICsgJ1xcXFxcXFxcbicgKyAn4oCY4oCY4oCZ4oCZPD48Zm9udCBjb2xvcj1cXFxcXFxcIiM3MzQzMzhcXFxcXFxcIj4nICsgcGRmaChodG1sLCBjb3ZlclRpdGxlMSkgKyAnXFxcXFxcXFxuJyxcXFxcbiAgICAgICAgICAgIGRlc2M6ICfigJjigJjigJnigJk8Pjxmb250IGNvbG9yPVxcXFxcXFwiIzk1NEE0NVxcXFxcXFwiPicgKyBwZGZoKGh0bWwsIGNvdmVyVGl0bGUyKSArICdcXFxcXFxcXG4nICsgJ+KAmOKAmOKAmeKAmTw+PGZvbnQgY29sb3I9XFxcXFxcXCIjOTU0QTQ1XFxcXFxcXCI+JyArIHBkZmgoaHRtbCwgY292ZXJUaXRsZTMpLFxcXFxuICAgICAgICAgICAgcGljX3VybDogcGQoaHRtbCwgY292ZXJQaWMpLFxcXFxuICAgICAgICAgICAgdXJsOiBjb3ZlclVybCxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnbW92aWVfMV92ZXJ0aWNhbF9waWNfYmx1cidcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ2xpbmUnXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICAvL3ZhciBqaiA9IGdldFZhcihcXFxcXFxcImpqc1xcXFxcXFwiLCBcXFxcXFxcIuaUtui1t1xcXFxcXFwiKTtcXFxcbiAgICAgICAgLy92YXIgamp1cmwgPSAnaGlrZXI6Ly9lbXB0eUBsYXp5UnVsZT0uanM6Z2V0VmFyKFxcXFxcXFwiampzXFxcXFxcXCIpID09IFxcXFxcXFwi5pS26LW3XFxcXFxcXCI/cHV0VmFyKFxcXFxcXFwiampzXFxcXFxcXCIsXFxcXFxcXCLlsZXlvIBcXFxcXFxcIik6cHV0VmFyKFxcXFxcXFwiampzXFxcXFxcXCIsXFxcXFxcXCLmlLbotbdcXFxcXFxcIik7XFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCInO1xcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6ICfnroDku4sgPHNtYWxsPjxzbWFsbD48c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiMxOUI4OURcXFxcXFxcIj7lsZXlvIA+PC9zcGFuPjwvc21hbGw+PC9zbWFsbD4nLFxcXFxuICAgICAgICAgICAgaW1nOiBcXFxcXFxcImh0dHBzOi8vbGFubWVpZ3VvamlhbmcuY29tL3R1Ymlhby9tb3JlLzE5Ny5wbmdcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChqamlkLCBkZWNpZCwgZGVzX2Rlc2MpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBpZiAoZ2V0VmFyKFxcXFxcXFwiampzXFxcXFxcXCIsIFxcXFxcXFwi5pS26LW3XFxcXFxcXCIpID09IFxcXFxcXFwi5pS26LW3XFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKFxcXFxcXFwiampzXFxcXFxcXCIsIFxcXFxcXFwi5bGV5byAXFxcXFxcXCIpO1xcXFxuXFxcXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogamppZFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn566A5LuLIDxzbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjojMTlCODlEXFxcXFxcXCI+5pS26LW3Pjwvc3Bhbj48L3NtYWxsPjwvc21hbGw+J1xcXFxuICAgICAgICAgICAgICAgICAgICB9KVxcXFxuXFxcXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U2l6ZTogMTQsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVNwYWNpbmc6IDMsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGRlY2lkXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICc8c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiM4MDgwODBcXFxcXFxcIj4nICsgZGVzX2Rlc2MgKyAnLi4uPC9zcGFuPidcXFxcbiAgICAgICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKFxcXFxcXFwiampzXFxcXFxcXCIsIFxcXFxcXFwi5pS26LW3XFxcXFxcXCIpO1xcXFxuXFxcXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogamppZFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn566A5LuLIDxzbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjojMTlCODlEXFxcXFxcXCI+5bGV5byAPjwvc3Bhbj48L3NtYWxsPjwvc21hbGw+J1xcXFxuICAgICAgICAgICAgICAgICAgICB9KVxcXFxuXFxcXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U2l6ZTogMTQsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVNwYWNpbmc6IDMsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGRlY2lkXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICc8c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiM4MDgwODBcXFxcXFxcIj4nICsgZGVzX2Rlc2Muc3Vic3RyKDAsIDMwKSArICcuLi48L3NwYW4+J1xcXFxuICAgICAgICAgICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgICAgIH0sIE1ZX1JVTEUgKyBcXFxcXFxcIl9qamlkXFxcXFxcXCIsIE1ZX1JVTEUgKyBcXFxcXFxcIl9kZWNpZFxcXFxcXFwiLCBkZXNfZGVzYyksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJhdmF0YXJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX1JVTEUgKyBcXFxcXFxcIl9qamlkXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG5cXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjojODA4MDgwXFxcXFxcXCI+JyArIGRlc19kZXNjLnN1YnN0cigwLCAzMCkgKyAnLi4uPC9zcGFuPicsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgdGV4dFNpemU6IDE0LFxcXFxuICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiAzLFxcXFxuICAgICAgICAgICAgICAgIGlkOiBNWV9SVUxFICsgXFxcXFxcXCJfZGVjaWRcXFxcXFxcIlxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnbGluZSdcXFxcbiAgICAgICAgfSlcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnbGluZSdcXFxcbiAgICAgICAgfSlcXFxcbiAgICB9IGNhdGNoIChlKSB7fVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBkb3duKFRpdGxlLCBjaGFwdGVyUGljLCBsaXN0LCBjaGFwdGVyVGl0bGUsIGNoYXB0ZXJMaW5lLCBkb3dubG9hZGxhenkpIHtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBsZXQgZG9MaXN0ID0gbGlzdC5tYXAoKGl0ZW0pID0+ICh7XFxcXG4gICAgICAgICAgICB0aXRsZTogcGRmaChpdGVtLCBjaGFwdGVyVGl0bGUpLFxcXFxuICAgICAgICAgICAgdXJsOiBwZChpdGVtLCBjaGFwdGVyTGluZSksXFxcXG4gICAgICAgIH0pKTtcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGI+PHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjogIzFhYWQxOVxcXFxcXFwiPuS4i+i9vea8q+eUu/CflLk8L3NwYW4+PC9iPicsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2Rvd25sb2FkLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub1JlZnJlc2gjP3J1bGU95pys5Zyw6LWE5rqQ566h55CGXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGNoYXB0ZXJMaXN0OiBkb0xpc3QsXFxcXG4gICAgICAgICAgICAgICAgaW5mbzoge1xcXFxuICAgICAgICAgICAgICAgICAgICBib29rTmFtZTogcGRmaChodG1sLCBUaXRsZSksXFxcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVOYW1lOiBNWV9SVUxFLnRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICBib29rVG9wUGljOiBwZChodG1sLCBjaGFwdGVyUGljKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VDb2RlOiBkb3dubG9hZGxhenlcXFxcbiAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWaWV3OiBcXFxcXFxcIjFcXFxcXFxcIlxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnbGluZSdcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfSBjYXRjaCAoZSkge31cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gY2hhcHRlcihjaGFwdGVyTGlzdCwgY2hhcHRlclRpdGxlLCBjaGFwdGVyVXJsLCBkZWZhdWx0T3JkZXIsIGhhc0xpbmUpIHtcXFxcbiAgICB2YXIgbGlzdCA9IGNoYXB0ZXJMaXN0O1xcXFxuICAgIHZhciBvcmlnaW5hbCA9IFt7XFxcXG4gICAgICAgIHVybDogTVlfVVJMLFxcXFxuICAgICAgICBvcmRlcjogZGVmYXVsdE9yZGVyXFxcXG4gICAgfV07XFxcXG4gICAgIWZpbGVFeGlzdCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnKSA/ICh3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvY29taWMvY29taWNMb2dGaWxlLmpzJywgSlNPTi5zdHJpbmdpZnkob3JpZ2luYWwpKSkgOiAwO1xcXFxuICAgIHZhciBsb2cgPSBKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycpKTtcXFxcbiAgICBmb3IgKHZhciBpIGluIGxvZykge1xcXFxuICAgICAgICBpZiAobG9nW2ldLnVybCA9PSBNWV9VUkwpIHtcXFxcbiAgICAgICAgICAgIHZhciBub3cgPSBpO1xcXFxuICAgICAgICAgICAgdmFyIG9yZGVyID0gbG9nW2ldLm9yZGVyO1xcXFxuICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICB2YXIgbm93ID0gJyc7XFxcXG4gICAgICAgICAgICB2YXIgb3JkZXIgPSBkZWZhdWx0T3JkZXI7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgbGV0IG9yZGVySXRlbSA9IHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyAnPGZvbnQgY29sb3I9XFxcXFxcXCIjZjM3MzM1XFxcXFxcXCI+JyArICfnq6DoioLmjpLluo/ih4UnICsgJzwvZm9udD4nLFxcXFxuICAgICAgICB1cmw6IE1ZX1VSTCArIGBAbGF6eVJ1bGU9LmpzOnZhciBsb2cgPSBKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycpKTt2YXIgbm93PSdgICsgbm93ICsgYCc7aWYobm93IT0nJyl7dmFyIG5vdz1wYXJzZUludChub3cpO3ZhciBvcmRlcj1sb2dbbm93XS5vcmRlcn1lbHNle3ZhciBub3c9cGFyc2VJbnQobG9nLmxlbmd0aCk7dmFyIG9yZGVyPWAgKyBkZWZhdWx0T3JkZXIgKyBgO2xvZy5wdXNoKHt1cmw6aW5wdXQsb3JkZXI6b3JkZXJ9KTt9aWYobG9nW25vd10ub3JkZXIpe2xvZ1tub3ddLm9yZGVyPTA7fWVsc2V7bG9nW25vd10ub3JkZXI9MTt9O3dyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnLCBKU09OLnN0cmluZ2lmeShsb2cpKTtyZWZyZXNoUGFnZSgpOydoaWtlcjovL2VtcHR5J2AsXFxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXFxcbiAgICB9XFxcXG4gICAgaWYgKGhhc0xpbmUpIHtcXFxcbiAgICAgICAgb3JkZXJJdGVtLnRpdGxlID0gXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArICc8Zm9udCBjb2xvcj1cXFxcXFxcIiNmMzczMzVcXFxcXFxcIj4nICsgJ+mbhuaVsOaOkuW6j+KHhScgKyAnPC9mb250Pic7XFxcXG4gICAgICAgIG9yZGVySXRlbS5jb2xfdHlwZSA9IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiXFxcXG4gICAgfVxcXFxuICAgIGQucHVzaChvcmRlckl0ZW0pO1xcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiAnbGluZSdcXFxcbiAgICB9KTtcXFxcblxcXFxuICAgIHZhciBsaXN0ID0gb3JkZXIgPyBsaXN0IDogbGlzdC5yZXZlcnNlKCk7XFxcXG4gICAgZm9yIChsZXQgaSBpbiBsaXN0KSB7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBwZGZoKGxpc3RbaV0sIGNoYXB0ZXJUaXRsZSksXFxcXG4gICAgICAgICAgICAgICAgdXJsOiBwZChsaXN0W2ldLCBjaGFwdGVyVXJsKSArIGxhenksXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IHBkZmgobGlzdFswXSwgY2hhcHRlclRpdGxlKS5sZW5ndGggPiA2ID8gJ3RleHRfMicgOiAndGV4dF8zJyxcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gbGluZShsaW5lTGlzdCwgbGluZVRpdGxlUnVsZSwgdmFyS2V5KSB7XFxcXG4gICAgbGV0IGxpc3QgPSBsaW5lTGlzdFxcXFxuICAgIHZhcktleSA9IHZhcktleSA9PSBudWxsID8gKE1ZX1JVTEUudXJsICsgJyNsaW5lLWluZGV4JykgOiB2YXJLZXk7XFxcXG4gICAgYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKChrZXlMaXN0KSA9PiB7XFxcXG4gICAgICAgIGZvciAobGV0IGkgaW4ga2V5TGlzdCkge1xcXFxuICAgICAgICAgICAgY2xlYXJWYXIoa2V5TGlzdFtpXSlcXFxcbiAgICAgICAgfVxcXFxuXFxcXG4gICAgfSwgW3ZhcktleSwgTVlfUlVMRS50aXRsZSArICcjbGluZS10aXRsZSddKSlcXFxcbiAgICBsZXQgbGluZTBUaXRsZSA9ICcnXFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgbGluZTBUaXRsZSA9IHBkZmgobGlzdFswXSwgbGluZVRpdGxlUnVsZSk7XFxcXG4gICAgfSBjYXRjaCAoZSkge31cXFxcbiAgICBsb2coTVlfUlVMRS50aXRsZSArIGdldFZhcigoTVlfUlVMRS50aXRsZSArICcjbGluZS10aXRsZScpKSlcXFxcbiAgICBmb3IgKGxldCBpIGluIGxpc3QpIHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCBsaW5lVGl0bGUgPSBwZGZoKGxpc3RbaV0sIGxpbmVUaXRsZVJ1bGUpO1xcXFxuICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogZ2V0VmFyKChNWV9SVUxFLnRpdGxlICsgJyNsaW5lLXRpdGxlJyksIGxpbmUwVGl0bGUpID09PSBsaW5lVGl0bGUgPyBcXFxcXFxcIuWIh+aNojrigJjigJhcXFxcXFxcIiArIGxpbmVUaXRsZSArIFxcXFxcXFwiXFxcXFxcXCIgOiBsaW5lVGl0bGUgKyBcXFxcXFxcIuKAmOKAmDrliIfmjaJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoKS5sYXp5UnVsZSgodmFyS2V5LCBsaW5lSW5kZXgsIGxpbmVUaXRsZSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBwdXRWYXIodmFyS2V5LCBsaW5lSW5kZXgudG9TdHJpbmcoKSlcXFxcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9nKE1ZX1JVTEUudXJsKVxcXFxuICAgICAgICAgICAgICAgICAgICBwdXRWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSwgbGluZVRpdGxlKVxcXFxuICAgICAgICAgICAgICAgICAgICBsb2coTVlfUlVMRS50aXRsZSArIGdldFZhcigoTVlfUlVMRS50aXRsZSArICcjbGluZS10aXRsZScpKSlcXFxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKVxcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+W3suWIh+aNouiHs1xcXFxcXFwiICsgbGluZVRpdGxlXFxcXG4gICAgICAgICAgICAgICAgfSwgdmFyS2V5LCBpLCBsaW5lVGl0bGUpLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnZmxleF9idXR0b24nXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge31cXFxcbiAgICB9XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ2xpbmUnXFxcXG4gICAgICAgICAgICB9KTtcXFxcbn1cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLop6PmnpBb5YyFXSpcXFwiLFxcXCJwYXRoXFxcIjpcXFwiYnpqc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJ2YXIg5ryr55S76Kej5p6QID0gJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgdmFyIGlkID0gdHJ1ZTtcXFxcbiAgICB2YXIgY29kZSA9IHJlcXVlc3QoaW5wdXQpXFxcXG4gICAgdmFyIHBpY3MgPSBbXTtcXFxcbiAgICB2YXIgdG9fUmVwZWF0ID0gZmFsc2U7XFxcXG5cXFxcblxcXFxuICAgIHdoaWxlIChpZCkge1xcXFxuICAgICAgICBwZGZhKGNvZGUsIFxcXFxcXFwiLmNoYXB0ZXItbWFpbiYmYW1wLWltZ1xcXFxcXFwiKVxcXFxuICAgICAgICAgICAgLmZvckVhY2goZGF0YSA9PiBwaWNzLnB1c2gocGRmaChkYXRhLCBcXFxcXFxcImFtcC1pbWcmJnNyY1xcXFxcXFwiKSArICdAUmVmZXJlcj1odHRwczovL2NuLmJhb3ppbWguY29tLycpKTtcXFxcbiAgICAgICAgdmFyIG5leHRfUGFnZSA9IHBkZmgoY29kZSwgXFxcXFxcXCIubmV4dF9jaGFwdGVyLC0xJiZIdG1sXFxcXFxcXCIpXFxcXG4gICAgICAgIGlmIChuZXh0X1BhZ2UuaW5jbHVkZXMoJ+S4i+S4gOmhtScpKSB7XFxcXG4gICAgICAgICAgICBjb2RlID0gcmVxdWVzdChwZGZoKG5leHRfUGFnZSwgXFxcXFxcXCJhJiZocmVmXFxcXFxcXCIpKVxcXFxuICAgICAgICAgICAgdG9fUmVwZWF0ID0gdHJ1ZTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGlkID0gZmFsc2U7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG5cXFxcbiAgICAvL+WOu+mZpOmHjeWkjeWbvueJh1xcXFxuICAgIGlmICh0b19SZXBlYXQpIHtcXFxcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwaWNzLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICB3aGlsZSAocGljcy5pbmRleE9mKHBpY3NbaV0sIGkgKyAxKSAhPSAtMSkge1xcXFxuICAgICAgICAgICAgICAgIHBpY3Muc3BsaWNlKHBpY3MuaW5kZXhPZihwaWNzW2ldLCBpICsgMSksIDEpXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG5cXFxcbiAgICByZXR1cm4gXFxcXFxcXCJwaWNzOi8vXFxcXFxcXCIgKyBwaWNzLmpvaW4oXFxcXFxcXCImJlxcXFxcXFwiKTtcXFxcbn0pXFxcXG5cXFxcbmxldCBsYXp5ID0gYEBsYXp5UnVsZT0uanM6YCArIOa8q+eUu+ino+aekDtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLliqjmgIFb5LqMXSpcXFwiLFxcXCJwYXRoXFxcIjpcXFwiZHRmbFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJjb25zdCBlbXB0eSA9IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG5cXFxcbnRyeSB7XFxcXG4gICAgdmFyIGNhdGVnb3JpZXMgPSBwZGZhKGh0bWwsIOWkp+exu+WumuS9jSkuY29uY2F0KHBkZmEoaHRtbCwg5ou85o6l5YiG57G7KSlcXFxcbn0gY2F0Y2ggKGUpIHtcXFxcbiAgICB2YXIgY2F0ZWdvcmllcyA9IHBkZmEoaHRtbCwg5aSn57G75a6a5L2NKVxcXFxufVxcXFxuXFxcXG5sZXQgaW5pdF9jYXRlID0gW11cXFxcblxcXFxuZm9yIChsZXQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7XFxcXG4gICAgaW5pdF9jYXRlLnB1c2goXFxcXFxcXCIwXFxcXFxcXCIpXFxcXG59XFxcXG5cXFxcbmNvbnN0IGZvbGQgPSBnZXRWYXIoTVlfUlVMRS5ncm91cCwgXFxcXFxcXCIxXFxcXFxcXCIpXFxcXG5jb25zdCBjYXRlX3RlbXBfanNvbiA9IGdldFZhcihNWV9SVUxFLnRpdGxlLCBKU09OLnN0cmluZ2lmeShpbml0X2NhdGUpKVxcXFxuY29uc3QgY2F0ZV90ZW1wID0gSlNPTi5wYXJzZShjYXRlX3RlbXBfanNvbilcXFxcblxcXFxuaWYgKHBhcnNlSW50KHBhZ2UpID09PSAxKSB7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGZvbGQgPT09ICcxJyA/ICfigJzigJzigJ3igJ08Yj48c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiAjRkYwMDAwXFxcXFxcXCI+4oioPC9zcGFuPjwvYj4nIDogJ+KAnOKAnOKAneKAnTxiPjxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICMxYWFkMTlcXFxcXFxcIj7iiKc8L3NwYW4+PC9iPicsXFxcXG4gICAgICAgIHVybDogJCgpLmxhenlSdWxlKChmb2xkKSA9PiB7XFxcXG4gICAgICAgICAgICBwdXRWYXIoTVlfUlVMRS5ncm91cCwgZm9sZCA9PT0gJzEnID8gJzAnIDogJzEnKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgICAgICB9LCBmb2xkKSxcXFxcbiAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXFxcbiAgICB9KVxcXFxuXFxcXG5cXFxcbiAgICBjYXRlZ29yaWVzLmZvckVhY2goKGNhdGVnb3J5LCBpbmRleCkgPT4ge1xcXFxuICAgICAgICBsZXQgc3ViX2NhdGVnb3JpZXMgPSBwZGZhKGNhdGVnb3J5LCDlsI/nsbvlrprkvY0pO1xcXFxuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcXFxcbiAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHBkZmgoaXRlbSwg5YiG57G75qCH6aKYKVxcXFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBrZXkudG9TdHJpbmcoKSA9PT0gY2F0ZV90ZW1wW2luZGV4XSA/ICfigJzigJzigJ3igJ08Yj48c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiAnICsg5YiG57G76aKc6ImyICsgJ1xcXFxcXFwiPicgKyB0aXRsZSArICc8L3NwYW4+PC9iPicgOiB0aXRsZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAkKHBkKGl0ZW0sIOWIhuexu+mTvuaOpSkgKyAnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgocGFyYW1zKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3X2NhdGUgPSBbXVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNhdGVfdGVtcC5mb3JFYWNoKChjYXRlLCBpbmRleCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19jYXRlLnB1c2goaW5kZXggPT09IDAgPyBwYXJhbXMua2V5LnRvU3RyaW5nKCkgOiBcXFxcXFxcIjBcXFxcXFxcIilcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRWYXIoTVlfUlVMRS50aXRsZSwgSlNPTi5zdHJpbmdpZnkobmV3X2NhdGUpKVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0VmFyKE1ZX1JVTEUudXJsLCBpbnB1dClcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZV90ZW1wOiBjYXRlX3RlbXAsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGtleSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IHBhZ2UsXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcXFxuICAgICAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJibGFua19ibG9ja1xcXFxcXFwiXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChmb2xkID09PSAnMScpIHtcXFxcbiAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHBkZmgoaXRlbSwg5YiG57G75qCH6aKYKVxcXFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBrZXkudG9TdHJpbmcoKSA9PT0gY2F0ZV90ZW1wW2luZGV4XSA/ICfigJzigJzigJ3igJ08Yj48c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiAnICsg5YiG57G76aKc6ImyICsgJ1xcXFxcXFwiPicgKyB0aXRsZSArICc8L3NwYW4+PC9iPicgOiB0aXRsZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAkKHBkKGl0ZW0sIOWIhuexu+mTvuaOpSkgKyAnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgocGFyYW1zKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2F0ZV90ZW1wW3BhcmFtcy5pbmRleF0gPSBwYXJhbXMua2V5LnRvU3RyaW5nKClcXFxcblxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0VmFyKE1ZX1JVTEUudGl0bGUsIEpTT04uc3RyaW5naWZ5KHBhcmFtcy5jYXRlX3RlbXApKVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0VmFyKE1ZX1JVTEUudXJsLCBpbnB1dClcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZV90ZW1wOiBjYXRlX3RlbXAsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGtleSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IHBhZ2UsXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcXFxuICAgICAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJibGFua19ibG9ja1xcXFxcXFwiXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pXFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5Yqo5oCBW+S4gF0qXFxcIixcXFwicGF0aFxcXCI6XFxcImNhdGVnb3JpZXMtaGVhZGVyXFxcIixcXFwicnVsZVxcXCI6XFxcImNvbnN0IHN5bWJvbE1hcCA9IHtcXFxcbiAgICAvLyBjaGVja1BhcmFtczogU3ltYm9sKCdjaGVja1BhcmFtcycpLFxcXFxuICAgIG1MYXlvdXQ6IFN5bWJvbCgnbUxheW91dCcpLFxcXFxuICAgIHRydWVfdXJsOiBTeW1ib2woJ3RydWVfdXJsJyksXFxcXG4gICAgbVBhZ2U6IFN5bWJvbCgnbVBhZ2UnKSxcXFxcbiAgICBzcmM6IFN5bWJvbCgnc3JjJyksXFxcXG4gICAgcnVsZU9iakxpc3Q6IFN5bWJvbCgncnVsZU9iakxpc3QnKSxcXFxcbiAgICBtRm9sZDogU3ltYm9sKCdtRm9sZCcpLFxcXFxuICAgIG1Gb2xkSW5uZXJFbmFibGU6IFN5bWJvbCgnbUZvbGRJbm5lckVuYWJsZScpLFxcXFxuICAgIG1Gb2xkSW5kZXg6IFN5bWJvbCgnbUZvbGRJbmRleCcpLFxcXFxuICAgIG1Gb2xkTGF5b3V0OiBTeW1ib2woJ21Gb2xkTGF5b3V0JyksXFxcXG4gICAgbUNvbG9yOiBTeW1ib2woJ21Db2xvcicpLFxcXFxuICAgIG1UYWc6IFN5bWJvbCgnbVRhZycpLFxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBDYXRlZ29yaWVzSGVhZGVyKGNvbG9yKSB7XFxcXG4gICAgLy8gJ3VzZSBzdHJpY3QnO1xcXFxuICAgIC8vIC4uLlxcXFxuICAgIC8vIHRoaXNbc3ltYm9sTWFwLmxpc3RSdWxlXSA9IFtdXFxcXG4gICAgLy8gdGhpc1tzeW1ib2xNYXAuc3ViTGlzdFJ1bGVdID0gW11cXFxcbiAgICB0aGlzW3N5bWJvbE1hcC5tQ29sb3JdID0gY29sb3IgfHwgXFxcXFxcXCIjRkE3Mjk4XFxcXFxcXCI7XFxcXG4gICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdID0gW11cXFxcbiAgICB0aGlzLlZBUk1BUCA9IHtcXFxcbiAgICAgICAgQ0FURUdPUlk6IFxcXFxcXFwiaGVhZGVyLmNhdGVnb3J5XFxcXFxcXCIsXFxcXG4gICAgICAgIFVSTDogXFxcXFxcXCJoZWFkZXIudXJsXFxcXFxcXCIsXFxcXG4gICAgICAgIEZPTEQ6IFxcXFxcXFwiaGVhZGVyLmZvbGRcXFxcXFxcIixcXFxcbiAgICB9XFxcXG4gICAgdGhpc1tzeW1ib2xNYXAubUZvbGRMYXlvdXRdID0ge1xcXFxuICAgICAgICBpbmplY3RJbmRleDogMVxcXFxuICAgIH1cXFxcbiAgICB0aGlzW3N5bWJvbE1hcC5tRm9sZEluZGV4XSA9IDFcXFxcbn1cXFxcblxcXFxuT2JqZWN0LmFzc2lnbihDYXRlZ29yaWVzSGVhZGVyLnByb3RvdHlwZSwge1xcXFxuICAgIC8vIE92ZXJyaWRlIOaehOmAoOaWueazle+8jOebuOW9k+S6jiBmdW5jdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSAoLi4uKSA9PiB7Li4ufe+8jG5ldyBmdW5jdGlvbigpIOeahOaXtuWAmeS8muiHquWKqOaJp+ihjFxcXFxuICAgIGNvbnN0cnVjdG9yOiBDYXRlZ29yaWVzSGVhZGVyLFxcXFxuICAgIC8vIOWumuS5ieengeacieaWueazlVxcXFxuICAgIFZFUlNJT046IDIwMjExMjAxMTkwMCxcXFxcbiAgICBjaGVja1BhcmFtcygpIHtcXFxcbiAgICAgICAgaWYgKCF0aGlzW3N5bWJvbE1hcC5tTGF5b3V0XSkge1xcXFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwi6K+36LCD55SoIGxheW91dChkKSDkvKDlhaXlvZPliY3nlYzpnaJcXFxcXFxcIilcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAoISh0aGlzW3N5bWJvbE1hcC5zcmNdIHx8IHRoaXNbc3ltYm9sTWFwLnRydWVfdXJsXSkpIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+iwg+eUqCB0cnVlVXJsKHVybCkg5Lyg5YWl5b2T5YmN5YiG57G755qE6ZO+5o6l5oiW6LCD55SoIGh0bWwobUh0bWwpIOS8oOWFpeW9k+WJjeWIhuexu+mhtemdoueahOa6kOeggVxcXFxcXFwiKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmICghdGhpc1tzeW1ib2xNYXAubVBhZ2VdKSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLor7fosIPnlKggcGFnZShtUGFnZSkg5Lyg5YWl5b2T5YmN6aG15pWwXFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XS5sZW5ndGggPCAxKSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLor7fosIPnlKjnm7jlhbPmlrnms5XkvKDlhaXlrprkvY3op4TliJlcXFxcXFxcIilcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAoIXRoaXNbc3ltYm9sTWFwLm1Gb2xkXSkge1xcXFxuICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRdID0gJzAnXFxcXG4gICAgICAgIH1cXFxcbiAgICB9LFxcXFxuICAgIGxheW91dChtTGF5b3V0KSB7XFxcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLm1MYXlvdXRdID0gbUxheW91dFxcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgdHJ1ZVVybCh1cmwpIHtcXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAudHJ1ZV91cmxdID0gdXJsXFxcXG4gICAgICAgIHJldHVybiB0aGlzXFxcXG4gICAgfSxcXFxcbiAgICBwYWdlKG1QYWdlKSB7XFxcXG4gICAgICAgIGlmICh0eXBlb2YgKG1QYWdlKSA9PT0gJ3N0cmluZycpIHtcXFxcbiAgICAgICAgICAgIG1QYWdlID0gcGFyc2VJbnQobVBhZ2UpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAubVBhZ2VdID0gbVBhZ2VcXFxcbiAgICAgICAgcmV0dXJuIHRoaXNcXFxcbiAgICB9LFxcXFxuICAgIGh0bWwobVNyYykge1xcXFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5zcmNdID0gbVNyY1xcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgbGlzdChydWxlKSB7XFxcXG4gICAgICAgIGlmICh0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF0ubGVuZ3RoID4gMCkge1xcXFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwibGlzdChydWxlKSBhZGQocnVsZU9iaikg5Y+q6IO95LqM6YCJ5LiA77yBXFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdID0gW3t9XVxcXFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0ubGlzdFJ1bGUgPSBydWxlXFxcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXVsn5LiA57qn5YiG57G7J10gPSBydWxlXFxcXG4gICAgICAgIHJldHVybiB0aGlzXFxcXG4gICAgfSxcXFxcbiAgICBzdWJMaXN0KHJ1bGUpIHtcXFxcbiAgICAgICAgaWYgKHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XS5sZW5ndGggPiAxKSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCJzdWJMaXN0KHJ1bGUpIGFkZChydWxlT2JqKSDlj6rog73kuozpgInkuIDvvIFcXFxcXFxcIilcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAoIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXSB8fCAoIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS5saXN0UnVsZSAmJiAhdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdWyfkuIDnuqfliIbnsbsnXSkpIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+WFiOiwg+eUqCBsaXN0KHJ1bGUpIOaIliDkuIDnuqfliIbnsbsocnVsZSkg5a6a5L2N5LiA57qn5YiG57G7XFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdLnN1Ykxpc3RSdWxlID0gcnVsZVxcXFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF1bJ+WtkOWIhuexuyddID0gcnVsZVxcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgdGl0bGUocnVsZSkge1xcXFxuICAgICAgICBpZiAodGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdLmxlbmd0aCA+IDEpIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcInRpdGxlKHJ1bGUpIGFkZChydWxlT2JqKSDlj6rog73kuozpgInkuIDvvIFcXFxcXFxcIilcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAoIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXSB8fCAoIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS5saXN0UnVsZSAmJiAhdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdWyfkuIDnuqfliIbnsbsnXSkpIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+WFiOiwg+eUqCBsaXN0KHJ1bGUpIOaIliDkuIDnuqfliIbnsbsocnVsZSkg5a6a5L2N5LiA57qn5YiG57G7XFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdLnRpdGxlUnVsZSA9IHJ1bGVcXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdWyfliIbnsbvmoIfpopgnXSA9IHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS50aXRsZVJ1bGVcXFxcbiAgICAgICAgcmV0dXJuIHRoaXNcXFxcbiAgICB9LFxcXFxuICAgIHVybChydWxlKSB7XFxcXG4gICAgICAgIGlmICh0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF0ubGVuZ3RoID4gMSkge1xcXFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwidXJsKHJ1bGUpIGFkZChydWxlT2JqKSDlj6rog73kuozpgInkuIDvvIFcXFxcXFxcIilcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAoIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXSB8fCAoIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS5saXN0UnVsZSAmJiAhdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdWyfkuIDnuqfliIbnsbsnXSkpIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+WFiOiwg+eUqCBsaXN0KHJ1bGUpIOaIliDkuIDnuqfliIbnsbsocnVsZSkg5a6a5L2N5LiA57qn5YiG57G7XFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdLnVybFJ1bGUgPSBydWxlXFxcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXVsn5YiG57G76ZO+5o6lJ10gPSB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0udXJsUnVsZVxcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgLyoqXFxcXG4gICAgICog5piv5ZCm5byA5ZCv5oqY5Y+g5Yqf6IO9XFxcXG4gICAgICpcXFxcbiAgICAgKiBAcGFyYW0gZW5hYmxlZCB0cnVlIOihqOekuuW8gOWQr++8jGZhbHNlIOihqOekuuemgeeUqFxcXFxuICAgICAqIEByZXR1cm5zIHtDYXRlZ29yaWVzSGVhZGVyfVxcXFxuICAgICAqL1xcXFxuICAgIGZvbGRJbm5lcihlbmFibGVkKSB7XFxcXG4gICAgICAgIGlmICghKHR5cGVvZiAoZW5hYmxlZCkgPT09ICdib29sZWFuJykpIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+S8oOWFpSB0cnVlIOaIliBmYWxzZSDooajnpLrlvIDlkK/miJblhbPpl63mipjlj6Dlip/og73vvIFcXFxcXFxcIilcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5tRm9sZElubmVyRW5hYmxlXSA9IGVuYWJsZWRcXFxcbiAgICAgICAgcmV0dXJuIHRoaXNcXFxcbiAgICB9LFxcXFxuICAgIC8qKlxcXFxuICAgICAqIOS7juesrCBpbmRleCDooYzlvIDlp4vmipjlj6BcXFxcbiAgICAgKlxcXFxuICAgICAqIEBwYXJhbSBpbmRleCDlvIDlp4vmipjlj6DnmoTooYzmlbBcXFxcbiAgICAgKiBAcmV0dXJucyB7Q2F0ZWdvcmllc0hlYWRlcn1cXFxcbiAgICAgKi9cXFxcbiAgICBmb2xkSW5kZXgoaW5kZXgpIHtcXFxcbiAgICAgICAgaWYgKCEodHlwZW9mIChpbmRleCkgPT09ICdudW1iZXInKSkge1xcXFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwi5byA5aeL5oqY5Y+g6KGM6K+35Lyg5YWl5pWw5a2X77yBXFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKGluZGV4IDwgMSkge1xcXFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwi5byA5aeL5oqY5Y+g6KGM6K+35Lyg5YWl5aSn5LqOIDAg55qE5pW05pWw77yBXFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRJbmRleF0gPSBpbmRleCB8fCAxO1xcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgLyoqXFxcXG4gICAgICog5oqY5Y+g5oyJ6ZKu55qE55WM6Z2iXFxcXG4gICAgICpcXFxcbiAgICAgKiBAcGFyYW0gbGF5b3V0IOS4jiBkLnB1c2gg57uT5p6E5LiA6Ie077yMXFxcXG4gICAgICogICAgICAgIOS+i++8mnsgdGl0bGU6XFxcXFxcXCLmoIfpopgxXFxcXFxcXCIsIHVybDpcXFxcXFxcInh4eFxcXFxcXFwiLCBjb2xfdHlwZTpcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIiB9O1xcXFxuICAgICAqICAgICAgICDlj4LmlbDph4fnlKjlj6/pgInopobnm5bmqKHlvI/vvIzkuI3lhpnnmoTlj4LmlbDliJnkvb/nlKjpu5jorqQ7XFxcXG4gICAgICogICAgICAgIOavlOWmguS8oOWFpSB7IGNvbF90eXBlOlxcXFxcXFwidGV4dF8xXFxcXFxcXCIgfe+8jOmCo+acgOe7iOe7k+aenOWwseaYryB7IHRpdGxlOlxcXFxcXFwi5qCH6aKYMVxcXFxcXFwiLCB1cmw6XFxcXFxcXCJ4eHhcXFxcXFxcIiwgY29sX3R5cGU6XFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIiB9XFxcXG4gICAgICogQHJldHVybnMge0NhdGVnb3JpZXNIZWFkZXJ9XFxcXG4gICAgICovXFxcXG4gICAgZm9sZExheW91dChsYXlvdXQpIHtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiBsYXlvdXQgPT09ICdvYmplY3QnKSB7XFxcXG4gICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKGxheW91dClcXFxcbiAgICAgICAgICAgIGxldCBpbmplY3RJbmRleCA9IGxheW91dC5pbmplY3RJbmRleCB8fCBsYXlvdXRbJ+aKmOWPoOaMiemSruaPkuWFpeihjCddXFxcXG4gICAgICAgICAgICBpZiAobGF5b3V0LnRpdGxlIHx8IGxheW91dC51cmwgfHwgbGF5b3V0LmNvbF90eXBlIHx8IGluamVjdEluZGV4KSB7XFxcXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV1cXFxcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRMYXlvdXRdW2tleV0gPSBsYXlvdXRba2V5XTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+S8oOWFpeato+ehrueahOaKmOWPoOeVjOmdouWFg+e0oO+8gVxcXFxcXFwiKVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgLy8gaW5qZWN0SW5kZXgg5oqY5Y+g5oyJ6ZKu5o+S5YWl56ysIGluamVjdEluZGV4IOihjFxcXFxuICAgICAgICAgICAgaWYgKGluamVjdEluZGV4KSB7XFxcXG4gICAgICAgICAgICAgICAgaWYgKCEodHlwZW9mIChpbmplY3RJbmRleCkgPT09ICdudW1iZXInKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLmipjlj6DmjInpkq7mj5LlhaXooYzor7fkvKDlhaXmlbDlrZfvvIFcXFxcXFxcIilcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgaWYgKGluamVjdEluZGV4IDwgMSkge1xcXFxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLmipjlj6DmjInpkq7mj5LlhaXooYzor7fkvKDlhaXlpKfkuo4gMCDnmoTmlbTmlbDvvIFcXFxcXFxcIilcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgaWYgKGluamVjdEluZGV4ID4gdGhpc1tzeW1ib2xNYXAubUZvbGRJbmRleF0pIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwi5oqY5Y+g5oyJ6ZKu5o+S5YWl6KGM5LiN5b6X5aSn5LqO5pi+56S65oqY5Y+g6KGM5pWw77yB6K+36LCD55SoIC5mb2xkSW5kZXgoaW5kZXgpIOaIliAu56ys5Yeg6KGM5byA5aeL5oqY5Y+gKGluZGV4KSDkvKDlhaXmraPnoa7nmoTmmL7npLrmipjlj6DooYzmlbBcXFxcXFxcIilcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRMYXlvdXRdLmluamVjdEluZGV4ID0gaW5qZWN0SW5kZXggfHwgMTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+S8oOWFpeato+ehrueahOaKmOWPoOeVjOmdouWFg+e0oO+8gVxcXFxcXFwiKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAgLy8g5b2T5YmN5piv5ZCm5oqY5Y+gXFxcXG4gICAgZm9sZChpc0ZvbGQpIHtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiAoaXNGb2xkKSA9PT0gJ3N0cmluZycpIHtcXFxcbiAgICAgICAgICAgIGlzRm9sZCA9IGlzRm9sZCA9PT0gJzEnXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKGlzRm9sZCkge1xcXFxuICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRdID0gJzEnO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRdID0gJzAnO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiB0aGlzXFxcXG4gICAgfSxcXFxcbiAgICBjb2xvcihtQ29sb3IpIHtcXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAubUNvbG9yXSA9IG1Db2xvclxcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgdGFnKG1UYWcpIHtcXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAubVRhZ10gPSBtVGFnXFxcXG4gICAgICAgIHJldHVybiB0aGlzXFxcXG4gICAgfSxcXFxcbiAgICBhZGQocnVsZU9iaikge1xcXFxuICAgICAgICAvLyBsb2coJC5zdHJpbmdpZnkocnVsZU9iaikpXFxcXG4gICAgICAgIGlmIChydWxlT2JqLmNvbnN0cnVjdG9yID09PSBBcnJheSkge1xcXFxuICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdID0gdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdLmNvbmNhdChydWxlT2JqKVxcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdLnB1c2gocnVsZU9iailcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIGV2YWxKU1J1bGUoaXRlbSwganNSdWxlKSB7XFxcXG4gICAgICAgIGxldCBydWxlID0ganNSdWxlLnJlcGxhY2UoXFxcXFxcXCJAanM6XFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpXFxcXG4gICAgICAgIHJ1bGUgPSBydWxlLnRyaW0oKVxcXFxuICAgICAgICAvLyBsb2coJC5zdHJpbmdpZnkocnVsZSkpXFxcXG4gICAgICAgIGxldCBpbnB1dCA9IGl0ZW1cXFxcbiAgICAgICAgaWYgKHJ1bGUuc3RhcnRzV2l0aChcXFxcXFxcIihcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgIGV2YWwoJ3Jlc3VsdCA9ICcgKyBydWxlKVxcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgLyoqXFxcXG4gICAgICAgICAgICAgKiDov5jljp/miJAgJC50b1N0cmluZyguLi4pIOeahOacgOe7iOe7k+aenO+8jOi+vuWIsOacgOe7iOWkhOeQhuaWueW8j+i3n+S4iumdoueahCBpZiDkuIDoh7TnmoTnm67nmoRcXFxcbiAgICAgICAgICAgICAqL1xcXFxuICAgICAgICAgICAgZXZhbCgncmVzdWx0ID0gJyArICcoKCkgPT4geycgKyBydWxlICsgJ30pKCknKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiAocmVzdWx0IHx8ICcnKVxcXFxuICAgIH0sXFxcXG4gICAgZ2V0VGl0bGUoc3JjLCBjYXRlZ29yeSkge1xcXFxuICAgICAgICBsZXQgdGl0bGUgPSAnJ1xcXFxuICAgICAgICBsZXQgdGl0bGVSdWxlID0gY2F0ZWdvcnkudGl0bGVSdWxlIHx8ICdhJiZUZXh0J1xcXFxuICAgICAgICBpZiAodGl0bGVSdWxlLnN0YXJ0c1dpdGgoXFxcXFxcXCJAanM6XFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICB0aXRsZSA9IHRoaXMuZXZhbEpTUnVsZShzcmMsIHRpdGxlUnVsZSlcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHRpdGxlID0gcGFyc2VEb21Gb3JIdG1sKHNyYywgdGl0bGVSdWxlKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiB0aXRsZSB8fCBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgIH0sXFxcXG4gICAgZ2V0VXJsKHNyYywgY2F0ZWdvcnkpIHtcXFxcbiAgICAgICAgbGV0IHVybCA9ICcnXFxcXG4gICAgICAgIGxldCB1cmxSdWxlID0gY2F0ZWdvcnkudXJsUnVsZSB8fCAnYSYmaHJlZidcXFxcbiAgICAgICAgaWYgKHR5cGVvZiB1cmxSdWxlID09PSAnb2JqZWN0Jykge1xcXFxuICAgICAgICAgICAgbGV0IG1VcmxSdWxlID0gdXJsUnVsZS5ydWxlIHx8IHVybFJ1bGVbJ+ino+aekOinhOWImSddIHx8ICdhJiZocmVmJztcXFxcbiAgICAgICAgICAgIGlmIChtVXJsUnVsZS5zdGFydHNXaXRoKFxcXFxcXFwiQGpzOlxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgICAgIHVybCA9IHRoaXMuZXZhbEpTUnVsZShzcmMsIG1VcmxSdWxlKTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHBhcnNlID0gcGFyc2VEb207XFxcXG4gICAgICAgICAgICAgICAgaWYgKHVybFJ1bGUucGFyc2VPcHRpb24pIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh1cmxSdWxlLnBhcnNlT3B0aW9uKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXFxcXFwicGFyc2VEb21cXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcXFxcXCJwZFxcXFxcXFwiOlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlID0gcGFyc2VEb207XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXFxcXFwicGFyc2VEb21Gb3JIdG1sXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXFxcXFwicGRmaFxcXFxcXFwiOlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlID0gcGFyc2VEb21Gb3JIdG1sO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZSA9IHBhcnNlRG9tO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1cmxSdWxlW1xcXFxcXFwi6Kej5p6Q5pa55rOVXFxcXFxcXCJdKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodXJsUnVsZVtcXFxcXFxcIuino+aekOaWueazlVxcXFxcXFwiXSkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFxcXFxcInBhcnNlRG9tXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXFxcXFwicGRcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZSA9IHBhcnNlRG9tO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFxcXFxcInBhcnNlRG9tRm9ySHRtbFxcXFxcXFwiOlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFxcXFxcInBkZmhcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZSA9IHBhcnNlRG9tRm9ySHRtbDtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2UgPSBwYXJzZURvbTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB1cmwgPSBwYXJzZShzcmMsIG1VcmxSdWxlKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGlmICh1cmxSdWxlLmRlYWxVcmwpIHtcXFxcbiAgICAgICAgICAgICAgICB1cmwgPSB1cmxSdWxlLmRlYWxVcmwodXJsKVxcXFxuICAgICAgICAgICAgfSBlbHNlIGlmICh1cmxSdWxlWyfkuozmrKHlpITnkIYnXSkge1xcXFxuICAgICAgICAgICAgICAgIHVybCA9IHVybFJ1bGVbJ+S6jOasoeWkhOeQhiddKHVybClcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGlmICh1cmxSdWxlLnN0YXJ0c1dpdGgoXFxcXFxcXCJAanM6XFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICAgICAgdXJsID0gdGhpcy5ldmFsSlNSdWxlKHNyYywgdXJsUnVsZSk7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHVybCA9IHBhcnNlRG9tKHNyYywgdXJsUnVsZSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIHVybCB8fCBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgIH0sXFxcXG4gICAgYnVpbGQoKSB7XFxcXG4gICAgICAgIC8vIOajgOa1i+aYr+WQpuS8oOWFpemcgOimgeeahOWPguaVsFxcXFxuICAgICAgICB0aGlzLmNoZWNrUGFyYW1zKClcXFxcbiAgICAgICAgLy8g5q+P5LiA5Liq5YiG57G755qE5ZSv5LiA5qCH6K+GXFxcXG4gICAgICAgIGxldCBtVGFnID0gdGhpc1tzeW1ib2xNYXAubVRhZ10gfHwgXFxcXFxcXCJcXFxcXFxcIlxcXFxuICAgICAgICAvL+e/u+mhtSDpnIDopoHmoLnmja7lrp7pmYXmm7/mjaJcXFxcbiAgICAgICAgY29uc3QgaHRtbCA9IHRoaXNbc3ltYm9sTWFwLnNyY10gfHwgcmVxdWVzdCh0aGlzW3N5bWJvbE1hcC50cnVlX3VybF0pXFxcXG4gICAgICAgIGNvbnN0IGVtcHR5ID0gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgLy/ojrflj5bliJfooahcXFxcbiAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFtdXFxcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XS5tYXAocnVsZU9iaiA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgbGlzdCA9IFtdXFxcXG4gICAgICAgICAgICBsZXQgbGlzdFJ1bGUgPSBydWxlT2JqLmxpc3RSdWxlIHx8IHJ1bGVPYmpbXFxcXFxcXCLkuIDnuqfliIbnsbtcXFxcXFxcIl1cXFxcbiAgICAgICAgICAgIGlmIChsaXN0UnVsZS5zdGFydHNXaXRoKFxcXFxcXFwiQGpzOlxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgICAgIC8vIGxvZygkLnN0cmluZ2lmeShsaXN0UnVsZSkpXFxcXG4gICAgICAgICAgICAgICAgbGlzdCA9IHRoaXMuZXZhbEpTUnVsZShodG1sLCBsaXN0UnVsZSlcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgbGlzdCA9IHBhcnNlRG9tRm9yQXJyYXkoaHRtbCwgbGlzdFJ1bGUpXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAvLyBsb2cobGlzdClcXFxcbiAgICAgICAgICAgIGxpc3QubWFwKGNhdGVnb3J5ID0+IHtcXFxcbiAgICAgICAgICAgICAgICBjYXRlZ29yaWVzLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICBsaXN0OiBjYXRlZ29yeSxcXFxcbiAgICAgICAgICAgICAgICAgICAgc3ViTGlzdFJ1bGU6IHJ1bGVPYmouc3ViTGlzdFJ1bGUgfHwgcnVsZU9ialtcXFxcXFxcIuWtkOWIhuexu1xcXFxcXFwiXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVSdWxlOiBydWxlT2JqLnRpdGxlUnVsZSB8fCBydWxlT2JqW1xcXFxcXFwi5YiG57G75qCH6aKYXFxcXFxcXCJdLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmxSdWxlOiBydWxlT2JqLnVybFJ1bGUgfHwgcnVsZU9ialtcXFxcXFxcIuWIhuexu+mTvuaOpVxcXFxcXFwiXSxcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIH0pXFxcXG4gICAgICAgIH0pXFxcXG5cXFxcbiAgICAgICAgLy8gbG9nKCQuc3RyaW5naWZ5KGNhdGVnb3JpZXMpKVxcXFxuXFxcXG4gICAgICAgIGxldCBpbml0X2NhdGUgPSBbXVxcXFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDIwOyBpKyspIHtcXFxcbiAgICAgICAgICAgIGluaXRfY2F0ZS5wdXNoKFxcXFxcXFwiMFxcXFxcXFwiKVxcXFxuICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgY29uc3QgY2F0ZV90ZW1wX2pzb24gPSBnZXRNeVZhcihtVGFnICsgdGhpcy5WQVJNQVAuQ0FURUdPUlksIEpTT04uc3RyaW5naWZ5KGluaXRfY2F0ZSkpXFxcXG4gICAgICAgIGNvbnN0IGNhdGVfdGVtcCA9IEpTT04ucGFyc2UoY2F0ZV90ZW1wX2pzb24pXFxcXG5cXFxcbiAgICAgICAgaWYgKHRoaXNbc3ltYm9sTWFwLm1QYWdlXSA9PT0gMSkge1xcXFxuXFxcXG4gICAgICAgICAgICBjYXRlZ29yaWVzLmZvckVhY2goKGNhdGVnb3J5LCBpbmRleCkgPT4ge1xcXFxuXFxcXG4gICAgICAgICAgICAgICAgLy8g5oqY5Y+gIFVJXFxcXG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbc3ltYm9sTWFwLm1Gb2xkSW5uZXJFbmFibGVdICYmIHRoaXNbc3ltYm9sTWFwLm1Gb2xkTGF5b3V0XS5pbmplY3RJbmRleCA9PT0gKGluZGV4KzEpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2xkTGF5b3V0ID0ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXNbc3ltYm9sTWFwLm1Gb2xkTGF5b3V0XS50aXRsZSB8fCAodGhpc1tzeW1ib2xNYXAubUZvbGRdID09PSAnMScgPyAn4oCc4oCc4oCd4oCdPGI+PHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjogI0ZGMDAwMFxcXFxcXFwiPuKIqDwvc3Bhbj48L2I+JyA6ICfigJzigJzigJ3igJ08Yj48c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiAjMWFhZDE5XFxcXFxcXCI+4oinPC9zcGFuPjwvYj4nKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGhpc1tzeW1ib2xNYXAubUZvbGRMYXlvdXRdLnVybCB8fCAkKFxcXFxcXFwiaGlrZXI6Ly9lbXB0eSNub0hpc3RvcnkjXFxcXFxcXCIpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihwYXJhbXMubVRhZyArIHBhcmFtcy5WQVJNQVAuRk9MRCwgZ2V0TXlWYXIocGFyYW1zLm1UYWcgKyBwYXJhbXMuVkFSTUFQLkZPTEQsIHBhcmFtcy5pc0ZvbGQpID09PSAnMScgPyAnMCcgOiAnMScpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UYWc6IG1UYWcsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGb2xkOiB0aGlzW3N5bWJvbE1hcC5tRm9sZF0sXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSTUFQOiB0aGlzLlZBUk1BUFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogdGhpc1tzeW1ib2xNYXAubUZvbGRMYXlvdXRdLmNvbF90eXBlIHx8IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1MYXlvdXRdLnB1c2goZm9sZExheW91dClcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgICAgICAgICAvL+WFt+S9k+WIl+ihqOS4i+eahOWIhuexu1xcXFxuICAgICAgICAgICAgICAgIGxldCBzdWJfY2F0ZWdvcmllcyA9IFtdO1xcXFxuICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeS5zdWJMaXN0UnVsZS5zdGFydHNXaXRoKFxcXFxcXFwiQGpzOlxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBzdWJfY2F0ZWdvcmllcyA9IHRoaXMuZXZhbEpTUnVsZShjYXRlZ29yeS5saXN0LCBjYXRlZ29yeS5zdWJMaXN0UnVsZSlcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICBzdWJfY2F0ZWdvcmllcyA9IHBhcnNlRG9tRm9yQXJyYXkoY2F0ZWdvcnkubGlzdCwgY2F0ZWdvcnkuc3ViTGlzdFJ1bGUpO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAodGhpc1tzeW1ib2xNYXAubUZvbGRJbmRleF0gfHwgMSkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgc3ViX2NhdGVnb3JpZXMuZm9yRWFjaCgoaXRlbSwga2V5KSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSB0aGlzLmdldFRpdGxlKGl0ZW0sIGNhdGVnb3J5KVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IHRoaXMuZ2V0VXJsKGl0ZW0sIGNhdGVnb3J5KVxcXFxuXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3N5bWJvbE1hcC5tTGF5b3V0XS5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZToga2V5LnRvU3RyaW5nKCkgPT09IGNhdGVfdGVtcFtpbmRleF0gPyAn4oCc4oCc4oCd4oCdPGI+PGZvbnQgY29sb3I9JyArIHRoaXNbc3ltYm9sTWFwLm1Db2xvcl0gKyAnPicgKyB0aXRsZSArICcgPC9mb250PjwvYj4nIDogdGl0bGUsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKHVybCkubGF6eVJ1bGUoKHBhcmFtcykgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3X2NhdGUgPSBbXVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmluZGV4ID09PSAwKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2F0ZV90ZW1wLmZvckVhY2goKGNhdGUsIGluZGV4KSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2NhdGUucHVzaChpbmRleCA9PT0gMCA/IHBhcmFtcy5rZXkudG9TdHJpbmcoKSA6IFxcXFxcXFwiMFxcXFxcXFwiKVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2F0ZV90ZW1wW3BhcmFtcy5pbmRleF0gPSBwYXJhbXMua2V5LnRvU3RyaW5nKClcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihwYXJhbXMudGFnICsgcGFyYW1zLlZBUk1BUC5DQVRFR09SWSwgSlNPTi5zdHJpbmdpZnkocGFyYW1zLmluZGV4ID09PSAwID8gbmV3X2NhdGUgOiBwYXJhbXMuY2F0ZV90ZW1wKSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIocGFyYW1zLnRhZyArIHBhcmFtcy5WQVJNQVAuVVJMLCBpbnB1dClcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlX3RlbXA6IGNhdGVfdGVtcCxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJNQVA6IHRoaXMuVkFSTUFQLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6IG1UYWcsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleToga2V5LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiB0aGlzW3N5bWJvbE1hcC5tUGFnZV0sXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1MYXlvdXRdLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYmxhbmtfYmxvY2tcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXNbc3ltYm9sTWFwLm1Gb2xkXSA9PT0gJzAnKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gdGhpcy5nZXRUaXRsZShpdGVtLCBjYXRlZ29yeSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSB0aGlzLmdldFVybChpdGVtLCBjYXRlZ29yeSlcXFxcblxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUxheW91dF0ucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGtleS50b1N0cmluZygpID09PSBjYXRlX3RlbXBbaW5kZXhdID8gJ+KAnOKAnOKAneKAnTxiPjxmb250IGNvbG9yPScgKyB0aGlzW3N5bWJvbE1hcC5tQ29sb3JdICsgJz4nICsgdGl0bGUgKyAnIDwvZm9udD48L2I+JyA6IHRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJCh1cmwpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNhdGVfdGVtcFtwYXJhbXMuaW5kZXhdID0gcGFyYW1zLmtleS50b1N0cmluZygpXFxcXG5cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIocGFyYW1zLnRhZyArIHBhcmFtcy5WQVJNQVAuQ0FURUdPUlksIEpTT04uc3RyaW5naWZ5KHBhcmFtcy5jYXRlX3RlbXApKVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihwYXJhbXMudGFnICsgcGFyYW1zLlZBUk1BUC5VUkwsIGlucHV0KVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVfdGVtcDogY2F0ZV90ZW1wLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUk1BUDogdGhpcy5WQVJNQVAsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZzogbVRhZyxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBrZXksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXNbc3ltYm9sTWFwLm1QYWdlXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUxheW91dF0ucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJibGFua19ibG9ja1xcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSxcXFxcblxcXFxuICAgIOeVjOmdoihsYXlvdXQpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0KGxheW91dClcXFxcbiAgICB9LFxcXFxuICAgIOWIhuexu+mTvuaOpSh0cnVlVXJsKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLnRydWVVcmwodHJ1ZVVybCk7XFxcXG4gICAgfSxcXFxcbiAgICDpobXnoIEocGFnZSkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5wYWdlKHBhZ2UpO1xcXFxuICAgIH0sXFxcXG4gICAg5rqQ56CBKGh0bWwpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuaHRtbChodG1sKTtcXFxcbiAgICB9LFxcXFxuICAgIOWumuS9jeS4gOe6p+WIhuexuyhsaXN0KSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3QobGlzdCk7XFxcXG4gICAgfSxcXFxcbiAgICDlrprkvY3lrZDliIbnsbsoc3ViTGlzdCkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5zdWJMaXN0KHN1Ykxpc3QpO1xcXFxuICAgIH0sXFxcXG4gICAg5a6a5L2N5YiG57G75qCH6aKYKHRpdGxlKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLnRpdGxlKHRpdGxlKTtcXFxcbiAgICB9LFxcXFxuICAgIOWumuS9jeWIhuexu+mTvuaOpSh1cmwpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMudXJsKHVybCk7XFxcXG4gICAgfSxcXFxcbiAgICDlvIDlkK/lhoXnva7mipjlj6Dlip/og70oKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLmZvbGRJbm5lcih0cnVlKTtcXFxcbiAgICB9LFxcXFxuICAgIOWFs+mXreWGhee9ruaKmOWPoOWKn+iDvSgpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9sZElubmVyKGZhbHNlKTtcXFxcbiAgICB9LFxcXFxuICAgIOesrOWHoOihjOW8gOWni+aKmOWPoChpbmRleCkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5mb2xkSW5kZXgoaW5kZXgpO1xcXFxuICAgIH0sXFxcXG4gICAg5oqY5Y+g5oyJ6ZKu5qC35byPKGxheW91dCkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5mb2xkTGF5b3V0KGxheW91dClcXFxcbiAgICB9LFxcXFxuICAgIOaKmOWPoChmb2xkKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLmZvbGQoZm9sZCk7XFxcXG4gICAgfSxcXFxcbiAgICDpgInkuK3nmoTliIbnsbvpopzoibIoY29sb3IpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sb3IoY29sb3IpO1xcXFxuICAgIH0sXFxcXG4gICAg5ZSv5LiA5qCH6K+GKG1UYWcpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMudGFnKG1UYWcpXFxcXG4gICAgfSxcXFxcbiAgICDmt7vliqDliIbnsbvlrprkvY0ocnVsZU9iaikge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5hZGQocnVsZU9iaik7XFxcXG4gICAgfSxcXFxcbiAgICDlvIDlp4vmiZPpgKDliIbnsbsoKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkKCk7XFxcXG4gICAgfSxcXFxcblxcXFxufSlcXFxcbiQuZXhwb3J0cyA9IG5ldyBDYXRlZ29yaWVzSGVhZGVyKCk7XFxcXG4kLmV4cG9ydHNcXFxcblxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIumTvuaOpeWkhOeQhlvkuoxdKlxcXCIsXFxcInBhdGhcXFwiOlxcXCJ1cmwtcHJvY2Vzc29yXFxcIixcXFwicnVsZVxcXCI6XFxcIi8qKlxcXFxuICog5pys5Zyw572R6aG15o+S5Lu26ZO+5o6lIGhpa2VyOi8vZmlsZXMvcnVsZXMvanMvVXJsUHJvY2Vzc29yLmpzXFxcXG4gKiDlrZDpobXpnaLpk77mjqUgaGlrZXI6Ly9wYWdlL3VybC1wcm9jZXNzb3JcXFxcbiAqIOmBk+mVv+S7k+W6k+mTvuaOpSBodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD0yODQ5XFxcXG4gKiDnoIHkupEgR2l0ZWUg6ZO+5o6lIGh0dHBzOi8vZ2l0ZWUuY29tL3JlYm9ybjAvSGlrZXJSdWxlcy9yYXcvbWFzdGVyL3BsdWdpbnMvVXJsUHJvY2Vzc29yLmpzXFxcXG4gKi9cXFxcbmZ1bmN0aW9uIFVybFByb2Nlc3NvcigpIHtcXFxcbiAgICB0aGlzLnBhcmFtcyA9IHt9XFxcXG4gICAgdGhpcy5yZWdleE1hcCA9IFtcXFxcbiAgICAgICAge1xcXFxuICAgICAgICAgICAgcmVnOiAnKHZvZHR5cGV8dmlkZW90KVxcXFxcXFxcXFxcXFxcXFwvXFxcXFxcXFxcXFxcXFxcXHcrJyxcXFxcbiAgICAgICAgICAgIGV4ZWM6ICgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJhbXMudXJsXFxcXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8tXFxcXFxcXFxkKy5odG1sLywgJy0nICsgdGhpcy5wYXJhbXMucGFnZSArICcuaHRtbCcpXFxcXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oKHZvZHR5cGV8dmlkZW90KVxcXFxcXFxcL1xcXFxcXFxcdyspLmh0bWwvLCAnJDEtJyArIHRoaXMucGFyYW1zLnBhZ2UgKyAnLmh0bWwnKVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9LFxcXFxuICAgICAgICB7XFxcXG4gICAgICAgICAgICByZWc6ICdcXFxcXFxcXFxcXFxcXFxcLz9bXFxcXFxcXFxcXFxcXFxcXHdcXFxcXFxcXFxcXFxcXFxcZF0rLS4qPy0uKj8tLio/LS4qPy0uKj8tLio/LS4qPy1cXFxcXFxcXFxcXFxcXFxcZCotLS1cXFxcXFxcXFxcXFxcXFxcZCouaHRtbCcsXFxcXG4gICAgICAgICAgICBleGVjOiAoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1zLnVybFxcXFxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFxcXFxkKigtLS0uaHRtbCkvLCB0aGlzLnBhcmFtcy5wYWdlICsgJyQxJylcXFxcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLygtLS1cXFxcXFxcXGQrLmh0bWwpLywgdGhpcy5wYXJhbXMucGFnZSArICckMScpOyAvLyDmi7zmjqXpobXnoIFcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSxcXFxcbiAgICAgICAge1xcXFxuICAgICAgICAgICAgcmVnOiAnKChcXFxcXFxcXFxcXFxcXFxcL3ZvZFxcXFxcXFxcXFxcXFxcXFwvc2hvdyk/KFxcXFxcXFxcXFxcXFxcXFwvYXJlYVxcXFxcXFxcXFxcXFxcXFwvW1xcXFxcXFxcXFxcXFxcXFx3XFxcXFxcXFxcXFxcXFxcXGQlXSspPyhcXFxcXFxcXFxcXFxcXFxcL2J5XFxcXFxcXFxcXFxcXFxcXC9bXFxcXFxcXFxcXFxcXFxcXHdcXFxcXFxcXFxcXFxcXFxcZCVdKyk/KFxcXFxcXFxcXFxcXFxcXFwvaWRcXFxcXFxcXFxcXFxcXFxcL1xcXFxcXFxcXFxcXFxcXFxkKyk/KFxcXFxcXFxcXFxcXFxcXFwvbGV0dGVyXFxcXFxcXFxcXFxcXFxcXC9bXFxcXFxcXFxcXFxcXFxcXHdcXFxcXFxcXFxcXFxcXFxcZCVdKyk/KShcXFxcXFxcXFxcXFxcXFxcL3BhZ2VcXFxcXFxcXFxcXFxcXFxcL1xcXFxcXFxcXFxcXFxcXFxkKyk/KFxcXFxcXFxcXFxcXFxcXFwveWVhclxcXFxcXFxcXFxcXFxcXFwvXFxcXFxcXFxcXFxcXFxcXGQrKT9cXFxcXFxcXFxcXFxcXFxcLmh0bWwnLFxcXFxuICAgICAgICAgICAgZXhlYzogKCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGxldCByZWdFeHAgPSAvKChcXFxcXFxcXC92b2RcXFxcXFxcXC9zaG93KT8oXFxcXFxcXFwvYXJlYVxcXFxcXFxcL1tcXFxcXFxcXHdcXFxcXFxcXGQlXSspPyhcXFxcXFxcXC9ieVxcXFxcXFxcL1tcXFxcXFxcXHdcXFxcXFxcXGQlXSspPyhcXFxcXFxcXC9pZFxcXFxcXFxcL1xcXFxcXFxcZCspPyhcXFxcXFxcXC9sZXR0ZXJcXFxcXFxcXC9bXFxcXFxcXFx3XFxcXFxcXFxkJV0rKT8pKFxcXFxcXFxcL3BhZ2VcXFxcXFxcXC9cXFxcXFxcXGQrKT8oXFxcXFxcXFwveWVhclxcXFxcXFxcL1xcXFxcXFxcZCspP1xcXFxcXFxcLmh0bWwvXFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1zLnVybFxcXFxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShyZWdFeHAsICckMScgKyAoXFxcXFxcXCIvcGFnZS9cXFxcXFxcIiArIHRoaXMucGFyYW1zLnBhZ2UpICsgJyQ4JyArIFxcXFxcXFwiLmh0bWxcXFxcXFxcIilcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgIF1cXFxcbn1cXFxcblxcXFxuT2JqZWN0LmFzc2lnbihVcmxQcm9jZXNzb3IucHJvdG90eXBlLCB7XFxcXG4gICAgY29uc3RydWN0b3I6IFVybFByb2Nlc3NvcixcXFxcbiAgICBjaGVja1BhcmFtcygpIHtcXFxcbiAgICAgICAgaWYgKCF0aGlzLnBhcmFtcy51cmwpIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+WFiOiwg+eUqCAuYmFzZVVybCh1cmwpIOS8oOWFpemTvuaOpei/m+ihjOWIneWni+WMliFcXFxcXFxcIilcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAoIXRoaXMucGFyYW1zLnBhZ2UpIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+WFiOiwg+eUqCAucGFnZShwYWdlKSDkvKDlhaXpobXnoIHov5vooYzliJ3lp4vljJYhXFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICB9LFxcXFxuICAgIGJhc2VVcmwodXJsKXtcXFxcbiAgICAgICAgdGhpcy5wYXJhbXMudXJsID0gdXJsXFxcXG4gICAgICAgIHJldHVybiB0aGlzXFxcXG4gICAgfSxcXFxcbiAgICBwYWdlKHBhZ2Upe1xcXFxuICAgICAgICB0aGlzLnBhcmFtcy5wYWdlID0gcGFnZVxcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgYWRkRXh0cmEocmVnRXhwKSB7XFxcXG4gICAgICAgIGlmIChyZWdFeHAuY29uc3RydWN0b3IgPT09IEFycmF5KSB7XFxcXG4gICAgICAgICAgICB0aGlzLnJlZ2V4TWFwID0gdGhpcy5yZWdleE1hcC5jb25jYXQocmVnRXhwKVxcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgdGhpcy5yZWdleE1hcC5wdXNoKHJlZ0V4cClcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIGRlYnVnKCkge1xcXFxuICAgICAgICB0aGlzLnBhcmFtcy5kZWJ1ZyA9IHRydWVcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBleGVjKCkge1xcXFxuICAgICAgICB0aGlzLmNoZWNrUGFyYW1zKClcXFxcbiAgICAgICAgbGV0IHRydWVfdXJsID0gJydcXFxcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlZ2V4TWFwLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICBsZXQgcmVnT2JqID0gdGhpcy5yZWdleE1hcFtpXTtcXFxcbiAgICAgICAgICAgIGxldCB1cmxFeHAgPSByZWdPYmoucmVnO1xcXFxuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxFeHAgPT09ICdzdHJpbmcnKSB7XFxcXG4gICAgICAgICAgICAgICAgdXJsRXhwID0gbmV3IFJlZ0V4cCh1cmxFeHApXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZiAodXJsRXhwLnRlc3QodGhpcy5wYXJhbXMudXJsKSkge1xcXFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtcy5kZWJ1Zykge1xcXFxuICAgICAgICAgICAgICAgICAgICBsb2codXJsRXhwLnRvU3RyaW5nKCkpXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIHRydWVfdXJsID0gcmVnT2JqLmV4ZWMoKTtcXFxcbiAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAodHJ1ZV91cmwpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiB0cnVlX3VybDtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmFtcy51cmxcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sXFxcXG4gICAg6I635Y+W5aSE55CG57uT5p6cKCkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5leGVjKClcXFxcbiAgICB9LFxcXFxuICAgIOmTvuaOpSh1cmwpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVVybCh1cmwpXFxcXG4gICAgfSxcXFxcbiAgICDpobXnoIEocGFnZSkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5wYWdlKHBhZ2UpXFxcXG4gICAgfSxcXFxcbiAgICDmj5LlhaXmlrDlpITnkIbop4TliJkocmVnRXhwKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLmFkZEV4dHJhKHJlZ0V4cClcXFxcbiAgICB9LFxcXFxuICAgIOiwg+ivleaooeW8jygpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVidWcoKTtcXFxcbiAgICB9XFxcXG59KVxcXFxuJC5leHBvcnRzPW5ldyBVcmxQcm9jZXNzb3IoKVxcXFxuJC5leHBvcnRzXFxcXG5cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLkuIDnuqcqXFxcIixcXFwicGF0aFxcXCI6XFxcInlqdG9vbFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJmdW5jdGlvbiBjb252ZXJ0MShzdHIpIHtcXFxcbiAgICBsZXQgYyA9IHN0ci5zcGxpdChcXFxcXFxcIjtcXFxcXFxcIilcXFxcbiAgICByZXR1cm4ge1xcXFxuICAgICAgICDliJfooag6IGNbMF0sXFxcXG4gICAgICAgIOagh+mimDogY1sxXSxcXFxcbiAgICAgICAg5Zu+54mHOiBjWzJdLFxcXFxuICAgICAgICDmj4/ov7A6IGNbM10sXFxcXG4gICAgICAgIOmTvuaOpTogY1s0XVxcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gbWVyZ2Uoc291cmNlLCB0YXJnZXQpIHtcXFxcbiAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSlcXFxcbiAgICBmb3IgKGxldCBpIGluIGtleXMpIHtcXFxcbiAgICAgICAgdGFyZ2V0W2tleXNbaV1dID0gc291cmNlW2tleXNbaV1dXFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiDkuIDnuqcob2JqKSB7XFxcXG4gICAgdmFyIGQgPSBbXTtcXFxcbiAgICBpZiAoJC50eXBlKG9iaikgPT0gXFxcXFxcXCJzdHJpbmdcXFxcXFxcIikge1xcXFxuICAgICAgICBvYmogPSBjb252ZXJ0MShvYmopXFxcXG4gICAgfVxcXFxuICAgIGlmIChvYmou6KeE5YiZKSB7XFxcXG4gICAgICAgIGxldCBjID0gY29udmVydDEob2JqLuinhOWImSlcXFxcbiAgICAgICAgbWVyZ2UoYywgb2JqKVxcXFxuICAgIH1cXFxcbiAgICBsZXQgYXJyID0gcGRmYShnZXRSZXNDb2RlKCksIG9iai7liJfooagpO1xcXFxuICAgICAgIGlmIChvYmou5YiX6KGo5aSE55CGICE9IG51bGwpIHtcXFxcbiAgICAgICAgICAgIGFyciA9IG9iai7pk77mjqXlpITnkIYoYXJyKVxcXFxuICAgICAgICB9XFxcXG4gICAgZm9yIChsZXQgaXQgb2YgYXJyKSB7XFxcXG4gICAgICAgIGxldCB1cmwgPSBwZChpdCwgb2JqLumTvuaOpSlcXFxcbiAgICAgICAgaWYgKG9iai7pk77mjqXlpITnkIYgIT0gbnVsbCkge1xcXFxuICAgICAgICAgICAgdXJsID0gb2JqLumTvuaOpeWkhOeQhih1cmwpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IHBpYyA9IHBkKGl0LCBvYmou5Zu+54mHKVxcXFxuICAgICAgICBpZiAob2JqLuWbvueJh+WkhOeQhiAhPSBudWxsKSB7XFxcXG4gICAgICAgICAgICBwaWMgPSBvYmou5Zu+54mH5aSE55CGKHBpYylcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IHBkZmgoaXQsIG9iai7moIfpopgpLFxcXFxuICAgICAgICAgICAgdXJsOiB1cmwrJyNhdXRvQ2FjaGUjJyxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZGVzYzogb2JqLuaPj+i/sCA/IHBkZmgoaXQsIG9iai7mj4/ov7ApIDogXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHBpY191cmw6IHBpY1xcXFxuICAgICAgICB9KTtcXFxcblxcXFxuICAgIH1cXFxcbiAgICBzZXRSZXN1bHQoZCk7XFxcXG59XFxcXG52YXIgdG9vbCA9IHtcXFxcbiAgICDkuIDnuqc6IOS4gOe6p1xcXFxufVxcXFxuJC5leHBvcnRzID0gdG9vbFxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuS4gOe6p1vkuoxdKlxcXCIsXFxcInBhdGhcXFwiOlxcXCJ5aWppXFxcIixcXFwicnVsZVxcXCI6XFxcImZ1bmN0aW9uIOS4gOe6pygpIHt9O1xcXFxyXFxcXG5PYmplY3QuYXNzaWduKOS4gOe6py5wcm90b3R5cGUsIHtcXFxcclxcXFxuXFxcXHRjb25zdHJ1Y3Rvcjog5LiA57qnLFxcXFxyXFxcXG5cXFxcdHRlc3QoKSB7fSxcXFxcclxcXFxuXFxcXHTojrflj5bmupDnoIEodXJsLCBoZWFkZXIpIHtyZXR1cm4gZmV0Y2godHJ1ZV91cmwsIHtoZWFkZXJzOiBoZWFkZXIgfHwgeydVc2VyLUFnZW50JzogUENfVUF9fSkgfSwvLyDpu5jorqTnu5/kuIDkvb/nlKhNT0JJTEVfVUFcXFxcclxcXFxuXFxcXHTmkJzntKLmoYbmnrYocGFnZSkge1xcXFxyXFxcXG5cXFxcdFxcXFx0aWYgKHBhZ2UgPT0gJzEnKSB7XFxcXG4vKlxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRkLnB1c2goe1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdHRpdGxlOiBcXFxcXFxcIuaQnOe0ouacrOinhOWImVxcXFxcXFwiLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdHVybDogXFxcXFxcXCInaGlrZXI6Ly9zZWFyY2g/cnVsZT1cXFxcXFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFxcXFxcIiZzPScraW5wdXRcXFxcXFxcIixcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRkZXNjOiBcXFxcXFxcIiBcXFxcXFxcIixcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdH0pO1xcXFxuKi9cXFxcclxcXFxuXFxcXHRcXFxcdH1cXFxcclxcXFxuXFxcXHR9LFxcXFxyXFxcXG5cXFxcdOiOt+WPlumTvuaOpShwYWdlLCByZWdleCkge1xcXFxyXFxcXG5cXFxcdFxcXFx0bGV0IHRydWVfdXJsID0gZ2V0TXlWYXIoJ2hlYWRlci51cmwnLCBNWV9VUkwpO1xcXFxyXFxcXG5cXFxcdFxcXFx0Ly9sZXQg6ZO+5o6l5aSE55CG5bel5YW3ID0gcmVxdWlyZUNhY2hlKGNvbmZpZy7pk77mjqXlpITnkIblt6Xlhbfkvp3otZYpXFxcXHJcXFxcblxcXFx0XFxcXHQvL2xldCDpk77mjqXlpITnkIblt6XlhbcgPSByZXF1aXJlQ2FjaGUoJ2h0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTI4NDknKVxcXFxyXFxcXG5cXFxcdFxcXFx0Ly9sZXQg6ZO+5o6l5aSE55CG5bel5YW3ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvdXJsLXByb2Nlc3NvcicpXFxcXHJcXFxcblxcXFx0XFxcXHRsZXQg6ZO+5o6l5aSE55CG5bel5YW3ID0gcmVxdWlyZUNhY2hlKCdodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD0yODQ5JylcXFxcclxcXFxuXFxcXHRcXFxcdHRydWVfdXJsID0g6ZO+5o6l5aSE55CG5bel5YW3XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdC7pk77mjqUodHJ1ZV91cmwpXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdC7pobXnoIEocGFnZSlcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0LuaPkuWFpeaWsOWkhOeQhuinhOWImShyZWdleCB8fCBbXSlcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0LuiOt+WPluWkhOeQhue7k+aenCgpO1xcXFxyXFxcXG5cXFxcdFxcXFx0cmV0dXJuIHRydWVfdXJsO1xcXFxyXFxcXG5cXFxcdH0sXFxcXHJcXFxcblxcXFx05omT6YCg5YiG57G7KHJ1bGVMaXN0KSB7XFxcXHJcXFxcblxcXFx0XFxcXHQvLyAgbGV0IGh0bWxDYXRlZ29yaWVzID0gcmVxdWlyZUNhY2hlKGNvbmZpZy7liqjmgIHliIbnsbvkvp3otZYpXFxcXHJcXFxcblxcXFx0XFxcXHQvL2xldCBodG1sQ2F0ZWdvcmllcyA9IHJlcXVpcmVDYWNoZSgnaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9MjcwNScpXFxcXHJcXFxcblxcXFx0XFxcXHRpZiAoIXJ1bGVMaXN0KSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdGxldCDliIbnsbvlrprkvY0gPSBbe1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx05LiA57qn5YiG57G7OiDkuIDnuqflrprkvY1BLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx05a2Q5YiG57G7OiDnu5/kuIDlrprkvY1CIHx8IOS4gOe6p+WumuS9jUIsXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHTliIbnsbvpk77mjqU6IHvkuozmrKHlpITnkIYodXJsKSB7dHJ5IHtyZXR1cm4g5LiA57qn5aSE55CGQyh1cmwpfSBjYXRjaCAoZSkge3JldHVybiB1cmx9fX1cXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0fV1cXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0aWYgKOS6jOe6p+WumuS9jUEgJiYgKOe7n+S4gOWumuS9jUIgfHwg5LqM57qn5a6a5L2NQikpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHTliIbnsbvlrprkvY0ucHVzaCh7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdOS4gOe6p+WIhuexuzog5LqM57qn5a6a5L2NQSxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx05a2Q5YiG57G7OiDnu5/kuIDlrprkvY1CIHx8IOS6jOe6p+WumuS9jUIsXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdOWIhuexu+mTvuaOpToge+S6jOasoeWkhOeQhih1cmwpIHt0cnkge3JldHVybiDkuoznuqflpITnkIZDKHVybCl9IGNhdGNoIChlKSB7cmV0dXJuIHVybH19fVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdH0pXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdH1cXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0aWYgKOS4iee6p+WumuS9jUEgJiYgKOe7n+S4gOWumuS9jUIgfHwg5LiJ57qn5a6a5L2NQikpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHTliIbnsbvlrprkvY0ucHVzaCh7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdOS4gOe6p+WIhuexuzog5LiJ57qn5a6a5L2NQSxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx05a2Q5YiG57G7OiDnu5/kuIDlrprkvY1CIHx8IOS4iee6p+WumuS9jUIsXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdOWIhuexu+mTvuaOpToge+S6jOasoeWkhOeQhih1cmwpIHt0cnkge3JldHVybiDkuInnuqflpITnkIZDKHVybCl9IGNhdGNoIChlKSB7cmV0dXJuIHVybH19fVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdH0pXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdH1cXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0aWYgKOWbm+e6p+WumuS9jUEgJiYgKOe7n+S4gOWumuS9jUIgfHwg5Zub57qn5a6a5L2NQikpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHTliIbnsbvlrprkvY0ucHVzaCh7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdOS4gOe6p+WIhuexuzog5Zub57qn5a6a5L2NQSxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx05a2Q5YiG57G7OiDnu5/kuIDlrprkvY1CIHx8IOWbm+e6p+WumuS9jUIsXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdOWIhuexu+mTvuaOpToge+S6jOasoeWkhOeQhih1cmwpIHt0cnkge3JldHVybiDlm5vnuqflpITnkIZDKHVybCl9IGNhdGNoIChlKSB7cmV0dXJuIHVybH19fVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdH0pXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdH1cXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0cnVsZUxpc3QgPSDliIbnsbvlrprkvY07XFxcXHJcXFxcblxcXFx0XFxcXHR9XFxcXHJcXFxcblxcXFx0XFxcXHQvLyAnMCcg5Li66buY6K6k5LiN5oqY5Y+g77yMJzEnIOS4uum7mOiupOaKmOWPoFxcXFxyXFxcXG5cXFxcdFxcXFx0Y29uc3Qg5b2T5YmN5oqY5Y+g54q25oCBID0gZ2V0TXlWYXIoJ2hlYWRlci5mb2xkJywgJzAnKVxcXFxyXFxcXG5cXFxcdFxcXFx0Ly8g5byV5YWl5Yqo5oCB5YiG57G75L6d6LWWXFxcXHJcXFxcblxcXFx0XFxcXHRsZXQgaHRtbENhdGVnb3JpZXMgPSByZXF1aXJlQ2FjaGUoJ2h0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTI3MDUnKVxcXFxyXFxcXG5cXFxcdFxcXFx0dmFyIGdldFJhbmdlQ29sb3JzID0gZnVuY3Rpb24oKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdHJldHVybiAnIycgKyAoJzAwMDAwJyArIChNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwIDw8IDApLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC02KTtcXFxcclxcXFxuXFxcXHRcXFxcdH0gLy8g6ZqP5py66YCJ5Lit55qE5YiG57G76aKc6ImyXFxcXHJcXFxcblxcXFx0XFxcXHR2YXIgY29sb3VyO1xcXFxyXFxcXG5cXFxcdFxcXFx0aWYgKOWIhuexu+minOiJsiAhPT0gJycpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Y29sb3VyID0g5YiG57G76aKc6ImyXFxcXHJcXFxcblxcXFx0XFxcXHR9IGVsc2Uge1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRjb2xvdXIgPSBnZXRSYW5nZUNvbG9ycygpXFxcXHJcXFxcblxcXFx0XFxcXHR9XFxcXHJcXFxcblxcXFx0XFxcXHRodG1sQ2F0ZWdvcmllcy7nlYzpnaIoZClcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Ly8u5YiG57G76ZO+5o6lKHRydWVfdXJsKVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHQu5rqQ56CBKGh0bWwpXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdC7pobXnoIEocGFnZSlcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Lua3u+WKoOWIhuexu+WumuS9jShydWxlTGlzdClcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0LuW8gOWQr+WGhee9ruaKmOWPoOWKn+iDvSgpIC8vIOW/hemhu1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHQu5oqY5Y+gKOW9k+WJjeaKmOWPoOeKtuaAgSkgLy8g5b+F6aG7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdC7mipjlj6DmjInpkq7moLflvI8oe1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdHRpdGxlOiDlvZPliY3mipjlj6DnirbmgIEgPT0gXFxcXFxcXCIxXFxcXFxcXCIgPyBcXFxcXFxcIuKAnOKAnOKAneKAnTxiaWc+PGI+PGZvbnQgY29sb3I9JyM1OTU5QUInPlxcXFxcXFwiICsg5Yqo5oCB57yp5bCPICsgXFxcXFxcXCI8L2ZvbnQ+PC9iPjwvYmlnPlxcXFxcXFwiIDogXFxcXFxcXCLigJzigJzigJ3igJ08YmlnPjxiPjxmb250IGNvbG9yPScjRjc1RDU5Jz5cXFxcXFxcIiArIOWKqOaAgeaJqeWxlSArIFxcXFxcXFwiPC9mb250PjwvYj48L2JpZz5cXFxcXFxcIlxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHR9KSAvLyDlj6/pgIlcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Ly8gLuesrOWHoOihjOW8gOWni+aKmOWPoCgyKSAvLyDlj6/pgIlcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Ly8gLuaKmOWPoOaMiemSruagt+W8jyh7IOaKmOWPoOaMiemSruaPkuWFpeihjDogMiB9KSAgLy8g5Y+v6YCJ77yM5L2G5b+F6aG75YWI6LCD55SoIC7nrKzlh6DooYzlvIDlp4vmipjlj6AoaW5kZXgp77yM54S25ZCO5YaN5Lyg5YWlIHsg5oqY5Y+g5oyJ6ZKu5o+S5YWl6KGMOiBpbmRleCB9XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdC7pgInkuK3nmoTliIbnsbvpopzoibIoY29sb3VyKVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHQu5byA5aeL5omT6YCg5YiG57G7KCk7XFxcXHJcXFxcblxcXFx0fSxcXFxcclxcXFxuXFxcXHJcXFxcblxcXFx055Sf5oiQ54mH5Y2VKGQsaHRtbCkge1xcXFxyXFxcXG5cXFxcclxcXFxuXFxcXHRcXFxcdHZhciDliJfooahcXFxcclxcXFxuXFxcXHRcXFxcdHZhciDmoIfpophcXFxcclxcXFxuXFxcXHRcXFxcdHZhciDmj4/ov7BcXFxcclxcXFxuXFxcXHRcXFxcdHZhciDlm77niYdcXFxcclxcXFxuXFxcXHRcXFxcdHZhciDpk77mjqVcXFxcclxcXFxuXFxcXHJcXFxcblxcXFx0XFxcXHRpZiAo5qGG5p6257G75Z6LID09PSAnbXl1aS12b2RsaXN0Jykge1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTliJfooaggPSAnLm15dWktdm9kbGlzdCYmbGknO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmoIfpopggPSAnaDQmJlRleHQnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmj4/ov7AgPSAnLnBpYy10YWd8fC5waWMtdGV4dCYmVGV4dCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWbvueJhyA9ICcubGF6eWxvYWQmJmRhdGEtb3JpZ2luYWwnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTpk77mjqUgPSAnYSYmaHJlZic7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdC8vbG9nKCfmoYbmnrbnsbvlnovCt215dWktdm9kbGlzdCcpXFxcXHJcXFxcblxcXFx0XFxcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJyNkYXRhX2xpc3QnKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWIl+ihqCA9ICcjZGF0YV9saXN0JiZsaSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOagh+mimCA9ICdhJiZ0aXRsZSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOaPj+i/sCA9ICdlbSYmVGV4dCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWbvueJhyA9ICdpbWcmJmRhdGEtc3JjbCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOmTvuaOpSA9ICdhJiZocmVmJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Ly9sb2coJ+ahhuaetuexu+Wei8K3ZGF0YV9saXN0JylcXFxcclxcXFxuXFxcXHRcXFxcdH0gZWxzZSBpZiAo5qGG5p6257G75Z6LID09PSAnZmVkLWxpc3QtdGl0bGUnKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWIl+ihqCA9ICcuZmVkLWxpc3QtaW5mbyYmbGknO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmoIfpopggPSAnLmZlZC1saXN0LXRpdGxlJiZUZXh0JztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05o+P6L+wID0gJy5mZWQtdGV4dC1jZW50ZXImJlRleHQnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTlm77niYcgPSAnYSYmZGF0YS1vcmlnaW5hbCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOmTvuaOpSA9ICdhJiZocmVmJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Ly9sb2coJ+ahhuaetuexu+Wei8K3LmZlZC1saXN0LWluZm8nKVxcXFxyXFxcXG5cXFxcdFxcXFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICdpdGVtJykge1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTliJfooaggPSAnYm9keSYmLml0ZW0nO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmoIfpopggPSAnaW1nJiZhbHQnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmj4/ov7AgPSAncCYmVGV4dCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWbvueJhyA9ICdpbWcmJnNyY2wnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTpk77mjqUgPSAnYSYmaHJlZic7XFxcXHJcXFxcblxcXFx0XFxcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJ21vZHVsZS1pdGVtcycpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05YiX6KGoID0gJy5tb2R1bGUtaXRlbXMmJi5tb2R1bGUtaXRlbSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOagh+mimCA9ICdhJiZ0aXRsZSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOaPj+i/sCA9ICcubW9kdWxlLWl0ZW0tdGV4dCYmVGV4dCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWbvueJhyA9ICdpbWd8fC5sYXp5JiZkYXRhLXNyYyc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOmTvuaOpSA9ICdhJiZocmVmJztcXFxcclxcXFxuXFxcXHRcXFxcdH0gZWxzZSBpZiAo5qGG5p6257G75Z6LID09PSAncGFjay15a3BhY2snKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWIl+ihqCA9ICdib2R5JiYucGFjay15a3BhY2snO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmoIfpopggPSAnYSYmdGl0bGUnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmj4/ov7AgPSAnc3BhbiwtMSYmVGV4dCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWbvueJhyA9ICcuZWNsYXp5JiZkYXRhLW9yaWdpbmFsJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcXFxyXFxcXG5cXFxcdFxcXFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICdzdHVpLXZvZGxpc3QnKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWIl+ihqCA9ICcuc3R1aS12b2RsaXN0JiZsaSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOagh+mimCA9ICdhJiZ0aXRsZSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOaPj+i/sCA9ICcucGljLXRleHQmJlRleHQnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTlm77niYcgPSAnLmxhenlsb2FkfHxhJiZkYXRhLW9yaWdpbmFsJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcXFxyXFxcXG5cXFxcdFxcXFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICd2b2RsaXN0Jykge1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTliJfooaggPSAnLnZvZGxpc3QmJmxpJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05qCH6aKYID0gJ2EmJnRpdGxlJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05o+P6L+wID0gJ2EmJlRleHQnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTlm77niYcgPSAnLmxhenlsb2FkJiZkYXRhLW9yaWdpbmFsJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcXFxyXFxcXG5cXFxcdFxcXFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICfmtYvor5UnKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWIl+ihqCA9ICdib2R5JiZhJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05qCH6aKYID0gJ2JvZHkmJmEnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmj4/ov7AgPSAnYm9keSYmYSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWbvueJhyA9ICdib2R5JiZhJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx06ZO+5o6lID0gJ2JvZHkmJmEnO1xcXFxyXFxcXG5cXFxcdFxcXFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICcnKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWIl+ihqCA9IOahhuaetuWIl+ihqDtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05qCH6aKYID0g5qGG5p625qCH6aKYO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmj4/ov7AgPSDmoYbmnrbmj4/ov7A7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWbvueJhyA9IOahhuaetuWbvueJhztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx06ZO+5o6lID0g5qGG5p626ZO+5o6lO1xcXFxyXFxcXG5cXFxcdFxcXFx0fVxcXFxyXFxcXG5cXFxcdFxcXFx0bGV0IGxpc3QgPSBwZGZhKGh0bWwsIOWIl+ihqCk7XFxcXHJcXFxcblxcXFx0XFxcXHRmb3IgKGxldCBrIGluIGxpc3QpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0ZC5wdXNoKHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHR0aXRsZTogcGRmaChsaXN0W2tdLCDmoIfpopgpLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdGRlc2M6IHBkZmgobGlzdFtrXSwg5o+P6L+wKSxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRpbWc6IHBkKGxpc3Rba10sIOWbvueJhykgKyAnQFJlZmVyZXI9JyxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHR1cmw6IHBkKGxpc3Rba10sIOmTvuaOpSkrXFxcXFxcXCIjaW1tZXJzaXZlVGhlbWUjI2F1dG9DYWNoZSNcXFxcXFxcIixcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0fSk7XFxcXHJcXFxcblxcXFx0XFxcXHR9XFxcXHJcXFxcblxcXFx0XFxcXHRkLnB1c2goe1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRjb2xfdHlwZTogJ2JpZ19iaWdfYmxhbmtfYmxvY2snLFxcXFxyXFxcXG5cXFxcdFxcXFx0fSk7XFxcXHJcXFxcblxcXFx0fVxcXFxyXFxcXG59KVxcXFxyXFxcXG5cXFxcclxcXFxuJC5leHBvcnRzID0gbmV3IOS4gOe6pygpO1xcXFxyXFxcXG4kLmV4cG9ydHNcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlh73mlbDnu4Tku7YqXFxcIixcXFwicGF0aFxcXCI6XFxcInFzXFxcIixcXFwicnVsZVxcXCI6XFxcImZ1bmN0aW9uIOS8mOWMlui3r+e6v+eroOiKguaVsOaNrijlpJrot6/nur/lkKYsIOa6kOaVsOaNriwg6Lev57q/5YiX6KGoLCDot6/nur/lkI0sIOmAiembhuaAu+WIl+ihqCwg6YCJ6ZuG5YiX6KGoLCDpm4blkI0sIOmbhnVybCwg5YmN57yALCDmoIfpopgsIOWbvueJhykge1xcXFxuXFxcXG4gICAgLy/lvZPlpJrot6/nur/lkKYg6YCJ6ZuG5oC75YiX6KGo5Li656m6XFxcXG4gICAgLy/mnIDnu4jov5Tlm54gW3t0aXRsZTogJ+i3r+e6v+WQjScsbGlzdDogW3t0aXRsZTon6YCJ6ZuG5ZCNJyx1cmw6J+mAiembhnVybCcsLi4ufV0sc2pzczon5LiL6L296LWE5paZJ30sLi4uLl1cXFxcbiAgICAvL+mAiembhuWIl+ihqCDnrKzkuIDpobnmmK9jc3PpgInmi6nlmajvvIzkuYvlkI7lj6/ku6XnlKgk5YiG5Ymy5re75Yqg6KaB5Yig6Zmk56ug6IqC5ZCNXFxcXG5cXFxcblxcXFxuICAgIHZhciDnq6DoioJqc29uID0gW107XFxcXG4gICAgdmFyIOWNlei3r+e6v+eroOiKgiA9ICfnq6DoioLliJfooagnXFxcXG5cXFxcbiAgICB2YXIg5YiX6KGo5ZCNID0gW107XFxcXG4gICAgaWYgKCHlpJrot6/nur/lkKYpIHtcXFxcblxcXFxuICAgICAgICDliJfooajlkI0ucHVzaCjljZXot6/nur/nq6DoioIpXFxcXG5cXFxcbiAgICB9IGVsc2Uge1xcXFxuXFxcXG4gICAgICAgIHBkZmEo5rqQ5pWw5o2uLCDot6/nur/liJfooagpLmZvckVhY2goZnVuY3Rpb24oZGF0YSkge1xcXFxuICAgICAgICAgICAg5YiX6KGo5ZCNLnB1c2gocGRmaChkYXRhLCDot6/nur/lkI0pKVxcXFxuICAgICAgICB9KTtcXFxcblxcXFxuICAgIH1cXFxcblxcXFxuICAgIHZhciDpm4bmlbDnu4QgPSBbXTtcXFxcblxcXFxuXFxcXG52YXIg5o6S6Zmk56ug6IqCID0gW107XFxcXG5pZijpgInpm4bliJfooaguaW5jbHVkZXMoJyQnKSl7XFxcXG7mjpLpmaTnq6DoioIgPSDpgInpm4bliJfooaguc3BsaXQoJyQnKVxcXFxu6YCJ6ZuG5YiX6KGoID0g5o6S6Zmk56ug6IqCLnNoaWZ0KClcXFxcbn1cXFxcblxcXFxuICAgIGlmICgh5aSa6Lev57q/5ZCmKSB7XFxcXG4gICAgICAgIOmbhuaVsOe7hC5wdXNoKHBkZmEo5rqQ5pWw5o2uLCDpgInpm4bliJfooagpKVxcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIHBkZmEo5rqQ5pWw5o2uLCDpgInpm4bmgLvliJfooagpLmZvckVhY2goZnVuY3Rpb24oZGF0YSkge1xcXFxuICAgICAgICAgICAg6ZuG5pWw57uELnB1c2gocGRmYShkYXRhLCDpgInpm4bliJfooagpKVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG5cXFxcblxcXFxuICAgIGZvciAobGV0IGkgaW4g6ZuG5pWw57uEKSB7XFxcXG5cXFxcbiAgICAgICAgdmFyIGRvTGlzdCA9IFtdO1xcXFxuXFxcXG7mjpLpmaTnq6DoioIuZm9yRWFjaChmdW5jdGlvbihkYXRhKSB7XFxcXG4gICAgdmFyIOagh+ivhmlkID0g6ZuG5pWw57uEW2ldLmZpbmRJbmRleCjov5Tlm54gPT4g6L+U5ZueLmluZGV4T2YoZGF0YSkgIT0gLTEpO1xcXFxuICAgIGlmICjmoIfor4ZpZCAhPSAtMSkge1xcXFxuICAgICAg6ZuG5pWw57uEW2ldLnNwbGljZSjmoIfor4ZpZCwgMSlcXFxcbiAgICB9O1xcXFxuICB9KTtcXFxcblxcXFxuICAgICAgICBmb3IgKGxldCBpdCBvZiDpm4bmlbDnu4RbaV0pIHtcXFxcbiAgICAgICAgICAgIHZhciBkb0xpc3R1cmwgPSBwZGZoKGl0LCDpm4Z1cmwpXFxcXG4gICAgICAgICAgICBkb0xpc3R1cmwgPSBkb0xpc3R1cmwuaW5jbHVkZXMoXFxcXFxcXCJodHRwXFxcXFxcXCIpID8gZG9MaXN0dXJsIDog5YmN57yAICsgZG9MaXN0dXJsXFxcXG4gICAgICAgICAgICBkb0xpc3QucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHBkZmgoaXQsIOmbhuWQjSksXFxcXG4gICAgICAgICAgICAgICAgdXJsOiBkb0xpc3R1cmxcXFxcbiAgICAgICAgICAgIH0pXFxcXG4gICAgICAgIH1cXFxcblxcXFxuICAgICAgICB2YXIgYm9va05hbWUgPSAh5aSa6Lev57q/5ZCmID8g5qCH6aKYIDog5qCH6aKYICsgJy0nICsg5YiX6KGo5ZCNW2ldXFxcXG5cXFxcbiAgICAgICAg56ug6IqCanNvbi5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiDliJfooajlkI1baV0sXFxcXG4gICAgICAgICAgICBsaXN0OiBkb0xpc3QsXFxcXG4gICAgICAgICAgICBzanNzOiB7XFxcXG4gICAgICAgICAgICAgICAgY2hhcHRlckxpc3Q6IGRvTGlzdCxcXFxcbiAgICAgICAgICAgICAgICBpbmZvOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGJvb2tOYW1lOiBib29rTmFtZSwgLy/mvKvnlLvlkI3np7AsXFxcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVOYW1lOiBNWV9SVUxFLnRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICBib29rVG9wUGljOiDlm77niYcsXFxcXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlQ29kZTog5ryr55S76Kej5p6QLFxcXFxuICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZpZXc6IFxcXFxcXFwiMVxcXFxcXFwiXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pXFxcXG4gICAgfVxcXFxuICAgIHJldHVybiDnq6DoioJqc29uXFxcXG59XFxcXG5cXFxcblxcXFxuZnVuY3Rpb24g5re75Yqg5aS06YOo5YiX6KGoKGQsIOagh+mimCwg5Zu+54mHLCDmj4/ov7AsIOS9nOiAhSwg5pe26Ze0LCDliIbnsbss6aG1VVJMKSB7XFxcXG5cXFxcbiAgICDmoIfpopggPSAh5qCH6aKYID8gJycgOiDmoIfpopggKyAnXFxcXFxcXFxuJ1xcXFxuICAgIOWbvueJhyA9ICHlm77niYcgPyAnJyA6IOWbvueJh1xcXFxuICAgIOaPj+i/sCA9ICHmj4/ov7AgPyAnJyA6IOaPj+i/sC5yZXBsYWNlKFxcXFxcXFwi5pu05paw6Iez77yaXFxcXFxcXCIsICcnKVxcXFxuXFxcXG4gICAg5L2c6ICFID0gIeS9nOiAhSA/ICcnIDogJ1xcXFxcXFxcbicgKyDkvZzogIVcXFxcbiAgICDml7bpl7QgPSAh5pe26Ze0ID8gJycgOiAnXFxcXFxcXFxuJyArIOaXtumXtFxcXFxuICAgIOWIhuexuyA9ICHliIbnsbsgPyAnJyA6ICdcXFxcXFxcXG4nICsg5YiG57G7XFxcXG5cXFxcblxcXFxuICAgIHZhciDlpLTpg6h0aXRsZSA9IFsn4oCY4oCY4oCZ4oCZPGI+JywnPC9iPiA8c21hbGw+PGZvbnQgY29sb3I9I0ZBNzI5OD4nLCc8L2ZvbnQ+JywnPC9zbWFsbD4nXVxcXFxuICAgIHZhciDlpLTpg6hkZXNjID0gWyfigJjigJjigJnigJk8Zm9udCBjb2xvcj0jZjhlY2M5PicsJzwvZm9udD4nXVxcXFxuXFxcXG5cXFxcblxcXFxuICAgIOWktOmDqHRpdGxlID0g5aS06YOodGl0bGVbMF0r5qCH6aKYK+WktOmDqHRpdGxlWzFdK+aPj+i/sCvlpLTpg6h0aXRsZVsyXSvkvZzogIUr5aS06YOodGl0bGVbM11cXFxcblxcXFxuICAgIOWktOmDqGRlc2MgPSDlpLTpg6hkZXNjWzBdK+aXtumXtCvliIbnsbsr5aS06YOoZGVzY1sxXVxcXFxuXFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IOWktOmDqHRpdGxlLFxcXFxuICAgICAgICBkZXNjOiDlpLTpg6hkZXNjLFxcXFxuICAgICAgICBwaWNfdXJsOiDlm77niYcsXFxcXG4gICAgICAgIHVybDog6aG1VVJMICsgXFxcXFxcXCIjbm9IaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ21vdmllXzFfdmVydGljYWxfcGljX2JsdXInXFxcXG4gICAgfSk7XFxcXG5cXFxcbn1cXFxcblxcXFxuXFxcXG5mdW5jdGlvbiDmt7vliqDnroDku4soZCwg5pWw5o2u5rqQLCDpobVVUkwsIOWbvueJhykge1xcXFxuICAgIC8v6I635Y+W5pWw5o2uXFxcXG4gICAgdmFyIOeugOS7i+WGheWuuSA9IOaVsOaNrua6kFxcXFxuICAgIOeugOS7i+WGheWuuSA9IOeugOS7i+WGheWuuS5yZXBsYWNlKFxcXFxcXFwi566A5LuL77yaXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpLnJlcGxhY2UoXFxcXFxcXCLku4vnu406XFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpLnJlcGxhY2UoXFxcXFxcXCLmvKvnlLtcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikucmVwbGFjZShcXFxcXFxcIuKApuKAplxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKS5yZXBsYWNlKFxcXFxcXFwi566A5LuLXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpXFxcXG5cXFxcbiAgICB2YXIg566A5LuL5YaF5a655pS2O1xcXFxuICAgIGlmICjnroDku4vlhoXlrrkubGVuZ3RoID4gNDUpIHtcXFxcbiAgICAgICAg566A5LuL5YaF5a655pS2ID0g566A5LuL5YaF5a65LnN1YnN0cigwLCA0NSkgKyAnLi4uJ1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIOeugOS7i+WGheWuueaUtiA9IOeugOS7i+WGheWuuSArICcuLi4nXFxcXG4gICAgfVxcXFxuXFxcXG4gICAgLy/lm77moIfojrflj5ZcXFxcbiAgICBpZiAoIeWbvueJhykge1xcXFxuICAgICAgICDlm77niYcgPSAnaHR0cHM6Ly9sYW5tZWlndW9qaWFuZy5jb20vdHViaWFvL3EvMTA3LnBuZydcXFxcbiAgICB9XFxcXG5cXFxcbiAgICAvL+mhtVVSTCDojrflj5ZcXFxcbiAgICBpZiAoIemhtVVSTCkge1xcXFxuICAgICAgICDpobVVUkwgPSBNWV9SVUxFLnRpdGxlXFxcXG4gICAgfVxcXFxuXFxcXG4gICAgLy/moIfpopjkuI7nroDku4vmoLflvI9cXFxcbiAgICB2YXIgbXp0ZXh0ID0gXFxcXFxcXCImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8c21hbGw+566A5LuLPC9zbWFsbD48YnI+XFxcXFxcXCJcXFxcbiAgICB2YXIgYnR0aXRsZSA9ICc8Zm9udCBjb2xvcj1cXFxcXFxcIiMwOThBQzFcXFxcXFxcIj7mvKvnlLvnroDku4sgIDwvZm9udD48c21hbGw+PHNtYWxsPjxmb250IGNvbG9yPVxcXFxcXFwiI2Y0Nzk4M1xcXFxcXFwiPueugOS7i+aUtj48L2ZvbnQ+PC9zbWFsbD48L3NtYWxsPidcXFxcblxcXFxuICAgIC8v5bGV5byA5LiO5pS257yp5pON5L2cXFxcXG4gICAgdmFyIGpqID0gZ2V0VmFyKOmhtVVSTCArIFxcXFxcXFwi566A5LuL5pS2XFxcXFxcXCIsIFxcXFxcXFwi5bey5pS26LW3XFxcXFxcXCIpO1xcXFxuICAgIHZhciBqanVybCA9ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgo566A5LuL5YaF5a65LCDnroDku4vlhoXlrrnmlLYsIOaUtiwg5pS25YaF5a65LCDlvZPliY1VUkwpID0+IHtcXFxcbiAgICAgICAgdmFyIGpzYmwgPSDlvZPliY1VUkwgKyBcXFxcXFxcIueugOS7i+aUtlxcXFxcXFwiO1xcXFxuICAgICAgICB2YXIgamogPSBnZXRWYXIo5b2T5YmNVVJMICsgXFxcXFxcXCLnroDku4vmlLZcXFxcXFxcIiwgXFxcXFxcXCLlt7LmlLbotbdcXFxcXFxcIik7XFxcXG4gICAgICAgIGpqID0gamogPT0gXFxcXFxcXCLlt7LmlLbotbdcXFxcXFxcIiA/IFxcXFxcXFwi5bGV5byAXFxcXFxcXCIgOiBcXFxcXFxcIuW3suaUtui1t1xcXFxcXFwiO1xcXFxuICAgICAgICBwdXRWYXIoanNibCwgamopXFxcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBpZDog5b2T5YmNVVJMICsgXFxcXFxcXCJfYnRcXFxcXFxcIlxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIHRpdGxlOiDmlLYucmVwbGFjZShcXFxcXFxcIueugOS7i+aUtlxcXFxcXFwiLCBqailcXFxcbiAgICAgICAgfSlcXFxcblxcXFxuICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgaWQ6IOW9k+WJjVVSTCArIFxcXFxcXFwiX216XFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICB0aXRsZTogamogPT0gXFxcXFxcXCLlt7LmlLbotbdcXFxcXFxcIiA/IOaUtuWGheWuuS5yZXBsYWNlKFxcXFxcXFwi566A5LuLXFxcXFxcXCIsIOeugOS7i+WGheWuueaUtikgOiDmlLblhoXlrrkucmVwbGFjZShcXFxcXFxcIueugOS7i1xcXFxcXFwiLCDnroDku4vlhoXlrrkpXFxcXG4gICAgICAgIH0pXFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgIH0sIOeugOS7i+WGheWuuSwg566A5LuL5YaF5a655pS2LCBidHRpdGxlLCBtenRleHQsIOmhtVVSTClcXFxcblxcXFxuXFxcXG4gICAgLy/moIfpophcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogYnR0aXRsZS5yZXBsYWNlKFxcXFxcXFwi566A5LuL5pS2XFxcXFxcXCIsIGpqKSxcXFxcbiAgICAgICAgdXJsOiBqanVybCxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYXZhdGFyXFxcXFxcXCIsXFxcXG4gICAgICAgIHBpY191cmw6IOWbvueJhyxcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGlkOiDpobVVUkwgKyBcXFxcXFxcIl9idFxcXFxcXFwiXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcblxcXFxuICAgIC8v566A5LuLXFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGpqID09IFxcXFxcXFwi5bey5pS26LW3XFxcXFxcXCIgPyBtenRleHQucmVwbGFjZShcXFxcXFxcIueugOS7i1xcXFxcXFwiLCDnroDku4vlhoXlrrnmlLYpIDogbXp0ZXh0LnJlcGxhY2UoXFxcXFxcXCLnroDku4tcXFxcXFxcIiwg566A5LuL5YaF5a65KSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBpZDog6aG1VVJMICsgXFxcXFxcXCJfbXpcXFxcXFxcIlxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG5cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24g5re75Yqg5YiX6KGo56ug6IqCKGQsIOagh+mimOaVsOaNriwg5YiX6KGo5pWw5o2uLCDop6PmnpDku6PnoIEsIOmhtVVSTCwg5Zu+54mHKSB7XFxcXG5cXFxcblxcXFxuICAgIC8vZOS4juWklueVjGTvvIzkuLrlkIzlhoXlrZjlnLDlnYDvvIzkuI3nlKjov5Tlm55cXFxcbiAgICAvL+agh+mimOaVsOaNriAg5Y2z5qCH6aKY5ZCN5a2XXFxcXG4gICAgLy/liJfooajmlbDmja7lv4XpobvmmK9KU09OICDmoLzlvI/mmK9be3RpdGxlOicnLHVybDonJyx9LC4uLi4uXSAg5LiUdXJs5b+F6aG75pyJ5YmN57yAXFxcXG5cXFxcbiAgICAvL+Wbvuagh+iOt+WPllxcXFxuICAgIGlmICgh5Zu+54mHKSB7XFxcXG4gICAgICAgIOWbvueJhyA9ICdodHRwczovL2xhbm1laWd1b2ppYW5nLmNvbS90dWJpYW8vcS8xOC5wbmcnXFxcXG4gICAgfVxcXFxuXFxcXG4gICAgLy/pobVVUkwg6I635Y+WXFxcXG4gICAgaWYgKCHpobVVUkwpIHtcXFxcbiAgICAgICAg6aG1VVJMID0gTVlfUlVMRS50aXRsZVxcXFxuICAgIH1cXFxcblxcXFxuICAgIC8v5qCH6aKY5ZCNXFxcXG4gICAgdmFyIOagh+mimOWQjSA9ICc8Yj7ot6/nur88L2I+ICA8c21hbGw+PHNtYWxsPjxmb250IGNvbG9yPSNmOTkwNmY+5o6S5bqPID48L2ZvbnQ+PC9zbWFsbD48L3NtYWxsPidcXFxcblxcXFxuXFxcXG4gICAgdmFyIOaOkuW6jyA9IGdldFZhcijpobVVUkwgKyBcXFxcXFxcIueroOiKguaOkuW6j1xcXFxcXFwiLCBcXFxcXFxcIuato+W6j1xcXFxcXFwiKTtcXFxcbiAgICB2YXIg5o+Q56S6ID0g5o6S5bqPID09ICflgJLluo8nID8gJ+ato+W6jycgOiAn5YCS5bqPJztcXFxcblxcXFxuICAgIHZhciDmjpLluo91cmwgPSAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKOagh+mimOWQjSwg5qCH6aKY5pWw5o2uLCDliJfooajmlbDmja4sIOino+aekOS7o+eggSwg6aG1VVJMKSA9PiB7XFxcXG4gICAgICAgIHZhciDmjpLluo8gPSBnZXRWYXIo6aG1VVJMICsgXFxcXFxcXCLnq6DoioLmjpLluo9cXFxcXFxcIiwgXFxcXFxcXCLmraPluo9cXFxcXFxcIik7XFxcXG4gICAgICAgIHZhciDmj5DnpLogPSDmjpLluo8gPT0gJ+WAkuW6jycgPyAn5q2j5bqPJyA6ICflgJLluo8nO1xcXFxuICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgaWQ6IOmhtVVSTCArIFxcXFxcXFwiX+aOkuW6j1xcXFxcXFwiXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgdGl0bGU6IOagh+mimOWQjS5yZXBsYWNlKCfot6/nur8nLCDmoIfpopjmlbDmja4pLnJlcGxhY2UoJ+aOkuW6jycsIOaPkOekuilcXFxcbiAgICAgICAgfSlcXFxcblxcXFxuXFxcXG4gICAgICAgIGlmICjmj5DnpLogPT0gJ+WAkuW6jycpIHtcXFxcbiAgICAgICAgICAgIOWIl+ihqOaVsOaNri5yZXZlcnNlKClcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICDliJfooajmlbDmja4uZm9yRWFjaChmdW5jdGlvbihkYXRhLCBzc2lkKSB7XFxcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogZGF0YS50aXRsZSxcXFxcbiAgICAgICAgICAgICAgICB1cmw6IGRhdGEudXJsICsg6Kej5p6Q5Luj56CBLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiDpobVVUkwgKyBcXFxcXFxcIl/pgInpm4ZcXFxcXFxcIiArIHNzaWRcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSk7XFxcXG5cXFxcblxcXFxuICAgICAgICBwdXRWYXIo6aG1VVJMICsgXFxcXFxcXCLnq6DoioLmjpLluo9cXFxcXFxcIiwg5o+Q56S6KVxcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICB9LCDmoIfpopjlkI0sIOagh+mimOaVsOaNriwg5YiX6KGo5pWw5o2uLCDop6PmnpDku6PnoIEsIOmhtVVSTClcXFxcblxcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiDmoIfpopjlkI0ucmVwbGFjZSgn6Lev57q/Jywg5qCH6aKY5pWw5o2uKS5yZXBsYWNlKCfmjpLluo8nLCDmjpLluo8pLFxcXFxuICAgICAgICBwaWNfdXJsOiDlm77niYcsXFxcXG4gICAgICAgIHVybDog5o6S5bqPdXJsLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJhdmF0YXJcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGlkOiDpobVVUkwgKyBcXFxcXFxcIl/mjpLluo9cXFxcXFxcIlxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG5cXFxcbiAgICBpZiAo5o6S5bqPID09ICflgJLluo8nKSB7XFxcXG4gICAgICAgIOWIl+ihqOaVsOaNri5yZXZlcnNlKClcXFxcbiAgICB9XFxcXG5cXFxcbiAgICDliJfooajmlbDmja4uZm9yRWFjaChmdW5jdGlvbihkYXRhLCBpZCkge1xcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IGRhdGEudGl0bGUsXFxcXG4gICAgICAgICAgICB1cmw6IGRhdGEudXJsICsg6Kej5p6Q5Luj56CBLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGlkOiDpobVVUkwgKyBcXFxcXFxcIl/pgInpm4ZcXFxcXFxcIiArIGlkXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH0pO1xcXFxuXFxcXG59XFxcXG5cXFxcbi8qXFxcXG5mdW5jdGlvbiDmt7vliqDpmLLmraLnvZHpobUo6aG5dXJsLCBVQSkge1xcXFxuXFxcXG4gICAgLy/kuIrnuqfot7PovazliLDlvZPliY3pobXnmoTpk77mjqXlv4XpobvmmK9oaWtlcjovL2VtcHR577yb5LiN54S25LiA5Yi35paw6L+Y5piv5Lya6YeN5aSN5Yqg6L29XFxcXG4gICAgLy9VQSAnJ+aIlmZhbHNl5oiWJ+aJi+acuicg6buY6K6k5piv5omL5py656uvIDsg55S16ISRICdQQydcXFxcblxcXFxuICAgIHZhciDliLfmlrDph43lpI0gPSBNWV9SVUxFLnRpdGxlICsgXFxcXFxcXCLnvZHpobXmupDnoIFcXFxcXFxcIlxcXFxuICAgIHZhciBwY+mTvuaOpSA9IOmhuXVybC5yZXBsYWNlKFxcXFxcXFwibS5cXFxcXFxcIiwgXFxcXFxcXCJ3d3cuXFxcXFxcXCIpXFxcXG4gICAgdmFyIOaJi+acuumTvuaOpSA9IOmhuXVybC5yZXBsYWNlKFxcXFxcXFwid3d3LlxcXFxcXFwiLCBcXFxcXFxcIm0uXFxcXFxcXCIpXFxcXG5cXFxcbiAgICB2YXIgY29kZTtcXFxcbiAgICBpZiAoZ2V0VmFyKOWIt+aWsOmHjeWkjSwgXFxcXFxcXCJmYWxzZVxcXFxcXFwiKSA9PSBcXFxcXFxcImZhbHNlXFxcXFxcXCIpIHtcXFxcblxcXFxuICAgICAgICBjb2RlID0gVUEgPT0gJ1BDJyA/IGZldGNoKHBj6ZO+5o6lKSA6IHJlcXVlc3Qo5omL5py66ZO+5o6lKTtcXFxcbiAgICAgICAgcHV0VmFyKOWIt+aWsOmHjeWkjSwgZ2V0UGFyYW0oJ3VybCcpICsgXFxcXFxcXCLvv6Um77+lXFxcXFxcXCIgKyBjb2RlKVxcXFxuXFxcXG4gICAgfSBlbHNlIHtcXFxcblxcXFxuICAgICAgICB2YXIgcG0gPSBnZXRWYXIo5Yi35paw6YeN5aSNKS5zcGxpdChcXFxcXFxcIu+/pSbvv6VcXFxcXFxcIilcXFxcbiAgICAgICAgaWYgKHBtWzBdID09IGdldFBhcmFtKCd1cmwnKSkge1xcXFxuICAgICAgICAgICAgY29kZSA9IHBtWzFdXFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBjb2RlID0gVUEgPT0gJ1BDJyA/IGZldGNoKHBj6ZO+5o6lKSA6IHJlcXVlc3Qo5omL5py66ZO+5o6lKTtcXFxcbiAgICAgICAgICAgIHB1dFZhcijliLfmlrDph43lpI0sIGdldFBhcmFtKCd1cmwnKSArIFxcXFxcXFwi77+lJu+/pVxcXFxcXFwiICsgY29kZSlcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gY29kZVxcXFxufVxcXFxuKi9cXFxcblxcXFxuZnVuY3Rpb24g5re75Yqg6YCJ5oup6Lev57q/KGQsIOi3r+e6v+aVsOaNriwg6aG1VVJMLCDlpJrot6/nur/lkKYpIHtcXFxcblxcXFxuICAgIC8v6Lev57q/5pWw5o2uIOagvOW8j1t7dGl0bGU6J+i3r+e6v+WQjSd9LC4uLi5dXFxcXG4gICAgLy/lpJrot6/nur/lkKYgIGZhbHNlIOWImeS4jeWQr+eUqOmAieaLqei3r+e6v++8m3RydWUg5YiZ5ZCv55SoXFxcXG5cXFxcbiAgICB2YXIg6YCJ5oup5YiX6KGoID0gZ2V0SXRlbSjpobVVUkwgKyBcXFxcXFxcIumAieaLqeWIl+ihqFxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIilcXFxcblxcXFxuICAgIGlmICjlpJrot6/nur/lkKYpIHtcXFxcblxcXFxuICAgICAgICB2YXIg6Lev57q/6YCJ5LitID0gJ+KAmOKAmOKAmeKAmTxmb250IGNvbG9yPSMwOThBQzE+6YCJ5LitPC9mb250PidcXFxcblxcXFxuXFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJ+KAmOKAmOKAmeKAmfCfk5Y8Zm9udCBjb2xvcj1cXFxcXFxcIiNGQTcyOThcXFxcXFxcIj4g5Zu+5rqQ5YiX6KGoPC9mb250PiDvvJonLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcInRvYXN0Oi8v54K55oiR5bmy5ZWl5ZGiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ2ZsZXhfYnV0dG9uJ1xcXFxuICAgICAgICB9KTtcXFxcblxcXFxuXFxcXG4gICAgICAgIOi3r+e6v+aVsOaNri5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEsIGlkKSB7XFxcXG5cXFxcbiAgICAgICAgICAgIHZhciBqanVybCA9ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgo6aG1VVJMLGlkKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgc2V0SXRlbSjpobVVUkwgKyAn6YCJ5oup5YiX6KGoJyxpZCsnJyk7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0s6aG1VVJMLGlkKTtcXFxcblxcXFxuICAgICAgICAgICAgdmFyIOagh+mimOWQjSA9IGlkID09IOmAieaLqeWIl+ihqCA/IOi3r+e6v+mAieS4rS5yZXBsYWNlKCfpgInkuK0nLCBkYXRhLnRpdGxlKSA6IGRhdGEudGl0bGU7XFxcXG4gICAgICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiDmoIfpopjlkI0sXFxcXG4gICAgICAgICAgICAgICAgdXJsOiBqanVybCxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ2ZsZXhfYnV0dG9uJyxcXFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZDog6aG1VVJMICsgXFxcXFxcXCJf6Lev57q/XFxcXFxcXCIgKyBpZFxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9KTtcXFxcblxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4g6YCJ5oup5YiX6KGoXFxcXG59XFxcXG5cXFxcblxcXFxuZnVuY3Rpb24g5re75Yqg6YCJ5oup5LiL6L29KGQsIOi3r+e6v+aVsOaNriwg5aSa6Lev57q/5ZCmKSB7XFxcXG5cXFxcbiAgICAvL+i3r+e6v+aVsOaNriDmoLzlvI9be3RpdGxlOifot6/nur/lkI0nLHNqc3M6J+S4i+i9vei1hOaWmeS/oeaBryd9LC4uLi5dXFxcXG4gICAgLy/lpJrot6/nur/lkKYgIGZhbHNlIOWImeWPquacieKRoOS4quS4i+i9vSDmoIfpopjkuLog54K55Ye75LiL6L2977ybdHJ1ZSDliJnlpJrkuKrkuIvovb1cXFxcblxcXFxuaWYo5aSa6Lev57q/5ZCmKXtcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6ICfigJjigJjigJnigJnwn5OlPGZvbnQgY29sb3I9XFxcXFxcXCIjZjQ3OTgzXFxcXFxcXCI+IOS4i+i9vTwvZm9udD4g77yaJyxcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcInRvYXN0Oi8v54K55oiR5bmy5ZWl5ZGiXFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXFxcbiAgICB9KTtcXFxcblxcXFxufVxcXFxuXFxcXG4gICAg6Lev57q/5pWw5o2uLmZvckVhY2goZnVuY3Rpb24oZGF0YSwgaWQpIHtcXFxcblxcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IGRhdGEudGl0bGUuaW5jbHVkZXMoJ+eroOiKguWIl+ihqCcpID8gJ+eCueWHu+S4i+i9vScgOiBkYXRhLnRpdGxlLFxcXFxuICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9wYWdlL2Rvd25sb2FkLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub1JlZnJlc2gjI25vSGlzdG9yeSM/cnVsZT3mnKzlnLDotYTmupDnrqHnkIYnLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXFxcbiAgICAgICAgICAgIGV4dHJhOiBkYXRhLnNqc3NcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfSk7XFxcXG5cXFxcbiAgICBpZiAo5aSa6Lev57q/5ZCmKSB7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxuXFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiQ1NT6YCJ5oup5Zmo5qih54mIKlxcXCIsXFxcInBhdGhcXFwiOlxcXCJlandiLmpzXFxcIixcXFwicnVsZVxcXCI6XFxcImZ1bmN0aW9uIOS4gOe6pyjliJfooagsIOagh+mimCwg5Zu+54mHLCDpm4bmlbAsIOmTvuaOpSwg6K6/6Zeu5aS0KSB7XFxcXG4gICAg6K6/6Zeu5aS0ID0gIeiuv+mXruWktCA/ICcnIDog6K6/6Zeu5aS0XFxcXG4gICAgdmFyIGQgPSBbXTtcXFxcbiAgICB2YXIgY29kZSA9IGdldENvZGUoKVxcXFxuICAgIHBkZmEoY29kZSwg5YiX6KGoKS5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHtcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBwZGZoKGRhdGEsIOagh+mimCksXFxcXG4gICAgICAgICAgICBkZXNjOiBwZGZoKGRhdGEsIOmbhuaVsCksXFxcXG4gICAgICAgICAgICBwaWNfdXJsOiBwZChkYXRhLCDlm77niYcpICsgXFxcXFxcXCJAUmVmZXJlcj1cXFxcXFxcIiArIOiuv+mXruWktCxcXFxcbiAgICAgICAgICAgIHVybDogJ2hpa2VyOi8vZW1wdHkjaW1tZXJzaXZlVGhlbWUjI2F1dG9DYWNoZSMnLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibW92aWVfM1xcXFxcXFwiLFxcXFxuZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIG5hbWU6IHBkZmgoZGF0YSwg5qCH6aKYKSxcXFxcbiAgICAgICAgICAgIHVybDogcGQoZGF0YSwg6ZO+5o6lKSxcXFxcbiAgICAgICAgICAgIHF6OiBNWV9IT01FXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfSk7XFxcXG4gICAgc2V0UmVzdWx0KGQpO1xcXFxufVxcXFxuXFxcXG5cXFxcblxcXFxuZnVuY3Rpb24g5pCc57SiKOWIl+ihqCwg5qCH6aKYLCDpk77mjqUsIOaPj+i/sCwg6K+m5oOFLCDlm77niYcsIOiuv+mXruWktCkge1xcXFxuICAgIHZhciBkID0gW107XFxcXG4gICAg6K6/6Zeu5aS0ID0gIeiuv+mXruWktCA/ICcnIDog6K6/6Zeu5aS0XFxcXG4gICAgcGRmYShnZXRSZXNDb2RlKCksIOWIl+ihqCkuZm9yRWFjaChmdW5jdGlvbihkYXRhKSB7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogcGRmaChkYXRhLCDmoIfpopgpLFxcXFxuICAgICAgICAgICAgZGVzYzogcGRmaChkYXRhLCDmj4/ov7ApLFxcXFxuICAgICAgICAgICAgcGljX3VybDogcGQoZGF0YSwg5Zu+54mHKSArIFxcXFxcXFwiQFJlZmVyZXI9XFxcXFxcXCIgKyDorr/pl67lpLQsXFxcXG4gICAgICAgICAgICB1cmw6ICdoaWtlcjovL2VtcHR5I2ltbWVyc2l2ZVRoZW1lIyNhdXRvQ2FjaGUjJyxcXFxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHBkZmgoZGF0YSwg6K+m5oOFKSxcXFxcblxcXFxuZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIG5hbWU6IHBkZmgoZGF0YSwg5qCH6aKYKSxcXFxcbiAgICAgICAgICAgIHVybDogcGQoZGF0YSwg6ZO+5o6lKSxcXFxcbiAgICAgICAgICAgIHF6OiBNWV9IT01FXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfSk7XFxcXG4gICAgc2V0UmVzdWx0KGQpO1xcXFxufVxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5mdW5jdGlvbiDmnIDmlrAo6YCJ5oup5ZmoLCBVQSkge1xcXFxuICAgIGlmIChVQSA9PSBcXFxcXFxcIlBDXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgdmFyIGNvZGUgPSBmZXRjaChnZXRQYXJhbSgndXJsJykucmVwbGFjZShcXFxcXFxcIm0uXFxcXFxcXCIsIFxcXFxcXFwid3d3LlxcXFxcXFwiKSk7XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgdmFyIGNvZGUgPSByZXF1ZXN0KGdldFBhcmFtKCd1cmwnKS5yZXBsYWNlKFxcXFxcXFwid3d3LlxcXFxcXFwiLCBcXFxcXFxcIm0uXFxcXFxcXCIpKTtcXFxcbiAgICB9XFxcXG4gICAgc2V0UmVzdWx0KHBkZmgoY29kZSwg6YCJ5oup5ZmoKSlcXFxcbn1cXFxcblxcXFxuXFxcXG5cXFxcbmV2YWwoSlNPTi5wYXJzZShyZXF1ZXN0KFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3FzP3J1bGU96IGa5ryr8J+UrlxcXFxcXFwiKSkucnVsZSlcXFxcblxcXFxuZnVuY3Rpb24g5LqM57qnKOWktOmDqOWIl+ihqCwg5qCH6aKYLCDlm77niYcsIOaPj+i/sCwg6K6/6Zeu5aS0LCDkvZzogIUsIOaXtumXtCwg5YiG57G7LCDnroDku4ssIOWkmui3r+e6v+WQpiwg6Lev57q/5YiX6KGoLCDot6/nur/lkI0sIOmAiembhuaAu+WIl+ihqCwg6YCJ6ZuG5YiX6KGoLCDpm4blkI0sIOmbhnVybCwg5ryr55S76Kej5p6QLOW9k+WJjVVSTCzlvZPliY3pobXlkI0s5YmN57yALFVBLOmYsumHjei9veWQpikge1xcXFxuICAgIHZhciBkID0gW107XFxcXG5cXFxcbi8v5aS06YOo5YiX6KGoICDliJnpu5jorqTkvb/nlKggY29kZSDmnaXkvZzkuLrlpLTpg6jliJfooajmlbDmja5cXFxcbi8v5aSa6Lev57q/5ZCmICB0cnVlIOWImeS9v+eUqOWkmui3r+e6v++8m2ZhbHNlIOWImeS9v+eUqOeroOi3r+e6v1xcXFxuLy9VQSAg5LiN5aGr5YiZ5L2/55So5omL5py656uvICAnUEMn5YiZ5omL5py656uvXFxcXG5cXFxcbmlmICjlvZPliY3pobXlkI0pIHtcXFxcbiAgICBzZXRQYWdlVGl0bGUo5b2T5YmN6aG15ZCNKVxcXFxufVxcXFxuXFxcXG5pZijpmLLph43ovb3lkKYpe1xcXFxuLy/nvZHpobXlhoXlrrkr6Ziy5q2i6YeN5ouJXFxcXG4gICAgdmFyIGNvZGUgPSDmt7vliqDpmLLmraLnvZHpobUo5b2T5YmNVVJMLCBVQSlcXFxcbn1lbHNle1xcXFxuICAgIHZhciBjb2RlID0gZ2V0Q29kZSgpXFxcXG59XFxcXG4gICAgXFxcXG5cXFxcbiAgICAvL+WktOmDqOWIl+ihqOaVsOaNrlxcXFxuICAgIHZhciDlpLTpg6ggPSAh5aS06YOo5YiX6KGoID8gY29kZSA6IHBkZmEoY29kZSwg5aS06YOo5YiX6KGoKVswXTtcXFxcbiAgICDmoIfpopggPSBwZGZoKOWktOmDqCwg5qCH6aKYKVxcXFxuICAgIOWbvueJhyA9IHBkZmgo5aS06YOoLCDlm77niYcpXFxcXG4gICAgaWYgKOWbvueJhykge1xcXFxuICAgICAgICDlm77niYcgPSDlm77niYcuaW5jbHVkZXMoJ2h0dHAnKSA/IOWbvueJhyA6IOWJjee8gCArIOWbvueJh1xcXFxuICAgICAgICBpZiAoIeiuv+mXruWktCkge30gZWxzZSBpZiAo6K6/6Zeu5aS0LnN1YnN0cigwLCAxKSA9PSAnQCcpIHtcXFxcbiAgICAgICAgICAgIOWbvueJhyA9IOWbvueJhyArIOiuv+mXruWktFxcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAg5Zu+54mHID0g5Zu+54mHICsgXFxcXFxcXCJAUmVmZXJlcj1cXFxcXFxcIiArIOiuv+mXruWktFxcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIFxcXFxu5o+P6L+wID0g5o+P6L+wLmluY2x1ZGVzKCckJykgPyDmj4/ov7Auc3BsaXQoJyQnKVsxXSArIHBkZmgo5aS06YOoLCDmj4/ov7Auc3BsaXQoJyQnKVswXSkgOiBwZGZoKOWktOmDqCwg5o+P6L+wKVxcXFxuXFxcXG7kvZzogIUgPSDkvZzogIUuaW5jbHVkZXMoJyQnKSA/IOS9nOiAhS5zcGxpdCgnJCcpWzFdICsgcGRmaCjlpLTpg6gsIOS9nOiAhS5zcGxpdCgnJCcpWzBdKSA6IHBkZmgo5aS06YOoLCDkvZzogIUpXFxcXG4gICAgXFxcXG7ml7bpl7QgPSDml7bpl7QuaW5jbHVkZXMoJyQnKSA/IOaXtumXtC5zcGxpdCgnJCcpWzFdICsgcGRmaCjlpLTpg6gsIOaXtumXtC5zcGxpdCgnJCcpWzBdKSA6IHBkZmgo5aS06YOoLCDml7bpl7QpXFxcXG5cXFxcbuWIhuexuyA9IOWIhuexuy5pbmNsdWRlcygnJCcpID8g5YiG57G7LnNwbGl0KCckJylbMV0gKyBwZGZoKOWktOmDqCwg5YiG57G7LnNwbGl0KCckJylbMF0pIDogcGRmaCjlpLTpg6gsIOWIhuexuylcXFxcblxcXFxuICAgIFxcXFxuICAgIC8v5aS06YOo5YiX6KGoXFxcXG4gICAg5re75Yqg5aS06YOo5YiX6KGoKGQsIOagh+mimCwg5Zu+54mHLCDmj4/ov7AsIOS9nOiAhSwg5pe26Ze0LCDliIbnsbss5b2T5YmNVVJMKVxcXFxuICAgIFxcXFxuICAgIC8v6Lev57q/5ZCN5LiO6YCJ6ZuG5pWw5o2uXFxcXG4gICAgdmFyIOeroOiKgmpzb24gPSDkvJjljJbot6/nur/nq6DoioLmlbDmja4o5aSa6Lev57q/5ZCmLCBjb2RlLCDot6/nur/liJfooags6Lev57q/5ZCNLOmAiembhuaAu+WIl+ihqCzpgInpm4bliJfooags6ZuG5ZCNLOmbhnVybCzliY3nvIAs5b2T5YmN6aG15ZCNLOWbvueJhylcXFxcblxcXFxuICAgIC8v566A5LuLXFxcXG4gICAg5re75Yqg566A5LuLKGQsIHBkZmgoY29kZSwg566A5LuLKSwg5b2T5YmNVVJMLCAnJylcXFxcblxcXFxuICAgLy/lvZPmsqHmnInnq6DoioLlhoXlrrnvvIzlsLHkuI3mmL7npLpcXFxcbiAgICBpZiAo56ug6IqCanNvbi5sZW5ndGggPiAwKSB7XFxcXG5cXFxcbiAgICAgICAgLy/ot6/nur/pgInmi6lcXFxcbiAgICAgICAgdmFyIOmAieaLqeWIl+ihqCA9IOa3u+WKoOmAieaLqei3r+e6vyhkLCDnq6DoioJqc29uLCDlvZPliY1VUkwsIOWkmui3r+e6v+WQpilcXFxcblxcXFxuICAgICAgICAvL+mAieaLqeS4i+i9vVxcXFxuICAgICAgICDmt7vliqDpgInmi6nkuIvovb0oZCwg56ug6IqCanNvbizlpJrot6/nur/lkKYpXFxcXG5cXFxcbiAgICAgICAgLy/mjpLluo/kuI7pgInpm4ZcXFxcbiAgICAgICAgdmFyIGxhenkgPSBgQGxhenlSdWxlPS5qczpgICsg5ryr55S76Kej5p6QO1xcXFxuICAgICAgICDmt7vliqDliJfooajnq6DoioIoZCwg56ug6IqCanNvblvpgInmi6nliJfooahdLnRpdGxlLCDnq6DoioJqc29uW+mAieaLqeWIl+ihqF0ubGlzdCwgbGF6eSwg5b2T5YmNVVJMLCAnJylcXFxcblxcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibG9uZ190ZXh0XFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxuICAgIHNldFJlc3VsdChkKVxcXFxufVxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuS6jOe6p+WIl+ihqCpcXFwiLFxcXCJwYXRoXFxcIjpcXFwiZWpsYlxcXCIsXFxcInJ1bGVcXFwiOlxcXCJ2YXIgdGFicyA9IFtdXFxcXG52YXIgbGlzdHMgPSBbXVxcXFxudmFyIGFydHMgPSBwZGZhKGh0bWwsIOe6v+i3ryk7XFxcXG5hcnRzLmZvckVhY2goKGRhdGEsIGlkKSA9PiB7XFxcXG4gICAgdGFicy5wdXNoKHBkZmgoZGF0YSwg57q/6Lev5ZCNKSlcXFxcbn0pXFxcXG52YXIgY29udHMgPSBwZGZhKGh0bWwsIOmAiembhik7XFxcXG5jb250cy5mb3JFYWNoKChkYXRhLCBpZCkgPT4ge1xcXFxuICAgIGxpc3RzLnB1c2gocGRmYShkYXRhLCDpgInpm4bliJfooagpKVxcXFxufSlcXFxcbmFkZExpc3RlbmVyKFxcXFxcXFwib25DbG9zZVxcXFxcXFwiLCAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICBjbGVhck15VmFyKFxcXFxcXFwibGlzdHNcXFxcXFxcIik7XFxcXG59KSk7XFxcXG5zdG9yYWdlMC5wdXRNeVZhcihcXFxcXFxcImxpc3RzXFxcXFxcXCIsIGxpc3RzKTtcXFxcbnZhciBsaXN0ID0gbGlzdHNbZ2V0TXlWYXIoTVlfVVJMLCAnMCcpXTtcXFxcbnZhciDmjpLluo8gPSBnZXRNeVZhcihNWV9VUkwgKyBcXFxcXFxcIueroOiKguaOkuW6j1xcXFxcXFwiLCAnIzFhYWQxOVxcXFxcXFwiPuato+W6jycpO1xcXFxudmFyIOaPkOekuiA9IOaOkuW6jyA9PSAnI0ZGMDAwMFxcXFxcXFwiPuWAkuW6jycgPyAnIzFhYWQxOVxcXFxcXFwiPuato+W6jycgOiAnI0ZGMDAwMFxcXFxcXFwiPuWAkuW6jyc7XFxcXG52YXIg5o6S5bqP5ZCNID0gJ+KAnOKAnOKAneKAnTxiPjxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I65o6S5bqPPC9zcGFuPjwvYj4nXFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08Yj48c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiAnICsg5o6S5bqPICsgJzwvc3Bhbj48L2I+JyxcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgo5o6S5bqP5ZCNLCBsYXp5KSA9PiB7XFxcXG4gICAgICAgIHZhciBsaXN0cyA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXFxcXFwibGlzdHNcXFxcXFxcIik7XFxcXG4gICAgICAgIHZhciDnq6DoioIgPSBsaXN0c1tnZXRNeVZhcihNWV9VUkwsICcwJyldO1xcXFxuICAgICAgICB2YXIg5o6S5bqPID0gZ2V0TXlWYXIoTVlfVVJMICsgXFxcXFxcXCLnq6DoioLmjpLluo9cXFxcXFxcIiwgJyMxYWFkMTlcXFxcXFxcIj7mraPluo8nKTtcXFxcbiAgICAgICAgdmFyIOaPkOekuiA9IOaOkuW6jyA9PSAnI0ZGMDAwMFxcXFxcXFwiPuWAkuW6jycgPyAnIzFhYWQxOVxcXFxcXFwiPuato+W6jycgOiAnI0ZGMDAwMFxcXFxcXFwiPuWAkuW6jyc7XFxcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBpZDogTVlfVVJMICsgXFxcXFxcXCJf5o6S5bqPXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICB0aXRsZTog5o6S5bqP5ZCNLnJlcGxhY2UoJ+aOkuW6jycsIOaPkOekuilcXFxcbiAgICAgICAgfSlcXFxcbiAgICAgICAgaWYgKOaOkuW6jyA9PSAnIzFhYWQxOVxcXFxcXFwiPuato+W6jycpIHtcXFxcbiAgICAgICAgICAgIOeroOiKgi5yZXZlcnNlKClcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgY3AgPSDnq6DoioIubWFwKChkYXRhLCBzc2lkKSA9PiB7XFxcXG4gICAgICAgICAgICByZXR1cm4ge1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBwZGZoKGRhdGEsICdhJiZUZXh0JyksXFxcXG4gICAgICAgICAgICAgICAgdXJsOiBwZChkYXRhLCAnYSYmaHJlZicpICsgbGF6eSxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTog56ug6IqCLmxlbmd0aCA+IDMgPyAndGV4dF80JyA6ICd0ZXh0XzInLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNsczogTVlfVVJMICsgXFxcXFxcXCJf6YCJ6ZuGXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9O1xcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKE1ZX1VSTCArIFxcXFxcXFwiX+mAiembhlxcXFxcXFwiKTtcXFxcbiAgICAgICAgYWRkSXRlbUJlZm9yZShNWV9VUkwgKyBcXFxcXFxcImZvb3RlclxcXFxcXFwiLCBjcCk7XFxcXG4gICAgICAgIHB1dE15VmFyKE1ZX1VSTCArIFxcXFxcXFwi56ug6IqC5o6S5bqPXFxcXFxcXCIsIOaPkOekuilcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgfSwg5o6S5bqP5ZCNLCBsYXp5KSxcXFxcbiAgICBjb2xfdHlwZTogJ2ZsZXhfYnV0dG9uJyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBpZDogTVlfVVJMICsgXFxcXFxcXCJf5o6S5bqPXFxcXFxcXCJcXFxcbiAgICB9XFxcXG59KVxcXFxudGFicy5mb3JFYWNoKChkYXRhLCBpZCkgPT4ge1xcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBnZXRNeVZhcihNWV9VUkwsICcwJykgPT0gaWQgPyAn4oCc4oCcJyArIGRhdGEgKyAn4oCd4oCdJyA6IGRhdGEsXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCjnur/ot68sIGxhenksIGlkKSA9PiB7XFxcXG4gICAgICAgICAgICB2YXIgbGlzdHMgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFxcXFxcImxpc3RzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgdmFyIOaOkuW6jyA9IGdldE15VmFyKE1ZX1VSTCArIFxcXFxcXFwi56ug6IqC5o6S5bqPXFxcXFxcXCIsICcjMWFhZDE5XFxcXFxcXCI+5q2j5bqPJyk7XFxcXG4gICAgICAgICAgICB2YXIg5o+Q56S6ID0g5o6S5bqPID09ICcjRkYwMDAwXFxcXFxcXCI+5YCS5bqPJyA/ICcjMWFhZDE5XFxcXFxcXCI+5q2j5bqPJyA6ICcjRkYwMDAwXFxcXFxcXCI+5YCS5bqPJztcXFxcblxcXFxuICAgICAgICAgICAg57q/6LevLmZvckVhY2goKGRhdGEsIHhsaWQpID0+IHtcXFxcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGlkID09IHhsaWQgPyAn4oCc4oCcJyArIGRhdGEgKyAn4oCd4oCdJyA6IGRhdGEsXFxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogTVlfVVJMICsgXFxcXFxcXCJf57q/6LevXFxcXFxcXCIgKyB4bGlkXFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9VUkwsIGlkKVxcXFxuICAgICAgICAgICAgdmFyIOeroOiKgiA9IGxpc3RzW2dldE15VmFyKE1ZX1VSTCwgJzAnKV07XFxcXG4gICAgICAgICAgICBpZiAo5o6S5bqPID09ICcjRkYwMDAwXFxcXFxcXCI+5YCS5bqPJykge1xcXFxuICAgICAgICAgICAgICAgIOeroOiKgi5yZXZlcnNlKClcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGxldCBjcCA9IOeroOiKgi5tYXAoKGRhdGEsIHNzaWQpID0+IHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xcXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChkYXRhLCAnYSYmVGV4dCcpLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHBkKGRhdGEsICdhJiZocmVmJykgKyBsYXp5LFxcXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTog56ug6IqCLmxlbmd0aCA+IDMgPyAndGV4dF80JyA6ICd0ZXh0XzInLFxcXFxuICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xzOiBNWV9VUkwgKyBcXFxcXFxcIl/pgInpm4ZcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfTtcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKE1ZX1VSTCArIFxcXFxcXFwiX+mAiembhlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGFkZEl0ZW1CZWZvcmUoTVlfVVJMICsgXFxcXFxcXCJmb290ZXJcXFxcXFxcIiwgY3ApO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgICAgIH0sIHRhYnMsIGxhenksIGlkKSxcXFxcbiAgICAgICAgY29sX3R5cGU6ICdmbGV4X2J1dHRvbicsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBpZDogTVlfVVJMICsgXFxcXFxcXCJf57q/6LevXFxcXFxcXCIgKyBpZFxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG59KVxcXFxuXFxcXG5pZiAo5o6S5bqPID09ICcjRkYwMDAwXFxcXFxcXCI+5YCS5bqPJykge1xcXFxuICAgIGxpc3QucmV2ZXJzZSgpXFxcXG59XFxcXG5saXN0LmZvckVhY2goKGRhdGEsIGlkKSA9PiB7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IHBkZmgoZGF0YSwgJ2EmJlRleHQnKSxcXFxcbiAgICAgICAgdXJsOiBwZChkYXRhLCAnYSYmaHJlZicpICsgbGF6eSxcXFxcbiAgICAgICAgY29sX3R5cGU6IGxpc3QubGVuZ3RoID4gMyA/ICd0ZXh0XzQnIDogJ3RleHRfMicsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBjbHM6IE1ZX1VSTCArIFxcXFxcXFwiX+mAiembhlxcXFxcXFwiXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbn0pXFxcXG5sZXQgbmV3c3RpcCA9IGxpc3QubGVuZ3RoO1xcXFxuaWYgKG5ld3N0aXApIHtcXFxcbiAgICBzZXRMYXN0Q2hhcHRlclJ1bGUoJ2pzOicgKyAkLnRvU3RyaW5nKChuZXdzdGlwKSA9PiB7XFxcXG4gICAgICAgIHNldFJlc3VsdCgn5pu05paw6IezOiDnrKwnICsgbmV3c3RpcCArIFxcXFxcXFwi6ZuGXFxcXFxcXCIpO1xcXFxuICAgIH0sIG5ld3N0aXApKTtcXFxcbn1cXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJiaWdfYmxhbmtfYmxvY2tcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBpZDogTVlfVVJMICsgXFxcXFxcXCJmb290ZXJcXFxcXFxcIlxcXFxuICAgIH1cXFxcbn0pO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIueOr+Wig+WKq+aMgVxcXCIsXFxcInBhdGhcXFwiOlxcXCJoaWphY2tFbnZcXFwiLFxcXCJydWxlXFxcIjpcXFwidmFyIHsgUlVMRSwgaXNJbmRleCwgcGFnZVRpdGxlIH0gPSBNWV9QQVJBTVNcXFxcblJVTEUgPSBKU09OLnBhcnNlKGJhc2U2NERlY29kZShSVUxFKSlcXFxcbnZhciBvcmlSVUxFID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZGF0YUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRSkuZmluZCgodikgPT4gdi50aXRsZSA9PSBSVUxFLnRpdGxlKVxcXFxuaWYgKGlzSW5kZXgpIHtcXFxcbiAgICBSVUxFID0gb3JpUlVMRVxcXFxuICAgIHZhciB7IHRhYkhlYWRlciwgZnlBbGwgfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL0NsYXNzVGFiP3J1bGU9JyArIFFJTkdfVElUTEUsIE9iamVjdC5hc3NpZ24oeyBRSU5HX1RJVExFOiBRSU5HX1RJVExFIH0sIFJVTEUpKVxcXFxuICAgIC8vIOWkhOeQhk1ZX1JVTEVcXFxcbiAgICBNWV9SVUxFLmNsYXNzX3VybCA9IHRhYkhlYWRlci5nZXRDbGFzcyhmeUFsbCA/ICdmeUFsbCcgOiAnZnljbGFzcycpLnVybFxcXFxuICAgIE1ZX1JVTEUuYXJlYV91cmwgPSBmeUFsbCA/IE1ZX1JVTEUuY2xhc3NfdXJsIDogdGFiSGVhZGVyLmdldENsYXNzKCdmeWFyZWEnKS51cmxcXFxcbiAgICBNWV9SVUxFLnllYXJfdXJsID0gZnlBbGwgPyBNWV9SVUxFLmNsYXNzX3VybCA6IHRhYkhlYWRlci5nZXRDbGFzcygnZnl5ZWFyJykudXJsXFxcXG4gICAgTVlfUlVMRS5zb3J0X3VybCA9IGZ5QWxsID8gTVlfUlVMRS5jbGFzc191cmwgOiB0YWJIZWFkZXIuZ2V0Q2xhc3MoJ2Z5c29ydCcpLnVybFxcXFxuICAgIE1ZX1JVTEUudXJsID0gUlVMRS51cmxcXFxcbiAgICBNWV9SVUxFLmNvbF90eXBlID0gUlVMRS5jb2xfdHlwZVxcXFxuICAgIE1ZX1JVTEUuZGV0YWlsX2NvbF90eXBlID0gUlVMRS5kZXRhaWxfY29sX3R5cGVcXFxcbiAgICBNWV9SVUxFLmZpbmRfcnVsZSA9IFJVTEUuZmluZF9ydWxlXFxcXG4gICAgTVlfUlVMRS5kZXRhaWxfZmluZF9ydWxlID0gUlVMRS5kZXRhaWxfZmluZF9ydWxlXFxcXG4gICAgTVlfUlVMRS5wYXJhbXMgPSB7fVxcXFxufSBlbHNlIHtcXFxcbiAgICBSVUxFLnBhZ2VzID0gb3JpUlVMRS5wYWdlc1xcXFxuICAgIC8vIOWkhOeQhk1ZX1JVTEVcXFxcbiAgICBNWV9SVUxFLnVybCA9IE1ZX1BBUkFNUy51cmxcXFxcbiAgICBNWV9SVUxFLmNvbF90eXBlID0gUlVMRS5kZXRhaWxfY29sX3R5cGVcXFxcbiAgICBNWV9SVUxFLmZpbmRfcnVsZSA9IFJVTEUuZGV0YWlsX2ZpbmRfcnVsZVxcXFxuICAgIE1ZX1JVTEUucGFyYW1zID0gUlVMRS5wYXJhbXNcXFxcbn1cXFxcbk1ZX1JVTEUucGFnZXMgPSBSVUxFLnBhZ2VzXFxcXG5NWV9SVUxFLnBhZ2VMaXN0ID0gSlNPTi5wYXJzZShNWV9SVUxFLnBhZ2VzIHx8ICdbXScpXFxcXG5NWV9SVUxFLnRpdGxlID0gUlVMRS50aXRsZVxcXFxuTVlfUlVMRS51YSA9IFJVTEUudWFcXFxcbi8vIOi9veWFpeWHveaVsOW3peWFt1xcXFxudmFyIHsgZ2VuTXlSdWxlIH0gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9mdW5jVG9vbHM/cnVsZT0nICsgUUlOR19USVRMRSwge1xcXFxuICAgIFFJTkdfVElUTEU6IFFJTkdfVElUTEUsXFxcXG4gICAgTVlfUlVMRTogTVlfUlVMRSxcXFxcbiAgICBpc0luZGV4OiBpc0luZGV4XFxcXG59KVxcXFxuLy8g6Ziy5q2icmVxdWlyZeWkmuasoei/kOihjFxcXFxuY29uc3QgbXlDb2xsX3JlcXVpcmVkID0ge31cXFxcbnJlcXVpcmUgPSBmdW5jdGlvbihwYXJhbTAsIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCkge1xcXFxuICAgIGlmIChteUNvbGxfcmVxdWlyZWRbcGFyYW0wXSkgcmV0dXJuXFxcXG4gICAgbXlDb2xsX3JlcXVpcmVkW3BhcmFtMF0gPSB0cnVlXFxcXG4gICAgcGFyYW0yID0gcGFyYW0yICE9IG51bGwgPyBwYXJhbTIgOiAwXFxcXG4gICAgcGFyYW0zID0gTVlfVElDS0VUXFxcXG4gICAgcGFyYW00ID0gZXZhbFxcXFxuICAgIHJldHVybiBtZXRob2RfcmVxdWlyZS5pbnZva2UoamF2YUNvbnRleHQsIHBhcmFtMCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KVxcXFxufVxcXFxucmVxdWlyZUNhY2hlID0gZnVuY3Rpb24ocGFyYW0wLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSkge1xcXFxuICAgIGlmIChteUNvbGxfcmVxdWlyZWRbcGFyYW0wXSkgcmV0dXJuXFxcXG4gICAgbXlDb2xsX3JlcXVpcmVkW3BhcmFtMF0gPSB0cnVlXFxcXG4gICAgcGFyYW0zID0gcGFyYW0zICE9IG51bGwgPyBwYXJhbTMgOiAwXFxcXG4gICAgcGFyYW00ID0gTVlfVElDS0VUXFxcXG4gICAgcGFyYW01ID0gZXZhbFxcXFxuICAgIHJldHVybiBtZXRob2RfcmVxdWlyZUNhY2hlLmludm9rZShqYXZhQ29udGV4dCwgcGFyYW0wLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSlcXFxcbn1cXFxcbnJjID0gcmVxdWlyZUNhY2hlXFxcXG4vLyDmnIDmlrDnq6DoioLop4TliJnnjq/looPliqvmjIFcXFxcbnNldExhc3RDaGFwdGVyUnVsZSA9IGZ1bmN0aW9uKHBhcmFtMCkge1xcXFxuICAgIGlmIChwYXJhbTAuc3RhcnRzV2l0aChcXFxcXFxcImpzOlxcXFxcXFwiKSkge1xcXFxuICAgICAgICBwYXJhbTAgPSAnanM6JyArICQudG9TdHJpbmcoKFFJTkdfVElUTEUsIE1ZX1BBUkFNUykgPT4ge1xcXFxuICAgICAgICAgICAgZXZhbChKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL3BhZ2UvaGlqYWNrRW52P3J1bGU9JyArIFFJTkdfVElUTEUpKS5ydWxlKVxcXFxuICAgICAgICAgICAgdmFyIHsgcnVuUHJlUnVsZSB9ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZnVuY1Rvb2xzP3J1bGU9JyArIFFJTkdfVElUTEUpXFxcXG4gICAgICAgICAgICBydW5QcmVSdWxlKG9yaVJVTEUucHJlUnVsZSlcXFxcbiAgICAgICAgfSwgUUlOR19USVRMRSwgeyB1cmw6IE1ZX1JVTEUudXJsLCBSVUxFOiBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoZ2VuTXlSdWxlKCkpKSwgaXNJbmRleDogaXNJbmRleCB9KSArICc7JyArIHBhcmFtMC5zbGljZSgzKVxcXFxuICAgIH1cXFxcbiAgICBtZXRob2Rfc2V0TGFzdENoYXB0ZXJSdWxlLmludm9rZShqYXZhQ29udGV4dCwgcGFyYW0wKVxcXFxufVxcXFxuLy8g5Yqo5oCB5paw5aKe5Ye95pWw5Yqr5oyBXFxcXG5hZGRJdGVtQWZ0ZXIgPSBmdW5jdGlvbihwYXJhbTAsIHBhcmFtMSkge1xcXFxuICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtMSkpIHBhcmFtMSA9IHBhcmFtMS5tYXAoaGlqYWNrRWwpXFxcXG4gICAgZWxzZSBwYXJhbTEgPSBoaWphY2tFbChwYXJhbTEpXFxcXG4gICAgbWV0aG9kX2FkZEl0ZW1BZnRlci5pbnZva2UoamF2YUNvbnRleHQsIHBhcmFtMCwgcGFyYW0xKVxcXFxufVxcXFxuYWRkSXRlbUJlZm9yZSA9IGZ1bmN0aW9uKHBhcmFtMCwgcGFyYW0xKSB7XFxcXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW0xKSkgcGFyYW0xID0gcGFyYW0xLm1hcChoaWphY2tFbClcXFxcbiAgICBlbHNlIHBhcmFtMSA9IGhpamFja0VsKHBhcmFtMSlcXFxcbiAgICBtZXRob2RfYWRkSXRlbUJlZm9yZS5pbnZva2UoamF2YUNvbnRleHQsIHBhcmFtMCwgcGFyYW0xKVxcXFxufVxcXFxuXFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5Ye95pWw5bel5YW3XFxcIixcXFwicGF0aFxcXCI6XFxcImZ1bmNUb29sc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJsZXQgeyBRSU5HX1RJVExFLCBNWV9SVUxFLCBpc0luZGV4IH0gPSAkLmltcG9ydFBhcmFtXFxcXG5pZiAoIU1ZX1JVTEUpIE1ZX1JVTEUgPSB7fVxcXFxuXFxcXG5mdW5jdGlvbiBydW5Db2RlKHJ1bGUpIHtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBsZXQgW2lucHV0LCBjb2RlXSA9IHJ1bGUuc3BsaXQoJy5qczonKVxcXFxuICAgICAgICByZXR1cm4gY29kZSA/IGV2YWwoY29kZSkgOiBydWxlXFxcXG4gICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gcnVsZSB9XFxcXG59XFxcXG4vLyDpppbpobXpk77mjqXmm7/mjaLliIbnsbtcXFxcbmZ1bmN0aW9uIGluZGV4VXJsKHBhcmFtKSB7XFxcXG4gICAgTVlfUlVMRSA9IEpTT04ucGFyc2UoYmFzZTY0RGVjb2RlKE1ZX1JVTEUpKVxcXFxuICAgIGxldCBwYWdlTnVtID0gcGFyc2VJbnQocGFyYW0uc3BsaXQoJyMjIycpWzFdKSxcXFxcbiAgICAgICAgdXJsID0gTVlfUlVMRS51cmwsXFxcXG4gICAgICAgIHsgZnlBbGwsIHRhYkhlYWRlciB9ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvQ2xhc3NUYWI/cnVsZT0nICsgUUlOR19USVRMRSwgT2JqZWN0LmFzc2lnbih7IFFJTkdfVElUTEU6IFFJTkdfVElUTEUgfSwgTVlfUlVMRSkpXFxcXG5cXFxcbiAgICB1cmwgPSB0YWJIZWFkZXIuc2V0VXJsKGZ5QWxsID8gdXJsLnJlcGxhY2UoL2Z5QWxsL2csICckJHtmeUFsbH0nKSA6IHVybC5yZXBsYWNlKC9meShjbGFzc3xhcmVhfHllYXJ8c29ydCkvZywgJyQke2Z5JDF9JykpXFxcXG4gICAgdXJsID0gdXJsLnJlcGxhY2UoL2Z5cGFnZSg/OkAoLT9cXFxcXFxcXGQrKUApPyg/OlxcXFxcXFxcKihcXFxcXFxcXGQrKUApPy9nLCAoXywgc3RhcnQsIHNwYWNlKSA9PiBwYXJzZUludChzdGFydCB8fCAwKSArIDEgKyAocGFnZU51bSAtIDEpICogcGFyc2VJbnQoc3BhY2UgfHwgMSkpXFxcXG4gICAgdXJsID0gL14oW1xcXFxcXFxcc1xcXFxcXFxcU10qPykoPzpcXFxcXFxcXFtmaXJzdFBhZ2U9KFtcXFxcXFxcXHNcXFxcXFxcXFNdKj8pXFxcXFxcXFxdKT8oPzooXFxcXFxcXFwuanM6W1xcXFxcXFxcc1xcXFxcXFxcU10qPykpPyQvLmV4ZWModXJsKVxcXFxuICAgIGlmIChwYWdlTnVtID09IDEgJiYgdXJsWzJdKSB1cmxbMV0gPSB1cmxbMl1cXFxcbiAgICBpZiAodXJsWzNdICYmICF1cmxbMV0uaW5jbHVkZXMoJy5qczonKSkgdXJsWzFdICs9IHVybFszXVxcXFxuICAgIHJldHVybiBydW5Db2RlKHVybFsxXSlcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gcGFyYW1IYW5kbGUodXJsUGFyYW0sIHVhLCB1cmxUbXApIHtcXFxcbiAgICBsZXQgY2hhcnNldCwgcGFyYW1UbXBcXFxcbiAgICB0cnkgeyAvLyDpk77mjqXnmoTnvJbnoIHjgIFVQeWSjFJlZmVyZXLlupTor6XmmK/pppblhYjnu6fmib/pppbpobXpk77mjqVcXFxcbiAgICAgICAgWywgLCBjaGFyc2V0LCBwYXJhbVRtcF0gPSB1cmxUbXAuc3BsaXQoJzsnKVxcXFxuICAgICAgICBwYXJhbVRtcCA9IHBhcmFtVG1wLm1hdGNoKC9eeyguKil9JC8pWzFdLnNwbGl0KCcmJicpXFxcXG4gICAgfSBjYXRjaCAoZSkgeyBwYXJhbVRtcCA9IFtdIH1cXFxcbiAgICBsZXQgVXNlckFnZW50ID0gcGFyYW1UbXAuZmluZCgodikgPT4gdi5zdGFydHNXaXRoKCdVc2VyLUFnZW50QCcpKSxcXFxcbiAgICAgICAgUmVmZXJlciA9IHBhcmFtVG1wLmZpbmQoKHYpID0+IHYuc3RhcnRzV2l0aCgnUmVmZXJlckAnKSlcXFxcbiAgICB1cmxQYXJhbVswXSA9IHVybFBhcmFtWzBdIHx8ICdHRVQnXFxcXG4gICAgdXJsUGFyYW1bMV0gPSB1cmxQYXJhbVsxXSB8fCBjaGFyc2V0IHx8ICdVVEYtOCdcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICB1cmxQYXJhbVsyXSA9IHVybFBhcmFtWzJdLm1hdGNoKC9eeyguKil9JC8pWzFdLnNwbGl0KCcmJicpXFxcXG4gICAgfSBjYXRjaCAoZSkgeyB1cmxQYXJhbVsyXSA9IFtdIH1cXFxcbiAgICAvLyDmt7vliqDlhajlsYBVQeWSjOS4iue6p1JlZmVyZXJcXFxcbiAgICBpZiAoIXVybFBhcmFtWzJdLnNvbWUoKHYpID0+IHYuc3RhcnRzV2l0aCgnVXNlci1BZ2VudEAnKSkpIHtcXFxcbiAgICAgICAgaWYgKFVzZXJBZ2VudCkgdXJsUGFyYW1bMl0ucHVzaChVc2VyQWdlbnQpXFxcXG4gICAgICAgIGVsc2UgaWYgKHVhID09ICdwYycpXFxcXG4gICAgICAgICAgICB1cmxQYXJhbVsyXS5wdXNoKCdVc2VyLUFnZW50QCcgKyBQQ19VQS5yZXBsYWNlKC87L2csICfvvJvvvJsnKS5yZXBsYWNlKC9cXFxcXFxcXD8vLCAn77yf77yfJykpXFxcXG4gICAgICAgIGVsc2UgaWYgKHVhID09ICdtb2JpbGUnKVxcXFxuICAgICAgICAgICAgdXJsUGFyYW1bMl0ucHVzaCgnVXNlci1BZ2VudEAnICsgTU9CSUxFX1VBLnJlcGxhY2UoLzsvZywgJ++8m++8mycpLnJlcGxhY2UoL1xcXFxcXFxcPy8sICfvvJ/vvJ8nKSlcXFxcbiAgICB9XFxcXG4gICAgaWYgKFJlZmVyZXIgJiYgIXVybFBhcmFtWzJdLnNvbWUoKHYpID0+IHYuc3RhcnRzV2l0aCgnUmVmZXJlckAnKSkpXFxcXG4gICAgICAgIHVybFBhcmFtWzJdLnB1c2goUmVmZXJlcilcXFxcbiAgICB1cmxQYXJhbVsyXSA9ICd7JyArIHVybFBhcmFtWzJdLmpvaW4oJyYmJykgKyAnfSdcXFxcbiAgICByZXR1cm4gdXJsUGFyYW0uam9pbignOycpXFxcXG59XFxcXG4vLy8g6aKE5aSE55CG5bm25Yid5aeL5YyWY29uZmlnXFxcXG5mdW5jdGlvbiBydW5QcmVSdWxlKHJ1bGUpIHtcXFxcbiAgICBpZiAoKHR5cGVvZiBNWV9QQUdFICE9ICd1bmRlZmluZWQnICYmICBNWV9QQUdFID09IDEpICYmXFxcXG4gICAgICAgICAoaXNJbmRleCB8fCAhZ2V0TXlWYXIoJyRwcmVSdWxlXycgKyBNWV9SVUxFLnRpdGxlKSkpIHtcXFxcbiAgICAgICAgZXZhbChydWxlKVxcXFxuICAgICAgICBwdXRNeVZhcignJHByZVJ1bGVfJyArIE1ZX1JVTEUudGl0bGUsICdUJylcXFxcbiAgICB9XFxcXG4gICAgbGV0IF9jZmcgPSBnZXRNeVZhcignaW5pdENvbmZpZycsICd7fScpXFxcXG4gICAgaWYgKF9jZmcgJiYgX2NmZy5sZW5ndGggPiAwKSB7XFxcXG4gICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2UoX2NmZylcXFxcbiAgICB9XFxcXG59XFxcXG4vLyDmraPmlofop6PmnpDpgJrnlKjlj5jph49cXFxcbmZ1bmN0aW9uIGdlbk15UnVsZSgpIHtcXFxcbiAgICBsZXQgUlVMRSA9IE9iamVjdC5hc3NpZ24oe30sIE1ZX1JVTEUpXFxcXG4gICAgZGVsZXRlIFJVTEUubGFzdF9jaGFwdGVyX3J1bGVcXFxcbiAgICBkZWxldGUgUlVMRS5wcmVSdWxlXFxcXG4gICAgZGVsZXRlIFJVTEUucGFnZUxpc3RcXFxcbiAgICBkZWxldGUgUlVMRS5wYWdlc1xcXFxuICAgIHJldHVybiBSVUxFXFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdlbkV4VXJsKHVybCkge1xcXFxuICAgIHVybCA9IHVybC5zcGxpdCgnOycpXFxcXG4gICAgcmV0dXJuIHVybC5zaGlmdCgpICsgJzsnICsgcGFyYW1IYW5kbGUodXJsLCBNWV9SVUxFLnVhLCBNWV9SVUxFLnVybClcXFxcbn1cXFxcblxcXFxuaGlqYWNrTGF6eVJ1bGUgPSAkLnRvU3RyaW5nKChRSU5HX1RJVExFLCBNWV9QQVJBTVMpID0+IHtcXFxcbiAgICBpZiAoIU1ZX1JVTEUpIE1ZX1JVTEUgPSB7fVxcXFxuICAgIGV2YWwoSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9wYWdlL2hpamFja0Vudj9ydWxlPScgKyBRSU5HX1RJVExFKSkucnVsZSlcXFxcbiAgICB2YXIge1xcXFxuICAgICAgICBwYXJhbUhhbmRsZSxcXFxcbiAgICAgICAgZ2VuRXhVcmwsXFxcXG4gICAgICAgIGhpamFja0xhenlSdWxlLFxcXFxuICAgICAgICBoaWphY2tFbFxcXFxuICAgIH0gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9mdW5jVG9vbHM/cnVsZT0nICsgUUlOR19USVRMRSlcXFxcbn0sIFFJTkdfVElUTEUsIHsgdXJsOiBNWV9SVUxFLnVybCwgUlVMRTogYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KGdlbk15UnVsZSgpKSksIGlzSW5kZXg6IGlzSW5kZXggfSlcXFxcblxcXFxuZnVuY3Rpb24gaGlqYWNrRWwoZWwpIHtcXFxcbiAgICBpZighZWwgfHwgdHlwZW9mIGVsICE9ICdvYmplY3QnKSByZXR1cm5cXFxcbiAgICBpZiAoIWVsLmV4dHJhKSBlbC5leHRyYSA9IHt9XFxcXG4gICAgZWwuY29sX3R5cGUgPSBlbC5jb2xfdHlwZSB8fCBNWV9SVUxFLmNvbF90eXBlXFxcXG4gICAgbGV0IE5PV19SVUxFID0gT2JqZWN0LmFzc2lnbihnZW5NeVJ1bGUoKSwgeyBwYXJhbXM6IGVsLmV4dHJhIH0pXFxcXG5cXFxcbiAgICBpZiAodHlwZW9mIGVsLnVybCAhPSAnc3RyaW5nJyB8fFxcXFxuICAgICAgICBbJ3g1X3dlYnZpZXdfc2luZ2xlJywgJ2lucHV0J10uZmluZCgodikgPT4gZWwuY29sX3R5cGUgPT0gdikgfHxcXFxcbiAgICAgICAgWyfmtbfpmJTop4bnlYwnLCAnamF2YXNjcmlwdDonXS5maW5kKCh2KSA9PiBlbC51cmwuc3RhcnRzV2l0aCh2KSkgfHxcXFxcbiAgICAgICAgWydydWxlJywgJ3BpY3MnLCAndG9hc3QnLCAnY29weScsICdlZGl0RmlsZScsICd4NScsICd4NVdlYlZpZXcnLCAneDVQbGF5JywgJ3dlYicsICd4NVJ1bGUnLCAnd2ViUnVsZScsXFxcXG4gICAgICAgICAgICAnZG93bmxvYWQnLCAnc2hhcmUnLCAnZmlsZVNlbGVjdCcsICd2aWRlbyddLmZpbmQoKHYpID0+IGVsLnVybC5zdGFydHNXaXRoKHYgKyAnOi8vJykpKSB7XFxcXG4gICAgICAgIHJldHVybiBlbFxcXFxuICAgIH0gZWxzZSBpZiAoZWwudXJsLnN0YXJ0c1dpdGgoJ2lucHV0Oi8vJykpIHtcXFxcbiAgICAgICAgbGV0IHBhcmEgPSBKU09OLnBhcnNlKGVsLnVybC5zbGljZSg4KSlcXFxcbiAgICAgICAgaWYgKHBhcmEuanMpIHBhcmEuanMgPSBoaWphY2tMYXp5UnVsZSArICc7JyArIHBhcmEuanNcXFxcbiAgICAgICAgZWwudXJsID0gJ2lucHV0Oi8vJyArIEpTT04uc3RyaW5naWZ5KHBhcmEpXFxcXG4gICAgICAgIHJldHVybiBlbFxcXFxuICAgIH0gZWxzZSBpZiAoZWwudXJsLnN0YXJ0c1dpdGgoJ2NvbmZpcm06Ly8nKSkge1xcXFxuICAgICAgICBsZXQgcmVJbmRleCA9IGVsLnVybC5pbmRleE9mKCcuanM6JylcXFxcbiAgICAgICAgaWYgKHJlSW5kZXggPj0gMCkgZWwudXJsID0gZWwudXJsLnNsaWNlKDAsIHJlSW5kZXgpICsgJy5qczonICsgaGlqYWNrTGF6eVJ1bGUgKyAnOycgKyBlbC51cmwuc2xpY2UocmVJbmRleCArIDQpXFxcXG4gICAgICAgIHJldHVybiBlbFxcXFxuICAgIH0gZWxzZSBpZiAoZWwudXJsLnN0YXJ0c1dpdGgoJ3NlbGVjdDovLycpKSB7XFxcXG4gICAgICAgIGxldCBwYXJhID0gSlNPTi5wYXJzZShlbC51cmwuc2xpY2UoOSkpXFxcXG4gICAgICAgIGlmIChwYXJhLmpzKSBwYXJhLmpzID0gaGlqYWNrTGF6eVJ1bGUgKyAnOycgKyBwYXJhLmpzXFxcXG4gICAgICAgIGVsLnVybCA9ICdzZWxlY3Q6Ly8nICsgSlNPTi5zdHJpbmdpZnkocGFyYSlcXFxcbiAgICAgICAgcmV0dXJuIGVsXFxcXG4gICAgfSBlbHNlIGlmIChlbC51cmwuaW5jbHVkZXMoJ0BydWxlPScpKSB7XFxcXG4gICAgICAgIGxldCBbXywgdXJsLCBydWxlXSA9IGVsLnVybC5tYXRjaCgvXihbXFxcXFxcXFxzXFxcXFxcXFxTXSo/KUBydWxlPShbXFxcXFxcXFxzXFxcXFxcXFxTXSopJC8pXFxcXG4gICAgICAgIGVsLnVybCA9IHVybFxcXFxuICAgICAgICBOT1dfUlVMRS5kZXRhaWxfZmluZF9ydWxlID0gcnVsZVxcXFxuICAgICAgICBOT1dfUlVMRS5kZXRhaWxfY29sX3R5cGUgPSBNWV9SVUxFLmNvbF90eXBlXFxcXG4gICAgfSBlbHNlIGlmIChlbC51cmwuc3RhcnRzV2l0aCgnaGlrZXI6Ly9wYWdlLycpKSB7XFxcXG4gICAgICAgIGlmIChlbC51cmwuaW5jbHVkZXMoJ3J1bGU9JykgfHwgZWwuZXh0cmEucnVsZSlcXFxcbiAgICAgICAgICAgIHJldHVybiBlbFxcXFxuICAgICAgICBsZXQgW18sIHBhdGgsIGZsYWcsIHBhcmFtc10gPSBlbC51cmwubWF0Y2goL15oaWtlcjpcXFxcXFxcXC9cXFxcXFxcXC9wYWdlXFxcXFxcXFwvKC4rPykoIy4qPyk/KD86XFxcXFxcXFw/KC4qKSk/JC8pLFxcXFxuICAgICAgICAgICAgc3ViUGFnZSA9IE1ZX1JVTEUucGFnZUxpc3QuZmluZCgodikgPT4gdi5wYXRoID09IHBhdGgpLFxcXFxuICAgICAgICAgICAgc3ViVXJsID0gKHBhcmFtcyB8fCAnJykuc3BsaXQoJyYnKS5maW5kKCh2KSA9PiB2LnN0YXJ0c1dpdGgoJ3VybD0nKSlcXFxcbiAgICAgICAgZWwudXJsID0gKHN1YlVybCA/IHN1YlVybC5zbGljZSg0KS5yZXBsYWNlKC/vvJ/vvJ8vZywgJz8nKS5yZXBsYWNlKC/vvIbvvIYvZywgJyYnKSA6IChlbC5leHRyYSB8fCB7fSkudXJsKSB8fCAnaGlrZXI6Ly9lbXB0eScgKyBmbGFnICsgJz8nICsgKHBhcmFtcyB8fCAnJylcXFxcbiAgICAgICAgTk9XX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSA9IHN1YlBhZ2UucnVsZVxcXFxuICAgICAgICBOT1dfUlVMRS5kZXRhaWxfY29sX3R5cGUgPSBzdWJQYWdlLmNvbF90eXBlXFxcXG4gICAgfSBlbHNlIGlmIChlbC51cmwuaW5jbHVkZXMoJ0BsYXp5UnVsZT0nKSkge1xcXFxuICAgICAgICBsZXQgcmVJbmRleCA9IGVsLnVybC5pbmRleE9mKCcuanM6JylcXFxcbiAgICAgICAgaWYgKHJlSW5kZXggPj0gMCkgZWwudXJsID0gZWwudXJsLnNsaWNlKDAsIHJlSW5kZXgpICsgJy5qczonICsgaGlqYWNrTGF6eVJ1bGUgKyAnOycgKyBlbC51cmwuc2xpY2UocmVJbmRleCArIDQpXFxcXG4gICAgICAgIHJldHVybiBlbFxcXFxuICAgIH0gZWxzZSBpZiAoaXNJbmRleCkge1xcXFxuICAgICAgICBpZiAoIU1ZX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSB8fCAvaGlrZXI6XFxcXFxcXFwvXFxcXFxcXFwvKD8hZW1wdHkuKyQpLy50ZXN0KGVsLnVybCkpIHJldHVybiBlbFxcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIHJldHVybiBlbFxcXFxuICAgIH1cXFxcbiAgICBlbC5leHRyYSA9IE9iamVjdC5hc3NpZ24oe30sIGVsLmV4dHJhLCB7XFxcXG4gICAgICAgIHVybDogZ2VuRXhVcmwoZWwudXJsKSxcXFxcbiAgICAgICAgUlVMRTogYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KE5PV19SVUxFKSksXFxcXG4gICAgICAgIHBhZ2VUaXRsZTogaXNJbmRleCAmJiBlbC50aXRsZVxcXFxuICAgIH0pXFxcXG4gICAgZWwudXJsID0gJ2hpa2VyOi8vcGFnZS9mcmFtZUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRVxcXFxuICAgIHJldHVybiBlbFxcXFxufVxcXFxuJC5leHBvcnRzID0ge1xcXFxuICAgIHJ1bkNvZGU6IHJ1bkNvZGUsXFxcXG4gICAgaW5kZXhVcmw6IGluZGV4VXJsLFxcXFxuICAgIHBhcmFtSGFuZGxlOiBwYXJhbUhhbmRsZSxcXFxcbiAgICBydW5QcmVSdWxlOiBydW5QcmVSdWxlLFxcXFxuICAgIGdlbk15UnVsZTogZ2VuTXlSdWxlLFxcXFxuICAgIGdlbkV4VXJsOiBnZW5FeFVybCxcXFxcbiAgICBoaWphY2tMYXp5UnVsZTogaGlqYWNrTGF6eVJ1bGUsXFxcXG4gICAgaGlqYWNrRWw6IGhpamFja0VsXFxcXG59XFxcXG5cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLniLHnsbPmjqjnsbvop6PmnpAqXFxcIixcXFwicGF0aFxcXCI6XFxcImpzXFxcIixcXFwicnVsZVxcXCI6XFxcInZhciDmvKvnlLvop6PmnpAgPSAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgICAgIHZhciB1cmwgPSBpbnB1dC5yZXBsYWNlKCdtJywnd3d3Jyk7XFxcXG4gICAgICAgICAgICBldmFsKHBkZmgoZmV0Y2hQQyh1cmwpLCBcXFxcXFxcImJvZHkmJnNjcmlwdCYmSHRtbFxcXFxcXFwiKSk7XFxcXG4gICAgICAgICAgICB2YXIgcGljcyA9IFtdO1xcXFxuICAgICAgICAgICAgaWYgKGNoYXB0ZXJJbWFnZXMubGVuZ3RoID4gMSkge1xcXFxuICAgICAgICAgICAgICAgIGNoYXB0ZXJJbWFnZXMuZm9yRWFjaChpbWcgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBwaWNzLnB1c2goaW1nKydAUmVmZXJlcj0nK3VybClcXFxcbiAgICAgICAgICAgICAgICB9KX0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHZhciBodG1sID0gcmVxdWVzdChpbnB1dCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHZhciBsaXN0ID0gcGRmYShodG1sLCAnYm9keSYmLnNjcm9sbC1pdGVtJyk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IHBkZmEoaHRtbCwgJ2JvZHkmJiNpbWFnZScpO1xcXFxuICAgICAgICAgICAgICAgICAgICBsaXN0ID0gZmlyc3QuY29uY2F0KGxpc3QpO1xcXFxuICAgICAgICAgICAgICAgICAgICBsaXN0LmZvckVhY2goaW1nID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNzLnB1c2gocGRmaChpbWcsICdpbWcmJmRhdGEtc3JjfHxzcmMnKSsnQFJlZmVyZXI9JytpbnB1dClcXFxcbiAgICAgICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwicGljczovL1xcXFxcXFwiICsgcGljcy5qb2luKFxcXFxcXFwiJiZcXFxcXFxcIilcXFxcbiAgICAgICAgICAgIH0pXFxcXG4gICAgICAgIHZhciBsYXp5ID0gYEBsYXp5UnVsZT0uanM6YCArIOa8q+eUu+ino+aekDtcXFwifV1cIixcInByb3h5XCI6XCJcIn0iLCJwaWNVcmwiOiJodHRwczovL2xhbm1laWd1b2ppYW5nLmNvbS90dWJpYW8va2UvMTQyLnBuZyIsInRpdGxlIjoi55yL5ryrIn0=
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement